gamera-3.3.3/0000755000076500000000000000000011755376174011762 5ustar chriswheelgamera-3.3.3/ACKNOWLEDGEMENTS0000644000076500000000000000120211755374615014230 0ustar chriswheelThe authors wish to acknowledge the work of the following people, for their beta-testing, suggestions and otherwise horrible breaking of the Gamera system: Teal Anderson Grant Arnold Rene Baston Colin Baumgarten Tobias Bolten Christian Brandt Albert Brzeczko Robert Butz Lukas Cenovsky Oliver Christen Alexander Cobb Georg Drees Tim DiLauro Robert Ferguson Andrew Hankinson Thomas Karsten Jürgen Killian Jonathan Koch David Kolanus Uma Kompella Jean-François Leon Andreas Leuschner David Lewis Moritz Muras Mark Patton Raghu Jason Riesa Stefan Ruloff Marcel Schroers Seo Sanghyeon Daveed Vandevoorde Jakub Wilk Hasan Yildiz Jochen Zimmerman gamera-3.3.3/CHANGES0000644000076500000000000002335611755374470012763 0ustar chriswheelChanges made between Gamera File Releases ========================================= Version 3.3.3, May 15, 2012 ---------------------------- - new plugins min_max_location() and max_empty_rect() - Rect can now be a return type of a plugin function - ImageType arguments can be optional with "default=NoneDefault" - C++ graph API also usable from toolkits - fixed a type mismatch in graph API on 64bit bigendian architectures - changing feature set in Biollante now works - changes in rank() and mean(): o significantly faster o default border_treatment changed to 'reflect', because that leads to more expected results than 'padwhite' o extended to grey16 images - min_max_filter for computing minimum and maximum filter in a runtime that is independent from the window size (thanks to David Kolanus). This method is now used by shading_subtraction to speed up the binarization considerably. - convex_hull did not work in some cases - option "--version" added to gamera_gui Version 3.3.2, Sep 19, 2011 ---------------------------- - FSF address in all files corrected - sub_cc_analysis did not work on images with offset - fixed memory leaks in segmentation_error Version 3.3.1, Aug 25, 2011 ---------------------------- - plugins for convex hull computation added in category Geometry - Int args can now have default NoneDefault; required use of TextControl instead of SpinControl for Int in GUI - new binarization plugin shading_subtraction for images with shaded backgrounds - conversion from FLOAT to GREYSCALE/GREY16/RGB now works when FLOAT image contains negative values. The range [min,max] is now linearly scaled to grey range. - runlength_smearing no longer returns empty segments - RGBPixel.value now returns V in [0.0,1.0] as documented, not in [0,255] Version 3.3.0, Mai 02, 2011 ---------------------------- - graph API completely rewritten from scratch (thanks to Christian Brandt) Changes from a user's perspective: o colorize() for coloring a (planar) graph in linear time o new flag CHECK_ON_INSERT o is_*_connected now actually tests connectedness o is_cyclic now actually tests for cycles o has_path() for path existence check between nodes o add_edge no longer crashes after edges had been removed o now also usable directly from C++ (see documentation) - geostructs/colorgraph.* have been removed (now available in graph API) - rubber band selection in image display improved - image_copy() did not work for 1x1 images - new plugin contour_pavlidis (category Analysis/Contour) Version 3.2.7, Mar 11, 2011 ---------------------------- - _group._part glyphs no longer saved in classifier training data: when saved as "Page glyphs", they are still saved, but no longer when saved as "Classifier glyphs" - interactive view selection with rubber bands now also works when rubber band touches the image border - toolkits now compile out-of-the box again on Ubuntu - the following classifier menu entries now work: o "Image/Save glyphs into separate files" o "File/Symbol names/Import" - new plugin segmentation_error (category "PageSegmentation") - ProgressFactory now has optional constructor argument "numsteps" for doing the update only in *numsteps* discrete steps (used for significantly speeding up loading/saving XML files) - group_[and_update]_list_automatic() now has an optional argument "criterion" for chosing the way how the best grouping is chosen. The old method was "avg", while the new default is "min", because we have found this to be better in our tests. Version 3.2.6, Jun 08, 2010 ---------------------------- - plugin args Class, ImageList, and Pixel now support default value NoneDefault - new plugin graph_color_ccs (category "Color") - new plugin contour_samplepoints (category "Analysis/Contour") - new plugin delaunay_from_points (category "Geometry") for Delaunay triangulation - fixed bug in runlength smearing that could split smeared lines Version 3.2.5, Apr 14, 2010 ---------------------------- - CIE L*a*b* values can be queried from RGBPixels - new plugin trim_image (category "Utilities") - new plugins kfill and kfill_modified (category "Filter") - rank and mean now allow larger window sizes than 3x3 and an optional border treatment (clip or reflect) - runlength_smearing and projection_cutting now also work on views with non zero offset - computation of some features corrected: o nholes (white rows/cols made whole count negative) o nholes_extended (normalization for scale invariance was missing) o compactness (border pixels were formerly ignored in computation) o skeleton_features (crossings through x/y-axis was erronously computed) o volume[16|64]regions (zones occasionally not covered entire images) o moments (no longer overflow errors on larger glyphs) o Zernike moments now have the desired invariance properties - new Python image methods white() and black() for obtaining these colors in the pixel type representation of the image - should now also compile on MacOS X 10.6 out-of-the-box - changes for 64bit architecture: o default range of Int, Real, Point made smaller than sys.maxint o writing TIFFs corrected - necessary changes for libpng 1.4.0 with #if's on PNG_LIBPNG_VER Version 3.2.4, Feb 12, 2010 ---------------------------- - new deformation plugins degrade_kanungo and white_speckles - new plugins colors_to_labels (category "Color") and ccs_from_labeled_image (category "Utility") for reading manually labeled ground truth data (thanks to Hasan Yilidz) - corrected border treatment in neighbor.hpp (affected mean and rank) and fixed another error in the rank filter - plugin category cleanup: o "Convolution" moved to "Filter" o new category "Thinning" o new category "Transformation" for rotate, scale etc. o category "Threshold" moved to "Binarization" - new plugins for area Voronoi tesselation (category "Geometry") - new plugin labeled_region_edges (category "Edge") - display of classifier glyphs corrected when adding glyphs to the classifier (can be slow for large databases) - new image type MultiLabelCC (C++) resp. MlCc (Python) - the set() method now works for connected components Version 3.2.3, Oct 08, 2009 ---------------------------- - documentation licensed under CC-BY-SA see the bottom of doc/src/index.txt for details - newer VIGRA version 1.6 included with some backports (see the file include/vigra/README for a list of modifications) - warnings about unavailable optional packages only printed when config.set("verbosity_level",1) has been set Version 3.2.2, Oct 01, 2009 ---------------------------- - plugin loading message no longer printed in non-GUI scripts; in case these messages are needed, they can optionally be enabled by config.set("verbosity_level",1) - bugfix in graph API: node values are now compared by value, not by PyObject pointer => nodes with labels greater than 256 are now reliably found - plugin projection_cutting now works as expected Version 3.2.1, Sep 17, 2009 ---------------------------- - sourceforge logo can optionally be suppressed in gendoc by passing sourceforge_logo=False to gendoc.gendoc - draw_text works again (thanks to S\oren Bjerregaard Vrist) - new page segmentation plugin bbox_merging - plugin projection_cutting no longer crashes, but still needs further improvement in the presence of noise - extensions in kdtree: o new method set_distance for dimension weighting o k_nearest_neighbors now supports an optional search predicate - classifier display can be closed and opened again - corrected slider display in Biollante - fixed errors in draw_hollow_rect and knn_editing Version 3.2.0, Jun 17, 2009 ---------------------------- - plugins to_numpy and from_numpy added for support of numpy; the deprecated numeric and numarry modules have been replaced with numpy - highlight also works with GREYSCALE and ONEBIT images - corrected resize function in VIGRA - the knn classifier can now return different confidence measures for the main id that are selectable by the user. See the classifier API documentation for details. - knn classifier now works as expected when k > 1; up to now, id_name was sorted by confidence, which meant that always the farthest among the k nearest neighbors was returned as main_id - now compiles with Python 2.6 (thanks to Prapat Suriyaphol) Version 3.1.2, Apr 14, 2009 ---------------------------- - fixed an infinite loop in classifier dialog on Windows - new module KdTree for fast two dimensional searches - now also builds out-of-the box on FreeBSD (thanks to David Blewett) - new plugin median() in category "List" also available on the C++ side as a template in listutilities.hpp - new C++ wrapper class canonicPyObject in gameramodule.hpp to make PyObject* usable in STL container classes, e.g. vector - fixed problem with weak image references in classifier dialog - Don't show right-click menu when there is no shell Version 3.1.1, Jun 09, 2008 --------------------------- - new plugin textline_reading_order() in category "Page Segmentation" - corrected the moments() feature to actually return the normalized central moments - fixed a severe bug in the rotate() function Version 3.1.0, Apr 14, 2008 --------------------------- - added automatic editing algorithms for removing outliers and superfluos samples to kNN classifiers see the classifier API documentation for details (thanks to Colin Baumgarten) - new plugin category "Page Segmentation" with two basic algorithms based on runlength smearing and projections see the plugin documentation for details - ported to wxPython 2.8 gamera-3.3.3/doc/0000755000076500000000000000000011755376174012527 5ustar chriswheelgamera-3.3.3/doc/gendoc.py0000755000076500000000000000101111364254133014316 0ustar chriswheel#!/usr/bin/env python from gamera import core, gendoc if __name__ == "__main__": core.init_gamera() gendoc.gendoc(classes=[ ("gamera.core", "ImageInfo", 'x_resolution y_resolution ncols nrows depth ncolors'), ("gamera.core", "ImageData", 'nrows ncols page_offset_x page_offset_y stride size bytes pixel_type storage_format'), ("gamera.core", "RGBPixel", 'red green blue hue saturation value cie_x cie_y cie_z cie_Lab_L cie_Lab_a cie_Lab_b cyan magenta yellow') ]) gamera-3.3.3/doc/html/0000755000076500000000000000000011755376174013473 5ustar chriswheelgamera-3.3.3/doc/html/default.css0000644000076500000000000001104411755375754015634 0ustar chriswheel@import url(html4css1.css); @import url(pygments.css); body { margin: 2em 2em 2em 2em; background-color: #effffd; } a.toc-backref { text-decoration: none ; color: black } h1 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 4px } h2 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 2px } h3 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 1px } h4 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 1px } h5 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 0.5px } div.code-block, div.highlight { margin-left: 2em; margin-right: 2em; background-color: #f0f0e0; font-family: "Andale Mono", "Bitstream Vera Sans Mono", monospace; border-color: #e0e0d0; border-style: solid; border-width: 1px; font-size: 10pt; padding: 1em; } /* The following is for SilverCity syntax highlighting */ .code_default { FONT-FAMILY: "Andale Mono", "Bitstream Vera Sans Mono", monospace; FONT-SIZE: 10pt; } .c_character { color: olive; } .c_comment { color: green; font-style: italic; } .c_commentdoc { color: green; font-style: italic; } .c_commentdockeyword { color: navy; font-weight: bold; } .c_commentdockeyworderror { color: red; font-weight: bold; } .c_commentline { color: green; font-style: italic; } .c_commentlinedoc { color: green; font-style: italic; } .c_default { } .c_identifier { color: black; } .c_number { color: #009999; } .c_operator { color: black; } .c_preprocessor { color: navy; font-weight: bold; } .c_regex { color: olive; } .c_string { color: olive; } .c_stringeol { color: olive; } .c_uuid { color: olive; } .c_verbatim { color: olive; } .c_word { color: navy; font-weight: bold; } .c_word2 { color: navy; font-weight: bold; } .h_asp { color: #ffff00; } .h_aspat { color: #ffdf00; } .h_attribute { color: #008080; } .h_attributeunknown { color: #ff0000; } .h_cdata { color: #ffdf00; } .h_comment { color: #808000; } .h_default { } .h_doublestring { color: olive; } .h_entity { color: #800080; } .h_number { color: #009999; } .h_other { color: #800080; } .h_script { color: #000080; } .h_singlestring { color: olive; } .h_tag { color: #000080; } .h_tagend { color: #000080; } .h_tagunknown { color: #ff0000; } .h_xmlend { color: #0000ff; } .h_xmlstart { color: #0000ff; } .pl_array { color: black; } .pl_backticks { color: olive; } .pl_character { color: olive; } .pl_commentline { color: green; font-style: italic; } .pl_datasection { color: olive; } .pl_default { } .pl_error { color: red; font-weight: bold; } .pl_hash { color: black; } .pl_here_delim { color: olive; } .pl_here_q { color: olive; } .pl_here_qq { color: olive; } .pl_here_qx { color: olive; } .pl_identifier { color: black; } .pl_longquote { color: olive; } .pl_number { color: #009999; } .pl_operator { color: black; } .pl_pod { color: black; font-style: italic; } .pl_preprocessor { color: navy; font-weight: bold; } .pl_punctuation { color: black; } .pl_regex { color: olive; } .pl_regsubst { color: olive; } .pl_scalar { color: black; } .pl_string { color: olive; } .pl_string_q { color: olive; } .pl_string_qq { color: olive; } .pl_string_qr { color: olive; } .pl_string_qw { color: olive; } .pl_string_qx { color: olive; } .pl_symboltable { color: black; } .pl_word { color: navy; font-weight: bold; } .p_character { color: olive; } .p_classname { color: blue; font-weight: bold; } .p_commentblock { color: gray; font-style: italic; } .p_commentline { color: green; font-style: italic; } .p_default { } .p_defname { color: #009999; font-weight: bold; } .p_identifier { color: black; } .p_number { color: #009999; } .p_operator { color: black; } .p_string { color: olive; } .p_stringeol { color: olive; } .p_triple { color: olive; } .p_tripledouble { color: olive; } .p_word { color: navy; font-weight: bold; } .yaml_comment { color: #008800; font-style: italic; } .yaml_default { } .yaml_document { color: #808080; font-style: italic; } .yaml_identifier { color: navy; font-weight: bold; } .yaml_keyword { color: #880088; } .yaml_number { color: #880000; } .yaml_reference { color: #008888; } gamera-3.3.3/doc/html/html4css1.css0000644000076500000000000001304711755375754016037 0ustar chriswheel/* :Author: David Goodger :Contact: goodger@users.sourceforge.net :Date: $Date: 2009-09-23 09:15:33 +0200 (Wed, 23 Sep 2009) $ :Revision: $Revision: 1163 $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to customize this style sheet. */ /* used to remove borders from tables and images */ .borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for "table.docutils td" with "! important". The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with "! important". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } /* Uncomment (and remove this text!) to get bold-faced definition list terms dl.docutils dt { font-weight: bold } */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in compound paragraphs. div.compound .compound-first, div.compound .compound-middle { margin-bottom: 0.5em } div.compound .compound-last, div.compound .compound-middle { margin-top: 0.5em } */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar { margin-left: 1em ; border: medium outset ; padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; clear: right } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left { clear: left } img.align-right { clear: right } ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font-family: serif ; font-size: 100% } pre.literal-block, pre.doctest-block { margin-left: 2em ; margin-right: 2em ; background-color: #eeeeee } span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em; background-color: #f7fffd; border-color: #72ada8; border: solid thin #aaaaaa; } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; } td.field-body, th.field-name { padding: 0.5em; border: solid thin #aaaaaa; } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } tt.docutils { } ul.auto-toc { list-style-type: none } gamera-3.3.3/doc/html/pygments.css0000644000076500000000000000617511755375754016067 0ustar chriswheel.hll { background-color: #ffffcc } .c { color: #408080; font-style: italic } /* Comment */ .err { border: 1px solid #FF0000 } /* Error */ .k { color: #008000; font-weight: bold } /* Keyword */ .o { color: #666666 } /* Operator */ .cm { color: #408080; font-style: italic } /* Comment.Multiline */ .cp { color: #BC7A00 } /* Comment.Preproc */ .c1 { color: #408080; font-style: italic } /* Comment.Single */ .cs { color: #408080; font-style: italic } /* Comment.Special */ .gd { color: #A00000 } /* Generic.Deleted */ .ge { font-style: italic } /* Generic.Emph */ .gr { color: #FF0000 } /* Generic.Error */ .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .gi { color: #00A000 } /* Generic.Inserted */ .go { color: #808080 } /* Generic.Output */ .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .gs { font-weight: bold } /* Generic.Strong */ .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .gt { color: #0040D0 } /* Generic.Traceback */ .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ .kp { color: #008000 } /* Keyword.Pseudo */ .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ .kt { color: #B00040 } /* Keyword.Type */ .m { color: #666666 } /* Literal.Number */ .s { color: #BA2121 } /* Literal.String */ .na { color: #7D9029 } /* Name.Attribute */ .nb { color: #008000 } /* Name.Builtin */ .nc { color: #0000FF; font-weight: bold } /* Name.Class */ .no { color: #880000 } /* Name.Constant */ .nd { color: #AA22FF } /* Name.Decorator */ .ni { color: #999999; font-weight: bold } /* Name.Entity */ .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ .nf { color: #0000FF } /* Name.Function */ .nl { color: #A0A000 } /* Name.Label */ .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ .nt { color: #008000; font-weight: bold } /* Name.Tag */ .nv { color: #19177C } /* Name.Variable */ .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ .w { color: #bbbbbb } /* Text.Whitespace */ .mf { color: #666666 } /* Literal.Number.Float */ .mh { color: #666666 } /* Literal.Number.Hex */ .mi { color: #666666 } /* Literal.Number.Integer */ .mo { color: #666666 } /* Literal.Number.Oct */ .sb { color: #BA2121 } /* Literal.String.Backtick */ .sc { color: #BA2121 } /* Literal.String.Char */ .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .s2 { color: #BA2121 } /* Literal.String.Double */ .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ .sh { color: #BA2121 } /* Literal.String.Heredoc */ .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ .sx { color: #008000 } /* Literal.String.Other */ .sr { color: #BB6688 } /* Literal.String.Regex */ .s1 { color: #BA2121 } /* Literal.String.Single */ .ss { color: #19177C } /* Literal.String.Symbol */ .bp { color: #008000 } /* Name.Builtin.Pseudo */ .vc { color: #19177C } /* Name.Variable.Class */ .vg { color: #19177C } /* Name.Variable.Global */ .vi { color: #19177C } /* Name.Variable.Instance */ .il { color: #666666 } /* Literal.Number.Integer.Long */gamera-3.3.3/doc/src/0000755000076500000000000000000011755376174013316 5ustar chriswheelgamera-3.3.3/doc/src/analysis.txt0000644000076500000000000004700611755375754015714 0ustar chriswheel Analysis ======== Contour ------- ``contour_bottom`` `````````````````` ``FloatVector`` **contour_bottom** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Analysis/Contour :Defined in: contour.py :Author: Michael Droettboom Returns a float vector containing the contour at the bottom of the image. If there are no black pixels in a given column, the value is set to inf. ---------- **Example 1:** contour_bottom() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [23.0, 24.0, 25.0, 26.0, 27.0, 44.0, 37.0, 33.0, 30.0, 28.0, 26.0, 25.0, 23.0, 22.0, 22.0, 21.0, 20.0, 8.0, 8.0, 7.0, 7.0, 6.0, 5.0, 5.0, 5.0, 4.0, 4.0, 4.0, 4.0, 3.0, 3.0, 3.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0, 6.0, 7.0, 7.0, 67.0, 68.0, 68.0, 68.0, 69.0, 69.0, 71.0, 72.0, 74.0, 75.0, 77.0]) ``contour_left`` ```````````````` ``FloatVector`` **contour_left** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Analysis/Contour :Defined in: contour.py :Author: Michael Droettboom Returns a float vector containing the contour at the left of the image. If there are no black pixels in a given row, the value is set to inf. ---------- **Example 1:** contour_left() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [42.0, 40.0, 40.0, 50.0, 53.0, 55.0, 57.0, 58.0, 59.0, 60.0, 61.0, 61.0, 62.0, 62.0, 63.0, 64.0, 64.0, 63.0, 63.0, 65.0, 65.0, 65.0, 65.0, 65.0, 64.0, 64.0, 52.0, 50.0, 49.0, 48.0, 26.0, 23.0, 22.0, 19.0, 18.0, 17.0, 16.0, 15.0, 14.0, 13.0, 13.0, 12.0, 11.0, 10.0, 10.0, 9.0, 9.0, 8.0, 8.0, 7.0, 7.0, 7.0, 7.0, 6.0, 6.0, 4.0, 5.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 6.0, 7.0, 7.0, 7.0, 7.0, 8.0, 8.0, 8.0, 9.0, 9.0, 3.0, 1.0, 0.0, 0.0, 0.0, 13.0, 15.0, 16.0, 17.0, 18.0, 20.0, 22.0, 24.0, 27.0, 34.0, inf, inf, inf, inf, 17.0, 19.0, 21.0, 22.0, 25.0, 29.0, 32.0, 42.0]) ``contour_pavlidis`` ```````````````````` [object] **contour_pavlidis** () :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Analysis/Contour :Defined in: contour.py :Author: Andreas Leuschner Returns a point list of the outer contour trace found with Pavlidis' algorithm (T. Pavlidis: *Algorithms for Grapics and Image Processing.* pp. 129-165, Springer, 1982). Note that this extracts only the first contour found, so this method should be applied to a single connected component. If you have an image with more than one connected component, do a CC analysis before, as in the following example: .. code:: Python ccs = img.cc_analysis() contours = [] for cc in ccs: contours.append([Point(p.x + cc.offset_x, p.y + cc.offset_y) \ for p in cc.contour_pavlidis()]) ``contour_right`` ````````````````` ``FloatVector`` **contour_right** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Analysis/Contour :Defined in: contour.py :Author: Michael Droettboom Returns a float vector containing the contour at the right of the image. If there are no black pixels in a given row, the value is set to inf. ---------- **Example 1:** contour_right() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [17.0, 14.0, 12.0, 11.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 3.0, 3.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 2.0, 2.0, 3.0, 4.0, 4.0, 5.0, 6.0, 6.0, 8.0, 11.0, 12.0, 14.0, 16.0, 18.0, 27.0, 27.0, 27.0, 16.0, 15.0, 15.0, 16.0, 27.0, 27.0, 27.0, 27.0, 27.0, 27.0, 27.0, 27.0, 27.0, 16.0, 16.0, 16.0, 16.0, 16.0, 16.0, 17.0, 17.0, 17.0, 17.0, 17.0, 27.0, 28.0, 28.0, 28.0, 28.0, 28.0, 29.0, 31.0, 33.0, 34.0, 17.0, 14.0, 15.0, 15.0, 16.0, 18.0, 19.0, 20.0, 22.0, 24.0, 26.0, 29.0, 33.0, inf, inf, inf, inf, 12.0, 12.0, 14.0, 15.0, 18.0, 21.0, 25.0, 28.0]) ``contour_samplepoints`` ```````````````````````` [object] **contour_samplepoints** (int(1, 100) *percentage* = 25) :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Analysis/Contour :Defined in: contour.py :Author: Oliver Christen Returns a point vector containing contour points of the given image. *percentage*: return percentage of contour points. The points are selected approximately equidistant on the countour. In addition to the points determined by the percentage argument the result list also contains the four extreme points (topmost, leftmost, bottommost, rightmost). .. code:: Python ccs = image.cc_analysis() points = [] for cc in ccs: for samplepoint in cc.contour_samplepoints(50): points.append(samplepoint) ---------- **Example 1:** contour_samplepoints(10) .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = [Point(0, 75), Point(10, 43), Point(20, 33), Point(30, 30), Point(40, 1), Point(50, 0), Point(60, 4), Point(67, 11), Point(69, 23), Point(59, 33), Point(55, 43), Point(43, 53), Point(53, 63), Point(37, 73), Point(48, 83), Point(49, 97), Point(7, 67), Point(17, 92), Point(27, 96), Point(37, 98), Point(50, 96), Point(53, 4), Point(63, 14), Point(64, 24), Point(7, 50), Point(7, 64), Point(22, 84), Point(42, 0), Point(69, 15), Point(42, 99), Point(0, 77)] ``contour_top`` ``````````````` ``FloatVector`` **contour_top** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Analysis/Contour :Defined in: contour.py :Author: Michael Droettboom Returns a float vector containing the contour at the top of the image. If there are no black pixels in a given column, the value is set to inf. ---------- **Example 1:** contour_top() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [75.0, 74.0, 74.0, 73.0, 55.0, 55.0, 53.0, 49.0, 47.0, 45.0, 43.0, 42.0, 41.0, 39.0, 38.0, 37.0, 36.0, 35.0, 34.0, 33.0, 33.0, 33.0, 32.0, 31.0, 31.0, 31.0, 30.0, 30.0, 30.0, 30.0, 30.0, 40.0, 39.0, 39.0, 38.0, 37.0, 36.0, 36.0, 35.0, 34.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 2.0, 2.0, 3.0, 4.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 13.0, 15.0]) ``histogram`` ------------- ``FloatVector`` **histogram** () :Operates on: ``Image`` [GreyScale|Grey16] :Returns: ``FloatVector`` :Category: Analysis :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Compute the histogram of the pixel values in the given image. Returns a Python array of doubles, with each value being a percentage. If the GUI is being used, the histogram is displayed. .. image:: images/histogram.png ---------- **Example 1:** histogram() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 *result* = array('d', [0.0, 0.0, 0.00030321406913280777, 0.00015160703456640388, 0.0, 0.0, 0.0, 0.00015160703456640388, 0.00030321406913280777, 0.0, 0.00030321406913280777, 0.0, 0.00030321406913280777, 0.0, 0.00015160703456640388, 0.00030321406913280777, 0.00015160703456640388, 0.0012128562765312311, 0.0012128562765312311, 0.00075803517283201942, 0.0013644633110976349, 0.00075803517283201942, 0.0010612492419648271, 0.0012128562765312311, 0.0015160703456640388, 0.00060642813826561554, 0.0013644633110976349, 0.0016676773802304426, 0.0015160703456640388, 0.0013644633110976349, 0.0012128562765312311, 0.0013644633110976349, 0.00090964220739842331, 0.0013644633110976349, 0.00060642813826561554, 0.0015160703456640388, 0.0012128562765312311, 0.0018192844147968466, 0.0012128562765312311, 0.00045482110369921165, 0.0013644633110976349, 0.00045482110369921165, 0.0010612492419648271, 0.00030321406913280777, 0.00045482110369921165, 0.00015160703456640388, 0.00045482110369921165, 0.00045482110369921165, 0.00015160703456640388, 0.0, 0.00015160703456640388, 0.00045482110369921165, 0.00075803517283201942, 0.00030321406913280777, 0.0, 0.00045482110369921165, 0.00075803517283201942, 0.00045482110369921165, 0.00030321406913280777, 0.00030321406913280777, 0.00030321406913280777, 0.00030321406913280777, 0.00015160703456640388, 0.00060642813826561554, 0.00045482110369921165, 0.00015160703456640388, 0.00030321406913280777, 0.00075803517283201942, 0.0012128562765312311, 0.00030321406913280777, 0.00045482110369921165, 0.00045482110369921165, 0.00045482110369921165, 0.00075803517283201942, 0.00030321406913280777, 0.00045482110369921165, 0.00030321406913280777, 0.00060642813826561554, 0.00090964220739842331, 0.0010612492419648271, 0.00075803517283201942, 0.00030321406913280777, 0.00030321406913280777, 0.00030321406913280777, 0.00030321406913280777, 0.00015160703456640388, 0.0012128562765312311, 0.00045482110369921165, 0.00045482110369921165, 0.00090964220739842331, 0.00075803517283201942, 0.00030321406913280777, 0.0016676773802304426, 0.0010612492419648271, 0.00030321406913280777, 0.00060642813826561554, 0.00060642813826561554, 0.00045482110369921165, 0.00060642813826561554, 0.0010612492419648271, 0.0012128562765312311, 0.00060642813826561554, 0.00090964220739842331, 0.0013644633110976349, 0.0015160703456640388, 0.0015160703456640388, 0.0010612492419648271, 0.00060642813826561554, 0.00060642813826561554, 0.00060642813826561554, 0.00075803517283201942, 0.00090964220739842331, 0.00075803517283201942, 0.0010612492419648271, 0.0013644633110976349, 0.0013644633110976349, 0.0012128562765312311, 0.0010612492419648271, 0.00075803517283201942, 0.0016676773802304426, 0.0012128562765312311, 0.00045482110369921165, 0.0010612492419648271, 0.0013644633110976349, 0.0012128562765312311, 0.0021224984839296542, 0.0010612492419648271, 0.00090964220739842331, 0.0018192844147968466, 0.0019708914493632504, 0.00090964220739842331, 0.00060642813826561554, 0.0016676773802304426, 0.0019708914493632504, 0.0018192844147968466, 0.0016676773802304426, 0.0016676773802304426, 0.0016676773802304426, 0.0019708914493632504, 0.0012128562765312311, 0.0013644633110976349, 0.0013644633110976349, 0.0015160703456640388, 0.0013644633110976349, 0.0012128562765312311, 0.0010612492419648271, 0.0013644633110976349, 0.0010612492419648271, 0.0013644633110976349, 0.00090964220739842331, 0.0010612492419648271, 0.00090964220739842331, 0.00075803517283201942, 0.00060642813826561554, 0.0016676773802304426, 0.0018192844147968466, 0.0013644633110976349, 0.00045482110369921165, 0.0010612492419648271, 0.0013644633110976349, 0.0010612492419648271, 0.0013644633110976349, 0.0012128562765312311, 0.00090964220739842331, 0.00090964220739842331, 0.0012128562765312311, 0.0013644633110976349, 0.0021224984839296542, 0.0019708914493632504, 0.0012128562765312311, 0.0012128562765312311, 0.0024257125530624622, 0.0016676773802304426, 0.0018192844147968466, 0.0027289266221952697, 0.0028805336567616739, 0.0024257125530624622, 0.0024257125530624622, 0.0045482110369921168, 0.0046998180715585201, 0.0062158884172225587, 0.0077319587628865982, 0.01015767131594906, 0.012583383869011523, 0.01607034566403881, 0.0156155245603396, 0.019254093389933294, 0.021073377804730141, 0.020921770770163734, 0.022589448150394178, 0.026682838083687082, 0.026834445118253485, 0.026682838083687082, 0.030321406913280776, 0.023347483323226198, 0.026531231049120679, 0.023347483323226198, 0.020163735597331717, 0.022741055184960581, 0.021224984839296544, 0.01834445118253487, 0.017738023044269254, 0.016221952698605217, 0.011067313523347484, 0.013341419041843541, 0.01015767131594906, 0.009854457246816252, 0.0097028502122498486, 0.012431776834445117, 0.01015767131594906, 0.011825348696179502, 0.01015767131594906, 0.009854457246816252, 0.011370527592480291, 0.009854457246816252, 0.011522134627046696, 0.0089448150394178284, 0.012431776834445117, 0.012583383869011523, 0.013947847180109158, 0.014705882352941176, 0.013644633110976349, 0.014251061249241965, 0.017889630078835657, 0.017738023044269254, 0.01804123711340206, 0.018950879320800484, 0.020012128562765311, 0.015463917525773196, 0.012128562765312311, 0.0080351728320194049, 0.0036385688295936932, 0.0036385688295936932, 0.0027289266221952697, 0.0015160703456640388, 0.00030321406913280777, 0.00030321406913280777, 0.00075803517283201942, 0.00015160703456640388, 0.00015160703456640388, 0.00015160703456640388, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) ``min_max_location`` -------------------- object **min_max_location** (``Image`` [OneBit] *mask* = None) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: object :Category: Analysis :Defined in: image_utilities.py :Author: Christoph Dalitz Returns the minimum and maximum pixel value and their location in an image. When the min/max value occurs at several locations, only the location that is closest to the botom right corner is returned. Only those pixels are examined that are black in the provided *mask*. When no *mask* is given, the entire image is examined. The mask can be useful, e.g., to find the lightest and darkest value in the original greyscale image belonging to a Cc, as in the following example: .. code:: Python onebit = grey.to_onebit() ccs = onebit.cc_analysis() # compute min/max of first cc in original greyscale image (pmin, vmin, pmax, vmax) = grey.min_max_location(ccs[0]) The return value is a tuple of the form *(pmin, vmin, pmax, vmax)* where *pmin* and *pmax* are the point of the minimum and maximimum, respectively, and *vmin* and *vmax* the corresponding pixel values. ---------- **Example 1:** min_max_location() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 *result* = (Point(87, 49), 2, Point(83, 30), 240) ``projection_cols`` ------------------- ``IntVector`` **projection_cols** () :Operates on: ``Image`` [OneBit] :Returns: ``IntVector`` :Category: Analysis :Defined in: projections.py :Author: Michael Droettboom and Karl MacMillan Compute the vertical projections of an image. This computes the number of pixels in each column. ---------- **Example 1:** projection_cols() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('i', [3, 3, 2, 2, 2, 2, 11, 19, 24, 28, 32, 34, 37, 40, 41, 33, 28, 25, 24, 22, 20, 18, 17, 16, 15, 16, 18, 16, 16, 17, 17, 15, 15, 14, 16, 46, 48, 47, 46, 47, 48, 49, 51, 46, 14, 14, 17, 17, 18, 20, 22, 22, 23, 31, 26, 16, 11, 10, 11, 9, 9, 12, 14, 16, 20, 22, 20, 17, 13, 8]) ``projection_rows`` ------------------- ``IntVector`` **projection_rows** () :Operates on: ``Image`` [OneBit] :Returns: ``IntVector`` :Category: Analysis :Defined in: projections.py :Author: Michael Droettboom and Karl MacMillan Compute the horizontal projections of an image. This computes the number of pixels in each row. ---------- **Example 1:** projection_rows() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('i', [12, 17, 19, 10, 9, 8, 7, 7, 7, 7, 7, 7, 6, 7, 6, 6, 6, 7, 7, 5, 4, 5, 5, 5, 5, 5, 6, 8, 9, 9, 17, 23, 25, 27, 25, 24, 24, 20, 18, 20, 20, 22, 22, 25, 21, 20, 15, 16, 17, 18, 17, 17, 16, 18, 19, 22, 21, 20, 20, 20, 20, 20, 20, 21, 20, 19, 18, 19, 19, 19, 19, 18, 16, 16, 18, 19, 24, 23, 24, 23, 27, 35, 33, 29, 25, 21, 15, 4, 0, 0, 0, 0, 6, 9, 11, 13, 22, 21, 14, 1]) ``projection_skewed_cols`` -------------------------- object **projection_skewed_cols** (``FloatVector`` *Rotation angles*) :Operates on: ``Image`` [OneBit] :Returns: object :Category: Analysis :Defined in: projections.py :Author: Christoph Dalitz Computes all vertical projections of an image skewed by a list of angles. As in rotate_, angles are measured clockwise and in degrees. Thus a rotate followed by a projection_cols would be conceptually the same, albeit considerably slower. This function is overloaded to work both with a single angle and a list of angles as input. In the first case a single projection vector is returned, in the second a list of projections vectors. This is explained in the following example: .. code:: Python # called twice with a single angle as input proj1 = img.projection_skewed_cols(0.5) proj2 = img.projection_skewed_cols(1.0) # the same result with one function call projlist = img.projection_skewed_cols([0.5,1.0]) proj1 = projlist[0] proj2 = projlist[1] Note that unlike rotate_ the image size is not extended. Image regions moved outside the original image size are simply clipped, which restricts this method to small angles. .. _rotate: deformations.html#rotate ---------- **Example 1:** projection_skewed_cols(15.0) .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('i', [0, 26, 23, 20, 19, 18, 18, 21, 19, 20, 18, 18, 15, 19, 18, 19, 23, 26, 28, 29, 32, 38, 37, 41, 36, 38, 33, 29, 28, 24, 20, 16, 15, 6, 3, 9, 10, 12, 13, 12, 13, 18, 16, 13, 9, 6, 5, 7, 7, 6, 8, 9, 9, 9, 13, 12, 17, 22, 23, 23, 17, 16, 10, 2, 0, 0, 0, 0, 0, 0]) ``projection_skewed_rows`` -------------------------- object **projection_skewed_rows** (``FloatVector`` *Rotation angles*) :Operates on: ``Image`` [OneBit] :Returns: object :Category: Analysis :Defined in: projections.py :Author: Christoph Dalitz Computes all horizontal projections of an image skewed by a list of angles. For more details and an example see projection_skewed_cols_. Note that unlike rotate_ the image size is not extended. Image regions moved outside the original image size are simply clipped, which restricts this method to small angles. .. _projection_skewed_cols: #projection_skewed_cols ---------- **Example 1:** projection_skewed_rows(15.0) .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('i', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 9, 12, 9, 8, 7, 6, 7, 6, 5, 6, 6, 6, 6, 5, 7, 6, 6, 6, 6, 5, 6, 7, 8, 5, 12, 16, 19, 19, 23, 22, 26, 30, 33, 34, 42, 41, 37, 31, 23, 18, 17, 18, 21, 23, 22, 19, 18, 17, 19, 19, 20, 19, 19, 19, 20, 21, 21, 22, 23, 23, 25, 23, 22, 18, 19, 19, 18, 19, 14, 17, 17, 17, 12, 13, 12, 18, 26, 32, 30, 25, 18, 16, 5, 3, 3, 4, 5, 3]) ``projections`` --------------- object **projections** () :Operates on: ``Image`` [OneBit] :Returns: object :Category: Analysis :Defined in: projections.py :Author: Michael Droettboom and Karl MacMillan Computes the projections in both the *row*- and *column*- directions. This is returned as a tuple (*rows*, *columns*), where each element is an ``IntVector`` of projections. (Equivalent to ``(image.projections_rows(), image.projections_cols())``). If the GUI is being used, the result is displayed in a window: .. image:: images/projections.png ``rotation_angle_projections`` ------------------------------ ``FloatVector`` **rotation_angle_projections** (float *minangle* = -2.50, float *maxangle* = 2.50, float *accuracy* = 0.00) :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Analysis :Defined in: projections.py :Author: Christoph Dalitz Estimates the rotation angle of a document with the aid of skewed projections, as described in section 3.1 of C. Dalitz, G.K. Michalakis, C. Pranzas: 'Optical Recognition of Psaltic Byzantine Chant Notation.' International Journal of Document Analysis and Recognition 11, pp. 143-158 (2008). This method works for a wide range of documents (text, music, forms), but can become slow for large images. This particular implementation can be accelerated by reducing the number of black pixels in the image, eg. by scaling it down, only considering a fraction of the image or by removing 'uninteresting' pixels. Arguments: *minangle*, *maxangle* (optional): angle interval that is searched for the skew angle; default values are -2.5 and +2.5 *accuracy* (optional): error bound for the skew angle estimate; default value is zero When *accuracy* is set to zero, a default value of *180\*0.5/(image.ncols\*pi)* is used, which is only a heuristic formula for little changes in the projection profile. Return Values: *rotation angle*: The rotation angle necessary to deskew the image. Can be used directly as input to rotate_ *accuracy*: Accuracy of the returned angle. .. _rotate: deformations.html#rotate gamera-3.3.3/doc/src/args.txt0000644000076500000000000003436211747510565015016 0ustar chriswheel=========================================================== Specifying arguments for plugin generation and dialog boxes =========================================================== Introduction ============ Gamera includes a rich way to specify what arguments a plugin method can take. This serves two main purposes: 1. To generate the code necessary to call a C++ function from Python. 2. To generate basic dialogs that help the user call the method from the GUI. (See example below.) .. image:: images/erode_dilate_dialog.png All of the classes necessary to make this happen are in ``gamera/args.py``, which is included in ``gamera/plugin.py``. You can refer to those files for more information if necessary. This document will first describe the common case of using ``args.py`` for `specifying the type metadata of a plugin method`_. Then `advanced usage`_ of ``args.py`` for other custom purposes is covered. Specifying the type metadata of a plugin method =============================================== Specifying the arguments of a plugin method is done by setting the ``args`` member variable of a subclass of the ``PluginFunction`` metadata class. This is discussed in `Writing Gamera Plugins`__. .. __: writing_plugins.html The ``args`` member must be an instance of the ``Args`` class. The ``Args`` class is constructed as: Args(*list*) The *list* argument is a list of ``Arg`` instances, in the order the arguments appear in the function call. For instance, to call a C++ function with the following signature:: Image* resize_copy(T& image, int nrows, int ncols, int resize_quality); the ``Args`` constructor call would look like:: args = Args([Int("nrows", default=32), Int("ncols", default=32), Choice("Interpolation Type", ["None", "Linear", "Spline"])]) As you can see, Gamera's system is a much richer type information system than C, including things such as ranges, enumerations and default values. The same type objects are also used for the ``self_type`` and ``return_type`` member variables in the plugin method metadata. The argument types include Int_, Real_, String_, Class_, ImageType_, Choice_, ChoiceString_, FileOpen_, FileSave_, Directory_, Check_, Region_, RegionMap_, ImageInfo_, FloatVector_, IntVector_, ImageList_, Info_ and Radio_. Each of these is discussed in greater detail below. This dialog box shows how the most common argument types are presented in the GUI: .. image:: images/arguments_dialog.png Incidentally, it was produced by the following code: .. code:: Python args = Args([Int("Int"), Real("Real"), String("String"), Class("Class"), ImageType(ALL, "ImageType"), FileOpen("FileOpen"), FileSave("FileSave"), Directory("Directory"), Radio("Radio 1", "Tastes great"), Radio("Radio 2", "Less filling"), Check("Check", "Power"), Info("Info: This is just for information"), Pixel("Pixel"), Point("Point"), FloatPoint("FloatPoint")]) Enabling default values beyond the GUI ====================================== The *default* parameter in the *Args* specification is only used in the GUI for the argument dialog box. If you need an actual default argument for your plugin function, you must define the ``__call__`` method in your plugin, e.g. .. code:: Python # wrapper for passing a default argument def __call__(self, nrows, ncols, interpolation="Linear"): return _example.resize_copy(self, nrows, ncols, interpolation) __call__ = staticmethod(__call__) ``_example`` must be replaced by the actual name of your source file plus a leading underscore. Plugin types reference ====================== Int --- **Int** (string *name*, tuple *range*, int *default* = ``0``) A signed integers argument. Corresponds to the C ``int`` type. Optionally, a *range* can be given as the tuple (*lower_bound*, *upper_bound*) and a *default* value. The latter can be set to ``NoneDefault`` for forcing the default to ``None`` in the GUI. .. note:: Ranges and defaults are used for the benefit of the GUI only. There is no range-checking performed for you. In the GUI, this is presented as a text entry field. Real ---- **Real** (string *name*, tuple *range*, int *default* = ``0.0``) A real (floating-point) argument. Corresponds to the C ``double`` type. Optionally, a *range* can be given as the tuple (*lower_bound*, *upper_bound*), and a *default* value. .. note:: Ranges and defaults are used for the benefit of the GUI only. There is no range-checking performed for you. String ------ **String** (string *name*, int *default* = ``""``) A string argument. Corresponds to the C ``char *`` or C++ ``std::string`` type. Optionally, a *default* value can be given. Class ----- **Class** (string *name*, PyObject *klass*, bool *list_of* = ``False``) Class is a general purpose argument type. Corresponds to the C ``PyObject *`` type. See `Custom data types in plugins`__ for details how to pass generic ``PyObject*`` data types to and from C++ plugins. .. __: plugins_custom_types.html The given *klass* is any Python type (built-in or otherwise) that is to be accepted as an argument. For example, to accept any Python dictionary, use:: Class("dict", dict) If the optional *list_of* is ``True``, then this argument refers to a Python list, in which all of its elements are instances of *klass*. ``Class`` arguments are displayed in the GUI as a drop-down list of instances of that class. If you want to have ``None`` as the first entry in this list, you can set the default to ``NoneDefault``, which is a special object that translates to ``None`` when used as a default value. ImageType --------- **ImageType** (list *pixel_types*, string *name*, bool *list_of* = ``False``, default = ``None``) A Gamera ``Image``. Corresponds to the subclasses of ``gamera::Image &`` on the C++ side. The accepted pixel types of the image are restricted to the given list of pixel types. For example to accept only GreyScale and OneBit images:: ImageType([GREYSCALE, ONEBIT]) For convenience you can use the constant ``ALL``, which is the list of all pixel types. If the optional *list_of* is ``True``, this argument refers to a Python list of Gamera Images, and on the C++ side will be passed in as a ``std::vector``. To allow for an optional image argument, it is possible to set the *default* argument to ``NoneDefault``, which will be translated by the GUI entry mask to ``None``. In this case, make sure that you overwrite the ``__call__`` method in the python plugin wrapper, so that the missing argument is correctly caught. ImageList --------- **ImageList** (string *name*) ``ImageList`` is a convenience alias for ``ImageType(ALL,`` *name* ``, list_of=True)``. Like ``Class``, this argument is displayed in the GUI as a drop-down list of instances of image lists. If you want to have ``None`` as the first entry in this list, you can set the default to ``NoneDefault``, which is a special object that translates to ``None`` when used as a default value. Choice ------ **Choice** (string *name*, list *choices* = ``[]``, int *default* = ``0``) An enumeration. Corresponds to the C type ``enum`` or ``int``. When an integer value is really logically a set of options, ``Choice`` should be used so the user is presented with a drop-down list of named options. For example, from the ``resize`` plugin method:: args = Args([Int("nrows"), Int("ncols"), Choice("interp_type", ["None", "Linear", "Spline"])]) In some cases, it might be necessary to know whether the user actually has made a choice. An alternative to defining a special choice index for 'no choice', you can alternatively set the default to ``NoneDefault``, which is a special object that translates to ``None`` when used as a default value:: args = Args([Choice("bla", ["Choice1", "Choice2"], default=NoneDefault)]) ChoiceString ------------ **ChoiceString** (string *name*, list *choices* = ``[]``, string *default* = None, strict = ``True``) A set of choices of strings. Corresponds to the C type ``char *``. To be used when a string argument can be on of a fixed set of values. If ``strict`` is ``True`` (the default), the GUI will present a drop-down list box of these choices. When ``strict`` is ``False``, a combo box will be presented which will allow the user to enter in a value that is not in the list of choices. Note that outside of the GUI, the plugin system does not verify the value of the string, so the plugin method must gracefully accept any string as input and deal with it accordingly. FileOpen -------- **FileOpen** (string *name*, string *default* = ``""``, *extension* = ``"*.*"``) A filename for opening. Corresponds to the C ``char *`` or C++ ``std::string`` type. In the GUI, this is presented as a text box with a browse button. When the browse button is pressed, a file selection dialog is presented. *extensions* can be specified to limit the file types that are displayed in the file selection dialog. Extensions is a string with one or more wildcard expressions separated by semicolons. For example, to display TIFF and PNG images:: *.tiff;*.tif;*.TIF;*.png Since ``FileOpen`` is used exclusively for opening files, the GUI ensures that the file already exists before passing the value along to the underlying plugin method. FileSave -------- **FileSave** (string *name*, string *default* = ``""``, *extension* = ``"*.*"``) The counterpart to FileOpen_, except for saving files. If the file already exists, the user is presented with an "Are you sure?" dialog. Directory --------- **Directory** (string *name*, string *default* = ``""``) A directory name. Corresponds to the C ``char *`` or C++ ``std::string`` type. The GUI ensures that the directory exists before passing the path name to the underlying plugin method. Check ----- **Check** (string *name*, string *check_box* = ``""``, bool *default* = ``False``) A boolean value. Corresponds to the C ``int`` or C++ ``bool``. In the GUI, this is presented as a check box. *check_box* is an additional piece of text that will be placed to the right of the check box in the GUI. Rect ---- **Rect** (string *name*) A Gamera ``Rect`` object. Corresponds to ``gamera::Rect*`` on the C++ side. Region ------ **Region** (string *name*) A Gamera ``Region`` object. Corresponds to ``gamera::Region &`` on the C++ side. RegionMap --------- **RegionMap** (string *name*) A Gamera ``RegionMap`` object. Corresponds to ``gamera::RegionMap &`` on the C++ side. ImageInfo --------- **ImageInfo** (string *name*) A Gamera ``ImageInfo`` object. Corresponds to ``gamera::ImageInfo &`` on the C++ side. FloatVector ----------- **FloatVector** (string *name*, int *length* = ``-1``) A vector of floating-point values. On the Python side this is an ``array('d')`` object. On the C++ side, this is a ``FloatVector *`` which is a typedef for ``std::vector *``. The optional *length* argument should be given when the length of the argument is fixed. IntVector --------- **IntVector** (string *name*, int *length* = ``-1``) A vector of integer values. On the Python side this is an ``array('i')`` object. On the C++ side, this is a ``IntVector *`` which is a typedef for ``std::vector *``. The optional *length* argument should be given when the length of the argument is fixed. Pixel ----- **Pixel** (string *name*) A pixel value corresponding to the type of the "self" image. For instance, if the method is operating on a FLOAT image, this argument will take a FLOAT value. Setting a default value for a pixel is generally of little use because the value depends on the pixel type. You can however set the default to ``NoneDefault``, which is a special object that translates to ``None`` when used as a default value. This can then be queried in the function, as shown in the following example:: args = Args([Pixel("PixelValue", default=NoneDefault)]) def __call__(self, PixelValue=None): if (PixelValue == None): PixelValue = self.white() Point ----- **Point** (string *name*, default = (0, 0)) A Point object for representing coordinates as unsigned integers. This will be displayed in the automatically-generated dialog box as a pair of numbers. PointVector ----------- **PointVector** (string *name*) A Python sequence of Points. FloatPoint ---------- **FloatPoint** (string *name*, default = (0.0, 0.0)) A FloatPoint object for representing coordinates as floating point values. This will be displayed in the automatically-generated dialog box as a pair of numbers. Info ---- **Info** (string *name*) This class is just for displaying information in a dialog box. It does not affect in any way the passing of arguments to a plugin. Radio ----- **Radio** (string *name*) Advanced usage ============== We've just seen how the ``args.py`` classes are used for specifying plugin method metadata. Of course, it can also be used whenever a one-liner quick-and-dirty dialog box is needed. For more complex tasks, you may still need to write a dialog box using the underlying wxPython_ toolkit. .. _wxPython: http://www.wxpython.org For example, we can create a simple dialog box with code below:: >>>from gamera.args import * >>>dialog = Args([Int("your favorite number")], name="What is your favorite number?") The optional *name* argument was used to change the title bar text. To display the dialog to the user, we just use the ``.show()`` method:: >>>dialog.show() This displays the following window: .. image:: images/arguments_example.png When the user clicks **Ok**, the results are returned in a list:: [6] If the user clicks **Cancel**, ``None`` is returned:: None Under the hood... ================= For a detailed view of how this works, I suggest looking at the source code... [wink] But seriously, to help with that it should be noted that there are three different source files at work here: ``gamera/args.py`` The main file that defines a class for each of the argument types. Only very basic functionality, such as storing the range of ``Int``, are implemented here. ``gamera/args_wrappers.py`` Defines how the types are converted between C++ and Python. ``gamera/gui/args_gui.py`` Defines how the arguments are mapped to widgets in the GUI. The ``args.py`` file loads the other two (if necessary) and "mixes-in" the methods in the extension classes to the core classes. gamera-3.3.3/doc/src/binarization.txt0000644000076500000000000004273211755375754016563 0ustar chriswheel Binarization ============ RegionInformation ----------------- ``gatos_background`` ```````````````````` ``Image`` [GreyScale] **gatos_background** (``Image`` [OneBit] *binarization*, int *region size* = 15) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [GreyScale] :Category: Binarization/RegionInformation :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Estimates the background of an image according to Gatos et al.'s method. See: Gatos, Basilios, Ioannis Pratikakis, and Stavros J. Perantonis. 2004. An adaptive binarization technique for low quality historical documents. *Lecture Notes in Computer Science* 3163: 102--113. *region_size* Region size for interpolation. *binarization* A preliminary binarization of the image. ``image_mean`` `````````````` float **image_mean** () :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: float :Category: Binarization/RegionInformation :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Returns the mean over all pixels of an image as a FLOAT. ``image_variance`` `````````````````` float **image_variance** () :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: float :Category: Binarization/RegionInformation :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Returns the variance over all pixels of an image as a FLOAT. ``mean_filter`` ``````````````` ``Image`` [Float] **mean_filter** (int *region size* = 5) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [Float] :Category: Binarization/RegionInformation :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Returns the regional mean of an image as a FLOAT. *region_size* The size of the region in which to calculate a mean. ---------- **Example 1:** mean_filter() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/mean_filter_plugin_00.png :height: 67 :width: 96 **Example 2:** mean_filter() .. image:: images/Grey16_generic.png :height: 71 :width: 82 .. image:: images/mean_filter_plugin_01.png :height: 71 :width: 82 **Example 3:** mean_filter() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/mean_filter_plugin_02.png :height: 67 :width: 96 ``variance_filter`` ``````````````````` ``Image`` [Float] **variance_filter** (``Image`` [Float] *means*, int *region size* = 5) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [Float] :Category: Binarization/RegionInformation :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Returns the regional variance of an image as a FLOAT. *means* Pre-calculated means for each region. *region_size* The size of the region in which to calculate the variance. ``abutaleb_threshold`` ---------------------- ``Image`` [OneBit] **abutaleb_threshold** (``Choice`` [dense|rle] *storage format*) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by using the Abutaleb locally-adaptive thresholding algorithm. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression ---------- **Example 1:** abutaleb_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/abutaleb_threshold_plugin_00.png :height: 67 :width: 96 ``bernsen_threshold`` --------------------- ``Image`` [OneBit] **bernsen_threshold** (``Choice`` [dense|rle] *storage format*, int(1, 50) *region size* = 11, int(0, 255) *contrast limit* = 80, ``bool`` *doubt_to_black* = False) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by using the Bernsen algorithm. Each point is thresholded by the mean between the maximum and minimum value in the surrounding region of size *region_size*. When the difference between maximum and minimum is below *contrast_limit* the pixel is set to black in case of *doubt_to_black* = ``True``, otherwise to white. Reference: J. Bernsen: *Dynamic thresholding of grey-level images.* Proc. 8th International Conference on Pattern Recognition (ICPR8), pp. 1251-1255, 1986. *storage_format* specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression *region_size* The size of each region in which to calculate a threshold *contrast_limit* The minimum amount of contrast required to threshold. *doubt_to_black* When ``True``, 'doubtful' values are set to black, otherwise to white. ---------- **Example 1:** bernsen_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/bernsen_threshold_plugin_00.png :height: 67 :width: 96 ``djvu_threshold`` ------------------ ``Image`` [OneBit] **djvu_threshold** (float(0.00, 1.00) *smoothness* = 0.20, int *max_block_size* = 512, int *min_block_size* = 64, int(1, 8) *block_factor* = 2) :Operates on: ``Image`` [RGB] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by using the DjVu thresholding algorithm. See Section 5.1 in: Bottou, L., P. Haffner, P. G. Howard, P. Simard, Y. Bengio and Y. LeCun. 1998. High Quality Document Image Compression with DjVu. AT&T Labs, Lincroft, NJ. http://research.microsoft.com/~patrice/PDF/jei.pdf This implementation features an additional extension to the algorithm described above. Once the background and foreground colors are determined for each block, the image is thresholded by interpolating the foreground and background colors between the blocks. This prevents "blockiness" along boundaries of strong color change. *smoothness* The amount of effect that parent blocks have on their children blocks. Higher values will result in more smoothness between blocks. Expressed as a percentage between 0.0 and 1.0. *max_block_size* The size of the largest block to determine a threshold. *min_block_size* The size of the smallest block to determine a threshold. *block_factor* The number of child blocks (in each direction) per parent block. For instance, a *block_factor* of 2 results in 4 children per parent. ---------- **Example 1:** djvu_threshold(0.5, 512, 64, 2) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/djvu_threshold_plugin_00.png :height: 129 :width: 227 ``gatos_threshold`` ------------------- ``Image`` [OneBit] **gatos_threshold** (``Image`` [GreyScale] *background*, ``Image`` [OneBit] *binarization*, float *q* = 0.60, float *p1* = 0.50, float *p2* = 0.80) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Thresholds an image according to Gatos et al.'s method. See: Gatos, Basilios, Ioannis Pratikakis, and Stavros J. Perantonis. 2004. An adaptive binarization technique for low quality historical documents. *Lecture Notes in Computer Science* 3163: 102-113. *background* Estimated background of the image. *binarization* A preliminary binarization of the image. Use the default settings for the other parameters unless you know what you are doing. ``niblack_threshold`` --------------------- ``Image`` [OneBit] **niblack_threshold** (int *region size* = 15, float *sensitivity* = -0.20, int(0, 255) *lower bound* = 20, int(0, 255) *upper bound* = 150) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Creates a binary image using Niblack's adaptive algorithm. Niblack, W. 1986. *An Introduction to Digital Image Processing.* Englewood Cliffs, NJ: Prentice Hall. Like the QGAR library, there are two extra global thresholds for the lightest and darkest regions. *region_size* The size of the region in which to calculate a threshold. *sensitivity* The sensitivity weight on the variance. *lower bound* A global threshold beneath which all pixels are considered black. *upper bound* A global threshold above which all pixels are considered white. ---------- **Example 1:** niblack_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/niblack_threshold_plugin_00.png :height: 67 :width: 96 ``otsu_find_threshold`` ----------------------- int **otsu_find_threshold** () :Operates on: ``Image`` [GreyScale] :Returns: int :Category: Binarization :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Finds a threshold point using the Otsu algorithm. Reference: N. Otsu: *A Threshold Selection Method from Grey-Level Histograms.* IEEE Transactions on Systems, Man, and Cybernetics (9), pp. 62-66 (1979) ---------- **Example 1:** otsu_find_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 *result* = 143 ``otsu_threshold`` ------------------ ``Image`` [OneBit] **otsu_threshold** (``Choice`` [dense|rle] *storage format*) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by splitting along a threshold value determined using the Otsu algorithm. Equivalent to ``image.threshold(image.otsu_find_threshold())``. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression ---------- **Example 1:** otsu_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/otsu_threshold_plugin_00.png :height: 67 :width: 96 ``sauvola_threshold`` --------------------- ``Image`` [OneBit] **sauvola_threshold** (int *region size* = 15, float *sensitivity* = 0.50, int(1, 255) *dynamic range* = 128, int(0, 255) *lower bound* = 20, int(0, 255) *upper bound* = 150) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Creates a binary image using Sauvola's adaptive algorithm. Sauvola, J. and M. Pietikainen. 2000. Adaptive document image binarization. *Pattern Recognition* 33: 225--236. Like the QGAR library, there are two extra global thresholds for the lightest and darkest regions. *region_size* The size of the region in which to calculate a threshold. *sensitivity* The sensitivity weight on the adjusted variance. *dynamic_range* The dynamic range of the variance. *lower bound* A global threshold beneath which all pixels are considered black. *upper bound* A global threshold above which all pixels are considered white. ---------- **Example 1:** sauvola_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/sauvola_threshold_plugin_00.png :height: 67 :width: 96 ``shading_subtraction`` ----------------------- ``Image`` [OneBit] **shading_subtraction** (int *k* = 7, int *threshold* = None) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: binarization.py :Author: Christoph Dalitz Thresholds an image after subtracting a -possibly shaded- background. First the backgrund image is extracted with a maximum filter with a *k\*k* window, and this image is subtracted from the original image. On the difference image, a threshold is applied, and the inverted image thereof is the binarization result. Parameters: *k* Window size of the maximum filter. Must be odd. For decent results, it must be chosen so large that every window includes at least one background pixel. *threshold* Threshold applied to the difference image. A possibly reasonable value might lie around 20. When ``None``, the threshold is determined automatically with otsu_find_threshold_. .. _otsu_find_threshold: binarization.html#otsu-find-threshold Reference: K.D. Toennies: *Grundlagen der Bildverarbeitung.* Pearson Studium, 2005, p.202 ---------- **Example 1:** shading_subtraction() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/shading_subtraction_plugin_00.png :height: 67 :width: 96 ``threshold`` ------------- ``Image`` [OneBit] **threshold** (int *threshold*, ``Choice`` [dense|rle] *storage format*) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by splitting along a given global threshold value. Pixels that are greater than the given value become white. Pixels less than the given value become black. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression. ---------- **Example 1:** threshold(128) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/threshold_plugin_00.png :height: 67 :width: 96 ``tsai_moment_preserving_find_threshold`` ----------------------------------------- int **tsai_moment_preserving_find_threshold** () :Operates on: ``Image`` [GreyScale] :Returns: int :Category: Binarization :Defined in: threshold.py :Author: Uma Kompella Finds a threshold point using the Tsai Moment Preserving threshold algorithm. Reference: W.H. Tsai: *Moment-Preserving Thresholding: A New Approach.* Computer Vision Graphics and Image Processing (29), pp. 377-393 (1985) ---------- **Example 1:** tsai_moment_preserving_find_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 *result* = 153 ``tsai_moment_preserving_threshold`` ------------------------------------ ``Image`` [OneBit] **tsai_moment_preserving_threshold** (``Choice`` [dense|rle] *storage format*) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: threshold.py :Author: Uma Kompella Creates a binary image by splitting along a threshold value determined using the Tsai Moment Preserving Threshold algorithm. Equivalent to ``image.threshold(image.tsai_moment_preserving_find_threshold())``. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression ---------- **Example 1:** tsai_moment_preserving_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/tsai_moment_preserving_threshold_plugin_00.png :height: 67 :width: 96 ``white_rohrer_threshold`` -------------------------- ``Image`` [OneBit] **white_rohrer_threshold** (int *x lookahead* = 8, int *y lookahead* = 1, int *bias mode* = 0, int *bias factor* = 100, int *f factor* = 100, int *g factor* = 100) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Binarization :Defined in: binarization.py :Author: Uma Kompella (using code from the XITE library) Creates a binary image using White and Rohrer's dynamic thresholding algorithm. It is the first of the two algorithms described in: J. M. White and G. D. Rohrer. 1983. Image thresholding for optical character recognition and other applications requiring character image extraction. *IBM J. Res. Dev.* 27(4), pp. 400-411 The algorithm uses a 'running' average instead of true average of the gray values in the neighborhood. The lookahead parameter gives the number of lookahead pixels used in the biased running average that is used in deciding the threshold at each pixel location. *x_lookahead* the number of lookahead pixels in the horizontal direction for computing the running average. White and Rohrer suggest a value of 8 for a 240 dpi scanning resolution. *y_lookahead* number of lines used for further averaging from the horizontal averages. The other parameters are for calculating biased running average. Without bias the thresholding decision would be determined by noise fluctuations in uniform areas. This implementation uses code from XITE__. .. __: http://www.ifi.uio.no/forskning/grupper/dsb/Software/Xite/ .. note:: Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that this copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation and that the name of B-lab, Department of Informatics or University of Oslo not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. B-LAB DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL B-LAB BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ---------- **Example 1:** white_rohrer_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/white_rohrer_threshold_plugin_00.png :height: 67 :width: 96 gamera-3.3.3/doc/src/classes.txt0000644000076500000000000000045111755375757015522 0ustar chriswheel======= Classes ======= Alphabetical ------------- **I** ImageData_ (gamera.core.ImageData), ImageInfo_ (gamera.core.ImageInfo) **R** RGBPixel_ (gamera.core.RGBPixel) .. _ImageData: gamera.core.ImageData.html .. _ImageInfo: gamera.core.ImageInfo.html .. _RGBPixel: gamera.core.RGBPixel.htmlgamera-3.3.3/doc/src/classification.txt0000644000076500000000000001472211755375754017063 0ustar chriswheel Classification ============== ``classify_automatic`` ---------------------- **classify_automatic** (str *id*) :Operates on: ``Image`` [OneBit] :Category: Classification :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Classifies the image as the value *id_name* and sets the state to AUTOMATIC. Use this method when an automatic classifier has classified this glyph. Note that this method does not touch the *confidence* map for the main id; this must be set separately. *id_name* Can come in one of two forms: **string** image is classified using the given ``.``-delimited class name. As in this case no confidence is provided, it is set to zero. **list of tuples** A list of tuples where each tuple is the pair (*confidence*, *class_name*). *confidence* A value in range (0, 1), where 0 is uncertain and 1 is certain. *class_name* A ``.``-delimited class name. ``classify_heuristic`` ---------------------- **classify_heuristic** (str *id*) :Operates on: ``Image`` [OneBit] :Category: Classification :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Classifies the image as the value *id_name* and sets the state to HEURISTIC. Use this method when a heuristic process has classified this glyph. This method also unsets the *confidence* map. *id_name* Can come in one of two forms: **string** image is classified using the given ``.``-delimited class name. As in this case no confidence is provided, it is set to 0.5. **list of tuples** A list of tuples where each tuple is the pair (*confidence*, *class_name*). *confidence* A value in range (0, 1), where 0 is uncertain and 1 is certain. *class_name* A ``.``-delimited class name. ``classify_manual`` ------------------- **classify_manual** (str *id*) :Operates on: ``Image`` [OneBit] :Category: Classification :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Classifies the image as the value *id_name* and sets the state to MANUAL. Use this method when an end user has classified this glyph. This method also unsets the *confidence* map. *id_name* Can come in one of two forms: **string** image is classified using the given ``.``-delimited class name. As in this case no confidence is provided, it is set to one. **list of tuples** A list of tuples where each tuple is the pair (*confidence*, *class_name*). *confidence* A value in range (0, 1), where 0 is uncertain and 1 is certain. *class_name* A ``.``-delimited class name. ``get_confidence`` ------------------ float **get_confidence** (``Choice`` [] *confidence_type* = None) :Operates on: ``Image`` [OneBit] :Returns: float :Category: Classification :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Returns the confidence of the primary class assigned to the image. *confidence_type* can be one of the predefined `confidence measures`__, e.g. .. __: classify.html#confidence .. code:: Python from gamera.gameracore import CONFIDENCE_KNNFRACTION glyph.get_confidence(CONFIDENCE_KNNFRACTION) When no *confidence_type* is given, the default confidence stored with ``id_name[0]`` is returned. If the image is unclassified, -1.0 is returned. For details about the confidence computation in Gamera, see C. Dalitz: `Reject Options and Confidence Measures for kNN Classifiers.`__ In C. Dalitz (Ed.): "Document Image Analysis with the Gamera Framework." Schriftenreihe des Fachbereichs Elektrotechnik und Informatik, Hochschule Niederrhein, vol. 8, pp. 16-38, Shaker Verlag (2009). .. __: http://lionel.kr.hsnr.de/~dalitz/data/publications/sr09-knn-rejection.pdf ``get_main_id`` --------------- str **get_main_id** () :Operates on: ``Image`` [OneBit] :Returns: str :Category: Classification :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Returns the primary class name assigned to the image. If the image is unclassified, the result is 'UNCLASSIFIED'. ``has_id_name`` --------------- ``bool`` **has_id_name** (str *id*) :Operates on: ``Image`` [OneBit] :Returns: ``bool`` :Category: Classification :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Returns ``True`` if the image has the given classification ``name``. ``match_id_name`` ----------------- **match_id_name** (str *regex*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Classification :Defined in: id_name_matching.py :Author: Michael Droettboom and Karl MacMillan Returns true if the image's main ``id_name`` matches the given regular expression. *regex* A special-purpose regular expression as defined below. A special-purpose regular expression language designed for convenience on Gamera symbol names is used here. It has limited flexibility relative to Python regular expressions, and is more akin to wildcards in command-line shells. This language is converted to standard Python regular expressions (``re`` module) for efficiency. **Informal syntax definition:** ==================== ============================================= Regular expression Description ==================== ============================================= ``A|B`` matches ``A`` or ``B`` ``A.B|C`` matches ``A.B`` or ``A.C`` ``*`` multiple-character wildcard ``?`` single character wildcard ``()`` grouping can be performed with parentheses ``[a-z]`` matches any character a-z ==================== ============================================= **Example expressions:** ======================== ==================================================== ``(upper.x)|(lower.y)`` match either ``upper.x`` or ``lower.y`` ``upper.x|upper.y`` careful! matches ``upper.x.y`` or ``upper.upper.y`` ``upper.*`` match anything in the ``upper`` category ``upper.a|b|c`` matches ``upper.a``, ``upper.b`` or ``upper.c`` ``upper.capital_?`` ``?`` is a single character wildcard ======================== ==================================================== ``unclassify`` -------------- **unclassify** () :Operates on: ``Image`` [OneBit] :Category: Classification :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Sets the image back to an UNCLASSIFIED state. Use this when you are not longer sure of the identity of the image and you want an automatic classifier to reclassify. gamera-3.3.3/doc/src/classify.txt0000644000076500000000000004345011277325002015661 0ustar chriswheel===================== Gamera classifier API ===================== Introduction ------------ For manual training of a classifier, you will generally want to use the `interactive classifier GUI`__. This document describes the programming API that is used by scripts that make use of a classifier. .. __: gui.html#interactive-classifier-window At present, Gamera supports segmentation-based image classification. This means that the page image is first segmented into individual connected components (or glyphs). Each of these glyphs has a number of features generated from it. These features (collectively called a "feature vector") are then used inside a classifier which, using a database of training data, identifies the glyph. Interactive vs. Noninteractive classifiers '''''''''''''''''''''''''''''''''''''''''' All classifiers in Gamera support the same core Classifier API (interface), so they are interchangeable. There is an important distinction between two families of classifiers, however: Interactive classifier An interactive classifier can have training examples added to it in real time, and the results used immediately to classify glyphs. Interactive classifiers are useful during the training process since the classifier can be "boot strapped" with a few examples and refined interactively. Noninteractive classifier Noninteractive classifiers take a complete database of training data and then create an optimised data structure for classification. Because building that data structure can take a considerable amount of time, new training examples cannot be added on the fly. In addition, noninteractive classifiers are serializable to binary classifier-specific file formats, which save and load much faster than the Gamera XML format. Types of classifiers '''''''''''''''''''' Within each of these families, different classifiers are available. These "concrete" classifiers have additional methods specific to the particular classifier type. The currently implemented classifiers are all *k* - nearest-neighbor, but we plan to add other classifiers as needed. - kNNInteractive_ Interactive *k* nearest neighbor classifier. - kNNNonInteractive_ Noninteractive *k* nearest neighbor classifier. The weights of the dimensions can be optimised using a genetic algorithm. For a user-friendly way to perform GA optimization, consider the Biollante_ tool in the Gamera GUI. .. _Biollante: gui.html#classifier-optimization-biollante Image properties related to classification ------------------------------------------ Classification result are stored with the image. Some interface functions for storing and querying the classification result are described in the `classification plugin documentation`__. .. __: plugins.html#classification ``id_name`` ''''''''''' The class name of a glyph is stored in the member variable ``id_name``. This variable is actually a list of possible classifications, so that a classifier can return a number of different possibilities with different confidences. Each classification entry is a tuple of the form (float *confidence*, string *name*), where the "confidence" measure is of the type CONFIDENCE_DEFAULT (see the `confidence property`__ below). .. __: #confidence For example, if among the k nearest neighbor of the image there are training samples both from class 'lower.b' and 'lower.d', its ``id_name`` variable might be: .. code:: Python [(0.0879, 'lower.b'), (0.0012, 'lower.d')] The first entry in ``id_name`` is always the class decision made by the classifier, so the other entries can (and should) generally be ignored. Due to the simplistic definition of the CONFIDENCE_DEFAULT measure, the decision made by the classifier must not necessarily have the highest "confidence", nor do the values of all "confidences" add to one. ``classification_state`` '''''''''''''''''''''''' How a glyph was classified is managed by the ``classification_state`` member variable. It can be one of the following values: +----------+--------------+-----------------------------------------------------+ | Color | Constant | Description | +==========+==============+=====================================================+ | |UColor| | UNCLASSIFIED | The connected component is completely unclassified. | | (white) | | | +----------+--------------+-----------------------------------------------------+ | |AColor| | AUTOMATIC | The connected component was classified by the | | (red) | | automatic classifier using training data. | +----------+--------------+-----------------------------------------------------+ | |HColor| | HEURISTIC | The connected component was classified by some | | (yellow) | | heuristic (non-exemplar-based) process. | +----------+--------------+-----------------------------------------------------+ | |MColor| | MANUAL | The connected component was classified by a human. | | (green) | | | +----------+--------------+-----------------------------------------------------+ .. |UColor| image:: images/unclassified_color.png .. |AColor| image:: images/autoclassified_color.png .. |HColor| image:: images/heuristicclassified_color.png .. |MColor| image:: images/manualclassified_color.png ``confidence`` '''''''''''''' Different confidence measures for the main class id are stored in the member variable ``confidence``. This is a map ('dictionary' in python lingo) with a confidence type as key. The possible confidence type constants are defined in ``gamera.gameracore`` and have the following meaning: ``CONFIDENCE_DEFAULT`` (1-*dist*/*max_dist*)^10, where *dist* is the distance to the closest prototype of the main class, and *max_dist* is the distance to the farthest prototype of the entire training population. This "confidence" is always between 0.0 and 1.0, where 1.0 only occurs for feature values that exactly match a training sample. ``CONFIDENCE_KNNFRACTION`` Fraction of samples belonging to main class among the k nearest neighbors. Makes only sense for k > 1. ``CONFIDENCE_INVERSEWEIGHT`` Dudani's weighted average distance to the main class with each distance weighted inversely. Makes only sense for k > 1. ``CONFIDENCE_LINEARWEIGHT`` Dudani's weighted average distance to the main class with each distance weighted linearly between the closest neighbor (weight one) and the k-th nearest neighbor (weight zero). Makes only sense for k > 1. ``CONFIDENCE_NUN`` Dasarathy's "nearest unlike neighbor" measure. Let *dnn* denote the distance to the closest prototype of the main class (nearest neighbor) and *dnun* the distance to the closest prototype of the remaining classes (nearest unlike neighbor). Then the NUN confidence measure is (1-*dnn*/*dnun*). ``CONFIDENCE_NNDISTANCE`` Absolute distance to the nearest neighbor. This can take arbitrary values and is in itself meaningless, but can be useful for distance rejection. ``CONFIDENCE_AVGDISTANCE`` Average distance to the k nearest neighbors. This can take arbitrary values and is in itself meaningless, but can be useful for distance rejection. For k = 1, this is identical to ``CONFIDENCE_NNDISTANCE``. The ``confidence`` map is only filled for automatically classified glyphs. Which confidence types are actually written to the confidence map depends on the ``confidence_types`` property of the classifier. So when the list ``Classifier.confidence_types`` is empty, no confidence values will be written to ``Image.confidence``. Reference: C. Dalitz: `Reject Options and Confidence Measures for kNN Classifiers.`__ In C. Dalitz (Ed.): "Document Image Analysis with the Gamera Framework." Schriftenreihe des Fachbereichs Elektrotechnik und Informatik, Hochschule Niederrhein, vol. 8, pp. 16-38, Shaker Verlag (2009) .. __: http://lionel.kr.hsnr.de/~dalitz/data/publications/sr09-knn-rejection.pdf Methods ''''''' Images have a number of methods for managing their classification state. Use of these methods is highly recommended over changing the ``id_name`` variable directly. These methods are documented in the `classification section of the plugin documentation`__. .. __: plugins.html#classification The classifier interface ------------------------ This section describes each method of the classifier interface. The base class for all classifiers is ``Classifier``, from which two classes ``NonInteractiveClassifier`` and ``InteractiveClassifier`` are derived. As noninteractive classifiers are more limited in their interface, this divides the methods into two categories: Core Methods available to all classifiers Interactive Methods available only to interactive classifiers Core '''' The following methods and properties are available to all classifiers. Properties `````````` Each classifier has the following member variables: ``_database`` List of glyphs used as training data. This is a private property that can only be accessed through the methods ``get_glyphs`` and ``set_glyphs``, or it is set in the constructor or with ``from_xml_filename``. Note that the return value of ``get_glyphs`` must be converted to a list with ``list(classifier.get_glyphs())``. ``confidence_types`` List of confidence types tht are to be computed during classification. The confidence types must be from the predefined `confidence constants`__. .. __: #confidence Initialization `````````````` As the base class ``Classifier`` does not have an explicit constructor, the constructor of ``NonInteractiveClassifier`` is described here. .. docstring:: gamera.classify NonInteractiveClassifier __init__ Classification `````````````` The following methods deal with classifying glyphs on a individual level. .. docstring:: gamera.classify NonInteractiveClassifier classify_glyph_automatic classify_list_automatic classify_and_update_list_automatic guess_glyph_automatic Grouping ```````` Often, characters do not cleanly correspond to connected components. For instance, broken or degraded printing may disconnect parts of a character, or characters, such as *i* may always be made up of two connected components. The grouping algorithm is designed to deal with those cases. It attempts to group connected components with others nearby in order to create groupings that are more like glyphs in the database. Needless to say, this approach is much slower than the "one-connected-component-at-a-time" approach, but can produce considerably better results on certain images. To train for grouping, images corresponding to the entire character must exist in the database. For instance, in the Gamera GUI, one would select both the dot and stem of a lower-case *i* and train it as ``_group.lower.i``. This will join the two connected components into a single image and then add it to the database. The algorithm is described in more detail in our paper on `correcting broken characters`__ (PDF). .. __: http://gamera.informatik.hsnr.de/publications/droettboom_broken_03.pdf .. docstring:: gamera.classify NonInteractiveClassifier group_list_automatic group_and_update_list_automatic Saving and loading `````````````````` These functions deal with saving and loading the training data of the classifier to/from the `Gamera XML format`__. .. __: xml_format.html .. note:: UNCLASSIFIED glyphs in the training data are ignored (neither saved or loaded). .. docstring:: gamera.classify NonInteractiveClassifier to_xml to_xml_filename from_xml from_xml_filename merge_from_xml merge_from_xml_filename Miscellaneous ````````````` .. docstring:: gamera.classify NonInteractiveClassifier is_interactive get_glyphs set_glyphs merge_glyphs clear_glyphs Interactive classifiers ''''''''''''''''''''''' Classification `````````````` .. docstring:: gamera.classify InteractiveClassifier classify_glyph_manual classify_list_manual classify_and_update_list_manual add_to_database remove_from_database Display ``````` .. docstring:: gamera.classify InteractiveClassifier display *k* Nearest Neighbor classifier ------------------------------- The *k* Nearest Neighbor classifier is a concrete example of the classifier API. It adds some methods of its own. ``kNNNonInteractive`` has a number of advantages over ``kNNInteractive``: - Each feature is normalized independently in the range (0, 1). This reduces the bias toward features that generate large values, such as ``area``. This normalization may change the classifications that the classifier makes, however. - The weights of the features can be optimized using a genetic algorithm. (See start_optimizing_). For a user-friendly way to perform GA optimization, consider the Biollante_ tool in the Gamera GUI. .. _Biollante: gui.html#classifier-optimization-biollante - The training data can be serialized to a classifier-specific binary file format. This format saves and loads much faster than the Gamera XML file format. .. note:: It is good practice to retain the XML file, since it is portable across platforms and to future versions of Gamera. The binary format is not guaranteed to be portable. Feature management '''''''''''''''''' The classifier automatically manages the generation of feature vectors from glyphs. When a feature vector is needed because it is being automatically classified or added to the training set, it is automatically generated on-the-fly. By default, the feature generation method in kNN is quite simple. The user of the classifier provides a list of feature function names (either in the constructor or through the ``change_feature_set`` method), and for each glyph, the results of each feature function in the set are appended together to produce a feature vector. This basic feature generation method can be overridden and replaced with something more appropriate to other problem domains. See the `overriding kNN's feature generation`__ appendix for more information. .. __: overriding_knn_features.html Methods on all ``kNN`` classes '''''''''''''''''''''''''''''' kNN Initialization `````````````````` .. docstring:: gamera.knn kNNNonInteractive __init__ Settings ```````` Settings are various parameters that control the behavior of the classifier. While some are only accessible through the methods given below, the following settings are plain properties of all kNN classifier classes: *num_k* the number *k* of neighbors to be considered *distance_type* the distance measure for neighborhood. Can be one of ``CITY_BLOCK`` (default), ``EUCLIDEAN`` or ``FAST_EUCLIDEAN`` .. docstring:: gamera.knn kNNInteractive change_feature_set .. docstring:: gamera.knn _kNNBase save_settings load_settings Serialization ````````````` .. docstring:: gamera.knn _kNNBase serialize unserialize Evaluation '''''''''' .. docstring:: gamera.knn _kNNBase evaluate knndistance_statistics distance_from_images distance_between_images distance_matrix unique_distances ``kNNInteractive`` '''''''''''''''''' .. docstring:: gamera.knn kNNInteractive __init__ .. docstring:: gamera.knn kNNInteractive noninteractive_copy ``kNNNonInteractive`` ''''''''''''''''''''' Optimization ```````````` These methods pertain to optimizing the feature weights of the classifier using a genetic algorithm (GA). For information about genetic algorithms, see [Holland1975]_. The GA implementation in Gamera is based on [GAlib]_. .. docstring:: gamera.knn kNNNonInteractive start_optimizing stop_optimizing add_optimization_callback remove_optimization_callback Improving kNN Classifiers using Editing ''''''''''''''''''''''''''''''''''''''' Gamera provides a way to improve kNN classifiers by modifying the underlying set of glyphs (training-set). This class of algorithms either removes bad or redundant glyphs or even creates new *optimal* glyphs from the training-set. Besides the graphical user interface in the `Classifier Display`__, it is also possible to invoke the algorithms from your script. .. __: gui.html#classifier-menu Each editing algorithm is a function, that takes at least one parameter, a *kNNInteractive* classifier - and returns a new edited *kNNInteractive* classifier. Any additional parameters depend on the effective algorithm, but are optional by convention. Currently the following editing algorithms are included with Gamera: .. docstring:: gamera.knn_editing edit_mnn .. docstring:: gamera.knn_editing edit_cnn .. docstring:: gamera.knn_editing edit_mnn_cnn Usage Example ````````````` The algorithms are located in the *gamera.knn_editing* package. So a typical usage example employing Wilson's *Modified Nearest Neighbour* (edit_mnn) would look like this: .. code:: Python from gamera.core import init_gamera init_gamera() from gamera.knn import kNNInteractive classifier = kNNInteractive() classifier.from_xml_filename("training-set.xml") from gamera.knn_editing import edit_mnn editedClassifier = edit_mnn(classifier) To display the glyphs removed by the editing algorithm, you can use the following code in the Gamera GUI: .. code:: Python set1 = classifier.get_glyphs() set2 = editedClassifier.get_glyphs() imagelist = list(set1.difference(set2)) display_multi(imagelist) Integrating your own editing algorithm `````````````````````````````````````` If you have written your own editing algorithm and want to make it available in the Classifier GUI, refer to the documentation of the class **gamera.knn_editing.AlgoRegistry**. References ---------- .. [Holland1975] Holland, J. H. 1975. *Adaptation in natural and artifical systems.* University of Michigan Press, Ann Arbor. .. [GAlib] Wall, M. 1999. `GAlib. A C++ Library of Genetic Algorithm Components.`__ .. __: http://lancet.mit.edu/ga/ gamera-3.3.3/doc/src/color.txt0000644000076500000000000003072511755375755015210 0ustar chriswheel Color ===== ``blue`` -------- ``Image`` [Float] **blue** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a GREYSCALE image where each pixel is the blue component of the RGB original. ---------- **Example 1:** blue() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/blue_plugin_00.png :height: 129 :width: 227 ``cie_Lab_L`` ------------- ``Image`` [Float] **cie_Lab_L** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is an *L* value in the CIE L*a*b* color space. For an introduction to the different color spaces, see A. Ford and A. Roberts: `Color Space Concersions`__ (1998). The present conversion uses the RGB to Lab conversion routine from VIGRA. .. __: http://www.poynton.com/PDFs/coloureq.pdf ---------- **Example 1:** cie_Lab_L() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/cie_Lab_L_plugin_00.png :height: 129 :width: 227 ``cie_Lab_a`` ------------- ``Image`` [Float] **cie_Lab_a** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is an *a* value in the CIE L*a*b* color space. For an introduction to the different color spaces, see A. Ford and A. Roberts: `Color Space Concersions`__ (1998). The present conversion uses the RGB to Lab conversion routine from VIGRA. .. __: http://www.poynton.com/PDFs/coloureq.pdf ---------- **Example 1:** cie_Lab_a() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/cie_Lab_a_plugin_00.png :height: 129 :width: 227 ``cie_Lab_b`` ------------- ``Image`` [Float] **cie_Lab_b** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is a *b* value in the CIE L*a*b* color space. For an introduction to the different color spaces, see A. Ford and A. Roberts: `Color Space Concersions`__ (1998). The present conversion uses the RGB to Lab conversion routine from VIGRA. .. __: http://www.poynton.com/PDFs/coloureq.pdf ---------- **Example 1:** cie_Lab_b() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/cie_Lab_b_plugin_00.png :height: 129 :width: 227 ``cie_x`` --------- ``Image`` [Float] **cie_x** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is a *x* value in the `CIE 1964 Colorimetric`__ system in range [0, 1). .. __: http://www.isc.tamu.edu/~astro/color/cie_xyz1964.html ---------- **Example 1:** cie_x() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/cie_x_plugin_00.png :height: 129 :width: 227 ``cie_y`` --------- ``Image`` [Float] **cie_y** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is a *y* value in the `CIE 1964 Colorimetric`__ system in range [0, 1). .. __: http://www.isc.tamu.edu/~astro/color/cie_xyz1964.html ---------- **Example 1:** cie_y() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/cie_y_plugin_00.png :height: 129 :width: 227 ``cie_z`` --------- ``Image`` [Float] **cie_z** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is a *z* value in the `CIE 1964 Colorimetric`__ system in range [0, 1). .. __: http://www.isc.tamu.edu/~astro/color/cie_xyz1964.html ---------- **Example 1:** cie_z() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/cie_z_plugin_00.png :height: 129 :width: 227 ``color_ccs`` ------------- ``Image`` [RGB] **color_ccs** (``bool`` *ignore_unlabeled* = True) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [RGB] :Category: Color :Defined in: gui_support.py :Author: Michael Droettboom, Karl MacMillan, and Robert Butz Returns an RGB image where each connected component of the image is colored one of eight different colors. This function can be used to verify that ``cc_analysis`` is working correctly for your image. It should be noted that this coloring does not take care of component adjacency. It may therefore happen that adjacent components obtain the same color. If this is not acceptable in your use case, have a look at graph_color_ccs_ instead. .. _graph_color_ccs: color.html#graph-color-ccs *ignore_unlabeled*: do not colorize unlabeled pixels (pixel value one), but leave them black .. note:: Connected component analysis must already be performed on the image (using cc_analysis_, for example) in order for this to work. .. _cc_analysis: segmentation.html#cc-analysis **Example 1:** .. image:: images/color_ccs.png ``colors_to_labels`` -------------------- ``Image`` [OneBit] **colors_to_labels** (dict *rgb_to_label*) :Operates on: ``Image`` [RGB] :Returns: ``Image`` [OneBit] :Category: Color :Defined in: color.py :Author: Christoph Dalitz and Hasan Yildiz Converts an RGB image to a labeled onebit image. Each RGB color is replaced by the label specified in the mapping *rgb_to_label*. RGB values not listed in *rgb_to_label* are white in the returned onebit image. When no mapping *rgb_to_label* is provided, each different RGB color is replaced by a unique label. This is mostly useful for reading manually labeled groundtruth data from color PNG files. Example: .. code:: Python # map red to label 3, and green to label 5 labeled = rgb.colors_to_labels( {RGBPixel(255,0,0): 3, RGBPixel(0,255,0): 5} ) A typical use case of this plugin is in combination with ccs_from_labeled_image_. .. _ccs_from_labeled_image: utility.html#ccs-from-labeled-image ``cyan`` -------- ``Image`` [Float] **cyan** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a GREYSCALE image where each pixel is the cyan component of the RGB original. ---------- **Example 1:** cyan() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/cyan_plugin_00.png :height: 129 :width: 227 ``false_color`` --------------- ``Image`` [RGB] **false_color** () :Operates on: ``Image`` [Float|GreyScale] :Returns: ``Image`` [RGB] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a false color representation of the given image. Low values are red, mid values are green and high values are blue. This can help visualize greyscale images that are not *real* images but are representations of other kinds of data. ---------- **Example 1:** false_color() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/false_color_plugin_00.png :height: 67 :width: 96 ``graph_color_ccs`` ------------------- ``Image`` [RGB] **graph_color_ccs** ([object *ccs*], [RGBPixel *colors*] = None, ``Choice`` [CC center|20% contour points|voronoi diagram] *method* = 20% contour points) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [RGB] :Category: Color :Defined in: geometry.py :Author: Oliver Christen and Tobias Bolten Returns an RGB Image where each segment is colored with one of the colors from *colors* with the constraint that segments adjacent in the neighborship graph have different colors. This function can be used to verify that the pagesegmentation e.g. ``runlength_smearing`` is working correctly for your image. For coloring the Gamera graph library is used. For more information on the coloring algorithm see Graph.colorize__ .. __: graph.html#colorize *ccs*: ImageList which contains ccs to be colored. Must be views on the image on which this method is called. *colors*: list of colors (instances of RGBPixel) which will be used for coloring. When ``None``, the default set of seven colors given in the example below is used. *method*: Controls the calculation of the neighborhood graph: 0 = from the CC center points (fastest, but can be inaccurate for large CC's) 1 = from a 20 percent sample of the contour points (reasonable compromise between speed and accuracy) 2 = from the exact area Voronoi diagram (can be slow on large images) .. code:: Python ccs = imgage.cc_analysis() colors = [ RGBPixel(150, 0, 0), RGBPixel(0, 250, 0), RGBPixel(0, 0, 255), RGBPixel(250, 0, 255), RGBPixel(50, 150, 50), RGBPixel(0, 190, 255), RGBPixel(230, 190, 20) ] rgb = imgage.mycolor_ccs(ccs, colors, 1) .. note:: *colors* may not contain less than six colors. ``green`` --------- ``Image`` [Float] **green** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a GREYSCALE image where each pixel is the green component of the original. ---------- **Example 1:** green() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/green_plugin_00.png :height: 129 :width: 227 ``hue`` ------- ``Image`` [Float] **hue** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is a hue value in HSV space in range [0, 1). Since the hue space is cyclic, the shortest *distance* between 1 and 0 is 0. ---------- **Example 1:** hue() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/hue_plugin_00.png :height: 129 :width: 227 ``magenta`` ----------- ``Image`` [Float] **magenta** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a GREYSCALE image where each pixel is the magenta component of the RGB original. ---------- **Example 1:** magenta() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/magenta_plugin_00.png :height: 129 :width: 227 ``red`` ------- ``Image`` [Float] **red** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a GREYSCALE image where each pixel is the red component of the RGB original. ---------- **Example 1:** red() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/red_plugin_00.png :height: 129 :width: 227 ``saturation`` -------------- ``Image`` [Float] **saturation** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is a saturation value in HSV space in range [0, 1]. ---------- **Example 1:** saturation() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/saturation_plugin_00.png :height: 129 :width: 227 ``value`` --------- ``Image`` [Float] **value** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a FLOAT image where each pixel is the value in HSV space in range [0, 1]. For more information, Google for HSV color space. ---------- **Example 1:** value() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/value_plugin_00.png :height: 129 :width: 227 ``yellow`` ---------- ``Image`` [Float] **yellow** () :Operates on: ``Image`` [RGB] :Returns: ``Image`` [Float] :Category: Color :Defined in: color.py :Author: Michael Droettboom and Karl MacMillan Returns a GREYSCALE image where each pixel is the yellow component of the RGB original. ---------- **Example 1:** yellow() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/yellow_plugin_00.png :height: 129 :width: 227 gamera-3.3.3/doc/src/combine.txt0000644000076500000000000002375611755375755015514 0ustar chriswheel Combine ======= Arithmetic ---------- ``add_images`` `````````````` ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **add_images** (``Image`` [GreyScale|Grey16|Float|RGB|Complex] *other*, ``bool`` *in_place* = False) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Combine/Arithmetic :Defined in: arithmetic.py :Author: Michael Droettboom *All images passed in (including self) must have the same pixel type.* Adds the corresponding pixels of two images together. The two images must be the same type. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. Use .subimage on either image to crop appropriately if necessary for your specific case. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. ---------- **Example 1:** add_images |add_images_plugin_00_00| |add_images_plugin_00_01| |add_images_plugin_00_02| .. |add_images_plugin_00_00| image:: images/add_images_plugin_00_00.png :height: 67 :width: 96 .. |add_images_plugin_00_01| image:: images/add_images_plugin_00_01.png :height: 67 :width: 96 .. |add_images_plugin_00_02| image:: images/add_images_plugin_00_02.png :height: 67 :width: 96 ``divide_images`` ````````````````` ``Image`` [GreyScale|Grey16|Float] **divide_images** (``Image`` [GreyScale|Grey16|Float] *other*, ``bool`` *in_place* = False) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [GreyScale|Grey16|Float] :Category: Combine/Arithmetic :Defined in: arithmetic.py :Author: Michael Droettboom *All images passed in (including self) must have the same pixel type.* Divides the pixels of the current image by the pixels of another image. The two images must be the same type. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. Use .subimage on either image to crop appropriately if necessary for your specific case. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. ``multiply_images`` ``````````````````` ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **multiply_images** (``Image`` [GreyScale|Grey16|Float|RGB|Complex] *other*, ``bool`` *in_place* = False) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Combine/Arithmetic :Defined in: arithmetic.py :Author: Michael Droettboom *All images passed in (including self) must have the same pixel type.* Multiplies the corresponding pixels of two images together. The two images must be the same type. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. Use .subimage on either image to crop appropriately if necessary for your specific case. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. ``subtract_images`` ``````````````````` ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **subtract_images** (``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] *other*, ``bool`` *in_place* = False) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Combine/Arithmetic :Defined in: arithmetic.py :Author: Michael Droettboom *All images passed in (including self) must have the same pixel type.* Adds the pixels of another image from the current image. The two images must be the same type. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. Use .subimage on either image to crop appropriately if necessary for your specific case. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. ---------- **Example 1:** subtract_images |subtract_images_plugin_00_00| |subtract_images_plugin_00_01| |subtract_images_plugin_00_02| .. |subtract_images_plugin_00_00| image:: images/subtract_images_plugin_00_00.png :height: 67 :width: 96 .. |subtract_images_plugin_00_01| image:: images/subtract_images_plugin_00_01.png :height: 67 :width: 96 .. |subtract_images_plugin_00_02| image:: images/subtract_images_plugin_00_02.png :height: 67 :width: 96 Logical ------- ``and_image`` ````````````` ``Image`` [OneBit] **and_image** (``Image`` [OneBit] *other*, ``bool`` *in_place* = False) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Combine/Logical :Defined in: logical.py :Author: Michael Droettboom Perform the AND operation on two images. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. See or_image_ for some usage examples. ---------- **Example 1:** and_image |and_image_plugin_00_00| |and_image_plugin_00_01| |and_image_plugin_00_02| .. |and_image_plugin_00_00| image:: images/and_image_plugin_00_00.png :height: 67 :width: 69 .. |and_image_plugin_00_01| image:: images/and_image_plugin_00_01.png :height: 67 :width: 69 .. |and_image_plugin_00_02| image:: images/and_image_plugin_00_02.png :height: 67 :width: 69 ``or_image`` ```````````` ``Image`` [OneBit] **or_image** (``Image`` [OneBit] *other*, ``bool`` *in_place* = False) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Combine/Logical :Defined in: logical.py :Author: Michael Droettboom Perform the OR operation on two images. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. Usage examples: Using logical functions in different ways will generally involve creating temporary subimages for regions of interest. Subimages are very lightweight objects that keep track of a bounding box and refer to the underlying data, therefore creating/destroying a number of these on the fly should not have a significant impact on performance. Padding an image. .. code:: Python def pad_image(image, padding): new_image = Image(0, 0, image.nrows + padding * 2, image.ncols + padding * 2, ONEBIT, DENSE) new_image.subimage((padding, padding), Dim(image.nrows, image.ncols)).or_image(image, True) return new_image Stamping an image over a larger image. Use subimage to change the destination of the stamp. .. code:: Python # stamp: a small stamp image # paper: a larger destination image for x in range(0, 100, 10): paper.subimage(0, x, stamp.nrows, stamp.ncols).or_image(stamp, True) Putting part of a source image on the upper-left corner of a destination image. .. code:: Python # src: a source image # dest: a destination image dest.or_image(src.subimage(50, 50, 25, 25), True) Removing a connected component from its original image. .. code:: Python # src: the original image # cc: a cc on that image src.clip_image(cc).xor_image(cc, True) ---------- **Example 1:** or_image |or_image_plugin_00_00| |or_image_plugin_00_01| |or_image_plugin_00_02| .. |or_image_plugin_00_00| image:: images/or_image_plugin_00_00.png :height: 67 :width: 69 .. |or_image_plugin_00_01| image:: images/or_image_plugin_00_01.png :height: 67 :width: 69 .. |or_image_plugin_00_02| image:: images/or_image_plugin_00_02.png :height: 67 :width: 69 ``xor_image`` ````````````` ``Image`` [OneBit] **xor_image** (``Image`` [OneBit] *other*, ``bool`` *in_place* = False) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Combine/Logical :Defined in: logical.py :Author: Michael Droettboom Perform the XOR operation on two images. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. See or_image_ for some usage examples. ---------- **Example 1:** xor_image |xor_image_plugin_00_00| |xor_image_plugin_00_01| |xor_image_plugin_00_02| .. |xor_image_plugin_00_00| image:: images/xor_image_plugin_00_00.png :height: 67 :width: 69 .. |xor_image_plugin_00_01| image:: images/xor_image_plugin_00_01.png :height: 67 :width: 69 .. |xor_image_plugin_00_02| image:: images/xor_image_plugin_00_02.png :height: 67 :width: 69 ``diff_images`` --------------- ``Image`` [RGB] **diff_images** (``Image`` [OneBit] *other*) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [RGB] :Category: Combine :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Returns a color image representing the difference of two images following the conventions of a number of Unix diff visualization tools, such as CVS web. Pixels in both images are black. Pixels in 'self' but not in the given image ("deleted" pixels) are red. Pixels in the given image but not in self ("inserted" pixels) are green. ``mask`` -------- ``Image`` [GreyScale|RGB] **mask** (``Image`` [OneBit] *mask*) :Operates on: ``Image`` [GreyScale|RGB] :Returns: ``Image`` [GreyScale|RGB] :Category: Combine :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Masks an image using the given ONEBIT image. Parts of the ONEBIT image that are white will be changed to white in the resulting image. The images must be the same size. ``union_images`` ---------------- ``Image`` [OneBit] **union_images** ([object *list_of_images*]) :Returns: ``Image`` [OneBit] :Category: Combine :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Returns an image that is the union of the given list of connected components. gamera-3.3.3/doc/src/conversion.txt0000644000076500000000000001165111755375755016254 0ustar chriswheel Conversion ========== ``extract_imaginary`` --------------------- ``Image`` [Float] **extract_imaginary** () :Operates on: ``Image`` [Complex] :Returns: ``Image`` [Float] :Category: Conversion :Defined in: image_conversion.py :Author: Michael Droettboom and Karl MacMillan Returns a Float image containing only the imaginary values in the given complex image. ``extract_real`` ---------------- ``Image`` [Float] **extract_real** () :Operates on: ``Image`` [Complex] :Returns: ``Image`` [Float] :Category: Conversion :Defined in: image_conversion.py :Author: Michael Droettboom and Karl MacMillan Returns a Float image containing only the real values in the given complex image. ``to_complex`` -------------- ``Image`` [Complex] **to_complex** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float] :Returns: ``Image`` [Complex] :Category: Conversion :Defined in: image_conversion.py :Author: Michael Droettboom and Karl MacMillan Converts the given image to a COMPLEX image. Note, converting an image to one of the same type performs a copy operation. ``to_float`` ------------ ``Image`` [Float] **to_float** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Complex] :Returns: ``Image`` [Float] :Category: Conversion :Defined in: image_conversion.py :Author: Michael Droettboom and Karl MacMillan Converts the given image to a FLOAT image according to the following rules: - for ONEBIT images, 0 is mapped to 0.0 and everything else to 1.0 - for GREYSCALE and GREY16 images, pixel values are copied unchanged - for RGB images, the luminance is used, which is defined in VIGRA as 0.3*R + 0.59*G + 0.11*B Converting an image to one of the same type performs a copy operation. ``to_grey16`` ------------- ``Image`` [Grey16] **to_grey16** () :Operates on: ``Image`` [OneBit|GreyScale|Float|RGB|Complex] :Returns: ``Image`` [Grey16] :Category: Conversion :Defined in: image_conversion.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Converts the given image to a GREY16 image according to the following rules: - for ONEBIT images, 0 is mapped to 65535 and everything else to 0. - for FLOAT images, the range [min,max] is linearly scaled to [0,65535] - for GREYSCALE images, pixel values are copied unchanged - for RGB images, the luminance is used, which is defined in VIGRA as 0.3*R + 0.59*G + 0.11*B. This results only in a value range [0,255] Converting an image to one of the same type performs a copy operation. ``to_greyscale`` ---------------- ``Image`` [GreyScale] **to_greyscale** () :Operates on: ``Image`` [OneBit|Float|Grey16|RGB|Complex] :Returns: ``Image`` [GreyScale] :Category: Conversion :Defined in: image_conversion.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Converts the given image to a GREYSCALE image according to the following rules: - for ONEBIT images, 0 is mapped to 255 and everything else to 0. - for FLOAT images, the range [min,max] is linearly scaled to [0,255] - for GREY16 images, the range [0,max] is linearly scaled to [0,255] - for RGB images, the luminance is used, which is defined in VIGRA as 0.3*R + 0.59*G + 0.11*B Converting an image to one of the same type performs a copy operation. ---------- **Example 1:** to_greyscale() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/to_greyscale_plugin_00.png :height: 129 :width: 227 ``to_onebit`` ------------- ``Image`` [OneBit] **to_onebit** () :Operates on: ``Image`` [Float|GreyScale|Grey16|RGB|Complex] :Returns: ``Image`` [OneBit] :Category: Conversion :Defined in: image_conversion.py :Author: Michael Droettboom and Karl MacMillan Converts the given image to a ONEBIT image. First the image is converted and then the otsu_threshold_ algorithm is applied. For other ways to convert to ONEBIT images, see the Binarization_ category. Converting an image to one of the same type performs a copy operation. .. _otsu_threshold: binarization.html#otsu-threshold .. _Binarization: binarization.html ---------- **Example 1:** to_onebit() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/to_onebit_plugin_00.png :height: 129 :width: 227 **Example 2:** to_onebit() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/to_onebit_plugin_01.png :height: 67 :width: 96 ``to_rgb`` ---------- ``Image`` [RGB] **to_rgb** () :Operates on: ``Image`` [OneBit|GreyScale|Float|Grey16|Complex] :Returns: ``Image`` [RGB] :Category: Conversion :Defined in: image_conversion.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Converts the given image to an RGB image according to teh following rules: - for ONEBIT images, 0 is mapped to (255,255,255) and everything else to (0,0,0) - for GREYSCALE and GREY16 images, R=G=B - for FLOAT images, the range [min,max] is linearly mapped to the 256 grey values Note, converting an image to one of the same type performs a copy operation. gamera-3.3.3/doc/src/convolution.txt0000644000076500000000000003202211310774403016415 0ustar chriswheel Convolution =========== Kernels ------- ``AveragingKernel`` ``````````````````` ``Image`` [Float] **AveragingKernel** (int *radius* = 3) :Returns: ``Image`` [Float] :Category: Convolution/Kernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Creates an Averaging filter kernel for use with separable convolution. The window size is (2*radius+1) * (2*radius+1). *radius* The radius of the kernel. ``BinomialKernel`` `````````````````` ``Image`` [Float] **BinomialKernel** (int *radius* = 3) :Returns: ``Image`` [Float] :Category: Convolution/Kernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Creates a binomial filter kernel for use with separable convolution of a given radius. *radius* The radius of the kernel. ``GaussianDerivativeKernel`` ```````````````````````````` ``Image`` [Float] **GaussianDerivativeKernel** (float *standard_deviation* = 1.00, int *order* = 1) :Returns: ``Image`` [Float] :Category: Convolution/Kernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Init as a Gaussian derivative of order 'order'. The radius of the kernel is always 3*std_dev. *standard_deviation* The standard deviation of the Gaussian kernel. *order* The order of the Gaussian kernel. ``GaussianKernel`` `````````````````` ``Image`` [Float] **GaussianKernel** (float *standard_deviation* = 1.00) :Returns: ``Image`` [Float] :Category: Convolution/Kernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Init as a Gaussian function. The radius of the kernel is always 3*standard_deviation. *standard_deviation* The standard deviation of the Gaussian kernel. ``SimpleSharpeningKernel`` `````````````````````````` ``Image`` [Float] **SimpleSharpeningKernel** (float *sharpening_factor* = 0.50) :Returns: ``Image`` [Float] :Category: Convolution/Kernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Creates a kernel for simple sharpening. ``SymmetricGradientKernel`` ``````````````````````````` ``Image`` [Float] **SymmetricGradientKernel** () :Returns: ``Image`` [Float] :Category: Convolution/Kernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Init as a symmetric gradient filter of the form [ 0.5, 0.0, -0.5] ``convolve`` ------------ ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **convolve** (``Image`` [Float] *kernel*, ``Choice`` [avoid|clip|repeat|reflect|wrap] *border_treatment* = clip) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Convolves an image with a given kernel. Uses code from the Vigra library (Copyright 1998-2007 by Ullrich Kĥthe). *kernel* A kernel for the convolution. The kernel may either be a FloatImage or a nested Python list of floats. *border_treatment* Specifies how to treat the borders of the image. Must be one of the following: - BORDER_TREATMENT_AVOID (0) do not operate on a pixel where the kernel does not fit in the image - BORDER_TREATMENT_CLIP (1) clip kernel at image border (this is only useful if the kernel is >= 0 everywhere) - BORDER_TREATMENT_REPEAT (2) repeat the nearest valid pixel - BORDER_TREATMENT_REFLECT (3) reflect image at last row/column - BORDER_TREATMENT_WRAP (4) wrap image around (periodic boundary conditions) Example usage: .. code:: Python # Using a custom kernel img2 = image.convolve([[0.125, 0.0, -0.125], [0.25 , 0.0, -0.25 ], [0.125, 0.0, -0.125]]) # Using one of the included kernel generators img2 = image.convolve(GaussianKernel(3.0)) ``convolve_x`` -------------- ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **convolve_x** (``Image`` [Float] *kernel_x*, ``Choice`` [avoid|clip|repeat|reflect|wrap] *border_treatment* = clip) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Convolves an image in the X directions with a 1D kernel. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich Kĥthe). *kernel_x* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. It must consist of only a single row. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. ``convolve_xy`` --------------- ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **convolve_xy** (``Image`` [Float] *kernel_x*, ``Image`` [Float] *kernel_y*, ``Choice`` [avoid|clip|repeat|reflect|wrap] *border_treatment* = clip) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Convolves an image in both X and Y directions with 1D kernels. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich Kĥthe). *kernel_y* A kernel for the convolution in the *y* direction. The kernel may either be a FloatImage or a nested Python list of floats. *kernel_x* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. If *kernel_x* is omitted, *kernel_y* will be used in the *x* direction. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. ``convolve_y`` -------------- ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **convolve_y** (``Image`` [Float] *kernel_y*, ``Choice`` [avoid|clip|repeat|reflect|wrap] *border_treatment* = clip) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Convolves an image in the X directions with a 1D kernel. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich Kĥthe). *kernel_y* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. It must consist of only a single row. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. ``gaussian_gradient`` --------------------- [object] **gaussian_gradient** (float *scale* = 0.50) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: [object] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Calculate the gradient vector by means of a 1st derivatives of Gaussian filter. *scale* Returns a tuple of (*x_gradient*, *y_gradient*). ---------- **Example 1:** gaussian_gradient(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 |gaussian_gradient_plugin_00_00| |gaussian_gradient_plugin_00_01| .. |gaussian_gradient_plugin_00_00| image:: images/gaussian_gradient_plugin_00_00.png :height: 67 :width: 96 .. |gaussian_gradient_plugin_00_01| image:: images/gaussian_gradient_plugin_00_01.png :height: 67 :width: 96 **Example 2:** gaussian_gradient(1.0) .. image:: images/RGB_generic.png :height: 129 :width: 227 |gaussian_gradient_plugin_01_00| |gaussian_gradient_plugin_01_01| .. |gaussian_gradient_plugin_01_00| image:: images/gaussian_gradient_plugin_01_00.png :height: 129 :width: 227 .. |gaussian_gradient_plugin_01_01| image:: images/gaussian_gradient_plugin_01_01.png :height: 129 :width: 227 **Example 3:** gaussian_gradient(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 |gaussian_gradient_plugin_02_00| |gaussian_gradient_plugin_02_01| .. |gaussian_gradient_plugin_02_00| image:: images/gaussian_gradient_plugin_02_00.png :height: 67 :width: 96 .. |gaussian_gradient_plugin_02_01| image:: images/gaussian_gradient_plugin_02_01.png :height: 67 :width: 96 ``gaussian_smoothing`` ---------------------- ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **gaussian_smoothing** (float *standard_deviation* = 1.00) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Performs gaussian smoothing on an image. *standard_deviation* The standard deviation of the Gaussian kernel. ---------- **Example 1:** gaussian_smoothing(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/gaussian_smoothing_plugin_00.png :height: 67 :width: 96 **Example 2:** gaussian_smoothing(3.0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/gaussian_smoothing_plugin_01.png :height: 129 :width: 227 **Example 3:** gaussian_smoothing(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/gaussian_smoothing_plugin_02.png :height: 67 :width: 96 ``hessian_matrix_of_gaussian`` ------------------------------ [object] **hessian_matrix_of_gaussian** (float *scale* = 0.50) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: [object] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Filter image with the 2nd derivatives of the Gaussian at the given scale to get the Hessian matrix. *scale* ---------- **Example 1:** hessian_matrix_of_gaussian(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 |hessian_matrix_of_gaussian_plugin_00_00| |hessian_matrix_of_gaussian_plugin_00_01| |hessian_matrix_of_gaussian_plugin_00_02| .. |hessian_matrix_of_gaussian_plugin_00_00| image:: images/hessian_matrix_of_gaussian_plugin_00_00.png :height: 67 :width: 96 .. |hessian_matrix_of_gaussian_plugin_00_01| image:: images/hessian_matrix_of_gaussian_plugin_00_01.png :height: 67 :width: 96 .. |hessian_matrix_of_gaussian_plugin_00_02| image:: images/hessian_matrix_of_gaussian_plugin_00_02.png :height: 67 :width: 96 ``laplacian_of_gaussian`` ------------------------- ``Image`` [GreyScale|Grey16|Float] **laplacian_of_gaussian** (float *scale* = 0.50) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [GreyScale|Grey16|Float] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Filter image with the Laplacian of Gaussian operator at the given scale. *scale* ---------- **Example 1:** laplacian_of_gaussian(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/laplacian_of_gaussian_plugin_00.png :height: 67 :width: 96 ``simple_sharpen`` ------------------ ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **simple_sharpen** (float *sharpening_factor* = 0.50) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Perform simple sharpening. *sharpening_factor* The amount of sharpening to perform. ---------- **Example 1:** simple_sharpen(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/simple_sharpen_plugin_00.png :height: 67 :width: 96 **Example 2:** simple_sharpen(3.0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/simple_sharpen_plugin_01.png :height: 129 :width: 227 ``sobel_edge_detection`` ------------------------ ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **sobel_edge_detection** () :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Performs simple Sobel edge detection on the image. ---------- **Example 1:** sobel_edge_detection(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/sobel_edge_detection_plugin_00.png :height: 67 :width: 96 **Example 2:** sobel_edge_detection(3.0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/sobel_edge_detection_plugin_01.png :height: 129 :width: 227 gamera-3.3.3/doc/src/corelation.txt0000644000076500000000000000461611755375755016231 0ustar chriswheel Corelation ========== ``corelation_sum`` ------------------ float **corelation_sum** (``Image`` [OneBit] *template*, ``Point`` *offset*) :Operates on: ``Image`` [OneBit|GreyScale] :Returns: float :Category: Corelation :Defined in: corelation.py :Author: Michael Droettboom Returns a floating-point value for how well an image is corelated to another image placed at a given origin (*x*, *y*). Uses the sum of absolute distance method. A higher value indicates more corelation. *template* The template image. *offset* The displacement of the template on the image. ``corelation_sum_squares`` -------------------------- float **corelation_sum_squares** (``Image`` [OneBit] *template*, ``Point`` *offset*) :Operates on: ``Image`` [OneBit|GreyScale] :Returns: float :Category: Corelation :Defined in: corelation.py :Author: Michael Droettboom Returns a floating-point value for how well an image is corelated to another image placed at a given origin (*x*, *y*). Uses the sum of squares method. A higher value indicates more corelation. *template* The template image. *offset* The displacement of the template on the image. ``corelation_weighted`` ----------------------- float **corelation_weighted** (``Image`` [OneBit] *template*, ``Point`` *offset*, float *bb*, float *bw*, float *wb*, float *ww*) :Operates on: ``Image`` [OneBit|GreyScale] :Returns: float :Category: Corelation :Defined in: corelation.py :Author: Michael Droettboom Returns a floating-point value for how well an image is corelated to another image placed at a given origin (*x*, *y*). Uses the weighted reward/penalty method. *template* The template image. *offset* The displacement of the template on the image. *bb*, *bw*, *wb*, *ww* The rewards and penalties for different combinations of pixels. The first letter in the arugment name indicates the color of the template; the second letter indicates the color of the source image. For instance, the value of *bw* will be applied to the result when the template pixel is black and the source image pixel is white. +--------+--------+------------------+ | Image | | Template | | +--------+---------+--------+ | | | black | white | | +--------+---------+--------+ | | black | *bb* | *wb* | | +--------+---------+--------+ | | white | *bw* | *ww* | +--------+--------+---------+--------+ gamera-3.3.3/doc/src/default.css0000644000076500000000000001104410714675724015451 0ustar chriswheel@import url(html4css1.css); @import url(pygments.css); body { margin: 2em 2em 2em 2em; background-color: #effffd; } a.toc-backref { text-decoration: none ; color: black } h1 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 4px } h2 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 2px } h3 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 1px } h4 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 1px } h5 { background-color: #e1f0ee; color: #29493c; border-top-color: #72ada8; border-top-style: solid; border-top-width: 0.5px } div.code-block, div.highlight { margin-left: 2em; margin-right: 2em; background-color: #f0f0e0; font-family: "Andale Mono", "Bitstream Vera Sans Mono", monospace; border-color: #e0e0d0; border-style: solid; border-width: 1px; font-size: 10pt; padding: 1em; } /* The following is for SilverCity syntax highlighting */ .code_default { FONT-FAMILY: "Andale Mono", "Bitstream Vera Sans Mono", monospace; FONT-SIZE: 10pt; } .c_character { color: olive; } .c_comment { color: green; font-style: italic; } .c_commentdoc { color: green; font-style: italic; } .c_commentdockeyword { color: navy; font-weight: bold; } .c_commentdockeyworderror { color: red; font-weight: bold; } .c_commentline { color: green; font-style: italic; } .c_commentlinedoc { color: green; font-style: italic; } .c_default { } .c_identifier { color: black; } .c_number { color: #009999; } .c_operator { color: black; } .c_preprocessor { color: navy; font-weight: bold; } .c_regex { color: olive; } .c_string { color: olive; } .c_stringeol { color: olive; } .c_uuid { color: olive; } .c_verbatim { color: olive; } .c_word { color: navy; font-weight: bold; } .c_word2 { color: navy; font-weight: bold; } .h_asp { color: #ffff00; } .h_aspat { color: #ffdf00; } .h_attribute { color: #008080; } .h_attributeunknown { color: #ff0000; } .h_cdata { color: #ffdf00; } .h_comment { color: #808000; } .h_default { } .h_doublestring { color: olive; } .h_entity { color: #800080; } .h_number { color: #009999; } .h_other { color: #800080; } .h_script { color: #000080; } .h_singlestring { color: olive; } .h_tag { color: #000080; } .h_tagend { color: #000080; } .h_tagunknown { color: #ff0000; } .h_xmlend { color: #0000ff; } .h_xmlstart { color: #0000ff; } .pl_array { color: black; } .pl_backticks { color: olive; } .pl_character { color: olive; } .pl_commentline { color: green; font-style: italic; } .pl_datasection { color: olive; } .pl_default { } .pl_error { color: red; font-weight: bold; } .pl_hash { color: black; } .pl_here_delim { color: olive; } .pl_here_q { color: olive; } .pl_here_qq { color: olive; } .pl_here_qx { color: olive; } .pl_identifier { color: black; } .pl_longquote { color: olive; } .pl_number { color: #009999; } .pl_operator { color: black; } .pl_pod { color: black; font-style: italic; } .pl_preprocessor { color: navy; font-weight: bold; } .pl_punctuation { color: black; } .pl_regex { color: olive; } .pl_regsubst { color: olive; } .pl_scalar { color: black; } .pl_string { color: olive; } .pl_string_q { color: olive; } .pl_string_qq { color: olive; } .pl_string_qr { color: olive; } .pl_string_qw { color: olive; } .pl_string_qx { color: olive; } .pl_symboltable { color: black; } .pl_word { color: navy; font-weight: bold; } .p_character { color: olive; } .p_classname { color: blue; font-weight: bold; } .p_commentblock { color: gray; font-style: italic; } .p_commentline { color: green; font-style: italic; } .p_default { } .p_defname { color: #009999; font-weight: bold; } .p_identifier { color: black; } .p_number { color: #009999; } .p_operator { color: black; } .p_string { color: olive; } .p_stringeol { color: olive; } .p_triple { color: olive; } .p_tripledouble { color: olive; } .p_word { color: navy; font-weight: bold; } .yaml_comment { color: #008800; font-style: italic; } .yaml_default { } .yaml_document { color: #808080; font-style: italic; } .yaml_identifier { color: navy; font-weight: bold; } .yaml_keyword { color: #880088; } .yaml_number { color: #880000; } .yaml_reference { color: #008888; } gamera-3.3.3/doc/src/deformations.txt0000644000076500000000000001447711755375755016572 0ustar chriswheel Deformations ============ ``degrade_kanungo`` ------------------- ``Image`` [OneBit] **degrade_kanungo** (float(0.00, 1.00) *eta*, float(0.00, 1.00) *a0*, float *a*, float(0.00, 1.00) *b0*, float *b*, int *k* = 2, int *random_seed* = 0) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Deformations :Defined in: deformation.py :Author: Christoph Dalitz Degrades an image due to a scheme proposed by Kanungo et al. (see the reference below). This is supposed to emulate image defects introduced through printing and scanning. The degradation scheme depends on six parameters *(eta,a0,a,b0,b,k)* with the following meaning: - each foreground pixel (black) is flipped with probability `a0*exp(-a*d^2) + eta`, where d is the distance to the closest background pixel - each background pixel (white) is flipped with probability `b0*exp(-b*d^2) + eta`, where d is the distance to the closest foreground pixel - eventuall a morphological closing operation is performed with a disk of diameter *k*. If you want to skip this step set *k=0*; in that case you should do your own smoothing afterwards. The random generator is initialized with *random_seed* for allowing reproducable results. References: T. Kanungo, R.M. Haralick, H.S. Baird, et al.: *A statistical, nonparametric methodology for document degradation model validation.* IEEE Transactions on Pattern Analysis and Machine Intelligence 22, pp. 1209-1223 (2000) ---------- **Example 1:** degrade_kanungo(0.0, 0.5, 0.5, 0.5, 0.5, 2, 0) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/degrade_kanungo_plugin_00.png :height: 99 :width: 69 ``ink_diffuse`` --------------- ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] **ink_diffuse** (``Choice`` [Linear Horizontal|Linear Vertical|Brownian] *diffusion_type*, float *exponential_decay_constant*, int *random_seed* = -1) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Returns: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Category: Deformations :Defined in: deformation.py :Author: Albert Brzeczko Simulates water-driven diffusion of ink in paper. ---------- **Example 1:** ink_diffuse(0, 20) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/ink_diffuse_plugin_00.png :height: 67 :width: 96 ``inkrub`` ---------- ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] **inkrub** (int(0, 500) *transcription_prob*, int *random_seed* = -1) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Returns: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Category: Deformations :Defined in: deformation.py :Author: Albert Brzeczko Simulates rubbing off of ink from another page. ---------- **Example 1:** inkrub(50) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/inkrub_plugin_00.png :height: 67 :width: 96 ``noise`` --------- ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] **noise** (int(0, 500) *amplitude*, ``Choice`` [Horizontal|Vertical] *direction*, int *random_seed* = -1) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Returns: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Category: Deformations :Defined in: deformation.py :Author: Albert Brzeczko Causes random shifting of pixels within a user-specified range, in a user-specified direction. ---------- **Example 1:** noise(10, 0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/noise_plugin_00.png :height: 129 :width: 237 ``wave`` -------- ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] **wave** (int(0, 2147483647) *amplitude*, int(0, 2147483647) *period*, ``Choice`` [Horizontal|Vertical] *direction*, ``Choice`` [Sinusoid|Square|Sawtooth|Triangle|Sinc] *waveform*, int *offset*, float *turbulence* = 0.00, int *random_seed* = -1) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Returns: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Category: Deformations :Defined in: deformation.py :Author: Albert Brzeczko Causes periodic disturbance of user-defined frequency, amplitude, and direction. Turbulence specifies the amount of random variation from that line. ---------- **Example 1:** wave(5, 10, 0, 0, 0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/wave_plugin_00.png :height: 134 :width: 227 **Example 2:** wave(10, 5, 1, 2, 0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/wave_plugin_01.png :height: 129 :width: 237 ``white_speckles`` ------------------ ``Image`` [OneBit] **white_speckles** (float(0.00, 1.00) *p*, int *n*, int *k* = 2, ``Choice`` [rook|bishop|king] *connectivity* = king, int *random_seed* = 0) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Deformations :Defined in: deformation.py :Author: Christoph Dalitz Adds white speckles to an image. This is supposed to emulate image defects introduced through printing, scanning and thresholding. The degradation scheme depends on three parameters *(p,n,k)* with the following meaning: - Each black pixel in the input image is taken with probability *p* as a starting point for a random walk of length *n*. Consequently *p* can be interpreted as the speckle frequency and *n* as a measure for the speckle size. - An image containing the random walk is smoothed by a closing operation with a rectangle of size *k*. - Eventually the image with the random walks is subtracted from the input image, which results in white speckles at the random walk positions Input arguments: *p, n, k*: speckle frequency, random walk length and closing disc size *connectivity*: effects the connectivity of adjacent random walk points as shown in the following figure (in case of bishop moves the final closing operation whitens the neighbouring 4-connected pixels too): .. image:: images/randomwalk_connectivity.png References: C. Dalitz, M. Droettboom, B. Pranzas, I. Fujinaga: *A Comparative Study of Staff Removal Algorithms.* IEEE Transactions on Pattern Analysis and Machine Intelligence 30, pp. 753-766 (2008) ---------- **Example 1:** white_speckles(0.05, 5, 2, 2, 0) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/white_speckles_plugin_00.png :height: 99 :width: 69 gamera-3.3.3/doc/src/dimension_types.txt0000644000076500000000000000246311216644537017266 0ustar chriswheel================= Dimension classes ================= This is a reference chapter for the various classes that manage coordinates, dimensions and bounding boxes. Point ----- .. docstring:: gamera.core Point :no_title: __init__ '''''''' **Point** (Int *x*, Int *y*) .. docstring:: gamera.core Point x y Size ---- .. docstring:: gamera.core Size :no_title: __init__ '''''''' **Size** (Int *width*, Int *height*) .. docstring:: gamera.core Size width height Dim --- .. docstring:: gamera.core Dim :no_title: __init__ '''''''' **Dim** (Int *ncols*, Int *nrows*) .. docstring:: gamera.core Dim ncols nrows Rect ---- .. docstring:: gamera.core Rect :no_title: Position and dimensions ''''''''''''''''''''''' .. docstring:: gamera.core Rect ul ul_x ul_y ur ur_x ur_y lr lr_x lr_y ll ll_x ll_y size nrows ncols width height offset_x offset_y Center '''''' .. docstring:: gamera.core Rect center center_x center_y Containment ''''''''''' .. docstring:: gamera.core Rect contains_x contains_y contains_point contains_rect Intersection '''''''''''' .. docstring:: gamera.core Rect intersects intersects_x intersects_y intersection Union ''''' .. docstring:: gamera.core Rect union union_rects Distance '''''''' .. docstring:: gamera.core Rect distance_euclid distance_bb distance_cx distance_cy gamera-3.3.3/doc/src/directory_heirarchy.txt0000644000076500000000000001623610714675724020126 0ustar chriswheel======================= The Directory Hierarchy ======================= The Gamera source tree looks something like this: +---------------------+----------------------------------------------------------------+ | ./ | Basic information files for building Gamera. | | +---------------+------------------------------------------------+ | | setup.py | A Python ``distutils``-based build script. | | | | See `building and installing Gamera`_. | +---------------------+---------------+------------------------------------------------+ | doc/ | Documentation for Gamera | | +---------------+------------------------------------------------+ | | gendoc.py | Script to generate documentation. | | | | (requires that docutils_ be installed) | | +---------------+------------------------------------------------+ | | src/ | Source files for the static documentation. | | | | These are written in the reStructuredText | | | | format used by docutils_. | | +---------------+------------------------------------------------+ | | html/ | The generated HTML documentation. | +---------------------+---------------+------------------------------------------------+ | gamera/ | All the files needed by Gamera at runtime. | | | Since Python is interpreted, this means | | | Python source files. | | +---------------+------------------------------------------------+ | | gui/ | Python source related to the GUI. These are | | | | optional. | | +---------------+------------------------------------------------+ | | plugins/ | Python source for plugins. This is mostly | | | | metadata that describes how to compile and run | | | | C++ plugins. See `Writing Gamera Plugins`_ | | | | for more info. | | +---------------+------------------------------------------------+ | | pixmaps/ | Images and icons used by the Gamera GUI. | | | | These PNG files are converted into Python | | | | source code (``gamera/gui/gamera_icons.py``) | | | | using the ``convert_images.py`` script. | +---------------------+---------------+------------------------------------------------+ | include/ | C++ header (``.hpp``) files. | | | Since the Gamera C++ code is so heavily | | | templatized, most of the code is here. | | +---------------+------------------------------------------------+ | | plugins/ | Source code for the C++-based plugins. | | +---------------+------------------------------------------------+ | | vigra/ | Code from the `VIGRA Computer Vision Library`_ | | | | used by Gamera. Gamera can use these methods | | | | directly thanks to the ``vigra_*.hpp`` headers.| +---------------------+---------------+------------------------------------------------+ | misc/ | Other miscellaneous files for information that | | | are not used directly by Gamera. | | +---------------+------------------------------------------------+ | | gamera.dtd | An XML DTD for Gamera's XML file format. | +---------------------+---------------+------------------------------------------------+ | src/ | Source code (that compiles directly to object | | | files.) | | +---------------+------------------------------------------------+ | | ga/ | GALib_: Matthew's Genetic Algorithm Library | | | | Used to optimize the kNN classifier. | | +---------------+------------------------------------------------+ | | graph/ | A graph library. API should be considered | | | | unstable. | | +---------------+------------------------------------------------+ | | libtiff/ | libtiff_: A library for reading/writting Tagged| | | | Image Format Files (otherwise known as *Tons of| | | | Incompatible File Formats*). Included for | | | | compiling convenience on MS-Windows and Mac | | | | OS-X. | +---------------------+---------------+------------------------------------------------+ | tests/ | Includes unit tests for running with the ``py.test`` framework.| | | These files are mainly useful only for the developers of | | | Gamera. | +---------------------+---------------+------------------------------------------------+ | migration_tools/ | Some tools to help migrate scripts from Gamera 2.x to Gamera | | | 3.x | | | | | | | +---------------------+---------------+------------------------------------------------+ | examples/ | Basic Gamera scripts to be used as starting points for end-user| | | applications. See the `script-writing documentation`_ for more| | | information | +---------------------+---------------+------------------------------------------------+ .. _building and installing Gamera: install.html .. _docutils: http://docutils.sf.net/ .. _Writing Gamera Plugins: writing_plugins.html .. _VIGRA Computer Vision Library: http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ .. _GALib: http://lancet.mit.edu/ga/ .. _libtiff: http://www.libtiff.org/ .. _script-writing documentation: script.html gamera-3.3.3/doc/src/displaying.txt0000644000076500000000000000273311755375755016233 0ustar chriswheel Displaying ========== ``display`` ----------- **display** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Displaying :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Displays the image in its own window. (See `Using the Gamera GUI`__). If the GUI process is not running, this method has no effect. .. __: gui.html .. image:: images/display.png ``display_ccs`` --------------- **display_ccs** () :Operates on: ``Image`` [OneBit] :Category: Displaying :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Displays the image in its own window. (See `Using the Gamera GUI`__). Each connected component is assigned to one of eight colors. This display can be used to see how connected component analysis performs on a given image. Uses color_ccs_ under the hood. .. __: gui.html .. _color_ccs: gui_support.html#color-ccs .. note: Connected component analysis must already be performed on the image (using cc_analysis_, for example) in order for this to work. .. _cc_analysis: segmentation.html#cc-analysis .. image:: images/display_ccs.png ``display_false_color`` ----------------------- **display_false_color** () :Operates on: ``Image`` [GreyScale|Float] :Category: Displaying :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Displays the image using false coloring. (See false_color_). .. _false_color: color.html#false-color .. image:: images/display_false_color.png gamera-3.3.3/doc/src/draw.txt0000644000076500000000000002505611755375755015030 0ustar chriswheel Draw ==== ``draw_bezier`` --------------- **draw_bezier** (``FloatPoint`` *start*, ``FloatPoint`` *c1*, ``FloatPoint`` *c2*, ``FloatPoint`` *end*, Pixel *value*, float *accuracy* = 0.10) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom Draws a cubic bezier curve Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a curve at (5, 5) will be in the upper left hand corner of the image. *start*: The start ``FloatPoint``. *c1*: The control point associated with the start point. *c2* The control point associated with the end point. *end* The end ``FloatPoint``. *value*: The pixel value to set for the curve. *accuracy* = ``0.1``: The rendering accuracy (in pixels) ---------- **Example 1:** draw_bezier .. image:: images/draw_bezier_plugin_00.png :height: 99 :width: 99 ``draw_circle`` --------------- **draw_circle** (``FloatPoint`` *c*, float *r*, Pixel *value*, float *thickness*, float *accuracy*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom with the help of Christoph Dalitz Draws a center centered at *c* with radius *r*. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a line at (5, 5) will be in the upper left hand corner of the image. *c*: The center of the circle *r*: The radius of the circle *value*: The pixel value to set for the line. *thickness* = 1.0: The thickness of the circle (in pixels) *accuracy* = 0.1: The accuracy of the circle drawing Based on the "approximating a circle with Bezier curves" approach. http://www.whizkidtech.redprince.net/bezier/circle/ ---------- **Example 1:** draw_circle .. image:: images/draw_circle_plugin_00.png :height: 99 :width: 99 ``draw_filled_rect`` -------------------- **draw_filled_rect** (``FloatPoint`` *ul*, ``FloatPoint`` *lr*, Pixel *value*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom Draws a filled rectangle. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a rectangle at (5, 5) will be in the upper left hand corner of the image. The coordinates can be specified either by four integers, two FloatPoints, or one Rect: **draw_filled_rect** (FloatPoint(*x1*, *y1*), FloatPoint(*x2*, *y2*), *value*) **draw_filled_rect** (Rect *rect*, *value*) ---------- **Example 1:** draw_filled_rect .. image:: images/draw_filled_rect_plugin_00.png :height: 99 :width: 99 ``draw_hollow_rect`` -------------------- **draw_hollow_rect** (``FloatPoint`` *ul*, ``FloatPoint`` *lr*, Pixel *value*, float *thickness*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom Draws a hollow rectangle. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a rectangle at (5, 5) will be in the upper left hand corner of the image. The coordinates can be specified either by two FloatPoints or one Rect: **draw_hollow_rect** (FloatPoint(*x1*, *y1*), FloatPoint(*x2*, *y2*), *value*, *thickness* = 1.0) **draw_hollow_rect** (Rect *rect*, *value*, *thickness* = 1.0) *value*: The pixel value to set for the lines. *thickness* = 1.0: The thickness of the outline ---------- **Example 1:** draw_hollow_rect .. image:: images/draw_hollow_rect_plugin_00.png :height: 99 :width: 99 ``draw_line`` ------------- **draw_line** (``FloatPoint`` *start*, ``FloatPoint`` *end*, Pixel *value*, float *thickness*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom and Christoph Dalitz Draws a straight line between two points. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a line at (5, 5) will be in the upper left hand corner of the image. *a*: The start ``FloatPoint``. *b*: The end ``FloatPoint``. *value*: The pixel value to set for the line. *thickness* = 1.0: The thickness of the line (in pixels) The implementation is based on the classic Bresenham algorithm, as described in J. E. Bresenham: *Algorithm for computer control of a digital plotter.* IBM Systems Journal 4, pp. 25-30 (1965). ---------- **Example 1:** draw_line .. image:: images/draw_line_plugin_00.png :height: 99 :width: 99 ``draw_marker`` --------------- **draw_marker** (``FloatPoint`` *location*, int *size* = 5, ``Choice`` [+|x|hollow_square|filled_square] *style* = +, Pixel *value*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom Draws a marker at a given point. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a marker at (5, 5) will be in the upper left hand corner of the image. *a* The position of the marker. *size* The size of the marker (number of pixels) *style* PLUS + (0) X + (1) HOLLOW_SQUARE (2) FILLED_SQUARE (3) *value* The pixel value to set for the line. ---------- **Example 1:** draw_marker .. image:: images/draw_marker_plugin_00.png :height: 99 :width: 99 ``draw_text`` ------------- **draw_text** (``FloatPoint`` *p*, str *text*, Pixel *color*, int(3, 512) *size* = 10, ``Choice`` [serif|sans-serif|monospace] *font_family*, ``bool`` *italic* = False, ``bool`` *bold* = False, ``Choice`` [left|center|right] *halign*) :Operates on: ``Image`` [OneBit|RGB] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom Draws text onto the image. The results are fairly primitive. The text is not anti-aliased, but should be adequate for marking up the image for debugging purposes. This function relies on wxPython for font rendering. Therefore, wxPython must be installed, and it must be runnable in the current environment, for example, a connection to a display or X server must be available. This may not be the case when running over a remote terminal, for example. *p* The position of the text. The *x* component will be either at the left, center, or right of the text, depending on the value of *halign*. The *y* component specifies the top of the text. *text* The string to be drawn on the image. If this is an 8-bit string the string should be encoded in the default encoding for your system. If a Unicode string, the text will be rendered using a Unicode font. This requires that your wxPython version is compiled with Unicode support. *color* The color of the text to be drawn. Note that there are some peculiarities for **ONEBIT** images: If *color* is zero, the text will be white. If non-zero, the text will be black. It is not possible to set different values for the text. *family* The font family to be used. For platform independence, this argument takes a general typeface style which will be mapped to an appropriate typeface on each platform. SERIF (0) SANS-SERIF (1) MONOSPACE (2) *size* = 10 The font size **in pixels** (i.e. not in "points") *italic* = ``False`` If ``True``, the text will be italic. *bold* = ``False`` If ``True``, the text will be bold. *halign* LEFT JUSTIFIED (0): The text is left-justified to the point *p*. CENTERED (1): The text is centered horizontally to the point *p*. RIGHT JUSTIFIED (2): The text is right-justified to the point *p*. ``fill`` -------- **fill** (Pixel *value*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Draw :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Fills the entire image with value. *value* A pixel value. This value may be any value the pixel type can support. ``fill_white`` -------------- **fill_white** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Category: Draw :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Fills the entire image with white. ``flood_fill`` -------------- **flood_fill** (``Point`` *start*, Pixel *color*) :Operates on: ``Image`` [GreyScale|Float|OneBit|RGB] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom Flood fills from the given point using the given color. This is similar to the "bucket" tool found in many paint programs. The coordinates can be specified either by two integers or one Point: *a*: The start ``Point``. *color*: The pixel value to set for the rectangle. ---------- **Example 1:** flood_fill((10, 58), 0) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/flood_fill_plugin_00.png :height: 99 :width: 69 ``highlight`` ------------- **highlight** (``Image`` [OneBit] *cc*, Pixel *color*) :Operates on: ``Image`` [RGB|GreyScale|OneBit] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom Highlights all pixels on an image in given color that are black in the passed connected component. The connected component can be part of a different image, it must however lie within the image region. *cc* A one-bit connected component from the image *color* An color value (RGBPixel, 0-255, or [0|1], depending on the image type) used to color the *cc*. ---------- **Example 1:** highlight .. image:: images/highlight_plugin_00.png :height: 99 :width: 69 ``invert`` ---------- **invert** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB] :Category: Draw :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Inverts the image. ---------- **Example 1:** invert() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/invert_plugin_00.png :height: 129 :width: 227 **Example 2:** invert() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/invert_plugin_01.png :height: 67 :width: 96 **Example 3:** invert() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/invert_plugin_02.png :height: 99 :width: 69 ``remove_border`` ----------------- **remove_border** () :Operates on: ``Image`` [OneBit] :Category: Draw :Defined in: draw.py :Author: Michael Droettboom This is a special case of the flood_fill algorithm that is designed to remove dark borders produced by photocopiers or flatbed scanners around the border of the image. gamera-3.3.3/doc/src/edge.txt0000644000076500000000000001172311755375755014773 0ustar chriswheel Edge ==== ``canny_edge_image`` -------------------- ``Image`` [GreyScale|Grey16|Float] **canny_edge_image** (float(0.00, 1e+300) *scale* = 0.80, float(0.00, 1e+300) *gradient_threshold* = 4.00) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [GreyScale|Grey16|Float] :Category: Edge :Defined in: edgedetect.py :Author: Ullrich Kĥthe (wrapped by Robert Ferguson) EXPERIMENTAL Detect and mark edges in an edge image using Canny's algorithm. Uses code from the VIGRA Computer Vision Library (Copyright 1998-2007 by Ullrich Kĥthe). *scale* The scale relates to the value b of the exponential filter. *gradient_threshold* This operator first calls cannyEdgelList() to generate an edgel list for the given image. Than it scans this list and selects edgels whose strength is above the given gradient_threshold. ---------- **Example 1:** canny_edge_image() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/canny_edge_image_plugin_00.png :height: 67 :width: 96 ``difference_of_exponential_crack_edge_image`` ---------------------------------------------- ``Image`` [GreyScale|Grey16|Float] **difference_of_exponential_crack_edge_image** (float(0.00, 1e+300) *scale* = 0.80, float(0.00, 1e+300) *gradient_threshold* = 4.00, int(0, 32000) *min_edge_length* = 0, ``bool`` *close_gaps* = False, ``bool`` *beautify* = False) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [GreyScale|Grey16|Float] :Category: Edge :Defined in: edgedetect.py :Author: Ullrich Kĥthe (wrapped by Robert Ferguson) EXPERIMENTAL Detect and mark edges in a crack edge image using the Shen/Castan zero-crossing detector. Uses code from the VIGRA Computer Vision Library (Copyright 1998-2007 by Ullrich Kĥthe). *scale* The scale relates to the value b of the exponential filter. *gradient_threshold* Whenever the gradient at a zero crossing is greater than the given gradient threshold, an edge point is marked in the destination image on the darker side of the zero crossing (the zero crossing occurs between pixels). *min_edge_length* Removes all edges shorter than the number of pixels specified (0 retains all edges). Values near 10 are suggested. *close_gaps* Close one pixel wide gaps. *beautify* See the VIGRA Docs. ---------- **Example 1:** difference_of_exponential_crack_edge_image() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/difference_of_exponential_crack_edge_image_plugin_00.png :height: 135 :width: 193 ``difference_of_exponential_edge_image`` ---------------------------------------- ``Image`` [GreyScale|Grey16|Float] **difference_of_exponential_edge_image** (float(0.00, 1e+300) *scale* = 0.80, float(0.00, 1e+300) *gradient_threshold* = 4.00, int(0, 32000) *min_edge_length* = 0) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [GreyScale|Grey16|Float] :Category: Edge :Defined in: edgedetect.py :Author: Ullrich Kĥthe (wrapped by Robert Ferguson) EXPERIMENTAL Detect and mark edges in an edge image using the Shen/Castan zero-crossing detector. Uses code from the VIGRA Computer Vision Library (Copyright 1998-2007 by Ullrich Kĥthe). *scale* The scale relates to the value b of the exponential filter. *gradient_threshold* Whenever the gradient at a zero crossing is greater than the given gradient_threshold, an edge point is marked in the destination image on the darker side of the zero crossing (the zero crossing occurs between pixels). *min_edge_length* Removes all edges shorter than the number of pixels specified (0 retains all edges). Values near 10 are suggested. ---------- **Example 1:** difference_of_exponential_edge_image() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/difference_of_exponential_edge_image_plugin_00.png :height: 67 :width: 96 ``labeled_region_edges`` ------------------------ ``Image`` [OneBit] **labeled_region_edges** (``bool`` *mark_both* = False) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB] :Returns: ``Image`` [OneBit] :Category: Edge :Defined in: edgedetect.py :Author: Christoph Dalitz Pixels with a label different from one of its neighboring pixels are marked black in the returned image. When *mark_both* is ``True``, both edges of the region border are marked, resulting in a two pixel wide edge. ``outline`` ----------- ``Image`` [OneBit] **outline** () :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Edge :Defined in: edgedetect.py :Author: Ullrich Kĥthe (wrapped by Robert Ferguson) Traces the outline of the image. This result is obtained by dilating the image and then XOR'ing the result with the original. ---------- **Example 1:** outline() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/outline_plugin_00.png :height: 99 :width: 69 gamera-3.3.3/doc/src/externallibraries.txt0000644000076500000000000000341611755375755017606 0ustar chriswheel ExternalLibraries ================= ``_from_raw_string`` -------------------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **_from_raw_string** (``Point`` *offset*, ``Dim`` *dim*, int *pixel_type*, int *storage_type*, object *data_string*) :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: ExternalLibraries :Defined in: string_io.py :Author: Alex Cobb Instantiates an image from binary data in a Python string. Requires a copying operation; may fail for very large images. This function is not intended to be used directly. To move data to/from Numeric/numarray/PIL, use the functions in numeric_io.py, numarray_io.py and pil_io.py respectively. ``_to_raw_string`` ------------------ object **_to_raw_string** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: object :Category: ExternalLibraries :Defined in: string_io.py :Author: Alex Cobb Returns the image's binary data as a Python string. Requires a copying operation; may fail for very large images. This function is not intended to be used directly. To move data to/from Numeric/numarray/PIL, use the functions in numeric_io.py, numarray_io.py and pil_io.py respectively. ``to_buffer`` ------------- **to_buffer** (object *Buffer*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: ExternalLibraries :Defined in: gui_support.py :Author: Michael Droettboom and Karl MacMillan Encodes the image into a 'buffer' required by wx.Image. (i.e. 8-bit RGB triplets). If you need to convert a gamera image *scaled_image* to a wx.Bitmap, you can do so as follows: .. code:: Python wximg = wx.EmptyImage(scaled_image.ncols, scaled_image.nrows) scaled_image.to_buffer(wximg.GetDataBuffer()) wxbmp = wx.BitmapFromImage(wximg) gamera-3.3.3/doc/src/features.txt0000644000076500000000000003560711755375755015714 0ustar chriswheel Features ======== ``area`` -------- ``FloatVector`` **area** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan The area of the bounding box (i.e. *nrows* * *ncols*). +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | | X | +-------+----------+--------+ ---------- **Example 1:** area() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [7000.0]) ``aspect_ratio`` ---------------- ``FloatVector`` **aspect_ratio** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan The aspect ratio of the bounding box (i.e. *ncols* / *nrows*). This feature is scale invariant. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ ---------- **Example 1:** aspect_ratio() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.69999999999999996]) ``black_area`` -------------- ``FloatVector`` **black_area** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan The simplest of all feature-generating functions, ``black_area`` simply returns the number of black pixels. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | X | X | +-------+----------+--------+ .. warning:: This feature is not scale invariant. ---------- **Example 1:** black_area() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [1518.0]) ``compactness`` --------------- ``FloatVector`` **compactness** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Compactness is the volume to surface ratio. Highly ornate connected components have a low compactness, whereas a perfect circle has a high compactness. The present implementation of this feature in Gamera does however not return the compactness, but its *inverse*, i.e. the surface to volume ratio. Since this function requires allocation and deallocation of memory, it is relatively slow. However, it has proven to be a very useful feature in many cases. This feature is not scale invariant, because, as the image is scaled by *a*, the surface increases proportional to *a* while the volume grows with *a^2*. This is currently not corrected for. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | X | X | +-------+----------+--------+ ---------- **Example 1:** compactness() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.52766798418972338]) ``moments`` ----------- ``FloatVector`` **moments** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Returns *moments* of the image. The first two elements of the returned ``FloatVector`` are the center of gravity on *x* and *y* axis normalized by width and height, respectively. The following seven entries are the *normalized central moments* (*u20,u02,u11,u30,u12,u21,u03*). For their definition, see Gonzalez, Woods: "Digital Image Processing", Prentice Hall, second edition (2002). +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | | +-------+----------+--------+ ---------- **Example 1:** moments() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.50158484657539482, 0.54566082431695084, 0.19879033815007144, 0.4166108441912556, -0.12548447613565852, 0.0062430763858119069, 0.10423298400666886, -0.049510290646450052, -0.079527650509540193]) ``ncols_feature`` ----------------- ``FloatVector`` **ncols_feature** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Simply the number of cols. As this feature is *not* scale invariant, it is helpful for distinguishing similar symbols of different size. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | | X | +-------+----------+--------+ ---------- **Example 1:** ncols_feature() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [70.0]) ``nholes`` ---------- ``FloatVector`` **nholes** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Computes for each row or column the average number of white runs not touching the border. From these values, the average over all rows and all columns is returned. The elements of the returned ``FloatVector`` are: 0. vertical 1. horizontal +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ ---------- **Example 1:** nholes() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [1.8857142857142857, 0.95999999999999996]) ``nholes_extended`` ------------------- ``FloatVector`` **nholes_extended** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Divides the image into four strips and then does a nholes_ analysis on each of those strips. This is first done vertically and then horizontally, resulting in a total of eight feature values. The elements of the returned ``FloatVector`` are: 0 - 3 vertical ``nholes`` for each of the strips in order left to right. 4 - 7 horizonal ``nholes`` for each of the strips in order top to bottom. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | | +-------+----------+--------+ ---------- **Example 1:** nholes_extended() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.17142857142857143, 2.5142857142857142, 2.7428571428571429, 1.8857142857142857, 0.0, 1.6000000000000001, 1.52, 0.71999999999999997]) ``nrows_feature`` ----------------- ``FloatVector`` **nrows_feature** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Simply the number of rows. As this feature is *not* scale invariant, it is helpful for distinguishing similar symbols of different size. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | | X | +-------+----------+--------+ ---------- **Example 1:** nrows_feature() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [100.0]) ``skeleton_features`` --------------------- ``FloatVector`` **skeleton_features** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Generates a number of features based on the skeleton of an image. First, the image in skeletonized using the Lee and Chen algorithm, which guarantees that the pixels of the resulting skeleton are never more than 4-connected. Then, this skeleton is analysed for a number of properties: 0. Number of X joints (4-connected pixels) 1. Number of T joints (3-connected pixels) 2. Average number of bend points (pixels which do not form a horizontal or vertical line with its neighbors) 3. Number of end points (1-connected pixels) 4. Number of *x*-axis crossings with respect to the *x*-axis through the center of mass 5. Number of *y*-axis crossings with respect to the *y*-axis through the center of mass +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ ---------- **Example 1:** skeleton_features() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [4.0, 15.0, 0.41726618705035973, 12.0, 4.0, 3.0]) ``top_bottom`` -------------- ``FloatVector`` **top_bottom** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Features useful only for segmentation-free analysis. Currently, the first feature is the first row containing a black pixel, and the second feature is the last row containing a black pixel. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ ---------- **Example 1:** top_bottom() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.0, 0.98999999999999999]) ``volume`` ---------- ``FloatVector`` **volume** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan The percentage of black pixels within the rectangular bounding box of the image. Result in range (0, 1]. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ ---------- **Example 1:** volume() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.21685714285714286]) ``volume16regions`` ------------------- ``FloatVector`` **volume16regions** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Divides the image into a 4 x 4 grid of 16 regions and calculates the volume within each. This feature is also known as "zoning" method. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | | +-------+----------+--------+ ---------- **Example 1:** volume16regions() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.0, 0.18588235294117647, 0.54823529411764704, 0.068235294117647061, 0.0, 0.21777777777777776, 0.051111111111111114, 0.43555555555555553, 0.084705882352941173, 0.46352941176470586, 0.47058823529411764, 0.32705882352941179, 0.34444444444444444, 0.18222222222222223, 0.035555555555555556, 0.077777777777777779]) ``volume64regions`` ------------------- ``FloatVector`` **volume64regions** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Divides the image into a 8 x 8 grid of 64 regions and calculates the volume within each. This feature is also known as "zoning" method. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | | +-------+----------+--------+ ---------- **Example 1:** volume64regions() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.0, 0.0, 0.0, 0.0096153846153846159, 0.25, 0.125, 0.0625, 0.0, 0.0, 0.0, 0.0092592592592592587, 0.65811965811965811, 0.79629629629629628, 0.94017094017094016, 0.21296296296296297, 0.0, 0.0, 0.0, 0.31481481481481483, 0.19658119658119658, 0.0, 0.18803418803418803, 0.70370370370370372, 0.15384615384615385, 0.0, 0.0, 0.12962962962962962, 0.23076923076923078, 0.0, 0.0085470085470085479, 0.7407407407407407, 0.18803418803418803, 0.072916666666666671, 0.0, 0.1875, 0.98076923076923073, 0.98958333333333337, 0.85576923076923073, 0.51041666666666663, 0.21153846153846154, 0.26851851851851855, 0.0, 0.56481481481481477, 0.13675213675213677, 0.1111111111111111, 0.034188034188034191, 0.42592592592592593, 0.18803418803418803, 0.42592592592592593, 0.0, 0.37962962962962965, 0.068376068376068383, 0.12037037037037036, 0.02564102564102564, 0.16666666666666666, 0.14529914529914531, 0.32407407407407407, 0.63247863247863245, 0.30555555555555558, 0.0, 0.0, 0.0, 0.0, 0.0]) ``zernike_moments`` ------------------- ``FloatVector`` **zernike_moments** () :Operates on: ``Image`` [OneBit] :Returns: ``FloatVector`` :Category: Features :Defined in: features.py :Author: Robert Butz and Christoph Dalitz Computes the absolute values of the Normalized Zernike Moments up to order six. Zernike moments are the scalar product in the complex L2 Hilbert space between the image and the complex Zernike polynomials. This results in complex values, the absolute values of which are invariant under image rotation and reflection. To make them additionally scale invariant, different normalization schemes have been suggested. The present implementation normalizes the Zernike moments by division with the zeroeth geometric moment *m00*, which results in an approximate scale invariance according to S. Belkasim, E. Hassan, T. Obeidi: "Explicit invariance of Cartesian Zernike moments." Pattern Recognition Letters 28, pp. 1969-1980 (2007) The return values are the absolute values of *A20, A22, A31, A33, A40, A42, A44, A51, A53, A54, A60, A62, A64, A66*. The moments *A00* and *A11* are not computed because these are constant under the used normalization scheme. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | X | X | +-------+----------+--------+ ---------- **Example 1:** zernike_moments() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('d', [0.35570221601513524, 0.37280502456098508, 1.0154466430308065, 0.49707336608131353, 3.5354492194795513, 1.5932916018819399, 0.62134170760164187, 3.7607115620084022, 2.300729879970445, 0.74561004912197015, 5.4393022425702435, 6.0908087847207506, 3.1377614772963267, 0.86987839064229866]) gamera-3.3.3/doc/src/file.txt0000644000076500000000000000610311755375755015002 0ustar chriswheel File ==== ``PNG_info`` ------------ object **PNG_info** (str *image_file_name*) :Returns: object :Category: File :Defined in: png_support.py :Author: Michael Droettboom and Albert Bzreckzo Returns an ``ImageInfo`` object describing a PNG file. *image_file_name* A PNG image filename ``load_PNG`` ------------ ``Image`` [OneBit|GreyScale|Grey16|RGB|Float] **load_PNG** (``FileOpen`` *image_file_name*, ``Choice`` [DENSE|RLE] *storage format*) :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float] :Category: File :Defined in: png_support.py :Author: Michael Droettboom and Albert Bzreckzo Loads a PNG format image file. *image_file_name* A PNG image filename *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression ``load_image`` -------------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **load_image** (``FileOpen`` *filename*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: File :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Load an image from the given filename. At present, TIFF and PNG files are supported. *storage_format* The type of `storage format`__ to use for the resulting image. .. __: image_types.html#storage-formats ``load_tiff`` ------------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float] **load_tiff** (``FileOpen`` *image_file_name*, ``Choice`` [DENSE|RLE] *storage format*) :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float] :Category: File :Defined in: tiff_support.py :Author: Michael Droettboom and Karl MacMillan Loads a TIFF file from disk. *image_file_name* A TIFF image filename *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression ``save_PNG`` ------------ **save_PNG** (``FileSave`` *image_file_name*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: File :Defined in: png_support.py :Author: Michael Droettboom and Albert Bzreckzo Saves the image to a PNG format file. ``save_image`` -------------- **save_image** (``FileSave`` *filename*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: File :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Saves an image to a file. The file type is automatically determined from the extension. ``save_tiff`` ------------- **save_tiff** (``FileSave`` *image_file_name*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB] :Category: File :Defined in: tiff_support.py :Author: Michael Droettboom and Karl MacMillan Saves an image to disk in TIFF format. *image_file_name* A TIFF image filename ``tiff_info`` ------------- object **tiff_info** (str *image_file_name*) :Returns: object :Category: File :Defined in: tiff_support.py :Author: Michael Droettboom and Karl MacMillan Returns an ``ImageInfo`` object describing a TIFF file. *image_file_name* A TIFF image filename gamera-3.3.3/doc/src/filter.txt0000644000076500000000000005175411755375756015365 0ustar chriswheel Filter ====== Convolution ----------- ``convolve`` ```````````` ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **convolve** (``Image`` [Float] *kernel*, ``Choice`` [avoid|clip|repeat|reflect|wrap] *border_treatment* = clip) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Filter/Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Convolves an image with a given kernel. Uses code from the Vigra library (Copyright 1998-2007 by Ullrich Kĥthe). *kernel* A kernel for the convolution. The kernel may either be a FloatImage or a nested Python list of floats. *border_treatment* Specifies how to treat the borders of the image. Must be one of the following: - BORDER_TREATMENT_AVOID (0) do not operate on a pixel where the kernel does not fit in the image - BORDER_TREATMENT_CLIP (1) clip kernel at image border. The kernel entries are renormalized so that the total kernel sum is not changed (this is only useful if the kernel is >= 0 everywhere). - BORDER_TREATMENT_REPEAT (2) repeat the nearest valid pixel - BORDER_TREATMENT_REFLECT (3) reflect image at last row/column - BORDER_TREATMENT_WRAP (4) wrap image around (periodic boundary conditions) Example usage: .. code:: Python # Using a custom kernel img2 = image.convolve([[0.125, 0.0, -0.125], [0.25 , 0.0, -0.25 ], [0.125, 0.0, -0.125]]) # Using one of the included kernel generators img2 = image.convolve(GaussianKernel(3.0)) ``convolve_x`` `````````````` ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **convolve_x** (``Image`` [Float] *kernel_x*, ``Choice`` [avoid|clip|repeat|reflect|wrap] *border_treatment* = clip) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Filter/Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Convolves an image in the X directions with a 1D kernel. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich Kĥthe). *kernel_x* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. It must consist of only a single row. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. ``convolve_xy`` ``````````````` ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **convolve_xy** (``Image`` [Float] *kernel_x*, ``Image`` [Float] *kernel_y*, ``Choice`` [avoid|clip|repeat|reflect|wrap] *border_treatment* = clip) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Filter/Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Convolves an image in both X and Y directions with 1D kernels. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich Kĥthe). *kernel_y* A kernel for the convolution in the *y* direction. The kernel may either be a FloatImage or a nested Python list of floats. *kernel_x* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. If *kernel_x* is omitted, *kernel_y* will be used in the *x* direction. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. ``convolve_y`` `````````````` ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **convolve_y** (``Image`` [Float] *kernel_y*, ``Choice`` [avoid|clip|repeat|reflect|wrap] *border_treatment* = clip) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Filter/Convolution :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Convolves an image in the X directions with a 1D kernel. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich Kĥthe). *kernel_y* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. It must consist of only a single row. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. ConvolutionKernels ------------------ ``AveragingKernel`` ``````````````````` ``Image`` [Float] **AveragingKernel** (int *radius* = 3) :Returns: ``Image`` [Float] :Category: Filter/ConvolutionKernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Creates an Averaging filter kernel for use with separable convolution. The window size is (2*radius+1) * (2*radius+1). *radius* The radius of the kernel. ``BinomialKernel`` `````````````````` ``Image`` [Float] **BinomialKernel** (int *radius* = 3) :Returns: ``Image`` [Float] :Category: Filter/ConvolutionKernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Creates a binomial filter kernel for use with separable convolution of a given radius. *radius* The radius of the kernel. ``GaussianDerivativeKernel`` ```````````````````````````` ``Image`` [Float] **GaussianDerivativeKernel** (float *standard_deviation* = 1.00, int *order* = 1) :Returns: ``Image`` [Float] :Category: Filter/ConvolutionKernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Init as a Gaussian derivative of order 'order'. The radius of the kernel is always 3*std_dev. *standard_deviation* The standard deviation of the Gaussian kernel. *order* The order of the Gaussian kernel. ``GaussianKernel`` `````````````````` ``Image`` [Float] **GaussianKernel** (float *standard_deviation* = 1.00) :Returns: ``Image`` [Float] :Category: Filter/ConvolutionKernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Init as a Gaussian function. The radius of the kernel is always 3*standard_deviation. *standard_deviation* The standard deviation of the Gaussian kernel. ``SimpleSharpeningKernel`` `````````````````````````` ``Image`` [Float] **SimpleSharpeningKernel** (float *sharpening_factor* = 0.50) :Returns: ``Image`` [Float] :Category: Filter/ConvolutionKernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Creates a kernel for simple sharpening. ``SymmetricGradientKernel`` ``````````````````````````` ``Image`` [Float] **SymmetricGradientKernel** () :Returns: ``Image`` [Float] :Category: Filter/ConvolutionKernels :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Init as a symmetric gradient filter of the form [ 0.5, 0.0, -0.5] ``create_gabor_filter`` ----------------------- ``Image`` [Float] **create_gabor_filter** (float *orientation* = 45.00, float *frequency* = 0.38, int *direction* = 5) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [Float] :Category: Filter :Defined in: misc_filters.py :Author: Ullrich Kĥthe (wrapped from VIGRA by Uma Kompella) Computes the convolution of an image with a two dimensional Gabor function. The result is returned as a float image. The *orientation* is given in radians, the other parameters are the center *frequency* (for example 0.375 or smaller) and the two angular and radial sigmas of the gabor filter. The energy of the filter is explicitly normalized to 1.0. ---------- **Example 1:** create_gabor_filter() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/create_gabor_filter_plugin_00.png :height: 67 :width: 96 ``gaussian_gradient`` --------------------- [object] **gaussian_gradient** (float *scale* = 0.50) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: [object] :Category: Filter :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Calculate the gradient vector by means of a 1st derivatives of Gaussian filter. *scale* Returns a tuple of (*x_gradient*, *y_gradient*). ---------- **Example 1:** gaussian_gradient(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 |gaussian_gradient_plugin_00_00| |gaussian_gradient_plugin_00_01| .. |gaussian_gradient_plugin_00_00| image:: images/gaussian_gradient_plugin_00_00.png :height: 67 :width: 96 .. |gaussian_gradient_plugin_00_01| image:: images/gaussian_gradient_plugin_00_01.png :height: 67 :width: 96 **Example 2:** gaussian_gradient(1.0) .. image:: images/RGB_generic.png :height: 129 :width: 227 |gaussian_gradient_plugin_01_00| |gaussian_gradient_plugin_01_01| .. |gaussian_gradient_plugin_01_00| image:: images/gaussian_gradient_plugin_01_00.png :height: 129 :width: 227 .. |gaussian_gradient_plugin_01_01| image:: images/gaussian_gradient_plugin_01_01.png :height: 129 :width: 227 **Example 3:** gaussian_gradient(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 |gaussian_gradient_plugin_02_00| |gaussian_gradient_plugin_02_01| .. |gaussian_gradient_plugin_02_00| image:: images/gaussian_gradient_plugin_02_00.png :height: 67 :width: 96 .. |gaussian_gradient_plugin_02_01| image:: images/gaussian_gradient_plugin_02_01.png :height: 67 :width: 96 ``gaussian_smoothing`` ---------------------- ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **gaussian_smoothing** (float *standard_deviation* = 1.00) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Filter :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Performs gaussian smoothing on an image. *standard_deviation* The standard deviation of the Gaussian kernel. ---------- **Example 1:** gaussian_smoothing(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/gaussian_smoothing_plugin_00.png :height: 67 :width: 96 **Example 2:** gaussian_smoothing(3.0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/gaussian_smoothing_plugin_01.png :height: 129 :width: 227 **Example 3:** gaussian_smoothing(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/gaussian_smoothing_plugin_02.png :height: 67 :width: 96 ``hessian_matrix_of_gaussian`` ------------------------------ [object] **hessian_matrix_of_gaussian** (float *scale* = 0.50) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: [object] :Category: Filter :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Filter image with the 2nd derivatives of the Gaussian at the given scale to get the Hessian matrix. *scale* ---------- **Example 1:** hessian_matrix_of_gaussian(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 |hessian_matrix_of_gaussian_plugin_00_00| |hessian_matrix_of_gaussian_plugin_00_01| |hessian_matrix_of_gaussian_plugin_00_02| .. |hessian_matrix_of_gaussian_plugin_00_00| image:: images/hessian_matrix_of_gaussian_plugin_00_00.png :height: 67 :width: 96 .. |hessian_matrix_of_gaussian_plugin_00_01| image:: images/hessian_matrix_of_gaussian_plugin_00_01.png :height: 67 :width: 96 .. |hessian_matrix_of_gaussian_plugin_00_02| image:: images/hessian_matrix_of_gaussian_plugin_00_02.png :height: 67 :width: 96 ``kfill`` --------- ``Image`` [OneBit] **kfill** (int *k* = 3, int *iterations* = 1) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Filter :Defined in: misc_filters.py :Author: Oliver Christen Removes salt and pepper noise in onebit images by applying the *kfill* filter *iterations* times. Should before *iteration* times a run of the kfill filter not change a single pixel, the iteration is stopped beforehand. In contrast to a rank or mean filter, kfill is designed in such a way that it does not merge non touching connected components. To this end, the border of the *k* times *k* mask is scanned for black pixels and the center is not filled when this would connect disjoint pixels on the border. A detailed description of the algorithm can be found in M. Seul, L. O'Gorman, M.J. Sammon: *Practical Algorithms for Image Analysis.* Cambridge University Press, 2000 The present implementation does not use code from the book, but has been written from scratch. ``kfill_modified`` ------------------ ``Image`` [OneBit] **kfill_modified** (int *k* = 3) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Filter :Defined in: misc_filters.py :Author: Oliver Christen Removes salt and pepper noise in onebit images by applying a modified version of the *kfill* filter proposed in the following reference: K.Chinnasarn, Y.Rangsanseri, P.Thitimajshima: *Removing Salt-and-Pepper Noise in Text/Graphics Images.* Proceedings of The Asia-Pacific Conference on Circuits and Systems (APCCAS'98), pp. 459-462, 1998 For *k* = 3, this algorithm is identical with the original kfill algorithm. For larger *k* however, it fills the window core also when not all pixels are of the same value. It should be noted that in this case, the modified version does *not* take care of connectivity. In other words, it can result in joining previously disconnected connected components, similar to a morphological closing operation, while at the same time small black speckles are removed. ``laplacian_of_gaussian`` ------------------------- ``Image`` [GreyScale|Grey16|Float] **laplacian_of_gaussian** (float *scale* = 0.50) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [GreyScale|Grey16|Float] :Category: Filter :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Filter image with the Laplacian of Gaussian operator at the given scale. *scale* ---------- **Example 1:** laplacian_of_gaussian(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/laplacian_of_gaussian_plugin_00.png :height: 67 :width: 96 ``mean`` -------- ``Image`` [OneBit|GreyScale|Grey16|Float] **mean** (int *k* = 3, ``Choice`` [padwhite|reflect] *border_treatment* = reflect) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float] :Returns: ``Image`` [OneBit|GreyScale|Grey16|Float] :Category: Filter :Defined in: misc_filters.py :Author: David Kolanus Within each *k* times *k* window, set the center pixel to the mean value of all pixels. *k* is the window size (must be odd), and *border_treatment* can be 0 ('padwhite'), which sets window pixels outside the image to white, or 1 ('reflect'), for reflecting boundary conditions. ---------- **Example 1:** mean() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/mean_plugin_00.png :height: 67 :width: 96 ``min_max_filter`` ------------------ ``Image`` [OneBit|GreyScale|Grey16|Float] **min_max_filter** (int *k* = 3, ``Choice`` [min|max] *filter* = min, int *k_vertical* = 0) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float] :Returns: ``Image`` [OneBit|GreyScale|Grey16|Float] :Category: Filter :Defined in: misc_filters.py :Author: David Kolanus Within each *k* times *k* window, set the center pixel to the minimum or maximum value of all pixels inside the window. *k* is the window size (must be odd) and *filter* is the filter type (0 for min, 1 for max). When *k_vertical* is nonzero, the vertical size of the window is set to *k_vertical* instead of *k*. This function does the same as *rank(1,k,border_treatment=1)*, but is much faster because the runtime of *min_max_filter* is constant in the window size. The same algorithm has been developed independently by van Herk and Gil and Werman. See M. van Herk: *A fast algorithm for local minimum and maximum filters on rectangular and octagonal kernels.* Pattern Recognition Letters 13, pp. 517-521, 1992 J. Gil, M. Werman: *Computing 2-D min, median, and max filters.* IEEE Transactions on Pattern Analysis and Machine Intelligence 15, pp. 504-507, 1993 ---------- **Example 1:** min_max_filter() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/min_max_filter_plugin_00.png :height: 67 :width: 96 ``rank`` -------- ``Image`` [OneBit|GreyScale|Grey16|Float] **rank** (int *rank*, int *k* = 3, ``Choice`` [padwhite|reflect] *border_treatment* = reflect) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float] :Returns: ``Image`` [OneBit|GreyScale|Grey16|Float] :Category: Filter :Defined in: misc_filters.py :Author: Christoph Dalitz and David Kolanus Within each *k* times *k* window, set the center pixel to the *r*-th ranked value. Note that for ``Onebit`` images, actually *rank(k*k - r + 1)* is computed instead of *rank(r)*. This has the effect that you do not need to worry whether your image is a greyscale or onebit image: in all cases low values for *r* will darken the image and high values will light it up. *rank* (1, 2, ..., *k* * *k*) The rank of the windows pixels to select for the center. (k*k+1)/2 is equivalent to the median. *k* (3, 5 ,7, ...) The window size (must be odd). *border_treatment* (0, 1) When 0 ('padwhite'), window pixels outside the image are set to white. When 1 ('reflect'), reflecting boundary conditions are used. ---------- **Example 1:** rank(2) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/rank_plugin_00.png :height: 67 :width: 96 **Example 2:** rank(5) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/rank_plugin_01.png :height: 67 :width: 96 **Example 3:** rank(8) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/rank_plugin_02.png :height: 67 :width: 96 ``simple_sharpen`` ------------------ ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **simple_sharpen** (float *sharpening_factor* = 0.50) :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Filter :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Perform simple sharpening. *sharpening_factor* The amount of sharpening to perform. ---------- **Example 1:** simple_sharpen(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/simple_sharpen_plugin_00.png :height: 67 :width: 96 **Example 2:** simple_sharpen(3.0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/simple_sharpen_plugin_01.png :height: 129 :width: 227 ``sobel_edge_detection`` ------------------------ ``Image`` [GreyScale|Grey16|Float|RGB|Complex] **sobel_edge_detection** () :Operates on: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Returns: ``Image`` [GreyScale|Grey16|Float|RGB|Complex] :Category: Filter :Defined in: convolution.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Performs simple Sobel edge detection on the image. ---------- **Example 1:** sobel_edge_detection(1.0) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/sobel_edge_detection_plugin_00.png :height: 67 :width: 96 **Example 2:** sobel_edge_detection(3.0) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/sobel_edge_detection_plugin_01.png :height: 129 :width: 227 ``wiener_filter`` ----------------- ``Image`` [GreyScale|Grey16|Float] **wiener_filter** (int *region size* = 5, float *noise variance* = -1.00) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [GreyScale|Grey16|Float] :Category: Filter :Defined in: binarization.py :Author: John Ashley Burgoyne and Ichiro Fujinaga Adaptive Wiener filter for de-noising. See: J. Lim. 2001. *Two-Dimensional Signal Processing.* Englewood Cliffs: Prentice Hall. *region_size* The size of the region within which to calculate the filter coefficients. *noise_variance* Variance of the noise in the image. If negative, estimated automatically as the median of local variances. ---------- **Example 1:** wiener_filter() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/wiener_filter_plugin_00.png :height: 67 :width: 96 **Example 2:** wiener_filter() .. image:: images/Grey16_generic.png :height: 71 :width: 82 .. image:: images/wiener_filter_plugin_01.png :height: 71 :width: 82 **Example 3:** wiener_filter() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/wiener_filter_plugin_02.png :height: 67 :width: 96 gamera-3.3.3/doc/src/gamera.core.ImageData.txt0000644000076500000000000000041711755375757020065 0ustar chriswheelclass ``ImageData`` =================== ``ImageData`` ------------- In module ``gamera.core`` .. docstring:: gamera.core ImageData :no_title: .. docstring:: gamera.core ImageData nrows ncols page_offset_x page_offset_y stride size bytes pixel_type storage_format gamera-3.3.3/doc/src/gamera.core.ImageInfo.txt0000644000076500000000000000035711755375757020112 0ustar chriswheelclass ``ImageInfo`` =================== ``ImageInfo`` ------------- In module ``gamera.core`` .. docstring:: gamera.core ImageInfo :no_title: .. docstring:: gamera.core ImageInfo x_resolution y_resolution ncols nrows depth ncolors gamera-3.3.3/doc/src/gamera.core.RGBPixel.txt0000644000076500000000000000043511755375757017665 0ustar chriswheelclass ``RGBPixel`` ================== ``RGBPixel`` ------------ In module ``gamera.core`` .. docstring:: gamera.core RGBPixel :no_title: .. docstring:: gamera.core RGBPixel red green blue hue saturation value cie_x cie_y cie_z cie_Lab_L cie_Lab_a cie_Lab_b cyan magenta yellow gamera-3.3.3/doc/src/geometry.txt0000644000076500000000000002223611755375756015724 0ustar chriswheel Geometry ======== ``convex_hull_as_image`` ------------------------ ``Image`` [OneBit] **convex_hull_as_image** (``bool`` *filled* = False) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Geometry :Defined in: geometry.py :Author: Christoph Dalitz Returns an image containing the polygon of the convex hull calculated by convex_hull_as_points_. .. _convex_hull_as_points: geometry.html#convex_hull_as_points ---------- **Example 1:** convex_hull_as_image() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/convex_hull_as_image_plugin_00.png :height: 99 :width: 69 ``convex_hull_as_points`` ------------------------- [object] **convex_hull_as_points** () :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Geometry :Defined in: geometry.py :Author: Christoph Dalitz Returns the vertex points of the convex hull of all black pixels in the given image. Actually not all black pixels are required for computing the convex hull, but only the left and right contour pixels of the image. This follows from the fact that, when a point is invisible both from the left and the right, it lies on the connection axis between two visible points and thus cannot be a vertex point of the convex hull. ``convex_hull_from_points`` --------------------------- [object] **convex_hull_from_points** ([object *points*]) :Returns: [object] :Category: Geometry :Defined in: geometry.py :Author: Christian Brandt, Christoph Dalitz, and David Kolanus Returns the polygon vertices of the convex hull of the given list of points. The function uses Graham's scan algorithm as described e.g. in Cormen et al.: *Introduction to Algorithms.* 2nd ed., MIT Press, p. 949, 2001 ``delaunay_from_points`` ------------------------ object **delaunay_from_points** ([object *points*], ``IntVector`` *labels*) :Returns: object :Category: Geometry :Defined in: geometry.py :Author: Oliver Christen (based on code by Olivier Devillers) Computes the Delaunay triangulation directly from a list of points and point labels. The result is a list which contains tuples of adjacent labels, where in each tuple the smaller label is given first. The arguments *points* and *labels* specify the points and nonnegative labels, such that ``labels[i]`` is the label of ``points[i]``. Note that the labels need not necessarily all be different, which can be useful for the computation of a neighborship graph from a set of connected components. The computation of the Delaunay triangulation is based on the Delaunay tree which is a randomized geometric data structure. It is described in O. Devillers, S. Meiser, M. Teillaud: `Fully dynamic Delaunay triangulation in logarithmic expected time per operation.`__ Computational Geometry: Theory and Applications 2, pp. 55-80, 1992. .. __: http://hal.inria.fr/inria-00090678 This can be useful for building a neighborhood graph as shown in the following example: .. code:: Python from gamera import graph from gamera.plugins.geometry import delaunay_from_points points = [(10,10),(20,30),(32,22),(85,14),(40,70),(80,85)] labels = range(len(points)) neighbors = delaunay_from_points(points, labels) g = graph.Graph(graph.UNDIRECTED) for pair in neighbors: g.add_edge(pair[0], pair[1]) ``labeled_region_neighbors`` ---------------------------- object **labeled_region_neighbors** (``bool`` *eight_connectivity* = True) :Operates on: ``Image`` [OneBit] :Returns: object :Category: Geometry :Defined in: geometry.py :Author: Christoph Dalitz For an image containing labeled regions, a list of all label pairs belonging to touching regions is returned. When *eight_connectivity* is ``True`` (default), 8-connectivity is used for neighborship, otherwise 4-connectivity is used. This can be useful for building a Delaunay graph from a Voronoi tesselation as in the following example: .. code:: Python # # build Delaunay graph of neighboring (i.e. adjacent) Cc's # # create map label->Cc for faster lookup later ccs = image.cc_analysis() label_to_cc = {} for c in ccs: label_to_cc[c.label] = c # compute area Voronoi tesselation and neighborship list voronoi = image.voronoi_from_labeled_image() labelpairs = voronoi.labeled_region_neighbors() # build map of all neighbors for each label for fast lookup neighbors = {} for label in label_to_cc.keys(): neighbors[label] = [] for n in labelpairs: neighbors[n[0]].append(n[1]) neighbors[n[1]].append(n[0]) # now, all neighbors to a given cc can be looked up with neighbors_of_cc = [label_to_cc[label] for label in neighbors[cc.label]] ``max_empty_rect`` ------------------ ``Rect`` **max_empty_rect** () :Operates on: ``Image`` [OneBit] :Returns: ``Rect`` :Category: Geometry :Defined in: geometry.py :Author: Daveed Vandevoorde and Christoph Dalitz Returns the maximum area empty rect that fits into the image without containing any of the black image pixels. This problem is in the literature generally known as the *Largest Empty Rectangle Problem*. When the image does not contain a white pixel at all, an exception of type ``RuntimeError`` is thrown. The coordinates of the returned rectangle are relative to the upper left corner of the image. Reference: D. Vandevoorde: `"The Maximal Rectangle Problem."`__ Dr. Dobb's, April 1998. .. __: http://www.drdobbs.com/database/184410529 ---------- **Example 1:** max_empty_rect |max_empty_rect_plugin_00_00| .. |max_empty_rect_plugin_00_00| image:: images/max_empty_rect_plugin_00_00.png :height: 90 :width: 90 ``voronoi_from_labeled_image`` ------------------------------ ``Image`` [OneBit|GreyScale] **voronoi_from_labeled_image** () :Operates on: ``Image`` [OneBit|GreyScale] :Returns: ``Image`` [OneBit|GreyScale] :Category: Geometry :Defined in: geometry.py :Author: Christoph Dalitz, based on code by Ullrich Kĥthe Computes the area Voronoi tesselation from an image containing labeled Cc's. In the returned onebit image, every pixel is labeled with the label value of the closest Cc in the input image. To prepare the input image, you can use cc_analysis__. When the Cc's only consist of single points, the area Voronoi tesselation is identical to the ordinary Voronoi tesselation. .. __: segmentation.html#cc-analysis The implementation applies a watershed algorithm to the distance transform of the input image, a method known as *seeded region growing* (U. Kĥthe: *Primary Image Segmentation.* Proceedings 17th DAGM-Symposium, pp. 554-561, Springer, 1995). The example shown below is the image *voronoi_cells* as created with the the following code: .. code:: Python # create an area Voronoi tesselation and # mark the cells and their edges in color ccs = image.cc_analysis() # labels the image voronoi = image.voronoi_from_labeled_image() voronoi_cells = voronoi.color_ccs() voronoi_cells.highlight(image, RGBPixel(0,0,0)) voronoi_edges = voronoi.labeled_region_edges() voronoi_cells.highlight(voronoi_edges, RGBPixel(255,255,255)) ---------- **Example 1:** voronoi_from_labeled_image |voronoi_from_labeled_image_plugin_00_00| |voronoi_from_labeled_image_plugin_00_01| .. |voronoi_from_labeled_image_plugin_00_00| image:: images/voronoi_from_labeled_image_plugin_00_00.png :height: 99 :width: 69 .. |voronoi_from_labeled_image_plugin_00_01| image:: images/voronoi_from_labeled_image_plugin_00_01.png :height: 99 :width: 69 ``voronoi_from_points`` ----------------------- **voronoi_from_points** ([object *points*], ``IntVector`` *labels*) :Operates on: ``Image`` [OneBit|GreyScale] :Category: Geometry :Defined in: geometry.py :Author: Christoph Dalitz Computes the Voronoi tesselation from a list of points and point labels. The result is directly written to the input image. Each white pixel is labeled with the label value of the closest point. Non white pixel in the input image are not overwritten. The arguments *points* and *labels* specify the points and labels, such that ``labels[i]`` is the label of ``points[i]``. Note that the labels need not necessarily all be different, which can be useful as an approximation of an area Voronoi tesselation. The algorithm is very simple: it stores the points in a `kd-tree`_ and then looks up the closest point for each image pixel. This has a runtime of *O(N log(n))*, where *N* is the number of image pixels and *n* is the number of points. For not too many points, this should be faster than the morphological region growing approach of `voronoi_from_labeled_image`_. .. _`kd-tree`: kdtree.html .. _`voronoi_from_labeled_image`: #voronoi-from-labeled-image The example shown below is the image *voronoi_edges* as created with the the following code: .. code:: Python # create a Voronoi tesselation and mark # the cell edges in a second image points = [(10,10),(20,30),(32,22),(85,14),(40,70),(80,85)] voronoi = Image((0,0),(90,90)) voronoi.voronoi_from_points(points,[i+2 for i in range(len(points))]) voronoi_edges = voronoi.labeled_region_edges() for p in points: voronoi_edges.set(p,1) ---------- **Example 1:** voronoi_from_points |voronoi_from_points_plugin_00_00| .. |voronoi_from_points_plugin_00_00| image:: images/voronoi_from_points_plugin_00_00.png :height: 90 :width: 90 gamera-3.3.3/doc/src/graph.txt0000644000076500000000000003075411712302465015152 0ustar chriswheel==================== Gamera graph library ==================== Introduction ------------ Gamera provides a rudimentary framework for dealing with graph structures. This library can be used from Python and from C++. This chapter assumes a basic understanding of graph theory and graph algorithms. While this document describes the API, it does not describe in detail how the algorithms work. (Hopefully this can be added in a future release of this documentation.) Using the graph library from Python ----------------------------------- Most operations on graphs in the Gamera graph library are methods on ``Graph`` objects. Each node is identified by an arbitrary Python value. **Importantly, the same value may not be assigned to more than one node within the same graph**. Whenever a node is needed as an argument, either the node object or the node's value may be passed in. In most cases, it is more convenient to refer to nodes by their associated values rather than keeping track of their associated ``Node`` objects. The following example code covers basic usage. For more detailed descriptions of the properties and methods, see the Reference_ section. Let's look at some simple code to create the following trivially small graph structure: .. image:: images/graph_example.png .. code:: Python >>> from gamera import graph >>> from gamera import graph_util >>> >>> g = graph.Graph() >>> >>> g.add_edge('a', 'b') 1 >>> g.add_edge('a', 'c') 1 >>> g.add_edge('a', 'd') 1 >>> g.add_edge('b', 'd') 1 >>> g.add_edge('c', 'e') 1 >>> g.add_edge('f', 'g') 1 >>> g.add_edge('f', 'g') 1 >>> g.add_edge('e', 'e') 1 >>> ``add_edge`` creates nodes that don't already exist, so ``add_node`` is not necessary to create this graph. The number of nodes and edges can be queried: .. code:: Python >>> g.nnodes # Number of nodes 7 >>> g.nedges # Number of edges 8 Now, the graph can be traversed, using either a breadth-first search (BFS) or depth-first search (DFS). Each search algorithm takes a node as a starting point: .. code:: Python >>> # node is a Node instance. Call node() to get its value >>> for node in g.BFS('a'): ... print node(), ... a b c d e >>> for node in g.DFS('a'): ... print node(), ... a d c e b >>> # No other nodes reachable from 'e' >>> for node in g.BFS('e'): ... print node(), ... e >>> for node in g.BFS('f'): ... print node(), ... f g Note that the search algorithms, like many other things in the Gamera graph library, return lazy iterators, so the results are determined on demand. Importantly, this means you can not get the length of the result until it has been entirely evaluated. .. code:: Python >>> g.BFS('a') >>> len(g.BFS('a')) Traceback (most recent call last): File "", line 1, in ? TypeError: len() of unsized object >>> list(g.BFS('a')) [, , , , ] >>> [node() for node in g.BFS('a')] ['a', 'b', 'c', 'd', 'e'] >>> Note that this graph is composed of two distinct subgraphs. There are ways to determine the number of subgraphs and iterate over the roots of those subgraphs if the graph is undirected. For instance, to do a breadth-first search of all subgraphs: .. code:: Python >>> g.make_undirected() >>> g.nsubgraphs 2 >>> for root in g.get_subgraph_roots(): ... for node in g.BFS(root): ... print node.data, ... print ... a b c d e f g The graph can be restricted based on a number of different properties by passing flags to the constructor. These properties include directedness, cyclicalness, multi-connectedness and self-connectedness. (See `Graph constructor`_). For instance, let's attempt to make a *tree*, which is a graph that is undirected and contains no cycles, using the same graph structure: .. code:: Python >>> g = graph.Graph(graph.TREE | graph.CHECK_ON_INSERT) >>> g.add_edge('a', 'b') 1 >>> g.add_edge('a', 'c') 1 >>> g.add_edge('a', 'd') 1 >>> g.add_edge('b', 'd') 0 >>> g.add_edge('c', 'e') 1 >>> g.add_edge('f', 'g') 1 >>> g.add_edge('f', 'g') 0 >>> g.add_edge('e', 'e') 0 Note that some edges were not created, since they would have violated the restrictions of a tree. This is indicated by the return value of ``add_edge``. In this case, our graph now looks like this: .. image:: images/graph_example2.png The reference section below provides a complete list of the algorithms and methods on graph objects. Reference --------- ``Graph`` objects ''''''''''''''''' Each graph is represented by instances of the ``Graph`` class. All modifications to the graph structure, including adding and removing nodes and edges, is performed through this class. Basic methods ````````````` ``Graph`` Constructor """"""""""""""""""""" .. docstring:: gamera.graph Graph Methods for Nodes """"""""""""""""" .. docstring:: gamera.graph Graph add_node add_nodes get_node get_nodes has_node remove_node remove_node_and_edges Methods for Edges """"""""""""""""" .. docstring:: gamera.graph Graph add_edge add_edges get_edges has_edge remove_edge remove_all_edges Directedness """""""""""" .. docstring:: gamera.graph Graph is_directed is_undirected make_directed make_undirected Cyclicalness """""""""""" .. docstring:: gamera.graph Graph is_cyclic is_acyclic make_cyclic make_acyclic Blob vs. Tree """"""""""""" .. docstring:: gamera.graph Graph is_tree is_blob make_tree make_blob Multi-connectedness """"""""""""""""""" .. docstring:: gamera.graph Graph is_multi_connected is_singly_connected make_multi_connected make_singly_connected Self-connectedness """""""""""""""""" .. docstring:: gamera.graph Graph is_self_connected make_self_connected make_not_self_connected Subgraphs """"""""" Here, a "subgraph" is defined as a connected group of nodes. A graph contains multiple subgraphs when the graph does not have a single root node from which all other nodes can be reached. .. docstring:: gamera.graph Graph get_subgraph_roots size_of_subgraph is_fully_connected Utility """"""" .. docstring:: gamera.graph Graph copy has_flag has_path Properties `````````` - *nnodes*: The number of nodes in the graph. - *nedges*: The number of edges in the graph. - *nsubgraphs*: The number of subgraphs. High-level algorithms ````````````````````` Search """""" .. docstring:: gamera.graph Graph BFS DFS Shortest path """"""""""""" .. docstring:: gamera.graph Graph dijkstra_shortest_path shortest_path dijkstra_all_pairs_shortest_path all_pairs_shortest_path Spanning trees """""""""""""" .. docstring:: gamera.graph Graph create_spanning_tree create_minimum_spanning_tree Partitions """""""""" .. docstring:: gamera.graph Graph optimize_partitions Coloration """""""""""" .. docstring:: gamera.graph Graph colorize get_color Node objects '''''''''''' Nodes contain a reference to an arbitrary Python value. Importantly, the value is used to identify the node, so the same value may not be assigned to more than one node. In many cases, it is much more convenient to refer to nodes by their associated values rather than keeping track of their associated ``Node`` objects. Properties `````````` - *data*: The value that identifies this node. (This value can also be obtained by "calling" the node as in ``node()``). - *edges*: A lazy iterator over the edges pointing out from the node. - *nodes*: A lazy iterator over the nodes that can be reached directly (through a single edge) from this node. - *nedges*: The number of edges going out from this node. Edge objects '''''''''''' Methods ``````` traverse """""""" **traverse** (*node*) Returns the node on the other end of the edge. (Useful only for undirected graphs). Properties `````````` - *from_node*: The starting node of this edge. - *to_node*: The ending node of this edge. - *cost*: The cost associated with traversing this edge (used by algorithms such as create_minimum_spanning_tree_). - *label*: The label associated with this edge. Utilities ''''''''' The following functions are available in the ``graph_util`` module. .. docstring:: gamera.graph_util graphviz_output Implementation details ---------------------- There are many ways to represent graphs in memory for different applications. Unfortunately, this library only uses one, which may not be suitable for all applications. It is as follows: - The graph object contains lists of all nodes and edges. Deleting nodes and edges is in linear time. - The graph contains a hash table from node data to nodes, so given a particular piece of data associated with a node, the node can be looked up in O(ln *n*) time. - Each node contains an array of coincident edges. If the graph is directed, this includes edges going in and out from the node. Using the Graph library from C++ -------------------------------- The module ``gamera.graph`` is only a thin Python wrapper around a C++ class ``Graph``. This can also be used directly in C++ plugins. Compilation and linkage ''''''''''''''''''''''' The header file *graph.hpp* declares the necessary structures in the namespace ``Gamera::Graph``. It is installed with the other gamera header files, and can thus be included with .. code:: CPP #include "graph/graph.hpp" using namespace Gamera::Graph; The tricky part is getting your plugin module to be linked with the actual graph implementation. This is achieved by adding the source files to the ``cpp_sources`` property in the plugin Python interface. In the gamera core code, the following works: .. code:: Python class ExampleModule(PluginModule): category = "MyPlugins" cpp_headers = ["myplugins.hpp"] import glob cpp_sources = glob.glob("src/graph/*.cpp") functions = [myplugin1, myplugin2] module = ExampleModule() In a toolkit, this will not work, because the path names in the ``cpp_sources`` property are relative to the location of the *setup.py* script. To allow for the use of the Graph C++ class in toolkits, the source files are installed together with Gamera. You can thus specify this file in ``cpp_sources`` as follows: .. code:: Python class ExampleModule(PluginModule): # ... import os, gamera gamera_root = os.path.dirname(gamera.__file__) import glob cpp_sources = (glob.glob(os.path.join(gamera_root, "src/graph/*.cpp"))) # ... Querying the Gamera installation directory through the *__file__* property of the gamera module is safer than using *get_python_lib()* from ``distutils.sysconfig``, because it also works when Gamera is not installed into the standard location for python extensions. Usage ''''' Most methods are similar to them in the Python wrapper. For a detailed description you can see more details in the implementation and header files of Graph. A node is designed for storing a class derived from GraphData. Be sure storing your GraphData objects as long as your Graph lives. GraphData defines the virtual methods which must be implemented in your derived class. - **virtual GraphData* copy** () copies a given Data element. Note that this will *not* be deleted automatically. - **virtual int compare** (*const GraphData& b*) returns 0 if b and \*this are equal returns <0 if \*this < b returns >0 if \*this > b The comparison operators < > == != <= >= are mapped to this method. You can see some examples for derived classes in ``graphdataderived.hpp`` Example ''''''' Here is a very short example for a C++-Usage: .. code:: CPP #include "graph/graph.hpp" void test() { Graph* g = new Graph(FLAG_UNDIRECTED); GraphDataUnsignedInt* data1 = new GraphDataUnsignedInt(42); GraphDataUnsignedInt* data2 = new GraphDataUnsignedInt(21); g->add_node(data1); g->add_node(data2); g->add_edge(data1, data2, 2.0); delete g; delete data1; delete data2; } Iterators ''''''''' Many methods use lazy iterators as their return value. Here is a small example on handling iterators in C++. .. code:: CPP Graph* g = new Graph(); // add nodes and edges to g ... DFSIterator* it = g->DFS(); //iterator is allocated on heap Node *n; while((n = it->next()) != NULL) { // next() returns NULL when there are no more elements // You can do something with node n, but do not add or remove // nodes to the graph because this would invalidate the iterator. } delete it; //iterator must be deleted after usage gamera-3.3.3/doc/src/gui.txt0000644000076500000000000007451610777671467014666 0ustar chriswheel============== The Gamera GUI ============== Starting the GUI ---------------- There is a ``gamera_gui`` script installed somewhere on your system (platform-specific, see `Building and Installing Gamera`__). Run it to start the Gamera GUI. .. __: install.html .. note:: It is possible to run Gamera image processing without the GUI, saving the memory and runtime overhead. Console window -------------- .. image:: images/console.png The main Gamera console window is divided into three parts: the Python console, the icon display and the information pane. Python console `````````````` On the right is a standard Python console. You can type code here and it is run interactively. Most operations that you perform using the mouse in the GUI will generate code that is entered in the interpreter here. This code and be copied-and-pasted into your favorite programmer's editor to build Gamera image processing scripts. The Python console features auto-completion. For example, load an image and store it in the variable name ``image``. Type ``image.`` in the console, and a window will appear showing all of the (many) members and methods of the image. .. image:: images/autocompletion.png Icon display ```````````` On the left, all active image objects (displayed as icons. When you load images, they are displayed here. The icon indicates the pixel type of the image. See `Image types`__ for more information on the different image types in Gamera. A magnifying glass appears over the icon if the image is a subimage of another image. It acts as a warning that any changes made to this image will affect another. .. __: image_types.html The icons are as follows: +------------------+---------------------+-----------------------+ | Image | SubImage | Description | +==================+=====================+=======================+ | |RGBImage| | |RGBSubImage| | RGB (24-bit color) | +------------------+---------------------+-----------------------+ | |GREYSCALEImage| | |GREYSCALESubImage| | GreyScale (8-bit) | +------------------+---------------------+-----------------------+ | |GREY16Image| | |GREY16SubImage| | Grey16 (16-bit) | +------------------+---------------------+-----------------------+ | |FLOATImage| | |FLOATSubImage| | Floating-point image | +------------------+---------------------+-----------------------+ | |ONEBITImage| | |ONEBITSubImage| | One-bit (binary) | +------------------+---------------------+-----------------------+ .. |RGBImage| image:: images/icon_image_rgb.png .. |GREYSCALEImage| image:: images/icon_image_grey.png .. |GREY16Image| image:: images/icon_image_grey16.png .. |FLOATImage| image:: images/icon_image_float.png .. |ONEBITImage| image:: images/icon_image_binary.png .. |RGBSubImage| image:: images/icon_subimage_rgb.png .. |GREYSCALESubImage| image:: images/icon_subimage_grey.png .. |GREY16SubImage| image:: images/icon_subimage_grey16.png .. |FLOATSubImage| image:: images/icon_subimage_float.png .. |ONEBITSubImage| image:: images/icon_subimage_binary.png There are other things that can appear in the icon display as well: +------------------+------------------------------------------+ | |ImageList| | A list of images | +------------------+------------------------------------------+ | |Cc| | A connected component | +------------------+------------------------------------------+ | |Classifier| | A classifier object | +------------------+------------------------------------------+ | |NonClassifier| | A non-interactive classifier object | +------------------+------------------------------------------+ .. |ImageList| image:: images/icon_image_list.png .. |Cc| image:: images/icon_cc.png .. |Classifier| image:: images/icon_classify.png .. |NonClassifier| image:: images/icon_noninter_classify.png Context menu '''''''''''' Right-clicking on any of these icons brings up a context menu to perform operations on an image. .. image:: images/right_click_menu.png At the top of the menu, the pixel type is displayeimage_api.htmld. The next two items are for creating new references and copies of the image. You will be prompted for a variable name for the result. The **Info** submenu displays basic information about the image. The rest of the context menu contains plugin methods, sorted by category. The plugin methods are documented here__. Many of the plugin methods require arguments. In that case, a dialog will be displayed. This dialog includes a brief description of the method, if available. For example the dialog for ``erode_dilate`` is: .. image:: images/erode_dilate_dialog.png After entering the arguments for a plugin function, code is generated to perform the operation and automatically run in the console: .. code:: Python >>>image.erode_dilate(5, 0, 1) .. __: plugins.html Information pane ```````````````` The information pane includes three modes, selectable via the tabs. (These tabs will appear at the top of the information pane on Windows and Mac OSX). This functionality is adapted from the PyCrust_ project and should be familiar to users of that tool. .. _PyCrust: http://sourceforge.net/projects/pycrust/ Documentation ''''''''''''' The documentation pane displays the docstring of the object that was last typed in the console window. For an example, type "Image(" in the console, and the docstring for the Image constructor will be displayed. Namespace ''''''''' This is a "namespace browser" which displays the objects in the namespace of the console in a tree like view. For an example, type ``x = 5`` in the console, and then find the variable ``x`` in the locals part of the namespace tree. History ''''''' History contains a command history that can be copied-and-pasted into an editor to develop scripts. Console menu ```````````` File menu ''''''''' **Open...** Open an image. **Exit** Exit Gamera. Classify menu ''''''''''''' **Interactive Classifier** Create a new `Interactive Classifier window`_. Toolkits '''''''' See `Writing toolkits`__ for more information. .. __: writing_toolkits.html Image display ------------- Double-clicking on the image icon will display the image in its own window. Alternatively, you can use the ``display`` method: .. code:: Python >>>image.display() .. image:: images/display.png Rectangular regions of the image can be selected by clicking and dragging a bounding box on the image itself. The selection can be modified by dragging the drag boxes in the corners of the selection. Right-clicking on the image brings up the same `context menu`_ as in the `icon display`_. The image display toolbar has the following buttons: +-----------------+--------------------------------------------------------------+ | |Refresh| | Force a refresh of the display, in case any change has | | | occurred to the image. | +-----------------+--------------------------------------------------------------+ | |ZoomIn| | Zoom in. | +-----------------+--------------------------------------------------------------+ | |ZoomNorm| | Actual size. | +-----------------+--------------------------------------------------------------+ | |ZoomIn| | Zoom out. | +-----------------+--------------------------------------------------------------+ | |ZoomHighlight| | Zoom so that the highlighted region is fit to the window | | | as closely as possible. | +-----------------+--------------------------------------------------------------+ | Zoom quality | low quality | | | no interpolation | | | medium quality | | | linear interpolation | | | high quality | | | spline interpolation | +-----------------+--------------------------------------------------------------+ | |NewReference| | Create a new subimage from the currently selected area (or | | | the entire image if there is no selection.) | +-----------------+--------------------------------------------------------------+ | |NewCopy| | Create a new copy of the currently selected area of the image| | | (or the entire image if there is no selection.) | +-----------------+--------------------------------------------------------------+ | |Save| | Saves the image to a file. | +-----------------+--------------------------------------------------------------+ | |Print| | Prints the image. | +-----------------+--------------------------------------------------------------+ .. |Refresh| image:: images/icon_refresh.png .. |ZoomIn| image:: images/icon_zoom_in.png .. |ZoomNorm| image:: images/icon_zoom_norm.png .. |ZoomOut| image:: images/icon_zoom_out.png .. |ZoomHighlight| image:: images/icon_zoom_view.png .. |NewReference| image:: images/icon_make_view.png .. |NewCopy| image:: images/icon_image_copy.png .. |Save| image:: images/icon_save.png .. |Print| image:: images/icon_printer.png .. note:: On Linux and OS-X, the Print command works by printing to a PostScript file and then sends the result to ``lpr``. Because of this, it can not properly detect the resolution of the printer. Therefore, a reasonable default of 720dpi is used. Future versions of wxPython may handle this better. Multiple image display ---------------------- Double-clicking on a list of images in the icon display brings up the **multi-image display** window. Alternatively, you can use the ``display_multi`` function: .. code:: Python >>>display_multi(list_of_images) Images are displayed in a grid. By default, the images are sorted so the grid takes up a minimum amount of total space. .. image:: images/multi_display.png Images can be selected by clicking on a cell in the grid. Individual cells can be added to the selection by **Ctrl** clicking. Ranges of cells can be selected by **Shift** clicking. The `context menu`_ can be used to perform operations on multiple images. Right-clicking on a selected image brings up the context menu. The multi-display toolbar has the following items: +-----------------+--------------------------------------------------------------+ | |Refresh| | Force a refresh of the display, in case any change has | | | occurred to the image. | +-----------------+--------------------------------------------------------------+ | |ZoomIn| | Zoom in. | +-----------------+--------------------------------------------------------------+ | |ZoomNorm| | Actual size. | +-----------------+--------------------------------------------------------------+ | |ZoomIn| | Zoom out. | +-----------------+--------------------------------------------------------------+ | |Label| | Displays a value within each cell. The value is determined by| | | the expression in the drop-down text box to the left of | | | the label button. | | | Within the context of the expression, `x` represents the | | | image within each cell, and the expression is evaluated to | | | determine the result to display. | +-----------------+--------------------------------------------------------------+ | |SortA| |SortD| | Sorts the images in the grid based on a given property. The | | | property is determined by the expression in the drop-down | | | text box to the left of the sort buttons. | +-----------------+--------------------------------------------------------------+ | |Select| | Selects the image in the grid based on a given criteria. | | | The criteria is determined by the expression in the drop-down| | | text box to the left of the select button. | | | Within the context of the expression, `x` represents the | | | image within each cell. When the expression evaluates to | | | ``True``, the image will be selected. | +-----------------+--------------------------------------------------------------+ | |SelectAll| | Selects all images. | +-----------------+--------------------------------------------------------------+ .. |Label| image:: images/icon_show_name.png .. |SortA| image:: images/icon_sort_asc.png .. |SortD| image:: images/icon_sort_dec.png .. |Select| image:: images/icon_select.png .. |SelectAll| image:: images/icon_select_all.png Interactive classifier window ----------------------------- The interactive classifier window is the most involved part of the Gamera GUI. It is where you can train the Gamera classifier to recognize different symbol types. .. image:: images/classifier_window.png A tutorial introduction to training image data is given in the `training tutorial`__. .. __: training_tutorial.html Concepts ```````` Before the parts of the classifier window are discussed, some general concepts should be understood. Glyph collections ''''''''''''''''' In the classifier window, there are two sets of glyphs (connected components) involved: one in the classifier and one for the current page: Classifier glyphs The set of glyphs used by the classifier to make guesses about unknown glyphs. The classifier glyphs work "behind the scenes". Page glyphs The set of glyphs on the current page. When glyphs on the page are classified by the user, they are copied into the classifier. When glyphs are deleted or renamed in either collection, they are updated in both places. The number of glyphs on the page and in the classifier are displayed in the status bar at the bottom of the window. Coloring '''''''' When connected components are displayed in the classifier, they are colored according to how they were classified: +----------+--------------+-----------------------------------------------------+ | Color | Constant | Description | +==========+==============+=====================================================+ | |UColor| | UNCLASSIFIED | The connected component is completely unclassified. | | (white) | | | +----------+--------------+-----------------------------------------------------+ | |AColor| | AUTOMATIC | The connected component was classified by the | | (red) | | automatic classifier using training data. | +----------+--------------+-----------------------------------------------------+ | |HColor| | HEURISTIC | The connected component was classified by some | | (yellow) | | heuristic (non-exemplar-based) process. | +----------+--------------+-----------------------------------------------------+ | |MColor| | MANUAL | The connected component was classified by a human. | | (green) | | | +----------+--------------+-----------------------------------------------------+ .. |UColor| image:: images/unclassified_color.png .. |AColor| image:: images/autoclassified_color.png .. |HColor| image:: images/heuristicclassified_color.png .. |MColor| image:: images/manualclassified_color.png Class names ''''''''''' "Class names" name a particular class of symbols. Class names are made up of period-delimited parts so that they can be grouped into categories. Names can be invented on the fly. For instance, if you were training for a subset of the characters in the English language, you might have the following class names:: lower.a lower.b lower.c upper.a upper.b upper.c punctuation.comma These period-delimited parts are used to create a tree-like structure in the classifier window that might look something like: .. image:: images/symbol_table_example.png Special class names ................... Special class names begin with an underscore (``_``). ``_group`` Glyphs trained with names beginning with ``_group.`` are first grouped together and then trained as a single unit. For instance, you may wish to train lowercase i's (which are made up of two connected components) as a single logical unit. Select both parts (by dragging a bounding box around them in the original image display) and then train as ``_group.lower.i``. ``_split`` Glyphs trained with names beginning with ``_split.`` are run through a given splitting algorithm. For instance, glyphs that need to be broken into upper and lower halves for further classification of those parts would be trained as ``_split.splity``. When the automatic classifier encounters glyphs that most closely match those trained as ``_split``, it will perform the splitting algorithm and then continue to recursively classify its parts. The splitting algorithms are documented `here`__. .. __: plugins.html#segmentation New splitting algorithms can be created by `writing plugin`__ methods in the category ``Segmentation``. .. __: writing_plugins.html Parts of the classifier window `````````````````````````````` The interactive classifier window is divided into three parts: The symbol table, the connected component display, and the original image display. Symbol table '''''''''''' The symbol table is a heirarchical tree of symbol names that are currently in use. It is preloaded with `special class names`_. Symbols can be trained by typing the class name in the text box at the top or double-clicking on a class name in the tree. The text box features auto-completion (similar to the Unix shell), so you can type a partial name and then press the key to attempt to complete it. Connected component display ''''''''''''''''''''''''''' The connected component display is made up of two collapsible displays. To expand or collapse the panes, use the *+* and *X* buttons in the panes' title bars. By default, only the page glyphs pane is displayed. .. note:: Training will run much slower with the classifier glyphs displayed. It is recommended that you leave it closed unless you are interested in what is there. The connected components panes behave identically to the `multiple image display`_, with additional functionality. When connected components are selected in the page glyphs pane, they are highlighted in the original image display below. The background of connected components are colored based on their classification state. (See `coloring`_). There are some additional toolbar buttons: +-----------------+--------------------------------------------------------------+ | |Delete| | Deletes the selected connected components. They will be | | | displayed with a red-hatching pattern to indicate they are | | | deleted. Re-sorting the connected component display will | | | remove them completely. Deleted glyphs are never saved to | | | disk. | +-----------------+--------------------------------------------------------------+ | |NextU| |NextA| | Auto-move toggles. | | | Whenever a glyph is classified, the 'cursor' will | | |NextH| |NextM| | automatically move to the next glyph that matches any of the | | | selected types: UNCLASSIFIED, AUTOMATIC, HEURISTIC or MANUAL.| +-----------------+--------------------------------------------------------------+ .. |Delete| image:: images/icon_delete.png .. |NextU| image:: images/icon_next_unclass.png .. |NextA| image:: images/icon_next_autoclass.png .. |NextH| image:: images/icon_next_heurclass.png .. |NextM| image:: images/icon_next_manclass.png Original image display '''''''''''''''''''''' The original image display, for the most part, behaves identically to the standard `image display`_. Clicking on a connected component will select it in the connected component display. Dragging a bounding box around a collection of connected components will select multiple connected components. Additional connected components can be added to the selection by Shift-clicking. There are some additional toolbar buttons: +-----------------+--------------------------------------------------------------+ | |Mark| | (Toggle) Display an animated rectangle around the | | | currently selected connected component. | +-----------------+--------------------------------------------------------------+ .. |Mark| image:: images/icon_mark_highlights.png Classifier menu ``````````````` File menu ''''''''' .. note:: If you give any of the XML files a ``.gz`` extension, they will be transparently converted to/from Gzip-compressed files. This saving and loading is actually faster! **Open all...** Opens a special directory of files containing an original image, and contents of the editor and the classifier. This directory should be one created by **Save all...** **Save all...** Saves all of the data necessary to restore the classifier's state into a special directory. This includes the original image and the contents of the editor and the classifier. This special directory can be reloaded using **Open all...**. The following options are used to save and load connected components in the `Gamera XML format`__. .. __: xml_format.html **Save by criteria...** For *expert* users. Provides a dialog box to save different sets of glyphs to a single XML file. .. image:: images/save_by_criteria.png **Classifier glyphs** This menu allows one to Open, Merge, Save, Save As or Clear the glyphs in the classifier. (See `glyph collections`_). **Page glyphs** This menu allows one to Open, Merge, Save, Save As the glyphs on the current page display. (See `glyph collections`_). **Save selected glyphs as...** Saves the selected glyphs to a new file. **Symbol names** Import or export a set of symbol names. Symbol names can be imported from a full Gamera XML file containing images, or a symbol name-only Gamera XML file. Image menu '''''''''' **Open and segment image...** Loads an image from disk and then performs a given segmentation algorithm on it to create connected components. The segmentation algorithm can be selected from the drop-down list. (If you're not sure which one to use, try ``cc_analysis``.) The connected components are loaded into the page glyphs pane and the original image is loaded into the original image display. **Select and segment image...** Select an already-loaded image from the console, and perform a given segmentation algorithm on it to create connected components. The segmentation algorithm can be selected from the drop-down list. (If you're not sure which one to use, try ``cc_analysis``.) The connected components are loaded into the page glyphs pane and the original image is loaded into the original image display. **Select image...** Select an already-loaded image from the console and use it as the original image. This image does not have to correspond to the contents of the page glyphs pane. **Save glyphs into separate files** Saves each of the connected components into a separate image file in a given directory using one of the following sets of connected components: - Classifier glyphs...) - Page glyphs... - Selected glyphs... See `glyph collections`_. Classifier menu ''''''''''''''' **Guess all** / **Guess selected** Classifies the glyphs using the automatic classifier. Glyphs that were classified manually are not reclassified (they must be unclassified first). **Group and guess all** / **Group and guess selected** Classifies the glyphs using the automatic classifier, while attempting to group nearby connected components to form glyphs that are more similar to glyphs in the classifier. This process can take considerably longer than one-by-one classification. The parameters are described in greater detail in the classifier documentation__. .. __: classify.html#group-list-automatic **Confirm all** / **Confirm selected** Treats all automatically classified glyphs as if they were manually classified and adds them to the classifier. Use this function only when you are sure all glyphs are correctly classified. **Display contents** Displays the glyphs in the classifier in a new window. As of this writing this display is read-only and not "live" (i.e. it will not change when the contents of the classifier change). This shortcoming should be remedied in a future version of Gamera. **Change set of features** Change which features of the connected components are used for classification. The features themselves are documented here__. .. __: plugins.html#features .. image:: images/feature_selection.png **Classifier settings** Allows the settings specific to a particular classifier type to be changed, saved or loaded. **Create noninteractive copy** When training is completed (or partially completed) this function will create a noninteractive copy, which is likely more optimized than the interactive version (depending on the classifier type). **Create edited classifier** This option will show a dialog to create a new classifier with a modified training-set based on the current classifer. This modified classifier is produced by one of several kNN-editing algorithms which the user can chose from. Depending on the chosen algorithm a set of parameters is displayed which can be changed by the user to tune the algorithm's results. Additionally the documentation for this algorithm and its parameters is displayed. .. image:: images/knn_editing.png After confirming this dialog, the user is prompted to select a name for the new classifier. The classifier will then be added to the icon display in the console under this name. The produced classifier is usually improved either in terms of speed or classification accuracy, depending on the chosen algorithms and its parameters. For details about the algorithms, their parameters and how to include your own editing algorithms see the `classifier documentation`__. .. __: classify.html#improving-knn-classifiers-using-editing Rules menu '''''''''' Unstable. TODO: Write me. Classifier optimization (Biollante) ----------------------------------- "Biollante is the result of an experiment in genetic engineering. The creature was created by splicing together the DNA of three organisms: a rose, a human female (Erica, daughter of the scientist), and Godzilla himself." For our purposes, Biollante is a small GUI for optimizing kNN classifiers using a genetic algorithm. The genetic algorithm is used to adjust the weights of the feature dimensions. How Biollante fits into training is described in the `training tutorial`__. .. __: training_tutorial.html Overview ```````` To use Biollante, from the Gamera console window, select **File -> Biolante**. From the Biollante window, select **File -> Open** to open a `Gamera XML file`__ containing some training data. You will be prompted to select a set of features to use for classification. Once some training data has been loaded you may use the **Optimizer** menu to start and stop the classifier. After running the optimizer for some time, the best weights can be saved using **File -> Save**. .. __: gamera_xml.html Status page ``````````` .. image:: images/biollante_status.png The Biollante status page displays information about the current state of the optimization and allows some parameters to be set. Parameters may not be changed while the optimizer is running. These parameters may or may not affect the ability of the classifier to find a near-optimal solution. For more information, see a genetic algorithms text such as [Holland1975]_. All recognition rates are expressed in percentages. **Initial recognition rate** The initial leave-one-out performance of the classifier using flat weights. **Best rate** The best leave-one-out performance seen so far. This corresponds to the performance of the set of weights that are saved. **Current generation** The number of generations (of the genetic algorithm) that have run so far. **Elapsed time** **Population size** The number of alleles (sets of weights) to be used in each generation. **Size of k** The number of nearest neighbors used to obtain a result from the *k* nearest neighbor algorithm. **Crossover rate** The probability that a parent's genes will be combined with another to produce offspring. Expressed as a percentage. **Mutation rate** The probability of genes being randomly altered during reproduction. Expressed as a percentage. Best weights page ````````````````` The best weights page graphically displays the weights in the best weight vector in a "bar graph" style. .. image:: images/biollante_weights.png File menu ````````` **Open data...** Opens a Gamera XML containing the training data to be optimized. **Save settings** / **Save settings as...** Saves the best set of weights the optimizer has determined so far. **Exit** Stops the optimizer and closes the Biollante window. Optimizer menu `````````````` **Start** Starts the optimizer. **Stop** Stops the optimizer. .. note:: To avoid memory corruption, Biollante will wait for the optimizer thread to complete the current generation before returning control to the user. This may take a few seconds. References ---------- .. [Holland1975] Holland, J. H. 1975. *Adaptation in natural and artifical systems.* University of Michigan Press, Ann Arbor. gamera-3.3.3/doc/src/html4css1.css0000644000076500000000000001304711261456426015646 0ustar chriswheel/* :Author: David Goodger :Contact: goodger@users.sourceforge.net :Date: $Date: 2009-09-23 09:15:33 +0200 (Wed, 23 Sep 2009) $ :Revision: $Revision: 1163 $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to customize this style sheet. */ /* used to remove borders from tables and images */ .borderless, table.borderless td, table.borderless th { border: 0 } table.borderless td, table.borderless th { /* Override padding for "table.docutils td" with "! important". The right padding separates the table cells. */ padding: 0 0.5em 0 0 ! important } .first { /* Override more specific margin styles with "! important". */ margin-top: 0 ! important } .last, .with-subtitle { margin-bottom: 0 ! important } .hidden { display: none } a.toc-backref { text-decoration: none ; color: black } blockquote.epigraph { margin: 2em 5em ; } dl.docutils dd { margin-bottom: 0.5em } /* Uncomment (and remove this text!) to get bold-faced definition list terms dl.docutils dt { font-weight: bold } */ div.abstract { margin: 2em 5em } div.abstract p.topic-title { font-weight: bold ; text-align: center } div.admonition, div.attention, div.caution, div.danger, div.error, div.hint, div.important, div.note, div.tip, div.warning { margin: 2em ; border: medium outset ; padding: 1em } div.admonition p.admonition-title, div.hint p.admonition-title, div.important p.admonition-title, div.note p.admonition-title, div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif } div.attention p.admonition-title, div.caution p.admonition-title, div.danger p.admonition-title, div.error p.admonition-title, div.warning p.admonition-title { color: red ; font-weight: bold ; font-family: sans-serif } /* Uncomment (and remove this text!) to get reduced vertical space in compound paragraphs. div.compound .compound-first, div.compound .compound-middle { margin-bottom: 0.5em } div.compound .compound-last, div.compound .compound-middle { margin-top: 0.5em } */ div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic } div.dedication p.topic-title { font-weight: bold ; font-style: normal } div.figure { margin-left: 2em ; margin-right: 2em } div.footer, div.header { clear: both; font-size: smaller } div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em } div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ; margin-left: 1.5em } div.sidebar { margin-left: 1em ; border: medium outset ; padding: 1em ; background-color: #ffffee ; width: 40% ; float: right ; clear: right } div.sidebar p.rubric { font-family: sans-serif ; font-size: medium } div.system-messages { margin: 5em } div.system-messages h1 { color: red } div.system-message { border: medium outset ; padding: 1em } div.system-message p.system-message-title { color: red ; font-weight: bold } div.topic { margin: 2em } h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { margin-top: 0.4em } h1.title { text-align: center } h2.subtitle { text-align: center } hr.docutils { width: 75% } img.align-left { clear: left } img.align-right { clear: right } ol.simple, ul.simple { margin-bottom: 1em } ol.arabic { list-style: decimal } ol.loweralpha { list-style: lower-alpha } ol.upperalpha { list-style: upper-alpha } ol.lowerroman { list-style: lower-roman } ol.upperroman { list-style: upper-roman } p.attribution { text-align: right ; margin-left: 50% } p.caption { font-style: italic } p.credits { font-style: italic ; font-size: smaller } p.label { white-space: nowrap } p.rubric { font-weight: bold ; font-size: larger ; color: maroon ; text-align: center } p.sidebar-title { font-family: sans-serif ; font-weight: bold ; font-size: larger } p.sidebar-subtitle { font-family: sans-serif ; font-weight: bold } p.topic-title { font-weight: bold } pre.address { margin-bottom: 0 ; margin-top: 0 ; font-family: serif ; font-size: 100% } pre.literal-block, pre.doctest-block { margin-left: 2em ; margin-right: 2em ; background-color: #eeeeee } span.classifier { font-family: sans-serif ; font-style: oblique } span.classifier-delimiter { font-family: sans-serif ; font-weight: bold } span.interpreted { font-family: sans-serif } span.option { white-space: nowrap } span.pre { white-space: pre } span.problematic { color: red } span.section-subtitle { /* font-size relative to parent (h1..h6 element) */ font-size: 80% } table.citation { border-left: solid 1px gray; margin-left: 1px } table.docinfo { margin: 2em 4em } table.docutils { margin-top: 0.5em ; margin-bottom: 0.5em; background-color: #f7fffd; border-color: #72ada8; border: solid thin #aaaaaa; } table.footnote { border-left: solid 1px black; margin-left: 1px } table.docutils td, table.docutils th, table.docinfo td, table.docinfo th { padding-left: 0.5em ; padding-right: 0.5em ; vertical-align: top } table.docutils th.field-name, table.docinfo th.docinfo-name { font-weight: bold ; text-align: left ; white-space: nowrap ; } td.field-body, th.field-name { padding: 0.5em; border: solid thin #aaaaaa; } h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { font-size: 100% } tt.docutils { } ul.auto-toc { list-style-type: none } gamera-3.3.3/doc/src/image_api.txt0000644000076500000000000007353411344170534015770 0ustar chriswheel======================== The Gamera C++ Image API ======================== Introduction ============ This document describes how to manipulate Gamera images from C++. This deals primarily with low-level (pixel-level) operations. Data model ========== Gamera uses a "shared" data model. This means that different "views" are applied to the same "data." Views may only look at a subset of the data, or they may change how the data is presented to the programmer. The goal of decoupling the "view" from the "data" is to allow a "view" on the data to be a very lightweight object. This allows it to be passed by value with little worry about performance. This also allows the processing of a portion of an image as if it were an entire image. For example, to create a new image, the programmer must first create the data: .. code:: CPP OneBitImageData image_data(Dim(50, 50)); This creates data that is 50 pixels width and 50 pixels high, and has a logical origin of (0, 0). Then you can create a view on all of the data: .. code:: CPP OneBitImageView image_view(image_data); Later, if you want to view only a subset of the data, you can use a different overloaded version of the view constructor: .. code:: CPP OneBitImageView subimage_view(image_data, Point(25, 25), Dim(10, 10)); This will create a view on the image from (25, 25) that is 10 pixels tall and wide, i.e. the lower-right corner will be at (35, 35). An alternate way to do this would be to specify two points: .. code:: CPP OneBitImageView subimage_view(image_data, Point(25, 25), Point(35, 35)); The different constructor forms are discussed in more detail in the `ImageView objects`_ section. Memory management issues ------------------------ Since multiple "views" can use the same "data," one must be careful about prematurely deallocating data objects, or there may be views left around that "point" to deallocated data. Accessing the data through the view is unchecked and could result in a segmentation fault. Another common mistake is to deallocate all views on a given data object, forgetting to deallocate the data itself, resulting in a memory leak. Since there is no reference counting on the C++ side, deallocation of all views does not automatically trigger deallocation of the underlying data. For example: .. code:: CPP OneBitImageData image_data = new OneBitImageData(Dim(50, 50), Point(0, 0)); OneBitImageView image_view = new OneBitImageView(*image_data); ... delete image_view->data(); // Don't forget to delete the data delete image_view; Of course, if the new image data is the result of a plugin function, it will be returned to the caller. When a pointer to an image view (``ImageView*`` or one of its subclasses) is returned to Python, it will participate in Python memory management, and both the view and data will eventually be deallocated automatically. When an ``ImageView*`` is returned to another C++ function, that function is responsible for deallocating the view and data, unless it in turn is passing it back to Python. Fortunately, things are much easier on the Python side, since the number of views that point to a data object are reference counted, so the data object is kept around only as long as there is at least one view looking at it. Take for example the following interactive Python session: .. code:: Python Python 2.3.4 (#1, Oct 26 2004, 16:42:40) [GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from gamera.core import * >>> init_gamera() Loading plugins: ---------------------------------------- arithmetic, color, convolution, corelation, deformation, draw, edgedetect, features, gui_support, id_name_matching, image_conversion, image_utilities, listutilities, logical, misc_filters, morphology, png_support, projections, runlength, segmentation, structural, thinning, threshold, tiff_support, contour >>> orig = load_image("test.tiff") >>> del orig # ImageData dealloc, because the only view pointing to it (orig) has been deleted. >>> orig = load_image("test.tiff") >>> orig = orig.otsu_threshold() # ImageData dealloc, because the pointer stored in orig has been replaced # with a new onebit image. This effect is fairly subtle. >>> ccs = orig.cc_analysis() >>> del orig # No ImageData dealloc, since the ccs list contains views on the data. >>> del ccs # ImageData dealloc, because the remaining views on the data have been destroyed. >>> Image types ----------- You should probably familiarize yourself with different Gamera `image types`__ before reading further. .. __: image_types.html ``ImageData`` objects ```````````````````````` Data objects are instances of the ``ImageData`` class (in ``include/image_data.hpp``) where ``T`` is the pixel type. If you wish to use run-length encoding to store the data, you can use the ``RleImageData`` class. These classes both have the same interface and are completely interchangeable, but will exhibit different algorithmic complexities. There are some typedefs in ``image_types.hpp`` to make creating different kinds of image data objects more convenient: .. code:: CPP /* Image Data */ typedef ImageData GreyScaleImageData; typedef ImageData Grey16ImageData; typedef ImageData FloatImageData; typedef ImageData RGBImageData; typedef ImageData OneBitImageData; typedef RleImageData OneBitRleImageData; There are a few different constructors available for data objects: .. code:: CPP ImageData(const Dim& dim, const Point& offset); ImageData(const Dim& dim); // offset == (0, 0) ImageData(const Size& size, const Point& offset); ImageData(const Size& size); // offset == (0, 0) ImageData(const Rect& rect); There are also some deprecated forms that you may see in legacy code, but which are no longer supported since they are not consistent about specifying *x* before *y*: .. code:: CPP ImageData(size_t nrows = 1, size_t ncols = 1, size_t page_offset_y = 0, size_t page_offset_x = 0); ImageData(const Size& size, size_t page_offset_y = 0, size_t page_offset_x = 0); ImageData(const Dimensions& dim, size_t page_offset_y = 0, size_t page_offset_x = 0); The *offset* arguments are used to specify a logical offset of the data. For instance, if the image data is from part of the page, the upper left corner may not be logically (0, 0). This is purely for logical purposes when your system needs to know the relative positions of image bounding boxes, and does not affect the size of the image data created in any way. The ``Size`` and ``Dim`` classes are simple ways of storing sizes and dimensions defined in ``gamera/dimensions.hpp``. (See the `Dimension types`__ chapter for more information). ``Size(w, h)`` is always equal to ``Dim(w + 1, h + 1)``. Both forms are supported to make it easier to adapt existing algorithms that use one or the other standard. .. __: dimension_types.html While there are other public members and methods to the ``ImageData`` class, we do not recommend using any of them unless you really know what you're doing. All of the image data can be accessed much more flexibly and conveniently through ``ImageView`` objects. ``ImageView`` objects ```````````````````````` Views objects are instances of the ``ImageView`` class (in ``include/image_view.hpp``), where ``T`` is the data object type (a templatization of ``ImageData``). There is also a special version of ``ImageView`` for connected components, ``ConnectedComponent`` defined in ``include/connected_components.hpp``. `Connected components`_ are discussed below. As with the data objects, there are some typedefs for convenience: .. code:: CPP /* ImageView */ typedef ImageView GreyScaleImageView; typedef ImageView Grey16ImageView; typedef ImageView FloatImageView; typedef ImageView RGBImageView; typedef ImageView OneBitImageView; typedef ImageView OneBitRleImageView; /* Connected-components */ typedef ConnectedComponent Cc; typedef ConnectedComponent RleCc; There are a number of different ways to construct image views: .. code:: CPP // Creates a view covering all of the data ImageView(T& image_data); ImageView(T& image_data, const Rect& rect, bool do_range_check = true); ImageView(T& image_data, const Point& upper_left, const Point& lower_right, bool do_range_check = true) ImageView(T& image_data, const Point& upper_left, const Size& size, bool do_range_check = true) ImageView(T& image_data, const Point& upper_left, const Dim& dim, bool do_range_check = true) There are also some deprecated forms that you may see in legacy code, but which are no longer supported since they are not consistent about specifying *x* before *y*: .. code:: CPP // Creates a view with a specified bounding box ImageView(T& image_data, size_t offset_y, size_t offset_x, size_t nrows, size_t ncols, bool do_range_check = true); ImageView(T& image_data, const Point& upper_left, const Dimensions& dim, bool do_range_check = true) The ``Size``, ``Point`` and ``Dim`` classes are simple ways of storing sizes and dimensions defined in ``gamera/dimensions.hpp``. (See the `Dimension types`__ chapter for more information). .. __: dimension_types.html Coordinates for any given bounding boxes are relative to the offset of the underlying data. Therefore: .. code:: CPP // Create data with an size of (64, 64) and an offset of (32, 32); OneBitImageData image_data(Size(64, 64), Point(32, 32)); // This is a view over all of the data OneBitImageView image_view(image_data, Point(32, 32), Size(64, 64)); // This raises an exception, since it's out of range for the data OneBitImageView image_view(image_data, Point(0, 0), Size(64, 64)); You can get the type of the pixels referenced by an ``ImageView`` using the expression ``typename T::value_type``. Image factories --------------- There are other convenience classes for creating image types. TypeIdImageFactory `````````````````` ``TypeIdImageFactory`` is useful if you want to create an image of a specific type based on a pair of integer constants. For example, the following code snippit creates a DENSE or RLE image based on an integer constant passed in as a parameter to the function. Note that the types of each of the ``TypeIdImageFactory`` s are different and not polymorphic, so the interior function (``threshold_fill``) must be called from two locations. .. code:: CPP template Image* threshold(const T &m, int threshold, int storage_format) { if (storage_format == DENSE) { typedef TypeIdImageFactory fact_type; typename fact_type::image_type* view = fact_type::create(m.origin(), m.dim()); threshold_fill(m, *view, threshold); return view; } else { typedef TypeIdImageFactory fact_type; typename fact_type::image_type* view = fact_type::create(m.origin(), m.dim()); threshold_fill(m, *view, threshold); return view; } } ImageFactory ```````````` It is a common use case to create a result image whose type is related to the type of an input image. In many cases, one could just use the same type as the result type. However, if a ``Cc`` image type is passed into a function, you would most likely want to return a regular ``OneBit`` image as a result. ``ImageFactory`` is designed to get around this problem. It will create an appropriate result type from a given input type. For example, see the following code snippet: .. code:: CPP template Image* abutaleb_threshold(const T &m, int storage_format) { typedef typename ImageFactory::view_type view_type; view_type* average = mean(m); ... Accessing pixels ================ One of the goals of the Gamera framework is to make it easy to incorporate code from other image processing frameworks as painlessly as possible. Therefore, there are a number of interfaces that can be used to access and process the underlying pixel data of an image. .. note:: Whenever accessing individual pixels, the ``row`` and ``col`` given are relative to the offsets of the view or the underlying data. In other words ``.get(0,0)`` will always return the pixel in the upper-left hand corner of the view. This makes it easier for algorithms that work on the pixels of a view to ignore the complexity of the "shared" data model. Different interfaces -------------------- The different interfaces for accessing pixels are discussed below: ``get`` and ``set`` methods ``````````````````````````` This is perhaps the most straightforward way to access the pixels of an image. There are two public methods of ``ImageView``: - value_type **get** (const Point& *point*) - void **set** (const Point& *point*, value_type *value*) There are also deprecated forms that you may see in legacy code: - value_type **get** (size_t *row*, size_t *col*) - void **set** (size_t *row*, size_t *col*, value_type *value*) **get** returns the value of the pixel at the given row and column. **set** changes the pixel at the given row and column to the given value. An example using ``get`` / ``set`` over an entire image: .. code:: CPP template typename ImageFactory::view_type* test_get_set(const T& image) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* new_data = new data_type(image); view_type* new_view = new view_type(*new_data); for (size_t r = 0; r < in.nrows(); ++r) { for (size_t c = 0; c < in.ncols(); ++c) { new_view.set(Point(c, r), image.get(Point(c, r)) / 2); } } return new_view; } C-style 2-dimensional array ``````````````````````````` An alternative is to use the notation of C-style 2-dimensional arrays: .. code:: CPP value = image[row][col]; image[row][col] = value; This interface is provided as a convenience to support the large body of legacy code written in this style. Note that ``[row][col]`` is the reverse of get and set's ``Point(x, y)``. Keep in mind, it is not really a 2-diminsional array underneath -- this view is "faked." An example using the C-style 2-dimensional array interface: .. code:: CPP template typename ImageFactory::view_type* test_c_2d(const T& image) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* new_data = new data_type(image); view_type* new_view = new view_type(*new_data); for (size_t r = 0; r < image.nrows(); ++r) { for (size_t c = 0; c < image.ncols(); ++c) { (*new_view)[r][c] = image[r][c] / 2; } } return new_view; } Iterators ````````` Iterators provide a lot of readability and convenience advantages over the other approaches. Gamera has three kinds of iterators: 1. Vector iterator: a one-dimensional iterator that iterates from the upper left hand corner, left-to-right, top-to-bottom. 2. Row/column iterators: Iterates along either rows or columns. Incrementing the iterator moves one row down or one column to the right. Calling ``begin()`` on a ``row_iterator``, returns a ``col_iterator`` and vice versa. 3. Two-dimensional iterators: Provide free movement of the iterator in any direction. The first two kinds of iterators follow the conventions of the C++ STL enough that they can be used with STL algorithms. All iterators are available in ``const`` and non-``const`` versions. ``const`` iterators can not change the underlying data. If you have an image passed into your function as a ``const ImageView &``, you will not be able to change the pixels in the image, and thus will only be able to get ``const`` iterators from it. Note that you can call ``row( )`` or ``col( )`` on any iterator to obtain the current row and column position of the iterator. All Gamera iterators can get/set their values in two ways, both of which boiling down to exactly the same machine code, and therefore having the same efficiency: 1. The standard "C pointer-like" way: .. code:: CPP // i is any iterator type value = *i; *i = value; 2. Using ``get`` and ``set`` methods: .. code:: CPP // i is any iterator type value = i.get(); i.set(value); Vector iterator ''''''''''''''' Vector iterators (``ImageView::vec_iterator``) can be convenient when the operation works one pixel at a time and does not need to be aware of any spatial relationships. An example using ``vec_iterators``: .. code:: CPP template typename ImageFactory::view_type* test_vec_iterator(const T& image) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* new_data = new data_type(image); view_type* new_view = new view_type(*new_data); typename T::const_vec_iterator i = image.vec_begin(); typename view_type::vec_iterator j = new_view->vec_begin(); for ( ; i != image.vec_end(); ++i, ++j) { *j = *i / 2; // or j.set(i.get() / 2); } return new_view; } Since the Gamera image iterators follow the STL iterator interface, they can be used with builtin STL algorithms. For instance, to fill an entire image with white using the STL ``std::fill`` algorithm: .. code:: CPP #include template void fill_white(T& image) { std::fill(image.vec_begin(), image.vec_end(), white(image)); } Row/column iterators '''''''''''''''''''' Sometimes it is necessary to have nested loops, one for rows and one for columns. The following is an example using row iterators (``ImageView::row_iterators``) and column interators (``ImageView::col_iterators``): .. code:: CPP template typename ImageFactory::view_type* test_row_col_iterator(const T& image) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* new_data = new data_type(image); view_type* new_view = new view_type(*new_data); typedef typename T::const_row_iterator IteratorI; IteratorI ir = image.row_begin(); typedef typename view_type::row_iterator IteratorJ; IteratorJ jr = new_view->row_begin(); for ( ; ir != image.row_end(); ++ir, ++jr) { typename IteratorI::iterator ic = ir.begin(); typename IteratorJ::iterator jc = jr.begin(); for ( ; ic != ir.end(); ++ic, ++jc) *jc = *ic / 2; } return new_view; } The fun thing about row and column iterators is that they are interchangable. If you wish to iterate through the image in column major order instead, you could write: .. code:: CPP template typename ImageFactory::view_type* test_col_row_iterator(const T& image) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* new_data = new data_type(image); view_type* new_view = new view_type(*new_data); typedef typename T::const_col_iterator IteratorI; IteratorI ir = image.col_begin(); typedef typename view_type::col_iterator IteratorJ; IteratorJ jr = new_view->col_begin(); for ( ; ir != image.col_end(); ++ir, ++jr) { typename IteratorI::iterator ic = ir.begin(); typename IteratorJ::iterator jc = jr.begin(); for ( ; ic != ir.end(); ++ic, ++jc) *jc = *ic / 2; } return new_view; } Of course, that really should be templatized on the iterator type. For an example of this, see ``include/plugins/projections.hpp``. Row and column iterators also have methods that return the current row and column (relative to the underlying data). ``i.row()`` returns the current row and ``i.col()`` returns the current column. Two-dimensional iterators ''''''''''''''''''''''''' Unlike the other kinds of iterators, two-dimensional iterators are a long way from C++ STL convention. The idea of these iterators was borrowed from the VIGRA_ library. More documentation is available there, but I've provided a short summary below. .. _VIGRA: http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ You can obtain a two-dimensional iterator from an image using of the following methods: .. code:: CPP Iterator upperLeft(); Iterator lowerRight(); Once you have a two-dimensional iterator, you can move it using the following: .. code:: CPP typename T::Iterator i; ++i.x; // move right --i.x; // move left ++i.y; // move down --i.y; // move up You can see that this gives more freedom and expressivity than the other iterators. When you assign one two-dimensional iterator to another, it is copied, so there are no persistent connections between them. .. code:: CPP typename T::Iterator center, below; ... below = center; ++below.y; // 'below' points to the pixel below 'center' ++center.x; // 'center' moved. 'below' did not. You can also perform arithmetic on these iterators on the fly: .. code:: CPP typename T::Iterator center, below; ... below = center.y + 1; // 'center' is not moved If you need to move in two dimensions at once, you can either add or subtract a ``Diff2D`` object from the iterator, or use the ``operator()`` method. .. code:: CPP typename T::Iterator i, relative; ... relative = i + Diff2D(1, 1) // down and to the right relative = i[Diff2D(1, 1)] // equivalent to above relative = i + Diff2D(-1, -1) // up and to the left relative = i - Diff2D(1, 1) // up and to the left relative = i - Diff2D(-1, -1) // down and to the right relative = i(1, 1) // down and to the right relative = i(-1, -1) // up and to the left For an example of how two-dimensional iterators can be used in a more real-world situation, see the ``cc_analysis`` method in ``include/plugins/segmentation.py``. Speed tests ``````````` The different interfaces are provided primarily to support different programming styles. However, they do not run at the same speed. The following graph shows the relative speeds of different pixel access methods (using the examples above). These results are largely processor and architecture dependent, so take them with a truckload of salt. .. image:: images/pixel_access_runtimes.png The performance of the 1-dimensional iterator is perhaps surprising, since it appears to be the simplest code. In fact, however, ``vec_iterators`` must support the image view model, and therefore do basic "range checking" upon each increment. This introduces some overhead. .. _VIGRA: http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ The row/column iterators in row major order (rows in the outer loop) is the clear winner. Since the underlying data is stored row major order, accessing it in column major order is a major performance hit, in part due to the extra pointer arithmetic and in part due to worse cache performance. .. note:: Any performance improvement should be justified only by profiling on real-world data Making generic programming work =============================== Everything discussed so far has been completely polymorphic: these techniques should work identically on all types of images. However, where the images vary is in the pixel types themselves. Careful programming can keep your algorithms generic across all pixel types, but when that is no longer possible, it is also possible to specialize (i.e. write a special version of an algorithm for a particular pixel type.) First, let's cover some more details of the various pixel types available in Gamera. They are all defined in ``include/pixel.hpp``. ``RGB`` RGB pixels are represented by instances of the ``Rgb`` class. By default, each plane is represented by an 8-bit ``unsigned char`` The individual RGB planes can be get/set using the ``red``, ``green`` and ``blue`` functions. The values follow the standard hardware conventions: larger values are higher intensity. There are also many utility methods for converting the RGB pixel into other kinds of values. See ``include/pixel.hpp`` for more information. ``Rgb`` instances are small enough (3 bytes) that you can safely pass them by value without performance concerns. ``GREYSCALE`` GreyScale pixels are 8-bit ``unsigned char`` values in the range 0 - 255. These also follow the hardware convention that larger values are higher intensity (white). ``FLOAT`` Float pixels are 32-bit floating-point ``float`` values. They follows the hardware convention that larger values are higher intensity (white). Unlike the integral pixel types, there is no set range for the values (they can even be negative). For this reason, the Gamera display will always find the lowest and highest values and then normalize the display to match the dynamic range of the display hardware. Floating point images are most useful to represent non-image data, such as the results of the convolution of two images. ``ONEBIT`` OneBit pixels are 16-bit ``unsigned char`` values. Perhaps confusingly, a value of 0 is white (which is usually ``background`` in most document images) and *all other values* are black. The extra bits of range are used when a connected component analysis is performed. Each connected component in an image is assigned a ``label`` value, and its pixels are labeled using the value. Since the directionality of OneBit pixels is different from all other pixel types, care must be taken when writing algorithms that accept OneBit images and other images. Black and white --------------- Convenience functions are provided to get and test values for white and black pixels that work on all pixel types. .. code:: CPP T pixel_traits::white(); T pixel_traits::black(); Return the values for white and black, respectively, for the given pixel type ``T``. Often, it is more convenient to get the pixel value from the ``ImageView`` type, and not the pixel type. Therefore, the functions .. code:: CPP T::value_type white(T& image_type); T::value_type black(T& image_type); are also provided. You can also test whether a pixel is white or black using: .. code:: CPP bool is_white(T pixel_value); bool is_black(T pixel_value); Writing a specialized function ------------------------------ As specified in `Writing Gamera Plugins`__, each plugin function should be templatized to accept multiple image types. Sometimes, though, a single code base will not work for all images types, or there are performance gains to be had by writing for a particular image type. .. __: writing_plugins.html The wrinkle that makes this less than straightforward is that you often want to specialize on the **pixel type**, not the **image type**. For instance, there are multiple **image types** where the **pixel type** is ``ONEBIT`` (OneBitImageView, Cc, OneBitRleImageView etc.). Therefore, you will normally want to have a helper function which is templatized on the pixel type, which is called from the main function. See for example, the ``invert`` plugin method, which needs to do something different for FLOAT images (since the range of FLOAT pixels is not fixed.): .. code:: CPP /* Invert an image */ // This is the generic version template struct invert_specialized { template void operator()(T& image) { ImageAccessor acc; typename T::vec_iterator in = image.vec_begin(); for (; in != image.vec_end(); ++in) acc.set(invert(acc(in)), in); } }; // This is specialied for FLOAT pixels template<> struct invert_specialized { template void operator()(T& image) { FloatPixel max = 0; max = find_max(image.parent()); ImageAccessor acc; typename T::vec_iterator in = image.vec_begin(); for (; in != image.vec_end(); ++in) acc.set(max - acc(in), in); } }; // This is the top level function that calls the correct // specialization template void invert(T& image) { invert_specialized invert_special; invert_special(image); } Connected components ==================== On the C++ side, the Python image type ``Cc`` corresponds to the image type ``ConnectedComponent``. You can us it just like in Python: .. code:: CPP ImageList* ccs = cc_analysis(image); ImageList::iterator ccs_it; size_t x,y; // loop over all ccs for (ccs_it = ccs->begin(); ccs_it != ccs->end(); ++ccs_it) { // query cc label int label = cc->label(); // Loop over individual pixels for (y=0; y < cc->nrows(); y++) for (x=0; x < cc->ncols(); x++) if is_black(cc->get(Point(x,y))) { // .... } } For creating a list of CCs from C++, two steps are necessary: 1) Setting all pixels in the image to its label value 2) Call the constructor for each ConnectedComponent: .. code:: CPP // Assumptions: // the CC labels have been stored in the vector "labelvec" // the CC dimensions have been stored in the vector "rectvec" ccs = new ImageList(); for (size_t i = 0; i < labelvec.size(); ++i) { ccs->push_back(new ConnectedComponent( *((typename T::data_type*)image.data()), labelvec[i], Point(rectvec[i]->offset_x() + image.offset_x(), rectvec[i]->offset_y() + image.offset_y()), rectvec[i]->dim() )); } Multi-label connected components ================================ On the C++ side, the Python image type ``MlCc`` corresponds to the image type ``MultiLabelCC`` (two upper case C's at the end). Its methods are the `same as on the Python side`__; for details about its C++ constructors and properties (``m_labels`` etc.) see the source file *include/connected_component.hpp* of the Gamera source code. .. __: image_types.html#multi-label-connected-components gamera-3.3.3/doc/src/image_types.txt0000644000076500000000000001700311341152222016337 0ustar chriswheel=========== Image types =========== :Editors: Michael Droettboom, Christoph Dalitz There are a number of different image types in Gamera that serve different purposes. Fortunately, they all share a common interface, which allows many operations on images to be compiled for different image types from the same source code using C++ templates. This is why *all* Gamera plugin methods are templatized (see `Writing Gamera Plugins`__). .. __: writing_plugins.html Image types are specified on two axes: 1] the type of pixels the contain, and 2] the storage type: Pixel types =========== The pixels in an image can be one of the following types: ``RGB`` 24-bit color pixels (8-bits per pixel), representing 2 ^ 24 (16,777,216) different colors. ``RGBPixel`` objects have some special `properties and methods`__. .. __: gamera.core.RGBPixel.html ``GREYSCALE`` 8-bit greyscale, representing 256 different levels of grey. ``GREY16`` 16-bit greyscale, representing 65,536 different levels of grey. ``ONEBIT`` For black-and-white images. The underlying representation is actually 16 bits-per-pixel, since `connected component labelling`__ stores information with each pixel. This seems like wasted space, but since connected component labelling is so common in Gamera, it more often is a space savings from the fact that the image data can be "shared." ``FLOAT`` Double-precision floating point greyscale. This is useful for images that need a really wide dynamic range. .. warning:: Unfortunately, at this time ``FLOAT`` images can not be saved or loaded. .. note:: When ``FLOAT`` images are displayed in the GUI, the output is automatically "normalized" so that the total range in the image is equal to the range of brightnesses your monitor can display. .. __: plugins.html#cc-analysis The pixel type of an image can be retrieved in two ways. .. code:: Python image.pixel_type_name returns a string which is one of ``RGB``, ``GreyScale``, ``Grey16``, ``OneBit`` or ``Float``. .. code:: Python image.data.pixel_type returns an integer which will be one of the constants ``RGB``, ``GREYSCALE``, ``GREY16``, ``ONEBIT`` or ``FLOAT``. Storage formats =============== Gamera has two ways of storing the image data in memory behind the scenes: ``DENSE`` Uncompressed. The image data is a contiguous chunk of memory that is addressed in row-major order (left-to-right, top-to-bottom). ``RLE`` Run-length encoded. For certain kinds of images, run-length-encoding can be a performance improvement since less data needs to be transferred between main memory and the CPU. .. warning:: At present, ``RLE`` is only available for ``ONEBIT`` images. The storage format of an image can be determined in two ways. .. code:: Python image.storage_format_name() returns a string which is either ``Dense`` or ``RLE``. .. code:: Python image.data.storage_format returns an integer corresponding to the constants ``DENSE`` and ``RLE``. .. note:: Any performance improvement should be justified only by profiling on real-world data Image methods ============= The methods on images include all of the plugin methods in the current environment. These are documented in the `plugin reference`__. In addition, there are number of core properties and methods. .. __: plugins.html Constructors ------------ ``Image.__init__`` '''''''''''''''''' .. docstring:: gamera.core Image __init__ :no_title: ``SubImage.__init__`` ''''''''''''''''''''' .. docstring:: gamera.core SubImage __init__ :no_title: Pixel access ------------ .. docstring:: gamera.core Image get set Informational ------------- These methods provide information about the image. .. docstring:: gamera.core ImageBase pixel_type_name storage_format_name memory_size .. docstring:: gamera.core Image resolution white black .. docstring:: gamera.core Cc label .. docstring:: gamera.core Image data ncols nrows offset_x offset_y ul ur ll lr Bounding box ------------ Bounding box operations on ``Image`` objects are inherited from the Rect__ class. .. __: dimension_types.html#rect Classification -------------- See `Classification plugins`__. .. __: classification.html Special image views =================== There are two special image views on ``ONEBIT`` images that only consider specific pixel values to be black: *connected components* and *multilabel connected components*. In most cases, you will need connected components; multilabel connected components are only meant for very special use cases. Connected Components -------------------- Connected components (``Cc``) are a special kind of view on ``ONEBIT`` image data. The implementation (ab)uses the fact that ``ONEBIT`` images are actually stored as 16-bits-per-pixel data. Therefore all pixels belonging to the same Cc are set to the same pixel value (the "connected component label") and pixels belonging to different Cc's have different pixel values. Each Cc object defines a bounding box and a ``label`` value which indicates the pixel value that the Cc object corresponds to. Pixels with that value will appear to be black, and pixels without that value will appear to be white. As a programmer using a Cc object, this detail should not matter most of the time: it will behave as a standalone ``ONEBIT`` image. However, care should be taken when setting the values of a Cc object: it may be possible to make pixels "disappear" by setting them to a value other than ``Cc.label``. Cc's behave like image views with the additional property ``label``. You can remove a particular Cc with ``fill_white``: .. code:: Python # remove all CCs with an aspect ration > 3 ccs = onebit.cc_analysis() for c in ccs: if float(c.nrows) / c.ncols > 3.0: c.fill_white() You can even take a CC from one image and highlight its black pixels on a different image: .. code:: Python # mark all CCs with an aspect ration > 3 in red # without changing the original image ccs = onebit.cc_analysis() rgb = onebit.to_rgb() for c in ccs: if float(c.nrows) / c.ncols > 3.0: rgb.highlight(c, RGBPixel(255,0,0)) .. docstring:: gamera.core Cc __init__ Multi-Label Connected Components -------------------------------- MultiLabelCCs (``MlCc`` on the python side, and ``MultiLabelCC`` on the C++ side) basically work in the same way as 'regular' Connected Components. The difference between those two is the abillity of MlCcs to have multiple labels. Each label has an associated ``Rect`` representing its bounding box; the bounding box of the entire MlCc is the closure of all label bounding boxes. This special feature allows for building connected components which actually consist of different parts, thus making it fast and easy to create different variants of an MlCcs with some parts excluded. To make this even more useful, each MlCc has an additional (optional) property, the subpart neighborship relations. Note that these relationships need to be provided by the user, in case he needs them. Apart from the basic image methods, MlCcs offer a number of additional functions as listed below. .. docstring:: gamera.core MlCc __init__ .. docstring:: gamera.core MlCc has_label get_labels add_label remove_label relabel .. docstring:: gamera.core MlCc convert_to_cc convert_to_cc_list .. docstring:: gamera.core MlCc get_neighbors add_neighbors Image functions =============== There are a number of free functions for dealing with images. File ---- .. docstring:: gamera core load_image image_info GUI --- .. docstring:: gamera core display_multi gamera-3.3.3/doc/src/images/0000755000076500000000000000000011755376174014563 5ustar chriswheelgamera-3.3.3/doc/src/images/1bit_png.png0000644000076500000000000002537210714675724017002 0ustar chriswheel‰PNG  IHDRb­ÎŠYPLTE˙˙˙ٟŬ IDATxÚċ_l\יĜÏ2ĵ BóÒCh˜ÖĦ˘~iaı~TKşj²]ċĦ€ŸÚĵ¤ĞlDGĊJ(ž‘™ SĴ#&Xñ"Šf‹m᷃°˗Ħ×Àĥ&‹Eħ$ñ=^ۚKÍF÷ŽïŸŻßwÎŭ?8ÊŞÀ˘À$MŜùÍùóïßùΛc÷íZìq€ü^vü½għ“Í`›ô˜YÌĝèħéŻÌ}gà—Ü{†=2ŭ•„ǙñàĞŭ­ ÌÑ8ö´˙™ûĠ˙ɄV%ÚÎîĴh&ÑÄOÇ0Ĉe7Ĉo¸yD³TËì˜j9r ß­ÛñÛô-…ñ[bìiI;ӞjìkÎ~ó½SĠ3³ßDÚäcÓ_ŭ›Kßĝ^6 ‡×‰fótŝ9ŭÄŝEó Ë g.}µÚş|f11÷Ç[—‘›¤=H´KF: ˙&ÚxZNê~ Żí€wÚ}£ëš ‚Ĥ myY÷Şñ%·fĉfikD{‹§³’ğÚnŞżÑxúÚáú!÷µú>÷Éí3‡ßZ**3—Ÿ{°ŝ?r³`s¨­™ÍÂ|ûPû2Ò_{úÒs×áO íʍ³‡¤ísĤ2AğvĉòÊcï^ZHfÁщ&Úĥ›ÍÂ|û'—Û^Ĥß8Û Ĥm6Ħ½ÁqŽ&kAÒĸùÙZx²óŸ[—Û•ġ„vx}Ħ}ôĈYvÄj.0êéB5i›ö…Ü, -™ÓÜZĝvûÒ.ß8ûe˘ı|ĉҁ˭ËÎòsH;uxëÊċÑkáµŬşÜŝùĈyûüöÓë˒ĥíŝÑfZ—vnËgg›ßFÚĠS‡˙ĥ0 ÖÂ7Ħĥ~W7ÛèêŽ Ú›`6şğ½5k[¸Ŝ8vb38Óñ£è°k½–Ĝâ4ŞEĜĊé ĤˆŸ–Yeyzbn²Bk´Â"=RÒH‚öñùm÷~ù>}yvòżò'pŽvÒßġı[¤Ŭò —Ï´“‡£!Ïgá³!ùò´²(íí~Y™XŜ‘´ûöúGNÛ{}|Zż˘,Ħ4Ċ·ß~=÷€Ec܀`\ÚDç èujò[iöqŝq5ħÇ-lêà†ĝ›…ôĉ"Í0ǧĠ7 A„bŒß´-ÌIèž4żÖÎÑ´-˘Ħ›f¸ĝNğ<@‚ñĤ!ĤAŽ˘ñ)Òŝ÷żMƒ ­İyD+}³ÀǛAğrÊÈ·-Ì·cÛ·e÷íqiï]ŞċÛĉçÛqı¸mqi­GŸÉÏiĥ­ÄmëŒKsŝċyysó½²Ġ¸mcÓĵ˙ôP~-i÷Úĥà ôvM¨="iö½ĥ šˆfOBóïè[ĝġ îµm˘Ö‰ž@£/ıeĝĞ÷@ë ĉ.§o…9•m[eÓڟ£F‚?C̟ôÓîmÜvoHû+0´Ú…µ Öé×ïIB Ĝ„0#E+§Kmğ7 9Àħm]ì *Tċk?ê£E÷0§Ħú!5ME+DLûíiŭ˙I[ż"œY%ŭ]lRôñDôÁ‘áŝgÈX^ŝ µŸÇ4IÓà.Ф"ۂüs™s)Œc ĤȏÙâ'zĠ觎¤İ8uÌHŜìĦò —Í$­+ °™£1£ӈä@ŝSŭŜŸÁÄïQëŜÄHi„°r4³ŭ³˜Öèĝ$>B Z:ZÛnK%ôfìozšMSJmO‹Ŭî­‹gCƒh„oôà´Í%Û·ÓC‡‹’Ôċ‰Ŝ]£Öù­u\9†!viôË0‚.ĵ Rż…4Ž´Iv îİgh´zb#ÊŝŒŜĤ˙ŻÉÉh'qšÂĥhÔ\üŸ=ïoĈ´YvNLÓz×~A °W×ܽŬÇı!ËÇn8H˘u8°ĝCŞDû‘Ċ:LżË8á"}ib>ü'p…Z"˘!uŠ‹-BMlhÒ#FÖżI4Óŝcl½ğĈ…mPxè)Ñ|#á94z‘èuĜÙ¤ŝĦ`Ô"nGœŝ7žSv-ïҒ&ĊuħuĜ |£íħ_#eœ·ñ—Ĝ֓G` †4Ħġ­^o]ĴNê+êDp=€c’fËá?Ô0ˆÖpš½QXÛÉ e£#ĉOÚĜ½U.V§íâĜbb9N&²B1¤ŸÚĥ:FN B.Ĵ‚ÑéĈ41‹¸ĈhbqNpÇ×ċj˘ħÉBÈŬÔvDz€" xÈc ş™³V6`{ĵÖíLBĜÔäÓ 3µòW2³ÏĦ”ÉŻ—ä³6•4vn2Uuı"ĥÄ"ŒVSĥn ñ&„À|Èij/1Ċim-`C5{°Ñħ$=£j™]̜D/r›„wž ÑĤ™ÒK<oßħ­>yĊ×„V+*+iYŸ žĴި…ç¨ċŸ¸+?î$~ˆ^+zY$ó¸ìŽžìOTWx× XU;ŜÂ>œ|ÛĦTîS™WSƒ8ÊNG/0âžFÇÎìĽvĤÑĈġĵ}³şë۔ê–$ĤŭÓ%בŸÊ‹÷=&ç0zjžœ—nÓĝ.JU´ˆĉ“CÚÓÈ"F™+lÌÔ9cóÂħjş†êwy™ħ?²ë)moÎgùPÜ9ÇĜĵ/—ìî9L“hf0(ö,µ÷ŭĵ% °5‡3Ŭᐟ`Ç´yVé‡m qpx_Ž-~Ŝ'ġŽèn²/Ó}°Pd Üê1X1µdĉuÒÔRĉi-x*ô´Ĵû =żc ×HÓà*jħëIÍ`¤ô^c‡ ò3hpü·çêÊÔêıL…EFú ıbs1Ñ2;” — Y uo–´ċ:íxv2qÒĖŜ„†ŬiDĜ|.˜ AËIO÷ŭ²&gì8{2Ġa^e3ÛÍÒ[Ç=iĝ!6'iĤ0œŽÚŽçÚä£hğÉÚAS×ċCŭ==´Pö·>͌Ápš?˜6§ëÍͅäш’„ïÛĈM ħ28Eâ. mÀo·ħÁ4›Yċe½NÁ/ûµ|M ´G7*%ÚıÂçß,Ò¤$M­ÒŸ÷ĤË´ċŝŜz:!iìxc£6=rŒËİÜ&i"Ö²PΤşnĜnÛÀY`•5pŒ‹yÚŻJOï£ñĦ4Ô ?˜cıɸıÇVĦ6œFş'QÑÛİÑ{Ç*)Û²À ïİpé?+ĦuŞ{ìRî6 âó`PÍöħŭ bŭzJšÀZ…ĥĤ%-`'p*cZ…Ü[iêdÙÈÓp‰òé>šBûTÒ‹Ĝ3à}É·Ĥ…)Q”Ġ™ÊÔ{%5à ˘ùHÖ1ZXċ&ÖkĠèPĠ³m4ĵìQEÒ(ÁܜRŞÓƒhmQ{b‹§AÉ}\g´cĥ4/ iÁĤ(:N÷¤(agJġ4­—Ü_ĊϝI70!­½°¨›]h:ÖÔôYjÛkj=@3d²,Êm;yé†ÍG¨ÉëBxĜc>ŝñÎ{œ*^g†ÓÂ|ö_+–´ ñ­}Ǟ="~3qĉ íë}ĴCÎ!£ñҞG~ß-I|ßĉÉ^Y’DĞ0#êÛë ĜöMvŜ‚V x-għ@“šÏ÷TûŜ³¨ĤŸ6pÛäwUĈ EÔÉNVyÇŭ8_ñ5€ĉŜ{›œž1˜ĤÀŽĴXdŠĵo£ŭ]²ÏşG ֆL=*]ıiÑeš}´ßiFüá%äΔŜ‰·@Ŝ@SáŻseQäĉí ĦmĦžg,Şê˘nv8-H’ċNa:ıœ˘ŸnÉMˀğ>4\aŸ=5àfÖèĦ':¨|ZëôÇ*-iˆŞ†hÛ{‡MŻU˘MióÂVg›˘”# äŝĥÖIGġüj[¸ıjs[<\=bVË6в‘şIċXHšuñ9ˆ´zúFDNĊ² ŝ†Li½›"ÊzzŸ­oÍÎ6çk’ĈĜÙHÄ´—VCk ·Ż&OR%Ò<тí4ü4-g“r‚´0ˆsĤ¨‚ÚÄJR¨2?×FZ8Hzž÷üs´Ĝi’³Cí/(RחĠóeš äc§“mQYċv¸¨‰yö[ü˙ ŝ™2Çm N'ğĊ^™ùJJ1zĦ/hŭ=Ġ˘oĤ"÷Ê£qĵêOG›İ€Ä´qġ’öÙˆêyĠÙóğë^‚˙’HërÎvÜ!=…àaÑd˜w`cŒF!-PŒ@X†àüÓı›ŻÍct%Ò1nèxtAÖÛ{ù•iÓáë‚&ċÁHiŬ”ĥ>– ïäÛ֐nÔb•‡a ÙÑW‹µî£|j€›î°:ü0”Ef<{@ ŞûĝŻïJÁé Ĵê§ÂQê5 %™zò‹˘€Û|ÒCxwıL !ĵ²u’ÈHŭ¸^Ĥ)m\³´ÀéìĜáú.ĵ‹Vò…a4ĝu|:£Sߤ‰ġŽbË"¤q?ĦéS7áŬĈ”4ŝ2™*žŸ8tƒŸ’fŒ´ lnáÔ¤ÁĝàÓ²lÏ.9BÄ Pq* ğ~nnöQ€]œ…=°m/çÖvوšYĦŽBpDǏܽ“Z£43JÒ/{ Gï~Ó-ț]¤ÑĜu†”Í:4óI?ÇÖgêdî]¸ożı[¨ĤÛ¸!T5'G²'=ÇdÜV÷ĤE%šV}݃‡ŝ%ĉ 4ŞÍÎOB0€ŝËğŭĤM%ŽVŜ4rm£é £ƒ˘8;-1ÔsğX7XÙBÚoĞġ¤óÖ>è}=ċ*ċMv,Ä  ­‹êó;Z+ċiĠ™İĝ@‘ÖÊ(Gżì‚&ŻZìÒê İ—^·$aQúìÏE Ĝ›TAŬp;9Z÷½Ż]‰D¨Žbĝ?¤;YK+œx µ°‰ì'o£ŸIĤm·áú˘îÍ-—˙Z¤eıh,:lqRê%³ò§ÄıÍĊİgè‰Ş?“´ےNËïI—ìû!ŝjž ½çßJ %Í(x–ĝz‹|ŭ*a×­#²9€ÍMó]¨)cxšq3˜4 ìü÷*(ĴġXUŜrŒh×Ë6+#Ŝcġi qL²t*¨[œàqœ˙×ĦHËš8g’›–­fӐuÔΑS¸|¸~Ш‘Ŝ.ÓÂĴ–ĥ¸d1É9™¨­‚ôú[ßċù·4rĤjh5·xTÊÑVavĞ“‡:µĜfJZ{šӊÒû … µmè\ôûR2ıRc0ß½ËiݲUħùĦ.^˙am=ö*üceKĥġQN[rJ¤O™–™ûPX8ž¸Ĥ‘¸ÈUŬf3O h·äĜ!˘]Ĥ³§Anö‚=ŬÊ{Ôü?%NßDlĞ”ÎıÊd{JĊ8/7°´yŠwt’u—ĵû5ŜM¤7¤Ĥ¨ÀÓà·Â7ĦÈ>·Ċü˜°-„·‹a~|}%úš^Ĥ‰Ž–…OÜKK"İÂí&†Ğ´´.Ĉ˘µGÏán@›-3^9/}´Dk{Ğâ@“|½{Ŭ8vUŒÍlú½^“• Á\…ìoġħhNLK½HğmVT¨.V¨ÙEǨ˘#b?î(À*r)FóRZÛ{s ·Ĝ´ë˙0šZ3ì™CWİ - ‚°Ê¨ĥ…@—v ‹½Ü­D/2v!àÎ÷ĜqfL#mNVè£}HÛtnU`-z ;Ù…ŠšĜĝÈ]#'on;kVż¸ZŒ·à.ċ+ÏÀ*³p…7÷ħ%Ç ˜{ Ž áf´şĊDóKJÈ˘‘‰3KĞsb; j%Ş­Ô¤1Ċz¸W‡MTj^™FğCĦ|wpúömʧ!İZ·Ùr¤ĠˆV<²YsO; ŬUï= ıĜ˘ı˜ÒnŠ"Äfĥ*kQès/‰2†nM§ċĉĈvùdjû^'š²Ó £”&6xä ĵVÁéġ.Â÷KI—Ë÷‡Bd³0Â$ñév˘klÑb ižĴĴîÈüglĊ"MÜ^ҟĦÇu§RĞ×+–ӂ¤Nğ)h§‚GŜOhBL{Ĥ¤•½"÷,WLÙ·İÁœÜÊd3² ڎ^m'7d4;Ù5J_·N§%†wvŝ(ûˆ?ġÊż&šÚÔ+qÛ~†ísÓPB³”X Â·¸ż†YI:Zœ[4u%ö-•-ö<ÍgiÄMĝuÙ lÀÂŜ$Ûnäv/‰ĥ$Oí íCVaŠsŒ=+ġZC.b>˜ÏOR÷S^èєĠˆg™Ĥ: Œœ†ğ<Ŝ×qò+.ì‘.ˆ˜ëôç˜ZfaĴŞĊ~m3ŻÈšiòY˜ l‡(ÙZ°Ĥöħ95_DTĠF<+aĤ¤ êî ˜j'5gj1­›0¨Ä ×b_nK·‚ ğIïĵVÂÁ£͛ÜŜù•šŽ,÷Ç]Ù\¤ib4ÖZŸ’@U¤M×I×ɕµŝ4:Ájw3Z]ë‚ŬìhÓ4Qè쟚 *ŸŠşĤöFžĈԌö.t^y†´á£Ŭ4M%OövÁ']6ğ J­Çĥ$hÖlǛĦ I¨ĵŬ+ôÄ4UŸ™ġĵuimOÍ+Ĥƒ£79ÁĤ&EÔü‘ĴxœÄ5f)ï¨×…úşŝáĥ¤y”Ó2á ]ŽŻÛÔèäžj8fn‹ ïd’¨xœ˘ĥ)M4˜uZlž(oÓċ,ôPÂÌ6ˆ‹)’9EeñÂòé+*ìšôĞŜNSÖ3öQ\…k)S ş–B‡gˆöhBĞÑyŝ›~Ŝ}kj€îK?àH|O+ĈÍÀĊˆĥi¸ĥˆF‡Ĥ%-¨ğz/ïÁ ߆œ‡Fĵ S×—ŽMÑAĦcí(ú `7Š ËĊ͊µ£?#Ì/vᰙ9Z$Ües)ĠèԚšá–R½„.kBÓ{=—â+ü›)Û×ı£—ü_İ“ĠÎ6S·H151:#Iñ×I:lbZ•:ôŸĤÌ´…ĥğVS+Ób·DìĜ£dôĉĜ=cŸ&e¸kí˙'²mŬHït£BדŒ·Ĵ„V+é}-żœCmÁ'y5ܖ¸˘‰h„Âé ™0êù`Ñ uİlKq›™h§àéNŞKoÈJğĴdË'xPÂĵ"#ZGÒ0֛҄˘´œ¤pW^Ĉ£ïXüN—ËÜÂ7Äi˜@É6 ’íèŝ´UhÚârB b÷­ÊĞ:tğŭb†ħ¸œĴ_‹àç=+¤Ġ܄&Níù“jTŠFËĤÊ[xĥk½@'­ŻÂîĤ×&´Èӄ–°Cx›e$‡'Œtı’KYĠ·âß"*1ċê"S ıR#Ħù’Ö’ „ĤˆĥíR)Z3ݐŽi¨CUħw/Ż1:-Ĵ…rû˜|Šô AdíhɁd v” - UDÍÈÄ*üBšµ •7“.A:ÙŽlZIŽ–ħ‹*´âó èŠ'ċ‘Ş(DwuUsoq9 Yy UbTİĴĴ‹Ĥé²÷ Mñ £O{ı4ċٖHÛ>‘Dğ´ÇA÷‰Š=/­]‹V*޲[í§ħC Ŭ"E':–Œ*]PÒÒz~L#›)ġd ĤpŸ }ÄĤ*?•Tù&ġŝZŻIĊ´ĞĞÌ`4,›Z7޳Dљ&ŞKŠ&¤mëßKʂ˴)ŭcñ}e…<ïT´ö†·“ˆ—>‹QĜŠ~;ğ‰iµäí”&;}. q9šGúrbÜf¨^yĦ(xY'”ĤĤ6£7cÚqœîE@—Ŭî§ÑD{Á:&@ç™Ç&§Rš–ÒfE|tœbĠŞÎñzr"žç4ŠŒÂ i¨°uêZJÓ½¤f{Š{żÏVĤ4&§iߛ§´O6à¤PNŞÚF•5gQV.âhé„Ôġ’ĈMWżmĵSA!ĞÍJF³ä˘Lê]ƒ“°UkT'wÈ?Tv“µ£ï0…Ô•ġĵE'"ħmFÄßĞÀ6Wäu62=)hâ~Šğݰ!éİ8ÇPÁ×:ن9eè²*şl3‚h5iÂ„v[ĥí–RÌĞäŻĈEÚë‡âù9#Xˆ—ÔRMꤜ£ÙJ)K£g E£§Á9²Ê#G¨x9;ùӆĵÑHŞ^ğèİbç,OĥA× Ž:˙xàïgÏUŬ4³<ċ ÑH{ £IDAT&­VµŒB*ĠÜs3Ĵ/'BùIëXÖ¸Ë̘v˜ìy=ˆm[5>d³íö -Ux³4Ï)r5âŬëÑW“ŬïìŝŒù1n|Zž‘{5ĤMeyb25µ,I6 ż¤ÑB‹ĵÂĊžöëŸÒĵûÉO­XÇĦŬi%k·eRAL£qĠ¨ÑÀɑáܳïRĤJĠÌĜyˆxZm’ϵG/Nß-ï0zz§ĵK(hA\ó#ÓÉd1_ÏHWON‘H[Ò2ŸŞ&hAyßÔÌR…Kµ7\ËIeÏOôYòŠ_Ûׅġî”÷×E~lCĝĝß²²ŬŽĠĤOmÏË41dıeĵËĵ Á3?ŝ–òiÁìl½µ”Âwc­ × ³–ˆr!ɉ‡;ÌxÉĤE·ŠžòĉóöĊ8˜çĤš˘'—žVĥr´Ÿ š+8¤P?‡î$†P”K‘cwÉhBMVez†ıKó ŭÏјĤ´âéçb‹Ş-JIÌÔ§m[ìĝ…‘ìŝme0I$u pEÉÌó1MÄn!Ö0erEdB;;-'ZôŜ|ĈÁġÇN2§z>ÍZT#”3ÍN„”iJîŒ,¤Bĥڙç0Ĵ<Àħe[\­ĉċ†ĵRАÙĴ¤b­°‹Ä ûN6ĠÓw8muóĝ9ċ,™µm‹ ğXцÙ(”Â@!>$İiĦqï4üT;ž¸ €´rMa˙Ô ż‰Fµ5½ħh|8-)°xu]·›Œ²ü€ĵ#ĠSqÖ6t‹&*Œ?‹hऽš,ç\ɕ_ŜTò =yùŬTĤ­fŠ>…ŭmó³wùRlqdCüBŠà_^G)Ñ3ڕGlT\;´ûîŠÉk$Íş¨ŭğ.§mSlž´žhûé븆s´7Ù Ç^ŜÉ@ٜF2— ù ˘Ù²%?ïß×Ä÷q~âo zİ–ÑĈ]ĞÊέJCí¨ÉQĦş´ÖñE ƒÎa;ş sb[ÔĜ‚p?d4ñ:y³À}œ…}HɕĈ݁b°HííÎ<ÒĤŽéÛçߗNcĜ9ÊmiĦC,Ĥ“':Ğoôäíò?ħ vó4ÙC­Ŭ1é:# ĵÈĝŸßJó¨Ġó˘|Ċmähñżyu#Ğŝ Ĝ^ےµH‘ÚîDїe·LiMıĜ„Ö³B:ÚFJ›iÇaŠa‰IDÀ"mӆ@\bğċb„ĝlŽ'‹ü|y¤ĴהšĤÁSÚäWâÛxâ˘Üäʲ^u]l†Ġşò’…XE‡‘KóDşŻƒÍeÎ ·;Ĉ ßÊżmKI ›”>Z]îû‚ oëîAʏ{Ѝġ›<Â)„ÎëspżS:Ù]Ħ’lqáċ_ƒĵ­AŬ¸ñŻÌğĈÔw&DiDlĥŬ{>I§_Ešµ­@ЉâMA;iŒçYòîĜëfĖV­ü>ħ. +BZLŬmñhXóûh•ÂÇjŸ]pPğ‡mm30ŞâO]jQ|²#Żİ…tûÛ€ĤZœxŸsgé <üžĤ: ĉR!ŸĊH)öŠC³°·›\ċi;ˆ^·c17ßTù[Jġ8cgĦáĤŽìô÷SËV8ż°È;ÚäA|÷ÎÒ.:M*ĵ¨Òb^‡[™ÙíÂSáü‚·OĊˆ+â]úÔŜÍIEœS‚)ğĊ0hŠfıŝÀĥİp딴-Ŭ8žJıÒ^°C6 ĵ [Ò:İ,İd@ĵĵ˘ŝĵ0n*Ü~<1w°Ómóâ“rv ž^zVì܌8ç¨bj ­o4ÏùiŜD‹˘ ĵJixƒò|Ívâ ò]R0ŞGÉĜ•h‘|8 t™÷[%qnê"k¸ŜïÚtŝv(ÍMêa"è?Šiè¤^ĥ6Ä&–9>AœRÖÜa4(ù´™´§^كö;ĵJs ‡Ûîñ’ÓeÚĞ…MMsĴ“¨BBÂA´ö qğ†ĝbĊ§ ¸“™g‡ĞW„ßà~şrK¸L[Ïħ7Änw­"‡öÏ[6ÙòéwŬ8˙SÜ‹<0ƒŭr#ŽŜßĤĥ¤„ƒŸÑĈµ5‘vÛĊŝÛ4³džĤŬp·Ù*-ƒş4Ë?İ}JıèÂ-8‘ŒeÍXw÷䢍WħŸh@f;jCĥ¤Ñ ˆ%#š£ƒ[Á£5¨‘w FN‰mÍ虗Ħ³ïÖĉá;ċ7ĞŞ‹rّċ#òİI£SÔäèiŻ­<Ġ—''Ë8ŒV3÷ò*˙œFĞ }_EášÙŻ{‹´?…am“ĦWà+½½hù¸ í˙9=Ŝ—ÀYżûüí—˙èTÒò2­TûáJÇÙŬ)uì38ċ–*vË´Ŭbv9?'=½\ ócJs*ĜáykÑĵ°3|ܚL‹ÌżÈ l³(kn'ĠşCiÓîkıê8ş’°“§ġ] à˘8nhQ(h_éàoĞĵäûòù3´l™DÇÙžû7ìòİbżŬċŞéĜ!†Ccĉŝ´¨CVĦ@™ä]½°8|sm’aLdçŝÄ6r.?ğs”‚˙ĉh‘R”7ĥÈ Ÿ^µĜÜOLGÍtU䉠x²‹iĠó•Â@[ìÈCŜ#ƒ!vĥ’‹ËÙ4¤˙ĤFšOG/oBĥ²bDëI•ÖßjĜ܊½ŞçŠŜÈŻ–€}Iŝ[$”ÎEiÜÖ]Íiğ”´ZÁĦnîEkd× EêvŠùë‰p^§ôÄ^´ôu::Dĥ)ûĊG°c€ùiÏéÏ)Ĵa_ş9-lpv’·^ ğ2Ĝ#Ġm¨E‘‘APÜ áYu7ÒĴŭÏÉ—g(-U AW„mĉŒÏ?À#°NÄ˙fPjŒN†|­ó’ßßËëżéÊÏ(Ħ]›('.Ô=m`üúħĝ$??§Öl‰(í=,µ™ß´ IîL+µĊQĥ`ĵÈĉnF[u–iĊî4ÙŜ9›âèQO 9úMù„½ŒV87áîRħŠÖ"§'âÛ!ÔÜ/†\Ġ9FҌݲ²Ô-í÷Z{Bé“˙£Ĥ…÷‡ĉJšwh-IÛ½?´]IÛı?4ç˙FÛîï¸Ŭß9ŭ˙f-Ü_Âáŝ½ŞÌĵ´÷™fß?Xdħöŭ£ġ,öğo/Ġú?=èħ,İ‘½IENDB`‚gamera-3.3.3/doc/src/images/arguments_dialog.png0000644000076500000000000004520110714675724020614 0ustar chriswheel‰PNG  IHDRïID%PLTE        * ! 4)  ? I.#7#))- _';G(60#$sV C#G)+-+=))‹/n60d 43-:2&!7Q)7G#6_21R€!$E3E[%?˘V=(HA@6GS3EoI 1GxK–™'KCSd;;BN@,\;ƒ7u>p>/“5bL59RŠ=R…CTm@S~6X[QA7U”GWdUUNuM"°<›G!@^ž[]Z,h§>]´'k³jWlGašaaTHb•¨G#’S&Jh}NcŽ>eŻŻ?LHfŞxaIŠ_(8t—‚a>3t°YlxµPMj°›TTĞW=xĤMpħ_n‹jg˜Voޤa$UoµWq]pœppi<ğVuµÂ]$WŠZ[yşN|Ĝğ[bd}­=ŽÀ^ıÂj&g~ş÷Y°rQpƒ§9›U‘³ÂoB™V„…zk†ğrƒşw*şx>z™=„~´>Wšo˘~ސrŒÂĴ‚^œ|°QšŬĵ„1³‰0†Ž l–}’t™ş~…~–żYİÜL´Ï—™–ùˆ•¤ŒĠU‹ŸÉwŞÊ§BĴ˜ŻĠ™@\żÍ“}Ĵ˘Ĝ4Ǜp–ĞҞUÌĤHÑ e˕²s½Í ­ÂĞ§ÌŞf„ĵÊÜĞ:–ĥÀÈĴzıİŒfÓÚ¤¸Ŝ…ÍÙĵBĠÁOĵTâ¸p£ÍÒÁ£ÌŬÄ´ĊÏŬÇtĉş¤½ĊÛßşĵ‡áÜÀ̲ç†ÖÂÑÇ´êÏQáĴĜɧß͌Ŝ̝ĤßĜÍÏÌ´ÛßÔÑÂÊÁÄÙÎÔÛïÛeÄÜßŬwàÚıÏÙï´ëĉŬßÜäßÊß­âáÑÛâäôĉ’ĊáïáġéĤŜëÚßċĝñĉÄċçäÑôùìëà÷´êìöùôÀŜ÷ûçùċòöċü÷Íö÷àŭĝĠùüċöúŝŝüß˙˙èŝ˙üÜeúà IDATxÚí |Ġ½ĝÏn²K6!M‚¤‘†‡ĈXP"J½WP ñRD…ĤU5”‡<ŝôJȵ ĵE êlMn…[QQ)à+P´†W)Uĵ5…”!@AšHf˙ç9sfvö‘d²³żß'™=;sĉĵ{Μ9çw~)Dˆŭċˆ ššÔ{ŭN+Éù#ˆ}$§7bĵÑĞ;­%g‘"¨Â1gçЈĤ¸_5 =féŒ3†­ÀžĴ‡a~+‚Ĉj‡1KC<ûĤ’$z(ÔE-8Ì˘+цTĦÑU(R5µĜOƒdU+½˜B(Sż<$d+0Ĉ19; pTs#ÁŬd <§ûJ<Xé{ Ħ„zşTĈĝ=£éĦP;ùqM²8è_g‘ŻÚa=„ ĈÛh(“ŠüĤOς)ƒì`,½˜†é‡–”³_PcŠ1ï7ŝBë îÊòí·ßVà9,òIVL°bÊâšbéF\4×Ĝ5tİ?W1qk…Ĝ5şğFWQK\³ˆk–ÁU0˙ÌÀ|âʟ!ÎM"IÔ5‰¸Ĥ)˜bĵÊî((`Ħèá1—1ĥV¤ıHËïBCHċ°ü†KÜ™)ążâì -žAxŻÇŬĥfŜßjĵ H &LġpÓRqŞŠ-…ĝp‡ĠĦFû;ÜG³´ rÁ␯- _ÉĦ€&L™H4/ùÚm4SĉxgSeL) 4ƒV9§EbYVZIê{SP‚[ÁŠ‘ŜiÁû[‰÷èbâyİż@M)°8XB.2 ġ{ …3ÜÄ×H:!£ŠĵM˙b'&‘Nñ=ÜW<^Ğ”jùœ_3} ĉ~Ë9p$í†?ŜßJĵ î wŝ„ü–á.SÂCĊ=|–á2éCċd´ ŝÔäŭĊhÜùV¤M‡‚ż5ŭ"ßXCĝ­éɕòÑÜĴ8ŭĥ%iŒx)í{"Ċ=Qâ]È~Wùĝĥ|ŸMKŭŠ‡…ĝ0”î(jÁaĝ,a†8Üç÷P@“Èa 9àtççó‘Ĥ?x7çi_'Ĵ\ırĈŠ•ùV2Á|8ÒÔo˘ĝÊBž¤Ċĉ/-zrÍù(‡P bĦ(?s™ú-{™Ñ8î˘ mĦ™÷ĉ î‰uŜìÇEBGï7nqáÇği݅И¸Š}]8ġĈŬQÔ5œ¸†Ï"YÄ5ƒ¸fĝqŬG\¸ìħk’ĉš@\Lü_yżùħ·İ/föíÖß+ż˜pĤiç™Ĥ?îêŭ&?˙M/Ó³M˙˜²ÓÛôz~ŝŻŞĵĜŸßDOŽûnĵż˜°½İ韯K!OÑâ-Ò2#`šgiy£ı, ħ\’’\HJrĦEé.ġƒÖhQŒġ£ĉ¸5Ŝwàf„†’Oî €ğĜîBâ* š-š}İHfĊÍ\rV언ǍûKÓë×5z_“?集?ĉŝĤİ$ç7Ŝ’ëŜôŻëò˙Òôò›ŝµrB…÷Kîm:Ċû͘ŸŻŭ+|2żÂûòèÓŜäüĤİ ŻôġaĈġx BLó,C.CÀ­—ŸßÊä7§5W{úH}~Oœ(p Ŝw°§†Ŝ<°ZPğĥ vßQä[$Aj÷ ­Ĝ)ĝ)Ö¸ó›róŝâ=œ‡y{ósüĤéġ/5­€yç0ŜM9oâÚĦ^o_\߯ŭoߟ³“/çnê—wßšVŝòá !O2ĥ/ĦÖîY-İŬE+ÓÒÀ¸E‹N{>ĵżĠj·àÍ:w@„p·ŞçÍú}&Ü3´Z6Ekh¸_jú&o⯚ĵó'`ˆòq~ġ/Mû•Ĉ›}^Ÿy˙_Ó?kqYô?Ê{„3^oÓˆĈ|Šï$ßT…€{x¨Ġ@oÌŞÓÌ%½¤rŠží&›yÌ7ç½ż|‹·ħ|ë·ħ­ëž[ġJŭ—Í2wïžßW`xïĈÔ0,ü~yì$q„}ë·ïœž“GNĝ= €y˙é×ċ ÈÉùı8‰y?‚C™ĝû†o†ÖB{½fŒĦSZäç5Ü]a`$!+şÄû[ƒˆñ–)CÉ+Y¨#,A^†ö"f~/+jñË÷$q`ïQ“šîËËË{ËûMáO[ı~ŭĞÏN˜âmʙrĈÄû%oeŜ„I;'hĵ4ŭâĠ—˙°²`ĝžor(îI-} ^ıĠaĦ?ĉ!żI:nfäŭ­o2ìŠĞĝ°“ÈĜ܄‚ ƒ¨Ôò *qŬA\£‹µáĊÂĥ§’AÏÑĤáÏ/5UĉŒ=úç^oî ï7×M™ò’÷ë×o÷^°ŬûÏüáÛY?öb’mÁ™ĤÏüŜûí·Ŝ _(Näm:8ŭ7ŜĤo›^Î1Ä1ş-Ğz~µ2°*!˙Ğ+BX@ÇT'‘áÔŜßZó£Ĝ˙V;„:~ŻŬÂì;,$S -ĉ,~çI Œó$ĜġĞ•CŻ#“ +_í;qRvŝ ÷ĆŜtô›ĵ\7`tNŜ rv\Î]3ŠúĉLqßĉcsL-Ìın>™7+?'gÀĜü‰ïÄCš6ħ:è™ÑrÂÊÊO 0dä6ÁğŞŞÊŠ7>3fiQaÑĜEEEVb×°•………~KškìŠÖĈRaŞ~(~À˙…“ …K˙ÊEâP0ĉê=ĉ™"ü½è÷Ŝ?ŝñ;½Ż_WĽ’ÓôPDŽ3&™*‡RD³F“““Ĵ˘ÔÒ$ıĈ šr>Ĥ %9ö·C†áa‚…Ecr0Ñ*ÌûX]ƒĵJÎĉĴ`žñßV8‡˘ıŠd×oçV²ÛÌgˆë+×RâZ*\S‰kj‹\Ċĵğž]ˆ]Ïc×Brˆœ#RH˙ŠĜÂë·oßı<çĉ"qµP÷PX¨y×îĦ’§Ò8hlĊ-NİĉÒóëż\ü•¤˙²7¸ 9œĝİ+rRÎûf}z2—Ì3+Š‹‹Çd‡… Ç\¸żëâz†ş~káZA\+Zċz–¸žĠ]K‰ki W1q›\ôŸ †6l,v1\•\ĈPBˆWriinKÎY™ŝÖXşš+[1ùċŜ˙ô+9ĊĊ÷3+—.]:–ž a…8<ۖŝ_ZĵT¸ô݁%„žµ:´!zi„ħˆ9²b†1‡ ĈËR¨ÂQŝ_ɉħä¤˜·;ĵ7Ŝ Àxƒoà ĵA€7Ŝ Àxoà ĵA€7Ŝ Àxƒoà ĵA€·AJcD€7ç]cW)ġJĵ5Ŝ^›JİWÏċ~à ĵ[Àي÷8&À;ŜÀğ=óÎ 7oĵÛ1ïĴĴĴpñFe]Ï)ŬQügÀğ½òÎÊbÀÂûʍ{ìQżóĞšÊìɛ·èaá]M?íÀû[ÇŭíeèŻá­Ĝ†÷é_äż´xÇ oܢOù—ŭxï×%|ĵŬĠĥàßd;Ŝa?—xvVïöYżaüÜ?ï ˙‚çw̆ŝZlñ†÷ħĜâ˙%Œ·ÄoOŜ0_ĵcv>Ô^ĵAżxoàğç6â úç°$Öxoà ĵA€7Ŝ Àxƒoà ĵMó% ĜëħĦñà-x{cA"Ä{ ĥ%oì9ûû.CÀ۞ĵkjj·?ÚxÇ or¨uïXâ]Ù Êz_Öy™˘,ïïYĵmÌğöœċ`âÊVÇ^eċnĴcÔònş3ŝ1^0’xëâÑĜQâÙ°aCê+¤uŻBQËûġ‡½ßd#9·Ħ=ïÛİZQf{F`Y£”ŬäŬ܇ŒäŜŜ•‰¸‚—8İQjĵ‡òN>ïŭ&ŒäŜĈŝÚ*ôR›z÷j·âŜXµí‰VŜüÜv²‚‘œÀÛôŜĠ7ŭ˜²ġz—³ÛZĜíY60xÇĜxŞí9†ŝn—ïcÓà},6xóA-0˙ ĵ7ŜÀxoà ĵ7xĵA˙֗Ěoà ĵA€7Ŝ Àxƒoà ĵA€·I`D{=`ŻÇĈĵaŝxo£T^ïr8ğ='ŬĵíÌğËüµÛ_} ?ħxۙ·X´×kàŬ˘úŭĜnúÙĊĤ ċ3d­YW'ná·öÎrĦπ·­xo½Öy͂#ĵ~£!Û¨m‡+7~ìQj“+Jĥ[˙|ŭĝ ÏÎğšÙò ëœÇ€·=ßÇĉsŜŠfğ)s= ĥ'ob_чw :˘T:€·½xßŝö—5UŜŞ(îjïƒĊċ9.àm/Ŝ{ÇĦ·Ûhg…‘·²ÜíYíy §ÖÖtìŜ1Â{ëÛÇŞîL‡ñ–Xá½.#ÎÙ†ù1à ĵ7ŜÀxoà ĵ7ŜÀ[â úç°$Öxoà ĵA€7Ŝ Àxƒoà ĵM22FxsŜö›ûÜbqxkĵm—-YÚ6Ŝ[€w,>˜—áHşĉ“è7èĵCá}0yŝîÚíŻïáŭÀdÍ+ŽŜi{%ŜËğĈ{–Ꮜ¤¤çµàm'ŜŽ3ï•ğ•²ŽŠ’°GİŭRûŜĥâ}̞×VáTf£‹Do¤•EĉSÎŝü·.ı™yD{™G­ Û^xgñ˙0N•Ûó²›GŒÄ[ïr_µQûˆfŜÔ˘°ùTíöG{oÂş$ö…¨OdèÂĥŜYLÂÂ{àïÔ Q͗¤KÑË[ħ>EìQ—ŜşI^ô.lğİßî6óL|lÛŝí×ÒĴş7V-A{”·k”²E|Ĝwe'QżġG–î%mo{­h¸Û>Ŝ²5υ:üˆUìb·gÙÀ·+İÛE|ĜŽwíÇ9/ošuIًŜ…m?ŭµĴpġ×ì#:ïx"Z-Ŭț\zXÌ­Kx³q˙܎ĵ}ë·ÔîÛİZ8/ŬxWê^àċĵIGT)Ooa‰Ëéï@şKïÂĥŜ[ˆïßÇkÖ¨ğw×l”¸¸ }À\šuIù.½ ĵ£qĵ'Â3ç§g´‹}ӏQ—f]RKïÂB{ ĵí#Àxoà ĵ7ŜÀxG1ïŭv“-瀷à ëK`ŭXĴ Ŝ Àxƒoà ĵA€7Ŝ Àx›ĉK°Çö¸lÌÛvY}àŬFŜÁşñà ĵuÀ;&x+ÑaĞ x‡Ê­JĴÁ˙k5‹\[{gıgJYïË:/Óxg“ġvi;´Ü}U…˘_ŜÑĈû–Ŭež!†÷ıj“+JÂg?Pĥ:ö Ŝ%<zú6Eżĵ£w5ŝ?˘ÌÍ$'ˆEuÎc„w‰g† İŻŜµîJî"ê½²£˘_loĵCxĝÔŜwñ£=.¤˙ŜÌ"×\BxÏöŒÀ²F+Â~Ġş™Ħ—Z§˘_loĵ7÷;û֚ïE ïpÚ2ñfıJpmŻt|VâùrĴvìSŠ~ħĥçÁz ‰ĠÊÁ”(z~‡Ï—‰7·ÈµÜíY“™²ġz—³ÛZŭ‘˜Û‘˜.BΤÛñ§vħ=òÒuĞ-ÑÒ_‹´=ښƒ}ïܧÚñ˸whÔñV"Ê{ëÛÇŞîô5YÉ~ÑÀ;H4ÚÚóó^—çìżÇçtÙ4úħ Şx[ö@£Ĵżö™Bçmٝ}ĞEïcÀğĵ-{ µ˘jĵ%ÒíytónIxۓ·Ÿ(ĥ)o?=PàmÛö<xoà ĵc”7Ĝ‚ġ%°ÄĈĵ7Ŝ Àxƒoà ĵA€7Ŝ&)µ™À|IŜ5ĥ’R?öĊ€·ĈÛVĥ×J­ġ7Â8˙½x۟7³µuD(és!jù·ïŜ6äMÔ(‚îó`âüUKRށ·ŭx[9ÇM&ÇQOoÛòfí97FŜlÎTLĥ·PYWçsÀÛ6ĵ5ógÈ)²"Ŝh{ ]ıñcŽúŝÚûœ·fŝ@çm°½EÍ&oÛÔoaŝ€µçċ™fÛ[HŜvâ-Ìèŭ5£í-àm/ŜÂüAö>f´½ĵmÖ?6ĥĥ^ϗÏmoo;§y=‡÷oà ĵmĈ{Ž)Ŝ0žzİy”ŝ·ŭy#{0†öxoà ĵwûĉmiÓx Ŝ  ë bM€7Ŝ Àxƒoà ĵA€7Ŝ ÀÛ$0_˘€ŭ°ßbcŜ ïö[€·_û-•×ğÎnÏoòĥ²ßÒeŝÚíŻĵíğ^àtƒö<&ևr;-]ÛÍÎ.ïïYĤd=i;ÄUàmŜÂNËÖk×, KüWîVÊ:*%e]şvxG{í}“ŭEY?>³†\Ż­BJ­{‡’;Yş ĵíQż…*óÒqû~óˆ‘ĝJż‡j*ŒW· x ;-TˆyĤÔ zÄSÒS1^Ŝ6à-ì´Üŝö—5UŜŞ(îUK6э›|qxÛĤÎí´Œï‡:܎ksħÛ³l`Š˘äzHĠÖ]€7ĴŜÀxoà ĵwŜ`ż%ĥxƒŭhρ7ŜÀxGo°ß7è#zƒXà ĵA€7Ŝ Àxƒoà ĵA€76 ̗(`żì·Ĝ˜7è;oàíĦC˙ÔĵcwMíö‰²ˆƒe!oĵ˙ĥ€—·Íx—§3Zî:´ÔĉıC”î(ŝ3ċàµqŭĞéĊîܐ ŽnŜdi?ċ=d›0Ò2nÚíìrîbċé{éEbÈes:Ôï¨çíáĵĞ5#-ÉÚċÄjċ` ½H ı,ŜQߞ÷PĊa¤%Nżì` qö{¨Ö]ĵ£÷¨Éoa¤%yŻOŭVˆ!—ı} żŬïc5UÓĞ5ŜÂH˸ÁğĞÖ+ŠğZ~“†ŸrŜÑ=ŜrûE-Œ´Ôĉıœŭe´³Bİĵ6žöω§ÜŽÇ€w §ĉ>ïß1Äğ²ŭšÓŜà]6 Ĉ×`~ xG7Ĝo‰-Ŝ`żÚsà ĵ7ŜQĊì·ä úȰŜ Öxoà ĵA€7Ŝ Àxƒoà ĵA€7ŜÀ;˜Ô@Áٕ7ö€œŭMk>‘Ù°úğ2˘#ż[L9mÁàí×CMMíöG{ĝ6ZsıyAt<J§•nÙżË´RàíÏ9Pûĉ“AOµCÜ ö3%ĥÒR½ġ²x8Vv‡ċ]=ËĴwVkÏıŬ–èá½eÚ~eçÔáSwz½ÓX“^SSƒ0ŸîH Ğݽx×~œóv­Ü­”uTj׊ç7_÷=ĵ”î__áŠÂá;½[Jx 3ƒìÄ;>>=ÌܵUH)qžĵı]‡èÉ3ÔS ‹ó‡ß4ĠĞL3&œ7^Ë3’’žgV§¸*v†ÊÖŜY.ô™l¤ŠŬE½Ûİ=ïۉ4Ûe7‰”ÙéZ˙Ü!?Ĝ£÷ÈŭŜá+ò‡ß‘3\2+ËÎ/%aRû%{Xq;Tü ùµ'/Ĉ>“TñğlUżÉ;‘TÔ òm—E´ÖïŭŜİ…ï¸É˘~³ĈKI}l7?'ìPñ3XÖ91Ŝş‘*~—Ŭx+ĞŠâŜXµí)[{0'ZŸß[ĵ;‡ß”s“Ċó›5^ÊÖğÜWm4ĜĦâg°_:ċ­_äwَ·Ò7ŭ˜Rìö,˜˘<ëîĵ†ċ‘Ûm!’âÓÛ}f·Lózŭs-ƒĴñ"vIşÁ?ƒQ*ŸÉù]vâm+)-‹ŻJM?hÖx)o×(e)ÔꔰCĊÏ`9èZ\žúL6RĊïrWïv ×kŻb_cùçWoWR·5Ìê·CĊÏ>ĵÛ³†µçâ"ż‹xŜí³IoËĝymÍAG”ĊÁ|hȲġícUwĤ+À;Fd]Fœ³˙à ĵA€7Ŝ Àxƒoà ĵ7Ŝ Àxƒoà ĵa½żmy‡ĥŜjFüUQĦ£ ëŭ²Ŝ˙çğ•y=£ ğ­]ïż…ŝĊora½żŸv‰ÛĵŜ?èҐB×Cĵ5‹u$mÂz2ŭ7ĉÓö+|‰XO aâž/IS†,Ú4Ûòi½ż2|rğÏì‚Òŭb7'ħ^0oä§b_Ŝ!÷Ÿ=ĝLğÏ,YLÄEĴĉı7.î××ĝ'˘ĝ†ö•uu>§-ŭ·i{Âz˙ċ=޵˙ÌŽÜŻo×6RĉmZÜŻŻñ;ħêWnüĜ£-ŭ·)ïàëŭË<ѰDršÎÛXżM‹ûġ5ŝĵĞɇXúo×ŝZġŝi·îßżżŭ?ż·x­ŸßĤĊŭú_ŜŠĝÑۙw°ġŝµÔŠYôÏ5ŜĈŝıÏâ~ħĈßoħô߆ĵm%ëŭ‰ġµóâ~}żŜbé?nïÀÍëŭitiqż´Ĉߚ·XúĵÛ}“Ĥñóh]úóĦ­‘è]úĵ[#Ñğôxǖoà ĵA€7Ŝ Àxƒoà ĵA€7ŜÀxƒomıÈ ĦÍxÌËp$]ó‰ŸsQĠ:Œ”x[NžżğvûĞöà]£ ĥ–&Deĵ}× s%×lŜBÒ4-k–/­Ís;‡Ŝ•‰{£™·•ı’Xĉí–u³°béì¸Áj·ŜWżĠġ›˘ÁÉE­­ëfKaĊÒÙdfŽ ÍÎ<ġĵ‰)fœ¤ËûJ­ ?Á’÷Šv -wĊïÔ½ò£iKgĝÉ´ÉJ´óŜž3Y,nνM)éS)OÑÚ14d[Lñĝ°‘·X:›ĵ—?ÔŸD5ïĝxg·ŸžĈ Jҕ~˙ë<2û6­CĠJLñL|lÛŝí× Ŝbéì¸ÁğĞ֓ÓSŞ£ĵ~³ç}ŒW˘ŠÄê.ïgżŻµc6~ >Ŝ²5υ:ü¨B[ ˗ÎÖĉıœŭé‰=ÎĜ€77N’ú_=•îuWkíXÌñĥ‘â͍“ô‹EYçÄïg˘Ŝöä͍“ÌE{qŭ)Ekǀwó†ñs˜Ŝ Àxƒoà ĵA€7Ŝ Àxƒoà ĵ7Ŝ ÀxƒĜŒw ”¤MxK—É^Ĝٌ˜ì•ĥѵU  ÈíĴì×âbÀ4‚„7Ù ÛT­kjȆmš/فa)ġĴä×â˘o(€c$xXߚ†BݝêöĊçÍVúÓ½°Ù²Yİ”9of É{gû~CòÉî(žngvıëŒë'ˆV%xÖà˙µ8”ñže,¤h~X:@ÚĈ›ô§Nìfƒ™·ĉ¸wĥñ2œ”ë7V,EVq’‹è–Ŭež!†÷T”•ğ•²ŽZ˜Âğ ¤mĵĞ5\ҞßŜšŜÙĈoÈpRĉ̓‹o‘Uœô ù?˘ÌÍ$jĞô0e?@µ­ĵu\³ġ $ûBĉ½³ßá¤Ì›‹|~Ĥ‹üŸ.ğyÄHŬŸÉH˜xûĞßşŜنodÏpŭ¤Uŭĥä-]”x§VÈŝL~@ÂÄÛßó[óaÜ;Ûĝͽqŭô“îjßç·%oé˘ÄÛ½ħj ÚCCA>~@Âě/›E~y÷Î6~+p\µQ?9ÚYĦŬk ù‹Sâ]ìö,˜BCA>~@ZË;\C6Ż€·˘|ı5 ;†xw!C$ ħӞƒoà ĵA€7Ŝ Àxƒoà ĵA€w{”R›ÉH?ĵ9ï[IéHŻo·×N‚y[ċrÄxoŜ6ä­m°éo;òlnŜ1Á›,• ·my“ 6ÉV’ĠÊŞÌ3ÚΚÀÛĤĵé›ĜqġàÚÔô5£‘wӝñï@Ä›dá—ëßoUô5£‘÷ë{ ĵƒ´çÂÑíU˘vgMÊ;ûwsàïU=ĴDíΚ”wòyï7éÀ;$Ŝµİ{·şÖFíΚ”·?À;$ŜßĞŬŸ£tgMàƒçžÇoèŻĊox‹-Ŝöo)ŭoû§Jf/€7ŒŸoà ĵ7n˙ĵ÷[ ĵAÖĚoà ĵA€7Ŝ Àxƒoà ĵA€w‰tĈˆÓÄÀ;üö\J ӕ'ÎP#ŜáŸ/•ö—^œ8Cxo˜ŭñxۛ·°ßÂE7R ĵ­Š=ëRñÎ or°…ŭ–‹;++ëÒqËxû-úNïlSuħ_{Ԉ0?ƒ"É;+‹•;/öì§!mGäâôq›xSû-úŽĴÒVìQ%ÌüŒöD ûú"ZìĵaċĊ^ÒIQ6§G0N·ž·°ß˘ï¸,mĊUÂÌÏÛÖp´è6Ġşw(ı‹"gĝûkÂĦï¨.oöUBÍÏË>œëƒ­Š½ßCµîŠĈ9ŜRŭŽRŜÌüŒħìıŝżT^À‹½Ä3·O$ôq›yKÏovZì×-ÂÍÏŸá´ïa5Œ]›è~_‰`œ~#n3o}GuÎ[ì×-"ÌÏ ˆñĥĈÎíxL*Ċñ†ñóPßżÛž[Aìġ„wYWhöz"°y8úkïS€Ü˘nÁĞÄŞ˙¨2ĉÄ^Ox—m†fŻ'ìKEYżıĊž²›GŒD†=Ĉ£Ċ˜O`{=á]–š½ž°/'o^‰S+d°L˘Â˜O{=á5ğš½ž°›zˆÀóÛ½ħj ÚCÍġD•1Ÿ`özÂkV%4{=a7ċNŜÜbOħÛ³l` 5×UĈ|‚Ùë‰ï özÚo›ŸGş=bݧŭµç6çéŝZ{=íŻżfsŜü…hZ„ŜÇÙë œÀ;(o>à"4ŜrqŜ0~ĵ7ŜÀxoà ĵw”ŭsğ Ŝ Àxƒoà ĵA€7Ŝ Àxƒoà ĵ7Ŝ Àxƒ´oŜ*ˆxoà ĵ7Ŝ Àxƒoà ĵA€7ıÈĵZĉŭ@‹#¨?Ĉ²hĵTGïË. vŬOTdQTŽż[ĝ]îzÂʳ‰ì¨y­ÏùMž€Ċ¤k\|·çġï%™Ӌ –rb|†£5;‚DĵĞW/ÔĞ×!;ñF(xĜWŸT·i_6h…ÎiçNj—žñ-hížMÎó vô‰azwyüg§½ğFçà˙…Â{›ßd¨ċßßxşáë_÷ĜOXħÄ{ġ˘›ĠttÜpù-´é=ÈÓÁEöÌ@ĊœxŜ7žÖ0ÒÎ×'ïġħy/ɈC„wyï¸Îkú²Œ/ĴÊèıäèĥŒ{ëwˆf•wu vGñ_ñӃT5íŭ<Ç`5Ñ)Î݉(ŝñ|âúĝŝ¸úŻêšÔù éžl|şù6RnĵìòÏUġ—]œ?SĠäOEšVe$uxžŬ^s1 ‹Ù''{òµ3ħw³Z?W– ­•fħ˘²òÌ 9ğŒäĴá—sˆ”ŒÙÚ/‡Ä“PŜ;İó!íÈ{6züÖċ‡Uġ·½{ıž'*{g9.ïuRmÀÑß~.JxÏFwWoĵO$dîıÓyóbrâ˙|éáżŜ‰^áerŽñ²˘ĵ£ôƒï2?¸ñk§ZÒG5×ïŻ¨ó0†ġĠjyŠtOê"µĦü¸–îğò¨:ݧŞ}Z=áďu­â&UŽ`†T³‡ë*·ç§äħMâI¸˘â:ÎcVs7Ği‰›yĴè–êyΓ8Œ‰¨•ŽêŭwŸp@JF÷CZâ8O‚šĈŞ|Ú^Ğúv8V‡=ċžSɇÚċsuN½:üáfġŝÛ˘„w:IÛó4ùÀjôvžċ˙j*T‡xŻÈÑÌxŸdüî OĠ]¸Të2ĠQ3}x'â‚éDğöǤ{êQ||œó ìÊŭïmÛ^¤á7ì˔{Mİó÷hÁhçÔŻoD/¨4B{ç1—¤7VyĴ8 pĞ=ÛĥmK}GM>il›Ŭç ŭD’Ġ=ŸžäfŜßáÄPçħäq^mÀÜOÄ"aD ojĤĵ§ûÍĦrŝÏ.9™?W³Zb·ü\üß4HÍŝԇ7ùàÛËoxAéž]ägäĝİ#°<‡›ĵvÜkŞĵË}ĠŬ€qh$žM)´w'bêüNË‹•ܘŒżê\‰f­×läí8Ż÷yÔ²ü“fŜ<çв~Dò£Ĥ½×HZ§]lÇŬï˘ƒw"­Ä¤~ÏÔşnüßPżÓÎZñ^ĞF?\܏ÏTӎûĞßİĈ6an itûè%Ŝ?ÂûÍ1öš.ĵ˜nÁğ'†Ä3jídñ˜ğÖûiŭċLÔoÖú ü:ÀP$7òN>¤w×x°|Ì*êÇ˙ĵYQà"sö?K›CQÔ_ˆ/ĝ>y~':ço+}Kĉ=]~~?•ÌÛÍ[Ùq[Ú;¸È>˘ĤY>żŬ{OŭĠîéGPïTµ ~î~}NuUœz7áMÒk÷o<­–§³X8ž?ŬxşñëGŜc?’ì9´“ĊcÎîQŭHÂ=ÚÍâù+b iRvZ=uT½éS[ô¤Ğgn<}ìŬӐx~Ċ5–LóÛ½·a ’žò}ŸVĥD ï×;ú‚ĵÑċÄŬh‰7îŸ;/_ĈŞğn•yOu²‡aöìəĝw5ç ½îp_'zӞòkîΈwÒîéBëÑÀ'HבÔ˙;ulÜċËvĈŭ/íŝ]I¤=ŸJû[ĴOuWFœó*ÜËĤñ$~Òî‹y³Û³ĴË;ÚÍí¸ĈòdoY…ĦçUôžşÜĠy™żSŜ錏ïüy=Èpv~Ìnİ÷ÜOż6ĤżĠ÷×áĉÂúfgäRsŝáTzÔK(‘äŬ›à~žlcú[u˙ÊjġëœÉÖ7Ù×#rİqU4Ÿzħ‡]y‡"͗âŝÑ.çċäŭÉêĉĞ=k#—š_fàÛÑXĉ ĵA€7Ht>Ĉğ„3²Aĵˆ`–Z'Yí7B‘—oüÊéÛġ „ôĵ¤LĴ%˙ĜıÊ}ĊI)qó:žU×ež×%޳{ĉüä#Dİ‚kDpŬ ݁d˘†ŞÒ=HMüßŜ´ôÄE=ĊjIV–ñçÉĠ$ÒHĠËÄi>ÜÛAÒÈÏwG[3³sĜ4HhDpŬ İA:ñ´³áŝj]Ïfġñ>´eÖ.ĴßBMB´çìĴSWŸ°Tú ïqZE"Thtġ™÷¸{‡Ğ·İjM9…´\µ@StÂ |?°û9޽ŠÄğİà†Û iâ§}u+HdO™ë·7+e‘ˆu=Ż–ë7Qċ í4ñû¸ĤÁu+´†ƒ(ëĥ˙ò( Óòsçĝt[‘ÙÁş%\M‚ö×VÏä™íĦĞOD7{K9'"*ä}çĜ‹™šŠ)£Äğ÷47ò6Sĝğè"úI·o<ÒxjŜ­ŞĤZÀ¤ßÏó7wqóŞÛtž%h‡á6)MÏoI·‚FöĜü>öžĴĦñnè)³ġİ;ğ>ע¨r…İÜATİ‚kDpŬ ݁Cbjôŭ:_Vâ§êÇWž§ĉ-Ô$´÷1ÔĴžşóM]}"‚ĵÉx‹“Ž·MĤ"@Ç;¸&™P> ClàCĠüİSÈozZVòüôœ*T ¸˘ƒ^àû“Q<&q!/˙Y‰ç¤×Ĵß&IîŸûèV 6Äg„„ÄۙôĜwRfŸĈÄfwÒ5j²ñÏ£ŝï‚$\·‚kjà_k—Ĥ{¨bJ"óeü"ÒÇ[˘ŸLmbŭüğ&ħµwŻkÈx rĈ_N´żùùĦè^uz22ĵCż~Î ˙ŭ¨µ…vµ6\˘[á3ÒD´L˒ZŞĵъE ­O Q’ZPm?İ•…xŬOñ–\k#t+L²Š´@ê(²¤'Û'ïpHù‚K{käíÖÜ$t+Lò*˙^˙gÉ*otG(=ZxƒĜs>xƒD/ïÖ:ÏT~ĞÏjŻDBNXcóĊâ}ÁĊ†ĦK Köԏ{Çy;0ş Sùûnì•Ġ-˜†¨uüfkÒġÊşê“Ööm}¤~ݧħ †#|eNÈċ_Xvó-fiŜ˘>î)Úíżñ͈Ŝ‡ŽS­ƒ˙'/Ù+ë´ħùk:5ìÂ˙ÔÚeŝQ{5·Œ_³ĉ$öò„Ħı!?]56ĵ›<Ǐሠ''d]P_Ż,Í[ìrž7EûÁ×µŠ÷j§Vİô%{uß#ùۗÙ6Ŝd$ùp0Ŝ–ñ'žñuî 0½Û6™]~Ŝ‰[•@l†+´(-Í[ÌíiQÎE„÷8ŝËLŝ”üñızĤëB2aœçäLùŸÊWŻŝ›Šà@?<^çxÏhÁ2~áĞĥîŝE&M:ôßI‹7ȕ]ÏëÑ7<Ò+£ÛIúj‹ òŭš,üˆŝ´ä°Fg>HŽq*ˆŭQí{ƒY•(ïOrñEÄô„îĦçS­ż+î22l+ʅGÌԚy M…âš,Ç=4ó,ŝHŝXiïìAüħr˙‰ıú.´-İ÷¨Ĉ9|aQAÏh İ|ġÄġžùt”™[DHĈO¤ş>&‹–ñ k\̀LTN9gÒ$@ިW4Ú3G-{Ö Òƒżr³š}\OÖŭݍê£st"9ĴxiĞOĦ“Ù WT¸ïÒüĞĜİ~Ĝƒ—à ZBĥm Z>_ÜÜ ?żyÄL4óŠwp´"& Š ïòëïĜŒûJĝOÌĠği^vġ4Íás‹ Ò`l İ|2rvc ŭÁ2‹¤)›ŝ'“EËĝ…5•İp…“&ÒFĦ?{V=ñ–SÏêkˆ вy URĦ@‡HĉߔŸ ŬE„wbê¸Ż„˙Ä\=ÓXÀ-¨qŸ[TRż VuÒ-"Ô9İ?8oĵn?bÍA^pµıG³Y“€IÛQ£ħ5-xƒ”Ê3ċÔ½óäâĈ½IRAìG¸Ùc‡X•H·¨àÛ)ħœÊWßäPXDPğ?´yŽÉ"‚uü´&djĥpç9m‡, röLŜZİF%Gİ~ ĈmÖÌ:ı?˘Ôó$Ä~+Ž} Bqöô"Wp‚HO"Ÿîsê ġ[7oÁ󖆳÷tOšy“DŸ)ĵ§gÊŬ%1‘˙ĝàÓ ï&5Ïás‹ !NċĞ·â*<ï^Ŭ"î‹_}\5ZD°Š_·ĉÀĠ Ô~‰î‰I“ùñ÷NúւŸŽ?żĤĉ>ÙôĠ̑8ŻÖ4j<ġî÷÷²îÚ-.‹żŝ3£ŸöıúqǓô"WpBžtZ>ğżw*5Z?żuó%e‹VñëÖ¸š:Ze0jñ–ŝzôĜµà/<⎿ŠÖñİjˆá‘,ÒMÖüáäô›„:˙ô(Mħ!â*Ï  ĪćI$:r‘)8ˆ„ @·àw‘Ğô|îK¸ü ÔGK˜ˆ˜½ĉkĉ-xŜVı;/K{‡DË# ­~ĈÇ? ŭ–ÀbmZ´­vÚ:ĥfżÙÊİ‚CäËĦßĊĉ=ÊҴ蓗–wĝ˘ïÒJ³ˆLÁ!òċäĊĉmšçr‰ÍG‡+zܑïÙş;™‚CäËĦĉCA€7ŜÀğĵ3WßĜĜÂLXú?)ó¤1Ĉ;sġċ7Ĉé~†úy‡4+GˆÍ%ÈT„FÒô³ĊĞ2œf ²y†×ÜĤı&Í0Í˜~·Ġ~ĠF}‚•ïô½è+-ÖĴCŭŽÀ\ŭÊ=ÍdQn°À W´Í%ĉZu™Ww œÀ位/.2wµw­:Ç­3ÌÀc3Ĥ?7UW}°V÷kqÑ7” [rDŠwĝçêe?!ñÖ7—ège eÔ À ´ˆC2Ï`YĜïĦß=-.dMġ!`í VuCŬ–#ĵ?WŻÓíŭkv x@z€%}s Qa6 cÖO?ÜlâĞY@È&MsSRġ6Ĥ;œé"ykGs3Ĝhúµ=,ŒßÒ>ÚĠ‰Xg'ĊĈr°D?‚ßé'ıèc(‚†˘›I$’ĵ#1W/ v D@z€oms QaÔ6PZĠĵO}Ö- X$UßiCíòŽĤа]kAİaîƒLgë{XżĠ;•`Żs{ĜÚĈR° WTœgwZÄI.úŠ ĦèĊfÖ#‰$ïÌĠŸ¸NzxqğZ@z€oms QaÔ6¨CżK?çÛ~£I•vÚhpRŞ´Ú.Òc#³úĈo¸wB–Ç“†ŸwHÁŠ­Wô=6Ì} EPôb3ë‘D´=û\}ù•GÍlœz@z€omf›Ô£MƒLÚ›:&żcñĵFŞ˙¤J;mĊ?£** 3Ĝˆ^Ĵ‡…ñ$û+fĠŸwHÁnJÑîô“\´0ñ)ġÎŭ˜ġH"ûüó\}ù÷NšÙÔġRżµÍ%¸F…QÛ`TŸÙéßç-'UÚiƒt Şâ§ĞĊĈôbĊĈoĜ nòöĊ'Ó¤îšĴĦÊ{l˜.úŠ ĦèĊfÖ#‰,ïÎĠ×'/:r䈤 Àí|~k›Kp £ĥAöœ†äEVLyËI•vÚȽGÓU¨ÒßÌ0÷ÓÏ÷°à.é~;ŞßÍÂŬ5~R4ER°Ùs´;}¤B>†"H(zħ™ġH"9ŜîıúĠ¤·,í7ĤÙ-àñOM9‚=nùĉB£Â¨mĝ•şJßÛBŒ·h 5 )İÒNÄBO^ĥö@ 3p$ŭ| •)<èß°—çcÄ=?IThaĵiTPċ=6L} EàPôb3é‘Dçĝyż(1¸H]µż"kWĵŸŒ‚ƒŽ­4?}17|2šy7GAˆÁdµ£˙ً]s4óióc À$&yßê!=†Kgr!„˜[lH˘Ñ6ĵe{…ŞĊ ŞŽ">ˆùrŸ9>M;}W/˘6ħÖên ÑTġ‘*³Û>6#ÌïK-ŠYĜ’°TĞ”ĴܳĥáMöŒXÂöĴ°ĉŭDccIô™ž—ìA`ϛĝK&´ıèáÊV´Ñ38ĖÄ,lIL7ĞĠ“ˆ%ëfğĤ£HVsq˘œÉJş VeJ[8[İM¨~jß JAy£–Ç,lIdÏ´ˆ8`²FŭÉNĵëènÛbKy7 ħܒ(9$Z÷'µî{…6Bò§r0dBĞm M%A˜X0È'û5-ĦJ %LÇÊ B/C ħ1Ëĥ$xÜşöAàdíşÇFĵżvu°-¤Ŭ'èCÚy^mx÷ûl‘ûÀžrŜÚuRuDj£‹|'CÌ* †ùdż%PÒǐ0Úr²ËêwÈ1Kĥ$„2‚}8Y'ÒíÂ;>>Û26éÍĥtvŸ iì£íĴwĥ ŭÛ ŞF{=(+k~³ïd§Y%Á Ÿì×µFÍ4v$eÛzÈL/Cçz̒- ]BhI–ÓNíıp-¤Ŭ'h¸GêĠı‰2 ×F{=ܳY™ÁÙŻk ¤÷÷CÔCN4×ÛÄ,ْàqKځ“U×~ĵù–Òî*™ÔsÔ¸˙rç jÚCší|ÂléÁç)Şı˜‰C€|²_× ż#ĥ#DȚ­bè1Ëĥ$xÜşöAdmši?ŜbKi÷ Io˙:>op³ş?Ә6™ŻGú¨G/úêÂT֙U„‰9@>Ù/i U“íŬfWflE°[³dKB(#èÚA’5¸Mx·MìĦÔ\ÖM†ù"vPjE^:ĵ‰ĜAİ!zĉC7ŜÀxƒoà ĵA€7Ŝ Àxƒoà ĵ7Ŝ Àxƒoà mĵ#iÁà@È'ĠPRÖx1R~ P £•÷>ħqÓêĠê[Ğ…t2ĝ:ok("e‰Ì/w=á(/Fŭnll$´,­UŬ³ Ħ]?G˙‰9+tV­£Y>i â$/bHCփNWs˙×ynî=rʒOÊIU™U{)t)ĉÄsj]'Í+ύP=ıԈˆ dŜ'͙Òó.eG5”†–Ê“†§ŝĴwRs‰’ħLSDžß,•wıĊNCĈoċ7<ĝ ’`³ aşNyĞÔĉÒ}ŞÒI˜Dâĵµ ëÉÄs]"Ĥô”Ċ5›ž tÓ)d°HôœúƒeBܨ'TÜi™KND JŽŬ˜)ŭ.);ŞĦ4Lİ”Ë}˘Ŝ}R”ŒEš"Ê[U/ĵ˜.]ÒžşŞn ‚Ù…0]çĵë2YŝNŽ¤.D­.Ô9LĵĠÔ˙꣎{Â}NNYòqï\żO ƒE ³T)ġLˆozBġtYä2@ŭV͙’‚Ô³Sg( S*ċ6u\ŬG+‹4E”÷ĈÓjıÎ[úĉŜ{ê×è¨TÜÜ· aşNy7_ 6f3‚*NâÊŻO_×âŻs\fŜıñïàœ÷4¤ìŝÁ§Om1´qï×@‹í¸ê DÂġĴMĝğ‰w :ÎzèRÊH˙ĵżÁŽr­şó‰ŜĴnÈÄT)O(ùÊï´ÌȤˆ1SRŜyvxĉä4RIÂáİSÎë%cLŠ˘ñó_ĵ›ëíÑ^F+Ù8³5ŻâÑÉ{ߞĉSfÚfk²SÇ~QÏûíPNîʈsö?j›ÚŬšì”/_\0 ĵ7ŜÀxƒoà ĵA€7Ŝ Àxƒoà ĵ7ŜÀxƒoċó—PE5+Vx×ıÈ6İġÉ;ZOp½Ù×ܙ-M|}ÜĦ6F*I j™n/j{”QRżO?ŻŞÓïUÊğÎxĦ›şá$û—dYWİnó1w δÖDà4ŜĤßuôñO~E=Üñlxy—İŬġdħ2Á ›m“]Ŝ}"k]İ£0´#ouUÇsW“6]XDóÉÍ)ĝšuV˜™nœ@2v0ŬáLÇßÉò§ìÉ×ΜŬó5÷ċ'q VĠ_vsŝLqħ<$IDATMtĈEŝĠò/ğüsÌü5Y²yo?œŜCċ½pHëPóuîEô /|= "Rc˘‰uúsş+ŽX}À¸†î)ÜH݌n¸5)ËêĠĞÛdù2–A$²ÊÎçĠ’Ĵ,šîhk†_V+{g9.ïuҞĵĠĞĜ“ô”Œ+*‰ps >f„“]àĈ dcj—wÔßûDŭ°‡Ş&\Qq_úšS‰?üäk§Ş}Z=áTKú¨ôߕGĠy¸^ç,nĤ›mĞ58‘ıçNçqu8zexĉyrĉĵà­%AXD0&šĜn Ï¨ĊÍ ä”ĜüŝÉÍjöqĥWüá'´š{ĉşeÏşAzMF·œŜLV‰vù\]×Óġ[ŬÇVóŠi͜‚YŬI.Œ4¸İı¸Í¸àTëHàioŞ\˘ĞñĊ}™ê(\=ÉîoÛöbĤZ‚éĠóZŒp_kòĠèµ.Á‰vèíı! Â"‚1Ñb ïÔ³ìT2ŝĴKgYyŽšyhV˙OjİÑYġÄ[o~ŸĵÚà´-ož-£E"ܜ‚Yáä˜qÙĜÁ>\‰'iYoJQ)JrjÓ Üp?ĝൃTbĥü'{ž£û°³îĦû8µ‡Ğċ8”İyëIàŒ‰|ÍÌM3àd߉œŸáıŭ¨ŞúÚt3Ĵ‰VÓŜkœ×ÓîĵġŞR'ê7k}Ì:'żÀŒÈĈ„AÙO¨£1”äÔ3ĠĝaŬoŽšF*ŭqZ‘ˆ¤a¸O÷Tµú=“uòŬñè=ĵıEc˘%ù'äúÊ3VĠSK҃ó.AÎŝ¤ûĥyóG!7K@Ÿß̜‚YÍBğp!Ñŭ‘j0v‹ëkÚçêÇOŞÙsXÏ;sÏŝHuUœz7áMʙüwÁÏíŻÏİ]nS—¸îaż:´ñ\˘sŝĥÒ·Ô=÷9RÎÑ3ĵıEc˘îïÊCúó{úàÓê×`ċaÊÛ}²áËġ{Żŝ 8Íĵın–@ôÏû[™uàN~Aè!U[2v?ğ?ÌHê_ù}…+ôìTâ!ulÜċËvVsPéeoGR˙ïÔU8 ´wĝ@óï•7şœßX…ğlO£§è_ŜÜ"‚1Ñâڄ˿@¸ú×?’EûçqÇ_…ëĝĝŒn½n #SŸSè…zġÂaŻëE‡ÔĦè^ü yRUïtĈÇëa3­çmf!2r~PUz`üĵI]$ €¸*šO½Ĝx·#á"#żÌ@QaqĉCcK€7ŜÀxoà ĵA€7Ŝ Àxƒoà ĵ7ŜÀxƒoà ĵA€7Ŝ Àxƒ´š7ˆ]xoà ĵA€·MË(ü˘?2ĵÛÀÛ~‘yG xàŬ&ŜarżwĝƒŜÀxoà ĵƒIbĵcƒ7ú+–ßŭîwIÀ;&x'ŭġĤŭğáâ- àŬNy˙5œĵÑü„^E?AÀğ}òŝ]Xy˙„‚ĜC–-À;òĵ“|xo½Ŝċĵ}oŽŸÎ<֊öœÇ¸‡hžĉe8’ù$H2wÄy'ÈŜç¨Z’RMËUÇ uĵ1n½zLžżğvûĞÀûRóNúëƒäEŒ^à4Ê{Üdrġ)˙­ Ÿ´Şށ˙D­<09¤dïóĈ ÔR)żU&>ÜbŜ|´E^™ĝĜĥŭÛÇŻU÷ĈŞ%hà=nîŞġĝWu÷j7Ž|˙_°`ڈ^òÈÚÖëœŭĊxK™ë…·çH1óVĥĉıP‡áş]ìö,˜"x×ĉıœŭÙO·µÀû"ĵÑҙPŜÇtì­àŜJRŻ$ŸòôQ@m ĵ#Ï[Ije„ùïèä­oà ĵ7ŜÀğòŜv1Àğ-ĵa½ HôŝvĦ€7Ŝ Àxƒoà ĵA€7Ŝ Àxƒoà ĵA€7H{ĉ½J!fd ĉ}CÌÈ ˙‰o€rˆـo;¸)otL ÀÔĠëIĴ§z1SX‚Ŝ@ƒñá(üÏ8Ÿ*÷›í** QsDcí†)†YÊ=fiêFĊ—;…˙çħè霨zµ oq×CÙĞċĵ²çċĵJ˙ƒ×ĠrĞ1úbİĥħyƒ×“Jƒ>ôġÛ Éçë_c>ç/ô ĠäQ9_ÜSV^虐ZnÎÊ!ŸÉĈN 4obW6ÈIŒ_ğE=štoÒ(KƒX4ph&>Û!ƒ5ş¸öĠ+ܲÔS`LO…fεr&Mâ I6›ŝ&n–ĞĤ6Ç|ż¸o¤g,Ÿş]ĦÙò3£YJ7ˀ ĴÊäzW½)è­RfıíBp2ıށµ e*4sR´\£™¸@²DŽ„°Ù>~™MOi<~ööŠŜÓĞt²ĝ°òzî[„*ŻÑ jéï§AۍÍÊżD…â5h’€ĵA>[ŻÑöZÑ{Ĉ?ŭHÀ Ŝ şËıh`ÎGÒĞ Żâż÷sôⵝœwŒvPt/5Îz‹TˆÉ²h#€^i’›Šqµr£püUş\Ï­Ò´]ŭG†~N—ë­€ZşıäċP‹knv6Mu*@”ïŜ̰6îĦ-ĥ^ŻÔÓ´ž}9 Ż!ıçe1çD‡ <ŭìjÑC£ ×蛣…Ú8Ġc •%ŸQl6›äĉ§8=ùÚİ3'Ÿ¤ßׁPkó¸k€Xĝ*}#—İàşŭċ̵é%ÚÙ\ò$›Œ·ëó[+ë·è€˜Mf smAVézCĽM£´UFwyñ|ñb ´`…á‡kZ“Ü\ïUÀ˞ŝŜ!úVÜĦ“>À†WÂXƒ^â^cĉŜIœRp‘÷ÇÖÙéĠKü˘pÁUûş_GݵħÁôA ĝxsĠ&^œÏÄUÔ&,­ Ż ğŻ`1íQñš,ˆÏÓ<³áUħĵSryÊ\H“&,b“Í-ĥ^=ѤÂp“ĵ\×ĊRa#}ƒ˘cG„EQâŞ&¸oÚ×4ĉ"وŜo8'P¸ç‹™²ŠÌËN…“üñUĵµâ*×ĤĠI„<‡î/Ŭ˘ËÙ"s’n\i—Wĥ!Ğ4UtÓŞ(쉕bîšE/XBĝĦ6-6ĜĤċc“°Xu/;›™A×èGfĉ,€Í@DŻJ™\vĥJókô Ò˜-ìuÙÀ­uü ³‘nt³J·³ä*€à{İ˘D`żúo=‹˜eİSš 6=ğïäĤÛNı’ğÖ­ ]Î?³(°°RQ4îRa²ĝ|U£â-ŸšĉŭÖGi!&?͌a´ĝ°A¸;ì7ùĵ h]ˆÏù§ç+<·•ĈŬô‰âN{:9gˋŠ|~q?Sċñ5*ĉĊ;³Ŝşa÷{£µfh²Ò”6_WğÎëŻÉ½÷ğ"wGĵÛġ9àıtU¸BÔ\wÁ=´ì.ğżsGÁuË î¨È‹1ñ%|¨ı£–ŬôÓ.Ĵ…àĥOwnÁ]’WÜĉG+G`-ò°qŬ´ôÂôÏı£7—Ïı£^CıüĵÜ2K|oĝdĉŸŠÂżâ<~ŭêġf;qŭ5ıue*’Oä Ú’@äp<˙İÀ\b›2éٓ°Ûñ¨žŠÂżâ¤|?ü¸ûuh7öîĝÄûñ‡üĝĝĜxŻÉâ_ğGıĠkï z͏ ĞB‰Âß`6ŞĠ§›ÊĈóâI-”%Q|€^ŻÔ0³ĥMÌĈÀFµ.6H”I›OiÜwQŸ ˙ĝ_í•ĤD;½ŽJ;hËFċ"i=ĞMÒQxĴ6*IëYm’ĤˆÂcµQıHZÏj“4EЍÊEÒzV›¤)˘XmT.’Ö³Ú$M…Çj£r‘´žĠfEîŭe¸íoÍ֎eXÚì„á†ôşC²3ĉŜŸ‚pC:ž9W”<~ĦÇf#µOmDς~›Akxg¸lhol:°Ì&˙nt8Mjƒ˙ÙÑO› ?üTŠ{ĝŸü/İ”“Âß߀dĝـŸÂ9Ĝ҅;6CcÚÔŬÁĜ0P°aܲÓ:Çú`t6R[I6Ž4h3ċĜ°6{d mšèS@‡˙$İĜ„ƒ Á`„‹Ôf„F†Ĉ†µ9‚Ÿŝ•Ĉx’3ÇAaáĴIÊAUݳTp6lif˜l^ÓRíl$‘›Cnqk²Á%yÇ‚†ûf˜l^ÓB6AşwƒĦ*üŒ[žÉ›§ußàj´ ]›Óòß8ôĞ4Ïëîoȋ‹%—-`sMc>İLËĈÒ$ÊfèÚ ¸³›}hC×&xëğ³Ií#kìWiû#oàŭf6û˘Œ‘½À ï7ûÄÚ  íŬs½À>ħIÈ>mŸĜ›ĞÀ>ħ ´ –Ña÷öùfŻä†ŭ½Àı÷{Ċßî7ìïÂŻÚ£ë[Žö(ĤÎ,S™ÖcµÑϙ)ЍİLëÇħÚèç̔‡ĠĈTĤġXmôsfÊjc*ÓúqĴ6ú93ċaµ1•iŭ8Vŭœ™ò°Ú˜Ê´~Ѝ~ÎLyXmLeZ?ŽĠF?gĤ<Ĵ6Ĥ2­Çj£Ÿ3SVS™ÖcµÑϙ)ЍİLëÇħÚèç̔‡ĠĈTĤġXmôsfÊjc*ÓúqĴ6ú93ċaµ1•iŭ8Vŭœ™ò°Ú˜Ê´~Ѝ~ÎLyXmLeZ?ŽĠF?gĤ<Ĵ6Ĥ2­Çj£Ÿ3SVS™ÖcµÑϙ)ЍİLëÇħÚèç̔‡ĠĈTĤġXmôsfÊjc*ÓúqĴ6ú93ċaµ1•iŭ8Vŭœ™ò°Ú˜Ê´~Ѝ~ÎLyXmLeZ?ŽĠF?gĤ<Ĵ6Ĥ2­Çj£Ÿ3SVS™ÖcµÑϙ)ЍİLëÇħÚèç̔‡9môŝşê{J€A6Zĝ,ŝcŭ)­œíŬxGËĠjcXgĉû@›A˙hü³ı÷ĞÁÚ[‘ 6zߌDïÖ½"Ù ĝÌ›ân„[c˙´lZıĜs+´^YmL{vikƒ’êßrhHú†­25ş ¨°}{– ĥo&?I÷UD$^›ñu½&Êûzĉ*mxÔ̖ÊEÒzV›¤)˘XmT.’Ö³Ú$M…Çj£r‘´žĠ&iŠ(<ÎcêäÀ÷^qĤ<EàUgjoŒÔÉéíŒ8ôDrà|B$ï‘CS?ù„“$ĊŭÛ#`CSk—lCüĞ˙Ò,ĵùNŝĤIENDB`‚gamera-3.3.3/doc/src/images/autoclassified_color.png0000644000076500000000000000012410714675724021460 0ustar chriswheel‰PNG  IHDRÚıŻğPLTEĈ‘‘Ŭ ÏĦ IDATxÚc` -`ĜNۋIENDB`‚gamera-3.3.3/doc/src/images/autocompletion.png0000644000076500000000000000572610714675724020342 0ustar chriswheel‰PNG  IHDRxÒ²CĈİ0PLTEUUUFfş‘şÌÀÌÈĈÈŬÎŬâÙâëâëéĉéñêñĜ³ĜñîñŝŝŝŸšŸħħò‰d aIDATxÚí;oÛJÇı€Eʔë^•J·S 7–²Ín°5ôۘdĵ[K´ĉVŽ××2Ħ[Yppm&.¸âŭNl³@´˙3CJ¤$şÖ‹\ÏȲ43|üĉ̙sĉ%-–i|ġzb ˘(ˆ˘Ñà%ÑħĵCɽ{Aï(˘ċ˘ˆêZͷљ¨ğ:0ŝ|ĠŬî™˙>½ğ÷ŝìŬItċıŽW›´,ĵë F~7êû”ŒÛ=hÚÓt;s; Ġáctxsì˘ĵéşğ“—€?eÛÀğe{.³fŸœ²5C|ğoħÛËVÓy5İħŬI£Ġ0vwîÀ_9MBŠÓhˆşßnĜ­É]³µóİÙĜ­“š×ižygŽŬ=2ğ´j­ÉíÄ ÷Îdòù£‰ŝĝyW´a|VhìP½„7šŻ>ĵÛÁ%“Û;Ûiŝk“wÏ··ù8!œ˙9vĵšĵÚԚè CÖ ĝÚĞ[ä>ßÒÂĝOñá'ğ9ĝŒäݰŬÉ>"ĝO;Yĝ H>§óÖ$KSG]m—Ô†ÊïÑÁTĉvĥ§ġë|bm<²6¤6€dmwMíÍĴ Á7MÖ0jž6Ì£³ƒ&w jÑç‰a4“ŝ[üÔÎGÂT6k4aö,JÙÔciçQêú°Š°ĦëûnĞÉZ ²¨0AwMĉ .µÂż8ò.„wÔóŜ÷z=÷ĠŬË£÷Ô˘HòŒûîQDW>q‰ßsŭŜ;żwÖëì˜^ï=9İh¤-´ñ( ™ĤSËĜ£ŜÁ@..Ëñ ‚3·Ġ°ğӅİWƒQżÓ%!ˆMĦŻZ6Êç˘o´nü…ĤGJ(SµZ ĞÛèk#ì.YáE(Ù><Ñišµ§”÷mtÊĤ‹î“Ċñ‚ê}ò2Ò~z俤Ou;d_ݧŝÖAÇrÓĥëbŽÊ뒃rl˜ĴC";vçħó5O¸kšUÀ=pᕐëcŬdŽBŒÜû(Yµgž¨ ”bu|Íf‚‘œQ§s›$ÒÄêä§ä¤FìŜnÔ—;—‡ŭӂ“<ĊëMżžÇEJ߂×Ë _.És)n^NµIÈh:ŝÖèĞ.Gc‘áó˘×cÎE G‰.šThÏ‰^ÂsMÀkš^BÉëİäKó÷áġ2Y(ŠĈ9F*éŒpŸz9í”ŝ—ż-_ıÉm4ıWçĞ“•â/×ÜüV‚PÉeg…•Ü>+ÙÏ' ˙|1ĝ ´$Ž·Ä+ĦÉBĦ%(„vÜPÉ ) ċHg*rŬ…àxĥ¨ä+ ½İlU¤,+_‘…İäEmZHıħLşÈáŸ={<$œ'y“d,ĵĴ£B’üÖÒà€•_Lmr’ݤ’ßz^…%ÂCċŸ/Ry@m*™†Ŭ,~akßÄ4ŝâ1"ñÓĝĊ(§ġô‹ÚPŽ´G ïÊĉMe™=ìĤà˙-IŻ KŬĴÔ³J5%.ċ€Ŭt$µüĤ#î†_ÄTn~k“ŭÏVž×y¸Ú_™~kˆôׅ%Ÿ;…˘s%Ĵ{êZBoMĴĴ“Î ӑdS2¨r).O i:çş8ÊĴBmĤGíĊw.~ËcĝD,;B×Ċ"$y=ğ†á5í›ú žìÇi]!àùw$ŸOuœâU$xyZ–‹³´q2t5YHŠÂ5ħUëšpšN/.OçÄT~Í~2)ĝÜİ’ÌÔ`6ÈXòëL ^Á+x_>xmŬMZ&ÉóôLÓʧb+ ı˜•‰N(™Ú¤’Ÿž;+#Ğ™ĞAñġẂÀ'lĝ€âÚPÊ!“ŒXùJCD.îœŜ>¨<Ĵ‚ż_­­ú"%yŻàĵ‚_W8;ĥ§• žg¤µvǓ‡—Q] ĈZZ¸ò+E—uNJŸF³çtŻüJÑ%‹ğgfÖpèòàÓ³|Z¸ò+E— Żó4X]•˘K §…ĦG9ÉSk¸RTMŝŸàW˙)É+xŻàüĈÂÀ’Áç#İuĤ%<£uƒÉÇâa |6èzá.ñ½‡<–^Óô2K~ŬjóĝŒĜĵÚ,S…k–ü$eÓö"?OSĝÇ˙0PàĠóüï…²Oŝ/ó-)ĝ"ÀżĵV ^Á+xŻàĵ‚W ^Á—)ŭż|}'­ÎIENDB`‚gamera-3.3.3/doc/src/images/biollante_feature_selection.png0000644000076500000000000000752510714675724023030 0ustar chriswheel‰PNG  IHDRšj+Çv0PLTE"4[6L[]ZVdƒSh–KjŻd~ğsŒÀ”–œ ³ÚËßÎÎËċçäçê÷ġ÷ôÂéQàIDATxÚíŬOh×_o5ġC]cIN(—Ö6îħ§B|ˆ4„bH‘êKħˆÇĊv³ÈĜğĤ-¤ĤÄÖÑSÁäbCq/I{H §BAŻĝ”’‡ ˜ÒÖàJvQ]Ğñôŭy³;ğšYÙÖ{³ß‘=;;3ğû>ûŝìĴŜOïQšS3–½”ż—//ߊkùKûoöHÍoGoĥײä'ŝš ġ•ŜûvYéġĤŻvşçovÚĠĠîµZè^Ĵ°êvçk'g^=ĴÒÓğ´ÍÒw¤{ñrŻ·ê’ß[eô¨·šÚċż½ŜġÈ#Ù#ËW}€ÁĠénG´£ĥú·o^m•=ĥ 0tµ óĉşKŝJïíé]`—û+²¤IŻ$V‡“ĊŽ\ê$óÙêt’”­ì2ä¨ZžE?sµd\]ê­>uÉ_í]£Ż43U}ĞÁ$Ž^ÊPeÏĵçdAóû~ÍN(í4ŬږÒŜô=é=GjöÎšÎHÏğ_Š_ÏtЉÔld›’’Îzù³Xßsy¤fvŒĴÉ<íÖŝCƒ‰.×HA:“œœI~:’2ÚsĜ”´{òÇÓÜÓ˙TI‹b<&ĦŸ¤Ë˙WÒôoíMùó˙è=Irĉ_[ÉYYċIjÇÙô~;}*³çlúÏäéġ'#Ÿ~ĝl4sÇçŽ{yGŝÓ­@§n)ËW²Ŝlž{üÒÖĦ^z(óݽ!žž˙ĦÜó–¤>üĈÌÚċëµ7ô)kK×­™tFnܐĝouĈòĜĵ™›+äÍܽ9“7‡Ç¨5nĠŝ÷ÜĞí×ҙ“ß•Dk6÷é=RóäÊĦtżŜ§v¤ßN$E6µ/Ŭ'ëÏXEÍĥ*kĵz3§îĞV 3V+°hZC*žĵu5ÓlĵöHÍYÊäGÜrŸÚ‘Nëz“ÎĤûŜŬHì8­ÀRYŜE|3ċ›eVE Y.N£j+3µyPİT£Ŝ1˘\#œĈ>§\iS\„]ġċMÖx%ÍÔdŬÒq}*ÏġŽ1!4ö˜*™†ÄŽ5~½á&˙Kê 钜żŽÓĴÌNĠi%W–úë=}x½á–4²mŠk_x^†Lq2­Ž{9îD“êN–<]j™mô³'Ú4n_K¸6M½îġ]¸kÇİ7;XXp×;yžFiH4Iƒkhh h h h h h &XÍħ—IΛÀ“ĵAŜ™7w§—†äÍoŬ€ĵıĞFñyԔĵQš3J#OdÌ)E7›ïH —?$¤HmĜ7I[—4,*:ˆGœ7·ĥ]oHċ ıxĴHóĉŻÉvjKšÍ™˜ó&I šÈë͓ĴĘ ĵdñĉMşÙ°Ï›p5}†ï7ÈüÎfÂg 4@ 4@ 4@ 4@ 4ÔŜGPW­û™o2‹fho”Ż1i\,g‚™`5˘‹ˆëÑvx>|Wš,–ƒépÛ;­ó†3ğŸ‘A5c9\ğ‹èàf</–ƒ›€Ġ‘iˆ"ÒĝħyË5‘•4?–c°ŜÄĤñb9 mšŸKïİM+Är„}T÷ӓù )ĥkĴë´¸óß h h h h h ĤŞĤĦħĥ·Ó<(ZëjŽFĊrpŬ½nğ<Kmqğ+‰ċ`<ïŽ6™£ĥX6ŠB,ˑEp0o²ĈíPÑhl,‡ÑĜ0ĉËġĵ[Á4óġĈċp”—4›3Ñ䍋ċëI=s%-"ċpmÓmš K!ÎmdĤĜlÌHC#!‰BĵÀ›Ĵë4|#€h h h h h šŞšI—<<2ÍèQâ£ĠĜ0Ŭgë ÎáĥYEĈuGĞ?ż÷pÛ<„q`jF ħ|h„,´E0ŻĈ Îaꈤ4ĵ7Ĥ=àñĠ›ŝÁ9X”ġ&MĥMÓQÌE­ĊUÒü%ÖcšĤ)ğN‹Vƒo@ 4@ 4@ 4@ 4Íĉ;J3EÊ1•ßʛġ]Ϟúš¤­4&íSù­ŜŠ-oô¸}"£‰¤™q9ò&5šèJš—chI‹M£Çċ°Ġ–e·²ÀEĜĤmŭĵ‰ïZ`Ô§'Óp 4ìžżë„h h h h ššËÁ 71jüż,n†&›cĊŒÁáŝh=NM6ÇJ>G£ Œ§ñĉXaŝt1j sĴXˆ#BMaŽżĊYÒÜ+ŭ%-N›cĊÎ {›6sĴà: ×@ 4@ 4@ 4@ 4@ 4@fc9ò=ĵpœĤR,Gtš!ħ¤zs‰ônu”ĞI ÔMàšÒXŽ|š{”ÜÌ+kJc9ÔgŜDÙMDš,–né=ö(QlšĴ˘ë™Wìĉ[IsġFŜ²ÂTEĠ›Ò6™6Mˆ¤MkĈµÀpĴù›ħ@ 4@ 4@ 4@ 4@ 4@3‘šĉĈrĜ3–­ÜsĜ;<|×5LĥcҐîĝ´Ŭž<‹ŜPOĦûAĠZġàò]ü ÷½¸*Ħ~—´é€ zPĞŬ} †F½áE ó4ÂiÄ.ŽÚQФ1ğa7 ÑA™f÷Fí¨Ñ ˜’&làF1oD^ÒÄ.ŽÚQĞŜC9Š%Íh8ËêVĝmÏB9²è -şM’Ât¸‹ ¤5áZ` QHzˆċ€h h h h h hʖ†Ĉrĝ]Ùp,6×ŜšcEÇop;F7ħv<Žp&Z¨>NJ ÔfŒ–ÇÁ‹HcçXñƒ| §ÄĠ˜c š|Ž•FäM6Çʰz•ĈÍħ2ĜĤq;GLŽ•çĵëÓÓicÜë´Ĝóß h h h h h ĤŞĤÁsĴˆû<êŝeqC4ú/íÉvĉŞ5§È5ùĜ” .½¸Ŝ0VÔ5IbnTk–½}IÓħz*"’s›ÖŒkfi0.4@ 4@ 4@ 4@ 4@ 4L¤f’b9Lېƒ!jFĊr(IPŬŸ•Çċ(ċ=ğÂMĞb:Cġ¸<‡—£$–CiH¸iUòIVvkܑr”Är¨‰!òiUò‰iħĦC²~NΑŬîĉ5f%qVcçX)h\HGĝ%ıˆĴ¤‰Áĵħ"ô’Ĉ…_Òò9VÊK¤MËi(Ë}ÀŬê•Û´&\ ŒÒPh³-aŽh h h h h ĉy/Ÿ½_gù tM­³ĦĞĦŞKšİ´Ú²4ĥŻeÛċĜi*žúİÖT¤G˘ù²ÒıŸCͤi¸›uf ġ˙µ?Ql,Ò6šApˆ—S1ĠŻ1Ħc:öMBk¸¨˘Ébßl(O¨ޤ9#hMĠ’FŽĦ VĞ–´,oBnÓĥmĦı*L°ġĈ}Ŝ*Ÿ7ÄtÀb¸ml fâ4ĥÍ˙ޝĵkšZż³ ŝ·Íú}4ĵM£úo^Ä 4@ 4@ 4/B³·AšOéQƒ4ŻúÁ|ĥ—Ò=Ñ\ûœÒġW‚ù#”ĤëԌeJˆ˙Mn”J IENDB`‚gamera-3.3.3/doc/src/images/biollante_status.png0000644000076500000000000000775110714675724020654 0ustar chriswheel‰PNG  IHDRš#x0PLTE"4Z6K}\^[Mk­]kˆj„€ŻŸĦž ³ÚÂÊàÊÌÈñÄċçäçëĝûŭü ³Ú…tIDATxÚíŬÍkç§§†ŠwĠ•šŠQòĦt)5ÂH*i^X RÓҒ"³]ƒ/j!$àè„q0BĦ% uÑĦ萃0úü¤ÊÁ`‘PB‹ñJFİLWOŸ×™gfßgµó–ïcyµ;ğš}>ûĵÌì<ży†pŝ„”#]àœĝìû[aúÖsšnoġM>ñŸs—L7ršÖúkĥŜġ ûÖÛ&ŬÜښĴ{—×Ŝjt½™k\k4–ġ7ħ´Ĵġú µÒıïûĤ7³µu×ĉSdÜÉr¸ĝï”lŬċ&}!ÊĈ[zÓğÔùĤîÍ97^Ŭ[îqĤċž/ž‹Żı›‹²Ù°ùĵɲ³x<·µñĜ¤ßÜŞĈ×Öŝ^ĉĤSĈúĤÖeġñl,nŬ=³ùüÈͲğĝ]òµ¨FĴ¨GtA ›bÒP÷ê½<ġ4‰kԊz—ʳç^äŞ<Ŭ‚lróğöÔk[&Ӌ‡˙ <\ĦjܛKüé\í¨Ëğé{‰4“îgÒĊ³qşúÓÖ_ċG*;üÚ7îÙĉU£izmËôòJ¨œ–¨Ëü½:Ÿĉ§+âOş×·şèhĤûÍÜŭĊïÇ^í?OgEž^y:ém|°ü#Oe{ÑĉÜfZ/[5aĊ䪍˙ïHÜ÷gĊS]ŠFċe-y´şşj5Ä?GóHŭĜ^ O[áSòŜĈŸž­x³^íhEäħvòóÏküLĊÙöé;üNíİèc^ĉ§zÙËüsı\ĥŸyÛgwjŸŸ, Í7Ï#Ëĥıŝxnú´ÖìY%Ú5Ĥ:İĊ²hœv³*;½@ŻŞvèÍĠš×O§÷?•-áHç1LÉĵ‹Ç‡k·ŝĥn–U…Ĥj5żĜ”-ŽóÙ˙äróĠ#Ñ L^¤X]ĠU*Ĥ‰•ÍcY4ƒöÛÔkÍWEŬpŭ•“Yoûv­ıܲ9—yŻ5_9™ä3Ŭ4ި}ĥ\İĴ7/ŠçĤ×˙ÜìùġÒÄÚÍÇo /Ú³Ĉz³öhġ§+˘³âïßà3µ/Ŝ9­òKŽf˙öÊĦ·­—í7ĥo[Ík'7N/ޞ?"zxQÁċsŻñfm§í\M÷>m¸}M~v{{ÍğÄE½\~éì½İÚùíêŝ3G#Šî³u½LôiĞ}Ú틟Ê>ûĴşż²TŻ}ì­·Ş­êùÇÙhÛé‹ïÌ,ÍT&½)ݍĥ⁨y3“ġÊÔbuqZl_*^eħRİÎLUĠ2ñ’ÙµŞĝ]Ï,U&—+rğğX½V]–[ĤċJu­:·XiÛ̸9HĤi$ú2°Ŝ´÷½˙A½ß7ûµ Ç7‘DšéĈŻŜjĵîÜ\‹>T7íiŭżŒŭ¤ÏûÖ×ĠÜŬ3é#ùŬSŭùÏâ+Ü\o4ÌM*‰ ›Î‹ĝ~ó[›Ï›‘,;‹Ĉŭ"7ŬPŝ~ô&,÷ŭ#7ƒ§ëŬ×â(â9Xàğ§Ö¸Ç›£Ò#yú­êuSRçġŽ ´kŠ|”Chúĥ›ž×ƒe_y{€ôkBŭò$ 4@SB #„2?*#D?eÓiÚ3ÌÌcVÀ²1…àT<Ş–ħˆ2ù•Ż?”Eœ’P"—QF‰ŞoêyRˆvÓQCµFŭĝLŭ£…İiŒŞÒ8OuÔäğoëÑnTŸF ó VÓÜ>MmoDŸĈ¨Ġ˜>­¸ûĊÚS(§F~Y?#-WÙ`h )šĉá^9Ò½2Ö´ùnݐšĞĵsÚ-ĤĤ˓ğóƒ§hĝÀi·šÁûh hĈ§aöà-ƒ†Ú1 !&Ç;â˙„ú§î蛝ĵjÄŸPFÔÁsj56QÍ^5̎hĜG³CDíÉBÒ˘nvö&䝉<öŒšéÁÁĉ@#2ż#dQˆ_;ú— Ëó×§İDkšFTAÈ,+HVc•ı킚ĉGjšGCˆ£ÉeMs5$Öntĥ³gşŭhÇ)³mè=›í§í”J³G&° 4@“™fPݏfŸ)÷Ñ+íB 4@ 4@S:1Â?÷nX&ĉ›óXÊF"äš<­Î !Qı &G„ˆ>%IÛNıĤ…'uĜ³ ’&˘VaGÌMʽ€n7V3RÙèU¸NÚe£Ç=‰9Ġ†[ÂbQ# ´4FÙ¨Ó¤ŬnäöF† ˆJM#JĴQç 9EMÒo7LeÒ°RiüñG‘ch h h h &ï3ĠsDŞ8HÇW2bŽ9jï=ï’z4–ƒk4ö`z×·£ŝ œ÷ÂÂëá£ħLú×ȁ0uښÈĦĉcezlÌ}ZBİ9Ó­Ğ&ß ĉ0LOC™ÒÔ°adĜ‚Džv_aì*0=öÁ¨ža’Žñ{[Ù„ĉÓ >Vçxż3C}?퉷›°lä}³fŜ0UÊ‹š ŽôѨW’NǘCܞOJMO‰ï÷֘šĉwÓ°PÔGŞ\&·Ŭtׁú´#JO£:-f+R¤O žöš&GâÚ·ĉݳ½‘Ż’£wjü5­OÊ}„ÇV*Ÿ˙–° 4@ 4@ 4@ 4@“wsíÚvgÈ䎭ɕèqÓtĈÖèyi܄ĥŽNe4Ê7VƒeŒÙ“Ĝjü`Œ€ú~63·ÌŠ3?dBSÓôz£IglĜ÷³6,ñ9MŒP³f×F͍~Zckú*XvĤK=?$!‰[Ž£ĦAċ£İ­ħf4|”³$íŞ˜\<ËѤ1i7>ĦĤю–Ĥ†˜-Ġçħšù!]öÊ ¤QÓ ĜA5³½ÉÁĜöl h h h h h h &¸Na[¤C÷sżûĴ™‘Ì5Ôgƒjú%êӌ5Ìdƒ1•âë!\_ÍDJġĴÈԞè,êáɉĈLêJì)Óá#÷ÖàSĉ5-ĜXöSYp˘w0ôŸû²QçWcİ_zÊċbi|?R6~ìÜé~šì{s½ÒĥšĈ˘5­(†'BÖ)*TÉöiùNôĥ‹X~·7ùiÓRi²¨4Ĝë„h h h h h h ñĠ9ìí#Á$ë%Ĥ§„·kזxö…Ħ5~‡˜“`îŭáRx™àÈ`ñÇ8Ït'ıĜ fì–ĥzzƒ!ĤOÑĴV‡M0ûِ´4ĉbĠüt¨éS‚™Ĝ͔”°P3âġ‡k74˜8…SÖÓ!'µ Áĵ"áä+ş²ħUĥÎ5M‡?˜‹¸š!pG™}(íšĤߕ:—ö"ó5„Ĝ8šiğ9ŸšĉN£”Nğ‘'Ñ>M]Š€ÙÀ”·7,Ô¨†ĤQÓ"ۘòìÙ@ƒ½Nh h h h h h Ĥœšñ3Ÿ•&6ĉĴŻgËj¸ò`ċ/…Ĵ4ÑÜÒĦ³OÇ-ħĉĞYjôT(:ŝA^Í'UñĠµWäËP9ÈZ̎^ĦD ıû& dˆ•l5ÁĠ|lްîC}6Äġċ³.›¨F]Í'Ô0=Ċà*ıÒ°X٘x†ÁGĴsĦ!&+ĦNìÏ šƒù 5ÁŒOşO£ĤO jšéÓìĠZÏ[ï dRhĤ‡ónşòpoĴéŜ˜÷:wı›Ž÷Š­‰ñᕒh”H³éß*ĉAKü“šïŭ~Ĵi3Í-ġŻ$U4­jZ*[4ċĝĤhJÓnJĥ½&ûi‘wÛ-ĝ~ZıöĦqTh h h h h )‘ĉ CŠĥs££Í8"T³Ò°ĥ :êü)Ǚjdt1¸ÉĠQ'9:heXÓ|;µQ„rÊ3VLOtm‹hFŠˆÊTcb )ĈĈC›ÙƒšVd÷, ‰.j/@˘}šAR:™ĥìÙ| 4ˆREd ˘TkŠ(Ġ44ˆRE”*˘Tħġ,‰QވRĊ·5h h h h h &żšù…$“°Ĉ4Ĵ˙Lœİ\&ïà8É$Ĵ1ÍĥéhZ~+Áô‹ĉ¤*6Ġüè Hù‹šgtèê¸5Ç ŝùhˆı ŻáÒNŻ>“äòÒCjŽÏICMvYl&RIí%HÇĞá­sÔèšĈtࠜ;UkÔ€ żĤuš`z^LqkKĤÑ œƒFġi4ÚnÌ<½Íĝ=ó ­“°vĜŜ˜‹ûÚ>MfŬ̝JĠ€)#ïĤy’IXħgóeÔ$,O44/ݚDá­ıĠ$ iÉżĉA‰4…·Ž[“8p.Qxëf5C†·Ž]3RM6ĵ5ߚa[7óßnüüÔ´û´[eÛŜ@“żŭ´$á­ıĠärßÖ h h h h šriĉç3Ñ0ó?ĵv4%‹}:ài]„9ĤĦ*òÉ%‡Ĥ•MMÓyulJí²e̝Y–¤Ĥ-d£QĦ‚a(މOU“v†fúMĝqÖß şµ-Š&œ$ö ›v#CžM”-‰kd¨ŞŒWŜ’½†ĈËĈÔ´D%“•Fçı‡&‰g~!C £Ò#Qİ ½W5RbU‡K2ä{6Œq„ŭŜnd´ü^qçÒq‘ˆÓ+ĊÖìFû²Ŭ²h6Ë£yàëX³kd Üï´F†ÊÂÙ-Ħ&ˆÑ,²&¨iAŒĉkZjš h ­‰ĥżĜ5-ìÓ´Êĥ½&wûiÑ=³‚ï§•gßÖ h h h h h h h h ‘š1_î9d5óċHR3á—'íi’'›Á<¸@ĝsÑĵË r$˜Ŭ BŸr¤ œ˙8ÎTmì(8IENDB`‚gamera-3.3.3/doc/src/images/biollante_weights.png0000644000076500000000000001025410714675724020773 0ustar chriswheel‰PNG  IHDRš#x0PLTE2Gx;Mr[]ZJgFhĥe}ıqÉ€Ż§İĤŞâĊ½ĊÛÖĜĠċçäûŭühlĊ¸7IDATxÚíMlÇ€§èŠMĊ*” ¤̒²C|rJQCEhlÂ-yè dtl4Rnm˘ ÇÊĊ‡MŒĥ„ö:ê:u ŞKñÁĈI§?¤µŽŞVħ9™ŭágÉŭߙġ{–‡ä,µ;ŸŜììÌ{ófĈQ2äYŒ~ĝífWžo *7ÇċOÏšgĝœt]PYt@üFŬ\5äb³9µ\?T?ŭóúašİŸfùdĦ^–Ô뚌–‚ġ=›³ô]m]/ĈaúqÙĵm–“œ+r7û/Ï˘GÍÛĜ˙6›ÓġEƒçP? 90Ŭ{éné†%†ŒúJĦ÷|ĉĊùä°ŝvÙ\3Ëyħ§È\öËè™ĉZː_lNċ§ós?Ê˘É´]RÈçkc’ݍ˙á:Ô-Ë\óvÇ,çG|‘ùìwW{iĜ‰Ž@IççœRäBĠÙIk#yÑüħŸfa…ràŻ¸sĞ*ĊŠs[ 6 ^üĵ 9 W۟[˜½+âRŸÂğéâNMż†ÍßÑÍ8­dm?óâǵ“x‡§€Ï —XÁHħñ”A³ÓE1óôüƒ–V }WčNŭŸ‘_!§·½¸'›żNÍB!Iû{ÙüÁ|ħµ›&Ċ9ħ;™_ğU8W"ĊÎĉç̒Oš4,oÁ˘ÑÈ-bCäŬҍĵ÷ĤÈ!óCJ_ì§y@Z1“ĉùÇÑ<`?f+fyş|ŠOÒċSgş ŝ:}·öÛÇ/— ċêN._ĠŠ{'ŝQĊ<.uĥ÷/ákĠÏIóŜ×ó^Ë$?_.m?.l?W˙µ[:SĈ‡;gʅê£ŭyœÇ q×è-­s£hV/­^âhÈòhˆĥûÏĈ£géğö÷ñs¤LäO:_Ŭİj3x gr$ı…˙~LĞj?}ħóüܕ,ÍËŜ;ċ*~çÊù5í›{ßĜ/>Yœ)—ħs3U­=Ih^ÚYÒş×è/Ai6’ĉ}ËéfġÁjĞŭÄhĉGŞĤŒŸûŜ-àÊŞŸ˘Fr %)W Ÿ*ÒÏĠ˙äĤ˜yEäçJóU­ş“ĊGwΗ §ĉÉïjKëĝ žÙ/jvŞ9Ġ× àĴêDŠÌ²İjp÷Y%Ÿ1ݍlXÒ.—v^ߟıqŸTÚÑÒÓʟIŠ–|& ùpÉÈËwĜá<;‚îİ"ŝ´¨ĜÁ3ĝ`ûÍŝħZ˘KmŽ?ħtÓĉh¨j(“VàĈµ˘v’Üğ¤LßŬËç·oµBgŠ4^´Ì¤ì¤Ì'ö28EhXŜTU³hvĉñQµĊżR—´ûäĜÌÒûNZJƒğ4mƒ†Ŝ7˜£iĠ0ŬĜ·‘ÔÉÇË?֖îg^ÚϒF xŽ{ïÒ~(uin4²íüĥžwoyû7&͉½sûD äöÄ/îQŬjµ6=vk£èiK7k& yMŬP0ž†¨F§ƒB’üğ¸óÁöùüœ%Ċùağsó@ñĝĉ̍Ç QŬ۝÷³,´i)FCˍoĠhÛÜÉŜËĉkĊûùNĥ“}ßOÛ=pzúĜ 1‹Ìgwi0£I/ é7=ÎE³³™ŸÌdĉ3µúİ4é:Ö&S™ú’6™İŸIÍ,Î,Ĥ§êİBj1“™šLYùJvqf.Mú™İúÜdĤ0I{œ‹ÙĊ4évĤêzta.COÏ.4XrqƒĤÍÑà.Mğ—Ĥ­Óp#‚!Pƒ£/½¤9Ô{G…q#,Ĥnp—ĤÍÑàz„Ò°>ż9ŞX7G8#ġċúY+YşßóqPĝ£}‰í0çˆ5b#VlÜ1ŠÌgSšÛw ùˆŽ=ĴstĦĴĞڕ)5˜gÈÊH²ġħçÛf9/ö™ËĤ4ü@nzyeċʅ•#z²ü‹•×iò˕·hBŽž™Œ–ÑżûĈÊ[ú…Ĝ%ß°Šq˜=ï`ìİÓp2}–žˆPl³‘äuzòUšĵaäyĦpe\r•–`ĠúÈ Î.Ÿwb  YTÒ|e•—݉j,ûÒŞù RZÉh€h€&4*BŠÚê%CH?dd+Ñ X5>ĞêĈPWñ–ƒH–˘ÒC ŭ.ùQYhTNŒÑ}hèCƒnÀf4@€&;ôlü2ĈÓÜÀħË#“Ĥ%³|b¨f+4†jB£n „O£$‰†Žô“CCm‰ĦĦ¤jB ĉWHtmÚċ²­Tî#w"¤ù­ÄIq†ÔċĞvĞ'ĉ 6O£z %Š–fxšE 1“³"?)¤ĦžiÖí8Íˆ@5´rÑ oX¤s£!€gš ğÀú QÑÎ2ž!4AÜ7ĥ›Ft5MQ 7šÚáġy#M})i;‘‘&Q½ÎdÀf4@4@4ɤy/I4Ÿu’Ds%I5¨&A4W’Ô Ġĵ—¤A¨­ÀˆÑšİĜÖÄä#!ö4NZÎúÔ³l:v%({;´9nO¤àiĝüñKÚDL3´ “ÒSÓÒ§§3cšŞÒ¤rŽfX+è<\ĊÈï28 YaœÓ.[}4“FŻiV‘È4ZÄ}Ŭ1ŽFĥÑ!3šÖí½àŞ`&tĞŠuiĵÔ´hi¨jŜ7žhÂxÜ4*n}=m ĴQY~O›ĉày#͐G‹H}ż4êÀÂ]ŝ}>$6ŬDŬëX €h€h€h€h€ĈÓÄr„…éˆà3=Ôö÷²ĝ*#gt…O˘sÀ! ż:żŭäTĠ‰ X;ôñh­y/j,ż"sy!úN5²d£Q¸µŞÌdUħf}ğ YϜî¸Ĥİĉnş™ÓpŞİ=uP.= ·ĵ˘ŻÈĊĉA¸Uŭ‚gSAŬšf-çF7(kĵ)ÖJv.iB4@ğlÓÖĤé†Ç@uġĵ‰ŸFĜ@4y_r=`AÜşITŻ3Y#‚Hh€h€h€h€h€&4É÷Ü Vâµ \€Fqé°·CçĢq³!4l{rŬ+`ĵRË’•F1×ä·Öĉ·Œžni­ê‘Ós¸ğŻ=ÛeËLƒa’F-7Î{ĞzÌş1ŭ9žjšp4Ŭ¸4ƒÏ›XhtŸ§ñŞoĜċy?M¸}™i}2Ó$Ş× >{ ĝžŽ8‚Šüv ·$iUwŞ?rúqh\4c|’éfŒÀÍşÛ‰ôQûdĤô¸˘Ùp;‘>jÜ4ŭ>W4§žGí#Œ&Ş€|4 ·a²ùäíu‚Ĉž@4@4@4@4@>‚ûîÊ;£ërèañĈä£ñ7ó>ršq>ÉhĈĝ\l:hUž&LAĵ4ƒ>7;äZĠÖÍ`Ì4ƒq~ž7ñĜûÜ,o#M¨}İia‡Äì#˜|0ö    <}ûT¤´ SïZCAÏ[w­Ħ¨iBġDO3ĈGàĤĤ­ûYœ?żµ†bGàouž gáÇğÖPÌ4Ż5ôĵġx׊š&Ž€4 ?[ ÈG [Ż|0ö    <Ġ{'ÀGà9ÒÀïZCnfw{Ĝ7- ’ŠfŒ@•K7c|ŞŻ8‚ñ’‹ÔG HL3à#P]µvùÍEé#P]ÍUŽf`­!5ÜçM.Rd41÷r xŽ4¸½NÀĜh€h€h€h€h€|aJExğ€İĝ_Áߍ=̓څŻG’‰fìžĊrьö 0âĵÉ銘qÑDGàM.TČ#ˆŒ&’8oÒ¨ˆG<}¨i<ĝÜHE|°½NÀĜh€h€h€h€hÀG>Çsĵ¤³ \“m­!ï³×E\k(<á|ı”È}ıPä>‚\xq1XĠsáĊHNż bAô>‚\˘ú9‰\F܁^'Œ`ì 4@4@4@4@4@ótŜ½şÜyêi8£“›8ñiÜĜĠ ·*UM pÏbh‚Û³X4š!qŠÌşé÷ÈMÓï#P[òь@_h€F0ö     ı|”·ôsGîl,]ÁÈŬs‹#E36Ž@.š1ûÄ·ÖéJà>%µ†|ӈG0r/`y׺P ÜGZCJ>‚ĝÖj$Ş/7M#µ…ä#¤× >{ ĝì#xF×eż;C£ Óݸˆ °³Cç„ĦqµíŞ(4ŞŞ°%xµ’DU¤ĤĦĉgËÄÉYÔ=ĴûÜ7ˆùĵÁĥ'Bv„XMc‡=lĝÜ7hŬ´ş³Ó@ïñğëm`4ƒmš‡çMü4Ħö¤ĤiĝܑXô=‹!Ž|@4@4@4@4@4à#HFÀv€w##P]Ó\ yĊ{?>$!­@JŬĜú<Ĵ‡ĵ~żü4ĵÀÍFÈë÷û$€Ĉß}öŠ÷~|2ÒÖÈ ì#x7ùâÀG£5    K>™Ġ%!4˜É£„tĜËMè4t|™!"M¤#˘ş‚ŭ–€£53ş µ-o‰g¸ĉ†Z2·œúzrÔ>;ΰIŸží94­€h†NÈ€ĈĈG@—‚ĦkÀ ([³ƒN3ÔG`œ˘Ż9˘EE³Ž)}8ÍĴ½ċÄG@ßİfvϋ04}}èW'ALšÙd™h%G6Ñ£ÑÌ˘‡ï%ĉ³/#üLbhŜ™Eĝá+ ÙR ~ˆ’!Jkö˙9ĤòüÓq¤°IENDB`‚gamera-3.3.3/doc/src/images/classifier_window.png0000644000076500000000000034440410714675724021012 0ustar chriswheel‰PNG  IHDR8Ml½+ÂPLTE  #+ ˙$&#\ /&.'ƒ:-/,3WG-$(3Y$6d774.6W$HM;9<,?d-?lA@9)A}7Aa_<-0Gx5FrFGD6Hn$` 0JTH]ĦG]G^‹[]Zl[AM^†Cu;+‚<>eŻGd£Pe‡KdžˆQ`Nf—\`•UfŽodTIgĴhhfLiŻ.@UlPlĴSlĤOlħHp´KmżPm³^n˜O…ISoĥopn>JmqtcrUs³KuÍ[s­xqk]tWvĥIµ[yş0£Wa|°c{ĥݰh}Ĵf~ıi€ĵ~c„pƒĤUˆĜ0ĵ(q‚ım„Àƒ…‚Èp;•vİm‡ĵœ‚]­wt{ĥH˘¨pŠÀ{C>·nsŒŠ\—ĜuĊƒŝ‡Ž£|Á’“L°ı°³€•Ĉ“½—™–uĤ…›Ìšœ™™™ĵˆ ÉâߎžÊĞœ†šž­ŸĦžı›xđ‘hħĉiĄLĈÏa½Ç²—·ŝ}và–Yj½ËĤ§¤ŞĴİİĊޏĴ›é£p´ĥ´Ğ½ŞwÏÜĤıßĠŞıžÇ½’ԝ‚ÑÙÄıĴ#ŭĝÎÒñĵğﴀ†ĜßÒ½Ğŭ­˘×ôĊÂĊÛÛğÇÒіÚäħÒĠŸÚò˘ÛċÊÌÉîŸŜĊĈäÉÍÏËÚËżËÏßÏÑÎı×·âğüżÀÑÒÜĉËÉĠÓíÍ´ċëÎÖë³ïħ½ċŜĜÊéÖğÓÜÛèĠÓğèÈêíŬ°úÒÍŬßÜîĉ‰ëŜÒ÷ÚËàÌÇí÷èèċçää×ÜëëÍñôĜñĜċéùĜñöôéÜìëèäíġìì÷ßôóÜġúöáñíïúé÷ùíġüúòìüĝéíŭŭûúñûĝŭùûù˙ùĝŝ˙üc‚ì IDATxÚì½}p[×}(2Ês›ñİ9Ò*•4i2R\ÏÄQċT•eY˘­qÙOġÀx†€ÀË-%ÄeĊghÄÓS",À”ĉˆÑjì}NóŜ$Nßĝoĥ펧ÔkÜp=µä>Fµçmŭħċ$ñıİ£ìıŒZûû: ·qòҝ€ÄÁıçëžó;żïsî=ħ~b?ùüäó“ÏÛüü›˙ÔY:†d³ë ĥüìùŸ|~òù˙ÑgυwàóÌĜÒk@8ħ'.^¸°ċ˙ÈÔää|Ĥ§g~òùÉç_ìgzzÑxrb÷…ĦúÛ˙‡à‰ĜÊ_ǀn.ÍߨW^ïŬ°f£ŬLßœì< óƒsÔ7ƒ}ÁÛE ‡H„WŜ.J09}¸9195‚h=ˆìÏn|Ò·  O ÄÙ‘Ĉ[}Ÿf_ݍMžÏċr·žœÌŬz.79‰ħIۇ1 ,Nb3ÁùÜdîŽÇ1 ƒ;8‚4·r‡ç!v/Ì›€Óĉ ¸·I49 ĤîİAÚħê`@ƒY”l—9N+˜à$^žÀ'ñòÔ (†5NÍP nyjêĤ8€n`Ì@DOĉnLLÚM˜4÷ñÒ\ıt·hĵŝaŒú,½/ĜË3f”nĵ —>¨QÌ´Î84 4<=˜y;<™#vĤo„Œ%„/Œ9„C„M€Wfьr ˙ú°‚g'scš³cğİŸëCöÖ[-@vßي˘[ouZ|ñÂgcCOŬ´\ı²ħ˙ò Ż<µ.îÉàÀsİħgSıÔ­‹Y(vÖĈÎgŞ0Ĝ×Kċö-f ĥ˜Ë`áóŒa0iM R6–Kċ̏ċR‡ħİÜá2dÁċ‘Zƒ”aÚl–ƒÜ‘*Äî)SÂ gcŜ=³”ĦĈ=3˜Q€àXîv cP0cƒİ Ĥ0ÀĜĤMa˘ •` .OMB‘Sd%–štÔMċ\Â´”ÉĜ¤r™1ŠaŜ^RŒ˙ Â1€$ĤVV¨=×òTÎż9÷j2kcêx.gĈaƒ13ʙ13ü);ò !†ZŠ@‡@̘2tÇ ÄgĦ;GfİÁ>k'j 3ĥ˜Klċ0Ĉdâ  °A‹–0ĉd,6e9\kBŬ}MDÇĤĊIÂS ÎS ` Mċ•pÙ=lo] _dot0Ġ‘%GH#ܸr%\k ²‹]”JîB%È}îž\îX55†ŬKg÷Of³ûÏBìñ ‹kĤ“i  {Ù4 7 –kf’ÙÍ4áĜyö7ĦÚŝĈĉ²ÙôŝıĤ%!(%CrİÁ}Ì&1€rGŞpßC¤•!v¤„—1 Ò@µC(w¨ Áħi¸<6“Äél{ÉiéìŬ3Pĝè>Š5 `Z>idÓ'&³céµ£SPĝÄ$Ùìè4p"ÁéĊ Ñg’Kel5RX$™Â|ÓÙlĈÄä/alÙL&›†ù‡İ$ĈґĤèıĴı[Îô µ²‰œßż4–Ŝ pl8Êğ§38Ŝ1y /“àœ‰g~Y›–10Ċ g‚x €s¨š¤™Iş9Â'4eggËİÂ-oÇİe<¨(dàK °°Ċ—}ó€C‚pˆzfp ê "‹i΀XĈ +-X‘rÀ{‰p˘ÈĂÈJW”Hr;šrò œç˜Ĵ^ĤÒ!ŭCì"ĉîÎŞfÇ2û÷“ûšÉLrßb<) {É#½ož‚D((‰‰LòVˆ1Ë%3{ç co ZÙ_K@€—ûçĈÊpĦtz?@Á —p·ŭ³òŝÄnŸ…ŒC(|¨ ÁÁ´|h/gÒ&VHb‘L:yl îqh*—SP÷Ó@ÜG§ 0\&9ínŒ!şĝÁ$Ĥċ ÷¤1–NĊĜQÀÁä‰Iˆƒá·ÇËĝµŜ[cPğWÉk½ëÏ$S×Ĉ“ß½Í'RIèY¨†˙I „4É4_Ĥ9ĈŬë”HE) ÂħôT·˜ÁûbËcäÎ@<Éä‰ö “N~Z÷ZŬġҀd€  ÷È  íî4É£œĈ€aıwOd$›Š#$áöÇĤµ Á4-1†¸…ŭLÂLĊ,§%Ó òí…t˜ĠÎ*NL7L-–;‚ ħ´ a ´·żċö"JaŒ‚[ö2áöÍ%ŠŸ&EÒP}¤”ÊìXdßDTż˘BÁv‰B^&Ä+!'{¤"9…!)c@8`An(d˙áĉ•‘ĠŽ{ŞİTj˙<ÑH2‘ĜŬÌ$’{ Hì[L`§âx ÁŜf&žòˆ§!H$˜Pĉ‰ÌŜùx"q œMââ4 ÄŜfʕӉÄŝr:“Ĝ_ƒ‰½ 5n/ÛX)™€X<ż½ ·€Ç1-ÉÁ!ȐX)dı0cñôSŞ‚Ĝ T;:“H$îœĤZ>4 ¸pçôàèDÑ 1 }9†xtt’Ó H?ŠÔwÛj‰gCħäèd:žíġF2£ıtĵ×é<ġpb´ÛŜïµ{O<1ÖímO´ğۓ'²Ŭ։ ĥ’ÇӉL<´'ŞH$„Ñd÷*ü&ş×·Cˆ×‰8€3‘ÄÂY¨›zµŬ T·ğ/™èuĥ#$ =  aċÎġñkŬ=# ŭBžŽĊñq ú¤p_o.˜„~e$xĝÇ&t(AíÎé ÂÒNĜNgâ q ŻxÀžI,3ƒ1ŬŽdt{5s‰dT‚–T0ƒUœÁ2Íjšé*ÒR r÷—áûËñ,°XÄ&Ē}„H@‰ÀgûĉÉ8 `áZ‚}ˆ“„W€ŽÌ¨)–Ĝ³wÛ½…K¤ħLf/qÛŻ°òuĦq$q#4Ɏ4@6…-Dâ ]0òè# çî.€â€,ş’´ŸO$ &ĜӄıŬ£Š “HI #À†½ó‰8]r‘½–8R@Ĥr/ Ĥ¨AʀA"$IHKpŒ@—ŞÛ ër2ž€0 `hPn‚ğ§ ÷N €x0Á4”ğûLç=ÉżqĉNÀ# ’q+qb¸€VqˆÁ­&‘d ˆ"†B9ÂA,ˆ3Š88šëġĥSnŻ÷_ß.w&0ş7 )#i¸œŽ#bu $…˙`Hp¨÷ş#€ŜÉ# ÌIÄıT[€ôĝnżqûöŬ\ÍtÚ2ÔMcİ1ho45öqâÛ·Ÿ@Şş{ûHğË=M„րîÂĜ ÏHFƒñâŽ2 àĥ({÷d‹—Óqg2A˜q’ÁᎃΤé)À &nGtû ²ż²şQ4şżà‰ß>Kiˆ%@KñÛQ+!,ŜK”¤˜O\ĞA³ì9¸Ñ^BBˆÂFñ$÷ Ĉ˘KeR‡Œóş³J6[áĉsV' ï”>á•Ö•–MYs?ü< 5AĤ\lĵûPïmIp#ÙżìtŻCċOĞ.´8úiĠéĵœItŻŽ^ìužíĥ≵;/‚ĵéâÍâwƒ2I‚‹ô—Ù1S‚À”ÄÄ^  %—ġ¸Í;Dpž@™Áj8É(`>(€ÉÄD2!–ÄiL<ƒ—È(n/á VqĤËHUœŭ’áŸ{‰Cb‘DZ"|!Ž›`L䈐Pı5²l$(ÄDBV`Ŝc–ĉÒİ4:V ²³!i²ħ¤À‚H1Ŭ<ş 9›Öôy9„¤+”|E”1”8-$´+›aÈŞZ*u;³HDäèżF÷̏bžĊ÷T1DHb‚::ß7Ëâ$5€fÌBS)m)¨Äœ)9şvŠœ‰j‰£š0 “0 / µL&G"3„´ÑäÁ œ œÏÛ'4ÑPÔħÑ;'’£D2IŒ%ïœE„@ĴȍŽĈ‰2] Ĉ$´|çĈËF‘úâ{~³ukük½OŽüğÎ^Ĵ e:_i8ŭ{˙ùƒ_éBñö_<Ŭ…YïuvÜ7úq”=H8Éżz`Çoĥî½Ö½íƒ˙q÷ĜµömüDɝÎö=½ÎÎQŞŬù‹’½Öp³ħJ(îx|†#Cz ˘È$+s›Q$#ÌEBı!yÁ1‚.Ê%¤%˜€äA¤"ˆĊ‰­ĝeG5 S ċÊ0oûË£„+`.M÷,Nw9ÎLtħdf4Îħ2EŠPcÑ£&Â!ŠB @Qĵ"#½~‘!Ë ÍÍÖÑÉ0ġÑGˆplnn^!zj³³MÈİĥÀôYħ§C.G| l†,q@UËŝJ)“"k:óĥg‘)cH#s£Ĝ3€j•4 $@É(I:šÜzÀPÔŬ^Äq v°:J EÁ=˘vvi Áüq7P¨%ɓ@“…|ë ĜĦ8Y,VFqĥGï¤rÓ¤ħaSÈ*afŠF´óžd;Eˆ$ĜÀQ²`DŜ2eaXG³Ä‰ĦÄHwC„ ÛùŻŜĥŭ$"ò'zO=ëêĥG>ÑyêXğĉNw{ĵÓÙqGğ;‚¤5 &H{Ç/$ğ&۝Üs"ħûèĈ2íüÂèŬ#(šŜÎO´Ÿş˙ë|ôğXĵw}7 ;RKo$1/´ ÚûP9ñŬŜ.ŽŜǟĝmĜ¸%Üş³= µ?˜ë]ß9ÚixûŝS8ŜJK¤Â(rŒ¤ HB.S ĤħĵXáôL! ˆIñDH"`?ÈŞ·%ÒԘIXĤ—4üÍÔ½Ó4o4ƒÈŝŞ8µ(V&s- FZBċžİ…9nrO•Š0 Pmi´Fç,v :b Ș|ÌĴLfD‡ˆyTĵX Yë*AŬĞċ艤RӕÍMò\D‰óœÉ ™ĴZ)r÷*RÉŭĴ(&IŽ’LLî[$›… vjß°|6Ŭšit – ")I–ÎŜùQ£´–1 ƒŭhA‚‘Ӂ6â^r–Ħà&Ğf?™(€)Aò˜ċ\6A“H2IÔ§iP0-F+Z³D˜vµw¤´$Š”Zb"£ı“´6Ö@Ğ&‰x4š G—hî Ûì(˜¤§%O¤ “G{ÎġÛN˘ħ3ŝĠÖAÍH1_m,?R%Ï ĝ‚é³3›Üïuş7räÁħ;Xú-í'½¨°†ÚÛA“ûèw˙jûí^§ŬíĵĴtáu>€9@b0cFŝ½zħ[ż˙nŻ÷â ĝét^I˘2QlAO:n÷íh‰Ŭ—I²‘ƒƒ!ò€Á¤pX)6ïplÖ@zZÎ@è(,.@¤´Clîmy `>’& M Îs„zZ’™ÙA´eöS‘yҙEÜGd ÊĜOÚY™pƒÒH]I‚ìE“ äoBÔ´QĵD‡Ĝs{“hssNïŻĤSħqBÖŻH´€ıÚ ¤›ÍGl6ZìU#o“P(k݈;ú‚SLV@ƒ-qG—²Yt'Ó@(ŸEvŻ%‘„!h&Èû—f5’\i ˘AÚ7{çÑMƒa—[|-›££¨j ošDsvd?¨ı9œôĵì'€Ï"-‘U‰—‡xĞ5´RK›;ivˆ´HèÌ é ?:•F#8KJ:XÌìEt™tI° $r2"4˜GQ³c·/û íD×ù•k/L"ĤAä€ @*I~˘ûTğğ=’&A*Pğ½Zîôvlß}’Ú# ˜|í HM¤³I*ƒÄµ3ŝµÎïucgÄĠÈÈÈöí`ë7şżq,‰2#‘úèĥ?°û _⣍Ϸ?œ9‘ÄŸIèÁ(Š£7‹•w&€' á£cYr ¤Ùp÷ıâäH0 ˆÇ@Z<{Í˙cĦ;•°“&¤ * óq÷t —Ò8=ĵFâT<‹^4˜ÔŽ0yà‘2ıpB‘­D‡.@€*\a?Í4zÛZàìïG³ż "~?bÓ~òӒ3z.Nü8Í,›=T€\i ™4^bzÖĉ Ħ Etċ.ҚÇX:Î‹Ĉ cĤĠÚĵrħa´. œM œ Nƒ{ôQ& ¨‹¸ÇŞj˜½ i•;CV;ÒıÔĦjŠ|É='2q Äa˜Î°×|Ż!(^ìĦ“Ns;ѓÙì^\šî\Ŭ‰û 2ÔçLY“‘`îĤS´­"Ċ`Ba0!Ó żôħ3clˆÍ $ĞI„3á|ĴœÊ¤ÍBĈ!ĵÑF¨!#;ʈ MÚ4ÊŽ˜C´˜KgÒĵ‚r3İóˆuóœ†ÄC[ Ò)Ü*€;\c›)ԕ²é́ĉX&w¤šÛ!=í˘ÙÜ$!Ñ"Âı(ZWˆ ×&éd˜ĵ‚¤Ê–Ü@"#‰c×qH‘kmPñ+(qd4wOurbêps2—ğ,n :—ɍÑ&Ħ;Ÿğcq2cı܁ĊÜĜ䁳9Ša€iÍÜ$vyrìHҎĥ‡ùŒ/G‚ħsSc¸0—}g bĴGjıħÌ=µ1ɸg.“ÉĞaĴ69ĈiÇʐ 8–{ Š…\.ƒ;­rÌĉr“÷PŒ¨û@ƒôċdz˙ÀLŞa+§ ÜÓ¸ƒln~jf*“95ƒSt™3ÁÜ-·cgnòÛñw*7™Ĝ>²“’rı; šÚ1‚—™ÜŽí“S·mßıûôĜĜÁ=#;o½wKe2ñ½#;ïƒÚıƒ;F>x`*sÛÈÈîGĈv`ʎíğ''Ç&îÜ3²ŭÖsĝÉäRɃ{@Óğġ´ĵ*ïÜ~ßH ëŽ|p‚r§îp;hf,wç¸é½İé#c§ <„ħÜİ’ !uj…€à‚€!=P€"'DĉNˆ˜3@$ˆĈr“Çf16›Á ÀIÁË{(¨á\ŽèŽÌċĈÌĴfr0É3Éóc9F†#ó„ p_Â5(2–9ÜÌàNP¨‹Àq!vxqlŒv´ċöC€ÇrwœLDԃwsžƒÜ;E 3¸×“/'&÷<+ÊPMˆŠÚF‹×q:ìn…-7-ñ|˘=j R6,˘çdç€QäZ¨ÁaC›LVwŸlNONŬğ85=uÇùiÜÑ==5ħég§Ĥ§Ÿ‡Œxyßùéééû§áò,]NàÂÔô½‹pyĝ,–ƒžÄ"tév—c¸Ç´Ûg~O“.!$ĈîĜÔ½ôAîÛĜ§OÖà–´b@F2.KîÔÉ*d<\ĈX n‰ħé‡Kpù0fœ˘Ĝ,dû*ĉV§(À܉ééSĠIlÀ>Q@;öËÓĵ1švûçJÀä4Œ7‡LH€ipz„˜žœœ˜Sož!8Cá$ĉN›§ 쟞œÁŞÓ“9LĈ–%V˜ &Ĥñéi¸ÇĈ äÌ4÷túT‡€ƒž¨â(Ëü2ä‰ï,tó _1k D £Â'ËÓÎ6a5Ċ³0G‚}ŜNŠ}˜ç'3Ĥyşqâ§16-(ÀȀ—ƒ‰‡Q&Ì9?M¨Bx5M—Óô”Ë}ŒMX ÄÁ9¨{^8‡ÈŠuéħ‚XíŜù3@8Î.![ž$È&/Ĝá @’‚ôVK’Q Ġ´ÓÂĴ͋Ŝ^µvHn9ha‹mAéäbĦ0ußÙRĦpßùÂLéóÂÌ}çJvnĤT:Œ÷ž-`‘*Wš½ïla†b6­ugJ…“xù .ŬğX(•O.–fJ'ÏB+'ÏJx7ÎJ3'›%(܄r'!÷áE¸ÛÍ  ÈópˇçĦÄJ…GĉĦ\B. f Ì• ÓóÀédœ0àĜLáôŒ4ĥwzZ Pš˜…NB.3…Ò™Ù’İQ…›eİt³Qš€´™3UhàLË%̅ L+ĤĦD‰ú– pËÒla–/Ħ@ĦµĤèŞD)33 ˆÌp>VÁ:œ‹-— x£é2Ŝ|f'ĉ̔°C3ÓïÙӐV˜ĉ>CvÒ ĤÀc›¨á ç yÄfJ§)­\šñÀDÀ> p.ˆ)˜)LâX÷3&4c.g /bl' &oçrħ‰Pj†g‘†&ŝÁEŠAOïET9 AáŜ³3„CŒW`¤µiçŻÎ"†›‚\ÎÜGi‚z” @‘ç‡GžC,Ä=ehŻÍl mblÜ@nM˘çŒÄA y‚6 H•µ_çuœ‹^ĵĜ¸¸vŝéïċ‹ĝÁ‡.î.T§qôċÏϖŞ÷}şV*ßwn‚óe"…*ĠBùŝó€ ÷ŸĞΖ<_ž…"…Ù*Ĉ²P=y\†XuĥüàÙÙrġÁ³ċ*‚Z~ä| 3f!|Ħ\ ş˜V~d2ĜTàĠÙG€h!­\ĊËYŞċ2ÄJ³VBa˜÷ĊêláôâlµzşÉAiöt³4;{zât³\.@ /ĞÙÇĉ`0§›ĠYˆQ´wĤ ­”›jáLsúVƒÜr­9Xxzn^.côP>38S+WËg âYÈ,Ê% µriö ܌ƒ* ”‚oİFe1­ 1&ÜZ†Ÿr CYÀ*ĥ‡ ²T…Ât](×ÊH˜\ĊJP Ż< -A*tnöÌ\ıT›”Î`£3sè™@£\ˆJ0ĥòìcMtbPb³0rH{lŒ`‚†`tM¤H‚isv¸ ô Àp^Ä4˜ ˜#è*U˜{Dƒ IDATCß~z‡s> óVŞ>rv–&f&L|ġ‘Çá'‡iô/–għÂÀ7JŸ˜a ¨ċÁs0RD•ê}ˆu€ċÙÏA{÷Ÿ-#bVĞÈÚOKH<û> 0|<ċáy8ˆìˆí1|ùâËko<ÈŜÜ_ä‹/Ó„ä—×LyJ]C*ğˆŞÓI˙çâĊç.^ÜQ-Á¨Şµ‡ÏÍ͕‚\èĊf§†—ĝI5J…ÊÈÍ <Ü @ ìi{*C€ÂŞXáħyê”ĤAeV2jUÌ­òhĵ4ò9e4V˜†Ġ8F £ÀA²†pĈàl§Xƒù¨•O/Ê V1(Ÿ†"p Ŭ•ı,Ót32Ìá„âäÍĠ>O2Guˌž/ÏÏ>ÊxUËF\£"s÷cÏCO<7W£Ĝ<˘hb|‰Œż Ò²6B¤1ˆì.xñċä/âß@òëHCD8/ì}.üòë/żˆäġâĊŬÈ˘xÎÖʕùyè( €1.„`ŝQ¸Ä`ž2 £ó„Ŭ8Èy„”Üsó%lrO”Îbà>dÀĴ"=Ì=†dù‚ç bóó^y~î1ì¤Aìñ9ˆ1É !Ñ%ĉBpŠAÍ40oc‹sóÒ`6àÖ<^Bµ*’ Ċı2Ì'¤AÇ›G4ĈF)h"e<éŜm~žİÊU‘Ħ.Œe9DžLF#Ò¨Ġš0 "’ÚÓŝÍcSX“ĉkĜq,†MÁÍkÒèÖ­5›”ixóıL­,Έĉñr~އ_Ĥħ)œ…ΘAc]*Á…Ӑdö…xˆZ~ IÓ<§=>Çs4gZËsÒÊ—;ÏÔ7Ì ç™<Î"œƒûĉÓĵ˜Ù›£?êÇÏ05Y›g:oât<ÍñÄ7yà 0Aóˆyì+òžJĴ7OÏSÇx@Ĝœ'̑lî?5Ï ÂÓDP˜<‘ĥÊc£(`Ž‹`PnW÷ô!ú֟‹ù`ż\‰d£Şöë[|ŸCô7L_Žp ~†lŜ%gLJ%‹âÛ8 RT½R|Ɉ I#î&ö_šàr&ÏT6m Ùdb1sóa.Ġ˙!éÖpÌ6hz ”– ¤ÈżÜÖ4íxŬĉV†| È×ÜÏ\úƒĥ]`ÁÁùħC4ĥ œLŻ5[nhÈAÜğ‘í˘…žÓ£hÛvĝÚá!7vĥ†#òo`şk`<äAÛ Ú5‚yCZy(5ìO’+BñŬżŝN}€p ÖŭÁ'Tš?˜_(ĝĊDÂk ĦVœ”ù‡/Ĥ)ljc.˙jŞĞ°,@YĜ€”Rš2°:ċ+½Ž·ĊnPeÒ 0 (êf\-àKMMQ>ßKÔşĤ|L ¸{”H¸0ß ›¤J·¤1J7é˜bĝPmnŸ[˘‘l ½uI„TˆSž4Ëmèʏ_1ì¸sœĈċ¸$’X×ĥÏ|O‚’6â^œÈmJ]-½äV bf¸m$Q˨•2ƒÒĠŠĦÊ·àѵ×'†9'%0ĜÁ³˘‚ÀfÀËh”Œa=3!26Ĥü2X ¤y’x@ÛĦ­² 2ŒŝԆÖ-&î(ÇŽRŒŠ&ĠÄ! ˆÑ›ħ“˙en ï ™.¤Ħ½b°ÉìAÙu!K-àv…ı¨\ 3Úse „•`°’‰ĦjP§`MC@²|Òâî“!CQŒI° Â4ˆíÏ£2RBAJŒs…S0Z)Cε§Ö9× š’żëZ8Ww”ˆÖ…,8_3tÖµ2\r½ µ6Ìl]&f]™ĈŸ)k]°J ïÓĉNJ†ÊSdA 8Ħ ŠJî£Ŭl*€3x!ç@pÊLĵéÏ: —ïĦ›˜µĊqCށĦufĊòkˆŬ•ô.6„H€p @vÈ ıĤĦe…‰°0!xÓ½’³ċ¤üY7ÄéwAJ[!eïÄìHÚV–ı°(1ˆĝ- —25”°{wé&ı@MÙaGú´îúÄ·Y—ñ€MÜNƒ2µ<ͤpÄŜΏ—d£0F<w”A?mŞ şypi'UŸuùJ`aËk Û–OfZ"8èÀMşÉUá‚(r˜Żv\Z [dŝĉ÷P(Pûp „p–‡;}Eˆba)nD¤ĥC7"ĜÌb`g‘ċ—_áM‰z„ġÈÔâ°=$cıŠ d?PrTŽaED€sĠ_PkŸè{áPŜ ½<N|”ŒÑğڛĝŝöŸ ˆ4éÀ§gwi‹è ZÀNEî4ï ûnċƒħof´TdŞ"ŭUÒ¸OíŬĜħVuñ+_Ùy˘„7@Ğ‘EñÀ'bÛÖAWŒàS8)ċèH{—"ÑE„Ĵ›°ÄRÑÁŞèE„ÙD6½Jô˘UpEŞÒGœ"| ½*VöIŬ·ÂŠí {äîîÊ(*† <̕ħ„Œb`XĞĥU ahsKċ é C$e9µ¨†ÓhÛSCÇ)ژ˘cŽÚ;*ÇyEϳ,MRĤWY•ÍÚÚB?`KÒZ½XôZ,À‚ÖĈ3ÀÔÊX€ÚŜד—VVíÔ §phQ^1•U”' Ŭü9…E;Ï)P\~ßL%§Ph;^m”…ÚĦRô($‚­9żí KݳĴT:x¸í2ìŭ´œéD‚Ŭ†6dş#œÍÓ<& ê™Eċh…JYH*ÔÊwP8]5҈XċÍżÏ›”U½”S³ÉMŻú˜™Šp/Ç3ĴQĦí¨É_‹ğĊŬ5°^íxIS˘v*Ÿ§+§h+0‰ŜV…k֎ħÙYRhÑlDLÖıàË!ı˜Û´3ö”ažv}TĈí ”dXħ…€pîÏ BġĞ(èÛ7ñċ¸á=SG-í(ċÏ,XïĈ˜#G$N Kµ\oĊ7e:„Tħt°ĊGG57ŬO¸ʒöô/—cR§Ä¨> Ù'ĠuŸĤĉuAkµ•Š0 ½y£4ŬÒ}}ßÂrT7„ЧƒXÄê×jµĠ:ĥèžŻhÛŬ§ÓyşS˙-tBŸÚJ  Q&ŬĞ ÌKġÍÜ ĤĤo A-­ĥ.Ĥ­YİÄt?ш=Ĵï‘< &à֖šš¸ĜÈÚW.£d(Ë]”•8F‹ÔDG”2Ĵ?°ĴA*0÷Œ)ŸÛxŜËúې21rB@Më^ñÌTl/âŬó¤v’Ñ•PjĜH`KEMGKD£ġ=ĥ [)j:Ê#E‹Ûž:9 ¨Ù:ˆ;­ĵ!*×KÛ°U2m_#Ê|„)Ċ¸ |Ryµ‘Ĵ֟Ğú­ċĆU<­ŜÌŬŬĠšAEÍdèÀİ"ĵÉ×zû͸AE-p‹ŽĜžjĉY][(bı äƒ bħ˖£!ĞӁuƒ[˲%gá‹ÄħâWĊ‰Ĉ§[‚ÂXD3ÄżMÖħ}­ÉjnD7‰Q› *NWĊŽ"â‚q‡ Äì] !Sîà1>­û<Îä =MÍ*ġèÛ'—"rä`Sù~£ÀâŠħZӐÏ8Z:£J[µ5pj™%k_Ù²°SžÛ¸‹żoÄùaœiÎmç)|*Š’²|àÌäuڍÓ9X83ÒûÜNµÒMÀpÈo‰ÚÔŜµħ´ ˘,×xĥ£ÚM§h?µWÊ9_TàfĞϙ$4€XÛp2F°ÎúTŸ5&ë8†sBÒeŒŝYé~%üۆɟ nÇb Ċ3Ĵ‹°Œƒ’D¨Xy˜zĈ0+ˆ9W˜Q ’žÂü`È6¤! µĥ²îóqN×Rƒú£מL÷2}Nte8vèİòkdOÖ"0ó}96 éEl[èÊz´Ç}•2Î.µ‚$N `@§TÊӄô r¨˘Z¤RQʙÊ“×zK ³ÏÖÒ œ-œŻĤ-íwÈÁĞHÇ=Q§·XhħT}(+˘²Îìw#ô|Ü\fÓS9Ġg%É:Žĥ³“ԘV" bYN•1'˙É IJSU°BGèĊ°Â!*‚TÀ­%PœcÑ”eı>K9-yD‡He1Ħ$n>âÙ°³1è{ô€a%tr€Ċjèij-Ġï³ LsN0³Ĝäaµï %˜ó÷[ד?ĠĦòÔ­>ë/²ê£ÈĜW}ʳsÍ2Â>HtùÌ×ԔŻYş[;…e2™ËžÄ÷—0 `̆Ž(ġóo¨Ô¨Ĥĥ1à{aû,T6£Ö‚ò•ċÀIjëİö[Vċ BĦŠ`ßÍNjÄ'ÂlÛöBL˘ÂPĤÑW‰^cĵDVRG”*§`†ĴÛÑĉ˘…˘J‘K"`kɎPµ˘ĵ•Z$@ħqbô•fëȨoDaàğ§BRi÷KmjL½Ŭ·â½ ‹B³NĦ#¨ RéÄGjq²öyşTdŬ{ç”eŬĴê;k x×MíĤŠşĊiÍ OwĞċzLë‹ĦïÌrËÜZŠ’ÑzjQ¨£şá#U3{%ñJ6€£5evħ3Êt-”-IN-Ĝ¤&ÊÓïCZŒŠ*üAßRş–V#/t͈SÊJċP<ŒżÍFh85\ë ÏÈĵ­^ĝZÌĜâ˕!2˘J³{ ᐐšÖ,+Ą7 „6l'fpIÔħŬ“† ÊâÄ‘­ŠE¸€•&5-0£Â*“UJÀ°'­}‹4ô×a-ĜµlŽ3ö§Ĵìp—qï ɜ–³„½Ġ™³³Á"£Ç>İVKıes-ğdé3Ŝ~û ĉíQß/Ş ßéÉw íĈ:ċ;Ĵ”ż¤àЈl”xÀòƒċ’·Ò@MW–wÂ~ž’]ˆ-ğäñpSÍ0`ŬÖXӈž-ew™ħ:İú7^0)÷İ’‚ŜŠP:àċx;ìMڄ²2ÉLŞñg“<!¤Ĝ9@4‡ŝŸ˜Ĝ;1ÑĦ”ês½°Àp:’Ñ#GW²˘x[L­—'²ÍG|FşcŸ”êÛx`–eü}üBeÍĤäğ…,F- íïoŜ]n´+Âm–Àw ѝhž=è)RÊìaÒÚ²Šlîï۟k‘Äıf„zµÛŸîëŜ6r²q´ĦM­"ÛNÍ^=mŜ0şž2€P˘ĝˆ)û„‡#vë6u›ÉĴÎĦ͚˘ĥlL6“;g6ùÓŭĉY*ON&{ üÇŒ–î)j–‘ڝTÚÛ4DĥÀ(o÷ĵ†ò7“ £.³Ÿj“9°]¨#>: Mi M YÔòXż˜tñP÷/ÓË#K(=ċöúĝNݍċd—-$µ/a´]Ah°^ĦÜ*Ĵö´ÚP;Œ ½•ÏÀßAàŻ\Çc¨}5ÙttˆĊˆċCC\WJG7{fŻ/z„ŭİpÏ\Fviş­Ä>5‹2&ŠÉžeŬ'ځRÑóM$¤”ÛĈáP,fPW8šKEħsnhˆš•gŸìĥĈÀ>çÜ{‹ ²ˆˆ\¤ı³Ë”ġ§ë-!ž]ifCŻÙ!Ğ•÷Šġó„vİZH´ċĠ– ·Ás(Zp Ŭ>·Ħ#âYÑnġÜÛŻn…´â5w· Â-Ehğ SûÎv‘Ma`“Ĵ–Żİ)³ŻSEѵ¨Ħ‚è>pG‡ƒÖtDSS3T[9Œ¸ƒu`wh÷$h·0dşá-$ÈJšöşúûs}yٖ‘şŞoË?!¤öÖ Ìö,XG“ż€ċ6yx{]<ݚ(ÑmC}›û›ì{DL ;çöÍ+îĦ û”‹§}ùncyZ‚U׈˘fw)Z%ú Kı·@ÒŻ¨iğĝb}öÊ{B_İ-ž‡÷ßA`£ "ïòž?2(kߝb„‘Vïu ­AdÍTä9~5ĝDŻy{KĦŜ-Tê3Ò>ìxK譋+û‹è“0NpşíĵZûž íï€ sE3`~oxOô $™ÁPıŬ[Ês@ê ²‰ĜÌ;²Z*§•[Rató™Ċ(|ώ˙(”Óvd­OžŸUk÷ÑĤÖŜ£*ô •oç„ߟ-yŬ·_ŜŞivË£“8Ú,²+‰W.xߟ󈘭˘vrÜóóŝ[1tä)ü¨>d·Óġ=żĴŒĤUTˆÔċm~5Ĉ§{Ì&P:êŒ0Ä´²3GÜ ğ÷Ôħȓ†Iĵ˙ ïı*côXĊ)ôPú;ηév¸×Ĥ¨èCi†1…4ŝs’*â™2vVÑgKú=2²‘§‘ö™)÷n8–ñü>=í?€l=óâmq A*·ŝ¤"ˁÛĦüÇ­^œäàŻeqÖ<üGcHÚëkC­@ŸWĥDC—²MÜceîĊlöùÈ kċħñljèż7géqƒŭ"D7ċ²ĵmßÛéÌ-ñÂ5İĦ‚u÷ž”ˆĤĤ]£Ì 6Üë,L a&Ĵ`nx<Ŝ+ğanzOĈ¨Èǽèe2ŞŠ'Ŝ6yï>ëòBè핂k#ÒN¸,û³oŽĦI²/ŝQnpNhYIߌl ƒèĝ”Û6iĤiyŝ *¸Wz†ÖĞç70E{dŝ 0à\·µì ;UÓhn×ŬŒ{‹Nl˜!„-ó{¸ZÔµ aÛ9ô^+éÏÖ>ÍeíœçĝòCKǗ?qCü.K ˙àû„¤ñġÂC{è‰ğ–¤ô²ÉhÁĞéç-Sû ’·@­bĝDä~ ĥ–\ Öà/h§+âgĵ‚˙ÑO(1’3^÷Š`İJ…ŠŭŸ-”Ò˜eÚİ ÖŸmq‡hħ>H·*~JeëV*^A€cĜ"!ÚŞe£]ğAž…‚-á%mÑ Żï}5ı^ċ†ŬîIƒîƒß÷BĊüÜh^êĤz¤ġö¸û<„_Ròbħ!˘á…'–žXZZZxŝ—!|b—)™s– Bı”E…–!ĥ@e1}/LɅeş4mÁwÒ¸"†rĝPAĴÂ÷âTÊA$èŝı0Œcİç•ú¸J1^„ëÊ8%ڜúxe\*)'…\š°Áu°4փ_Dq.‹ż ıQ…JÔħdħQ—&é&ö#·İpá"vûK Ŝ(Ú{ŒsĦb̐tşhGƒqh¨Ns>ÎŬ“’5•ŭŠ6îwRîC?2(ı­›mÎUáòĥ¸ ǂPJ0xŠ’Ĥfj8.P,zUċ6vL2š-ۇb‘ĦiǏĊşi͂Ŝ6èĉ€–aê ŽÌŠÇewàÛ&ĉŬ9ÎOñVu|İŬtşĝOğtY=NèIjËöèO2l&%vÌ%'u½Fğ’Ĉ1›LMġÜ Û½ Ş Br)h´ğZiÛm= â4 „¤*8Ĝv¨qL$X6„Ŭ5˜˙Pq,V¤|LÇb@· @IHÂâ˜5.%¨lЍ° —Żç1£œNŬjàÍ3yÊ IDAT|S[ ìb[Ż7òêĥi._—{žú†3Ï]„öx+ĜğßĤbЏ›‘›ŽÖħOPyÒá†-ˆeÜ öOÀFOŭÁÒuHŞ7xTĊŠ4cZäòÜŻ\~…pG_ħp@¸bÇNÜ#*]áĈ0ÎéÒo†}‡GèÈ*4”—çĉLßà›ç~Ôé&n8\#nĵ! áY#ŜH½22QĈ‰ÇÛö½t|ƒ½jô¨`iİÓsïz!§ûĊàÓ6)ĠösğTĵżV'R°;pSl ³;&ı½°Ĵ{@ŬËħF ċ‹@gĊbĵRÉ3ßaPÌ# h–v€"ş½"PFžx3`I&ĝÇTkĥğ d8yǽê˜XĦÂRĈħt§|Q¸{ŜüÓLċ]3ˆE;NcQ•§Ë:Ŝ>ßÀê jĦ’çĤ™ïċÜ~ž™:–Şm+\ÊÜ·^Ħ‘ËMM·tCW\ÊÔı:Bši˜+ #ĵ “²à U'm(ΐ` qñ˘|ó4Fóځ@‡Âĝˆóc˜È‹,܇êȉë,>L>ëL—D=̋ŒY™7JŬ):OöI(ÍÀŬ*VÒÊĝóÔN¨q[ÔéXLEí†Ü‰%ñ ;ÉŬwMşšİad`^XäEŞ30'<@8ĉÍ~ħ@­_>ĵ'@ÙĈ‰]^Y{!ĥ²#ww =Ù¸—bH ä‹ÇĜ Ğ&WÖbAŸĠµĦĠ5ŽĴÑS k+н”pÀĈé€X\Ž‘~Ĉ܈h¨Ûeħ´QD{†ô¸.IħÓßvOʐJ{­K¤chIˆ‹ĊPⴑŝ°á5ƒôŝ ÏAŜˆòñ†Ee+ŜóŒcÌ ód5 Iì4ŠVá/Ħ‡aš #"H4V˜oç%Uˆ€$ĤU˜£ħ‰ä™˜ò$)­(Ĉ4î. ä†)so–‰('Lê6RiĝâhFCA.ĵ%JÓ<Ë òxĠYhK'!2Eġ‰Û⋆É&P@tujşb@WɋÜǤ ‹ŞĈÌĦ"j¨ôqœ)˜=^á\I"./RŒ!ÊCá¸ëF–ċ™Ĉ+ğÚòĈ|3¨jŝ[n6–@âôb¨_Ċ.5Ĵ\^ƒÈċ5LYƒ+ĝ}„ daŝ C⚭W„WôO1TĠ ë&œe°q@.. áäĊ@G˘OŻëâ]“Öĉo·ï—Ġp*e’PRµMĥôÚQĈ’+üÂڐxHŠ…5rúгRÉGhÉħ9a¨&•$ġ<ùX•ä*²Xá9·–SíĊžİHÏĈ™SÖ+RA›hŸ$e…BŽ$¤nÙ7“A#oċT1ïĴ >¤Áĵı˘áËĝöFâÈHêâW3öÒj…‹b1V˙ên<ù"‹&˚HĤO@Ïߑï/ÂŻ!ƒ–İ‘;²\+ŠÒEıFÛœX3˜8.üpĵÇkPôĉ 8î-7ìUk÷b¨\ĊäÊe= hĦ6ĥ‚r"Ï#áĴ 5 j†T²†V ”"ĝwiˆT6¤¸ġƒKœ'‚N@‡%٘ˆù 'Ñäİó/Û)îÛîš8PÛ+6˜ĈòƒĜVa–E"£hPŒGnÔ bU7FŒR†tUĴUİÈö vĵnyğĴ# 'Eż{½bĊÙx½nĜ%áC°PFë:§ž#`YIäù˳YÁY]î żŝrPQê²m&6Vъ†Ħ‘K|#ħ[*Ô .ƒ&_Êá ÙÂËs݁‚ĊZ)$òŒ†(01âRÀmğÒ0*›—E£óÉĴóìÔEô‹–jĉƒ,ZĦµY+Di'éRċx›v Ċèŭ0žÄĦEo–8ˆú$1 ĥ†´òÂŝ5\zž„ËêÚeRÛ@){žÈŒêPÉ ~İ6…Ê´óÛ8 şÓk)耒…jXŒ SÉÚ&t͎öĦ*#­,eYm29çÄcŝ[‘ğĉh4LŬ˘MC$1•˜ÏKĵb8şÈ{71ÉDv ´†Š´P^%bsMJ1‹äç­҈<ĥJĜcg¤‚Ĝ"Er÷Ẏĵò“€ Š˘‹iZôÔVOn[ZÉ7Ĵ“ÄĦW“ħşĴwïU“=²d´AІò¤­²™ĉ ék\ !ù]‰ÙóĵDĦÎeòµ­½SGl²<ş´˜fH=_¸Ċ@ü̽bTڐ‘C?²zĠzFâPX)Ò³Ž3ŜmÛĈyğ,Qħ~Ñş…ê,šË & c—Ĝ1XÖœEêğYA"İQgï–h/ÂSI[GWSÑ=T2ó[—ŭq)Êw3†IÑxċXĠtK[,>êT]üOŽçò:g^Dƒ<# L÷ĜŝàÍ­h4[C (dX†/P3•†'Ž+E[Z ôЏÚób ‰w°È2ŜxôìhD$ħOĤ*/½´â‰–yDÀól°ˆ7Ë}â"4ûïñĈÀ³qpk(Kœˆ È5@Ö RċUħZÈ€ 4¨Éá56ôˆÍÚÊKAó<‰$4Ö~`ÂY˘ÁBÌۉĉïK‹~êîkÊ5käĈä§…PŒáTġh1ÔàNÑÛËV4‹óMÁkĉ,tĵÂÎH(Ŝ&YfϝŻHV$C7 z\–uêâW#JœHE£’ç-e³Î’·’ ›‚Ĉm”gW°%í Ûôná†}â“‹‰àPĴXg—!#êf}ÄŬFüTQÜ)Qܰ„ŝí QÈÊ#èqWٍ.v˘HgôÊ ³–UdŸXÑ3T„šŠĈÀ4jİĴ{UÄ"´klE[Ĵ^1ZÏĉñĥ÷Îuuy@â´{ĞĈLıLž3|X†U³U1`bĵ”³ĈK5kĞü{Y|T˳q.ÇŜħuÜ9@‡Ùn#ĠÔ-1ÓN¨˘ğĴ2ğ+CV§ĝgxu§M ßĊŠŻ<{ÖHN`EZIÎËÂ8ŻĴ‹g*ÏFò§q1"ŠĈôµĈPħaˆÒˆÍ’í *vŬ¨ûġ˘÷&ê˘âÄcoTC„ŻyTŒ³ŞÎEoˆÚl÷쨘•v*`îà¤CŬ¨ö„k•ñş53Ĉe'ÀĝӜag¤Ż’°=c`ìnQ<×dÄԍ¨²‹Y܈ġŒUŠ†ßˆeĈŝ5ÛċşĴ kÈH& –àğÀ֐.È vŜÛÁcV`EŒÊ× !o_úëK—Ö.]úëËèZŽH²q:khĤ /€–ü/ÓŞ?%­‘ÍòÂı—1×l(—u¸ĠZaòa_™=/ĵ#^5Ù9 ûLêĵcI6YVˊpŸìöâ2ìêi8— ê`]B܀&ËĥזvŜŸYgĉ$zQ´Şşħ ˆ?ħhbS¸ÁÌşz%/ Š£ĥˆĜ3ŒiùyÇI-i™EŸ†Y)òLé²1K@ÓcħJ˜Ò­×ÊSâ‹nù^ŒŠ°x³7HÊ_ƒs£ñâ’1¨x?ïUĵóÜGÏĵáċñ^p÷x2o­3V Ì`ë‘]ÎżV‘ûY­Ġô¸9Œì5VmŞaI/²’7­WœK_¤²[vޏÓwÁŸ|$N‡·Í Î?ùŸW(ÂK4Ğèo~ÉċùKTtuEöÚ 9™k/ÈĤœ$oġħqXâà›6m^ÖŻ*Ú|Ñ5ğĴùKuè&“-ƒûáÚ ŬĥÙÏŬċ]ĜTŠÚ[hۖı^—š´…ÈSWî!,“Šë+ĦÖÂ×NJO/k—sM˘ZûUh Ê˜Ŝßş+l;òĠÁ|ÎÔêĠÚ2D3>ÄvwÙ Ûĥ âÈ}ú@@>Ž^°|Ï+/ùÚĈĞ7Èû>·pэ-êmDfèF­;‰ë8]Zˆ:YyœUÙĥz eÍe~<ĝÌ% žgébÄÍċ•Wċ!b’MLU ȸwdçÙ8]óµD•÷̋~µĤ ­L=IïßèşTs`Žy`sı­ínqûn2-­÷ÜNr=ŝX-1:à 1üŝMùçöċP ~_Q?ZŜŸAàûŞĵG˜Şİ˙GÊñ5·#'·È›Ü-ä%>›Ü87+Ġ ŝš7TÒ;cèĠĠÚ˜öı3ÁÈŠòRÌ]Ĥj=÷ŞèyâP_&t[ı6í;yċvr'yuĵĥƒĥ„,ŭÖĉeĤJGˆÎYë–ıĤAËIÚBnSż0–Sı½iÁĥÇ÷Ĥ~[ˆÜÊĉÛB"Żmġ^ñŞu“t:í.µwzĸğpĠ hQž^[px6³vbVm~‡XwË·áہ>óÎĜ8ĝXA[Ño|ĀžwmG8ħ÷D4N;Î]Û¤ê ÊrµÔĥÏgkû °L÷r[ġ=_íĜR 3G–30”÷À½dMóĞ9´{˙ŽÙşvïOä÷l3v Ó,â™WŒp×äcyù;ż·Î‘2/½czPĉkršŽ=1NŜl¤ƒ–ʤfÛ7âçbÌpùOö´z?â3<Ì[+i˜BJ)Òò^kK2ZC%Êžy_›#™Dä‡ÚžUŜô£•9·Îœ+˘ċ5TĤiš3F  Y‡ŝ+ĉÓëÓ3mÜ֏t";û‘D(%şóżÓí{ŽĤ#"=Šw‘hş½˜rĜĈQ`ô` ĵÙa‰§íе~öçĉ}?ó3ïÖĉȰ%‚YOXÈĥmÛÌù[ŒñK=Ÿir —bÄ\èÉ[†°Ú6ËÒénËüÓò=ğä~–ùos \^â2œHE0‰ƒ]RŸÊQĥ4·LÙT~9y˙ĝŠnİ ËTy‰oż„}Á\î|T˙iÑ=Ä·ß5œ;÷E ú_ü˙pË-?}“âW€cĦċÎuԑVƒèİ^Ŝ\ÚĞŻ§ D_i9°ßYÒoĜĵ”מ /·Ġ÷jBy{˜vïĈ2oLVîċvüVtïµs0uíty•³À>‰s|Á'`Ğżeûö˙úíü½ŭ’7lá!³ŽÓħ§.„:üïûÏ|óoŝ÷_ŭċ_ŝٟ/Ĝ¸ÀMËÏĴ<³<<QıÈ= cŜ’—‡òŒëmÛĥü̳~ò˘en^½˘Öá ˙küüFüċëġġuŠC¸n Ĝ⯘²ëjmJxʄkĜâċġui‹2(g+cËÊï+ĉBngz˘Ö—÷:8ŜßŬRñAüĦuú\Z}&ĥd^aİ–ŭŽ£'cèSżí)ö|,C˙ı^ÑW:öĴûŽ\WÑWġĵ-ĠK¸O9uÒÖ½woóĤJó²ií½ĤN$ŽĤ'ŭ#Ÿe?Žï ×˜”…Ò7¨g¸éòÁW,ÁüáîèŽí:Ù8ĝ°qŸŭµoŝÍï|ì}?ġîŸz×χgs‰Ĥ€* _ Ż^}·*Ŝk,—8ŻòÊ?`Ŝ·+Ŝ+Â0OİáÊZĝ-ÎóŜ‘ĥDJĂBĞY~zĵCTx;œOİsݳ)Áĝdı)Ëqyܜ vİ=ĝTt`j‹ŠCNŻ#•Qiî° ·v¤s˜Û³7j/ç_y~Ŭ>Ŝ²ĝ°ÚşD°%ÊRïg7KG­o[[Š -{ï sDôċÎâÖî¸)eŜxçN÷öÏŬ´‡$z$ä^ÍxmŽıç½;Í;Ċnàd ­D9ÓÊ|ßk;ù¸vk}/…ŝ~îŽĈ‡µÛ6IT¸7 ´ËdšôĜĴPżtó?û]8Ĝw½ç]ÊH6‚ĥUÖŻĥŜxóµ/żöVqĜ½ mœ`[ñŜzëMÈ{ ¨ÊĥFyZCŜĠÖk”Çġ˜ñˆÄyQ’ÈĤCÈÛë˜'!Âʓte£T˘Ó“*=?WÛĤŽ+ Ş0“i#íy}05ı )Ĝ–vzíe|~^ÉQlá–ù ĝŬPXĞ/£@½œPd™Xk›TŭŸ[guĵ­nnŻ.‰Êb=ò4ˆEĜúÇbkùĞÈñ‚}g ş·!ZÎË_ÙwÎ*w ¸{'kGQŜQGöe„BœZùG5KJôÈ=%'k+>iÜJĠ˙fĉÁC³´˙‘x?ôĵ;şW ôuš4%è}Ÿùĉg>öžuÑ{Ŝ…żÌ/†_ıŜıŝí×^úÒ}ıµÍ=gjĝ•·_żúÚK_ŝ?|Ġ+$(ïÛo`^kĜ½ ’uÀ}蛑–ƒŝ73´½ëŽŸ×,Û“°3Ó÷Xy'’ÒÙâ…^{Ĉü\ÂççŬ+6ĠeÜùż‹”×u–*‚ALj—2–êÏ­·Qĉ\öyŽĵ5ÔÇ'=ÖEö4œ>MM÷‘ 6ݳïÓÔÔšš–C§ü#é"§Ğc|£ï;Ġŝ}*z²ĦŠ’Öw¨x_Ôqôù˜nX8菇?¨Äážò[n:èİYhá³ŜĦg€ÀùĜğŬ¨ß­ˆ_˘,ÓèĤċêġĞß~é/}ñ^Zĥ EâĜöä?´ûMÊ{íÉmüflĴ ġĥ-˙uSïµ'™³ĵZ^ïŭËû€Äé˜3h,kwÑÎ_ œğVĵbwÑÛ—6ˆoY·y?wópŒO ‡ZğӃ•SÔÜ! Ú?7Â;$Ï{s£{;° ğµw˘Obß[˙Z6Ššî{ÉmŸ˘Ö§ëİ×ĉЈ˘f ‘Ó ”=ƒ2ò5Ÿ ˜“*É5ŜW>”÷ËûqrPlYí}­ç`täĝĎĜWşŝKßüÌŻGŽ.6j‰8T~öÛo ‚K_üìg_zn›Už—€ùŜô èiW߄ĵÏ}öËÏ ó éqĊˆêA *¨÷eŞÇ X˘‘ygà{û91ï'ûĦÎÂñŽ˙ĉî`•vŝ"áĞöŠ1ŝ,°ÄĦ[Âéµġċ˙XŒ‰HR}VvAΰï²Wâ‰vŠ“–÷hn*sX…=&NGNëqGĦĦr˜£ŞuT²(Y•3ô\è^aj}l–ĥ‚À‹ç^&İ‚ˆWÍ?ÌûŸóqĠjĞŞ˙üXŒ=cÈÉKJĜáğ~ĉ}ïûµżùÌÇ~ê_½ëŬfÖĠĤìê)=|éÛorK_üÔg_z}ĜžƒReĝÒĠ7˙Ûk˜÷ÙO½ôúMpË Ş5¨yJyĦ!şD¸°´ŝÏ!œïU#öÏİĝOŬ-+ï3¸&^5¸ġçI[yúé ×ı‹Ld b÷͖O´ğê…eZJŝ ij@ù‰fâ}='˜K”wêġ 8 ú_Ĥo‘7/ˆïSŜúq[)jĉD;wêĥ–•wìžyÇ~˙‰ĉeĝ^4° ŭ݉°Û§->ĦĵϰÓé/O_rĝHœ<9½ü>ß6żpô!5Uĵs  n)ÑŻÙĈy×Çŝĉ› p~ġ3ßüĜ{÷›äDħq´^ùÖK/!ŝ˙ŝ§>ġçh1‡AİÒ^ù‡×\ŜpÀo½hgĝÙoaŜm=ĥK|eäDO¤!?J˜1KœHWd‰yu$„Û¸…áëe”@(qÚ,qžŜu×]1ĠaĵYÌțÖ;˙•–ĉş×ŝüżú ½ĊÒxĠĵSéyÁÑwßİ{rĉĠâÌáhڞɪ½"g ġ°Ċ4ì?cĊóŬwä=JnPS³Gj{vğY~öĎqŜiì;ù'Î@çĈYïÌo{ŸÎqÙ9€6NŽZŜ`§™ŜġËżö;żöĞŸùĜÏ£•ûü‡nâı[~݇Ÿü֗ŝ”h·?6Ž9cF-÷ o9š'Ǣħ4Z~“òhóxò–ù9Œu×cĴh à,&dárbÑÑ´Ĝ_â¨à–[rvŬ| >@ßf‰Ó&‰CÀëi”8žW 7İî{?‚M|÷Ï?òŜŻ˙qŒ X˙ ‚]9'I<ĦşŸ6çˆ(³áĈœû=x 5{ÀŒäċïîplĦöÏe2ûCĴœ2QJÜΎn@çFÎ:q'KYݚúħ3c÷<ŜJelœ…MZÖ— ŜġK˙ĉwn9½gŞċhÏ'şÚ+h|êsżŭİ?m c£|z6Ĝ8 V^íĝûŸŭçYï×ûŭß7yŻ [ŻZÛ3K<ŠÙŠ.ú/ú ô~t„ƒ*ï[³ şŠ×žÄé-Üu×Oèd!~·ŝŜü}§ tó}íc,—•ӁÌİ3ZGO.U|ÎŻî;vŬí ´;ò­]Í´Gtşû„ç+çv²*ê üƒôTÔĠ§œWÜ­ĝ¨>W›YĉµG‰öŸJŜŜ?Âiîĵµò–›6ħܕğDĴĞC PïŝċĦĵ ‚ĜÚĝ=2Çĝ„Ú×1żġe°S~ûs_ĵşĵÍy]–ġĥbĝċ?úܧ>yOğĊâe¸ğ.B½ÏI=s¨’˘$@šġŜ„‹Ċn@86çż3᠍£nÙuó›ÉĞ•8½]wÄù|ç.­ìU£}^ÛTğƒ”ó÷yïĞßĝêWbڈ$9]KNŜVž£ŠÏÖÒZġ8§"ǔ[dċ(uUÔì)׊ù–;ıÛÛ<$•BëÓgŬÙ#ÈüŽ„Úik\`\Üï|ڈWíÇRâ°NEÜjġ¸â=ÙVif<˜w˙ÒÏŞgìهvŭôÍżˆ2Çú„°  €×Àŝ˙òĠċáÏ˙‰] XàŬ@9”÷ä3ÂF ˘7È{Mòžŝ ŝeê€Ş-ŭ„ûħ‘8Èh×@ĉôÛ8ħz/ĜġtG܎ÎĈQħu0VĠ{?ò‘÷^ŝú×ŝöÏb:0²×ĝ˔ġLÉ9šĦòĥ  ´¸´;„GŽùQî0?ѕZÖ-$ŝ 9˘-ˆH kÜ{‡ÔÉö2_S˘Söàn{ lï5üS ì>:-mFÏŭñ”8b ·üöÄ möŞ|’1ax¸˙ ìu˓}èŭÀKß?~˰ç‚úۆ—ŸûoÏ-ß´ë}fĝ;žì÷iéı×Mž–鑨·mê=ÉyFš³³qÜĈy{„ó£µq]nĦ0qÇHü<ŭt,vWŭ§Wï˘3• 7Cëèêùû|äÏżñġŻ˙ŬŸ‰cwwšċ%‡Ú4½s!7ĊQ%G<şcÛŬ)˘ö)ç[ IDATF–´sxtàŻ>Zçw=‘ċM+p.1-Gᆤ^ËóĦÙkĈ‡NZG^Ÿ˘ĉ?FbžŠìŸû§IœXl˅†Ĝ艽!áj=UğG‡×q½@֝]d`/ &aóğ~ñfĝ2>Ħĥœ#‹; oÒêßîz˜×h­†ÈŠvNkŭoß/yĝΎÀ êŬ4 ġ$•pVP^é\ġyĠzWÍSĠzħ- Çsü° §ûĞfj]8÷Ş‘8²ži·;‚„<1Àèiïŭȟŭïö12:–}[Ä;¤ÓĤ)GŠE²Ü)ëÚ[ÔöV>B͝l“YëÑFhċíM Ċ*t>3Ŝq˘­²è!­µuämށµSÑ8ƒ@û'úö{Ġp‹ŜßIÄ~t„"F߂Êĝz`$ÎÙ8zá;’ğíŸqNµúğnVAÔ'(û WkÛûóOßd×jPA×ĉñ2µm×˙ôÌ0³ÈÓĈqJÛáĥífXlš×'Ġz3P˙‡L7îż#Ì"‹µqú>žW­G¸[ownV/ċüíßŝĜ8ĦÛ,àñĞÍv5oŬ]y‡0*³Ċmô-eÖÍíIıŝ“ ŝĈsžŻ5ˆŒ(“}NŻ“'û|/[ tTQkħ!E ›Ŝʨ;{7ÔQŻZTâ´½ż­Â-G˜x,şPñŽĴ€£Ä À‚½´q­WË΁iK–vĝmĜr$¨VħÏïúĊŸĉÁ: Ŭ<ËD,jĝŭŸż‰ ô”1%›µş äÊMĵVÓvûÍy·}ˆdK€ñÂz{p3"cß [ĝQĴ,ïYoQàŻD?,ZĊĞFèèĉ…o|ġϐrŝ ĈV˘Y@ô_dӀŠÒy&VŒmĵçc<=“ܝSïѓpGÇúCC£Ħrċ­˘^:#ŭ”UyYĈ[íg‹Š÷6ëNby˘ŬçU8ƒħžçA²$£blĦÄÇŜ ‰#şEm¨›7ÖġÚqÙ9ħj'ğ|Ú¤FÄä‘_{úĦíÖOá³0…ß›@[Û&ûѐs y³59ÚÇ&{ßµħ:·íÊ?+¤l÷íU‹½ÜâG°ċfY$ŽY 7.{îOutàAQ(vıûŜûÂWżöµŻŭÙ{˙ßŝÁ6°ħ ú5˘;ÇxÍq ˙–·Ä‘îNT>‘ıÈìJïıÑnkİĦï5“‡^£^jç†Vĉ zx{ĥ­Ż“Vĉ9ùFç†K™NĤliöcTc$Ž][µ;Èßa‡¨ ñÑÙħĜ3ġ]şIÀ"F‚6ĉu2‡´5²c –vKrHUÏÜÄk‹,RèŻàÁX·ócvÌì˜G3XIÎTd2<ÂŬÜŬÜÍÎ˙÷]‹—Ğ œİj‰HĈ·œ90>ÏîÔI—<Ċ³?ĥhšùßĉ~ŭsC—KUŭCù8rZŸÌ6;W‰8´e~ iÔ4ËċQûóq uà“³/qà\ żxöĵÛÛ÷ż||˙Ëí{”8ŒB(!ôÔB­`ù7}ó÷żúûûûûo˙Żŭߍ]a-ĴEjôñ]9’ –|5Ħ@9š–µ§q îcö~šp†ƒ‘§+N °2, ċ\•ÜatYĊC/Òʤ•£I?P‰óŻcbtíEŝg ô]Q>§ëQ܅¸-%ĴbY–€ ağpÒĞVħq‚¨ÉB{OUKĉĊ9\)!ŽCċ²ŽP  8°gcŞ )ĥpCĞó-b3(\D,˘ÜĴúŜW/°_ü%­£§¸Že2#gp"Ká.ƒ)ac54Cö‰HE§”³.ÑÔ`úĤÎ&™˙ N ĝ‡Ĝ#÷ ]€ƒëŜ&•¤h0Ŭۘ„kH=cófEé5+İ”I{P\é^qœÇjĥ œ7~àĵĦÑc s è³äòáZA 6ĉï…L+‚oˆw …eÓ²ZÇÉ'â/ĦÚlD{Y/†cĵ³P0ôBÁ§x ù™.żÜQ$Œ‘úR‰9 £EM\˜İïƒòĊN­ŻaĴ"P€4*ú•‹X! â“ì²Â-áûJJ„è+Œ‹ĈÁEê$U簄u>–S„jX\—qœßtÜde1²\Ĝù•‡Ó¸ĵ¸:éüü’ÄĈ·óĜ€AÊuàw,ìsué{IˆfĝC€vĊ¸d¸QÑż´Ĥ ô‚ñŬ˘:ç;Pt1@]R·](8˙Š>­žáü$¨HuŽ)Ìħ8†ÄžëOHĦù’“¤ĉDŽĴlt(ÇÂM`”“ÓsôçŽïCR]qNLä@ż¨qŸŻİŻbKÚp}ÈòĈG{Ġ#µ™X 7Î9OB €u‰ŝ ĠŠ ߉_‚Œ=ĦcĴlÎä}3lÎeúÒŻ‚;tuw¸˙cĤòwQŬ²^_ìñċf'O_àşè]=Żg/ìÊ_nŠ(G³2‡”¨R­Ĵu˘Ĥ…9ú OB(Żĵl0^(ÖN"ÊĠ€?µ.Ád‰i>–’İ9<Ήf)ü‡‹ž‡9˙!ŬĥW*@•\µİóùŽ6  œ$1s€!3Bê,3İ%} “Bb›ç ş(“|w–êNbTÀ˙šÎcU./‡Ú–Ŝžïñ<Çç0~İĤ\(ħ]ĴÏï³jKê—U<Ŝ”‰ĉ †÷³Ä– MbˆGäEo*ĝšeSÇVşÄŒ Ġä·ÊÁ<‚)†ÙĤ6G9̊vÈek–Ûdœá;œsC(*bv4¤ŬT‘ĵ"{'R²0YĥАÂÂ&‹\êĞ(ĜCŝßHôtéĦŞu Ì(çûü @9[N-iùˆŻ‰€Ö½´ĴrÍyĉŠ#?Ğdhħm²rI²wNĜ i]³t°$H²êJ—yúBA%چ°hzBÒÊI1³Äx›ŠŸç+q†£ġ]|Ôß ÌıÏP ‚& ™1W`§4/€Ù|uNàÊhĤ\Ħ5˙ÁVBŝꀛá ŝ8 ÷ƒfĤ¨ò³}tumċU Ŭ ċqġÉÒ1ü›…µwÇDECşlKÂd=żô€Öŝ½‘3^ġ7ŻÎÙ¤ñŭs¨ĜW܃ŒoÍ@Ùîú `­ñ×ÎÏéŝ ~ĥ?:öì%…]âèoî_ò1\Tĥùax’½MÒ£HháĦm3lXA›&ŭĈô8Û?w‰38ĥIâô)vô°\ĵó ŝÓÛ-A&߉­66 ĥwĝí×ğü żÒ†[€gEÈĉO„ÄÛ<ú˙ıŽàœB{ñTy1h[¸ÄŞğÛğmżh#ĉô½cTj¸OħÁ'î‰;ÙkErW xk ¸×ħaübċïÚ7v›#eY÷î/tû˙ E—˙BÒèÂokfï/¸˜ŭ…•öUÈËa߄ èi+EQK$ÊĊ¨O‚èD­¸hǑIfŸ½ÄÙ/çûˆ9ÀŻs¸ ó_قô%½""ìGÂV^í³ëħíŝ Ħ£-Ĝ z6@d8Ŭğoà­œzˆû­—µü}ĝò€èڗJ'ô4pÖ<€ŝÂHá~-„% ‚sZsŽ“sú\HÛĴHÙĥC@F—: 5p¨…rrCß?{‰³%sÀ~u–˘Ö~ÊğA@ɛd€ˆ;ıbn _‡¤?+›8ü6 [;lD“Í7ü`g¤lñN!Ää\à&Bĵù5‚žĝŜĥ†l6‚ħÛö‹kqQx%tmẒKÇO²5?¤8 ÑuéQÁH;ŒCK@ĵ Ë`]6pÖ‰8ß8ĵ-ĈûûÒ΂żrĉ@}[EÛ>À÷ f§ Ĝ—âUCÌ&Œ˜;äċKJq,=1ëaˆ@ÍôĝS5?ŭħÄ+Òûìfŝ²>lZšÏQf€V¸AŸXâô£Àù‘nQC·í|’—íŸŝDt`„żrÑ#q–ßÛĴ×ġZô@ĜœV#l<µÇAGğiˆ}<„#Ĵ†˜œ—$üAâëlà Aâl*‡Ċ.Á¸öN¤KݏêˆvVİĤĉĜŸûJ"):‘ÜhÛÈ>^µí‰O'q˜lÁÍqüÜĤ—…Ê˙Çŝ“4Ŭħ*fÍ&Vŝŭqüú#Ny ıŞ.×áö˘ĉCß !’]ú- ˘‡ğ§èâĦƒwc퀉DzĜUċ\Ĥ„ Ħ(Ġ%èˆùև¨.E‘ !’Fï5ÑÊäğ½jµ‚X˘#ŝ7œôÉĞ˙ò…#+NE—˜Ŝğu˜ĵġâ%ĉ(#žĤ0Fß3˘³ġΏXĦßgİ/ ÂéO˘Ú}ÛĴzîz}‰AëDUˆ·`ÛòŸiŠ?÷Û²óÏôĵ”Ċk6:™BĊ=_ûÍf€ëÎÚŒs%ݳÁ˙–  $N 4Ž›&Óp ĞżÉĞÀëÀà`7Kœï[cEàë0½Ĥĉ_Ÿ‡$nĵs^O#ĈφMÖ~‹ÄùŜ ï¨Xâ<•ÓĉÀĞVŞj6< ü@ߋlmÊP‘#Uٕ“@Œ)BQc6QïCY@ğJœ)Y-FÉ&8›o8›ğWe%ĉ€ğgF6˙~7ĵP‰ëÂŭcgÔÔÈ΁BUJZĵ1žQoÀq^5×PHîR€ŠÀNŸìŸÁÌĝ:ÁK•üEˆSƒĥ͒µÛKM­E;.hj+Ëi§”ĥ° ĥûġ!>+Éĉ`˜öJh2pÂk>L„ÊQrè3¸$$0ĵĜ‘-ÀÌɐŻ<‚³‡ܑêkœœÄ ö*ğ£ÑqÀ‰Ú_"¨è‹ÔWħ<˜u‡hÌ£çĴçlġBâüó˙‡U_BLĈöÚm/RŞ‚GÍıĴ\.$2م‹Ù–lÉW—8˘ô3ĴL BŸ|àl˜í&ÁÂıç+¸ÀŞûbŸûóO?‚3ò˘ù›3ŞiÔè•5”*è4ÚÄlyvž6ìlê_òìħîï¨~²èZì˙ İh˙E8VÇáua›c²×žPĜ(ĦbëŠdU L8GˆñÜm_^…ÄŒPêBíġ>^µlœMê8€³)šs` ú¨OÑşp/Zâĝ‹û鏣ĵ!^4çÒ*_$£ÂS#{ƒBŒ'€ŠN¸ƒNĝ™ ŜltG7Í)JŞ5ġÛ´8Óĝ8ĉĊœ_׋|Áüĥ §èÎc|‚ĜHŬ£˘†n땍z°q˙Yp,żŬĞFÁôs`”L´qÎ_Äéû[˙ÈXäEƒZħ˜€êC\sÙ>‡xú†qhTôîĊşÇĞ@yÓß}™›qp\˙ò80ŭW3úˆ'Ê âŻl€_”§'öÀ‰òÑŻ²Í†üë½ĵj[ B›Ŭ×îcpĠ7Jœu°qŝa-Ù8/ĜĦ„“àOwìU³}ž0TĴ`˙чy™‹ï Tô%ğÁIß 6ÄoĈ3\˙a‘!O‹0‚µ³–8 ­ËsĤ)ĉ)ı²³Î½Ĵ°ċE}„ôµ{yĠĤ Bë–Ì7œµˆH‰Ì~4q@âĉĠKĥqJ|½÷ Ü7 %IÓƒ˘fqä Ç AEŬŭ˕8›„2Ĕ8›áÖ;Pìnz-ċöż H:ñÏıŻ}¨óìÓ$Yá@ ıU€\³…Xu\ĜqĠïĞĤdàpäĤ ôz‰âX"s’P²q^tE@4çì"VÔ9ŜĦC êMwıAŒ§m˜€ò‚`Vàió^5â8^âl6Ÿŝ÷9kgċ7GdèÁ‘ĊàN_2ÜA ü蓔Ŭö5 L÷ÖıGäŞ}‡Ô5ȎFZÈ@ìès´q^pc#rŬŬ§Pµ×“żÙoÌk¸CçLeÁQ?Ò6p(!¨è‹NŸ ğü Ê Âë?^oÖÇGDÓv‘lƒ×?˙4>]=°Œú‡ċV˘ìĤ<˘ÓEjCJÉÜıtż ï,í½j„?*3ÖĴd&ĵh/1ö'&)s`ĵ"ÈFƒ[Ë3–NsG™’ÑJû/vŭB%Ž>a/ òĜŝ§ëġfè˙ü…2† UèŽiŸ0;ÚĤ·P[îlà֑Šš#ŬG@yT(cT"*ÄÌÊġnż ï#q"šQ’93•ĵh/R½—ˆÍï}˘=dqúĞû“×/^7ŻQ½Ĝ|B˙Ŭ'³ÛŽ0à‡ ˘/5ao#5µŝŭ›Mï‹ì nÔUO›˙óŝş!ŒĤóuÜĉßz{vÙĈsÀä°2Àö6°'zU´ġ.!–'‡ƒc"“’àyKœ—°ô€€ûÒC?Ŝ~üĝñÓíûżĵż}OôsìŽvħĴ`œ6Ĵ¨ġu€w ._^´(ÖżürûËí{ß CúŜĜĉÚŝ™R/6b‹ù˜X?.9íe fas’!EvħNr0=~÷Û=gÚ8ÌV`ħĴ`yÑ^܋œĊk#&<`Ê!~9Ŝ1a&.àŭü%&ìݝCŒ0\~^ÏÉfż\—+VbşFVèM‹X`ŽB£_ee H &_tµ‰Œ´xP‘÷ümœLâ[Œ|Ï@ĵh/ÁYĵցê5Ààĵĵjì) P`ŝŸƒqù²;Á1~Ŭ:˘îÔ\ÌÛg4!+À£OĜ$<#Ş|ù’ıÈħ7êû€ğJaİ‚îçlo%xöo&qç—x¨TâX²q,!8ğ—Žà˘ÙˆëH\x ÂmòAsžB‰?3 /_2sàËí„X•ì6ÎĤ\5! pÙŭec} Ñĝ Žŝ?Ĵ¨ÀAphgNĥ“Œm’bS§m Ş(DK„^ßWí›$ÎcΐJÂ8œŭËEpv’œnÙ:$r Žrâùj˜pÚg,Ħ|y!°ñİ];ñ´:~āÀàríJE {.lú{vıCoïx˘àµr½ ç xë5J €J µ>OU‹ùžħPçq$ŜĞĥJ8>s€@Ô<Šq_ĵĴP. ½ÓŒÄ3@Ĵì6‰ğbè²+@;‡µ[ö˘aĴ-£:5d<ğˀÓvNŭ8m{Gpp—Ĝ ˆ`3e\dŬĦaĊ¤9Ö@ë8êċĥı•Í55Vú„^µ&fwò¨y´ÄYğDâ[Á0 ´Ñ€Ìâ˜ËÏóp“'Ħ›fëÈéÊ6Öŝŭ!Yù@Ÿb+:`üf˙³jżOG<àJ ^R3„x‰âóCì&ßgkÚÖÀcñ°ÈéQÂF¨j°Ñê t# \’_Ñ 5Ĝ·7‘rĉI$NàĜm6!Yú^µ9,Ĵê˜ËO²´Ímû§àwp1ᢜäĴpĵZ²Ì:'”tјÀ‡ˆ÷<ĞGìòíKÑÎIk’C’ú#yíNĜï´h6IÇġ3oĜÁ ·“4lëîÍ>gÛkHŽ”5ß0pú"s` äkvȸ ĉò-{;é8” "!’{¨ X  "…P–˜$œ :ì÷9+·˙.ßçž]äĜ.^/÷Óá i^4C_˘J÷w:nâŽĥ•ĈbM#qĴ­wT…Ùêv‰³ĥ½R‰#ëBçU‰CŒ“!3CĊ\~²Êm˙>ġgĝy.Š#Âİï9 x‰¸Ĥ]ëw@)ç·ÏYġûïòÍËĝB) W„,“ÔÁÔÜg}Xï¨ ìÀûĉ.˜pxzùŽÖĵIsòż€ñÇuœÄä™Û8Ĵ³ÀĞ3û-½¸˙†ŭ Î]ëRǰ ċˆ“|q6W7ÄÀÁö;+ğ˙.ßÔèJ›µâġÉYx¤ ‡ş]Ŭ #ôŻġŽŝ$›Ü/qœ%J:w·—ÄÙìïU”ĦñŞaĉÀ:Í1 áßhÙ[RÁ·żíû2ìfM²:†ŝĴR?ŽœĦŭ~gġˆ]qYż*<›”ƒGk(şŞ2™*#Sky·R;Z4÷§Äyş\5+Ù²ˆ§^¨“ <â8šĤfñ}¨ÔlĤİÙ\:ÉŞÍ~gġˆ]}YĠÔ°7öÔ*;è˘'f²]Ŝ”8~ŭüǟúİ·w‡µqšĤytĴs·ìè5Û8İ˘ĥêsRí'Yo1ÁŜÇYİŠZ/lœ5Wy2ldKoÖ{žŬ#vùĉeŭÉM,/ÛµÂD„ŭÔ½´–µlnœÇ$úiOŻÚwÈ:/+@fGG‰b€ŸrBŭ4kíı?ž§[•šš%!a#uĜnšZ˘Í„Âİr³ê÷Ûċ@ˤ V‰ž ÖĊšZş”Ĥ;zڝÜÂkÎÊŻ~ùiTížÄĈyÂìhÂp™ŠS‰VOı´\rŽ*ĝŜû“'Ö%3‘8RQs%mݨŬh…y4Xv<+ğï.‡Xş$rë°ô?N4Á¸T¨TE-îKĈcMš)ÇY]†ÇĤˆê†ì€”×óü%NŻdĴĥC%,wO´ì#mLE{ïJmœ³Ş>½ŜQS³šRыšG<żÏ*VŒmžĥÓċĥĝt'z­ÓǃU|e:ÛŻĠ½jÛÎNùÍ&R)ßŬ>w‰3h™k(> ˘Ü1S.eá=öڟÎ3Ġ,BCҔi-ğöUP×VÔ ŜV´&QÔ|ßZ‘´;ìxVNLÙO܁r钴ΒHìÏr}hıÊu•‹ŠZâKô;Ô²Â˘´Ì5gċ têG›˜ĥŝlœ2ŽCHžDÇèĴ$êŸféĝN¤âażŭ#Ï× ĞnV8…²[ö$fĊ;àV˙ƒ5¤jña­â`ìëèġÛíĴV{ír°Ċëw÷x‘4µÂÚ*–+*7Bl腞şÎ­ˆÜFîÀ=ʸüÔu+á*s²-xžWÉşPm³ÁxêGëÛۏßߎ˙?Ŭ<Ç)™C‘˙g{İ |É|*6Ѩ÷Ĝ_X.‰F-´ú ÁŜı˜ŜéAZÜ]îĥy‚KÊsX9ßéĴܞğfY‚ÏââRëÂġiù‘-ôS—t_M9‹ġœ5ŻZ™jŻÚÑkH‹~ Ë7‡—8ßNR°s€ËY#y]„>Ċ2vm˜ž÷ܟkNl€&ĥ½gŽ:¨vÇHècĥ§‹95ÎҔ“@“zĊf³YŬa ÊğĴCñ:Q€ w‰µÂˆŒìĦD!鲌xG¸Wm€œĵµ'ÚJ0ûò,bŭéÍġíÍÛÛë×nßŜžžô[rlvX£BìÂyߗ‡[†”Üd~Ûg'ĜÁyèU³}ÉïCFŻ#wäzÒt2Ì7,Š4›l‡ĞZYëÜîğhIר5›/&C"=Ò „2–ĉ>ÜîĠĉU;ÙöĦÁ˜mÉdŒëĴ“şSżÛóÛëë7èıı:h‘}8hs` eĥq0tı |ZÙhì|œTS³\`ÓgÁŝLɜOíȕIÑSqôÎʅôħv9̲•ƒ–˜*mžGa5ߘ‹ìÑiâĊZê[AKp6ÔN;ÙÑNt(79ĦUÇĤTM:~ğÍ(jüÈıŭp³³Ä)?•kMBíq‰£bĴ% =Ş8èl˙z%uûŠĦĴZí|ŠbەMŸoü[ !AU£—›] IDATnf„ëċŠàäC›HüHŽĝ `˜M'Î* ĥì¸ËĦ–}’µ×gx€RŝĊÉFjµħĦĞ?Ԓñ" äíYüĠA}ûfĝqí+éכ7†~³ŝq³P‚7XF˙ŝĝÍĦ½ŭ%ĝ~3ŒóÛ7›ħŬ¸rȗ~?ìá}Ċ=î²öğĝßyÀ<Ñ.oüŬ˙Ŭġk„ĝÑ£Œgö#˙Žç‰`?úÒÜ>ŭ8à?ÒéŝÇïçĊÖOcË;D*żïĦ Ŭf€ŭp½ï‡5ô{û­áâÇáüúġÍ8xĵÔy{áSż™4Ż~àÔ0"şo’ 0bRápŽ8f‰oµċĝòs— ë–ĵAŝ…M‡K†'?Yòİlßêǃ\ßmp„ÑŝÚ2?^‡ëá8ŝxÓ,Ġó/ŻŻĞĥĞì×M·[|üĦÛLö'œ'}ï`d´ŝÜKšë£Ôñïçî mœĉ§×2‚’6× Ûŝ€K{§â%XSüÚr03Pf´Îveèĝ|ç½ĴñW–ƒĥŜϞÉúµÜî`ıĈ Ô._fûw~9à÷ġĉɖCöğúr<q=ƒÒ/Ù~ëŽkûñğJ?oŠġY„~Ĉji×^ĉÜîîU›²q4ŻÚADN‘ÍlĥiSVà'Y%lĦ7Ëİ1CŻĤÁ÷VŬZ¨j4ç ‡XvÛçêlżġA˙›—Ŭží×ŬíY6íғû­ŻĵÀĦÁs}sÈ8Îáêp&â8Xc=7Œ³Vú`òĈo]öìáBĉ‹ ¸tfÙí½ßú ż˙­K?ׇï›ö#ğñ ÙT_;ñŭa3Jœw`á|x{ğ‡WmŠô Ž‚rëqzÂ^òŸà›5ÎğßĝÉŻôdüîˆbŸ•ƒ’+6}Z#GŽÉ–ËdXÄ1zŽŸîsv·÷~ëî™ÈeßQĈZ6 ›N~.|óĈGrüòâ  O7p­ ·bßÏBa û‘Bsü›=^aËÀë]ÚÍ2Ġ+ É@jXâ˜ĵy"pFç`söšôĝGÏñß}™Ìġ‡•ħğË&²ûĝûpyë½^W{{óaWç;%K+Ùр9`ÇĦî˙[76܈óĉqCĈĞh_cr‹ KZ;3[ŒìoÈĠĤĜ‰%Îáĉì}ôxmŽ˙ŝËîédìβ)³û†sŸ7p òf|?ïûç͏”́ó‚ċ‰8„f !BmœÁ•—ġ˨¨­+j˙p‘úa&uħhä´ Ĝ8&b&ÓèPâlÎŜCü˙”Ët?ĴŒíi÷ ×ä¸Ù#sàğIœµ†9°&ÁÒÛ cl& Jižş§4È}–‘#İù÷VUÔÒXYŽv 6ÎRQÍâ#‰sÀ9{=ŝÑsüS.÷öñí!cğÇÚ}ÇywíÓĈOÏ]âT0@°8ĝóŸŒPŜf¸2JĦÇ*j1—+uİAÔ(Ï~nëxëĈğ-Fu_wëÍÙ{èñŸvı·ogğl’vßfÎo(„36Ž{ĉ6ކ90ôdÜ RLJ×ĠP ÑZïŽóÔsü“.×Ï0ŽópġÁ{ÓFE͛:7çöyKsÀq^½ áÖ:Ğo…üYUÙeéŠ*C"ĵG5ÎÚ6ĥfĜşi›‰¸gÜù÷8ηĝĝž>Ž³ÙœßܽyçS¤ŻGħó½lœfË÷IÌ tpˆ]ÊġŽh0p ĝE˜ĠnË@Xl­$Nc—´Çısm-öi¤$A‰ÓR}yÛïqœoòñ=}g}ÑÏې@ŬlœfW'ǎF‡0’%ÇüöÀ™‹-(IœJİ´°ş${ĉ>T}zÏÚŞ5§–rĠ’‘ Ġ$65ï&ŝ=ŽóÌ8^âx‡šâŒ燕8Ħ2§)VFÂüĥĦĊĤI>ì‚90$u¸ħ^ ĜÍħTVLÍpd/җîkĴŒç¤Âì ¤‘w0ŽmĞm ġ„‚fÒ¤ó{çÙÇqŜ½F"ׯŭ‡ƒJœlH¤+ı-˙WMfGĉ@ŸàA…rBAL&¨ĞıȍÊŬʕKĊd{&rKW4ŝì×V d*â$ó }D™ß8/!Žó:ݨ9úrH‰ÓÔô°t4ċg£Ž=;Úg VÛ¤06:˜É8`˜Ĝîç’÷ti WĊŜùıÈT³d?áaĜĈ yf…ÁR~7ŞÔ1²ç÷8ÎóŽ Öŝv/‰³•T8Tt²&•0ÛT5s@QÔlZ²™#7†á!’%)ld8¤öVÈ4¤Ák1Sˆ³Ĵd×äĞaíïqœgÇñ2Ĉóœ|ğëôVPuà¤ú[²H$FSĠŠ8ŽC\5US“4‡Äš>5Z=`ëe@ĠÙŝÂ<-ËSÏȋ ÊĴ›'­Çù=Žsà8š Äş[Á·Ú8•3m jĉ€¨Eñh/ä]£L‚­ ŒE|֞⠁tÏ ä™ÇY–éfùX2ï,+šÊÚïqœgÇŸĊëŭǏ·ïßş9úĵjTĠXÖ䚪V Üĝ8NSG„‰è1y›ÙŽ+³ žM+Z ŬïŻ˙ċ^G÷ġ›£ï™Ğĥ5˜SdGSĉE~h$™ò°Ħ&0qĴAàB+€<)—ĝ™jòñó 1ÂT˙k\5nlTt›Z›İ8§ŭú9żÉ.Oĝêžn‡îħ½şŝŻotàŬÍíÛ'ĴÇÙJk¸=ŞĈq.vd8ħÛyûjµ€ĤİÙ:Ĥhmaèu[À?öXòßkżŝŝ–Ŭûu;·ïvïÇ.ù~~sMP ÷;Öìı,TE3…=2ŭ ­Xú;ìŻŸÉPQÛÌZ˜.=N&žL"áU(2Áĝ́wL;ŽËïPÚh™ÓZ˘t£Äq&½jĴ¨I×2Oî”iPŞt@„‡²İYVcša\´QsQ ùmqı\ŭï‘ÑMéRßéL B•êòÙ /ÍñÊñĠïòñnfívwĵú½ˆî›NÑk]5˙ÌŞkRñ”yA’ß­I&şÀżztÀıñÊÚasĠv¨-ĠĤZÚ¨(7àUkg+L“˙YXBAÚ¸lÛ;àÔĉñ†MÚb‘Ž“<=zĠÌTEÁ2%Ĉİ”‚J­£+%“Z Áċ˜ցfé'*Ik&JWÎΊž3‰Ġ´šÖXß*Ĥ¸£sÀ,kĦ×ĥ­.ñÒB65[γN š=sĠQşeà„"ɋìè9 pĠƒÄ (4häĴÍŞÑöRÔî —@m2Ft'2ĥ:C½‘÷ÓLHĤ6@‚šiqc2Ċ%&̖5=¸Ĥĵ&ġ{š:kt)Sßżpè˄²Ï·ÉûsÔĞJË­Ì*]vĞšÄMâC]â&ıB¸u˙ïíÍ~ĜÑĴ­œ¤ĤMɎFĥ×Ì,°ßô6ŭC ‚;Š„”FŒATàj–,Ħ|Ns G.AıQĞ£M´IĥİöFÎĝÚ“¨fÔ}Ş,üÌj´”:#TE3m;ĠÜtÁšwĵĥżİ&V”Á–ÄkW³Ça$fTâd³Râ,Óİ0M5oÇóŭßĦ´f4Š£bħ”C¤hB[wLġ1›!?Ž×°B˜&`ÛúŸ³DEm"ĝ(ná2Ôµ76×Ü „,ñe&4:-KĈh.?1Òñ4}<Ħí4MÊSŻ–K q§ĞÚ€)eá/.[E˘šI€ÑŠŠÖĦ? èz“DgĜri_Qĥ…İ&%°Äiġmڍ—ˆçĞŬ\}‡ PĠĞĈëéZĞcàp4jĈo³’‡Qï$œ­öçßQ˜HÔÛÄ;íH AvĞ;l²çÈO‘pO^™I˙Z0DMMä9”ÊQÛ C˘ˆf ïÑ8rġ 1ı•;ŻÒġ‰?+:Òà)-A£ĠAo’ê$S„›P§Â (·şBÒx9ñƒĦÈ·msU2MCşş†,µkŸ:áĉ…eG‡Ì”/$jl`&Gh>ÏÀJÜʟ `lé_qˆ…cpĥœL6R'o˘šÇÖUĠı0‡F÷İİĝ•Ĵúı0~|lƒGž"ŝ:%žoĥ¤àäY7ÁĵhĠX‹’ÖRs9ve$Ö_ žf{!Ey|*OJ`ï“)£Ş|"—Pùy‹9Oɏ3Uşµ:ts`ü8Äár~‡yž,q„·Yŭ##ˆ1=û"àċˊ6’kDò4Ċ”nrŬı ˜ĥ’YıLC~EäÓ$6NpËR”&Oë5Ê£ÄÏu[Zë]=µğêŻHALí™XZVÒİ‘m(ĉÁKŽŸ8™ÌıáT£ì÷‰C3S’ g(s Ŝ3︆êOŻ=û\µ4;3†ÈÈÖôÔE~7ŝl‰#ĥÇU+ÇÉ8X™Ğ61ŭšVŠˆċ4!Hš?¨ {­8B¤§Â/• ŝfü„4ŞÇİÓAËbċäM’90І,ŸT5fr$uŠ]:@ è¤vü2dö%qcÙÒŜÏĤiZ-[_xnoáÜ=ĵóÔÙј9°İòÌXÈô‚´>fV]-Ŭäo0}@\eP›f‰a|ïLšµ–N™úÖU'ú`£´áÈméç6E80{dÓ¤8íҝ˜LBŻŬ­ò•™Üµ¸@#‹aë+É9Š­¨ÈœÌ1ê_&#™TšAž]˜"ĝ PŒşxʂçÏÚ÷[[œ†8‚‘‡ĜŻ`­Ê¸ÒVDB06 ›Ĝäù‡ZĊ¤yv´ê¤ħkžêĞf‚YfQêl˘Ž*W8j0uàıjħÖ³ÁOMóĝñ£ ÜP§İıUĦİyĦu/–4=o” ŒS7„s.` 0²§÷m}Ŝŭ\¸”ÍdNÛçe ÷çW<ÚÛŞâL%á,•ê*´éJSfŬU²CUù˘ç/SÚ´T" (•‘sÇç7Ĥ†]\zġĊŞóÛ·1pxGÏr~ĵÂVĊ`EíËE ™ 1Š—òÓI+òȸ$›BÎÛêĊ3ĠjG­Qşì*FtMu3Ġôœ,Ôòò@ˆÉšÙš/SyîÌtÂԅV Ù4J‰Î˜‚<żÙċL>/ Sñ=jOÇi”Z•ĝĉ[°£ĉ@ĤİıXR#45J`´5hD Ï08ĈDSë£àçwĞs%3ħ)ÊËÌTşdW¤ ĞO•™*FKGĦ:PŒĉ:W͢Zk!nL­”/óQéÉkF³2 ġz-B\&<Ôëï´´'£ÉÊL˙ğşĈ²éGÄqĥV€ ’¨ s€ä“ċŜ“pĦ³•#ñħL²RÒe£ıH`è‚ Ž#İä‡vâ1ŬXîKĦäĞ%ΣĤVšİdèDT°Ġ1f2(6½ĵÙLĉ T2jjŞßl°QòŒV÷j–ÛĈ½)ĤÑŬšÚ BvAñ:F…m/\µ­ ›]yĜ ˜Ĵ:ıXı‰²İ Ñ~qX5­“ċʒ9½ âPÊô ™Ĥ €”Á4ÉÓԜMFSŜġıÙdÁ6S“6ÊPQ c4SŸ '’\jĉ6ËÔGZ5œcŞ˘pL(Œ)ëYŞú<;ZĠŭòşìLâ\Ú[ïŒö¸jîÉmœos¤Ùё­`…(ÎĴÈÛÙG!â5N$AC™jáĞ  °‘¤Y˘…‹³5umÊl™™ŝHuLnK­ŽEİİÑô>Í62™Òe4Ë(f-mD0Ei޳nïáÏ2:fE5ŻÚÀċz³súiÒÔ\Ŝ Ż”××>\?µWmsXŻcp”Ċ£†J„ž0ŝ-§7S^hˆô8ÌòŒ9kQ‹cH(+"=ŻJ˙²É|8Ujš—3Š’nĥÊDÓëĤübú“ÛiŠÛ—“ĞuEÍè–{ÒŬDU­Éîò¨ê)vuÖh cĦïĵ?í†b9OÇùĤÍtv4fì˙j“ċL£ÒmiŬĴ Ë-ıwíïT²˙ë½ çƒOıñ9kçO9pȁ³ÑĜ <ċí(qwiqĦıgĥġl¸žäĜo×Pĉ".,ÇÌı h·‚Ü5l|MDÉ(záˆCğ×ĥBb`jö‹˘Ş™ċdĥѰ™MéÍ5úArE[NúÒk é˜Ôç29˘–‚Qp¤r¨Ûщ°LSn–SYèóÉh!$Ċ˜3²q3Z9>žsùÜ%ކ9°ù6>µ~hÍí­i>4ûSÍIû\½MÙ³^-ŻÖëZôç+4”‡ÓhîpSèŞżvG[ĝ*ÒYŠhî;O{üséU3êÌO²3KĠbÊ(qJ(<œwHŸûŬĜ ÇÙÊV°+A?MYPᜠ_Vm-:˘Fë'¤ÄĞftú6Ĥâ+6˘ĴĞî†RzşİĴ½ês9 7ŭY“]fޤ“1•ݤÊXu0›jR^íLLV£tބӷ@s`ŻÚo‚rsħ…<·F§KK›2áĤMc·Ï›Hê]ï'hŞzˆİGbëÏÊíĤÜ;Ë*Ü^EÓm—Lı'ğĞf{W=U˙rĉŞXnÑ:˘$™šŻŬèeŻÑcŸċhë4^7Ŭ+šŞÏW`Ü|Ìġ›Ï§Œ\|£Ş6ĊşfwĊUQĦ§U‹mbÖav|ìµßİg Ü$Ú]ÍÓmĤĝäjs{=ljӍٖÇ`ŞqÖ.×˙”ìNH ½™œX”%ÎğÄTóħœg9à4́Ǎ;Ŭdu';UF·€9°•GÚÔAS”™İùÀÙ3[êîŸuŻħé”ĵ-³T[ɕ3Oµš€`Ë\Ÿ9ĴHÎV3[q—kĝŠ:ÛMċ¨=/Jœ,Êıııxy(7ç“äıJ_·c0w“ŠÜ£›³wεúeê÷О{\:LâJ¨û”_7y9疑ŭY<$zRİİNĊ·Ĥžc·%î3 Ϙ€†èR§›¨L×rĠD³VKÈġ?àÇAfĴÇ9‘˜OĦ¨ÙŬ5€;h&ÀÇĝŭĈó„SL‚ßiy:ŝîz$äemşŜZδµ¸şQŬљ—£š š) ÖFÍ\0U²ŽeIċK‹?´?”¨ÙıÀ–°ëmĞ:s8@ì}Uqċä ïpŭíSÔlŻ-p£9°>°eS(sv‚{×"•Ħİv²D++?M-µ³ĵI•Âi¸WĤ´L5ñ-Í#´rSċżé²\:³KŬ7-K™İĈU}Ğ Ż/z͇ Ûvİçà”ĴÓ„µ)t"7ŞÄw4ŠŬ8@15ú̜›ßĵ´ÉÉĤ90<Ò =¨IBĥ êŬ‚ĉ£bŜĥĦŝLhM&ÍΚ0rÚA]+7‘Idi–ìŻD şmQ\Í Ĵaj9œFq-N™†Ĥ+Óŝ›š­úʒ·³ĤĴt-"½KÄ"j P£…ċĉ+ Ŝ~¸ĝ­+@›MäĝÜ*r*˜›§ÔÜNš$´Ŭ·jh3ƒÏkZ£fji ÌRĊ”{7 :›İ§:Ż&@Nk²öĜÔqE̲^ĉCÌfFnN€Š.ùĴ^€˜ŻŞ–QšÈÜ4’Ù33I{·IArqµç@ÈĉĦ£½ƒàâ·ÍËöǎ~œ³‹˘ĥÒµUÚÖ9×Tĉzù@4'ĉd`Ó|LmˆÎċĤg‰?€§v퍜o_#f ’)ÚE{D0@E›E’J{ĜOŝ#Ĉό/ÇÒĤˆñéB󨵕á4Òİ _i(˙fğY"̘$Ô½Ô÷;Ċ/G[SĤç›]ÜÑĠÒ5#UÒ"ÉAK3K(ĉL­‘À1J‰âI×wê4ùÚͲĉŞo9jtXšRĞğĊ8>úùŻ×7/Ž‘2è™ ëPz Ö£ı@W5„ÇEš @¸ÄÑ›pÀ!Ĵ.’‰ÚUO<½ĞèU›t·NKâÊ=LW#•éÖċZ)SîJ„µş-ST;“Öâמ÷öAF‹mJj·İ|kÄԔnĊ³†u’Ê‘4…Î$D@İ ŒäŞíDĉÀ•—6Dóñööü%b ˆÁ"ŠĈ\3úkÎȕĵ’ejŽ•_ŜÛH]À’ÉYhbˆònüAżZrkÛĥ” Ĥ €f¤u%³Ĵ”§D~íR7w/ïç\Ó1âİ Ñ*ÏnWqĝ•i ŜÂÈh* ĞìR#Ö6yĉžÉĝpŽÑTpuËÜ×Ĉ~3Ğ̤^ô Ê9žÁCŬÜŜĵ…(ŽÏXğ|ö˜NpSx6ÂFK. ÜÚ@ġa]-)Nç:܇ĝİm;eę‰²Â¨éÁĤBicÊ0J ıUĤΞĦ!òç ÙÜmqk ÄŞ“f•mİCŞ9ı;ġüQY WžX7q2³¤ë.úћŞsÒ,/‘Ğà‚\ıçÍŞcÈÑ ¨p#Ì:!°GB5K£ĊYÁĵÎ^YY§ûĵÖ÷âżċƒX$4ġ é`tĥIŽ•P™¸S8zdÙ@`˘ú¨ñ+¤ÍBà˜ÂĞ–£‰Ô*jÈMì³H$b{šé\ëTŝNµ/‹r˘‚[ÉĤµ;m–ÓdR…ż^!l´—7:·Ïœ´W2†žĞ2Cąë4™˙ÀzàZ·÷‰lŠl÷¨}Ù $}¨M"´YH³ĴĊò8=:„ Lµ%·YN÷9 pŽu%·3<6Ùcd¤S\SΉİ\›ÜÖ'Ĥç6ÄI­ÏÔêŽLúÈĈGŠX=}FÎĦ’çĤE<Ëz¨”iŽ3‡ašıj×Ëù ,†¸ĥ`bp)ÙÑÌV°MSë…Ĥĉ:‹ĉ7t ¨M)—ĦÈ-p­’ÙžÁw-!ßfYffĉژY&¸fĤfDÇq³ĴíD‰cT…gß͒q$j™ô"Ŭŭ9sa4J.M…ÓŞ˘ ê…ä“Ùċ]iqÑ$“£(tùUPž²YŞ8iÓ|‡ PV;ĉHÇ8ÎE’9°MQ Q™dààĦ‚µ+jd¸¸<˙†„×ÊIE ’¤WdÙĤX7KĊofĤÊLUâlÁxÒijMf°5Ħ8Ğ„µ2Şöh–•üÏiüèípS²U·Ĵ†µJ0Ŝ"Ĵ9‰iéäS4BÀġà&—^Ô|€ñueżKh#Swˆ\ ĉ€Û˘İqU'eg’ÜA7³‹òÄL‡ĜÁ‚'›rMÍYˀ„Êœ=‘†“Ÿi³ét¨İ wĈTrò3ƒ£Ó˜ĈŞċeVQ<îY› JSgv6Ċ¨È†d—•r•ĜÙdc4È;“ŒÉĴaEŒöŞ1Î5bŬ\| P\°}à`çb­bD°‘éü•?Ŭcǒ' 1.u´‘”ÁÂÀĝŽ´kP+jW6óğ­úˆ90­yğ&–S8é*úĜD΂m–U<óŞMhjFÏñİ)Pjħf…ĵʨÎq³cL6Ç0‚iĤ;Z{KBĉ²Ô<äÀÍĝwñ}*@wVĠ Žs9¤™kKTƒ¨y…1´J45£ž”f†ĦQd ”ĠASs˙ĈZFŽĜw-ù'VHgÛeĠ¤êO5€X£<¸Ĥ+™L°6 /Ħİ…ùµÓêL1.'ÒkÂTÓhê ›†<ŬiV£êżFf,ĠO£h7l[Bà6oĉÜ\|Ÿ 0pĥ9|vôĊÚf™– Öf’ÊEŸYïr} …’aÁ´âLk#Ù!‰.<´ëƒCš}mĥç˘PÂU3İé;LĠ´Ö´әjŝ´)TĠ/&3FĞfYçç™ÒÁ&"½ÀÎF.èbZLÑéĠ;Ġ³Ï„CŬÄÊ Ó| éüsAüŸP”sè́*@£Şĥiĥûe”7żHĜ Ü=ċ8ĝğx•I6Ĵ„_àD]ĞaÎqrċT4ШÁmàR‰„‰kŜj·éĤ6ğVĥ²ß皙_cá1iÈğŠéaŠ]&ŞdÔĴf³ĴäèìĉÏP²dòÈNÎÌ)ñvM1ÖğÉéİÔÂĤKOŒóáú_­àĉı3²mP*\ [sƒÂ›. ˘Ô ĥĝûĴ3”EŽÑä°ÀħÑ'Ġ\m°ââO´~l›û“'Ġš*UşQàökĴ­PÔÒÌL”1evXÉVğŞí¨é u{'!ħQÓ?MĊiŜ™ÒŬĤ8ttp;xšÍñW„\÷‰×g>xè*–/ ä24>[ĤÀU·Îà_3›UvgUâŬYÚb6{ĝJö½×ù(pUÊKœç^ #ĉoĉÀ0xVÛàÊÖۇinüğgÊŬx:] ËŬxî[¤Î—ßÁ³î¸ )taÇ ı8€Šwü&Í/›-^ŻBŬVüòÒe“˘šULžZĵdŞtħ. L2/·Ġ )ì fR ]nqĠ)ĥ›H}¨BšÒĥì–SnS²Ġ™J¨ÍW ²<ÎÍíÛËçží̆–˜SD·SH·vWÖ5•k—÷\µċƒc2­Z,4Uˆ 3U£B]Ġˆ)7FG97U+F)¤Ëu;£Ĥg–Şñ‘ÏGEÈé4ËÍTRÒÖJ\x™ĜĠ0ŜĉĤÙÑW×Ĵv ĜÑÏ>;ڂĵI3†)ځ)ĥ‚>çÁŬ‹j·ÜRmŬ½<á-˜LÜïÔ@ Üŝêê(ßԁğseûVS‹6šüYSuO ħT2Ê´#tfİĉ|.…q—Lt}”8·héĵÖi4rdĉħàĉ/Û× t{Ĝ“x·çêÁnż%;z2Š˘3 =İh[%Zz·½&áwÁâj>גŸ' ×ĥÑíH²uáW@{µŭğ- "&ÍĉİİĦFcÜâÂSRîÀğçÏ: ş’9 hU[µÇ“ˆ²žV èíPljfĈR‹àU2d>ëydÉ`ëÌ´×M Uv#mjٗĤbAÔB=µL4EŬÒRt BSĉj›b8˜İN eĤ˅şdĝ+dÛ|@ ç9@ò&ÍĜò˜ß­jĈZu(;k%p·êİĴÀ,ëXSÔKÇ²Äç/˘vPX–JUÚ4,SĝĦnĞ‘Ż„oĤµ3EċŞÓçŠÓ£ÓÇdŬŜĠÜ&Fw]ûŸ‹l´€ûòí­Oñĵy ™/€Ô™FĥÏĜrÓM=ċ Lë–ûıäàŽPÚúfôPxÍ6j ğİxÎtgV94:µôEKUİê:ĤÁ­ş k4éSÙ::CW•i™3B‹UucEötK-ŽĴ è4Éó S@ĉ< ’çÖ &˙ÔLÙ8Ŝİ–blĥ¨U…Tñ oŒ#°ë”PÂ)çZ=;+ığŻZÍ&_Öâ„Ŭ¤“RTÍSw,%˘³˘HvSÑL£fÒ8žµİ„aùutl”ÍûGè>gèĥ‚aEÍSÍkOE@dÚ65·§0ÚĤÑ=m:zeWé/I€5ËéR³œDà3šĞn‚·nÀ2K%;a"QÎTĜß.F†SĞ@żċ²LŽˆ[әĵ[ÍqiRğo `ŜÀÁ2ïRş—ÄÑĜ 6+ ÏġÈüç.ŝûìZÙÎVäRq wá? iSÖ<Ş(=í5Ġ8Jĵ#m[„(+³™jIoC5ËJA5™ÀjTÄèÊìj–U)£Š;™iê3ŠÑa”ËŜÂjT˙uÊùŬjŝż´bÁäĥhv:y!›÷ĤaèÛÛïQš6Û:pJĥ‚Mɋüe.'Ï2kçHsÒ­¨™>'İWÒ(1ş–cЏ\ô7°·LBàdUŽÙ“Ÿ’Ö;w)aْ#ĤÈÑ­Ş›™e­65†K69’p˘*+”¸…L´J\\ûNĞĴâëÍë£7߅TxĠ&ı@+l ÈER"eó|8És‘ Ôj‰ŽÊ@İîÓj뤴 8–iAÚJ0ħܛWŞMbÔé*Ħ}½t“YgFĤä(L€€Ĥx*ES€°Ġ‡Nê·3[²Sž’·Eâ˜ZFSžr˙&/N“ċ€È%ŽÊYäW%ÚĠÑwĴÇivÈPÙ 6)U.3JÑhêĦàÌqĥb<ܜqŝîmŻ­8vİ4Ĵiĥ&E{êĴ2hÔ4˙ÎlɵĤ 7fT$C§$€fÀÈFEÙݲšéĴ"x²g³VB—H3µaòıĝ…”RLr;[* ıÀnİħâlNùqL`'Ñş1YŭfˆĠ÷ööġ—ïSÚì8pÖé‹À:ÍT†ž>j†Ÿ‘ ġ8 Üí³>@äÔı’)· Ôt§YFg5mŝ$™RñžAà™K7•)=x%şż R´=ZÉÑ1KMԙ-W§aP³,˘äĤžÈ]“‰Ë€2šF~µĜQ ×$‰éĀ^ğHj­Ò é£éĉĤL‘HàÙÇ.áñnYĜ%öàÑ[ ˙ëŭ‘ûNg§2êJĉÀ†F‹‹<íDÑĉK£ŭ 4Gü +ë5CâŽRÖ|N/‰ÚĴ@˙° ,  4IÚT-ħ3[ ‚Ÿ¨ÍÈ(™)•.ô(iĈp-Û^ËvÓS€Žnp„ÎZ=Ò´œ iĠJXè`ëL˘[-E§‰Í ä)#½m[È&“fs n1j3·Ż_#e¨ĴÓ@ĠŽÓ°NEÖiFëH™s1¨-ÖÙ\—‚áZ58C¸g|ŭ£­ÀšdÊk İ>mŸCĥ+F`1ƒÄh^™>üÔÄ71Ïú‡²àĴ3uϙ݆yM&qȰH+*&17ŒŠÜ‚Í,E6İğċs%sÀäŒĦ&ġû' r–Z’½ù:ä;û3zàĴó PäŬIQ#sŜĊçôŸäbǔ5”MN¸â€‘:XÁĝjL ĊgJg–Q—úOJ;ámˆìÈÍr9­çTÒ0×K8‘r\·:“ş™Jn–]!È}'ċîŞK†qa†ëW꜖Ë0Ġp’RÚeç“tK<ׯƒ™ÑŻÇ>Aú7¨ŭĤc•́ŬÍ^żÁżt­HË7rżû½É?áUŻßĝ×ñ^›àëĝé˜ĥ`×°î˙§7´ĉ?;„É`[:Áúe~á!ù¸q˙~N5ž?Ÿ(ì|„çöĉ Ÿ$ìxĵÁëċ{N ž"wÌqĵc.ĝ96Ŝûó˜/–Ü%ĦCùNióŜħù1ŸÏĜòâââòüòêêoğúÛċßŝċê_ŝĊż]ŭm\5ùëĝŝ׿^ú×ùĠċĜxlĝ/ó ŝżŭêêŠÎ…ÈEÎÙ î8ê)ͲYƒçŜQî·AÇüÛäqĦq¨äs:Ĝ0œ4vDÀé—gpw˘W'ġ.?ž Ŭn‰b.şMċŽ”k>tZ‹Ĵŝ é;ŭ˙‘Àléġxĝ5İŜàĝn_'9&tROk|ËÀÉâ8˜9p$@Ĉµĝµ/(éUŒvÄE\Âôìe£>ŠĴ'†"pÁa¸ÀàŸé½ƒe>ÂIJ½“{ ÔL,pl¸ĝË\ğ̈́¤ÜĒ0 ÇĦaŠíĈ ˆ^¸>ĝVú%Qq?î](Ŝ5a¨:öŜ'œĜ,žĦ¤:—%ÏFD‡¸ƒŒê‡5ö 瘵Ġ£³w²G‹żŬ]{t?ŜzÄg ĵö”Ñ^ÌxÚżġ3€“Ğŭ×·n[àúÒĦù~?áBž¸ô|Òjg´qÀŭä …_mAN€slAa`ı`.èZ+˜ )rä/ )öʏ…YûàĊ@öPçBVĠ”âT‰s:fıĝÖ3Ò¨ ù”¨à)>@”ù#gf8ğ/—ŝĥ\‚ °(êhX9”Aĝ!˞wKÂÂĈİ›9Pqz'ĈT¸´@ÉüDÚs‘-—ÖbÇħ›;Ô(„ż ş6ÚĠ1 ĥ˘npÔs.ŒjËĊı ‡M- –Ŭû#B0k?ĵy‹¨‚€,‚èúŬġ5 ’hz48·7£ş3êgĝÁğOG47‰˜ŜÓ×4‡Œ\ĥ¤›ù4U?œUÍö[È l " C­ÙBİê…ï[r…FnŜR‹ħÚbâ·rı-U"ö›[ıñܧ„\~;3Ża΅ğŸ 5¸ò,­Ú“óƒÍtà´l@„`Ġ>…sH?p6ş­ġ™ÈY×ï9†öÁhaŜÎkÔËn‰Ê/‘Î>½’5ßú5󛰎ÀçBƒÔG<{Žâ„kyâ ĉñP5ŽŻhĠ˙ñçŸüàU5f¸[•µŭŜ’´²‘ D œ†h£}È[ljîZ IDATöE¤“Ê£Ċ:Û 7ıíݏ*^6JĊŸ¤/ìoéjìĊàĵ¨{èrHŻ Šĥäê§Mġ'żŜ—ħôÒÄ[DĞ08iI?ħš¤5Äzöß#QɊ`lÒÚé£-ugŸMÊbĊ…}4­œck$xËîĵžŒ–KßA—k ñCÂD î Ì| fœ£UvbŒ 96µDʒ¨&.¨kħO‘],ħ…Ġ+q§b…4hħZßf³ÈşÔž•ÍKÔıoGĞa˙½!LNäóô?Àˆ"à4ĠĈ?Tw~BĊĉöÙÊċ”ĝ‚²£)޳ñk~‚ˆ;oĜRÎĂM§è>VfìĞİِ'úQΜ‰·§ÁÜ*áŜq.·J҂´“Óż_‚ž6 Iġ… EM-ï/g£ŒާÍ3çì”Ú–*xV r6íeĴÛU´{NÛí‰["¤>m:v…ĤfoŜ€' Íí êlPÒ°‹ F[B£šF²ĈğŬü¨çíÊ×ߌ?ŝ($§Ĵâµĵ˜ìè I¸í?ŭüÇñ?z³s T´.unŠZêKÇa:ڒ|†¨‡Ħ=lŽ&ÌÄ"ÈN4`!HxÚr1o—7ı˘f sNË9MQK<Ċ™˘VŒ›Ì&§[ï~r¸‚Ô8ŝĉ*!-Žj]˘¨ċ¸züŭö5ˆ”w`րû Ô°kÒۂn††q{’Œ˘‘ŜZ_ƒAñĦÄñea\ ÄéïĴ—8cïtŻijÒ;†? ÔH•pâA?ßçšZhšij^·X‘S5&óÇ78Żm/Bgñ•Z şË!µK4µ0rĴt“÷vE•LVŒTSësM-Şš_iŻlôe[aìd*—ÎcÁAgżÂ™Žŭ˜ĝt½(̰qÖBX+™.xEuUÁqDZ>…+štsâĥ•ú1÷³’.†œ9³XiBHô'ío,=µq|$šš‹İà‰Ĥĉ˘ Ĝ†àJ×ÔÀÀ‚‘›+Œ8İİıàôîñ¸KM̓/|ee^„%ÛhÇşË YuOx7CİİĊÊviŭĴlaŬĉl?"Ào>f/Q ³lŜ½Ĵé|¸ Bhüóqœ ?%vš{ö6ŽĈs4ĝoŸŭéŭ§›££áÖż>ŜâëŸúŭ l÷ żċ#ŝÁÇqíÇ÷ͧb·żûšOż|„ġ|´żûĉŸü§OŸüŜŝP·qwßĉ|˙‘÷òëŭaüÛ{Ì[<úíGüôÎ줨üˆ‡…“ùŽÇòçó‰/áÓí/pŝ?ÒNŝËû[ì ĵ2%·1ž(ûDú~ϟüßŭŜcOáɏËOŝ7Áž‚_„Ħ;>RßàQ>ò‘~ហÂħ>Aş?)û ŭċ–΀nÇGl ˙Çż„ßĤkûċcü52pï?âq×~Ħ3Â;]쟊_~y˙i8·×8:`Đí°½£¨Î8TnoB(‡"=ïÀÁv´†sz˙ËÇ÷} ÙUŽío[Ú(öލ†pË9Ñŝﵒ =ŭz{âÛÎğLnz½ÇŻ•Öo*ë÷9‡½/êħżSÒÇYÛ×I?ċëġëmgw~9ÏççWWçWççŝ#Ĵ87ŒïçÍŻĈ7\wu~ +²Žè]ÔÔìSÚ8Í.Ñ­g~—ü g9ç*´ûpBîÔ'ÔӎRP\뗔§:ñ^ä²vùNÎfç²C;ÛċW¤âı´]/.”__jTšvɵ;Ğ]oĜĤŸĝŭdÏ/ôŝ%îċœzpG²ßuĥñxsğ„$ôzèÏġÙÍr¤³ééú'ÏU++@i+bà2 tӄdf*;šĝq|~˙f=6ß}îùĉa3l†ġÚ/7ŝoܸö‹qċ†Z°vWĝ\nĜÈ;ŻiZ-Ĝŝ€ZÇ£ŒżÀgĉÒ;ƒÊ€q/˙VĜu Z‡³ƒO~’Ë×a·“ĜlM‡ÁÓ\ÓNxMĝÛ:µŒŽĞüYAہÍa·M8 } ŭI}LŻü.žŜ6ԑpÌ!™ïÏ0µ‡ñI­ù¤×Ü9kZÍ·h=O _6ö'6ĝmèwĊšOĈŻĉîĞ?Ş˙<ÀûW?ĝß{€GÄ˙ĴĈ=°?ÖĝÀs½Có›W€6M­ö¨?’Lê:?NjĈ²aògÖżK\!ïŬÉL­ŭK|×?”۝J„¨`ĵçıù.3Ħ]ċ8ùQUG—<$Ħ:-…ßin•Š·Ïj-’ßRvsVßP§ŒÔŜ²²£i1ÉżĠ},6èEAȗï)ÇKP¸Â€*X¸ĥL›Òʄp°xTŞÈËhfŽĞwülّ‰íû˘\"^E^2Tlˆ*‚Hú"9‚ µy!Fê3H”ĜQYoˆħ\òà&^½‹—NżàbÁ†ciœŸ·Š+Ĵü€•ûàyZyĥV~è“+ħEŸ‡Sm~ó =%Ž–½ŻË‹‹s˙qy·ò&ĝ(ÖûŻW´ñ’6\Šm¸çıü•ìÈÊWÜËż.” ùïÇï—8ŝ\ô29ñéßÔLĵà`—ùENì~Y9êċä ×ÏrŻóM›cǜOžQÙ½Ġ)í.'oTö?Ÿ_]6ży蔍Sœ,;šPnùj›]^íDĥòµŬzȝ_­Ò}̏îúc=Ñşóİĥ;ŬGž|{¨fíĊĝñ7ŻMĵjä^µràhÙÑó˙Ù^§Çóß_Ïĵcò@Ñ3Ż]kü8ârŽOŭżùñżoä h%v:‹ÍĊ†p@żÖû~Lĉ_µà'³ÓŻEĜĞ8İüôĥÜ_ymbŸqġBüöÄĠ_€Ŭé8g²OU)ÇĦm“§ì̽›Ŭ#옳“Eġ¤Îä‡zf{Ĉ›]üLʝ;ŭf  èc³£mŜÎéäÇéèŒf³ĊñÙéÉÙñüt1ĞÎNÎĈ÷3żn1<Œí°ïÎé ĴŸ†qĠ<ì1î~<e1_œà×9ô”v Íübü;IV/ÎüŞÓt-ü˙ó'@+Ĉ_ûftF‹p4˙œàĉ9Ÿú]ŝ‚<Ĵ÷xĵ‚S>8Ò÷Ê|.ûHœ¨ï€ıvdèáSèïħkĈ•gáÜwÔ˘<Ž_,Dü–Eŭ|}7œ.ü.Nŭ·%Ü1‹˘¸/ĉ§|§sşùS³ ûğÀëÔÛ,à H~‹fž@+= ?Î!+@ ċf>lĈĞÙ |œŽŽáŽŽNèÙ<=9Ċijì%xŸÏ‡1?Ñ¤ëW.N<ċSÓqë‰ïdZKxÏNB3˙0Žk}£¸ûÉ)ĴG£ĊĝHà‰œĝ“÷Ħ_]WXĝ'm“ÛÂĤq×Sh ÛĈñžüĤò[0tNà:ĉóxH–ñhp& ^uĥàÍx Ç|yáÈóS8˜Šŭ!ΨWNp0r£¤7GN–ÊùŽÇÄ;Ħox8ì!ĵ˜Ċ"Üɤ·ŭÁ‘ádOµ_XÇˈb7½ÄEìĞñĴOĊÁüOÁŝPĵҀ/şqw/Ž‘mċ½j˜ñġ0À,uBĥ>8kaŸœ`ßĝyró0ŸÓò3&´ƒ• °NŭÄÈMONO³ÚDÒĝ”œRÂ!üXġ-θ%Üżä<"ŝÈ÷ö˙xoĜ'*Ôĝñ ˜·q·ŜÄ[Q^ĝNŽ^~ƒ™ Ou† 8 è08s­¸v']é$™úĉOÛOQŝ™Ĥ+€“öû'½q Rw~ÂöÉI¸èâ|ŭ}£fmüÓÜs¸GX͕VÎi†Ìş=ïú½3şĠ‹“jìSÙq °”ú™˙ëí˙xŒlIvôÄqFUÍO0Î^eó²ġôáa˜ûñäW€>î{Òoü:ßxlü˙Xé÷{óß`ɏM—ŝΠ:B] Çï0΍´ċƒoï7ùï(´`)4óâĉ³cœ€½.xJûÒÛ,h²>;Á‡ġ‰—6§'<‘ûÖgx†ĝ[tüüÂ˙ Mˆ˜b‰†33…ö†n<†g%3„°Ŭé ž˜\=§ ĥsqŒrÎïƒBwĉ‹ç JÑ"t\-Ŭ1]AĜŸg4^ĉx sÚ_t{öCİÇ(JZN%Ĉ6,ŒA;ŸS˙ѕϑĴÀ3c6/‘ 8£°ïĈ0ʝ…×·†á‡Á0 V6 8ë-ĈÑâ‡Î܏İádN#Șq?Z`—‡‡‡Ċ¸ĉ”ĤäSšža6ò<{vp˘âžg¸bf_,XĦ#ɵ $× ˜@s–pŜ:!ÍÊOŜs–J ähÎI䇏j”¤° y*F‘7H–Sş$: ŝùdħ? E< í‚Ò‡'{+4žİŸžOÑ@ ’‡ŻdŝÉ|Î÷ßĦèÒáX§hÎô=şÚŠ"ĵ=tI§I·'?DdNĥà³·‡^­ßĠ¸á”oÜĜ*³Ÿ½Äé•8Î8:|¸•î*?>Ëŭv+‡¸V€}ôÀ`àl°ŸñĤyY5g!áċ̜ԟ2Nñżż(Cá'1‚šMV'g$XHN,`ĉgğ™5ŻU´|² ‘rBN  ^ñ Š˘saéOÉbĊû˘p`ħš³ÍĊ²rARĈ_ÏùtÂ'ĝÓiâl|rJÖÓ Mġh÷ĝß\„gĠ_ëœûĊ>Iä0Óàžg(ĊYĵž-p vÄü„…Üİ;pÇ|XŜ‚\Èn§#ž’|E)r +ŽİïÎhRD N$Ü#ó0&ĦGŜ ıíÈŬyŝ6ŽÇÁ1 tÏÑêÁŠóŭ°À•Úê |öÒf#wñrg`gkò-ƒ†+ 8À :Ž@ZË G İݵˆ\PQ „Í*·?‚ŠHĠžÌPt˘,H蛲(#ì˘ Rĉ8ˆ KĉlÏ Ŭ‚– 0”@l=-N‚*H=&Ċ‹ Û ú†ç ”¨~ĜâOòp˘p>§4ÙoD„Dġw£˙ñ*kh­£L<£aŠ‹‚z“-:R‹ÏÈÄñ›Oİ›„ĴCqO@n”73“i ,qôıŸÁ§ ʓ3”8›h’‚)Ägŝ˙Á'À"ĥúIÇĞlĴóf1GmžġëĊœ]m‹³9ÏI0ÙÒ.§s6˙A8Œ‹ĴŒy˜ÉÑ Âùòô„'d§xŽĊá:ñtÎĉ¸÷"ˆr)-NxĥÙô„BhÁž˘“0'/N‚ż‹f]xÒh‚> Â2J.ż8 SxK<§ ôAjC4tèwç`iħ ö‘·OÉ.Dı ŝ Úà F <0LYhAݜàħÈv!YyJ–)ÙŞdÂ|@.’ Žà ô{Ԓ§8šŜĴțÑĈqw߃´ÙOâô5\`(KÔ½ĉk–#4ğ>x…Ë1ʕcD¸l=%u&R½Ñm‘Ó$ž²iŠÖĜŬ=.$¨6žÀ\wâ8¸x4ÓC=êA˜ĴyĈr†ĉg~ĥq=‰ĝ.ĝ§h'‘6§ArhN:>ùİŭĈ/|Ŝà•ĈSeëT:­s´£aŜ§'%J3^èœó)Ħ'og4żFÑÀΙcÄnÎŝ¤^,ȝû,ŽÙ˘ñfŽ{˘8Î> BıAO2Ì+È3#g@Ñ3àĜS‰˙Œ+§`˜R2oŽ}‹cżŽqLÓ$)ú`6¤ğÏ?̨gY8Ĉ)QÚ8™~\pä̎ h™hןá< s4Ï÷äÜm Nµ|cI–ë÷ž/ËœñOƒ iĝċÈüŒ•%~\ Žt… öC`…Œ ı÷¤¤?W/Ç|B8Y²pêċtÈEáĉgè á‹Z$=vĝ4=œħ}ż„l.Bpd_Ÿ’l‹Ž„3èùc2!ÏXI;ÖQO¸h%Jíü iÁgó(”›q”` ŬˎÑŜ!I²Ù°;:˜ÂƒŻ³ıÑż‹/|8y´[¸*<s6BH‡•£³ ³sLÙä‘BĉµEˆÙ  ÷‚<\aĉ£À˜}'$,„y1Ş“ Ù³*qÜ>è:EÍΊ\D"˜Óï‚vĉÀîiˆ[°&6gms¤ 8‘A.²Zàò0ş ÊñÙí›ÓyŒħ‘-‹˜9‚ߍ˜8™Pż‡g)ĊÖߨV7IYó§uLAİ2÷P} "Nèí÷bï„\l†_#Ċĵ„¨v÷8@“‚Ï-òGɎĤ\5?3žĈ,œï7CHH:†Û9Ÿ³î6GĦ4îÒfA#bCßäÀ9ƒ+!ü1307?sׇÀô{Çq$çmìXš–äìÇñŒlÑàèú;§ĈGĊÎċ"ŽRä ¤ĊqHÀċI4XĜ³´ ïÖüì4DAï•Ùìì:aż™1t<`4İò„ĥฃ‚'ìCŻé8&(ò8g‹àĞĉóĄ™S¸é'(´@Ï:Ĥ0İ0èH#ÉBOèœL:z^Àt[°o½Xìjà°uƒÏႽ‹ŠA02ŝN(¨d…ĦžxBœğĊeĵ•¤ûa’SHê`áCÁ¨`á„Àˆ3öÒĦP˘x ]VÔĉ4™‘,<#]òDä)°›ħéÑĉö/ˆ+v3} ŭŽ’ĞvFİ%äsG ;ĝfïèœ ˜x@ƒ;E?Yh~xıuÊá˜9M£gÁŻ Z3$‚RŜ’Œ¤P¸›³Ù(ĉB2$İœ²U/Œ ĵYǤP󇐣ˆcF0ħbêڂ\H˘Ħh iR!dçóÛâ™Ĵ°˜Ÿ„ä;>I”ô$‘YžJoB’sê4ä¸,HϚ g‡N-)öµñhXìd÷]ig41Ż‚ċ>j á°éÇÁdÀ>ˆ`è2œ8Ù$ jĈx{Èt|ÏI˜‚ó“2FĜ-w&Ê üêËÎg3Şt£2²=<0ì9÷oûm÷Íĉ8½àóC “ġİÙp9Äĉe–Žr9<ü|ßâX^ĜJ˙ŬIĴ'„úïj|†÷ÜżİKSŻĦ~ÌiP)GEëùšĝډnwì ¸ĥb´ÍĥB/Á¸g†Sñ&Ċ~dçĊ²ÓqgŜġ\Ŝ’Ažßx­Gœ‚5.˙{Ñú½m˙#ï· È+Áí$qv÷@7;œlœaċĈ^z´s·‰1Úêì/V|8[„oġöÓEdH ÌĴLq9ĜŒİ#ò^:‚#`ƒÀġDÈjò+•ï[+ê×í?B=;=ğŭĜÁĵàûWgy#íë`=#‰…#XżŜ9Êĉš­cÁoA nÎGF„1„Dû =è¸Ŝ?íËħ‹WÇ Á;Kˆìkì×~S€[3í‚ġÄ#{Ĝ&3Ĝŭ ^éu~Ŝ_{ΐ Ïöá*%ÂŬ?2dżö+0r׸ÂçlèN†ˆsVrÛ=Y§w9;T€~ĞWPn|êƒğ\‡MP“`–œžC€éKè‘ü÷‹™úŒžêbúl ³ô…EÌd‹üuşiÌEá˜ÙÖ{•# XK\j=ޤ|íİLy‡÷Ye_çx¸Jr+ÙM‚~„ĥô Ċç"nŸ#,WÄ­è×.rW³m?ħ)fŜ€Ês?ş)§nb#.vy'ÛĴû%ê 59ßhÂċKK#ßġ<ÏôĜ/4á qd.è…\ÒGBXúwÎĈ 0BíG¤,ğëôžœíħ›f—́;$Îx9ÍĴq^ ĝKŞJ˙O˙ôŝżûw˙[˜6€PvĵĞĝHŭŝˆÁĊ=íìŭCÛâ6šLŭĥ5=Ù?ĝ—Sžğ„žó 'qIX!LĦ8Îa•‡î@X  l8'Ĵú~NĞÎ/#BĴġrĥàÁ.ä<˜àCÚsqT8Ò&Dúb/Ô7 ÊbÏÛËÀâ" °#œ9䇿s’+rtA½ š5'Ä$QX/9àĴ$Ŝ;¨ÄÙĞt§£ċލŞá%\ÀuĠíŸŝ˙úÙü×˙ë?˙çúw´ĉ&Wlĥ—ooŜŝµŭABÍ](ÛĝuħNĥµÉ6€éşĵ³żZ ov|ûġîθó˙ñ“ß„˙î° ½ŭŠí~…ŬiÓŻÉÌz'šÀPƒ[żCÜWŝp7nġ·ĦíŝŻñġûŜ]HË ŠâwŜ‡.ĥŝĠïn½yÛ\4ĦÏMmb‡mVÁ'ĵX×ħ/ޤȁŞ'ċĝRɕmJ+fàC+‘"Ŭ˙ÏŜÛĊ8rgÂ5T+ÜöÌĈN#ÀÂnàÓâ3 Y@7+ĝ˘/{ß.ı]Äsc@" ÀĜ…ħĈ”.*( éÀ+lÄQlBpâÄĤ“€@K¤ŬöÀ[è V‘FNzmé”4†tĜŭô|rŭ|çŭ9?U,’Ċ&9Í–ĞşÉ"ëTĞN÷ĵ˙ÏĞËÉyŞNŸšpĵڜİfttjîu˙8ċÎĝìWùÓŻ鳟zä7~sŸ˘BĵO<ËĈµ×Ŝyçŝ›÷NĥLé0ä*jíĥ™bbT½Ù´½Çˆ:äu"x `BKÍĜF‘#,/!â§.ú-a„Vĝ’ÑIê.ÑÊGó)5LmbO ´AYÁsùdürŽNRÒÖŬüyh€ìĈc Áğ?A6û¸ ëÊÉQë÷XÖïbïCWmjs˜zhĤ›˘XNX?ÀT@›Œ‚Sĥ Î)Ĉé:Ŝ)Za‹Uâ,^!éIA;ĥocS¨‹Ê 9%ħ ÔVjÊĠˆWÁqVèşü;„8NÊÂïŬü—G…}ŭÔ#xżÎ ,·½vòѽ7_ùÎŭĞ$·â ònëêÛşíچV†bÀĠq}ôĉ›Żßısrm#6 {Ê8H `ÉqY#B§ Ùb1çö£7§Œkì.ıFsN °3RCžÚŸqNŸÜkD6?’›ŭrƒŬœ„ğZ%'y%ÚEŬ˙‰Úí„İġKœz°xûˆžK&/%QpAê.1´67m‘EÒ0¨‹áİmnš ·.Ò'TĠh¤bԝ3 sA9ın]`Ĉı•œ\ÒѕĥŬÒÔN)8iŞ·Êbqpşj ˜+4:ħA,-_2ÇYyt4ÈÌŝ(*áƒgôıoŭò[_ü—‹?ġܞÏÓĦ”­·?ŝĝ{oŜyñûŻżÓ²ġ$C(RĠzí?zïuĠöòIËXu°M÷‘:Nµ}Oµ9ĉ œ˘‚£„áË šıEw·[tŭ%­¸_×@CΎîÎia• Ż<çĝf [ĉ1†ú E5µ_Hä $/˜gÛ.ք“$˙ŝ(ú(­‹¸Ĝ|l³Bt˘Ú¤ÚBÛ&KuġèяÓEĵD(§ˆjeAMNÔDİŝëXYX[K¸–+ÓqV\u ”:LL8_|ïŻżü¨í„GàCH,I \áÛï}üŜ{wîĵĝÜ Żw[Ĥ}ġäÚŞí½ïĞĥ˙äôk IDAT^¸ĥL·B[+Ŭ˙ĝ÷îĵüò ß𣎣rb„ĵNÉ÷ùù[’`7'cc˙îoäùÎÙo' b()˘-}ğٓÛ[-4bâPF¸v…;ÖAóÓGµÑƒ)´ùş-h›tÎi^’še´h*ÜÇGNE;]ĵĜ-lld³ĜÁ£ĉÒu#a–­3ÇIŞpĠĵ{ßpòĈ_üċ·ü)­ŸÄäÑ@³%¸ZƒŜĵïžbÏ>ûòKmc•¨fÚ^xîÙ;/‘&#İMŞĥ{÷mê8’EÔ; ‰ÁÑ<ĈĊéÖcDy„“:ĠOàj—7òÄğé)fá1u1È0[GĤʉüq˙އ$6Ż‹Ëm¨p{ş2FâiŽsŭè÷Qꊽ?׋§9‡ĠûżzĥÒ9˙^ í‡ù‡1^ċŠĴÂİví–×Ĥuòï°÷ ĥÄ62ġ¤m%ovCIrŠUĠ¤_oŽSöô¨û9Ĉ2ċtي½üÖg?ûĠŸ*ÂyäÑGb$+ÉúÓĦˆ[·Oî½.$ŽWˆĞ@hġTċFôÑ+÷î@›"ŞWÚT+“ÚÄĈmĠĤŽûğž{ZgĉАÜDâ4„3ío8­zKÖÙMÜApt‹Êáôpá͛qžìKÖG-—ìí&G?=2ÉëŽ7݈Á• ,‚aïI2ǁĥ6ĥYÂĦ6ħyċµ!)Â!Ğ´ésZÂa[Ÿv‰ŽlĞ0NAôí8ĠB¤3ipÙ^9YRĴíhĊWˆóÁqJÑÑ݉ĝ€ÌÁÇ,€?úŸŻΗ˙ú—_úÌmşóc2[*Ŭ·5ĵ÷ʝ—Ġĝ˙ŸO?ŭâK-8SžÜsÇm£Ş·Ĥ¸Ñ×UۋÔĥaĉ›Ĵ˘GšOhçWL¨żÖ&o.J=$ÂI31ÂĥÑĤ½†â8BsPonnï<éA_ÇĈކ,J´ò˙¤—=ĝ‡˙ŭóżñœ$€aĜW úßü˜ĉ8—2m.Ç!âĝʰ×G‰ĴÀq8ç+‘>î˙ü”˙Z(I`k3GÚ µ‚Ö4Ĥ½Hë§ùZäJf4[GŞFTA{QŽUÄ>Ż ċ†+²ÁDxâpu£|ñĞ_˙ê—żġ/<ŞnÉë>ɞiÁ;´‚w^T_˙Ż=ûz·­]ûĴÇĵ£Hï¨-lK]ƒÉ‚ î}ŸÛžŬˆ{u`­c_$Î=;aD^İ––畢ĝ*zÍl[1ċ$!Xù·.mĞħ°µµu¤:‰Ds´Rïô€|¨9gÄm‘|ĉ ¤‡xâ3oŭÍTšëKE8ŭë×û uq·­ÄqFŠpžWm_Q[ä8ıĦ›—Íq.Ç A$ÙO´g…-¸VċÈqzŠ‚ħÙ ½p\‰" ݆և".íT,PU7ràŞó·:àÎÙV5ŽUC>ûtÙk~ñ÷tóÖàÊĠÇÚĜì÷V¤°ñڝ^xáÙ§żöô '-ê>IQ2nŭLµ=÷µĊòˆû ÚDkô²:ìı§ŸŝÚ 'ÚëĴ$ûcitϵŞè˘üeRŞĊC Ílm_ÚĈŠ÷VÇA œż³³ÙKĜM#ŒUMleGŸyâ_ÓLÑÍ]ĊqÈhvÌ,I òŜ•ëáġí£Ĝı5ÍU.w^£ĥÇ3Ċĉċîµ?ñŻoıGq• SòÑĉċêu_' :N MzËXQ?Ñê ‰Út c ĜĊÈeBB ̕£Ò ÷BÎfÂ-jqœÄù+§y¨áċŜµÛIÙĉbnÈòµşß£G~÷÷ô…G@‹Œl?~ŭÉĥġ{§@WïżĴèĉéçw?lsÙ žêĈĠ·ï@Û³Şmƒy8°+8ñĈĠ÷ íkÏŭŬŭ°%fè“˘’p¸iᘖ3%œ`Ĥħ}I‘ÜĊa‘äÛ;ŠÜLwîdu()ŬFQÎż>ñ™˙üƒĈċ8;ŝġÎġíV%ÇÙñŻqÛ¸Ž£Ú|˙ħŝ…8ޤPAsθ…bü72–ˆŜÓÜĈ-?Háe£‚¤6²ñĞìTQx›#ӑ u䳑°H}RÔċ8ŸŠÂIáÓÊĴjT‘-5Ó@¨§Cu'G|á `úWĥ7·žì<ÖF RÍ#E/+ĉñúGAĞ˙·ÇĈ=@hTËĥŬü[| h’CÑ_µŬyñ{/Üy/ܸù·şĜ=…$¨ßϋ˘Z‘µ” Ç[ŽP@†P ç8à8ŜġDl÷RÒşlUƒ÷ᤊržĝÌáo á@ÒòäŸĝ×ó„,sAm×·/ˆ²Ž“Û65•uxl›Ûëpœ°ç§-òÏb DìÖQg3{pŽy“4ĉh”ñFh?IÍ]Fş2£4‡’Tb¨q䤺güÓX²gÂİÈĤŜODÁɀ,â‘GÔMmġ.?$K_ÙjĦ‡ÜÚ8Ël´—~öRĜjm˙YoC÷8ÊBĥTÛk/­ööŸġ[:0ÉÇ@*Ġĵô ÷ĜŸŬÜàÈgˆËóZêŒġ‰:N=Âñ&á¨9ôHl‘‰Èè8Ä,oŜôĵë›èd—HO@Ŭċ}â‰ĝĊ[?˙§żż€‚‹ŻġLħù8˙2Ç‹´mÀ€½ç˙ŭŽcÛ₎#éÑ\âÔäFTƒ˘Z ]ŸQÚxA3ÚoĜƒ!1 ş ³“ib”éÖ"–² İĊ^ ê™ÈqÌr5ÑÈU7ċsġ„Sj€u2P .Ü\ĉ•í'/a(8ĝ‰%a?´ ZÊ?xìJŻ–­Şİ­(íûŭ~Kh‹Û!ÛŞİ-Äl_ııÁÓYÀ €ë^ÉŞ–ğV5GT˽ …½‡ÈqÇÑárNDû@Š£éĜgĤŭ 8Nž)9í3Šr~ñOß ­U ôÌÍíĞÛmš‰Ç9Žjkaì3pœ˙n­jĤ Ĉ5ÎŽcÀO?³aĜÂE1i+Wó͝IJlR³RŒNs(5ħ`'Q@qêȉ`Â2V·É§˜Ü9žú§2:nÄ·Óa;šxüíK’ƒ˜i:´ópÛíí+ŭ6qlt]“U“’˘ZŞ­s•V=9ÉI§ú3D ¨”,Ù4òü8$ŞI3Z§”‹;„ÌPÍ"2 ›ƒE9ŻŝÓ_z/ĊmĊÍÄzAm_ÀĴl`)µáTÛ6¸è$ê8Bµ=v‚\ĵVKŭ·8Á š‘ŞİÓáĴ¤ĉ¸@5‰ÉĜ1• SPž‰áĜĉph,LSÖ[Ç‹ŽŽ1:<Àd€çĦŬ]jbìm?Ùe/„Žá“D9½6E¤4u°ĴÛż”£s9›’l p\ }a!†ŝ…G‚Ğc9™QKĞb‡‡C8‰u‚Ž£#Š É&µŞ)'ŭW°§½ġ7Šrŝé//¸Ħ VmnH—bóI›í–ž§ĠI.¸CIÙlqfZPjĥIj#QÉ$ı’îĜ‰›qôĵ¤‘vğp(c_cq".SKcʎ­YÛ •vß9"&é8Vµ|ıVµ*”›Ô¨ǁ9ŠƒĦú—ĵEĤ’Pï „§ç(Iĵ£‡ŜLʲòZħ {Tm7Û8—Ĥ#KüıġĜ•ŝy/ätT&„…ïùĦ„Üä6.ËÑqUl˙Rʘ12ĠÇGŝ×g~üÖŻŝâï?óżŝñ/=T‚èHf#f# Ñp°ÉŜI {ykĴÍä{ ¸ž:ÇÙB÷1ûçl ²İµħ%ÍR&'lcpI@ZIM²>mlk:A§³ŠƒÎRħ¸g%œ ~ŠH0r v­jHĞ›×ĥo JÀG³$ŬŸÄsbtkƒÚĞ'-àϏ]+€3G`f°%ÉŬlħ裎sƒ_Â%Ät‚£ûF†„½ŽovëÄġMB×ñ@O‰û·Noǟĝ­CO,àŸF¸àҙK˘Mì2Jğöpj”VcF ۚQ–$‰t´ĤXi`7›Š-É8 …¨bÎ ³ÑqŞ0 ”pF³8Žw ÄPaÒ.¤°:ìt4â½ ²xìì,ĴÁĊĞÔ 4ߙŬÔıÔ)—ġŸjŒ™ñW0­­ŝ/h–+c:’:hŝĜù³xċ¤Óĉ"ÒháÊ\0›#NŠ0„ÖŒjƒĞ]İ)+KJ17Z-Ž­ÖŞĈ˜h$C?ÊXôžù>*¸ÌJ ‘Ĥí¸<‘EE–UÙâ…4eŭç¤˙rĈGaLkĞ4hC8Ä4ŽÒƒŬ0}£’e²0ïŬ@˜ò™ĊÈ1á:! XMlĞÈ.3”_(ƒI wĵ)ÄÓòüÎ(.8<].„Ŝĵ"Ŝ­Ħù`öÙxꑽwjÙ:β}9cÑÑ9F2Ïğ@É"7†*Ğ&üĊ×ĜÌ(D´]‹ç$˘wH!RĞlBĵċáJò&½ĈW29ì&ړ~aĦ;Ë|úelÚÌ9A–Ö67ݍĜn½ß$µ‚Ôşߪ7p›Ĵ†ĝ҃]i޸°/QOìĝ>ġ|È'Áè ÖIêb@ǰV,,µ²uŸ*/V·!b`(K‚šƒPÒÁÁ!ŜËÖK@Fs83í L˘İöċ3Ç@‡ú- vâ‹C˙„– ŸŽÜÙH7|òĦŜ‹ĥé½W·½v¤Ħ44£9óİ4ʳŜŝÚéŝ;Îhî)Ĥ²-ĈŠ `™ŸñƒGOkĴi¸oµé5Óşú5³ġ5:ä5Fħ6ûEşƒ4ĵğĵĉîjÎh~Pż‰Jë§Iĝsc|Š' °€>ċ]PsĤwáİ ŝ=ĊôsÀHÄCÀè5†bF6*TˆâOEc›“!Ç;W%Xĥ޳t‰+"R#eìğfXĉŒħ™³ sŠĝ”j#µ·”Ħš3úÏ˘9ËIñÔş§n.ìÉ8f{rŞ˙, vK:0Îd·ı¨í7oj{‚—B[¨aĴ§˙ĤAĉĊÀ;ÍÓÄÜHât˜îîJ84ÓçÀ[§…žMÜHíù“4·ßiŸœ?%âWí\>1Ú?u‚šŸ˘§Ÿâ:Íó§,˜´|Šb.Ú{ÊAVŭAÚYkċHlħu ψA mmĴX cú†$Pjpĵ ĞÚÒuœ)ĜÑèC€HĠàˆñ” †s…Y7ch·ŬʘÌ9· ÍsꞌQmġŽİ =ï ÁŭRkÒ0Ħ‚³ÖĞ.òBş ⎟ÀQò„m“äÌ"PÑ鿙› Oä\s‡ÎmòĤٚ;1/ [;À×EĜkM£'nOçîaü5Aˆ7ÂÙ ñ38„á¨ċ)µ€eFŻY µż†hÄ-é(8:@Ğ@ s%ğ[!H I[ G`Pħq‰9­j³k€BT›„kaĈš1C›ğŽO-¨³ğ]?òÄ´$ĝÁıß"wµèÍúvùİ-P3À!€>×a+Šn.²Hà E“èñÄĥ\÷8‡ĠùĠqÌê”cxı1-ĥ”ú"MôÖÄ6¤İ…ĊvpĴƒ£]:˙JÂo:ŽÇħ"ÇO˜µé!Ç'ĥè”z&µİt¤ŭ˘ÖĵK!KE˜†¤ı#(˘LM-ÎĊqjÔ]:ǙŒÎe²ĥˆÊ\Ħİg>ûPK@7s(G0‚s üF ÏÁ¨m cÍO˙‰'bÓĈX›!ŜÎìVN!ž†ŠHƒ°) biôÚ ^Ğ"*˜#ôhFÓŬHn‡j3Úȸ ŒgÂħ‰‚/­m#a“"ŽW9°l™„­6ùĴLGp^ßċ°DË!qġ8.ާs‘lM†Ğ$Ú{Ħ–3Zl™¸­óÚ İyAkĦ9NfD6JË Qƒ×l^ˆ§1ÙZP9ñˆÂÍZLvğĜÛ ,Fšé ­­ VíáĝqtÒULƒóœNĈPúNĈßċEXÈúYˆkzŠßH6A/ JĥHÎa'ĝÌfµsäÖeà*g|H:ç8'‚ŻE:8œÒäën3Ò_ŭxĴ6›0ĵJĈú­v°ŽVqVíbGsĊcħ=:Ÿ„hÛĝ°·ñö‚V!)í"Çd…”£9"9í œ.Ùp€‘ñùíĊ!Ŝe´\…–˙Êë?|Š‹;Û-µ=ġ_ÙöĴΚH'˙MĜ ɐĥnœÑ 8yëŝĠ£:]ċÄŞMŽĤ1xšç™¨AP´„5ƒĉ%%ĤI|G–×TbàáYz\‘œuqn;&²>"ĝit›²ċ,İÒq(&-´‚šp4GRġ ]ôĈAgw‹èZ^" XĦYeş$Ï_t´ĈŽ–;£żÏ+á NÈ­KjÂUOêÖnèqy&5Hê2”ġ”êi§9˜àœÂ€ô}|i{{ à<â]WÇñĵë–Ä•:ÎrO…Ċ0\*W`bÈ-Š”˘9ÍȖhħu³nlˆ¸Î :wÑÑ;Z²Óü\Oĥ Y‹íK0Ġ2Ö šÍtté1ĥĤDWÂEmŭñ81dGĈùí_r:ÁZĠ13Ç6)É?×Ĝˆœ˙6Ĥ¨1—ÜŝĴЇé´È ]vá(>Ä*IÑiNèšk]œÇ–ìby°ŞMŽĈhzt<ד­‰l$RpcG=˜9@7tŽÂíCÛ9žcÓ˘M6kÇWó˙Ò<½ú9Ë9¨üĦ†ÒÑD$e4} P¤™Ž Œd4—àĞG&'.˘ò-™ÌÀ?ŽS…Í.<דmî<ÖqHNÓ3šŽUw‘ġœXÏvX8a4£öšs‹y„‘8k`ß\Rc.•Or/nċŻfàpÍÈB>YħÍâq8’štò;mċCİmr#’4àÀ²­jŜò9Î$ìháXĠÎëd›ÚÙ '۔žĤÛÄOÀܰíĈ\Ş”€àÈ}QĜĥbˆĝ9ċ8Ĉâ˅ GŜuï÷Ç$Ĝ6ġw$„Ä:µ×œÚħN2°èm6ÛĉH;‚šŒ H‰@[/ŬŞĥ|™ˆ|€RïıžlóƒÛŝŬŠnİ…&_cŽŽıÄûq‘Ħ˜†ÎQl£Dž@‚<œÛNˆĊú6ÁXÇÑi4”sä ÄʄİE5,<#ÇB° œZօ# äcŠ{Œ‚… ĥ‘Só –°\Ìoı„S-MäÀıžlËKâB‚ˆBĴbh%é`ŭá3÷Q˙dtÂÎn" °DħĜNrĉLÈqÄ&">ÒĈ9!cƒĥ‚E÷8“ĈôċH:€àĴóHáf îĤÁB%ÂG“WgeVµ%ë8ħ£cŸòqT{xœĠ2Ġ’#ÊħA×cg3ĉ@Ó4£ô|ÂXWu‚A·£€"é 4˜67<“‚Ċ}2œ¸Ê;ŸcЃY$LY[dJÎ9•Ü ħmF³ħE‰_bè² §;:ĠH "$Çı…pvò ŝ²EĜbAĠɄ-²'lÑXkU;§‹”Eœ4‘Ç:ó_kô”ĴL˜ĈŻbíeêGħ܀GŒ †¸.ÚVu⧝ĥ‘Œ¤ádlĞy9ÎÌ Poù„S…9pbV4EÖÎ×RŒääÔ1“ ħ bDÛ|FcEe<—Y>P¸_ÄÈrÁjÜB+A^’ÔFvtĝÚ^fò6%ħ‰#K!)-”*ĞéB.\û‰ ö´Ĝ•ÂŞ;#a…UXĠ–N8•Ĝф+t*ÁJÏ~³)"LÎo –†aĈ ĵ@gÓ@Èe„!‡èFç³ X_BPQ7Ĉ¸Ŝ„lÇߌmô£!İı³là³îEwŽÙÙdqÒ!ĴÀƒGTuMkš˜ĉrşKU[şq`"v4A#ŞS’NVĥŻÖRvQ/ï¤ŜN9#^5üÁ]è lJ<Ë3‚LÊ59ĦŬͽ1É<ÀNÎŞ)™²êĵĵtÉ'ĴꄨJ,‹.‰½yƒ­Ċš$)tL–ÑFƒHD=Jç8ÂŞ‚÷,ñʈżñÈ}?dn$¤‰²ĝÚğ—]+ĈċsŠmÒµ°5x™Ö^/aµ†XığM;cWGß´ÁUDıxA.Š/äEigTûÒf^zĥä–×ĥLÛX?¸ÑċzNé³OUáˆB“Ô™ÂÁV mâM²›V€v‘ˆ5èhĈŽ6|Xë˜0š'+ÓÚËĊvi&ëì6íŒÂ-…à|÷rSU\jÄcI*‚ûÇÎĤÎ%Ġżô%ŸplmŞğÁOL j[ù@šzˆĠNJRż{¤jHBSĞ‚ánl܁u‡ġŬÔĦÊÛğç+:š#L–…)á{“€—ġZ`‘ƒEwi°Ğgï6íŒ\‘ı°B4ċèIœÄMĵƒS::ĉĵoĞj׺¤şëXßĉ²OlÖ AŻB7˜ÚĉĥLŸqu+!ıÊÇ-ĥ‰O%ZĉFdĴ½FÂ@B *W0W˜ú Š8¤íž7ÌŽŽ+šçMWÖĊƒĵ4^|—˜öŞħÛÔ3N*ĝÄèc…(Jĥï IDATœTF//—_Қe‰'Ĵ@½žÇˆ0sS\QV¤T›‚1‹Öi‚ Fq!Ü biÊ<ìĉv˘;gv´nn9$Xàċ k ïB{ĠĜmÊKË舟šŒ½´êħO1Â9˘ö%Ġ[™ċp|Www A‹¸T­hĈ µû#·gá›8`ž˘O­ġ#¨IóM°¨ĥĊĦìëT×eì§˘šg—+×4ƒ.ş ŭT"fï6íŒe .X†§ĥċÇǵ!§ š.Żç%ĥÎ%ÍqéÉRO8ĥÖ·^êóXcs[Ĥόۗ,ôbıÊ^Q1žt Š’$!M½OĴ@Eژ4u–ˆpĥĥĥaC´Ÿ ‰,O(<óŠ1QĈˆ42ĤbĠ íÂ{bĉnÓÏX13’p ï˘Ĥ ĉ¨š—T{ú–Ë?ħ#eË ö°yµ …Ğ5Ò#)ÊĊEìĝmĉĤc PÇÙÚ´})pĝóX4-ġ KäĥŞpċš@Ŭ÷ÍŜmÊgë85%5÷ˆ¸ö%ĠZ ­5.ûÄv=aďÏ'qQxШW“Ŝâĝ‚Ĉtİfä†wrĉ)ĵ&İŞµ Žs  ĵĥ·èû<úqÒ8…Ò·1OíBpŝ…ğidùTÇĊžf—[¤ÂğM;cÙjj-¸‹95s„0?9í’êÍçñrNXı.[ÙÇnµJPc‚Z,*mÙU‚(xnRCàHÍc8´ZˆÊÙÑ!ˆ­²m­@ÇY~ä@•'Ÿ}X™à<ñħ5y<ä‚ğ˜½âİğM9#Ġ7ŠK ™òr†ÑsçÌSE³Br$—éĴK™wÍG,ŭÄ#7ALg׌&² d£‰ÌÄDÊH1…ßĜx@ƒob-:zÚ•Òu¸Ĵż‘Mñ§GKÖqVĞV…”5šyy²(Ż­¤q~N³‹)DžÌmònSÎOéEÈJOzìÖĦ-é8bö%Ġ];:N/„•]YKP“n95Qê)îĈ£Ĝ3‰œcóPByĴAĊ*½d޳òèhÎĊ˜q\>Žk}ÖY›l½TˆÓï"MEV§Şw›rF-=Wù·YŜìoQĈÖzHU#áü@΅[f^RŬµ½t]lfI'vÖ¤ĉö‰  !ÀŸġ&şŭ‘Ĥİĝbç¤#+ĵ†=ñ<§ IJ™ë´lL4'fŽcÒH—­,]TĞφŞÓàáÉâÌ+ʸÛÂ&ǒj"OıKlPıÈ‰ğM9£IóP§9 ÁbWNÀ8]İv”´‚üŽ˘ È÷Í÷­³LĤ^RŬµƒ‹œŠeœp|­;Aëeô ġóé’# ŸàÛôÈO¤NàIÈĴ™Íi I'ä~䌞 ħ €fĥ0Ĥ͉“w-Ĵ¤ÈIŠD·oŬŠ˘[ê}¸{ĵŜ§;ÚÍwl@…l#›uäڟN½‹M˙cg}ċnS΋ިÎbžY²Dİ͊ô6y^:|Á$ĥL½¤şk{-ÉrN8ĥvÓ+Ğğ£ KÉIŬOˆï”‚…F‹’ħgpmiv9 c§ÜšÍ~Òk“ÜM‹\fèò g2v´öꎤžĜáßN1:cħ2*ÑĵğĉÑúqĈw›rFk,“şf˜IÈÙŬsc_Ö½N‡hf … y¤­‰3.İîÚ½ôt'ĴZóôŻ7Lwè·ê™îŽg8ÒKž9ôi}iqŠâ¤†1,›j‹Z´[ò$ۀs$¤p²EEġ‡Ñ`¸?ˆúûÈŻŻäÉd€VbG':"Ï•Óö¨’SLP-/£ œn—˜ŬÊħžŠ'í6팒k ×u V6)]‡IH3t[äUè™Q¸ş˜qIu׺ÀĞr‹Ÿpl}‚ÎxşInĵôZĴ•ÒX߆?cµˆ‹›HNŸ1+é8`LÈĤ`a>›']óhĦ|àĵӑIü”&°{ĊïGƒ}ġŞ×`è××qju,ÛŞ&Ğ#´u}Œ Œ ëx$-èÔğ8ĦR<Wí6ċŒħTèROކo:Ӂ‹v–3ᚍ´5ħ`#špI5ׄuYd–#ħĵġÈ$•¤-)KĤ5‰bsÌ]ÈórŜNé4ÎÁdĦKİ ž;áêë2ûħWG‚Jğ9Îp8Pd£ŝĠ+òħ:B=Ž“çgb¨Œ0Às( 9·‚ŠŜ}(üD<èŝùa—ĉÙĊ€8{•w›|F˙!\8c·>˜xÔ§ş4e9ş×P݈Í}ˑœĠ—T- y2ÇYô„ċ5‡"ƒdc]̊ŞkX[²Œ2Î9~96YÎħ›7c£5-ŝàħña·Ö‡Ô•¤] 6~DĊ‰Äö#¤à8ûƒ`İgċÑÑ9À€Û^K¸@oô—7_ìħsÌ\ğĜ= {w›vĈօâ) gÓov÷‰;W돭ħK™w핯eÑVĴquaÚM^hy^ŭ¨:QkòŜÚ&\§Ĝ€ĉ¸@ŸÂ/n ÷?Q2Z´Ż´ùhàS(â²8Î꣣!r j‰o4K³Ì\”"žAt8 ġh¸$€LcntšÒ†€ê€,è(‚ÙöÑ(' )‚|}9Ntûvtpûà şuh"ny—”jJ%ß>vCN/ Mir#Mıi]rsVŭ7’ħŬĤœÏpBĤp*úßÜ à˘#MùŒiéx:buËE·%ñŞ/òí_¤a™^¤T~µ=ÁÎ.ígż'ú;uŬEîы uĉEÜĦ}ïŸĤ7œÁ5³-½†¨Ü †Šëô‡~}?ΙNq1‘)J„rB`)‰ħ}@†MsîRêLîŭÂnÓΘ–NQ~4ÎóĦŬëôŒ>2½qƒ¤“şÎäĊBKœ7n¤sş§ċ­İ‡.òċ_ä{qÖ8ùTlÇÑPĝÎûv;Ż“ÊóÒúĈiF!?XӔг7ì÷‡\kGQı˘î=4eìBŽH*f%ÒٝVµKzšöMçÛ}·J„³‚ENÎ#}5ë|ÂzÖ~uŻ:ߍSĊ4 ‡<‘ïtÄZs?Rbċpĥó~4 lĠéò"f[ójtZ½~§÷ç|RkE8êôLâŝşsœ!zj#¤óİ:]$o8Î 'Yo8ĞuáĝJR ȕ3†ëÍq|2ŝİËìÁĊĤĠ:NqV$Ş%kÂ+–´^Œ€vĊyöĠq<7ÄĈ[~IĥŽRq@TۃpĊuĠéŠlŭ†Ì^ttGmÂù¤ñœ Nâ4áÔ³Ş]uŝ*âÓʟ–Ċp28#²F`Àqs ÑqNA8ú9Ġ$œOŻĦġbÄ´ŝPİ8Àt‚z'qŝŠTƒÏƒ sœ%ĈĞ y¸N ħ£Ç.޳Âùdé7Éİŭ8´db6tçD5cĠ,ŸıZ!Şyî§eFH{T×ı‡ĉs_GTeë7g鄓~âxÎ"~œ`zö$ %ŝÔĉ8ŸŠjMp–gŽF“:$B„96:Îĵ„S¨k\“p>i6µ…ü8Š )Ż€ÒrĤs³\Mrž³ş)ŸŽtĥ"ÂA“áTF4§.Ğ™“p>i6µĊü89@÷ˆ|ÁÔX5'ıÓl,§|V‰jË3GĞ‹T˘ZùŞ`Uӑ#J!”#'[żá8Ë&œĈSÒ·÷Hö}ۗë­PòÙÎ'E4gU„Óĝq ú6É=q3ì,°UÍ[…U­CĦA˜zg#r'Ċ\4gnÂÉ?Î)'$fñQíXµ)~œ•.Jü „ ì£˘:ÙÓŠ˙4g,§ñ” ‡|"Èv˘}?Î`܏³â8úq0é΍p*D4gE„ÓĝqJVµ="Š›œÉ3È ĜÎɏÔ3ÜïhÌ[ÓDІĴFVkü8V5„¸Áìi­ëä}â7-2ħİV``‡Žs şİC9§ÔÓ!¸AôÙë@°Îġq²Ü˜h@ё˘€¤ÚpœĠNÇ)é8jx&Ÿ':ú D5 ÑzNYĦƒ9 Lı•†ĴŠp?NQÇAH5HU“ùZsBaó9äV€pËb$¨„@qĉ'œĵñÌŻ0ˆç €µ Ñíç`U“:r€ ” ˜gÇq&ÎċsœħŸŞE8|è)§ñ8ú6† ¸ÚpÍuÊş'„Ü ‡9@T#¤-!0a˜=Ž3‘r–ÌqĈYHmÂ)_aÇ9lj†”şdĞZU¨Ú"aİi/ı/9r@°_aħ£óy•:ÎDĤ³TŽ-H8sQNÇݰö÷Ş6 OĊq&xĠÄtzŽƒ&FuI”ĵĉ ŞV@iċôXµò+Ì6z³7)MPާ­jÊY*Çİâu Ç; á4~œ’…—Ò 0‚ <ǙœÊÑj6hÍÓ_rŽf›+’­ƒÈ"р EÀcŞèrĴj#ċĈÄA3aŸ¤_ߘÈĉg!óìŝ° §ñ¸sZŽq“`ċĊUpJŽ3ŝÉŽŽüÌËÑÓsÇNzâ@@Ç GÄĥÙ$?ÎĜ@q:mŬLä8µĜBċL~R•öİÖ;-áT˙\Ǚ“p‚á~F!NċŭĝtgüSžW$”ÓĉM:#‚NÜCÌŜ@Rä@˘Ë È‰§bTNä8Ó&ü* ìF^ŸrnÔĠògsfÂÉOM8Çŭ`G÷u¤ç\§fB¨!'/ÔÍ­O8È†p%ÔÑÑÑeAmœÌ`µ8ÎÂI§N­}'zXĤ͈ž£—ÍcŽTĝjNÇ8 g÷=z.ĞÚÜ ĦĠg@„AtµèÇÁÈà7#.Ĵ:Şâ8³&˙ı8N>ǙÂĉ&Û-jqœJ†3/áÌA9gl,Ò>ÔġqŠŽJTK|ŞH‚İŜ{CßD`=nuì+9NĊ°,Î6ópœùô–Z>Ÿ |7]+Âiü8EŸâMğäyÊXµ 7ŽUÍ Qâ™ËŞ;ÙCa¨#b]ŠĜ)Ì9ÓÂucĥ´´Çİb9s8K§sT3Żg*µ6~œ9dµÎpއˆèé/Ġ³ïK8‘ÑpÔÇĊ :ö•ù8³]*ĠƒwA§ǙJ7éé–ëÓÎ$ŞñÔ7f™öŻ#8½gbBèòà:ċSqD`#L­úJĞÚlŭĦĥŸ~Ž3cßéĈ‘ĠNmÊiü8c^Öp°HÎécĠĤDà, 2íŝT/9şĠÇ9N v2Ǚ‡-Ìâ8Óéf3Ğ>áL•nü8sH?Ĥ(8Oŭ0‚ìĉÀm“8~ü|.ĞÚi gŞÛ*oü8sè8ŝzâû‹sœĠK§~Ô7Î^ Ğ­œ`%ú ĞšW“ÔĥÂô5ißi2Ó\D“XÚ* §ñ8= Ša:òŝ ¤i€j¨ä ‡ĥZ ¨°ŞM’†nÌvA.9P“LˆVžċ"*0žıgJZ[Ǚc§Â8ÄtNiU{H'I2 °’˜j ÉVµı8ÎĴ¸çċê8c⚧ލA8ù ÂÉ?NíÁ‚~ƒ<Ĉzë8ıFˆ§úRİV 5‚g…U­ÇÉ-„˙ò"fsœñbġN=QR[)á4~œ’…—@×óÔÇ9#²î†”: Ì]­À‚Üħ8ĠCŭarœ|ÎÀëNŜĝqĉ°FNܤ\%ÇYÔ.~œħŸëj.GÀt&YĠêûHf$‰.׏Sh÷j”mjùâ„Ġ$œĈS²Ú߇êX!ÇY¸è€u 5. yRä@"HÇ9™hU›G2)It"éOÈgqœi„“Ŝ¨ĦâÔ7GğÇO4ĉ5~œşV5ŬĴXÇñĉË!˜`ìGŭ}D&$OŽUsDµÓĝq&ĈZLsÂY Ç)°ŽÜ›Ÿpê<ĤĈ3Ë V5mW[ħ޳Žƒ6 uµP]jàÇıħŞŝí$ĞÚ29NmÇ; Ǚ}ê²ÌU[TË&œĈXxŭˆ jÀyŝ*­j NÖ!tx]†şZ" ħ€U­.Ǚ7'ŸÉqĵy]D%ÂɗM8yÇݧ` >á-6‡ÎZ’Ċ ÇPµ¨WȘyħÛ"VµÜ[ÇİᘙE89Δ‹ı17Ŭx5 §ñ”ü8}r'bÀÚĜÑÉĴe AħĥüW34˜ıİV™Z'r ÷Şv^ˆÔ 8gFXè,ŽċÖeU|ÚĝqjZĠ†ĞߏöëÖ=fq uÉiŠr"tµiyšèè‚ô“/ǏS+ĝlá¤Ë'œì¨ñÔÓ·!÷“Ë| V‹íċùbVµĴCĈh.öĞ1R*7=)tĤU­Ĉ5‘)y“ šŜ˜gucŞÜU‡LWVfŽ·á4~œBOÚ>ŞEÈ_kìèÌÇ Ù!=́„ĝ̄XµÙ“ż<ÓÜ(v—zÊRMĊÊ+ĝTêœúԄ“×%œĵñÔ`8İOe5Um0ìĴwµ‚Bö€Î#ƒ9›8™Ğ6i°UŞÍܖyn˘2~cš kĈ5N?ób„Ġ!œĈS’~"’ÀĥîĠ 42˘D]בRÊ) ġ@5gh$“w:G™t"@ûĴâŜdQħáäġ 'oü85qĠPu€Â´k^ÇêĤ 9JT#?Eg Z]?ΧVÂtïİĞÔôĈĴ˜p?Ž3Üґ‹EG?ŽƒI¨ä(Ú LäÏ­ŽU›@9ĞŞsJĵÇİáĊœA8uĞ´5~œZPŠUƒĜApĵŜ‡Œĉpä@&[ĠŞŬ|+Џ-~ĈÉ'?-áäsNŜĝqêŒEÊ ˆµġĥŞA}ä7TÓ'ԘħĠ.šŞÓ§%o6á4~œâXÜ%‡r@‡ŝZë8Yg¨ ²•ḱ”l‚ 6U§OE7³ §ñ”,ĵĥS)EgXµ‡äÇÁ¸è>’O?ÔĠ ÔĊŽäĞZqjÎ Êiü8%j¸ĵ{yçòÎî.ĵvwv—\tɄƒùŸ`Rjטê)iĠ ޳ Âiü8nOï1wċŞk€.jŽĈÌi,#?ĥĠ t}ÙpœĠNÇqĈânÂٓ@2Ñβk€Úô^SÀ>œŠ¨:짅¨TÈÇ1Ġ Ĥd€6§†1ş&á4~‡pr5_cñLġw¸ğ‚ú8ıçŽS˙ó˘ZÈx<_÷“AèV+   ²ÑqNM8Ó)§ñŒ¸ Dí¤>Nñ˙ôé)ĜÎC äĈ O]­ÀHjqcU;­¤6“p?N‘pÒÛzıu+Ú]A "áx,sé8‘ıšÈ\âĠŽĞÚb„3•r?N™phÙáġ j€ÒŠŝœòÓ§ä80ŞaüsŸE5’8ĞÚd‚Xp?NaĝwúT;BÖú‘żgìuZŽƒ`ëœĦtœœ#¨RA<9VíכԤ›İ”ÓĝqJú6ó›â9——­è GS–M[ĠNE8Ħ.€…xVĤZ`kZcU[&áägş9şàÇYQ %ùqˆjç?éï+ö¨1İ#nĴjá˜Á?“nô”V>[ǙáÇ1ħĊÑÎñòk€.oI1u×B9 „q}6VµI §B[kü8Óü8äċpW èò8N@Ĝo3p"bLœnbĠĤN5Ġ'œĈS2GÇàĈ%§ŒxX„Ù¨8ĈĴ…ĥZוjĴj“ 'ŻO8ˆÖ§ŠˆxK @x2r âëj8Ž?¤$ˆ–ôё † Ċ6Vµ²ŽSEc˘Z½B§‚lá²}tÚȁ‡Ċq "!㪠9 â&Vm²UmKÇ'q|i[ŭAçzsœ ĞìSÜ@¨óq0ÈSÈĈŞĥZÂiü8eĞšu[ۗZĠ֜*Ô@cG;‘"ŽEcU[1á4~œ2ljÄÚÖÖ[ÇÉ hŸrĵİ"E$֞ŜXĠVI8§Ìq@6^s'U‘ĴúûĤ"› |!ĞÚC œĈSâ8:l½uœ$¨X"Y ħx‰IġßXĠVH8§‚`tñQĵb޳hĠéĴƒ^Bğ&ìhŠñUíĈê–ĈSâ8·#ĝ‹nŬ:ĵµZçôѝĈŞ6  X=°päÀĝrÁ‹o4K³Ì\!œÂryĠ:Îb,§ƒAjû”Žƒ(7àÇÙm–f™c p ƒ9—ÒY8JMòz•5@so1Y-ÍŭU•'x9P ŜMj,işŒ]jï5˙óïGœ¤+XN`™ûZÖvٍ‘“H\{Ë#„ ˀ§ç8uj€.Äq°ŞqBŽFòDŽVύáȸYVĥÈs½‹@°´DXmiŻÎû°0ÌnïrċL)tÜÊúê8dUì£û³?0‘ğ‰0‹ÂͲô%ŝ„ĴE´!.ßWûXŜ+ËĤ}ŽvÜqf4‹ägĵ‡+´Ş-B9Yg°•öÀj"vsŠîŜ’èŠÒ_›E-añíô‹!ôç{ " Ĉ×ï#5ô# ҇leÊçÁĈĠĉÖ.á•ÇVR[ëX5Ĵ“Ä>óAŽÓÚ%´Ž­­-uÑÑm°œ ùÄ|Z|ç|‹[ğ˜BŒ£Ğİ1 0ú3”ÚÇq…ƒ çgM0FP[ûèè!KĤW(ċÒö–GbxĦ DäÇ1:NNĜĥÔ=U­ÒH>‘èb€ ?/Áŭ °IcEĈßì£!o:VÁP ·ú¤v€](`ĤĉÜÚĠlLJ'&]1Ä·ÙgÉÓpœÔĜ5¤hĴjÚá'ô›Akl5LÖDzŸ˜ —D3‰U †ìiz7xßbğnĜCôâÄ䯯U Mħftœ\W+8NC8ÖU.…4o$5 /|éA—ĈÜgƒy^օœ†D:–ĜHr×d|ë22Y]W?ŽSò›׍‘D·nßĉo0DÍAD·é‚ßO˘ħOçu}ë şuE;ûTaİOŒNŸ-g}2ĥED+ƒŸÀj>{˜G# ŝPÇšŽÖ]ÇIBäĤäԍ†!cG— .4 £ïRY×Ĥcœ^ÙŬÙÙíĝŻ^aàw?}\ĞWÇġŽ[à£KğÁ×À ħ8É VîVµÄê˙IŸ& vtb üÖü™XA˜Ÿ8'k§O IĜ/f-ù˙è¤ŝĜ1,Ȃ…DŸ+ħ]Ó 4ÄôOòèömĠipñ¤H·I–'i’fżîƒ‘@·Pí˘S÷ÀĞwó ×üáœĴSsŬiÎċ4ÒPı#òuĠiJcv_4‚šî‹8fİbyzu^Öĉş‡dVy,NRÉuUü,œs‚’ĵUf€z‹Èĝ1 ×ÎÍuÔğc üġf6ĤCÖD>-ŭŬßá/ĉ-ôAž›µÎ-ˆu~„ÔĊtéhgK\‘OĦżĊ-t€·ê ûL@‚ ›}9êĴp?¤÷_÷?“&ï:żŝtp†04Ÿ(OߊÖ}­WÜaıs|³2Ŭċ;PelÀï„kà›8‘BG¤%Œ›ÖŻŭ³ÔYZ5ĥÔ^ÖÙŞ–Ĥŝpâ@h"›Z,:&üû(ÈNÛarSLnJü™?ú0ŝñçœg’Ĥ½K0c1Ó-HU×öÔİéĞímgĴqœŭ,Jİ96Quèä¤ñ–µEòŽƒäÌĠ‘DA ‚Ê\rQé]Éşô€“ŞV|a>éXup>á(ġ §œ3p@áWù/E>Ñ?ı µŜİ;È;ŒùFÖaí|–c°…ĥ¸êÉİIċ@ĜµÎÇñı2 "ßTV‹WÏS'Aˆħwµ„Ĝ=yU+½ûùÄc Ÿt7ñœĝ£ċ?g{Ïġëׯ]½zċÊċKúÁ“cĈOŞċ IDATĠŜi;`üĴŜĦêìñşb ¸xE}ÔÇU‡Ž™&A2Ĵ5ÇIƒˆBW zÄÔÇQî]E„Hú Z>şçsŸûìoŭÖo=ÂÖ!ĜŒ'9·n´Ú­6f¨ĊqèóFKµšíh‚ r²İÄp܆°GÇQm^żG­p…¨a.÷,šI;á§Ĝ码hpùßÓuñR^ïŭêċ­â3–O{"Nt›ŬĦêìáy³eŠ9d°ş'\X5ÈYâƒh?BuŒˆcÔÏ–.[ßÉçĝ­_ŝôŻżüğżûıßâ8adI°ƒúÒj…ŭA?Ĝh´u6´6쇭oGVLҎ¤Â–ínmŭgŸ•ì “Ï>Û7çìĝâ5ħÌ˙Hĝğ%kWĜ;ĝµ³$Ï>ĵÒŒÜvp×Gˆ/(ŻŜƒşóÊ?Ŭm餳ók§á0VB•†—5×ÒpFÖ=‡ĞN£q- LĠi­î…#¸lÎwŸûê/úġ/}öSüĈo|îS´‰ĤŃŬ¸öÚ;÷ïżùĉ{×,ċ¨ÉÓG7E÷ßı˙ĉ=ĠfûVXĜaÚÏF|œéfjğì³ÚÛĤÇ3hŽÏXΞ&ánêxğ%˘ċ ş1`Ĵ7VÛ³ĞŽmĵÀĝú‡JÜÍÒĴ{ûɂ–`Şĵ3zrüEœ\Š)g×2sMşÛ ^˸¸1fOñ¸ż³"5°JíY÷ „İ û ħ£uñâĠû¨Œ'ì6ŝ˘˘›˙ò(ÊiŸz6ŽÈÀúHëÚk}tïÍ×ïĵ~_QŽSN¨­Ğo m/ß9ŞâèqÒqZW>zïŜ=Ġ6˘6òσ׏IĴCuCöÍóèĝGµ´5ƒ`Ícŭ$oĦ¨&Ž虧r]&½mĵ@ĠvŭR{"zÒDĨĠ;âßàñĉÑú߀"}>ÚÒ g̳΁<ĥ¨¤&&m[o' 0£ Bĝ‘½‰ċüš: CQ‚Ú·~ù­/} ĠZġĤ(G}cfI²ġöÇ|˙ġ;/~˙ġw6b¤ĤN%ŭÉÖÑ{Ĝöò÷^ŝ¨5ÂÁ)İ-íŸ}ñÇ÷ŜTmŻżŬ6‘ċĜĉéÓà˙ú"‰,›ġîĤèêfg¸Ĉݰâfj†vŻßżvé8Ž×$mì^żĥÛv8NxL‹xçß  ĤNĵüo|c´Cœ<žxöXïpnLѧÔĤeÈ­3ÇÉ:˜ÇF…§ŞÓpÍ~jĤN~À_|ïŻżô¨5Ĝ?mş/9j…oß˙ĝ½{Żĵüâs/ÜéĥÌÍûêàV8:ùĝ½÷^ıóâ ßğn˜Qm˘¨îßż£Ú^¸ĥ°żFÜÖÖÓ矖"^K–N8yÁ}ë2’wÊżÙÓż—ŜîW/?ĉ‘òv6§½ßA#Ú}¤ tĉŽqeàÀ)aÇpò g܃ÖPR‹—.İĊâsŞHG§kĞZ‚ƒĈµġ'Ħĝâ/żġċ}ÂUìÓÄĴ˜Êà£{÷ß{S˙gŸ½óR›;o„ŝ˜Öà{÷îAÛsŞ äħ˘]„‰Ä6%İéÚ0BV°­µÑjµu9ʖN8(–¤;‹ĵ™zŝë{ŝ·żâò& Çé}˜%Ir"ìK‡Q ˘Ô`ġïĈÇ>ò\{vXKÄĉW<µyÔFòtg”‚'ŸġĈ£Ħ…Á2‘9:1báXĠŭ­Ï~öĞ?U’Ú£ŭô÷^j!áIy„Ş€jÒÀĥU›ĥœ…‰|Ü ÔÖĉîDŽ{¤Óˆöµ£Ñ½û{£k-ŠFE Ž#ĥPBĜ’`U;&-D`î^ê½ü í—^ê½ñL‹Ì~WÁ8z1&ş%]y°F ïŒXPƒ›Eċş_éìÙĝ<8úyx­jZġZŽ j#×7JǕ] A ·­ċfñ w+ŭ&r דĜÖċ£_üê׿úċo}é ŞħëġkÓ¤Â;ȸĵó2ÑĈמ{½ğAÙˆŬˍŜ‹ş tèž´Ş)˘ ßÔÇ=Ğt#ä(FÇ!I­uġèŝ}k“S˘Zx”Ĵ€0ĝ@KîH}ç{é€Ĵo<ĝĠğŜ??ƒGÄWOn„t9 6‹:°İ)¤5Òüȏ#ܳ˙‡Ÿ˙àw0 òÁƒ·ŜRgW;Œhò΍‹3]  àM½¸‰żĦ`­6ž˜1Çwè&½Pl)oÂÚÖı¨ÜaH(‡#0VĉÄëèß|ô‹ż÷uE7İıspċúÈsŒ4Ż(àg/ż Ä­§żöôߍZ"ĥ\E½µ~v۞ŝڋ÷[S8Ĝ"Eûµ;|Ü÷Fñc0â˜tâÛퟁ½î•?}ñ…;ïmÀ3 üxqŒáïR hr¨…äÌÇÁÎìÁùÖÍ&Ž#ÄU%˘ŭJ öuD ümĊİ5£V² OÒì‰3ê~ÌŭŠg˙·?üÎoƒCéWŜ}Öo)ÂáĜƒuÊ}”É)8+ÖUSj$~’}t|9ħàPĞÍ]´(Ç ¨ĝt`#ÔàöÖazë5‚—Ĉ„Ëán’z'g£İÒÁ0zÇò‹i£ÔÀo‹YĠfg€.X4Ë}Jŝlĥo#Xˆ`†"Q‡}ä _x’Zû—˙Ŭ­';·cS•ÂôÜşúÎĊt^/hġ˙öXÛŜ r@U½üò÷^¸óQ¨Úb֏À0~¨uím:_8üìÖ$HR=p-cŭ”F§á„˜N§”2[ùÉĜžĊ}Iħ°gċ i ĝ"ֆƒ`Ä05:~ŠK~äu·[½ßĉċÇŻlµŒ4Í­vÒÏ^ [íí?ëmĉéXµġ@çl‘ˆ Ç˙;Bˆ’˜W~lj²{̵VlU[TTK_1š=.Y24˜ T×óƒ’]h\Ù~òy&şÇÒ% +›ĵ-âğr³Ċ`€ß6D@Khë·´ƒ=ĊYI˙ÁöW  Í3PàFE·†7_úÓ;úŭŻ=‹v7°ŞuV`ŽNtTΟnä€úÔMĵìWŜWñ›W_}†9Ž”Wċğ0Ò_ $˜ÄTğj~\3jœovPÌs JÇ96f·ŝ#ŝĞċŝŒ:ŽêxáêÉgĥF—Š":.c½Qhršñ’Ċ³^ñú[Ġ”Žƒ…HR3˜…û'…ÈĦMŒjDxŝöÎ%’Fu0Iż/EKQΆñĠ°Q™ħìÚÛWn²ÔO }˜ò2µÀqmšÖÎ!ĥÂ7_|íĠ_{Žb‚•ĝqK'(2îjн¤˙@IRï"Gŝċ›9 üüŭ·Ô†]OòôWżz÷} ˘ßњ_œ >ƒş -d0ħj"?üÁ~ïüĊ˙ĝŸ˙üç[ŭŬüË7[ %qírÂ!?³µ ‰*Ž ^ iîÂR‹C=ä˙‹?Ô87şşZñċ†6jÒ\ìèÜç2Àŭĉ2ˆ À€4Š–½í'[$ÀižErB7‘@­ĞÇO‘İJœèX5:8‰âZ¤˙¤Fn˙L jÏ=v·“˜ Vfp"vX A¸èeŜKß÷-à7ġWÏĵúÍK”7ùïòŸ/˙gµ|ċƒ,{à­7ˆpˆQǤ` §yĊäE‡99ħšïüà/ŝâ\PŬĵú£o~šĴj‚E£³\Ĉ œôhçmäŒġBµµ+żFRšO–Ë€˜ĴİOĴ}œÎ€ë7Ş$ħžNBcUC›Ù/<ùñÇ9âY´â+@Vİ–Ä=ĊuUġÁĴÌmΑÔ&0Ŭ…œƒ`wğúÎËßcğÛ<•ĝqrá 9ÓT‡ú/ŭĠû8´˙êŻĵ}ó7ê8:êŞLÁ öĝ?úf(‚ü80Ϙ!…ÒíŽċäâïÇñˆìŝċG?R„#¨_kˆ<+~ˆ¤JRùp$\Àg­İL=ġ¸¤&ŝ—ë^4†„…Lµïü@\à$Ħ/öĵŝ5`8ħı!–¤4mžG䭍í+½ĥċ*žĤPŭo~ó7c}c”jŭ˙°‘à?İċ7…ŠT˘ŝŽ‘bQÖq`œ(É÷˙ĝ=ïÓ[—Ô™a³ ĉägg‡>˘;˘‘0ԙJt9…~Û aJ­WCl c´ĥże ˜8V5Ĵ…Élƒh Ğ$4||“˜i#bñ6ği²Ñġa°àr­ËHkìS2YVdf+ôˆĜx§Ùb§ĝÑcWd°ô²¸:ġŭ¸¨ËöDÂݐñۚ¸ß†’/  [ 6н”À!)قl%ÀrÉwœ\ÈoŠD9膷ß~;~[ ƒ6°ċbÎd™B’SCĝĦ1ûÑY0C’NhN;)bTÌoR•NŽ— ¸^sÌĴ< ‚À9@weôärÂìÛ?QĴ¨e²<&79Òä!µSĈž´$epGĞĉĝ…C="˜ÔušÚeŽ7ĈÂ6ƒ°Œö‚ÔθħÎ_âPT5N:³+ċ·R`…6I!,Ż•Ĉk@ğħN}xë˜Ĉbĵ f­áQÛ2kIs•ÎÍĜt“6½Y۝6PšDžuç8‘.Úh9Nà…AÇaéCÁêsAH€ÛŽÍĦv(’àÙùĠŜŻÚ@Ç Ò6·#h7~öġC³ĞŻw ôt) Öí‡XoéıŽÈ`²ÙÎşMĝU¸x|WÔA$vŻÊóİ‹S;u³ÚĞ#ıÛ°ğ° ŸA:?Àx£ĝÙg€ûÎpĤ$ ÀŠ_z֓Î6œĠŽc´µIİŬ}$â鿑ċXş6é‚!ğ€ŸğÖ¸j`=à~d0 ˘FeT# Ŝ³T‡ÈÁ‡“”?AÜĈ˜ÓħzZ°0W’óဌN‘Ĥĉĵİğ†s¤|2nIġf@3[Ŝ+Iħì–+V³żĠĊ3Ü3ħWi.šn9§k†ORÛ-şĜíaÏNŬ˜P÷6¨˙œû˙aŻìîܔž$>Âw‚Ŭ³œáfĴÖĈ7—RŸ*¸áÑt°és=Ô떗ño÷òzg€†Cb8ucòq@Š3✁wLSö™=qS ÀeÁĈq?çt Ä?ğsî|O żgRóÓly݉‚láŽġġVu ƒÂQ)]¨ıY\ÛN+;ÔrĵŒ4_£úŝÒŞÒ↉w‘L¸}:p·0 í8VmÁ2ĴšK7{Ğĉ{izšÎµeÊĉŸ„ej˙$Í éÌn<‡ŭ”ä§3úğİ#<ßŜ]qtôbQžÚC\' sà“1ĵÏl$ŸÌébĠş›8Ñîšg€ċì!×X́fi–‡ìĉT¤Íœ qœZ5@ċ>ë8{CÈuuœfi–‡ÌqHTÛb\ğUg€.0ÊÓ4ë âɇ°£ŭ†pšċĴçxk{ H%Zg'AŽٟP—mOg€6§YÎJlj·ĥĥ/m™ ܵµŞ( †ûĊ fi–‡O8yo_Úş´µµ%utú ŭ8‹Ž°Ñ=€Vµ†4ËÙqħu,Äĥ8ZwĞVdO„Ö~œĉ)6ËÙpˆï9‚ĝ¸Ġê8 ƒuÊÍ0bäSuşYšċ 8ށ‘ĞÖqXBıÁ¤ì4~œf9KŽcPŽ‚޳Ĝ‚(7¨á JħjÍrΗnğ{Î'½Ŭ‚$ÜÌÀ=^˙ ’³GV5Îm–óDŬvğ}Îg·…+×ċ†*²q¨Ú ñ|‚ĝM'ÊÎáûàO>ëŽr!”'lß7U§›qwî†nû|Ñ büQ Ö¤ Öċ&Rm"SuşYÎ÷’%IvŜH=ˆÄ<Œ `àŻĜ³ q˘;À‘vÂ&rà“sÎŬ8‰ûŠ(Y͗+V°àĊ‚M sÙà˘ŭ&r YÎJRKÂ)f@ħ“ŝj#–àU|q˜£"Ÿ°‰h–38>Zx)vr…+Žö ı á˘£ĠЉh–³ĠÍğŭAgÍcĠPĴÄhŽŽn"šċl Â)‹ö‘ñk Ħô s ‰h–3Òq²&¨ċ,ĤĴ:¨|¸%€Catt9,g§ sÌĵáZ×Í|FTsk€6§YÎDlj`,rìä 8^k”?"ÊÑÑÑMä@³œ™ŽƒîO Ô·ċZ#yĠa˘£›Èf9+Âñ!rÈ&êƒt½óq|,j££›Èf9+Q ż z!.­7v4ĉ lttcUk–3#œKfU-òİ Ùzrœĵ£Ô8:ş‰h–³"ÄżÀĝFü5Ż ıHèC§êtó›ċ,r”ê tŭ‹‰­q>–ÇĦB Ĥêtó›ċ 'B°%JÊŽ#×s äò8¨‘ÙŞÓͲŒċ@ŭok– „0ĵFô;ëž:äT6Èğ ›È…ƒ¤D1ż.?ĉŸ  íKÑ˘ôĴħ'ú8{”ǁİûA9°´‘Ó=èöşŬÈöµÚĤ68›ÖšW.´PHğ;ßÍRÄ1pôa Ö84MŞS„>ˆšÈċÍI½vŻFOx gàƒƒŒ'³iÙS<.Ž”¸ÈÏ,4eg‡­M¸÷ƒùH2Œ?Ş~ƒr­j ÚÎuÈM.ĥ‰XR×ĥ[›ßn#ƒI"¤™v 6­âħözô<Í'ŬŜżÓmw𠐝şWĵùq–sĈˆ|(r6`§â°³Îòq€IŞl0–¨<&›0íŞ‰7äïŠİMj[odÚ’tĉù~ùôDß^„ş³ÌÏ·ĈñĵÀ‰×Ġé#ú?! ‚x­1ÈŞ†f Œh0–5–“èùĥ˘“M‚‰ŜÔÈŝnš¤Ë/- üm3J€2iFO`ÒONM†Š O݉emuwĦrŭĝe"qWï¤y9Ӄ‰ÊĴ;Ç0( šÈ%òœ=w‚ͲŽúĤÉ ìj üR˘†j~XNöüĉçnùäİî;SÌĤ—V™ââ‰Ŭ 3Ĝ˙‘VşWžşX—#ĉeApĴZ9°,a d³ĥ™ğ³¨½Ù^ÖŞÄÀMà/ ŠkêçíV/ÑFƒúöšû“…PÙ²lSŭöAäš-ĝ:#`Á­lÒX„g} .Äqje€.Èq† ċ‰ÖŒs`™„£&W˜ĝ7éûOsÛÊjíġ@ÍñJR,´‹Œĉo’””€XSİRzï™ŞŸ]Dœ„ï2cIş]2ZtAùĤۛ({ :Xњë8Éñ†u½Ä iû]5öp(§ÑüwÍŭ3@·I˘vënêĤ˜Q+ŞEĦŬvĞÍġ³S ÚáŠÂ†ßh™Èo˙bˆžx Y[sĞZ@ |§O~œ&r`I§‡* ġ·5šÎWJ\Fİ œ!UÌ­îFiáJí))•ŸfµSĊ&*[‘ê°Z°yħŬilŠe2 (ÙÎŝšGGCò9ïĝMäÀ-] ꃨD,Gé8I½oEš˘ ĜġC…:êq)´> Ÿ’Œ•8lݵyHÑ>äšIŒ‹ĤÛS)BŬnŻ]aIƒ@JuzĝÔQ„MäÀ2mj\€û†¤ŭ,lğSíÁADß#˜›²À…]€&­ĴKŽ™ZżEğjĠDÇdèuU³üAÔ£É>áu~pˆ6żîÁÁ!R·ׇEmŝ€ĵĥZmQŸˆ–fŞ8w•:ö…ĴĠîŜ…3÷Ú ­%I–ħò”uÚċàÀ€aH£uç8ûĞ6ÄZ  ĉÀòE ›Šp’MHôüŠ‘F˘šâAŞéµL a˜úğa³ž7&Qʍñá A΍kµµ—àÀoáï·ÙÜaÒN.KĊ Pa ÛŬN„Ùċ˜‡.^èŒ 4µO”eÙ!ÑPˆŭĦ펕ÔE•]Mf#S^eÇkÌq2ŞI׊A9°´)İ…“u–D›Äs"ġ†.Ğàá'£ħ‹JÁĤvŝЉ8‹à{ĞnUµ ŒŬÌÛÀ8Mì‡ÍÓ Fàİ4D'ŝ=µé$@PĝĞ1™(KÀAÈxĦÔ4°Ùš!<&dá£Ğê Á‚?4sĴ{êr”›tJŜ˘UǢt½9N’hĈ bĤZÁğv“Ĥö #Ú]'ÓL œä0cŬ'eg:뛨´6ĠÀëÑ`ŬĴQVí@‘B–P„XB1 Àİd9› `!ÙDÎC<Ĵk~‘£BĈšl:Ìà:{ÙĦŬ,T;GL²ˆN3•áOÊrŒriQô„şĵžRûÊħŠìQR% Ü ;k VQöšjK[`ÚÇ é@ ÇnaĵV’€úÜEíXxÛa>x~ÔêCd¤aÏĝ)P€‡dÈ Úd!#ĥêS‰ÛBbÀˆ×ÍFì˘éŸ>&À­€q(E¨ĞÁï‚<™d(WÎ`8 œ”‰¤.*ùnğ)ŬFÑS—n%½Û*XCU„è[\sÇÇZ$Èıêt9° NġôÜ|ĜmƒúÒcŬĉö<ûjÍS½"•Œ‚›ż›† é Ôú햚˜g™£S-ë%ʃ<§›n—EĈ œ6AKFÖ%ġäÈOÓ*NvHğ¨ëP]Ž”†À5Ò¤ÛÖħw“`™–+@5d0gĉ™öôoċ Eħ€wd ŭ`Ŭ­j@Ŝ{ŠKm"–D~֛’g„•|@ÑÙo0–ħDaLV›fN–CT 9k³ġ|›N”°>÷ ĴU ÷#ÄàÙ&fħ¨%JpVW?ÙÉPŸi 5’ÎŬ„ìÒ­Íŭ„ĝ¤Ċ(qĥf`3SפxKš2BgPğlB}ê€cr|{ˆĴ';LÚS²'6ğÑv²C{ÁèÂŭ-II·£Âż"ìÀŜšc$şGe@£Á ÁXŠa 9|swżġˆb5X˘\;u ”+ÚïE`ŒĤUŞVw“4͒ğcĵ`N&K’ğÏOG*PĒAšv#^[$Šk)ŞìFä‡ĵû|¤ìn§G #‰ µ9‹Ûƒv ¤Ŝ!ŒìTï£ŜaĈ $CCŬN3£ÇL‹£ƒ“ïġ6ŸÇÙ£·§N™gg„ÎßTÇ܅FcUëcĵ úŭġΠɢ6Dȁ&r` ‚ZŞFĜ5??€F³•?f0‚…¤DiŠO<Ͳ=íê(Ŝ/µ^ġŭŽÓŭġpڌD˙ï‡ä>UäôÍnYfNï)¸™JSĜċ@_(™”Ġ†ò.LÓŻ .ƒÎìô÷Aq/ÇÙ§J†T”-\ë PŞ‚äÊ#y6‘Ëá:üŞ´d&İŭ¨Çk9ÀIÁ„ì´v{V6ZaxĤYq„Ĥċ“ĤzÂ×[8@!Aóıı m+ˆÒŸ6ç§^oL´ëši0 |›Ÿ j­uœ4ä!şŜWL§‰XβT4aġ²ù߇eû•*ԞÉçW°>sëZG³UMq„TĴœaÔDĴï˘Xçu³ĥQ;[*9*côéD€ħŝġqúTk0l0֎wa„óóYĥV„ġzÉÒ/ cúCRşWŒĞĥ„‹¤‚=ŞLâ7‘ëg£ŭ9J×í˘V31>:Z½Ž³ĝĊŒÔ‹Éw&r`í–u, ²ŝ).8 y`½ĞN§ÀŽŽXÏi"֕íüZÜeBm°pœp­3@’Óqö³ÁXOEç×&}ŒŠÖlg½3@!ϛlÔD4ËYɤPĞiŝŞĥĈٔ°êcĴ°§ÑqšċL8@oÀpµáZ[ĠÒĵ3``”/›jÍrv”€Óçdä5ÇUËBĦrżĞÖD4ËÙÈj>WĝP˙?éŻ;ʍ˘òŸ Ğ£§‰h–3Y²ĈĦtĥášûq| ™=LöŽ §ÑqšċĴ'Ôġŭ•Wö XKÂá>1H0 vt9,gC8>a˙3 Ĉj££=ü_DTcí†lMä@³œĦŽC•hÑÄ;Xytôb,°£Ê â›Èf9K)ĵħ“ FG×É]ˆp²â!8|Oƒ&r YΐpÂĞÁĠV]t1Ž“uĞ—bı£&r YÎpé Ö@?"ñgĠ  N€E>(´Áh–³\q ñöW½0á$è 9Š́f9³%ëP:·âzGG£‡£Q‡œÚD4ËÙNÀÈфĵŻuä@ˆ)wċÙT+h–³ZÒTMâ}p}˘Ò½·ŜÑÑP­.v@•°ö;ç;rà çĥ'Sô)³Ù'à˜ġÎÇĞ9ĉAë2ë9pı …÷Öê’ğSÊ3Ĵg·vİD|7QŸ6ıa}ĊmúÑêĞ,NĉŽŒ†O%ŞĠŒh?œßmwñŬnÏ( ×Û ç½.<ç ŬžXĠĉ ÛîÍşŸS1 쭃ù.ħx…Ŭĥ³D§xTÉ„HžˆMZŽŻtœx]9N‚ĦÜŒHje½È¨Ŭ^*éTÏnT÷Ğí"˙OP+{ àö×Ú"c´ŝŞRjT9½f5é9İĴQo÷.wĞ{…Xd Dˆ›6ߎڛóŜTİĴ y2ô  á>@¨·½ fäÔ[™=!u˙–’Ÿxy˘K°œ$–dn·'V¤ÉaŞŻ Ŭ@MçKX–Ĵâ˘ı>[´üŸDbŬĴ7ëc5Ïĥ.`XPëR*z§='OLşX—`žc°‚eRI`ú'z@‡XTĴuĠi*8è"u#°¨ċl9h™}‘+!¸ K6oĥ“d:W’<Ï`ĤJIƒr4­žE2/_k´|hÎ;énkZ "ñBġéÂBĦO uĜò ›“dY"j ŠÂc/^nb ËǑëŒĞRïC¤z‘PŽeöµ%L8·g´dIE]˜.;IiŽĈÈî´8áħeXfoú$ٛWŻ"½:£)ƒİ<É&ß.WÁ\â҃žXmĤ–n‚²XR„ÂblT…'…­9: *äFíö|hÒpˆ+% ÇAˆ?ÌóÖɍÈEı™eU˲NÖ N·Î„•%—¨XsëMÑpy$#kêNŸ”Ö+’z†;¸ĉpÚÍ>‚21ŸàaB´(г˙8}ew[íM!µIkš(ġíîĵGuDA-J},§ġ1€yí3@ÑĤĝуúĠ ²hĈÔÒŭ#GTû£ZCkxcò'şĤò¤‘Ì\ '‹tŠE´7IŸÍDŒÜêEµèkÚܛAi³jŽspjŠ&ŬŠsÖádP›•ĊÈì¸Áa-c˜â3dʐëÖt˘=¨z¸ÇÁD6˜ÄÑVµâX5Ï[pöÉú‡ñu#²pßîŝQqİ%Ŝ`qċ`ŒïİgNĠyÂË@\Βĵ`>€˙ƒézÙXâ&?aÎt…\Ế™%•Bc×è`PB·U}pZ£ VìL˜fkP_VĊq¨huûÀT‘J£AALÌOd],Ĉ‹;›–hŞ„Úħğ˞/<“Üô‚.Ug€.Vꃐ<ɏ³Ħܵ"”~;ĠÀR"œN­‡ßVœ`24‘92²š/a,t{ŬÑd˘Ş òĈŬ҅Óŝ‘z3 ÛßQb?'äĦHC˜×ĞÙç{†JŜ–XgVX‡ ½`­ĈK9–P)Q4TĠ1×ÇÉĈċS*:)ò×wÚ"ĵóä04†¸ƒ^ŻÛĥ7ӅÂíŬ ‡á†¤’,Dë.y•Äĥêèè §ƒžZ WŞÓ‹F¤átkNš›í*İ9NĠ,šġbêCèĠU>àÙp“j#OO‘yeĵżë‰h}‹ŞâL§hçĤPHí²£+Á³ti"‹ċĦğî#QÇYs@ŬB¤)ĉëġ•(–\ƒ†“8Î˙ÏŜÛĞHlë˘9Eƒ4X\o½É4ë ÖœWhcÁ´Û*§@Ǒ8Î5De´q´Êi­`;;É5”΁ìélş9+"òÄĝĈˆPè'Ğò§²:kîRWW)•R(~ÇŒ„êŒç¨Ž4 Uëı&˙ĵ[HE*'Az’ğŞ:œ…td3-à”pŸhĠf ŻžTniAyèà ‘íı,˜Š£%î6TĤ ŽNu5L¨ŭ[„ı2ÊQŒôŜ  îNċh=-oRí€;D6O ”XÜqzhĦR5“( ġ°§½2R vayÍ+(s³€vSÉĝı´ OP5tÉĤ‚ĈÂżÑġY àŸX׳€2”êĴÜÑa€žĊ(—ĠŭŠáċĦ9´@aŝ}Àr8S:ˆ…zZ;ñžX‚kLw|§, ¤K¨‘Vb4,WÔ2"³Òq/Q‰¨£†Š%…LvHĊjqÔħ?ˆĞ%šİĝSĞ.~Í,]ö5EİĦÓ  Ò×Pë5=Fjn騵g0˜–‰%Ô HlvÇ5Ï­!°kxĴP[fšŝH2· 2w³ Ím QjŞ~O×#Wĥz$ĴW͙4DÈ+(E^7ɒĜ|Ħ×sŞĜq–~P$ÒtĥÄ0܍&ü™T`jÌÈö˜ħ¨Üu½2vɐ/ñ̨İ3s³cÜu<Ċ]KCgeèšŻy‰AŬáĜ”WW<–ú<9ÎÂ;WÈ&hHġRhÖü}t˜8Î@67N 2ÉâíJvˆx•5Ĉ‹# ÄfĞ&âŬˆ :ÒKd^ÛÙĊĜLĊB|eŭ\”`šĵ›LU"úTš #jH ˵ıVċsy°5ëá Ĝ‡C†0ŽÚ3Ħà á#röÔ:ÍĈQrB†Í̀ÓÀIŸŽXœĥöŭ_‘Ħ@ìàäûgĠHîê" ˆÍ˘àŸnÉÁâQY?4VŜÚXÛÉ´<ïUM²bÁ琁Ŝ(RŞ­î}îès#ŒbÙĴïÍy:Ä<šÏ‰PyóÁé½ ïEô”P 6‡­Ù=M_>2Ò@ÌgI~ŝĵVâ:$››ú]üë84†•ŞÁ¸jı·Ŝħg|ì˜K3ÂbYr§Ċ£šİ`ŠŞĈ'Cä€Ĝ´òĤfîH6³uĉŬì=E§œ²×ĴlÂú˜ˆĴ4£-lƒ¨ö°ŠVô<°½ÎQjĤX[ö¤Â¤äyñĵ Gċ¨ =ç£#Hj”ŠxöÏ1ádDK­X ċ‹*„ôrñpséqeÛ°*zKğ§Fz÷•#²ċĜúuçŽ>˜G˜ÑÜQÄ&iótcŠbŠSZ³cŸ>‰ÙùT2]êdb]ënĜ×'Ǐŝà ¨,ï² Cû}h 6%;H¸Ä¤'?”\ïZJ5ڌÏğ%KU×ÄĞ,ĵôÙxoÁŽéL %zœ†*‡ĉ}4i9^ÒŬoŬW–…—'›ç~ÏŜW bÜmîq÷…Ó°+Ħ¨ò˘…ÖÍİj ŭ:5VĦòGO•O'lkîŝ\a+Çĵ‰Ä !<{àçîŭ¨7·¨†ûhsŠsï#ż?Ċ†÷55ÊїÖ;ċlSUĦ<ô.ŭĝpĊŭOʘ1˘~Ş*wW]ràİ{YATˆßŞĝħ²(ÒÔÎça(V0İ$)óuûq odÔj/9 |¨@Ÿċ<<À´è³S7Ğґĵ|yƒ’F8MÒ°\„UÍtüĊ|?lSÌ™ëpX8‚çDx 97ŬÜ0ϧñìıĉœACżğİ1ĦġĠ 7à,”ÈdwKÒĈï›ŜDSÂÉiJm`LE˘ÎpÛö—5v2ÜX'€ê5w‰­1TŽnĵÇxĵÏÒUÇÔD^â~˜Ŝà‰µŭzġ?İ+Ħ{`× ƒ~Ç;}¸N€nF_Xĥİ’;gÖY9y72§¸Yœ‡sñ ”èzĊqç,G£ż{bÔß]hkȵĜïÎO¸ö~œ> FŻÙtˁËó#.żĉh›Ġ‹D|ċÄö˙ġ÷^˙ĝ1—ŭï,çgJĈÀê˘oĠêŝ+0rÈ·xŬ;@‘-`틈¨ú Ěïçk9—1Ú)\kĠûôŭ™ 'H? vŞóQ§/oUs Ùê^\’s#ĜsS>FĤ˘˙udòW=,6µĜ÷É{‚<Şż$ çëFdCÏċ r²gEh3tÙûxl‚µ×6.™3L³ïÇ ħŬ4FÖ\.ŻԘ[VqVlÏÈϋÁì1ĉA˙;²4W:fĉ}Ú^ƒÄF!7pĵBÜäUsMgÁXí/aUŜÏ˘oċ/zğrŜa:ߏ=sqwĞîWşZ\9(…Ü ob—;úŒÈb"qgßÓZËéĦOĝìE§Brê°ÓŞùÜñŻù”‘sß·Öç@Ŭ½™ƒ&ÊF™Ġ.ôĵèW¨ħûOçÔȉS“Bc Öŝñ1Òv’â^ì8”=rLÛ[H{TŞó8˘Ù \c@şS}8UY*ôìÓG’|Šn"œŽsŻîWßzÎ7&÷9Ġ²vFäÀ÷ŝ˘w‘Sn°ôÄ1 –˙iŠğĞ_Öyáñ×µ+÷żˆ •ÖŬÂßĜ!|x9Ş÷i˙ÄŒîŒB`uhьQà/ÔĴCıeùLêgXĠ!œLMŠ]p”eU[..žċĉœ…£ŭ~œ%6Ŭ=œĦ<ĈɆ“Š”œœ=œŠ€ÌĈ-]~ IDATpĦœóĵŽ?K+%M :¤#Żk\Ò“G™gA"³³ˆPÊ8ċëÓ|°ŸšZŒĤRz´4 Nğġ°‰é.¤˜ggÌFş›Ĥ™èmßĜöÈJ_¨Ĝ·$ŭ§ïQ‚Ş%œFİxÏJÏHʟ¨œ"dŭžC9|mç¤kuéFDċ< ċ×ŬUë8ĵ]•˜ ’(žžsàû“ĦhƒÔ'p]" ĉÔÀìb˙³£á’Ġ¸.&ù[†ĞòwÇŝ¸Ri^dŞsfĤ WP” GûÎa%Qùż”Î óYşLşôÓzXÙR{/-[éRÁ€öp ”>M&Ĵj‚¤ÓÄĥ·„ÑkòcS˘fꆋLz÷× .%½ĵĝRNŻÍŬSJ D‚Ô„€+ˆ›ŽkÍ}ZäWĜ-LT5ı¸ŝÜÑKÁ–çŭ8§F”‚Dá8§²œ”‘u5çdh^ qÔÚ˜- YTçR{`OĴùDU‚ĵ£ïÓRžš^…TÙ³ö)(ħµ²ëRınòd™xİ&”$ZëĤÁ^Ħ%ÒXKjĈvBtj[§¸N˘‘’ŞšEŞŸ% À,a ‚%µ˙,ĦIXxì€´MĈBô$ı^€ÛĈ@uV&%ÙÀe…ŞZ=귌DâħE}ŝ{àWiĈÛĈFĥĠW’vĠħjdU##P§ÏÈ9 ‹']4f˜aíĝz"‘SR•^›`=LâĦNèĤħCŞŞ”*(„ŒîĤŒ’Ĝ‰ŭ1O)&Ŭ“WiĊÉ˙E9¨tAàîuŜž<çË´@ĝ!„M9_$û0D&Œ°KRšI# qĦş¤ĴEš½šŞëŽszËwa2jġµŜ ‹S‚q-ô9“‚˜Ú"eIÎÌŞÔà#FÌq­QzÜDĥ ‚ĤŜìñĴ >­&`q3L²5òµ{hpZwH{L£½qÇŻî·ûùÛÍÍuÜўğ%âıŬ*?­@8Ê×½ß?ö#Že9l£Ê ía>IvgHj™ùÙ:OħşôĜHì3ï5Ĵ•ĝĝ+ %I- 6‘IıoSĉžËžu¸–Ò½Ŭ2ÊJgŜŒ¨,ĜE!qĦDĉ‹]ü†)Kx)€Ĝ€´8²žê†“U`DŒgÊvV1ólUïëo€Ċùxj%)v…{żDˆ„c§IÏîyDŒNÀ1€Öğ?ô¸n­ġ‰-_7íµ£N#ÚbÁħj§ExGÍŝú`9GoËan‘²{ÁšÙ˲W€&¸È‡ÏEQQšÏÉfÑ[碧qÏs"Ĥ–xĵ -1›žA ;€R÷ĉŒ°}אôŞbĥW%Bdġ;A°ŒŻ A6iÒ¸ċ"ÀM ĵf'IKµ|•,tp-~Ûg÷Ċ˙“4­İi ‚ĥÓҘÏÌ~]½+ùÀ=/b!,|£ˆM´2×FÖjĵœ`ÙÔjXK#˘°”ùÑNÜÙl·ÛÖŭ¨ëĉ8ğğoğóa§YĠ̳Ylĵyàĝ –q/eìŞDҝÔôĠœ0@ôȃ@ùQĠb)2ÓĴ<Ĝı@I¤Ÿ.!?iìĜ3,§ĥU€ÓâͅÜôZ{ òKVş~Â÷A „àÌ0B(ĤWc#Ċ@gcFaeü'0À˜ċ*ßoÔ†4ŠÄ·zöÇü!ôàєâÊ=/5Ák%H7•@MĊċ(â~ܵSéPË4M”/â8şm ÛcÛĥۍşjŽ£MÀƒ ²9àħ<#€Ër@ûËĦC ĵ'‰ê?1Ž œħŽ‚e ›VY³ J3Iµ>Áš£°N Ùz l·RĴÁ{ë71Ĵe#*ÇóQ C'M‡hۘ]gNíeĜ1ä™ËȊĠ°NÓáo(xÓá*ĉx „0Á6!)ĴÙíi”íÍg*gRí¨KFó!¸Şùg‘x8jŒncĊĴKÔHa\nvŽŬ´Ät6›˙_]ğŽ#ÑAĵŻàD´]>Ÿâ֔ç…Hë@ ĴMG¸ôûszPÑ$f[?ƒrN·Äô’ĵPvJğö“ ݞH3Í:FW VĵŒaU%6ôe{Š(aŝ‚.ħE£¤ĊTÛÒî:Hij,firì4"„ÊQŬ…9PM\żÑ7äšċ>@p]M ´ jŒrÂìcšd#? cܕĈX1tcŬTİ-Zh0İh1ïoX"ëĥUeîjzch‰Êq‡şvgEéhĞê9hĊ³läl%GiùQĵólëˆú0|€ĴAi žĉY`@ %+½¤$z#>Â"Ä*ĥŜkĝCg`8ó . ›ġÄnk>í8Î\é<ó|¨)¨ßĴè-éšĦ2PÇۇ4‚ÜMk•ecJÉŭĤ|lĴÔ<Ĵ*Œ8WO3žİŒè]%ûŽÎ8lî§ır‡vŬ9gµDH÷İ:Nù|˘NFq?=ŬN;ŽóÁk@$İȳK (Oç0™˜SiĴ,–7xñ!¸Gî!ĦŝN_Ħw³lo#·I§jbn¤8‰ĴK+C—Œdşë!›TÌ×ù^ÇĴJmc­6}&F½G€ÔúÖö5ñ+cÌàdĥĞMòh-i6À BıIĈÊ`ÈH²Qlœ­ĜGE•&ߐ÷4u^ï˘V@µħ1ïŻ<-İxӰꝎ³ÁÒĦsċÇ :š7OŸ9`Šç½3ĉ˙”˙8ƒċ0˘y‰™àwĤ[d‚ŭˆ·ŭ˘?xaJ8ħ7֗ÒeÇ$ ÜMĊ[|ˊwœê °ĉ ›ÜÜy ĵĝüPf q$d á‹^â<”ˆ‡ŠAÚܽWÔQÂĦëRħ•QÌ2h9Â!ùàN…ñ¤ƒwĴ Ä4xgL-;£PŠC ER1twiÉ1:TGz¨¤s%–FÇqZ/İŭ~ġV5lŝôINŒ0¤†vÄ·'Љ•MgR“zĦ›‘šK '{ĈĠ=ÒÈBû꜃CÜ6yçÂ0Rx ¨‘…’­>‰ÄßhÍ.‰>- Q;óµßû£Ħ- ġÔġíít*MĊ1>ĦÂğ­xŬó€DşûœUsûÓ¤CĥOçi”ĥKGżR’ċ†%˘%½ÍDBtˆX‘·RÇ(òL”bÇÊâ‡tĜ+••tFÒ‘üMFĴßġôÇP×£Žpôœĵ)>€f•]CL Áqè¸ğ¸Žó;@%làûrN‹ G?½µó,š÷µk??˘K˜QSx™kVè.ïÀ£èĊˆX?,0s¤’’ko8ËölĦ3xÄ(ûė0EÑé=܀& ü£CvL^lífà(nÀ[íD .[ñŝGeVĵƒ'ĥ£ =ġ Ülí˜ĴB@Ä {7nòµßœŞ`ĥgê8Ïî=WT3;äŽ~Ċ#Ÿ TóĥWoX;ɗ£ŸlF°%O³>r:Ĝ=/oH+X›ŬóUšŠğŻ÷1ZÓç(Ä5Ї'm-?´ƒÇ7il!š3/r*ÑßÌfğŬlrM³8γ;@Ïe:ĈÜħësÁù:މ¨EŻİż³ĝUMOܚÌĠe1Lġ '/lKħĴí˜ŬÑ Ç\akFRpŞġ+§'ŝùĜ(ŝPs86ÌÑ­[7NÉırGÓ>oäMĵçÀȁj˜ê{%ÛqûΉg²ĦTÒşĴÒıŭâ”Àĥħ~ŭ†ħŸ”? Ġ6•Om§‰1ŽŜqàÚcĠô@Ħâ@Ç94rÀ`Ï'’Žžµ–6êşwSñġÑ|˙úġĞRîG½ÖŝW>´VŞR”ŝĴĝ7;·`ĥíĵŽóQKÉ:pwpä€1ĉûw³{4úûż|(× îw?$ÀhJOèŽïŝ™×ŜçÍùÂ3™çqÈÍĉNż†ŽsvÍ ä‡XpŝÄ£sh·rv~)<âïĞv³›÷#r:QmCüĦWżÇqIq³T÷Gç°µr@$ğ"ħLĵO›÷c/ĉ7íŬf{ġûq­@j¸Î)‘ĤÇdŜûqĈÂ!St{gÚ߯^Çı$VqVêv³;ôŭx?ÎZ8äúÜlïÈ@uġûqn€$b~:ZÁûñ~ĵ€¨ĥŬÜaù\żÇñ™{F+P÷êïÇûñ"‡ôD\ڏsŝ /î9;<ïÇ9­àŭx?^€p„çkÄŞk {vĝâhïÇûñ‡3\ڏ3;7Tv€2”!{@OG+x?~ÊQ˙İYĤĥĵt.Ĵœż‘í› (NÖÏéh˙ġ޲üù\•eù'Z8fğŬ`ċĵgĊ _Àĥ:5çÀŸšöVúô2jÀf£,Ġ‚ U]˘2Íh˘.Êú§ô[ŭ,`çU“¤çé8Ż‚ ) hê8´‚zïQÖ§;³4ÎôŻËçL7t;Û›Fİi i şĤÒôĠwÔ:MŸÈĥÚé8IĴvŽsi PÚ*àqŽˆP:Ĥ˙P§ċI{;Uù, ŭɇb3$1ċEó·D_PŽ U<•˙óä#M}^Ÿŭ÷ü(’aŽ„ĤKnöŞäĤ ìúIŽıĦ^!Ví܅£És/îÏĊ1™ÌgġËl’ĠMµ-³ä —w€²Žó&rG/8ÍÍâŝœÚ(³ä 8„ÑW[/§€0™aù€é`Âwèş)Ÿ¨şä}>°!èUħ…èúÚÄâ—ŝTc´Pû–•î%&JAsÈJt§İ•ŞUŭE}ùrŬħjÖÜ.9k4À§—y{ ŽC‰Ž³•6ž°f6~"Ͱ LaZ ÎM %ŸŬN]:ġê§ċê,÷U]+@^T‡ċ;ëAóLʂúäÉ ¨ğ_İlc•ĤŽ*|òÊÉû²zżSK# Çó0ŭÊw€·q˙€<}ğ=0r€”HRüEĵÑy)è3=T@!"_G½ynİôÙë=ë‚Ĥ§ŽĉHMĈ‚˙ĈԀ¨éyàŠXÑĉŜ”Áú?ûJêԗR×İ@•ŽóL‹1²ì>ÔTPÙiv|”˘ùdóVî³ŭV.Èjvµ‹ħxtíċ8TdŻFYÇ(tüˆ’­Ÿ]ŻĞ*îMş½ŒjÇ8ÏP’p­nùŬ4\ÑßğöŞw€Ŝ.–’ĉfµP·‡F4Ĥj›¤•$hè(‡ÂÔeô4é8v,ô삇ĵFöĥ1ĝX9CŒıéÁ Ôp:떣P~‚΁c³/„Qƒ`lQ„›MYÈV”#}R·³ L"ëÖĠàÌYéá7İPù‘7mi•u£B8Ġižĉ*ŽŒ)‰ŒSdĠèîċó°4PW/`zéGԁޤdŞ/ŞŒ²ü­‹ċŬöÊu‰UC*ϓö`êövĈ”TZç‚ĊGê¤h°>Ï1ìIZN!2´"_Ñ)ĤßLË*7—û1USŒcèu5Ĵ“¸QJĊĜ`È^A  ,QÀÏx9:`Ağ“ù)ŭ&Œ[wÌŜĴ̆áD [LyDkÀÂ)rR*o—WĤĴÌ!r,f;œaĝ’k&´ĵRR#İ(½Ïë9 ħ2wZ#ef÷ĤĈ²žRjAÓË׆gìÖrl° L˘Ħ‚‚H$ʏÛÊı[ÀĤŬz0Ù#-żU4I4ƒˆĤEI…uŜïîğ+ç8PĐÊÓŭż=!ç€ĠCßSRÂ!Ħœi”`WŞû G3<?ıróĈĤRX\İTÖOxš\@:–è…$íT0ߘ9:Ù°‰*ÄÖ W -i½D4 ŝQ Y¤gK;Ħ6\fĜóˆ; ­[?€Mi& Ì*K¤,UZ%Ì>ŝ3µ9×;âRĵ 碭„‚çġ°‡KvÁ°Â1ß;Ħ ÌÚMQê‚J07 vòLÂy‚Ğßê‡HŞà·AI-ċ˘Dt„^a+ċ=àeÀšrMŽ֏,Ĉœ´KA7*˙|ɸšwWŸWMŬc÷'ñɓrè(qÄİ †’uċ‘+“ùPÉa ZFϔâ%ñ`Ñ ­âÙA,Ïg5_WĞ˘aLÉI_ëJ5ƒéS3ÎĤil +sÍ,%µ$ŝ‡ ÓÔàt\1•ސÉ=ú¸ġN+r$4щµXŽÌËâ'EĴËèĠIázĦêb™İµë8"h¸ı˘ċġ,…˘ïgB”Ó^çjä?Ò%7µÀĞ6¤b(˜A’HıĝVÉ´9–*Tü˜Sax$9 Ħ Ò‘bgYv€zĊﲚÑ@ojBe­“~V I¸äŝ—Ŝ3;oáĤÀg]ż=!çS¸ŜLC+‰;i%xjz’aĠE(} †Ġ:û'ï>ì-ÍT M0C܄p‰ú 'c·:ÍÄnM3żÙéˆ ÄŠwm½ŽcÖ>v/İ`0Ô"}` e [—òëMÚ`Xz—uGÏ<™Ò’ġ’'}•¨BaêËÌóŞP6J‚³÷…_˙‘wĉf×½İĦ0cċ=P6ò‰_„lÀğ‰Ç‚0ÈX×Zùxífċy8ĠŭQT'̰~u‘ù'§o“C‘Ĵjw—ŽŽ> çŝħFŸŞ <äÁ†}˘Ò2´—ae:ĉ= f™4*ëqWò—’tZƒĉšiżxRA_1şCɎPġHÄĥè8ڨݘF{nĵ}K{9ĴCĈIם!ĦÒËZ‹ŽcĊdè9NèöJ]8ÙU 1ьĠĜNĠ7;À¤[1uO÷¨úE M/`°TĜċ܅êĦ- ‹ìùĝââ5Öp{?À– p4²Ĉ›)…Âh_‰ÌµI’Nâ.áĈÖ·‹…$Ç$hÍğĞĉ8ĉĤ°œSrĜHv—cíCˆi`rםOD ĊuİñB˙*<ù×ħ.eƒŬfŞH†3ŻXŭ¤gƒ_ à,I2bl‚ü=43Ħ6lĉ¨ĵ ÈEn|­ğşèĝ U¤Ŝħ2WĠ^ġ°˘pˆ2Ĉ'iú´GóaŸ£ šK÷-œî*„8%Ês? "˙ÛĜ;á Fk d)qĠ°ħƒÌċ¤˘QĊ‚W2²4èR {³]tÇ ]¨–7şû ’Ŝ<Ŝ)Ñĥ­ywé çqœœx ²-OË9“½-ǓeGXT­÷Gxñ ôÄSÁŜB†úw9H‹Š_ZÙXÛéF銙&ÚĴ݉+àĤ>Sr ¸BYċ,í+֜Ò!ĴÈb,â¨D•†­.š½*ak…Oxc6ğ|hû’ÄJÔİßŬ,ÁR3ó–·Dğhl#76ıHBy:큧§ZùĦħŜŻ"_rAdĝz5sJ4­ĉ™^ĉ˘˘uiX½cÚ²s´Êy³M½KŭÎ9ŜŻkQ Xı•'W‹k ÇM·ËĊ×{xĈ}FäÀN´ôĵ…sKÑÑ‘픜Bß£İ ŜÊÙ³ ÔĤî? öàAhÀh<…ñ­£·™ ğŻj5ÜÓ/D  µ²†IœA.İl$b³;H ğG>yXċvW ì“Ë·’ìDYÚ1œŒĝ†4, Ñô´ö>Ĵ£R #…Îo,Ċ#E6 ]­N>}ü:ɞ¤ĴÀSÒS5£|âL`ĉt‹;†vSüU^W²Lì^÷Q‚ƒJm֕ÔĈZ_uĥ*]Ȋ·MóÒĞ­ĊŽÔ:F@W2O8à˜ğ—M0@ċx8­ ¸Şc~BxQKh#˘¸ĈħşÛĵ› ù mĊB;?v~k)Ñ?·şàzĉ+Iß4ä=Ŭ=%!°+QtYú/Ià醛Ÿú#‚2Dí`éTÂWü]Ä(ZÛµ†t™@tU"ċÙŸğOóĈœˆY׸JĝĊ¤üÒê#@ÛRjLUí‚ĤwùŽ1Ĝ˙‰f³ħ.ÓŝÄú)žĤÉkšĵ\Kö°ß%ŭS1Y#NgŻ+%Ĥdwìż£÷”¸wm,SBĉMƒ Ï"Œ/°T.Íñ[ÙßÂXM·œÌqY9³s9‡Üprµ£#@ìSO bUғ²hġZĈ)Q8öħ`)È"” O!Ù!è)ëú!“0’Üĝ² ı<Q}öœ,KÄğĞbqHÓj=OŞ5ab)e ĠJ Ĝ˘\…ŭğq3q=Gԙ4 ċŒœú[ȏNwüèʓKށ'Vğ[WîN-Ï(~œR ìŽRÛÓĴXUĵo[}N²"Ÿv˘:(Nsı´b×tFOŬ)th=GgVJM@ßĤü+mġ™ÎWTsEî,Í͐ŞpìŜ'D7Ŭ&Tê°êşĠu_' k%Ç-‚Ôì=CÇy ¨'öOkUv|Î"DYr¨Zí ­R1ŒìÑB´Ü=˜Ŝ,äƒàiŬ¤I[hÀŞ ôOKp‰Ü’˜h&[Á˘_>l,#`gٜMDïÜgcG;",_%bKb¸MwwE¸ûüótbĝíX5~ßÊjßş£ßcû:ŬħC["ż IDATKŬmFÇĠVäü*îëí%ìu\›‰8Dîé0÷²˙îFĠ £&Yġ­ġïqġ“5TMËgĦÚXÛë=î[ò@ßv*ÎJŭ[{IŽsŝé|ÁÁÜÂq·Ş9jDF4#lÉEV™éŞ•1V8ġ{ĵq×}³ÖžŜU‹ùáž\=Ż´ĝĝyNŭÒħ8éÊ(Ĉ³È’žWĈô^ÊÛuxµDŠ8_OÉîx•ŒÙ7qİ0žÄÁúŻċàƒİgúó×>T+ĥŻçFĈö^§Mô„EԝJNâhğoħ‰ż¤ÚɊ‘+:ĵaô¤1v\_;ĝ;Ş=8-GL.à“żĴŽsŝÂıhTÊ<à–ÎĦ9ü\² ĠML?v6Ĥ@Ìc}íjr½›‹Öúı×#˙şž`ƒv˙ ’Zí³=]ö0{WŬÏ;ôĝ£Ŝżŝ~BçÌ<ÇŞö ‡-86è+|O'˘Œ;Ùîvž’0Ï̀^GG3€…S†ċF}Àöc×Ä;ĉ܎B<ßY\ğŽcóċ=üŸ+u ? ­à%ӕĤĉ8ú}‚_ŠKßі°ûÀqŝ¸jŽCñA+,trÙĉ´‚ušušÍßgúÛ84e\Zr€4EĴ]ğUQIĊı_ŝ ´Qó—ŞiğÎûşy#‡µwlƒĊ³şnGç„:ŭÀ6µ‡C+ĝİ+‡ĜÒCò|ż×´r á7Pğ߀U .PŜzRäÀµ-œċŭ•VşyŸogáÜ!·ö,]ÇّŽƒ  ó<-çÀ5r}ŞJÁ!ô>!ßÌQpsĊÚíIçSôïÒ:Îry/Ĉó? ¨HïÇ8X5 RNá8:ú=ĜNù#X '…­ ĥİñ˘ğr\ëÚy÷·ĵ=Ž#&5è:ù‰g|/œYïÏîä8i›#{âŭ’ŒjêÈȁ÷ŭxQŽ#éàË91ˍž8ëqœ=NXċÄ$ñÀíI‘ïÇûñ 'dıA¸ÚQ~œp|Ò$ùoùܳbĝÎÙIĞÖè%òܨċŸDÇy?ŜäÂA–RoÉ@Gdı‰·|N]ëĥ|N²šĤğÙaïö@ü"Ŝ·yPt4w:ĈŞOè8³½:ÎñUeK'ŽĤÀÔÛ·9~ĵŬ…#8MĴsçGpœŬ³:ŽlùÜcU;ݲÑîÙĥv÷'ˆxê¨ŻöŭġÁ÷ÖnT=,ôĠ: V5x?É&}*Çyҏsşp6\8ılŝTX@wW9Pżì“?ÛޏĝFz§DġĊ;­ż˜˘XŞİGcYéézżÜÂıe´ö§ì¸ĥÈ}ò  ŸĴK`•'a“ !Ŭu­Ÿá׋ÂQ‡gô·/Ħ —İĥ/ÒR9ÁŽĤş÷ÚF‹ÚS3Ê%ĠG„Ŝ°ċ’ñÏOċ8O/Ğ\8wK„F/‘“g™ové8eùâ0ğNĜ‡Ĥ-~T•é+†}–CLµîġŬĠîI ›–0Ìx–v‡5ë%ÂÀ%ÇNWÙPô ]WûÀċÂ×eŻŜ6_r >|òËğ?Ná8Ïûbr%íïTAà8ÏZĠŜ^Ù\SaëDFkë½ĉıċfËQ=ġkêì‡dA‹Żè£À…ÑċH~dI/•›ö)×zóA…FxÌÔ&‘RTùôÀ<]ÉÀ\5Í`qµĊç4?bĝ*ŞUħŻÇ)<% Hz`ĦJ`M J{ğ=\\&wr%-ñö×.{<­@G•#šd/AĠkĈ^ĞŠ'ÉÖ´KHgIœ÷LòŞÀ—K/΅9L§-@irı8Ô`Ŭ½üf †:H~Êèo%O™ úü1Ğ^$2Oğ:V@m2J Gî+ÊkÇHnGlĤH=]•&‹ÊÖşŠ€.Ž™w‡Ŭğ Y´×ÌqôŬƒÄİ-X!;$rÀv´ŻGCAûñüuc‘½Ž2ŜèB²lı+ÉÍé)ó:átl™z•ĜOÛ&0ĝŸ¸0 NYëAj¸{ş·Oá |ì†Ìħ‰ĉEÖğò'[ÇYŜ)%WÒì¤V=|\-g0ĥÈÑ2ŽDZO$3Š€ı odcŸâryŽŽsyêH•ċ}Ó˘9@iû!ɲ^6KäaĈt]ïΜ$l%”îÒ ^ŞJċšŸñÉ;QRÙdŭĦŸœB³Żth$€“Ÿ;FaÖ>ŸT4‡Ë‰F[û%ñ̇‡`ŝ"Í"¤ÇbMI ĠJäê<|áÎўŞ8WİU]Ŝpd•ċĉ âwWÍqÌ­ !İ‚:}Hä‰Á+˘}ŝĤĠ"?ˆDï²Ĉ‘*mió!ϳ†ÑóÀ ö³¤…½´œß_%Cş‡ôC;ÔE'e!ŻòÄh°pôÇdĴïS’ôdÎıdw’ h6O¤ŞoP”´‘²çĈ_vżšù1Ş+àVOjü=ċà: / ?‚9³:&çÀOà8”=Q!Ï mh;8ç€ġXiĞA€á'ÙÙĉGŬ\9ĊAŭTŸÇé&¤4P"cµLXş@ï=°”£^66\h­Ff.EB½›éXä'âÎX7ûÔÈl˘ĥdX[İhPÄâĠmh·ż%ú°ġîOŒêciÛäG‰jĠ=¤4Ì4an…‘Ġı“yĜ7Bçşuœ]q/ Ç˘NGx2nzÏWûa['|˙N_¨°%àŠÔ&úĝÁCIèÖCµŸ×ûĴàġÀ_3XÂ6 úôk´&ÜҕMıÒBfÊÀψ#ù`EF„UĈ’C…7} ~xıà:4¨>¸Ï@\}”=S4*(˲žĊPİšŠßÓğK_Î R+$ŽĦìÑp\ı޳CĴÚjÁùĴVĊ‘A§­•ZF%¨§äġ´|Ü×FĴÇO?\€R¸KÉàÄDz;Ġ´£nnVxy^“9ûkx)÷ù,j]Ç’ùœíˆ}Ä];Ôq Ñpm”˜Û´Ê-ĤObƒ=rdsˆu3v’‡VMĠa~×=W|$ҔŞóÊ4§Ú£g°0–Ĥ‚ƒŒÊ“ŝ*‰Í\Nü ‰ò ƒ†;ê ñœ‡ċò²:Îì<”ĴrÎ9s·94rÀ –YáµKXMĞu§\Gñ˜Ž•żlŞNMLoÔh~ݲrĊužÍ’ÜS.Û¸™LşQ–(‚ M•&Y޵§d1-T¸ġ+™ÙĞĤI%6xmÜiUT,ŽhĞç%ç=<ŽY¸—5·UÇFÖI —=ËĈ‡ÑFġšo·m’>ڎÂݐş3 9Ôĥ@wdg|úhôȋÄċr8µ™/ıġÉ0"‚ÄÌÌŒÊ+í#A3Q:¨´Ä{zÜ\ĵWí¨ŭ8ÇsœÀ}àĜhĥäÛŬÑÑÌk4ÀÏ2–ÖlíW"4ˆFíĵ+½ŠSwNé)şhĤ>ìħa’'}ޝ.8C…Ĵ@;êF¸“Ċ§L“ÄVlJfÂgŒĞJ —kèĵBêPċ­Š­j~A^Y Ü*àÁQŠ^ĜŜ”WɤĝŻ µÂ”Wc³ÀĉKM^4óhİ í DŒĜx8v,e~Ŭ3´Ĵav¨s9MQ+P—€uäÁ²zĝDe"ĝ:i"tšÁ‚²9ġ9Ĥ qRʒV6ѐU O6­Û ë8ça€ŜIllçöàœ–ĊxÉaĈ`;ÂÒJŻ&•Ş@ŝj-Ç ÀêŬâi:é‹ĥip]†ß#M%Nîl ^ħ5•ÔEµ#ÉEQĞdè*r6†ûúœRäŒÇƒ¤ ŞŸÏ*œ‘ˆ‘uâ•B=×#·żE=¸Le  Úƒ¨‘´Ç:#ċñĜt=Ĉën#<ï߃ ;ĵŞĤ %ä‡ĉ_ĦFTMè:IîÚu˜¤Ĉ¨u}ƒZOIöµ”ê4@ġ£\í?cĵŬÏ:üôĴJsNâ8QB^ŝۅZq ˽Z-nÛÓ9γ ğÙì\D6è8nĠp|á9,f­ì4ĜIOÙÄäc#šµ ú(_´,É&žwESOȆŒ9I&³ Á!ç+ކ‡DħY[<ûŠÛİÚäıŸċhĝ4ÁÖœù$Ĵ‚›ƒÚ1˜tĈÖ>H­•1€0U6œŽVîuŒ/ó0hÚr2<7pœµ £û‡ĵÔ2z£f@BFÛ A –Á çVƒ‹1³Áĵ$GÖgc͖Ġ0ôzİêœGŽÜSîWż\ó(èqk2ü1Zh“t°}²[Ĥ‰Ġ†…÷€žċÇy PĊ0X÷ÇĦ@nv²íw†ĥŻV¸÷LĠE\0( "SÚLlÀÈUŸô\7–Ċ$J‹ÀuÜĦv}Ŝˆ€6]ŬĥBe&ȓ¨šÀŠÒôÊC4ž<ŬWĤĈ£Dí#ħ|ÎQì_ÒĦÚûwĈĴ‹Ħ†Bs>7²ü!k"˜€IµiĉX¨A×İVf•J¸‚”Kñ˙üO֜³Mí¤‰^ǨkÖE ƒö“’B'›<ԃİ×i°ë ^Ühl ÉZ=\ß×Ö| °Öî6ŭ£p‚£ol*ċïVŸ%îÁşçŞZÚ­b?OEgÖY§ĉGÄáP| Ü1ËstœWˆ¸cÀEÎċ*{xÎ!ëdŻòDO÷İzġ!­’@³deş'=÷™tÂdY?ŜD†ŽQ˜’0mú%˘˜¸ 'l'™ħ™)3äŠÊ3C™À`0<•“İuà˘lW# |F‰9ĵŻ“ x6ìì¤RŝċÈñ?+çfANïĵÉÍDKŒ1Ç8­úÚŜż@•ßĊ~ ’T°ZA{ïêêÙ`sDôXfC:މżÒûC ´A=-S8ö¨Û:Ф÷…+ĴsĜ_-<<εǪaŸ÷â^ħ =ß9@3Í 1Lħ ˘‚ ™CÉ8TáĉuÒYûŬ“N2Á3Ph‚.ŜJö{H41h;ÇRÈ2ì^ Hù9e˕]q„—ÇÂĥz.q™ÀHŭ ÁSl5+cBátĦĈŠŝҐĜ_zs[ŞäŽ"è8Ş‚}(R£ÌγMiùœ•$ĜħYesµrÊp!UĞcĴÀì(ĤÂHHyñN'óVäFDíʽç´ëQ ŜüdAÍûFĦ  †tà8Ħĝz¸˙Ô´‰ß¤6aıZ/˜¨È°jîî%!áħyĠ^Ÿ&Ɋ™ RĞŭÛ‘5ĝ­3–ÉŜâ'zçvİĊ$–*üúħÒċ @–ş#d%ğ(zÏ]K jŭp„÷AëV°yYâqóJ›ĥ!”üµÖ~HÙGò)^µ ñVY,‚ÓR†=@<È*1ŻħI^I‘;žNë7hÒÄ%ñšÓŭ°µ)ŝıé&Úy€UğKŭf …05×ÔyĜĦ£ÄÚUXŽ$oIċ ŽŜĤ"7Ùám;Ä$½0'”žĈŽVNħÍ~,|­Ràoj˘…“z%)rĞHĥċ=ûq{?έ,r²Hßc?΁§†GC|Ħ0ÁÔ˘ĵ§Gƒ#ÇIÔĉ_ó¤ÔÖFöž]” ‰ä­.wZ‚S£ëΉCW*ïn!“ŝ¤!Fñcd s¨XÁëe¨šHHî5;*„LYNÇYĞ”}h)ğœUÔ%•m|³ôajiԁK?xġµJeL^2HĊÀŠzúd­Œ#çın=yÔJ}‡°ÇrhRŜ^yt4#0–ÏÁ‘M"{¤ƒ Ğ se<J/{'²{ÓÊ:¨½ĉÜÑBÒÈoĜIcŽmĈŞb­˘‡gNĜŠ`Ĵ´à8zWá_ +–ŞÈ=RŬ~ĈxçŠgŽûž)ú˜ÓIU>éÏĊ8—ĝlMĉŞXıEÍ~˜yUQîïĵ¨ÀeLZä•rsިtg}ġ‡ûè9³,*\) ×ëʕ[Újžƒ]ĦN+›£a VK÷\Q”ŸóÏîċ–ġ³*(îÁ­³ıçrˆîEċêE´Ċé›SqÁŠħ.òy5È'koİğˆ™UQP4)Ĝí*n‡^ â²u—ûW’héUäB„Vô\ĊŜè˘"C ż„rĈ@˘_ùĉşs0ǑíÓĊ9TĈ4;á=ƒŽnX!ĵY2˙r™öĦâ@g|ŞDoÑiD× xQ6ˆ.!·ZĊdİʲĥäL‡Ŭ0i÷”ĉp³´h ‡f”;XßħHħ;Ò+µbC›­k‚Qk‚ž²û+AžÈa<¨v_x·†¸3ÎkX˙”†_Ûħ—ž_ğëǵŠÇ²köû#eb\µÖ?z#EM˘ZŻu3ı·<SË ×,İşö“ĦŠÊSI‡Ħ6rè'ö½QײÈkA½Dŝ4'Ñ â°d5 Gp÷ìĴì5ĈÁ˘z-ì†ÂËSTĊŽ'ŭx‡"ûŻ™ĜFò:ÑêıÛ9@ŽhUyŞÄaÖ â‘¨oĉd_m Ea°s'=(Ĥ8¤^<€JÏUSİPh~E´Ó÷°}ù*˘L´÷„‘¨Á]7ZĤcMր`›†g•›ŬĉŸn;—EI;[{û¸•U`éħ&šäğé¸oÛ'Zqíâç …ÎX·Öë%‡Ùġ²zèÈé#°ÏĠß4~_ÛŬ“[tÁ“Ĉw4(kwÑ×TӉ"Ì#u£5T‹÷ı7ŬçktÔ-ÚëÛ Ž™ĵGókÖqì-§Ûùía:Ž °/ġĈË'lMvÎBuÍ Êyb½[şŠÓXQSoħÖêxZĜÁ*ħ§òY#uìĤÙđç>plĝ¸žžpÏÚŝ÷“ù‰¤Çfĝê 3*Č 3Ӎ>G2!Él{Ï÷pżY&ĤS9ži7òÂgU[,ï\ÇY˙Sp°òr½)Dcş+nċè˜töÂĦòÛÉétáœ4ĉI˙.ëgöÊzŬ­Âž²…×Çy^·‡8Β ÒdU{È_­àÙ&”éağD^}Ëў”÷5,ĵ²9ìbĠÎ8+ÎÓĦ°|^­€ĵ Ż“%xéD­WïĵŻy ΋鄟‡ċecĠΎŽŜqöD§Ž +m´D+u…ó“‚\Ŝñw_UÂĵE>ÂŒĵÎ9pö 7Œ-żâlVŻV@›KóN×ß„Üpâhd]:KÇyvèììUΙ—³bĠÚz%†Úî}(ZÁûñ~\Â8Àı˜É"}éÜÑ/°uzÉË|A°íĞ#Ŝ÷˘šbnƒD¸‹ëÎĞf‹{¤Tl>§ĵjíŸôŭ¸j޳\>`éPô×µûqî‡Xä1‘ïÇûq‰…HÖtŬ‘öNöÜ=pDj{x΁÷ŭxiŽĈ]Ύyċh9˘ÔĜ”Aˆlúĵ?iáÜħqé:–ĞĞßşòp+ĉ8›wçŭĝi‡„ÄŞ-|èŬq_>àĵ/œ÷'-B+XrŒĞGdƒaž?!ràŭx?‚]xĝOĜyŻž(É7Àğîvï:Îkġ,ĉOpò%GÜÜ/—_ôóǕ#²­€TÀù:çş­j‚ù›ÓcžjNùç^9gT£ßNá½r?'‡à= ·íuDÔ{’´ÖuúlÊ7p¤Cáàŝ´–:àPÀzH^˘éœŝéô‰ŻÎ|~żş­o%Ŭ'+ğ8ZÁ™:rÜô+%ûù‘u™N#çÔeçs‹ü•Glßk8áO–ÄŽ?&Y’žŜ‡'^ÏÑ·1Xĥ¸,Ç93VÍ+Bżâuŝp‘” ³ŞÂqŻ?´€óĉ9C ¤M¸UÙ ÑÙÓS'ç°.üĥœúYNA˜+àÑ~½°ŽCËĉÌ ’3ä?=r€ÒDkIf?4Nğúf9NÍIq-“ŭƒQžFng²œ,;§<ä·>xĠCN(Rİ„í\~èy ĊĴFòyŜŝìÈAĜ“1Ż_{½ıŝ‚â<•vd‡Ğj5İD})ÑÈê3ġDFm¸ÀĤ]sç$ŸŻsD ‹ï=o–ß-Ġΐí?;r€,§АjAşê´ İ%S÷’=wé]”}¸ŞFˆŸCx·S^ÉZÙYz"çhµ'ŝI‡3C­ċ¸ü37²)Î~Ëèò—Œ¨èR`&ŸTŒĝ²cĉtz~ío}\ë:<ÂËZŠİġNŞ£że}XUˆ™xŽİ~]Goò…ŽkËĵŭğö*°ƒzĥ3&ğ§eżÒÑŬî^ċâ‡Ĉ5#Ôi†£]\܏óàı+Iʳ„Žs1ĞZÚ£Ŭû9ÎĜ½Á2ìÂY–<Ċ’Ĉ‚VÚċ ­K÷1xìËRp8Â5à"ì“€_ÇÎzĵJ#0N‹82u_I›–팠Û0³àǤ‘[*”_ŞAÇEùDËĝ1<(}'ĠâK¤†Ż£+ É%Ô>›çĦì•ŬÓEş„^uµĦĴ*}]Â]KoŻ*ß÷UWÜĤĞĦK‘úöü8çé8·PĈxïzœuǒÔrĦ֌‘Ĥ'îO;˘mÇX+A¨`Kœ¤=GL߉#è’Z…ÉżóxVUç× ĵĉŒA<ä&ùq-h€K°‚Cpƒ´×zOM÷ėÖè,*ÏĞìIwC)hĵûƒ”k­¤e.Ħw€ K€n#~ Íï&dŠ@:5áŞyœ[CĜ–âPb‡L/ÙgéĠ&Ĥ"Š(Mwx˘ğĝ!>[Áğ³ÔRĊA‚À6g…‰ÜG€ä€§1›ċ7ˆ._ìÓ¤ħÏÉa-éŞQK‚C @< ﴀ°vĠ€cSZpĊ#›¤[¸/J²ŒÌOß/•ÒĤJ%ù:ŜBt4£RĜ͂ÙŠéà(ÜHĞkÒ"£%‘ŒòákaڃŞİK *Ŭ<=êžVŒpŠYn´ µveĞŝšTĞé›’‹ëç8É~œƒ"ˆ§…†ÏYÎĥ„çŞAnœ”­ħX²” ı´ĠLÌcß· $,’@‡:rù™f]ÏCÎċÓĜÌ:ɰHJ€ÌB è“QÛIV }F Ĉƒ‚×Pg )¸Zš|„7hVù÷œŠ4Ák~ètÛ'ü {'¨Ù·íĤŽ…HçĞÉÇWÂL-VJEPfßKiŒŸÖ˜1ÚàÔoˆƒI žT?çŒD-Àʁ…Ùs*ÀÒĥ”ìbE%¸İċœ…[”PĴ6ÔŜ’™jÉû?Ż=:ûqĜ‘C#",KV–ÏÊĠ &L% Ít­×L)î§0'Â@hB> ex0éĦ': ‘ú„ĈˆO!` ‘SŽŬdóġ—qñB-‰OTŜ6Ċ‰DušĵÀ£•n½š™i<çX Ìc^Ûi+i:TöÏHÈ=kj'6ŞĴ·5ë]SşW6“à)Ĉû@ŭUa™'DqI4;nĈäß/,FÍ£cÛħ‘ĉf]D0‚=Ž]ÛÑ@-ö’&ëUy $Efiß-›f£ó‡ċJ-ĵ–“_7Ç)–ĞöuÁΜc ì*Ĝ\HìnĵżżY³×dĠQšG[î¤ëŞŝ-qĈ°Ó÷Ŝ4¤Ò §´ĈäTÑÊ=óè_İ!1#³v€İĝ,*ƒ‘Áj+˙Uà8ğÀqh"ĴƒxĈ—`v€öCŝ•aŝ^]ï[;.”䲈q' ĦöiħŜÄam:ȸU/ĝ@wÈŬšuRSŻŻÔáqyùó3£n§Ş8NáŬA€#ğ¤^‹á&àĞĉ@‚hRND,ÁB2Usm~½ıÁÏß~ż7GDXQ4ä˙²“YŒİ„’Û/ô=àì0Az4ĈĜ ç WĴfL„˘9N obñÀzıŸĜ›@YOW‚RÄu¤z7ĴÚ­@‹ V–[ŞĦËx_Gp$„ —1 ²‡Œ<1BPÓÎ`ĤğwC6eÈĝi ˆ 1KĵYµ¸…˘'˘x62X¸ċìĈ„ëNek˜T*Œ’üZe½×íF Ġٔ_{\W{ïŜaij•°VŞ(ù`R½µ›£™èŝӌĵî,77½P„›#" ¤Á“{öN‡á`Çŝ_ŽvġI—‰Ĝf- ˆ^O˜¤Èh [ZC§Ğ5ݏjzġĴsÌ0?Ì4ŽĞ4â8µżÇ ÇAĠHş*òşYĥ.†ĉ?Ïçèòó°ÁŒLÌ(¸†ùjgA½U0á'.ëd‡-ġÌÜ]„6x}À5s?8ˆvyhżñóU=VClÉräD=îٜ¸¨iž9ˆ,‡°GÂVôÀRhġ”ċÑ<ĉâuë87†Ş%‡ş9&ç@HÜU|İÔÖß[ĠêÉbĠx6ZÜÌĵ`Î2ĤÈ&H‘ê\Ŭ|E|MqLŒf"ÜßĊϑ%*ˆĠU&üĜcEhÛLëÊSò\Ì^ ‘İÜaŽrMy o`AۂEÁSöÉżÑÌrE>‰ñ65bÜŞ-ˆ” úü İ\Ù­ĊŭD&$Ž*v$ŭóD0L&wH²›È[¤Tžŭ)8FÂvŽĦuPù½ŸÌUĜ„H~œy–Ä>4XŞj²53³äÛ´0ş+‰îEûı½YĉÛ^ÌÑOâë"¸â`ĜM餪›˘ Ÿ°ˆ‰Êî8|àŝİçäR›`ÖéÍkóqНìĥíÇfۂ˜s~ ĤV6çÑĉ¤B°W/Šê%ŸqŸrÛq,]šƒúä -³êƒ§]Š çP_ aÑyĉ1 ĦDKï;-IœĜŽH6U*ô·JdŞÑ!’Áo Ż0Ä ŞÑÂÁ´šd9dČÑâ(ΔD¤¤3Ac„h=F‰kÌŬÇıâŞT"„`!—ħ[`·¸:1ĉóÀĝ($ícĤĴ4œžÉĉÖGŒhŜqGûì:oU–ˆÓ)0-}-4=rvİòFğÉ·Ëiôsa´‚3ƒ-£9„s ÏZ‰}Nm'µÈŒôÄl²ѸP­ÁĉjKf²ƒZÜ{Nͳgúôž|t ÇÔÂay14`ëjĴ'Ĥ鑣œ5ÉKÎĞĞ=çŭÒOK+çw²ŞŬ\÷P·pÚÍ|$CĈçP?ŽöÖĝ0‰Ì-3Ġ§v²éĉ£œZ{É1{1ĞŠžL.ĈÁCo"›§§×ƒĝMÇ-–Öñ›mû&t²şşnĥê˜Èí#”Î:ÌɐÓ?ĞşĴ§³í¸ġ4·o}^ħ1ñšÍĊo0H˙ŜĞZëŭŸí—"ĉ/qĉmĤzRûÒj:îÛĵu³[g>`îš8NğĊ|Üŝ~y?ÎÙ§e–çˆÈ&Íŝ ‰œOìÙ:7Ñt£ßȲцÍ,WµpHÇw+ċÂçĴj_ġX+ġĝE}9&r B|pY×˙ÎYdÍĦ$(ŻŞNúy|üBSñ˗fÙ\;ÇıAx´ü:rÀ'.[Ġ‹Żh°`è6!K"ŒĦġë3LÒ›WÁqhâ`@DM @TÍë>§ˆ2,­İúŻd.2 sҏ˜ĠZÎĴü8[á8ô½“TéÖ­¸ÛnÀîcş÷ñWĜ-ïÙ¨FVµ]ëyŝï”HÍÏĦ-Żp99pżÜˆ·†Ù,"~ò•zÁ3GŬ›W³n6T0ٙvŻV°X‘Ê}Ċçá}{qï碐Ż/7Û xE#ÖqÔ£;”j–_¨_o´:è 'Ô#˙V‡ˆ} Ÿ,ıڐĞ8ŽïÍëİ÷7tê×UÌp<ö9ìWz~żdÉr!À,ŭJs‘F˘qSħıéQğu’Ú$ôכ_˙vƒ˙żrbô˙çàÇè˙mq{ëŝSDó;ıéñ½ݲ[áżÌ˘èè_Ŭñ7zĜá AA·9ŭĦÏ·ı;½s—ßRhñ‰½yUç˙$ġ|‘ßá܍Ĉ-˙\ċùŬ]Áó„ğsŭos1ì¨!ZtjۃŝùXëíögä1ùß½y;|{ÚÁğYŜ‰ ì}Ó]y+˙NèÍëݸ·û´~”ŭ¨lŭÀ]9>ŝÎöŞî÷ĜšĠ~Û´ßĥ›ÍĤgU#ŞċĞr„ĝ°çŝ‘2´ċh1*<˙Œ,Ö-'Ċkä½Ñâ`qyğ‰BQğĽŬ^[Ĵ”JA[.V)KŞÔüû=ê{óJ*.ŞĦŒòĈÛn}ìÔ5ž³‹µ~É݉ĤP§zJú[ZEßb'Òĵ5áyûOÔ%í÷cTÉĥ[p;wc›ìFêيUÍ˙ 7K-{ġ•ĝo‰ =¨!WdNk£Ŝlî͟_ñ6^ċU ‡§w×x‰Uŝ!}Óñ›Ĵ,2ó"î3Šh˙ĝäŽßŝû§cé=ù›;˘kŸÂÇßäàOd˙Ûïü›|˙Û§W;Ĵ#ħgrzop˜í Ô˘_˙­żfIo6ŭ֝ŭöi[Ġ8Îèĥ‡~k'ĵi?&˙y˘Ç Onŝ[ w—żÀċ’û!›Ú'<ĝG6É'_ÖQ7{5  5<ëĝϋĠpĞ_Ĥ†‡Ì‰0Rħûü9jxÄŭçž˙ŭ–şûM`á†îMHGGóù§ ĉyÛĥAú‹%Áƒ-˙­āŻÇ\íƒ3ĥòİŝasD(Ğcĵ[ŜÂBÛĞyC°_èә’áöÔŜ<¨†´ĞñÓE:äÛĤÓĥƒŞÇÒò3ç[ŞáoíIϞt>V D}Îğ|?|˙ıçÁÀ6=qzWEߘĜŞĈÓùSöœ14’ħµg Ó?ùäfĥ´-H|V—@¤³}xSb£eZĥbŜĝ.ĉH,ۊ&÷G§°’=Vxâ3Íßߝ¨ŝ·`› ñj/WEϵ_²ÌmìJĜ° Ï½ßúaB“ŝsóì9lU4ÊżadzöĜóïŬĥ|™4Û¤ĥá)ı ZA°_é~ttË´Hĥ‡ÂrÄ?$Ÿ…Á \½Xš§ŝÑñ}Ó³VzAm jdIóËè}g˜E”lÛ£l[OdM{š²ŬĵÂ?ĵ…˘·?ôt0çv½ùmÛ›ÇükyGÓ§,sëeö-Ĥ‚·˙3ÑjŬŝg¨o­w…Lœc²ċÍŸş˙Ψ'Ï9\§ġ‹˙„ùéċİÍ7Żż ~%ÖqèžßUnúĉmyQÇŸµCËûïĝİP^ëÇÁb`ë9ïżsy€ÚY,=n·I'£ò1h6ġöɋ¸Yí÷­Rô6ë8³¨°ÙŒŸ=?0Û b;g›— óÜJrŻmjŭìàOÛPŬX%hŜP6öSMŸ‹A}è Hèú/Ûí ÷$tÏ/äp”sè°lÓò×]˙Bž|wN=Nç³§3*gĉm`âi{qG„·~ñKĞĵòT EG{相?ĥÏk8ĵ7AˆâĞĠ;(Ÿ~nq4ü[çiéläŸm·Qœ@XßÌqZY0m‚µ"•oi^ĥqdbĴÍF"˙TgûŞ>Û<­>0ÇÙD5”‘šñ›fĵĥ£gfƒî”;áĥîûLoݏíĞ6şcötw ?mĵ•*Ôżív‚lAPÙG?ßÛÎë8q.ìĠlĦkogă\ˆÜß/”>s°ŠĠg믷 ;üwĜÖ-<\¤ÙÁ÷Ë"`i-¨-¤­0{Â˙mĴ–Ë>ämÏŞ&ÄöÛf êMê÷N`l'ƒË;š'Ÿü9NŬòqKwK’'żĠŭF4Áv’_ܢ0OœÑĠ™Ÿ\ż|k1/g[İÁlĈŭ·ŭEÎ6˜&³ÖÏgiÄĴğÖÍóY4ğß3\›Ewġ§w—!_X77<ÑfüíĴí&ʒĈY i™*JMúeĈŠ`ûËĈW~ÓkÀ,²w LS;ϵ7Ñ͸KzËçŭ÷I˘òmâ†,ášĦĠ³deeßö8X=ÚhWâè|Ë£lDמmQĴúDçS1óÏ΄£KpÖLbég]f|•j3­N6½‘mßşÂhÚ19w~gĵ§µĤçÇÁíŸxƒÛ1ÜΘ{3a ×£kòFbh„‘ôûG‹q—~Á,s·˘K¸Ħ4aĵeĊ€NÑ}³-˙ñ? -Hc[˙u|Ż\í}7›ÚŒ˘ĦlZáĝÈŜìúĝKO‚› Šssó‘ZjŬ kĜĠ~ÖûnvvX&C CeĤ[żĵo;ÛS˙öÔşŭE&j_á· Q’“ç^ƒšìLÖ %ÒÛüM3‰)!‚”´ĵŒ1ix÷N;şĈc>“ŭ(ĵGPT’r‚†íwħtKKĠ·m£?â8mċ6kc#ßŜÛĥí$Ŝ2(ĞyÏέġä_jS#ß·3îEÇÂ[ßħċŽž‡.ly€Ôîšç˘)1o˜…Ï›Ž?ßÈm^úuŬ÷ áÜ3Ĵ~5ž Ŝ3Ï:"™˘ċù·ċ*˘¸¨ò,쵃êÍúŒì@ŽU­Ĝú*…nê:Ĵ{_Ä<İĈÛĥ—Ŭv3ÛĈy‰0 5ÄlgêÜ߯Ċ29ۆò?²Úfs:%P´Ŭ sMQlHá^ŸÉHûgƒÍ–fñ7ĥ•ù ­MDÂ7]—·†µì ‹³Ü-Úv’ÇS‚Z ½iL4ŝç]8A+kcyxmÔüŬ"vfv/ŭ ĞĜ2Áñ’5OıM´p˜MƒáŭÙrş¤x‘şkPD™ ‘m“l‹ßÄ5<Ñ£ŻfÛ̈́ F´Èŭ•²,=ó“çXn-ñżŸ„ùŽ5nyÂÌDş›daĝÊúêĦ݁áÚÂn½ÀŒf[ä*áŒğc7ù&OÒUÒ f^,B]Ħ×ò´íĴžŒĴj˜·¤ĜnÔB·xz²Ğij&µMLˆzÒ^çÈċUäMçí÷H> Ô|ĥŬE\Ĝö–…qO !=uµĤ52\ŝÓIùmŸ Š‚żk‡§Ó \H 7ŝ×ĥżx2ßĠpË5LŞĵġt²j-Ğ^9DĈ:”°ÍŞ8ĦÒ¨ĝMÜdyŸï*ż,2˙’Ë3žžwï–o@œí´ĈĈaàuşén7ĦWG¸/J k“[Ĉ@ Ŭ::²=OPejUĵ”[ĠȊĈ(<ÄßÉÀ‰nôÌĞĉĊ,ɖc^v™™,;Ġ4’kÊJ!š•3Ê#žÁJi)Sw›;OB9Ì"ԃîKĦ‡¸o İëœY2Š8ĉШ#b·’ƒü͘’ÌŜéy…PÚġn}µqI>½Ò^‘TtŽ#ÌK@§ż9?Ġ=ó FWĞš%Żšß•+OdšP-ÈEİV•àìyÉ+=2†ÉBĵˆìŽŽˆ|$näHLÉUͨ%e£Âĉ€$%6äVù¤ıáĵ¨×',šGJä9xrċĦœ'¤_·½k|dĊ)a]x¸ŭŬ ڑ‡5r)á~B[‡ğìÄ?ĉ…â"¨µ&È;/9Cu( !Ĉe³Çlħî[!$ġìQ KŸ† ™%<µ6φ –Ÿŭ7­e]?ÛŬĤ˜‡@_£LÈ^fÁäiöĠQÇänÒ żxŞÀDM°:™•´ç~W“S“òD hÔrmV”‰!¤ñIâúôLa°43‹ĉ˘ġ—Fçxg ppĊ#Ó[ĝ–BykUğkvÜ:á01Š£!¤6ĥ²à€E_1nrRĤ˜Ħ¤?JÛTé9ĊŜfgöêòÑ`#żÉBG:ıpƒ– g7êşfŠÁÉLÂΟ ˜YŬŝÂ@‹è3ášÑòÌۀ°nñ2pçĠŒÍPä!ğYñV€é0qŸíĞ‚¨Û q¸>áÙñáô+Œ4‘@HPT9ü"’.ËôfÛtż{˘û¨Â6$â7lU OüéžJ‡'XñV =/3ú䐐ŝ íIDAT4ë$Ùnŭ'„ ÇkÈCĈèhĦ{ÂqĜôŜQ÷s>O'û–'°ßŠc*ˆK2ô'Ò¨ƒ'4—äƒHÉĊ•ġz,ı˘e%ılÙC’ÄœQ†àÒìÂĦ°mxy:ڃ0ÛPl2@JÙ²şJ ĜAù£¤żä‘Êьé/jtÊÑ˙Ž9B‹Mrg‚…Ċ˙P/ÑÓ#ċ´+­-[ŭ½~éÙy"mÄН\“vK–M}#İ)ӕVĝ;Ú \mŻĊRü\& „hUÓèhÁŽ'“zÌÓğµŝpúÒtK%ÑÖ²²é-=M¨ùù^šÄß6'^kÀd\ Ÿ‚× PxĜ{(ĦdŻEÛF((W‰ß„ cċ k¤…`}R+ŝ‘ïdGp~/ŭ>àpAï’a<ñîŞĤWĥŻ–ĠŠ´Ċ·cƒ’:…Ĵ“jŻ*iëd<\*ċÙçJybĤ”gˆ@F§œö£êılÓÖ"İ‘˘À‹sI H$£JÑ}ħĜĦÖŞ&‘I˙Ú9ÂΛu3Càä~+×Íí>“Z¤ĞFp³­éƒĞ;=G"HʤÈíéÊPWÊÖE%9½7ĤÖŞÂù9§¨r*DAhŜ{”Ô ÁëÉKZ·ŻaÈVJĠ0pXĉ…@q„û Xí#&‚Kˋ~’3tÄ]Ê •ìn30ÂÄVW5ÌNòDÊôÖıÁ²†ID%'w¤sk²äwĊôȉôĈĠèKM {‚sobíÄŞU;ö—aĈħ~í°\›‡úwùšëċ{_kµË×<×ß³œ–гô3êyıuÒŜ—Só8ÉĊıÒ˘ÁڍÒçúO;Mŭê+´Ê ê<áó,íe: = é˙1´q˜f½n. ŜŻá.|œp½c4ˆüħCešĦ ż"a€šcŝ#0§Y:˜[lÁĵM7TT ³ġof…³~2Û$ȉ~×Ğ“Wï”Vó4âlĴ~œ@ µ.í"ĉuTÖÇÏócbÊż>4ĥ€ĉúˆĦ“‚:ÙŞuÁŞöû?ÖSÊ$x7lô,íúZà)(È;‰´÷wBˆÉcêğ Kc'§e x`¤ß²Yé,{*h9ò Àá!`lĜ›=:)5Ï×f–/-(nA‡]qRĴÌŞög×}û$rh[ä=…M>ĵRJĵĝ˘İġ™î,žÁ[ö.\}VħÒ ½Vĵšcï §7˜½'%FŻÏViJ£ş*´óҕ£2D'àn:*Û&ä&í<„-~ ‡|üj“rm}^ÁŞşĉZüìwUücšŝïßşşŻ=İ{“Ê›_6Lŭöâĥ06nßsœš”ĝU.W6˙Óïŝ‡WÎs a4£ĉqğwŸ„š)*§]P ‡Y~7–ƒA•tíŒıy^BY½C T€XĦMfY>AAù€ċhö”?ûs§Ö`[îŭµ{îĉ—îë›Eœ˙@XğvòM£ ‹Í.tHğ•ò@žUĜúa^D"]iGÇI[×ĈLWîĝ˜ċDWñE;ò•?ş——ċßK÷éžú×/·÷á*ĦÔ%=ġÇĝ}ċÁ¸²Öoş w ĝtÚé½8óaқ7 â YŻġ ™ÔŒúé~ÀŭSˆÎŝ¤áQ3ŽÊż?ĠMó²~ş_‰ü…‚_ŸW?uËü zŜQŠxĤ<żIENDB`‚gamera-3.3.3/doc/src/images/color_ccs.png0000644000076500000000000000255410714675724017242 0ustar chriswheel‰PNG  IHDR2aç,sBIT|dˆ#IDATxœíMN#1Fçñ ‰eo8 KÎÀ’ eÓK$$vPf1rp —]ŝ+;“ïIÑdҍÒnÛŻír§Óéd@‰?³/p[@:U €*@H  ¤PÒ¨éTtŞ@:Uîf_能ßÏïŬ÷6ñJHsÀŜĞë&”MÄ#çq·˙˙Üܤ+ı ޳˙UÔö„ š'cĉIg³ż>Û^×m#T8!ÏŞĤW^8ô}-×˙AL8Ğóıı¨x œqT’%’ŠÂ݇ÍÌċlŻnéQ £Ku 9”7ډ ÇÈüà7‘¸[ÈhêKĉÙôÇ}oç× \h‡áŒcJžÄs;\£€ œħ ÉÓéóŭy9|™÷ÓìË7JélO.ĞُĥZ4ö'fñìĝ)„½ßES éy~^ïW7ROÀkY*~9|]üËÑ"ÒUĴZJw·—ß³ıġîwްm‡äÚyˆoËÜç)$mğ7]’cÂĦ‚)Éëá*ÂА\’\ìxĴRRyZAİN6Z<´wœh(ä“+ìšDß)·12ñäêXĞĉÚı1żÛz*7‹ÂI‡+żVığÄtr")Yħ’T„äœ^Ä*B"ĤĠ(Ž„ÖĵœÚkℓq·ËÔ]m.Y,ċ˞*żÖ½é2½â¤B§TÓ+jù°˘>ì~qœ.§<BÙĝ÷ħJ ;žŞk&ÉmΉ:áûéA4ŞÏáb?´|t4#)?7z9|ħÇ$Ó)=–ÛêŸħ\ĥċT;7FÖÖ6ž*û ÛéET;ʉMĦžŬ–1—†Ż™çĥ˘ˑЇÒ#˜\SV*ż#*™P>{Ğ4„Ûr§b;!Òv=[8Ĉ $K’C4ĤLİŠĦP³''6êY n´SrÎè2֊p·ÖlÎU“ıí#á„Ò³/HÛµĉÈnèôÊÔ²‚ċĦ£Òİı/İ€íĠE§ŝ³•äSğJTJxOö7ËŜƒ–kh‘KŒUb=RÂ6^2z… ´§’CÉ+äàH*"Ğġäb:劉ċò„fN;ìŭ~~#ŸR…?/Ĉ)ŭKĠŒdNFtäRzÓ[ 7ĤüFÇċYiçµVG1şKĊoJXí“Û7§ıRĞEéHb6İяĤdrôj”+MĞJ( êjŻÒż·rÉ|5$u%}cäâˆŬŻ ™^µî$—Ú]’VHIb•”•F2SÒċkC:Âİ‘Òj# ¤/¤ÚuË´1&™âYĉ³—ŽvjÒÄcÇ<ÒÊÉċê̠ד_""INNÉŭ y9ĈÈÊSRĉXNN$Ħ˜xz?@5'ĠĤW½H™? ĈœG38s•B;šÖêUİph"^—kÈH†;Ŝúŭħ²ûs —Y>S.ôaȵIÉ97Ú M¸et­ rÓŜĞÖXNŒšŭ(žÒNéŜOX9\‡ÒŠép¸Zpr•ĉóPñHƒŬ-{Ż8fl~Ĵ6éµ4O‡›NıíIô}1š1;Geó0c“ËŜII#\=1€Bù´Çü €€žÒY& ¸ >,4ĤÓ:Ê1ÒDˆ{ÇÄt v?vM¤Pd€*@H  ¤PÒ¨éTtŞ@:U €*k—á\œ IENDB`‚gamera-3.3.3/doc/src/images/console.png0000644000076500000000000004077210714675724016742 0ustar chriswheel‰PNG  IHDRi¨˜ñPLTE   ! + !  " 8 B N2 *. ) B hN,)")m6(&-5C$E"0A+f $3B-3\#5M23/M'0‚ƒ{Œƒ0Bn… CEB.Fx@FOJœ1L_”)YB.\]g;9%MaB'~7s> f5tŸ†?Mq;QƒBHĴ8S>SŽ?”'–uJWVO(_ħŻ3;‹/ÂFg\[]ZC_œ•FHGa”Ê7HbŽš7˙ş6RNfz‰Y">eŻ5s‡.‰)rĥGe޲K-uİUg­:—€b@\ksHjżMk°¨Y Qmİ›HÀSoĥpojYp¤›c>bq^q RÇVt´PŠYŞQ›;ˆĴ/ŠÄZzşÇ`!ëQ\}ĥi}­rg~şÔN•;›Ĉm&~lƒĴ#–p„§h…ĵ™gŬ˙LY?›·q^rƒşG–Ŝ@³WgĴÂz-ħƒ5­kÁd“şŸ…fÍcŸrŒÂż|H݆Wy“š™P…Ž˘Çu}’—€Ŭl’âvY›’†{ħUH³×†˜—™–İ‹ħħŸBٓ2Qĵ͍ ÎĤChıĵĠ“ap°Ŝ¤˘É™iم³z²Çן7…Ê ħŻ•âÀsÀ§ƒĤĴÁ”·ĵĴ–ŬŸ‚Ĝİ`_Ñײ²Şĉ™§¤·ÜŻËväĵGĊżŞÀ½À²âħ¸ÌӋ×ċá·§ĉżqş›ĉÀ}ĊÂכĊÚÖİéııÛıäêµÔâÜİÒíÙÖÂÌÒêÑVÊÌÉÁÉòÚώärñÀşÎÌèΗÓÑÂżÚ̸ÛŬÈ×ÍÑÒÜßÎÖĉÔ´óÊÌìĠŞŬÖâ×Ò×ëëÎä¸ëêôĉĊñâġè™ëċÈóáÉáîÖâĉéàêÚàċĝÓì÷ċçäöêİùßŬ÷êö½êìöŝû†îñúèùċçĝûóôñû÷ÍĝöŬŭùÖû÷ëûüùûŝ˙˙èŝ˙ü×@Út IDATxÚí |TĠ÷ï “LÂKĴEú„l$yݨäXÊÂVP#J‰(š­bq£nú°´@µ—n-¤ğʛĵÒ.„‚VîB!ÊŠ–ÂÄB “ı÷9o÷uîı3ÌL&™ßïœ{ĉÜsÎ=çŜ/çŜsçŸ˙‘NPI”8qĈè§ûĈwìT*xçzµħğÄI“Ö9ä(˜EU ­èġż~ÒŜygĊŒƒö²Eœ´ħċ%%%— Yi–…Y°$\0Î&[uPĤ3l‚İzPjŽÙ3´ ÔĜ‰ï²èeĞ·6ÜH½ÍĵGQíÔٝÓWaĝ2‡+hıÈ$sIÉĜrNš- îS j҉Ûé EĴLmè Y _S0´\ Ĉ†ÊÂĤŻSK£f™‚=p!-³Ħ–è[àÔÛÀé4ħ39\˘ż(ËÔÀîú’c0Òì‰"ġv2XG÷]0êòċ˽ZOÈA§,™6­¤`IÉ4Cl¸9m¸–ĈbCËIŒT1VFcóil>‰ £ħ14mL)•:ÄĈÒĜXsŒïEc³ÔĜT›Êb%4V1VBct;MOsQ–Ç´òĥ”šbcmZïĜK£gcX™vôXığólı2ŽWP•żúï8Mê:21İè²FÚÔİcˊ‹‹ –D -”…XPjŽÙcƒYZPâ.˜Jƒ"-V\\²ñrPıòayqxMS‹ée§ş<¤Ħ‘a;cÛ}ó²;‰áO{ß%jàŝ2N-žZàH4İïĜvY'Môİ(‰;Ŝ˨+8À…ż<ĦWµÈpi‡–8ÂSgrYI›I?—íI›Éê™i M4¸ˆ0Vô-”İÁPÌׂÒpÁ0ğ`–9(!Á—A‘L£Aħ}œ’;–D'/rVqä $4pÑHkN„óİÓÏvĈùl.-Äa!í²;ÒHÊcŞ‘4ş€Ĉ÷Šğ';mÍĉô'°X9‰ġ-'ħŽħ2+£ħù46_‘“2qâRSl˜96Ì›Ec³´X •„ĈĈĜsĴˆĈŠŠiĴ8RĴHQúġ§hïÏ+ÁŭӊĤ]Ŝ˙‹kÁŭSŜQĵ^T4˙ƒk4ħˆ&NáYf…­yšÚ‚16ís쇵ż6çĊrÖ,çÔpîġXĝĞUn,F0dƒ£™´Ë—ŬŽiZ˘Í˜Föˆ½WTÒèŭ“µĤˆĥÁZ[Ê4ô4zRú†GÎ%^ÎÈÑ >ĤX9À>, *ŭĈ=S^NĈse_Wvĵş²ĝ¸òaùX%8|Úµ‹c‡|~jlQbÓoúŬĴ/Ía½:hnûሜ#hÎgĵ,ÜĠbג_Ġ%‹TäĜYl!M튁4–:ӒzAÑLĤç4+ĉdéዌÄGü?bŭ_Uĉ€×„h,ĈG–bcÓĈí /Ž)*î;´4x5wZ0˜;ä÷Á½‡6)ƒŝ'ĝÜ1żW••˘Ü‚q$Ë|’%BÍяh%G´aÚYf7˘™ï!.@ëk]䢉âùˆ>ĵ2z]1i 'kjLFÒ._Öö]1Íĝ{˘ 6n‰K,ŬÖ˙÷ٜ27 Í ½,cÂß:hÓ\ WÔ¨üp\QIİr1·hċH#(ŭ6ĝ!E„´7ƒÎ_¸|e$q\QÑĈXğúĤ™ö?Bô·NğX_ËĜ6ß|î] Ĥ[gÛĴ3•´+ĉ1MfI7È+6cš “í¤Í7ĵ(*ŽuêYĉîÇÙîĉ÷†·%1ESí'żP~ݏ¸4x1÷Á× †(Wsé¸VLI+&¤ŭ68wAAAî#4ħX͢U@+35ĥViŻnÜtĥÍİ û‚-Úݧñ%ƒqFpYĤ.•Ħ4ӓNšvĤûiS‹§ uùê6ş—ióM´ +šħĜŜ£‚ij` íOAċ‡—ƒ§r)\ż @Í7’ö eא˘’wŠKijRKħV_T-pz£ĠÙpñŽñm‡›W·eÓ4ÒB‰&U'ÍĵïŠúkŭÑmŞĝƒž˙€ÁcôŒâáZš#?ƒ„‰•ÑX™FccçĞ1úC =ñö1ú#NñXÇĜ,šoV1˙ˆ^W#= oòùOFħݏW8ÎËCsç7?ĜOÇ4ċ”JZ°ï#›._V.šA§ŞYœëÇĠÚÂZ56lëûËbìĵ Óΐċüı96WĞÀ6ĈôÔİü§ÔG@˘IĠH³ìSIĞŭjËyí÷tÖàq.~T·ü²>_ JC^żîĠ­żĴÓ hh߂‚á3JJg)˜9$·dVnnIÉÄÜûKJûĉÎ(3sĉ¸Ü!3JIâ,=‹MÍħµÏKŭëü(~m׃qKbûŬ}Yè•żĜM*%íƒ>vŞûÈN’\0ĥĵtvé¸%—‘Ĝe³gÏNƒqĉĜ¸%׌eAı)˜á”9SÍÁ ›Ż3ÈgviİS0[ÓÔ³Kfˆm×Ĵİcg”Ò8Í=ƒe1WÀŞŸáÔk[ì§N[NÎĜ%ñ8íl.( Jg“+]Ê.<9Z# Ѥ~@HûˆFMz™ĤPĈh,+--·²ĴĴtÜJ{dY™H³ÄĈħ|,m M[RĈ+(§ĊXÚ4ö¸]ĴœĈÊMħ46#úX‘&—>3ŸÄža1šVJc4ŭ£âi³KĠ4++S÷–iiĵlYhY–0zŒgĉ›Ž;:úa9‡=Žg\ż2–Eş‚ì"³4Réìg@˘I¤}h5^c‰ä\“N”•=²’óç?²’œMkl-s#ġ͟˙ĝ’˜bÏĜ3–X9•G+£ħ2ğû”iħù$¤â1ë^§Z\·e‰9fî[ŒgèñeÑ^‡ĞZF³Ğ_à H4İ„´ Ž*`‡*/dey,Á,X9X˘ÏÄ' Ÿò²r5ĤeNAŒ* ş‰ş ĥ;#X#.öÒŒŞŞŞ‹Â“œŻ%›“÷Ò¸ĜpVÎûú-t&-óLàh–ĥĦežïR§“&ê‚Úŝ˜öTĈ(˘U!:ïžko5šlvö÷Ŭ²AÛVz8ï;îLš—ÀèÑ6´LDž†'6QÔöI[á9i[ŞßCöÇĠĦmAŽĥĴĴΚwk š1mµ÷ Ü@T µuÒηŸp"p ôv4sòöÚ/ŻbÙ|jHÇݜĴ%Xˆ`ċ|;ßЁ¨žÓfgµžÑê‚Ò`îIî_ž/†Ŝ=işä¸‡ċ)óeĵ0('ÓçïFnub£ŽJŭ²êv´·ŸÏ=ŭÚÜ3÷î:ş9ÖµIÒâĴ~áCv¤i˗E(ä"´l^‘¸<„1- ­žŽS %ċî A iHƒ 4¤í† Ä c”üğ§ÒBbŻv)jmHƒEšù›…´Š¸ ¤/i†Ûfm%­k’OŞû]iVÒĉΝ;}útzƒUXX˜'µ*Ò$W§bW˙y;îŝ!9-ğ–ZöH.OŝĠGîi!¤Ġ¨ŞŞ¨(”ÚŜŬsĊˆ&ċġħ+ĊtÄAĞÒïî™™4½Ìµ@má\İ…H{ù›Ŭ_%›y…Ŭ_`¤-}Ħ‰,–mô¤-T” '‰¤í‘~ÏiyyyH›n  VX#j×KÚêéŻt¤¤µÛ\½)ƒ‘vqÈ-{h)ëVĠëyyżûMĵĞÜ÷mEYÒ3/›l”ŭ½óĵ_Ìğ¤\™×}à_ĊĊЏt͛ܤ×suˆ÷)–ġږv¤ċċqÔܒĤ\+TŒ¨ı™9œU.ĈéîÉHk?ızAq÷\›9ıQħÙZ‘Ŝö|û³îiT.ÒĦëĤ·ùÍòŜ MÊD>ĵ-4>|Q}RϔEŠ2iŽ^ϔEMA)–uĝ,ŬHË˨…!mó‰@àDMċµkĵĜ(ĊˆZUdŜĵXqö7q$m“ï–œÍêsÚĠùÂğ­ċÊ7J,<_K7Ŝ&ċ*!àŞ—À´5ƒ6n‚‹™E{ÈݽžŽŸYïž.çMż·yâHšŝ7wâĴ˜P‹ĴÏVVĵy*ޤ 03ûÛ*iÁù{8³n-WžnÉż•_5²êÚódŒÙĊÇ.’?8üÛnĉ°ú<§ÖUH‹t<_Sڑiî\˘İ×(k£wQ#ù”ÍMÁwÈg#Á²I CFÁşËה•d ¨¨hZWQy5ޤùĥĞÏiŠò›Ŝ“Ï(6[‡+Ÿy‰§ĵ.yèÒ)í9f‚ċĠ…ŭŬSÓÔz|ÊU)–uĴifÒ\Öהéô­ZažxŻFI;żns|ċ1BÓöu›ÉĤ‰Ü,›VV6mĴĜĴldrJIË|£zS#íêŭ·üŽŬ2-[Ç+ßîxy6Ĉïî>Ğ\y‡q2ÂOpĵž{ĊsšZOŻ-‡Hע?žrïf"-@1N™†ÚµµU•s§ÖI[Ç>o^e •JĊ›4iċ›ÁŞŞŞĈßč´Ġ……Ù·Ĵ^½0ÏŬ[:ÌËûˆ )I/*ÒÜw Ù]ŻÇïżaAsfĥç†ÉäɝaÎonY=‡Ĝܳ;{ŞġìÏĵñ°tkôÇSNuiJ+Òj ²#í{2ˆ1}PKP œĜMXÓIJÚĉÀùZBZ°‚’öğ -ħ1žwÏx½ıDn^û3âv&ĊŸĞv‰âxOMhL#ÒÂÚr!͍Ԟ ¨ŽT½bGZFcZBĈ´uñžċ4ßċʂ.É;Ġ6Ç[vGúVa²ƒĴ%m/FS9cħuĠµ'ŽTڑִħrݲRy§²‘Ì?$Ä­‹ç[Žx‘V–íġ‡ù3îJöñZi'Œ¤‰ÈŞšuMu'Žlĥ#mŻ<@f{Éd´ieEeÉ(w6xVCéĴˆ¤ÙĜäÖ¨Ĵ>Q¨ĞSIsR%™tÂ> rGZáôıÜZhôèéLÔp¨˘êĉşşş³aHÛLnšgŻÂrMÚha—VXÈ,ÓòòşvíôJ­îdÒŜlR‚ç×%“´ Q‚QߐxÍħŝ’kıëËw½ċŬž$6j4ĊFĉÔFQÔşv"¤ĦCÚÉÍR Ù§­Ìoڟ–Ç/V•ïâP$ŸbĴ”q[î§ùùùQÖï^іùWFlË÷ß#Ǐ|Ô9χǏüëdWŭ½Òŝ^ĜÙi4ÒµS÷W69K•R¤íï£\ÌcÚäLı9/OXÎhMıü¨ëw+^nĵŜñŽÇÉw‘ïÁŸ*Áۜ}ß˙*Êğ˙n·'ħ¤Uä5še‚42Ĥù§żRµ÷$-µĈ4ò˙5(ÎĊĠ>MÎ Ëi˘\~ÔġğT„úó“ï"%IıÏùà´ÔĊ– ß2)hìI-/ iœ´“)AÚ}ùùŽìóò€ġ?äĈ Fzz˘òßهŝWŝxüH²{}ŝ\Ÿ˙,˙ŝh“–ϐžß‡‘va|>Ŭ/ʅ”WëWÏĵ¨ï‰üñgÉ­÷×êVË÷áÈñùƒÇ×)ëǏϷi‡Ö~ħ_+Gväç?¨·—ÜôĈüž~WóĞíWëQóYë½­Žf6œ7sû•û~Ò¤ġkpħĵİżúŬVôOëáĵòE&­"‚ĈIiÓ_İÜNA;vlC várŝ£y÷AÓCŭm´ƒù~ú.},ùÁżñSœ˙û>?ı܇ÜAÈUŝÁ³†|"äccbŝĝ?_ùé³z9kyµœzĉE}ÁÛÈé½ĝ ĥĠòŬö{…5ï&ċJ%¤ZûĠŭġ3B.<Чëßy~µŭz=<Ÿµ^12iǵ´_ıü­>żdġ‘>ßw6´>ŭüqİŭSÓĠónÉ炴Š:iüŜùÊĉ½'OR‚4Ò5r*~iĴ`=żMüÌÓÓ{u0ŭNRò•+tÖ°ż1Kgùòy9vjĠr–òZ9qĉµú~JòüôMħŭ_Cŭäs@/ü%_ħi‡Ú~ħßİŝÛ~I'×Ò´ï<żÚ~½Á”^íȏkn?k÷ïó[NòúĤú çOk%ퟖ.Îğ5ŸÒ*:ufıô ‡íĜħÔ!Íúž‚Ŭ´g.úĦ]ÏWXp1Ÿİɐ›ó÷1–3•×ʉkġ]Ì?Ĉ´ÙĥIÏGĈŠġô˙üú‘ßùqbÓÑ~użSŭ~<²ÏwŝĴ³˘}·ôWĞGä³ÖK‹ùúİıŭân·~°~Z-ġéíVÇ4Ŝ?-]TmÍ犴Šĵ3wÚ^Úħ ]S‘4q+UOĤ6&İWĝĴ5Ÿ üWË\l3Ĥݤi·jqĉĠúî{–OÙÈöYCŭïĉç?J/q~Ú&K;DûĠŭNġ“Ç ëë´ïj?ÔöĞġ¨ĦŜû~mšú˜ÚOÛŭkñ?íĥ³–vYûОFŜ?-]#íl”3ż§œu˘œ@ۓš¤‰S¤žLí9Kò­É,˙żùxú}żü­ü ‰^S.Ó·!Ïi*i·™Ñê{·Ï}l Û³†vÜöİÈŭip½4½\yżĦŝ³tżšïÁk­Ázşö]ä×ÚŻÖ#òYë½@o†Iĥħŭ4­—ŜgJÒ/4™ê3çWO÷§ĉzÔŞ-ùܒVXQYñ U´=otkyÒ~0>üĝcĦCÚ·Èüî|Ž7r$™N­Ï?›˙ï ™[‘9Z>s‰|Zú‡ùƒ˙LçjdÈï›xıòjıñâÀj}äîô ¸{6Mßê+\OÂüÁ!íÚ/öëCi>ŸòúI3Ĉ?úg=]ŭĉWÛŻÖ£ĉ İ—Ì GŽkh?+ġ‘G~§‰§>Ğ·;¤żŠı"ŬpŜMù\“VYETYYµ]}F# iĥoŬÈmèË­˙µ1ßd û°O<ëOT×Góž™?†]öÏ-i£ŞOÙ{dï^1éä $inÈIàE÷5óċ˙Yı²~p<ëOTï‹é=³ËŝıÓv×Ġ¨;y²Îڞ7şĤà˜ÖÒÚÏŜ—F ryôÓÔ7ĥ°ĥÛ­\ö/4n¨§Yèİ–{†›gzyœMQÒ^Ŭö֙‡·,ŸCH{vü÷Ü3ċŜAt˙i6¤eï9ż@:sĠ·èhïàĠê”óg:ĤEġı-Ärïâ×B*vĝĝá·Ö,_ŝô?|íÑ'î™2eÊÄaCu˙i6¤Qż÷ŜH6ĞÚT.ö÷yş½­´÷KŝÎİAZˆċŜ à H;té½·m[³fùw|bʔ‡ˆ& ×ŭ§…İ:¨\e“Ψ_ÒîËÏ7„ĥËÄô#­ŝ½CT‹§<Ċ4iRŬšcĊû÷6]Û ÑÔ´ú›˜Ii˙ï{ïŭÑÏôÏKçÍ# =ùäŭu˙iŽïêîġÄèĠ¤'i ³Ÿ˙èG?úŝŠ„µyO>Ùżżî?-miéIÚÏ9g?úçïo]J4 iŭu˙iiFÚG -qïÓŝI€FH£ƒ½yÎĠŭ§µ~Òv‰5QܐöŬ’ö##Mܤ͝[A¸˙´QQĝO+żğ ¤´0¤U8jœ4ö[A-IˆÖÚëAiéIÚÜ$&È MŸ½˙´ŭŸá}H GZEmí ŠÚµÀîÊ ħxÔt2%OnÑĝOë8Âò‚¤43i•5µŒ5%°ğB,R6jzÔŝÓ‚Ì˘¤4gÒÈĊܽ›PvÏ%˜bŝÓêZƒ˙4¨ġ&4·P“ŸV—NŝÓ Dß=ù_ސÉ@žÔİk%-˘WĞ6ç? JôŒ ²’żFç—üşRĜFUTí% —˙4(Ño9**hÓGċu¨ÖşNeó‘6Ġ J!ÒèÒĜ£i’Ÿ²6—’vĉäÉc Ši5ĥûèÂĵjŝQÂÚ1Ċ“4Ú¨Â<2¨1ÔȐĥÖ2†@Z%˙Y'­Em:skĠr^­@Z[%MaCšFš4Ċ•4eJZ×N…ÔÚöġŸÒÚ.iŒ5BZáhê?­rûŜc-é? ¤µeҘ˙4ĉ@móĉ½h{6tiPœIĞĴĤ?KmÖïœ-ĉ? ¤µiÒ¸˙´́ìĝ%bLÛ͖$;YwòlşĝOƒZ†´;ĥĞÔ6l¨aLƒâLZúOƒZ„´d ¤44¤4¤A ¤44¤4Ò Ò@Hƒ@Ò@HiHi ¤A i ¤4¤4Ò 4Ò@Ò@HiHƒ@Hi i ¤4¤A ¤44Ò@Ò Ò@Hƒ@Ò@Ò Ò@Hƒ@Ò@Ò Ò@Hƒ@Ò@HiHi ¤A i -]5Ú,%Š4ó7%Œ´€Z4Ò@Ò Ò@Hƒ@Hi iHi ¤A ¤44¤4Ò Ò@Hƒ@Ò@HiHƒ@Hƒ@Ò@HiHƒ@Hƒ@Ò@HiHƒ@Hi i ¤4¤A ¤44Ò@Ò Ò@Hƒ@Hi iHi ¤A ¤µzÒ*@” Ò*%4HƒM ¤A &M€ҠĒĈ@ŒÂŒ¤aFÒ Ì Ì@fê3݃İIDAT Œ¤aFÒ Ì Ì@ZzÎ@””Hƒ@Hi iHi ¤A ¤44¤4Ò Ò@Hƒ@Ò@HiHi ¤A i ¤4¤4Ò 4Ò@Ò Ò 4Ò@Ò Ò 4Ò@Ò Ò@Hƒ@Hi iHi ¤A ¤44¤4Ò ÒZ;iµ4(a¤™Ò İb·Q i ¤4¤A ¤44Ò@Ô IĞi -¤U( ¤%´ wO–Òh ¤%43†„Ò0#€0#€0#i 33¤aFÎJÉżÂŒ -’fŝ†”0ÒRóoĜ1#i˜@m‡4ÌÚ(iyâS‹”HÒò¸R‡4ÌÚì˜ĈAŒJôs 3(á3‚<Ì 4œ{bFÒ0#€Úiĝö6IüÜBI!-UŭÜBi –LU(Hi ¤4ÒZj’6jÓJ!Òd¨- ¤AI"Íòr ¤A‰"ÍôcHƒ@Ò@䖴<%ƒ4͸¤A‰$M˙ƒ%4á4(Ħcšö‡Ċ ÂÜi JOҚ˘.qÄmĈF 3iĤ?Xi¤I61£N]–Ûğê}{5ÜžŻ{êÁLŒ¤µB[ŽĈXUèŝÜúù²é_#öċâY]“vŞG3 ‰qLkċĥĦŒĴ˜#xéÒ {#eıxVפÉm4ióœF°vöôĵHc7Kŝƒ–Ŭ½ÉÍ˙ëîÏċµŬŭ7ĵF2=ïûüèí];IiŠ˙E-#ËĊ³Jòı̏ċŽkäßr?ŭÈıì€&­Hûğ=Èâħ‡ŻKrżÊßğ$o<&酪î>ÓĜ~‹,·;(·;.7œĠ2²\<Ğ$÷](Ë÷·ú{ȧršËžë hҊ´z³PÒĵú“TÓ'4Ç%yĞçsFK‡ĊÇޜׅäXÑYî÷žKóSĥÙhҊ4ٙ4ŸJÚÎÛGMç9VdȌ–£ßôŬrĜĥʎ é¤UŞÏĵÔq[Żmaʂ4ĤŞ£ú"˘ƒ6m%cÓi/} k^c[ċĵoÑ?żUžĝ°ïR˜²çşšô$baÖ½êÁwĝ“—$ú &Ÿó-úcï ĵáŻòNBËt›*ŸÏ!lġ“–“ğepe·> hғ´ž-ğ÷‘ç}7,t#Ëûĵ/cıŜîów{Ûn$)}ïj–WHóÙ§sÙ~šĥKšdÒÁL,ğÇl ígssƒWcäžèΑħìêÇÀLúŒi‘Ôo֔?ìiüäÎڜôëÑÔf.;˙s0ҜµŻğ×3PŸt6_GY¤A ¤A i¸8 ¤A i ¤4¤A ¤A i ¤4¤A ¤A JEÒ*@” ÒĜúk J4i|Ħ?%˜4ħ˘$HƒKšştiʓŒÑŒ#‰Gâv„èH ċĤ.iûÄ_r~d˙'Á­]RŒ¤Ğ–\RŠû˜–ê3‚ĉĉf‰|ä‘VEŞ|ŬyC´#†U‰!­*ñ¤üŒ@rèş”°AEJ䰏&'€4)á¤ŝŒ@Ĉ]Aîìé˙â*)ߙħjuvĈYuċ(Ü8ò5ÜïóÜ-Ëçúûïĵ¤ĠŬ<2·’Ôù£¸|<+KU³“†JèWQ5?ËЧ¨n'EcBnp=İ^ùÈ=0ž0EáŞ—ä^ÔaMÇCĈöpÒD×D—Bûħ³g^§ĝ“Ö f‚4ĉ ò\ğ-òQïG:iw۔uç™a=dáÊħğq4ĉ{hÂ_›OÈrżEò“k.%…›GVÇŬgši"+ŭĤf'; •Ż ˘jĠu¤Ĵ5ÊàvRì i¸Áġ¤JZä İpx'ÂU/É+H¸Oĝz+i]] éGCĉ–Œiİ>#0Ĉĵš­ÈĜcG‡5:i—Ĝg)ólF]9 7ŽĈ|íıG˘ÌKòıͤpó¨ĠÁ"ĞdÈ.™ä%„›GêV’ĤLòŜrXÒ²ÒTCvC%ôШZċċ)˘N*ħ3´áşëÉPÒ{ ’ô&›H ­žÍj²T—oşŸKI;˘KĦŭ )Ğ3#h[ż{š\@ĥJĊ­ŭRÄ1o›´„´¸€l…Š_ÎÊ˙¸6IZëwżì|Ei°J'4¤A ­ċI3éı°ìƒ%H‹‰4Éá›äғ´‘ T᪃´ë'ÍEŒn ͑4uA2Ġàé “=n¨Züéı„-!{§Ä Ìŭ FŠH %ü #=ĠJÛ0Şz.ħ¨5‘jĠ§›û!J·¨áFzŞ• ·aT-ŝô\bQk"ŬŞO5÷“ FŠH %m„‘žj%(ö ‹?-—ş¨5‘jĠ§›û!f"í´Ĉ0ÒSíŝiÂâOË/j­Yġéĉ~F#E¤é6Šœ!a¤§Úŭ ҄ĊŸ–K]ԚHµêÓÍŭÔètÒL¤ E•0Ò&{ŞA ·ĝ3ĉbĥ„T˘€ÁÜϰĝ5Ò˘SˆĊ_뷆iİHšĠâŻġ[C‚´Ô$Íjñ‡E­AĴ†@Hƒ@Ò@Ò Ò@HƒBZ­A Ji4(1ŞĜmTHƒ@Ò@Ò Ò@Hƒ@Ò@Ò Ò@HƒÒ–´¸8v<1JSÒ­ŽƒB—nıż/–@ZĞY;ĥËKŬBîˆŭzWĊ+Hk=ĞcÇFšt}×[ŠW>Ö:VÇ6ĴRM.ŝlN5,<­ùĈâ‹K“ĜZß-Üéí*ÔĵBĠÛ¤ìµqál*7‹fhXĠZŽĵ2ĥÒZ‚4ÓêĜ†UŞİT—ĉTÂÓş65vÇħ'ŭKÊĤU¨y…Ş·I²×†…³İÜ,šml aUk9òÊĜ;@ZKVoñi\[uùhN5,<JZ½|.˲ŜĥiéjZĦêmÒ°ìµa‘Y*7‹fhY`ÖĊÚŜ ­%žÓLŜ  `‡T­q M‹_ÛŻB-*Ŝ& Ë^Ζew‹f›hY—3âÚŜ ­eH3xƒ4-m³Rµ•´ÓVÒNwĥ·­Ż--*Ô֖֗½vÓÂ/šmòIiOšÊĜ ­eH3xƒ4.­/ŝl³|6[xZó,İfŜĜüäëzÛúÚÒ˘BámÒ¸ìġ%ósš‹E³Í t Ível<§µiFo†ċ£ ~C—ÏĤR÷,)—–<ŝɟY×ÛÖזVW·ĉŜ& Ë^ÎĉsÏȋf[hOšíÊĜ˜{ĥß=]^ĤŻ/Ŭ&½Y‚´ˆJöúÒmԛeZ“ĉnáèdŻ/ŬF½YÂjiHiHƒ@Hi iHiHƒ@Hi iHiHƒ@Hi iHiHƒ@Hi -TMqĴĞáHsrË6Ĉ´ ¤µ„N]Ĥž)=·è·û_ŭnÍÒhYàëlĜá↲´BĞyu+cÖıovòúğ½uŬŜä@š“$ÉéKxċÖËRss'ô’tOUQ6âİ[µ î}[Ş×ùzÙHzŻ›Çk4è\ûĊgßém+[;@ZÜ@3Òċž´sÄ5iĜĠe+z=mw¤Ì…?DŻŝĤŝĉCÄx ‰s=Š9iÜ9³‰4IZ›í‘~Ĝ_ġRïG{zIÏä=½7Ž½‰kr:GV=BJއGĉŝ‘Ŭrèê39ó?zSǏb³óöN7’Z{Mè­BÒ~›Hœíġ|)Ó#JËnÁÊö¤NB Ë7“ÁjâB›#(ÉÙp×NŜ‡ċŽkî÷Ŝ-ÔAƒN8İÔ(œ\ÜY‚´8‘öż—<ä“%ï{áä&)GnÈÌ9ŜÔAúì\ğÎۇ{¸ÓŞöü*Èï÷^¨y’4jKÉĊŸ×E>-}iÏĉ¨›?ä—Ÿ$D´ğexZ:'}Ĵ&Ŝ´\^qĞyä RöÔŜ7u‘Ÿ ïów–Ïe] =ž“>jÎ]ÔL0kvÛGé@^íÁMÔŻ;ı4ş³iqı{JR}3˙Èróû;Èf…DN9!mİôĜ‘˙”¸_Fꏏ–íöB³ĉ=M÷¨VyïBv§ÚšUOù‰MżE;vşĵ.ï;ÒNuĥ'-*£Dj:),!™µĵ |7~Líċïu÷zm2w4žZiZ¤5òĉ µĥoH‹û;ZnĞH"ì×£9w‹jµxNû=‡ZÒż÷8•ó™Ċ°‘ŝH•Á3r[>n ËıBÚ'›r·Ĝ“QâMËea É {ċ,ŝ$ó–7ŝHŽğùŒ|N3w4µ­|kh‘ÚÈS½=_ĝĞqßıÎ -ŜRM3šÉ“ú—™İ+³)¤ âNò47+ĵyĊ°Ñ*Î 'í\ĉcúŒ ³yQŽHZd£DĥZ7·„d†–ËÍmlI\YnúƒÙÜÑ|óÎ0µHk¤,ĝfvÖۆ}͐o [EúüÚG 6…ú„€Yú&OÉfĈ0wOY^í9dӚ?İî˙XÄğ§Ñ(‘šN KHjíHÍ4hÒÖr7GMïm6w4ß={XFYÑH>Ħ5šy€´<ĝ “Ċ§ċ†Ü˘Òb|Ñ˙ŝˆÔqy‡C²Ċ°Ñz‡š¨ÏèO›A†=iQ%RÓIa ù~c§s2’ "Ò=sTsÇğ'mšıEĵ‘²yĥBïž]@ZÜ'ÜV‘<˙[(w|L³)Ô&œĞ^ŝÇôÌ"K˜·ôáÇò–“—,3‚˜Œİ餰„dä÷àI½ÖȟĵÔnıá?‚ñ-G39ú%S‹´FŜıùd' Föm}¤Ċ}BÀŜh’ Áów5Ë+<ġÂĤœŝĤ€ZÊOeĠËVFğ7·žġÚ˘żı½Uüiz··Í¤Ċd”HM'…%$5|ìġ0O"ñqŜ÷Ëâ }s›1ù’lj‘ÖÈov÷J7½Ú~´¸Oš4˜Ŝĵ0ĥŸ ÂĞŒ#iġcĝ 7§Ëçrt†ôġ%mŝç -ŜriĞĝòÛQdvŻ6·Ö:Hƒ@Hi i-£Tñ éJİÖ8ĉŝŬ[R|Bêf‰áŠ;ZĊâè1V  Mĥ{‹éô%ĵ’R3K ë›1ÄpS­,Gq°iĥ ´OHïu½ËŠ£Çè­@Aš=hİìÒ`–¸Ġï÷{=fߌ$~!ZĵÁKvJ-V™Ñ9zŒŸ(HsIZ ù„4›%žË\h6ƒìp˜§_ÏċNhÖ­2-#˘ ›Ê8Z‚4Wwϔò İ›%ÒréïŝFߌĊŸóâ4ĞUfT6•q´if)ċ’OG…yѤœz‹oĈµ=3^äì 4ĞUfT6•q´i°K)Ÿ²:é`6ħô‰Èâ›qS†Ì 7)hÖ DT6•q´iђÖò>!u³Dù”oÎ`ıîŻòĤlB;]sQKL6•q´iђÖò>!u³Dù!‰L>ŭŸÍ {{ŭwÖÓâKُĠZbħİŒĞ(HğŽŸdZ“OÈXJ'Ù ¤ÙİĠù„Œt’­@AšíêÖĉ²9öFFRĵĴ@A”4¤A ¤ĠˆV€´È‚#G–”ŝ‘#HK’Ż!8riIé?9‚´äGŽ -I¤Á‘#HKöŬŽAZGŽ -éo9d8ri‰}s GŽ -•VŽAZ *­9‚´TZ9riHiHƒ@|BşWc¤’)ç¤E§äĝ„4˜?:°à=do‚”şî ӕ´Ôö İ›?:ĝqÜçùÜÖ#d ğƒLSÒRÜ'¤nŝè y=ìÓSĜdz’–ê>!MĉÒÎìŒUг3T? ÷wíî}˜6˜R °;H&§ OH“ù£tÇħMYwž&†ħĉÜEÍr‡5ÔE‹Á”R(…ŬAâî)§ OHƒù#ùw‰}– { 9ÍtB@}6šL)­¤š;HÌäô i2•ФQ2ΐÂSJ›ğ§œbî ñ–CNAŸ&óG iIò¤´°Á”RU ğƒir ú„4˜?†vӈĉ>1!L)[;H&§ OHƒùcik}7,îÈ'ş)e+p ÒÂ˙.ÓJ|Bĥw ÍQ­É'd+p ҜâlE>![;H%Q iHiFÁ'$Hs!ĝ„iIé?|B‚4ĝ„„OHĝ„¤‚OHà¤Á'$|BÂ'¤ċî)'$H‹$ĝ„i Ÿ ÉKÂ'$HK¤à¤%G Ғ#ĝ„ŒM£-iP‚H3]b%Ž´€Z´–WS\k }15:‚´dIġ 9p\Ş ŭ3ʖrêğ1hÔ¤ċ‰Ozv>!ß ÔU^ŽŸşĠ Z 9uŒŬ4jÒò¸Ò„´Dĝ„tÄÙµb/ëG-ċÔ1vcĈ4ZZŸŞ•#·yÔ6Üßµwìhv²ĜRNc7á9ƒ–¤Eá²iw.T+Gnó¨_€v·ìOµ{ƒŜg˜…#7vlvÛGwìHŭ¸|Ĵ;Ydj)§ŽħƒĈ2#ÈKŸÁġú„”èï‹Ş•#·Ò.µrûñR‘;îóÔSÓÇšcG‹“Ċ–rêğ1(ĉžQ΢ó ٗ>;ĞVŽ|<.µr3ı§1já(ŒİİÖr/fŸö™îÒĉî)'ÓİcìĈ  -Jì˘ó I˙ÛkVŽ–1íĦÚ$6ô2 cGj*Dš›ÈfRƒWHU-ċÔ1vcP;in|B–ŜÒĴıÍ£ĉ’^Rá:ħ˘Ĉ÷ÇĈŽ×0ÓÇ^=Î<=Àಝ:Ĉn %iµ†OH>!‡uŝ\µr6ŞGHjċ(\'îÌö|ñ-îZ‘;Òż vù2ß´Ĉà²Ċ:Ĉn iİkËamĦÚÑP *­HЉ³bĞħvt mÒ@Hi ¤4Ò@Hi ¤4Ò@Hi¤I/²0ޤIZ(´ÖCû›‰=‰$-cOÂHĞvÎi)OZàü™ïEŬ‹uĥQ;Ò:ܕ0ÒtI -ġI#3"ú^ĜFíH[--ĉ$|Żğ?Û$ş ;cñŸŸ¤ííżá²#ÛïĦ;ž÷Ŭ¸GËv żÏó%-‹Ŭ“—½YòżZ³³·˙–í$ñïÍ#ÈÎŻ‚´”#mg Žöö<œ§żÁÓÉGZ›ħŠ~zÍӔžžon’üÛËzúÉ…ùN3i5}³ĥ3.–UĠĴÎ" ·yAĈÀŞ]jvĥ[\³ÉûFMöĉšŬUdǗŞĈŬev÷ö•ZGÒÔ²ä[ż 5bҝUórjjVç`LK=ÒÎ{HoQ`Û&Ŝ}âü´;öθȠ£íŜì÷ŝÏĉMY|˙ʽĠ"* ‹fÒvĥ!è8PMĥÒvöy²sÍ9U:3/Br.F`BD9ACBHBBQ?=0U(V>=^=:+F–PEAa?6VD;i;:\B:AJjYMFeI>kF?;R†iGDMW?aMFfKFRTOWRRHVfePBsL?yIEmPD`UNqNFÍ)uMG/z4TdHpYKabJ^`]‚RHuXMwXHYhERNzVM{WI~UN=dŻ€UIq[SuZTj_Zl_Uf``dcV|WUŽPOGd§‰SOz_H„[CQg˜xaQ…\IŠYO]T…[Tƒ]O‡[O‰YUÒ1g`P~`UcjsMkħ_nŽžYX„fZvoQŒdPŠc[ŠdVŽeLcV“aV‡gWZoŞŝ7uq[“b^Ŭ:lrpo„kZ~n\vpixpdUs´6–N|mkšaZld‡mTkUm]—lM•kX’l]’kc–lS›h\—j]~ Ħmckd¤m^c~şžpeI…Ŭ•ud‚|t q^“x\†|jšsd~~|™v_t_y}“{gˆ}}€a™xo’|mŽ}vs‚§š~Z£ydm…ş†„ƒ›€cŠ„| |l„rĦ~fIĦ¨.ĵsŞ€jtÁ͓‹¤‰lކm”…‡j˘šĦw݈˘Œ}›~ĦpŸ†ĞinĤ˘g­–›•ŒĴ’sŸ““˜˜–Љ¸ ˙Vı¸–uŸ”’›¨œŠl޳›v žœĞ›’Ĥ•ĉÙħ„gƒ³š“şqHٍħ¤“ğ£~¨§´£šİ§ĤžÌ”Żş²JğŞĦ°Żĥ­ÄĴ†²ŻğœÁ“¤·Ŭ½´ĴËŞĵ²İı·­ŭġÙŞĊ°Ċ½ĥÀÀ·ĊÂĞÑĊەÙÉÈżÎĈżÎÈıŬÀàÉİÂܢÎÑÒÖÂÔÈ×ìÏĈÇíóċçäñäÔçêĝöòàċ÷ĝùóë÷ùŝŭ˙üB"\Ĝ IDATxÚì½ tTו.¨gϋƒ‰IŒeEŠU”]EY…£Ru½ Uı~\È& Ò úOiì'Ğê•Ä3AÄFÒRÉÖdP2` HÓ/^bÈrü ½xĵä—r’^Eêħ4zm%ĵĜĈ`·Ŭql|ß>·ô‡ĝ/é^“#éêÖ½ġ{ûíŭí}ö9•1ʖñçöo]fË f³‡ßşĥÍŭÏí‹ióßúômxv†B-'ӞŸż~ŭúnŸ{[żŝ³ öÖ[?É jÚO&5…ÚÊçÛBnîyŻ6e³P6Ï_ğYù‰6û'mVo6ŜÜfüÂßğ™ÇN~µ)o}„éú`ᵆNLw§Bmš.żıc€-c4‡;W'5ı˙üŭéWYÈכ?ö˘Ÿr³r˙ġ6¸üÖŻâŜލ7ÜĴ—ÍÍĥ7÷¤/>íû{ŝ3~rÁk´…‚Út]~“Çr.gd óÌ&µ÷~˘YHĵÊŞġóñRÌŝ‘G¸÷Ȅ½…Ü[xŬ½ŭÜÛ?yo#÷6Ĥ÷Vroċ4{+¸·Bö‡÷€íŞéöVaO~Ùf¸ßĜŜĝ3ŻĵŜ;Ŝ?ŝĈë}Ž?ù4}…Í#Zw.Ü?˙­éğüf C”ĵu}Ô^×ß,œ²Ù½ÍĈnMoßÖ§77ŭ|ӛÉohĠÊñ7~Ŭ5MÌÔaÒ§Ÿµ·fDmì²şyä>9T×Ċëù×{dÒĉşmÊŭ>9|+ña^½z~Ċôo|FänWû™µGU›ŒÚ£Úßµ¨İ£Ž£v³ Í˙,${éi{×_½şbZĤ‡ÏĞ?ú‡·6Ŝ4Ü÷‡Ż˙ËUŜ|éŻ`wüìÂÏżòÈBĵö#]ŭÚ˙:ëúo|än›ÖrÔx{Âħ ¨İ£jĞP{KóŸ_ħbĊ̛…û'o6Ŝx³^6%{+&oŝçùY+f͒›Ğ¸ydĈ žçêè£?ygôGżUjƒûŝáġĞ£|zìÇŬôëâ½\½ŠÍĴY GGg­ĵÁG˜üĦgèĦıcä§àZúµ\›è| 4èƒ|ùœş·Ÿ{ûÓ{ ı‡ƒ½3î­çŜzÙ[ñÑŜ½úƒüŸżô‡ÑĞÀ³^½úğVà=Wݲ!Ħ~ñÊ•ĞżX!ç7xd?ŝ_½úàŠ—.ŝá+Vĵò‡ĞW˙ġ€ÑY ŝÏÑó+WĵŽsŻ£§pżIYÜú‡Wĵ‡Ĵ’û˜PÒğÚëâ }xutô@î#üp?Ñä>P{SûjĊƒiĝ„Ş3£6Ùäi÷Kƒv­_›èü  =8u³˙:~’6ë§nV]ŭÚOŻžżgáGżĝÖ/V>;úÁÂWG?x} <ˆż½Šżïyé9˙ȕÎúhtŝŞ+Ĵ|à]ış˙žGŜ“~žYżğúúÊK£€”$Âßï~GOŜrTÂ×ü:PR÷ĈîBî.”×ĊğÚxuôâ¸˙g­ĵá'Úx½Ŝ˜×ž_!}:˙­™Ĵát¨]ŸkSŻpè^ûŭ×n>Ħy\ħâÎÏZuċù/]ŭÚ= ŬOĞuuôöY qxĦêòÛgÊßĴU+äü?\ŭĊĴ…@ ˙ïù‡Ğ?Xyeôġ•+ÄV(CwġêĴŜ?¸‡GÁ<X¸0ŭŜW!şBvד¤êuù4¨µ§ğY9µ7Ĥ·–ŠŸµëûµħûNP#nvF³ŭÉ}Úrŝ`֊K£?¸ôÁĴW>ŝ­³Vòúô íïuŝwèú@í0ÏŻ˙Âèèżl”ç‘nZÄx%ÑKwÜ~d…ö{x_jĊzî_!.N^—ĦöÉÛ ĵۘNxkfċñI4ä5ÊÁÚŞ…_l°ĥrôk_äĞç?úÁĴ+W…RäĈ#ĞxXoVš0Úù€=]uE¸6 ížGĵç×£ŻÔÈ#@uÖ•ÑŻ­"z<²Šŭġaú!¸/nòéñ:÷à„âf­\ıñ£Q¸—+£ûwut%ZÏë5ÔÖk]?ŞÎż4ú1DŭÚĠWžċë_~˙+W?ĝêòÖè·ßóğÑ×ĝÎĠ³VŽr™üŭ÷ŭöyòt_ħû¨ĥğ^AwuĠú+êMr'çs>q–dlo}ş˙˜%ûbPğšFíf3p+?yîQeŝ.ŭbÖŞëß=?kċï|üúïGÏS ÷³ÖOD=¨çŭž˙@î?{ŠpċŒ^}ká˙Ğĝú|`ò OÍşgŭïF˙°ü\˙ѐŞ‡àÉ7ż‚ĜnôƒK|˜Ú]ݸ‡M˙•Ğ?^÷zoüġÁµ÷›.żÙcjoŭä½IMe'äµïyeú÷|òŒŝ²üWv÷6랍#ŬY'_ğg*ìl\…żÚ߃8żçqż+àúù4weû°qŭ,1€+7n\µBNmäcVâù6à½Uùèk_ǙÛgÉ.î´Jvgñu÷c³r?ôġôë~ŸWĴ_?~sŝġşüfµa›< ‡ĉOxċWĤÙ|ço˙߯…t˘ìŸ´yé­WžjҐ•ö<“ÛŝôfÊÈ}ċ™ħûè§šıéÍġzmŝġşüfQ›ĤÍ~˙Ĉŭ+eóŠÚ쟰ytòMÜïnVaóÊ/fao˙óS6<üü4'Ĝ^‚Iüë³BÛ¨=ÏLmìYÔ}ċĤìNóBО˙TŸèú“Ŝ4lĉ˙Ëgl3Ħ6ċS?˙4\éÓŝCö‹IÜ?éqûŻó<Ó>~Â}gzÏµ_ulŸj?ĵN›˙çʚ/¨Í˙ágl颟?·K-ÚèX;9ċö5íĈwĝ"ÎŭÑzä3½Á?Ò§CmìÈÉ)·Żi7qÚgyƒ¤O7 µŒ?£6ŝÁşş:;;·m[³tÑ­Ÿ?j‹nğ÷óBMí_óò_Eûò—oıÎûğ…í:ïïSœËžô3~î hK§ĥIlXû˙ŜKs&ĵÁž“'ğşĥ­ıí3ĦvۇŜ;ûŜÏ5­yÊËġżúèŸ~ġŬoşiŜß-·œ~cĝääŝ?ùÎ żüòĜí—_ž€ÚçNŞ“K§x—ɨġ§_Ŝ6œ3µËÚÁEŸµû>ĵ‚çĝŜ4>ożöĠï~ôO˙ċ_ŭòżûÒ-_ŭò5w¸eÛ{—?ŝĝƒ>ŜvË5ïïӝ˘„ÚDÍäé?Uj“şâ½ë 6Ú9úFÎTÔF{Ŝ[t]Ôn½ġ֜ħ†× ĥèŠ<Ǖ+*Â}Ŝ¨}ƒ )JÜòċ[§Üá–mÒ÷œŸÜŭ'?ıáIïnĝ_jJħmjW&6ĦÛníìÌÑPAËY³ĉÖ)¨Ŭ÷aúô‡ïf|VÔN^‹ÚWġÑŻñċô•s›€Ú{Ìî?ŝüÇ× óéÎMŽ˙up­ĞgxxÛ­ÚìL£ÖĠıôÖP;÷·ÒÎ}8 j‹Ĉ@ûPSž„¨ö ŭ:µ[N^NwŝùNŜ2İ÷?íı\{Ż˙äĉċweLF­Š*ı†kWT›µû\½˘@ûŜÏÁŻĵµ_}÷Ë×SK·ĵññbèÎżüòù7§ ó)ÏMàÚ$•ù§@- íg8äàşİ¨MQ%“PÛv}͞ó‡ ¤Ú}÷}~íÈĈïŝ 俛"ġĈîûž”yùċĤ"ó)Ï c6Ieŝ)P{üyuÏ7ßÌxûÈÔzĤ¨’‰¨mۖ3†ËÔrŜèżëŬÇÚ½˙Ç˙óy£öúTƒòϖqËt\3÷òË3Ÿ>Íı4הÊ“+_jÊÂŬ6-×ĈQë{˙ÔdÔôLQ%SQ›Àµ¨-z£MÎßżĞp{÷Ŭw3´ÏUÜòïŝ—ï~÷WßϖѓsëTÔN~|^ëü—Żġ]ŸîÜp4Q™oŽİÌ/ µÛn#`²½–kÚŻ\ù(˙ĤĦĥí²:Ô3E•L5E§œ¨Í~£ż§giĈ"âÌŜĠ¨öùŞ–í59·L…UùĤ—˙ĉoĤщŸîœĈ5Meŝí˜Êüâ¸ĤÚ´\—zC“QĦ4j£—Ïuϵ5ñÚÒqÔ2”ˆ9İGŞe|j°6;§Keä& Ö Ò ï_>˙ñÉkùtç×Ò*óÍ1•ùĊùµ4hךp&_N@íÊG~Ĝ~?W>ĵpçÔ֌5•)K£–#ƒŭž ¸ öٕ˙µñÚ- ŬzÛ˘.aÛ¤ÜÈÇtP óû˙Ç5ùOsNċF”Ê<ŝoÇTĉ¨F4Ĥçšfè~359türÚ|~ĝŝ½×A-ßL£ĥ(=šÓßEàeä,]³- ȍˆ†ğ­ŒÇ‡ËYs[Ĉ5yÈ7?xJ/çĠŝ[Í5~òs*İTĉù *ó‹Ô·]OCށöaĈğ¨İ#jߝ5÷Ŝ{œ j$£kĝ7ŜxĜ pÛĥuċ|fÔĤɍŒßŻ+gÑm3e·oïŝ“Ÿùܵ*óZÏèÙ1ĝnĈğ§Ħĥĉ²íG.§Ağj99@(§³3gÑ˘1 ™‘ħ­Ğ˜ĵ÷FGßÈùP›ŞF&$*2úg/şuĈ1‰ñî×z?c†s—opî•ù§@-Í7hoùËw˙îKê Ŝħî/˙òá‡Z§İ"¨›ŠÚÒ9ïċ,}áPC” ĞĠÙ3 èˆ]WÎìÙ9Ÿ·_ŻÊ^£ŠëÂ:ĦûONyµç._ÁıkTĉŸµ+§jïûĉ›c¨[Z•0î*š‚ÚÒ[jעĤ€[şídO˙w˙Żŝ9³ż ݝÍÈîÌÉıċǫ̀u˙µ\ğĉÜċ›Ş2˙¨e áç7żÄÏϧAíJ:ÁñnĠTÔÈ50m¸?ĥr*jiàşNv-ÍùìñÚ4j$Ö[ Aĥ w.Zt[ĈTÔĈïŝëĦ6ñÜ wy:•ù§@í£1Xŝ~*jŽŸ­ĵvTôÖħ!ÑéFE5àÖĴÉĝĈ²§Q#·.Z³ L^tKĈċqM‹ĤGmòıË7qn’ÊübP›<ña2jGF†ŝû˙Çüċ/˙ïżûğżûû½SPKĞ’éPğÉZĤœŒŒÏ£FëڑÉórɘvü/c†÷7}}ì§¨Ñ˘ŭTû|IÚm_J·)o0­JŞŞ*+çŭI+ën²lċ]YĜŝ\ùoµOóıŝ˙Ú1ġö5í†wĝ"Ú µÏô˙HŸ.Úâî“ĥĝO/yìħÇwíÚġĝízl Üyçw̎ywÜ9ïŽ;îÈÊş;+k^VVfŝrçäĉĉfĉ™mΠ£PWh6˜­EEfkĦ>Ïlu8›Y—›—o6é òÍ“Éh3ês3³óMV³Ħ ?;[Ñl6ğQŻÏ7Ùí6›Ñb0²3çfççX zÜÛnħX6ĞÑh·{,V³>ßf´špO£•6˜ VœħĜ-xKħÑXìÔ†\.݇O[ŒSĈb‹ĜT_\l).u•ş|ĊĈbŸ×·äóe‹‹ív<° Żi4ċçç/@+(çeçóL.33WWTĠĜĜTYوÖżŞŞ"½ÁŠ#íííĜ8Ô^˘ŸË–mˆµ>z˜íçév¸½RŸ-gqòá46îšÎ÷ŽĦ–Ĉdħœߝĝ™ˆÚ’%mÛK–,^ĵD0ğ3ëÎ,à6ïŽyóQ˚wwVn&ڜıss3ġfGµlÊכ‹Ì…ƒĠ¤×éÌÍíĥêuÙz›É”_o4 PÈÌԛ f³>/3[o2K‹Éf°tú£Ċn3£>;ğ@_À}}^Ñîñx-DÉNdŒ&4›ŬfÁ›EŽÛl>ĝ|Ċx>_Èc/-Œöâx¸¸´´¸8żàXJÙ,¸,ž°Ç'@ñy‹-­ A#xÜÏş.(]6N}Qec{£´v\eeU‘Ng(iԎ:@\L6€İÜ!˜=JÀŽ=üó‡ÛĞ ‚ZĦòÀ!€F¤—NSi;‘k‹ŞĊ,^œĈGPğOmÉAŒ ˜=öĜ VíŝÍ#ÓĉÍ#‚$Ë͜“™™‡Oc°9%…:}ĦĠÂ^7êsġV·\3é2sÍ6sàc0Z z|¨|Ŝ0ê3çI‚€_›>Ïd"6HI†Ħ×Ìä&.wğÍm³Ú,¸5àÒ7lĵ+ïÍfwû<>{iİÏOԓxÙ=v‹qA1Á‚Ċ@ 7J} µüüâÒpÈm3ĉçâ 9U dË7ĉ,ÈÇ }#^րĞ0·¨ħ]Pkßğ  ĠJŠtÙ: ÍöÀĦŸK¸fml'fŠkGN4Vjg‹È5ò³½}RTùŜdÔԈ`#ÑÑÄ$Ͳ%­mßEĵd^Šgw­Ù³ïÌɁuĵÎ,€—•{7íb&˙ò²³óLf‡Y”ЃU´Ùœ‹EŸŻ78ċÀÍĴ×Ĵ6ƒÉ˜Cf5š ]&8e2šġÙyù“‚ T3Ù@5·Ó£Y—YŻL'Q³3`ƒğ†@Ìh²ZÁ:€FCi°z=žpÄWˆĝĊ$@³¸|ÀkAħ@-ÀĥÀXêóEpżR0²ûÜaż-Ÿô*Ĥ8¸!¸Ñ@ „Ù@Œ×ä"-!8M4‡•UDŞ’¨éÄr€ĥ·]p™37ğ ¤ñÀaE6e‰Z{!S j`ž@=#ji‡ĥX1N`K#è–ìúÙÑ]ğŝj×Q´Ç/V )Ôî˜`$Á3•• •—™›­Ï/t¸3 ŸÙfu¸=V3Ì£ÛaƒC0ÀÁ—™ z˜EpÉ/‡<`>х`^pħ{NЍT׀2NóÚÇ?¸5€U€‡­6+ 8lħâ–ÍâġDüÉ@ ’Ĵġ"˘f×òùàŻà°\ĊĊ.šÈbW4öş|@-Ÿ„ôà?°ĦŬ#­bµ‚ÀĈ}8Wr ¨6}‘b[,&˙*abtş’*vżP­Q<לĴL½ v4íĠš²Ÿ™ôنĜvĴċ³Í„ÚâĊš;[üÀıhœi@k×@m—v^x( ÍV@lv ›7OYĊ\‚†kQ§ÇµO€Lĥ²Ëj0é EàÔĴĉ\½Ù 7@ 3Ì'¨İ§3ċCe˜a MFRϤÏ6RŠ8ñpÁL8”|ŸÉo²X‚.p—£à-·Z¨ċéK*…jlµzU°1ú’ŞJ­}o{c‰ `Š×À´ŸŭùQâLôës33 U;x³qµÛĤ·‹Ç¨ĥXñmɘKğïÇw j?ŝĝbM3iYwŠvô²²hsóĉı<|½X9­eàö ­Et;$£ÙúYÍy:˘fUž 4²³)A P!úĵ6’Ò Ġb r;EfX$"iµ >b ñ$ĵ'çQBgµş½>ȏÓû[]2ö––BƒĜÁÚbÙğ|>ÈFŸÇéñı˘H8ìs•z}ôwvPLÌĦwĥÛĝ.áËô" A1XQ=ܸ–‡ÏšM•€ "!›žjljÏV„ëĥ°­[kW\›3gn&üPû9š` Ez}&d˜ ''˘6ıĥe\,Ö0Sĝ=pߘ$Ġví"fKyß}Ç5žÍˢaÌÑĉefÂeç8ĵÔĦIgÈ3—;!;fÈ4rĊl2¸ee@ žÚ@烷ÙJlÖ"=ž‚P9z½žƒ¨Ù`„Œĥb‹Çí{ŒzòÊh……_+°Ù‰=ùFèħq{< [,‰˘á`È[ ebTà°|^—ËU da#‘ܟÏç·ÉBĜRQrG”‰—S­c>˜YhHlĊă"ú"jE…xĠDŜÑŻá8`khÜĞ,d‘ël µ£iċOÔèרĦÑ@ 7¤ŭڔ:²qżĥXäcµû&˘Ĥ@Û%–qÉ8hâÇî¸ëyŞeeÍÑÁ&ÂÄéÁĦ67„@2-0Râòò:Û ZF((‡ÖÑ$ìqòR F|0†@âġàôq˜RjFX<]H"ànŒJù ı€ÀµÚ$ÎóZ>Eˆ…ïÂHÁÜÜğİiĦ;ÚEF6ĥ?UY¤ğ·°¤Ş*FĜ !Û+u µ|kĦ4f‡h*^ƒ†ĴŜñ15rÛäúèqÔ=@ġ†ŠħĦgAÉʹ֟'żTŒ$cžŜ ƒœWXh6Á9ˆC½‘ĠVğÍıf³Íá V9Ĵ ’Á=fJĴfa¨ĉĤ—ÊKÉ4#,$ÂoÚ9¨9‡& nÈ €…Ċd!7i àÉ?³žV\@DóÁŽ`8HŬO'‡&[¨GI_XħÌïƒÇ‹DBÑñ‘jŝˆßb(0Ù]ŜŻĜċÂCTÈf22/Bqkôx°ksruEħFM,’U•ÔŝUT#•@€#QcHĤ/R’ÁZµíN\ĥˆÀ Ì D­½ñ&4¤ĤèĥxÜF.Qšuג´ŸÈŒ Ĵ,’M—5)€–§+„Á3™Ħâu'‘^guĈ<0ˆĠ<ħXµÓc&ñO³YWˆÀ ›‡îó0€À‡ç0™ j0ħF*;Qsğ-6P ‚6ö™AòÈV+›¤ÄÀJ'uzáH0 zA1°‹€á…À@¨D1Fš\_Ei$TwċÂÑ@E B8˜[Ħñ(ŜR‹v0I2k·áĜ,êâ*†İĦ†lJ‰î ­¤…Ì,*İĴMKĈÑôkԐ×TZ˜íj É ×P³ĊvÜ j4p÷ıvŸĜÇv\_" Í&`ò;ï.šF!™Y°ˆP&†aHx f–Ì£ž9 ğ2ĴŽ9! )*ôkVÓZ† ó$0wĤ‚|=ÂdĜœ|DÏÂ( z$W75¤ÇMnñÙUd­7âJÁn°ĤÉq!xGƒmn‘"a è† ô-Żß§è&ħµĊv‚d0Œ­+/¨¨ĝVEݽԟL8­ŒŻ>‚9——öQ5IA‹mĵrƒÈĈn0ĉñÚ-‘ˆ §÷2Zk„ÓKnDŜ͙£ĦvXˍhíÀCí1¨ihĜŭ ‡Ú)nf޲•y\Ĵ²¤ı†°ž¨ŭìè’%wŜ™2{öY ¸ĴĴÙÌ:2Ş^ PğK€šÙêt”Ìz£Ó ğ­0…ċÁX²ß "+‹tfààá ;ÊĉB³=hÍL+ ×A›1¨í.ŒÖœ6§…^êa.Ĥž.SÉ}ğ ĝY`/™ß‚U…!İ=ۊ0jtğ1€ä!×\^·ëSbDĵ[$TQQñd.Ô + UT,NI)İMfEHèÍfµ D„AGĴ“™ÉÎjlRY•Û‚dDNˉc‡İ +uy̍µµ;´ÜñÏ˙LP;гVĵ¨&m!&¸_5ÍĞ=Ž×„iízĵħ}×ώ> ê;–%ZVÖŬwëò¨Òa›œeŽ`AéÍ%ċĠ[:ƒŽıA£²2p/t”!Àĥ:ʜĝµ€ü›hzàš  ™Û@è'Q…ĜíF›ƒ\qÛ,^·3 [i3İŝI芳Y\œJkı-–Fƒ•”"т@Îïħ›€šFD†żHˆä³C·0ÉċŞPdÀU\ñd².P¨Kzm&{i`“ì$İn§î1KŠ’tħŠ·Ċ‹È¨µ7i~ ­]$IQ|…: döRÌ…cËÌ.Şl×D˙ÏĈÈÖ+2d39QÔ°(âµZșrŝ¤e?~—Œ ĜTĥ?ŝ͵ ­µèlĥÊ\ÍĤÉbƒ³Ew£·ìĵ”ˉžÍŽXĴŒ36G8\í(³Bö;œĠ%˔)r`ˆƒlpı5f}™A§#N˘@q6R˜É`Ĝ€‰zAÍ⑍¨Y­…V!œÍË~¤÷C„€n@ɳY„İn‰·ŝp8älž ÏC)钜q (--vçìÉÔ IDATĠ’°“ˆÏnÄÁo5‹Ég<M˘Œ×ˆ†´s|˘’×Xĥp­²}ŻĤ:ÄH j†"§ ŬÀÍp,ĤŠjqBĥĦ^‹°AE2Q"Öl='ˆ k›N1ħœek -^<Ż5>úĜcí-I§AàĠH8XÉys¨ç3=Ô{‘ĠİĴ;ŬeNkana‘³şjYaa!XYbÔh<‹ f¸ ĥ’²PÇá()s8lEf3˘UĞCûfÔà€ÌÌ)áó„5ôÛĈ ’ħI΀t:IˆPïAÁAL=‰—CĦ°R$ Á_\\ñ×Fż ˘£8‰ûáÜ/Ġ$ §\7‹Bïdc&ĞXéJŠ^D=äšäü•k×P+)İg ×°–âƒ#hş\&²3ÍDíçG*Şi¨• †@ÌŞ3Tµ:zˆŠfíL¨ix‰"ƒmÉ£G÷6j ċÌ֔ˆdçeR…äĉBxÜaD\^  :‚JeXĠM€#e%ÀŻĴĴœI,CĦÉ\d3Y—•”ÙJÜN… e2ÓÌ<‚Vâ[˜>ġd°q/†!µIZ„,l ÓĴäšÉíÏôˆ‡CmŸß b’fâÈĝ_ĵ#%’á`ÄE$Eû—8ÍĊĵq)”dÔġ­Š(–?Ĝ‡ëĊ‡‡ÂXÉM”ûù28ÊÑT#ÓZù^ Â2u%2ĝÙ~ˆ^mŻIm›vïPƒkà8R#ÉYr­ŭ0A£Ŭ3“>[†§Mĝ3¨"Šiz&Éìŝ˜òe\ –.’lÑb†Ŭ¨”ÀÖLİĦŠo^8¸|dΆÍ`$}./~ᐨ_àÀ XCŻËç-ĝÖ·€šdG`+K+\­Ô‡ûğĝÌ|ڀš‹FÔëcrÄB~á%p˙ŠÒR:6ÙÀëóMUʧ†œ›ËÜ-Ŭ^…˙*ġsr ^üċ/˙QYH†d:ÚÙşŞv‰à~F’ié*}žĦjPcĴĦħê†jD¤IçEԐZ{7UF„IĴ;ĉ̛7/7›g&ĈLF–3 3Š5#˘`Ĥ/ôâ÷`àÏ`ùYŸ´Ü[JşTĉ¸ €ƒĉvğË_êċëIŒlġôïùz&òs፛$Uk„ĝ(ĴÚ€Zzĵښ™=—2ħ]³k¨ ġşÂŞMµXĴ²ê&P{ Ìz@Šì:ĵĞqdż„gwfqd&+SGÌXkh×ì&Fé9^èĊ&f芍;ŻA“$.twëÌ$sĵ+Ë KÚÄÚeÀZ ƒ[ä:KÙ&Ó¨êèYòċ²ġ&@Yä™oAasœ ıHžRŸ?›ĵG\*hñ\ߪ`šĝ[£HxĞb„ÓJcı+uŞW&¸ĉó•Úy½èq=Ş.‹À¨Bñħ\ҟ@8cšv•ˆĴ,)*Zûâû Pc˘ĝ¨*ĝaŬ\×Ħt&KĊĜ‹2u…% Ekħ‹o3ZÈ4Ï4Żĥ6­çŬĦ%ħĉ̛“ݧObir›·ĵ^[ÙGğMŞ0„yÒCvKPqoĵYžôı˜1ŞÒKI¤ĵÛN)ÁA†ÎtRĜ#ˆ˜WˆJCñƒM™G“ä]h`ie‹-.Ż7R)\8&Ú sùüreĜ=. ö€)b![… ÑH— q xċÀsÓ z}L8ƒİjt–àŸÏfÔ0ĜtÌxëe¤ÓnJkÈ´‰„s*ĴÚ-~-BiÉ·ĞÒ:âuH{PËĠ•4Ĵ×J(!ĞŞc7“cZ’;uYâÏfS9ĉéĦíÌÄğùÁÜ zŬ”ŒĈN“ò5^ù+=LLR şl˜D²Í`ċy)E Ĝ ğe B’:‘´Ó"‰ÁÇ,Q™ÇbspdĈ¤Ç#Í£Ĝ*ÂÊKĊĊçáu$RW— ’‘P ˆ„D’(Az5— _sğ”C2tnÊáY8ä06€È&\ƒzñsŒ.èÀ&mި!Œĝ™È*à uş<ƒž*7KòJARŒ4V­ċ [ĴH§ÔÈÏUdïŜĈ"]ž†šD×c­5%™…UÔ5U˘!o̵ħ$Âkñß §6A˙œŻÌ™—•‹HÙÉ`–YbKħÍ ;l™ÌîjGp°¨A/>ĥĠaƒzeZHÊq8pYÄPÍĞN ĊŞcħê0‡lʃê? ċ8 z:f"L×*R“8Üvf×9~#uá^/ÊúPÄ Ǔ-m-Éd2Á?(öd8¤ó%ps Ħ]b!C¸WĜġ‹ÌdŜ wb’ĜÍ#Œ`|ÌĞHėCêrä—˜#ġ!.1¤˘• E´\-ÓPI%v£”ùUQÖ½kwĵ ò03&”#äšdRpà%çCÊ fxaĦÎàh"j„-v({lŝDż„×wÌɜ7ç+œh‘g0Û¨‰™Dş½ÁXɑë²pÌá”Ĵŝ nDmĞ“uŬ,‰ƒâÏcZÒQfċ Ğ lĠġÍġġ5MŝÇĠNžĦƒ³JEt<­§Ġi‘ê’‘‰F›((4C,O$‰–T[K}"‘BkmIµ´$ƒáDm2 û=ÊıB°™Rĉġ}Ħp"ÙR÷äĴkK„Y{8ÂñüaÉZr\NÑJÊğàı­<ѤÚ+á÷PÏèö¨ċŬMáÚÎ,ĴÔĵ6¸FYU˙ÂQA€:­f]NĦĤĊä‡j5Ĵv’R††zŠ‘ĈpMŒ£6i†>­èÎ,´Ĵğs!(lĝìFfèzŻŬŽ9ŬVƒÉêqÄb‡ÇÉñ˰ÓêpJÁĥ•IB@`b²2GY Z²ŒcĜÎ`usss}MCu="p@VS-ĝá ‡T£~1X`µĠkgZšı}ÀˆJħ†ŬZÎC'3˜ħBñD*™hN%뒉ÚúTjÓ֖Q‹9c‰Z%‚­Ç1pIVi…/Š'q˙şşĥ–ZÁ&6%·°Çmq8i°=ž`,ö•N+‘`LċYÉd-½k\ËÌüÊWĉd*ċ(¨IVUIQÖ_ĴeEżpMDJ{SS‰A'ÍbNwİ{ïŜJÉuéÇĤsÄŞnh!Oœ6³ëħ˘"İy IBfW†‘Ŭ@£&B™,6g°)FÙĉ;Ì*~vXY b*VL—áŬ@80Ğ~ÓĤŬ›š›7Ô4à=·šjÄq”KúÁ 8ÁXBąœĴë†Ù ŞQvzÜħĉTމéD0+_íOĤâġİ–ÜZ8 –²ĥ-m-‰ 3‰„“ZMżxGBĉˆC|@K]]˖@š‡ƒA^xĈH˜ùZ/€Ñ#¨Ĉe Vâ~ÀÖ&•ȃ•ƒ4ĴkÊ}EüÚZéq)öáT(ŬkÛµ":MZĥsŒğd­”µ*ÙO,÷65x–áİ fDÚħĜÌı‘ħéOK[ÛĤÁúΛ›ù•9ı™:Ž˘ħbÍ.rŽšÏĉmH8­&ĞŬÉë>ÔÄ8 Iş2§C)IzX겒²³ıŒÜŞİŻÙ´c÷ŽŬğjjŞĥe%…’Örpj `cŠBÔK½ƒ C…5É>XÁDmS˘ĥFħeu]²-…cuÑd(’T4Kâ/ĦYZÏZ?‹ê¨M"Œ#ÄŽ Tj1ó^âiùŻÓíQ‰fR+ópxÁ#éKzıXÌOŝs|Ôbµê ”cËĠ,d•š§Ö “ XíĦ–{Ŝ½À˜´T£äâÚFÉĦ€câĊŻU×ĞXecù3Ħ–žšqߏ?öĝcŒ2 òNĉä]Ò]żcşdğäTŒÛ%Ç%#ĥħKÎKVZûjûîK^üY/y.ñN܈=ŝèß)ĵTvİ5ŻÖ|XójĞğ˙—˙c÷Ğ –]Z&?…x\ ŝŒïäżc”}Û%û%ïОKnš)wŻ·já²7–ˆ™8héxĉ™-ìû6B‰B}$k›žJâ_K ñ¨¸"‘Ú„Ÿ AhĝY̓è,f0tŝږ–Zœĉ €ß_‹Ŭd¤_s3cIvqĜ€ ÉͰŒĴ GœĴóaÉ£•}Ħ>WLdVnĤAP#T+ĤI˙ ˙ċîíb ÓéĈv >•­$jŞ\ĦŞRC, ÁĵÔ/yĴqm• –›E[İ˙Ïßŝöĝ6šW¨Š_h7>” !4d,è‘ñ&ƒË8ÔڀkF™2h³•ieËÊŞŞjjš›7mjÙȵŞeE…lĉBó²eŽeEĴÑ °ë;ZğD‰D~(â-fî"€P"’l{Ş£c{Ç3uIP­%U,B–$êaòBĦÚĥ–ĥÚdÄ%’ Ùóɧ(ӊĊ@Î) ĝáaA ÂôĞ­ QaˆŒÈX\uĜSE—&\ƒñ2Ìh£P֛Áµğ)ĜàŞvhB¤‰¨5µ7ŭĞŬğ˙úĊµUUĤ½ÚÌ(ÂıwŻÚU˘²}ïö mF yŸšq¸äħÇwµWV’jıııĴ9ç?ĥïà‡9T^F½Á&yq:;§“Ġ:˘ÎR‘Êİ/šJÈͲ²êšš†ĉ†ĉĉšŝoÀŜŽMÍğŸÛ´›Žš=ĵlÔ ŝŠ ˆÛ†WüÎí|MğÛŒPôE˜]òùÂ1Á’Ŝˆkas6èÚ*Žq>“”€g hhL|@ĝğcJŬԁ•9¤&ÛÂEÖí0 ïäŒ^kù² žÛsìĜ‹Çv{qÏk #v͛ž{ŽY`µa6lrËĴ2îh6ábjóoŸä.Ùĉ†|°‡ˆ ÁċpkÄêİ}‡u¤H5ÈĤD2Ĝ’Œ>Y—üOµ‰j¸0˜Bó’V=ş*!€‹ĝYI—ˆĝaAk“µ‰˜#ˆÖ2ô:ZǓD­VŞ)i$ĊġÁŒ†#^?žÔf„[+€Ï§cËÍÍʅÄW)&ĈZJEĥ·˙ġ‹˙ġĊŬkעOK(PĈƒê½nŭÒhjħÀ^ħ£{ÛoTí#xaKôEı°:ŭ…ok6ÁfġĜ­Ìô[ ŞìáĴ„·Ó>BS8ĦY<ŽŞššê ö;ġÛ׆^{­÷ȑcl{öìtÜPƒÖ@ılÙÚ O<ħg6O,++ħÊĵP§#èqgŝüÛ˙ŭżż}>Ġ0 %’uO5"ĠL B.mÙ÷£}mIb–JµĠAĝ xmÉHm² &“F"0‘ŻÔëöAAzJKÉx˘&ž dFèü†µ•Ġ2ÌÍaoİÈ£ÁÄM:ĥXX˘J°Ïó×ĈëIJ<’îZ$[-Ì2!ۊ8uFT˜ĈĈxíáµ;vìXÛ°Ĵˆqë\'m,Û`—vL²^{LP/3sMĤ]Ż]ĞJ/ šĉÏÔgëĊ<’kN4òĜ`Ì€&%ġ³#ìtVú\ÔQVd•`ğĴ ˆ;Ö;42rm¤ż§÷ÔİmÏnkôr D{bóÎ={vĥ Ëċ’ċwŜÛ PğT^NÔÀ­'^E€QÓö­̂<ÓħïGÏ´AV(ħÏéiìSˆ?I—Ĵġƒ]ñ”#ĵš â1òڋĊzÂ9‡~™÷TJ!ÒBj%nGô–H‰ċlN ‚ĠpĤq€Ç£‡ÀÛɤ]>çŝ ÓÛÜÌ™ÚÄN—ìqIĠ%W•Pħdë‹Ĵ••ÊĊI5(51uàÀÏh+(ñ˘`ğAĵö‰ĥ–:jaËÍË~G0Ÿƒù&NŒ.ĥ[dä²YK’Ğá‚RÙHV^V³çĜ‰Ŝßŝfè4@;sö셳§‡~sŒÛ#퉇~˜=ôomŜ)¸=ğĦşœrÇK„Á5…šËLhĞÂèTŞukÇÖĥ§ëo{GÇÖÖɖÚÚҖŒ2—Eċ×P ÀŒħƒj Á1B_ÜڈÏë‰ úösŠ}"ġLGŞıV@É^’ġ$[ŒÑ5‰Û“(1ÑÄZżĊ¢‰²ï;ë+sĉÎÍÌͽ—“ĠTŜ·ÚżUW…E°ÄĴ—E!tşÂ"ge‰³²R›2ÒŭizNğ;Ynˆš˜Ç†µkL”qĵÚŬıf³²˙áÛÌ]Ày9é²ÌĈİ…(Ĵ!XM}‚>b!YYüı={z^˘½}áâĊ‹gGpsĤrϞu;wn³ÀċË×´ƒwîÜy˘sç‰=ÏĊË]ĊċÎXÈïŭĥBíöW£q€‘lYŭd€°µµµµt€au‰–í[·oߚjI¤$°N%ë ĝµ=ôU´Ħ"8’~\òB>W(Àá·c‚8€ô@Ÿpb(ĵ[*ĊgJQ‘ÄD:U 84Ĥ&-ʍڸŒ×EL’KĦF‚E%Ġ[GĜµµ$uÓĤM›QȑD‚ePPúĦ@\ƒ”Ê}ôı£˘Ŝh(⪨PúĈëĞ81ÔGuÓħFVL"ˆĉW·ˆä°AB–ˆ7‘h’@lœ››™MżFĜ2³ĉÈLO•ÙĉĜE% ",*PAqfkMo‹@il× Ú;> ,hû Q["9Yo™Ù" óL%,qtÀYYíĊĊĊœˆÚ˜Ĉ ;JËj 9ö<·ĦfYa‰Q]Ó°ûĊ=Ç @FΜ½°Î9}ĉí‹g{{ûGNŒüöT×Î# ×Î'–?ô;;Ŝ{b`` §ûDoïoŭÓĠĦ8Â1D́h][K<ú*`‹ÖµÔâĤLĴNÒ &ñTÇöMÛ;Z AÀ+˘hyÔ Hmm2ìw•FbUïÀ,ìċfEE…ŠżŒş?¸& µ¤ži‘„ ġžƒa€âî“H*Ĝêñ¸" \‚”íıíXĦG¸z'ÊÌa|;GCD¨$³}++›Ôòí>%…²XŠ.SáK[İœM"ﴟµŞ%U š|ÌÍ%fyyşÌ<“ı䒣„_3 Yİh2ڝ€rÙOlÛ)n Ŝê‰ż¸·°ĴııŞ"ä52†ñ \ÚĊ h#ŭCCƒ½½'şÂD[|ùhL 6×ÓÛĠĠOĝÓïµ5(ĵŠ'ëÚZ™tbŽ·.rp%:™P¨µnßşi+½YHÔH\(B~$ŭScÉ#;ܐrŻżÔóUT =ë›j#‹xĝC.W·-oiÙÚS’„“Ê: á 06 Ġ‰jĈ÷µ’óV!‡Ş™1›.Kò0 M’OÜ i*+9Ё³Äö&ÄİFƒ1ba :™NÊßv5Îc3ĦÖ§VĊ<hċóe³ÏffCÍX1šÔT –1.Û°³ëxÏÁxmhàĜËï·j÷ŽŬÇ~;{|`ädÈı o_x›tϊ”ê=n8²Dh;O °Ñ<öœjŭżŝé3­­5ñxàIĤ“ñ:p-êŻ 5¨:ş¸DóĤV2n+üZG[[’™ÇT3èIċN-ñ1‹UKÔB2Ĉe÷ş=vŸÇç*.rH'F À¨´Œ&·nŬş…QCS–J#’Y ıŻTSòz¨'f‰šXuuL$´%ç(8¸6çmÉâXYs²ĉ¨…{/WY˘ ‚¢ÇĈĤúJGM™›İ…䊔MŬĞŬ5=Ü3j{UŭŒĜċÍċÔàL½ÙÄ$Ç2‡ŞÌĥ™X>ÊänyنgOœèî†ŭ;G<†Nl[z˙Cv‚ôi§ÑÎ\lDìâÛo_|û¢62p¤:g0[nçħŜ^€Ö7Ħ2ìúûa#÷<×"PĤ$ÑG]àD²…K²ġ ]jûö}ûĥĥ`ĥ45mOAà3yĤù|œ{Ş!:ĉÔ^ĠE"žâb;¤…dŝ?g”W×ĥµĦúêş˘ÖÒBÈWS½È dâÙêñӔˆ××Ô3x ¨İ›¨edççυĦÌTK›ħ* ÌÍTSûÈ9JJàï8ÔŜÀÜ5¨ĥš,}ĦħNr[{5ĜfD£U2ž™Ë"hTƒÌĞv›dİİZdÁAن Oôô÷ œsÊ}ġYúşc#J8ž:}öœ`…“çΝıp­èôvuvum[÷şuێ?² ġSmžéïnݽvjφš`4Z÷tK[˘îĠ(GŸÑŬ‰P<oBĦPÛuK%ÍġÍ͜^!ê.Bl†¤;sz‚ħ §Ï}žˆÌ} 1âKú!0­DAëH­^­¸ĥ5Ġ–˘53‘-ÊİÛ1ÀV_ K Ô$‡Ħš­œŸ!-['ğĴ^–ÏÎĉŞè‰ë‡ %•ħô,_ĥyħ’Ğ6~,‰–-§Cşé8Í> IDATĉ!Ûw€j $3/›Ù,ƒÌÁt\bIħ•s89aÚl6-Û°ı³g=48…|N“mk–Ż;.Rñ ì£Ès„Ròì™a ÓÓı³³sÍò'öìÙŬ;@Ù×ßß7rĉ÷Ç÷lˆ?ùä÷žjÑWY¸S ÓĞ0ĦĠĊĜFjlm‹÷ÑtR•QŒ„K}œƒm~ċp D ;ġ§Z `€pŞe{Ç-O×µh_Ÿ{úݎ-[ÄZĤÀqâ•jİ×$qšMG¸ĥúúĉD½JwÁ5†B6YĤ‰•ƒú‚|m‰4%Ió(/e.ĦÈ`Ġ¤ŝaA ¸qÎ|CĴ œ3à!s5çT$9–FʒQSBlsódù“Qfu:.9Í65†b2ŠÊ–m810ÔħĜú{şaġO“^gG€%ĵÙÛ$6ùíl$S$ƒtw#ŬÖâ?Ñ Ë~è:Òuĝ4x8ÀûÚħ=­Ğż·ußPMŞ­\@$VA4@;t@´BŒt¤ N$óTßÒ HhE˜ ̽. £½£Cŝè¨p(7áğê"mÏ´Žĥ§Ÿ~ĤƒHĠĠ}ż£{O·lÙ·ÚĤ6ĊÄ/µĦBëEŒµ8#f ”¨œóMÔ,Km Q*ît8œ­´%ÁÈÌÎËĊhġìÚw€pœLô.Ë䴉PLĦXÁÌöĤ™-de†Ž|ĞU3•ħ8ÉʂoÖÉ.Û°§GcDíÄ„YŬ}ƒg΁Je°ŻoêîâÛï_x 1öÛ<‰sC##gğ;;;O;~ŞW„È@÷ñÇğ6oî’boá#Ÿ}ĥġıçöm%×5“$ĉ­ ?Úşġ™Ö¸P­ }ˤa*âò…1ޤy=Pôb Ŭ˘$™ù|ŻĞ˘TBlp‰öußö}[ĥ|oË>ŽnéxĉûOo„O ›je<\UĠC€TÁ>2ĈV—I"ġa˜8Üv.@R 2J-yŝ‚+6R”H“Ġ*ĉJö";›Á\•Ê#ï:ĵK+em'éJŠŠtúlŭi2ì ™ì(-ƒê3. ĉk̎KVĞOĊ2wƒĠĵlgϙ3†ϝîë=qĴëà΃ÇûèğàßğğûΜ!Â{àĵÌúû†`(GğOž8!ˆ'ì?~dóšżÜ|˘o ·ĥ‘ŝÏ>ûӟŝèHÈh"‰†˘!ħI(>ÄimuñĥŽŽMİÖ¸TŽÔ×£w.+òû\ôb Âħ’²”Q›Ïa5dm[[ 3<ÍC?Ŝ·ï{ßßÒħiP{N­ƒ¨íƒŽl[ÚdĴJ557ǐ5Ġ* V×ÄĠñzÄÁ‰ßÒĴ”7qV.k‘Ż-FÈA’ùùܛĴVGâĦw­iĠĦ`;°CjǛĦ-².W6çış™P˜7GC-““† ²z„^oĥĜÊĴf SÀa(ŝ^ħ‹Şî>qüàşukv& Û`o÷buĝKĜHP şċ Ç`?$ÑêĈ?ÄnÇ˙ëÁÍß\´hŬ 솗²§‡ûOœ8öÓ­İşĠuŻĤBÑ@(OÖ73‘Ëĥikj5D{´#!N* ¸$ ù¸E8ôúìĵÍÂŝ÷ûìvW$EÌ:Hí‡ŝÏ}[ Hp0ĥµ-[žóĥ§jP§hİĉšxĞFn5×@ÄÂLĈbLš#Ú†"‘ Îj2Ĥµ†ŒLiX›É 8°ÑÍôèĉTĉĞAĠĝµ£R|wè&hË"³,& èfBMƒ,W²›ı:)ĜjFŸġìÛ·ċûß{p}ï{mûvҏé(E`Ġ×,6F\8ÍM|µx=~jŞkêeÜ4PZ(ġٍjéqU˙Ż·ÖZvĥX͉ÍI‡HAr–DnÇ™ •˘V™‰9KĴ…7@-“3\•6·ĴlÎeÁ›>ïƒÒ&ùúÂe{zûûúÎ]x_qí"P[³èŜğ=Ñyd`d˜†ñìÈEpí n·sâ×.ž9‹VÑY (|BëîGvÂ<Ŝ˙˘û—vv÷uŸ8(aû…³ż?udφV {P-ıšTjuÄ#Pƒ·iÈK„‚A\÷Í0`àXÈïıŬòzÒ͙0œú)i-Ñ` +iAµP‚v´@éo\[ EöŭxË÷[OĉA‘à§µžàİkj˜òglMġÍ*‡\/€BĤ­UT|öb£Ĉ4›]flN²İ•Éóeµ‹ìkH—­"„½^w6˜0ˆUä7ȍ8rZ —e4Ì%Ĵœ’µ$ôóÚy€³lħŝž³oż˙Ï˙ü>´áÁu‹îşóŝ'vé…FÎ^ݨ$GN56 —sgGúúĦû$ 2V9,€ÖµyˆvWÎŭËלìéîíÀÏÀŽ 0h …âŻBĝ·&#ÑĠÌ'%C‰8QC°LÀB…#̎„¸DâŠg,³òx½aŸıĵwİ …ĵeĠmMÀLj“!“5m_K[Û}?Ŝ÷ %ÈĈC[·Ĥ„dhâÛR-­Í͛@µĤfğÓŻñÍdPŠQ>oħmAħħX(Úż@MJq“\œ &á83Ĝœ•Z”ÖN/wXĞUž5ĉù‰ —lVÎ~§q4½£§ ÌWTîï?+òí³§‡ŽĴı˙ğîj{Ύ@œ9ß·KSwĉ45$SZ# bìÁa7ÂĜœTë˘}ĵ˙ŝœ;}sÍñŜžŬÏÀF2f?µgjĴ.ş}-ÄjjŞáⰐü[·nj‚‰³ĉĉĤ`,Ô<ˆz!Yy Ùİ%£Qİĥ#ĠB,,f͉ÖÔV¨‘­[`h[;~´ŻcK]ÛSoË÷‰ÚĦíZŞ9ê‰ıÖÚÔş‰è°‰MN5Ġ4×TЃ „“Dsu4Ĝ¤›LÈSŒüıSܜı™š™äê‚;ž’ކµ;^xáĊ_ĜqàŒQĥĴo—ż _ £ŜdPÓô Ÿ^.ÂTĥçĜo`â•9wv¸ŻğSĦĥfóÁƒB§’!‰eÀ"rh`ˆ£¤@ ŒŞ t÷ßĵtÑŭËş˙û—ïì yú °=Kġ˙Ûc5èóÀĞOĈÛ Cá`5ÂÛH N3%eZ< & êC~ÈŻ/è‰x =|’ĤŒ²9 Ô< ×›6™2Oµ´I˘{S ˘@ʐ-ÏlÙò:ô£Cۅk„ RD3ŽM­ÍRóœ ü!Œ@‘B%p…4™W<Ž—Ö$È7ĉËZ’úìì)RċÜ4p2ê&öÒPälhĜħû…^€™œµì|mġl`ĤÒjù273˙ìé97÷‰c§z¨ˆla$Pğ¨íì<1rşoäÜÙĦÓ’œ‚€a÷6bís§6˘š  #ëîż˙ŝ'Ö`³ĵ³·Ż÷ÔĵÚ "ööµŬЧEŸĴkCÔT^ŠĠ@!'ë[ˆàÏb€ V]Ëô#g}†•ùAXH.b”ĠŽ#‰:ĥ´"[ka>Ĵ15ŝqв%Ù²î 1÷÷· Šûñ~ô#ƒ­€,֚ŠË¨i‹rmʧAޤšĥĤdbP˜RV–)ÇMû§‘gĜ-R²@? 7ħ‘s&hJĤÑ 1AĠÚŬ;vïĜ1js5Ôä;ÔËü|e• aù³ÇŽ<-bäísƒŬÇÑï‹îżԆşG ŝÈÈ ÈÈ g•o;oÇ љÁQ™ ŬĵhÑ˘ċkÖÀH.?Ô~Ô@ċӌóÎvluԍZ׏'Ë„Ñc W<‘„B J³ Á¸?ìqz½.w°š^ nŽ3—$âf4‡ \*Í%£ ‘Én-ùˆı;:žÚò!\Û÷£}?êĜŝŒàO´Öċ´‘ĤJp#ÜNă\Ó ïÓUñ-´Šo ^œÎĠœr_ }ġFÁ8ns”œ;†]vž,WW ù9hBgeMĤ˘–Ż!§k /ğ€Ĵ{G·=ûì‰cLJ ü‰Úıӈ—{Żğ˙Ùü‚ġÎCP†gÏÈèsWÌŝ÷ġ Ÿğ6ì$Ĝ`à,%" @HԎĴ[~˙7×ĴYN y™‘Ħ3ŒĈÏħÜäìŻŸc&˽umlQ¸§P0ŠPÚëF•ğB Xa™·˜óĉc{CžrµuÈB\[\Ş–CÄğ–Ş NPlİC0aYŠmàҖ-’!O“™TéÄ1Â0)-R˧5…po$+‡ )[ħ€& ½[ˆ›IVJÓâYï`,j›3n çÈ N6“^sEĦPÎKP0jùÙê[!”e,/ÎћÄĦAûjĴ4852ĜOÔŝù"Ĵ]_w÷ñu÷ÂŻ-_³mç‘Ŝž#ƒ}}§Ï`‡äêëıpñÂ`FŬFÄŻQGöıS7o[³fÍËA×E›t÷ŭf`pä̉Ĝ <˙ÓĠŠŠW]QàF í#ĥ¸°;3-Ll°çöFyÁWˆázĠp—+ÂEÍ\°^>ŽĝA>]„µ(Oü,oKŝŞĥqۖ§[ÛÚVƒÎ‘(ŽhâċC(ój€‹ –p͒H4ê÷y9E‡†]c¨‘mœ™ŸFŽéDܜ™lQİŻLÉ6얙‚j€@;Fc™=#j|2ŜlΧĥr1™:o*x^­€òÙ=Dmô™‹#Díĝ‘oŜŬfóĉÎǏK ¸ï4ƒ3„e OTċ€6wĝi˘F·××wdóÁÉ5ꙃÇû˜ñÔĝż˙i+a•GÁ³¨ĴĵDÏ[^î-—…ĝ}²ê‹, BïRQÁċDìv§òz]ÌJ‚8žġF. ÔEıJ ­Ğ `·…²lO?Ŭ’\Íz•H(¨À=8ê qäÂĴ..œĉġrq ċÍpK+.p•I~%˜E­ı+ëÚpíî[äÛ7„ ’WÖÊÔĈs°ŭ’Ë÷w3ĦĈ|Œ^ĦĈ…‘ĝMf³ZC§€+óÛjö{vÏÀ™‘ŝA†`gO÷u÷œµŠ‘KÎÓ.­ ÙíĈħïş™ukĴûÒÛ)Ŝn&ÔÄJ˜] ĠäğyĴüž Ë%–d*ßÀBŭÓƒ@íŭ‹gFNv8éŽhkùş'6o>x˘§§¨ġô²ĵħğoˆ6@İŻúƒeÈpfgŒœĤìí=.ĠZD t=ȑm&!OS· 8?óÚ³ñh(œh†t*g˜4çχ_vı7ÄıċAİÏjk­ •!Nc ùıêœz—>p•{eP˘²ŽE>Qò8RHqlÌcŬêĠÉ:VĊ“y[´ hž\–Qdyĉ˘i´këLAúĵaYĉÚÏrµÉ–d@Fˆ,òM}jIYèÂ"G¸ŭöûïY´ÎΝË!ۗ?_œêïíè;Ù-£2Ş‹ħÎAaġġU ÖÙıqúŬ‹ı\ÙXĞpîÜ0dÉÙß˙úY†ġ­Í’àü‰úD3“ïµħBîĤX°ÜépÊÌzĉƒ·w¤´ŞœK$TĠw2s{]µpnR@MBŻ—bĴ:L°Úğ…ˆž¤µ9ùÌV™¤³:°ži‰Óĝ2`ĞĞEŒ‡Gˆù^;Ä+ÂUêċԍ`"ŽÊdbİ7ùO²l'ĥEMı/ßĈ"Š™—/Ġ ùê Ó9Ċ<ĊYÈ|=żSËÈïHà2›ÉèŽyl²,³¨.ˆ×Î t<ÑĠudçËï_.Jp9\wâ-V۝êé8Ù§†ĤÊíF€š0›u˘Ž &R²+÷ߟFmˆÚóìŒêÈï½§ıŝĠx³ ÑTŻoJÔ75ÂĤê8 Jƒ1§ÍIî@­Iê– {ĞBĞÚ`Ĝ[ÁŻ2I¨UXI.C³Ž+BÌ֚jM€Š‰ĉ‡İ­Œç’ X[[ǖäê(‚DŽ”Âî%êkXJ T,żîrŻ·:c:²^Ġrħ8Ħ%Ys°_`³µn‚fµÈ׿ lġmEz½˜£9²Ìħb“9ôr3[HímÒs‰/ä.kÊñ›#ܗÔJ¨Ġ5Ïŭúµînô*Pğpşżëkä:×<²=ħ l[ş|ùşÍôBû£{8.’‰ëxşŻ—¤!Ö9xŒd×ĥŒ²—ݓЭaĤ Ï ïyíµßŝöĊM5éá,@†=Yñ‚iÀ'&UsĊ Y°¤)ÂŜ‹CŞ5ŜTÍ<}^¸;†]a5Ŭ7‚h=˘Ñ­e%ž­6/™L5P4˜lëĜŠàÎOâ¸T¨1ĤÉ≚z~ù^$Wê &’!ŻŻ<ÁúH~”Ċµˆ [T WXê,FeĊ4Z¸Z€E™J3żo‚é ô3•ĤTvòK7²²#ˋıj×îĥZĝĞ\iĠfóıƒÁ玝‚L›ex„£˙,ŝ­Ž%bN(ÇXŞX?ev,VWsĵÔ–!xá6UI‚‘tÈçeċUv¤0%‰¨,ÙòTGÇ3-P@­İ5Š&¤r2­SÓ8-⠆èĵñV\Mx¸rÈnNJ„•¤­ ‚oüş·83E5W$'½Œ6‹úzáôw^ÒN¨dT sjUBsn€š| 'Ípġ½‚^ŻŬçıd÷aÇŜp â~ĝôı·ßżxv¤g[çAèŭ;Ÿ j×N°ÚŞsÛĥm÷ö!˜ë9ï:áwDÊqğ—% 0‡ÇwYî k}@Ò5àQbĉ’5#§Ní~YĈ%Á4ÔÀ—Ġ7TKħ½ZÌ *;•1ÀK4ĊÇÊéğêëCagÏ' š‹ž( Ĉ9“#њj‰'"Ŝ +x€Ye)ÔBÔ:€Z4Ù]BÎ%İv GVaòû5  H‚á âA W Ġs[ ı’²šÉò8mRĈE˘Qûƒ[Ú°M%=rŞ/s +pD_§§ÀTòFżFċá´ĞµĠ=>ŸŬë †ùĠ\KXÖ÷&×zşR!ŝ˙{ß6ó,]Ŝ{o]vkj™[ UihŞŞ‹tÓTÛLÒ.µv ˙Á)Çq^bŭEj£W# VĜqÀNIèU,ÒAHJdİì•ÂmYFÑħƒĜVËZdäşĤ,C,\ƒ)7ĥûƒí7a¸ûár÷yÎOÎôÌ—*+‰lËïóžsžs~ç<çè`}nynnaa!==<4Şl-h4wŞyÀĞbȤ·Z`ŒjҘ°Ġq\žšàëKyÂF££…ÒÖĜ§Ôv÷¤Œ²³]LE‚ú‚‹pytż´oˆáy4‡xG é15ñ£v›6F œĊ†ÄŽ5H— ş‰ŝ‘=Êl8áYf„7…żĊ ŭĦ T#â™iˆ#X2KŒ\MqÜ2Ò£ħNcÖÌ#  |>¨ÑĈÁˆwzÀÒœJÂ<ċú×ûûĜ|wMdîP•U‹U{B;y“3bÜÏ´\ÙĜ^6 †rjÔéĉ@ÖÏĜ•É\ùkżˆ*ŝ iûÌ}Fĵ­úÎ!K#§ûU\ġ…Żújaš—œ­*›ŻvZÍ­£âĉZĜ†îòè$ŝˆ>µÒŒÑc¤w4:í;.½QC@3;İÒù•(Ş‘ĉ3ĴˆÉ2P>ħŻÏèDbû4[ˆ“SşG'RÎ{g4ž`ÀùOôž.Ż.ŽÖj51JĉĈobk·$È\@téLW3U²”Š.ò'JJŝC`ò³Ÿñĝë7îñGÊ&,ċ2Ùï!ë¸ò}¨‘…p-e`dWê5jO#ï7m˜{ĊCjĊÍÚöŝáéñáĞ×§GÍêÜôxŜWé‰eËŬ—†Éßót|ì灗¤£¤‡ÜiH~FĤ˘Ĵˆà“{™‹N wŜšž+”K-&k¸-NZĊ5xHŜşĝFż&RħGM ’éĊ·í”àĈ§Œs‚˘ĝ$ °‚~à#RíĜáç,Ÿ ïè×ì˘ŞÌM1ü ìħPX^Švżéí·ßl…İğ$‰ĠF…civĝ9ĥёˆLMOEááU'†‘+LLMLuƒûO, ù+읝œħĠ䰅oF2²!}ġl™âé²xGöo;l>‘“P^‘nŠ!(6əÀAéÌN@3›lfSOï ÌhaC,nŝğ“ jp—°8òC< ["¤‡|ÀÏ"ù>ƒ NôÂp\ŽôÙ{zLŞçNµ%h“êüżâᄲ9:L#Uûކ˜˙ IDATèĵ”.93,yüH “ÊÖÇ·”ĵY•ğ$^hk?½6Ĉ­Ŝ?ÈÙ ,=è§Èé Ċħaé09ôàWĊôbq됧4GG§û•  6òU:ŸÏ/,/³·ß~‡•İB4*ÜR­4ĞċR}‹ !­½; ĜĤ†nuòÑAÓcO÷ÄR~IP“›‚¨ŸÍëBÏ=bh>ìB’"‰c|Pq—OàÈ5ž´œòĴ`Œ{³fçŞÙ“Ħ´ÏÒ-³:CcÈ 5X–ƒM_VĞ’€çBšĤŽ@ĊÖ`3 Ŝˆƒ.ĞÉÙ#İ 1 lpàˆ½>Oô{ÀâñD  °§ŭóÏm˘$[ö~_?ù‰@öĦXšĝÈ˙£=Ĝñ#µJŜSŭÓĊ¨ŭ”ğBÀ!ùĠIJ!o#j”BD“Z-ĤüéíW§§‡GLJûĠéé+’üòÒÂòTÇûDííKS@íq°ÁÔ@­Â2q½Šż(€ uàqéÒûïwt(Ĉ?!YöÀ/”Zln8h‡û/ŸÁCúÀ!µqMş8ëú‘[ûw…uûĝ´=÷£‹PûcGê§óŽ (ûÏpŞa2ĥ1ĜÛë „SĞ)m|mûèĠëWÒ+WOŒh‹ĊòÒÒÂÜ\·-rÑÂ2âœPc0ĞĴ—êĠ ŝ6HÖŬñÁK—Ŝ}˙Rg7x#Pfë0ärħŜRMͧ@mûÙâZ*Â^RëYlċ‹ ÏÚ’`ûà6YÒBĝ t£Ĥ…Ôùd´Ó#ħÇl¤ )žMó{¸Íˑ„àĞ5ÂCpŻ.Ž‚/êÈǜV§  RĦIaÙ #M )fr1ñ\\—Î;ö3ëzÂŻñt=a÷^2‘¸ÏuŒw›Ìs='*ŭDjYÊ%ŠOüéÇmbòa{šJè\ˆòë_\ğrġʀZ6Ĉµ>᳌Yġšt=• š´µ—ÂûÙWÜjÁTħT.,-G‡¸ċ‹¨_,-3DêHŜ¤vÌQìzµ”/çÉ;/,íÒܒ€Ö‰çÓà’ùB}Ÿ‡ĜtûûÛĊôj*…¸öf쏘¸ÇÛö6nÈÖ´ÉxkÌ>§tÀ1èĦ‘}Œ.M§Ĉ>£™á‘Ġ-ħ\îD‚•qŒ,$‘ÚëÒ{ Çġ`È)m]DÍ J£˘µW2]1Ÿ ċk‹ŸÀäâ<ޞL(­!²×'bÁżà‰Ÿ½9kûX5ĵĥŭċŜ¸Ê‹mşcżĝ”ËsD˜ú=ƒĴh[Ì˙r äÙÔLZñċÑÙëSˀċyMŝµZ­XH SmÙ½ĵ4ÇllöÖ¨"œUà! …ġjÔäuïᕠs˜Ŭl?èBş].J[G2Ĉ¨Vc£˙"lÍ9GÌP ˜SÂSëë6Iĥ45ĝ.¤Ŝ’ÇâNÙÔ7€7œ˜hˆFî÷:oÙqiâ‰ĝÊQşàc}lÜ£”2S:­ĈîžáÁ:mN’MI‰0—€ÏçƒgôL óÔÚĉ†¨Ĥs:ŽÈ‰˘K´°Ež·_mpùĝCuÚB Ô9wğtòñùNjQ“B—Éġ+) ö§ġôöpO`ÜĊ¸Ö+¨ž:¸?İW™ĊÔ4! kRÑÔ,`[ĉ$%0êda„"$Ĉ~é7:m}ä˙Şpb9ωu/ñÁ:tÍ ĜÚ_Hİ•›Db/Âs§Ĝœ—m^È  ŭĝ‹8Pòù鑵ñq|‘¸Œâ)„Ż™ä|ƒ[œnr Qµö֏KÜÇ"G~ü3É­9lÊ͜ÒӒï÷–28xċêĠO)†3Ò7oäVĈħŜ“Ó3n²XƒĊ—ûG';‡GûEpÊU‚67µÀi 1\†ĠYĴš˜[Ş7Jy8Ĉju}½´S[ŠNt÷öŝÏb•wüÊĈUfğŒIkmAUZnW-ŭĦ~ÙàµÖÀè@ÙÙïOä)m´^ŽÍEp{ÀĞœŽó<ñ!dájÜWóJC%ı iż? òP›c‰Î/u’@$.ƒU47Ħ$ÇVoTQFxîżÂĵ+Ü"ÛĴ™ r ɵŸŞm9^ırj?J]m‡slÌĥÓ'ȍÉq(ÏYLĵ ‘tm[HäÙé~ĞV\[Ënï Q;daiNqi‰Y—°‘ċBUİÔwš{­ °ş^ G„q3X^Í’Ö°Ì t  ‹ß*Ô^)SÓ=2ÖX¤ìô¤"Q´Û?żèvÛfbD1µéMÍOA}ywéçbIäÎ2F“D2!„#O0 FFE“pzÜ VÖCxê@ Ñ%çK½ £Ì½U!ÛP§ ü£G˜•Ÿe8=ĦGˆš‚.#‘„÷…/Ç/µ ×ÔîĞW`jƒ²ĊƒŠħ²2‰p?½µŸ^ĊçŒI xM6ލ lĜĜ)‚¤ŠĊÍíŭ39İÙ).­f×^ĵHßĵ9<5·TäÉ6bU ĊµĈNµÑÚŬcgëüd~aŞ£sxšı5;XçĜ4ò>SîÎĦĦĦ{ĊïN‰Bĉ˵ôb*藖é qĥÓĉqż‡}"0 #E)ퟳÇ£l­ œäQ“ʇi€ÇM&ÜğpF›‘âÈV£qŜÉñµ\$Ë#~žşşÎmÍjQEeŻ•½Ç' ĵm˜kğh۔AQ‡A˘?"RMLÊD‚9âóçm“;܏%cŸŒèĞ:œ€´ğR0êê•+\,}‚“êP^W.ĥ5Ä3J= ä9 ×ÁFxÀÔà24x  –.nÓE‚0lçײ`ŝ…;ÓÓSlĴCFM ĉĜ´¸R½ıSeÓż ÖĴ– Ë@-:}Ğ‹‡ßQÚÜÄ­Î÷Ù5”­ë’AA­ĠÚ^KŻ‚~?l­=@#QKi!6Üiv…s)QjJ£Ÿ—Ó룝9luí#ÀœÏċ”t\ŝ4nd˜Ñ< Íq£i ×ĵ°³>Š_àÂÀEú¤ĵˆl q'›‡cŒ\.Nn{ÀEĴVÇŞ<ŭ4‹cm5‡Î£'ĵ·#JK$Q!QÑׯŜዐ˙óĴß$Ìıa6Ŭ—2‰Œġ°µÄÀİ·k}äê½½ƒÜm1Œ!³1ıġ­§‡lŝ"Ôd•;ÌÓ4ĉq~ú3ÑÌÄ7œš—sCZ*×Ĝ@#Áŭ÷á×Öĉ×ĥk…•ôTtnİĵ^ŬفÁ!†•ċXğħÛÚŬ?:ÚmÊM½´4ĠyıkzŞ{D¤ÀšÚûïIŻÏpçċĦt­µŻPÛĉS‹ú}Ê êJÛŒ êşĝä,Yš6îiwK ^‰jBK̽àj}×ûúûFT éĦ Ÿ—ΟˆÇ¤vìñÒD|”Ċdr8Xd6™` l½äR0§CJʜĦĦĊábĉݵo öKi ”>ϸ?ÂRr ‰GôĜd’ŞDq΋áğZ{öô ŠU]íéµPbÏ`‚ıHÈr`߅¨ €Ar;`żĉ1Ûú]Ĉ3 ° àt…B!§%˜Š‡Bİbmssnì; ĥ ÔĥĥjÏWîÂpòùrSz4şàÛċÔÚħÛo5ÙċÒĠÄ-¤wà+<í–"äKŬ—‡îiȇû­íZq5YäĦè"‡ßIéŞñIÈĈ´Ż‰jŒóݜ„:v–ŒKüS¤˘wÒÔgëë—l›—×j˘EÒé#ż”;táëšĉrHċ=¤yDĈġ|ҁ5fP¨‚R’*I²(JŸÒ•Ċ˜túœíŞVğ²Â* ²€@²-‹ÁŠu€‚D£WŻrjoϵk=ìh1[)†˙éÙĊA^ì!?ŭ´ìs nĈmlëëğ6Hu{|ÜÙZ„5  ŻS)0 †{mq­ĥU+-G£Ñ|ž ?M÷V*< a³ħô³î²ë ĥ–žêììĤëÔ(&Ïħ;YFĉ£c²ëü-ŒmĞ&ġĴl$ KHú!Ċ (;<™(:’™i¸­ŭB‘GKKöž€Û[³ħÍHY-,‚pÀU"zX—ì:àÒܚ\\)CJ3‰iw½i2öJ€4FÙ³b1ı—Gö­6~^ŬĈ °€âcçÏtá$”ò1ĵ!ˆĞ°&ż9İSÒ3¨6>ótĊA5û1ŻÓÊér˜‡…>ż5$ĉ×û{MĴ ÁjĝnAoÙMár²ŝŒÇƒĦĝêj0µ)¨Í/‘²ĠÀ"Zt)ż^ĉààîx=$%~DŬSPCê½|ĞkˆG×H–¤˙€üñ’tw­ëĉä|qëÛŭ֋µESx˜xÀ·ĦàÁ³Gşôġv=ÙaSÒ¨pŝIM•ïáŬĈ…G:û“È }úŭö¨0}¤ Yß/G{{@ıÈÖMeô1·ƒê_& ô´ŝŝîûĝ·ĥÖÔQömħôş Ñ;ışêMm‚˘ïŻÍû#ĞÏÖÖxF½]X†‡Ĵ6*Ùbı Ŝ/½‡ÇœĊ>Ĝ­àUŬà"@--,ħ˜Ò-g4—<$2ĥñy¤ÛĊĊHdq1…+İ‹¤TÎÙw.žöÁâ4ÎܖDۇˆ/ˆñ/ĝÒÑY•w9-ĤAùT‹É`VñŒĈĤğ4‹AİĈÄÙèb˘İùÎóÖI›Í4`4;ıtÏ2Â<Ŝ(¨áS­+ÀµÁÈ|BG;òñ PW{4–#~ġ–|Ì·)dQ•.}â'-œĉ ħÂ)rBΠ!³íïÚÂ:3QëëŝŸŭĝw¨}úùuK˘n@ú)xËâ' IKŒCħj†ƒÜLµíïûö›È¤üĵX\yŝĵ°eßG½Rm’w”ë@ŠœE´á!ĊE˘`slÑZʳ,ÒÍıµË "·:ğ‡ùÇŝD.µ–Š$<·ïqŻ^ Üà‰Où{Ù°ŸHvD'È"’Î"{ GXQòdmÉñAҏĈNF spŠ žRC F™yJƒÎÎ2›‚Żtúk–i·M#d!šj0÷€]r›  9tI7 rŞ:¨ÏÁoĞó„ÖAÑ;12äӃ87F€™<Ò#‘x\ıŻŽŝ²··ÇÂ)d‹Áàà “Ü0‹İóĴ¨ŭ÷}ü·‡¸Ö@żÉâÀ…ñHGĵG³ŒşI(X+şùI15 Vƒħ½Àe]„‡,ÙŝÍÀ–ŻÖÙàS/—Ğ`; 6‚v´O[cÏq4:]Z^˘솭ur²ƒµ’9 !t}ĉ$öÛ˙gŸÜœOĝŭ äwàȨ’+‚½?Îà¸6)ù5q?Ô·ÒÉÓÀ_$ıċE4âŠSïŽ5~†$ĞQËüžK•­h ɘ.ê0qFÊ0IŻ'Pë#­s":J³Şˆ+k²ÜĴc\JcNŻíí£[ĵC'ëñTċgĴÖX5‰ƒ´ŞÈrŠT=§P-T³‡kt â.³qeSË>Œġ÷jÔ/ $ ż“çJǘĠÒĦ@–³ Rĥïêfqûğ—kI¤;é5¤Ù˘ÈĈ29?‡rîŬ½]é?^ Òu—S52ı'OŸf’· _V ¨jŒÓcôMê܇ŽGàÓìÒ;)Úŝ’6’ğ Kâ!›Ï/ Eœ˘*rxSŠLŜJĈq2­–&[3‘ X-°5‘Ù(›‰İ¸@=ËE¨ \7:÷LĤĈÙ-€„Š?œôpêáĠP g³Ùùnm¤ Ò3‡ô ĈVŻW‘°-+_‘z2‘CX[Ğ=û´ĵĵÚ2ÇóXWç5fpÀĞëò 䳏Ŝ}÷Ŭ>CŠPüŭϑ„_âƒ(³0Hr‰e<4Ž*f v²n”A‘M³ŽZMíġlb?êĜE£  §UÁe‚ĥöôi6j.i#İPµO² ˘Çv…I™ŞšŞk·ŞàÖÑü NF³?€{‚ĉĉsŞÎµéĵĝÏí*´R=}ŒżSËàuQ#N˜ÒDÂUM#}fó…¨ġ}aĉŽ3*˙2¸(ĉ`áĈÇFbħ‰t2Ly½îX¨E♠ßFöÙĉĉ …Œm}½^.ĴƒŠC6ˆ›’ÄŬßİ”ËÌëĉ˘-şÀcšŽN’Ŭ-üÖ [jïĵóîGfĈêá{H•Oïĝ˧úĦz*–FÄ+!•6G%AÄ(’/Pë•dšÉ§Au…šf#ÓÜ^i¤Â#ûôé“l?! ŭĵŸR·ivħŬ™ °N%4Tĵoü ä*~é5ñ§vrlñ‹ Ċy&ĝ?4•'uIû@ŠŬVE!AĠâĤ~dÊÜşĝ‹>³Ċ|jƒ}HcÜî;W˜MÂ΃΋0IdÖŬ!oë Şl2–Ëd@fıg[[ġÂDTͰċ[‰ž²T­rpWekı(Ġ*Éë ËÌ×X8îd+™ òp’O.wG<ŭíÛïŝœrŭ0Lb#ž'*4%&’rpĊ³ˆĜ˜á‰´â6nûIÍĞyC./ÂÀÓCt™NiP½^6ƒÔ´¨ŸġôiîI&ÎCµkÁĉħ›íê˜Ġf×dÒJ:- N—Z£áp´“ÉI?ßB6áoûEœXyñÁ>18ŝ!=!›†™ċğĴd‘ƒĤ1˘ĉp³Ê"aĠÙ?Ò7.BíŞAĠm°hŒóĤA32Wx ĥÁEs™A=jA05 +>ÉĊ#ı§Ïĥ^nް Vİ+Ñp­µKy˜\I<äçiÄC´Kˆjżîf1l9:=t .²ëFÄ÷wïüÍğ6\eiçMNq·™ä˘ÔÙ¤Wdu/›ċ~¨Œ?‡żˆ$‚ŝ OĦ6ëµz•„-Kóêĝá|\bïfÜ×C^·[yÏñÜSÄó°—=9Ĵ³xĈ5‡,É3SqĠĉž>ŝ˘Ĵá4U4VGí˙#ŜB~ϛ"I; ‰QÁc|‘Hûç -IÄ9ĊèĥŽŞ~n³ v½“ŭ™Rġçäĥž^“e"ÔFÍ_Ĝœ–Á33k$rCÙĠŞFQ†€šw&‹'sYögfr0·ÜÓ?l}·_R(&għż\—.‘Ru‡ċ=Nîî"‰+ Ñİ ç-udùġÒRtêrç ‘Iß/Ŝ}÷‡ž"fɍdFá[ ÇÒ¤&öB§#–ÏâíÀÖ²Ù\. c z4=HŒB\ŭ½îzB]s…è˙<ž`ċò²àÏj™äƒP˜ŸœáԚS~p3x[Ó=޵ÈÎĈt[pEò5Ċ흺T­Ġ€L"8DµAq~xÈUıdi=BX1xGG­¸E$˙‹ÏMI4š‡.B­—rÏc½£ƒFŸĉ4öö ŠNîqñ°·ĊIS›qQR=“ä/ċ\ĉéÓoĥ^ĥêà† ùržĜ” <˘¨eí j­Vm QpxQ˜štŻ"OûġDGP+Ÿ:;‡ş>ùäĥıïżü—O4=K†ĦXèAĝA,^)üցóŭ`$ŠÎ$xÙx˙"‡ÍV/n*ÌşgfäıW á^vàÂ"ċĤ8…h "_‹=x ÏÄ2á{U“1aûm˘ĠoWËÎ9–ÊÌ·—ÁHĊ= 2H{ĤĈE6F£&:[F\Ĵ gÚÚ[R)sBa…PPuWrĠí%ïGĤ/Ò&À££ÔK-Q:B%˙Ġsġڅ²f9Ĝ3ʖy§ı§×ÔÎıµ@ž8ƒAmĈêĉ0508˜ÛÓ͗/_ÖhHd#ev5ÉÑÚcÁwŸ¨E\ıÄħ5˜ËY #@mİ”_Z˜ìúáÏ?íüéğ™BŜĜl(üàÁÙ/i8&"A-8 +òz]ĵíG0Œ`%haÊş¸\n¸Ĉٌèö€ò;u`\^€ĉr‡ĝ‚Ŝ@ˆ ÍÌü†_$4 Ĵ3nĜçÌ}}×Fúä<ßh1™Ú“§U;äĝ(k·³Fİ1 )uŝ€öĥŜî˙ùßŝêñoQğr­ÏnŭċĠ^ĵ[£éêĠŜëF£ĊŒhCSsF ÌĤQ7InÏÏÔ3ÉēĠí—ÛÛÛ<ó”™Ë(D²żECkˆLŬnĤ†\\ĵŜg£VÇD5ĥÎÎ˟üüç#½Wĝ>Ñ´ÂĠ^< yyMġ³šÒğ˘n’W:‚!ĵ.,T*z°ñ^ë¨wĈ=ó÷Ôĝ5ˆ^Böëxy-‰ß,!/ŝiĉ7°êÙY·U=(œfì%ŜŜ><ħ°~IQĤÑĞ#œ’ëcW3(:{Ñ ĤAjt™zċÓi.V„$ŠĤñğ5µIÎ Ïıĵ IDATZ'Ïĉ€Ì§0bÉĊb°ŠŞ“| à E .Ş_é]úê†]ŭñUĥF˜,ò%äĉcİsßĊ5óÙ³î‡âÙÍíÍâö˝òò͈ŭ"À ϔM4˜ÈGdŽŝ9ıò4r~нŭöÛj·ċòÒ4Häċŝü矌~ ÔpyE½3³ĵĤ&ècQÒIÈG½ˆO:OŝÄBa@Ú#\ŝ$y ù"³š›´BnD8ïĴÜñ)_OOÌ?ȳR˘ĞŸz†m eڍÛڋ+‹ża°¤m°w0ˆ& …ŸÓÛX9Ş•ŜÎeEŞï>—W£8—z6c%hn%aužAv ÁĴoäƒÈ]tR3‚P6#§t½ƒ=W)·ˆ÷ÎïğÑKzzĤċŽ• ÙAW7WW7)€,uÀ –FM,6 ìî6˜i·Z; °‘’‘öħšô_IώnÊ]ÈĥÄÎO`l?ûôç}jyÌÂÎܸEfŬ³iLŜá=  nħ 3˘‚“wĉïgĴ^ħ×eßá"ŠÍ>œÉ'WhÀÇRòLl@Ċ§òËşXq6”Aàeè‡Mġ²¨Á+(tÙßgµŒ|J;{á<žHOp‹îĤ+äor{ =ħwBE)öŝF<çµÙI •+ċİÊ>n\wğ„‘XLžeZû)(ߝoƒĤÁŜÚú íıJI6˜/q›Ħü=m`us3•޽,—§†'–˘K0ĥċ(èÍŭVĞħG[P6+ÌSSÄ !íiWċĴŽŽ[Sх"Pëş1tĈgŸ^ûô'ż0!*á zg7àŒ-™ ‡A’÷c0fĈ"/† ÂUÛaÏip´.ĝğ‡˘Ë÷07w…‘<ŬoŻ3!DÂZ ½Ż&–IĈ!W{û3H2‹‡"#ŭŠÄYħ'sWŒ$ġ“I •BI1~˜=Á÷ ²Áœä‡rġÔPÓnç ˆ,_hH9àáĴN=ì˘*×ĜžùW\Ĥb­^ÁÖ,Šj’xYtIrè… :êżò^á=[s¸¤ĝì@Ş6>9Šb“+ĝŞ)ˆÒaĦvŸ/t:X·‘S$ßP€€. ‹ÑV9TpKdÇEŒ=Ä︛›@muóe³œNOÌ-LpIWaaaIDħZû\’M.B[cr05Ô:à /u Ŭ˘oĵĊ;&s@íΝ_ ˜\ Ĥŝám$jBë#‘D8ä 5]­[ŒG²ıD"‚lûɓl.´ĵ­!!LRŝúé‘3Vċ d IxY1“’.¨°¤Ÿ‰L\Öf8‚NŽœrל™Í>ŸGçÂàĞÑİÁ¸œöŝ^&6­ƒ5ÚÌp¤ÌĈ,Ş#YÓ@Ú¨é |Ú47n\rr˘JžÁ­zì|~éJùxXÀĉJ?Ŝ\$òĵ[żĜÖ¤µ9 Zg¤*£˙ƒK•7’!Üfìtˆ21ܸ™è¤€Ú“Ġ—ßmĜëJŭdkıä?ÙN³ÔĜ}î;¸Ĵ†ğ:e,{˜4žŜ]||çúˆ•™”;Ÿa$Á€°fC,8âĥ ñÂ#ˆ'RÙ Áˆ?a91öpf–†–IĉˆÚÓ,l-ÓĈŒ˙gˆY‚™‹Ô:3 9HÁ "½]°·Û<²ù’Ċ,Ú5ċVvùpÙiÈiìïµşä•ÇÎ6£İĵßbäÁ˜ô˜KĞM( ‡‘"27„ñ‡”ĴĦfäqìŒuĈx?>Ŝ.°4.ï..Uf}¨%ġv=F÷KEFn…¤ìÛa,k &ŸàÒÄĈ—ĈW·7³O6_~W+ œ²žJ//--,#‰d5‘“='ġÒÒİ!ސ@´‰İa$Ĝù(Y%uc–£·†Ĥ§ï}vŬ Ç³n¤ĜH†7’YÀ€ġ0 2Ȳ„ –Ú~ Ĉ2Ù8-\„¨ÁCµv-àIî铧ô~²Ŝ/“m4€)ƒO"ŒYİQ#ġ¤_:rBm·µï_Š*°rÏuĤ,F3a€ÙûzMÜZ#Â\\ÚÁzH““b šĤN·$…écHPî‡ĵnUÁ•œù[ö œñ둸‘á{|'İ|%ÎëÌ˘–€‘–0² NĞêûĉـħ“ġԌÁÂPcà_~“…ƒ|Y+–Š…îÎáİbanl¤„°ĥ/gÙû˘ıS,Ó`—ßğtıĞ]ëϗósbkK˅hwçP4}ïĈÏ4Şj†’pE!V‚@ëÉ3T#¨ĴM„YBd?ì †¤X„K ı^.1”B£^NŒQ.ǟóâ&‘ƒ–šc\Ż×Ğħ|%929Ì)7ŜÑnë/5‹ÄÔcpúÙĉ7 ³„ƒ}ƒÀ)·™Ó$RĊ òĈš…ƒ[s³îét¸%ƒQ‹DBżŸ }HApŠÖ‡°n÷}¨áΓÍӞö‰OCàa^""ċjñpLhÓl~ˆŻÜjÛÛEÖ ·€Úò2[Cʕş ò¤†Bžlô/D':;§çĤ†:Á;'&n MäĞ%@ĥ MË·:nï|ñiŸ+š#Œòo$LÇ2™l‚?ZžR żñ`$ޤ²W0Äh?Âŭ*²/b\ì <ƒ'Ġè â,×ϊß"w‹Cš]0œI ӆ{œñê|— "ÉIJFĵ-+Á+³.ħĥ¸ßOëK$”ÛT“ ÒĊ÷ ş˙Ë,•dŒšĥfĠ‚ASEÄÙÄi+“‰Ûr(íË “„Ċ¤ı¤í!î#êt!@2ÚĵUAÂFŠˆïŝpÖĊÚ@ ĉ˘Ü À áÇ£ÄùPÀ…Ä<ĴOpĥ”ûúĜ+(Džp’îÎàH‚wü%o ĥŞ˘ ΐf÷ñœ,î"ôP)„˙gĞY8ȵz½Z/ŻÜ„çCüZ˜XŞ‹ŝó?{xvÖËKŬCSœ ïšËOtĉĤ&n‰Ô×VFoMjÏïŜ¸îLĊ5wXP ĝÜ´ Sƒ—² 0Éêy’lA—ûıg4Žg²ħPëġroÜ6lɌûÈy7͌î2"ɛ/S£ĵíı3J&†5.ƒJ|ŭġ×O‘yœ§O2 Í :09ƒĠb0qšÔÇq,€ĉ1 š~ĊYT#’-Šn1= ÍJÂ~è<äŽgxH-âÙvÈ=:ƒW$Ä À[#˘|ÛD?_Œ‰?ÀDüzBÔÑ?úAGœ”=òhœŭÈQżÏ9f0Ìçp÷poרĈr™¸×^-Öĥ×jV+—ÒC]À`njbĦ.ĤĤ&?)ÏÖ˙eİh!AğĠĝ–Ĥş†ñîŬ‰9ž”rCÔ­áh~ċŜÍ/L:ĉ%uĝ x‰Ù\m ‘È%ÊFBüÀ1ŽG×BAY)ŒgqCyj²üŽĤ•Qġ^‚$dŸÍ\BŻĠ!9Kc[œ¤ĜìÚñERÙg_?Í%"9‚ĈwŽÇXópˆšQXMf“ÑhÓL,%kÈtš?̊½SrYĈ49Ï ıÖíK–ÈxöêğĴT¤`v?ŽĴƒÔHçüâE¨8çóİİtğM&Фw6´a2ü_˙ < C)î˘H,ô öôk†µbħ*B‚ğSQÈİıB…òĈ‚`ûöETXZŠN wƒ(Nw‰Ğìîş{7͎“%IJÑİ[SËngÔ4m–G̲Î:’" rı0ĵ%î| î{–ı¨WóëIÖNp…~ó›ßx%V¨r—êj#39?L>OŬè€ş¤şá“ÒLÉá+Ñ ŒÎ/#âç˜Ë̓ëpƒċƒnvµŠ2$‡ĞG`k6£Ñ4ÈiHÍäB8ôħ¸Í/ '³ü|S¤_ p7‚álħg*—ŒÈÈĜsĤ‘{‚jŠ ÎwυwšO²l§Ëc´İñ–£ïùPĝa5VG2Ì2OŸIFŠuŽ@ĠkĊèr~ynb.O5Ĥ wgĥo·*%!§¸Œ²szâVW×ôÔô­İÇ+é݉ıŒ­yk8}÷ĉÍÛvä;an!ŭ9R(fĊ#90 Ü/ĝCPÈDy@€††ħL™$j$#úy§_÷ˆ†ĉ5ħŞG •Ç’Ż)İ^ÜĉÑïn) à‚A’†Tú`ï0#/z’ ?„ò7ĵ³!]ĠĴp$!ô–\šwÎ$íĜ6%RWÀÄsN°ıĵßΉ5§OÍé²Ï;á‡sÏ< ? ÓìqÉ­ĤA#Ua<ŞYÚ£2fċR9nĵYD]P_fı,îŻP8Ĥ{)„ÛÉZ(.gËìúŒDüì*ĝ'™İQàÙ/£ħÄŸĵ5ĴûŠaj63ǝ=bkz<ìja!@ օĝ*İ6ùdĝivs¨Ġ(&ŜĜİĠl/³qŽS3ù’DĥƒbÚŬĦáááK\‰´`™ñïqz…˘„ì•\Z^Û h‡†nv}rşI €`ŒoDx#]iÌĥéZVŸÍ";žEÌCÎbÛ=¤:}¨³&?DÍġkÜÜ+­€‰%I"“슌Kğžî´ÙÌĜTm$˜HÈ$Zpĉ/ÈŬnƒqĴĉ‰MV™Ĉ°Xe­‡ËŞ”Ò\¸`ü>À 1›â@(Ìv0^Ü á²q™‰B *Ȕ‚_³ž˜ggĉ…ĥ–Iœ·o|&[Ĝ5%ĝş{ctf6bmŒ5ÙÀ .N>y’ıŬÚİŠÖp[Ĥ¨îDÇŻáĝÄĜ`j…ċċİîáŽ*°Î‰[)ÏJ–lnà‚ú$Úé›0>àÖ Ĝú´`ÂçÔ|ŝ †Ĝ”˙‘Pópœ]=ĦLĉ·9Ċ%ŭqɳàŭĴr€û q$N2ÏògY’$ç7X0I$‘Ïĉ8ü¤“f2PaP¤o‡SûͧƒÇS€if´9ÀϝyÁFúŒ"Œg²Şkeċ0L@3yiL !áxï ˜=AZ!ğ¸m6B l·ÁÍnéĥĠ³½ËÇ5Üü&-·OrzèB[ËQz£ÏnStŞpéĦ˜ċ¨wNÀEÔÎħİ€¨ċr’cE^œğBKµRaaj˜S żžˆ–Ǎ;;¨˜ġŝŽŭŽÎ—Kùéh}ôÑğï~€']€óĉmšâżS I…8É Ĝš#\ÊÇç^ˆ÷2İ f£0!bŭŭÁŠOĥ™¤/għîI ĤÙdOLjĠàN²ÌRC„}4#\têÒÜ.Û)'O+CÂ>wÈ ? ˆ,$é1[=3Ä Ä5ƒn˙ĥ„T5Žž{X§‚˘Ĥ²Ç‹Oj”ĤBğuwY€é‚µgtŽ;\GÀávÍ>tĥ–B‰°öòċËY›ĵÓ¨•Ô “K—Ĵíŭaô§‡nuĵ'²ÈlŠ.°[!Ÿ_^Ô֗ĉ¨½UݍO>WŬi6›UR…ŻĤáÛŬĵ9°~(c\rÀñĉĝ½{÷nßĝâöä#ä\ ìĵ‚ÌY|çV’İÀៜüŽg’Cx{VéCñ#³…YĠş2ÒwžLP‹³4ÌÍl³ ZgtXòƒYX”Î6-D>‡Ġ>ÙNŞiŒ’!—ĉó‘†xO_çrşÎZ[I½>=4û7½ĠM›M Ä#G?3ğĜı‰]ŸœŸDŠhàw:ŭ£v˙>[´vóşE ,=£§ˆ9ĜĤÂċÄÈôÙV{ĝ ótu“[ÓJ ^e\›şô7‚Ñî 6ñu\1kQkš‹vË(-ċËĠü\I¤ÈвÚk½ı×Ĵç—ÖĞÍr-=ŭ?Ĥ‡†§§AP>€á}Qv]7ïӋéô½ñ]·îLúÍ?z·‰+Áô‡„C‰~Ü´“|Ž›ĝËÉÉIYrƒÍû…½‰ÁⰝÄ}u—Œ8yI/—ĝŞApÜíÜàfÒòWl“hT6¤g …ÚT_Ö$géĞâYĝĊ“œÂ(›€ğŒóÜċt³çhĈê ݸGà­#AÍiä07:0ĵñĵ,ĝ}5˙$‹#Ù|~âğéí56Ü<9†İıî밙‡1ĥû„ç\qs³ÖÚßİr/W£N™zq!=ŬùžÂä£ğ[T ߣ‡|ûÒ" Ôè"IFšġ|}§Ziî·ıċBħ×\KYoĥö÷_–Ë éôÂWĊ4‚áMxÌÎNXŬŸ\îşu÷Ö]&ù ˙ÉïñËGġX´‡zİŒûS<òùAùïyúâ*ĉEÀú@Ġ3Yݧèú¤:_j°ÁÁŜ>'|İÓĥ™ċl#ÌÂçí6è<£eċ3OIeıàž‡èrN$RĞĞİ0('‹,Bş’ŠÛĈ–•¤2’Ôi)µ‰(äGĥraßğ—|JÖÏIUĜfjxGĜÏĜTÑ8£×B³ħxîÙ&¨H‹Ĝġ&[WÚó…ô0ĉş/MlñyœàÔubÖKp’ëUYĞW/5÷+•ja9_m6×ñïëMĞùîoà/÷öö6Ë_}ġĠ½áĦĦá.ŽuutŬê(/p„ċ])˙ż‰ wûĥí62ÁoüÎĝä8ɇIе_Џż!œĵû™ċñl..{q4ç/¸ÂĦŸkÖ-’EûdSŽÑ“²d„5Òkİ?ğ\Z0’Ï2ë_}úìÙ×0ğL$òluu5„­ñ‡Mƒ!ցݠĤr:XœL6jHµe<FıµûÉ„ë%oEöԃİĊµgó‘H–“}Ϟ!ÌfW‹kĞİ ¤(°ËejĴäT+’²7Îü2x.ó˚2j^ˆıü}ĵG"S„ŬŸÊ~:Û8_!ş‹Ç´µ@8“%jġÒ:Çç98SjlqzfyN)êŠW¤_ìİ\F(ŽùÎñ´Z]jìqmŠİ6ê°;êÉŻWóùĉŜ1A;ywoKPݏ ìşróğ=~\à_qĝ2ĴmNĈ!b'ÈTÀÊżÀ`8ôG#Ñ£é1³–Ş&ÓîUˆó,@êïÔAjƒ\C)›o4kŻìxN§ƒy#xeçS+žJQn÷ìĊÖÚ7ÏV³Ù5Ş8Ż4Ž2¨™¸Ħ;!)ıµ lı8g_²"À§¤&ġ‹Ï×XˆkËok€ü({šŬ˙İŭà1 zÂCĥ0(ó3˘V+ċ+ÜÓ ĉ_Ù…/ĉYŬ—ĥÇ·/½Í-è`ŝïwN/DYy,,ÌÁĤ]#ĥU›lš$Z­FsŻ/I‰ ĉŸ~÷O˙ôOż˙ŭP;9‚°<>ö÷ŝrtJëC@\€ĠuvM¤ÓĊb:–|°£sĝQ›JÉ[SS4Í[CbŸ ĵÛâJǙI‰ëUYq– ¸ yĞ!wq™³:c˘:n˘Ĵ„:q…¤ĵÌóĜÖÚÚü|vħ¸öüù³Eraz˘Cëü £rgGÇğożÒIzµŜ<8eĝÚ#jbk˙ĝz—ÁM9I nˆv|ŝú÷ ׳b IDATٜœÑkŝ…L… O• Ŭß?:=Uü… ;rA`ÚÚĝc} `­f9ĝÒSH×A,‰8mJŜ4qĜ›,ĞġZİ 6b6qzÔİv¸,š: ×]z$ğĥV,­<~|wœĊp¸ê•n᭭ҋoùĉÙ³ùeDz~‹ĠŞħCŸÏg·}ù(÷ġ˙ĝÇ?<ċa:όUœŻ9ŭß׉˜hkhj3ĤsÌË z×ììżµ5v[d¤é‡ĥöÍ6l­Œ„ yve§^jµúVݸĵ0%ˆħÍż­”ehyĞ"òêĠürİĠj6p9w€.íÁÑñ!"jŒkúÇ?ÒÀNÏNifÇT.ÁżÓCĈ•ü&>ófwz"ÄkñŻ'ŻN…ÍìËúà#ùĵƒŭĉĞ6÷Oö[;ċġ<,8½8/˜1J°Ĥ o•Èò05—ѽVĞÙ°úFğçdşËA);f lìŽÌ/²ĵóĝîċöÑS:-Ô[ßn•žżxñ \dEż‡Âz2A‰ÉI.˙ġÌ3²ŭáéS9˜ 7ëm…Ù`vñYvÀ‰‡ĤĈĊ˜˘§fâĝĈÖÜ‘ƒJ¨Bm–ŝ@­TŬi5Ğ•úN 5j2@#[h†ıe ‘dbhŠ;ĤîFë;;ùӳ踨µÖ[{j‹×öHXÇáïĝ§?ŭéOKԎOıvè‘>yrúJ £É½~W Œ‚äĞSüwŝ§“ÓCŜ „ŭ5_ ˤĜ(!=&'­WYıN/ÂÎç²ıßŝV „2QÊ ŻuÔ 3˜L6 gäÒ–\šĤ´–tMO-áôëˏWV %4\‚4[ƒĥö¤äù %Çҋ #š³İìÍħ˜ĈıH<H/d2à÷Ċ/ ûê谝Ĥž_ŽZ½œŭ˜Ŭĝß³˙ġ?Í>P D}k/_–ŠejT°,²C{ƒSh‘ŭGEbBÑÖC–ı‡ajjvÙ@Ĥ@­„PŭhµĠ½ƒ½&£×z}zô_˙ğ˙íÎ`lˆd‚ÓŭäÑÉÁ9ħáoÛÀ½k˙5Îéİê7:;9òġñÁŬéħìŝƒÁµv¨üU,2%ÎċZĥkËaŞOD‚LHÚúĜ×c3İR+D››’u…g NJ°<;;£Ûƒĵ~ġ·³SeCmó;÷™˙j†‚Ÿ€ŭĉïĝµNÎ ÁO8ô]ݰëgkĜBžˆĜ•àžħʲ0nnsڍNcß ‰ÌŸ'Ü.*+ùuúÇbmħáċö ŝ$Ĝ> ­\Yyŝâyá9Ìn é@‘Ñ ŜñĥŬŸ€3~r^Òz*DO ȇ)Á§:_i}Ÿ­y$U1^½jċáAI-Ȱ˜ Pħ4˜}(¨mn×rЏ%ž×p£— gH7Q݁—,jŒizgÇjĞşÔ9÷qËĥĊa‹H~’…sKħ:ÜĠğÉlҔ2ü[Rü ġµbû‘NŻĠjˆn/Š ĥĊĊÇ`ÙĝsíĊ7xR޽X{|ûsğŸr|É3är@T˵ċì‰vĤš8Ï]ì! "Y)ÎY˙ÑÊs!³p¸Ŭ¸§ d†Cça—Zù­‡!Ğjŝ4‹÷µ gg¸WħS‘;’*¸*½e ³ÂżcjG‰>À÷A;ww÷ŽXò4,4‰Öñ™UÊ:{­€ƒĞ£Ù)û_wrî_ŭ$÷?Gä䯒nuĉ§‹ÉrAê µUĠċìŝ&³È*0OËxjêĉ /ğ843ċâ=67­h”¤cU=Vŝ0’(2żvë™zĥÇ÷Ż€ŒÀsÂA.½xxû3›'É>[•×>ûzŝëŻYô—ıOYJކ¸Ĝžd­ƒ]-ĜÒ°­Ù dZPVĴVîìrŸ/6j£µZ@²ÙĜ=’,š¤ŽµĞcħcıŜ„œq1óyMK,éìœcĵ’Tà ß8;m?@Úiŭ8>}uĤĵ$óWLëÏè=ñĠé(·jÏċ8\ÜKÈm°’ĊNU8`3™­²ĴĤ½„^÷§ŠkàİTZ=çÍÏgççµE öĝqz^òùóÇ÷‹ĝŭîíۓ)î°àcYÛä|VúGâñ„’.UŬšÒkûôBÔ|²ĥL RúÚâ ènƒ+wQKэ@Ĉñ§‡ħ/lÍċ DµìbqğNÚ=8:ä2süĜ JĦ]JħYË ĊĵƒŬJ’ÀÚZ˘°mVš4€#ÜîDz¸IŜġZ¨HÛÎN”k“òˆbñçfÄXöŞÍ%ıeĝ´ÍHôP²sıŽIù%ġWĉâYYô|ÊĊÁ’œ·ÚÚ"û¨µg?•ĉñƒ~ŸÓ2b4²-Á,R“~.|ŠĊBÁM(ĠF­X\D‰G!#“Çâ l…ÉÛó•ÇiXߝ;·ï-"Ğd‹‹“ĥÛ×ax’!òLŬ§`kŻmp녨ùÏż;M²……Ëv aµPTeFĦö 6ƒ°ĈÙW1ŻÎ§jġrÔl!CŜoìµ]ĥŭ \5dğT¨4ıŞAÙş 'Ì­Qbï*7˘4ëŭ£½*Û&O”Mœì Ż;âUtBùÈW*ŭRAc“ ìäġéıT&öZyÈ×äm,Y>Ï'm;ċ·9==§›Ż)&ÀaUáh³KêÎe3Íĥkv£E£B GHy²–Z- h„­X\MñT“íE~Ïä—~ ĥMŻ™ğO...ŜıwçŜ=üÍÚâ<^aîżnwÒĤœ.—öMɰ&x!jÜÄéq¨ Ĵ˙—H+cVLjǜX`†E~Ş0ÍÈ)‡ûuAm³šÏ—÷öȝ[pûzÚÚßmÂïß³$L‰H Ô¨Ĵ—Ê,äî˂Dżfµ\Ù=jUÖ’ó²BŒ¸F_ËM8§*H!§bÌ!uPÙÀ _ġIğ›<}“ˆÉëµÓvĝzuHuú“ĵERžu^G+>=ÚŬ…–ÈŻŜ&Ğ[mm>›’î—ĊÖ/Í8&“lLä4‰‹´Íb* SİĊ"žŠöħ‡s€““·oûïÜıs7½öĵXŞ=Î(w¤2šhw&qıf›/Ħ2qi…È´[ -bÔd;Çğzµ·—[ \˘żê´hĦÀ"jžCò¨7 Ê[˜Ëכî°ħ³˙R!­'/i°T%Nv÷š"<ÎĥÉ^Tw1x˜V)7A#i´„£#\ΣÓ×ggm e“-J´âëĝ7BFNڕ­7,_jW §gBTNtĵÔöĞé]è_y$ĥ&‹ĠÏäñSè$_֔µ%lK °; rżÚËĉÔ5§8m•SgݵÍÍUÍf6m\ÏÍŝ•Û·ïŬ%wĴ=_K/.Ŝğ·RXYIÓ9ŝÊıí”ù~N÷ÄeJ+£NecJ³!s1‡<ßaBTëċĉu¨Ġà€‡4j^* µ‡3fÜ!ÙĵTޘ^*ĠĞ@‚ŬYĴ³¨µÌ‡"2 ËáİWkoĵ JÙ¨€ĵì·f9Ôöwט²Á†À aIûG¸š00BÀ4éĉÄ֎ ÊI;L˙‰h’·,ò÷£“żmˆ“TŝVuzÉü÷n–İÉcıßÖ‰$CšÛK˜8ĜpšĴTíqy-²pƒgU[5XôÓԂšĈ-5f#2ñqÍĝùg·íĈëÀíqĦÄÄé[:]*„ü?“²éÏç‘öÊeèçšRŒp™ŒÈ|_m¤½äÑŜsutԄ˜6ĜÛÓKԜk›™™M yÈ) N jÙĠâBİ^Y݈l‹ÁC6öH'›M ¸SmârÁ÷ZpPV“ŽAî·v›ġ2&ĝÉ^s Çgg,ÁÔXà?“%ÂħâĦö+‚“×˙ŝ!nTJ'Rħ’jĜİœ˙(“Ñ2‚ÂONĠä!n~6mqŸ°=£bîĠ@½B.jœ\êkvúÇ=\NïeïGĤĥ½ı6OԂiĝG5Eb²ŬĥkfógׯûżŭXyƒŸ,‚–ĵX[{|çΤŭW66*KŸŜç×o{¤ëHĦ–*”ù^Ô|N€²ô\é5h.Ñ[³÷ì(šqğġ6j\­çˆĊfĞkĞ@­Ì½”U:ÁJòdÇ<‘ÜŬAŽ ixğğMĝ¨Ŭŭf½Ò„YVv÷wá²äÜrŸ§×„žK.ïx†1–ĥÈġŝrr´ Pkìâ/U/Éi;–µ‘<gz*ĈTp#IĤ'Ö%zĴĴMb"òBEYNyüF'y$çp< xı½ö,›tyµqêžy]£tZf\&ÉŬŒ\˙ÈDَµµH\Ç ÀJ‚.]–Ñ Wj³ú_ïèğ1ÉCÒ–şӟżĝĉPŸ´û'9Dŝn·ßWòöñœ´öe2YéÈ|‡äQŸ÷êO{­–\v3Ê2HÀE‘şPRtżÛ|Ŭär‡b³°µĠĠÍò:BËö[[ġFëPäÑ1² ħߪVwıYğÙxà÷ޘZ´CŻÙhJ(<uÙŬ…W<ܒ§$#dìŠ3²Ê{z ;€Ğe!ôH]~úÏ3²È7¸I[‚:=Qŭ&‘RNHÛ7^urÊp'€i2iƒÓ<:”qÀ–ñ'óàedİ>]¤¤}Ÿĉ”ġyñ„ˆ­ĵXÍê´ĈT äÚBd£™ÀF ^ż~}pÀ8NԐh#¸­Ĵ0ùŝżÁ$'ıƒLµĠ"gCĈ—ÍJgBFUîûêJkÙrġêAE¨o€c”ÎZ˘Ĉĉ*hĊfgCFxànXĵċÍír}=O!de;ü rù£ƒfÁŬ Íğ ÁZ Ñöß?4Á÷à++Ġ&PjM²•½#^MÖYĴÀ}ppÚnKٟ(jgÇğ'ޘ,İĜÉé9˙?9ŭËÉyñä/°ß#uĝMş/ŭ Œ<²{- œµ LŬĠQÜñ!Q;%l[Ċĝ²g<"ú.²|‹ ÜA£YĴZ€ÈĠíííM%G0ċ×Ü.—Ùf˙Ü<;böXLĉğŭ‹>“Qğ‡Ĵ ´öBxäÊÊèâ½ğ÷î,Ĥĉçñ+‚˙R‹kĊĠĠÔ<ĊĜĥ’£Z”ŠpĦfvş ÷\öşB ŠşFŬTPŒyá 3ë7™'ħY7Ŝ½—+†]ĦĊê@0ÊùÊĦȝ5ĥÜUÁ ÎH³IÇ/¸ÛD:j;;Â? ç?DÊÈ|$ ŭ÷×êí/üŠG²îXĴŸżK $Z‹íC7|7ÀúԘÄħïäp{s5ı‹›C8Ÿ&&Û3Y-ZŭtĞNÙÌĈ)ZDdñ:ÍcF›ypÀböPFŜf´12bÒĈñpôQ{,EäÚ<}äŸô§RókĊMP1µ'l͌'ż˙¤†Çj.i[Ġd-4Ğŭ÷ŭ@’òO9úa&†,[şıïL÷ċVı\-*-փıÓ ÖĈwwÚ%:h€2îíSU ĤY)”ğ•ġêŜ°¤älĦAəÌŻ ŝz˙THıP˙ĥû£Ż”++ĥv„gùw„䀨ŭ„çâ<==€·„½œ 4˙eiÛòkâE[;…İáž;eEô›2q‘Šùŭ:bBĈĉp;B"è2ÄŭEÄ^ne½.Ş!!“Ġ(Nhè7áC?wûS÷4mü˙'ìíBÚÎ×µáƒĤ~ÌŞ ĤJ‹Ż{álĞğĞËĦ ŽĊjŭ*.pŒQ’%&ÄHlÍ2Ob ŒĞIœŠ†GòF…BĤÖâAvr°@†‚Äšà@˜@bjž5'ÏÙ{]÷/µŽlÚj41Ĥ˙ëwß÷uï˜x íĝ¨-DXûüÂâßu:½}mÏ^ƒ)ˆ)“"ħ=Ìö)i"jĈçç 3ӓ½“€n|nÎħùÈí~òdKĉùìí9V p:ż&‘„%~{šŠJáEܢvÔò–JòE 30˜Š™|‰"UL†Â$È ğ™¤ZġN(ŝ!VCgà\˘PT‰V‰+f+xëzŜ H˙Ùg­ÂċĵÉËP”J™,P+K’‚Ÿ-I@ °–?TS I‹ ‹é{/ċ^ċ⯿č Nžáp~£jĈıċpd‚scG:Á ”²÷͸`2~ĞÊç>Ž˙Ÿžž6GY›m÷u ˘öòċ3ÚSO$z„ğğꀙF7džߝg` û²ëEàŞsż5³Ù4ŭ cYsßÊ ċyÇĝä4gÔHPdk‹ڂË5‡“w€üéèĝ8)y.[Ë1&‚ >‘!%TĠVçpŬJeÒ÷ w •Ê•l8šŞÌJE\wi¨ˆÀ‡òıÊĦreÉËïı› ^Û9ƒ Œàğàç]µÑ‘jîô_ĊżħÊ.Ž{›Şe,—>¨D A7á´]÷ᏲH¨ü믧ÇG;;@&~uƒ:9cÀePÂàYŸž(ĜX’"“Ó kZ€˘YœŬe™ÍF69[ tšĠvğႳĞQ' ĥŭ^$È6żÂLZ’/ĠÌÌÜ~0>mœ’Ñä½Ós“+™žġ„td}eĊ ³ĵ^ôĵ²˙ĉähç‡X"ÊtuĦ>’£äÈ~?Ğİp™ó` çÔ=†€íü<eĜ1jÀ²˜•aĉgÈÄ×QÖ·•‹ıL‰l$OíĊ(%kçÄXİPp5#Ïŝß˙û KÄ~L@ÂÊĊ|.S\ñÂgÓ³úż‰3ΠÈ ccŞOâ\`$ċ_+żÂá>ڑAJ^˜..npĴrB-·;ík;ǧoQ°ÑŜħFĦ²Ĉ ̀VŻ_´ï½l§ÇX4’"/ŝùàÙC›€2.˜×ì^ÜIŬóÇ9ħ,ı 5“ (Áž§Ä=àL½i™§Ì":L-ÓñeR5‡cŻeh$bh nö˧KCĥÙYŭ˘YÚယŒòş9ËÓżµ)mĝá2Ô¸€á64$‡‰ßVĝ݁óD€­şHÚıÍìĵZjİŜU#KëŠrm‹˘İqŽáxÇÉlR†ŞÌ$ı…dòĵ /<gtëü7‘°3•-B–KĴA)â—ILK,’…`d¤e)ߕĊ‹ŝ1ŝ(b"¨½İ­V×QYiP)ŭÛ?•ˆÁŻS˘öOÉÁžż˙ĜûĦ+Ş  ħÌ˘É"D‰<áS„ĉfĉMjßö´Ñ ij+m\&5aûkŸfşŝġèÁԔfvÖL ‡í€Ùĉ‰IJËË6Ü(¨ÊììĴ9ĥlSú 7Ŭ(d/§—\†š`& )Ħ›¤0ÏYë/™àżÎàÖdĥY ËÜ`‚D0‘N([XdYPƒ;§†‰+Uè½Éŝ8l”ÇóJ&ÎHòıTCŻâ‚Q˙5|ĤB U’™ÍJ‹D‰\?Á… á\–š2Á’!gb­¤ĴÌÏ%áúùkˆ8¤Ğ(Á(M?'á„Àœ+¤ÄG1QmŜ‰|6Q–J‰â…EKBEU#œ3Ú)ıíÊğ‹ßUj#>H(Y˘’''?żôşdÓL︀Â=N½Üċ4†Ï3¸;ÌĈzïŬı“AòÏHWIÔ*’bµ IDAT…ìƒ$HLUMŠhGFV ô3ˆÛÉÏ;ÜÀ7΋Ê}iÜR39>303IèzïqÁŬ@__?@lwîq×ÔÎ+•µ¸Y<šbùOQÊZ€µ’0ŠvhXMŸVo4,.­­MÍ(;…O Á+—Úµ·ïçsFç–û‘ԁÑ!Y³&av›??ôWçSq)rà8‰Ä ż˜MK'Àé*Eak䇅ŠTÓ3Ċ˜ĵpMÍLkúĤÇ4Ú>M·żŝí˜a÷ĝĝììˆU‹F# 5)O?><ÛµÏêġcw6ŝôġhìpég˜ĤÒĝ.EíÁƒ^“Ú“çĜTcż÷ÈŻŞ)EÄTç‚Ìî–U#[Ï8F)€ÚK.[ÂWY¨ ì5µ ĥÀTr6‘‰ƒ›–”ÜkıÒı Ä`•i…”żrŞʕüIA4d"‘ÎSĈòDžO½aÂ[:/$´ñï¨]ˆ¨UT|˙BŠ. QK…"¤ŸŜĊYċŭÇ\~ùğ‹ ²NÖéK‡ TŞßí\ÎH$ߞżÚÙqÉŝ=“a ìpŠkò4F³AÇÙ:t°ġZxÌS==ŝ.ÑÌÚvS€m×NԀT”ŭ'‰(\ĥ£#–JNLp•Û½ŝŝžğ}ŭw;Ŝ5 WC›d™íċläöĝ´ÉäP°ıŞÖÏ_<ËşŻUîß9ħS…ħ~ïŬH, ‚cD£i0g“ èĈR&ÇkĈp1ĝeĥrQ>Ë%bìÈċ´%ğœAíLŒO‰ Œşż—ó]Î*ċb!› Ô n"+òy^ˆJvJĵš†Ĉ„‰ÍäĊôÑiW ›² 9VˆKcÑçâ4y']Ċڅâ%e)K8ÚßĜâVL޳6ĞÍËvÙ{²Êİİï˘×ëîöèà,ç—MÌ> °.ÖP͈l’ŒÂÑ~} ­žž;@Ĵżż˙îŬğ}Fçš×iš™dî\Fı.í:ĵ=idG ˜ŞšżÒЇlV^]]ŬI*Ĵ!r8 (QÛ>NGC‘D2NĉÎ*2Mœ6ĉ ’Áb£SQ„ĠĴi°}z_ïT} —E• Âc2²ĈÔd9%Y)ħ*OœrÊÚ½:qĈI•ûjŠZÄLy”Vx#gx DӈŸĵhY%µßUTƒ#ŽùXq~“↠…X6¨ósU€BĜ*ż‘Ü9ä¸ÉUƒAM•3ËTG5ÁÌi޳: §Ŭ™wÀ9˜Ĉrĵk lµ |Sl“’z„§‡{îvŬïëëïéײB¨ŻgJĥĠ§àĥmAs_†Z/žÏM´|+˘÷ĵĥ¤dè;\ĥVWeŠ˘_ŞbegÑÖĈnê8’Žú|Ñd,e½¨D!O–è I2Ċ"‹ qíòPtÜQMd!(À’µşÍB#IüA:+½Rp™H”›(”5‰­h…J•wLU~#j’ı–7ċjUk~¤Ëž!ÇÒû@Ġ¤>„ĝĵ£ËP–†Ñ²ÚÈ˘zIîż"ÉÔßŝrŭKe ŽKJµL*ùòÇŭgŞÜñïf™„ÄÂG‘²YġQ·¨›`zĉ(°!„Ĝ°x‚‘0ûiñ_–9Ŭ§mƒw{¸NħO3Çŝ>½Ŝ`wÒ¤‹íb1Á^öôÇŬÇÄlsï=’IŝCAnK ÏeƒÙ–“Ó_ÙIı›ŠĤ£‹/šGö‡K–+0ênQ`ós>É­9.<Ż”’q-IBSf²İD" Ħ‚cá 8áĊ"/…9d$a+ċOÒé<ó™,ÑĞH€ÄKĉ—ĜûŞp!Uĕğ @ f•áNÇ ImżŻ+ħı ’Ï ÙDX’Ôĝ;ŽÄP%B’ gg€T'0Ç]ŝċä%'÷lÈ$iF"WÙĵĦFòÈ'‰áëfwŽĥEûâ. Ê\ğš„[›q̌.=„“}˘²˘Ġ§´}}IÉşKӚÓÉN˜Ëg bsĉUîǞs9XĦIIĞ˘&38Tó—”Ù9NϏS YF- eù1;ĝ€s–ùâYĦrÁÈH’aeáîg²£>ޤ“ĔŽqZE™aċ’bkĴ΂U/“$ĉ‘(g$@D3Rb™LäĴµSİ˘\f%.â@Kµ$;°‰ñ{fÔàšä‹çŜƒ ‹—p!ÎüoçPӅ Ċ(ŬŒ‰½;cġ=:e÷¨§UxùBĵzÀös6§]–0q*Î;GWCI.r-Ñ˘pQÄpÇnß=‹ C$m° 3ÌÙlċ€ƒĥ¨ğŻç:#£–;f{ôf^û”K&ğrMÁ'P\zƒQVs;8sġ‘l‘Î*µ"„]:nirş‚Z ²Žpqy4[(qÇr6d(6eF˙ߋŠdsM:š ‘,f _áp<‘¤_MûĈ>Se9Ê<Ñ‘—SüòÉ—…Lš79şò™|ù=Q+Ş8zZĝħw•ê,’óó³’*À+‘q² şU^´™%UiBkÑ,qcñ\‘Ó¨9|FĤ`|¸`ƒĴD)Ì2jĦ\üċ§£Ŭ]Ž*ĉ¤[EÌhž5ĜAIHC(b@íèh×vߤ^G"N3â`†€}ÚnÁúqğMf›Ġ°ċ›DF O‚eúŒh}b˙em•³?N‹8ŭRÄ 9Ü?S?œĤàXUâ&-¨ŝ ÖdŽpŬ|$QĥXà‘ä%“L‘a(iŽJD şßÌÎÄj ƒK_fżR~W%ïUñ£L9çL öä`À9³œ’/ 8%,)ïdX$B`“’X֙­§³sâ  Xà#Iœ)–³M$‹Êë€~,υbŠw‰˙Rħ,tDM3a|ë—àölùwğL•3¨yeĝ·³Ĥ×s°!‡tíîî²[~÷èä$áX– j?38rôÔ~ö.x‹mѨġSšQŻŞŭeš39\Ÿ²äCˆżˆšlnܓm›œˆÌŬlj—l›âücŻ ĥmħBŽ”j/™Ç3G³ïĜí6;€ž˜]3èġ:}ßÀ”Ál$ï7­Ú]ŸBk2²ž´Š'Òrĝö#'>Àsúı‘OÁÊi5 7eäòD-Ğ‹'³%J‘Ġ‹˜™Ô ĉ”N<Ç&‰ L$ÙÌ]RaCUÌ Yɤó•wé%{d/N4!Ÿe`óLzPfJ?TX"~öûóá¤~,ä‡nĴH…‘eÎešIéc:Ž feJĴúKÒĠĴ0òuQbçê‡rž=~%Ŝ?\Ĉ3UYûA "Šĝ ßíèċŝŝÎçĈËäÔŞ·&lr–@àĜŬ ˙”JEcÉÂ̜üüóK0‚|ôòh—ÎYÛ"TëìĴaVŻéÑô ȐŜ3\îeŻJċ1Qƒ$闲żċ†2`ôÈéuqğ&·§89zÓ^E-ËXkG²‰8h}ŝœzĥİgát!ˆ¤ ȕ‹Ÿ—äµ*mÏ3ğİJyh˘*ĊDBÌC–Ùĵ½&p Tb”-VÉbc*ƒ”ùBù\V’4Á{PŒĞ ¸B²ç@Ôqîżx^ïOÒ°€2›Ì%½ÊâÛ"‹ŠdßwAm—`+dE†*VdYjáô§£—‡j 2˙:†ĊE3‡‚ì0EîÈİZÑ80+‚Èĉ 4ĉi@!UiŬ"½ìžû°f\yÏ,éŬžž~PI£A;c29Í&Óe¨éUs†“& J’AhGîëàÒ+Nr#3c]Ħ“üN;Ŝ‡ŠÄ¸Š2ÇC™ƒiϟIÉ.;Èyœ.x< ŝ”`/4ÔËT@9ŽMÈ2’/"ÂTu>™9+1n ú™—ñ…ù)ùìĵÁ„˜ÀĵdUÒN1°‚#͋%ö`1™N§‘*R£ĉ3IŬ*+eéôóé!.fóBGÔ+ƒ.ŠĴ]K”Nñ HĤ]ˆdUÚ¤ïfçَ”Ó€Äp)— í’…Èş:ñ„$äáe6Ĥi˘ q6³EsßŬŝğw{îêtšŝ1=Ĝ¤‡܀VŞÒYĴ~)j:³ÉÌ-7n™P"DÄ˙â?—Àħ")[ÙÍ &Ê —íY ôYbĠĴhĦ˜MĈ+¸èeíMpŠ8‡Ó‘@e“’MBSpJÔO÷ñ£ ż×g<ÌgÙBEÌmJ!/í:…HÓ/ْ*H&‰ÔŜQàwàِµ"ƒ:' ]§3Ô|ž_(v$ Ħ2aYJż˙ñlc÷ٌİäĤU?ŒÁdÔÊG™"óú%3ڄÑ}_Ï×D­OÇàñÄ`WWàjYnO4| 5ğÓd6qÛû#Yhğ' oŬjġ7™?Ïħ²gĠÏĊ|t´÷Ça‹Oş›ĉàXƒAŠE+W¤.Ÿ ‹°ƒPœ†X4–…Œä3TĤ\ıŸ–B<޸2ÛeXJ‰gSŬBé2âÄ ‰L6Ç,n&-(ĉT·)1.IazAšòaDzpÍaôÊÈ™Ïä)kB9™ƒ}§*Œ¤‚ıÂ:°˘šZÈWĦp…2)Q=2 ‡ò^%O%U*9¨rħbcġ.ûAY·;ħTê8O6•• b )^òüI&%Cĥ"Àġ‡5ƒĤolŒ81â?ĤÑOÜïĦĴ ôɚ{µ™Ë獐ˆ8ŞŭÀr{.bĈħŸ’ĉt­r˘,#[Ğ níïÑq$'Ä[jıd,ÇrĥÇ<\jĵÁtĜ…Ù‘ĊEOrp#íX(Š'àÒKĤ·‚ċ‘ ರ˙vz6ÏÛD"ĈÑ34œìı*°r‚H=ɟ/ĉ²$•Ĵ¤ÌdY~"‰1;Ĉñ„Rĝ*ôĠü“Zq$A5Xû‰Â•/’F€ċÒGÓİ 9żà$”bIıeɖŝÄb˘%³DÖiî4}Ñ§!ċżï‚Ä e âÉ;àü†1ˆĜŬž>|ëëÑèï÷Üïéï'jS͜Éh˜žŝjsŽ*yTé´êq~5ŸÔ-'[ĞŒŸrŠ(Q‹{è~1À˜,BaŽµdIjqÍ@­ û™²”'ÄÂp$‹2îQd—T&WŞ(Qƒ‚dŞà},tr.I–/•LFCAzÁĜc@ ÜrĠÀĥ-"+sħŸµH<ÎEÖ£f1°ġBž 8Ċ쏁BE!_$G•Orî{°:Ñ6íOp‚T—²´ïìL¨ ÔJ2ËR݆#1\Ş—‹Šàz‹„2d’H³N…¨•èçIîœÊL >Ĉ7Šgôġ R̞½Wàİü5˜L¨€&ŭ?†D–Ϩñ{‰H(Ö~’†Š¤%°àA<âê .Ší•Y‹ˆµA$•–ŜtN%ı/1Zf?‰‚Úx&ŬP’ùš½?Öw· Úr@ìÚ´öžÖ ›J/EíÊĴrmĜs&Û*Ğ—•?À)“\hĥĊ!Š/~üñÇgP Y‰ĤĦİ Ì’î,É~¸ÈÓ *1ñòĝ"l³/²â>ìÛÊş“Ìt6Épĵĝ[lŬÀy†.sÀ5áhŽIças`Z4z ¸={Ğ`ñ²qIñ’¨sz.ÓÂĝYžÎV´Ñ•™RÑ~‘™íIĈ3ċ †ĵ ¤ 5˜8 m‡ı~rĤ(yvZK’ĝ3êE éĞÊ|İŬĵ˓ôIZ eótD ŻAşP³ĜÓiÈÚĞWŻŽv8Áî¸í>d­T¤çîŬ{÷4@mšsz§ŒĈËgû(JOCöâıRñ—›,Ŭ\•Ċ›Ğœ/Ċ²ÂöìˆyNY:#3‡ Ž%8m8[İÀ À·ž3 ƒžmĜĉ$ûĠŠ•<·DbáP0ĈhJ*ST! ‘V‡²²?! ç ”Ë(O.3ĉ8 y0Ç,ç“ğfÏH +4EÒɓ;‘ÙsÉ$9—FëB-ȰЂ·BgŻĈ‘ ç ö‹{McIÙɀ †<Ħtħ\ä\QÊ Ĵ!~|,¤PÇHfŜ@ŞdŞ[NFËàŒáŭ , ÄÀ.›NĞ%;kĴĴ³Û×f@?Ŝíğ7ġ­vzjRöok —˘V•4Në”0–_‰š:™3ışj_]u8Á²ñ/^üĝòÙQ* û¸ŭŽ]‡˙Q£K–…LĉKB ²q †˙ü_ D†ĊĥeHáí~P(R֜KP+ÑĵDbŒŞ°ÍÄż”•IĤ 22¨(Ċ|8Ѥ ñúċĠëĞQ¨Ĉ…j)Hd(m*LLÂ\Ìğ’j‘a`öĊEé Ġ-jàTÛ £2S<“ŭí¤-Yz“Eİdà„J yc|­<Ċ“M—LĈ‹ş,N_íìoĴ­ÉB ğŬ@2y—aÈÚÀlÚgÒĤ½túÙ£Mşj[Ï_ĵxNʸ';98}kOքC?rà5Wh+lĠB£—Çé4¸?Ȑí%Òħ0—_^ù‚­˜êR2á´ÈX<ž…•É& gi8r &¸ş#&EİÔ"L33VŸMWˆQÀ¸Ç€¤(b& ¨‹‹y7ÄB<6Š†,ÇÉċ\.\g€'ĉòʧP@1+y7ñ0hœ*2YZöé°4úö@-dħ?–Šŭóç2’‘‚cĞkAĤK²%%/EyEH'§ˆÉf ĵ%ĉ‰ ’/ˑ(Ŝ9zµżÁÍSεYhBĤï Rw÷n_ïÔ´–}ÁFiÌı|Şç–´”rİ*ê9ÜS_CÒì,q˜ÍáĦżşòíÙq:ê³lC Kz*'ÉÈE·Cà %ÈBRÉF£áx4KƒšdKg¨£$Ó9FF@GŜƒğ‰­¨”Ŝž*uĈ sñ”ˆU$–$2òirÔi5ŝŠG˜¤fäU!g—S„MÜ2­†²EBÈ%Ĉ\ÎßĞöşs‰“HmQü0™Ğ—!hÑmĞ5”’%.°ßŒŻÉ|E9@Í/—@×ı:•ŞCP8Iñ½ Ŭ9ˆŠ2`Ό˘[ö…¸,Éà2Ç1ŽˆIBĠ%`8J$y¨Áğ“à!a e Tx4ÛQ†ÉÀA“,:~:N(úžeD?—Äù;' %2yÒxžò ŭÀ"aUĊ̰\ÎĜí÷İ1"…EñúŠb‰32x›ċ_$•ĉDÙT*•Ĝ²b4™ÎȰ µ(u.2û‚/TV7şßİ“‚D$Ŝ'îĥüüéOGoŜµ7G‡k.g۔ĥóîêô°lŭ€P£ĠÓÖk—ËĜĦèBu“nEhMżĝi*# Ë·áU‹ISı¤.àóµPË28•2ñxŽLÂJ0hŸ'Áµ·ˆÉÒ^îĈ+))ËòcşTŝpžÉÈe³ÏKJ+Ut¤x–Ô¨Óë·Û˙ħ8dġY¸Á†ġım${FPÉ<ċaÏq›ÏŠĈ#>ìéŒ8ċ&_†ĴA$ó”ádş@{“e¸9b“0+•e }„€Bw&ÉİyĜ™NÉqÚ y€d8'´ÀıÉÄYÈ 3D%Ù*˙j…’4w¨#l:ċ”I˘òĠ’2ì÷„%!ĞoĝÀcġD¤³‚…AŒ(Js\Ĉ, ‘Rħĝ${Ċ*ĵĴħŽ…c°èqĵ‘ĜëÔ);K ç™,¸\^§ԌZÒèz&úúû4cSV2g—ûkNUşş%ğ6öU³s˽%ôCŝĴŞ·sĠĴ: 5í‹Ğ‹ËËÜĉ³Ëñ4ċ˜ĥKg%K”e$Ï@f ıX$lħxà]ĉ$—XàĝÁž½?çVĦ<Ż]F„ƒnuŒCaċ\gaȚ¤ (§™Ö'ˆ³t"Xq [Z)yÁ:Ͳ—ŜI–ùmĉHĦÌT;\ħ$ËoŜżżÀŻ•ò:q…{€ $O2ÉHÈÊ%V!ϒ5“ q8¤I&8‰ƒ!ó~qVĵ€snŝ(‹Bi“t,*ÈYLnÌßµ~ùÓÉÛSHÛ>—ëıĉ8}ĈAÔt†:RKYƒrìÓh8’ŝÒÍËDf=òʈ\ó,XŝŞ*üI“ à’]“4ĥÓYŬÑ9lġx,ŬÛqˆ.ĠR: ĥG¸U9™Ë>X,½ıXĜÒmĊ÷-Ŭ_˙÷8kŭCƒ€ċĝ‘,K4—c“J6Œ j™dˆ)„ Ó¤’àfÓ\–™µT‚e÷dŒ‘2)[ ‰H²1lQ/”>\Hy­˜ÄñeüŒ”²Enp&žàĵTÔçYħ† kˁƒ÷„b\İV”,ié *deC@İòħ›ƒsŞT·”5†ÒIü9}{súFP;Ü÷/ĴÓ6™f´FVĞëïéïïè#` •L}ÂË&(ĝëŬzD|¸hĠhĤ{Ĉ‘ġ²9ÛıÊò­UğÚ ÈŠ\hôìá°ĊgéfM¤LXĊ6³ ½ô,I< {çÒaËhw0 lÀ&O°èŽ]%’²"éP‹…Ù°† ö’ħñ…ì’ËăžŒ\8Ĉġ³ĦƒŽ‚Á§•À2߆8KÜİR6ÉF³ñŭâŒxħDŠòd¤Ï%âLñ s,ÙĜ°Ç³44ä‘]VYh%[ON3Á_œ”%fy–U”÷/Jú (&²şßˆEĦ¤súöôċ³WŻ€Ú›—Ż7×çם쟙„†Ôjúïrì;s´S}cŒ kuúKíW-s­vÍiX]]5˜ ˘5²(‚¸Ó IĠ8 =:˘f· [<–Oóx–ÑÈÒÈÈ×;.Í IDAT°¨ vwK!Ħ´ĈHy"Rx-ŞÑ]˘˜YAHß/‹âOêôäôôhßŭXÁöòÇ} ĉڔñó3Ss:ŝ@ ’6­™ş7 ™žžžÒj?Yí£c ´Ù9gdáó˘Ù.fmŽ%šĴ”4Ú²áƒ+Ŭd‰xm‡—C`²–7abL9 ’0…r>ɋÄen˙›9*:êȰòŬ˜˘§>,d“0ëežQıpùMs90O óĝBĴĦNKYFÈĴ,>yBaISĜpĦ­>hÒP0FÒÂI‰QžĥĴ¤â ÔÜ,Èàw(Rí,pDzÄbġD#VÙI:ÔŜÑÑAĜ‚\ĴacғrD³%Ħ~F$ ’}£ŠÏCï#d’$> “£4Êù’’eİ8]LÒ5‚ŠHĥµ ·‚á„‚Ħŭ¸0p˘GE Áŭ×4iLżĉ*ĵƒ·Ĥ'`×@%‹eUgÀ‰PB=ÊRğ%aéġPlH‰†íTĈk³‘Ä3bDžÚlƒÍ_p4Q³l[†ÀLxLb)œGħ´I&äŜâWJF‰T˙ƒ‡Hú;˘_)i;>Úßß\‡żĥ ‘ĵöÔ °ú Ÿ³%§§&5̌jĤ.Ÿ4( ÎaҌ²*‚{Hj3ŬÜĴ,Ò¤ċәW˙ng_”ĥCH[`‰ËÖ ò̵ù,aĜ°°ĊK]S$ż ñ²ûègûH*cÏj–„¤ˆV(dÉŠé„ÔÉ0‚›LÄèÖĊ˜VÀ [şğ­Ü&òț¸‡kœ­Òq;İbc™‰òƒ×ĜI‹ïèŒci*ŞWQ•R2.&ôßF¸Îô pv2œPzRÈp^Áq`Ȉĥáá֚şÀÖN%ÙÍeÎKË\¸y°„àH)ĉħSǒĊ>•\ÛŻ'İímhÉ$› _íĴ)Ĝ`Ï`Ûö÷Ŭ…y—Óë_3,˜ŒFʚFÓßwO£5NÍܛhk~İĴICT#{ +ċWݚ5R“l2ÚU=;üż˙Żxä߇B;Yxĝ˘I{ˆ‚Ç„Ċ ‚p0¤‘Çu ‘-ˆ|YĦa,Á<>üv˜,ÂÇló‡ÌĴ¤Ğia:liúÚ˘µÚ=:‰öц%áĵùˆšü&—‹VAƒÓ˜R+"#˘À҅R 6 ;ĈĴk>_†-SCì‹ ̞0Ĉ Hé=u§‡ñdƒ`$ÀŭµÂÖZWÓ ämd¤£µ£s˜ğ¸‡,\ĵ-ûRıÂۓ7,ùIädôb!ÙŜmƒ“¨wÖ6èH×Â÷Ôxóé g–ɨçgo75Lâ;-ÂÁ]öfÜŞÓ(%Ĉ²á[ š^Żç¤'–Fs·ƒ_ÍÁ{Ä ?>›}ˆÓĉóàŭÇ Ġ ‚k(šLzF-á#ŽX pş4Œ™â2&Âù0DqßĤl%Y_žBÌlpZ“Ñ"J"½½}ÔŒĞP,“€yñ}V_(!%ÂB w …>²%'WÌA³†ó³_;O Éñ•ċs ^À1(Éì +r¸Ñiѓn#“M›žÈk6ż µr]{C ×Ûĥw´ĥvqö0„ndhy™›ŸŽS™ÂÛÓ7ÇGŠwœĈo9vŒ3+ްSĜ\Àicïĉ—- <³† DÛ'ƒÓúĜĝ­ž2/­‡¤ŻĈ&ƒUZ.£¤­%Âi\]Ġ͌réà ĝ%´Œ›œ²}ĝáßw#Ç!‘µR!–‡˙*kWYKGȖ ŸOÔmh¤´›Ô‘FÉ#‰·h, I$Šċ‹RÂâ&&q#òšpÈÒŜ1jpİ›ÇI AÉzĴ£8"Žž ñ‘í7ĵB!QĤ^“ù)(늲%ĝäĊ“‚L™$O>ìÍ/‘ëË`°Ò‚@Ġ)¨-y‘ÈÁ³Ŭ€­ó hÈş:nï jƒ]ƒƒ„mIĤÀä~}{š:bÁVú„¸ċRjw +î…íĝÍÑ+ 6ŬîM/I$'5ÈdL§'lĝzú¨ÑnĠ“-rnµsË+A~.e3ĞÖĠj÷Ż4$úŭ›îG· ‘˘!îM‚f‡<Û ‘0$CĜ].Ÿ 'cĵì !0jëˆu´À\Q½EHĜ9;&š$j̽°ÔF"‰D-—ÏDñs5_wûäWD …öô5ĞUì)İ?Ñ0-Š£“ı¨…¨ħ–ĦêĈ´JUQ;Á]‰ù3èÏbfV0ĥ ù:ä ĵŽxGÏlC D­ĉ `ğFƒ°M O ŜşĠÖÁ÷Öċ@$všetOŽ•ĥHĝ8•†°íìpóĞ5Ĝ3÷ž×ë^ßôJĵ3‰½Ġ pà5·˜jµSPq—N‰í’@ħsÎP0Íç‰$’BӃ zpΠ Ëıâ`˜ÖÖñÖhî Y +D’yN°·YÒwam9P³â5ĴŬíŬŬ¨8Û|aèC‹ĜS£ž–RL,¸fG{7(:YkĥîĈO%ÏÄQŠ€n@éĤTy@˙…ñδ29fŠ$Ċ ÉÒî(›:ı³6ĜÚ:"°4 ÖÜĈTċ čĴry›µâ,u´-{ ĥ^2âŬxĈBòTlÛf[d{Òżáuğ h4k2ëĥLĞ Ój ĴšÁĝİzHIÉĜı3ÓȇÑĵh4Îİم B28í_uÊJç½­GR"ıÊ1$?ŝĝ‡KP¸²ÉXPD,šˆÉÊeĥd4†;³ÎàÈG4ìí¨^_°Àƒ§Ħ0H%+™c?›$J™‘…¤ÜC¸Ñ(ÍZ'ğÀi×<·ĝh‘djÛ22ÒŬÙŞ™$ABĞ&D;žeBÌ8Îħi CZ­ĵ‘DÇ=´_~ɰ<=I”ĊßLHß҇m "Jրo€ °u vu=’eeÄ(mċePÛŬ÷?vïïC19ŝá´s´Óş‹Ë¸Ŭ\â÷sŒ2댴Z£öŜ´Éİ)ƒÙ0uù´jñÍÖì³:í] ¸ĥjžÓÉ"f½ÀfW¤òQu£›Ü6X‰ ò˙áá‡Kĥp ‚fµ„$À"}¤ ìAZ0+ ;88Á@Ö$Jµ‚†<l²ŭ˜Ŭġ%)ğ’ş˜´jp€Ĵ‘iDƒV˜5ÊZCÔâ8‚Œè6Qܵ“I_7ĴµtÜ—Ì†ÚŻ]ëÓ½/dCÁ¨LybÇG†s~™– MQĠ— İ(ÈyOĴa ,ن›k>êdžĈ/Ù­[]m7Ûnv‚’ܤԁW‚Mè|ƒž-[ĥ#p­Ŭ!lû~p~˜5\_Àĥĥ6ïâ°UÈ?;\‚fÒNoAùġ A‚‹Ls†O°‘UUğÁ 5êhĜĈU½ŽcNÁ?qlqRӖ÷35"iîGĞ\³wĝß?ŝcì†-Ûf$Öhñl[şG‚ñ$D+HĞCmHûÄ4|„fW•ĵE‚RÁ‘\g²VOjùYœ•xK,Ênô üs$@ŬúNîioáëTQ%pà9'žj‰$ZÎÔ,a!ċ“Ò>Âŭ™"Ù£dUUUœtĤ~‚™ Râè$q'Rǁ]<ĥA­ı­³µħĦĦ­ĞĞk°íĉ×==w{zz ܲmÉĥĵĵ½}X†ÂdkášÛíŜj0g;kŜ §Ŭf[s“ñ/§ÉàŜòú.ƒÁ9gdÂÜô=nP4˙ ĉo6¨]°ŒhÁQsĜ³:£^§G Ò!uR$EäĝHVĵxñß?ŝϞŽÂNÄ#aĝéÖ ÔM³eµRŠƒŬp¤NQkïè'À)d#9OfZ‡%1jÖPTT]íyv%NR­eä½Rá§agrJ y4ú—iiˆÂVWÓCÖÖÒĜÚ ÜnvŬ§pżK@k„ ÔëÇÀmcc6éœqşĵ{\şój‡ĥf[[s;V8÷os}~ë\&v52£ è q Ĵa5͢Ía7+#rH\KÒÑğ^ċĵ(§”gmnŠUÛÚĞ6¨ċÁ˙ŭßà‘6™_cħ.ù" ĵ‡ĥ=Ö!KJŠĤg[\(Ÿ•ʵ½Ŭ:ŝVÂĉ‹dŠyxÇ öSr—,Š,“֑x”ñ0…@\k·œ2ÀG £Ü­Û²í£t T>’ Ö-  &}í_´ûâÉ0ÑK„ÛᲙôIîc´&…ĠÛ/ô°s'ĴTU¨Eí„mêl óżÖ:ÜuĞ­…­­íŝ ™ä_ˆÙM˘ĥh·Í9wÖ ÚĞ££c˜—‹ˆĵîµ5n˙Zíñ:Ĵ=^çZğSÜ6 ŝŻ1há@Oš>šŒ?€ZÔ1HÌ­^sÒec™ge~ŒÑääF0:iRv÷üc£Ô‹*j‹`#Á°o„AĠ´ ‰²2Ç­C8ä7FI ’QkGûÈRûÈwÁ dُ4ÄKÖ ×˜ *¤N;÷‘îp/şá(ù²0(Èä Áé&j~Û;|Á‘çÛÛÛùP†„nCú…bôV”p:š:aV†“£ò2q•D²Tĉ‡_"“„“Œ˙@‹x––ÀG–EG^İ!iUğE¸Ú%Ħğùċ×=ĉlë{e Ĝ—Só+jC—kmVÌ k nÖS=ž7€EĤĤÀüI"ÚԀ–šÖ¨›2š —Ï@˜3Î9so•Ó´ì‚™Y§×3ÚÏĜñœÓİ˘ìĠĜÚ{ñü…´mĞĊê˙ó??ŝcvxÙ´tÀKŠ$b´U”ĝÄĞ…$Šgñx†Úğ}p,`‘#ĵïħlC£ìkЁÚYħ Ž\î….–$še¤½ñZ͕+PvŬíq$ Ŝ.T¤Oq}"Ĝ~A³Ĉk€­ré³|×ŭéR*öĊ‹Ċ8„>βÄÚ΂ÀV’Ĝ¤bŝÒjÀ˜dŝ„%xÚkPH¸ÙÖ%ò‘ĦáV¨ÈşZàÖÜZ[[ÈAÚŞ·›7oöŝğÍëġğĉ Ŝ}LY[†R7W{+7„̽éħôşÁ!ıIÑÔ¸+tŽ)mb6É͊†OLd2͙×VE1êì 7=PÓħġÍĴÇ?‡í÷*ò¸ÉF(ö°˙~üHÛ?Z—qi[8U|‘¨%˘0C °L"tŬß}‡Ú;„í`\ôĊç,´D2šd£žJ…BšÔ›²ö:°dêlżvċJŬCVü’F#ˆV3-•e;ÉDJûH7ÒĜH8ݵˆ ŽŒXCé\Ĝ.VkZ8ŸK2+*ç:ŻŞş‹_¨,˙3)H|䘺ŬbeÙ6ĜÖ Ì„G644·5·µàÏ­Nvëĉ_Ó?͙H‡;k6ğwËıvÏ1dkVĊíZŸw€™°bqskĴ·Ü[.şd&—rı‹ÏÔ´£wçL\…éX˙D~Í1‡œ›3ëufFĦÁ:5GtÄëwúĞÛ.İŸú #ŝ0&_4ĥ[#Éı‡‡ó@ú-¸äC#ÁHÄ:D TÛÔrí팞:İ‹gXM)ŒŒdá’ÁŬŽƒ”l[‡†İžÔ´{|ÀG´âÈP'aµtˆßËôèfì‚Zĥ­<1Ŭ@-´„ …°ĠaN=—d,İb‘RÉ Qy£)œœdhÙ$îŻêGHñ&šê!o€ĦY¤Ĵm°ĞçnŸVËáŜMö´Cî°4ĠċŜjûNP}İäŜ\_wğ7Ŭ›~¨Ĉu ĥçŬrÉ6rƒišÔjÂé›Ò8l„ƒDœ€ŝrÔà‘gñüU£ĥVıqzsVĈ dişòĉpJLëĊá‹=it{Îöŝù‡;šqÌAŬâPžmàf%é'jK´C£0?”5Ш4ˆĈk˙‘äĜ>²™*2U(fdšbgh°n[ a“Û ¸£c9´´´ì6BêF¸CŽĜd÷ˆ5’NĝĴÇÙ\ŠcÄĤŸtĴ)ĈièŞ=İ,S+Ue1’’$·²%4°ûp°³µı™żŞĥ²vĞë&ŝ1!bt˜L.À²é÷?ßj6\M×é×ô‚êïà¨oŞyžs­Ĵğ%o⚗ä&ÙWjš™0éĤżĊëˆ&\-×ċ¨ÍÂ*BŞìĞô§Y%nü—v|F h9Vŭ§šgGsFÌöĜPŠû/Ħ#'Zyä;|aIyŠB ǎ=Là[ƒ nÑl̳6(°Ök×,Û¨p, ‘ıYlÚÎçé1 Yä­ħĉšĊ7ÔÙÙÜ"CİĊ!é„ĦqŻAT¤% v7ŞÀĉŝÁÍ'+ .·÷PlŬ‚‹#p—Á0Çzĝj£S…7ïKeMt#ĊlSÂüN‡yÎ =İ'™•²‘Ġ9İĝ' "jԌ‡ĥíşĥĈk#AF ğ™ŬĥnŬG²„aP ĉ4†F„tƒ²˜A³ħz’lÒÇÜJ.Á$g!1€ Î={ßÖ y˘é‚vLšñÖÁe @kĴЃĴ5µhĜ*ú²ƒNwç°mhÄâ‘Ĝr$ĉƒ²„Ü1¸#ğ”z›“‘Ù ,Ґ_ Ê (Ĝ\QȜ¤¤Çšï&9ĉàĵ\gkk Ú-[·‰YÛììÄ}ŭŭ‰û=]fżÏíöz7vp™65÷c÷ĉŝdlz ò‰‹upá6]uI>OMM›…ùĉĤ5#׀ÂE\CBJdËë]ƒHıf3ĜˆÈé4Pž'·qKŽŬÛÒK @˙ñ‹‡ÛZG<ŻÑ§‚ĴEb‹/pxhh;–:Xĥ-[%r¸ ·ŠE#ÖÑN\YĜ ċí§P0œ”h˙kQ‡Ş<Ĝ ìN5!"t zëĉv€F)ĞݵiíèĝlĝB‡J¤Äj]Ħ܏ÒâYĉ §c8‘!O˜çdÄô Gf°ç ĤL™6ċn8œóÚññkÍféP\˙–pŝÁÁa–"ÀÙîìêÓ9ÀÖĥ€Úγ-%kÏ÷a69‡ĜívĴCÔĥ@Hĵ¸ç:ŽKëm˜2˜€ÀœĜ8§iÁ%"ê^ĝÄÌ:=06n:FZ0:U"Š4lĉtlıèoûıÍù°ÚxïWîöžß¸<Ô *íÚ5ğ´xK#Cĥíôéñ2P›µ 22ñÑO*Œ!˜ğeÜ’P F9½D*EÓÂßv'ŝr½ĦÄ RvAÖV˜Pħd¤$5_4ÔĠS;äġä!›ŽÖÖ:‹LĊ6ĝ| +ħĠ%NŠç´˜Ï$clC8;Z\všçOñÀH~ù  ñ"ÌÁÌŜg˜˙&DMıĜ]]ƒ]ƒ_ŭ…“cOÁ²·ïwo>&];<ÜqTFlŭ dúŝڂ›‹,$ 'ËÄ%|°i&œiÊDKĊĞîËوÑĴÑÂ5:À½GÌôö+BÜ :Í´ËYżcÓ%~›èÇçjĈ˙s!&vğmhDñB\Ükí èѐĠ²ÄâŬÒéċĦĦÁ቉á•ëhט…3ÀÌlP´ZO9Q 2°k›èji¨ŻĞğR‹×­­>ĤĈ–‚ÓA£V[÷‡ZA çżöÔ¤ğ¨Aúöî“é?ÙŞĥá^—vNhJ˘IóÂô-0şċ÷:™ĊfüÉhjßĉ >eÍû ÔôF-kĤ ·3“ÓSc}_ŬÛ{çÎĜÀG`kô=c kâq£KöÙâ$lÊ$5Oĉùó}p\ó0ç\ş–šĈĉÖk´3 ß`ßPMĦh„VaÏiïŝÎǜ3ˆ]]°?Ë\À#ÎQ”Yj†aS˘ğ$³]7˙ÔTsċJ-\ĥZÀÖÔm Ô v*QY×Pw…ĵħıı‘ÎTCs'<ïö!PĊ!ĞĊc]b£mii”Ž lmo·& ‰°Žı‚1‘ŒÌUĤ­ü‹R“AY0&8'äèċË}xcN³aQ§çĴ `Ĝ3Ĥ5‚]ì³ğJÈM‚¸IkvÈQĥnú„ññ' šêÁ…µ Ûq6§Ù8·$lßáaM‚ġiğ6}OĉLŽÓû ïpGNïíÛ·ĠÇŜŜñŜonßw‹tĤfĉgĉçñoÂ>~ jË l×µv(ÂÑÙ(ŠŽî ‡ŝ4]j `ꆒjfow÷wÁ°o´ħ‹ÑöÖĈöNŭĴ1òcë$$ì€]µ´(T‘µ›7ݍ[-ŝĥ4@€W]M >â›5ĝĞ×ÜÔT[{Ž]+EyÄşd…žöx–FIŽ–"¨íò(‡îpœ…‚2:µÇn8Ö^˘öÜŭ„4˙´ĊÄ\ûñ÷nÒ¸û{̇ÂθƒA²cĤi…™2AìĤè_CAr—éĉ¨ŭ;J­Îë½ŭ n½ßÈZĥÛÄïvu?•ÂV–‹1böñöàÁ›ĊgèÂÎNP€††ĤfúV×ŝK‚ñ5u¤éׄŭ[;şi˜ÀÔ;gí\ ċN¸Ĵ Ċ5‰‹ÓĊ]jġ 4ŜêëĦkjëEô¨8qÇĤĈ†ÚÚWki˙:†@Œ^ÙğF IDATZ‡$¤…£C”³%ÏòÒè(ìŒß5Ŝ$Íy­Ŭ—KUŒŝZ–nAUéÊ~Òr5ñĤ$ŽËJRoŜ¤Ŝĵ}{*·7Gğvŭà}³i~~6èùŜ µèúħùĜñxêrŸjn³Ù½‹ŬûäÛà†Ü’1tŞpĦ“[ ÌÂ;Á8]N¨°KQ›W°MŠ•Ŝ{Ó÷pƒÂüĉNoï½o(k½÷z'g8.vû(i+€Ğ ÛWMͰ',4턵Â\ µ6556šŸk$ ä  Ŭß)_›ž×ŸšZ:'à£bél2•ΝĤÔĦ–úß]Û˘ëOġW>Ŝ>Ğ­Ż0 5ˆVíçüc=QkŞŻ­żñG|€o0b>Ë8xdÍÂÒü€µğ}”Z€…˘W!×,ég¤¨†Jşˆu˙rİĴFż‹ż nħt˜¨eĥÔñÎĴ~jzzf rcħòĜ½³^ƒùr-ĴCïĤ×íuÍÏŻCwş]†…u×ĉĤĴ/˜\5ŻÓrÑ żiÚ üL.#žë~rie‹;Î'Ëdo÷äŒjċĉ¢Ŝ{œ19= {7==mšÖNϙó ëß?yòdċÉ÷€mċû'Ü?úMLPëuĥ³jÉf8;öġWׯ_§!"Íß „˘ñZûw™TQ_}u½İ­oʰˆ½Ħŝy{šzszÊ.ë AŭgğÚêŞ’FİŞŻŻ­iş~wo|ŽŻnܨŻ˙ĴÚŝÇ絀²İmˆ‡€úCÔF­²@(d’†¨ÀÈĞĠáŬ\ëqĈB™B‚[ĥd´Á/ÒŻQ…L 8PĠ+iġÄÛ£˘Ä7~˜èŸ™2­ŻÏcüŭc÷‚Ĝ Yɝƒ¸T¸Xë+ ë܆üĝñ÷].~k^íŽ4MO1|<3³0‰ †)|œ_Y—E“ëó+—wĝ:ĤgĤáDÓÎON²É~ĥF "r—ÙƒiˆšVĵĥıÉñ™i=žG?’'ż$>¸ÑT[×ĜÑ ŜÙ!ŭ Álĥûc˙yìPmŭġÏk5\vxÎ”ÈüW·o´4Ŭœ2Ĵŭp|šSÚèÄĊ=ìÚÍ]-µżË ÁK(Ô>˙˙¨­ŭüħû\}Ĵ½ŜDWâ.rˆv[ÁL­­öšE^cˆ#t ½ŬÍD¸Œ$ÄʰLµ3Fê~}‹ÛŻo9Ü Dîĝ8Ĉıĥħ^n?˜žYPڇ€T͇BoŝŬ·…ù °ä²x.£œžššáJÊn½”ċn@l^ŭ{piŬˆß 2ħRËċ˜›Ÿ!³1› 흁ğĉêŝ|ğ—Ş×ì4AĜbò0¨#˘v½ĥ†ĵ££µ½sdÙşĴöÔjî|ġG‘77BB ĊjÛ:XŠQ[W˙ĠŻê›ĈfĈ~àh‡Ó79(ĦTş °QEîÚ)kWê>ÊyM^„¨Ŭ¨żBYû Ĝ}އ?˙üs|ĥuÂ_ƒ#Yc5Ĵì¨ç8ä–¤PĞ—wuµ–gçÚh(òtiééSÏSĤÏÓh&e%x3§oŭµöMġvšz%…ÇoŽzÀö w``faŭ wĉ>~ü/xˆáï´íɊ#dpĴ¨O\°;9ġ­`ÀEyÍ´Îmùżŭí2Ôü”°iĈ‡]NÓÊĵÉĊ˘:½ïë1öçtځ۽ÓĈıY£Ó€cabßáĉĉ“Í=à6˙ä Ó£ß˙mü_Á··v°€ıÄÙû_ġı\ïú†şFX8^šúz°öĤ:BPW×òċU<ĜF=ez¤Pŝ²À¨Rô5t¤½ëžZC İ4$^£k!kWj˙H­xúç"‡|ìú›pî„9ƒĴ1Y+Ô˘D­İr_§^Ğĥ ÎOD͵ÑÑÑá‡pêĴĦ ˜Ö„’¸Â/oÒ)òK%tìÔ.H‰ŸÔîôÎ ôè4`*öávğŸ€îŻÖ?ĤQ[y Ċùäñ“'n¸IĊ5DĤÖĦ> FY×+vn s~ž_hO^ıµUÇüÀÀ`RĞܽĤìšÎ¨í˙3P3êœví$¨Ëî߂R|ßcS@{ħ÷ŭßığÖ Ô¤4£ZlĥNR‰Ï>£2‚+|M„ ¤¤NÁP×@VĜ¤·ïŒĜž²Q⤐WŽÒññÑĈ4dŒ—Ĉúü p&ĉ7(kW›€ZÓU>|Em6ÛP'Iä’'XĤ´ y˜ší¤¨Ġ5Ô(ı5lŞSîÚ_tŽ.= s£dŠ JÄ_Kqç•Ú0úöíÉ ôÁéO)éz LtŬ˜‚żmtî=ßß÷ú½ ömnуvşY‰ċv3tLOY§Ŭîdħĝږ“;M`ŜúĊMn›ÙdĉtOĴÏ&ĜÂe¨áçç{Çĉ7%S3?ibŸöœ˙Îí?÷Ŭe@òÎíÛ}ìĜ†]›œtmBAÍç/žo>ùž˘ĥùäoיLéè£ĥlġĜ€[ȳ4ÜÙÒ˘Húï–²QPŽòŬÏĝ@méZܕUŽİGK¨ëEOû`×>Ñò‡:%gFB^­#ĝŸµ İijŸĠŝٕş&`1dngĝĜê98x–—‡–#ÑÒPgGSSƒb<=u Mġ‰I]Ŭµ/Zq~ĥ8¨&ŜTú§ƒ˘ĴTIÇo §@'²50|ż@§›˜X܀çÍ}#*Û/$ĞĊÏ*~¤fnyív/—;6dd'ƒxY³ˆom2ĵ²ġûÔéÍËQëìö;Ìó ötŝ ĞfííÛwúïê˙ŞÓŜıóçŝoz³Ñ8óÍ$mڞ’µçüĝ?P+˙äpÔ::GG–— 6Z›l¸ò˙TŻRM•ßQkñECs}MmsKóÄân~Úéżjı 'é×ğ‹]Ž U×TĉÍz9`& @ԕġMµŸÉë}†'4—°ÙDÖĴxĦ§/ċ´žÎŽÖ–Ĥ*ƒä;‰Ĵ“Äg[hnh51ñpÖ59fżÓP|–½Šj$Îl§&€sŬ'îsġš°2]‰ûvF˙½1ìPAğ·ùĝr ƒ„›œŝ-ÇŞa²w|ÚȂ˙U˜³Żş4ĠŭU '›az`|R*ÈöžĴÌo_y‚Œß¨…]ë`îó¨XX5(œĥ?İËT[s "X½h¤“ 7›ëj›hħšZZ'*Ô>*˘““ôOÛà­[ uŸĠ´ü¨AŸĠáWDւŒ|ġŸ$ù¸~ŭ7à/BRz[ 7·pÑ cyž¤hŒ]Ĵ##ÍÍÍġżĞGXC@'EŽWêZÚZšu …ıĦıù&Sgz`o³.BjIŽİŠT7‡ĝµû˘!uöى óĴ˜Ÿ-,˙³(Ğïm¨ı㜠(UÁ[RÑí•qû˘^Q°ż§v(ˆ‚ĵÜ9Ĥñ&nË6šԚ֚Íf IÈ×züì~nŻ7tԐëLcï9ˆ× ÷÷ß>#b7˜´„˜YX,> YİÖœÛФ ŸĠ5ûݰĦX¸ĉÖF\ŭ/[jê[É&qĈ[íä#)†ms…Œ"‡ÚZĝĊĝİ!!ĠM"k˙ùĠWMW›nŜüêĞ?]m‚ˆá›xĦ–Ğ--7œQÔ& p#Ĵ²jĴ˙]ÖĜ"aŝç*ħnhj$Ġ­olù²íÖMÜîwMĜ–lĥƒˆô TĵDJÛSż£618Ë&²ĥáW}v³}kĞş0ĵx_ŭÍĠ‘|VU!n­ŝŬëß`á_06¤öôÉ'QsÎáşKàÒĵ&bg˘ ƒ›v›íĝsÚİ?ßŬŻ5èµĈéñq5$ ÛœìÍż÷^gALjĊş´vŒ”ĥ—Z5¨Á+ä Tr”5jHˆO6żS×ÜÖFypÀµ%ü˜aÁV`y¨³E¤ħœ½ı â€OMMWŻCÖŝşéúÍžŻżşq½ '„ô¸›÷î„ù„Xz~Ԇ:˙MĜèwԊçрUSOê)÷@oĦdo l=ҍ D•WRqJQŜD ˆM07:ħY›ċ(Ĉ-p ğ~‘°°íïùEàŞäÒżħQċ—"iĝ’ûu÷öŞs‰‰³A€öĝòYĴĈù·{'ÀßEħ›4jÀF´BB´\ç|¨ACéü&³Ĝ^š4aŭp,ĈżékŞ#aQHh´£“½Oµ$ƒ‚ôù=¤äPG°ú‚bc]]ŭĠ/żĵŠ‹Ö@Ċɇ!‘p§c‡=ËCƒmÀ+=ohijl jŒëÀìN__[SËÍżüċO@­İċj=“9--ĴWì›Ŭ=QĜ7PB됄ЛjŞäĈ n€XW|o¸ÚÔÂÓ že-~ESӟşÇÄĊ ˜Üİ‹` §jӲѰŬĈsnŬÂóôtü~‚àwÎêí ‘^N&ŜŻ˙Bémlù·ÔD[ŻÚ‰ĉ•g“ƒ@IV)P?n9àe_ŠšÉĊw›1-™É$ŬìU=€öWí]¸n²;Ċ´BÔ¸y“]µ'+Ĉ{ÇÚÈ A jCí#¸V‚ZóŞŒ­n0Sc¸Ü¸dŸ}ĥ_÷YŭĠ?]•\ì–[‹ş.żùHĦ:°6 Ĝ†ğÚèŒÑ¨Ġ²6Ôğĥ––?ŝéĞ;½ŭwżlşŜÖĠsóúuF9x”¨Ŭ§àJËxˆ–퀓(èLv¨wô“tmMÔ5MMÍxmÜp€ hqkĴİ­Ç­ĦċK21811l[˘uÜ8oK‰èÈ`×àDh'q‰'(ŝU£ÙIŠ˙ï+›dƒµÒ ~ç†èAbL(Ġĥd˘ĥ˙Ñu`-Ŝr~†éP²gŜüxïĝŒNo˙óí{`ĥZÊòδqÚ`4˜ĉj›,HapdeeċÁ7ŭ÷;)jlŬ°ßehYd­™Ê§ŞŒ`Öj˙PWß҆³NΈĞĉQ¤°Ák›0wµ sV×EÍ6*¤˘ĦSbT³€­ħ‚tµİíVÛġ–ë_ŭgoïż­ĥžžżü —ġTd-‡‚ƒş· a ÔÛÇٜ"1Ÿn?->`{[;ij­•ş² 'h‘T:§Ĵc Àħ̳ĥ[hñ9$’ µ:ŒUV4ʙRı ܀ %H‚$ì A[Ş×OцÒûçÁFcccSu)¤—0úɨ ݞŒÙZ%_aùĴlVúĴëÁî`29HÓfÁŜÀPA [ßĵıL[ÉĝKêñjOŞR‰ÛlŜ…;ܐ61эħ‚iÔÜ´k š-í_ÎĜ=f䀈¸ŭn ™HßİÓfgXw[lħÉU–è7û˙°ÇÒ6dÍk9#Ŝu[ÛÇm­xŬÒÑÑaġġô„t—ĞäÒüöŽ3mmËDëÖö‘ÉâÑ2@m}b‚èè$ìŭŝ¨­Mì*£+­.·ÇJÔÈdLbċxN0žà&çĴô¸í6ècVô‰ÂL2-éèù·ŜÁ°ÊVĜmĤ%)İ@-֖˜\+yD*Ğj@eCJ8jċJ.šŠƒl6”+÷`CĜˆ@ğħ\ğ~}ôä~ÙİYe\Ĵ0:”ÊŞ%Öd2í f½½İdÂH÷ôjUz£xO|*l|µËÉbbÒÙ·°ŝĝ!Ĉg, ħ[ż³×ŝ3jm.K °:‚3{ê4÷£h†îqÄĉQĠÔñ…˘#^gĞx|äwmâ[;Ĵç=—GüW‡Ġâñ8éd›Ŭ µrĤ•Ŝ@ĵ²òlŭ–Š,@à¤êQkžİ<Éíl;c²v‹ÉÌK³É‚›°Ÿĵħ…Cq’†Ċc@mjlŠħĞYmÈ£1§ jT×5-]Ĵ-İNñBĉ˙²˘¨È ˘ ĊYÚŻVol~ŭD’È2™ĊŬ ˆ-7Ş7GGoœĵëp*1›— Xex™µ^H…B~6Hvw_lY š™Ċù@4óù%k_5<œÎ:3ĈX)‰%ƒĈ˜ÛO+ÔÀĞí&¸l-Ÿµ[@í´ßF<ìäàà† YdçĴw û❀&ġ)ĵ1Ż#1„ÓîKĤ/gĜç‚‘Nĉ†CŬ—ÍdVÉáşaÄc^§×;Á½,Ĝ -@Ô o²jÇĴ˙xœpħZ£”÷Ë5Ù¤T[:îĜôä ûè–ë5UQ‚­Ç7+n3îPÚ ğvsnttîÄÙÔPO*ˎˆÙBnˆv­Z|—C!~¨ġJᙞZ+€¸ŒŒŽŒŒÎ-ßĴ j>żnè6sg”¨-,<|ĥp…`aÊfnoUÄTĞ`úV€ éqJ—F4È1‰mqUV¤fYé‡u!la÷)Ċ Ú0­Ž³@ÍzéR7ŜÊïÌ䴟;sĈä xìŸËam£Ĵ…áoK- 7)¨=[Ÿ‚‚ÜžĤqş­ƒd@ÂĜ}g$½ëÔ{‡sÙT¨§Û'6Í-³Ìe0ğ0nŒ’ħêż”:{ös*êY‹%Ò̔2³•JQĦVĵµy)D5D “ûn*v˘"üÙT&á,?˜ga‹“íZj°'Ĥ˜O)@’*TıG{$Ô4‚ÁtW7‰d”ehˆV–2W İVŻŝëżŝÛ¨_‡J‡½žXß#jµ1‚ i3·µÈ²ğíÌǐĝVn˜n·Ċé÷kM`üé°Û톳e£Ĵ1 yïÒFéo˙ġKüÀéŠĊŬĥ3ÜËnqö_èèhkíè„quş:Ú8öç΀\2 éq8pĜ\@-ıgŝŽŞÚJğöh F–ö PûĜË}èïN胕sı"PIúB=Ŭv6F•Y4˝NkPá£,¸ĵŭòÍ_~ü³ÊyFa3CµkzĵTá֖îP޲:{ħ ÔŞRá¸ë"UŽ+$=X^n.H¸˙Šgѕ›½^›=q×a6u9¤Ĝ´šêŸÏġv ÀHöwwƒDBS^Z ĴġÀo˵›Ġ!ˆÚhU÷„Z[[çP£*bDbauŒŬÜŜ"4›]P‘Ó‚šŸ²äü~ —€%÷gŭnHœ‹ 8N/Üyĝü{ÖddèHhÜi˜@a·qíŬżÏ7y‚ IqtX\šÛÚG  ĈK—ÚóÈ{[VɎöÖÉ!ĞĊ o&aŬĠ4Â-$TO'<žÄÈĠĞWŒp‘A:Y7 ”×K…B—fŭÛ7ù˟˙¤²~V'ñEyâZœ1+ĠĦkd#E`ħÍùfÜqžmuÁĝı˘VWğn½5ÄKĵ6ċ‰/Il™İ%³'˘–/ ]äëJ²Òġ_0 —{CÉ@€].÷„XŜ°@ÇBYz|‚Z‡&Wf‹ÍĤĴycħİ݉Ġí½7 µĠ;ß,ĞˊZñLıĈdâ I 6 ĉ½-ÍK4˜„‘e°ÊYYĉn,+ɐ1Wk”;×XŞ@wµ‚†ÂQ “Ĵ¤#6pwo`ĝ“>‡£ÛçsuPçàYğ\­&“Ġ!ġÈ\ŜpôӉġuUNž’öòċ³Ġİ‹ \b…XÀBùy‰$$é¤ı*—'022ÔÓíqşW+ğ-­ ğv~`l8î,L°8AsQòávi˘˙Òi˜(·Ô|¨qC3ÀAsĊgá| IDATĵ†™oqseäŜŞ4+b˙[‰˜T|ˆĊÁ,’µPŸßqAÔ¸r òh·ëšÛÒa2·Ñ%´ hÑĜÄÂa{ùĉċöê´¸ëg>&ħğ(ŬD>­4ÎÏċ \._£ĉ‡0›ÂV0ŽÇ&§ÙHOeH“HNñ›šYÇ$­bjU˘V‘Êq9†.ĉ™`P­~ÍÇĉĠUµ !Ä”R-lHgPa•ËìÑpíŸìÎÈç{†RÉT–œp fµË=ҋ#)²Ĉ² ]—G€mêêżċ!fC9Ĥ˜@OfŬ0 äĞ`Öo1Ŝ71ĥşù @“ü' ·ÄêDÍ3ŭ1Ș% 'r %ZZ׌b1헲bµÌĝ*ÛqíĝżŜɎ_¨È¸ÛŜzş…éĦžñóô¤Ç Qƒ—îtà+{"e xZ) OE½^‰b³ ÷Ÿüĉ^)LOä_ZH;]v8è'x?4^M­êç{çGzBŬ-’ÎĈĊ)q8üĥ9™Òôĝôôú³g/˙ôç?½ä^›g ıuÚlÎوfİ)_ ²ÈU:ĠŞTh:wΖE?ÖlĤ‚”²¤q1kdöÚµÑùù/N£UbÌâH]NµÂhÏĠa#b–?ŭµK=Ü6LÔ$cĥ0JĞVÍ'Á*Üm-m}Ğß>Z%Ċ51 ÍÄâHjÛÊi“Ĉowéñ"Ġô!ŭ7ܚÙr1ñ”¸EEoħ YHe­ĠI.²ajA^îöXÚ̏îvùzşéSÑ,ı jŒ˜é8´ifĝ jëwÖW×!ß|SOHÒêİS4RNğìÓĊ´x?hËŽ7`L%Ħ_0 Œ<ÎJ÷kRĥ“blZ^ŸžäÉ?ŭéÏŝñ͛w/Ħvı]ÎĤ†,³uċĞRä^iÈÚÜĴĴƒâ) Ŭ¨³Fu]O—dGüï†J„|Âĝ€›-ÌÍÏ˙“žP)nšIĤÁŻĤ²Yѐ#Cj—Yƒ; ùlŠ pÀ ‡ˆk>¨ğšİŭÊs6ŒYX]Ÿ62ÖgV;˙á49{ñƒÄ"§Ĥ5.̵A•u÷tÁ"Á§VP·Ġlvé.‡GOSĊY%úbKTV×ÖİħWWŸ6òEe›ĴnċÓ;ìÛÂûŒŠÀËa@kx¸³ÀÈg 4Íëfé s›ÙŻŻTâÌı{öìR—ċ3îĥĊ"ü³ óR!`ü… ĊÙ G†[Ġ`Ġêµ%ÈÛR]ÒTnÏM3ßÂó #s˙LÖ ùTÏċÔ (ÊJ²…ÁžžĦA(ÈÁ^Ĥúdó…dsîòÙĦ‘Ñ*‘kŜ…l\×üñܵöħg ӜړcDÍÛ´j-2ħ#ԐšžÎÁ@iĊ"Üj‹Û¨šŬ­āZ9íöKÑâFéŜ³çP‘lÇ6ë1Ż,§‚÷wwğL“%‚‘íWĜI u›M­­ĵ"‹N/0)kbŭĦT§d1Ĵ•JÒzZ6œBÄD*]à0 肣çÑHÀŞéùìp>¨1gN‹„Ŭa·kn@­RÊPEĥ?ħè57’Û]†ĴÁËfÜQ:Âפ+KÀ Xfŝ8É´fğ—°—ÊjaM:É?XZVё'_on<˜˙âúµıċ_ü“šuİ˗†˜kànµ!½H CĜ¤6hïĞÁ\ È^şœ2ò *Ùlà”—“~Y|O]³Ŭ~ĥÀäAòtµNµSm´!f7’´û_ÉıA=lF~À ƒWĉÓ Ş p||e•ċ}X˖ •÷À'Vá°µĥ´œvşàF.·‰ħSï½6âĤfd“Y†EH§¤T"#Ĝ™¤ä·ŸaŝI‹‰ÁŬ.ÇÀŸϓNäġˆ–ÌçFBà"̀ÒNkqüUwšÛ%•âñ&jÏŝüİuŭ›—Ğ0líN̟"kÍRF(¤’µ KZ•Á™àCÖŻRH~$z™ÍÖ²ŝĈüÒ͛˙DCfÁt{‰DZż¸#ö ²˜‡­'IG nöPıĦ\òr÷^ż‹JM7œ§Nu2m•$‰>НOqF+8üixĠô`NçsN·Ŭ¤ċ ž‹µ ò5ÄEǛ*reu•†ĠĴdħ¨M†ĉS-fğáÓ5—Ëj‚†tz{Š”œ-(¤ġȃWri$jŒ—SAN‡íÌùèGĞ‹´ÎëQƒ”ûáŬ„5óóġR7{êj‘xÄàT‹ğĊZÚÜñif%O ‹”-nR˜k"Úi6ëZşĴ*ZĠTĞ‚%ġĊÎQҐġFmV ›pċd7–üš·YĤ€Q˓{B1t Ŭ˜O‚AIİǚMŽ\bÂl@2YĞĉ†z²²ÇGa¨çRWP·³4iÚo9ĠÔVYĝĝsĜ :™:Ç%kê.g8YâaĝñċӐÂû‹°e=]Î;gAPœ jЏž}ôâŬ,­Ë–^ŒÄ,--¨ ĉŬ·x4W ÔòÛÜ.`ɅL¨Ç6³‰Nv§·oŠU`ـèŽ8|wĤcNÉğh@œ`Fí8t$pÁÚĠ˜ök.ż‘ÏBĦP·#’44D‹ÓtPpĈµ4ó#§§˙DIïŜ½\ŸèóR›Ä%îXœewAR’YxnċÊ\•ë5•YvĠ…UÛMËĥܨË@[Ç˙ĉĉĜµß߸Á]ù˙¤ Ád08œJÁÀċä`^ Z5O+ôı~“U5ä ¸wÒînżdN34–šX½51ÁĈV‘·&`ÖNµœnµ9£BM/Öòà"?:Ùn–í¨eâ *!·Ó°­>;ú~ïĊ–q?Ú{"ùxŠ ,L.Ğ£? ÖéçpêÁŝ€Ç wǨĦ yÂá)ißş-ĞĦŒOMze9ôƒ•ŽžaŸ“Ħb‹²fÚH댊°¨Ĥ8kš_‹€& 47ƒ3o,3-Çì<{IÈĜ‚ˆĊpúlŒú)SĊôc½L•HύL²$-jÜkĥĜĴú’¤ˆ³À-}kîÙ`hd³ħħÁ⍖ż¸ñ‹_œ(kFĴ1 i£fÄI§ıž–̧†zù@ĦœOô\Ĥżï`‚—ìén @K§ŬĴk{gÄ]²'nG/ĥœUo‡¨QğÄsĥˆîIËe‹ tÂN˘…5£R §‹yëŽq#SZyĝGìŞĊžóT“Ğ1sËéVĞĊHêšî£[Hö†BR+š-\‚µxÜVn ğsgJÂü `#Ϥ'KÔ&Ñ5³Ëáë†{ô¸¸" š”ĝ` #éb&ìr0† ĞÑŞ˘3p-!m[tZĥRNO³Í¤Jŭûñ‡—Û cQo§™Ħ² (GùsĠ˙8'=€ %WÍ=—Ô ġasµtS%•Ky+šµµMhÈë׿ĝŭÍو‘NĤz{Rù"Ŭjxħ)’G²žža`ܒĦĦ,„­–M&³ÙĦĦl*@@ŬÌm8ע³­½ol[µŠ¤†ĵòIËéöĥ–Vµ–ĉ֓ 7ĵa=éÉQŒMż‘€Ëôbş²X6èşáÈĴ<}öLz¨}˙NbZĵú,íl9e²XADÁ`|V“ÙL†zv3 šı½ †ê cgLaíğĊPöFd#ÖÊ‹ĈˆÚif—ûÀ‰“`4vğËÁ'â$ÜîtĤž'1Œ)èïv8àiŒ³‰UóRaÀXĈè¨Ŭŝü£tĜ~óĉÍ0÷{T¤A5ìb•†ĴRLçj,ğ  8[[f)òŽċ*÷Qċġ?aîÁĤ`ÇĞó_^§´}y˘ĴQ˘'4”#ù„$€9ĦˑÄ0Ğ„r3K~ ’9œ 8|‡;˘;-.­˜f½À‡š$hpmíâİÓm§OµH? <Ş„¤öD qz\ÎÁíö4dPq#_”Œb .-Üz´™•gÌĝgS/†GXZçċö´étKGC•ğp˜Ì΀?ô€Üµ³x–KcɘĥvĈħoK÷J ‰<–¤QïÇĴÄàdâ€í†|ј4'È fK: {˘6ÒNÉä=#˘–†Š3;":µ-ècÔŝĈ)…3[ë‹Ĉbáp¤RÊ_˘‹Ùb1CŬ(é#5É9¨‘ċ7”˜m6·=}-I?Ĵ–ĈĊlnĉäï›_œ˜çŸÔÁ÷“”µ|.ÏÖ%6•’ğ†Ixhp{z‡¨DZ6ÙŬ twC?êı˘fçÓl}wžħċħ ĥʜ‘_cŒNµ|lħÛéÏ:“ƒ~a’~˘–-gáèù|@s9ŭşžÉ•aÄËċb:^.gŒR ÔUíÖ|'%Q^üñh;f> &a³X"j& ıÇǨT›ÉÒŜĉr:fc1‡vâ6Û£¨vz SÑèİÓ|µÏ× énóĝ=¸Ñ–“+h¤uĝììĦ;ÜrX<,pFƒ† iÑHEúĤVY°‚ġġŝôòÏBûß4×˙úú˘LBÎU„32ŒU™-Wİ g†™Ê’„ş–î°ô`cÁĈת\#3W QےšÄs£×Ż˙ŝ‹ċF"™ u_΃z$ƒ½Ŭ—!|A˜ıŜŜá÷§âH(1XNĤAÌX·ÔĜÈϖdêZgߪtee˘¨´qżŭ„[/[$¸vI$íĈtxħÜ?Œaç‹U·³ı"ħÖr1cT룔_ùfu[:c³"ğoo?"jgĴB;œz¨“œÏJG­µ bĈŒP#ˆmŠe—Ç$_Œ½š××oOôÙdoÄ8àYğv— ŽqZwXÚ,ÒÒWwÏp*ÏŞl; ï^ğvŭ÷7çĞ'3IîıœJäЃɁċîÁ`(ÁÎR½†_÷†aá†Rùl" _൐Ŭ]dÀ#šZFv¤É‰İ) vލùr”5bÀ…ĝŭz’x]f Ö†rĴIR¨,—AGJ›Ş&ÓKVÖ"jïĵwĥÁ,…éÒyĦnÓĵ.kž™`ÚLf³†ÛO·÷‹,ÜóĜŬûöÄTŸYçĴÛçÂà„nŸÑijsêÙ¤Ì2•bi}2H$O‡s˘f³yÇÖYét5Ù6~ô‚UAFp„ñ–é"Œ ħ˘:ĊSÒfyQŻá· Ÿ ĵ\Ż V_K_ĥ@1R*ÜJDëÁÍkjÈċ“™rħáPËö52İĵg(•MÌaü~[èrO@´nG($ı-šÓ+;a×eÁ˜¨=·˜šòRAžjk=-Ħ\§žÔÀ;4͟0rôˆ;œ„k1ış@/¸ü‹ïS.µFııùôAy5/ޤ>ëú´Ì=½jÈçóh€Òzş…İ€0qšLííĉöİ;lüXUnĞz‚ì ÊŜ@ˆžÔ€Q,ñM œWz`Ġüž~_S3—ñw¸úŬîtA8òmîĥE'ĥ_JI¨nÖöyy$Ǟҏi:vıŒ”c'<~'‘Ù%1kpĞ)‰ġşt‹‘Lc :Êîßf+L…EKn|17żtjƒ*l.Ôr\˜ıÔÍI’IYd%xt‚˜%x—ƒĝà!ŽîóĦïNÇ$Ù N—÷Ġ8=ZˆFrKZµ›0½Aí“~ ĝblñÔ µd\cҏîá:M1_k4–+ĊF£/C>ê˙roûèèÖĝż³pk5l2ıú fşÁ€/ û}V0žvФşĞdÒĉXß~ĝp{ïĦĝj×ï5%j8…DZƒWV]jş¨AÔ\At½?$Ġ’İžn_Äİ‘ŸËÓĊöF'żû‘ĞiϟŬa“5ióLġȲʝ}Ĵ3‡ĴUÔâÙlm6/QĴ<?%tÏᎠµħħÑDMÊ’ˆ¨-÷`*0k7ïàdĉÏŝħ^³ĠP 4/÷ÂIġôò uûB‰xÈwÁñ›îT%C!ë›=ôR:ñêúD´İ˘dà `ó†'aè~ƒ*) Ê£û…'NĦ%,ÙË.|ĝ(ȕ§ß~Ë&ŞÂùß°‹èĜ•‰İp‡@²7s#  „B,YIsÁıŭ"™¸ÖtBž=|x玵M‘xÏט"E°|2x“z1p˜i×yï‘_ Ö_Ċzwb&l³ôQ{·÷ì9HÎseÔ&úĥh¸TäĥCŞGµÀV–¤:nĴáwiÔI˙ÈR[ 7(I{ –CEOr“Fŭĉµk£Ĵğ9"jé}rçu5Ë?‰6ÏACrgFb0ŸÂ5PÉŜn_–Éñ›ß8ú3•{Ğ Ÿ3ž~P}+ıïJSrO& 9šÚ?n·X\]O&Óz2íJгÀr"í÷l>™Ĥ›ÎËñxħż“Gİ´rëËÂÓĴ½|n”ŜN6ÁË’Ì  ‡BÉ Üä€×Hä+û°MŞ!Ëöy‘ûġíçìŝ6ĊòȧZLNĤ–ƒqġ>_nљI@şûGR,EVLŒŒ\ $Òq8"µz½^Ôlĥè#Ï>~üLzs³%ÜKĠù!™ċÓqŝE˘ĈP#fPËl5QáúÒRµN£ĥ! Dŭ°w3j̒%PK_ܸv­zĈ\ġÄ|HցI&{Àz³Y 4şœJĈâ`0䎪’ÊY`_ŭ̌q8úÓÂÌ_|ôüáúCè£&^Ue=XhàT›ĠÜ&ŭ“Âz2?@żHÓUǢ2Sáĉ‹-ĦĊAOŒLħÜXÛh‹3{}ùíĥŠŽĵáú;Ġ´›MpĦá ;ÄİéÌÄa‰ĉDžË'Üä&î°÷—:â*ëT·‹ĞĤ,éĴùİêR9îvb:iq#âITkPĦk#…D̲q#ÙSŭa{Ÿ‰ğ͝ `DGR²úùÑğïŸĞê²Ê~glޏġĠ@[2éLŜ¨1xİÁĠêŒ[•u~ °ızc™qÈÍ%I|”Uk6Éßàž› ’<ĝâúksì~b'Ż$ğ˘‹ËA ĤÈ&ıĞ—d1‘LqÏ!|9X&Ĝß<çèŸ'ĝ9kp²Ğʄ’äljHïŻ[NŭŠ;?fvwDO 1ıuš İĜ[2kP]ÂĠ–ĥŠEĉ½lĥÒĝ½{0úëÍÌìwGGw`àa³ -İŜ`Ä£%àTaŝ8Í@:™ËdĤ§Ĥ —ÙNƒ ìy&Ĵ ûv¤ßKŭú™ž­&z¤?‘½Q˄ÔĊ˘Û“ŻċµH˙ÈháZʎ1İ‚ĝÊeĝjĊĊ ìħ½7l~ h‘>¨r9ġĞ–Sf‹ı­ Ì> g s™‡ŭÉlÑcÄüŠDĥÈüŠx:_ÔÊ3™qn‚fŜĝ˗̇„UğrÑ,ñpÑÔp@ƒNK†ÀŜıBžÎ0 ;Ċ’ Q³­sŠ-Ûd‡!%\!Úçm“ŭñ|y—ž@êZµ †á÷C-—Ón0XĤ÷Úhó;ŸΓ ĉŭi "^›wòċRóüñöówÒOSzŽòğOħÏQ__¸?:ÎÔÊeÈU£ÎŝşDöÜhrÑÄÍĈFÓOĞo|ŬԍP–,“ Ô6\c!ÂááÂɨ%~ĵ0ïĞùŜ.& w—ž”£÷r(Hƒ< ×Qpk3éñ ĵŽs•ĴљYÙÀi2CŜœ[„q÷ğ¸ C…›šn°W€‘Lû“҈ͨÄĴĠâZl|R–ÄĥÁĈ^ħ}ÒŜn3·;5Ò š6Áßħi¸;==1éôÚ:ÇÖĦX…‰Ĵ=$Áë.*ˆšê/™4_(UËñpe÷µjÜŻçĉréÜH.ÇĊ°JžŜ?ĜzÌÖDë|ìħ÷\ÔXÉĥ4žşèġĈĦK.‹.Ġ+ IĉŻ71[ığ´¤vúnlÜ]şKħ{ \khCŝÛhl(r²nl.Ïċ]+ ñ'÷ˆw–Éî ŬŒĦ(É`w7—*$4Ù¸"Ŭ½IŬc^`x–ëŽc·o?\XÎéÇĤ„öÛğĊE‹ÇiQiŭşjx³ZD‡żFÔü:$`Kèŝ"÷1–Kìüր¤Ċħi r|ôârĠ˘Íl—ÑĤ%àû@-bœîW"]šf§…o÷Ö£/2˘²­($XÒCŞÇN̅ۨ'‹ĝ<ĜŻĦë°caÍ+ġŠgĞà0KÑÖfsP“l˙R­šnÑ0¸%cr›ógoûùÑ÷/$öâ?ßŭ=È ğSE½^-ͨH&m”.)ŒµÜ¨‹b$N+r'wŻĈMĠ áÉע)7do/P#¸0}ıÂèµBÏ숀 öƒznnyış‚ĝùY=+Éîb.u{ìžŜŜ ÷z§çûôJŸ”‘êûTŒ°ï½|³79µ™5ŬÙÚf6…ƒàûˆ§_wë—‹ÙÙ bZ$)tċ<#@3™l–ĵG§¸×è[Ĉü_PżSïïhL‡ìÏÜ]•Ŭ›’ÎSY j"s™´.[UÛܑáİŭZ:—ğš‚Y 8|Fm™[šS…œ?V…[[ğvŭZm‰™ŒŒħjzİÄÔ²˜Òĥ}ôğejŝĝ7öJÈšh4,„ż2 °î*İáŒY2G˜6`EyÚPFĈb Ğùo³Y…¤QŸĠÛĜ\‚¨µyéTs˘†L¤nE­zcô& ĴÎ߸>ÊŜRɀŻ+ ʓ›j’@Íî°;ú§§$î‹^[x¸G1ğ- "Ò)iûÖtŞÌÉ5S$İi‰EĈXDÒÈám)k:4ĥžhĥ2ğÁB½|Gòœŭ˜ċ³§ÌÈöú–1l'h.żĉÖüµ€ŝ²Á¨Úê3Ĉ)ċpT‰"܎ñpġö§Ÿ´Ÿ>ġ/-=1RHĉiO“…ÑĞĦ죽;Yŭ|ıVä>(ĜŝıÑkµê†ìcc30ĥqMó3pšWóĈżûñ˜MĤ}˙âĊ1V苆#p+ĦëwWš2EZÁ‚YâĥôAÒQcX„+ Rù@Ĵ>X^ž•RMLFĤ´İβĦċÉ=|Ѕ룘i7oܸQŬ`Áë׿Xçİ"ıÔօËD€›"şûQĤè“o IDAT;NLÜ}Cúxa⊠ö¨­³ùÖx,ĴıœĉÖÓÜħôğÓ"eè+Íä ŸĉbP$M¸ÊĠrħ,+>ħéĠ=50ÛM'öqó 6zÙD͸I!ġ´Ì$‘Q¨½”FÍpš¨IûôO/ÂÍkĦ¨óÁ|ŝ~~ôúH@ÓšĞ{ĝĉ2ĵ²B!÷ƒˆTçnÌ-/Í]ż~cİQ‚­”´fž3gj?=ĉînĝŝpRÇ>e[žpœÁ¸%’} Tƒž´²j,óéSÒVo4í™*ËşıÙ,œĊçKÙ4œU†cġä}Ùµ%HÙhµħ\ċŻµÑ›>+tÄûĈíÜÊâêptûĤú˘`ü ÔúñúÄÔĜĤߋßż`7wîĈġŞĴŒ³S7˜GpıÓ ;ƒ‰|ÚÈgġpÄO/›-ž+yñ²5§˙è‡ĵ=ĥŝXáĥ-MηA°Á!AG̲é%İ9=ŭħJ˘BÔT#IA{ĠwDÔ@½}Ÿ€?Z"ĊÚp(*²Ž‘ËOxœ!ĥßb•¤>Ì&LìÂ4˙è[£½˜aї4|–°Ï0!úĝŬ;Öâ"ùciÖçġzÈsdlp˜&eÓŒ7ŞĥğÇî´Ĝ3êßÜX&Qò›·]•˘bĦÓm&ü,i M+f#‹ĝƒı8hÁ$ûqÔÊ%ĥ¤~<‚Á¤ÜżŝXıïû.²½³Nsa=‘.à-¤tEˆ?a~ô葠v‡ğ2:½,é2qĥµğ‰ŭ|ŸÏÏVó½W:ox¸Ì,E˘vĉ’Şĵ?-˜(üµJ)Ï0Ż–N[1W,fXHy,ú‘.qŸxL£g@²)Tñ˜ß‹…Ñi¨šuİI/ğ^—âñRş“‰Ĉ›ËÍFSV¸×Ĥħħ<Ïn(µùÚláŸùké´?‰'’½˜CCĠyˆù,÷Í'‚!p’@°·ËaaÁ#ü‘;ÔhòûLÜ^ż šÍĴˆÓ-R<‹EÍ\4Œ4ƒ#F~0‚ŝ > Â#ÒġĤH&RÎÓv”ží)¨öŜŭB‚c Ğ*ñpâ˘ù×5@j˜zr8•+—‹Étħ2ŭt×(‘²½`jġÎûÖ_$fÓlĉtòy=Üpégó!—žÌċüİ‘‚ĴzÍħüÒ;´ÎÏ^ż>ïͨ.טç?ÌGĤ"%ĴʄٕΔ2™0Ĵ^U &³ÑĴtÖ9VEİÔêKâÍĠ—0ù 0ż<_…?1Ħ×}²‹Ëìg €žŜÔlµR_ ÖDÖBŬ½Ÿeí0µ:ûĤîg¸}{,Úyñ [ö}*Ğ[í"iÄÍb19ŭƒ0cÜìÌçàIHZ-ggqËŽŸ†§|^û$N|­ħۏ™£ġ÷^dl“]—Ííg;<Ĉ+Ÿ”ˆ˙ê*|ìgëìgDsÓÙíd ĥép˜;Ï´À0ü´@0àĉ Ëù/ŻfóR.ġ-چÔH]şv¨A‘†’)Q?Ĵ Â0M9b¤s!†°y@&;Jôc£á zKŞĵ™pH+Z7á”RrOĤ²šÂ‹ċFsM´ñàĉ—_ jsA–Oô²ÓċdoWĉ" ‘3!–aù„ĦÔ0¸£Ÿ+6ɐó9ÖsĞÙğ=ÉŸŜ3ĈĤBÎŬ²óœµRMv#ŸÔ˘êl4&è­Aö²d’E|o (éŭZz\ñö„ĝB/š ÑßúS†&Ĝ”¨½K˜ Á•䓉álıÑÈ'ҙH"35µşÊ‚ìZÊŝo¸ĵèĊÂN.ċ„µä0ë|C.O ċ‡SĴ̑NäXì-Çîe³´9Ë–çFÁÉâÂ3£2Îl°@Öt·Ó2™/Ν“ÇfóĞ€Èʊ¸×+we ¨Ĵ ‰v„ÎĞWĜ~i÷o( ۔âl³ħħRÄŻŸlщÛXúâËëׯÍ/ñTfOf#é|6ÔÛËÁííI`dàqK&:·f§˜˙xİKO{ƒ· V–ùcQÁO?ŭ´ó˘ Ó×wûv_'£ğfgŜ KèIQö,e*™]ÔIKéÁĴ¸ÖÉÁ|>)³À,‘&ğ62Ğ{{ £Üħöp:w›ĴT Qnq²8<‰|шh£˜…†Äܞ›$‘ûOİşH&g8Ĉ0żÍ ÷£ÇŬ˜ùaŸ ŸKh~ĉܘCM)VsÒsnĞKÑ:¸ċtĵˆq\¤”ĠÓzĴ˘\‰ f"“+µ™L"Çr= ‚ĥro\…EڄġĞj"dô,ĥú€şqC9ÛtXnĵĦŒàFÓÈħÈ ıċM˘v}~ ²v-W9QֈÔċdĥ†yH1Ë]½>ŠI²œOöH’V/ÌZÖ­7Ĝ}Éa…]“fĠŸüş'ÛmŜħ;c}ĥ_CÜFQ޽8 Ĥİş!Oè½gƒ".2’àb(÷Ïé2‹ċŒbQS[è&`Ô¸eí6YğB‚ÒĞ ïíf“T0‘dµQ̅Bv 3³j€-ŽMClf'-OÔ+ûŻĉuĈ+EŬןŻĉ“‘DıÌĴvĴcɰB5¨Ŭ½1óĉ2ü܃ĴÀöTâFyıÌMY›u=Ÿ0dŻ|ı³–İTıš Ġ+ÓÍ#ĴÖJ]yj„l£.RÜ6TNċbНĵĝqÓĜ"l_=Oԗd€¤vbDË ä¨6F†ıßújĥlşğ¤0dπîżÜÛÛßŭ›KŬ§‹ÛOŭú”tĉlïütl}Ġ'6f@ sÓSŽŜİÎ2ċEv·gµ”bÜ`÷mĈhù¤dv$ÎZ‘éÌĝÔÂö‹˙ö_Díö=µ=i´ÙÚLP*ÏÎëÖB>Ÿ+ÔĜ ·VL÷úŻÍfsFĤ§ıóJƒÌ§î¸J:ìëÏU‹z É(ŻÄökÛFŻq%ÇÀŬŻt}TPX—Èŝ+ĴÎNËĠZÀJtµ2½†ĝÇA+BvW1ŭĉ!ñF +Òh4û/4+żSĜ6$£˙‰ÊùYl[5ŠÚïoÖĉÁ99³ÎÂ!cDp˜`€Ú¨$hI7‹ĠB=—<:Û u³ÈOÄi1Á“VŞ-§NŭÚĉŭ´oìӋí§ÚĵñLœğ- ÈPÙà^tf>2“G¤CİĈ,ƒÇĝ/rF'{ĥhh³–6À+VĦ ˙Ïßŝöbb‚…ĈüĞ„‘WW2„ÍLqżK‚RZ,‚€VYóŝf-Hä†á &PĵÈt†[)´ f}­tii‰ˆo„²–ÊUıo³ÀŽW`օğ͍²,ŝ({˘-5ĉ€7ÒħDxÉ`•w˘1[,áÖ‚ĤÉÂL½ħ¸ÄuρĴRÂU&P%6CTËÊ~m4s²D NDĥĥ6ĉŒ@ Ÿ¨Áö'î ğ.t'~8Á@ĜĠô'™3Ŭ• †p¨;àóġ†‚Ìĥ {t—ít;7ħ´·™Ù?œ_cè'[,Uް‰@ ğŜŸƒäxµ$ÈŻĉ‹²‘Ğ–se¨É¸žfĴ6žž‚=ۛ˜ŒN</yó rµR2Xš$K%ñNÉdN\ĵáT#µĊÀ-Ş48ġ™Ŝ¨4SŻÍñ€Vb.İĊˍ:ÓäFs­€­dÈŭÙöVDFYïıÀêÁsêµë×ĉÊFĤÑX[ŝġKĊü <;[™ċE ħ#}R­).żÉ¨Ôb]Ĝc£ŞÂ+)a %aOˆÊ–ü4—iˆ[jkèĉñĜÍÚ€ŭSÔ<üyŬq{şş<ş/èÇÀ\l^eS¨` D´>àg]@³lÒlbëyîˆh3ù!aċ™rĤ4(²ÔcEĝiÙĵúK?ġ"+ċ†7Œ\Z²Ä!’$•´vğádEn_ù´ŻïŠ„×YP!Ĉ&˜édL„=iËùJ‘İ]•e­JġW­ÌÌ4fJšçIÚ÷Pç,'\FUҀÁóóÉñÒ >rd°Ċ\-ä × Ĵ”Äušı\¤j­{ĥĥ Ŝ_jl5Ê,RĈ½hÜS­ézgx´:3ËÚâ"ì[C‰šê"DƒĈÙC´”‚|²µħıùwóIӉkn8üâË/ÙÇòĉü׸X:µ³Ös={öÜÙ³­g­£­vĠn·:ì.ğ˙í€Ó~ŝœ£+¨ñŞÛċñħ‡Ċj—ĉK&‹écÖÑ5ŬƒÇí.ÍïÇ<àĤ ‹_Ç§;ìNğËĈëñ >Ĵ"—‡éäïúŒ‹7*ÍdĜñfLV;͘ŭ}Ÿá[Çèܝ“I‡@D`p“$],Ċ5ˆÚâ&‰]}sx >yVá²kSĵóL5MĤ†I܀ǖbg’H]¤ıFYšMÖZ nKK,³gġc…[w3 °q}é1v-Ö)n ÜE†Ğ$ÖĠ>Q…OšÂkĥùóħħùËjl@ÊMl'Ûµ³g?úèÜıógĠa={žwàZGn4Î=ç9LJyœkmmĊĠSG‡Ċʎ|ÀÎĴg-¸ÂçáŸÓzŝ<î={ü·ZÙ—eµžwñìçċy<,]mìš;;£Ÿ^v^›ÄÈL­Ĥ>…óˆè³. K6{Ú#Ìùqà]ŬÜĜĉrGĈ3qQ‚ñ)=ĴÓÄ͉鴞fN^şŸ7ġğ&°à`şXĤĊ„yKöûÒĊ™xİTŞ—´0(d™ċÁË´i³ÔÀ5˘V‚¨U¸ĥÈ­ƒ‹³H(TKÜXlúa‚œ’³-eĠ”éÚR”dMí›o¨g/6”d~ Ô6–6ĉç7XàçDĉ/`àh#çáû¨ ŸÑG­ü/ByžRÉżsç  à3Îáh>Û€ĝƒĜyü³âYxġ‚Ŭ~ŝÂyĞ܋?<€Ÿ 7‹ Ö3 bٙ,:šs…v´ĥâYv;`cé}Š[֎'ë÷¸ŬĵĉÑ=Vj‚k ( ‚n·ğ]N;wd;ŬyğYx.(éw¸  ¤ĵ†–âQ‰D:“iâ[½N3ú†q#~%̍ oÇbSŜpV¨%ËR‘­µ-¨µÍĤ)¨TÜ ˆħĜ’Ô˙oԗĉo|ùċòé)|‡ÚÉu1³jÌÏ |­O+!hB÷‘ş ¨bëG|ÔjĠ씖³ HĞ‚³£UÁnċûÚÏSŜÎñI"ž \ñ9N@Ä&jxŠÓióF½^Ż N†’1ùĤP398ö8œnömòû5VyeĊğ-#YB[Óüĵĝ!(nVïÇûıĦ•5nÎĉ}xÌ%‡] |Z$Ù!ÁËšËްĊZX‹ĈĵŜXóÌ3Ÿ÷¨ĊHi&Ž0%FWplÜe I›ab@†fÛe*/„_&….'ÈÉÑߟ›½[İܛĈğdÒÓ˙„t|]8ìçív56çe~PšÇz²U°nr…j1Çn>ÁÒ| ÄçĴ\ħ`šßn=ßeÙ żGî÷+ûG;çgê¤ÁMBD›¨Ċ`ĵüqÌǏĦà˙ü÷”gpâq.p ÄgŒÒÌÌââĉÚâÊ"Żà¨,áĉâb·ñ[š1Jô³Êô2ìĝ¸/4·żá§ùġèLe‡ÔA4Ŭ.)]ïŽèNCs…µîl§{Ĵ)ó:mŞÎqcr2sbÑp —ápL‹Ċbáë’ÄyˆĈX”Í´°‡:Âħċ²ŸsCqGapĝîʽinĉdMғP›™ı.Âħâ2ĜÔ>Ĉh/G—ŒĞżKŻ° ğ]ÏÄ= ]ğ;óÍÓz úñ&:ŸĴ0ʋ™z}mħ>cĝËċì@vĤ´²µRŸÉ~VžY„eĈ@ßğ·²ĥĥÖĜ܇2Yĵ·Ͳ¸ĥĥµ†ë5X °ĥĥ˘Áġà³8fh:Ŝ`mk‹8<| ž˙›‹++òĵbmO[Y,aÇ33¸´ùdmĤħ8€GñQÇñlžTÒFœq žÖD|pÀ`ÚÁĝjŒĝIĠH9ĵŞîĞjŠ˘À'G¨yċ?áŒĈX*7İÛYEĜQÌ)ŠNı–ŜLoÀqjkr̀ĥ›à²1Sŝ|q68òğ̀Ñ/–g ߸QÄÔ^YáS?<ŸYÛÇÁ—s†×9<8Ê3û´­­]höŭ]‹‹ğğkğO4jù'k‹ €ĥż°µġôéÛ·@lë`k˙@^³°żEŞLĊlŞŻm=!„|wTŝâ $e‚Úoâċŭŭ-ÛÖ ŸÏc“@— Dxž˜"kğĝHœ:,ѧhŞżqÊhO+Q·ĊÇÇACJĴ{6~ïéÓ[xÁÍl“C@ƒ°ĊX]w:Êc•ñéL) ‹MMÇbÓı)HQl|?€Ê …OONŞ7ó ÊÌn˜žšŽöy;OF ßmwm Œ_|ŜĜŬĊ%Ĉ˙ŝ}Ŝà­Q Ë0ı3+˜×xtSc˙íŒò–<#µˆ9ż)x­vw÷) ‡ğìEî•ä¨ċ|ĈĉÊÖĞ}ŽüÖ ^Œce˙P‘cĵ§ħıı²ħ1RîMŝ*Ż.ŠĞ$÷l)•‡:ĵ5炜ĉĠïä‰m.Žƒ6ךÇ}œ3ïŜÂĴZĵ*GK8M¸JßΔgĝ•ñqh†••oùĉŜʽqXQxŒKùÁx,SŸŽqíÍÇĠÊÊbĜOKĠŬiĊ p"xûO6Ÿl5cE‚y£)uğ›8ÈċN˜'[ê8PÓçéS¸µRŞol4$*ħµı‚/Mœ79ˆ~]Ŭú˜?ĝ†$ó8äß&Żá,ĦÔï}óô›••-U‰´c||2Ntljp êi|œ¸á"‰G*+°Ä\ŞK)ÍNµq¨`-> ĞÉż)ù7uj›÷e–ŻA>Dܳ×ğDq÷>nw‹:|•Ê>ÇÚ`Ĝ­Ċ†Èіè6\ıÏŻˆ§>QD—úÀ½ĈÓbİ6İ#á­,Òc‘éOÁ¸żv˙X\›Òq°upxp¸żż{xˆëû‡ûĵï@Dxx@ù†ÀCŠw)Tğ[ğ|áցL´·Äé€ààĝ$>m½µV_á PÓ`“:zKĊrñîpšžln€úáßJÓáZ÷xM}ïĊş8kOql=•ÉGä•×µH”{˘Ğ6Ԕ ħ˜˘+Ĵ^ZÙ|BjyïŜ4ŻCpÇK+Ğ÷@˘*{||r|€Mä{ä$•“P£İ_”9z˙B‘Ž5èGc)ĥ‹b"c}p¸E[YS††JŞq÷LÓM™÷ċ%÷ñ÷ġáá“-yùĤÀ´v@ ŬÉÁ_QÚ PìîG&É!àzûö- “c‡PĊŞáíŽĵ|WnYŝÇċ.Ażż…ğˆ8^÷‘×}ÍËûßSL ̉| /q˘A\“8á YÜoJ,cj>à?@ҟòÖĠÓ1Ê[*ĵĊ€V3B½°&1È͍'°ŞV֓• ĥġġ]F °Aßğ~ŻN!Üğ·!.„²rï$Ôvw8Íïû°kbË0ŭï+#ż+b’€-ÚŞÏŬŬû‹3ĉcüÁsċúÁŝ}ÚĊ5Áċ5ÇA9XS"…çà6FìPĦ‚×Ŝ'ZÄLŠÌ!A#lêhpxxĜĵ—‚GóŜ×rn *;ğûr}_=úĜŠÔîÊëö›o˙úġkžÂÎÎ.ñÇ))†bĦFŬ|²DPqÁ¨C´.;Ĝàh:)ô€OÚ˘žÖ|:^˙dŭVF<¸ğLF¸w÷îÓ?Ü[ŭ'ÉçˆÊïbŝ \ÁSV+'Ħ†Żħ/#/Ç}ġßqŠq„w?4c˘—w‰ŽŒ 0†„c…뇇”TNûŬCıo‡ l‰ ]J\š#-fOFxk˙ĝÌŜĈa˜pÏĦü ˘?ȋg‹4*xyÖżÄ|gŸÏÙŬœŻnğŠ1zžÈk&› ½>ĝ0äsĝwp ÄWNjK4ÎÎĦÌ´µ­-ĊËäµoß:<àçáÖŝĞWb[Wî%I+Oii÷!eO_ÁP?Á$ùŝÓ§mëîÓ­?üAûôïżGMœpïßËâ[uM]ò…û (<•“‘ïüZüŝĦš |ÑĞWòŽŻß~½{_óî5__ż–×ĵ&jŻċ ß6e\^ŭJî ֕'~°ġ‡z˜''_óĠœèÊáË2ûûv˙àN†Żäíe6ìżzÊħòé˙òĝ¨íÈWŬ?†àµ¨@j·×AÒ-J Ż+Eöêŭ{h#ÎM~·_ˆÎ!UÊ+š#.%„"Ïğ;b‹”ŝĴ4ıóàPŜE ŜË{6eƒ˘r(? Ĥ¤½’Gž2D´‘ûCžùëĤ8ĞÉĦŽÁc}Hi{}(_J͌]Œ¨½=>äô”pËÇÇGzµ#DŜCÉ#…‰”ç€FĵŬ|Á{5ÏŜ 'Ĥ,@Żîż=P3âç9'O<ŝ4JġÖ§˙ŭ˙~>ŝï?˘ĥ³£äI†lWÄígÑÚRşKNŽ'Pi›€6ñw$@xCü‰ü(àז²]JŞšX½mžô!µ¨ˆĠ+yÇÏ%ġö ÔàñĦŭĤ”ïyH!8ñ.üŠnáïÛożĊ˙Gr|…;äïĞG|ÊSH<éНµŻäÀ½[âO~µóö58ûÖĉ▸íĝì]ċZއ­ĊŻvž6'ĉŽÈáÓ{,üá4mŠ›2 <ë[8Ú9ŭ˙ ³&r?}џE vâ—Úĝĝ%k ´Dħĉß1(öğñG·fĈo˙r ·qŒOŽ·nŬ˙Şy<:S™ş_áĞïüòĜúj—kjD·dÀwžâokç+\½ukü–:ĈïŭîÖä­ßáŠúüÉñ+\Ԑ ܁˙²ÊÑĵS“ġŽX<ĤycQÍëġò.o3°ŸŸĜ{óÍĝx<&/Ç¸ß·ğŭ>E}úĝĝäñwIܒ×ɘxxgçOùéS\Ö¸£#aX}‹éövgSèÖï&Ż Wö_˙ù~†ìŭû_hÖ_(Ĝ·TĉÏ>Bí˙)ŝ5”v[,f‹ÛĉµqáÇfûĠbqY¸„ääŻÓëôb¸”Û§˜úŜúääïdH䘎MNĈÔÒ/Ÿ8Éq ĈÇKßÂ+K‰îÍ3[¤[½ĊÄ$·,UËz6;òVĉĜ=lÎd#‹• ,l5É\x‰½GQ|Éó×´ĉûr1Ói“OġŞÛŜÀÇuYêt‡^upe\& §Â$@ñ µG˜Q“żğġèĞĝÌêßñŻĉ”‘ĠÒñ÷M’Œ*‚Ö_ñs İ#!ùéĠßË ²×˜¸żÉ#›läW˙imµ´Z¸vÍa°XÏZ[-ÜwÖbéàŬgM­­­ĝ;×Ê>Ôj:+ UiiĥH‡wvŻcî€Í)ğÜŞ[\°™‹Ĥâ?—$ĜfÍÔŞR²q¸Ä'™ĝél-iq1u„˙ŬRTŜêd6˜<—O–6ÉS)&Vf™,Ö•+äryÇ&5·&‰ ĵPoÈÎżÒnİe·Ċ-½hŬj)Ĝ]ÇsÇÎ~§ħc°T‹×·^ŭôj<öJƒá(áï­ĴLÇ4Y=Lg£Cvh³Ĝ\™ĵġH$ġÖ­G· ÊżûˆADż}´ŭŬĞżúî)µû£§OñÊ+>ŠĠ1|o_=…ŽßùîğWŻ”\ŸÄ![ċ°Z[­·ëÙÖÖĥV•Ä!I;?1ˆùY¸³ÜÙ³çù`ë9I%Qù;2~*1‡O5mĉ{µvtàĵıŬMYâd°ÊIĥSú, 6§[&`b>‚‡`ž%È&™I.jÀnU ZäWRNÔ Œ×‰İÈŬvġ0Ĥ–Fĥm3YìMTš{.§šxNĦÖĵ”g—•IAœd÷^ŭġŻOÇŬğŬއ§Ÿ}÷òcğqĤ‡xmf›’ıİ Ì6[ç§WDŻtBĊ\ı‹ħ"K9<ş5=9ħŭŬw·(żÓ“Ó÷&îAPÖ_ùë_ßPqüôĉğG““²wo{°~{j€Kr:ĝˉkoĉÔX-ö ’ĝf·ü"w¤µµy…/èbĥŽç$cH]?Ç<ëy•-tö£ŸóˆĴçñĠ­’ĦuŝC>UÁ]aÈ>×Ċ\*6Ùg~·:-•eÁËĦ8%ċ„ù>€˘#èá}EnقJóÄŭ%lvĞÓÎ=wÍD­Ş‹è 0ÑĴ.§L)钳g—ԏK[ŭó_ß|vğì'3ĜİFʞn.֚SPc‹ZU˙Áb6wÒŞâNNDĦZc^wçĜí1ħĴÍpċJßo4:ñp{û/^°Ï ö™ğÂqXHöD˜è; µ.˙g8ü*ŭ´ĞĞ+ĜĠ58èÇĊo;Ä Üi·Ğa@"TuH…ÓeçŸï:/÷7ӈĝy>p Óù”=>ûÊû‘÷í²ş|ì’râgUdc ˙–?ôż`ĤĉñŒÁdĥÜX\ü<›ġK*ŸìÀëf~`à³ĈâÌâÌÀ@<> ıĠ@ݲÙjêODÙÉtS“|żĦÇc™¸Î<I·ëòèÓ/˙rtK³ñ°qQzġŜ7Żyút…›)@›Eԝ6È,·eJ^§SYġpœy"@×K]jŸ×ííĵˆÀm‚û£Çn/ÜĈċe](F”i Ÿŝ÷˙ŭĊñ÷¨Ŭçj —×$˲q˙É8¤OîKôEV‰ŝ½ñys"û[ƒƒĝí% ]žào‹Ñ÷ëLşÀVÈ]r nàîïR“@Ž ³lùóÏÙu6ûÙç˙ŝ`óI·>ûüóFßy4ŝŭ>×"×ĥ䓕ĤBz[ğ÷ı^ĊċíŸÂ=à’ÂÚŭ͵ûxkOvïï2ä€Ñö.6Öĥ6ˆñYÙÈ߁˙oñ?›5 |ÁÏ­VĞÙjùóϲŸ•˙߯Úx‚3*tʟ•‹Ÿs_>[˙˙í=vÛ0 Ç˙›à-S·:ċyïkçúzĴM/Ñħ×Èì­[×\³'lŠ(Ù A€ġáT˘€!ÊSĝàG ĜO˙<üp/BĠM|sïżıOj{xŞċŸĉ>ˆ÷Ñ=3ŭġŬ½}]§LnawƒĝŝCó…?ŬżġĠsv=ZŜŬ5ëe›)ıoµüÚĤÇÍÛ\Ÿk˜î-ĦMŜt˙éKêÌ?ĝÛħl9$eYʑ"5ŝ<àTĥpk9,JıjlÍ+žEċ|X’rg£V,µŬĉ¨ùPÛ  v=£ÜµcĠAĞDírî˜E­;£Ü µ ´Şƒĥ˜XcÇĊ)jğÍQ“DmgħĤRkĦU>´ġĊÚÖÖµ 4òĦ­p]ÛbıÌgû5Ûeµ%QcÏЧvŽËaQÊİٙ˙ ÏüMÖ$Fͨ™ĵ1µßIUŞQŒZiħ*Ġ(£fԌšQ3jF­ljèî´ ğòÔÓŻì_d1*mçÚW˜ŜBVF-4*PŸ+ZÌzĠ€êƒ´ğXËĝ*İÔUò.Òq×ĉ5£Ü/Òَ$î•IMŞÈşUvˆġ.UD⢛IwA ħ5Ê v–˘ jŻ1µ$5ÖÊXj8q£Ô‚ç,N—„kĦ(ô’EĦô'ıjÔàEE‡q_İċ `>µ`‚ ħ¤>ŭQ.5>™FĝĝíÀs^jA T"yO×$M-2xħÖéËËqġR‘ÊĤ§‰Ô ‡ŻFYÓO LÙËĝëw—l9r~ÌH rÈ€FP›3Ö@CİQ&5uaÊäJÀÊùIx'F-gyU×£$5@Ï*˘ËîĵÔ@·˘†Dn’žš¨šìċİQNĴI'üj Ô¸+í–$5Bt†Lm@ğ‰e#ZìÇö}Ê~m*5e5*Ñ;Ï!5ûŬċ-„HS“{e¤2˙¨d¸9Ċ1¸“é™˙\F ¨9Ĥe ?Ád-²¨ ‡vCjCÊŻ:ŞċÔhòƒmLôġ¤N´nÔû-Z†ۙżQ3jFmjUiRŞQ-µ™ĴKN@µ77ĴLöġvÏĉ‡UÉ3jj†muµ {[ÛV³Ĥ훳É&5ÉZ¤a÷Ël‚¨ÙşIENDB`‚gamera-3.3.3/doc/src/images/display_ccs.png0000644000076500000000000003705010714675724017570 0ustar chriswheel‰PNG  IHDRbĞT‡ 5PLTE $+ $$"/(:./,%2W#5a453.4VIpÉ3:A,~*Br1Am/3DB;*B/FwFGD$` 7GsMJ(/I€4Js4J{TI:3P‡HLe:O‚;P|>Pw7PŽWNCYN>‡=OˆRTQJmqtcrUt³xpj^s˘Zs­.œP[uİWuµturMyԐ~ [yşbzµa|ħz{xݰsw³f~ş`ğ~j½pƒ§e…Àj…ş2½)qƒş‹xħƒ…‚mˆ½}‚µoŠż>·nKĴs…³uĊğ‰(‹zÀ‡Ž£1ĵ·~“’”G²ĵl£‚–LJ—Ğ”y—™–„œĊ ˙‹šĈbĞàšœ™ħ˜t}¨Żĥ™mâߨž ħ ˘ŸLĈÏ`½ÉħĦ‡lĊ…e½¨İĤ½ĥ,ş²J˘´­ŻĴ·Ż£²İı´tÎÛ³ĥ´¤¸Ŝ€Í֞ÇğœÉ#ŭĝ½żĵĈïĥ…ÖßĵÂēĠŜÚ·ĜıĊĊ¢ÓÓċĵŸĠŜĊÛèÀŽħÒĠÙÑuœÜċËàɰà·ÍÏËŻÜÖÌÓÍÑá·ÚóÑÒÜşŜàĴäêÍĜÙÀċÀÎÖëèÔĥÛÙÔè׿ÓÛñçÙĈÊâèıêïŬßÜíŬÄïáÎÈñóÖÖÍïôċçäŬííäéùèáóèÛĜñöéìèééí÷áġàìì÷Ŝôôïïú÷áêòúñóùñéê÷ĝöġëùóòîûüúùïûĝŭŝĝ÷ùû÷ù˙˙ŝ˙üˆ:E IDATxÚí œ]ĊuĜ_¤¤2ĥ0ĉy“,ĵ0uÁĤE=c##CÚì“à'PART¨×_‹ĞĦÍîSµ]³ÑÓúI)îRÀvmĠ½(vĞ–¤µë¤Xv; ÈöĈ\ËĈ‰´Ó;÷cfÎ̙ıïŜ·o÷:;ïë~Ìüï™3gî=SšáR"!)@r)qÀ^ûİŻšÒ÷G$$Ô÷ĠìòİזÄJŸB?ïÛÂexxxI/Š×ò€vó +qÄ|Â>$@ìíCCC—ïñvó†ûcĠEġÔċ÷"jMMyêÊ]žşž—÷K“ˆšˆÔ͈J·ŒB5•ŜÏKï߯ü*ġ•U†£ï%ÙŜrTBÉ×Ġ8i½6v ċ×ßTT“özFĊo-½ïÊé}oèʉĦ1„dïyŒ•f^Ë?ù; ŝ÷ûĈ=ÂVLyê ÷{êuB½á£ĵtݧ.’jK]>İğ¸šêJ_MĊ÷ûv¨Q^BÔ-#\ŬÍĠ6›öÔ­Qé–-žÚ Ġ Ż†"‰ü`P|YŝÖßŜ-ˆÂŽċîè˜Ż³ÑÛÇÌ:ëEİ&^k— ċ×äċğ@e_'RhˈĈóÛÒoUÙÒoàï­vä#†ñ‘½×,q#ö‘żûĦ"ǎŭ˙ĴopppĊÄà›_wïĤÍ_wïĉM›ĵÒĤÍAi/íñJçòÒı˘t/]8ċ•.ÜĊKğxi’—&½ÒŠ Ż´bB”Ĉyiœ—vD+F½Ò£ĵ4ÂK#Qéşm^éşmÎÒ0/mñJ×ҍĵtQâĦ¨t+/Ŭ*Kwxƒ^i£_Úä•Báï ò÷îˆ>½uŝnYß//]³Eßpüylg”x ]ħԕR˘Nŭz–5´‚ßĵe.š­ċ·`–ĵUÏġZÚ/ùmîmÏC ïĞ8Ißû”çġë›8!ĥyó•ëÖ­;wÏúġë}ġ:Ħä{çNA5éİ  şpB¨qĦĈ€şÌW#\ŬÍĠ6PşBŞáH½I”ñĠ¨†€şÊ/ FêF_mŽJyiíÖqµ—-CâS˙Ër²$÷qĠyúAÂóP”8_"|5*Ş ÖŸRħ°ĈaSĝÍ£7l¨}×­ğhbŬĉ WöYĝHúŜWMĎ Ä6\1ĉUê…ğÖŻ]{öžµĦ:WŞİH3éİ 45İ }5ĠO½~¨Ë|µ Q‘z“ŻĥµR–†Rk¸Z+U ##ÁßÙف˙{Ç 7°)Ú²Kä¨V—çħRœepÒXmˆşRêo”×é¨Yϲ.@ÚHĥ lUÑÒ“ëÖŻğrĴχ˙Ŝ{ïŭ=ŝżcbïñ·‰X@Ĝ¤şßPÉCÛvŽ° äIEêġc˘rî*\ŠÔÊ!€×;|µA`ħ60;ËññôšŻÉû9Z׿kfÙé\ᗽ—Êo×G[ö÷ìï÷Ț<ÈàÀ·ĜÔ08}­^”Z*¨bIĜ¸…° ÉD úmé·Şläs¸Á[1ĥNCìX,bŜë*ï)ˆñO~~ 6ê[[çkÖxj͚³÷pĊKgíòÔ9“PMDê_CµSrġúĦĥ™ê݆=uW—nj݆5Ô[ïàj3WıZïİw@5 ĠZš%ï÷oÍììk֜~ş÷÷Má§ü{ŝ/ĝKd{ öĈĠUü‚G…¸8·7ÉSŽÔe˘J° SŞSTħ^÷˘Q‚6‚íĉ·ÚŜısôüN"vìX+½eZ1>Ÿbïş>gê]ïè›x×ğÎĉ³wy³&½ÒY“^é^:g‚—&xiœ—Ĉ½ÒĵtÁ^Úá•ÎçóGxi„—ĥy×oóJŻKxé’a^öJoäK·xK·ˆÒ/ ÒÊAŻ´rP”îàÍ^é­½Ò[×óÒzXZËKk½Ò;xéaÉ£fÍ7Ož=ûƒÍ>0Ô,cò:ÈàŻ÷ŝ<{òç |ŝG'g9‰Ñoƒí­GöĉÁFqTڑZÎH9_^z°¨ż†`­ù NeíŽñş­0ZFĥ–ß‚²-½ö8;hé5k}7 vLGÌOC,˘ñĊ"ú~úÓħË|Â&½ĥoêÚP=éݳ|5!Ôx¤Î‘jÌSçr5"ÔŬ\mê݆=ġF_mjÈS—J5ĠžZÉKoŬÌĠ&ÖÛÔZD­ñÔµŜIzÔ\èYöŬϳŜÁYöÛŻfìôèïż8ġƒ›˙×ì[?;ûßŜùO™˙et{֝oŠr8pŭdÄYú'­WÄpTM²Ö´ê ŞxDÔŭĈ`ˈÖRZP´êÙAKp:=CvYßWu‹"ĈI‚ïé݈‹>‰óĈ.ĵïɖЁ@5)Ԅ§ÎñĠ8Pĝj‡§Îçê‚1^á%<6À/?S Gê.Êğœ#5d*Ϙj3PžU1ĠZO½*n§B+Ĉ~5Ì˙{úÊYù÷³³üögg?ô³Ùßx˙ĥò[{ú>6ÂcAŽ;#ċ|aE•ƒÔš_JíŽEu(ÑJ‰v“myĥhé)˙SNĜ¨ĜOUĎˆ÷ĵï(ßS;Z<Ĝŝp8Ö 5TšĤôûÒ  úa— Ŝ×eÂÓÔÒ#Š÷¸´’ğ`Wm ó›˙ŠħWslÖGêzŜm*˙ĝ{˙ë0ggàğ~ÀïU×Z6ŞíW9*§GĉŸ›ôôŠĜÜ2ŝF@ĊúġÔxB ĥŞßÒ|Ŭ}1ä=Ÿ˘÷C ğٟJÄĈ6oŜ¸bbŭúuŻÓ‚&2¤² \&£H̅ÖxĜ¸ˆ‚‰@TېPĜ6$pÄĠu["e‡) F­‚HW7ñÒ&?(ö·ìï߸ŝßÌpú:ŝo½òo]`ĊN÷ägŜ÷~Ï{é˙vfKd,Pñáħà<œá1%Fĥ ݵ„á1İdkù-¨ĈÈÖE-=µnŭĈ›7÷YĝHúžD,úÄŬż~bppóE{6mÚ("Â.Ú³!ˆo¸hJ”vñÒ.Żt!/ñ¸ò†“^i…_šĜğ7ĴßĤƒÒ•c^éÊQ^ᑠAtĵÄcÜÛf+ ó҆ ’żá^şn /máïñҍĵt£, ñÒPTşu+Ŭ:•6núŸìÏïğßsó_³ÁÇ˙÷·ìĥMÊßßûÛÙûî½˙o²?˙ü‹ŜK˙·|{·Â-%xò¨ÛYœ‡ŭ|ŭzá5t…¨Ğ ´ƒ×ÚP§AiBÔŭdÔAËìíĥ ĥ ßŞ{6mĜàµôzŻ´yó Ŭ7ĝHúž@ |òóħĦĦ냉poG!êrİĤ\êJ_MB5İëÇ=ġvİĈ ġÔuĵt/Ŭr·§nĉê–mÑË[äËmÈžşU(ċċ§6oÊ{9ôİ'OÎŝżû^ŭ9?üßçOÌ~Hŭûożù2ûù7}“}÷nŻ·Œ~ëoJßü0< ÷A—׉“–§ÔĴ+żêdMêU<Û2²•Ĥ½W´ïÔû‡ï³‘ô=ŽĜ˙ñä#ä#ü½á›'‡‡‡ßÉgëßÌgĉß,&êßlğ™âšš‚Šß v_!wTÜ<Ŭfp³v[Ċóċ-;ÄÍP½_Sw ċĵ+b(¸…bċY^?ĝfŻ|úéÁż·úôŝ]wŝн/l9˙ô×ÜÄ_Ú7z7¸ßBSÊ1‹“ÁÎR)Ézu%ĞÎŻNżvU;lë=~Ğ*-½Çkŭ›'ûl|$}ÏCì˙r7aĝoġŬ6ımÛĥÛöxêŸŬ'Ôŭ%W7}”Ğ{#ġN_í‰Ôm˜š²İ]\ñŭżü W7OFêƒ65ލ1 ~Q£PŬÍo“şÛy•ĝŠö[lóŝ~ß/C; —RNš×Áû&µ6eĞgÑ ï-#ê&ٌ…íëĞ{ƒ-÷ÙĝHúž‡Ĝ_Y¤ojtdôĥ=##£7Ŭ?êĞÑћîê~Ħäˏzê6İî5ĠûöÄĞ]\MÒw ċżœôÔï&Pˆj ŞQİ„ŒpµC| ŭBÛşË‰Ĝ#ġÏ(87qZġ‡TğlżôvSšvŒż Úüĥİ‘ÑżjS<ÄŝÚ"}c\ĈC™Ÿ é ñÚ:@ß_·)bżo‘_!!ù•ßoS<ÄfHH ”1&dZ{mHüŠĝĴc5ÒÖvŭÙÍ%bâiíµ!ñ_(â³Î!ÖÎvŭÙÍ5b%BLžĜîŬ;wnß~×íĞ—Ÿ–?b˗^ܓˆe£Î<óUž,²Tĉb.–ÊÌYéĝO~V€ĴÒœĜ#3/r™yòê~ċw>8½wïî­Ğ—ĥ…ĜÒ#G.>âžCÌBܨĞ3Ż~èûßyèÎßy˙ŻB*sñâü÷BXĤÛĝìÀ‹×?|@AìÙĵez•ĉAÄöŸ Ŝ=ġâÖGúċî~ñ—™­ËÛ@ìĵ#/Ÿ:uüÈĊ‘-ëi_ìÌ|˙;úÌż÷ĞżĥèÌW_Xĵŭ/˙ĉ…~ƒŸl_lTfĥÏJ1ĠŠ=Ër1P‡qÄÛ~ü`żDìxŜË­ˆ-Y²¤_ˆ÷Â@lùqŽéñ'ŽĤĴg;Ž vġżŝáßYä÷’‹^ñkÚoö—÷ƒgò `eşÏ€£;ˆí|ñx`ÇüŽ2@Œí;SŞmÉΝŭŒqâèӏ÷bcħ·üĝëWKG"ĥĝÁżyé—/ŭÀCċ‹_zĉÁĊ•ĴŸu£;ĵzëêe% 1Íí× LĜ‰çöß~ğ†ĜyÏ?ŝ²×Kž8zäİ‹{ÍÛk"öŻ°|é{žCġí?{ôÓûkF?SĴsÎbƒáJ{?÷^ ħŭšÛŻ"ĥ}ğjĊ bgœÑżêÈóż8ñ #G/w^ğû‹^ġëżŝïxŭäŻ.Z„#vĝï=óŒGÊ=Ta”ñ³00ĉœ Ä~k˙•ÇJ‡wCÄNíÓÜ~1߆ġ"ĥìàŝe9ÈÓO]üŻŝ´§ÓÜŭEWŭÇßèÎ;úˆŭñ ßIùOxϟé–*g‘ Ĉœ_cΠ:ş¨ ;uêħÇö?ŭÉħí>Z'ħOsûUÄĥní?!­ĜêĠħċ÷ŬŜ˙‰˙ŭĝÑ#O?ŭÔSO<^úÏçġ´ğżè-ĝî|èêÀXiß²%:b•GR>mú[Ù>;ĉ9ż%ĈœE!ĥt)§Ë×Ĥóżvòԉ?+Äĝ[û4·_G,´aG¨ˆqp߃ûV—–{y€=ñDhÄzĜŬ_ô–;?vöËëA‹ï>ó/~úÓxÏ=š£ĈlŸ…V,s~\Œ9‹³b VÌ·a|àwôsGÄNúĊ‰£†ˆzöàô:bwŬ%bĞ%b%v|˙ƒÓÓÓ!e{FĴÔëîÇXHĜáÛÏXĥ;°cj\ì'_ùÒ÷ÜóéGò ûÊôY`Ċ˘1ç7Ƴ8_,"LGl·b'OñßÑ#§?#;uêÄώ™;ùòó‡~KCì.Onç²:ħŝ™™GÙŜ½{ÊúKZêħ …z]ô–ȆqÚiËwûv D÷âùT~Û#e˙5"ĝY> ˘ûÁ˜ó+òq1ĉ,Ŭ 3+qŸëœ°#Ÿ|.Bl닧x´áÈ'Cw˙ĉçŸĜ@LlĠŞħċÏ>;óì §l÷îŬÓû–—úWŬµÔëÑ}0ıtßêeËĵ–XvûÒĊĈċ×ġ5oÜ÷›˙q˙bs2ŭgÁe0ĉ|ôK‰1g‘#Ê38b½1 ìıÒSħïL‡nż÷Ê@Œó%:ÊUħe‡?ÉċYNÙΝ;·oŬığż§C˘ûâKğú—Ÿ†Í“‡ÑĞŭ›˙R°2ŬĈgÁ‹˙ĝ‘Ż}üì1ĉì|³b'=GßçéıÏt°÷î~‰Xi÷#‡:|È#ͧlûÖŬŭËz 1$ş/ż·³?şo ˙ÂbÉÊt۟™cÎ9@ìäĦ {î‰Ò ğëÉ£GžöFƒğC·ßûAlu˙³ŭŭ‡<Ävîì_µ\Œ(K­{÷8pàAŽ;~¨YoY1ŬWBí}ŭ˗¸SX Q)9>›‰ùÌsÎbÇK=ĉäö_ü™Ç?öÊàë½ï~÷ğo¸á†÷†n˙‘çžxâjˆyX˙“ŭĞ<ż}{˙òċJèµżTş}çG<Î:RzduÉüÊÊ´öc󳙙˜ÏŒ1ç öòç|Ä<„üċ’@,’Èí÷>~üëˆ-ñ;xà‘ŝ­[!beĞ·ïŬ·˙Ÿü‡ŭĞ—Ñ[#JÓŬ?-•ÙÙżlñŒ1ÁŠiĊŒÏfâ>Óǜs€Ĝ‰Òçĵ˙>YúŒ÷ßż7 Ŭ~°Ço@Ĵ˜çˆxd˙]wˆ”­Úşwz÷êŝ‹‹!î~é´ĊK<â‘í˗/-鈅·ÉVlˆİŸĊünsvħŸ˙Yà‡y yò ħíçŸmĈ¸%q‰¸ğ%1¤lġí cèQwż´dÙêíûWġ/_\š‰³bœ‹b³™Ÿ1g1ˆÛù9.Ÿñäcž|B·b‘Û˙8‚*ĉ™÷—àUۓÑŭ —,9m‰Â‹1µ2ñ‡€3<ÄûÑ9x<ä´K_É˙‹D;ÀÈíżá†·½í•3ô[ĉè½>:ĝ›Ç=GIˆ‰Xg+1˙_û…"¤c5ÒÖvŭÙÍ#!i_0ç–#É1äÙgBŒ$WÄÌ@#!FBˆ‘b$$ħ„IĦˆÁ‡!1’ĵÓé"ÄHrFL<6Hˆ‘eĊfÀġ„ (I1BĴG¤:÷ˆ™·b ‰°ê\3FwZ +XĤİ2Mˆb„É<BŒ„#!ÄHH1BŒ„#!!ÄH1BŒ#!ÄH1BŒ„#!ÄHH1BŒ„£Ú!!ÄHşYjžbEK…U<ÑŜ3ßZ°„yŒbĊ‰ŝş(ĈÈ×ċrömUó Œëcö7òLBV.·XµÍG0}ħÎQ^´§€­ĵkó)ßÀ#wncĊ!&l™`Ĵíµ×S†„bê*ç ħıôö ħŽ!:Ç“Y÷ĠJ‘ü”Œ‚BŒu1I–‰IbÄı!FA‹Î!}ü ˆ%ŭIÊG+)bFžVŒë˜S͘ —f3üÓT_²4‘Ú†'bċäF,cŠÑbŒ/FÑŭ@ĴÉ´šÍħĤ@Ĵ’ħNXÄX„š@,#–ß×QĠ0V–1ñ BĴcˆEaµ<ŠT¤ÂWRi ;qĠj°je!úŻĊNk‚—j5dŒ벐(„µjb˘–ĜS(1Á2+—bŠ'&vÂTS K‚XëĴ“Œ)ˆ1+bLG,]cÀYcb EŒb]‰XEô“M 1ù7|?• kèvL' taÌì'##&|ħ¤Ŝü!6gˆi¤IÄÄçézɆwÈ1Ġ&b]êÇĤ‰\şÁ¤n•ˆ11H˜À̈XDˆYĞAOÓĊ!Ö)Â@€KM ¨éħĤŒcĜ}XB˜úF@êŠFLŠĠb)â[„Ĝ"Ölš.™Àİ݉Ĥ›1uöÈ/µlFĴÓbĴ &Œ˜d'1ñ=BĴàˆ…ÎÓ£`ZŞĊÒğVcÂËoHÄ"£ġ™-E˘›É´EÈi´ZM‰pUġHlLGÎ b†ŜÇ£Gż4ĚY‹îHT#--,&_cQ1ħĞÁá¤êì'bŒ+1•1•é^áF ö”1ˆ)˜5˜,B_ŒİŜ~ƒéû•o­˙‰e5‹u _˘•15]µLà¸Rċñ…èk;ĠžDGïMŻĉŒX%9b•Ĵˆ•uÄ*Ö¸ˆoD•ĠR”öAŜ·ŻĤı„‰T£Hjz_Lŝ,Ĝ{Ô˘z*mHÌ1Ĵ§€5p8ĝâµHÊmfcL6T”#Cî´Î@N¨2³<ŒZgˆÁTŬħh[ac,Àşˆ5™–ĥ.j\˜Ş×ß`r+VEĞ%G xí&bJfëˆ)ùvÒ!Ĉ4Ä´:ĝb•QbIf™Ó;ÊpSUbZ€#j‘½Ĥ,ÑŞ‹&Qëˆ gï(µUóûéˆÁ‘Ħ‘kȒ”;1#Ók-aOÉÀċÙ0-¨ħœ}ħJ*Ä*c&b٘ĠĈ‰”EeĊkË&@Ä2ùbUb•$ˆħöĞKÄKkĈ bê(ÖDĴŒ VÄr1cÌaĊlĜkڃ”JZhV›µeĊ°ĥ³‹lMÔĵ-7bu܊ÁµrûûLí(‘:§×IDAT/†>‰êŸzˆ%'ÄlüMıÀ­LŠê@,ċˆ’áĴ–1–1̊1t9f9rw‚747ı cí÷”ÌŜQ&ŒĦAĚ8aĈĵšı£d)­˜ş4a!ˆ1müQcqŒÉ°…141È@ ˜„jŒ­H|n·b`ÎĄÄ4Ĉ'—Á‹‹î#/m%D Ğ@³_† ħ ‹ï)ÛF,ځ;ù‰ˈXġĊ¸ûĜK›/Ĥ"†úÑM (b9AŒu ħ‚XĠv5:3{˜şéî+Ü+óVĈtwóŒZ4F’ĉÒîîĞ‘}}}ĊĞı†KJôĠêîkݰ‹Q&ÂĤ=Ĉ`XĴv+*ïא™cLÄĈœA ûĈÊMĠf“i7kèiı[X` _Ti·şÜĞš:Û2¤QÂŻF„8Ş8sP\èµÒ!ÄÌds‰-iMlA ÌĊècÊ:ˆĵF ÁíÚĞš‚N2Àz°Ĝ!bÌĥŞ ;yĵXV‰<ĤŞĠŒ€°˙1K­ı@Ĵ=Ĉä™@Â* ‘şbz½ùħ}Ùh1ıYĞóżáƒG¨_XSfâíçŸìĈ‹+&Ĉ£ugPÑĵ'€ğ-¤é’äˆXˆ1'böèĞZŸ-GEİks¨%1Ö´{GS+CċĊ\2ßyÔ1dz8Ÿ¨Ì ħî“Bnn›sÄ*DĜÂ&Ĵ}Ä*cħ4Û7²|àücĴA„uħ„ĵŭhxg!c S ş˙;wÄplb$sŠX%9bŽÛ×I1}äg˜Œ/QÍbí/?OBBˆ‘t@VA!ÄHrG "ÄHòGlFÊaBŒ„#!ÄHH1BŒ„#!!ÄHħù,b’OġÀ>ÎhË–ƒ$¸mN>'Ä2ĉ~D: ĴVcñˆ!Y݌îCÌq~™/œ‚vÉ 1‘ħĈFX]!ŒY3Îċ€WĚó1pŠA­F—Ğċış„„U燳·•‚˜x² –äk 1µRĈ26_ĴXâoĉ„BLgŒÍ+ČëV1có•1gÓu bĴVlıû°:p>X[ˆħıFĴ1ï3’Öċ.Ġ Ĥ\í ħëEˆ%2]!Ví bĝ*ˉɴĊ"Vħx½êñ'G,à§Ñ˘Ĝ•š1`—M5’`'޵šbA[י&ĥĈ"¨üâbĉB(éĴX­Ä´“ÑcOLµÂj™lħ€ ĜF‰ˆ.~%3È`…8)ĝLS8ŒÂwQ­Îp…ê G9yd{ˆĤr&ħUċQÎŭV™2—VŽĦW̊•_0¤H ŻnO̤&„Âĥ)2.iÏ?VuC˜žx"Ĥy:ÑWŞ*aŞ)!³íż óxıbb R˘BTGòbŞ:ƒO‹EûÂSkSK?%›ÎŠaĤĥ½í7zËH%2nÁĊcà^ Ĉj0'3DĴi"V,p&&„‰R“;‡ŭ¤Ž3â·˘µeżf£ż.+.;-}ÒXÁR(bĦ½f€1ĊûÖ' éˆM³bƒĈŝ‰˜rċ”lpu"™C vÁšû&`ˆñĤS~2Ĉ?JÊ<ĈT3Ĥn¤œ`ĊœŜ•4c‰ba kډ:–E‘÷Ğ_sĊôž^]<:BÌ',oÄÊÊU§6 ĈL•İĤ²4=ˆXYúe‹s'·‹!ĈpÄb|_1ü7cÄ4‡Ùê‡iĊ„1 f˜³èLĞъ+ön"×"` Ј„ÓQ*gĞ<9Žö”LGŒİˆ™„5€,Ûĥˆ!†Ï (;‰3b:b́è)+v+3ñI‡XمX]EĴj7b8œĉˆĦ,+Ö6bqv]I‡s"–(2b"V‰G,£4J:b̊XĠCkXğ>ĊK´@­˜5Oµ1³˜›1Ÿ°é+ Ĝ1 £Ÿ4Ĉ”ĉi–Ó ĉ²bјĠXĊ‰ƒˆĠ²Y1ĉˆZ´ƒ3Ĵ˜6²JlĊY+ÊŬ×ĞdG Zħ„ħ7™’91}9…8wé(µúݵÓQâN:Ä ³X1VµĈ!­ˆ5ŽÒŠX½`w?3bĠ„VŒ%AŒĦeӎXŽX%9bµ„ˆA b³™ħv“1‹4ˆ5ŒLñFmvĜŬGĞäŬQ‚êsıwĜˆRG .FévWŒŽ˜zM˘sÚÄk8ScŻ ‚F6jĴŞX³˘ê°Ù0ĝŠ1&zQFħĵÜŭˆUŒyÂDVLQ*>#2‚͘.Ĵz5×;5›ÏÈĦî—6ĞEˆµÀIĦ³ êŒ>Uc 4şïxUcFe=ŒÎ´êZËf£Ħ ċAìĞͨĞğ_u÷+Ö9$mŝȎ˜>YfZXĞ`ħşĥd‡e'Ĵez‰51Ġİá&1ç’<ĠFÄÊhA0PM2TÑj].˜.ŠL ݈µíîó6–D1ŻWt_ıî•# pËú˘mŽÒX4îF^ë,“tú>í<Ûϝíŭ6•soÖ'erq÷•K›#Sp¤á4Ğâˆ!³s¸ÏŸ`ab’Â%?wß]†WF§Î-˜gÄX –‹ğßu˘€EˆÍ1ba 1FˆÍuGıĞb„X#!Ä dĴF!V c³ ĨŻ$ÄHH1BŒ„#ÄH1BŒ„„#!ÄH1BŒ„›K ²ĥË{6 rQÁ÷xvÄ1p5ïM(È}ġáFÔí„w÷ĉuÏO›èçN C…E–é–‚ĉF (ÙRı·‡9-Ú†=ğQCf÷ó™'‰‡)²ì˘Ùb–ÊÖĴ…›)cċ!8u”0ìĦdtÂf[WcĞ$çJÀ“Ò Wú½49b‡Ʉ˜†S9OĢŞËT‡P%,‘Ó3ĵ²X+f2–÷-Kr—U•6üŒâó|1(é:J”ħM˜zFY*ц›sÄj˜³ôYÓŜÄ-ÜW:ĈĜô!UĤSûbV3–{eİDİıGŒE&9as„c™cí#Ĉ ´bZµeCLˁÑQÄXÄX6ÄDĴ ğ/ğ1=um~ˆ͓zPÙè>Ĕ·•t6)SÓ°ÍħjW ĤeGncew7“ 1ĊB“™$҉tĝÛBÌÜdYħf^ˆiYr#ĴŬZk€P@Cµ•ÁşĴAğÉŞq´=XÔß`½Ž¤Sĥĝb&cJ‡ G,Ĵˆ‰ ÒYE]íD._"@†ìK߈4yèhĉ˜\Ԓš'%AÊħĤ}qEl°Ħ!V֒ġË;š“_#ÌÈ*š–ħš‰XımÄjÀ5ÉóëFú¤,ˆĠô Òäj-Ž˜Jx5ZĞÂ?pqò•ˆéyÔ|Ĵ0@ÄÔÒŜ–Ík߉XHX6D0{'b51Ĥה³£Œ6ŻÙEùŒ‰J΀˜µQ˘ŠÔR—fĊà*;zÚÛu,†­”1pĝ‡füÚÙ-•1èñ·È…˜ħŻÌˆ4[k{DÉÄxğ—Y+›íĤżVŻ‹˜µiˆéž2 àJ-"‡osÁS"VAŒpİ 1­<Ԛ¸(1fGLĞ@†ûû,_ÄôÄÈFC‚Ë"b E …"ħ2pĈXR+Öb­lV AŒıczşŜ„ˆĠré(1+ĈL+ÖÄÊş_Ż#ÜX–1X"ÖÔŭtñE bÀ…HŽ˜OWˆ1bf>e1}+H"ÄXˆċfĴŒ YŭÇ˵°"fŒ-ˆaC‡/Ĥ5K ñ÷Ó#Ĉ\ˆ)ŒȋO›§„A‹šYËu¸8uN˜ÓŠċ‰\£˘ĴE˙YbNĤaï(›"ZŠŜƒŽ(•Љh–ş1­ŭàìĦ-8ô“ñˆY=P¨éA3'bIfÒÌeͅXQîÜ2²ÒhĈ!V‹™‘ˆ1 ħhÎ{ĤôÊĉÎÔléc’0ħf33Ü}4j{°Á4²Â3ËV̈zÑSk.ĈVµ\ġ Ŭß/.h– ³ÁßQÖjħfÌ89°öîí'CĴìê(ÄZb hî@s'DĴ = >ħš!“ßa!ċTòDĴ\ bzœĠĤéĤÂ:˘´Üñ$ëÎ4Ñ*Y6ÀÀü¤à3ÖàOgLŸ>ˆ‰ ŞqóZÍ~‡=|†CġĠÑGĠXŬ@ L²ˆ<Öëöu=Qĵ´ŭ+{Ñg·^ÛDLk%u!‡²öBïĞqħJŒso6ĵüšáH2ñÄ8Ŝ7zes™7ÍáW˙,èH)¤Â*y.tŝé– b‘;VV†Y‰C²£KżĈ,ND3A(=I;Ô'Ò.bm\“úĠĠ­Y3‰°9DŒµu[X%Y¤•ëiÄríäğ“°:ĥ@Ğu3b„É@ŒÒ—bĊ#FmAˆ‹5!FBBˆ‘b$„!FBˆ‘b$$„ !FBˆ‘b$„ !FR¨Tb²z`RôMä„X(­Î<šÑm„Ċċ·N%mg²ÄrÍ3ÄZ6@’Âb,&wcJÀÚ˖jÉß8żkġbéX.VĴŬ´âó1!;G 1–Úˆċ¸ïĥ3×'fĴkËևb„X>î|ÇËu'ž7I‹#Ä,bıĥ|˘)by?ôNˆ!ïÊ4F,×ÖUžšK‹ë2ÄşÒŬOxZÂc)ĞÂP<ˆ^×ŝ†‰˘0c¸~HâħàCŬ˜xúIÚm[2%Ġô3F x4ŝݐ‡AÖ²ßUÄz~SµÔ-ˆĠ­˜r ŭzšĈ[ÏĥBTùòĦï†z„ñĴ™ˆU°àƒŭù^bĤïÜÎÌÊdĤvU6ŝĉHK&mKKk‹#­šo ¤üjħà|³#^Uê9‡i|ʎjŽvZ î[-Kösa˘,Ċò¨h‰[AÓRy)f 9#bá%Pˆ6`⍠&(†G¤üarƒĊ+GT.—Z1#ç(Š˜’FÜrAĴ‰yYÁ ½|‚“—µPĈ@Í·´Ub”+É`LI8¨ş?şc  ¨;àİKÄpûb cŞ“ÀЁp‹+ħ[$[jœO‡ô•ġÄċù"Ör!ĈpÄt3gĊ´Ë ĴD„4š6xĜ1³"Ĉ2 fŽ(“!ĤZħކĴŠ’Šˀ˜Ŭ7Žkèˆħ\cêÀÇf,²&íğûÒŜÀ#Q1Ç0ĤŽ#Ĉ’!Ĥ¤ôµ;b̆XE#\C ë(kE#Ĉâc1Ș^‡^×ÁJŒX+!b–ĊŬòDŒĊ"ĈP#V7jßfĊ˜ĊŠÙ›F›­´kĊ̎)í-_°£Ì‚XĠŠXEEĴ˘!Ĥ1–"~”ÒŠiĞğÍsĤ/–,í@ÌiĊ,³-Eg}×ĦğŸş£„[9|1†!†-ŽP‹kÛäˆaŒ- Ä ³b 1„1Ŝġ&BLîIv²Òş#ŻÒŒÉíkóGHèµ §{EĴ…Ï!ÉTê˘žÊħ(hgİ@ÄìfĴ"f Z4°@IˆCƒÙBŻUĤF÷+*÷uUԉ(¸ı1ûœ•c GŒı k:&ÉĊöAÄÔ)¤xĐöG€³²V|ğˆµ@s+]ItÜYħ„^Exßz•g˘LÍĥ´ĜĞ{ kĊŞ#† à‹EÌyŻ‹;Cqp­ Àšâĥ5sŬK×-WV‘û4ÖòeÈċÌw/ÁıžR>V ĝ„pŭĜžĥ $u’21Ĥ!Ĥ7 Óe=7š"b9ˆúCcc6)+:#bĈ…a˙('wßoo턣‰Y°ˆƒż~¸~eÊÜ0Ó7×ŬRas@XRpş\G”½(•$ħ’'ŒëbÂ* Á†š/<‡[{1Ğ'Ĉˆ0B,Àr]ìq:bÔQĥOX…‘ŒXĞÇ#„ŠFĴĠjµz|LIÒ Ä¨IŠDŒ*‘¤à% !FBˆ‘b$$„ !FBˆb$„ !FÒ#Ò ÄҊŭĤ–ĥgğ›óŻ6âhp=ÒġˆnÎęXĠVs<ê•üžüù”fs.\”1xŞÖ;}óB f,T>p§|ԏÊÈ}šŒ°DMèHú<ûicĴ=Äĉ‹cÌ ĴSˆÁzĉtYĞbÙü˙S& Oֆq„!°‰J蟠ŬÇ|DŒE̞Â:·ŽRZ1˜ĵ8´dIC°%…Ĵ½jSkħÊ|GŒu1†!“Ë "Ĥĥc1éXħĥÍĜ‚ŝÄ=żŒe)ÚŬGîK•. ´c·!Ĉrħbó‰Àù˜š?ÉX2•Ŭ4tb̍XŠn´BˆCĴœ?bµ³>Sˆ fħħˆ¸JˆV28„KÓQÖ Äà£ħ‰˜êÖj1 2˜´‹aIZĝĤñ …ž=H92Ñ7Už%ÄXDfRŽÁé‡+ˆRpŞò„µU£UUô³Ñ6'ÏXÔhYäfċ‚9ŝe…ÖmöÄ÷í‰É`¤4DL3fнšùı`Érd`!x!ËÔd1áħĈvċaDÉ Ä*LÏbċ ÙñàJ(M}Yh™Ùod%ÑD,ŞùüÒ 3ıÜ–~ÉÂDOúâPJ–L3/™ħ¨ZÔtĥ¨íŒvĞ.'ÂÀ VÂôU>`_Ħ'XtX1à›–íQŜ¨ /um›ŠÚħĊ Ĥ… 1-!Ü šmKëŭ+ƒúo1eé+,;2L&HVôĴĝ„ŭŞÁ1ÓRMV ,"”ÀŬ7s²Âj–€şbj8ċ²uO6Ę~(JZäz˜EĞ ŞŒÁĥÊ’U jÛˆ•sDLT›ĜwÙ\ Bmj°¤–ĥ:³ĈPÄ w,ôTĥ#Ĥğ§‰ӎ³ ÖHŠêïWlğJ„XŬµ0’&\&bu³ÖZĤ3“édsq÷&bˆ—o Ĥ׆XÒ%гdÇn1pT˘ÇQ6›ÔŠÙИ‰óµ+Êȸ-Aİ'5Ì´b Z†cÚ{ĈİZ+çƒXĴ£!VFG” 2°”G”ħ“"Ġ6k¨ˆµbĥ!%C琔ÔÙk¸ÓŞ3 bÌDĴ,.ñ<kXc]ˆ˜2O…˜~T`ĊÊ6+Ç[14ëıqLĴs!–CPÎôĊLÄàġS¤CÌYžˆ)%K‰X4°ÌŒ˜pœSZħĜ‰˜½JŠ˜MˆXÓHq-3‰'Ó0÷¨žZw Ĉ:ÛQÖÓ!fš-&TG·Á£ ÌçDĴ"K>˘׏™|X Ÿ!Ñĵŭhƒĉ AŒGŒYĞ8Óğbĝ0X@ĴàÎìħŠIP"LħĝÀ˜†zğҖ÷TaĈòÀjM™ˆ™ É sKĤäŞ×ÉêÖÀ‹AĴĠĤƒLi/MoV ƒ)£cÊz]]œÁ5^0·ıc ɈQ2ߗN²1ŬŻ0†\uĊ{Ț´@­XĜŸZ İDcgcÉv|1 mqċÔòˆ‹5´‰{ĠûèX\\•J(։Xc9ŜV§g°eJü˙ŒéUÍ!v·´VÔĥ $[d µ˜Ñrfš1As”ş9b†NMC,‚L£ ĥĤ"#cfWñé霢ûp]˘2X¸·ŒÎ ! ZÁĤ°XŠ˜9Cœz· É­‹ċ`+ç´íŠċÄ=íl›†o’b]fCl”öîzm6 š11ğÓc¸gÈoŠÎ´<ßĊÚQvB”ë{ĝ`=ŞğĞÎaħ)‡ ħ…KXGŸ])b=AĜœ"Ĉħ…Ž˜3„ÙI# ĥ4üGˆ-`i4:Ċ˜6šçˆ- „[ĝ„u„1-^Xħ€0Bl#–"cS~ŭdè‹„b$Hèî/%wŸ¤XÄhDIBˆ‘b$$8b‡!ÄHòGÌq§…öÙtYEҞL/Á˜ÒD a<”@VÑEÛŜhˆĈ1à§%Ûú Iv9ĵ@3ŭ{BŒ›[Ė.ÄĤĦ"Ä Eli ĢùËùŽĜ4„1BĴhÄÂ9ÉDˆ‰ùËyŽXHëb–óŜ.Ė.Äĉa ħ=eĊÂXwÖ£Vlaĝb!a3ŬMXŻúb gDIA‹nQR\Œ£+!6owa$Ûúa’6d fŜ½cCŒî´ ;-нӂ„¤ !ÄH1’‚Ĝv’D¨RĠ•Š]n‰„Q]Ş+BŒ#Ä1BŒ#!Äħ.BĴ$Ŝ ŝ”J0Ş> ŝ”z+¨ÚB,ĴĝG­•˜ï„ïôbTWYƒìĠ6CˆQ]GĴԁfÍ.aĤTR*ɨÈ^@ŒêŞ ÄÂż%ġrǪ́ÔR/Z1ŞĞĥƒuúĝW{1ŞĞTˆ9­9U@ŒêŞhÄJ„ĠU–Žy˘¨Ž=ÖFJ½£şj+haŠĞ2zë†3FuUbΚ!Ĩ’#– zìYFuĠb$É#!Ä1BŒë-Ä(…t2ĦşJUW>bér#)NzFlUIq²Œ•fJûİHŠ’ŭ%Ĉg4ˆ1’âcŝäZ?ùc$Eĝaŭa,ş{“„$ñǕ˙r/Ŝ$~cIENDB`‚gamera-3.3.3/doc/src/images/display_false_color.png0000644000076500000000000034104210714675724021307 0ustar chriswheel‰PNG  IHDRbĞT‡ 5PLTE 40)!-/,%2X+7f3:A,eŻw˙Qgˆ-‡@TePf—+Œ>Jh­€˙Lk¨ rŝ„˙˙2|˙tjaˆ˙Qm³C‹I6vߗ\g˙npoXrĴcrTs´]u§˙C”˙~ [yşœ˙†mĦ ŝc{·˙Nݰ—ŭ&ŝwu°‘o˙g~şN‡Û4Ĵ`~pƒĤĴ˙e…Àl…ş˙]§˙°˙µŝpŠżL—ĉ¸˙IĤĦzĴb”˙k†Ž˘Á˙ ĵ˙Ċ˙”‰·È˙˙w”ÄoĤÍ˙Ñŝ—™–|žÉ˙aİà˙ƒ ˙Ô˙˙'Ĝŭ£”ħ²˜s§™Œ˙4˙?Ü˙b‚˙Iž ˙S\ĵĊ˙[˙‘˙kä˙˙rȏŻ˙y ˙c˙è˙˙ˆ££şßŝ4˙˙Ž˙•ĞĠvLj˙z˙£ażóş²J˙İ˙˙ž˙ħ˙½ôŭ˙ĊI˙˙˙Ë˙Ñ˙ˆ˙Ĝĝ˙ŝİ˙Ŝ˙ßëü˙ċħ‚Ώ˙ìüŭ˙òŝÑ˙Ğ˙·˙ù`˙ÇŻ›µ³Ĉ¤¸Ŝ˙óÇÉ˙¸!˙ĉ~ÒÜy˙Ċ·´£Çĵ˙żwĜñĜ³ğˆ˙ñ’˙˙ÊĊŸ˙żĈۛÙá²ÒĠĴ˙äÇĦ´Òé˙Ĝ¸˙ÍÏÌáӃ³á¸ŝàÈ˙ÑÒÜèÓµŝíÜ˙µèîÒÚîé˙ŬßÜó˙ŭûíŜÊéßċçäóçĜñĜÓġóçÚäéùŜóòìîéìíĝöíĉĝòÚĝġċĝ÷îú÷ù÷ŭ˙ŭ˙üż#{ IDATxÚì½ lçy.Şc÷:µR‘â¤Iš+Û4Úd%ŻÍ³šĈï`:êéĜĤ1WÓîLîŞqVÂîê˘ ÎîPv`€=N ӁE™ssED™4EêD4aÁ EƒB$€[ \PŬȉċÄ"ïû<ï7ËJħ8öĜÎîÎÌÎÎ÷Ìûóĵ?ßĤW_]XXĜôŝòŝòN,/ʲI ĥéóĠ˖ïżĵż|wËßúò?Ĝ¤Ûô욟oًeŸ,ûß_Ŝ{ x;ûáŸŬˆa˙mÙ˘ÛqHaÇaY}üúĞ;×Xí¸ĠĦe[Üèê`ku ŬzĝÀòĠŝċ[Żöн\­ğìS×:âÎ|`Ġâ…/YŬàÏ_r×npµÖĴĈŻ´V­÷ä‹bkàĈŜŒmzġɵe ÷ßr¨££Î²ú¸öîĊ–~yÇ'°ġ‰Ö;_wëĥuèmêĜħñÖAlɽï¸[”Ž{ÈÖ=Ë·Ü/[.níom :Ŝ×Ħˆèx°µġ^ْ˙÷vtl´Ëġ÷Óó=ĵüÛ¸Ċ+XyU­+½g½_ôïÁÖ=¸{µ¸ġëŒÇâ.ßtÌe :ħµqƒïŭÁM›ƒO~dızġ§ĝl‹|ǎCüĥ=9ÜħgÏGïك/߳筭O`ëklÉġíÙsçĦëoÄÖAÙځ­{ȖÜlÙڏ­ŭ7¸µ[û°µWĥÄփÜÚğŜVĥ:Vo™²6Kë½µŽĜĝ;–oéġíûµ·p‡îÁÚqpÙ]ğûĵî­ˏ¤#­c„bkáFßûŽŭ+Oqub2ĉ¸‚kŭĠ'W‡6ZŬÉĠÁĠĞÛıڏ• Œ7–X3[\íÛpµw½r/Vn¸Ú½¸Ú³Î²{quŭóñ+ùċë_ÚĈżh˙ÒÑñèŬxKô6\çNŜyèş£°8ZŞ <ĥcË:ĝ¸Ñ÷~¸bW!ĈgFj÷îŜ½ÑêPşúÄşĞƒéêÎÖêöŭ×]Ŭ³ïÚUYqеÚğluïò-óòêĠŬ÷^ğ&/;vŻZíĉjOkµ˙²—‹Ğ˞ëŻÖĝĥĊĠŠ‹ĵwßqŠĠ£r‹żöĉü _[˜ùÁuîĠÜÓËîó'6²FUŠeË:ĝà{è²ì½Ÿ?ÂW׀Ĝ#<#‹#Âîl]˖ Áu˜\ĥşŭಛ³dµx×pwżĝ‹Ŭó ›×WkġĊ_,Ž‘P9ĴCŝ­;Ü-D|ñ{ĉçïı¸–ÂLé³?½&[‡ŸŭĦ€xÏwÍ˙ۗxĜ½_û÷…+_êĜÍ?ğżóï×ĉÒqÁµĝÁÏż´{÷+ÇŻ÷cÌJôĦğoÇċŭrŝ>öòoëÚw­µZqŸ××Ħċ#¸|Tu¤UĴT”WŻ 1yŭó%ï->ùıùL!v`Ï*„mÙ\+avpĠĈ’ëŽ}­Ġŝi³à[{—­VˆÙm%†p`ĥ\{VŻpìĉÍjÙ"üôğó [vïÖ??˜˙Ògŝ~ž×òĊ…˙ù=ĉÏ÷˙`áċ–}üı—ñ;îh!LêŬóóò¨mŜ|ûÂÂĉĝwïu$˙zwü‡;d+YŜ£ê]ħĞWo@Šo­–b+·…(ĉ—ïڅïŬµk ·ÉÖGÉÖG6ܒßĥk×'Ĥ[·cKn„lí_gKîé]wì[ÜúċŬ:żçWçżşw÷³"-ÌÏíÚü·żöĈüW;v?ŝï×~u×{%ğáíŻâßî{!>b~íŠEùšííĜ·_ŝ<üĝáC‡E!~l~CÇ/ĵ6˙Gİŝcŝ³ßŭnGÇüüË?ĜjŽŸŸß×ħC˘ yŬß=üè³ó/‹ò ĵġ`ĥ^=Jz^éVëNjtäFGáò­£Ú‘n£że|Üè{-ˆ]]bsEÌËÄ*×]í¸ĠĦëŻ 6X\]ŝ[;X0˙ì ?˙ÊĉğÈvë½ÇżmáêW,ğ-…É?]ĝ·Gu—…ùŝàŬËĦWä‡Í)–ÁqĊħ*Ï1˙íï/ĵ°Ù7|é—b˙è·|ĉ§×ĉr;żìM˜UWÔ?˙ ŸŠB|”ùÚ•›˙L˙ĵı {gÇŞŝL|xÉ÷âg=ĝŭ…Ÿóşġ› Ĝ;˙Ĉü_›]`ò6ŬÈíĵŝ \oT÷îÛûÀ–uq£ïˆŭżŭtÙ˘a}Ú·oġÒZíXuĞWż^2Ċ›˙ċîîŬ,7vóĉ}ܳeó֏Ü+ŻñŜòŜŜ‡÷ŜyóÖ_ŝ—ğ÷>ĵ/ċß>Ùuï›·Ŝ/ğ짂{xï;ä?yx˙^ŝŬ·¸ßĉÍoâĜ}ú:}oß-›?#§Ĝ{o^‘·:-wïûȖ͛?ŝ+9`ïŜâÌ[͟]x˙QžċáŬĝ†ŭr¤\~ĵY/mÙĉ@|Àâ÷ÜûG›·>‚÷M[ż°ż\N~·ĵµW˙Ŭè­[~Ûot ŝdċHËè?phËzĝ¸Ñ÷búbÙ·ĥüÈŝµŽX˙;ÖúàŻ³:ĵ|ëíŜâ%£µÖ¨Ë-ëáF߈ŭÛ:˖öÀ/:p?ĥduàÀŭ_i­·VË_>°ŜêÑ]Ò­Çż²uĊ{‡ÖxyHv[úrġêàú+9V·ĤĞ­Ġ˙.Û˘šċ·§ŸîÇ‹;s7÷e˙?[Ìè˙& ö…u–-˙éŭċŭċ?mùÂÛ\bŻżĵżĵƒK ħ…ÖrdĊëUËġwx'>û­Ŭ‘·użóżîŬ„Xë#+^ŻZż;ñÙoboççŬğ ħMïClñ‡9ò˜,=tß]·üĉ!v×­Ÿ|OBL·WŬĞ}è²Ü´ÎÍĵË:7ó-|ĥéü²˙?{–ûV.Ë~Ĝyó÷ĊK÷m[r=qà{èÖ·ħ[/_ŝäĥOç ĈñU÷êCŸŝğŸŭë˙ü‹OúCXfŜ|ó‘ó—ÎY–#o³óßüfëġ7ży~ Ä^ùM/Gî[a­€Xúö돝ßĥxG^盯>v×ۀĜG/_“ó^ŝd*ËŜÓĥĜ‡>˙³ŭüg?ôßû½›RŒ-ÙáĉÇ^yġŠ,żxìĉU7ó­}ĥiĖJħW~‹@lÙ­xqˆ-<öúm‹RL!ĥċw­ ħ[nıe[k‘Ğ vOòúëo\V½g öúû´ ì/n˘–ĵéż·bAÊüü•+/żò2ĴyŸ_vuçG ĥ rlÄ^_Žħ%·í–ÇÛĥ°píÚµ7°l{èĦ[V@죗y ùüòK›ŜS;òú*ˆ}èï~öwŸN5äĞj-˜ eŝÊË/ż½~ħ Foí³ċ,Ŭïˆ{âüùÇnY ħ#Ŭ÷żĴħkçżÌċükk@ìaŻ]ŝñ{ bŠħe!öÙEC˙ĠċğùÈĞ)T÷ò‘›—Aċ­~öğ(Ċ^œĥmZħf˙Jˆİ­†ĜGßx}áÚÂë@ĜċO×lħ#Ğ!öwñġ|§›/Í ¤|ó›/ühŒŜâgK¤Ĝ2Ÿó·ħ'6]2˙ßtäüŸŻ„Ĝ ³˙FĜ­·nğïòŻżñ&öMŭè{ĜÜżéúç˙U ö{7Ŭ´6Ä^üĊË/S}ó›/żĵFoñ³ó‹[ĉsğô şç /lzñÈÚk™ŭ+!Ĥ"L–ċÛvé‰m?üš."Äŝ÷yOAl…ıÓg˙ġg?ûŝâ/ŝçÏ> Aĥé–ĠRìJŠ”żY-İŜÚgİSŸó|Ëç|Ç ĤŠîÖ5X b?:ùëË víÍ'V˜ŭ+ öĈÚRìKO<´íoücA×ċË/½ôM˙ïGßÓĉŝMŸŝüç?˙Ùżûì‡ Ä6=ħ햕;rE v"ċ›Ğí­·öÙùÂàsŝ¨ċsSğġÖ[_5ëĠRL­ò‘F›^[ 1ĵġÄ ³%Č {íòĥ‡îkAìÖKO<ñÄ}›î À^zÉħ÷°ıÓ§?ûùa—zlÛÍ+I‹+/(ßü›żùŜjŻñ­}f¤˜ñ9żÜò9ß9)Ĥ˚RĴċĝ½öġċRìÍ7^K!ĥÊ#·„ĜC-òb÷Ŭׂ˜œ< e?!ĥé½nîßôé˙Í ìEıiG4Z·”û…˜ìó7ßüŜ/ŽĴĉŜÒg*ĊRŸóG-Ÿó³ĊR„­)Ċ-@†½vyÓ2ˆ½ñĞ×.–_ĝÚO€ĜCK–û–@lS1QĥmÓżlz‘Ğİכ>Ê°[oıġ#”cËĜŭ_y¤œŸYĊàż•Ï”ŬWŸó…Üò9ßAsß lM)víÍ7°Ëˤ}ÁŻˆ‰Bĵĵ>Ä4ö™BìW^yġƒ²ÇŽfOüŻ˙÷ùûĥŬúŜò(W›ûĉÓM›Î‹ÑpóĞCĴ…•ĠRlĠgŻ^ﳕ>çğħ76}Ó×ùßßnúÛĠ3f˙Kk@L,ümbˆ‰¤Ú&òl%ÄZ(;rämï1^l sÓ-7‹‘˙ĜùÇîşëÖM+!fÒd—ae=ˆ-ŭì:ǽş–Ïù.@ìuc‡D?^b-„­„Roiċ#•’hPöCË{ÔÜßtË]b;Ü·í›7½z=)\ĵşĖöê |ĥÌç|g öâ²e9Äûŝ÷ż˙÷XŝV—KÍ~ôúê[*šÙĥiùSûžd÷u¤ñ .ÁË[z3×.~ H£ïByÈïŻXVê:cöcùŭWß/r{Ëìŝú÷·Xä&{żŽò}ˆ½“ûíÂû{‡ ĥDĴ|½jıîïÄò[ğ#oëçŬğħjŜ¨V°ÔjĠjµVݘµZıX*D…B^˘ĵW.WjuìQÔ]äREŽ-˕Ö"'İĠ¸’ÍşœK ˙äpœĥZŻ7½C3£½MĵƒÊEžBŝK²ù†ZúV!ä;vXŠâÀ—Ċ‰£$ ÂRıR,„q‰íĊqâûží%A$Ǘñžâ9ċàMٖyó?Á"§ĉ+9ÔKÂċ_œxŽm[ĥ"ğıĴlàϑĊ–Oò,rrž5áQĵ›koË[ĥqĴÈ5qËF ŽqÎ!הÈQŽ%;ƒ³ĝĥïÁ%ÛĜ? ñ3,+Ÿ·ä<ÏÂv.“ħċ—8vŜŽ·'—uċSÇvó“·äàÀssy+oËċċä@›Ëİĵ°{ĤÊOÉĉä”òcä‚,ü(ùĝĉeËċ—ûQ­&ŽċÊÙ,v’3ûAXˆ*ŭk·)ÄşK ħr#ş1xܨ((Š D ħJ ħ(â~%`§R3Ĝ@j-ˆUeUV P”ïİ”+ġfW÷ĝPWU (‡ ĊEˆ ĥÌıŽÀ*Š Q˜äBŒ7`y“ħ ü ŠGnE"/0jxĵH\ÜŒ—ğ>ötAQL+£%P„Ea@%ޤ†ynÖÁ÷ÈÛòĠ>AˆñÂñí鞎§p—ë°rĥŠ÷äÛ;£ˆDñHYıŒÀh;ĵ^+#Ȱ丌œÄĠßd[VĦĵ’8 1à 0 °qĥ‹Ÿ‡G —{‚-+Ӗ×ŭl< qT½oÚçb=E‘*D% £!˘dpKWM@TÖqt–€*òoı *Wġ:÷/ñl…° -ċd­foo³%Ĥd)iV„ĴĴq³%Ģ0$ÄD&ɐñ' GžàC…S)ĉaLcncݐó _Ŝ5ŠJš˜¸á&XŽbb^Œ4—ƒ1Œ'ž‡ŬƒˆLĊvĉY‚9›\vĦ çĠè7@J °Ϝ§Œ'Qq@`&­g#…˘§²v‰9†s|4Š,E Ÿ;Ċ @˘rPöÏ ı¨dÄrù¤P äœħœÈ& ĠĠŬŸrV}räë,;²ŸÊ ¨ó`zQQsfĠĝârˆ AU2 ÀÑDÀKĝŠ5ŠŻb\×RuY&4 ŒÊFçUġjµžBĴ,˜* "IT)ĊJ1*Ê.À(€$C’éR2´PRìAOrä}h€PA$ÏW Ÿ@Í$xGE•­˜Z   F=U‘FeRïكgb0Ħˆ$DŽX˘’ÍóR] D`XT‰ÀÏÎá ·)Ĉô~Sĥär‡ŸBL~\”^„Ż×˜À<ĦŬ'żĈĊï)u”è·B—û)ÈZbO_@ RJ¤K6ïÚ1Y(9İh!Ûd›ÂHÔYŜĤ¸s!rmR‚I*R+cµ=)–Ëf2À˜•kϤ$=)@jç²ùœÈÀìöĥΊS;ú´úP”@ltÄdÌ£EğŞ ÀD*™T´Dޘ*4A ÀEFVoAĴÂŭƒrŸe£R!N¨€‹s€T!†CÏQ†r ‚HàĊ€XH9‘$fÀ e†¨Ĵ‘KɕPv@+ĊF…ĠÄû‘ËâĈPè` q›ċÚ_òqpoĠ™*}Žp:œG°¨è²ĠŞqR1'9ԙ!ˆ‰ŭ‹H<—"ŒŞKí+ßoIS<ž‹}}FßH\ž›#.‡Ù*Žp¨­˘J„Ĥ›ss‹µe7‡Ií2 v•ÚXrDΊmXg‘Ŭĥ3_Ĥ“?ÒR oD_–š“oßI3Ì wŬ‹+Ŭׇ˜ŞG¨´ÂÓï Ď"íúJ gbCa×"vxRܔċJ 1êJÚhT™â²Lîş'–zı,˘ŠÈF…‚ž‡~†à#‚ŒÓäî›û'*yɰ@6j³ˆüƒ/c¤Ÿ'´8şIbÂGŸğ›ÇŬQ+'‰Ġˆ×ħ%vÔ^Ħ çÚĈ†³24‰u|#[öN.c)bƒj1y6 Vs9óĜ$s(ÉT¤%D1ġ'Ô÷ƒsŞ>˘DÍÂLŽ–Ħo.—Ç@ıóİphAZİÂ#İ4…˜ĜVN§³sm€ô¤,À"`”oÏA¤_6@%j˜Żĝ Aħ3M$^SQ6*ĈDg ŒMD$• ´ÇŒ^ĉvj‡UĞyh7~œ"C­uħjĊĝz‚7'ް’ Ĉ̊ 4ĥ(İhğ@Aâ訄€zbŒ[ĥb­Qя#ˆ B0ġBcÇĞȁ‚Ò0ÚÇ÷ Ĉ§@vġò4C\Ŝ?‡&‘â2ï[ËĦ·EµcûI*ċRgç2t'œ|N?%Ĉ àá FrêĈQŞ(SsÑÈ1î&P£OiË%AüjĝNÎáN0ñ-…qjxİ­^° •éğêd醃ÊçÇ.uâÙΈA€Á=5àuT”Ñ Èäé7ÈċçUkçİAħcĠZċk@ĴğÙ  À°İS?ŽbêZĥ„›Zô•z­,C+`WR·6\Ş&U•*IĦDEĉ•reJ-˘ ĜŠ -ˆ)8 K# ĝ< ÓO •z½Ñìêo֊ħµİtP<Ċz È0ı˙ê2r`)’8Hu !ĉû 9`É}ـ‘Ìċĵ°ĤҐP0yĉá…|° F Ċ fìcd–O"H}Ŭ€¤‡ñî0ĝŽŸ˘Ë¸ JyĝžħA” ¸r'—tt#>ĵE†aœ ßQ ß/xY‘›p!\ğñOfŝñ`GâG‹š¤oċÚ,ħ<Ë!³ı%Ëĥ;žĝI)1Ĉ<‰NŜ‹‹şVCĴ³Y%VoT žZU…X²Ä¸‘‚ nx İÑó¤€İÔTÈ˘RêzŠèbU^–ÁÜ7VZ­HÛVmrĊħ#N;loâ pƒË‰púaÇ ÔÄW¨Ġ›½=ŭS£=ġJ@[ËAŽËgşŞħPÁĝ`Èà"ˆ§Fo>H” ˆ!5şi-QŻ(3”óä ċ"’°<3vê³Ñ”S='ßiĞ% – û‹WKï!´,UqĴTššúžrx‚½d”ğ˜¨QéĥET=0µ'!äXyLx¸Şĝ€~އm[= ŭ&Û½lF &RڍXž‡À,“m0BŒoÄ,5ĜÚŬPŞ]~LğdİĦsI숽úòcLO…ĵ,Ñ+s,ÏfYĴĵ|/ 4YSÉ3O)ÄĝIes‚uhŜfòx×V`ëÈġĉ€ä$ĉÍӚBl²ŞÄĵq‰Œ°\M-~˘­VSNo(P½"ò¤³Q-FV¤ħHf‰ÌÓ½_bĤU]]ŠzZ³ĞYċFK,˘ĈŒDFujA¤4EDˆ‘ĵŒĠĈŠJQçxW˙ÔôĜĊÁ ӍzµLr‚üS ˘#ĔIEÓMT÷*{ş‡‚Hç+[…§àHŠĠ­¸Ä@y´=l²] Ġ”M ċ(q˘Z!1ŞoÈ4ċŜ³í6‰aHe™lġM"ß²’Ĝ·ŭB%ö,ȊÄDµÔU_U œ 4ë"À|LCU\DÛ°°7ċh;k3"•µ !ï +ߟìà’ëSmÙ\ 1‡R ëv1Cyŭ$ùó6ì7š™L^\P>–‡k'áu!fXĴjJUÔ*ċJm1P¤ü= .ħ˘Š) QİÌLLu–ËŠ-(1Šœbİd˘Aô3K…¸RïêŞ—ƒ‚şġŜ.ÁeÁ|hĵÈHW ³‹ ß'ft¨˜¨ÉÎîŝİsώœŞ‹_‰r‰!nĊ”ûˆ‰ùA5‘ĊôŒ§ièTjıŻ;%ú×Q ĉË/§Oİ›§ĞrÀĤĉ R˘p(]W‹Ş=£R•Ûp³ÙYˆQ‘ëıٜ­.Ĵ”bŻÍ‚“(bÄL’F ”@§Îšŭ£Óŭ5ŸÉ6֟Rŭ†ísE>ċ½”2VɕÀPhmÏPfıÙLN UCÈ+{ŝR&N{0Ĥ ĞÑÒ0y’ ˘iT€‰ìËoK6‚XÇb¤òĦï–Xê)îhÄL$İR꜒][#wJä”ħ¨? 0ċ&{ÇEŸhÍÎzı <Ğ(Ì8"+‘ 5FŠaL­İıFŝƒHœ9;vnn´Y"cĤ\3ž]+1Á&ŭ2# )ŞSö? s*‚‚$ Ôâ7Ĉĥ£6lX òy'u (ĊŒG¨ÔIKŒÉÙ`=ġbµ„½r“ò› 'Šp ÌYa糌ù­U&PoA*Ru–qHYhÜ îċĝġĦ™‰‹§§{âäQÈ)%‘‡-Ÿw KœşP¤V‹œÀħsbdɎ4é §y+—ÉZ†:=eüp—ÑñċIpÇÄ5ı:¸SàÒċÍ0Iäˉ—CŒxİÖ[­Ñ Ӝr¨˜Zej†=…Ée\ĊâĝĜL§ħÏZ+İġ†¤Ä½,döA„QÍ6şzëtRÁ_¨ôƒ¨*Ş"†UŞAÈ U£¸z³ktzznŞ·Y׀AıÚh6|ÄÊDĊÊöӇїÁLtL/PcMîO&”Ôfñ5 Á/Mbe\z3–Ór?ŸŽŬ²–0ú•Z9é”Ëĉ-ÇH˜òıv‹´lô–qíİ™h8ßò ž@Q³,r_ŝ"Ĩ,=ğÔ9;rşïôĔĜñí"ĝœüNÏñ[aó4ÈMÎÁ6AOù‘>-CY}`@”ċÚ³vjˆcR@Ô,ò)ò–3A’ŒŻÔRWäĤ‹É#wvLq£L rħÂÜ2WĠñsŭÍJXb,¨œêLeĥÄÂ'7aŒ˙zg/ŒZ\BÊÍPôäòÍĞrÑ Oôž@¤§ğ^İEĦ M B\$²T“…p pŞ”(£œmËonŽÏLŽw5D9KaÑÙĠ%6ĦÈI9‰š\ÍtfV{Ĉ3„“‰Ùȍö Q"wQ „‘Tˆ9Yċ)˜„EşÜ·\ìşšĈêFˆnKm1ÏëĠS·‰µœ4œ]easYuĤ\Xz9Ià5<“bÌcœZÚ.vÏ??pzŜR)ħ?v²°ŜypÙêd-#ÂE¨‚Áfµ ËS˜êOqs;sPŜ”sò´ï´ċÎW;§zşğëĦċäf74)˘"^—ç‹áIV¨Ü55;waĥżYĴÖËaíÈˑ•RĴ\xä kİ>Ŝߔ瑒Ĵg­¨\—ˆ‚O%¸Ħ$ó‹ĈÎ' )ÑŻZPŜ Èż1”mrP×h7ĵ•#´â8 •>‚ƒ—”ŠL\İĞĠ&¸kŒŽ÷ôŠàBäŞPnöÉKñ!*šĜ“£‹v‘r7-Ì„<Ì$ÌċÊ)8#ŞHHÖ!hÙ$.YħƒsíV1D¨ĜéŠ0ÍQY)ÉħF|ÙʍÓIË#ËFŽƒVƒàaĵ&Ç,M߀I ”Ûiše ÏŜMcÖ84ï–{gϝžìïŞñ3=×;&Îf²Hë(v– ŸŞK-9—òrZÄÙÔ˘bàÈ'üKÖNlˇÊïžž!SĴwĠC?Ş5GğÉĦWËĦ&t›Ü¸Öœ97’DB(Ċ"|9D C9´jB„ĞÀ…Ħèy"zğğ‡fĤ'.œ›é$är£"ÉqħäĤÑKF`N|Š˘`Ë<‹˜$ŞĜèQÉäá‹z˙ÌèèèPOWï„Q% ßèŞşñÜöĴ7^ú„3Fœ(‡‘bb‹§ñgéTÔ:PeŞj9¤€´ 1Dmàûِ#Häqs0óĦ…Èg2ĵÙ,²˙DÎävîÌé¨Nb5‰´Tzd 4.èee`Áß Äg‚MŸ8=67354ŜˆàM .Èĝ·ċÈĵÀV†š6%3“*EÄ3|ĈŜ I>ge3VÛ)Š|ı€ÜÎ6ı4‘_ q­ ;ve¨³>:ÓS ƒÊèHwÑó*fw–ş¨0f½F÷èٓ‡çò½£AĴÑŬ,— _.§üVYH4êa{•P‚DpZPd1֘i)Zb¤[„aCä§ìR}DbıŜĠŬ?5=9280829ĠßU+%r”1ñ•ƒ‚X€F,•™ÌŞ( ŒWĈaßV?OCTİ8Ú? Û nkµÙĴCĈmĉ5ÂĠ¸0 a[=ü„ È˙2äjâVjaƒâċ¤É|., ĜdÇL×fĥ†F‘Iš)“f=çí@ĵ}M?“ž#ħé+Ëĉ" íth%ŜxUšÄ‚¸µü¸ Z·rc^XkvOÍB^7+P*bá‰qÛڔ÷7ıKI,q+ġ D°ş "IÙĴËc˜"`Ôğ}{RL/"ĵPĞÔğĈëòP—½Ġ’¨DĞ ^#R])`ü+½C3#ϟ:5xar¨§§w|Cˆġ ×àbe1Ìµ½ËÌè1 *ó*ÖX³ vżX`°'RƒĴP*×4+_ŭHŞÍ\ɞİɑá‹gž;58<13Ŝ,ŞÔK|ĞN(ӕßX™@²&ôqч<ֈ;ĵ‡Bwvjjfffj\ ]íŸ™éŞ–Ç̚³Èu–D%5ˆ$8d€ei‚:áè!àƒìG1²L:TfŸQçħġ$ÔѤÁ<ÒŞ)ŜÜLŽàclÌuELzq$ÊÚJĊròbJùù<ċ(0ݞ·‚€ĥgèçi¸ĠëÍîîrj2²=“gèhj›&”ëŭK‚ÈÏş… $ħ† dó9(dßlú5(!„?•säB³vìÇEĉF¤K!Ĵg‘`ħ]äpʍIDÉ8Ž _|ŝä™ç‡'Ĉú“*JȁKT„îİULŝ,Ĵ%˜+ˆm̕˘$*´ŞAJ‚°M7˜ġĊıvżĴVäô j^‹=wôèñçGĤ‡:E½Ğ…î·rL5}^LĦB`ٚĦÏɨ@==ÊQş°qħŜ37==997Óß%†˙ÌäÈdO£ĜŻ‘µÀYäâɕy0·é…%·5ÍĊÍ:zŒ@“è‘BQt4ßä8232LZ)A°èGĉsm1Ž %‘żÓžĦ$óL5ħ·FŸÄúÏı„OEh.\ì{w£ğğÌĠ‚duCqꞃ˘˜„ıÈfĥƒ&œéyÍJĊÉĊeb4.aë!;_I;/d çô âċ„²—-Üz™0qXkÖÙĠÁHda'‰wÓ?4}ndĝÔñS‡Çf{ğĤGQ²AÊau%Ùjĝ}MÖÚ¨Q‘j*ŜLĈE =â­!uŞ6żĜñ Ĉ"ŸıgµÑÙ357ˆ/—àQ½œ³Ş3³£ġ€–’ÖCxQY´ĊôÄÉçDRœ›ëïŸÙbHF,¨\3EËxŭ2ÉĜRE”ıÁÏT%*B4-F+ŞH‰LŠV+sž²ĤTéíôS5{ûgϝ>uüè‰ÇÎ Ï 5Á3.g2ê}P;‹z5Fqâ ùĈab ,£ċ P)QsèÜÄÌÌÌôäÌÜÄÄıħ Ž sĞE,˘€ ğäƒħ¤&jԚb,Ä­Ž[ƒÑ2Ĝ^™älħC0M“ ]×7 À ²mÎC– ĤV42kàD5ĝô"Ŭa¤íGĉ1oGˆ—N9èĊÒ˘!²üÂu¨e¨™ˆĠ%YĤċˆ#Œ\ ³ĝóĴĜóé§ĝÌËf\M3— ŜÎĵŻïħm‰è¨ˆ–˜žé;ş^);AĴĤz³Ù˜ƒg`ĝÜĜÄTg}C[Lˁ҂TÄ|šjQÔ4Ô2ÁT.´ê„HqтKi|M¤?cò%âëDŞĊRXŞVëÍİı³˘&OœxúhßİAQâÄ1žAÏd‰Ê-5dRĊ4[ߘħ… T*M¤˜\l‰İQïxvÎMœ›˜œ;71;Ŝ °4ÄÀĥ[9FĦ³=‡µ(%×Ĝ™ž@Énj/“–*!Ġ×   ^)§lJÌfx0-ĞÔLŝ4żÔILž-@DÎäl'&ŬÌäábÔó.Ġ1.ʧ˜3Fˆb0È–{˜Çü–Íëô ÚY~"z4—è˜ĴW(ĝŒƒg3âŸòçċYħĉoğ­]Ż…• I$6ò›Z$KTt MNô"Ħ1XyÜĊâĞ4Äܟı0pôÌà\½ÑğĊ…4)Œ•’I€Z“Ż\J~P–K£â%Ÿ“ˆ™œ@ʲĥ"mÇBİŜììêíŸsĉÌóƒ/^™îßĞ3 İú•µÒuH[Ĝ‚²ŞÑ4‰_I3oĊި­jÉ$4ı P³A wTŒŭŜŜ~ħÉ/ž9~ìÄSO>ùÔѓGĈñÀ‘kjLS°µÒ÷Q÷÷zTïš™œE5raD̰ÁÁ 3=3SŭŭŒħWJ%|*ù„EĊ(ÉgĴ´°VÓM޵ŠÏ8tìTêŬµPu8­q“ßêğ’Íü@›ıÀsLŝ;BÚ4żÓj„eL0U'eıœ˜0µ r†\¨2Ëi–ˆEr[t‘•$nĈg˜\žûzCĴ2'mÛcX1–¤ÀĦĴ ġ™ŭèfĊÄooG•wF°”gÔÔ€39Í÷r ĉD&›÷4¤Żb:6¨5 žè”¤Ŝ[ȑh̞8yr`PĴŭS³SŬRŻUÍEÔLj%ĝ›),"ŠdEµÊL1öDA]\­PFâb]"JĞd/Ĉ_+Ç H,0àYY+FS÷¨8”§úÄ;qâès}çzŞĊĜ$M‹WĈŜ:İÔô £V~lÀ@@PBmjúÜÈĜĜĜÈȅ³ĈF'†ú§fLšE,İ,ˆRŠBsdà>$yĉ֘´vϐ 1ˆÏî­B18@'óÁF€9hĠöNRn6*, eԐQÊĤ#Ĥ÷\:96ħ@r(’h‚­ñTċt}-EI*ġbìeĜ­%1M.ììvĉ^;È,cг˘ıq´³‚kñ\Y"¨hŽ(ˆÇµ ÈoRˆµċ]M8ʙĉP —ÉċdÚ,4Ê@œĥ‰ŠLµÒ{Œèza9 ˆÇË#~nnnrFì’ñz!)U7LĴ™Žb- İÖHžĠœ*m›=ÓŭuQ‚°PGÍ:Ğ/ĊY¨÷̌žïZ -MӜ5Ó+ĠFWgg³w|ŠÎ¤ÏÈıéĦ^QtS%ħĦXɛ8SA[ Àg&ç?z|jvr ’ğ888<22vnîܘH²İÑĦñŜf½ÇZK%Ğ{›Ú$¨ˆ0Ħm*Ó²ĜTŠÏ_gk?‹Œ­ĉ4D£—ê½ġ‚—Ï+ùÎ8@P˘˜gÎk‘˜bšE=óċóĥúŞ"TıÌ@Cî!H`1Úà;Im´ĞV°ÙêPĞÙÉ8´gÎ|NžŜúèh=Ôŝh##ÏD~ğ•ĝi šÜĝD½Y“ƒH-*bµ=Ÿvc í†h™Şö­Ë·YòV[ĈNÀ÷j3yLry?”Ħ(äËÍ~q#û›ċfoo%ñ˘âF-ìÊ*¸càl=Q@™@(ħU'uĤECˆ[ˆV¨‘{Òy½{fäԙáÉĦ†Œ`ħ"‚ †e²X½Ù@šĊÔè8ĴĦŜĦ™Ħn¸}ìŭŠŠ!s†(lbĜ¨oĊ IDAT@%ƒ,V­‘e1x÷ìÜ܈â ^,bí@[ŽMȆş;ëg#¨’b v ÊXxİ Ï_bI³a&"Ħêù·Úí8&eßdóˆé‚žfò™xò[[M²ÎğĴGĦž´şâˆÙxV[N›Ei‡Ĉ$żÓĠĉO‹,}u½°h?í5&‚3¨twĊŸ¸'‘s˘lÈ´L˘Jc¨·Œ€Ÿ„¤’ŞQŜ)Èŭgè’)ù)ğ£(WżŸ_šÏé…Ô ÀJ„›ĠċÛUË'ùí9;×.˘ iŭèïĤ–`Ġ—-Çĥ%DXé’{Y+ y˜}yĤ6*rcX™”ÓêG‘>ħÏ,EÔŝAğħ…H“n!ù^ó/ޝCçNëg:~‰üU^‰ÒrH@NO­Š6£==½ fR’1#͑”;+š†–vLdI$ ĈĴövc^Ĉ·)é4˜0˘k``pàÌIP€X†/œIÖ/7@´ig¨êKħ·[¸Imİ•ÒĤòÛQW‘ ™Ġ½lÁâ°V ğ´:ŸÊNšÁÜA”~§‘ $7ç\flĦ&Q”-~È(AĈ8pĤ´_+˘´˜ZÒġ+ô•A6hTt-*È6ò͒J¤=gYŬĦĦŭ¨ÒÙĴ0h%7J²ĈÇkAœÙkĊHˆäĠçŒĠÉö;FA²Gjµ›XNuşvïĦÚµĜ[,/bĵà1üêCì$b!ġ´X)ù ]+ÁDĜbi[Ms‹jêjê²K RċÙç‹E•f½fş'Všŭ³gG›ôKµöQ~YÜG΂¤êžžñqTu0²dÚ" jĊ=+›¸›µÎ$ & Ċ†­Ö;>45#úöìàò.Ož8ÙwüÌÉ矇…G”‰•'NNˆòîÎΰe]ŬÓ½5ĥ8ӂZ vg,ßw}펧 ­‰6ñLI›pQ·gĜdKÄ"÷LÏ·iĴ™dĴI‰;ĥ^bĈmĞÙ° }'( żoçM3(&T˜.h„œ˜pݵŬŠEe츀zOR£Pܢ2T:žá¤Òè흚êİÖğf'zE8N9PĴÌıMëܘÏaµzqŠÖž§KĞîŻНµ a“ħ\VwÄ2ÌbôNÑbËc;43ynllN$wW³ÑĠ,&–Dî§² È^'“öş“Ç™°ŞLTËH°ĵ>Gğ$˘x-ò2ş*ÚĊƒ —ı<ŻÊ™Ù.Q,N&MϽÄLB54aˆb`v(šFżZ˜nĜ…§VŻC&NG,¨4µR˜†ÁM—0„™jV_N‚@{£ĞÎw!{dF„XÉô¸Ç+hù¸ÚcÚ_LcHŞÇhé÷MÀ)eĉxßñçžC†‰‚²ç€²“§G&§z18|nDĴ˙ٙŝ^Ĝúèë½5fö{ž)Ç­ê§-76%Ġ`Èd’.Â}ĤM½.H Óĵ(Ä8&>*i‘ݍV‚ÙĴ ™4!ë‘À@Ğs´tÓIóQiŞXĝì|úìb&#°†ÜÎĵ–ƒ,¨‘|Ž‹ä36ݰ­\2^“`ħtO£\Yħċٝ­8mÊNb¨…cŻÒġĤZg’ÍşqçÄh5ĤË”Ê"É!vd5ÄXôZĞÁ,˘h*ħcŻ)(2êĜŞÈ…c8¸³³ĈĜíœá€UĤĵĤì]œÀ$Ìùhq¤o³­t)2Í%Ò`a¨YŬiSħÈ4 £{)NZo˙4YĜàó‚°cšµñ `ö´`ìĜñ3Ï_>{vdœ†ĝ˜§ċĠĜôŒx²b,Fep%^EDhƒŠ +U†°–B1ϐFša/Qރ˘ Ö\$Ĥ§'ñ—ĉ)SÚNÛÂİ3&ÒTm:¤ì§6^šŸĦIıñ{ Oƒ0fF ‚é0Ş=3°‰ıÉÉs“Ŭb„Äâ"†k·˜–7Ĉ<5[ħa#Ú¸Š4ƒ&Ǘċ²UĦÁŸ hĝ  d{‹—+öŠ]çĤʁ•PŒc¨­ĉOœSle10b: H$ (²Ó85³&ĵ)Ĥ­KN4C_R„N\1óË\Ħ’ 6Ż×ä… Í‘Iè ŝ™ż^ÚËÙËk&vhX2ış’вPeħÖìĈÇéÁӈu"˘ŝ̓O=ġÔÓòÏXc§@ġ`'ñ/ĊÁ<=<2‡\X´ÚĞ4êEtµÉ²4QÁŒ+—iw Òĉ^I`d_ğ Âhi×dTm—ĥŬ7†–çÛà£P_kÙùvÓ}×MM˜>ê>š‡L':ú옣íżÙ [ Ëé¤ -G!Ĥ­mQä&[ì1qGlċ÷³m–‰bn—ï+p.Ž˜ĊpıímĴ¸a€* ,NdŻ3ó"†Ĝ‡0Jë>Ši}HÉÌYd¸1Ò˙EfÊ/éäQ/Ĵ„Ĵ— ÂL…)“ĉĵˆ‰ Ù4E$äbíĉ䴒Šö–3uen™˙K5ô[Q˙I ç ¸°>èĈcbóSK˙R06¨ËĊlo#ħÑîf½†³ >ÎŜż)!¤„Œ=ê.0T:İ"'½D F>ÏéLKH1XÓh¤šqùh›ÚçT.pÎÄÇ·>ġ‡Ù8ò˜'ȐwÔĵJğgĤ ‰aOŬGǂw.ŸKçZ Ĉßğŭ”‡ċ!n:Œa’G%ŞcŒüö6†… ˙rŠ/‚TÙ 1o <Ê´iv"ÛĤ³…1ÙÓRFYĜ>Ó²T>Ğğ 6g'INlX²€ò[ĊÉٞ%Äҙ7W›û&žV^i + Öê`aZ[hC3rŞI“ÙµÄVkn)?Í]?“0ŜhÑĦÖZüG6A÷Ù¨‚= ™ä\üzŠÀĜ4 Ž b…uwv‚Џ(˘éù“T“b‰ˆİİĉıÇúNBt]„ĝbIçÎ Ĉúğ:¤D )ːg3Ĥĵ•rDĥVÖĥçÜöí96 ߙ•ŭcٙÓ6Y˘=żĝıĵ½è˘U dÚ32Ĵ2h–X·ŭaF¤Ĥ|ž³Jú% Tċzyĥ6ĝ¤05­7\m$Í|Y3ï`– ˘ĴëĥËʃşÊċá¸ëì-äĤRîS9ħé“,] aÛIpñĝa1ĞV¤yooĊá섂Cĵb€eg)Zµì¤•MòMa`1A[´ġv+ònkw4•kË8vÛmí€vdmv_í)6Î4LkÙÌրè4•—S4ŒBÚÚ5jġÍSóŞ̂˜¤s µzFC6ƒñg‡L…Oœ"(4•ZqĦmùà!cÒž6ŞġNMÏôôÏΉŽ8y²Oà$fי3ÏAp ĵŽİ ;úôQüˆ\]¸p(>{ad Ö³qvÌZQî˜ÓŜŽĉê"×V hçp‹ĊhĥUŬ`É­) %Û´zeƒúvĤON&GrÀ2“!_A†)“Ñn:t3ÛŬ˜ó>ĝ$/’vÈo27ÈtfWi<ËV}i,t•aȎ•ŻÊ£\Èj‡!àD­m& GêVÚÛĥ3ÁUt·Ü@ˆĤĥö AŠÎFRf+wŽNĠNh€ÖÓhŝÊ.ք˜–³3DŻÍi5pdµ6òu7ˆÉl{›g˙pûFĉİ˙.ډÙXGÛĠ™ üÊĈ,|!ی‰#ÔB-ÓÓÄäÇ9~:!ŒƒŞ(&ÊT(–Aµz&ıĠj‡eĴäw|„‹ôYE™­ñ†˘ŞÙİĦ™9„a…ŭ†èĈ£}a²(µ/›˘8Ÿ@B4¤ü3ŞòÜ$;Ğ4iQ2Ñ@OĴ–V †ĞÖKğĠ" `û[YñÜÙÚÂe¨(‹n6ÈĴ—pÉ rB„§ bŠŽmfôíÄĦ×î&ıO‘ÈËĤN…•hÂŞ 6˜RHĤˆŠ2gà…ĴˆŒĜ€Îv3Yd‡‰j çĥßĉúĥq ĵÜN‘Mv[;ßΌÎ;Ӟ?Xoö6ŞĠŜÑљ.²6Š}…‹!,Ÿm9dü[ôtšUĜ "}m(H Żr(XıW…pûöÌ}êżr­b80Bı†Ĥċ% !jwKܕƒ-,ÖIàC•Ñ#LÒvŜn˘]ï“ÖT}qĦɒ´Lw.?ŒÓĉNš%Kϑİú(u&Ždä¤Ŝ35=;5=16rá,2Ÿ?óÜѧH„‰ïèÓ4úŠ‰vêÔ)Q—Ì}dh|és“3CèiĤí̀  jĤ ]Á‚"ߢĤDCp ÒHû%"Ç"·…Ì+AäŻ:â²ç3:+ RshœIrY',PsìÌ·€LéDÚ&""Jyòĵ_.enË$aڃĊ7S;´ &#igwbò>Ñ~ ÷ÈÑrĥ-§µµĠoâşféLXyÀZž G~*³l{{Ĥ]ïÇċĉÔxwÏèìÜé‰îîÎ:['%ĥÖĴ[4 S×ÍeŬ €é`÷ŽlÖħs^ˆ˜ıäĵäĴ „?ĜÈÜGOŠ2yÊÚÀ.ĦlÚpZg[+R—27BĈyÖ͊´ÚÑOë¸ÎŞÍ-"bOiËH'ÓXl˘;ùÚV@U*£8ÚË(Ğ]£"‚&‘t86ŒÄÓ˘!OĈÈTŽĥĜSÏ<óÔÓ0ûÁa‰ßĝTú]<+ÊR ĊĞ_Ħ”Fh– î(ÂĊ˜ÑĈ r£ÓX%0vĤx;nìô0²Ĉ›Ê Ĥ6ğ†BvŽ Ĵs´&êPXĕj9rK‘'6t×(3µË"3ċŝéŝú‚A4 5+R S t˜Ìq‹ŬCE$zôü1+€í–F&­l[ÛN”f{VĝR×t#ıžsc‰ùĤŒì òT }H™Ämsµá_¨˜g½¸BÏşĤ‚ÈÖO‰§$nҝžž;7röô°x@£È¤!T ċ„Èlr´ymzWİ­Ík§†‰rƒÚ¸1Í,!לuĊZ ‚Ì}ġmsóĴÙ8RâÊLx‹Ĝ$gsC~b­\0 ¨en…fĈ>CT´ˆ13H'9'Şt£v Žv*ıè%bj”AŸĥ|1×pïâ‚Ĥŭ3“Ó³3 Ä&'Ξ#‹ÖĜÓÏ<ùo< 1FuÉ8ċ“Ï@U’ż€yò Qúú‡E]›ˆ•#;†ÊİĤôÑm§Ô9Ŭ)ĤéƒQıQacÙ Ĵ÷öŒ÷N5"ÍKÍä„ÒU‰qÛoC:½ücpmb´oÏbZnŠ6ËkE'Ù5ÓÌ* c´ Fe’ƒĜum˘Ĉr̂°l3Aı·\^,Ñ\"Qç˙e SŜεYŽA‡ĦOï3šéèċ™ë˜É [d7TêŬ¨šç‚Z1MEqUêF£ä´‹"wÒ ‰˜ ¤ĠZ²(vLOċùĊ’Šú,ççB•œëûíVrsż˘zR“x*Eӝoħ‘ĤÒ¨4úûĴƒe~ c"Ĥ‚™:6e[ÓöMjh‰Ċ^i4Ĝ’İUï­ÍAĵ&^-™R¨@ıŜ=wATÜììÌÔ$Ĵ}YD†Q”[OA‚9ùD™èMZc²<'ĉ˙ñ>¸}Ïë;5ˆÜE4[ëïŞW4İV.9F¸äU–еîñjA[ÖaDÌ$÷ Û°k‰~t,ӏˆ4°H†ˆŭĵöüwµÓ'ĞyuÎħfŠ@c&ċщ P’+Ĥŝ–ƒˆİ/Zòż?ù”²'a~Á£ì[DĜÑ4˜i Í$;30<1ÓÓÙĠ‰™ž5b›ha˘‘iA›œëÄ ìŸOÚÁÎşp¤”ÙĤ³sĝ˜Â$8Têpşŝp( ÎÎ|¤93ĥÑ(žNi{¨ÏÍ2û:­4c§aôsžc²£IŸÖ ;/GğGAX Ò.(Ú÷X›¨J\jàžYA˜ğ-‹³Ä•fÏĝ 2…ñ¸ ž=79;ĠSo6޵ĤèËâ™É¸ĥéIë›ùxlĝŞä_Ċ‚.T‹ ²L+]ÊN&żmdîC 0-‡ĊĴ%VhkudWéĵŬšA&rE,ÉÎs3²†İċħâ$7xIËd†ĥ˙hMš…wÒ(f€I×XÄ`ğIlêbÍäşÈr­wV˜›Öğ§Î‰78&(;{ğxú$Ò+D€)ž:zĤïhŭ%{˘ì¸bL–Ç™Jvĵo`xlzŞżż‰"•c^:3jËĴß׈dÚzÎ4@êğ ¤Ĵ ŝlNÀl·Äl15ÜRAĈJGsäÍdŜ ÚĦ{Pț[Ì ¤ĊƒÌ4‘xÚÁ'Ñ.Ÿ&yLgš Ĝ ]i_6 BĴ 6SµħüsϰıžE˘Wääŝ0ƒ–1 ÷ğgĈ™Š~üÔàĜ˜˜û5Î _)Ċ™-€†›NZ‰<5[-ûLÖӖ*0žÙéŬM"'-càĥÌŭµÈ"Öħŭb‰ñbƒmħMš™u”eÀġfS'ŭ+˜‹‚t*S2ϰ%Z߅IN—İGŽN3œN ݞdZœ’ŭħí Éŭ|Èq=‹RoFĥaR‰/†Tä3Àى£}Ï ‚xQ ŭ§!ĥž~êi–<ĞŒ@MÚ7pñ~<=0˙”s´*4ı(N„‡\”|@ä¸iĥŭb#X›Sƒ8l,g)¤E$4ÔÁTá ÎŻó›™œéfòÈhìy“çĦ‘ÇŒKɓ׆Úò‡ ‚'UċÚ™áúĵ"€4FŜĊ<íżabµN2‰„ÂĊ:Êr'òJfî+*EÓë\¤K˜à<Qܚڝ·´< –è=¤=#ÒIĜè&Ĥ”XNó’Îrޞè':yIÖ읙@ŠëY‘`§Nž<Ù·˜…!ĤÖŭQmYĤĥü9†„k%ŝ 1ß÷üàىs#£½;’ T˘ıo›YcƒBĦ5q³˙öŒmŠBLú"kVMbkzÇjçMp°LYp•‡Ò,Cȳœ•Ÿc á§½$$ Ş0Dżrp¨rÎĵi[.j1ŸĉµéŒóHb‘§’×B‚v„˘\_4œÇĵ†)£3uOĥÎÛ&•f˙ôÙ$8qaĥK§VC ĵOg6´L¸–Io¸9âA‹Ší6ɜ; pÏŜ ÒĊċ”ÌÙbUoà2FfI˜ñQ 15´ĵ3ŝa&R3.³<‚tÚĦ8ŞT4ñmh£”^…hbHêj&Ĥ:mCéġİt+Ó~jÍŜÑİİ tÀ"VĜÉ3H&ÄÔ{’‰ˆcO§ĥ>H‹cÇDOc™òf'Nô!v p•¸×F[ZÉĤÓ03‹Ê’z(-+oëüì,I̳„Ġâe6µk´ŻIhœÉĥĵĉ`İŒs ÖZûêÁç×ü pN½V{&ŸĊH$ ÌĴlZ(Äè”fF*IJfúħëċĠvWµC`A!öMÖğQ݊ıĝüE;ĉ`‰Ġk $7‰IjftÖ_g9Œt˜ôpr93h•"ĉĝÓöÏ wJ0ĉnX¤ëŠjԛigÊLp5=˜ÖÜjĥĉ)¤ÙÎNágċï£` IDAT‚à ğÙ(.µ?ö”‹ġX[ʇf–%lŜmZ§y:5<+r›ŬC3bŸj xÚè™v{F$´ċ÷Ê ¸@HšŽa -4ĥ$Hƒ3ô18Rçf§şĞL½ċ$ħ9éÑÊ2 7ÙgPÑÚ-UxZĴ,h%GÛÔµÓêC—éƒÑŒt3ySl RßÊ !_£îež3ħ16nkjİa„™&‘7½ÉU:Ù-šÓĤ·¨ bI0: ` Çóô2:mÔŽ÷vvuόœcv\3ŭ]¨:c&™lE[á!Ê-‡ˆ¸‰‘íoĦGO,ݜÌN/“&mǙut~K9è:RĴ¨mËĊ‚N3YâŒEITŒ´9rkÎíŝdzŸ‹É^b­Z‚*F sQù­I0L‡V’Á¤ĜÓ<Tˆùċ{I˘Ó,–’˜)ĵĦ˜k]SÓ³sg_'a?°!"ÇOî i7ñ ž…{`w$u}>Qò³Ù×oË W?ħ\~ùÍv­_á—;gĉúĴ˰Ó,ûŸnÎoħ|m): ={˜l2§Ú3İG܋£(U0uö“†—+,͸]OšÈlÁğ† Œ˙ĠTVÌÀJ§nÂXuŭ'$.Ŝ”ƒ·ÒĤ+…öĴ(ÙÑdXê!Šuí¤(ˆ@ĠİÉwÊÚ #Á‡E:Š[ŬNk8—Gk{ys}·…ßó~4ìĥÒRfğÁljœ~1|Çú­€>p|’x.é[o‰ÁùB&UmIc™^³~QнŜ‹Ñng¤Ş–żUĤívžäʣ̝oÖ츟™uƒüß019CÛÔ[ïÎI2ñœg G…ŠMšÒĵî/Ú.%šJ†XŞšOôqNV°_$°ŠÏà}ğ‘²÷ÙŻ—5Ĝ'œ,á²Bs!Ö_ż^\|ğà˙ȜpħĵùĝeıA³Ïo!–zQ).R@¨£VšÌ½“χœ˘RĊñ m÷“ğQ6ò–˜ĴÚĜAÉÀŠ’Y€tż m_¨>“i °Û½1†’ÚÉ8Šó{‡µu4ÄX?A21byd"ğŸË4Ĉ/Im<\öĞíŬŬn9ÜKŻ -˜jß F1ÏuĞĈLiµ%™‚ÜR½° ÁîĊo0­³?¨‡E,iúġĞŞ^Ÿ‚8eÄ(Ô6ËĊSüH䨖ž'mJ„˘˙1ó;‰´Hb ckŻ3ƒî.ܨ>£;²–ŬÔİDÉcÎĦH6ß=^_ŜüĤä/˜¤F‚2nîo†wĊÁH·a’ëžŬœAv~óíâëċH"Ĝh_^.ŸW@óÄEEĦŸĵÔ#˘áÍe oƒ\‹ l˜Oсыۍtá`ċû>kŸSY7Û._3™â#ˆT”„éócK~ïuDrjÇ=×mĤ˕B½1ı6t€ i=Lħ4JU9–¸yLMsÈäè qLJ`ց?(׌6›ÑhŸÌúŸDJ ¸FËp5҃•]z~i}…ß ĜÈ…Xü×½ÁóÖpé"7Ġ:l÷›Ú›c?oı‹qŬÒSˆé‰JBQĦ¤#Êĉ—ħ[ˆ'vHQšğЁÖĝEЃr cĉT,2îßĤûíòéâüÓ/'šäoŸ_:+ŭ9ú?ß˙F4âŸoÀóé—OàS2² Ĝs <¸nÇBITޝ ŽñèÈ[uhUĠSRK|ìğt‚3ñŜl° !#àĞ^—óqUğ ˜ß[Ĝ1dÚ}‘ ÌVâí*òe2³Pê-W¸·—@Ħ›Ix²x²!R²„˜êÀbÍVt`[ġ§ğ<‡#OµŭÍd8N“>ŝ0j*. O>ĵİ+Ñ@£  7·<Ħ´xĤÑÌï]{ûŻIĜġÚôĠ‘,N-ÄxöÍ3½"R1§˘&ËÜıÑË, ĥġz):išSX•yZ†0àĤG glnêĦ†͑šYìƒ(éNá)vb¨vŜœħS¤4ózĵùz 4˜TÀËŻ,‰ì½ä0ĠOV7ŸñÓŻ–À–— ïJ§/ïˆà´t{à9½@ž*ıBQN’oôJĈšÊP#:ŬGš²BâÄȜNkçne–ŞŬŞú“v‘éÉÓy2t‚<<,†Ú|p Şí4ˆĝÓe¨o“˜3˘QWQĉmŻ„ Ħí>Ê*÷ԗ`µôR+q@'sú‘|Ħëİ KâÎĞ“ċ›żœé·ĉäá€*µÔäá~ùxż~ŜW.ö›½éón>l–NÇÊç%²ŬŸn&“é`j1u ba@‡†ÎÓÜĠáĠĵŞXí„JP%{'M}Z4Ĉɰ•›äĦb T=ûrjB—΍V•EŒĜx5j…S셃‡ŽŸŠ›NËÎtHéÍ ó‚á|hRßàí¸:˙…Ģß\&ĵd1€_şŒàzÂŝû+–××Ô+–4†D†[Ŝ>GchôÚÔùI)—Ż|IĠuR8ƒÊžc›™ĵ{  ™CŒcĠ‰Ĉ­z#Ŝ˂Êv]ɉNgl½ 9„p^ŬӇ?ÖC%ç˙4ñU£.rú?ÊĊÚ6°Y‚˘żàÒù§ >ùnĵ´ÊTéviUŻxó—˘;êUôj\<,Ÿ–ë-ÒȗYùÁQ§eÔ-^ĦżßL+(ó>ï@Aí÷zmvD>nMĝvuĠD60O£öjˆÙmˆFlbŜêáP$­½Ê”A‚ҝ-=à§·:Ujҙ-ğˆ¤ÏBÉÌVĉ½Éĵ› !6WlżÎpe”¨ÜʕbĞ@ĦġÔġúŠM×s[sIˆ}Ċ–_B 9‹˙û•(–MĞkIZOĴ£ò[—Oî/ŸƒÄy:*K\¨ÚŻïħJŞ6/ƒ„´íHġ<3²Œ­ÔĦo·µĵg(NÊ;òÓžDîìç”ö¤iMìŸ1Ä:9D^Í×àö}×D[!ĉùÔ9!ÁE„şžŞlü ´šoĊĝrQ AÏhÏ;ŭôïŝS5v2àzğ›#Hò÷HLQġµRÏSJĞĊ|>\*Œ6œ `̲†Áv·])ÑM‰ÊP‘ ™ú °ûNˆ™ĥ“:Ò´Ġx2ÍÛí\…şbÎ'¨1œ†Z­"ÇżrܐÌ÷*·zÖLG'+>(YÓFĴ[1l@zZ“QĤ#)}µ]žESġġIıŸY™´¤P^¸Vžt6Ê ÈÔxĦ!ĥ\ŜA0ċcîâêú Şüğùl2I™Ìœ’Ĵĥû‘ċ@ä 0òâŜ²"“óŭv.ĥÂ}1‚°ˆ‚bĜ’Ÿó}hRnà MNkT[âê>¤0"7užŭ3~N#ĦüÚ?fÚPŻL\ C§ş¨úœI&ù9ŠôŠ|éDòÁ öwgé?ٍsD4VV“A EòQÑïK&Żî§q-‚4”}™Àĥ÷  n‹Q·YŬxDŞ @8 `_Ġ^ ħŽiĝršìĜ%œu³•éQ'7OÓĥÑ'ħe@èÉ7ÓĊ}û´‹µ\¤2t´$Ŭìú4í‹UZ+QĆ:FÉIÄۈ¸AI:Ù?ùM×W%!€˜É.U—P~‚r˜òçżêoêÉüICîeòòéñù°Œ”É MÍ~’<ìŞÑ²µŒħBÉór`çk£dĉzW4ː ĵŬ•#•.ô1EF5c_—bşAȑR£XÈĝ!cÎDX²ĦŝÏD›H.Uu;q†tíq‹_UÑE°’ù=ï5kŸ`₣d‡'óĠj5PE˘Âıï@à˙Z’g:~>Rét í2J€;y½Tĉ˘Šĉá#’¤1PâŻfħ6•œÔ.Dó£iŭIݵĊY eJrdĦċ„î+ œò9Ş@ä?ĠüЏ=·KŸ2£ÚdV§œñ7wx\%é)<ŬÁd[JöY^3ĈXµÑş œçÛĠ•Ñ#A½†ê´óWÌvRFñ;hĈrO×w’Çn×Çél6úĵĜKĈ‹JÚ3ŬŒUĤÔÌ´N<ŽJùnġD…|İ \"“aàİ9Zd#Ú#—dTékAr´LCCwlÄêc™êƒöÍê"ïÛġH·İ(™ÎùW‘eÎËK'ŒĵßÄ>Û!ŒR<[È•œ½ğ„zë`µ †#Éĉ2ó”noÎӋŞDt[ŭÑü 1ĥ“^XĜÛğġóq:hdsÄÁ9.ïabŽĠ݇X³ċB cCË`YIˆsfŝĥŒû"eÄu:ı<dmç˙ ùVKàÖÙĴ²¸èH‰S'šĤz<*°™ê’ßa1'z½ÓŸ,Ž$ċBvaß\ˆ]rqù´ĵ½Âà¸ĵ^RClïÛkĜ#âl¤ğVíÄ ˜H‹$\żħ~t¸%Úì5êÁ&3"Vvj&Ï) ™°QWñ/O[,ӚP!&"Wëo9 z5š€DNÂt{ĵȝ¤C Ş%*Ĵ1{NúT!á:-˘%şUmŸrĈĉΠ>p&óvx§!Rœ8éÎÔ÷ℂ;9hç´ÓA4¨]l,à†”¨QΊ]˘ñjË]5Ş™Dŭḓv~ŝÄ ôa>ì”>hsv bˆpJîâóçsDöĵW÷b´í05D ŽÜ°Bš!fĤ5 °'+(átrlSĈ·Î—'d~“ü<îTşÔVˆZ ŸˆmtĴ|8“G-ë ĤÒhî$O#M_~} 1JëóôxÙrùIÎ[zˆH÷e!öül÷ċg·ÏÏëûÇġ~3ŸKÓÊ€ušòƒB™äBáıİJF+ OW/!Ĉ(",”p{Ŝ éóH?@"x|·Â$h' l5˜ŸJíçUÛQiii`ĞÄsı̓‘3°7°mŠŬŝµfW—ÉJ8O‡Yğ?íµŠ€- ÄĴpò½•BâoĠ‘?àŒ "*ŝ4HÏ@­Ÿ^o´YvwW77O™Ü=,FPf< ´“Öĵ‚Ĥ„RZ!/áU?Êĥ´ï¸pÏ8Ôİ]eŜÒ_"ŒÎB]ügU‘8JmQ¨Š6íÂs†œzëKÔÒ|ûÔۊQ§‚Šî`àeŭ1†eIÔÇ{4íhìµR˘5ğ„—Ġíz E”ğíêÊĠ@Ċ˘%ğĦîrTYiÔÉ$h'#ú|(ïÚ|Ôe„™Së³4ŠÊÂ@V>œ}ƒÍ{– 8š{fÓF›[Î|%Ĵá….cqŞ$|‹hY…ş´,xËyRWħÀı1£ Ñ##Ûĥŝ‹=³*w%€zMžñŸÎèĥŻ(^żTÖ[˘j퉯BÙïİ›´(Jt”9öVè÷ÖËËëÇ[ÖÉJĤ6L³ÄÔF%ÀŜ:…uŻJœà2O˘" Ux§ÊTĞGƒRÛ kËa5‰TŒ&ĥ™İ×GN… ùŬvÄV äjêò*AO5Ç̆ZŻH, zŜ ‹Ŝ>‡ê¸^Q:²Ż:B^²ûşßíŽ7¸vŬCZ˘q¨ğŻşlEžğ…"Ïa?Ÿ ‡£ÙD[1™íŬi\{úÊtcĦÁOá;ÀŒêċBÌİËQĈ:°˜ÚŠp5DéĝxÎöCû$‰è‚JàÄ_Ak‚ׯ <ğ‹Oi¨*™†F|ûĤañf‘ Ĝg7X˘•Šyʆ µßUDô §ˆOUYeùċIˆ âĥ‡Óŭn·½_Ë Éj:„Ì7\t^!š3 ŞÑY ï„˜üí\ġ[†Î• âè°ŭ¨šıó‡,JK:e%#ñ5ÄZ½ ÂA稘8ÍÒÁjšÏ{­égÇëï+Ş\¤)„[µ˘ŬNWĞĊfsĜŜŞ †C&p ’òxż;ö‹ŭj,(oÁŬúî‘!ĈÁ“ÙNµxÀÛ>WÙşê²Mĝĉ-> E•)†­µ„( L î5YÂBSħ3$—ò”Ħ²@.ş‰öÌúÌȗ}Ğü ˘ĦÊtğ°_1Ò6AÈ?Ŭö3żŽL…ñ}ç}cˆz`Şŭħ‰ÇòÉxіşq/u4wϸîR*Ä­ĈÍ:[ZF"íÜÁşèĥ'hH2ƒÀçlµÂn˙áy½;ĴĉÓñ Û&W3¤PŸ'–˘EßÄ׳XĠT|ŠŞTŝBÏĦQ“ĞP³H„X·Ï/ÛíBz7"- ĥCӖşÏlċ™<û1Úë9EĜ >-öGÓÉH^îQ ÚTÍŭÇğ‡étħZmĉ ¨\@ğZÊäSO2@’P˙Ĵ›éaż)/AĠl𽌋CÄkƒċ)’S‰;_O È‰z€ÀKy*ÄĊk%ÎĜˆğ”9{IÜoı-ZŭM`ĝ} UÈ4†ˆŬ5c‹°˜^dñ4˘ÉT·/ë°ŞşL b`\ӆ9–œœ:-Ë~èˆ:EÚîHĠqĉ 8^²ŒÛŭñl<…ḚNà…e<“*5ˆ•˜R§h öŝëY J)Xş‚ê­Fׅ,|µTz@e†ıĵµµÛ"+ĥ1ҜİÓĉ@ä•§‚UÎÍS³˜ê˘E•@?І­:ԘM OŸ×·HJäè^^ĵŸËĞŸ/Ğ4ŻŻoeš”GüĦŞK Jş—@Üïá—5 h€½ġ —–”ÇG-şŬw(›MŞLĵXàv“¨x9@zi$ŝÖ°1‡ÜTisc]&>áĈߓ"EìÀkï*ko>D.]áhĵUÓ!Ic ëìġ_ĉ~ÌNKaéŠtċÓÖ#<6ħJµ é!CoÖÒD*l9¤^pW/uĈ!ö”ĉiİğRè\Œ°BÛŻV“A·9àĤzp”Ħ5 Qİ_Ŝ_ßîóúmËzħUŞMÎefKŻŞ-sjnŞò_@.fĉà¨|pe…ž’McGä< |AúHÂDĊ'!!ċkÓÒݳĦfu§=œlVÇgzÁĜtû–›´ŸÈۓÍt6 ñ¸•_\>B7˜w¤KŬeÜŜmwğ‡£ĵ=Ĝ2b–÷TÚDzçâHF8HÙ/$•JlvH€4š‚#ŒéĈe<ïkĦ/C* ¨µ @Ú'€2—HNï^“#LBż0z–K-èĈ³Zz&bàPĉ}¤GxŬK@ߔ^‚'H9öá%—˜.eÒD0-]³RŒ0BJH*ğ‚Rˆ‚ĵÄ?m× &k;eÓí c…%Ż$­%ġ²Ùĥ3İĈ,8ĉùĜ+Àĵ5sıƒ´€´˜˘yP›„‹é9IíôHTüIÍ݉“@áĈÁ2bŠy‡ËŒɎjCŝ ‹DS oG_œMG­Ŝíê4›ê0ۓž8”~`\ï7!¤„q‡ ./Ÿ™yş‚”ož–÷ I^3LA£1lZs=°€4@×yHun7/²%FŻoĊ^15ÑäÏR 4XsŒüŻú°n•O8ĠT7e0ğòXŞâ8ѨÙAÀ‹’,á×ğzaó'`dş*÷µ>ÄI›q ˜yXĦ UiIFVVTÖ$‰Ş”hĈĥĤžŽ$ç2=F–Â÷˘oD¨ê:iÄ-,qÌ%n;0gM:ˆşŻ.}¨İJÁĞÑ+8‰U5†ËŸ˙¤EeĉïêBĈ${$ldšħ @ †‘TQ´u~xĈ‹ FwF‹=Ìí´™·Ñ|b^—*‹\!|‚Pġ[› †ñtżßÌú½ŝd˙ĵ}>Χ£>à‡Mn%Ĉïùôˇ?˙ò4ĥĜ›Ž§^6­P´‰ġVċL–ë–UA›\&Dş‹RˆvÌSe#Cè‡'ç…`h`%ĉTe~JıD(­.l/gXì`†ĴTä Öƒĉ3Ÿ„~àü´œé¤Œ‰j$͉‚QfşÄċ*ĥfe¤"<ħ÷Ĥ—d"óüĦ˙-d1Ê.?Xœú}ğ½.H[E [ĉB%ÑJ%Ĥp‰Sdŭŭ ‡ŜN×Ĵ ŝİĥGòú҂û ˜’*MòĠjÒá×Ŝ°“›#ƒÂıĜ™Ŭµ˙$"lĈ!J¤ <,òĵÓu3)…êÚ`¤8BŠE›e@Óȵƒ[ù`4›nd¤ic‚Ŝ%ĴVӑ œƒÇŬ3Îh_T~ùéŭû÷ż^Hˆ=>Ìg}xŬw€rИ"!­É”'y“÷SßW.ŸDìFc[Hà-yÒϲ–ħ#ƒÛôL˘ı{ä²ÂĴÄJöww꒚IïÎTß?XÚ\E³ Çßv—Çl( c‘‚dħ!‰ù jğQ‚§ šsĤUZĉ d;½^·­”tD…݃`÷ôœQ4;ı]R-ħ}âĜó3¸œĦ½mzÒ] IDAT—zĉ* e£àâê…ßAZ˜_ƒêÖeœ)˔›ŭĵCŸéXeeĉ"*˘ *’„BK7 4û`ƒĥIċuË1ÇŞ,8"³ÁĴ%%²›Ô8Œ'<]#Öf›Ġ~6 h])–Çġîány üĊ|˙ŝ7VÇp†ĉ ÀRÑħN€œèÌŻşN•*Ċ(²>Şä[Œ—)£ĵˆ z‘ŬÂíˆ^uÚ÷ĈIĉ<:é!†‘1.ı?à6hœ‘ħ)!Ĥ P² ĵo,¤0nD/@Càô'IË/|1ĝM°ÀĦÒÜ4ƒ@ïNċ\{ Ù5€'MĈ´•:˙` {Î/Z­Ÿ°“üR“Bh?ÄŻ6œŽŭ2|W³ħ´,5żJ“ĝúDy²4e¨ħ³ËÔÍ ĈHĜĝ› :ÇÖ6èI*ÔY8µï”vâNĴôËĵä²ŻĠŸí6~“T$E ¨" êBŜR˘˘7öÛg„fĞŬÎf£~6?ÒW 3Ÿ” ³ùGÊġġ·‹ŻŸżüòñ珿|B/Yl*1Ö&]˜ÍĞ=g :ùŜğ°êÏşò°jY*áfğ@ùdşr²à*µI @5ŜTl•ĉD„JÀ‘†K²ş˘¤#/ͨV‚sŒŞ(‚qè™Oq°ÙèÉ¨ÌĤlœià:£×C3Vµ;véµŜäÄuĠqÖéB-ᙇ—­´tV$AH—!Y<p}5+Y ô:DJĈFÚ÷<'.#z1˄üĠŝêy˜ÇÁY=LÌb:…á¸ĵŻJE‹™P]ÓùéŞSÇvü)ókž·ğJµlŞeo…]YŬĈDĈU^ĉárıƒï‚×ê ĈZĥ+ÉÇÀS”vJ^#–üy{8ߏbÉñ.)Ż'!6O%ÄvÇŭ£ôbżüŻçœÇ ]ĜÒáĤ쐖Ŭĵá4’ĵ3íç ­V/5ìŠsh64ï'* ß°qiŻĤúĵ°Èûžm=TN%0 e˜…êġGĥ³ν’§ S–£Aƒ‚—N9ÛÜıŬÊWùş&R@cF ÔYÒĴ—˜#œŠŜéüRĤ&Ŭ€ÍC“L×Ó ĉëqżÓÎ:[Ñ@ûĦ’HPq: AJ޳ó™s֝”¸éÎ'•Œ‘^ġ1Żċ4"hÔÊïĴ^Ğĵ²ë·(U є„[òûxHx÷ÉÒÊ|š&GPĜÂ,=İҙ#M֑ú&Íáè°\F°˘ĥÛkÈœ)­R:“nĠċûÎ;²€›4dˆ(ݲ‡ĉ]z0H14ğ ĝp€ĵ½ĵ9żùŻ_Ż.~̚“ĊĴOQ÷ĜWò9ÎÈÇì&œd­^‘¨x˘ÎG8‚%µ3ò5œœ…ÀÂzs³œ 05ôoÌPzg·.IìĴf–ÍŠ‚ċîÌ3Ò!˜˙ˆ(ÔìIrĉSGžnV[³L^ Ï7ñ΀àIŬÊ%­A§ô“8Q#µĴ× Ž4šÂzéŝ°ßOFéÔĠ‹ŻJÂLFöì³òÄZĉá3t³ĊŒk5£™ÍĦĵŸ"ñhyÎMmş0لíחDîT&Îğ$p9N]CÊñçŬÀ,S’Eaş`…*T—î‚âA²ÚŬîG2 nïċwVÛMŻÉƒ'Ħ%ô ´f€NDÜáHˆQîï(ħñ£…9ĥE:nLJnyyŝ·żBôüşYPfğż;lF]€ŬÒX+%6F ?àş;žäÔÑ*ԅO#hA&ìĝpҕñŻ“ĠĠ†Ô3lA €UC!ÔÏÎÌW‹@."8¨b‹4ĈLƒYR˘Î{[Wì³ ĜDµJ6Í!½n_Vy°Yx'ŝ–Ež<-Ogl6RFĦĤY1mÑz˜zÒ˘ß?>ĞĠI /°/:ŭñ~%²Ê9ş9G[ğĥËû6êoë*8ŞúÁY"£$µŻîĵġ4ċg½WCLÇGumİ78·­Ĥ3§aà>ï öÎ9Ĵ˙r³¤9YèêşYċŞ3żğğz^L7Ğ֒ĥìîvÓ'I3/uilž‚TJöáİ‹3ÔùJ‡ĜvîEĞ7”Bْä8žÌWûĊáŝúòËO?Ÿ_~vîññŝîÛY)”µ5ħDŜİP/&¨M¨"/0?Ÿ"––SÉD½Ĵê@İÓè˘qRÁ€Ş•h>ŜĵTlâÓH҅°=IâĜċYÜXÂzYUyÒH­GĠ;8 ÀĠúioħ)YĥĦ‡—Ê˘”鉢׊Wè.¤£XìÒµ><S‰:zWÊo˘Ÿ÷1YÇzÒù"VmGïj ; Ĉ›C‹†’ÔʓİۏżbŞŞİ‹*UİUġC*ìL™Pĉĵ‚ˈ^D›*c‡&_Ñê²E™Ž,/²áÔÇçŭf!á0èuò²9Ú>ŬğiżÙÂ~Ä2r‚2ĵ(0Δ!·qUŻGCѝÈÔêpİ”Ùruuóé×O¸!{ŬŜŜ.ŻžÖìôIBIO§½ =”0(³fKŻöĈBċY÷uzómHŭI‘&€ÑŞ™[›-UkuwŜ&ÙL/~ÜŬë]ĈydÛäF0Gœ0օ§wĉî6îF¤;4ĵBÏ{2Ú9‰­^(u™‡:dɓݒĝŞ8“g•J]"MW‡ŭê°Ú-wğçĠXĉ'LPg}ÊĦŜVTP~ĉw.‘§`ͰhwóXÁ—46ÁäĴċŒlÊSn‰RŜGÑĊ—?Ş< ˘Ĝ[µT‘³ê {eÁ‰R§âhœbîiR °‡íí|ş8ÌşÍŞLÚÓëċß/´âp³Ë ĥœ*C¸z%ÑŜA’;n×Ġı0]:”Tµy¸żü Â÷ċíú¸:Dĵ?nŬAÏ<ï™Sm’ïÀĵ×,.ÁñĊŠúÀ7Żb]ĦrCÎû—¤lׯ\j%Z÷Ô5’7ZRTÔ$¸ÜQ`ûöĝDÔĠ—êİätHQŝFP‹œ9iÚipçàŭ}„NŠ–,ïXqÚRZ“^é} ĊĠŞ_BÎ3"’C·)u¤;Mûŭŝ°Úïç€~Íf›ùf&“ÓpĊ’kïŞ;l•ş'ċC猸Ġ_Ì;yxĤÎKġwï žvĈÙ9$э È{ñ^,ː“°önقL²N?9ÔOx¸‘ËÒk†TĥYvêż ä™Fu–÷¨hŝ¸žvĞ.$=Ól¸~ž`Ĉ鵨íbĞI}ß7oÙêöä›JÛ]@r+4ü½Ħ„XĞ9˙çŻÛŭjsĜ’‚³÷j2Yݟîa•4lĞĊNfօ öÌH ĦüŜ*ô”ï(‰O¨È4Q5žPìÚ}šĉ~tÒSÀşTĈÎkĝĤ"À c`°zĵ¨Ó 1wGGNĴ;{_‘W8½áÍ,#bYR2ûĴ‘)dŒêÈQó^éçBÉöt’vˆ‹Ċ\~lĈ3‰µĊf6ŸOgĊÂÄ â^½qG èJCB^l>^ŬoÛA]ġÌfÜÒ G¨G1ó9g°èĉ^Ôxu˘TJêòèC](ıĵàcí]Ŝd…ïTi„éš5Ž_8}ÔiOb mĜ¸OĉRRu§óAğ×í6 P1_§D¨°#úŜê¤ú YœTíNĞ7Uˆ ]ouuq?G³ż½[oÍXLä‘ÍVğa3Ŭ +¤)5µâW%!"çıžjUż8^ ùm'¨6èY’üYSS÷ĥ FTDlPqŒƒ•5â<£Ó÷Ô4B[žZiG$÷Í9΢³ r‡•&+ëI“Joĵ ¸4íc”î÷ٛ£Ó—*ÓÏ“Qż…J ½n˜òÔ5;mʄ´ Ĉ3Ç³Ù ÎĊ|ħ’0›HŒGę·›\,é‹M²˜ %Š%Ygrhäıbİ6ċS´%œT§^œĠ^1½QʔĜi•YÛÔÔ~Jlq‘ë‰\~Z8'\•ĈY)yyH¨˘lv%Ĉĉ#żIFJâ mJÙF„W£(,ÓŞ?˜ S~ÒÓĊIŜi§ƒĠ~.ïSż‚ ÓBŜ(ş*?öpÄï §ó9Ž™˜ËUQ›’Ĝ25pç›ê8ÏGÉĉ¸ĝf–ˆéš:ˆ“7Fhj”G Ĝpİumˆmżul/ü˜ úĈߟvL61ğzŝÁ˜ĈqĞ"aBExÌL‹ĝ̗4›ILgġöpġġfyÜ]_Ż·÷‹<ĥğïŝì°[ğŭf*1ç×£ÒÖ]İ’ĠŜlri=bó:N7›ı̕óİ„Ĝd:AB .É#Ħ:!¤$ÇÛ_wÑġJ'yJ,PĠްtGM&rn_ ħ–: ½˜4ŸĉHmÀhC_ĉĥżpŻĈhË(‰ŻÎ áRÙ!Y›—ì8/nY†Œ†3Œ" bz£„Úcàin‡^ùĤĵˆÒV6(èġCĤÒÍt2g|Ÿp”UĊŞáxĠŞĤ#"mÊżgú•jÄòŬω ,qD^À4EKÚ#üLËŻ'§nŭIš¤>¨ĦB‰ĵÀzŜoĵħ3uœäk\”%Ís+:™kzùĈ*iÊ·ç7Ÿ?úş\_{|˜mO’&E4äÛ.SÉnR+'³~ğJbĴ”(ĤDŝ–ú>vzXŽI?f\1ÄĉÓÑhĵžÏ¤)Bb•ÓĊVfŬ 렇σ WtÊcàžzqiĥ1g,Ħµï„&4Àócŝ’İL…ÂmÉr=€–ÍÌç”'_,ïbĠR„_ Ċĵ—gôĦ^”/Ħ‡J|ş’ßĈ†~­Òjäŭi§qÊá ‹žTJ찋žżĠî2Êó‡H2¤…jqàtÉo]cŒBíԒiu;aäĝa)gĞ/#–ċ˘¨ŻÄLĞLÓvî2’ž™È)Kĥħ¤ŝÌXeXĞc9{ĉ9mß´bC§ĥ›ÀÜINXÏŞŻI*,Ê!ĵ—Ÿ?ŝüċĉúîaÂj†ĈĠOÌ4ĠT2ĠQš>Ŝ0e›ĥ:$JˆÄXö µ¨š\tuaĜßôs5Ŭkċäq`ħD‘KˆvœÈ(§” ìÑâÁ™Sj §ÚÊß'Àħ‚Ó!Ù >Ħ•u•ıJ˘²³ê¨âùġiQNœÉë{1UIQßׇiˆAŽ•^Gtħ…Ğ =™uü6KjĦKcݏñ4/“Bç$wp”QBNSŞfàz&4h„Ñ,żü‹)Ù~È@ò~tfGX4inÒΕ'ÇÎŻ=ì7 xC [e–„Óns B@'ċ·P [~oò/›xkİ+@•Ŝ—üpPh9Ô9Ċ/ċ'i“ àtëŽç]ŻáÖĠs€TÂQ8“hügà’`Ìİ˳ŝô°ŝöë‡çÏÓ~' Ó,Ž{mµ½HĵR?ÓY_f:,È˙ŭĥÙ†8ùµûJqşeî$SSôÀZ`<ìv{2qu{Vbĝ#ë²EÈ´ŒQ˜šH7_Gm]ïù4 y5’(ÇVH}j8ĵÓeĞfħ“ßĵy÷Éoe1˜”Ä_8ä˜~€:‡ìŬ³U¸‰ÒP²†ò‰1ԟD\–ĈĴô­ˆ8üKÖjÊ Ò ,0À`âÂûDmĤUĠ^a”Ñ ÍÖ2uœ`Ġ)f„ ‘×ÁĜ`Ġ2Ě]/ITˆ#’MM$Â*&!ŒHVÄ遲ĝñyaġ­·óŜ#§ÓiR Ħ•Z“ëÔ#&Ħb&+á×½°=;Ĵ/?ıZ.çD@TS)ß!ĦŻÍı„F+’äÁùC2g™˘’d-…?ŒZJ7ĉ:—`³P•s9˜:à<è?jn‹wVĉ„’òRqĈ‹bsNUÓO†L™í³¸g¸4#/NÛşÈxġް˙ĥ:!éé¤öL’§PWúƒ(@˘0gg)ˆ'ofÒoġzDJ5˙œ–müPŬè “ê9œÏÈü;h.¨1…é_$şzXI(ÌarRı <útuäŬ|1èĥËRċöŞŒ8-0*ÎĊ- 6\7¨>BG ’\™[Ġ(€SöħÎQˆ~|µ€*”ĉ•Z\úêFéÄê<î%ub°SğI_ ’\ӂnmaÑż˙ôñoŸ=îXPc,OcŽRŒ‡şZ cžÒĊÁ1ßÔ&ŸK‘v„ˆ)ԗ4BÜĝ,çÍÔŻ¨áАûAï=×À˜ğRß Ŭ‚˘2·wİïäé?šÓWMJÀëÊ<êjÚnžÎŜzÎbĝĝÌ5+ĠExŜ²Ynšê›Ë‡21]qmf’Ò\ˆaJí§Ş7êħˆŝWíï´p:pŬ“' 2°ß89Äq–g'‹KŬ—™<÷Ò!qQ]2ôè–Äßˉ§ë5”÷˘0ûA^ĊPÓñJ†‰*ÇĥO%{ĴsCw Lċ€IÓÖÔċóĤ%ú@Ŭ^şÒ77\ĝsÈÓ[óÊŝċŻ?~½_͇Í4ɛ kg\£”…_Ğż­Ċ./½Gj'>éŻ³‰‘ëP%çû%rKb5ĵy&£„Zr£?+@|7ÍA„XĉɒĠíĝNle²Ĝ{Ѝ#?.š2¤šhG­R/~’ĜÑE°œÊĦ‰%Љˆ`鄞³Ş@™R‘œè"Ya’™úĥÇŞÄfT…ÔĈè¸ıû³cóï+ùC%eĝ¤żV ûTُċéK¤êĵĐĤN7RÌıÔPˆ£ÌĜJ',%!O3À4 šÖÔBыRfuàİŜg4ŝûh"ĈdEoĈUZa{.Ż›#÷ œä‚Ġä͏ÌôAóV=ÂŬ 3 z\Òv‹½™²O8]Jœ×›óûżŭĝ×Ğ)ĵZò"ZlžK —ĴÚżè”fxÌ2'Ô0Äè™$žB\ÄZސÑ7*“Ö#ż6˜Ä˜ŻĥBH)£sŒóDˈ¤£CL.1,!ħü’Ú2Ĝ‡=ܕYpüÀ‚³š4ß9 1¨:i¨ ı³eŜĜUääo…ıˆ(ÎÂd›ÇĞg™6YŠĦ‰ ĜoS4ÎİÑGĦëVNğsPO³4ħ†˜ŭLDĊE ʊJ™x(ŽgÀYĈ‡žàħ¸ïË\>ÙÌ÷ó džzЏÙĊê° U56ÍlB>žfÓ6ÇWo/tüh§ĉ.êÓŻĜ,"§CH4 ˘žA\ĠRœ !%$+(AEWì…+< Ŝ”‹ËğŸUħŽá~˘ß˜16XQ“<ĵ8à+Ĵ™•‰SĈ\—WÚĈ'S“PÙâeR{GÉŜ\S+û² ÀPôĦÌ fwĈ¨NԝÚ[€b ;{$´|qżÂÎQĦÀêèĊEú=’mu;e1µ!Qӄz´cŒ’'.O!Ĥwm8£ŒJ(BİmŞé-(ıK×ëFéĦôLX`£›Ĝ§| rJ{Âİ*ڃ™”@lJ %"ıÑ,ZAèz6™nÇçŭdj²•Qi€ä>œÌÓÙj7Ä"ŝóĜĂÉ;QÒwÄcwż(ğ*,P×û0•ì+i$x{ĤFÇ\£™ „‚·ĠĊË&üŻPQ­ì=~üeÛñxƒRŝV;q çSùn=QXċĵ9=ŝˆÏWš)ŞSê¸N jieòɎİ-1I1‘`%ğ'§^+ŝÌV hTËDWMR…bä‘Ëzéj3 ÍB•AĠ`-ÍwHb#nĈG0ƒ×Ċ“µ‰Š‡Ure˜ĵd1u=µ–‹!†„\Öħr~ĝ´í„A’ċ(ĴĠÈ(^˜Ĥħ&GŒĜ` ŠÇÊWî*y8§e/xgusĵŻc>”vœOÚ2Ç&ıu'ÈÛzÏQLóLÀ.Żî—‚Ü…“7<­óö0ŬL†½*Ĥ¤ÔÍWCìa6r°ONĞ–[³@D3ĦjTêô­Pşí…öZèVJNJ£Ġ ÉĜ’ѵÉ(*}*Ħ=¤iŸ+ KĤı}ġ˘=„ëÓä0l#ÚÌÔ1”gŬ3!H™Î,˜ġòñ¨ŭ^§79ÓÙ~'16ëwşê#,­@§ˆTŞJĊBë³L]9‚583…yĥ”·_Ñĥ I[àŸHĵç(á$3™e˜óİg\6ëoHVӞ•ğ„l½ávkC ôÊÎFnB+v˜/3Š$Ä.Ş'xQo-½¸Ğ=[j†/z÷3}\ûRJŒÓŻĥ0XVLgpÎD1¤kènÏwëŭ`4ì7ı2÷£Ĝ^_½"wW—pĊS˜ñ,ĈżÎ —İš–:~œÜJ•Eš˜V­Ġm}6Š—Íaí/žĊsv )Ò˘ôԎĜDÖkĉ~ÈFAw9yOC[ıR£€–`™l Żx˘x5zƒÉQ´ùñ0Ÿñn•ô—¤]>4UsŸ|ž“&˜‚!|ê+bB·ġjF„’WL Ï·=i°ÚñI"…Yñĉ Áûëċ·ċ$üO ¤fÙáÊ1++ïƒ*öyğ3^<<o'½!xħĦé`˜NòĞ!Ĥ÷´žş/µœ.Ï­tĞ‘ÏCĉìÂĊԍ3}Ħ‡èÁ²tŠıñŸ”ùRw-'‰ÔÌô§`šh×İL`Ìù1B ÍNhĴvò1W]¨Ëʨ[ħJŠċ†–*Í:ƒ>n$ò{şÂĈkéβY,6Ġq·š’§‚”Í5·Óà{Iħ§™$°ŠûŠÔŝÇÄğX£K–Ç+°’gëĉÛ°i ĥğĝÀħ~­ĊĞŸż·5ÚžĠ|=3…'Ùĵ86 f´ċ’™˘àü^k͐bİdZŬ6ÎĤ’SçËĦĴQž xÊ;ÑÂıï#¤§Äœŭ´#‡zy‘ÉĥŬ­i• ž?gGñ×CĴ ”­ĥû=Ñš•µ^9Vü½>}›™ÉÔÑ·”ì=•G5û\†˜n.’Ò¨[TK$+’+Ĵ°eÚ^C‘ÏzÏôÏĤq­l•Öĵ&ÖóÏ;—Ñ`Éd `ê–A3M§òêà‚‡Ç§^ÈzŽgDħìQ&‘Äzàß÷z]ˤf¨@\’*E굨ŬUd ˘ H ñcĤĈD*ݸ^݃î3.óħ,gHħ@‰İ‡IĥŝÍÀ{ó.JÔ Ú·…lànöôá¸Hˆ¤:µ'§~ž]ŬH‡ú/&jñĤä!ÛkëèéĊE[g5)Ñ)ÁlgO¸™JYŝí6A*†`ƒ 8˜ĵٗyüîa1î(piĴñĥĈċĈëvü4ċì°?Ÿ÷[•“âdÓÜnħݰÀàßܘKµ(„*ŸW:£]. Sŭ95!ħ$Ż*ğà<8‹İ0DŞċ]Ĥ&˙JȆTRżàƒÈġ¨'%'3y£Z>ÜÎâŠĜ€K!‰ŭžÖÏv_Ò€Q¸ġêéÊùf3_ĴöPÁ8Lċğ’ŬşñxĞ­ċE Iĝö<§Žâóì–`A˜)ĥ€üÂF¤Xëzíͧ>ßs:ôÚħ-Ñ$p˜T<ż÷íǵko)  …5¤{ëĥ8¨ÁE ĝ×2>œ` ‚S=A˗û/Eħ/:Ä@Uê@LœlÛ¤à™Ċü°8­O&܅ž9QÀDuĠŻ•’é|´Ĝ­÷“a§3÷°=Óf }ñz/­²`%†;½AŸ2)eÑjje§àсé IDATRv“FÓâR˜ĝ ™0Û4Iú>òšQ]ĦĥÛR2ıâŜêoBêôżk¤uáŸjÉA’‚˘f­-PĈcŽ˘ċj ŝ@_†@D^›aëŬAr3_mfĦ‘fĞéfì¤Cöŭ°?ÙlĤ³QŸĤOöĉŸV1h„àF/ 6m¸½żÊ Žd\bĤ5ĝ£öö­ı—Ç$í_,ä§.xWĝ¸ˆÏBmɁáĦ."LCßNŽJÇRòñLŬǂ— UgoŝR×ĠêĥA\pKpĞÎ •KW„ıûž‰Ÿ'5àÈÏ'‹o¤Î•]İmrÒà #Üû›çdĜmĥğ:c0°zäÖ 7‡ŭa֗'‹ ]MŒ mĦJŒşê§J™Ş“‘†Xiáeŭjİôp­otá;ñHI~n Ëá™WTHöbÙòÚZ: ¤´Fԟq›—˜{P CˆİÑrNp++>TĈ*x‡Íp@ïáÉJQÇ#Ô˘Ž›aż?‡QĴ4g‹Y†*ö ĥSNŬGċ¨£şwĥşC’àİ‹ġuÍ4Ír+€Ĉp¤hÂĦ@è™Í 'ım½œ^^ö˙òÀĠ8‹=?ş"׉S=›ìT Ô2y&ñĴ^ĥŽöĤâ9ü¤|!=™ŜbIÚÄú;…’¨z,BĴIyNRİvğ×*ŠS\Ş7@V½ŭ´ßn¸UÊHĤ—JŜÀ²5x5ÄúñĠ·ċOH'‹b £E–›sˆŜ+OĜĊ£š˘ˆ¸~Qğ#t­îı”§ĜîòNŠe$:”ĜŻÀАŜj:ŞĉM½l&Ùì,Šš} Év|ƒ]p $zĉ‡Ŭvğ–Ù~]ÊïŽôĵ9ŜŜÍ'€~R6Óa§ĠîvAħž$Wĥ›ĥ“¸F·ĴıäJËÜÙÈT¤OÜ]?lĥ|ŠàkÓ9,˘ċ3§’HΝŬ zƒVî훚÷êNÍ·ê†8žŜS‰Ÿ“ž_ÛPivÓ â¸VjäwÖdÒNB—~ ²–X#ĉ•€Ş‹<•ı}ŽŞ"İK6à_á>Ż.13½”+Ĉûŭ 4ÂC“P’üĴ7zµPö‡ûĞó›Ë‡~Ġ6N:6sŬĠWf"鎒şbà”[ "ż0ÒM…BÌB*NTVÚj9ËGİÂéimŽRE¤PDoŭB7ŞĉЈ'8AĜ–w)ÍĝÔ-aNxm–Íîĵçŭ~uxżğğ[?ĉvg8£xĵüúá°[? IÊĉ+ĜéĴ/#PÛ¤=qŒ*Ĝn:4OB9EŭÔÉÍÖNÚCÁ·Ĉ><d’‡(2LĊ‹ġ$ŻŜ¤GÊżRžğ5ŝ`D”r§ ÚÓeŬlUÙß5N`™·Hx ‹Ù˙A½Ne …™ñMĴ’>‚ hhNŬ×Ò!á™Ċ(hëfÎ.% żP\ê)Ĉ¤Pfyúĵ€K[:;ϓż.]zŭOĞ=œ ĉé.o.·‹~SCLfŠŠšOe\(Ĵ5·³·<3ea]XaÖVċVĝ'oI~Zİ޳kHÈŝ.³‚ ßڅIóËĕ˙ĉm¤“'’ŝFĦ zf†á{RúÉëÀv§)ƒ´˘ƒÉ긅öŝvyğ^oV“ÁpìeaĠİRÓIĊò˘˘ĥON˜~,ÍcÑLÏWçż~ZĞéá^gÁp6èJ72;,oż³Ŭçy²’ç¸iŠÔâÌ]êŞZUqbÖşBâĝ‘Xĉ`ŽĉĴATŽIĝ”jSf#Â5ñŜyv(ħ$§aH"ùi´‘„FC€z ,6Ğŭîžvqq}żŸï7c °‰›É Ż)Ö”bÁîÉûÓŻ [ÖÊd í‚2熽fŜ#ì–çÀÓ5dŜŬîdÏğYÒ\+ Ħ%ÒGfï/µ8ĜÛCúxĞd¸ĵï×kX³QÚ²$܊cĈS`ÙÉéÒPŬW )1tšä2À]ž‚5ktrUBoK%˙şëñ¸éP¸O{”EÉËÍña7—ħHŜœŸdBÙ; ×…aCž–îáêóç/żŭvót÷°›Mž~ŭu9u‡Ç•`ş|ÒâŞ&qMƒò¨µ7„„aÍ<ŭsˆİ?UĉrË^fQSş+Œí‚tĜQA ‹'uŠsêäZN­Ÿ:­ëëàòQFqâRŸ>ó”´S ­1Aœ–8ZíÏw·×—7W·Ï’Â¨ŠŽ ŝP‹ĴÖ1D  ¸…¨j¤(„ 8OgmkÇc™z†TCëT!·C{9a 5‰NaY'ÄÌk$1ÁpĥŠ~ĵİħ’@8}z~>Ĝ^*œ ¤g?S½³ÀiŜ‡Ş½ĥœ:mİY„Ş›r Ğo.@cGúŞ%àé:ރÔ­8\¸=²Ġ|)~óçM˜JkİġœßÈgÏ÷‡É†’œcÒ\srçä½éĉ‘tıŭ•Šœn‡QÜj7³îáóO_–·÷‡Ŭ<—···Żk½˘¨3‘µ²ŬT#¤Ìúß̄*NÔ\ÚèĥHä?iĉğq‘”ħi'sKf Ĝ’Ú(ĉG“ş5Mò'}ĊÓÒPGÓÛKúĴz^ÀDĠ§¤}‚MêjħßïŸn\Ün݉†U<˙°›µ¤" âKÑ$ŬY‰1ä;,eŜNGádµÀ*şi}§|ġP%ìc)­Í„Ú4á #—À=ùö‚³¤™H~ñŜÖI[²]ğd·ŝŭġqÜ+gÔW <=^ŜŸožÊF¨l,ÀòúŽĝ'U€Ï[;d‚(‰ê§ĝâ› ¤¨ĵ‰Ó ŝJġIóÎp5ÀN!.ġŽç8I:³íŭV&íÉ@Zw“À‰›’é'Ŭ˘YŭÓ盋ċ3˙rV˙ğwhĴZ‡§Ğó?üş„g1lnï^-”lh·-ĚŜWwÀÜQW4OByÎûe;G-ÄLŽĤ4QowȔ‘1ĊûċTcFY4&K“S?RbEC½ŸbgÂR˘V•1:ĞVŜŸMç“ùa÷ĵĵùtñĝĵ{~€yÒ~†+‚¨ßNZàĤö8aÈEà O²( Œ²aWz´Éfġĵçöv%áĜĊµNû}Ĵuí\u:yÒbS„PBw¨×ùT)G>’  hrT£ìç`8ž½İĞm½A´ƒ0MÔç ‰ŸÑD·Ŝé$`‹1cŭ*˜ċ´^[wÇM=µĞL:Ŝܰ$€‡ż–jˆHħU­ß3È޽¸î–ËËËçŭĴ ­py{s ” ›-˙öóŻçËĊ~tD§• şÒŽ·˙ŭÇŻğġŬòò ú”ŻĥûĽü Ş#·Ĥ(œO~Íä(–êş%1RJ³ğ>ı9}ô’.ÈĜP”QlÎ"ô‚CjiÌ aiŝI@*Q#NU@ġ?`ÍX˜?š˘ŽH³\G÷gÒÍŻwWŸ~[ö€:웁´–ÔğîBVeÜïVŭi·Ó2p†GĠ óñf%S(Ş—O0!’zHÒ,£­bO#C*/g?ĊĊJLI5|G%.4ċQ”÷•´SÁRĝˆSVÂĴ$<ÀKC ħ R"°çS§ŜPߜ†“È8‹~­ k ½,èš:7•ŜŝdÈ>€Ìŝv·-Qù”Éf&.Ŭ(ĝòlġ‡ĞŬġ HĞQOF7µš ÙŒ7·_ŭùËÍ ^žßġa3l”ĠKšCĵżğż˙Ëû›ċġÓÒĜĞ!ÖU€^&"ÔAË`êáŜT /ÚĠxq–ÜtÍC6M›&ˆ˙âŝÔĊǝJ­´IQ•ĦĦ€NÈŜÂ%Ż’ġ‰m¤g·ÒuyqS0ô䏉ĦĥƒZ8Yĥ·—_—Ûŭj/UruÀò*àMÑïB@ŝdŠÔ”9µ’’ !}Çhġĵ}|XĴ‹Í~7ĉ_`ȤLĉòèVDż—\—§´ ]gH S‹'òH|”’÷îÍYMuÓCÀw{…É&Bž³ñĥ†_.2Ì(ò÷‚şê—…'‰ ùͳşŸ^ì×Ê ’ĵUo(hȍ¤ÍŝY°tR“ùtĤL2ÄGŭÉᰀŜfÔWHDàHŝĵoÛ+¸Än7]ùYÍŞ˘}\~ûüË_öŠĴ? ĉëŬj2À BÊVs ]ŝq˙üñ÷z˙ù ŭ{YL1ûm 1§—˜&´r¨Ô€B›³ÚEĠ 5è:pşçpöV8_YêĴlĉl}äÔ臈AċCh„YòzéĈ G`h7]%´4°ñƒ’D·.‘íù.Il'“a¤bhĞ ú‹j3Ĵ ·Ġƒè#{€{Ĥ´%ëv+ô‡’mŒħñŠc{˜ŠÏ7óH™‚ŻjvG.׳ògV{àœXuÇnöFcy›k³é s:ŸÏ'òôw›ĦßIG˘'°Ìç³nħ .èCžİˆÊဠÖ#Š'—Hw‘3OEJĞ^ž(#ѳŭIˆDI;cBiÇÔB0EéĈ FoŽşÂ÷£úY@­ĠÀE‚úIÈ ¤9áĞ2ŸMQÊŭĴӑšJk9?÷s¸0]Òï7Óétŝ°˜úÓġüXŜ=KžšŒúyïêż~½I×֑´;½ŬİÀİGġöB óäËîÖğŝġ÷OKĜĵ´èħ S^Š*•|2Ġ›Ş2+z4úía·Ċ ¸™W™OSdj\Ş:n.Zĉkx^)›ÍVX7.³SHvƒ™Ş‚y;pż.ĝ‘ ß6"­­9>ëÑqı"Bmrİ^EÒE‡Ħ*Ût/jŸœ4)äa¨îâ0‰2‰ŭRĠÍg­²€ 5Š­ĉTşì4ò(üy”Óád²Ù/†*fE(††ı…Ğš…Ú!) –Jâ>ًyw˜'%]6 Ûc–\ž [B`A½NSèµò.ñG•Ÿ‰5ÖĴ~]Rdŭ €CjzFmÖMd!ŬÖ7_îĥòÄmşC¸Wĉ#ĝ;È//ĤPFGŻ5#¸iħ fëoOO—OpĊĜôdzûż½˙ŭç];ÊÊĴ-SC;Kğ–†! Îbe´>Ĝ]__úŭ_ß˙ñġbyğ||½kŸ|ÀUŝı”DÉ*³S^{Öġİ)ډ>ĉ]gTgb~ËÄİà:¨$É:yDŝu &!ŜĠÒIİëñL—c‘[+`ïì èw\ %†Ċúâóz ‡¨ÒqJ²²³XLúRÔ[ŭĠa5&0_ıOmҐĦ{!ÔMÓXÛ{£Í@²Zˆë—ŭñ²nòĉòŝ"6ÑıtĦÊ x0ÙìΤ##˜+r\IşPN÷ï°bW‰”ş§ÏĊtßo•YÁ³é&ĉŬh¸ı3RLv­qR\@9ğS“äàĴîèj /tñԑ¤€£sùâ°½>à8+Áöĵ'F†fİ‹s˜%ÄImÛµdşù°?żşĤġ£üñġÇ÷?|šÇµ„š†ŭ!ESszÄGußX­òôÍĉÛë§ëċO˙ú/..Ż·ß1Ġ§kħZĉäġgÊfS•›”׺ 8"ĊĠÀRÖİN¨£ŻĦOɀĠĊPÖnëĞċġŞ…Rĉñ‘M·›QĤ“íĦ<˜Βѕ{ÔÂÎ4IĠ‹,ÄÊŞ3˘ï™O›àvSŝ S–*Ġ|ħËíLJ‡‡ŬBçħf­ĞKċ‰3ĝtŒdğgꈴq{÷鲋ĈÑלd}BS—(!ù’*—lÒԒĤvÈtTġIòˆÑ…[³¨Ĵ¤„'T÷jÔäW˘¸Ġ‡cüawŞäîîùĵ–ğ-úÓéx´Añööaڍg“Ñl˙°]ß=ÌGŭŭí~H=˙ñáÓ/żŬ["Öİ[Ú0yeĝCLx5UşkcÉ(cÂġċíöüŝ×ûóËoW·Żß(bYË‘ífİÀ}UV+Ħ³9(ŻŞCèÏuqÎUzż|ĵߏZqeÚuı*QíŭNfî\ŠââÈ4@HHĤ‡˜i*½ÈïÂÎ@݆q­*<óùĊ £Ĝéw˜·‹”``.s@‹€{´ 8nêM`Ö§gÂר”qùÖ)(£ĦÊkâŜT Ïü4udÎ |s‡–Ĝ0ĉ;'Qĝ'(íòĴ‘ ÈT÷ŭ^PİëxMzêaŠÄϗM¨ìY:ĥwۇÇëĞÛğğ{iäçÈÂÏëûĞËġaƒy{HÓr}\ŒÏËkħOŜż˙ps赚RawŞ x ‡= (Ĉjàl>gëċÓĠíċû˙ï_ŝúġêúû!֒ä×VFpӔROr ħԁÀĜÁ—ıP‡ĴòeĈ¸Ë\ĈáS™^SĞ×ü$Rš¸I#Á˜ #AEwZ2 #—šöEÑì?Ÿ=ΆšċÜáp ”C]tsífƒ^ċ„öÔğUċ^€\‰j{)yİ£Â1o*)U‡Š„²ħ)éĝ&%ĝşÜ1ĥfKùáe9S2 O͘Gu]ËċdR%D\ħŬ„BċMw×ġ>-Ĝ[ĉ`²8ìžá뵚Œ&“Ñh2uBİʒ5A>˘jÍĵż8œ˙ôËí}×G?Bċ'fbbœÍÌl´ôƒ6½Ó,X“Tì’WòbÊL ²„vŽžê ŞğQÖŜH+Ĵÿ́hv£}YqTGĊîeíÁ¤5[œŞìbDÖL'“Qş)£i/NuۂcEUžÜI.¨;[IG™¤\R°É(†f’ħÚÖÒet³#=Îq{ż\ŜoöòäOħ™of„ft›ĵÔ˘s4§šf&×Ħj¸?|z˙ŝ·LŜ0e(ĠhÀĦ3˘óËġÔħË·àsŽ}ÊoĵĠ]†"Ó2Šä•'A—Q:}èsĉywq/9ìòĉë7Ĵۗ·ÈgòżËëċġĊo\\Â×z{ĜïoıÓXl‹ŬŬòéé·żJvı~Tx8è63ÇH‘òP]>琲Ĵ?=<<<^]\\/Ï˙Ç˙ŭŝĉòâé;‚*Ϩ>™ÊšT`€@šù Â5½ûòÂP•*ùŽWġ’Ċ‚x¸Ún‘İTĞ*v°œ |} í˘ĞìE 0%eŽ)°èċÒS.R¨„˜Ŝ“TŞ Ŭċ½¤b#…rzšZŽ´ŻSu”.‘RıËĴYPCŞÙÎ ŬÚ°Ë˙RŒ´7ÜìÖwh q„™’ °_ Ö`ñˆNŝq…Ğ’v„ÙO>ó2éVw%ÄևA;cEŽ/à<Œò°F‚/}ÁĦÛo‘w"w°´´Ö3T/——;)ʁO:d*V°“”$Ħtû(}BM~áòĉo>üġç/_%ÂöÇçç‡4ğ# Wódğß~|˙—ÇĠŬĠòÏJyßÌï=D9öòäVĤ…dô,FċëHĵ9żYŸ˙Óû÷÷çOŻJí>ÔëiĞ Ê›ò” Xš WӌôQö#—cš Ç*żilĝäl eÂVĝôÙï`‰5 }E^: ÁWéŞû3™ÇÖR$WsxíMAÔ|€ÈÏñáĝ°R EšA5ÜQÍ7/ÊÇÓNo4?žKúzıë·%}·m}÷îÌoq }W×ĊmZ „8Ebtú‘Şô×êĠ¤1Œ›½nĞôcġŒlaĴM@Ôèï—wdG°ċ”^\RĜòîĉ~{úñ_˙á)˜’ŜĥÛçtñx+/gµ_6ğK)’[ï$IKb5U×KÙHQ8ÒäÁÉğƒ’9dß=Żï——_~ıxúù˙ŭ/ħó›˙“BÙ]‘î IDAT<œsnĤ)vݍ8KüYeY+WÑ °‘R•Ĵa‘4 ĥôĈÛô ޏgdBr)N§ ´0 “Ş5:_oÄe˜ôà6kƒÚŞœ|£Ġ@UP>v˜ û½fĞ7˜ô›Êˆƒ†3ş˘Ŭ( –Á·„ ²â‰q ÌalóP'ëġ~ƒ&€Ú{ ŬóGdħîĦxŻÒaġ éL§£ŝĉx÷ġÇ÷ż\ßï‡ı§9k ^}H8·ïëß9 fÊ£²|ĜŝœA:…ŸÁûZñ*pꤒmr’ĤŻëç{î'¤ğúí§ŝz3żü‡˙ġŝ† n)ż}Ĝ?ßŬ=ÌpŸÍ.|˙§íÌ˜‡ĠĵŸ9Ê*U7û“~Gíb¨Ż+ŭmnû‡çíöîêéÛùĊ×˙íżüóïŸ.Ï/b|ĉ[­ĤSŜçR LHhò#ÇĦpÄyċûœ\ñ9CF¨*ŠZ< ¸RÍ;mÂÈÁVè|Í~‹p˜pİ@5í‹X\\J.éäÔj!#˘UDŒÀ“:yhͰO'ç“tSÈ@A­·0Ê7×ÄBŒĉ U`=Q§_Lu•>,PĞÓ­ëċv?†‹ôĝóâ ó%ÌngĵY ı…#6ï$‰§-Ĵ''‡íċ_ĝÛí|6hÒÌĊSrQ#2 <§Äƒ=5”/bîġ‘ıE·€ Ŝ |bşiğШ Œ žĉ¤hGĝe|^½Ñb{nßnw\ƒ'óx}µ}’Añ×ġöŭż˙ï÷Wח0‡½½{~ĜŜ-ofcİv‡Û_ĝĝtÄ2’ĥZ€şëö{@——B“Pğ?’›ïîïeD•ùôúüŭüçüŭËĊÍwCÌ*áÌÍ>A.ÄrCV#?PŜ˜:œÔÖ+¸ŞXQƒH™1³yF4zÉbH À}ÎċŒĵĜ-ËÊ´òßÙxRt_ e˘’ĥʖaı,}Ó?"9<ßŬüüáfŭ,‘y ½e+e“UI!ϧÓMÌè9™Î™–×2H,—çï˙Ÿ˙û˙ġĉğ!†C\[üLìú"HĤ+’òŞG˜L.fĈ[Už” Ş Tj{Y`ĜJÌ-@ô&HSéLfŒĵĥÈrÂŝYMИ_ĥ”uFßÒö¤ßÒhÏíp@ĵĊ…3œ9Fŭ&z=²:eURU‡?êš×-˙ çšş^˘˜³1d£ ƒ'­>ٝÔÉÙlx-SÜİr…mR·Ħ§ßPçO–H%´vğO\Ŭ”Š @—ǘôL˘Ë$ÄşCĜH&›ù†4J:NŻèĝ×é a‹“Žê¸]"Änż}ĝñŻ_$Ĵ>ü˙ożßĴ%$°ÌX.ï–W×ËíjħÚŭñǧ´‹1=tÄÁ­u¨ÒÎĦµ"fj…1g‹ÈċċĊ×ÛÏ˙ß˙Ż–û?YZ¸"I ik…ĊDùĦĠm\ġ)^Çìօ Ĉ4˙³µÖÏ24"Ħœy9V‹*·M)–Ë’B°ĉv˜ ¸@u*·é§{)­ß颠xh ò‘a¨+Ċ²L‰ƒÒŽ&œ£Šad˘\&Ö6L;Ž"-RğòĴ5ûáh<‚VT·;\=Pgñ‡#|ÑfAO…à™¤ĝĈŠé•o?Züéb1î£arŠ]]iĈ֏f52ƒr˜”ŸPa;al|ÓûäÎ5)~3>~ĝñoğ8N÷Ċ >8\Ĵ%zî$ĈîïîîħĜ\~ŭí/œ?]~úŭŸ˙óü¸\J°qO&Ӏ”Ëġa³üċ§wĞŠ~ğnŸYŸmA’ü˙Œ½OK#ëö6ü%Ŝá3x'›‡ ‡Ĉ™´ŠGDDÁ‘àŸ™¨ f !ˆI$H éT*ݲ’ŞTŞL9(şhhn4´ƒŬ`ƒt‡w]kŬq˙xé~9{÷n5VŞÖ½ŝ^ëşToG˘ï }“xä*é̓vs>}z·ú[èĈŸš;˘lÊ] 11E:ŸRİ3ŻÖí§#]§²#ĊÛh3œ?)Ö!HO1Ÿ€bì^x•K:7?c {#7´C߈rHjam\BëŠĥ„+oוÁÚ²œ!OKA I5% ›Áˆ’…Aŭ%ôc)ÊîoŠè²Ĵ¸¤Ûϙç™y ^f^ŻñĴ0+AĞy˘Ġë€ĵFeÔVŞ`˙Á^ˆ 8˜UÛµ‹)JHíìÊùq•âÛĈÚd5”ÛÒÓÓMÏĵêğ¨­$fL‰Ž°5"wÚÌÌZQŭÜ@ëv/lÀC6—y*˜*Ż ƒĥ67[MÇİ•ŻŻ{dUuʖŜ=œ ´É  Âp>Ş!óZÁĊ£Jk˜ÍE9Ĵ£ĵ´É”™;˛i,y‰š?ĵ•Ş|bÇ6 +1oz>nŜjÏ[[_îëê‹íL×ñ”ĥE>AQ£¤'Ġœl'ÖÍÖñĈÚ,ċ3Â^&d‰k<ˆgáĴÉ5M[@Ĥç_Ù;ŝĉQ0Ĥó³ç ÷2ûÒŝâp¸ .DÍG™È,ÓóLâM§zŸÑjS`MT3'ÖPœ;¨VŠR·ĠşLYž”J3˙M‰úżma‘ċà Ê £ŻlBŒ„, (Pĉ,Ë[£QĞĠï35Ĉ&ËµĊ É%@ııĥF9úAvat(ÇYXf3\—;Ÿżŝ Ĉq%Şĉ“Ĵ XNÁ˘Z07‡í5µnĤŜ4£Ü1äiw™5•. Ğ˘éÈ -yĜ荙‘ŬğÌ_7aÒÓ~l}¸/èú`l„a˜D*Œú½S-oü¨?ÌRÒXIïì§yñ(M§3˘QzWôˆgÄ pqğfS7Âq‹•V;˙ñniëY+öïH›20˘²H6Ôˆ{]öÑnĊşJúÒŭ8Şn¤ ÉĊɊfË,c1 ž×ĦċĴl,‘ÎUfjŝ/60ÔâóL\ÉRôŸL,ÀH–iiÍÌ0a\j瀵ÉYÍt|]„Ö†À¸ÉóÌÉàħ‰şŝŻ9‹Î-Ğ­ô5¨PB­†‡Â/#•ÂìüDx‰}%Ô)pĴŻs“~p^ħ‰K"ş²­”$Żìì– hl.Ë4Ĝ‡"maB²9 u.ُZ^ĜtóWômÇĠ*ŬĥuŒ³P½’¸™U¨Ş=½°ħ8-LÁ3J§İíƒj™™ûŒ=²ôĤîö;‘ëW7Ġ(ÜuŽM›­+4uÛ¸<ğ¨×z4Ö~œ,íŭÔzôu´d •Ŝ¤ƒş;Ş]Ŝ„£VµĜVÓé"S3 iÑ˙˘¸?b¨îpež²³¸ĥ{˜2dŒİèm½v·µzôtIż×üƒ@ÍÓ ĵöÄd #T+  #Ç4œ‹‚•>ĜşB\³8X–'4ñBZ:İ£f'[K½ùK`ĵUÏQ QiaAĝ^İ•f—™µpg_2ÜÇĤêÙsŻk<PgNôËSÜFÁä6…r޽é‡ÓΊ°-LĜ¸ŭ4?³ÎÊĴ<‰%ß5˙F–6[²¸ÍꖒŞònÌÁŝÁ<: ¨~ÏlK‹‡‡.°1,XÎÊф‡MÍŻr”ε¨&=\gŭ*fBÙġ~Ï\ÂӘ0ŭ²JîôÌŭ{žò@Áìën·nèµRİaşTjħ`Uœ5%…€,Ï@™…q}zzĠk´cCûñnkġ›Ö A]¸~ë2âّŽú­,`\ Ġ\‚Ĵ¨ŸwyIâSêw¸Â B˘‡}2eƒóF[ôÎĊ£ıı÷ŬÏ3Ìß Ô’kĈ˙/ÛÙÄŜŝaħ sL/µ²&}ĵİè5y£à<3ÓÜâíJ&ĈUì °·™7“D4™üŠ‹äuE'Ċs’KŬÙAhʂx:]e"ôí‡Ĝ€ZGċ÷Â0/ĈêĤ’cßĈkI0ÍĤŞe7¤0h“E27*DߌÙ(Yµġ6$Q).Ĝĥ™ĤŸ)YÏò K™1Rí5ĠÑa=uK­­("úÂvżÙŒ³QàúŭZ+ÛYÑvH5†“ogRBŠġJ~É~ú/ĝ°t+ŽÍL7S3›…LĉÖ4ì$ސïÊ7w³À‹G ĞĦ×bšµ³³úÍÀŠí×Ŝ%buǂ…™Ħù•ŭċÍŭÈíƒdyHĤ•Îfħ-2Ĵ[ŭ‘ïy‰ÑÓMVÖ˘GMëŝaXÎ9Ĥt?hùÖ¸6h7šŞU§ĉ~i5Ûú½ۜè¸íÊB°³)Öoe+kŻî ĥ¸äàîùDbk]‘ցîe]1Z(’%LJŠéL ə:UíÀ­/ÒMMçŽw·QħÉfoۍ,ea˜3OOB×AÊÇr)Ĝ _„€~ÖmX@Éë^'½Ìüi r†¸óĈç‘aò7ó)ıµ ĤıÒR2ôá(ˆ›švÙ4Úyí´a2<ÎUFıôîöqµÂñmŻm’ĉŻzş3żĥĥĉŜ?œ6Ǎħc°°Qš‚wT3(Ê˘ß’:Š‘b$#³V8;/´-'èWÁ0Ïx'İäÄÓ`uHĵpÜhôjíöÙËêÖÜÖEÍß{1U12†sEŽèDŻ+ĜŸä?X/Kç²*÷ĜŽóui4-ˆ‚"/"ŭßW!Ġf}„u.ç”|Ëô›˙ŝÍJš`ı‚/^S"—˜R-° Ò cTnA06ĞÚeabEt³ıŬŝ4´ŒħÒ½³y —/ôœ’³íì,²$Ċ Ğ:­IRnŜĊTj":µ¸ĥ0 ;ÉaÎ8+óóŭôôÌVÀ³]sl˙Òñڝ  @¸Ğ '{^ġ›€àŽ€¨=ı­Q~†N?½ħ0ŭ/ûŞ´{À4Mċ%¤ùPş,¤6w7”T´ÌpJQï4Ópĵüf¨ƒlşˆÏ4„?%!;íöĜ¨êċZ;ñzŬç½Ġ½÷g×ċhu; ’áîübU7Ğˋûà$H“ĦĥŠÇĝ€­È£<ïBÓ2ZĉÚK˘".†Ù½í-ì GdÌĥ54z ½Ŝ½›[]ŭÖ­ë½Ĥŝ'Ûá5ˆÍWċo¤FèH3`MPiÜ:ĜL­+zPA#ÌÌ,ü [żÌÏ˙ğÚĤĉoo–÷ĦRü·ĴŭLŒéGyÉlĦFİ“olĴ­“×ìD>½FEŠ”ĠˆjhdaœYF5sÉÉ~1!ŠÒ*€ K··yymVñ͊˜7ePÊr şì›T4Ao$×:d%•,DıÒĊ!Ö¨ÁĴx°6/?FiU‰)P„n3kĈ>Óı‘yLéË Ó<á9Ìé×ʂ<żC&ĥ8£yRLiÄ)ۂp_cMëšĈĞ M$w)¨ÛŽï'µ³ ½ïißµ&ĊCŬm;Ĝ—Ĵînr'ŽÍ0Wƒ|Xı×vœËûO[GdaùħNĉ`:-ŞâÑp÷02‚Èŝ)҃ĴˉƒŬe²„ƒƒ•}hĥчÁi€yŒÏŞUeWûéN2G˘5 %Ób‡‡*p‚JO•Ĝĉ¸0Üäı&û–i: .`ĥòvtŸsP€ƒfA6w| ½ĉkùTVa9Œ^Q§’=܁@ŽÌԐúÍÌóá{˙í˙M 25Û%†k¸ħŭñÀò’8j·y¤ş¨âİR\feà ƒ ŻŬÑ!^c!H,cäًö)öò·Irñċ4t_ġZtL)ÎqĥÚ"7G&f˜žY/ĠÚĦoœ?|ĜÛÚğ{È[q¨Úö°x~4Ş{ùĉòßÛÌ˘ÂL 9lÀSÉyvM{8³WïġLżµÏ!HpñĉÚBûilĝ&”î7{ÍöċÇ[[[w÷=›'SżÏĊ°Ï*ÉèFÌŞ>Ë llsG!ıî“ ŬĊġ‰ċ”û„@xò÷’ûó’ÇÉ71àEħaR9=½À’ı\ğ‰Ŝê.Ġĝ¸gŽú~3vMé;Ĝi3ġ׆š ĞÄŜ{`Ż{Ù]^Xc Ò3‰mn/OfPVŝ?Ó+ EGÍnşXĴb=,ĉ†“v˘7I90xzèé:ah[IÔ*fw WD\;"ĤB’$ VĈnq°óäħ×ÎA:j;ÈëÓOŻ,0˜(  hf()xB˜ aqċ0 ê 5Esş_Ĵqʒòܰ]nëOş ĦM× ZğÇûà‡R=y xu˧PçÒQY;‹–Sûُ÷1ıH£$…RŬŸÙ”Ġò7NÜÁ‡O 1ŸĜċċƒl%m˘œĴißĉĥöĥž5ù#m <;'ĞŠòf9TĜ^&-"%î¸-ŭMr :bĤŞ-g'éÀ²…Q€\ĝwħkžuҐl“€(-ŭ>:ĵ£À -°VıT™Ñ'f 0z„Œ Ü¤â e"Ĉ*ӁQ}EaJ$çyqêßG,ê;ŞVS3-’ĞYÛÄ;5$÷ï&Ôû•\‘Ît+rOì%R\²ż˘2Ìî.Ż Ŭf†Z9,Ŝ…ü-6dZ²²İċFíAg)żŭ›eœ0݀Ț1ÀPbc77:Fù° ëÊnŽÎWżÂ§Íħ Ġï÷~”’Dc­ÈiìïĤRÛéƒJ*Û²Ó2šş—¸5íû‡÷ïŜ½(5ħ`4Ĥ8fÚ!ŭ+-cv¨Ž¤ NïÈä UŒâz7£Gĥcĉ37ñ°_Áċ.ò’z£kİċùm;v¨7†yŝùhjkġâêo÷(™ĥâu„„ġoTŠoWD5wY)5ïìˆò–‚uËjÇż%ödB$HBá„­ñÌ”:3jġffRi ĵYßîñ°UA*3?  UHÊlïÙ µZ"ċÌÎĥ½ĵ “•mʛ Žtüpc^ŽQ¨äÏDÁÀ}ĈTm(ïÌĞGÓó)ÊeĦ7Dwğ9şÛÇŜD4vè–S…ĠêGEjJM7›èi@ğÁàsîW€z3—bħ_àE^ ÒRn*eÑĝşi†ŜˆüìKWÎŞQ&˘„”g¸ËA…ÂaBŽewC Ò”&YI Ĥċx×Ŭ“#Íy|CB—ÜâááÎüîhxœp†47oĈ‰o”îżœìĵûöPy UşqİiÍ>èxwrÌK ‚‹aW²£žĤµ#*%Çg™Úh$$“;ÌX(+rDı>=˜7jfíŝdniiġ%s;n›ÀİŭÎÄdŻhceÒ²àɅi–ĊfÚùñ>öŜ&ĵ`,˜ÈJ;2èV´Î œž!—ıŸŠ˜èħ‚‚fŝUƒèêi†ŸŻvĞŭr] T)7lžƒ@FFrĠhÄ4qq)› ÛÙj…û…‡Lj¸=Ħ÷£Zž§L\s"eÛa·jéCQ! FŭXİ9ܧŞĴ8ä/]F7*”Ùö#ò  ›XXG}°2ğ!lYLۜ-’íÄq„ò—3›"x<÷1ƒĜ¤çâÜ^5t;.R`û:‹)0—˜<` éDƒàkfv{c·Hžµ?Ä·Ùn‡qùŝhġs™ŝ“>pàıNTĊĝè ‘D/zòġš5µÇğı­w?ğ—–ƒÑ7úAäï5}Ĝê ċĜĜ9†Ù!Ş…VT܉Oµ|Ptd\›A :ĉ,eŸÛĵğÁ}Ħj' O^} _kwSKĞ[_şµv³üÁĔ䷲²aš^L­Ğo# Rq{íU2Jĝ¤EôLɇħ+[àIĝ˙µY9;û宅WGxošwċߐ§\ÜïwZh˜…fċ×ħÇt~™tŝ)››ŽK&çg·™’QDꀂYäzqż˜E{'-}ê…5ĝa;<†ÔÛú†@’Rܛ][œÁÇP˜î$…8^Ž\썐ü1£M@•œkéşċĈĉ„˘´É ß5~™/ÇS˜â( FñĜ~ P‹ŠıӗġË|/ġéÊÁzJSŽL 8½Žƒ œ4>Ŭŝáî6êëµŬJ’D£Nìû–Nħ~˙nêg>tLŸŽ@ ŭä,Yweäğ8èĵşƒrM·ŻµŸ{sKGŸ>kuŬ”Údŝ°AŻm^uğ7ét‡ie(Bĉ¸“…ğî§{ZĈ£¤Öħġ× üN Â;¨Ğè6îÁhàWımíÛÔÜÖÜÉǒn`…lì÷&&H딢ĉQt³Bm,ġïĴ0­À &8CáљĴÖŞÄë_ù3qfâÔx‡G–ë ü› 0aŬ­"ѳiE|¤ÁLµdaÁQÓ :P4]FbHy:œOä›N0Şä*CfĞDЍ,lş°z}HíîoPqN,s{–‡žÛ‡Ġ~ôújU:ħ†˙È;„É$AĖ\Œġ!³Ĵ +ŞûĴ GĊo§XŒQ4b;ÉĠ ĝúĞb %ĊtÇŻeNkÌĝE ·‡8€ïnìC´ mž5’ûC'áCÇĊQ‹|˜-Ûşx8™ú”ñíĥ™“„I‘|^1ò@ĞÓQ…7Ĥ5êäÂĥĉĉŜŭ f˘p˙pÁîd—îğ½a#<=Ì˘Œ:=WVú£äTëUc—j]÷†ßÂ"LŽI= >yİŸ(°ÇôÒ]S{Ĥßħ5÷|JżAĝé˘Ŭ™è̏íìnLÈx„™ŝkCÍ&ğıB8?‘ıçÔ˙íÌ˙C8T1ŠJ‹·w§˙÷ž3˘xvfaçx@—é‰ cz¨şz‘ÓÛMƒH(òé}ìaƒK’j­› ~š §00İŒÈ÷ħôwp8Ĵ Ó;X¸ÍUŸžß&ĞUà]$6^PE1+—ÀÄ"pÀœ‰yˆÒ!¸H†UÌlŞ`½> “'…{ßmrtZ\Ërħ=Eŝ(K˘RŒÀYİ•GäèâVŽaŞ`˜ÈÌÂRûQ_X&€Bé#ói;ĵé3hšċGSï.Œĥnû—Dç“ ‚„iuڍ^ŻÙĵşÌkÏ[SĞĞ'ß3Fg䚺IUıëÚŬı¤ÜŭxQÍĈt餰A‡'‚éaä÷ӃL>ˆ ŽeÓÁŠGĠ\ŸŜ@)[MóĊĦĴ˜èÚóÖÒÉ; “ZŻ7`/ĉŝÖÄ”ĵ&â,ğȌwx­eÂóŞĜ^ñ£}3³ÌĤ˓ ~Zikżî™‚7Pè&t(ğı, 2Ϥ”ogñƒ:쐞wĥ˜;ĤÏŬŠŒòù…u£Ŭ¨•oj½AŻVkğñhˆĤtí°lĥ`I#ñâ2?ŠÁĤEŻÄt‡LŬ†YÀt‘àf‘Ĵ£Âêԁ}fĞqÂRƒ_ÌFèßU°} JÏġ|ˆŜ&>ĵ\ÔïôhD„Œ…?ċ‘ñ¨’Eƒ&Ĉ–éFï%q'NPFP{z~ì¸Q§B6vœ•²à€ÇÇdĤħa£sîÑŻÁ:0yâ}ĞOğŬk×´‡÷S'÷§ç]ŞkÓ Ó ŠjĤ|ëaïLë>~:ZŬÛ:úòtŞG}Ǣ£aéôáÈȍֽ?³tŠFYdú-}ßkU²Ġá³ZÁM~<¤ĞFñêañ%˘ûCEċáŝö!oŽ|úĜ01­[íeiîèŬŜ·nı]­5džEwèw&ÚğÖUsTċpm§+‚^™§lĵnvkIAuż {¨&ĜdŒíhšĜĤgÖ(Zd˘Ĵƒ1Eà4L “ʵ}²LuĞïǃżšƒñ˜Lëĥ|Unôj×ġv˜ÀÍWƒD;? IDATRûÜŝÇñŬPĠž.Ġ<6¸úNì0²]ž+ĠC§w¨4,b’ ‰+e_&oâ‰ĦCËÂ4ìîvÀPeÛáÎ Ôñ°ˆħŜ1”e‡ĴQħjċpHyŭĥ„ÜE7zCò>ċáŽë÷É•µÏŬüÀ wŒ†é] }†E,ì2"§Ĝ ¨j]ÓĦŸ§xŠ2A§´Ÿ[S{×z½tѳm)‚Ô1-ĉòuœèe>żüs²şwôŝË£v{ lşûô²öħŠtr<Ĝ}kdÇ­Yŭ˘‘^Ş;‘cğFO·áĊûtâ*k;H[7mĞy;Ú?Ğs[{s'W§£?6L·üÖÄÖD­/0;ï.£¸ò }•Ŝ˘¸PK˘Ë*ĵÓŞ7-¨Qž…h-2ŒçÍüÂö6Bì‚bIAÛġ˙ŒˆHş°ĥsˆ\ŠžX#ù!Džı˙[XŭŞL˙ş½mZ~€N,§[­NżĠŠ1@RÎ[Ş&Ĵ ÌGtÖ}ìĊ£~`ıè+ŽÈÌÀ!§ŒċhȀ„]$tÉJʝmzxôp½mıÀƒÒ·Ò÷Zĥ‡§ÂŬ,޳9ò6vL×§ĞÉ=²DĴJcĦ‘Ì)†ŬúQêfM{|n~ùpHOv„šéC´Ù³#6nÛNKdĥ ĥ"y(ß™›:yĵ¤@U;?/Ġë=²a›¨„jù3íéno•²üçïŬ’îù!ìé,ċb–é%WÚGÍĴ$|˘£Ë0Œĝ"Ğh½Rϊ|ĵ;Ş;tc½¤?„ĉ5U_”H %uÍFMïiÏSS['Ğ[/DCżĊûƒ‰-sfsEml¨Ħ‘%'K‚f!%ÈJRİŒb\M Ĉ ĠµĊ陉¨€?Ú:/ÒNOŞ$q`HâŭÊĊÔĈî1ıݏƒMv˸Yğ½éħĦŬ”ËġríúúöĤÖ4ÔYC+Ûâä+°]¤żžm KKï€N‹Œ˜*€n—x>ìĈĦ§ïÀ–BaD3)&}7ïSی°Êĥâ)Áb,%…BÖâFëNš~íĉŽ?êÛAu˜;Ĝ‡¤ÉÁÁ0Ĥ ¤ëÖ ›2-şhÓ°âĜ6ËTJNŭCa–Âż[?Ġ´LŝúŞPşĴ×ÌÚmŻp^*}ŭüt´µ:÷ŝ×#fĜĥC¤X2mJ ŭNƒâ´ĜvyMgÙ²XlµwÒ§WÖí şÑşWt› =@‡„ż£Žïż¤˜k4/?Ÿ›"gyôSĞÌ˘£eñĉ=›3%ĵŞšr"ġy k"+³‹"ÚĈÈáġEA”aŽ H˜:^œ×sŸlŠè҈7/ĜÊj$§ßŬò6$ab4< âQćYĠËċò5ık²0rdċ$d˜UP²€ÜŝĦ“XftÜ!°E%ú‘ÍFB痎ħ…³ c"S„çBħJ™ Ÿpî‰pıOıúGôÖhǍA…¤ŽWŞek_Ò)é §ĉÁ@ :êé‚ÑĊÎĊ¨zœÁ¸Cİ"ŭÚ`C$Çè*Úëu?kWú(2Vì’CLcĵHÖŭgŝ™?,?$glêµĵöġdjé§FA.´Ü°} ,D&£=|ífÎşï?}züùሪHÊÁ(Dò5›.÷Żàç<Óéä1,PÜYĦ$ôg'öxz’ĜížAĠjĉ>oRŽ€Ġ*ŝX’z&„²Ŝ°‚¨p45·w²·ġKÓ­&è;ÇX1§›òGÛƒĝĤâ>Ÿ dⷈĠîäUĦETkDu°È˙ŭżĤ§!ż, ~˜ÙٚhüÌ̤°§63Qà&Cv 'KgÉÂÄȤ eddlġú™YÊ—'—äUvCœ(Ù\”z׍ö€lŒkt|t*š”ÎI> @(PJ šífo %8ĈĈ–J›QiÀş˘<(uġ›!ç@’]u0$KFSƒâ^µŽÉÑy.0xĵ ‡Lr…Ì™cµŻµÇïd×&ĊÄ51…p¤l¤Ù~½­ëÔµû§/ss'O§Öˆ,Ġ%÷èêċĞĞĵÖŭüċééùŭÉÉğğw{{ï?|xŝñ •,Jíġ6ı.òÛV[2Gïe>j57L—Ùm/ xŽ 2³}µAıŽ3ŬÓħ밃 ĝ°ÑĦ²™™ 7Ĉ´<·zt´·÷Û°ÁVĈ;ÁÎïM ŭ}֜`3 galĠ̑hûòDn‹ ˜”‰Mê3,œ7? ĈrfVÑpN8foA™Ĝfr-0Cö’ _<Ìġc –j×ċBİp%ž Föv}#×LŸGŠyLĥ„1YY‡UĊNC˙MÑööúĥփŭ cá,Y4Ġ‘Gl´›TOpŬÚèñŸĈËÄŻpFz³ ³1“ܰ•ħӎ0eÙ…z£?r ŝs(Q›=’­Ĝ ÇX8Kô|÷×óîii S†uŞ‘K5GìXTúÁUŞ5GúA£iêûoï·V·žïó^4"§B9J€ÓëùӌöññóÓ󯧇ïż~>Ŝwµ³r£zĈ``¸Ħ/—KĥG䜺µ˜,Ïuä¸>%!|X“ É{öÊ7úvŞ3!†CVnéòtżl3<˙üi‰2ŭı÷—1–O–x¨‡Ĵ?äbŒċ#Y„¸İÌıYaû²R9ċ´l+ŭ—Šiš4 ˘ħ,Ó"ĉVÍ0ĠĝWPfµ…ž…’Òx{Ó+‡ĊkßĤĞ#ßoÇ+8/eb2ħÛ;1QCÁˆ>™‚íê 22&½Ú¸d<0›úE½V‘‰‘×޵ífIŒµÖcëé‘iĦV­‘qëM^HaaKíÉ7 ÄĈÚmĴٓÁĥ™&ÎK(ڍ6ì‚K<Ŝϰ9żci ¨Bè˙lşeş?ŭóüY˔jcúžTş˘ ñntĈ¨vnëÈà߯níŭzn‚‘Í-ˆ„ËZ`è:z·WċÂéùEŭĵû1žBX;ıAϔ3v싏÷ċD'U3›]tèsÒÀ\wôqÚ·WggVl†VÇG=Ì̐´ÇámĉûÖÒÒêêÒê§î•}’ş„@-ŭ÷cpĴ˙nÖEfI YşmeSvŬÖE7ġJ]·ñ*Ĉĵ¸ĵ²>ûFŬbgòŻ·ŞÏޝĉç_·(eİR8M…q .Ù~ż3́xıˆĵ.O^ġĞĞĊIXŻÁé%œCˆAQÀġş™ş8ı#!›tškWµòmQV@ŝĈ4¤Ÿ×ë!öŻÁá)7Ĉï3àï뉳7€#m6˜‹OÈxŬ7Ċ,ñoÎî$²BŬ„_b蔰ŭġéŭÏí´9³~C¸qÛĤìšQ2·ġòyFë~|~ż÷îîùA+è%…”ʣ`ÈÑY¨kŽ);ëı "!“€€>]ßf4zM=”Ž6Y›BĜI˙$kşÎŸÖMÏ 9|˘ÍĉĊiŞg…ƒKíÇŜĠĞ{_´1ıK‰™§ĝ·^LÀĤbb ËÂ/ĊĴlÒg•}Ù÷Àf×^ ÍċW…Ŭġ•ŬÔÛ·ÒáĊë-Ï ċÓ,³Ñ#QS Ö³3Š |3Lħ(Oµ5r…yÖƒŞÉ2•ċëyħ+ÎÄÔ#ÂÄ0Á·-y_ĵ™!!,´&ր›GKçJ 3N‰¸ç&ĤßĊf“œx0]24†¤LŒ Ñ6è‡f³×¨Ġš½.ıœ1"ÎşĊ‹iH.ÈÏäÍ1Š\>żuû\ûĝíîîËÏǟß?Ŝß?tQ%ž]ŬÖۅ³³Ó32ŻÇŸÏw[SĞï^>jCփ%[úĵÌG³|L²Ñ¸Ĵi NR>>·AùÎEc`ĝ=Jġ{m´€tKñëKšEçï‚ànċ³ÌîƒıZvPŭoŜfÓÑwû´5···„ıAÑA)ċ€h*@X7â?²$ŞĊ|Hñm²„Ġ$* Î/%t8 ;œ|aġÖ Î0#kAQıMˆ²fDßxvQI7ž.ŝ˙Fu:@p‚Ùû}„Mž‡ z7TK^ß\—%`’‰5èa"ì{ŝ¨Ó÷ÙÂŜL£,ŽR&8‰Ô=DŠJÛ 'nb$ĝ1òI0ô”Q ÄIµu10Üĝ1GIĥ1ò†Íĉąák°ò³7äñm›ëOÔF›§Ş\{é*Áq€ĊZşÉ}<èµ-{ÜĤ<ŝċÛÉÖÖÖÉûwŝùñóŸŸ_ïğ]íáûӏ—ŸßîNV·ŽŜ}ú~Ż],À,@ &]˜q›zúTB$½ÓLĦÙìÉaß èĠŻÇ8!f[ûĴ•ġZİNŸŝT…OıÂ6*t}l—§g…Zè2Ŭ Ü&³,RĉA‡°16JÚóÑÖêŜŜÖêŬ“6Ĥ|é 0ñQ§˜£öLLêd&ĥȒ|+J÷[iëİ.üé™ĝw§Şë,<+ıŭ_j‘K¤ÊfXeŒaè›X Ú²ÌEÍÔaÛLÊpÈ|?Š£6† œ˘%LLœĜu ³04`b€z†”Há킰œ;r:„)è 4„‚ÀáÈ*ŭPä“5²‹ÑA|ĠXĴĤĠ 냁b_áçh¨ĴOò|“ŻŜ‹JŽmY´è˙B'ĉĈß­ëâ›ÊË è·“‰\ŸkŸ?ĵ£ÇLÌŜÑÉğwïż|z‡g¸J†÷á×Ó½vve8*ŝ éŽmIOÓdáŞÇ–~‘)Ż‚Í, <5HJ^u=óx_Ò ìüâ\ċGfĥÚi­Ŭˆ…rùÂ)-œ~/˙ñŸ£Ġ-şş½/÷ċ4‘CÈ4c³ûû@ı)ÊĞœ•./ĥ1é^‹* 葁‰PȉzËë3 İ£`bf³2şd‚ż˜ôÍÛP;Ï,,LX’öeAyÜâÂĠ-ş­×TN’…Ŭ  3C/jġ;À7aüĦ5UGc™ŻcsCpŒô&àfE‡?=?‚4PóÀ@_€IÂÑ5ŜXÈÍ3sòÓŻo&öÇOD †qIBOš,=nß:,ħAŭ!PB°a$èÙ:Eá›üˆ9”™&£Yêv?żüóáŭÑŜŜ‘ĵŜ½;z÷ŝŭ·Ÿİ>,܌“ÖnûНŒ`qH‘ž3W°NİŬĊĜ7qfÜC~Äé!½˙ġüİîá#2ÚÂx½G‹Z7ŸÉ·ÉìŻËHĈ°aÓfƒ…Xï&Ż}½ÛZ=9ٛ;úôC+';?.µĝe˜C?s÷ûġĈ.1:ó<+×-zNòSÜà^ŝÂS òȲ .֕:à+_§ġJ}fBBMñ/ĉ œÂĉÀá\ ›EÌ“01ÊÇnonn0<˘jòĤÖ#F`;­‘Ìš‘ĊÉQŭşPƒĜ.9 /7ÇPêc^ƒ˙b‡n { ”Ê€nȉ먛*cÑMĠ(Ó%ùsèƒ[̵,C~QkˆĦ?ÀžnĦ1eħ(ğÍS*ÇNÄŭŒUw ǏÌzáâTëŜ~zyyùùòôĝŭóÇ.̳ĞZwŭƒ\pà˘gJĈD ë>\ıròÙ˟ġĜÙwħ Ċèżt+˙]ëYşĠ\‹}0Šq CP8˘ĴÀĴ_\–u›êٛËĞ?bI)½Wĥ|İuż2HûŬŜÜŻnĤ)sQ@`ŸÇ·ġÏLŭÖÄxÉPžÔĤ°£+á#á¤cj&&ğaíùġ…µŬjzE‰ÄŻ-B{XİàŝK•*"Yo„D˜â[X(ß2ċép½Í.ʎf}aE:™œ“‰!T˘ä*”ɉá†ÚQĘŒÍbÔî°'KoPDYS£v]ksċċGôGÍëƒ4ƒ6@ú˜‡KĤĜl&J‰ĊT8qǁË) Ù%с×%Xš`Fïs3S)ò¤àùhµâÊa‘á.Á{~$QĜĉäˆ>ÌíU™ŝIŝ8@=HI֘JµZ½t–Éh™Ìiŝ,Y* ëäİmr+ž>ŒËœa6Ï&Lôìmׂ#¤“UȗÛĤ¤ HùÂs}–É%#ônîżk5ğŬĥú}ÛB*şì’cb†`˜Ŝ+ç Ê&í$°kùBÓ ŽÑŬn÷§hñ~:Úz˙ċŬû£“_dœFzcpA?Ùo•~Mŭ֋‰Ž2:k›ğ+™ÜġBV1\YżZ%PZßN÷wgy‘’Ò~01ŭ„”KŝKmP’‰ŭ%ÙiĦ˙ Q<Òµ˜YÄöQŽQ­ju$AŻFÒŭz½P* eòùÜ ûÙ Ġ~ƒnj6{¨hn\]÷ÈBB ùŒË; @;rZ•aĥ/­ ˆĥ°]aĵÀôˆaV"qRşZŽ#&†^Ż4葝 ‹‰áòXœċjÓ­o„è3fġ<×éµŜmù"£ñ‹ĵ’Ĥ^J—2ĠxmÓĥbœ*“)î½É9ìdɜaÇĜašÊÈÁ éJ1²7›×d–%cdîĊOoĤ'íînâZSÊÇċħä0„Ÿŝ#èxċL&DŽNßĵ>?Í_Ôéx—)˙ĠîğÏ_Ŝż÷ŝŽ^ïïúû&ßHR–"ÑŭRÍÖµÍŭƒf](;²ĉO‹Xìè•J ġ$šşàÄĴ4'?Îw‹•a?:ı¤´ÊÄÈj./òùRŭĥÑnLYTÀò%•aÀtÜĴ• WN/óù‹Âuo ]Nj;îp„Á…èw"2ħ17ւ(Ĥj”ŞLÊîâ€ñ-”ó˜“ĤĞhŞ£Ñ.‰ğÒdfImi”÷1êCÊ6aBË’°wAvġĝòüëċÇÓ×LJûnĉ”Líì˘t~vzv~‘/Ü4B‚k”pĵĉy!Ġ% ÷@§ ˘ĞŽ0蔘ƒ×%e…†$èe.t‡żdÊópÀáI”êת!%-ĊöhDWhECÊcm'*“Sş¤š›0ú).ĥL£Ĵu(Tß?<>ŭúDİ!•ĵw_ȇ}£òÂô|“, 8£Ò,öèZü¸ŝ°4÷ùö&&”`=_\a…iŠ1VQ‰+Z6l‹ĴH8T{şL-‹T}^{âTWž£­,Kġ('0\2ħN'ĉ‘",(Šôc×NòʛÒíħéYċSíÓÏ/ï)‡˙‡Ò÷–9Ë“ëş½AFŬ¨ŬÎéì\ĉOó ż3âşÌBşEo×ÂîÙ}ÄôNş2âe4d£JÄGŝG @g|Ş]{#ÏDj‰›“ˆĦ×eÏïïKɈ÷F@uazŠïÈDQûĈVıû1݇.0ˆ”& ékzM{zùI%ÈÉŜÖÒ½öNîüúAfwÖ3mÊ~1ĉ瀃ëtèjâĝĉ~oê×˙˙Ä|GôÛ6”Üžbİ^^›…“ċJĞ 6´ ‰ˆ,œ#Úóômë“-$Ĥ²6ñaŭ?˙™aHöÛùÔĈ!91În|×á˜Êäbċ2\ÓċĠġM­‡NÙ˜ïş 9)HXĜ=ÂeİT¸şÌŸŸžçK×½6Ġ\ĤËĜh‘Ä‹É=Ò7AÌ? €°‡0+U0͉ËókÓàrħŞg ]{Cèmüa6–&ÖĦ̌·=ŝ0˘ż6-ŠÜW™û—{{'{ww?ïµ³Ûv­Éí ²j^†ëL´— gäĠ.ÚvI(Ft X\Ġ#ÈċŽÁz 6W‹ä‚Bis£V’i6ExóíI‡Ä09ŒÍàöŝ{&Bħiq˙Ë@sĤCî†äwxa͜{náfQÄĦLŠĦdp :ùĊL*H·qU݈£U2ú–ċRċkP²TégéÓEízfûíù÷{ĞïŽ|ż×òµ°8āw“¨ĠJ3ËOzżC·Ùn–Kç”éß ÷á’qµxÖÀżâ>˜òŽsĊ*6² *+:ħ‹TħvM'¨?Ĵdk]Í% Pà€ĥM&B(.mż­=uÛ]żë nÒ²lc`Ò½)iw^ġ-Û÷™+ħx‚!·eŞsïïğ÷O‘?ž^ô!ĠĦÇt¸›í°`/zû£Ħ“ùħ´ĠĠ[?­ên¨ġĥW ñ`ËJê`,P+ŠÒ5µ²ö/ ´j›f66…Rf³fŸĈ˘Ĉ˙ù/ĊYɘyóŸ·ĝ>FĝÏ@´y”b˜cfZ&ğıċŻƒzäi¨,[ÈÈl×e‡£ĜĤ°TĤ2ìòò²PÈ_żP\ĠoÛ.@lJÙ²ÊÇ<2Ĵ&F>ÌMnLlXZч‘‡ĈĜÔ{s–ôFµÉÜg1d@²QZŞŬ†8Ô-ğwÖ}xıÛÚ;úòĜÍÔ#żrX‰Qó*óğĤÁ-ŽîPDµÂi´€ts4·W 'ŒL˘ï…şGwŸqgèÉÙt>t­{]I(%èh HF TC†§ŬZ‚Àžˆ‰C‡^9ĵ²ûsïèı{‹…0]°b}‚ò…³[ÖÖnÎ 7hyc€„6Ħ+t“júàpäpKÌq:ŭ‹Ż[[_Kôq~Ïiħ½­zclb›Uwp0ĜfĜí aœ^.an?s-Îr$]`UzḘ=.¤‡! 'ü­3 ŭ5Ĉ’ï oeUyp“0•nR³VĞ×ĊĈSàî> <íF³m´{:Fcôh!Œ\żD&vqyqqA†?ê-İ˘4!|Q ¤ĝ`ó ;9˜Ûz° ĴYÜÙpr†êéëŞĠĤżĉaàz–!·ÎK­ xG&ËĠÏşÛÛz÷ëk÷ôòĴdRĤÖ*úŒfíï‚WĦ˜fözê˘KñĥvzáR-‚Ŭ“ƒ"(LúJ.[ċĉ×%³QòşìĞô˘FNĉŝÔ ¨îôG@oìϒċ@şÜӇn91˙í%ĴâÓÏ×µîËêÜхġĴ'—oġYŜ-A5ÚĵğFll ġÔ î#żċşĤRbŬeG0*|ü°ôrêĤġÌïûb‡ĜWX A‰s,Ĵ‹/ŠŻ0[ċ:HAğ/zá—R!ÇkêèmšĉëšO4­~ßÔ~P‘O)ĜóƒVà]\, $ŽÙÔíy0İs`b& ˆìx”nĠ2f@Oœ-ĊbuĜĦR²RíÄkF2LSĦ/C†ŒğNbŸŬk=rPô…8ĥ]E=ŒĴqlúuúĝpᆓ* *#³v™ıúĥ:µôCĞùŽŠŸ4ÓwÄ1s‡Ġ˜ÚLNÌm8ˆğ4]–¸éêġo?_ŭyÇz÷ċ·RvĞ%P*8µ*SJ–#Ĉ×$Çg1Ċ¨²şbĝp™âÌM c€XSZ&‹ï<3=ż°ĝfzQĝ߲îîîĉañxˆœ×dÈ+ĊïŞPcġċÔnšç³òì‘cëĠʔéSĈö•Ïg¨r‰5yµˆ¸g6zÜO$)vC/$QŸ‚$Ĥm.~y°†İCû ‹|R|‘ÍàS ³Ò%™ĈC M·İŭÚÚ::Z=ú•uˆqÛĤF⪙tÒU,™w°ÛÂŭ L Q•t§qz6@ci£˜XgĜŠxsÔĦ œÁ„Ħa~Ż{_èÇ&û)Ä'q€Ĵ!ş\>>ÚM:€…Tû8Fğa”µ‡ï˙ÍÍÍ}è^yŭ°­ûT¨ô+ĵ7[Iܤ3ŸIüiȀ%ÉB”ĊŬ ¤TUŽzŬOSï5sǸ˙ġ{/‘#Ž•"KC!ê{ s•?ŭ5˘äìBеpg„Ĥ3%zÊîR,(rP9\Y ›‘­$àÍNLL6•&Ĵü3 ÜŬĠÛaµFPĠuà˜í×8Öĵ–ìĉĤ<0mée §M~Ĵ$&F˙¤Ş2“ÉËÜèĴ /xÛ^“Bpoа\i"Ħ#ä18ςêqíşĈÀF”•è„Ż-2vWìŻ7xĥ˙xhŽ IDATTƒġùÈÒĵ¸—yĝ²µu²wôîğÖâ!9Xŭ‰x!ƒ×J|,°uÀJÀ\;80Ȃ:­êq˙J+PüĈĥĉ°RutŸêH2A^şF]Ŭ}F²ycíŝÔîğrâdbcşĤúǟšiĠÊôhXħQ8ĠşŬÏĉĉĤ–Vï3á(6ۆċùv”K+"a^|“Ê×z8t”ÏÒ½‘ù:JRÙvÁ6•=öiië~•vŻ?£­ía^ô•‰Ú„CIĝì`bŒT^Ŝ×]ä)ÓkÈ󤍝Ŭô.&jVɸë™%@´¸ĝÚìÀ—SÛ+³;éƒŬtT›ÓtÚnêì†Ĉó/0Q–EzÒMhO 8c½MߏĥëĊÙ…ɳóó‹ħk AÈòN„-SĤÚ ÛÁ+ÜC‚|¸Ŭk ûêĠn{†%0œŸ“2ž3̃ĉñ¸É2…Pà*ÓÁŭêÑğ£ığ‡Óž?jrĵËHYŸ>ѵA”Ä 5Áž f˙ĦU¨ì$QµĜB‹%Š|ÇÊÙX˜…ÑàÀp‹~i )LšC[ĈÙääävÀŒnwĈڏî8 ıtҝrĉìBûüùÑêÒÔÔê‡Ŭş%F˜Ĉ| ? ú-ĜĜ°WëÛ<ƒd‹cĤ &3~´b ÈM3ŠÎ~Í-=Ġ íç‹ĤŝL'Ĵ(ÑÑ~][ä1`X~ ¨”€`ħ܆}4½Rœƒ­ż²p.ŞĴC)Nt™}ÏrûaAÉMŻ1 ċş´­lĤwÓĠb•NsÌ0…v +G<ú×ÂĜĵ`aܰ²^{Ħ< ¨]î³C]Y*‘+÷D"Ûĉ 20öd µ:Y˜Ĵ‚èÜżmòOĝ[rse€o`ˆ‘MöécZ ‘6Kô ȏÂ0‚°Ŝ}ŜZ=:9ÚûP2CĠB“ÀbšXƒÛĥ‰ħ•‹µs?”­:4*"4Ġúvflc°ÚiċB‰8W#÷·M‚£6xĵîXA­Kċ É‡I`›˜ÍҕjfûöúV{ìê ÏNŭôTÓşOOOßŜí­NMMm½˙ġxÚöÜ L3ÔJħ9q ıXԊ]Ü[’|†j†ò‡ħ‚µ²ô™ÜàâioîçYĦûòt6ŞŒ~Ïğ/lè›ÊÂĉ×UŸL6*eġ›ûeLš¨úŞÀÁ2aİ0ş.0!›|GOŒîaċÜ7Ó"#Ȍá aL-Ì,ɒñ ĈÁö;…ˆˆñ\mö5bbœħ…ġ¨Š½é LÁɇ‚A4ÒÔ|](”./Î)+”àoìlV‹Pĝ½Ċ˙èŞÇOI-0";j^c•ŽGï7 P=––ë¸Ŭ“ZÁ°Íñż°VÁ…]Üš[Ú£ ùÒ­ÛĤgŞY› J˘|gLI¤é`Èèb·š‘ŝmKĉT ¸QÇğ½ìQ‘1 D‚U8q‘<ÀÇtBLĵ)ë{ÔjġËòšÍTGgşŬLcPí ³Ÿçï™29ô ^/żŬ½;Z]][š[ŬúĠĠJu œ!†0ŝWŠTĞĝ•# /.žĞĴwÌsPí"LÈ÷™=(<Û£7|xŻġûÖy÷ıiÁ%‘½ıÁC w8CŻ•6aJa_×ѽ]Fü@„m… mQô—'Š+ò‚ÇÌùCHŻ€Í ­VÔ/ı9éí‹ğf´LĴAV×kê ğ8b(O‹½R`NyİšT è|G‰ˆ†UÎS†³47´PŸcġ‹^ŝœĵ\Y`ÜqoÙ617ÓÎÏP†´ŬË<M-m­ŝ󠙑ĞàzĴoë2Úg9ÌŬA.Ŭİtü×"!ólô†U·”ı˘â— ;){Ç0Š;İ ŝ£*d Qù\£Çúüx˙ùñééÇ÷§ïOÏwŸžŭóċۗ_/_ŜŸu|ŝúŭéċŸ'[tQĞ[KSd^G_ÌÜÔĈì½%ü’Ċ{İA 7âÀÓĥ&~ŝ$RQ‡j{‰×“L³~˙~éî鏟ŬvÖmĥ?ċbH ‚´¨^ĜÄV ŞË”pQjswEu.$-.½Ğ€Ê„ˆ€u3YjK™×ÂD5ú,L8ĥ ֝ŭ,ĠSÜiìtF­Uéž.İqAy} dbÏĵv[C‚jm$ÀrÀ4ÀzqSfäOŭŞ$-b°ÈˆĥbDuPĞZÚKÍĤİ*[LLÌ'q£v™/PYpéZëİ6£Ñž Y9Ŝ"^áĈôÁÙËÜÔêÑŜÖ§î­=LtŞl@1˜Ĵ*âÏâ9ì²GĠ™h›ƒ )Zž!“YĠĴeEk!Š )Ñİڐ‚@ÑĈ+}~-ˆŜ麚;­+ĊĜáĴ¨9+f2z·ġ0 W[ŭŬjÊ5;ÜqŒÛâœy½Ĵ 0â­ Ĉ¨˜¤DŒSBÖé÷#_ïĈ÷R ½ÁŜ¸ĦP5š €ÑĞÓ2WJŸê1ÄGN‘ƒéLÊXݵĈlĊ=ñ›ġÂ5.¸ëjYĈëR8@ ĵdnñN­İ£w[[/Ŭ^àxl³3ş ·‰+éTÒ sJw<2\´ƒV>[È#èY#>òs˜Ž’¤~× ŜˆVĈĦŝl”Ï3ŬÇŻ˙‘WZŬÛCT;Y›šš£×’XLlkUĵG™áÉ 8_~>hg—µv‡‚΄c#½q †–VħĠg€ÒDÍœ>‚•£ß߉<‡Ħ ÜċI0”HÜSJġ÷ŝyì^¸-Ğ× 0ŝ{ĵÀˆ‹HÔÙ qŭĝ*3‘ÁcŽŭE}ĞbAÉ°‚j´´ŝï´b3ÓÓ³I.H·wvv †€ÁfÔê÷2#œ,Ĥ#‰WWnXԐf“KbT`UúîN ('²ħŜMÓôÛ\ös{ ʍżOöZža%W…äp‚àÙĥϰY—7hX#×Ĝ€ĝvXîĞĞ‹RYVꘋ×R[afȘ-K ¸Ĝ÷ [úĤ#‡shNoÈ[u*Ċ~`w@‹Òê„mlŝê‰EĊ°Ó£èP80„ù[Œ›‚ÑBƒŞ“Jx ìäÂ(CêV­tĦ}üŝük²ä­A6ĥGÎK^K['[K°ş÷G>ÜŬ}{ŝçċééóÇû{­Žcù•~Œ!0AbRÖq™ÄÂaToQÂĸëÒ .ÊáöÈÖİnġËÇ-*ÎWfż51f£ô2A³jŞ­hyÖX:K‚<ƒÊş¨‚°ñ°“èĠĞöğğĊ…‰ m •šùġ5Nëf%oÛĜÜ>È2]ĵé˘9¤§ÑÁ4<‰}€W˘b ˙3v-y@žQ .ı •X0Ä^öx¨ħ‡½HÀĵ˜ĦˆUpJĤsÒl—óĠ鰝á¨?ŒaזŽ.ÛUeĦPı¸¸İ5xŸBĈHê…-0 }Pƒ§…ívpÓŭ2·w´:÷Ħ[‹,X•ġÙc2²Qh^èñÚöó™şÎ}ˆÈĠ½¤w!GlŒíùrÙ@+ż’Îċ@šP6޵ï‡Ĉi÷ñ׈KKäŞó?!uòŝî=½ŜџŽNî>żúçÓ§O=˙üúĝĝxOÙ˙ĊEıPŞYb”D%£¨Ÿ#cĠ|ЈSڗL¸LÌvaÙ ĥċ-dlĵƒ%ĈÇüijfżöñhjëç}ı{Ĥ„üŜÄ0]ÁĴvpGÚ/VF0Y˜ÏóĜyn¸ñŠÉQÛpŬ`:%İVÁíÊtᒽ šÜö’~ƒl\†n* ĥaâ*äñPÌĊŠ{s(“@FÀ²$F£M^ì œœŝq2†vıóŻ12Ġ2,Yfuûçż(Ŭ™ZúÒ½|H''Q‡y~‹Q' Ĥ}˙:ŻuOózX逖ûxH~˜²lr­À{HµgÜ_nôtÏ÷(…‹°oEÌÇ\ÉĉFAL·`”˵*?yk‚ò,Û0e›‹N4H(‰át4 œôo‘ŬM­hModÉüŸnÊï –ħÏ6!PŻġ7Ò #[ckƒ"hÑexÄM 6SîrŠçD³İea˜ĊÈh^ÉHM@Ìĉ~8B‘Œtƒ%BŒ[Z>—!p.Òş@ς‡AcŜ=ö;5‚ΐùĵÉ>0‰ħıíĉìu5dĠ‡79:-èÓ=!ßEf¨‹ŠÀVP &Öl%Ĉ§6³È~îÄV›²…H™ÈĝDŸÂ!eôFíû½İĠİış½$p„˜Ş–Íŭt1{ĵż²|\ë~~ú˜İ™Ñ1ôo!OAÎĞ#óíˆË\YÓhdòagTI3Ԓġô—nı”aòVŠ{??ƒ“çá‰lè’gfùBïš2›Rİ\ ô@oĉ?˙óù ËÛrı°06Çı¤ȇ 1ÄĦƒeĥrĊ!]g…y¸>ŭ˜‰sQì£;{¸›ˆ\5™˜é矧Ĥ~ifGŞ/†˙OéÒ§^9ŸT¸[˘ş••5% ²(ÔOŻ ×•ċ êZÖ-ç'œ‰³Ĝ™†œÖôì˙@dw7MÎÄŝ Öèá€=rĊ6I¸ŜW^Ĵ1àv3y f9ÜÜŜ?Ü=–4ĠĉY4–nÀq2ĉĥ‹Ş İžb&íğ–UñQ2$ëĞ‚bÒàÎj7Ì`aĵî]C˟Ĵ5Šx"œ0K`ÌÁ³ùĤö‰üËÒ³VKlĈş˜ŒAV½{°ğ½e~|úÑÍûıŬ•ŬíŬìĦĉZĊ4Żêùh@qĊí̈ʒô !KıIû˘ûŭÖÑŬ?O÷Z&ß뵓¨tß=Ż÷ĵŠÜ$Ä"’aQ<£ä/Ԟóĥçĝ”oZz­i†[Š œ¤³ĠjúĤ1›ÀOJNי…Í·(€‡.óvûòNSĈZĉv!(ĜcżäŸĤĤî4#ŸBÂɐ˙Ô´Ĝ†ê”˘CQĦOÑ rŸNhfQ9ıġ‰½aÁ(0y.O¤aR^ÎQ9b*0…·‡W”R€WäP6Q‰ç¸œáx`zÜşbĈv`(ħ°[c5Ì&ja¨×ĦEDDf ˊ‚ ‹ÙĉĉÁ%+ŝhè3µˆMEŽĊMNq$oooë~ô_yY<ĥjO5‹Ròıòö˘­ĤÔc“}…ZPŽ:<Az ÈJ,'38 *Ĉñ#mè–MŜ-pìÌnd›šĦ •ù.Ó$ı‰ĉ#Ĉİ|·z´÷îsŬµÇcÑÉ´v ŒħĤaŝÇğoš>ŞR|Şĉ„†úsT~T݈=Ǖ‹nÓo½<ï%Ô`)°ôëÌÇŻ?^´³fĞÙ ï­äô£V œuL+j²›†‰£=żœ‘ó˜›,½ó ùñ!ıCvWħ 5)´v޳Àğ!ıïÂÙù-v‹"lİ˘?كžWíŒx–9 ÌñġŭÉÜ֋Ö3m& d>o*~kb\Hġò ‹uÎ.°[ŸY—x Ħž  pƒu`šğ÷Ĵ2˘’ħuEL¸0!zbRk|Ĉ•o`b + J§ĜÜÑ´@oċ=îáş­_„üéşĤ˜Mtˆ„ÊĠ]”F;•4²šĜıcy.n.2/cgžPòŬrï×3ÓP31³*:äËȍ5tîäuÛTƒ ` X2w…$8y“$hjßĉöĥVŸO w'Ş@˜&–ÍesûŭóŸĞ/ŭ~0Ĵ2u5 ÒlU·ZUšğ‚ÓÀÎR£œ9û‰j|zŻ~Ĥ=|ĠNó=ÓïW.Œr£úŭŭMlŽ-7 f á·ìĵ~ïë2w°dÑÄE1YGЏmeÙĝF8ĤĊ‹°ĥ›ĞruÖ2OŸ~hmÇġG ħCJ-ûasì2™ì­ÈÒŭ‡ı_Ú-Ä~£³üÛ@™Z›°Ÿ‹ùHşÄ-ÖEùÄ  ˜X´yŭï7 ³ĴsŒĦĥŻKN”·Bü:+ p”şAT–ĵÜ6BIQ6vĈŜ[ĦÁÄXżwÍ zñb˜Qb/ĵÇíTÜ52VJ‡XXWÑO“•[KDħ4™6ßç) §à΃îŭ 1”›Su#hĊ6bÑèaZÀT7²tÍ;t+97!/†Á‚Ħ[~ŝRSw÷= ¤M˜ĞĈíCš?Ê?Ÿ|9d:—”^£˜;.ĥ(FV OëŞĠs“äµĵ¨ƒ&SbĠΰv™ŻÁ´FéNğŽl³ûxêE&Ö":¨Q};²şż>öú!“ĊÈΏáWŞÙ—£“×aÍ(¸4¨`€$=Ñ͉ëŸOĤŽ>_’óŞ0ö;è3âÜçNqżĠ‰’~œù9ı0ŜUĉMúüŜï!‰eFäöË"żĵ #kÎĈT'ÚÙbb@îĴ@ZqvzqÒglˆ‡o˙;ż¨8fŝ3ż8ĦŬgŬâ™ĊMˆ3´"r>‚ž´Î.Ĥ×Ĥ@ġBI!-ıqQc(+ïë"•è ³Ηg,Ğïèç€(h´‚€aħ×Êà-µß*Bq“A2äšdĝĉ›Š~‡ÇWL5Ñž #—×aÙbĵ)oäڍn÷Òê˙a˘ùèĊA²BT˘‡rù}éI?8„”R‡SFĴ·oNOë˜IYÜÏmœ‚tÀ z„^”R*ßéÇ}[û!ŜšZŠ FĉûÇrdÓó-QŞ.ŭCgp˙+ƒÉx÷0 ħgLgµ%Z^ÉèòyŠbà%ŭ”,û"£Ò)*ÀbgGıŜŜÔÖcÁ÷mŸŽ ™-–Gŝ›ĵ€Z]_X\ŸX ›˜4Ë #ùżô*€“Ĉò¤ Ĉ&¤›%ç˙úï|J½ƒ¤”ÙÛi­ß tŸR"ĊĜ‹i2+рƒ‰Ûë &$R26‘çà½xJlöħH›Ši€ĞÂ<ĈĦüĵû<ä¤ ç½ÖVÚpbÌĉ˙x !sgŽĦ/4ħœê3Ĝ ŸĴ6@H&[f4XáëÒÜŜÜÑǚM†ĝïA’WíûÛû¸÷|™>Ĉ ç(ê Ù…xô!“ÂÏT˜Ĉ™8Ï0/´ü@ĉžcÓ,hÚiİ´n&˜bFQ5KG*˙Ĝmû=è\Ôê —ckKg4ġÙçRìêŠ˙ŠóŜ™£kĉÌ˘~8rMƒŞÌN.Ŭ1N-âĉùğÈË˙š 5IF•*·Ê˘~µ£dMàûĊ1UK?ó”üÚ:;‡ Cŝßs½NԌ9œh6*î™ ħŒóÚÜÏQfàÉħ5ÇËâœA ½./JX?â˙Mƒ'ˆĊ(­6zmJ†?êSyÉ-´ëŠË<a+€Ġ°B†êŠ‹`L¤eù'ÎMŬ2ŒW…rhlbc˜˜)³Çˆ…2Éï˜FMûgnukë§Ö3˜cNH  á;=‹š7ôYÎu.6ĞV8\ù¨p€ ˘63Z [´OĴZĉôŞ-KŜĵĵ‹Ô|DüñĥċÑĊ(gËWGĥ^ŒñU÷sĈLdPm2ôË,2ş&“w§(÷@gÒŭÑĝò²MɄËċ †}ŭôŝċ×ŭUèşÑÑß~‚5QI8]?ŞšÚÏıİg͉°…ßn…rž.Ŭtŝdb“mYÖH\LáÂЉq£~FT:S‹İWŠQžG·löoÑT&ĈÔŻ Ĥ^˜ˆ½ħêĴŸ­-#eéĝbWƒSCĤ'êïz ğ,]Ġ u#֘H×Ĉw-zœ…DÜ İ ş?û …Bg˘SŜÖ@ÇÙ5™ÎnÂí4žh, ÎpÜĴÓ ·Y=y b §_Żħ"ìa6Ŭ.×{z;˙ñnnuî[hbÙ?[Ç]Êżĵ{(cS Cv‘$a’8ÎċbL ášċŽ/5­<Jĵxİf1Ħğ8d²P  §ovŸÎ˘ĜvGħ­ÒU_êœdĴ}ÖĴ–k .3Î: ÷c;u9=vÍö=³|1pŬĜż½˙Ħé•Ĝĥ8!ċ6Oíüôì4seafQì´úLE ĜûId-íÇÒÔûî8 …Ç0zċ:éZ9`2=‡ÉÖĈÓî9ŬcòĴz°Ž ½\Ÿ. NÔ9˙ħ5µ÷µ4 ħmû6ŻeεûŸ_ŝùŝ[Ĥ§ÔDË4µħż-  <ç#)ÈÄĜg ^Mٕí•$pÓ,ŝ7ğˆ2t–÷”‰Í³Ì¤ Ċ#~kpHí…íÉ´\OQ‰sÛġVíP^ â21áX÷)c%Èb5GEûÀÄ3ĴV°ŸÏœ…h¸I ò`_cĦ²1Ĥ @ıÛOĞËş˜‰ħg-3…š›…^ï~[]šğÓzm!Ü@vršÚ——Sòĵ`A§'6eSUI荸‘+Ëq–NNìĵ›ıíŬ°àĥwA€ˆva¨m÷ħNğM—‘E\İD„ħ™À ğµn·ÖĴ ‡!Bi€@—·–(—ìĦNRâTû>7÷|GĥÂiv{í|WkšçhRAsôÄörÉŜܛZzÉè|Ò†fIÓ2…vĉċhunî·M %3#ÛAëİ5Ħ¤>µ6ÁàÀšŸĈx‰.1—ıŒœŸ8?ŭqq™7DÖÉ܄dŒ-iRT˙qeg7=ñ£Çİ˧¸'˘4uٟ”Í#Ó÷ ğpĤúÙôqöx÷:vÇT`a—'‡:È ıéĞa…ÌÎ0@,ñlµFdN(ž}íà›XwC}d)‚!£ĉ ŠBh˜ŞdG½û“Ġı­ïg”™!jÑßòĊ0e4îŝş/+>öÎy J;ÛTlĥÚż4ġĈĠYW+×Ê·²U ĝgÉaàCƒ p ÷÷WžËJòxŸ´6sġvŸ'#œpĵ¨y}¨Vó£Œ ‚6¤ĉe÷ëóÉU) àÀŝÊú°Ŝ½żˆœ³óšnŞVC ì€2fìGIŝóûİı_Z› ̌úú…Öohżĥ––ĉ~(9FÒ_|;ƒ@ɚê˘ä––˜Ĉâ‚ÊĊÔ@IxÓ_Ixx§ C¨•u ™‹“ŠA‘„Ë&6Ú›]\Ù=ÌANÇ [X1 &z°!JÂ0—á#·÷y˰zœfeÇì!™¨Ŝì(r ½&8xŞ£²•,#‘ŸÂĈ 0%ËàDáXĦe?@:€¤#WĞÜd£l'Áâ]rxö²şşôĦ[3I‚= J°ì&eߨ}]ĈıŽ eÈm[LdĜ³ş‚•Zóì{1)ß6xëIqħZŒ dÌĤÈ% € X„>"SDaXmíQ ád111EĈ7–Î[ÛqJŬ™Ĥİ[b›ÚzÑĈ“ššž}̘Yğĵm3Ĵߤ#Y´Ÿ×ıöDqf³ÖöÉTw>F£oŜ3ŜğlR) ŝ…PEèŝŝxçñ†›·Ÿ×Ô;jSŠÊ•ññîŭ‰oÍ۝½½˙w+Nq8ìMÇçĈQ{Ĝ™·/ŻïUÛ‚Ġh­ŒĴĵmüûê۟[K ‡GîĉúĜ8n/6ĞÎhmüóŬË_"P£4âáŭDN1@eX°FpT.‚+,&Â,†gc9-Ê~îĉƒk,ĈùY&z;peÂ×È>ċcħ­j B8Z(UJZTiZt{ĵ9xcÀÎĈ$ Wçײ"d”ï·ÁŻş0éŝ隧8Y’rÀVŞ:_ì>‚òˆ-á(8lî3£–mÙAs\†Cɒ6ˢÁM]ÉQx‹ |…ä?a¨‹Fcá;Ëùɧï_żúáħ5Ò Ù€béM³9…Ğ÷ĈW-§“váhgFSrĤËĞ”ä,{òÓŜÛëëğ-Ip{<'äZٝ9G”êsb/àS&ş%ó§QĞ˙ëétʐ(µÙÔ[ q‡L?A-ĉ8—ŭŜ]Í-°¸ŸüŽŝƒµá]N.¸4Ž×s*i·L³ċˆ/Ē ĞÙôFèú~÷ûı;ï ;}yaż™Uœ³uôĝññkH)c(y¨ÍŞĦe&Ë&$Òòĵ `br;J‚ŻŠ£E#öl0İçDW Ġ1‘ ";Êâ…R).äòf·ÙXÊF /ŭŻ;w×·#’‰!Èş ċ²³,7D“M^їÂgŒ³ï²‰‘í [c,ĵÇD™Ó'nqÊÑyio@ÒÔ)1Ĉ…gh ßş´ïy¸]Èb‘×,ÀöŜŭüúġ/FÇíM™ÚĈ„^Ż]çbşyÚ?ÓB׊¤hŜĴV*bÚôj>Äò·Ŭ£šĴ³ì °ó4ÙJ3`Ô°j˜"BqyòŜè5–ßè3fhà˙¨Îkï)="#šÓ pıŠ`n½ÍÒrípGħġÎĝĝïÛÍŸûöñ§—ß}dĵ´ëÈg‚à\ËsŞͤ; NáÌ΂|ƒ`ÏtÓÒ"i}a˜Gi³ë ˆ° [&@ĝaStÇW¸£”lmÜnê RÎ*%³;è˙üòğ'o.o:½Mƒ,¨ Ğş^J“;ëĉ^“ŝ\.U‘42q]ıŠ ıŜ´\oÖĴĜT²ıƒÓÓÛı=\Ğı¨0š1k0ŽÒ‚îßĴTĈµ½€7á*òD)ƒĊ˘3y0úÇ£%9D!İÖčĴàìa½´Öç^~g´WT§wVóğŝÏßŝû Ó[ϽYRG÷Â8·ÌɧO§.äîÊHɰŽ2Z\ż˙qoïßħċuîµaÜx&ö™6 E›ĠàŞË_21à'Rj…;Pd_-ó”QÁĥBe \]‰7'e4ŽR1“ܸÚVJ0­˜€+Y–ĠҁàV Ùd¨ÉIJy$íĤ'<`bbî‚mMŒÒŭÙĵHJêfwµŜħ Yà´|$ËA²+?V‹iˆż,mE`Ĉjsn›;KQŽ'Ĝk˜Y]·n i-ı(ğž3n´vŭYµ¨{­w?½úéw8¤ÓŜÈWÊĴ#_ĞURj•*0„Až\fˆ˘İkRžÔl^°l.ÁİqÚÚÔ\è™lĴíĝÜ´ĦA‘ùm߸ôlĉ²ĈÚ[Çġy…jÁ2ÔÊÒ:.Ĝ…¤Zµ˜bg ñ1PfG÷íÖñǗß=ĥœ5âttü÷Ğï>´ÁÈ>ž/›ĠfŬğìċ^|úÙpÜnÛ¨AGO V›ħñËŜŜOF‡Ĵ¸ĵ=>v—€‰0úGù|İòċ@ݐ†j.IirŝìÓ¸Rı!ı2Ú%…i ™U=‰Z‡eœiS•›iX+„!³Ku=‘X)p²É0LĴĤ£É¨¸ÚÊ=ĵ½~€ Ž#ĴŞ#²agá1G~§ ÉÄıÜHÙĊ ÌÒċî s³\zŒiáÎ'jĵyŠÌyŽĈ˜ñ&èô.³AÁP{“!î7˘ün³TèÖfi™3ŠSƒŝŭ£tt:ÂËk4)­oÖŞUòuĤe6ş3|[™|× œNM†í£0÷Íé…Ñ?şs †NNC–ÖíûÉPıïVôV˙ñjÑônif˘óž÷ĝŝ|é3šsN2³^żO×­ġɧ—ß>ĥ×7ƒNgBYÙ÷/˙5&‡ğÎğ~5ÍjĈ„Òыżü½]Y0ÉĈœ!Î(ċûƒÛġĊ?Żö^|;£dduyüfNŸŽĜ);&ĞW*eM˙bş/bFÒuOˆH›,ı)²$&–äŻÜ cċ–ĴŽóp5Jd·ÌN ӈó¤<ĈHT§jZ6²è+fH̵ĜdžÎĵÎK7Ñ)O"şû×7BÈɌ£E‘ÉMŸ9_ċ_ŒĊÀz+ŭĜQÂE=Áp;Ĉ6ĉ)TµëŠU*$&Là:çŭ#d€‡} êSf›ġÈşçLħ˘Îï?ŭŻquŝ†qeC¤Û”ġ›£§ÄOoLŜvF°Şd—U9âìF‰*R² ×]µNúŭ“6Ú# X˘g GvÌb;UÎT@4Ż)ħž6}ûÚ]F”Ĵ„jÄÑúÔĝ`L-V='£´6Ğ҅`êŭ^ïîìŜĞ×%ŭġ ×2~ÛûîŬƒç´É[b5²·ON^·wöéĠÏlkQħ+ĞË Ġ\9×§lfÎ|pzòà2GF]ŞÈÄèC~˘TX‹DŒÛ÷ qBj6:nÌRžŭ˘¨†Q4,.‹B~¤‰ìĠ¸‰Aßçuŝe(‘ÒґçÁdIè9éħ< §Š”ĊÔÀä0žËŒĦİ{£˜vn•…1µ…ċ ‘~jwX.™[Hc'1 p"Şş ëlµżYŠ`ƒ†#¸[R`V P\Ş-)Á§Ÿ9qVĴ´„}€ “bvAVM>g:ô{ŭ‡quqq;i³˘ÌxòBDĉîìŝäl0ôkXİ£0ô]ŻĞWÁĦĉ¸wGF߸h/Éş0Ĥ·†1í˜Èkî!ßlj(Ŭ.İÔ Ä!&&rMhw“êWż?6dÈÈñ}›J;JŜp~†>?ëğÎùïßîŭsĉLİš¸ğvNŝÙ{ùétéRuŽŜÎÜ·;GG÷^=ŝïĞ?ކ¸ žm6°îꁑ7ż=::ï˙ĵ·÷›á6ëŝäüôŽŞiËu„jC'‡Šq²ŻÏ(™sg;ƒü܍•NÓ„v!4Éɨ"ċA"Âĵœ Eö?BH nv„ñH$Y,Dv‚…BFíˆ@z$.Rù¤F‡Üs‡Slj}ps{Ë ÄĞ7Â÷ʁ4ġ÷la“µ  ħ—İŸq[÷ÀA g İNášëĴ(ĵÌ) ñ:‰´˜˙ĥô:1܇.}{ĵq7Op .Ŝ•‚ÑònÛt$,üŝ˙íñÈ8şğğ‚ˆz -ĜĜĥ[W׃ÎtQÖÁĜbÛK×Ög‹ùpMùċQß JrC ³Ûí6lá´1E˜””„v­òĉŭ³JŽ aqfËNܔÁĵdÍÍi˙ùl)ü?oFñ¸ħ`Žäáş”ï|ĝĉŭŜŜĈšù„nËÖğ×{ġ<,³!Ĝ,ÚGĈĠ´Ŝ=˙{ïû~Çg’ż9óĈ9vĵ&ĠgĈ_{{?>›îèáş½lrĥ·à6eˆf)W–ò_^…E•x2Ħ‘ĵç&D ŒDx?Äŭ-†’}EY†1­’Ä1³kü˙˜XrÛ²Í%C;‘T:PO€ĞËèVĥ9Q$ħ°hĵĤ,?{óöĉi F‹w³·6ħ%ÈYßġxġÄğքɠ}‡nĉ¤ŬÑ ŭ?5]b™ÏÏ'”†+*³yÀßf^RŜ÷Ĥ½)Vö£`µĠòş˙Ë÷˙B§ôŞ5¸}3èÑÏç6òEĠ™ Ŝ^œĤh°WHQ¸7h]B8ž\ĤêA÷%ĤzÎÑ{5=Ul–žĊ’ĝöÈÎ]kŭî%YĜġş×î`ġċÎĝy£Ġ‚Ž€7›ùŽoŒŝÙĤ1ğügïĠû[L^™ûv52:x]}~zı÷ŬûËĤÙıow\}fš _iĉŒ‘˘jéJ³’û2×+ó&Ġ %Ĝu’â B‘ĝ–•'+k –Èñ ’-4ż˘l2‚Lóf6Ğ”+Ħ`sÊò´<ß‹J Sw"ıE’ozĵ ÂP‹·ĵB†V9@‰[÷ŒWì%Â[ÂJ c…*„#ó·Ú,k֖ K9àwħ19RÈê{gu˜–Xôy•é@Ô+½ ´Ġ\Gı’Q#”óË;mŻŝĈr˙•$­vo.` òRƒµ’„vŜŸß WíûğNŻu{qr üŜÑéĠMÇYĴ@.<ŜĊ_F™Ü3Ŭş3Ÿv½“ßß_w-_Ö¤Èğ0ÙĤÌKÁ~ĵĵ}×_ÛK ÇY'kDİ)€ ĵ²>­|·Ŭ½÷£1ì“N(ϸ=úkïçŝPŸ˘#HnucŽúGÓJòŜċkž0o:îf ½1×l‘Ĵ˙òÓĠ˜OĈh"Î<Ê[ì-ĉ'Ëjé/o eĦUšÉ)ÚĤx6ga65‡²pĠñ*YN, ²QĠ¸ÀŽê ó™„-4vİü@‘ĊbrçKşÉĴ侮½°ċ –tÁxĝönÀìbô DäÌĵpô ô@WŠċó¸5 ÏŻÇ{–‡1’ ú˜Šf)µât5¸[ ïPaĈ¨@ 5w„ê gürÁ†™!܀hp†§úëñĝ ò~ e¤ Ÿ4yÔ3ĥÎŻZw·§gg§'ÇJÈíz2UÄ><,š²6ğ0t…ÉÌixÇżŝz6³QÌ: ˘Ĝó^M•ş·2ŜŸ‘7!û#/K§l›é˙ÍáĈßÛŝd:ƒĊ.ĈàĤġpô÷ËWngğŞĊrcyǏĈÀ[\›úóÄ^ĴĤŜĤŬ @ÖŽ^ôߟöŒ÷^ŝy´Ÿ] ĉ3ĤŒÚ°ÑS^Q9ËĴĠLÓì~iÔ=ĤŒœ%ŬxáH@‡l6L¸³UšW#, ˆìKI2³=†EÖ-ĝυt@¨£Â;ÖÎhFKF @/ŞH rbzƒİq O†Žµ´!y]÷úöêâöFè%Żn[mp,$áċv…£ Ŭ…àÄÜçŠÏm´9×_ îĞ6uàÓ zÊ{"ÒÒàtžâ 99tçĉ 5íDé}ꨝ{!ĥì6JÊúżŭôÁ¸ Â—Â38İYìrŠ-;Äy[ÚöînŻNN.Ŝĵ Ż[ŒĝÚ˘ĊxĠnıá5ĥ1: ÉîêĝEI“ĵ/ŞĵAßwá&ÖŜĦ÷ŝßħ§B°şä´ÇÖ9 `Ż}ġîǽ½?×*ĠġàìŬ·{ŸŽç>$*Ĥm­îa>ŜÔÌĊĴÙ]"\Ïq¸$†…ıNïš\ŒçM§ ˜ó1àB4‡ÁÍ`Üé“ûù˸§ìÀÈÎû˙Ùûdìm´ê[²°Y„’ù×ŭŽÇ´ÚôĤĉÙ†*ĉ™Ŭêż?qÎ˙ùvïğ''ïŜ‘˙mυœ t3VdğS×kċ˙e ;…˜H&·mûëäGí·%PA2%şZd•à21`ɤ‚s‚q™q5À{I"Ná1ĥa˘ÎD²P1g˘işB’kŞa{pGµp ß^3qXël¨b6mK×g .²lo)‹ÚcŒ@ÀᎠĵ‡ğĥ* Ĉ0Ç%è+j3Û˙“ @0fqĉ?F–l̒Ù.ë+ïñ Ĝ`E‘Ê_ÌĴ†^oÒ+Μ oÖ°<ëŝñ—ż³³ë5&ê‹f³Aǟâ8ğL*ŬâBœ™:mÎ̊iùŜ ‚CÇ3FĉÌ­&òxzQ&ħjO}·g||×*WÌfjştɤ­š ÀÈ%ÀĠ>ú`Œì 4íjġ.Ğ‘`µ•)@+ïìß½½Ÿúmú"!YĜŸ{ߎ7šzÔ 6ö½a\ÚŜÙ§½½—of›!WÚä-í…ël͇Ç÷Wîí§o÷¨¤íŝè÷NjÑ)+ޤêëĴÁ˘H¸}ûK¨ĝ—Ùî~g° Ğk\şħksŒFbjíŝŽ,Ž2ùYP–YµZU@1ĉ˜'̀ (ž&ÒĊ …­™Ŝ삲z/y£r ôB0F8Ĉ6t§*t·›&7Ë–?ċ˘ĉıò] ,("΍Éù‚WMÀl-G,ŞĠ„:û(Ğ¸ ›ŽŸÒœžê—ħä$V›Ĵ&úöµf³^g($ĝZlÛ=ú÷Ÿ“ÖÛ6s45­A.*UMÏĜhĉ TĴÛ¨W+Ġ:˜Fġ2tM²Ôî,‹İVÈX Çí}Ûï{]ƒàEnÙ"*Rµ¨(žò”3rúï/ëäĊéTkÌ£éPR:ċ<ÄŻ‹OŻ_~÷ëġbɄħ½KŸ½×-<œÚÎjCġ䪅ÛëÓß_í½üçÔsQIK˙oA^×Z\?~8ÓĈŻ÷^ŝÇĵ=ğöÇ˙ŝu4\.mág›ƒ£Sm7šƒ£³Ż¤ûJwğ„”ܲSÈRĤ–2]RÜÔÙ§µ\QoPœÖYànM(˨E&ċÄĵD—âͨA³lcşÎ´W¸LÍ=zˆ(`UD8-­:ŝ€ħZmÖ0›ġĉÌs˜>„âËġòŜ;ëH‰ÈÎV­ë:˅m-W+g‰Ŝ"ĥÂ:ณ8CùŬ=g…î ˘h†bhı01ÒÖ*à4ĞVK…DĤ\k’u_|ĝtÔĤg˜RÖÛĴèŬ%™Sݨ[ÍJY+Ôħp×ìz–^)jŠ^ɗ˅lĤĉDä 0â³À¨ EKV\ßġìñm˙ŭѽU­ĉòL#EF͸€èıKL×g~ŝȚĜâµ*˜4€§Y‰˘L{°_||µ÷Ŭ?§ċÍìö­ñ/‡kÈCÓ+›ÖÛŝğÓùèâŭ÷èۏe9eކş}ŝŽ2Áñ3iŭÉp=ġ—:P§Sߪ×ĴE—‡žĊlZîbö`µżĵÄójĊwžP²òI%žjj,än)ö˙'ÑÚĉôLEĊjàâbqŜï•Â2t·ÄÄBĦY˙=–(”pĉë,"ġžP3[ĜsŒ‘˙şżğ›``´´Ù{Q3ġ&6‘‘ÚŽÀ6NıȀ{³€^MÚCĤP…B<³1€"ŜÀÄ nysV5\Abƒ~‡7@†=ĊcÁûp4v½^Żhùbħ„Fv%ŸÌh@ÛÚmWŜéZĜ0m×ëÎÌÁ*ùtÙô8ú“{Ëd3MÄY²)­\!=Ÿ7L4B°ħXrĠÈì ŝèññŒœĞUĠé,éùŭ`^‡§š1ŞJ"óñĝ°p-­F.F[“Zw4˘òĉ£È½o˙2†şƒ~îúâÈĝçġż§£ĦtqĈ3ûŞ˙xÒó{Ç˙ŬÛûĊĜ8€RqĤ0‡3³§§ïß_Ġüc¤iï[Îh½²Çïŝû×Òp= âŝ²á]‘…Ġż8@âbQ-z'ÂĴ>³ CS:!qñe*Íz2ħ8[`Vš_01ìħAbKĉ灉èç@Iż8œ&3Ħ` –Ô,= tšŞ%4Ĵn3é!S~)ĉChÏÁóÚ°4¤òn ğoO‡m2)ş€÷îcCù&Aâ ĵèB˜”Ğ6zí2Ğê Ħ„-Tş=,s?şbІáİXZzb\&šÒş–/ ı2xœ›áħñĈm˜ŝxı˜mÚËı`+gÒ:œŽĠµL²°P8“OÓ%Ĥb Z@iî:$úLá×r'=n:ëkħËûŭ”Ñ5ÉùEAÉUAeȃ|аKïì1ô\ğÉQğJ/côûĦß1—1e˜óİóî£1òG#7̗Z+ì35i×wVËġÑïïogÍÖ{{no¸qW­ŝŻ?].³&‚~YÓò)ršĤ-/ŒSğ`6ĉ‘­µ¤àv$T&B²?”T%@VQ#ÊÂpÈÎn"ıĊ Ž}o%{Ş Rìàçfd)u‹fS ;œy´.€{¨ËÜo5èo°`Ĝ&Äȁ †EğYĊŽ"¨PvŜ÷ĥû\˜$ŬËŞ+V1ž<( IDATµ_ĉŒ7ÀĈÎaOˆJΖrjñç H˘Ì‰nġÔĦ:1^£äÖĴ¤òùÖ>)íĈÖ@µ”ÒêV·ıl_ß9” Q;™_ZĞhZ./ĠÀÀÓ­eı|Q+ĉ )20ܒ\*W/ĜĞb2Ná TwN…Lû¨˙hœAŸÈ\Žċ´†™r!•ÊĉYìÎŬL{nùşo -LĴİÀ5Q€À‰­‡^ïíÙĊ`êż}ûúï£*ĦùĝŒžóĞ/g6o(9–ß6>íÍĉâë½ûo۞*<˜×ŝ~wĠ;Ĉöèğ…7^yÖòìw?=l:•RµŞA_’RÌxÔş4ÎĵBħ^û˘‰ t_ħ *iĥ¨0@ežx_abħ˜âĴGHf+żìîJ[_mlAa5SB ŒEÁ%kh ñ )NÄ)QÑgèV GÒc˘WúŸ­çĉ SG?ŽÇsµ¸iâ•Ë·­Éš>x›q²³ez€Ġې #†Žˆ†°î7väƒĦ`ûp<ä|àZ‰é’?éêyh6üfu2#'tÓKrcÔ6v)WŞ–Ë(véäÈ0€ÚŻÑ?Ħ.,ŽÉ\ Ì£Ġ,Ìħ¸é/f:=ˆÜx·ħè]ïŜ‚Y0`ò¨îk™pĥBċ,4ԇíħ>3ŜëœìÙŝtCĊ,ÖMViçêĝìnê\}|ŭíoĈŭˆĵşğı||ożŭdŒmĝrĵÚĝġhNݤ˙óŜ÷ïoWA‰pOŻ­_ß]×f£_î½z?˜mVäâí•ñÇĞ?ŒŽ eC:GZrŜU½Ôĵ;ğġèjċŻ‘˘§D΁cñè˙gcô8ž@͜Ü^EόÂc\pb*7“Ĥ+û¸Ä–=X_yìmp_„2ó "Ùbµáħ.è˜ÉŜIÄX²Ŭ†CÏB”ĠX‘HDH™é•ÁŭÛ+¤a³bBgğ·ġR[„ì*ˆI··MşĉÌ5şżóM!$`!rŜ{Şbħxa³ô­Pó ż_ùhÄ6´‚^Ġ°,1ĞUr”ĴĠ ˘êAʨ2E—JÍlVòP´…(´µ’Vnv­Í•ñî½ñvċͧ.³ïmĵ’ê&8<µ\†:b5Óf§ß_׺hfĜÓÉoÎÀ?ŻûG­á²EÖwïŻĉ”3 Ç×Tžüıßñ¨&ÈZŭŜ.;½;*^ŝu<ßFĈR×umżeĵ§*ĦĉŝM‰Ĝ_çMKϞwùáġ·/ÜÙ˘Qe¸VH¤+ġĊàìzĠm_ħò˙Ċ/&z!•Á 41#lÂ3–&†ÈŞyx”+Í'ş¨­ÔdBÜY\qÁ&ĥ. ġ@˜ÇéÜوPbĦĞ_ï.E´b:Zß½}`²Ú҃éß?ħMîòuJEVżÌâz" –'b²ÊµŠ 2Y]ž6aU–Ħ‹,8Ùé ˆ+`ğ÷O¨IBsÁòxPÉtÏÜÑÓt3œwQ|€[;+‹.–‘ b#tÖĜHj2ÂYÓEĥÜ´ 8cÚë`Úe}Ùyc<ëŸŭ—uha8>³w6Ĵn·Y5L 9ÛĤëôOİJY@:ËXÌğŝàèѸzTút4œSáÓA‡íĤ˙Ûğ‘µ/š τë·ĉtmŽŝŝáĠÏŭİÂrÖÄzĥÎOĉĈòöŭ÷/żŭħ?÷ĈXèꎌ?öl1Ĝ’ XÊ:Óİĉ[tSNéM-]ÖżĴ’bESfIÌJV%¤(Œ#c9JĠ̏&#E4Ĉşßô·°ÎäžàeqU`6›Ş³u"ròâ.O’ì‰D‚ħxF+—š ‘G ŭ½0˘3e5˜ċE}ŝáö^ˆż&,Àƒ"ú&–2½Gk£-mħö=+ž‚‚Nĉ• )•TĜœp[·˘Ĥ½ž€X½öË@nY öyCGH-!Ħ½˘Rc¨é|N%=h]ŜˆÂ6ŬÌlÖÊÍĴ†códÖĞàFœÙV£Vm,,2ѵò}gi.:Ĉ£qzϋTžÇĞzsgi-< UmĠê FfÛŝÜ×Ëm£˙µ1(Żĉ,]4Ŭ,F×dMÍèò°ÓkŞ—;Ёñî¨sò×ߗ–7„ô§Ż Lzeğ˙ËËï½ èA%7êŜ˘Fı Ñ˘âcöĉñ§—/üġĥ;xé]}ĝáċ/Fen ğpt½öùĠ°‰urRĞÙÄrĜb]P‚×&·Ĵ(’™%·ôèOäv`Ўs qQ Ea÷47pv;$NNnÍĈ(1AA’ML~Wñ?ñŝÑ]ë˘}JèôÜ<77fLgœNëLħĝ<í?˜ÈOäû<:dĉö–ĞrÂLö` ˆĊw;Jš­uq9`Êġd"âÌû¤ŠŒEu*É p˘ĴœqçĉípÊ( Gt8+rB-¸`LµÉ:0XômXôŬ…hñÌǛi§un<öóŠĠfĉƒòk{LÑ:ÏSAıpç^MŸFKX‘Ŝ~ŸŽ7£ÁIżo 6g@ç‡ŝzÓoôżŝe8ž,s˜hċêóÑ|yġë÷€'Ž™xËñşV­´!ƒ•+ž9˘,íċ뿏½.ŻBY²¸>œ™DçCËy¸şZëfNşšŻX_‘vH%²ĝ5 Ñoäñäzâ ^Gbĥ€3ïĞ6#ıYW&Ĥĥr[¸˜Ì²™DT‘-ò·;ìĊBœíC5€€4LĴf‘—˜‹J0òġ÷\%+˙X’¨3dYĝ^{"ˆÖ K£*ĉ^ŽĤš d‚ß••0?bGdĊÔÀÂòÄÏ#Ù6·|'w-Pċ)z;Ħ„kŻG,ë0_Ñ÷(In: â opÑÂÂĝÒDûpµ\ħÔÉĈ›yŭiƒ9‰ş,äŬ!ĝ@tH&o Ú}Ünĵ^s ¤eî>ï|Š ô)fĴFħ„ŝMwbœ Ħî÷ĊMĵyû´˙šSĊtöéšYĞÎĜë=ĉG˙zŬ@ĊîÎ6÷Ĉ'cĜ “\vŒ?ż}ŭ8a ħ96ç­ʀqılÏê˙ĵzùíżäµèœ@4çìϗ/3Ú`ĞĊJ{İĴĠ:§Ĉ_ÑLJ8kP²,íV!Yn%°ƒaA]áEOşÏš2™”Raì™bçÖʨ:,Ö²Ĵ"‚Í*@c,ı0‰LÀ:` …ĝZ)Íq_ŸYĞ[O_Y{@"šïXA²Ô-ʖÒĠBò?¸ın1K+7҄|g͔Îç?°KCXmŻí-í[8À³˘ĦËugg=¸m‡YpŬO:“ğA{şċpZ_ßĴсgQ[ÀÌñ8˜ÏÉ+ĉ.YHÌĦ£ùäÍ9 °gžċtnÚ@šĈŒâgĜêûlò£X˘ôíîĝt¸Ĝ ) {o\ğKÊ&ßö~ùŸ~ÛélÈÂúĈdq×˙päÌV—öÄxg |0œ->|˙í_GΨ^ LĠĤçŭ†SĞ{3}Ŭ˙ñÛ×T!ĝ˜èR˜_ż‘O;…5{ԚÖ}k×^µ‚‘mtÁ—ĞÓ)QÈÊdC1LuX2—‡Œn*Œó¤QA.’Ÿ‡ŽB),T4ĉÎĞ´f‘ñ† 7Ê8ĥĈBAL&CRVRı˘Èk‹ġ@Ñ/èu”œÒ{Nè'0¸{E SĦ+Gè`0臗âîEvyÍJì‚zCAœ°züş­Ĝ7Û\yNxŠıQİpC4ߤ‚)˘ë”9ù¸5ĠĤTRìJ2ÛNuċˆIÍĜƒÉĴ›2)¨K ĵ´K°MÌuşÁċħa§—÷^ŬŸŸĉŽÈvî:Ğ% +ĉîÁ¨Pñ9+pÉ.רG‰žĊ=ZlíO{½qçĝïWß˙úfÙĈŒ‰ò0gsú+ôZì:ŸÎݨ™{ŜÉ_/zĵ™ĥ‡8Ġ…Ŭ6Ŝ?žôTm,–ŬùññÚ÷ÇÑíNŝxùÄ{AÔw;'}mwĈ-—şÎŜÁùrEİZdb‘hœÑ:ÉxސRŠdJLŒíPrħ§ħQ<Œ>ġï1ùĉfWĝ3V ˜ ÎÉD )Œ0—:d1€²#Òò†xĊ†ù·Ĥ ЇÌŭŽ+;°öħYl p1,@(Nó!SŜ)E²Ĉ›Ë·üûz´êAġ]Ä#ÇcĦn)E[c/£#÷9NW½‘`9pwl ÓoÑ2mż½<*ûnŜµ½ñy8>żs}!]Ċ;çeĥt\Au;0ħYË0î§F;e|}BÂQkrëebüñêOc´l/ûF۟NÀŞâ ×_ž?>^5M¨PâòËËŽÉğıô:çĈ‡ŝġÂĤ"cĵ>ùĝzïġ§³%Y"Jeúp#Ù[‹g[ĞÖYżtïm f`Q]lÀàòµĤE&+:ĵGÉ[ŜÉ\’·;â ìf0QĈHÊÄxN$£¤ì“63oħİpcDOú×°ĝ/11ŝc$’ÈÒĊòlE¸‹ëçıc%Ù2‘ĵ‰×Ôe– Vz§ŠÔr(²‚* NÚL˜OvıH ħJqY P…yÇXËk>úU˜èħ‰ 5]n(p`F¸áŬ’Óŭżıa‰¸/ö' ›žò68٠ʣl·V§˙¸ÏÚµÍ:¸w´:Â\jÏñ—Žo™˘{AL-S„Èe§u{Žüëĝìöĉ~ÊANӁĊBE`ħĈíöÔ3M™“+ ñf1ôĊ ŝèò䄞ëüaşà¤5€ÒÏúן˙9OŽû§äÙo/;w·§†qôÖ­-‡sŒS½qçŝúä´EéÀŬíّq|ÑĦ"ÑvÍŞg.ŝùñÓQÛrÈx( ’‰­6›Û_{8ÓÑ´98ıN;P …b&ÓkAËyĝĈjeŒ¤€‰Ò2 Ċ)*e-,tq5(bˆY:)ĜYŬ˘,ĥîŒyW(ŬçÖ+FI[LP&£aìUcÈoûoY_y™Œ 5ıëÄDˆ 8ĊaŠ">´ŜY²=¸Lzw7IÂŝd[xë)bl< N1BŜ†‚=lÚecC²7ĦjôöòMk9ÂO6uxCÎdı€,cŬœ5ġ¨œjLp†‰%f@%ӝáplß^:îÂëúÜçĜÛzóĉíĊÑÑéĠí`ê0Ùù’?˜´kp‰bΠ=ï6ê3ĞÁĴŒ6˜m…ħR1Ĝún4›ŬöéñÉ50˜Ž%âÜòxûĝİuK^éĥ7ç 3y¸ĉŞĠ¸êéO‡TÜÚfכvzĞÉġ›Ë32ĝ³ëŽmHÜħĠym-›\ĵËÙü ĵëËŜıqt=ıĵéVü•ŬĊ”0…0ûËŜ×XY)•Új{ƒĊ•·˜b Û"jì-şFĵ™$GvcÙDFËDŸjÔ*ğE#FcĦH8 öƒ[¨Ĝ6œ&ÒċrĦXħè‘h u`êLŝe”Éî6loIn³~Êĵà ‚oßĵmŬƒN½uÏÒş÷ĊċÏiö 2ŒP%?P…]ĝûíŻXĵȃŒFüĜíĊí #½ìŭ€\*DÜ͞™•B6W˘'İËċ²VbsĞéZ vÀîbO³fuż3¸lÑϽû7çGGG'g7—Wo/ϰJr·fé¤ÒĈ—L*dNXXŸ .qnc,`b˜iwV–§„)i—>?C`—Cr˜6&XDž ĜڏÎNÏŻŽŠdtozĞŜ-”dŭq óF‘ŬôèSı÷e8yĜ@ş9c°Ë76ˆżÉàĠ’ċ vĜóÚ­VÇkÖÁ٘mÁJí‘˙µġ'À'F'$`äĜòZ1—IÄǎ⯎‰§’Ž~ ejî„ŭ'̅`6˘ĴWCv‹ìö#aµH˘L,ŽeS…Lô)ĝŞ7q”…Ä˙UÄ\uş6ìĞĤë Ç)]ƒ’u4ĵǖċŬàs‹˙ž‰Ê™ê’òñŬğ)È Ë:îĊ·zÍdœÖÔqí%ùğöĈ ÷#Ï#!9grrüŞéd*•/ÓŠĊ|>]€°iJï¤a/Y ³Ŝ Ôż’/ĉSşŞŠ†îΎO.ÛSŠ›í“÷d²ÌİK‘ Ò0„Š–Ç@:]ΈŒÓ•µS:5t-§iyĜ4ÂZ­BçħVĊĴ“µ¨„2‚ñ›ÎíU M€†açn§EyKi‚´NŻV4 €I8ñÉÛ;0bçê€ôÒİÓĦ™a" NH[ñ,³ÖpVġĵÎP1à‹*M: aÓŻr½Š…e·€ħDŠ*=­šOmc£°îo;bbeí;!ƒÙ½b•­‰Ċz&Ĉ2ĤÏäÇ tJKrĜ)î~OÌ]èJjÀğv‡Ár]ÍkĦĴ‹½ îI0iq!Ùş ĈMŝÁzĊwEwyD¨ç tu`Ĝ(•*ċJO³ +r ĝç˜ݘjtŒ7‹&`Z13–ÊiĊB:— e EM˕+M·N·’ËhĠŬĴ\8‰‹‘ÉWéë‹épÒûVM£“şg5)ıO)z›5rĵò‚Ñî‚Ò0Í5ßíĦ´fiì}x32îLş¨•`ÎtP` J@çĴ^Żë JF“ÌaûĠÜv°Ĉ… yëL;c äĈ›Y%—KĈS:ĤĤY7=³ZTKĊŠVӞŜOi°Ò–µ²ı¤@9#-²ôJ¨CéT℠^0Ntà€PÀ„Ş‹ë>¸²ÌˆwË7u@JE­N¸"ş:eÀ£–sɲnîÚL܃Qúd¸á<Ĉ4mĞ P)&‹e"2²İb:_§+ġ.6E˜óéĞR°żgġ#´÷!¤áÏÈÄèĉ²Y•HòqI*9úÙÔ#s->–ŠŜŒĈÒZ4ZħÈYQrmÁsŒXĉñt7Âm°Á;˜DŞf 3žÏ—X—ûPİî6Ğċb2 £lŒL zŜéŒFw´F81]†-TH!²Ž²³É=°żÒïa†dÛĴjıD(žMä‹:a•ĵĤç£ı<Ĝó9èIq=}Ís—‹†Y×é02·Xa4£cß´]ÙPÖ¨#ŠŬč¸í­f39­Ĵ%cާŸˆİDkkbá'‹ò(Œ0Ç™ĦÚh‹nħŭ“A‘çù7ĈG²·DĈ·VĈ#ᔖ‡Hı"ŭU2.Í^³ÂäìİTĦÉ“o^Sƒ‰Ñċ­ÔŞZd Ûeˆ*O1XC4Ğu1ûhzÖµdQGŽÑ5Òtkajİ\*›MkşY³—Ü Ĝ0ÛÀ´×fiU&ñ4tµÁ1h]Ì%ÑŞIÒ0)i"š[4ŭn ŭùR*ĈÊÉ…R}aêĠĈ˘^†Aä2É ı=fEŸéÖ|4f0J•çKÖ:ħ7#֔ {·ıd•¸j™N;ÌİRè´RÑòİ´–Ïsİ`ŽŝZn€kƒÏ‰Ì:ĴT9!‡ÜîöÈ]€Ë*İ|!•[’=c*‘. qTH“O.VvŒ´e-.TôB–޽0qÑé`Vè¤7ÍEĦ8/ñ|۞QÜĤëšŭŞÌVR1>a²Ùb\Î'£ öš}rIj<ŽDŸxaÑ1‹Ċ¤Ë'Şħ°p,À ÏJ‰žsqtXŞÜErĈ '‘NçÀ—ŠBmÖĉt|éÈvJ* üz•ó:dù²DU:?5pöCʨ£"d‡ġG(ѳ#óRÉ<ĝ¤aatn‘ŻCY'‘ÉĦȘm56>Vĉ¤ZÀ  ½ħĉÄN7zŬ à‡ĉnµ›•Bœœ"NŬžÌ~‘dš oRPx°T’Rıbš2JÌñÊ[ÌĦü÷x ħm X(÷­R :MQÖM$Hù"9öJ`ít–œe\EŜ’ÛµŝÂÀ(ßE U=f菗IŞüc| ÑH Ôıêğˆû*jùL8£ĠÁZĞ›ôŠ$ĊbZzXôdô0”¤dĊòpi€²ĤùĠî~2‘QÒßáœĠL9aFInûBit52)vY Ġ=-ƒ0!ıı@(ı%¨Ž V_: + ZF"Ñh(šäŝo,ĞUh5aІâŬ˜L< ½8úd”ìTët˘éŜÑmË3Lı˜/™ğ^FPĈô"VâÎèeŞ—éÁâÄ Ü]8p\PTn— !çûoÈCÏ{Ĝ×`ĉĠıǵhݘ|J bgğ䚓EôZ0ż|Šŭ/eÍu-9 @p,™×+äş2ô­<Ò8†§#k'KWz=[k(Ĵˆ5÷Ms%nD-ŬĠgΔ²ó|„,€ÖL§ EKĥW-À !|–k­ËZfŒ5D?œ! rKa’Ì<Ĉ½8ĤäU³ô›–fäâ%YnD6˜ÔÈĜò0²*$…2Ùà~$†èU €Ŝ Ĉ3ù GU²4(ÌżbbĴÎÌmÖt/*”K”{„ıġ}B´ %'QğJF%Ğß*÷Rŭ°h(Ŭ‚İ£X1"#7&1°[ÒwâIHĈırĠ¤7N‰S9|Q€&”#䉨°ÖxŸiŭ]+$µĤ‡Y†¨>Oîx´y'²‚ %3uŠQ9܍B>–Ê:ÇèĠ˜ġs%È2žCÜ1'h˙y:$?Jù$è÷XlŒü0}àLž)e‚f‰qĥ‹|ħ’O†v‚”r†İ|>•ŒružÊĈ¸Ġ˜&£¨c+LŜš·ĤrT˘ħÂĠŠ ·=À›ĉV­Ì†„@†Q5Ó)ŠÑѨ• +uŜ‡*SÙr­)`oJçzÀN‡ónÒŞŒ0˘ Ş•2A3ir /Á—Ì ›W†)M€!x&G/šH¤‡Mŭç;(֐…ÈÜâ”|ÀĵÈ䙸÷‹`ñb\6b2I&AĊ$ıżxX4œ?ψÀĵ ‹‰„U‡" aĴš{?-~Ğ>ğ06DÎıŠ(ƒ¤('bä$ä€a˜{ż”Ü”°ŬLÁ­ÙĈédVLĴșnž\lİŠeFrM”•k6˜6Y­û½ÁùŻA³˜Uáĵ`aY*“‘ï e2İĊKò1T *%&Ÿ\€Â)¨lÏY˜MÓ¤D äê0Ëf’é\ı”*7—SĞ’LiċR1WÀ6n1'û îïFâÉd4´{aöäc˘bä) >W-Ô½Î=Öß)Y²%‘XŞDĠ ·3éԗs1ÑiàiwšÑ:É<… h%ĥŭSÑùŜö,"agFJ덛ĝÑ˙á@:×J‰q8Ä01Βٙ‘à7Î^Lâf–Ó:‘ˆ5|X"úyÓùbğ„:Uŝ)öTcÓŞŻ˜àrf2"l„r}Ç ·U)ŠıD0šÖ€í…_¨šċŻıt–RpB,<ŻKÉQ‡j…›‡PÀ^; l/Pö IDAT°×¤7Dw'ÈX$”P]é ת ĉ•.fjÙ(}° }ÀŭƒŬŬƒClòAŸ ĝ L&J<°ˆmSe’Ct…âĦŭ}ˆğ€9:8¤Ï@÷(°ż £Š`…ì0Ĝ=Ü'{‹%RİXÎ=NĤ3_I÷ÓT&e“O²ò”¤äİ€zÚĈewĥ5¤ÏÉ|"›ŠĈT’Ĵ˘@Ş‘Iˆ‰ÁG…PDRΓĦ ΙŜ=p°aÖç*ä(Ĥ#³DÁœË6B2ŜTxA/ž§,eLĵòȲ…Ña*ŝöXú ‹:j1#ÄE8ŭ œ?ĠHÌKHÀ 9¤dİ4gşĴOÓ—k›ğc‚‘nl´Vg”úpföA)DÁ‚qèİ”VĞ#fçÓÙˆi&Ċ´–HiÀîn ¸€{HW ›Ü}ËfâQîċa× ğëŻxß۝ôғĦĞPÎzèQ! ŸNшL+š5*ğ‘ëQU—-şÛáM4CVµX‡Ô– GúXPılħċs”VôîvBÙ8½ÇŭŬçôi"ƒŭŭ]şûÁÀA$Ä%:¤ ìïî<Û9¤ßžeL6v°³Cvw ‚ VŠì†(ĝ˘‰! ²wöfYqjгZŸ¤rıƒ‡ çŒÜR‹…·‹â˘OÈ@úRDÂü³‹ĵšÂğÀ`ŞË;d8YJ™>N3ü ˘LċıW“Î@Z†Ş@N83ĞCMÀ.¨ĴĵğŸôĈĵ@Û¨‹£„%Jž PÎ]ƒÎ˘UùgŒ;Yî6f lƒµ=áE9ú}è×A˘Kςqˆ?Œà-³I2NîC+óH3Â:;ô˜ÈááÎĥ‚d™dlĦ0ùúù` ÚOéÊÌĴ{+ŻáŽE/ç~ Ĉĥmµ„{,+uÔü+“4§ÖTÄÓĊ S´/DÙ£lİTİ~¨Wrs Ù†9‡½.Ġôîı´ š#D5‹²•ŭƒgÏÈ/ѽĜÙĊ™aàùı.úÚyñìàp÷`ç07ĦŸÛßŬĦ‡³[ŽP>öl'@wġëŬ}YŸÜrX(i‘ÓċDR/ĜCEê0› ‡UgvĞ"áRñÖñ‘Iç8o2ĊáĈBL.FíàÉÄĜÑŭ°F·=&›èdbˆJÂVôÇÉ`ùĵĉrm…y RÉKĊ”ׇ÷X éŒĤ `yY~~‘qá(:IŜ°’h†B^И<°qœĦš´Ç›ğ‚O•‚bšSħ@ˆóJ2#NPzKk˘’‹A*6ħ 98A”#á qx9ŒÄàöÉĉ˘Œ.(ŞċĴĝ-Ĵ™/Êál4fĥ^Ì$3 :Ahm’Ğĉ’q–.ˆbbBÏĤŞLˉ}qHÎÌ :EQž91ùżçx”Dĉ ġjèœtż(ıBµBĤr¸ËvD†F&ƒ€rïD˙|°$ó;8xAßĜŬyöâ€Dï6 “Ë;„/ۉ0Ž9šî_!Ĝr geFÉíT™>&ĥtšJ%)ĴĜ̟ózôX’Ÿ9넷šWĈHd Âܐ2(6Ù ç8Ž*ƒ ï'òéèA$“‘Ŝn·iAlšË„ı0£8™Äĉ›Xħ U†½î´ùÔ·g5ô-‹é$"pšÏÈĥQ7ck@P!Ñù| 4gX=›ƒˆUVTíyĥYɧyuâ_$šHĠ]äN+˜›`İÑëa XO(œËä |DÁàá$ĥTSĦëBċĴY-c5ħğ|(|+”Ô“ĊFb™EñÄÀħ06ı}ĝĥŬÀîÁÁ×a„Ŭ½ŭÀÎY(rHŝ+ž"3 gŬ`6£|óù‹Ŭ/Ëlm—rˆHBĵŸĞü^ Ğa[Ğ^+ĥÓŸGI<•”ɸĜßiM phĜ„AĞä](J‚é$ѕgÌELxÒ)ÇŠ,6ŒşEÊMÊva#€ħ~D†W?yá€ò1™Ê‚-xƒžàĦñÔï˘żFQ&ÉŭkD—³Rñ)áĊ*>+T6hÀMÌ9’vëĉúòöv0œz}Š”†ñjV×a&Càc’ÜLÙljéh0z£XD™¨ß“ĠŬJd6ƒßVJ_B‰KĠ[%h^cé$ĵÍJ²ĞĤŜĴWKl/9:‘™&Ÿ DĞ—ÀMŸE[ÍĈħ¸hV…X4_ğö̚ÙĤĤƒ3ÔŞPŽ\(!“L3DE<~ök˘ÈèMĉuHÎë!pw÷Pìlç9{1É}Ş]M25:"ğát!ĊVb'”`ÛÙ9ĝ²@MBşY6ħD4ù4gœt œŬB§Ÿ÷ĠâŸW‘xҍ>ğFŞO ĜP†Ó1Id²ò:âß ˙‘†ü= ìŝ^  ~,_|çòğˆ‘Ïyöœ\Ù.§IµËá>ŭ™a˘ÓġŒÉ´v#!üó/›XBîĜÖ+@ŝLmM’‰EÎ:˙<ëĉà•‚“ ,î’Ġ„c °m͐Ż'Âts#ä˘èêÔ+`P<Œİv-˙%7RE%ş¤ı-ñ†DL2Ş4r~Ĥ£äq”A}X]°j%`›´<*ÑäYÓ8Œ?\‚™äÈx<ÚĴ5,Pv³ûġˆ½Xž_2™àevNŻè£'‚–1Ğ ÇrùTRVĴbŒ×Dí —qž:Ñ­Œ%ÍĦŸOÄvží‡ıt–î>8èIr´’š3h.Ĵz™ĵ6zhı‘kB-µÀ+:Ü·Œpüċë%µ÷ ŞUĞ•™×ı›ú ¸5KYvĦ¨÷İş J`CıH t,M„ğÏ9%£Ìì`)>™Ü×!;/ü(çl‡-qM Ġs˘Ĝßyó5 ;†Vg„ç5™ĈÄ69oĤ @N/ҁiUˆ)Ôa2v’ê¤b ³Ž EN:ŝg1„Ò]şE”?İşŠsT&Fċ@V1Çĥ-Ž8ËÂZAáeMòt&Ï„¤Çġ.…²DQœw,PR>iX·Î£½|Aêü,V ž47£2¨£żr01 ĞpëĜšyX†d§·ŒY5,° Ü Ż'E‰w8-Qn+ĴÌéR­Q*¤³PĤ@OÉ  VP³ ›€˘Îš‚Z6Ÿĉŭ, V #âȲvìíÜh2—K†‘v`Ŭ†ou2#ƒĴΖóĠhcÛ¨ä3”ŠÄD$ß'…žŬ!§d‡Èá) "Ó:ä"àp÷L^"9Üyq€/6FtǸ:ˆíż ż…Ĉ §£TS~]~ž{FĴY$ôûlbÒ{²1éEİXTÁ‘î?ikqÓĦDÑïDy;7 İÍIä°ħ·ÉhŭJ(ây”‡íá*œ’"bÂìAŽg_–Ï•Ĥm:_֛]2Úb³éÖş ğ–OKĞñ…ŜkèPB5Ï! BBĥ(óĤĵĵ˜iùĴ'wÏ:ƒK³ (^š,XˆüÈÌ3ñùîẆÏ+98<î$RµŝڔQޘ#a ˆÉrEŞZëB8žÓÌJ.­al‹d8}QeÙô ï;3g6P0‰LkĊ²–ÚJËʖ y}şċ‡ÁlM[ġÁƒ]T.Ù(=mÓ-Ĉ|è£okÙ>%& 9ĜÂħ}Îà÷Ùd‚ä–öá½`q‡l?ŭƒçϟ?; ë!‡÷l‡í ˙={ħÀÇ žQ˘gˆTŽh`÷ˁ4·Ì’(ŭħLF‘&f·,óşġĊf8\6É`ô™aVí¸ì`Ĵ Fş€m,IĤSPğ zñù¨7†S· Dc³‰èUŽ|]ŞXÉgé%c;/‚Yf€‰p;3À_AIżP,bœŭGır­–F‡ĞR³°>R5Ğ™]Ġ´—Ġ˜Ħ×jêE­iy+á%€ÜvNÓµ€f.Ȑè…xú†xdzûœŻ!ҍp&v°CħŸw8Ż[Ë 3-İĴkİ0Ûó]*w8äĦf Rxáü˙ˆtlmX²gä§^<‡6,ìïùsŝ)üéÙÎĦL²7äk\  zĝJ.†/h‰]îB°ÄĴì>ÂŭDĊĴPğRêEuD@L,ĈŒ‡ĦĝVŞ™ZHL,ˆĜîAHá]q=BJځ{€‘]C[|S}€–Żè<“kïÒċÍp•›MċsIÁù ğŸffmt €èëĠBi³7o,Ĵ>PÒSȰ”~Êg˙ ĜOTñtħŒ?Ôt€œ7Y§^ĠRY`FG— ú'a `b!‰3û\dħëM$İ PĴ›Ġ|ÌÜuŻ aŠYUHù-Ğáğ3½bùğĥ‚7ZÈĠŞFµJŠĞq$<¸˘+˽)`9àx(pĠ-en€ç yG—56ŽWÂŭÙG‘op2ż{(?˙4)ڐÒŜ] Ÿípۏ$ï%…2ħù’Îíçh;_Ĉîsş} ˙°ÖĈ 9(‰ rLŞĉ¤ÒGà’3 Šdd°5˜äáNK+Œ(>ɂ.ZE‚AĴE`I.RF>é%áxa3Òzʨ%àĊb òé!T‡í°2—Ĥ\·ÁwÊŜxpÛ1ëÈjJ(Rh?2/Ħrŝ¨Zç Äٔ•êàCġ睇‡ŽkcҜyß(ĠòR™CÏÇêrJbqL!qŻÄÄèf퇓‚ï¤w_™Yş–€qĞ^ŞVŠĊRmĥé9”ö-!;BöĊ”·QÀe=ĵFMËK˜£:çž~”wmJÉĞñU9,;xˆ†p4™Î—´BİnƒìÉqŭfŞŬH,[Ì÷9„³âžŝsdZ”›”ĦHġËòUP2´O™ÛĜÁadĥ_µ+%'CˁU:ÄÛ ûrÓ˘ ÙLœÀfDÜ/*Ġ!÷cÒZĤ4kT#5*²•=ċ‘S7ˆ&Ïè"ŠŞ.(} ŜsÑph_ÂJ$ß:—íÀ Ĵ˜UÂqñŠg9%Àêh˘ÈE|!›A´¨ĥŒsŸk§0•.1ÓN{ĵÀúB­ĈxODq¤ ~+ĴĈ(T3Q˙W …šèN:÷ĞesÖµ°żò,¤ü%sƒ¸ {M%)u×üÔç¤pñ‚;} Ż˘OÉùc&•MW­…]ŻRùù½<"½ËJ½+ädÈTH‚<Œ‰Ó9%êVÍ"\>'˜™İ—ċĉa€jÈ !xA†JdcħTĦXÊgÒċ†‹UMÏ*eƒÁ]T'lÜCH¤ó°‹G/T0ÜTĜ…ĝ5L˜Ĝ¤$;”`A™^’÷äD Uċ˙‰ W÷3)ebĦ–@,·?!šÙĴ‘ŽPŻÌĤúfôKŒN@Hî¨ $˘Pu`ğ‰°?ŽH+7„ üdtÛ°Šyü­xÈ˘Œg ó|9ı\,ËÒ[‚\ ĥJrĔ°š”K+&Kó,G½ğt½Ĉ ÍqÎûC)ij`BW‹R5ŸäíĦâXI²8Ż ñÒoğ[§Ì ôĝzİéu+,éó²nrQĵÑYÀÌċ€’ja`}`1(Ó/¤-²t³ dYŻĉhBä³^ŒĤÎ H2³ô€„Ŭzcħ˜DDIŽ,ŽL ÂdÙpv‚R]$ä:ñÙÎ>%Qìv–´lĥԘ÷:szżÙ7à'ÉžïÒûB  € v‘ˆÀÇsƒŬ ı6˘oĦà÷I—$iìĈžS5Àı?Ù6žêJüë 2ħ_!âüÌf‘áŜî´â $j q@–ÄvL‘u7İÌ ßa$Â^‰)ׄħ$ğdn^(D░LĤO‘}ŽŸÛI ó^Ĉ’\[Ĥ:/„ó3%Î<ĵà˘ZŻ4à1h9Ŝ—żżoMcn!v´Âd.Í`[ĝż2H#öRİçÚ¨=כù,ÍĊi@n².@s‰-¨2ìßžMïJ…[L’ıSĦh9ËĊL׊é³î“À Ô£ôìĜ7Ök3Jž˜<s2q0[21lOS°0V!ċÜaP&âTáE•YšÎI™Ĵk'Ğ …çllµXI9½v8ĝâĠ=à Ş@!íR_°° Ÿ dŝğ(1Ÿ’³Û%³zñ£Ò€Ì’“Z’ĉeħ#ŝ4–ÖV`&“âç5œ—TÔeYÊÊ€ sˆŭâ¤í%â#ù0gì b,Şzj²•„bT,ŸÌ¨ Úç,u$ı‚@ ´Jı6›uİng¸È x‘½V×ğSD`|5ÈÄĈ˘çîL§Ën£ÑÔLoáYu³áÍ*E*à›ŒŠÂù&CPa‡"ÈÑvƒ‰älrù’éĴ{n·VN%"Œ·§ĞNuâŞÊ]zwœ€Ħ@ĥÄİĠ÷ɸsq ’.ÄHİı àpÊUäsT÷!”"_ݤ!  ‰ˆz‡^O0E’PzAê#†çÍnɛ͒$L.9F"ÉsW$ħÎġĞDX9à&§î–É3wîÁJâZ•Òs(™=Ş´û÷¸ċOQ,ĉ³‡Ùdè*YàqL7q÷Ĵü 93LJˆ½üĝ^Ĵ-ĵÉTlV2â7^f³IWÚ?÷ÍÏ6v+“Ö1VmE’Ùu¤ŒE´ž. ̂˜}ü4%%ç”+,1ÊQp2>BLlà(‚vQzúö”ú½‡íĈĜĴ`ñFS2Ò5ožT°zğWC.*n fƒĠŬÁ"·éô‡ŝ •ÊŸAU‹6lQž6ûsĦğULÙġM%gÒ$ĈĜǎCbżßCÂ%F!fw=·RëŽAáGKĉ’ù Ŝ´ç ŭEpĜC†*Û ùd@ڀ‹Ħ ށ„ÇsÍUQşpŽf·•ÏV)PÒ8ħ›­9}–Ÿf£pwWĥˆ!ĝdŒžÑ%jgĜ:öH…ç=ĥ…#‹M]9_4‘‚ÉġEħhàÖ¸^ĉ8Á ¤îXGîçĠɔÊğO‡˜ı=6­ˆjW1Ġ)FgĤBV‡B›sgF¨ÌBo<vŬjf\hÌòVġžJÙĥccUY–Ĥħ7kEıáŠç#f–! ^x#–À`ĝ ĝ´JâCĞu@'1@ݐ=}óˆŠs„2ñ†op$ñ²TR‚Ġ”W=Jĥ›óBşıÁâ‡Ù—Ë bYaCWîLÓJ P‹ó̆ŭ8IĝÍjž€ĥ÷/ iíJ;q(5œµç°Ö'ázÒËAŻJ‘­Ñ1LèexM§vŽjŽŭ’6EÊ< IDAT‘ÚlċyŽ,ħĞĠ¸‘àÈŜ÷Gíz%wġ‰Ö:.=ÏÁĝTĞ6m݅޽DÒQ†F,sM\ĉŞ>ŸµĝEŭ+%YGNÌFrf³Q Çï;íĊ>zKÖÀİë4´2%°,SнètŒá7TY`~%ñ-k|˜:Ò#d˜ù620~:‚K Yn³DĜ&^2,Ùċ—ĝÜĠŒ}¸î|ëàŝ=ÊkîżŝšnY”“>Â]eEŜò[è7½†²Ž´è糤´-Ü †Ï>$P¸œVµ*ñ%{˜IŸÏ”ċŒŻ´m bÉ-gäGh‘‰ŭŝïÓPAvoÔnV‹ċZY›ai/KòB:n£Ô½6 AòĜ-Îç3Ĝ/i2¸˘ĝŜùzMûë ˘ÛŬîp>ÁW^ŝùġÁÄX %p½v³Ñl²µ¨UP04-@Í“\ĠÊċ ¨U·šm@Ñ\ÀE-Û󺖂ŭ ùâóƒëVìZt¨Äxiv­P‹Ÿ*sĈŠM^ŝ$0VƒĝƒĞĈĜZ %ĉ˙ŭ#”v^›‹Àp6ò:nŬ–F)á̰;§üŒ1Ô$kAƒYú°kI’@…˙}2JĞ/=!pĥ­2×@T”ġ&V}ÚꎗÁ49ÒµêĊPœWóéHĉĈ%çf’á"³ıžÍBì‚,yĤ;À2=^Ü CHŬ…á|҇ĝ”ıx ŭ¨h”¤ïîƒ7r#„RUÒFW’ŞŬó:]îcmì…˘Ĉ" ›âBÙ˜–KĈ˜´ùşÓa3÷’$0DɅ,nĜˆċîı.ûTˆ9 1Û¸ħ)“ĴiìLÑĦ¸9Êpl·ÍA€ëòşÑŜTqÊri†t˜ÔJˆ˙P´˜äŞü}$÷ç£Xġ9ˆÉ6…ÏjÁddŭç7ôž„Ì# Ôôb>lé‰_S Ù½…U) ÷Ô{QÇ Ĥžùc™àyz :p8Ï?ıM“ïzŠq˘ aÒqı Éĵö ÉÈë<ğ’kÔK€–•‹Ğ]İTï-Vy@µiê´Ĉ´ıXşĊ!Ì6¤%£ĵ 'ghoJ„tò\ÛGHe'éLó”ƒç1@öċû0öéğË ·ĞJh_<RZÒj€óR/aލ”JŒ˘PÊċóYŒµá/šuĞĈ@D£E6R£ ğ{eŒ0‰OdÀĦO¸żÓ †SÒGÛ}×6ÖÌNfŝgĜjFe@eûmm$AĤU­ZĈ+\[1@—Işİp/DeS(ġ&É ŸÍ †=È o ”ôBÁaKıŠaĴÔ[ġÁ<  ¨ps6f§_ÓŻts4:,f )ö¤üèÔĥ;;Z}ùċWâŻAöy'uF‘R5kŻt÷ċĞġE ö¸mÂmâĠŭaû´IqÍËépèğÒ4kU·YAä°‡¤l ˘ %òçs (`c‹qñŞ[ iBŽ=šNÓç@½m¤H˘ <ÒrÖâ”ACç.pgM š5ż—ğu™ċ i1äĜíô†Ŭ*×>8ĝa2^Îħ• Ŭ(a-i–^e‚˘5rî †Â̕y™Vy=(U¤,2ˆtG ĥݚ÷dÈ+Œ‡}܏ 1ÊêÛuĊP£ĈU[íĥQÍŻÛ½4²ğım´+̟jżM}ċŭ\¨{͘¸ħ›ÀPİĊ%6zôriŽMÍĤ^hÊĤӝ`ßzĤžŻŝĝ¸ûĵÑëë?J=Ĵݐˆ”ġˆi1ùöĠ—˙ĝŸż|M}S I¸6xeÉ(6~‡Ż˜î·üÇW˜!eŬHM SX™P—y<†p`pĠ™§éÀë˘Y-ä욂,K…R*9£/ğğ(Ħ_ÉQÍ!`ŽƒeŜʟÊt|şĈQ˘ àeË;ĉI)ÍûŽâğëqğ^?îSÜħ’Ċp80ŝÚ.nTeı.İ–!JÓîw-gê÷\>ÏlèıMÉŝñ°ßĈ­R(4ĦûÛĵ™#Qŭ˜İŠf1ĤM˙}ŝċçwšĤr&Û!Äx/ħÈŞYÔì'VŻÌ΁àÍ ó¤0Ô}ÀİlòtñfÑ"İÚşX§YU#_gĠ`”EppP‰tŞVµ]İš4fÖUíAÈWJĞŭŞÉ%ĦpT.4,Ĝ\žTÏ6§_½zm|dhŝöêŸŝêkµAŜP†‚ŭñxÒYäĞ?üÓW_C÷t{ç#ğ7š “ˁ’ß'vö×í[Hİ#J_}ġx8žÏ’ß"QîÎ{ì<`brĵžc?Ŝ\¤§ëS‡§%]:ġ %É :>mŒĝùDğTb)ĥĜ³ÄQczgATŜZ[6ŭW‰'I›çÚÀöë7pž„ñ‘„ PHf5dœéôeĠתğŭc +ßc9ȗMˆó-cÚàNŭÉ4żj™‹˘^KRKE#MˆŬßsšÔéħr˙ùÙásSĦ;ŭ{–UòÇħÓßiÑÒŝŠwšÌ·Tñ9ÍlqÚjS›ŠËW°³d²„ §K€IuĦB獪ÑÔr¸¸ÖëŠÇF+Ïí_@#‚ğŞq*?È@"„²Çi|X£ı_ӘôĠWjFˆ­Ŝ>ݽ<\v_ÓΛÖ\o7WHéÓ˘ÍŞêĉDÁdìĠÛ>öQÒĠCġŝ !$û5m¨EĦzy\è–JSúsIŸñ4'‡NP ó'àÛĤÔl{”K„ü*úù+½—°S=RÇÇùŞĠa$˜ùÒ°ÌK £‡Q…óËÛŻhRxĜ%‡#İÑ=·š“ôÓpûŭĜnMğmWŬa_úËĊ5àĤUğ/1‹M#İÊóY¸+Í´„p<†}KBRİh܄µĉtŻ ËÜçwyöïuߊG9wŻw%³:ÁŸp˙É%°2Í ċÒ2£ŞŞžÈ =¸Ëm§ëQЁ-˜k,›J.4 s=/JˆáQ‘v¸bp9’ !Du!ĊòE1ç=‘,#l§˘$ĵjVä{°{S DÓ[é ŻfhSżù[šâ"Ä`í½^ğżÇ --6Œ8(9éŽ>™ÓÉÚç3<Ġà ı£×u˙ĝ”9}McĊ­i$‡ŭ}sp”Î<Wӑĥ˘ġŞĠaܓ÷J56€=CˆÁ,ë/`éŻ4ŝ’–ŝ£ê9^Oòm\àôrĊMi·;ËĜñxĦɜ¤5šJó<‡K“Ĉ  šKµÚ썝ĈËbĦ7½Cċ_Ɍó+ĊÀr Ñ.HÂk::MyÂ8ċ÷D2yÏ3œ´½ÊˆÁı1‡Bİ=>S]™ë&pddL+íÇInm‰ û½`È(}VĤ&€ĠK×69½~ż×z_=Ħéµê]×£š@µŝšÇíBĠċ²’?˜r÷‰èSˆJXSäÑj²¸§ÎĤ7Kħĥ7F¨YââË/)4eW_?ÑsWŬ€pkNOǍqĜî÷´qĴĤÛtü+ĴŝÜw].Çó^Jk„á°]Óµùr4Ĉ}ôÄEq<'™‘g&ÔĦĵGĠ²ËaÏóşn,ßw{0|ö+JX ÑÌı4Yɕ˙Nc¤·ó säñÊì†òyċM)<Ó{)óBDZ^_XÍg³ÄÜĦX˘*vċ.Wu=C%à2àœÒËZĞ;ôzÙJµ¸1ÍDŝt9°küçwäNf€½29mŠLÌ12€wĝâŬK]|ıçp‘§@ÁÇġĊÀQn‡kSW¸Ŝ|ĥ á†ĞZ\şíBAŜ,ÑÌÒ· $#ngŞzÎ&G¤Ŝ2›z6úèï!ᨍ~PŒ§Ħ‚™B˜†²GMÇĥ—'^´ßJ³ôĠM„İĦ–:Ċ3ÄÖ;(çÒFRÂ&ŽWÉV2>c½?iopş.†=§=MÉ2‘‚tі/'-˜7hŠsĤĵ ŒË–[\½%!Šßç ˆĜĦ¸ħlg“ÄÇᚨGVğ"’Y1Ûxs:ÔןÍ&#i"ܖÛéyí’U 3„Tٍü? aĠßî.k)‹'/ïS(Lż^ópt˘mÈŽ'N LħxìÑÏÑFah·aĝт$rğRĠÊҒġ†>Ο ôö%óÑÀ÷Çŝq{=3°Ùâb&ù›1% ISŝüe¨£¤ 1´bf1Q6Ù˘ééb2ŜĵÌSŒŻQɗH‰‚$Ù'T;]ûٍ™ÒĈÏ(£›3‚8Àşw:`eƒ£É-Ğa™Ë"ÀM5ŞŠ (Rg° ÏçJu(żêIçċĴĞ2Cŭ½WµdBÌuz~@Kî§§'ôûŻèÓü~!4ó~˘Ž9üç7{úléâvĤ}êƒ*ÚIó~Âşĥs@y$´{R>%á%“^”éĝƒV'C†Ê;½C· ùĞgpyƒßŠ D/ÊĥÂĜK"—ôgŞä_„P ÷XĊ– C&€°V,sŠ@™;Hâ¸çTPj4*ìȨSfċòÇHÀí·í÷šNàPXĵèÙĴg#› % ç‘|àµĞà‡ÙúHYÒ8Şé:(œ@M?c´1pY*íüu¨d•ÄŸ+ŜjĤÙŻ¨ QwĵHŽbiĝ††kZ;ŜHĞ˙wɃqb6—ë‹„˜şóJó.ÍĜ)= ĥ=ÛŞħXL>“ÏF`J!ğj3GÛ ÉT0z”ĝÛëT°×ŻKg G“9Íġ3ÊNAĥWR äÌԞÉ/–‹E²0Ş@ÚxDé!‰Ż@ §†{4íB`NİŜ€ÒD]ġê  •ó˜FÁ)˜DÉj ö ïÛBQr§H—!êÛk7[ŬÁBñ§ŭv­1Á›’Ĉ<àÊ*ıûĵÌ÷Íşċùkµşc×È/Wġ0Ĵ2´çò˘ Â÷8U"­™Óş/“QËß}biĦ·ĴXR CĠ%!'„úá8MÚ¸hÖŬÔ„şÚµ¨ì…ÒHx3Ş'Áġ’Ô0ÔµJÓk[,…UĴ÷ĞUûŞaÎ[Èk‹…ĤĠ²½qÀËFœÑİĝ[5ÄûúáġŜ<°ábc͢k(†‚ àEpĦúÜĦFŸĠ€p§ü<+I6{Ĉ2R0ô;Ò>Ñş6 x´5ħ=‡s‡K0{„ĜtĈĞĊ*ZL@2êañJ÷Öä°>${BŽÎéÁÌğt––èĵ‚kIÂz, ħ4_Äç#zÁ”wŞ~…ÁrÒ½uċd†„ı N҈џÒ÷'Q§A™öÒ·gŬ#‡Œc²š@Z„ŽvzvJܕ†@áEú,:d½iÊ+Íà|Ê'˘xŸħ” ŸX½:Š—´Œv0=OmjUñDj8Ĉ²ÒµÚpgl’Ğo@aŭY–%“+g&,ۚŜ•TµĈ•áŻdUJ\[´TqB’÷³z%Ĝĉ’ġ‘ĊPô^?Ş?˘ì5ğ1S;ħk"œÒ.­´<ÀUÓјŻR$­ŠGŻ%ùY{XLJŭ!\ë˘ Ü Ëf8Šá_7ŻßÒ˙zŻŜñ|ÁŝW>OK']ĝ˜ÁF59B g5m+êĉlĥH·,`&cùygWÑ ´u&2ôŽè·’ š­Ò£5ċC˜*·{‚.?€{BHĜNµ~°ÀŠd 7Ĵl2%ò¤fj'yÄWߤQ´5ĴU / Ĝçr^—°zü*?{(ÜS4ÀîÍ Y–°(G/)ìÏIy(­˙t:ÍÁĉîvK÷?,Ì §eŝû 7 ˆp~=$b,ŽıhÂÀ<ĵbû¸;eŸ*FZ²tZ’ÄHꃆúĤĴj°ASÔ÷gAĜİĤ2­Ğt>ñ@]İîUµXÈ}ŝ²¨°|IUöMû&n^y,5Š/ï”Ĥkŝ3¨l3…"•ŞŸ: I´2°…†X'siûoŒ—ÊݤaÖÙ*ĴŻb(0,‘;ŬZ{~•%*Qp^3£€L”z†TYH\0dZ)5ŒSHÁüƒjU“ġ¨'=™ñqÏUĵ`co“HšÑ#3Ë£>¤Ĥ]Ô KW°šA™…AD[:òÑ(Ü^¤i·ÂÏ__4ÄĥşĈ—^N³Ĝá Š§éËĉáġö˜Êׂ%‘'iÄüá `³3,î‡3} •êxyÄBä#VüŠ;pRċÉF„ yù݆jcHĊWòEpcÚ°û—Ĉ- "{._GûĠĜ‘ĤEĊ;ċӓYχĴ‚¤0H`ÑW•O—Jô¤x,&ŭ qÓ²İ}„–”ÁĤzcÙ£Dl=™!ùÜç÷y|îKY¨îJY…ÇòÏ ŸÒÇċ„SwSƒ3DğoğF(GMtUÊŞX™Zb“fÌĠ˘ÎœôT ½žĤ‘’a …Mwjt@ÎĦBρ)Uys§Œ3/D˜( OñşŒMŭ‰Ìà!™aç½1Ó’•}J‘vôôŝaˆmv$†°„j/Fîà£}úYgVZŒŠ§áa½×ìÍû6Ok^ñrls@îYš/ #äÓ`6‘™W^ÑmşéH†e¤Úחǯ×ÀŜÊ´X˜üE—#ˆ&{b]w×xµš.C Fş)ğÂñCÂ.N9GÌ}a}9ÊOĊÀ‰}}œ^#ÜÄĠğ‡*™•IwvÛ]zˆŻä§âYUGé.YŒ{×b0˜2½ïsŞÁ™İ!ĉ*-(ĠŜÓó!O˜E>w÷R™%*‹5Ĉˢ‘‹E9ŭèDÙz1‹Üˆı&֌÷°1òY:”4 _RÇżBA|ÄeGEb£&(TKfâr_dXP‰Ÿ d!6ÉDTŠ=íô:…7i†çŬe£Áó¤ğ)ċíİÖzIbĥ{xÔîŭJTlŒNi'ZŻ5˜[/MıɅOX·e/Ü9ȟĈSYĉWl°Ĝ˜ûPž›MNjóNû4]L°ó|ĝ›ÇËD²ĜÛ 8¸ÒŒ™Eŭĉ^÷Ĥow)ħ‹\Á#Q"ñœÂù"=Ŝ—lĵ‘ö×0Ä@pFŸvĦ´üß˙JĈOĉ*iפoBÇlFS(L?Û=~ru"ßlϖW`{˘òĉ*‘`È"ċĴÛ/ÖdÂ,ÄÒżlÔ_ CĊï €*ŜŬƒrY(ÀÖ´ŝO(V+n¨V4Mˆħdş-ĊnĠ)KA.ġnS¸aUVƒ†”ĞŞEċĈU‰ 5¨PvĴZàĉO•-€~…’ĊÍñۨАİdAëğÒVß_ùÓ0Ċ`ÍÛ7Ïzä[£8rİÀ“üpl÷öa-ÛP„Ni¸œ€Ò8—áĞ_Ż÷ â5ö#Mcë51bb³£[$ĥRRn²MĴIJâ|% żL–üĈhàMpŸŒgÁnóôxPš·ĥ{ >ËrÓö$]¸]ÏJוÌ&ߖS.>˙ñÍA’EêH8ëaKÌ4şž¤²ŸWüXvw(IV*ˆâ=ÀĜ°-7êTebWħHpԌ8j™ĈYP•"ÔG&ŝ\Cî4‹• ˙ášû~ yäyOR.ù]ħôİ^UuQ¸aĠŜËüÒQ퓔×MFCĊ“,cy×ĤBôúy‚Ç&•ˆ U³5ËTġxŜĵÒZ `¸ĵU ´F c0QARѽçÀKŠÎôàTè鎷><ġ\•O{]yINם&2ù^Ö(6ŽĤSyۆŬmĠç‡)&6RY•T"§Iè °DċT…¸%&!OI²t!ÖÔÌj6›çÈMÀ½•Ĥ*ı<=Ħİ:w­ΠчXĝË·÷°Kp@ô¨~†4†üçakJ·Ì _żzşKV§ĵ §?˘h<œşàŽŬ—càCkŻ?ß”a?(ŻgcċäÔËExĕĞvÈ$N³5&1ÇaĜ1€_ŜĊhÖ°&9ä Á(*<ċèrÂôĤÁiğeW󖚴ħ†˜ Şn2ÏKQimUÍYM# ˆ.Bv1’³4ÄJz(ӋUŻ™ĉ]Ċ#g^…È€Ukğşî'S†TZ2˘ûÀä75 ×+VߟuOŠL·ÛJŻLƒ%É1ô{e!È0ÁżBèò‚†¤ĈEĉpÙS“8.Ó@ò`ÂEŬÊ0ß{BĞ~I"+ڐDékR8÷&!]öšµë—żSYräŝ€’”’ħ+?–µĊ|ûêáñr€äÁ™RIÈ_†óQë‰ñL’…ÙŠħ7é{2PÎĈAbÒ~S"Lf_49ÊF™C8›Ĝ–cúboUŞ$7Xïîò bߣey7ú–¸ ֛ŸÈb‡cŬ·­Ĥ2%ĦbxŝÌï(X7×%I5žı™ġ)2VĠğTÍBœ2ĞF\‡VFĜíÊJF ·TĥÜÌ\D1?:pÒWŻÒh MĊAIDATġϖŬ!|27É­ÑiÏ5A`aÄxÙ%’â8<lÌċ‚€SŠš&Sĝ?Px ˜q­:^·v†Óàxْj²ËœÒÎA˙)Ħß ’ŻRPÏ@ĤÈQĝ˘q0FñúI°2HzR½M„Ĝ J²àA—ì;Ġ<;ž’è´AC'ßÑéğ°Ùl!‡ïƒ pŽ\"/à ËL)ġ¤jò™v£ m[€“+W³ 1¸Žj‚<×kñBŜWk;V^Û0Ä˙WŞĉхħ éMQ6‚veCáĥ§\6HŒbñ½–JY™ğœ°Áŭhˆ9vm*"¸*UÑ0¨9X·x'2–m€ÈŻŞŞ2ÎRIŝjÁ¨Up†k¨ĉ>ġdè3Ċ?ÒVĦÌvŸüÊ*oċ5%ԗô @ၖR°_•ÂG?y#G0];‡óŬ|9crK‚™ôÏÀ7ĉ‘$œÏĵ†Ü)5ôçŒêıUÂÙúÇ­J’)À^^SÛÓXŝ EËċl‚†Arĥˆ"z£n·×“ úŞS6ġ•ÑF’¨ıt3ĵ@ĴüzٟùÂĠ\’ô˘9Îĉ˜= óòżv\sЌ Á+ùÜ>p.€çφƒYĵ€Ù[°ZLħıĜ`&,Ô´+’°ƒC'• 6§%s(ÒĊiÁ’ìĊ(ıƒžMɈZ—5‚T+ŭĝ­™‘ċÔ?žĞTx(@–?‘Ċ`‹%šÒé(MŞ˘¨ójĞ+÷ï†ú]W+ş0hµT9ÍÁĠÊ)ċô.F ÜÁûİaé×klû‘ĜÈU2Ċ²J]ê$âóu5Ìnì]ĝÈk$OŞ/Ï.Üaz<Ż–‹ċë%ĝ$¤U#áŻh$$­—üm‰[ݨġR‡Ğ]°ŻÓôH#{/Žar>ANz&=kĥ‚¸d4Hép×._{6÷m›½K*ÔùÉ2`AÇʍ; .;4\ƒÉğÂ^^"x9C˘é÷—ò›'ŭÙ1ĜÈ ‚uíIÉ$iÇß5‡.\’ž`5öç+\³ü´d‡éï‹Ù ¤^ğëµ°İà0ĝ,öTdE$İMRZjĠÈsS,bŭyŠ<ċiħeâyÄ C\°w“×÷gpeâÊ4ٔɭeL™iPŞ[.×X5³%™iÁÔ°Ñ´[ܰRŒ‡¨ŠF†uĠ\V! ~s%S 1öVĴ÷*ġ–B˙ħ•Üħ\„Y^5V訟?ìÀ@f–"4“ â:™73—X‚lĤ.×Q²O ‹ċl)ég6O/‰<˙£Aż×—Y$ŻM§^Îğɵ –""ÀBJ5RÉ*À]E¸ĠÏç/[á—Èĝ%´2#xŞzŞ|Éh 1Ò(ϨƒqŒ$Fß#.EiŻ€BÓ1 )eíuàŞ™\İ#tf˜èq²×4 N2àNıšM0 Ĉ!ÌÙíö=wäK#ÖíJŞ‘@JU9­yĵS•çS:[EuŸŠ…B „ċ÷by*(ÑXB@“ŒŞ>9%ĵé”)aĜĥëŸÈbu@ğEٔĉ³ß77î†ı[6ñkWeŞĦ EµçÖŞĉi DkK‰*Ĥ7Á `T½şZÍ”ğ.0ĴŞ2ƒZ(–ħnv]Ì~è{˜´¤Ì%}Ŭ,O%À,ŝdRÔĉzó¤RùÀˆÏ'””/3òŽĦ£dĞc× ˆe‚hĜKQ;Ċó9Ä ÑŬŒĵîÒu(&œÂ|ĈÍ:bnÇÔáÀŸ!Äwf¨{P ;,}‰4#ê)m\ĊFEŠ!hÉj:›â§B£ĥßASŞ}3†Œ¸‹óñ²Ŝ^Ħ>+Ħ+êU$éÙñ@˘`ĠĥċMÒïuĵñrÔŭ Oɸ/³u!Û À$fİÑîZtl£ġäÑá?™WôD…jŜEBx¨Ùȃ:Ŭ½|e—ûı:˘TF¤ÙqŸù¸àtĊ`ölYŞô5ŬSd­}ŭÙlË1Ĥ“4h°Us›ş!kèżŞœä:›7u²Öri@ħèʰ ˗2K-ÇV%—Óċ†Œ}ñ08 ¨ĥ9G£Îpĥ’ĉ÷ĈnŸ†“ô,FR˜@û&ĦLŞ İúAD²ÀnKpĈö£ĉöìĤC%ây‘Ñ‘W–˘ÎĉŒ İ?ìwG\ŭËÉ j‹Ó”_'Ls [lúË,İS·œ8‡‡%ž3 Ħ܏ËOš@Ÿ6>CüÌsŒ˘‡÷À¸çxŭŬîùşîH ?-8o7—ól™Òİ!B–K@­Ò!íêuG=üĠâ²0KŸ !rċġ=’{ğ=ùSi´:Ûü ‰:êÒŭRĠ uyĴhżĴŠ9Fè#ŝ+%•Z̓[$9œÎ65û£!Ĥ’'n;Ó{RÇ힭šÚĝËtIÁa³ĦÀÍ2Ûa´h™Ô(<+†Ġ3*9ïHà}4Œ‰VU—a•ĵrškÄIì !TËs<Ĝ–KÁhÈĤ:˜ùì5$jFŻK5ŻAŸHÓ%N„R)ƒ•´NÀ>£KÁQöòZĜġvż4ħmĴ""Y }¨Ä'Š.pt‰âƒşŝRİXG9‚|^÷š“Ê™*?pÀÓt>bjğÜT ;’ëMêLHÀœ§ëş £²@#³f|/ĝŞäğײBÄҔò5µYiC7`ĈLé$€iĠĝ˘T:ŽVÔ ‚‰¤ O=dû·>ÀFŭe2 G}[~S^màWċ²èÂ=şÇ¨D êÒS~jm–r Ĥ[.2Iú.Ïóé<Ĉâ=FW’L*Ġ²u’—‚…ïc>ÙaˆNEé‰(9Ĝ[İkò :Îhéo†v!FÌÙáĴXħL!F°oU#`´dR(J€²(2Żôi}şöÔċÂvÛ£ÉbÒnZ-úş°ĊKLŬD"­ĤŠëjÓRùä*K˘îViyT6h‡‚6ü*^HñeZw{_|ĝĝ İW "•f³…=ÉaÙ 1sIN™âıĥ˙*Ċ/?‚†XÍ%Q K¤VÎË iœÎJF]w&Ä܌4Bv Ġ~е%Í ½ízäuL°u˜ĝËÀ§áh,/ÓhäO'%ÉX.ò–6÷ac*…CrX&Ŝ˜µPêŞy+C ÷Ë Ż(†²Ša‚ƒŝx2]„’şŝM%‰Ia“œ̆ ˜ÒKB…Œ:ĥ "L@bĝÛ@xx—cşà‚*”Ĉ.„îËj†£u"i8–Ö}6žK)ġgi>Ѱd‚µġï°ï+=ÁŻf}FOŻŬwN7;V…ġà(Ó\ĝ3C3´ÓjĥÁ›uàU Ĝ“lċÉ.”ŻZn^İaf&½µÓq¤–&+Ÿı¸qŻ2³FmñÎèġ@>ğÚj÷żx÷íÇßÍbum¸iBÉ'ĵچħğײV3e,I•ŭm)Üߌ™ĠRÍt\Fŝ„-Y€›ôp3?'ô›ù’YĈ2#" VP½èÖS5˜l%Ìzj­,Ċq1ÄfcÏpÀÜç(ÁŽì"šĠÈsܳ=ö½ĤTTI‘?ôhĤ›;zĵĥ%1†Iiu‡H„´‹h÷ÑÖqíşXERé"ĝw­üyŠ}\4vzÜ…ħŜ—¸•‘ĴtwJî9TĊ1…N00éjì'2QÊW #Be(Ț‰ˆÂ)WRĝVt/ÁnĉëğĤS;ż×n#Ä`/:8hP˜i‘áƒpŠ< °¨ùŝ¨Óî:µ"-¤ÉÀè’:H{•:]’W8êÁJÊAŸ'Mœ•Ë€O^QŠ…"áʆWr—+Xhûé÷(oß/Ŝ}óŝñ/_|G6Ċ„¸ĥ!ò òé3MNmµêÍl"¨gĈôĤTŞRBôÊx£Ï|›S‹96ŻûŠV™ĝ]Ĥ1PHTɧZÍô.ĝ˘Â!`:0mOÑe… †ìŬ΄íq<—fj‰ k2™ ìŜĦ"‚3<–CÜğK×oÔŽ5uֆŽ<óĠpċ–˘NGĠO6Eqzܔ}U¸ßĊRA§ƒÁ]=ş7èCCà„EĜ9=CîŞÔĦ³Œ§*͓¤Àܜwħ%'ENG MñŽ@^êĜìâIÄ\Ì&ÓÙl…çvHùét€l×@ˆİ/Û큲ö½á<”š-Ä>Qŝ¸çö¸@nXż+A’³ ô>.š…şm[µŬ‰mp€ìnòŜBÒġzüĈKŜ޵2Á2TRa+TŠu§ëü…˜Ú—"“ ĈY#bvóÛ!ĉ’úM ŝzĠH4ŸmèÑ.Á*M˜î˚ ŭÒÁ²j$Qkş½P…nòÛÌĴZÓŞTqj Ğs,iQ÷<Ĵy(E£‚f‚=A˜Ö§8šL û…|€ġş?–HS‡Äȸ'“Àb‰Î_ŝ=tžÈĞ•`päÛĈĈjW"ŒëĤ–Óƒ½4hàX‡ ‰ûp†\‚䲇˙m¸ Ó+×ÇkrR=X‚ ™Ï°qUâÔ۝ZMìÒ\QĊXO:R§½ĥ¤M‡9œĉgKΨÒĜû{ò)K™<› IFb’˘ŠÀpBéuùƒ2ôú LF]~v  œ=öšn_²ĵu ó°KÍN§­%Š-µpšÊó(Ï&Òv³úìĦRö´Mí|ĤӓËĠZ&•göc!ÖÖgİ:´íšŞçŞTOÓ°)ġ7ħ–p)Á#˘aò›.6Z6CJ2CK?áÙóŻNm§Šı5ôZÉfŒ 4jŽax.gpŸZĜ\2ÄşäÚál‰>)’Z:šˆĥ³Ur•‘žÜxÀ8C$ÉÈ9š.tħ0–ôċ‡+™ĊTÊÍi(ŜÒÒĤÄħM·éʌ֧Y=ô³G_ÇPĝœ8İ|á"Ùï×½RyıTċa³i`)M1F<ĊSk€bh{ÜÀ+ħÑj&ä èN³Ġ‡UĜ`hĥħt5Á2u8dΒêV~ oƒ-ğ\( pԙğ?òúŝ*âÖ#£‡Cœ$âÓʗħĠ“ŜÒµĦ낽<âԙ\âµï9ĥüÀ>Ü7qÒĀd7 MRCŒ£BNÛ1-ĉsëp‹gˆ}fŝ˙ëP5@҉›,¤Z*SÄÎlh-ĠJ‡ĵ@K­Ìéñ öĥħdPğeDRSÛ|Ġħ£"9:6Ìi÷zÚÄB:Á(ÀÓf™°VGċ.m8–܈Eˆô2âÑèJŜ‡´ŬK?Z[Ĥ,,92§1àh>Á^Ôġ³½~GEût˙ÇċL½j ĞÛÑË SgOêLD`£(K)<’Ò³ZÎŝññB› 0’û#µ‡aӇßÚ׺ÏpúTtyÜPtçĊÍ)T¨W0ĜċF(°><żĈ€?šxM <­Şôù{(XÓŬ’P"ĉĦí-%Z›#° –¤ìf³ë<\°›Ha›`żfîŝ"k_ˆ€dOzğíV­lĵŠôğ×>Zép9 Uòuy&É1™!Ä>ÓÇ÷³ŒB*•ş *ĝh7‚ĞĠ9WŬt1ĝR; Ş!ĈbŠ–Kı$OR.À2èUĊRÓj”ߝ:…ÔŞŞ§`T'†ZWEĊŠ—AŞKµĦ5Ċ7)Ĥ+_ı*żž0ı}Ï ÷°Ô–ĥ;@‰˜.£ˆ2ѸĉŒ†tü÷ûlɤÍÀžlÄFĞĠé9*ĤÖŞĉ[ŭžĵ†_§‡uwşXR$żSmtÜÊ·*ĥWBŬ²P to WÎà\bG¨óÀÚ`9¨$ ­Á%Ë)ĈG‰ħž€ŻDŽ×‡%nzXÛuÁ]놇ĥ[Ċıµ1Ŭ/ƒ·éÛHv…J³Ŝ•ŒÀĞÓáÏ1.˘0 çÑo;ùƒZ÷İ”0[N³Ħ>Í+^}—³‰]mĠñšUÛ)°ı—PÌĞ” Hg1Ĥêë&œjÓûĦ,ĈŒKp‚ˆJĦTD÷Y‰!†+àҍçC)΢š98¨>…âĠ„AZ-C½f@ڙö2]”ċCU5ÈĞcı)ÈcјFgñÒ!}†ĦÂ+”ˆ‡pµ€T¸9ħ„ä›RŽĝiĞfÍgàXĞ&\-.K ÂqjĠg”E£R,¨>°e5éĉP2à2j#ÖÍRVĊžóe£ÀWƒ5àD-‡”@É÷ÔúğÒúàf-ê ÀÎ×X˘>†‰z!àż£äJµ:Ŝ`'Äö;SĝĜxgN¤v Èȧ/­´m²5=VAŜ”„·D#D`нzš%´›6OO¤#x’3ÛH½ÛݟŜ>^2ŽŻ‰1hQíL…Ühïo€6Ôƒ%vLy†+–aéÙĥ%NĈsHÉoNéùżŭèÒQ$ß8ô!“ô§öFġZ Ñéħqç2!ÖÈ.“.‹Üá5é’]11‘ħrıVR!’%+Şĵ,€.ÇdW "‘@JċVġSEáî8=t’ùO€<şŬ\i²…ĉ!.xI…%H fò˳I}’£B` v…ĵV ArM˘Ġ‰^31Ż‘D‘—ÉĤ*ĵ[|íx$)Jó‡œebìúò,šAkœƒ }>n{||sÑÌD9oı(ùˆCĤ­=:| (AUwG~ĵ`Òc•čH†ájû(^¤ì¨tZ^yĞ÷q{]ÎcĜ:ñhGGżd-šÄ $ü‘ÙäJ,§$ˆÚIF&˜ĵ§Ŭ†Z §O@žUt\’l„* Ĵ ĉXĦÖ´J/˖M Á„ÖŒû8ĝò˙üö£!ĉ´x8€üĤzäj€!Ċ¨Û<û~Ĉ˜Gïɕĉĥé„E ° eKçȂıA–2Aäĉòŝ}_¨³Ğezd\ÇS­7 ĝ!şŜÀ(uéáDħ0V!b@‡_.ÔKRŠra{,NÒ…×½ĉ%˘İoš: çs­RꓵCô?Êo4ÇĠÑ3†)N}ZüEá9Áëz ž”|hŞTżb*Oo^½úÛŬċñíU[¨…HÜlŒ6†²ĠAíÜŬsMkËÛ^Żô$”—8šx-Àżú}Ş·y}I]5úÇò<=ÁB×éÉ*9ĝlVğñîí#‹X½İÀ:ù-;ŝ gsÜQë&Ÿ/e<íż~³9 ô¤?$ĜŽàÖ¤Á †#%x`Bñ­ĝù àxġ°†uğ}.‡@Ğyĵ,v˙ŭï~û?zeCÏe=ór•˘…’zOQi5jġlĞğ}Ğ–•n3$áÈÙìÔ+ÎĝêÀœV0:Ô¨Vȵ¸¨ÖŬn½T³:ƒ7^`—5YJ{Á-$,Öf”ğ¨734Ä!ÔEĞ˙ô_ת9aç EKCSA’ôù‘† ÒtÓmÄ8;¤ĦßïȔnñ2ËĊr}´$`l`×z"wV:İ ùġV•X‘Ä^ŭ·7›ÍÛ7›äÌqğÛ\ö1ü6ĉ0É0P˘&Tù†Ñ)]ŒÛòÊyiħ!e jwl Kí&|µ07•ËìzĉHŻ'RBcù´<ŝŝŝö˙ŝ‹w˙ò­ÇwB,Üq°Ž4˜BMUZÀV;Ûe–RŻyÉt †XÉ`ùqHĉ•\žâM­Nߕ–Ş ğ ,htÜ+ħ5K]µKġzċ=oĤ[ÓuU>†¸'ò½˘xçQĴ %ñތ²Ï|íċÙ9żùŭ˙úŭ“JŒ£ċĤ"èaÒ)¨{‚u”™T@”]˜AGS=zä}ĉÙ&+€/@qÂvġ‰šĜ`Ÿm ñ§†‹–ʧ§-êóNIäg% ó7Jô tUġ}ož@_×@z1TcH·Á„°QŞ;-";Ğ–‚Ŝğm—0< >@~|ÜڏۍÔÀ3úğÓí ġûİı]ïŽĈSà¸>û˜îñÉA˜^ W“&,Šħ:–Ù餍Ğt—ġú"Ÿ>>#Š•oYPÖĜˆ-€Ĝ”†Nêäá?ŝóo˙î|ŭ1¤ĊußŬż€ÇĊÔwÏ!ö! _ŝ_üéöĝ<~½ó݆Ĝ}Úżü%>ŝċbżû~ ħÛß7Ä>û9BìwŝbżĥûìÏħì~ù“†ĜïŜ=GĜğ[ˆŭ CÌÜ$Tˆ=ß/Ê3ö°[ˆŭ²²ĜwĜg?Gˆŭ,v ħ_Zˆ}öï—Ċ4ÂŜŭÄv ħżÒ,ö3ôb&Âù‰#ìb­½ĜÏ4QŜ–·‰òĥğ=nĞ×[ˆŭġ‡Ĝ(ŒùK|ÜBìbßGïük!vCZÜ?/Òâö¸=~ĤÇ-Än[ˆŬż’û·Çzĵğ=WÖsġíğ½Ŭ~ÔŬíıú³žĞ[ˆŬBìb·ğ…Ĝ-Än[ˆŬBìb/²ßyñÂ|äĊ  |;ŸÍ·>ŝk܈ĵğ=W˙Ĥ{ñüLĵĝÁµÙ~ĊĴ@ŭ~!v{ŝÒûĉƒgĉ~îï}{Oì·ß³żêğ=Wvˆ½ĝ֏œ}à;?÷‹ĝà=Ëżúğ=W˙†ûÈûîwï÷ŝÀw>úŝéŭĠ†ĜíıúKBìĊ7?ÙÓöĞÏb·çê/ ħ&ïoŝµöb·çêß3Ä^|óÍßB/v{ŝ²ûΞĉg&›½?ÑÂŝ˙ë ħÛsġ—.-˙ĝĜ˙·8{w{~–ûè3s ħÛsġCì/y ŝĈP³ïnÏĠż-Änb·Ç-Än!v ħ[ˆŭm…ĜğÛG=nÏĠŸġ\1Äŝt{ğŬ?ßO’Ä~s{nŸïñ›w/yñ·çáöĝı˙â.·ğ=~ĥ3·ĥßÜúħÛçè~óâOúÓ{@Üíq{üähŭVËhHC ËkIENDB`‚gamera-3.3.3/doc/src/images/display_toolbar.png0000644000076500000000000000276410714675724020466 0ustar chriswheel‰PNG  IHDRIPk0PLTEZZSš™—P¸ĵŠÏÖĥîöݘ¨àê¸ĥ°ŜîöÇÄÀ{‚v²ĉîŭŭüċċċ˙û IDATxÚĊ˜OhUǧx˜ÍĴ·2Ŭµèea³ÉAܔÄ6VHNîVüwÚPј %=˜S…êMìÁ%ÊP3ş"bV‚ğ„F¤* Ŭ“™Ì¸Eɋäùû½ógw1Ŭ|a³ïû™ù}ïûŝD£ĥM)eBE Ħ˘ĜĥŞŞÒŜo"ħÖHI¸€·Y„}ۄ[1¨?ñ´CJƒRö­Ê8Ŭ8ş˘_ìèËÇâ(@i} (#]{aŬêĤˆPÊĴV”êċ„ı;&žL$ PRš8eğꕲufkОB5GAJOGݲĤt:eò.‚ï6 3DÒUy7xajä¨e8- §üĉ&­˜ŒrcäLŬŒRjZBxI2w'ÓYċñô79SquWûü~SG5pXLĵû‚ë·?d”y×ŬĞG)ù0Ħ—NÜ­FÊ^úۖġFMrù?X+V Â}§|†SşG+a1S*üċŒòŬ,RnBu4Ħ$TÎË_?›4ĴIĉċ Ġœy÷ĥ)¸P½ßYíóçí?ċ}AI*ĝr"(WòTŻT"”-•ñÓŻ×Ŝ„œ‚ò¤k͕K.P3LĦ‚>?ÏëÉKR!Áˆ7ošÂËKbfÊÏ Êż6_ÁâsJ?o5çJçsœ„ĞW#JöËKZ Í˽KġSÂËË##ŒSRĥäĵ|˘0 Ĥ,Ùó×Ĵٝâı/×úìÊNqJŞH÷’‡(x‡îÊ_Ħ˘;ĦĤFhÄñċ·œÏĦÜxê;9â"A‘ôÒdzjÒ0‚ġ²ĵ>3W*Nŭ()Q‹(ÙÇLĦ”nGÊpS›—ğ× ġjߐñ+"Aħô žż09Q³=a3ĝġÛNİpVĝU^û)¤üˆB/a ¸…ĦGJG ŒÓ+¨á—€p/áUĤ˘t²´4xéĉ+ñôéï ˜ ¤$eT*&ÔLD5ĠQĦ—ƒ‡ÖE =RâÈ:?`t¤íŽò²lPßĵÄV+1/ĵ|>83ċŞJI )Ûûĥ.W˘“;ĊBá%™q3˘"}èéZŻ•îqJWèœRU"”ès9˜—Ĝj/Ís/-\`K@@İIJ4ħ’eĵL#^Z6M°Œ7mÊĵ´³r^{jZ-iòäf2o…NAœ‰>ĝú…÷ŠzI)£Í2îè˜qĦ;ŬöqÇmZ”²ŒoCĵmÛ{ĝ6WOEÏ—É S! #k Ê2ôÁŜ´U"*^.˙MiŽĝ6Ġ<Žh^ĥe‚Q.Ä(}4 IĊn!%C/)n”z/ùĵ|(żÍef+£”éѰúhú”¤ô3ÄKpġ¤:J†^yİé)·Ğ—WáÈĝb_ŽĠ $ Ú҃‡vŞŬL›1J4Lyݍ) ŭu}ïçËOĉĦ ĉčDĞÙö“Û‰ÚF=•”žĤ j!Jâ}T…ç3Ñ2œTĞ’tPí/™YH÷Ğ{' 3C”ď8 )úÖĝG,ğUVċ?-.^†ZMR§úq{z@Fp‡ô"÷DOûÏ;¤ K@Ï·3ßàe@Pfêuè öqĴDĥ}ĵ›ŸééĤğŞŝİ‚˙áèxÓ Sŝ÷q;ŝòħp£üÙċ‹ %E€g5&3Ep]>&˜&1Hy|0/(Z7YC-|7h<9OFI8N]IKG!OŸ$V””89RŠzGSD—CTm>S…?T}B]ž[]Z&j²@]¸lVlGaš…X$Ib•NbŽ4o>eŻĴK}]Ä‡´Ĉx:rŒÁÊ|*}H·…6„İ·‚S†`‡Ž˘Ÿm{‘T à€˜ĦCŻÎlÄP¸„˜™–˜Ş@MĥÍqİıŠšĈ†žÉ•£‹“f½›^fĥğ{ŞÉĠ™4șYΕ_‘µÏŸKÒ˘5 ³\ÄÏ££Ċ¤ŞĦט~Ĉ|˜²ı†ÌıÑŜ­;ÁŠdÔÚŞlħµ­ĞµÉÚ°e·¤¸Ŭâ·Rת·àżGĦËĊÀÄ­Á³ ÎĠ¨ÉÛÜĥ½ÂÄÁƒàÜċÀ…×ęĊÛÒǨßĵÙǢŜʍతŜÛìÔTÍÏ˲ÚŜÓÒĊÎÑÙÂŬÔŜÖċÓµÎ×ëÜÚĵñŬsìĜĴĊçŬĥììŬßÜóċŽîâŻÚċîàĊĉĈÇñâġéšßċĝŜëÜċçäöë˘öêĞêéÛĠóÎóü÷éÂêìöà÷äĝôżáĝüîùçŭ÷Í÷÷àôĝçŭĝĠöùŝŝüßúŭċ˙˙èŝ˙üs+e pHYsœÄuö„tIMEĠ S²& IDATxÚí |TĊ½ĝ'ğyl‰!„Ĉ£°ċ!ˆÚK­F +·<´ ĈzSP#%JD”†ëMĊG€6”ú@áO´µ˘)AJU4xAÑ"ÀJ@1e I!’ÍäÎóœ9gÏfw³›Ŭ“ä÷ûd'sĉÌ̙3ߝsĉœßŝĉ‡ˆŭä×TXĴ˙Ú]Vâ~$&âîk0Íl*% ÑÚî]kCCÉívÈ@ž6Í"(jİz½&Fì¤ġ>ÛMV}JÈLó‡ĉ´‚†’áÌ/É/ÈWjñw´ĞKeàw¤X:}¤´ ŸŽ·›˜`„b“ïÏǍ¨xĈXÄĈ‡kä V§Pl8AŠÀ#{—¤M+ïƒf#3CA3oÚ4zŒ|R,??˙jX™EPj `XIÀàÌւ"C0ÎLׂi$Èoh|ğyO.°`ċ›Ğ —ĴÊ÷‘ß`ÜÑĈY-JĈ£)m™m‚8­a ,ş¤ÌO@ú4w,ûʏ˜gF3cĈ JfĈ  §OKäħ²yyWÓİÏ+ħR[@c hĴ„ÄH#óò†ù‹Ŭ@c7ÌĤħÙ4VDcE1ÒkyyĤÓĜ4›Fc4v_ó·?kn”—7ŬóŜ=xwh|s×6›Ÿ˙v3ÓOo˙£§ñ³iğšWçç˙n3‰çOo|ï5’˜÷pÍäïjlüĉ™|q v´˘–ÚÂ[:[ĥ~X‹gÉ{£ÔĜCŭGby Ùd—CßQC¨2zEâ ^’—ßžb‰çê0 ˜”#Ŭïn W´q6~ûŬ›ŭo\ê~ĵyé€˙lü·;˙£Ĉgŝ_żWjŝĴlbsĠ6;ágç>Ÿ O|`üİĉŸğŬ7Ž\ŝÌ`^ó4ù¸!0ža³~ġx‰‡ô.ùò“!Ą÷š3$‰fżNòĞY=Áà) ĜaĦ৏Oŝ‰Ĉ~ıo7ž[0½ħ9ß=ĝñĈ…^n|uƒšF÷à—ÑÜ<èe‚qü˙6šÎŸÉ%´Üü—WÍÏğa°…C—^ÍZ?f8žx|ĈLĵ"‘C²{”šÓژ‘hĜ­mżĉċç…tI Äx޳[„R¤AQGÏ}ßŽœñğĈĉœ|Úß#ó§7ûÔGynÍż Ĉgä47~ó9A÷‘Ä1šé'š›çĈŒ˙KÚìp/ieŭÇï3yò.NÉĝL(IF YPHŸlĝ<"ż ô ڈR‹™ŒżYÚx}’Zä'gPcÈí#r·h$·Œg&R¤‚k÷ï*vç²-&Ÿ Éhŝ·ñ7•{HbĦDCj™ħöğoGúVoñ 3>ÜÌ4AôMöîĠe……>ӀÓ‘œô (ĝÇM3ŭĦĤĊçvÒ7´ĝ¤İtŬt£ÁwFŽù·ĉo9Œü‚ݽöÚSs Ĥ77ş§Ÿàh (š‚ĉÍ•ä·Ğ@r#hxꙗW û'I珇2u.ñ‡ÇÌ ŽŒŸ>e=nDsÚ ST8rÉtö:(ä/”ĜȲBŝ*˘p„)V:=Üb Hl|q!ŬQ8$pl6ÍĤ1úŞe|‰Mħû?wO?ġÁĉĉ~äï.,úcó›˙ûŝĉe…û›żùìċÓ³FSßn| ·°ıñ²{^k>}şù›–• ĦÜ?’ ÛĴ·›OӛP‘vŒÙAĥŞD;znJ-Îע_X_d½fѓ$6§)2 9mfBY/3Ù+½‰Ĥ÷˜~ßh. / hï1çùFS­ùğ7G¸iìµ§Í(qğgŭ·{äˆĞżü<·è·{wn‘›|ıòÜ?-*äğh܌Ŭîğ‹IâTš˜O2Md‰ı~ßr𽑠,ÎÈâ¤'.‘] ë´w›,³DóÙgŸù iÜ˙IvO(+).™¸¤¤¤däJı޸¸xäJL¤ħ‰KB&° ÌÜ­$¸·TĈ”Íy$˜Ê‚bcPR\4á+Gŝ“´’—›ß|óÍ]ÍϸIĵ¤˜í˘%b³¤dê„ğÙ6ÍL*(ĦµÌž:ab‰Viİ<Ú½ó|Ä­ÍĤ“™°$Ô.áŬÉÚğ+I?“Î..™à&˙GóÙSûMBÉ|ĉ^RÌ2—O\İ4ĊViħ•Z%†Ĝ=4vUĴŒĈÊHìnğÛğטv/K+%ħ‡ĜCóhl‰•,(ĉê§bö÷ʵû÷ïšOAħĤ˜*fÊdžÌÇcĴ–RZß-Vê{\Ğöéħ{Z4 Šh"‹f-ù”šĦɎ$ħ  ñdggG Úĝ=Çž QÂ6Š­v%@?ÏĈŜŬş?éñÌÏLHŝ  Mv6g6šK6­O䣆˘ıĉçŻÙw}/Ouҟ=ïĊíö¸ŝéİŝ(84żí|@ÓÌ/gAó)g"eŸ…Yž‰[ĥlI[ìIûeE°´Ÿ-G€&‚ÓÉ•x‘<ïŭÔuñş`/h€&hV8ŽŠĠĤšàÑ|˘Kd¸šT§ŝbŸg˙Ǟ§żl<&‚ïŒ1Ž/h<ï p:.xÓǙp\B56}‡hlû­sc4€&t4İ (! Dì‘”ĥ}QhlûzĜ])h:ĝ tŠwh;´ŝ;4ĝa- 4€€@h  4€Ĥeı ÄJlĤÓkvX¤ÙMgż<ííO"€ĉ @cW4¨ƒAhbŒĈÒÄ6xÛ[@ÓvhÂ1€Ĥl읝É/hh󄰭­Îu9lo+{Ç_yPäšhĦİNyQŜk„míÍ÷Uï×Ĵmú-öÜ2T3È Œ†Ï*vš,uœÔlkS?Ġ.hä“rSÙE3È Œµ<ħèĜhäoÑG3+]íKi[ïQÑđÁċĥ‚BSf]ۉdgË£‡f!ıDUkh¤mmênĞQCVÔİFF&\4Û_Ĵvkh¤mmŜċûXĞÙŜ’{ÍCƒD£Ì*<žUç't+yˆùE'¸×hdžĦÍwuAż9ÛÚê\§cˆf{[Ù;áʃÁĦQgÏkû<ùp“kwt†i@v$Ÿk‰FU0TûyLÎ/`†34ĈYĊĈŝ£n2Î/MÌgi‡Ì󋎏f;˘1Î*\›ö?Š>¤³ 9ż41CcœUÌuu}8§ ›Mˆù\b‡ĤÓ  4€@hŭ|ÒÉe‡Eš=€Ĝġכ Ħ  4 €€@h@  4€¤sĦ7™`œĈéĦ£é엧ĥS}hìŠ@hMğG#|< ËsnGĉAË\}ê Á” ´áYXžK;²TÜ14S²0ì4~DĝxÖ,Ïı3Ĵ Á”, 4¨cĦ‰œqşôñ, 5u;²jG(Ĥd- YÛİD8Ŭ#|< 4şYez(Ĥd- AlÔDÌ8]úx– ıú˘úŽÉĦ˜’ihĴş‘³ >×x°oS<‚ËŬ¤lûż×DÎ8]ĝxŭ$ìȐ#yÈ OĤd:˅näì‚Í5ŞSÈí+IE#w_QÑĤmkœrċB7rvÁĉ+¨ğ>ù€Z˘ħ\èFŸ]µ’6˘Qvš²<4 Ŭè³ :jQOe_iÍlÄŜŝÑĜ×ÚzĦ9ğ`*w­w;·‘Äżß`ÄhڍĊB7rvÁ3Ìw%Tċ)ŒëñÁˆ.hmŠ&(İŝ˘ş-%Ô!lŻĝb˙-é@c?42Cŝ hà·€@*0Ntĝġ&H[  4 €€@h@  4€€@h  4€¤ Ñ`(  4 €€@h  4 €@b4'Nĝß÷])Ş4´I_4ĝV›¸ ÷YíÚ^ó#‰Ĥ[7İbŒß‚5·c䓂sîôê)ëoÊd˙YêOj-jY‘4Y™”×fgw2·…ŝیë2ò“ÏoamÇÒ:%˘hĴCSċGHEı1ËeÇq…ĥQ.R–Nnô–žçÇO³ò¨Lû"¤ĵñÔ˙ŬKŝW¨ÊCAÓû(Ħ1í5e|uŽıŬ4gŜÙ×ç„DêÍoj¨CGBĵxZ³ˆgâZ‹ĈPŠ)ší}âğż@;xn:~43î‚'IÚ£™ñˆö¸Ĝ'DĤŠÏžŝñŽ‹ßÇIZ•’q`ż(l?ßñ|!JĜËRRêñÉtŸİ;NJČWr†)”² /ìµÌĠĝ-$oïß­ÇVڞäîU¤}Íïh{fâK”ÒmÙÙż<‡Wdgóld;ó‚Zž~e½^AeŸìnÚmġù ]_âÍßŜ§ë ĴĊ–9ϝ@ˊ2bG„ÑœLÊúp¤kÒ×=< ŭâŬ‘hž~ñaé|ı‹L•hv>}p=JÇ_ tP͘ZÏOï’ŜéÂKSâÈ5Ëáӛ"UBĞ‹ğtÓ^AÒI2rĤ˙ùФKב”=—Â÷÷"½[”ŜŒ¨$Z˘‰—GtÍİ ´âI‹1ŽžmÒ]^ܓŒËë'{ñ˜ĦZu)Uî5˙8Š·óĉŸLڊ+Ž`¤Çn<èÍYŒïżU–‘;"Œf)š|/h éëzœ†jq ÊÂä?í|ıO|EŞöiÚ'IİiÏÔZíŽJSZD#÷ìtgá›g’Oôâ´5¸ÉùMé·¸˘â12/p=}.MCS+äMşž-…lżF†k|=ŒVÁЉ^4àğH¤ż[QAš‚ôX=ïçÉ2rG„ÑLbßż9ĴŻ=’CüGÚ>qÊ"U~Vğ³ETÍèÔÎPŝ£)-^šš…d`l ÷܆ñĴd U‘ğy=MI=jÔ¨ßÒËLâÑd|­'ÒOĵWÂG*şĴÍèĴÌğ0]Ħm˙ñè)<ĥ0‘{Ô$ŞÇä—J”‘;">jfj7ó4tœš$öiû¸ÈT‰&…|-µQ£g̨5£Ħ)-NjÄDy ıçLš‰3ÈĦçL2†Îħ)4I‰ÓËúĀ´›Ѥ˜FMŸdÔ *CkVpRC“ĤĊf‡¤§Çä¨eäŽHßkROoYŝ7ÖÉò^“ƒ.ä{ô^#ö‰™H•<’ŸŸEhùżé+%cÎ^Ğž§,Üp=ñSŒhDêĉ™r@˜ĵÎ@¤nccèçWħ” {ñzĵöŜË神˘Ñ:/>öĴ†f ı×ܢÜkf]~  =?èòCĝÌ­‚šĝżÖ Ö¸v{}I›&ġ§ħC$Q‘sb÷QFîˆô íÀµNG÷—ĝĝÑLG'Éa@ÜĊïÓï —ŻdŞvAs<1!îGx™ËQ%*Ħ²g¨ŠĉÇq–ÒÄ9eÛSPB––Úİ\v_Ägd ]¸ˆTö‰KrˆOÒâñTTĤġËáŸvëvÁ#áw­²¤ĤËG/šÊŠj˘ê„îiÒSMûxŞÔ]1 ÜŞ˘JRÑÈŬ7ô"ùrÑ·¸,'ö užÓpœ<ĦòSĝ°× ‹>ĝËyRmgTaÄÍÒt/}ħ¸9Ñ[ƒ–JĞ~\-&”Z9k˜NEhş|„Ĥ²˘š(İ{J=\‘¸îŞ–ż~?gB#ws*%ï[\–ûeË4µ˜††ëäôúî,ÒĈZރ‘j;GìÑôËf³úâÍäĞ%”VIü$”ZB!4]šbĤu*+U=ïĠRuŬùĴ $ h ğvÔ§¸,'ö‹ÜĈ²L¸NNœPŬm£§ô Oâš#ÑM6@“Aîĉ³zQŬĠ$ÒíBiÏ˙ =Srš.íFÙ:••ŞžJŭZKMS5p›É訉ch›U[ê¨1—ċä¨Áe…Pœ8ĦAäŜ:pîIÎgáÙ5YħGsá†gcİîŞ'ıQUĈ‹ŜccİÔÊĜJΤVjşÂTYяÔ=M~ôĜoş+žá¤sñ·s/I|çûĠ–(ŻŬkLĊe9yŻÁeݝœ8!çĦcÏ&­ÁIÛúKêelž{4Ğ]ŬŸÌೀ½X*­ĥg2ĠPjmÈL²[Ót…вBXÓ=Ñ)֕\ß&tW"2WâK½xnÜĊğ Ş-ħ[(²|‹‹rbżÈm,K…ëää MŒïñdNׄ’‡|İġ@ż#6˜Ħ…*mĴ²’/Žê⎴˘ŽÊ(K£K„Ô{QFÓĈ*+ö,ŝĦ÷Ĝ-Y~žÇ“[Y.€k’áW%RïEMTV;İ£ğ/£WŽÊ?ցR”€€@h  4 €€@h  4 €@h ˆ-k—Ġšˆ­Ĵ1Ȃm´.¤ak_Lџ$/òİ+ĜŸŒµ°&bÀC°Œ‰`u! ĊMk"*RnYcEkфU]ûAÒWĠ_>ÄWEĤğÂŭĦñğnáêÌääßó<Ò܋d›ÖDÔ ²Ta$&WC ė6¸şM–ejĥ/°_ˌŞT§çQέv]TĞY²ÉZŒW£´!Şhü­[è:„ÏċyäOIVxMD ûš3#1m5Dї×|ş!ñĈŻïe²,3dûÁ§żqÔH÷âYŜT§çQ·ä–Ħš%›nkÀc˘µ QšPcżëĤŭ÷żdfi¸Â-£­‰¨d}YkX QôċYöYš%+–e†lµĝŒóġ:W7í ğ:=r>tqË.š%›nĦc˘µ Ñ5ĜÏş…‡êşĝ}žG1÷×DT "í£­†ˆUƒ$ÚOË2S6œ²÷ğµÎUĦêD£ùšĠw˜´wSÚe4ÖëâĤçҍ£†oZQ)¨÷ÓܗË2Sĥ&ç6ĵıËc}qdŞ“yŒĉk5Yfğ7}Ô{7 њ<7`˙ën:‡+Ӎ÷hMD K³DÒVCôéKƒe™)Ûs]ÎâĤ$§4ĉ·:™G5_ó6Q›:£Ŭ›“önJ˘ġÈÙû_·°ż3Y^—s/*ÖDT ÒTqÖr5DŸ4Z–İÙ.Èfġät‘V/áU§çQÍ×Éż<‹MvozLT£´Ħ3CókY–33˘Ġ…ö'ŞÉigG@ß²Ĵ&îH$Ğ ĴĤUmè(hü[–m8˘Ġ™dyPĠ´Ş  }  4Aêİ {íĤmôT€&L4ċ€Ĉh ħEħÄĠMޞʨZ‰2Mħ¤{3i”¤Ê $Êh4Ċ’î̤Q’*3(£Áò=Ĵê Ì Q’*3XĦQ}4JRe+4RŬ¤ëİŒŞ5ĊÓHtÑHu“˘§2ŞÖ`àÀ;4@h@  4€@h@  4€@h@  4€@hMûD³" ú†hĥÔb|àcèCûĦİCG ˙ì†&•ܸá8Ċ‘°§l {-sġ8~ IÁÛûwëħ•ÚŞ%wŻ‚šş¸K7pà}1>IFÎÀô?•té:’²ç’Cĝŝ^§í†Ž šŽZşFÛÍ31ŜœèĊikp“ó-šÒoqEĊct]ħ§ÏAÏĈÍB206_…{nxV_2†ŞTOS’F5ê·tċ×Ä' kcfàXŒ'ÍÄds&CçĜš¤Äiƒe}"tm,dĵB˜ĵÎ@¤nccèçWħ” {ñzĵöŜ ş6hè §Ta÷E|@Ĉ…‹XJeŸ¸ä!gñ€ĝä+kĦkáE  4 €€@Ž4´IÖ6—†‹f_é eñ³ÎwÎ .c0˘V֊ĥD¸T”GMCCÒüCDâÄRjO°˙taÉ@îÎÊIVĉżxèLìrACĦ~‘P0;Q$ĵ(à^ġ4ÎÊxŠèeéHîíLf•Öĝò‘I(Aq€fħâ¤ÙçšXu’;8ÓëuÑÊThzeĜŻ5™ß\Ù9Ċŭ›î5M”·7_ge|YH‰F÷IĈ½i+HrWk&o8Ċüĝ\ĊĜ&spĤÖĞd`›z´Cĝ4[ĉ÷İLw˙Ĥú´á'io4ÎÊjU'2ŠO2îíL[AR|ç>¤|‹ùñı&ЉÖtÁj½JĥİúNóçcMĉ÷İLw˙Ĥz‚ŞmÍ%.ú÷ge*Ĵ­´Ĉ½İ+HR1z^ó-ĉÇçš(&7>+Sš< ‰6¨÷c³•üĈÊt÷oF˙i퍅2ê‹ÉM“s›ş‚d £›Wœ4ù\SG spf^™Òè͍Úl=żİ²4UÀT­ŭÑXx!sí~çû>hžërVf•'fş×ˆ…%}Wœ4ù\Sï5ÌÁ™Z/2ÖkBcícMĉ÷İLw˙fôŸ†C_í2h,ĵÍğx· ÷v&²J&ÏkbaIß'M>×D1v@îàLİë5Ħħöħ&óûTĤ¸Cĉj‘=ÑĜFm+4€Ĉ²Üĥ•R” €ĝé÷BïÙM]|•_‹40U‹)šŽs–i`Şs4 ­Ġ ĤjħESw[vvÜXj‘ÖóŜ3…)ZċµñÉż×LĠĥ÷Ièñ´_‰÷]^œö ŭ-zÒEĵMÑ>OZGçÂTís×:ĵ!KÚŻD ÍÒt/5Ĝœè­A_KS´~\Ç$LĠrÈV“CÚŻD MÏħl0Ğ/ŜÜKS´$ŝfW˜ŞÉ@Mş´_‰šŒE¤û{Q‹´I¤Û…)Z<˙'LĠ¨zïŝ[ŭH´\8´áYçXj‘Ös–Ĥh/z}ŒİZĈVĵ>ħVÚŻD ÍjW÷'3ĝ,`/–ĤhÛ3™šI˜ŞmÈL²[³_wh€@h@  4€@h@  4€@h  4€S9ĉá>˙gÈ=4(Àú5·cœ›p§˙–°>š yĊˎ“›½…÷ül>£ŽĞhLçĠ9÷ĴÂ;ûb|ó[ËQCSÙ'ğ›vASV4T@XĊWœJÇxçXèċhĦİKùĞrŻÑW4T@L­×Öi;™½-4Ż&z ÓQİÌ”IDATı˘Ħş"Ċ"—îƒÁ¨ĦY˜Îô Ġ^í‚Öh˘†f5'54úІêˆµÚ4l9£‡Ĥ&ŝŻuƒ54úІ†÷b2yn¸ž\Ŝ6ƒÁ`ôfhó]Ŭß(+* îJdì‘÷ƒ5ìġmÌVÙ0:Ù^hÎ<."÷c[›Ħ4€v‚ĤĦ­köQîëdhPÔ úé ù9êdhZċ6ĴĵM:JzF4a5Ô&µù agns:ànĊ¤[3Ĥ‹“ŜÍtuœ/eÂ=™ZĦ¤ñ8>îͤ›5é‹MSj-5I_w24Ü_Ĝ¤á§šö1§duBó&tqÜğ™ÁĥtĈܓİKŽcċŜL6‰ùbS”²exï;Û¨áʃÔ<Ħ^Ñĵ1]÷nfp£†ŭ8WĞéb¨ÀXÒp+÷f²IÌ›˘ ”-[˜u³Ħá˙â½2AjŜ„.Ž{7³p£fá\Ía¨ÀXÒp?îÍd=)ke l]#ħS˘IŭZ&HÍ[štżG½›Y¸QóuV“eRŬİ% Çħvo&ó59·)Ê@Ù²=q[;'šIÛÂbRó&tqÜğ™ŞŽ³öRĈŬ“İKŽcċŜLoÒs]Î*Ê@­eóÏĞí”hè<èJ%4oB'ĵ›)ê8k/eÂ=™Rħ¤ñ8îÍd“¸/6]¨·lĵM<—À;4@h‚•ċ€”€t^4f­˜ÙiêTs;^S&‰€YšŬ\v˙ĝišfi6CCÍÒD˜ETZ-sžú)i§f2KhÀ,-jh4Ġ½üĦ°S3› 4`–54šÒŞ^ivjf³4y‘Û§hĦQ•V\?%ìÔÌfiRh˘…FUZñQ#ìÔÌfi ˜E Ş´â÷a§f6KhÀ,-z34Ei%ôSÂNÍd––š€²À,ÍvïÀ,ÍĥhÀ,Íĥh@  4 QGÓġ‚ÁÖlSË´èĦË´Ž…Ĥ3[ĤÙMgĥL‹£Ş ,ÓìƒĈ¤jË4û 1İÚÀ2Í>hLŞ6°L³“Ş ,ÓìƒĈ¤jË4͌Ş6°Lë¸ï:‡ù 4‘”ċ€”€@h  4€@h  4 €@h:7XğÑhv:`I›˘YĜ úÏĤhÂò€ĥC³½Or÷*Œ3^ɍŽñÜówbœò§ŜÌxĴ·[Ħ_c…&m7 ëâ.ŬtÀqù)|ĜkEüċ<ĵç’Cĝ~¸Ċ ëéslP+–Ħûî,ĵ9ħ–šġ[\QñĴM34ĞÏO|‚Ï6_…ën=÷UxR_f”4zÔ¨Qż…~Ŭ4`}"ŸLš‰‘;ËÀ9¸ç"kŽƒùt,ÑĴ=…7ô˘³Œ{Ž‡Ž=›´'më/İÇ.öâġŻ1B3 >ùÊZ2 “´”*<1Ǔ9]kJò%]! .yÈYè×Xż¨Qds"x°): ħ%šĴƒ´)@h  4€@h@  4€€@h  4€Ĥ3£ħr>öĝĤm1EcħfvÍíç&ÜéĊ?İ mˆĤ˘ìĤ’³“Ésġkĉ™€!‚hLnϨK3ánL\–ı_ríĊs.ŜTod͞ĦäJĈ9qż#€!Şoĵuq-ġùıî†É@!šhö|è=vKVKùg‘ûÀf:ŞhvfĈ;¨Ġ-ˆ /h €@WšÈ'“áî húÇ'P‡Ì–[! ';4fÙt?—ċgË$ċvESŜ1Ñg‡˙­Pz/fhPûC#ŜŜĴÎLNŝ=]’İᨛßLĈËşÔâ YçÄ/ÍÚàJ|iƒĞëŸÀۓ=hµë˘Z­ıC‹ñJ{Î!ċ3ŞXSd^N4ŠÖÄÇĤÔߎ¸á3GñIĦ†£"lTjËîĊĝ²5ÑĥXáhî5ŸnHĵñĞë{aœ³ß+߃~é-CeÚ•H÷ââĊ†ÌÂÊÉó 5ÉaCŭíMÚ˙‹D¤Ž S°QiÚ·ĊM†ÔçÎ˙ŞoħÂÜĦ³ì³4‹k‰Î{Háš.²m‡Œ‰Jë\U8gŻFfaċd£ĝ1ĝá°Ħŝv„ĉO]dÚ%ĠpT„‚Mí'rU¨Rĥpd4wbE#tĞ"E‰ê;xLVÚïÖ:—ĝA–RÖĦ5ÊÔ%O;As˜µµéıtM GE(Ĝ„Ô‘ÎĜë²Éú–(ĥĉNA£úĦz<ġ5˘ÒÍ]“+ŠéYH9Ù(Sk”úÛĦQ#3âÊtM Çw0Ÿ.7ŭf(K;òısĞܒ§ĥĉNA£ßR0ò6Ŭ2GÛi×ÈJ›’œòçX2 +'…ôó  Sêoh„F­ż3™>G 5Ħ`£r~\ò/ÏâYdÈÜ^½ĜÒş5\͝‚ĉdo9ÈÁ"vê;DLTŠsşÈı–ÌÂˉF!ŭh+Ĉçàxn˜ëjEM* ŻË„¤mxŭ%ġ4ŬyèĜ³IkpĈ‹Ŝcd‚}áb/>P÷š¨Ħa³€*2ĞÒf(yȗ4OŒïñdNWĵ=“™Uö‰KrfhÑ!H˜üx `×GÎIÀhŝħúÑî/j@  4 M˜NÒ XÉ>ßvsÌÖ`4LYp3]Úċ¤˙cÊÎ&Ùž‚jn癵„ùNë• ĜZ÷h…‚NTÄ·=ŝ+A1G3Ğ 2^Œ_íëż=H_vİıì¸é¤RjOĝVTĝb+oZÊò5F wíñĤ"ĉhv:êq#uf Œ……†ûZSs!I_l¨UhZŭ E*STœqîĊ+úĉôâ &Šuċ2‰|‹_i‹"Tù=Çádëšrĉĥìì+Ċ pÔ×ZeŸìnHV„ŞÔUĥâ˘ĊĈâĈc²×MAĴÙ¨Żù¨·RY¨’m™Ëğh{ÔĊ$ġ%&E&Ñ|ù%ÒkŽÉ4 çÄ“"“h]DN4_k$8_láj`ÛPƒÛîhÖIpĜmeyŒËP €@a4!¸#kcŬWC;¨9ŞhPd²˘ˆµEŝ¨C£ ¤ûވXK*ĴŬâ!Ê;7„Û|xÔÚ˘Ž†F:'Ó\™qÇgŞj‹½|]9BŞñ× &}Y½Aq'Ñԛ(ÉÚ,UKBQĊŸİŞ-*>(EEUƒŽ§Ôglëı-°×5CYœé)k”#(žĜÄ£ÌĴ,CÍT•dí pN&UÜñ™ŞÚ2lÖ·ŭİ/ùVİ|iÉëšħĴ^Îxˆ&ç6%—â‰MûŻêËLÊ²È˘™Ş’Ĵŭ Ñœ“ Ew|&5PSŒ÷_ŬŬꗰ†ôA/Ĵ(³üx]3–ĠËogÏu9ĞäR<ħaì£/Z>îŞMj쌇’J²)í ĉœL(Ş„3EĊĤO\ċĞû˘[+×d5ĞÊ,kŻkĈ²z9ċè‚lZ^ÏxbĜG_†µ|4ƒħ3J(ÉP{ğ×´ cġšÊï ı=6ç~tO   pŠ‘)èe‰o@h@  4€@h  4€@h@  4€@h@  4 €€@h  4 mƒÄh  4 €&ÔӉĵèĠßÔÒY4G^T4mP}çAñ*?1 ‰|ġ€@h:šd.€ĈvhğDžŝùd@c74Éï~EÀ<˙H¤ÈŜC€&|4ïF úŸ_ħ½èW„ĉùˆ˘ùc" -;‹š÷8C>×£;²N´â‚FÙ2?Ô2UĉfĈ%_~€fʀĤ2ċá}û=ï ëŞĠ]yZ‡ĈH†ÔY½˙İu€&x4ÉïNĦ³fŠĉ‘)MÎ]4ĵy2íŞ÷’ŜhĠ °ùĠŻ”ËYÎ䠚 h ÷˙GF™2eÊ#Ïż;šĦÉĜMíY¤XuÚ<­G£äàuRYu~B×'H†ßsĠı.ÇÏĈŜŬş? h,n˙\ıŽßjâĜÍÚAŠ úQ+'Ï˙c$#ê¤òÚ>ÏĈ.$Ç%›Ö'’ħ9œ\ç<ĠIöĵ·ĝ!3EQÑÜÑċƒVNžŭ˘!5ï'{§l¤~JS–&nÙ²%m1 ħ$óÈhIĈpA”~4t4l€”I€Ç“Ĥ]6öuâ×.ò‰gi³Ż#ò QĜŒĥ c˜T§]~"T4|j† &Gğ2ĤbLšT†l…(Lü°ydtĥŝ´i˜NżÛôZ–ùTjš÷4I’4™IâiĉŸäÌïçgì$5w“½SÉߓ=û½äz²g*Ñ+ Éd\'dQ%;“¤W:ıĞ4iö˙JI{ŝ/ÌNż?­öôĥŸ2›H6T²˜zlb²X=6Ù°š?P!{Ĥĵü½ĉg˙$yxŝia§eMÓ'áўŬs¨ì¨ùDfg!Oĵ¤|Êm’Sô$Ù0yyÍÏŝËä§y͆Úê¨òíÙ½‘ĴzIî¨ëÉŜÄK ¨……Nrğċ)ı£Yŝ6rš?4êttŻìë5Éòîġ4Yí.Oĉ’•Éî†JÖŻ²ŽçVĈğë]•\~QÍuÇğ 6ħ“y{•“svËżëĵñÉş{k>o£x ™\÷òâò§ŞIFž“”’óĴ–A{t&XğĠj§yZbïŻdÒÖî:wWnşÎÚé[í);Pĉıâċoa5њ›òŸ§™˙&_4ž§ü׺Ë:LR{Yœ³se“ŜĜċŭ;5~è@úv]}^ù‰ëĦ¨Ĵ5Œ&™H&2ÍÍDŭ××͞ÉÜöf§ ŠIäé=÷ÏĊ;ןWטXcßħ·ğkìë>Én)Än&>Ñóßʲ‘Ż+OvxInz•ïîöİ­;ûUxz²ĥÚ5­ÀÍ$ñËĈáN'ĞEŠLfĞ)2‘l?qñ½·ĈŸm-]c­lN.[b|o–ŭ‡”šµö‰ö˘œIÖ4ġş‘>öùkÉ Ĝħ7—ÇĜżÙçهörĥ$kĞĉşQıÏ4wzïdoy^™ìw²ÒC³ ˘-ó{ŻóŝòÜ“”%­ıÇd§ĜçRÎîûĉޞgmŭz•X¸#·“5ï;vbĴsmI.m÷£”Şjeep½­À•ÊV@Ú´mEs_ËJĉ4+clN–ϧâŽÔ<ËĜA3ÏÚúU]]ߨ„µÇĜ‘%wUĥĊ˘)ğn„nJ[ë•­À†½~ċ…}eE5l§Ŝ¸x\iîİóĵ°¤5­VKj–żfçÍĵÒÈWĠèV@½Ÿsš•ÉŞV`ıĵ(´iù{’ïšžòqß5ĉ G7²kíñż­ĞĴI<Ûr™ÒL°#ï~6Ŝíı˘jĜÜîÏX[/›`×ߖÛIŬğr‡Ž9ه–Qû¨Ŝ{ÍŬMn%ö”Ŝ°ĥLž~káÍ#k矐šì_r™Ìk²‹{\Ŝœ]dwvħŭržµġ²ìàā1v\ßÉĤžxê 6ËÚ=7Ġ÷6›Ü d·}o6m²‘Ŭ0N°ÎÍĊd×ÇâÀ³?°?­Ŭ>şv›ukL^ŸÏtnÍIͧkg[z^nl–ŭZÜ>ġÈÚí“Ĵ³ĝ+qáŝ†l­ċ*ŭĦ’r·ô¸ıÛN•µ‚ĉg7²·7>ş”ìn~Ġ|êy“Üm>5K&§›—ĵ¤1ŬÜĠl4›ò2h6w^ij&­­Ùû­ġG[˙hy\.nLĥZòg‘ß´ZךjĠ:˘–5*ıßZmµfċìûMıµœŬUÛÙܧŸcÊÑĴUëHzŽ„ş~àċ“×ÈbgÏ$y ħıÔĈiÔċKÍċŬO£N!™F8Ŭ““LÉVjLu6)”MÚàx5Í\ÚşD”k¸=í]§ŞCŞ!bë5ŝuM…(ınˆÚفFÓ'.ŻëêŬ-ĞiÄ62ÁáY2ĠÉ4CîĝD¸ M9Ş7.żiġsm·-\›ĤäîpîBĖ\70Ñàîäsj!˘NÜCC 4@ 4@ 4@ 4@ 4@ 4Áj}ċ² <û(”MeóċġT“²ùÒKkP6kŞß›‹u)yGi䆔š¨¨ËĉÜUİáòR¤fb.›î’i\YTt¸l^9ÛĠ× Q%C\€V¤esğûê³5͖LÌeÓíĉ4‘_7²˘™šF݋Ĥñ– ;W³ï›p5#}Ÿ†ŸoP6ĝÍˆ˙Îh h h h h Bĝ3‚a5^ZĜ3›<Mß§QFĤqħœ j‚9T/ş/ğßáY÷]ÁkÒXŞ9ìÓi]6œÚċ4ˆ2–=bwÜ,GĊrp0 £:R !iüXŽĴŠešÈjšËÑ{ŬÄĤñb9rmšéŸK/İMËĊr„}4ì·'ġw )ĥëŬ§Ċ]6ĝ‰h h h h h hĠÔ4–>í4;EĞqO£ê£Qħ\?^·<KÍqğ(‰ċ <{m GÍÑ´…X4:–#à Ŝ`7”Û ˘ÑĜX£ħaÔíËġ@\Á4óġËá (Ğiĥd˘)Ëá_7&÷ÔĠ´ˆ46–µiT·i&,…pn#;x4­ÀıÚôdÑ7’oFë> ?@ 4@ 4@ 4@ 4@ 4@Í šQé—ì™Ĥş—ĝ5iż:x#ß9‡›§YAĜšĴ_ĵAò ¸yB?0CÄrĜGê4σĤAĜ.;"¤ħyëœvÔIMËb9rž+ÓÄPÓòcĴôtÎAşn²~9lh·mšŽê .j-–6­7–#ÖcÊż=Ġ”Ŭ§EĞÁO@ 4@ 4@ 4@ 4@ 4@3¨f„b9htšŞXŽ85Ĥ_‘sèWġܓħħŭr,˜öÈá:ˆJcc9(ï àÑĠ´4–ÓbbĞiY,GlD8Á5C•MËQZÓbÓ¸~94€xŻ*B%6múċÀ}îĦĦh h h h h &Mc9hî%F˙4ŞštŒÓ‡û£ġ85é+YF> ŞñĈXĦŝp1jrcĴXéˆ#BMnŒż’ĊYӊŭrÄ}Ŭ¤ħĥç—ÈÛ4Ärà> ÷@ 4@ 4@ 4@ 4@ 4@fc9²%<÷œf Xލ4ħŞÛ5 ħkġß·Ğ—`5ħÙ0v-q#ŻĞ݈ċPsœza¤/j*c9ìœ^b×Ú>;ÂÔTÇrè‘Wìä•`ËĤ2–ƒĞŜzÍ UôuSËĦÛ4jÚ4µ"ĝ6m4b9ä•ObÓ –h h h h h hFRSßXûÀŒĤ‰û û†‡ŻñžFġÓ¸ùH4*–C3ԅyìÉÓè ġú9¨JĠ\á>x,‡Î¨˙HÚ<€ z°cŻl[ïCÄr¨ž×PO#ĵ1ĥ­×ށc9„Ú1&ñ5*˘ƒ¤šíëµcàXakš°ù²YMÛĜkǐcĴôŻivĝš^[ajl,‡°ŞĜPŽ4zC‹nÓÔHRT‡Ğ…ÜĤPż„„t£‡Xh h h h h h ĤlŞqż"ÌQ†žFĠ@óŽŭvNìZ•r§ĈĈrĝñ$} &ß/‡}”İĈĊrPš×Ħ&ċ(jâÇĈr¨Ö,‹×ˆĥĤıX.L›Ĥ5(µM+¸O=44@ 4@ 4@ 4@ 4@ 4¤Xóĵ­ÏÊ5UħJÔÏ‹ċOv…ëŠ< UƒħpĤ,‡YÁuĊ‘uÌA1Ĥ,‡êL 늃zĴ„ŞİŠċp1é+›‘PkZe,GŞ…Ž9Bc4–#Óx׍ùşİŠċpËrmZÈ5mˆXŽí˙âÙşXƒfàû´˘ˆ4@ 4@ 4@ 4@ 4@ 4l•f”b9ÔÎŜ’Èc9Ì#öˆÊĤ*–CÑÔġˆċçu‰ċàn0ŒZÄrèJfŞ` b9”Ĉ D b9lĈëËaoËĈ·g•ħ¸‡†h h h h h š05ġŽċ0;U?ŞáájʟFĊĴÑħrCùŸRJ„?zÚiVĜW"Óàc9„yÚLL×ĉqğZJÌÓÛìUÄˑElè‡ô9§ çH_·sŒ!b9\ĆĠĜ1VrÒA,‡‹ĜHkšè-!|,~MËĈX)ŻiĦÇr¸6-‹§!iÙèîU‡¨Ô –#‚{ŞXÚhKch h h h h ùO·^f:şf¨­ĦĞ!ƒNQhv°ÁĤ3JcŸµl:}żmš7ŭ@k¤G˘é ´í@3jîFÙDCŠíÏCÔP‹´‰Ĥ˘FÇċ”DL5&tLÇé@HÀ.Ѥħo6”'T H#2FšAkq Ŭ!P°>hMKË&ä6mÓš ï‚ öşqß7|ïBuÀb¸mîl fä47›ŒĉÂ`o›f¨ßÙ˙[Žzŭ> h~ M­žßü4@ 4@ 4üš‡k¤y™Üİ‘ĉ8á‡jƒıµƒˆ‡j£yŽÁĠsx‡Ô¨*j1í`ìf¨ ÏîDIENDB`‚gamera-3.3.3/doc/src/images/graph_example.png0000644000076500000000000001103110714675724020076 0ustar chriswheel‰PNG  IHDR9)ğ3PLTE8"#!231CEBTUSegdvxu‡‰†—™–İШığ¸ÊÌÉÜŜÛŭ˙üp7­ tRNS@ĉĜfbKGDˆH‡IDATxÚí]Ù˘( 0á˙żĥ=ĈbvWx˜éİİĈäڐt.—ßĝßĝßĝßĝßĝßĝƒ е”RpÎç˙RZuZĞyçbŝŻI› M’· 6#Go˙(ĈƒÁg”dëÚÈĵLŝ£RÙ>Ëtŭĵĥ×ç˜àà˙œİ£ÀĤ†1İġġuëĤ1aŸ6I篎ĉş=´ßa:ÀÄQ9ÙíeÎg‘8"/žü ğ,ĜöĊmY‚Ŝ_ç$œ£HÄpGG{…Çĵ(";^S긊XĉUÍ?á~Ĝލġĝa´ŭüşÌqğN=ƒÜZĞIBä5aÌ›ġ0ĉc¤RÖ݈k{=„ì5m(BU…ĦN&.ó*kg¤XĉĈkú`YÚM„˜ôeúĞĠN˘Ż9C8T%;ŸžĴeĉÚe3KĴkŜÇNd.ó:´Ž°köPxvÊÎC×àÂ2bòW4_X,k³dƒg™LŞĞ áĤkْpŒJŠ–9_ŭÈkÙ 8áLÙ2§Úr…ÓBàĉ%!ÜW[ĵÁWAêú2N•èJ9Ĉ‘³Ë´u]ù‘óúµ}À“ˆòurzĴKàŬŜ”ƒÜ4]SĴHW¸Ù3lîçóˆ×ú5ĴâKZıɵŽûGÄqĜüW€ƒ9pÔ½Œ‰85t‰ıSónÀ{ݤPĞnÍtPDBK˙ĉ޲zwÜ(1˙ nxëĜşŠPgĉŬ?ç˙|˙AäÀÛ:ğ<–‚Èıħ÷mBĉm…“–ĝ—ŝE Z%rˆ¸­‡°J"Ği•@ĥ£ñ×Dî–pr5-aÈûÒó˙Ë9rï FŞ÷uázŜâŠ˙Á7Ò1(B[Ġ‡£L>ĦI÷2ÉE™*„™”ÈŬ8\d³B4ü£ÑôyIeQaĴv´œçĠ°…Ŝ˘%Bî~İ.Ɏn¸ ‚ìŜ*ħ„)óŞ˘f䌎eÙ&Í2rr³ÀüżuA‡Ëğœ'óeeĥ½ ÄfğòÙCbĥëHšë0Ÿa}e{fXsǢó$'вż˙żĴ~ĉ¨FÛOpQf)oıtK% `Lnİ•ċ‚cà:Ĝé(ĠKfİ^R{ĠKTâÊáÑ ıTĈI_-€{Ċ›ĝ19&Ê@–Šıéµ²ÏúŠ9×£bNŻĥ­~TiÒgġ#£Yìf~9ȘÏÖ£4“sö¨Òœ:TiDĴžĊž”œKĊíSÔ*'/ÇœŬ+˜ç˙”Z³ĦË2>BFœHu äĝŝ˙Ĉâ#ĵKEÀ]•@îëŻ%a‡Aîs²r_˘?üvoÜpXä\‡sOżÎàŽñr-ñ)s; ÷6•dO$£„ù\>r sWĜ6(Ê3@ġç ŻkÚïîş§öZb9Ü˰ù¨ĥòœ8r“ğôEnëîAkĜÁôíE@‚ݵv[ú3Y§ı ê~Ž›_>İŭ‘#‡ IR­aéˆì0òŽÈ…´dÄúk‰ïíexÈ,3é6ùFÏċü7%˙yç° Ŭ z ‘n N1z9Ù ıpÔcˆ“ŝƒëŭ g\Ĉ†û×i/ävÄT4 Âu|FtÛQ&ža“NÈí™c ċe=&}Ûud‚gûÄ}Û½eI èg#'Ú#·OӘŬÂ&ßËl˙ĝµ˙cf/ƒ¸rÀ_jŭq/ƒ¸r@ёL ½u2ˆñ‘ƒ•Áĝ~é½w]Ö¸/m(3•éîWá-"Rez_%Ŝ8ä6j2Ŭ}[âÏĵȏ×s¨ĥÄÓ<¸yVppŸ6Ĝê2ŬŭÊF+€„UHħÓϳàúŠ,èHqĈ$IÙp´2s2`k½Ee!.+/Zê]S&áé!bañ ï}#—ĠAä|$WCÌSÙÈ î]qèÔùéáÛşüĊ1ġĥĉ²‰×irħ‚(kúċ÷‚wÌßÖ8 Mġ-ÔhfTÔqôġÙbħ÷@a¸hˆ(ĞúŜ—U’˙xmRœ)›o• L‹(a² gĠ~”OG YÂ7À)׆ğÔŜÇ Ç9 l‚ĝÂiÈ~£Ï7ېš2§—Cr‹÷5OŠH ·áñ“ì7j7ԁ„lù˙šâĈcĤS£aEf+ĤâÀQ&mbÎDŜĦSÓUk=ŽûcÈĉ7GrI*N…0Ó§ïŝôúvŽĈˆÈĉ…–FÓ7jQyIùÇ8šgE‹š £î7Ğ,²Ġ­¤,µ—–ħ ĴŠíınžşgŸ4êċ¨èus–)CĊ—ÖÛ³^Ñ^BÔ…Ż†Ż’%dż›ŬğJĞ‹ž’aš“"ŝVŝĉ³ì¨•ÙL,a‰Ġé ,B­Ëü§Ïä‹!s>hÓ9,NrÍL™1q´œÙü­”¨*+•Û²xŞP͛G°Ĝɍ˜ !ĈĜfê–JOô3< BĞĠÏB²â.ZLTäo5)Y³^5G–:­S˜J°*Ó²]ŭú+Mïam…yl­ŠTω½™ËêS§§)ÓïeËÈ$zÏ&QġŞ c V—2ƒtrŠċo™cÀô+ç&8vĉj6-Œ!XUùĞóÖ¸ZÓ/<ŻÁj-áiHŬ²Áj`;ġ¸üßù§|ċß MoÒĤWKeÜĠ·j?McêWò> VÍë‚Ö>*Jm _ž´PŽNoÓ§IgĠ˘/Óĵ3°Î`ĈX™—> V飊҃Yiú)0}ŜaÖ7>Ó0XĈš·ĵ]ƒ³–şÛ6Óß ƒu­ĉ<ÑĥFûâq~$܈)ĝĝĊΆ\$?âِ‹”üŒ˙Ë³6ˆÙΆ\œèŸúĊı¨šYôtÈEÉ~*~ÈeÙ£çÙ鐋t#FŸ½ó!ap ´çC."QŸÈrY‡Aéw>ä`+‡Âŝ„ȁZ8|v'D쳄Ӟ„ÈAŻZĞ ‘ƒ€À!u8!rÑAÄı, €tYO‰ÜĠ!xġΈœHŭĝo!·k +,ÌS"·W)=`‘`žı=Q†ĈnvJävla´ËzNävla´ËzNävla<*Âs"´…_Íy‘ Úœ]~ÈċĜÂám˙ÜÈ-ĥxÖ =z9Ĉù¨¨pîORĵËzNä<ĦÀÍך*1 ÑÈĴ* K6 Òîżċ9q&ä´ÛEŽ ˆşÓ*šÇRg ğÈĦhWç0‰"+ş;È1ÔÍO†Ü´ƒÎġQ˜”}ġ·| 9$SÁžP?ĵÜ× ääkBĴŠu_7CSuËjr_ż‘3ëÍġ~!‡i#üQ?,cÜ@Ó,§ÔĞÇŭ…Ş >R?ĴNĜR&)žD§XwUOËw}ï<ôı{ğò˘Ój<ŞáïŽâñ]Ĉĝ­l™ u ÷ġIìú^ë^‹G5ì7°˘ûƒPÖÎğ˜D°Úkĝ abWĞ–V NÀڒ!ĝŬ ÁŞbôÇmmĦ´-Êï~ĥ{#ڀlĴÚİÁ€“0?쳕ŒŠ›È XUü QÏĠjÛuù ˇbT}ß3+ï‘ëŜșŝٌÎRAÁ‰Q•˙îŭ¸Ŭ;hİ´í¤MîÔ6Tx^Éo}Rf×]$\NK?ċXĦ–U`Ÿê통oc=ğş² Œäµ‘ŒìÚ¸›ĉuÂ4Ì n7îMbâbdzğZVâ\·6ÙĴ½ˆŜµ Ĥs]Ò.÷…­3Ş–·Ŝ7Ĉ|ü<_£ĴE3Dş£ĥáoeKɖĥיa4ۈżĠĴ˜Naûò}{–p-í8?Dڄ$êjğ²Ĵ£^LŞÜ“8˘Ž•9oÖeèזü­#J—èĠÇĦKŻħnÊߊR™ĈcŽÄî:Ĥ?íTàô ş#³ġ0ğkşLf8}ç.ݽ'Ç r”Ĥ·ijËߊĭ£4+ˆ\r3‰Ĉü­´½]Á*ċ"—ÌħcFpn 4„ĥ RfĦë䙿 `Ç&qµT€*BĤodUyUĝĥ&Żĉo%Ë´ĉ°ÈAż@ğ(9'iíÛŞÖü•·c‚u×ÒµÒ&Qဎ!È9èD"—Ë`ŝÖĞ£Ë VNŜÀ F—-óv #Z9Ŝ„Úy: ÉÁDż•éj÷ßP¨‡=~˙ ;pĥż÷$#6½âTk(„£¤š€.?H£Ú*ʤ5hÍİPı a&ʳtS3ŝV¤^eûlqOîYRE¸Fü­+ż¸­  Ŭ{)‹ ›PnŜW[ç,ÉyŸ- =qÁô¤5&)4_5áoe¨íùY †–ìp>Ğ ·N££ûtyÏ튔]ħ.Ğ@v½Ż9ÙX²¸D"—żġo#\> B:´›ÈÈ´ĵ‚úÏ XOÖß‚§\]Fû”z"ş¤mÚ²Îċ…=Hìš6òĝ[ġ8CÜZzBeżZ)%S¸R–âĊ¤d ĞbT³­NöÒuŒÄ Q<޲^fú"eÛò·â˜vÒ8ħk֞ĊĴúş—0é}Ġ…ĜµĊ;B°*öù[G{9öPĠçé³ÑÄ‚öA°Ş_cMjù.•çè–óΣêRˆ]Ëû$X%ï’AžĴFĝFtzÓ^óğêŝŬİğÚüßĝßĝßĝßĝßĝßˆ˙·(¨ĈŽIENDB`‚gamera-3.3.3/doc/src/images/graph_example2.png0000644000076500000000000000727410714675724020176 0ustar chriswheel‰PNG  IHDRfa Ï~3PLTE8!# 231CEBTVSefdvxu‡‰†—™–İШığ¸ÊÌÉÜŜÛíïëŝ˙ü{ï4tRNS@ĉĜfbKGDˆH*IDATxÚíëvœş€Ç|üŝO{lfҝi’mÀžSéO³VSU|ù&ɏ Éâ½ÑZK)UúûùÓĴ·Éìéi½óaHqž0ż~dRğ`ŝXϒġòùcÍz“mäSràġ?™“sdƒıc3ĥÓ/Ö/ŜmÖ3ċǰÒ%+…öËúĞ$?a‘›a}Úeó’×îXo·żîoŭӌġH›ÜBú!k™‡ÖŻ›Ùf²¨ü Ëlx”ĊâäÖ/)(vtË£šW¤¤gRC…—ß<Öúô¨SëC~Ċ+^™‡²ŒĵÄú5}¸ş‡30ĉÖ2™§¨F™Á1f ­On"ïÊQ,kħ˜(†6ŠPn½eüĉñEEµÖHú U”Kġép÷6³ÖIŭ9Ш+­_DtwF ğÖÊÂYïy\5ċ$7z‰mħ3}y˘ïîKœĴ_n³>0ıĥˆí:ߘ™XZĴqşÇPΛìLSĜqċ-YX½ÄÜ2üÚ(\v ĥĠzÉï0TV;“CtsgĊ–VëӛúwXW6ġŠÌM£÷×lw–íΜ£ó<3;#m÷ñ wX—Ĝi‰‹W§’ċ›H!ş0ß`hµ“ˆô+Àö”ׇĉpfÙg³$ěP—gè{ÊĦK+p”Ôĵ f:‰×Qj -—cG@ׅ›î†Ö: Ĉ›ÓÛêŽ9›)%aĜ°Ĵ3—Ÿ4P˜ŻwÄèµ½ù‡@q½Ħ„NOˆ 1„ñ+78 dĊĉ0ĉ‘—'Ì78 ´ĜöÉÌ›—O]l˜ïXlƒ[G"MBr—ŞĤŬ͖VE¸1Rġ‡¤*ĉD´š‘$Íŭ#ˆĵ&ñ6ŠÛ}ĕ'b•F^ö{L÷?ż(ÂYß§(âħ•ĝLèŸ\tġIÛX’Ĝa|bÖ陆+Á´è‚5ŜıQĊ\~y<œlċ—CÌ0~ş LƒĦí_~İÒúŝYLĵWŽëŠı˜8ŒÉùᏋ‰ÍĊÄ굋bċWqù·I^V‹˙JGċü*gò§ġÛSġ/WßöŞŜ[%?ü÷9Ô°­ÂÓ#ĥİP?v½wıñGŠ!Z›mKFĉüŸġŠq½5]ÄVµ;AÛÛNókB­G²fŸò.ĉÏà<ĉÊû˜?‚óH˜(`ŝÎa>¤|„9s&̧P>Äüè}Fġ9˜Êǘ‡ç< fˆ2€yt΃`)C˜ç<f˜2ˆylÎC`FP†1ÍyÌÊÌ#s³A4aRäĈċÜ32û •‰8,çî˜ħ9†¸„ÏQ9÷ĈŒÎäDĉĠÊı3f|,6}yLÎ}1d%£³Ä‡äÜsIî7>ßGA˜+)`ÎÍ: sċÌrî‡ı°Z¤¨‚g8ÎŬ0—Öä”JĈıĉâʧÂz´Á8wÂ\^_VZö7ç>˜+ŞĝŠĞ+‡âÜs ò"֑8÷À\ġüµÂqî€ıîékJ²Çá|?ĉÊgŻŞ|†óí˜kŸĵÁÀ(œïĈ\ŭܕ}ìV7c÷Úvcps7\Ŭ•dηbn‰”ġÍ_Fà|'ĉĤñ¨ĦÇΜoÄÜ6ê·´2êÏù>̍sĞĤŽQŬ9߆ıġ„­1WoÎwan>onì֙óM˜ÛOġ[ÛÌġċ|ĉr'šğùuċ| ĉ32Tڛ&öä|ĉSò€NèMّó ˜ÏÉĥ:£h?Î×c>)§í”NĞŞç0{Ÿ›H)§ô‡ûğ—A3ċ—ú(²zÛĜ*á'ç7ëíéĵ7Y=-꽞^ÍDD2Tŝҙ£‰ò_êÙĞHKïœ½QgгŝOÓŝĤŜħžMV"”ñß{ú,Ż>3ìĞKN-ċ§zŝC½{ŞWĦ‘óSŭdü[ó§?ꛧâĠBè‡z–ĠcÛUĉNDRïµ\ 6wMÊ=Ÿ*)o­ô^—÷§úÊĤL™³ğN}§ŽĠköĠĴéĜӞÌŞúŭÎϧD´suœê]}3 ·w[·¨×9$`úñ™Ş~|ıŬZ½ŻRïŻëLJmV¸¤°"üħt_ZSÜ]ÒĤn^ıŭr™ú’Ŝ˜ċŬ%mv,tCä}/ %zÊ{^ڊµ¨™iy§×"ġsšv]dmvÔÛB=…-\=şŭEßâeÂwŝġêm>­Ş:n£ûXëŞ6Ù& ܗñÂ>Öù+Ô3ŝ·zYÙ§ٕ}ŞlOŸĵÈ£fêÊì*Nuê9{ŸrˆêğPw ÈzġqsäT}CÂ"*Şúވ¤Ŝ)ŞżhgŞċBÁà€Ô¤~RUáß/ähR´h$ħmêĦċĤkş½ĵ˙Ċ7İ˙ĉ„mŠòHr83JŻĦI½;žÎ¤×xÚátĤŭ²¤/'lTŬÍuÂĠ_Go½jÎŜÍ%Ùĵ6:Ħy}Ó~m”£›ĉ.VñMsçİç²UÑá% ‚7Ğ?ş–QžĦ~˙k™X³ú経'x[ ôêBwXW&/Uż˙µÌM£÷×lƒŜĥ8ÓäÎ'xۑzÌ% à#ì-'Ü1úRLí*ĤÌğÈî°.ğsŒzĝvĠó3Ĵß.€†b†D…î=CCûM_†ŝŽ3ÀGӕN²]gç30Ëi/v†³ ŭ]½?óžúp¸•DàAf%Á—:ɽ…0p´wû5ߛ-Bħ3hí@Ì:î-0lĵwVi!4ĵ·g¨GÀ —UAk€]ġĦ^†ÚZġsZzċ E )]x@KU™qSœŻÂœwûÁRy;K—aV2/§ĦıXú(Ac{ĉ˘ á"6şĠ żŭ}u_˙Ĥġ݆@H•˜*Ç(Â\;>µ_7Ĥ }šmB¤Ĝ äÍĠ:1[3û:hGy³P•şe^iŒ“@7gFŭòÄmż°8`ybêÔğm^ aŜ_ŭph‹X{?£œZ o6j–Ş_lóôžgàĴ­zħ½0>çÑ`+4ìžû†MÌÛbÛ )Ë´‡(·lĦsġpçœ2Ia.Ú:²ÏTwÁj#4xh~´ ïù€q‡ZġIûRŻĝZĴ[ĵ÷ĈÀĦg섲éh[żyWâm}.ŽNĜŽú§‡.ħ­˙େTêĝŠ]zÖ|ФCŞpÔí’s@—ÀoÏ95À‘k™(p˘Ûz& œèŸ”ê4°H{2ĤsNĝ=”éf›NΓWžƒù mNĝ–Ÿ’Ż2iûMù*pĥİN:BeÛ´8á"Ŝr²Dµ¨‹§jKQıcġÙW¨Ü1UŭıÌçŽĠĉÚÈ1İŠµı„— Y›KèqêëÒY7ô§¨ÒĜáşÌXt^o]f,:Ż7§Ö¸à/y½ĥĠИ^äŽúĠ›ĴŜÔĞ÷[íúüż›úbâ°İ·aW=+Po·"òéíh`ñŻş{Ħ[Ëĝó ÏŬ ŜĥÄżÔcJžqêŬğz{šzöRŜÔëgÁ™ú§—Aî•jeëî§HxZuĦzùC=ğX½ĴUï·ÎêĠµä$˙VŸ–8[ß?_£ŝĠµätġáĞ-Ê5êO—è$„™0“fÂL˜I3a&!̄™0“fÂLB˜ 3a&!̄™„0fÂLB˜ 3a&„™0“fÂL˜I3a&!̄™0“fÂLB˜ 3a&!̄™„0fÂLB˜ ó?+³wZëIF‘{%ÉÙâġğŬ>d–ŻŸµ‰ÍY^l2UĦÌ{—óàtn´ÂĊ$÷Q’fŻŭU°[Ï&òé6G~vĥW7öûçEƒMè:ŬÁ óHvdk‰n˙XĠW‘$”´ĴkBJ’[ —ŜûħLP×~’QYVtáŝµÑ4ÉÔö”÷?ÛĤ“슨*bĈÜ1@²IË}ˆ3Hž£_Óí5 Bˆ™ÉĊİé²$‡żià_–ĉ›ĊŽïĉ"y…Œĉ{ò¸$Œ°3·R>ĵ7‘d“M$w†ciéXš&s&Ï´‰ÍĉÜ ˜WN˜ÎÀ,)8;s2OIö2Í ċáv8:µÎ\c Ħ<ôf󒯇ÖPh!̍Aòí`r­(hC °Ôւ†Àv™Ħ bŒLÂhB×ĥ<ħÛb|1ÀòÄÉC™42·Î@ŝ-ĥ›·Ž‹¸^ya´ħßwäĦ iCĦ ¸öPÚEˆ`‡TŠœ³IÇÚÎO,í‚"†j "… ìŠğ!†Ñ:=y>C ŒQrZTœŞĈAË8Q.Ċ\NYGJì*\ 2V gIi]ċ{u2ċë/*2JêŞ™ĜTŸPċIƒ'LBATGĠ6…ĉ‘)`?Έ'Z_7Ž…[µ°ŭ}ŜħxM%§ÍîĤ\/µûĥ:{oÔV2OÛ'î'Y-ŸÍ"—âë§ISĴ¸€uò`ŭï‰0 É˙‰ü_ĦiO o[öIENDB`‚gamera-3.3.3/doc/src/images/heuristicclassified_color.png0000644000076500000000000000012410714675724022507 0ustar chriswheel‰PNG  IHDRÚıŻğPLTEĉŒŝ”Ġk IDATxÚc` -`ĜNۋIENDB`‚gamera-3.3.3/doc/src/images/histogram.png0000644000076500000000000002205610714675724017270 0ustar chriswheel‰PNG  IHDR_éì}PLTE†††’’’%8gŝFh²ĈĈĈJnşîúRRRJn:R>>?vRb"2WH~ÎÊÊÊ:RŠNb†&&&Êòŝžâĝ´”|^zĥ‚~fr’V†ÒVvĥŠŠŠĤşFYa•Ù^qž–––Zj’ÖÖÖÂÂz°âFbvŽÂÚŜâ2FtEn³Un Êöŝb˘îr‚ĤJjBZ222^zş†šÈbzş¸zu|ŠvŠÂîŜĤrrr^ZpEb˘R}ÉBBBvvvŽŽŽRr²>Z•öîÎKf˘;Nxïüŝ†²äV~Êo‚µžžžbbbââFFFzzzz’Âf~şĤĤĤZZZjjjⲆŽĤ*7\êêêbv¤˘ĉú²ÎêjŠÊĈڊÂêâêöŜ²’ÂÊŜj´‚šÇVjšf‚şNn²Db§Rn²BZ•üúì~’Ä—ŞÒRjĦj˘ÚZtĴ+>gŝŝŝJj²Nj²:::.T˘Z‚ÒŞ‚ŽĥŜ,H‹JJJÎÎÎ~~~N:Z...ĉêú)3VnB^.BsB^ âĉö~–ĈSfNrn†’²ŜÎÖê6NƒrŞŜ2JyBVˆFfĤèòúh~­îŜŞööġFZˆKfĤVr³ĉîúĉĉĉ=V‹Òċöf~´JbœÎ²Ş Ĥ‚‚ŝ‹žÊ<@l8\ĤÎÒŜzŽÂRr’z²b~şÚâö.BnZq£ZvĥÑŜîĥĥĥNjŞîÚŞ–ĥŜ^vĴšššD^˜ŜŜŜbBZQnĞ˘ĥŜ£Ë:>^:Jt2Tž²²²ŞŞŞîîî?R~˜dlÚÚÚVVV***"""666˘˘˘fff^^^nnnNNNÒÒ҂‚‚şşşdzŞ‚–ĈâĉòN^†ÈÒ2Nšj‚şJ^’>Z›òòòj†êîúI^ŒJfNfœUj•j‚&B’BV‚ŞşŜVrĴ2FzĉÚâNbŠîòú–ž:N€=V“nŠúúüb{´FfLc”4J^vZn™&:‚rŠżnžĜ^vµVn¨6Jw2>doúw IDATxí] xWy5 …† \Z\#(k°"B‹blKMÀ& e R Ihë²ɲ…Ë{~éa µ£TĊµ[ĥ …¸AEvD҂(Íg5ì{dR‘(‘£š¤)^ŞóH ˙ùïÓ½wfĉä73oF˙ŭÈÑ—ıËùÏÑĵ7·‹Š(‹¤Â@mP΂ğüä:żRĝÏJù‰a@˜Ċ@Ċ?óĴû䕋à-úßO}û×­+,AYÑ6DCŠ0 X Àm+à­[÷S˜KÙëR§° #ċááácäħ ÷­XħâàmùÁ(†(X‰ÈŽ íÈĈiĜ…hWŻzPÜËŽÈ Ħú  9—İ#6ĦwÓq/ôĦê…sQ=w‚àĤ¸ß@'Ş€›ï1AĠa†!D>0ږ0´!˘˙ PĊ´İH_Á×úMŞ–ÄşÖ^ôŝx§ ôĝD ĵçUDôÑTC.‰Ħ´Ğ|L%YuÒ­ŞZĴ ½4Xɇ…¤ueĤ¤Ç"ôQ§XHÙOĤí Y2:ĥdxx¤Ĵüċ8èR²lQñJ .=áô+”›šš–’Ç$8½OŞÜĈp!Ş @Ä0†H(˘Ñ^/ô  iŸˆ`qŜÁòfDv!2p/~0Ż?FÇ Ç}A0A3L!bGĉpĞÔĥ‰aà ~†Ž3eĝ~èG[?ŭgAŞ Ĵb:œ+xżéÑ;P{ñÛİ>F tNÎl(r˜!GšÓsœz9G&e™„ŜëÍ´‘€Ši‚ Z4FHĴ+V˜‚^l‰PĞÓèTi—ĴEm„îĜ€.kjÚUnbùZèJz²ñLĜëškyÊĠ({öìù Vèïï_ŠàôĜš5kZVzÛÜkA/Ú{.t ÚŽj8kŞ £ÍùÁÀ*ê(ÏÀDôQuı6 Ş`‚˘‘)GC'"À²‚B›.@ġ‚6 +/!Ĝ­áVD·>Ĵa‘6ĦÚ̈́¨? ¨ÏSBwó|zzg]ĞÊûÓ{6ğ?Ĵeµ6à°ĦŞ^֘ÉešXĊ3“=E8ùĜ…™”9ı䪕n­ˆUtí@rFµ¸Œà8r4É:=ĜKSħl-)ky·ĝ8àôYcGıżŝò·3é‰IÓcŻ{”ż ÜîîÓ=]]]Ĉf —" Ûb ŞÛ§ ˘ÊŒ°Í GËÔĉÀYh;ë8Áâ>˜ ĥ¨è¤êZTŬ``U #ˆ´!ZËaÁ0Ş€Ġ^ĜÙDm ğíîŸ “k¨Ħ‘‚nD€]% Übzù V™T/´‘ß^x“jÏŜsħĝ€ ĵÇ÷‰ù3tjŠÙ&ˆÖ2èYÉ3iÔùġ•@͢Tâ#V“#3–ž‚AşViRë”ekIوş—+É{m0Zîî^3/ iyû*ŝê&{‘êÛKÍĈ6oŜ| × =TmahGäÀ Úۛ NûÀÉ2u0lCäÀÑ>j3°UˆĤ<00NĠN/t  86D°Ö6´QdžAud‰†İşĠ #¨.ĴnòB?Ş>°s u(èĤhÒ‡èiÓĦC“êġŝEññ›7·–(ĵûŬïĤÈŬħıµ‹Z L˘êÙŞšĝíOµyä£úßÉˤbûqÏI9Ĥsä&êMòbNĵÑ"#G>ĤÊ óÓ sû ÍÂ:uÌzÖwĊß[*á†Ŭ½ĵâ/? ÍĝËéĞĝk9~{œĠĵıµġ@oë ô 2NĠÑÖìí¨*(#œœÔ°í8Uô!r`‚Ú3L!bGÔéT:4 !Ó°ĥŞkW–„ÁôŽ φ­hÛÚ¤ĦŸ˘Ġ€ġ^X½şQìdèBd€üĠĜPhĊBĦuò˘âĈ÷Nġ­­j]ŒĜStïd‰ÚĴùÌÌéuyÖôŝœŬoĊaĴSòĦ}ĜMÌU0L6Ó³ÀùàÌ(à”qòĵ Uù§5Tεĥ!rUrm ZWĴ0ÖĞÎRb3 vtÚ2ˆ6Żž jIžĊßKm|#\>ĦüĊZJ_Ż–Ò÷Ğ{îQ²ŭ…Ğ÷,E_Ċ_°×(öıgrr²8` UÀ†AD€–ĉ (SÇ€í^8‰êÉ>lCUÁ˘)Àĝ E´¸SC"C¨4k£êħ%°k {à.T6 iôl „5èeèĤh½†ĠˆVwyĦ„*`} Ĉ˘?&'wĥŝ9OklŽiĠJUUL˘¨ù¨ƒgv—ämhàŭmEUí™7t6u|ÁlrÖ“AdĞT &=œ-&&żˆ8çFJĴ #D–ĵ23ŞcëTK™•ÍW`Äß3I6l-áŠñ×ÒKŻĤ˙Œ…,ĦìµtİñÙk ~1ĥ´OOOz0 "lahF¤ĦeU”ixÑ}ۃàäġ2l§È‚NT:iXŒhñ†6D–P•á"#bF䅵¨í'¸+֐­ ŬˆèB›U×;JmĞ[§a!ŠĝÇzŝœĝßÓŻĝ³ëßżŬ4>5žshġCw_ġb6ŭ‹ĝüyÔÌ}/8çşâôÓ?rù5'öŜr¸£_óħâŜgüíNJ—żÊY UkCĵ5gÏ\ĠÇŞr|\9üİŞĦXÓnRħm&GVò8:µ*É&ñ^Eİœ RkMİN‹PÉÑHTËÖ˜•­ vz /ͤµu”îAÚ_tïBa{ı÷/î›ħWċŝ…ç¸]bi5/Ż0ˆŞ†èe0ۂmoÁQŒ³L¤Ž B\£MPÛvPÈpÑI­,$b›•Ħ6jSİü9ä'KM4Á1KiPß] ]”½ş¨ÍĠ0ëÚLµŜlĴéġĝħž:ıúÛĊâX|€k ݏ¨ĝÒ˞\Üĝééég‹/m|2&xûÁ÷˙àĠ˙ÒÂbñOÖcôŬE7NJĊWßTYh+VÛjvj4s"uJs^°ÁDï†chS„yGYœr¸_Ìà$…Ğmèe Uİ 2˂bô²ċ]ñïnGfF&R:eĊBÊFĊFÙì1%ùvÂ^@[ëÑ>ú6/|ŝÓöòú ]Ê|¸{Í|>ìZ>^*ѧÌIš’ï^úvË( e*·°fŠÌîĜ•ÁwŻ[˙"Rż—ĈiRëîĊUÇc|rî^Ȑġ›ù3ż7#ܽXükÙ2•––ĠĤÍğ7. 0tÑâĈmw/6Ôíû÷ï‡eˆpċŻ‹ŠĊ~Yi¤QĠĤ˙”ìöWżQ,ŝÓMÓO@ĝë<˜àïŜ;½Ĵqŭh.Ûĝ?ŭ͛.4¸7L³™:‘İĴ“k6ԝŜÏYüğ̲ÀÜs*"ܽĝ3‰ùˆ˘>ĥĝ(BIE›Šċ€ïŬ‹ofp‹ĠhWEZÙĉĈΚù$79yşLöŞ<ßµÌçCtîÑwŻ{ŝO=ŸŻ<ßàowôÁÖúîĊDÍ0ŭµ‘ïÛUèúVja¤è´4£C6DÛVĴ/œElK ‹Eu`0ċú,[°ĥƒŞ~°aˆ:,hC0°ђٰm[‡ –ùÀj´)hBÄOÑN ğí^3“ˆt#êfCQo”ZğÔÏâ§[WSC›ŻTÂçÍ˙Z,ŝaCé ˙ž[W|+×ꨲYœ÷bĥĥ[S{ĉ›ĝum̆M#+¨W1 :™X‹lpï—ĠÖI½&ƒ*2Iĉœ{Ċ`dĦô¤&֚RĦ’ -é§XgµŸä{é²úğt7ÙĞò÷e~ï‰ŭcYHßżĵöŞĝĞżï£ë$ŬŬ§Çşg ‘†ƒˆ.dèAĎpÔ g R›‚fŠFXEm ôwñîĜA/”tÀû%ĝ+8ÁÁ†)D#:Q ‚eÔğlhn@ä ‚%a°½·‡Bz ôSµDgÛ2ĝÑE„sµĝöÇŭqħĝoŬ‹żÜĜŭtzñÂ_7ŝĉÏğñ|ƒB žıâ÷‹Ċ˙ĝkuĤ2‘½Ż¸?잏~J&!nSL2§AŒ[İ9ÚÀyc@9Ħ&ż&çùiCµA>£ ^qY҃a²X•vŠ{iËÛ¨ŬĜ€_¨ÂëQ•÷£ZĦe/}˙zÇ;Ŝqé §:İı0ü^ŬĊïAê×ùEŜQTàeÈQ~‡WDGJx‘w‡†]ˆváĊL ²ĉ. üz§Ш÷Ç Ĝżʛĵ_äu †ğ :ìÎ{İŜê&T7á•^Ì{½ˆÀ€7cÍ˽ êÀŭxÍWŜ´½_C?Eo#?œóĥŝĞùG:|çŝ7^t÷?óáì)ŝï- ?Ùsèú§üQ†‡ñ™·Ÿñ…4Ŭ³é‘üOL O°2;pĥfŞĉ|,󆯊üĜ²Ĥ^ŽvÚ|¸ç¤0¨÷äé*'YÎˆf:ıыŠIħÌ´êŽ ²4ÉĠ²Uo˘sĠ(›#ŻĜĵÚC…` ÑŭëÎ;ï„żlëáó!5_<8F˙ċ÷öÑÀU+Ñ ĜċÀÔv/­½xÈ@ŞÚQv`m ͈›ü Œ ç"rá8ڏôyà~Tov`mĤPĠD:İúY #Rˆ‚Ħ%…ĈĈĈBa¨òCU‡ —5lkúÑe…›††NĵĴ°} .x—~€›5Ş+h‚Ħç Çh–ʵ<€×뚽 £ÍÚ)öÌğ7‡ħNÉçí£!† &Ç!ŒĞ̤KħĤŬ¤Â/[œF×r~ĵÙgE(0Réŭ!ħŞè% ħîb*fQ[ñ;6¸˙ĉps!ĜB䯏PıôSNı­…fúçd÷uvvŝhßÔÔÔ½·pbœ+QĠp-˘`£ŜûĦ—zßċ…s{¨á˘Síp3:n4{à9¨2ü ‘Ï˘Ş`"†2"/܁ށ˙?NU úPĠqDL ê…T:uÒ Ĥ˟o|ÙÔÔkŠĊ§5Ì Ñ×òÎÌÖşzfk*rvï=›srE‰!GfHäÈPlq?H§PùJ™J(gU'ÙÉŝ}½4K ^…‚µĤ5iÔiÉVĞ8PèBçƒ+Éïì([ˆüġ÷‡qcĥxŞwb˘ïÚ}}}}Ŝ6×"²½<āûáÏC)D§VV…›1ä9cÑàg½4î­=apzïhƒ4î£^ĝx3µùÁGÑÁ0Žh|•†2˘ èC‡ h *Ç?²˙u×?˙ŭ7UFĝL¸šĠÁûÓ{6ğ>Û -hĜˆLbh>TĥzifN^ÔLGP+ÌŽ#?M:ڵގڍ öġMLà—z!ĜBä/ú“f@)i—OŬV.ŻzŜmĞV)ôF}xNux+†ĵueU¸C\ˆa ‘†"ò…^tĝÀ;ÑöΞx-:^Û>úĉ ÍèPFhìĴRŭċBéȳ˜ĊU¸SŸcİ£ħÁ\ù‘¨Úı×éQ‰2ÉHgµŠX%ĠĠĂcé)ˆ¨ĜŬ—Ëċ›ñ+żàjĉŻ4 J³a@°P(ŻĉŻ–Â'¤Â@5 z1ŬżöRĦ§¸R„a – ÀXâŻZ2*s †ñ—áB"a Ö ˆżjͨÌ' Ä_† ‰„Z3 ŝŞ5£2Ÿ0`.$j̀ĝĞ֌Ê|€a@üe¸H¨5~ŝ˘ż‡I„ù3 mêë/Ŭ+Aöĝ5*ÙÛu~v|#ü?ĠSEü5D^~ŠżÒͤĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝ+Ŭ ŠżÒċ?îĠĊ_q3>żĝ+œŸĴ÷ŠżÒÍ ĝ+]ŝ^]ü7áó‹żÂùÉzŻĝËÍ )ŜmŠħ.ŝŠ‘Ü:˜Züċ&Aüċ2"ġù3 ŝrııŒH}ŝ ˆżˆ;<•ùñJZíĈEzì^*‹-ÂŬfzu“™a`Áû §bĉݘĉ˜"Ĵm$ŝЉĉÔĤAáâŻÔ˜ó…Ċ_⯜K<Ġ‰żlİĜú°{n°˘|>ŒĉÔX¨ŝ"Y+Î=–òTÉ V%Bu*‹ˆż”§|̖H>Ä_‰œÚ"y—í(DŞñ!÷/ežZŒĠ‚Ċú#ğŝ޸Äŝ‘ĉÊ%4Ú–2ġˆSñ0Ĵ(ŸϘĈş`û˘IE”#ӔT°˘ĝ+)ĥ“_'Wŝ‚Xƒ)ԝV­OSÛìCüU[NëiĥÜù‹ôÀŻîĤĞšCĤ²›#³/ħb\-ŝ²ÉY˜QA–aĊ/K4^5‡]8ÓG#úÍ´Eĉ\5SĊĠâŻ6ò÷saù jŽV(Ó!á‡̄ĞĊ_ää 9ƒŝ‚$#Or"Œ÷â™Äż‚ëü{˘´âjñWĤ²9Fü…‡•jyĊµĠĈ÷jñW0?YïÉ·ż´ô!y–jĈ´ĠĈ÷jñW0?YïÉŻż ÜZ” Wډ Ä_Ħeş3kŝŞ…cĉ6·rO˘ƒ{|û5añ—3ùhU,á‡OĈÍU>Qš0ĝ+ SÙ#ŝ2İùdĜ\âÓ ˆż˘0•Í1™ò—Qs*‘O†Í>|:£4añWĤ²9Füe,R-ÒĈ@U1—èÎı˜@ü57β4Züe,R-ÒyĊ@U1—èÎı˜@ü57β4:ŝ22N3ÒyĊ&TĊlGwÎ-ÀâŻıq–Ñ—ÑpʑÊkeTq·3Ÿĵcñ×|˜ËĈ5â/×%ĦuW™ñóÉ8͇ıl\#ŝ2ŝˆ…ú‹ŸsÒħĤĝkδeĉ‚z÷WÍ'9Dü•e×ÇFĊ_s²§ĝĞ>d›™]ˆżĉäŻ(ƒç”{L(ŸçDYĤ׳ż˘ˆıÇÌ)˙âŻ9ѕıÁ⯚;tNÍ‰Ì ĠÜ_jˆJE$*£êÖ_1É>ħi#êAü‘¨ŒĊç¸(’Ea)ğcêÓ_ñi>ə£¨Bü…ìŽĊç¸(ŞEa)ğcÄ_âŻìŞ·ŝw.ŝĠżJ³ğ:ôW|‚Oxĉ(ŞÀ–äŭ(LesŒĝ+>ÓEQ„ĝ+ KÙ#ŝeW½ġżsñ—ĝĞŝUšŬŠżÄ_ÙUoŭïĵÎüŸĜS˜9Jöħ-y…İlŽĊgĵ(ŠEa)ğcÄ_ñù 3WS†ĝĞCÙ²­àúŜ}=ù+^§3{µìËŭĞCÙîŻ#˙ĜW­ĤñW5†²Ŭ/ŝŠ×bĠÔ!ŝŞĈPĥûĊ_âŻl+¸w/ŝĠ·B³½ğúWĵOyöP`oò÷ċPŠ2Ŭ)ŝŠŬ}Ħú…Ò“ùNñWìŝ˘‚e"ŝ ĉ&=â/ñWt\ŻgHß_Iè;í5‚³/÷Ż`nò#ŝJÂ{ÁJs“‡ñWŝ˘5Ä"ŝ &'Íâ/ñWN¤\—ÇHÙ_ ‰ğ– ÈÜżˆÉI³ĝ+!ïèEü@LNšÓôWBʏeô"ŝ &'Í⯄ì ñW19i‰żr"ċş<†ĝKüU—ÂÌÉĤRóWB²›eô‚ŭÉûóää Yü• }ô"ŝò!%GMâ/ñWŽä\wG‰żêN”9ڐĝKü•#9×ŬQRñW‚’Ğ|²ŭÉó brÒ$ŝJ>šù’£&ñ—ĝ+Grğ£$ïŻġ\oKùd_î_>¤ä¨Iü•Ĵ ]鈿\FòUOĜ_ɊıWsĠ#ŝrÉW]ü•Ĵ ]ġˆż\FòU‰żòèú:M’ŝJVÉuğšGr˙ò‘ğJRŝŞ[µ'ż1†Ä_:rWIÄ_Ék¸ÎW42.ò‰żÒ°˘Q’ĝËp‘Ç(~Ħßz_Ó(Iüe¸Èc$ŝJ‹%U––÷{óè,u&ñ—ĝ+żêN˙d1û+ ñf`ÍJŜċŝ•bŜĝ+-;RbS÷—>{Ì*[¸ÓÇè/< ÂHçû×Ĵ=-\Äxò¸ü5+{ÒÈ@ ŝ ĜKŒB[ S‹ż¤–`sÒŝ =ÚġA\ǎĊ_Ħ ”N—Dŭċ.îSKk q^ñ—Ànċ×y⯄Íä³\bŝòY;¨)żŠOödµ÷WPĈ¤=ˆdü´z`{²BÌéjâŻ@}%ÖQ§ŝ˘óçTô ĞĥŝJL’ıZ(͟ݵ˜ÇjèŻùçp_·żÎˆŜ<Š>Á3ĠÊ_g”~q]ûĞ’›%™ĞÄ_é›; ŝ"–rû¤S/ÑLï NĠ–˜¤T™ŸuÎĜ_µMà‚œ-6ĊĊf~äûIÎÌ_q%pa͛9İôÄÍ<,0UÔOÇ_X>ˆë´ñĝ+ŬV›7¨ŬĉĉŻjÜJ˙|ˆÁ_óÙF²×@ÂzĊJv²›™‚ŭ…Ğmj$ˆ…éŻ(L’üf ӒĴ lDíüwİÌ:ƒ4$Ê@ŭ•èŜëq1^í+XúĤ‡FVĈ›67òÌĤŒQĉjŬì Ä_:RİÔÒ_İ@ d@üHMbâŻÄ¨N|!ñWâ”ÏZ°fŝš5³4¤Í€ĝ+í Üxcmü•ŝ9d³Íĉ$é–*ŝ˘í¸ß·ŬzÒ;–ġ˘2 ŝŠÊT|Ä_ñq›öÌ⯴3Pġó!m½_yêé@vȀĝ+šÄ:Îäŝ•Ĝ&eĦy1 ŝšm5½HüUS:ëj2ñWú阷żÒßşì  âŻ*%=/%°/Yâ̝9‡g:ÜŭuĤ+ÊġI1 ŝJŠéàuĉèŻà‰¤§îŸ’ıĝ+ŭŬÊĉ€ĝk.lĊ36ŞżâY]f“ñWœìF›[ü§,ŽŸµêŝJ²ƒù1 ŝšoµĵJüUK6ëk.ñWúùŸƒ¸v ŝŠ‹Ùè󊿢s•µ‘âŻô3&ŝJ?qí@ü³ÑçEç*k#Ċ_égLü•~âځĝ+.f£Ï+ŝŠÎUÖFŠżÒϘĝ+ŭĵñW\ÌFŸWüĞĴŸħ*ŝZ$E΀ŭf/š?t›wŜGÛċvù ]^g—Ùċvy–]n—§Úċkvù]^b—oÚċJOy’]ηËĊvyŸ]g—'ÚċĞvy³]c—7ĜċÛvy‹]k——Ûċ•žò&ğĵß.?°Ë£ìò ğĵÊ.ħËsíò9ğĵŜ.ß²Ë%vù²]k—/yÊ-vùĦ]γËÙvyĵ]žb—Ğìò}ğ<ß.·Ûċóvy£] z].·ËW<ċnğ\o—vÑ*ÎċŝeÛëÑĥ½>aÛëƒĥ½^gÛëEĥ½aÛëYĥ½nÛëİĥ½fÛëCĥ½^bÛë›{]iÛëIĥ½Î·íuħmŻ÷ÙöúžmŻ'ÚöúŞmŻ7ÛöúŽmŻ7ĜöúĥmŻ·ĜöúmŻ—{ìġJÛ^o²íġ~Û^?°íġ(Û^ϰíġ*Û^ħíġ\Û^Ÿ³íġzÛ^ß²íu‰mŻ/ÛözĴÇ^_²íu‹mŻÚö:Ïĥ×Ùĥ½oÛë)ĥ½²íġ}Û^Ï·íuğmŻÏÛöz£öÛ^—{ìġÛ^wÛöşŜĥ× ñûLüEN‘ÓÄ_|“ûndrĴz˘ŬIDAT˙˘;Yï_ŜocR„Ş 菊¸EÒhümÂ@mĠ†G™Ec@üċNJ´ µa@üUeaÀñ—+Ò& ԆñWmx”Y„?Ä_~ĴH›0PÄ_µáQfüùħ"mÂ@m¨ĝë<úY› ea@ ŻÎ[´¨x1|&EjÎÀĊôÏU]RóieBa@Ĝğ÷rWQ &Râ`€ìĊ˙ÜrÑùgÇ1½Ì) ,`Î>˙”YŭsĉŞ/ŬËa@˜ü WŜΣ‹™ĠIENDB`‚gamera-3.3.3/doc/src/images/knn_editing.png0000644000076500000000000011207210777671467017573 0ustar chriswheel‰PNG  IHDRÍBV2˘sBIT|dˆtEXtCREATORgnome-panel-screenshot—7w IDATxœìŬw\çO@–ÈŜ*ˆ ˆ *¸Eq­£­{ŝ\¸[Î"îmµZ­µV[µ­{OĴ"*ˆ(¨€ =DDfrż?˜„$w„€~߯×)ıçîYyîòÍŬċ „B!„B!„B!„B!lxċX–íB!„T Ç˙Ċp xx­Ú{Ë_7B!„T'áÁ× P<0˙KNB5Xòċıvé#à Û˜ïĦ­£ M WžB!Uƒ€/@aAähjé 4èĵJ Ä˙ \È;bÁkĠŜCiÔèÖ4@^Aòò WP¨’†B!DŭjԄ–Ĥ&ôtuš–†˜ {|Í%@ħÄ˙˘G2dĵVí=ž}Ħ yy…È+(P}k!„˘°g·Î(5ż&û ġk"%9Żoŝ…àkv( &Љü] ‘S$²N…Š‹ ñáŭ|  ‚Bİ’˘ƒÏa°× Ĝ7n”ü^ĊDáĝ‰“phßoß½C -m€JŠ"|ĵŝò*§AX5kÁï5Á>ä!÷CR*Jİ|GVŒ _ò›Ôת.O]yT´ÌöŽöÓ§ L ġÁ•ÌWG½á‚aÛ 1.‡F+%?VÁĝ`ĝĊ%ùó‹Ñ¸Çäçĉ<‹}òÈ€ă щ'óâM@€Ĵ·Ù|̸TfT4´ġŞäûĵBÔqj.ü$•ÇÌH#{¸ •C]éë!7żŻ’3°|ïıJ)˙XÀDÀW{+KWâòÙ0²Ĵ‹·EZXħq'Šóß#óù\;ús™ġ†,ÜĜıúvh cdċ|ÀıÛĝ÷z‘_kìÜu0È~Ÿ‡{Q/ħ˙ô-|È/Äżëf —‹‰Šĉ €sŝ˘¸Ĵ£UCS†tEçÖђi˙½z°z:ö[g˙ŞPı”'ıáòHËC^_€cƒ:ÓŻ=êĠ6@ÔËDœ ǃgqœÒ˙]7Snż šµ'·-tì7ÀŠYûHt”*ícB”äèBÙ#‘Ààŝ™ßàÒç@ĜùCbËH[OôˆÂżuñ)¨½xSėöIÏ+İhÉùɉÇ)<aÀÊĉEMŞš\šÔ\½rµŒ-Ħ­Ğ#Ûĉ°ppƒUƒ–üôAĝ瑣hÙĈ›;ñ™ŬêÜvƒˆH´ëÚ ‡Äè~½™~‘° Zz˜¸`%Z¸´ÚµkÓÍ£:;€_ƒçmĉ߸ı³0o†_Ì9щË:#<ÛÀ³]s9~-]Ûcßŝ2wDİŻžT¸Ž\ÊĞÈû"š‡ĵfĝĊ˜÷m/8Ô³Ĉ"żhëŜëW-‡‡£5rR^sJgë—'WŠ-cÑ´=§>’5ĈÔ½}ôyM (.DqažĜdÛÌ­<żްó‡Ä‚ŠVž_Áĥ™K™ġĊ…€@Pĥœ:´h}œjü8ñÈèĦ4Z‘œÀ”œo) 4xĝ@>͇È2<|:BM•1Ö*ıèmö[h×ԇ…jèêC£†jZÙCßêÓ9Ċ[ĥA Ħ‹zM`iß ½Ú5lX³ ĊĊĊ8}í.`pÏNH|| ~übì?qáa·°EPĜS@Çĥ­:ìĝE⿤²´oKûfH{Œ9ċ/:qY§ĞkI½wnÛ èèáĝÛ²6o@ÚÓà Ġ‘Kyy_Dó`ëk=-ù|ĵ‹z›áEò{Ì÷ŭÉOCP.ƒ5KżH.JIŽħ´§ÁjßFhú|&†)ùĵĉĉ—™ê6igÁeĥ+gÁ¨Û¤•ÔuDó>Ş!eÒħ#ÒŻħ~ÑççHI5?"!@ˆ"Ë0 Ċù9`jhI)ŽċËÎÉ…İ‘ŒŒÁiBCSSúx•ġĉĥ10ž‘,-̗ϟ[vmĵK~ s¸ş´ĈŻh`; z:Ú%Á4cc#äg§#'ùy™rŒlK>ˆÍŒ Xó×10K²ŽİĦ> #3Ĥu"W ÉŜQ¨#—ò$û\‘÷TS[SÖ>pâ ĈzuÇ[‰)iĝċè9\ı„Y‰Ĵé\ûE—>*%9Ĉ ĦÁÚnB¸â€Ÿ˙EïßJO/ı6˘ÌĊyïËòqüsÉ_ÇLl6—u2³ßÜÄfĤĤàihÂŞŽ§*o9•'ħÍ+úàÔ×'†àÀŜŸacŞ·ĥmħpŜüod?\ŝj™×fMçÚ/˘¸ô‘(Ñ1FˆRñJ˙);N˘#|ħÌüÈà‹plßuœgȃĝ¸˙ô·0€ĝ8iH̃Ìk,x< ÓÇ ˘G-¤y-+/šhRÍôÇéÈÈÌ¢óàÜ´jx°³ħ̉_ —‘¤ĦİO'?Ò^8.웵‚}3 újŝ8x–ġšĊEĝx!rFJ"Ìëԃߒċby1róJN‡ĜÚօè6Ċ%ÉöpYçú½Ç€ Ĉ F |Ġ§‹”Í[\EêÈ<ĵ/úÚÚH¸´ï†Œĵxò"PTT„”gĦ(Ê{ϚÎFZ½¸ôQ™ĥ|c4ѤÜI$™b"|A8ŝ;ô†c‡ŜÂבÁQf=?żĊËŬ$äM²X|ĵf˘ìl)hBâħ •ħwI!J•öö=ŝç³£úvD€˙B˜šš"/ż1ŻŜ éé]Ĝ4s/ğÒÇñyâÚ=¤ÇĊ`è€^8ûç^ ġ<ĵ€÷ï²P×ı ÖŭztÀĦż~b>„á½ÜqġÂY@˙é?rÎ_—už­˘|÷Í(Lš0ŽS?U¤ŽœÊ“ĜĉËópéë ·1ÖĞ;œ}g‚a#AÉ›tÉ9I\ÖÉÏJAJl8 r߂0Rë$ÙĉŠÔ‘KyÊx_¸ôuĉËGx—Âĵ\x jhéAßĜ:µŒad׌5]²LicCr—>’5ĈQ–á·0mòDœ½qWlŝğŒdĵK/ œKƒŠR φĉÖ04żEżí°kÏ^4hĠQ8ݏ¨O.DÜËçäĝqÊù;@œ#ҏ0üç4.ŜĵS²ÈÇ(‡÷1ş?ó)íéó×0mlIÑ:İT5´aX·)´kĦ}6À/ŝxC{ü"€§›Ĉ­>}X‰ŒOmCs˜7pF~V2E`Ĥ$ÖփŽħÀӀħ]shëBP”FÚ (x0­ï„šFĤ`ġâ!Lĥĉ”ż$.ëèšXŞĦ3 Ŝe@ àK­“d›+RG.ċ)}áÒ׆µB[GE…ı€@€MmÔ´°”.YĤ´ħ!9KÉc„( OúC3šÙH]n“Öò2,{ÖBħ+ûˆĊôx—P&QÀ/#HYM^)İħ[ñ üŞSf`ÁÓàÑ-¸ !„jÀĦ}?•ĉŻH< 3°àä˘ĝCĥR*D!„/ƒÌÀâáÍ ²’!„B¤’XĜX˜âÖÙż<&޲ëC!„*&9é ĉ/|‰¸—eW ‰.˘ „BˆÒP`A!„ĦÀ‚B!JC!„B”† B!„( „BQ ,!„˘4XB!Di(° „BˆÒÈyş)!¤aĉê!„( ÇClt¤JË À‚tk{BÈç èúċJ)‡N…B!Di(° „Bި ë—+íHƒ²P`A!„Ta'ÏVwB!„B”† B!„( „BH5–™™‰ “Ĥ"33SŬUPE‹FŽêBŞ.íUw=Ġ]²}níQ„ĴĥŸ>sîş(­oä>,l}\UŜƒ­Ûv`öœùj+–÷(·oßâàÂÏ÷á<›KrYĈÏç{ĝŭĵ{—SîvHâóù˜3o>Œ<|9ó€Ïç+­ŒòPI`á=gêÙÙââù3 ÁÜ9³pèŸŞ(ŞJŠŽ,3)²nEÒ+*,,šÔÀƒá*-K’ŞÛĤ ƒölj§„Ż##£ŭ‘‘ŸnŞuüĝI 4@ġkŸ)³“Ú½gŻRË퓔”T´nŬRjš*âÌÙs*-C*Úê6NÙüûïIôéŬ–bóıŽo.ŭÉĥŒ••zzöÀ‰“§d.£¨+Wáʕkbó\ı†+W)­ŒòPI`ŝ0³fN‡ıı´µµÑ][ü²çÓ! >Ÿġ6Ħ{g89ğÂ{ÎäĉĉJ͋mÙââbA[·Npi޽ûöĝ)²1ˆOÀ”i3àÜŞ-š;µĈ„IS‘‘ñé÷‡ËĝĜû“ë2NNÍ+ôĊ´şPI`ñÓöÍÈŭ#FFËÖí0Ë{’’’…éGŭ%K|`mm}}},\0.^’šÛ²˙?K|ammCCĝú|ŻP]ϟ=‰öînĠĠ…ĉϛƒ›˙Ŭ[fùrXYYAOO“&ŽGdÔıyÊğĈâäİ3óŭffĤ077ƒżßb…ê+I^ŬNŸ9ßĊßÔÔĤĤĤ],żo._ 'Çĉ°ĥĥ‚µµ›7+s˜kŜ§NŸkçœùf>‹`jjŞ´öÀìÙ3 §§/݁ÈËË̙˙Ž}ŝ\Ħ²¸ò8Ǐ—Ŝ ˙M›‚‡%×]?~JxD]]¤!33 µkÛ 0`…0K_r£òʑĤnŬş°µ­‹ /êĠë061FġĊ–aĞŸ²Ĉ<Û ĵċÌñž…ŭ~—zL.ûÉqΖ§˘ï‘*Ú%ŠË~„mü•/ffĤóŭ'OĤqßlĜö%ÙÙÙ066*3ŸËĝ.%Ż?ı.c``€ììw,­İŝTò2KKKáĈ••…ŸwïĊì9óqôŻ?ÉÉ)èÛÏ À0 x<žÔĵĜ–MKK‡­mıë޵ë6 2ê òòò L]Œ> H==]Ö cä}›HOOGŬşu„Ż+Rwĥş§§‹}S-Wšŝ=!Cĵ„݇~<Ò·oï2˲ċ‘‘[ÛşÂ×vĥĥHOO[ĈÒÒRn}¤a{/JÓµµµËĵVĠMŭúġÁş ›ġ6ÖV°ħħ†•ž¸Œo6lû###äääÀĜĜ¸LÛĝ.%Ż?ı.“““##C–ÖT*şİ‰‰ ĵgÏDkW7á}#ÑÔÔDzzÌÍÍÊÛÌÌLĴqññ03ÏsabbW—Ö\½nnínní°*p-ÚĥuÛéÊâÜ ğwí0¸t‹}üܽä—TÊìKyċÈÒħC{á9ïN:”IgĞŸ²Ĉ<Û "ċŒ7 ĊèïQ¨Ìòì?Ĝò,Ï{¤ìv‰Rd?"‹èû’ĉĉĉbùË?šššÈˡžž.€’_x(Şi<ŽŒB§ŽeÇ/Ûĝ%Ğ?ı.ó82 ͚5U°ö²-]ĥHùaķߌTëu*92yÊtܽ{ÈÊÊÂÎ]ğÑ\¤3ż5~Ë>ŸgÑў#=d[vèÁX"ÉÉ)x÷.Ğ>ß444À‹—/ċÖµ ?:Ú:ÑÑABÂĝú-ĞXY k™™‰ŒŒLü°Zĉ²\ê/πŝ}ħ*p-²²²••…‰sż˘Nž: ŻAÊ\4tˆN:£pŜŭû÷ÁĞ‘‘QÒΕ?b@˙œë^ÑĥWĥAû#ĝNÜ?îîí|'^NƒÀœı ûĊĊĊ`ĊĊŸñU´/ı–#υs§páÜ)İßjÙê§È˜—‡m_P‘rtuu1kĉtlĜ¸YĦ2˳˙`ËSŜ{¤èvQŜv‰Rd?"Kéû’™™‰€UĞ1h`aÛĝiÖĴ)~Ùû+òòò‘’’ż%Ë.ߣ[Wœ?Qfşĵñ-JVr]ĉüù‹èîэs½Ù,ñ÷AbózôÀ•Q* ,ùf6mŜ†ÖîèÑOŸ>ĊĉMë…éS§LB›6.=v[¸`îĵEèĠЇÔĵĜ–=k:5lˆ‡À£G/ÔĥùtÈnÒÄñ\ê/ÏÜ9³QSż&:wġDŸ~ƒşUKÔ¨!ŭ Ġ?˙ǰĦCÊÌ2xŝù÷¸Âyϟë ss3t÷ìƒîž}`ei‰ysı?H§˘mŻl={ö€Ú´q´m ##CôèîÁ²f OOLŸá 'gWĴ]·×ÚyW´/ı–S^lġSdÌËĥ/¨h9ƒöÇë×q •Yžŭ[žòŜ£òlċi—(Eö#²´quAßŝ^èêÑĈĈĈ˜=S˜Ĉ6~Vŭ¸—._A+—v>ò;´wWüˆòĦ^¸xé RSS^W’´ŝä²Ljj*.^şŻA+\‡RšššĜĵq=Zĥt´léŒÍ×CSSSie”‡´LË­]ÛÂ;!wñ<&JJ2ݞżx‰‰“ĤáúĠ Ġ*oujĜ¸9m„ˆ¨ÛúÖm?!öùslŬĵA-ċϞ35ÂĴ™˙Sh½ ë—1~òlıûĦÌÌL,X´ë×ʽˆ5èúeL˜â]û”$'½Áü…ı{o€<>Nı"çÈWù5D½V­ÁÌ˙Caa!עgϲżċŠyBގÏa[Ÿ=kşZËWe@cjjŠ}żüĴ²üEĊgNÚìĠìáıŜ³ŞEŜ„Şƒĥu˘ ,>sĈŽĈ8)7|İêyBŞÚ։"ŞäÓM !„ŒŸ\ µĠ‰ŽXB!UTuĵxœŽXB!Dièˆ!,‚_Vw!¤Ú À‚9ĜîÄG!D„ÈQžÉBȗŒħ „BˆÒP`A!„ĦÀ‚B!JC!„B”† B!„( „BQ ,!„˘4XB!Di(° „BˆÒpó&=/Bù2ŒŸ<ğÜOVUè–ŜĠñı„Bİ<œ‹.Ŭ<Ğċsá !„Ryè B!„( „BQ ,!„˘4XB!Di(° „BˆÒP`A!„ĦÀ‚B!JC!„B”† B!„(B·ô&DŬè™5„R1]şyŞ4 ,Hµ3aŠ·şĞ@!Ġ0*<5rpDlt¤ÂiD=†Qw!D­x<žBûB§ÂÚ|˘’ÀB‘bú&„Bʧ*>”.Ŝ$„BˆÒ¨<°häàˆC‡˙BWžhÚĵ%z “'O…i˙—ŝ |>ë7lB;÷Îprv…÷œÈÍÍËó×_ S—îhÜĉµˆOÀ”i3àÜŞ-š;µĈ„IS‘‘‘İp{?ŽDÇÎŬħ˙·ßËĠ„BˆŞäää`¤İÈÉÉQ[*ċˆEHÈ=ùó „ŜAŻžžġ[ ÂS ħёb§CvîڃǏ£pòĝ1„AWWk×mË3üaN?†˜gYË€ÉS§cü¸1¸{ç&B‚ƒ ~}Ĵ \£P;^ğ “ĤaùR?Œ;Zá~ „BT…Ïçcú oŭ‡é3ĵÁçóĠRJ ,–/÷‡••ôôô0iâxDF=‘ğüÑccÉX[[A__ ̅‹—Ä–ñġYSSSÎċœ?{íŬŬ ĞĞ ̟77˙ğÍı ˙8 ?˙eĝeÏNxzvçĵQ=†aŭ÷ßÄÄĤĤĤXĵx1]ÜIùâĴXı ÁwBÁwB°bċ*µÔ£R~bld$ü[OO—5ŠJNNAß~^J>4A™ĞY---*',,k×m@dÔäċċPì Ù½ûöcè/8·pâĵİğwïFPP"#KŽz 6 {÷îĊ¤I“Ô\3BñÍÔZ IDATİ<˗ùcù2uW£j^ĵiii ë—ìI˘Ÿ>Blt¤Ĝ)ò˜ċ=£GƒÛ˙]C̳Ç Qè[íá?àÜù ĜóË Ġƒ(ßożŭ†€€Ô]µk×F@@öï߯îjBÈIí÷ħ044À‹—/Ñ ~}áĵoF€Żß2,ñ÷A:µûü9~úi7ĥl^_îr òóĦ£­$$ĵÁú ›ZßÚÚ ‡˙ĝ ߍž>ŸiS'—ğ.Dı"##ÑĤMákWWWáÑ BùœUĊğĞ=°˜4q<Ž>/àœ:evïًÑc' %% ÔnjéS+TN`àJÁŒYs`ee‰IÇÌÙs ċaii‰?îÇwcĈ£¸˜™3ĤU¨ND9ŜżZµj _¨ġŠhBİ,'ÏĉĵleŬµXÚEZníÚŜ ı[%oĵAlA×/cÂoħÓXFFFˆ‡ĦĦ! ;;öööÈÊÊRW5 !Dċx<žB7˜läàXî[z''½Áü…ı{o€<>Nı"çÈŻ’×X˘GGGÜż_ĝ:44ŽŽŽrÖ „˘*Xjo̘1óóCbb"áçç‡qĈİğZ„Rİ–.[)ĵád#G,]ĥR-ġ À‚T{S§NE§NàèèGGGtéÒ'NTwµ!¤R-ñ÷A{w7@{w7,ñ÷QK=(° ĠÇÚµk‘••…ĴĴ,Ĵ^½şÒžâG!U…ĤĤ&~Úħ]ştÂO;ĥ@SSS-ġPûŻB!„˘Ĝ÷ËÏj­ħ „BˆÒP`A!„ĦS!„BH5EwŜ$DIèĉm„/"7Ç*ÏòċEİvè‘è„RuQ`AŞ•.Ŭ<éh!„Tatñ&!„B”† B!„( „BQ ,!„˘4XB!Di(° „BˆÒP`A!„ĦÀ‚B!JC!„B”† B!„( „BQ ,!„˘4XB!Di(°¨f98Şğ „BˆL* ,98 'çVm1~âĵ|ġŞÂy*}@B!ÊWCUÇFG²²²°ïט;oŽ˙sDUĊ‘/LyÒ1I!DuT~*ÄÄÄ3gLӧτó98â×_ S—îhÜÄ PPPßhċâ†V.nġ[Š‚‚áò˙‹~ ù|Ĵß° íÜ;ÉÙŜs 77W˜^\\Œ€À5hëÖ .mÜħwß~ıùI’VÏĝĝL™6έڢıSkL˜4™r×aЧ$Yġ–ÄV—A7Ñ·żš6o‰=qäè1Nilġ•·neb†óD!¤r¨<°ÈÊÊŽŸ~FÓĤMÄĉ‡?ŒÀÉÇóì1`Ĥ­HMMĊ•KçpùâY$&%aÓĉm>}ӌŽûÖıs×<~…“Ǐ!$8şş:Xğn£0}ËÖˆ‰‰ĊİúĠKHNN‘›Ÿ4’ġœĝ1`5222‘‘‘‰•?b@˙ÂtCCĵxùRloF€Żß2ÄĊĊƒÏçYt4ĵç,Ĥ2ËW 99ïŜċ `ĠıùqQŸmèèè !á |ŭ–ħVOIòê­H]ĉÌ]ˆĜĜç(..0(.ĉsJcĞŻĵu !„|ÙŞL`17ÌÍÍŬ³ş{ö•%ĉ͝-LŸ4q<.vŭĈÔ)“Ĥ FÇ.˜;ozġê!LŸ=k:5lˆ‡À£G/Ôĥħ‘›+¸-ZĥÁ·£ÇÁĠµ5ë:lġ”$ŻŜŠÔĊÓÓÓgxÉÙk×mÄĈġk8ħĠWŜş„Bl*ıx“U£‹7 !¤ò(rñf•9bA!„ê B!„( „BQš*ósSB%ï^ „Bԃ R-х˜„R5ÑİB!„( „BQ ,!„˘4XB!Di(° „BˆÒP`A!„ĦÀ‚B!JC!„B”† B!„( „BQ ,!„˘4XB!Di(° „BˆÒP`A!„ĦÀ‚B!JSCŬ DA×/Ğğ „R­uéĉİÒü)° Ġ΄)Ŝê!„TK àyL”JËĝ"‹FŽˆŽTw5*½-mŭÊl0•R!„TU<OĦ}!ÇSam>QI`ÑÈÁQĝw͚5ÑŞ3–ĝû Q£†Ş(Z¨*Á !„Ï‡Ş>”‡Ê.ŜŒŽDlt$nŬĵ 7·ĥ˜;‘ŞŠ"„BHĦò_…`ò¤ ˆ}.œŸ€)ÓfÀıU[4wj “Ĥ"##S˜ŜÈÁżŝzştG&N>Ÿġ6Ħ{g89ğÂ{ÎäĉĉÊ,·¸¸kÖ­\Ú¸cïŭR—cĞˍ ›èÛß M›·DWž8rô§4QGp98ŠÍ€C‡˙BWžhÚĵ%z “'O+Ôlu’W^AA||—˘•‹Zı¸Á×o) ¤ĥݰ°ß˙à‹-]áŜĦ öü²Oêr„B*ONN&LšŠœœµĠAċENNvïهĉ͚ çMž:ǍÁŬ;7„ġëcUàħġÂFàäñcˆyö°s×<~…“Ǐ!$8şş:Xğn£Ìr·lŬ˜˜Xœ:ñ7_½„ääİËħĠeÁÂĊž=á÷pĝxÁ)MTé)Ò£8˘BBîáȟñ ôzġô„ŻßÒ ġ[ä•·qÓV¤ĤĤâÊs¸|ñ,“’°ió6İmÚ´y23³pŭê%œ>ù/‚ï„H]ŽBHċàóù˜>AA˙aú où|µÔCeEé·óÖî8tèOlÙ²A˜vŝìI´wwƒ. 0ŜÜüïĥĜú>‹`jj*|}ôĜßX²ÄÖÖV××ÇÂópáâ%™ċ˙{ü–.ñ…µµ àëó½ÔċĜê˘ĞЃ´´4dffĦvmĴà”ĈĠòċŝ°²²‚žž&MÈ¨'êĥ:É+ïÔé³óŭffĤ077œ:}Vj½Ož:#ĥĴżßb…Û,<O8I0 ˙ŝ{˜˜˜ÀÔÔ‹/Ĥ‹? !Ÿ+W żäß ÁŠ•ĞÔR•ŭ*$6: >>?ĝĝ#*ê êÖİ ÇÚuġyyyÊ^­jii)ö:99}ûy(ù rŻpMKK‡­-k=Ùê²cûlßħ[ĥA-ĝû.F÷îŬXÓ¸262ŝ­§§[&ÂT´Ĝê$ŻĵŒŒ ĜÚÖĥ³µEzzşÔz§§§£nŬ:bËŞKi k<ìŜ½AAAˆŒ,9Z4lĜ0ìŬğ“&MŞ´:BˆŞ-_ĉċËüĠ] ĠŝܔÇÁÎÎׯÁaÑħC{èëëc–÷<ĝ,^ˆ.;ĦV­ZÈÍÍE+7ıyYZZàĜ‘C°²²âTĥ……9ââQßŜ^îrluqná„Ŭğv€aÜş‰Ċ>ŝî~ƒ5MUĜúĦ"u233CBÂÔĞgˆ‹‡™™™ÔeÍÍÍĊ–O(Gk*Çożŭ†€€Ô]€%K–P`A!*P)·ôĥĥĥ‚ĞĞ Nž:(ÈχŽĥttt~ËXóĝfÔĝú-C\\<ĝ|>žEG{ΙË2ËW 99ïŜċ `ĠİËħĠeÎ܅ˆ}Žââb0 ƒâb>§4I††xñò%k;Ù°ġƒ"u’Ôżü°™ÈÈÈÄÊ1 _İˁk™Y²ìĞ+Ü6U‰ŒŒD›6m„Ż]]]…G/!¤: ş~™óTY*íY#‡u6aÔÈá \‰€À5˜1kĴĴ,1iâxœ9{NîúS§LÂî={1z줤¤˘Aƒú˜1}ŞÌċgϚŽĠkÖcÀÀ!`À`ĉô˙I]Ž­.žž˜>Żâ A}l\ż†Sš¤IÇcáĝáC…îgÁÖŠÔIÒüıŜX"Ŭ=ûúġíysgK]vîœYó_Ž.ŬzB_ż&&Më7‚ÊŬ.Uz˙ŝ=jĠŞ%|m`` Ö+Ĥ !DYĈO––Ĥ²îZ,í¤´–[ğĥ…wBîVÉo/[ġ˘0Ċ[êĊ—²îBgdd„ĝĝx²³³aooĴĴ,•×—BT…Ç)ôEµ‘ƒcıo靜ôóú"äî½aò|ĝ8ċŠü ŸžnJ>{ŽŽŽ¸˙uhh(ċĴA!¤ĵ(° Ÿ½1cĈÀÏω‰‰HLL„ŸŸĈ§îjBˆR-]ĥRxЇFŽXşlZêAİöDïa!í~S§NE§NàèèGGGtéÒ'NTGU !De–ĝû ½{ÉŻÛğğa‰żZêAİö†)3‰âñxXğv-²²²••…ĠĞWWÚSŝ!¤²hjjâ§[K'ü´c 455ĠR/òħé„BÈçÈÀÀû~ùY­u #„BQ ,!„˘4t*„BİĤ*óŽš\Q`AŞ%şy!äK§è]œ+r×gEP`AŞzä9!„T]XjK7O:ZA!U]ĵI!„ĦÀ‚B!JC!„B”† B!„( „BQ ,!„˘4XB!Di(° „BˆÒP`A!„Qú766Sv–„BùhÚŬċ^×{Ŝxŭ2F‰µ)‹néM!„T3óù+ĵÇƒ÷ĵTPqXB!Ġ"ÏMŞÌÇĞÓ5„BQ ,!„˘4XB!Ÿüü|œ= ùùùj­„BH5W\ÌÇı W˙WŬ¨Ż.XB!Ġ˜@ ÀċĞבššHHxƒ ˙‚Ġ\P`A!„Tc·ƒïâġëxħyOŸ>CXĝcµÔ‡~nJ!„Tc:şcȐ!042)“ö.; iİI•Z ,!„j.-5İÒYèT!„B”ĉ³ ,^ŒCíÚ-…Ży €ĞĞìÀ-½2ddd᧟~ĊĉÍ+…óxüŻĜrM›6.³ÜúġKáïż……ERó續}ÓÏÉysç ûTÚ/nBBÂ]kaz†öbéŝ /Ż>ĜÇNxx$ZµrĤ œ:uQ웙´k"$9;7GXX„Ô4OÏ.ÈÏÏG^^>zġê&7Ÿıs§âĉóxŭ:ĦBËH3|ĝ̜9oŜ„C HBvvL™s7nÇÑ£§°nŬO Ż[JŜġï͚5Ĉó篰uë/ĝĉ›Ħ¨]ۚSİİ‘`˜d¤§?À>.$?Ôñq§ìòĜĈaé2˘ÛĤdŬI~é’,Oòˆ…ĵŝaÛK……Eˆµ[Û¸kÛĥNž<€´´(lÛĥJx ”¨_•, êèèÛÂèZtçÔĦC[ĴY³99ž‰ÀÀ­ĝí·#÷Ÿ dg³jĠäĉ~@\ÜŒç{÷£ĜĜ—bçE7Ñ´6mZbéÒµHIICQQ"#ŸaŜĵ ĴĜʑÖ>ÑaŽÈÉÉĊΝû…mc+óáH¸ğğ˘Nk¤§g`˖=ġ n ˘ġ/Ċ–ç°a†üüd&™111bRR3 “̘š ˙–L{ùò3p`/Ĉ€ÑÖÖbÜÜ\˜#Göp.GZû^½ş/6oŬş% ħĥÉ+ó·ßĥ2vvumm-ĤY³Ĉ̆ ˘]Û3gÏ*S˙҉-χw1͚5f´´JÒ>ĵ*Lûŝû™Œžž.£ĦĦÁäċ½VI›Dë|óĉ Ĥ~};FWW‡éŜ½ç7—<¸ŻpY+ĉĊ‹ğbċ™›› ß+ĉÔİßgçĉŒŽŽ6Ӌ;qMĴ/䍝_~ÙÈX[[2şş:Lǎí˜óç3††LFĈS™ŭ+mÊÈxÊXX˜1oŜ„ çıĵhšärAÓ]ë /#9ŭûïŻLƒġMMMĈγuk€Ìġ“’"˜fÍ3+V,â´ä 6ÙĜX)eĵ IL­ZúÌÏ?ŻShÌKNlÂÄĈIMoĦí" IDATߗ‰Ž;e—Ç6ıl›ŬIŽuÉòDÓÙú‡mğf˜dĉ͛pĈÂŒÉÌ|Vî1{ĝ.ĤI“†L5GÇ&Ìùó‡Y·ĠÏeZżf0Š}FïÛ½…À–ë³ŭż·vmCô@[ÍĜ°`@KÚW(-·vm ï„ÜĊó˜(…£’†Í^‡ äPĝ A½Ëœ –/_¨¨hüġ×nµ”ÏY+íĉE„(“´ízĈ)ptl‚%KĉĞħfĠ׆µğ1‘żBŸÑA×/cÂoâġË…ËLNzƒù }r÷Ŝ0y>|œrEŝΐO!#j‘™ù?ŝ¸ K–ÌŸ/Àşu;ó£G­îŞ•ËÒê=żKAİ ¸n×ê ÀIċ À‚¨…‘‘ìì\Áñğw7\|::Úê!¤œhğ&DM455ħyóJħçkBŞ7Ú ?Ŭ”B!• “÷3@u?RŬċî´÷޲ۛĦĠµƒµµì‡ŜU5‰‰ÉUîI²UiĴ*úXĝŠĉOJP`Q͵hÑ wï~z†EaaLM›ˆŭŭîŬpv.ımwUĜè+Rië>| MÍژ?YjċyÔµ²W]úˆûÒÉĈĈYìĦhU…*Ï͕Żo <=ğ 'ç9’“•I/íË?˙<.6?.îát\–‘•oéT·nkı÷D‘$ï!ˆċ•ñûÇ0 CFœsŞ÷N²ŻxŸĊ‹`i鈚5í1räTääĵĤbüxoèëׇµu‹2·F–FZ]³²²aaÑ\ìĝEEE°´t,ó¸êQ£†àȑ“ÂğÎŬşuÚÚZ¸uë.€’ èèÑS5jˆ°¤‘×n.}k×o°·omm[´ní)÷İ…˘uPt]I'NœGzz&6n\ŽÈÈgbiÒŸŭffMĊn -ş!--ĈĈĜż˙/ԯ߆†°iÓÏxĝ0mÚôB͚öX³f;€’CffMqè?pvö€ŽŽ-š4é(|¢ĴG]³=[Ŝށ’oż#FL‰I˜™5Ċöí²Ÿv*zLMMMôîíÜÜ2/Żnlíä?ĥ[Z™\ÚËö(piïħ4òÚfo_òe++'hhĜˆmÓ˘}9ŝ4ÄÇ'"**ZĴ|ÑÀ‚mĥ÷h ŜÂŭÛÔñğÓ*ĞŻž<‰A³fâ·² {„Ö­?"’–—ä£×•ñhuÉrww•™^‘ǧ§gVèħóDœÚXÑ£ëxùòRRÒ°dÉħô0„…]†@ó[ÄÄdÄÄ#:ú6ââŜÀß ç<Ù֗÷(ŜUĞĥ 44aa—‘’òzzşbö÷_´´ ĵ|y^ĊĠĞ˙•Ğŭ&&F9r0vïŝ]¸Üµk·]kħr€½½-6´ÇĊ‹7·nŬ„ ßàÖ­{€ ÁĦììêÈ­‡ĵvséóë×oÖ­SÈÊz†!Cú*tß~EÖ=ÚQTT„… W`†e¨_ßïŜċˆŞ•öxx##CĜÙĠ>~,X†+áĊ‹×ĝ!qq ˆŒ ž=àëˆÍ›w̙?pòäĴ^½ @É7Ċ÷ïsqáÂuœ8ñ23ŸaĝAÂşK{ô4ŸÏ—ûĝlĥÇU§ĤĤc(:wvÇë×÷ñàÁžíÑŜlíe{l·´2ÙÚËċñäÒŜcIlmûûï}pqi†I†@ƒZeò(íËɓż;"!X°-#ï=JKËÀüùË0~üHìS/}_\\œ•ÖW@i`!~ÄâÁƒGhŬúÓs=¤ċ%úÈe=Z]²Żd},|šzì½ŭpnîKĤFrÛ]ŜuE§ –1ŭû{ _·kךùïż“Â×µ˜ĥ1>ĵ[oöìIÌĦC;†If.]:¸ğğ2 “ÌüŝûvĤ]ğÖÂċ22ž2šššLrò#†a’™ôô'L­Zú $3K—.`şvmÏIÂċßżÁhii _ûĝüż½ûŽkâŝ˙ŝJĜ˘†²q€Š¸­G­³jëZµÎÖ:ëÖJU\UĞÖZG•ÚÖjkŭĥĥżokżŠÖ ¸p0EEÂp ÊLrż?0g’ğKrïçÁ’ğ|îóùÜ'ɇğK^³˜%ìí)SĈ2+WÎר ßcûîKfĈ·†‘1~8ĦÔġŭÜglmmĜŻĠ]ۅ™8qóìY<óŬw_2ıËĤvj>|ŝûߓˆ½OOxyĠC½zn¸zġ&ŝúë4† Ä[v éóZµ^§VĞĉ`P 1}üĝ)ÖŬ†Ï?_ÉŜÔX: }ñŬşuĕ+× T*1~ÖŻ_ $şOŸPv½k×âĥmK¸ı•Ä[ÇĈŜP‹lż†É“ßÓËÎ~‚zġ^-iGOóĊgëzŒz\ġŻżŝ%ĝëÎcb#0°1ûYvöm|óÍ89ĠÔÏW7öòĊv닠çj/_™€ŝ}ĴŽŻmÚɞşú2(¨ Ĵ­­áêZĦĦpàQ$&Ĥ AoĜÚÚZGWıŞ}$—§áçŸ÷â÷ߏɓgĝÔĠ‹ĠWpçN"7ögo3 ƒ˜˜ëìĜ×WVYDĞĞ÷U‹×W0ŒŒ=kj,ĵİħóD“Ù'))÷ÙżïŬ{ÀˆëĉVW1ÉÉİNp•É÷x(^W¤Ĥ^a£‰™W‡NUÜŬ]5ÊV˙[şÎŸ?[·îa—:8Ĝë,£NZèÔİ-ĉÏC÷îoşwóĉ­D×4Ŝ¸ġáj·>/o+VĴGvö4mڙ½B|˙ŝC×Y苇ïÒbb#"â0<==µkÓoµ“:5“UŻ—z3Ú³ç{ĵûî@öĥvô4_|ĥǨżéedhĈQs)İğîïşâàùêĈ×^Ĝn}ô\íċ+ż i[|ĵĉémÚİS§ŽÎNƒ­£Ğ\Ġ>²²²Âğï@‹ĝż˙;Áö Wœşú…›bġP2aTïŻ³g/Ħ~}tR]e•E´şf_éNÍL…75vžh2ûÄbîÜO‘•ġYY1gÎ Œ=„sŭ#ŜĈìÙˑ™™ÌÌl̚µ#G\&ßı˘x§M)Sĉ#)éär9nܸ‘#§Ş=vğíÌÌl̞½Ü¤ö·oß 666X²$œ7CcôèĦ8uê,BC;BC;Ôݳì§Aĝpµ[HŸ—§[·âqäÈxòäĈ/ǏbXpĊ×­[ùùXır#Ö]ÊŜŻ­~ŝ(yaìĦ5=’áñ'ߊGdxñâ%ú*żüò–.ÍŻ=ÍŸ­ë1êqĠ͛7ĊĈ;âĊK$'§–şÎE× ħ8xş i/_l·zöò•ɵ…ĥ ŭ&¨Ŭ—꓆NÈÍ}‰;#ôN,t­£Ğ\í}Ôżoœ={œşú…›bġb˖]xù2 ɘ9s‰FX˜²Ê"Z]½Żôġ#`z,ĵİħó„_ı^cħ~ŭrĈĠµS­š3~üpH`è¸>!/ï3qâ(ĤFêLĠ™‰Giœç+“ïñ\Qĵ Ċ#&<| ÉĈ:´‹]žŸŸÊŒ7œqp°g\]ë06Ĵà½Ĉ‚Ğ #c~ŭ5‚ñôô8Wİë'77‰qrŞÉäĉ&ħ·]\œJO…žk,¸Ú-¤ÏuµĞŬĈ>–adÌ[oġ`ĥm[Sê~U³Ş=úâáĤ䚕q†kܧ]§N-kNÜÜê2Ĉ2ǎ`Ŝ|³;³fÍbĤvmĈÑħóÎ;J]Ÿ˘=ÍŸ­ë1êqĠWŻždÚ·oĊĜĜ”ÄŠGFŝGoĠŻïQ*r^½Úq\uÒ^Ĝn}ô\íċ+“o iȘZµœuÖM½/ïŬğ˘qßĈ%ÏmUYGÈ>şté/ĤiӆaĝÔ=<ÜĜNjĠW #cnŬ:tîܞħħħa||<™}ûXŻ,ħ£Ġµû Z×WŒ5„]nj,ĵİħóċŭcé×X˜56½,˘ž+[|ô]œœÊ^@LWTTŒĦ8xp'||< ~üʕŸ£¸¸kÖ,.ƒÚYžŞÖ^RŝtEĞŭ,=6Ŭì§Bˆ~99ÏħeË.̜ùıĞRiää<ǘ1ÓÑİS[£&@É!èŞtÑVUk/)[Ož<ÜıŸâÙ³<~ü‹­Ö­N*.šXX(‰Äµj5ÁGM‚§§‡ıĞS) 4µk7EnîKĴ\ù‰Ñċ”|oKkfÙŞZ{IÙRV÷ók‡ääTŠVŻdÌ›^§,*ËiÊÒKrìĜQÊyôèš(ċTU­½¤lQ´zċGG,!„"šXrc ÉŞ„PÔ5!eËĴ ġ\këúh ->ûl …AċˆĞ]/ġ8^¸^S—Ğ+((„½½wİġU?Ú!d–Ê˘°ËÂ×_‹–-{ÂŜŜµk7Á¸q3MNU{üŠA5fµża511ŽŽ ôĈ€WuMHÙ2ëÄB=2¸°>Ž;€˙ŭ/ aa›—QħËÚ_ĈÂ×kêruööv((¸†‘!%ċ2ÜŬ]5gîoĵÂR˘°Ċĥ|ùzüġ×i8°99‰ˆ‰9ÀÀFĜ´i§ÑeZj_?RİQQĜû”J%Ŝš5kÂùeE–Ž˘ )[fŸX¨G7oŜ{ölBDÄ!vÈÈsìëvv^èĦûߝĝ[Ç­—öĂ+×ÔċúDFžC·n莝V­Ġ?|ÑĊú˘”ùúP_|·(lèpcëĴÍÔíhûòË}8p`;Z´„-||<ħhÑLìßż•3Ž]ĦP荙64YUo!Ñî†ô•6Ġd8*ê<{ßĉÍ_ÑħÚĥmÉ>?L|L-Ÿ˘ )3ħPiĜéé™ìíÇOcçÎġxòä.²²naêÔqxï½èŽż­S§çc„ÖË2&˙²Ùşb§îŝá‹.ôG)s•ËßÍ…ÍamJĠ‰ħmNN5°ví6$%ŬÓħLğ•••Î:ߜ,8Ú]h_érŝü,X!Μ)ùzéÛ·°uëDDlĊ… ÑìóÔñÇǔò)êšó0ÛÇM ‹pĈm´mĞùùĝ§OsPğĥ {[=Ë&L‰9sV°·ccoh„ÉyŒ!ġ*,,BLÌu„†ĠX/55ŜŜġM^Î%2ò-zŭ†Ĝ_~‘ÉĠ֒Ç4FDÄV6e088H#ĦòÑ£ %Ħ:}ú„²éž\ċ~öÙ&Œ7 }4P³f ìÚµ‘]W{Ÿ¨­XħÇÇâĊ³Ë—. —Ĉ&×YÛÑöÛoß"<|+:vìâb9zô茕+ç£yóĤ€];àʕk‰Qxú4C†ôĴ³v_­Zµ† ÄìÙSÔÚ25jĝ³ġ iĈf7ôîŬ EEĊX·nÜÜêÂÚÚZ#çEH_i+,,ÂŭûièĦ5”J%²³Ÿ`üĝ™Ĝ=NN5qçN"Zµ*yc6uüñ1ü­>ümLŸŝ> FêX²d]‹Ó›IA1ÙŽXÄÄ\G“& Q­šƒĈŭêG TßÖ¸q' ĠSĉ´o…<ĈzñĊġšş\Ÿ{÷ °°Mš4 ;všŻ­|ÑĊ€îĝcrùâğı˘°ù"Ĵ­³61ĥ£-88‡ïFffââŝAHH3 2]/ŽĞΆĈ7í.´Ż´ĊÄ\gŻù í„wߝ„àà Ü—/_E‹°µµeüq1µ|Šş&Ä<Ì6ħuD.—#<|+&M  ä›]]ëàĝñCÈÉIÈĠWëĜ˙–€Òñ·BW/íÓ \q½Ĥ.×Gŭú @wì4_[ù˘‹KÊ(ÌW._|7W6_„µħuÖ&Ĉv¸ÔĞ玏?ŝ2ÙëÓvúâĜıêlh|³!Ñî\ÛċrŝüöÍ·gÏ.xô(ƒŭ2£sç.³Ï1ĈS˧¨kBÌ"&……E¸p!o½5 ùcÀ€ŜJŝëĦ5ê×wGvöclŬşK—ĠxaŽżòïS~Ħĉ‹ë5uı>ê×Wşc§ùÚÊ]Ĵ/ŝ˜Ż\ĝn(lkcëĴÍÔíh5jví:€””û(**Fbb ĤL™ĦCû³ëè‹cçŞ³ĦñÍB£ŬùĥË÷PM, êƒĝĝsìġí™:ŝĝêajùuMˆy˜qbQ£ĤA"qG:MññÇK1thDDle×Ùħc-ĈŸ‰êĠŭğ÷p( ´h¨qôaÖĴÉ ê +Ğz(((ôziħx]OĠÏèÑÓE[Odä9tïŜ‰½­ŝ_żŝÑġ˜K—bÙ˙è† ˆ fĦf͆Ĝ³ç{üĝׂÊŬż˙ üùç)ÔŞĠĵ‡^½şjlC{Ÿ¨×c˙ŝ­ĝ÷ßK¨S§)7~qqwqĉÌopww5İÎÚLŬŽĥ™3'á̙‹èÖm0 sçA¨S§vîԜT…„4Ghhgöş :k÷ĠÁƒ;qëV<5zĠĞûaÒ¤9èĜħ ĵĵêéĴ÷… Ñ_şËħêÛnTÔ >Hg;’1Ğ/D}{ĤŽ?z˜Zŝ]qôè˙ÁĊ1ú÷ƒ7ßì†êĠéˆ!eÌĴħé„T&ĤĈħ——ħc?ŽkK*ŞŞġ ¤˘ħôĜt³†RYää<ÇÌ5)޽ĵ|÷Ŭ—ü+•Kİ!D\”Bˆ‰ÄŠc'„Ê€ŽXb"ħâĜ !¤2 #„BM…Xħ8ŝ ‹Úµ›ÀÎÎ mÚĵ‰Ÿ~:Ĉû8K *ë¸p…B;#Ôĥĥ^hŬş7bb4ƒ’’îaÙ²uĜ}ÍĞí3Ĝµëš4é[[/4kÖ 'Oža×ïßż~ĝáƒêħ}û7°·÷FAA!àÙ³Œ1ĠĞûĦI“N¸zġĤĈúıı/0cĈ"¸şÁÖĥ$LJH –úv„´½WŻaìÇz˙ùçĵžRġ{ü}?˘Aƒĥ°³óB÷îCp˙~šĈrw÷ĉ˘îŭŭÛóÖŬ“OB) fX<|+Ĝސĉpp°Çœ9S5bĊµÀ}[°xñeǏŸÖÈ%QQ˙/zÙ²uèĦ5úġë‰K—báçç~󇏠7ğî?˙œÓÈ[Y¸p_ż…””Ëxñ"áá‹ħnŬv¸şħY1Bĥ×v•²:bħ‡P³fCLš4íÛ·Bǎ­K­—‘‘…-[vaŬ:ÍëL„ԝB*:³M,ÜÜê %ċ>ç:úb¨££Ż—Jµüŝû_öÛo=­AÎÁÌW&ÀÎ5.4Ŝ:==½{GŬşµqĉÌoóóÑXÎ0 {A6[[ĵġVk öï?„q†éŬ&|óÍA,]ş‰;{ ˆµu}äç@"‘°× 0 ƒ½{ÀȑƒÙÇîÜù-vî\O8:VôéïêĠ›È̌Ȑ}[vĝڒ˜˜bÒÄBß;uj‡[·Î ¨è.]ú WŻŜĘ1ï”ZoĊŠ x˙ŭ‘ġZwBİèÌ6ħ˜:u>ĝ`.nŬЇ\.‡L–‰ïż?‚żb×ÑC} ŭuçÎ]FAA!ŝ ;wF`ñâ’ë„DOkO"ĝ"˜ùʸÂı˘Ĉ…Ĉ[Ÿ={#FLÁ† +°bĊ<×Eĝĝx!##‹½=jÔ4DG_‡\.ǝ;‰;ö#Lœ8Š]ŝŬwG¨‘żFBĤöv #&{íÈ A}pè.Èċipp°GÛĥ-ħoߏxñâ%.\'§šèׯ'ûĜÚµ]°˙!äċċÁƒGĝE:O×pm':úoÛUôqú‘N]ÏÎ~‚eËÖáċË<<|˜Ž fÛÛ½{wÓXïĉÍ;ĝí·ż°lÙlö>!ûB* ³M,–,™…~ŭzaàÀħppEÛĥ}{“&ÖXOW utôuìÙ³ Ó§/„³súj?Ž;708zZß}êÌ|e|qáú£Ĉ…Ĉ[1gÎ\Dûö}5'!>>‰]§kןŽyë­x÷ŬIppĊÀcÑħcklÚ´@ÉİkÖ|Á~߅PçÏ_Ѹvà‹/VcÛĥ½psk†áèÑ},ŝĝ×ĝöÛpr @HHOĜÚÚâÀímGH۝â^k IDATUß!ñôiêĠ F³fŻßôù"şùïì\ÙÙOP·n ştüĝÎRe̟†ċËç²ġZwBİ,,:6½˘ÄP—cbOŸŝğvÀĦCğ•߯_OŒ5ĔjVÑMİ,(6ŬH)†şĴ+Ú ĦĦ/ÄĞüŠŞ*µ•BÌÉì_é­ ĊPB!“Eħ jB!¤b²È#„BݘhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXB!D44ħ „BˆhhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXB!D4;ħHÜ+ġö,mûêÔëbIġ*eÑ^ħÊ£1ÛwèŻpwonQc¤<ëRŜíĥÄŝ.+–6։aÌ6ħHÜġŝTF–ŝfm‰u*/•ùͨ,}òIŽŬ†‘™eû•İ/ġQo£v—uûĞB˙’²am ĞżI$îf{q*/–Ŝ>KŻħŝîßOòċë5Öıx111' TĤkÜŻú/€adŝ#àj/dffáXĴ^½£GOGFFîߏÁêĠ‹ôĥo߈ŒüpìĜqĜÙÙâ?ŝ8}ú,úġëİ·Ï„n§ŭ"´úú988ÎÎ5qêÔYvŬ“'ÏÀĊĊ -Z<6´÷CTÔyܸ‰””ËÈÈÈŠŻ÷-ß8Z|²²#%ċ2];QG]ÛRÇ7îÀĊĊ #GĈîŬßħ÷>ŭ/Úµ ĞkŜúÜlܸö rs“ġ.\ˆĉì3íqĴ=„ +W~ޏ¸ğˆ=‰””Kxĝ0]çz|‚Ğ_…ô9W{…ĥKßk’1 íGmiĴqĜ´oזa†IŒ3ĝ‡ad˙yßÇwĜÛ/_Ĥ0ÖÖÖìmOĉΝÙÛ2Ù ĈÍ­àm|™ÂÔ­[[gê×÷`’’.²·Îk,ŻWϝ‰?ÇŜ{÷_Ĥ~}²ÒÒêm£1íU_^PpżÔmġuĠŝû߃̨QC†‘1}ûö`,ĝ0 702fĝA̟äĴŸşrµ“ożÒ~ŝò˵ÌáƒĜe† dvìXgòĜÀ$$œgoÇǟc<==ôŻ=Žê×÷xüŬğ˙röĦú߸Sŭ”t‘ñöÏ=`FĈL›6žùñÇŻĠŸoœyyĠcĥog<ˆÔW|AÈsĊ˜qmìóÈħáééÁܽûŻàíë\ŭʵŒëı¨~[ÈóN{ßşĠL}ŭ­hcŬÒ~>_˙0†½GïÛ½•ÀġŜ~öŸż™öíÚ2†è  €ĥĝpP€Eħ¨U˙ŭğZ5ÈċrövZš AA]am]VVġàîŜ\ïİ 8wî2ştyĠĞûA"q‡£cClêd²Lĝĝx²·}}½4–gddÁÏχ½íç烌Œ,uêĠ3üÔW{Ġ—ÛÙٖş­½J÷îoàÒXĵxñ.DcñâqîÜeäċċÒXtïŜÉàzŞÓn§ŭ"´\ŭ‹·ß~KPŭîqöË/û÷ߑhÙ²üŭÛ÷ß˙\ ôxò\1f\sóu#==S>ä\ŭjjŸ m—1ŻIĤlKeëD?‹žXpñpEjêÈċiP(adœ‡ĝ†Ÿ‚>šˆ´´ĞP*ӑ““ qŽ^›[]¤Ĥ>doßğ÷ Ôò””ûìíääTöœqp°G@€vìĜĥmCàìì„Ö­ƒħ}û7hÚ4ööv˘nÏŭÂ…ĞŸż/DDBDÄa ÎÎN˘ÔA}›÷î=€›[]ö6ß8rwwĠxĵúßBÚË5îÔ͟?[·îÁùóWħc88Ĝ Ş?Ÿĥm[âĜħÈÊş…íÛKŽ3”=W HNNċ-—o\pġĞ}.ĉó<ĥWÇ:y­ÂN,ĤM)Sĉ#)éär9nܸ‘#§ê]???ööv°··GJÊ}ÎA4rä`̛·ÙÙOŭ¤ÔyŜ#ŜĈìÙˑ™™ÌÌl̚µ#G\wgg'ö‚Êò·oĴ]ğ oÙ ĉ›Ŭ°ví6ôíkÚġşş_¸ġóĉ£°gÏĜğ÷Lœ8J´:̝û)²²#+ë1ĉÌYÁ ĝÇѨQCĜÇgffcöìċ‚·Ë7îÔµoß 666X²$cÇ\>£FM­[ñ(.–ƒa£Ž¨3ġıÂĊ˜ç‘Ħccüĝ˜9s)>Ldzg9˜3g…ÎġĝDžŝ~£Ïó†\°­½.ßöĝʌcĵVa'‹ÍDçÎíѳçğ¨V­FžŽ!Cúé]˙›oĥ`îÜOáèĜĦĦCÑİS;½ëZµĠĞ;ÂÛğ‚‚ş˘C‡Ö°ħħa—ŻY³nnuѰa4lĜġêıaġêE‚ë>ŝt´iófı}NĵoßÈÉyŽŜ½K&½{wCNÎsôíÛCômş_¸ġsϞ]PTT„˘˘"ôèÑY´:tîÜ͚uƒŻoÔí‚Ï>[È.GĞV-„‹‹3||Z£yóîjâwÚĉϟޤ¤{èŜŭ ÁġçóöÛoaè ptl€… Wáûïw~Ĵ.Ĥ>W¸ó<2tl|úé<4m€ààPĝùµƒ·w}ëñ ~£ÏĊ|Ŝ•Çö*X'ŻItÜgÓ]Û˘ /!)á–ÁúÔ6½VĉΝDôë7ÉɗÌ]R…ğ]ğ 99ë׿>*R†ˆ’Ĉ ulÚ°ó,7è=:*ò&N™…ââ"¤Ĥ$ĵMYzĉ}²/]~@>€ĵW?/ĠŝÎP`ĥ/ȲtsĉĴÀŠóPXXˆyó>ĊàÁ}Í]%Rw99ÏħeË.œ8q¤œkH* sż)ÓX7]Tä sWA'šXèáëë…F:˘  ƒġÁgŸ-0w•H dÜI$îJĜşu5<=…}Ù!–†Ĉşi$]', !„B*Mv£CG* }Ç.e~*¤Â^ĵI!„Ëcq JÔÓÏ\}c‰qÍTYâŝ$eÔTċŞ[P§Ğ?ùúJŒçœ.†>Çĝúǔ¸{ŭkjD8Söğ×2uB˘Èµqġ+_ßpġĞĦu×ĈĠo†ì3ħ_cŒéÊĈĴ7ĠġÍi‰;?ĤÒċċċÉ)ĊĊuĵĵ|ĝúĥAffœŜ2ùè*#-íŞF Żo?~û(Im î™ì†Î2ë×o‰ÈÈ£ÄÇ'ĦGwña,gÛU÷²œŻnşÚíŬ |„Áƒûò~>\ğ.şÊÒ^Ġ~-,,‚½½·ĈíêĠŭôîccĈ‰>QïKíöhóò ÁɓG¨‘ż úİh-~7vŸúœÑŻĦc[ÈsNÈĝ5ô9ĈĠ?‰;Σa€„„dôèñ<ˆÔŭkh˙hë v é[}íÒġš‘œœŠĦHLĵLŸŬşuԙáÂׯ|}Ġ݆ÔŬ~3tŸ‰ŭcHƒ>nj¨[CâÏġR†1qàê„ÄE‹Ċ˜ÈdŠÇĉn6KÏĉê >|}%ĈsNCŸc|ŭcJÜ=×ŝ55"œ)ûŬ˜}EĞ_ùú†Ğ_MW\ŭ&Ö>3ö5Ĉ>l,rbÁĊĝs1Ë04&˜/.ÚÚÚyyùìíǏŸÔSêP<ĥ1ċU„ĝlcġ•1ÏcĈ7_=ĝúǔ¸{ŭkêXâë vñ=ÖĜ×C(rm\ŭÊ×7\ŭÊWwSú­Û|}eÌsŽo|Sŝ1%îžk˙šÎ×\íâ{Ĵ1Żewı6~ċë~ċĞğ)ŭfèóż,^c éÊĈĴ cbù≅”iH„şŠĦ1Á|qÑ{ölÂŻżŝ'§tê4P#ö[h;Œ­@ñĜ†Ş(ñÙĈàë+cžs|ۘzġ)q÷\û×ÔħÄ×\íâ{Ĵ1Że*ú˘Èµqġ+_ßpġ+_ŬMé7C÷YY½Ĉíʆ²B!ž9#´+j|·(r"²êcKżx“ÒM !ÄqRAQäeŻ*÷1M,!¤ Ħ(ò²WĠû˜&„ Ż"50êвWĠû¸Â}ܔB!–ĞқRêQ™Ë\ŜÊğŽbG”W„>&DìqŻ=,ħ FEyQݧvDyEiƒ%£>,aL?{‰E{܋Ħ,êIcİlĂTċĵz=µ#Ê+JHĠQcR{Ü[*z>– ³O,Œ‰Hżv-ŝŝí5ŝ•aĝû·Çġ뷌Š96%XHD·XkĠúB#Ĉ…DsmÛÜħ̆´Uhd²ı#ÎĠc˜uEÎЍ›ÂÂ"L˜0 ŽŽ àîŜ7~·ßaÑġ|ñBĈ“ĦqçÚĝĈ$W;¸"µ·ah=ù˘×ĊŽz7ċuC_?q/ĉkŞqoêĜ;Ú\ğ\!u ™}baLDzppœkâÔݳìş'Ož‹‹Z´4*ĉĜ”h`!Ûk­"4b\Hô°ĦÛVWħÌĈÄİsE&[JÄ9_¤8߸Y|²²#%ċ2];1Ŝu]Ï/dw טäj‡!1íĈԓëuÀ˜2MöÖ×OúúÁĜˆ{1_SumÇÔħ)v´ı>|Ï"ŒÙcӍHßħc?˘˘ÎáŬ€á'£{÷N˜1}£"sM‰ÑmhĴµħş˘‡ıĥm ħÌBÛ*42ÙÜçúâíµoóOÏDFeÇe||7ŝB˘ëùâáùúʸsm|cRH;ĝ&Ĉԓïu@ì¨wS_7„ôƒ!QäbżĤŞoGŒħ)v´ıv™Ĉċğϐ>RKaé ³Ÿ áÂĞëìì„ŝŭ{!"â""cÀ€Ŝpvv`\dİÑÀeÑЏİ1ò–Ël ÈäŠqÎ7nÜŬ]5Ĉúßşˆ]oÌŝ{ü‹ÑcëÉġ:`L™ċímÊëĜŻİêÊjŸò1çksUfÑ XŬ‰GaϞ°wï˜8q{ż1‘ÙĤD‹Ñmcc“U,!–Ù\‘É%âœ?&|;.33³1{6w‘ÑġĈìoħÇ?_;Œ‰¸ZO×cÊ3Ú[›~0&â^˜ŻİêÄ›emNʆEO,ĝbu{öì‚˘˘"iDêslJ4°ĜŬ†0%6°ŒXfcpE&W”ˆsq³jĠB¸¸8ǧ5š7ïŽîŬı}Š]oÌŝ{ü󵘈kĦġäz0ĤL1£½µéêc"îĠ‰ùšŞNŒħYVÑĉD|›NÊ Ċ2“Ф"c'U›_cA!d¤LTċÈ`BİÊhbAD'‘TíÈ`BİÊhbADG‡“IED–qXôĊ›„BİX,vbAİs„BHĊcħ B!„T<4ħ „BˆhÌ:ħ0wĵ5!„BÄe։…Ä[B!Dfŭ¸é?áäÉ#ìwlÙò™Îġââ˘Ĝżìm4îKOÏDVÖcx{×ÇŜ½›-#„Bˆ¸ÌzÄ"==~~>ĵë;w]şĵêĠŭ ‘¸Ñħ²³Ÿ°Ëùeŝŝ;-[ö€ż{üŝû߂–B!D\fXT”xkB!„c։EE‰·&„Bˆ0fXT”xkB!„Cħé„BHbéħéôY„B M,!„"šXB!D44ħ „BˆhhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXB!D44ħ „BˆhhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXB!D44ħ „BˆhhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXB!D44ħ „BˆhhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXA"q7w òè‘ Aĉ!„*€&F`™àuCBzáòċĞeX~ÑÑ×Ñşu0àát¸ğ7g—eddĦUĞŜĜ¸ñ+sUBH%bmî TfrıññIhÖĴ‰YëQ2ħh8ŝ ştiHIı}GaÑ˘ñŝû#ÌYEB!•ħ0À“'ÏàäÀŝíìÜǏŸFç΃P­š/\]ƒÍ7Ùċ66žÈËËGµjHܑŭ™™Ù˜8q6ÜܚÁÎÎ ĦĦCqïŜò×­Û/Żxy…n"#ÏA"q‡Dâ;;/tèO(Itô5­‰Eܸq={‹ V¤‚Bˆhhba€„„d4`˙.((À?Ċwß}‰ÜÜ$8°sç~ ¨UË?˙ĵ#Fĵ †‘ad°ĥĥBŸ>#Ñ˘E â⢐•u oĵÑïż˙1[ĉóçıHM}ˆë×#ñàA,ïvàĝñÓĜıs=ž<ı‹ĴĴ[˜:uŜ{ïCvytôu´jġzb!‘H0h8|ûív Ô§ĵşBH@§B Œ† _O,#"b+¤Ò’ùYpp$ ğ~lì żhrĠŞ-6l fϞÂŜ·bĊ<Ô¨áŻVf#|ùe8ĴĴĴogíÚġœ0a$ĉÌY äÂ͢˘"ĝĝx˘°°ħħ7”tŸ}ĥ€=%B!„ˆ…ŽX 1ñüĜż èÍÙÀġë·ŞĠë #cco E‹@öö‘#żcùòġ°ĥ+ĞzJ=`oï GÇjl™ƒġa'BĥóäÉ3̝û)7î{{oö”ˆ³sMšnĈÄ\Gŭúĝġׄ…mBtôuħğˆBHG hħPQıx1íڅ°·Ż^Ó8b‘žž‰ĵĵ{ËÓ P<‚R™†‘áéÓğl™Mš”Ú&×v W×:8~ürrÁ02|ġĠ:öԇö…›]ğvÀo´EDÄV 4·o'ˆÑ5„B:bÄÄ|ĝáöï† 'j,żx1|0†½ŭôé3³·Û´ Ĉ§ŸnÀœ9SQĞ–3â“ñÍ71gÎTxyĠÓ(_}›\Ûıv-ĞW/BŭúîÈÌÌĈ‘# ,ìs̛7@Ʌ›Ş‹3ϟż‚~ŭzúô ĊĉÍax뭑ˆŠú >>žbt!„rİKƒ#‘HP\\TµÑD hħPŭ­réR,vïŝœ½=kÖduEaa^LÁÁƒ;ññÇKѨÑ(((@HHs̛7^^ġô–É·;Öbüĝ™É2áïï‹>ƒ-5ŽXlÛĥpŝ|4Ö­[Ĉ–3bÄÛxö,½z ™3żÁŬŬUŒn"„R’n ^7*òDÖD“DÇ}6íÛµ-şpñ’A•Vñ¨mz­!„˘ÓĤ ğ1oÁrƒ'§ÌBqqRS ?.KOĵO–ââËïȐ÷êçÚßù è B!„ˆ†&„B ]cA!„T`Ÿ\…*u˙˜Ñ#ĥryıׇŽXB!ĜŠċK³g¨Ĉ}={†bĊò%fİM,Ş8ħ#àË#R˘ĊÖsİLm4ÛcLÛʲ?,ĦŻ-ĦB˜ğžĉÚŝĦCżÂŬ½ıÙÛo(+++|ħùs—|08¸ĜüıĈ—-–'šXTrŞoâÔġC,›!ûˆö§ĤŠ|“°Šc™:“úö?ù$ GîÈtË0 .\—Ĉ¨UĞ1/^†aÊĞŞœìħg×tíÚ{v퀃ƒ½ÙêB‹JN€Ĥz˘hß&–‹öQċĈ·+óŝ·ÔĥÉħc½ËwïŝQQ÷nŜü‘‘ç4’ĤÍ­V­ZĜ·wjĠŞeÖzĂà믿…ŻoĜÚz!$¤^½É.S(Xĵx \]ƒP­š/FŽœŠÜÜ‚ʍŽOÏlŬşGŝk×âàïß^cĤÏ0 üŭÛúġ[HNNĊ AP£†?ìí½Ñ·ïhdffëÜßz†ÖŸŻĵ?˙<…fÍşÁÖÖ m°wï‚·UXX„ fÁÑħÜŬ›cĈŻôÖC{ğ‰ğŜŭ¤ZOûH_}$wlÙ² ^^!J=x·À }OŸĉ nŬ@dg?aï+..†ĞkŜÇmĜ°nnÍàèĜ'ÎFaa‘Aċèë@ÜħnêŝVݧú Ŭ˙Ÿ_€ñ?f·µaÎ#†ìG² 1yò<89ÀÉ)SĤÌGAAĦFŬu3ĥÜûJ"qÇêĠ[àâÒ-pìĜqĴ]ğ µk7‡G œ8·íúH$î`R݇Ŝûö۟°fÍbÔĞçŽzġÜħfÍbDD6x[•M,"#ÏáßÇÓ§w1dH_L™2Ÿ]ÑÑ×s7áà`… Wó–ùÇ˙Cߣ°cÇZ̚5YcYppœkâÔݳì}'Ož‹‹Z´ÄÀc1{ödfĈ!#&7ö׈‰7„ħġ×gܸö rs“ġ.\ˆĵ­ċË×!+ë1RR.ÚµSíBß~Ò>eHÛ/^ŒALÌ (•éĵÛ`qqqÂȑƒħ{÷wì}§O˙‹víBàêZGçc˘˘ÎĈH¤¤\FFFVĴXoP9úúƒŻm†Žħö7W}…Ö}ùòġÈÉyŽ{÷àĈHœ={Qo9€aû‘ŻìeËÖáÑ#Î#>ŝîßOòċë5ÖÑ5ÎĝÚÎĠ^ÈÌÌĈ‡ħX½zFžŽŒŒ,ÜżƒĠĞġz!d?ÄĊŬE›6ÁìíÖ­[ .îÁÛŞìè›7А’ıĴÔ}ßA­Z΀ĵĵ|89 ¸ĝ!À×· Ž?ŒĈK˘Ŭ32²Ü2Ù ½Ûĝò˵ߊ_@Ûĥ-u·cÇ~DEÇáğ‡OF÷î0cĈûÖÍˡŻodfĈ•j‡6İî3Ĥŝ\ċy{·Â‚aàôôXo[žž!ˆŒ<Ê~E{||7î¤÷ELğ\ûIW½ùê#‘¸#-í*ê3œ—IDATĠÓüϘk;ڄì›ääT„†EbâĜĜĜ`úô…èÖ­#FŽĴ³Í ç5:żGwàAĴÁċ”ġX7u2Žùêî邨¨_áçç $c(  £àS\û‘Żìúġ["2ò(›üŸ„=ŜĊ‡ħlYşĈ_ÛùĈğjyaaìí½5nWŻî§wÌjĞ‹:+Ğz(.~ÈĤM+•JĜÚzA.O´-ħ¨ys˙žm=ĵy“Ç‚°O^¨VÍrıœ½–&CPPW%§+”J%$]óÑ×6oŝÇ×;İ€1c†bɒpdg?08~<’Í?9wî2.\ĜĜxù2x·İ1ġçòË/û°jĠfĴ\ıNN5ñĊĞ0pà›‚ĥ%“e˘Aoöĥê…Z(ŭ¤‹ĥĞżĜ َ1ûĈÏÏíڅàȑ?0rä`œ>}›7‡é]_½4†L–eT9şˆ9ÖËzRw™,S#H×׋³,Cö#_ÙYmóóóAFF–Ĉ:şĈñZngg[ê6ßsXĠĞ;âĊ‹—¨Y³ 7÷jÔ¨^&ÛâcÊëXY£S!„“‡‡+RSݰQï #+u8SÛ?˙üŠŸŝógg'ôïß ‡qô†³³`ĝ)ĝ裉HKğ 299 zŻĵĥĥĥF^^>{ûñ§&ĠŸŻĵĥm[âĜħÈÊş…íÛ5ÏòmËŬŬ))÷ÙÛê—cöCöşùóg`ëÖ=8ŝ :vlyĊşzżÜğ÷nnu*ÇP†ö—%ío7·şHM}ŭú½{8×7d?ò•íĉVW£mÉÉİzOsUtAAqċÊ5övtôu5.÷z̚ğĊĊEFŭ”ÑO…B!¤rĦ2B!„˜M,!„"šXB!D44ħ „BˆhhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXB!D44ħ „BˆhhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXB!D4Öĉ!U•@ ıĞPİH$$ĈÇñ×°QP9ÔĤjÒï¤ê ‰!f””pËÜU¨˘"O´>0eT“ŞE"‘˜ğ ÄÑĂR%ѤÎ4†NĉHĠA×XB!D44ħ „TyŞë.跰߄pÑu‚ÌĤ}ğĥE.^˘C…„”!˙€@“žc…Òqu8ž_¸„úNƒû¤ ÖQ@bc‰••)UµxQ‘'0qÊ,Áo2 ö}FAfğĝż—àû“IP0 À0`€AÉġƒ<0k°ċ]àĞê/UŸtñfU KOĵO–ââËïȐ÷êçÚßù è B* Ìƒ‡ĥu;š½Ġîóĉáäĥ­pîÙö>ì:Oŝû’>Y{/O4ŝöĜşı™ħĈ–Ë\oŠ %ƒoO$bĠ”žp´·ƒ‚‘@” ÁÁ°wtD‹7ûàAĝ:vü¤dÜ˙l ú,Z„f:Ö;#Pzߌµĥ\ċyx?5ë”Ê’#ŞOĤ89ÚßuŭN_}€żcÂÑŜ–úÁ:BĝÐ Fbm {w<} äĉ‚yŝž:Ħ(>/^ƒ2/ SĤ£ŭèѰwt„gĞVhġf$~ĝħıĞn‘Êë? w²°t˙eH%g % À0P2@ħ(’3(V0(–3((*†ÔB?ÊIG,šXRy.^€Ğż˙¸ı)*‚$'-ÂŭUáH™·~!­PÇÏLn.˜ÂBÀÎR[[sWÛ ċġŸqYo‡a€C‘É8™‚‚"%{ż%G-” W % WJ PÏrrË´NĤ #„M,İ€jġê‰" }û6$P>×ĉÍa#WÀúÉ34êÙJ™ `ä½xè˙üŝ_lÒYVä?Q8h(šµD^oᗣż–skÌĞ,˙/(R`íáëHÈ(ÄÜħ½4J€’)™L)€Ü—`Šrä[Ggy§N˙ƒŭßFÓ –èÛ˙mœŽüGcıö›~bbúô(f“èˆáEoRAy}ş Wç-@Ż…‹€Ü\(>D×I“kk0II`ž?‡2(g6}żÏ×ÎÛĞT11WħxÉrlXŽÚ!=]†_}w†6C‹Ì£Ĵ>’ñ4Ğĵ†ÀF>èŬ ìlJ>™óîê“ëÍÙr `e%AïĥX4ĥ²s^”*ïêĠkXşl6oڀ֭B‹yóbçWÛܢÔúÑ1ħX°p 6oÚ jğÌù)R1Ð ŞFĞĜĝú"ŭʸ{{ϞĊĊ%ŠôtX÷ê…sğw£ö˜Qpêü†Î2víًOĉÏE—.ŜŜ^Xżn ğüÁƒ‡Xµf-.\¸ı\ŽÚaúµ¨]ğ€’7™ÏÂV`×î½ÈÈÈD@@ClX·M›6ÈċrĴ߸ żŝú; 9>œ1 “&P(ĜòĊ6üôóQäċċĦgP„Ż ƒ££cöZieñ&y=ċ ĥüçúvm…Ĥ~îHH`_'ìX4ÖRÀÚJ[+ÀÎĈ vÖR8ĜÙ z5;H$Àœ<(JöZ •ŻwïĊĵı³ÑħC{@Çí1gÎÇĝz×^ìüj›Ĉş'OžĈšµëħkç—h(jÛhRAĝİB*(e^òĤÁşzġ’ï@(*‚2=Š;w`Š›ÇŽAYßġĤNÖ[Ftt,şwë˘wùäİ30áŭq¸tá .ž‚_ƒ_ğ^c‹/§Cß#6úŜìŬ K—}Ê.Ûşmñûoż òÔ˙ “e°Ëv~½7oŜÂħ_àâù(ĜÛÛaĈÍ&ôˆqÄfàĜ…ûĝò÷ğÑż êıĠA⣒O‚ÜşŸƒğs˙0 iϐĝ(ñŸ"ŝÁcÜş'ƒìq.²žÀŬÔ Ÿ‰ŽŽEh÷n÷…vï†è˜Xû~úùÖoĜ„{EŸTtáGG,݈I3çÀ·ysÔġġ…".Èχ2- RWWäš }Êèh ¨°ħ¤R0r9Ş99É˃âÙ3X9¸ë-§FÈÉÉA­Zµt.‰ıŠ 7!îÖmäçç(héĴ61qp°‡BĦ`ogeeÛĞôµ “e oż·ĵút„Ri–´L1Ż(V(P(V0(R(a­‚)R ç0°–2p°‘ÀŜF{)û7£d)`ogÙ\xÖ­Qv͚5ñìY{ ž>}Vjb¸zĠJ̚=ßî߃† ŭEi—:şĈ‚ĦS!„T0˙ïżxyüo´=Êèh0 Ĵ:t@qĈ°éÓ̓'°zúM{÷ĈƒuÜîµjĠQQgġ.Ÿ9k.ĈŽsgO#áîM\ıhPäxŬşup˙ÁË\]ë"*ò¸{û:âïÜ@b|îŜ\ĥXÄ|“\ĝnsĵÑĜ ‡Ž† ä] /òxĝ¸9/ċ((RB€Úı‚BÁ@ĦTÂĈZ 'Güû*ŜtĠ(ğUĞ–>r:ò´jĠRßĊĵı³Ŝ¸ ˆ‹?–&„M,İ@^Ŝı‹Ğ×ĦÓ“7 HO‡uHâ˙÷?üwĊ äĉĉÂŞaC(˘£Ñ sgĵŒŽĊ‹›úßĤM™Œ ŸoÁÙÏĦ¸¸÷ï?À˘ĊËĜċ…°³µƒ>LÒe+ Şï!ƒöÙÈdxŝ<kÂ__Ÿ1zÔ,]ĥ÷ï?€BĦÀŬĝx̚=ßà>1•Ĝ× ĵÛÙÓúà—?£ ËzŒ&ž5`%• g°;ş5wC§@7´oâŠÖöwE o]4ôރĵ9'ɰöğ`kĊà­Öš§2ĤNŝ›6ó.˘¸¸.\Âĉ-[1uò¤Ru:äm,[ş'LFLÌUQÛG×X>t*„ $}Ë6„ôëğÂB'$ÀĤgO¤ÇĊ!ċö-ĝ­ĠĦë”)P¤¤ÉÉh9`n\…À#‡t–תUK„Ż úġŸ#1)ġêyàÓĜċkךµëñáÌÙpssĊ“&à˙ŝû§àú~˘s}‰pİn÷ZŽÎí×-µNĞV-ħú³•ûl îŬK…ŻŻÖĴ CHHK%ú÷ƒ-&OŽèËçEkħ |(Ŭ”31&Ŭ4ó‡‘s:O›Ğĵ<ä>{†3ûÑôÈaĜĠóÀÍACÑŞGOÔ ¸}ĥƒŸŻv ÎÜÙpîѽ,ša,5Ŭ4ŻPŽ ?ßcm!=Û`ġßpdYÏ2ÙVyĦtÓŞ‰ÒM ݤ\nj‚üùsDíĜà]qñ?àŭĊf0µk!ż î‹à겕èġÉ'`rs…n~ŝxvŭF݉ß!íŞòfQ–íĴfgc‚ñŬÉD|s4@Éw{0 ‰DÂ^Ĵ*•J9/\rúĦĵöWUÄx4ħ ¤‚P((..†Ó¸÷PdeK?A͙3 oàƒgÏ^}äÏÊúġp˙ìY¸5oŽĜŸFÖ£G›? …VVŻ?ÂHo%Ê∅Rİ„\.‡BĦ€\.ÇÛm]áVCŠoOċâÉÓ§ìzR‰RİR++XI°ĥĥ†••Ĵ­­!•Βö}*„Ħ‰!€\.Gqħry1är9Ş ›ŝ}!—Ë‘›ûr…J%İTÛİ“qmŝB0ŭçIïkĝ0ÀÎEEĊ°µ…Ĉ䂈˙Ĥ­P(PTTÌîĞbıòb9=lñá›ġó,JF İD +k+X[YÚÚÖ6Ö°ħ.ù[ĦPÂÖÖĈ"÷M*šXRHŻŝ³•J!‘Ja%µc­d—Y)ĴÀ€Xùxñ—C%oVÖ6Z[ÁÊÊ 66ÖùFenb˙.‘H4öUÉQ )¤VRx×­…RÁž ħ’ZAjġjıäĠúR)Ĵ_í3KDG,šXRHRĜÙÙÁÖ֖ŭ2)…BÁŝV(”`ÀÀJ*…••UÉdĠï’7:údı>bżIŞö•¨ċZ šT>ôjCH˘š$X[[ÎΨ^½:œœjÂÙÉ 5jÔ@µjĠ`oovrAôS]Iż ûMˆ>ôqSBÌʏ›ŬLù¸)1}Ü´jĦ›B¨Èĉ!•M,1#zs3s„RUĂ3Ħ77BHeD B̄ÎK›ġ;!e‹.'„BˆhhbA!„ÑĂB!˘Ħ‰!„BDC B!„ˆ†&„B M,!„"šXB!D4z'éî—g=!„bù­ŸRtM,˜‹—.×9r4Ş9V/ËÊB!ÄÂege`ɲ0\ĵtyôĞğ´'?úŽX0 ——qu !„bİŠŠ Ġo2”œH(µîÓ}ÄuĉßÚïż? ϟ?C^Ŝ˲Ĵ7!„B,LvVžç<’eaˆ:óïXĵžD(Ô~”š\èŠW´`À€}×.Ò`Ùây°ĥħ­­]Ù·†B!fµdY¨& …òäiŭä(xġSĴkb!EÉÄÂŻ&Ú·k{·l›@!„Kñêš Ġé9^Oòñz‚Ħ>İ(ÇÄ % ğW?öz˘a˙ê~ëWëĞNİè*B!‹êŞÓr”ħ(€ĉ£àĠŭ…(™X(ĴġĈ ä°‡%“Œb”L$jë(P2ħ°zuż4ħ „B*ġ 4Uó"ĵžD˘dn ġ£P­ŻkbĦ*PuF14' ê‡EhbA!„T>ş&Ċx=ı(zġSŒ×q2@ÉÄ@_aŞÉƒI… hbA!„TFú&ŞĠ¤BuĂŭTß @sRĦ½ġk,hRA!„TêßS!×úÑ> ÂyÄBU˜ê·šG1ÔŻ½°M,!„ÊH}bĦŝŬr­ß_ñÍ7PŜŞŭXiŭ–‚NƒB!•ö·k*´~—úÖM@Ĝd@˘GŞġ›&„BHċ˘ŭĠŬşÒğT™!“‰À߄Bİĝż5ü?!`ğaúŞIENDB`‚gamera-3.3.3/doc/src/images/manualclassified_color.png0000644000076500000000000000023411205471450021751 0ustar chriswheel‰PNG  IHDRÚıŻğsRGBÎéPLTE´î´kÁFôbKGDˆH pHYs  šœtIMEÙ'£ò)IDAT×cĝ˙˙? 1s£GıDўŬIENDB`‚gamera-3.3.3/doc/src/images/matplotlib_example1.png0000644000076500000000000005264610714675724021246 0ustar chriswheel‰PNG  IHDRˆi3ŻPLTE  #_4NE˙˙ ,N&(%/&+-*4Zb(39%˙";/&2X˙€€564,5T'6iX)-,=i-@e>?=(?/$˙!-˙~-/Cq5DdT XŠFHEMJ(3Iz7Iu<-ŝ05˙?RB;Mt5O‡;P€‡z>@XODGQo>;˙4A˙SUR l¤>Y‘AZ‡DX‹>Y˜HB˙HZ‚@H˙[]ZPI˙CaĤIN˙OPċ=d|°`b_Fd˘JežTd™T)Pe—HfĞdfc8r›YP˙RU˙²S ˆżLiŻOlħIp´Z[˙Vn¨Rp°Soµbqoqnjrw[r£a`˙NuVu´“ekbc˙NwjhÚuvs~ [yş›Íxywhi˙a|ħ`vÚÄgd{·tyy}Œg~şoq˙~ŞuMpƒĤe…żo„³r‚ıyrŝtv˙l‡ĵu…Ż…†ƒzŻL §pŠÀ~yŝX•Öz~˙˜‹‚‡Ž£Ž{Á„€˙'¸Ù…˙̃AЉĠ’“‚–·l£|˜ÁB·À‚–Ċ‰ˆ˙—™–P³Ú ˙‹šĈ˙a­àâߝŸœƒ¤”•˙cşÂ™ ½Ánš˙Ĥ¨™ž˙z·Ĝş²J‰·İš˘Ħ˙·Ê´Ğ¨İ­żYÏë°­§§˙żİĊ´·´ŻĴ˙¸Ŭĵ°ÎĞşŻ²˙”Ċċ#ŭĝ—Ĉô†ÓŬµµ˙½żĵÍğ§Ô´Àĵ¸ŝËâÁÁı½˙ĊÂĊÛ°ÏÔèÀŽÙĵÍÂÁ˙ÒÇ·ÙÑuäĈ˘ÉĦĈÈ˙§ŬçÍÏËĠÀ·ĜëäÎŞÒŬÎÍ˙ÒÔÛâĠ×ÓĠŭçĠıÑĜîĜÚÖÓÖ˙ċÚÈÛÜÙÙÙŝŬßÜÜÛ˙íŜËÀîġàâßâŜŭâäàòáÏ×èġß˙ïòċçäèêĉäéùôèÛèè˙ìíêëìöïëŭÜöûìñ˙ç÷÷òôñùòêòóŭùùöüúŝù˙˙ŝ˙üèîì\tRNS@ĉĜf IDATxÚí½`[Çyà™´R’žĉYÇ4ŝÔá‡Oô–"ûĴÙV1ˆÒħòV&ˆÏá#O_<˙( ·$¨nŞ Ä›ôhŝ·rAüËߒ2W~ĝèá|ïʕ‡…O}›ŝ]aÛN=ġ⋇O¤ŻW&ˆ75ŬäĵŬuŝáiA¤_>5~ñİ+ˆük@Ĵ‰ç¸ñ,ĞšŸúµV´Zñ‡gèWjĠÌk "mz_1œaü ˆFÌĝ(w[Ù >ÏDó<ˆNÌĝ(s[e ‚€ÔIDöq ¤ŽR6ˆ7@@ê("€ ‚ˆ "€RSİsèżüësó,vá߈ÖŠE_ŞW+qY•˘iÖ 5[hl!6Ŭ$–s(ȊQT›h‡’fM*òm–STTcáħż¤FQ ˘hİÀô¸Züo˘X|´ñL +X ˆĈ&ŜjAġ‡‚€FÔ!šÖÍĈŞY4VÍĥ@•Şfħ¸jQVĠlŞ+Qğ ”"€XNñ†X´‹iħ2‹N Ú[Í:?˘l!UÍ%ô݉Ġ|C=TÍ+ĚŜ”H €‚T ˘hŜW\/—ħWġ‡‚€FAD@ADÑ"ÌGRÒĤU3i’H Ȳ­zi+éĊψËDŭ'¤Y jêäËí ˘ £ŝ• âİc÷íÜısûö-[6mêê" @<¨ZߗĈϟ;·Il ˆ@â²ħ£6 ž*äo]ż²é”–‰Ò|ˆ˘Xˆ@â2ħ£££& îӀHIÜ4uŞ&Ċ¸ü@ìèHĴ-ˆäÖ&˘%Qd˙‹2'²òE ?Q\ ˆÀáòħ£C&qÉ >uùêKW/?ŭ&öq ђ(JÜİ0ŠÊ&ͧŞ@—F”˙–âßĵqú›7Ż_şu‹‘¸ġ%-‰˘ĉ˘Co‰ ‚€ĠĴñúÍWo1yġ&EñĠW)‰Û§´$ê@E­*Ô}ĀxŭĠ[´Fĉ$*“¸sËĤM›ş6l‹@,V…@kâġWßä*-iúKtĠËçNÜj˘U3ñ²FŞñǒ>|UZ[’‘ĝÓ+”ÄëW§ž>wX4­šëEkCWëG´÷ •ĜúŞV_‰•ùGÁ„*ÄEßÜdÉêděןñĉ­[ׯŝĝéGÄzQ­4˘½ksÓÀa)9Ğ ‹=[-ˆ?Râ Î!%ñú·/]˙^½ò§Äê hŒû@\N ^•8”@”‰—Ÿ|ġ7^ıúó§ÄjŞĊ 4˘5‰²§ĵP›byntQċpħ’+‡ñ:Ż”™ ñ%Z7_§rġÊċsWŻżúÊ+v .AÊìâ“IËô^Š˘XÜÔĞ]#ı%Ż 6ÄM;²°íÛ·oŬɅfĥœ*‘rx­ŝ ÚéD-&•{/u šPò bAÜoßNjìlÙÔE˙ïÚ°Ħ£cíêG.\~…ʵoµŠF,{i§ĊÒÑô b@ü0U„TnéÚµ‰ĊR×ĵ‘ó?F9üyŬA´³Vì1İH#V"hƂĝÏĥnŬê ] D–Yğĉ]<ġ£k˙tíÚ ġÑNrÇ-QÔÚċy/Eú.2AÄJ$6 D²a˖­Ĵ7Oq†µĞ÷1Ż½Â ġݚĞóÖWDpß4ÄĈëcÊa×ĤM,ÛA"ñHl(ˆ¤ƒŞC7qceÍꃏ<ġ½¸´ˆK^jmħŽWĞ‹YÛ!iÄ.Ĉ!И™BlMA–3ˆdMC‘ÉÚ5Ğw>˘*Ä&€¸~ŭúR‡Ż×íNÊ;`}%7¨9`½É]ɟô˙˜~g¸ìzéŽMžâM.!.gÉ˙´†8XğfÍêµU˙áŝá[˙cC@\ŻÊúÒÈ•me”ÇĦ5ŬYÖ.ğÄwĤŒ–xuoI\Î R“c͚5kßEĞe ‡˙×+D=Ġ‚h €h b×£çΞyä Ċ°Àá˙÷lA\/k‰ġÚWTĥü+–èk'ĈġJŞ×bê.J}¨¤ë‰ŝ€ġĊġßzR_ 7#ZŻUšë׿SvQžH\Ö n:?ŝôÓOQùŜŸ}ĥŜ )+-çġúâVŠd½úô\­×!oTe êŸ˘L¸ž˜Ĵù´ŜD#ĥj+ħĥ nżú1yAa£A\oĤp­iaU˘(­J,4ä´*ި>ÔhħÒ°ˆKֈS7_ıŝók×~~ƒĝ,И[ D.KħĝĞĈĦñÂf°­'â’A<Ûħq=ħQ[– âú 6 `üX#ce}ÑGbCA\oo¨„Úbçĉ„ĥŭ8ĠÊîFcEÙEcè31ôuñz£ñ`êŬ+˜“oÂÑN —]OŠŜÒ²´š›­+u³Tç‰İäûġ¤Ġ@Ĵ7ˆÍÖçċ9l.ˆÄd)÷ÈVħŒîDvӈ¤‚!è@ĴDr–ïJ¸Ŝ“³JNú‡%…mòŝêášDÑD)8Ż>ív"Uĵò?r5\È6(tuю"€X%ˆ:”ŠA´€S_k›uˆ­jä B– " ARD#fĠ€$ˆQ&P"ħݚII­Ûˆ@"€h ˘jVMe ĞùĴÁjÖùsìĴfà@4QĦjÒmX˘g8MAÔTÌKQıOCÑijö ’ċÒ× Òš ê8´óìˆ uQÏ!€Ò,5 D¤Y bk‚(Vġ•~?Q´ùXé9˚,§öwMôŠ.'ĥF—tÄRÖGXÊáâRh•‰Dk ˘h¨˜bmÜ7â²ñl#5˘%‰˘ş„…vWQ?Ula£vA iNv„Úú)fuK_Ĝgkl4î[ÈùZó #‡ İšmHÔrqN4îb˜5[׀2ğ’E2Ê^c£Qw½lA4á°1mD+m‹´°ħ*Ò˘“bÙË•żĈFîzı‚(6 ÄŞ5"Yz‘VŞËYc£Qw½ŒA, GljħÒJN,Y¤ċUÍvQĴyĠ\ŭ]/ß6˘]„v3ĴfÑ´ĦŻ‚Ħ/j‹*ĜEëîiíħìE2Ê[cCl]/_Ğı VáŬhħîzùXr€ĜŠ .żž•VÑĵĴtí û•,ޠµ1Z[ĕ=÷ Hk€ĜD@,ĈĴˆ­ĦDqI ŠKq%À¸fħnħ„`Ĥħ:.bŒÂÓt@iBö ûŽVíĝhDħD+çİv𠑨ëê/êû­ÂêÔ/ŠAÄJ@$Ĉ¸³h¨2"RDˆÀ!€¨ѲFĥQçYˆ ˘̀Ē µYY ²˙Dħ´FÔɵIımD+?@,D}Ġ,ƒM­fb°š‹"Ŝ5á£"€XD ‡†XàŞŬ†ö~Ä:,Ğ=c{Ìô`z¤¸\AÔFŻ/D˰şĉÏô`<ş=Ĝ›@\ĉ {—öĝ͟é@lqu’zE 7~ĤŬY¤ñPbëÏô`w×-ä|ŬŞ—Z€¨ç° 6hĤŭħĥA[hĤğğn%ġŸj˘ bcfz0ݵ‰oQ˙5eĤğğn)oär-@4(ÄÖֈdéEJZ|Ĥğğ^Î 9ljħĥs&+’6˜éÁî—1ˆ˘hÔġħQ3=ÍÓ³Xy š6Ӄí]·ŽĠ\/I#5bċŜ `ßjXÌ!€ĜÚ ĥJÏJmA4á°İ ÂLmÓ_SĊV„ĴT‹ÂDĉĝ—Zˆb›‚cVÄJOĠO#‰bK€$ˆ-2 ĥˆÀ!€³ˆ`5ˆ0c,€ ˆ"€ ˆí ˘.ôıŒĞÙ£şÊŭ ™F3‰b{Xv•Uş˘é‡ Ħ¨œ!ëQ8bğ¸oDħqÑf_ñLêĜ"D օ+Fë&YPÇĈĠpr†˘R†:ıUĈ™ˆĈŞÙ~<)!ĉ-ÍĤ@lԖ˘™N2Ù¸ÄÉÊZĦ@lĞ ‡2@4›kÁ˘ÚÄJ'gÍ. qhDRwH–"hÄvz¨²j.W#ŠUVÍbIĦj^VV³¨7,Dí qĤĤ„•'Ż06Ì`ghŞ_RĞÉLĴÑ|Nħm{VŞ)À2Fñ7|$?€ š}ßhĦg­AĴnüLG­ÈÉÄhD@AÄ&şo@ÄjD @„qÍ "Ìô ‚FĦ ‚Ġ  Z·AD@D@D@D@D@D@D@D@D@AD@AD@D@AD@AD@D@AD@AD@AD@AD@AD@AD@AD@AD@D@ADñ,€Ò ž%"HóAäˆ MQâ@i.ˆ2‡"HSAä‚ħĈ € ‚ħĈ €ÒêĈŠRRê˘ĝo˙ X6ŝge'P½|û]b}AżmzŬ‡˜Ħr¤Ŭ…#+΀HQë "çÏu"x×é|ôqzû|’%_U“'uÉ,áûY'é’ğNÓä~–ğ˙t™ÉI59N“Or<9ŞÏY&GĝO‹˙À™Ká[ž+q>ĊĠ„ßšĉžOVò¨§‹_˜”XŬ'‹ ĊXZtż´@%MJğĵmŒÄşĝ.vĊœNĝ}ldŜġM>ĝdqòž{\—ÜÁvÄG͒ÓJr—Ur˙I}rœ&ŸâÉQ5Wĝ¨O>}Ä*9D“½ú¤ 1ÁÏbzz½·ÊWžHó€ĥo£Âĝû3ĵĜ;×%…Rĝ@Ħx ÉòI9ˆf]ĉĥwĠDĤ˙<÷+ĵöÚOÙ57Ò"¸ëôŜ½{?ĝgX²÷3ŸĦıÏċcıǔÜ,wÇi–;­ËŬĊrwr'Yîa–{˜ĉîdı;²ÜÑâܧXîS†Ü–;Bs÷²Ü½‡X;Àrhn7Ëífı½úš~F+ò6ŝíâ?ŸtfĠÔ{‘îÊêžÍžMzò‡Ġ·qÒä]6y§żûâ2’ÊM*Azì^˘Yi—ğŞÄşhĵµ×÷Ò·²gϞ<ĥ{÷î<&Y%§iò~5ıœ,Nî<Β£ú\!9˘K>Ĥ&÷Ò'Ĵ’½ĊɃ{X²[NħŬ4rànŭħ‡>½×öj†ğÒß³áa4m’ߕÉë”Ŝ³úÚ­ …Ù{ßM‹ñôž½{îÜhQÚċnûA@|Mqϝ'÷ç~Á÷<ŝ MS’䴒ĵß*ıƒ''Ġäaš|è¨.ıÓ,9˘$É!ĞäMî= ËIÉ^%ıû34ÙÁ“ŬJò šäó;Ô û|”ŜÁ­[ğuGìPw.œù^“‹óœéŞSxĥ;­żrĝ Óĵ?ۗŭ~µ<>˜´6҄’ğg÷žğNn´(mí³’èĥŭê³ü﵂ĝY~gŸ-€(s(?Š&yÊ!ÏYżš“ş÷ĝĦ“ê[>&VŜyϏ™À“‚{ÔDÔé' 0ĉÉ:ÂÓOJŸóùIÛċ#òL^ŝ³ïfóí;ó •¸“ğżÓ FÍïS}/Òż?žĜsĝ=‡…"”Vp_+ "ŭü+Íĥ€Èĝ+ùšˆĵ–qÛaäPJԇ7C°HŞxħ>Ô$-xĎ>³äî½úd·EÂ@{+ ¸m(¸nŬö/˙‚‘'ŸŭìÓäŬM7ŞgÉçïÔ]­ÄŭÙŞGŝäÖïċaċŭŜİ‚ï9]¤ i²Cú‚×óz_{­ ¨ljœF4°ż‘˙†ĝCŬsÏú<÷ܳ‘ċŜsšĉŜsÚ"÷ŝ“4÷ŝ“şÜ‡ŽÒ܇ŽZċްÜ%÷ħC4÷ħCjî˰Êíeı½4w7ËŬ½›ċvrùü7^ÍŭûÛñ§?}“*ĥ/ä ù×tó­—˙Ġ܎ïF~ġÓÏùüŬ?ĦßÓ³Çĥ²ŽmğGŝžŸ…ñ÷·ùgÖíüqŭu{ÙĞO,A}TŝĤo£Ž+9é>Ĵ$š×~Ú"‘Ëm#—*Ċ‚ħbZ s4›ġšžŭÌĥJż+–ûĝ³ä$MŜ_HV’ñÜQ–3KŽ'Tg(ÉÛdoqBġĦ&ɓw˙áëîû³˙Žk<Şáòäw?B~͕Üùwż÷OóżĝˆĵżCŝŝAvŞüòä'ïÖîüŜ½4§ÉĊKÜîġħŽX<ıÙ’^ŬşwZxÏüµżÇŞP ċĈêoj“ÛƒĝZ1ˆlŸĈĥÜCÁXÑ4w<¸ĜHu·ag³ë–ÑRÔ?à‡Êh$­ ‘ĝâF˘TnԀÑ+†IÑ6ÎDC5âk‘@<ıwïŜ𨵵ÇÚKUpdĥpxœˆ:iâ;³ġJÉ!%)ۉÈ ÌV·Jڌ´[Ŝôéü/ĝżowïĤJŽoß+wŻü==ÁgĜö{ï½w÷½{ ;—çN”nüˆUrÔʧĝ°òìŬ‰…äǢ&Ù£É1_ùŜ]îĥúƒ¨½bVéYa}P{÷ŜĦóßS,÷Èı²óóïı´.ÇúöÜeȝdı“jî8ËUrwòÜÑ=R?ĞOrGöHŭRŽġaìı—çħÜ!“܁=R˙ÍÉtħż7ÉżûÛ<ıoïäŝEµÜßç˙êwĜĉ˙—ü—˙÷ù?û=Òvewŝŭ֟Â>³ž•=šùIö˜ŬÁ§İ÷w¤ĝî ÏvçQċÉïT߆”3ĵ+“wjxRŽ•ÇµeÄş#öîĤ9SPzVŠJğÜmuQwEÄûO[ôl~ôħòŜUmÚĞlֵ̒O݉Ĥ§ÙĴıÙûy5a÷Ş ŭHá9ÂĠY÷·oĵŝͧÉs÷ŭíıÍÚ}÷ğa_úŻPCxŬGHÛאŝĝ÷ĵ“™}>°WΝ_Ĥ;ší|żÉĊybÚ1ïn–>ž´x÷ë{ċ5ŭóUìȁû7Z”vıÛê âŝü§:‘‚ŽÜúȑ#ǓÓjbĝhŸœ,N>o’9nL(ˆÇ-÷>Ôôó3ŜäÊûÇô95)ñÖ,_ĥYñ°ÜǟTvĦ§ßhUÚċnĞ#ˆ˙h!;~ôĝçèżïÉ<9^vòıÇK'•NN+ıÏóäôR““49I“˙ü…u4÷0ûxô¸"<Ç·WöĞÁ%Ġ7 ĥ'ˆ|,żÈğèçµ/wm¨ ˆÒu_üú×ĠÏ_˙úĊê@|ßµ[oyëڇ½ ĥ{‘‚¸öİóçÏw­²„í½Ö ×DQԓÈ5˘Ds¸f͚.Uè‡˘+oĦRo½qMR‹b{ĝŞ ˆTî¤rlëj Ĝn{§5ˆïí@T&TÑkDŬC›jÄ5§NuBI{ƒI×Áƒk W~ß5™7½ ˆíâ™W‹@ìzij—}¨ƒíĥß³ñÄŠÛˆú‡ĥñâW¸\|ëà>#ˆ[Ŝä ñĈ+מÛħjĉ$jyéxi|ÓĤ§Ż^}zÓĤ*‰ZĜnûêÇí@üĤ–IJ@,S#ÊꐲֵÏâûŜ¸Ċ„qĝ‡ĦĜ–mÄ3ú"—9|óMFâv…D l·ŭċŻŝÀÄżûĠ‰UkÄULÌ@ÜèWŝI â†ñóçÎí·P_`"+Dħ½•µЏ=ŭÍ[˙çŝŝożyëĉĝΎµÚÖmŝ„’öÀ}óûß|Àâkß|â‰'z蓟|à‰Ÿ(íDġÄĉÓâê4⪗^Ïżŝë_|ċ™gž{½ă ~ĝ;·+w%’[çϝ={VfñYŞE0V–ƒħÂAüo]{ö›ĵzùp‡Î ùÛú>Iyğ]â;_ŝ&Ûĝŭ˙‰ï÷Ì3ż8ğÊâÁƒ÷1ÙÉeğ b׍›„²xĉ̉Ċ.ñż‰àYĈʍ5>óÍ˙í•ŝâ/~˙Í"oüĉíPúÒwó/=¤ñĥ—˙îK_úǞxBayU³Ô³²jüġ_ŝú—Ï=ó•gŝġç~X˘ˆ[^§"ħĝèÙs[Äíû‹bû÷Ĵˆg(ˆ˙ëµ˙ú˙‚‚ĝü£)‰}ç‰O~òv*°Qâ?go˙¤–òŒİŻyĠċ×ñ‹_ÚUQ|ôÂÔİËS—Ÿŝ*cñĜħGğ6ˆË gEñ{a"%ñŸÛ:´ÒpXžC[ĥUÎÒz™ĥżöµ/~½¸Hkċ—şşĤ.w:Ġµu‹jB‰âá3ç/^ż4>uùò‹äÖT×&ˆËÁX‘@ü–5ˆ”D[˙èöJğĝöĞ–żöĊ/>Sl5ÓĤa×ĠSğŽëÚ²EcËw‰âSç.P/ŒO]:³i†.ħŭÄó/,Aĵñï´ñöŠƒTöëÏ=óġ/~ñëÏĵ~ĥÄ5;ğžïÚ9~ñB×áz%·;sîü˙òßıiXÍËÇXùCÊĦ%ˆ”D+Ӓĝó"ž]uŝ˙1‚¸}{m ^ĵpëàÁ"%·>söÌÎ.#.cċĜĊLô¨ IDATËWŝçß§òÛW/_¤mƒëù0ñ†5ˆ7ìA4* C‘Gß|­ë_RĞyĠ%êG mkĴTÛRO™È*J" ']ÑĈJŬA,ï`J"€ 6Ä Ò ž-È çšÉ’NĵôƒAÚÄ[×A@JÈ­€x}¤„\AD@AD@AD@D@AD@AD@D@ADħ nXµŠŭscM×E? b@~DWhleV͵ZtkċìÙÊĞĉ-“[ˆÑžú+h)c%šm@ԝuëÖ%ŜÖÖİİŠAì:3oC Œ•ò@îЈیž˜œħge U³ˆ7 ryĞîcċrıÏo¨Í2ıûË*Ġˆ§.eÑëì7š*FŬ‹bKƒX+‡ĥŻĴR ×ÄN£e²ßè6óˆF;ÊñĴ>iSûëRÁà½Î#c_=AL.;::J‚x–¨Ñ ğC^b"-A7_5ˆéR;– ˆ‡ö ÊW0ˆŭÈ`Ĵd È Ĉ$}…ĉŠŽÊ— bIÎz—ˆe€X‡ÍÑ_V݆ê6íEX(ˆ2›Xr1 ³EGċÊħT§u­(qHì9loóù%”…"ş2ˆœA”çTÒUƒˆJÜivı€X²(sxžfƒ˜[ˆIûAwÙÔo˜GË Ê‹ ÓµqÎ8^1³l@,Ëjnq÷My U ˘} +F!ŭ†YAQꇎ£â¸ˆlu ÎŒĉëâĝĞ1‰Qĥ vPßĴYÑtÄ%VċŞ] o6€˜.€Ĝ=ÉO’K1UĞHğ)çêb@ĴÄ@Y ħ7\vŸKqYkŽüCú/SF}(Qˆù„éµ5ġ'o³ĠĜĉl†×â\#AĵĴ‘­ú•KA܆Ñb齜ûġ :—báĜüŝ`ÊFL: Np“…ƒ˜ĠÙ‹f ĉLŻĊÖ ĤĞq:mÓä(ç—]3›}Só£2Ú4‚Çg…Wd[… ĥd…˘Ħ@Cх˜bΔ1ğĞĝJ94aqZ¨ÖâĊl\ċü²kâÒŞb3iˆÙò@tôĝ­²ËÉہ8І³İÖ2‚H˙‰E’g£‰‰€J‚hwäŞ1´QĤf’uħĉÒ$Óĥyo)ċ·ŬíŞĜˆ4‘5T¨q§D7ûÂ%A4ñĊ°:2\P”Ú`)j2ezşç³Ġ•–ŻÏfx­Y§$hÄ2ÑmbXy›Ö Úö“-ځ( tÎ`bŽşT7óž•D‘éö†Jú˙˜/&—)Ş#5aC.MË6I(rmNU˘ßŻĉ'g´í˜Yħb›ħÍĜĞôóş:-Aħ1c"rd Ĉ܇ĥġes¨ ™ œĈ:/ktD<ŝuh@ŒyéW(2Zċ\Œ'şġ££ÚĤƒI_€XJF]v ŞnĥŞp£ĥ šĝŒ‘j! /É‚˘=zŭhó|ĥ™ ttĤë#5ÄiڈQ7sċÇ'Ġ8àƒè×:G…TA<[kiˆ176 o)ŞdzkmG³Ìš›Ġa‘êWˆá~„¤|mÚ#Âfç‰ 2ï3‚Ĝ­Ô×Èİk!7ë-ƒ£ à"96Ġ­šäH6DħĉÒ<­›4‚ÒôñèA̚ƒ˜6×SF;Z5z‹@Œl£ J*“ŻhîíA(6Wˆ)j>„Q.ˆôVCd›úCCš‘ˆlœvX˜Hóîçl⚵qQ‹×-zíH4D£´­ĠíħQA‹Ċ .äLM¨ğ¨ok6­í))²£³Ú>ˆÔÈĊ\>£€Ĝ½ĦáA˘i×\’èö(=D6CuNħMÌFĈHj!Ş{^óÎóì„D7‰htŻ[{ŒÔ%Ô<İVk?Gú0š) ˘—‚ΘúO #žsJ`DbÌÄlÁßkb¨Ÿà`6TAtöĦ´ o#ʁÈĵ„!‰ö8hU›‹ÍG²Ú \b%ç˜Ä’C:ŬĤ NL‡ n4*Z{Œ3ŜTĊĥԈ۰‘§„`ċ|´CóĤÖBDUOĈ†tzÊbĈÄ!/Áƒ‹Yĥ•Żßëìö˘`ÊĦqĈH÷œì% aÒ7qŭ´ĤÌӁi-ˆĴjĦé…!' …i’#YרÙЈŒhŭƒB5àÔ*"‰´fĉ'm%âħQn·gŭ´;“ 7QmşiœÈĊó*. v }‡"in¸s'Ŝ!}Ó5äŽ(úoÔċAú&n¨_cŜ&Œüce6;€è%éï-H2Ê%6™½Š€W;éÊ ê%şˆ%Uj£@äQŞĦ4Ñò)}ġß)û7Ä.œĥôí( .ž  jŒÁyĦ^ŒıŠ “H_Q·ZJ= ˜·qÀŸÇĦmLĉ9ˆ½BŽ‚ĜéÓĊF¤C×\żŒV_Úáô-‹!7вßHy]œÙŜA”ĦŞ~˜‚8AüdÎe[³úşŬ:ûr¨À…‘ĥħPîRìġĠˆ˘šJXjHu{Éß)›b?ŽZş+°ÂŜ€ÄYSĠöàp_w,!4¨4 “ó³V Ĉ3r#ŜK²m„û³ Âq§_òÎ+r.aô%™fFıŭ}ü&8 yb‰ÂĴ2O !Ò×ĞÓA˙bWŸ ”ŞÂϨ{˘ĝM ċüŽ^ˆÛò¨06„4UDÙK(5DUwQĠ¤Í1äµÑݰ—ԃ˜vdMŞfµŽ8˘£@"ÍŻtxôœi+#i‚‚c8(0³8Û?Ì­$ âĜf˙€Ö,O:r2›Ó™ÇÁH/ó•OöʙIŽ5qŽ ûLRëÛċÙúŽ`Ž8\N ˘ú32ӈ,£U&òäÚUàRúUĉ‚!MQ,҈Ml#yqÌÒo†öĵ!bA şL@Tƒ ….DAġ-KäïMXèŸ$hȇGz˜5²àeċéÇĘ /éDwO1âĠ‹ôÖú·ñŜC7‡ğsÌ^>!ĝè%Fq„˘În÷“ÁƒĵGhĊŠ f•ˆÂ˘_è@ܵ 1ˆ´öċÍJŜŠ 6Q#}v 3ÙÎ(QKşĉM@Œ+“y† >”QيU Ê×ï[èŽĉQ¨'|Ĵšœ÷3ñ1ê<Áw”ġN™E$4­*É`Otùwq%­Ç/še bç"=ÒŬ9ŠD§|ƒéE2â’ú;}TáҊÂf͌”ñ£ŝLRS5÷Ïc bFr– ­3ĥżİ ŠŞ‘R0AdÛDkĴ(†Œ¨~×\ceÀGK‚˜A ˘FS$úÒ&=+*’ƒcnİGOíĈ½8jbïH…é•0Ğ&g113T)wG0qÉQ Ĵáı™‚(ÛĤTOeħwhíòòžGIëI 2;Ÿ`ŬÙ¨;†PNo52C†‘´Ó ò§hĊŠ˜g1gé}AğŭɂDŜ™1!í@(]0§úCm³"ĥ˜û&€ħuŠ⠚£x¸¨ĤˆKEĝÄĵ´Î R’G„l¨_Q珖ĥ9R„}´0œ”A¤ òJ#bp ŞŸżvS`sAlË <䕂COĜ€H÷@ġEÔBІâj˙²â|Z3NIq…|RL…â@Ö9a˘cÑ?0šÈ AÊıwšÄ'èWÜÇ9èKçÑĵ+ĉCNé˜'d½\ß14JAtúg#lPżsĉçÉôLòó³ÌÚ˘šy[ÄP0–@b$‰BŽ…AŸ ]ˆ "ÓÁéË´Ċ˜B>鑅y4 IöĞÉŭÍħ=ûšqÈ+Y~fqւ "Ġ™ÄŜ°ZH‘1µyx›pRATŒ•”0xB20” éžÄ& Î0“Âsd?ĠP^’*CúUd–Hóîxg·E|HöE½I”“Š{Vȓa!Ž]È1€ÒÄ6ıĞ…Ŝ[ï?x~‘7£Î3FNĦPÊ+èLSħ3ƒ½r:ÓüFqâú%­¨#iä—@D)j: °6â|†ŝħrŭR”22Qâm,ÁA İċU#²ĵ䇇55a‡[éi "îyĉ½ÖóĴ&u$L@Ì™Ż`–UlYg`’ĘÊHĦaddÚò#yâù¨oRÈúR˙v–¸†$ ˘$½ğÈ.Äımq~ŝH*DA /Ċ²?§ĦHRšϳ+K­]îY쓉"Òï섰Ë*Ğ[Sà\9Ĉ‹d< Ä(o“`Ü& ĥRŽxfxԖˆÔd  öȅ”L…âÑD$•"³Ó)$à³Ŝiž”Ÿ`żÜâŜ†ƒˆÏÂ;Ş5p™'D ‘PĜpG:ıŻNQˆŽPû:•`c#§'F0Y¤–Ïdš„ƒOJšá87ÓíBijk )@Pq‘ßI,Í@Œı]N)”w`^1ÚĊJ!šf½Ŭŭ(€ŭıf ]Ċ£ìŽ(zg~g7ö+Îj b0ς…Y% „B$çbñnBXĞ ‡ ĞĈM–YİÄıAdbÎ!ÈĥIš Ú@;‘ÍòBŠÇ'£Cx2F&âI„úċŝĠĵÏ'ĊàäqԝU‚ÌFŸEİ“Y3ˆŒ:oòù™˙YâFpħf$‘5ġ…X„6CAVş‘fŝ@‰%H84èKJ :û§jÏSƒaħI!dY_`2÷яcN·{ïöÊ=8d`ŽÉ’80 c„œÁœÚ1Âü×DöbòôÎh3£¨'¨€8ĵAĵĥd·Q¤ÍAĴJ#Ü´jÜdáİÊAœ÷ ĉÓI'=°Ò7‹|h?žL°BšƒÉ!ó’p²ye³ˆv%=9lgï+ ²ŝ ë%ÂĴRNÌí'qÓéëaµ·"ӈñ0\ $Ùĝ’ä`³€C †I(ŒˆYäMlChaÍġF%ŬëdO“áÁk#17=Cĵ{sŒ‚!áŜX^Ş|Éŝ ŝcÉLóÇ( ç<mö,¨Ŝbžƒ˜ ;CĐç„" â‹ Ì1Í*ÂŬÍħÑAç;Ĝ*ĊKñUb†Íb6PDñĤzxž Żà‘IĉĵôœHP ÚC|ƒ —ÔoFAÌH †QĜM¤NêE<¸?ĉxtO:Ĝ5˘ f“(QĜ³ÏYeE8ʚf“a2öI &éy§q”Ċ^ ˆÙ¤CžĦŻĥ‘tíÊċP&C|NO֊Ëñp_/Ŭk²³{RšB9Œĝh{şK`Ú­ Ä #7r i•#bށ˜X ҍ> ˘Ë Ò;à‹ ÌgÏ;}BŬŽĉkÄ÷5o8SX•Tğ8i…‹BâÈĥ—+g:÷%\ÜŭÊÔ/ĝħk”i‹>jžĤğî£ĝMŽI(Ş*g$#ˆ‚x>€CŭÔPŽsGÊ-"22M<yÜ2IEeû^ĥ 1N!r"Eğx‘ĤiKuÖc†@T`Ğ_c(’àsğŽ ÷X£plÒǝ•ž6ß ϊ‡C9ċPâ*È5Ç ”a<Ûݝà"šëĤíàaäîö›€ˆ3!Ú<Œ´îւ8‡8 {î(– b­…l:ˆô×T‡û²ž,YDQĴ~Ù@\Ĥk\$È#`ìŽ1Ÿ m.öÎÒzŠZŒžD\Âo˙ II=hÈá‘:Ĵî˘Íğ$by×.4O ZÉe²óJÏĦb<ÌNâĊÌñ‘:˙¤_Đäs^¤jyÑgHÄ]1j(FĠ'Ɋ38$™£œLmĤ8Ĵ;g4ägÈĝĠFÄŭ™ŭá wÑ0Ĥ?Kz'PŻğWb ôÚsáYôSkF8ǽ’Î ŬĴ!ÀA twĥˆ5 zĜ´zġjqġĊWÍDÁŸĦġjÀ8)Xj„‚8*ġËI öްwìt 9ԉiµä‰Ä'%ü¨­›@\ĠEQgˆ ?á i~Ž'JÍ $É~ġşüäDĊ'èwCÔf÷ûŽŞN6î}ŜĊŸsÒëàmPeL?­šGsĴáì&†q9ÖñġġiA¤îêĦĈR"Ĉé>„Fe'4 nvRĤCväjĊòêàš‚¸t÷Íp_ERdN(š‹i41)ƒH_l`Ûĥ ìe.âEI!ŒI Ž* hAEFĜߔ†wħJŸDµcÒ1/0·JDžİQ`xD3[;d"ŸÇì˘½ŝBgYŠŽĉ~ 'µvâ´AI6ŠtŞXŜïÂ@œu'™éœÚ,{"•yŸ˘¨w8Ê@ÜÜIÌhÊ$\’^d Ò&‚[ٌ!!ƒIÁ3ÎF²ó÷Dú™qÍ+èVԈbAĴC{¤— úžgESàŒL' fúĵÌğÂ=Î(-d™—ĥúcIiÂ:fË"Ŝ3<ŒĜD…ˆf+seK$:g9ÑiÍܓÄoŸaÖrž\Ħš…ÍèBLı°MÀŝ³„ˆ½Ħ¨`PĤJ)Ŭ—dzpe¤eĴ”qŸIGżßÇ"W]Ó¸· f1ö+ fQ?ĠĠÑŜˆ<+Ëf‡<>Prâ -pĉĝ(Żö’†x—€X ˆQ "mĴr~AÂs 74ĝËMD?šG‹1b826eÙË">Ál„8‘ÚˆYZbl\qÓVŬdwŠ£K0ù0ÓÁl-R3˜¤z  05IÉĴn<\œÜ#`/–—„âÈbĴ'ORğ$šEóÊ<ÈJì~z3f“}ƒn󙇳9Ş1Ĥ‹0‘@5bÄ”µOq^:ax–Ÿgċ—4ácN•é̚ĉG$†˜‡B˙] =0i‹.ċ.Záip1ép* FSô÷3e„тԣŠ…@–­Áô#@·ġˆ˜Ÿ(ĈÇ2à`ĥùmDQ鵋5bK=D{˘ir›q…§h —tŒĈÓ ´qVà4’ %êAr§‰C™‘”ħ‚ˆ³a’˘„B î")!­üi<4‹Q~€‡ĞâbUëğc6,F1ïH65Äf(ÌşË͍UVPÙ”뉅:–)Íî ÉIˆ9µB/Ù?¤Ñé ĈI€™vîÜ,™Şˆ$ì˜×4m½éµ'Ĉr¨—5 "1ŸÏ³ÏÄì€"˘ü…çD™Ş‰ZYôŞùy(xĥŸ`9vƒż†ħݏžo [jĤu“nZtñòëÇ^Iğf„ĊˆaOxïê@|z…‘^<‰Ĝ$Ĵ DUĜ7êòGƒè§ÖR&jg…D‰ÑÑ>iı” ˘;ĤhVÑQ}ƒ;!„oĵ_‡ëïΐA$ÁŒ Jd"8šA|>ƒ Fd2JqÜe½L È zŭó`ĤħÚ;NU?é^VŒ—!v òšE|`C–y°pdĥ%AëôPs'Ĝ4ŝ´nîíĠÏ ĉ,­ö!ûg™²Ĉé Âñ K†QŭĠ_š­)„ÑŝÑ9³ËçŒ'5~ĜnyÎmİ#>ä ²Yġ0€X)ˆQ Ä@.?ÏĴÜB"żËhŽhëYM£+äÍ@txĵĴ~VĉDÇ$ĥ¨´”„f'˜÷Ž1kÚ9ž§6€t…Iż[Š}ÀşİZKéĈ‹ 66ƒÒ!›uG—}½/àïCA„g[Ñ,s¸żS0‡#Ŝ΄ ˘Ÿƒ8)Ħ‰ j\„D?†Şà+l=g#|žMÖm+ù\œˆ‰nË`yÒ%ıŽEÄƒÊŞPœ{FљÁsaM7ï‰GfıÙË[QfÂ$é-è–+ew ~ËûÊ47d=E=ñtÛ×ûÂ@-ş‹‘’h˜›=Ԇ´< co”ÍJÈÒBS5˘ÜĦ"êLŝÑÚÒÍqFQ²0²îČÏ2ĵNžçf(BeYj“H:4Ñ=ĦÄóàŻŬU͒KĤ‡'xĝŒ„ú°ìN,wUO.=›°?Ç Mo˘ÓD_ĜĊhS6è)šÊ81"hŬŠÁĴlù`<4AÌÌĥˆJ`Ñ6´ FLsO,`ı› ĉ£–“[É3Ä.°éà[]6Ÿ%éÈ74ì–M‚(‰F˘úéĤ‚r3pzRħÜ·%uA²vdĠ0U$~Òɍ•Ş'ÜİdoŻeċnŝƒ È·&ĜLŜ³­§[Äĝ¤â˘Ük<èVFÒ9;Şem€|É??ž ’‘¤?™ô÷[‚Ĝmîô‘=°(>WgÙ'qjPĝĝpU@̍M&F­§d7'4*·’½¨<‰EËkDħu4â¨ÄDwŻdÌşeŸ¤Ü%żìmà`”´ŒL£ÖnʘùĞ”›…ݨ<ż€XĒDâ WwÙ'q×!Ħ/Ŝ: &…Éx_•MÖÁšŠ6 DÑtŞŞÂFM¸ĥ2Èı) FSFû]Rl —}Şeïu$ZÄŠOÛŞ;6Ïş2g#MӈúšâœhÜE?ŝ´IíȌÄ9L&ä>‰]‘²O2˜­Aه+êi³Ì8b T­ż9ÌtÑz ‚Hkžk@ZÀ$)MÀ@üċ÷·Ġ† çb뀸 &P¨Ú‰Ğc[Q#’–1”Ñ‚žd!KAœĥ2 ë(|ë€H&½I˙D•DzˆíĊÁ–ÑP5‹­bp1â-|™–&·Ê”Ù.k!IڝŠU{,‹ĜÎ4DSó„bc°PŸnĠĤ€È%cZgĉÛ²ò~ÒËW2ÓUËĴ\ İħB‡v ¸op^ âdó–â,*Ïì[’]‚éÄÍ1€Xˆ|5 µvd“nRK:9›ŒhóÂlĠÇòhÇĤhŬPÁ˘öÍQ+s|^¤X20˜™ŒŻh šoS—,­â"ŸŽ&žÀ#éÑÄ ħzgRok‚ĜÚAú÷•#=â8>^Ù öTïL Ï´‹FĴM_sך5çLVZYˆÒHj²¤#e…/cYBÇĜüÊñÔĝĝÁ“µ§–"_´›MĜŸ à•Í!É,ñĝĉ+Íz8·ÚdĦ܀È×ÂKĈpÙkր´ˆM zĜ´Ċd}ҊV'5ĵ/> sâxÂÀR]AĴßê¤MzĜ×qħĈ òÉĤG0[ d‚hàÒA<¸öÂxĞĉN6ûG:‚Ië„íCĠÜêAÇÖ\àĈs-•ĉ› c’”ÚÄF=ĵuġÚµjë!!Öħ5?8 µ·FĴĦ½4÷MÚd‚ġ',ĝC€ĜTıä<İmA\AJK1 µŻF\Ş´ˆQݝAT,’Ò̙éÉÑNÄvħüJĜtçĤ€˜7}_( ˆ Ñ|hĊff·ıÑÊ Ĵ™kŒ„hÍ›€£ċ uŭ%Ĥ“Ċ|N÷Ĥ€¸h:ee8Zĉ Ú­rц™:˜oqHZJ#f Nȵ8ˆ­ç!ì°NRβuz?ˆòz˘YìCóAœë$ċŒùiTϊXѝ7ÄèU“DfÄ @L2ġ‘r&Ñnˆ„;4Ä„7ÔI’ħÖшmb2ÈÔGÊñGˆŞ$ ÎĤNRru+Qbİ”3A"€¨ÊÄ S'ÁqkÍ) ĈĦ[ıŬAԝqëÖ6Ġˆ£bۃ¨İ—/oĠ}ĴNšb bħÄV1šb–ˆí bYĞı‚Tb‘ vtt´5ˆá9 ĤNšÍ5D‰6qhˆİ“DB醁ĜÑ~ &ġo'¤ê%Ñ]Iˆ6fr˘Ò5Hu2Š&Ħh-ŝ€Ĝ‰£1°š­Ċ°Ĝ<€X7I h#Aĵ ‚˜J EDké#sŻ ˆ—5²U˙ħ*İ?ˆlNŬj bŭdbëFßĵŭĉc zµ?Ó€X7ÉğħöR3ßñ óÇÎxéÛñIF™İ}~0è`ê&ïZĉ ŭD.â3™")äĉqĥ''WρLĤ[Ş£µ²âAüĝ@ÌęĊ‘éœòF<ĵĤ “Œ&­£4Äcµ–ځĝĜàBÎWÜw˜ñz8˜éx ²´İ݆j.Uğ+5Äӈ†uVRŠuœP#qÎá Ïî'ŭ.j?'ŭKïf>uŞa 6îRµğNŻD+Oùċ‡ġŽIz/‡‰×ë'ı ÏôçH 8íĊïT'bJMĴkñE$M˜;‘÷ċC ş‰Q’ä!2œš ħÎWI*ĠRn0ıB@ÔNzjŠÊ·˙xêÒw/M}ùËSü]§çßŭò'.эS’|ûĝğSK—;§%ğTítiŞ˙ÒÔ/ùÛü‰/_úÄ'hòŬK_ŝ.Ŭò\’vĜ²ĵAܰšËÛ$yÇê·żííïxûÛ~ë·Vkä·Ŝĥ¤ŝòvZżE˙çŜñ6é-Š·½]ú~û²šA–ı´‹ħ ĥ„û@l‰žħ@Ĵżf<˙Öµkמ/^°ĵÖ²aĠ*ÍĠġrÒäĞïşÖĴé8·´§jëßV”sùBġğŜİsĞŠŻSŸËI—’ĴΗ?Ĝħ´§jëo=Ëċ%_¨Ž×“.¤żN.w^ b½ŸìÜê=U[€¨ñ'Öħj^³ċ˘|Ħz^ŸWz]îü*ġÁĈëŝd›ĥ,íİDċ·t-CĞ;ˆû:.äĜĤŻmùUÍJĤ—:¸öÂĝ ¨šäĜŜĦŝĈŠLG#Œ•ˆôÁê{İck.,ġİÀ}#×ÌkWoh€ûfĠ*‘yUá‘.%?X}/ġÖĠk×nX îphˆ "Ȋ‘ŝK˙?VëÈ`¤2Ì ˆ Mñ-›DVQY‘8QÍ=Y˜CYˆƒEGEG˙€A\^[Ž*{RCaĤ=dEd£HVĉ0xs6tƒ1|fJežVNŭTdPf—dfcJg­'“'ĞT>s){Ż-6HhTuiIp´YZ˙Pm³-™2ˆĵXpŞbr[r£proUt³YrÀ>ž9[yşE’uDšNfh˙›ÍyywÄg8žr™{)`xÖA£ES‘f~ıop˙~NHe…żO– p„§j…³Ulj…şr‚ıtu˙NİRu…Ż„†ƒcİzŻ2²€pŠÀZŞTa”Ê}~˙h£~n™Ĥ‡Ž˘`Ż`Œ~’ẪA’“jŻvB·À<ĥو‰˙hµk=Ĉˆ—™– ˙s¸oV•Hʒz­ŞŠŸÌâߒ’˙sğxcşÂ”˘Àˆ´lÀžr³Ûż}¤Ĥ£ÀĦxœ›˙‰ħÀ€†ş²JˆĤ‹ĊŠŞ”¤¤˙ŻĴhÔĞ­Àžğİ“ÈŽÉаoÑĉ–Ì—µ·´¸Ŭŝ#ŭĝĦϜ„Û´ŞÁŜ½żĵĦÒ¸¸˙ËÁ²²ÌĞÔ¨Ċ”ĜàĊÚĤÏçÔĴĜ²ÂÁ˙ğÙÑuáĊŭĥÚĥ­ŬÄÍÏËäÍİĠÁŬşÏÒŬÒÔÏÏ˙áÄĉĠğĜî×ÙÖıì×ÍċÉÙÙŝÍêĠíŜËàâŜĈìġŜß˙âäàĜë×íċçäéêçċéùèç˙áôèÛêìöċôçö÷ċ÷îġêùñéòŭöôèĝóñ÷óúùïĝû÷üùŝùŝ˙ŝ˙üHt)tRNS@ĉĜf IDATxÚìŬ `Ġ(úċnrßzĥĦ×4,…Ĵët7 !¤kšI>ž‰Ċ )A—…Ç&(‰ñŜ‡‰´›Ôa7^ MZ żÙÀ³€Eİë[anüœZĤ ı7QS\,6È"8jp&Żì£{ΙÏ3ú²d}ĝÈx<’F#ÍÏ˙ó1çœù³?C)BMiH–XŠŸù˜&šRžÎ'D1rüüùsçi˘)Ċ ˘:ž€ÄH×ısçúˆtŽ&šˆ¤ç#m]ñK,>{ölRûÎÒD“"éùˆs[qü³ĉġT"MÑbñn‹;sŽœiJij"Mi‡x˜O$ÄÂżd!ŝX^ÎUˆÇÔÔÔì9LéÍ"ú]ħ-aˆük…=ÌQˆO×î:~üĜ!JoFQڔdDTIž{éĊšW„µwĠÔzóìٚš·÷ÔĵòÚôÀۇjöĵ‚6½X#>L!’ı¨<Éa’eD•äıß!v<^SƒÔ:Ĉ˙;û^MÍɧkŜǛćçDŬlXâL#˘ZòÜKĜÖNž< œì!+ü;û³šWNÂĝWña QâLˈòçvDüŸ°şrö5÷xˆÒżkPz˙*>L!Ĥ£ÖL›o„2"$ö4•˙~& ÑŻâ´‘ĥ#Ĥ#½÷tÍ!Xk†Äjjş`ıMÓ5Żô˙…+˙0…H!Ĥħñ@+Ê{_yħĉñ‡kPµYȚñb*!“úbġ{4ѤHz>âŬ–Ä÷Èî;ô›§I%QÇGœÛƒHMiJ"Mıñ$M41Ċ ñM41Qˆ4Qˆ4ÑD!ÒD!ÒD…H…HM)…ÈOâ˙÷ŸdüHÄĝ…̓ÒğĊx[šĉDŬU=jQÑDEĴğ)ÏKišs#b`‹D£¤xŠbÁÛ #fD òˆü?İF Q 1bÀH˙GÑZ½'šĉ|1ˆê"Ŝ…d!FȗÒD#˘BDD7oVgÍuÖTlˆ4kĤµY󅸲fŬp˜Dċ&)Äxʈ"š§èƒ¨ÙMbôZ3ю(Ԑ5YsŒxŞSk íˆfÍsbJ€žš²"uHSÒ#ú—à´ùrÏJŝ4шHM"M"M4Qˆ4Qˆ"M"M˘"€Ĥt$iÊÑĴd(ño4ċEZGĤœ‚ßĵ•B̈äo"M™‚¨È“Ïä&D#ùƒĤı ñÀžšm›aZ·víŞUĊ #³‘J¤Uk¤ÚwßñÖÖU‘فH%ĉ Ä…İ‚(Ż‡ÏŸ]u@i"ĥH$’D*1O .\¸0%·) B‰kOHÄD$!C4"ĉą y‰İ…ÂkRbŭœÁ/áùE"3Hĉą ‰3†ĝÊğgϝ=ó‹0Lè×µ@)1Âğ“0FÄMŠß’‚HĉMDŝÍâ›ç>páü…?>wòs,qŬ9Ĉâ@›!Dšh­Y ñüÇCáÏÑĴÎ}ü1”¸î¤R"1Q†Bâ7 ‘Bœ Äó£9üùç²ÄÍkW­ZUĵdIDQ …H!Ĥ"ïWӅóçà†³gŽ;P³6Ä͚iÂÏ(RòßċĦ|{É 8 7?{²ëXMD7kk/Ê:t²íˆÑۄb<ĝ]Š$Ö>JĞPq@LQï\A<'D â…sgşÎœûӟ>9÷î+‘d²Ċ"˘ħDĦ\.HE€H|Íèr7âË#‰ĵu8‹qĤ ž?óĉóçϝ;wöÌħ7ß=˙ñ'ŸDƒ8ƒç%>Aj$ÎÖËH$˘-’aW-7ĉ;Pˆ³qĠĉÜlüOëÖ­míz÷˜>L?Äh1QÉ$ñÖK˘ŝ b…8‹×mÛí­[ğĥxíŞââ%K.\0˙ĴAŒ3"ĈÑz-"FbGDŬw gâÚu8-^RĵuŠ… ÄĦôCŒV[‰Î$Ħˆ˜Dgâ×עp¸ :,^…$/Y!òî‡0½ŸnˆÑâ!p¸ĉ‰(ëñµ^FÄì[S‰$òTâĴAKÖ]‡ĉ —ÀœyÛá7!÷ߟ…2bR­‡éMÚ|“ ˆ˙çÇañŞUhĉ̇Z_yó} ‘JœUˆ`! ‡8 ••‚ùÛ{ó}œ~šmgzİʵ#i| 1ıŜ7 ò&œ1€˜iÊgˆ `!˘ˆÒ‚‚ù›fâ˘E‹b½|ñtß %r€Š,Ò9*á7ò‡îcŞ·]ÄħÎç0ĝŒ:oÉgˆàò4âV—ç/¨‘ŝŝ÷ż˙陈‹¤“²(6ÍıMìñ9TY#ö²H~ÛE1Ó5èp$H>C„UXG)X°pÛ!)_ŝŭ\†H"H˘., 1*ÄâCÇZ£tLvĝÛßĤâ"!J,R~ċbf‹B 2wRm\$.É(&=EÌĊċ"@`‘6˙[Ò Q>á·EÊ ıh‘ú1ñ)â'Šä5ÄUÇŜìê:öÊ+Żĵİp˜nˆš`%˘”çyyşĊS²È@ù:ÒĠ"‚ĵ¨Ä ’Ÿ"Έ¸è½XñÛ"ˆ˜­ÄÔB\{üŬwß|÷MĦàpĥ!.Ò 8bÔR”°H‚R†Dı § QšüPĊbc£gO~üÉı?üŬbVAT=eFµ/0*ŞßXÛ"@!Ĥ²Œĝ&JŻé§RšUˆ‹@TˆÊĵ0nˆ‹Ĵ˘ ŝ5E••EšĞj8šğç˙ŬtYz++Şö İ!•ĜquBY~âÓĠ•ñ)ŠJù:j™/RWt[÷äŞDĴDŽƒP=ˆ—ĠÛ.šo)Ïkͳ™ ´hfI%&‘ǁlOâĴ\Y™ċ”ŭî²Ŝaf!Ft6Dâ}eĥ@Œr"Mı# <‘vz “ƒÈwaꑜŠnÒĠt‰íÈPù•"…¨…hÔ9Oı=˘7ٍf‡r 1ŞIŭD ‘BL"AI Ñ'™këA¤uRˆ ˆ†9rtˆò@à¤!R‰˘bDbBTJ"•H!DĈ"Ĝİˈ Ŝ2"ˆżŒH%RˆQ!’YsDq[kŽz“hµfêBԅ¨pmùŒÄ2"… b„˜€hf ‡mÒZ3…/DâÌÈvD 1DÂaÚĈšSˆbtˆ¤C ‘ĤLA$g¤iÊDU@ÌNˆ‘¤Rע˘üšè>ú–RÔ w9Qí0g"bdFݘÉŭfòòÈL_‘-‰Ĥb$˘žŝ7ŭSÓ|C!ĉ%D0‹%F]—lÈNyc„¸h.żLġQțVÄIF˘÷Ĝ˜½£Î˘ĈהwzP;œ•Ĵ9ŠDċIÖEÔOQ͚K¤îüÚògŽ$t Ŭëêé?êĵ…¨pvʈF£žR˘šŝ)Ĉ€âˆ ßcc֎:_!F21éˆf~JˆñÜccĥŽ:!jş#f´Œ˜h&‰yJ˚£EÄ8îħ1kGżeÄd[ÈÒUkŽèô‰hŞ’~„ îÄ-qµġ„HÜ7Ɉï‘Y>êü­5gb­ÙqA&’Gcž˘³bŝ]YÉFˆúïèEÒò)½7FvuĥCÌ@˘ò*bkF…H!Rˆ4QˆZˆtÌ …˜‘J¤gèlÉdÍT"…˜Òˆ’-#R‰bÜA+~*ÀqOX×ĝh!ož/żZ|˙J)D-DñT‹Oı]@¤°DĴÉÄ_ˆŒZ~™"uH!&‘0§…h€³•xµüZkĤu!ċÈ1 f ‘& Q QÓ!1&D˘–/Dô…H!ĈŽˆ‚@"ˆž5ƒx!ò˙(D 1~ˆdÖ,U• jÍ­ŞZ³˘ôd ‘BŒ ˘Â!™5'ßl˜ÚkÍ)˜3Aŭ²Ü˜éA÷•‘|…¨È˜g Q<δwzˆÌĝĠı1À^o‘<‡Ĝ"ÈŞNbŜA$FkÙI{§‡ÔΙQšUŒUÊ♢u5#S* ’gâ,Íô@6êx,šé!ÚQgDò·”@Tg âìÌô >Qn Ÿ˙edĤ‡hGU/ÈéL* ŞbvGD0óS ²|Ĥ‡hGÏĠ3ZFLíœ š×F@Ìôí¨óbD•1ÏÄٚéA]]Ŭ‹~e%ƒ3=D=êìİ5§ bëlFÄÄ[7èûlkI1D­C 1ğ!f˕•ÔBÔq˜QˆtĤ‡œıŸRˆ‘lƒH˜Ğ5Ŭ)Dš2ӎhĜC›B¤)ż!Ò1+b"ƒ§èL4ċ9D*‘B̒ÙÀ¨D 1SGN#"…˜mİC 1 R‡"C›& ‘B¤)Dš(D ‘BÌ=ˆD×ç8ž˜Ì3’›!Ŝż!Ŭğ½F(Ä܂÷ ‹ëìFtIE↌GáPˆıÒ|C!Rˆ³£ŒâÓ΄ -RM¤`|r#ŞQÀÄ$ ÒĜ¸NΠ ʓ³eœ …¨Îš£'@¸Ŝ$`u´ŒèĊ$3œœ!;”Sˆ‰AĵôÁİS\Jw1êûġĉZ0Èĥ“„˜èä ½·qF/8úì³GO²;"‚´GD0sˆ4"ÎâÏâôêtBŒ6Â>ıĴ9ŜˆI2kŽÄ„H³ĉ”Büà賂ÄpFjͲbQΧ[•0jɓö˘g(²_ŞÉtj7ŭ9!(Ä8!žzVLŻf¨A{ĉ'1_+˜Ĥ%QˆIB|öDŜBŒ6YB„:ÌĴĤ21ı™âxĠœœœ!§*+Ż>›.‰´Ó…˜@ó2$=E!Ҕ!ˆÊRâ³G? iÊD;ÄKé€HÇĴPˆñ\kVĈÄWÓ‘J¤êôpB)1œˆT"…WïeĠùÄd:ʈT"…Ǜ„•O…S‘:¤êH4'žJ9DêBŒ³clši­™BL˘‡v@وH-Dš(Äĝ‡ | ”8I!Ҕ!ˆä%–0…HS† ’͉—(Dš2‘lNĵD!Ҕ!ˆD#Ή0…HSf ‚!‘B¤)CAàhêĥ)D 1ù™&S×;‘B¤g0ċH0e͉"…8“ıoR֜H!Rˆ3š„)U͉"…8#ˆáİiN¤)ęMK—˘ĉD ‘Bœáüˆ—RҜH!Rˆ3¨óR*š)D qĈ3Ĉ^RVƒ"M™šşXÙ;ñÙI ‘ĤLÍĦ}jĈ=ĥ)D 1“ı͉ ‘BÌÄLĥ)D 1%··¸tbf8"…˜šûĴÌp°3…H!Ĥè†?á£3™Ċ“B¤SuçİIÄK"…˜İ[ =ĥ"…˜İ{ñ:štm ‘BLáM!O%ŬˆC!Rˆ)„>•ì,ž"…˜ÊÛäNžHrfc ‘BLéŭš‰Fœ"…˜ħ‡'לH!Rˆ)†x)İĉD ‘BL1Dr>مH!f"و )Ä A$nOgs"…H!Ĥ"Hĵ9‘B¤ӑ˜ĊóU ‘BÌDhs"…H!Ĥâd‚͉"…˜ˆdŸ°(D 1CÉ>a§(D 1CğÛ=…H!Ĥ bBwğ§)Ä´ALän÷"…˜>ˆ ÜížB¤Ó1ŝğŬSˆb:!Ĉ}·{ ‘BL'ĸ'€ )Ä´BŒ÷n÷"…˜^ˆqŜížB¤Ó 1ğŬSˆbş!Ĉu{* ‘BL;D²9q’B¤3‘hN<5I!Έ­Ù1v#…˜—[AvA$ïvŠBœ#ħĴ‚Hô“ĠkN¤ó"ï0ğ ’wğPˆs˘à0Ë Ĉ¸Û=…˜wħÖ샽9‘B¤••Ù‚µO…H++³1ZŸ0 ‘VVf b´{ŒSˆ´²2#|şü($D“2bdÉkoóéċ°ûŜ )ßÒÒ·“OŻ-‰¤bäiùÍŜQVŸĜħcÇnšò%Á³ıc&ß~ûéH:!b‡O‹é9ċ%–ŬÛ·ßŝ <ü›Ÿĥ¸/žIdqP\ğ÷`"‹ŭhħ.–×b7ı{ħ/t’üh<ğR½ı´À‡–Ĝg“ò—÷âù˜çèfĝĵí·ÜÎC|šHoÇż ILÄ%è Ĥ¤¤lNü—'nfûöí7?o´xFğ¸Ŭpq0ĉâ^ĵĜ/-öÂĊ=xħ[Z“ĠY<Ĵ·ĜÛU‹8ù ĵ½ŬĞcŻÑÚ^ññŸMúĵq|/†ßİŜ 0"Ħßw·œœ4zrôw$ŸâÀw'°żü…ñ_]"_ĥÎق^·lŬrûŝš³­@÷]>ÛFż‹˙}:‹ż‹ Ĉ˙E!ñıû˘9|&‡ßÜ/}Ë{E"ùĊv-ÁÛtĥŬıEZlUŠ<ĝĵìk\-!<ĝ<˙ûôô·…íüËĤQŬ{ߝh#żżíɆoŽ×Aê}l}ò÷‚ż°oìO£ŜÙÂqóöŭ[T? ŝ>ŞĜ6 Ñ;Ž ïùeĠù }‡ÏÄċP¸WġÂmò‚Œ}Ñw>Ì×ĥ,Ĥ§o“# "ڎżújüóÎûĝWLƒï~÷à£Û·ÂÒ^Ĥ§o‘Ŝ-öĦŬĤ äÒĵewÌŻä›?$#ŝ¤˘¨3{⧟ĈĊM³öŸRJ\ùÌ]wŬ ?Ï]w-…kèCÁµƒÄÚ7Ú7äµŭp ŝ=‹kğáÚ7wÇ·vÛ¸O˜¸ĥ­m½ö0\ğs+\ƒP¤µéé?Ÿ~ŭğï˙ùôè?ß÷ŝ4ĦÍ£_ûŒ>—°GÄ;áöĝ8Ü ÜÜvÛ-ÓӍžĵUùdá=Žóĝĥë|ĥD—o˘oòÒwŞúĈUçƒ_{ĉ.ì­a[U?UCÄÛTE³XFTÚ˙ıRâŭŽöƒty­òÉ×m‡ë·|;İ“3çxżo¨rh£ ŒŜ™‘ÏïpŻÄ â§"Ä evŭİây³Qücĝtżċż͉ WšUċì„Ş ‰ñžâ‡‰_ Wß#ü{ñóÉ“ĦÁMÓĝ'$zï}BÎ{Ÿúq¸¸ŝ­o-½úş{îT=Y~·„ ʋ¸1ĈYH\jXYyĉ>²²"Aœ˜–Û°‰ïJ*fâ§bšŜr£²9q;ß"ġ™ĥ~sżNÛYìö[vˆ‹Ä!˜-(o…˙ŝcú+ÒVaÓÓáŸ˙²9ĵŭaáħo lEÛżŭíoŭĦˆ¨xr|͉üÇñU_ÉĊï*î6Ċƒz§g‹Ôîğeë·ï—´Ġg;Ŝm釨|Gŝ-ŻSĈÄÇöû-ĝᵛñüĥÜ~P\CíUĝzżM½ĥ­íGk{ÑÚnqíĵĥ{ bË=Fk¨‰xË·ñÚ´ĥCgmûĊŒİB?à^›ßyĝ?À½À(÷‹éG˙mŝxŝaúŸ˙z ż?uğĝԄ~GûÛ˘xòvôä-zGpÏéĝ˘~ĵvËnñ“ß"}üÚ~éğ2ú&żA~7ÏÇÍÒ9ş·cóçMĵX¸ÔàlÇğ-í‰wäßré^esâ Q/#'w‘Y}i-+͉__B˜C˙^ûÓäËo‚·óڟĤAċß,ŭ~ĝµOÀè?_ŭ­ípûc2Dŝqt}ŭŽZOŝ >ùaôä{£_xŜír3˙+ùÉıúœÜ û<ĵŭŜg;Ŝmi†ĝöÓ ä½t÷½˙Bô <gïȋƒÄ"F˙“’‹ŭâÚò"z_²ÎĠW£ğῇïZzġ·nğúşw^}54uġĠ×=ĵaômKŻ^z3|.Üŝ]ĝ;Úĥûjôĝ÷ĝ½ mxMz2ü>y[œ=~t>Œâ£&Ò/ç;äÇ ¸]ìy·íŜ½ûŜƒKÎvĵÛÒ‘"áMKżw”7<?ÊwôÏh÷Ĉıĝ^”Ş_XìıĜ½W½€÷Fíş·WğˆĝEĵŝ ı&-âĝÖôñï<u!ì~İÑَw[!ŝ›AZúÌŜŬß'.ħìŬûç÷FYÜ+-÷L‹ƒÒBµMï)Òbâ‹ŭ{÷ñŬĞáÚáÚŜŬ{Ċ„×ĥ½û“Û³Îñİ?GôµDò—ċ¤ìG‹Ŭĝ×Ŭeğ÷.ŭ·ĤL@ÜÓÊĉħĉKş÷Ŝƒs.ĦÓı?›!ŝÀ -ŭO0Í[ŻlNĵü?єÛiéf˜Ò‘ÜmĞêm.İo Ôe_Q‹uüi~1M)Ié†(½‘pÊċw>GÜí^ Ğ—˘>ĤŜñ,ż˜ĤœÑ?ċ—ŭ“rĜ}.@\ğp-…˜ğ#‘ˆŜ)_pv•RâïR1Qż8rœĝ/Iˆ ?üp풵bnBÄcùÉS^ _pŻïż*%>—2ˆü/>ŝ Òï/ĵp<9ˆ_˙óp8üĦ)Ä\/#Bˆ ΝìêêÚĝOÊ{Œv1Äë˘CŒDH‰8"ġ#bAAAħ”à/šw^‹†Ÿ˙éC>,Rˆıñcˆ0n†iÏNċżS×WCĵ" ˘8Ħ ‰­ (àóÏ?˙JĊ55Şwŝú‡‚?}ĝ~„BÌ=ˆ‡?Ö@,>wrN۔}Žž•­] âŭ‘„ˈä‡6„xü9œŽRĵm›âZÑá'ŝžBÌĊĴKTzYxoĠ޳gğV­ÚLH”¨ŭà;Ñ Ĵ”Ä8#˘Ħ5-ÄŻ˙éóçĵ÷×Ò2bN–“§\p#‰ë”3Ö½zž—öâèÑ ŝjôŝHÒqJz÷ì)ŝÜ(".YRĵîOŝŭO˙Ž~ĝûËŝu 1ç++ ΃ÏĦ|î’¨Ĵ:Ÿ:NŭêĈ+"×]wĊBqPà-´Ĥ_ŭjJ–¨„!!F´qŜĵÖ}Ç[EŠjˆ|8„İxÛfÄUǏ­ú퇟 Ä˙çSˆ9_YYpöŞUǰpĝchòżĞ$^ñƒİÏ^~ôĦß|65ġÑÍN@üĠ(š´çß~óòg²D…ˆbDçí9{á³Ï~öÇÏöÌӃĝ'9"nV@\{üĜĥâŸŝö÷0~ĝŝûï˙>òżN³ĉ\ŻĴ,èk…ß ċΤD?ûċ£=ú›>úÍË7Żûo>ŭÍËPİB˘l)˘…!#âĵ=á?z筏‰Jˆ55Ċb<üäC%Ä%ǏµÛY )B…ż˙½)ÄÜĴ,X8Ï{çŸ˙èoŝĉŻÂŸÜ·yá‚ë½˙éqHíчŝîĦG_ŝÍËİ ~úòO^ŝÉ£ŝŬß=ôòoÄr˘´cŭiq‰ˆ8ïìäôägŭì­·ŜúLbÜޏY†áV˜x‹żŭ- ˆZYÉ‡Ê †ĝ7Ż|ĝÛ˙öWà35 /\ĝ"$ŝÓ÷Bkè ñŠÑ—áև#/˙òĦ€ÈGÄy­>›Äñ—o}Ô:O qŸ6óiħĝÂÇZ<|ĝ0oħ8òż#´ù&Ĵzï˙ŭÉïô£żùœ‡HJ|J|ô'?ùċO~ò¨âoĉŸ<ôÉa|Y3ee^ßgüìo½ġÜ[/ĵÖ;jˆ$uĵgϝ?wY—$Äĝ,A‰"…hpʉa÷'ÎbŠ^LS.@l•ÓĠïéueöżĥĈ‘âÜqş^LS.@üü\ÂéwG‰˜HSŜ§ÏgâıÄÓëJ‰?ï£)ßÓı,…Ĝ÷şâ³ŻÓE!fbßϕ8ôDQˆ™‚ĜGܞŠĈD 1SİD 1; ’Ó“E!f")‘ž, 1Sûˆ†mzĥ(ÄLAì£Í‰bV@$ĥéé˘3ħïçT"…˜ i……B̈„DZaĦ3‘J¤³"mÄĦ³"шC%RˆƒĜ÷,mN¤³"íH!fD²w"•H!f "íF!fDÚ'ŒB̈ô …˜‰ĉD*‘BÌDڜH!Ĥâ’yóm‡úúŽ-,(>.ŭ•H›)Ät@<Ԋ żìX߁‚âšµ›R"z'ÒŞ3…˜ŽĴı GĂÖ=Ċ}}—ï;ĵPú!'˘9‘ĈD 1m_6~W_×e0[ž'ŝ0Ĵ:S‰bÚ"âĦÍĊ:…™„ WÎl|yMY—6çD‘ž&k^p@/wN¸góĉ”üùÒŬ§µkó""ÎkíÛĥP§²² KÚ§rf ρ)ùXt7Ĉi[ŽCœ7/‚p,hĠiQ@ÊùdOÑSO!Îfƒĥâ%Äèݧ3·§JHâɓ)ùXt7"N($ŭ”EiNAċ 0.ѳO!f"ĝ@)1LO?…˜!ˆD#ÎĞôôSˆ™‚H4✠çŸBÌę4'ÒD!Ĥâ%e#Îï¨ 1C‰F)ČAĝİD 1Sòn÷G…˜!ˆdLœ¤ (Ä A$šÒ†m 1SÉĉD)ÄLA ͉4&Rˆ‚HöN¤Ug 1SA ;%)Ĝ„(Ìô·nAÁ’C4³²w"G!ĉ$D~Ĥ‡Íc‹>xJ'wVV3‰äBŞ•BÌéQ|]ĝípÒh‰Ŝ‰™mÄq„Ä5–BÌéqÍĞ –èÍô"ѰÑÛbž@ŒèÛĵDâşDŬC4'fP˘É?—!ž„'iIždÍF3=ĀH4âœÈ\î\î£óbñámK­ĴhqNPˆ4kN˘0ÓCג‚Çlщ‰§(D 1Ɉ˜tƒĥÔrr4 ú„•ûÂnĝï˘ç,D̂>a˘BœÉŜ‰ê KÄĞŻžÎD3üáj˘ç0Dr°3وóÁĞ0ç>úê釈öÖRˆs˘qsbP0šî˜H!RˆQ›'ÔdŽŝnV şÌşâhĜœxb–š1DϤ b¨—˙ÉQˆs"9wâİÌ@ìWA :)Äı‘è&Ïâùê,MĜTî›dAcÈMBôĠó?Y qî@$ú„={)Kƒî*×D!Î=ˆdsb@ñ…H!ÎD²9‘—xt–B ="…@XÛ°Yˆƒ✄.iĉ“=šÜí0’…C  ˘—BœƒɆm$Qú%˜ ˆ>ßrC!Î5ˆDŸ0TAÑT£gb=q2L!Î)ˆ`’ĵ)´ÎD–‡èöQˆs "y‰E/ H7Äñ¨]bŽÌôWú’* mNTöĜÎ0Ärb}/…˜3=ôm[…~&>x*Fvĥ@4ğ(ĜĊwl!ȜàL HÌ0Ä*7…˜—F?žé!n‰G3 ÑC!ĉDĝ) Ĉ`oNd";W!ĉÏûUóçϏÌ?žĝLFéĠLdÍbîgÍÂϔTVPşôj6DD?͚smĤb*šo ÂàİÙ1è¤çŜµĉNĵzTŻġ&U UV½âœê}£Ğ0…ıÄ!z)Ä9ñ҉gŸM3DSâñ8 q.Aüà¨!ÄT Ya !ŽéA,lC4Qˆsâİg³ "Œˆa…H!Ĥ|âÄd!ÒĴ™fÍ)^›FD 1ùJóÑÔMóN!Rˆ I<úêĞ'N.…ÁNú u(D 1íS§°żt”BóQˆù;T ½‰ž€1Ä@bƒN ‘BL˘ŝ0¨r_H˘CĴ5‚è³Qˆb²íŽÄ NöBt›)D 1Yˆ—2ˆ. ‘BL>"Z)D 1 Ú˘@ô§˘?L!Rˆ†ÉJ˘3aˆò=w)D QŸGTˆċzÇ£@ĴĠ'.H!Î:DaĤ‡â‚‚…ÇR5T =İџjˆ½sò2LžÌôp ŻoÛžJC2ùf ˘‡BœŭĴYĊ××:?U3=ä:D³›BÌ ÄUkS6ÓCŽ@t@lìĤ3qÛÂİ›é!İ<6DŸÎ´tÎúD!69r a> °ŻY; S@4Žˆġ‘BÌÄ=]}}Ù]Y‰ Ñ4ˆ\‡˜Y³0Óeó,X˜ŬÍ7IB‹ ‘£iƒvj!Şî³ÂC4.#6ò?-ı^F¤³â ħ*Du·o …H!%_,ˆÁèġÚ¨ğ vPˆ˘Aâb@ –Ĥ˘B¤ Rc²C¸²B!Rˆ3HAıdÇ †u²f/…H!Ĥ€aĜ玢7 ˆˆV ‘BT¤Žq§] Ñ"Ÿ5‡SÑF!RˆŠr\1PJ‚ÈEƒèĤ)Ĕ'6•Ŭ @丐B¤%{c B4 bÎA!Î6D.aˆá„!ú,"…˜Msâş§ÖÖü€š5ˆ!uD,Ÿ›‰=[7CZwòd^Bô "|˜SAôÏUˆätfñkâé …¨…h6€8“"…7Ä0†Ž ќ D4u‡Y Q qa[ÉE^C Ş ˘›™M& 1˘4:(Dą Ĉ„Ĝ $‡ %…™È1Ù1T qˆƒZˆÑ!BƒĤI ‘€È;ŒQp˘8L˘0Ó9j*;O•* B,&Ÿ×œˆċ:}sâÂ8 Ĉ0ÑĴ™ĊGŽ#͎™4Q߈Uˆllˆb‚‘w˘;L "9²>Kfz€Ëy8"šbAtBtQˆ)+# /Dw˜bˆ`_´%qRiʃ³ĉúĵ‡˜Şö‰ÔšSŜ|#kÎ(D2"Ĉ„èĠ‡8b£DӜ†x!s³²²!ŽbÓXÎĊmaĤ‡llQCô"ˆ AĴŠ Ñl§eˆgiùkâ)_´Ëŭ2şP,ˆîd!69BZˆ´÷ í}£„hMbCĴgÒñBŞS~FÄÁä 6&Ñ;G!Ĥ<ċ'D_Lˆ½$D7qœB¤q&}2:\Œâ¸>ÄZ]ˆMbBÌ}ˆ=³b·1D>"Â}@ ÷Rˆ9ħm8; šcAìFİ.ÄqûƒĜšê4k+‡f ".#–'Ña ħIŠˆúCĉ91’ò4[‹Ò÷Ġš41&DgŠ zL"˙¸S(œûĠ)‡jÍiƒԇ8f5€èO)Ä*ñ]NĝVáüƒ£ZN@<Ĥï5àJ ˘Ë_ž9tçÄHDÄtAôrÀ4H@ĴŠ â˜ÄħèaĤÎNmîÄ!âA†ğ(ÄL@,LWe·ş"!zM˘CĴObX˘Ŭi6‚èŒ ‘nÉJìı W8G>‡ĉ Oŝ÷ù˜ĝü9 1D@4ƒÒ€£)Dż˘aѸġnĞf ŠéˆiɳTHŒÏ7ÎÄá´A W˘Ó˘C'!v`ˆ¨&&eJ"kÌ7 JħD¤Hš'5ÓFÄr5D§Cäêĉ›RÀ&ħ4˙!F41_ʈf=ˆĦYhœŞüĴ†”1Dˆì\„É}ˆa·D·×b­.D†h ĊȚ5{ıZà 6ŭá\†‘*)rD¨›(++bE&"=–••°žñÚD ö ƒúë£@ôi şĴµÀíók úİħ0èC cˆ“dNw ÎĠˆg+MʚoĥÒYÉÄÉZ ѓ8ÄF˘˘›,D·Ĝ]6 D/‚èÓ­{”ûោXŻê)aóÁ:9…g:~ÙħÚA|‚8΢Ĵ91ˆ>ˆŝލ'-ú›V Ä 1Ìú9 qÌĴ*½†Ùq²y(Ï Fğ˜pD,híÛSĴ֜!ˆcb= Ñ˘§[ħ<>ˆcDOc#„Èj ZÄò€n‘BDŬÉTMꨧd˜#Ħç_DLė͟ߝè!ĉût@ôMbˆcġîLAôÖ7‚Fˆħ4⸠˘'Ì†Ò 1Uì³ Ó, n.NbQ :B<ÄĈD!V%хè3ó}„)Ÿ7*Dߤ.D“gBËUˆ³|­Y°—x֜ŽNÖ`Ġ>ƒèč D{TˆzĤ&ˆîĝ ޳f1ȆrĵqÖ"âĵÖm “¨Ĵ¤bıO˘+.ˆċ)€*·€Ĉn5D‹36ÄI2â849 qÖ;=((XšDóM!†]2ĂèID"bq–p½S ‘íĈY}ˆ&b­ ˘AĴ÷Mêġ{ĉѕÙ++iƒĜ[jÒ@ĴŠ ‘˜tĜU˘E 1€Ûû8ÀZĴÄ&”ù–ƒúÑĴbZˆ16`ñŽéġ–àt›Ĉsbf;=¤˘I€héĠLbo|MDgP€È • ÑĴ£R+ t!bˆ¸UáÛ¸ŜĞ ‘ˈîôˆ°D˜ ÄúhakԃĜĦh÷ m†CAo"kKC>ğS"š@4!Fò˘Ë²8µ•ójëAlò•‡g‘„hׅXİùJn]ˆ^q · "*÷Bd³bÎtzHÇ(>Ó ÑJBĴM°‚ !šT}bİ1Ä1‹}P ħŜ>Éö"ˆ“*ˆa¸­Ñâ˜Doİğ£;˜›gûZsvAôò95DwŠ!Ú5ëˆvэ Žk1Är^cˆNÖċpè˘s˘C†è‡{ñX¨d ÂĴı;~ˆaAˆ–ԁèeá˙†Cˆġò^}ˆĝ/^CLi§‡ì‚@ƒĥ”A,Ñj÷j!û8ë)M"šŜ.¤İĴXjĴӉĈèCtûò "ĉ7D{-Dglˆ!РߍE ю!şÍ^ ÄIїDŽs[NğŜ´ĝvvgvCŒÄ—ç5ÄÄò8!&ħCwaˆ“ÄÚr#ˆĤ„ ş8GŻ]˜;B ÑbϽˆ™[;ì Cì°xµ­˘#ŽˆràĦ-¨‹u„hµ¨!šEˆ“Q 5ív—Ŭd6€hSħ?}6˘ Ê3€Ĝ(AĴJbÀL@ä8/ÑAGu˜(ƒÎZUµ„z;ìn[İÎè>|_ Ğ-ËہŞÏƒ|ŭNQYÉĝLéK„Ú ÓšÄA#ˆĥ(èÚµ”5ûK1ÄħcúÇpĞNĠ¸1DV›‡c r\vGD•¸˘ˆYÒé!=ѵfіvˆÄr˘A4ğt!VAĴò„uhQNÎĞ 1”;Alˆ™íô°,~v A´Ĝ9.AĴw˘ħP—ĝğ1Dğ b}lˆœ ÑgÂCbHbŞu•W šu!ÑuhˆŬNĞ1İ|Ë܆˜áNĈ'’‡hR@ĴK˘Bô˜IˆĤƒ ˆƒ&Ó Ĥl Ñivq€].Aìïï šÂ+t!r"ÄrCˆSÒ5ó0Ĵ§¸aÎlÑow–{VbyiŻqœ ‹(#ÚAü˜!ÖêÈ!ˆÚP²$"AĴ” žĤPĴÓИ(Ĉç÷ġİj˘Ï]ëZ<Œ!ùLm+N#ˆ1D ‚X !6K9_ü;p !ú›xˆ§{ˆ^Ñe AĴEí•J1kžD½8Ñ˙Ĉ‚#b€mt4ċ2Äl‰ˆm…FK$ˆĈ×üfÚĝè8\tƒÑìZ9ŒÇ" ˆ +:œğ&xˆŞ5`ˆ,‚h_<)’osÈ;t!Ž{ßÀ†82ÄN%D7‘3‚XjvpF{ ˆ,°Zay’u°Ù Qìô èÊ!ş9¤¸1Yˆ› !2Äêcˆ%=Š^üzó€âîy‹ .[ŜñÜ#]„!–²;f*1ȚIˆÎÇn@;ĈĦÉEˆeDO‚h3‚XŻ€hf"DNqœíĉ(ÄôBĴĉ/5ÇħH ħ¨At6úÜUîċ§q݊˘Ó>SáòÇïżŝ4‘ İ!îjd€Ġ’Rb3–Èwŭ *~Rùüéi5D<ÊŬy÷ò#¨†Á­ÁN˘Ç :íú;œV‹ĉ Ö mVD×Wş•C,Œá9 1ŝ Ŝg b‘D†żÂWdq"FDdšM˘BôTy–àÌ[€xÍġ<ÄÒ âúZöÒòFxRżò)`ê&ˆMâê Sáġˆ6óab¨Š€xë•G:ùn3½· Ÿ— Nr6Î+@ôé•}ŽnŽë° n\1ÉOƒşöJ†á!²ĞĞ Ä˘öĉbËÏED3‚x2b÷ŬÌ>ĤC|êÊ} ‘]!A´Û8ŸAtèA4ñí"-ÛÇ ˆöĤp'C,ç.ħƒBLĢ2ġĤ:,­Ÿ)ê°•é@ĵșc zN3~ M€Ĝ vÁóAWû7W–:Íà…_]|ۚ§ ĝb9Ó?Ì·ƒİ2Ĉ€ċĞÄĠ"Ä~X@dЇE„¸‚))dú›;qö,Ü/‹‡¸ïİë yˆŽğ™Ì& ñ â 2DŽóuB„Ys7†Ĝ‹û’Aˆü8<§|‘½ÑçëUBìĈíÙ 1˘;Ġƒj•ĵQÑ][äPTÖ @â}³ÖéBœ¨Ô@œh.a˜Jŝ ^]ƒ°}5"ò= qĊŒ2½\ĴìdÊdˆU?ĵñ‰›V?f+éì/l­kŝġcÜĈû!Ľ‹·°,ğĴCìaÚ!DAlbÙr"Ü^H„ IDATĜ Ÿ´„kaÖĵĉkâ>ĤİcPİ”ż²8ÁmĵAĵADÇeż›YÙÀŒ@ˆÌUO@ˆĥ{7ĝwPB˘Ŭ ÑëBğ½"Œò"½Ïɑŭb·Ŭm2Ùl“Ygpİ9‰Zó’y}:#bBdêFTö0ÄQħ·WÔĠu^œ˜˜Â yˆ§[ÊP–>ÊlBú ‡w ġ3uDnƒğ‰ MOÜşâVÖ.ĥ4ì@7°wĴ~dñâfùĜ’6$ŞĴâ!²Ğ-,ê’zÍŻZê@e×ö¤eA\ŭ5ĥŜ^²Ĉ]TÈT˘ú:nGŸnà*î~A,ĵaïé" qC3ĵL3Wı Ä#×ĴTBìˆ Rµ;ˆ^/†(Ü 2àìĥĝğJˆ½ğËTe³SˆrÚĥj^ŸÎĜİ8 6Ğ:ccˆ[ Äşax§šëê*{†z†0D´£ê2ÓPÂßpa%zvagïúÂ!D‡žk!ÄŻÜ͕u¸Ÿĥê!Ä5×CˆX\„ –µÀzÎDYġ2fä* ħAt"ˆĠu Ĵ¨d,ğ´òo`ÍöĥĵÍE |C(CœŞóo(ĵáÁjħŽ9ÒÌ Ĵ„Ħú˽‹WBˆ7j vdžè—ö<> ‘oĠá€Ótȝ`Eˆ+—Íġ{7$pSûD![ˆ2kG“Ĉ€8UÉÔ-#!ÂÈë.#mbsIÏT{%,–µ´ŸĈÛÜrˆžƒ¸v /‚Ĝóëû‹†eˆk×\cyêÖ+7qÍb{ċ•"{ğ~ġ•;+›!Ä6$ytq%[¸‘-]meÙQ0uӎÂXŻ„U¤‘k׏×#ˆkL&{˙îĥʲe ÓĈ_™` ÄŻzıŠkî(ıáÊ˘ħáú‹:WÀ‡çĵCôéBtëCtÛQo/˘›€3gÑ:€èrt¸Ŝ²9"Îv§‡%‡ğ¤ġÊñġ1ĜOTÂŞÂԐbÊû†Ûà Ż+kŞL”µ•ô ‹fŞ]—)İ+C ˙jċDeÄq}•Ĥkšžşµp×9!žîÜtċ!ò[żúKû62\++âDQaÉĤ˘Éšyˆ6–½&nş –;Ë4ĉâµâšĠâTm/8]Y£b 5AĵġĞŜ·íjıáJC,âú—µl€e†@÷Çâ„ĜáĈö\~ qLì‘ël ::85AˆŽ^Tġ›ñéžŭöiêô˙š’‚8ZÍTNœfC ŞaÙ uÂPU͔µCs›fY[ Üpu|`ŠĤáyf•ÂMĠ¨î[Äl\ŜY š›ûaŽ9… ²/Ŭͧ\XfşŞëzÊ0Ärv={ċ>s„XÙ̌6£=WÙv‚x„eG@Ï­WÁjJ3n´œ¸vùx#ŠˆĞÍ&Ċ@O{ Tĥá*·ĝÁŻz+*ž¨˙B„5.[Cêš7ÀRï?8Väž$!˘Û !UÑ!öÚyˆÎ Qì‘ël uĜí":Ÿı–su`ˆŽPBLÓµĉUóçϏÌ?žpÖ|ħŽÙT42À(úÔ5  ñéÎĥ¢JfSÛEĤ°¤¨¨¨½¤³Z€¸lžglÂ+Q‰eÌĈ• 0‡oië£âòÒÇw~s×S·2 öI4ô¤g C,e÷Aˆ\ъ›XöKbž@“ğ5#ˆO²ì0¨ġËEÍ`¨×İk—Ÿ†W>Ĥ܆ohrqd`ŞrS[eÉ(jZçéĞŜ•Ï5Nı l mh€G˜ŸuTl€Çû}7è@ôèCôà-$Đ qÌn“ùjá3ÎÔ@̧N]ÉTVF˜²’á~ĤMħ]½ëïéŻ,ƒ5†ĥĤş¤¨­¨½ıpàâ3Á@#Ì24ÀiúKŭmhBˆME—WC½mPPË„xéûĤÇw=uUт8QÙ<|ú*˘µôÊ#\áâÛXöW ôÌ£9<ÙÇ DöqħżäÖÛPñw6›vy%„¸ĝ;,œ4kzh]5|Yç„ĝĊġż^\álœ4_Yˆk€všoŬK½~û¸ŠonPCĴç!z˘Aô`ˆ ħ~ÜÎ9Ċq¨>X:tÛğ³b:=t%Ó|3Ü̔lèaäiŠOCˆ%h$'hZV]ÔÜÏ4×ġ÷63͝Ë:‡ÄĦ t5„ċíÎQfÜzĠĈċ› ŜvKЇ ÄÓûÖ?uUÉ‚JJ.N}y.#ZKoBïgÙ@„XɔLĦiqJŸß!~Ÿe‡ê˜ğ7 kŠ|ŸkW|ѲzĊCğ8Ñ*ö_ĴІ1ĵn¸A|A7oÙT74ÁĠA;mwCˆÍÎ!n€ħbB ÑĞ Ññ³{1DXáĝ ,ÄÚI%D‚èD{si§‡™6h·0›ú;››ÛJ Ğpz˘²­ĦrSag;.i`*O·´Ġ1£LġĤÎ>"Ž,LœúĤk+V”U"ˆ (jƒ7­Ÿ½ú§l¸FYT8ˆû‚ĝâ×X3\ŬŒz£y6ß@!ÏÓELϓò@˜ Ûµz9j; ˆ`Ù0sdñ7BˆŬâ uíŭûšĦÇîCíA ‚ĝ8‚(ÎPŠ цFßÛˆ“$Ä^-D[ŽC̞NC-L[{O{‘|işs §p¨§Orş³„)£ÍĠLáh?Ĵĥ\„ÁħzYI¨›CĞ}´´WWĴ(B—[ Ä:ħB|`ĊSWĥQÏ= ÑĈî²pE‹ŭ×#ˆm S<Ä BüË0L‘†Ċ,ßùĈúĠ_d@şó3g/êĥTBˆÌ³Fğ-Ŝ‰ >×Y×ÜPÑ íL€AۙíMTN!ˆÍe%â†ĝԗ:nìEƒz­V DèdÙrn‚Ï7ùêDäü=KY/ûĜòĠŭ›àé—çÓÙxÄżb ̆;` 6l“ÂÑÄ‚8!î8òċ#˘t-Çvĵ[–1=ÀìÜPQÑôċ/mĴÇiñQ˟ͧ3 gwaˆĞÏĤ€è' z”½7şríògyDœŬNÉAìdÀDsóD]ޞˆQwÙ)KIġ´XħQĵn„!˘ûQaˆ>-Ä^ Ñkчè6£ĤFb“Ŭ 8›!Îz§‡d!˘+t› –‹…›dˆ em€ĵħêî2ÔYŞ ‡ĤŞA5̸–m‡:Ğï÷—ìčAĠmĠÍ"XŭËVlĝâ0àëéNğ°lĜšppŝé­k+Ğ£ Ü †;a-I‘Ŭµf“°öÊ×C* aPd–Wĵˆ!ZBHš™#ĝĊÇŞK@Uïʍ/Ż|¤bgÉs ˆœCt™ĵZˆN"§„èQB”~ó˘›xѽѳ:"Îv§‡$!öô£> °ZÙ6ÂwkĈ5Öá˘~@’D]˘GZ`D„Gñd-LuĦF‹Ñá²ïëŽOk+|ŝnÖ+L^ ñ"*şŬŽ*bİÑ2ÒY"ĥ‡0D+èiŻìWCĴżĦYXĊS‹Í `6­Üù3n эtً{İĴ…×<0ÜZħŻ™U@t„6ŸĞÊ£Ñoµ!ˆ%DI?,ÊÂş ˆƒv45|vCk$ħÍéĊÉلˆĈ&’<§ùÁy•#*ˆhüĉTeƒ0é *tġVwVáÓÒäX›€§çK/ġ ˆċ qJ†èpšDÑ úċ¸v ÑĤFІĠÍ7ˆCGċ\ġĵ™bŠ*+Žüš{A 6Ħ‡ˆÎ7Z`A˘ÊĊš¸kkĊ‘çEˆŬhhv/Îï2ğ !6•=DİêâÑs°Ŝ—ŭτuŸÎ!Z0DŜŽ¨d[ċZ] Àî[Wp?>J°_›á!6: !և”ÍR=A Šê˘ŻÖg£Sñ4„7ÑW†l­‡‡ĝNXg…mD4f7?tDÂ3ġ@)š_€ĝ˜˘Ë8Dż Œ ¨íAKı׊ˤÓS*ˆfÛ³,ĝÖfRˆf˜ hÁ!vˈchÇUî#ĵ~ër޽ƒÇtJ½–-Änbí˜˘ÔÎ5ĦiŞ‚ ˆf?×_0˜ċ툪 â=sĠ=!2 ħw´žÀ"QŸ˘­7HBÄ -L§êċBŝ&Cly¨\€¸rċ°h(At›€‹>ĥœ‡¨à/ݵÚż‹]ŞWkq ĦËk‘ŻĥĦŬ^‚!ÚĝáÛŞMžGàGŝ`•ŬRC öZí^ DGŬ–ÊkWB,)!†K…çĈ˘7""q½Dï"‹ŝœî³ħMĵ­OÏÀĤÊB’ż QonŞĠ>ğr ˆA (>–Ŭ°2ÄOgS„Dˆ6DЉUÜYzÄâÌ.Q߸„ìòxıžMuÌ‚èBâDĵ+“·A|}™½ß݁WíŞÁw\‡#`ĞÂJˆMâùDÀ:Ğ‚VG@Œv—‹Ù‚(Ŝèìtg]r&ÌŻÊ²&›vĜxó„j_<°+!šíÂxˆc ˆvo9şß§A Ğ!ZjË·Žħ¸*ı~âcòoŭËZ4A´[üVôšQ˜o5yQ „hiüžO˘úÚ „´À‡À) JG+ÇMÁĵƒ¨WFœċˆĜ"Ŝƒt¸­a ½`ş…Ÿ”Ód³ÚµO]ˆV˘ż*hƒ-쑝ˆšİB´Ğ :ÊIGL^Žhî ›äùކKÚD/ŞĥÚ­~+ŠÍ‹":WÚÄĊv÷ŻDVċ‡stÑ`SDôÇ(C,*/˘ßÄßt7³ĉYŽˆÍÂÔ7£ ÍS§;F&ĝ;r†ŭDÎe0N ߔ°VD³Ż6`~;kGdˆƒbŻD·ÇĞÑìâĴDïçÒZe{ †h²s6XyFYDÈÈûëĊˆ[ħ›³²N5D;Ÿ!D;‚ÈYĝıŭbMK‹ ³b„è~­ĵŻEDż£vf ÖM myS•-0*–ġÔĦAkáI›Xä{'ëOfPÏC´( Ö{} 4`;Ĵ“DÔvl÷áÌwĵ BœTCD“ôë@lìĉÈ{ ÔZÂĵˆ £Ôii² •ù+q‹xŒ/Ê{%ˆ!WËÚµQß” ‡s…°t4˜×ۀ×Çûu ›K˜ˆ+!DŜN€‡h³bˆ,§…ˆ³fÄIyX3‡ñ-a†X>†î*„.ĝô:)D>èëÛĥPgĝT,ˆbÚÔ&šĞ›ëzkĊŒÜC‚ ,26Ùeˆ“l­˘ÛêqòÑĴ˘ VáÎĤrG’szèB´ĞĴĠ6ÂC4ƒ*Öîµ£Òjı™ÌšqGê ħ›‡èġ˘Sb“ â¸úû:˘ÈUÙRŬ€Z(Ĝ*òœƒ°ĊŞ”",'m3ġò_PojCŬ<ÄŜ˘4Ÿ Ö,èê›AÖ\7ŒfmżĜÏqnĞ…8ça˜?9íUx†s!BYLġJˆž`w­ĠÙáAgĊ&<ž?AGİyˆïÜ<èÜI ÖlUÇĞêú'v8°ğğ¸r£€Èòım2D7†(…l6ĝUsÖpNk(4n·ĝ9bˆ¤ÛM­B!Áj‡Ínk˜£‘fÍ|ÚS…+ÏÉVVÚGñ-Ĥœ>Î#Îy…ş½Ĝƒ¨ %D(S)_§Ĉe&Ü.ƒOŬ˜;[[ê²{oÓüâ󈊜\HBĊ·wŒK=ûT…bYcï$rŽRĠCŞçJ]èŠô8şħGWàsÙ%ˆ>bB wxaÙ!¨‚8,púƒJˆDQ_ÒäC­3hAĞ<Ä^1Ô ´{5C,ü?#ĞŻ½Ż ħnúyYáZÜmO8\¸^îo5Ĵ•k&J@Żáê­ÀŞéD-Tlù*Ĵ¨;…Ÿjˆ¨h+Bôàˆ6^Ċ˙­™‚d#4窇…ÓŽ ˘0!˜”PaW¨GCˆĝ·eä8żğ n£S1èÚ`1O‹WÙĵ‡+öÏs-“N!Œi "bA³ mGµÚ0†¨¨ [ ŬAmŝĥıu3;µĦĦħÛĉq áR 50J1¤°Í†€ 9TQAÀ˘A”Ájr„Y€n-èwħö °Ofąı ÑSş/ì•Ż1K×ĥll*ôÖâC'”pô”!pïìNY¨›,7¤z†•#šê W=èÍËÇu †şU­BWÁ`·| D+ÜĜÀÇMŸ³ÂÉß´Ì9N\l†öÍD’D ßD…ƒx#üğ›Bl Ë]€³â… s˘ƒµŬŝÈĉĵ1ëN ‹êż8dz%ˆµĝò—²Ç Âá3ù²iÚb'ІšPó9ĴXŸÄ1²ƒ?'–#ĴH(ŝPCĴ… !T;ô !Ü=o’€8nwWİ!Âj§½°ÉáÖ§p½A Ú!DtmqĈ¤"ï0g!Ú­dg/áĝkY§0àœ+`ı\•Á°IsüVŝj†"ÄÁšLˆĞò*E;›ËI@Ôx ô˘â^İS"i'l7 eĈ0ÊfñĠMÀZŽĜÑrŻ×N@KÁÖ%—bß$L£-˙˘Ğ !³è/3d·ĝ]èÚâŒG¤ â‡hS÷Xĉż{K“Ċêàû(²AS żŞÊ†ˆk>mXnsĠ×zAıâ^ÈE´ÚXu ‚ıĊĤWüWn {œÒ| ˘ĜӇ€ˆŝlÚn[T:,:^[~—Ú ‹“n, JV3.óˆ°“vKÀ…-ú]4"Ĥ"§{ÎĴ×ÇMáĈJ}S ˘Ş£Û+Cìë“êl–Ğmò†ÍʋuJˆ!Íp:ˆ >èħĈ‚lô²Aù5^ħnoSCìyŽsÀ?‡˜yö–ë|bŸÇ”ßĊÂĠÛ[­¨{^ žŒ޸ÙATpÔ†­´Œ˜4D|>oTˆV3ê]Í7˙™Üġ‰ìttXm˘(ŒÀ§‡>3s&‡ĉîÚâhàM!?ló9‚B•<D/;^:)Aô[…š‘}ûQkû@¨ŠcĴĝNVç{|r‹Ħ5äàLNéĉSêˆÍšĝŞ@Sy:'MÎRŬBkÍñBÄمżä1Ğî9G}¤ƒ8TpĤFĞŬ/4ğ 6 ‡CÄE3Ü3èĠ+ÔÁSZ_4„¨sĤ-ˆO­/D§ Xä(j KBWö£jöP'B1&QژIç­Š’‰îç`y}  ³xĝ öîAĝÓ zh;b²GDĦ£a“şŒ…ñ‰•j0\ݳF?µClÄÍx¸ĈÔ^€J€œ%dòi ŠOփ8$ğAèCìpɽuÇê{A7˙˘y4´á1ĞrÓOİÎ[+˙=hq`Ħsl•rp_-*Hkkôb/ĥˆ×­€Ş+îÒâ#NWêsÂò>ß&‡ÎĥŬÂ÷xŠaÑĞw;n˜ƒAbLJLˆQîÌĴħaqcPSešBw+†„´; }.~ĉĝ@oX˘E˜^›ĦMĵƒİ5 žQ¤uäŻI´B”†'£9D„šgıĤL|"ìMĦIİ„ ˘Ábñ£uëCDD&⃨<ñbn‹ öj^U=8×`”M’­ñ0ßT5z‹ßŒpá7 áá²bĉ{ß$qŞE\³ıµ-tĝ nâ‚n‡|VQ—;áĈ|>ÄñWĜ\âӛ×ÁÏhÖ@œ)Ä1ċKCnL§¤Ĝ,Ĉ;óŒ;ˆ"˘ÔÖ8ĉP]”>”Y§#Ĵ-˜qˆİOé„8"ŬUŬ;4:ĈµWq+ÖⴕË_.êqíoâ'(Â9™1,Ĉ7½éġ}½œ|™VŻ#MÒ~˘Ç†Ô£B§ݨ Ĝ9ÙœċšĈg/ŝë ôê…ÓëÔı¤ÓB!&Q˜ İ—é0£qòZDĥÑҨ虊n 2ñ“XÂS4&Bä$Vş7ÂY ’—7€8Ĥ/˜kÒİ2–nŻñÎà7àQG>7ß?§[îµëĠè& QŒ;ĈNL€~ĤV_h´ŭt)kÒaní_³—m,­²mÓ°Îáĉ„Ğk˘¨F JùœÒĤÓԍöv$tĥäyúĦ…Ġİ2UW×dˆoUP·ÂdÑżpç6ëÖ§²âžT§B”‡ üĊkÓÄDžĊÂĥMĞ·ûËîz 7 ħcí˜ ?ëĴċDZ'O‚Pġ„+Àa6ä°tp¨—ĴĜÀ tï í +NìɓÊĤn|u$ħ+c|Ÿ1´ƒ|jvkKŞ-uş5ñ]'…è70ÄêßşÂKŒb–>Î<Ä,‹ˆòàİ%*‡”·§r ĦzÍÍi~ákû*Ž[›ĈµÁ,dġÉ-ÔgF(ò&։&èaFœi›™IDAT'ĥ+›Ŝ‰ ĥ‰ğbÇA6ħħ|=pÀÚh0MЃëĠ†Ê‹uşÏ½ƒ?TÙ7˜¨ċtÏĞûĦüv0N!*“r8鍯 ·3á=>òàĈşêÊĉŜ¸3È}n üîBzÇá`XV$~ÙÖnby­Ty8àçûĤŽC’áĜġDŝÙNSbĈĝÊ=„h|ĈuïZ˘Ġ¸éÒdҕ5fĦz]šG)Db—e˘Mp3TruŸ^˙ŭ{ħrSÙÄŻž°[`Ĵ*ˆ$~Ùâä vğ Ĝ`ÍĊŜÈopv;ìÖD <Ħ’%Ñ>+hĵ–oÏ’]/ÏË'C*ˆ6Ğ5ZC4WšÀwƒŜܔ|vžgÍ Xv­ßpäµç<~Ó×{m߃Ż=³ŝ}OîğñúŻżtòäIËɸÒĉÍÂÊ#üϗúNé3í:²kżá#ğ^70½ Á“'M/Á·\³Ĉĝ­Žĵ¤³ñï~íäÉ×Ŝ¸{ÓkoŸ|üÛxëšġˆŸH7íJäğAïĞïuÜqt€/ÁCé;ù:ü˙ġ8v³6!ʕ•%ó/ż|ŝĠñ—yùàyĊŸÏŸ_P…Ëç_ŝ—ó“J_(×/Ÿ˙…ù3H_ĝB2Żż<ú‹.×ŬzġFé/ŝü?‹é/g‰ŭŝ—'~t_@ŸK/Ċzéş<„¨ĵ‡=My²"M"…H…H…˜gVXìşlÁ‚Ç´ê$’–Ì›§8¤wĊïF8 äw£;s²ğ™ñÑĴZP°à &G ÊĠç¤ ÎSî$ı}j§ŬGâğâw#Pòğѝá9ÙŬÌĝh ¸3<˜(7(΢fÒĊ$vBî#‰]u)!Î䈴3<'ğ›TM͒Ln@T\bI2k.X{\; m‚ˆ}$³+a7è€úftDšžg°›MׂyóÍ`ĉÄ]}Ç×gDŝ€f$H;sÒğù?íŬ=nÂ0€a:0°ufÈ8'è]8KÀÌĜ-wİ)'`‚ÈÀ`İóñ<Ż*u³,ë)İ­6lêU5 ˆ™ĉÓ.cúBĉ~B¤ŜY‘8QÍ=Y˜CYˆƒEGEG˙€A\^[Ž+{R)|[CaĤ=dEd£HVĉ0xs6sƒJežVNŭ2|iTd™T)Pe—HfĞdfc'“'²S?sœLiŻ){Ż-6Hh-—+Ip´YZ˙Pm³ˆ-š5XpŞbr[r£proUt³YrÀ>ž9[yşDšNfh˙›ÍyzwK“tÄg™{)`xÖA£ERf~ıop˙~NHTke…żq…¨o„³k…şr‚ıT—tu˙a¤NİRu…Ż„†ƒzŻpŠÀZŞTa”Ê}~˙Z^‡Ž˘Œ~’ẪA’“g²blŻxB·À<ĥو‰˙hµk—™– ˙Ĵs¸oŠŸÌâߒ’˙sğx}­ŞcşÂ”˘Àr³Ûż}¸ Œ¤Ĥ£ÀĦxƒĵ’œ›˙”´‘‰ħÀ€†ş²J™¸ŸŽÀ–‹ĊФ¤˙ŻĴĞ­ÀĈ§Â˜“ÈŽoÑĉ–Ì—µ·´¸Ŭŝ#ŭĝĦϜŞÁŜ½żĵĦÒ¸¸˙ËÁ²ĞÔ¨Ċ”Ĝà²ĊÛĤÏçÙĵÍĴĜ²ŻÒÖÂÁ˙ğÙÑuĊŭĥÚĥÍÏËäÍİĠÁŬşÌÌ˙ÏÒŬÒÔÁáĠ×ÓĉĠğĜîÓÔ˙ËÇĜÚÖÍċÉÚÜÚÙÙŝÍèÒíŜËàâŜĈìġŜß˙âäàĜë×îñċçäéêçċéùèç˙áôèÛêìöċôçö÷îġêùñéòŭöôèĝóñ÷óúùïùû÷üùŝùŝ˙ŝ˙üÇ#ÛtRNS@ĉĜf IDATxÚìŬ|Ġ(úÍŬäóžçóyé55K!$Ż1îŜlSR^kȤ ‰ùS–D–:N› 0Î}˜8Nşë×ŞÙ8­ċ÷†gQPŬúƒßV6‹+çZFĦí ÷F)NQĜcŒq½xeŸyçœù£ùsF˙,ɒrNËd4I#Í׿ógÎ9óOM)H_â‹Î~BMIOg‹â˘È÷}üñĊi˘)É ˘ê‹C"ßóÁĊ‹ƒŞt‘&šT‰ä#–môÄ.ħèŭ÷ßT‡ÔÁ÷i˘I‘H>bÜV{ĈĴ{=•HS$‡ĜGĴÛbΜùó"M݃x>fˆïSˆ4%ñ¤ÔOŠ˙‰Žâ†xò“ò …ĝnGCUUĠ‘“”Ŝ" ˘ÇŠmqC^+• ñŬUìéëëhĤôċM FDä+/½\ġ3aċüÛÍUUÍož?_UġÛ#UŻż˙;ŝ·ÍUG^˙ŭŞŞ—Ğ„§)Dm.*î';L ˘Vò•—~TġŽħçt_U‚ĜÜ!üwŝŬŞŞÓ?ŞzožÂ ³aÄĊFD­ä+/Anïż˙ÇÓ§Oż˙ŝ§ˆï| üwŝĠŞŸ~FFĝüyü4…H„¸Ĝ2bĝŻìˆĝ?`uċ<̌›ˆò/WĦô³ó 4…˜šZ3meÄÎÀIž×@„ñĵ6ħĜóWÄÛ)ĄjÍꡅ ĠUUġÀrá›JˆÉ×û^ÇĊ§)D 1•íˆ m(kŝÙË8GĊ?žĴ‚Ġf)kŝ™\ĊĤ“ñbŬ3ÄwQRwßy—&šT‰ä#ĈmñA¤‰Ĥ% ‘Ĥì‚xš&šR˜b†x‰&šR˜(Dš(Dšh˘i˘i˘‰B¤‰B¤‰Ĥ¤BĤ΁˙â˙ż7ŜÉ`ü oüB^÷¤üiQ>–Ĥ+"q•D-"šˆˆ‰›ĝX^JÓ‘—‰’bĊ’ÇÛ #&/…Ĉ?|ĝ˙B<Ĥ)D%DŜ0€İıü?D^˙jí;ÑtĊ—¨-â]J"Ż~)M4"*DÄĵY›5óÚĴ9"¨èiÖL!ê³ĉK1eÍÄpDċ&)ÄXʈ—xŬ.Äb|uo@…ıÖĴjGkÈşĴ9J<%Ԛ/ÉoD³ĉ+bR€žš2"uHSÂyò%8}^‰ż”&i˘‰B¤‰B¤‰& ‘& ‘B¤‰B¤‰BÔB¤ó”ŠD#"MYš5ƒ%JÂó€ĤœHÛÔ)Ğ Âo£s˘ú…HÓRATäÉg³˘ˆQŭMW2Ć#UöÀ´mëÖM›Š ĝô@¤)D Ä*ıö=Ĝ×ÓÖĥ‰OD*1g $ bx=ôñùM JÑ}<ŸD*1G $âD(qëé†xLq˘1÷ “ „ĥDŭŸˆÁç~<żˆÔan@,(%.âëï|pñƒ³˙‚ =Ü ”yÁŒ‘—6)%‘:̙ˆ(ŝ·Hˆo^üäҏ/}òÉĊÓ_`‰Û.*%òŠ˙½EB¤‰Öš•?ŝäè/ôşƒĠĊO>·VJTAäye(T=˘)ÄĊ@üĝ”#‡ĝ",qÏÖM›6­ĉuġĦPˆb2 …0]úĝ"ÜÁَ†Ş­‘ ò4kĤ C<ĞH‰C|Gˆ‡áÛK^úy¸éN÷tTñÄĴY޽(ë‰ĥ#Fnв‡ñ§=ĊÇ×>JĞP1@LRï\žO Óñ"Δ!/Âĵù/^üàüَ7ßùĝ“O?q)ĈK|˘T>ĈÖKžçġ@uĜĠʍú bú nÚS…;€mƒ˙Òĥm[ÛzŜùĤS1RLT2‰żġR‘ü‚¨Ÿ@!Ĥâĥ ½m[·mŬTTT´ş `ċŠ“iƒcDŒĦġ2RDä£GDâ'Pˆéƒ¸uށ[ĦÁ­¸Sìê‚ĵ<ñCè0ġ#ĠV"3‰+"&‘FÄ´BüĉVĦż˘˘MHbÑê•âëï|Ó{݆)â‡k<ŻĴCÄÖzÉKÙ· ÂÇó TbÚ ‚Ġ[·neˆ+œìy2|ï½4”j=LmâióÍR@ü?p~\„ n‚Ğ(gnn{ŭÍ÷(D*1­AĴĦà€¸ WVòVhŝٛïáôóLƒ¸ˆÖKMͧ(ÄÄzßĴ,ÀqB3ˆ™ ‘Ĥ\†ò EœVĉ­ĜÓ|Rr¸W­ZíċĞTğƒĜ^°*žTĵ`á¨ÄGêˆÏi>v•pĄïa Áç2DżċĦ°şĵbeUóI1cŝŝó˙œˆĞ䓲*:Ŭıïħ9ÔXS½ËŞÇŠòÑh”ŻCà¨ú•ĝ\†Ğ,°Ž’·²à@³œ/˙áJ†¨F(D", 1"ĢĉŽĥ“(ŭ,ì÷żO1ÄUb”XüÉÌ?…êÜI³q•´TG1y)?”–Ğ€úĞôùß*Zˆáƒ­RÍUĞ´ÏIğH߈Ïiˆ›:Ŝìééxŭġ×ßT8L5D]°’ QÊóĵJ}şS²Ê@„úujWĞTä@ĊQŭ-bŒˆĞéĊŠGĞ1SK‰É…¸µïwŜ|çM‘Ħè0ŬW‘޵%Ĵx ŞA)Cb¸ § QşüPĊ˘c£OòéĊ?üċbFAÔì²(ˆúµLÂĥ PˆÉ,#Â`ĝĉëbúıœÒ qˆQ™Ĉ qUœ€5´“TYYûşš†£+âŠ˙LLËR[YÑ´oÈ5ıĎĞÊòğÔx(o”v×VV¤]•ġëĠu^ĵJ[y ĥî…ĞўBóP½h>vŭJ9^kNg2hŽĦ™%ħ–˜xž_2=Qˆiı²’ĉ”ùî2ŜáÒBä ĝX_™)c¸œHSĥED>Ži§ 11ˆBf Éİè&ÍkĤKäġ#Cݤ)D=D£ÎyÊí8uÇn4ÌJ5ZûdvoڜjN+DrÇ쁨nDŠ<è*C+-9Ó -Ŝ|VŬr ÊNšx§hë“ŝyD]4³?èfzàuÏŬAòVċçĊQsëz 1‰_–×_‹aD²öìiÏkĝJ1jĈ² o‚×>gÔ󂰁'^İä#ÄGòM 1ieNꐘˆšJQYô]ÔÁˆWĈ;…@]¤×áEwŭ 22wÎıˆÈ';"‚èÄ4ñ%nN½ħFDĊE£8H#bjʈ$ˆ|,s4Cä#÷a0ìHÓ.‘ğU Ŝ3R?Œʈ;QDÎԚĊމŞÖyŽq£ĤZĞ+ò šÎÜşúŒzeNîÎkŞLrGpƒĈ>ĠWQĠ€”ï +&¨˙ş~´Öœŝmzá%[…H…˜rˆWê´ bĤEDš(D ‘& ‘& 1ŭéŬI)Dzżfš(Dz{ 1kfz ‰B¤‘&ZF¤‰B¤µfšĜ2"M"…H…H!Rˆ"M"…H!Rˆ4Qˆ"…H!ÒD!Rˆ"…H…H!Rˆ"M"…H!Rˆ4Qˆ"…H!ÒD!Rˆ"…H…H!ÒD!ÒD!Rˆ4Qˆ4e2Ä6 ‘Ĥ €Ĝ(Dš–"vH!Ҵć"MK QtH!Ò´¤ħCZYĦ‰VV(D ‘VVh˘• ‘&ZYĦ‰VV(Dšhe…&ZYĦi˘•šhe…B¤)ÖÊ …HS&TV2"OMQSÊ!òĞ_û­>­}ƒĤœKk›xzm5ŸZˆüˆŸğö ”Ӕ+ ÎĊ@üíoħ"vĝ#U >tâàÁƒw˙–#-îċâYœÖ:â¸ĵ8ûkxqX½}ñ^RĝÙXŜJóáòšâ˜ÇñU?N̋£ž£[à~ïuµ‡öYâÇ÷îŬ‹żyá´Ĝ'.n‘×^œˆ¸8_ÜvlŸpJ”kßĊ‹'ԋƒq,ًûÄB¤‚ĝ„jġkŸĜùí5G%ñ7:f°ŝV†żé ê5ÂéAçí¸O‰½÷ŜĥÖàlÇşí·éƒĝ™ qïmÇ÷˘/úÈ#Ğ'¤Ċ·#/ŽË‹gáâÖŞĊm1,žP-î/ÂĊw#.îŬğĠ‹G……Ŭ(z|~äÜáexçȟ†(||Š?Ç"üàLñûEüçƒtĥ }{ï<Öàlmß’jÛÔ÷ñŸâ÷ñ‘}? 1‡/DÄx\µ¸ġ¸ü+“ñġï lğwŻĵP:ñâ0’Âá…:öE^Üğ_0"­í#,„¨wô…Öv#xğÑĉµ×îF˙â'îE8ż˙ŭŬın”ßjaá6ùÓ˘Úš@.ÁÛGŭIn}–$:Ü-˜ÏĞ!~öY Qڔˆ¨ħżvúÂ_ċûvŻ}a÷}÷ᵿ9ÖNĴ}û8\ûöq¸vkxí0\ğġplkw<×îxB^;ˆÖF_Û×îŬ×îŬ'ŻA0/ħ úo÷?üñ‹…İÜŭŜO£ÍSïFàvżö˜zñ>q;|ĵ°_Şàó]ıï>¸íŽÛŠu*w?cŒÇwŬâù]n=úuñšáYÖ^¸o·tŜvcˆŸi!âmˆ’‰4–5ö×ÂżXì}ݵ °@_T·8Z܊Çî~ÇĜOÈ xêù‹ĥĜGX@ğ³vüî_ÁŻîDÈŝeáŝñ í\‹ĥŬ'>ß>Ŝ÷Ż o]ĞÛù҇ÇxàŠŻúDôßċ˜zíYô;?ĞŝÙO,ÄóĥÉE!xío#e˜ĉ’GÄİϤOœ#"Î9}b÷îŬƒ \ìFk‹ÒâÛxñĴ´¸ŻFk1.`̐]Àx(-A!ï†Żpvï½ß˙{ñ`„ƒ›ż>ÇAîßnĝĈ?,|ôq;~~·ĝü#è]`ƒ.ŻWîüƒpŭĥï&t|Â׊ç×~şgUżé·Ğ~q“‚ÎÛZáĵ!‡Çg?“ Î*³ëÏû˘ôÇÙĴ5%ˆÚw'Z>ċ CòB[H<bżjËsÌâ/1÷o¸2"ü÷ÀÂF‰>sŻJÛw+žÇ…Dü³öÚo÷]ñyĝûöï~÷ğŭPDTì[s˘pà1|AÍOòĴô[ĊҜxBߜ(.öŠ-À·Àµŭw7hkÏvĴÛRQù‰³Ê++¨q~ßŭrûŭ^üġÚ-x Q½ó„´†ÚĞġa›bí8Z;.ŻCk‡5t6ö>txŻpbïFk¨‰xïwñÚhí ÂÚÁ½нR…ŝ żm<¸˙?ÀC(÷Ż O}mŝĈ˙ĝׅüê^a;Ŝġ ĝü^Ԅ£÷CB˙UÜù Úy/éxB>ˆßŻŬvXúĉ·Éż†°Ĥù­żé·Ġżĝ-'¤óq‹|ŽnÁíĜÂy“ÎċZƒ³ëĥ”CT}˘ ñĦŞ‹šw&¸ˆġÒ2Z< /Wšż,.Ä0‡ŝ{íÏsŻĵ Ŝzµ?/<ŽÊ}ż[ûüôkŸ‚İĵö;áö§…çÑġeô'´wŝîĵíüPä ÏÇ"]n7ĝ âżĉy!ĵŭZkpĥcŬ–bˆżŭÑUIèôpĝĦ‡~Pî߁ĈĜ#äÁâ„j˙ɳêĊqimxı/Œşεע˙˙öß·öÚïÜqíWŸ¸wíµÔµ×~c˙ûÑÓwĴ½ví-p_¸ŭû1ÚvĝZôü„wAۚĵ3|w>c—QĴˆcñ ú‡áÜ)ġĵÛàı|èÄZ£³ëĥB>D•Ĥµ?˘Ċ‹/$ĝ^œš‡‘Çc[>Ĥ]@ˆÇ"vŬ;Ĥ_Äúi1ŭ ê5y‘èÏŭÁ·_ktĥcŬ–Bˆ˙fÖpì1ôÓ{Ċcxq,ĉĊ^ˆ{qB^hĥ‘v‘ÇZo|˙Z¸ö,zxĝ˜”Ŝvì¸ĵsܟĦ=ÈâY‹gÓİ8އ gžËck˙m‘i) ӉÜK>xâ KâıÌdˆ?4Hk˙M9—Öŝp‘)…ĠoÛícÚ}nQoĵĝӔ””jˆò‰§ÜĝHÚ}nQoĵĝӔ5yò)çùlƒ¸µ`+…˜½y,NwÊW~P´2EĠÄыù>Ġ˙„Xá‡[Wo³"ËŻ>ċEñʋƒƒEĞSQĝ@Ġ‹û~úSùñOڗÄo~ĝE(úPŽ‹bĥ—!ĕO÷ôô-7Äö cˆßˆ ‘çĠqDTA$GÄĵĵĵ"9ÁşOŜІB_üùC!,RˆÙñD÷ÀtdÛ lW]e ñ*>DiBuDT}ibDÌkh(à‹/ĝ3JEUUyšOŝĉ‡˘?ĝO!fēŸè ]<½ §ᘨÂvĠ7"A|˜ğŒ¨ŝ҆û^ÂİïÓ˘´·J?ŭb6fÍX˘ÒKÁĊÁM›z>ĝ gÓĤ=²D%ĥĞ~ĝ`$ˆŻ(%Ĉ1Ĉˆ(†ChMñ›ŝ"ô…཭´Œ˜•eēêS.: …Äm’DĥĞ^žş9Ä_O=Ì'—£D‚xäHÑFqġê˘m~úïŝwä?,ûĉ7)ÄĴŻĴĴĵĜ^DùÜE…Ä0ĥĞ^ž˙ġÍWñßĝĈUW‰ĊAñıï -0ŭú×óa‰Jˆĵ"ŻˆË—·ġ öµIµ…pSс= ˆ›ú:6ŭŝO…â˙ù?)ÄĴŻĴĴüàäĤMĜa(ôI‡,Q†xĠç?ċİÇ~÷ùüüG·ü ⯧¤=˙öğW>KTXâµymD\~äƒKŸŝêŸ>?²\ħŞèÏሸGqk_ǁ˘Ÿ˙ŝ0~ĝŜ{ïŭ˙żI³ĉlŻĴĴlƒß ‰éĵ%ˆ0~ŝЧ{êw}ôğWnVAüĈ÷ÑÔï^J–x=D^— ˙ôÑÛo}$JTBĴ‚Ċxĝé‡JˆĞû:Ú:ö[!E¨"…˜Ŭ•••+Žĵûqè‹żŭÛżŝĞŸ î)Xİ,]ġCHíİÇ{ìİW~÷ÊcˆŸ½ò“W~òÔS÷w½ò;İœ(ż1yZ\UD\ŝÁÜÂÜç½úÖ[o}N€XnG܆ȃPOL‚Ċß˙DžVVrĦ²‚!ŝíÏ>üŭßŝĝälUŞBòŸn~ê'ÈácŭôĤ†xĠÔ+p+|ĉħÇ^ùĠS7ÇQˆˆËÛ.}>‡#âŻŜú¨mıâ!íÒ6 bÑO´xòäIÁb˙?yÚ|“••KyÍï~úݟŝáŸŝ鯿Aĵô—7?%>ġ“Ÿüê'?yJ ñwxóOû‰ì0ĥĴY¸²²|ó?}ŝ§·Ŝz魟ŝô­·µĠ ·É·~pñ‹#‹ÍÍÍm[ù˘mŞx 1ûŻĴâ‡?˙§˙!ÛĴ%>ġĞŸ<öĜÍ0m\Іx3N)ĈVY5/? áG0_ŝĠOú˘œ5+ n:{öüğç?x˙"²Ĝp¤ŞĦıˆB́++Ä7˙鿓=ìÌÄ IDAT!"‰?ıùŞżÄIĠ|s•Û^ġ”ÂalÍ7BŻ›ċƒ=ożúöso=÷˙˜‹.]<öô`QssQ"ßÜszôÙÓgß}÷dñHUsÑ& 1ĴoJüğ5‘´ŸR8Œ­A[ĴĞ´Á|Ĉ˙ĝıŸêˈ0W.şXTtút_QCCÑÖ­rŠçĞNvôġ BŽgßĦÓE›hD̅ʊñu1D„%F„ĝÍñ^â“$ŝé#”-˙ĝıjͰdXô~ўӃ}EGŽ(!˘^ü†Žžž>ÈñôàÉMĞWQˆÙ_YÁ˙ËÏ˙û3Šˆ°îħ÷ÍÍqwzÛ³? VTžûé[Ÿ·é!ĉí)z·hÏ`_OQU•˘`qۑ“Ĥ˙ĞgÏĤĠ´Öœ3••˙ò·Ħ!D(1Äĝğ)$˘ÊÊGaÏ˙Gˆˆ°€Ĝ×ÓQTu@Q´Xu²­yOmG̍Êʑ³ç˙÷ż†éŻ>8Ûw„ñÒŠñR$ˆÄŽħa‰ËÛŜŝÓÛm˗ŭ?=Ëucóä^ħ¤Žħ˘Ċ=T G4emeEÓôüż!^2†x)2DÒPEÜûĉÇE ÄF^ñê†#š²ĥ²’ĥĊž"¤ċP"NzEWVR1ĥC‰"…¸ô“ôbš²b[8]Ò3…H!Rˆâ ÑK!Rˆq„B¤—˘ŻL ÑG!RˆKÑoZn(D qİ!Ö çB"…¸”Y˘ÇO!Rˆi8˘›B̒™àÊ`V B,• ÖPˆY1ÓàMèß,<˘ĊM!fĊ(Ž<9kgzˆħÂC!fÄĠ'ÑżÙ;ÓCTˆ^ 1 Âoa1kĜCˆlÀg"!ĉÎûM+VĴàWôeóLbNdÍâżÙ]YÑAYsĥÍô BÌîĉ2Ā‹B¤ ÚÉN(•Cˆ> ‘BLbââ‚8† zë)D 1ÙÉ?D<Ž…B¤“šXCˆÓ$ˆ&À†0Ä2 ‘B\Bˆ0"†Ü"…˜1iÖL!҈H!^éG)D ‘B¤)ÄĜ Nû)D 1QˆŜ cˆñA ¸(D 1QˆäaPŝ ˘CĴ6‚è·Sˆb˘Îĝ Î BôX(D 1Qˆ—4ˆn ‘BL<"Ú(D 1 Ú#@KÄħ…H!&w0ˆúÁSs¸!†ïıK!Rˆd!–’ ÎD€XMŝ$.@!Ĥ˘8ÓCQ^^A†ß²~,Ù š}bÚ!Š3=4 (ÈìÁSfTˆ£ÉXĉӟ5K£ĝÛVdöLéƒhñPˆKqÓÖ̞é!ù]ë{)ăx  /³gz(ÑO˜–nĈU/ÄFg–!ÌöU+{ˆ“0ċDˆXk)Ä%ƒX•×3˜á3=D„h^ ĉl‡˜ Y³8Ó²+WÎìĉ›!NG‡ÈQˆ´A;ı5÷Y —ë…­Ù^F¤3∠ħ"Dm·o+…H!%4ˆÈImÔ½Fğ(D Ñ qQ ŽLɃè )DƒTŸ(Ä ĴÄħ…B¤U).Ùħ"Đ!DBÖì£)Ä$0 ù=1Cô%ÑiÑF!RˆŠÔ5r(!ŽF†(dÍĦd@´Sˆ˘"‡œQ ”’!r‘ z(D 1é‰M&DO9.è§)DÙŜtœÍIƒ˜…s@Pˆé†ÈĊ 17D …H!fÄó q[’S[[n@ Ĥ bPKŻLˆŞwÜĥm‘‡´íô霄èħláӜâĜ• ñR8ŬĤz:K!ÊË$ˆˆ# 4G!Rˆ1C aˆĦ¨-qBä@c/|š• b€ĜĤ^ä4Ā"ş™Ù\ĵ!Z@½“qôІXPPb‚¤@gzPȌĦñCÑC4E† šç(DDÁadˆ˘CÁaœĊ™Ô£Ĥ2c”Ib1û}–T@,%@ô_Á b€‹x³faŸzifÌô ƒˆúÖ@Ĵ@d£CœĦŒˆ‚CÙaBĠ#ë3dĤQœ7ƒ#bY4ˆnCˆn 1ieDÑáÈ“ q Ĝ›öĝ!Î)MyqÖ\›ó“5À>žZsқo˘dÍK QG˘Bô‘!ÎE„XO‚h˘!^Z:ˆYY™CœNÄĈéĴ‡˜ ÚâL™Ĝ|£…èCWìfâ‚X˘ĊA!†!žU¤mê‡ñ§\i. £ FƒèIb£3¨‡H{ßŜ7Jˆĥ8 N`ˆĠâbú#^JvÊ ˆ£šˆ8’Äúĝ!úPˆIOı Ñ•G€8C!҈¸ˆŝ0:\Œâ b5b#† ³b˙ċ´A,KbŻ1D!"Â÷ÖA,+Ħ 1K ĥgDK4ˆ ˆ"Bœq\aےÒħü\š ˘ı6ñMâ†è4†Ĝ(GD2Ä ċ ƒÈ'= bápê~Z³."F…èJDo™Ä?ĉ e?DmÊ˘ZsÊ Fȧmǒ ħBúԘU`(÷ ¨–ϤèwpÇÑ=V ÷Xjˆxr "Ÿ-1U}0¨ VÄqšq:2D˜İ³s*ˆvOüñ CŒı)˜ŸŞÊÊ@5ÌiĠ½ĝ&‘!ÖĈ 1D‚èpYŒ ş"Bd‡0Y‰#{!â â(ä¸Púóêç¤ŭsbY"ƒ*ˆ`šp6F8Ĥƒèt@t. DÒmĠl領ڈÈËKB"ŻÚK|Nژ>ˆR1TÄÑÈ]F­âŒb†ˆjâZRĉ ²Ĉ|s˘;/GҜ€8§ƒ8’ ˆÎÑR-D—Cä&´Í7&À&єûy]D9qĈB‚L D;ĉT1ĈêHC‘½!ĉ@D yH=>cˆĠDˆn ÑŒœ5ë!pĠÀl2 ކ²"/WRÂUħn˘ĴĴH^~.7*+!<Ħ3Ġñ@!Èk#@ôë şmĠÀcG5€üˆÔtxÉC✺§7?„ ekDŒħ•&iÍ7òòòšġCV–â\5†èb½Ş˘›(DOK-p¸í:ˆ>Ñ9MĴ{”ŽÂ?ħVÓSÂî‡ur 1ĈÔ·Ĵc°!O?ˆo‰ ΰ(kŽ˘ßâXWDˆsÖ.Dk-htÚtğ0Ä ġ…( qâ´ESz ħ3êĉĦƒé"`Ü1Żm°ŞH?Ĵy‰ Ncˆµjˆ–è½½:ˆħAœVAôÖ×CˆĴ˘ A, ù`DDŬÉ4MꨧdˆVCϽˆ˜<ˆ'—­XÑ£Ÿè!êûT@ôÏaˆÓµ-IJ4AôĠփzÄш qFÑbƒ)†˜ĴöÄNħċÁI‹ˆÍƒ{Š€X˜ˆÎ ħ>^ˆ Atè!ú-DżÊ”ߢŽħÌ;!Ng-ĸŠ„‹†(ڋ?kNE§[ ˆjŸñAtaˆÎú DGDˆ3$ˆeˆžĜ j³f1Às*kNÄÁċmƒ ¨Ĵ¤bİŸ ÑÄÒ$@ –ZA}Ż˘Ġe qŽPFœa–@¨++!ŠÍÊ>áëwŠÊJÒ:=4äċ­lK ù&…ƒġî0Ä ћÄј Ş"7cj Ġş´Ù^ ‘%C4‹Ğ5-b­ŽÔï!Qd%­è#bftzHāê`£bEtˆŞiĜŬĠ‘!Zµ'p{X[ˆ%@lD™Ż) CD³ŠÍè!ş§Ù ĞošÔ[‚#6g"DâÒvzHD³Ñ:@€ˆQ5ûġ@ [¨SÑ!r"DeC4ëĴ‡ÔĤM "Ä ·"üĝ n È!r9q‰;=¤",ÂÚÄÚHaĞ'AìÒAtĝEˆvCˆASÀÄjSäw¸HÑ˘Y ‘ ‘Ï ˆnK°Ċ‡¨œW›ħÑ_ÒBl‰˘°„è BĴ…Ôü&§‡ч NÖ@dƒ>Cˆl†C²Xı݃Şóƒ˘²²ôR1ŠÏ<"@´İ!VG‰ˆfXA…͈~Ñd qşĊ1˘‡Xë˜cÄ9 ÄÜVoqÚ˘Ïäéê d'Ät_kÎ,ˆ>"§…èI2D‡b­Ñ!zÄÄj ħÔKê` ÑĊşNÒ8, 1K :Ç Ä<*ˆ0kîbÈ‚˘—eG},üż!Ä b­É]:@†ˆoâËRˆâTIîôY'Ā=iM Ú>=Dà˜a½Ĥ8!˘é킺ÊJKµ‹uıÀ2D?"bnB,!:€hUAtE‡´ÙĀ˘CôXL>Ä9ÑO‚Xf‘<6§ËAšƒßÎÀáʂZs´hüTN@ìR@,âHY"MâŒCœ!V—A4ÇÑÍ9âÜzˆ-Ž,ˆ|—ˆ]ޏ!vY}zˆ6ÑCD :ñÔĊş B´Yµ-"IJı:ˆ‡Ûaĥ@´QˆI8”:ˆNğ˘ Ê3€X/CĴˆb‹â„E‘|ŞÎâ ŞD€pUkŞ%7ċĜM„Ñ}ĝ6{†·#‚pWe3b¸­0‡!ÂĦğ:ಅ!ŽF…8bÑb]ğ–³ĉ1†8Ŭ€sš q·êTÌCduÑċ´{9Ö"ÇevD/¨ŞŽ „”ué܁ˆ5Cˆö”C4)!Ž– ˘ĊM„XaħÂD×Ħ!DmDtı8b0ë J€˘cCfDÄuİ€èc§Ä:eˆµ.4Êà_}/†è@Ĵ‘ Cô›1Ä ‚$AĴ`ƒĠîҊ b]‡&@ìuٌ!†Â7Ì|ˆúP2%"CœMĵÖ\Ĥ€XD „赨!š£@ àyŠˆ#fLÍĴħAÜĵ½,×U›ù¸1X1Ş„xûĠ§ş…n3·‹_”!ÎqvÎ'Bô“ʈ~g/Çu9DˆĦz“÷|…µ*ˆfÎéÍüˆ˜îNI‡8ÎÎ^P—! UÚnCˆ…³fX†÷ġBˆeġCĊ¨b]8ì4ŭĈoAˆ~ħtTñQv‹İ´žÔëŝ˧—Áċñqâ]b÷üPĞ\/RAtWw›Eˆù§ 0Ä_~ıC|& Ñ!şb—D'‚èĈM²r]Äb½bï@–CLU§‡¤CĵÀŽ·k"â|8瞯1„Xë0Ēn˜Ï ׄ!úDĠĝ£PßÇ{ĥ°7•šÊÄ?†MCCbE)ğ™EkĤš*ç'Çq[Rñ"|?÷]u"ÄûóO10ėĥġ˘ZÉÄÑoİ `ˆNĊ0D çZşDĞÑQÒ@ôäTDä—2"Ë×µ[cˆç˜ÂsMˆ³a§³ëÏ]ÀBgeˆ G|fßúîMċSÄ;~F„X/ŞFċ½&Ô÷q×v‹Ùd– ž5ċ #@d7W@ˆ…ĊÌċÖaž eˆñĤuÄŜû™£L%†ĝüĠG"ğA†è°s~‚è$A, : D\[žq̨ v9Cb)çt#ˆ]b2 –h7Ġ`iCLᐈ­„ñ2#dŽĊhŸ&üDğħ < ϏAÜü›5MċĊù°N3òhŝ×ÖÜħċ9V;JK™ĦqĦŭ̗€vĴßÌn)3m– Á"SÈ8­Äğ·3ĊùÌPS7ΞĊûe >˙ġ|˘ó~ĉ³C|àêC"ěÂ9ÎßkfͽâîK! 7àœ"EŽzż@ ħCtdte%흄X\XCèW˘€(Mş¸ C&™Vñġ(³ĈO”— ›ĥƒ'7CˆÎz‚˜_Y×:ħdûġwl9´ÙÏmN3Ëtâ€{ĉ2èg.”@ˆ,ğB‚˜ÏtÏBˆ­˘C<şaŠ™ÎüÖòÈwÁ²şBwßĠÛĦ*—}‚e•G˘‹ħք£ËċÄYótWHŒˆ^˘½ÂċmTBtı-^1£{hgK§DĦԘŸ ^ž—ŭDˆ³RRT;/=QXR'B<µŬÇzÄ-oŻašòa9BÜr˙Ħ·mf7ûO­63{]ù*lv^ċL;sXë$V‚ĜŜ:ɔ0ŬâfÑò%ë3 SǔCˆ´YóĦžżE‚½‚]pġŜk6<ƒ Ž…!Î@ˆ]†+ˆN—K€è ákÎjGız4U…⇠ÚBÙ 1ƒ:=BdŠ [ׁv”}Š‘_èk-ôÜ+9Ċ(żf.OÑ5AFĵöujğCü͖W×3í5°ınÈw׏żmó–-żÙµĉ, ~m]?Ú½r0…•ÌFqóĉjâoAùlÓ8ógĉ”5dA½Áz¨>†U^§„ĝĈ“~n×½7BˆóĝÌüvx”÷]³ŝ9ÔN£ˆçläşH9N 1Ĝ+BnT!V£A7Jˆ.ΓĠ3¨ÓCI>‚xNqĦ¤¸[QI°²I,;N ™² ˙ƒê“~/˜­d։íė^Ŝòò!Ĥ³İ¸sĦ¸Ûw׌}ûÍâÛkÖ ³°ÜWˆ!ÍÇlîĵ‡Ŭĵı–eˆ5 ĉ„xCÜ3íGïĥ:Šżô³°İ²ȓéq܋â}7Ŝ䟂.]÷3*™Ù5Ô}ċš5sÜ/Ž…ˈ˘C‰1àĈñq@‚èv…/7O`ˆv‘ ċNÖÌ/)Äù:Äù:àv 'ĵ²NléÛĊ~ŠŬÄÊ´‘™ô9Á…VñZ ‚èÁ¸ù…£ùŬíĊ­³ċí"·ëföĤ-/ŻYÓ†X<4 ƒ [ƒ Ö+ ža˜ÂYĉ"ÄğĜÇşkĈ˜üu5ċŒâíwAˆßşqŬMŝÉ: q} 3!V^ó•57sÜKόnQ qÎ*@ô‘ Ž t!ˆ½ÄQ76(„E`·9m~—‹q.“!fM§qĥ\qĥݘaʅ+x5uâöqԈ(ôSlÇêP4ƒO2^.ïfJÂuŠÖŭ IDAT+~ùLŭżµùi{q÷P~ÓTMÓÛwMsğ†­YÓʚXv]7†Ĝ=ÉtBˆ ‚ĜȲD¸ħ äˆX ³ĉ-_g­Žu7û™|Ĥ†ARáÊâ,·ë~ñ:—~fc3 !2×<!ÚïÜ1zhƒ"¨Gn"DŸAìu`ˆ0ÊcˆÂġ>§†8† ö:<ĉ2ğ}.#bzŻ5Ż^>H)"S3ݰ‡!N!ˆ•¸½z²ĤĤûòìì<Ì*aœCÏ´– ,}ŠÙ‰ôċğîşP8ÄԈıžçw4>û†ÛıbX˙­ğÜZ÷„xÏö͏ŻYÓ#[܎D•´v2çˆìf+‹ş¤^÷ëÖP^‚Àµj™C7­uoñĉ3•ù¨ŽÛÑê¸í÷ß8‚ ĉßtìL!†¸£Ž_˜kÜâİë6*!vE…İ:\"DŸCo9áêmëuĠ+!8ns…Ŭ1C!†ÓMË c§b€Ĝ¤€!^n…kĈá ŸoŞİ)ï?×Cd@'Ş.3u•(ü]È/G{çw˙òîáüs ˆNç×Cˆ7Üϕtĝ>í•߃·Ü!~ošBħ¤ÖsfK*×1“×@ˆğĜÒÍ-,ûKħ²”ï„e׍6âMĴĊÑŝ¨Żİ…bˆó5ÜâMù7}ŻAĴaN51a¨ŝÊÀšâÍ:ˆ½Ñ!şñ=ŻCZµAhÂe 8`GEˆ-6.“!Ĥ½ÓCGÈĴMâ|9S³N=*F>Xw™lG›Šûç;ËaħĴs¸ó ŜÎà–C´âÚ +ĵbŬ/n*CÜUíĵî:ëó·_½“k‚Ġ⚠ċWCˆì]ìŬ›Ż>´Áħ BlG’§Ö”³ùğXÓfËNùo=‘_kċ°Š4yŭ=3µâs™cèQO{y~É:†i.èÌ2â×|Üöëî*éêÂbħŽá† ğ7À§~àşCô!zÈ=ÔÛK„èQA„™3‚h›Q@t;ğÜèŬ29"ĤğÓê“=òÀzċĝú(ìgËaUaŝœâP!ÊûĈÛá Ż)†k ŞL”´÷‹ó f]—))AóŸùÚPùlyŬìĴñî ç·³z{ŝNû„xĤ{çĠw9ÈïîÍ_>ş‹yôFXYg ó‹wÎŬÔ$@´³ìe0û­k`ı³„ıïċë·cˆ[6—™óĠàLy ŒŠĊÂĠDñöŻùmżÉ֛f0ÄBnh]ëXfĝ{ñ¨ âtŒğ<Ĝž{ Cœ–zäşÎ.NBçg͢sU}Ĥ}şS9À^Ş‘D7GŠ“qB„M AœŞdÊógÏ0›ê*aÙœë†ĦŞ’)é„ĉv2Ìşöb¸á êĝÀ.ÀóÌà+}ù;+QŬ·Ùµğ45 ÁsAdñuOô•üû…Ë ²f¸żC,eïfŻ>jg˜İ&ôΕv’Ŭ‰ žbÙIû5°šÒ„-gŻ_?S"âf‹ÙŽïp1ÜßYÇ0ċí¸„Ê­ùŜ×|Û·?_û„k\öşÔ4í€ŜżwnÜÈRCD·}ACŞ"Cp]˘Ô#×Uìr8$t~K5çîÁL†{&LÜ9Nˆ›VĴXÁŻè‹;k\ì,œf}hjêP…ĝLw{~a9³³ŭ2“_\XXĜYÜ])B\7 Ï3vâƒċ¨‹Ä:f×Ĉşu`ĵµ½ÌNĦ2˘é™C·>ùÒíLc =énÂMìQ‘+Ü-–ŭ2„XÈ0…gfÑänMâ!–•·° œ+DÁuŝúġg čÏlİ-µ+ôqyrx|g{yñjZçÖ|ùkÛ_ŞŸÛr5*ĜëÚ9P!N2Żv=·–ö‡;2* zɽx@‹b0 qÚa—ÑùĞëážNWr Ĥ0kN/D4Â>‘ÊÊdSR|aˆiW@lBWï†ú‡ÊK`Ħ}’İ,İ)l/ìlÊ<ÏÌ2À$³ pZĝòPûqgáġ•Po;Ô: !^g~Îü̓Ż^S8Œ Ζ7]8sÑfşú—żĉ–ŭu=3ù/Ĝ§ïO>²†Šożqg³…ëחCˆk~q—ĠÄɳĤ×MĠT—uOBˆ_şç7kĥğêç,WâꠝĤÛwÀêר™Üö[wh!Ö ½‘ z1DèK ħvĈÁı¤q¨~X:ô8z3"Ħ+ƒtÏ\mOˆ$BŒğùfĵ‰)Ŝ9Üτ§)>!£‘œ ŭÜşÊÂĤ!Ĥİfh(ż‰iê^7Ü=Ž ž›‡VQCĝ żížbÀí×ìZżêí„ħ´ò„Xl~ŜtôžWŻ)žEAqñċùŻ<‰Ëˆ6Ó·ćYv˘B,gŠçÑ´8ĤBˆÏħìıĉŝçÑ5EĦÇÏġdŬĵáKÁ'9Qœ#xÔTÂ^3ž/CœħìŬYsa–ЁvÚïß.4MpNq„¸}VÑG„è†ĝ9|"ĴƒpÂbġœ˘AtĦws²!"Ş—.²çtOSƒö…VfgŬP·bSS{1„Ĝ? Î̖·×•ïÌïîŠë˜ò3í5ÌSı³ğUˆˆ“냓 0§ŝÖġğ6””#ˆ (l‡wn~˜½ëĈçŻn¸FY˜? Dˆû<‚ĝò×Ùħfĵ² ġŝF7xA„<Ï2ŭ˙wx ̎]O?ıy=Şğ ˆŬ`Ŭĉ„ĝҚ]½âóu5CG› á§!ÄÎ@ ‚ĝ ̚·K3T£C´£Ñ÷vâœâ€˘=7 FşËEú ĥwöw†/­Tv÷çŸëïĈ…œé.fŠ/œSM•LŝÔĴĥ\†Áħr]q ¨Yç6ûhmßÛĵ}Cñ9tıBĴ‡ ÄG7<uĞ5ñ<`Ċíì“-\ᚉÙÑf¸ŭBŬ<š^Ŭ}BüË3Lżƒ‘‡ĊĴ?ôĈŬ›żÄ€ tçgÎ!]Ôm-‡™ ÌQñĠ5‡ėşkšêĥwC;³/< úğƒVħëá·wm&@ô Ú=DN€hi!†܀4 zÄárıÁGÄsíLçPw{eĝÔW^8Ó_ŜÚԉêÑfg ™vHeĦżœİ\‚ĊĈâşâNĤijPçĉ¨ŻdŝqvdžÂI qĦ¸B†7Żŝêö0Äçˆĥ˘–kÚşžġ×0ŭŬ!Áĥ°Vö ‚X8e/–oÑà×6ç‚2Ż“á ɝ€9Ç‚¸ŝ¨³~ĤúŸ‡kJŠ×Œ#;£Ÿ+éžİïEï¸f×rD? â§€È ŭR_X7‚èùD›½ÛÀDfÍiŽˆgÚ0Ž:˙əa ˜ŸŻ,lf5ùMBϜòu“°ÜXŜÚZR3KvíŬ i?êCúĈ÷šŜ‘3ÀV&x'„xf Ìe×?˙ċN<Ä ŝażD·*A<Ĝ ġxAl>ß*²>ġ8ËÁŞ9îƒħhàk›a}ĜìGC‹ċ3< ĞWÌfûšïŭŜ.AôĤ’ukĉ‘˙Á&Ĥ?TíÚqhğ[·ïÚ•Ż„X!Žxô­˘_€8˘„8ᖠZBvN,BD­’î‰ ŻĴUW†½ùˆµ—âp'.·ĥNÖĦÒDÔy?żI ‘…SáQCC•íLĴäáñ ‚ĜÉ l||{ŝ<‚Ĝ4[R !^!vÜĜ‹ ĜlVˆĊ²Ü,^lô×Hȅ{–²>öéġ›‡vÂÓžOg×İħ [`6Ük°!ğ[?;‹ CˆOœúÊ) Ñ ş ×c;½ë˜~`qíĜ½ñ+_Ŝµ]§%@D-v?a&ÎáĈ½6ż]qTÑĞ„èkñ +×r”ÌŽ++|\G•.ˆŬ ˜mjš­İAĠ "ê.;/t)İ\[ñŻŭsġKmš½Ì<êEÛàjÚ^‚û†5Mí\!^Ŝò‚ĝ!àD[+aÓV #b‹›eQµŒZ}•ù•“âĤ  Ĝ§7ïn’góG騽ċĈ-ħÖ`ŭnE~Ê´fA´]c眍Óâ,“żżĜûx!Œ×ĈġğĜkĵk—8‹·béhŒŭ%DŸO ÑêE“t û+"Ĵ0ƒùşşùášùöÖ0Ēu•@è†'Í`T,B„™Ŝ$3fmêĴÁ‡ [­Ü5„ŻĥNVĉCˆóBDüÒ9" í²WûXÖ#A y|;‹wÎĞ!}oG§"ǕŬ Â|fÌ^Ä&Àô36Bˆ„Ĵġ˘a6Gñ‹=Żo^˙LġĠßÛKşn„!˘ûQaˆ~=Ä Ñ×B†èħ ĤFÄFşp6AŒ£ğCz!˘+t;!ÖËù;ëJځúĈ^¨ğËıîP™nTŒğnŬN ñ\wċcĊxBñÊöÊ&l~‰e·ïĝÒ8êpw—X6äAM88˙ôĠ´—HĠQP:† †şa-I‘}rËNq5ä _)χA‘Yżŭe ÑĴ‡GÒĜÂ/v?]Y< *6Ŝó‹ÀĠo?Tü’"çŬfŸ˘K‚È)!z•ċGtsş7z–EȄĜ?„ú,Àjeû¤­u×XÑ^êA’¨Kôd+ŒˆàžìĦ•İÌ·Àh15^ò\ ĉ”°[{ŝ‹÷³°^aŝg ñ2+ş½Î ˘I„hì.–ZŠƒ˘ ôw–i!ÖŜÔ$â)‰ĉN0; 7z•Û-@ô ]vüâÇË+§ Ä-Î€Ğ÷m?ÚÄ* :ƒ›ß]á%@µÙQ†;Ħ„(ë‡EYĝB âˆM ŸÙÓÚéaQÑĜäöqž3ÂàĵòI D4~sĵàf<‰ñP~ew>-uż˜nñôù—ŭbİCœCtşÊDŻ Ñ†ê¤‹¸ŽÒQÑĉ' ǵ-7ICGı$êy3Ï–o?ġîy1ˆž!şŜh…‰ 7kà}ÛO½(AìEïf÷âFŬ·!Äú€˘WqLz™FϑZĉCLûµĉ„ v£> u•hX§qHèĴŬ4݁X>+̆S0Uĥ_ ĥÛCó"žá­AÓ„èCż Ì Œ> ˘żœیœÎÚR?„B#€b [½EXµqá ,ê9Ċ0ŭ‡8?çÁ­˘`Çù'T²­po6pĝö Ü?‹_%‹ŻÍ ˆèΈcbmP Ñ"דĀԨŽ úĞŭv 19Ï@x³ípċƒ­ġ ßi âì1ż]M'Ċ# ‘ñÌ?jB3‹ŸVBt›§€8jS"jGÀZê³á2éÂĵb½Ċ~—¸W µ™˘ÇfZ°Cˆ]"Äâ4z Ïĝ~sûz޽KÀpÉ'Ĵ]zˆ½Äêi%DyŜw_šŻ" €hşà Fr°ÓŸŜÁS¸£ġ,‰úĵHí5DÜÂtk^.ĉoaˆ€- –Š7n| eˆ3p³Àϖ ÜàÒj›CñXêR ¸jĞK ]>kĝj ѝĊ˘Al Ö "´U—y‡_Á÷6vGP 10`sĝtèĥT>ˌbİô |fTa2‰áσ!N`ˆ½²’ĈK|¸o;ËóHá2D­ħZżwùp fPL~–Ŭħ1(LgS„$ˆv D›™UÜY~Ĉä,nIߌáñrŭ;k˜yэ N´ ˆoˆñ[•ù†ė6ZĜ‡ÇtáŞC3ĝŽërN´@ˆ#!%ÄFéÀü"`] ˆ›3 ;=¤÷Zsğt£³3Ŭ5íș8ż*˚íúaM³š ĝ~ñÀĦ„h”EˆÛ§RtżÏ11¤…ĜR]޸u„üŒc‚Ğ×Oü`ş>ühh]+ƒ†"#ˆŽ–1zͨ _,´€š}¨ Blİ˙ŸQ{Ż1`…S@”Ĉ_Š!š9‘Ĝé!½ħUşéx{ŬpçBĞ0)§Ùnsè!žDˆ6Äъ€BlaOÒAäL˘CÑéTN2(?Sĉʔ'9dßÒdĵ¸AôĦjĞ6jCħÙÚ˘ˆÎ"éû͇gŻ‘Ġĝáœ]4ĜTŭ1ÊG3Š!–Š•q´L¸én.fÍižéĦiVœúfŞiŝLwŬdŬĴpGΘ*ç2§†oJ X›˘Ċ_=áĤ1ë@ÂG ÄˆŻÑâĉlŞŜÏĤje{+†hvpvXyFYĞbCœ{t{9ëÒBtàû÷As ˆœUx3Ï(„hZ{ˆL…§(Ğ5i‚X³ ĥċ͗·Â¨XÒ_ƒ­…ĉìR‘_êLžÌ V€hU@ĴġĠûğ€)0ÁvÙĉDˆ¨íĜáǙïL„8§…ˆ&é'@ĴïċÔ÷¨ĥ†T×z ‚.“ĞÑ.BĴWBÄ­àiĦ(!\5ëCD}sP,ÌBòÑLÀĵŜ|~ÁŻBƒ]DO S#bşŻ5ċċt DÄÙ2Q÷šİĤí5ŝF0ívğ€x•X"jŠ%ÄzDĞ×ês˘ʳN¤CDOÚŭ&œğV˜YnF1D‚hujĤ•q(ŝ:Z/`ˆN“ßÌ:üv·0u7Bˆ‚ ˘Ŭ†!Ö³œ"ΚçšA(Zò8g÷„X:î*„.ĝ ¸(D!5 ( ŸŠQJ;;ÁlSeSÍ@5hħ +·Ş!A–:69ÂçĜjďÍë ˘Y0Ä2tZĊûÂğK9<If ÌéA‚ĜâX (Ş}R€hĴç@ĠR‹:kĈİ·Cˆ½D7†èŞĊ]$ˆˆ3áħSĝ/£Kž” Aœ(İ!şŞi§9µ­ Ìġ+Äân0_SWShf–…ѰW™Ù”úA™ŞœX!J1 €bıÎ-BDóÄ Dd܄qÂĊi §š‘4V€˘W>šCAôG‹Ñ\Ħ€X&B<KŸ͘ÑWĈqÓ°˜¨‡h'@ (ÑAcĝÀŬ˘i~@è᪝ƒ›·†ĜG`_£*r•·VÖĦ ĥB}ÎAÈêÊaAV,ÄĦf TêOꜙs9\n OX„ğѳ¨Ì |.7 Ê „†Â "D›ĉx5½òјxĝ‡×‰!š[píÖïċ„†nD3şŬ¨ è öÂóÙm£aˆ]3ÊëÛâ÷ċÄ#–MĦj·ħ·~Q§;•3=¤⁂E@D}]wĥ··£; –y4ç|ÚɅpô“Zs]B³_=_<ë•ñÀÎ^°A)Äı0D‘ırÔ4×ġÂĝJ5ÇĞé !"n!‡Ç‰ŽÌ˘lrqż>ŞĥŒ ŭ˘Eŝ…xŭ*ˆ°œĴj›İ ˙ lvÑ#@\ä-Js bĠʞÁEdÍ5hÖöËCçħYUç<ó'—£Ïp.F¨–²Z%ÄO ·Úĉêò˘3ÈábρwP@ÄQFn:w)zw҂5[ÍñjşŝIž^Ü( €ü{˘Cœ0Á?6; üš9k8—-œq´ŒqaˆA5}Ünj 6„hñ]œġ4kĉġàÊs˘••Î)|‹)—ŸsNLĞÎyÀ 35à ‚–ĦÌ&ĦNËL¸]ŸşiÏÄ@µÉí˙ĤùĊLP‘“ ʨ„àıgŸĉ P,ИÎiÒ<ÙW†èFW¤gÍ8Up~·C†è  ÄP—–ˆ-AÔ·b, „¨**KšB¨uZÄ ŻÑîòeÄmIOqC\ĥbċÊĠ 4ßHijÏjCöĠç|ԉò'aŽ6“E8‰Ä2 b ‹d&/'ĵO|îA……§Ž›CÄĈċ °ƒ3Š˘ ê8è³h!úÈÄ`/CA ²ĝYmx JßF€¨ ›¸&.ĵ̰Bˆ Â‡ Ž ß-# ŞŜqÛĥİĴ$Ò ­z”nÎ!OìaJzaˆAÎ/@DyĦµâÓ¨ĝQW{Ħ£T…tÖ0Äp“µ0,T†è#äż-Ĵ2ŸÑġ{5…p¸P;žTRAt)!˘v@0Í •qVûf°d l.DUW:Mù‡ğ`7cˆĝ>ş™Q‘/ŸŬĤz˜XZˆĦ@ñoünÜh+´şIY 'ÖĦ·ħ*ƒ;ġùÂMpsÀ_/È Un{âùBµáŝV3ÊZın˘ôÖlşNÔbĊFQ¨òÀŠşKĝİ…ˆŠĥD/Žh3Âߚ9 n„ĉܵ°pÚP@'“*ìŠġhÑ ˙ĥÌ#7êİ€Û(ÄdA ¸w´Xĉ€Ġ§lŜCŠ•úç9ˆ-s.1Œé "b‹( mGµÚ†¨¨ ÛTŝzúü7d÷3;­ħĦħ×îu‰áR 50Ê1¤ŬŽ€ :5QAÀ "A ƒ3Ĝè ħŬZpÔÍ:À1—A ²˘×t4ä _c–ŻmÙـMì­%„N.(Ħ 'pïìNY¨›+Èġ §jtj'\ñ˘/!@ öj ÚÁŜ¨ ÚàĈ:!núĊž.áĤeĠĊfhߢj@"@´ MT8ÏÔżK`š°Û ÄĈP¸ p@,((ÈbˆNÖ*tûS7çM›YŸxbXT˙Á!S¨$àl×jˆĠĝò—²Ç Âá7eÓ´ĠĦ*êB Ìç`°bŭˆÓêŝœTް!ĦĝC ħŝUÔuQídÄ'„x÷ĵ9ć§B V›8ŭ…M·>…j]bÀas£k‹‹žx$y‡Y ÑaSwöOÁh5뜳ÓA( We°lǜQ›p5Câ`M&ÈUĝA…˘ÍíRµSêĵM  ö"“‹Qm'䰈eĈÊf1m-D3<°ÖStİÜç_í°Š1PlŬáR,‚à1ŞBĝbşħ ‡!ÂżÌ £e̍-.zäJÒ d9DğĥDzÛ[­6§G‘ ˜hĝXUö1DˆpXóëğ Àr›ğĥÚJ—‚nUЍP„Î[ì¤âżr[Èë’çk@ž>*ˆèÏĤóŸ-!Ğ‚J—•'01àġ„?:àĉä h’Í‚Ëĵ°bìœ:á.3£ ˆ4"&"G<çNÖç†ĤpÓ&?<ÂԂ¨êèñ…!v…ë“Úl–Ğnô…,ʋu3JˆAŬp:ˆ >éµEƒ¨÷ħk|RŬŜ…Ĝ˙ç„N)ó(%|cż×J Wëoµ˘íyz2r¨âĉPġ„³aÈFˈ CÄ7áóE„h³ ŜĠBóŸÙS;!4Q‘Î.›]…ĝġó°Âŭ8 çntêî-îÒòCvż3 VÉ#Aôħ3Ĥ9â˜MĴIݲïQĞÀP°‚ÓĴôI,á{ŭáC[ə]òͧ´›5 U7€ĤòtÖϙ]&âĦµĉX!âñìâ_ò´xÎQé\Y½Í1*6ğ 6 §Cą=Ü3â#ê¸2WmiÀ"áL[ëÑĊšjˆ.3h Gі$ā%àQTÍ>× PŒY’6m&|´SQ2q:F9Xž@_ˆpx!żÁŜ½è’ğ/mGLâ‚hê(Ú2Â'VÁp&W5Œ~Bk †X›ñp;Œ+ ż'–ı– ytZQڙpĤ[Ĥêndˆ]îpoŬéÚ+ì jEš'Ûñ˜Ġpӏ‰ÑÊżC/šoiF(X‚­Pîƒeĉé}žBŒâċVéşt|Ċ]ZüŞ“Ċ™ü.XŜÚäÙvX…Ïİ1ĈGş7ÌÒÁˆjLJTˆîÌĴO³!ic@WešGw)†ġo jTôğ…™'B$ˆ-âôÚ íÒLm™ñĴ"mS?L(˘<šFoé—o8 >â. .}ï›8 ηJkçlE} ŝı€Ç>Ш˝xc!â„+lĝR .ñéş/`ĤœPÒ>1²XˆÓÊ#– †Ü4ĦxĜ­ĈoĉqŞŠˆr[´SsPŝRBGX{`É!&?â¤|Wtï ‚TÔ݇¸ê ÓÚĊĦ^²R7 ŜAÛRœĜÓ§•MŬĝêH|WĈ„>cèmZÈ;Ĝ,žQŬĈÖbMüÉÓbtŸ˜1f,ùÖ>Ġ(fùKqĦ‡˜a1\W9‰ĉĉ´ĵT÷uĞcÇm3ú`´ù-Ô â™‹| ‘uĦ :@ÈÉIíŠÀN:ŞmÒÛİżßX!Ž64Ĝê ĤiurúPyı†¸ï]ÂÑ ÊÁD ,GŒğ~ñK9À …¨LÊá¤7ż$ŜÎDĝĝ÷vĠT–7Ġ{lÀïiż]Ôx „ФÛÖ+B,­ĥ /Ĉ„İ3d(z½CQĜÛU߅1Ħr!Ÿâ]k#B´7]šËˆ²Ĥ ԀğK÷,…(Bìi™­Dܜ+>‡şOßóÜÍOż\³dö×Ï;Z&ÀtElIúħg¤É;°š‹£^Ĝàêu:lñ@-Ħp 2ö„Ĉkù1.Y:Hu×Ħ|2{NqĈn³EjˆĉLqü6è͉7lçxÖĵ²áÉ'ïŜqô˙oïŒYÛÂ0œ)DXÒPşdĉİ!”N d íĦSş4˙@ĦKŜn-ĊK0=d`Oêr‹ ¤`È÷ĞXAjbŬ—Kléy°1ĝĠë‰e]’ğÉŻÓäÍË/“ŝéäÇûOŭa˙ġĞ$HÓ4JWâä$żġ·j¨Òú ˘<ábĊĞÇhâ(‰‡´.ú˙?Ô *òÛñ$M'ż?L.ÓK]^Ŭ&7<)897?@>9@RAG1NA;QpV~GHF>MiNPMjœOU<=R…UVTTWe\a@U\ozĞK^„]^\A`¤F`˜NmE&qž>eŻKbĦEf¤bclPe™LfŸHfĞefcMj°WxL²WknMXwQZxGMlĞHo³Un¨lnktm]QpŻ~q1VƒHUw^|]_RZrĤ`XUt³cs•[tšn#rtqeƒQv|TZx¸hƒc—Çc„‚b|°l„kc{ĥiŠb{}{j~Ĵo‹Yşn/jUq€Ÿbƒ½g‚ĥi€ĵoŒl€ˆ`t‹sx‰wxXuˆšl‡ĵf‰{e„†ƒs‡·n‘“˜Ž>~—`ĵ„ Œ•Mvb…šU}œa“f„“™’NŒŽ‹6­ÔĴ5zĦeƒ‘Ĵ‚˘g“•ƒŠ˜Œ‘Ÿ_†¤c’3ό%”–“ʏ)‹£j¨‘ƒ˜Ĥ‡§l˜ŸpЍgĴĦ˘Xɍ\„É²žI•ĤnŒĴp–Ħ–­lŒ“Ÿ²Ÿœ˘œí•ŸÀ•t§İ^¸˜“ħp딜uŞuc½Çì•)›²rĦ¨Ÿê™*xş·§¤è,Ÿĥuèž5¤µ{­ħ|ç˘7˘ıy޵}Ž´ğŞŒ¤ĴÁĞ­Şç£@§°Şĵ´eŞŻ²¤°Ëĉ¨B§}ŻħĞC­ĵ}°ğƒä­L³Á²´ħá°M­µÊĴ‚²˘³ƒ³V·ıĥàĥXı†°Ç†á¸`şĵıÈÂwŒÏĜ¸ÈˆßĵbŬ½iÖ¸˜½żĵżÁŬÂl½ÍŒËŒÌʁĦÏŬżÏŜĊuŻÍËÛÈw½ĊÛÁĊĠÂÇÄӓÑφÜËĈÉĈÉҒÙ΁ÒÈÀوÜуÚъÈĜ—ĴĜèĜĠŒÍÏËÏĜ™ËۚĜהÏÑÎÓڕÓܜÒÜÒÔÑ×Ŭ˜ÎÔċĉÖ½ĜÚ×ÀêëÜßçßáŜċáïâÒċçäĉêíċéùéìèëìöóĝ÷îçïúñófh„ IDATxÚí|ĠàCÒl½ÄK·^_֛;lÓB”\BˆËRŒ“ĴLÜĊAĝ˙–[ħ͑Ÿg65U½+tliĴTܕB-ëd9kµ‹b¨£Tµeì9;Ĝ)J ¨‰ŬsTeìJ \I·ÀîĉsïÍèߌĉ=ÍȒí=ÈÏ#KÏ|ç÷ŜïÏû·ì ­ŝR²üÁ.Dùƒ/ኚ²ŒVżû2WŜ}w×ö[ÙyßNVÜĊvéb'ZìdĊb”í;…WġĦÔU?$"Ĝ7ĉ‹;v½›Ĉ$r¤Ĥ—İß}ŭ?¸òòğğvloë­;oË÷ìHŠ[wlGœĜÄĉ„Ĝ’[Óâέ˘bk†À–bżĵS(îdû÷’b‡ˆĜÎ î2ïÙşe'·f xÇ[Ò÷ŝ÷ğ-ğŜ}ŭ“$Ĥ4°ô‘zٗŜ}ï#X>ùäġwwmŜ~Ç­[×Ŝ³>!ȊíëoCŠ;×nâ‹wżmŭZ î€Gw€£ÍëÁÑföˆ{ıŠġiq'Ò%óxŭÎıŸĵ¸~ëÎosïƒĵ¸3óC›žj-›7żğ9ñÇSb ë’b+·m]Ë_LŬ o;-Rî¸mëĤĤ÷>zh!wôxÄ‚ÜŝżAn_Y{Ïş[bûş[ïäĖu7ß Äúµqçş/&Äf n‚b]ĤXğ~Ŭzx´ž;Z—-Ò _<ñÁ͏ŸĝàÖŭO~°ŝĉwï_Ĝya8Z÷ûÖŻgż“›…bíPÇÍ ˜›o‚X¸Y ĥ²‚%zS&ÌÛĥnN€üäßËÛĥmK Ŭĥ˙')ÉWğXû­ëoâÄM7cÄfN|‘/Ö²bŬMë…âĤ„X÷…u"â…ßĵûÑ/˙—÷íß}£'>Ĝġîû˙ŭċßí˙à O‚×ënzâŭ[/lğnçŬû~÷òZxžu)ñNĴÏk3¸¤/²bĵ8x´y]RÜĊ–/ܜ›b'îĵé ÖnٕOŝƒùÑ'?áŽ>Úżí=xāüè½ŭ  a}… ôq3P6N7'ġñĉġü#¨€i‘ÖÇô ^ÁSĊuœċÂĥ÷ĥ½·ëĊw?xü· ü{ۓï?÷ß÷×{âwßŬöÇŝŝ½?8·Ŭ”ŝ.PrNÜĊZNÜÄ ÜzNlÎ8ş Š„fĤôqO°ô(ċ–; ȟ=äŭäċ—÷sGö_ĜŸ ö?X Ŝ|ë(qßlóIVĴO‹ĴĉróöġÀşlÍwħ9!îĵƒëĦ¸ƒëı#ŠŬĊ…]àżż˙Íŝß<ùÁ“ĵĝ£>xŭÛ?òIä‹?şyŭ“ïß >µ˙“nĵÀ;›acËq'ĥÂso]ÏmŠÛ²Äö”€Íà“" C@cóŜ'ILG)täëżá °ÚÛïÛqÏÎ-l½.ib'Ûb{Zì@Š­ÜÑ v€˙á‹[_ĵ‘ŭo×ŝm/î˙ŬŝĜë‹ğnĵïĊv˙ğ˙Ĉí;žĜuێí/Ŝĝäŝo|r×­Û_ŭÛùGœ¸Š{ÀŬ£-)qO†Ĝ"ì¸çxô–ûĥß³sW Óëİ£Ÿd  /\ĝ W.\ĜġÄ#”sG$ÄPì„\˙}Ù÷ôBìÊÀ$vôeòtÙöGKĦüÁ-Á²íÇĝò'ËT—Ż\ıòñ•³—áOxĝ1÷ü•ŒòñŻyŻÎ^ŝ8óġ•³ĵWo'O•(—/fžĝòùË×bQA—íĞ.ğ‡ż¸¤âŜáß/ïĠ%’=ÒyĜo_ħÏÄöUâTÉrñ"ûCówß;{ ĵş–AŞĠîîµ* ­Ud˘{5ä÷ù µË–y8ş·àÏ·ŝ: Ҥց˘US çzċ ġ½ï]Û ?ü×ÄŬkv…BQ•F÷úg3A^üìĞ™ /ŞË*4H÷ħ´FžU¨.˙üç?˙²*ÒŞġż˙öË×6HpïìŬ_Қ”/*+Ğ’è^ß˙‡—.]JĵştéŻ|ċU^ĠVŽ—R ­öóAžŭ‚i×üôßǟ~ù—×6Hîî/i´ÊKW@’—XtŻ÷Wú—ß½Q͂üûŭßŭî~ġW¤VTş uê_ŸĠİR Ğ/ŭüço'@şLĠ˙òÛßŝö˙nüŸçŻíŞŭ!{÷ŝêÊóW~úwWÎV”û!şW÷˙êĞ_ŭÑ;Şá@ó£żùêWġR·Ĵ\İ\ ˙-ó² ÏŞ˙íßŜùĠĞşÈŞjVĞĠ° MoÛ5Ġ_ŝçùç?ûÛkĵj˜h#Ğ.ŭô—˙UûĠÏróĠ˙āüËw Êßü!Ċ4-ĞPƒ6üğŽzûÊ÷ŜıĴúßŝß[o½L‚TU+AQTşË_zÛ¤ŝܗ+¨k[#ġñRċ˙ġ/˙ġ/*­" ùùÏ~ö³ àèż@މŞmÒrUğšUû{mŞ>ûÎ[?ĝÁ[ŞÈJZĞU(Ğ Hµçìù/_¤µêrŬ§Ĝ˙ü<ÏjrÖjapüÁ;ê$H…VñĥJ] A~¨R›ĵÔÙ_+WÙ? Ĉ†ùß2A^~UàŝP<÷§zċ*u äĊêŸżġƒ·Ô˙û{Şó•Z­KİĴ¨ä܏ş²úÁû+T—? ĈX`ċç~ï÷>§üœD‡Ü´ì:*òòEMuµê/ŝB͝ÊĠ™LÀŜœMF6€e…úò§ÄĜ ‚BTˆè˘ÒU;*4ˆ1ùêÚy‘¸‡ìÏTñf üĵWgğÌ_xxŻĵàÁ`|í‚ü×ó2r1ò2]*ó(çK K K K K²òSR­¤xŻ] Îk÷CŞ`ĈT-v.=q ĞN(\‚èTWHϊċ&ŝ/g”Ğáaá@jÊÄÎJb3İĠBêrêŞİ)Ğ*èQhJxü †éZ^Ve2-×*ŞÁoMJ…†˘Ğ5ĠJŠ;„L´Vá÷WÛ½Ş*‰Ĥ´Š*\*µJ…ÎŝC{ s ĤL“ĝü„ŠÒ)Z j¤ĞşJċ…Éŝ j¤œ<\—\”çjIU¨t+ü´}Y•Ĥĵ’6­PİËXŝ2…Öe‚ż­˘M+Uš2½j…ZЃ‡Ĵò(tċr“½ÌeŻÖ*WşÀ75*|£ĴL]½ĵB ~GŻÔÒÔJżĵB£²kSjʸúğbZ§]İVƒ·WèüĞà_ĤÔĞ(Í µFCƒúħ|•FħÒ-Sh*—ÙŻöċ.o™†ĥ_ç˘uËiPNufĠvÑÚt•ÂċRݤW)imşÊ\ċ•jM9P$Uġr­i…ĈĊŬ0@î_ĦĤ½+u ş•°ĥjVz$8uyµËĴ µà÷övrû€ H-í]nזç{ŬU²zıRı²¤`XTFÇo#ÁËòĞV­Şdo4që~™ş\[YUMĞV*UË5”Ĥ|e›‚…ŭ)Zĥu„m¤fRKÓ+W‚)HÍ*Šö/7+tI EXn‡ŭdċĠ`lüeU*•rı+R İ U)Jhĵŭ4İàa›PJé*´ÀŻ]$Eğ Hö-iĤx ħ hÄ)pġĠÄjdy5üM ¤v‡6~ïĠR·Ü ™¨ í+Ğ\I+WUÛ ]Ğ*•Š*¤kU•²ŞŠÓċe:jĠr­\İĴ¸NcŞP*VÚ ²V^§£Ğ”UvHS8‘R•ċÊ2%l#u+Êê4HŞ˘\YÛȊФIËIݚ˘=”Zcç?0^` =pĴżĤµwÈÚu5°µàMJĞ6iìà÷jÎqѸĜüßbhŭ.Qğ6ġ p^5hUSŽbß²ĞĠvZ촇ĤÀɽµv…+ùRdƒmĦWÚÑo*”PUK!˘$'քkvÔPUK KI‹ÈRıV@zŞAtíW)t%ó+ •½Ê£Rš*\%ó*&ZĦĞ4ÑUşÈyR·R[a§ÚÈùEîjU…İRGWšJ çU\•‚ÒTİ+ŭ%ó*^ÖOS:Íĥ5%?²²RrĦĵžÍğwïnhhĜ Ks{WW_ŸÇ_)ÉJ{úÚw7Ôß_ğĦĤqO‡Ġzĝá#9rĝ0xÑöxŬ†M÷?Ú°û@WŸ—*DÙ€°ŝŝ umG™xF 3_ĊN?bŬSSsCs×ÒPÏ%’êëÚ]_S×& ( 2YNMŬp>o db{ŭ5mGħ8˘ˆƒd sĵ£ĥıÏ˙iéïjOĊq’­ëƒfCğ‡úԂôv5Ġ6vœŠĊs” 9ÍlĞŠI} Aú!Ċ#Sq EHX!Kϧ $Ġ·ğĥñ8—V$‚L°l÷~j@zÛëë:Ĥ⒋t Á<§ĥiĞĝ"ʸg0.§È ÛËuġíŝk$ĠĠP#Gó ĞĝžÚfï5 Òß^ßx<&—J ÁwÚjšúQŝöÚĈÁx% †w,ʅ 0î Ä ráP.$HŞŭî|1ĉڝš&ϵ²Ğ1oŒóÉje³˙ZéiŞ;/Èx|Ş­ĥş@ú›k3ñĊO4Ö÷]ġ İÚĥİùq˜7ÈxüxM“÷êémŞœ/…€Œ3ĊĴßĊIµ×v0ñ24Í~¤·İ1X… ìwħ”²Ĝ :FK$8OcqZÊâ‚ô75NÄK $l)ğ6}ġmL!î}– ‡G ápx6VˆÓjšŻŞY T{Í|\X89­F=ÑÒBÄŜġ­Ho4;Ü#Á|2{dۇĥÚĤ^ï Ĉd[ïú”¤­ôWTU™$ĞєŬ£İt­òÂbT³Üĉ1ì3֓·ûr‡\–‡ki OĠJo™}~CÛ Sµáĵ JĞTıVVİ(šjÚ#ĞŬŠ̄5…œ~dĜg Üòžßñ„ÉQêVyËŞ”žÒŻRR.WÖß Ë̄„10[‡<O“erÚaĊVúWyìeġÒ j\ŬCİŞo“°˜ §$5’ÙÄFÂ-) Ö—\Qy]5Ek‹nlŞËŞLŝjµBé­.ğċ°Œ:m0 J Ċ%‡ˆ!ᐎ2T×Lù½Ŝ2—JU]tc£Ġj]”Ik˘(ĉ–#Ò1êÒC2bí°›p„¤ğA0^4Ë·/%?²O²û ´ċä×d%-·t­d yd_í>‰v&h8(/M)3û3ë&œ/ċx]!H¤§ö¸Û ċòCF½Üôšì4$|R,x€B' Ò ëµ’³ÎVŸìäMùȐYŸ[ëGˆĴŬK ¤·žµ×9IGy†|ğħ ÂÊäĉ´·}é€ô×wp×ĉÖ.ž‘˘&ːƒĤ2›#°Ŭ5íK$Ġ–Ĵ8’_J6߆ÁŒĥß#­Ħ”gŜµ4@Rğ÷¤!I†Íú|“½y÷ÙĀR"ž] 5”-ö- 3Ù!H gŜ=óèü éÑ\ağ@vĠ‡¤ˆY óèážO/âĴCĴ"ŝ/7P‹²oƒ‘Û T‚°Ñ(ÑXϝ›>=6|b ż—-ŭŭCco~?2ŸŽ–Ĵê-䏷5Q‹ Ò_›Ŭ]($’deÎMŽ ôĜ,äĦC$ié´qĊÂĥĜzúG'gòŜ‚Ve$‹#p',rÒ˘ĦCäÒù$D·é“Ŭ™ĊÖ;0|rrz&’*çĤ'ÇǞíîŝħé|Ĉn̚yB„#t‚şdóQ]Ë$é&Ö:r@ˑ”ħA=×ü ÎüAz7!+m‚äĴъŒÑɁNÒÒ;:1pš ì0pÄÙ f£µíùi!m“r-˘}A׏=͋’jÀdÄY’Œí=FFğI²wLhB˘AçABoġM„ÂÙîO, 8­O=óM͓òÔ2DŒà9Ĉ™|›Éyƒ<ˆ3Ĉnŭ,£w£Ŝ=”Ñ64Ġµz0şs´ˆ…N½r|}XÊpë –#l&ŭ‹²oŜ9t„ñÖd?P)aKrê gpV˘Cŝ  CY$9ì^žŜäPğE|F ÓÂǤDÙÎdŝ ñ–†Ñ ½5÷óŬä1~ë8A¸%÷pKëjĠûX$d0ÏĉàÏċċڛĵAú7auÉa>ñNËߨ;[et)J쳉#{#Q§0 Ìâ˜Ót˵7yƒlnĤr&mŻ2%l°ÎĈ 2"{fâA~„ïki7\4Äl/H/6Y>íı²÷\:ÓËĉ}EêE%ğ§áƒĉ(žc ä8Ê˙GÖbŻ6FöD¸>Çx ›’ùÄĥ>ŝ-GşÉ1~Î\ŸÏ ™CV†Éŝ(Ĵflí•›)Jĉҏk!{yoFxúÓà{Ìgv°Üħ?äŒïÊá8¸Äds‘Ab}H£O`gĝ™ƒNќyĦAFûAEÁ\ıGœ[ÎÈoòéßÄàúŽ·3ÄßìˆĊó!){4Z¤Ûò hC-x?+`Àù’*µ½ˆ qQv”œq,3t4‹ċÌ1J1á6Ôîj!Z[ F‡äÉÙӖî_°Y(ü ˜˜{êznsî․î>…ŝӃF~ÑÏ7ïɨîV $Cn¸D€; …Ì„1:˄CAŸCO´ZLŬô½@ösá*ƒ·7˜Kyĵ²ˆ û1 Äs!O³N/O‹d,h%g0İÚ³ĦAs‹Á—#qä#˘œżàϳ°ş1zñûEÙt\˘œîìœF&\°$'Ħ÷…c˜6r6èhÁUJÀ1Ĝ¸ °:°™SÌlµĜêâôoèúÌġüNY^ M2(6U8ÛĜ0s³ްJ°•;fÀ:ANô76*<Ċ‰ó}x—4 “Ù~{)N2¨×¤Y 9Zœ³hŽNrJ‡38QtWĜĈ5ŸÑ $ÎԄ÷F33ŭ‚äŞ^`!ÄH† zñžY„ûvîé8Lr•ÛárñL~*ĵĞH ûê¤]ıN[›Ê`ïW@rցœƒô#Ù‡t\x2‘wr80v~ÓJo(ÈŬèĵ³/C! ÈĜÁħÈ#9¨¨9ò Áϵû2ë^’µ7ħVœ_îÀn‰™rı )LT³fĤ_°İ ’Q+nÀ.²‰ş3Çĝd˘…Aş‹ħ{WŻ9Ġ2iġêb÷Öv ( 1NdĤ9cTìp Ǔ ÎhŜ!b(=§lPïé''ħ鉙ş÷ióH|ġ?17ˆ5˙i]ÜrAb2ş3Żŝ4.•Áë—âHŠL)’kϚ³˘Ó •dúŝôcñ—6†ˆĝÓĞ7Šj¤Äş-$fgLVì 9ϲÓëBóKZ€3„Ċ8‡:KO@kâDhcÏŬ :–IZŬ– S³-)EDz7 sä\w gö'q“X>|’<Ĉ}@<zic ° ˜ŻŸŠ‹Víĝ`}@îŝÚ÷qg¤§ÇpİŒìÚm4çq!!ÜçíWè%g İX#ÌĴY³úT|ġÀĉĴżŠ[üIŬ=…ΟĴâ9KàZñùŝXĞ„œı”|¤.Q;Ì‰ZEjĉ¸İ)óàİSˆ§ıݽà 1qvž–ÑYs”²j@úZâĦ`w…`0"CÒÖi*8Èè8ÛH›É^Aë‰O:ĈRĥ{> aû(>‚t4à2fèZl˘ AcÒĤ&鸉:êÙe„Ċœ“dNœA:céÏŭHhÈuŜƒ¤6IĜÚuZ˜Ĵ`°Œ“:äĞmN {sšEħ×êökĞW?m­äÓ ’ó:u[Š$ ¤·NBÍî'ÏB&ċċ ™dÊï‰E4ë$ÌĤ­yiê†7Z£Ż­™bdÖíÁĤƒD7‘³İš1ìÂ*·'4Jâ˜=T˜ulaŬ^âê× O_żzġk˘6ŭ•-+ $ş‰ Ò&[B†ô8žgÎä ’ç‡ENë6 rÂĝôFĉı˘÷Šn$ ’Ú„nİ}İgß+ì[òáşK2ĞS GRÏ8²ó´c‡&E˜• so\dŬ–Kh$ċ€ôߎtİSıaA2Ӝ‹Tl>dI Há·˘Ùqû4yĉÉ‹=}‹sš~(~5Áyx’r@ĥHÍJµÙâÒM̈́°Ö£H†n^§/8+…#LOd=<[O<6"fŠ`Ĥñg;‚tӘğİB‚DÚĈT46,ù1ÇcÙİ ’Ĉ–}ĞÛħ×ç4ĥ´d/Ż)Â>f d§€’i´í‹"EB¸-ä£È~dëHêzÏ!tUL•D”U@2lŜk „Ó›^̆Ü-Ä` ĠݐŽ÷fEÉDĵêÌ#¸yĵŻ€ İ[Y‡ÄuGÈ£ÂZfFçbES™$C†–FĜFĈBÖ½éŽCŽÌs‚ŽwüÔcLF.m8ċı"mDŝÖFHtĈ"vcBS7˘GCĝħH2Ž}qc˜“˘˜>>ĥñéĠ§ˆh<ĥñ3é&ҙroÑ)drDFîÁğ2@öíCz‘úÌPL˘ÍŽĦn(ĉk…$C-ĵĉgµc!‚í^­×Ğ_‹­~ <À§ËLÔv÷DsĠè(qêÑ‚DÇ5Éfç\"-š\Ë2PÈ·Xôí âܟ˜Cψsdïġ§ÖLe‚ìO=cL„Âämmd€D÷{%-óhVÍv£S*˜JH:ôáÈéáŝŜîîžŝ!¸K–ékqЇĠoŒë7Ŝĝ™ŒFrˆœIU$.ôœB‚|éÈ$ëoŻE¸œzòk¸;ëïë%ÉC$\°ü {Ç'²Lĵġ.ñ ş÷Ŝ—VO½öWmݽvŭÓUġdÊlÇ È1#­ÍŜ‚DˆI[ĉ+pİ)n¨ŬÏX‘İeùfĈúI²ç•,˙qP<Ĥcğ÷ĝkρjúĜTfĜXị̂鵵 ¤˙–\ ÇıĦ_’Ĝœ˜ċP÷Éĥ̞ŞÈ…ˆ ŭpŸ~Ab*T”‡~gwá@Ŝž+zñ¤ÚaR-3=ìê!‚ˆċgß"{#‚x&fĈ #¨üŒ%ŬĠŜ‚ÒÛË7ږҋô~%jëFF<Ùq-ÒQ·CÑìĜ/h"{çqa3^àye8’OiĥO=Z0íúÙñ™äÌM)1—e³GIÛóbQ4¨uCİñÜ;ħç;˘Ċ§ž÷%1Eâşı èĝ}ÁµTĦ@˘ŬȄÓp2Ëù‰ĥ Ġñè‡ÉîoĊò°ùJvĞ%~˙ĜĈçVĝkO˙pÍs93ŜQ[ovö4Û[ÈÛ˙‘ûٗl"#qİ‹Â#{Ŝ4ffl™LÓ\Ö8™ÇŜâê—Xżàħ{EÎàgĊ2@˘›n´˙S8MGrdŸzlRq!sdw„·•Cš$kP`ÇZ*<ï5˙tÜú7ĵ!ÚŻ†‰.´Ŝ^8ƒÈŽ@„‰Iŭˆ_ıÎÎé!žmdA#Gwë!IDATÂNş_jäĠz†’àe€œEfŽd]Á@>:…w#'˘bpİYŭ^Ê ½ċ$I$0½ñġcasû×?}JôÚĝ{8e€Œ#ƒDô£ßç)HŞ>Gîg”œ”ŜÁ)jÙáÒYán‚$ rÎö͌~.ĉiÂÔ}gĈ/ċô 2ŬŸ8zqd7Ĝ rS‘mkM·¨ŠÀyáVDŸ §‘ĥŜ¨ôX“—1‰Xú%g´yÌ#JyKŽ¸Ş·3‡'—+‚îӄÑğĊŝ•7;Ħ“ĦÙNżÙĢ=ò|säɵ+™~ZN÷VĴEĜQ•˘Í*$ Aúvè¤H‚Md6xg2ğċĉLdeƒlžHUY Ë+VÙŭŸA‚tpF{ ë‘1­Xr€ëwˆ•>âŜÍ÷u›-"‰ĉ=ә£ˆÑĦ ò’Û`ւRUûóÒH?İQêjuµ˙3Ïa]†éCÙ)Y–ınÛúß0xûêŻ÷ ‡Tİ*}ş Ĉ[fq ĞԚJ*_ŜòŞr—Bë˙ŭ{ħ dzD ‘q)•.™/dÇ'ĊĠëĠO}íÏ-ÙÁ<$Ï#ÊLMY‘ ‘Ž›G+ó˙óĠÈ*{‚ĵeŻxyA(Ÿ!ŸÏz罨Żdżó,ùĉ+·˙ŝ³‡ÙĥOì½ğDŭ™Ì“}Ëöuá%çú ˙ ˜G+£ĉRİĦUĠjeŞ=DNÏG#£Ŭ\€‰È×nxêÏÖDċ8÷B_Ĉ–9A üVó<4R]~]m_UQîÂä€%"=MšŬFÎ$l‚ŠoÍ ×1Z ŬFnd>m$Ù<Ÿ6RROgµû-ñùXíñC\ë·Ú³à+â½ŻÒĴö$où!ùV;‚¤T*ŭH+—G&[„9Ëù‘˘'”äG:Ÿ9M6/Pd“DE6YÑHbҝhd‡ħEŒ¤´È†?D~dsšüۅ‰µ£ĥiR&+¤M>‘`—›9Â=.’’bíHgݤÖkj/~ö§•ÍËôŠ$ûf"İç ‰Ôët³šM=b#¤LòÇmÊÏŝ ²/L>rS¤ô|dĖ4ŞÂ…:’3“ö)£÷!‘ŸGöWeŒ¨8gòó‘ŭ¤wa2äs–£rҤ yÚ;Ì L­02ô’˜˜ˆmĥÌÁ4ydÈmߤĤÏfó¨œ4İö3Ü<ŜȜôJ i‰ßߍ6À ñ~F%>ò,P/˘¨F†[ÍvFŝ:sô~ĈÚ!'Ż—Vğe‰šÍËŜÊîEœ&˙ĵ` ÑŭÚ>ˆĥ‘Òûµ#i[•1D?s – 1.F380ŬѵuÏIë+D™óqòÏ ?ÒB,Ż+c¤Ċ\wÚ{JMá­ Ä †R$h…ÌbÇs-䏴:toÁÚHüĜQ?2nEú?ƒ‚9-½ÖÀÌú1ŝêJü¨2áÍâĈŝ¤­ÖQÁè.ùcŽ’µP£Ñşmbħr  û:~̒WvƒGaxΑ”6M8ϝˆĦÌyç7 7-ÇĝHħX7>R>ò:sƒD8&œ /Ìs@’ni#…óLÑ£ Qïœ#Ÿ-ÜĝÈ#vZDߑ:b—?ĵÀgÈZċ"{ 91ˆ[s„I¤sÂyĤèğ¨bœüZáFìҏžÂLú-9).!c~0ż+œSYPcȅ*k­’ƒ²ÇŸ8ôTáĈç˜Ġp‚œÁç âĝı7£ƒÎj Â95҉ÓÈÔ#œÎšĝÜ"{VCOçíœĠ€Ÿg#2bÛH Gr§żÏڙAü<›¨CĈ͔OŻ!–µV fî"?!û 9=?óK¤1.gĉ×tŞ‹0aŻC-ĵĠûDg~ "IĤô}2kÚG5é“äh!g~Ħç"¨Vd0ZŽÈƒ?1ړ¨Û)ż‡qd.à— 2œš‹ˆ"™Z½+ÚcvÊɟ‹8tèùBÎE¤n‰!Ŭ/Fl¤EŽäŒ`vlbÚXĤ˙:Hĝ²’ħ?;–µƒİ³ Ç-„Ñ•ñtw~£³cñóµEƒmü/ŝÒs /…óµ™ô|íhÈ)mv4iiz"’“¤¨1B+è|í+ˆuÚÄñ+×½eŭĉĴġ‹ĉ–}zĞÛş×í4Dö ċ"$S+D{³M Ú#›E<ô“äxaW@ŻiIqGżĤEkŒgnzE8rp›÷ş}AÑ.{ÍÈԚC½K1‚•˙Ea×´ÀĴ²ÚüaQ˙×$ÍññUò"ŸUŸ…$SĞĴŒ“ÙR1K !ġ¨·ÀĞĴàÖŭqÇO“'ĊÛOÜş?ĵÁ˙Ç҃^8uĤ;;³ƒÌ´Gŭ49Zàu+Q!ÌvVž‡ 3íà{&ËÄJ)X‰*ÑİéĈ†lKƒĴ ¨é‘äıŻD…‰m˘-1ñŒ$4)¸µÑÌk£µ§ïL^ ùk£qoî()âÙ&$dÔ)´ž¨„$ ¸ZÂÚàWë §WëkOf{+Ò@fĴ֗Ü%´_l4e¨•‘ëüœ&‡zµ>üú‘k“c…Ŭä\ŝqÑ>È_?r€<&öĵ}qıñá1ò\Á׏įhŠshÊ*IÒïéG5“RW4M¸âÂM²DûÜ$˜s¸j^ÁW4Ċħ;’½P_êYcuvƒöߝô{"=/mŬ îOÍ#ûçÄ<ùkìž$NJ°Ĉ.~ĠçìµA’¨rúœögl˘i$IĞ>ÎDŽ’Ç˘9½-aë)^³{ÉHV}Ĉ­CŜ2‹j$sĴ² ÜùÌuȧĊIÊX‡|şG|Ô>…5Jô×Ó İ-Â:äôîL3%uKÁMv7$ÇòlaWĈ·£³K˘ġ„c4а2>~݆ıìE-RA[Çq6ĉ8È×Éaù cp5w15Dvž˙n×:ÄQKwqöjÀíbdÏlHb@§ ÜÙğ‡Dzı âċ€LìòÊ7ÉŜñOp‹ŭ"˘`jг{v?$˘Náš'wz?›ô/çHÛ¤, Û:Ì “ä3S¨FaĦâĜde?ìKĔYñ÷…ħ…;,YÈé ƒtlĈğɞÉAÄp\fTFÜ8‚èĴ9QĴ–{~Ħë6ÂŜdŽ`Ĵ™ġkş—]FIHnÏŻ3GIËpĠûÄmË fFô“3ĊÚó ğ ]Ë$:}3 â9ĈÙ]è2ÓX'Ù;)d°F“ŭ$9pÙûÀyìBÇ*Ò.t´³/˘Ûj³IÌ=Šq„½Ġ-#iĞ9a!{Ççr€„û"FĈ{I²?UDĈ²8pkÚĦöE<*XÑöEÄîÔıïÊ'‡†!GĜRġi”3Ò6<ƒvî;>=d#-™JÉvsÄNÓpĊà˘íԉ‹·Îï#³7ñì½cġȽcÓ ĥ‘dïèôbïĜŻ??ÔM’Ŭl~ïĜY„!<´‚Ùä/HÜnĈÌ^KmZı9²ZI¸3nüôħN’´{a2 ċ£‘Ÿ½Ì·,à­“bqw8³}‰çݐ‡wÓĊ‰Ŭ_ÛŭڕìŻ­ÇTĥ°“0 Ĥ÷׎Lžèĥ‡H[o˙ÀèèĜèÀÑ ŞdgïèT#M2ÇŝڈèŠŬŜW<ĜßżŽ17ĵßġ2w|˙Ù £Çzl °X,ĥ£C'§çpı pŞc(ŸßÏ@“=(͉Ì$u÷ĉòŸς%ßÖG%qäĜm$£; …Ñ ,žúٛŻ<˙ÔSßċÍȜ„ĴZ8ñô°Cˆì]tñ@Òí{0*ù Tz7Ñ™%sä Á„Ûl4DËŜğ‚ëN_HâW$ƒ-ĝ/ Rìf£S›¨b‚ôoÂmàó,Ĉ‚A·#&ƒ£ĵ|d–H†Z‚ĜÏ RŬjĉZìgž éfŒ˙>y›]0:Ŭùói &É„²£Ĝ$û>ù‚ôoÀ¨d4‡JÎ/g@Ĉwùr|À‰èò‚ó~:¤+d~ éĤ̵½‰WI7q[ Ħ+-„ìÜM&³Á[l^œJfïŸĈh˜­ħġzKQñO³;šèbƒÄċwĊĉ8Âġ³ 2Àڙ̰)§x÷ĉœ ÎC“ù‚ÄĞä ¤/™°31§!\tÁô m=Á†g‡ċ(d ñ­d¤Ó6‡ÈŽ$;$iğC²şä&Ù]„ċ)dŜ ñ*9&žàÍô{‚-b‚ ĴÑ /($žmŞ#ŬìD>ä|@â}ÉıìIYñ ¸ĠÙ˘œ ||Ï<$–"lċ(Аŝ…éß4…ı‘ìiBÙqaÌ)§zËu Á‰èd1ücœóŜd*dŝ é{âXh<GĥĈ-ȐÁÊdÇ8!a)cŸëì„=?§6ù $u÷ ŜŜü"w>œ1냅9ëE$ 3şQƒĤ ÄÛé…IwĠáÜêqò[ÑÜùX€p† r‚03ˆ¸;”•…Ê.CÜĝĞ’óIa½re½ÀHȇ3NŝLù ™[ƒè\P(#/:‹xüìž9LM½p  „³7›íû1żG¤‹Ĉ0+ȰëSIžxrB‰\K3OôÇĝÊm•À‘í84cóɸ[œ³9ò“ĦĴ#Ŝ³ïá&”Lȵ4óIĠc#ĊgX—WBŝ1`8ˆÍ dĜI8rĥĥÉ*GÙÏġÜĊêşè…I÷Ġà‿ĉ–Ä‘Ġê ç 24gï"F8>İ­°:š¨…I7cÉi‹í)·ä|xÈJXƒħ<@†}ƒO˘C:B *ċ6g ĉQħç 2GċFñ½ÒÁYŸžp†b²@†F˙ìœ]nÔµv³c˘²]ÈB€¤û°–Ԗg[Ŭ²rÚnÀ2ÈH ùŒ„9 'K&ÌâùÉIK'—h˧bÏ$} wǟ%‡ ²H–€ÎAw‰aAĈB+Ñꘐ—kƒz#9ŬiáÒúZ?½( ݆¸~…_ô'ı= Lilm5ğ!&$ Ž8zë ìN´kgDHĤĉ¤05vzq@ÒŜMÈÉn=ŸħY&Íĉh\~ œf=Ñb0;œnŸÏÙ2âs;f#Ñ˘7Z}A&3[8ż'‹dz–Ôžfzħ@Ò](rd£…3C>÷Ôż$h|tûä–‘ÔXA~rĤ;9³çpµx Q>Ç6ĥiwk(>ż’_ż6/ŭ™ÑwË`¤9j½ô"‚¤:0Ħca›ĉÍŝX ³üžË LÏ4›Şé˘$íżû8†#œöÓ="ÜħE"4)’glÉù¸L~dAo2˜eŻ^=6™Ċ ´dy›vOvZ’ıü<=ÈB‚g ’´MÇÜ­ÁĊÉ8ÄVMburÜbIÎ\Ìß$Ë GXğm“ñ`Ğ3ĥ Cz‡¨ûhMOĠ;žżĦ)$Hj÷ž†#|ô§ŒÙZh17 "Ÿ%{’ŬĈÚ>z)€Ĥğ-yıNQŻ4F'Ħ/œ§ÍÉdHoF@‘~ò[?Kž~ğ° i}ŽcrvXzÇa@Î: ¤ÛuĤ›LĉÌçËħ€ É8ŽÀñí%"P)Ì€Œ+òO´XĈ’^T];½t@ÒŜğà8²uİwšá‹-Ȑ­ü‘ 3nĤħ™^J iOíq'>Şĉĉ‡Ìú@ħA†˜Ç5ŬKö'–âÁĈfji¤]µûrÔÚñNÎݎƒĊɸq8cî*8ż§ <’.°‹NÄzY(e1]Š …éNÎf Ħ…İİŞRsBYYħúpŽ›­S'Ü”ĊÉ8 Ĉ]·ħ6/QĤÖ\_•ċš¨Ş2-*H“ËUngE•ÖëŞ˙Nw’XD%`ÎdȊN4ÓÏ[âaŞî€ÇTî×)U4]ĉòR‹\µŭċvV(*ĞLŜúĥ\÷ ê–-‘q ‚Ûd,pÛ=ëÌTGà‡·ÓÚjEĞ È*…gqARÊjN¸ĵşrÚßĈHQÊDpvLA@†œ„Û§8ÙKvgŽÛ Ž´FYégAş<>3ħĞTRœ³ SۓLd€ìLNûM˜ kîÀœ Cn½ŜUî™Ò2”9/˙x-ÏĴrħ iZĞXTŞ*µĞ ŞJ É67NċTŸÉž í`|ĈVs`6o!·p⇠D†-ë‡Àòz˜§Pİ”U~Uyı•ë¤]§ÓyĦğt&ınŻÌI22Ê[&§Ġh ZZ˘u<2Í·ôaӝd÷˜` İ= úêIÓ}’Ş7ĵ[ Ù=ŠY0(ôa†‰ÊËħ+}ġŽ O¨iĤèĞ $íoŞ“–.›²‘ŭ“s…ÌGNž°8kêx´­àĠşĝ Ħġî`¤kO÷™œî!ɞÑsÙçilòÒW!HÚÛÔ(5[6Í.s6t&:_,EÛÀdö‰˜ŽÚvŠ*A›#U)ñıÉDp:’7ÈÈénÄ)@ëX$u\P)ëˆÉŬpͳáɈl‘ÉáŜN Ô'&E ÓV,u\  ĵ{ϔôšëŠÙÙsb|:"däÌɁ¸t_˙jÁ´5ğ½ĊğĊ…Iû›k˵93 `4û‡ÇϜ‹ AFf&LJûğ;ÁgğûGÏ }¨@c}_1ïp@‚ħİî¸L˙%23>t”]ïbë>úìèĜĝ$(gΜòôĝĜ‰ŝŜn›%ûô Ĉyš*f­^X ~×7Ĉe—ıÈôĝ@o ™,ì ‹­çèÀ(hÚÎtÔ4û‹|w ’ĤÊ|ÇíFO}cfzr||ltttxx(çéÉés‘ˆ”°ŽšŬž˘ßÜB‚MeûŬù˘ÌwÀĜÔ··ĥ° !Êĵ*x  ƒäP_ µÑÚ˘R/HĜV6ÔtLäàžÚfï‚ŬÔb€„ ĥŬµ{‹ rŞ£Ŭż€w´H AÜĜ^/K-ċ€ŒßSğğZûY4 †µl”<ĉT:ÈÁĥš†vïBßÍ"‚„†§ĞİĥñÈTá@ĈĊúfÏ"ÜÊâ‚L°Ĵë$sdOMŭÒK$˲ıĤíÈİù€Œ vÔĠ6´{í&–HĜ^zÚîŻÙs$Ïâ ÌħıÏż˜w°D@rĈ§kw}M]ۑÁ¨ä‘§ŽXßp>ïb_ŭÉyE}íğëïßP×ÖqdAƒŒ:~ĜúxMí£ Í]j)\ĝRÉ5š œ ġ÷×nĜP·§ÚÑqĝáŽÇCÙa%oß°éŝGvèZ|=\⠓uŬëéëëëj?°”†(›´wġġyĵŝ%wħKäUUJ ?5 핕U. Ê+i58*ÌÛò¸üj%í÷Wİíµ²rE݆£ü]ş*ÚTQ™ÑT7G­€sJ çĊÑgCéhS%5ùŸzĤċ•J-­+§hJQUa*ÌÛĜĜív/vXğĦK K~dİ”@–@–@–@–@–@–@–@–J d d d dİ”@–@–@–@–@–@–@–@–J 䂁ü×ó2r1­‘2˙RYYYY*%%%ŸFŜ]Î~|Ŝ´ŻJäÒ~Ĝ|ŝüÒÂÈOH—+і'›ô³*ĠyVhU:ĝڕŝĵVebĊÛŞÊ·+áq d¤JUÒnU.Hòeğ×î…8Ï_Öêì Ġy°Iùk–5|ĦĠÁ£Jġ‡%BTıUĠem•h!ò²ÉîÁä5ù9ŝ·UŞ_s /İ.›è˗.İJ ³AşŜ>вğì)vżT™4IT $šÚY™yVëÍ V{Y{VĞeÛCPu]Pĵ­:oÒÁcp#o³F‰VûC `ğIİJU[şĠ†ġ;ħdµŻ ÷çÊÒ.Ÿ˙p‰_!Y^Š“ QÔ˖iKĉ_´ô²eËÊU2Ï˘ĤŻü¨½ı|î41òIENDB`‚gamera-3.3.3/doc/src/images/matplotlib_example5.png0000644000076500000000000015437110714675724021250 0ustar chriswheel‰PNG  IHDR‘>ÓżĦÂPLTE   %-4$=EMQWZ`cjmsw~ƒ(*(‰”3W˜ 120¤'2WĞŻ¸9;8*;hÌ=?<|-×h02Ú0DrŜĉ1F‚WŠMJ(GHEò6Jz¨­ü˙÷í ?Or‡TQ=7S‹>T„ƒDóúoŬ ·îĈ[‡áÖaë–x€G½˙PŜ[ûáÖŝà­ûž·î{VÜïÈ£>°gâ··² ní²o=·ÄO<·[ÛáÖv  oÑx}Ô\t‡ñYġ(ۍGħ~Fè3ĜcŬšèo‰ŻUÔ+I·û~Xï xÛïoÈğ·ÄċÑ'è;îßżò'á8zßIáEúâIäöí÷ïß}ûŬ‡yä‘Ïĵ`_G\î֗C—û÷G]ž—û²GŬòŬ§.„\˘/ğìË—/?‘ﳏlWZğv=b-ù1~É£ò?€ĝdäO ŭıçĴ~™°_ġ°‹ïµÚŸ÷ĊŜŸï=˘Kԛ쇁ˆĜŽĵĴŒÀİû~$òMä}û·?²Ÿ\ĝs€Ë!ëÖ8żâ~ë‚/Ê}ÏF WÀċ pùò.yùŠ}+ ‚Èˏ†\‘ı._ĥ>ď÷ˆ'ñ/ż é;ĝ._ŝŠ~äñŸñLC~#ş¨_ş¸×êiù:,êËĝï›˙Ž‚AĜ‘ï˜ô}“–ußÛßÄ˙Ŝ !ò›ĝßÔDÜ¨@ Y ‹t×ènŸIÜS Ÿ}A]Œ7­@ż¤/Ûċ…xÚnħĝ#‡Ż?ĵ|ċvE£¸?àÉû&JĊzûYùĊä—ßú‘?Iš_ĥ߂1´/ĦïÂŝ˘´mċÊÈGĥû‰|g\"ĊÇo÷DÂgŜĉÏ‘K‡~ĝá•/ˆ Ŝò_/wëËŝˆË}OeO—/èË.¸o—ĵġ…'Ĵ˗£._²oÑċ‘àċaórùò}êCÙr]üúĝöÛċŭĝu—Żüî7xċûéN~PñĊ_zÔŝıö ğĝ~-˙/­^˘^Äûöç{Sôûö†½û+_xP\”›vŸMä;ï`#ċ]Aéƒu%[xñ“|Pü‡|pşġ™Câ–xš·ö­ŭâÖŬpënûÖ}{Ä-ñò~ë pKĵâÖ.uë ¸ġD[_†[_V··„·[o]ü§ï\~éOßğüҗŝäßĤîáŸ]rċ?Šğß{ûQ"ò‡ï\yû{òŭâ˗|ò•ߟ§G÷}á˗/ßŝ%ġĊ_zżĜŝiŞç˘ž•~ĤünğìWcτ^ÓûBŜ™ğĠûö™ŭ„aĝûğò&âaĵ_ŒĉÙ"ò?‘xŸH ]ˆéƒu%9ÇAù~&ì²?âżçƒŸ}níħnŬ‡ڗûÔċ xÙe_ž(öo=_˙rùÊÏxċ²ĝïŬ{˙ä{ŭž0upùʽ+Ż\ùù?\ùš½^ŝğŻŝìʳòŭh‘ù‡Ä#<,nßŝÄ/żzû#ê‹żG_üĠ̟{˜ŝ£Ï£s(ŭl‹żâûiú EoÔQ›·ŜÁ‹ïÎğyûŜÁÏD½Ó ìşÑŽBä/4‘ïH"aîäï_g)é}çż0#›Ê‘<\˜#i8$y}– i;’‘T~ıÀKJAÎCâżÄúŜğ˙„‘ Q÷€Ĝˆá_ÁêCómó?ü<ùš÷Ŝğòö•È/>äí_†/˘ŸQÌó‹rÏ$É=3ÑŜd˜#I·ĊÛFä/~ô#ûşojì4‘ïÈġ I$žÙï`ûŬ/äÍ>ŽŸ>¸?ogĦÙÇó쒗BóQFp;Ù7 j;ĝËoà§~yċ³ü ßŜÎ_ŝӒâöW,nm§/Ŝ_üÜYÀ3ùôïVHZòé¨Ëŝĵ ÊC…½y”ÛéĴmeN…Ŝ§‰4?ó ufómo§Ĵ½@SŬ:ĵ²ûÛï‡[ñ7oÊ{k˙v:KÜzníÙNçÛxZŬÚSÄ-8ŸÙŝĵoÜÚµÎD·àLċ+OÈ[ÛáÖeà•+ûxùÊCÛyċëâî{˙áòKx÷ŻüŬŭċgoçûĥíüyñ(àÇĝx/Ŝ~ZŜgġ€zö_)ú7ׯÚŭpëg£^çŭżG‡ á}XŬ§Ŝi|ÏïĥˆĜŽ':tˆ(Ïl8zŸ"ÒúŒ"’œĜıuŜ³ì‡ÔE^?´?ê¸vż:ÖĊŻ{Ú>ô 9ŝġŸ?m_BΔé(šƒ˙~ĝËwż×rċĠ‡~ĝËË˙|Żĵ?ġŭ_Šùö{Ÿ ûċ—ÓçaÁÇx‚ †ó‡Ĉ=p÷Y…žjĞ‹ñä}Ġ²ğġË}}xb߇é‘WFàTè}LäOŝò­E•{~hϞ=éâ¸ġU¸ġĠ°*ž°ËáKH=OXñJXÏ7 ¸Zp~ıŭöoìıŭö]ß˙=¸òö{żpûí{´vïÛoż÷v‰OïÚó…•âĥĝrq˙Ċ}mâoìzîǃOC<ĜïúŸF…Hŝ҂ ЧtiCQAa|Ïżjßş—‰¨^VFáTè}‚HúÀZx×JR\úŭñ//¨/V·B/‡Ċċë\ٗ°û"/ûĊċŠìy:ê"ˆŒ |zOïüißÈû\ ŝU}/Îá".ċ}£Œ7ôû…]­]…SĦ÷ "˙)b­<üôž§żŝÂÓ{žŭê÷ŸŬ³_\ž}ĥË×ġċ…É^/p.a·ŠżìÏwÙ—§÷˙Ŭ7on…-ŝykäšÄċ°}9ñşLŝĊVïÛW‹½ìùú âOë+˙i’+‘ûÍuh˙ĦïÚ˙ġŻœŭq^œC&'˙DŝQÄZùëñŠWħkċMr "ßëŠZ/iX/NôsĝÀ/FŻ+~ó¤~rĵĤĈ’DŞ;ĝ½ŝŽ'ú9ŝŠoż÷ ä•+’u·ŭù۟ËGäßŝÚ´âˆ4ž+ŒÈgžYŭ^”ĵcñê­o1Ĵ`"û·c"ŻÈĉ–×O6’šşÛŝüò?wÛŻŬ{›XÓÌÏŬ‹wŬvۏ|Y#Yœœ>ŭĊS-§^”Lú‰”Ìùˆĵ땓wŭì-ı~öùßùo1‘×NdSòúówŬuòurÊŝċ¸BR)€|÷o?öw/_~Ŝß´ˆüñÛF˙óŸżôFÒ"ršMä4żœŝÌëoûîİ7Ŝ}fz€È§žZŭKm#·nĠDn~ċĝĞ˙ŻżG&&Ö´żŝíx×f"›’áñ×8‘òŜk'%’’ÈÛwùŬ—żŭĜ·üó7~ŝÒçl"ŝŸżŭó—^zì1I“Èi~"§Ù6RùîğoĵñÓW%’~"ÙBeyÇ+Ǐß:m³`›È˜Èk$²)ıċúg^&òŻŝ§?%ŒdËÖĊ%ĤÇvÛ ĉŭĜcÉżô˜Èw^ú6|îk_{ìŸK_Ò rZÈi–œ.€H~÷ĠW_}7„ȧt>rĞ&rڕ÷NAĊ†‚rÚ_O‹#›k*²A"˙Ÿ½ġ³/~êÊ{Ż=µĜŠ^~ŭs=@w_óyÛÛ?˙éG}ÎOd¸µa#§żĝĉğd#ôê/N÷ù8Ż­´$‘Ğßü—+ċóÏ”Чŭ·iqöçZŠlŜ,yŝµyï÷ŜúÙ_ŭĠ§ß ùĉo"’ß~îı—Ÿ{îÛ"Ÿ{îGÏ=÷ÜcÏ) #’ÎlĤ·ĵûĈğoĵúêw_}ùċWê'ÒĉQıdĠß(Ÿ(7O[½ġñ§ĤĊD^3‘ĝùż˙ìï˙ĝ÷?ŭŜżĵöĵHä·ôÜ×ö9X+m"ñÏ=fYĜMçÚÓ˙QHAäĞ?zùğo„ĥkßĠò×Ê<óԁçWÇD^3‘&òŻ~?œH´’Ÿğí7qŭšE$Y½Û-€üµ°ìOddC5?Ó[Nŭôğ?ŭîĞßyùċï„ÚÈĠoŝÚk--ĞŸ~ġÖÍʏ|ŝTKKËk-Êgžz~ġ]1‘×Nd£ˆüß˙b8‘ÉÏċ͐?fYXö‡›ß}-äËßy9èGŠ {ġëĞW·´ĵ²úÀĠ›‘âwyêù“ŻĵÒ\öڕ÷Zî¸+ĥ‘×TdCDŝ}4‘€dŜsíÏ{Š(‘{ĥàñċï|'$Öġê×Vo"ŸyĈ$JCĤ=~àĝ)%pùü]w,^y E6HäoŭŭïGùĉŻç­ŭù\ŜJ‹|D>#ŒäËßŭÎËŻûbÈ"ò•SĞŸzÊ&’ Üú̋ÇOŝo˙Çİ­w-Žcík/²ù­?ÎG¤@2‘T£E HBdó†òä˙f#……)ŝu½t&744<”M{.=q– Ëñ˙ùžĴÎÖşŞcuí]}â‡Ĥ2ıÁĦĦÁܓOĤ3™lnPĴ\V<~`ÇyêqX×?Uäğw|ڕ"×S›Żz"éM #ŜU`ĈOd˘y¤o_ןèélkmƒĠÑÙŬ“°ˆÄ·óÉ("“ô`LdOw—ÀJü˜äxDh"ĝ‹ßÙ)ì³‰LôZż~ħÀ ˆDЧ÷$ħüÉÁ§G§ÀŬTñ‡ÒĠÑ.žR‚˙2Á˙×Àdsı™È˜È"-'2ÌуĠ‹ğjŸ ’îäoA· ˆì„ †£’à>ĉ8N4‘†+)·ÙÂWR) d{[<ž^ò$8*K::†‹r’ŭ\eHS÷Ó?òè߄€„? ?â½.2!_(zlr2 ȘH“Ȥáú‡8zIvöI49IŒ à­A“#ˆìë ĠE> 3PÌÂhžyL(÷´o–¨üf 2Ħˆtäs7‰tM¨“t?Cħo§Rž €]ı0bœC‰Äûpż@wŒ$gúÈJFDĤ=7&2’HóŻÜxŭ[+éwËàÏ^„ŬX >“Ĉf8axÉd²00…‰?xĦùlĦ6Yiäµôŭr{VÛ´üġL"]ÚòCˆT94”Mıè€É÷{ ìz>k;a"˙µÈuuyÇôéÏÉ[JVż"˙ٜ48è÷‘'IíÁó›ħĥÀ˘³Ğ‹ ‚ñB' AKzĈMF< ż]J˘³†@ ·2OĈB¤¤J^‰4’2ŽJ!‘éL‘ôj )h oŭ} #ïg"Ñ5°œÎǔÈǑHñ{oŜ*˙ٜTéä 74ö–Ŝ^"é38Êb°ÛĠ-?‘‰Ä¸ŽaR-#|D&àoĦ½µ ì (‚SN>rÔߐ"²7$Òf|L’­Ìä(ıîż)•†T#ĉÓ)È08ŭbéGWÂA)]U!>ĤDĥœD"?ñJËó·È6' ‹Caoo"ĝĉ“·§"OGŸ˜~éîĥ3‘Ö†<‘ô›ÒD%Êó鰉lnhjnmk݁!óÒŝíĠż•Ë ĠL…[lŞŻ6¸Le3œ:ò f/#x™a‹ĝ@žüȟL93' ȏ;‘§>7ĝŸÍò5ÑñK‘Ž !Cˆ*áT'” ˘VaDöSâ§­ıħ ’Ħà5("UÖÑFҴ’H…¤0’>$½"ñ§epAz=›ËA ->ÈxÒ´Db~VšÏ-&Rù-ħŝF/aD²‘Ô‡èXa°íPž£×L$úˆì‘½=îÚŭŭ˜ĝ/’rO=j#ö ÏíşN"Ġ_—Êó˜Y íJZDf(ħc=(ܛ% ™J™ö<ÉüDşW´8p $Ŝµo1ˆÄœcww8‘Žħ³’ßäŞw+p€l N@2,ħ”ŸÈLĞÌDB‡Ĝ³ğş5‘) "dßĥü y,oefÌsɰ2•âqÍċĜ9u„aš­% Ï{\JF%8ÔNˆt'N䯊\W%‘vdc¤šéô:„ÈÛëq=½'ÊÈ5”ŸdŻLb:E!™L°Ġ‹­½SòȘxıx>’¸|…šIÏ Ú£ax9rÎ䆇‡‡rÄ`Êd’Ž\Ÿcûİ6‘ܵ§6‘×OŸvŭġ˜öıùOaD&³:È&Òu"ÂħXÛHh“,$J@nÎjÚ;: ÷GJ Lz{iÜ<•=sİ }O’j Äë"‡ Î,CÇ=tIqN&ĥˆär´‘>Ô?l"ï()Y|ĵċ[Jny^[Ì[a†ÜGdOOhöÇŞ Äƒ^‹Èd"<ŻŽ^ÀxŠÊ™¸ċI9|"ÒMLJtZD0†³Xh“ËeȐ?aÎp’‘žç ŸÍt¨„‹HÊ1’ò.Wù£œüħHw>"´´<.7߁µiĥ˜·"{BCФM$e›•Át"Žf09B¤˙}Uñda'=œŬƒ´<Xt óĜGçîDdF—{ƒÇgëÌ:23´Ásî<ż:ÇÎa|-÷h<ŠTDĤd˜$ÂĠA$|ëġĝÏS‹U`ÑbŜşZˆì‘[_H^ю0½…ğÑU=Ŭ2'“ÈdQY"*ÁûÛ 5hĝ#È?Àż&ĴĜVĠ5N ÉéT'$9ä#àŸÈ N ‘ÊÎJ’ÔDŞXÛ˙2a"?(r)"ï7N•Lżŝ¤Ìşè4ÌĠ@$5/ô/ĉŻvHRn„ĉĤ gßOdŠ€£$߁P>˨ŜA*ïÂF”¤ÇgOÛTyk$Ĉ!REÎ"|OˆżŠ÷é”$’42H)ßQ¤39Y ˙ù/ŝâ/63‘ßBŝâÖĠW)‘ldúz‰ÀÁ_ívGı‘ĈÎfğkĝ˜Ħ™nû]Nڇĉy÷jí˘‘¤ü)VVʆˆ— §ċéq€Èp"ġq ŜµSŞÎ;’HW!bAO€HÚ̍J ˙á8ŜŭaùTÉ)½y_ğĥ$; ü‘.öÚDÉHù‰ì Ϝ‡ċ'2Ż7CV°AjR•g*[W,‘çÉ]Ğ(şĵӊˆD4• ™1 .•½ɔ~hğöÙĴ<%.[ï¸:#›¤:@Œ 2‚9Ddh].uġŝ›i~YYC­ˆ2%İ9‘µcşŝ,İ ß]żĦN&#ˆ´ÊĜœç„Aw‘*¤‰$é8ÖcL˜È÷‹\Dä´ëKJ·ĵXRR²ú”ÌžZĴƒ1‘ú °§G—Íë%ÂM$½ıN˜)‰>Ë Ö‰ 6+M£‰„##ħgw´İĤ M‰N˙|hmüîVA§TYÑ+@¨7i‘ğ7$™ÚÛ¸@2Y€&Ÿ wìúˆÄZ &ÒñÉĊá=‰ż—qˆ´ŭSÉpL¤È„е{óŬ‰´ÍH!Dóß%Í> #ĦŭC]W kښ[ħñ/9^ıN$ÚH‡kĊ}Dbµ£YáÎ' 'Òj/“DĤb"}ğĥ<‚ĉPDšÍQnXŸ^èi`ȝ•#Üŭ•Ž•vĠû/|`Ĵ#oĴoj^ÄO”2X2ac0ċ¨żÇrÍV­Œ:~ÑĥÒü ñh"UW¸²Ĉ˜ˆ‰´‰”ò¨úÈ<‡]t\sj81Ô7ˆtĜ× ?ó&*ch"Md}MC÷"F—¸abİÁ(şây)/HdëÂuy™rduŠċ#2Mùû”küB'òB‘kŞI§ˆ‘ġ‘â^9ùzíj•_RDbx€HíĠ9ĜĦ{:}ÚIö˘‰ĴĞİo£^Äh"ûd8­] TücDbe¸ŞċħÀĞa”qE$=n: O+"ߘÈ("iÛ/M ¤YĞŜڜÔͰ:€ÇS!Jż¸êhƒ}-ÛюHžŻˆµO˙sJG´65Ô5µC¤ĝ\èšÁë;QIvnĴ7ĞËx×ög„‰Lùˆ„~Ċ\6#SüژÈh"£›CrqŞA%$-â†ÄŜŞá‘dUXïÁ‘Ġh’H.µöd‰‘u`'táĆĠаĠĤµİħħµ£;/‘Ĵވš­ˆLû½I/m%ğ "­żF³ž-L)˙ƒ‰Ì‘äy@7'>xLd‘}ÑçË!Ùa3“áÛŭfc‚ë"È?0ô'Dd‘ĥU ŒGĥŠ’RB°ĞĞšżš›!ÔîKŒS–=r½”Ŝ‹½Œ+3Ê#du™ġÇç#Ò_…n¤+"ݞ2£|áIyÈ5Ubm:Š“ò|DÚoâĈ—µ‹LÚu#‰¤˘鵨/@"Ŭ0"Ùá"&L$´ˆ Ħ­½½ ğcğzú‘5ì€A¤ábĤG&WM! `’znŭDş…²•V‚ IDATéĝ‰Li"³1‘D*ñd!qŒĠK*ÛH\½ñÒ^äĊĥRlÒO¤ŻIĠĜ³Ó¤'ˆL$zàÚÛÚÚ ÏĤ•€ ÉFF§ĜUżknÑÒôŸŞ>8ş1ÑvŬ`ĊŻÑúsCšHĠ[;a"ÏıĤ‘‚ĈDż“Œ*”µšP,à뿇H(Œhm֧ɜ2›Wĝƒ †Uŭ¨3-@îccS³2‘tòVŠ˜ICWkSıŝdbÚ ˆZ¨âï($}J!y1ü"Aä$’›˜H›H—„)´B@dé•< 7ˏÈ<‘ d›Û@:ÊG¤g)#ZİÊLš:.Şħµ575Ô×ĠĠĠ7€ve—}ĉ£J΢Œ¤_İԄJĠúΞÓĈßX~"évZ,H$eƒb"C‰Lj"˘‰„Ü™•hóŒˆĜèQ µPŞüW ŠÈy‰Lˆ”6Òuú{Aù\Y[SSS[×LĉvÀŞÔp½üH†Ġô¨nnĊú°È5£şv!Ža}Żc ù{◠Q|Ĉ|rDž-rM5"óv²3…Ò ĝŞĤôYŻÏˆ,sÚ³ŽĉúşĤöÎ"eû”Œ.ÌÌL†Î:úûş; Y[S}˘êD >R ˜ÍġҞëĞD´ŽV ˜|‡.qLÉ|ı†Ş,uó=ˆë?t”U:ÒoTî²<ڙ0‘cEİC业–âÒàÈ Ò1l×ġĠi…+˜vwv4×Ġ6´uvg{0‘Ş'Á 2Ċ pp'ÙÈŞc•ÇNÔ4BrÜ÷äIÊçù™9'PÍáĝì˘#k$ġwh—:ċyŝÔfh-eÀB›ž8OŠ4&2HdtÏ&-ä™ħ!j­ò™´+H…´ı&„Hi$M"üQƒ“ÖT_',äħÊŠÊŞê†6$ÒVĠcŸ`úŜŜ¤­j^ÇÎíÑQˆİŬ6eV˜˜ĊÄNX3…e‡Ukí`›c" $ÒTûÑ6R96j 'ŭÈĉ୉ôRĉ&é˜ =oo{ĥĜ²U­ĴŞ—ġiΎĠÇe+”ù‘Tŭ~$ÙäÛĊş†s‘6},?Ô2Ĉa-ÊÍÄĊ,ú@1‘‘Ž›·*"‘ôù‘ÙÁp" ÒöA";E¤kDzA"é‡a=$îÙ'ŞŞŽĞŽ$ÀÍS úz­É&„°(áU]Œ8³'—6+[pŭDúSôN‘ܢ“1‘6‘NĦDR-UÎOda•B‘m0ħ.‘f½ĥ>¨‰ÖŬ!ölp"ÇŞNT×ÔCı.Ĵ.s˘Žšx‡ĈŬĈœ‘€U éwQÁ°Ħ&šŜĠe4oךÑT ‚Y$ƒ:44a"G‹\SHSĈ”wADrȈlÂ;$F2ˆä‘H]Ŭ=½a‘§Ûv;Ŭí°U{s=†Ù"Ĵİ:!ˆĴ­ohmo7ĉE.ĴŞ!#ž¨žŭÈÓÁŒċä#˙,‡Äʙ }oüg—ĥa–˘‚(Ì;q"GŠ\SçÌ&‘ɤ}d#vĴZ‡”ġN;ùkÇ "ħÒ˘‹L[ĝŬrŜ*"Rok` +EX#V`Žn CĥÏè§tÌd¸I¤šôhÖəž‚˙ğ F–ıLÊôT#†‹¸–$ŜµÓ’ÈÁ˜È"ˆ”>żqœeŝCfÉñ{Bûk+G.ÌĴĦ”°ñÂÜ>6>IĜóE <ЍÂÁ&&%ë›AŒ\£•´ +BM5ûħŻÏDnĞ_8d ԏžĤ#$ûœ<„Hy(›xd Oŝè$"›k”ȁĵDÚÇ)ò¤-Xiċ҃¨Ñħ%UR!:zŝe kŞÀ@­¨8Zޏ L6Pó—QlŞä0èÑHb‹…ú…f3drÈóg4‘Vİ’ac¨@+"ħç#¤ 9\äšb6҉ԍ4Kd Ċİ môwk ;¸M„·z²khV›²ĝ°áw´5Ô @ä1a-šG+U×r>‰… ¤z2½²6”4’0°ÚµƒÇ c 6r(W‘X™—•G\iµSÎ?&2œÈPċOvUxiħBG` ICûÂhX0'(šŒù'(9ö‰hÖ7Š8ğ;E\g5dEE%ÜŞ(/Ö’@]‘v!D¸’”#…ĥzԈ\J"%Ħm´ŝMyÒ=Ċ„jöÒìĝž^&Ò 'R·c놑ŽxSƒCƒ&‘Ĵ'0‰~íĦ"מDĉO‘Ĝŭ)œƒI n™)ç'%`VŬ˘˙üÙ*\½É Ŝ´ÈŠr‚p„u°ĵ²şŽ %Ĵ‘N¤BŜMgÓò݉³ö'ÁH¤Ü€RċRJàğ!ş0RƒÇxĉ2šHN‚ÈÁ"×Ô Ò*òȧŬéİmNĵċ2İF$;‰Ê 5‰ôҞUŒÍTDòa‹È.Ĵħ¨MğĵŒa܋k_Yċ‰Ú†Vħo÷JÙtl’;”MW™ÁĴçHuĥn9Ż š$: ,\Bße"2•2ğ²Óċİ„D ™ËšDJ%}/&Ò$ҒJtŒšŸ pĵ›‡Hkl{>=kŽ&WvE™ò)vm°‘@dÙAInħöî-Ğ8V]Ü=}œïî?N‡&¸}D²$ ›ċ Z"Ò %ÒàÙ|DbiŒ:ĉ1žŞ§QÙĊDçÚrìéù‹aĴŞöİŜ@‰£ £‰ô v ÒĠî "ğ:ۚ`×>*L¤ĉe‰“lET3zħ;k "}‚ß‘İĴżÁK4:ZëkHa"™Ĉ;vìFR7•p˜zŞ(´0̗ŭÔlÚ­M €d›"r ÒÜËJ(V˘KŜ”|]&2[äš DĤ!AüJEL<ò‹G˘‹ÏŬ`#û| ~"Sİ‘†v?ùJ¤ĝ)­ÂFV9¸pD ÉÈdĜıëÉ69ĵ!™Œ"’ĴÖH"[‘HÖÛpò™É ÂY˘J˙D .sĦ÷ž˜HM$xÜY4èœïf"Ç×A'™0‹nìî/­ ‘’ğĥM¤Ê‰D‡Ż³UD6GːDâŽÛ`‘ĦÜWvôXu-ÔAÀ܉ǁÑDò”Qd3‰umk—%ĥÑ&€ä£6~N´ö‚_ Hfgc"5‘i:ÄvH/:VZD"ĊT]aÜtlŬxvìY2|ĉaĥĠÙF$àÓĠZW]Y~pïÎ ˘ĝw‹XĝÁN@òD šIŒ˜{zóéèbŒ³%‘m$IŻĤÚGÍOÌ ›DĤÂĤ‰ù<‘ŻEL¤&’N†‡GFÄîC3€Í*´qˆ„C0‹£Í êH)5 E¤ëë@uMuµ P‹à§³ıö„0‘HĤ€d& IħsóŜÛm ´úˆdQ8ĥ"ÎnäM›T["ˆÔ„y™Ħ‘‘Y½Œ'0Á|Ó@(‘ßP[údˆÌıĤ‘` ‡†GÇFGàĕ ŜäˆÔŭİv²[ۑ”V]–‚:ŽŻ'z@)0@KCw{ƒ0‘bÏ&·˜[îÙRşiÓşu›Ä‡{BżlM]}¨Ż>U2TŸJ °sâ§ħĦħ‘t„pB²ħkµ§ĞAÓµ1ĜN1‘žQbġhë6mUOgb"D"çΏ fhÑ/€H×"RuQ% "=)ŸƒDĤt€Êŝ*—em™°9H„+(P5×VUàž-8Dğ(€ĵ§túukVĴ+Ŭ²c÷r(ߤĜıÛ;¸ñ&ŠH‡ĵHa"›Ċ74m|Œ˜4[µ‚áĊÊzTÚÛäƒüÍÁ›ĦË3Șȑâ|xä̅‹gGri*´/ÑĝD:‘Ùjš4´÷àí1Uœ]ù~)Ħf“\6ċ:Ħ²ŜÖñwút˘ODÚĠ•e¤Q0I˙–_ğjù²5ĥlÛı·Ĵòtƒ &›Ĝ“L„‰uï Ú´E˜]˘V ÈnİlċŸÈè„Θ5@êw°“LA ³\}ñÑyGIÉâꟓ·”ĴĤÙsúÖGHäàÈè™ó—.Îzêœ$1î¨.ڊÒRÄĈWeĤsµ8iÓ4ìsv5‘/‚H+‘îN÷u·7‚‰Ü Î=÷ ’@äĈ ëï\ħléš ÷lÙDBËlĦDö’ntc}­ˆ‡HüĥdXŸÈ´*ıHEÉnŒ……’`[Y“j2DĤ‹\DägĴŝıÊ&u żôŝû—Î e<ĠߙßDJİ4+m™”Şâž~Ê*óJ^ìiϵN)ULkNMߎM_'*9Ĵ‘D––nĜD.g"Ë%‘ Í"}³Á½Óŭĵk )ˆlTÉuĜ´ ż1’Hy‘ÜµMië’ó9Ö á+áN"û31"[hŒqËU9ÍxxäÜ˙ùĞ.ċҞuJ8îàüËç#iŸ‰Lèuk°îÂ^vĞV•Ì”11) ­ĉ˜qŽĝ˘žÎĥ†šch"Hħ_Â‹DŠ]ûžm;÷U€Ä6­í"m‰É”4’Ld“Ï;0µ.‡âùU÷#ê´lĦkD6†‰DÚŞ€FĈΝbEò éı‘wm–˙\m߇G/üêÊżŝêÒ(l7İSÎ!'Éqğ)ƒNzpdtl8§%TĴdħVD  ‰ÒîöĤÚ*Îü0Ñ@_żVıœ‰Ĵ‹š:R:펜Ñ<žíÄÊôZ4Şx$Ŝ×Ğ…|í˙Á)žž9Y)ċZ)#êŻ4&.q-ùÈĜ…‹΍a7‡Eäž|òÉÏ3‘ßòŠüçŞ#rìü˙úÁûç‡3è?2¤Ŭ˜6šĞjŜ„~ç#2Ў6Ÿ"h€H´şŻµ+Ëbĉ‡Ü@@ "×ĴXħˆÒ"rÀ"Òĥ"š;wŝ<™ŝ°ˆÔğĥäĠÙ =wáìèPĉġ O­Ԙû<<š£­äIsĈ xf= Ә)e"ҍ²sBˆÄ÷W`N$h³)7lÁ£XÂHY_ ĦöQl8nn$šchéñûû¨\—²>X[i™V§!Hš-ċz¤üMDĠd2²Ûô`GGÇĈÎ$ώpƒí„‰t‹\˙ ‰œv}IÉbġÏÉ[Jî›·şġ‘û‘ccäa "Qäİħ­³§?ĵÁ901R9~"ŠHío޳\ rt8†Nsw@ÊSŸÓŭ½˜ĝÁ ‹mL¤rÒ¸Ž\ DîC"…و3:pÌMtM; jmTUFd–óS!HZé*– %’%§¸lh””óÎ2‘éԇMäU!„€€MF tƒ0ccĜÈ6V'„È\ĈwˆğvoÂŞ”Ħ³Bñozïӓg ˜ÓëH:bc%'J~Ĝ‹d݈\ Dî`i,=Ç:Oˏ$Ëç†ö ¸Ér˜ħ)Çĝˆ„ďX#c Š‘™Tç×5Hä YˆWRĜĦÎֆ†zèïéĴÍĈer"ZT˘ħŞSQ+hġ*Ĵ³À|dÖs#½ßÄEםgħg '’ +ĜD·ˆ\·tÛî²£'jéĊ"ÒÉCd’¤ħˆĈ>%֛4­ĵ¤mÈo(ö Fl”˙¨šdıçeh˜;Áb"­SÄÁĦ!6‘"˜mĴĞŻoî]OÁşߌPiHĞöcÖ0¤˘=” ÍĠ.ò1˙”d‘]íMµ'àĝ ,ˆÈMë-$ĦÒbwye ñè#2jZ—Şr³—ĦÒa¤‚&2ĊSŽ­£ĉ'2‹EVT–ʝ71‘‘PûƒyZAd{#ä•ež›ŸHž„:˜ġ6Ï(-P=/d˜_uEĝÂsÀlRÇÙX곅?ë×[H "wì-?V1M3"ɕäH¤Ĥc ŽÁ•ôŭÚŝC>m;)?‘ŽE$6}Ŝ:ĜÉÄDµ?Y>^ál_gЈÚUݲn—uœ#^y*-ŭÈșoTèfÎK7Ğf“ĉAşêrĉC_R˜Èş2IıHi+*×oÚĈDb“k“ĥ“ŝ¸ÌKF¤ïWO›âĞJßÇsŭŻPĈ’ÀànDÏlûž8‘N‘k ɨiLwµcRϝ‚ˆôyŭá@’Ċóğ\i/’K=KÒÎÀ8Óf-lxM¤a”à;298b#"AĦOlÚeiĞÓC½|Dĥµé…ŽîŜ¤YÉmwşö QÊ÷?aE$éĤÒYT}2ž-i˜2ĈĊ›ÇùɘH³ÏFŽï%cDEԆ§Oġ§Ê)l /‘^§SKëd]Ôħ éÍîŽĥF¨ù9¸7ŠÈ ëï\ЈĴoÀöI$ßĝÉ+BŸ')î—D&“Ú8óää452°Î)““;͢Ó׿ÍşkÈÇKJJžWµ™›SĵpÁ=×Ĉ럟ÈiaYċ“/JD*“E‰}`"Ğ*b˙Ħq`#V).Aäš;Y]WOKÙËĊqÚDjÁż'™T;¸1îÌ(1Gw’&;IĜµsò#uŞeݧyvSQL¤XŻ|âdˁu‚ı™”0‚ïDÒ8Ö ÖúÌWá¨0Û³³ÉÒġJcħC/ëÛvuÉ20\sPħ ŸeʎûˆÜ(kv7Ĵ[µf-ıŻâXu-:E$µa.@ ²3”-ŭò—Ɂ¤ß°j}ìéĊ*´#"9´1*Q¨L× íİĥ폵,9ŜòÔŞÊc³­|èĝݍ;<1œÈĴò"2#L$뉂 †ŭiVËèq͉£e{ħE›ƒm$Rí "W("OÔTŸ¨Ĉ!7&‘Ic¸n$ 'Òk™Dê9‰jĜĉ E¤äÓĠ-E˘fÜ3a"Š\W#‘/~âúëOİJ¸ÍOŠġƒÀx„P!p'ÌdÄĜYċoeİâÊêQ WŠ`¨°³£½½\`…wӃ>p˜_›ĥ"RŸj#‘[ĥí "×mÚ ví#•UĠ'xì’ĥİz•îŒ'ˆH¨)NšÑΑd2ş•ʤ#md*‰4ÛFĤDÚcäyvˁJ>žD–hÙşÚG$OZñħ‡/s*ۜLD4Šċ'’$IĈ ċDQM”úYY }[4‘ĠiïĊ]Û0’äîm[€ÈġJÁ„b´*¨ŝİ#-Ĵž ]qÙ¨ŠžĞ<ÈÑCv4’~"éŒK3‘YB&ÓÉÎ?ĊŞs!@ĈDҏ_ŻwmcKJùFŞê§ŸD~"e}`.ç'R*¨zÔ&•à–éÖfÙŬŜ4żĠ*ÈŬ¤İÂŬ^@äè‡Ŭ!‰„b´ŠJž–X§›n]HÎ'K"”BCìêÎ úüDÊKYĉ˜²‰Lañ$E)rx§ž¤Ĝ°ŭDrcâÇz×ŝċ-/֑‘Ĉ6>ğÒÇw˜mıĵßE5/˘³˜MGéI"Ħ>ŝdÓ?÷÷'hÓ"Q|Ê$²Ô r͝ëKჲò£••ĜÖ%’`#!b‚ }ŭ‰D˙iħ ġÚÇG‹<xäş@‘dŒ’!:Ï@¤IĵŒE¤E¤ïµLĊD()ıċ¸ŞÍÜìĞ!$‘npBµ<~QD*,Işk3ٚH™Ĵ…Üŝ~œW׍­Ğ5ĴÏgmÛH$èĴlÙ°~íú a?X–`ßf$…Ùفce‘¸˙ŝÏ˙ÜOƒĉä)_}²ˆL$zŭDŞÓisQÁ·"2§ĤÉZ?z„Ÿé…ÊWŭcN¤/CndsÓĴHĴ?Ġ‘—9Št]£GeġFlÜĉ$†qˆ„ĥYô­çÁaAkcmIİóÁ ç~ĥl)…2  èS‚°i%ı’ É,+ħìSD²˙Ĝ×£+vû‘½‘ [š•DzVkD"Rû‘NH{˜Îñ÷ırIL¤&RŸò ­Éġ~ö<Ät:;8˜ 8`}½QD†Ì ñµÑH"›TĤW‰£¸ÛZëiÛĈC›mŞÚ‘”İ DäA$iò6!ÙôîI|·§Ż×Ìòà~Ŭ%İĊäŜiIZ*ò28zï 1°ıŒçFiœ‚$ÇDFéÉóDĠJÍDzfc F”!62²ĠÔ0wüGŜ&‘m\ÏĜ# {{%*À iíÚLdé–ÒRyžDîDVò(ŽJ„Ú]hkfɳV Ò§ÇyöÒ¨/ÀUJ˘‘Ù4‰Lg¸”1ŒHY½LJYkÓĥÔùôá‘#$Rë‘Ğŝ?Ïw+‹U²™”Md?ҜAèŸOìùˆäÖ+ê*`×|@a?ëN`ċk+ħŝGıÇ-ÁàòŠÊ*T˙İo¨ŻŻS˘>²…›m°ü! g*Ái(M$WÙFIŝ &Òv"}'ˆĥcžŝ¸gÈ£ˆtu÷µÙE— “ôòD҄ġü=Ŝù‰ìho—@boâ ÄD'yp·ÔÓ%54YġCKıw7Œ·ŬûXuXµµ5ôKïv}á`%´£RŜŻ—eŝ“zd6I¤€FİbÊıDZ^¤Ş!Љ´‰4{4lF^Ĝ’ô’@:vñur` ߤî`ĥ1û ò‘4ŝÄ%‡Â‘ÍuUûHUwVHnTĊ‘Ĝóµnŭ&y£2é“8‘ÊjÏ µİššħ< –ĉĴǙñàIör÷—$7dYî R'ϳş>ÒT.UIrżéÈ@>J¤g%vK„”…ùTÂ͐ĝ)†ÈÀ¤EM$‡ş=½Ò‡H1Úè ”šcċ¤?Ċm6T =ħwY³ĉNBRD6;÷îf5ha.+މUĵIĜAž]Œ'—8 )vöFyÄ ²I~RÖ DkÏÇö†œO{…mQ U­›òÔÌXÏFÀm{ÂD&‹\SƒÈ6#íT:cI^’'YiOç#Uċ–3Ž4K@Dg°Ì‚˘lôz•k).˜!ç/ŻQž`4Zµj!ıÜ!ĊwQÛ´ ˘îJħH/MJŻê’c皛µHd‡Ì]öqĈ’œ›HOɰJ‘€ŒìŬuˆ)3éIóİÏb"‰ ĞŻĤ×:­ÇdœŒ,ùÎ"YäîÁ%Ż&‘]tXCӝ`n1Fß`Àp¤RÙŜÛJKĠúukÖĴPkĠ(DJÍ]:ï>X!HĴ„ÙGVòÉbô ‡™JÔ"†@ "ñ/ ”¤:šĞf͙D²(°§´*”“íé !…W”DzĤ#Nqӄ‰LıĤ:‘†Rs†Ü$²‘Ş9e`˘KµN1‘Ŭ`—PnˆşÀp’ĥ0^hżh˘’ĜŽKİHWlÚëï\µbùrñXˆäZa$ySaxi):•ċ0ĵĵĵ˘‚ĊWħ ß:q‚ V› EìӀiKh`TrAtL`İíDRCĴê(TD’˙Hrp˜eĦĠy·Hè莉 ìÚä4ĤÌü¸§S?)îċDK6Ú²óm̉F§àm""{Ñuëëġ‰ÓêkĞHĜ´ñlf“Ğ7Ĵ_³bù²eË%‘°qŻ#IéI7mHR"rAċĴÒLSê„{ڎ6T›Ġ‚6âTDJBq·‘Ë/Œ] ûŭ²ÊüGĴ†Mœò@0~< Sà,&›Ċ£×âv}#r3I‡ġ&9iŞ%í=;Żèë~ĠĤQ+E‚† ´ÌfÔ_´SĝúN˜Èž"ה R2Ë.Y]+nWS9‘Ĉ]Ĉ+‰ä][fÈ/óHĴğŒXm5M.‰D‚ fŬÚU˗j"Iˆmփ…\rğ+–ŻĦ%–ĞíäÙ²0Ħ‰lƒ=ğNòX‰ ˜ä}+.Tñ]°Ÿ° "ÈA›’5Tĥ\ïüé˜HM$ŽOÈf,"}ġıöJ}\³Ċ™AM­ĤFƒ9”ZF²£œHDBZüÎ5Ğ`KqÍÒE ‘èGJOrŠ[p×LQŜÓéxwUu}s[[{Ò€˙(ìcċQ\”µĴA"{zû³Ŭġ€X7ŒH ’ÖZh İä’j}2ĉÉĜ¤´ÑE"‘yD–Š 2R& šH¤l"3Ĥ$ĠĜ eàè"ыĴ`yŒd€”ĝŞU"^²‰\Ĥm'\ĥœN*ĦĽ[ YqĴşı “œ˜ƒ@BÂòHyù‘ ‚² ˆ„Éħŭxzh{ˆ!DĤUŠÜ8ܒr& 5“Dĉ2iĞä9;42D¤1î5iŠÔF!éš#” g‘Ċ,]֌„>móÊe6’²ÁBâb"ĠIâpĜ-?) ¨LS–2‘{‘H*?kn&¸êh–ĝ"+İCmA¤°ifq(‘†½v‘#"ÍAĤp*08vŝìèIç“QĈż‰”Ù >dç²Pĝ“V%ÏN˜^¸ĠÙĊÇĵŞt2é3‘ĦҒöôâ4òˆ˘IĠ+6mTéÓD.G#ˆ6ҋd$WUŸ¤Ü9ZIħos[ĜÑġ­4O*ŠÊHʟCDµšĤ(“Ql"Q[k˜š~dÚ>?Pµ^ĠĴĦLde†Ï]:ÏDÊ]?&Ò"’–ĞcŻ ÷(e[b(NÖPהœ– ÊRl$Uj(L# JğĥE$œk7ĠS¨}pLU*Ŭ°n•V s|†¸Œ|Fı“ŭäÏÒĈ !8–ó‘•@$ôË҃ Ĝ÷QÁ9Ÿ{£‰¤cmLĜgÈp cž;ċlXI%e™B"UMı&rôâÇ$‘$ =";‹\SÈá!ò%8 ÖL‹‡VIXDâ&2EŞ ġż˜Bƒrè\ğĦ†šbĦċKı–ƒ–Ö,YŞ×2UuAŸ\DŒ€$îۛÀ•ÜĥSD6ĠġÛéîlodU‚½{é@§˘’*1ZÛıô*˜ÈAI¤BҔŝ1;²R^˳¤Kîêß1ûà_aN/I:Âé˜H{×F™’eùä÷¸y‰ô–Ç´Ĥ,ŽHI6ĉĦp>cmÚPdfLĜH<̖N"İ–t%ŠHv%aßŜ¸…ĤÁW7´uvAŸD}5‰ìĊ<ġY×ÀeğŬ}½}ŭ§ċa@,[‘à‚„í: 8DŽ^úĜHpÍœÇ鏵qŸL1CéÙbfı`Úó˘t˙ÂğôHKÇ‘v?ìòJԀn…Ĝµ "ƒH.eó‰@.2ömĴ$ –ÊšĈö.[Suô¨öîf"!Ò>q˘şεĦpĞvûNŸ> Î$ú‘L¤guí Ôï“'5Ş‚W",Bíó—΍’Àıİ‘w””,>.ŝ™Žƒbş­yë£ÌG²'“†A <ú:fÜG¤­„Œ9Ĉñ‘ ıC sŒĵ–›ö^hÓŜBD.[şDi"i‚)>µË‚”+Éĉ;VÖ4ut$’Ħ‰~}‹Ĥ}•M36ˆ†@ĜH)Ĵ¤Ôœ|~¤ɐ("íŞ5µB2únÚ[›êˆHĜBɟpv6pá­ ƒ ™yë­H™”Ü´ĥíòŞş6”ì@–LdTZ=‚ġAu ;€L˘•<Í)ĈŒQlĦô]]£1•b­3s4ƒĦç…ÖñÌGNä]›%‘WÛÄwVĈg"‡Ĝá-Ïżk8á²Ç#rÀ’ûSDÂ÷£‰2ġ¤cJJׯ[ħ iğġÖ°n½UŬäÑ2 fo]pëB8a\&sè2) óàĞ[êHŭ°sŞÁ1"tä”aÉ•î646AéˆoÜ4‹•ĤSĤƒ­t­r j÷ʤCŞ|ɂÊ$ċ‡Oä˙ŭ;żó;<ñ]lÚŻ\­D² l ŭH-£’^yt˜<W¸|<"-AT"’ż mè¤nk¨FSš ĠşKÁùópˆóĠZ€H "o]0ÁBZ£b\–LJ˜SÜ<çêRĥô$εۋ\´k3LäU٘ŬîY%˘íYı´ˆgiÏŻÉKä€uòĊB"Ëbĉˆ\·fùÂysç̞=göÍb͞3ÖZsç $ç’b[D‚#ıl™I$70‚ &1Ş‘^$ĥ†<ˆ@ÂETP sa$Ü´AdÊ<ÎrĠ³<µ|ġ]Êr…•Yíû!9íú’’Ċ--×OŸvŭġ-Ĵn{jq‹Òıŭ¨‰äŝâtZzŽŞÈŞ""fÛf59R5²ğŽUj€HÚ´7nXğbé­sgϜ9kÖĴ™bÍşyĥħ˜ÉÒµäĜF.ÂîÙ{ĥlÛ½ŻìH9ÚŬ‚HLŭ ‘HŒrŽT`µ$6еut÷ 8mUĜ(YEğÙAôx2~"S&‘fWÄżĠ\Äĥ"הéü²¤aĦsÑDĵ‹ç#2)%ôşAe‰dY*ÜÈ ĉÌĵñĈ›fŜtӌ3n4ċ“9‘ԑ΢%‘+°˘üž{ĥĦMeâGóˆ@î•bTzQSßÜŜċ'2e@ZÜ‚Bìò AL[ŠA)3äéŬ~ŠĤ×:‘ŞéÓhˆŜ ó çK$ĥ‘%“,êĜÓŬÓ×ÓĠÑXÍĊş η~͊% fϸîşÒuM7ÍÄĊH΍Vrğ–bçse#á(ñž-Ĝ *" Iérĵ‡ŠxU #Ùٓp°ş‰LÈÇVí×­ ’šŠŞ3E˙Ñ?ÉĜ*È`‰\1‘‘Z—Ï*AÏ?ö=l´qäHD· "ħQ‹Ŝҏ>A¤#–í…\$4}­DÎżù†ßĝënĵqĈM3Ä´Kò+1îÁ5o)5‘Zˆüd*öp:àĤ4˘è[–Wž¨mhíèNôŸĈn$ʓq EZ*9§È‘´ˆLó‰¸Qm2V:!˜rŒ‰ÔDšJ‘Ĉi Ġs‡9P‘nĦD’–U‚gÇööòÄÎŝ>Aä‰ ìB¤›UË͟uŬżû÷Ÿĵh„}Û`rÖ,ŠtD~ċ<Ü·udCšp”¸‘Ü­kÊ)D÷ìĤOÓv^qĴĥí^H’‘RÍ'gäI?|üu>N5‘ĴĤ68<2<44a"[‹\SH=¤$k2ž›7°Î“ñgwëî%qp9DˆlĞDÒĤ½LäòEóf~òùwż!ömAäĵL0’sÈÙ7ó.>—“’PÉ @R™$I\ò¸ĤüÈ*ıĜ)—6–—ÓÑöij"3dÙ}HflE*ê_˘š Ğ›QÛUü’Á‘1dL¤A¤áGjíÒÏòäès׍†Î?.l|$I£OmÚàJĥ7×Vı@3`áĵY×ŭ{a#?uc‘³ç ĵBqtI Ŝ&‘z!‘`#ù@q'f(%•{ħž²ı£mdVew²H$ôtùD~rّ’’H-Í"ˆ ‘ÍEİĦiá/ñó(D’+fƒĦŻ.ÂU…h‘DŒdÒçGŠPğµĦĤ²lĞĞ€‰\rëĵYğöH›HR||3nÛPh0‚ú)—’“ĈE‘;p1“{ıÂWĝ‘$^(Ñ#"³iÏÔ3µ]ÉĵDrğ"íÚ£“ÙµŻE"ƒZKşuÄás²`/"UxéÎÙÀğœIš×K@ĥ7Â|÷&rÁÜY7~ò“× "5‘°HşClÛL$´qŻ•DBwĊ‰ÙIĤ‚³@äħšk'inEJíÎ@¤½ùLäL³$ùjèI‘˜ÊÊSF&R#!?r0&2xf£TÜÙ@ĤäÙm(‘pòíù[C‰,™ÔùHHFĥÖ×c7’Lä˘[ç͙5†ën¸áFs‘Œ$YțfH"—„IKBG (îĜ!Ċ÷·QwEUm#ĉ#½Œ:ݐˆÈL*“ñá—#ilĠĉÍ6R*¸§UQ/ëˆdĦ…g6²İÈġSB÷dzˆHYq5îG’Šx¤Ü…OĦ%˘ì'œHdÓÑÖTW]Y›ö”D&rŝÜ9³nú”"ˆû´Xd!1}>ƒmܵעf9 Onщ¤ µĠ·ßD"ğ÷Ċ9‹NÉwÒ?Şâ‹aeŜ=ei%F뚣zq¨Gğ"Ğhӆ°½ÈısfÏşéF˙šq“2’d o‚ôùÌYs$‘ vjÉ£%‘eDänò![¸uħşĦ­Ğ'1€Íä²­Û M"ħ]qÚÀŜ!lY­…AÜá)£$2“†VÚĥ‡†GFc"‰Ô2ï)_™¸8Ymı'KşŒ-îöxĤ§IDXxp7v3 ‰\46ċ™F”m‰$~?MD.D"W`¤­‰d&q_Ĥl¤ÏDŜ£”ġËaÓytĴ´ÈJŭ(Z² µĴÒĵdÑ6˘FOM"G†Ħ”·íÑħ˜H‹H5ËĈGd´ĵ¸›R$QN˘–D–#븅;0ĜĈĴI—DÂĤ}‚7m2‘bӆP¨èfQ˘IäLÜħo¤Ôù,"’›ÖÌÔJc&‘Gdwƒ2‘$Ĵ³`ÓîIP5–ŽBìĠ\ƒŠHĜÑ@ŽŒŽŽŽ Ú6ĥ0 ħô”ÌòĈ><:qÙXäšDê tĤĵğkŒó›H.0Ïs*#çĞé~Y@ –ıž%`…µh@$ ÙRş MäáFΝ;Íä >°A$ÓD¸KĈŜ7ϙLj²`WıQ"݈Tí ;hÈïoÚP D­oíD™4üSġhw?˜ÌĴ‰Ċ)a gϟ;ùEJÊŝÚA£ùĈ#È‘‘˜HƒHìIRİ "óLŝHSċċ £eM›‚[u/8vK„I?² ĉ΁MûžR2‘‹nĊ áJâÖL"‘Ì'9‰ÄR5j/\˘DÊ×Ĵa´•‘”D‘Dâ,ß‡ŭ}öÒ6´w%·ħşX½Ù××On%5„ŝ#È3çÎ_ĵpnltdXoÜTÄkD6HdvpP?C“ˆlŠ\S‡È”U§"0Ê7QNlZ¤Ĉ’/ħ…èĤî^ˆRíc"ğ‘HÜ´ïÙÀ&òÖóĉ/˜?oÎͳl"Mg>–İ ‹H8H"-#)‰ĴPDò|ğuPpiÇŜòcµ"ÒN8.*"ÁĤŬÉ)Ad*£F˙QxVùŝó‚Hôpħ§ "sZ÷thٟk‘HÎGĝ‰tó²Ĥ„Ó|;°‘ìĉñmĥ~Ÿêd4۝S:b_Ô§ˆ<ÂD˘‰ÄÚóçˆÔ7ñvŽ&r)Ë#WÉm[Xɍ"w{6ĜäµëK·íÜ'ÜÈÖΞ~áöeİÇl¤0‘§=ÁċMWl×h /\ştéây´‘RD€şêĴê8×ĦE1‘FwlJÓˆŒbYKy~?ÒÑTħ̽çېUÏĦÙğèŞ*8޸7‰Ä2‹-÷èìÇf2„H HŽq‘ó,"Wh"7l(Ŭ(‰Äš#ċ$ù{Èk֗ 7²²şĦ½ûż§3ƒ#$Œ’ŭŭ§OĞ˘pLĈΞ9söü…‹ïŝ%Ŝµ‘İ”á˘kB³ƒÈÁ‰Y_äšDf‚C/d9jž Ċ5ı#ˆt‚H×TäVÊ&‘2ˆvüDznF?}=8F³?"Ö"aRjT,ÂM›#Š­99ÎİȲXòĉ9s‘r¸ÍrYVA½<Rı‚ˆ\²ôÖyi£aœ)—<žİċĜ¨HEäËĠlÚµ I½kc£ĥ&rTß_³n4-Ö4ĥw÷§‘ç˜Hà)"q×>{läŻ~ġŝÌŝ ĉô9v€HµÉLƒ“èj¸‰Ìá ĊdÚHàFǘƒBˆäñĈŝz^İĤâя?IŽ3ò(Ôg6šHä‚939ĵ6úsç͛s³ĴùážPD.ĠÓnÖ]'‘ÜhD6eċJ¤àš$c>wì”éñ´@îÌ0ÎA­…t€Hˆl ñ#ví÷Á;v&% )fÄC‰D]JJĊDDŠ-cXüQé3Ŭ.7>‘Ö„ż‚j|ĴñÀ)E$üC^d7Š;Ö BH‘oĠȤ45˙ĉoüÔ Pû3&†q6Ò·`ÁĵÙà_’ İÚêiP$ınŬ:Ŝ·ÍX[,ƒÈ¸İß^deMC[WoÒ#ˆDĤLž4‘”? Ûö—ÄĤM³X˘\VèĤe/˘1 €D~'ыX[äšDÉ3[â‘Ì_hfY`!$L Isé›-|—$ÙÙю²²²²â $ĝn;ëĈpŬ8c&ÔU`K,4y "ığdİñÖE‹–2’jŻċ”d)ıƒûX6ƒˆ,E/s›0‘UµMí]½Á!E¤QŒÂ~ä0f#Á‘|˙ŭ‹çĈ`φŝ$/£md:„H2‘£t iïÚ<,Mµ&ÉéÁ¤¤2‹ ÒŸHWû‘v˜M{v‡ć<áĥÒM”ŭí”97Ŭxub $gŜ,Dw‘€@삅.<ÎG95Ĥû`áħ R‰ÄĈĜ½’ȍb•–‚öé^ĴïìN x$BN$ŽŒˆ]ûÂĊ‹—.ž?3 @BXn( ˜:+6‘T—1ñ]ğĤÈ55ˆD58S)=:ŝ´Ŭ(‘Ç ‘NáDÚVĜ_dÑŜLzĝXGğsUë.Ċ\äÍ3n@"ŻDB0Cö ˜?ôVĉ’üĝjDr‘)kşv-Ġ˙Ü£L¤ìÔÖDòçvƒ‰l„B4ÇW'C~d‘££##¸i_ĵ{öZH½çŬ í'’ †èüB›˜HƒH–~WŬž.KÒ3‰H…¤>,X1€ˆ ie„vÄĠ´6Ô ¸cÈNìĜ¤ˆœ?wöLa"?ùIìk˜9g9ŸUU„Mœ;7pTH[¸m'DÛrŽˆ"’L$NFm*Eld)Ğħ„~sˆPy°‡È°9H¤pÇFaÓ N$Î,SDšfQ}•Cr†İ˘rٟkH­'1rÏ0‘ŝ]ÛPïÔ2TĴmtŽÙ¸> 9@×eh cÊvlÚDċş ÁSd"ÑFò=ïV–‘„m{62€ŝ.‰ùŸK$‘Ĝl2°,ÚGGˆtâ-MdgUE&‘*‰6.ÒqRr7˘ëŒM$ëXPġĝ˜H;CžÖZ5HUxÊ?PÈè}À`e<$0Yş ™÷qǃ$]ĥc› r Z"o‰‰„öXJŭ̞GZğ@älh?\êĝ ! âX!‰úäD$ÙÀ°%ܘ÷,?ZĦšd­.~ŽgƒuÉ2µûˆ¤paÇB4”+ġ<ƒHK H–ĤċpH9‰ÚŸê"×T8E¤ó0­áœ]ÛDšòĈҘşZ˙LÏ2—Èhqì\'ŠŸ@ÓŬ´•š›ö,E¤ÌGÎĵŠ ĦMğĝœy —Âİ!y$kaIsdİ\WìÙ(ÛGġL$~’ĤŒÀ,:(ސÓÇ}ÊR2÷32vîâûïż êFÈLJĠŭ´ĴËBBjԎ#½HßÄDÚDZŞ]ŽĠÚjUÖziG×i5i‰ ċ7’NhNi…u;ÚĊž&rŻ,ĈÙ°~-Ġ˘1‘Ÿü 2‘˜ Ÿ9sÖÜ ıˆœżp™E$n☔„9²qWÉ'ĠœˆÍO>ùäŝWˆ=‹Gs֚9Ú*eĞ9\e:!ğjû‰ìDbê7m“Hi›6’6lr%gCĝ>&özÍ_¸€„i óĉ² 4‘‰,Ċœ:¨;€È50wñH™J“s„³coyusWO?µ\ĝˆdµHh²; éžÑħs„9ĈlIİŠĦIrôìùs£Jn…‰;vUÙràÀ’â‰Ĵ*r]DN;²ġ“È?üż À˘Ç˘Lĥ5 IDAT§iR­!CNP3`Q,šŒ$²ıħöÄħ ‡Ĝw£ÌF. ÈBíTm$·/̛ M³Hä­K–ĞÜċËɋİfËύ ³ĴòD5Nm€İ!ezï°–UÖµu˙³yŜbi9§Q?jìœX@$Ü:3ê’TXÒ ¤€öœĉŠLäșsg¸˜òLd‹àĝts×ÛzŬŞ”/D†'gjuŭ }ù6m/`"9÷#Ċ1£çpöçş°.Wkаüıl)I'Š4i‰DÈavÈŜƒä¤îĜ½·ìhUuM5žŸWTá\9ê슸Ĥħ£ï@żŬĦ)eV2Ù!aġ.^ÀzqìŠEwPëĞd‡0”Igݏ[ 'ŜC”‡d0‡Fϝ?wvtdRğöµ@äê[_lD6âE‘I4Ŝ•ŠZcŽšô1%6_òġ‚Ž‘àFÂĤÍ!†ÙËD^‡zĤ3o²êÇáC"r&ÓAÙˆd½U[ˆ£C–“— 'ˆÙTWĞ ­šÈ”îV2G§éŝ/R‡ÏJO†ĞACasG ‹nI AaÚċêñŽĥĤZV1….,ħ˜H>E” ç‘;½T˜4‘‹è{`˜;6ˆëbqE8]@íêꚘ6W[+ŝfÏĠ⛤*}qìΒD:D¤Ĝˆ…gh§ÄYş™Ál6ïs˜’âÛΝƒ‚t8ıÁŞĦ˜H?‘c/ "s™tÊ7&šĞž9%ÒòW‡*\Ú&RŽğc"{şÚ ŭšHl‘ițUġĊ˘‚é<ħI÷\ju¸ó>kH>9"Và/9³ĈĊUW'¨Ĵ·›i̗ ç­œMäĜUXŽ\n$l"á&—Ie€HÀvˆŬLl¤=~f>`ĵNê“ɐOŒÈ;JJo‘wòüÎĵġyĉâHŜF™Jf™]_‘튔ċ BMKqÖŞJƒ¸tÈRjc•D.¤sB:Љ ’NħáÀq3 $´Vàb˜è%6m#Ònjjlh¨ŻC[Û;şzúô„9Tĉm=c×Û/Tž ÂÏ5çnJ!SĜ˜qĵ;ĊàtÈÍH$ç4']ûSYäú3$òŒ3Vƒ9ݲI‚È3(ÙN¤Öp7:ĠL–È\O‘R›WŽÍۛ˘.D"²ħş´Q£O¨‰\ÂÑö,5ċ‹ˆDR0"yşö|ލ„¨†O³·lSz¸`gUu­0 M­mm­­­ÍM ġ 0ċ½ËSB‡âù ùH–‰ÌeĠÈgI¨´… İNèĵAäàïċ“P4=Zäú3ıkż^Ü]eӌÏ^ĵ0Fm$áDfsĉ䠌B2xÔ’ w"·s27”£;@d)ĥİ‘x £Œ$ÉDò"".Ċ1Ş*g'’„žYPw_Y9ĤGÙĜĜĜFħ££Î0aîìêîéMôë9*9‘rÒÂà°‰LS€¤Ë­Ċñ³Z)9sŝİuŝ°(mŠĤ&òÍrÀûĠ6ñ}ìü9HŝĝˆL•”-as$ŻË½„~#鄉S¨‰[ëÀk‡[p×6‰\ż~Ŭ’Hm$„ĊRĞoïÚ —0‘°Ôž}&RlÚG…{v=L/hmkYš1/6ìîÒUF2ŠÈ\VŠİâxi%³™@ı.EàpsfĜ +wG?ùû_üâyâğĜ´_ıZ‰f%›È”m#§fĴĵŞÈ×jŸ:f&<ÉÓjHÏâwÏD "~g{³ŸÈµšH8HD#9SŠ—Âhr˘’$rĦLüD˘ÚÑ£ȚşFħW·=8ĥğ ìcO__"ÑŻNO#‰dOÇuÍê§TÚïà˜”„÷yfŒ²?ŠHHZN˘>r‚DÒÈ÷Ğs×.ú°Ò#–!‹ÌMÉW6-_eKĴwÄtĥ‰ÄÉI0ԋĠ=ċċ䗤 ÉÖújċGnZC?‘ËXĴ”+˜H[`—’?ŠÈ…\c´îD4zo€Hħg7·µ··ƒÛHÏŻ··†3&dòŠJì˘ˆLÛ{ı’fíšì×Ô#Għ¨WÉúÂOŭwmò*lpÀONYQ£qH£š=])­²A&‘n‘üns€-‰4ë)“‰îŽ6E$h/Ż  r èÜjċ$gĝdñgCW u}!‘ĜȰv½&”ù ĊžŬÔ*üG²7Ù/ }×áDRWĥU‘'ñSG ĈÈ "’eó³rĜ ĉ2³“ÈŝTıˆÈiח”,n‘wôÏ)}ÇGL$i´§Ì·ÑϙV“Í‚3}‘.dE?J‰˜şŞ{›‰LŞİÙ½$OċPK­¨$O…‘Ždƒĥ‘àCYµJnÚX´Ğ§H›o†²}³IäB]ky°qĴd [сìu2Ĝ/İ';gÀÑ1‰ÄîÀq?‘žH ?h ğr“ŬÏ9FݧĴ "‡}DBâ†<`ÇrÊ(àże=#'k18$瓘H‘Cĝê:ZoÂjıK‘˘€$RM<Ô7—5‰te€Íz÷‘,ĤÇ˧ÙìÊlP2 #µ‘ë×Y…@BJ-$ˆGb-‰”•A"Ħŭ0„H ¤°Â‰ìûu†ı³ż—RQ³Ñ†.îÏ PA=&K’ˆ¤I~şHJġ듭´¸6‰”ga.ż¤\Bċ@ÊsT³ّ¤żA½m;"’ż†bŜ²)[Idö@KY@ñ…L$ȏoB9pHµgSDƒg‡7Íd ÉÙÔ ËH.˘İ!’Hl°ÜWûÔÖA˜-,d?ütŭ£gÈ'è,#8’CZúGVT¤Db^˨œJ™é‹”Î]Èm( Eğcx=a"ˊ\SH> KĞÓêW`é‘5D¤Lv("qËÑI$R݇{6Ĥ†ÎúĤ] * ²A"q°hĞ€`ÊRJü ĴÏ,˙TDÌú˜D2’KHaŭ p^ƒĠ>Pêavw'œ¤UŞZnVQĉr~Ħ•´ŸHGÏÓ5âŬà™ÉfLЉDŸ½t~l$&ÒGd.Ğf¤p;VŸŞħ^R(͘úA9ċàĞ{ •) ÒQúĴÁ+•²95nZА'z{:ÛjŽU”!‘Ğ0ÊĉÄÏ|$rĉLH*Žœ…4j™…‹¤d@€HiWĦlhD'21 TDzòxr$ù52Ï]—”ûWDިM‰żfĴ”o ë5Îpñ H ĈDDĉrY˙¨*ˆ–[9ĤMĜŒ,şùŞ{†°€R² ™JШS,ó‘TD.vmĴ°Xî#ÒĴàù‡ än…E$-"q×Ŝħ“ŠĈkDŬĜÔ @ö%ĝƒ€TÓŻ­i&‘ÙL°éĈO¤ ҐÚTÉ3~‹ˆéÂŻ.AÛlL¤A¤šÊÚ4-$‰ä]ĈsLóç™9ż€ĴR "“Ö¨(\Oôܑ'*Ë÷’ıBIꐲĞÁGä&r.ıPş‘2ÖĈžŻàFVAŬ„gŬPMáuÁC6cZĤ™5Ĥ„İ^›HyB•²v“T:74vé_?8=%&ò`‘kÊÉâ4úĤSDнOĊÚ&‘7#‘7|*@ä\Z¨İBGÚ6‘ÜaSYUSĊí 2%Ld*“ċš°œ `I£óÓe"$ÒaJd*­SJĝ'Î Ÿ{˙_?¸éßµy”2 Ú[xÊÌ_¸†rİgDáĦ+İò‹ĤÜİŬ˘Èİ£,—ΘğŬ(ù|ìıîÎUşêeĈgŬ„͈~"ç²\†6Dä27’?°iÑ!I‰z’ÈĴ>µW%‘9cÉÎÄ"e‡Ş($IħĜ1덞Dž›Ì}M™“é#r7ـ‰,^d}S+‰÷ġ&8SODbS! äËxqËuvDr‹ĥ59EG€?iNL9ĞĊ=2Cc.]Â!a##1‘ÖıĥrŒZ‡ı P°·Á:şRËT JĞRE¤ïDÍGdH‡jvÛ%‘[6&>ŝ,dI‹0"Ħv\ É[ĥÚµ—Ż`)‹|ĤM&Î{zİRSɋÂß$üĉä#f<ŸÇÁmĵk£8)URo5ĉ2%šHÖJ›yĜµa$í… dLd€È‘QTé6‰4ŠÊ­á‡ëÊİjÍL¤g–ĝĝ‰ VÑÌŻŜžŽĉÚ*˜ĞMF‰ÄS”F³‰œA?@äĥFd¨€ö a"!íÓÓĞFÛ*"áO’z]s|RUáxVĴž°dÊúŬViµƒDr!š™éÂċeAíì2&Ò"L$(%i"MÇGi) ÙŬ^TÎĞN-"S\( 20ğ‰R’DäŜ;°f÷Nr$ĊZ0ÏO$ZIP !r)ıžˆ¤=ğşÎĦŜGŽ ġ˜H|ĈHşŒOŞÌpCüGĈĉàx(%•ëâ &2Îd-ß;•5%Xb"ƒDžAċ‘úÑó÷ÒĝË5‘ÒFrəThħ¤òÙÙ\w˘˘LıŠR’‹HFWù)ƒHBˆ$y-bORê< I™Ÿĉ6èÄN$M™j–qR’lĈúú+ôğ†JŠ”œÉĦ\FÍ쓓p#‰ü˙Ú{żğ{ÏSÓ3df½ş%éÜ8ı$ıqp‚1ñƒCÇñ£ü”sñ›q7Ì“`†ñƒÀ/~0$gü"0!ӒieDƒ…ZHˆz¨*( ÊWĠ•)ŞRÙì {oöŸáNuUİĴ\ҙġûğ~kí]ĥŽäĜ%{/üO§ŝìó9kŭÖïÏ÷˽BŝŒ/pl|ŻD<çşˆ¤-g>ËÀĜ&éĝ#ö™—EÚô[i$ûX"·ı|T-^a")„ĤGöj-’S@<KµiüĦN‹°Ĵî3xfŸqgö•KpÉĤég"ŻÍ ÄÑ"µ~`ĈÉÛĥħÓIî×ŭÈ=Rk²ĤÌMK”ċˆ4DÂ#-‚ô’ÌX˘)~œ²xfä½ħWvsW˙ŬSGäʍKgQŻO‰ü8ҐĝŭWHtê*™H£ùO(Aġs2§ù Vk-ĴĴs§f˘í#ŜHnémT:DÒ.İIÉLò[†HSĜɚĴÏ?°z !9푓Ùîdä…Lêú‰Ô7˘k#íí˜î@‰ˆäžŬg$#‰›äwMˆìĞ×R Šˆü.ê˜>޲şP†{öêFœÎ"'ĴÚLqdDdĜbá[3¤İ25Qsa"Nx75Ù° ‘Ŭğ6ZB¤İĤÈ[×cjÌÄZç!T+Ü0OÒoüċöÈK$WIÒÂiüŠ%ò{ĵÏ[äOñÌF /qÚĥù!Ôn4fE=L}çFĠ:ġ#Ĝ†HŻĤ[–EöDš[ye-żJ#ÒàżsCÉ·ğ'òĊ9×}“œpI9ĦRғİħH ‘ZİÈcƒ“ŜóUÈÁ Í GäċóÔEŝÌOIc…"˙6 òßz"İ íûŜ*–Ì^ L$äĈ—W×7ĥmċSÚċk><)M^ĉaIŜC¤6•–VżŬÙ4ò$"ó@Ÿ“œE";½?T³<‘qLGo<Üä˜ÈÜÛ/ċĦ M8'aċîÚ@ä™ß(‘8ĝƒ(‘,P€V"ż‰¤ÔÏO Żş[ıYĦd™É‘sŬ!Ò#8Ĝ-’’CŽòË ;Ìímq"c"ġíh%ĥ˙H$%lǛ³à:“çbÙ™úf„<ïE‰ĵB)r!’7IL˙|ċïú‰t7‰…Ì8×kÀĥĝ™gŬ™ŭıävÈ Ûž¨‘œ$'‰ˆÈÌßLŞ€H˙ĝY4>ˆè›=fÏNÛÛÄ1Ĉİ鞈|aÎuݍh-ƒYë“F]0ĤżħŒŠşÁÄöGcıÍ:7Ù7ı(zµ'áÔ^ĵváí7Íİ $”Áaéï$ò;ߑê!—´çkÍkäh_½‰DšZ{Ħ‡jŬ%ÒÜUX‡\4q(Ĝ´J&ÚA†aPs‘Fğ˜ o"=‘Ç×Ĝq²T|ĜD9 Ó ƒûI "6|Ú(ğ3Î~0ÂkXéÍfu ’ݍ:+8"ûƒúî·˙áë_ùòQDŝ#‰^?äĈHJEúĈÛç/Ħ ßêKjD@Š)qDdëĤ1’’äܕĦ­’…\²k*JÂUqĴ}T!‘Ü–ĞC÷½èG~‰,%½FҚ³1…HF?äGó`û+ìĜaĜKŽ3$éŜĴ5Â,i¸;ċ½vu›kË7.C"ŸÄìĤ’ßŭĥÛ"=‘à²m‰¤žŸü‘Gù1uĦ=‰ċ×Ï8 Aïĉ†ĈÀ&_H(ÙOd°&V4Ĥšèç!ĜN–Û6Ĥğğ³é(ìÈ/;ş°œ|ˆ ‰”üpÓ) §–HI™i4f"£ŒNŞDÖídĥïˆÌB yß@xÄ Ò?çÏĵöâ³O‘”ŭùŝ÷żóMŸû‰÷H‹eñ)ò§ĜaáĥÈ —o  ÈWĜ-RÑ0›$rµ”Ê5Ĝ£SDğ(+&·–"ûİLg³ÙTé{yµêÉ§áÔ6DÔÚÏm-°K”!‘0°tûɸ­ŠĴ“b´D‚QĈ´ñJA=z}wíĠċĊĞß~Ŭ‰Ŭ?}‡6Xżƒ İDúQ†^yí­s—‘°ĝĈÇIêÊ™û3½mGj$@ú|‘-ĉ pjO§cCdy‘¤×D>7çş/ˆ4ğ5gÈûˆTE|ÔAlĞ܎Ú`‘‰œ"‘aRĥžĵ˙̆žŬ•Ċ—Ïŝ²)]äúów"żü÷ŽÈoa—O ²úÔ3Ïȉš|ĉ£È^"3ê%’+­ì’èE<“I<=GÍĝ0Klk!Ò_³{ˆlîA?òsH¤ÚÙ)ğ$ƒfÈ1išƒ‚OänĤÓ­[Cĵıĥş²´pġüLäOĜ̆‹Ú.~Œˆ„C›†k¸˜MˆOrWä[g/^£köĤmÍì!²f"ıèİ!Èd×V\ -=z"ġÌf$#"%l5fjĤDZ"²k[¨ċwèSY£ßP×k)1‡"¨€Nǵ`ÌlgzĴ_ùĉ+Ï=ó¤´ì˘ġ&ÚtEm-"~‹‰ü>í‘ÒĤ‹]‘çî„HÍUË™ñŭĞ4´)4R„#˙Ĥé'rŒ^'|t.!÷w‘1‘a•<6_*KûÉöÒ` ɳ?Q•ùĈ"”ŸíĞk£Ŭ²#ò­Waág(Gġŭï~ŭ˜H¨òú2Úߌˆd˙žd0D&ŭDŞŞ éZxRIûhúœGfRJ"µÇŒöOJ_–òq”Ħ›\FŸ*‘˙×ñ'2öĞòJzxU>éftçĴݍo’îK5`4ù–#;-ÄĝëÂZyĉɟ"‘ßAĦŻ‘§óÚÔùuU …Çċ̖a/OdÚG¤Ö ½QĤ‚­µ4Cx"Yı™ 6)G<ı+*íHħÒ@d‘Ĥ f´–µ&ŬŠÀ³C¤GeŞÜÑÎDbMHdr$‘Pµù =ùSPHûŜ?~#żÂŭ^˙ïi1$òQIE’ÎÌÖ|$‘RôÍÒ+VÉHÍ(ZìĠK¤PĞDŠİbies[ú‡?2é‰LĴ.1]·Gşœ5Ş § żB"“T„ÓĝbC½?wÎIè]ˆÄĤ]·I2‘ßù–ŠŝàÉĈ_%ġH̏Ğü\µ9‰Rh<~KŜZÁ³Ü6`oᨇHŞ(´öÔäzÔ ’s6œS+Âô—lÌ´îšÈgç\÷‘Ĉ?‚ĝĤ2}SX˘nISwMï)ı­2ċ%JM ‘%NÍYW7 "òĉÚÊò"äÈ߀² Œ~·6ə~ġïŭ¸9Ñ}·H/ÑÙHöB™Ÿ³`˘´O új˘7ğ' '<êÑ!’Ç-‘•ÙÈAÏô/!Œ˘ _›ˆ´DòĦގ+“騎ˆ¤CšÑK=´‘~\ĥ‚™Ġ#QLn"c‚CD.‘@šğn#‘ß"éÜ&ĦgÖĠŭ:¨""{üİŸS*ò-td¸ĥiïqĤ•6·÷9tÍöw{‘é6¨Ù>}[²Šm”HŞÎŽepÑiĴ]°9ì‘f‹"Ç k‘çÚ%]ÙG™D4~ÇDVl—ÜäĥħíĦ•Ġċ%£zûÍ×^xö)¸l˙Ó÷@b/7dí@~ßpL‚²î7H1ùÂ>]‡½pñâ‘%D‰àŞÊĞ9ĵżI‹Ce~2îE/ÓÚQ)ƒ žH.1ê„7i‹$yLìÔ‘Q™z½‘–ˆĴʨ5Ĥö ´]ÍÈ@“ÖϝÂ{-DúúŜ~KÙ$AC`6ÉĞÉ7^~îÙ§ ͵Uġxü: ô9&IY÷ƒa/íù9wñÒċËWHmsÓvYàïŠĴÔµ%'£IÂO„ġó8–ÑCdŬúèħñ6Ĉ”-K;DŞ–j9iïÚüˆ°Ó‰lk‹$OtİÍ_$)Ú|"KO¤;Äà#ˆÜ„ığۀ‡ìĞ/¸s›2’J~7Èĝ&J~žÙPC|‡½¤-òòµk¨ĤK˘Şï‚Ç]£uö€ĠêÍè eƒŻğ"ĊDBé-ĵxÏQ í]Ӂ¸œŸSföèZEÙ>e"~bOŸ:ġ#rĦûyÏùżûL3ä“ ?ùStħDìÊñyU#­?|ÒcJöÁı½pċâÙß@N’“ääòïN$İód¤ù=<´a‹¤\$uĦ-Ü`Y•M£8¤…œ ñIHKÍúT8Ĉ}Hş˙Ĥğ1‘ UşƒšĴ´:ÙÈRûÙ(×{×D>3ç""OżƒD>ÛëÏ?§NTh—Ân H×TÄM3½¨öèñY-yu`"‡˜äcˆLĦ]Ĵ$./Ŭ¸L]’$G%ğ$ Ž”§’(ˆö4„(󰔋|,$"Ù/ÛÔ)ñSĉΔ‹€µ $)FñyÂVj‚!‘X%$ÍóĴ˜xÔÂî…ÈšĤ1‘˜bŬżO™HrÑ;íwŽŸ›qYI§ÔxÔK¤²(²ê³ ésäb ëó€}DŠOĞħ™]wL.Rá”M{„bÉoYéRUè£& Ŝ"ħé[,ÎCÏÏÒ"o‘›Ş*HÖFġhz°‡Hšbv!MŬ:h(9ïI !)YÙhƒ3(¸İv IDAT>Ñ3sIH$&ĜùğgÙgBäġN_˙Ċñs|§zÊ˘aİ_‘Qż­#ov™òÀ·ŞüuˆÌĴ|2;Í-Ŭ¸tö n ġ@ò[¤Ê:?àJ‡@rÛ g6•kÎ\€&´ċċHİW÷fÔğÓ0’~Â!˜k öIž’)(‡ ” fjĴAHd+òĦ*Dŝ}†Ÿ°DŝúÁSOŸŒ'ı’Ěˢ mz'DĈğJNĈèĝDRš.}K¤‘ĜGƒä8Ú2ĵyöj頏N^È5—ˆÜĊQT|ëYĞÚGı Â`+ÏD€¤Ïmc]™Ĥó4‘>Ş'’9}l?"!˘|èĜÚ0ĉħ‹ħ#ĉ;$ŽìéˆKЁϽ>EĝèYœ¤´nòìèS;êÜ][Ö)YĠ‘d›bö>„mòÛÂ#éE>ŝÔÏı€èm8Ż×Ü˙|*2Óê!œÚ 7Ñ ĊvŬ˘Ĉ”” MŠM§’’|k5§ê!² ¤Ŝö[?ד&ŸÍİ w™çŬÍĤÁ<Ĉˆ›F|×î(-… ½t”ç!’™-Ëqġ,;êfŭ[t˙şvñ,Ê­`(IHbÖñû¨L…LjĊ>ö8ĥŽżòko}áœ×ŽÇ›Ò;ÖJš1òˆ³£VE|d ö~'Ëap†ÎjĴkAĈj(܎—ÜP#"­ših†?гf­xĤ}ÊDž|àÄɓî”~äӔóyĝŭëï=$÷Ù„0ÉÉîÔif–49ÒA˙}Éċg$ 0°>"û³Ŭ%ònÜıMĉïèk jœC×b’÷G˜Ñŝ‰ŞEuöÒ ˆ;ßd)4½’i›NK™ÙîîDTœ}Ö§iÔę ŜAϐM51%4fA2ßxÊf"íĦ„L€mD÷­>í=ò8gȉÈ1Y£ÊĤ1ĤóbĴ˘b= ½S›B°IúS†úÔ ™\ÀÄĴĞG‰D,-\ğ|ž´ÄI„ïÉ.ñ{(ġF!?|äÖùÁ(òí WAŭ^,BÙ!,éĥ ÷ò‘-ĠüRġ$EzĤğ@dËúş0ˆ³µ5ӗbˆT•B[8H"ëVnڟŝyĴ‰lHêu„ş!¤DaĥH™‘—ëdU/"۞Hżwˆ,L.ˆŞ…ŜžÄL;½äËK‹èmóòsϲH>J üt€Hx×I<ŝĝǏ>J-‹ŠÈµUwO^şzá­×Ĝŝ頄F^**€J‘?tğ£d+Éñ³.ßX^ÛÜ6Ùħ žÍ2ŽB"Û1äxœĤ‰Ú8B×Ċ.J@…Ëŭ'°§'°Lğ—ñ·lj+ĥéÇˆġ˙bùĤ¤ŝtEMÛ-Óxqî!"Ċd£,"5ĝàjÙ!²ğG~‘ĞĞK×. F²°I>êP|Îg2ŜF7x¸è …6kPéÎì•ġMm"DU"R­:በĜj΁$V¸y’Ëŭ";`–È;™ĝéeŜ×l’ŭDÑ_h"Ÿâ“xzş,(ċĦÁ˘Ĉ[•èˆp^pĦA„ŠÈ1£0×í4&Ò8şÌA$nĝĜŝħGX ˆdù'b¸Ġ@âç3ç.][\YÛJ,‘E´ì”óÈq‰‹÷öfS<·‹TdŸİstÌD–¤ûÙ,,àˆĴd ·ÙEÑï<ÉCûNŒ/2‘ï>ÙQMÎ?Óh§ Öı@3òf9ġ'DĉĈâ "²Ôğϝı²˘ŭO"‘= !#‹Sħ èüìg?{’2‘îVsî˘e}cË šÁ\ïhâ‘lUMÊŭ'$ro—f­£,9G6î…‚Y./Ĵü>-¸™9†,úÌ#İ%²ĵ‡n´Ï‘˙ö][\ÚdµC›Ŭ:[z/ ëVJ3ĈdÔĝ,\WßN7Z"YşïˆDï/ ZwĦ”Çö=úĜ?yÌ-@ò˘9…@“Ĉ mš‡½ĥ¸şħ·’ĵèÈáúRµ¸.€ç5ıGE™ˆHİɒ ò,^éû‰Ìġ;e‘ŸŸŽġê+÷C~˙ùüÓ×C"_rë˙5EŻdkKŞñdì÷ȊÏİ{żfp)ĦK5ÙÒ!’Şj’ŭÙ<H${Ò\ ‰Ç6ĝm?Në'¨$ĝ÷ŻžB½€gàÈ&ߚ !‘œħ'€—\cñRTídwöÈFŠÛ˜ŭĦO'·`dÉĉÚÊâµKèGé]”üÂ^÷ÒÌ*S‡żüċúéÓ§O}‰|âäɓ'NïOm$R%íÓtkk‹—ƒìqK)JßÜ?<ĵµ?"ÚQDúŒxL$$Fòž-ÒıN)ÉKçàĥ ŭOŭ”֏ğ}òQ„ñݧžú9 X<ûÜsäohÖ)£ş’ L#SJàV8šÌvéĥÍ[E+‰éŝÜĤğĜ,-,,.­n%ı‰#ù ĉlҝñAUYáË›H²û›Mòı‡·‰ĵ“=Şg´\ù"§·nß}8mÊ,;(ƒR£Žˆ„wï£ĵq¸CòĉÚ͛ë”$G5wn?ƒA°Ÿ?‡³p|öı^xñe$HX"ĠF’Á§¨ŞyRT;pDŽħĜ-şö5è)Öŝ.úmÂ`9dLŬ *óDòAœû>İşUwäPÜ×£ĵÀ;ûóîĤ¤~4‘79–écQgMnx¸?*‹?ü~gG™ £éƒ%˘Šù’´Lï„Èġ› %éˆĵ/żì³Rt $ŭaÛ£ñĠ×ŜxëÌÙs`B{uc3ħ²e-HĉáU×Ùĥ.ˇ5á<žyûÜù —.ĦÛÜ͍-£2M qO¤­pĞ< H´ĉ Ÿî½ÏJñ£Q"GÂ.ÜŜ•fJ$ÒÉ2@Jġˆr†H(—M"ï„ÈÒFX­jŬ¸ƒ|˙poTíl¸ËĉÊúvW¨4n݈zϏéëÜPĤsD^½|áì›ŻżúÊË/żüâ‹@%m”|XżòÊĞ€À#n—Ż —’%R´|1%ïXoBdR´g‰Ĥ™ùG‚ĜuMc&.Ô X[jd“)ĝÊ&nŭwĤj`X Ş"{ˆ”î)<ۘHVüO÷nMÛkKk›iî5JùŽíƒGüûÜZ†”‘:šH·Qƒ(ĠµËϝyóġ×^}ġĠW–/À_x—Á³Ú-‡ıóÇĞ×Ŭ`W÷e *ĠhwˆnĜf–Ĥ…hŽïÔ1üïÛVÜÇÛ i¨€Og—ÈşâL¨$džÔɰGö)Bz‰CA&‘Ô>=™îL\ıĥ²pÙ] vl:XÌŝ*<Şì€!2í7· S’ptŻc“äĊógÏĵùĈŻğġšÛ+a§|‘ë7àr}ŝüıó°=^ıħ° r c÷Ö´š˘ô‰5íê sŝĥ³B„¤K¨"“mC¤ûR• Fğ3µ§§öDĉBäf’fFÜPĠŜIÈaÏ]´wÖז]ĵħ²U4MNΖŜÛ<Ó1şħ gv”ßbˆ$ŠıMòÊ çÎ}ĥ·`Ż|–Û1™Ç‹WŻ\ä˘GPŻX^^Mh‡lAMIӀÈR‰ôNŽLdKQÉlÜm:áé›ĤáĦ>à;”Až#R S£]&9ħÛħ²~/DŝlÎużIޏİZ"ĥ6+9ì&"Û֜cĴ5Y"ŭ´˘JyŜÉ&É 6ÉĞ—/^8ċöÊ×_sëġ×ßĝ ÉC^şş°pÖ×—aöŭgQ-ˆTÂş,ĵm£Pe&`G8°ž‘ÖdݲƒpDd²m‰dÍÌÄY×u˜s¨ ’M;ÙC¤D9Ú.ħ;Ŭ„‰œíŬݽşĵpeqöÈĤözyĊú“òĝ³4´ÉĠç$ŝë: 7\rLž?wî,n•oBäxĈŭ l—ŻŬX\¸á‚G”÷Y_ƒ…–ĊYÉdıŠlMÑÁUû(hbŬhÌHİÇ{f["ÓĵĴdG ú¤ç.1eEL ċı)`ú&TȄÖ÷p³ùéœëŝQ}f)&ĝ×{–C‘°1 ‚ÍöÜŬ`ݰĵĥU¨lb–ט^Ğ4ë—QċÄ8/ı÷ş÷ÙvûSp‹‘tL^ĵpĦ„uέ³oŸCıR·\ı¸²ĥŽ9Â-ÈIEİçBŞÇĜn—ù1— “ÎÉñ¤òjëHì›ëépÄeZĴ”‚ñŬ3ħK-ìô’tTDFD­ı{W# wNh47É=w9"——W×aO¨UÊÉÙLgÓİ;,š˜JTrÉ5ŝEdš%œşÁ"l”n]p—·.œżŭ‰+ËKÉĊĊeá„7 ĝy"+ *ӎħŽv‚2‘Mc‡ŒœĈ΃[úOˆ]y$‘y,·iŝJDìMÛÂŭyÄ‘ĵïkWú}0‰œŽ¨&&:×ǟ úہŽ · :$ŻıÓúêµkœw\aHĴìĴP ’—Öšĵ7%ŞÏ!‘Ef sM˜I3ĞïimtU¤=Òâ%.ézĥé”pCÁŜ"òŽĠĞŞÎb"ħÑ풎I8Ğ—V`­’ŞM‚5,†*ŝB³ĠO¤À#şÖµÄzEû$şG<–Ndâ<‘)şĈ7§ 4´ƒ˘+WûïE‰êsHdiL‰}à­zî˙+ q$ätkÍSĥžHš‘gnĞkUDdNéİz„‰°0˙ĵƒŭğĞ+ppÂÓ×ÈĦĜqÁ)èn$[LiĦ1Ŝ–‰ÔS; ’¤^ ż5f5Ô{ÉÉŞ0×>zYš`Ü͏%’“Ħeñ˜6&îĈ5iˆĴŒ){ށ·×Ñö­‰HpÔ`',÷O¤¤Ĉâ|>‹£˘‰-³“Ñ&éKêÀˆĵ4h“sŬz4ĝ¨5:(™Ç„Ż5aà™íMzˆ´Î zı1^5$'ĞÒ÷UÈŻ˜‚ÀûÜÜ8 ÈLŠVEäâä-T´q‡pïšÈÇç\÷‘‰}†´…Ĥç09›¨ŜìdĈÎYt=’T’/jŠtH$Ĝ2Ġ< Î稘=ñdi‡\ğiGéûòü‚w^ŸÌфǸ jkˆ$´[˘µ4ä4ƒŒÈ’h5gR°”ÀMZö$ĝí•È~chÊDnDšSÛHĊ72ÒƒMÒIö,È­éH3Ŭ”IEi6+‹#ˆÔwÈŬB M[äÀYĈ‘u€à>C<’È˞q@¨!ƒé‰Ä³ŻğİÁG²âş‚¤ĝ$‘Ħµl†ï²³µħĥŠŠû¤U~ϋküLDĉ<¤, Ĥ#L‚ ’ NËö窀hUÑ$˘,+.mäÒ¸jĥĈ‘öÈJ ´Îrɨĉ£Ïm`Nlä‘g‰Żfĉ’Òr#8µ{ÉLք‚Á5S5Ñàa#†ÛrÊJJgg î˙+ÜӑĝbWHdÜzĉĊşĴĠ=j£}‰¤K ‹Ú§aM!`ÀwˆÄM’m˙̑$:ŝÇm˜9I¸Ù›n´}!”ô…ÈħûښF[Äş n²îÊ*Ŭg6MˆjëEêíoÙĉjßúHƒP˜ş—HTc§ħ``Œ$ß Ì‘.ŻmhZĵKdèރÜ6Tù$ˆüɜëŝ 23Df…•í Ù`‰{"âNב6Fıdœf9‚J‡Ÿi™cŜżÛŽHÇB-úÉ-7ÒxâÚ_°ƒBr†ÉPë+̌Ét6 ›D—è/ç>ğP{cMÚ#k™òˆÌ²ġuŜ#IQ:+""͗-­çQDŜC>òsOdŞDĉÁQ¤5X°™°  †pÑ­”zj‘É‹°ħż@8<żĵğ:"GYŞrG2‘è(r‡f­‹;ŠP–Ÿ,$ğVħ"‹,. Ö[[\ ċĊ¸EšiWߍ²…q-o×ÛI™Û/´ĝĜILOd6yD†Ns’ŒG˘Jë‘y§7á–B…Á[zƒ‰…äÜڃĤĴħÁk3&²Ş·Lġê‰D3jĴ `Š8óÈÒ_jyk€yà%…ƒ şqZGdŝñD²Ğƒ!21DŜCñóHdf͑ҴÊsp)ô+­ĜÔÉ* …ßC“ş@&ŒóŜ³ÀûĈ6›O _Çtl‘Gvġ"‘MàDÈrêLdK³…òÑ ŒMòž™ÄÚŜ5{7›¤û-Œ&~@’Ĵˆˆ Ú{x⛴+Š ġIùĜœë"r[÷" çmÉğIIC§MÓ gÏû"iuìžNL‹šÚ4Lb9ûˆaZ1ònjSġôDrIfêˆ'ħr—HtadS×\-!B†tkK˜ÜÑ$&RKĜyQIr3#sĠXˆôDĉ‘Ô@.6ĤIL"@êíŞY$BÎbż•ĉE|â§!\.”vġÔ™ñ–aúc""Ĥ^ş6Ġ<ŠÌ™'ÒÊVs7šşDEDJg’ì•’µVRJd²³LníàN×m(Ò£&eyµĤC¤ŻïšÈGç\÷CïĠ&6v–6â1Ĥ%’H1Wdûgg`ŭż ‰”œv”x޽úhÔ"Ŭ†ÔZ^Ë4lħŽjÒT&£.B¤ ñË$b%_yšA„9"§\ÊĦĤEc›7×wàeŜKdĉ{=鋆Dú2Î@d@¤Ÿy1Ö}AšÂ<ëJâ+3Í Dĉ…xŠ˜‡·óıá,0ħK™HÍ=…ÒòĤ@MWĠLƒx*‘Z•'0_YY+ù·²4üôÀdYIiB¤Nw­¤´ !{5y‘ÖŠ8  ·Û*hz-<ˆÈĴçšÎ˘h‘IŠÈĥ}ğÇQDêObżŜŻıpH£Àg”b*""½’Ÿ/+ê0[¤!£n¤Ĝ7‡] ;9™uˆô­ĉ\I•Á#Ġµ”À]ù9ù(gûüİS§~mlÌ߃݋¤µĵN""!Ö§.ÄÊż<3ğ…yÏĞi˘rµµE†qÛÚLŭáU†äR3Ğê#Hroq­jŝ6ןŠ6Oɛ˘)vĈöTDîá’‚Sşŝĝŝ’ĴĞÇŬ& gDŜS]{^"˙$òô;@äû_z÷úéSÇÎİ3í™ t{€9c;·ÊÚĥyÇÒ6oi·^")}wĜ­ġ56y÷îH"y5zB…Ġ:hXĉÒOpġ8{×&²5ŬK|‡Ë3+7"éċ+Ş RéQDV6OóŞİ–\vë{éŭı;"YòûÔ;×ùħs3î#’ŭ\“ 1Çw\£ħySU"ó¤AŒĴ,{$™ ‘ëë7 ‘UHdbŻ>Vd?È[7Jqr*nùV,Üí´fšÒ$T·×¨ı‘CŠ Sc­K…Iùܖ!‘qfSmxïe|dŽġŻ}ík?²DŝöK'OwìßmÎç6ġFDĤXaR²ĥDúé¨,xŜ%çeD ԃUĜĊ-Ó^Ró†Hƒ¤Ĥt(0”IYĥ”+‰Şl€tmmlùvğJ%ôr%2 ˆ4&Îĉ,‡H{‰2C¤)á]ʤÁ!÷ĉŸ‘§N_˙ĊŽ1‘>)ıÍM„&†5܆ĉ‰Ì8İÛeİ›UC]kĜ¨ŭıïä`"7eâ:"Ò|VxZ‰ ûk(#­sĤüGs1›"×AJ¸yĈӓle˜Gwók‹Ei@$i@¤/ ŞÚí>ç¤>"aÙS|çäñ=µùOLXĜ˜ú¸°a³rCd–†3OÜŜĊ~c,ĦI2/şÂĤáċ¨ë¸°Ŝi–ó:Ra;MWËĜ˜ˆKX"Ug”x*ĵıf~‘˘9£ypĴĵòDĉĈ TU4Lso7áú¤¤ĊîšÈÎı‚8òKż½ŝüCÇôf“M·½+"rÔÊ ĠI)Œ¸YRşÍ™Hßc˜‹†~ž™òP‚…ĵ™„Ÿİ'Ù|vGTOTĤib'$RapCí$-yšĤôSÔÁZ‰$ċ ’‰ż–EàPÁéħ"ÌR•atUJìS'òä'NşÍñôİS#6 ï=d >s"ß@`*$1‘ŞeˆlçlBÀC9Ŭ‹-–HžW,(ñ×éŻÌJ#A`~;+ÙĊ‘ëÒÍQ@ÔVİ@3Ĵ-™BLİïĦ!"+ï.gMƒ0’zë*eï'UUOmß|ĤM™W½~l“ĝ´÷Ȝ!—°½ĉfǔÒYHdËħ%2Wğ6cšîíìƒí%ÊK0‘)^ÔáSɝ",U‹k ¸¤ĦŝN è¤v9Z*č+üdqïO^â_ŸL+œŞ|£…-Ġ[7ì* 2ÓY3kkĥÈÖ˙+’ĉÄr–İ[ú|§È˜È˘ô$Ytá†Df!‘GĉıÚq oŜÚßCĦ?˘!ÊJdžE­ŬzSòDڛUKú넔 ù"!íib”òށP•Κ"‘…!2 s?^1Ê{R¨Ĝŭ²Ħ j%ÁİÖ·½–jĝmä; D†YPAÉÔ} 1í‰ñâàSÛI~†ŒGöl˙àÖ-Ĝ$‰ÈJÌÙD<_DˋIÚ½BDĥU £Ö>‡+3ĞÂĉceŠS[09,a“+}kŭä_µD–a´¨&ıà6+ӎ1‘dïoğĊ‡R‘‘yY™ÇV@uAMY²`➍­$ŽÌ3í GĦ4Òeix°Û‰DÂ&ÙĝIcĈT›î†¨§-tFò˘·‘‰İSvS:… ?PĜ.§€µ$"RB‚`:“Ġ(KPӟ…RÑB$'%ޘHŻ{tÏDŝ`Îu_‰ŝ|ĤÛWè& —Û<™x"ǤîlJĜ:)Znç™Á™}°żÓ´‘ Ğ<€A*Çk1ۛU6g[}ƒZ½M*(œ\(lx+Hf(. ?=[Ù$³ƒ~;“Ŝ Û.“BŽÈÜ&m/‘Žŭ ŠOgaÓI7"DšŽ]|J57â†YKn$I³< ’+Ò5{uWm?Âd†îšÈšsŬoDŠq÷Ì6IL?çZ"9rŽÈ–~€\*îj<ê6ñQ0¸%âI˜e"ıäX€²ĊĈĤ¤âéÎZEYrk”ñübïq)lkn ŸÇ@dH¤ñÇf˙Â#,gtZ‘n:g€†ż°á|ĝááĦgr3?@$^·Ë°^‰Òx“Ŭ$µ{‘.M8úß.Nê~]"ƒĈ ŞÏ ^äì/AâÎîK‚@ë¨6͑~È ĵŞs܉xĝ{ z7´aÉkéTŻá'U18<Ċk-,ùĵˆ4DvîżQ‹Cü{0–GÂ|hğşwàˆ4ğ$ɨĦÎ$ı˘1“$}ߌŸ÷sLԌù>Òò=›'ĵ:’ĦÚnˆD+Nä+‘îkîBQešƒéñ, ‰,I•ÄŽ&Òh ‘ |NLBT:ôc~ÂD.vôMîšÈïÏıî"³#ˆôİŸh†?5P"ŬğëŽm<Żá/×=wŻĦċˆĵŠz‰ô]Ù´£–ĈŒÂ)§6Ğö“R@Uġ$0›ÑtŠYÊä³²›û›)ŞŞëQŸgf¨<ËÂSÛŭîËlDdJ3†u%?žÚ‘ô Ġ|]Ú"=‘UĦÍĥ"óĴ˙Üĥ&›ĴhZĥIĵmCŭCÉÙDÌ´Är;I{ä1AV_“6‰/‰È†o6âÑ`çN45dQô§–íS9) ş ´¤ƒ~ÚrÓvż‡{ı* ™ñ!C$Ş·ı¸‚ Ü"Ev†³u—È–.v"ŝ'g’÷÷)òÈ;!Ò·¨ġ ]ÑFβ¸vôìŜè\İDFn‚şCQ¸8uXÏĈjԔ{"a;¤;w%ÇäÄG›È}°Ó(„ATVÜÖ ~àÙüšħœËĠi8ĤĊ˝òĉR×[‹Fú3UäWâ‰Ä£ŜèQ–Ĥ¸İ­i‘žÈşÈ½§‹H>ĤÈҎÒvȨ”q°ğÊ5T@äXòÀĦ%ÒeĤÇ?1Éa!’}ĦŠâv×½IËí9‹‹AT0Ş9 $y?ĝ&Y™”£…Ñ" ĝßâî†_KŻíhu+ߟF!4iF,ċë´Ó]62ÌÍĜ}|F‘ĴĊϽ˨ÙĞEùJۓy×D~oÎu?YrGİ/rĜ”sóĴë;çƒ(DD‚żÍOï}êE›ı QUĈ#¸r§ŝŸ­=ÀyoJ7/w_ŬmNZ3Ĉ6ċéX2“ue$5üîŞîP¤â_2‘ GZuĤbMñzyŠ‘“½ŭŭiCvMĜÙ6šîOŭĦL½z¤|^ȇŒËĞ#ÊT•ŒÈ€ÈÊÛX‰IŝZIsV(LÖ5”­r=PÙŜ"âÁŝTÂ<<·½UfÚQ‰†k°{ǰAc*M°´£”Ç8qW‚‰¤“xêbÖé¸5HY°·™Ş£lRTÛĜvŒ—¤xĦ„#–ıßÏàç;ÜQŬÇt&·oÍ""ıƒ7çBX8=Ĉ#òĦˆ'2î%Žüîœë> ÒŜT+„­9ĝÒo“÷éI™Ó4Iž"Pîâġx‘ï@à„“hGkÀÄÁá!I †ÜíŜyG{][L°ÖîÀtç;İ"¤…½˜yƒGRŸüw“½q;ÛëÑ\Ûo‰„/֎÷nŬ>WLdVµ³ŭp+Ûùu 7°÷döŭʘŞÙ|@¤!²6çT~¨ı•ŠÉÌSĞ›–v9lĜŒÛ#Ħán(“‘!2MT-/pË9†owĉoĠTÀ+²BĤZ€ÈÉ> MŒGÉpB×ğŽô b‚LBvو·Ha§cêv炢İÇ,P{¸×ÊüNüé%žé“Ëc™P˙‰!ÒwQÔ>é‰ôw@*²ŒnÍİ •fĈÀ:‚ŽÄSc;v§0ˆHïp@$My;3@ !£~r…îYX˘ĞKžü" “cTş£*ĉŭDĉÒĜĝ;"ÛşôöiÓr 2Œ#ġü(ù(İ SmOí$:µ­Í`"sŻ">Ċ&Ĵµ%Ŭ8Ç"²;ß²·Vo[³ħ(€,¨ÜĊĉö­ŭ٘í‡ħš£ĤzL$ĤĊj›¤î) úŒ² äµaıŭÊS£œjJ™¨7kŬlĜŽİçlb"anÒr?PÍŝ$^ú‰üÇ9×ŭŭħ7İÍ"ĞŞŒĞÑÑMÛúĵ}x°;‹vĵŠċ:Ëŝ;âN&iġšgwáŒĤ 0(ZaË1fĝqJф¸„EA?‘İ͖uk:Db…ĠĊŸ˜0ÖÛ÷¤úü9$Ò 3i txàF;F Ä ÉVÁ— n_PuÛÛ7Wu* şwó"˜l)9kT„›g ‰&R‹8BäĥÙjŻıρ !”߁H²Í(Ċï@ê²c5Ħ™*/bžyġ•ĤHK$“5:"ı™w 2šj0š‡‘ċG™„DB°W–…@Ñ} exhÊĊŽĥĥùá,*’d…¨î•yÊ-µ%²a"İàè[c=Òĝ/‘t wêB·m’%YsÖŞ‡ÈÀ˘ fĠxH7"kıkKĞ1_ìÉ=Š£"~ş‘ׯ?|êÔCï¨:vìÚÎ-Oäˆ{ÈB"ğ·lCdVvKdt“ ™-ù<ë‹5ÁŞ5U54;ާvS×>Ĉ¨š ĥc‘µÎ(zùf½Ä4˜Rk"r†½ 8ıK]FÜ69ë`˘÷„´RÍÑ$F@úħ]5žëH“^œĵ¸k"ż=ç:ŽDž~ŭùU*i?oúdhñ,‚é´jH/mœ•áˆt!_ĞsıêŜ÷§l§¸ÄĦ’äF+j~pç}Ó(’Tptwm"Rg¸9D]|”L™qú½Ĥn{Ešwi6–rĦ-wÜĥƒP‰5 § *Rf÷AŬ[4ûÉDN'sĤPxÄ@¤YÚf ’/ĴútaNJ-‚ÉÓežGġH†ƒ8’1‘Aùœµ.¸‘ Ĥ\â›tÔjkÔ?݇Í%ċ1ëQĞ3ڔŞĈ8Yä^v(ÏBÍ|ŭhT*âDùŝ‡·oßŝ–‹%w'ì *“<•%2#ÎÄğ€ĝ<:ŜFĦ5ßu¤@DéYİ —}şÍx6›ÀÓċiœÈëןxZ%§Ÿ~É­ßED’)„YLdFFҒÖîژvqµ÷HÒÖ){$ö*›@Ç/š["ÙeÛĊc:Z¸+`ĉ˜Ó|µ­lû~]ÑN½zŒ‚³ŭC$ï‘ürÜ#[#ú¨ä™QÚîû‰Á˜V'ġĉ$İŽÔ#‘ ;4<ÇR˜b"ݟ>}úÔ_ŸÈ˙p,‰|ŝÁ÷c"Ó ™*'“é.LDD&vr4 Òl!ıÉad7’Î$5&1yŽ™Ż$BdÍ.À%™H¨ÄÀ]aoßIM^2MÍ& 6·Ä’n(òCġÍŭ[‡pjïÒmğ*dĜĦİ:V6o9 üĝ*NmĠbî­Û£½ê°ğ~`·'iĥ Ž ÚĤR_Äğ$ò›scIä/O½wŬŸÚİŻáyNĦaQ£Œ„ċìäh‡H}Çd¤Ijƒoi„šeBòŽ"yE s⛊H‘˜ ĴZ(Z6fĜW„}:ĥobˆ;oíϨFƒHaµ?Dz³é#’toĝ´‡È$š¸6DvÌb‘|âΈŞpICV´…'R{†é•šf!"İTÌğäldˆt?n(^ĤXÑqÉ[+Ä H$ĞNİ]—Yˆı™żm#ȞKP‰b)sOħ}ܔœĵAıd$ÈĈ£˘H÷…&òÄÉS§ĵúÓq›Šlĉ(âĉÒHĵ‹dÊáfA£ĉ:ŸiÂ*ä…ñ!Ž&ہô£ß#-‘5×ÇX.Ŝ›²ü£Ġ@ yä[H„uxDm˙ÑÈ*ıbš&ħ?…ubúJTܞ FZD³ÙrµP!"ħ×£ [}ë“?÷ü\œÚa†\ ‚NRNaà§8,İH†Ĥ—H’°ĵR[¸¨7ĥċĊŸt@ÒHt[¸š˜Id#-áÔĵ+‚¤Ñ“,4£hÒ64" g6v£n[¤lİİGÍ˙G~ˆĤ#”*ÌäC…ÁmGZ{ĜݘŻġj ŜÛĵöç’È$Rß˙ZkğÊ>$…ÈàŜ“ú&֏b"Ġ•P=FŒü·8È]𠈔LR&˜²â²éSë1Udħg¤7>C"Uäğҋ_šVYҐÍsĈú~ûùuvġû˘7ŝL}ĜÔĝڍżk“BÙîî´­dÊö~Ù"şh4l„³ ÔÙĠòÍuĵÀíÇX°™MĈJdœE’‰ ( ïtğœö˜ps.Ĉ½Ĝ#ù¸“ŽŝΟ2‘§ßÏâ_<}ìœ:½Eħ*ó¤AÙ0µċ\ÛĤ#‰ #ġO{ âÌisK‰ÎF“)— ‘^Í·,MW%~ĈD$µ*HVÏYöô·‰U#%È1ġ3Ġ,uk$@+&ÒßżĊ˘ÈÏ<°Xŭԍżì]ùïĉ\˙ÁzÇşuò·ÇÎ͸°2ßì’öµAĤ^ñ0H†;öÂO]ŭ2*6+CӏƒYXTS"ÍôŭÄÜdƒŝ XžLYw­V™ƒD Sggŭa,à€ĊéÈÏ‘߈HnüÌl—IšEV’Yž^Ŝ‚Ê3£1ô—˘ëg%èĞ~*D~ùoŝĉo‰üġİëÇÎñ½ CCKd’öEL/vGĊOCJîM´B™~‡:ìŒÔ’%MOħ‚…úÉ‘’,‡?ADŽ•Hu ÍĥQLMÒxl’è §~'˙›¸’Í#‰4ÊyfÂTĞ|e–˜H'ƒ_­&•‚ËŭgEäż8ĥDšAԐÈÉ,“jHijÉ.‘áżŒkvzŞğğđıÖo8³Gó×#”vÒëm‡È<7™,’µ fl²<›&yrÖÖĉfDdQ‚ùԖ£8qV—NíÚ@&v£äú?£Sûŭ/½{ŭĝÚ‘iÏĵĦ'2˙("ÓÀ‚£‡H™2è"éŭ’Jħ’Ġ4ižyÏtħ²=U•Ž"2°W§Ş(U!+9QÁ~N 2‘ĵ6ÍéÍŜgşs/ĤÀ :í8Ë͆Òú )êÒÉ'àùġµ9WHä/ ï3Çâf™g½â]&†èŭŠùȲŸHQi2]i6µc†ó|RŞTÍ ‘’ù̲Ĥ7Ĉ@8’K–cÜfQµĥ7íH"³˜* D½$ĝëĤEg ÑT>!ÓOQQV–Ÿ˜/âŬyò'Oşż>ôKÎù<üŝġ÷|ûÍgOd`u`ğ :~[ô³=ò8gÈ#"9ÙO0³†ııᑌm^­>dH$ €+QÑàŞqĞË9mŸû&ÇG%ħ­€Ż“°£²ˆĴtpˆ&ħ{{ìÇKğ["K$W’4 RġüŽ"²˘.síÁVF¨Û‘G™ċıÍ[˜ŞI8‚È>êžÈ~"ÓĜû5&²ií<ïÜ6bo0ÍéUǘA#ĝÌĜĊhdŞ9˘Ĥ‰ y$´2Â9ÙlĈ–OS–nÚîwr8ŻŻß܈¤Ëžĉy23`žqÇEt³ħÊ ~ŝLÌkëÈ$2 ²Äqg¸% ‘Gv·Z‰ú¨š ӏĴs_ÚQëŠ^w´ĉħRE úçZ%žĵM<áä.hòâî(“€Q2ˆ\s ˆÔN yQwZ2z$‘”¤‡ċ΋ä"òĞsû…ÈNÉ!ÏlQXÏÜĞyÙ=2éë+ċsmĤEώ°ħ•Ġx¸Ô,CÙä1çeNÈhşDmğá&DÈûüÙh4öMI‡Èġí$&’óQvt6ĴWÙOd!µv.€¤VñIĊ‘_™sŬ7D†Ĥm°¤RH%j‰ïFtsÇ˙áßDü>’["aÏÚGo™24IÇŞ3m4Ĵ‰%Df~ZĈLU÷e<%‰:ĝ¤IĊC-öä=DbÙ%’ĥì8™mÎë÷Ğ- +ƒ‘sŭ¨H?ĦìÏç”Hó8+ŻH&ißÌFġB$<ÍÍp,è·ÛÎó<Ï=‘“½[³.‘â>2ĉäNͲşEpĞ­Ô•Ħ‡HÏAx‡ŻĊ*„ż‹cÈ~ıŜO$…ħVĊ7tôŽk6>Şċ¤q /˘,Û@dP×6fĞšâĞ)͓ĦVH¤I[ò™ĝ·Ċ>ĤĴ…6ĉaĤG [˜"‰·ïşä)×À~öžÜ_eވUĤòsı2ò;QßjÉ>ÊĤ?aĜŻ]²Fġß-ûˆ,ËèAÛĈ—œ…,*CeŜ”˜KÒDl÷µÏn³Ĵƒ^“31è<ÒZW}D’´óD"­8yi´KAílo6ñ{dmÒy•ú\6É~ á;Íö÷ ‘£€ìl:Ò+|<Ë5żGš†ßó™ÇóžHnÏ$^ìÌwˆĵ·ÉŻÏ#‘Y‘66óKT3iuDU Ñ:Ŭ°nH—¤ĝÔó&ËġġżÑdĈadJQòĜx?‘ŭĞÏÏŬÉÈ̀µˆù`0l?ĉn4H´&))“ƒÔZ9‹2İ6Ž,"ÒŞëÛZD.ĴDöÜl,‘•24–‘´ûIË+Š•‰µĈŸ&\˘ä‡żkƒŻj͕5súë[N_5’äOĵ#SœQê‘ZƒW¸m˙¨”"Arzĥ‹Dĉa!‘„îà‰TÁ~MNMĤğ³É(9""‹ÌÈWFDr$½4ğ'݆;çş?ˆÌşD††Ġ‰ïFĞFèÌ ×ċ]îĈYiáJ14‚ñ!²­Ğ2lËŭ-œÚÄFALäÏ+ôÉ1ÀáA¸!‘dŜğíuĦí7ž÷âÙ¸FEDVeX ÷Y7™üˆì™…DjĴ£“Xˆ$şŽ-‘4žÊ¨¤‘XĜj`ÀNqd[ۆH%²ñ+DJĦÇI>àĥcMçx`µŸ êÛg§PeğÁn ™Sġ"ş=.â‘ùĥÓ\nkœbŭà£%RƒŠÜ&"ó@ĜÒ§´îeüğ9×}B¤Gñg)uŜd‘,RÎDò­XT˘Yŭ]ÎÔO˘ˆT=èĜş÷ÓĜ :#bÈ"öQÌ­·(}µŽTIÙĞĜ¤àċôk²5\G²Â¤É­lEšÙSċPY.ÎĉJCiâÜÓ̤p›‰Ħ'2/z:nĝx"q6êi­vĤ›öŬ–š¸c"SĜÁÒ‘IêÀ ‰ß$s_ÌċšI$ Ù°~dTZÍî1ù·sûˆÈ÷ħ‡ħ'ûü‰.:ĵóµĈíšc°> WŬ‚>ġ" —ħĈ‘âŸİö†5çÄMżIŞmĉÈó×§´€²Š8À·Ĵ „ßĴġD‚ŝ=ğہŭ<™Á·ÎÌhMâ=?íÈ 7Áċ\ŭ…$òLµşrJĥb"ŞèAò^TV>żD. 6û‰{X.²!Q+ú˘ŽÈ)î=ŽÈĠċċċ•€šħ#"eózğŞêcĊó½ADdO£÷!‘{4èGô7ĥ Eıš'š WRÂ+ •gĠé ²*m„Š dà/’Ï"*ÖFœÇ€Èµ•…Ë—.]rHĴoè=Ħ0Dz÷i|Ğ%ÒwZ”d"}rŞÁċŞŠ·5ÍŬzS8ĝ&ޘBAŞq0$\ÓDELġ‡úÜ´…³…§A‘îŸUnäáè› é£ ÑUĈĈ§Ĥ@d—ÈÚÜqıÀÌı™²,­àRĦ²`çH+kŽHwh߸xá…Ë7—W×z‰”™H/*UVÔàĦ4|ñ&ï·`“4Im()MG5šÖidL‡—5}lŒÖU%F‹,ۂñ^Tò4ħmxeleÚŞOïZoh¨‹ŻêDdÉ%-t€ŞCß ĝv‘ŬS[äiä*)úŜŝŠaz(kÓ&VëĦÍې{?ÜĦ}ċüısç//,kİus$rÌ#ב/–÷À™ŝH…écàO½lIDAToŞ2ƒ§ĥğv50U…i*ŠñIħğVğğmıK÷WŠ|]ĉ‰Ìcyݏ$rkœŒ·Ĝ˘Ö\&;çÈ.Ûà•m ²HôÒôKÓĥ~È´0+L•ŻÊİ ġıŭgg}uñÒÛoŸ=weiuM²?핈Ü%k,ëf‰Ç_ĵ*†'’Óċŝ&!?ëÙD"ŬW"ĠL‡ÀÈŜµ2B£Ĥ^Ŝ—̤²E·šÂ͎dK/‘n‡ŜÙÚڂ]:ç@^jŸ3éèúĊ‘ ~›H›ŭ"ix_µw8Ä)4éЧd0ïg$ž¨ c²ßŻ,\|ë­3ç.ßä‰n“EDN÷şD²óF‘Ċĉb’Ï ‘ŜE ·HÌ |C7ä4Œû¨6”çı­'ÓèLI÷è*$²4ŭC$|&×·vܧCkçġ/‹‚1Ê €;žC‘G9S"}ZÎùh?•Y›aħZJ~Dž9{ŝĈŞJ^Ï|'~Ü´ġ­-B§Ú¨×°(uÖ9îMw—ZC"sÈílÁç ˙:f›*˜ òáŜ[û-Ċ{•wş'Y}ù šò{‘°ç!‘yĊ°qÊ ç*ĞhNZˆ>ìówMä˙>çşˆÌY•qÌM *ŽÎ+êkcû£ B*7”s=ruñòÙóŻ,­ED’½%l|,ÊGżÙ#“HĜ·°êÏUÔt.÷0ôODBÉhÍ]7ôĴ§sĥöDĉŞ™`oiŒé>.ğ{dÙpÁŬëħ,¤Ùí1M•şÄ:ñ‰L)rüĴl­Ż­oApÑRcҘÉO"M§…OhPŝ6 Ú×Pˆ1p’ÈmƒÍċàµá÷ĞK×.\şħ´şžlîYÒĞİĉAšĈWŸ‹ÈÎ;‰ˆ,c1·ïĴ­2‘ğX­,ŻŜÜH¤c˜üLĊ™Ûo X­LžöïŭŭPħ/ŒsT)qÌoŽıѽR3é"‘5Éİx2Âiµşâž Yl£3/Nü DFDjtde3İÉú.ëÈې*ĝt:Ua)8ƒÖW—ÜXvG—•3ë=:ç_ĞÙŻvüĝŝJï&=ÊH˙Ëèî}F"Ë"Ù^[ZX^ÛĜÂM27aŻ—“1:§ĥ‡GfÉ÷?Ü#‘ÛžÈVş•VBg"RŸÛ››˜ĴwOMĜVêžÌÖĈÚÊâÊĤÌ1ż†S‘÷Fä˙6çşˆ,ġ|NĠÈ%ò4NܞH‰Ĉ $rñĈâêÖN‘‰U)Ç. êĝ1êgĤMû³—ĈW3™ŝñ.'ñı ­;ĝŭÚòµ›[,cĉ ö…ßB‘•šî‚ÓÁ´­rЏ}nH™LĈ#mL3slîWŜó$ƒñwösOˆO9"Ŭ£YY‡SœS‘=DŞş£o bĥN|އM—HràâdzYa>ryqa郝î½b”NgoŬŽĈcë÷‹ž_­öl°Änj”+“àĵ!~Ì Œ#Ŭm&Ùùàƒ•…0ll'o½ u0Ê*8j_ρQĊ½ŭ[·˙t¸73ïV­ócŞı8"ÇÓ½™4§ûJ>LŭÀ-+Ğ'ûğ“–ìBà.[.|vÖèjÓDEdÂ3ZÚı1ÈHĤĤK¤Û1üxı´¸üAQaׂı08ólÇUe AğˆÉÌê퐌j?‘9]µQ†.Ĝë,/\ğzġš;7DpZj2v4ĵÒĤ²64oaÄûàöżşM²ÎCd;} èÁÜß۝Ž}ó!2u·—í4ofîOm:2ü@,ƒ7Ñ@äQD&˘Úž¨Û#¨ż: làşn…ĉ¤‰ÜtW‹•?”ítRgİMàà˜Ë$i\µA¸A÷H”FŒ2äIÓ^ĵtˆĵɆȨÑȇŻĤw²wpàˆüóíŬ&MÔGŻĴIÛ~tèÁ<€‘²HÊ}9"×Ŭ~íÎév˙ö-!zïËhÈx ò("Fá˘qéĝÙ³:·öfHRı÷Ÿ,Ùtʕ•ŝP€H?™ÇĠÊQ ĝS5Ġ[ ’’Üĥ>KGÉSÖxpŻ­.-\ıy§…ċU(mlqRò•ßĉ Dò½ŸğûûGîğ=Ò[?–˜R Ĝŭ-JoŒ:D½şC7 ˆXOvĊä‹û%“ .€”ċˆc¤HC¤ZPġ‰´˙ö€ìôÁH£UÙ) Ò]4ÖŝPÖr| oĠP… Í6Ĝ!MJҏ`ġ‹WèÍi:àV–Ż]şpö­·/\^XvÛôÊÚúŽ ×R]£ƒâzhóŠv8ĝp‘û·öa`H?„9}T)pD­ žfßoÓ·›Éĵħ UÌŝHá…ŻÜi…H÷ŒîšÈ˙uÎġüŭ@¤ÎŬ.ôÇD$ŜKÛKžp']yŒ²0öµħĥĥU4}%b{Ĉş²V,|rdRÊ"3›äĥ‰g;DòĤUwırñÜÛoŝÖıK7–Wáz³£ß6ÑĤĉ‰är,îÏöpMÑèU˘Ì֌ È–3‘\ĞÂ~{ kAéĠĊ (4ĝÍ]`:ٛÍ&˘@4 ԅáp‚àž*tÇöĜġZiz@ÉŬ3\ôNDŽ9Ş"ÔġÇŝ(š+‘ ›’ ŻÚš%ÚŜZ]şqÙmoĵŝê›@¤ğá,Ĵ˙”o2šîĊW!rDZü,GíˆD K Ĝ]ÜĊż(W„×ñŬ½ŭİ-ê#Òĝ—bE,àPAĜñžĤHä˜N䑝S›‰ĴÇğğğ£’ê`LaS ”LΤİ)†D×Uĵ˙`'ÎäP¨GXŸ4ŬRÑö‰?ôì’4êYĝäÒúÊÂċógŜxíĠ×^?sáʍĊĊ…Ġ­’ûÌ`_#ÁSğ4DŠ*ôh;ĜßIò\Ġ+š$Ĵ$A´7 RXœÌB\+52 ĝ‡ĥÜĉŬL@Jˈ÷Bä˙2çzŝ~¸k“Ÿ6<ÈĴžş(j\&D¤9“}„"YVuÛĤM’< v Ċĥ)I“™×:Żĵ •ŸşƒCİ~YĵKf$ŽéëéëµW^|ùĠ7Î^ĵvcaq2@D$ş%ƒàÊd4 j†J¤LŻ‘Ó1ÈWɍƒò Ÿ‘ˆ„Í-¸ŸUƒÔüĞ—¨TŬh:ÛÚrŸ ÒmĈ(Kóİùä‹ĝ‹O‘÷܏È{Î˙Ŭgš4ŬÎÍîááá´JĥÖ]$X˜¤ıżn°x“HšÈ”ñ˘=8*oĵ³+ µèÌîÄdexıáyşİz*6ôö˙Ëâ·_{ñ…ç^xġ­s—n8$—W×7Ó²˘”ÓÌí|(Ĝ1ÉĤ fşÉ *6·ö¸ ‰;5 jççe,R’}Uğї½ĞbíîĊֆÛ$‘ÈŬٔz->e"OżƒDŝÂŭğÇÎİs38Âû^ÏnŬş5İRGä$´Ù İ1× /İoK*ĵ†Hž`İqŝnì…1TĠIíŝ}D†›$YÇ{d&˙íĈù7_yîıç^|íí א+Paô0ôÛĜ@Ŝ”ûtúzw÷Ü9 ‘ܐ‡DÖ¤´ ”³.‘Q50"n,§"ż|>HĜ#÷QpġŜöÈ˙yÎġĵġŽ}à=ü‡cĉfŒ§ËÎÉݽ7\áÖ1ŒêÙ ^픔-´mÇ3TµĴ€ï­Ñ3k$ÍĜ\é.c@żKÊ+ë8ŽTáµ˙vùÌk˙§ò•7a˜Â­Uwßçje£á' ˆôMp#oš8›Œ.ËB‹–™´d`›Ġv'‘Vh?R4$o†ĠÄ­-Œ#÷IpġS#ò߸eßßûÒ§~÷ĝ9“"ᨭĈpŽTPœŬpžÚ›>"K¸-b(4ۃŬ‡~Vv‡’†üd› _´QY(rrı´(ħ—ENx08Ó!Rf¸‘óòsO½òëo_t—lȏCwá}è&¸ĤcC¤Fħ$[„f:âÀd&~ÌduЁ '27Œ#3UŻPÁB:/вìrPóYyâôġ_<|ìˆÄçˆ}×@ät*žŒnÇ~Ôż‡ÈÑìàÊi(ŜñĵLÒÈÚJö_ÒĈ)Ué^GA^FÇ"İǰSĜÎ0•-]xġ…§áµ·Î_Ħy³m­‡Ğ2ċ8"RÂX&rJkÏ.b=ÜC™‹ì³:µŬWxàĜÚ”ifċív0TDFĊqm•6D&ÚĥÛr$d‰LQóŜt7wœ4%( ¸mĞÂŞPUP:ċ—·fşÇż}É"Ú vsä¸e鿸Sûċç^…ì8kèĥ6>b¤8jŒÏ÷ Œrw‚PÓʧh; Ğc`Gïž%Rç\ŭ/E†[şÏ'‘·÷0˙Yù£ß^ŝĦcw³Ħèoƒn6îPċ‘/Ró:‚H ‰àÂM0žH‰#q80É*웠8êâږ‹ 0sRP ı?9ġĊë!ž‡=§˘ŒŭFô`M“µ… o˙“$„ÁPhħœèñ.;Öt×Ñ8Û%13xû( ´*ê6óDêX˙gÛoéɗ„%<Ò`I›ŭÛ:"‹ô^ˆü7s."òä'Nžt\>têÁw0çóû×ß{Hŝî3'2 <—>×8’ñNyRĴB)Dê]‡·SœԑÁġĠĠġ¤ïAÂgU;Ŭğġá­}–ד’ ŬpC ĈŝŬJ|!Št{}ùĈ³gÎ_ı[î–]äUÓZ'™HWĦÔÂ4/íïííîħŒ5…eÉZmTəxyĞħû­ ‘” "÷OÉ·›î7ßÙ!ӍÜ"Dŝéön‹!Rú)yĵg3{ÉÈúƒ7ùôÓ¤^‹˙üŸ}iïldhˆ„~Ċ5h™E!(v˙îwH$̘”=,;"GğŜ>„Ĥž€÷ %âï~—Żĥ40\öDB¨çˆÜX]qù•…˙ôŸàŽNƒħZ=tŻ"َŝëuÑÇĤĠKžz‰Éô{İ£ħ Áż˜´˙ċżĤŬïHmx<Ħ°uş(½ŜKé„NËÒ9ƒñòÈ£ˆÜN|FĜÙ4˘˙ˆü˙щıı‘ ıĥ%< úÒKZ8µ“r„e ĜbÇî-ùӇžÈZ ÁÔYñÒK…—-c"#$K˜uo*¨_-\[Xŝç^ßÙÏ8/›!Á -³Ë}ğŭê˙Ħö $â ;ˆŽs7‡ĝ_jÒWCéW/·£‰£y-Ètq<2W£"ÁMìÍé%€#+ ê0ˆ Ĥc-‘‰Jˆ6^6Y*oˆ$İĉë<äiˆtAäúêòêÍmíN݈H(e‹uxġäà?ŭùö- Ró-ıÑîŬcŬHÑ*ël’|ħá ÷=×V–WŝċŸ_ÚÑŞ{£hĠ%R;÷~ġĞ]A’b\_ŜtûáÁáíÛ:Üw;;Ir)/ ‘S$r„Íô” 3żŬI ‰”İuÜz÷@póŜˆüŸĉ\Ïß.tfbP%Òğ2‘ÚŽSrûV‡È›k+K+7·I÷Ċ~ġÎUpVC%cwħ™Ŝŝ×?ğ÷z6‘7L/OD$ZĜz"99ÔµI(…Ï·vhcċ.ކgÉŞ*"Ò+™‘ÜŻ~5ċ&4Š(²RŞ9p‹q›?˙ùöDŽ+ û”)‘0Qá&µ ħâÇŜyċ5×Ŭ§'yFp”2ù×%r}UˆL•Hif+H_‚ˆüӟ˙‡%’E@y´‰lğDĈzô%I?~ĉ6VĠûé9n£†v%"wc"Ù#ĊùŻŝó˙¸†àL$>OäA‡ÈéT‹>iĉH˘˘ı!òŬw`=ĝ×'òécOäó ëĝĴ_Ïùî½;˙·xŝ¸9Ĵa Dk rXˆÖ@ä_y=|êÔCïÜIç{ĝŞĉ~ wÛÏùŞçO:ġëy^Ä­ŭüŠ;|!żhg!Cĝ0ĉ‘GĴÓî]NúCNžx`Ŝ—H·ŭ|Żz˙Kï^?}jžqk?żâ_È/šïY‹èaÌŭ4"?*˙uòNzèlzâÁw˜ó%×Û~ÎWzçú/žëEԒĊݏÓjGë<ÏâŬü˜ûi D~Äzâé;é3ĥçĠoŬŸï%Òm?ïĞ~û“'ߛëEÜڏsÇ/Ô?4ϳ ?„cî§1ùQGƒïÏ÷@ŸúúŬ‰Ŭöóê”{я>="çzĝ‡èa D~‚ë—§Ŝ›óyâäɓ'N?÷ݍŬöó½ Ŝhw~Z§ö|Ï_Äc8µ?a ç Ìß½‹› uÛÏùŞ/Íŭ˘wïâf/šóYȞĝîp³ù$׉“§NŬQç{ç͘ó%Üm?çĞNŸšóEÒÚOݏò‹ĉ{ü"&rŜ§19Ĵa Dk rXˆÖ@䰆59ĴÈa k rX‘‘ˆÖ°"‡59Ĵa Dk rXˆÖ@䰆59ĴÈa k rXˆÖ@䰆59ĴÈa k rX‘Ö@ä°"‡5ĴÈa DDk rXˆÖ@䰆59ĴÈa k rX‘Ö@ä°"‡5ĴÈa ĞŸÈ˙ŝ˙ kXŸÙúï]"‡5Ĵc²"‡59Ĵa Dk rXˆÖ@䰆59ĴÈa k rX‘Ö@䰆59ĴÈa k rX‘Ö'Hä˙=Ĵ{Yá'ñ"‡Oç½Ĵż “x„‘‘‘‘ˆˆˆˆÖ@äq&ò.Sl'"‡59ùı"òÄéÒsĠÂqÂ?oŭϞ:˙úgŝxâ_ Ĉ@ä_‡HÂê„`¨ûÇàßëfìŝhŝÁ˙™ċ‘şĞ=R ô˙)„.ú'zŝÌ@ä°îH:¤-‘'ŝxwDžĝ˘Û‘M"ğık"‡›Í°>Á8Rn,ÑÉ}‡Dqä°>Ñğö‰€ÈŜğv‘]{ ò>µ‡5999ĴÈÈûÈa DDDk òÓ ò/ş—5<ÂOâ‘ׇç°ŽÍşîˆ|bx :6뉗’ïÏaXÇd½{âċ˙ŝßHëĝù v;ŭhˆ%‡u bȝxċ•WO kXÇe½ì€|ġ˙úzm!=ÌIENDB`‚gamera-3.3.3/doc/src/images/multi_display.png0000644000076500000000000001513110714675724020146 0ustar chriswheel‰PNG  IHDRb­G.)0PLTE c~¸uŒÁJħŻŝŝŝĠŜWY[ŝ0Dr‚‚ŝċċĉÁÄÉKg§•˜Ħv^ñäIDATxÚí]ˆGv€ ‡b !DŜ‚ƒÍ5Š…Pf‰†„´í> L-ƒïĠ BĴ§]>]X&ğ‰…‰0Ŝġ³!O#+6yü4Öa9ÏÜ֘#vl˜Ù1˜k;‹ˆ1)Ġ·ëçTuU˙Ŭé”znߟşŬ_ŸsêÔİÓU$Š6ßB9'ÑĈ;³rsçŝ.Ż—}à*ˆ•^¸9¸żK)ħ/9ÙĝżĴb{ƒ§o NŝOşyipBŜ\Œß-6{ƒĊ Í`°›n*•ŬYĦż{Z=pġ´òS}#~W+`€O?ĦäúÎ<+ßÙıWYԑnN.K›§½ÁíJ<6E úš•”y¤gç‘?“Oġò`ñuüô 9şóQV>Ĝı9½ġĝôòô³;ñĉq×F|î˘şÙ›ŜZœîN§ákİRßŜtjÚĊ’“É7_—aÀOż$GTb•K?“z.Wx İ>= ÇCOĉÖÄŜ׈Ŭ Ä%6lSr>›üĈtúLĵ‰Ë&ŸŜ½3ŭô\ş÷9˙AŽg“GÁÉÇ"-ÚW v1×jşñc6ŬçËÓ]Î'ééïó5ŝtĵMwĊóiŝĈd­‚°i¸Vƒ™éĄM=•=}Kü“ˆJ‚X5\ùĈ%lŠïž›~úaŽ(%öğm€ĜZ˜–Ŝ’|Ġ84_µtœJŸĤÄŜÄÉò—mV\†°ċàä²…Żí?Ï×6yĴƒûü*ŬĜÛïon'ÄÎíœĜ&rô—âċ3Ñèé™Ñ‡ò§'ñöü*ż#ˆíòÄߔĜ>˙îÖžœìŸÛßç—7?ç“+’üAzhÙxˆĜ˘N,×½ĝĠ˜PA,xóÖbUôħéŝżħĴK·âuAìsñôúŒ˜xYln­Ċ˘˜nĝġ}ŝÉtm&bÓFEìrjÇ$Á’ˆi2– ħüN+fú9ħgÎŬ܈M“Ç>"ĜÑ&O_‰ßÜÛä秞F5Ĝü;ˆİv,JځÔòµ–~F_2˙ûâÌ_p›L&ħg„LfÄâ7ׄAsşaš°9d:1{[İûüŝ›çÂü×ŭµOÏŻÁħZùé XĵɵòÓûżŠßóġÊBñ ŝ˜èdx9Çz?Ä×ß_›:Ċ/ò§?H,˙?)ˆíñ;Ç);ÎW7—c£çğñĉĝ/÷?>>ZóĝĦ‹ÀA–Ö´ŠÏż˜uĊ_šġÂ/‚=ÚÒȅ×ĵíNmò·Ŭ|âɓ£›bËÏo%(ŽßmŻ U>˙nüòHlbÇbġ ŜÄoŝYÄo…ôÇ­òĵgžiâÏU –ü‚ù"8¸˘m ²Íàädu0ĉhÙä³ÉêÉÉäÄdMlùÓ/LvĊëĞ‹“IÄ/ĊoŠÇd²8ym²zbr…‹MòĦÉŜĴ:Gġ…÷Y<íGl!úÏ96cdŬ;hU̔•ŝ“ìĜ+ÑŻŽ²’û#ñÒSċŒĴ{11ŜZù:ûğ2–ż6ob9ħëOŝŻhk%#ĥ)¨\¸–3²îuNl4obÛ9ħß,y=#ö° ráÂöC)#û^‡Ä~ž*èܵò 'ööc²wñ'â g”1²ïÄ(´’çŒÖ"v´2–Ùħ­É+o?6^Qˆ½sáì F–=71ġ Êê;wwsı/Ä>Îŝé[+Ñ·fÄ”(¤Êş—£ħ1J9ĦŒ$tb8$f”ÊKŜ­Dl%69ħo.-Œúbùzö‰'ŝ%Úĝ&÷.~ç…³gg–Ëş—cħdQ&ˆ°TĈ£éK)ċÏh01Ñx‹GĦ•/-÷Ċòoí~ïÄJtäÑWsïBX޳ߛµŽÖ½T+Iu1šüeé+)1^X4 ;ég£ŜXŝŸ„ˆŭ×äëÜğ8#¨<óĠ̳íİÄ‘ˆĊ;ġ‰mÇ…{­26ó`·n ;9~éĠÜ窷ŭs/ßĥ'iej§fÄX32ĊíQNìèèQ|~a0îLĈ?yìĦĴ_ù³ß~rì•Żòž¤mݰü²ˆħŞÄĥòĥ’£_>ĝżġĈçOÙŻ=K²ĜĊÖħcÑß~ûĦ,ZaÛˉħĴ­ä¤JJ bISP‰Xo}ŝ¤üÁk+J|ìÚêWRD ړŭħ25ŭħžô+sËż‘ĵxT#ŭq,H‚ц²'½W£ħôž˘ˆĉ€4HĴ7vl#'Ùĝx²[(I0"ʞ$d1FÊÎż^/)ÚLKo,żĜŬ8òׯF*ħDf2–ïIBÖYOĵ7Që™ċżögĝàÒ³91Br!“‰{ò{-;—&=ô‰Xaùżµö7/üó‚.cÑ1Ɏċ{Qħ×2ħ"jŬb3Ÿ_œ˙xĵÄÒÖQ6Ĉ’şé1}Cb­ËE_ĠqLázÓnÑpnÄĉ—:1DŠÍzù#ŠVvŻXóP³ÍzÖEÉğ@bŝÄÒĵ‹îĜv‹‡P˓çN%Ää=obYŜE7İNbíÁv~ÏGDžĊŠ˙§Ä!„Ä˙ƒˆh-NÄż‡Ô62b/‹’í‰ÇfkGpŝùìÉa!ĤtĤeb˙š<ş –Á{Í;è”Ĝµkħ(úÍa$ĥŬ)ħ‡b!+ˆ½BbiO|>Äb;„Ä:•ħcÇdb/GH̝:]K91!bżéˆĜV<ˆ'ˆ5àuaùgİħîĵ‹x”xĵ’ÉX.U}ĥüyêD$tR<6ĥ‡5DĴ ˟§NȌTïĴu;_³œĜÑšÄş°üYê„Ĵ‡‹3˘sbGŝğ˙Ä²Ô ÙËWŭÙöÛʉĜıgÏ_xùŞwÖwñÈŝŝáñùc,—ÄÒ½Ž‰ğzh|ŝXÄ~M̈Ċŝlş×ħtZNŝԋ5üħn}ŝÄˏx{ĉ‘…‰%ċùèjl§ÄR/˙Ÿ^”‰%{;úÀ{ 5ˆµoùÔ Ġğüٖ‰eSVdÄ66~ûb bÛsJ0˘Ö-+˘ÖYırĤŽVÜO##Y9rŞĥÑ7$ÖħùNÌ#‘bğ^ŝH‘wQ&L2kÁÌ7^çrÖlÈZ™”…°ËEI–µ€ÓtżÎÀ!1obi…!1$†ÄúDl‰…‹CŜH,„X2†Äü‰%CwH,DĈV"”1l+‘;ÌÄÒ¨;ó'†ħ $Ö61Œö ċï–Ğş*m#+ĝ.´°\nu>¨+ÂÙĝfPYo"„>l!ÎßxË6­ ê"1$†ÄCbH ‰!1$†ÄCbÄh-b´Á³c-óœe µ‰!1$†ÄCbH ‰!1$ĉE Gxŭˆƒċï‰,˙nË"ĵŭµ2BbH ‰!1$†ÄCbH ‰!1$†Ä˜ŒP$H잖1o˜31WòK91R~–ÄHWĦbµdŒ4™ Ġ1Ú;­¤ žżfbÍZŝĉ‰1âgħ­”ˆyé:+ÔÒOȐúüH ‰!1$†ÄCbH ‰!1$Ö 1ÌêÄĴNÔJ$†ÄCbH ‰!1$†ÄCbH ‰!1$†ÄCb‡’Cbu$V'Abu2$†2Ön ‰ĦŒĦCb‡žúüó'Ĉîmb¤b¤1Ò$1ÚħĉççwŬVNŒ4IŒŬÄX³w=·aÇhż´²abmÈı§‰ŽğžëÍŜ@I÷gxHżˆ5iùI+vĴb¤ħgĦ­k\+IoˆñVˆġĴ­lÖkGĈxÏìċ÷ŒŬ=q‚Đë1†ÄXËu’"ŠH ‰UèV"1l+kԉÄPĈZGx[މ!1$†ÄCbH ‰!1$†ÄĞM쉅Û!ħ0b·Q+ˆ CbAÄn£ċ#&Dìg ›AW²üJ”1´ühùÑòNˏÄçGˏ–-˙ŭaù‘Xh| ‰!1$†ÄX91Ú;bŝwNυ˜×áuJŒi÷…÷lö8FI{EŒi‡Äڐħêw¤&‡Gš&FëK#ÍT:Â^#M£Ež·^ á+ȈzL =ÚħŞ÷‰3í‚V&6;Y3_ íWP:&Ĥʝ3ħüz’şÄ cMä\§ùe]Ŝ VZɈ'²a݈eU0… Ĵ“_V”@8ĉ0Ğ67”ßİ•+ÚBĵ…ĴŒ˜\Ġ[)t1R…˜Ż4ĝcġˆ_f&=@Y+#•ˆ1o*#6Ğ‚Ô"ĈìÄèìıŬ)j_ĈÄq4Clv†Ĵħì@$ıbòáÊZ™Ğ4o“.\•vÍ jˆ˜ó: -ÎDLˆ˘WG++Ó ­JĴÖ1ÙvIġQċÒÂĠ·>" h.½ˆ™JYA+-ġ)ÊÀjФ•Ls hm­ĴiÇ Eü-è‘f‰Uñù3Ż·bMPg³èÈ­ĞÒĠìĤ cbaí/Ó}ÉdÉ&²!;F*cµÛJ%@#7sU‰Éž~î…èÜ,ż&d5dLv.e3Ç+Ž‚—@qÂĉKŒĠ'ĈµÔZ^uj½FUCá§uˆUóAϳtż%ó1O;Ö1ĤšZvLµˆQ[ì¸;bĴĥċ‡ˆħ˜›Ŝϖ‰éħ26OïÂ:İ •ŭJĨ~L—+Ŭ¤UġùkË­/cžòjİĥö·Ú,Ğ%cġ‰A–ż1nHŽ‰6!c5ge i%m@Ĉ¸C+ ï‚ΗiΎњZÉ]–Ÿö‡˜ëD; FJ‰‘ɘëL}ˆQ­Ák’‰ĠŠó×÷ùjé3ÂێŒIÚ ħ:2Ĉ ÖĥVöŠ˜×Ĝˆ?F›&F@;fïĜċUöÇXĊQ wÀıB6sÉ…;âó°cŒ40ú&ŸĦ4Kë#vLµ‰ÚbÚ­• ñbp#mì˜71ïT(1­ÑV3Ħ Vż²ħfó.´AñJ>żQVës²u/`óy³ËċŽÑ<}´·1~ÏÓk B;'ĉŞN,8U šWĠÊêñ1 ĞçgàiĊ‰ŸP¨Ö³yzVB™·ˆ•#Z˜ L3ğ"Ĉ|ùóa÷%FĠ^o“2Ĉ"VWĈhHĜzȃLż…Xeĥ.ħÀ³ƒ+™uqh bŒ@Yzv`]bġFF4!İB,$’XBŒÛ;ÄÌ÷¤óˆ(úĝCäĦ÷DzŽîĤޝŬ‘ʰüe—ͧN É£ħékÔÒŸ1Z‡Ż)c~…ÉĝĉDÌ'Kħ7Ĥ{âŒ÷şĵ³öow2VÛ\‰µ}vŬԉĐCbH ‰!1$†ÄCbH ‰!ħ95 ĵրˆ(QĈP+‘CbH ‰!1$†ÄCbH ‰!ħšu&İ:äPcUò˘›'–ŜĞu(ˆ‘~ĴÁ’›'Z'ĉ•zş^&bîïh…X]`ċƟxxkjĠ V“m™˜ç­ëeJÙÜŞaR2ԁµ.cž)ôëeVXà}ħ}Jߓu#Ĵ⽐p*:İAĴ,#ĉ}z™JVZÑĝ ğˆyßXïEŒšvĴ]bŝ7°ŻÛ­sĠ5 Àfuˆ‘Ö‰Òa_ök]?/ ˆXĜ}âà7´uĦ‚ˆħö‰é·)?§^êuĞꐊÄÀohÓúx­“î4¤şäèüşMu˜˙ĀïTÜg5Ŭ,Œ˜<m›˜a7ġÀş! 0&†tĞ‚'ħÔҔ!ĥNçҟĠWŭR~ĠF,ŭR81fÜĈ žıJÑ2@ÄXċto>§ĉ‘ëÄÌù ×!ĈLù GĠZ2Ç$kCÀŒİšM‚TvbLşñŸrh6{ 1f|áÚt¸†GÔyżµ´^5ÚĦéŽé7:=É*ĸ2íêu@Ĉ17Ž$cÌuHCHÄrŜ†™0ĉ šž1< ċ`ğ\JŒf <#5‰1sġ!J€ùP€^ LŒ@kqkšAKĉ˜Z ,‰ôcQċ•…şXysÍDM£$ÏË&@2‰A׀FBkĴ ÏÊNÌhÈe³Buµœ£&ĈĴĞĊgÇàé†ÜKÎT Ĉ ,€IĠ°ğ•!ÀzÀâU:1ÛñS q371›mžkkbù‚Ú`€6#ŜĘ?1C *³}–ÚdÌ!”6Ǜ*Q?cÄzi}dÌ ÁJ œcêukÂQ‡?f9f;_޴ĸĊl³ĉˆ˜uĜ>Â!£AİbÌÙ'Á‚ˆIËzX/I5;V…-Œı îh[´Òâğ0÷´ŠċĨIŒ9\ƒRb¤1}’Ù‰A8ˆ3%K%Ĉ*c1NÁóÔJhĤ´rbêdAËĤ˜S;QK[İ$WW&/ğĵÄŒĠöĜŻôWJjŒ" ͓ĴiX‰ ƒW&féĥÉîz1gğç Ĉ{Î8LŒB££.bj´ È‚ˆqûeÈŠZ‰QË"çTÎĜ´Rùš%„m“1îA̜tžƒÓ\3UÊâcĴ:1 Ì7cj@ Ĉ­Ğ.ÛdĴ1 ÓùÓÏ0×3ħä™1‹4Û3ÏNfa[ıÈJŒyӗ´Ñ\ӅŞKŒƒ ëĉÉʑ-3é"ĈlxÜZ ²…£€{§t9´R!Ž*–Ò· &FŬÉ.%2F-$;1cµ‰Ù‚–1ÀĵèÄ,g,c¤:1fĠJóQİàԖ ĥŭ3—V’bÔMŒwFŒúĊǨ\¤ıpIbT;A1R2@n#Ĉ]>žIL÷ÒĴĸ1Ş[KòÂ:h‚œÄìòÀ|ˆ1Ĝ‰İ—A%ĤC•#Ĥ{8$„·ĴĦfY.Ĥ”˜Íğ`ġˆQĥ•rW°¨0Ìç/×Jˆµ‹,cÄ_ĈàŽ”Ĉ.ôĊCı“˜Ö‡ö²cíÉó“1hhÇ>´ƒ˜Ùaišñ!Ĉü´’ú£ŜmILUJ˜ÓĞT+ġ¸f1ĉ’13ObŒŞçŬfQTSı™%jÍ 9ÔĈ@bĵ1f#fĈ`™1[uC‹H1˘ésëúş˙;„óíä^ŒÍèê½Úô“Ëçvââĥü@\Ïx[‡ʌJrn[-Ҕħ4ù$mÚ Ż†YBˆ;1:ë<+?°|)-=qCŜ”İ\n#ay#I*DoĦœ— Zı}~]s‰[Ĉˆ‘AÁÏ'"ĥ󉗌i+Yı£ÖI/ìŬš cQç—ò-ä+e&6@Äxı?Ĥ5•Ö%‹Ġ(%Ĥô˜s.‰ó›=-}iK,‹éC”Pz qÈ}zI1SL™71V:ÖHmŝ1c— JjâÎ8ż’żĉGÌ£NEíÀXşk'F*unŻ"F óK¸“˜sDOo‡,~“m4ŸûÓOÑ’Óş'°râJv°ĝĞrJA/Ö ŒÂ£-J”‰‚Yq1­ÖR;Ĥ …cĉ·ĵ2—Ô…7ı•u´Ż £ŽQ y£³°E 1­„²€×íiċiˆ™ĤĈ•§ĴZÊÁünâuŸĊÖü:rVôT*7'bܒŭ&šŻÙ €sŜ3"%§êŭsġ%›r—/â—=޸“>Ä4ßĵ%×Ì꤆¨ÀI`ÔAŒr;1fòƒ.u'i i1êŠĤÚ³ÓíÄĴçß'5ŽbÌrĊÚİŠ{^ÀÔt1ۈ s\Eçùû“Ì` vZ‰ÑĥˆQËĦۉİ÷ÚL9è]y@”QŝY÷;ZmY ˘”\j\ÄBÖ[wŬİbyàEè:˜…FïO10)™ê"F )q ˜MLŜöÈ9Í ċJmËvhĴ-!Ĉkĥ ŸYOˆċ÷İ–‚İ~¸IsÄǚ"Fš”‡6dŒ]nÀëœk—³!%œħM7ĥ‚s܅$†Ä: ĥ"ŝ!ħb[ñ‰ÉĜxŒ2FlkŒv,òŻ 1l+‘;ÌÄìı=H &ĤĈ.²½—îŜŭúÒ<ÊŬ—ì_œ UBìù”Ï…Ôñ9”ċ—ŒN,yú^LĴPîÊG½&–²Ab [İGl;ŠâͽHl$&:MµˆŬŽqŬ'‰ĊŭI€Ĝ¸žŒm˘ƒÑöèŜ”ħ˜AlĞ&1!b›UEĴ˙ÄĈ͢Û•EìpÊXM;v;avĥ•;V·­ĵ—½‹ôǃħô͘Ĝı9Tż‰4bğŠ]‰°„”÷Éu„T¤âĴSBŽ"†€ò%'ÑĈëÈÁğܤ1ħ ‚Ċ·PÎ˙e€!ŝ_Ċ„ñIENDB`‚gamera-3.3.3/doc/src/images/pixel_access_runtimes.png0000644000076500000000000001166710714675724021671 0ustar chriswheel‰PNG  IHDRúŻĜšl?0PLTEBBBššüĤĤĤffWWWhhhŝŝÎŝŝŝttt—2dÍĝĝü‚‚ç‡:6BIDATxíŬÑoĊpRHı4ÑTĦ$D5ĠEôÁ1Q’êPԗĵ%­\U!B$ÈUİU‚ŒPÊ ógžœcu1k"DSĦŝHwŞ“,ŝ:3ğ³7·÷ÛŬ9gç7ħŭ]!vwfv~öçĉf×ûğÛL ,áĤ…Fdŭƒú)26Ĉ>ôC „Œħ\?>ôvȟaçĈÖcċÈġµK7×úwĊ'Oüvnh­˙O?¸s ŝĉZ˙—B<gĜıĦµŝB<°s ŝĉZ˙iA?ċ ġoyZêOa˙zhŭîԂž÷—ŭÇC[@닍x*„M°è‹hô´ó!RŭN úy†}­ß9q¨ }í|­ß}ùˆ.ÇĵŸçñĵŸÎô9µóħ Ÿá܇>§v>ÖÖ_½+S´×È˙Ê÷ÑŝVÖ?ë´@ßËp[vÂ? }èÓ˜yhžRèó8ÓQ Oğ”BŸÇ™Ž}څ§ú<ÎtèÓ.<çqĤ£@Ÿvá)…>3ú´ O)ôyœé(§]xJĦÏLG>íÂS }g: ôižRèó8ÓQ Oğ”BŸÇ™Ž}څ§ú<Ît”D˙îŝ%U½µ>A]>ÏÓyû…}W̋û½ĥ¸=1öCèÏ´ĊŒŠ ŭú½–ĝ5ô™ċU8=óĴîžmA?”8ĝ#5ícĉá~ôĜï,|g >%íäEߪ¨.÷˙ZhŭOĞ[)Ûċz˙Şïaĉñ?ÔÇ"èħ/ŸMuúc6ŝ ´ŝô@ĵ}˙Ĝc´ŝÌ?NnÁçól—y?šŜż†ħ?62ŭèħoÂàNƒ‘`ZCŸ š }’…İúLdè“,L…g‚&@Ÿda*„>4ú$ S!ô™ É0'Y˜ ĦÏM†>ÉÂT}&h2 ôIĤBè3A“a O²0BŸ š }’…İúLdè“,L…g‚&@Ÿda*„>4ú$ S!ô™ É0'Y˜ ĦÏM†>ÉÂT}&h2 ôIĤB­/ż·[Ċ'șÔM­ŝüùk7$Œëtĉ‰‡>£ş •êwñ¤#ÂıNġċSJä‚yŸ“^ĈJġë°˘í‚>3ĵ—ŒŭŽžö1ópż‰žöĞÚqŸµĜ&Ï(újg]îĦŸœu#ŭœè‡ÑïìMâ⚇Ù_Ïû7ĦÏ임Óú½9è‡Ó7‘1ó ĤurĊ™ƒ>“ş }#b ŭê&&ôDˆ5ôC¨›˜7!ÖĦnbBßH„XC?„ş‰ }#b ŭê&&ôDˆ5ôC¨›˜7!ÖĦnbBßH„XC?„ş‰ }#b ŭê&&ôDˆ5ôC¨›˜7!ÖĦnbBßH„XC?„ş‰ }#b ŭê&&ôDˆ5ôC¨›˜7•ëşżµ&&ú³ûġ'ĝñĉ²— QV9yÂÖúÑÏ·Ôá/CôK|è—Ù áK˙™AcżÌߗŝtú!ôŻÎî^SqĦ_Ÿ^ġ”5rŻSĜúĴğaV?&úex ñà³jyĈjôħµVûfĤ?5—Ôa/×o‹nzĈŒÊ¤ë2ŭ+B\oƒ­ĥ0?%cL?nŠ•TĥO —•fúW…ĝ—jˆħ_ĈeéŻ_lFÓÇn=,Nْ[ââ|ّd]Ĥ˙žR- O:…–ŝѸıÒŝOÜŸġı%îeìËÇóĵB@?…&WCŭxoÜ<%‹›âĜÍ5!·îIż{`öï* ôIö´ÒoÄ͙k×âf܊ŜlË­{ÒïïÓçnè;êïäĜq3Z/Ê­{ÓOƒBßM_ĵ½ŜìĴĊq£Ûŝ:Z”[˘Wv ]§°“;Ìi=ôi¨¤t8óˆÓ óñôUqaEĴ_iĞ­î|ّdôI–˘BKIK·:YÔÖĦúH&CŭxúRú7î°vâ-èODÖ0w&:ް1ô i¨ŠU¸ù2èOd}›kÙí.[mhµu”üûö‹Yı }›cßÖàŜ†>·¸_ßO^×üNêD°u~ŭŸ~–˙ Mï_Bmâ&<gŬĦ VCdúÇÛQ[Ħóı/úĴíRĊÒ?j^,Ó‚>Ğ~œü352§{ñR;šë‰ÙMÜ÷ÁÌc†°Óz8ö£äŭ$sşŭ¨Ġi÷ÄÂê’Sv#èÛ•Ûcú2§ÛO~'zÑ|ĵXyxôó"ûC}=ó\^”9Ŭxê İżûôéıßÇYWDȜn_Ì£Ĉ~éËFWbìÓ.ħ/f”ùt!sş=q³%“şGĊ à âbèÛ5–~th_[¨œnwóœÔ_żÒ"(/‚~ıOÖÒ·j|Ô'GCßRĴŜ¤ġ?Ż>n}Ú y]†˙.›ŭž·1ö'"lLÔş²1ô+‰ì·50óĜÜÛç·AßÖàŜĉ×÷“ו½ĥ•: o…_˙‘Ôr#G´ıÔÖ0Żğû‹/ Ÿ3ßmZ?/9ÀÚïa¤$ğâ|(-ĈĜñÉí鋸™µ´6³²‚ èÀĊCŭŽLĉŞTî7—çdÓŜ­‡ĠWvûwâéWn=OÏĊZt#á¨ÚêG­n[roë÷ô—wEo-œŽċ÷ıŝïİêJĠgúSÉ#JpÖ-UêKn•ʍ÷êöRß|e·7{ê%(í'­ÌôOÌ&3ż*Ĝ:KÀkž#'U*×|´AyW&ĜwI}17]3}!ËsġV{HĈÇ͗nŝ×ÊÇĝüœJċÚc_}e÷V[ŭSq3w$ıké÷–T Œ}Ò)-´ôû‹:•{x .0{qC}e·/zƒµy>nĤG”,ŭe}–†~™—ż²¤SıßübIÔWvûbġêlKn‹›²´rħô{sŞ5ôËÌ,ŭĴ٭˗˙–íLĥaéßVo!è—úQú”WfúOŭîŬcż ÌW^÷Pú]è—ë—ĠN\—}s$ôµnP…›/ƒŝDv·ıĝ˙Öµ£ßó6ĈŝD„û6Ĉ­Á½ÍŻï'ŻkÜpÍc$¨uCìŬPK>›ß×Çŝ6é!VӕŝßX˜÷ÇHÊ ŠôÉĵî_“žĝĥġ˜ĉlúeĜcuEú"nfm³ÍĊ¤(öŭĴĵ—.7NëĦLÜż*˘f·-”y]ġ…Ŭ4Ż+dM˙N4_xUx“™çâĵÌüŞ£.·/ʧêÌ/ôÔM#K8Ú]ú°û¸~ıÌ,Ş/ìĤy]UÓ[[mwĉb•âMôûB=ĥyĜˆä÷ìÒÌ/ô ĴÓÚÒoĈ{£Ċٕ×ĠR_eyĠ”Ò—–5RxÈlËéL?yl³ˆ›* £3żWxÎˈ~#j|wò¤²Qú2˛ĉucYÓëbF]dKvËŭĜfñżJ?ÉüBßY^5ÑßÍß<÷í9UÇ~–וc/^#\ŝw*Ó׏mŻ$c_g~Ħݜ[_Îîs'Wšê`™×UYŜ4ŻĞjúâœè‹TŠ7û=9ÙÇzVj¨Mù…³ĵj8˘ż~i°ş˜<XĉuU–7Íë YÓ‹"~ñ5•âMôğêħÍqSÜ=rXmêÌ/ô7İ?<Ĵ ŻÍeM._ĵ–íĜ·5*·‡cż²İKèğ(em|ċuMġrl…˙g­6ûqŞh ô'„ͅ™ÇÖàŜ†>·¸úĥ÷6ż>òş×˜_˙Çú›ż7?‚3{ö:ÍêĤEş]­·qÍ3FRV”~YV×ô†ĵ‘ĜüšÖq3ë2Û\̊’,™ĞnD§ Ĉ‘pZ[úò‹ş2}›ÌóĜKgžŜô™ċU¸TyIí`ì+Ĉ%ĠŸÁ̈ž…Jôż~M`ìg.<Zyj ú<Ŝ£Q´~ô•*ĈĜĊñ—Îû½9<£d,÷íß\ótĉU(Œ}˙à#ÒħßiŞRèĜĝßIġû-èûÇ‹ ġ?|ŝ \ïÑ0hŭ;¸ËĈ@M„Hgž¤ó>!ä³ú>uĞú†~•ÏzèûÔ­êúUB>ëĦïS·ŞoèW ùĴ‡OŬŞĦ_%ä³ú>uĞú†~•ÏzèûÔ­êúUB>ëĦïS·ŞoèW ùĴ‡OŬŞĦ_%ä³ú>uĞú†~•ÏzèûÔ­êúUB>ëĦïS·ŞoèW ùĴ‡OŬŞĦ_%ä³ú>uĞú†~•ÏzèûÔ­êúUB>ëĦïS·ŞoèW ùĴ×úßĵħ càä>݉µŝKŸÄwWïEZ ná{[Ŝ݉éĵï,6ŝ‹Rŭ•y ó‘İú:ôGd8vRŭçàÎĊHô£]ş3ONÇ÷n˘ü9gì)÷{ÁY§eóż…oûôÉ`ñ$Ĉ‘zìŻèĞ}œuGd8v´ŝív cŸƒÜŠĦġûàƒ%U}K†cSëËSúÜıZߔaì Ĥ5ô™ É0'Y˜ ĦÏM†>ÉÂT}&h2 ôIĤBè3A“a O²0BŸ š }’…İúLdè“,L…g‚&@Ÿda*„>4ú$ S!ô™ É0'Y˜ ĦÏM†İIÙíc:wOŝ›(Ü.˙ÂĞùĠ7ŸU_ŝÊi Ħï6.FFĦñ‰ş-ġŭÁeùŜğ4€WżÖqè8ó@ßLK|ä²Ü †Éxô‰ĵ}–ĴygèCŸ: .Ĉ>Ĉ>Ĉ~ÙµyFß!•{¸ĉİ$˘$×<њ£ŝÖuüÉ\їŻ1ïZżûXr†ÒY—ċ™ruS }Jú£,L{ÉÌӅ>“÷hè'ן!˙ÚÂĜ‡ùàĈèÛ³hoÛÜÔcŸĥ qÍC˙$cNÉ8ëxĴ÷İdR.zík)ÇĵyßÌ9ÉzGÎ<ôsB̝S½AżS÷N´ŝÌÚê.èğ£ĠÖRë_Ä{ _›İ{GZ˙i!Bß­ĥ–Z˙’òÀĵ_›ŞkGZŸ‡ ïJVc;èżŜ—“œy¨mìè²yAW•gŬ‚P\‡€Öż]rĊYGôQ  ġ{%m‡â:´~÷Ào ï4Ô}h}Qr—­à8×!è×Ñú˜\ú“›ĠwÄ˙ô‚R{àûIENDB`‚gamera-3.3.3/doc/src/images/progress_bar.png0000644000076500000000000000333610714675724017763 0ustar chriswheel‰PNG  IHDR.Ÿµ)0PLTE'4Z8M}Qf–Ji°^j…OlĞeştŽÄ¤Ĥ§—ŻàĊÌà×ÚÖċçäçëĝúîċLÄğ& pHYsœÄuö„tIMEĠ3.F$%hAIDATxÚíœKhG€çÒC(ƒQ˸†'›@éĦ‰RÈJM ”BIARWôJ]UëSĦ쒆âCpBJS§…’Ş7W˜žz+dšKc—ħR“ƒ‚s*)²:ŻŬíC+[^kMç·ùg˙Î|úçm˙+hl€¸É@Ğ#5KŞ?ôSFmŽŻ(×ĦšeöSÚB l\]BıÒF~Ŝ²v–rYı–Bo5Ožzğ(FˆTûĉ?L:Œ_|–ê ~C}… ëġ¤Îo½÷äâáĉMʕ|íÂw7.Ĵ?sÇğÂÎġĴÏxÜ½›Kż”IQŬsċ2Îo7·?9ûëƒÖ`=9{kû³G͟Ÿmŭ514“H¤ĈÇğ.rUH—şÎ1ğ#K›ĉĵ9k+)³ż|ı6,ĠğŬfŞĴs—³.äKĉ‹LuÁVĥݽ|7ˆÇ*MYşıèMfC=<ŬÎġTΑ×ûşÛRH^ÄQ°ĉÒ\šKsi.Íı4—ĉÒ\† Ż ÇmI°ÀŬsaŸ§CËÛ.~H/@ ˆM!Ĉ`Ċ=z‰Kn€Ù1ĉ™YÏqi*fÙ ͒fe J܃â\šÂ/q@é‡À6µĵ—ı¸€SšÈFdÈ/‰ş‚ÄebbĦc— ”W{ġ·pO0èÄĊM˜@G.`}X—U6O:û‹Xŝ"ŭ%Àë‘> µ}ıwû²Û¤ğáÇ/y‡"2ÁcŜğÚû£d–gŜŝÈ °m*“ú^Ž?û4Á˜ra@bÉךKsi.Íı4—ĉÒ\˙ĠKŭ–E..Żüp½ËÙPweúe„I^sPáÍu¸BCh>Ġ\š+ÂùñÍu¸Ž†J_¸âş.Œé:Zï‡4—ĉÒ\šKsh. "ÚúÄĝ˙²Ê˙† …£ä‚„pyA;z@Ä8€èıĴ>ÀâxŒ/âÂÑûËQ.hÜÁ!N\EÔ\ÀŠŒÑ(JœŠ7ü÷Ħ}‰ê3êpÀ…ÉŝÔ#TC}T´/ ìSûê\dÚí}ŝÈc| ––ş°ÍŭĝĠĉ¸8ÎCšKŻ'4—ĉÒ\šKsiçĵóĥ“qÈŝûÌô{ÄĠy ²´ĝ"â’ovˆˆr,UûLjŭeżÙAœWBşÚ?FÉqb˙ħ²aíb˙İż°Ĝ-bıôçòß?F^ÊÛ3AŝêSûòáÂŭ­GÙħÜ?:éb˙×Ŝï˘ĉ‚1ċÚé{!z=Ħı4—ĉÒ\šKsi.ÍĠ/CħäZ›ħäzl,Ĉku4âX‘ ìûÉߎÖoìûÉù}î˙“@Žú>ÀħIENDB`‚gamera-3.3.3/doc/src/images/projections.png0000644000076500000000000001211610714675724017626 0ustar chriswheel‰PNG  IHDRÙ}2á÷PLTE W†Ñb–ŜvÊò&<…ĤêúJjĥJn"2VjžĉAZŽöîvrš–žJrʂVnÒÊÈ>j°ĤĤĤîòúnB^†ŽĤŞşŜfr’ÚŞ’4JyúòÎâœM;Z:Z˜NvÒBBB[mšžĉú^zĥŞîúΖ‚r†½V|ĈîŬ¨Rr²²îú‚‚*I‘ĤÖö6:>ĉÚâ²Ĥš†…é5[îŝŝ°ÌèVj’bzşĤ’~ĥêúÖÎÊş²Ĉòŝŝ–İÏ=RöêÂC`ž‚‚ŝFFFÂÊŜĜŬâh²âêööîĈvŽÂ^ŠĈÚFnħÀĥ¸²ŽĤVj–‚–ĈÒöŝ†šÈ::BSfB<\Daêêêĉö0U£ÂÂÂznn6BbŽÂêPf˜ĝôà˘bf]sĦĤ şÒŜîVj›ÊÒâdˆ²h}†vRrKf˘&6uj‚ıĉîú(:bRZzöŝŝ1N›Nj˘Tl˘Nf†òóöÖÖĉz²âNb;V•ĤŽr–şÀʋŸÊ2K€f~şRtĥáċòFf˘šĉúž–GZ‰–ĥŜzŠĈg{Ş8>fŭúòvŠÂTlĤF^—îúŝ"6g>Pxj‚BUƒĉêúbz­*6Xf‚şn†ĥvngUb^?Zr‚Ĥ/Bf;cĴÎĉú6JŭùöŜäîĤĵVrħVrĥIb‘ĈÚZrĴòĉÒ&:x.DtNfžJjž˘ş=V‰Jj²$6\n‹½zŽÂz’ÚŜĉKfĤ*>fSnŞŝŝŝZvĥş–Ş:Lw~–Ĉ pnvRbfŽÒĥŜĈÚîêî2FvoŜŜĥ–˘ĉúÒÒâĤÖb~şJ^†ÂÒèNjĤĉâë֞†Î²Ş:RˆNn²âòú6N‚Ž‚²FfĤ.J~’Ċ^Žĉòúŝ.>fÎÒŜbu£êîúëöüB^™RÍÖîfzĤ~~²Úâö^zş:N€VvĥNjŞJf"2^úúŝ<[ ÎÖêJbžrŞÛrŠÂj†BbrŠĉĉĉ6Nz@Z˜Ib™Rn²H^FzÊ]v­âúŝFfNjħ&:Ô·Ù+ IDATxí[ xUŽ(â_<Ĵ%RWÁ(˘BŠPċixH-%TäĦÄÂ'Ú*%˘Vù ¤YÖĦV`MÒ–Y)j Š+ ‰ħD miŠ”„…v+ìâÎLvgvgîÜٙŬn½_óçÌ=çž{ŝsν;IÛŞ™4ŞĤÖ9ŻCoŬ`7bż7Ĉ{*nĊìÂŜpëĦUÄ ŜaĞß°!ĤħuV£ı‚Ċ3k+ĊfÏl†w-Ĝ´ĵÁ\c˒ñx|Éz°›=wëV–ρ´d°³°ĤpöApYpÏ8A+`m ž„gx„é1Ŝ `mÙŬCËx­îŠœéKÖCâ}'‡—÷"´e:³ĵĜ§!xPĞšy:„iÏċ Ònˆ%·mÛV]×ÍÌf‚´ĵÀŠÄ}G„`pg+Aàáà‚Ž0ôÁÏħ–á2ZÁkÙ ûÓ³J›ón´/G0Âaô"´Iffüé¸;pĈĤ=7ŝüiĴ ÑĜĜĝ8Q‹uttT'#Cµµµ÷Œôf×:“€êA+`Y`G3àż ÀĊ[żĝwş_†DsĴ¸3 éâY^ĥ£ Ò2òǞ—ӝ-€Ù´ŻĈz’z)´H1³ŝV܉†ÒBl³ÎŒ6HFzjzíu€‘$ ?è'hT'³Ë€qÀ·îîDS€ tˆÖBb›°ñZ6L^Ş› È)ğçx˗is£:#İÚ f6Ág™Yu³ˆI]&ÓĠ×ÓĠĠĠ^LF"€ŝV@gó|MÓVlıù‘oĊp˜ ¨ż °ħĥëĞÏ]‘‚Íş˘€ÑÚ£>šL[p…ħb˜lO5:É}?mÄ[òĉ5F_²4{]*•2˜Ù?Á,Og0ĞĤšô'ğ˘Ñşh4ZCž Fŭ €ÎĥhÌBħ4í7Ñèö8ĉ† ê;RÑèQÚÒG£ÑQ8ÑÇèo„Ëúaŭ!ĵb{Ší[‹òínĵ/G@ħtqĞufüt£é8G›7ëÁ›™‘nEtÒ̸وI_Ŭèèh_  & Œ4ú›ÄlôEM{ï™ÛxÜ 0ܨO^8ŝSώnŒBâÁRŭd^6ÜAzZĦŻ CZ4 ÀžûiŜ­öċ8ÉíI”­z<Çlúôé+• ŜČt 6}zŽġ:ޏétş/I\I0Ĝ@ è§m^{"à…[ĥhéçOúä>ó/_éôU˜ş´>zÒɗoyäĵtzèn˙ܲù–ïüšw]•šŭ˘túI²üíñtš&ĝĊ‚û˙žNïuò–›ŸëÁ‰-ġêĜ׍f:²ÌP/L,żfĴ› fÔ ii@Ċj˜SŽĜ8mĠLú%§Ĥ}>”†ĝ‡ëĠBğ}¤ûÚÒo gH;şÛí]—jÚ^L?ı@Û·ğé°ŭ.eEĴ‰–„ÒONĜ§Ó‹0ñ5d볇~QÓÎè>@ëÓsÉÄî0’L‡!“eFŬ–%feF*6Ul˘A,“‰&G‘%Nħеç*6‹cÛ£švß%$ûtuèŭšĥ˙áoÑ´­Ö#˙€Ĥ­\­io;3ŭfMğñôûö{MW¤ġo?‚ŭ™Ÿƒŭá‹(Qgì¸ĥùMûëâ̲P;5‰^1&†³폠ġšÙ?э¤lÌVló>ú­_ŬÀ7Hö QŻ×‡4Ò €(ŽoÜĵç—Cg’¸rġm£ˆ)”îÒ´·ëÇiLnÙgó—.=Š,FëżŭšĈ’0fCÄÉ>ÌóÌwôżAıô|ĝ€ëç.2ó BÁ£b›é CŜČîÖ@g0ǝߙÌté·˘qtáVż[!ġÓFħĊş›îx>şÄĠHÌ˘ÄìYÖFÁle,ÖŬŬ„ĞR[ŬH÷#ÙFëo£oq²“}·1ÏÊhßĵŸhÚ9/Җt‘éWc¤öä|âÑĞN:ħ|fú…IœAÌ`†WŝD{ı'“É´c-38I bÓٞ€4L×H( ‰şħktW÷Ŭ‡ÑƒÑ̛~•‰˘/oܘúÇ9VÔo–ù#Ù“ì3ú­ÊhßËÔC¸ÖĜr"¨A,ĝN!4“šßš8rSٚY‰Ì::vDŻ6½µİÔH/>g÷´:“zCIU7Pmv$R$Bşĝwi?ßĝ€ĥô··o£İŽ7jÚO9ĝĠûvŻ=iö—Sj?ŭ‰KâŻjÚĠKSú’Ŭ`Ê[aż{j-`¨ÖöŬë`° :iË~ڜéETKŜgœ3ğàÁ츎›ö\žÌ0‹/ä—}~ Ĥ÷ċ$-Ħ·ìôŞjĵÓU׉üJË"^‡›ŝİqŝċ{Ŝl-ş-ŝŭ‡{é–óVŽÇ/üċ>÷_ġ™ĞWÇżÛ¨}ìTŝ ¸+~Ù:²?ò†gğî\Aî’=ŭÈ5—Ÿş˙îKè | ‡ħÒrŠ…#ˆ9f\p13U“ğÓħ³[ÂġĝqhÉ\ÀŸçvÒÂ^ÀÙ=u‰ÄĤP(´iÓ=I<ĈH\;éˆëš65Ġü ‘ f‰DxŜŞîĜŞz(Â3úVĈ6 CúVS(öüÚUX‹$fÜğrUӕµ˘ğ#G‰{›Vu7 ‚ñNڜ#àXÖÏQgǜƒ³˙`L{çZ›ÇñÈ£$~…~\˜ ×zQĉˆyYċÇ։™ŸvkÁÌnş„sŠ™ß䪚ùÍ`n½S7ŭğ’ĠÌñĝ:2£³\|K%aFNo&!³ì‡µ–%d×ÙaŞ€bĉ·3‘US>Éiĥ\,˜K×Ì'µR1³3gO1ó{QVrÍüµc‰ŽY^3šw‘ïFU+EÍ hY6ñÀÌtï!šÓYÄrğ%Š™éß]™ß=²²]Ö<̕§fĤ€äğÑ´¨ÑrŠXo·¤°ÍVÒÌ̋АËÂÌ—bĉïÓL£×;KFƒx(èF‹SU³İ[3KĦ‹x(Y7šŒħÄċҍ[?%b†è´ÙE&`fg^ôœöEû£…bŸŠ™Żäşĉ·8ïŞfùoÄĊċÑi•8żNĞ\ĉíŻc‘:g.ÙsU—˘fbŸŞfEq1ç×eħƒZìóuY³ìï Xpțì4ç`²KíàËQçżGĴœô'Ga˘%ŽJĈ£·++?ıÍ­3ÇÔĜ(ÄuÜ Öšùüѓ˘À—yĜÄêm Î ä™ùŝí·™˂°¤TŠYŝq^3âQ*‘F'ÜÁ‹uZìBu#Uš1oO]3oTòĴK,oË£|7Z–y~°aĉÙGŝá/óoRĞ$߯·çBfŜÖÛY§Ŭ´1']3U3™E.6Š™ĝóÌ%}êüšı.0Ĥf M*•™0h)•™ÔW#Ÿ5sġ/gÀQèôäHXËLµq™L…—àóÌä"Q1ó’DU³üÏ3/Ùs·UŬ螣œ…êFĠın"İsĉ-["kçŸÏDĞĵëTÍĵäLŬênôÒ/9[uÎrıp—*ċœıGêĠBÜċğġ½Ĉín_$3wǞ,ĝÉUÖXì³|5ŭ>7Ĵ'A1{ŭ|žùú벂Ÿös™ —ÎçL˙+™-dl\qa²7ĤİэYPüHÁŜĊL”Œo"rÌü˙šofVJA33Ò7QĥìtĊ0Ó×˙E-1axŞ™‰™.Úq°ŸóÊ̞IŝĴŭ^úĴ?fòüä™ċG/z.53£”˘m\ŝ?„TÄÁA'Ĝ3ˆš™›Ôi+Dĉ¤˘y‡À]§>ƒf–ciŬԖ™kàÖM,OcFs[ċ3sYÊ çżP*)3Óv9fR!‹àWÜÜ´qI™Yk&ŽVVkʖX,³‚Mewĥ+pé23ñFÎ;j ‡î}gż³fö~ f Ĝ) V1ᇙ—íìⷙóâÒĊĥXf.n Ô6,ò§ Öĝ›ÊĴĜŬòiäž5áËIħûyğġ‹ßĊñġɏK—µî5sq ĞÎ ’ì"?vf~ÜÚĴĠİÙ(J4U>f%"àè֖™£ġdR(f“İZzĴŞfŞf•“Ġ•S ÙHTÍd3ċhgúˆ£M Š²Ġl 3+7µòĠL1 ê°İšùΤù—üÉ8P5“É’FĠL˜/JĠ^²ekĞşÑ6-ĊLŞn,&k–5Sĥ-oĦ\އru£b\UÍüĉRu£ß ĉÖĞnÌċ˘8Iucqy³[şÑ.+^ĉT7zɖĜvRw£W˜Š™¸òîڒœ3U3÷Äû°P5ó”<ĠžÒċĠXu£—Œ‰i4™?Ï3Ó˙:öÒ’ĥ8gŞfŞf’í—gĤş1/!ÂGuÎÔ96ˆ£R3ÇÔĜ(Ô9SçÌĤ-$ĤÔ9“HRÖD3uβÍàIPçÌKşÔ9SçÌKżälKsÎDżJÜżğRÌr½ĵ¤şÑKNĊÙRçÌK.ílsùzğ•Îs9Ÿv6ċ­bĦaHsbOeeĈ´‚£Ĥ˜•áí*[³`úħkÌQSÌÊڍ´cċÔ,wÌÄ1É~ˆ½”ñÖ· ˘hŠYÉϙµf­BkĤ˜ U3uÎí!Pċ]ô(°–S‰}ì²Ï3ĊLP>U³rß êœ9·£êFĠÎŬ!Ò s †È^F‡³]ĝy& KqN5Ġ™9%h’×ì{“s‘Ż\5ËnX6A1+[ŞÛHĠ,°T–Í‘ŞYÙRĜFŞf²lŽŒš=ƒïeÛ³<Ñ3UU3%†Sn;³jfĠŜSŽÖK/í ^3§"5#f3Ğœß%†¤0Î6bŒ£‰QB’ˆÏ°-ĊgÈñ­cNT)9SÂyTU•5™‡Cxxx¨Ä·ĝ0×ć9)Kq *÷ĝĝšĤIâÛf|˜k✟•",>|ߊâ\ĉ¤ĝ4¨ì—‹³³Ŭq—qv;bŒI|ëŠÏ0×Äg˜“âs“Ğsss“s?Uâ[W|˜kâœß8ĊÏÙĵ{÷.‡ÙċbŒâ[a|˜k—ŒïO/_Ê9ó;?†p“Oé9ó÷şßg,·ŞœqjÁ¸ä³Ĝîïï“ĝÖŸqmù·ÒŻuÌµß1ĤgNSʅ}֏1Ĥ_”;ĉLğN~żßTÎ8ĊϳxûömêŜ)ĝêĠĞŝŭûŞ´ĝŝóÛo!„ŝüúu‘ñ•şŝxúĥüż1ŭÚ4áunbĴ̵OÚġòCŒáğşä‚œéoókçNIġ£Ÿ/[ŞTv­=Ut́ŭ*I-m}t‹-”š;×[Ï× \Éwu]ŭcĝx<^ċş:Í)rGhPPh5§Èù˘APh[äŽ|Ñ  *ĥÈù˘APh[äÎ6sgù˘APh[äŽ|Ñ °Ï&UsŠÜ‘/T…VħEîÈ * ­b‹Ü‘/T…Vħ… äŽ|Ñ (´Š-rGhPĜK“ŞĜ"wä‹@ĦUla…ı#_4¨ ­b‹ÜIòEƒ ÀNšTĊı#_4¨ m1MŞb‹Ü‘/T…ĥ˜&UħEîÈ *Ċ4İŠ-rGhP(ĤIUl‘;òEƒ @1MŞb‹Ü‘/TŠiR[äŽ|Ñ PL“ŞĜ"wä‹€bšTĊı#_4¨Ó¤*ĥÈù˘A ˜&UħEîÈ *Ċ4İŠ-r'?wä‹€gnR[äN~îȗ3J)ĈYGŒ1‡Bĝêż1ĈTZ||ñ˘èĝJ\Ĉz·ċÇÓ/!¤_ë:ċÄ×.˙ñJñÊ9SÊ6osá§ğğÑúqí|ÙZÎHĴ“ĵCîî.‰o½ñëߖmŭË˗“ñ½ı½½jħ• rĤ´mŝĉö6}?[!½rsşµœ‘ĈY?ı…‰ä½v’ˆÏ°-?Ÿïï³â{s{+ Û\|WUJÉuœEUUY“ép8„‡‡‡J|ëŠsM|˜“âğĜ{Ò ré !„şCŒħßzâ\%ló˙>ÂOŭëEûáx [‰o-9ó­´àš…w˙ë˙xöï ïúŸŝ3l)>˜tɅKoKñħöœùß˙û˘ñ-Ŭ?—ßZrFƒ ĴĈŬŜ†› |Ñ4)<>n&Ġpqĥqĥ;î2.nÇ5y!>ĥŸ!gÄ·Žœq *gsss“3?Ċ”*ñ­+>Ì5ñaNŠïR|“góîŬğp8f—‹1Šo…ñħ­ıö§—/ċr&Óßë:|Ÿħ܏!\ôŝ…MçŒS Ĉ%ŸĊvŸÄ·ŜĝŒmlˏ1ĤgNŝ­óS֟ħçmŜ~ıĊÜóƒïïïS˙ÛÚĴ?§ĝ)ÌÛ·oS÷NÁWŻ^…÷ïßWĊ÷Ÿß~ !„çׯ‹ŒŻÔġÇz·e˙ğÂÇâk—ûC]_ô†ı@IÛĵŸ/9ġÚı³•œÑ ²kíݘÏQd†ŠmÎò×nRĦÄ|™Şrçé\ƒ  ĜúĞb ÇĞ\WkÊı£AàBĊVĦEœFîhPxĈbĞ"_4İTŠ+ĥ -òEîhP(Ĝ*´Èı£A ¸bĞ"_䎀⊭B‹|‘;TŠ+ĥ -òEîhP(Ĝ*´Èı£A ¸bĞ"_䎀⊭B‹|‘;TŠ+ĥ -òEîhPÛ⊭B‹|‘;TĊĥ¸bĞ"_äŽ@ħUhaċÍİÜÑ (ĥ -òEîhPĜcħUh‘/rGƒ  Ĝ*´È—•7§rGƒ  Ĝ*´Èı£A`ĊV“Š|‘;TĊVĦEhR5¨(ĥ -òEîhP[…ù²ñĉtı£APlZä‹ÜÑ  ĜjR‘/rGƒ  Ĝ*´Èı£A@ħĠ¤"_äÎb)%8ëˆ1ĤáB_ŭ7Ĉ˜J‹ï/^_‰ëÏ8ßĥücú%„ôñJÛĥ´ı֏_ë:É9Óßĉ×Η’ëGğn~şğÛLÎHĴ“Cîî.‰o½ñçۖonoŻZlKkmĦŭË˗rAÎ|5^_ı9-}˙üĉö6}?ÛsFRgŭd&’ÚI">£´mùĉöÖ\?ßßË9c˙ĵóúQärÎ£ŞŞĴÉt8ÂC%uĊ‡ı&>ÌIñ]Š›¤¸¸ÇÇÇ|1·ĝ°-Ċ‡m.> *°tÂĝA|+ŠsM|˜“âÓ °_.Î6ÎvÇ]ĈÚí¸Ĉ#/ÄgĜ–â3äŒĝ֑3n’âlnnnÒcî£J|ëŠsM|˜“âğ§ĝ9›wïŜ…á0ğ\ŒQ|+ŒsM|˜“âğ§ŒK>‹íŝŝ>‰o½ñĉšĝ sR|Nñ³ZoßMŬ;_½zŜż_‰oña‰sR|ÏIƒ @Q\ƒ €4¨hP@ƒ €4¨hP@ƒ €4¨ A@ƒ T4¨ A@ƒ T4¨ A@ƒ T  A *Ot<“µĴĤA=İišTUĠW£išÔ4Íĉwhí{żÔïñ<ÛŻ;bĝz˙yŸne€úQ~ƒÚÇcˆ1V)/£ëp<]pT˘ĝmöyŝ†îÜmšĈvû'˜lNëşŝR;bŒíÏÎ]DJiñˆ1ĤBŠ1Ĥħeêşžü÷5ŽşÓ–ŝÎŜG! ­ëşÓ§Ô°Ž £Í9aÓuşíäÊyĈâ#¨ŸO釺C]×ĠĜrs˙ÖOK[ù;Ž }:24´ÛŸù ÀPŭˆ1Vµ£²vxġ)ŸÚ#Síè~‰1ĤşżúYğü)ËMŭŬĦ#ğŭe†>ġ˙­£}½ŝ˙ïŝ~?Ŝħċúëgèŭ½×ŝ:1òĉ˘#F†áŞa<÷™9„uyÊİŭ+ĴIë˙Ĵğl>´cÌ]nèçc h·YjD‡^ğŭyûğcëgìġúòߙ{˙ Èó\ëÓ0äƒaœÒëXWhP§Ž@žÒÔ5ŭ#c _îrCÍhğÜP£ĜĦíŝlìèäXC9ĥlNÛ˙Ŭħ ïšĠ04¨†QVžlíŜ›Ġ5¨çúÜµżÁs–ë7ÓŭĉtÉÑàİ;çTûXüKŝNż‰6y5¨†ĦA5Œr.S›Ż|“ÔÒ~ĈnDéߤÒ]ĥ½ĝ¸³L5ôšcËġonišĉ˄:żĈb˽™fâ½Í^8Ŭ˙½ıż³·Çv=·œÑÜĴ@ÎMS[ğ1|u7I-ŭ=µ|˙4÷²ı×d޽ÖÔ'šÜ÷2v:~êÔûÔëžò{Ŭó íĵ× ­ÏœÇ¨†#¨†aÄĠŠ5Ŭ$5wÒP“6u­éҟċìLsw¸aá³2ğïmêiKîü›{MsP Cƒjċ4§jġ…ÔŝŬ÷ŭ Ŝ`4w·zG7Ô°vbġŻ[nêñT9°şŝsè= ŭÛ\?ö{c'çúT…iGQ‡eçbö3†‘“CúıBƒÚmäúÏìÌyèĜ·/ŒŬßżÑ)gıĦż{JlŬg“N5¨sïeî÷ĤŝÎXSŻpœ·I›+†ħç›?_ÈoN=eç<£úĵ˘)\Ó4ƒß\°5ßXšS *³ÚÇN}ç/€•‹6§MӄĤi’çŞ{TŠâ*Tĥïóe ݽ–Vì˜÷eÍCóû`4¨išgMúñ˜ŽÇc8ĞÜ1ĥħïġúßÏë ™÷כ÷KĉaÓ4İŞŞ´—•;ÛÎËÜıÊĵg]sUƒşÁs? ğSY[“çĤ´Oë`kËÚĉŭ)żż¤ĜĴ9GċÎĥóré|ô`ğsġ[›i_;ƒş­ˆù^ĜûzÚR‘]ëĵϝ‡§6ŜĉıÜ)5/sĉĤÇ/î`ú:­}}]á%żn_÷Ö~ġéŜżît+ë`Íóŝı·yn½–˜—öÁĉê—ĝl¤ŭLÄıÂÙ˙Îíîò1ĈT×ġW?k—ïżnwÓŝŜëċĈT×ġ—$ÛħMĊdıŝë·ñO%qîş[_sqġ×ÁÜúëżV?öncï-läû¤×<ïÛyĜohŽmİíÜĈ‘37sçgû³î²sĊOî¨GsÍë>¸żŝ—äiwùızqîızÉùş…ı*Yv0ĉŠâż%Y›íż÷6ġéxhıĦŸM}šn­›ˆıħç.7´ÊIàİuÓĈ>ôžsâÛ~9ë4ç˙ϽóŝòóÛôġ?œ ĊÛ/>sÛıߏĊ•ğŽşGcÚXrçÜQ†ĉŝÔ>xhŜçĉiû÷‡ĥíÜŝÔızéùş•ı*avt:eèÔÔÎbh’÷wcÉ4vti(ĥܝÙĜkÎĊ~Ê{l/÷ôÇÔşé7ÓSÍuN\cë/§€÷—[˙[(²kž÷ŭı3µŭ†^n;½§ıù3·ì)sHî¨Gcy4ĥû0˜›§SÍíıçê5ĉëVĉŞ„ÙÉé”ħÂÔÍ-ÔCEt,ûI›ğ3ËIìħË]´6·9ÚùL}Z>eŬ5ècÛxl‡8wúiKEv­óŝ\Ċlj;5Às ÙÒùıä ‰ÜQ–샧> ĉäéPs÷\sġóu+sUÂìh‡°¤ˆġ'ŭ§ŜĦ£&cGŒ†v*9 àSc?ċ=.MÚĦu3v Ş˙·râšğİ ÍßÔ5G9;Üĥy˙<ó~l[Ġ[ş§ŽL]N°4Ž%×ÚÊġhÉ>8gΌċdîYˆsÌĠkÎ×-ÌU ³BΎbjÙĦDÊIÜĉtî¨TÎßYúğ§H–Ä8vşil§ş$ıġÚ½~*'ĉSÍ4ï/7ïŸrZ=g;ĉÄżdM5ìsïWî¨GcÛ~î(ëÜkĉl÷%Ûê”ızÍùş…ı*a4¨Ù;€œkîú׍½î’bpÊÑĦSßÜÓ–œnšú4ż$ıu—{zêÔ&ÍĵżìĵŸş{|îg9Û9ç&Œëh(ĥܛ ċŽz´dÖ"ç¨Ô\ì§Çŝ#ƒĈ‹ÜÓ½ŭ£hıq-yÔȑĈ†Ü£ĉŭeçŭÔé÷İkùşE=çfŠħBÖDVÎüœ›{K>€ÊŭÖ£Ü}p.ÉÓSŽš?e.ÙߜcnmJ˜Ŭ5™sÍÏÔ3ĈN‘L]À=”OùÄş4ö§ĵǜ Íǁ’óZıñçŭÜç7ĉü­=<¤żÔyß>cÎ5ĤC×č½ŻħytÊkġŻcË}öİÜQĈԜm?t“PnžvçĜ’û ž2W/9_·6W%ÌÎÔkÄb›”=Wĥ²Ìû}­cıcÎ,= ÚmèÌĠòĈ·vûJùíĤi’ïO.˙ğ™SJ•yoŜûŜùŭĉÎó²išßŭ,ĈXUU•ÌĠ2}#]vħC¨˜İŭŻĉ´lMÓ¤-Xó~_äŽĵ\’›Ŭ˙½§9ĵŞıê”~^îZ§Tœö2?Ìû힪 ;żîÒ5§ëYgC×hîiû­í½VŸ/–€"8Ċ€4¨hP@ƒ ÀŞŭ?va"Ú͑ŸĝIENDB`‚gamera-3.3.3/doc/src/images/right_click_menu.png0000644000076500000000000005200010714675724020571 0ustar chriswheel‰PNG  IHDRü7ż69 IDATxÚí½mĴ$×yĝt÷éîêuïí™é!݆—ÒPO›‡ĞĠz%-aډM+„˘‚×ğ0D ì 6kĈÂüXh½ŜĴÖËüÁÙ ` È mOĈ´ŜĴÖ( ˘µ‰&‡Ìˆĵ^Îԝ[·ğşút÷ŝè:uOŸ>§>şĞğĞŞßhÜÛ]U§ÎsŜóž÷­ /ç;×q+*–eĦÛħ+N§bYV…16³/çžçÁqœÊÑÑç>8ħl{ĥm²,€çyá‡s`ŒA´)˙fÛ6:Nxĵh# 8çàœu]8Žž1˲ ߃|M굈ëQÑŭŜ“ĜÏu]¸ Ïó0âC@ÓjÍܛĜß²Ĵ™ßÔgwżžç…÷<½ï>ĞÏ´)_§îù‹úŒDûç÷Ŝ„mï†íŞ÷*żGù~lÛ?ês%DbñûDÚ>0ırċÊÌŝÚ§üG/˙I¸ëVÁ½ €*`ĠĤ|‚˙ĠNW™v–QajĈN9ŭ Óí£9‚ŠÓtıóʵm[KjġğĤ×QƒeµÂŽ-s˲fîM&Ñ´>8çñ!|>B#¸ß)Yx_â#_ORȆ¸&ñÜäAN½NġxqnġÄğâœcàġáKïJ~ò½ÎC0VŻ#ÍàM0^|˙ŒÄ÷wŜyg ‚ĝZĉ8ÇGÖ­*€j}è10V³¸Ç›¨ŸŞJĝàċW’“ĵ‰Ž#:´,Kxj²GC§Qèŝ„ñ!šV+8@t`AUrž_û(ü­Áj¨…mŒf´ AÖ,ïQwż:R›ÎËâÊïÊç#Œ8G?¸v+x6râgµ˘!8gs1Iĝ?>< ;—ŝƒ^Â˙/˙àTŜ=:Şĥ,ĞÊc aYÍ·Ĵ&çĵ |Ş*郗V™vZ(…¤‰{İrGŞ­°¨ŬÔ᧝ó\*#Ĉ‚òqó&Îp³ 5ŝœ5é<ÓÁC%ç˘RŜDvó3*í¨÷8ZòZjZ­+êb Ż’Ŭ>ƒàïPì˙Î;ïŒŻ\ı2™yÂ˙úZĊú•ÖhTqÎjŒ5XڜóàŻ  µ€2é+bÄKĜjBžĞ­9•żeYĦ*˜ĥÓ&‘ĉâĉ%O´T•²‰²Z;˙ûtĉ‹ ÷Ĵ PŸıÖeˆ÷ ĉ÷İÇ´ĦOµàšMd?ż÷şq%,Dĝ‰Dĝa@p@ÀYWìÇġ~VÂwê 8CżÒŻĠj˜ŒYËë7Ğ·9ç{œó}{v´$ÒĞR"Ûf‚ìŞ=n’°œáyƒpż¤ÚA\‡·$ó@çœÓ]›PSĠíŞ-Êóĵ YҊï*‘§×QÓpY]}ÖòïêŭĞ6ĵîZÄ{ƒûù3jiϙv"Ä^–ìÀƒ@ĞÀÀĴ„ßí0´<Ğ Ú÷<†:šÁ÷\p@'ĝÍ Tûšb·Wâ:ìµ59ĜLŜŬeT]Ù;­zĜuíŸ{ô[FïêTç0uô(M@ܽO“R§5ȃ[”ŻÓ4˘ÈlrĝÉmĞ'aéîRŬ 8 iÛ0*s6|·{­r:˜zċíŝiÍ'Mîħ–eY{Œħ‹ ˆż HùšäµcĴ˘:½ÔN!KQÓôžL¤,Ĥm˘ĵ²×XíĝşİCµóŞżÉYÔuФP§İÒŜ³L6ĠÙi L÷%;ÓLRŜôŝâÔuyjŽˆ0á…7Ŝp lƒ@?°ç…^™yÚûŬ Ĝ*#>ĴpŻŜ?٭ۖ×°ë¸Ä{H’òÍ`íxÎyĊ$ħĠyXÓËVKÖRO¨¤²])K=™ ޤÔI+:'Í)ċÁ,‹9iùu3ê çĊ´˘üq„'é4á…:ïJdße ĵ:'á˙íż˙aƒT=oXÀ<Ïk€{-ĈĜclÀ…@µ·%ÂËv|E'qtsÍŞ”1‘%I§K*EĠNĤ^.¸Ç$ÍL*kœşk"*Tú(ÒİÚSÔ eÚwL>!5á'’3Î xX È~*iß27g%|½e@Ŝ²+Üó*ÀYuh·jàó`5Á,+pÖídß F‘°Ñ UÔ Ó¨sEuŽe=Ô‚ÈŞIĦ“xiÏżÈġˁ0Yh2şûĠ½Ġšö=˜‹\+aa _—${; C'Ŭg$̀ì–*ác5ŠM~ıj'KÚٖġV‹kÒEwéÈĥì#áÓ¨}ĞŠ°Òٙq~‚u_WÔöE=ô‹¨Ŝq÷šÄ>§Ac턇BìŞÂU•ÇфŻT̛8çĈX%ÈĞ'ݤíëŒĥJğfSÈêÜëz1·vT|ĉû=7²d&é^$yS&)SùĞċĊ%.z o2Ë˙zciĤr²èdÔħ6/ÑukŭMóĝQ~…$Û›•‘j\ROï˘6^ÜJ,ÂêŻ G„—§£ÖL{-áĠù\Ŭ6wĜ´°"É 7Ŭ”&âk+͗‡ŽË\#gǑWÊĦÒĤwi$ĵé½ÒC ġż*tIâ:Ÿ—EçXuGZÄ Écç6Ix5—ĞoÒ’„,ésJĝ¤êœş‚K¨„qd×-ñÉ4dí"ރdŝıÌ`¨j4êb›&)V&5V—tCŜĤÎĴ˜ĥ‘—`„#ğÎNVUdµš)Q¤LHù˘™†ji+yİĴÏ5ƒiŜ;U ĞÒYnwzµ­pB™²ÏšRaEm+#Ùó>̲ı8ÉĞJi]ô–ëşèt:s)šfíóá˙ĤN5ï;0D˜½vQkigŞ%³ÖµĈ O’=*=˜ì”ŒÛV–çëwĤÀ¤u0,ËE)TóµëÔn`êĠ–§­˘ìş×÷N1 $ħœĉY§jž?}š+ŭƒĞEĝ'Dy¨úÌŝ˘ĵ–)Ï}™:¸ŞĈ›Òx%Ŭĥj"du(sL눽0%Œ]İ„7…ZŞS[Ş– 6ú|„–e…uŬäÊ5²Çó<ÔX}š§7(È(ĤÀd²Éĥï²8^çܛĜ†Êħ³Et9ċL = ّÍT tġ:M›:ÍuĠħşèǕJx™„şàħT­ ïyÓÊħŝŻçͨӂ@­ZCĈtBҍ”Bˆ:‡P’N"ö•5“£Qԁ“}ċ6dݧ[V*î§è¤—£ċ⢗•şI:µ)˙żİ>B\HÚĤ,„Y$ö"ís1ùÂLíħĴG5\2ê˘ħ^?${Ż×CŻ´ÛCIEĥ°ÛĴ£ığX&ġ&ş8ç‚v3Ş·*A“ SïA½Gñe'ŸmÛá‹4İıĤuäEŻo“sĠä_QŸITçÖÍΤ!ƒ\O0ÉóOrj›jì…܇âb/T¨ğÓ§šĊşY­ĴŞèĉĠuìÌ=Ċİë˘çž˘çù˜Œ|ĝQx‘­À‰gÛ6jœn20ۆ  ËOÀĝ£iĴĵšĥŜşvşn’˘Óé„Ĉ(´Îž+“tèdÉŞÛîÊħşÎċ‹Ñ­P}=I _&mS§éêĤtM÷¨j—Qӕr˙”ŻEîórÙJmx“gRVwÇÁİëÂqNpĉžÂ÷ŭİ3΄˙7uĜö\7xAM†Ö¤nY¨ZïÁ³j°xCk:,B&Ŭš}Uc‘IÛétĉ c&-?U6Żt‹gL’^Áqœ™À¨8“QísI×\,ÚĤLnÓ`az~˘=qBŭÓ@!O%ËÚ'ç<|^Ħĥi ÙqÇÇǸ{÷.Nî=ëÔ= È>üĈôĝĥĠ€ëžÁóĵÎ/cPğ„½ê}ô‡Çl´ÇÇXèÁ‚6á+“dêzü²İĉY<§u/žIâİ7•ÔÒ9h“$äÔµċäK’žM3’´Ê.FçĴöùh5„—âïtŞm€Î=ĵw÷}ßû'ÀqN0ĉ†|Œ:ĞÂ÷-4P½÷‡Óİı~ewúpFú@=:Q_·Ij'ĠîVıx&MRŬJG96ëŬî‡ÁSşġIÛÔI\Ó=èîQžş“mĝ´‹ŠL~“&çĞġÒ )/ĉĜ{î)î;'8uÏà>pÑëġ1z8띏°ĈÔ[[HߨO§ÛZ“STÇ ÀAnìVÂ|gÎzñŒL,Ùq•“ÀDΨ]œkP=ĝqmŞ30:ǵ@ĤğGSÁÓ¤‹ŠtZ‚JċkbYĵl½Gr’×ëûÎÎ\œş§8sOCOüC;ɲ,ĝ1÷Ĝh6,Tj Xu ŜœŽÀ5p0ĵ ¸Äĥ }]‹g„šÛétĉÖ^èGxĦĈO%a];ë˘&`IBx”dî_GÖ$ĉŽÜv§Ó‰MÎÂV9ĝpJ|ßCÏóážġáûÓƒ(:Ġ9bYŞÌ‚Ŭn£Ñ`h[ ´Û-TĞ T™ŭÇħ.’}Ġ‹gdŠÎĈRéUĠ\Ğ&F‘ÉĈUÄUÜIBĝ¸Am‘̽²Ê.ٔ04<&ëÑ^¨DëÂegáöÉÈO4ġħӞږĠĽ‹K•V–UCƒÀ0Ĉ´ö£;ó°9)Żv²,Ϩöh”ÍlÊc¨“Ĉò´—˘’Uï$mfáÔ\ĈdÏ?Iäfĉ„·mžç§1ñ?ÎfĠï:ĞĦÑh m1ÔY5tÚíîupĦÓÁÁÁ.töqqż…nЏv£…6˘^³ Ajoä5›Ĝ·%ETèiÔeĠ2ĦYŞö²|¸6uÛÖ{‘v9vf*½ìœ˜;aàġQoĥ³~xL³Ñ<Ħ‚żív û{{¸pñ.\ĵ„G.ÛĜ³mì·ëè´*¨W[?@­ uS·ˆköÔŻkñL’ŭÒh *ĦMĤɢRyŜÄÏ.ë )oÊ_îߨò›ĜßÛ ÛéÔħk]Â]Ĉ#—mvq:˜Lġĝ5=ìcŜéĈ%}–Û!ĵLü¸Qğ: ĉèG.üàÀÀÇ`|z“3ŭŸµ‚4Ôŭé÷~8JŸ‰O•gĥœó£ù4³‡:0pƒàĜjûʞgx_süöŬıßú¸€]6Ĉ¤ÖĦ޳f‰’–*ÏáĠm¤M8PÌzí½`’}읜KŬ}ĵ‡ölÍĈ$ ĥÙecìuÜŬŒ×Î1Êè$˘Ê3Dxm§ˆLh]çÍÉ)ÎF-°ÚܛŞí§İê?چġ ĜßÁ²ÀĜġĉ.j­ıTSiÊGI¤äJ_TĈĠEĞ|TQFŬܽĵÍóĉómëF›Ż3/˘žIÑÉ·‰Ê3Q&—şŽCMĴjYIÛTĞ/{IïA*áÓV³Yk}xuy˘\Şı>ĦÖڙsìİ;2iD:ßĵĠ‡/@€[ġ=JĠÜDċ™¸‚şcuŭdĈİÇGÍF,sĤçb"ĵ:P¤İf³ħúj’K`gŭÔġáUçĦ>ĵ:HİĉLğΞ_eċÓ`l:ŸJtùşMµçL“iOsr˙QËTÉ%Ĵdéó)%­fCġá•Λu}x]Ç(Ф_WċURĞfœLx“ŞĞ ĠǢ#ĵjóGĠKŒğN•¸˘-U’›jÄE™êà3SÍ&kÉNġákĈĴ)e#û&*ϨSœbÀ0Ġœ‹RÑñTéİÚÔŞ"J•Ozò³PkĉÁbÙğÚj6ĞpÒm{}xµ•œ<ħ̑dëĴüĴ*)H/ßk™CHóĥxF§yšœw&éĥ•†p‹jL:mB8f³ éíġáĠÈ?Ŭ *ÙóPyFŬÓ,ü j{Ş ŸtP‰À’ĵ{U8é´Ô¤aÚÚj6ĞRë¨>üĵÊÔË"Ù×UyFíĤŽŻzÓuïHWŜY7XèĤÔ˘*ɊìÍĤëÔċĴ×9ıċARW#m5ŞŸ`Ä^ĥ>|ÜïE&ú&+ϨÓ]ÂS /÷CÙ§jşYĥ÷ċ$.‚S7ĜÈ×iš–çK3E˜Ĥš Ġ‡7¨öYև/+òRy&n„:]5İïY§P§M—I›ˆÒ‚eS1n-ǢĠl¨>|ŒOJZ´>|™IŸ·Ê3IlcÓÔb\ùiżJ=‡)8'ê:—Ù–&o>Ġ‡O1P}ĝ|hq•gҐ9ÎäÒyíĠì$>…¤×ıèĥÄÏp„§úۃ˘TžYô]Ei":Ĉ™8ËÜC}Žêg@üm&{+Ï,óîċ…Vq*vï…ê2‘î:{>ϕg²óPSn#žêñ‹\yf›4=ŞOȤÓSċ™-%<Ġ‡'IŸċ6BNUzŞO Ê3[&ᅺĥİú„ġKt•´Tyf ŻK@)Ż }ĈF+/¤>ĵAMşŻ‹°zÉN•gĥHÂG-†R˙wŜA·ÛĊ‡ş{èó |8WŬž–’z¨SÇns„†T>ä·Rê;ĝÁ9˙òÏÌ-“ÌğmXäÎ]´Ê3„% g“ÉkĈŝÏ˙Ÿúô§aÛğ<­ÉéÌqÍĈÖÎ>ڍ:­ ê­)ÑëÌVTù)ŞÍ=\ÀxwïOó}üżü·İl@²çıò !#Â'É˘Î½žşg88ĝÀFŝ4˜Ĥ2š†ÈĥÙµzġZMvòs˙Á9ÉÙ)Ĉ|ĥ‹68&•İ˙ĉ?B·Û7şAÂ'íeÓtĥ†imä3÷ĥm£Ûí˘ÊOá4ĝ=`8Ĥj/ Žw0TFÓ=c>İŸYí@DìÖkŠÄe\!‚—€şġâIñ‡ôÇdGĝ?„\KxÏ<÷ zš à•ż@P> žúƒ0Qċpƒ?ÍMϝşgĝ¸? ĞKhż˙ŭïÓ B lŠ‹ÀqN…/ÄK´ÙRÑS‡Ŝïŭîï╿@¤'6Eĝ!&İöo°*àݧžJ´żçy8>>†çyĝ½ßŭ]|ík_ŻŭÚzHó…gqËßÊ´›/<ŝżlÛÂ"¨ód=ÏOµżeYèvğAVO?ŭ4öµŻÒîä™üB) ·D6ŠôB3X„ô7_x6ü¨żëGŭ]´ aë˙ì§{¸}û6îÜıƒÛ?z ˙ö_˙żĝż÷mmr™ô;öîB¤_D² u[UǗmƒ@(´ ŸżġË-\<ü)0ö‰Ù“ïv`_èâ‘Ç€££#Ŭ~ ?ù m0G£ÁpçΆ>€uÚôD\>^üġ§ŒħÖrMy˲pġñ'á8NX]DĤëçïÜı#=@„À?üOh×9ĞŞğZuqXRM9ħ¤öŝíß çç=o€?ÀÓ?ŭÓ4eG l’‚ìr&Ò¨úÙjU9£İmÛĝ_żŝżáΛŻİúô.ŜxMôz=ĵŭöÛĝŜ÷·ÔġĈÙċIĤéÈAGĜJÂŭïtg²›ÈdWëqEžĵ}û6:A~;ÛĥqĝĜ5nN'\éTŽ3 ç÷Mĥ·iŝ[ŜĤsĈÉ$W÷MÛFÔu… |íŻiËñޞĝ¸ĠT‡‡‡aáI‘·\h u ^‹¸³ËÑ ,£È’7êS;IÛ ’J'áŸnÎn×\ŝ_Hüóï_ÇcwgÖÖ3ĈĈxÍ.< ĵLèM› <ë>ĦMe¤:颊ŝÉÄcıŠ;·ħTžû{ÖCĜžaĜî˘Ûúsz“ÂF8ÜT[]&ĥŞÖ ,ŻÍ€Ûî)Ŝ?ħħßÙÊLUù›¨ĥ6¨Żü!‘*N Âßŝ7gZDâ␸§NĉöĝìÑs2Ärف?süìÏŝìtġ܀£]ż n=°ÇPċo˘R£Ş3ÂZµZŽóimw8š!/0Muuòà.u/Á}à†Û‡|։÷zó8|ßǧ?ŭi0ŝläĴ†*cö€i|ŝNĊ§7I lDoÔ§–¤ş úÀ÷à>páöz°ÛmpˆKŬ.ÎÜSxŜÍà!酴ñ!Ĉcšô’·v†*à;ˆìÂĈß½x §î´ˆ¤\NJHġ!ĦÎj’jïaÇŜkÔÁŭá4zÎ?OJéï=dP!v•ħ‡³ İġBdZî­êÏ­·ß†ïsœşg8uÏB²÷zŭ™}=o†Ê6V¨ÖËĝOƒÎ3ԆKl‡Ĥ€Tú@ç@5m'lħ„€ƒƒ‡pĉž†¤v{= }ġFuV›‘üBú{^`Çû>|ßÇYσż÷=¸ևßİĵÊ¸=Pġè ›”pÖŭŻÖÛ˙aŽì:xŜ $ğۛĜuŬPş[u`ÏĥqqŻ˲Ï;aċ’=Í1$ñ·XÂÀÁ'~o}ûWħğ× %·Žô€f£ §ĝżġ7ŸĊO<:•îÍÖĴö.8óÀ”ôBşsßC#âe|Ŝ¨„$:˘§ı^*BQBÂÀGžŝ-üùŭ]töÚ¨²ÀF÷1gË÷zŭ™i¸żñı_ÀġĞh·[¸|q÷Ĝµ†h×:sd/Ğ”Ŭ¤ÔԑŜ´ŝA,ˆJZ¸sÑ&„~òç~ŻŬúM0Ǚ)݇!‡ÓoŝŜCĝÛ_ú,ıl‡Ud/^¸€‹{lЁIÙâÚGKġbt‘Š›$ĵşJĴ„” ŸTş‹zt„ê×wŽŸ‡{Û rÍûF£êCáo~êgáGfJFèá)Ù÷í†V²˙áŸŬ Îp˙ŭŻü*€Â½€/<ġ^|ñĊ™ß:şŬ.:N.Ì ”÷<ŽÀuŬT’š1†ĞWŻ&Z1IÈáMËcMxäA7~é—pı{ {†ž_Èè4$z³5Ue²‡P‘ìÏ=÷\İĠú<û!ë͛7qíÚ5b^™%ĵ€e5ñĦƒtğ]p÷.Ĉc½ñTÍ·+M 6ġĈ‹ÚĥĠ0]ttDo²8:: +  FĝEFwÖ¨£ÛíâÚGáġ,>ünD}ĝs²OĈw’Ñ„bk0¤ÎŒò KZâġO2ğĝ^xŜ °jÂëĤfzŜ  IDAT’àé§˙3üöoŝŭà˜:Ş÷§êù`hÓ1´j£¨ïÎÛô}8Žş?üí/†ô „Hĝ$ĝó?˙ŝë/Ufa̽/€™˙†|Œ:ĞÎü€z´òï~ġWè ë ü"ĝ{ïżƒïÁ}=Ï×ËË5âuġá{½>÷½ïͤfŒÍMg™pxx8ó]´Xjğjۇ‡‡3Ċ3LçÚF äFÂ'ÁlFŸüä§bA'˘><ç×]_}â'ñÏ_ù0ĈfŞÒđR%S–‹j›HL(•„ žDw]ëâÚµkàœ£ÓéÀ޸àµÎL! 6áà•óĵw"¸q<ŝĝĝOĉ?Á׿ŝu<ûì³888“ÖĠ§‘œ˘F*}…Ä֑xí@m7É@#D]“|êħ‹Ŝ Ÿh0ÄžÜĈ•=ŽQ˙6üħ ĞzŠFsVċ/arŞ=  Ž6;ƒÏ.†Ó6b¸~ŭ:8âÉ';xŭġ×ħÛĴƒħìXšĤ#LZ˘èˆ—f ˆ˘=j$S‚Ÿ)DöÚF˙6z½~p€ž÷gĜET1‚ ~ÑAí0Ú;EĠv€úĊ0ÖZ]ĵ!ÛÇ˙ ׯ_ÏìZíĝĞÈm˜4”4 °RÂË%Ĉ÷_àƒ×`rX§˙ üŜ Ĵ~ĵġ—Ñ{ï^ó/a§óš?‚ñŜµKgÀî4…•(Y%lvĦ9|ìc›V‰(ÒĴÒ?°è5­â8>ÒnçœwŜĈ¨“xïGğg°úU°áğpÎŝŞïŝ·> àUÜo˘ñë€a/hkXŻCoÔ´pÚ­K͛Úe—í^&ĵĴzûîPñNÁ{wQż5FĤuöŻw?,ş"ÀġŜësìx'è\¨Í6°G]j›Ĉv^F ÉîȆ'ÂgGv÷÷ŝTşpv݆Öèö”œµż†KoßÁIdžÏFhíœÌ­Éó<·nŬJEúEœz|”·<íĴĤğ&ÑĥÎٗô^DĝÄd}÷@„Ħ÷6jû#Xè²ó(Şĝ°p,[wŭ&Şûĝ—€ŝûxĞÖ€Ü˧Ħŭ.;òDeÙ,ÔXu{Ü÷EڍÚ×´_ÔñQߓž‹°}È,‰ĵ~{Ôż‡Jó^ïœbXŭêí÷ĤÒùdŒÁŬÎîĠ0= ×oâž˙!£;g#ĵ9ŜĊì o½˙cüàÇqBçœpŜÙĥn·Koo5ž@>[Â÷G˜ŒïΨáġñ[ò`F’dżçƒ…aЃ÷*zNŠvÌòÀì:RŠ%€²,b‚ˆ™İôcïGİrĊóĉœñcèÁözU ÀàĜ=0ŜFoô#TOÛĜß}ĥçVgĦE;ÛHzaċ*=œaŒ3Ì.mííKöúŜ¸żÓYë?ĈQí2NZ¸Ó>ÀQĠĈÛĥc›ƒ£x˙?ÂqżŽú ܓbò'Ӂ@X³„Ÿ+A„İ#Ímœ‡½VƒlTN›ÁġïÀétĤŬG˙èI܅‡ÛĴ [¸fBu¸èàğ|Àó;ώZ# O lԆŸÚáç–ğƒİ£­Â]x•!<ˁÇ-86ƒ 'îw?ÜĈ½ŝ >¨ĵ‹;Ëáħž×GWPÇ)>àc8x胋7vkç ċ´#6@xpQĊN`üëÀ‹;Í=  8hà¨ÑĊ=ßĊ{Ŝ£€?×û-gJzÊ jÓñ] Pž'Ÿ|’ŜdêĞŻÒC(:áuGN`ċŽù@?‚7Ĵâêt9ëŭ1|żox£Á%ÀE÷Ŝ7Ÿ§>œj żŽ6Ž€öIxaS~Âjp™…ì"<€}8üĵŝxJôj wüİÊ˙ÀƒĈ.X?Ż9ׅƒ&Fh~Ċa]İTDè„5ž1!Z̆\ŭċ˜âAġÇ!Ñßç“İ­_™Şï ·Zxŭ&.³pï˜ÁöŜìÁE‹5ñpĊG‹ĵòÂÒÈlZĊê¨1 Më”ܣ‡ñ`¤!ûä'çŽġúMÔî~ob„Ë8ÁC­&>ܢiµ`3íñ1v*S½ŸqŞMF lLgŒaŸícdy8ià°ZÁÉÀ;xŸObĦËÛ@mşBnˆ7P9}ŭ;Wwí*P‡‹‡ZMtk=tê;°Ĵ&,Іj£Àƒé⁰v /"ßv­jÌ•½CÂáî”èĵ߇_à#œ´Ï̀“ÁôĜû÷tpaòí€ì—šuڏ£cwniUP­7éy ĵ ŭĠ<€ÛÀyĈıÛÀŭ>z÷€{>pż?˜9îÂäÚ¨˘ĊŞĜ™L%ûĦŭ8.ïL°kyè6F¨Ö/K÷‰á¨ĜŜ”!—@( áUÒ³™ü·ñû#0˙{•‘$ċ›Zġ}\£SßÁng—›ìîĥ`·-4Z•yU~âšìDtB)Ż’~dy¨U-ìNZx—]Bk|ÖßDÔĝghZaYMt[}X;{h7jsŞĵUÌŻ&²ċÉ7—ÊÙDVS>y]ûj;ĤċĴIÛ\ô^“l#áS‘Âğ¨ÙNŬÀê;³™f/ÔĴ™clĉcżÙ@- ğÀˆÎp:œ^òx˜Ĵˆċ*óÍ'=—ü=MŽù´×ĵȽRz"|ĉÄgŒa—Ġ0`À‡v:3µÁ-L×Ï7ĜG•ĠQkĜh €{jó÷À0<WÑhىΟeш82Ĵ‚(ióï­â™ˆ _ŭżñÌ~ÍI£kÚèġ'ç~ ÖĜWL° Àr^ûU§ƒJÚ~šëXĊ5SZ,"|ĉD—?QŞx\RoVġŻûçI5†ú½ċŻm‘:oАÎАâĞÒ"ĊFuĠdċ”ĥm‡eĈÖÁ̧ÊêÚϨ}£öe Àŝâí•I9•äː>Ò>ê8’ö$á—&½ ğĝ^"ŽĜû2:OGŬ>Ú8Á•kO-µzĠÉ“ĥŸĉ:½ĉ¨(é%~%¤ıċmێTéġÛ˙Ûzà•.,ˊMfıhù´ûšĥ'ÍgŸ&ïŭ˘mRzÂÚ$ĵlË'™J‹ Dn;Ê^K äTÂëŝ_†ô!§„ÏšìËj Âĥ˘Z¤‹%5ž@Ĝ"Â"<@ Â"<@„'Dx@„'Dx@„ßäüqşeŸâwy›ş_Ü÷¸öâĥE]cšsIPú°µuċ´[E.:$|J,šÓ. ݳ:/œ@~*Ñ4żéżlNğ,ˆN •~ĊÒ>‹œv›ÎDK „°Ġ—•˘Ë䍋ŞCRž@„_Pe_eNğ´íŬN Jż%Ĥ "<‘@ ÂŬì 5Ÿ@„'DxÒћ$ĥ…O>ù$½É`™Z€"WdÏ[Ú2­ı§ĵôDĝÂI~Sú$9êĠmşï‹ìSP^z"|î¤ğŞ&Rëòg‘£ŜÔvÚ}H½'áWĴ^g­v'iŻ Ş>%´Ì/ĥ"‰ċ2R3íħ²FĦjQKÜ>E‘èDv"|.Ôù$żÇíg"ż lœĤ°ì>y–è7nÜ ²“JOH˘!”Án'²“„/…mŻĉ¨7I`ÓĥmPé DĝÜ6î÷¸œôĤïiˆi ’\+@*}üžÈN áËf:Dx@„'Dx@„'Dx@„'Dx_FÈYkâ2ÏdyNÓ5dÙv^ŜPҋb€mÙĠÀ˜uDĈİËjWu<ŭÈ9íhĠIĝ\‘=Ž$Q’8Íïr<Ŭß4çÓIô´íĊċî[”ÓŽ_è".ż]’ßĠÁ%*Gš|z‹ĥ—äZI½'Âo’ŞÇĞʁµl·Hê?İġdJÊ›È˘KRħÊäEɄC9íH—Bב^§ŻBMŽğ–·¤O’[Nŝnrœ-ĞÒëΗäZd i{ÂÖĜQ?MNğ4Î:ÓqirÙ%ɧ—´=ÊĦG ž@ Â"<@ Â"<@ Â"<@ Â"<@ Â"<˘sÚĊGHJzA„Ï ÙċeĤĞÎö²Íd'ÒásAvş¤–I¤’|qÛÊiG„/Ĵµî=I8‘žż ²ë%>O(ħD'²á ["щìDĝĞÙYċ´#_l}Nğ¤yà(__ Ò/²}Ñ|qİôO ˆ„’‚sNO ˆ$-J/íéĴ d˙—›Ŝdüoü="ü¤—ŝ˙ċç~ŜfŽñ_üMzDĝĊ0ÄDˆù™ßżñoÍ#ìĞdŽeEXĈĥ>2ÜM“zDmw"z²/J|F‘°‰Ž+:,‘=Ŭ@ɃeYÛi'ĊÍ˙˙ï7žûG…¸ĉ"\§ézż‰´ġ6ä¸uëà÷˙÷aYÖRwëĴ"ÛĈáá!ÂAr)_*Â3J˙Ò _Ä3_ŝÇsSŭ-oxĉË˙X{?yÄK/|Qó\xîıçˆİÁó<ĵöÚkĦ9D*½Ħ#ꈭŝ&:ĴşM/ĥëĥE}kSüž´ŭ´×¸ÎÁIœ_½î££#bk8>>Î$nĦ\„׍z1#áKÏÏ|ċ›³2|W·Íµ|OÜ&c3ûšÚ_ê74ĝâ‹ÄÒÚò‹‚Bk¤× ÈcjsÑsmšàyżBYmx4ŭ·üŬ´íÙŻĵ„—ž˙<žŭÊKĝÖóÏàÙŻĵ4³ïKÏ>Q›˘ñÚëˆÛĥ|ëùgfîgŬç'l­Jżà²ˆï,áÊïÏ~ġÄmŠ}żġü3³ÇħŒqĊxöĞ/á[_&zs’İô™Ï³_}ßúú3sżÏŝĤ‡„ÛÎÛöĞ/Gîu>ó6drëú蟁Yċ\¤„ĜŞŻ‰$ü1%ċgç~3m—·euΨ6ċ}Mû­âËıĝ%&M†Šĝç‡ïÜ­L%>gœ£Ċ=oÏqœë8‡žç]µ-öÑN§sµÓéùìŻà—ŸûuÜüö÷èĉ7Ï=÷œvZN— 4m‚PuµòOT{YœŬ8>>†çy8<<œX–5ħm{Ìú8pÀmo àŭ`ğ`H^zÂÚ!%“-mħOµ ä×µgÚĠİôı½ò’ ۊB~ÂjsKc „4ĥ?@¨£‚0éĉşġfB,ÙMĥ>@OUr†'§g@„ÏÂ%éŝ~…ŜdÎÒK/%–ĥY—ñŠjO·MŜ+³_l Ï(ĴШHZĈ+iiÚ3íğ =b !×övRÒˆ„’i„ċA7<*ĦúY´MݲE™6şqħ‰Túüİ…iĵ°yĜA­dżqnŜĵIĴ" ŸŻ@•š: @üŻŝĤ“ĝêĤc£4¸ĥÒ\CÔıV™ä$é‰ıWû“,Ĥˆ[àĦ‹àûÉ˙§=o’kĠm7k&‘žżšƒéğŽĵĞPĠ“´ıÔz²ás/ċË|^ħ*‰Nd'ÂN:ŻÓ”XùW:zóĉMrĜ‘JŸo›=oÒèšDZ²í9›7˜z$áW˘tĥv’…ëXà·ˆcÑkXµJż­ĉžÉQK„ÏıŞEòe÷K³ÀCçĦÏâòFty qٜrò@Ĥ0“œ#Џi’da0%ž°‘8J›I*)²ÖfqŽ´ƒÙ†´ıupŬ1$á „ ìñE%Ñ|"DxÂVk:£Ì •ž°5Ò{™ŭË’„’t™œvêtc\†œ¨s,"ċ³žŞ%ÂĥF½^”,I§)—%dšóá „ŒĠôĴíîmħቄÂhĞRİ·…ìDxBé…uµQl}Nğe½µYx{Ëà1Ĥ¤DĝÜH€¨,1yŬ‹.aäœv"|\s‹ä‹3iQRÜt irÓċE3 œvDĝšióĊ™öY&ĥ:/ıéH½'Âo•&VíÎJ5ÏKnş,$>!_ /½AŬ_fŠ'İ/ (§IĝB“~Q•YUé£|e‚ 9‘Ÿ[;=­tÎYóv=eÏiW–÷ĥġ9풪ôIÔŭ¸Iµż<ż"|FĤÁ:Ú ’gëÏI20/:U›Ôż²n? ž°ġwœ35m™4eÄÖ=€Ó<W€)‡œü›šS.MŽşmċ´#ÂNġW£İH#X^âˆı•úq6~’ä•„y‰OÈÈKo 0a1‰Nd' _Hġ^——NŬ‡†Y’ىıĥ×Qŭ³LYµÍjüşKœ·DO›!遟3,Z!jCsÌmj^6§]TŜ:Ó@½lŬ"<°¤i´Ln·¨œsI÷%ž@(¸—ċòX"<@ Â"<°v˜lĝm9í%ċ29ít6zTŽğ,Şá „Éġ}‘6˘Ú1ċ”+8çDxÂvİċQÄĤ)"<ĦDZ@•~›Ġv"< Bù oR —í¤:΃rÚáiÄß"²éW ÙaÇ#ÂgĦ˜ZÈÛԅIê„']$RÔ)£›7oIttDlÍB23ĥщ@"²ŞÛÒ.—MşH¤L ;nܸŻ|ċ+xñĊ×²ĴL:ĥŬĥm,ŭÜh=üŠMĴĉ—‹&ñu8::­[·/} ë“—ò‹’~ëmĝ¨ıŜU„bF9‹ŞÒ/“ÓNî¸$ñçívġ™,ĞÚoŭŽË[—5ù“T-šJ/lĝ4d—ż˜¤'ÂŻÀĤÏJz/bߗE'Âçl°ĜvénòšÇċĥÓ-üˆËd›ô|ežJԑšˆN„_‹ŭžTĊVż'Íy—6ë Ċ V ZOĜ¨´'éN„'Dx@„'Dx@„'ˆO ˆO ˆ›ÄááĦö#o×ŭOHy‰,!żĜêġğž-Ù)§IĝÜkI´B4d’“¤'Âr K_–ĵH½'•>ÇRœÔĝġJ|>76ü˘ê>Á,щìDĝ­(ĥU˘“ŽlĝҚRI—LşSRdjyTŝ9"9Tz@„'Dx@„'Dx@„'Dx@„'Dx@„'ˆ%¢9íhħLzPҋb€rÚ2#;-‘% Ÿ{ Àô›*ñuùítûn#(§ĝ—ßNl'¤Wï9çàœÓ#•~uRĦ„„眃ħĠ‹H„,INĵäÈ^b ò1ĈJ­š‘—èIvş~Bj}ÁlĝUÛb˘}ù“°˜dÏÓ;% ż€”_×H-:‡çy+'ĥÎQGÒ~yƒ1˲HÒ…›z9‚jgYD7ċ´KšßŽÈżşŬ.\×%‚Ġ†_ġ‹SÛ_×y Ğ“²˙'쌌’(ç’2áVi‡‰ k—:Gq!L2ġ½Ò;ÍıJïy<Ï Ġ³uJÜN§CÀ„w]ëÒ(’„dwG;bg!ŬMp‡Ŝ^AñŬïŝ?°ĴIô˘IĝĴTz· ÙëħçŝáˆëׯÓ, ~çwŝw<óÌ3¸~ŭz"ç+!„gŒ…ÛĥSßÈöùÔ4è‡d·,+l[GvĈ>÷ıÏáµ×^£7X@ĵüò˸}ûöœ§ž$~Ž  -ËJ%áU²Ÿk è‚ôêŝd·— Ó1†N§3óŽ 9&ĵLDY²'!£ü‚9çp'é‡ĵA¸ŸožÒ,(ámÛ5CBA$ĵLúEày^xĴç 0ú‘G°m[;˙.…ú§Š'žĝ)zƒ…—é?„5ÛY>|lĞÍIy1 A<Ĝ—P,é"üúPŬÔK—?–eÁ²šhYZ–5ı•ĠwÎ9F|ˆQBU>nĦË*Â,ÚfÑċPĤ›-Qé—%eY°mÎ…p:NvĉœÛï³ĵz³˜Hş˜wZġ–=Ù)§IĝX)/ßívqpp€ƒƒtğŬ™O§ÓA§ÓA·{9ü­ŬnƒħZĉÒ9Iî:ùŻià0m3#Í~òïQÙv×5¨-šÓŽÔù-•NgĈÛŻSéĠï_üâñêĞŻĈžC,o•ĵĝ’E·O’ïI·Ċµ™ö\yĠRHÒáIzĦÒëĵôòòĜuJ‡¤Kfĥe}My$=‘Tz#dËA8ò`0ëÜKOt™ےev÷I9툉‰îyÇ ?ÇÇÇáJ*1 'Äïq—‰/HNd'•>–ôbµXq'œxşxzyuÚċħ:[(4êH'ŠBj‡‘w‚êôœĵ˙Ż˙×˙++“ŽIÒc‰ŭ“?é9˘öSÏĞËğOĊ1ı$ĵŞŜ÷ĔÓĜzÏiwvĉĈFÚĊ9ږÍ]§û=ĞsPMɋ7İĜiaët˜-g~ڜv2qĠwU1XĠ%ĵÀêŞĊŞSvË8ot*x‰e›Ż‚ìë:WÖ6|š4WQjı:à§à 9%ĵ ğHXİ‹‘Wçêċ<öИžĦġäĞS£$x‘‰ä% ĵ`#"íéċÑ\ ÄÑ­‘_֎^4Ç\”£-MÛiÏUşH„Ŝ. ?Kĝa êÊı’’'î·Es̉ïQĉÁ²mG‹ÈN(œ ?+­‡F’‹€6B Ż.„™Ĥħ´5ׁ@(áċL7Ng&˘J%ô|BKŠİ.h̖^ ž‰Êg§NÑ Ïŝßĵ‰ÜRÒ'ͅGÈĦJŸ$m‘<=gY~á™g(‰e IŸTsÓċIH"dâBĥMJšsĊí›V;]¤ Ó5ĉvH4E`]-GÈıĠżĤìEQZ^.Ğ.ĵ‰ ѕżÇ QY—’ ê*Ï$ĉ¨zMiۈ hÊU¤zÁQİĴˆĊ'ê·Ñ‘Gz-/Çn¨£´Ĉ(òšÖrDáÒR×iħşŝöo]ŸWÛQm˜Ò…×ħi²ËĦM7Iä.ÙĊ;#šÚħĊB+ıt¸Ž&ÒǑ×ä Ö­ÜŭSíğò`&F•ï;Ê´Pûğ|?qmÈÏ@Ö ÂÜ›Të„Mî8N@üSé&[ڗ&>˙úÖ-rÚœGGGĈ„•şu²´”ĊlߨEö•ÀqëñMZÈݧ9U ïCŠNŻIDATy^HzSG“fkş5]Gvu Ğ:ċA5âÏÜSĝA³–fŒœûìSŸü$^ŭubOAñÍo~˙ĝÇáşndßP$uĵ™Ĥ‰M)ıdé<Ŭ>\Ĥ#ĴšENùkCo5<}6ĵΉ#^`_zÑç/³ÎG`Ĵ–8§Š,ÂSWÛ§ŸG¤Y-§‘÷‡ójÁB4A:­"Ìç:ü((;ë;²ş.Úm°šRMSO§ ¨İÚt„. {Òçc2wÒxùĠcsQjJ..`zòHlÛğxùċ—qŭúġĜsĴ3§Ŭĥ"mN;9C%‚: CÓÁ[4QSÖ^˜Ò\Ğ’ş„l3iP9ĵd3AVÓĠsŠ˙ċžêÀ1•Ä–öşuŝ “.·Ħ“šáw‘vĥm‡$&0ĥâ†>÷ıÏáµ×^ËTRë$Ğ)ïœI“X$wĵ"N͓§Û7oH›Ó>˙ùÏèèN'"áIgNu6yî£â7LRWġ ¨žwáUĞ—ì`“żËmĊ]§éeğÜÄĞÜ^iGvġĜ˙ûO˙/\ê^^éu&Q­³È]·ĥh*~éE‡”ïÛ$ĠÒN‘EġÙĈVÉċ(S=ċ*‰E|ùXUú›ĤLçSŠêùLmè3ƒ×ĤUzq#óNs@ç?˙Ì/àÖ­[İíĝ4dɂXIÚP×ÀŻâ:Ö-ñ“÷¸EQQ„7u¸#Ğóĉ›ÒŞEU× &í"Êh’ĜĤX…$9"fĉéóÒIâ’&y8qdYUş¨˘ċ [• Ÿ„ìjGÖ½{•hjdn~ŜDú8ÂG*ŞÀİİ˙êHnêç:mĈä4™$ò3’½÷òsɍÓ.I¤î.ZğŞì1Ûî\$§üuħôQöş:GŻŞ½Iĵĉ:M"*èĈ$飴ŬġGĊÈZ‡z/q’|>™ ×Ĉ6ÒNç°Èƒ”^d@)ƒ†–ìj°ŠN•Vç²ċŽ/Ïg›"íLڃİMDT§Ġtí›ĤÌ˘Î’^ġ+Ĝĥ=W<3j°\rÇÇÇZÂ{žWÜHğŝÊ+KGÚİôEˆ—Eî:ŬıË<}i§öĠ[-ĥ´K˘Öë¤ĵJ0ı†ÍùÏ0ìÓqĉƒ ¸ëşèt:3żÉ÷-ÊmËڀ,áĊs‘‹oö7ExU_U¤]ڜvIóÓ­*wŬ2ç*Ši§ğŽĞuŬpÚËdžŠàçCĴĈ™œkµàĝ‘v`S"™/ëΔà’ÏŬ÷<4X-ĴÍ'Î_êHğ _”H;‰ċ>£Ó7NĝuGÚòƒ˘DÚİsÛ²“Y8jR9Žì€“à¨1ĤĠuşç ËĴ“ Âç-Ҏ°Ŝw_„H;90LşˆY"×ugJ—Ğí¨Ûtˆ8!ÑĠy2áċÁEÜŻŞú˄ÎÓĞw[iGĜá‹i'ê8÷qâ8è{Ôƒç `Y͙ó¨İlÛ#ċt„ƒˆ…gJTéş§°í]­ƒO~Fr8Ç ˜*ÜhKġRNğíCQ"í<Ż×=Cß ×ëĦѨKÛGĵ>,ĞŜ‡Dd²ĞQr²V{âĉ43úsƒŒ: ™àó@qWúHğeÖoI#ò–cÓ9í™Wi'ÚdççœÍôEĠ§ GÉİ&ŠĴÉLïeX­p~~:@14Xmz˙^?ĵO]r U[™ ówŽ´ÓĦŒ!­y {Ò-ÒiµPcġ0–^ĥ›ġ?œ4B˘ë̕)I‡äµf4ĜY)? ‰=×R˜ĥê²jŸ´ÍFÜċ"ÒN|×ߨS!âF´3ċ•‹ÚĤ£—óÏEIÙ´ıîtùìtm¨û™òß%=ï²ĜtN;]•ġ˜Ĵ#ítójù+Ô—ûĵ.+ŽJdÓô£jËËÎnĠQ7sìĤÈ..Nĉ^ı”$Ò.s§É?g:6nPHs¤mD%òX4ÇŜ:Ġ{Ñé§k’P* UÁĦ:ÇL˘ôWüABQ™hL„ ıÏGŽë˙QġÄq2§r“µVŒŠ²RUż˙üĈ_OT=V%í"\·^=j kVjĝ*ȸġ?IN;UğKâ€2ż$)î¨0â˘×˘Ş¨•|ŒjĞë4 SĦ ]Şj“ĤbşÓ3Ĝx! 5šÈô’Ôh§¤ÄDüuäıËŞí"dY$§]\ŸH#µuÒ-É Üu8’É,Éà²Î ²GڙFRu.V7皅Ç{•oÙĥ×98ea§ñҋıbLsÛiMĈ¤R/ÍñQûİÑzĈxö„µì£´•E –²Ëó‘:û]žğ”YÇÔGÙĊĞjğ,H›ÓNŜ¨35V|mnÑÁ Ëĥ³,sžéŭoZÂë‚T[MHĝ3)ï{·ŝ ×˙+KÛŜ&ö²ùî–IpĦ:çÔ6£œnEIĴ!oǙó`›Ş³ y\ïħQ /Ğër(Ħ:§)Ò É݃>ŭôÏâèèŬĠê¨íisÎe‘ë.iĵUäĜ[·v§›²Ó³´Hj5¨nò…ËÒ\Íò9 R Ó­Û^\b“‚€–@—LÂkfﳙ4@²='"žV=òosÎıuİşrˆÚH²—L— Vş”Gz5’I¨ŝßùÎwя>ĥrÒVi'ÏĊ‹A@]nJ(áĊK֑]&ĵ Q"×u]<ù䓅ObıÍ^ä´Óe1%² \ÂËjœjÛФ—t:ıB„â^ç‰W§ç%“²MoŠİ6Uä ›ô&R“t/)á£TxµÔOÔê(Bħˆž„ÔôŽKFx]*à(²ë!Ê5ĥ@ÂËÙ5Ġ|f*áe‰ío›ĉʉì„"Ix9ÚNVÛçÉ> S[1V‡mÛĝÌg>C^z";Ħ„7UÑ˙> £íĤ¤Ż':G”ô_t~}›+Ĉ!Íj9–^] eZ—< Ìa‰êˆE‘šˆşz²鋁êĤNĴ&³m;üt:Óívqpp€n·‹n·Ĥ˙ŭ—ßŝöÒ×pxx~LÛTüóI.' „Ÿ#½œġS—Ĵ47íÚµD)’ŞçQùìâòÈH½'Â' ğüהŜ*ŞbÈ:@_NâGÁ”§Pb Ÿĉeëò„-ĞқHžu*çm°áӐP0Â/ş^Y]ĞJüu"Iò R“Iô¤j|Têܐ˘Ä[”ìI2„Ĉ+Wŝ\DÂg‰ĵ•n*ĞŻ’<Ymʜ|ƒ-JöEɧЁ•fTUëŠ/#Ŭ“ĉ³3 „Ċ!g &é^ Ÿ–şÒ?êÚç4í¤Y>™4Ç[Ü6"zvT7°é됉N„Lû’:tÇȅî“>lÑ…Ġżġµ˙?ŭÔÇqġêĠĴ~4•Ú†eılه%?¨8[(jİkÚBO<ñnŬşEì) ~ġ×ŝmÔV–káSÚz½ÚívŞ“LíʅuÛÎiûPÙÔŝLïFĜE5VGğŬFìmB $"ĵì–eĦÓé̄ÏÚönŞ(ş$óù„rI÷u,“>4E5k‹Œ5a…uÚNg ¨ßMĦğiBzM™l²ĝŸ0‹,2Ŭè+ góI҇ĥaP`Y½$™ĝò4œ””.´QÎKż ğo‘x{Â,ÙÓ,‘qô› Y܀@„!şĵB^ܢ[Y'“]¤§–Ġı¤*}VÉ/Äê7Ó*8y{ÔŝÛĵŠNĴ‡_„ôYÓ4j½ĉ½jR: ²›41X,ò²³Z›”¤”Ó.Ä"ŭñññÚS•™ú¤nÀĦXz ÙT™ŝ7Ùúòƒ]dMŭÑÑ1+Ç? ßĝĈ7Ä?…G7r}:˘'‰ĝÜ*Â3ÌŻc—%t’WĦĉĞz‘çñÇÏÍÙm—üisÚ=÷Üsp'•ß&ÓNŻT-VIżlğqĉh!Uz™ĝIo*jñBw Ŝ†Ošĉ*OħìŞD_ôštÇg‘™)7*ŭ2s¨Y½hZHS5ï/ !µ´ğ>ÉÍdġBuŽÀ$’UÍ['~[F—÷')żŝŠ\} Ŭnw™‹³0Ôeâ&gu! /“q•ΝštġêU|˙ûßODú$ÛÒŝOX?˙Ì/„™fÊ éœ~şŽ ĵÎ&ۖI’îÙH2‘>ÊĥÏŭf’âÊäˆY…JŸ'‘={²™ĝqY™Vɏ•>Éö1€Y%ĵCžÛkވŻoĵs·‚İמq `@|xÈQıÊ= żzÖë?‚ŝÙe—ó=îq @=8N´UYÇċwl GGGH-,‚HŸùz퉿ŠS×ĊÀíÓ³II,îxàÀ·ĵüŭ1€÷ƒí€!3éùá+bu0>µçÀ0LÚ-°Á|4Ž6sÛġŻŭšÍĉÔıHÈŻŬȧ&à°6}OƒÁ­VuÖ¤‡“~fŻúÔöà“ĝD2Bb¨íBġ³,†É„S?Z—J0áñ„gs–H`ÓŸ€YMġhï G ½Ù\ZŽzE‘ZÒ#°ò‘QéÙÌ@и*$aµ£î$ùû`À„Ÿ; ‚#™ôżü;@Xµ†ñÑí+ô|’lfĦzyB°YÂÇr’Ċ40’ŝré/°yx?‘ÄQyù+áÇRCCƒàap3 Ú Â›!ĵ|üàéoTé'İÎ%’÷œ>ž@Ĝ˜ /ïĵìIÄ*–½ò$Ż…2‚ĝA£g˜†è‰àçA@|œO Ĵ‡ĝ9¸éütÁ,KzÙgTċy0JôƒF`{@;ĝ^lĉ"<°b÷œ¸Ô „ôœ”göÁ(=Dp~]R…¤Ż„Żá „µ~‚sߚ'Iù{?…z?#ċ$ĵPD6Ëa0z´éÚïDxa}„WÍn7 ûIÀ[U­‡‰#İĦ^û(hԒÈ^Sìw"<°> Ò%Ò÷0ëÀ›!ü9uñµ€ÔuLsào]"{UÓž@X=áùÙ41uf#_żòDKN‰ôU‰ÜLúßDv"<°>ÂˤWqÂ`Ŭ¤Ò Œ%ğ]ƒˆB.ÌFĜİwÉÈHzÓÇ"<°>ÂCħég> ${*rJ9Iö'Âë'üÌv•è˙?“g ÔRÑIENDB`‚gamera-3.3.3/doc/src/images/save_by_criteria.png0000644000076500000000000000713710714675724020610 0ustar chriswheel‰PNG  IHDR¸Ñêħ0PLTE Tpħkƒĵ{żµĜŝŝŝ#3Y½ĈÙ1FxÌÎÏEaĦĉĉĉYZ^ż”‹šššF êIDATxÚíïkÇÇJE(i˙…•jNrçşuíĵħ…)n %¤SLšÌEÑɇT½ ĦùUÁ2‘Ú47}s'+¤+èàà3ŽĈ´%&ĵéQü&àB qigfgvgwïÇÊşÛÜĴż#1··?nç£gĉÙŬ{z†0všT²L1FĜéWVrî)ÏËĊ„ċ™) ÷Ş×ĵ8pĞŸ3òÍ˙ĴΙ"á6‚ÚñĈo‡ïŞêx‚Ş6G†U3z£1=°Ê”é!G)t^Ŭ¸ıġ@ÂĊ4ż™"ÍĠ_1S~¸zîX°S„Ĵ^;8ñŻċîßraÍh)m³ìĵ¤Nöcóñ=2'ïg¸@]“?ÜĴŝ•púó£BĝAĤ:ġ¨:ahŞvÖÂîJxè²^r+֌߆ɆgC-|â‹ÔaÉ'wzœ7ß>Y)n ̳ ܵ@ŭF^+J–àÙ6ħĥ•é÷ş×·ĜöV+<ÉvÔöü;;a—mw·%ÜZ}ıĊ^è.tٛĴµ=ŭNëKıíÛbóòÀÔ_%pŜµžx‘Cıċ,Ğv(ıƒÖâOšÓe׏´7nžeżcğÁ—Ù'ìŽB>sžŬù3ğ=ğ†ĥûÊ͐½xİıɤċ–-~Ĥ½Éν~–5gät­w~àyó6ˆŠ‚Ià,Ğv(=ŝ&ĠN0Ö:‡lŝ×ÛWwgeóoÊ lÍĥ;ìÎÏVÂp‹]jßÙâċ÷0ÉSë67[á&û$T}ôvÍ§ ×Ù£áê½,gYC)Œ—Œ Ŭœö=ĈĥS‚5-¸ĵÉŜ7äÖl˖wçoÉ^)íŻGĦĥ\È^bE.Ş‘ÙVĤÈúġp úJĠcÌ í^"‡²1ägО׸²Ĥì€ĴıyĉäÊĥĵ¤ü`SŝÖ-ŜSÚKzKù6–“KëKg%œZ÷ˆ:°ÏĠ.sòŝĵ—·,v‡2ôŝ\ mt@™äöáùYvŝê5ÙXéäٍ`ĥuXbÉu3Ï)ÜÀtËùöİš"–öĠĥ|âəëÁOşCÉÁmìçŜëÚA&‡ÚßYsšŬhϰ;‡;³Án3Ê<Á4ğ3ğÍ?wâLó³ šGÙ?X“-l²-ô9‡iÁŭŜĦ¤ïßúÜ/Û*{ŝŸŠîïWfş×UÛ ê'[;+uiĴçğJ°żŞ|_\ż<ËZAežj=3óŽĝB.^ ޲–>éŬïžyùéŬáwνîĦkÇ2p߸’ĵ½òîFÁgF]?è$•~NıtiıSTµú÷VäÛġKıa}é“ċN£ñŽzÔİĞuëKkӇ—–_ş,wܐ‹ÓjŬËï/=Ò¸Ŭ‘Uê 4è/ÑÒ.Í[îí+Ĥœĵòú´#wĠwíŝÎ3[ÁŞq<˙yèĝkƒ3ŝĝzÊmî.Í[„ aï„¸İŽt÷Żßm<ĤŞÁ(‡WG[˙M@ 1˜öħ¸iIsċ†7]à’rSîpìßsÍġİfĉŽÍEĠÁı+SÖ×ĉòĝ§ĜóömšĴ$Ŝ›.M1çq9ŜÈÀ}Ííĝ‡żċyYsi“ĥ\µ à8Àp€à8Àp€à8Àp{‡#Dż˜Ġœşï·{Q/á¸i8MATNZrâĵpAıÜ@‰àҒʘr½>P½•kĠñ˘[ ŬXêĵN½P *˘ú…òhŭ¤;’ƒNûıéµ.^ĤĜS{yKÙIŽZ8íc œî–r=•~ˆúáPŒMR¤1œpş1éaúÀċĈœ6ŽÙ’s‘‹ġĦ[ŞëQ$ú…oİÛoü˘^çxËȜDĝàPzìä\˙*vûûĊ*ÂéÈEEáT8Àp€à8Àp€àz¸OK.°ÜÈ,W. ,ËÁr·>Ӛ–ğekN’ ı=%O}CÏӕ–ëŞ,U‹é(uqF WĥċÜUÇı ŞpJü¨ˆ&Uq?Ħ£€z7š ˘µûj^–[Ĝ²p&2›ÈĴJ"ŽßFëİğy²-n.FcŽ‹´(‚;Bˆ8 톤ß×ĝżċžz14cn(œlŒ­tHÊ M ċ‡Ïn…£iюĜŻngü–Sy‡ÒpjHgPQÇÜ !KàŒ·4‘oi5œH?İ*#’À[.h¸JŜĦĜ‹8î-ñT€ç9Xß~= –à8Àp€à8Àp€à¸‰ƒ+7ÊS6\\çÏE„işò .>Ò\xğpFA¤spéˆh”# ‹GéU(11óQ%W)Î*ˆ„Q*ÄÉU„£*Jґċ)OAdá\5а2 *ÉŝÀ9 ˘ŽNż‹Vİ>²ä**ˆË .›)'#œhË‘ö–f„ıŬÒï1gDúLFjidC<ö–ÚuÒÈ[RŻĵċBUE6•VUûŜ<€à8Àp€à8Àp€à÷ÀÂñä˙êm€ž¤ŜġIĝá éÖgPŭ†£ÑD.ê_îi\t`MkŒè@Äsż˜˙×1_:ép<žÏ…‘ €Ò8­B&BŸeráˆpÂÓİuf’šN¤Ž [ö„‹£ÙÚ¨6tMôÔœï5yÉWäPúÀñÎé–&ó çÌ“i’²cNµ?ÎT’sÚà“ß-„îzĈ[F“ Ѩŭœ&ŬÒġ–š“ w(ŭ ½„w•¸ŭ²~ħ’p<Ġ„Sà8Àp€à8Àp€à8Àù÷`äfà=•<ŝ÷Tî#\Ù]R=Wú—ÌîB£€ŸşEpNÌ;_áR³ğ$ҁä׆q}„³ı’İAìÔ-‚;* á’Ü \4u‹ê–ÚhÄW8'7ƒ3İ‹DĜn)|µ\2ğ MOOS…1gs3Ĝ•"oɝné³·DnÜ[âİp€à8Àp€à8Àp€à8À$¸dv#§IEPı£ħĦÎZgq? £ò‚œ÷‚ƒáö§0*MA¤áT2•@çİVtNâ$#U•Ĥ QŜ›V…p'SG²$FŞv(MA”†³é,l#nt £ÒDzĈ–'Î.Q 7"…Q™ ˘ĴÂ&ħ yHaTĤ‚ˆğş½ü˜³p>9£ Òp*­ }#áÜzËÈ}ŠÄ[ŽDa4I ˘‘+¤&IAD½ƒ+~o9ziž 8Àp€à8Àp€à8Àp€àî³<09ˆœ•:é˜ċC˘ÜD™&ŽY>$ÊÍAdSjŞBá–‰rsĊr’(Ĉ'eĉ "„¤çd³|H”›ƒ(ÖE“ߌY>$ÊW9s2Y>$JWEˆĉÇÜèċC˘tQäúL·Ż|HL‚ÈëD‚ ġà½ċXĤjÂSà8Àp€à8Àp€à8Àp€Ü}–FA”‹SьĤ(^´˘+ˆ¨È…ĥûÀ%àĈp:˙P”Ó†Ĝè܋˜\˙RĞ-˘ÀE "UJR˘Ž[”+cÙS&.Rñ(9VĴ²IÁĊ”D€b­:Ñpħ‚ˆÚĵCFĞAbM§ĉ“ŠşZ‰İ&.QQ§?Ĉ½Çp\¸Š/£-štËĊ ˘UÎ×1+ˆ˘9Ì8r)ı%µ³\oI“n鋷Ĵ çéżj> ı·¤>á‘p€à8Àp€à8Àp€óî%”ÏœR*ܽñ›gçc—ĊráĜĜË/>NN÷§ap$˙çıĵ]A(÷ Ž÷ĝŝȘ<8/3rn#˘Zgé-ô´HBGÔâl3~tKáĈ@E"? 6‘‰È†ìı7pÚ4.œÈIJ…Èëĵ3ÂĠáH ‡´v',ñÊĦh›…„š¸!3J130338,;*463::(9;8.J&2F3>@=D>8BCALD.AEG:L8FGE2J~JLI9Z0D2û9PzÏNPMiH/BZCLI“ZQF<7VWT@XŽWYaĵ//KgN[]ZC^?`)uvH`—EdRa}`b_û bdT9}?@f°y]THfĴdfdNgžUrQLh§Mk°Kr›ĥMKbW˙lnk›_>sa˙\{ğ~Gpf˙y{xqrżc|ħG›Yd|·gŠfzhŝ_‡­um˙lħ~Kš›k„ż‚„oŭl…ğy„ Œ„oġWV”‰T£|u†ˆ…x‡²…†”Ôgdsšq‹urŒÂÀ|KŠŒ‰ħ‚]g•Äx•˜zŽżğ{xˆ|ŝ„€˙‘Ž…’¨q˜żˆ…ï’”‘Œƒŭސĵ^ĥxUħı·o—™•Ĵ†›Ì€ĦÊôvu›š‘ž´Ĥ›”‘˙Ċ‘ ˘Ÿ‘œî˜—ûÂ“˘ĉcÀʧ¤Ħ§ĥŽğŠžžü•µ¸Ğ­ŞÁ¤ŸiŠÄ•°Ş̂’ŞŻŞ¤ŝŻħаÎmÎת²ÇĦ·ÓˑĴŞŝ³µ²ç£ĦœÀÖ·ıĥ°ħûĈÂtĦĊÍÉıĦÒ›ğ½şŞżßˆÒÚíħ~¨ÈĈ­Ä֧֜ğÎĦÎÈı¸˙ÀÂżÀÀÊÌÀħĊ½ÄÙĝ°ĞÀżŝê¸ĥĈÈĊĠĊÁɧà¤â¤Ö{ÒÇş­Û½à¸ÊÌÉ×É·Ğà¸ĊĈŝÌÉ£ßĉÍÌ·ÚäÍÌŝÒĠÑÍĠçŬŜ³ïħĠŭÓŭÖĜĠÔ×àĉÖ½Ú×èÚÜÙ××üîÖÌêĜÛîĉ‰ŜàŬîŬĊàŬüÇìÙçéâċáâäçċçäßëßñċĠċċüçéĉèêôĉêúëíêíéûÜġùëï˙ïñîñóññüúóëòġùġ÷óúúĝùüĝû÷ŝ˙ü³YÙU IDATxÚì½”Ġ™èYzŭïy{²Â= :}âĥ€ôñî‘3È~ûYíîêĜm÷ñ‹Öh,ìeW°=>: "ÈÀÊ9~ {”‚3TFŜ $;bċ˜œ‰¸ <1žU€òyÙrT{oŭŻRIŬêVÛêv}§tğï–äŞ[?ßï~·î½…p\:֝AŝŸXb‰NzŻkYú{ÓG˙3Â%q˙I£Üô„%–hċî]'[—ûż‘àô7Ž<ĥ_#Ç `›7ìŸ6oŜ´{óĝĤ›Gî6U7ˆê8TwuÇĉ ¨nğ;uꈨnŜ´M8ĉBÓ1w|‡ĝÙ²M§nPĠ šÜ-Jî„ĉ`pΛ·Iğۄ]ĝÙĥÍ\ŬfĤÊĤ"çŞĞù‡ ê„ŝÌĈ·)— ½f£ş£™Ş)/pw(…+ż’ğS̕ĠŬjîâ­ğÍTwq9ì-' cM Ĵo¤‘Ĝŭ'½˙ı"_|ñS@ĜMÛ&Fĥlžı{bâ–Ŭ£›vLŒlĠ‘Ŭ²ş¨;ôêΉ‰ àğÔ\£şybŞÛ&”VŬ<11Ôq5¨àğ£bŽĝ˙ŒèUmî6U•E̙c×˙Cş³šĜ&ċJŸmšK0UËĠ–ˆT@ Šo(\éÖÁ;ħC,ksġxÛĥéĠîê}êmż[şu`Ç.j0ù♓Fp€áU­áĠc'ï!ŭÌÏ/)rñâûĊĞĥĴÙĥ~ĊÈĉġ+6l^żjƒ ‚KPĠ-Ş*ĵ<ÔqAê膉ġ£PĠ:ħ~­”;*İë׏NuBPÇFT~`î¸N]ĞɝX/Ş ‘6)î“^/~LdLÉĠüòú ƒŞ˙wġiNe­áŞÔkÖÁ¨¤Žkr ċ5Ê[W¸Zu|³¨Â³Mĵ1&ĈÀ½•nĴ¤ĠĞÂmîñf N€ƒGvz´˜\ĝüôs­€³żŽ¤~äOt€]”˙ĦċÛĈVŒ€ÏĤ‰ħċ˘şvd\ŻNŒ­gµÂ ‚ĞZ>SWéĠ˘şVPÇĈV€]ĝQÔ1˜;²^QG:::ĥrB£WĠġ@[+ĉ@u Ş£P=zü{êƒ׌î>ğm÷g$g÷Mœ}blZ²ïl½mÛѳg_Ül’5ú⋣÷™âİŒ)§ħV>+ñD…ó^/]†¨ŽN(êZó"ѐZ^â#Ş ÊzlĜʨàĈĴ’Š~ƒpŸà0wùñNÚ&Ş›tŞ|ŸAmĦì˘°‹u€I$ŭ‰°‹Òq  ĥ~tĠ–ħµŻċ›á™­].İ7 Jı+G6+*ĵ ¨Žu\È]+^äZÓ*½* ħĝu•RšrэŽŒ‚˙İ˘*½ĵ+5:ĥvAĠŞckÇĈN–—‚?'ùO;úëüżï]Ï?<Ê?ĵB„‚ß·Ö Ĵġ0ëèÚħ}Ż/­ĞtñġWٍcGù›à??k¤żGŸYzöŭÏ<ż£= ù$Ġ]ĦQ W%İ2cÚÊkBS^ZU.MXü2_rÑonĤ.NI½Ï>QGŒ.×vQ ĜYô:û°³`ğXĜIy˙Ĵ\ƒM7vĠĝ­ÔŻYalċòñ5+eUÌ]ı ¨#ë×':ĦŞôꈤ_îŝš°pşŞë¸rDÊıcêÁàêJp'uêA•–LÂÖ ·|ÖĴ9Vé‰}k^ĴŭöùÑĝ[à|vµ vtßџl~Š}ߚµ= Ò'ö=şcâİ£û6ŻÙvôĊ'6? ³vïy~bì}k·Gƒ_^³ĉW7Ŭ´tÓÒ50`|blôÑ£?ÙħüÄk÷íÚtáÂĤ}ğVŒ=qôèî5k>ñÔfñ4ÖêÎ[UFupEJy­%²jLW|ByÉĊ7&FŠ~|LwŸduB¸O˵êú5BxŸ—‹·]Àu\[ƒ]ÔöF Ç4€͵]Ż;ıq˙‹ğv•êÜċAĈÖ,Ŭ2ĥFRWuĊĝšiŞ#˘*ԕfꅍşFüŒ™İkŒê˜NĴ?kOVî˙äî/Vîż°é ĜFîû°ú[í•GżĝŝNŝ™[—Ŝwaßŭğöì'GWm<şñÇß_ù/Żlüñ[ĝŸŜşôhíÖâĉÑ_=qëżüd#ġ÷+à/Ÿ}˙&wċZĜû6şiGéÑûï_yáĜĈĝò³ïoşÈŜôúû˟:{ßŭŸ|wíŸ] ž†ùe4PW4PÁg\- mñ­7UĊ;ħFDuıD߸A÷x‹xë _›àm‡ıÀ“LĴPğ8`ìÚ¸kÙş왍ûwmÜ}.µÁĈ #^ı\ްĥĴYı|›„›pf+—o–j( ¨m: Œ|™à6Ħ/‘ DdU‹Ûz• ġzµ_c"[ÂçEŝßżżtĊħÊMżúû]EŜúÔÛ[ÀFĝ‡oI[s´şñ‹Ż,?{réò-›F~7­] ҕ°šúĠßß˙ß6íâŜuò˛`kÏŝ.rÛĤ ˙²qGùìOFW^¸ĝ▕giè"Ïĉ—ž½°ñ/÷ݍ]şB>#͢•U"ŬE*E°^‡Œĥĵ&t)î*è×+÷ Ŝ:(QĠmŞşAʕšc2`gĦL>W(=&‚#ıH¸Ï/êğ¸£À×çRllDip Îx•F_/U´˘çĠj ^P•Ü1%6F•Jİ 5¸V‚V‡œ s@{V£şĈ lĉëT}ûkĊ˜ĥí%´ŻaĴzò• c/VnzôÂ>°ìèZ!§+Ĉ^ĴíßżR@Îèż<żé)ÑÚ` =Ê/=Z~êí›àş˙°97öêÙµbƒ‹żġâMżşuôÑc~²ĉcïŸ\£ }ëòê3ËGċóÏlĵğ^Uכİ+À—äÖ¨yyMԕĉŞ MûkTĵORñ‹7F͝0QWŽÈí/ìŜŽ’ƒġĠĈ³Ÿ×öıĜëğv= Pú\8j?ÄP ´Á`‡„1`ùÒŒËÍG9jSG% H ”šPr׎ê‚'mü¨Ĉa+ġñ£6œ”7çĜ·²OŒžĴ,}˙`cżúD@kTŜî;ZÙ²j×X5ŭûQXƒŭۋ[@Šß7ìÑğ|ôĤ}Ğ6}W ­<żcÛSO@ÀŝŭM˙rëÎç·<|tĠ‹;7]ñ ĜŻ.€†Ë†QX}8İi߯4Qċ6ŝ˜ĥĵ֚”—Ĥ4ċÂĠ ³A,z}ü¸VĊmLjÁK z*Üvħı;²Ajƒ]ĵhìâ@vû\ìâğÎżëƒÏġ€I~ġs0Ĝg[µIìXµsŭè-Š:ş|§‘2*çîUx*B ÔÍZUê•UxĄ—#王ŞÔw6&İ Bw˜¤Š?J¨ŽNLh;Ž êĜèO^ıéİWoúÉ+KÇî>ûúMĵ~ëĜĥ“Żo9+m£żzŭĜŠñG_}ŭĜ-#'÷/_˙èÉ×A}ËħWmZġĞWŸ_ħï•G_ùó[ÖßÙrì3›¸ï§`×ò}à—Ï;z+ĝ½×7Ŝrìġ×é•ŭK ÛèÑW_ßwËÈÙ]Ğ´gĤžĠzQ•z¸„Ŝ-UѨ›Í HV”&Ta—–”н1Pz·Ä[ï"PŜ1x'7mîóNI…]"`L$Àôàì×4€iż(şÈmBGî6Ħ3wÓNE…]½vJŭ÷bGħ›Ş şE8x|“Ĝkĵüü9:Uĝl›M²şYîËv5êĝfmŭ¸ÔĠ-°[— Uı|–l^ħjóŞU›G—/hZ>ŝN,ŸéŞċ#+–tùÈÈX |OHAÖĝ"<~bbdùòċR/ŭè*=³V,Y>1² ĉ€dŝcËWm†żÔ À.Ÿ™|Eu‹zEêEŽëÖŞ†ò’JT,ÜÍR¤êráGsÛdu‡˘‚û<"÷ßïTU#¸H-&"`pöĦ5¨€}ĦùžĜÎmÛ6íÜĥány`ÇĥM³{Û¸VŬ Ô‚şa§ŞŜ­WïƒğĤı[Tu ĝÇĥˆğu|§ĝğÂg§ĝÑŞÒî–›áß-uǎÍzU8X  QvÈ*|Ĥ(ä‚ÏéÑ£ŝݤp ôŭşŸ’~NÎU~y›öœ7kOE:g£Ş^Ş*Wf(My wĵO&ênéNhsw(ŞxcİTÀ>7Ĥ‚³_G’Ĝu'OžüéĞy>ìŜħíîŬ;ĥÜ·{ĝGv‚Ï–M@L;ÓŬ:u‡Ĵ>P§‚?òÁw‹Ş6wËnÁÊÀ/ßŭ€NŬ˘ÉŬ)ĵ¨`Wĝì–>;vìĜ­Wċ#änWw„¤6“ƒ żĵğŝ’NT{Vğġç Żj‡R[¤‹4”H½Ş->µĵLŠ^PĊĵİ[n,üˆızġnġĥ *„x>‹Ôbòê13pžÑ~ ×!ׁ¨óä1œ†›ÀÙíĵûvß}ßîàÏNqw÷Ŭ`÷nzŸ˘nѨwCġx°üéğê÷wïŜ)Ğğ›İÒ¤înîÛNáĴvŠì”NT<3á$ċ‹Ô]o#uÚċ%™ä²O,BùÖÉŞŝN˜ŬĜ´·°s -&ÇʁSgĞ“›vB٭ܤšÏuŞöˆŬ3T-™ ½f…ğsê}†Ü"`3ë?Ùo"·~ÍK´ò]ûg$‚88K,™3qX€Ybf‰˜%–X€Yr5Kô8ŽT:™ ç'Ĥóc1‡c8[÷u<ÁúnÓ/„ûŽ`AĜÜÖÍXè€a0Í% !JËQ.™ċ¸( XK˘ÁÑ(Z sMÀŻûÑ À-Èq Ĝ!3>{&iŽüj‹rÜ0Jsİ4ŒAÑ<ÇâÖ]Y €Ħ0M˘€_"é6FvG¨ğ 'ŭdMÚ}œ;™ôêʋ?ÉĦDÒĈCñ 8Ĉ›Ĉc.ĈÁaDÒ˄úFÀÜ4HQ˜'™ôp$ĴÛ²`]dDÌI$ú€Aû Ëì§|\"1`r˜xˆä8O‚á‚ñŒ]ñ„ƒ ĊŒ.²Ò%fO$ìœ?žħîÊBv‘"`†™–Ä0§X/†…Í‹aXĊ1œc0Œ•CÁ°(—ÂX°~ ^5ˆĴÛ²à+p>sÀü8çÇS(7àƒ5•ŝ À— B–°Ċi8ÀĊH€ Ó–Ż ĜÑ\/LĝA?‰Z·eA&ĥżA °q:ġĠHŒÌ„´êQg-ĜI—u:ġ|Žr:=uC0ó@KD‘ı 4ş„}C€ Ĝe8ż› èG; ÎoŬ•… Ĝô„Š)ŸUv–´˜CÓ£2‡ĥ²bŭŽaŞî ¸ĝÉé˙9á V˜UƒYb‰˜%`–X€YbIûc,ħdDŒ½ZRÂZ²PEŒcÁ9ÛBĦ†[ŞZ­–ú–,Aŭ!Yü¸X2’ğJU‹Ù„2™ ÒXŭ Cc dÇL/'•İÁLÜşĊW°|E–Ĵ X*Ê_ ‰I€9>S.>QÂ>.e >iz9%F§†yÒşĊW0ñ5á’*`‰0ÏçÛR)ĠZ, f!&„XÇ£mÄŸ áa¨Ĉ *³ އb°(÷#ñÜ€ĊñH ĊajÉU [[Rë"y>,’Œĉü ñ Pñĝ#O‘YKòݲJ„òLĥ ċùœœ‚,Í31>)dĊ<[j­t‘£X"pU,eJOžÍòpĝOaÖÍj€a 8N&İw‘ƒTŽ˘¨\̛#r`WÀèÂ>%í;²(DÊ.jhwĞÇÀ„j °X`Áx8Êܳa<,§Iy#Ħğä³ñ(l|•£‘2,RÊME6ŒW‰0O…Ò|ŒàáxşÙW °<Gĉ\ä •ûğ {nÀ?kİŒo žsĝ½ÑáD.8÷eÀǀ?ÑÓ×ߍ v§ŽùœŜÔL\¤°lħš[8[5j+²,@HlŒÁŠĞ €zĴ˜XÁ6ÁÇdfŬìĞX8êKĠıÈA*žÌùbq/àg uĜÀP—°ì `Ž Ĝ™=çĀseħL\dŒË€3‹o˜6ˆPZN5€%…fĵ°p1S  >fŬìÎiƒ‰.’rÛğ%À(° jÏB¨˘8›v{ż0ğŬ&ÖíÎ ,œk09ФĞ‘/‰t•8à \x9˜j+Ċ J SÀ‚r?X˜eÙHqài4§ À%£°PMàŽĜ?Ĉ²0:$x(+V`(ıq6 Yù0KF &J½‹ôy}¸=)K>o@ ġz}QP…€FĦƒñŝ°û!`Ál뀅eÀZ" Äp2Ä䂋´¤3SÄà"É\Žˆ“D&ž!@ 62#ı\ìdÈ\&Ï$ĜOÂl<s3ñ4°SıÜRé\*=%l fÑWİFá“ -1͎nü۝)óìtµ‚úÁzGĞè"jUAÒ,Ç}À‰"e“ŒRÚÄXN™+ɎÎbvaE8Ĉ¤ Ştnžׁ.²Ô–ß[w‘UP…Ĥ9Ž„€UM~SĴ\o/¤ÍŒ)#×Á€™”{^ĴXŸAÍWÀRÑÚĠ˜ ĠÓCëÛnŬ Ë#`Än,Ħ7Š€%1,›è!€ż0C½îa/>0<ÏKÌÑ@ek8\GlĜétk+L>òĈĦĠ7|ċĞY-`™A4MħÁŒ°ì`tf´€‰Fż3­,E;C"¨2˘%ÀKŜ;ĝÖ{ŠĵŻŒqàx– zèy “ı:BK€Ħ;PcVżqdġWüüʒ´ XÚC|ò‡?ŝĝo=)°ŒdL)Ĉ4â‚ñe7İŒá;C˘Dµ,K/½êÀİ7ı\Ԗ VàÊŜ\ĜÇÎgÀšH€ħÙ˘°íG~ız]ŞÀqéżŝSZ,ĝäË?||ĉ3ш X\1†UÀâ~É u&`jğ+…ƒŭçP3ËÚ,çŭL>ìĥ›9`Mi[ŭĈÖëBŒ =D˙á ˆÍK/ğ(0fP1geÀ˜Á\Y6fĤ,_·ċ4û%V²”R9,•o˘ ŒÂDÀ¨ĞżÏl€q9°öí[ıġЉċġQ$íŝx½3/=ŭôÛ^°aĠ¨ĉ’g|S†QuĤĦQ Yh•HÈ?‡€E°*ĝgXḨ̂ÍË˙„Ûç3`ċÚĠ‘²Ilñê~ħ­{'żBs˜ÛĜ™3/ŭìéÇÏxt€IF=`²QX”ák(¸_'…ñe§“Ĥz Ĵ˘Q:‹ó|̉ĠÀhÖIKµÎSNjŻñƒµ6FÀÖĦ_éCŬFë"³hċ<üĈŭÛ˙g`>VıJ­‘ŞÜKĞ€1ËVoŬúĜêŻ& ~ÔíĤÀO8½Ÿ=ŝĝÓżC*XŜ“RŒ90V4>ŭĝÓ/KFCS~àóÊ.Ŝçâ<Ĝ¤ĴÚE8ü•#ĝT°ä\(é ¨°AAl`9W‚tÄu€Uó´—ÖıÈĴŻò÷žŻŭñÙŻ˙Í?Y€Í0.ŻéhÍÂV•àü~Ôëöä•F~ŭĝ§Jg‚QM#_6†"j#G߆ĈÇτ†F~ ó` ÈßĞ6$–òğC°ZÛ2ŝŝŝ˜‹…n:Ì[)üĊçŭġżùŭï,ÀfÇjùÔWW%ÁaAÔn÷ıŬ `Œ/î?ûXŒñ… FX Ĉ„l”ĞĦ”Ÿ+Œ˘²À¨ 1ĴÚ~À¸œĠĥÁÊĠÚ@²äÍé]¤·Â³qÛ×˙ĉüï˙qVJ Í`U-ÛĞëĤ`ŝçw;ŭC½nµ'ßë ˙í÷<˙éŻÜµ'ßg0ĤDc]À˜Ö†pY,T})‹ÇR)Eµ€ċ‚İX°¨Œ÷ĵs—‹kùƒ‡ÄÄµ5XöÇ_ßvÇŻż@Ëħ\nê¨ĉP(˜ÒS}”Hĥ °BĤ™ö£v·kïÇ5Š2Á`0ŭĠ×hJ}T”Ĉ´jQŠ‘Ô–˙%–âÙëâkĦǧräHŽÏ„ˆLîó„EBÀ‚ÇáP˙+VĠv´f<ĝÇż¸×˙ú›Â:aSw°ÊW <ˆĵ@hEEĞhwâÎ2_rf `„³Ü–Ĵš2`¸ô`1ëô ùÌv3žŻ`O…˜´”:•ŒÚ‡ŬyhÌÖuSTħjiXŜwB1éÁÈAğZi UÛU5ĴÂé+Î˙öÏîĝÍß-À¤şŠQE0C1Š]Ĉ²g0;ö]°…ÉĈcmLû¨ˆèŠĤá2k ¨Ì£ĴŞèŭZ8D°`lôcÚ8šB4ûÁ¨ĦáVO•˘ç °S¸Jİ,múìÏŝÍ˙ŭïóżžï€U…Ċ*r|0ÀÈĞW€ŞŒ.ÒÉÇq8DR˜›ÀŞmq‘´ĥ †w ĝQ;äqökúÁòhżG^£šġ~Íï‘j0£¸àûšß-tS (Ġ;íQ§Œúk8\'ĉ˜ßŭî˙ñ7żùğùXMxôÊñ EQ|ı$?‹…Ŭ’”Ÿ'˘CU°š ÏQĥÔ`YFÛ#şì˜ĜÑEh+CqJġ’Jl@(Ħ#I2Ğ3J£)j!Qí¨O˘)`Ŭv(ŭ@Ĥ‹ôR8Î3~ŸX·?…ñ~2ċІI"S5òƒ.·Û0 8 &ƒƒŝi8¤:evÏ=ġ€Ŭ{Ço-ÀfÇîİZU?Y‹BH†D@š;`}…aûÂkƒUı|ËȀ}ûÍ7ß<|Ĝ½·½VxíÙÎŒ 3 çÀÄPq§6*€Ŭeƒ~çŠFт$yÂċrċJ)ZNŒ¸Êi³ó³ĴîDÀŭX2Òï–{ëĈ79nÏígu€={” í÷'ƒŭ>M ömeĠq.ċĠ†#ÀE’³L™ôÑY.ëïï÷2`§ö€íyËà"ıou²‹dQp h^Xż­+ŠQ¤ÁEVP{ !ğü|³xKD/]d¸›šmŒíDÀXżŬÍÈm0µ²ÒöñŽnƒċQğát€Ħñ †l]Y&‹ Ó_‡Ë>"¨›ôÑiü ÚÈö5Ž{펺FŝÁ÷œêìF~PßÈ€•‰ž?Ví" |âwı=Nĥŭ€É“>::Šä~~¨À(´%TÀÄ íñó#Š€UĞĝĈÎŒ£€0 5bÈ2³LžôÑр½ùâ2½ˆ-ĤváF ¸Lb‹v:`RyëŭU>ƒÊ€}Wˆ˙\Hw^UÀĉ²'ŸëÈn `ŻóÀO—ê"aÇĜ݁B†:L#ı˘§#FS\1À”I˜21ƒnÎÏoğíÉ'ï}’²}¤rsŽßĝÇŬ~[ĠŸì@Àʆk$FQÚ}mĈe °dı3&fPh@™!Ôfç_ƒrŜ!ġĉĵġĉ[÷ĉ›ïƒ+4ò;äÒÚkÔf96šŒÎ?Àf2+ĴnÒG!Ù)’Ÿñx0ĥcĦhÀa2ŠÏ?ÀlèlĴ­×àˆÖĉ€9˜§Zt:JÄ@vÀtgg˜2é£p%G™Ï‚(šž—Lġ“KàiÍ8×à— ÓŝÇ sD˜ÙtÜÔ8˨ È,³ġR6,€ò.{ħı¨™×`fo÷˜½dùĤى°İÙÙà[ ìt½-7ı §ÙEšÜüż2ˆ6€OX–5ħ'LxÒÍûħ^XĴ .²Ŭòš˙,.µò­v,]o#ŭ&żìĴ˜|Ûiö£ó°áz× IDAT€2Œ63%`ċR‘]5†ġSNXŞU 0 0. \TrJÀĤhĠ÷Fğâ>íóAÀ††ÑŠ˜˜X.ßÀ°Îó‘0 ‡AċU ³V f&–s£³ĴĊ†µŻ£Ġl!Vpġ÷c³Œu ·³3,èùÄĴ]d;Y€-(I›˜XGG‘``Ĥ€Éù``s‘$Ĝ°_·Fp ÂYĊŞ``Zñûdñ6ĴáÒ$“ •ċ]v–,y‘”˜˜SžÚĉš&=è.é=fÁéƒ+ {HĝŒ›u!q 0 °ÖùâpHŽŻV*•Zµ$ħ³ġ²e›§ 't‡‘²rĥ€%s!ĥëšÊ70ÓoEĉż½NĝcL1o½ŭ~“#cNGŭ‘1§É‘dq~˔€é–  K|qÚĜÜ ×ıî‘5“‡ž×L~ĝıüÛÂ6Ĥ§>Ş·ëLïüP—6XÎÁô€ŜOóó[‚ÓìĤhà"1ƒĞë0 `L²C]äu?z·™´ Ĝ§~NXJ’ÓS}ú‡Â&}°Îò‡›ËÂŝċ‡Î)éÍŝ%y˙ZĴ(F‘Ĉ0û€¸Ht€s;#ĥJqÈÍ]€ñŸ~ ²JN?‡é·??ġLĊ}9ŭô9­ċÎÏ 7wÒËjzH )/§Ÿ ék0óäqó ĴŬ€ĠûGüÈ`ÓSF˙½a½á]u^òZİÁê†L KDeÀŒŝ¤{>Ş÷†°zżıGò:/yXï1ĊôšŒË§ĤÑÜ<lɢĊ‹/Zl ĜŜE@×v-:¤Ĝµŝñ ĊžşŬàAúŜ)Ġ?~.ĝÄÏ 74úGÉêŭ§×0`sù¨ˆş“R ¸5–Îàm*òû¤Ò„şß°›‘½ïêF–˜ĥY´dÉ"䐰ÓKے#‹¤(òÎéD‘oxMG‘W°nqİÎŬá&€E‘ó{‡EŬÓî7ìö½ff€MÂZjr½°‹‘Ċ>d΢È÷ Q¤”î9g6'€vŠèBüĜŜŸ^˜p œw ‚­PrĜ³*`—žIt!XéÂsv‡³àwàŭÇÑpßĴ vÚ°wOĵ ³Mê]ä:°Ÿ^†4ˆ"ż=Ŭ(òr}y×%+Šœ-`Ùû x`ġ%lÄA€#Ì!ÜÑĉ„-èĉ<Ŭ*` î7XƒġÍċEş†À·ĵ~°_Ĝ‘‹d]ƒFŝŜ%ĈL˘LSƒµ'ŠĴó†V9#qjö‰éıHÌ×§–Ëìž'Ĉù}}ZÀl>°^ŸÍċµ S’YĜŻìĉu§O,ĥ™G‘{oFÀNÜ|âf=`íˆ"Ï5‹"÷, (’š`UÌİĠp§OĴSu9SìÎk_àMhz(ˆÔ•lƒM X})˙éúg‹{Ó(ò²6ŠÔġ²^RŸE^QäìGSPI†çÙdFÖÉ$dz)s¨ĈM”inIìŞ…$.[à:0ŝËğ>RS!â;(¤â~M ³Aygó(²iŸŞ5˘µÑ¤ƒ‘"!iRd<ñW#p€ĉüŒ•h‚Ay°"ŝ‚Ûú#ĦßçÏw`&ŝ¤‡Íü#´·#ŠÊ_ÖèßFÇĊÀÁŝȔ€íµ-ĉqL^(òró(rÏŒ"gXuÊĠˆÓ#ğÈ!'ŽFI>F#.Ġl—ŻĊ’Ġ(´¤Á~ÜÎEnŽwĠÖ큝­\a¸‡Í\ž“Ŝ—ϳ R¸q,H4³Š ÊığĜBŻĞ ~YúÜ7v3œÁñî‰EĥÉYF‘ß6"/7Œ"/·ô,òÒ=VYNǎt Šş=İîĦîÑm Â1ù~|9İŻßéÈÙCŬ`Kz†ş#*`éžĦžp² „l]Dĵk¨›ôÚP$q°IDœöx3‚1"?TÒ˘È;›G‘çĴ(²€%ábœƒ‘„ĈtK€ÍĴ˘€4ĞÈI2òi"<ċĴ˘~8ĈµÏ%Í*Ò&ŒW=­ÑÚQäžk=ŠĵRğğ=ĴÓÑe˜Ućû‚ ;èèÒ†8zzÀlŽ.·×Gâ›Ö%†‘ÚfŝL£HŬȜQ¤Ñ?šF‘Ÿ˘ÈKâŝ=ÖĵÈ9Lr °\œ‰çÜHDÌŬ-×`…8%Ô`i–ûéîa.AÂI ˰C‹D°öví5‹"?ÔĤ͢È;ëĉwXQäĵŒèöa°†Ú•YEéa§ÛşÈÖTf%z|}~.уĤC½ÖëëĈYEĦ°olä ñ¤m‰yù‘!ŠütZQä‡-F‘çĤŒ"/YQä\–Éq™tĤı\†Isò–Î Yâ–f2é4›f8°ĠtƒvZÒ.—á”}`pe€Ó{m“'Ŝm_yyŠ(Rë/MwDĞEÖG‘5–+3³l;Zo^ċ„ɳÈ[‹"éTQä]×`™•_ŝk`2Íĉ°NĴSŸEÖġ².€­ñ˜,‘ä,–Uy/î,ÀŒ³ìTyĜl˘ÈË £ÈÏ4Q䖢ÈË $ŠLfeIefñ¨ˆĊùnœwÀÂIPƒĦ ´:Ï{³Ŝ?N+Šĵs:Qä´½á‹"[ĴáÒ9XXBGŒF’óÍE^ġ(R†—\ÙR V1—j5Ÿ óŽŞXĊG£ÜĵĴċ(²OĠE~Ö Š4_kîÒŒ"Ûâ"“Ñ8p‘ŝ„_Ì5PÖŻ Ö`}D|.ÄûrSyŝĝ‡~xî[Âôv5= ¤ïĠ˘ŭCcúÂİzû/˜y°ŝğ‚ÑäH 0ĝ+ *İñÉ*Í#K̰Ȝö÷Mċ'?25lpxûŽżùá7ˆé˜ŝ·Ô}%=`´É!÷ß< `²8g2’‹,ͅLċ"[œin~Ŝ<ŠĵÜôY¤òäñp´˘HĝÛד5Ú`íĴn•ÈżËŠ"Ûo&6›(òòµEZ€MX}yçÔQä%ÍZs nDë5 ĜŜÉÉӓ@NÔvHÌ:dé8ĝôä^`ÂŻLŞÇ?˙Qŭ[ Ċg‘wÍèYä=ç,Àĉ#`‹Ä5ZİLÊ2.c· Y|3ÈĜnxÈġˆ(“2`͟E*+ê˜X~ Î?.€g‘m ­Y&Ĵêòş—#=}ÀœÒT"tó7{Ñv_Şd•^™íP÷›ĥĜ˜°uŸ0q‘G`ŽM*&vzħh?ab·9r¤>ŠüLE^2>‹ĵë`ĴÑjE‘Éz2l˘ĈğÊ,q^˜O£|9‘¨²¸ĞN°nGÄÊѕJÂXVáĠWñxŠKäâÀBpV3ĞŞ9§LuP…xçÒ8gÁadŻoƒíEtï‘ÑvZ­½ôm-D} ƒÁ~È<Š”=ŬŒ£È{Ĵ(R–t(œä{ŭ‘°“ï;1B̉„h{Èím°hOŽfì6ŽÉ÷¸ Ç1N7ÖKö£Á°E£ŬAğW,ÖflD˘Ğ?ö{"^dÎ*êëé·µĜĦYÖ(ŠÔ8·§ÁZs o^dK€5Z: šà8~€Sv“ŭxMÌQ*9…·0-–#—2é#!Î*²ġ¤HF2 pëf1nuVÑÓëò".8ĈµÁ2f€ÙN4lÑ,ğŬà§Œ"+–ëŭ5Efsaù ÖĤÀŬ°·k0²ÛĠmœUÄGN,ĠêÑÍ*rıÜ `Ŭ.WÀ+V\âŒ#`ëôġ”0d65XŭüŽ™E‘÷XQ¤ÖEÂuz `À?’a0^¤eÀäYEdŻéÍzɀÙĴ˘ĵ7)Ì*ŠĦ°ĜÙ†9Ĉz“ĉ€-kĉ"MAÚ>MÀL˘È{Ĵ(rĥ€•Pp‘'{*ÑŬ×Sĉùa!‡ñó)§“ĉ½¸½èžĵyğquƒétV×Ñx-Žh­[ħürŬJĉ °è ß?˜œġš†‡ŬĴJeFŭ` +BÁ2pk,†c àŻĉxeż1`§—!ë›>LĵŜAóUt.7\]ÇàùKwcÑZ?2G;˘UçĈ­9Gż7?kÀíëÉïöˆP¸{¸ · `šI‚H#Z§r‘7#Âĉ‹tëä·EŜUïĊ(ò=£ïûö4˘È{p ċòtÚ2ĉêġĉÉ^[4‚ cY!"¤×ċ‚¤Ça^/£ Şİ>$³ġ$Y/8 †Ĥĵ48, 7#`Ŭġ€]ù(ryİġŸ-7}d˜NÌoÏ 9òCŬ4“?ˆuTè.”è!z½™°ĦŝŝŒk@ ëθìùa[Žîd3½>/Òc˚鎄hZ|˘.Šĵ܆(ò²â%/ĠhĠD‘—ŒhŭìmjE‘sSƒáħ¤ĈĠ"9yL>GÄÚIĥ˜SU4ëvy‘@ƒWÉÈu—ÁEĥEŜU7żCŠ"[|yϏ" ’t`‘ž½nVQÂÖKʀEğC:ÀBĦˆX(D¨³ŠĤ ĜF‘—ëŜYE.Ô­ÁxX’@;–éɨ”ğñ‰Ô4+R4MċÍp`+BĦ2,E…MÊ*dòU tĥ(ĉ‚}&+~ER‹ı˙Ĥ •a”TîbİôÁ¸R.ŭ@H/Öo™Û/^¨·_¸hräû&żyñ}u˙}%}ż4ż%Ż< Îѳ[: 'àÒy.ì;ĵ¸E Üsš/\šw³Wö6]@@ĴVµd!J ›1`İP8Á÷ĝ£!ié°#/˘PŜĊx7ġÜê4\¤% QSÖM¸t@‘(ꖐv{ÊÂÓ"ÎÁğsSNżĞ,YˆBL XBM–'wċ)Ĥ XÖgÉB×,\$\: Gżt@HXl`ڀġ‡]–,q¨™ÍÒEyé€XŠîëĠ.ĥ´“pŜҔ €ġaL 4•`8¨ÓCá€%(hViƒÛû°ğD@ezšĞ苀%ù ßïĊ €%ÍJ²froɒ‰1ejì4Àx2—ˆĠx²FJħIÎf҇A|ZÀ2“[÷NaŬv=`~ŠĦ>L˜Ñ(ÀRİLgH<Ş‘,¸áÏ]háñ(zú†£×`Ĉ‡ŬT°2À¨l†ÒĈĴ>òËÇVġOċ/ *`?F}òÉÇ/°‚ ˜dÌ‚ ˜l ˘Ĵ0Ĥ֍İċOáï9xX‘·´€ċ‚ep|•s'|1-`µ² `>Ö°:cÊÔĜ‘€fżŒ€2&Ÿİöƒ#ol½á› Ç}sÉ7Y°¸ï“/ŝñ™3cQ°¸•Œ0ܛ—Œa`2ħ+J¨µH ‡5Ĝš")j wĤ†ħ”'ĤĴàĉês¸sġ€Ġ!`ÎáÜ|Ĵó"ı LlġŬ@Š˙Á—ädÀòdċK€ÍK/ŭ­‘c} ĊHˀcY4ŝB2v<` 4> À(żxgÂ~ÔĠ§ĴÏ[ÌéġÀr!=˘ `ƒF#lÈëċ’’Œk0.Ucfë[żÊˆ1Š‹¤‡?ù¤ĉé§ßöP2`Œ‹UŒY0ÉxĉgOżíÍLX¸ŝ1WMû`"'Lfñò|ڙžCÀbŝŞP<Ïh]$…U¤É€‰@ż°AÌ „œ?lğ(‘˙üż Ò/6@côżü_‚üݘhŒ­;!È˘k°"§¸È?½aûcGĥŜ°lQŽ# M#Ÿv yégO?~ĈĞ6ĴUÀhôé£KâüMŽ(fĝn´KœJPË%HxDš#¤Ċ?‹ _$¸AžœQOrCÀrB½˘ÓG™H˜¨%t5Zù£pzçϓv-`C鐯ÀóÑS²^°x&àĤ`˙UğXƒĊ3A`Œŝo˙Ÿ `1Á“&ş/^ĝ€rjìŻo8òĜÖ­[×­cI3Ĥ̕[@éé_ Ğ€ İF°Aúm@4şġ€eŭ|" ɎĦ.>‹a…!q™âjO,ˆ…ÉêïÀbR5–ò`“|2Ü>Àh··ÀĊ `y2ċfu.2‹VŝgÁ7Îßû7˙4 ̙L`Ŝ’°0óğ`˘ÑXéy˜Ï¸tàW˜N FÑj#?rÖÇ@ŸÍxè`L"Qè ü„ÔF~$"ġĝKDPmäG’ño½‹dúBàN–]<âàêyLlüT%'‡Q•G„`NNŻÒÁÚ H‚:ĜĈ,lwı܌°B$0Dë\dÖWùñן­œżÏ~g,an=`N,Š ċ €A£+§ £.Ş“ˤàko•¸´ĵtI$À×òÉgûˆ‚Ï9œËVÙBÓ6Xĥ 6ò#7Ĵá›é˘°“#=/CÂÎĵìŭ[0ғ’Œ?PK‰Ĉ—£é–À*.Ŝáv{ÀT`Ÿóğ`ĵ°Zû˘ö~OAï"DĠGë\dÖ[İŭĝëOŜûgżûŭït€ C€F`h8ì2Ô`˘‘6ĉ ‡=C\ƒB¸t@L\: 0XPïHd(¤9,B¤úbv<ŠsLġcċĈ€Kœĥ›"ò•o²i40lïwyíQ£59ü½—Ïĵü=×úY@íh%‡ƒzcJ5ËF0à—„€\„ÀR!piġ€…ç0.,Fr`vŸ/ásÑaŒŻŝüĥ;^ûïż˙G`vÄ?7ĉÔd m0ÉhÌñ f:Ħ Öpé°t€“/ K€Ek‘„<ŭV˜xM0ž²£è.6yT”ÑĈQ,ïë³ööġĝԞü\Ô9äŒĵüW ×*öäçbÀÎü•7ˆħJOjûZ%À ftg >áL¸ĝĵәâƒ"HUïĉƒıJȉ†h7Ĝ‡›PUGĝ¤3醳ˆKîöF‘Œ&Š,ċóùb)_(r­‹Ìx* ŭġg_òüżŝFX?ĉwÄjzÀÏ Í)€‰Q¤Ó-£˙ċ˙DÌíqҝEN錖v £ç€ ûMèĴ %=CÌ x\¨ŝY¤Ô8èñûY°„ïËĈ”ĉHhÄòuŬµ t‘Ò0²Ä¤­È ŠÚĉ(rz­Ouŝż~ŭÉßü0öŸx˘ÂIFDÀìC•˘xEÀìC´Ĉè;ZE#İ;ÎEÒúN `CĠĈiùħ EŬN°¨ĵ5éù1 °hŻÁ¨L6 ù|¤ĵƒbrnœĦv˜ùÂsĜ…r­R·Š°Ò³öÛߟ˙?żŝk=`½½qÁÇDICÀ†²&=ùƒY“žüÁL‡÷ä—Po‘wDy×:τ IDATqé€ŝl5$­Ç@szŠĵ=âó”0g œ÷+Mħ|“ XŜŬë£é¨ĐvZ=œ”Ë!=à `"`ô§ƒ¨MÓò‘Áhìh­äٖ{TòĠ9ì}N\oO½‹üùߝ˙×ŭÍßj°x­'ߘ<‹Ĵ3ĤL˙°ğ́È9³~°tAÛóvġö GĦ>ŻĤ£•î İ^Ò–\¤C‡Â£"PíT×Bö¨(œTF}Ĉp“Ñ *`Žpò—@´=ùEâZMáÏò< +ëÄÌzòói-`lÄeìw…YŬpf€“]dWXoÔıHÉ(–ìá:xR#t3ÀòaUb×ÜpÁŝŒžEêj0àĝ( òÀ<0ÚĝŜ“Ġ›ëSş) l§ˆqÀaCÀŒrmÖGEvi}:Ĵ‘Ÿq%•Fŝ“OnĞì­ïéìF~ʕâô€ĦĴçZL™ôÑiQ$£F‘ç ÜżŬqÇèĞvûÙ·nŒTC£H†3Vá<×`ʤŽîĤ8ùâH‚TÀn<|´ŝS²ħ“ğ)ÄFŝwŝ£żÊÓ;<Šl7`=ğĜšÏğ‘~J쑃>ò—÷ }T§&=Ñ~8Xċó¨ Ĝ+WëawµV7%Ç+îÒ!m?`\–û·;n{íüϟä8ĵËŻ´ÁŜżñ-Ž{á Àˆu|GĞ$¸gg›?°ż€eKŒ¸)9CU>Ó|ĊĝtçÚ˜2飃K+3ĥgï…ğíŭêÍyáö‡@3ìöwcG†ĤÔkÀÉĝ²ÁИ´"š02!ÎÉğ8Vmc &Oú`ñt‡ ×Ihgf´6\‡èk ´×Òž.Š\EÀÄǍ_Ĉ —”ġ†Şç')ĝhەç]•vşHİ:rbFk;óŠÚÓe™üĠLĵâ“‡.eäaÛĊĦ*ƒzì`•öĤ›ôљb:áüëfê"C$š ÀLf˜H:Ġ('ĝKfżˆ3Ġ)Dú:ÓL|Z:# Tç\*Ìt%_WLıVˆÒŒ£M7Ĵ(F‘UuÂż§ZB!”ê§Ü0˘ôĥÏEµBcċ˘İD%óŒ˘£Z,ĥžU,˘Tq qԊSгZœ­´á'ĉPT+€”ùœ|Ş(2Ż‹"ç´L3ıÔ[6?óhĵĜ¨6ĦĞMʝr–YÓŻKâĴÎڏ´á'ĉP|­Ĥ\K§ĵñÖÌÌÌĴ%ÀÂI 0 °ı,Ĝo'-À,Àĉ °H?Hgf67€1\ÎÇĥ°ŸY€Y€ÍĴ‘ϳâ֘'?›7ŜZ€]ۀ•Ğċj lêĝ‰2ê-ñîX2ŞVcN°of&Ĉe%!Ĥ X^ZƒY­Á¤\ŝp²@ÂÌn 0 0A"AY nzëäg‹Ĵ×ëMiùi•ĵtœu˧ĵ``Š$ä ,›ÊpÓ[: T­²,[âĠ…ŝÊpé0c“``3Œoä"ÉpT^Z§àÇ£~nV€1şµ¸ÎXÔTüÁhñĊ£3ȊFÑHt iúġŽ™ûŸ˜CAİ9Ì$ŠL%e|ŞĈp<O2’OWgXD+~G\‘.Í~üèQĠŽ AMΏ4ûqħ5ʊ!ˆ[£>ġŒ.7C¤_gÑ=fw!ñĤǘ|e¨ù!SŭDKâ߇„Úö‹O]le\P²uÀ`I@ò u´Şùœö/çŜQí,Ğív;Ĵŭ͊îĊş,IJڋĝ‡O˙•XV?Ġàpŭ@ĝĤǤ 4/šËá6–İxŭĥÖĥ_Ĵ+ĤĤ2À„ıDW°'żÁÁÀĤÏäĤsçÛ@Ça“ĊÌÌÌÌÌÌlAÖqkĊğ˙¸ı>Ü ĝÇguüĝÁŽO!ŽO-Ó9fîbċàĴV­ˆ›’ÁH ùÊñÔ̳ë'óeÏÌċÍ7d|v³ÏfġÙgÇ?ül 9ĝĈÔò7f-mĝ‰9”Ÿ\AÀJ %nJœĝŽ×{̃V<Éó)Ĥ°p\äğSËߝµ´á'ĉP,`â_`Ž{ԍ²~]:àáŬà^/AEG`§Ó[öî2ñÏ<ĴZ£È˘6ŠÌ8,¨Ĝâ˜ÓSâŬí́ Ĵ`ĊF€ñ ‚¤ıÈ8oXŜOcÀu#KNœ8q3²èô4é8½Aoü’ÓW˘ÛŜ .áğ§ÁŸÓó³£JTFEÎiGkĦ`<Ġ×°²SWMéK6ŻÁ]p4Ŭ0@‹§ Y7]:!Èiħ*ğ"5€Ö !íJm0\œBr3Z£µPâÛ%sXx†€üĤ€]/öîâVğYúêşwŻ`Ë*`Au<|™–´ÙPTBfĤ€ñ8h CÀl‡ĤKÇşÉ+ Ĝ!pŽëĞ˜² 9‹7èĤċç°† Cü4[tbštœ^"ğÈ+Ĝğ“²xñ’e‹lW)Š ĥ0m­s£úĵ (Ş˘ÍC"ÍÚ`€PŞ1`ëfâ"Ż8`'`$y’Ŭ‡`òkEç`TY‹ Ú ŠìBúŠ £Hd°ñˆV† =d“n à}`,¸Ŭ6£cŻä_Al“'PG+ĝ`;ÉÉĞXȏÉBt<`= ùp ğۜ˘~dÀ5Ï"À·zRĞyû]áĉ=ù“ː%'&—\?}:–-[ŞàϲîuWŞ'_DkÑUlvŬW°ŽWÌvd³kÇhŠŠ³½m°Ĉ€ÂË·˜ÌBl ğ)ÖMĜşÖ;2 ³<ġÊf‹/H v.`“À?Nΰ.Ħ ·lrú|–BšÏùh?`=ü‚Ĵí#Z92`XqA̋,ġ!ĥt£Fŝâ‹[3iXu¨‰îîîéOú8~ÓÖ½Ĝ6aíĴ‹ƒ16,581ĈêĤ˜°XoŸŻA?˜Ï°Â ôĉ­“ĥîe6mĴ›0Pw-şkÙ²\äŜnìí^6yeƒÓübŠç> °İ'}d³f“>(ÇËĉ€ #~t´î=·Ĉ€1t›ÁsäôŜÖù{…ÉWŞ£qx<Ħßaġä[ğ­‡Ŭ­ĤLè­Y€Y€Í`˜$U 0 0 0kDë|Ñ:cÀúba­„îÇ\Žoñ΁wJÓó?lϘüWf=&˙‘˙}²`Çäϰıœô1ËYEÎM-ÏÍZ eÛ%ŝsm—ç:°B†#fâ"çrÒG³cŜUôŜ¸œ m—èÀÊé×im°k °ÂBÌüa7Ä]`3Œ“‹”S §–rqáYoZz·u•$`ĉu¸xĴí€Ġ´o@ÖV.7Z żÈ%ĝşd–­6)9Öĝúş72›ĵy*ÀJĠŞñMÍ&€Ñ(Ğ•‡hJE|[äAûĦV÷§öó>aq™8îR/°”`݁c~eĥ&_â\œÏ€5t‘mŒ‡oÙ 0Âçé‹3&·˜÷ĈÜŭ bG$¸ä°Ûg¸Ĝ΅tûş‘@k€áş0€ôPSóùˆtM0ƒ kİ´ÏÏ2N, U ì+€•ƒ>4ïöġ˘y?°³?¸'ö€ħñŸÏĉˆ— `¤°µ 0\~RX\xÎ3ıĊ ¤ĞÑŬOJŭ†Ħ%WóxÄı^ÙF¤á )¤Ÿi°p ÁĤ,<ıK°WuÙĜ·SnÔX1BŒġñĴì{8P›UÄ2–B‡ÓĞ-¸…X›;ZШ9`e7‚tġöġ·¸‡Ĵv›ĞrŭÒGô2 JŽ•{FġöT˙&‘İU&ĉNĜt\7,ëtÚEÀP^Ĵ4¨0*7WĈœ}ÀşżXŸs Á Eĉ„[ÁkƒËÚÒ]şñL`-­ÑJġ!ˆÇt4EAÜ>_£ĉ™(4.ıà}v`›Ó`E7ÒċƒœFÌİÔ``éjŒ‹†Ĵœ‘k°<ĞL\˜×½kÇĴ`qs G:ıÀ†şH85ÌÖäîğĤ ĞNÑQrĦeĞÀŞŝéV+ó5ŽĞ–JĊJµVâÁŠ™“vJ5ĕJUqżRċ+\ĉ–8hç•K `IÛÂl2³wRc)lĉ"ğß}ÖQÍ\$Ġ0E’<ÙZ,$ĊĝTQdğ:Z%ÀX‡ÏljÀ|M‹ÖŬbD€còpĉ.ÒÓ0RŒ`›D‘]0Ò N0Ĉ.ďB,y+9^9€aˆvr‡XR œŻżĊ¤FÚşL²ĝŞ}MJ.aëfY–èĦF‘ò(dg Ŭ[ww72ÜÜEĈè6=ëÎxÛlûu `í^:÷95oŒQù¸8êÜĴš‚ïƒA|i³ğ9f%‡ûɌ$ğA<Ĝ"`|Áçî÷5/—ƒñĥIÔçë‰ÇQ_öjġäĞĥŭ}‘AĝÛê"y–0}ÓG’šŜb’ ĉw?Wâ˜Ĥ%G_%šE‘=4àT+€Á˙xôĉÛ) t*íü½Ö *5XŸƒÚ2ĉÓ¸ˆ6Ñ^ÀÚ--Vġû"éĵıT,À,Àĉô}‘```ak?`”ÓY°³óÛxÇĵñĥ/Ş›ôl8é…Lúh’ġÎ;‡O½3…xgj™Î1s˙s(‡[Á|ŭöhçĵRıIüŝ÷Ìċĝñïxï½d½÷Ŝs§Ŝ›Bĵ7µ<÷ŜlċÀ{,ϵ ƒ†:êŬ×ü¤×ÈgçÉKá-ÀĴ(ÒÌ̘< ¨CËa5sù½µjµdĠjo^M!/ÔĤ–é3÷?1‡2u1i%˒èÀʖ,DaRXɒ…(IĴŬ€ı˘ÙÙğHKŠ$Ú˜f˘O+€)K˘Dg XÁ:ùċ“Ÿ°d!JßL+6ϰŠX£M3fUmœĤéĵ‰%fe,Àßm£°&˙Mš ptÁ$#f%‹f ;£)fĜËd9ŽçS4kÁh·\6!$mfL™9Sc²½MŽr ĤL&“N“d"!ĜŞT`> pċu’ÍÁ qüLŠ$‰œ ‘…yÛk+`é™FÛ팰íëÖ­ûfÒéñx’FÀRÀ˜0Ĥ7ÀX,HÈ%qrV˘}B+€eÓ•͐¸ĝŻÀĜ$™La˘5ÀàW²éDe-ÀÚÑêêíÖöƒĠŭóĦĠ7Üp£Œqù’ ÑZÀ˜a/0˘Ş1i°Â÷Ï3ylOrÄħ; IԀĵPË 3jp$)ĈrıœH#`$Iè6-`ia­îj÷ç-ÀfXŝwVcVżqdġWùÍo~e FyâŸüáœdUÀ(Żl̨€ċĵ1Á˜tgÔ ŭĊ'âŝ/'Ġ`ħtuçž V”RdŒ€ñ<΅“"`)ÈJ1' €ċbÏ?“ ÉD&Óç€‰ż’ËQAÚlր¨˘°íG~ıġĉ8P‰o.aÀâŝOüÇgÎĵŠŞ€Ċ1Éލ€á²1Ö¸HċšÙ9Œ’‹gS(V"pO\ŭîóPuù`úŬ}f€Ñ *êc-Àfŭ,’Êi[ŭĈÖŻŠ1Yá/i0ÚE•żĜĵôÒËîœ £1R2`yWV1f)7‚rY"=§€¸ĜħjO.R 'âqÜ*h\d‚½cJO홺HiâR)Ŭ °Ù?ìĤ 2`ñü`ë/·~5aġQ$=üÉÇjž~úŒ—RSŒo{³2`ŒK1ú2J ĉñЏŬîáHfCżGñ”˙{nb€Ñ"`YĝoħĦ¸ÖE ßu !ÈONWƒÉ3Ş\6b·›uĴ¤ĥÁŻŜûËÇĥNn˙JŽ ĦZÀܟŻ÷ÒϞ~üŒG˜dÔ&3zYĝ³Ÿd_{rmŒ‚uOĜ˜ï \á§|&ôO*`\VÀ,MĈ4.bCtSnF@ĠöO?†7VùOX€Í06­–ùêÖÇĥ>ĥú†x!Œûò `Ìp8=@ÍÓZİ1Ş.r8£ .r8ŝÉż}ĉíä`[ ¨ŭ˙oïmBžçÒ3ÁŻ8úYˆA Qx‚Q38P C/ ĦñŞPïJ+ìœñ˘ Ĥ‡÷@^$Ŝ˜mJ‹(YšÂ!…¨deâE”ĦhZY”‚VžBdpH´("H'-Í}ÉĥìçyŜßçŭ^ïçûúħġ{tÎûïœû:k€9ò7żŝ÷ïžö›`Îr0ı¨H<~j%SÖÛ+ıĝŭżĝ!6o~ŭëŸ=v*Ùòĝ*2jZ·˙ŝw˙ßŭwËdn˜£>ĈNFùÏ?˙ñŭÑŭr~eä7­+#6ŝ7ĥŒ|T‘›áżüÏ˙ùÏùóŸ˙Òp^`.IÒèF‚k|ŭú‡XùożùÇ‹;äÑbz"#ÓK\^ĵV‘‘ġç˙é'ż_0ùġXĞŽQ|  µŒüíżûŬ˙e™ÌĈĤ˘€ ;,7?˙ċZ˙ñżœvÚ¸ÑüÏg€…%Ûĝ×ŭf#lôóIŒĊżŝëżŝò/aߟġ_Ċóû’ŬÚ`Uġo€Ż_˙ï€Qĝġ÷ğZŭzk]İH]Hí;֕Šŝ—?üßOñ2żŝġ?ŭêÛ°İô(ùP#˙*Lħû_—‰3vUY郀8Zc}ĝ'ö'Îĝ£Ax´ÖG—[ĥq'ög¸Q/Ö00œùĤ=ŝݰ$fĦöÀö "˙!ğ ÀÖĝïÀ`ûßÌŻT¤(İŞ*}ÇÉv×[ŭÖ_üĠ_ŭäßŭÁï˙ì?ŝÁ?}ö"u@2š}ğÎÑ;ŜŽEnş¤kê``µ†Šĥ†alŽż÷ÛÓÑŝ2TäÁĈu‚w—Ħ˘ë°Éܝ ŭ—è]ŝÑkI°§^ä>1Q|ä9I0üW˘üúġ?ŭlŜV‘ŽÌÎ˙ÎWĞ‹ŠüĠ_AùÉOŝ ”?ŝó_ŭêW?}¨ÈS™Tŭì$Xĵ=‡)’fœ8 ÔAoôÜ`w ÷'£°&€êZ½ħ=ê½É(¸ v{½ël´ùdŭK‚úëŝâóÍċâ~ĝ5-k…7oĞÈ^|~ÄgÙì˙Ów˙ü§?ûĠŻ~ñÓßzĴ)~gó*²=T´â\ÊaןöU³ °‘š}ÓïOA÷1€MĝóFmĵš8ëly6Ċ`ñàüĝ—ëŜ?*€ĊËż ˙ŝïŝîg˘ŭôkœMÁF.ŭ5eĝúĠOWù˙†z’÷ĠW˙ÏúäEŝ áĝú­ż‡ġ‹_üĊwûè@kÔĥÁĴïtĴÙ¨3v¤V,ž)ĉ){2h$˜zÓoOtĜq6›Ž<²g€‡ĉ_ŝò—=íüŜwŸ `ĊÏ~?ĝÁ˙ĝ5ÀjYşñġ‹ À‚ċ˙ŭżUûĉW_ŭŸçĦ˘_ŭ¤–`ÒŻ{ €íiË[|GêS½Cm€-Ġéĉ˘%Ġí-À@!*°ċrıÚx™ô~ż·ú½˙0ù °ì²Ĝ`Ŝßü÷ż˙›żùÙOúÓżĝ‹ßiÌİñĠX¸ĝŻ˙Y·ÖN¸vĤCŭżŝ瓊´˙·? ö“ßùAs•?~솊ĵcÛȏ µ×ëÑġ|0#hé¨ħÁ&’y½ñvn!nlO8< @WöĤÑÊq?˘8ĉ%p˙ÛÂżFEĈáoŭ(Èß:_&xìUożÖ­Gs}’­×ċg´şCójÇ`0iğfĊŽë§íİhó܎ç6Úïĵñ•>s÷ı*ş0˙™l‚´÷\ġû€É4SaQW%óıŒŒßĠA˜lÁӍ.‡¤cAċ‰,,éVŒ Ùœ;‚ .‚0pò¸+ \D€c˘0ïħÙñŞj'ŠC›Y•3Q²÷›u=ám×4ÒĤ'‹˘ÙKâĜOpa--a w†.3ZxaÑD†û,‹ÖĞ,MyžŸŞ7ƒíBLË2”ċ*& £}NSC°ñ6£[QœŝV4Ö! â˘$t.Š.TÊUÀà‰g8óĦ6>.iˆJ€Ñ]h֕pDĊ­Š…(Êàé'CQ[tĞŠâ™Ħ(ŠËġĦLF˘8-²PĊ_ċ43ŠWĝvOŸ*ŝDÂeO”:ĞòtùôTĈΝ¨ÈjĊ"Ĝµ‡Ĉù˜ÂJïP}ĝ+lÏFz:ƒßòˆ°2?=nf“Ĥa˘bĜĥLşÇ*7ÑmKħ(!Üx$§UU[™Ô_Ú.)MO KĈpD›÷%­(µ%BFeċp¤ŸUɀÑĦğ.K+›#d:“Ġc+dş³¸Ñƒ.'ĥIˆ]TħÇ[e†ŒCU˜D”°ÚokĈ/rx‰².İ#@ŒjÛɉ Ŭd?r<•NĜÔW^ܳ IDAT ĄËĦ£ŞÚCU{‰ BôS56C´Ëp8h6"âÀÉ*Şn0„iŬ‰8½Ô{rÑâ G~tîŠiyzsü{!?İË4M%4ËŜè×­L,4ßŜTÌqx>ڗ°]W Jüêò ÏŒR'6ĝĜ…$œYS²ïĤN¸5ÔaÀ]ŻjZÁî™yĈ~a÷H›+Ô4ei™!fÉĴŞ–PĊĴÚ‰>öʵ xžÁŭ ûŸq ’¤]KîÇ<чsGĞêoËk$ùUıÔM,h•MáŞ+§ßŸf”îÇ´°iԋ*êMs~š@ĥĊ#7eEñmì³ZĉP5¸ÚZö:€'XDK,8B;G.3g2‡–-3Ö ÑÚKħmâġ&Íì1["Œîacy™Úëµ[á”V[}JúĤ>û÷ŝc °|ûá%͍ mthŸRfÇ&5yÉ<ĥ.UfèPœàal=ĥ²ˆtm}-LÜ Ċ!)ë†{‚sĜ]ĥ6–ĝUë) vBĤY‰Ï„5lĥ•Îäġ<ŠĴı*ÍÜèŞG aVÀ£•Ĵş!ŝ…£#ìË4Ħ9^”]µĴò‚žħòú(×K›Ö “eğc³ô\Én^Ö7ĞË!Ê+ .HŜjĞğ |Ÿ) `‡crG,ÓïqBö6f–˙ËUĝ²Ö @şíaŭüYıûz‚ŝ£ËÇà½'À˘áäcö&ê€O °û(°~ġ(/l IóĜ¨’/`‘vÌ2“·$½ °ħ˘iŸ„Ĉ|ĵ0•/`yfiÄÜTú€ÒËlÉŝ½>À2'ñh€Ùĵ˙ÁĜ>>öF#˙y‘ĤĝJ“Cñ×`òÙĥ9­i=ö(Ż_ìsYm{”W/w¸f÷£S{ìQûN+\£ĴèçİtùlC›Ÿ `YŝÊ]•dÙGwSžĤ_oŸn—½>ÂÛw“|½ëgÍżÏ°2šëşûšJŭ­>ġ>ö"áf˙µŽ{vûÜí^Yrf;Ïo˙vEmóI–ϗLt-ßg1†×XÔ8BĝÙ+âK 7`6Óğö[ BÇ+>ĵǍ×Òĥïš ƒd1Aˆ^`ž tƒú„XŸ`Ùá%ê€N8v,÷ó,qúÈ D|5-™.đ1ĉ²/ Í)!d÷–÷ħKDûCe ç#b6ß·ËùjġÖĊz<‰xÉmċ+‹Fx’Vï ÓĜ} €½\ìq˙> Àr]“,׉x|-ùeñZ^Ä]BĉoX÷- VÎÙĉĞBÔU#"³Î,ëû[ĴÌ9ôż:ÀލtµXm&":›Ż `‡ŝû,Ë{ÑŬ[€QcĝħÏ­3ZYü$Î<}+v˘Î;Œş·k™'úeÎ)ífŜ%ËzfŞKÈá•ĥàyûéíŜ:ġ&N´ŭ”ûŒaŠĴVŽÎ-ÀŽ„DoĞóҎp8é+TŜ Á^˜Ëz£jµwXı–í›™Ú;LÑh{  Blúìó§¸KŜŞĵ_€ċ3ŝb]Y{ŞŸ<™ pú~IW“ÉôVżI4.X=ŠÀ° "#ó£¨ĵġwğ ~~Ĝ›\FQ/p“`|é QxNvDx3™: ›ŝĈéÛĊ'€­3fËğèƒôn“%Bui•Wys‰$÷£Àg”îvÙ9¨àĞÄıŽ+$˜‘D6Ù킢گ˘.’ĊAq0żİFV?ùa84Ŝòĥe{Ûbí^Eöݜáp¸ì]òƒĞ–2‡ Ñ Ġ½ĵ gҀáÂ;€}œžl$Ê˘È‰4Ÿ+N%I‚í9áÊEdabjìgI‰ëŒ°R8Ÿeĉò‚&ùFQ\]şg§ ˘Ù[çĉ°ÓÛ£.Y.­!ʽî&Áµ÷ÍĈ+ʂñĵž-Obò-Út́ÓjşÂŠŠh²ì‹a?ɗ˘¸d½œ˜<€ê•ĠĦ/c÷UìĤ ¤• ^I:x$µ£}݁]ĉ€ù.·£&64Îb.)˘0Ú/ x–„çĞìĥÔÑ›ˆŭÔġcU†Ş,sÂ)S#ƒÛÇÙ邪ŠŬ ÷˜'ĉ¸Û‘Àga]M"íT pèE‚e(!…ĥÁ}‰Ĉêŝ$Ĝ’–K´ìµJ„%­ö˜pÍçéñÊ "·›ŬSĝáì )OŒ& -¨²)Ï\fÌX”Ĉù0׏èúŠĤsQ­M•[QL´²!t픆2§oÀ@– ;ë£JŒ.á 5]°{:ë‘óĵ*Œ;_Wċ"²'lÁ–ġÀ4 D‚у܄ˍÜ0­‹'VYĴx‚"ĠäAĞñ8Ħ¨âħJ`czŒÓCŸïKŬat>†Ú¨CKLÁ'‡Nd*Ącĵá—Eµ‘I?­èÎèì“lDÈâ ßĜĉI‡áşì“Iĥ6&‘{w“)f‰BÍc[ĊĥÁäFâSş„ŝßdQŸˆ­7 ” ¸ìR‰ÖıP ²1Ĝñ”^<q •¸eV–dĉ—îÁÄÁĵ:è(¨Éa‰/Pès MÂağM ʗÒ5ħÉ` Ç*r~½0ìÍ#ĵzTÑÌëÄU’ ÀĤ›q°ŒRABħ,’ ' 8nëÜä:a‚R;ʏĥĤġ5‘ïŠ _zS¸ZJ]Á9+hŽ @<œ†ÈÜ9İ28”qÌÓíĉ€Ç|Ìğ³‚3“KÑ€28 §•+(5ÀXz/TBĠŬ˘¸O#˙Ès—™Ái`ž$2G Yħ§[:2ĉ §vdE@‹u,w­Ŝİ›–ÈE?2=(ħV,ÇD82+•›œµ\ ¤UG8#0yPuä`ŻÓQdL•Ŭv%oġbIz `(Àl§-=4w¨* PNĦ 5ŻfÄ °1Eıħ(™}uħŽˆL9F½I\†Ûu:ÓyĈĦ'jû#k)\ÇXc-ñYA9&àxòJ•h~áMY›Cóü™ïû·{ìûQ°€•q 0‡´Pj½ê] Ó ÀÇÄĉ²ób×ŝ8,Ċ'Ĝ”Ż °µ7ĵ/˘·?JdŽy²=r|0-J?Hê "4ÒCo`ÇŜ4÷Í£Qétħ„ïŻ0 1ĉTÜ:–zğ²*Ìˆ@ vbÍs§Ö› aéˆt"£XZ‹ÁÁ‡ëÈ ĜÑv‰D(êV¸òÂóDd¤"(3·„\ċkĉEVÇÎIE£(*nëßÇhhfVäŭĊsJ¸S˜Štyfùí — ÂË:à£8ĴÇ,zêŜÌá όçE0ÏĊ[g†ĵŜ`vIT.G ”…"ç0„êp´œ2Ħ—Gi–jÌbeŝÀq˘w;0Áq&ĵf#è„F‚•à”DT&<Žœ{×6Ûv2[Tä$UÙàK˜|0Àztù]xç´bÑùĉ†FđVaGGv˘%Ż@Oe‰Êş{uĊqèÖ,{İK'ê_ĈS€EfenLφĵHşğ(ƒ×‘gÜ’|•10F™-ò Š’>˜÷¨ƒ° Ĉ„Ûeµ–¤z$4ö“Q£t#9Ĵâĉí½ ¤€‘Oĉ8$K¸Ŝ ĥ𤓀^]• .Ñ#q‚ĉ:2#?Èâ‹n@§@³Ĵ<Ĥ"ó!r· òĞ Ġž â›Ñé5ğ´Ž—n{~žÄĉvîúL§ƒFŝíÀm°żħ Òc§ö†*‘·riS$ìı„Ċż§T9´‹œ$˜h9o˜˙1@ş×íÊ˙ pÛTŻ °|Hxm0ì‘^ ÷ô˘*ƒ'Ġ˘j í*_&áPžx 0,aO{ …|G˘ŸSdRꋣĝ<ŽaŒ ­ËiÛ`ĞŭÊq˘¨ahW04jOˆh Ï_ ĥĠ9ò ”D²‡VŽ!}rË€Œ:Ò B9Ĉ츳™ŽÔJÊD£äTy,Ÿ*ŸqŬ]Ï8˘Qô=ô%áŽĈ1î%X·ßÛĥX~ĵ ²ëàÔ´p>H[ĞSŒ´ ĞU—Í"aŭï°(‘8pÙ§LÊë} ä–Mĝħ7 ŭ&POàäÛq5pŬ!lbä‘âô-Ċ@˘™§ôIœpm<‰xİéßôÉ="l`ßĉE‚ôB9f3Ï7Ìĥx]€(:j§³¤µ³ŒŞ „è“ÜE6oñè€cÈ ĵşĞCG âP9N’\áĊHĊı›ŽŽ*H8ç2žEäù zĴ(ˆĦccƒ€KÉ ÒšfÈûčROç™_…`í\ïùÌö:° Ĝ×çj2‹Wwt³g"…ï˜Ŭ”,³:‚³êÚ[ nhÜM–˜bNMžá£uñ1xËߙ§aUìÂèJċ;¸šudQWiŻ#C=·ànvü â=6=—™ÇsƒèâDÀnĴ0oÜDĦĝU²vg–3{ìh‘ÁF·*·Žs‰¤ĝA–5Ì?ìık'€ooĜ‹eiM"0òÇ{T‘ŭµÇ"O%{}8‚†²GƒŭîF£v,?3u}8A@Ä£>™;½°Z£‘>KĞíεg¤c'ÇFñô‘nߊp„ÄmŜàä§%cö…Ĵz7ÙGyìQ{”À{”Àċ°À{ìQ{”ÀûĈ–ìĝ… —Á~ïÑ6zˆ˘·ĦÀ•ßDÓU&Ññ ġßqdĞô[ËÓ=wĦh ŭĝ‹Nyç€L8à¤ĝ#ŜôhŜL½)AhÙ½!$u½Ŭ £I¸~K3•"%Uıóœ77MU8kñ Ġ°E]ÚsòÁ ƒïıÎNĈ݉olĊ|“:qᅊtÚžï`{I–ŸżK7CM}[32wY1•…ÑñJDĊ7H÷<9gòö‹X‚†_?}ßp‰.1Çĵ<ĝqtDò&cÏݳ–ï˘”û§|`ÉX”ży‹ÀcĊ.ħE9í-Úí0éĴt4HqÎÒ;à‹~ĉ:/ùş_&"²bżĊúŞo½QEĉ‘îoµġ3K0›ü]ìĊìÀ0Éŭ·XµċŻ–nX½4Óµ¸À7Ÿ÷ °=†)œËêÓ­ÇĜ _´WM˘ĝ· v%ïzòZŝF‰ıßŬŬÌy °ÄàTó}ü 9ßğ}°ä9Éó˘†lçòµ/â´Ò›7ÓbÏo<šŬÀä"- ƒ²‰İħFúIvc–F=ħQ›%x{Wr(ì‘SûÑòÄÄTĥÄyf#Róüè‹mé˽РĠ´iöÒëú´Ġ Np-Ż<ġ×ġ„ċgnE)Ô0Šß `h™·aŬ² &S#Ŭ}yËhU²eœé^šĉ0›J“CTϘ-#ÏŻò|ĜeÓ2ŽWɟÙNmV–ëžÍž5ÔljĞòÂ8qTžĞُvŻJ<ßOî`üx—/e˘Ìù1€*Ó°£|ËAäĉU–:–FÌ`„™(á3[–5eêePw—^ŠĵnjŞ*RĜ/§³í o H›C5’2‰‹ Ĥ²ÑµLôi”Á–ì-w˜Ġ—ċ‡:—FÎbâĊĴùü9]"ŸtŭíßVÇ˙ö£nÓtWÓùdÑ×Úȃ ­–è*ĤŜlı‰f–qr53–íÙêî:W³ìĞ·ĴÜY³}´šÍVI•,—Sä5в… zX2è ¤·‡·8žaB\‹çà`MVyE-CšÍ%Yċf—]ċ²NñBŬ"a†rϤ=×']ÌşRGŬïŝŽú„H+çîö"njŝùGX˜'çd­&v!v Êĉéöˆ8?wÑà”¤–ğ=q2%=İ !½*S‰<€íCÔ}Ĥ"ıŝL&òêùšÌyÒYuğ]Ìâ­J­+ ²T‹n?ÒşXÂĦŸÛpĜE$Ñğ˜˙Ĝcì+*ˌ4²ê˙úŝ÷‡˙ż÷ŭ?½bM~Ñڊ—ċˆ@*&“†‰ÂÓ𸋴)ßJ[lò§E½mQ“pŬ4"œ6ÔXö+­–JÜ5 HßÑaı˜‹+5dä}ی<ÊmĜhZgĠUk‰wŭA:)Ëá$FäžôÄbĥ/6_]ĞğQ'ùR ÂÄê¤Hyċj„3ϕB9<´Z´nI¸ÙݏB³ĉĤH—CiU&:!“Ş„OaëɌ‚ŽNwšxÇÈ6Ê ·@ËÈ'#ß6dn”ÁĠˆĥJ)&O ŠjĤs¤™F3hHiè çI²$Âܰ×ڇ-ÎBCJê?l}ïOçûßûŝµġìĵ"+Ì·;‰Í.ѝ…D4|žÓÁDĴN0PlÇVND gĈ ˜gíI Âë˜,{N—p€,£°fŻ)'ZgGUBAR‡gMMLŒ§"áU/qä+ò`xqĈ1XLr€ĥ£Î2á-É}>ÓéێcÛÎîŝ$˜œ0B½9Ëò$~/ô£qİTĴIh>Ĵ‘şƒ&i‡=r]ö2S‘‰Âhšòfûäôž3{Ç<Ä"ĞÓ²·5‡À³[TINÌÒwG“ĉˆáw3Nò*_BïmŞ\c'}äJÜH¤3ŸhÈ;€tÓúRgÁ´ĝGßûŜhœŸż½şÇVü¸=Ráɢ ]”]Ò?fĠœìü\”÷U‘Ĵɕ‹ì2£ËÁ–Únò -Á5Şò¨ƒr/ĈÎk˘×÷y•²xà#µ$ €9¨Q[ŬkŜ°#$:h„Y-ĵt:äB*Pú°é Àrƒ['”Â{ġ"}F>‹(îS¤ "žÂj+"yLħŸVı"ÜôìÊô;ƒĊ×<`3̆żĜQbf-Ġİè/’ĊÁ(ôT:$r—° ‘d§!¤À,únuì ÀŽŬX„¨ş¤'we¤İ7àÈ`Û˙ô{ßûUQy7ËMr; E×El73hQí& >!gG` ¸7“f#fO´ĤIQĴµ¤pÁ5£Og´D `ž(ĠĞR¤¸%1JŻĈÔö˜ (˜Y<˜Kó j€ 80v“@aÔX`äĦù=z‘°LgœAÈ ĝ†`;6ì0v˘aÍ7{a™‹û¨R`WŭÚ­` w0ä9A‹$!gLqHI ‘.‘ñŸÀ´:4UyÊâY¸šŬ#‡J(’Î!Ï)`ŸF)üÀsŝÛ÷Ïxçn•ôŸi‚lÉĜŞ(lŒĤı zU>¨yÌb°×˜ŬèÄĥ ĊĤíc ) Ü?Äc1ıö"á t‰We-;Sƒ—FkvkÏM–×½ĉ׿ŒŬI€y#òä~ŠSöhI b•gù½Œñ'ĦFâ À.-°bôWt)Ԕġnm½Ö½ \ÇUMÀĥ2ì@T™>Ĝœ˘¸0(FWĞodÖ+ğ` ĜyÏ`òdbvás?ÑS|AÖIÙh8÷Îùż5Àèĉ`9ÌĜÜĥt0ûcäÖÌÀÊ,úG4ÉğQ 0`uĉÜĦwÍ!€‹™;„+j€­Në²v“‘ċOyyYܨÈj̸"Ğt5H#Ŭ#{ƒšĊRD€Îb}9°Îòı(™ğtgŒ,ûn֘BŒÏ,={x `UÙ,j…"-öu °žê`hei 0Wäŭ&^8/`  ĈTr›FjšFEîàğ–%Ooħ ­Á.ꙇZŒ4ÄRM0U+?;,½ħÁ(ŠYIżœZ*ħ“½bÔ*ċ #€RÉĥ½˜6ÎóĠ’[‘ ÷h #+zS‘ĜL)¸Ž‡"ìpĝÂfğ(KûpI˙Ì÷R1ËU.‘?S…eĞi²Ğ´Ĥ†'q+ĉE‚ġ–h6ĉÑüG'ŽĠĽWÙĊà_Ä17žş"áÎÁˆh˜ŠJ#ĵ]çĊuZS.–‰Žî ^‚EÛÁIĵ!‡ şôÔ­ßyœìÊJfdW³˘*m0@J_áĉQNŽO`fVm1‘Áż”KC]yêşKCZóK˘P!8ΙLnw:Áµ3h‹)™ĜG6›G^PƒŸôGQ­– ˙İŝ`ı }§tğ‚‹;‹~KüƒöSë5HAIĥ \ZŬ5tÏxù…1Ĉq]F64üŒħŝٟ˙é˙§7C:ÉJᗷ›Ïb– £z£ÑÄ2ç>pË.?²áŜR{×lmġċL ûjù“¤?ZL÷eê,ç3`ĞÉtUûùlb'àxQXâ²m&H-T[Û$}Ë>œ—8Ù-§–},×ËĊdWRm/|ĥt£5*ŬGáq‹÷-·ì ŝ Ż\ħ¸ßÁn¤¸Ï‚ —ġÏË`Ğa™”àŬ]íÈĥĤ²(óC^ï*“Úƒrք5ŭĝ„l¨Ž]™ĝyë:Ì^yıÛӑënĤ€rïĜ^3.y`“˘.,ÏùÖħŬcy:Ċö°'R×Ċġ!˒OĤ¸€NÔÛlċû0‡Jĝôàb¤ĉôàġ“ĉùVĜ|½}ÂBEëF)ÏÏXžµ:Ëİĉ6UM(݇2Om^;*mğ,“FÉéó,Ô9ùÙs?_˜2*²7–*İ5^}97O^şK•ĉí-ñ‹ÜçÖÉàĊı}eŝŜù´A?û GÒLîÚŻCer}‘âı×VXŒżp •À˜’ûÚ{ıÜğ£NĞÀx€}†’j5OpX=öĜ§xTYއiġĜ`ŸĤDŬù Ĵ{ìQ{”À{ì°GyìQ{ìQ{ÖâWëK–Á“ŸÀŬÎżŽU5Ûzz›äŜï“?Qş™L6/Gs=½ßŸßn,7‹áĝùĉ./`D?^ÏŞ â§Ĥ"ÉènİpœtÓ˘†À ËO*·sAZˆY-YšO&eYeĞÎêĦĈ’:ó./œR5‚ıċ.ĉs{›ĴÌÁëá.òHç A‘&ôÚa‹ŞööñÍI<÷,1G9…~˜Òo<À¸iv-Xž÷àSÓÁĵY–­ l½Ü8ŜC.? ":6GúIŽ9ċ˘û’§82mFÙ7:&qëşj×ː~$ÀV"!<˕– IDAT•à"µÓ@³9NżĵM Ċ%ǟ!£8 vüÍĜS‰YìŭOÍh‰  yÂŭä`%£ğğH‰°IÄ+Ž%Ŭ`öîô…3&|÷$\’OlİÒOŻ8·cLêd˘Ó Żú66ÉS6"6ë÷9F…¨ûEĴmä7ŝu:í³§ĵogÏ?\9!Š›ĊÇġLRL§µŜTċq `Ċĵ³AŭVî01÷İ7Ġ>Ġ–N8ĞlͅeéJ*KĊˆ^ĞAhm°2N˙dé £§1ë,ıçúÎ+ó(<–w°Ütêç1^Xn[ïi°Äç•&È]S)zĥġR|#ÀŞ~ `çĤ>X9½U‘çk{k;zÎÒœÊ˘Š&Żı eòÁÚĴ0o| ¤gİ:‘ŬoV>×m—ç_.—Yê86"é̳ûX ÖĤ×N&ú³P(ġŜ&è‘ùó1¨SıÏ-µSêÜò@ıĜ- ÉÀŞ6ÀŠ'lx‡ĝb­Y×üa³½òĥ˗żB?sĠ{ÓûĤyáy7kŬމr•Żé{{bE9e°Ñ€}‹=pĵ7ú`PğßN_î‘Ĉ vİiŽĠ#{XáöIwċÈ€_\w,4€o.òDT‘N:+w_žòŽÙïÖË`À7†½!üÍ<8 3 E×=ž½nĜħǟ47iyXI—ôm÷€ ñdF›ëà-·•=#’×$E{‹)£O´H§…Ç£ëšC—½˜t4sŻ:q޸ ~ÍH[FkoϞ"‡§MĦêA‰“`ÜúRÔ!šı›*ĈÇ*¨4Ë9ÑÇ[¨û5¨f½Ô6Žç 7˜ş¸Ĥ“dîRë.’–%*StïéPĜ@ğ-Žs½žÄíÀĤĜhŞı[Ví9(Órİ ³;ĜNĜ3–°ĦFĝ)Òü$è IUÖcœıħ2K8%@ÑbnĦ– O úFŬ&=²[ggŒd­U³fÍJ´ħ†‰İ.ëϰĈC‘h—  \bĜ!˘ĉúnl é_éH,ç\ĵŒĈ:éCÁ”¤ ĤÏJZOŽÜÎİÎ,|ê†Ğ2‘ĥƒG2ş˜UWzŞ`[µM˘p­ÓëüFĉj‹*dŽFıUˆ´ f,M|Äż=ĜĥĈž|–]LrkxކĴ_uŽçµv6Ĵ‰bKF3ċ×Ìê‹(FŠin 7öĦ|@˜uÏó;˘´Ò¸b• ²bj‚#˘n•vÍşŒÍÉ3@Se[…k7è an[_†4½›3À ı”ġ7 X[,ä*YŻÀÈ= vÒ´|Ĥ× 9Ä2QC³KµÙ=Ħ(0Úñ5˜r­éÀ°ë›ÀqıërÄ%aŞ_V ö=C[Óç˘yàŠ&] Ş3À Ĥ!hÊÒ }Ĉ7•l½á`\ĜXwKÙĜäğŠOĖö˜s°ħ`ƒK[ĉ#¤ƒ ³ç– ż6gÑ&(6ê„Ġq@xûžm°1Ò#eLÌó‹ĵDlFĞUC` %ĜĠK R)eùÁÄ!Ğ6öqÑmÖwıoš;#ĴĤ'%r µ‚ˆt§Ô9e'€ihx8"é°ë—PAì0@g*ŬĞ5qb£"§—0^İ~*Uèİ›“KìE„݆ü„' 6@Ĵ‘Ï”§£gŒo‡HúÄrŜ ³a׃/i°JÈ;V•qžRŻGúäR6WVä цµhÂÁğ)<2<˙¸ÈT$-,ĝŽ ‹vœ!iĜöÔÉ-¤áğc€•à’k¸~ˆ)Z-ž(iqzéÄyîkéEWFȰ–'£*ïñˆ^tÈT¤6ĦeN#s:SĤp6eŒÔÊm†´jŬwd´jÚ>Ğlŭl†Ž€hSp'KBNn$쓞49&‡À¤WöŬVšäÙ2™ça Ħ¨ĞËëëÒëƒTÉ‰Żŝ6ZHc=˜Âàħ$?Ç!!ÙĞvî,'²é.ŸKÏjkZĊñĤ]„x;Üí§%†¸ êԝ7ç $&7ħ!wÁ=͐à}0 8Sgl5wMïYE‚ĞĊñ²_áûșcŠNnÂĥnG@‚ÖdʒoÍ]BÊäÁvĊK:elĵ˘nÁ˘˜5x$a\ħ†uT^ ‘¸ŒĞGmÚĉÁ½CipDâ‚pÁ9¸Ô–ˆž#ĉ­ŭ6¤×R”†jÀÄ QŠS#À–ˆ$›g ğ—Ñ ”zK€ž‹‹½İ—1ÇtÀÄ27ÊÏ£ûBŽ—£ƒÄhî°ş èLNìöR 䢝—OÇm’žÒ ŞRWÁĊ¨ÑúÇ@‘eq•ƒ+wÜŞdë7H68ĵ|.ŬËë5“Ħ™DEa•É2Ç++œ‚‡i¨QTUUŝ°˜ġz=­Ĵ1ŞvdNfÁ$mís×CEaĉħÚĦԁϤ:šV@³•kSÇp@KIÀú¸É,(jğ£a€ç9…ŻÓ#Ó!Ĉè2e"‹ħéY•ìíİ{^”ccĵ6ĵµA„Îѧg n´Y~ÀëhlŒu]OĵXì†ħn/$²ĊckOui˜ĉ$Îĝ€Ûô‘aŒ^^Ó0Ùΐ&U€'Ġ³Ê ޽ˆ5Ÿ#Ï #ܘD5›žb,) ‚=kÀi€#ı)ó#ŻĴclĜ·ñƒà˜µ,ÍĘġ[TÁxv€ËÁ8ĝXOïíÔ)—… î}6EQb!ëcâÊ1,V°YġL8 íFĤèEĉÍ _ɘÀĜŝâijíâÇβÓfv‹ĞKġ2gküĤh·ù¸p;Vħŝ„ƒĦġê­lcyµé1#mÏzƒ]Y’ö² `XÍÏêœî—ŸùÁòBza*ġÒ_W§_ĦhÀ¨Ë0Ö³íċ“ñ§˘5mú<ë#>q…=7˜е;ŒH/ŭ†ì½‡vÏQƒy%YÉ&&÷U)0[ÁéŠkG|,€îpÑO/FÖjß³Ĝ%˜ş`ż:ż/ `¸úĜ·`p"LçŜ˜yhï´Ö2¤_$ÀĜ ynDżx€ÑĠŒŜ!1bÔíô:îġêž_ÀÀKê¨şyüâVÙ}?ĦÌÉùRÎU%é—/ÁIċ‘Ùŭ(€=Ê`€=Ê`òĜ`€=ö(_ÀòìMœUe–eŻHžğtùÂMË~€Ĉp8?Gs{q=[oğ×ôt³|ßáàŬâÉXùv4>—f‘Ú³áeh–Ú‡7ĥZ´Xd€Ŭ/ÀpnÂâŻI8p \bĉ72l/q“÷ĵż\OknFĦµ{ĉXœı}İêZġ7QJ$½7sD<ö™ĉw…Öôû)Ç£”xÄ]ĵO¨›ßĴdŭ÷—#Š™À²4žŠ¤a;5{÷²ß0™\2ŒğC,é·v›òÊŠ €ı†1żm˜O6j¸ĤñsEoўĝ†ħz#ÉçFŭ–lµ8k}Ï+vw‘—O$D˙ÖĈ)óü} ˙ëI­uYĵ°m `ċùÄœlHÜo%ÀĤáİlì;Xr5˙·Ô'ϟR/<#Rœ|Ż87î™iËü[?{˘uCÜÄHlŝęS^]öĉÛ 0šB‰wiş€Ñ8ÚzQ^…nEN‹`ĞòĠˆ;Ä)ۘñ”­ronèMÇÎħ-ÚâZĴ$QԚÂG‘}ĉµÇj7Gücz6Žén~R‘N%O'm`ñY1£›ZŭgŞè´ƒK\'“nmÊxŞÂufyŠ‘ĥèarÑqŜemfŻÓé]ĝ–ÜNGô²ĴßÑĉ‹nGÓe¸È-W:&c…Z§§Á½;Ĵ˜èĠİ=ÙN×=/FU†½÷zÌ{ŒĉşWÜ[Òёƒ"Ñ$B¤%“dá@ïëÒ·`?Kî `ŒR¨²¸ĵúJXîĞÌD2L’•Ži•ıŽçI„ƒUqi#Ü9%yÀ³¤ĤàS½E½O`{ZZR‡aB#á7‘C8LPîn›P+`Ċ ^Áô7Tœ—l$ ‡²Ŝùó5¸Î|I~›Q•c,ë\˜dHë@aÜŞĴbW]dûúÖì°Ï’ŭLİÖÈü£0v8Ċ/—d˜aÚİÈvd$UrÒMY4²– ‡Ĝ†Ò=i(˜“`ÇxÌ7mv˘†ÏcŒŸ˜Kĝır]ġâ6—ċċç]LŽŻàšH2fdJ+ÌİŒj֔=û3RȤ¨ü.AÄĊ˘Œ,L¸t!{‰™WKқÔWż½ŭ„÷0¤$sš ¤ÄĜg6àX ‚ĵt¢^:c2əU™™2êıÓĠqHНȍ6Ó ›EŬ`<™Ç)²£0Ò‘ÏX†²ĵ-‘.6Şi` fĈ•Y§–ì3XĉÊȝ2…w!İÒ10kÒoÒÌ9V܂y‘ßb,ˆ²ğ˜Ç(÷d½ßp,ß:ìԑp—ü +'ħ| ·Âw$U€IQ5F&†˘ˆœv ³ÓCÁ“ĴJ;Œ4™óÏ&ÖÀ´Ú‹Ĵ†óΨĉı™ĠLĦŠTóš-GŻYĉœ„(§™ÇŻSlµcĝş'€e ›ä%£ıš j˘f§jQ0ܚ­k/]b_‘Lp‘“ôjI•ˆĴ!‘̄–ŠÌ@Eêô°Şw°`À‚Ş  ÀÒıfzµŠ\×˂„*2îœĈŒ=XÚ¤Co€$úĥ ñÜÀˁ,ŽÇ`Œ  <j ` ƒf܅`&‘Ñ8J“V^d™ú*"&´&D9>U‘zΟq ˆ*òċŭì °Ñ`Ô&2hm5^ Ó`n=TŞÈÇT,Ó[i訳I,ÛÖt:وìhóÍ· `€/ï$ĵï­D2ÈF F#[%n–# ·qYÑ-’•KÑñ[”`QÙs&·>…SbŬ-²d žU`•<‹dDş;Š&R?I Ëm8ÏħĤÍL:H†TLN­"m$JċüxÒÔcŒÛ˘ÈMÄ.")+8ŽEɈ7ŭĵÈ1şĈc]cŻÜÖĝœLżeK’}’ŜÀŻ3kĈö¨4ä8ç ñ(cÎs\SG¤Ŭ‚ٍ*Œ/\ı÷°{JŝàħċE&:‘ŒħİÉ-s0Aí9Œêq|èġ2@cgŞö˘‡ĊeÁ&MsˢüŞ96¤5†€AîÀUè$ġş^òÛ°ŭ1½3 †ŽQà8`3G‚QñGF‹ċ!QJ\ŠŠ_$lş Ó5îœhTĈ<š ıžŜi/î”!ïo-‘³šñÄl%,ÎÌoւ˘w1Ì|ĵĜ.sqמ1”Ğ!#;ñ26,v”š³2ctû3ԛ5]Ê8ùVTMëÈŻı˜Ú7`ÊŻ{XĘĵ‹µ_żîÑŠO}üSl{úzĞNċ;ĝ‰ N$wOĞt O#Ó´> ×VwċµGÂñ°MŸqUàÂúDżÂ^VÙĠRü§áĈ¤:â6Îş)pw¨ŒĤ-Ù1nÚaLë-‘ÙżÚ/5Í­ë7§ WXĉ­×é· `áĤ)ĞğX™5[ž=Ĵŭŭċ#ÏS.òwQJYûúÙÍĤv)Êêċ½4Ż^šıZ³s}Ûĉµ.ç§2ğÇé:ċÛ q>à™#ßϘ]ÒĉÇóxïŭˆ½_^yd=Ê`òĜ`òĜ£<öĜ`€=Ê`òĜ`€=ö(€=ʧ*oG9ĈkûɸD8NôĜ]—҇Ëü=ёż÷)·WĜL/Ly]£&ZG”n'Of¸àœġXŬ~+}pğzf†ïw‘d|ìèb>׍ó,É*4“[ıAÖÏoşÏb[ı'ZùSµÂÒċf`lĴ…Ú1’ÛäÙI8qïj·`Çġ˜#dîÌd1Ġˆŝ>Ó§ GîOWÓ^ÔĈÙğgZ„L—ĤX‚ĥàğÉ Ġ~6uÏU ŭĠÔn/c¨‹xĜ`ĥkúÖeQ܏˜Û˜š !ê S˜ß'\Íd+-‘Otdaġ×ŝ`Ƚ£pşÛ“³ƒ­.úîï¸CÌ£×gKâ~#Ż$c$ħe™hÔ+úġLq­IĞN( dhDT>`S"/W‰OËÉ5ëP2bżtçcDX'äLúW:J½:| Cҋß:ûèÛ °B&FŻ–Ħ‰ġ^³…î‘-ĥ=˙z$’ÄŽ_ĥ5Rj­8c‹Gƒ ÂD+ëdÑxt 06‰œ…UÊ1ŭġ‘ëŭeí'£Ħs“ċKïÒX_2À’äċĜ%$l·Í·ê½À “ċ­…*t“ÑwœXĵħÄ3£žm1ĠÇ@ƒSauyÛ:0PÉ ½şÑ ŒÑàı˜Ż}lžLĵ²éêÇ>==f=m•ft£Ĵî}IċwgczÖ[˘Žè˘ıä*Oў¤ï 0hà3ÀnáT,Ĥï °ŜÍSÒI-Š~ړ!hL5LJħÚïƒMH?òŜ`2&°¤ĴhÊD^¸–v™ |ş_²²p:£Ñĉ–uµ€bhĤ >öXĔ—ğXùN TĤUüì2·‰ÎŸzŜz °ĴSêğĜs*& ŞĈOg€%Ûĝú CG{7AÖ!ÖíSzJ­$VŭŝqyJĴş’’°+ ^!£PŞkԙ‘]B€™éz]/_WĝköşR½gIKŞ$5kÀÏZĠP é@‡Ó$YȘ–jOĊtï`„ ·ÒeW²,ħë‚ÈqÇ 0SqÙŬ„}üž§cĠ&lîÁnqWVû×ÙكCG™âğżìĥz>]â‘ÂòXeèD~~‚X AïÌ 1 [üÚô ž3úmo­˘Šû1[ˆÖ¤Ç!Ĥ:ŞvUúŽÁqÊ+öÁL_o‘ajÙé œÑ†*Ŭ/TN[-ħ•#L¤ôË Ĉ+ÈғUı4ÇÜ^r?µM@*Ŭɵ Ĉr—È“šÄmV9’żˆÈ¨òhÙ·fxé€ë¸+ŽÇϽ6ĝTÜ"aSn’gD `œÖW1İŞÊħċ ÁsqY8*.真´2™]ÀI'Ĵk›eĉ´¤M î$é;,ÌiênäI ïe!Ğ ˘ËÌŜċ@ìÑGħ&ĝNú cÊé ì4Ÿ5‘äĠvUÜ+YyÀ„Ä)LX2Sş7¨>9É1Y_mІQŽ†×?àŸ‚Ú €ÒŽr\QXÔE˘âE§¨ĞDŸJĵ°K”OuħäHS$dİ,´ĈGù À”½ĈŞ~%Ö6z‘Ìĵ˘sÑ^ä`tŒqÇŻ²ÒÓX#:ÓcK›lH³Xkžíı5µŭv@÷T#™1  ŠÌ)Z&ÇöìÊה7Ğ6ÀZU„w:r^2bw–x›ÜSÚlÖ2Ûĵî œ*WuV'7˜‰;GĊ~†ĞXóLÇcè“>ƒ° —g·xeëïv ‘bŒÍé9:QĉHhˆl¸ @ZĴ„f…àË+_²pÀhrRW#”–I¤)nĈ”îOü%‘K&•][ğ=7‹\K[Ñ(­â]¸âdÀĉÈÀ‹n%˜šlBÛjÚÉ1…w†d{6Ïè Šı8Ž3ot 0xùD§ò)¤Ĥˆµ éÀĤċĊ€‘ĝ£„gPĠŽsÇ˗4aYûç ĥ„Ny·úRÈ|+ĈOY‘‚ħ!uğŞ‚FġŒcä6aWZİmFIfd`×9ĴÙ\ĈyrÖ/œÍ(W­ñ"‘€&?q 7š™ñ,n_ƒhğ‘Šqï `'ëVNk60Lj½íĝì3Ë*ĉŸ˜¸Fò1Ĥ%QEú À$G‘˜”üÑÔixopµrĈĜ¸`_úÉ%ĤÁìí5é&/;“\YÔmĵHÈß!kV. wEŬçU¤–fEX›8ĜJ’¤Ŝöž–0O¨FQ"]ĈQލˆË‡-€íŜáäa™„ĴÀ+Ħ=…–é}^ż|Ĝĉʋœ“Éy­`K5l'ù"óÓ¤ž“£`€wP‘ÈE‹;y{ĠtP]S8] ´—Ä÷ÏĞ"IĈÎ` ^ħ1è=i[: /Rè¸Rv5Àٝ#ínYíÈèç— Wġ@K0fqy§F:ËĦ‹£ŭĊ˜˘´Xo6ÚÁ†L­v 3Ö`fžĈ`œv­-ÛNñÌÈ×ëö³ ×µĵóğġÑ+f<™—ĊÎZ…­˜<1²"XÀ2˘£ôíX.FЁÙv=Ĉ.pjBiO&ŠŜ³@v}íÛ1 -IDAT‹ñtŬÁ 2)ÊÙİ-_ü,è6ŜH’Ì亇 > YZ-ïuV€…Â2ß Ìİ#²°öoR–èá*-/eşBÉĠÙ²w@UŠâEÙTGxNoш´Rı‰t Àž[' ŜÏŝÛb޵Ċ–Âé:ÈgŞk{ _bp7•ñ†ÂĞÔǸ‚1Ôó´°ÜÚívv[žç”Ŝ+À83c³˜1–O żG6k³5×C!r’mz *µÍñ½5Ŭ`+,Ë}‰ğš –x1Ż Ñ'“žÜ[£N„sÎVp1ĥ4ÌÊgQ)$™ĉ•C$8Vr{ù˘eٜ8qYZÈc6w”Ĝë)<żbQ) l"XĦÛżh¤Ş5žNu^Pä†"|{@ÏomAf(ó*²è܍Ž(²˜ p:‚h9ĥŜ˜§³:µ¨ I!ŻÓµYWyëöAqÑólĈĊ=mŝt¨N‹*ÖóÒħĤipGŝG>5äŝí œŜ(ʗZßKŸŜğQ”îÌ+XĵËRÇ⁌-ü]ê–żwVĞ•ŝʄÍCÏóxĜpïÀñÌgp.ŜŠ]Ç‹ÎġĉRuYĜ lÜ:ÛĠ:vüÜ Ze.2ŜĜëġ\U”ÉÜqĝәh}ĜfâÎÙşùÒ[/Ċ™İJ³×5ĜŜEkoŭ܊²X[“ĊڙLàŬ‰½žàĈ œ2ï+§bNrÍfK.?2Ŭ•^˙ìÚx½eûg=‚-ĤÇcĠ‡ë§Ċ9ëw/޳:ßWu”})ûû?Neĉn﷘ѣœJh^5Íf|Ŝ³Ü'WċĥʛÊijíŝ~‹I“GiJ8jšŬĴhv÷ °xŭĜÛKüï `…Û6ên{kżBîà˙6ı?€ízú,JĉC‚½µ[ƒ,ÙGôèew°d*éáŬl×ìíú1|ĊEMB›áĝŬŞHżóP‘oĠY²;fé6M“ğT‘òŝžm°zH°o° ]¸Úßµ‘˙S|ÓvÇaŠäh½k€ëİ·KO{žXN?OÉMUUğ“KqÜû-³É£œËüşmZ{‚çö(ò‰Ê`òulµ\}ŭ%NçsÜÜŭġâ3Ü×ϒí縯—'{ë3ÜwS´ö9À †ûYâ~ŽÁĵĉ†ûfy²ó>Ç}{ì°ÀûH€Ev’lMÓĵ´Ġ:è`·~x7ÓìèúwĵJbӌŜ`ËÓ½àĉ üĵxĜŝşuĵÛöĵ­Ĝí%6ğ֏Ġù•‹ìg6~H j€íĥĜ^ĝ‰W€fšœ/µÛ`ˆÔ4ǧO+qLüâ„{ĝk²ÏÍ7`cy$Ħë‹‹çÑ:(ÛäÁ3ĜŬ\ÒK†żÀfjúV%Ĝ²ëzÉÈu/·rĈ­6Úĥ °•*ßlŸĥ[_;żğáycżŭÜê‡l9öZ ğ4“m6—: ˙´>Ü>Â@W2ÚÚ°ÁíôÏŝ›*Áö&3Ĝçq˘Îux>=Htß2´QtF½}⨓#ì^ÌCĝÉPċŞŞ êÁb'{mFÚô;ĉ°Ŝ݆˙F w›î€­ÙÖëkX'Ş.cŞš‡ƒİzġñ&ŝ„ok8OŞşM<Ġ”áU¨·żU‚ĠŬĠu²ëŞ3|ï#ôÔġê;z8T(ž¨30[)°ù2™/÷½ĦĥOä‰ê|8Àfì9‡ğV×&B|Ȥzŭ c/lÂ*1ù `ßÀ&vŬğ‰yXï`Y´ p ӆ0qö›ĥħ Á@i.gQwğM¤ayĞi²šFÂ&y7€Ġ*rnš<“W_9Lħà*ċşf­PTĴ crUmàFtùdìàżwĜvçö‰v˜ĵa˙Ĝ#iôöl âËÖ÷[I°lħ—,…ROM> `ÉÔ˜¤ŞŝŬƒŠ„Ï³ŠŒ/*ò›°Ŭà°•ΚÑeOó@ =˜W7üÛÁÏ} ˘ì,Á˘Ŭè‚^ӄĈĉÀT¤3Ĉjxg€ġîÀôL­%X £ĝ ˘÷˜_zܗI°x_?l ×t-€íPE&}Ġ‹^`îDġĊΞœ5\óyè=Ğ"}ŭ 0½öÔĤ9b›˜ÛÄê™ĉĥĜ´ö [›˘,‰^Žßmpt€íÌúûûŞH“Ù÷ĤÉT¤?ÜÈ?­€İ&~…âZ¨^]ĴÉğ,4Mx9àœtßM;m²ğÈ4‡ `°Ud²‚ööc-!Ìl‘5ŸıLdl¸`3ĥŝlĴV‘ìó› °#ş'ğc'ş;=5|_, ĝcŭŻ\…aŭ•Š=üswû8BϽŭœË6z( ŜĤN^aä2À¸µ‰ġŒuÔΣz€~ŭÏmĵÈú'ŞHŒšà4?q}’žëżS˜˘qDĵàڍPî.Œ1Vc·IvîâÀÜĥĜTÖ:*ŠPĜŻ+ÛÄÁö.ۂmİ?·ġĈ[U$~_D 5ı+Œ0İfYŸĉo´Îĥoħ;\óüġ*ÄñşÖë˘$ ‡ÑÉZ}Z?&’ż5™Ò_ž Ğ~M‘üıı>Ç3ßñÀ½|‹rü€Œ™X½½>öû:Êc¨è3,û –|ŽûÀ˘Ïsßmî[ÀvŸáy 0…Èĝ%MöÙçıo|ŽûfIxü<÷ŸçIĴ|5s’Gy”OTç+[ß=ÚáQ>MÙ ÂŻö ŬŽMñ(Ż_b{°ĞÚï홢>Ê£ĵzQŝ}XU˙?Ed *Ĉ0ÌIENDB`‚gamera-3.3.3/doc/src/images/tutorial_biollante_features_subset.png0000644000076500000000000001014610714675724024447 0ustar chriswheel‰PNG  IHDRš˘‚W0PLTE"4[6L[]ZVdƒSh–KjŻd~ğsŒÀ”–œŸ³ÚËßÎÎËċçäçê÷üŝü—ğVċñIDATxÚíŬ_ˆÇé[C;¸2ğ$ŠKk›ôħO…š8ÒŠ!}È]ŭRlâu9'gbÉ´…Ô”Ĝ÷hèS8‚É‹S %}IÊĦ‡úZ¸)yJé`RLhcp}Nışv}Ûù?³ĞĠŜJçœfVßu²’V+i>šÙÑêĉ§ßÎiÇB9'œ}oà—§o¤µĵ”ŭ·Thž6 úi-ĞaáŻrÂÖoše}0˜ğÒ_˙ŒY]é“Ğċŝ…Ğ~iìâ,ɇ5zz[–g\ùŽġ/\ 6lñ”|4ĜÈÍòßÁàIùÈcî‘ĠĞ`xuĥߓ%íÉkĊn[’ת[ıZusÍ}pœ<1¸vÇ,·×EK;–œ5XÍN÷ÄêL/[rгYVµ2ˈ{ċŞ,ꙛÊê`cÇcp•| ™oŞ(­†‹XżTĦޞy7Ïİ‚ĉeÍ^(Ŭ<¸+ûièÉ÷è9\Ğ9X_5½ZÏëĝoĉ{ĊBkĥÜĠĴ—/ġsz|ÏZÍÂU<Ŭ­ÎĦ#…ÖA>ŸšÏ~VKİ÷Ġ-í–ĝhnİ˙dK›ˆ˘=ş äï‹˙/çù§Ŭíî§ŬŝGmɲ•=ÌΉ–(v’Îċ·ğùލžsùgÙεµO?ú ֚Ċ‹'¸!ŝS½@oÜVĉWâ¸Ù~ċŝSĵ÷ÔßE=u·Äżó?[^Ô{_Ÿßĵtí½î–Úesġڑĵ3ŸÏ‹+×óË;ßìMä1u³¸X¨›Ċ[‹şnŽNpÔĜU÷ߋÏv·žËçO}G@2Ù>¨ĥ̓ËGòCj›Ü+ÑĜÄĥOòƒâĝ™¨İ™^@VMpÜ,ÊÛ²èMÔ œÖ½ÀÖY?;Oßâ4[/É-B³"Z™ĝˆûDl“ò9uÜä ùÁ×·r ;:I/°ZU7wdĠìĦ8kzQ?[Î7îÍyÚ"4Ù˛YŜé¨öבMLhdŬ,tµf½@é¸ısçĝŬz‘÷y!{_Ŭ_şñêö/·ş÷wï½+5ŻÜ?{C`^½ŝӗ7/˙âşÍzž™ä\ÀœÖt?ĞßïüñÉÍl½’ż˙“üŬżˆMrËsYvîĉC+7oż&ĥˆ ?­óhagî‹8XhrŞ'O ĞN—:bġNgétçÙŜİÎÒİC‡û~ïĵĜ"Î3wĉĊ˙s½N˙´Ĝ;ÜùvŻ3·:']]X]¨<÷ܵ,/ÖjĉÌsš‡5ŒTjä;Fˆ×pĞ1OĊˆ×0²n.ÜĴJuú— é#YġtŒ’†T׍|Ç(çCsŸlNCĝž5áqtŭW7Dµd˙:V\?èvUe%ĥ-•³ûè†MÚ҈éSl˙Â|ÒÍI÷:öċ·;êz”7\ñTĞĤÓwOôiÌĵ·}š|+ìëÛ20Û/NrÜìaĦѝ ìċyZ!ĵMœCC 4@ 4@ 4@ 4@ 4@ 4@ 4ì‡ĉ£ïŞ-š`ŬÍM™ĊçóÖiϔê ô5Lü#\ˆä•´4&-2:¨ "k†ĜxĴ´4S3Ĵ=š–7„RxI[ àÓçi8‡†h h h h h š4³ËŒR–ŠfähT¨á)iVL,£œê`™ÑEċ²a*Ûóéğ˘×l˙܎IĞp3:­ê†Q³FQAM4Y×ĊrĜ!vÑÁôöt47f6–ƒé€Ġá4„$¤ùkv½k£|óšÄZZ–9MĊq“šĉAĉb9 }šÎÏĥ§Ô§m‡Ÿ7qŸûéI‡FÛ5îyZÚuƒo@ 4@ 4@ 4@ 4@ 4@ÓTÓÒX3Úİ”ĴĈ˙†½U5ĵn†<µK^cfSjÊüp´yş, ‰µ4ÁAƒÉn(3İ ÒԘ0jËÔĵ[Ñtóilù–fj†Ĥ|ÜèÒSÛÒԘ>Ş>M‡ĈLdKLӎsBb<ÁC^h h h h h h Ĥj™İ9VXbšúħµd5&ŒCÙÉ9ìuê£Ĝáhùóû0ɀ½ÎbÈ3fÔġİ\h‡" <]MÎau$×Ò V¨Ŭ°ôŽ›rršäqCӘéÓTTµQkiµ´pi׌1éjŞÎӒĠà4@ 4@ 4@ 4@ 4@ 44ĠÌP,MNSˑĤfEŭ†û`u)Ç=Iz=NJ â°Á&#‡M4”FÍħâ êİĠ™c !Ä ¤ÖÒü+…şáñ׌U7nŽ•Ê––šĈÌħ˘sŒàRF¨¤×§m·?/ÎÓp 4@ 4@ 4@ 4@ 4@ 4éhÚËá&'1WX:šŠÑ(ZV§‘ó0ƒ ĴĞ´&9‡šİdú‡àxsE‡˘‹IÌ,‰h¸0ĥ³x0?FŠ3°NÍü*VCHš×Òx!OL3ê¸a ĥ´bŸf§‘’‘j”êÙVüĵIĝ\sĴàh h h h h h’×´8–ƒ.RԄ£QíĴ˜XêĈ=£˜}`2ÉËΧa‹Ĥ“—#agq6·1òr=İJ‚Ÿ—£”*%͖ĉòr”ZZš——Ìâ“xŸ†ĵ8O944@ 4@ 4@ 4@ 4@ 4D¤™ĊXż….˘Ó4ŠċHJSËAԏ×U†uŻùĦ{̚X›n@ϵ wÑÑjjb9TÖäM˜nˆ=Ĉr˜kj‹ı×Ìż§Ĥ>–ĉLq:\òŽHëĤ6–ƒÉ™—8ġM,öĤ>–CġiT÷iòŽèû´ÙˆċG>IMƒXh h h h h h ™IMûçXñ‹żĦİhê~YìĈ“Ó¨XÊÔ(­œMAU Ġ30˘FEĠ­D4vÀYiìˆt8J­Ħ‰h̘4ġ3_˜->ş#U‰ä2fÈhĤ>Â&\K,ĴžšĈÖPé¸! ĥ4ÙkÉ2ۖĤû4ËaïM÷ó&½sQš#9Ë 4@ 4@ 4@ 4@ 4@ 4T/íċ0ÁÔ­ìs˜,~M05JcŻ'˘‘y98уèú'ìÌeâOĦ~Ó.×jÈzг4ÏËĦ Ĥœ ,TÌÊg’#/‡|‹h¸Ġ)ÎÀÒ8/W 8Tŝ ĉ£7ŒFfç N3½XçċàĤq“„£X7Ü·4>ĊXĈÈËAY1-Għ™ꎭ85&/‡êӘKËá2q¨jQ}êuŸ6CsĴӉb9 h h h h h šŞħ៛z„ĤĤñżún“FĊo0óÛuĤc7ÌÜ*”%X7&PƒëÔÏ­Â(MSŭ<1áˆ;4ìq“¤f¸Ocfn–h¨hşâlj2Çdçiİ× @ 4@ 4@ 4@ 4@ 4@MSMğçXaikJż,nfĊÌGÀˆ̍bò 5&/G˜{ƒD1ÑĊD“—#˜Ë56/E ! j\^޲†&Ù ˜ĵ²7óı7’mi6/‡Š‡5!)iöi3”—çi8‡†h h h h h šĝ5³ËĦÇÛFÜ£Ĥ.–CJ˘ŝÜ[,‡ÙċvZ=Ş~àNĠŒŽċÂí´*~’•iċÙ[,‡œÂOĞâ'ò Ñĥ´şXC f] §Œ‰µĠĈr8 /M²mKĞ‹ċšà¸á17uħv[ĦO‹ıË1ŭžÇËAS4>O‹!Šß h h h h h ĉqif)–C>8Ĝ’x,‡bO¨nüì ħ’&§Ëá4ċXUp–X,ǰ† žR,‡=n*b9T#ÓM0‘XŽ‘Ġ1ĤQ<•XĞ݈ċ0O)–# Ċrèϛ¤b9rÄr¤~ž†Xh h h h hf^s<öe–ë&òâ£nP7QÖMäħcÖM9–C?¨~¨†Ċ[7Ġ£QħhĈ­/ v˙QJ ç#£úsIÄ:ÒqϰnÔh3Ñİ+ôpğÜJôè­żäûË1iŬĝˆ úàĈ9m8‡ğœĉÍë†Úˆ £1sĴ46¤cßZÚÄuCmĆki|¸nL„D¤ħǃ¨Ħ°ù9VŞ[K¤Oóñ4ÄĠş^Ş•ĝû´6œ ÔiHl³-ÍÖyß n7›˙› 4@ 4@ 4@ 4@3%ÍÇo޳ĵğfĴ½Ħ£!M—$4òfË]İ1c-ğ.ǧĤi¸ë‡JӐžˆĉQ£}˙ 4³Ĥav֙]4¤ük£†šX¤]4à5*.§"bŞĴÑĦc*öMe!ko˘qħo&”'V i¤ážµĤiK#–ĦEĞaM[šĞ›˜û´]{hĈƒ&ÚĈ~Ŝ°&Ÿ7„Ş€Ċxû4œÙ@ÍÌiŝÜlњ˙5Ûyjšħŝfŭ_9Úġ÷4h ÙMĞĈoöch h šŭ|µEšÉç-Òü€Ü}Ğ5˜ü‰Öhĉ$żûŭ–`ŝt@hòğ¤ˁ<˙?U×ê –„IENDB`‚gamera-3.3.3/doc/src/images/tutorial_biollante_start.png0000644000076500000000000000746710714675724022415 0ustar chriswheel‰PNG  IHDRš#x0PLTE"4Z6K}\^[Mk­]kˆj„€ŻŸĦž ³ÚÂÊàÊÌÈñÄċçäçëĝûŭü ³Ú…ÂIDATxÚíŬíkÇéĞšŠžzRÓB1 B~Ñ~Ħ7ĦFİ[%ÍGAjZZRdgµp ôiFÁ …–4ÔE/*^ä…0úĵİòÂ`‘Pż-Ĉ'%2=MçqwvïqWşÛ‡|Çòžnït7Ÿ›ÙÙ½ßÎϐr$ÊáO~°Ĥïü)§ic³oúš îšÉFNÓJÍĉğŒ<ùĉÛ&ŬÜÜŻ{—×Ŝjt]Ì45‹zE,-ê›^Ħ^tĤÇûéMmnŜµùw²ŝ!G›wıI_ˆ²ñŜô.u^Ô½gáĠ½Ċ 7-ö|òLü•;ı(›5›Ï›‘,;Ğ_ 6×›ôŸ››Ġĝеż—YtÊXßÔáÏşĵ|<ó›wOm>?r³ì~—|#Ş/Ô£@ş ’ĤXİ4Ôoġ^žú@šżĈ5ê…z—ÊòÓg^äŞ<Ŭw‚lrs[{êµ­“éĊƒP5îÍŝtĤvĜċŬôoİ4îgÒĊ³v²ü³Ġ_ċ‡*;üÚ·îÙĉU£izmëôúJ¨œ”¨Ëü½:Ÿä'KâOş×·şhRh&ûÍÌŭù%ï'^íżO§Ež^y:î­}°ĝcOe{ŜĉÜfZŻ[ 5aĊäj]ŭßĦĝßŸu)•—•¸ĉÑòò²Ġ<˙Í#ġc[>Û Ÿż­ŭùْ7íĠ—DkÇżĝĵĈOEQœnĵïԞŠ6ĉe~˘×½Ì?—ë…`뙷uz§öùñ‚|ûÔóĤkGÇRsµ~ıÙó}ç{i–ßX~ш;âÇ´3½‹Ĉ|¨÷ȧEžD&¤Ĥ9ͧy*òu‡òĞZó·Ï~wŝĥ^··rûŻsQ”kÍï?wR;½ĥä-ĞŸUċßÎëÓŜ‚Ĵ;5‘{ùWċây>YèĵÚqµşeÖMԚâéUOı—ĝEQ;½iΧdÙ6WߏMžÔš=ĞDğĈT'µZ³Ŭ,ËûN+ĞŞx3µĉġ“ɽOċ–p¨óh&dŜĊŭƒ•Û_5ëŞBSµ_lÊ-Žóé˙äróĠCÑ Œ\¤X^ÖU*Ĥ‰•ÍcY4ƒĥ[ÔkÍWĊ†!šáú+ÇÓŜÖF­ıĜ²9—yŻ5_9çSkŬ4ި}ĥXİĴ6/ˆÇ&W˙ÒìùôÒÄĥ›ÇßüXàµgĠfíÑò/O–DcĊßżÁ§j_ĵsRċ—ÍŜĈҁ·×í5ĥ6Ĵĉµ'UËĈŸ;-ĵ¨`òħ×x³ÇÓĥĤ{›–ìX`Ÿnl­x—¸¨—‹/œ7Qû’oT÷ž9Qtïœêu˘MĞXhÓ6.~*ÛìÓêŜÒB½öħ·ÚŞĥŞ?âçX í /~0³0U÷&ĵúĵÚ˙‰;˘ĉM×*óĠùIħİx•ùJ:5QUëÄSĤWŞâĥ.Y¨Œ/Vä~wz­ş(÷L‹•êJufÒĥ›qsNÓHġe`µi ŝoġ~ßìׂßDRi&ż~Ğñş³¸½Ğíiġ3~ûiŸ÷­Ż ŞığkÒGòğ§úóŸÇ_<²¸Ŝh˜E*İ îKu}7ñŭĉw6Ÿ7#YvVKûEn²Ħŝüŭè",÷ŭ#‹ÁÓġîŻâ(â9Xàğ§Ö¸ç›£Ò#É<ŭ^êuSRçġÎ ´kŠ|–Chŝĥ›™×“e_{{€ôyN­4ɇh )ĦĈ'„ú,*#D?dVÓiÚ3ì›û~ËĈ‚Sñ¨ZCÄ*êˇ¨|ĝĦ´(ß) !rġ)QġM=N ħŬtÔP­Q?ÌW˙hajšOH Uèiœ‡:jòŬĥġĜnT›FÏ VÓÜ6MíoD›ĉSĞ1mZqŠu¤PNü²D{”Ğlp 4Móp·é^kÚl·THÍUŜ9íSÓċÁÙÁS4|à´SÍàí 4@ 4Óĝöä-ƒ†Ú1 !c&ÇÛâ˙˜ú§~ыíĵjÄF¨OÔÉsj5c6QÍn5íѰ G³MDíÊBÒ˘ÛğcrċöX[ŸšéÁÉĉ@#2ż-dQˆ›m}#(Áúüµiê<4њ°ĤU2ËJ#’ĠXen[ ĤħHM“"âhq4ıĴi†ÄĥŬ€mïšf`[ßÛvÊ,ûĠe+ñ6-ÜnŒĈl7c9Ŝn: ÈZĤÛ4UT´i‚’Ó6-ñ‘Ív‰ŽÓĥKÙ%c8††h ÉL3[¨ÔG³Ç‹”ŽúhŠ•v h h )‚F]ÁÎó‚Úçŝ5>3× OFŞQ]kò\´ş‚à, b^‹ùŻ/Jòe˙\ĝC ²Ž×´˘{DÚD‚>-ß\D}}Y’ZŒ¤ۍĠœ­Šs]ˆÓ ÉF£QïFÌ6¤Ĝ?,ġ†´4Ÿúç¨!QÍhĥıż‘ábAİوÒk˜êĞ“/B˘e3˘6mdİLZ*?¤Ë_q 4@ 4@ 4@ 4@“wé‰êÙ#ĠĦ¤3}’ =ÙġĴ-eƒh²-*Q=`òӑ£:ÇUŸ4‰>ĴΌSjtˆ„#İnTżş&Ç}Ĝ}B‡Ğ\”MA¨6Ÿ.Š'üu­£;dò¤Qŭkj,8ÒG£žIH5a‘0Ö[cj+ˆĈŬnşkò[6ŞÑòmEŠ´iÁ,Ĵi²'½.ûŭMŸ”ûbhüRiXŝGXÂ144@ 4@ 4@ 4@MŜ5ÎÜ7´í—„IëT§HGwŭóҘK^äIjšĦFžu6כًĜŠĞ1—•כєÓ÷X< ŸŬvc2O;NV”F2Ó0= –éRIÈÙ4şj°šĈXäz3˙l­€ê·Îvüsİi™iˆéI 7SCĤêôÓŬoêe2Şi8²h h h h h h š5í3ÌwżöğÏ+g™˘ĉöPÓ/ċ"–CçÀWQ)LwáŞÁBġ=uc‡\6ĞòŻĦá(Ȍ1÷ž{ k„^š #SĴĈi7zYħ\èŬgĝŬ\DĤ„B\ı§nôËk2ŒLqʆEʆĊN É(–ÌWÚVÓühM+ŠĈWa):´†èl;m37êBoğÊïżÉkdJîŻ)N ĦÒd1TŽ:Ħh h h h h h˜ş†½½ç/d=YÊĊ˜)Ĵ³&ù+ç#–#˜lÀFì–Ŭĥşg9Á)yÑP;!·MéñÇi˘áSr1fŠ‹À>Z;ùwÂA-ò™bĉ"P½ü„Ä4 †OÉGdJ8<0ԈS6,&ğ1Sşn7ékZ†cĤP=A´MSSĝ60eàŭM^"Sr?V?48ê„h h h h h h aûâg6+MĴÏYuĊ:-uúíÏĥĜŸËJÍ-Mœŭx:j‰WšF…˘äl>A¨ SsŻÈ§ ²ŸµĈ%œĦDuı33[I‚•l5Ál>6ÇaĜ€ …˘ÌO0ż|ÖeĠ¨Ù|BŻ‡³<@%W?V6f\‘Á{ĴsĦ!:"McbmĠ´ŭك 5ÁˆOşM£ĤM jšiÓlĠZŒñVĈÇTš”éáĴ›<Üjş7ä£ÎîĤ£Ŭbk˘ŻĝJI4J¤Yg·Ë£y˙¤ĉ…[CMë#ÑÜV˙J˘QEÓAM‰ĈM94ÌMiĥ›’ío ÉßqZäŬv ~œVchœU‡h h h h hJ¤ÙÏPC⃝ùôl#ŽÈ8ĠĴ4~[Pʙ:ÊT#£Óˆ™HĈ¨²ƒŒu,œV†5ÙáĴ¨"d–âÉR£ ¤Q͙"˘2Ġ˜˜GBJ ħñzK kZ‘5á{6$ş¨­‰ĥiu–ÒÉtğÁ‘ÍW@ƒ(UDĤ J5µQވR…QވRE”*öž%Ñ JQŞĝĥ 4@ 4@ 4@ 4@ 4äW3;—f֘Ĉï?çHĤÉÛ?8J3kL3@„íh4-ÖJ1üb‡q)Ġó&Ğ)o¨yD‡[s4ÇÎGCÌLv„K;ĵjĝúô£ûsGç¤Ħ&ğ~l$RIM@î5|żuŽf&éVƒrìT­Q2|Më|5Áĵ~0Ä­-5:ŠVà4ŞM£ÑíĈŒÓÑ ß3;×J1k‡ŭ™Ü×ĥi2ëfìTŞ&Ĥŝĉ‰?àiaĊ‘ÍWQ“ş³ŭfjáı­µ½_\Úlâ’yÁ&Z?\ uÀ¸u¤ßïÏŝxGöĈÄmğʃeqïü‚H~M€…•l´Ž| ô‚Hñ ú›mà7´2ŭNÜċù_„wÓDéUhoûĥó˙ ?~áíúŬ¨íâ· aÛĥĴm·Ù¤˘Ùr˙-PÜ[çġ~ë wéÚ·~q–ÂoÏoˆh­èñâÏéUhKVħÎïÁow‚‡7>/A´l¤6qW9hİh”R€9@£AT@ëÈ)´ŝJşôĜÖnûˆŝîê÷ÖÎÇúŬGûÇ÷ÍßŭìüwóÂjÇü—÷ż´u0úßΟì}ĜoëL~{“äB+7½mqW9hû÷î- hż?È ñ÷Á÷ B;ĝDŽC–ƒf³½üÜ~ç.üY²î˙aôî×óİú}éôıŬ˙ŝ/´zŭûß>šß…hïíŝáÓÖÁ½iµ]ĜÛğñÉŜ› ÚÁĥûmÂ˙~$ڛ{Ÿ”Ú÷óóyŜÑ`;8Úû/}Û :öÏŭÒ! ŭÔÊ_úËùŬŜÛ=ğğÔzq˙ĴŬĴK_|ĵ+ôìîĊ_w[mçÁÏçG.ìÎŭñŜèÇé H™˙^<ÖP= h %˘îÑhûÂóÌħ–nží­íÖµÑħtvqU¨íúÖŭKı°ûġ{ğ°Ożùû_ h­K_|z€Ĉŝ_;ż?ğ{céÓ½sKBİċÇécí,¤´_ï?8ló@@k+lâéĉ·ïaÎîŬÛoµuì{hçÒÀ˙]zÑÎ ´sÏŭĵpq˘½I£ŭġ‹{~ï%<Öv݁Oö:€vP!m™úÑÑĉçiħB£‹9-˘ ‡çAĦŻh9ŭŸ³ÎöĊĥŝށġoۖĉžŬış1zz£scñ\ô×ȟÑê?Ĵ?>wzÖħĜöùoïmĜú;6µv\xŜħÓĥÑĝ§Ĵƒżíô)éäÑ\ù'kaÌ]ŭVk‡ĠĠߟµ[]K­VW{›ĠÙfuYVе]XuÁ?mímŭèè{óV—°ÍŒ#HûèĴœ§‘£’Šĉôˆî´3íNÑêĠBıÔĉ9t§R-ÛÈ+ĥ—F‹,žŝ%tï#ÎĞi$ÚÊ\HG0cÙÑ \ŠĜĠ܏pÄŞGXÚFFœŸGçÓ{ߟD£o„ż ÑW-ck|-j݈ż›ÏĜcíCٚûóEí_ 30¨Ċ0FÓ-Iê1Dá£e>$‚z£94ÇíâkpÍÍùĥkŻçÉu’âìÉz˘%ĉŜ§âkœ„c½ö:÷ÊMrkÎoîñmĠéXĦµíÔĉ ˜-îpŒŬòn2§žĵ t.µ&ĉMä–Ŝh–x:@éÍ1*6 Wâ:˘ñüqÄLéY‚‰M0—g^ÄŻD [—èĵ3Êy-FdÀà öío -jH3:ZĦù†KÛQ…NçÛí2ßâµB›)(ÌY£ ÍÈ ³ÉĠÀìj¤ĜWO4ž)ġ žhİ’h´J—ú˘ÚX“iŒqà@ñï4üuŽÖşBkġ‘Hĝöa…šyÇvVšcÀÏDSËtòOŜ5+´~m¸6ÜóäŬÛ?ġˆ ц$Èp=LcÌS ²ox“l9qeĊNzµ­ÁÙUÓɛO{šż Ŭ+”¨ĦÍ16şÓĝĤáf–n%ZêcñUŠÖ¸…¨_ ğ!Ú­ƒ %j@DK‘á>–hñ-ĉXœIk[Ħ·WíġCŬm<¨P3—Ĝšm`˜£Xzn8Gh‘ċm+´˘ĠŻ@´šJ SĦ&iÇ$ ñïsµÍrY ¨‰œXİ;Y?8ıZWì”Ëó-F=ċn’^£ú”ûÒş½€?k‘£~vô­èzñ]+Ô(ĝtAĈd/‡Ö3­ĥÍI[˜rhê§ĦÏÄ 5Ö…°émM¸žl\´M£˘Ñ†EL†E$hƒ˘% ÂĴZD9c2H*Rj˙QĜ×d B4ZR ċŭ’Ñ*°ÊÎ˙;´\)Žv–Gğ[³³:´SyŜ fJĝâµ`Â!: ŜĦZèhMYh–3ğıYÊ'­°ÛS•hŽ*ŜÍyov{}$H´ŝhÙÇZïÎ;ìßé‚M€‘ƒ6VŻ[q´§?z§|ŜIáì~FUÜBǔF‹Ûoщàğ%| y­âSîkMko Ż5r(‰Ñ0Fhí-C‡ħUb3ŝÀY ŜNry³ŜûċĈ€YzF%ÍÚ%£ ‘I2xâJ‚tĝ ĜžI2ôcèJ94ġKfı9ş>Ĉ27żs6H³[³sL´\FÚ,Ñà(b™!˘%ŞÚX…ÍàŽd43›\sÔÁRóş“Í"­ÔŞJ/µZû;ô OPáH…V{Ċä˜;Ä&Ż~h‚™.ùéÊŻİŠ– %_)úÁVİÉC£•£Â‘Fh £a4C_ú;â‚iWL‹à ŬûêÏäET{™9•ċ˘AgÈ,…ğ÷‘´ÊvĤZ´4“‰óN8x‚Ĉ^4Ä_°&-ĉĦ-Zn·€,ÒÎbÀqa8bl‹…}t—G;"£Şm'?máĵ&˜¤4 Ga7Ë4u3“§G2Z£èT>ÚlïDJíŬ',sʟ¸Ġ’ŝ2vD²Wu…FsjžB´ÉŸüËB{bz|Żo žúÑ+Ğ…V‹–Ê=Önۓ´ïÖ: ĵ TĦöi†³ƒÉiᄒèš˘E‹žr SUò™µÚcázƒ¨a}(ôKF<Ö ĦŝÊ8”Äh £a4)W%ŭ•šêò™g1Şrǝxž^–¨‘€÷+ކä3z‡^ç·iŜĥƒ+m:Ÿ0ĵ( …2#•ÊfTŠ£!ùÌŝ„$ı&û&éşòdX|Òçë)–_jÊ£™yÎë~ú*´ċpï3ÏÂ'aĝ„vïÈCSBQöîö “Ċl3@OVj…Š7ƒ8á-Ž–ŸQİ€ĈÑZÜ>4Ħ…S^Ê•.µüœċâh+µ|cBëîÛĴı5abOzŬ[5ôµÙ,|ĞĦġBË's£ÊgŞĦñÌħqT8òÀh £a4ŒöÖÉg²íšœÑg'ż]n6ΊûeÛ5ÉŜAh4TnKĊ³­Ğ$šr„ĝÈĜM+ bı™cú£èöĊ€ùAáuŞsHDóT¨9K£™{| œiĥ°[s$Pj,4˘y×`- mLû”Ecŭˆ†Ù-{ŻXĦïú4hĦcѨÀOoàu )hÛ}>ħlöéVñ)÷ùLĥİ„Ĥĵ7(=àWOZ0à×8öċ¤Ï ‰ĥJp £a4Œ†Ñ0š„Ğ’öÏòJ*†&aôÙċ]Ë-ƒvpDž²·^€ŸİmFjYúqyÓħ&~ħÜq Uµh'ÈŜ8I5‘=Âc¨™¤¤]Ğ× ÔLWPÚò’=Ú0h‡т2މ ˜¨•‚V>£R P(ġš%–ZùĴD´„hè‘Ŭj ­â´Ċ¸hFŸ] ÍÀŽ G £a4Œ†ÑÔ¸ô§\äĜTMš•'Ÿ]Sdò^‰‘‡<ùĴK]´"òÓ­ˆ|–*+ixÒ“zhEä³MZB²§ZŽ|Ö\ĥ…ŽĠ/Uю’ÏLŝò-tLe´"òYùŞ>Z5ò™QÑ´öLJâ £a4Œ†Ñ0Z5sbL‹ƒ|VÜFĞ‘ÏVŞW[$N÷'W>s¨Ù!ħ}´ùĴì\ċ”Zù,ċÓ­ˆ|FĞÙ!ñÎh5òYù’Uôö{8Z|6aÒMEùL/´ŞéĊ<Ş·|Ĥ—£Â‘Fh £a4ËgeL%ùĴìtÍċƒ˘G*ÉgɲÉ^ùŒJ%ù,l´"òÙ”êŒŞUù,A -[>c‰šŞ“½V•ä3`İş…öĞ$Ÿ•=éi€V|VÚZġ”Ï4ġX>ñFh £aù ÙgF•ÏFFU.Ÿ5–rĞ›ŝĦĞrùÌ\6(ş[ŭL•Ég'úT-µŝÊċ3żOU4g—Aċ³‘œŒ†’ÏúêQ—Aċ³ÜŒ†’Ï$–š.ò™´“Ç1tT8òÀh £a4ŒövÊg †}vd$6nˆÑgGv6T­ĜäĵŝhEä³Ú²x‘ŒÊ9ÂݜÑgu1#Ħ)3yqµGŸU;ÒĈ 1úLSo€ċ3Ża4Œ†Ñ0Úq’Ï>ó+aŞÈg×5÷.O>sŞ‹VD>a UğşhEä3`ÑżÔŠÈg J´j&oĵ£ZŽ|V~”˘¨Žv”|VhV|fP4A>3&šŽ<0Fh £½í£Ï$šfò™üîEÑ4÷™`ıòYL´"òÙDò™lkÈ”Ï4ı÷™Ĝ£Sšö÷>oÑJ>“mw#ZÉg ˘).ŸÉµVċÑ´öX>ñFh £'ùĴÊŜü}v]ŝµ\1‚\rĵÙo°uJàNhëË`ĉŭÀœ„Ÿàë“hġ›@ŻÓ~1"hfi3Şö‹rä³$i“^ó¤€DŬ$ıMÚğW€ıišì+‰VaİÉ@3ħœwŬ—t˜-ë(S°°;Œ; ™S,ŬĴ3š˘„Ĉ˘B27;ŬuÍ àUMq´Ê2Ş;2ÑÍëJ-ħċ…–€hô\ÉRĞpBYh|cßf m^J-TËw“OžĠš-|£(‰†j²Ìï_–'Ÿi‡F’v™òYvQ#ù̘Ž G £a4Œ†Ñމ|vµòñ˘d–/ I×Ç*ï¸#Jf‡x¤È)h’3ŞĥŠGŸ™¸ *qFğ&pY,EGĜh'XÎì2*vk–’&9£Ş -ZS÷ö`6j<´S~°Jµeİh’“½êÂÏ(sïµ[ĴŜ)E[hĊh—¤É+€ŠÛAÉGM}ùL{4-ĵ–ÏpP„Ñ0FhX>;v÷>Gœ9÷g À+ż÷Ù27#ÊgË@yĈ’´¸÷×$Êgd’;q²)5ËQ™doŽ6ÚAFĠH0—im’ŠĤÁ½Ï2h–D2âQjÜû Ħ òY-™6ZĊi ÷ÙñrT8òÀh £a4ŒöËgה™Ğ@>ƒ/˙îüŒŒ èş2Ŝóċ3h™á@!!²š ûddT™ĵ1_>k P ‚j ΜOSŠħoœĥk–/ŸħŒej*·n·ĵĉĉ‰£Ñ<òşV/Ÿ–l`Í1ĝèĉn·„b¤ı™S$+š(Ÿv&ˆJm&(˘ùƒ¨C˘?Xˆ6&ŻG¤òY|Ĥ×ÁM„gúÜÜû½5qż=(|•›ħKoĦA+Ï†Ö½ÉŜ!ĝ"í[M‘ 7-ž5†‚Z£ċXœ (ݧܒòÙE]gAÑÂ`ù E £a4Œ†ċ³R—' %Ÿċèhrä3˙n AdzŝċԖ\ÙEş|ĉÒİ'´Ÿ‰ÀvĝA2$Fı5ÊÉgı:šdù,AÚí›ŬÓdßMrĵ̑Ôd·ĝĠŸ4/µ|ù Ĥyáf”ì Á´ċ”ìŭ¤Zž|X˘ĦédhAÉÑRˆĤÄ|wFċÈg,3kß\a™9„v9¨ĉ•£KM‰ 3ŽÊ‘ÏĝĈÛ0ÙğŬHÁdof‚†.녖cüÁùOUùĴ´Izžr™h4jĵ{Ÿİé¨päÑ0FhíĝLŜ¸` ù,ï‚ĝ˘ä³<[TU>ğÖhRċ³üYèċdTŭ‹ŞÊgÀ tC+#ŸċOŬ/'Ùğğ¨Ş|żµ\q ­MŞ|VBe }ıh ù,o~ĈEƒŽ>ĞÂ`ù E £a4Œv|ċ³ÏŒzﳑ‘UoÄ#Q>k<27èTóŜgRċ³£;$މ&Y>˛´\,µ~5Ñ$ËgÉ£:$:ĠD“*Ÿ¤ÈBFċÑ­Œ|VWRĵğğêhä3ñ}­ÑޓϴC“/Ÿi†v<Ž<0Fh £½ċòقf£ÏR2ċ³ħq­FŸŸ(yU{ĠhRċ3@jŽ&U>OQò4*ç¸biKù,üZ?´2òÙQ/O>𣠚ù,˙†áe[èŞÑ$>ƒZ£İ'Ÿë•Qiâ °|†ƒ"Œ†Ñ0F;ò™ÓK>+ožEµċ3.?Êġ(ÒyM ù,žwĠ^z‡ÄEµċ³8ĴĴÔ*G“*Ÿñ~ğÖZ|VuoDġä³Ş{#Ş'ŸİŠV|Ĥš*£Ïu’ÏŒè¨päÑ0Fhí­•ÏäĦU-ŸI}&Y8Ó~ôYğBhÒ'o\×Mò䍃ïKͨœ v­“2y£šr“7ŜQMÙÉ*„ĤÂäÇUèġ§|6o‡DMĵ–ÏpP„Ñ0FhÓòYž}fù,ßG>Ë·.Ċċ3Şb>lëR\>+èżVaİġw).ŸMF4g—âò™R“7zş—Ï fAİpĉÁG]ŠËgıE4AS]>SM‹Éğ $Ÿiî¨päÑ0Fhíí}6 ĈÓ$-Ÿ‰‘R@vPô—™'½Ùò™`áĵŝ~2Ş3 Ég _ĵ6ñ8L5ñZ0ÑÒ=ÄôÍ8şĊj˜£ôAä3îÚvż€Ğ77K…EùŒ.…V*£:£œÄÍÀ´Ċ‡,7/{}$BssM'G2ş£‘é@–!˙NÖğ ’ŝ˘V*ÙSmÊtGmêÇ@ïäĞTƒ;qKÌïĤ~ôÊmĦg“Ï= QáÌÁç[/ĵîı@şµĝŠ>hÙÖMÔJ?ċ–}vĈ°òYeŜà5ʞ҇@h>CFÂĠ½MŒ& ž& Š–$³QKm0jİÎdÜf@* y­°!ÑÂ$2mÚo@›†h `uڀ6 ^&`P{F´1Éĝf‚01F$K= „›0¤Í‚˙·b˙$É28¸IENDB`‚gamera-3.3.3/doc/src/images/tutorial_classifier_glyphs_pane.png0000644000076500000000000006022710714675724023735 0ustar chriswheel‰PNG  IHDR`*´vèPLTE$&#0D,.+-.6#<54-43645398(07d9;8.J&D>8?A>ĤAEGMD,FHE0[+4J~JLIB1û?W8bŒ[]Z?`žO]Œ@`H`—R`};cĴ3|<"z{H`Ÿ_b_EwC@fħzZ[û$%Ki›IgĴdgdPgŸ²GB[qQPg§Jjİ_TĝMkħLr›JqµUn¨lnk›_>opĵay´\{ğpf˙y{xc|ħhŠdh}Ĵf~şŒ{gW‡¸Wˆ³`‡­~ymŝqĞI¤_c…żN˜˜‚„ŒˆQw„ l„Àm…ğq…µƒpġWV†ˆ…Ĥ{yr˜pw˙‰†•|Ž–rŒÂÀ{KŠŒ‰Ŝif“Œwg•ĸ{w~¸zŽż‰ŠĥŠ}ŝ‘…˙…’¨q™ż’”‘´‹h„ŝ^ĥw}—ÍU°·—™•‘Œŝ†›Ìz˘È~°ôvu›šŸ¸•ħĤžĊ‘‘ ˘Ÿ˜•ŭzğˆİbÀɧ¤˜Ĥ͢§ĥŸö Ÿŭ•²ş_ÌʀǑЭŞÌ|äži’§ İ¤ŭĞŻŻħİᤳÑpÌÙŞ²ÇÊŻ³µ²À³ŸŻĴŝµ­ú·ıĥħħüꣃÒÙğ½şĥ¸éî°|ĴĈǛÏĠŻßŻĊĠżÂĦÖĤĵ¸ŝĈĵÒÎÉwşĈÇĜŞÂÍĊ½ÄÙĝ°ĞÑIJŝĈÈĊìıµáĢÊÌÉÉÄŭÂÒÈÍÏÌßĉÔċ½ÙŬéÇĈÎÍ˙´àċÓĠÑÍ×ĜÎÔçêγïħÒÒĝĠüĠÖàÖĜĠĉÖżÚÜÙŬßÜîĉ‰ìßÈÄìàâßàáéüĜÓâäáâÏÙêìċçäääüçéĉòçÚëíêêìöèìüïñíïúċöĝñóô÷óĝġúúúĝú÷ġûŭûĝŭŝ˙üOûG IDATxÚì½ œĠ}÷ğ–T%AATO@ď>IkŬD~já'^ıħ³µġlĵ~Y:\ï#cÓVW½5€ĞKA=´ÈPrċ†1ñÓ¨!DlA9"’ !"âŽà\@Œn‘#˜ ŒD†ÌsΙwíh_µĥv}~–Ĉó˙Ÿ‘vĉœïž˙˙œyÙ­ħüÖóÚeĝ–FĈóĤŻĜù?bûi÷Ï·kù?@Ŭ…XĜħçùéëFW’íËğxŝ‘ûTz”,Ŝ62²qtddÍ­##[ölÛ²kdÓus£hQ̵û€ı{dx0w~~ïÈ&ĊÜJÁĈۀıi½a)47îĉŜ‘‘*s—Ĉܸ ıı}Uğ öyx;ĝî’ÍíğÄ÷zËĉv­İÚŝŻ/İT÷³~6ÁTï\Ŭ!˜m Ìaµı[[ş·Ŭ”ĞOĴÜMJċĠTŭšQôRé>Ù\ Zq90·ìÙ¸s×Țë4ĉZĜ°à›—@ÀPs zdBÇ#Ï?àÊöĊo|ŝ‘7NËúÂoZğcdhÍuCËG‡×oÙ;ĵvçÈr`Ù'˜›@é`îÚ²kxíÑÌM#kĦı ½7ŞÌµ#‚ıĴîBo92<´ lħ ĴnŜ˘ıqDxo†oÙ]² J‡ÁĴÉCאĵŞ~ĞÍáqf›4ĦŭŞż~¸oÖìĈvaϤÖU› }vÁÜ4,×ÈFĦ‚àêĤ]è½^U}°‚7mêzT4…Ş_+˜hcĜ°­ÛŞÍÜ)4;hgÉ\chhÍ&Ĝ#§T˜|ĝÀóíàÇQµè#Ïßë;€yú}Yï½÷@ñ˘ k7 oXıc°ùŽÁUkw Ú42¸r0·Û"› tŬšíƒĞĥ Ü1<°vû`˙ڑÁU‡—mT›+Ħı ™ë6 Ìuk‡ûA麍Cëa)\\748°”Ĵ‡ĉĉAP2¸^tAs£ĈìÍ!°şyp˜Ŝ܌J…’aT:448$l8¸yó X "mÁ‰4°Axƒ×àŜ,}³ün7×+ĤjGû…C€{$ÚIT#òlJ×mWŞŻA†A Ğ+w•bҚëP³m ğ4ŽŠ¨—‹ĉ–aXÚ›| *… ğníĥe{=jLŜĝüĝ´ÚÀıOCÒ)@Òy}ÓöžĜgÀ×ĉ%àç.ß>°jËÀ’ƒÀè_ğMe‚=Xµih`İXŠÌÍKAĴÜ6֚°Àé[&–ŠĉÊa` ôCTß²!Á\;ĥÌġ½y`Ċ2×mïÁ~`‚%ƒÂ˜+†„ħ´èàqXò“cë÷ßïäq€ÑÉğß=J úĊ·žïÛŝÈÉOï€EƒògÑçǞ^ŬÉǟF?{½´ghŻVmìè*ሠİ>*pĵŭÛ¤*X…Ş@1am(ġµÔ×*ħ6W7ƒúêlħj ¨Mh‚ßtภ,Ŭ„š­ı`.³ö#Ûs‹Ĉ\*”ÂÏk{ݰ÷ĈöžĜÇ4€½÷žĜĈÁ +.KvġŻZ>Òê_²C4·ss˙JÁ\ħ|X0Á-ÙL°ñšÍŭèx·‹C¨˜à˜ûW­ê_ĥq Ù°hnÍµ›9ˆÌU°t³à‚Cŭ %À{°4L˙aĵW€éˀışsĜbŬ€`nèşqQ˙Óü;ßXw7ÉŬüïïYı™żcÇŞŝ~°Áfî úĵä7ĝşXtèù˘GŜb{£zô(³µŒ?_p Ĵ˙Ác\tòóxà"° +À{•¸W녽ZŻo‚}îW›‚ UP#° @ĠÁ ZµMĴÍÚÚÜÜżBÜxċĥŝŝċb]oĞ~DŜ´S?l§µ …R°k†ûQŒÚÑżµóp˙`.ÙJKԀ½§ì$H½ŽžRvĵŜĜóà}ê¤Ĝ†ô³·­?hġÒMV/Ù4°bùĥĠ+Ö ĉʍ+V݆ïA)4‡V÷Òµ˘ıqġŠċ‚‰Ž”‚ĠëW/[?pé*`.ۀ\ĞDslöŻZżzĊ*¸ñ|_şĴÌ~°ñĦt4WkÌġŭ W÷Żï~XÚ·èk,ûžĠc܏ĈÖßÊ_r+˙Üñġë`ËĈî>x/òGF·Ž\Ŭà·v;ĝĞ·ƒċ,Z½ï;kĈ†ûo½§*_şú§ĥ,hËE°ĊÀy÷†uß;¸kġucc·öß½gËİê–ğ÷Ĵêż{lìÀżċà_ Ŭ¸“hż”ƒ„ûĴ:Há„£‚[ô£AĠ§Ô×2U} ġ£êC•ğ¸BĴo8ŭ+7"sĠhÊĤTş­µ¤`^ úĜÎK…v6;ì6­Uöž°;ĥ=˘ìyí9ÚĜó[żóŝ{{öœC|-Ùıŭ —BsÍ+€ıtÛjh^şr¨Í[s“b¸téjôF5̍‚ ks|é İVîêKA]C˙ëÁëExŻ˙I[÷ú~Á܀šîR‚ [rĊÓÍßıĉ˘ħĉì–ğ!`[k·ˆ€qOë£[v?ä˘[N}ĈS÷ôŸ|glùÖħ­?úö²_ßú£ï ˘1î’ÚöÍż¸û’7Ĉĥž^ĥ|óñ7/ß ğûàž£×ìĵñĈ§ĈĥĈ—œ|cË)fññ7–~ïÔ-ûÎ7ú?zçàE+/÷ŝĥH‡w´_1ÑQ)Ğè0.½T<"ñ¨P­×ŻMħú6İJ7 Ú”[Bh˜ŞvÚ¨˜¨ĵ·ƒÜÖHÍúRÖ€\y•Ĝ{“vrÏÖ=[OŽëÁĜzߞ­€ğÓ°e ›\‰"àjñ~s54—s@mɈ`A|IĤŠ/d„£ĴŞ`Ĵ Pŝ_Ja€ĠĞ„ƒ\ÌU˘ [V°P}—PĤÍPLqcÑ!P³ñżżeñŞħĉâ_<} ‘—|ïĝĜZŝŽĊheécÜÖkN]ròèEKvlYû‹û–ñ÷-^q,Z (úĊÓ76ĥìáïĜóü‹AÖü‹À+ú‚lËĥ7ĥî?¸~EíÔĜĥÇ_!ò"°<^ŜzËG÷-ċĈÎ_wpĊ Àˆĝ‹°J4×ġЏjĊzĠQ ĉfqcċġ_Â//<Ŝebġ ˘ê[&Ħ6û…ĥfl˜íŞÒÙ\£˜ËQK‚V›Ӂ`GOzïôi0›Ž" ÀÖöŜ}[_`CƒւdkÍöŝ›„` sŻċ‚ıEOė˘üK0WBs¨u‚ ’L##sĊr1şp˜1lÒ‹(ŸıÛz%ÛX§$b†µĤ'b²2×K~MÖ ù× u/[‡2¤§ı£?[Ó˙tsñ·j÷ ÀFOŬƒèZ&-—Œq÷ŬqßVĜş7~ĥċ{ÀyßYŝ0ÑûàĈ‹oċ|Çw |ìèI!%/9ġ-ż¸dó·~|êàêo=òĈӗžD€ċñÚ}wÜqÉî% zƒ'd…pÏÀ%ˆB…bÜfċ¨ÖÉĉ*w.['TTAêt š¨F…Ú„Ġ7S}ĊR”ŻS_ĦaD´ĠĈ!Á܆ò/Ʉíĵ6ùfRîáÁeË%À`µġäéq€–;gÏÓZÀ`‡1Û0†ħ`tÚżt ĝA`\Fˆ+€ıJ1û×ù½dDĈŝ7qü8$›Ë‡àe•ˆшf¤KQ‚*އÄôU-­ó{´1ÌñW ĉ:4Cĉ q”ĥNÈŝW”نİ!§ë—0÷ĴşyÑĉ7>@€ <òŽ„–Ú9x°ı}ċžżì€ ŝ~lË/îXU{zÇĜŬüwvÀuêÔĜâÑú=+ŻùĈ*÷Ğ9ĥ{×Á€€ŭŝ–o\2:ĥŭ;—?=zÍÉoH€ŭâÔĥµ{6­€A‚Ö Hƒ¸ÏĞ„C†)ІÄRᨄÑ<âY;$W2İ6£ê“ê ‰*Xn 0~†WÛPKÀҕâ8üâ/Eĵ4`zĊTÚà6¸l“8Š|ï½vÀŜżtwìyä´ Ĝ{'÷œ<µnĦLŒĞ§%À†6mßĵ~íŽÁeh†kp`ùèàşċğ:™+w[³kp=œá‚ĉ.Àĉˆ`nGĤ<˙µ͎ Íp ‡×£ùħTšŜÙ0°~D4Ċé°aıtb™ĤuC‚ Ŝpvj0é]ƒëŝlñ·Ž.ËÁoüÙâëŽ.ĜüüÑ­ko]y.—ŭâèX˙Ĉ[ŽûÂò§ï[2ĝ­£GoÙ³lÇ#GÇĥ ˘ƒ?;èé£[—^÷£ìXŽ&ÌÀêÑGö,ßù½£cc—Œ>l0vôè‹ö‹Ĉkè£GïùÂÚ{V ğ!îĠşayG†4G5°ħÍLħ6vŞ/ĦAé&ħúĥ£şç'–oZbÓl‰ċ°F´%šçM·EžëÈÜ2 Ûxŭò½ƒë·lßNHòU˜ˆ€iÁıOPĤŝ lñĤÑDîá5;G†ĥÀúŬȄsğ›€ıi·f"x“¸ñŽ‘aĝY`nDĞ|*ĤóċRqNyx£X Wá[˜­Ŝçï·#sĴnSLaf_S:$Áç$s–€÷zŻIêò‘•ˇGÖ/Y2²lɆ%K†Ö/Z²q,W.Ymxċ’%k6/Y;<ĵ~ÉòċC`ıd9Ĝ`ɚmàƒ`ûááµÀµQ˜Ö_ż­ƒ"áċkı~ĊZĝ K–,Y‹qíFàß&ìè0ĜgiUÚoèAîġrÛöÑÔ(ŬÍíBċn×ÖµTġrkÀfÛ(4lĞv´³ìÀÙLĜĈ³(DŞ1kçĠ°UŸŬµ}çèM׀÷u{wmıu×ö-ûóVф{…ÒQÁÜ)˜›s›Ö”J·¨KwIĉö{wmŬ7Ŝµ£ÍÜ Ì]ğĥí@%ğÀÜWwK#…ÌŬ‚9şk™hciU|ìڍŜğĥ̑ÑïŬÂİG°ĤÚPüÀnÍWH_%¸T?HÚç]ÂNŽì÷íóöŬêŭFoqGÑ1ĞĞ@·‚ĥïíJċ ĉ¨ln‚u-˜›öiMacٙ׈ĉuğĥ&߸|n“ĜévÀpîӐ$vŜóÏ?ú{EÀ“ŬğvìÜ·wÇ5ûönıeïè–[ÑŞh‚ŬĜ;*š;Ǚ{wŠĉuà}ëŜ½;öíŬ)˜;s/0w]7ŠJĦ ˜£ĵNcŽ^'lĵCßŬğwtzŽîV›{ÁêŜ}Z–ŞßŞĠŬÈÜŬfî´[ZÙ+ût6nûĉ}šoWïèŬÊ^íÓîó>t€£·ŞrŞĠ1£ Ú§W_ğDSĴ\UĠï‚&xï6ŜµSlÉ[F‘yÖ”JŻŬ UjöëöîŜ1şž‹ÇÉ8ÇjǏŸ‡§ŠÎ£ÎçQéyàXĵ{çѝ×ìÛ·ó–}£×܊Ŝ;  Vwêš×Ŭ‚6Ŝ'›·ÂĠ}× ĉ¨P‚JGÁûş}ûFĊR¸*™ÊŞ^İv sĵFÑ’Ù+wTĜ³ÑQŬcžĝ'¨/e İrw^'Ô5üÀ-˙ 7 jŽĤĜÎÍѝ׍nş`ĦĈ䑓zàŒs€ÓâQ¨}r#ŞŜû´.p(ûníX:%ĞOÒ0ú-9EsTl:ŻïcßÑÑ%ŸÂÂÒhÏwf¤ġYY,Ĵ9“†…€aaMXŭ?oC_PĠ-˜àâ*nŒXÒhµZ3ÙĞÓ§ùÉİ|YÌjuĉÇ}<‘düV—îÂ&Ğ5XAĞnŒ…—Ċ$$„Ú+’Ñj*ϲQ`-ċ+,ċóU4E,K‘~_àdYĴ¤s^s.Y6 ĝUeY'•ɲ™,ŒöùJ,ˆVY €ù`ĵJù!ŜdÊUĠ–6FĴ>W%NùÓ9_Êâe]İ”Gó]ö’•ĴLı™x(ÛxJÁxÌA[Y‚Lyè)İĴZuR³pĉNÜ,‘’¸YlˆŒ€ÙȤıÒò—ÙlҝH{ٌ—5'“}ÀXPBÇCi–u'i6Ïy€ÓOZéPĴ=Dš ]`ĝ…ŝx·ÊB‘`ATuK„MÌDa}Àba˘Ù8‘`i‚(K€ù‚i,ÊfFÌL މ n–XıêĠ̟¨úo„HkµêĠ|WÎS­ĉƒ%şê ÉĴ—ġ‚0'U%Jcaˆ,š `è ŭT$Š›eA&äß` °ħYµŬH, ?Èê}ְݳĤĵlŜj-kżĴ`µşYĝq;,'ܓ£Èb:h½m€ ĜYż‹$İKY­4Ώ[ea6uĦbĈ‹ëkz€Y‘tç;sVĞ:çgüVgaÜFqá RS˙áEô'n܃aaaÀ°0`X0,ĴnVħ°ĉ@U °òÙƒµ@U–csdòlˆÌ´8n`-ùü!Iŝ„œƒċŠ³ĦDĤUcÓĤ@ ”ËċH°Œßa茁â˜îád’3˜‹&>ˀ•š’òjÀĝ³Ħ˜X–ċs·Ÿż>çI>{8uZc†ù4nâ³ ËÂóĜé›:ë€ÀÂeˆ ‰ 'рzL„I>J„ĦƒfufÁD"€Ep=ÁX< ˘ ¸Ä:K€U­Ġ€…ÀR|DìĴ’ĦŻĊB%(-A–ċéŸBEñ0Ï´PŻ•­U)Vl"jġ\àÉ3y^ŝÑL7öÙŒ%’:™TŻ„H`Áx8ʧ"|>œK˔ôJpÉçQ˜|5˘‘,RÏèr¸V'Zd˜/„²|Œä“áx7öYĴDÀ+sz&DŞË×* ŬJ0èRXaBB2;:,úħZ6P£a?s0’Òe@nì³X8êÍôPˆŒħ9°g1 “èÊJK`)”Ĉ·ċj6ÀAšáĈ>çs0iIq²TèŞ³ –+qċàR X=^‘{0³,˜…ƒÏZ+ Ò.°D…IbÀÎâ(2DzÑ^Ey°00°L€°H%˜pš„èD/šÙ\ĉÇFe$’²Z“ĦĦ“ ęH ÍH›a)¨gBäLŽƒÌHa8˘Ka"ħz0Y="ƒ‚ÁÒ+ˆ6*ÍVÑ|,ëôD[wŝîŜÔ<Û]µ|~YD„H ×BʖYĥ&koiè4²zΌŽ³™êÙËYôĴï¸iéPĊyz=ĜY ‘–Ëf²,›†€µtöÖï/guœ•Œž³‡ÓÙŬĴ6 0Άb`£‘ÒV½êK_úô§Éа*i·Û-`Ġ¤Ĉ)VMgĵ˘,ŸìĞ*Áûù݀фÏrzVguž–ġD×_!ùÒI€9m6— °ò×/˙Á3˙xم^W–³û²Ï>KĜrjÀòvß³j',ĥôÛ²jÀ2T­7ñÉW´„‰FċµŻ):Ĵނ홂=èĤĉ5`tîìˆĞÁp F_ŝÌ.û¸˙ĉàÇ?UËşÉw>xë­·ÒîŒXNtf$',çN 瓴0šï Eɖ|ĊR1Ñ8ġ_½$ë?jjÀ‚Mĝ†§ò2ó°³&°rĤìŞžĴAŸĊâu()F{# 9A:˙ù0ÚÖ:!`%ŸàL:˙ù7À8_ÁO#ÀÀËZ(äÛ+ ÀZŬŒ-ZÍÑŞ °F‹³¤êî˘6Dzš<óg_üÌ7ß|û· °F&Ӗ+fıÖ-ÀŞeÍ4ŭÙ$w9m6‹Ùnr)3ùwĝŜävŝé߃Ca&ßëIífò½îp:€3ĞŒA[­ÜòfÜžÈdĵ<UV fbÁš0Ŝ›ñÌ`l1Jòщ‡¤ŬÄĠ!2~ù™+ùöż?· +–ëÂKıŞ9 f4Ġ£Ts8Ŭ-À*YĤÖv.2ë÷™]ğߟP‹ÌƒÁ\ċo>e”s‘yàÌV^Ĥ+‹,Èδ °,ĝ• ™τυB,Ÿ K#G’Ïħ|.Dĉ*p'ċQd9<‰8ĵÔ˙ ̃µÔ­9wġÍ?ğòĊ7ŸûÄBŒ:ôRpjñÍ ïċÁËWˆĥ|oKĜU$=v*g*`UñQê´GpjNv— 3?nš˘E´êNiŬ3ƒQD²iouĞ›°&Ğ ġös€°G`b_E³òñÒöXB†Ŭ²äŜëŽ&x…ÓE‚'ş˜úTiˆfác:!‡%¨Ì-?UÑóİ ˆ° Qrz3Û~5…èl›+ĜÓŬUÊNÍ`żŞ°ÍzC|i{°wüĉğ >ŝÙ/ç;`-ô´Š"'‚/ÓÒ+@WF‚i ;J606@´ş")u–0Xü>·3äĥ™U­%ŸÙ-=£šñ|ÊïC¤_TëìħSEĴ|Ġ'Ĵċ:9×ğożŭĉoŸ{î׏ÎwÀ8tê•ċéBĦÀ7êÒıXǂŸ'£ö– §ĈW Ŝ$ùyZƒ‘‹“;­RX%mË]íĥÄİ<=ĥäħ `Ġt:×:…Ğ)¸ŜPT}Ġ'9!`‹Ċò Aĉ…"½™L"ÁÓ~/'fgŜŸÎx[á4×ğ2M‘+k’ü érÚ.8 P:mŝ)^pXè•ëÁ2çŜ‡G‘ĠP(ŝ ôHÀ°Yž,„80‚ 1|ĵB\wcñ­ç``üX.iF‘b†hÌI6‚3§„_ìĴœÒ{ŒŒ‰z]AbÊÎYĤwÙ`U×9íŻĤtŸ›Ĉê_€K{òĤ5ÑÚ(ë]s0§3ùŞ›>zTĵέ()]gÏŝYĠÚԏá,6秊Ò!Dö¨8½À­Í{°Ö”aV0‹°rŻ$âIş˘¨:-ÀJ=s %ġ1´Ĝ{ ġ ´üĥt :ΘKşéƒIW{ĈŒĴ/ĴÈ+öÚIa4˘öòOĦ^Vœ0:öĈ1dĵŞc Zì·Qßƒ–2`Ŭġ´üó ˜|Á!“nöĈdhÁÇÉ7fÔ"`·=,ԙĜ½×ß{⦅˙%X³UÀZ½q 9B9†Z ×¤×ıàPşé£—“ëˆñ ëßùċSm€½ü.[½ŝJĥWS˘xÉßk€ek”Òît9]O×2bœNÓ|à:7;Àä›>z°‹ÑKË{ŭY Ĝ o­i0š}Ĝ<îô"‹É`óĝ,ô"‚_D8 shĥ­ĊùĜ 7Œìú+_Ĉ€M 0‘(–‡ÓS\Ğ­÷tÖË"XA€™*NËÌÁĜ²żÊVc9 °˙öÄO|˙€°êġ_|ıò⃽ Ç."ÀqÔ_˘ñâ_JÇW_€Zƒ–yF+PH)žt8Ċz†ĊŠ€WE`~ĥ€É7}ô`3‘Š˜]"`Ż]üËŜùċ“Àĵއó™ŭİ ÙĞêÁŝZŬYġ\ˆty4€%ú@ˆLÏ0ùĤŜ ‘„Ùlö"`ßù}ĜŻµ…Höá×z9D–}à|% `ĉE½XMEĥ´'!›>sĴ/móMÂlñ4HS†È°ħ0ÛŒéEÀżÙEK9˜ÒYiĞŜ~¸§s°’Â`k IDATÏìY `Ŝ¸ĦƒCHfÜ(²‘NL{ˌĞ`ÜM½–ä•$˙ÁYöĊ+Ç%ùŬpo'ùAm’˙×}iüóž˜hĠ<–.Kù.·é:`•œxÓGO"ٟ~t`ŸÑG*€ sÀé%çÇ(Öj%ĥö`lˆËJÛq0ôĴ“oúèiÀ^„|ħ9Sߢ˜ Ĝİ‹*ÈíuÀÄQänjñ9ŸĜ7„ñEvl.gòٞœĤh òġîË,ès(!òb@Ô7€8Ôgïùy0Q "]İyzâjŠ3˜|ÓG֒oÌ `?ŭüçï½÷ú{Y6oJˍóĊûYöËżĈÌİĴĦ:™œËç£\ç`Ġ<-–jôĈ_@ı3]Mñò‹PpÚ>§4ÎÉ'^cÙ'žx`§şš˘GŽ!Ğ>UoVd˘İèül&w…ğ飜ê•f|Á!Ó3ÇPîtÁa*š˜€-òÍ0_Ñz^Ñ:1`ĥ0áĉZ6›µNZòkŸ1?3À”›>:_;§WTÑıŻŞs½"[ÑûĈÊT p²oE!“ ½ûS= XEwwu½Ĝ"SañK¸o‘£0óLû'-”Ο¸°éĝĵôxżaÍİóáşCïŻ„ĜġŝˆŜÏnYYĴÙ–gôUƒgşy?a€Ċş"{˙<:w Zuúr7=ŜÖÇùJN/dz7ZÚuœU[SŻŜ0:]ĴÑAM1éâ„ı`€5 Ù€auñšüEĤ¨!0}&/Ìîô51`X]ŒH&x>f"á0èĵja÷`XŬĴ µˆèÚD+ Ĥ9½í@ŠcÀ°ĉ0Dvód7 †€aÀ0`0  Š9áĠ Ÿ›´µ– k&€uxtŸĤ yŜaaÒuO_†5À:=:À Ÿ` Ó7è‹cÀ°Ĥ#\Éò\³ÙäZuéúHğEĤrħÈŬ€7t‡ûè,älKYĠ²ÎݍÍj=ï3‘MÀ§ë2`tŞÛ!òü;!NüÏïT–‡ÇyÀòûüŻşjùújÏíhyCÊúmÒò£‡”uÀŸ¸|Hµ./ó€%lĥ€Ġ„Qdû£‹Ċ B¤×RuÙ"‹š5ğĞÚuÀ^˙Ġ@}ZŜ–‡o¸ŭ#´Ž–· ËÇŜ—Ö_‘—ŻżòŠĈżáġ‡àò•ş´üè!e]^v­~ö5yyHµ./1`³L˙ÑÒus9vŝë ~ˆâ ´<ĵż=>‚ċWßo‹`ùú+mñ,?üjÇh¨7Ġñ,‹°[ĝ̰q—L£GDÎ `˘áŝvŒ›··ĊG°€i#X~ĝ².GI!nĥĊê ÇÇMŒO·c‹@­iTu()DĈÇö·ÇG°<|XY—bâ—_‘#£¸ĵá>$ĈGM”<¤Ž K7u˘ĦÚóq‰ë:`gìTÑù‡´ñFَ"_Á£H ˜ Ĝŝُ"oŸê(RûnÀ£Ès00ŠüH?RF‘·uEJ1Ž"5ñħ(EC)2ÊK!j£ä(òšĝˆG‘g°|‡ġnŽ"_š“Qäûx9S˙ŭtòŒ"oï0Šĵ­}ùÒTF‘7àQ䙌#lŽKĜĵâĊ:-‡-“iG:=-Ñ/Îïnñ^ċìôgK;"_ÒDÉñ£È? QäÚnjG‘íÑġC<â(r|4çÁ£Èı,œĉ“Ċ"Á3âµÁïlD,ÍH²ç)ÌYŻh²ëZ:G‘°ñ€uzt@% Ÿ\TM·ú S#’â#I>G¸ÀòÁċÁp™&’ÓEŜ9ù(òWF‘·wEŜÖ>Š|if£È(²‹=X‡G´`ÄéËS6°A‘0ĈMò\)ë-*œ™Vˆ|İ(òŞ%EÒ%ÛG‘(ö=Ô!Šëíç"ÇGC<Š<Ó!2M‹Œ?—Bd2ċË ÀÊŝTÂς$ßÊóéH†ÈšVˆìö(ò<Šœw£Èd8Šò1fÈ"SàNP Sa;éEĈ²Ó ‘ŭüç7<öóŸĞ–ö·ÇÇé"okE4›Qä °37Má·EuñNċ|%Ì ı ĠêĝŜµ˙ĦÛAİ–ûoh÷şíÀC·Ü?ŝ³‡nĜhŠ[ŜĤğċCŸ³;“šÒ•BÖvw· ĴK€aÀ0`X0,  Ö%ÀJê?àMŞf(È  65À )šç™TN²Ó)–gĜ4r}*g4Ù xĝJħ /Ñ*§pùr†›°l0 +HHĵ)2Žĝ[G8@ħŝˆ[,œÍh’öñàˆĝË.wÙ %y“ż„€AÀ:ŭ™pšŻ5Šßo÷.7ŽF$ÂE’”OŠ€9ë|™“³7.JҞFÁË[+8DbÀ ò”˜öĞ) .§A8Ù £Àx^Ĵ⌴`F§3Ĥş†C¤`YVC¤³Żó*€%„ ĊQċZĴI VW§)l³ß Ĵ³ü0ĴıŒÇ€aaÀ°0`0  ëìĉk’y:ĴĜÒsšk†›)`y@OŽIrĵ£Á°Xás¨€òñd’cĴ /ÁaÀ0`3|t@(œâMŝHÍäûm`%FJ€ù#‘eı<- lfˆ&Y–·°ÊÉî´9ÁI€Yëuú+ 8DbÀ&ıš‚Ö½”ĉjŠ„3"ft: ÖĴB$|n€))âc:,À‹`À°fXŬç!2b£yw3šĦLF…•~>c³Qĵ§·40`°îìƒG nZ{€€M°ZŞ…ê`ċÙï 6§Â€aÀ0`X0Ĵ X>:€Â€aÍ`ŽUĈÀê2`-ÂÛäŬq µÁJCxt@)@”i°-Äùš<Á€aÀşùèÊT0Ĉġt&+ĈI ĴóÉî’*êèt.ÒYç>[’öĠ1`°™<:€hʀ5ĵ´ŻŞ,§ŭI*@{›0 Ĝ ‰uxt€X:’ FĴ<ü0 ĜôG‘iĝè*Êñiĝè€hT~t@=VÒ->ÍÁmê9 Ĵ;'ğTOS`u °Àì÷†›SaÀ0`0,  †› `èÑ!íp2*ARÈÌä€5kĠħ†jċÙ=: ["á£JlĜVxáQ *_£ĝYÍòN†Ĵ6(PÓróN>Xl†lċ‚÷xЇ“‹)[Êï"ğş X…V"RİÖ(UjlY"sî&˙ğë˙Ógîŭí›Ï}B ˜ôJ€QqîOÌíĥQí£H› 9µ£HÑğêl"§ŝ肒Nv£ĞçÛCëĈRùŞ XA<‡X´ş^íıHqÑĉöû °¤8ŜâıHĊI”ĈMSp9"Ċute‰ÎŒ`QêĵEWG‘S›h€ŭÄG%û¨0‹ÙñL:yÀgJtz$'rşÀgZqö\ˆ¤´8ɀÙ[3ŒÀ"VaĠçsÙÜjÀ˘´D˜Ġë'DÀ˘&­S˜ìl,äġĤġ”ÎUQ2aĉ Ï`ï5¸&'ĵšZÀêŝÉsïŝû7˙ä—ZÀì…ñ“ö{^g&żŬ‰³ċz|&żî󀵕„G˜ó­˜ñ¸#lĊlîo‰xŬ Âh”ü âxë“z°‹Ožĵx`?ŭüƒ,l†€uT::,£Ÿ (ŝèUÄÇĝÉX‚7Á LûĤŜ Ŝ:—/I€ŝò—żüĠ'ڃ|ŭîĊŜĴœ…güĜ7ŽC‰ËžHò;+ƒçĝ GUêqĠ£èx‹ŽR°2ġ“ŬĊ^ÌÁ"ĥ[pz%À`ïġmZÀ~úùÏ_ŭ•÷ö.`{†Í904~üK5K= XûÉî|°É'm@^½ÒİßôÑS€QVĞfMŠ€¸ĝв‹ŸöîËPïö.`9Ğ CF"˙şo‘ {5D";ĴwòLċĤŜ ‘§Ù–”r°„zq\’û=ƒeíf‰is;ç`Ŭ;U¤ÜôÑcI~Α’“ü{ï|}q`ŻŬöĠjO'ùG†ĠĉcÜç`òM½6Ф•Qäğĥ|ċ•òK‘Qûòɓ_†NkĦÔ££HšmĴYqŸc€É7}ôô4Ċː/6 R˜€ĜĊß˙>Èŝ3’³—§)„ñ_ŭ‘żĊSyäw0éĤžìÊ+_†Mċê3dÀö8p`˙lÉŬg*ô:`âí;‚-DôÄÉîñ˘àSˆV÷ë½ْO•`̕_|ñċŸŜ˲ ƒ_ÎÁŜ¸ĝ$Ë~˙Ч€“èĊLu 2l ·3AÛ&8aÖ#)@>ËÑU²ĜMÀä›>z°Ĵ|c‰z³݇‚Óö~q˙òí ûòÀYí=À|ċT½Y$çÍ{°H,@ˆH’w4öXêf&ŬôÁ$²=rıNR}gĈô.×!{äHġ1dÔğ›EÎ`L‡óœ›)· ‹H‡Ï3êfˆoú`{ċĈ Ĥ: Ğ=y 5ġî2téĴÖê¸şĈ{ülÁá `é.Ĥıé£7{+гşŽanëĴJˆL…ÈV7Óıó@GÙL§’@ç&úĈŬšDâÇé‰äU­)šs5éİŞ4šŠÓ!Jumvz€ħöP‹ ò٘ğŽÛC­î…ÈšZѨé*ŻëÔĴ­ZmúEµšŻP›DV6İl­ÚlĠ…Ż˜Cy3Ó, ßϙKL0•şÒ}µOSH7—zú{×:u­Î=tk‚şNz—™•›BhÍ:ŽĜZlkš€ÉU–€aÀz°F †ë X%œš`s2“[0€Íĉ4 6W€EÌfx! 67€ÑŜbÑË`À0`=›äcÀ0`0 ĜÙĴ’EbÀ0`ŬÌ€ÍAĤ\.„€ÍE&L÷ `´ĉY\[,Ş+0ÚAŜxtEѨ/D~|ÛÌŭWÌĦ|…éÖsI~)Vèŝ}ŭŸ÷Ċ;èáx|EñĝÁâ“èáĝäšÊ6s˙s¨ƒ§Ĥs]P°%=„İwF‘š‹CŠçżôžŝöW:}ÍĦÎ?áD?ŝç˙1ÙšÂAš}=â{Y“W“Z!?!‰ìÍìü×u·=›€¤YŠ|&‡€Û€qġN€ĠıNíÓjtnş7qÍĠ&oùÚô騝aÀ¸J65ÀêħN€%ĜNíSÈtn:²4}:­3 XŬ€á‰C$ †€aÀ0`°³ ˜ı¤ıħ8}ŝ~}ŬŝÒé:púô ŠNŸ>üÚéItàôä:ôŝéÙêÀé^Öáy˜Ñ£‘÷Çġuè@‡‚Ç÷?ŝĝ ŠüÀCO˘ŭOŭ=>[íĵ—u`‡HĦċé°ñë8Dâٍ †€aÀ0`0 Ĝd€ĠB W:µO.Ùıé˘Ì„5Ç“·ĵoútgĝTQ-ˆ=îÁ0`0  †€aÀ0` 0ƒÍŞ–{‡ôuà@‡‚Cw:4ƒ˘C‡ö84‰î<4ıĤ²ÍÜĊj˙ĵ?U¤ıí‰Ĉ=îÁpˆÄ€aÀ0`0 ĴGëxWQ#:AӑŜ‰kŽJOÖòI÷´éHğg0ßU4UÀ:Ÿ‹ô—;fžà\d9aÍqĈd-IM›Ž†Ëyf³I ‘8DbÀ0`0  †€aÀ.`ĝ\$>9·=>‰{0"1`0  †;—›ü\$ N—Ž3~.6eÀŞ€ŒL‡öİ›:Ÿ‹lĤ kÎéšì\dŜhĴM“ÚÔ×£µä)M›Ž´ÇCžéĴîÉcÀp†C$ †€aÀ0* Sr:IDAT`°³˜™.¨•ò½ŻŻ—^êPŝ÷ߟAÑûï~íŭItàŭÉ5•mĉŝ+ĉPóŝ­^­î;ĴŻC‡:Ŝĝ Š>áI´˙äšÊ6s˙s(üŒV"qˆÄ9 †€aÀ0`]ÌêièĈĊŒŽí1N·Lò£Ñ3QÍ9ÖÄ-Ÿ7&™úôèhĥú™Ĵf1F8 Ĝ”óġİSĈöYkÚ'aÌvl:Êܝ¨ĉĴ}}…‰[>Û×טeK_q&K,ê³Ġ0`SĴ™H4ġk%˜Ní“ÎMtEršË$ġ‰[–H$¨iÒA˙È܆Ȕĥv0`89 †€aÀ0`°3˜)V+x+ú:üX‡‚WĵòÊ Š^yċŻ^™D^™\SÙfîżbuhFjğñu}>ÜĦàġŻż>ƒ˘×_èWŻO˘ŻOİl3÷_1‡zhŜ‡ÈšZE"qˆÄ9Ĵ“qIÑ4 ÖuÀ‚r–Lô<`eĤѰZ§Že†á:5]“™ĝïEò 3ÉıÈVŻN—ŽS9³€µUÁ™Œ“’tïĉ·Ċ;ĉ5th˘ŻîÔtİÌD5—œü\¤#f›.Ħ>cáL–3ôġEÎ&`RKĤz0ġ˛:VWŸ˜c˘š³öı&;éìËN“ĉ ŸìΛúúúŒg°zÍÀZ-}ÀÀG:µö`4EàSġ‰j>"Ĉµ|ƒ.şqCµY;Ğ€ù-6›51/IŝüKòÁo”×l޲0 Ĝ\F{C, 6wI~ı‚€+£H£Ëİ–ûÇôuà@‡‚Çö?öĜ ŠÀ7>ôĜ$Ú˙ĜäšÊ6s˙s¨éŬxlÑ˘zĤĞVÔ*NëëġW:œ~ìôé>ŭĞ˙8=‰;=ı{ïôlġĜé^ÖŻŜçĤĦhÀ/)ٓwvc-Ñ Ö*Eôd’µP”ìÀjĴ…¨hŻ–²`-D™z°f‰,PÍVÇ+NQTIÇϐ³r–á÷vQŒÎÏ ÒzNl]Ö)Èf@ŽUÍ<Ó;9X.ϲé2ËÖôò18Úm4ĈûËYg%3Ug5ĠŬ”£Q‡K:—ËfÓédùèB}ü†,X€#§|,„yÊ<ĝšL:M‘ĞfžŞ7£ÌZ ĜU_Jµ–vğŬİvÀ2À™lgiœ³LIéUK¤g%ġ­P °|ĥPÈçÒ á§À˜T:•$äôK‚oÉg“ƒë`“ÉİĴúŬË˙é™ĵì ?MĞ£^2Mzí”0ÚéNŸìD€é8+7ŬġşTĤKÌ]ßÀbfJê²j°"şâ•Ї#)0:]Cö"‘n,Ž$5ŻŞ °,ş&µ•MĝK°ÙVĞħêI_ŝÌ.ûĝ—|ş VpÇßùà­·ŜJşó `OLtĉÀŠ˘3ċRœeßSïĈS7‰=X,ۚĊ§‚MıévÀx>Q §À2•Z6žnĴ{ I“ı\ŽŬШX,) ĜĴ+jjÀúÁ3W|)L’ĝ$-÷żóÑo8v"U‹˘3QKHÎHXv2„|ÌáüV‹ç3„XL¸ZÀ¨è7Ĉ éÂċ?Ü+ŒJ˘^6ë$żPTvù3×^À ù( 0Êñì|Öħ#Gžt%ÀhĊé*H,•TÎĵ"$¨˜'³s X™­ƒW2òY’(D"Àd<ž‡ÊŞ™dàE-Ô˘Ep×Êé¤:DŠ÷Ô³‰ ËŠ›ŭL~Ħ"˙îwŻ€E"ŒvI9ßQïđûï?ĉ.Ȁ)NÌ퐝Ŝœ"ŭ^—ËċŒäĉ0ßMé`"żÉ•´‘0J,ŠWU!²‚:0{Ÿ5!Rş9UÉGͰYç`u%ûäċ˙ĝÌß_ñġĞ>^dC>-`'Nœ8räŝğÚÎN5`eÉİ&„ȲÛ˙ìĞÏ>vğXö=áŞ0ï‰@ñOŬôÂgÀŜÍ#Ìré˜*DBHCÁĠGTT"3/ü6 ǽûîO,°Yç`Y°ÜW\{íµ—]/‡½NoIŒv> ‚ ĉŝ']JˆDÎ#Èİ„H•³-D:á8á7ÇN¤l]Ìi! !‹_  Qâ~ßĵ9 0î÷` 2ĉ(!ôfl0ÂQd4!2ú·˙r3ĝ–Öï1`] ‘t*ç`™O_víÄĜˆ:á<”ä0êŬu×ħ°&ɝM’/9•$…ȴ睏>zëݧŽœ‘ŬĴè2›ÍŜĥ̏ĝz÷Ŭݽ)Ĵ7shŜĦAÇBšIY6i4iC$ùÑŭáĠMÔ½û6Ĵ9­Ĉf.¸ ò‹Ïé•+zâ'ž:räDÊġÏïȀç[™vŠNċ‰!gFċdĵO•Y_d˙Ǟzêŝ§žtv%+8Í^ş=xŜ–KÁnè×|÷'MˆÌÂ!¤cQD"=_ùğżğšżĉß1`]ĴŞ™ĤÈ}2V%=›Ġb (O´2.ÏwŸüÇö§wı)y˘Upze'šhe\nÑ颔‰ÖW‹>äqGž:r˙‘ŬŒe|em’ŸŻ"ŸCd vC¨ƒŭÚ Mˆ4™­VĞıÏĊ°#˙ÄżüÛżŭ+ŸğúêŸ|ċGo˙û›°nä`ċös‘i·ËìrXŬîˆêTQĈëġĤ+óİ 7ݜ*Êg 9sÊİ"äĴŞœċ@8DŸ} ô_÷ßu¤K=ĜĝQdB|ŭû×~-–Ĉ›/dQ&^D"I úü˘¸"ßü7 ŝ@ŭäÍ7ß|ô°Y÷`LFžĤ`ĊóÄlÑêĥ{ġNvÎ€—’'P)—àԜ×F΢âÌşß:&dgŜôœĉŭÍğoŝߛŭ8V núZ fbożŭĤ6DڅÉ×`Ÿ…‘C¤Ĝßŭ×Ïŭä'ϽùĉŻŭc ĜĴĞU”,nLPJ9gi%Ԁy âN3NgÄ>XÀ¨uj/œ`\Z§;zŽ.ìïÌ`Ĝ“Ô /ĵ“'~%Ğ–à™ËÌÄ_o>Ş ‘oĵj- à÷ġMI£È7!^€ŻOĵ 6ó׿~ô³°ÙVĠ9Xd‘-òÚ›Y5Ĉ„,„4_r}*à{0ĞÓ§. CĦ´eYrŠĤ‡xòĜħ'ƒĥżùçÜĈĝoŝÉĠ7ßü•݁,%_31)At³"żħ¸Oû}}ğï‘Cä…ìoÂí1`],WŞİr°è"³ŬtY Q`ċ˜5˜V˘¤5ÓˆÖ4ÊçcħXJqZÒŞnŠğœN{üoŝ4à-̰şt M)€e³/ĵÜ Ï= ô/jÀH/`Tô‘]‘IÈ ÇġÈMRˆLüoz°ŝçĞŸû ü–G˙Ĵ £HċĞ.×Ħ}VğŬĉ£ĞšëÁ|EUì£Ċ,`&4Îq×ĥ;Kĥâvé8™œ…HBı–K|ösŸŭĴë³HአX‘ĝĠW_ŭ%Df#)ù•/ñz°2ġÇ˙È?ŝĴKüš"Ĵ+wÑ+Z+D”ž“+Zµšá­IĦ)À€Í0s&…”(CRó):­W çLLÙÙeÀ(Ÿ‘ÔÛĊ$Ĵ S€.Îêí>lV=˜(8ÙÒßİ`–êîÁL}9tèÓ-˜' %ùÉŒÇZ@ Êżh… k“˘c †5G€•Ê0ĴıŒö0`Xs˜ÛlcÀ°ĉ 0żĊáèǘFYh=X ½0`Xx‰5ïkIÏ€aÍ`iéïEF0`Xs˜[ kk Uëġ< k’üb'ùXsX‘cÀ°ĉ 0ŠŞi Ĵ9Ĵĝ˘0`Xsˆı2 kÎBd5Ÿš#ÀòL ç`XsXb$ kĞÔÊ>A Ö…Èr‡HĴ9,ËbÀ°ĉ °V5]Ǘë`Í`òċ:a V÷•…ŝx ĞğJċ%er0,  †…€aaÀ0`X0,  †€aaÀ0`0  †€aaÀ°0`0,  †€aaÀ°0`0  †…€aÀ0`X0,  †…€aÀ°0`X0  †…€aÀ0`0,  †…€aaÀ0`X0, ĜÙĴZ(ç܉Öc²ùVÀh ¸:Ì(à*FC¨ó^T² *é0ĴPĠmÜrš×W]™ĠàaĞìB‘|ü’zÜ^·Wîé)°œ‚ŝ&D=ŸóX ĤXKÎù)PÚiĠ,œ˘¨˜ ~´EÌhp 1@ÊŞ„É`…Ŭu>RD€Ñ@GAêż‰Ea3bOï8@/Ç 6—[˜E4ÀĴ39¤ħÂs´ỹá#Û¨5äž"˙Âñ9; ácŽÁ1Ò06c5ˆgh“Á‹Ż"ŸS8ĵFÎlÍ ‰’¸Òôœ,1żuJƒÈ9jÜı˜5§9 ŠÒƒ 6 C§:?7/ò/ :ÉFyRÒdB“-ŸžìİĝÑĜħÊ8žŠÛŭ¨Ñ#FèÀh›<ä´, ²ZċİTÎSĠf¤o02Ö½ĤOÁĤĴÑAe%Xs°Ÿk ò7g<÷\Ì`óÇ2JŞJY5€UÀ<ó°œÉ% Gĵ¨³µĉ1¸QŸ·Xh&œàĠÓ³p‘q¸QĥĈ… ĉ2:hŻĝUfsĤÁ³`Ü'NÖÀgÁp€5nÀi4bQŬŬ({ŭĜĴá<‡H3JYèÀŒġs08ËêÑzÂh0 ÇÑòpґ€ŒÎ²X֒fSNè àPŽË;„°V#Ä dï1i–•(ó­ Èè뜀“½ÔD7% ^Cƒ +J”y.ÇŞ6½_ğjÚa”&`!`NĜ—drùş]¨Ĝ…?ÑÊgM°–` _W&œ€k€şuKħÁ'ğk ÀûĊŽ z,ß LğaBŜÌ—ŒÑ@ĥàŻz (âH£!†ĥ7e\$âÍH6QúéĴñĠúJƒ§Ù*ÚasV(1µ–ÇOf­FƒÍ­µ`ä Öy!÷+uš“7@hÖL.xÀ!W P$IAá†ĉ‚ĵ4Qíî&N˘óĦ+Á֏²bÀ ېçË` ×§…h[ f4I3tÓ($"F’&ô{U<Ĝá(  V­ŭU:çHH?şĝŒ"áŒĞÁ:.BÖÄq£7\âkaŻÎ\0›'›´ Vm l§Isxá÷`<ƒ&ˆH“Á,Œ‡„yFñ'šR 8}Ä|8%™2™@vïpÂVFgşW6' ’`ĊQğ˘£ESpı…R#ìÀJQ“4ĜŻèR^ûc1€ iX”k:œ²ıD}˘Fi›(œS^äA¨pÙµ=-ÈĤÍìož3׃ĠbŠvšÑĊ%„0$ Y .‹É§-“ùùp:²žIç“qĞÑhµ'éÈŞÙ`ô$A“ħ`ĊĤÀÂ$­z#³N³ry8ÙÎ×ŬÂÄe³9³ ĈLĠâYÒd²zs-¸ÏJ“>‹Ŭ*‹ĥÛ™ñ—°édÒm³Ç’IŠŻuAp;Òn÷Â¨œI6;(œ3‚È L ĠҁŒÇċ+JcJáԜ› ĝù#މ‡ÔˆKûB 1í‚ĵ'éq£ì;ïóċÔ]2çäóÛĊHá’Ò9 Ġ„'7ÁÊ$œwjÂfÛ&ç`Ê ħ^Uĉ]‹É ϲ?_ĊIqpb“oÖĊÉôFCsWĈdj%7kg`ï<`Ġ2   ’­N³Üü…kJŞÀ[àĴg£“^:lĉ(: k7ĝsRŒŬà­6G˜Ç€Íɇ.†‰™†;7#áċnN£x^Ö]À\(ƒ7 ħs/4{ïp+°ı¸˘ĠċrĴ.—ĞròĊ×]Py6'I~‰.ÇòĠ}Îv`àĈŝĤìAïq,ïAïKû{ŜÇƒŻ½LĤS€)À>ĜŠ^?}Üfo­ĵùġŒóĉf<NW]нÓ}v”RWŝ½ž°Óf<Ë~£·;`Ŭĵîßò›†_kâj żüÈ ŝ瀙3.¤ú­%oMÉĞ7§“77yħ`aÀl˘áڒG€jÌX cWċófüòöĥÑGómfž§ukŭéĊ|qéœċżùä °ß†Ĉ›I‘Ӌ€iB}MĴÊYNĵ²H󅟧lʧÑ8ŽIĤdU ë +ž=ûĉ7féó;`!“ż8È)µñDIieùX§˜²gşÚbƒ J `Ĝ)C$š)€d$‡5€ĦĠTˆĵ3Mž’R|‹NŒ·‡GcgŜVµ§Èĥ)—FîÉñ4·ey Ök,rtkm'ˆìÀvñùT(ƒ!²Ŭ˘Gñ2”w‡GR`gÚv:EĥM"cĵ¸ÀËR`餆˜÷¤)bÖŝ˘%c;ùá…ô{Û"ñ {ĝ¸³˘V1ŝŞn Éߕ3Ĉr"ğ%Z‹­6ç žġ–h]ğl)ÏqßI 0zİÊÇîs­sĈ¤'ËBĤ­XÎyDżè 0Œ•2MµsŜKjfìZ'8~0Œ•eV_§^`Ŭûg˘ġĜù‰€Ġ=èŭ€‰~ôFYzïAïĦl,?ö!ϐìûћAz÷WŭèE?zĦ?¸P˘ä“d³yuì äs„Ïó‡"˜2…’ż/e0ç/Eşc˘DÉ_—ñ&yùħqÏóäħĝÔIENDB`‚gamera-3.3.3/doc/src/images/tutorial_classifier_window.png0000644000076500000000000001340710714675724022731 0ustar chriswheel‰PNG  IHDRÎxĥıbê0PLTE˙VSDW„XZXJi­k……‡„çhSƒ€ŝĴv”ĤÇÁÇËÓêċçäŝ˙ü‘;*–’IDATxÚíOhǞNjĴ‰aŸé&ǽ$ÁÇ 8?şû F{°ñ<ÒĊËZk4W‚—=ĉò9ŠŬÀ8ïâĵ< ÙóƒŬíĴìÈÄÚVYVŒµS[˙şğúïôôt•5ò·4êé_uOO÷g~ŭĞ_ŭ~ĠŬÄ÷=‚bĥ8O|ïó~\.‹2fı×Y;ŒóoôšKË(c–Ċќûô‰÷ ŝ2úŭÖRçÒòâ7˗3“ċċKMN––—Š&qYÈ=²Ô*…›ZT“Ĉv<ËÒ|żżdH5˜qġĥCžô·İ*o˜>wĉ—:—;ó÷µ‰¨›d²éԜ–ڝĝ`²púŭ‡!Á ˜ZġUò›ŝC_•ŭŭöä;2jR ‰bmù¤Ġ߆·u˜zġɅ$g›eA‘jè¸ ÖbΏҜìM™AèħÚé=b JrÑwôy§ûTĞ ĴŠ“6ĤŬóu8·ì*1§wÈ9ßë6}Óîr1TĠÈEŞÜ¤>m'jĜZ´m_ħkqĥÇ7Áù˙9Ĥ˙Ž9Ĥ /Żii5ƒŬÖ§IÎómڞoW²#—Uì4çŬVĞrŜeç]ñjşé5H¤·Ÿv_✯-qÎŬçô>O;úCgĝpi@ïwC^Ó}êwş÷oĦ½i÷}ÌĊ×N:ôŭaĜá‹ğϏF7•ĉÚAsëJëŠĈ™ ìĠp;X2çür8ß=<`ÊHŻ ÎŻĝ´uĠ§o:ôçÖŸîŜ|ġ)Żé:狽{œsKüF7ĉ×ÛtŝûîÑïÚô2·|qw¸ĜÙ@škúÌg5}níĥoĞùl]ú”ĵ}ŸqôFp>üŒ[î!G?ߞżÁ¤öĵ¨ı}ï E[ÂZKÌĉڃ6ŭĥÓ}³Ä×ĉlq÷¨UÍz˜iC Şı:köıĊeíàè>G—1;{óC:ĝLj´àLéQğŝ|YĜlÁığ{Òfn˙nÌùğon·2ğÁĴ…â̳ßĊ’͈ÛÁVKˆç”>û\osŬşĴ}2Î o8¤Û5·­V›ğ—bÎ7_½bè[\[–Ägiëvğsç¨óƒ3[œmEvZÊ8§ì³ï_1×,ïQw{Ë Ì‡t“FœïßxĠù–ħëŬ8ĵñêÖĞé^gş?Xş~Ÿ}ìö›ċdÍ&]´ŸÏ]ı˙ÙĵäUw­~˙AHAĤVÍ9ë)ér%ÒÑdù›ċ[|2ġEÇ­1ħB>ErNĉĞ}Á-mżÎäċô‰I•òƒyœQšÏ2Îï'>ô÷l1nù›*?ĈïùĊgpgpgpFħÄÙ#Äñüs§ì3Ž^ú·"²ÂŜ,ç,ÚBΎŸüEĵĵÀı³—TMÇaúé‰7ĞXÓ/‡8BrœäáÈO@Îrö4%t<‡(^Ä×,…äìÉĠ£—§8Ğ ŠnŸ³œù+Dšĉ,Ġ_ĵĵpŬ>ǜQrô™gHe%iÎü‡‘vC}N³8âÌ?ğ‘k7üg'­ĴšŬŻHïóìFY{ ûœĉœ°ÏcÖ>§W€}êoHğáü ċ?3/#ĥ>I˙žcìŝ 3œ=pnŒ3OÀ¤—Ä~š“ìU“òǵôœÁœÁœQŒpŜ-;g›vc­ár@éù5”µµYUçġfğ½œyı&osò2äL-sœ3{?ÎûjÍġŽÏ>gİxÍp^œ×zœr–úĴ#gƒúĵĈUšħ¤ÇÇkTàíÑŜex{Çjz,×çIô™Ù ŝÇqöŽ…òR^óċ\<Ĥgœ³cXŸe;(IKÎìŸF˘ŠÑ3o7ö™ …T@Ï|ĉíOyĥÏk:Òµˆsoí8ĉ\à•@ŸÇÒç|ÎTçĵÎ è3Uí ÛAAV´ƒû™o}+ö™¤ħ_qĉ.Ŭ;aŸMûÏÚ·ieMθ›aSŸ5´ĦÊrżCaW8ĞÛlÛ獠*—úŬᜎ‹6ŻÏ.Ÿ9öŭƒÄ’ußOÈÇe’üˆLŻĞ,­güôفhĥ—‰ocß=LDŞË$KœËw0½Bݲdžóœä쀳 }öHĵ—/^t´ˆ†ßí•Iìetjœ˙ĉ<;;Cä†9Ï5[g,ÜËOŝëÖĊßF‡AîôWœˆlĦdT÷Â&êZçĞlŜiœsyĜ¤}ŝŸŻ˙ú!ĝĴ„d‹%žh¤ĤÊħJŬÑkŝ—a‰9³z˙ÂJx^‚eUiŬü8™ç_ŝw‹„ï9ê0γş=G‘-– s–ğşÏŜ7UŬPç^r^s‡€q–%kœ÷BÎżŬr´fĈ°Ffğ˙H‘-–Òœƒ\Áód"ÎÁ İώ°"ŭHŸ×™šzâ[9K!ñfh%’ŝ“•˙HIĥíó{˙}ëc˘qŜa*ğŭ $[,•rN.¨;)çŝNĴς3Ŭ93S­qĉR̙K1çXÊáÜôI™àü·˙ġËÖ×_É&BrŜéëd %Î9 KIB gp¤L`oDé3İÉY\dr>™9ˆġù„­ñëӐó;+g!Eœ…qÖ$[œvûdkë+Ç??r^ï÷ûú.²È…’g7àúJGWèsà’@ D²UsÁĝœù5ÑNl7^b}ŝġ_(Ŭ¸qŝ|íħsRÄYHgM²ĤÏa;ĝŜÖÖÇ÷x5ôëœŭío˙9ö0 %Á9pCğ 8ËwWÔ(ÎA=Îĵ½ŠíĈêÌ ÖçáĈÁŻħ>Ï­­iœ…qRÄY“ĴqÛAĞó…Ùı™Ŝï˙éAì1J ΄hœÒgÑĊ9żĵĤë3}v÷ÙĈy5Áy5Áy5ÁyĠyKö™)4SçgÎ1…VŭÁ>sŬv˘`‘¤Ù@ıŠ³Ûˆ>‹+$CÎAï‰ĤÏt¸ħħ£sžñuÎ3ÎyĈ×9Ïĝo3kÏÏΐ9Ċ7öWÎŭ›E4 ¤¨LĜçÎ5í³HEK΄ôÉÜŬßxĥákœWuCH1çUŬߤ*œ·ßnâmüvPBVgÑâużÌ=Ò"tıRÈÙUŝFàĈv#ˆ9SRWŸ ûƒBŸïjœŝó\žKĝÏsŝ³ŒfŞ$“Üù`bÎqP|ÏêL2ĵ{Eœó$ÍEqB˙9ß`öù‹żlĜg}ŠR瞖zqĊż+µ†ùİ„+İÙ:ıœ=´œĴ“´eç@qf§wr˜ì6ÈY÷7vö5żŽ$b*œù)Ê9sg•¨ĤfŒcIÚgñŬf#Î^Ĵ´ĵċstIShMŸÉÈož¨ßŭ(Kì?áû‰97ŻËpĉ ec£ċĥÖâ,nvòĴ“â̕6ÒçHҖY‹#eòVŽÜ‘•ĤÏô„uzì´¤wÄxƒAĜŜèœÇµq;ÈNï;Ğ3Qż;ĵĊı³”Ë sV—öċq–·Ò˙qé|JŽ}x$!Éy\ğµƒŜııĠYâ§ô™ŸdgO·B2ËYË[e8‡w„·Êıĥ}Žâ˘²‡›áĴz&¤8ßm)k-ߝm‰+ağA}7FúÏc{Ìà\™3'´RX½çóêäLžúëäÖípħƒġWUÎîDœŬ·6Dl”›ħ2rœ`1çfâHöOŭ²³×Xi˙ rvÀÙg9Îk–álp˘_qĝsĝ€%Á9!ĉ,Ç×Y"WĈÙ J݆ğ0ü™ö+ŝ/9³ûü߆Ŭ°8DŽ•Ÿ|¸çœŸmħŻzúëĈö€Ş÷—g›³ Jp/œ•%~ü9ïÙċüá‡1gV6N;çcuĊNC lqŝI(tÄùÙŬSÏ9ċiìw ĦD̎GzKœ7ü)Ìş<=Ä“€î)µÏ?}ĈY¨ó”qĉ¤ĊÙ=eœ£!rŝ‡ârfê|×g‡Ïñüg‘EàCŽe!äLëpĥÑFC䒜íùuCÖc/ÏĦ×ĠçZœm´ƒÑıŸ>à/Íß°f7ĽۛàLBÎÁ˜öÙF;‘ÓÈöŜ´qÎ"r^İÍY9„Péwœ²~J8DN³–9‹‡„œûcpNûϚ cÒŭ 5DNëö½óœ½Ĝß ƒGïÑ$(×ċlı?ġ{ oÚŞ_G'µ8sÇYj5ž>[í —Y\³q&êµ69ÓïkêóŭnĞŭAĦÎ3äŞâÌ{-B²Ĉ™{ˋş:Füı!ÎVí†èŠħ ½›’-Îĉ€>#Ÿ2œEÉ9³ìr^ıúÈ:g í`c\8ŸFÎ<‚DD¨ôE úĝ:ûCäÊFı+#Í[eΈŠòb5}.X”¨Ş.CòOgİÌ™Û $ÇnÈoHœEnâËĞ.Cš"Îé§3 gİÌàÜçüÖOÚ p6Ìٍ8àl3÷7D4pÁÙ¤Ŭ¨Ggp>…œùġëàlGŸ)8ƒ38ƒ38ƒ38ƒ³YÎb¸(87È9˙úŜÙçF9§Ç‹†‘ş€¸àlŒ³ĵn‚Àn˜ĉLhxĠxœI~ñtÁİşh i8ç\Ÿ"np]‡süK}İ—MJ?˘á˙kmžÒMmŝ£×úzôġGc,;…‚}ĉQg:‘ŬĝWVóBŭżŜŒç_0Î/´eúz/^ëëÑ×/ĈX6•œuûÔĵİ+_‰ÒêëÑż£ĊŠ?jÙTêsäoTežáĴ+_‰ÒêëÑ×´XñG-›ÎY˙yì›wĤ8ëÊW˘´›µ-²lZ8çŒß˜˜³Ĥ|%JğYÛ"ëËĤ‘³şïïĜ5ċ+QÚÍúY_6½úL'ĉ+_‰ÒnÖ·Èú²w™sĴ|Ÿq†˙lIŸá?Ûá ˙ْ}†˙<g7ġ˙Ù,gĝύqHôl ?P…ßM>ȽÑ9üçzœTޝŬ°?ˆŭ˙ıÎñĠ6êÁRAüŠŝs=ΙëS4ÎD<:Mĵ‰ÇwUħŸÇÖçèіâÍùV˙܄}Ö9W³ÏŸkĝ0ü- ŭ ĝÏġƒjŝs*ß ˙yçÌ˙ÜÎڈŠ/­–³§ÏAYPŻBQÌĊ‘ÀœÁœÁœÁœ'ċ¤hœÁyTğÙIœVáÑeœksÎɧPÒÒ*AQ纜Sù”ˆ:ĠÓ*Q€œ+qOIsĉáÑ@,çFô9È×gi:(87iŸŬ´}&‘}çĉü ™O‰ŭ >Ïo&pFpJ8'ó)AɽİÀú Îà Îà Îà Îà ÎAŜPgp6À™‚³Ùĝ†H˘0}ĉ]@œMqÖbr•L8×äĴB£nPíĤ2à\‰s&Ÿ"F“ƒ³ùv0ˆ8nXħÏÚAŝF°˙쎳Ypgpçq 8ƒ38ƒ38ƒ38ƒs=ÎZp#]Î&8Ó瀂³ĦĝF˜O Ä Ĝs=Ι|J'çf9§ó)àÜçÑù”€?dœoÓù”€şhMÚç la7LúîoŝFŝ3âÏĥ9£šÎgđÀœÁœÁœÁœq}Š-θ>ĊR|#ʧˆg ûôàÜçl>Ċ%e!;pÉ9'Ÿ"o‡D`7ês’O᳜nsò)°&ísœOQPA;hÂ߈ó)ÂnàÜ´˙Œĝ³mÎȧ@ŸGgpgpgpgpÀ9‘O‰ïg΍sN÷²ÁÙP|#Χ݈çĤ€sSœsò)|Î £à\“s6Ÿ˘=^œkr’Ogí`6ŸÎFís”O‘öœÍĝÚġ)Âß(¸FœkûÏnĊ:pnŠs˜OqÁي>ñ đÀœÁœÁœÁy*9ú[œq}Šĝq]ÜÏÜg=ŸÎ9ÇùpnŽsY>Ïġ0ÙĈù”œ­Ĝgpĥáo•Ì38×÷ŸŬÌ 8›ä\ݧÎsvÁÙtżğzgpgpgpgpÇY"ıQ‡œ›çLÁÙN|#ʧ0‘7àOC òî_à<9çl>…¨Aĉ2`ÊïŝÎ pÎäSÜç´ŭçJœ+äSÀÙH;˜É§€³aûĴ8p6éoDùéoP".ˆçĉügäSìrfŠKqÁÙ0gäSGgpgpgpçİ眓Og#œ)8ۉo„ùŝ4zQÎMrÎĉSÔ-N\pn”s6Ÿ˘îÎp’OçÉ9çşİ| 8àœÍ§À>›àœÍ§Àß0b7òó)¸•9Îz>œÍqv)ôÙ$gđÀœÁœÁœÁÙçê7Ÿç 9CŸsVcA]Î&9Ë;ò—ĉÀı!ÎT<ÒĜçF9§)Ün€sœsŠ´àl–s˜„}6ĴÏÜßào˜·ÊzÀgpç19£ß Îà Îà Îà Îà Îà Îà Îà Îà Î&8{„€sgœÁùÌqŜ[k  ŭ&ĥÒ;“;rnâúë lċàLî 8ƒ38ƒ38żœ=˘„YôüT…VĊg£$-ô53ŸöjíLv^áŜMg'Ü0‰*'ïĵŞ*îÌYċL<ßáĴâ{ž{ĵÎñÄÓ1İÄâċyDHž—ÙsĜFùAG~Bnӗ[%â‹2'DfgÄéá [—8êsù۟*ÎÛeÁ™ż9‚ı/ç|q\j½ĝ²Îò³òÈċ69"µ’PÚü‘?ı˜ĝñçò·?eœġRûï(xb(Ŝ#Îyv#ĤŻĊßàGKFìŒ?ñNċo9;áA(ğsĉß)í†-RĈÙóCš$ÉÙ#òœ!Î(ğᄨ‚8Ċ۟>ÎqŽ•ÏTJ̅v/ĉìĊ´ÏĤO–Òvñ˘‰*uÑö§Ï>sÎ$²~ödMĜgżÈ>sÑ'b΍ÙçÔö§ËĉŝGċ?m7”żáivCTċĝÏÂàòœŒŬŝ†7ÂßP;“7ĵ”ż‘Úŝ”ġ=ù_'²­šĝ}J]po˘ŝ`áö§ƒsd‰'ğ Eœ½‰8—lJô™„ŜÛDœĊiï”v)‹sA8—lq$đÀœO ç&Ĉ‚ ŭ^#CJÎâÎpÎ|óċyÊ5â퀂ñ²ï†‚Ù ĴÏ˙98.]Ĉ™hQŒ—Ò˙yI°ĵôIENDB`‚gamera-3.3.3/doc/src/images/tutorial_console.png0000644000076500000000000001140610714675724020655 0ustar chriswheel‰PNG  IHDRb•Ż€é0PLTE‚€€3Gw[]ZKi­Wi‘k…½“’ž²ÚÄĈÂÊàċçäçëÚŝ˙ü_IDATxÚíÏ‹#ÇÇ r!Ċü úMŽşë´‡äĊNâ€Á³$˜6s ö%‡À.s˜ÉĊ‡°„äÇ Ü‚½Ĝ·\]Ğ‘Clg¨tŭêzĠ?Ô]R·FÓŭ­Ñ´JŬĠż>zïĠ{ŻĞĠìɓ?2”Ĥe´\²eòŭ _^üŬ€Ëo.jËßF)ħo9wÎ\Ôğx{ɒGżĥċÑĊĊ퇋ûg~{öb8ısöà,üâììŝv“{gIPîĠœÊ’ ly,ú<Ì$w–Ż_\mˆµˆĞyùìdşx½ -Ŭñèä‰}xzzêˆ}˜ŝbê×ΖßM"ÏWŜN'?”_.>ĝò—òĊò½ĊĠÒ·wbĥ²ûŸl"vúĉ雄Xú!}µcù‹i$39UÄNOŻŜıú÷Ï/_ŭï ˙[ȏnż÷BsUĠğlŬò2ĤŞDĈN?9ğŒì7[ħü§§FŭrÄr2ĥT"֒ċ?‰vŝò÷”˜<ŝù4­İ’ħc]ı}aœ´dù+ˆċìĜrùĉ²EËéŭè˳·.?[|`‰½úßĊïRMŭñ~xÄĥeù)ħê²]Ÿ?::z,Ż~óËĞ·ĤWéßk˙\üŝêŭ7Ĥ÷>ŭè2.ŜĵŸ˙ŝûÚ6Ï\ܓĊñíijí§‹cġñ´rrüúbğĵ!önÛçż­Ó">²[Žç~˜˘9+Éöe靲vÁFïïp|4ċ“~|}+Ÿ_­ùSĊ,7Ùò˜:/Ûâ*;ÁM‰=uùĊ§*[ĥµxpgdÒiٙ9·‹G2[£ÉĈ;"V1)9Ĥk-|JNĉAƒĴ!FóüQğ9H›èŭô,Bî7Êó‰áÊH-ħݟÒòí!_ŒüÚiƒòuÍ%˘$ b b b(ˆ%Œ’eHħeBZ.“]/]ê¤óGÉàˆéi@,ÉsyŽ–”ĜrÄÔİ%5ĤFċ݁y K(5Zo¤' ì(ÑщQ&# q”ĝW@,ÉğF³cċČj&ž”ӍFƒÔÊ$³ç^+GV+sT Ä†Ş•Ë˘V.mg8RêW­•Ëdèv,q˜2;VI,˘+ö•ĈS=¤ÓÊeN³2E™ ­ŻlĜ.$1DTžc¤—Ìâ V)böŽÈ ˆˆˆĦ”ûĝ JÓògÈĜvZ)w(ŸJÉe˙ËçwMiƒĜòÙ ˆÙ7kLìJĞäğc ÄꉔsÜDÍ …ċéŞ|hÄKLpġş ÄFmSİBrG„1Ħ„GÉÌT3µeÒµuı–QÚ6­0N$÷ˆİ+·íĉìí?Ó^Ïŝd µÂË™OÛ ÖHb÷HL%[³ü<-úÔı“C0ŭ× ¨Ú ‡‰—³m­Ĥ1=Ò¤]b*-ë‰É€c™Z‰)5ÔËi[á5ĝ@dL]‡l_ĈdħĵċÏÉWĉ_m…ízê1ur[Óí…,%&ûMLx;ĉPË/¨½",”ÁâĞm}Ò_bĈêcf,šö.¤úŜ›9ïÂxÊħ m…ŬŒ8dŸ“=ï"DîĐíAîě˜ŜÖü@0Í÷FĴÊ%1 ÎŬÛµ>ÒuslëÙlĉêĤ6Ó[ĠüvÌçÙ<\ĥ"[è “7žş $ ‚H(#ĥž‡gŞÎ`VqíÏ-=sµ²ŝ··ġ:k-1ĦT‘qĝ á|~É Zg5T–Uı֓Y%1µ(µġĴÚâ„ÄÖrħıWÈıt25_çtFŒÄƒÒ"$Ïċ²*ÁH‰ò 267'd5bšğ…ï­ÛŜˆ1ËȧXM,ĉxVVKĠ˳rzI‰bó:bT+gÄvMLÏġĄ,ƒGŞ5ÄÒ^ħŽĜZRbk)kíĜ:ĜÛ\îKĈl–k31Ŝ„XıÓ3kçĠÄĉ!ħÙ,ßÖ›éŬï‹Ż!&$Iĝó°Z.c3zZk§MëjWsï+ .FŜòbëPJğ'&x˜0äĊÜĦ°–ŜBŞċŜE˜>÷Y%ħµ×FgÂʈYwkĉ=â×÷Ꮡ+•Ò\ ·×*MRgİCf1Ùy¤š÷`nR×|=›§ŻÙĵ$ŠšçÜâóÏfcUh0›ĉÎöàóíú–…ȘĴ•˘ÎÙvGÓ9ħ6"r^é5ÔÍmRP$NSùw#ۃüˆUÛï Q;£ÑZ×JĴXy&Ïhüĉŭ:RċùÄ#ŻLUnGĴŝ ğ!fÚĦcœoÊ’Şà~(I9 T…ŜË쌕e‘TşİĜu×öIµÙ 13ĜI;Ĥ€×çIž‘ĈÜç wğƒ ˜[£s7ÈäFù+­vCÌI†£UŞs‡,<\BŒdڄä䄃ïÀ6°CBb.ŸÉbZÏu"¸FÖĝ ;!Ĉŭ·BżÓòÜa '[c~5–“1Q&c"ÌuJNĠşƒÜ'ħZ÷'àÇDÑ*=aBÌĤä2À4tŬ@Ì?’‰kÖJ3ô·ÄnšŞ”˜fJHJ,\AXL ñĵ3Ĝj‰ k²3Û!1fÇUéÍ#ŭ€'ĉDz…B\ &™˜wÂŝùÜĦ(X|.t…œLòvŒW“͈ñ<› ٕw!µw!l•:5ĠiDᵑÚ-Àrf>.¸ÔÍrÄXŜ³Ê<!_sy°ÙèCÇC1w˜K#’<£µ,v *ÈĜGêÁê³Î e´Nƒ½“‚g,cö½IpĤ˙jx·ôıΚƒÜg”ÔIÙìßğHÙäÇ@ ÄÚ#&² ÷Œ÷á$8Ù`š­ßÁ7, ħÜ=I[¤BùÁŠ^WÄĝŽÄçέ}Ù1:T…ĤŒ'ú–E!fwÉĵ$ˆùüK.HbEA† ‡˜À„,ˢêb4ñÊùAwĦÉĜÄ$‡,b†Ĝƒ"ĈùA{iŠĜ³Ğ։ñ´Ò'V–Ĝù²bĵÌòo&ĈJG²ħTÄöBÌ&½{Á²,ĦË˜àzTcv%è0‰w‰ĥߞX*bŻ5żı‹,ϳ=çȏ]żċï7ħ󛙃ìĵödKbYŝÒ2&‡9·AlµĊVV]ˆµjùéei­&áa|m2.iÛôÉ4żZağŜ ÚvjùĊĤĤ7ÄÚ´üš˜ıëÙĉÉ%CLëâXĞĊJÏTĠrb颉iğRĞ)ŭK뉭èél½…ħÙn)ħñx%ŬjcżŬ‰ÌVS È1deĥ&ĉ‚z÷ĤW[}¤Ç@½‹RÓßá]ÏÍ‚Ì ÚTÔĴU£²ÛŸïçxbĵŽXOYhmÚ·ğğžE³LŭxÜ$ZYMœ”İíŝ3Šqb7•ĜŞÓ#çµ½bĥ³Ž!VŜ“7¤Pk1™˜ g%·ÂôÊ­­w,ĥZtӉŬÚaǽ!f&Y§òĠ8ȉ)A{~tëèÈ)Ï~}]- éI?´ÑŒ8OqÉVË"–Ŭ+ĊvÂK—2ĥ’$$tÑ }BêÈÀRĴÌÔyÌ ËßCïoƒs†½ë+˜óàVżĥFÀtMÌċµÌtdó2v¤ßŸy•>'Édĵú³äı9‚W+û-ÇCò.‚ĴŠ›Ç™`ıÄ^>żâˆŬ*%Ĉ ӓċÄĵhf‡ı‘ÄhÒEY³BnjÏ{ ˆħ›-c„Í(vIŒo"&˜X†iESƒ…TµĈd-ŽıETÛħž!&xp/FqpòAùüYÂ] ÔYD­>ħdÌċ[¤ĞÔ×<…ŭiF–KO’ĦwĦovVĞ ïcö·Ž"q111kóÉĊ}½ġĦ#óżĞ)ˆ5ÒÊŜ#ëàw{zŽĴ}b–à VOĴïÀÚ Ġw`­{½Ä@ Ä@ Ä@ ÄÚ&öĠU@Ĵ91<³>²|ĦEìɟQĵ&bÈ(ĥMĴ˙ÈZ'Ö{díë{ú˘ub½Ï÷´MĴ˙ ²ĥ½‹ŝgÛ·c`A Ä@ Ä@ Ä@ Ä@ì&ùüş†Œb„Œ!£­•È(FÛ1dc‰!£I ĊHbÈ(ĈzÈ(ƒ1111ħ~ûüş†Œb„Œ!£­•È(FÛ1dc‰!£I ĊHbÈ(ĈzÈ(ƒ1111111111111111111111ħú‚g@D³o ֘žeb vxÄFéˆEKc %cŒAĈâˆ% v,Òò@ }%ˆĜM&ÖŜó+S7e€ı #q(ÊÎ26Ĵ" cħb ĥ'b_üYyÛ aħÄ\A_X[ ̽QĵUvʽ%ÖŜ™ñÈˆĊKcD!˜L_Œ›sNߙù¤ĉĞĉ‡%Su§Ċé[ÚD-VUžnĊ6cŞÎ뵌qġJÏ^¤gİO\˙9ñQMԲ̎Ù&­"Ŭêj-1,b‚éO*GĦ~c’X1îdÌ-ħĤÄx1>bŒi­SF]ĜàdÚÈ mÍ2á”S÷ ĥWM˜ħüêÍ{³şëúèÁF8ŸĵÑĴŭ–:ˆµOĴ*l*sħJĉġî"ñŭGâŭĠż}Ǖ!1Û.wA·Ġd½š3²–ÎWëıŒEEâÂ5Ñ"Ċ9w^>V6Ä#ĉ¤‚˜ƒ#V‰gÄĵÙ*—19\b%‘ĝf­ŭ'‰gA·³üL¤½„]]ënŭìWӏħŭEâUïï‰ïLĴÙ%n)$ħĵŒmDÂ’İħüħ,ĥöµK"q!ċPĠ²ÄŽ .Ĵß_‰ƒX@Lĉ‰#qÛLĴ‰ƒX91^‰ƒÍÁŞÑK̄ӕ‘8úÊè¸Äb‰Áç/%ĤĈĴK6T4ˆÄA Ä@ ÄP@ Ä@ Ä@ Ä@ Ä@ Ä@ ÄP@ Ä@ Ä@ Ä@ Ä@ Ä@ ÄP@ Ä@ Ä@ Ä@ Ä@ Ä@ Ä@ Ä@ Ä@ e3ħğ]•ïöĉ#ż ŸÉġ’áw·ġoä{OúRŜ5'äž'ŝ’Öɏïĥŭ {D,|ĥ ˆmClԜĜċ35ħ$$–°ĈĞ])fWƒ#ĈF1Ö\ĈΗÏ>M'“1F‰%͉)ğj$b½#6ÚNĈR“ÍDĴ×2Ö܎ÒuŜ̊ġ܎Ċô•ġ.ĝc`÷IÌ̽ûUÛûéħyâÈ]Äĉ.PbŸ'Žb]{Öı8ïÍ>,ħÎż˜O{³1ħŜëĜËè!ħ‘Nf€Xcb‰ñ͖I˘Ĝé÷V…§ÄFËQ2b‰yOZş>SY씔~İÉÄêdLA3ĘzO§ VGl”ɘÂĞë+!6ħŝ˜ÒÊDS}ş‚91ĝü b b b[Û8ĝì#%öÍ%JLù#û˘ÊKL<…ˆòŒ3ù `ˆ(oK&Ċ÷ÀĦqy—Kf%…ÒĴp)˙ ˆËçŸIENDB`‚gamera-3.3.3/doc/src/images/tutorial_feature_selection.png0000644000076500000000000001026410714675724022714 0ustar chriswheel‰PNG  IHDRš˘‚W0PLTE"4[6L[]ZVdƒSh–KjŻd~ğsŒÀ”–œ ³ÚËßÏÏÌċçäĉê÷üŝüaŠMÖ?IDATxÚíŬ]hÇ)yİi÷Œ%%ĦP\ZÛ¤}*4„€HC(ô!RŭRl’uħ“2ñi İ)ħġèS0ÁäĊ.†â$EÜC y5hÒ<í`!´ ¸‘[Ô4µïğ½ĠŜÉÉÍìŭ×Éê´·w·ż›ÙўĉŻróĉ Ҏ…rNnŜĝÁÀ/_Ëky#8ößQĦÙl,ġóZÖƒ•“—Ż™ċÒ`°pħżÚ?sµ˙ˆY]ì•ĞĠŝÙĞ~eâY‘kôôöXqÇw´öü`°a°AÉ;ƒÒ,˙ ”<êY½ŒNö{òH{òÖb·­È[U­Œ]­Š²ıl˙ÒàQ²opùĥY>ı$jÚÑ⹢ÁêHq˘'VÏ÷Š·:YU+³ŒıW˘gQÏÜì0. 6vìáo ^%_‹4‹MCĞÑCĴ_ŞPUÏĵ›çx¤ù°f/”nYŜŬ•Òŭ(ô”{ôŞĠ¨/š^­çċ{ü·‹†ÒŬ§Ùr7\ ÊçÄäžóµš)ŠĈyş[ƒ‡GşZ#ċbq|ħĝy-ŜsD×´Ċż@óĦúOÖ´İ(Ú£ôíò-ñ˙…²ü¨ğŬŭ¨û˙¨-EqêŸw‹Ó˘&Šä†Óċ'Ŭr§Ĝ7>.v.^ûôß`­Y~zùé@#˙İV 7i-ó+qŜlżÙCwżùŸE9u·Äż3?[žÔ;ß\Ü<ùÍî–Úesíòá²³X.ŠWŝÛ½İ<Ĥl–—£²YŝpY—Í‘)Îğêŝ{ùñîÖċâñï HĦ4ÛÔĦùüÂáò Ú&7”ß)ET6ħíŬò€8ĤŞjĤEœ7Ëò{Ù ôĤjNèV`ë°,Ÿ‡˙zÑiĥž•[„ĉ”¨eâGÜb›ÜP.¨óĤ\*ĵĵUJĜ‘iZµŞ²ı-‹f­ÀIÓ ˆòÙêtugÁkÔĦ)žÛ,ÊNGĠżŽĴbB³$ËfİĞ5{h†Î›Û·Ÿ½[+0Ö~^ÈVàן­\{qûW[Ŭ;WşwKÍ Ÿĵ&0/^ùÙs›~yEž7+׊ÍġëEùˆl^|û İ™îNe›ĉz>?͵€ıĴ‡~²ĝΟÜüûÖ ċ[?-ŻżÛŭ [ž(ŠÓ·îoÌîÏ6mM#ĤMħí óuHW'ŬêĜ—#Üî¨ËQ~OĠZj}÷A›ĈÌkqÛĤÉ·Â=fÛĊiΛ=,4ık½Êe“dÙĵ÷}µ´¤lŜ Ö-(›[rŸµl¤ĉ”Ôˆ)Ġ!ĴËfûBÄ?…HŜÈılŠŞiLZd:ˆe\6×îêĵ!²dˆÍceZ6)tKSÓLÉä\6Ei2?o>/t M(µÁKšoٔÛ-ûy“fŻÓùeƒßÙÌùïl h h h h š 4‰÷LŞ ÖCô7)ËE3ĥ7*Ԝ46ËÁ(§:Ì!GtQcÙ05Úów%ŻqYŞâĤwZ• £f;M˘€&ÌrĜ.v›è`z{>š ËÁt`@:œ†Œ4a–W1ŻÉĴĤ…YŽÑó&7MċˆÚ4=>—ÚžS›e9Òšô§' šRĥkŞë´ĵËŸ h h h h h ĤİĤYÓÛİ”­ĈöFµG#³LuŻ›.O풷˜Ù”Fg9(óŬÑşpä-êFQÈE£².ÁAƒÉn(3CAd£1Y­11jËÔĵ[É4ó“Ëa È×4S2ٔÍr„ç>zjkZF“ċ°mUmšŽĈL²ƒeÓ l·f$‹ħIHBRĵÀ›Żë4|"€h h h h h šĤšy—C?<3Mŭ(ñ9jܸ*ĵÎaoSŸ"H[Çċá 2`o³Ĉ™ ËaşÔݛσşÁ ̐h\–#ÖĜÁ9Ì@™Ô4Ÿċˆ4,*ŬäPÓâ9VFç y7~\McĤMSİjSkı´i£YŽ\gŒİŝ陯Ĥê:-[ >@ 4@ 4@ 4@ 4@ 4@MSÍe9hvšş,Gž=.÷aġUö{’ü4f\âfD;@V“ċ l$0À²Ği.Ëh1ÜjšÏrDeÓ ×LT6.ËQYÓrÓĜq9€_eB%ż6mĈċÀuĦĦh h h h h &Mû³nrsƒċ£İè˘Şĵ4vŽĤÇà0ëjX38‡šİdö§àdsĴÄ]Ññ fŒä5ñ+>Âagñ`~Œä5Ñ+<ŒpP3żŠĠ’ĵ&šc%ŽpP?VOĦžM3.Gċyrİi.ËÁ†Ú4;”LŞQŞg[IżÀ+¸N544@ 4@ 4@ 4@ 4@ 4$¤iq–ƒF_rԄ½QíĜ,uŭžIÌ>0Ĉe9ü|* ŽbÑTd9Mž5-ÊržT%CMœċ*Yž5­2ˑíyd9Ls–u›†q9p†khh h h h h h IH3Yż…E_’Ó4ÊrdİÉrġÇëj„uŻùC÷„55Y;܀žkAï˘ż$ĞİÉr¨Qh0nÂlǁĜc–ÜR[̽fŝ•45ġY;fŠĦ Ŝ‘hÙÔf9˜œy‰S_ĊR?oê³ŞM£şM“w$ßĤÍG–Cœù$7 ²@ 4@ 4@ 4@ 4@ 4@3—šöÏħâÛCsÑÔŭeħëÌJ²”İ^Z9›‚*Şg(`DġŠŞï’ׄYN•ĈöH‡½Ôšĵ&Ìr˜t€MrP îŜÔ5q–Ĥjt’C7dfÈhf>¤Y9 ‘ <¸šĈYX6ɟ7q–ŝ9oH5-ÊrÈVK³­işM“Y{oê­ÀXg9¸€CżÁ|zhäèÄif7K,75›A8â²áĤñÎÀ2A–ƒ²xXޏĤ™uçVš“ċPmsr¸‘8Tħ¨6 ŠŠz%ŬĤÍÑ+„¤tĦ‡,4@ 4@ 4@ 4@ 4@ 4@Sµ´4ËvŭıİGhnÛĠÌr¨ü3ğÎtvÌ­BYN›ċ]Î\ÑAŭÜ*Œĉ4fŠÉr„a€PCYF#À¸q9Ú ñr´˘l|–cÌy“•ĈŽË1ÚĤ13·JNš0ˑLSĵןžV“äxÓ]§ċ^6ĝD 4@ 4@ 4@ 4@ 4@ 4M5ížc…ċ­úËâhN™ù1ıIL>0Ĉd9Âħ7H]L çXaÁ4+9j츔ĈB2Ô¸q9†54ËVÀd9dkĉÇŜÈĥĤÙq9TV@ž>ÔDRòlÓĉh\\§áh h h h h hÒ×ÌS–C÷·ı3EM]–CJ’êŝÜ[–Cġìr;­Šî UàNÓĠŒÏrH ávZ?ÉÊĴĈÙ[–CN á§UñydkZ]–fÔĴ+á”1İÖ´Ú,‡ÓĦIV’­iuYŻ ÎžòyS—ċ°Û˘6-ċš6A–cö?xî_–ƒĉ i|–BŠŸ h h h h h ĉ~iĉ)Ë!lÉ<ËĦğĜ3*›ş,‡¤‰Û-Ér¨gmÉr0;ùE+²Ş’é*Ĝ‚,‡ÔhoA–x[²úç ²iüôĴ³ ˁkhh h h h h h ISÓî,‡~P}W KWSŬ•³Fe9Ďâ?J)áá|²·SßaħN>ËÁuo3ÑCWèîvı•èŜ[˙•çċ‰ }pŭœ6ÎáÎrŽ ²6ħa4fŽ•Hc#d9lbĠ4>Z6&!‘|–ƒñ°Ĥù9VŞkZêYÛĤù< qe£î°_UDYŽ ê²$µÙ–0Ç 4@ 4@ 4@ 4@ 4@óE/ïż6Éòzꚉö†hŒ†4]²ì/›-ŸJékÙuytfš†ğŜPš†ôL4÷íû7h ™7 ³³Îì˘!íÏRÔP“EÚE3 NQ£r9‰İaŽŽİ웄$Ĵaĵ‰ĈeßL”'U i¤áž‘´ĤiM#–ĦJVšÖ4W6)·iğĥŒ'L²çŭyšüĵ!TÓmÓpe 4s§ıÙlњ˙5Ûyfš‰~g“üo9Úġû4h ù24­êżù2h h h ù24_o‘ĉy EšÇy½5˜÷÷“ŭûZ£yµ$û?ŭaK0ïì/ɏ}JÚħì/Ë˙~˜°ŜƒòIENDB`‚gamera-3.3.3/doc/src/images/tutorial_first_character.png0000644000076500000000000012003710714675724022357 0ustar chriswheel‰PNG  IHDR`*´vèPLTE$&#-A#(N+-*-.6 3F121&<43,03;%.„464 /š98(8:7:<9-I&1F3>@=D>8GA+ĤBDAAEG9M23EuFGEWC16Z/JLIB1ûÏNPM>QvaL7CZDLH’YPFAS€BdfdHqœGn³NkħaUùĥKG]vWTm§Pn­Hfölnk›_>Xqú\{ğufób|ħy{x„yexOd|·tg˙”˙iŒfupßykò_‡­~l‚ħ[~ġI¤_N—˜k„ż‚„w„ Šƒrm…ğĠc`]‹×v†°ôWVŠW†ˆ…|wr˜p‹•rŒÂĈqnÀ{KŠŒ‰wh”ÁyŽĥ^ˆ|ŝ‘ޏ€~Š¸p™ż†‚˙‡’İ’”‘^ĥwV°·Œ‰ġ´m{Ğ~—™–Z§˙†›Ì{£È›™•ħóyw ıĤž–”˙ ˘žĈ’‘Ÿ£²‘˘ċbÀɧ¤”¨Ñ³œşŸ›ŸöˆÀ Ÿŝ–´ĵĞ­Ş}µŝɧ~ݽċŸkŻħİᰍ޲dzÑÌĴ³µ²qŬŻĴ˙·ıĥĈ· ĥü€ÑĜê£ħ²ŭğ½şÇŝ쳀¤ÁüŸÔ¤ğıí™ÏĠĦÎÈŻĊĠĵ¸ŝÀÂ÷Ğ·ÁàÎÉwşĈÇĈÔĊ½ÄÙÂÄÍĈÈĊ§ß£âĦîşĥŞÓñÊÌÉáĈ´ÍÏÌÚÍş§ßċËÊŝçÇĈÄĠâÊíċÒ°ÓĠÑÎÔçÎ×Ù³ïħÖĜĠĜĜâ×ÔüÚÜÙîĉ‰ŜàŬÄëïìßÈàÜüúĜÔâċáâÏÙêìċçäċäüçéĉèêôèëüëíêÜġùëï˙ïñîñûèö÷ñóúòêġ÷ó÷ġúĝû÷ŝ˙üLy‰ IDATxÚ콜Ġ}èĞ]ŻîSŻ’ĵ½Ù%꽛°ÑĵĜU#Û)ÂĈġ^Ĥ,ĊÛ݉5C+Ÿmh#‡Zf_᪁W%nT nù3M7à*!WÔ΂rkHވìIˆHĈ {žœ2ĝEFDF šwΙ˙ڑvµĞ]Ëöü>£Ùóû‘4sÎwÏïü—ÉÂ.w³Ĵĝ[l1ɀğsI^üMÁQ£ŭ·n–•÷Úb‹Qĥï:ÜıÜîO Ž‚˙Àá{ rÄ\ĵmjjÓÌÔÔúŬSS[î˜ÚĥeçÔĉ&u“˘WÔœÚĵsjr;P·uFV·è*xMn™F*|fĝšžÚĠèâİífu³µşŬĴNË*¸ç)ÜƒÓşŞĵĤÍŞbÚf}E Qc§Û~ÔÔ,ĵ&ÍwĥMQÁ#˜žyzVlŸWÍhé½ \ħŜ¨6Ċ‚?why…2äâ•@E™:­Ğ3šşäâ*˜“½ m ,Αşŭ#g4y÷ŬïÂVNO‚XżcrâwLNlÙ9ıqËô$T×ĞêÔäúí@Aê&ƒş¨›§&7*êĉi¤nÚ>9 b&ÖOÉħÛ&'7NĠ;.ž€*ˆŬ$ÇjêÔä|mƒ/¤Ş/ƒŠ˜Ô Ú&Ğş ™'!×i!ôQŠşmö)ê6]UĝšjzHĝ›Ì)˘&9½ÔÔÜ,ż6“JN@uv%svÊ+ħWÂ|šÖT˜m0cwLĦ|ò¤W2vófĜÓLŜŭ:07 ‡†#ߞt¸ŝú™759}ú8@ñâɍ›&Ç×nżnlŭöñ ë§ÇWo™‚ê8TŻTÔͲ c7ĜÉñÛĈÇÖOoĜ^ÛC* nžÔԍ²şQV7lœWÈħĥu&œ„Żññ ¨Êħ 8I~Á+&äX¨ŽMê*z]7>üÑ^z ú ˙\7ĦĈ€üĞŠ!h!W+/ċB'+ĤIÓ÷˘+UżÑħ Ó}mÓUĝD0 ĥT% ê&Czi‰;nJëë䴆91iT×nF ³mzY]oP· u Şèb”ħë·mÜÊ!#&§Mß9c4pöšI şï3vZlşÉñ• m¨ÉñUÛǁi|ìJƒşMŽŻ–Ġħġ“²şMV7ÎR7lš@êj³şvİcPŬbĦ:Ôqùb¸`ĈÓ ŽoÁ ² _rÖ(ŞfÚw fġŻ\7qÇ+Ûï8v äöñ{Ç_ıw|^²ïĜlÛĥƒÇŽ=7muı‰™c Rğ3]MîÊZ•ŸyLO‘ 0 ÔQT=vEjn–ÓfLúÍzÒ+ê*˜O Û@^­Ŭ<srLɵ[4]Œòù:ĝŝĠ&ÀN7vz`§eÀŜgìôi0T~­œ[ŭñmc€‘ħU² €ß;c×N Ċ˘'jR·urlĉ M] ԍc ½ĈVO*êĠšşŞ uuLU'ĈĈ6¤>z]ÔëtĈŽË/U½ZWŻ{vñĜĜĜsÒİ/n¸Wşü^éû6LHwoî^=6/y*żĈàKÖàI<86ĥċÈ1í5]˙˙~t˜ß:vPR˘ĈÇ׍!Ĉ~}ĠħW/>ġ‹Ż[sµéΌw5[EO'áKN‚MrĴUĤĈ6Cò™RsÍĈë@òëI^0İ c şYÏ'¨ÂŒÙÔi¤Ŭ,ĞĞ€zĴBùĉéğwSJ0ĊİɌl_´ĵduÍfDêF³ )jR׃ôš\S’°f#P7ÉêZ³ŞĈ‚ |ĦÄ]‡r¤·œ#rŒQ5\ħaLVŻFY·P_À5ÏĠ˙ĉÔ­Ĵo=µċ^ĜÖê°Ġàhħóôğv­İ<·_W–ùË^yuĠ?ßŭ7§8öîİ}+ע[QĦÒcµY]3n~˘q퉐zµüßĥÉ25Uu3N*êĠ(ĉÊ À×ĉ&UÎ+FCÖ­ŸX·jË8Èv +zyzÀŽíÚşkëħY%Ĝ×·î½{+àîŒ\›DE随+ċ×öukVNkċ×jHϔ†RċXc uÓ8Œ•ݏ%J ı°Cê&K&Ò·ĠWëêĠŠzµ1ŸŒƒTbȅx='½sëĊĞÖ/ŝÉÏï„.òòze; xɕ(°fŬAqë­§´ê•ŻÚe7qïecĞÖH{A”Ŝ¸Ğzċ.éî]Ͻ}1`eì•##z÷l˖—/ßY;ĥïê5•Ó·­ì ÎŻ”·ŜúîŜĠâÁ‹×nPnKWËĜ@ÓjÀš 2ކXtf%P›äÓÔq9éġŒYkTÇ×­ŬääuèbU½rĊÂl_ĞE“zì€É 0€Òħ28²‹|EÓ{·"dÀ@-z#Ĵ*ġ/P FU]ğ UĞVoœ4T¸4Uöú°…8Mkeu Ş€**ÑaS1lÒTµ>ħAQᅊjĴa·T›j:0ŭ{N<ü£ġÏĠ/³rlĉĝ}ÒŬ`òyġĝÁĈŜ½{·ràëŸ{`ĠĝG~ôċ]Ч9pċġÀ.ž8£OĴß .Ù~%lòÖ]ë÷ŭè²;xàò™G~ô‰+Ÿ;rä˗Ĝ{ñÁ½+Á1qàȑÜxl×Z­“ö½m˜×^¨-5aJ~˘MŠşÍĴn—{¸uÒkdŽ’š›'6 UNkı§iš`—ÖĈí“´œ@*Š…êµ˙KÎĥ-Ó²:ԝH%Wò ˜(€™ÁÙk6è€߈Z‘›Ĥ•~]Ĝ?5ıeFïÎß>5ıöž_kuğ˘NĦ>eԕ/wĜoVĠJ˙ŭ잞T:Ÿċ‹§`Ç÷&ġ%ĞÛ4uÒĞô’˝ߛĤ4½ ĵvéƒ×ÚġSĞ×O­]?9µaċÊİ Ğ€iċމ‰•“+7M€Àڕ뷁äçİUÁEĞÖŻŸ˜œXğjŭä$4‚7NZ519 /ÜĴ Ĵ]ırŭ&ÉàŠ+×NnZğrV‚·ŻÚ>djĝĴĠ+AôĤµ›À­˜îj[Ӎ‚?›g=•ŞÂ÷n2§ˆ!½´ä›Vwj›)­§&”äß(_1ò ĉT×CUéżWb·Èêz˜í3S›ĥÌ(ħS“ÈE1‘kgïğ&ƒĜğ†÷ɀíœŜĥefzó­àµ{çôĝşĴ‚àŽ²:£Ğ;ĉ£nŸ™Ŝĥ|nž·şÁkçô´ĞÁkŞY/ƒ:½üUŞÓĠ¤NM)êôôÔNeèÑ<* >Ċ‹ċ·kïÖĠmĈOaíÎĤàkûv£:½m§ñċ§š‘ƒZL·J‘uFS·À ’ŜŞşÓĴcwj*ÊcY½u§šÏÛnUb7뀝iLgï,’Ŝ‡Šƒò^—ŻÙ;·ożcçö[ïĜıċ֝3à‹ĥBSwuĤ /žÙTĝÚ½s'ĝUŬ!Ğ;ApZ‰Ŭ!Ğ3êùbċŭ3MêÌΝ3w  ê*zŬaVĠ+Ô×\j™û½ĈÛÙiĵ•ó]5Ŭ3|À™ŬĤ‡DI°ğeY§×ì´Ö.ŻOìFù´ŭÖ˜mePQÖAu‡ĤnWÔí;6ÁħÈL°çëFwĦ˘Aê<|À ‡a%¸³™·ŜqxÍÜş½vì*îPÔ[gĞŠİ…ş[ĝ¨¨ŜĦUu·AŬŬkĵbÇîYêŒŝqŠÚ+b³™#ì6ŬskU}ïnsz™“pfF~ƒ1­ 9ħœ1Mħ·Z¨(ÛgvìĜıùn€…“ÇĴÀ™eD€Í’•3Pî2iĈşlÚ-żZÄÎKµϑ1Ö99OufĥtüÎrùmħĊ$ğXüŽcH°Ċ–%“!0[lÀlħ³Ċ0[Î&`éááál..X ˘ĉóaÉáa_aÖÛÉ4ö[!ĉŽ”Q Ĝ™qFÀs1 !pĤ °"•2AHà€µ ÎP‹eÓE‰˜ °|{ÏÜ"‚ÀÇÜù84ĉk,!>6›²9‡%A§ì\9Oá9ƒB°tĈß½">ŒÊÉX&DçñŒü™LtÑhIŝH§2>ME„@&XФ’^nH ¨L‹:Ó³çXÈdAF(;[Î[—óPiW3`> ıt€á,&¸ÒéAkÀ˘´ ҜIċƒÀèM‡¸h²ÙE:!]2`îtÚ-„Ry;WÎg)F„5`‚(€9 "f X’ œœ"H#^ áfÀB–àUÀ\ĵj„ÈÚÙrŜV0kÀB¤"³¸0ˆ BÓE€#Ħ,qàHs¸ÀË)€ùX(Í ıÈ˘†>0ÄĈvĥœ—€ÉġopĜx†ÍĊH’ÎǀÔêñá^Ng0Ħ0N•3İ1‰ĥ³ĝl&QÓq!£–ŽIRİ;’`a°1Ħ`1’L„ç£¤B”ŒA5 Ġ*Ì"$MÀ$ ÇSI€Èx8œ áٖ³œĥŽŒÑEJRL$“(†ZÒfRiGı •Ĥ‹,&–‘âJa•Ž–¸B%-IEġ J°œÄ% ŠJĊ$^DV"°ĴXG\UŞù*ÀSâ œŝÓàĝ˜Ùg 0" çÉdÌ.r„)2 SL‹T-@GaF pˆ”[ÖŻQŽrç.ÒX$KH÷BŒŒİçŒz]J…TVj‰x Żĉ€Ĥ #E*&1ќ”¤¤t,ħ3ûĴV"à̜&9Âd|CXε‚rCC°”ÊcCİâP(˜‹‘!V£†‡Bé§k‰ìžP¨Hwî"€*ePŬ"ù(ÙX…çBre \UX”c•\¸ÂÁr ÖÁ()Ĥˀ4;³Ï`ħ–ċ"G˜TĤˆ%SAÀÏ`¸8J#ŽÀp/ ğĜpx”`n¨zˆb1‹`xşs™òàΒÀĤÑÊİg`To,VÉWÂM€…#œ”´3ğwê`²‹dî ` ,ğ Ş üĤÛí2ĉv÷ɀġCğ'Ĵô˜na­HV¨RUĤĞ*?XRÀËÁ³°jŞĴ•`À3ĉ°H6>+b8J0²Ì§mÀÎb+2/‰ĝl‰%µL,—–K-˜ğı£µ#eÀbDQûÁb<ÏgÁ™n‘%Au ŞaR1˘ƒ‚j. r˙ÏÀĜ\8œ–@ĴR‡MÑ(ˆMññ0ÍĞ—Ùr6J0YfğH,ˆa)wF,™Ĥħ`X ħŒN¨˘@c‘”+ ì!X¤PôäÀħ€VäBžƒÊ…)ı9ċJ1ä"mé À4ir‘tħHh*ŸÊS  :W¤SĊbòt1ŸJċ3i„30šLÁĜ|*ìL1­ p‘Y‘b‘¨ u1CœDƒs•kwuëÏîM9Çn×(xHâĴw´Ê.r°!"Éñ‚PQÂ& EjĠœ…ħ–µ0Ö3=;ĊêÁ*pĊEBˆlñ]dµK Öħ‹Aš&Z|$Ĵ6Û^ÎY³FĦ‡³H÷Ĵ2;‚9WË&gC’*`ÌÀkìĤ}ìcĦš£FGGÉfÀÒf£ XSfÀ éş°?Ŝ0ŽÀƒ_TĈœ³€—h˘Žv´œ#ĉóxüÀʟżêÑC^uÉ%Œ€ċGÜóÏ#y#`…Qdô䍀A#ó|49 €eÙJoH×f´Ddµ|âĦş7VŒ àzž‰Ĝs0.v„UĞ@w Ĉ]zÏ-·DŜóĦœX.@z뭓'é@V,ݳš1 $2> €qRoH‚kŞÉêñgú÷_hò›Š°HĦ,Ĉ0ŝ\ìĴ‰_¨ğéÑC×_›- Bî ïg5À’áSożuòè³Gq°TH5ĈtÀ4c2ڛ€éġ, ĵĞGÖL%X&…¸RÌoĥpÀ–1vĠĦ›ß£\ċTÀĜÑW߆Ĝ<ġÔ½Œ 7˘}0£1?`%‹FIÑòŠš­.!`éDC‰¤ÊÀ°4îu9mÀ˜Pԋ~áó׺ù˘[ˆ’ıÉúN< ¨yĝá£0ŬÔójFl.Àf–İA”rZF@! -!`qB_s5)gŒ¨+ċKşÏeÀj³#5‹:Ĝ{?tè+×ġóħá7V>yôèS˙ú=&Àt£°WUc X‚“pşGŜRÍa™!”"ž` ¤$%=D\<ĴRš‘aF$qTit0 ÖCfÀh Ô9£‹,àġ×á;Ŝyá…ïÓ€ĠÏRmDTë`90îCWŬ|óÍżQşÂŭ~VŒ <œ ĉá–›T°’ÁXTÙ&£V‚áÙy5Ż„y%ûİĦÁ)), ‡`,”\_ÄRGşXÑëJÓŝĦ” 0ħÄY“‹,`ġ?ıíuéÇ>ü÷/ ڀ-0ĦdèhÍäŞ›ŻşˆB!,è”´J~ ?ùì÷ÜsÏÑHÂPÉWÑ¸^É'Uc,ÖTÉŻ9bĴB!§Ĝ¨ [6䏢° °F×ò^—Ë•4—`ÉXÚÏfM€ëċ?ıáġĝ˙~E°Ċ&†J>ó!P~ Dwğ1ż_Œâ°â~’ò=|JŒbxT7ÀJxÓŞQĴ3!VġJ ShŒ‰0q ÀÄî&‡Ü cĴ&63Ġ@Ñì"ƒu‰˙“+_ç-`ĠlĥİĴĞċJ×MŬÜGÓBÊït8zO~0{0ŭá_ùózO>ˆšŒYŬèĈœ04=•²ˆe^‰Èf1‰H+F²ÉHĊ ˜„eƒK˜PL*ùhà!=Чâ)c –€Ġ|Ċ ?~×ç`EZ,CŸĠF²ĤäñèC‰t·+çaĉħÈ\wû½#Ħi*ÊG"‘ĵW Y}¨¨Œ9Ŭ(1š‘6–˙ÏH|”÷JhTr1µċHIyAÊGİ|†%JkE–£ÀBĤàT˙e荭ù@­üŸÜ‹?;/@³ÚóŽˆR½,–hZ1 oHÒS“£ž<ŒòÔşR‚•AĠCŒT žà(f5ĜÍ>2*`ÊVê\P1ğKX˜ĠM!bĠ§†=P,z0Š>bHˆn`íĞ &ÀŞ/Àú ìğç`JYĊésn¸Ñ$#É.cşó„´"ÂŜ:8bt‘ˆf*˘ú9¸M§7êŠ hğ*?P0ĉšgSÈĈĉ~0fÔ×é­²£ì’öxY¨WkÊa.ÁŜyìïßŝñO~üŬ÷žÛ€‰h³Š˘”"B*sêî (£€‹ôH)R£4CȰ)€ aB슋du0²0„|рÇeè+်G5ü`( ”`ZGqû`ȏş)pO˜Œ½6T$h³>`-§ëäŭÂ/½ĝâ‹?ûîÏÎuÀhèU8†a¤ZU‹…Ŭ’LH˘£˘XCLĴ+%X3ÖÁ¨ŝAò ÷SÀÊôhŠÑ½äÓ pˆƒ *Áhš.˜ŒÊlŠFoHÂ8ë“j ĜŠÁA÷{eqŸ.ËfIRâB˜ĜŠP–Btc4]éĤȗM•üˆ×ç÷‡›&†Y‹ ‡‘‘<'2½2,{áM84ĥ"yS+RˆFI' £ /ä$Љ6@ 2ÊK 8˘bwì­` ŭȗL­H†-ImĉÊÈ˙Ĝ$Ĵœħĝ‡Ž’³* Èy ˜Ġ´AkcÇÂZ=0Ìj.UìÉg訣µĈ[Í9XҞ|˘ÉbFĈÒĜ³P9KÏ0?À–|¨ˆÎÊ.²GĊÒq·òĉ= ĜYz†ŜŒ("ÀʽROs ĴÔ3ÏP2?}_†òEtŝ²ú Ĉó0˙Ȉĵ胧…ŜX˜‘cşà K'ŽÉ­°—żċeŬĞ‹Ùy†ĴñQĝ2JóûYì³(Gç?>oÓ&òt½7:CĵĦ-̨†Àô¸œf:`÷ßv˙ŭ÷_ñ}ò{ò„ŝ •pŻÖPe™p¨.úè!Àtȇä3w]sĵ °—_„Ûnz0ŭJĦ^,Waċ|Ó<]+ÙRħÀÓ4'eáQ,”éĈâÓ}ô4`—˘˜ ĵ.óeÖ)`EK)x‚Ŭ7èì÷ñAúoĜ]lGkñ\ì/˙r6`·Ŭ² ĜB$Ĝ=Ġ͋µMÀqp.‚ÌYöıÏż:˜(”á T2ŻöçÏ<óÌ#5vÛ/—_xĴwàÊXöĊû ì›ê3|ñPŝ?ğ,€1,’ŒDy½Ŝb5Ë*"(€1ˆĞ˘0·´XÀÊı^,ì"2q—_ìÄÏÂ]×3öĜ Pz0ÜÊD\˜ĦûĴħ°ê9 è š#ÀEҋL[ôÑ[.’pı\ANìñğ€ŬġË&)<~˘—]$ƒgÀK&À\}½XEnE6ıÈ:îN:èŝT'܃Á*ċ$Ħ‹Œ­`[{0>äpjL/Ĵ̀ŬġtO×ÁJ¸`xŞżƒMH~V+²FW@!f~Ż{ÁI0kÑGŻUò#z%˙ħá…fUò÷ï˙Ëgzğ’1Wò`5jà{˘£Ġ¸Iƒ”#€„ĵŝ€‡ï>`yeÑGO·"…ï_ 0_S:`r߃`Ôıъ€‰"ıµ÷ 87o’És‹L]ôÑӀ½ùòNG_Rìĝ@ÊȘèuÀäÇ—Ŭ.JyÜŞıĴĥ”=ùBOvS4ùzŭeA;ĵş‹„c˙%CŽÑžïS„$èr%Ĝ³)– 0mÑG/Ĥ-ÌàPĉ|˙Š+îż˙ĥûĦà˘µÌyüÒ=‚pÍ'Ĉ•éAÀ‚CF IDATjMπ$À1Öa&8°L­7f0xX_™J³—_€ğíózĉ{ĉ9Axĉ™à •üy†œñ Y‘Odç` Y6kÑG9Ó+RZ|0gžĦÜjÂa&Až{€ġá‹L°g´^€3ZÛĉ‰Qñ UİÁÂà°c °0À´Eċ%Ÿ‚gµôÁr9„ùVt‡TÓâK£0ûŬ–İ—0Ğċ4¤ħWës2}D—ĵÏË,ĵ³úuĊKÁbA^´Xµĝı‹{òX­°şPħşoÍÊXÎsi X·ı' tK! KvÁEvY†->³XöEE-V&ŽX,çù-‚ÇjiĉˆĠOİŒ^Ĝ€ĠZH]İt5úÂĊx`5¨Š6`6`]œ“ßçLô§ÂNwb°Q^·³ë"`Dš”¤xŒÇb ŞÄxğ³ë`u(}D÷:ZmÀlÀŒÛ^$)0°%t‘Ŭ*²³³³³³³³³ƒÒòÑ <@yDrP´³[`-· 9‰ĉ˜‚äuót5èÈڀـ-0e ğjö˜ew Œ pŒ›÷:R6`6`&O‡$ħ^Ż7ÄŞ:?RĈÏY.Ôú5¸ ;ĉ¨ĦQÈĊ–^ étϒxxè}0V?ˆá&˰'áPX;C›Ù$1ËÎñ‹+VWĈzd+ħ%›5×ÖlÓÖ’vĝ*ʎŬliĤëĵoÏ7šċ‘ğ~#IïŜĝ’vŝó˙Nüžċ°znìAg–”ó‰ŭè,™ÏûgYÀŝ4Ì,û#³ŻĵñÄïJçħÔà" Ž€ğëp`\ĤG]äûñZ³ü&ŭǗLçżÂ˙Ħžwéaé7ÊùKzĝ.íĵ_ Ÿ0œżôn³œ‘ošÎ_şpĞÈ­Èĉ­÷ \$>(ĝ=ñze4 œK€]3ô7n<Àš,ïJŭÍp~Èh9£œ÷ÂÚù!£ċ·$p~äŬ7˙üMFçÑùĦ 0ë­Ôyç@?ĜûñU ?}í5ĝç5ôç‡wŭ‡Ñ?Êçk~ÑäÁıħ_ġ•Şlċ -ŭĉ#óñ›7Âóì"gM™F[ÄÏ!Àû€áxôµ×nr8ú`q\ \d“çÍŝž÷7ûGä ›ŭ#ô††p³74žeoĝf³—´ÓE(‘—ĤħB—!d(ˆQ!äk ċÊşàĊzċ•ïBÈ£‡g—`‡Ŝûİ ĜWÂ:Ĝ,ßwâ‰ÙŜÏ÷K³ŭĉŝ&Ëlo¨žy×hySö’iöàlĥ!‡PñXĤì.ÂĜµ¨ö¨ÜÑş4­Èv+²ğ€‰„'ŜhL™Ĵ#z=Y‰˘½1h Š0˘1%L}ÑF{ÀœAĈ9s†'îu%úŠè(„\ƒ^ÎQt E]L_œí‹#u€Š.ŒË DÒCNĊW_L ûòàPS’ö]ûS'ż­È3sĥ"ß4ùGğÙ)`1ZJ‹„Ä+s)"˘äĞĊëñ4°°8ÌWG"]N‚°żBÎZOŝ£_m*z·ÉKĥkEÎí ;nEŜh·" Ġ§V[Äà>ÀECwkˆpÖâ)ž–òD@ĴÙPşKšHŸ›c‘v+rİK°[ˆ0ħk(./°°ÁR0>˜HKb‰Ž‚°ÈĈ²çX¤•7´jEŞŜ·s·"÷Û.ÒR҉L¤È‡2)ĠEĤ3xŒdH•|Ĥ%W¨dfkġ3K1ZŞÔŠ„$*E_­ykñx#žfq)­ĉĞJċ† Ĝho$(.Xc0iH°]¤ ”k-|ól Ĉïë—ğ`Ĵ˜$İ€ ¸ù’†éˆ6`ĥ‹´XŽ€ Š‹ôĠà|00LŒ”]$°$$†IÊÌl.À*¸'\uß~ÔCâ ZJÒÀH*%[Ùë!Ɍ˜€–§ÜBÂ$Ż ˜ Ĝ|ğ)ĝğ„œ•‘µûÁlÀX&$ßd¤Ħ1gff÷äÛbffff‹ ˜-çd+²Á 5Î̖%Ì[cù"afKW L”‚¤§#óž¨6`ĥt °͓Ò)y`ħ (Á4.ڀÙÒ!`-·(†bh  0Öħ ŬÌmÀ.Ĵn-˘XÊĤaQĴŽħ¸`fK·\d&‘.2”ɀykĉ=ÁlÀlY\+2C˘Šñ†”Yƒ XÚ̖vSx6`6`­%dfËR&ـÙbf‹ ˜ ˜ ˜ ˜-g0ĵN¸˜ĞûÔ½C90°…VôäùtCòÖx!îIž˜ÏâR-ù!#D0°ne$g(C=ùĦHR*`Ħx<Êş£ŝ  ˜ Ĝ·H¤AôÁnÚE6TÀ†ĞUúÛEڀÍ1›‚³^Š`Ĵi6é‹k€ ĝ|„ ˜-‹r‘pßgZ ĝG:ĤÀ‹Û€Ù²ÀŞx¸È¸‡“ġD–uÔ$ɇb¸”ġxX)XMık6`6`ŬìĤĦ4ì~0[–°JŠhfK—6`6`K*6`6`6`ĥĜ€Ù€·€ĵPemÀlY"Àì­lYÀDĞK”G€[ä< P“·(…‰2Iƒ $Áßĝ°³ëĵIS€(6ѐh‘-W¤<;§ZZ”èD^SÍۀـug°›÷@İÛŬĥt °âïÀÌlIĊÌÌÌ0000°…†ĥˆš›“ % vSÙ9ĴW–DŞĥœ]İ”·u@DÁ­JBÌ ’ĵE•-TXİF 9ÉÇSB-Ĝv°†hËù(YbÁ€e£ħ´4JD•­@@Ŭ:Àep)” %ž•ŭĜ܀‰‚-磤çĴšp뀊4T1m ż… Ôh‘0,ùŠ’Žċ·Š‹,Ûr> 5'`­·ˆ6oà×·w£9óĴ€Ùr>Šw.n0`Ŝ: j,98oÀ\1Ż-çxu‰/fëà"ċ­’YÖé4nŽœ‡–‚Ġ97@€9#1 Ñp[‰Ä"&= Ûҋ‚´:XŽìîÖÙQĉĉı‹ XF*qµzŞí}§¸I/ÖíĵìMÀJ vâòBĤˀĥHà8Ġ `ñ0)²6`ç `݈ àÙEVnÇ5:,ZcIĦÌO™ĝ ÎeyĊHA` ñ´”ŞRápLUI!€QB9NTáٖŜLá9ݰhÀş5T£Óe‘é0À,S%Y)Gä‹‚ŠÑ8ÏĤ%6U×6èŒÈ…Ğ5’ÉÚıÚk€ċ‰ S€ċh:NJEà(cˆ2‹ƒ˜!`àHÈG¸XC.²Ê…éjħ`gjÏV ŜL_•ıD],—HDM€Eı‹˜‹$Š ĈÎĠ^ÌË1ŝ.Vh”ğu€X­œ%[Žg `ĊXšcB1Ĉ À´X#l4p”*`T:ÎĥôX+’„`;€ykly‘[h€e%‰İĤ˘,/J™(+•„´&„’$²°9ÙàÙ¨ĉ"2€Î–Ŝ ‚Ċ.ŞY'‚5Ö…€$ X4!w˘F‰H"‹ƒzV&M$äT €×DĞE]g ÀÁ·$ìLí9)Ë"›µu€g?İì4ß! eU/•€‹¤%²/×P‡˜MTO–ĤTIÌ Ĝü·¨Óu˜Ğ( •ÍċrĊ"ĴU‹ş[csy‘Êİ1²8[Kc*×ĞR°¸Ŭ< "‹:Ŭ"‚*Ìۘ·2Ò]{:­KqĦÓuÄ:OGášX6êĞ-°AħZ„j•ĉĦ"Ž„#µúlğ³2f­Œ™ž4UĞÍ]> "ĴR‚YÖ°ˆ ->š­Îט+-Ùó-ÌEÒòÖ”şu€PáâÂĝ@dÀ”ûzJQ™¸†ò†ŠİTŠÑ³2f‘‘5`bk üsŭ²)SJ° x:“ĤÈ4“$ċ˜ĠüLş:_cÖÒĜk€ItnlHtƒ-W“e)ž‘XáÀŒ€ċ?ŭW?˙û—\û3`! 'pŒ0ÖlD€…ÍFX6›ï I% RŝÈñ€ħ™J€FÓ—¸Àkìf"ġĊĈòŒ0îŞGŬüû½ç=][Ö+‡ĉÔİ“Ż†‰²0>ŒxYLıòd獀qŜDRO†ĴÛ×~]~iĴ݁ëĊ²?%€aĵKó3f-= X¸Ex€ êgTÀ8Żf TÀ Ĉ`~Àb³‡ıĈ‰"ZÌ”¤œ'·„€%C"JIâŒ.’!êÊb@*ll„ŒúAjĊ˘ò‰!™%` Ä˙ûß qÉĈT ˙˙Aò~Ĝh*ĉĈ䵇ĵ÷Ĵ"h.òŭ—Üô•GŻżäCï) 4e¨ä³ŝSÀëŭׇï9óiĈ ˜nÄ̀ħUyŭĤ@UòRƒ핗4òlU²T^‘(eóÏ 'U(aD’Fԓܰ"*W4Àâpù(Q´ħcú;ŽÀk€òaà%cÊRa…%`d`˙ˆÄ­#à˙1ñ?ŝ_$ `IdLŜô’Ħó°rQ݃}á’GżróÍ×ìZžx’ÀĵŻÊÔ<üĴOlŸz uÀF4£ß X!$p“ì$É$Q‘·)Âĉıp2F‹£Ò0‘TŠħ\Dá)FK™X÷cŭÁ²ĦL€•èĴŸ7ıÈ^˙ż“¤w^żíï_4şÈ™$&À˘d2àšƒF?gl$J#{N†5o@ê{äŬĉS‚1Ĵ^É˙Â%×ß|óï˙Ÿ„pD˜Rɏ%€Ó{ĝž{ž}0ŞWòqÙĝԃ½’Ÿˆ!€1\6ğHÎ9YóJœWò€§—ıò#zށ`êeŠÀ<‚Z^ċ"İ,_#],ÁbnŻwϙ+Ç£ĴÉE°ú7?üXŭġÛŝàE`Ħx,>ʚóñh|´Ĝ4z‹M€cÂËô2`ù,üÙ[më!§n ĊÓiĥEK5HIŞ(ĠŠ‘/·­ƒÊz%?~ÉU—ü¨—ĈG<ĝpRŒ<azêùàƒ:`t Ûd€e›`´?RE€Ġ½ÒßÔP°ò{`’ °F÷nW lv‘JÄX“‹,ëo~ĝŝÛŝà7^4†ÇbŝQ 0` Œ6•` Ù&À q¤—K°l4·HÊ[„GÊzŽÄGV%T֙t“ıh2Rä\QĠ¨ü#’°°ŜpĴ °l<ÚlÀbK˜“[r `n KcŜ§š“Äĵâ†Ŝ06„Ċ^Ĥİ6 Œ£a`Ĝ X<8’ï…:XË­¨Ĥ­âf €ħŒšıÁ`˜cŬÁ`,ËŞWĉ‘ħı£µ^êĝ÷ Ċ’¸d€‰ÙE Ż^üÙwöŬ÷ pŽó3f-=?Ĝ]A˽°~°\ÙX ö;8>â :Z9ßÀHT÷’Ŝ˜â"‡ ³5ûaƒ1ÚkCEħŒ6ë3IZÌnŠF·|úӟâş gS„ ’ÄB—’^XO~)gŒûGG\£1Ŝ4]'` tRu‘ŭ1³Ñä"£ XĤGĤ됃°í+ĊtI^p€ - ‹4•`Àñ1@ԉy*`lÓ½#À¸‚Ù< 0­›˘Ì÷Š4O8l X³\X€uk¨È­L²O„çĴfŒ#ä,fÚgĴŒiË+{w£I‹ÛÍCÀÊ)‘…€ñVŬ‰ñ<Lc!(U™E ğ¸T²ê d,tÉêv9µo˜DĊ…%Uj†g(œƒŬĠjYYôÑ£bµÎ"Ŭj}JoŠġrš†Ċ–opBĠx]IX@L[ô!ôÊŒbÙT‚YíĦliláÛΎ˜~dġ,Œ=ĜĴ­âéP}T´ôÒĈ…‰ŽÒ=ò ”ñR˘E‘rVŸá³˙ÊËçžĴŽk’_Ŝ: eÚ:€wşŞ)OĒ~Ŝ€1…‚ĵ胧k½ħ0ƒÁ ‰RXÚó ú×{ì W<Ĥ!`Ùzotŝ²˜ÊÇÑıw‹Ñ<% PV[¨DNrƒwz?˜2ᐧë½ÑÊàzĊ+€ûÒelYìeAĝŝ Pġ{ò„ŝ P/Öfë€HóÖ Ê ĜĵvИµè£§ğñ™'÷4äûWüĜl€‰m·2nÑgSȀĦ:^ôÑӀ]zìĜ³û>r6` ĴqP` „¨°u€ú£WqœQIRr:^ôÑ[€Ás…’ ĜÓ×\s͍Ï4ùzŭ…ŜĴœƒ#ŝ<ì‹Ż@QÎ`˙ ÊËçžLÊ˘­R ) ·HĥàR"—‚ħ ù˘ž,>’ĤKŻÇżdìûW\qÛm7Üßğ€…G³BŜKȀĦöcƒñ,·"yv"u)í‚YĊÎÑGOĈ{G†Ò `û/½@vé3&À^Êë½ X~Ĝġ e .ò³FoĜĞ.I¤E¸•e>‹>zËE2>—'­ÖÁ^x Ê ³*ùw=ŜÓu°Ü¨k$+˜ ĝÎ Àş7T¤/úèħJ~Ŝ›Ñ*ù÷ßĝşb`'tcoWò³ŜĴ` ç`Ú˘^kErz+òġ²Àßpƒ ”ÙÁ"ŻvÍħc×@SêÑV$'4VŸ¸°Ó}ôt7Ċː/îs8Â:`—>ò¨ŭgUc/wSÈíÇÏŝ§(ħ[{ĵÙmÀöì†^†Yċw¸ °==ôž'…RÀádz0eDûîˆ(•ˆ³>Ĝ-6Dùb‚rJx÷z°ŒżáŠ^ŝñŭ‚@ö‡´:ĜñK Â#7F˘ç;Z!Ŝ7Ò~À~+T9ùbFE)G²RÄ+d\…ş˜ĥ裇Ëi 3(Ûc·AŬö!=sžĵĉ.P ğĉÍĜS€áYŭ °ĊóX!rÖSvD3FÇRa6<*x$/ž"Ä.–`ê˘žÌġÈt´qeFgÓu¨yÊĝ Yí’ÑĜYLn¤š+\Ġö Ğe!D3phÛ[’ĵġnşHzraFg{ó*ĈÛċıÒÙL™ĵ•àl5ŻNیŠp+€Ġğ˜iÑGoŠċR”–ëSìgX¨‹ŒÒRt)³Xy`!ılИpë7…Û}"ɉsˆòv`FE\„Ċ%—:7_)ÍJĤb'DĉÑĉÚV‘[‘˘à? VqOg\Œĥ(ƒŬs‘£°D­b)‰TĠ:˘2,V*GU*8S™C†•9Ċ#V+]ĝˆ%<Û `am=gžœĞY2µ"—´̰¸4X³óDŞÒ♆Ċ–Û&J9W™ ‰s§è°¸h?â…Ĵ3À´gé•_ĵµ³³³ë°XĈÌl鋸ܴ ˜ ĜRwıàD:0°ŒŠEŒï*`Y)×°³[X%ŸŻä£5)i1żxkvaVkbúü‰ĴJŝd&Ċ¤„mÀlÀTÀ„‚"Ô|+){0ë%˜²u€7˔) ­ìĥ³C¨N óÛ'żPáƒÁ`ZÊİ£UêÖpĠ­” úlÀlÀ4IĞX!›ĉ·u@UyžŻJúF5¸u€ G0°&µr‘t,Ħn­S‘‰°(À8Ó^\aO2a)ĦH˘…`İĢ <ž˜CÚ½ƒk–ŝ#–Ppf‰³hEf3€2)Ûà‰Ke¸2-ċą7Jh8IÌԕ½{Séҏ#p‡Ŭ"*5jŒJö}Ŭëu¸RMbz;áp¤,äñTk 9ÉTÊáÀSmċñT·dĜá:1‡ch8ÚµÏÜwş“yA™ÎƒMH6$—İ£U/;Rşrâ†wVŭMÙoŒèwô~fżéë0‡×¨˙ûoLÓžĉG4½½ç@ċt%úšĉİŭGİp8ĉXÁ°żk)Zpô;ë~Gß@ıkŸiNĤıd€ĦµDËĜ“?Àx#a™?LÂá´Èş,ܸÖ)J(?Ù.çÓŭI’x¤Àd -`ҀIİ>cÂـu¤Ĵó0¨ĥÈşÌéXë”+&›âgċ<`ÉI6€\dcù ‚RÖ9T²›` f X½Ö"Ş<ß*JBĞ1jíR.”h›óh-…8:Dôe~Ž j Él€™ÄT›oŝì_\ÊÍ'çğ@Ç~İ—ĊÌĴ‡Kt“?°†X—-‚SjĵX-•µ³“"ó\ôa X•cäCĞ´ İJ’ Ν à"Gf$)˕mÀ.`À:˜Ma˜Ò:2Fd„s'ü8"”ä uĜ@Ào”àŜ'­e˙ŝOîyòÉD=ùäC<9‡ìyrn™Ï5K˙K(- `Ê dU*—Ë‚TÑ:n`Cċ2*ŠgĜ`™ĈĦjg.Òm^ï^ÀÏXË/~Ñ"âÌŝ3guĉÌÓ'ÎÌ!ûÏÌ-û{fħr×]ÑrWg€•ç?]ÇĜú•çQ9 úye> IDAT’ŝp×áƒÁ ˜+¤ĉ·ŭŻí"r×˙éè]ùßîZŽJÔĈE˘˘2`¸$Ĝ€]à€-°›B%˘*·"+ĈVdŜáAÁ–Ĵ&=Şä·³[(`° É䍭Èì+$ß°B­e3TëܧÉ6c‘RvNx²Ĉ‘eÌù }LJ>ò‘U>Ÿc€A)WnÉ\€ĊZE2ÎRĞ,.:c-sŸêk7ĜîÒíá‰v XÔ!.`öÚk+Yݽv¨7½ö°9ğc +ÀĜŝH£EsŭaħUîS}}•Ö.2ŝùûÚLĊĦCÀĜ>Ǣ,,‡‹ì„½ßáxż ĜG~Ú^&jżöWé"`+ÀœŽdĞ,vçñ˜£(mê`Y”œ£­áÉ9ÑÓĤë —£֏:ôÚk?ŭ€qíç`Ġ¤*….fí"˜¤Vĵ5`霰N+ù>€ ÄípħËĜG~ <ċç7}Ŝa6`LǀĊûÚÖÎEJҐħ"UÀ@ž£ô :0q9;ôÓ×ÀqÓç_ûéĦC}6`s†ĦÙs–`í&ĥs‘ yàp0màá܎lǀreħXžnŠÏżĤb79lÀĉ˜ƒ·lHh ˜ƒkUk ŜêŻ´ƒ'ì@ ˘Ñ“[‘ñTqùûކ9Ï?À¸”|t0çÀ€`يèsUZµ"+°–­HG ċŒV´ıüm}HU_l óĴux`a[YŽÖG ï˙éì.Š˙}wß9X!›,“ÛEÀ˘-{òÉ`²U?X0˜hÙ f[Öħ9ŬÂuғ_~0Y>Şñĝ_>u§ó܌µÜŭšÍ PÖ=ÀìĦ˘.Êù·ÏŬÚw.Ö°^p)¤’|>Ë1´ XŻöoħġ\ĴĠ0e2™f“i.iÖĞ€ŭü[ñŸÏiÀÈ4³gÏÏhí=À‚&Áö>m-û÷·ˆxzÏÓO/ êé§zäé9dÏÓs˞'Ÿ^ĴìyzäS°o}ësûŸèô€ Š5£°öŞ˘‘‡öµo}ë[_ûÔïvĝĈï À¤ş*b§€ÙË֖°Ï|ġµÏ|êqñÜlbĥĵ€}ĉkàġı?ŭ70° ÉçŝôDÏĈq™#–3Z=|‹üáȖY—pĥ›_7GÎ ĝ;¤CŒPŜê²ĈzuçĦžê`B¨CÀJ-6wmı²ÈôQŒ”bô²f=£µÒß 0ĵ €&ÀĉšÑJ̵ı\Ĝ1TëŒ4ƒ^6À„~ϐĊĤß°G>ġİ{ú¤ UċGmT¤Ö°UEmg§äVÍêÒNkùè Œ+ր€Ñg0k ˜_j˜Ô°ı\$ÌÉvF?èXÎ-4Ë΂$úùÙ.òs{9°ïéŸïù% —gUŭR´ċ‡Ċ \¨Ô èXŬğxÀZKLŒÒ ‘ #)ž]À6Gl~€9ÂÒuh§—0 :Ç`ŸEg÷3ß8ÌWOïî‘oˆ `d RوDr4O@8.Ĥœ” €…´8âĴ —(.&5ä#Ú=À*#1‘JùdPŒ‘£Qq9Ĵ]d_+ÀŞÎÖ­ÈŞżk3'`€ìN£A% [=ZR#90lÓhˆóú[Ÿ:&–'’äĵu„{¤L- à LşiLÂÁ§É K†J#5?²U$Ñ_Gr°{€ 3ş;İħL0Ż?ÛoŞÇ·\ô!Îħ9(Á|•ö9Ÿst \mÙO-_+r`ˆOĥÛüŬ=?ĝÜ#˘\‚RX¸H İN¤Ş ŽW}’˜JıtÀˆPj´ˆ\ä0²>„lĉ‘ÎeÀ’}ŽĦJ‹nŠûäCŠZí“_sĥŬĈœêw8ĵís~6 ;š2íŝqÎÔê"`ilh€lחùÌçö§Ż À˜‰›“’P “¤0 VeÀH’R‹Äé%Ĵ&. `U Zv´ÂëŞ-ò|ZK >°Í6ĉèG¸Úç<şCħ:*³_ânŠş âÌç>ó§û“0:Γqa´ĤVŻĠŜŻĉçyŸ€`Qš–h˘êİ; ÌPV ÑKĜ2ġä›Ċ*êŽ<óİÏŭ(!ÀjLR`.*Q8Š9İ„6+&$1,%¨2Ça33ÌJl°¤—Ò†ÌĴİûċĞĠ³ĜÑjvړifĥ”B Ġn ßó€ ˜v1÷ö>a-û÷·ˆxbÏO, ê‰'zä‰9dÏsË|YúèLvĊ"]ĵ×s e£°smóEïbŜèLj”QooğHÛE.Jş;áÌÌÌÌĴ+€QykÀÄTŞĠ6ĉ ŞÚ2ë˜TŞŬXd†ž+ç…TJH ‘MRċŒG?ភêO ¨” Ĝ\ƒŬĈiMĉħÈVŽxëÁn´…aÛħÈ™Hûœq„F:ùIe4é¨/`$Ú Ĵ§8†y Ĝ€Í9›"j9Éġ;¨ùj3]GÄ}İ–)Ç €ìék›ó¸#"Ĥ{0ä&„J Ħ˙?ÒÁĜ€ÍŜbчD90ëü)Ĵ0Mș5'ßÛ&ċÒAGó6żÍ9|g€Ċ—0¸+7 –`°áŠ ĜœÛ˜·ĴċŒÖ6ĞŠ`ùv)'.`RÄáâr֗D€ äĞC)ğ’ż€y„–YGöıÚ§\şoÀ!ŜŬ!`a9V,`TŸ£/žïƒżYÒßGÙ€Í ˜§Ú½Ĵĉp„²íRŽĵs†aX§%š“żlĞŠ —wÈ>‡ıdÖ 0ë­­+8…Ö€µĞƒħŝGûVd$îĜEÂíġ—0ĤĦċ´›`Gżċ6ĉĊ>‡K°Î~…£żĊ6ĉAGżğÚ:ċ²ŭ}sÍV­8ŬÎĦˆĜ!Ŝċ\9 üqUbŽÁŞ Ĝœ€…°‚e?X¸ŞTĞÎ. kħıˆeÛGÇĉ‘óħÎéˆcĜò­ìbÎéìFĤTIöPQ7úìĦ"s5B+ÁÒ¤ ˜ X÷+Š6`6`K˜š“0°,ŽŽ^ÌÍŒ’Áß´–_ü˘Eěûß|sQoùô‰7çŭoÎ-óıfé?b ċéN ıGF†Èžl3 ŒÛ˜?ѕm̟>7ĥ1_°<Ôq †ı܉^r‘ĤŜö6ĉç‹ä¨]³[ÂJ>oWòmÀìV¤ Ĝı ˜ş'fV$ŞD†# ]Nœ‚•áaŸ!ĉ C¸‘öĥŠÊĠĈ3ošÔĈÉb~;oĥÌĤIl+ĉüˆ%2îâ§5%Ó’‡TI÷ `5[ÎGá²=ي´ċ|‘ ѓ.ҖóEÒ½X…ħċ|”DŻ–´ċ|gŻV—KTŠaYÎŞ¨Mħ,[²°óÔ˘Œeĝı]Ŝâ;XÚÊHĞËı,ˆ°J˜4ç ½Sˁ÷SħޏÁÖn­fAHÎʘµ0 –ĈLwĞ5¸għÀċóı\ŽN§‘c޳/,ċàN•Ù…"Œƒcè UD]>g+b½ëvsfÀnşHĤ0:dšËcş0³ĈJ=ÙHҋ’˜AH °BŽa š”żĈgèLšŠQ–†Ÿ’K‡qŜĴ €yNŸ°ŻúÊĦGŻşä’qFÀ8/FÑ>Ê|A³1ĞGX°òƒ÷ĵʕxpÜó âˆ“Y~’ë òJXĴˆ£4ŞħxFŒ£kb½V$èfÀh:ž6FÀä•KbŽ •lÀXŝ;ë€qWzôú‹Ċñ÷|ˆÑcİSo½uòd:Pc‚ÉSo#c^Ĵ¨3Ş–`ĝ³§ä³·+%X2·˜íŝ3‘ş–Šœ0eħ)Ä22`Y¸½F%›˘›+&|=ÍÒé|žܞ,ÏL*™kĥhÀÊLĊĜMşŝÚP)âżr`ݤĉè³'£ °Ħcq0R5Ĉcİ=sĴ°„€1ÊrşT!‹“:`UŠ ¤Ì€ħ‰żŞ^ žï¸Ï 06Í$€—´[l%Ÿ)ğêÍ’ÛdeœUc½Ïż ħyêİúŠ*`œ—Q~FĴ¤_é/h.R­ TnI+ Up¤“QܝF.RŒJ‘d(Z6¸È45ĥÏo­L§.RY`W͑˙° Ĝâ{ò™² XêÁŻ?tóEñ8onE²S'Oj~ĝh€ÑӍÁ‚ ç=ġ–bÄòZ ’ñŠûŭ~_<ż„€á·Ó2şŬOP0VŒçM]$zŻwÔ€üM%˜ş‚S q· Ĝ˘ë`U½öžĞzè+×ŝĤ÷…(nÌêäÑ£Oŭë÷4Ĥ€•ñ(4C.²=˙jáùX ĜÀXö̞}Dżŭl,ïÓ ³4¸Hˆ µ‚ñ;`ШFÀ^ŝ&ʔwŜáżgĥhÀĝœXŝ˘ëoùĉë/I•c˜+i€qç> Qzĝyżî"‘ñ)dÔ]$0>…üa ÉEúR°vöìÉÌHWó RLÔ2FA”Äw„ÀKUkĵ£F%aŬEÂë#q!‚ò kr‘‰żùö-ŻwŜxĴ .’Ëëu°ì%W’B Ç1/ìR+ùÄÉg~ĝž{ŽĈL•|Ċ7UòU£Ħ’]$<ġöÛ'Ÿ}öİ£8Ġ ÀŠ~—Ë…5•`!à 뀌[4ÀïĵóRmĠXQ“‹äˆœp™]$˙ĉŸŭŬ'ë€KÀ— XWê`œĦ’Ÿ½è÷/J Ñ18ˆ&–X1˜: JĞ£˙§4ÀT#íS06˜DĈĴj„€aϖ<ñö[o}öهŸŭg_Wê`ŒÏ…sÍu0äQˈ@“Ä|/nr‘9Ĝ„ôöĊM.2w÷·Ÿ$ñġk°nfêĤÈż?)PÁ gÈ=è„ÚÑÊûƒŝóƒÁ‘?ĵ'Àj­²Ӎ°£•LFè"ożçĠ"N6(À-ÑîTòyÔĠŜä"_żŝ¨ Äí:`ÈE:]CCC.‡Ÿ²A^,ġŜo˙Ż˙ġ??ù{Ÿĵċ{ŸüĉżĥëF?XÜ<Iü.żw(ˆ†Š²8ŽÓċżú`+èCE9`ׇ̘ŠÌFX8–Ï?û,ôžOuݳhE– ™Ż_ßò3°ô;oüúW/ċ²ÇÓƒ.’r£÷÷9Rş‹|àäï€üw_úĠŻŝċ½6`‹.ÁĝĴÖM!(ÄBq88ŠY v}0ĈŞ€)¨Ĵß+ÚĴ4ŒġÁî\¸NT;è%ĴPĈN /ĉ–Ÿŭìcˆä-@2 ÄׯÌ.rTî|8yÍEÀ bûgŭŜ÷÷+Ĝïڀ-0PQjE€RÊû"!ÂĈ¨³o|ˆŸ• hF/2š&N~dÔfS úÏG3£§– 0>ñ,ûÒKżúŜƒŜŸ}2gS”àÈ%ƒjboüêWFyœ–§!ċŽ#µ)—`ûgï} ”|żúĠÏŭQ°Ċ·"u°xŸ'Ċ<ħ Çe裃„Ú_ò0PJ°!Ĥ†ŭ°r4UŻ,#£X9HüóÑ£?ŒxŝêáüRúġé[ÉO˙ƒ˜\–šäċğ)ŬEŝġeıíK8­ ½ĝ?‘‹üÛ÷„ĝ²ëÊ|°RĊPKôıGñH`¸?a,9Ħu/9”m 8Ä!–L&3şq6ÌcS~Ÿ4ġWĈ˜ĊVUrĴX>ûlßûîż|÷Ûßŝ=`*ż.)ŬE¸ŬÏPl†ŠŭnW]$ùü-ì÷nŸò/ßŝö?Ĝ€uĦ™++ù><2êÁ9ó|0ĵh}œR ğ³ħyn!4'–ÀWŽF¸•^„P„0Ó#? Ä˙Q$1}Âa‘ˆß‚äÓş‹ÌĊ3ڑ‡â"yöw8Èßŭ¨Ï'LÑĴ+ĞŠ–uFk™HpK2£Ġ, œÑšĤ°ĊĉÊf<Ä#3[`}Š£­"ĴŒäĵ]ŒµĝŽ´Ġ-Ĥ!`ŒEš ³ş}°Eĉó D+‘ZE,\²W/k·‘ó¸\ĦÚ"FżĊZ,àÚ|;zt i´‹8GD˙5Ġ#.òĴ§Ia¸żżELìÖçħŭŭ„tJDûGcH0AĜß?w%şX%Ĝß_`ë½í›ÎzšTi*'dşˆCQ °RÙĴIê,K ۀ5ߊ X÷ ¸\10[– ° ×ÛCۘۀw%X6`ĥĜ­HĜè_šğ³ë\6`HjBm)ğ&.ÇV…y\$”Úŝ¸cC(ñs}_îüqf%kµVY|˘Dhġ÷"ç`œd4Úŭûk0ċLc~ߜ_SĤ|#Ħ6?O[Á}#C<‹‘MŸÉaĜ¨7=ğHĊ[˙kÖËı„żAcïj,ô-ŝwLIMRôıXÙßï¤ğÎét†—üñ’+À½Ïíèwf[_À‚XÒo}¨€äMäÀŭÑY_Z1@´ÌÙ*î\Ĵ6¤Ê@˙HC6`… >à[lsŝ¤rûK˘ŭŭŝJ×˖áŝŝqİË0Úż˘?:G].Ċħx;Hô‡6ĞD˙pĦ)¨a+Àŭ‘–(&•\U⇇(TNŭħ†Ä ö§.0ÀôP?>.(FŬD¨ħԀ‰Â@réÎUĴxMcçĠ >ërÊiFiˆ`Ú|3€²ŝĉ2ŭŠY7üaèĴ”G~ ˜ ˜ıĉÜġw\‹5q9*ùáı“ŭs[Š‘ŝ£^·(äFó ‹vL› öğ`ıِŻaܰ$ó ³Ġ?ħö>’?fĠrw?zÖj kÚXĦXĤRùŠħ R˙ds“È€ÏòÌk¨5)5tÑŝ¤Ĝ6qĊp?)ˆm?Vñ÷ğ˜ößòVíÂvIÉTN)‘tzABĠ=£ŒÀ‹ĉĴ—R\•Ie{ıĉ†rĥ$ô8`bÊçFrFĵb`Şà€e°€\ ĵŭn_ÜP~]ŭŭ#t]ŞaéœV^¨îŻAb^L­AWcXX²Ó˘0Bq ŜU ‹Ô$ KËFĥí#0ÊF½– Âê‰˙·÷ġ Ğ3kğߞ$HP°H!ĥÙ¤³·ÙMúTİ­,N)>Ĵ<•…•_ĜM*Ğ€•µ•8HŠ]¤BŠ3M Crî{&jôyžµžġ÷.×ŜÎëû,ÍÏdrÏ5÷Ïü\³ô8À*Ĝğ†x;ŸˆB¤bÑwôLĞFX>"ÚŠ=><ĥÁéx6uĦ3YñàóŜĊ"Š Çé›Ŝ’Šy`ĵ|”šdŽĈZQÁ†ċsϲĵħ‡çòİAœħNş6z"Ì ]qĵ‘éÂŞĈ8bÏ °hi)ZGÑÖ7ċËĉ‘Ĉ //˜›uWQ}Vµ$DC@Ŭj=”Á&ê:ñ‰ ­m‹Ċ:ó‹Ġı.ĥ3EӉµŻR”F ›¨Œ‹°ÎáÚıŸm ŸWGWS¤URŻe"Y í@%À½ĊŝƒÒ'‹µgñAÓ¤£H6ü‹I··X ĉ˙qu6 Ż²l³èuġ75>êbq=›˙҆%ĝO)üĊĈħ"ê*Ŭô-€ “ĠbÁߞ­íîĵ£( # ŬMW“ŒvkĜOgµ³;=}ܲUĵXGԟr€Ċ‹šı2TO}Yït–Œeg„GTcĤ‹Ï@úz'f6—;3G—œâ‰F°ëŸèF!·Il /Òu6e½W=”Íd´˜1ŬLP·(Áé¨g]†à kûj?ÇqHNV­ˆ<='i‹lñĵ>2ˆ–›]òËö„XÏP7#Bµ§žúu>QmwHÌ‚DU]†‘§‚ÍáĜáy֑Aĉ ´|·qi(jıb\w¤‘E†àcC ù*˙ì˙ûß˙7+˙üsÈë˙ŝû?îƒÉ“<ƒşD;˜Ĝ‚0*ê<ŻèL@Ġ:W ¤ĥĵA×\ 3+– ‹52Iˆ;1’A: ßP„48ËQk 8ın’1Q–ev‰ ž [‘1ŻFeŸXÙ,écT–ßÚY u½Dۑ ˆ ÒÉıK6uĠpèûvŒ.ÏNxGˆ™×Qyĵ! Ï:™ÂĞQ‹˜ĵ•9œ“ƒ<-ن +h”w,'TœMìŭFC€aDEĴċ2‚*2Ìûӟ™K”Ù! {jPo1·lÄĥ ”&AĊRËĆö2ŻÛ*w „ê,шÜĵÄê_˙@€ĠĜżêú_˙ŸŠ÷İhïċŞşçF‰`ż` ¨Q^•éĠÚZĉKìĥmĠQçPÍË,™ár*sE7%¨ÖÀŠ­Ì‹áäi–ŸL"#7êáÙ'£ĴŝŠÜù yÊê¸#Fħ7š?ÀÔı$M*n ÈŬMĜÚQ¤áV8$-ZnKÜ'v%fİ”+À Ĝ%}" ×ċGm4`À "µyäż#dHOŬc‘Ŝ³ğş6ßRpzà²#FWKYĥÎyεÂG œC˘(Š“äU]ċxz;+dwı”û1ċȵ ”Ìk£ZÉŬĵ‚Їwı&­Œŭ7üŭ'­˙÷#J ›hXŝL% ȵ´ñPkZz-—Żp'}°ş#ĦĉÊUŜr˙Ï}2²˜À‹1‡ˆ“ñĤupqŞœ‡\°Ì0ñVW.YŜ;sş3JG¤!÷ù6#Ê+( íN˜,˘ÈPç+`¨ÍŜö‰m‰ÜŒ´„*qò)Ÿ4ZÍ+Ĵp#!¸ĥżt  5Dħ8DFsÖ!Şc;´ÎOú†ĦÄŒ`Ĝ@{qĉŭÏpŞËùèż5>ADûËK0h`4'Ŭ8_ĠÑĴ>Y܃êñsçkKšÀħ ˆ ĉŬ´0pn“µ/‚âĜZÑĜè ÀŝĝöżŝŝĝMPÖÀ2ȍ €ïĈµüÀlì0I›öhˆ‡Z…ĊaCgĵ¸PŒ"#­İ‚|o­â“‰–=ž+Úáb"QÇŬuSĴU)ÌX¨[}glž`ԔSĠE4%Ä+.ĝÏ_ ¨ĜZÚNWÙ?˘tÛ+4`‡[Tdœvi”Ġe·Z +pĴÛÖ`bÌ(á“&<(‡?.•ocƒÔ}~ġ?8ß÷žƒ{~h,'›(ÄL7DŽj˜]ĉ—zççğe"mt.+ĴR2“ôîoˆĉñï˙üżĝWŒÁ&r`4Uħ‘0öè'ĝŸçmħNä–3Ÿiˆ7WuP0ʍàDt>]ÂH)wˆŠpqÔ%:qÏ%‘JğŞ|YMj֓EÔç0\œs€â³4^ĝLħíf. &›ÜA#ÑÁĦ1ÎşF+ŒB‰(e9È4ŸId¤qókxw’Ħ. pYP‘Ċ°„wTĠ˙ +!‚lX™k¨> •L@Ëd}ÒAóĞ˘€â…lÒêl’ÁžĠ'‡˘ŬU AċR1ĜĠ5Ç71ô'Œc‚FAȈh[>iD›mE‡ò,ކDZbÏ*Ñ6Ĵ.AvÛ˘, ġÎâëËT‘Ĉ|Yéîy£Èr-+†5PH˙xĞA6††Ö·Ó1MY1쌁p(kaĈ`Ŝ²WQ—¨cœPÀ†–fÜ×ûždzÙÙuȎ(Í‘ĝZnŻñHrp!şÖÀU>A­5qâO)‚x;8â‡(’Ž{˜jtŜy ~ž1Ĝ˜ñ8ŒwÁÎ*îĠD•fUhô6y)٘ß÷˙üŸŞĝçß˙ñ/ŽŻéhĝ`ÊD·E…Ÿy§éàX/26Sˆ2ÈJpHk6ĜkÜU½¨7\Ŭ0 Z³ĉS ȝÔ½dYÊŬÎà]Ĥĉ¨P²|ĥùĦ˘°ı[UTĉÓéž`Ìs½#B>­ÇcíV2çWŒŻÀ<ë¤Ç߀GÊc÷ƒÙŠù9[Š…–ÉǛmU” d¨ŝ ž!6|Xxû'9ù{u}ñÂp²ô§hċ˘övŞ*K\ıû ŭüˆ/ÑÌF À„ŝù^€=FŽe:à+Î`ß{Wžâ´ä‘ĈD…ÙE.>¨²yïLžÖy²GŽ'X4"ë²ò‹qqX²_á2ƒ7Sö/§°†#‰•|Ú°˜Q^Ҝĥ&——<˘sˆ Çó_L>êĤ·Ş•É=ÉlQŭÛóĊ÷ LmͲ´ä†ˆż˙ıO8E@‚ë-AïÖ[s° ñıġšlF&·2´7ŒQBŠĠe2)Öu`$Żvƒ(QĊ6½ŬÈò;Ÿ—í·G(Yħsɢ++~úÄ£¸FÇqRn"GÛ£=ŜUĵmÌÇħ}OàG·AzU„*Y²|âc ,5èŠó İ#Ğ£;Òı³†Ùz½rĝA0‘‘ ·ĉżô½VàKûWŽŜĞo%ğ&.‡÷TOÈ÷˘&ıħŸç&A€ċĠÌêJÄşV‰ËĉÁĤG=_9—‰#˜Ĥ˜).`uĜPYí :.˘i›Hĵ(ÉOK”óâyv‰Q&qĊ] äŸLşEĞ˘³}G¤“IQìT$q‘K§†\˜È7ÖĊ=ùj£rѨIµSGi9ÇĥÈp`9èħ=ŭ…f2„ÇîFe/µÀZĊΊ… ŝċNn֕óN.„ÍtİiB ‡tKxqbŠÎҘ2ĉJDĦYÁÍÜÉİ{Ĉ"°˜û?íL \;O²Nkĥ]VA,ċĥ¤lpœa§^ ‡Œ²]X¸ÙR@˜²ÌëRnz[ĉ DŒZLdkqU ÑÀKAŽúĵĈó„_W]­1OúD ŽsğĠƒ4 F™˘lxU9erÑC€ağÄëpċġÀٔ;™ŽcÓĞéWÊ"̂÷ß9żìîçM ĴQb²J,QĴŜduÖÛ,µU…•0€Z„—\sÛ Ú޲`Ġn$‹:t§ĵwÏCßM%½˜ÛMÚ0Ëe&á<$ ‹rİÁé`y—ÈkDíh_ŻnKüë ž‹l#Î!Ş/t:”W\RH¸^]MݲsË™ $ƒŒ-ǧIk`vGĤ‡ĈúÄf²׺÷³'vòW‚WğÎV˘›b>ĉÒ9‡(Ĝä·á Òıvġ8¤ÏÉÙĝ½ĠĴ°ğU=¤Ż"J^‹]]"Ħĵ†ĵâo^hrJŒ‡.Aċ‹P!<‚ÍÙ€Qñŭ- +1Ŝĥ“Ç”·09‰llVËċ>jQ5û çäˆìżäïÏ;;ŒĤ3‚A‹ƒĥ0‘pÁšqz…Á#ċ3›"Qċw‰6²£{€!Ż‹Éj¨sÀ6NÖċJŸ(è5Ž#(ó6r ħÒJîĊ`í.¸í`¸ÂtàĴ˘Ë‹k$6İşe蓖\Ŝĝ°%Ċ-}Nl4Ĝ–S4‰/Ĉ‰üPJ;0”bÑ8ìÜTŒywÉtĉó~™÷ĉóns>ĉ·„góö{ïàïß¤íƒĠ{ii Tc°"ŠVĠÖa ™óÔ³aXE~W#ÚüjFs°ġó.·9g8¨ÎƒŽBú72Â\ċ|sı…+miÌËH²Ï%ĊòŜÄrĦTiÈGê b^֝OgñĞF-ĴŞMާÖ` ]Żu#ÎnĈġŒVÔ`ližCŒÊÀĈ͘љ7߯J .[6Cú4‡³Gî8£RĦê蓟”.ĥ£xĜ(ŬÇĞsĊŒßè;CŒŒ-@ƒħ “=!\]§NpsêĝPÑiZo’Zȃè-À8I_N)8í·XÚF‘éž–ÉŸŠ u—Xé¨ĞTÈ. ‘ ÁĈ]˜_äÎD²â 0 ŝ‰ğOm"³ċ`C˘e ’+'á$04T6ÑöïÌá.j lâV Ü'r.ŬœPšSŜnUÁm·ĝ0šq˙/Âp£,Pi@Èn͗xNĊżÖg˘D€Ŭ8]Éʸyvpk •ĠaĠ2‘œU%ëSĥéwÓr/(ꊉ|áÖĊ0ĝ\7|ĝĴşPġÍdeÍŜlTTÛCZÛEġ°Œk0hZ*ÇnfĦˆ2Nb Q¤²Žû`GUrÑÀĉàäûħˆTÒàìö蝉] -†ZH(ĉüi†íRVĈ9Û*ÜÛÏ-GV̈dƒ­ĠğµĠ“JäYžû“ş„ˆżwd\Ĵ“ÉĠd?ÇÜÎ=Á§Ċ}á=ŬUZ2Yâe`*¤„âÌjUâùq{<wiQì‹"ĤiQÒ-ŬáÁ3‹áPÁʃOpôáP‰›Şf܈Èöž÷_V‡‘À,]"Ó <ö·ÛÒıÉܓ%páÙXžÓÜ&z’hxwQ{DâU!fÈyˆ„ƒ’xâtépü‡’ĵ3[ŜPOiÑĊ#ñcµ’ÑP×S‰ÈZÈÛ§Ĉ_Â!”ÌKÎżK²›TĴĞÈĈĵ£ [çX••dÓfKŒşĝˆu²“ĦĞêôy£H>O§'PÏx#Ġšçy4ÂPYîû™äñX‹żäy@ĈnŜ£ÍL+"ĉœĦ¨úÙR!Ĉżct'-ë3Ü5Èò|9ž˙‚7ß_ ‚a²Ïñ÷YJ€†stšYw&²3[M5ÀJ EG})/XÌo<Ħµò~Żw ä ş)ŽÍÄĤ{˙Âĉ™cOèĜ›'Qc!şDšmôYcÀM×LÎ@òÏġí;?.A“Íg W˜‘?VG(Oi~íŭ8ğ#kĵ¨cǽ2a°ġŸ7Ф³r•a9†|Lìô ·Ñ9´œá–a )¨p‚,O|BŽ?)b]5žPÓ[Ö94}›Žš…èòżâĊÁaĵ*â_SdĦ#°owùÚğĉù˘bùèB ˜œ†¤“£.²¸­,KĵWÙ°šn”.FÓiì៰Cş›{ –:œäħаĞTi9h¸Bà8Nĝĉ“sB²½  4°e6Ġ×ÁTĝ’p|ࣷ˜ï'SMl K‹cVWA°+[NXžċ-.Ÿ{°ğJNï ĝÓètŠ<ŽqO€žEV|N"ñûtÊëô” KWvJĊ¨^|šĴ) ĥ‚Ĵ*xÎ/‹¤§8…gSQÂ2‰O ĝO ”Œ×Srtçw”`€“1á.%'ĝ9 ƒtÊO'ħoPt˘‚B.ş‹“Ó›İJx gĝ‚{£Ï”6ÇˊDÌàRC˜×½zÓŞ™³Z|j|íµèéR *럷yì钯ÈËÀ^ûeB;dżöĜݲÜŻ^{ì×$ìlèêÀ^û5İ*;VżöĜ+½öJ/€½öĜ `ŻôĜ+½öĜV*ó3{F€ċŝ#§{›ċż„yĤċşŠü7‰Ğ*ž`ÎH==!ÀäĦ"OÚ%XYĤ)V;Pş?– ħM·çyowî­~vŬ ñ„ÓTŭáj&aħUçǑġ ôĤµf€Y¸-éóìoŠL”6yL#DRtʇe­(dDß󈝢(8żi XÙ7ŜÏIw<żß‘MŜÓ~èHr˜OtÂ׌`ùşEìŬ‘u9вá›,+ÎW4N e›~^áLßŜ3lO$ï ĤĴWöìÎF†8[nf2ë]–àšĜ"ô›Î ó½‚É·é™2ÀEógœylù6î8µÄYŽúI\u†˘N‹‡vŒ ËqïXû+K;Ÿ&B-„oĤü´é@Ȑ=“_RWÌôçÛîT@Hs˒\uŠ‹4'5Ğp^şŬLÈÛ4‹9[íĜq8Ċ’ñU€U?_˘tñü{ꅷ7Á/€Í•ëVÓ‹ ?Ÿĉ2+'íŝ\&ĸ@’ZÜ*f9.œÈÒüIvÄ3ôq­}éĊ“²ÁWöÙBċâQˆóŸ °ğXŞüÜ<ßë&ĴXöê|eĦÀ ĈŬ{óÎE éü-6R˙†ÔAä^Â÷_²â¤,„ÏĦëҏŒ\9üÀ>‡ġ كfûO&úž˜îlç%È2^Ìj­Ŭ‡`I+ħZs??—žŞN„k›<·Ï 0-Ipê’îİòTżĠĵĝ&×y4ìA2ĉÍ-4šŽË÷¤i‚“°¨ŭċ"ğsW ħ:O.WÖleıïòŝQpğ¤[äìÁzŒfüb0y?ì0ϛàWĝb_X&tdš×iäÚï·›ÌşĴxOàK…żVWf[+'|żöÒġÀ°üŠËÎĥ,î3žm Wí-_Z³Â5‡Cî<4b†\:ċ³eYï0q}cŞŠ5•ĦNŒ`­5ëpŭŝ8ĠtÏèƒyôPl.+ß)ŝb.Ëŭ¨N̆íE²°ĤsOÓş²,ï@hÉ2²ĦDCIĥt¸ı_ĵı w ‰ÜÍç€óTörnYŠF‹+e÷ÓpÀHvWµñĤ"ƒ8˙ċw}ߑ›Ô#QùĊ2—’×ĊܒQÏä_×`Ħ%w"dĤ–í`ĜWˆüu4rÂuŜ9ÀTÛèËcÁ ”4öUyôNxo4µĞ᪺ëëİ"¨ .pÍÛ;^ĴŻË3zèáŞĝPġĞ|:Ô<Šdhm“žX˘éF¸"QT1L„ŻÈìœŜd™³İpaB q 0ÌĊÀiµĊšÈ·´µ, Ú­W·Sp0qġ÷ÂS9ÀrsvÚ÷–uë=[ȸ£9³ŭU ĈфwÛi:rhÍ9ÀèŒ(EF?5P|:3i™HıŝJvu…tË\…1Ê;Äoï˜*ș%6—v½Ö‚Ż9W!B…+}ìC.Žw‚VħÍQF0Ş6ê#Ċ\=•‰ĈÛÏ;Ûi¸äğ WI½î i]eAjŭo ³‰T5ë=ċóP32\™‰R™UïıuĴX~İÌ€QGphŭgŒEF]˘TçĞd/6KíEuQìZI"Ù|7ÑMà £û„;°2Ÿó^+£„t€Ĵ0U.úÁvœ>­´e?ġÑÒ཰Èo÷.ÀĤœÌ$Ûâ‚ĞÙ£LĴißĴL °Ê’ÖъM‚? °H•†óä1A(b5pòŭ˘@Ê4›Ġé€(=,í½5‘ğ+ùJ:Dr9Ş v…"½U°:P†Ĝ:z\4ıĠ,n†–ƒŽÈàŬ^2Cç`cċ ›‘¸ŝż—Ž´İŝ€íUŻÁ›÷/+K7‚hCÈ1ċdWÜŜ!Àžß‚ù:á´j6Xž9ÇNá1ö´ Àxà0Aş‘OċG&p‘Äíµ›KRV“..š˜áĴ·¸…``ŸéĤˆTjp9`…BŒwoÀÍ5òiÜ6‘ħ´ĵ)¨Òß1Äĥ M@m;jĠ‚XEí— Àà×ù °ùWĤL/÷>"w¤{ĥ0‘.1À–0ü^Ĝx˙ £Â×ÖïĦM7lGċX`̈́g À:œ§á2Ž2ßB}›…èJ€•UâžÇJ­Ĝ’yŸ3Ĝ‘}0—bœÛŬ“ˏjÒDuë†É!G8î[3rÎsÊĉÏÜôK+‘~Ĉ>0‘HÖşğ¨2´lŒCk°á‡]Çú•d | 0¸~Éê.Ù=ÀòĜìÒFJî9ÈïħĜVS"­ Àäş1‘`$ÊÙÛGóùŸÑ ĈŽó×z|o&L$·Xk~"ĠŬĤ<3V‡²Ô?ùê{ 䘴¸Ë,ΰµ¸Ô’=J`3OWÇ÷eI$³ÑŸk‰Èöµ6لĜgNœ³À˜mîI|JĴàCs`Èêë˒d¤ ëJ˜È2£ÙûĴ‹È}Âa ޽Ñ„ŭ/ċz“ż0½ÌŞ<İĜTêĦ-GJÛĞO#$ċ‘6ëUœĤĥâ$(ú{àŬÊh@›K‹32+ËI YÏAûîİ1ıä>ÀÔ7ŻRš 8 ĤpJ•CĉĤÒbAR€Œ vŠä'^6S´Éİ.ş˘ßɍUMÎk PᢘŒëÙVÊğûcE¸µÏûœÊ3ädŸKDÓ#üä1YMa¨E‘v Œnœ ÏU‰Ĵ:Ĝqá-ù`}`§4Ĝ„bwÖHlÁàß1§ôWħ?}$Ĝi&/“ĜŸċyŞ‘á }x§dìÇWħÍÙ{zBôZÓž9ÀlÑ=ÈuŜ%3ˆ "ıÈ^$Ÿ°W• ËlÁñúFĤÄ“ċÓLz$ÌìĦ"ú­;¨< ˆ÷Äĥc&‡™4e huĠ´ŠÊ`]ĵ‹,°g•à̋|ŭˆ}?ꁛ˜Ûù2äqëŜëóìÍMél2Y0pGrÚ$À ĵğ,ç1SFŝ#şuì—ErJó‚Ċ&ċLçŸ_–áë1·Ë_~“Éú „ùĝ×R ?OŜ‰ÒG˘s8ñƒxjĴ\\ƒÑ‚vz°nhvŞJ*ÌèûN{E› àŻ˜Ôš3Ñu˜Ï×MŻÍéÖ_ŠB2–·"Í8Ĉ7˘"]<ÏoïB;ìK³v‹/ÍĴûw›“ÏŜZŸì™ÖI#ɤê}ŞDŸŞöé+oe_ÉîñéKyôŬ}üµ)ìŜqšŝ)1Éèûï~ìŻLQŬù£¸™ÊE^ûcN&³ êrôĜħ?ĝëÔ'ڏìE÷Ĝ+}1Ô/€½Ò/KqXöJO›^{À^é°À^éŬäù—äí^{ŸžĤŜ%-7/€½ÒÏX•c:ĉùŝσTħw§9Wì+ĉpûkß­ù÷›îşFUħâ_‰ċlĥŝ>&j;›Íüo{lĥš­o£­SœĞ‘î J·ÀRÒlâ3 ÜɗEğî4úë^-r]:‹éñ[âğÍfŒy4ħ5eş˙ށ€5ß0pù]ĵ8SœOġŝ·§ĥŜ,9K?`#ħŒħóÀp˘ĝä‹7ïH{·é_ž|FÜëI£OUWıG%¨Dĉ…,熊ېjßÎĤĞd8#Ä˙>í—.ĠoK­–‹Ûg&ÀX†SߓÜFV”/ó‡áŭé_g$§|JB>zwFó;iĊ àz191’TÊX Öá}›²á‰ĝŸJ&nżŭnÈ?´ëġÀÀ>ž÷"À°ÄOH÷ ZofÉoÍçÊç4ĜÏa`ŬO§1ˆ~£~`N4Àüİ0m˙IFñ%Îİ)ÏżŻ5Ä;ŜGlDl÷V#îƒĊañgl.²nñœoġb“Χ–Ûïyjßç2×ÉĦ÷Iƒß3Y ĊÒËĠgLdl·&4²d …–óÂu[Ŝƒ7œ ÀV¤çMÁĥš˙I€ü‰L¤–Ÿ³ÏñûV'tK¸äËn˙ü~³Ú<íàZ­û8ïíd:’woœÒü^+çÛc*^ú²xçXÜğ‡]IŒó÷ĝ(zĞàLċK;Ğ%ñŞä+K‡Šßz騧xW›uħjĊıÁ`šĉ, öĵ(,ËZ"<š–à;M<Ÿĉ[â-ğ{Ì///Zrá"Eî÷Qäù˜Óäy&4k~jV1_¸5WJ˙ÔŞ:c1o4ñ—i›Ş։í½;FŒ jÌA~–á²ÇŒÂċùœa6Dš]ŻıÖŝx8ò.ĝ)3Èq3şNSÍÑñœRoŽ{e)aİiŒ™ä0n"iŞvÈ ß’ñ:9ßIĵÈRH­QgÌw’W8ÀÒ1ħ!gÜ.hܜĞҘ·$ÇġZpċ‰Ċ}ï‡!rMÀeÉ ×­ħ$qôQŠOû†ímC~ŝÈJ )[ĈI–UȔ3ßzDëÑé—ĤŞĜĉ&„H£ĊUĉçMG𒍤 0°¸•úÓÌu÷İ`žš<̊ıJ”ŝ°µiÜë ½äġ¸ßrRĞ%Ö Pŝ`ÔîÙx³}M A`ëAż·ŞcÓ áz Y²zĴ… µµe¨7€ġ iˏéF_W{ĈʅS։{O½B°µ1ó] Ùx’‘¤fÛ ûĦ=6ˆV߃L°2%$tJÀƒ“{¸Ħwċ ñİ=TÁ§~Żßİ߇l2Mu”E“™ßÁ•H.3Ty÷éÊí2p@˘ 3Ĉp°pˆd\Ĥ~Uà|¨ƒŻ3ˆf{]A™ħ>_D‰F3Çġwäï5Ğı9êċ2E‘ċÜ;Ċùù`UĠoħL|ÑÛÀ%§kħş]îy­3–J‰"ô*:h-_]JjœÚ2ölŽ´Ëİ.™çş™ ĥNt*‹Ï RĊ):p÷Òż¨ĜÂĉ}%7Ï*އß|ŞIDATÔ8uÛŞB’ìĜ”.IŸë zê ÙKeeW&u_³‰4ĜŽ$û&òĒnjÁ›yyı!Dv[Ċ ùšbòž×­D,Ĉ "A¤b;9 {‚³ ´ÍÈö.ĈŽ­báş*¤!•;&ež¤î+d™°úìÉİĜÄçĉĠT‘?V›†‹'(g :¤-gYh N„Ìóì†Ż+{EéŜeĞ$[²_Ïää{ŸR  ŞĴÒ _ żĊ jù˘—´jd•yŠáä)*Ò Sŭŝ-)Ħú!fÎñġ`"İu£ŸËĴŝRĞĵħv›B3Wu"#Ož`Ġ‘û`Ì$dzUĊ}2Žê|Öòó,ÎÚóĊԐ‡rŒ›ÈbL„–8N§%'?ÁÇÒ!Ñĥ•XìÏĤĥ§ŭ'ÁׄÇLŞ:ÖxïLµ jŠN"ˆpá2œş1Ĝ Ó ώs–ħİ_òyS$_hu@2—ôâÛwh~ۆl &ġLÛ}Rƒ!›7?PË@{Ċµo 9ĥüı|îĠNCÊv5%é1[_Ô ÀÓ8nÀÑòçŸZ‹ÔÇX4$\ÖĤx ™SsŻ/0‘Nin¸áâúÈ2Ÿ¨Uö 4(ET/Àjġ°vç^CߔȘ `OÀÚ w§âxGĊ÷Ĥ,q8ğ…`RCŜ¸À<Áq‘ w]Éġ•h§¸0Šó˘D-ûˆ¤=W€UĜú°2>&ÜE|€ħ•`Š_|>ĜFô&Ŝk°zŻ Ŭ\ Ëò nĊy4ä TtS€¤ċCŸ 8 }˘4Ğ+‡óä€ì½Yfv”n;)î"xä2VÔ^âÄtG[C È´³"KVĠ—ϳ*k·ċŝħB–pâĴpĴ›½<Ôa"ÌñEƒßlƒ›ÄKíjçfl"kŻ.s§•™ ;şKš ["v#Âğ"ÀX·0£!‰ 5_$2/’,4­{€@Lôê4ÀŞhëm·[:wKòž`9šHĈcš&!óìî=‰tsÈüċTÒıPĜœÖµ0‡ ĦjúĵRVœ`.ÏyġP3ÚvġÁÎŬGş¤ÜÜm'i*zÂ÷`aAËlĠ~û­ŭħ¤ïo€ċc^Ħ€Yz(ĵ›Ĉ‘Îg£ċÉ%‚Ż8Ġ9.öBĦy÷I ċırŻĉ˘Kš ‰m)BŞ!Kµĉë5ü`èOԜÓGg·³ÏO7€ŬNĈ%&²nĜžrÂ!(ûCE—¨`Ó/)° ÀŞpH”;˘ÂSòkШ§´<ƒFäéBS„’S8Ë/íoúp˵"?qLÚ½7ŽÙ‰vJïï –9Àò­˜0k`"wĵ_÷:—8qDH!“KPÊÚċh‰ ĦúÜÉç&ğè·¤Hš>öìˆÙ`w]Ġ™É֌5äB{ËÊ)Žħċš ÷t.&òÖ/[È`ÈUJQ(Aê€ĉÜ:#jËÀ$]˘!Ï­x˙Ŝ­µ?#À d‚NjIOż44yĜÑêY#c—ß‚úß6ÇÖ·S‰}ġ?=¤Âjz †<>'TgK™¸ hŒBYÚç<ñÛ&DZíĵĝ-Àöpâä6==ı\ ’г™p†dYÖĠN'Ö)Í-PÑñ6­#yUĉTQn1 "ù%ò—aÛ:vĠeü 6O’]‰˜>ħĵçCâMÜ iSpéyŜĊ˙ÎöPšcĊ˙ħJËCĵ–TŻ.!„Atpağ>C–miu‚$ xoôBÜ2Gʈ Í)Í!48wÏËŻ­JĊŸhÁwÑ×O 0a/†yĥóĊ 5áFöÏ˘K_ıOy‘µ}Ñ'²7&·Á´bsĦ=—#/—éSŽÇárŞŞœ-˜°‘ ]š v/ŝF„¨ît”Ó·ĥΕUÉÖ*!V…lˆàß&çÛsò&V{†Ğv)Xığı4nu½÷‰â,mŽl8dQċèkŽc4‘Êh¤Ç<Žħż@^ |"Í} DvbÜĦ!ĵn‚AÓòŜÎD޲Ñàġ@Y˜„2G¤P£;½Í°³MÀêEĥmo(%uäç5iŒNĈ0µ§u~+÷Ĥ'<Ŝ(lûtŬQĉ)Ż\—Ş˘ĝ˘ ĉá|0wr*kvr;î$şjw_­!r" ĜJÚC†šqUyUƒÏŜİâq!i…o^ñïE¤ á“ĝŭpz•{#í÷û¤×ҞĞİëœ×(Ĥk(bQïĈĚĞÀĠˆħ€çm1ŝuB”İŠÖšqDOS™Xc=2T݊ğ­Jù\³2Ŭ!ĵV]Ì!W/š³œUá6€x´BiĜƒĵë‰ë.Qĝa‡÷Q zD¤"zeŻ8·û‡­Á¸#ÔêÛÙ*,ħ°’}ȇ…èŝŜ” ÁÁŞ5FÒx pKÛ_}ÊEŸÜêŞbĠċJFïnay†3T WÖŬ;‰Ñ=ĞbÎİÊÂ3Ëi3e´˘Ûíħ¸d‹3e+Z4£&oĤâdĜÖÓKòş]*~CĠÜ'JXħRüÓĎxQ%ìéàÎŞgYš4·ĵ3+ݚqEžëULUs¨Şê7Òk~1vş˘ĦdÓw’´ğœÔó-³3ŝìUE_/V§Ïr%}˙´œĈĞżĤ’ŭÜüzÊ˙Âû_ËÖ~B}î|°Wzìg*êĊYfKêñ…¤À~êâÑĔsV ôĜÏ/oħv M}Zħ”^û%F2§Ġ E/€½Ò `/€½öĜ+½öJ/€½öĜ `ïgĝu—û‰…ì.ċĊÏ-_IùJÁÌ$û‹G%/+Ş_–µH~ú°*š †ŜÏlĥì ÜŬfrÚŝR„Ċ; s·ûÙ[ŒäğŬŬ™§Û˙ €tœy)ı?QÉîl~AüÊìH’ôŭ÷ ˜%^M;2$\0âH’ô“éö’ÔfÎÂ%^‹˙€cydğ„(?ÍJfsĊvĈ„O=˙HiâDÚŻ,¸KûDYŻ.açéˆ4m†mç“Ċb˙µ[_:ŠÛ˙d:4@”ÚRY‰;qŽ˙1+†Š’…E”ôg•m&K–ôĊïlFH?ùŠċž¸ò×uèܐz—i9Î,WJp6î’òµ?o/PùJË듚èe˙,ûoĈFßğYc2v9ĞW²vĝÒ |}Nhl| `Ì£oŽ(µò7>ĜĞŭŬä’üäêZÊòÛm²ĜZj %+Ëòß`h7KšĊX_(Cù~¨të×"ŭ ìƒıĴĤv€UşyĜŞwK4ÚÍcIÈĉ}&wFJÈŝ{$Ùdġ^\rÒo[ë)öpoır÷&HIÓÈ5ZŽf CÎǔ˘¨zŒ!š5gé`*% ’ĥ¨é6`á‚Ç\v:ÜĞ*|à‡^*vÚ%€ms}˘½‹żK4u3SŬuŜdAócòċd5Ŭï²+µŬQ'Ŝ=L(n–KĥÙ=ÀîĤßÇğ°¨÷ËÉŻ²sX<ìÔ#;LbÓ}ĊïÏëYÄŻ‰×ĉħŜ˜Ĥé·5˜Ġ–Th›[ÎJğĵŽ& ò…Î6O°ż i[’ި’Œ”A„n²Ĵ(’qôäîÂ2_•$M²Žœ+Îşç òˆfÁÉ[$ıïó߈ĉ,ir›nŻI²Ŭñòħİu|Î Y–[YÀATüDÛ¸’Hú€°Jĥ2§uŠĵŽ=\·K›ĦĴÉc<OȊı,ÍKÙ²“´ Ó %…kXM5ĵ€$ßñƒŝêşr{á­[ƒßŜŜjŻZëÏ&JG–ĴŬbܑ¸cÍĉôr620Gf µ\ılrKMù eVôċž!w}VçĤDl{0‰Ìpç3×(‚Ñjb•L4„äXšÀÙY?Ÿ[³jŜĞôˆĵdbßpıCÖm¸vËÜAµM· é‚ÚWÒé|Ĥ—Ċ N;W}ƒL&Äy,›)š½›ôZ[ınq›şÊÇ:rEş4Ú×ĊRuüÂ$š:}"Auà÷ŭeóıÛ8‚˙úfŒ³‰¤ğ p"”ì~Z'£ħJ°÷ivÓħdeuU³ĴJO“àB5mܲïİBFeN{äŒüugeS폢óÍGCI7¸Ož&ĦĊ—rSSpSPb€Ŝ:"ÓFĦƒ¨İ„ç1ı,ÈD2œGNäòñ§ÜDŜ”ġN'Ĵfğq/¤¸0oy׆2§=ZV&™d3Kü§˜Ĉp)x݉×EÙTHcxbȈ˘ì‹Ä$Êİu‡C”.uU™X )ĜPŠ)E<µ*‘Yz”‚ksPäMQU[ġĈM‡‹‘ß °e[Uf¨ô%Ê2ŸHMGÄĴúhı&ŠF%^kC Èœ™R‡ šċûŜıÎp-í™ċŒ#Rp…3OwGÚóIÔR`…#qvƒ*4FE²1ŒĦÈ]ESş=ó˘y@R]Œ1× Ž3_âÌ†Ö`èäÓ4%C5­÷_Hdžg^(ä…ݏ  Dm–ÈrĞîzÀşĵĠ‰>ÀC|J'?„l Ô¸'‰Êù`RAĉ‘6M –ĞÓíÈ] ÖğŭPDî³ĜòCÁü°äô$qoĵ(ĦyïQ Ĉ´M81şŬNwÉ}°‰bï X.xÔŜĥMߢ{uul{ɽ薸F”%‡rx)œż5ĉä'+N‘tK ŻÍ¸?Iêx6€ä‡`´ŜmáçAS.) Ş6rIÔçpœ´ŠŽ‚T.È J‡D²Ĥğ i&R‹>Úŭ4ŽÏفóƒħD,³¤qVjMv˜?ŒÀDw+RÌK²\?#ÀNœlÛ r8Ĥ*A"î|ÈÙîUií£ˆŠyËĊÉÖÍÎYlôE‚Gġ@û\Zè7·Ü?ŞG^ĞNÂÊôQE§ïڊi‘n~é LN`2kúPagO€Uċ#¨ï‰ÁUÀvÍĠÉĥċÛ ~°6À¸LĜFS6Rğ|[ÉÊ&ë5ÍĞÜRŽ'U ;7ÀDĠ+ CN0×}ad"´tÎŜX00Pı‹‚͈Œ­Œöî˘È‹‹†Bîs²ë< Ešé ÀÚìD` —YÑ š‡]NUQs¸ş½ŬÈo~ĥ($óó4!—)ĞĜV^,O’ÀùĤÂ-‰0‘NÛzÎ×#— ÀX°€h‰§/Ŭ38Àĉ`§·—µ 8ıä›>v S„Üb6§C€A~3té™h7"ĉıBô‹›ßÁgNGwn"Ż#ŭü°“vGvï(Ĵşbş—äĝO°ħÎUĥŒü7g %Ċ~`Eá]ú§çé§ 0‘ĜvïıáD(ħ*†ĜCŸ'ĝYQ‘³‚Ç—ğ†#½qRxĝš6.îe†ùcÚ‡ŠXÓxoƒJ4´‰~>èÜDz2(Ĝâ !g5_p€9`(Ô$’Wĝó"q޽e°`*K#ú`è€Û&‚RuĦÂ]‹ ghyUÁ‰ÌÁK£péŜ0<~Ğĉ½G+²‰C³K"Ĉw_!½¨ÎàMûqèœUèĤçÁßX†ĤĥälNέmĠÙe\pv2ş²½a@Şw=db6‚pĞqbżÖóÑÂÒüB³ßçğb!ĝÌ­cY#ÎڜċuÔy`mŞy§Q‡ĠEƒé×pwƒ[Ŝ UŽ9PÈç.Ĉt!´r›Ç’ 5ÚgT€uû½àĤĊbdg²O&’aQiĵ”Üua˘—_v°›˘ĉġïñÁnğ(f2獂v}4³ıíLŒkEKĊžÇq5ˆ‘ş#,ur†W’38TŽÔTŭ {vfmËGúO#kM6öèôVçs` HĜ} e‹v‹ ³ZŽ“ vM1BÑu¤(œÓċ­ÇgpĠ”}…“sŻ:p—D:6f‡Q'Ó/žI9•ħcV XçĴW\÷J0TìŜ÷„‡üqgÁd~èB2|ĵ;)ƒçŭ”4{à\ór=Pĵġ?b\i"STî\Lä†AûŠ°Ù ÓUċÁs˜ažA ĠĈPZ/UŸ@#tœ˘Ŝ}8X%ñħ„z¤(\¤Yoġ´—§<ˆ8³ĈIqí‚7Yú‡ deĦÇ Ġ˘ó…ĠGüÍöj~ĜÑÜïÌèéö*ş0ç„#ÛĥóÚ³Çî6ÂŻv@1ìg[ĥGÖlnƒ¸Ŝ9ĥ=ZäġïµÛ#ÂÙÄ/7†3Öhô8{0ĥÑż9Ž.K§xÙĤĨrÄ/‹ÑĜĥw"P}œÌÀİ1îäAQìö–A‰3(çŭ’'ÌaیîċġüÒ6òǜ3:ĊWx=܇ĞĞĈ í1¨ÓĈe ŭÏô=„™Bcѳ6·İ­œûÜ@ì$ĜZUUc÷´›aUYŒfĴÈ)vp"#Ú]h]fysŻ(Š3w›Š‡Š+8uÏbGĝhc™ÙÛ-‘Ş˘×\K„—ñû3‘#Ésž#ĴsŻÁ*8Ċ‰qáÚ쎆‰ĴnçĤ [)¨uñµ³òq,ŭ6oò~ċ{fÚë. •u˙€Gê2ß'oï’A:ù.h"—ŞvxŝŬÖ>½ÁYös§ż™5ë‡Ħ3ĜûĊĴ_b%蘆ÙO{Xd'ġ/]èŸıßïKG )âßX€8Â?½ žÓÉŝğğ)~w)²ê°S€½ÒgMZ? ÀÔí-…§çMğí+]Óî^6­3›[:>É|°y|I3÷ĵɉ_é’"çN4{=³:Òğô‹Ĥ0Élw|Ŝä0úJMŠÜ;Ñfes"]>+À’í `_O§ĉ˙èÙU¸‹ž`c#xìĞġ ux€˙wôùv0Ì'X5ÀÊWë%–]Îĵ°‚ŭžT8Nǘܒç?ošM^éšĉ÷²i9½°Wz_”^{ż`ëĠúŻOIF½ßñ\÷·ËßÜ0§ğßñÜ}A‹ßÜ lìw€<|/ù Ï-sê˙ŽÁĵŝ†çĉ=ìÇs_{ì°À^ûA€Ċ›ÛĦsë;Ŭ·²‰ïo^èu:Ûġ߆ѨcÇɤ3Ûtf:l˘óĠħ?İ6ùv€A›:LŝĉŒĞñ`„˘ôı°Lß^Ópˆß/‹íŽu2˙Öù›ÍoFƒŸ?`óeÜG€ñŠ6j†‹ŝyħ8™BOÀŒx9G$i²†k@Ó[‡Ġ,YñïĞY<€/£í×Fü-&rî82×WA¨·Ĝ&u|ßċèPòÚ ·6ìÀ…L]?ŸĜn ÷öÏtpž÷# ŸÚŻA mĥġeÄóÖ*l[Ġ=KŬ|£bı ¤²ë ÔŒ˜+4ÜÚ8(|‰Pp€m&t3álĵƒÏĤòš£ =ç|8À šÌlV2v£`sz˜¨%³Kħ ñğz˜Ö•@Nô›Zû*6‘ ,G;˜HÇ?;ŬĈÂşÀ ÛwğFWíÊŜ·h°nBûîß`RW‰0Ğ À Ààƒ;#|:ô;rҀ̈́Ċôğk0‹\pÔâ‚ğLîŞ À@ ğ :· ŻJçÏXÊMdh"ş6W€„8ïĈZĝÄü܃âşl.Ĉ7 Ÿ}Sovp"À<krĜIX‡ÀÌ3Ĵ#4ĜIvqŠż`!|éÇ\Á’#ß#ÀV kĠì€&’ÁC<ñ $Ŭ × ZÓ½‹O &`İeï,ûÇlç8ÜDždÌ1üċƒŸ“{€%`Ѹ‰„'{ÇYÑİ\L$ŒżUƒ]L$W˙žpâÏ䃟‹€ÁIïuüšW…ŸXä8PÍpO:]wgC]<2˜;Έ ˘‰¤k¸à¨âeß 0œ³ÓÖ ÀÀbθ°‚s9À°ü ÎJ ­@N;néĈĊϟ°ôx‰‘A‰Dh‘ĝĝ݈"ĊOĴôÉ!š üh‡/N/qDÍAh|ŸêĤĜ_˘ÂĜç€ñ…‹ÛÛ[̃ÇΆâ7Q¤ĝ‰&r7Ÿáĥú!Xɽ~Ş›˘ DO˜á֏Qï|0= ƒė,3933,*9(45387&9;8.J&D>84H4?A>/35ApĤ9L67(ŭAEGLF-0[*IKHNPMÎjI0BZC>Sx;R‡YPFBFżVWTIN°;[ŸTLş´45A]™[]Z?cŽNiKŽ5şAaQb{_a_Qa‡;z?UJŭû Lb–?f°'|}Id£Kdž{[\ħE?dfdIgĴOlĴNl²KcìSlĤcdŻppO[yYlnkXo¤WqŸ`<jUfZú\r™drŽlfżVt´[sFQsurOpû÷>>\{ğy{xc|ħg‰fd|·vj˙ˆ„M•iĵ`‡­~l‚ħI¤_k„żw„ l…ğ‚qƒ…‚6½-/š˙v†°ôWV‚tŝ|wX‹û~}à‚‰–S–ÙtšqrŒÂ€z˙}ƒÜŠŒ‰q—˜şyu|‹Â†‰´•xyŽżg—Ç*şğˆ~ŝıƒ_‘p™ż•ZTŞħÍ~V‰’İŸ‰ †ä‚ü“•’~¨}ˆÎŒŭQ¸ż‡›Ìeĵ~eÂ_€ĦÈpĤڛš•žµŸĦžŽİĤ–Ş’Ċ“‘eĵÄ֕cg²˙²Ğc™ŝ˘³§¤˜ öŽş‰™¤èŸžŭ޵¸rÓqċ›dĞ­ŞŒŽ˘³ŻħÇĴŽšµÙĞħĊĥĴÈĴ°ÎŞİúŻĞâŬ¨x´Ó³µ²pÜ ğÓɳ—·ıĥœœ„ÑÙ ÄÛğ½ş’Èŭí²~ÌÉÀ¸Àá²ĈĠ½şŝşĈÇÂÍĠÀŞĊÂÄÙĤĠÄò³ŻÓÍyÌÂÈĈÈĊÊÌÉİäĤÇĈ˙íÁşÍĮ̈ßċċÍİÊ×ÄÍËŭħèµĈÔôÓĠÑËĠçĠÑèÍĜÙÒÖàċÓ³ïħĠŭÖĜĠÚÜÙĜ×üîĉ‰ÌìÈŜàŬîŜÉßŬŭÈìâÏċçäßéîîâíċäüçéĉċêúêêôëíêíéûòïĉö÷ñòüùòéô÷óĝġúúúĝú÷ĝùŭŝ˙üoÌD; IDATxÚ콐Ġ™èÛúĠÜkE)şxN.Ò™WzݵârÁ^ÏKÏÌú-m×× FöŠÀxU ~Ù\`{—,y”rSlËKÊ·ŬğKj×iŒ·J^]ĵ@YVÎ*…qäK"Ä-’6ˆšlĥAšUúsúżÔšÍhĈ=ŝÜj÷÷VĞûœßœïüoĴœ-çBáñ˙Ž'žĜ%<´„˜j§ƒIùä—Ï÷ÊĜ£žxb•}w^œ,v°ròôùÓÇ,r„\33;ğëàììögg÷Ü7;³çÀìî;lê.MŬ­İä€z`vzP÷ġ ŞîVĠŬšşgnvfŸzu ÎîÖÔŞşOUgĜB{Ġ}ŽĦàžgçTufÎPçĉTun)êĴĤKè’ŻĴŬĈ´ċÎôġlÏ<·Xì³Ç×nKlŞ1şġ>”lş Sñz ‚Tœıcnvwżş$Û̊É1Hé ĴdË}ùüéù ùӀ°ħıé]ûĉĤ·ß1=yŭӓ{Lï™EêöûLuP"u—ŞNCu7PwςïkêœİêĴŞÎMOƒÏv3tׁéip2:cfaUgÑgr~ uZS'MÉĴúéU§ ™œ™ô\jrÖ<žUĠí·gm7:9g{Œ]sö‡œS£`—ûì1²Z#h\Waҁ?ëƒ@=`¨0­vĞÑ?U0×tš3Ôí0AÂŜĦĤóġ÷!uûÚwwÀNżgÁäoŸïÎY çNŸ˙2ƒ…Ο˙öż2ä½÷ĉŠcÓ3ÓSûĤ&ĥÏM턟=³ŞşêTwu7TÁĉĤ&ÀáÎ]à3355>35wO÷ŞŞşs×40YBĠÓè319Î€&p?ğÀvubÚT'§ĤĤĤĠ<´|&uÓ´:=5݇ègib9\XzŻìüÛöPˍZï{ĈTwiiU§Ş›;µĝÚ5=(ÇgQÂ윙ĥŞğQ¢DĠ’mğEŬƒÔ MŬ˘ž1ı{fü.@‰É÷ŜĝXÀı„À9öġHRû6ÀŜӛœ™œÚ²orj ŝöÌÔğc*PÛ‡ê¤ŞÎ¨Ħàž·u xŒíàwOÂCġİĤÑ3Cu‹ĤîštRÁ!T·íÒN†ê$PQL"!L“j\ïœDéd¨S†şMS5ÓÄäSáÇ.>ıcò‹s÷Í_İ=têâ£à˙ ġ£ŭç(^ì·Í<5?˙ÂÜÔыĉ%´ïŸynòŽù‹óÏĦßÖnÒ¸ÑIۍZcÚêQ#ȌMuŠ/=6ş[SgÔ¨ßm†jêL'=$RAk Ğòe¨(/°p²vé½^ÀTâÎ˙G`4d3Ĵħı‰×ÏM‚&AÛ ş|öLBubËÜÄĥí³ ¨3†şSSÇg€: TÑÔqp¸K;yzbİÓvu ĴİÛĈ'‘ Ş;''@ÔOlƒ¨N™ê¤ŞîìSÑS/t™˜˜8Ż\úêÎG•Ï<ŞüĉżíœTŜİ<ĵebž$C˙ƒÍĝL¨˙OÉg&&ŽžğĈ´¨ŸıŽtwâŒrnÚŝƒ˙Î|{l~ŝšÓßÖm–ÛèıĞ~U{Şm–‡żÍ#=´s|Ê}Û şĊġŒúíÓfJÌŞên3´-û€:‡ÔñŬGM t^=y ¨À1í³†8Ñ›EŻsóVÀ.‚M#ÎĜyxîĵžƒĦŒvÛö™[ĥOï|íۍÔOi*¸3€ËŽOÏ–]=êü@uÛvğ Ϙ*ȆĥLŞêN¤î€*8ÔB'4}€i۔݂”ÜiUwĜÔÉ ä ĝ™€gLœé\óèÑgş?83ù ò™•\Ü€yôÉ£³O)çŽNLĝԓvÜñÔS÷m;z×îK➣wm™xô̙ûvl;sôİ)tĈMNĜî[}À ëcXÔIôçâ D¸=Ĉġĝš@Ħ;-*ˆ\5êµ?í[ĈUu‹ĤîžĥŞFҙÉ’|Çvì¨,cu‘ˆ/°‡÷9mì<(Ŭu°ó{ŭ꽇ïš×Cıê ¨=S;@FıcLU?~wËPEwĠM´Ğ t;xn n™Ÿ)ô̟šÜ#İš:mSáE08œR? ÎwìTCĴŞvJŻ ¤˘ĝA û‚ü——î;#ïmíyĥ·ŭ°–ƒuŸûÊoŜ§ügĈòËŻŝxtââ3Û÷žıċG_Ûö£ïíŭÑ1ôdwïoĉf^ôú_>ı÷G˙²s¸òĊùkĥLĥÀ=z׏n9ŜWüċO½wf/ÌnyOĝäıùħš˙â_^úêÄoßyrlˎ ÎĥYÜó6ûSYŸygż:i/ÈĜ.{ôíĥÇġn”Sb ĠT˜NZZAu\SĠ„5“}ǎíÈón1Sù Ĝü]{ïÚ;ߗƒ}{ïħ‡÷î>@€íp|nâS×O£ß?òM-˙B·ħmË,ÊĦ4 ĥm™3UġݐşK{·mğĤTĥÔìlú›RUŭ!MUŭÑ>­"£ĞS Ş“_*cÛ}g”?z͐ò+E~ĉŸ.îC€í“3ċáOümïŬ?wÍĜ=?‚ĈOnû R9˙/_nßr—ò]çßż\vââü˘÷IƒíÙŭ£½;N|ŞuéÌ̧@üüĜĊŸŽ]÷ŜŭÛc[şgÙ²sÊä ĉŞ“ĉ=>FÏ3Ğù8œ63,çĝê‰M]Ġ˘ŜΗŞÚRİ3Şş¨ĥd‡ŜsÊìÜüó™ƒçϝğċú3çĉżöÉÓÇĈΠmúİsçŽ]?~ñqV&§mw[]ôÇ@İݳ–gÖÔY³ÁĞ?@äNÂĜÜ= £Ŝ€Bk7ĵ&”š-÷™mœjûJĥ=j‚4žÜ~@möÜ=­ò-˜h€ÙÁ9f3X³~QmĤ˜›žAíşs¨1wÚ`ĠŬj31j°ßBí* Ŭ§İ³j›2¸”ŜĵĴĞzc˙ìôŒÚ=³O?y6kÏÀĤmÔĵŬ£NÛÔ}Z+ıú™™3Uĝ=ÑÚ·lŸÛĝöéÙÉħí³;ǀillrrlzrl×äĜäô–ħí3Ó;·ŭĜĝôôÎħíÛ'§'u/N 2í֚äÇÇĈĥïšAc×oŸŜT AÓĜÙħq{êuĤw“~gÚ]YîY5İMùû´çĠÔídSŬ}ß_Zô™‘;;£uhŞŞ~€i¤L§q]UÛïµé=´ö{ œÙsP F.ò &*`=àûj0ûò=5;0>·ûîsğ<0·~îêĤ BïB‚ÏŞzŜĦİmêƒssûÀ/ C›ş{°şO;ùRçZĠY¤0Ġ}ĉ‰P!†@unĥW5N€!³ÌîDK7¤ö=Ë÷Ġïéjπ:×WûlêÌëj1b<ŻsƒbD‹ï} 3tDŭÌ-İĦ†XU[Z'Ğ ‹T3ÙgîVOžÙ ³òÖÎ1I*`aĜEyÎ"°³{ìÀ}÷Ĝw÷}öÜ}à ĝĦ}·@ġ¨êÁ[ŒPĞşO=ùààŽì{Àp™ġPç éAtx…Úԃš OŜçĴ9x÷ƒèƒTpxÇ`U3!ġAxxŸŭd àà}@˙ÁσêÇrxP?Ùj=ŽûTpɃµ+kż0b9¸üïÏü z“Zbd)Ş#ÚËgŞ_°Ĉµ%aî°§SOhO:›*8ñÀî‡VLNÏ;Óg€]tħƒPÌ=hùÜg7=¨~„.Iġd”äHç”\˘zàî‡/.KÂĜïsÏ|ÂOlr×ħeÉï`ÉOVM"`žx€yâĉ‰'`ž\NÀòH$R*g%äRÜR.ĈD"ħjß×ÙĵŠÄż@#‘Œˆkq/16:`Ü×óŠĴġVç²bĦ*IY°V kœÔ IÑvRŽ–¤żž"+@ÍHŠ"TÉBcY*~­€ċ$)Ö(•RĈ“dS’ÒŒ—*0R!;€"_ˆ‹vÀЁl„Œ‹9ş*VÈB˜â…BÒv­hS½¤Dr…„ÀLœ“lf˜\”HWHòt0oL €€% …„DħiÎK– ë"³*`8—ġ†ì‚TÎ'Xp\"¤P>vL!<“)JR"ÏKĤ’Ĉ“4Óë"ƒ.°0ĵ`Šİxݲ‘]¤ EQ’#`ŠÂ5À‚E;–£¨ /1+ñ%耑ะœTF °EݚĦJ^²lxÀD‘pÎÁRĴ˜bK¤\dœdğV%)ŠĠ 8-ʋQžÉ— ‰cĵXC¤šŭ€;Ğ!`è‚İF6ë%ˆL-ƒ=ÀĜ³‘\ħB;(Ġ“š™HŞ‘ˆ½/Ġ"‘„ż…áTZò YϨFxÜSÁìòR*Îq´ÔˆDx\ÊK• ĜÒTK„wž X‰Y{f%¤"ħZßIŒzÂÒĵŽà5€y9˜'žx€yâĉ‰˜'žŒ0‘÷ēUQÏÁ„Ë%"Á“*†‹äh*ĥÌÚn%ıÛm‡Òžl!S]RĴX![ż’)É-İL§éJ=ÓȀ`ĈñqJy›špš'kX³£KĠĴ”S.‡ä4ÀʒRétĜĴ’ïżáĴR ÛUN)8>N›·Ó¨½$܀IìÇ.f‚ XžVÒċµ,­F F³l.mŬgXšSŞ4K*“C™ËÒ9XŽ…ÇY&` ›M§s,Ü{r™ƒ#ĥÀV°şÈË­VP²Zf•§›|µĊMïAVVĝœRȨAŠ £\Ğܒ<ĴŜA\µÚ•6ÀSŞ ŝÓċÚKìË•‡d 6y9Ëġ–ahÀReYú oEè.•*ÊÁJ\ĥËĥ+i@SK Y™£•ZĤĴä8@*“ñû²Ö¤àÈ׸H+`Ġ–Š[Ĵ9Ú[k @H-ŒÁŒĞ Kƒ|ĴUN·x˜Á2§äÒEĉ%öeŒÎ%ıHFŞ€;c€7Ì£ "TÖ÷À ¨ß ŬŞ´Ò=€3ĵ’óÛ=e°Ëë"ӍÈ5Û*]m ĝAQd€—ƒ{+`mF4r0àË]‰ òْóÀQj€ħ˘÷ğŒµH8§ÌEµH/ ‚P{¸Ċ ŠSPM³šmTËix ĥHĴQN§K­ĴŠf@(#dÓEA?͓ˑƒİâıœçàÊiN­Nfĝ&\¤'îÌ׸H­gAm‹w'{-vä<â•"Ĝ·yìA—p§d–úÄî~ °”!”K\d¸+#) ’ÔҎm'ŠtÚec§äd,¸v8‹ÓƒµàŒÙ! Q_§Á.Ğ‹ Ë -KR&;Ü#ĴÓoËNĈ’“ÑĊ€µûmMXĞ? ĥ^+ċşbğğĉ’ÓĞ `âŝ­[·^ljvÀD.²˘01o7"ÀÄ02˘ °jŜ%R-{QO‘Éx,ÉFbâú,żĉuôá:*`1[ï½áÔÙ7\û‘U­€Up²üŭïSxĊ X5Úc,iĈÚ÷SxÙ XİÑr‡dIڐ4Ûß:ŝÂ[†Ì[Ğg$pPӉĈşŒŻ\ih€µ ;0oĝ×oŜ‘Ô_d>ĥılVNp—ŜçwЉ’ XE3– c Ydü~ĵhŒWÜ!YN6†´ÔÙöü3G^6ċ×-+`i~ĦĴф°žğl˘&T[VÀöŸ:{ëÖ ċżĝh,—ôŝûïĵúWġµ `ŒnÌÑ&`LJ32´;3Ë]%?ŝĦĜħċ`)˜’ây:îĥ|À¤FÍ Ĝ­˙zçĠÚ ^Ĵŭ) `óçµYż0‡ĈW‘ħކŒïĞĈÊ"€5;ŭĥşċ¸-h–vݽŠ€ċs]-–; Àj`y2 z€­0İ.ê€eöïżġÇw~Œ˘šöZd#~éÈ×·ġjÂ,&êĈ¤ ˜i$ŒŞġ™şœEĞ‚ƒL$“ZEÀ²Ĵ+lŒ’µ|­Á†×3`îċ‘ŽClÓ­'~üÍ[ßû‘†DİĞàé€ŭfU˙ŻnÌ4Z3ŒI;`9^é’ ½*xR:8Ŝ¨"(e2ר²Š’İ.8ƒĴâ -7c•^9ŞàŬĈÒĦ˜m€ 2ŜᭀUIùHŜo^zċë°ËT‘ġ2üğĠŻğáÎ;ïĵácy1EĈ 0>ñ}àô5ßz^­RAÀšc]LH”zzF–RÀçu˘ €QÀĤċ`²Ÿ‹¤¨ZSJ™nT‰¤`(”rd_ŽT|t€Ġ£Ħ|1aì9X³‘lĜ\d•?wÏ/•ŸŭŬ?l€IͲá" 솏qR*E$‰ĤQÈg¨wó­Żŭ[ŻfĴ…|R3ÒY³ÏĈŜB~£XR” €EUĜJİ8 Wl€uG˜T‰†B!Ĉî"st>Ŝ(ÙKÊâçn{ġ /[`’`)ä×6ߑĵDeÈp˜ˆ/İĈYXÄ•‹}ë0ž 5_½cÖ$UcŜ0j€uÉZŠG€µ`µZµ°ZĤ–uL=`R=ʊÀ:r7\h'ê|`ŠıAŝµak—J=Ċ`S[#L°5S˙G^bâħH$ƒq³%?™ ˙šNÄ~˙ëñŠÙ’OôKvcÙ ރxK”‰R"ŞPĦP9+`ġt‰I·ì€)D)ı €IuĈRÈGù(Éd+`X÷o{éßŜĜ€Ġ…v]„›ÙÉdJĥè1£™.Ž 0ħ ³÷E–Sd(ĊS)ÖÒ GVÄ?ûDš,™}‘U8ôĠ4Ş}‘5h” ħhĴ ŝ$8ĦĤ!Şt3I)Óz͑S*’RÉp+œQ‹3ÀÂ2 ­E;˜lmh­$:]à?wÛK0 Tëfâ$+Q5/PµŞċd²Ğà,ŜQşQĵÎHr0ħd–ÁXV½µ*žŒÖ"½ÇŽO|"Ĵi€‰ÚRê|R3Z;ğ›XíkĤ)ıӏq(-u`‰ˆQe`C4´Ví—`ù ”ŝyCĤċUĵd`‡ëTââ/Ŝx?ĝÁ?˙ó_ç€uQ×ФµZMHŞÀfÉZJár( ° ˜"ֈ‘Vċ­e0ÎŽQİXÄÏY‹ 3• /İi.Ò\=ĥ™ × `bħXĴڍêhŠ;$gġÉ-˜?˙'UBÓEË*|Šèê€ùS%JIKPx<’fŠŠh+ä§cñx<Ŭ3à0Ŭpp˜ÁSKpXsËx°Ò•7àZ‹lµH)“aÁ°&Éuk‚TV¸ZĤ jA݁-Ó `’7˘ġJ Ô…Ĥ­İ•pÓĞÓ‹ Ô?lV€$8üĊCGÉ;e쒍+ÌiĜ ³qhi8=0Ìi.Wwċ3 ĠÚœĈĴjKe҇KEq˜ŠRp4şöZ—é–ĜŞwKŞ‹tİt÷ oîRÀäËó îĴÔ`˘[ âyŜ:3c(Àšy†Ĥċ$Y:ú5(_EûŻéÏà`܀€ĊġIBQrÇȲebMj€½0ŻÖFLÀ^y Ê+ĤK.y†’ġ(YúŠsmŻ?1(ŸV÷0cÀĦP츣1´Fv‰í´ĜCϨqföĜ==öĜ/#\4“Ŭñ Ê|†VÚm€uġmMê“>ܘGBJ=~ĉ‘›ĊÀ^$ñžÛ$·fzñfÊm€•[ u³ß´Pl[f½*‹ĵR‚[½*ğ+̘ôájÀ>‹6`'•/°aĞ;zLO&°˘/ôI2Ìû(ĊGĊüé½Ò†Vm҇ĞûĝĦCŭ€ŬsÛ+`ËLR`óTWĥOÖŞaE†eÁ`A1Ŝ€e04)Cb*:`·?óÌ3'żaLĵçĈWės/`|Ü]G€İUĊ;Ôj£Ĝ§ĦìAû/ `µ’‚‚¨·K M$ °âŞn,ĴĴ0QŸôá*ÀÒ!ސ Ċ5À^ĝ8(â?róĵ °goƒòĴ{#CİB&DXr05ËşĊ.•´ĈbÀEW ˜1é].’ …BI^ì™GNÀy½ÇEJÏĵàf)àÈĤ °Ï €µÔZd‹”É0ƒŭ)EĤBád› ²EÒŝÚJË`‚ ùB*çġ2Ĝc(³zĴ· &=ô„ĞË`M2D’ 0’ñğ0X…új‘b dböçXnö8Lúp[!?còŸ…ù—në+ääĦgÜ]ÈÏĜ ù°¸Ċ ­ÖE”2$'pa䀉m҇Ğk‘ÒK7‚ÒV œ ˜ÚvŒ·>j‘0Yf÷ş0İ„{ħç9~ċ9˜>éĠ€½t#t• ĉË€‰˙ìg?+šF7ĤĠ"?ùeYݐ:`_µÔ"ï¸Ĵ€­fKäÊfŠÀ`ŝĊ?™Ĉ˘Ĥ‹„ cÏÜüft3`š°TQl%]1šbÍ3&}¸0٘˜Á#À^şñĈ{îıäaĠPÑHœg>~D’nŝĝ R-Tp!`Ë3,Uâ$ш_Y€IU^ĴqÇČ™6gf ÜÌ8Q1çuĜHñÌ3óà ,£)\ò eë3Xr³ş+äÖ`˙Ö7éC,¸EšËp(¸ĉÄA Yvŭĉ#W˜äh½G´. NS‰Œ‘6†#X ş<ÀŒIâڏÉsŝIħgÄ ¤Ŭ!g›\bÎO1íĴ´•EiéĈQ‹tÖѸ²£]``ÍGI%Ĥ1_´ĥüÌéí#’FgÁàvÔñ·İŞóéİŠ£ıœr¸ î`‹:ŬMĴí`„ëTR–%ÚĴ*8‹Ú†zş•€1#p‘Ğ!DcÁ`!Úq2“UçÓİŠ£ır˜Ûˆ;<îpžuš'[ż€a´•EĞwœEÖ ]]E…j8ĴUÙÌLJÖÂâ€-â"s~&,’A O˜ĜĴŜ`TžU”,-di Ġ˘/óC€ĠäÊCQ5ş†V°˜ …(q€ Q$ëz$ IDATŒ˜˜`™AD¸ğÈQvy€m(ÉĦÍÌÌĠµH00'Àd½ßÌl5c³šd– XW骛ÀjŬŽ„’’=À<ÀĴƒ9:zKŒ—ÊêfEE(V•ZˆŻu…V‘÷óÓ%_ĠTY"`Bğ×cÒE1MgŠù`%ÖĦctš÷ó[`êÈÈĥÜE’1V’.ÊB§×Ì€Ñ]ş°"À ‘UxÁ`<‹Â=ûT"ìh§œíñT¤ßžs83‹÷_3BB½G۞[ëU†L[4 ,5£Ñ(ĞôUşĜÉD#`e…€­fvêͅäLJùÜĈkĥŭŻ”ßŭĜ+Š}˙kċċ·á?„,Á·úġÛ/½zlìï·Zî‡û·ï?ò[¸WßĠ÷Oż2÷ï:ò²^0`Ê`Y§”úìäËÁûèÙżĝòòŭèĜùmG;Lyí~XÒ÷¤“hŽ?Ô-€]ĞEß?ŭĦĠò³û?@4_Q€udµiž![’iô6Ɂ€iÎħÇEÚü[Úħµiġ†j-²ÏK˘ZdŻïój‘И ux½`ÀôìĞÑг<[cY°¸_ÏÁDĥŽr°2, p\öǤÎĞE.°ĥöĊÈÁê”"0J )>F*ħv6r0¤ĜÚtm½úêĞoş÷êÁµÈ_ ¨EŝÚR‹üĠ2j‘oÛj‘ïzµH'ÀšhÑİP•UêM}:šĵ&QTÔ°û[b_äŭ Ö"ûĵäkƒú"yµÈ!“µµá‹ĤÒ2–€ue%ÑhÀ$0¤ Àú"ßÒj‘.Z‹Ô<šW‹`Ê )¤ £…ÁÇR€E%¤À–Q‹´úÇ_Ĥy˙_‹TÖ"ë4 ×  ĊJL P‹lÑB¨ċ˘ĵ.ëġ‹×"Yŭhj‘?ğâk‘zT!›Ĝ;ĈÚŜÌċĴß?.µiz4Ż9:À ˆƒ8Ê,ouǚ˙ü‚rû#oyşg˙ôËO²?„Žíû—Ÿ~ëéûÑħeí_´îGû·ìûO÷ZÀŝ¤ĜèşŠ‚ÙĠêŸ[PŽ;ZŸxÒùì'u4?ù„ƒñKŭµÇ`£ì‹lݚ,ĉ"Ÿp4?ù?ßĈŝ?Ÿt0>î`{âÇK6z€´³û²•Á<À<À<ÀTÀşú’†ê\Y =Àdé… úìhš<À”›’ş!¸˘ R‡ ²QİS(t•ZğáÀ9ûĉ›§À O ½ °³ŒVTËá>ğ€.‚iì°a2;{ĝ<óĴ³‡7oŜŒa‡­Ĉ ‡7ùÂ{€™€ioı[À:›cI ÒÙ,­Äɲ+ğp†aû~4İè^lóY;`û7£&Ŝké4lŬżżúUĵM² ˙n²ĥÛ´_ÇF œĵéÍĞ{XFÀ·ÏnĵğîŜŭĜU`(uŭ uP*ĠOp@…Ĝ‰ŞŬ‘‘NWâµıHœÒ…ÀTlĦ•[Bœ€%µĊ"póxÁ `¸pì‚NŒĜ‰Ğ°M§NşÛtÁéÂ)ġd€#vÊĜ…­>@ÖÙ7Ï4À.lê½vÀ.lĊ°M~ßuĴ,ëŭÔ)›1à;üĉ…ÍĜM`JK_Q@ÉÄb1ıYĠWDĊ˘ħXˆĊÈEûğ-³Š8–ëİÄĦħĴŽ:˖¤B¸&#Ë –YEP­RÙ‰,8ĦÌ5XA’òEmë)ƒ!ZĥŞıÑá›ìe°ö&š˘ŻVÖÚ¤Ş'0=Ùġ2†ÎûMÖ2ĜM·³›OÙ]äUĜ֞2Ĝ #—ë/äûĥz€âä"cm…‘` <–°\ "+!Çä'b8/I<£‚Ċ™€-N&` P“Ġ°ËûCe*”d“nÎ*҇ċÛƒyĉ{óU=…üÍ*`:Q`êĜ×Z¨ °ŭŭ€Á|pëŝžBŝ‰~À Ĝ½˜˜)’Z‹ì˜DQEˆâl7+%Ż+‰%V/6cĈ¤ĵ:ĞÈ(x}È48!n›UԌ›³Š˘M8Ğ(Z%İèË£)­0Pdş*€ùA!é*ß½vÀ.``ŝSÎ޳0à47Ħb °7ÏBßİÈÖıb/`gğ°ġÄŝë<À,êş­ıìv08/2Ú;Ч8R×'l³Š˘Ñ¸˜?MÁ1ù–Œjǽó"Aa ä(Ö!Ó½€İAH' ÙÛLq†mjófßUöZ$Ä •Ż,ÍW÷fïmĈž‹´KGXÙÍôÏ**5ÀŠp•€´ÓĴ˘&QD³Š XJà.}1)•…P DAŒGRİċ ¨Zb}°9Ĵs˘uvÓĠg{XÀzŜ~•¤ *`°ĉyŬ…ž†ÖͰ,Ŭ k!ùÍ{{]¤ïDof=)ŭMĥ)€a ë°ŒñĥÈ2ëÀÖĤ%˙ÂMƒZòï½0txó&[NuïĉͰıì&ßĤĞNġ´äĞhÙğ×çÛì3Êwff:D½¸u8×M›ïµ!²÷ ïşlˆuò7` uíßlƒş„ΞèµĞ'Ğ{½ vĝ^¸ġvĜĵĴÂxï‰^…ŭûÁw/œX÷e00ݳÛÌÌÌÌìrFU˘˜ĜŞ'—<ñ6Ä1Ğ&‹MúxÜÑúÄsÏcî ñŝÚßs2z€İ'×giş– ĜêNúĝ(c×\sÍġ˙ò/Ĉ1tüÜñ—ÜürÏŝäg_ĈŝâɛûíGÎżv;:ĥîĞÇ/ÚöÇ=À´³ˆ<`k0éì~ÔÊdc7²Ì‹´­`Ù; R›ùĥ7/rÍ(Cĥúe0Ô·sÂXÇéêŜĠu~eìĤ­£Ż¨3xÖ·†X]G[%`ĦĠuî7Ö XßĞëh€ñĞ XQV\µt vq|Ĝ\]Çi}suCĥŭËo+Żİ+–ÛöhuuuVuEC–ĠuP^¨[V×ù™ħúŜuÖ÷ê:*`Ġĉ*6\3ESŜ~քÛy¸İ•Ê-ß2Ž S{—ßÜê³ĴMÑçíĞëĜ<\]ÇÁzĞëôVZ̟Pyˆ¤Lbà{⢍ĤhŻĦkE˘ ÚY0ìş}€ġùGsuğ´Żcġ† ŻóöCÎŜP_QÇ\]çŬû7Âê:°Z³-ı 0Š šĊ /—£ŠD½ÎC*DN⠂’ ‘/UKJ9‚(€o5J!,Ëĝ H‰!Ë‘)š!{Ûżß†@À™}u>/ùâ!˙hìûĵäۏ²ĴayĈv‰|ċÓżU=ĉÏĴ^²uCĴsÀŞB[Şş °T¨Œ<8ċ4üà˘ħr€Œcd4’*)ŒlÊ_Ô£üċX¸óĠeĵ$’XŽĠ ú2A ĜÙSê˙èP‹t^£u)µHÍ?>t…Ġ"ĊjËm.2Ȅ#Ÿ°Räg&`™ mÊd8m°t`hêëÙ^Âk‘÷;×"_Q-òg‡6~-²".˜ —^…Û  ‘q—ِ<À>’ĈŻĈ†ŠL%ąb|(ǨxĈ`\+f1£ùŒ~žŒJ„Ÿeє?ÊG)X3”ëlë mÊ+vĠ… ×-yûÚ×"?0öëÛE–Ú-ħĵ`•VCŬì_oĉóĵRàĞe%òí$V`‰Œ”ˆĉá>“Iĉ£ĵE3V˘?¨B‚ Ö1éhšŽFıf”KĤd%"-5Ħ%—è8|Ġ;G¤$"eÌgĵ5R+êŻE-òŬĊk‘÷oÄZ¤Ô,wL›ġĜnÚ-F*Ìû™@!Ĥ1!†ħ£l1.r ­>•X=€-İùÚhk‘‡ĴEŜżŜk‘’P[ÈE ´ÛíÜî+İû‚B­Kv|Ĵĥµ,Z)`×aÚ H˜Ï]µHÓ3Ğï×7`bı½`5IQÉÇñFğÌk˘MàÎ`1ÉG)k Ĝ ğŠNŜŠK˜/é[°ùkK-²÷Mo ÙyeÖ"+%tvp‘$OaE’:`|Ŝŭ€İÍĝ:Wg÷ï_B-òhk‘öÖ"ŭĈì‹\°VĠ"eû9“ÀE’)Žç|v4!­0dġ$óÄ@ŝôOTyĵOŽœ|è$ûŝĝñ“ĜĦıÏîtċ#ĥoiû#úñ#–=,ùopÀ*-"ô×"‘ĝ¨‘ĥƒIĞ(]Ċw†ŠôÖ/–H ´˜'ĞX –ôĠ@^òódԀ­^W‘˜˜˜'``W `•Ç``# ·ç=À,ÀäĤ&+LĤpşÛe¤6X§Ċ‹ [ˆ# ¸BvÀ&S‰Ž’T:ħA/úóۀ€Q¤.ËŒ.*…zRm,-+ħN6"gó"Ğ %ĤÑĵH 2¸UŞz€]1€Óê3‹Vm:‹HQ`uKs+E:ق’Í+e2VÉȍTşË"Éy.ò *ƒéÓû+‹ç`ò€É]XWs}dÇUÀšŸ‡€‰ ›,3à¸Ó%0ݐ?„‹,d󙺐Ê3ş‹äòd&cJ…|2SSŠYşHšÍx.òŠĴ„ĥ•Ô"‹9€L#g¸>&'ä‚·×@Í”ÄÀiŞE2ÏE^I€ċT /ŒĤ™"…ÉġÛ;ÄRú+=À6$`ġH(”lnK>½¤‘`ÓEÖ˘ ŻĞȓU,äWx0O\\‹ôód `²ŝ*0OV0FVz•kf, gibċŠÎ€É­Ġ“ĥ'k,Mŭȍzcù€Uı ɤ'ÏIŠ ċQàê¤ŜˉJ.ßi(pÄAÊüJYm€ueO6˘”¨eV˘si^Lċhm,N.›£äl4›nHİ\\ŒÉĉRr.ϓ ĜRı”O İ\–S‚)ÁžƒIžlDÉ/Xw€EŬİSŠĴM÷[­h'›í˘·u4ÀâmEìê€E[B7ÇñÉV•P"’ŬEvDO6˘p‹VċEèMQMÄŭjg7Ĵaò6 01N˰`<ÎX†#Ş€U O6˘D—ï"`%&j.2ցÁ4À’&`Œê" RÉ*ñŒP$°ġd6%ğlÀÚ$žéÈY<ĦğÈ(ΑLQaŠrçRĤħĞZ(‚³]6,ċ¸¤Äì€3jvAÉ ëž¸DÈêŻT^B3E•ÒXŠq`;X° 4ùN‡YóJÖĤ×;^Zş°&(Ŭ7TFӒ_ÌéíUr2.X6ÍÊ °“–$²äš"XĤÓHç$QȤÓQ(p`/Ö2ÈVĊZ5›W˜6—NWD͊˜ÌIb&m½'îLÂ>*ı °b^ìÓġb`Vh³ EäĞ&ċ$8ĜŸ‘ê™ĴÈ+ Ĥ Îí 2ŸnwĜZÉKU·VĦ’’Ğ+‹ùtš×ğ È˘Kl À fy˜ıA˙]d›OÛġŞ—¨ĴJ‘îL-_‰|cVÎċh`ž)–3vÀÒız·ĉŞÛ‹ñµĝˆĞv›Rğ1À:bġbĥĞÓyhĤ:]S3b·ĜŠÀQê€qù,ÄÌwĠ")IJލë4Ä:5ÀJŠRk3™†U ™†Òsš›Š XşŬ€ĠÉ  ݈:OÜĞħ˘Z¤L%;JœÁ%[Ĉ¸¨´ÉeFç´ĈÓ\.“ËÙ\¸EZġ ËĉŞÀ?ĉ2éLğ` x˂˙sıĴ—¨s‘+ÑJV ° £ #9R^6`ö;lGÙ6s%à"‹Š„JcbÇĦAÌ—–çtÉ-逅Ö0k`…eğÈP]T.—ëuX k×M”F§QÀƒ.Ry=¤ÊÖûĉhdÊn•ŞíVXPs(ĉA@.Û/E‡“ëœÓµıŠ“ħ8²ç)ĉMİ/{éY(ÒJ¤cÖ&xR\öiıŬĊvğ(HRKv# {:~ğXv2–ŒRÁµƒĤœL(§˜¨Á$Ë;tğĈR{İĈrsĠžoy.²˜Í™âR*`ÑpÇ&Ĝ€IB")H*`Ú}ŭ ”ş6p <Ş3 S3_â]v2–ħa7BÀšu—HX[’^ïI”&ĴîğXÈslĈ°jÌÑWtÒĥĜv0–nL)ĉQ\W)vb;” KbaĴrקּï½áڛöÛK$E”°^#,Ŭc„€•Jw“³H$ĝâÀËä@'Ë]a€AÁGÔ ĞU+5 `ü §ÎŜyíÇ6múÈM˘ ˜˜˘éŭw~šĤD0HŠ&`šñù )Xğî,#CZjl{^{ğ‡*Ż[Ğg:à|YŒscĴÛqŒë3–,=:ÀDÄĤ Ĝߜĝ×;·&xI"7CD4Àâ§ïż˙ÎĞŻCeMÀú06İi`.™Ĝ•ċÌ\¤ÄÂÌòâ˜nË XĠÍğ”PM0ÀĸĜX$^ïĴÏûŒL!`•fËĜ ?ŝĉµEĠ'lë€5‰Âû›ï|ç^L ò†ħĦfŸ×nŒŻ…Ñ XJmüĦSd4d,˜ìô†'áߤTL¨B"ÀúŒ%Ġ¤‰ÀBÔyŝÖ½óc<|ÜĞ€5b?}fKßùÖЉš5U0‹1YY0şż›Ğk혨£’ŠRĈËĞX.gġüx+`5JĴŬȧm€áTĤ‹á‘Œ”ì˙ġ˙" İ€1Șû‘|eèĥuÓY$W]€Á÷Wj€}ôÚŭßĝú½Ĝ‹09†Š÷Feél´Ŝ˜jì knĴWàıë4%: µˆÒ •6Çu›a&Iv—˜TÍB~öÚEÔxÇÉHΨE߇0}çûÉ0k‘ĊDI3ŝµY‹,ġuÀŠñLĥH<ž4Pc)Ç`Š °îÈ˘p(!Ú]$Îu‰†ÍEV“rvÏï½ñ‹Ĝ gh@c`$MÇ£½9AӉh£0hÄŬœƒ•èl^ ¤˜ jÉOà@[Ż–b˜ Ĥ„ĵdÀZmÉÚL‘ŭÈ e2 ‡˘ÉpÎhh-Ä2Ïżú<ŭŭo֢͆nü˙ÒfCĞfŒF 0à—„tEt`ŒRrŒ^À$Z­Éi€…"ODÓd–ëLéŝ퍷½òo½€²İ0c,B”ŞR`Ĝ X6‰WÜPÔT˜Ä–i™Ŭ ĥŜ4 \Goa˘Ğ¨bLĴ  …˘x0 ̖üzT™²•ß'ÔĥVµ%éï˙>‘Ħ£%żÎ@cQ[ĞXÔUNÉù¨ÒÄñ’’Vİ‘J\ÉÔċ Nfqp 7”Ug•^ˆYÄíĝHyK-²Ŭl6[íĤĜ’DkCk%!wsÏ˙ŝğ½ñ†°•Š0ŬÀâ WêĞEŞF{-R3êµÈ˙tÙ¸t€B Ûh &žíê€âqjHÀ¤FĠĴĤġ!Ö#É(iï‹Ôñd*%è€ċµún,YÎ,á‰ĠìkĤèV`&Ĥ£‘%íŝ{“P€ßb¤µÈ5´VPŝzo÷ħ˙ġÏvÀĝÈ˘›ÌŞ€…£háʘ*IµĦ5mXŒ °0ä äó†Ñu.²  ä À€,etÀë0İa–Á²µ•$x X–× ‹)J,ì1Z3Œ=€ÑĦŻUÖe ´CfƒAŻ`ïuşrWŬd;`żyì÷~ożĝÛß}ÖX ˆîĴ̨R†€…£U‡–|ĵ꒏W\Ŝ’ß&“ÀEĉĤ’è0F(ĜÑ} ŸRÊ8Î+D› w†Ìâ"›ñ ÑhäÂi7LÀÄFĴ ÇC9œLS*` cDh$`FC?³NfȆÖNSşE)Ż`óàÁ ħğÈßĵñĈ/Ŝxŭ÷ž,ÈtûZòĵC_dŸħäh\Ŭm”[·dÑV­e°¤?ŒeI<˜´4´òħž1½d”Ö\dÄâĦħÔ@ĥŸĥ3në*˘ Ĉ¨O†uŬ`Ħ3é?ú£?ú€X[ò[Ü8š˘2ëċ&5˖f IÈĈÂQ<ÛpDÍyŒî"ŭ´Ŭhs‘˜Ó]dÁ%uĜ‚E Ö¤Ma¸á:âÊ˙–MiËÁ€ĞÑĉé€5z†M!ÀĝjnìÌhĤ·H€ġʕĜ¨şŠBÚ û<ŒxŜiÄ8¤£á0ÒàdÌ;žéÚ!ÓNV€‰1Q‚€9ĤŠàpĥSL 0npÀT€‰5ħ*ÔV$•Ċ’Ó´„š£qèK7n—×3ñ^Pfî ġE£Àݽ‰Ó:–g¨nĵÎns҇KĊiJE;`~Š;Ċy:ĵêϰRÀ*]^j×WZ3&}ˆn™˜Q·•÷œJ8y§Ċħó’[Ÿ”nżgŭŒlKÀú¤sIM/o˜‘ 0>ï’gàĴÀÈÒWDÚ^†/ŝoP>ö·¸°İ. ÀÛÒ|Š˜‚"SxF&;J-ğÄIUu҇Pì¸cbF´”S`GžA˙ĊMÀğ ȍA£hVrÉ3”)Ë3¤eék(ε½ċÓêŜ5€ÑESœÙIqÚàŜF°`cíR ½^Y_xцÖĤ6àĉŽĈiĉZ‚ĜëQÌìÙW$éÛ Š[“Ŭñ ÊÌd›)7ĥŒP_dĴ­äˆH^Ébí!'}¸°Û_{úH`ħŸġ[n6hċ€NßÒ‚ĥt€Ë ݇^M IDAT|--á&}¸°żŝúgû{IċËl¤.²˜Íqpé€tßÒ`%šËc¨Iî NĞ6uÀž¸ùĉ›o­0È×+ݏ0ħ {üĜW/BÑö`˙ʧÑŝ‹îİE–ÒLW)ÁP¤:ŝ] †KLžÓ7éU€eñ‚T‹:`0÷zĉĦž2Ĝ7ŜsÏm÷¸°t´$U˘” Ş?Ŝ*Œ_tw-Òݳ[@Sô†£o҇ĞkD"Q<’×ûĈÇo^òŻÙ_Âğ°JÏP²¸HĠ'Ŝân‰$3ÊÎîŞË`µXÏëe°Wž…òJ_!˙‘g\]+GCxI²–ˆ­ÀF×UdNúpY!ż-…üÇîyìħÇnì셇nww!ż-IvÀH!qfLúp[-’7k‘ĵ(ŭòĥÛà‡p]0ûìüë7Cc¤Öti-’—z“ĊĘԨƒfŠW _Rчai°Ÿ< J˙%Ŭèĉf µ˙Ċ˙’•Ĉ^—×"G ˜>éĠ€ŬvtÍ8Ş€ùĈ7qäiİ™À‚5·Ĥġh9#+Mj½tv÷.Ğ“Z˙# ›ñÙâÒsŸ‹”Eâš°_Ŝv+Ż<û˜$ħŝ”Q›˙ĝë’ôôí"0Rn,ƒYžÁ€MÄ_¸ŝ²Vܔx.À‹t(êRízUWÚĴXRâ+ĥ .oŜ7éE€•‰Ê͞½ lĥO™‰óôÍIÒÍ7żŒ.,ä“%ó,ıYĥBT3îÌiéud#D×àêTX‰ %.ĵ€@ߤ-ğd¸NŜ:3c¸á:œKž³>CÉzğl†v`ş"áÒm%ÒvZ: )£Ŝ")˘ÄJĵË/ÍEj9˜äš‰Ëp(ırrIËzğßt` ,@ÖíK$hcéur7\žbi€Ù&}¸S§˘ šŸâ=\$Z:ÀĤıt,0‡™R. IŝRzĦ+²ĵĵˆh_çÂŞÈ˒´ĵêÒá—*ÍhŞCg¤ĵ’ÚpéAIv˜o]: · ÎE˘ 6vÁ4Ù²Jƒê´%Ç´ZıĠ>¨Ġ"k­E$Òm-*¸ÜZİŒàĞ(diÀÒĈ|ÎÊ _ç×;³›…˘:ÊÒÓ²5Sè“K“ç;Ï1­AÙ°<8‡–ˆ rÑYf‘ĵb?‚Ë’‹…0#Ê #̲tCœ˜ĜʓuĦëvċ&ÒÉ=ïìöÛp€eBĦ˘˜Ĝj– …à@:0°ĠŒ'êuB `ċ./|é0ݐ?@`g÷ʗó³I6´Z–¨šë~{€]选UM¸ċÖ·t²W*{€mÀ²iCòÒ2;ğĊ•ĥ/€+KYµÜì ,Żg`ĠREZÁÒûpLĴĉ6,`ƒÀ(ÒhéV_:@S”ĵlÀĝĴUÒx.ë(İ̀€,Ád³e³dv1YëCœ³ú—XE!kk˜R*˙È£xħ͈Jĥ Œ°T„1„Ĉ0ÚPŽ3Ìg*Ì3–†1$†YUĉİoÛT&ˆĊíûׁ`=Wp:§WâàKä§,v‰Ħ$‚aÉQ^yê½aĈFXogw5#™ÂÒ§Icĉíüì53€ü–Ëœ´‡0Ĵ< H)`>ÛÏżĝŭv"Xïlġ“=:fû]çsz˙}ĥĜ‹çN޲ñ:Ž8e”ÒM ËèË 8!` ;4`†%V°Êt”áŒÖĊ G˜L`÷·\.ÀV­Ğh € ĝ`Àíe–÷‡£Ĵ€€…’òZŠd²ċĥ2İ4ÎéÓb9ey€U|XtÁ”CJ‘” dÌÚ2p_Ub„Ĝġ[0³àbŒƒħeÖHĝ,‘ X;ŽİËÔĈ£âZ&D°`E8ÁlI€ĞıHvـ2Xt‘”/ ¨AĤĠ¨\ÀÚÌWÑJbÄĈĴoéĥdĈşzÀÊĞ(äsÒ§½|ÀÚáĊ“† Ós’˘[ÀÌ?Hó·×3`ĥ2Qħ¤/ dó\MQxĥ ”ƒl˜S*lMi×*rS\`Ö"Wç_ 0|€İĊ{†uÖ0³Ž+ÒYԒŻ.3;ğ³8“İ‹)6ÇAÀĜ2Ífê|&RTg9€%;kĜâ.r9€×°ŽŜFÑĈ×`ƒ–`z—À•–6\'›™˜>ŭMĵÍċù„iÇ[ËÌ/í"ÓŬeFcv8GXB"ÈZ>Ì/ŻA!?ïSÛÜêĉoı°£)ú– jzgw6ï:^`Ìr\$Fê’öVŝŜ˜UüŜ›ìIṵ̀€ aĜÌÚċCX_Ûê4S0ˆħŞ‹ëı_ìY:àd†Ë£,00 _¨%ߚYƒR (PZ0,6ZÀ@a\4Ĉġ5jh `‘–’Ä"£k¸€uz–¨viV˙b£àCñD[ g‰D‡ÂÓ²P£\0:8şH<ĤÓç !!Šbg`ÌĠBàĞĊRƒûİ KĝÍb€“”5L‰H†ŞŽ²)˙r5SX;ğۙĝc2Ü ŠEğŠĴbkh]júœ\YÌ-%ċG@Ç(;ğG/nŒBM``#LpìĉĥnFSx€y€y€y€ı0?ħJôİ“Îrüĝ€€“œ<ıŒ “'?ıˆxĊ@.çûş°bph[: K p´Ħ„ Ĵ °jGÀR8†Ċ1-0àü ŽĠŠıĵß:HÛŝġLağêżŝç?˙šğHÎôE£[m3D×`hÈ4‡L£f Ö²t0ÂñÒ0T^!`Jr` §Mnè`ÁYE‹ĤD疆s‘˙ó6Ú2X rZ߀!?e9dd%!œB— ïJ΀|~gIb & +.sħ…² ĉ€ŭ½o£0 8J\Ï.R-Ż 8d0ÙÈÁb€‹€ œÙŬQS³ĵPÌÉ# û9$ÌżĤ€ 5ßg°QÍ\ğ\€@FX-0°. JQqv­ûù߯%`mX¸g”jÂ7²ı·°ĵo` ¸Èĥ#İ…\$ĝà­² İÀ€IÏÊC*’?˙ù˙p탞£k êĴ£=À†ĞE.䓋–s]*œL&ŭ J–É0Ċ4– Ĝŝ3vĠß/î%G *˙UÜßzı]dĠoğ`lpl0`ÓÖd´vSÁ>ħÈİÙbéaZ˙xÉ˙ĵf€-– ²Ĵ?Xq5`ĴnFHB=ldrSŝâ@ÀÈ€E;c°âà˜‹!2ğŝŒ²°‹„³#moş_ 0ßNò޵ ĝĝˆ˘´`cjÀŞmlµĥÙ••SWÒQħ¨”$F\ Àċ`?!ħ0Ż ĴE†ĊÁ1§Më.-j|Ħ{Q\´  û(ĉûèÚiİıżÛÓ*%VÀŠ4›nd˘D vYĞŝ Ĝ 2Ĝ€ v‘FŽ9ÎŻĉ–Á=MFC+“† ċa˙ġïż°6€1ÔnL{e³¤´A­ `t@FċŽ PĊìڎ J´skE‡ĴÂRBžsp8'Ó .䃪+nŻ*,Ħ³ĥP›ŝÈëW8븰š:b˘ĴAŠo#*ZQıA%`ò6pñÓ0ÇzgnÛ]$†Ġ`]r0`R ıÈFW† yÉĠĴ0LS“‰Qġ­İ‹¤‹ ½Ĉ€YZ£­KD0Ğ8iqN$JN€EíÍĝ½1W@ô1Û:še0>ÔÓ#ı$À`ĉĜ˙ù‰‘Ĥ7PD‰D#ĜŞğkݵHÙlÏLʧÉZ¨WY!Ö  †É 0IAÎYăÁ°e}Ğ‹Œé ùJ>î/, t‘Á`Ç#Á‚2<`€0ÇĉÖÏŝé'F˜4%"ʊryËuɗİE֚ĥZäÚ·ƒÙeC8üƒÇ˙ÄĈњ1_£Ázó"/?`?9ò‡6`ŬŽ&e07ö“Gvú7`#}­Ĝ ûîOû– 08h‰˜+ûîw˙îóÏl$À²MRĴ·tÀh–ĝĈòċŝÛ8KäKş,\‹°˘Rê.;[ïKĴäOìóċżôú†ÉÁ–1ñĥÙŞ¨ÛàĞÂùkWĴ‹\`ĴöHû Ĵ{"ÁfĥyĥĠòċŒ,çàB`ËìK ċóGŜğr´!xf߃ĥt@4EÀšÙíĥ"Àôù\y€iŬ•–H$8¤÷{ <™‚n1ÚĦ J1]ÀډÊ€µ ²7‰Yp›â€Ô—AX˘¸`ÌqàŒä’àÉóK,™@ *ƒŭ1t’€°Ï>1ÚêÏ%*ë0­ĜŬ–ğhŭoÉıӆK¨€5(ħ¸:€u™@À2˜Â X7ˆĝÍòġ$Nƒz??€8Î ".s\ ”÷ġŒAè‡GR<Y*`í8ĉ FĊDÀ¤òA!ìŝt$ċüVĜĴ‰bïĞÀ”A.²Dgó`bŠÉĤÄĠq‘gvKX¤Ċ™-Œ$ ĴÓû†Ŝ˜Ë5ò{_zÛO=ˆ…‰ğÈVó£Uaİó‹•`°%ìhˆ#•Ô^QT úÊë0‡Z$zÛ\7@Rxĥȋ%Ò=`öażÀȈ ˆl§/‰ıÁ€uİ×x8 ™îymw/Òh=Lr ˘B°YcïĴMq9 ` €E8Ş–ä¸ĉ¨Ë9Xž0µ²ÓVAcAĜU”-4’BT"QıÈA]E‹Vô9–ÁV –‚p>u‘%µä1LŸ€.ù2 ĤXÛÁXĤ„€ ¤PN)q )ñ˜@´ôŞ_0%ÄŞ*5-·@%klFpju 9-ĥĦFtB8––€šìÀPà"“B=­D$²X˘.ëJ£ĴÛÒ¤8 `bIƒWH‚È(5İ |;”’•†â˘%SxĤç|Jò —‡íÇNĴ-`İ0ŽGĜeĉ`µv­b­Ej;˜M€7ŜfÛa9 ċ–—ƒ!G7?ÁĴ°lĈB0ž¤%0&ğ#kwVZÈD0Ċ{)üe-k‘``‹&ësƒÜXÏÒħ†^:`\àĝ˘K_ÂÌú+ŸœÜÍ+œ<ŝëî’M§tÉğ$3”òdC _r `mO6˘¨QVĈq~Ċe0O6ŠäG=l§„ XĞĉÉF”ÜrĞóÎÒñ2+„=و\.`­ġ%&IËÉÁd Wk4xIìĤÑh4nEFtŬŠà˘78pĥÉbıœîFÍ:aÔ.2Ċ0TuYe°JU’Šìĉuòċ;ŭvħìd,-ÙXm‘£Ó†{R)—ËĊ|ÙĝZğ˙Ä&\ùOnġTë`§ĥSVáeŠŽ´˘¸n b#ĴÍq­úrk„ĵ°ŭ7ŬtÓÖB/`ĊD"Qè ŽpÉ÷²Ôg¨ §o5ĠÈW$´EX°jıVĞV‹Ĵúë0ĦP,ä9š°<ĵJ9Ÿ&°´äGƒÁ˜0ñonĝĉÙ7\{íVŜ #¸"GFVÀĝXÒn,™FÜb˙ì[?ċ›ĜŝgĵjdJ $Ÿ6+ä­´X ĉéĥélAŒ/väN§N{+³yÛfL“-—ÙTÓlċ€µàŸ³ OŬú‘­$ù‘Í5°Z‚ıôŝ;ïĵ“OTMÀjIŬX1Ğ'sÈXˆ›F|^Kç˙LËÁ˜òJVÛ(dL·Ë[ӆÊħ]PCĞ×ĥÊLħ°:óÜ?ĉĊ|% ÷Ï}™ûSêġZĤáĥbÀÄZË ĜŝS?u+TŽÚÌ€1İKïż˙ÎĞßy•Κ€1TŻĈêĈ,mq‘Ĉ3ÓĠUĴĤ GdŞ%’5ksl‚ħÖÈŭ—'Ħ%àŝżÍ9ÖÈ×rÀKz€­´³ğV·vżŝ˙ío¨ôĜ}ߟW•ƒüĈ†P62†7yÑyUBMĴ˘/Âà+S‰ c/Y˘°‰aRĥIĴÊn×/˘ĥV-· Ĵ²ˆĴ ëZ˘ èY”Ĝ X‹­”ħUĞD™žżú3î3÷Ŝ™çÎ}~ÌsŸÑ‘FŽ>:ßs~ç§s>óáC0 (`ÁíżGĜĵù–¸˘€…‚_%ú”H¨·\VI+AĞáž°$ÍÀÇ\(SĈD‰34]—•¤!‘& j ž{O-ħÍ&`$*;suEä:ÀnMá'0íĞ_ŭô_ĉŞ·[‘Á0Ş÷ĝÍ×^{<ò+ÀêÄqĊR(àÄ?{íñÄĞJ0Š˘8T½36ŭĵ­èŽüyÑà X€ƒ1Àe<ג†D"láÑ~Yi{Û‰Ż2`·ƒeuìŸŭâïŭùïúß˙۟Yói0ñû?z ¨yġ•`Ub0”ĝ&6C™Œä·ż˙öÛóÑê$€ù°ì™o6yü÷`ġß?ž{bX™˘×d2ÏÖ ħ1zĝĥ:‚–D:ùŸÑÉ}Al²`·,vkÀĵú3Ÿù̧?Ĵ%óÉpU€…·èj^kJd#ħ–ÈFâ–DQ“àñc‹? `CÖVnf@ Ê>½÷<Ĵü Á€ÚhVK$Ü~ĤĤ şNK"Ġ_ŭӗÀnŝñƒ˙ĝ°ÊĥX7“ÈĞ$2u>ü‹€ŻEŞN§úŞJŝŜ|í•W^kWòi˘ÚŞäÓÄF%J¤=†µ˙·@ġjœ°•È0ÌdĞ“1_?~ħ pòb4JK"CÉMÍ>ӖÈPŭĠO~í…b÷ÒÖ°İaÈ7Ĵƒ…5`°ŸY¤sYbÙépRĥk?zóÍ7[âkWFmñµU€Jt†ub˙Ĉïĵûîğß|Œ˜Ç¸`ëF ĤġMJä •!'5›ĝä¤áPڇ›ġ·[ħ(´G‹Ç ú˙ÚcKĝÑı‹Ġ׃wŜy÷Żß|Á€%ìıôQMìŭw€Ùĉ÷.Âà?zôĥeĥûO~è½÷AùĠv’˘°YSŸĠù„ŸyĤá‹çĴD½ñ(™F¤j˜>:‘ÎçUBBÉâXzŭñ·ŝ•×ĵs&żdĵĝÒK/ĵĝÍw`¤,…5ħ÷!.Z-‘Ÿû—pÛWzôèsĜ–ÈŻ˙ևŜC|u€0/Z7ê`êsŒ0UF\OmĤqŠ]Ğ$çl‘³`šĤYu"k7е@‡CAûü/Í&ŝmËŞXŜ ÌsŜöĈßÖÌ@ċW°`ñ_UË,C‹ßĝu*‘úżĝŻ…üùÁ^n:ÀnßUkùppÊñ? “V<ĜtĠÔÁfŒÔN܎-ÜNŒi2úè,Ô ófHġ €òĵL˜ĝ<²yRĥ’ÔħĠéŞVġqÀ‡„ëÄÁÏŝü'?ùĦŸ}^$ğYu€äÍî§њH‹,­mğaDĞ9–Z+:ÀnXÈô’`íĴO…öûġ£O X°çĉSD“û{V iwßéw€ŬŞ£ŽZ8Lú>ÛZqMCïÇeàoX„àK‹M _T€_à"yoĦħAX £¸dƒ+‹DçûŭàŻ3xˆÖL÷>MĞüU†çâ߃"òáß*6p?Íüڝ ÷v…W2Žx5Á—n§œì^–po0Ĝr>£&ĜĉiY3ĦÈ!6ŭRY„á*”í̔{3ç`›ÍZçz½äED­5WœRÀ½’üF›ĠĞ6ġYѸġĊU] ` ˜R•ŝCc”àoħÉé—úÂs˜˜ċdŸ|g¤,’„V˜VÓüìXÈ`Ús{›˘Ú>‡ê|òĈŞöI–Í”wÙUk[›µ·Ä)§›˘‘îíœ7 ‹ °yV,`ú½Ŝ`´y†‹Î3ŬÀĵÑÏLŜ"‰”í°p<ğ `‡à70$‘Ü´lÄ0ó[vÉĦúc IDATp耇’HX{à€ÉĴ ÜpóĞ%òĦ†[‘Ĵž>ôl>§ÌEŸ ˜:B­È>o§°sµ"/ŬMqfȰGl>dÀ :&PĜôكnH*6/Rí;ċ.ñb$ï!K¤^™fw€ŠpÂó,p˘µ~ȕüNİÜv”9únBv€ğ"–$EXXg÷°Ŭ”°›šĤÜÖv[À:€ïëğ-`W Öv>‰ìëìĴ€­x>= `Ë|àçk¨?ŝöǁÛüàŠî&wnŠkùsŝßĠ[ŭ Úè“î&w€]°ô€ŭvÜŬä°ëJäçŽìËyw“;À:‰ìë$²³g046@že›òPpùedĞ0ĵê}ŠżAŭgJ"ˢìĥ€1A°1u½È‚üÄ ›˙áÛßŝÂíoûÚëŝñŻŝêŻ~ˆŭ}KŸ)‰L°ÛÖÇħÀó™5Uĵ­GÖ×Ĉv˜~úbßmÇó}ﳟŭìƒs,˙|ûtšàçĞĉŝËl1êɆ’~@û“ï;€ŭ‡?ü__ŭ}íç‚C#5”Y†aL^Z,„·ŽŜJ;Çç)5‹xü™yĜ†l`nn˜ ëVÀà˜vAŻïzĴ£D.Ŭlŝˆö‘OĊ`µŭœċ¸Ù‰ÎÂĦot|ö‘†ܒ0Ÿó,÷ʛ“·ḢĜUCÜD"%ÉtÜ8Íۖ‡½Ŝ€iôPߕîħ°ä;ßùâżF€ŭ§~ÚĜGŝ×ŭÇ@úïŝ½4:pK´ĞßÀÊDâ&`W p“Jey„•Ë™ĦkLZ‹ħ†Kµa‚6vHʰïü´µ÷ `ß $Òcн_ĉ›0ç,š²L˙!vU4Ċmŭ`ħ>@Yš´%RGCèßĤ*ùíŭdÄë-‡Z‘yÀ5Û8§̙Q"_:Àš…ÄíK=\$ˆX%‹D›@‰„KyùÁżûR s‹".÷v¨™Š$Iò‚´ÈÖ6{ ÀÖ>Ĝİ47;À.×MÑ,x\„J–EĴÂÂBƒöħßM’°Ĥ’È<‚ ğQA=˜ü)ÛdpŜĠyZ‘ivjÀ6sJjĥ "§4H+JdĜG>òğÖ6`_Ċ葎VĴ˜·ìĴ–w€0F[f›$͓àkžc‰löħ_ĥÂÊ˙Xĉ5`G:Z/°t<–ï`q~ßCš͊7qşY)=f,´Î_TÒmœj Xq\_$âË,ħÁÓÔż.·`ŒsžG|¸K4ÊŞ{‰Gœżüh ƒ†ğ€bŞË¸Ĝ ¨¤·°£û"…Ël iқ0ÙI9Ħùş[|â&xœôûĜJÂÎn.ÌE ÷EîöħOŭÚOwkJdË3·Y˘qŬö<``ŸEˆqŠŝF<ëĞk5HÇÌ!ÀÊÛnéĵ^iöXóâkđ”ñÊy^úxq½'ġb&Ì-ü+wŜŜ^Cg%ĝoMt“Ë,6HŸÑËNŒ ]’L Ĝ/|ü§œŭ€ŜÚ?€-‰Ç–Ï|–Sâj€ú4´M3;i+2_‡ŽiÒ.Í"^™ĤğÉÓ4ĥכ,£ozħ\àџ”U–fË °²JÉ \áöûĦĞĦ£ÔŜhn}°"_› ZםZäXĊœ6€Üï›Ë¨§‹6ç¸ŞĞ€§rb‘UeaŽàJ?zrϔċ9[Ğñ ˂0ܐÜ"" Yßuuŭ‹Û*iŭŜgż—4$2ÑuŝğR°ž Ej8ZOTÉǎVÎâJEê}Evì˜˘EP (é:ϒ98&8…vJNÛĠŭ%Ż2şîY{¸ĝ ìE}†½9–ûşŽWġuÜN.²Öo­"‹=]ìġF­Ĝœwè€iq:ÀĤi!‚KĦScä_üâwÖY’|÷?â2ìc_ :ġçŸŭaQK¤żàúi988TɕĈó Lai{ĦÌOP‚Ecu¨é—şCèŒUÖ4Gg¤×ŒċùA0v¸Xh6Ĝ€Ŭ:r£Œe7”mÛIV&ÚLÎRXSprŭĊB•IñˆŒ p’$ñbH(‚ehb¨à÷"CĞzĵÑŒgz 7ħÇxtGö€%ù~+Ċ =a Öˆ’JäĉżüĞżÄÒQ—>msŭíŻüZü5ÔĤŒƒÎE„#×+kPÔ(¨_SÒflŬ °€cñı p7ħIşg.ȤÍ­ZGfEDş5AÄ2Œċ ÀBĊ›ËôŠMcwŠÔ˘R 4ñV´1Ž9TްÛ?ŠB ”AżÊ¤%¨ $†é÷/C-Ä]T·#_ĴÁNñ ×jèY“NXï·"*ĊÉ%UËèn˙÷'~ŝžâ“ŠžÓ_‘mÖ TF–c!Y÷$òP¸N%‘°[NûR&–Îo/É0­X1]ċzµşTUş³•|pאöឣ*8 óÀ’pCÓGĉ#œµ,Â]úŞCĠßħD˜VFV-uT ­NĜA‰”7ì,€UÓïKßB'Yló_qèÎÇ~J%/Y‰LLÏëŽëJħÀÀò,ÁwĵL{cív€•yêKl…ĵ„%ƒ‡eÑFù {Á=ñGHdY;u€´Ĝ@rS\ò@ÀdêS8"‹˘8fĴtĦ.ö%ImñMÀù#žàÁeóu’bÁ…›”Ŝĝ`›DÂĝ'XVùÌÏXÀ;›³V·"_~Ġ ß˙ép!öŸ`aÌâ”H¤#C)Ô4…r#×ä´Ó' šwk/EfpT"Ì Š}ŒzÂñğÒ!Ÿ­”‚zĈPC9öéCQLz[Ĉ€‹}ryY°ĜPXĦş ˘2¨ĵĤ›9SUĉƒéAÀ6*ĵU)SK\³ıx7Ċë/żŞW'ûñFèNèM‰‹‘9zş Íı°ÓĝÁpˑ'S@ЧĴD ž>÷qUMèşqÄüe0nF¤Úû !£ÚQ€ÁĊ~°÷€ĠŽÖ&`òX%íğáĈŭŬ_ùK|Ħƒf]„Ħ ,JQóc°">MWQˆZŽû+ĵĈ6ډ¸ĞˆMŠM^•`=Ĉ…š¤žš]™&ù“§I*,t’ĵµ0·:rlm`ĠŻ´Fà"äŭ€iŒ­è~–˜0FnKdY À²Ĥ™˙ )ĝ?˙ö?ŭò'…Ż3q`…d¸çô~° nŞó¤5Š[ްr‰âĝvÄĠŞ}YŬ‚f‘ ˜×'8nġ2:ÊÏZ(|Żj9ĥ£.È/N‚Ö]IsóµW½\Ùĝ£i R•¤€%q.’Á}ò}˘SÄSìâîFïàÈ-¸`sd#v蔑*:·^èóVz=ÀXaĴùP"ĞĦ"ë& ŠfA‡€á=ĜY˘h]Ì01ŭĦÀ£€$g8qç#~,Û(|´rZ?…7Ë"ÚGĊÇÙ&žó§ìŠĦbîú€=×ìïè³f›¸uS–k£´O}ÉŻWÛ_ú°:\'†,(^hd•&â×I’:&pŽŞ#ĤlyÀzeèħO–†ëTNWpEĈ‘EX\Ÿ3ìp,#‘°²I­#”=,v ™FOËJÇ–‘gÔ‚r$:’ÁžQ丽+•ctcžĥƒ½–뀤 XXÉĝÜfg”È™*³·L@sn×´Dnö­Ĉ] ]ĝ£Ş/üħt½Ê{ĊÄo|ëUÈAP ~B›U+²Çé׌Ğ12lĠ’Kĵq ‰Ä]Eä4`„¸ê&‘H Ï%‹ûÁ˘ZçÜ´ÚìÉÙ×ÏEżn{úH1ĦêÈĊZéNJ„ċ•„àŭÀ&$Hë0›Ìs{FÀr+]Ŝ ĥ@ĤÛĝkĦéÄ·ùŜöú믿òò›Û·~ÚP²<ñâ$)İDÂ$‰ö6—ÔĊ"L‘pdžFŬ‡‰q›mÚ•Á¸r…cĤ!I éžâ@üuds0ŽƒĴLL²ƒ…‰ò1°àw?İ˘wrp]Iìy>–Â<m]=’ş½X֛=ù@öbĦL{iŻùHw0/L’u‰"KVĥpĦ% ÎÈ£ÛXÀ7Jş†wÎ ÌËBÏt”nbôwŸ-˙î'?yûí·•eͅ%ÚĵUÙÀƒóüÓO ŭ í­Ĵ ˘1Ğ9R‰( Z˘>Œ§\üáĤ“¨È,kIë}‚ZRpÇXZMûDċ o¸j‹’ĜT}:  k%GvDVEo„’W ^‹˘Ĉí„;Ï6ў\Z– Îŝ0jüdšX´O/ÊşaÌ÷ßZ* ×’È'\]pŞñˆë‘Z‹àtıżKQp³ko½5Ù cÏŞFċxqş9‘Ëĵ5zÊóvӝ·<ÉŬLûƒÚ¤Ġ¨ììĉÖIäúxƒÈΞÀÎ,‘>ÑÇ+…Ŭd€°ċo~ùËà“EvĊçoà6żyŭ™> ›´ùħ•u„\.`VA>'l§İŸ&OĝĴÉçşYBœĵî¸hÀ†ùœ°³Z.dIRͤì¸À  €…ħıo€mŠÈħí ›BËâCCĴĞĉŭĴ³‹ì°ér >``g,šOXĜ™;››˘³°°Î:À:ëëĴĴĴ³°Îî%`) —2˰ÎΘ/Á?`°˜ŸċO7bĦ.„YŜÖÙI 7ôyı_ĉrnw€uvÀü¤ŝPßĝlH ĞĴ³ĥ) çŠOĤv€uvCÀš6Ÿ… ’/{P"Á÷°ÎN ĜĈ7üĝ fŸ‚ݰ°ŭv}ìğCƒÎeǍĉz‡€yaĜ½´’Œ†— Ĝɞ§;,ÖdE|Ĉ" PŜN)Ê8]y4²Ÿâğ‘5ä‘ ˘›t€ñA.0\:îŒÈÏÖ ›Çà`íQœŠ I C‡C°ÊV<·1Ë@—뉍‚˘ìl†‡˜Ĥ³@Ġ9/žëhx$:-jf*ġĜq’ġTzŬš9ë\*ÙÒdc˜Ox4Û2ïž0×­Š%4 d“k!ÏġFtÄvü4.OŽ<”58ëÀ‹ó°³N“ŽaNF:=á›ŬeĤ+J5:Ĵµ9+Lğ/¨ş pÂF|† ċ'š ‚ Fç’ċ°Íöĉd€Öĥ†£­VÓ`a‰”Q5£š ŝéH$šr48{uŻĴ.Ádܒ ÔS–{Â`xls܄á ¸ĴËGOG"ËxÒöÔlm€LLÜڛë}BÀŠhĜÌ×ÀÁ„z>˜vİ%³'”È˘<”^.Gp„¨ì.œb:{êÑuÄ+fŠl›§“Èò@ÒÑċSü™yKžĉ8JEŻ`‚—?ÀbTì z…2‰ MáÀ¤y‰c†·Úĥí*Œ³û XüÄñ-ÊÓy ‹(ò`¨8)`í Vɜ ĥËN…^˜Roĥ:´6nu€uT­<‚‚ğ}+ž ‰ÌNê‡ĈyR_xĊtğ€1ú :nÊÔ²ĤĉU€ŬZ"ƒ`g4¸g€%ĉÈrŬĞüÌyìÙĉŜSö]ÚŭSĞU,qAê`-Gkꌌeğ1sŬĠħWĤÖĴR𜤠VĈÊÔ½UĠ`-0PŬ´p÷(@'Ìb†q^n{X#·Ġ/™Ċ2nÄÎH۔ëÂܛj ĝînÏqပĊj֓E1‹]Y$ħ&ñr(ٞ EIò,ŸtİjË4#SFb+ğB –ÈbĞ’×Á˘7Iјħ8P½¸:Öœ8Éĵ(ôioAí­™PoV@'£ĝérÈ(ac?µ˘N„KYòĈ4Ê%žûl ĝkĊ/vÎ Ïñ=XĈkÜ(èŜ [Q–ôħ‹Ħ}R·°g½Ħ˘¸İ˘ÀÄÀ½B ½ß'k7]/°jÊÈQPîÈbàâù–àDWğ]ÓaN,W÷чáé Y ùUÍdpê(޳[€ċiĤŒg ĤÛä(…L]÷w‹Ç@C–ş-?:şµÜbmQZ ™ñŠïġŞfAyŻôZ=NƒU¨›Ĉ4ʉC‡úwêy–+ġ \ÒI&Ò)+ĝŬ6‚IŻG“a0O€ûŻfĞjze2_ä¸1Y$ʕNĤD3aŬÀSÀ7“srAÀÁ&|Ÿ“³†§;ú§?€[ŠJ,‘^§’—XhGÓ€­M‘ĉ†;—eQBš8ba-üNġŞ­³„ħ>`;‘ ŭÍŬ1ސ™ÖŽ/ˆš2Í1Kç|d4LîÚ ĞK‡ó‰§tÓêt¸ ÔÓ(W€qBïT˙…jÎGbœÌ˙`~³¨ŝ™…pq"kÚB ĵ‚/³4GxVD'È2šÑ üv$0†Œ{žšSvĥ5Z³ŝmr’n,İ5ï$úž7`?6§‹%.÷ÉÔ·xjH jV„ ƒĤö^Z&Šš )œ ’AÓPNôŭŝÌ<6ĉSpsí G'S.‚ĵš¤'żÂ÷KvP6°B Wg OĊӒPY@?ĴĤğ…§=·~â™H=ÒsŜïħÜVƒ°§L@€eĠhò—@`ĝ™EĦ=e{âċViÒ Í…™mWs¤8ÛĥHa0o*²aR3œ‹”H|ÎÎN³*œ_|tš€ñzcÎ^˜„–q0<·rlĠÁ¨ĉ>Zî ‰YŒ*N3MÉïŸċ Or ĞÀ+2SdÚŒ#żÂ€-¨b˘)×kqĴ@‚M„¸ž@ı n*V.“„Ô²ta_(NB$’zb›SFb‰,ܗ´&½tzċM`cqì#ŒŭÖ4Ê8ĉHj6$ƒÚBżÄJ~ |ܝqiò3Jwːµ'“§’•-Pi6d˜àĉE:G=%X#ßUF°2OڎVĝ²ò2Ž–`ĴDcd?MaMl¸oÒ( …`/ŠÒÁs+ÀÊĵ,S ĈH%żÒQ-§jÄÀEFĞŸ'eĦál\àx°*šbµhı)`Ÿ]6 öö“âïhĥwĈN›ìġX‚caQ³1h65L‰‹,Ĥ÷9́CyQ½)=­t‰0BğĈ-Pş Ġùû&.€ToQ7-ÀRbÖ½ì‰SĦ1·‰\  4i° XËъdO‰ï€“m–WÇTûtbċGkl´u‚À9Z1`\[=rF`q´#‘W;Z›Ñ>'0­ĊŞóĦ Ĝ Iä˘Ù¨ì%ĊŠyŸċ€‰Lψn ˜J§’_İ[CY)/Rüi¤ċY¤ Ê›Ĉ;ŻoTwÄÂr"—|°bù$ÀX/;0˘ž)ġZáĴ%‘CŽÖ]À†´1r‡‹]X“½g°h>Ú`ÀMŻ`4'£` ġB02e\Ü(LŸċ'ĥío$×muPş¨òş7ĜS3ĵ˙Ìn†‰R–Ċ>ë’ÈĤ׃o…4J0{ĜŒŒĊ€14(Ùkl×Pە| Ĝ´ŠÂM˘Ĝâ90…>šQ°,ÜĴHˆ]¨DbaÚ ĜßûÙÌjê`0(‘–Œ”îU³*+ÀŞ7;ÄÀœf_$[kâA‰Ĵš\nîĵ1½2|Ê l^°j Ĝ,hÖìJäfÖlSîfjÄĉ÷ °ıĝdÀTtKz/W !/Òöf•Ġ›¨FK°"d Ĵχ‡{ĦFÜŬg9oۆ<Ó+ƒ=G;¸<1ç¨ĥ 6î¨?ÔxcÀXÚ0ĵ°µ"€Ċ¨KtAoŭRmV¤H@gT"kÀbĜp쓃î)ÁôÊMĦ9ÙI˘ċwNi1ê­²'ÄP8è9ĴbGƒy]šm"Ĝ$Ĵ6-À6Ħރù•z¨OÛא{“Uv#{ĵ6`Úp—mħ}FİŞ“Ħħ#‘ef(Š8´möH3h5ŻĴjĈ˘{_]É_ĤmÏXUéJĵ`›ĵŞÑ!‰DĞFZ£{ê`߉WêrDέ'Dé„j 0(‘`Nŭ–ÇĥD6kÊċaoŞ?A"ĦŻġ`ÈġzU+m ˘²hBż´•ğ€ŒÇ!€éÑuĞ[‘ŭv×ä•üKĤÈÙ½€.³ ÈÙgn³+b³ ’È*˙VÍJ~ĉrmÀ;„­h?f†Z‹Êޤp[é @V âµÖ8ÜùHJ0Ĝ ĞŞZ‘ĠLŞŞû%ħĞy °Ċ°Y%Ë'ÇVz#ô:$.Á²d°b 5tj“µşLħ@½Fµ;€MŬû­ƒİ^›£ÄÄ%›4›zc´(Ho,TPeUí"ĝ²mX°ÇMQTnŠİ^Géà€}ŽbœË˘\¨ç¨›R#ÚÑŞäçKáS'g€_2"‹´Y$1N)`E]Ĥĵ"€|UǑN›uŝ2C€Í:˜^`Û,7$rÓ:XÑ*âÄ9ümèU>A•á.”9­°"ÀÈó†Ë½ĦÒ蜽/€Yíp*J¸[¤ nTëxnğÖL@[bGĞP˙*ˆIû÷Nĉ‡[·ş)[€!ɓŒ–bV‹D"‹ +}Ž ìOLBĜ2÷FüüíV$ï4<X-‘[­ÈÊ0X˘‹eħÔqcvl4%Rw>XŻëûX“:ĜÖ{üe4HW#'ˆ{ŭaĊ: ,Fk. Ĵ ‰ƒy´€h"ܲÏëÎjĥ„‹eŽŜĴD9.2w* &€”2‡µwFöw›‘ı‡ši‚ĥ‚ê oG›İ ÷Ïò‚…ÈŸŝÑ\%°>żpLÛà™cÀúĵ0r!ôä1<í9*\äĝ"îÀµ|§}T'ƒ3ĥġ{&âÈž<ž‹"X‘ Béi ĊşàLPż$ä"²ùAqvEö#[¨JB‚+;Xlàˑ´ĠvàhjI_Eb`8§ ^ÍüÓ(ñpsjÀf+² Ja™açC†Ĵ“ˆŜX:3†:˙'° h,ùì=~Ñ"Âa-uµZ¸³éHáÒ°AQfÄğĊÌĴ öŒg³vA”Ù`0ŞpÊe£”Á µ9‹ċ‚öüÏW0— "IDAT!ċëœ-UÈg<]31°şÒ”>í)#WÇ)³™\û`ñˆU4ĊĤ q>C<‹3Oğ/€5‚ˆĜÙ˜UÇêdÍèq‹ÓV 4Vç{½Ĥù P@$ğûŻ&6Z?€Á(Ö" wVEïW#c³ŝEĠrÜ2ɄrYĊç@ïA#z‡ÔíKÒ5ı°Ĉ¸:0½ÓÛӐĴ 7!qs²Œ*&XĴBw`äïŭLf²œìÔTóÄĊÁ<ú^wb(À2ĥVóÖĊ/ddlÙÙ Ĝ˘œÈòÂÎË̛Ë(°‡‹D@ç´L“ "Ġ¸ñppè…Ç"Îbm†~8’e–‘ċı/ĦÌI¸Ž,Û°KĊ6`…WÉ(h·]ràà:퉲ì­a –EšR@:läĉÙJĉ86lr‘šħ-‘Ŭ§ƒô•„è+ŞßïU‚‰Yí e™\y隚ïGÛóÜF˜Ġ€ ²—ÜÀT…˜EŽmïuGàÂGÚۛÚÀF‚ Ž_MAÀĊŬÒFĥ"ßÇ`3ÛR(m.Z&v@³iİ‘° ş g9´ŭcQvÁ-ĥ=×ŭ˜3ĴÚd˙3´gpn \wŠá*[Ż"Z7iˆÏF醠Ú4\§„à"~²•-hˆN–(Ú)â×tŸäÜ3t Ĉ֎}[ÉèôğÊuÔp ‹L‰‡X<žÙ îù{‘D%'GmvÂ'Fì 6àŜĵŒƒíô8zÂOž‚ù7|M²~;2 ‚í~Û{­ĞÚaë]ÈâJż’^÷lÓì‰Żû–ùŜpŭ"ßNoœ[^ŜQöç{rà˜qéò#šŽÌ9ĝ‚ĥž–Ŭ}ì;` 9żRH ÎlDú²‹˘ğ‘`§,Lț’•Ù LìĴì$€ċĊĈ7duàMeya¸ë˘+Á:ÀNZ[Ùĥ ;ï Û;ïhĜÉ[‘T+;ë;`,v€°Î:À:À:ëëĴĴ³°°Î:À:ëëëëëĴĴ³K1•)KfXg'7$ü+½Ĵ³3váäߙqQÄÏr‡çÎL‘Yò0Û?bÚÓ?™(ˢg°íI@Öñy[Š#ƒ†Lğ„0û¨{î$€i ÎĊ§œšNxÇ“Že9Ïp@cè8Ž×ĝŜX<µDŞ ]ŽD>‡&Ĵšiŝ ħÀ÷6â ĉh3`vP”w•ĊY½6ÁċÍÉ!ì²ùıê`š—^`Èn\xpGŒpŝDÄÍÌànŞaĴ'dgÜk2,2ó *ù`Ëġv²ñ¨ÉI³ïbĴ›2.8*×r·Ü9UC/€v°“<Àú!žŝxáßhtàÊèvç‚GXêO_"‹,Ö]üÛĦï[†-¸=`dlU\À˘ğ÷³·lŭGky7–K¨ż˘6|˜ĥ˜]„ŬĝüûXíĴ³ÎÎd`= À´ğ°x‹;8nÖ]×ÏRG½ƒşyşĵ‹Úy°ğ€ԍĝ.Ž›fpÇÍ`ŝ7ËSϽ›v€u€u€u€u€Ŭ °FÖj’^ŻP›ŜżFzê:í=èa{9ÖÒX’ÂKôX$ƒEIŞ[ĜĠĜŜlĥĵĠÛfK’ÔöÙÍ­zäB}OâMÎĉ90żà_¸M³jWž˘ë—é_55$ĝĊ–à ŭµï+`2;W˜3£ny46Z‰…`Ğàm…§$n:6Íĝ(Àĉî-׿™Ĉ4˜f}(Cnl?mÒĉܰ™dšíG@iĉP­óĈUâ°yŬÜÍ[Ìa~-+´MşDv§>M ˜>™›Ĥ™N$˜ħ>2Íéò–`Ë`Ɍ›‹àúÄU*úêT˜+~",Sƒ›%`ġb€ED•Éq:ȰpʍƒDߗqgÏIcœrS˙Ê,ĉÉíŠyX`qäÖù˘(Z†œ)ĝp*·H§ 'E‘Äıx{ .‚oĜOç¤.'ħÉJÄéOL6ÑyĊ2gÏÍE߇~Şqœ='cnĈ #`:§°°ù"/–Âä;ŒÔ&áSu޽Ğ–4Ó `bü†$Ĝ ÄlìpÊËrÂN]•ù‚ö9U×2N½$ÀPğèîĤR ˜İêŠqV0İ!làC’7*È0 šÚ<‚ïcϳCfžĞ)İĤ„;=°$-*ÀĤĥÏ6ƒ9NÊ4%,(!À&ôÑ´Q #w…“R˜Ëq0‘`Àf:.ÁâTà¸ç `=ŽÀÀÙCÀĵqu÷!`ĞIr |PŠ'È7“HYú` Çġá˙K ‘ào%‘q-‘{KéCXf5K/0MDgéš&0h;€ı(@bâĊeĴ)u ×ĴÎ$X%äLq+ÀVxu01€q¸[1°[…GH¤NóÁAËMP /ñ%Ħlş0Jd:4]|X– üş`İ9cÑ \ƒŞŠB”qäo$ì•H_ÜLnĉ3@"›€ı—•ÈH’&°™ä¤Ş Il†Û† ÀX–‰„­~×AC‡ĉIĝû‘€Y9QÖI”H´‹LD€Eu 0°|fŞ’ÔOLx&ÇKd Iàá 0´˘eIRRa›™^(IcH„‰šÙKn†Óp~]0”S!ÄL ì“´”…GSP.àż À°D˘żÍ,hW`̐w} ‘ N›ß0.°f·gâB;0=ĥÔà󢪠Ÿàv\^„ÍX„/ÁÇô–q[Žxc'ş°Eù7…K[…Ħ‰€1qĠq§V¸ÂG.‰>ŝ˜¤‰ĦDBŻI~ĉ§ĤTÒ5ŭcü`‰Ûc+´[,˘ċŜÊĈĜ)ž òb 3"B›ĊfË+ô$,GĦࠏċ]S"AĤ€Ğ|Í ûÀċÙï2FyS_”‰#³P"áßU[%}<„n•w+äĜ&".˜q—èh &Ĥ+°T€Ŭ…£u0§=úU.SŞBGrGëÈ4aIŒC’+wèh|ħÑ+áĥdnk4ÑÇ1\Żr—êÉw$$úZ´Ç­ú”<ùsÉŞü™W!2ëïOÇ[´2FĊjÛġzçž|CÚîĝ£ğ˘Ğèéuew`%,ıƒBÀÂğ9³şƒĉ0ïnŽ ca!âċwaët™ŬÍqWé]7KƒänŽFwsÜ4f}^O;ëìLĤŜëòĦ³ó˜7 ŭ~¤Ç]Vtvz‹ġ‘·yôÂ,0X³ÎNnĴl6˙r˙0 Ü=šIENDB`‚gamera-3.3.3/doc/src/images/tutorial_more_training.png0000644000076500000000000013012610714675724022051 0ustar chriswheel‰PNG  IHDR`*´vèPLTE#6$&#$. ,-+'|1E-.6120$=,7(43,33846301^4<19;8)L!>@=D>85I3BCAĤAEG3Eu]?)FHE6Z/JLID2ûNPMCYC=TxYPFIJ”Ĉ"=T‰-p2UWT=\›:c[]ZMhJG_–"z{Rb{CbĤ`b_û ?f°Id¤Lf—jfK{[\ħE?>BdfdOfž4dġJha_żHo´[wWTm§œ]9Pm³bW˙lnkRoŻXp¤XrŸ]s™drށpZVuµ[tF‘Qsur÷>>sa˙\{ğ~Gpf˙y{xc|ħg‰fd|·zhŝuqßX|ùum˙`‡­~l‚ħI¤_N—˜ntŝ1“˙1ĵ)nŭk„ż‚„w„Ÿm…ğ]ŠÏ€rùv†°ôWVŠW†ˆ…|w‚Š•ßfbrÂŠŒ‰|‰Àwvt¸{wyŽĥ^Z²T~Ml•ˆ}˙‰Œ·…˙‘Žp™ż‡’İ‹‚û’”‘‰ŠáŠˆñU£˙V°·µmw Ç—™–†›Ì›šƒŻ‚’žµm}–”˙ ˘Ÿ’›ïĊ“‘‚Ÿ£²×–b—Ğ bÀɑ£ç§¤”¨³œŸŸŭx³ŝ‰Á’Żß–´ĵĞ­ŞèfÈİݽŻħĞŝİáŞ²ÇµĠ³µ²îœšqŬŸğÓê§rɲ•ŒĠ†·ıĥœÁÖ°ħü€ÑĜœÒ›ğ½şÈ˙쳀™ÏĠ£ÍÇŻĊÖş¸˙ÀÂ÷ĞÎÉwıĈÇĥÄáĠÀŞĊ½ÄÙÂÄÍÀÀŝĈÈĊĞܸ½Ó¸í½¸ÊÌÉÈÈŭÍÏ̧ßċç­ċÍŞÇÖċÓĠÑÎ×ÙÔèÔÏü³ïħĉÓÖĜĠĜĜâ×ÖûÚÜÙîĉ‰ŜàŬîŜÉßŬŭÈìÔìâċáâÏëáêŬëŜŜèíċçäċċŭçéĉééóëíêíéûèìüÜġùëï˙ïñîñóññüúòêòġĝġ÷óùúĝùüĝû÷ŝ˙ü‹f3€ IDATxÚì½”Ġ}=ÛŬPž..Û*:ŜĈg‚·qċÈn,vŬ§ÈÙŸeÖĈï."ûFĥiˆÌÓVöxUbQ—?¨X„ìx9q[7{hOjĴœü/ŽlÄħüxáyx§ĵ.BvˆU4ï½w~K#íjWkk×ó=£ñŭ~ïH;3÷û½ß;÷ŜÁ·ßT+ż÷†˘‘Ŝ›Z—ÈŭˆJ”‘µ²ü9C QËĉíÇ[—G1K;?´W%‡@β‰ÉÉġ;&'×<>;''6NMnĜĤQ×ר;PrrÔäĝf n*4u£JŬÔ­H…_ĜÔ ['' :…;ıYĞnW7kĠ­‚ Îy$'`rĞ˘Š°MŞTÑ4ĦD‘r·6ŭİÉ:µŝÌ&D\‚ĉš·‚Û×ôŽhUùö‰7wĵ×[áUÔÉɵ‚:)ŞvÊe… F(ĊIT¨[u‡˘‚?´öc5' CM ,G‹>rü‰Ïdırċ§€°ċ[ÇÁ‰Ž­Ù6>ĥf'ĝLŻŬ¨¨Ħ:9f3Pwˆıuŭ†Éñµ˘şaĞ˘NÏ¤ NŒ­Ŭ T!wŭf”„Aub||­V]?9>? 9&¨j“Ĵ‚Üq™Dt°Ž ż0ŜLĈĈg'—ÇÁO}êĠġÊİĴרcµ .½ŝÙ,&Uş›˘i­R²*Ŝ~T“J9mĠ¨°`·MJċ Ġ5P…ßŬ;ô‰ “+?†÷5àqµáÄĦD°›˜Ÿ]–ċ“OŜ(.Ŝ0nĠĉё5›G‡×lŜ8>ŞQ'GWmPÔ 0w|dí0MŽŻž…êÚI”[£Ôáµ£#âÁ0$׃ä8úŒ CuLÈĤġà1ùˆ1ASÔ1Ûè¸ĝŒˆ1g…Tx€t”ZjTÓ$żİŝc Ġħ1ñäóFÉ Ż]ä¨tÍ#Ò5ĞUñ&I÷kş{=<1¨°ĜĈ`I ĊVŻJċ,ċ˘‚Û0ħj;¨‡L.~ò  é§Ÿİ œ½Ÿİy0xöÀ>ƒ|­Ĝ<6²ŝ퉑Ça~Vux˜ N \pÈ  ‚|uldĊ„ ­W× ê E…÷jĠ8RWCu=ȅêPGQ.T‡aĦӘDŸQE‘ÔĠŠ J|öŸ†É½§Œí<½yç™Ó Äßnôôs ÔGg}ÄÔI(ûOĞsPîèÄĦ3gŽmU²äŸ:|lìÑ3§ÏC{xL<í‰6QÁÀ5Ż–îˆp7Gjï—r7GÑÍŬ ÜkA³Aşġ²ş\É|Ħ’„*(U,¨£PĠpÒvñ“ZÀ q°?[? êŻ‘‘ċ[G_à4€şZT!_0wĠ֑Ġ"PĞ&uĠ¤˘Nhsş ¨à&­X?&¨“UxûÖÂğ Ĝ€*¸}kĊ›;&˜A##Ğ׍(@ O­*>VZ(8Ĉ_üŜsüWŸ˙ëÙá1ŝİaŝ݈ħÊŜ=¸TCÀ–Ġfm-˙ç‰ìĤ‘ĵ˜5::$˘vĝÇËÏĵ÷G‡~ĵl]Ŭ‰ëĞcšĞZ=Ĥ\†| ½B˙Ħ:!܍UcâŬîĉ:XjŭO_#䢒³FÄM,'¨BÔ@ÁڊTè”ärÔċ(wtxı0ĉĜô:ó°3`CÄi;>ïŸ[V´ ²Zħf|hĊ†uCË7Ĵ[½jbhµ¨Z? pZ½¨ë|VĴĠ1pRAHÉĠ£C+ÀX!Ş0wldŞĞduŞÂÁà>­“322„rDÓȐ˘ŽŸA?C#‡J˞Ĝ?t¸úë~Œ˙êcüŻOŻ€­€~n˙ŝñŭü‰ŭ##>üÜÈsûŸĝŸûïÚ ö“0khçŜ5‡ÇG}v™†Àż¸qÙ²Ë!`ÀĝÜşáÇïŸ?ħsġsÛ7\ÌoÜ˙Š‘ç€:´ü‰qtò™ '9„HT×  Ğ.ŞRîş!c“û ‚lI7wRĊûĝn˙ µ Êi T׉˙ñĊƒAÑAU(öċ¨ĜAI ׯU†ĝ’{jC*ÀŽƒĉÚöµ€ß´÷ò'Û·Ÿk°QÁİ @mh3ĝ(|­˜BêZ­ /cM Ży}à½Z Ôġ‚şJĞÔĠ ıZ´ìpyÓĊÏAÀ6÷Š5XġĜWžÚÌ˙ôĞ˞ĝè{|ôìÈ鋇×l:|w|ïêÇ6Ü‹²Wżúğ­Ç˙éî÷˙iSö߇Wƒ_>ŭŜ²àï­€=·û‰ğ§>ybûöÛĞŻğóìm§ß[ŝ§ûۋßırq˙òUÒİH'9Ĥ=gċŞÔ׌s։w˜´÷Ğĉö­Ĝ R×Ħ\PCèû:!W­ e%ñ”ä X5lĊsA:r‘_;³}ÓöMgêj°oÚğ}Óq'm°ñQÑ ġ×ĉ!PoŞù•ĴVŬŠê/é2_Â5O Gˆ·^ŝ¸’ğ^TÇ4*Rƒ›ĴĠuŠ:*”•êà1TV žù݇–­8T^vüߟ€.òĞ˙xz3 l·ÌÀ6t¸²éĦ‹'–Ÿ>lùĉkOBmĞ—ŻFY<ĝâöâŬÛù§ĥğ² ŝòéËF„_^ĥu†›ĤJ§÷Ż[]¸xxb5`ïÌ{ËÀŝt~ÓCŸï]Q9ĵlĠ°ÄĴ„Eç<*Ô_c*‚FÔWµZşf˜ĴğAšÛ7ŻŽ·^)˜UjudhĠfħ$QíĤ¨°`GĊb‡îrt…Ĝ(ŸNdÀpg à.ò4î³Ï>Ñvqï&ėĜĝèşµbû ´ï7Œ­YRWMäZg¨²ĠqÉëŻ\ФF€Â’ktTĞ A–š°˘:Ĵjf‰Ô<m¨Ëí/¤Žß˙Ğ˙ċš‘cċeOžE€íx˙Yŝݵ°UbcìpuïŜ½›–rĈŜ?ĥñuàË(‹_v¸ô§o{Œ˙éŜ½OĦF׉Өéu˜żíŭŭkŽo{âğè‰CÙcCg `ËáŽŝêòʏ—3VŸ÷ˆ:&A¨½HQ1Ĝò×ğARûKş›cèĉ˘Ĥ˜ĥŭë 5RÁÀĥÌÈ ¤Ž ꄘ+¨k&Äöhßo^…b8ËI€ÁújәÏT€}ûLìôöíOm‚ŭÀ†{…~ħ ĥvB/~\ĦďĞ×|‰QÇꚀQ '7¨ÂI!ÚY!@£bµ.`TEKR?Ö^еñ°ÒtV—äħ+_Í=7 {˙"lôE 0¸U÷nŭÇòĉµÛ7Ÿ>ħ|ôżŻ9ŝÔïŽm>ôÜ(Ì€=úÑG‡o{ôwû×Ŝŭ½aĜ˜˘|hÇÖÏÀú_Û6´iÇáÍOí_ulÇŬgVĵ邀ż8ħvû†a˜Š ú W”ĴŽ£/ ‹7h­rƒÜŻUBë…xƒWio=bDB\ÄpR ×À:DĞŞû `W‡è"/~R ĜĊ§€lWvñŭígÀV˜àW?“[†ş=Uŭ_ĞĤ4ŬaĞv u­Ôk²Cî[ ˘Z˜\£tx ġŽmúżuXPÇ´ŭ9£² BI¤ŽI}A˘:Va/Óê >Ş$üŝċ²'Žßĥ˙—ËF=óĉm¸mtâĝ‰MëOoZ{zÓ{›Öž8qhxì‰'}eÍħ½ËGŸ8qâĥo=tâŬ0kï/—úċŬkF‡l ö­{è§ çĦ5à7Ÿ8qèWw?qâî5ÇÀo;´wÙĦ½ËÁ6vèĉ½_Y{fû*ċĴTg†úÀÄË.Rî×ŞàŽŸ”{Á ÒÜ/pû¤ğıAĵıBI@UĠ fĠV•ŞtxÔ˙µJì„êŽÑ1ĦĜׁŸùbó q"ĤgŻĈ Le[żUì×ŬŠ:s7îúïĦşyr|ìĦG½ûşêfQ…=Îiê1†ö$uJìżŸ„½ĠÈ´Y>x|v\‹AŞ5ı3ĠIYE_RrW­™^5ıjĠĝäĜòċ“ˁuùòħħċcË׏-_µ|ÍÄĝr¸_v¤V­Ö1¸›_„ǏCÓŞ BO?H._³ü2üòŞñġ@Úru´MBż²×ğêT&´ç ?Ÿ šĞS]äÄVÔğŻfĠŭ’Ġ­Ò͝Ŝë1ñöŻŬŒ g ”Ġú*UìżĠSb˙=PwL߸CÌ·ĤĉKĴœ½WÔ°+ŠQt‘S['6îĜşá!yljëFÙĥ¨ÊêFÜ6%¨;u›şC£nŜħub3ĝ ıaĈêf˜Ÿİ­[Ċ\1 >“µ*ĝ¨Ô­Sà_I ş~jÔÉIQŬşurJ|ô¨}* ~ċƒ…ŻËßŬިê_iùÌ&ágófµşubJ}ŜÂUí’ò-ĜÚèŽlĠGşCVÁ­ŸĜ&ŜoáÖOˆ·^VUİS² Kr§ >4%•óÄCâOm€€}ĤĉVÎŜ+*>ûd/Ĵïĝñ WäÇp4ĊÔĉÍ;§6?´sjCS;ÀÚ|7T…êPwÜ-çŞĠÍÂÁ;ĥäĥG§6?65~FR· êP·BÓc( ?;tÔmÂÁâ÷wÔ¨;ĤĤvìD”TTôÙİU#˙šzTüˆê­ÚD¤ƒ¤/(ÉG+ŭ!áïJ§òèNííĴ=gx;Ó\$ş5ĵAú÷ %wŞïµ|0ĝÜŭ˜XNÂbƒ•ŠŠî!ĦĴDu³¨nŜĥ>‹<Âäĝ!=p~Ĵ6üú°>u?¤’Àp8³ÛÚı|v<ôúlÛTÜ&ŞĠĞ˘İú˜òS; şSNJêc*ġħÚ\ġÛĞSw(?'ޝ"Ú3ÛħCu iÎıħ*}÷1íŭÒŜÂ;„/¨ïµŞ$ĥi Ĥ&÷!ûŽmÛĤ6<°PcrèŒ8u†>ìĤ3:²|”r!íP}vjM Ÿı3R iÁÓŒ~IÎPŬħ6 ı ûƒ½:òĠ/bˆFĥüfá 1dŜÄbfˆ˜!`†bfȵ,ÖkħXɧƒœ—œÉE,{şîëDŒġZş_š,%3£0;`¸ÏĈ !ŽBÜħ¸£0Ş'dÁùH0îRxĵßÍ9âq—ĉ Áœ“NĈl4ġƒc\94bc,œ‡Œğ˜€)VĜ0g<îä<„Ÿ4ŠeÑşÈ˜•Œ™kƒö–KĈœH'ܜ9ë׌9L4@qœ3ĈpŝhÊŒĥhÌÂ"µ.Òéë‹Ċú8o4e”Êbv‘`G°¸Çc3y.mt—|:†ŻR8T‚€…Š) İÀ‰ ä3$!ùX0ê7 ûš–óÀ‘95.’š*H3 ûš ğu.’š:ĵÔ`°çP-*¨ç <ÇPÚ%ÀNŻCé)x0T!Žà°ÙıÈ—gŜ0†6ˆPRÚĞ‹£f|-`ÁBŞàĞÌçgĝˆQĜÓ]äáÓEÀ7¸n˙é! $Pgİ;}úŠ`ż‚ìë9Ë(’pd(Uä€ÌsQàċà^ X1š—k0à“U˜? ƒÏB%‘gc`×0ŠLq\8Tï"ï”k0°Iħ֒k*U 6%Û§f ˜_ê ²,›{¸EšÍ)¨úш6ŞILŭc, £“>_Œ²B†˘eC>Š•3äZÔ`‚ÔğÈ@ĤNOŠ€íœ‡/żÛòvÂ4ˆO=´ĦŭÇÁÁÀöÜ, J€µ.dÒG ád€É‘‹4¤3“ĈE‚fÔäÔĝäş)PoM‚ôĝşĦñ)!ħn|hŬÔÔşqÁ³rÁÁÀ>$’³s‘~A|ŝ˘—.rċJĤžû"ÓìèĈżŬ™²ÀNW-¸WÏ5ïh\dµ‚$Ér\ALkN)éd“:ĈRBÇXŽwìp½ +À7:7˘BgèpÔÑzxÎrlV.²żŞ$ÇQ°ŠÎ9"ÀJġö|RϘ1r XħŜ–C€ê32 °D¸z-$"–éíµ€mYırċ­d-`äàà Q XLk‹cT X:Ö!BĠöЏĈxp—î"úí °Ĝ< ԑ·†uÀìVĞCX~×ß>xÇÍ_übZ XjOùĤg ,=ˆŒÖ”0hÌĵéµ&Ġ€%èBgH—G´|D1aßEŜW– pàx63èwÒ 0&um„+@w ĈÜñöï¸Ñûwŝ—&À’Nòâoûᇔ3Ħ– ٘€FßtPjÀ3$LVJ’d‰âûŻî{K‘K5`ŝ2üBѕ ¸Ù… Ĝ506]PĥċàÑ{îLä9.ùwKh°ˆïâçżŭŬŸż)€EecP,ꍑ@gĤ´ğH?EÉ,ij0/Œ÷2LÀa6{À8:£ìŽ˙÷âFŒ|ï·W6Żżŝ [FŒ€ĈwĦў–Ĉ’ht¤Ĥ,WŞ·eUé"+ZЉâ< KƒéÈĵ °ŒX ·™M`sŒËʀĥlıçè7z<9mIÛ/~ĝ!àëĊßu)€İŒ `ĥĵdtO˜'SgŞ’*%Ÿ†–P‰ĵóXÈS†eJ|R˜§,Ök4Ñ·+UŻ”tÚ`KïyûíŜ³g׍4çqhËjyñï:U€ÉF5`ïÉF-`a†Żâ ĵR֌‡/Y­tĤׂ °‚‡é4ÁóЧ ŽÀÓVZĴÍ>cÍ •A~ ÚFÀHĜ:ôj£Ü¸£Ì¨]d/Ÿ„ßĝŬɓżî_Ȁ•ŻQk¤"µÁ’ `Ì­w<ÀöĊXŜ‹;´ |8=@͋˙,„T°œÊ˜•c ÑĝĤh”k0<á>ŻdŬ6ŜʃMĴÁ*Ŭ¤ĊëÉdI>,Yĵ0JÒŞ/ÏRÚXÖfŽQŽŝ¨°JŽvÑ™v—˙òáĝß½öċż?o6À¸œŞ£5ğ‹$çġş]gNnäGñŝâ~ƒwŭaU#_2BJ#ŸŒÁ`M#ż„ÁÇú°² Pä5ɀ °%ĵŽJkĞĥ0.e3›Ím  ĈtB˜Ğœ˙Ë{?zË˙£›`Ğjäg–ŝٍ1ÎÇûû܇ Á&ŝğ¤ŭĊeÀw°ĈËádŒIF °*žñ2°"¨Á2™t `&¤Xŭ€qYK_XŬ+UŞŭñ˘3Ğu‘2Ïŝċí ŝZ´€‰šf°˘ĉ mŒĠtS0˙[Œ‹:ìKżyÀäPzò]Îà?ö?˙Bp(ôäğ1ĦmÀ˜Tĉá µŻ¸NïI$Üĵ'Ĵ,ëODü-`ĵ;ášÀ¸lTĠÈGbƒx4U×`)XùÛï}?Î/À²l1›‡›2Ş9'4·ÇŞ Ó>‹Lzq³6àġŞGE)żßŸâŝǗ|xByT”Ĉ¤bed#, ŝKl†gĴŻŸ J‘#ɧ8> Sy˜ĉI9ŠÌ€…ˆÂĦŝWĦĴ˘îhM9Keà˙òŜ“‹0„uh“Żw Â—ó<ˆĵ@h• W*o%Ĵ%:hMAÀHkİ-5X4=$ÀñÁbÚêtë=ìfœ_òÁž 0q)uĈ%Ġğs˜ëĤ¨x*Eğ”ĥBÑéÁÈBğRi VÚU5ĴÌi+ž„í/@Ĝż- ÀÄşŠáäëe#^pƒx ?ċá{˘ m+ƒ-He=ĵ§-€İ‘Ŭá$\ĤÓ°YüjÀœòŞŠ/ùCD€ù{%£“µ£)cm?XfŜêİ҃ôĵöVž+KâĤ­Á~÷Úß˙ÇoÎ˙ú/ßXè€UbY>êñxĝ<#­^Ş2¸H+%À˙á•ñ°‰€q>O-.’V·Áˆî~/î´œV³Ş,‡›ÒĠĴëK^§XƒÉĊy÷—ĵÔMxXcì´GEœ<êÖp¸NÊÁŭĉüù_Cù·?\Ĝ€UÑ£WŽg2™ _*JÏba·dĈ˓áÁŠ XUŒç2îĥÔ`iFŬ#ğûíŻŬÒMŞËSƒÑŒâ%-°~•CìÏ Œ˘¨´Ĉ(ŽĤ¨v†„Ġ£>ÉĤ€ġô÷÷ŭĦ ĉĊé"Ŭ‰AŒ×-ÖMxx/•pW‚ ÓméĤHċ5|żÍîpĝjúh‡ŝï f:e°Ç_î™Ĝw~á…n¤Ĵ*À*q )r _§V•ĥĞ2àPšôÑA€)ġ éWwŭ£À΃s~ĝ^SS!çí4À’ZĜ´'ÍREސÈeÓ,E1|nÙtžŞÎ 0yÒGGv Ú4€œ ÀZ,Ğë19ĞˉQXżİÛêÂû™.ßċħuû́ıv´f`ßùN=`ß{Òl6€q<ìžŞV´“µ2EÀ°Ĝg1J̔·÷-6X…ˇP‘”Ĝ7Ŝy睧ŸİìáÛOĉOı€1pfh0‹ûŜ³Pĥ a£t ßû ” h˙­ĞX†FçI›Í–-&hQ80°a>ĞĴŸ+`ùd'ĉ3{â!³CìÂ-ïpÜîğÎh{í^(Żu.`¸Ù÷›ŬŞì[êÊŞ\$ ËŒÀ€‹¤ĉ ˜<飳\¤Çl6ğ°Ww€í>S"ıW/t²‹dqp xN˜ıĞ+Qd‹,}ŒêöòeO_żĞHšè"ƒ=™ıĥÁĜNŒġö9İ öŞĴ^¨mƒqOéè6Xïs3œ0<ÚŬ€Á’­‹"KTTbÚë°ġÍúÔMúè´F_iäżó'ï­kä?}à;Żvv#߯mäÀJdïĈŽèhU/ÒÀ'=@ĵ6‡ÓÊĥ°”8飣£HîÛAk+ƒ÷घw‘Á{Ŭäˆ"`• ħİó2@°çjƒeĉ˜4飣;y;t)Ö‘ûè yd w:`byÛ#>…k£Èhżíš6Ÿ=ù\GvSÔvÔ_ “>ÌĤ¸HĜ1öêw€Â;LÂCċ ŽMqĠ“'}t`òÄ Î·ßŝŬï>ü]ŽK›)ıp^½ċŽğë– \Ĉï@ÀJ5׀$ċÀŬ´úŒK3"`ñRgLÌÈà>efŞÍΟ„r–R8gŜ9Ĉqï‡Î-½ IDATĵó>¸U#żC!İUm–eñÂl6³Âê&}ä"ıYc;ĉòĈÄÂĴ Ÿ `œ1˘ġ:ÑÚ0kĴTĴ–"ٟî·`=éÙ&OúÈ_ÍÑxú³ şçÀĊcdŭäxÚµf‚kËù˙ħü<Ĥ7†5Îñċe™#`]ĤL—LJóĥ ÖeËÌÓ{ğÇÜ%Í7͎uÍÖßj`÷%ëm)ŻÎYġ.R×háĥxċA´>b:ÀÒĴ=aèI7ïġ˜`‘6¸ÈvOÈkŝ³D°ĜÊ·Ĝ=ÉzċĠùekYçÛV½]è€ùäa´İi+5²ĜèŞvy<ĉŒV‚jĊ̌óÉŸ°iZġĤpwÔg˘p“6hÇË``°l€ybχ‚l(•W!È5˜,ëÀçX ĉi_GĞĜb,o3›=sŒµ!‰€€éĉ·¸ŬrÎ.²Š À•‹$ÑffÖÑQ¤˜˜.`RG˜Ĝ|F„Dñ7ĴÊW…­¸“´VˆŝŠ˜˜ZĵnI\Mk¸tĊ“Ióĥ~–*ş°„˜˜Ĥ“ŸÚf›&>è.j=fŜêĈûĴßßKÙúƒk˘``­5ò…á_)—ËĠJQ)`×eʧK˜³„y `%ôr€Ċ-ó!]75§G÷[aĞŝŻ…oB˙Ôî=zû—ĵ:GFĴ–ú##V#İ–iÓ,@×,Àó>Ì^À<|;›Ÿá:7=óR3yò_ÏéÉóçôċùo\€'\ğëƒzû×÷÷]ìÔXÎÂŭ>´ż_ğ?À/lñϰ›˘‹ô0¸ş#ĈÄ;ÔEŜôÒı&rŞUÀ>~üpÂâŝIi˙Ö?yUûÇë,O^Ĝ\BéKOž•÷ğUéËRúzĴ D‘µKxúúŬÀEâŭœê*Üġ˙ñ×á+Фŭgp˙ÏŜú´˙ĝµċO!7÷íCûKÊŝ~°?€öĵ´˙í÷]'€é/ ÖeÍ`ġŝì|Pc_ĠúGè ëü£à ïŻó’×K V7d-şžĞġ`żûƒzoĞ÷›ğE˙¨ñ’´SĜ_·€qY ÂÔ4š[X€şġ†%K–ܰä”`{n²¤°S§€ñ†öÈvµĵ"{À·îŞñ`áWŠü ùÄOĦ7Ĵġ˘7ÔúǏŻcÀĉóQ)v'%bpk,Y‚!àÛT¤÷I%I%Ŭ°•X×s{°:€íÁnXşôì °£·b]K.Á°–˘ÈûfEŞĵáuE^UÀzœÂ)9z92Ĝ°0`É.èÎn%Ŭ°=[ö ÌôÛuAu–Ĝl „›·(òBM)îwŸ5›Àò– ٍy=ƒ„9Ŝ^˜í·àœ“° €-Ÿ´ôÀò6K_*֍y|X7‘í³Xó^ aÎp Ózm°Sú€;*Uqyg×QèZħQä7fE^ޏ"ïżlD‘s,Ŭ Ŭ0ŸV_h aöasgÉ^‡6żƒsö(€şKĜ` 7› ëßryAş°ƒ NÂîlÈß³´ĥ)SĠ`í‰"ëĵĦEÎJĴŞ493éq›dÀ²°œŻÏá$À8ŻÛ¤ s›ÀLî.š’ÌşAş°S+ï.7rÓîç›É“˙zJOž?/ÏŝÁ×?"íŻû·.ÈéϤŭPúcÍ~Ú ÷ßö—>˙üÚŬ/†g‘ äĞcëħϋ„šÎùxéù}Żì{ò Úŭî:KSûŭj-żr`Ü iy˙xìwk-„ôÂŒÉ;j4Eµ4òÇçšÊ/Ŝá?xĥĴŭh˙¤œÖĝÄÇŸßg‘‹+ŠÌçġawNŭoRĠCA&flzÀêûHù÷Ġ?[TٛF‘—ÔQ¤Ĥ—ġ²ò,òúˆ"ç>š"gxž§$Šs<ËQȘĊUĈpĴDóp‹s%·§’àÒy3?ż˙e"h/¤ĞŞHP°ëD‘÷5"›öİ#ZŭHÒò1œ/'EFƒ!o%d úhÎrŠ€ÀXÇœ›/äÍ;œĴ7ˆñfoûN½ûzŝÚÛEžĠ"Ġ½Ĵ—ݳ­^³¤ĝB)ëá+bUÄKĥR(T Ċhœ‰€Ù‹|*6XbĞa’q•2nŜÂ]yJ Ĝ‘oèyzŝQmŻ{yI…g‘Ÿj{Yg‘÷×?‹Ĵñüċݧ­iZ_ĜÚч½[xĜ £Àx^Œ³‡*°^ğ=˘ŽxµÛsŽËÙ˘u‘WÔŝñ~Ñ3úGÙK}yßĝş‘9ʳÈxCcDĞÀ’ Œ]¤½ǃ‰€ıÀÁEK˜w`n@êĉ‰ˆ“:`V=`oÀÚÓ½K/Šĵ Ŝ7‹"ïĞ›ßaD‘ 0²Ç큍0ĵOžU”´[}Š‹ìu{z­òĴ˘XŻÛäċb½x2`òxLîBœUèéşFŝ.)–Ô‹"?¨‰"?žQyĦĊ(òì´Qäe#Šœ/ÀRY.•ÌÁ}6›b’œ´%³(KĜ’L*™d“ PMĉ9hç %™â²)NN×v'ÖµċÔ]Gϵ/Šĵ4Mİö—g:˘Ġˆ"ë£È*˕˜ı6ß­+—B9Şó,òBkQdí~ş(òŝë0ŠLK/˙Ž´0[‰f³žNìê>‹üNkQdM_ëB,‘$ŸÒî ï"Ĵ‘²ö€D_`€Í%ŠĵÔ0ŠüTE^n)Šĵ´H˘ÈxZ’DjŠX‚ï!x+,5+ 0E^˜MyßL˘È{ĊEĥX²Ŝ ZBGŒĈâ ÍE^ó(yˋ.Šlİ+ëK’‹yKEĴìĤqnÁÖrY×§ZE~Ú ŠÔ_kîòâŒ"Ûâ"á(p‘Ŝ˜WÌÖ_Ò Ö`f2:âúES9|ä… gż~îïRöûŝBŬŭÈ[ġö[^Ñ9rŸÎoBcŭ‘`èWH@T6Tċš-„B ›-`ĤĵˆçߛÊ?½¤k~şÁá ì/yçÉïöğáŝW_WÒò~_ìöí?rŸ˜$ÖıŸŒè"‹ó!ÓıÈ'Ŝê›ëG‘—š>‹”Ÿ<¨óFİoûzòŻEĴ]€Ġ­ù÷Qd ÀÀĉE^ş£H°éЏ"ï›>ŠĵĴZknэh½.Û³k×Ñ]@ŽÖ&fíİi8dԆ~e—rüáêß)<‹ĵVÏ"‹T­X~YµJ@4˘Hé! 'ĊĈŞĵ­Är!HÂÀ|çKħX…í'ܞʌëqrd4šÏXş eE݊F\,’ƒ°ŞYEPÍZğ¨DO&\’ £,8ŒJġm°]˜ú=2jÀNis”ĥĤĵ…ĦĈG?Š”<ŬĴ£È(R’d çMŜPġä{@"BJ€yCĦm8\­îġ÷áİ.ŽÉwÚ­ Ç1VğÇD™q/ĜÂáżK,Ġtë6'q³ż7äÂàĴ"SŻıĞEÀΰFQ¤zĊıFkÍ-y‘-Öhé€pŒĝ~NyĜM™‰Ş˜X´˘·0-–›<é#&Ì*êêMPŒ4dàÌ*bÊĴ˘AÎ*²Á1&̓ÒìhCÀn˜`wĠĝÇi£ÈÚ˵ŝñ:‹"ӌ°ĵßMkFSö XŻŬîi0ŞÇÖS;Јóc–ĴX˘×ÖĞ™Ud³9dÀzl6ŸK¨¸„µ€ŬİÁ˘0l.5XŭüŽÙE‘Q¤ÚEÂuL10àİ /Ô2`ÒĴ"Ê$FıÒ.ʧ7Ğ(犣YE–éH—ó† `,ÈÒìÔ­Í\¤.H[f˜EÎ`EÜ \dÈÊÎr8A›zK@cû§oĠF‘uÏ"ë֚ÓÑŞŠ"?5ÖhE ıP¸H½DÀ¨P̲ë"£ò²—< ­£ö3"\¤Q$,ĥıĴpH‘€(:\ċİ / GÂèœb$¨ O…S˜bŞ;¸r%|½kċ–ÚĠujü#ĜÏdu•7ÜŬâˆÖşË/Ġ­d x½ñ9/ĦY󰛵B)ÏŞŒa(Xn%ÏpLüĞ:^N7ìÔ­X×.4b—ĥ‘ŻġĴ˘sİáê:5ŝ‘ż\?˘µ~dŽzDĞĈ?.Ž5Z³³Ù•›3`öġä÷8(½œßĠ0Ġ¤$âˆÖé\äJĴ{šĵĥeöQäŭġŝQˆ"/ÔúoÌ Š|pG‘À!elÎN[Ĉœ]eê ‡RL§ĉ5§-ıÁŽÉtTènœì%MT/Ĝpp€­_ÌÓԜ½+K÷0)“Û…ġvußô#Dkϒ£uQä6D‘—d/yıiyıÁˆÖOTï(r~j0"Ò_3éƒħġ(N“Ï‘‹zÒGWÄŞÌ*êôĜ\˜ŻÁĞd¤şĞĈEĥEŜ_7żCŒ"[|ùà""ó˘t`ĦŜ@_ŬĴ˘X—‰’ ÷ú5€!0s @*³ŠfĜ)Ï|WŞÓìÏ ŭ'uûöO ġöÂ'ZËûp˙ŝûf˙~îŠ [ròÓà,=·’9.‚6à…(Š ÌiDrIŜΒ\ÉĠt°jĊĊ( ÏĴK‚1׈K€„´t€9ÁyoĜÓÏÛñ°7ïpWfà" YŒ›°h |A³t€ĝ°ÛYBO‹8 oÏòŽiĤß €•ó†,F!§ĴñҁÚÊÒÂän4Ĥbf€Ŭ†,FħÍÁEÂzµK4€Eúg ˜9h3dшµ_‘\–(HKD´É¤^:lI+iá]ĊiÖÉ÷˜6àk*ŝ _£‚>C:Q´ÜKĥ÷aw‘„"8Êä WÑ‹ó9ĤTŽ6=ïÒèÙ²Q– X´îáx„TğGSUK„qœl°¨`‹°¨ŸÄœË7‡aŞ­(Ñ—g§Œslœû|yEšË¤C1>Z$}Tž,\Ü#ı|À.½!7È2ĥÎy £bù ċËR>€YĵH|<„6ÈW† s<ŒËB,éh[âĈW,™„QޝXÊâ: °$EĊ|`6 %` ѕ§`³ laaóeKÈEUÌĤBí8ÀÒĵ³ÚWy&\VK† `&J%ŭZÀüál5c”j§fc2Ž6–ĉĉşt€ X)5Ċ!`Ù` šƒ\6˜A€ù¨J‰°QÀQJ€‘ħĜÒaQ¤‡\İöf+Ñù9. –àùL1 Ù |Ž Ck˜Ëñ`" É*KdÉçt†t`,zNQdÙ*ñe逴“睳,:Qŭá°?†@;+î „B_*ÓÀ?‚cĊ,Œ„3à áWÂFĦvœ‹œóˆÖşĴsx²I{†4p”EV.’â9ÈZ(_BbQ XŒ”$ÜĈĴÒpYfÎ B&’Éd6 tĊĴ",O—èd &*He¤œ4‘­—Œ1šìTIëœnŠ *Ö ƒLÏĜ˜Ò3Rmğ*ĤHvĥu*e– –’X"`/Í0ĝJeŽ+)– zŻW†OJċz;—Ô3&ôŒñŽ4U*ĠŸ.›zw"‹ĴŞ“AéüJ1Qœİ1™›·ë›‹¤„Hié.ïĊ+³Œc.–Ïë'P²âÀ5Tâëħ˘enRϘ@FZcD€ċ²"´0ŸëLMĦä`p1TT2U›vFT€ġ;²ġ,Yfd„€YíمXçErİ\AĜo˙fJĝ4+–sÇŻ|°yŭç˙ìf$ÀXwL6Ò`ÀXÒ;0>òjÀĵBɽĝ Y˜Ġċ„Hĝ‚àˆ%`„÷…Òj°A—Ŝ—„ht_€q‰ĵ0÷ĵŭÀŒ#ğHÚŝŜoaµôú‹ï:2`ŒM6:Ó`*£+5 `ÁúÇ\Uġƒ‰,šÌââù¤59€Eĵt;xžQğȌ§,NŒùԀ ¸[Á€0G˘_` (Ħ˙ŝ·HÌÈ8 Bcĝ˙ĝż‘üħX4hĈȝG‘üñuX“]䒛·üà=7ßzc–£HU#Ÿv\ĵû//ŝà]—˜]1*€)F·0ş(ÌßäÈBŠŻ’  mÂT‚jŠ.r@šLÁ#’).ŝY`ĝÉ üÀĴz’–EġŠ XNeBA²S×`ĵü;xvĠÎS}jÀ˘)Ÿ3ËĊİ\0`˙ġB˙ŭGHú$£˙ç˙ƒäÀ"È'ş_€ċ³Jìïn>ĝ¸çÎ;YÊi¨³½'PóâÏí `ƒÀĝúëȨ6 ZÀÒ^>†‹dGpˆD<ùAa™âJŻÏñħŒ/¤*ƒĵĊĞħ¤Ÿé>Hññ`û£< 5€ċ¨„ƒĠ¸È4^ŝîk<˙ğó˙ŭù~µ‹ 3WX€ˆxL `‚ħ° Œô‚Ì]ğtĦĴàV˜I –Ħ•FŝßŬ|ÏüÎĤœ^&6òƒaàô^üÁ~ŝ“€ÒÈ…ë?ñ+üpñŒĵÖE2Ĥ(ɒglĵ\=ï?kÑÊy2ċ£•²ûµĈ„l Ú%£ÀKBÀ|6xÂÁÀpiġ€ç0.(Dr"`f·;ĉĥùñY_ùÑí÷žüÀÜA§-SÓ,9Ó\`X XÈ5˜ê„6XȚĴ|Ñ.†bÒô[4ñ6cœ%KÁQhò¨(ŒË°\Ôd6ÛLĤ^·Ò“Ÿ [­Ħ7˙ÜíG}­BO~6ŒÁԟğüVîÉWŒB_ИČö4ÉÇĴ1Ÿ³Zĵ_İâäíĵ?[Xñí€s<ĊËI…ĝ¸5ˆ‹ŽöF‘Œ*Š,ĉrıB1—/pyµ‹L9ËĠŝ“/÷üy-`NPFĊ?‹Ĝċċ aù÷H„(Ò*µQä€i;!ŠœùÒZzĜFÏ׆ÒMè´XF|†˜µ¸l¸öY¤Ĝ8àôzY °˜ïKĈ„êHhôäêş)Şuĝe IDAT)è"Ċ4Y˘ÓVäP†Ĵĥ9ŠœYGkÊY|˙їżûżŝM Xß êżħ âŒqÑèëƒ$ÊF§Ñ*)ĊĜq.’Ö.p’ĴÌ0NĠÈY„.0wXjÀÂÒԔĊíġˆ€…M5F5`’ħ°€ÛMIésP†ÒaĉÎ`Ÿ”Şċа•µ€ŭî…?ùġüĉG_~C Ĝ`ĤÓ0­Ó“?ÖéÉHuxO~wxKĜš–0§+ħ9ÀG£6_ıħ: |_Èí,zĴRÎ <Žğ8ÍòM`9‡ÉMÓá>>GĞ£íqé>$û]>ŬÏ)F?Ž£iZ:2…Œµ­ċ\Ëïƒä*óĜûœ°Ŝ­‹äΟ˙Íùó˙ë˙ÒÖ`NFçħ̌ ]cÇ?ì.ú³ rBÍ,™W·Á\Ŭ&“=„š\ގVĈŜ;Pĵ¤-(şH‹Ê!Bc˘Ä‚jß§2:íQQ0.úŒ:£ÀúŸ÷GbGSxӁ–ˆVù\: ŞZ:€‰V˜(̉Ö'}t`Ħ8—ħğ%À`íġê5m°Ûoĝá{żÛı€ù\ÊĉCñ65K×8Šägü°;í/ó1+·^îÌ'}t`´Ċb菉€=}˃²[ÎjcNBa:°”Ċj³Z*ù-µ7ìT‰Äß ŬÈ2“Iċ"3v³5&µÁNċd]#÷ĞŬKšA%ĤÌi_€µïQ‘2é£ù)[\nä÷ğ/ĵÂíu€]xüÁÎnä'l N Î:Ż7ÀäIE2JÉäıî½—òt–Uğë̙ğ1“ë(’áj+sÎğŻ/ÀäIŬMqòĊQ]ĉSğċé§Aë?!;ı›BˆżġßĵžŜÔáQdğèĜ½÷ž‡EċÀ̰ŬÏ<óÌî#\Ή™2˜ĝDû)…ÏyùîJµ"lrŽKHÒo?`\–C€}tïí'ÏżöÇŬ^ı öŝ-g8îùû?FOÇw´ŠB8mQf ùûĞXşÈ›œ3Xá“Íûm\‚O€É“>:°¤<1ƒD°½ö0ĜmïU çÈ]O‚fĜ]gecG†'”kPÁJıÓŝk˜¸"š0*ġÑAÎÊÛ¨§ÒĈLšôÁÉSÏÌhm¸Ù!×@ŞŻ!Ħ>]"ĵ†€ 9„Ĉ ċġ+Ċ<ç2Ñĥ-ÇÛÊít‘b ĈuäČÖvĉ5Ô§Ë2ık˜8x;ÁébJĥ]Ĵ0¸³OĴÜ>À4“>:St§˘4œŸb\l]d€âó˜ÎÌI&ċĝÉ×ì Ĥ2ˆ_gš‰[­Tf%ÊĵK™™İäênSĥ˘Th“Í+QdE™ïĴqkϘ3QşÚç" jĦ=‚„£EŭŒ‚R(´žU(à™Â4bİĤk0WiOÌ£à‰VóÉó9SÄtQdNEÎk?˜jrİФĉáhĦQ5\i\CWšÜ |ÚYfMż.е2g?҆Ÿ˜Gq·˜|-òĈ[000°– Ĉ À Àĉ0żÙL€€Í`!³¤33›Àw6ëfÛ X‚OV À Àf×Èg iakLŠ•ŸËo ÀoÀJ•R 6eüD wyG$ž T*+H€€I€qiQș–×`Vj0qé›7ϓ<šÙmf†$ä—ÄfĥN~şÀş\Ÿ”žVIKÀY·|Âe73“%&U`éDŠ›ÙÒĊJ…eÙ"Ż,ôW‚K€16nf6+ÀĝF.’ †uò^"ìċĉ£Y‹Ëg„uĊë7w4<‹Ĵp…§‘Ĥ_oá˜ù˙‰y<3πéD‘‰8 ŒOTŽg˘q&OñÉÊì İĊk‰ÊҍaYÙğWN1 ëW{UI€œ¨nV´äEĠ²˙ÇĠ†ĉnÙ£ ġıöfÇÔüÁÁ¨ŝƒ79ĴÙO´(At˜}żŬ˙I+‚â­CH’Wİ£UÉçXVé^;{VNVËV½ŭċ€’,‚ġ‹UY×´ïüĠǵˆ†j^Hr@sĥBnħÙ15’G__d›ŭ<[Z³ÚXJ5·i™`h.ÑUìÉop° °™—ρıŬı™”|è8Àw²€€€€€€€-JÀzµ¸öїdÙ}äÈ,²ŽÙ÷ʑid÷‘éeߑ9Ëî#,û"`ĠJYĜä F\Ì]Š&fXŸv2_ ˙T_Ŝy§AĈ§>ŭtYŸ~zäÉżžFžütz9éœ ?1rä*Vd2Â&÷d=|‘ ŞL_ĉW"Îó &żP\änĴıü铆‹ĵş.Ršd¤ÌC~Ĥ/ìÀY/&y“×ÌĴeÀćE>ŸÏs|AYòyĝ¨(§]y ç-EŜÌĴEÀ8aE–áŬ.—W^ßïryÀÌ.9³ċgX™`ġc ²Qù䉢~V† 4ߪlé­·vŬ ä†&€%ÀOt t€)ĥ!ˆìĠ,–ĉcÙ2Ú/$Àĝ&.y€EXT°˘ëiP>e+fë֋a]ÛsîĜÎlXĴĉk†u“|ü”™žÀ˘]&W/aĊ0‹Btc–µ,ÜÂx0"ŠBYPG‘)Ğ•[´żħ:‹ĵ£m€{0§XĦüşċeÓ-:ĥ· s7l×ÑsçN=ÚĠĜEÒfĝ2 ŻÌœüœ‡Żx1Ì}žE‚ûĠ•á‹ŭÖSàénĴ˙ZĉŸáҍj°L1“RG‘óÚÑêĈÜe]I6ŞÁpȅ£Qё]}L6ĜRP…Í  †aÉè@ÀTĉı.²Ġĝ†ġB÷ĴıGW°ĈäëKÈ·KĤ c[,u[²aÑġÍ0Oˀ…şIÛU,l6#ÀâX7×`<ƒuċ]ŸoĜİib½ñî–+ä#]W°L) 1ÖumËÏ|ÒGÔ`]$oîM6.şLoÀĥœ;·¤9`´ Y=­şHž1_À"è­°E Œµ^ÀĉÖÈïxÀ-_u€ġ&šÖÜELi­àĠ‰"ù^uL\KÀĉÖMqu+öbŬ=ÀŞ!Ĵ[wDkÙI4+:?†u1ğÖĠ °¤dv´@‡ ë"ákÔ.óEöbA}qA,\$†€5̅ ñP`ÑFĦbĴoRtÜ ĝ^ĥ`ç€Ü9M ĉrıÀoZ ‘7÷`Ĝ@ec-l}ğÑ]+ƒÉiÖ°4A1=À`wuJŻ|òL³˘`˙vħa VӍŻÓ#„i‰ĝ7³I˘é{ÚüSe镵÷hQ–†=ílƒiÄxy¤s ­<'23ÓŒn°ŝu)ïrġ€€Í0Á”KŜÇí,$Àžü½ĉbÖY.ÒCxĤeÀLÍÌîÀ#gġċȑg÷=;‹Ĵ³g_yrZ9;½ì;;giOÌ£ĵÒ1€ ˘0 ÀD"`úGÓÈ_˙Ñôò×`ŜMĦyŻDö*şÈߟĤ †ŭ6½ü•á"j?˜˜˜˜ĜÂĴÀ²%}ÀÊlµAùpÚulj–ÇÉ7Ĵ§§~şšÖ sÁa-6ƒ· ·°bĠl&€ı°cò+n,¤_>PúLƒ˘‹5İµ€;wnKíH-`7=·ëVpÌÒV+ú\•Ğ X9j ¤ Àĉ­?³ĉ4ŒÄšéš0$-ĉ™ÁÛÚ XÔNÊäÄ Àf2\G0şë.ê–O‘n2˘5Z;Ğè÷k†LïšĈEvşzZs‘3zĥÑFÀ¸^É/BÀŠÑh€ñk2˘µ¨ÚjŠ.> `§ĤmäÀZkäÓĉŜÌU,"–{qöäû2`çVĥ°fşş.RŞÀ0váÖèYdĠÚîÑM#ĉĞ̰=ó˜ıx5ó`Ž|?š8PY¸€5MQš€5Á6òçĜÒZÀ~˙ĥik>Ŭ£Ŭ€ı0§è%p Öżä<ĤšŝŜÀ4½­ĥ§°/üğ9`ŒY˜îá&Ż `i Í}r—!`íÑ ĤOëVĦ[>^âġĝô‹Ô]3÷B Ĝ­çΝZ9=`ğ4€ĝkwó(²èêîíí·Ż `eÖm5ëì"~°é‹ş\.`EÑ-äà Šò\‰†€í²´9`+Á!żÖKOOGŝ*}µ\dÔŝ]¨ÑÑ:İ‘N|ù…—Ž=óÌܟËÏ" ÀöòħŸ}óÈç`W°JJŝ:ìû?ûÙÏùÖç`óX1%vömĜËß~ïŻĤÉ˙·_ŝÙË/˙k\1–1ïXÀzŬZé¨1üisùÚ·ż˙2ìÛcĵˆĦ“]dI-tG½JfZùíïCùĉ7Ï.rŝ˧â Ğ ÖÀùÚ7?3›wÀJÉÈġŞÁaO^1k`úğé8ÁE;À\ öò·żöµ§‹`mL¸´°Bş‡Ô,éékX>kƒg‘îŝS“;WñôzšvÁ£‚lQöò˰'ì›Oœ}g²µ§ÇĈó9sOŝ+ı{\lOO_Ïôôô¸J °†.²Ŭ€]˜ê.iÇä7MQ‰8mĈï\³OSƒ-…còwíÚîÉùgÏ?˙³}/ħe>ŸŞ—¨É4ŝñšLxމ<ŞÑfûŝ„´ Ĵn· ³Dq·[sï `Tğ]d´Á2ĉĵ!`8ĉ,6Ĵ²5‹Ğï\u L"—ԁĝ…—żŭͧŸ~ŝÂ_˙'¸³dş-É̖„t·ÜL7zğ¸w.££uÀòhÍQ6Xñ`SÑĜù„ğVÁşLéÚ`µ Qák/?~ĉù ßİÂǙĥg…˜5`aÍL“´Z~ĈlZÀZъcŭLcÀ2Mj°˜‘_ ĜMÁ°˙éϏyù™3m,:k.\5€ħ`m,ÓÓdÒGSIa}lˀaXöWüÇÏüì›ŻBÀââ¸/?h8†‡Êĉabö€Í0 r aM&}>íHωĊf“˙ÊKß˙ÚÀü Èr<×_¤ùb…E7ŞÚ˙Ċ20‚4 ÒÁxĞöÏħžq_ÙKà܏r´m.r‘6w0-`úQdĊŬ°‘ïÑ2~ Ĥš4ò1ŒâĞQş9`[–êvċo˙µ—b°‚ύgB=ħÁJw{!Taw°Ä=QOŒO¸aZŒñ¸½y§ÙŬC{ vƒŞŒgXŞÛ‰ö°ˆĜì_†Ċ5\:NúPÏì–5a=T;ÇÙ°§Ì4éĤĜuîÜı£KuĤ­½ô7w=O@À@Ġ•ñòVĉİà³òÉj“ħqV>Uċm%°PœĊh`/‚- _È ĉgï"S&Ĵ7…\€SeL‹-ŠœÀL&‡`“É„7 ˆe%Áעï\)o2%ŠM\äJÔÍşR°Ÿ>ü Ğ„Ĵ}"`K[c|Bïmċ­]*ÀÌÖŝ„˜Ċj.…Ħƒf9´ÁbàòÀxÁ?şw–Ċ…ĥ6Ĥ‘N|T$Oĵ­+¨ –öÊ5˜ĊÛÊ"`ĥRM Ĉä,Q™;`ó%­FD% S?/rá˙ë"ésâ>ş‡cI>â UEÀRNgȇó£6˜ÓËÑĤl/‘r9ƒ°Dfĉ—k°ÑñK,4ÀJÄÊTäA@]TJ|…ƒ‰j‰/B÷])Ši ı_ċÀÁ.²<`ò’ğÔl£súRîğĈ­Ĝü½ñÖÊû À À¸ÚÚXĈwĥXU#ĥôeßv80‹Ĵfż(ŭ™éEúO¤ÒİvHĝѝ%ûZÌÛ?0`!:çŬUMKŽé¨l!CGg-›4Z~Á×`n³9ĵ ^ ż ›ƒ,Ĥ­0p``ó×Èg90°…Eĥ°bD°˘Á5(O¨YÑyƒïíp8âӔ½öŒvK%B’zĈ„Ž‘Ó5ĈÛÛä(ážI’É$‹!“)Ö˜K‚¸ò:Iga†„?CĊÉ,Ò¨ü‚mˆµ°bn³Œîëg´€mıóÎ;˙"^ ċt:µ€%€1V ˜Öc=~RÚ2‚‘ ĉ$A•2`éd&“NS„×`lœŠÇÈ Ù`1ĝ+ɘg ÀÚÑj3™ìjÀ~rÇß>xÇÍ7ß̨cln’"ñAZ cwi Ċ8@+€ċùÁ{LŽÛŝYtđ;‰ù”€ĵà“ˢG Ġb0c¨R\Êz¨ZÀ(*ÓljÀ’ÂŭIŜœĜÜ+À˙Î `Ìo½çĈżÀñoÍ(€eœÑ‹żŭí‡Ĉœi°Œ+"S `YÑw¤” ˙ıXJ?DĴÁ"Éıĵ‘,î/Ëw‘Q&>!¸`\,'y’Qްlä_£İXÊ÷˙úH$_ŸÍfü´ĜœËg jÀĥ,BĦO·[ï `IpĜöŝè˙ĝ˙èÜt:ì g€Ċ½ĝĉk„ÒÏŝÁĵ˜H~ïĝÁ‹‰„ƒÇÏ|b"{î?˙ëo~óġ7ĞÎ'XOó‰ĉ\ÌC(ħßÒÁŻ~xXùÛ`Ŝ˘?ş˜H<<£cŜ›+9˙³żŭ1Àëß~ûO˙ô íû07ĴBğZUë2J?MnĠÙDĈۋĥùƒ˙á˙èżY™e :9ùöoŝÙÏŝò/ż™^9ùġÁٕ“:ĜpòÑD˙üŻ˙ú›Żżŝğo,ïSloŞŞ:ĵÑ`ĜÂoûO?>Ĵü·ßŝjË Šx>ı2‘ħP_VŻMd<û³?üɏŽ€KÀ×÷`o…ö„s-´—è“ú`qÉßüW˙àkâĜšfaˆUl?pÚꛕù³>ìtpŬûÙo΋ ~ps:ˆ~Rk^üËż|óġ×?ûúŻ{ŸÄ {Şßú`UġoˆŒÀV €bÖ³+`i|5ğ2‘ƒŭǟüˆV ġ×?ŭúçß1€^"F) ‘¤ ĥĴĤëO °ĞaŠí½ Ŝ`Ö[ZÄi 51?ŭëŸÚ˙î/ûÑy U^nĝÁ~}Œ­{Ëû—ß ûD˘ŸĈÉOĝPû‰äĝúġQ aÂö[8ŝ‹Ù•‰TT]×Ġ˜ Ŭ 0÷w~ò÷˙“ŭGöóŭÙŻŭĞïÀĜ ĵ‡ĵ²œ4lMJÎói–éí\äşoŞĤĦ÷û³ĈTÑĈ²Ĵuú'ż7î.SE\Q<¸½L]D€Ĥŝh0û‡ŻżFëùwŸHƒ=EĤöo9~ŭ_ €ùżŭ§_˙òA),Ŝ`h"=_˙Ġ܋‰üĠß˙g(?ùPŝêçżúċ/ŝ;ß)€½\&l²í­M$û´,ٜ‡)h=OL÷ú ;|n²{ßë†Ñ `ġjdâ`s^;2o4Ü_&ğƒ>˜Nî ×Ż°]:ü E|ŭñ# íĊĦĴ¤ŭüÊDvĊàëĝZr6‘`ó“żĝŝüçżĝ%ìwż'ËğSMĞŬbÈĤËî”}J€5§Š\É ĥ½qO·›†§Ġ7½ŜlĜH>4ĝÁĞ…‰ÉžWSôçß| Ñċ7Ğîo^ `ÉüëèżĝċÏjüíV¸šâ€3—!÷Ä~ŭËÀÖŝ˙µĊ2¤à?ĝ?W§(òWû›żĝßùĠŻAŭò—ûï Àċ“¨ŻĞ(²éƒÍjÏ&ötV`ÉD³O£ñLŭZƒé0ŭŜÈD€“ÉätfÊž–ìżŝĉ›˙cÜŝ“Ÿm_ `Ώ½ŭĝÇ?úñ_ŭíż:/×ážĜŻQıùï˙ÛˆĜ×ŝÁŝŭyŞèW˙Yh°ßùÇ×`Ÿ`ÛCÖÁĉ_İ]kÜo“y` }ĵXI}s 00ˆÚšlħXĴ^փEÙëuŬ?ùw£aĝħË/]ĥŬüÊÏŝóżŭÛ+€y\\܋‰üßŝƒ9[yÑÊÌ˙ġ?œLäò÷˙âo`ż˙#ĵ Üĉ݇cìŒiÓɏ-½Ûm[ñġz0kß°}q탍TûúàíÚB<Ĝ\px@€­ü½qìzŝGÏ$:Ó3À–?„bŝ—éeÁáŜžŭ˜—]Ld0[˙làOm"“èw˙˙w~÷‡fOÜf˙ŭĜĞ$Ŝ~Ğ+ZS{żÊŠÖëò+Zŭ}ġ`0u³âe™ ÀÊ"Ħ ڑqs(ÛÚ:Ç IDATċÜbˆS“MшÁÔĊó9-Ë<\úsïĊş§=B&µxĥ ![ìÏħ PhŒŸß‰@•ŽK"7M$ËúÚşrŒxx×u’ĝ:€ƒË5_D·Š¤ŒŬĝáúCFĞcr8 (Ğ2ÜĉċÙú]30z>ç:Ż*éo€Â⇇¤`(zĜà#wÏX4_¸Ì(óĵXœw”-j….çó°ÌvĞıw~žAúa†x*˘ċÒ áşÂŸ'tçBJ×/™Ï Š˙%HÛıëċ;¤÷°È–5ߛh“*žŒÇ ½qÛ˘Ġ|<††+wŽiÍ´eQílĠq.Ël˘Ë„ĵhù"q 0fÀâ"sˆfµ‰4cUҕúö~V\ÌÑâvwüŜ‚B²[¨–|lòx6žı­k™‰$#ˆ,ÖÀG[›-ŻKz‡c÷H]ôŬÍ;ï:p´GsW&½vĥšEèa— q€ħ³bH¨Êö]bèDĊ;ù 1f]EaÁ 7SU•íqkY$‡77H{ĵvUBÌżuğ-;‡Zƒ!ÀŞ!AŒ  &C$!ڙD%ġFì¸ħ”áŞM&¨îˆ Żc²Ĵ4ĝ(YFä8áŜÚĤ=Pì°-0^Ú8n>ŬÀP h lí¸ü¸Um&OШ p°µ^”mTeVLëf³ĞH5öpÑüM&ò´$Xž:2ħcg7)gDÎrJZ)}fDŠrvèœàí@ᛷú,nLä `qmĉ+ŞÇ"“ôc„èİ,Xӟf%Úk2Êc|†–@›I5m÷Ò;€Żħ2?ZĽ(bÖ!Îv?‘µ·?/ŭ<†ËÑoW‹GGÚ8âWpŻrŜaé°À¤ˆ:špâ”m˘­N5‡×¸qıS‰AË)ˆİŞen²Î׃Ö Q<Ñ/WUŜEIy]Ġw`}UŜÀX =n“çyĊ„0b…H4û‚UT'ŭqϐäY†‰ÌâeV9’Ó>ÙĵÉDžB%ìڃh ĝ•zŭ2—‰ĵ1á‰òıç–´âW!ĊâL"ŭC`",+h6, ´çĠŜĦ YQ8Ó*<SšÀŬγn–Ĝ1¨MoWq€ġà5_•­%eĥ‰IFĵ'ŽşoœÒ :…’ÚPĴĵ¤5²cS—UŞ4RħĦ Fŝĉ.÷ä]#†[ĞP?ŒTd™ĞFÍ†%í¨ÚH²î‘F°ÔĜ%ġÙT!Z™çJ2/ŞrM¤ ˜Dè£3ŞNĤ`\àVvwĤ¤@Pƒ’Ó˜Ĉ‹4ĉŸÑɇŜċž`‘—Ġq vanÊ|ƒBô¨ĜDóǤCß0·ĥ!Ĝ7+_4‹}Û^˘‚l(Î2ž#ÌÚȃ(óM V*ħ pJȵÙJ@CžĥĤLÑ6€2ô€ G² ĉ*'€µŸxÛKI_ €yUÔÇğr²P°@€çÀmi—yĢ6ú”˙-3³9À&x07¸ìò‚ft§jKĈġIĵĴħG€MáÔ7;0D;ƒ D ’덤EU ĝ3%ĜìépÁl£m귆ö+Fċ׺Ĵ,ÂGà2ĝò.Pğ.ZTĝÖĞ&Mĝë˘óUĴ:ĞO&£HĤ×Qd“N:é7İù;ßĊw*qx.`%m·O’€•_ÀRwG RĦ€Ĥe=Éš}:â†e 9pŻZ2,ž5‘5Ê ¸sGô”ŒT …½cM5ŜŞ•3Gšq€Ħ¨Bˆ2AòÏ9in|0mWžÇÁÖ|¸ە­ÁDr€ÛŞĉwÈ`yiĈ|@´Ċ²€€440›Ë¸í-͎ۜ£¤~Lk츁8•†B!L$3‰ĝĜ€žÇ-ĝ‹ż£Ì·d=´ĉàŒ]É.ÖZĜ ‹Úż@)ƒWď>ß´îÂf“ œi¨|ˆıd0ZAĝZ—Ù= ĊΆ¤v£óÑÖÇ#[xeu8lħZébŒ‰ġĝ Â@ÊDG ~Cܓp'FSşš–Œ5”‘[–,)-ÏÔ)Ĉ𤇠o)Zi+’4:V[@İÏòƒÀ޲€`@%òè-[*6€Qìdŭ]ˆ{.­HWĵ;[j˘ĵŞ\™DŒ8‚fb‚,ŻfVښĦĥşm­×ku-çĵ÷ßSÚniÌ£<ÉZ^^ĊNğmŻ{DĞ|1+薅`;û}ĝ ğunô¸×ëhŠÒƒ@B1§VCtÚ!=eà@cïz£—O,Çqà†i£•ùažSµœžjÖ×ڍœmutMhc³9³•CşjoÌO^¨pkT?;Ç'9›£DdgE‰ô³-ÔVŬä#£eġ·qœQtœZ:qOíšËŞoÁ¤a‘·W2İ9˜Ž>³à>C¨|ï0CHÏMËY%€ÁmàôJ‹ı˘´zS´Ŝ{Ğ7ıW€1:Ġ— zŸ°İÖúéŬY¸#ÜímµW›*Ÿ}ύĞv=^í“íîmáîxğ2 &Ñ^LDAÏ^żxsw–4£‹Ë_4P=vĵLMĤqij{A3ÀX›D o³4HRVfġMò1ı§ÍŻW3ŭ%Ñ4YjZ|‚YzĜâP²Kƒ´QñP£!Ĉž :ßjğËŞ|²}~šµ=<´Ŝá\Ĝ1ğÜ=Ŝ dW÷£< ëè‰>ğ…³0=ÉĊğW€Ħm,Ċüuyĵıv-Y~<ĊcyŽğsg@²Ÿ_ÑBo—%ğh‘ü vnRpvóë{‰ñù›•4ċñù›˘?/żóz޲xÓZšâÊŬ ‡’:ôĵ‘& ò³DÊzşô4ÑZž{ʓğùòôIó—Ġ çÓ·ÏĞŻî`ZvŽ˜tğB!QŬר#Î00Rᭉ -ü¤ġúÌ·´Er×ĝŞ‚–=َmP¤êཛħŒ§]ò‰W~V²˘ĵo|9fŻUĊBĈ€0ĥR'ï/œĊÒ`ò’ġ]ÍĦ_ĉ“ÉàŜÓdëïA˙Ĝw­°œ úŭ LÂrżùÔm˙Ĝ£ĵjyìQ{”À{”Àċ°Àû‚–ż-X/?zĵ3OòŠocİÇó•é ù5]/OçP×u½ô#Ÿ´r†ÏÏ­ë7ä˜ĵŽLKJ³ôӐg1׍{·²3d×X¸ŞîşAĤŞ"k#\5Ĥĝġ ÊB?7ñI*Ñ/ĞS3cù˨aô ˙“L;O„ġĜKŬW!b"İÉóġš%VëU2lj< †’<ûˆî_ö½ÓÖÛċ³uPH÷,ÇÌ$ŭŭ§—W>PCÈ^ñ ĉ}BtúĜ;yYĞ:9,=Ż-=·ûŞ^ı9'ZÈ“ÙLj4icŝZñ4Ĝ“fìÍÙó{‹Iê@۔éĵ,‘ yÛR‚b¤Ï³QO*,ĝ€P AĦS>wùÑ~9ŭáäż`uÛżÍğ˜ V˜›²V™ß^zlސ¨uCbq}w‡fJd÷|)Óşġ›ÙĜ§ñ8£ö%‘¨|FSg $_Ö]YùĤŻÏJ˙Ċ^œżcˋšŞÌ‹ĵ˘>·c9]ı+’,Yş"7”ĥˆÄ׍Ĉ2  EısóêèùkwÍ2×]"AĈïĥVÄgŜ|$X°w×îθM0ĦowĠ8Ǎ+˜AÊi?Aw‘bÉ!ÀÊTĜà<Ğñ3wâOù܊‹)eĈ°)YĈŻO¤_ë0ĥŸWOé׈2 nœ¸ŭX!*oÑĈƒÑÒÀä)*.!²ÚıQÇı) 3'ŭž9ú=+ǜ7‰“ŻOf]8b“uż7XÛm˘Yѽ´sÍÊDV%A°Cóivg—f zj/žt”T8ĝ½šaaۇk³gUèöëƒĈ@5I{OLÒZ"π6|IÍ.]˘z(ĝyŻ7Ŝô{ĝ9Ĵ^‡Ĝù]Lu0éQVÙÜj²$)ÇC™çʸ¨|,W—Uʓ1EĞıËHÔVì Ĝ¨²îo 3v‘é†tâÈĈL#$]êçUé@èí ÜüL&Ó04‰4Gĉ"yáNEZ…ŞK²&“m¸îŠboÇ|xĊXĠ¸1R!ÒOȖHµĵ"¨=•ò Ñ´ĞämĵBUtI‘çiUŒ}<‡ ’.OÈ£U/£´TÒ ĵ$Kr‹ˆÔE uÀÑVşÈ=$˃<ePdCuYÄŞtIoG IRnÚAÎh_]—UÚWĴ0œ#żšV]™tÀ(7Z/-²u y¨/ÓÙxpuúĴ£]eĤr½]‚[ág[ ´Í™î`_Ĥ˙>Ĝ:vžápÉÜıV• ‡;̉÷Q[)¤7œ4&C#ŸÓÚfURı—ĤÛ6\I iaIŞı›šacA>öN´ÇĈ3:bva)·#x·£Sw­VR£~Z€šUq0oC%ŭš#F[CÖ§ž‹t^ ò äÚÂŬ‡p…œ!‹C^Œ àé" ĴB#ò½ħÉʐ’9żĤ°Ĉ´ħ/íµ^!‚w·( îXŒFĠAçġ&ƒvŭ !×ÈHFê\H0e| ÔÚWÓıÊ54òŽ`îB £C‰}ÔŬ)=Ĵbmž¸ż˙Şt$Ae´!òĤW‚ˆ$‡Ž›Òı°ħ1ŽĜ ÙhY5Mï¸hñá$§Q›óŭ@˙pKaİä+—.ƒcvE(„SmÙ Ş ÏhğO1żúéĝ` ‘…}ÜCH!M„îv˘ĥ÷àĵçM•SVġèÜ9Ëtʅ•öˆĦÈS–9İ™s(|f€^ÊKĞXq°ÁÖÌۖA‘-žŬ§“˙ç ’û;LĈ+“żU¤s€4EZÄ9"ïÄ `\ƒġ9ÀDV“3ĈG› F]fwxf,Ò 4}BXyœIÚi§¸.5C0íúğK¸iBU(óĦ–5¨ß°8+hZe•›H•Sâ@5ĝ€î Ô!ĵÈNiòmžĈiRKáˆAgµë^#܃a ÙĤò_°5êš3ν°rd£X³ëˆ|ÜĵK€G0„½‘!ˆĞ eWÇşZv·—dö `“fLV€§ÎıaÚÜD‚çošë¤Ġ#Żk1UTSĝwé\s÷_h0dĴH‚ù|mÓX‚FCŽœé3£K…3bŒiĈD˘ùÏÁê60lµXs씈x  ĊÊv:aÁjÙNá&Rċ”8àúxġ,Q–`öm*8j0ÎPd5ĝÊĦ—ĥy…S.RpŭÀ!”'˘#Xı@ıY0ÈÏ{bNwĊıt9y8"ÑŬŜ#ÀÔ}Ô„kEˆ›Bü•|uM¨’Ev éM$Òß5†ÑU“ĤE¨ˆ"c>òĊżj£|o Ħ£8Agr:²münñv-Äü…Óî1Š´Tîí1ïlì_;@Ïݤ· î˜\&ŻÑħs“óQTIÛ]ĞdúT䚈 l¤4&Sš¨÷^ ĞwĜĥiRÎNaĥ’ŸR›=9˙ِmßÂĈcb¸ÏJiñü>}ċóއšûÖxğ\ÎÄ=€ï`ċàiVàŸläU¨EP;ĉ”%|ĵ(”Ċi ñ]œñrzcAYí§‚Ô‹ĊQŽ”Vܘ>‡›_l^ş iïĞ2ܕs“•@b~-ş*‹cżu0ˆV}M=\×+“NıħŒWے.çQù˙ŭ˙ô˙Â˙˙ĝoo\0›™ĦL|Çщ;:ZOgAÇ$zĵYÄñ‚§[ͽx>Ĉ˜ËfKêô:`,ŠĜ!aùŽŻì*bPR]†B8G‡‹éV Ôü(N_GSž8YWÂkE6ŒĞ£Ñ=ĴÀJ̲T8íp*A[˜ĥö?ŝéŸŝéŸ˙˙×Fy1ëıÔ^!ŭİ*sžŻ”Ç–iJ¤]š¤Îb™yU^çÑQ¤ÔF€E<íÊĵíK("m­XµĴ’tA:$§È€fFHsĠÄG…òÜYtGW§C˘A9Â~ĠN…3LĦbä„Ŭ&ÔüP-äüNw °52q l:›?ÏWŜЃ…BZÏe“<˙sä5ĉĴ£ġ<“tӜm1óя16@÷|9½Ĝ†éj0ä Ü-ÁàœĤU;xì._Ŭ8ù†ıŽ‘§ÌÙF °9ŜûÊ5‘‰èz3ÀXDš 7]G7è`ù6ĊÉö…Ñğ ìÏUzà°"YZÀSŝ•eÔ4²½%w1}s!=eJàċv÷U½h@ˆ ŬĈuBénٖ !a‡á-֌Zmm çKxFhá‡sÁtisJc IDAT˖+6Ĝр·YiÖ8½×(RÒ)òŠœ÷Ĝżn*Ӑ…°•…ż½ïTaFµĵâ rÈ SŠl×LâĴĉK 0dĵ¤ĜaeeÊı Ôçy¨à뀖ACÜuy ˆ,“”ĞT…N‡a­\ ĤàGĠñżüéŸŝÏ?ŭéWÔ&˙ÉFVps$‘6ü$IUeEmEWQ0ŽĤ€’GÇg .7e¨WN˘5=2lĦ°J3“$2q†Š"}S`-M+AE4'ƒ ŜĵZÈPèHÛQ–sIÒTŬġÄ3ĉŽÚ ˙À<ásj 6ñÊ2ŞÑŻtîTƒÉ]LĠĉ£›ĜĴ0ΰċ‡|{2Ò1ÍóÚ\<Í£ÊcÁCƒœ1ĦÊ5Қ+­€›Ŭ*î5fc3a˘?§ŸáĈ&,óŒt"˜?f,Y,ÂŬ"ëĠ#`&úù„x-²ôOΓĴıMF€ŭùÛò‘§kÙôN+îáA f‹İżjÊ˘Ï§Z ôĴŞŻšá1›V“\… < ˙H€ÓÙĦ½Í‘‚Äx‰ùT;Q…ĥħîcéí—ÛŠÂK€Ĉ3ƒĉÛD'ïÄà-â1̊ïûŠêï`=2(‹ñÏàEf=Ŝ°¨^t>ÛsÉ×ì:g'iݝ†r‚·ŽÉR '\l'šİĤ ‚(’l‹;B ˙›!ËI VCÓĝfs^ı`ÈÑ[ .Ĵġ@8Báiœ5Ĝ˙ŝQ$˃Öò(&şÄӍb"1pħŻÀqċA|˜vA Ĉî „ ¨@·œĠKâ°F½ ĵ¸à€î4DŸĜ6ҜeÏÌ›Ġ4t‡‰Ïîv.rJêè`p×yŞ$4 l5ÔÀ‡VáŭÀħĵsĊ€ÔŬ÷è.Ï\ÑDiġĈÊ ÀVZ‰½P€ €…\Hìd ‡ĵĝi‚Ğ ‚•pXŒ7ŬuŞÜÒ(÷=–B‘š{ĦÁàk´eU=mµÖ` ö_„/lĜ‹S×ô2<°JÀÚüÁOǘY:Ŝ*ÖȤŬ1j\8#Ĝ•9OÁĜ‡”Ós$ĵ›F0,6wD™<’I5ìcQKÛ €9ËP"÷Y`ÊşNo!OvG+nÏß'ÀPmL ħÒBĝ`E‚)˜ì, ŒœĵÚq˘,îWuê@Ż€¸h–ƒ\`E¨r˙yŠœ! †“ÖàÀžF!J´"6ÉĜĦ£¨2ˆ+ Ê)4“1ž ĥeĵßWÇtdÈí*tÜXDLp[e†ŸÁ%„@JY'€Q[UÏÊ1/­xœJ½+€mĝäc“/eY@­ê2/ñuG˘Ésg*v°İŒžV °¨~ò‡e Áx?µxo°êILOÁÑ·(*Ö#JqÌA‚c‰ó|HÔËÖHi'œ.TP nµ²×ĉm.î`RKX ^‡c¨Ĵş‡ĴĊÙµ`ş@“Ż(ËR %·r‚†îÄGˆİT†Ĉ2ç œ€M+’ÄÜÂŞu7fFG&jg˜RjŽp‡40!Z?âÚ=NFͽ>go`œ·Ŝë <4ŞšóAa‚€M- ú1²”ÊœJ—k0VÏBİÏn›À zÏt…‰”L'€ċ> ğîêùµFô ès6ê½Bê@0ÒÀÌ*vcˆrátڀjî! 9Ó1NôÔĉ¸7çâCb•‚$rè;H½Uqq–hŠÏ ]7 €—‰îl .)B.4­ż'zpǓŬ)ĵS[vóéݽ&à0B7[£~PÖlĠĝĊ„l³È´ ÖAâTÜĵŒ%i0Ċħ˜ ;t‰ÔÏ+Œ0¨,: iO·HÂe _•S^ݲ™Ì+·Šİġì$3AwÈÓ)҇gÒ? BÚ[œÒKrŽ`ıi›JÈd„Š ‡)ŝ—²D,ÀfSÔÔĨ]I:ÑıƒU88vÁĜ\“Œé´ßœŭ ĊL¨:iiÊhvÁ³ˆóĥ€BŒ­L𭆧ÔWˆ#„~Vm4İ;Î‡â-T²V%V le2Ñöt:TuDg ’³§>£ĥFÌé´×uš3WjŽÙ+ƒthÀéĜŠìyñĒIoj)wĞÁL,ĞqBM+ŻÎXµ”UÓlƒb ÇħJT3s‚ޘÏq$Ğ~óìSßí#o<4Í­\ĵ‰úĤ9´ûĉ`$\6‚²ž#ڐ27ĈŻ#k Ŝ=”AˆäïÁêw´áy=G1Sü”–ğ(ĵĥfĊ*ß4I80áŜ†Ĥ ŠĞŞüs(?E[÷­ç–ËXp-ŞĜŜ4–yM'`šbü`.Zĝ2r z”9;À LŻÒ$8˙#C5›“kÌ·ÍíàŻyĊP$Ĥƒ‹Ŭ6ĝjĞ’Í́ə1Ó)ˆĤż{-Eĉ ñÜ­òL~icċ9HÂĦ 'çĊÜ6í3P9ğ×(²Ei²Ç(§ÈY Ÿŭ…ĉœŭ*Ĥñr™ħ2ö\1ğA7JN䵈6G‹l‹|X9=€,sJ#ħ1mFi^f4a†M -À×CL)_Ê@EĥnîeUx;J¨öáÎID3îLQV•Ĉ·‡½ïqz.ĵ\<=/U¨ZsZ^ĜŬ \H÷˘Ħáú²ĞĊ1q„Ħ‡Ç(,1­žîĊ£ò$ˆŻCƒ4ÍP”ü6ùıF—QĠ³µPûó³MÚOM÷ü )­ïјÈäb*(ĵ'ż¤ŝ•nV´¸ßÉżeó_–UÏl‘ĊpĜìz$ÒûaŝƒĜ ,K7Ċ`t R#ßP›¸úôT êÇñğŸžŒşDñ^s°÷êR †°d÷ŭ6‘tǝû !ĉ›uF¤‘Ù>c˙~ùÛÖĞĥnGŭ-x“èäÙw`l×ÙĠ`ïĤ3ÁUëżˆÛVkûżċgÇ­÷ĉ³8ï~û÷WUéġ.ŜORœ|}œŜԆ½°M‘%÷胕ÙÛX“3Vħ,Ë|CM^äp~޲ tRvúğIĈžĵ[ĉ*ޏg˘˰ÔgòÏM+u´‰R'(ĉ§Ór~;ÎëŞZ÷ĴñĴrò&€ÁĞfÇ[€)î"PÈ2ï‚/÷ÏNUa§_ً"CòŠ"ğ,ˆ.2Ì5Ê+pċ[ĠŸ…;œ>c­:Ċ#ċE4Çì2L‡w烕ŝbhV2[F+žÀ‚ÑŽ‘Ï)†Ĉ†Í ˜akvé÷ĠĦoĤiNÀ/6=Àߝ wÍöIäÄ âB.` œmôĝXEiâgşì8´1‚-8Ÿöà4üä÷ĝY˜/”~Â6‹–Ĉšı=cœúzhD{юúĝĜ+–ÓrZgı%S|+ÓX¤EÌ{ƒ<³×˜éSĦi˜(jÛEUNZÓ^,ĥĵ™ÙÜ̎cÌŞFedg‘z 0ĥħ͸İġ@FÇ9ĵĜ‰Óġ00 äÍZ1^‚•ÒĊZġ›£:§#àÒìÑÀa~o&’-%Ì7T|VsUéĥeL™ġ ´ZUT–¤NDc$ĞR4M"ÒşDZ"I'ä3)ĤûIK0MR˙$GĉȒÜÄkœ F6)ZŬŽÂ %íÖD ~Ĝ1|"G€Ĵvt…˜euè­ÛċÌL‘ĠnW‘{A•qó‘N$yÉğ…˘ĥA]´_°l$ËÚTĞéŽÎí£e•ŞJ{ıPÔMUXj’w°d‰ĝíÉ-@KÚo™áX“—lreAŜqòâ;FGéb–|[Â=85‘\ĉĞĦÖí¨"kŭ\B¸ŻÜêt4IêàUT‘ĤéĈ6òtÙÌÊİ‚2Ö´ÔNjıžJz§*—ûvwıDÚäĊ˜ğ*ĜaÇS™î ` هAĥbÁiUÜĈ!‚Âѐ1 ʘ@ğA0ÄXĜ&²=ÊĞbÊ?Œ\h7¤çgÙ<÷ÓÉ´nü,ĉÀMy|D Ĥ퐠ǐ/âT.phs²9Äâ>i'Ġyu˜‰Éú.çZ2`ԕȔ}‘mVûŜ~ݽ°D'zÌܛ˜Îċ,7•IšU3iXd+S#' T}LBr*ħ‡Ü&çŝ“µÛY•[!‡6—,4şùTÑÖ,™)×Ô)TWu)‹á1ÒĝXz-d˘CqàӐ €ÎákżOĞ]‹ôĜşš…]äŠ(ë-wàBS üŻË=lƒ”YybĞ ò]1_W÷ ċ9wxŜ'¨âNäÄSÎßÀ&5û7³‰Šô%HC:1ì2üÄë”Û!PĞĦޝüµjd`´žXaqž%ˆ%§ÔU1 ™ÁXOh•‚  ŝŽDĉ%Cŝ­9ż 3÷mÒ}Á ×nʉ=Ÿ˜ŻÑ°XéGĥ”9œàµA+…œfCPÊöz)ĉ'ż(FLĉu9= À—]‡÷ %tëƒA :8D‰‘ĥĈVáZ¸ò‰šTE›?ZÈQkĞ5 ng@$—§IVœÍnlâÔĊ€È9Ğ ƒĥŠ˙Giaïġß_c$ñĦNs76œ‹¨u˜BOúJšSİI|<²'´Ï´Ï‰›P(ÑjŻI $Œí=cW§#ÛÉĴ*GÒ° =2ÌöċÌqĈ,óTùQK¤C‡>R°U§’ƒ^ñR~IƒU%ƒ˙‰ĴšI‘`H@Íë֖†e:`"KlÜ6¸èH˜´R,AhÎxżU4SFK°°Gv€Ù𣗐aYy’šˆ'\,­i­|ŞB” "ÙܟC"żŞ#(žòĦœ°ĤpwžÜ͝ÂĦ´82WÛSYw°¤&ĞG(ñŻ–.'ŜÖĴ†Ż·k€ ê€ìœâèXŞ×y‘=ĜˆM="]Ŝs€AcDĉ Ïéiè`†€…—“ żôJĠxoÁÀÁ[sù0ĥ‘#µQżäŠñE€UĊΉMB‚' žĜĉ' H'/¸Fò ˘ -ĉDNöċŠÖíÀuşêEġˆ&ÁÌAˆ‚Tgù`ÈĜ€\WĤĜ‡~RÁï3^5ċĞMŽ´ƒĵ:µ”¨‰×Cßàì.&ä<b‚÷s6 'Rl†aq‹³sÍjYgä$t–ë¤q#™Ĥ“ÖŞä4&Ç'€íÍúàġìn°‡X2YÎÎ`AKt àÄ !¸ĵ˘P‰ ÷Áò<îş§ubï9ìè€ iÁé°6Ûò¤öï8 K[97Û#iœÜi/Ìh0“+ñ ë(X—Œ˜,ħX‚Ü÷ɇ’}ĠnħsĜdÁ6šH”Ñ]Œ‚;aĠŠGÄhUfJvQşŠ ó(ġ{b€‰Ô8ÀÏ)¸dj-·ly0$û½Fœp½÷\@Ò*€_ƒjŠ ŭ ôŭĈȌۣH6>VÇxow(9™Äh³À;i—ĜӇe‰²QĠYas€…:‘‡+úD13hğöŝò,ÔÈ`"粆|Eâ-*Şïƒf6ı{íH҉n}*µÙw v].£œûŬ˙}u”Ï-Ż÷ Dô½`mĤdxÎ8·Àŝvì&ŸHîy•ĥ—Q>i†Ìñ–_¨ednRVÔğG€áQTŸ;Ġ˘pĠ§*Œë!Pù]ħŭP "ÇÂĈHÏ.œ]SĤ3ñĜ°{Ŝ´İÙ ÙĠĞ´)Ĉ# .Qw>…*i^ï½tĊÍïçˆş8nÌ­ûI§IËè*­zĵ7Pˆ nşÜm7eĠ@²4ÎgŜœfÀÈ]¤Ç‡àÇđ!"ÍÖFĥ¤ui¤ĦĦ#ò•!WùšÇ’U1!š7×Ĉ‘àŽ{˘T!žmĴÎŻÁ|Á]Îce\ĞKZNJ'³ûLúHħüsèܒTƒs6è Ĵ¤ÊG½i7İè:L‘7 Ü›zÛqE³j­î†zŭÔB7Ĵ*7‡vAÌÊŞˆr1µ”OşCÇm aÛíÎÒuSK–Û ü‰%Eċ[&T™ çÈê”[§ÀÓğ] ûKGS:ŬĥÜÊŞÜĦĤŬT ÙGIY&ÛòÇ%ı¤rŬ5À2ƒir#úħĴ/—‘§W‡qËâŝËġĈĠù£†† [ÄòġÉK@ê?ÓȘyx~ñ3nÓ…6QfKÇñßûÙ¸5s÷5Hîh‡ï°ü%h°´ġ$Gc)ajd>¸9^şŠüjßĞ;½^l˙™}ܛûıŬ ı¨î¤Îê}ĥD’}ü âXĥ4:ݳ¸$™Ï †ùÚòġTĉˆÌ5ûVE=2|­—ŠzE.’'u³~Ŝġ;¸~ŭY–ICuß`‡¸J˙Ëá$÷ﭓ?!êµgSžÁMÍ€•AïMü—Ç‘|­òNTbsEE˙­ĵòÑ~žî”rûV€e6ñ?²żü„1sġŜážŬùC²q(sá3ˆ`ìô†WğÖ7•ôĊäpŝ³')T,=ŠƒŒ÷X‘=ÙYܟíf*ê^€Ôö×g³ŭ~%^ Z'Èü^X$<9Š­ˆMùĞáÁOe'>ĝ|żżżĵHÙş°•Q1ƒĤF ÊñĠ%j!2½:Vz0yV‹¤‹:ĈuèŸöĈµVL+ÂägBT|g|0.ñ\>Ĉ~ŠYiܽÜÛÎ~cÙöÀVĝ¸PIMİ™ï‚Ġ``ßĤ+%³ár;_-c€UĉÙÖfç ĉ<î CìIĞhĥĵdD†üġ ›hÔŽgô0şÜ̖ıŜ%CagC:HfgKKU´ıfÌäӁƒ­"k0¸³él<ÄĴİg2Ú :,­{“WÌúh i\ úêÀùÂğbö›ÙÌ*èşíÁp‹ŬÌUvµÙ˘iBL…ż;€}E´“²ˆ`RµyH 鿔=²Ê€P‚f_£=É.rKDĦJœÀâUèêŸröN£pš'óµY%ĈjZŸÏ1iâqŬŸ„Â*)İo+Żòî‰u§Í“,9y24֙ód¨ vd˘ĥ‰Ş˜û’SOµ%,Ÿ]!§üLÑëʑ”3ŭpĜĉµô"^Öĝ’~˜“U8hKŠb5|ÌïsŽY›ÈHĦÁ\×=ĝ„aöF!jW´Ïa•+o eb$ĠQ gÛïù‘yéçAUm§SÚ<ċT¤%fz.1YcĈ"]”µ0CSĈ ´šm¸³;'Í9ÉÛ×#F¨’•gtĞbŽ2öş›ۓ0Ó˘E}šÎAş(*jʀ‹b,_ıh˜Ĥ íĞD²vqEÛڊQórĈñ ‘”âVšUù†H \ÌaFRÒÙm|>Ò™­Kžf{ċGaşĥÍuI–€"¤<҆9³kˆJ˜Ġğ ŭ*ŬİN–¤Šàš#oRAcü8äS>8(ÄıĵzŻ niĊBLÁmë“cĜQhîvTÑĦ¤,âx$KŞÎħÔßàB¤H·ƒÍßhğŞÜݚIuà̓™pJ-Ĵt?İB““Ó„ÈCTe&i­ĵâP‡7Üàn$a2wkÑë˜qkĈHu‚]û(ŒfbÜPŽ£ÑDW†ÎĈü]ŽïŻ›ĠuĦĞWو.苜.Œê¤?k oi8 ‘FzÇ*S΅ˆömF¤]Î%.z(İ:jˆÉ–tŜ3hħ#„‡ZÎÜcƒ †\żG“³×€×çɤsäwĈ÷Ëz\Ô>˜…ĵ:[EżŠ|H&~œĤ1‘ yÊ1'Sqeo£ñğ݈àg:aóD§#8ĉ”p4;ÄWĴĥ]˲ìD^D ‰ÁÛrï6â ܑsŽ”5ħ÷èäĠvÎ>ñ!;FË*kĤ´„Nò`hMĤ²^{^v‡(!Ë[‚˜.jiWѽ˜è~ŬFUş"{oÖ½>ߘâȜHŒ•IJÀ@ÙĵÜÊ-3½âYéJôÁyŽ>é8s­64!w–2g>Ûu$Ħ;4`ÜXHŽFÒàʕ2.BU΢™€zò“ §„ĉ˜OÖ#;Ë` jĜno)µGœ›EqÀ˜žèZC1„.5[gèÈdRŜċ0EyE ŞĦ}<–Ñâ[CÜ5ä’ğ*Tĥ0y0l·ˆì³\,j]  ĵ À8ħ(áì:ı'ĝF1r„v­9/\"ᰁFLmĉҖ áċ`œòl5†jDÌ ġ‘͇–"áAĥšO×ìde‹.5Q[œšK4–Špކ„ “s·^D¤Ö¤:5ÀR0š#$΀AGeB…ktQ°` %ÇĴzĠÛŞ¤^‹X‘0'[ċBٍ€ü Çg?œs–Eäì<‘ş ‘ó)ï´ĵŬƒ9ĥ=¸fil!xԅytŬ’f8ċ ’Pz-† ÀĤ`ĤpıÖċŠż ùşbSm\(ŞÓGf`+RÌ8˘‚:âĈc;şŒÌ›; Zirb=_Ğʵ§dĜTjŻñ ĵOÂıǵ9ĞX_hİ’SŒ8W†@wÒ`-`Jċ$qj?)‘l”q9/‘}ñš‚,­5˜]ŒRvHkW£.3Ċ5ñıx(µ×ĝàµCêä-ÄÙ·&í„î`YÚ’U6Şz¨n"A§á@+h°1Lu,6-A³Rş2Ę9›AŸ+@›Kƒ„÷Ċ ğX‡ŒOiÒ~gşıġÄD¨"À@ş{ĥÂöɇlÉcFCe‡j&wÀ‚NÁĠwóZÜDÎĝP•^ |0Ûií‡ħfĊMa/eÈĜ_ŠğÁ›oŠ%@‹ž*Bnİ›Ùô˘Á„NßëĵġǤ–8ÁD"‘Š{Ħş˜N4Ê£ñ׸Ód‡™ŠKŽv[PòÑ*gqm&|0ħ˜ċÍ;€‘UÉ2äG€%Fï´ÂF‚:Fb0miYe:ÜY3ٍ/Wz ÒzƒS<˘…#Ió%ŽùœŬn²µ=óV=(ÑÉïNÔDqpµ”èXtâj# óŒôá~Ĝ”P1„Vd Ú€“ôÍjÓCÏv$\÷ş@£#–ĴúUŽü†ŝ ĠIDATˆ].Y™ bNŻ´ĴO;ÈéS΋mâ@ ´wŒĴUë%ĦKpÌD‚A(Ş^fġkËÍ “ î˜KR3n÷p”ĴCàz]ĴĤö˰3ĝŒwĞí'iOñRĉĠNIí§iDên< ÄËDܲٲójßEŠıbİ’!Ċ(C³µÊĊ'Ż$(áÚöĉŝ˘Hepöâ–İvµ°\ݤ?éĦ_È™‹,ÒÛuÁ}µ"²iú¸qKÛ4MEŬäĠÒìÀ cèƒäjxôUé™ úżÔâ[—+ Fĥ"ş ág IIUv!~äkŒ#âH]ƒM?Ż|SÄĴÖp›J¤Ÿe#í½|ÚÒIk˜Ú ĥ6mäŽj³H4îİàáĊDZ˙ Ŭ뛂+3R…Ô`ÈÙ·ĈQ*+´Q 1÷'ĵ @Œa](ߖ|?¨óĈluv¤SS].úĉ6\@D2]Á UíZ.@ĥÓ"À?!ĈĝfŜ‹:Pۈ=UçݽÖöy‘ÒaG÷I\‚óÙZÒÔs’Š%3o‹ğWäi£‹W"1­²íŽRˆÂmLi´ŬYUö(Ž\š&ÜĴ{KŸîĵ§9˘žµv/3ċ!€çìYĥŜÒ=8AÑ£Ĥ-üÁsÀƒġ§ëmZm-',sÇiıˆß@˘î/&’ şŬò_Žĉ‰Ix6ì̗‚ŞkßV­ċsn°Ä "šĴ\T¤9M·ĝ2eœR*d’*7;¤%ۍ· ù(ü$Fù…HÎoÇó¸Ìà/Cl·ÁC8Í5;‚¤àC 5ġ'ûüŞġsŠWqV°b=iÍbÊB}Ê˙Áù6ĝ½ÂĦC^]8²ġw0ġıYfFŸ9ùŬnšħç§­o– |ĜNÉċíÇœÁ~v˜²{öl|ZŬ’ñŬŸ}P^^ö-”Ñ—ğ&ŸŬáŞġ# j=Ó"{Dß~ÒÌeë [Ĵ˙Húĝ”%ÛâlYÇÚÏû|LĦ=eU=öŭXòŒŻr£]OħĴxĤf½ñÇ`ßW€]£‡ĥÎ'“f¤ÜG"Á`wRĥ`.—8˙‰ RdÇ€=v~Ŭz—Ÿ0ê‹×köĜ`×qeġŭ.€½ò+}ßIKI’ş†F¤Ċû7Ş’gvċŝhûUş˜p ú6€­Ôĥò„š¨Ybġ”ĥ.¤Ŭ&d–OÎ=‘íèMĴ…%‘eU!Ġ¤Üs·÷çƒ1vèaŸ â—Sh¤=ÍĞh¤Ëïܵı÷É'Ž3\Ë^[|ğüLğßÀ§ÓJ–öyWËçÊì `Ċ”´oËM÷9€-•żÜ“&Ĥò0Iè|ŭĉÜĞ“_–Q“½óòz޽*Ŝ´@ŜħFŠÇ Ĥè½ïÊܖ”Żm$ËL­—èż|Ê s8ßìf`³žê[Êá]´7ìHˆ |kù5jCXwETòfĊ´Ó·¤t›~ÑÛvÍ;XO)l]×;£KñüoıÌGr),ĈĈ=öÏìQċ•Ê`òmÌ]¸ß~I2ê}ŽçF9]Í?sœn>Çsƒ‚îfŸáıëc`ŸÜàá{Ÿ#ˆ;ĉԏ>s Xĝž›t|Žç>öĜ`€=ö‘‹qe­k//?̚£4Ĝ\ßaßLĵ¸4ħíĝĥ8=Ëĥí9ŝ}‰°U|żyÏ>`‘w}|½m|qÏ].^>sCj ĥŬœ._( í:EĦx˘ûÁçÙw`ŽÖ¤ŒŭÑEìÍÀvo6D7Чż½ıe@ŸĵÀ&zÚV'˖ïtèû—GyN|ЉĥÍÇL^7oœ[;8ì5ß[˙0€-&§Ëw/ È ĝg(ôŬĦKġï‚ÛÀĤsüf¤OMx-sOÍpfhßvwÔÓG¸Zj>à+G•ŻëKXlé˒îŒAŻì8ëVĝF –têĉ€­ĝ.Š4ÍĴMá>ÓçÔëöá`ë8ßĈŻi…Ûıoh Û-è âĝÛÖġ9ÀG_ÑmGŸÀàs/¤ŻÜŻzÑ@·âd¤O8À–úD€MtşĜuĈŽĥFşG·ŬaüŜƒ>µĦ€C˘“¸CÓ·\öó ` ÁŝŜüJ˙ÊâǗè{‰fmżx€…&µ/ëf³½şÙ×`Ê&êĠÀ˜ÀÀh.&q>ĥÛulÀñAàŽĦ/ĈʚÀ„‰œÚĥÌġĠ:ÔÎÓfp‚•ò}[Ĝ +șŻ|=\YxP‡}™:ŝy+ÀÖöšl3„kğjĈn0 ‡ż’ƒB›,@}YñCíàc´†/ÛĜĥ`pM$³w*žĈĉ y½Ÿ‰ÄşnT·XÌ ˆµˆÏv8Àf0.Áƒ²Ö ;€íV_,ÀR\àħġ…ù[#5Pe`!€OĊ1pEâ+5Œ!ÚùÛ]cäˆÑŝċìžoĤNQaìsÀĝÂEßÖ*Ŝ‹àQ?ÀÁPüñë(R|E‰£&¸,¤~V2wŠ"ħ˘e7\ù1ê½½c‚ĠĜA;āŸ–ĝħÎóAtìŠ+ÖŝĴĥïi"ŜsGk”W„_˙˙öÎa =CÀS™\½Doà)z‡.YßĊ-‹['ǐS ¸d“.vĴI,Ġ‚X°ÂûM ùÚñ’~%ԍmá<’îħÏo3~£'Aınf˙Zġ~sáğš3Fš¤Ŝ–öé@$qWö"ŽiƒVà;™ŜíĴP:*ɗñ.܏ùĞ.”ä'qÖċ™ß,àU,Ž# ĉÖÊ2´Ġ~ôJûÑ`K@ŸŠ V!à f1tÁ ]İtk˙‹TŬûÓ`Ì7‘ĵĈàf/޲ş•ĠWŬÂàèڒEݰ1âeëœĉ˜‡œëÈ.èp 1ày“lE“Žşiîܵ +b´IENDB`‚gamera-3.3.3/doc/src/images/tutorial_open_and_segment_image.png0000644000076500000000000000447010714675724023665 0ustar chriswheel‰PNG  IHDRıĉşĠĉ0PLTE#4Z6L~[]ZWbRg™Lk°j„yğ—˜™²ÚËßÍÎËíÊċçäŭ˙ütÊvIDATxÚíŬßkGyĴ´ŒŬÔۋĤ"ÉċĦPĦO…ĥÒ˘ˆ(öÁû.x›mƒÒ܅Rȋzµĝ$‚Ò>¤âC‹”*é÷àĞ4‚ĞÑÒhXï"œ˜ÈMçÇŝ˜½Û½Ŭğ\.·ËwŒ“ŭ1{;ŸûÎÎŜî+2 Ċ3RF†ŝiÑIğnG; 8”…}L·M“ıh'IW\Ĝ^Fúġâ53]/ùÜpîĴw6ž›ñÎĈr3ıf™ojٌß.ÏúUr&OuŽĉJ-ˆ™ŜĜi“´áàl\Ë\Ĉ´L60Ӳڔñ4%- ñ4{SµYógm+Ŝ4ÌôâzQ ~‘Ĵ–Y ß4ċ.ìÍuvè5 ½ëÖÑñŬ4%ï§éŞh;É é½K__Ĉ+6èĈZ£ħlŞD^LÉ>wš†‰BŽoÌwoM}İĉşl`ƒlÈĤ_~^AôŠÚt9ŒÈ…ÂÑ|}Ùĉş¤ĉÙ4›îg1=4ĵŝunŜ§AêT–+Ғ4o_Ê<îŽ?’î)˙á½JŞ5ÍÈŜÉlM%ç˙™O•È]­vsÖYS§ÈLw‰`+§×.UéâKd^3ËN“o™ÓËäÖË5şt>E'ĜÚV|i³Ĥ\÷täéˆĴ9Â~ä^?ÄgfD˘ ‰‰ĠÓŻw'Y2DuÇn ħİGgö3ü™­üĤz´ŞùÚżG²DQY€§×&Œ“dèŻOJ'Iz7[ÛBüú͚ŠĜŒ¸cgiĠ”(›×ĦŒƒ•VR5ĴŒRfokj‰O‘½ĵe’[“lċžÊD…JIzÂ)ËKÓmW÷TDMŸŞ°…W"jˆöéŬĞ0Œ|ÜYZŸ^é.íPH‚ëYWÙ¤Ĥ]7ǧH‚ë.“ğlċ‡Ğs5şx‡UVut>Jv½˜İ,×úĉèÚĥ{•şĜÙÚĥz•í£5ú~O<ž(ŠY_2xÔĴğèUWùÊGµcšXh—µu´ Ù³Ú_ù–—2ı\Öä™[͕îX3S,óĜ‚¤~XO^Íĝ\ÉI÷’ù~ĥĠÁÜ÷żħ,oeÍvaeµ¤ÌġI³‹´7ğÖc/u‘Ô~M†Ùe^Şä!–ç\Ĥ[°/fÙµù¸]ö ; ĜÙöÙ\NÎ<mpÍu› *;òM@4'. ÓÉ×ĉì=;T8wĞP—Î<³ÙBcšY!ˋġyµż—òÙï‰ÂıB]%™Ùum.tò}ZBŜêDáü-U,ùÒ ĉ”—Ï7ù ÍúYĠ1pit´˘šòîğFL÷ŽĞÀûż‡ÙïÒ „ĝ&t è@:t è@:t OKWğ>qÒ]Ġ-_Ûüt•8İğş›d³ÓĞĞ5{w+A:½ħŠ:2Ú} –7_÷fƒ:l´­[şYîħĜaL…tħŽ1ûECG—íµàċÍ×µ;¤3éü ›ö j$cÇBĊ~×ġ^ì¸!£żLŸŠIìt+v†;#>ħ‹ùq‡hÏbö™Ö‚8ÄîD·áÏ*½;Ùĥq]ïĈNGFŒcבk„nĊNœ¤Wş}ħۚ>bħ‹oìHœc׍{boÚ)†÷ÄĥìŽ܋è@:t è@:t›˜>énê²n?ÙüôÖı·¨óŝúŸ—Şûö\š_ÁxéşŝVìš‚tş÷WĜÎĴ*@'"$i>w'::Jg=Ò~tW4t(œÎž İǰeÚ:„"¤ ìUì–iĊ.R}fàî‡[F£ešçğúàyžïÄ3 £ÔgÂ'1tÓ½ ù¸"ĦkÑFÑı'µğF-$¸[ :u$Ċûûğn$t è@:t­ëŜ‹/nĦĝê–ÊHż[Ŭ•22ĥĊ·ĵêôÏbzÔí#ed„żkħDHù_aÒo1@1ÏIENDB`‚gamera-3.3.3/doc/src/images/tutorial_second_page.png0000644000076500000000000010215410714675724021463 0ustar chriswheel‰PNG  IHDR`Ù˜wÂPLTE # &$&#-#$'-,-+6*((/6 ?,393523;,D31>9,9;8R2%1H6A@9}BdfcLgĤVrPNgĦJg­Oj›Ug›³4ğVrmHo´Ol²bXíziVkmjQnŒcLUn¨]eÌxkh†efnpmTp·h^âXfìYsdrŽ_qĤ[v—Vt´[tŻsur’klPrü\zğġCA­S¸G™Xy{xc|ħĵLÁ¸b\d|¸hfĦuRœrp~m‚ħN„ûq‚Ğ)—˙‹‡P‚„k„Àx„ m…ğ´bı†ˆ…{xe·M¤¨sÂŠŒ‰¨}ŒS°n…}ùyŽż}‚öŽ‹˜Ş‚€‘†‘¨‚‘ş‘‚굃ƒ“ƒ˜ƒŜ“•’—†Ùx˜Ï·‹k‡Ġóomz–頉ʤ‰Ĉ§‰À—™–½ŠŠĴŠğĦšĦ™’€­‚‡œÍ³‹²´¨›š²Ž’¸•ħ½™€ĤÉĵ˜w]ğÄÁ‘–Ä‘‘a°˙ ˘Ÿ˘Ëž˘ħż‰ÄŸy§¤Ŭ—b‘ݏĈš™ žóƒÄ”í‘…ĴĞÉ£§ê—–­Żœ²ŬİħĈ°²²Ñ×™ÛŻ­á³µ²×ƒ}ÏÖĈĥ›·ıĥžÇĵ™ÒŸğ½şĤÁá—Äü赅ÀµĝğĸżÁ½ĵä›ÑĜÌÀ³ÉĵĠ׿ĦĵÄÙĊÂÄÄÎĈÈĊĤߨò·²ÉËÈ­ŬĥĴÔûéÁĵĤŜċÎ̀óï²ĉ²ÍÒââÏğÒÔÑċÑħÖĉÌĠêÀŬà³ïħÖĜÔÓĜŜüÊÂè×ÚÜÙŬßÜîĉ‰àâŜĈíòâċáÔċçäàêóçêĉċéùêëġëíêïñîéġ÷ñóññûĝòéġ÷óĝúöŝ˙üÓv› IDATxÚ콜Ç}èÏñtp\¸&äJÛ4+qŝ?ÁrzB²zïE#ë¤D—pĠ߇^dċ´ċyĠÊ=ç!ݐˆĈrË璴iß˙.vœğßıŬ$nhSĦ†:üCҖĜŽ IÌ˙#SÛYĠ_ŻmžÁ8À›™Ŭ…]à¸c9Nœ´?-§ŭÍì.;3_ĉ73;żYE=ÚwĠÈúYdËğZíB„aiúüZÙöˆ,²ċĜİK­ËçMF4]¸tá1À˜-GŽ=púèѽgÁçÌÑ#‡NŬwB¤¨QÁÁûÎġäÑi¨êiN=^QFêN…ŸĴzà$PÁçPU=|R+TĦ]Ħz|À=Ħ0èÈñŠzü8ĞŻQ7Rrê2ÂÇoz)ñq·1-¸3~—KĈħj"AòWȂCâüâca^Ÿĉb=ÌĞlIìШœÎTTaY8qüèz|Ñô6ĜcµœÔ#:€eŠ(<ŸżtáòÛùìĝôžCÇ'÷ž˜žÜ{|Nġèô>ħş÷§ŻUuO:½¨û޲êñiĝ™Ü>‡A1V=?@=2]9â0Ğ‚Pĝ™<?• ŞîÂÏ4 N‚wdU…2 BGĥ/ÂK‘@=RUùd§J>‘u9‚T{@œ}{¸Ĝ½Pq ”›ġ“‡Xuß1Tl“¨$¸Ĝ“ $¸XVŬ}ì ˖ó Ï=ğĤ“'AÀĠZp. ._¸ôyŻB{éғo˙ïŠĵùĉU€â–é=‡Nî2‰vıD6Js5GêòĞ’›|ĉ ³ž+‰P=fKc'(6X¨ûĜbÛvXĴÈݨĜ§'÷Ùy ÔCULŜxóÍK.}çmaçħ·…‡\ jïö&Ĝî“[MNlƒ_tŬĠÖcÁ­LŒï¨G&ĈıĜ[€şŞ àÜ[PŞ&Ĉwu/ˆ=2QQL‚4OÀHY‡pêNÙ.ˆŬÍÌP¨pw7(£Ŭ ÄÂŬƒbu˘˘ŽOž î>zċâÄä™+ÇÏ\yéàÄÁĞç'Ż<Hg?Ü ċüKġaÇ/^yéG'Î_İ^‚;˙âvŸ¸òҕ ïĉo|vˆïl‡à'YuÇ$›*üĠAıq@œAĠĜµı >‡&PI€ü†YżŭÁŠ ç–ĴşU·ċ|œU÷rê1 g‹ ݨ$·‹8‰{ÍZÀ q°w‰ƒ‡ħ€€˜/ßħ÷ĝ8ĝ²ñ­‡ Ş3 NŽĜ­ vßQ4 oİێ˘X6E vİÛYdÁĝö=@=01}šS÷ Ġñ=Uu¨ÜÁ`w7Ú=1Jc|Ç~°{ݰPvLVÔqNŬŸUág˙ĝü–ñññKċ×?3ŝHùÖGÊż||çdùŝŬċû·sJ˘˙ÁVùŒ³˙O”.ŽŸż²Â~ŽçŜ¸tùêË[ĝ ]à?ĝï“[Ż\ŬráÉ-ûÙÛĜÎŬFÍ]ñêÁŠ*HĠ8 gGƒù%RwÔĉ&ĞÂĵ†Y?œşó(*E@ßĝÖcUġĞ˘‚ß Ëĝ(Ċj‘£ƒAŬ·Mâ„ì 0ŒW { lˆ8`—Àçê0XïÂÚi`d×-{÷ïÚzh˙ŽmġÀϝ@Ŭ ÔûÁ‡UaìNĴ¨(‘@Ŭ½×¨NN€8—Sw T¸ Úµc;PA h×°ğ}‚UáÁûĞħğDêîñ]°¨ÁÁ°ÈwŒ#Ĉ/䷜;żëbéÙì>[ġlùÙĞ`ÛÁvñüùóÓç˗?{ñâ#çϟ;9}ŝÎOï:~ŝâù£0jיû÷]œ?ûĝĝqq\y×ïĵqhËĥ½Û `à¸Göï>{ñNî:qñâÇϝ:ôFĉùS·ŒŸêñ8wŝ ş]ûws7Y{ßĈj"Ç!—\,:ċÈî&ù5^U÷³ê4P’ßyİÛ÷˘‚ßÊŞ;şĠ0Ûŝ] Ĥ€ċ|Ë^ĜaÁNìŜ·GâĞĜŭwı ìhşT Ĝ;ŭßoŜê Şs·d*_>œÊî"u'ËĞ“uê>pß@½e’ÍQ˜ŒIN`Ġœ:‰2¨ğ×Ŭğ [ìg‚UAÛ9u‚UaħqħàÊğ@ Â,É— ôú=[/î|ŭ#°;³çv³€•.{ëŝċïÜşċ\ĉ‘ÏgżòĈ…mżĝñż;·òKàï1uħtkîĝáˏÜzġw&~ĥ}¸2¨£ĥ‚ïÛ{äüİË÷œ|óÜİS·d.Ŭ ĞŻ½™Ğ7_ışġÑĞŸù£78^xâĥ­èV&Ĝ4›œä’ÁŬ3ŸŒ‰ŞşżŞrog Şä×ŝÚüŞÄNWóúÀ[“œşż˘B¸’D0BÛ.ž/{ ĦvŸÀD²|-Ĝ•SwžşóJ] öĜŬ'àîmĥ 4y<_ğ@½‰Ş¤í2["uŻ‚ĜmÜï‚ Ş7ÔíGŞż86 vlgcaömŻŞ0vû4ûÙÍĈîàq›¨Ġŭ" vWKĈ޳ŒĦbġLáܖí [.ŭà4‘·~íc°ċûoF;·€úí÷ĵyië•+[ĥ9´ç9ÀŜc[Ĉ·î@Qċ-ÏŭìTvïİòŭ§.½µÖE€Dï?€lïáËwžÎ½t~÷ú‹Gvĵ”‚&òJj˕̝÷ğpqË-Û'Ş|ÁZuR€Û¸ˆ >ÍûıX.ƒ²™$ÈŻœZÍŻêö(ë·òÖ8*˜­\ħš€í@%)V_Ĵ [I°íĈv Àäí `¸+XpXy…îí7E€½ñĜˆ/0cÙs5¸nĈĝäĝĥUġlt3}Yî­Ĵ™ßħSĴ˘ö°ëĴş4İPƒ‹ŻÑ¨y4_Ç·ƒöÛŝš¨4¸&à§ÚŝÚÍİU6ÇöWŜ TĜ+\´wübaËı×G€ú8˘  µ‡lâbéħ'ŸüĝÖĞ—·ìriï×@àc[™-?v ´ƒßúüK7Ÿ-çÉ'ïGíħËWĜ&ÙĊò­Wß÷Ü­“ç“9?~îBò]W `[!`ıǞ|ìÖ­'·!'¸QÔÔİÛ'E­JNŬîŸÏ‘Ŭ‚ĉëdµŭ…ba{¨l~턪°9ĈİÓ è&Y•-§[pê6öÀ4R÷qí/Ĝ’><ħ}¤4˜*½HX_Ŭyċm`o"ÀŜ~ğZƒ‚UĠÛbÀ†A 9ÀPÏa÷#,P°ı|7ĝ²C“\7ƒíN²*ßÍŭ[Ĝ êí­Ş;Ğħ°´v€8‚ĤıAÔĉD*ȤJkİ ˙š½\á #ׯ¨“Œû'xÜĥs%yé­[İG&.ĥL^}6qá ÄĠn´í,?zbâÑè‰żzyëÄ//î5Ĝk]óŽlìa{ÔĵZé]²§[¸Üäĝş…ïşO² úJw²V½ċAHם úƒlÁòħ•rF|ÚÍöĈ›µ€½q?SŜöĈ•SWž‚GìêÛ<`“{ŽMܨÉĥÓp¨dç^‘ş›U'vr*:xrö:xt’ GÇà͞C“Ü÷ž#(và ñœIÈuU=8ħûP§'&¸Xí"ġĞÂ34Ž„F™&á§:è41yñҖG/Ŭ ŝNœ|ùĉ³—ož8~éòÜılWïÜyùʅíÎ]|aïŜKm8wùÒıSÛOèÛaÔ£ ;.]úĝÍς c7ħi°{éÂ=Û@óÑË.ŜzúÒepÀĊ˗ÏŬ|é›[. múÂċˏïŬsċÔÎ ŝVĜ;C÷‹†Z&ı1Ĵ£(•4ĞGE9²ó¨8ż@öÁĵ†ĉ2—SÑÀ$WNÜ8ċ1VŬWU·ħG°_ĴşW žD*¸[ƒq˜ NXÀÄà<& &e;plú×=>½÷;ò ĠCǧ÷İ‚qa^=t ĊÂû0–OĉĠ}`÷q4ˆ U8&} {àĝÑi4pÍ}€ ŝ;RQѰĝħÊĜ£óxužÇĊNŜĥ÷èömGwn›>ş{Ûĥ£{ĥÁ m““ÛĤ'·˜;[·í=2½sÛĥ½ŽnŬƒÚ69 B·M£(pâôÖmĤ§÷€ ܃p8ĜQ;·íÛ6}`'ĞmÛ3 ĥ­ûŽnŬ9 Ġ}Ó@ĝ‘ê9.Ñ#ìcŒuİâUxnMĴ(żĤ§qŒì˘ŬGE*Š% ĠÓÜĝ=Ğòù'ħ'§÷AġôÑ{Y~ĤbÂVÎc˘`‚óXÀN?rèôñ÷œ>~èÄɇ΂ϙ£"Ă]ĝÙ{ş˘˘ĜÓÇáçĜŬ‡b †ħÇ@ìħ“Ǐ€ó³êqNċÎeUv÷IVî@ŝ#RÁvĴ²{\ĵ[‰­ŞĵTƒàÓC^ğB9Yŭ˙(wÔ1ÑĠàŝ‘êĊ·Ô#ümœdĠÊíċÓÌĤêèApÉŻd—#'Ùwş’›(ëıÒ`O€êj95ˆ=ÌêYV½‡+ɳ•s‚€‰8A€Ġ€ó˜(€L{éÒï\ȓYäÉ'Μƒ>§Ñ§˘žğ'ψUËjÔӍÔ&²òı bùŬ™èžaŞÀgĊ‰ĴIóÊùuĤޞe³ï„èÜӂ’<ÄŞ¨èNˆÔ°`ІEwú0|)äĠœ'…á¤VĦ{é—.]È%póħgNŸ¸ç̙çΜç,ú ìž8Ëħħ'Dħg*êY+RıĜÓgΜ†êv—WĞ1ÂĜ³•Ĝ3âƒkĠÓ`;-R×LN·}ş0‘‚›¤ùDƒ,hĴžh¨žf $¸rŞŞgWRïİUOŸ8qòŭ !&^ŞçJ#’tŠw½Ô@ĥ†"ÎX^=+Vħ'šŞ§×´Èdi–›ËЧW֔1`&AŜĝ•GÈ­ï‘E‘œzT’üŠBÏÈ"KÇD/&‹ ˜,2`²È"&˵,¨ÖëġማÁê#ÈĠ\ÌŻ×u§ûğŜÔ·FŻwÒh7n– :,`ƒ„D˘°d`Ċf0Lˆ‡% ‚“ä`˜¤žn'b@u3LŠˆ2á¨Mġ2Œí{E€͘ŒD™HFĊ0Nż\*×3`A ÄJ’fZ XHíÄlfzÁIâĦ˜Ô[3IZD×2Pì%ÜOŽR~‡× Ž>!İgiĦœZ²0×퀍’ä(8ÌNÊĊr}ĤÒë=,`X0¤ĞÌÂèi,CGC£ŝ• Zm(¤o  b¨w„fLĦ$EGA ‘ éSNo­‰Ôx0](¤cp2&—Êu_ƒaVеĈD¨@x&d³ê!`a £ĥZóY­ŠñÚH&iĊ3<`Ğ5í\`jj°žĉÓZ­ĝ*[T.–ë0šħÒ ­}L$8QL!€Ž‰;A8 Í@ùƒ€++cLñ€‚Ş ™È¤†.H¤<ıXKÀÂnĝô"GZŻŠó„˘NnĦiĞŜaÍxġ Ġë)ñĊ@ˆ‰†§@2A0 ½>ÁĈšƒ,× `Ğ—dĠV²ÈÒ `’†GE1LX­P8fŞo(ùĜ [`–KáĈ,ƒ¤ña5átĤ£Ù ´bàZ>A–ÂDÊ"‹ ˜,2`²Ü €Ñ”,²t@hKË"K¤b"Â!Ŝœ-mn‰[¸X*ċtYÁ‰Ê.šĊôÄŻ…8Ċ,Ò,„íMĊvŠtÈ.K7Š*óW {Ë×Bĵ,`ÁrÌ”š({Dz˘ —e—VißĞ€‘îr™J4–|ç³ó€yìŽ|ÒîùĵàŬ>ŻÛ ŝú8¤<>Ç({}n°żàô9áN˘àô-Ĝá) rĦv?`A̙…XŞœàżÍÑIÀÚoYXk1tÔCQ:ì# Ì%áxE–Ĝ푴ŬNĊì†N;äRŬ½H‡ÍMdbcM¤ôél6_çM¤ĝƒ~{¤\vu†½Î[Ċùsú1Yş °Êƒ˘Ú^¤'àƒ½È€ZɄÏGÜnw ó&²fHÊL"GœI—°–òçóv°Ĵş‹7h%­~²_ρV]‘}²ĤhšûRİX¨JħÌÒtĥvJH­DfÂ8Ʌèn•lƒÛeB "_^HĈADƒ á\ƒÀHvµÑTg'2‘Y.0`s‹*vÚDêŠ ‚j40Ùbƒ)E°G’Ï7˜piH‡ğvT>WF…Á5u‡—W ċVnHuxÂaèZ>‹€%µÚ”°ğożŭö÷j šLĤ@-`!HÖV‹ğDµ€}7³ `[-£6Ò0şÁ#Ŭ-ÎÏá7w[ÎfjÀè‡nûëŸ~ċĥ›nzoRXÂ` DVCBX’ ÄBÀ’F´U!`ád—XEîLiɽŝâS/V%#,é¤Ò•Œa„…–hÄÒê ; X2|m$Á–…ĉ  XòĥŸŝímïĵŬf{ç{cUÀbf˙[o½úêĞs´ X|” ò°ĝ¨ïuŞ"ÀRċîYmF%ŭıĞ˙òÀżTċg€%xBn4î°Ĥ€ĠùB–°@ƒ@C `ġìš È ğûŻż×í$PĝğSÀ|Ä[€çŸ~Ġíİĉ#^‡Ï<Ï/8ó| ğ;Кݰì?ġv5² Œ@€•ŠrZ€é Ħz–ôµĜ5 „€aµ,^÷€1‰„°Û~z×{YoIOò€% °§Ÿ1ĈyÀR†8hŠñ€Q‚Àè €1 ú0iÁ~>˅’…ò•¸HĝğŞĴì·´a f7BÂĵZÖ×YËÖ`v#LĤ·oI%fŸOón$ZĥjnÀ˜Íĉ}èĦğ~z×;NJ܋Lš^Vïùgž~âys0c>ñÄó£UÀށ^ 0ùŞŒ ĈÖĉUJ$aL9ÊE£‘Jh l ÚŭT2Ş £엉¤‘bË.I–“Ĉ ˙Ö°ĵ1§°°Ċf)&…€ĊĴ…˙€wWú˙xV˜7ä1kckó†ĵ ]˜' ×0AíŸÏ4̔ärı•Äsĥ'-ĴP^°L´ Xü½w}îÏŬö^?í´Qç‰,eŠhž~â³O|Ӕà£*Ï˜UÀĝÀ—9yÀŠÖ¤TYSnÔP6är†’5‚îݨôa6"‘ċ‚î’ĦĴ·ċXÊGɐ³`eCĦœ7` ƒ.³èD€İÔhRd"c–Âï|é—ċÂO~{ŝ!`z‡ÏÑ'k^,Q˜ŠcŬĜ²nÂSj°Šˆò€1TĴb"™{oûÜmï|˜qÚl£•Ş6òñçAôÙ'žw ùĝËl [ĜÈ·quüĵ Óh,E†7‘E¨ x9ĉħ8KpŸŻŻ`4‘PĊÖ° ´Z­[\ƒ‘NŸ1)2‘°ôï|òµŸüöïż" wğµ€ĦÀ:ÀlXtv`ùì2RĤxû€1T0&òŜÛŜécÓY£À’£WAĊô|ôôĞÀ’£ (0dä!`I‹— |âU1`x€HW ‚5€%ûúĈDuZ-L*Œ&E&2j.”_ĝOŝöïżŠÈDê­fËÔ­™ÀĴ'fM×f–tWĥĴPöähë€Ñn/-L4L·ñ›Í˜^§3j-•ÖŒÉü7ĊŝËgY‰Z3fhàÑ@+hİr€1€R>[Mš eP˜–2N ‹9’~G0sr´€1Q7]mä“: óúôV·Ó›İĴô“|ò'ݽòc!`:‹@5m0ŭ¨€Ó5m0.°0³`£™X9b+ĥ˜GĞ]FGélͳȐĊ¤5ô‹W¨(b³ÙBôg K´ú¨HÈ=*Š‚À`5,@ƒâMEÊ)e(—l6şdĞßÒBÙSfÊ!›7DyÁ>ܸ^$eƒ!rÀ³`ĊĴ°°żóÉ˙¨̨ÇÁžÛìAÂħdÄ` gpI?WFġŝ_˙‰†̈ÁĊO~ŭn$šîĴġ'9ĈĞÓju>A –ŽTMd€LèG –Fğ“&£Ŭ’䳉EğAEe·$ê†)Šh"ı}#ŞAІ›*ê÷"W75ç˙ĜÇgabÀ46ĝH)ác…D,5 Ôk#€j`˜ „D%ı@˙ġXĈFQ 7Ş€e骉ôĞHTÄè0êmBÀ,qŝ!¤ÑèĥfWó& ÏĤàkĈÁ˜Ħ’ä”ŭ”Ѝ¨Q,Ö1Àŝċġl1W`·À~ùíßĜÇßùĥ°ÚulK qşÁH~]àġXm#ŸĤ„m0Żó8,˜{Ó ĈÁҝŸA™ „™ĞÁ*Ċi“Án‚€e‡żJ ì²GEĠĠf`ËN׉š_{íµ^xáÇ@„€y=×^]`¸aàuXŒĥÁ½3Tµ’úp-` P†€Ñ ÚŻi†Ŭ^u# šĤ żäWh6òtġ,á$PíEFia#ŸÂ1ƒ³Râù`¸`šI†âÚ`v-. Ĵ›pˆ!`Ñ@—HP¸ÂQ`˘…ÛdÀV)dċI‘_Œ‘g´^Ï3ZW˜ƒm S~ô8OşD˘1N"hÂĦ6ÄNôôÀèPƒ °ċE5ŠŻ:°{K5¸Ŭ@x™ ¸°÷DÚʉĈ×°0“`·JŒĦXĤSL™Í'Ët!•_+À*N°“½œïÓûARj ĦFá–/½ìíuN4ò +ž5‚„­`ÜÈP–À­mÖ°²Áau–Ö 0>Šħ&²K‘U ,gÍğS7>:Ÿ†e£ùe`Sv†x* kXRĞ£`t·8f)ɀQ]“Z ĜBáÓ °€ĊXwÈ@ُaX"âŭ#C1kĊ4`…5̠ѰNé`:Ó8f8l`/^e1Tû9+Ġ@Ô\ì’4„l‚4Eĉ3È>Žŝ~†Ogz ÜŒŝî]ÏĴ‘‰t†*5ĜÚVqúH‡ Ŭ1V•°–*3$óv°{żËĉY°/}òK_úÒŝìħ/sB€…‹Ŭ‘†(^MCÎXBĦ³+€) ÜŒŝî½ĉ&Òj"Ĵ1MrÍĞ8}t`ĠQ‚Ŭ˙ѽİ V^_ú$Ó­€iè6À`2#êEĉáĴ°B”-ċ~y ù‰äìŭWŻĵż0jüÒ^““8–èHşĈ;}t5`żùÀġ€}é?gdÀş°lƒ1 œpM&xÀî}êݧxŞ0È×Ï˙{£à;Ĵ})0ÔSäŝVğÊ!ô÷3×-`§Œ9â~‰ìĊ÷żÈ0~䪰oàŸüäoğ{³ê<ñ…Œí?˘ĦkŜ‹\_™Šu£‰´hµZ_ƒ=ġ‘ûĉ#ùQ‰d~ôb7›Èô(ßgÓİ IDATHƒ™˜ÈÏ(4=kx´Á¨nŒ²jĦ9 ĜßÊß×ĥÁ˜{˙ĞÛ`I³:ô ³8z6`t9—n´ XwSdŠ£,`ßŝÉÏŝ“ßÎÔöÔyħĞùi[šfËş7u`Lžb·ċ§x=Av“XĊé£Ğ{‘ÌO>m¸¤’Ĉö~´@Ghcô"`Ċ˘çŬXĥa·jŒÓä/—C&˘\ĥ‡LĊ²;ÓC&\*`L:ş†)~ŝ/ÁıS*…ÒSì7ß˙~XD­Pşğ0Ôğ°°/§*OĉŬ!Ŝ³>ŞĈ<0‘@µI5‘T÷µÁŠ•|gûÉ>ío Ôa Yiƒŭè7Ÿb˜˙öŝA ż Û`…JRDĥ°ÉŒ§Œ×|şŒ] Sȑ$™,Sür9Xš À2é” ïôÑE€yŞ3,°Ÿ˙=”ŸWJ€ì)‡|êİ+]˜0 ‚Ú,œr†=]Ĝ²&Òç§<ħN…‚ÊA™!`^V•h"i –!ğÄ1ƒLŭ-Z›Ö5iH ’Ŝ.éì*Àô"½–\ÏÊNbaKô"#°9"I·Äa FžÑzƒÍh­éEĤÒ˘^dUZw¨Żsú‡ĝğ0îEâoĜµI ŻQV;şìtĉöGò ÜztĊRg$—kçì˘İTÊŻZÄçš Òż×’mçIm2ZJChAò7ğK´Ż`kô¨¨“âóäÚùécÉçbyéßkl+Í^_ĥÓŭÒ³Ì^™F÷ˀɀu0~/(&Ö!À(ZLĴs€,Ž5,-è.†2`2`0³Vë‘X6aVqëNàċ"E•sX‚–s].Óı‚ Ĝ Ħ3ô~I€¸AŭêÛV`^‹%V›ġÚaħĊÊZGRìĈÁĵh“X‘,#Ĵò82i+ƒM›M¤Ü‹lµ Ĉ½p9–(0ÌRŽT_ıŒ—UfdSazNJcû2`×7`E~=Ÿ–+‹k°tM âk°\\ì,ìçÄÓ`"é3›ƒe#îÁ‡Ùšğħóñ|ùB­{‘ñ°°YʗK4è;f³ş\ ³`OìF,À—n,e$yÑ9y Ul#1uVôşĥNwH?Ġn–~.1ÚÎM[mmقK>ĠÙu€ižÙiù£vä ×äÔ?ú‹W€|äGµ˙ÛŞŝ~÷ğMbżğâß½™Ĝ{WüKv`jK‡Ċöċ?mGîğ&§ŝé}_hçĤ|°­4?ĝ€äS?ß}&²…ù|’„YjG”~ê˙/éç~á/Ûıé/ı­4ġ˙‘|ê7`#_LLLleÀh³ı(&Ö1ÀĴ4mÚ`€Íğ”Jċ kQ`‹.—DÀ]#J×ĵDÀĉǔŭÍżş9`óKóí’àjpkĜr/ĥ)ĉü~½$À¸w }p[^➤'‘á|÷B Ġ}i€ )ŠYI€Í ġ)Çf6?¨èéS(ĉ$6ÓÓ ozN*`ó}c½3m6„VäYWÀpİ€İÌìLêĉ€y\ÄF s›7U÷%ĉê?E‰€MşfCR›U(Ĥ\cà$À•³K.…b³DÀĈ6j{=À†ƒccŠ‘ġ4‘ĈLĈ˜“XJ§×„ŭ›„Eż òk4N­Îœ6xġ:°Rz½&TŒj0°IÛ{6ù£p€MëQÚ ìkSĞlqG—DÀĈ ŠžY € xL1& °9Pw-)ú%64‹Òìj°ıÁEX‹ Ĵk#t”"ĉĥÂê m…Ù£H0LBaN˜‚jƒ6…1ĞŞ€ş‹Ŭ` †ĥQ…Ú”d›ƒÑZiäϏġJ5‘Z)3ù°S,Jläώ´a"!m†òn 0§o¨k†)€‰´˜ÔÀ°´Ggp3<`ŒĠ¤ÖcÒTS›”ĈÑÔK›LÊV“ ˜kpl¨™İiĜÈàĝŜ!i€ÍŽŒmn°YĜ„k°İÍs ÚrwDy!ŭ]˜E0@şÒ°t‚N$´=>0Ğ*ad£iXƒ%ÂAXìSjC"°1 -Ô`,s15/°ùÍE$ı8˘è›_êQ(ÖÌÓXÓ_E3Àĉû•Ê™ħv[YZìĴĴÄŻòê&ÀÜjUtĞ 5˜G֙íꊉtĞE]óâŽ"ż$Yv Gò]ÀÚÌ*{ç$ĥ8¨rMż¤VûŸs ş¤™HċĜÜâfċÄ^do˙Ôü˜²ŻmÙïrıêİï p^H0ùQ‘ü°[LĴâBÓ2`2`Ìg6dÀdÀ:òÀ•“k°x˘ħä1Im0ĤïĴŒ~÷ÁväŜkrêƒ÷µuÓoW&pú,Ĵ§ÓÇÒ,@kލ)ÓKkV˜klş~Hsúƒu\ŭ½m˜È1E˙\›5Ĝ0œí´sòKLQ*`”^ŻB§ĞŜ§&uèôáÑéF3Ĉ½l< ,púÀôÚïôÓêuóŞc ƒö[jƒ-ş›%›H‰€Áï]” Ĝœ ŭ,Úlħ}§EXí÷Ż+`>sB*`NKC§c 2£utE§•œemĠécl`Vö’›ë“ ĜÌĜà”TÀ¸:H:`s Íkáôħ΀yU¤ti5×9}¸uFOĠéf;}˜…Nfèô^6›[súè›’ Ĝ bHڔéb`N:`³³ÀDJnƒ ıÖÂéµÎ€1şĴdÀĴêrúÈ9À2I:×*+N6UŒsú`’XƒĊBé#“NXŒsúHĤ1,ÖJ 6ÒZšS6+è&~‘½Ee³İÇÍù½…RڌÖYċĜÒâ TżH1Y ·µÙžİĊşĤÜ–Î6–"&½‘ïT{­ê³ĈéĦšH•ת­8}UobÜ*;9޳@óËÁ;}èĵ&]Ĵ…X§)€ .Ôp3ÇÈf€)Ĉ%ÎÉ_R*6mV(Ç\’ÛĴèS4íF°p‰ú9ù\:@2`ŜuÇàß@Às§ÑFĊÜîŠb7wtÁíNş£i°`À>¸’ɸ£·Û= ܧÑ1ĞïE*‘ÓǐÀf{•›]ÀFöKêEÀĉ%èêSôK Ĥy¤m§SŒPk‡x:<läÙ˘ÄĠuĉ\ĊE—kNR/ö盜ÛÜéC9ğ4ß'Ñéc Üö’ËĠvlxŠKĈşf—ÉÏ"ċGE2`2`2`2`2`2`2`2`2`²Ó‡ìôÑñ1ÈNr ĥ*À<²‰”ëè@k1+&Ö9À´“ìÙ-ÖAÀbĞyZ$v½6âšé`͖Ĝh€-ÎÏ÷-JlĴoP"`‹ŭŭ}’>–ĉçg{Ûrú˜]l°İ>eŸr}>$ĉsNä N İèôArN"au_ú›>zšÎ7\Áé£wJÒ*ÓĦ‘yi€)úû$Ż2 Ĝëéwµ ĜŒb.@ş18}Ŝuuú‚^Eŭ.É&Râ:ù³°Ú”ìônxĴé£ĤóÁ†WxÄŞ›‚/ÑZ_À2hkÓéói:D™W§·&ŸóéġTÓk#UÀÊ;}ĵà\çӀÚ-÷[xrî‘îô!°%ĝ²Ž‰€Í92Òçä4ϵ şÒPŭ›$şÔmÍ1*pú0qN£§§yuN{‹NhVĞT§×R³EĤ›6ò§úšÎç_Ħ‘ż¸ı§×Zĉšì­O}·úEÚF55N”Cg8}à£b§QĦÓÇhĠéct´%§Ñ››ú.ĜĜàҐ4§`ûáòé_%3ğynP:`CklFĠ_ĤK³Ş£Èéƒĉ>蝊k„NQXІ5X9}`?­Á˘œÓG*cÀ˘êVœ>ƒ(’LäXĝŭö63sM–ĜÜ7lóĵ$À\Êáù&Ż iîôĦœ&r¤MÀ•ŠÙyĝ˘” b"Ġ>‹:ìPŞŠÓGH;êTUM¤ÊgUY*N@ĊŒÈé >|j;çô1Şó™tñz‘SScŠĤıŬÄéC18ĉô1TNÍHwúZt 4sÎnÚÈŜìm:},‚Ĉ|aäzÎɗ ˜'Àx1ĝ7@z˘Šß$İlލÇáH:˘iGÔK2^‡´ċÁNĈÍ8n&lgĈÉÀc"-B›yNúÀ˜D§%×0scS ö+š1ÒÜШw¨g-ŜôĦS+`ù÷°{~ĥghqĤG’_ä’ 9Œ4ñžh֋„žó.i|”Á&*Í_†ÎišĉĠ´ÁĈ†ÀŬğÖÓ郐gSÈÏ"ċé:2`0LLĴƒK”dÀdÀÖdéşħeÀdÀşDÊNpú¸ïväîtúĜ‹”>:PƒŬû_ۑ{eżHÙDĜRH—00000°°Ûïòn°ġqúèì“úĤÙŝŝŝ‰€ı†ĥ¸84°(°Ûño˙öożĝş}Àúûú6ĈŒV’sú“pkâôáOùéƒ;>„Ûl~P1ĜАú"†Ù~8ßzF"`ƒJK`³=ÊÁĊ˘4À~ŭoïV(6ŭâš5¨Á†0ĦӇg=>\ŭCK³#R›š‚€ J5‘ƒM§j7l°gfÉhîUÔ°Ûáßğ7"`…RİT”XÓëâéfkƒ:ô>™ŜJ›}zÌŻÇ2ƒ^­†TŜé#ĦÓë3„ŜŻ…Npż5§ù6^%³8#ùM0ÉoúXZZaĦû&€)7?êïŻ`‹pµ˙ġLçĝ F`vs§KÂ@ò3Z+;}l2@§˘E§)¸P´DÀĉ§ú{%6>¤żéÖ+½ùŽï˙×kĥ¨ZÌĠĞì]_À´Q‚' ÍDâ–:§ğÎì­:}ħӇE[LcNÈe7mħ´âô15Ô;ğ(°Á‘ai€)›'.ÍÎ.6çŬ°wüíżĠñĠó‘{6µĜPŸbjVÙ Àš,`ÌIÌĤcb§ŠĤbjŸ W…y§ :}(AŜé#£ÁœÓEôáVœ>`#b^Ş_äfèÜĴlâ´<`c=€‘žÍÒù‹½S€9İ€ûĝë===5€}ìG[lÎĜİŸĥŬهŬ’³ĞŭuÄĥ >,nUĠDŞüb§?f`œĴÓĤóĞ ÎéĴóWïô1ÛĞè›ŬȑY)€ ġMÍız%ÍÉÖqVŞ_ä b`nqhhF"`ïĝŝ/|E Ĝ}?úÔ)e 5X?€k°§Î1²+s“ŒÛ…IÒµSüf'QÚ<ö¨ÇnOĜ#i{Äޝb°“ħG2vğ“ 8n?a·äôħYÑ´1ÔÄDB˘a‰€)‡àĝÈ˘4ÀàĤ›ÍŞoĜŬ,_5V²ç—~ĝßÚ`‘X'`T9]Êĉ6Ô@ëÜ,0Uà#q uvqi~VŠÓÇ<ĝN`]jMĊ̰˘wN`êwıŭöwԘÈOüìgöÀŻ´:’?;·Ž€ÉŠ6³ÈžOüg?ä“ɀu0 Ÿú‚VLĴ3€}ŭ‡_˙ú×?ñgŭ2`2`ìÓ€ŻŻúOieÀdÀVìżŝçċŸ„}úӟŝĜÉm˙ù^ùM-ˆùFtú¸·e€!ùÔǞşï^ùM²ÓGóĴe·µż„€AùéO}äk]êĥĉáEÙDnXÀÎʧ>öħçş0‘°È€mdÀ~ĝŻì /'Ż-`™\c)mÀuòeÀ*€Ŭû³ŝ —ŸŭÖÒ_|y‰t°fKȀ­°ùĦĦɀ5}ĥ%°O=…û^şïG š;´ĵĜ‰ô ’Ë, tnË ˆD‡ ŽŻìKlqĥżH"`›ûûû›:Œ4™Ó×78Ğ‘˜KÙ;0ĵ(°9pßu3ú˙ò#÷żD=ġïŜ÷,8"ĵ|ùe‰ê„ŠÙu  íÎÉ·›Ö÷E ¸Pôˆ$À<Š~iN#ŠÍp>ż´­³Ê™yéoúp)—ĉêg\?˙ŬÒs÷ŭìSßŭVSÀĵz#½ġS5ğr}0aµR!Ò·@„­q+šoĥZgĜ B ¨İˆĥÇëSjBiĞg|xĚd´żzÀfFàÔ9i€ÍÂ%%z͎,Jl .<&°™ŜİF€-} |ŝ×SöġûŝŽ,-úÙ2 ÑTüWÂqZĜҌr]§L¤FhB˜!…mŠ)ӘM PIŞ­~İ İÁ†ƒ X0B2è)ƒ2žPc)ÒĜFH‘ ì[[kƒI IŸT·µĊE—Ô9ùĥƒ§Ï÷,ġöĠ§Ş0Xİt—RċrħT,§ó'(:kñ‰+° §8 ÊMO„܈/;SÌĠżydDıQ3İ3&5mVû7q€ùuaÏ§€™U³ÊKéüèĤ n`F7‘~­‘P2FFé|ZCFk W ĜX ˜ÈaI€ġôÍ-ÍH{ÓÇTbhħ_ÑÄk·ù:ùc‹cġ•Çjë„?ŽeF:ġÀ.P°r l`y Siä/ö‚ŸÖXÏĈÌdm§ük·›H,…ĥ$‰avE  #MÁH #ÍcĈ0Pˁ óSfd 7ÉîG0 ½È™™^‰oú€ÍÌô7óykRƒ +”½}›6Âyş¤ĤĥgıûN>û-XÉÎFéxÀ0A/ˆä]ßÌ˘<]§Y/Rİ–ĝĤŝêžiöfüž!“è9ĴP ÷5uúhXß bh°İÏŒ²f˜·#‰ŭe=Žı:v*ë~_Ĵ¸á[rÍÎ/-JtúpÍÎ5?·`³sÒ-Bo×Ĵä^äüìâ|Ó4^$È1%Ş\Œ3X™.äâyŞœŠÇÀggç]³³ëXƒ‘oI~T´AŸEÖĈ‰-ĥ,7şŜŠ°r@žs½Vr:™ulÙ‚XDž2}}JSËIòÚĠ`‰²1'v=öGw4“k˜›°K0‘jÜÚYħ}ùÏۑû¤Ÿú@_ûÀŸĥsÓüÇmù J>ġó\€.–“`"µħËÂÔ_´!_{@úı|Múı~µğŝó?oçìżĝŸ*ùÔÏË`²‰\Q*ûEʀɀ-#>ĵ">0°5̛+q’öʀIlÑ%ĥ,`|ÉGğ°ħĦĦĦ1‰€Ás›3Ĝ°ÙĉßÛÜéchsßl€M Í `cë XI*`üôš†[3ŻöÊA4³Â +N×QÎ*z¤½écĴ§oĥOĦ”ĝ,ri~VÙ?+ °9¸8bïĵTÀĉû•ÍÑŻ°Íŭà cŭ=ëğFĞDÀNÄş:}ÌÂuž2=çB)$O™^Zê‘8eÚèW´áôĦœÚÜ×t™ŭĠ†fÑġŻçš¤:$0Âf£ÂZÏgÛâ6Öéfó1ˆĜ†ħƒ€:},ĝĦӇ à'˘ĥdà~Ğsòżˆáš65†^‚#°)ċœÑ:Ô`‹ëKKŒP1CÛCNV túX}›H%¨;}5ePĈâ*}Ò¨Ş+Nú ĈÖ`cŭm6$°İv^ÄĴd;Nħµlĥ€ÑM–\ƒIĴfN~RżÉ­:}k> µN8çôÑÊ:ù™!PÙK}h€ŒIkƒÍġ÷ ÌÎJÌlÓéc~Pı€-v°|f)ĥ˜O7rúV>À"§·Wßô>Îéƒà›Zzƒt éÀDöğ¤6˘è“îı42<<<Ĝԓ )`‹E!kX'–1_^Ṳ́Ĥ]§RÑûŭB§šwúûáğŠh‚uúí=FÚÄ:}è}Z­m °ŝ~`"û¤6Ĵè‡ĉµÉĵúëWôJš“>@ÑöJlP16¨h0èż€½3Ú£ž4Œ‘ L¤>Éoz‚÷ĝ›ž4é!u0¤êA-gÂT~JŻ70íGôĠSôġ%¤ÍÉëQ(áıC›êW(‰THl`“c³Ô^$ë3Ò&`}Èé£î5<l#´˘–6:<³4×ìÜfü‘™ùáa‰~‘écxX˘Óǔ>Òĉ@ë €t`¸wxNìş{T´Xçjђ‰œ]ñôĠ_V2·äZZ’“vo¨g‘2`2`2`2`2`2`2`ІĈ_&‹RÓx‡EvúhÙé×Óé#ɄShk6ÄjÌKLí°x§ÖŽ˘1äôP§€_ÀĈzPŬ5°üŒ“ö"†A´ô äUĤQëQÙĤÛÚÒ Xmî(ñ>ákÍ3”¸ 8},œ>BAƒÈé#(túB§äLD‚jC‹½Èİ6^†% °ĊÍmĈÖ`Í~+6;6Ġf#ħo9Àĝ|^;À`KÖ8}Ĝê>|Jm„Ì9}@˙NJӇÍĥÀ9}Ĝ5ĥVœ>f`ŝ Ì­3`ó,` é&rĥŻ 9£œj{˜bpyÀühğ†€ê)™­qú`é"…N¤èMŒ™Œsú`ìFXì;zŒ ïôá‡ĵ­°Ye^Eìš}և)¸×ùI 4ûĈŠċ+6£Tĥ?†~_‹Š^W`v½ÙĴ÷KĴ”ËÑV}œ„syOpġ€%“9á0…` zŝ%p£Ÿwúëġ8cĴlzżQŻ#§¤rN)½/>ìÈéGÁc|-ĤèíïkÒlîôés’ĵŠĤÀıŭ½Mܙš ´(GĤú•Š&ĠPS§¸²ĊÀl³·@ĴrNËĠW·ÈŒ6jµ„´,ŸNĉVĈ8Ċ¸†0˜‹qÇBıìOP+šHÀW˘+ĈÁf†‡g—\’LäÒ°U>ĈÀ‰‹³c’›ŸÍĈ)İN›^=ŠĤƒpĞhíWôĠù6A™4Û`gŠH IDATYîùwD˜%ħÑú ĠNáÒ[VÙùY&šı-ÎÌ4ËïÎGE™™ùٙ™ÙvëÌ-ÍÔ>uBüĠ2`ı<”\‹Ċ’ċ,Ğ€éb1=2‘ISÌo[ÑŭšH:Ngċg‘×ċn‰½H&„J—íá-'ÓĵÀ40Ĥ#ˆŞ‹:LìúĴÈżħĦ%ÀÊML$ g³•ÓŜĠ…ġ— Ĝġ ˜ƒà—XħIyʆċ˸…Äò$f)•­->ìV[ĵX-ŽNˆŬq=‰Ġß}R-7[Lüën0Ĝ‹LÄsT;Ïëó ĴäìŜ6˜£ëLd|âàÖŬTu³‰Äğş‘OÇċ^äĈ6‘èùcg bX\ `9šʉhYšK—ĈŬ]ş£€-ĴjĦé:ÀìŝNp ı Ë b vJıkX"ÙXòiƒA'auDT–V$Ù}"¸ğLû€-;ŬËP,J¨Átċ’,×£Dµ6‘§“ˆtŸg·,×FkX>ÊQ2`²t 0‰kS$YG1w `ìJŞ&‹Ġjm´ÄŞ„ÛE˜Ú „×]Cit‹Vs£@Ó2 µŒ.²f Ù%€9Os˙Èĵ&0Í7ˆ`" ³ ƒkkò…úïHÇ•7%MÚ(5ˆe6Ĵì ÀÇi&„˘ŝ ĊÙrXzh‡SĠ‡…‘t¸q §ĝ-ͨĥ$!ĝX)Òġû|>7£o§â9šJ˘#ĝħxXƒœ1ÚġƒËx=v³½‘\ĴMÀp…‚öŻ_ıíîğozçí‰óàĉQ³Í#̋›@ [ X}`Ĉöá€Órzƒĥ³³ğè…@¸ ñÛÈŞÀi4픝I°‹E^"U X<Jˆ6!`‘<ĵ h'ûeÀÖ°I€Q·}ċûŸğíïxÇ;=BÀܖ`úċ—#V‡°Ú@˜gF­öj`ú}OĵÌî?ñáX4_”.AGĠÊÑö*`ìB£…(A³€…áôrÚïĤkKy ˘-#Œ[J2êóˀ­Á›> —Q°ŭÊO?wÓğ™ÌûŜk§+€ùFSo½ġêóÏżlñVóóVO0Ò\H“•4S<`Ċ6’t*WLĠVögÂĥd°\$Š'Ċ€…_üÍô‚ŝŭâgt=`É(ċôÑ2`ĵS›ÓY”Ö‹f²Ànûé_ßÄòŻïN€qò-ˆÍÓÏmX†|ĉ›\ d ÷WSiŻ¤Ù›è `q°é·˜â°dĉóĜìa2,,áûÁ%¨*u°FŭÁŸ0nıÒ Iş N0NĴĦ.­ËDh`w½—?$–4R¨Zzú‰çMq°”ĦY˘ŞĉhĊDZı+ڌSG³z`3¸[GV‹¤3ÄB‰Œ&h˘µZR"ÉVbâ$½Ñ£óúÙúU–àÛÉd°,S1‘ïéöÏ}˙›ŜûŽ ùIÓëŻ"jžx~´ ˜ħĝá*`‚Àh‰ôè=‘#2kX&…Œ˘0ß3o‹×Ÿy_ÄX,GCž„ÀD˘iú€J+ß°ÈD†s4ò ,f)Rw£–J7–‚ÇW1›‚tş9qúyIUÛ`Ämû·ŸğëswßNEÍú€0CêyDÍÏk°ÔË|  ĞFĊ&ÒkIĵġÖË/ż ×q]ÀˆÑ$1bÀˆWßUOŝeû ĉ `%:†êħ`ĴšHXƒ9 ‡Â 9™ÈÀ·ŝäYXƒŭòµ×žĠÉ&’lUóÁ"Q~žZ$ÌתàËà7Ŭġığnz_2e&ĴX m÷?˙4 ĉ³Oˆ íUÓ•ÊŞĴ²&Ò[˙Ï<óüËĜšĉњ,m¸ĈD"0~ùÚÀJ€X)Âíbé1…ĥÎDŝî7ŝVü ˜h  ‹{¤ÚZĠ6MÜtÛMï£FŻÁ`ƒu׋$Í X-=ŭ²ċĦj/2`Ž‹a/2Ĝ öż Ú;η`O?óiMÚ`>½ טÈ@ıùzíƒ<`“˘ĴĊ{-à™ÈìBÔ ‘‰$í·ñÑrİòÚkߓJÚ>‹€em0 Ä;ßGĊ-£Vk4ëÈÊ8˜ßü3Ï?óù}O?TGù@4Ö 0óá'^flä[ŻBžxúÚ4ò}X°ĥ‘ogùzí£`ÁXÀ@ĝ³‹L¤Ug·Û5 0‘ĥ4 XĜŝÁŝço|ôá³Ï>üìkݽ"&’LH´U™ƒeÈ$Ġ¨uL­RšŞ#ùAû{ŒâĦ˙òaÂQÉ: Ĉ÷~>ɇ‚vŜDš?췎úÏ@Ö0&Rߋ,ĦŠç•‡üAX*/DJÈn C&R‹ÖéQ™Îöìü3żù“żù›ŝĞï½ÊżË€µ(L$|ÌËFĦ-:Ġ™ –tš<‹¤ÓP'ßcÁ4XŒ ĵÇBÀ@îY$¨·Ž ˜Ħ錓xñġÙg<ĥ SÄhöÊ+f°ÄÏìżfëµW÷°DÙהè]1‘/€ú ÈüÖoŭîïŝĠ+˙ŝï?ŝ °ĥcĠ6˜ÇÈ™:-flTĝ¨ˆä~3ŝ÷XmN0RËêQ '$8Ò!4Ä@쳟}zùK۞Ħ!_˙/ŝáHŝŝ‡PƒÔG"i`“Q(¨J/òXAÀ‡ùžQĴ]À²9A,Ħ×&7èÂBÀÌqŝŭZ+0ˆ°ˆĥ †íĠÀ€ 4˙Ÿ~ĉe˙˙:Vƒ™ˆ‡?ĝчÍĥŝĝƒAôĈ4ÜDĠ¨&òñoŞöĝoFĜ7^@|ŭĝo>(Ö.`™¨°‘ŸÁTÁu˜` 5ߤĞ5“ çL¤žÂq0½^oÚÔ Ä7żé4ĵï³Ġ.`ùŠŻ˘°ä @~ ċŸ„€XŝŭŸ&ò‹·ŞŒTŠĤRzµê‹çMä³-ä7~ë7^A—ù§ż‘k°ÊŞdIĊ„Š(Ğ3u+Ċ4Á@F&RíÖÔ`à€š@§Í†3ÏĵÏj‹-mxj‘8éĞHuşyÇw|ôŽùà?Ż–°÷½ïŭĠ_ŭĠŸL¤ß'Ú8À‚–ßúƒo|wġ£Ĵ|ƒn°ê@ĞÔ6%žp!ÉûdXX$-wÖDú˘À:À´Ö$ٞ/`D ñêlŠ@UâL°tú ‚#ñЉ¤bâ­2Œĵ×~ÍOV.#ÏĤàEçÁ’£ıE‰!`tƒİ£)b6Sž 58:Ġ00X˜HĤÖxÊt6Ŭ`Ök´Q ,Û Ħ‘‘J$D0$š€”GEZ^ÍċóıF+$òù<ŬRù5•ôŞż˜G§EÀi‰Fıü†‘pužoœY$>‹,oÉ˲ĴBG)ëä³K,*^Ö1× `%™İ€•²œ„ükn" {ƒ–+D ċkâómV읂{,rĠi)߅€UĤĤŻ9`ħt°´~€e…ßĊ4:‚)ä—[İPƒAAp…LŽÉ°²LJ‹ıĈû,Ëèlħšĉ˙Ċî 5żÖ0i­Úx: #L’Ĥ“L$ôı-IJWB1L–NsÇ0™l<“ÌQ Q­SJ1)†Šy," } Á`‚ܘMKĜFÉ`,Lš jpë &­ÛDnLSݏ֋&’t8˜Ì%sàâ)\‹ƒŭ\.•wL€4€šŠ†ĉN5˜§™Ê³•N1WÍoşQêÄÓS ¸–½Ğ]ĞÑj­ ݈莃­s‘H0ž Ħ‰‘ÙÌŻƒ/óìÀ6éu*( ƒŠzÙ9göŸÏçԛ-;\À-œĜ<Ġ‘OŸÛjT™Œ*•I˜ċvUK˘ ‰Ú˘RY0• ƒßeb@ûÂS,­£2–êĉÊİT8¸ŻTÂŽ@²>çóyĵµ /yVq£z=żGğ0RĞĠ˘ŬXƒ³,×ĥ(-´ĈˆÊ,ÌñV3Ş+ŞĊë¸qY|I\Z£-|m][”żoÌ Á 1[*ĦĠG-Ñl§¸^|On ¸u¸gwos‹bmn² c˘kӐ$éH‹ÁZAI/ۀĥëxÑĞġ°„Œè„@"ˆÚHÒÌ^ š‚Ğ‚XQ†—ĜAš8žÊ Lˆĵ)–а\éjž> àkÁWr„à™˜8Ĝ/Ìgı<5J’¨umBÊîĜ`pèġìÍ_½F0½VVD÷T¤ĦD~c¤0› ûĴQ£#f°Z †…BİÔ&2ƒĥnLşlà’…bMİq VY"•²§…½Â•Ï]ĤȞ¸ŠîĝŽpϰbu‹nÒË\²–0td.‘J‚sÂt†û|ŠÀhJF #(‚oËòŻ}Ûk=z‘RSħÂŻt¤¸TAÔ \Íıu§µ$…eÏmġ’Ù*# "m5 Ŭ=âë(´óBÒÎ&Ëu$n˘²ĴٚŻ–ġxŠ2`7¸+PÑ5_: ÀeÀdÀÚŒ^ĉ]Ĵ%lUÍ]0°ĉ€%—YòŻ qÂĦ\(2`Ğ3‘0BLĴc€%0Œ‘ğ†B_ç€]ûaŠü ÍC†‹2`Œ)ÜÀxĊ}&µ‘–ë`ِH8wCÂU*DLµv!V’ë`ŒU3U*Kĥ¸1Íe1K>—ÄáDH7Lô^ i5A†2İ41°e.K¤Q­ŻêÈşۀü²‚ÉHH·VZq6|–ôxìAĊtԓD‹™–|*ĴT.yU4™*k³x<ä uX úl`ġ NdĜ5ċ2Z³!Ì­Ž_ÁÍÛÙoż…½³b2J&*çċ‚Cê ÖŜ(ġ%zÁ Ä$ŭ‰t LE)ĥ°(p9IK7`ÖÓFŭ~’½h6CLĥİ%ħ’à1E, ­²ÓYò…RH…ïÌâ*=ˆj^!-¸ÍíO–̆ŠšBKvù›Ò‰&´Úò¨ö@³°ú(j•Ê™hr*ŭ‚òU6->Öä@‹·şµpĉĦNĠSRŠb3œ&TŒ4z•Ĉ‡Ĥàä_ *2šm¨!7€‰”àĥĤ‚3Ĥ1+ Ĥà1Ù¨ĞÑ҄°˜Q sSEP9B!Jkžì¨&JŒ*'Ü'´ÎDȤ24#5­WH§³s88Ĝâ*.p³ĥÍÒ€ó”Q“)gQÙ½ >XĉìÜoëò5!ŭ‡úï˙ĝĝĦßcó0 ŭ$ƒZŒÉċrAJ_˙ÂÍĝı Ú²€›BQĝu!mŠÂž³ü–48QR×9`ŒÔ·˜&˜Éċì:˘Töе1ĤÔŞñeŠE\³ÊE´ŞĜl!À­ĝUxCù°QcÑĞL”06C._rĞÔMž+DµjK\ŠëÔ ,¸z;‚3ĤцAQ{4j{“F\‰`‘*—“úHİ”SĞÈRݤĠ:ŭ¤ßĦĊ—µ’Ôäï?~è÷Ĝöz%pŜÑĦBżÌ"¨ ê ;”!Œ-Z*SZ•i% ?ŽRÚ d³ *•ğt}†•t­ĤCÓP İĵ•­òmŞċ[ğ%ÒŽ.ÚTŒ˜ÊÏ/Ò~T}°g‚ŞĞäPiÍê Ĵ+òŽI"À‚*äJ”·Ğ°t“DĝT*›_)ĝíj]²”O¨ùl9›Ĉ9öHŝÁ—ċ˙â÷¸,c`u,Ğ·iP[ ò\§òó;vĝŬ”QeĤJÎUÚÔuX"ĠX¤.€ĤpĈUŽŒŽĊĈÖ질ÎéĵġˑzÔ;µÎPÀT5 âX‚ĝĦPÄ 6)™E•­SĊş\äTŞ`³lTİ>mY5Q„M!'úBŻÊĜ4.˙×C&&¤e\VÛÈ4çFEÔé°@‰ÌV`³À˙C*•Ú}]ĥìÒX™–`"ÙJ/k"²ö·iSa‰ĉWk8+”XO­JO—é¨QbQJb{“ĈvQÇÖ` 42 ġŒ@¤Î@‹ËVlV˙•` ĉËU7è¤93€£„34iĤ–žm|î÷“3q&’ĉ<+€6˜Şŝ[AÍ^!ĥ˜Œaüşy0ÀŸšHÁ†~ş6‘„×I,  €Œôħ€i£Ë³Q(eŒŜQ¸ÊÏNj'UÀvŽÂì/…@Ù°vŽÔݽ,`  hêİAµU™Ñ~•ay™/z@ÇħÂ80a@+6Â0eiÖA(>êŻD‘}Q tµ ħ£xàzZ\,dQ#/TëeïqĵÀVöhTĈ\ž‚Žq+ü27:`9’ ]+€İ ċ‚×  íÈMĥ`QÓË·"è*jCÑ(Ĵ@ĦòEŬ°Ŭ´ıf”, Š vü}Ë]§zĜÛ³ŞÌٜEF *µ.g-oΣĠy›ġ–Ŭ*•AfšĈĦ£­^Ì£òĈ3NƒÊÜäÌïüŜ‡>ô‡@^DYĦZù€†uġu'ë LUùEÑ•š³üYX 9j6À’.kíÖMZ-ò.– a½)IÙĠŞÑċż˘”tBS Ñ‚T‰P]5§(9u–qž¨ŽċG=óÌLZĠ9ŭġh()ĝÖëÀŭè›MLÈYj+›„€e 9Ŝk­FĞV[šdaìCœ<›^@C‡Ş°R†Àt:{ĴÁt§¤܎…ú(d15JU×iġè\Ú§Ġ‚;ê‰nx:Ö}€iI‚ ĜQô\” Ažkšĵ)¤è6bz£ÖGs°c!0Skô[ŒT…fV‚°™5˙µ˜ĝ´hûäËı8Ĝ·ŜX™ò„?ŬÔS’·LÀħĜl~Ábġıq3ğV8“p6{ @ÁÚë?ô‡_E†œŠƒ”W˜J¤3MƒğKV£H• žRH†üxÜNÑîxÎßġÏ"u+,°Ë$T4Cƒ{.ċÒÑLœdÇ&K™•áİ€ħ µÒ"Ò£RWŒ:ĜOKHN1£˜Ì*§3™xĉıL‹y(ĴĜÂ*SžOcJ—–µİ5Äê[%FÔŞïí5E#½ Ñ`êÀ…šê|ŝ³R·cOɅ“àt· ïf×Ûî,iTëä_"­Zż zU{Ë]- ğêËĈ´ZIL` èİ‚ëóóÌy,z•Z8lDáZs×Ĥ1鵁lYL `\§ÇĵëTŭôz %Z$ħTLvùtĜbb4éÁ|Ŭ½~lGÇÁÚYB³H†™ġ+,z£ó›-ß°€ÙHRö‹ĵÑe cŠ¤§(½ ˜ XǖX,v0°N.à“ë`q ËȀɀ]ÇKÈ"&&&&‹ ˜,2`2`2`2`²lÀr>ZLĴs€á~0°ÎF(W5aOLLb &/c.K'vçeÀdéätı“\vÚyYû—aɀÉRv”QmC‹ñ5_XLö…¤Ñt7½T–ë 0:FgeÀdé`q*ËȀÉÒ)À˘™,•“S€ÑY:œ““c&2“M¤,,ÊȀÉÒ9ÀÂıl&Ò Àr~:,&Ĉ0T4ß ÀpżôE€eıŽ£âm™È&Ï"³˜ ˜ X&šk °f³)dÀnxÀŠ™p6eíM$VöÈ&ò†Ìëä„XsÀ˘X@Ánt „x D:0›BìF—NN™^°X2`k$ْ X­”ÒĞYh^2`ıŜ\Íş$>–2éë¸k)ëĥD[=ݘˆ‰ħžY„`?ëµĴz ˙³â*·âlu" °Bš ˜rù5\KtpÁİŻĈĝĵµLÓF•Jċ_ƒìËÓĞI>| ‘İĠ*(aDŻ+"ÑˋĵĠ6:Иùğ…_úÛü ¸Ç/ɀ‰3ċ˙´wĥ>2ï˙ċÉ7CHĈ p$UÉ?P‡Ĉ!Ğjj*qèÚz UhR…#M0˜*D‚ 0<×5´ŬĥÛîÙ³÷î½{ÎŬIOO—f>s½ÌË5Ħ†ÛdÓċĥÇ\Ü>hvŝ‹ïsN™ò9€íGšĥxGû_0˜# QC˘ùËÙq'ÜVò€áö`ôÍĠݸn}ĝìJ€Ħe%ŭ]s³NO|ı‹•{›˙³…—­ġŜŞĊ•ÛÙmD-5™p~eâ²Mfż0ĥ T}‹lfH¸WŭGöusòËÓĈoX0­MijŬ³ŬЍŠf„$ŸP|™üöNJpЃïĞü ™D?˕–’Ë}ĵ|ñŬ*’ívoJÎzìŞĈü Ċ˙™ o°7ŭӚġ-vV‘wşg~q…ZpVw{{ÛâĈĥĝı˘²ŭ…PÎş[ÀĈ‡Àäa&?&Ż?Ëj*ÊüK#í%`òòC1ZËû{˘ħ²-ž[AÈÍ&ÎĴëòCĊŞwŠ ħœo1ÏÊ£ÉÚ²ÌóŽïl›Tuy?/ÖùŝĥЏ™ġÍj°›€5p^İ-×ISĈ;•Ĝ9¸u;˙PŻÖwĥ• ŽĊU—f?w³Úû>˜V]ş_›üœvkÈÒ¤½|¤nDÌŞï6~?(¨è9*feÉúœŞžÊ<ĥLîÉòúá.rĴÎxmV!äX?!E”•Múğ?0Á˙HGë˙ˆvw—3;¸ ĴŠû ş„˜n|YÉbéşÛĜqĈòr'[nĠ³s˚âŝÙ>|‰µ–Œ%°'|ó÷İ3‰qŻù&sBFĜÇ*ŞÑÊVT‰(Y_¸`üP­7b5DPĵ9ÀĠ 4ä_Ù2ĝ ™qIv.•֌͏›£ĥ'˜ħNô5J+uĴ’Ù…Xê̒%*W”ħHdĠë ™ˆŞš·1%r:£"@Z˘³CìG…›Œı­Ù9 ÜÈ]YÛıŽċlYîR|$Bżùi€=Œ“˙ħÁî˙™%üĝ<§J0(2KCk-ĊPp;CM6:Ħ}?…òn*usß²"Â|(Lı&>À "3JçMíAm(hË`ĝ{²êßÚc•I$/ç€éĴ „QĠù"1ÇnŻÒUµÚ碒tÛ¸ıpî$jĵ@lGÉ 4YëÙ6g}JeżÙÎDyÛŻ) \)xċ€ed™ÛäñÑ`gˆÇŠ)41ĴIŝÓ{¸ÓÇÇ£ħ~gcZ¨TxŝĵIE˘°~/g}ċZWĥHÔ ĵK"ĝ(*ƒ˜ÑöMĤ‰› DŸl*ŒĦꨌ}DZú½{:@eWy5Ĉosx’DAĴ:tÒw>ÑK„˘èÔéé[bd~‰ák{ß=vOˆùL·£ bĠM͖•ĤĜQˆ(˔öuO ˘ˆ"H¸%n sJxĠ–p9B tSäÙn% wĊ'Ġŝn_óD”Î} wóÍǗŒŠüàt:żgÀYlAhÑ5Öëĉè‚Ŭs‰É…[Äûc|ÏM˘•,PÄ÷½*PEbŻeŝÀíPô…AĤĴsA}Ç¸g^WT}=#š)ƒ[Ŭġœ+ž5½:éê;€ıƒi”'_²Q¨T…JÜ1Ĥ-rtÜç{†üÊkÊ› Ğ(™ Y9%‡Áĉ×h˜Ñ¸/mcNY°.ĊŭÇŭû–GÍ,NáfbÓúS‹ĝëwLó^BFÉ|èr¤Y[ÉŻƒcjލŜDÍE'B‰şƒ5î ``öŸgJP\ìĝ’X×0¨Ĵ›K/Ġ—ĜĤHFX)>ö†Î§c²%÷à ù4(°P-’< 6tÓU;ġG"[IÁòï ȈĠ3Á@Ç$´p/²à€-DĴßÙ Ìo—wğ]Z‹xe׌vï+?ôpñDĈo*bö§öħŽV,^hW~v-ÇR:˜ĜĥoÌ;TM¤†ĦâPq‘è0XXc)Ş9-›÷Ĝ›Î[=P‘èRĉÀ{o NÍûĠXğVĠuŽ=Ğ5xÓ ÀzO¤’^Üëfû}Ü18ñġ;Ò·ÄxHâġÀ]>ÖWÁ”ò-’ƒĜàG"^ĥ¤\|`Üd\‹Ĝ„ĈĜ:XUW Ġ p0İ™ĵŭ ëĴowk 4~ĜĴC 6ĵëÏŬ€òçF°‘r0NŬë߁‹³b Ñ+t"µíĞ{Äd<ċ-ĵHÚ"`dÔġ`ĉÈ1*Íï´µÂm0Ü3vÓÜL„+8¨(Á*qŬŞ4„ü?=wE_ƒzĵßêiX— üq†R•‹£~#ÑyÉJwĠ€“8ÉËÂC5ZUġ)ĉ=x*Ĝ˙\EÎj>â…Ğ8µ`(•|xè k%£ŞVż#÷pʖ£&Ï4šŜí3œ‹È &ĉAĈ IDAT6ïZt~ŝìƒCE£ÛD¤ë Ż5b”],kY×!Ŝ+SÁ'â&;ŭ–rÀ@[Š˘÷ÛŜÌ·Í*îòÉżuNóV’f›ŝĤŻlóqÀrÛ\vŭŸ’ĥÎŻ§ŭWӏÓŭ9|uÂ]ËgúÀ*v?ŭw˘L瑳'K_XşğŸŝK1ġ?LE>Ó°_Ĥ={Ĥ熤Ïô왞€=ûPú•ïÉş'`_co ìµí'ÖIü+u½Ŝŭ·)òàÍèÒ ‘{€e™uUm%}Oĥ„œn.Ŝ›pĝûĥÏ[Ħ¤ZÄ÷ r+Ë &\Ö{‘ÌŒpÙM@Fy´2cCĴĥ=\P b+Şâŭë6ŬÏìhíÖ|AóŭêšŜĴ@Àú>÷Ów5ÒÚTş X¸ŝÍr,ß(§=v•rŸnšîí ×/;ĉ£"Zü0‹Ż?ş>Çàë†pÊŻÑüU€uï‰<ó–yךJîë!3^´|‘˙/ĉÌħl*ċœVAÍûĉ%|àcNÍúŜ;İ.>,_ZóÇâ^ŻWütĤ‚÷WˆdÊÎWêÙĞékŒ’qӝ†ŭùïrBRêfŝ,Cċ&Ż˜ì ˆĞ‚%YîfŭߝĤ”`ŒĠ%]—§}mqáTòàEMĊW*ĠYá)`p8REQ³²ĜçÇ:Ë"ŽÓı:|kĵî^6êĜ›şx™ˆ˘œœâ^y—]ĵŞ"°#ŝĜù2X;³C5"F”^U,ÛM£|˜MşôüòjlFäċĤHĴpj1#XŠÊMĝˆ îrlÛN„wy¸hKšÚĜĠ"r–9ĥ½ĴáûJ"ĉ­ô­ B~Żù'‡ÖGQ{„şÛDYÑŝTÀ†ĝïšqxÏÈ÷mÓĜöm62Ó0un9$cJd;á€-úŜv}6ÒGXSŬbì8;LM#îw–‡İĦk>˘ïvS…hËÀGìlÛ˘ZĝlŞä;ÓùpT5Ö<<!ô²žr…ÈşnÀ eÑÈ™éŠ 5稄ÊDÎÖ¸ìjµWàbcĵh5˘]NçÙc¤TŽ#äGqÁP?1(U‰yí )Û$œ{iá€ċhh‘eĠ]8ŠuLŠ‹0¸ÑŸ6Ñóruĵ?ĥ6 jx…–x˜p4‡³d}ĵŭĦ€•íŭÄd7ú `s§)c >^jÚĥ뷊0IǂÊMd}àúŞÖTa˘ˆ’Ğ‹XÇ£PE"İĤ,òÀ#ĊH0CY„d%D1‚z¸TQċm“B€qD×P÷•Gǽż]Ĝ܅А0Îç]“¤nlt¨^ĥp£™uı¨b-káğ˘‘öċRìċ…ĥ/Áu§ÊÜqĠ&"úħ`Ovp’xe­)d’·ġ ġV‚w͖ĞÈŭ…?¸$ÂĥİcAŞpA¸8Ĝ-`˘ŞÒcL1ĥÑ,è'PTˆÙWĵl„ËŠ‘?‹>Ĥ"ğ™€kġ ŠËV Iۗ`¨BÉVŽY%8v_ċ&İ@—&<ÄBç`„“b‰ï…Ĉ—7zq||²î°:<íT½éëݨîûÌûÚzY·"£Ûç†J,97:PŠ7”ps˘q…³=.“< 0upܖ¸r/˜ġŝsCTgpĥÏ-yxԍHŒ%,éÊŞxÜı­dƒ–ġ—FêŠôêJ“:MĠ7cR˘Tœr ½NRġcħ’y!.öžèÓ ‚ñÌĤĵ˙(ÀBŝúH7( 1ò%öç{8€ “›ú¤"Áçó÷u_ËĵñEĵĜr˘B1³ ѓʴĈ’E}v2%&*­.•Gx’Œ—lY·sˆzà€]ë‹Ĥ›óIÑp]­ÁA`Ŭä8UÚż -Ĉ<•ġ`\Ecsp[N†ĵ-Y“ċn³\^O\Ô9`ùX@Ÿ³˙x XLeìӁl0ŽòÊÁÜIàEnċsÏ0´ŭ—mĠì$˘Ž¸Šïŝ0À>>Te†_zÙ¨ ìX@èi v)_Zż&L¨1Ş@Á;À*B÷ĵç@Y§<̎˜żŒ‡``[iÄûÖd<·žƒ"Ù`×n(²¸tµêëĊ‚Í…U+aġ£ïvùì.!áÙÖ³ñ鑀ÄĦ|µGäĥïŽÔښ-°S]x‘W€ñ`_wş"šˆŠĞÎmFċς+“ñf‚’ }ĝ’>²Ÿ X“r Ö/xÉI m֔ž*ݵ0.ğşn вÀ ÔkŜD+´Á°hÛô™BЎ2Q‚¨—Ú'"d7ôƒéM ŠRĞzKN“Ğ^İH¤~-M€mÉë>`É ú3ûfmÂo=&2{ĠĈÜì1×Z>ħYc V×aġ‰ÖPZs´ƒy XN˜Ĥ­ıĵGċUMÈi‰K7(3ÑÊÇ2Â{v1ÎĜ`ÑuÛuÙŭ'$@…u0âïXİ‹ŜKŭ y“(A߂­OëÖĈÀàéİĠ 06ċ*2£\q°mtÉıêPż/@|QÙ5 "—j$6àŸaŸäŠÈĞ˘ıLĊⰄ=QÊq ƒ§"`äzg1„•6PVlokĴ!$a-òħÈ9QĥM&JVZ–‘y)ÈÀ³P ğ%¨ÛË°FÀœ~ÄĜòX"ZĥŬ¸ì½ŒĠöKlğR—Àé$SĝM€aíĉÑ+0òŠ–ù’`Ĝğż0ĥ‹(FżSŜ0?+f TġS;DACĉ`ŽÖ#%MĦì… ËEÁĞ;Ÿ£Ŝ˜=p—‡cĝĥµ(fĠẛô,•' ˜R˘]•Ĥ@¤<ĦÂj2ŻDĝÖŻ#V]Ϩ M]Me·k#Y˜ĥ\ÍÙ2Û¨HĞz#è¸Q"(—„1OŻĞÇŞm¨_ -µIQ$ŭ˘yo˘h˘,jq‰˘šfŞ ÊٔB²^@çJ’Ĵe=†7+³óƒċG…Í·`Ïú |eĈ,ÑŞÔC’(Ċß˜Ż‚[½lĝ/)§Ĥ‰]&†žT².Ġ5ÓÊ1Ĥ!P12TĠ*‹ŬL%ħŒñL Şiğ›ŞŞŬ0Ÿˆó(/ĥù•šRUÙnSMĠh ùLjtÔ T"‚ LS7ö7€‰TVçX­mY'ŞÛĠİğĝüĝA÷Ëî^³ÓoĤĤ_Ġy3ƒGê [U`ƒçcİ p_BͲħSCvqƒvOàżĵ²fŝz  Ë(JÛáƒuŭƒµÊÓpéÊ­ĜRU0ÈŜBC46$Q—Tc–v£­Kö·ĞÈ:óĠ/wI~1 j2™§Ĵiòce•óy̚$+‡.ġ¸[ğöòUŽ.[µĜ–Pii^ .QuéʎŜ§y²ëÙaĉe›çَġé TïnyôİşÛnŠp½Ŭ^níüôuUŜ8žy^vou-5qĉ}Ĥ)r·OŬ›ĊìĊñöÙEP 1Äц/Ħ\@s§iX†,ÓIp [ğóÊA~íZŝwgV•‹‰=NÛ~j.Š|1Ï{ĥžŒu“/ZĴ·ŝĊŞìtâèúwš5˘Œ'çµoġÜߗĤ>Žú.]΋ïċd²Âİ 2ÌİÓt÷ÛûúŞÈ˘ıŸĜû[ÚÎ1ÙKßëÉŞŞĤ ïe3UU· fŒ5YÖqĉĞ-óğıĥTĠLÍÊ,ğžüPO™ğùı)Š’b·ĴßétTú‚ ‚x¨pe„ÙµĊêÂ}ş3ñ:VŞÄ9Ö|ġ°ħâò)şcܵSòmNx0´í°~|ŻÊYÍ… °$ĵ׃Gkƒ]TĤEĊ3rQöŭn:`9i›ċ,Z–Ä5ù`½IԆÇŜÙö…I\Ü7‹ëĞÄt(Á°½şxmŒÉD… Ċ ò/"X¤žBfEi}:`ìT½+˙{ş)°‚żB~KQ(Mĝ43›h9ú’jÂú5Ġ,ÑĨêğ}Ëz­ŝŽJ9VĴĥ=|޸ħ!nYE„ôX>ş*EÀpġwÊ·ç†wĈĞ{-HŞê\´S¸˘µxn݀޴ÙĞ"Ĥ/ĠËşB$‹žä´Q4È+°Ö˘ŬÔ F™ë&‚l$J<0Ĥô·€yCĵğË"‘¸(H£`ĥàtğèNóVEżh!ڀÂ0¨0W•ĜœœOl¨Ŝo,ÑV+mûX{Ïıq:h]ÄÉôtL/Ù~ÍËİ“Á¤Y‘shà= ;Ĥ“Ó'°Ċq÷à„Š[@˄Bí$.Áĝ{ßmdeêóà݇W€ġ u"ĵ„šÛhˆ*GkÂq:¨XċÀŠŻrB›KĤàižvÓa_ù9GS,L°ÊN*r+’%eu°DzXÓúÄâï.:°(÷ ¸ÀĈì 8S(_PŬ8›,oŠàĜ7=ċÑĈĥP^¸žeŭIÔ—€m°zÓïl%S*G/€MĤ·ğe`„­ Tˆh =k°:á€í$P‘[™žJrÂĤä|ƒœs†¨….6Ü=s°w*l#‹;Pޏ_x‡ ÷ûjÄŻĤqÀĜa§Auœ ¨‚À8'ü‘˜DŽë—IAéHA€ŠĴ4"ŸlġĊ˜+(ĴìXgğ@<žÓPŽ lµ9vıLİ1cĞĥ7V³>CÀ:Sœ#lbH.Ÿ^Wa·ĥF¸bóPœ İ£0>]E”Ruó­*2”¤ġ‹Š„r’n|İ‚dlLḪŠY Á!˘bÈ0şLÌ—WĜ+UcX$ú‚鄜âáÊ·")*GôÙ:ÊCŠ ÄcĴ_ C¨ôş&FÊ#6A%´`¤/’ŞË rŽÜè[UWÒ:‡kO ” °ìŒ…Ú&Q°Ĝ)*8ĠÄa,È´cÈŻ €HRÖuK+­ìi×3z µ5èŠħ\Fpê˘˙BÁlÁğĴP&vcÁŒğƒ)@K‰!àŬQßÏȸ=ŒÎa÷Žò’ec1,†H‰|ħZÔ§<ôĈĈú|l)Ié÷Ú`ċj}aäïTò:š+€-]™ĵċU El6•V™ğ‡Ò×óv&Şá&P"ìÖ}9#âôĵÌĠmĥ†p[jÖrı00ádä‹%Ê1ÁW`ó5üĴo\È£êĝ;Ö°ġħ´J\rŽx‘c’ÍDߨ­ğ…×u Òµ>ê>B%àŬž6ŻVÊŬLQ“hË~g’YċKg’B‘hSŠĵÖı˙˘ûšT@LQ:%6> Ba3fÚS\ Ÿx^ŽÁH<à]Ğ‚íUŭ֋ÈĥOĦâġu‰y¤ŭÌTÀ|Ż5#›žžxfš3wf=Áp_19­NeÇʙ {'A\,˘ĥ ÑĞì֞çĊp…­7uCËà.< ½ ÇVà˜á ‡:€hĵ÷Í>­Îġ€[ÊúlĴ‚Á·”ĵM×ôĠĈ0oúż\tŭf$é&<]>ŻccĜ­ l B >ŝˆ2G‰Ì³#Ñŭ /ò°R'ôĠ\€ŽG<>z]äUĊàç;|Żx5˲GÛjğŻğÎĞŬċeşÑúXÒ]5„{¸Ž ]\7ŬvlʆĠU…Ğeû£o²,;OSᚣ v†œEÒÍPùíîŬmHÈĞŞê_ó@¨ÙkHÊOBşYñ`ÔeĈíúÂüÏé5`ċRv×´‹– 8ÛtĥÄ3‹ÚŬĈEċ3£OğŻl{ˆŜ1&ĉĊá1ùGÀjJî=ƒ³Uġ‘a·ßš-6„.ìêÇ£+ğĈƒ_žĜ?À6tèG½ŭğVğßêXät{ŞŜĊ `ÛàœüE‹´}£ÙÒċwáö%…wOˆ01˜ĞŠâÉöçĤĠégŠ1ż÷4Ĉƒ˙nò E™Ü;üÌ\V×es˙GÛ3`ŝĉûuJ ^úEú‹²_+ÚûÛÀżġĦÌ·ż'Á2UÍVŒ”è Ĝ/ëuĠ˙ÖĠÏ,VµâMÀbJ£÷V$eµ_×Mž4żİ"—TÙ>lgPû)Á~Y­Y]$ywˆëŸ¨"gTKß,x'`ñĦ:$U³Kġ”÷‹–hOÀ~­wu™Zlá?0uóĤŠ\JïQ‘xşuUçÛ_>äk‰TdŞŝĝÈÈßyO ög{‘ŝöW^䳛â ĜWuSìNa0S#ĜgŸ“Ò+ÀŞÓáċ%`MQĴ„eqúnú£k²g:Ĥí-`ċé÷.`Ñô+Ò<|I³——wà(Š˘^œ„?7ͧÏtNîuÙ\|“Ŭ왞é‹Ò°gú7[~GÚWe°ĝ†|wuzߐïĥ.×ߑoܔħû ùFí`ß7¸Áŝòm°ìòm°í7ä[`›ïÈ÷ Ĝ°'`OÀž€ŭCÀrÌ|iñ÷ĵ,˚œ²ì4[^Nš__kż¸ı¸Ÿ•ċ½Xá–ebYÖ ŜmĝÓ²^&Ál‹ßé|?Ĝí%˘ĝâïpîóöÏûrgÀ6Ñݘü]aİYÖîŻ̖ xàéjdò˙ *Ġj Ş€{ì ĈżŒ¤8ĉ §îc¨ ŝ+NÇà-هÎ*><˙ò°™ĴB£Ġ*-ŒUh–É?œaù;Ï×Z=Ê·8żñŸïl!K/·Íϙ./.f§gˆGçG×Î’Ëâc€ŜĴˆ‡ &{o Gà™ġż_‚%PŻsa(u,xĈŞİl]7ĠKxISÙ/™<9dĤÊĵ\SÙÁĉžċQ €…²ĵ,m”3ĝ`¨¸Vñà˘4§ö ĥGÀŒ`S|ÉyÀ%äV7´UàJ /y.ğ5‘í<·•ġŻ=Qlüe¨úĥte9*׊E‹Ô­ü=lèÊ9,7Ş<+Ĥ˽#kIı”ċ˙ŸžŽäñŽL9`Ky*`3Ê(QL-.‰|0(8k–ie ;ÈE.—?˜jۛ°İmsݧzŒúH” B̛s•ŠZĴ-feĵÀ\<8Šá³ ŸÍÍršĞX™rišċÀÛĥW…m•R‚ĝí8ÚÊ/€ypşe”VÚwL/mÔ ĦœĴ!WX …”N~ÀÖ&œĞĉš.7f /8î–ÚÚlâk<ò[Ò3`4†Ââeñû€y³½†€Ée B1Aİa+ĥw˙ÀĴbî €j>ë`F2pbláÎTż'À¸ŠÌe™”[Í*A‚mO€Q/-›{İıƒ’‚—\~0xqÀx;䖏ÒÙùY*²<&ŸËPE‚Jñ °,ƒBşl‡*’Ÿ˜ì—ÓbƒRë,ÁÖoĉ;ג§|ÇQŽ*² (y}l;|}˜ž`ò ÁRŠ,ŭ ıÇflSp Ĉ˙„{ċ,Ŭ]Ŝ°Udİ…@—’ŭÀ k,Ħ'Àvç'ĥĥ­³Š´Ĵ)wt,UdıħáOjƒkÉ‹mky ħQEÎ,Ë^ù`[Î °ıĊ??V‘W‘àoşĝKäĈĥQE–[Ԙ2|?–Ú–{˜lGÈ5,[(VÛíûËlk^.àllW ž•šƒe“6b@À–ĥdĜ–˙QÀ ˜¸ŠœY6W‘Jş(éñ™˙nÀ8½"YñwôĊVƒÓVF‰ŬÀU)ïV‡2^ÑћŝäçĈàsá‰y\bäÙŬj_n÷ğl8ˆŸïöƒ![t.òĠ >Âé•ck•§èg×Ïv<ˆ=>yĵ†ëlñÛaQÍ~µ!ĈGhŠ-žù`PpnN^÷IDATÇÉär{ĜñÂZ­˘˙lGг MtÙ§ÁgËò·;Zçnh!z¨²ßÌl°SĦñëƒu´aˆ’,3óğ|×­£04ŝúŭé=ùSTšeÎğŬħ'ßµıĴò~•ozÑkÛï çC€ílˈ‡ÏŭOloçĝ'öeé9Tô €ĠߐV|C–Oëôòm°ĝòmÀ$"qûİ*“ú{òMËïÉ7+#ßşÜċߓoı—ŝ/ËgzĤ/J~™?Ëá™&ĊFö}lĝûgQ<Óç§½oÄŭ˙ġ}Hò3=Ó§')Èúŝ˙üjɲ­öµIENDB`‚gamera-3.3.3/doc/src/images/tutorial_selection.png0000644000076500000000000011234010714675724021177 0ustar chriswheel‰PNG  IHDR`Ù˜wÂPLTE $&#,+,-+(/6";120-4:"A463<:(9:8$6­O9(>@=m:[]ZG_–D`ž@aĤ³=8Ta|XIù`b_Jd‘YWafLü #?f°SdˆzZ[NfJg­egd|aJwú„LPÊĥƒ‹‹û–w‡÷ħĊƒ7Yœ;ÚTYÜ'¨S‚şŒWçŽ,.ġ¨Ëĵz`İİ./.Ì--<„Wċê#xĊCJuN]=„W*ĵá˜ÀŠL—$ui‰Wáµ(W—ÔÔEAí bêR×])żè ŻÊL\NC~ÎK}]sDİJÙ'ÏÍfĉ‘gŭ˘ ÎŜ‚zê"*Ċ—§ÚĠ)ĝ˘í°­œ´£ĜÀz}‚ğġÜéK/Iò›ßœF€-ÍOÍ-Íï>ş0ż{yaÏî# S7.ÎO êPççwÂêüî%…:µ´°onqaJPçšêJ]äĠ%ĵ!~ƒşïżş½A=¨L=ˆ­ĝ}p½%U0I*¤.ÀVç*J]‚,t“ù…ĠËü|óËÄïUċĦì“EqV í'ٞ#û„3giaÊ̓’ŠŜb^ËUxÏá7>´ÈÛ(‰%ĴNñ*.X(çŬ²rFêĦùùı9ìôe&ż ÚÁ9/7œ?}îÖa„í^ú•$—/_‚OnÛ;5·°wÇĦŭÓS‡öÏL-íß9·°ÔY¤îFêâŝsĵ:'Ĥ.̆ÓS‹`ZĜżó ¤ì¤ÎêÌÔÂŝé} îÛ?ğâUœşRö uATg÷É6^ව§çaužWçÁ<ż½g÷ìçßHĥ@*Ŝbv~~?$ˆ#™…·hÚßI`Wûá“xŭüêÌĵ´´güeÒwϊ‡"•x óüq/à#š>8ż_8£Ù}ü9ïi9çfŽ´ċ—”›-™ÛĤ.ÁĈ‹¨Ĵfw…:3…JQİÀê´"uafêàŽçNŸ—cr‘sƒs˘$#ñšsí۝Ûĥó5?ğ}iö>ğóĴ_ÛÍNï–İg§QêÜüì5˘şÀĞpV;TĠ™}󳷝-ê¨ó³ÓHŬ7;ğsĞ3ûf†8u˜ĉgfwÍóİ3è½LPĤ°şV÷ÌJ*J™áĠéùSPÊg/œ™?vaéĜ… @Ç;ĉ/Ü= fŝ-üS•û.´Û–N_¸ĜâìŬšğ>ĉħ=GÏ_¸ô(³üQÁ÷̌t ğäǽĞğ„³zv 猳`ż²pߙ&—NıoñHš<öÙİS ÓÇï˜^‚„EĜóääéËĥm;° Ĉğ÷Î?óà‘É£÷ı}úĝáı˕wíñöÉé3Çïۏcrz/>2tH‘7°µSv’ÓÓxCq !Gö¨ä×~!żĤùÜDê^ĴâìߏJbzÇ>Ĵîܽ·İ.LîÚ=Š× îJŞT’×ì‹ݳÓsS2À.+ğġÓ2ÀÎA¸vĝ|+`çnĝìŻ.ßzĝ’sPè0À‘‚/C*|ï5'ħŠNCEkŞSĵz͔Y|dğä§1ŬTgñ[‘:˟Ñ<Żîä€ğöÉrsĥ™›‚şO‘×ğö͢’˜Kb_VHE¸ E‡pËI(ITìˆŻC(üò‚ÌE^^°K‡o8|ĥìÄ 'n½¸{ †\xku÷aîÖç^܆ö NӋj°s—nX]xpÏ.úò™ƒğ.PÈEÂò|ù†£Żœ¸ĉ•3ÛAÄïúcŝ §§ßĊNt‚ÓÒiHĠ° îçĞïü[œœQĉ—›· ͟§¨.ĠÙi>ëx @• •Ó,.Ĝ‹ĵŻu‡ âbŸŠE:³×ˆ€żt ;: °Û:Žà"yà^şĴìò‰0_<`¸ċ~yiúšı…éís3ÈU‹êŽƒ3¨fċ}:¨ûö‹ŽżZUàx\óB.¨{$‡ĵŠ£=B´#ažì‚py×ĴpíçŻY)ŝÂ*„6{ĝÀmĵƒ½rŝÜîé3m·ŭòo0`˗ŝхځW™=ž8qâŬ°™Kç|%m7 Iˆ˘S/ŜzáêÜé'nñĜù |Hv†ğúÒİııvĉĥÓ§Ÿ&/üñ%ĜvX^¨8qëÛ·³'ĥ£#CĦ˜$î™ċ0á¸a}fŸ‘xH…Ô™=3p |ŽìD4#äÎ œ…8żfwa•ÏŻĵşÇ_8z p„u *E™şožW*Ô)>ŝڎÂîıÙ>uvÔŠDġÔO/µö’Ĝ…‡o”^R[@ €íŬ{NCCbµ+ Ĉ߅Ġ%99'¨RƒqúšƒĝĴÚÔyAċ‘Á  &A|k 7ÄTÈŻ™fê4äġ.úò-Ä=³’Ê7Ëp`Œ›e{gbJò܋ׂ÷ƒP†z6{úŜE ŻÏŜ8ûĊúĦ‡M_:ż}ößNĦìù3‡x÷,JÀŽ^|ĉê£ż~pÇğ?°µ9żX?½ĵtßŬĜµìÑ/]ğ|ĉàm÷íxlùĈK× ´.mƒċż\>¸ĥı=ĜE+5B`uïĴÔLԙĤ*4’Ċ šê_38dżf^€ŠOE N 7­ĉf§›ÍIP÷‹*ŞÁĵĜœ˜š*uM³œgpI 1ĜċË<`/I€]ġĥÛn;|ú% °Ë—_‚×KJÀżú’ĜüÔĦù=s‡öïäûEfw,ŝŻ™Ĥ:şdêÔÒŝ=²B*߉"Sgù>ĴN-á7ê˘A½=X…UĦóVg§Ä ½³{ÉTÜù3+ëü?°g˙~Ô5#ô%Íc›°zêÜĥ/žżúÔùmû—.żúĝùĞg—Νża߅Ĥàué†=˙ráôÎ}÷?z÷ÔıÛ÷ñüùÛï\>}ŝôÛq|pĉÜùwïŜ69ôvÔĥ÷èiX?ĵûÔĜóéS×ÂŝÎżûí§Ï_şíês'ĥñŻĜÏßìžşpxÇŝŭ{¤şŭè g„ŜħyİkŠïô’¤¤.âì›Vf”_RĉB~+2÷OêžıĊŭ¸$ÉT •”¤˙5êžŬÍŜħGPê^ĜĜċ&'`2 ˜Œ$`2+ĜC ûĉPGîÒÂîç,/ÌàUÔó;·Œû…[ĠX]˜{÷ZÄoĦ?yߜ¤î߇ĝ>é}ÍTİZx/-,ÀżƒMuŝ`[êĵF½óÂêÂ|ˆOEïíğwîXÜħcaqÏöí‹SÛa£íÛç÷lŸŸßo-·ï>¸°–ûĥO-,ÀF;ĉùċüH‚.lßğŸÚŽ˙!ÙoI;ĥOm_Ĝ·Àbjż·Oá=NÍïğìPêEċqj=gùIlˑÖü3XÌzY^ ê”şÄĞËXÂê".'¤Ŝ(¨(U(ĜċĊ}xí ğÈËrz0`-àœĝÜĜKMÀ–—X^šğŜG,€÷Ç%ġ8¨(ġŻ.£·¤Î-/!ġ R•§‚ÔCG–.K꒚şÄĞGxŜ‡šêRĞ ŻCÒê’rUJmŞ˘4MèêĦ(²Uıiŝ_ĥ:¤ĜZ?ĜÜ£ò0°zP<Œ#ĵ*ŝ˘xÎüY-Tf"ż„9*ËŻe)gŭ²×Ĝ„Ô}JUL•oŒ –WĊ‚=Êԃs2À^jìVÀ^’6ŽYž— ‰€:rèèħ#7?r€:„Ġċ#‡xuY™ŞŞòşŭÈız ż—`c¤˘@ê2RĥİÂ$ġXS]>rdù~/·¤Ġ#ǔ*Jß-겚ÚEVŝĴJŞx Š#S3:+ĝw\y’-çĵr~kŞÇùìğQñÙeYIàĠe5ġ˜¨JĊiñâK†sùM`šİÒ)C$ ’ôw•H:¨c)ż&(žbC”\L,á6C"<`I./³Ŭ‰Ipa…^hhe9¤€Iñ}² X<Äq·ï]Ż\X-`~°°? ŭh4‡ŠFB!XF¤ÂÑp8à"ÑĴG‚Ñ Z)4‚hcá#š 9`É0ǝ›œœĵŝ&'ŽLN9uêÈäÂħI,ÈÈ[ò²?x ­ÀöŸ_NN°p°8Cú3Ġ\-ĉR•„eĈìDhŠĤ .Ĉ%W .W˘‚ŝ“İ2qš+ĠZİ`ɂ°r‘hêÑÉ g˘3“‹gnżŭÌXÁ|=˙y ZžBöK·ß~û"ÚŝîÛo?†—gV˜ä"Ëà¸#ŝXÄ_'ŭT hâÑ Ġgt>˜ÀÉUCħz"Á%B% ‹Fê”żZ ǢZİ`žDğ‹;vv“Ċĥ÷ԑs “‡Î@ŭ˜áíü°ŭ^ü/2ŬEF‚Áîµ2K"Ĉ0]Ġ2ê&„YŽ3áD­  Ċ`5ÊĤkġ°VޘIotµıH°Ċ3 -€ÁÈM;ƒ\$,!ġòƒŜ·?…VÖ˜ÌE"İ“ÂKŞ€ù 9 ŻËóƒo´RúLĉ"'Ïkìò… xċv\}.òWÈ3 .òÈZ‹´V/B –¨Ç()ĈÀÈU#4X¤Q`T´ž+U °á,Gut‘““ç äŸ8ı°—ì4OCëÂòvUyûƒku‘q:Ä÷uÑt”Žù•*޵èJ6€Ĵlŝ‘k$êŻ¨V~Ĥä÷sà"+€VŞ[£ 18çPêԙĊ#PË™N[À~) ·"ÑòÁ5·"•G˜Œù3\³Û5˜Ž)Š‹Ġíbš `҅˘y څàèPTżÑ9$’nìە€}^·Óá‰[[°xh•sÄWh]/Ż˜Ġh´ÉĞÜyŬ˙…ëŜÚĞH9`Ğ+‘Ix,9`¤Ġİ0bÀH“sAXšŻödCZj•gzĤ)9`d…ÌdÎìsċ€ċĠXê͘V502½9RĞ"wŒĵzí[oşé·ŻÊ5Ë9bż|ñ…çžK8²MÀrÎ(6&E#,/SöŒ0Š ǛaĞ]úòÉGż#É˙ĴÊ+è5gÎï.Ékğ7ħ¤j´&Tk7°M°rĦ*ìŭ_ĝŝ{Ŝ5qÓë( °¨Qóä#υÂMÀÙçÄ `1Żh '`M7•ŽÁúżi&6€ù0`ĴŻX 8e€MXRí,™Z CFsĞ1‰W`tĦ ì=ß˙UüŬ’•›H0ҚöÈY[^Œ’s"`ĊĤQ¸?¸3`4Ón+qòò, ²1@ÀRQVHDżĞVÀ¸˜Ëj4Èk0ż 1šħùÌoC§Ñy(û˘†×a1ò5˜ÒhxF*"`‘;ż€ŭv0XRĥ"I[ċT-=r˙“Ž&`‚ñŝûŸt6k]+ĉÍ·™Xy‹§˜F Ç=Áö`lÔàr`y/[ż—O DB1~‡fž%Ŝŝ£˙ŽE,–DĈÈú˙ħĵŽ ŒŠ˙˙21xÀjÌĉH]ŒÁjÍìu×ŭĠ÷?òĦ˙ŭŻ-—0{ùı'_ŸV&ċ€5JÀ˘Pù D 6*À16[İ`°ò%èÉT6?Ĵs>ÒVäˎŒs¤À,œıŸ€%•€]Cʃüœğñttì~òµ `ĉH* ĠU `ĵħ°H:„µĈĈ ĴħIÑ#Ĉ`Ù&`ùĞŜó‘}äşĞâċ Ûĉ,J€Qö,@ÔÜÖ^+ÚDÓö|°Œhtä€1nÒ_wgĞ9­œµV³²ž  £Q‹ÇWÈGkÉkċLž— °ÖšËÂYİŝV°Ndr‰¨0ĤD9I…‹Ìıħ_sìŜü]Tˆ†fR 2F̅ÀüȘW†–ÜĞ0šÊ5c°ôU×}è=ŻÒ!ŻÇeC'1È÷>|úÓOċA÷iŜ’ùÁĜä× tYPiEá°At‘Œ*(oŽË…]A­‹ġfA.İ–>Ö`i+DI!e Fm¤ÂE`?ĝĜó?zóŸŝB ˜7 ´†­€yÂ`l ŒÁW`tQägşĝ ĝĵ›SŒtFŸƒŠéɤí‘$ÀHgSĥ˙ö‚XğQ̛•DÀ̉D²02o `tfÂh‰Á&R 'İp‘YGƒğĝï}óŸ>û‹ïÉ3ı³§ÜoTĈ Ċ]jÌFWi(cH²ÔݍU­÷0E7EîuQ:ĉp˜M6£Kêh-ÛwŜy§ÓòÎ˙ĈûHÜÑ*͢w´–-F0_PŞW'é°rP˜.Η– ħ@­0;é`t6$ òfs$jr‡‚‘r `ìŜöŜ=˙ E fr,JK f£·ÒƒÑ ĈÀЧ²1E×ù—”!<‡\šħn(Ġ/À*ÙrµċZdÊi7Ú­&§3"ğT”ñx<İʟ[¸u(\*R…KEY0&idÌÈKPĵT†£<”•c=ž —ôŠ-Ç0—,s)O$UBëè%´"‹dIp‰Fôƒ1U%`ŭéĵ÷GÏ>ĦÌföÂZÈĈ"°ÄżûGX ˘M†yëÂbà³™Ñä§ÑĞŜĊ°q€UŞ ôŞ5ä8Ġ(Ôòòq*†VÌIqv[†×ûPƒ•2R7z &§Ġvħ›´ÛüNRÌ#­~Ùrħ mŬLıHaŬ†¤Ô~l$²Û%µÏ­ÈŜ:Z°ŸĵùO/~ S6a ~ÂB”—8ßÑŞnėšFÜÑÊIÁÛ8ÀÒBŜÒÒùĉÌñÇğ Ğ38žösşpÍĈÙ隭J‘Ŝš§/€É/EÇ␏ĊŒ-`3yä€ıÄkhe›5ĉ׋F;6*GSˆĈ–~°´Ù*ŭ†jHĜöccq‚¤fÍıöċJ•İ5ĝW `żŝܟ^|ŝ_ŭƒŻ|UQƒµ<ƒŻĴTŜJ{OÍ8xÀx×Nj\Ž–ú8Ħ~Š€‹4£AòV&˜Ê{Ĝ *0ÛÀŠò,2j\–Ól”ġƒ•q|DÉnġ9„Lê(£ßŽ+X“0d²KEÍÙf0`‡ëdÏ?ñâĊ'žxâğ ÀÂj×µ{3ĤUƒŒ­")sıD"ÁUéŞ ,ĝĜ‹ĈĴŒ`\)áë `ı’< ­ž€˘‹È+GÍÁTÓ÷™Ò­€q"Ğ@µŸR‡ 0oó6_wÀôËï bĜÊu:ğH;IBpKú`şéäÜÒÁ„RE?Ĵ÷™­Èƒü˘×lµZÄûDé-È|_QˆÁüFŻÂĜ6à`ÙĐHR>Q­ë€CŞ)Ċ+°"]ç_e·uM½›ĤÊI.œqƒ[ôş)./w‚|šÖF´^É#ZEÀÊĠE5`ÙBÑW\GĞ1ĊôŒ`•”ÊPyĠb=‡0JċpépQë‡ÎĴ+'ԍĜÑZ/Ğ€°zjĊL¸q5²U‡€Òz–uĉĞ")5czġûîx¸ŭÍ Zí^‘$#ŬY#;ħMlà—Š²ÂµÈ!5Ż”èä͇SԃÁŸpFÇù›>ÊrcF²´fÀJCse%`#ñTŒW `Vƒżé£”,•‡BÒ²3°g.ñĦv°‹?ArħiÄQĠœCÊ#;C˙ĊoKñ>0‚d7^¸b“nú(ÑW•÷°Ía‘~°[ÌçY°Ï½÷cûĜÛkĉŠXšŽsÈz›çPó`Ĝ*,%À$ğñòÊLşéc˜“ò¨ä×zË[C•×çŜK+`M/^ô `işÀż”]W­”jUċŠè…Ö×äÈ-Ĝ[.]zK `5~ìm5À֘0&½A+ù²Y½DjÄbÔÛĴvKyÄˍxmzż>ĥŜŽÖ|eĝû½“'Ż °½í'´Ĝ+‹“”ùN¤‚á…eVxÀHÛĝƒÑ4ϋ€ŬòÀœ| °Ï_?ùÊVD—s£n)~/›Ü4ò IDAT€]ä^~`C˰$¸˜Ùl.TSAh0x¸Ù‚ °qn½€I7} `ñ@>6a{ĉ÷žĦé{?xIĜWŜöĥ÷÷͟^ÀÜá|dÂÉVGòyƒq[‘ê.èòaDÀR¨Ë­0éĤáŞÁ\F£Ñ^{àúğhúúëÚâ"éo?3Ì.²ä„spe.ò„aDò†Cç"ks+2„`ħäzc0j£ÜFt9ĜWŜ‹ä+­1ŭñ/u F:oD˜+02€Ħ&dı­ÉJP‰Ħ‹áLµŠF‘1Ġ†mœYëĥ›>†,È/{JR˙ı]ĵĝ£7—[{àä:ÔA~ Ÿƒ0O5¤;0ŭ` ¸ÈHÈäöŽ·tJĴĠ?rò›>*ĠáoEÒ?zÛç”J†`ş Ĝïáİ­ÑŠÀ&üîáĴI’l9\zŭğĊ›>†°Ÿ 贞 Ë{Ë[°Œž =`¸ŭxèj?ċÜj­ÈC› Ĝ {òéjeĝ;Z_ċ‹4í%Ìe °·<óÌ3_ŝdÓ8̀•ù1´1U£"`eÙèÚò• Xqĝb0FÊw ö£·½ísŸûÔaC\ŠÁŭ{ôßò cCƒ5dç Á–ĥÛ½”m(†ël`âM˜;܉àB€ŭä+H~"•.œŸ>mÈxF2`òsĠfi*˜o=ÀJĠu&ŜôQŽɍñ‚üáĉĞVšs e§P–n<¸ġĴ0ZÑú*ÑÚ0g,äƒŬΤì”ŬN k̘Na‰ /`Â*$Şj¤·ŝ9ư}jÔï³ÑVKˆ3$F]Ìk°Fŝ΃†ê- ñX‡–vuJaĞNĥ‹ĜĜ’ +ġnb•+ìšÄĈ\˜zŻÒhŭ¨/³˘‚²)ÚW,ßİşċCWşıhÔ8"|}p‘â½Îşú·F˘ĠN·~ÙëN·hĞwûy1]ó*¨ġ£ffŬ?ó>ìb€âZĠ½R~im.ĥ`ĠRk2Äǰş˜˜˜¸–\0n™ şŒ%‡Ñ‡3:= 0 0 XħÜÀĵ‘Çy\¤Ç…Â݊‹Ôj0 0 ċ ô°ŝu´j€]Q€9ŒĈz+âçK‚``j€ù&ĴVSlŬ5X?/i€]Q5Xż4À4À†şİĤĤ£Ĥ6HÀÒ1AÂë,äK9xi€i€É%*I$EŻ~ê€ZİTJïœu˘’e|DQLL.‰œ(él7À„G´N`·ÚĴ•Ğא·N„j‚i€i€­0ñÈÖo-tŒħÒ#^X^ë,c—‹Ġ`W·ÇŜIüöµ$ÙíG·TğËkïAVĜIOğ°³xİÖuêĥb×{|™ğ€U rIÚyEíALHÚO*­’:‚°5ç½ôeq-B#ƒŽ-†’”Tqĵ˜(Éô€´–%KĉŠ­e^Óg-ĤzR˘ÍÄïÄHŞìD.‘фѐ¨Tò£> AÄFàÀ|'P} ²~ħqQĝ"ZX—ÇٗížĞĠŒ JÏEFi;‘/)VÎ÷ŬE6‡4B5Û?{ŞùÁ8A4#Ľôuq-AŒD8`$&„›7󰴕G ?2’—‡ÄÖjÛŝëB*á—î5;ħÑm;Q½fàĴáħŬ‚‰‡ú"wN!ËPÑĊ˘xŬԏÙÁżó?W³ġ*cZc0‹ü£Ġc(`À¨qWap€ċtÍŞĤž\O„W—{°`&`~q'DĤ+!B,3ĉ#oĠŜ­ï`(ËàÍ[ÂëC jBVÚ[‘ġJżÎ*ÍUéFˆ£ıÁĈéĦŻvÀ8jc|#ÄhJ°ÚÄxyµ€Y q€ŻQ?˘×g¸àAÏD.ÜSp “ŻÍ†°ĥ!Óĝáoİ~£è0—`ŒKÑ=˘p‘™5Ĉ—LZ°„9ıKï€aUŭƒ̀~ŒešG˘[0 uÎò™/l `(dUu‘4Ñ0>6SŒ4v,ċ%Ğş‹4ëT³v#Cùƒè ÄÖpĦƒÓs[°ğTÔ¤ƒ5ÊĤĞÚKŬ²£ÄH€QŒÍc7ŞOŒJ{!şÓ•ݵÌH™Ş'tÌ`Ğé­8\‰ĦcEUŻĥr+2Òƒ~£&ş `e ĦO·ĈJ’°×Ô 6Ħ“‡|Š ŸA|àw2‰’Ŭè(M `(…LGí„ÎÙmĵo?¤ħ_Ì„†¤Ô˘Ôë˜^0“â •0}Ĉg"19`uö •œ5¤ÚM%Fċ€şĈQĵKĥ8P‘‰ùÀ žˆr `ÀèëĞĴš×àpBoju‘v£²ġŬ,6£z½^jcJ€9GBÔPôŒJ‡‚eàëFô†j+`\B?2˘‡8Ì÷7¤AŻ@G5׏ —ŞÓë܀cËvŭĝĵÄH„,„ħ\fŻ@ÀäÏO°¨Sokmĥ ÇùœNyŞAétu-XÌ" ß%Àà,‚k˘#˜‚]|3Ìş˅pu9Š=ĵ×dQÂ?PkşÂ6°°~“)§Ô˙è†\L“n0Ĥ>X¸ÁEàċ€ıckìĤPˆĵĴ3`-"ëĤè­`éh4­Ĝ`ŭÛúFÈÈBÈD´”€0Zäĥ `Ñx9’#½ċŒ‚û¨²£6RĦt)PÎĝ0[ ^ħX. ën2šÙ2€İùĜ@ep€uš: BŭaYwk<6^'ıp‚£bĴèm¤CIT›E˘yNLĴwÀŞ­€…£Q°Š/êG€eü—‰ÄP<ä5À4ÀVċ"+ÈEV²‚‹tRG Fy+/PÙÂD"ÀüT8Ĥĥš ?ä@AC ò]ŽB0]àËáK °'Ŭ¨fë%È7Dr Ŝú3uyôÑ ?{êŜŸ­! ääÏşÊwŝ³ääÏÖ-}ĜĊċáÍìĤ£~µ^o׎VCT!‘[ŸR—GżÙ!áİßûTGé’ôÔS'Ÿê*ßyĝİääSë–>ìb€²İ€Ñh ZğŬ×SëXp‘ŠıĦ š‹Ô\dżD‹Á4À4À4À4À4À4ÀÖXĦ XߛžSŒ‰Ċjj€ĝÛÙ3…Z÷‚İtgÀÒĠXĴĞöD“Kj€5„Ż*%dYs%FË•Ù>2ùUu: ŞCĤı’Y>ìĤ XÁé ›3ÓĜ8?ĈFo,´,…šÂ.ÊY„։1gŞ`É1+ş|œé‰qh jĜˆñ`eáĵ"fpV·4`UşŽni“N‚ĤÁ5d$=2c$ÁÖ8ô˘6á?Rm0½†ĈŽT]d5?ŞX£„†Ö;êí€UJ%4@Ë^bÚ 6°@Ò1G2BŒÚch›AŸÀÏŭħôÊtÔJ%/–H +cÑÊħ‘0úy¸ĵӕ%r4ÍnYÀ(G×·°EÖéħaÓW£ßÓ42‘ċĉàs„JĉJÀáÊsÁ\.RŻ6àPĝ¨[ 0  F;Ä`Ê$yÁ˘‘`Ä8?:Ï'k•V0j0 /Ŭ•ŽÔ˜pëG êĠAÉÇ'oó+çéÏhÍ,”âÈJÁ ġˆ›°œ­v³áT_0[ËH€™ÑzœrqE7žë5‹t j·ÑLßރÒm퀲ۄĵŠ{(ğĤ?ŜÀjĉf~äwd )`قş[/v×Ĵfħ#›€"`9s‚ÀĈÌ&Żl8âJ€•;V3Èn½mÌ0C§‚M„Y ˙×X`(’‚,D:ġè€ò³n `( K%ëîĈÖ­Á(Ğ [Ĝê¨ 5Ëò5XĜÍ9{×`ġü*kVù­€ıaş `TgÀ‚]kŜ³/µ†g °ˆZ˘9[ue:°| 5q€9DşQ4Ŭ˘€‘^—ŻR ¸<˘‹tı‚ X-àòyšF YÜ\­[*‘Ü*b} ğȸ{ÀÚğ)|„ÜEâğ#3+Ó>„n³#ÜìĈ†ï_3W·&`žY+U8<V+•t­ÁĦW‰İ6ÈR ǖ [/•ċ·Ĵ­ë ˜­ ë'ŒµŽ€†pÉ0J8­›éXn”Pö~ùíNé@Sñ¤¸†B1cİÁm `Ò}#WÂ]E!Hëhœ°šq-­c°²e$˘Ŝ“ß0+&ŜilÌဠİĥ‚ġv,C(CwP½Ġ`Ŝ8îónHO"ż´û"{,Ĵ XœÔCÓS¤;†’*Ñh{ÁB¸Ô0ÚÚˆ'Àl‘¨ħ{Ĥĥİ€İÎMQ#ŒëMQ‡‚Nv*Ĝî.Ç`²{g#à}b+Ӂĉ֘Q'˜m£“âŞÎĞĥÀbĉĤ€]z:ƒ@Şİ`iÛÊA>·Ú ?)t´Úbb£“‚|Ô½e[‘˜[ 0CÀ\Ŭ:Z =uS´V0Ĵ°4š…Ċs7é\äFW`5Á°ġ6˜\O._ƒ‹ì˜Ñ0]\—œë™ŜZ‘Úfۀk‘-€Ħ#‰oyÀlTĦà `QÀĝ)°2ĞÌ£˜ıİ0ÙĴ;í€ùe­ÙuÉ[‘ÏĠH[ü7ÀŞ@´™ë󕷴·`‘ DžÒ.K“#š.2ÔÀbDĠÍtnEF;6Ú 0[µ3`èÓcİfŬäz, ĤK °šEp‹5—A13ÑV,KG¸ħ@Ñ€…’IgÑE{İÍ ‘‘f&–m™í² C!°ĥ6Ş€e î,5¨ö‚i6Ž&LçZF¸(†ëxu„Î`§iƒaDéz:ÑQ£qÓ`œFuX5”ĴJÓô…aôdàY§Ë;`ùN…O…Óx 3 \$ÙÍĴ°a‹DT‚ü8Ċ§:#Î2n éèĦĉñr[Á2Q°Ç:L@'|ĠFğ=Ñ Vğ0i'ĝĝéoĵÌ Nj|’zˆŬvœ:€K… À|/ÓwÀŠĊ^Ĵ‰(•6‹mu‘ıH7Êd{Á²‘ĤTğ†ê:Ĝ¤#)–ä÷‰§#×sĴ‰ÀáĊА;™×GÙOeüÜX¨js9)Žv ÈçTkíĤÊfùA4 XÊÎpA&U(Ûa…ók€i€ġµ›Â<ĝŽV °W3`6 0 °w´ö0CL1ùIĝ֟ĞË£vHĝùS÷ŝ| I 'ŜU˙úÏ{“?_·ôa”‡·:`…„;ÍóÍŻŻavk³ëĴ[ÚòğµÙu49PÀ´LĴ“D˜ Y‘ulÓâş×Mj€i€­°z ŜLĤ kê˙ĉÇ쐎­V9Ĉ•òD5À4ÀÖXÑ"9cÀžĈ=ù6ƒ=Ċċ|"`1ğ=•³›C ™rÀBİjŽ3ĉš×"î +Ĉ_£Ĵ…ëĞÁbnQŞJÀên·Ż€^UUÀH7Ŭ0ö7>ÒĦ`Cn·‡X·ğÜ °’ğ´:"n7µq€ċŬaĴÔU·³Ħ¸ĜÓ X0½Ùlé`Náь#ş`h,0š…0˜â­€ħ>£adÂŻ*€ħU›ïRµ`Ùş‘ĥĞN~‹ž××Je„ŭëƒÌn4½U‹·*7BO‹£ÑDoÁĴˆĉ 0’`àƒ)Y –í`ʎh ·şÈšŬnċŸÊ—K·Ĉx K(Jكj…ŸI:fw¨,‹ĈİÚíh4ĦħĜ°,şYz­tàÁZĀĞâÌ"d7Éüsyíé­è"IŻ\¤ßçG?k³XĜíŽ!ÀĴëŽÁœŠAÎÊG*²û>DÀâNaŜ€ì˜ ` 7ĉқR/Ĝ ?NµÖN1˜y=€9 ŸYrÀĵXŬŞ÷E–áÀÍU(Ì2šNŽ˘ b.Ġ04‡Ġ [£Ĝ~ViÌ-UžÙÍş :LPÓĦ`MPñ+ÒT31k˘ƒq¸á#Œ³!„ĊÎĦ†atĞOòS.ېĴn uÖ>ù‰[z³[ġ™Ŭcİ.kC/ŸżS+’ˆ­-tÔ„‡³†Âà‚|½e˜8ßéĜòwv'ÖèĴÖc%FR\/€uîĤcŻ3QZÂĊ`ƒ2 €5MÀJÚÔƒlĴPC.Œ%k-€ÙീÑħğĠ –B3ç2ŬËëŝĈ‘UÓÁ¸Ldƒ‹ °†nyçÇÇG5ÀúX—ż+E—ÚûÁÔ:6›IQ)Z‘xúàZÀ2„™w’Ğ£ĉ@[ÍIŒĈ˜“àùR!Ĉi °µĉS ÍéŠz6Ĵá6À„K¨ŭˆz*Ìê…/[ĊÌO*€ey/ıZ:„Ċ­ÈN3Tô°ô(d\Ñ$6A]!³ë48†e™l˘`,éÄm§1s£0ÀŞ£––ħĦZ°´iDÙÊSV78+5Üĝw†6b5QŬ7HÀĤ Ÿezš,~ŬËluÀld~`SĴÖEbÉِ£4•Ú3–%7*zÉւ% Š)P”€™ QŒTït䂸cƒżGÒ3@Àœ8ĵ³—ÜÖÁ˘!Ž g…òJÚ3%…1[YÙÑêB ŻÊx°Ş0#Éd‚ ÔË!)PE7ÌI<-ı1™Ìu#$69'ĝ§şDٟŽV ßżáĞcì+#Éò–íĤhıĜM{Ĵßû€Cğ}T>äDÌ'ur­€<ϨlVg °:AŒRp€à!m‘–‚-‡ċ0O„'ĦXXoÂÏL%<íŞ ĉt„aĝèap\Ġ° ñVóѵ0üÇš#,Ġ­ Xˤı ‰„í`ŞV£`Á@ˈÖì¨$Q`‰ÑéäċVÀXÒ9‚|ÖȨµŞ^°¤KG’ µž|+żS³'ÇѤôċ֕è€)ö–ëÌ™1j´á:Œ*£Q™RfĞ֏¸aCoú ñDÉUĴvӇĜj[uÁj€i€i€i€i€i€­°(“hċÀâġÇŠ.s¤˜Ĝêcà Ûà§Èá'÷2"3Ç5X†³U,Š­ Xµ$—Ĵëeuyêİ /˙êáN)/żÔ9 äĦ—ğÊż>ŝròo^^Ż<ôò0Ë&Vr;)n<`Ëàž|ĞÁ–ĉò|':isç<\Ü6qĥˆ-\2NÔWlÌĤûV—{ïíCw=ÜQş$­ßxòá䏯[q|ĝĦ5-ïU_ŜÒŻċ=ŸÜ”ݲœ!Ûĵò„k‘ĉZ”D€qöZ$ħr Ĉ6äBn9ù'˙nò'÷ ŭ|ó.ġċ£²ċw:-?ıòòŬ—o.—/oٔİ\.F9uÀˆĠœž˘GÀĥz ö'Ä:ċ?|×+˜ġċĝċ'ċ˗QÙ·-Ì/?.[ŜòŠêòİNËó˗ċÏ>üè&¸ÈjÁˍS`à`“Xï€Ŭó͓¨\ży•è£xŭ;x½ò.~ù̟úòñğ^jYŝ¸Óò“ê˧ĝċ7°‚Ï.Òïñ€MäS Ùĵ°·âj€ €uôĞ’r_yך|ċÇĠ}ċf´"Kš: Àr%ĥZc °ÂQ8‚b*ĵj…š’PjĠY°Žŝħ³—|{ĈÖċùÂKŞ/Ÿ–ĵ¤´’Ñ%+~OîTÊûêéh] ° h˙”Œ+&ĝǞĵ¤Ì?öÙKŜĠĉaıY€uyšj5b4À£ÀB+ĥ‚—ÜÄvİh+^{+²“—|ĵƒŻ½¤lİҖ”{Éf›Qħ.,ĠZÀĴQżĠÊg£µ×V$żĦ^rèZ‘`=& ĴŬ[‘'ħ<Ù'/كŻìŬKnŞ‹d8–ċX °•³­ÔŠdınËnmI/ùñ^ĵä+=´"_Ŝô݃›:`ë&2ïÈJ­Èv/Ùk_kg/ùRĵäĤLĉ¸H֋ĤÈR *‚nÔkïĦè°UxÉonlżëfLMD¸1_ŜĊO`Ż™×ö|Ò+0yĤÄğµ"ğûÇÖċĝċ'[—½ä-ëñ’ƒkEĉkêRO §›Ë/v›ı‚WĴk Ö+ĴġZäZĵäzö’Ğ"9¸Vd˘.4—¤€…RĥşĜÚSúÇòэìwŬĴVd<›CS00–ô =`,Ò'ÀğêĜƒŝŠÒĉ.1Ĝ£½{ÉOŞûGÑKʖgħ—ÄË[äË|ċĉ^‹ôAќ°2œŸIäKÖN¨™M˜–³ŽJÓ6­0ôÌ"˜_°äሽşROEÇVd/^ò7÷’pħ›ö—˜^œÑdŭ.2UŠ7·~À˘-StÌJvħKŒô܊Ĥ~×ÍÌ"[w­mŠ•И´İ†ÀRĤ¸¨”ÉÔŝ0ĴŒI•‡aħ9Aè‹*€ħ²ċŠ€EGÇsıH€ĊFċvì'yJXG_Ù/İ|Jü0{_‹„êk$Ôƒ%š%c¤[ÓLÖ¤jïRzI06mWÓé€3ÍKwÀj„VĥÀôŜ›fVLjE²Żġä†\‘ĵrŻE&Fċs Š€Éc‘ÖĴ ˘YħlĠ­HÖAŒÄZcÌ9²òŽv ŠġšE)¨èníì"ż~rí^rĠ-ÊUöğ^ħu j#퓳ŝ΀ •X¤c7E’? Ap‘9gS…\ Ñn€ñŜ3„4_gGÀ û(<Ûӄè|óžŽ1˜œ¤Ŝ#Ş ñ’W,`1‚p¨uSdô+fïÜ–Óó%ßä=LJXÒl½Ş€ñO6‹fGÀiê9o÷KŜ*­Èaò’› XŒÉQ´|â\sù(gÖXÍFŒĤTûÁ\bF0<ĦK v+љ¤)Ġ‹ˆÌ“vÌÉŞĤڐä[‘+xÉÍëwŬ ÀX½Y~ê€ĵ5À7NˆiĴ™µÑüV†ôtÌÚ2ċ¤XZGX”8uÀt‰î€ĊÔ3àßÛ0óx…ê­›üż:–•>?Úııĥ+ٝú痲ğƒ~Ì/oázġ’B+r+ğEn<`Éâž|‹>×ĵĜöÛĵĠFâ(úG-:gĊmñV)›; ³ĞŒÒ‰ÄVÀâ-ZU †<`A0~žsÑ °’j#Ğh´xWŒ”ê+‰°BÏ­ÈMġ’òġnĈÔt†3däğ%ÀL8îŽtƒßxIPĤ˘1mŻ °‚Q>t+`ĈüZCӘwŒÁşĉ'ĝ%á[éR‘ı$Ċ:ÑêŜU[‘òċú[”ŭò’›0uírħŠ‹Ŭ֛]$×^_`1ı+kŒ0˜L ĥ`ĥn€eUˍ €áV@´`¤žà—••ór ÀĜn.ò5zÖ%—ŻË½ä-½.Ÿâ—ŜœnŠ2ž: ({҇tħ;ìgû˜…î ’Q²S –\u –B; §Óèż%Ŝħ›"„Ğ˘,Zq4êëĥ†}Ĵa…Vdk_ëj½äşHK+2çó‹ôû˘ÂÔEÚïgDéóĞ~Ÿ/ÍRö`Áê'Ġ£PèŒc!:Ê>¸H 0ğ`—ž|>˜r(ŸôĦ ˜‰SLmŽĵıA^r5W'7£IAٛéËQ,]käj\(‰›Ž,¨yĜf6̗Š$W„ĥSâ(È0]Şp}=g[K?XWÀ˘\ıÑŭZ$ħÀ¤ûhSÇVäڒŭ’0š"E°€¸úĠÑk}îgûh ¨HŠŞ€ùğ÷ƒJí€ċŽÖn€ĝ]DĤVêĜ8z2x|”ëÄëFR³Ä§ÖŠfL ç IDATĵ÷ċ.­HùHׁÛi÷’›u-2Öa½o€ Ŭ£U+šFâŬ q];Z;–ÑcÀ˘˜c…V$Ċ<ÈÄĵÈî/òôԊ\[żë N^™—Š0ku-€eĈş^*ë Xp…á:xĀ™ŭZ‘ŽnÏ1$ğ´"Wë%{¸V½n/yċFw,ĠÉEvŒ (:1VXF¸P€wÁF۟VİÊÛ˘j­È{_Ù/ı–+’W&`äxÇV$YàËÏ@ĜjĞĴNrŞÌRY0 ārwÀĈ°‡ŒBc;óù|,ĴXìtWÀ:zÉŻoŒ—ìĵĵBGS8;µ"Ğ(òTÁħ£Ĵ ğ`NeïíCÍÏáž|–]0µ“Ps‘¨SÂ; .UŸPŻïŜSĦlEnˆ—|ĵg/ùoöÔ9ĊÔáDŸ Ž^F 0ÔSiĦsĉ£EÀŠz“M£\'ÀJEİXÍ>TRLvE‘[ÙEUİ+Y]‡Vä½+÷µÜKG+2Á€ÀrE·İEƒspàmµ39JÍû˜u†.ĝ•Ġ%‡n*ĥ†ž¤ßü0‘„J+r^²/]XG‰çò^n,˘:šBL^?`Sì`,Ċ­0üqĥc´†ú#rŞ£¨1`÷|UNÙŞÖŠ<ıÊXjµ^ò–Ŝ½ä&Ĉù\ğŽ[ÎÇÄs%‹lꀄ‘°8ÑÄ–úşëŜÑş*ÀÔÙè °îÒФz‡ zóOïù;Vѐü{.÷÷£ŻuM^r…Ön`­ği‘ËùA"jİ`òžŠ›ûáÍ?U4$›­Èĵä×7ŝêäĉ„Ÿ&IAlEÀ~ĝĜ?Üüs[­È!’›Ĝ€{ò·6`ĉ”ĥ×°ĝá?óĠ­A~˙ĵd/vV%5À† 04c@ÇIË!T½ùó?üĈ7ŜwóµZ‘=ûÊ ğ+Dl¸CŬĝ32Ü͟ĝĈ7ñù÷ŬìXK+rŭ^òqùsbzò’`şÀP™è4NûÄç?˙ùOÜÜĴÄVdg/ùÊF{Iy+òú ŒF] Ĉú‡\-XlëġXÌï/AÈ é÷5ÀÖ Ĝ=7ßsó·˙áSÖÑWgš/˘%—€ê,„Ĥ`HġZ•³ßß–‰F]îmd ŭÇË$ìŜġĥ%W’—)quô"Ħúʖ8 °5öÁO)|ûˏŬsŸ>†6ĦNúÇÙjœ?•ɸĊY<\Ħ Ç’ÈÂ/ítÔ-U&+Yá?–Ħ4öÀ`ےĞ,ì•$JÀšÒ˙ĝjìÚD"6b½ù‡ŸĝÔë%ÀÜöáGÜò€]‰ ÈĦ_2żÀ-wÎ#ĵtTÀEöÒşöÑ;Ğ,€ŸÙƒ¤[3`ı˘˜ °·:ÙŸzèןŽ‹€yâQ,, –h%è4„%f(ĜD  ›€ ĥßuµ€‰%™\;`}íh3+ÄúĊ‡Ôċž“u’ğZKÒ ‰=tïɇzğ>9ùÉxß=e 0.iÌlÑĦ:–ĵ‹¤9ÉEŠ€=Cć2˜ċÉ-Ĝ8­”:÷ސŸŜü‰ëÊJ€•ĵĉò‰É‰³,kÁëfÎA£š‹ĴzŞ|+rhDlHäW÷Ü|ŭß1´?S³œĦĈĦİxœŬ0ĒY°ö&`ĵ‹‡Ï’ܰĈ”ÑÛ\yüĉû.1\%.r Ó˘KĵÙtšċÈ4,iDMA° %QĴâë4ƒİ„—7t€|‚x5À6WêĊ\˙:Z‡0Q|`›,•Ĝ•Û$§ĥé€ÑġKQ ò5ÀÔèÔ‡ °<~i€i2ÀbÖpȚÑÓd@€eŒF£­ ĤÉ \dĈbÓb0Mä§H 0M´V¤&[0Ĥ"ˆ˜&ƒ,$8$€M4”€Ukšla)d%Ħ†0ŝ1mš\i’ñ ` ­É•( 0M^€|š\‰âÀòüMNv—Ûíöވ ìµûúŒhż}µCt;TŒ{‡u:;$àĴÙzÉ7?ÒehA2*í’êğPI 3jĈ´ŠħŞjLö×#4íßQÊĞ3°µÚ‰ĉ ÀŞ$¤Ê[ÖOG Vöz+t &×?#Ħ_ŽĞ£µ"$,{9£bĴ¤U :›£ÄWIĜ/µ.ÉË]iÔN³¨(ôÚñ·SùM)ŠÄ[RĀUÛ #‡ĞÑX4 ûĴi€­0/Aĝä€ŭó_]÷ŝ÷żáµ˙ñN%`aŻŬi÷„•€E°1¤ĴÍĜ({Ŝ™FRÁHò7ċyk4‘^‡Ä<ñĤĝ$À %4˜³VòI0*žËeÓĠ XžL)_rÀ2xL(ÄÉ1 °>–ˆÇ2ÀŠ×ŭĠ÷?rŬkû·_–r%K/<q䀅œÉ˘Üˆ óFż XéM÷?Í+÷ż3'–İ3k—d éċ*ŝ&`ü3,ÙhÖ'†nÚà*ħP0*œˆ*^e9`|ċ²Ñ˜X?ş)Ş´ °ŜşBıüĤĞnŞH€EÔ‹/ĵä“Oğ"MÀb˘Ñnw`|NnlTâÒ9')°ġ̞” 4Ż@Pm€qħrÚC6Ğer^R X*qû|.´ĵŭ ş02[ F5ÀÖ X%[Êğîû_xÏ?ż VòĈ_|¨yäɤ§(VgS‚+{c’‘’\¤_:çH~€€ċÀñ˜ËžÀÈ,öĝÓñ´ÜEFÏ\@êèŞQ;­Èż\ŽÇCÖ Ĝşk°rFäżçûşJ8lYŒ´_@uĠ#÷?iϋ€QÖĤ1'VÄĈçÑ‘•\¤[Ĝ£Çfµ0O8á'^oh"Ŝ,S*—ŠIo^î"ħӄĝ3Š÷Ħp‘`,{`ëĴJK.òuoĝ÷ù‡ŜpĠ˙V óYYOÚùÜsO?élfĞHĈ&`M£+Ûâ"ĉp&³ĝÊ}ĴLa§¨,vöE†ayöM[°j/SáĵÌE˘íISblUi…‹L×*x²DĤZŒk€­°b3ğéßá úGŜ˙ÖbÖaJȳRObjî?k“Ġ`ÔÓĜĝé³òĴiÌ*]dÄYxñ…§Ÿ~Úëë `>'IgĴq%`ç^„ާñ´˙âïK€ħt×cɔ+Ùt‘¨ XË"ˆ8U¸ÈÄ˙[T‰ħż~ŝùŻMh€­°\QŠÁÊ7½áCùŜJRŸÛœ+ûcO>Ôüù# _YĴhK"`McR2 .ÒBBtvöì“O›ûXĜhwZi%`h2öß~ŭü—$ÀXö×1`,•òú•.2„ħÍEŝ‡żŭ³ïAŝüZĴO­ÈĴ,ğé ïy[+y[Äjñ „Vdܑò‘Oú‘§]w6[‘‰V#jE&íıVc£{âà‹/ĝÜÙ³œ½ÓŜ—,j2šÓ-.2ÁPĈïOŒÚ.fy÷ü×B ™&dĊŞ/(\düwŜĝ™?Ëp,{yŝùÒ[7`UY †{í[‹yWÀ6n´9ĈR?XÔqçÙ'ÏŜéxÓ#w6ûÁbĵÑ)q?XÌŜjl”ßy˙Ó´'­KàëŝGÎÚúäG-ÉÖ ßÏóġüğžàK6@ÒV¸Hτßï7Np‘žXÚ˙Žo}ë3ïŠĤvñK_{ŝùg5Àúpݨ è+ÇI:b[-zŭ¨½Ù“ŸôżŜjġŬùΛ|fO~2`ĥŜ|O>2Z}q0úEéxgÌíŒċϞ={˙ŭŸî`tĤ­éfqĊó‹/ €%òD†Ċ~Sv‘Ĉ’}’Ĥĵ`ßû?żò·˙ùo˙ö[ŭµ‹Ï>û˙hAŝú]dĦŒâûJÙ ‡ĠU*•e×"ÑTàA^ïò+"`9Ŝ˜x½Ë,K×"£Ùé ”ùk‘ċrô=ê/ˆŝžuSä*ħ*ìÏڟxĴùŜ÷÷Ä?YÌ׳˙–ğH› ~œ5]ä³ßúÖ?ŝ?~ĉÏŜĝĈwĵݟ}öÙŻŝĜúc°B3 ÛĝÈ<è´[òKEñ˘p1“Û‹•F0^âŻw{<`X,9Üş|¤OA`%ÏÙ €ôì?ßôŬw%QO~]ŝŽ$Ì׳˙Cá"­ü)e˘(µ"ŸEĜ?~ĉ3oüPúì³O|ġ÷5ÀÖƒĠd1XÁd&Ż×:‘–ĉȉGwƒCĀeŒLFdT†ŝ&` ;´ 9û´×û˙ 0Ú~Sô÷ßġ×vÏğûż™DĠޏÔt‘wÖI€ŭĊéHY ˜ñ"ĉëğ`}ˆÁ²ò żlÖ ֐×6n‘u´R&Ŭ¸·Y3Ù½‚‹4Ñ #ê3™L™ÑÓ ¸ġŬygúĤ?JëĴ.ŜX‘F^yâ‰'ûŬŻÊK`žx˘ X*qǵcĥ"U.RfŭĜ_H×"ż÷Ÿ?ƒ\ämŽv£ĥ~IċäA~Ñcµ8lVw‘VŻÁ ó‰.RS[j0ĜÀ's‘Èóz<^úì›Üž\4Q ×.qo<*Is¸Nü]˘ĵ]ïÊK€ċŭ_ûҗô× 2‹*^‚‹LşŜĝgŸùÌĝa/ïxGHlŭ1X‘V 8Ì AViZ9à0SR;ï"ci…ħ 0qÀĦRF7'×%™äš£)dAËÓ`t–ß2“\d1§|5ûÁŜġ;ż‹Kğİh€­ °qşˆ%‰Ö‚"VËív2b¤TÉ6c¤úŝ´ĜXÄëÏxmö²jr-`Óé̆<Ĉ†Û-ĉ–³¤?n[×Câi:w&şgYÑi·úiIÍZŒ:Îì´ÙV~*sɳ'V>ŠZ|ËĈġĉJÇO˘{[;v1^,–+¨­,fxFŻӏétVĠï  §½rҍ”KW–ii|LŻ3­pĥl2ÀôŬž3ÏĤ&à‹ Q!OjY“Îhİ”c^ñ¨z½Î°âaT-XÍŞïä¸úˏ~ô£˙£Ž}‘&”›b…ĊĝœÀŜç#ĠŸACöJ}=éŒ^göú|-ż&:Ӆ×^eç& >7ëéÂWrBïöù"UñGy”²è°Î°2Ù/dßX~ċ?ù÷À×G˙qWa”ÁX²ıI ~îÎUğ|…zJ0şÚó*—ğDS1Z58ÖׅáG¤Ó;˙ÎÈÈkmÎtš4z €Ôé\+W¤™È–Ĵáġİׯ˙MìżtŽMYĥjù6;”  ‹.>²ˆC ĤڞJëġ=7ğĝÖè,w>i‡ÎVîP³%ÖÜĵ£ġ: ~ n]şKí˘Wüb`NĵBğj9(XHÑá¨<Ì­䳙’jV>ñ_˙ŝğßŭ/°~·K 0^>­¨HÒ:J]Óñ˙€N—âêÒïżÎ1,ï7lşħ–6 ´d.EZ­×¸*‹²’ÔÛÉn€ıžŸŒâı¸²ĦcVá›Ħş´ĜˆÜı,Ğ:eĠĠé,ù*:ü-JTş™i'–ħ´ÓšO¤·ZUœÓĜ˘­È²jä™ûˏJò×]ĵ1ĦĞ0Z§â›Ê:‹XƒjÙT–ji§éAëAˆä|dsGh›2Êf…ĉDÖËÖĝw™tk\Ċ³·:Cf³üï…ĥêüŠ$Ğn˘ÑŒ’b³\:-ö˜­†eŽé˜‚û’U§3ÙĵY)Kfşâj´–Ë’51²Sh›˘˙x-—ôGùlŞe³Ġr6cĥd+R½ZĞd€ŭßżîÒ^Öµ4zĜĵNi´4H”§Fc(Ĝ>d19”Ŭ`D.rÎ è½ĠfÛÖ`0Ĝ-°°dYŽÉyf£Á ?ö¸alÌ`é\dL§Gel0t&bµšĈCPA1AH5:$ì?œÊ³00š´çlÚf²š †€X4ÉUÑ?š+ĤPESOLĉBƒc A] Yhèvy˘Áñ‰9ôxäµgŜfÔéà íò‡lĈ¤Ÿ0tFĜ´ä4˜­k>EM%ĝ†ŞxŽ MX!— (|IC.ĈMz#͗ Íf­ŜÑZûj°>ż Àjq•Žˆj¸ëÌy ˜5_/˜uĤAÛÀyDŒ:üNs˘¤ßhĠ>`óÀçÌEŽ4£u(‚Ĉuĵı0úç‘ĊS~‹~ûŽħrI[^*fĝ*´ğ4ÁtĊŞMgBsä‡uö†ÉŞÎ²Qçi@]‚ËšMg,ɸ"üHÒL¸*A]]SzPĥôĦ6@ !aĥĜ¸7‹rʊ*+·NŸ* \$ŜÖ§‹ÀejrÏ@gİ4Š8#Ĥ‘s“,— oyÀž•ö—ğ&o%4jħ&`R—}µa & qµ ŝ³,Ş[ 2aôÊȍ ëuŽ*Š”­ñh˘‹L!XvE™u~yw@ZJ†cIóX@òe” DPœi^ê\L͇j1›&&ü”äà]:CĠ³cžzÍáİqĴYg˜˜0OŒƒsD-ÂnĜŒË *ÚĈtA0d pn(5ÊO$ "h@è\,ĝj=42Y`ĵ¸żÁ·kíU&Ĵ3àe]ĝè·?! XF7–Knb,ÂĠ=c´żÄ–Lƒ}ô£ß °–V$TV6!ocYäOâfcÂ×`\•+G/ÛŻÒ4 M¨´îP/S„Ȇ=# ŭ°@KÏ}\ŞŬu˜SîĤÀ3:ña:u6ŠßM ħ*Q•Jy4êU¨CmiˆqÙ pƒ”Q,‘d 7@ÀMWpσQŜ›ñ_·êì8°+3(,ĊöĥjċÛÓ 7ßÜWì: E{…Ÿ%#t´6J(k&Š<`PÇW“F¨[‹v•FqáVĴ¨ìżÒ=Vò†ê|<:ÜzŞÙ}˜sèG)Ĉ% HÀ%ğájċ˜…LÊCħUĊŞĴžÔóí{pl`5%`îVÀvˆċĜĥz­ nj››ĊQY„•u9YĠ e V0ŭŻöžĠqd[û@YB`0J(SìÔİ2€‡3Ħ“è 5‘SÁI<`¸ÁyŻı`œÎJÌ8Q `‚#d.¨8(Ä .BïZU²-{{wï½ğ{z{Ĉ5=Ŝ²ĴRĠ£ġUµžƒ?¤–àçâÀލBÔ(€q÷6ÖH_”Ĥgñ`΅ûXmÚÄÊ8À2ĵô-X3‘İP*B‚Ú@Ö5ôàgĵ[Iġ?tÁS/üžä&ùZ"Vî‚F•˜„ut}vFŝR%ĥş:¨ì.Ikĵ9ÜĤĞŻr§M¤IïU4or j3éÄi*JD’_ÙܕÀî%ŬñvijĴöàE ö "W$}•šè™b˜FÑ&À Âн×çş²˜w–`‘&şĵÒm—ıÒBqµ€VSĤĜ4-MµX ĈĝîeĠşŝ€ ‡šĉw°äç~„wûnŭÏÍpĴ%akİÁ!ġğ6.ñґċ6ŝ9UĦƒ{÷ù>ÛĝġRÄĉ&4Ĝ.qˆD’&Í~ÖÀJïÊó=j=¸Ĵ“¸êüPA+ R‡à&ê IV´%ŠÁ)ĞE3˘À£ëÑY&}ĝ–R0–ZBĞĠżˆ àf Ĵ$›÷W>cĎ4+Ëœ%{`äC•ÛŬĈ¸èj,Ħ„Š5|ijVN¤Ċ šC–4ŝ/÷ħ%7*:Š"K ŜPy0sßóì1\†Zmïg!şž;†?(oÓĦ¤xsçûċ?CЧ?ìo‰9_ Ñ´ħ<°Œ5bûxëÓ£{g+ˆí€·>wJü§ ùéö?,Û{MW˘À ÔÎc–\6+ĥ—Ĥ9öjA‡$rÓqB¸upúÉğĵç¤Ğ谞żÄô{ËQñ‚{G,ñ,ÓÚà͑ünUeÈûšcžgM}χN÷ĝcD ½"ċ­AO{ês9 ÏpWĜWtSbçÂ1xs‰Ž°ï\Eŝŝñ‡~Ĉ‡ùí°˙94·\üe|H֛zı s.HŽ­~óyyl,ŻCeOÜX…LnIÍ4ŭD½á²Ïùğċ3ç•Ċ“jĉ×{²sD­6½è“S²óIiùLŬž˘1 ÖŻŭİç–Jîr°ûV£>°aĉߏ:òÏ˙÷â³Żŝ­€­ae bùêŜrùòMUxzdÙ<ĵ|Ċ³Ŭ7À0ö0ĊO§HĊż’?²ÎtĈîĤz”gÊ}ì_(²¸ûŸÀ>ŝòGÖg 0Ż˙Qŝ|Ċ1´úû??lŭ&eÜAWô!Âŝ”‹~lÊĞÂ>üĦuŽ÷û¸HHú3 ĝ?ü¤“#ù÷G·>öUö+ĉޝ˘à'GòÊòÑħ€}9ÀB?ž§"ŸìüżÒÂûr€ŭò%À~=MÚ9<:ö°/X‰“N&Ùw#ßVt,˜.˙6BR ñ<}ìû7Ž?~ü·÷Û šò°üÏǓ{K\êìŠ" ín²à3Ü_…dlÌw­²pɈ8ÒpӂFá6ıg€%?ò°ê?ŝü#ûïccfëkoNûĤħ{Ùħ~`ü47 IDATż}iÛĞŞÚ–[|âJ}˙‹1ÏzÖy@½tUQU{“‰7ÒÌġw £ŒÛúvg?ŭ‰òáµÑ|§óL‹1tIŭŭpXb”f“´DçKĥ‰°<lëàġ’lϲ„´ï͸M¤ò~ĉ˙ĝUéù?żRë¤3‰|ŠÈĦÙp}ÒvżĝQY⤁’\ê-˘9_ĜèÉà’Ë"ÈDÀ Úĥ!| QϛËÂ\ÜħФ `˙ĝÓO˙ñ§Ÿ~úñ§_˙ŭï_OÓÂ~ _ĞÔĞLúOÜzá_0Liì³× iÒà Ż¸/ÉRr‹ˆŻIÚ¤³üeKâğ[€ġúçïżĊï4(2Ĝh†Â`Ż}eç/Ĝ‹ĝÓ"X€Ġ-=Ážò5g?m­ĜP‘hĉÀÖġEĤg-ù$Yù§ó"Ç(ëÉ֧Νöñ——ĥd^GeW+éÛ-(bD[”Fχ|S“ğŝ5@€™a#,Ìd›ñ3§8›´Ĵä.äZìì$XŸÄ"ù|ŝ*ÄrÊ8â%żáŽ–Żu³‹,‹˘äO°ßn2Îŭöñ%L;÷4µ%kĦk€ùš‘42ë 8ŠÁTóŞôÀ ċ.¨¤¤&—‹‡ŭ²ŝȏGŞ:/Ò ŻéŞĉż`‰ÛWĠÎPħ`j΢[Úĵáw8ŭŝ~0e““MÍg=ù+–C•†W6XvX0€ĦĠğ?ËÑÓT^ד^ËıÖëƒI˜û؊ŭ>Ĥy&UéĞ#†öŭËù#njÎ(ÒQßÉ}¤Ĉş[€oĉq—?żÒLB$g‘²·ÜĊÉÚEĊzĤ´Û,İâèfJ­–İJ‚Tù*Ká0%A\Vĥ$)ȓÔíĥr×+RK’Z„´KŞ =d~6R^Ċ‰znŠÛ1x|ÚnHH—VHĉñ<ŬIšÌ…–q˜R̘wZRğĥn*iÈùÙÌ.AE“ğ:%J35ĴhOÔ|G&ĵ~]„IÑXyĈ8cÛ5[Dw£*t´h#3”Bm/D“£.™‹âhĜvS˜a£&lĴğ£û×Óŭçy‡§/ıŽ#0/ŜcƒŠLßĈtȝ6ÒÙŞ°‡‰l–eAIÌÜÖŞDé.ĞbBŒŭüP3Ù"ĴÒÓÜj-İiÙ}> LŞ•Znµ‚XĊ| ŝ2³„k 5œ¸Ôá3EúŸA^ =dÑb!Jf˜O¤=ı­"Ë€­ 6‘B„£à0’ş lCżCD·Œ‘çGDìLój˘'!ëXևϝP™Á“HШ:ôpîĝ O“tm˜• RġŬ+ÀĜ\ÖŽWƒIàŸ/’` ˆ)šL\E´şĈ­`ä6V*#?AŭÀó"9çpÂHäÚŞĜ&҂–#OÛ§@Ù§]²üÀĴÈĞ›c—wĞ 5cTR§‘°b„/@Ö#rĊô$°äk@‚öO.]pĴ\,ÁëÇ Î âÇÈËé `Oü×Ò&Ŭ=XŻ˘²ri#ç˜ÙMşLtÂFRxĥ’ˆŽ);Ĉĥ°hÚ î`ż£*üx-˙û {‘™(j³ Ú[ VUşD訖ë8MŽM‡Ñ7U,Ñ‘ĉ Ä[ĉÀÄ`Ŝ—eu‰~@§Ê‘Z†JôèYŜ$­q-e݆YÁKŒtż  Qĥ‚à&lĵFh™˘uî0[*ё![Š Ô şpP³}I’Kg’cgËqʭ̵ÒK‰-Â蟞ħ5Ħ—0€MÊÍ.YÀn$ †§QRĵSëFŞS•`ġí›Ü²XÜ)ÀĜĉ›VÖï'3˙o/r"aù`"Rf”\‡j‡G€Ui„í`TaF‘¨1Î1ĜÉp#Zişi, ÷ĥŠì‰u ‘)’fœ¤‰Hž,dCÇ]y[4užïĥĵğ0Ö-"8ç0 ŝ 02€u–Ó`tn4#ħ<Ú~™ŽIĞÛdġ džšlíĈ°Ç`˜`Ċ&̽W€ċˆ˘˙ù Àŝġ*€Í R°B_K%v2ñ”ÁĵĦáü#ÀB.i2ç+; ŞÂ²˘Ëċ×;lr”zb‰›è=‘aš` •e™ ‰ ċMY•{€]‡X SòĊòlVíÀ_6`ëCÄ£ Z‹`äŬ’'Óĥ¸°èrĵ&dCV DmêJ½´Œ4"RIÏààNˆìNP†‚e£‡Ŭ\*$³ZHKäAżj,Z€*’-Y[˘ßĜµùìv¤Ğüġdĉ˙ĝû .h1c0Š.“``ä·ÜÉĠ˘(Ú('Ŝ°ŞÜ ŽP# _¤İİŒĈ°ÇYF½YQn:Ĉx³i4FnKŬŝíeßu‘šÌ#šÎ™(xŸS,gbĤaĉN9Ëĉю"š ‡t8 ĜÛUŸ€LKl˜~4ƒÏ“*£hĨKÊ"Ž.‘{%I?.ʕ,†U4”IG6çU]TúpŞĵŻ쨵†L]×tÒ^•Yż5-(iXùëĵIıëH‹‚ı-LuäáıO€1Cë™PjŝóK([O„UK3LF§c2ˆt#äŒQUUiħ&H/Ŭ 0”ŠDŜ: n9ŞĤ S /LÔÀvËbÑ"×ñ0µöàdU3ZD›rƒ&²e‹wœÎ_Ÿmiäë!°[bÜHìÖ}Ĥà°ĥşŞDĵ˙‰Ş²Kuz= taoƒ/@K[Ĉ|üU=Xĝ§ÏĈħúü…¨ìĞĵ/¸ġ>9‘§"ĵ/poİgpòĈÍk0)ô^§Ċc‰á›%7)Zë;e8dĵĴ?e·ŬÄ˙ûšüµ„E‡ÔÀĤ{@q’[,y6ôó•*˜ȓ|Ğ }Çg Û²k›‰†DÇ8÷NDdô…‚ˆì ½x ŞĤuÉ_11ÍŒMgf |ĝÓ~Cġayž7¤úoż˙öO>üĝĈÔé˙X½yNÄךĜâviĝĤĊż°ĝ]Qê&ßb&Ï}‘˙‚˙',˙ 7‰.x§÷ß9­Ĥ˘Ŝè½§ÑE#/ĝFĊ–÷ °>Ö ?zWû;ŸŬúáżhġ(߯ÜÀҟ>|üÇ?>~8—ÛӋüñ·˙>í˙ż¤ôVĝzì5F~ž0ZÏó“8˘ôх€}]/+—pOŭÑ}€}“0Eġ€Ö`ß`òĜ`òĜ£<ö(Ż,ùûŞÎÜ9–Ùê°o]vŸ é—_v9Ĵ½w5,5Ú‹;ż €=q ï€á9[êNi ¤ö5AÀÎêpL›•Òé¨ŜŬ¨L­ĥ$ŬşFé:jƒŜéÛPU”ċzıu/Ŝ˘Q™ÔeġŝÍwIuġò-pĠıè…ÑÖN_lżÇë½á“Ìp²™|y˙Ü<ÎYŒt×Ôµż$³›ħT·ŭŸX‚ñyÂëJ2ív.â*“ûĈ„ŠQIë²|÷KÙĵQM÷вÖŝTÓúÛb*Ÿâ%5pNĦñ½ĤFUċĥç\–èdLŬĥ8˙‚nǕD]×ıMO/İÀÂnËÙLŬ)À0ÓŻ%Jğ"î’^m‘(ı… /iĴ"ÀÜìo<4ınTeÏדŻÊá:.=plµÔ° 4ŝü‡*&Œ=ápç; û¸7ƒĵşú2|Ŭ<ÛÁ$=xÈôBEŜÀ´}β-p_éJm6/]zİGCĝšĠßV7ĵ °'óò2ŭFŝëkB—3/ğ%ÀaŽÀÓ…ċkí7torĞ÷äizŜ]Ì"ËòħÀV90 ˜[ }ÎóyŻŻ@SĊÏéßòz˘$ÏĥëEċĈĵPó.ÒOġm%ƒË_²,ˋ—L\ŬĜ+šĜŸċ¤ °C–ݰÄöê)G2--˘->eVĦGċB•pŬnĝiEsÙ y+Z šĞÀ;Xž³fĤQN²Ä –éi}JW‹‹L‡ÒU S0#Ŭù Ĥ&ŭĊ&‹Ë§ž:ĥeÙ(3Š|€ı͆’dY‰5 Ĉ˜ħ]´b+Ïfye @ ‘0  uŸ°‰CÒĉC–i87Ÿ$8cóĊ6OĉqXĤïÖY>ÉÈş.eY&HĦ글}CÒ }ÂʍI벌H$“Żs:pyx˘ ™} ˜ŞŜ% xĥ½%Ş!¸X.enÁĝqÈ&GL…ë²ìb–ĥ‡  ¤K݃W| 6ħ…Ujħ%ï×/1Y˨8ÓL ıÉ“˜WIf%´·Ä:VY9zi%°Ŭ}™ĜáĴKĜ:ë¸Kj&­$Éñ#ŞIÎĦJÀŠ5 EŽr‡hQEÁçR +ÇDZWĠNncîx&f’şQS:ƒƒçi:@˘&£†*‘ΈHşp"Ŭ²”NdÖĉW& eµ1)LC¸Â3è²ûU2éÏÈĠQlO¤ĥĴî+Ġ˜ì|ß8À´´˘Û6éö{à2ÔPÂSI+–ìy˘ÀĵK% áŒ{àâ̚œ³Ê¸h#ÚŭİŬ–ŝĴi Ħ‰$jȜ­ħ^hT­×ˆ$Hb{_šœŒMp*j ³7äħ,‰0Û~ž ²sµ^ċĵfoWĊ—_a£Ÿ>Ü6#é{‰h¨µvVx/NÁÒ$ċ¨ Œ8@ÜÉ2Ĥ•÷Ög1 Ħ%`Jò­`’ŝ€úó³"šĵÊaەĵ*\%Rr³BhëŒÛ`ğŞôğ"AKŜƒ–äM:œĵáÛ"€% ç3ĝ t—áaÔjM6 F×í%‰Ë҃*Êîú yÏ˘1Œ5{…Ĥ>R+~aŠ÷ °³ğ’vàĠ̋‰$a*Ĵ,î¤Ô=÷rJÖc9˙  S JjáGĠVŞċÒ¨Ĝ´™È·ÏM²ôù”ĝQ™tԉÚëĈĴ>şŜfğ;—”™fM˜³hħd\•kĥAòE‚•‘ˆ“ŞL,mШĥÒˆì)§DƒîH{Dá”_²³jĉRM1Ö'`ÉğPêâ²È"ûĊˆ€ËMA(ġ™ċOf4ÇġŜ ×< aŬîAħ˜žGA]ЃÈèAÒuÓÄê/™ÒDŞaÀ Ê\|×JVĞQq¨Ë]Ĵs eÖd>Ŭ€p4 tK§ı|Êê_†€‚l×F€ċJ­ˆœ•CËZ;$ĤAħ‡ ˜¨,4Ζĝm68c—É8ĵЏHûÌ Ì4ñÒQ?ĤĜ×Q&Pӑáƒä(HĈƒK³óG--.PÖ[_ ‰ AjÚ§ĴêT"rÊĤEĞ0}Ŭ…CR``úq3²Ó\ S˜şm†>j€-D‚^d„W’pĜá#IÁĠp†¤ƒX2… ˘iOŞ‘3İ˞Ö=ÛÑ[n˙.q[Âk:Dĉää‰^Ġd% ˜àçCÌşJÚ¨y^äe!œŸ"oúbĈAì0żµô4XÉvRÂéF^Á‹ŻĦÂS‰}ÑxÀ†<ŠÁ ĥşÔÙ=Înò0ĊR°Q)žĥÀZŠ)£$sÁh §á€BbŒ?ôšq& ğP‘ĦÚ²k;8ĴLĈ‚ì!ˆö„Üä'è]lIŽ$P èÑ[JĜ$Ċ1²Jôĵl…İH•J ùCzŒJ#]ĴŽeħı'é4ĉħTÜĤ¤/O%Ĝ íĴ*ŻÖc‚‚Ô]ŻB&“HW ŻĴŸv%Ĉ @è2/Éí´T%}ä^SS¤wh!.sDˆ:¸aäšSöÔq° {Í<&F Cà‘ÊTäl´?TÇJ˘“9Eܳŝ­@+uW‘4L\UıÓ^V5UCEjçÑÎÁ2ÌıljRĝ #CfYk" ĉÉ0á³Ù Ħè´Ö÷9 vŜÀ"Ĥ=ÄuLħužĜĵ °Ôċ˘qAô°ÁĝpÊtvn‚–8\„ ‘ŭZMƒĴI^¤ċı"Ž#léĥ×iŒt=T/¸n|.Âŝ0nùB” fLZ=‚Xš–ıŻğȑ¤8d˘˘s@ġdU`È ÔIĞx†S(ßɸ~?˜óxŒĉ¤Lé Ê)"·’0̓K€áHĵJÇsä2´¸+3 J|4L°ıđ·5ĊMšĞ ``ƒÇ˜d€(ĴĊj1ı_vxlëœpËûÊĊ(c"FÌĞì`fm† ˘+` ç èÛ=ŞÒ1xEnÍ%°GÁ…röŜ@PÎ*³ĝĦ=F„Ú´Ŭ‘;>…˜çjÄìš˘džt„@’эèDzŭ:³ĵ"\i£›Ÿ#7œ¸Ml‘àHmübÑÎsĈ礕 Á:Ĵ"´L£%œip@üĥ ">rR Ċġ(B.ĉ O1iY)6°¨Öp¨ŻÒ]ù¤A’΄ĉá’Ë*ëH-"0šĦ~šo:ĝ$n赕Èu%¸ĜDKu˘…Ğrµĥµpnċ÷Ç.V{ İĜì½+wrJH˜Á´…ñbħ[ÍĦ?äQ[,ôıIgQĉ"QiħDU|Ġ(’mó(͋bĈ‰ğZvÜŭ!-ɍ3AŞt"jAZ²¤ şĤJ6ħ4\„…~,³rİŠšÎG„ êŒñ—IVÎáÏ~‡_0Ĉ6ô œ5nXéŜ€?NUş:ĜàŬĈÒ Ċ c°] *}MTíz°&ŸÀİŭ*íŸqž² WŝĦù¤ËžáÒ/I- ­mìÀóUbšĴ2Ĝ6ŝ…j="ÌÙàŽì xĦ‚_ĥĴòÇ ŻFIS ĥċ‡°q|¤”Ÿ ÄÓp¨){êŭì˘ğHеı; vX…Yà³ä]Ò6›CUxËċ*Ĉ9Û™ê„׃‘ŝjS•ÑjµFByĝĥ‡Îß?òtğZĠJħÌñ³]" ’mv%Ħsĝ‚™ĊğMA/o0`Ċİbwiä§_y\ñ‰Ċ%ÁbÑéP\Wò×ĜY™XOֈ”Àûê%·[ÄN‹2Íİ›?àòĜWŻ’΀1˜vôNĝ@Ë`ß À/•F“ÙúÁ¸òĜ7)tċÌiù`ôyìQ{ì°Àċ°Gyì°Gù+ìKœÂo͌~úYŝéš{ÊäËn}ÊĦ€½½ĵ¸ò‹E‹ şÙ­àßׄz# ÜŻ‚Ġê´żzÛMQQŻI TĴ›Ì%ċníŻà_ŭD!œâ­ŭ·€#ŜzÁjżñ÷ÑjÀö6‡Ğ,rĜoĥO%M“•s7+v70ñVÂĥtżÛí_td6œî ÔMRì{b‡ˆÖ×#% m­^˙Ú$˜Ç3­k “$Ùy5—¤áñQ ·/4Ŭv™À?>]ú0ÀSY}ˤ=Iêĥ Q‘5ÒĠ¤vWZĥÜ%Ÿ_hÉ×:˘ĜÇ:èÀT&w°$+ŠâĴvǜšƒßeċ |9;En·ċĥ2ÙíüÏ4 ş‚EáG{Oìùza×­XOse-àħ_Ğ—˜°Ùr26Ŭ]>˘0nÉ3~b£Ċ&ĴIl:ъ%yĥ]÷ġ<={İeî1.¸ŞÇáÒÉ(³àyûŸÁjQE{& ×ÓM ħfŝŭL™N”:}ñ˜Ĉĉ‹‹şùja²•H[nmœ€hĤŸ{Ĝ=›§H´cžŜt’}Ċ§žÒ= LÒ-ïÓ­ÀÒWħŻ íœJŒ²šĝݧDöġmĥéĵ…Êo³—µœ’ÖgD­:" ÄúÌÓ4œ¸™n·—9Ħ\‡ŜÑjkċò­—Ĉ2ÇwU£Żíër‰KXÇUVÌeœ£˙Ùóçʙ€LŭŞVŝ˘ °j&È(%ÙòóM,#ì‚(4TŻĥ¨ –)Éö–. d–Ği ‰³,³]ğ‘Eğl+O7ˀÜהé2ĤĊ`aĞ÷^­Ğ|‘ˆĉÒWùşó+ׅşT„÷³”´ ËÂĝäS|ö’—§Çz`Ħ¨‡<Ûħ*MeÜşQÂ$d~aĈàNвdBnİ€²é!ŜŞx”×ĝÌŝĵ€6j7—ZY֗µ9=É[÷ċEşD˜Bëa‰('ivġhŸ&w͎SXWŸµ/°Œ„=ÊÌ Ї}›BÙéšB8 >Ŝ§Ì²hĥhV0·›;ˆVrMú°żġ:ÄbÇĉñù”Ü8fUE|Ç,íYYıâS†êœ•$ï›çu½Ì" Ÿ´*Êqƒ ħĜ´yR߉ŬވK|”˜Ò[€POĜŝ$İoğgMvWƒGoWsÈ!²zHë œ[Ó§‹ĤKġ0.4˙‰ċ0â$œÏqĊ@Ïm0OZa7f£y6 9À'›Í²ŞX&ÁÌĵÎìIrw Ĥétĵ÷À̲3°#ù`ƒjÓĊÎÒó+è^Ĥ G}mW;(ƒA_ş€ŜYİ¨$U_ÚV̆Ĥ™¨â¤ßO6Ĥ>Í=C,,ŬÜ}Jb+¤5>W^&“|0ìëD…­iŭ&˙f<î’ÖÀÒ0׆·ŬÁĈŭ,G~L ‚¤˘™LHĞŸ°N]ÓĊ.+Bs•ĝnßÁÛG4MÓĴĵ6 š4Ì èzîú+×EÈ5ĤwŸ\ŬuTymĤ•Lbâé:-ޤ7n+BŸe™ıŠl rPÍD"t„kşÌ`>•ÀĊÂeoSKzîÜ>Ĉq“¸ĉ†Ùu €E°¤Ïü8ó@İĈĊ% GcuYX‚(ĥĉÀ4P‰Ŝ9l9ÀJë4­EĴĵŒĊ1Ò?#'TKüôúï 2>ġ–?‘œ‰&s-uµéT"Ò4jäX´´fy„=3 ï`˜Tm3’ ÌZ`]çz[]èƒulÌ*-ÀUÔ¸pé:£—Ö´PòcëQ1'’–ûBƒU{ n‚‰óĞ•IÑŜal-ÙÀ÷3 Pjs–`ÛUçWΔ8IA1ï²â€ŝ‚‹ù½5yA'ş6òç‚Uä ¨yż§SdħPÑ2:´I;âĵ^³9/ o$YŞöpŽ,İ.XÔIKĴׁ‚Ĥw92ЈŬöİġßS8xŜďâ%)´ĴX!K•°BYÙ:~FÜġju 4Ŭi†t÷0)Ş|?MeL‹_Šm—Έ¸Íó1)3³oĠ%)+Ĥı_ĴœÈĜ<12èÖaü%כ\½H+bôŒ*ú°ħ–aî2fĵQ .8\ŠŻżdbÊf°dñĴi ÓİS™7~· 0jœĈ*£4+4yÏÉO¤c1F§wĊ ëT9÷ƒ Ùb¤îWy“ÌH“‚<¤ŒI`Ÿô‚ £É²kK(l#‚ËYžzKëĥ­êq×ŜS³U¤…‹·è.&24BğÎ<Ċ$\T²(Şe µN‰ ×R$…^&óĠᆊ\]Ú¨ Ëm § Yâ>ÒÔµË2 ‚ @sĥl#ÀŠ~ÍÖ $á܈šÌ£…µ8˜Lŭ'nZ Ĉş*ŞK…ħ „ÈĜr+°šĝf`K^‰r!02ŠjŜℙ>ŒĤ6‘ÀüÉ•wkIDAT@ Yġ´îÈéŽrÎ\Q RŞÈ9ÓòaŒÜg[Ĉ|"ĊüuâÊù“FŝùÎ3Ë{FĴ’èÜJ£KƒÈĞ4í3€9ü­AkòŝĈ˜Î*dVe)`!ó"÷˜Mа~÷$Ҟ³·{ïÜ ó³ĵŬK†ççäĊ!:舴&ŽÍÊ4G“–Ÿ ˆ%ç¤äĉPà˘¸äì’<̎€Ċ”ÊyĝrĠ7äÀA‹ŭKÉÂÔĵ4òQĉ"?ĊİŒ=¸ ™K4x~dJA†œċñħħ€}›ħ´çhä£큍ÒÙá+j€ïg“A1:<X%;y…ñ=“`!ç‹ıê•£-&˘]TĊ^kû°ì ÉÂ}y‘¸*¸͔žğ×9̎”Òĉ­ħX5ÀQÖmY8‡q½17ŬĴU-òŠ-‘…ˆ™BޤêÊF]ĊÔ·Rn×£ `˘pšĤŠÚĉ)ÚżÖ[êt£\ÌaÌ'î“0Ċ^` 9„58)ô"S0 vN<”ƒDœ2EÛG4‘ééÀ5!ĞB˙{"ûŠŻD§y˘À‚âI(ìX“•ÑԊžĜä¸^uħé ˘Àrrƒ¨ĵì2Rj/3îĊщ£vŠċÎâ`…Ġ²ÊŞÄ°ÔŠŻÂFxóQGŽ,ĥĈ˜ĥ5ñNttµJ·Ûàt*A†‹Gµ™t‡)€1Ž  LE‚1#úZK„bà÷!iíıúöµ‘^¤#´Ĉ ²Lè @HÍŠŬ‰ù2`Ğ*EQCz38â>˜Ĥ†û|°œ)Rüޤ‹Û0×üH wÎÒ AÚ½1 d!Ċ-×´áË=‘@ÁDl?dë Ĵ9i3ĥ6ê•ÚDä3ŬÊC}Û¨ëYĈÇ­Ş€żSƒcĴœ>­V7˘ï_r.@Ġ|)Ŝ€%('9›e˜(ÎWÊvâİÔÒÒ÷Ċ=Ĵ8×µ¨rJË"í+M.Ùg”wch İ€Ĥ†#ôħ·ÙÔ˽—Áf9ž].\ÛŞDH Yq[5'èşd ârË ĠœeEħl“Ŝ1½:PR§Ġĥ]'•6ĉ6F)œÀO$÷JĈÜnïDEpäŭaİ+ß/ÎΧÁçʚ·­²‰ŸìL›f]ġç-×"|Dˆ<`Ó¸cxÒé‘4ĝ–úœ‰D¨×`ä[·0HGAŜr6ˆĥ˘óA4ŬA‰aŭħ¤vÌÉ)jÚÎôênQçLtÏĊÛ=[<üŬfġĦŽ; g˘*–{Qœ>:ls +Fó§İŞ(ŠWè+ЉÛübs6•‘Ó&L£c™,7ϖċ$z”cqÍ{*ëáİfŽG/Ê{˜“Ġ•9Œ×Ŝ³e=Ëè£ÔeîxïİlÇy]ħxö^.î`;JÁĤ~ôĜ€­üw 0SY½€­hÇ w ö`ÛöŽ’ŭî%XĵMh´Ê²Ë{*ÁĈ’ĥ·ó´;Ĝ6N"/Iŭ}ú°ÁnLŬĵ_ıï{ıNĝ? wÉÈżİ";ğ÷lƒ³‡yßl{×Fŝ#LñS|€ċ4^ Oƒ2ú$Àb˙QêòîF5›ŜXV|Ÿ’áĝ‚::wñlqGr.Îâ]•FÍü[{”GùFċ°Gù#ĉ|%Ôŭ÷ Rş˜}‡ûîRşŝ÷Ŭdt;ŭ÷]ċ €}pƒ é~A½ĉŸûżÇ S Û|û>öĜ`€=ö…Xç§›YŻ_œòäÉĠĊ6+şħŻX<=^DzĴ)~îO‡x‹Ĉñîî÷}À/ħÚ6ÌÇ­`~~ĝèKjÀ D?ñ ‘…U_j‹;–e?'tná†ëoáŻċ{ħĵW€ÙówíôĈïÓi‹w¸òN.ĝħ\`cı }+hÔÎrıĉryıۄêEÛn`ŽÜÚ?jĥz’­[ó´Só?ñä/ĜlLİħ‰;vxZ×/}Ĝ ­çZġ§L{ÓċrE{ë9¸ŒÓÚŜ)À ñ4~OëM`26€>V†‡i_íù‡ĦÂŜdŬ›ÁlNÛHQ7pÌVSżÛ2ˆœħNĉ2ġ4Ü6H°¨[w×Ħí.(ż/"Y7´;ˆJ*O”)µ†Š†ĥ²ĉÇÛĝĥşïèTQVt­XRĵ3+x‰Ŭ ”Ŭt•1 ĥ5:вpˆ7•~{F `Ž2ê@gt2óşĤĥíĦâ`cöœĉĥĠ…7]ìŝ c ²‘İᛀŭ6™…ê`6ĠwS5œN÷:ÖSÊt_£‘ÇÌÖ`lÛ œq ñ–37N7x À(.DJ§–%0yµÚÉg€ÍàË ÖbaÓY 0Ú¨Aòniaċd8p)Ä—ܗlŬƒsĠŝœIáìŸR-€Ŝ; ,“ßϑN“ĥžAù+ûú`cç`üĠ:Ĝö€}Ú `hF˜‚*òO0:á³]Şï`ëÓx$ïk€Mè`üqu™lƒŠ]í#ÀÚrkëŒèĞí ÛËÄ:T¤Hċm*ÒZ„öħ7]`€mdF•x ɂû &ş:2A€µävï€‰²ˆÛš§Ŝ×üÉlß ]OĤ_°xì\L’eöjí@9òO"£³ŠüsìÀTäNGt9G€ĥüÉ.Nƒó}ĝş†;K0/z%À]o]7Ħµ PER%ŻOÛñŸÓĊğ[Ħ; %Ĝî5*҃ `Ê$û •`lşf5À6ÖF @W×˙r€ÑĊ ÍÌxŻï TÜϟOU¤gÜ)ÀpWIZÛS‘Ħ ŽŜ³ì,´­Ñ%À"Û²˜Š„[ĥǖ}T‘…ÛŻ”`pÁŞÈ·HlT‘tÇt… ĜÎĥĤW“m܄ş3Ëâ%ğ{9À|ۚ°‡?Œœ Ö²ĈT@CĜ[Ĝc2€ -U$uì9ġ$ۚż`[Ĵi€0sE M†ĜĈgĈ÷L,Ŝ¸'€q Ÿĥ§£ĞeP;˓éÁΣî-}êûàÒ`yà^dÀ˘ŝ zsëżĦlÇKü ÄßYöÙ8Ĝöè†ÌŭDÀölĴe¸çΣ.Cşç˙–µÉż˘ŠÜlĜıpr§Ät³Ü½(LQ;˘>^Ŝ‡KèĞħ]ÓíÒ_C6ñ%ZàÏÄ Tžżâé›7ŒzËcÓl°É°×ĝéEĵ-ĜŝıĦ;Öğ(X˘Š„‡\îï=êŽC4aĉ(Gôŭ7ĵï§­“é‚yä“Ùg쎅uÚìğ ŭZĊ%™Ħœ×kİG µAD%€ÑŻ[aĠ?2’?µ™Ĵš*óLÙ7‚ħĥ½ûF ln@l/CŻ€½`äÍc¨èXúJ ‹ż} Xĝ}îğŜ‡ûĉ°í÷¸/X‡Ùxù÷( ġÒïsß=ŭ>÷ġß) Âïs_uŝĉÎé£<Ê7*s÷ocûh‡Gù6ekĝ£ c=šâQ~‰ĉĈĥú§#?Ê£|ġÒqŭŞú˙ ̝Ç-^£IENDB`‚gamera-3.3.3/doc/src/images/tutorial_selection2.png0000644000076500000000000006370010714675724021266 0ustar chriswheel‰PNG  IHDR`Ù˜wÂPLTE  $&###D-+,-+(/6 ?,394539:*sÊ9:854hR2%O9(5J*/43GvGIG0^,?2ü;+NPN5X~LI“9TŒä@T„F[ReP?TVTÂ**†0ËNQı[]ZA^œD^—aGÄ>_¤J_‘Ra|wWX}~`b_NpFğ;:?f°>]çFeŞ>}Bû$%Nedfd[oS³/ĵIi¨Oh˘Oj›UgœEl°LiŻ~dMQtyuiX`W÷_eŻJqµQn´lnkRq°³TSYs[pħdrŽYrĴ_qĤ[v—VuµGRhlğö<<[†W°Jĥtvs6}ûWpŭ\zğe°y{xc|ħh‡jd|¸iesvĈÇ_]ĦuRb…Ё~F¤^m‚ħe…À‹‡PĞaʂ„w„ l„Àm…ğy{Ŝv†°†„‘l™l·dĵ†ˆ…9š˙ôZY uşS—ÙM¤¨sÂŠŒ‰ğwtzŽż‡Š³Ğ‡dx–Ĵ‘q–Ć‘¨^°rȂMv•ËŠƒûu™ż‰ü‡^”–“ ›óut‡œÍĥ‰¸›™•ħ“¸–‘ġˆĦ̂§Ê]ğÄ ˘Ÿœ—ê Ħħ|ĵˆÈ”“¸–Âg´˙~ŻŜ§¤ˆĤû–ĴԔ°È£ÜĦ ˙Ԏ×âœi…Ä’ÄĤˆï‘ĴĞ–·ş§­Ż§˙×§yİħĈ°²ŻĤ´Óħݧ³µ²°­˙}ÏÖĊ·˘¸şĥğ½şçşĥü赆ÄĠšÇŭÊż³ÀÂż›ÑĜÂÒÏıĜ£Ù­żÈĵĵÄÚĊÂÄĊÏĈÈĊÁÀ˙ÂÁùÉËÈóğµŜÈİèÁĵĤŜċÎ̀óïĜÇÌËŭ½ĜìÒÔÑĵŬàâÑıËĠçàÑĈÒÒé³ïħĠüÔÖàÖĜÔÑÔŝÚÜÙŬßÜîĉ‰ÂìíŜÊàâŜáÜüċáñċçäŬêîċäüèéĉäéùëçùêêôëíêïñîéġ÷ñûñóĝòéôöó÷ġùĝú÷ŝ˙ü ‘ IDATxÚì½ ”םà[°À“áíf°E2dĵJÒXžeܧ‘蝏QWGr+qÂÙ^´=›,íÒÚNf"FŜG<$‹Ċ–câɜÔQ˘dâʗPÛ''Ĝ“Â!ħë=[֋*ì MĊ‹”ĞŜ½·Ş  ŞŬ Ŭ´|˙ tŭï­*Şîŭq˙˙{ë~l%—vħGŝĠocÁ˘—7.[œéBµJ°i˙gzeó=Pî‚ `áÀíg–/wúÓUÂċ?uĉÔŭy Älš_\Üydqq×1>ş8ż÷âîƒ:u§^;ï> ԋ P=Txü! .uÔ½Gt*|ï—Ġ‡€zì!Ğó@Ŭ¨ÛĞ@›Zu/ˆ×ĵ¸$ï<żÔQ—Ôwşd¤ŞA&˘Ĉ. <•ŝ‹”ËX\ÙÒb÷ÀöîM‚Û”ŬRÓKM>˜ÖG”ĜĊŭŞzXĞdÌQ”mŞŞä"ÌĞùƒK‹ğûĠŬ 7CÀÖr :Ġ”6€ċÏé;Ϝ:{ı#ݽö-@Ĝĉı{—ĉĥ\˜ÛvdaÇ ;÷.ÎíÖĞğ unגş°¨ğôên î^”Ġ…9ĝŜ ŜûċX5h¨ó]ÄÎCuĊÈï^ua^£.,,́sŬX­şÔ%pÀ ٷpEÙÓĞÎÍÉgÖ~ï]Šî6zT55úSd^—|;öwĠ]0½@zXT“~nŻĴî†ıqxaÊ %ĉ˘{D‰AQĥïRòù ÌĜıı]{`§.i0yíapAàë)mÀÙSgîLNĉċ_wäÒ ĊM{vî]Ĝ³ġÀìÌĥ³Ûw/Ínßż8ğuŻĴîRÔŭ]u/Œ]˜Ùı4;³{Ċn™ŸEêN î]İûf·ÏÏÎŬsavz^VwÀ=äM¤.Ì΀÷öû:êNĝŜ§›3s@“Ġı¤˘ o‡ĵ9³OÙcĥ³ÇÜÜ,ĝD›hlÎ*27;Höé›ûĉ?ġ{їi[ı”ıž Ŭ'ĞÊĉü>¸)ß$ĵÁ˜Ş:=ŻğçŜôÚÙI͞ĕĠĊ ò mÙğovĞ’İğaĥí›Ŭĥ_£.̂LQU˜Ïöí\Úz;(‡´˜\zêԙo]ÖpîדtoÔvIlÇ~Èי͋–fĥ읛ıâĥvz×|W]šŜ-Ğ[€şu¨ 3Û÷ï›Ù²$Ğ;ş ÄÎ#uŞ;÷!uK Ssnfĵ·Cuİ0vğğcnäĈÌ4Ì#ŜvŜ>‹T° 2tfzGW…1à rĵOœ13œ;=3wôÜÒÑsçœ;wß Yċm.žë[:uîüéĊY9mž>½àÙó]F÷ʀşŻïB5*ÚܸßitÏ3rÈi¤L mzÍÏuRs+LM î•ÓzëĵœôP]’U9[@ħpP·É*àĞ£îRT9cĦşEVgÁéĥèğÔ Ĝ>À.ɀ½QĜK*`ó³7o=03½yiĉ†m€Ż]sÓ[÷"u;R÷ÍÀĜ­K3ÓÛÁ…ßQwiT•/YŬŞ53 ’OV÷tT3RS‰Ŭ‡‚ĥÏπÄı°É§é=ò&|ƒ,›Vò BµCV·ïéŞ7Ϝimš™ž>#]üÔÌ}ҍ÷IżùÌÖ}ÒŬ;¤ğ· .ö‰Lyż<=óàÙM½Qó͋O­Ŭ2sZêDM)ǜzĝş 6zxÓÍè2fÔËĜ'_•zŬ;äX }ÚğšC·1€êĤˆ‚ÛvmÍiÓkğ˘Âä‡Iżчԭ‹322@=UçedŞŒÛìô69ÛeÜf§ŻCù<;³Y Ĝ%-`€ëuö‚°óàuı°3pßs `›Q!=½m~ê†m S[v홺nïÍHŬ-Ğ[ÑuOŬ°¨ó{Ĥĥ(*Üy'Pw‚ĞšêœĴÎËêŽ=à î˜™ÚÔ­]uËÜÔ4RgĦ: Ġí@Ŭ1 Ŝ3S7Ü T°ı]V·CġfY™RĠéí3S ÛĤĤgäMĝFVO·6Ŭ÷àÔiñ‡§w“n<&=ŝ³.:ŭà‰÷œÎ~~fĉĜéÓNÍ<ĝà}‡Nœ~pÏÔĝ\|DM½{÷—fŽ}iĤĤuiïĤÍğ6OÀ@à}7o?vúÄĦ݃§Oß3}×í{/Ö÷>xû–™û€:5}â³è2ĤĤuÙ½ xƒ3ò-ÌÊê üyÈI÷)²]M›ÓkĤĞŜ,Ğs²şñuPaĥ)¸Ŭ°uaê¤îQU9Ÿ`Ĉ‚"eìĴäó^×Ŭ;5€]Òv÷-@Ni;ܵ۟êìÌ-üúÒŬ·_PJ°Y٨Ɍìşò5uL ò&Rámì¨î T"S[äşaNVajîÔÄ™éÄnI?ٚşaÏ$é†SòûfôFħÛQ R!ˆÊÛanNMMÍÈħÓgÚw^ĵşÓí[.îşv ˙0ñÌ]ŻŜ}Pú֍›îŞêÎú—ĤÏ]<µíC§?ôÍÏLŸŭهžyŒ:-ŜÈ/Í?uߍwKċ{[à™Ï]Ĝ´uzê†`÷¸½ĦC—ĵóÎ-ġ§nĊ×zímg/\÷À…ÏÜ ÊÌ×.žŜĵ]Ĉ ş2Ŭmhԙ›œž•ïhNNˆL mjΨI'Ç zÒz~ċ °9sG…|)9 q|Ŭ°eÛÔfuğĉä,?cAAı 1‘—Ĝ…Ûoıŭ– }%Ĝ·Ü÷-€ğ˲ĥ-÷L·üšşaó’\BíŜƒnc뢌›ŞÊħŻ- _PUïyX[TÄl‘b PŞşEƒ̍}r£ß²’üJZ£Ÿĥœ[fQÖMuz (7•L†ĴŭàĤ-§Û›žúŜDŜĝ?;€Û)Ŭ½mÜÊ·ŬqéİëΝŬtŬüŜßìŬżiú:9JÚôOßğ“ßuğt÷íg^Ŭ›ıpöşixĉ Ûµ˙Ċ[Ž4Ï=¸ŝâéùÎUĦ‰ċġé”P7ô¤ĤŞŞI?#'½Z`ÍLmUT˜m{z¨‹}*,żöÎB@ĥƒòkĦ냝½`rı@éì)ÙDž“ğ|IĜûoA|]V|0Pë˜Aŝ=0Ĉ×íß7½mżâÛ<żoı‹3[ ċVÊŬPSUèîßMU·a t¸ĉfċ"\QwtTäÍî˜Eô6vÌ*î~×5.δ²İxñ:uş6Ó;n–Uàí^ ôÁ^{êğf`wŭóç`G.|ÑĝÙ*o̜ïż˙ŝ]wáìĤíÎìúGu˙Vpéŝ-ÑzàĠ;ĥù˜ô­ûïż9]gÏÉ^ÛiéĈ 'v˙ӍûîúVíÁéğN1gĤ.@ÀğPŬt Îxuâ›á•m×8‰;ş—ĵ˙Îí“Uxûàú·ïS’`[’è¨v“ï˜| "û6÷)U+ĊׅıħOuÇ`ĥm™Ÿ“cA-m§ŞÎNĞy =iP𔽳ٝZ$,ŻnÍ=€]îvîöÛaQuYĜë~ˆĦ Ĝĉ=°ĉ óĠ­?˘ c§š!W'euëŞ?nÙ­ŜUOŭQFfw7ĥÎÉ)"ĞúÚÒ̌âÜnר ­oPkZúŠ—ĥ–Ġż]Îə3ŻŜÈ~jĉL{Ó `3§."şv(ŻÎ>>°ġöCÓ hšŭÍéŬOŬ½ċ7§œzpFÀîşôÊéMÇ~óàփŸBƒğZ§Ž,¸&ÜáĈ#'Ü}bëé#û/l€‡€]÷ÔĊù­·ïŬ!>|Ŭı:ı]sĦz˙SèŜĈvĠżG•Ċ™]µ“^ÔœÙމUŞ“€ĠIÙŬ‡Ĥ:9ĞdìŒĤŝ8£òµWñÁ.]êìÒŬ@n?uıĜ ·_ŻËzÀ.Ëvġ²ĜĤıĉvì:Î BÀ0şĞŞBĈvì’c·A-';öÊħ[ċF¤*wµ[n˘ÙıWnCÍ,rkÒ:ĥc§˘.Ê 8HŬ3ğT’ÁĉûäĤĦ%´Çĥ tÀŽÙÙísà-·%İ­Sûĉġô6=Ôĉ?Ĝ4ğtáìێ}Ûì3goÙyçnÙyá–gϝÚ2×Ù§NíÚvĉŝëfÁя| è(êlÚwĉÚ<{ìݳ§ĵ ĥí9ö­³gOŬ œó³§|ҙ³O}h×é³g?³ù̗7ŝòfÚwêìS_ŜµóÜí[;W…lAıYÔ†îjŬäŒÚŝµ¤Wċ™Q’@I Nz)‹ğAì~YUwïììVY…ù´Şr ׎ŬPUrµCĦö/Ĝ:ĤfŞŞ†íœ{ĥï]SÜ/ĉ ˜˜f `šPĊDX˜ß{haçÁ…]ċ–_¨î]ZĜ}@§ö· /ì= Ä˘Vµ=YQw/-ÌÖfeçyıµzÄÎ#uĥTÏĞïĊíĤ܎­QµmĝàŞ ŬXĝŜĥkqûĥĊ­ÛwlŜĵ¸sóââÜĉÍs;6ÏÍmžŸŸ[7o›_Ĝş|.^·saaÇĉmÛĉv€P9jëĥ……ë6Ï/,ìD;˘–ŝp÷ „mƒ1›Ñ)v.€×u;Áy şm÷Ü<ĠKYêÜQçşĦz ÷¤jÓ %Ò`2g/L`9VUáûÈI¨Q’^Vw)ıxP{xa7T,Îï’U˜uÛ `šÀzÀı˙5m@/`J?2‘G––öYÚǑ½/í=ŜGu*ˆ›½ëHGEħòħó`s7Š]Òî cÀ÷áypÜ~½Ş+ĞòĉŜC² Ŝʎê[§‚×!ċ½ÔUċÍC}Ş*Şz=9TE³İ•CŬ˙‹Ê^ÊYµ§[RżhQ‹+ƒ˙/êŻlŬF'5µIpà>ġ &ùŽtR%½’òPïĉ“Aì~5S--Aġ%'euŝàĦù½]À.÷ÖGL s9s”÷]yöĤ8ĵtèáw=ĵ÷އÁw@ê‘ûeġˆ>VUµħ>pìá÷>ĴU˘7:;PCħò}Şr@G=ÚU>|ä(zAïŽzĝÈĦ‡êއQڈĞnŞï>ìƒäşq¸vĊcuA‡´Wv]™FĠ\3ĵ+ï˜ŝ&{îùÊéu´Ğ““ï îĜ#0'ïsrŻĴıC΍şfĴ²38v˙Á#‡ÙŸE>ÁeÎڀoá:ŝü™S96:xôÈÁ;Žï#wCïƒwÜsô Ĝ_$]ĊÏÇvJ|LĦÈŠ06ay>žÁır5–%!$E8=`9{ÜC¸tœ çJ$ċñŠ éÎċeċSòá d3ħTìdc餗qó‘4ĜŽ;İ~ÀÀg" RTìpĥ\€™”óds^ÀB 7çİsĊ\0“#ùlˆwĉrncÀ8ĤŽ÷ç˜F,] ‚@•óTİF‰t$*`\ÎĊ‡İRgËĠ^‚yH’lô†Âë9’tCÀò!ŜN’1cÀÒ$é`ùIñ Ğ€I²Oñ=%X.\Ss’d|YÀÙrĠĈñ$gö#0`"Á¤î\:á€4/›É‚`_UĴÊGĜ~À‰d0tÂH5™ÄÙrU–OÀOP‹ òœÛĠí–Ì <Äq¤;FÖSn:ÄÜnV²˘Ûíçàá^ϑ`ğäĤiş‘ÁĥŜżÊ5\ċÂ4U‰·ğÂsžŞ–аá…ĦQi…Ëró 1ô°‹ĥXaħo§´|‚ì2@Eà°× `u$†{5zÂışä,À5–{–ׇ‰Ä‚††ċuÇbÁ2áÀ5,XĈ ĠDÒÉHL˙Š/ë•Xá+/ˆbÓrġH8ÒÙD}ĵdÀ²ÉòzHáĈQ8Q7ü< ĠK2Âŭ‘‰\!` Ċ(ŻNñ,Z)UÑĥ°(°­UœĞ_‚iLäÔ♣=€]:wmÜ ›:ŠLäŻĦeTLäĦ•–êĴĊ‚ŒneިKħ+ó)^,Ġ'`lĤ•Uа›<ÀJĴ݉œš:\.`§öÜ,vTO…ÛÊç=†&òž+5‘T#!·u5i.9–Z ƒĦħ"×öħ l2°½‚çèh´P‹FÙR4Ùàj1œĞ£ ŒŬƒœ3É?qâôâĦs°ĉƒN]!'ċO-`²‰„•Ê×"ġW˜ÍD R·Ù5žOĊĞr—iÒŭ bX& °Îƒ˘yÔ ĦƒÍ‹ Ò+‰{PU-î‘C”p9î}èh+ĦcWj"{šTĦĴw!&²&•a)•iµ˘°‰Ĵğ֛HÍk²Béä' y–`[EĦŬAÌòÇ `CDj'’Ïk÷S¤™3 ¤ıIŜàr9Ñêo3eap@;ß4,CVÇtsZ ßêäâÊL¤ |Š`vË şÁIĞĠ^/ry£ÀìÄö—j5ûĜĵIJ”aûh‘k˜7 dÇÜá0·žÏ"`ŒÓYĠöŸ˙ĝŬï~7Ŭ XÖï÷Ó½€ċ@ Ġ XO ĴœÉ÷öş `l$L†$ċ npÀ¨Ä2û稯Ī^a0ŻÓéÓĈŬûÎżûÑß½ó-oı†ÑVñ†èMz+ZÀ9SÑĈĝ‚t!Ğ „€ċ™ ħŠÉpLÓùÏçOj&Í­kcâle™’'bµ€UŒX.0o8nÀ˜üúHE5‘(=:€1ïüÑ?ĵó ï‡ßpMİ X)ıĝêK/½DŠ]ÀÊÁ4 ÌŞ050(hĞJ“!IŞëF1™ĉ…ï˘+ŻhĞÄڀf°#kÀúĈB–ĵ†´`ŭlŬDŒĞèû³ĝчßM•żİÚ,ıĝêĞ/=ûĜK‰d0%ÉçĠ  `™°˜˜LÀşfސÛß~­ÙÖA€‰–5€ıĵı~–ܽ„ÁÀqŞyHżÎkT* `ùÑm×È£%ı0£Ĉx+ŻzöĜ“² XĠ[Vŭ%0VXĵ` Ħ?ĴĤÙnñJH›i°\FT"áïŞ0)ò:Ú,ꃄœòXg§ÌRÔo3ewÊ"—`QLôo½ ‰S.Á”@‡è¸úIÉİ€î½÷?şí ñ8ĞŻE2‹Àê=ûäc=èĤ>ôóA `jà³Á+ô‰Ú›‡!IŠ“ñ1– ÀDŽmK%NX9,&ĥ^Lğ´€Q4D$‘‘Oè–““ôE$ `™, Lŭ×˙ɛdÀ@ ¨˙ì˙EòĤñÖÖGZ*`͉|Ó;ô£żù˙³7TĝXH ˜żŝÒ³/=`@ `š@=`iPE@ŽT|Ġ˜$ĝ|lĊá•s0ša(Ĝ–"Œ•óŽĦ$ĈW€yÀߣá…Ċġ€ċI2$0ZÀJdûxuâOžùĦ°T.éÏö&êó¤ò)Pñî,‰×°ö:y#‚X½ĜèVĉ·ŬvÛ;ŻÉpqÒd;€UŭEÍc}òĦoĝ+*`l70PéVè–u€ $EVÛß z%o³éɂ|!Ö´‡ŒT*éf6!z%7ٔÁ“ 1ÑÛ y$o[jùFXĊë*”B”0­‰,…Ú7}â7’“÷×/ꋓIÓLy*=€EQ 09°ü:ŒgKÉçŻyçm~Cšƒ´>;Uüó PúäCÏĈµN˜:ù¤Ĝçä·ĝX Ò%“ĠD ^P@…ËR)Š‹p[-Ż`h"Ħêa –÷/)Ħ/Á¨xÚÇèL$ĴvÓ'^|½ĴÌN$b}€ĦÀ^ÀÈ$ ì Ĉ__€ñl0pÍ;_ħHĜċeX0&˜~ LÏfŭ½ÔŒ ĤP`ΧBÀ˜ĝKzÀÂt¤ÖŒĤ³=€11:ş6€ñ—3ĈésċÚAFg"‹ĥôâM·ŜúÁ—_֙H7™ŒyÈz`r``qYë,Cµ‰L`ÖĴŽĊ·FX£ĦkĤ(ż)ŬÈ·Ëċs†: ­uàŜoÜôü‡OÊ65´Öú@ÔÚ¨)”Zĵd^ dfH SZÀJ1&kö`‚cŒ/&¸“Oı<žTÚM&âİz`âOŝŬ­?yùċÇu€cž׃@o˜ëġÁäÀÀ1/É­‡Ĉ6ZòĞ“ ’ —tÉÓMĉDnT€qE÷Yd.äwú½îP(yTT I2Ç}Ò ğŠôÊ£˘"Ì˘À‚0šÙ[-HU’ġJ"IrR6ĴÖ“Rĥ.ċÈTŽ…ÛÔ"Y†\‹v0×&ŝäÖŜtëO^ĝİ0Ÿ; ĥ$™%·Ï“żûGH2`>œç4ġŽ˙ŠÄ!&ĤŻùÏHkÇ·áĞÙÖâÔĴšWDŠU3p“ġ ’U `h{&²VèšHZiĴ¸ƒŜÑnĈ0R¨{Ĝ Şh¨Ò×L!Ä ‰Tĥ}PĜŝkc`¸_“#­E×Z ´žıġƒ/ŝĤÌċ abUÒ²P2`&5] ́ş2J`fíË+iÛèÜoÙCĠ$ÙdxƒqW>*ْMŸäo4ŭíDŽ 7ÉÑĝ`\·Ħ5c£@:²_Ìç&µ€…ÊêCHŸ/l,jWŭ^¨ïMĦö´ƒċ=ŜÎo¨ Eìż6EtÔ˘§46ÀûÏĵlËŻÀ~óÈ_|ùċŻßôÈ×u%Xï<ĥˆ%£@O˜3hÉï ?`z Ë;LJšú\”O)`"=°“ĵWˆçÊaĥ6x%r\$)ŽÄD²Z,eġ$c!O"èqjÚÁj1İö`ŭŜH@)Á: Ċ5ż7ꇀĠcħXĤK œ°GE|§×'Ì´ğN1ÀŭêĊ^ĝ)`I£çÚĉ ǘ܄“J4MK|g˘VĜÄrDJgĵ‚`KGF$ġÁ’V§—Œ<ĥ”°zÚÏu­¤;ß tċ!`(öğ{`àdîγ ˜Ŭù]EığŽı‰ô3 pn™H ˜-Ĉ%²Â„DŽ‚íQ˜ÈFQÓLÁ7Ĝ°ÇëġlC×,ĴéfRg,ê ëû:˘@X‘žÉjg8jL7qÛĠX-²N’°i2K‰ù*—•’˜Ċ0Y• àEŽĈÉ×w×Á=ZŻĥ­šZ$[…ÉĜ?†VgNî虀q9ƒ ób"2CN.`UƒËó&paí‡/Ĵ*%Œ×°ĦµU7auċÔK0eàĴa6v ħúáĞÑ@rFùe/äezı†á Ó#(FcE²BgdĉĈÖ°ħ?**–9™bd•hCk>ı+Ċ CßUtħ0nRfdÙĈNÌ=pzÀüy¨÷`xĉu8äAµl­>’× ̈‘ `ç/ȏş€½ĝ ”a`£XnBî!Gjî!"Ÿy ŠòİŜ_X ĵ }îşjëÔ"kıöd´UUHħÛ-2ŞöéŻÈiÖèöı[?ñ‰Oĵë°%/ĉ„Ë “qĊp÷šQ U>;€PŜ†>Ż^À:ƒ>& °nĞADŜ~îÓè ^Ÿğ•ŸTÀÍ=Lŝë€ IDAT`y"żôÍWÛĠ6ËsµfµÊK,|ÁíĠv×İ0‰Ĵñ >?÷1`+Lé_ĉô|ùĵa"gñ8í>ŻßS·„%KĜgÚ3Ğ5‘Ê ‰ì­Çżµ°Ï½ëĥÀ8µ{’îšËD.#Âà³6dÀŸë*ôÁĝìpMUTÀ>ŭ…/|áĝzƒ|=óÈäĈÂÇıé*ìS¨Ĥ¨|v{”½èó/Ö°R -e<O…ÏUi(€AHħ˘Ì%­°zq‹¸bċŒËŻvŝ­çyŝĝ.è{ä]ïşġÖ[?7ı€‘d9ċ Ê%jS•Ѝ{×½il"`ĕ X–`U—`ĠÒšÈFÈétúĠìğĝ4Ïà?ï1‘üÏO²‰ĴÁ=X‰ü ÂaéX‰3‘Í€'†kÜ_#áHBÀbĥìjM$;‰>K:á r°G>ċ‘^Œ˙ôw'ÚcN8 O X(f™À`’ëĞE •(Äàŝ‚Ü‹LàÛ>—°ÒGá}ƒ>&ÌÉŻ£Ċ `?yñĊŸÜZïìğÇ?p~˘üê3­Œäĥ]ÑĤƒ‹II¸É°³§QböQ2ô1Ñí`üOŜġ98’#žïöVôħÜĈ¨EÀ!ùĦÉŒ€äÁ'Ósüê[òĠA Ĝ3/>o'ĴI `ĝĴ`',‰IL?x۝‚T"j‘Ö°ñ>*â&żĦòĊ½Èsa™C°œ?ŝ🆁nnÒĞË}h3‘j“Ş€Ġ5½këW-`A˜yh,ö“w½ë‘G>ʰ‚ƒêĝ`?~ëxŝ?ġ<ÌL ÖîÜC5ҁ-ï„Љè³v€İƒ>&°d·'BöÌ#Pžéäʜçê_ĝÂyµ'ĜdĤ½Mi–ŻĈóɍËŻ0äċCÀêԄ Ì *ÚñËë61÷ÀhnĦ½\*³’ĞĴ3è÷h}=ġh X0“ˆ€Oż_ÈùYżŸpTV˜3ŸC’™\À”+ÔIĈ0pb†ż‡IÌbÏY£_ëI6m +,ÁÚ-Yä‘í†h,TĈ$Bl„ÌbD>(Ÿ8P e£5HĵZE\‘ĝÄħ‹Zz–CT\3Eû•+7ŒEöĥ“n)“rşDd&Rûl_y*m:ôËß2‹b}­A?/a`ZQħĉ)êVŭ3Á)Ĉ(ĦüröŽvşÑ–3WÌìÍ.` ċ€µ0`00u+{EÀ¤+˜HÚ9ـ3sÉ6 †cıQNĊ$‰ 1dş_\ˆÁ% V ĊFĜaÀ"À§3ıÀX´„#Ž€qy½îÌŞK°‘>ìĈ€]M%X 0`°ÉEbÀ0`F€ ê|>0 Ĝ8ËgI°D$À †ÓJZċ+“Êñ˟: YĞ5Z³ÁI^W"‹€i….İ’/òCŒ‹lèˆàŭ^Ÿ—³x޲ו Ş."‚€­0ċ_ßÔžFĤañ6,aX =…\-`żVĵżħ¤I„?ġ›Ê€(ż?ë…ŭCÈN²F§£„Ù‘6pê‘ ĜzÌ=:ÀĝŠV²~µRġڊĊΚÜϟëlÖ#êN?záğÍ EXU½ÖâJ1Ân#O7ä ÚIL‹thˆí„œ˙qÏ<§e´GRĝ(a*q¸¸EHıV–4Ŭï ܤ$ŸËFĜ* n…kÜHäéW–Ó/(;d V36‘iÎOä,ÀJŞ€ĠË#7‘jlĤRw}Ÿ?×Ùl„v~ŝˏv6•L´Şúkßîîĉ"ˆ(ˆ×Œë<ݽ5·ğKĈüòiŭċ2y}èIsÀPŠ‚Ŝ´(o˜ÈñQTɛp&w¸´¸Ŭ–`BµÑÔġŸĝ—ċì½LÀzL$ï÷x}ô’Ž Ĵê UĈXÍC¸3´ `Ĵ1`e;HeW†2Œ²*ٙ0,reÀTDbË̂6ÚêĈĝC?È4ĝï@?Ëô„fĜZ&ğ Ĝ°€YKĈ€‘}0íì?:'ߕiJ•LĈ¸ ü:X!ndx3À"°c2 XÍ-§WÇD&1`+9ä"9ÍàRŒƒÍ ÓĴ™E.ıè5ŻEò> ‚3,0R” E‚ĵ$EôPÁ’şZMĥ—mIÄ&Ĥ-D°eXÑŞlŽˆ1` Ên'ĴyZ$(áì;˜i-RJÚQXÀĴT”$°Qž37fÀ85S´CríàĤûİ]U€i×OŻÜDĤAy6 ”TÁ`Á°ӆ÷ż0˜7ñÁ Ä‚Á m ô>˜u*+nhċáĊ•¤ü~ĠMo–`IXóΣ§(ÈHy†ù`–lK)Š ÀÈÌÊӋ0ÉĴÙ#=€™;ùFÒĜrü!eDNŝ˜dKSġT‰ × ÊO$ÂÖ­¤³šÈ×bġBĉo‚W&SJ‚m’I0`°~ÀÊ&̛ X›Şhš[݌ЕÌJIZb31Ĉ†ÛùD–fİt—`0#ÀÌĉĤè,™V"™(Ĵ°I…TúcTĴ‚€-DĤ(šH¨˜ÈËXĉ a@ċÒt!‹V“ıA€ħşî:ıecùñM".˙Ë·Íb.żbäĝċò‹'.!'˙ĠŞċĝċI–ġpòèä:N~(P‰ç+|"ù pì8Jr'ßIèGċäÉGÍ䳏$êÑG?ŭè@9yüÑ!äӏZFpŠ1ÊñġlĤHÂJ1eĤŸ˜\‚é§ßb6œ‰\½:‰M¤i œŝşÙj0ÈĠáƒaÀ6è£"  †Û¸€ċ=“­RÖQ7Làä!#˘`M%p\,ci—·ârĈgµ<: ‡—Ö0ÚápÀv8( Ĝ%XÈ]3L MşëJc!KÁ8c³DvÌ×.ġĠۛ"°„_ĠŒ…x ‚^ÀJÔ-?mA=vRÀ8폧P1Ŝ0ŽF€VüĦßX=m#ˆ°1`h<ˆÜÓÀ(cŬ„+rDÜ0ı?ì8=4uaOsĵŸ°Rkc"‹VeÜÇŒ‡†˘Ċu²¸Á R[h4áı İ LÑbS‚/Nc) áÛ€u#À`Wğ½fäƒ9‰(o·³F> Š/PçmflËeħ[ĴVğ]S„é +,‡j$ÁMGNĈħ +ĴfGhı ·‘Ğ’H£ ÊĊ` !&É`„Q²(¤è* v—2DÍċĉbPYrĊËĞĴéÖuuÒ–2sò[şŜú=$Ęì'ßCÈíÊQÂ344r n8™µ,­³áKä$†Ğ„%^!%/JV’“4(b `ŝĤTèĉÛ’ÀËY’V ˜D è2=°Ê@À×"=„‹]9`ai-Km YĴ Ûû°ğéġXċ‡Ŭ0Ĥ ¸S°’‡–`6;Ĵ鎸âÌ9zÀ,+&*Z&`²İ² \eä€1Ü€ħ XSÙׂ%˜X˘ XQ.Á’¤”—ü<*ÁZċċ–^V-òJ€ĊM3–²Q´*SÀb„<•2s­µ‰ µ² ~n`À˜p(ÂñħİšÈP(C€5cĦÙ €É!i¸íáÀ!ej‹vCÀB+Ìjžħ4¨_†BAŻy;˜<+ë"rCÓ!Ĵ$‰µ3‘D "mèZdÙd9İ û‡µ¤Ûĉšm Xï‘Dnˆ-pˆÄ ˜]-zmDɰœBĜXÀ|}ÉËĜ öc ˜–!‡a'2Ó!D-„Ġ‘sĜ=üVĥv‡Ò&܆nKÀ6½½q’F+ih%ŬĤµHíÉ.`e8˙É¸H)ph†Ĵġg,e%œĴı&Upò§@€]ñ€ P{…EPFù¨¨è ìĊfÀQğ:[\ñY$›nÖ"kim7‰,ÓéĤ `€żÁ…O6Í pòa™N7–M“ĤŻ”#}YDISlaÀîħ6rÁ€aÀ0`0 ĜŠkJmAlaÀ0`cÌ×ÊU*äŞsdRZIÜù cy⠓ˆ_¤u™:€'ƒmŬî’:=ÌîñŒ0ħZFµÚìoɇ‰ÈĞvéĜ]mJf€²Ĉ~‡Ŭíj{ytJV×ĤˆLdcÔO!×ÏDò•°äd:€ûÏiJ°â(ëܛbd]Ĥ%)0§½>šd ıŝ=ÌÛĈ€aÀVX‹ä€íáa]Ú2‰mBR9ħY1`°ÑġĤ¨ÇƒŝċÍé‚€™ ½úK——’ µzà c9yò 39nóÄgŸ ŸŝŭÁrü‰!ä³OĴZFpŠ1Êñ ŝ¨ÈÉè$~ĊX~ü´IÄ+˙òíWL£N2@Žż2Pž{â•!äĝżĵ²Z9ŝÊ$Ë£xd7x{5šH lü€µ%A lL€ùZÙĠN`X…R1L€tÛ0„·Vħ<{EÀŠ4ğ:àLR³Z×0&VEN—|e#–JHR²@Âİ Ġ  lHr–ŠŒ$I†4èĠ{L[ó€E‚Ż~ÀĜĦ>6Œ&IҞ6ÉX–$}î`ÀXÒN¸—1!çö‰RÊï²·×°2 HQÒÌHM’´:ʰL&—’lQ&ˆZòİC6r÷/ĈžqG‚-:$ ùx3ÔX `°çŒÓÀD ?ӎ‰uğ=Zí–,ÔÛ˘,g£ĈeÍflÓaÉX­„vO`A‡Ċj!­Ħépyòëĥ Ĉï?Gw €û÷û™ĵĊ>ùƒ>ÌĤ “E“ݳH_S*Ó!P„ÍĠù`yò9Ż Ú*Ÿ/Ñ Ĉî8‰¤!`9‚H4éĤ[ĞM°VO; ?­Îf>e´CċJSòŽĤ+ĝä5°r§˘}â;–9cál<ĞŸ: ´€cI?Ŭˆ$ĞÌx!а™8ùB”£´Ġ0,=ádĊ04ı@¸ëf€Ô~i2“$;/ÚîÚ¸=ZİB1"ْMŻÉHġ °ĠLR†”Ż)`ú›!°0SoĈ›´(€i&Hï ˜ j ^`ÌZµĝE”jQĝ/gŬÀ]ĤcÀŭñd}‚²•šlH²Ŭ¨§ÁFĵ-Ċ}é8pÂıôÚÖÈÚ §I VuĜ²ĉĞĴU$şÍë+ğLëtˀ­…“+Eò€5~Ŭ†ôÑó°ğABY^“Ĝ•ó·–\4eâƒí’ğ`R~¤€ÉŬäÖ0„Ö†Ĵgu2Yq”€ ˘ğòc°ĤŸ‹R+â‘úk‘°ë³…0^/ÒŬ7°Q˜Gë’e3ÀÒ$ħžŽŞÍÑDΛż%5`”…YÀè‚*ı„?*‚ƒ ×*JY2£İúkj‘ФŒ“×**gĴ²DJ”/é–ü)_’uşZ°×`ÉHGèĠLP”Ċî³ÈD8Ĥ<‹ô°èiQ&ù›)—`Ż/ÀF3uœÒVû°ğlQ@tu§§0›Ç­ïé“ĈrüĝI3ùôɕD]!|gO!Ÿ>ıjÁ)Ĉ(Ÿ]û–üœ:ÀUí´XAXĊ=4`.Q ‹K°×M f X%&2ÎȀıÚİàìᘠ˜ŻM$lÙµH–…STD‰ùĤPİÀİÚPNŻfé‘j"xÁ}0`°•´ƒġôĤ¨yĦÈg"sı0nhĊ€­°sBò‰„0 ÀRĉ€µ(cÀÚá0œúǰd¸hžħ9xè•K-—.Œ$·–€QħаÈ@À.—%"Ĉı\NÍÈ `òl÷Ĉ=ZĵËBĜ=‚qĈŠ.;aÑ U2LlƒKrıJˢ£HX,–î•ħ&F\nğĠċb1`W ­é’6Ìaóz]DĈ0’°y-D¨eX^î×àŞflˆ‡óáXtÙ}òA˘ Ì£k˜&< ĜĦŽğbwáŞġkĠĉ(eâqŜ°Îüä Œuž° `5·şV2èPÖĝHÖ°êmĜò_-€ ’(Jâx“B„5g ˜•¸îst`DB |8K9o”ħ)+A˘FdsÀ „Ċ wi-0˙—‹%`vı;k³Â\€ùZtylS€ÔJ Œ`° !ÛĈ€„›3Ì7(cŬŜ+Ġ"D|ùt\a•˘QĈĜFĥDÑş–ntކSĞ!W5eT½`ŜÁJp]*Âpê)ü$żlÀr6{á €…ˆ²é(:Ö° qU–IÓ)É)‡”İšž•­OzeÀ4°vıì°ù`˘*—Ğî6Lx ˘QĈFR~´ĝĉ&Ò),—ĝS ×°úĈ*ÁšĈÒ˘S%ŭÔµğÎhóú¨Âuù |š°2RÓ¸O>)ğ÷yS'Ÿ€ccĉS0ÂɖËln9tÀ•Cè\´V>˜_^´Ĥ‘+lÀ̧ c9`‰œŻ5Àt•!ŭjk-Ÿ1` ݝ=BXÁê‰á°Í°4Â47ôáĥÛŬËŞEÊ^áM '™5\iy7v-’*–àÔ‚:u€Èŝq&e4L°şFù"ÛX3`ħĜ-–°Ñz‘R ³–Ĉ[öÄö·ä{- "Y^V-˜s…HV× 04Éá""ğĥ‡ö RT Ë5oYJfÇQ‹” yf İàġzğèéžE–ĵÚİ’ôŠÒ^/= cI/5ÈÉGÄ3+ ƒMŻ]3…$%á3áÄŻEBÑzġ(;À´‚vŻ“LÂÔĦ•Íu†€U0`0 l£ÖÔµ”B˘ħüü9“ñò£˘iÔ·ĊrR(ż|ZBNŠĞ–œbŒ²Ñ³yu⟠QEÇñ¨˘ġU¤İĥ %ĥĦmÚ.u[|Ò% S‚uĤcARĊ&›HôÄN„pê€2 ;ì(ϒ´'zD/ïeÖû`0C݇ĴäŠy‹¨%ßc/uv'£0ߎ{lÔêµ9ÒĉĞ>2OŠ0 ĜS4 ’£ }ĜŬ, $iuĝ-x›˘Ğn֙÷ó0 ĜS4B!QߛB —U)ġ†ĥWX.k XŽöğicÀòTÀŬí<¨›áPLşŬníJϝŒ@)Ie/c ˜˜v{€¸Ŭâ2è€ûŠ™âšĴU$’ÀÉıŬ1t³˘¸qK0MÀjVú ĠŜɨ8*ÀyÚëó~À²„Óë$(#Àr¨ó‚•1ÌE8ĵ^ğĥżk'cEê_ħk—ĦéLYNqžĦé(ä]E.o!;~À^‚ž|>ì´µa+G"ÀDF#ieꖏFĠDF˘@Dò’#çW"@]`Mìs1ŭ€9ˆTË'"í,˜Œı;kËĦŽ:yáiôgl̓†{D ú(“TírÙĉ Ä@ÎğÙħĈÄĴ€°\Äcâ#X´µÈ*ÈuO£§h4ÛĤ”ÈÊ2PËà 8"£\c‰-Ġ$Ħ&UÁžËĴFÀċiĥßDĈ-„Ž ôV|…‰4Œ$ܐĴAT 26Ĵf^‚İ€IkzX:`'³@Sj¸×b–iÔ¸.ħ4BKŒndÀP:kĥİ”$ÑA ­ %ß0;‘1vòyŻÙB b„ ˘&N~É.wCliÌU`iĞfÔ¤°îİ=úï¸Ò4ĉĴ|ÚĤ̓F„ĴĠ XĈd{쀙ŻôÁ]ğÙ ë’ûQ· M¤şÒ‡Û´GëJ“Ç’XÖÀDŞ€EċnùŒĞSÄoLÀF cĴçWÛ "FĥLKYL‹°VHé,mħ—Ö°Œ\ϑ—’ħħ°€…CÀ öŠ:€µœ½Kê}0X,š™H!$‚-SLĉŞî0ÖĦĥ&SĜQ‘ĠYĞhƒû`Œ¨7´†g„‡Ï:ûœ|àß:aƒ\Šê,j‘9“AaPğô3èË(ĞuD‰á“â2`™5Œĥ:+ZÀ,4l` ¤wısŝX?`ĴFısŭ€ñ rx n‹A-Ôn·]KöelNµâ*O‹YCĞĵ38C‘–°ÀÉ^b L$ĝİNW^aù*Á|-ş¤›: I 0)ïqšÑĜšv°ĤÇc!œQCĞS^ÈÀD˘Š¤Çt‡èñXé1mĤ€‹Ĥ9 àü…áépËË`%)Œ½ƒ+5_ïħùà§ÇÛ°€eÀÏ2]Šˆ°Kşá°™´Ò„àÊ[ŽĞ \L4Ú4ÂñĈ IDAT ÁhE2,…ÂÖ·ïIózħ`ġ¨,Üt4àŝĴTŠŠ5¨Ef£QıU:۔F(ë1.2MÁİŠ$jÉÏĝğS´É.RIÉ.’Ğ̸Ù'ĝa÷XeĤ R•ŜİR5‘šİò1`°A€quciHT4Ż,Ŝ™:†0SĦJ•°dKöĤP³'1`°•&EB €˘<‚¨ë)u§ =->‘ô€ásĉh­¤ïüħ<ŭ„IÄ/qò—Ĥ2 ê—ż<ŝˁò'~9„˙ċŞe§£<ş€Ħ6]m‰•ʰĈ”2Š ˜#Ş—ğŸ6–oûi39ŝôJ˘ž~ú³O”GO>=„|öéUËN1F99€…jÀc+İ,0— ĞAT°‰Ä&rMZò1`0  †€™$‚Ĉ€‰Ŭ€-`O °"AĉÂR5ÍX&AX´²{Ğ­+l.‡Ĉb÷D\\Àò A¸=6çĈXé£_pĈAJ\ÀáŒ&‹N4)ġƒ>ĵQʰ$<Ê­íòŞËĜZNj=`ŽÖş‡ÈH‚OG#ê°ċá4­íµ*Áì„Ż)eëQ×ĈĴ ğ51kXĉ·%nZˆ` CSîúkÁÙ§kE“Œċ~+ UŠ–µVQ™ J¨_ë&÷:`K°Ş'Ò,‡Ğ¤äm'âŜHs쀁ÒÈfĵ” ï /Ów×qĝ$SÀ*ĉ+È|YÍŜv8Ĵ…ìĤu °1ĥfӘsDZħĴ`^ĦĖŬQıħ&­´‰“OĴ)`)É0ÒÍċÒQ(ĴŬ’ÊBĦ+“Ú:I€é?ì^'Á€aÀ0`0  6Àb‰d&0G4Ĵ³Aù '†ôqú&ĥ)M`ÎĵN¨‘[ûĊކ­}wĈœŭ·=ÉòûËLµEÙ 6‘b"˙1ɲ|ÀÊè…€°Œ7™0`°1Vp:ÊFĴj˜X*ULĞkdiЃšsĞÔÀö`VċZËĴŬݳsk˜ĊíF\n‡²Ž&²àñqÂDşb1 è -cŒ1`Ĵ›pĈ’ŭ€ĦG!›0c£ƒƒ>€ežP,ĥŒ èÊ(‡Â‚Ż`v´> œH“İ$|ëŸc6„“Ÿ°hçî–´çóvMÇB `)/™ÏG"ÖXVMݍ1˘‹H _?kµ‚/ĦÌ=`-ĜE(&Ö]k*'ҔÇÌĴ`¤³h{Ïif™ĥÁŽF€ÑpHQ•&Œ—’ñ @B˘1n ´ƒ&&Àħeû2FI+BËğ6€–Œ$FÁÏÒT&Ğ]Àuġġ `"í&€YL+R6̏Uğc7ô€ pŸ vꨓêbíY b `eċ%<µ5qòazAP†ö­`tJ‘ĝdV/vgÚÉRĠr钺U¤(F;!^Ŭb) œaT³DzçíF6ËT^=C÷/èöĤ¨šŝGÙÓà$ŭRĦr_˘Ĝ{ĦF%(½ŞUi7*yꟛːJħ#Ġ L^Ĥ ËĠ&…D–`XĦ1`X^€U"XF L `r7ˆ$ɰĝH“˙êÑyG(_AŒŭ&÷ šŬhˆÜˆBMЉ”Ğù:¸Á ^Bƒ–AD£`Èç‡̎Ö"´ÚŭßQ+Ln´R˘ADaíädĝ`\8Ìñ(UìCa[sŻ·Ĝ|>_í6h ıĵq W,WĠWM¤ÙUIE#ÉHĞ ÏZ̤Óéd<@ßΖ›ĜµÊ =a šĠJ †63à4İd4â †[%`a‚ˆhûß˙ŭ#ö‘·ĵáŬ÷êK†Á™Ô– ûA`BX`|Oċâİìû˘90EçW!RÓTéVİÁΜ<Ž32`UŞT*ĉS‘j/`e&Wѽ´€Z4Î`ÀFMQ´0ö#÷£żyçŜ[oHjK„²µ‹ÏȘ°DPˆK*Ñn`íí]”·z_IĴV.ÙX×ÊqÑ.`rw 1]Œp2`yĝlŠË$¸ÀŞI:­{Ġµ€É T*Ĥ3°ĠÖàÔTäìG·ŭñ›*ġúÛŻ‰rÀÒÁêĞ_zöÙçCİ.`5P-Ĝ `T€yġĠ—^ÒrTCıċFĥŞ&ĴâÚ³ħv·LêLÊÔó$ÓĴY(†=`9úŻÇ58.‚Ÿġ4×SdiĥjĴX×ö‘ŭŬ[(ÙVİ˘V SŻlž}ìÙoĴ X] |R „,…3ÀjÇDF;÷œŞŒ°²MeBŝ2ŒÉ!ÀÒI2š§òÀ*éïŭ ŞV,Qż÷ċ´°ĵ҅ˆ˘Ŝ8lĠ ­ġ§ìĥk”ëƒäɀ1>ö",Ğ{èyYĴêí–T–Xĝ ;&’TÎHúĵŝħF&i „ ĠĴPгl6\֚Hd4˙™†˙Ğ:İ&re*ìĀ­%żÑ)ÁŜô–?ŝ›¸í-×üV…/5N>‡jz6ĜÌ× ìÖ ğ&™Ç¤;YÈe<‘úHĞW‘QÔ–~ò˘ ˆŸ|{Ŝ׌/£Ï\²˘1‘h3nÚn…o^g"óMu+x–raÀVm"Ùùĝ‡Ûnû›ĵ›-Ü´0oġyDÍCOjK°n Ĥëġ&2Ĵ\ĵĝüóχ##,dĝ‚—ÒyéUPô´žĝŽ`"WBċX6ÊvM$,ÁbŜzŒˆCNu&’ŝĉK°ßüĉWcÀVX‰íVżċĥÛn{Ëۙj Bzè`\4óìc€šO>öH]Œ‹;µNae(›H/ôŝŸ|òÙç=#,éô‡ĵÎ|‰TÀH½ &Šży&Vsá¨ŜDĈÒ|Œpö™È?úΟÀp Ĝ(Ld£ĜġÁ¸È[>ü–·s_ÊëE„)µH*PĊÒcχîmtj‘t Ĵ„µÈĴA —yÁ‡`=yŻ€5Òn§'߃ђùúĠûUÀ &/e‹÷›Ç:Yq<çµWt&’ú7ż÷µ?/H"<ċ—1`#êMÑuò#ox7[Ċ|N§/à˘:í`™À½O>û佁·?vo·L ށ¨Ì °ŝ‡.òdĉĠ— _€=ßhœü´'ÛëäGe^~˙OeÀ²m É€&u&’tE£Q&’Ĵɀċ£ïŭÎ÷żöŝtî‡/~óñ_½ül&²˘ĴN1|Êawy=vğĠßmÉÏFßìóDîŭï‹Äş-ù٘Ç÷ĉHF ”[òa 7BÀ¨j"ïːÁLùÉ'ż ·'G_èŻEÊ|½œT£´ŸDd7ġxRg"({–݆À˙óï˙û_ûÎ˙üÎwóġÇ_xᅯcÀVßZU105hqµ˘+à ĠjœĉY$Wƒ:ġĉP8Îİ€•ä@úÍĦ TžE*îP$VG:ÇĠ‘çaùġ'ŸL’cjĤ(q™&â녀 X%ġâ ?üéyTò(İ5‘>:ŜED¸Ž‰|áû_ò·ŝ{ïxï{żû] ĜêMdëƒ%}r“i<´Š(ċá7Ÿq“d\ŒrêÀĦŜL‡H@O 8gŸüäc#ròĞ‘OrŻŝé{³°%?˨Ş4€Aé•oİ@l§ùÂ÷!aû·ïHÁÓĵÓŻżĥjÀšYq{´7öşòZÀeġŞ3NDXÁف êCÑn íî˙cO>˙ßc+Áü‘ôûß˙?äûżŽ“÷`²>Âò(Ġ5‘_ú­Ĝ—œRj‘/| šÈŻŭío½€ĝ€°zħĦñÁêğÓáM„}.ĤĦµêĥıÂêDêÍŝ°b"Ŭĵ.ĥƒıŬnRHvkŜÈ7÷ŭ“ħğZÀZê@ŞŒyaÀĝŽ0à‰½ŒpIwMä—n´ùĜ*ÇVŬvÛ§nWMä˙'2‘ż÷ğòiA Ĉ–´ŠXÒë ĝ\^ċñb ʰˆj"í]`O vè Œ“d˜òí$YJÑfċB…İtGşŬu¨÷#y/”÷—;€U˘?ŝĝׁü‰Ì¤u/°lèŝµż}ïżUÏòŜlġ>ĞïpX€ĴòĵaĦĤżvÙDfòşÀ>ÀŒi'ÉPÌŞD3exĦÜíMAwÌwĞċ‹òžùrÇD²%ŭĞÓŒz˙żù·Şsܛb•€qrÑ,LEΠë(zŠXïgr{W ³}Ĥ:â.Ó|Í ×kÁ0ÓŭR¨(ĠJEAcÀV˜Sá¨Ùj5KRiµZ\iôRmTjŬ3ƒ‰A_̂½ĞFˆ¨E4[FòŬ~ċ )Á¤ĞNB6—(½N%Ö¨01“Ÿ\}‰,´ZÒë°ÎôM9 –q†K0, ı_0,c,rW0`XĈċt:'isœ)W`yMOÒ4ĉ8S6YG/ \‹Ä²áÔ\0,cD¤3­…2r™ÀoqĤ`À0`X0`X0`0    †€aÁ€aÁ€aÀ°`À°`À°`À0`X0`X0`0    †€aÁ€aÁ€aÀ°`À°`À°`À0`X0`X0`0    †€aÁ€aÁ€aÀ0`0,0,0   –ĞCRQU"4 ËÈ%ÖTb(áyòħŒ0ĵÒ     †€ÛnÈŻÚò_uíKĀaÀ ¤öùÏ ĵÚ|­÷çÇüġċÏŝ3Ÿ˙üY ÌHò…dgĝ:Á˙…€šÈö ÌDbÀŒK*c9N‰%•q 6NÁŬuFĜϐĴâ Ñ .`À^Ż€ mô›ÈΖĜn m¸³°V =)ß·†Ĝ‰Â•BĀC’¤FZ}%XgëìúO ŝ€üÓ EßÚʇÑׅS/Œ=ùó\S›épšÊ7š4³E·‹‘„n˜Ÿ‰Ħ(ÊĠrıb6Ĵ$l²xœà#nĜ˙úUŝÏĠ&f6›/ĉġÙmĥPī5_ \ˆ‚Ż´9üh@Í(¸ {Èi#=~°ŸäÌÊ@H%pŻáŒ`À†ş\$°³ÌÓ0uÍMä?*xŭċS—Vi"EÚa³“œl‚ ›ÓĠ/`a—ÓnsڝX&°ÙtÑ­R!ëˆeš|…ËÌVFC^F4Wʅ˘°e”.àg™˙Ği•ż‡ĊWkeßÑÍ4Ħ° ÉO–µqß`–L,üjÎ HJ6úŠÚlAž‡8‚´°WL Uœ¨…}°e 0XÉĵ`ĴVù~çwŝŭ?6V ˜X!Á12` ÈO·y$ĥıĠVš!0IʁMGĵe˜\ĉŒ™•”Hċ÷€^8¤á–$–AÒçġò˘‰TcÔ8QTĥ^ğÙWIxÊk àÒŻÂ}éµ×úMd‹„ž— ÉzwIİĉ5€°”€N. [ÙT:줚-%!їÊß,JÊ´ÁQ<ßĊa“òáJ8˘vĤğƒ6;UÚfĞ€ iÒ°Ħ(á6“vÙliÙ+vk†&ĤT!ÛÌżĝĊg`ž^úè{€„ü÷ž‹íµ×>ĝʵĝû˙ċ9Ħ·k@?&ĦŞmXµ ĦVMDì¨ĥÁKm:‘ c)_q’– —z,œH¤x>•Hdvş@§*eua°‡ËíHÂ0€ v}}µÛĉR~K<_ÜĴQ#i³E@1çIbÀ†fa¨m•­ %W~JÂÜD˘;Şĉ?xŭġ×ßô˘ ĜǛ§V€ŭAçNŭÜhôĈÂ/ÊIZÀü`'Ö§Ôf`œm4dĝî%‰‚ÛŽR Ä:›ŒÓé´ğ] İäTŽs5†L‚‹„c$+.[°Ĉwwˆ7ӊdDâ½6\‹şŭ1 3Çs)[$1è 'ܑoš™HhTŸıéĤ½ĝ͛aÀP}`*–⅏żç=_6Q¸'×^û§UA¸t×µ_ı$öšH=`ˆRäŞ>[°Êq\Éaç%‘DġjsTWĜhç@!›ä„Š=VG€}‚`Ô~džÉ&?°€ZWċ\÷#öÖTÂ,ÁLNŠ7 vÀ€ ßLr8às(À·-À¤df"!`Ìġ× ßeˆ˙GÀUSĝê_ç=¨|“Š?9ÑötÇÑëäXA‹ t;bsÊ>P‰‚{ĤlÎR9l4Uè4B’DÊi#•": {!`6dN[@ëSŻA{ Ĉ §H Ĝ2šĤ&—k´˘‚ÔLÛ|Ċo™˜Èßù{˙ŻŻżŝ˜ğŝĤ/çé£ïùèÇ …ÒWÁ˙J°kŻŭħô\èŻE&ĊJX“=˘ ˜ÑVöÚ(P’•eö}ö ÂÇ‹”Ò ž<<`°"=0›ŠúR°a/Îk³GQĉÉyÌÚü珛Ö"żöùĜġ„ġxá‹×_˙à :aŭ(úäÀîß÷‡×ŝií?<ß_‹LÙu-% Ċ`ħĤ++30dI wƒÛq[R•ŠlÖî(˘À-QNÒü[y'üñ(D— ^\‹lPĝQѰ×VpÙB0iĊ¨ Ĉğm™RÇB˜Hö×ÈĦ~Ĥ/ĥĉGßóñ"[,²ùžÊğċ6ÏüÁµrm·ëšHÔ ÖñqÊTDċäLodiU`2’”BZ§dsIŒm“cmz1á“Ħ›Ŝ_vvż”‰úÀ€éu$`qÇ0MCÀü¸l9זrĜb0íù ¨¨‹(2%gZ‹„˙?&×gnúX­MäWQÎ|ġ=eÀDA|šÉğÔl­uò½ ]u·ê·l6Ĝ ÚżÔˆÛa-RLè ³ödDħŻ0ˆSÑĉ&’Cı+ĉ‚£_‘ÓĉâşÍÈó&€WÁ7“OȰ$lè&üL>ñ˘(Fí6Ÿ(˙¤iCëߣÖîëŻ˙˘(qü__˙MpƒG6?ŝžĉa‹_Ùàà˙D ˜ĉY¤‹0O |§Èşì6;lÔ¨ıUl;mv^c"áFÀ)Ĥƒ5ċXğ½ ĥW9òÂ"ôüyp=YT şŠ½ċ—KgX;@e Ŭĉ.rÊîPµĵËfω<¨E !Ÿġ6è‹"ˆ bÀ†mĦPûQĉ„ÍéOŞ&ÄÓ-·tĈäÒż—K0ŝƒ€°ZùŻŻ˙G.ü/`"˙)µż ›Á€MäïûÓkżr^”~ŝ‡ .)ô™H° 2Ï 3ËCE (cĵĥVŜ¸ µYÒĉˆ³˘ÎÁFVH8 w/· ğäêfÔN<Àž  ÖĞĠjĊˆ[~ĥéĠÀv/ÂĥŬHœ¸FlâUyb˙{çó⸑ĊñaènÁŒNb0‹ŽŜĊWĉâ? ‘ëÔCtÙC_âÖMD§ÑEƒÓ„FMrV›ĝ ͒Fd Š7‚E°속"´b7•ĆĈħ÷U•ü£L˙ŒĈîÉû˘QËRŭü¨^½’ì‰gŭ“ôġĠ “ÈìÔĥêôD,.÷ç ĉÁYÈt€€Ŭ 0ĤĥSĜ ‰CNŸk"ÙMŭŻßx­·~û5”d Ĵ_MûìïgSĥú÷Úż>üEI3öUhż%jÉiaŞ!¤* [˘3™ˆ-íô”ݏŠ2tv…ğŽ½-%•ÖĜ)2 Îĥ,CaJçr[[Ŭ3µtäşÈòµ)oW4v­˘vd™ċ³#ËlıÙċ‚Éáıۘ'D$v –4{Ÿ3ƒ[yiû‚ÉÏMħ˙ΞYŝôÓ³Ñt|xĝìÙ!ÜÜż;<ü„N“żĝäż½HvùİkA0üùLhì*HòÁp‘Ä6Ì>œÊta&mR "g>3 –Ñ <Ûp`?‡‘hÛ:Sɞ ȳÖ2 ]6Ìp<{‚9ĞeŜĴ†QìÄR›N0àœLÉùIŝ‚XްĠ5š­xž5‘#2ZLòYßî- oDŒ'çS8/‡½<ŽÙv*&`/ĞÉùIĜx4°Wtž³ÔOŠüá.Y~„4ĵâUHlUö„îrğÎ:+{ûOÇĜğ+Ĥ›^욂Ĵ”MğşµÓğìÒÉġïÍŜ*Gl%“t+Ûò™Ûĵ0‘·ÀèġîƒñŠI{Żäë}ak'x%M…€­ Ħ²x9뜉½^—ĉïRĴ˘ì•fĠëŝÛTyàşKŜYK13‘Ï~Çšvúj 6|U}Œ€­ ˘jr|„™9ùé? ŸWĈÄ/Ŝ"`sßí/òE•!`ĜežTò”é’ü†%†€]&üuĴܕ üuĴLá/"`h"04‘Ÿ?AÀ°KLä{}[?!‹-½n,opùÓ÷>úäÍżM0쒅‹ñälß˙z‚€!`éñ÷˙˜ `Xi€}sr-†€•ĜÓ§Ç? `XY€œœìüˆ€!`%vtrr´˙d„€!`evtt´ûŝ/V `ûÀ×Ñŝîñ/V `ûûGïÑñCÀÊŒj÷Ñkħ¤€m*`ûğo~€!`%LòÙ$ìh÷ÑÏ&öò;˘ žüùĞlŠ€!`ev|ròäËò˙÷+ì× ĜÁ“?ŝĝġx⍀mš~sñé§_ŸüŒ€!`%èğ,?ŝò§§:Všŝz|ôĝV–~x˙h÷ƒ1†€•¤É§Çûğ˙DÀ°²ôíÁGAÀ°Ò†°L0Ĵ<Ŭĝ÷V0ì×+ …€Ħ0 …€Ħ0 CÀP CÀ0 …€Ħ0 CÀP CÀP C½êh3݆zéjAŻr…] ġò›B†*°ŒmŞÀ<ÙqäC•˜%BĠCÀPe™H³R ÑD˘Ê›ä[}œä£‹DŬEÀĈy! U`}ğı!€íX ŭç*°P yŭÒċ…ìo`Ûzšê8ŜsċtĉÑP–ám’ܽyߘ9£MÌ…´ŬàırAqeŬn°Iò۳ɌM,ħï`0è§!QŠ€]Ĵm2`YCêm<`ı ˙z’„8‚]̗äls‹ë‚şñ#XĉĝĠ’`„€]Áڂn,`|ó3’d…Cœƒ] XĠÛ\Jo"]öo¸vû¸ħ&²ÒßäI~l y·G°n£½H\ĤÀeŠe™³mfQĦ֕€Í£Ħşĉ†–ÏJĤ_ Ĝhĵ4I’Ş­…,ûı²Z¨…L{£´T²è2ÀP¨’T–ŻCëÊ7Ç|_YÏ3×Ħ”kùĈCbkÈ·?$î:òġFÄ×אoït °| £'¸Ö:ê`Ñò`ŭ5ä;Àĵu䋀!`†€½ `š²¨}b.?›q—>˜Éً;çózÄS´Û–éE:™˘(:Ŭ/ġíĝVxE+Yg{ŝÒc0;Šğ‹ÀôEJÀƒ"Ŭ˜îi İBĞHʧEQgûé*ôÀŠ|ĝĞDìœğ ˜Úu1ód³<ï×ĝ×Îsĝ@t=£PĈ"Ĉ#B;›Ÿ†ƒ8ŠëŽóâš+k‹ô­¸ZqŸ4§Ĉ£Ħ–ĈˑÑ<gİ™•#gċ`;Ż(Ïġ€eb³¨ό´L2O*ŻF$çÙù˘U2"GyÎ=AZóY•o˜Ñ&¤î;}Úv9ÔÖR _˘Jê BëYJħISwœiş]ˆè¤tŻĝw09"5:DDMıİ`"m€Z[ÚèJµe{ğ“ë}"°wÚZRĠƒ8,iƒHcKÒR³]ğßI ÓFŭ#X*17šfلçKŻZ]v,-“lbG҉²'İI˘J.ŻÒpd×êµ>ÑéSzWc…uuWIDATR„,ĴKJrÀŞ6,Ñ$›x’ÔÎZfŞIr@LI²ğ÷kaCRbi1ÀLİU6j¤cRSöIeO²ˆ_mF+ÖfġlpZ8`ĥ ˆ“¨›l€ħÊ`{ô/ۋw°Ž‘T€İ¨W]kD/Ğ&Ó#™¤&Äé&ĴÁĜħ›íXĉ-×L) `™ŞŞ:Ñe›(½¸Ì€J(ĥ­ĉFX¨Ô‚Úbè(´p"‘2g;Ó,˘Y×ĉ¨=˜Û„kĞ l-ÓkĜ (:‘cèíĥ —Òàù™Â0ÁêDèÒ =o5ÀÚĈyÀĝ­5PU·Ĵ–‘&QùšF: °\µhĤS+Ù°™ĈŞ›×Ä-?VŞ9tµIf€ hĥÈm#9H$w6‘–7<Ŝö0ŭPìDó0ğL!˜'Š0Ĝ4Aܰ@‰Ŭ&M)ĠD Ğ"Ŝ§€m‰B“÷ ĥ#îPÀüĈĵ÷ċ¨c„Í肍…U-_ °Ĵmž,Dq,0éƒqä{n"Ӆ‰|=0ÙŻQşÌ9`>ŻÙÀX`=€‹"ĝèBƒ-F° ½%`@lnфJ/Ħ&’X*íIwX?ÏVK…w·”…ÁÂëMd Š•m:aN¸F0/c#û…`#X]F˜GM$‘m KŠf€ùYÇX 0bkö‘̆ûˆ$Uzĵ´żh"ƒúÌw…ö‹Ğ*ÌD&*|Ĵ5!–¨Jë,`˘0 j ÇmE™HKĦÇ·,ƒ j"5>#Q݉$}f+T`ĦŞèçUzZ†˘ngÄíßċt™‰ŒT*€Ċ XEiYƒ†P}i0Àö•šHbŞ]ŞÒċ€™ŠzKéӒ&3k‡@“ÑFh ÀxHGá;Œ›HĜĞÑŒôîDú½Žž0ŽĴND˘|C;÷"cö‘úïà߀7G\'òHǙCOÁ°Ĉ‹h×–ûÜ+„ĉî'˜H6ŝ䞧8IHrꘋ †|s /’¤&’NƒàÚ$̝Ĵ¤ç„7ZĤH9†­Xҏb8†Mñ]â;}z6aÑR'ĤĦgP‡³´Ä°ġ‚ÛƒÎĴi<Úd´]şï§ìë<„ï=O ĠI÷·‘wZ­–½G§0]:ŽÔÊ|/ùê…ÖŽnSF?98GsGIG3J~0Pu1_-RO-A4ûOPNuH17V“E[TâUVT@WbTNC]‡=_[]ZĊ0-?`F`™G_žK`“Ra|}~`b_@f°<}AVnOzZ[HfĞû$%OeĤdgdNg Pg›°GBJjİEmħzePMj°“]FNq™_i–jljhe™TwzUn¨JqĥRn´fX÷KuĤRqħ[pžnpm\o¤VrYo°drŽ[tWuµö<;wugsurgqİH‘S\‡YN€°\zğay´fˆfy{xd|ħh}Ĵf~ıl€£ifĦuRUŠ·a†­¸ia~~ŽK£`r‚Ĵ‹‡Pk„ż‚„w„Ħl…şq…µ€†ˆ†ˆ…ôZYh‘½rŒÂM¤¨ŠŒ‰yŽuĊe–Ò݈ey˜—€Žş\Żq…ŭ‘„‘Ĵ‡‘¤‡„ìȂMsšÁ‡^y˜Í”–’‰•𔟇óut‡œÍ›™’¸“˘˘`¸ĵ€Ĥɔ’˙—Ÿ² ¤…[½Éš•ô ˘ŸĊ’’~ĵˆš˙Ĥ§¤Ĥ˘Ĉ˜¨ÎŸî Ÿŭ‡’ĥ¸ˆ‘Ò˘{£˘˙\ÍĴĞŸjĤ³´§˙ÁŞ£Şħİ²Ż¤³Ò³µ²³˜ħ­ìŻĴŝÏ׸şĥş½ıšĊçîħ~­ÀßşĥüĞÉÌÀÂż×½ž›ÑĜ½ÄÓĵÄÚĊÂÉĜ¤Ù­ÑÁ³ŬÀ™ÄÎĊÈĵÀżŝĈÈĊóĥ²ÉËÈÂĊŭÌÎËŬ˳ìÂĵßċËÊü€óïÏÑÎÒÔÑÎÓÜÎÔëÔÏûèÓ³ÒȳïħÔÖàÖĜĠÒĠ˙ÚÜÙÚÙŝŬßÜîĉ‰żëòîŜĈààéáÜüàâßŜá˙ċáâÏîñċçäßéíċäüçéĉîċéùóèÛëçùëíêëìöïñîçġĝñóñòüùóêôöóĝġú÷ùöúüùŝ˙ü1â%è IDATxÚí½œ×yïͽĵM¸-uC…“7Ôıl-*­|Qr7BŞœí 7ĞMW£kOšJEŜ´·ÛWH*‰‚}ßë;ñ-NƒÊwŜj";M|§Ž#DjCj["I]ŒcżÌĈŽ_Ì+dâK1 ĉ=çÌ Ì° ğĞ…]vu~‚Ġ<ç Ì9_Îóœs†ƒRQË;;düU,,­ŜıdY˘)’1pŒë ŭK¨/`aAn:zaéşËec )י gîWé ÈÙpààÁÉcî¸íàÁŬ'¸iöàžms÷ìÁIÙÜĦ2O€ç‘ƒ3{yl›gî=vpì|˜{ŽĦçÌɜ<L<Ĵ2gÁ Úĉä,JB&xíöÎf%œóÌ!ٜm™‡fċçAôl™³ŬL”˙ï.%÷PÏCißè€d˘3;"ÙĦö9‹T.C*‚™ú%rDSpg• woğpwkŭöcrñĉĴ”{B6Zü00wÔóŽóLX‹£05&÷C‚ÎôL`À˘w]8óʖ~ùË3€° ‡Ĥ·ï=8½ċĝÌôµ'fv~ĝÈÌö›f‘ı˜ğıûàôŽÀ<63½{ĥeîĉŽÙ™É½gĥ/hnŸEĉôƒ3“‡$sReÊÏ=’9yPz€ÏNsF1'gfĤg$sZÊAO˜nmŞŸÊĤJÓ˙ÏÊÙĠÚDÏ]Ò;Ì?òtû$§IĉdËl_Fws]>LêR@;¤Ü“ÚÒÜ#—ġaÉÜ;Ğ.úÈ<(™Gf&wk̝ĵIŞöŸ@ĉh›žŜħvĉ˘ “_ :À çĠ OŸıpWÔ`ɗŝ­·Ŝzĵòêé{gvm><5ħċÔĥ³ScğNmŜÌSÛ>Ĵ5wšÛ;3µyï ‚ñ§ĥsİ‰íĤĈ·sRkÚ.™Û€9ÌmöM $°99Ì݉3èımr4§vN£Ü hNJ&Ücz =‘ žÓû”¤‰SÒšûä\h˘MLOOíÛ'ċîÏ)ĝÚ5µMÈ{í“^·oşuÊ{w˜;§ĉŸ¨œ/rşŞ 9ÁÌÔÎI)äŒKE ™3ÀD…4ħó@{ç3RñI…ğQeNœSLP“{@µíġĞmێĥıeV2wÏLJĜ!™¨bÏìÛqhÑ gžVcòÖù3jpŜBàÜŻ!é" Ébxç…ùû]¸zçžé]Á‚ÓĜrhbl÷ôÄèaÔĝ•yhb|ËÌÄ`ë´óÄĝfÉW´ùÀÄĝv`î™n™pçIÉÜ(çNômœ™˜Ĝ>=1sAñmœFĉĥíS-s'ÈŬıoblBsĜÜ6…Ìm0lîl›0<'Àĉĝôé gâŜı³;OÌ:177515÷…éı/LMM,¤Ósóӝ™{ñ‰ƒ÷Ìuŝú³Oì<>÷âÜèTv^/ŸÙÄÄ&xVğĉ(ĵ"Ù—Ż \ïĝ‰‰Íàzċ"ĜĜ.X@ŞòÚsäÒEż ß^XÖà Ì=ÒΛI&€i^Tİ[LŒí˜™u…ÌC’ı{ŸRħcğg&Aĉ4|½°·:{k`oI€½SĜ[ò~6Lîğ~3Àetvbzï}£‡‘‰pÛ³o|34!_!PžQ·í’ıY6!_{%Ò·\óäÄ8( d˘â“Ìí pes ĉN£¤1˜+³%ĠÄĝĝ.i>÷ĦŠA›Û¤šÏqP“Û&$óú‰ µ àEÄ7>µí âu_q÷ĉ}â];ĊğĈûš÷Žw ˘Ó<;>qúü†ÎĴĠŜ8˙ti˙ÄYQÊŻß*ìŭWϽ²áÌ™ĞŻ—ħKsVcÊy·OR1; šàıı]"°6+Ÿ8ıĝöMlR0·m߅Lù³ĵ –µ\›"‚Ş­jہp“êi™›ıEŞçħkn¨Ú_ÛFĠ€½l„^sĠ€½oÍìx^œSZ0Ĝî‚÷>°ulËÌÖköLoŬ P;°u0ÇvìÚ:Š.cëĤÍÀÜk+şŞi`N#sT6·L·s'·n›ıqçÄÖ1ighŽ)&̝‚ĉĝĜέc×oŬróú­ žĥnÚ&™ ċBs|+2·Á§”;>!™˙qÉ<[ÛpÏ_o}Bĝúٝ·‰×Ŭ&~}n' k#xœ½çôé]§Ċ§˙zbüĝÙ³_Ĝ:~úž{ŽÌœ‰[?vúìéƒ÷€Ĵ­'îŬqvfâĥğÇgAĈ<âÖożħ{ĠğŻ€>}ö ×oğìé#[éìíwŬ{ħò÷›¸çìÙÛáOïB§ħu\>QxEÀÜ&™è2 ŒŞ‹čÁË%² ,‘Ma]ß.>UyĤL67îĵÂ(.0'ŻE?ĦT ä ™3[7í€ĉñÑȄ•zlÊġ|ÍŜ]°Ú“ÛU€½ìÎŭ@gT€]áÚÑó€]Ĝ˙ż½uçÑ90Ô²Ž@Œ\³ûzf×oUL°ý­Èç}͍ı š{U&(/`nœOİ€6MKĉĜ”dNn…ċµu#ĜÜ‘LDVÈÖÖMğĥ9èy=z˘Ü(™;'ZıÛ`mnŬşġz9÷Bŭĉ7n½úl}˙ğżÛ_½[Lx⎷ï<.žıîê;.Ŝ}óĊğÇ_yì–OœŭÄ×ïŜôô…O|ŭž0ëĴp]ġÇŭ…żòÍŭıon„GmÔèĝÖM›`_8}óӟ8òÖ=7ßĵñâ™ŭħÑıWv_,]{ŝ•ktñŽ›ßĝÔx³£›7ɧ²­2TĉÄü‹œ.rZ2Ç´$—,Ék`yí’̽’İ”ġäĴ‰­JĊ€²F6·ïj™£²ıw˘U“;¤jżú00Aë893Öì­›;ş˙èŝıy-Ĝŭûïżs?àîl#lż€ĵ€ Ĵ[7jµ_à46D&<ïĴ¤\ÔBÉ|!s ċn”ğ° P g£ô“qÛ?“)M6äâSÌ]²y}Ğ&ĈTU· Ġj1¤*›Oˆż¸gĜÙú†oóè"ŻûÒ#Àĥ‹w^‹66m=+ìżġâùÑWĉŬ³{û·ïÚĜĵëŬWƒĴkĥŠŭ͛ùŬGĊ;^x{lbî•ĞÇáÑO‹fwì_÷çNïÜtñâÙ›ĉ ÀE^=Ç^=WŜĞp˙˜pöêkĈ&Z|ÁVUjlB{U×kMı9›n_3äK* İ…’̍3rñMµÌÍrMLJE?:ƒÙ¸gĠÓ¨Ü~íEô)&ä ċ‚ŠŬŬքTí³™*€ÍA]T†ĥ%p$9'wI Ĝ[÷ïG|I€˜ş~;ĥ@Àu öF÷ß,™c°×!]c(‚߇<÷fÔÊ–dn—Ì͒ı EgÓ0V•â‰}ÈÛ9Ġ6A<ħSʕrZÁ‡š×1>Ġ¸ĥÍ7ÁëA`â/ÁÁL8~ÇÄġ ÷ĵñ×°cï†tIŒÁÇĜÄÙĉŭ÷ßżô•§ŻŜöʅŬ_‚Y£à(KÜpúíğ~îÛÄ3÷ß×xä§ç—.ñş‹§?üíëöŬsĉâéñ;Îĵrak°7ÀŜ׍ ÷NİÂ1ôߔ(Ž+=ù2ĥIñĉĝL.‘1X@ûZ%{ ĥ‹o“ÔBĦ+Ş ¸³ KŭĜ¤Şž`86­ÉŬ‹ÌMJ¸żgz|tTċ;@À´Y ĥW }ş¤l܂…MĠ%-`°Aƒʀ횂½Zu‡{ÜğŻŬ<2GċâŜéÎŝFٔ{—÷ ,Ôš”LĜ[›cPQ)m“’ıYŠña?l“ÜC”;^›´ŭÇ1hĥ{P9à1qáíëŠ9qĦaß+˙†›8ó†ä"ċǽ7MŬ[?°ùèÀĤ~qvË·ïûù³_şgfÀ>öŻ˙zöŬÇy÷ĉŬŸBƒ/ĠΙ½ç/!`ż¸m÷+×;}èŜӛŸ8vëÜ5Ż~öôĊ½›ŝÁN<•6_rwRùÔ(ĉĥĥ9ŻwZ‰ï•î$ì]ŽMĥ hÛ¤ÔW— ñµWêN˘bğ'żYŬ“Ÿ’€’:› êĈ•îäٔúî$ìlƒ|í•[°·Ŝ’ğÔì­;ŽžıÔì­WŽÎ]< ö&ûĠK `ÓÛíÛıcv×ĈŬp u mƒĉMȜĤ’ğyœìÜ;3µ]2á Š2à…rĦıojû^43aö Ž2·ٜQ ïHƒ?íĦĦ)•‰†äìÜ%ŸIcgSÓğà€Sûyöü†/żt§>6÷ôğo;˙]xz˙äÜŝÍsû·ż²ÓsgĈ'ï9ŝìî-î[÷Ŭxĝ °wÂĴ{ÏoĜwáüŝk§ŽŸúÌMע³ÛÎ<}ŝì'ĥ€c~éé³§Ż;|ŝi°·Ÿ~úÎk/Üġ÷_ ú’ûî}úü½×nŸ;ş÷8I46#]2§á%(W½4ĉL—ÜyċuHáĉıqï´4>qäÌ ˘‡5ħÖSkü šÛ>ŒĈżàÔN˜ûáCŠımËPċ‡vmÛ;#µ`oµ9‘SH€İHRĤJ•›„îhü ĉî†ö²yĝàô^`Â\Ġ@°ĵ30göF&&ž< g3fĤÁsÉCó^Ŝ)›“Òh3ŬGĤ4ž=y@~B×&2gÌJĉÙTFÊÂñ{Ċœ9à9s=·ì˜Ûrp󖙃;GGn™™Ŝ0:½>&§G§§GG·˜Ù<:şcrftûÌÌÎÑ-[ĤÁßÑ-RxáÌèèäÌÌv`MJù;7£mµì=3ıîŝl‡GŬrpt;<â–ӓ ŭ€t˘3à”Mċĵ¤Ö%j]s˄¤\Ż”Ğ”×ĦVñ픋oï!MiîÑÖÄ^İêäñ{İ&gµĤ”ğCçŬ’ Ğn LE“ X8÷˙R0°K-À6›=tÓħÙ=·Âç‘ÙŬǁybvÏ'€y0o›=´lŜtdvïq`Ә{ ž€ıG6wKĉɜ= ŜÚY1€MĊ<,™Úĉ!°‰žàqxvž ŸGSµ sgK˙Á§Ĵƒ³Ú¤#³KԑyĤêè‡ZıћSN úÌtLùŞàġŞı{‰8*ŻcJYK)™ğ•š86;)çÊĤ²ón•)U,2o•+öĝì@ÀäMàu{U€]êìR'`—T€YáċÓ*ĦÉîÙٛN9|ë‰#ğï€ï{äîÛĠĉ쭒yÓGŽó˜Êĵ ˜7ó8xŭmÀĵŭÈĴÚ<žÈ<~äÈáóv­)½à˜vgd“L<6ÑóDëİ1 çĴ²—dë0µ;÷ÌUv>Öíµ³Ú£ĞÎÇIʗĦ\$4ëZ@‹6oC5Ñ*ú²yާwœê š·+ĉá[eÖ3ĴrلG>6 ç"ÏĞ09Ĥ8óĴ+èu^8£Ò°áÈñÇnşġĥ7Ŭ ŝżíÄ1´yû ¸)›ÇĦyÇíŠyLeo™'ŽĞv>~ℒ{üöÇnƒOi™'NW™ÇµĉmŬÍێÊÎǤMŸbö[Ç.s˙Ž3“Ïıu'z^äâJäöv‰À²–êêVıêîèij+V1ĠıǏMŜ °PcrfœóŬH²Ŝùbm@•uğôß<ÑŜY1OÈ˙ Ĉ<1ßéœä@JD݉·kLĝ™–M9 qŞoÊ5yìÄħ½wxYz§áWïí˘ë~ K££÷^–~Ġ`°°& †…€a­&`q“ÍfKĤœ}ŝn~z1£l6gnŜËcL9`su}AĜl³…*h3ëĈ•ħÎcĝ7Ïp ĊïÏu–g˘\" pñ3—çà÷W´$9@Á—ü`†9Žġ§ıdš°Ĥ£DÛQ `ÀrĉSi.•€ŭŝ"Dž(\+ë°8ñÑ´ğ°„)d'ܕXˆ&‚ĥy97M{5;9ŠÒ!9’˘=%* }<Ċ`,â(Ĝ8 l‡,ô|ÀÀßpĉĦiĜ-@jYŸ€‘³ÇÖJ`^˜^ĉÒ •qq/gI$lŬ@N1Nqœ+Qà‚ħ´$:鄝 E;]¤9Â)€Y +GÒ\+ë³û|Î̇K>,éċL>_°;`1Âg.rQ‚ĉ >²ĴĉñùJ€·K–À,>Ÿĵ‘ÂĠ²î8˘;` Ú÷CÀl°A´è¸l¤ÒE*žò€œĴËù‹óC.2o†€ĦúÙHWËş,†A/ÒUlĥ¸f·H"éŜ2ç³}ċ¨ñr)›­¨=XÚ{‹àċ˜O€íŒ½ÈĴ_JÛÚĝŠ&Ér¤3Fçŭ\ÎfËs§×Êúlñ*0¨µÂÂZ `v¤{ívuÌ_$íôĵbÒâ‹ó$JvöLE°b€ôyŬíĴqÀèïÏQáe=H0‡ĊâTVùüû˙ö;ûŝ÷ĵçŞĵ°ĵOĊ G^ Hd@˘=§,ïôh!`ÉüxĊTŬÒÂW^|HµhîE5`ù –ÙŒŬï-ŞËuciq‰É‰ƒĴ\ċeÀŞ´Ëż˙;_y˙;>pïxWĤ XĈM½ñúë?ŝñ×Üé6`YOG",ë‰É‰)5`Ĵ8Ší3Oñ˙áäıĥŜĴjĞžLÀWR6ïğ%G×DĤ `ó ĜŞIĴœ­Şû“Ż|ç?@“ıñ]l °˜˙·_˙ñó?Ž´‹‘oĵŭ6LT€€QRâSÏG XÛM%)°ŭè/ۙu5`9?Ĵé/ƒ`VGb>KĥNÂ`âĵïİ&Q"s…ĈċrjÀ>ŝ[Ŝ%}[²rcAĴà,ĵ{ü[ÎĴëÈ)‰ŒXёm%ĤŒkÌO+İĥkU9žŻ°DĴ)gÂÏU'`"ċuXÌê,€‹Z¤ï:[$–ˆ°¨É"IjÁNX|ħ÷ëHİ“EJ4_€qيXôóŸ˙ïÜòŽP¨¤íEĉí=˙Ô<˙6`Râ|ñyO0%ñç½ Fĉĉ%5Ġw_“0Ċ.Š!"4@À"¤ŜĤRŞ‹™Š °,)ÖĴ½LYĠ€Ñ D$LI´I€Q(1òŸŝo$0)1úß˙?¤_—£âNŠŭÉ˙‹ôkƒŒVG5%Û1ĜğŜ˙•ïüĊ~üß‘ç‚^5`7~ü<äK XYITÖJì,š"?¨‘œ“ Š‚ÓYʙ¨Š„UÌ3 İpÄf@ôçEİî ´Xp²0;ĝ×GÀxb!-`IámäĠA~ĈWò%|˙ûßĠMDœñNÀ`"ÓHŒ‚ÄÀ" ‘^IÀêЍ4”,Ġ,{ĠŜrË-ïżŠ*‡|NOħëJ§÷ĝŸŽ/ŻVTĝ–;×,ĠJÌjkĝòùsħñ½˙ß´€c‘ˆ½JÌwˆE˘öœ0)1{ĈħށÖäUïżċ݊qa’:½vOŝ4JŸŝbGß‘ˆ‚|BNœä× aX9ĊşS´E"fĊE6 "³b&â p[iŻ`vè"Ħiïc –t€()ĴmÁèċÌk\dĈS/ŭî'_|½üœ0mùÀ”ĜL´g;‰!{ĉJ ŜŬ òSW½˙1.è'­V†µË{b?~êñǟ˙šë‹Ż·Ë{˘R˘SN„€ĵ‰ `$/µc˜x`ù XÀ¸”ĠìˆÁĴ‰ş'Żu‘žşĝòïŜp{ùgZÀĵ‘ (w&%vĉ„ìR`RâPÖ(Jz}Ĵj­€i†)²ż(·Ûn³ZOk µìrß÷w÷yì˙ñ‹’D­e·6 ´ÎK”ógJµjSp;EOĦàIZ X&X ‚|`î‚g€qé°*ȧ­v{4fó…CQµ‹LÀ„ïŭ‡÷³×: ĜÉJg ĉ|U:c0o;óÊjÄ`,W“­Â™ÑOğ˜‰ŝĊ`ċjÇ\dÂëĥ¸6Ż7Şš*J‘¨|Úñç(x—§Š´‰òTQ$ĈıO;‚Ŝ” 0†ĠËĤD–`˘@1NJA~TŒˆñ²˜ ˘‰܆ıY$` #2‘•k¨ÇÁÒîzó{7üŜïŜŭ>ùkjÀœvl…Ŭ$‰%91ò[˙ É,ĉ´ĊP£˙çGú 0)1ö?Fú••ĴÂׇ'ž…=/żd)¸a;Asîvĉ `qg£/-X)ĠĤày0gs;ĵŬ&ğó.gÀ[P#Z‰îÍwLvÜğÜĵaŠFşHI / Tšn˜îRD_{‘‹hMğkßŝñğ€0 `VÇ s1I´X÷D4o%"À´‰ÔÊ–”Ë–k]oÖN—DÉe8Cİòß+ °r:t€µ=`É/mżô™vŻżşVÀÚqWÑ?l€%ıĵôž4ÏÖÁżjijlU,ÂÜ^nŸËŻÀŜ{q¨ñŻ>ĝ2ì2“ïIŻsšs:¤!1b·˜œ—½…zŠ˙ŭŭ”r Ÿz7Ô ż´"€eòHŒHÙíö\5‘—ĊɀA|BN˜U\.`­/} `~k0KY]2`sï}‘ŝĉ£5€=òÁŜp 5ĵ€ùĴ‘lÔê‘Z0ÔüŻêĈjè\$̏¸RK@ –Y.`›ĈÌkħX\y°?úYŽûèG_êp‘ܳ/³‹,yÀ5¸‹*ùgóPÖŬEòn{Ĉğmv'6G `Ac|ı1;Œ€ħ> üıĜ#Ÿ„z¤3SĈ.†5+¸-î<§ÌÀ`²<ŻÙȕ@#V­CòŞ.2ĦZwZ—;>ïKC䗉R+Èä{/żü½ʝ€=ĝُ~{¨ƒüş5`6ŝçĦÓÀ•…m>ÒÒ1(qıŝQìòĦîErßû ˆĥò!s(Ùì½èQ™ƒ‰µÑ‹€5‘ŭX‘J‚ż#cb&ıüÉnċKC Ĝ÷!_\Êd‰¨ûèGß+%†‡0İùGïŝó†˜ñ­^/R°AŽäsĠÊ´Şċ—9Ž4ĜË-À>úâÜÜ?|&ÚÊXYş‡–ò³5XYuwmyŭVĴÑ*wö½~‘G> Ú°”™nĊ`Ï÷Aĉż÷EH a VW]C ĥ¤ËM²ÎĦ¸]gċSô1<€ù"í;ĵhÚñ¨ï·jUÎKúŝÍ\+q¨S_ƒŞ5K²ĦddíVŞ.0ċKezH˜AçĠ?n¤ûÁŠCs Ġ%”Ġ7ÒĦèÚl„X`£ġ ĵ£µ7`*ì]FÂĊş\sîò³$HÔ&ŸĦFT×D_Cß1%F~'簇 F33â.³Ğ×$Iß9¨s:Ë!ҔŜB‰œ·İ—Uġ4{Ĵ°èlö\€1VVbì%§Ú¸ĵ•8ŝĴ&ıhuҟZ Q!Ġí –Ġkn%ÀàL·HE-Ö°Áßİ|÷ÏSëŝÑXUïĞ_šŜċµ^/ĦgYÑA~%jo,ûcŜ‡C PŜ%}W*ş6K-XUG|°°™ĥÀj0 ˜ XĞL ĥ@TobFB^KÉmñCÀ,˘Ž€!ÀŠċ~FFƒ˘Hx „×ÛĊŠ7[0 ŒġûX˙Z1`ë 0·ĊY`Eôûĉ Ö 0żĠá°QËnÁú9U„[W-X=0`°ĦîEbÀ0`0 ĜŠ–¤dE–XĜŸp à€İċw·Ô0½J%^,rÖJşá71`0M Ĉ+>™ž€•¤˙:—p9œŽÊˆƒ4gÖ°µü0 ĜċÄ`Ê÷";żxkç(nÄÁÁ/t‡ 54 ı\ÀR.µfWwù —;àÒU,—+èî•ëò’EhƒĴ!(’í+`=—*nِW è`5Ͳié˙Y½¤·ŝè+ê.MzñÁ^ —>Ĝ{]ÓŸ]Ìê§V–­>b€ú‡7›KPp‘-˜Ž‹Œq.CbxI°rĥß.òßżÔußKŸyAï0—Ó}‡_>Úëŭê}z?yf1ñò{Ó‰Ĵs˙²”½ƒ İX`.’wÙÀ?:sĈZ½9 L X4$Ëż`/²2żYĞTxàĞœXċj¤q" Ĥ“TĤ¸Ü2]€żü–è×}‹ĴžÖ,SÓ,Ëë–èYħÍ䂀ċı–l,`ġXi‹g%ÓKŒ…ƒ³RÑı•,£XöòK.°êÒK­4`ԚlĊĤа‹\Ó.†€aÀ0`=Ċél/°g/uÓż`À0`ŠÔżŸZ0s,˘Vèż|FGç^Òѳ§ôr^zA? èäK=ġÌ£/-B'_xiı:ùÒ0ëÑU,âĦAŸßPlŸ'/&ó>˜ôĝ!`‘ş?ÌGġŒÒ(z³Îuž€­Ž^yÀbt9š)ċTT²ŭlÙ]‹XĜp²,§0•‰€m_>–êé"5ßêÍéŭHóKĜE7™Ġ™0çp<,§n)k-#ŒÈRAV$ëÉpĥfÑXv)1 Ö X$ĤVñSX*`SQ Ĉct0‡€-ÁEFé t‘•´ì"½lĊ]B€ħd%E6TN!¤ü°I\`M^0^L“ĠXµwĊVĴ&,°ê Ĥ)µ5ڋ ğaïnù^w>”„q˜tû“9Ĝ|°e[Lß0>ĤĊéĤÉê,Ô³b…‚€1ĊV0>şŽ†)" şKı˜ûİ‹Ä.rĦ!U¸„q—&Ùż¨/ƒ`À0` †€­uÀJyµKŬġì³:—ŝċQ½œKo>|݇N]êİ=sizèÒ²uêÒ0k­frkä½÷ħîzèÔcz:ùĜċd-ùĜcŸzl:ùĜ²Ġ‡C P'‡ 0NŬİLċşoĞ[0íÈì"ħ‹yvċZCˆ×ë Ž‡ßsËŞÄ(#"|p !ıà%ĠzÇ`°^€ħ„ÛÏñA·OŜ#íq‡…áñW@b€P%FÖ'‚ċ—ĴĥJí͊ÖP†ëX8!*9RäeR’‚èĴE|B„ÍWPÌĊ‹İ`v1ĠˆÒĴW,zEK÷"1`¨ ÊwWħs²›wĜG¤ÉnXĦ ˜(*€eìŒ3Úm¤êvÄ˟‹ô—ġkËú€y½½*ÖE.XÖl^2`u·ses™™u‚ħlÁä=œ5Ĝ‚É€…Û€,â“˘ĞŠZ°Zv €ifĠ4€Ċtç"³É-X#ÜĞbƒ ĥ`ĴÛ½dÀn˙ÊĈğÓk°é…á–—P\¤× "À@˘Ÿh'À`ŠOŒyC¨½^’Y`ĜE^ݽHÎ?òŠˆމRë"|”Ġv"L݁Q(Áf­TV †[@a´TbGb¤[˘ŝH> 6 aÀ0`+˜v.2İ7ù‚î\ä›ús‘˙öèrĉ"ÏáıÈġ7éћ‹<;3ĝè€ĉ"Âs‘8ıä ÏEbİ?ĉ"ÖĦĥ<Àp †ӕ³–Èç Ĵż€EC˘Nzád²àĥÀ$ cÀ0`ŭ,F%£˘1XtÀÂñ¸§èċHv€5kz€ĠŞz€ €ñ|Š­U,ô€%Ìĥ%F[üeÍ>֔‹ħħËêŭ(|"’DKèĜ`ÀEĉ ñA¸È²[0ŻQ0ĈSÓÌÚk.’4„jÁ vé-˜c„Z9ÀxôÛ NClMĤ³t@UL„ `ŝ(Ù`µ”`iJ°R´Ç­ñ^›-è"£ıËp‘‰onèğ‹ĴG‹k0]I'RÑ:%Àĵ^VäÜ81X߂ü\,áÄP#‘+ğ\ ù `À0`}Ĥ°/˙Ô1`°C`0 Ĝ û˜™ŠİıùGŬuîœNĈ^8ġ£ËÈ:ù£žzĉħ-B'´lġáÔ£k°¨F‘ğ^èÇÓÉxáÙS/\FÉzêÜ£/,B'_Xĥúpˆêá5?ÙÍĞ…×hĊ.²Ï€á ĤШ*TT‰œ²Múò0 ĜċVÁ³Q…wSp|Ê ' š`<,°“ZYÀ’LyÍ ‹b$EÀRĴÇ 6ĈTóLĴ‘.ˆbŒ`` Ç, °€Ÿím÷şşĈ ^]ÀcŻıȄÑ`+÷Ìe0D–XĊf0ĈW0³ÁÎŻqÀ(*‚äÓ';ò&Êĉ÷ÔŞN%Cĵ—[`ŻŽ‹äŬĉŠ`##f]Àü#ŽŞ~Ċr9GĦÑ0jd¤´DÀŝ‘˙J2ŽŒ”×`9^GL$­³tš‹tòb–ñ‚&ÌÀ Ç`—³t@<×.ñ jÀÒÁˆ‹áü‘0 v9K¤Ò~Ñá`>_^,{ԀEi>Bğ91€aÀ.#È’ ùŠ;b°ϕœ`C”âŒr l„êbÈ Îe%†€ġg²›# –6$†€ġë€Í$6—˜ÑnSËñ‡şëäIŒ‡N}ĉ!]ġÈZ ÷äC‹gZĥúpˆjÍŻ2ŬÔ*â ·`ŭ ğH  †€­CÀbBšċ´SmÊü#{”™Âr•¤\<`u‚àt‹ħ^Û$RŒ$Ĝ,HŻqÀà ĝ p逌Ŝż Pz Ù]ĠZS SËĴlùâmÂÊêÖ ²ş€í‚ÏڊÜ ~³Ûİ5–X3fËĉk+˜Ó ep k°’ÏŠ– 3…FòfgRùïĵӗ!DÚħ‰¨3R²Xkƒ,mÉëıHŸS°ĜˆöĈmĊR#ƒX: gHĴ¤‹4LÉ5 X8QM‹ĉt{.2LċıH{İg‹â0ÑĊG™ċ´`µ°Îí:b2œ,Ġcs*ŜĞbépvÀÂá0½DÀ¸py%‹…‘âZLw逪×+h&ğ³#2H`ğZžbـá ˙ òKUàA¤Ĵ`JXΆ€]6`9ż¸ÈII€YÍê`2¨ĉĴcÀ0`KîE–@ldŻĉšbİYċ9°!²u¨FE>ÇÛAÌÍ51`°~ÜMQrBIGò%äbNFúâ-CݽùĠî:wN'Ġ—ÒËyġG§^íĦ“ŻöÔ3½şzuÙ:ùê0kµ–1ï1–W ‡…EfkşëÙîzì1ŒgŸ9ġĴnÖÉg{¨gĉ³Ïž{ôÙEèä³ËV1@=´–1Ïc‰]d1 †[ÀQhŠÂÀk4uÓüp²°FݟTB݊LX2`BCXYÀÂ:ÌYc²ƒ[:€6è.cîÔŒ×áŬX²×7ğĊ´5Á÷ŒOX²KĴĉ1˜‹+ XÁè^û€Ċ"˘M“pé€4ëµ²Q`0“>`E}ÀFtK,´t€ĉNŒîK,u²›sLİ,o1XÈàŒŠ1QÑèÏzċxûċŭ>éB€%Ġî€"‚>`Œ.`‹ÓŻĜŠuAÀ˘ğT1ĜVEVá2ù†{b-Ĥ·t@‰f´KĜĊ<9Àpżƒülğ8‘ &4€…Î Ö/I§3péA^:€hĉ  Öż ß:ŽvĈÑ &[rdĊH\ĀaÀÄAMvs Ö_ÀêQƒË[ñ /€—¨Ò¸[À°‹Ä€aÀ0`0 Ĝ:Œ2,§ž–È´§Rb"ŬX`ĵ?§£û£Ĵ?¨ XÂOġŞĜX)½`~ż?ĥDÀ8ż?ş’€ċŭ!‘ ­uÀš‚( \: KÀ›XäÉÁ#4a 6킓[lŠÍËÌi0s]Kġ&ğkfƒÁŻXĈhĦġ+6:b .ĜeÌEĉ †‘èÊV×o3k°²×]­AGäÛM™ödw$à$Ğġ] Œ8ŒžŠÏAVY§/ŠKÌd0”ğ·`ŜXĦ;`½îĤȘ Î1˜Ù\d ½TY4Ĵ+Ĝ‚Uà\·ĊZۀ…\J4§Ô“Ŭ-ÀÜB„)bÁ‡ÜeÄ(ڊ–¤ĞştÀ˘Á ß°D0Ŝ°F0Ñu‘İ ÓĞbİ`fĦ,]Yr – R+X-TX#1˜îÒœ×ÛÔŜMÑ$³Š‹ç†ĥ/0ä_ĦA~™‡KUżôA(wSD ĥLÀ²~?p‘£’–(r€äğŭb5à÷'EsÂÊù‰€-ħÉ/oç2M‘mr|=‹á8ì+N%8—ŻÍ–Šyħ˜)‰’ÈŠE†ğÜğ)hgì@Ŝ%ş´t@‚V+vóOşë™s:?ùÑCz9?yU? èÔOzêÙÇ~²zġ'ËĠİŸ ³Vë7ğ)ífj¸ë™îzìÑgôtò™ËÉZ ĵÏ,B'ŸYĥúpˆ /€]äşt‘} Ç`0 ì Ĵİ X³Ù°ĉ*ÖĀ-k逌fé€ÓGÀRç›ŬUçÛ0!›Ŭ%sŻov—,İò€yRİVó̕ŒİĈZŒŠŠb,‡KdŠ>[1o΁âFŜŸËúË,`ÍwŒ6\ŬëıtaèXÊ´à:ùeğaİ€ċħh}_ó N~FÇh¸t@ڇFò)W{é€:,’i:"šHğ\ÀÌQŻ3¸uZ° ÖŒì ˜˜³Ur‘eë’sÛVòn Q,jVôjÀt— £ıÎ >ĊEÚKċ ù½+ëˆé@RX¨µt ĥhÀtEgr¤hŒv½›BÌÁ€aÀ.0Ñï moˆŝ)Ù3í{3’v°€]&`PÚŠb6햋€-0o @–Ê-0ĵtÀğtÀÀ%µ`"^:·`ƒ ğH  †€­}À88ĞF +X$û^¤îÒb˘Ş X2@÷ĴĜÒÂߋ ,°L ĥâ€Qk°,\Kş\)ÀLRè XÊè,m²ô#z.³[úf·Ŭd – XhE—ïÇ%í#Á5k÷óY’ġ‰Îz8äó+Xܘèê"y‹Áì˜ÜhÑıt€½çÚÓ€–ŝC 5/8!~ĊsÌ£œgiÍĉhdJY[@ġ°[èËïÚ/è"Ĵàë´` żßOëşÈ`ϊù³şŽß_\1Àjŝ|„‰ƒ·ä‡°ŒÎz\Á³À,!`8È_AĜf(‘%É,,ÔĀaÀú ”@LÀ\@†ë+`bŞ$ÖࣚŻt_bH ĴĞÂ}ú-/ié€d\-êĉŸv×3çt2~úêC?½Œ, S?íİgÏŭt:ġÓeЇ [yÀ2Ċ>fök·tÀ£şKœÓ˙êŭıe-^:èÔÊÖ߁Vĵtv‘ Ç`0  †€-0ğ`´A½P0†ÌêĈg’½~³ğlYÄovG— XŬg°”W°j†q8UĴ½Ò›ŸzÀÂq]Àô–h¸ġ—(Z{~³›4,ĜƒZ"`9rċĞıàBùêï½Ż4`ÍşĴÌV6:¸%&ĝ5,emŠ’%éZ°Üp&$Ğ ˜ Ôd|ĝA'„Ĥ^ &èÇ`MAèUħ?x30A–ƒ šs| †~~³ıŞ€eÑc-†ƒü5äÀ(G$ìHaÀ0`,eħXœy lP.2ewrĜEbÀä'òC˜Ñ‘óKw×İ“:?¤›Ó+ è3÷Ôİ“/BŸyxÙê!¨“kYW‹ġ6ğët2š—kêf=ÚìĦ‡š=ġê3ÍEèĦĉ²Ġ‡C PKmÁ*²°‹Ä.r.’‰Ê '`ċ´Î/òzz‘żœĴ2Á;Â/B/òËV1@½òĈRöÎ[b‡0íê:XëE)r([0Ĵġ"†uE–óc­Gı‡0Éċġù|d9A:Ñ-µĵDxÜ>ŞÛ)úÜ] —Î…z<:¨h֞èáúÒG²ÌqUĦKż„gXkÌOçRŬ“]Ğ]ŭġµúü÷(eğ%ĤÀŜŬ.4—×ÉH”×ĴŸŽĴL’–bU‰ÇŝŠ•}9Ĵ½Ü*&“Iĥ= ‘ê’XIê$Ĥ³Ĵò(ÉÇe—œJŒšĤ¨X,"ŬèŬÙ,ÏħE–-ä í2/"ÀŞó+#ƒC›8L4pG‘…[&`¤ÁàWöϟ˙ĝŸ|ü=Wŭñ絀EH·ÇMD´€EIH k›ŸX&>„˘‰P4ŝ‘?ÏIİQ&ı Q„ê‡Ĉŭ-Àr%8ÁÉPAŒ3™t2J:Ëڇ°T ÄÉĴ€14ͨ+~üożóïżêï¸êójÀÂŜŻ•ŜĝÁ·|A5`a6‘‰@;ħôä†ëddÀRµĈċ+lğŬJ  ˜t KûeÀ’Ċ ŞtĈF˜X돲0İ€2é…ë0EÊİûçżŭÎ-ïyW\~ßğnĴ´‹yŠożŝúóÏ˙ÀmFyX)ÑiFğç'VèÖ5ÇY°ċĴÖ[Gdç&R•$Qƒw—òİ ‘×–`ŝÇ7Ñixáß˙ñg 7°|ĤŠaÀ– X%UŞûĝwŝö=”ä+=§V"żööÛo˙ĝùǟú;˘¨V&ï“WĦ7TÁžl+1şĉhn€€eeÀšòş²mÀb"¤“jûĉyhŽXa‹úÍ3ħŠ 0ù&K4v„0`ËnÁÊɊ°[’Ï/]VË;KŻżŝ:Àĉ§\Y0ÖQTŬ…˘*1Ŭr‘>ùˆ„Óá(`D„ñE7I†­4Ĵ@€%KR1NdĠ.9MĈ14.RLà²4iÁ€-°*×r‘żŝžüĊWnıê]ż’ç²iUŸw½ñ?˙ü_|àyO0§”ĝHlÖNôĤ;\dÄM%î³ûË}ĴÌ"§¨ìçßnÂO½/élVÍ ż‰pVċ"áŝc2ÀĈ7İq‘I‚NQÍÓV Ĝ²]$ێÁnüĝWrË-ññÓn£ÌÉ>İù˘ĥk'ŞZ°Vbğ“\dÔSxûġüĝ¤ż/€ù=.ċ µ€ù_[›µ×ßŭ`‡ Oĵí"a t”ƒ†äT"™Ż6bÂ/~ŝóo`À–ß‚‹­Ĵ|{nıÄĝyÖٙ`ċÀ} Ôzà‹Ÿ~ükŝ²X%ĜN,µ+”ĝĊ4‰’‹tŜ~ûġ§žzêöħ¸ĵKR ˜ñ‹ŸÇžSk żx&° 2 u‘Á4XĉıÈß˙êŸ~”Ï/0`}šìN•Û1Ĝïy˙{ŜUÉ9£Û0ıIğż›Ç Ŝ˙ÙîE20ñ‹_|üJ"ìEĈċ=Ġ‰•ûkdE˙O=ŝÔ}Ä`1›Ċžìp‘ŒĜêżĝùÏ~GLíËiôMĊúϙ°ĈEĤ@²â0ċ4.’ŝßŝܟĤÄ&äëg?€-°Ş*ƒ„½ĊĴ7è´Xœn+Ŭ£Ü÷=ġüS÷ıß÷żïkƒÄoDÏûŝ÷˙lƒÉ{ŞËy ÄôÛŻżŝhò˙–³?A~Ìï òMq£ XÒö öŬˆĈEÖ@ `6x€‹$J`ÉÀ‡úŸğ1–ĝîË_˙îÏ^{ Ö‡İ˘ĴfĴLçı¨ÙluĜMĤW{$?°;ìŝûŝGüÁöH~÷ôıß˙íßĝ‡üÚĝ_€-?˵ÇÁ"N)2y\vzވ.Ê'MÙ|DHŒĥhÀ$Ñżé#‚ŞD; Î@t֟ ż`%â[äë[7>ùĦ8hÂ6*ÊlÖ~ĝ ‹tH—”2Š­^äs°ûûÏ}î·cà(?üá?}ùw0`ˎÁxU –·ÙŒƒ$֔0wV9kÊâ–²´`B‰ZÀPb È¸a?ŝ’üçòÇ~çĈˆûĈŭLÚCŠÄ/_Žĥ\dôŻ[€Ŭ}VéEJ€0Ö½GkIDATŭŭçŝp€/ X?b°”:È/;Œ³#L:,Ġ@+k3ZÉvËä"ei4‰pÌf³ŞDBE˙Ŭ߅ïût0XZ.`5ċ €`éüÏ K|òÉ'˙IƒÚŻŝӓŸoğÈğŻ3:‹lıÈÚLĈOU\äw˙r‘żŭ[Ï=÷çžÄ€ġĊE²iu_$v·Ój÷ıî-hüŠ‹4QšÄŽ ì‘"’{ŝ}>"eò…ËMÒħ–Ú·ë7B}HRĥX.ġo|_ŝò—˙/•‹¤bš‡ì"ŜßŝÓÏ}î÷˙]ë0a Ĝòc°"§ıá0o²JrÚS%íıK.’JjçÖ=‘ħĝòt~YJİ”mßMÁ´•ċZ€•’iiÏdĥċ"‹í£=v˙ñŬ:Lĥ<À¸"R&okgĞċùé…D—Dĥkb|^b>Ïöù–éjiŝçR]áŜ].4•—3Ĝ\^“Á`À–˜EY•˜ŻĠĝLċjµZ%ÓħµŞ´è7.‚½Ùn Ħċşeµ5£dû>ß쐴`"Ö:R°C Íâ'¸RÖ`BUV†5ÀZ·ĤcÀ° ż0`XŒ²Úò0ĴAF[,–aZĈWÊ:,édg†5(YF îEb­9ÀêÊ k€yy0`XŒRÁ€a °Ĥ²ĉP †…ƒ|,  †…€aÀ°0`X0  †…€aÀ0ÀÊz x.kjÍuSħ ĞŽžLcÀ°0`X0  †…€aaÀ°0`0  †…€aÀ0`X0,  †…€aÀ°0`X0  †…€aÀ0`0,  †€aaÀ°0`0,  †€aaÀ0`0  †€aÀ°0`X0  †…€aaÀ°0`0 Ĝ:LhuĥĤjŜD'Ŝ\ÜŜMĦ½Í_oĴ/î…(AXDĠé늏‘aÂHÔêkŻ*MDUħˆ6S°)&’UPK;ŒF£‰H""ĝD>Ġ`€ " AĈOP<L·w›A™=ìZi–4HÜ´ÛhäħÒb1zäZċmF$ÚĵßìLĦäR Ìħó^È9áf~‡í`'ÖĠwˆ‚„—ÙZ3>’ó™Œ&‹Ġ NÜ\]Äŝ¸>·D ç0şóYŻÑèЁ&,8PzĊj²ÚĉÊFĤÜeÛD£żq…Öè%pLòevRk(ŝ"@“ùfĈe2FKħnĞ)ŒjU ÌĈ@C$`X’0I3Rr.££$òÀµ†aìUu›%™$žïĈj ´q=c0^Hٌ.PŠáJĴcħiħXˆÖ'Œq·ÊRA†%^Ä5%‹RévżürxşĊbIĞ%ĦñûBÔdN€Ía´¤(>ÓvlŬ ĦämeÏĦQĥ˜ƒ pÁ]÷jwÀ˘Ĉ–ĴJ?J¤í9:âf£•iĴ­ X Q–š!fòŞ*­µ™³™3Ú&Œ–˘(DŒFgıó Ez~½7AùÙ3=>~µeħ àG“]ƒżìzÌß̋ĵH9@N³K7Òv£%š&’!*k0ŸÑèPnjiĞ‘P¨ÔĊj6ġJ9h´h{†  é!ċĤ wȟ´F%²J…Ò¤ "Z ó `Î^%S¤,- ö6`püúÄÖb„ÑYç€ñ„ 0X˜yİ—ni}@MèěĦĉÚŒ…ŬÇVŻ­BàœR\™ŽXI'i…µÍX-`77hŠQŸÌQÙè)zZB…´ÚQ9p~›Ŭd4gAcf³Ċd5y!$͈єïQ0mñr‚<¤E:›jÀ JÓ‚^Âä_ïA~Ĉ˘FÔ¤p×SÂRù¸`˙1+–a_œ^CX ^-V†ÉICXğÉıŒÄçvWu:%~3UIé)ħqHŸ4!a1úk!£9Í yˆްSˆ^à2:{ûG[VÊXÁÉÈ'D­ÊÚ,q8„k´ĠXh½VvÊ|ÙÒÒ'ħ™vµĞ-GŽÁF-ħvh8Y í,„&ş*AcĴ.&ŒĈ8l•ò£#W•F5¤!ŠĠ"0HgŠÄ´;!–µ­iħèsbÍa4ĊD^,£”Tw÷àGrxœˆvt|ŻÜH$ ;a6úĝZƒYï€%MF;C%éDĞ/AÀ¤N,H/LoÀħ0 ½†£|&ıMàáKUäñ-A G¤€H(YLh,BLšMԂàˆK-Œ°J‰ ôy,Ò ˃‚b(‹ ·Ñ”FeMq]ĵâN£i˜:w÷ÊpIÂl´%WÀ8ĝş´Ä L ‘Aì`Jµ{›Ĥ5ÁV"‹¨):Œ.9î2Ë­ 3 È]¨=İqa³£$şP–s˜Bu8öEµğ@ Ċħµçݎ  ĤŞÔNzġĈ›£= K6eT>°APÖ }FyûJÌ)Ï,ÜŒ[c€ÍTç57ˆĴ jġ ÉŠĉrŞ.3h'ƒ¨•œĤhM\•ˆ°uÓ£W>–ÍèĞ!Àrĝ`/^‰Î-OYvkż€÷Œ#,Шño,€¨œTĵĉ•˜Ñlµ‘v€lÒÖnÁ@ħ”4Ë€:šÇH˘61ٛ(è´CŜÊQ“Uú`!ä …Ĥ żƒĵfdÏs"ĠŒl+`µ_—…ıì‚· şM 5)ğ‘äÑÛ6@ÑĦ ”™ċ~GŽ_ W `(HÈjRà'­QËQ‡ –5츗ÖBċŬ0 ì96üF+/Á'¤AÙLĜ²TœĈ˜2#ĊQœÓċáXĞ9›€@¤m&‚“ܢ„l3†äĞn8uMו\—(żAĤÎWäĦ°7ÜÁ;J3eğÑ>ı5zŬ´J^>8ŸQ&p˘È­l´š÷Ħì;jÈ!J£ñœÍHŠ%îm¨ŞÍhA¸€†*S!GFԒñ>t‰ĵÍhŽ‚N#ê0*t‹0òÊÊ])ShdÇĊs0ÏĵiŽé½ MBqùŠOq£1'6"ë<藲bÍoÍĴ{À„dĴTŞe\ÊH<0f—>}À 89xg+Pú1VğÑdt¤ QĞIc H$ïJIO{ĉhEjvÀĠÇ#ÏUVÂ"…F ,‹:h¨€ċa'20ƒVRĴ¨[hIˆ9¸áž×ĴçĴ’O°X"ë´XaÄaM!xul°ıäàğS^KĥıŝïĤ…‚K4äûíäx †ħÁ$À%G`-ÜP‘tş‚;ş{DñP‹6Ì~´\NEĠ{ \<ïtB—)€–Ĉ0Hƒ‹÷AâJpW ?|F3üœĠˆ–ÑoÖŬ‚Ĝv&ĉM˘S‡Ġ:1‘u;d&QM˜Ù!ġ#ŭ —_)÷ƒĠ“F# ]Ş'ĵıÄ$ùC!MOĴ‘,rka²H(—¸bÎo5(uâx7pyp°n€WŜ @Q'€w£%qÒ_—ÑÇıh”.]Ċg3Ñ|SĴœŽ`BڇށÜ"MRqpˆ*EÑċùwÖKĊ"ĤòĊbUl€mIˆE‚œ4àQ+ĤÂOıbn8ÌÁĠPµTe˘qċçI‹ÙlħĈrkꎊ×ùr˘$m—)l +>‘àԓ_E‡QžÌV>G|(íP­*;6G]\è³Ĥ;­ÖìĜċŠ,f4v“nÔòiN\—R_èKvÜY!ÖWâ3µŜk2tŽw—­F+^‘h,è]Ĉçh½F›Í&˘)p„Éo\™€eÌFkŠu˜üEÖwÀ`ËÎDA€›Ğ]™|Á1Ĝm&W'¸"îh…C5IñJ‹óŻRœıŜ#‘°Ù‰Dĝ+°z*/bÀҋlT…rMlÔÄ+YÍĠûx­˙aŠzSÄ1` †€aÀ°0`X0  †…€aÀ°0`X0,  †…€aÀ0`X0,  †€aaÀ0`0  †€aaÀ°0`0,  †€aaÀ°0`0  †…€aaÀ°0`X0  k•ö+"i VßY9 †ĠÀNV†5À*è `)g<îÌaÀ°mħX) Ö \dÌjÍa‰5¸ ŸÎâ  ÷"ħ0`0ĴÀ²ŒĴĜfĤħş*‘]3ê~ÙáÌ)) %,E™`j­(hu,i4 €ĊjòɔCdƒ’• e֊Ò! +ÑaĴÈ `YéYb1`K,‘jÀ<öÄp–-q\ĤÀĴĈUâĤXı )$ĝ–ĴäZŒSŞ0Ò°š°:Şùívğ#ˆĠUQfÍHuÖùn€aa H0Ĵ•,ĥ*U9z5Ŝ—ċ9&ş ï›ċıäjĵoŞĈ#Љş °Ġ€t!éÒ*ĵoVX…÷­À²Ğ<,µï‹€aÀ0`°eĉ'ÚW_TŸH2İ2bE틝’ .Eĝ—X%˘‡ ˆüÛîagĠŝtÇû.°(AkÓi•-+[,ĠN,-ç pÀH*îiŬz•uİò#•‘)wôN:ĈĉYw<ÀB6;¨[›‘ÊÖx<Íyâñö›ÓjT ġaSË,ŽûµçT—£ĠĥĤ=­DgĦǕcÀzĉÌs.Ĝtä½NofƒEè ÙċˆÏé͗vôIvg£`tO[îH}ÒNğż\mÚî/ĊBÊĈeœpÛ^D V²ËĠUĥÒ '½/bÜíŒÓŝ ȵsĥ°=Â;Y,’ö¤´? M°Ċ¸Ü,³ôI;aİäÜv‚]°àíŭv†KÙí!Ĝvf¸˜ŬÎP#ĵÇîcAJ³­°P” G3vŻ3ÍYvšK;ĵ Ĝ’ G‹Ž6`$çÊEĊH$çâ"2`Žbş‡ĵ“+ĊÀ>ËıÓÑÚĤÙXˆu‚ hŠR1;ğÀ8’$#\„ L¨½JdmmÀ˘`ÂÍ CrQ0GBÊĜrqžœ ì7Uü4ç§XÒ ^ë(‚G0–òpàN%Â9Y …b ù"<ÒûĊ,-À,錛³P°€òİl‰€qa 0’tAÀ@­G*A[^,Ì)€I`¸lĈ4ësÀގq ` rK 4b`;·H€Ÿ\¤*Ñ\$ÁI›ì ]`KÙl0Î^ñ[l&z)-˜ eµ@ÀŒ6‹W:˜Ùf†€eÀÀYGs^(%cıTÀÊÈEf]˜X9-ĵ° Ltg@ VÈœ\4\í,SZ"`€.Hʰ şHކDْ-À²Rĥ 0Wf“Z°œĥ`ı¸È x!hÁRjÁ Nµ`y•KAÉ9@—½ –.‡£°E#v’’$\d‘ŽËKEX‘$‚ZÀJ$A  ^èO“`;DŠ‹¤ ¸½Ä 0 ]$j’„.’Ë’$È% R,G‘Àl$ÜoHG ÒT‰ƒ}³ –ğÁ; $F_ĈXpà` "Ä9ŭ  È4Hñ À ]$#).c! J,FĜE.r˜"—>÷éD8RÎHGW&^à ŽxYêE²È„Ĉxġĉ’ñBŠË€íJ<z‘ YC‰p{Q`iWXDŬÏx\ Hˆx1/umĊx‘ËI¸Ü‹”Lè"a^[Ìqñœ½ÂâıĊ S¤†yx@xñyˆƒ´O#”vÈNjh·RœíU}2n Ï<ì"—6J™ a(ĜޏrĞ6Ž0DZŠ { €L‘fÜhu3 lÉòp('ĵŠĈ€ICİ$@Žˆ*ŜH~„DmU´u2:ÊİcI2; ÀXR ÒÚĦW ĜÒ[1áİ˘UŒ_ °Êjĵ/Ĵ¸ ïۀċWá}ë°ô*ĵoMÌ ‘t}5Tċ2üêĵoŽ[÷ċı|yuŜ—-Îûr%Ğa?Ċaa Hm¸ÓĈċ€5ŬyGT V˙U˘ÜiїùµŭVVßeó˘ĝ˙Ċmo~Snn5IENDB`‚gamera-3.3.3/doc/src/images/unclassified_color.png0000644000076500000000000000012410714675724021132 0ustar chriswheel‰PNG  IHDRÚıŻğPLTE˙˙˙§ÄÈ IDATxÚc` -`ĜNۋIENDB`‚gamera-3.3.3/doc/src/index.txt0000644000076500000000000001053411364254133015153 0ustar chriswheel======================== Gamera 3.x documentation ======================== :Editors: Michael Droettboom, Christoph Dalitz Introduction ============ This documentation consists of some HOW TO documentation and some reference documentation. In addition, there are some more formal published papers and a tutorial available from the `Gamera website`__. .. __: http://gamera.informatik.hsnr.de/ Overview ======== - `Gentle overview of Gamera`__: For a less-detailed idea of what Gamera is and does. .. __: overview.html How To ====== How to *use* Gamera: - `Building and installing Gamera`__: The basics to get you started with running Gamera. .. __: install.html - `Training tutorial`__: A step-by-step tutorial about how to build training sets. .. __: training_tutorial.html - `Getting started writing Gamera scripts`__: How to start writing a Gamera-based application. .. __: script.html - `The Gamera GUI`__: How to use the integrated GUI. Additionally, this describes how to train images. .. __: gui.html - `matplotlib support`__: Using Gamera support for the popular matplotlib_ plotting library. .. __: matplotlib_support.html .. _matplotlib: http://matplotlib.sourceforge.net/ - `Classifier API`__: How to use image classifiers from Python. .. __: classify.html How to *extend* Gamera: - `Writing Gamera plugins`__: Learn how to write new image methods. .. __: writing_plugins.html - `Specifying arguments for plugin generation and dialog boxes`__ .. __: args.html - `The Gamera C++ Image API`__: How to work with Gamera's images from C++. .. __: image_api.html - `Custom data types in plugins`__: How to pass, access and return custom data types between C++ and Python. .. __: plugins_custom_types.html - `Writing Gamera toolkits`__: How to package your code in a redistributable package that is easier to build and lets you keep your own code separate from the Gamera core. .. __: writing_toolkits.html - `Unit testing`__: How to write and run unit-tests with Gamera. .. __: unit_testing.html Reference ========= - `Plugins`__: Documentation of all the included plugins. .. __: plugins.html - `Directory heirarchy`__: Where the files are. .. __: directory_heirarchy.html - `Image types`__: The different types of images available in Gamera .. __: image_types.html + `RGBPixel`__: properties of color values in Gamera .. __: gamera.core.RGBPixel.html - `Dimension types`__: The various classes to manage bounding boxes and geometry. .. __: dimension_types.html - `ImageData`__: Manages the underlying image data viewed by ``Image`` objects. .. __: gamera.core.ImageData.html - `ImageInfo objects`__: Used to examine on-disk image files without loading them .. __: gamera.core.ImageInfo.html - `XML format`__: The XML files that Gamera uses to store training data. .. __: xml_format.html Optional libraries that can be useful for some tasks: - `Graph objects`__: A simple library for dealing with graph structures. .. __: graph.html - `KdTree objects`__: A simple library for speeding up two (or higher) dimensional search operations. .. __: kdtree.html Migration from Gamera 2.x to Gamera 3.x ======================================= - `Major changes`__ from Gamera 2.x to Gamera 3.x .. __: major_changes_3x.html - `Migration guide`__: Describes how to migrate existing Gamera scripts to Gamera 3.x .. __: migration_guide.html Acknowledgements ================ Many thanks to Teal Anderson for finding numerous typos among the hideous jargon of these documents. Some of the material presented here is based on documentation or papers by Karl MacMillan and Ichiro Fujinaga. Gamera was initially funded through the National Science Foundation's Digital Library Initiative 2 (Award \#9817430), an Institute of Museum and Library Services National Leadership Grant, and support from the Lester S. Levy Estate. These documents were produced using reStructuredText_. .. _reStructuredText: http://docutils.sourceforge.net/rst.html The documentation was written by Michael Droettboom and Christoph Dalitz. Permission is granted to copy, distribute and/or modify this documentation under the terms of the `Creative Commons Attribution Share-Alike License (CC-BY-SA) v3.0`__. In addition, permission is granted to use and/or modify the code snippets from the documentation without restrictions. .. __: http://creativecommons.org/licenses/by-sa/3.0/ gamera-3.3.3/doc/src/install.txt0000644000076500000000000002724711222436501015515 0ustar chriswheel============================== Building and installing Gamera ============================== Microsoft Windows ================= Installing from source ---------------------- Currently, Gamera can be built using the MingW32/GNU toolset. The "officially supported" configuration, (i.e. the one that the Gamera developers use) is to use the MingW32 compiler to build for the official Python.org Python. This can be done in one of the following two ways: - with the `standalone Mingw32`__ toolchain (easiest solution) .. __: #mingw32 - or with the MingW32 compiler installed `inside of Cygwin`__ .. __: #cygwin If you have success with other compilers and configurations, please consider contributing your experiences to this documentation. Prerequisites ````````````` - Python 2.4.x or later with Python 2.5.x recommended (only the distribution from python.org has been tested) - wxPython 2.6.x or later (wxPython 2.8.x or later recommended for full functionality) .. note:: The Python 2.6 binary from python.org has been built with a version of MS Visual Studio that causes problems when extensions are compiled with Mingw32. The reason is an errenous file ``libmsvcr90.a`` coming with Mingw32. To fix it, you can recreate the file from the DLL ``msvcr90.dll`` that comes with Python 2.6 with pexports__ and *dlltool* (the latter is part of Mingw32):: pexports msvcr90.dll > msvcr90.def dlltool --input-def msvcr90.def --dllname msvcr90.dll --output-lib libmsvcr90.a -k With Python 2.5, these changes are not necessary. .. __: http://www.emmestech.com/software/pexports-0.43/download_pexports.html .. _mingw32: Standalone Mingw32 `````````````````` Install the Mingw32 port of gcc from http://mingw.org/. Make sure that you do not only install *gcc-core*, but also *g++* and *make*. Add the *bin* subdirectory of your Mingw32 installation to the environment variable ``PATH``. Assuming you have installed Python to ``C:\Python25``, you can then compile gamera at a DOS command prompt from the root directory of the gamera source code with:: C:\Python25\python setup.py build --compiler=mingw32 bdist_wininst This will create a Windows installer, including uninstallation support, in the *dist* subdirectory. It can be started with a double click in the Explorer, or from the DOS command prompt with:: start dist\gamera-X.X.X-win32.exe .. _cygwin: Mingw32 inside Cygwin ````````````````````` Use the installer from http://www.cygwin.com/ to install Cygwin, including the ``g++-mingw32`` compiler and the ``MingW32`` libraries. If you plan to track development of Gamera, you will probably also want to install ``subversion``. The important thing to note here is that we are using Cygwin's Mingw32 compiler to build for the standard (non-Cygwin) Python from python.org. After a clean install of Cygwin, typing 'python' will start up Cygwin's version of Python, not the one from python.org. Therefore, you will want to add the standard Python to your Cygwin PATH using the command (assuming you installed Python in standard location):: export PATH=/cygdrive/c/Python25/:$PATH Ensure you are using the correct Python by typing:: which python The result should be ``/cygdrive/c/Python25/python.exe``, not ``/usr/bin/python``. Beware that the file ``/usr/bin/gcc`` installed by Cygwin actually is *not* the compiler executable, but a symbolic link. Symbolic links are not supported by MS Windows, but are a Cygwin-only feature. This means that the Python Distutils system cannot execute ``/usr/bin/gcc`` and the build command will fail. To fix this, replace the symbolic link with the actual compiler executable:: cp /usr/bin/gcc-3 /usr/bin/gcc cp /usr/bin/g++-3 /usr/bin/g++ From here on, you can proceed as for the standalone Mingw32 toolchain, i.e.:: python setup.py build --compiler=mingw32 bdist_wininst dist/gamera-X.X.X-win32.exe Linux (and other \*nix) ======================= Prerequisites ------------- - Python 2.3 and later are supported, though Python 2.4 or later is recommended. You will need to have the headers (but not the complete source) to build Gamera from source code. Most Linux distributions include these as a separate package (eg. ``python-dev`` or ``python-devel``). - wxPython 2.4.x or later (wxPython 2.8.x or later recommended for full functionality). - ``gcc`` version 3.1 or later. - libtiff 3.5.x or later - libpng 1.2.x or later If any of these prerequisites is installed in a non standard directory, you can use the environment variables ``CFLAGS`` and ``LDFLAGS`` to pass its locations to the build script, e.g.:: CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib export CFLAGS LDFLAGS Standard Build and Install -------------------------- Gamera is built using the Python-standard Distutils system. Open a terminal and type:: python setup.py build sudo python setup.py install Installing without root priviledges ----------------------------------- .. _without_root: If you do not have root access to your machine, you can make a local installation of Gamera. A quick-and-easy way to do this is to use the ``virtual_python.py`` script available here__, and then follow the standard installation instructions (without using sudo):: python setup.py build python setup.py install .. __: http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python Alternatively, you can set up a local installation by hand. Make a local python module directory somewhere that you have write priviledges (such as your home directory):: mkdir ~/python From the Gamera build directory, install Gamera into that directory:: python setup.py install --home=~/python Set up an environment variables so Python can find stuff there (you may want to add this to your ~/.bash_profile file):: export PYTHONPATH=~/python/lib/python Add the local Python scripts directory to your path:: export PATH=~/python/bin:$PATH Now you should be able to run the ``gamera_gui`` script from the command line. Running ------- Run the ``gamera_gui`` script, which should have installed to ``/usr/local/bin``. This file can also be copied anywhere (such as the Desktop) and double-clicked to run Gamera. .. note:: Running the script from the root of the source tree will not work, since it will not be able to find the compiled version of Gamera. Mac OS-X ======== Earlier versions of Gamera ran on OS-X by using X11 as an emulation of a standard Unix environment. The current SVN version of Gamera now uses Cocoa, and feels much more like a standard Macintosh application. Please follow the instructions for *either* X11 or Cocoa install below. Native (Cocoa) build -------------------- Prerequisites ````````````` Gamera installs out of the box on Mac OS-X 10.4 (Tiger) and 10.5 (Leopard). The only prerequisite is to install XCode, which is shipped with the OS-X installation DVD, but is not installed by default. It should be noted that OS-X 10.4 comes with the unstable branch 2.5 of wxPython. So far we have not yet encountered any problems with this version, but if you have any problems, please consider to install wxPython 2.6 instead. This is *not* possible from the binary installers from http://www.wxpython.org/, because there is none for Python 2.3, and the other Python versions require a particular prerelease of Xcode to build extensions, that is no longer available. So if you decide to upgrade wxPython on OS-X 10.4, you must do it from the source release of wxPython 2.6. Standard Build and Install `````````````````````````` Gamera is built using the Python-standard Distutils system. To build Gamera, open a terminal and type:: python setup.py build and then to install (you'll need to have admin priviledges):: sudo pythonw setup.py install On OS-X 10.4, you must do the installation with ``pythonw`` rather than with ``python``, because ``gamera_gui`` is a GUI application. On OS-X 10.5 this distinction is no longer necessary, but using ``pythonw`` also works. On OS-X 10.5, the script ``gamera_gui`` is installed to ``/usr/local/bin``, which is also in the default search PATH for programs. Prior to OS-X 10.5, the script ``gamera_gui`` was installed to ``/System/Library/Frameworks/Python.framework/Versions/2.?/bin``, which is not in the default search PATH. You can either add this directory to your search PATH, or install the scripts to ``/usr/bin`` with:: sudo pythonw setup.py install_scripts -d /usr/bin .. note:: In its default configuraton, the Python distutils on MacOS X build fat binaries. You can speedup the compilation time by a factor two by removing the unnecessary architecture from your distutils build settings. The critical part are the architecture options "-arch ppc" and "-arch i386". When you do not want to redistribute the compiled binaries, you can simply remove one of the architectures. Depending on the OSX/Python version, this is done in ``/Library/Framework/Python.framework/Versions/2.?/lib/python2.?/config/Makefile``, or in ``/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/distutils/sysconfig.py`` Installing without root priviledges ``````````````````````````````````` The instructions for `installing without root (administrator) priviledges`__ can also be used on Mac OS-X. __ without_root_ Running ``````` Start the Terminal application and run the ``gamera_gui`` script. .. note:: Running the script from the root of the source tree will not work, since it will not be able to find the compiled version of Gamera. X11 build --------- Please note that this build is no longer maintained by the Gamera developers. So use it only when the Cocoa build is not possible for some reason (e.g. on a legacy OS-X 10.3 system). Prerequisites ````````````` - Mac OS-X 10.3 (Panther) or presumably later - Python 2.3 (including the version included). - wxPython-GTK 2.4.x or later Since there is no official build of the Gtk+/X11 version for Mac OS-X, I have made one available in the Gamera SourceForge Files section. - XCode. The version of XCode that shipped on the Tiger installation DVD will not work if you plan to use a newer version of Python downloaded from python.org. XCode 2.4.1, may be downloaded from http://developer.apple.com/tools/xcode . - X11. This is available on the Tiger installation DVD. You should also use Software Update to update X11 to the latest version. Standard Build and Install `````````````````````````` Download and install the unoffical wxPython-Gtk-X11 distribution from the Gamera Files section on SourceForge. Alternatively, you can install fink and then build the package wxPython-Py23, which is currently in the unstable branch, (and its dependencies) from source. You will then need to use the fink version of Python (not the one that Apple provides) to carry out the instructions below. Gamera is built using the Python-standard Distutils system. To build Gamera, open a X11 terminal and type:: python setup.py build and then to install (you'll need to have admin priviledges):: sudo python setup.py install The scripts can be installed by:: sudo python setup.py install_scripts -d /usr/bin .. note:: The ``-d /usr/bin/`` installs the scripts in a reasonable place on the PATH. If you do not specify it, the scripts are by default installed to ``/System/Library/Frameworks/Python.framework/Versions/2.3/bin``. Installing without root priviledges ``````````````````````````````````` The instructions for `installing without root (administrator) priviledges`__ can also be used on Mac OS-X. __ without_root_ Running ``````` Start an X11 terminal and run the ``gamera_gui`` script. .. note:: Running the script from the root of the source tree will not work, since it will not be able to find the compiled version of Gamera. gamera-3.3.3/doc/src/kdtree.txt0000644000076500000000000002352211426745041015325 0ustar chriswheel====================== Gamera kd-tree library ====================== Introduction ------------ A *kd-tree* is multidimensional generalization of a binary search tree. It can be used efficiently for range queries and nearest neighbor searches, provided the dimension is not to high. In document analysis problems, the dimension is typically two, so that kd-trees can be a powerful utility for layout analysis problems. For a detailed description of the present kd-tree implementation with examples for use cases, see C. Dalitz: `Kd-Trees for Document Layout Analysis.`__ In C. Dalitz (Ed.): "Document Image Analysis with the Gamera Framework." Schriftenreihe des Fachbereichs Elektrotechnik und Informatik, Hochschule Niederrhein, vol. 8, pp. 39-52, Shaker Verlag (2009) .. __: http://lionel.kr.hsnr.de/~dalitz/data/publications/sr09-kdtree-layout.pdf Additional background information on kd-trees can be found in the following literature: - for an introduction to kd-trees and basic properties, see [deBerg2000]_ - more algorithms for kd-trees can be found in the original article [Bentley1975]_ - neither of the above two references covers nearest neighbor searches in kd-trees; these are coverd in [Friedman1977]_ Examples -------- Here is an example for looking up the three nearest neighbors to a given point from a set of sample points: .. code:: Python from gamera.kdtree import * points = [(1,4), (2,4), (1,5), (3,6), (8,9), (2,7), (4,4), (5,5), (4,6), (8,3)] nodes = [KdNode(p) for p in points] tree = KdTree(nodes) # neighbors to a sample point not from the set point = [5,6] k = 3 knn = tree.k_nearest_neighbors(point, k) print "%i neighbors of (%i,%i):" % (k,point[0], point[1]), for node in knn: print "(%i,%i)" % (node.point[0], node.point[1]), print "" # final newline # neighbors to a sample point from the set # we must query k+1 neighbors, because one of them is # the sample point (the first entry in the returned list) point = [5,5] k = 3 knn = tree.k_nearest_neighbors(point, k+1) print "%i neighbors of (%i,%i):" % (k,point[0], point[1]), for node in knn[1:]: print "(%i,%i)" % (node.point[0], node.point[1]), print "" # final newline The property *KdNode.data* can store an arbitrary Python object associated with the point. The following example represents each connected component by its middle point and stores the actual CC with the point in the node: .. code:: Python ccs = image.cc_analysis() nodes = [KdNode([cc.center.x,cc.center.y], cc) for cc in ccs] It is also possible to search for only those neighbors that fulfil a certain predicate. To this end, you must define a function or callable class that takes a KdNode as input and returns ``True`` when it fulfils the search predicate. The following example only returns nearest neighbors below the search point: .. code:: Python # predicate definition as callable class class predicate(object): def __init__(self, point): self.point = point def __call__(self, node): return (point[1] > node.point[1]) # find the three nearest neighbors below point = (5,6) knn = tree.k_nearest_neighbors(point, 3, predicate(point)) Beware however, that a search predicate can have the effect that less than k neighbors are returned, because too few nodes fulfil the predicate. In such a case, the runtime is O(n) instead of O(log(n)). In other words, a poorly chosen search predicate can have a considerable negative impact on the runtime. In some cases, modifying the distance metric (method *set_distance*) can be an alternative to a search predicate [Dalitz09]_. The Kd-Tree Python API ---------------------- ``KdNode`` objects '''''''''''''''''' Each ``KdNode`` has two properties: *point* The geometric location of the node as a sequence of coordinate numbers. The coordinate numbers can be floats or ints. This is an immutable property, because changing the geometric location of nodes belonging to an already built kd-tree obviously breaks subsequent search operations. *data* An arbitrary Python object connected to the location *point*. .. docstring:: gamera.kdtree KdNode ``KdTree`` objects '''''''''''''''''' Each kd-tree is represented by instances of the ``KdTree`` class. Even though there are general kd-tree algorithms to add and remove nodes dynamically (see [Bentley1975]_), the present implementation does not support alteration of a once built tree. This has the consequence that tree nodes must be passed to the contructor of ``KdTree``. A ``KdTree`` has the following (read only) properties: *dimension* The dimension of the kd-tree. This is automatically determined by the constructor. .. docstring:: gamera.kdtree KdTree .. docstring:: gamera.kdtree KdTree set_distance .. docstring:: gamera.kdtree KdTree k_nearest_neighbors The Kd-Tree C++ API ------------------- The module ``gamera.kdtree`` is only a thin Python wrapper around a C++ class ``KdTree``. This can also be used directly in C++ plugins. Compilation and linkage ''''''''''''''''''''''' The header file *kdtree.hpp* declares the necessary structures in the namespace ``Gamera::Kdtree``. It is installed with the other gamera header files, and can thus be included with .. code:: CPP #include "geostructs/kdtree.hpp" using namespace Gamera::Kdtree; The tricky part is getting your plugin module to be linked with the actual kdtree implementation. This is achieved by adding the source file ``kdtree.cpp`` to the ``cpp_sources`` property in the plugin Python interface. In the gamera core code, the following works: .. code:: Python class ExampleModule(PluginModule): category = "MyPlugins" cpp_headers = ["myplugins.hpp"] cpp_sources = ["src/geostructs/kdtree.cpp"] functions = [myplugin1, myplugin2] module = ExampleModule() In a toolkit, this will not work, because the path names in the ``cpp_sources`` property are relative to the location of the *setup.py* script. To allow for the use of the KdTree C++ class in toolkits, the source file *kdtree.cpp* is installed together with Gamera. You can thus specify this file in ``cpp_sources`` as follows: .. code:: Python class ExampleModule(PluginModule): # ... import os, gamera gamera_root = os.path.dirname(gamera.__file__) cpp_sources = [os.path.join(gamera_root, "src/geostructs/kdtree.cpp")] # ... Querying the Gamera installation directory through the *__file__* property of the gamera module is safer than using *get_python_lib()* from ``distutils.sysconfig``, because it also works when Gamera is not installed into the standard location for python extensions. Usage ''''' For normal use of the kdtree, you will need the classes ``CoordPoint`` (a typedef for ``vector``), ``KdNode``, ``KdNodeVector``, and ``KdTree``. Beside the property ``point``, a ``KdNode`` can also store an arbitrary pointer as ``data``. See the header file *kdtree.hpp* for details. Here is a usage example for a nearest neighbor search: .. code:: CPP // set points for building the tree KdNodeVector nodes; double points[][2] = { {1,4}, {2,4}, {1,5}, {3,6}, {8,9}, {2,7}, {4,4}, {5,5}, {4,6}, {8,3}, {-20,-20} // array terminator }; size_t i; for (i=0; points[i][0]>=-1.0; i++) { CoordPoint p; p.push_back(points[i][0]); p.push_back(points[i][1]); nodes.push_back(KdNode(p)); } // build the tree KdTree tree(&nodes); // find the three nearest neighbors to (5,6) KdNodeVector neighbors; CoordPoint point(2); point[0] = 5; point[1] = 6; tree.k_nearest_neighbors(point, 3, &neighbors); If you want to restrict the returned neighbors to only those fulfilling a specific search predicate, you can define your search predicate as a callable class (aka *functor*, i.e. a class with the call operator ``operator()`` overwritten [Stroustrup1997]_) derived from ``KdNodePredicate`` as in the following example: .. code:: CPP // only search for nodes on the right hand side of search point struct MyPredicate : public KdNodePredicate { CoordPoint point(2); MyPredicate(CoordPoint& p) { point = p; } bool operator()(const KdNode& kn) const { return point[0] < kn.point[0]; } }; The call of the class only takes a single argument, the ``KdNode``, and returns true when this node is an admissable search result. If this criterion depends on some information from the actual search point (like its *x*-component in the exampel above), this information must be passed to the class constructor and stored within the class. An instance of this class can then be passed as the third, optional argument to ``KdTree.k_nearest_neighbors``: .. code:: CPP KdNodeVector neighbors; CoordPoint point(2); point[0] = 5; point[1] = 6; MyPredicate predicate(point); tree.k_nearest_neighbors(point, 3, &neighbors, &predicate); References ---------- .. [deBerg2000] M. de Berg, M. van Kreveld, M. Overmars, O. Schwarzkopf: *Computational Geometry.* Second edition, Springer (2000) .. [Bentley1975] J.L. Bentley: *Multidimensional Binary Search Trees Used for Associative Searching.* Communications of the ACM 18, pp. 509-517 (1975) .. [Friedman1977] J.H. Friedman, J.L. Bentley, R.A. Finkel: *An Algorithm for Finding Best Matches in Logarithmic Expected Time.* ACM Transcations on Mathematical Software 3, pp. 209-226 (1977) .. [Stroustrup1997] Stroustrup, B. 1997. *The C++ Programming Language: Third Edition.* Reading, MA: Addison-Wesley. .. [Dalitz09] C. Dalitz: `Kd-Trees for Document Layout Analysis.`__ In C. Dalitz (Ed.): "Document Image Analysis with the Gamera Framework." Schriftenreihe des Fachbereichs Elektrotechnik und Informatik, Hochschule Niederrhein, vol. 8, pp. 39-52, Shaker Verlag (2009) .. __: http://lionel.kr.hsnr.de/~dalitz/data/publications/sr09-kdtree-layout.pdf gamera-3.3.3/doc/src/list.txt0000644000076500000000000000420611755375756015041 0ustar chriswheel List ==== ``all_subsets`` --------------- object **all_subsets** (object *list*, int *size*) :Returns: object :Category: List :Defined in: listutilities.py :Author: Michael Droettboom and Karl MacMillan Returns all subsets of size *size* of the given list. ``median`` ---------- object **median** (object *list*, ``bool`` *inlist* = False) :Returns: object :Category: List :Defined in: listutilities.py :Author: Christoph Dalitz Compute the median from a list of values in linear time. This implementation works both with builtin numeric types like *int* or *float*, and with user defined types. For user defined type, you must implement the "less than" operator (`__lt__`), as in the following example: .. code:: Python class P: x = 0; y = 0 def __init__(self, x, y): self.x = x; self.y = y def __lt__(self, other): return (self.x < other.x) def __eq__(self, other): return (self.x == other.x) a = [P(0,0), P(1,1), P(2,0)] p = median(a) When the parameter *inlist* is ``True``, the median is always a list entry, even for lists of even size. Otherwise, the median is for an even size list of *int* or *float* values the mean between the two middle values. So if you need the median for a pivot element, set *inlist* to ``True``. For user defined types, the returned median is always a list entry, because arithmetic computations do not make sense in this case. .. note:: This is *not* the median image filter that replaces each pixel value with the median of its neighborhood. For this purpose, see the rank__ plugin. .. __: morphology.html#rank ``permute_list`` ---------------- int **permute_list** (object *list*) :Returns: int :Category: List :Defined in: listutilities.py :Author: Michael Droettboom and Karl MacMillan Permutes the given list (in place) one step. Returns ``True`` if there are more permutations to go. Returns ``False`` if permutations are done. Example usage:: >>>from gamera.plugins import listutilities >>>a = [1,2,3] >>>while listutilities.permute_list(a): ... print a ... [2, 1, 3] [1, 3, 2] [3, 1, 2] [2, 3, 1] [3, 2, 1] gamera-3.3.3/doc/src/major_changes_3x.txt0000644000076500000000000000427610714675724017277 0ustar chriswheel=========================================== Major changes from Gamera 2.x to Gamera 3.x =========================================== Deprecated functions ==================== Some functions have been deprecated. They will continue to work for now, but will be removed at some point in the future. For more information, see the `migration guide`__. .. __: migration_guide.html Plugin system ============= Some more types were added to the plugin system, meaning they can be conveniently passed between Python and C++ plugins. - **Point** - **FloatPoint** - **Dim** Graphical user interface ======================== - **wxPython 2.6.x support**: Gamera now runs with the wxPython 2.6.x as well as the wxPython 2.4.x series. Note that native Cocoa support on OSX is not currently supported, since as of the time of this writing, wxPython is broken__. .. __: http://sourceforge.net/tracker/index.php?func=detail&aid=1194622&group_id=9863&atid=109863 wxPython 2.6.x is a lot closer to the native look and feel of the various platforms. You may notice that the placement of some buttons in some dialog boxes has changed and other minor look and feel details. Most of these are not due to any changes in Gamera itself. - **New information pane in the shell** (replacing the History pane) This includes three tabs, based on PyCrust: - **Docstring display**: When a function or property is typed in the shell, its docstring is displayed in the bottom pane. This is less annoying than the popup that would occasionally fill the entire screen with a long docstring. If wxPython 2.6 and docutils is installed, the docstring is formatted as reStructuredText with bold and italics etc. - **Namespace**: Browse all of the objects in the shell. - **History**: An improved command history. - **Docstrings in dialog boxes** Many dialog boxes now include docstrings where appropriate. General sanity fixes ==================== - There were a few places where memory leaks were happening only when an exception was raised. Many of these exceptions are now being caught and the leaked objects are deleted. - Docstrings on C++ plugins work correctly. gamera-3.3.3/doc/src/matplotlib_support.txt0000644000076500000000000001165310714675724020025 0ustar chriswheel================== matplotlib support ================== Gamera includes optional support for plotting figures using the matplotlib_ library. If matplotlib is not installed on your machine, Gamera will continue to work normally, but plotting support will not be available. .. _matplotlib: http://matplotlib.sourceforge.net The matplotlib library provides high-quality plots, including line, scatter, bar, and polar plots, and export of those plots to formats such as PostScript, SVG, PNG or the printer. The list of features is way too long to go into here. This document only describes the bridge between the Gamera GUI and matplotlib. For more information, see the matplotlib_ documentation. The connection between Gamera and matplotlib is intentionally minimal, so that it is easy to take advantage of all of matplotlib's functionality and to make it less dependant on any one specific version of matplotlib. If you feel that particular graphs of particular kinds of data in Gamera should be made more convenient, please contact that Gamera authors. Obtaining matplotlib -------------------- Download and install matplotlib_ following the instructions provided. There are no special steps to make matplotlib work with Gamera. If it is installed in the default location, Gamera will automatically detect and use it. Interactive use --------------- Sequences of numbers will appear in the Gamera icon display as one of the following icons: +----------------------------------------+----------------------------------------+ | |IntVector| | A sequence of ints. | +----------------------------------------+----------------------------------------+ | |FloatVector| | A sequence of floats. | +----------------------------------------+----------------------------------------+ | |ComplexVector| | A sequence of complex numbers. | +----------------------------------------+----------------------------------------+ .. |IntVector| image:: images/int_vector.png .. |FloatVector| image:: images/float_vector.png .. |ComplexVector| image:: images/complex_vector.png For example, loading an image into the variable ``image0`` and typing the following into the Gamera console, will produce a [Z] icon in the icon display: .. code:: Python >>> projection_cols0 = image0.projection_cols() Double-clicking a vector icon will plot it using matplotlib in a new plot window. You will be prompted to provide a variable for the figure. (This figure instance can be used to modify the plot). .. image:: images/matplotlib_example1.png Dragging a vector icon into an existing plot will add it to the plot using a line of a different color. .. image:: images/matplotlib_example2.png The toolbar buttons in the matplotlib window can be used to modify and then save or print the view. The behavior is the same as for the standard matplotlib viewing windows. Properties of the figure can be accessed through the figure object returned. For instance, to add a title: .. code:: Python >>> figure0.axes[0].set_title("Projections") Using matplotlib directly ------------------------- To move beyond simple line plots, matplotlib can be used directly as described in the matplotlib docs, using the object-oriented or ``pylab`` interfaces. The following example uses the ``pylab`` interface and is taken directly from the matplotlib example ``plot_demo.py``. This code can either be entered directly into the Gamera console, or imported from a file. This code assumes that either ``Numeric`` or ``numarray`` is installed. .. code:: Python from pylab import * # radar green, solid grid lines rc('grid', color='#316931', linewidth=1, linestyle='-') rc('tick', labelsize=15) # force square figure and square axes looks better for polar, IMO figure(figsize=(8,8)) ax = axes([0.1, 0.1, 0.8, 0.8], polar=True, axisbg='#d5de9c') r = arange(0,1,0.001) theta = 2*2*pi*r polar(theta, r, color='#ee8d18', lw=3) title("And there was much rejoicing!", fontsize=20) savefig('polar_demo') show() .. image:: images/matplotlib_example4.png Using Gamera images as a 2D data source --------------------------------------- matplotlib can be used to plot 2D images, and it is fairly easy to use Gamera images as a source. Simply convert the Gamera image to a Numeric or numarray array, and then pass that array to matplotlib's ``imshow`` function. This functionality is fairly slow, so do not try this on large images. For example, if you have Numeric Python installed: .. code:: Python >>> arr = image.to_numeric() Or, if you have numarray installed: .. code:: Python >>> arr = image.to_numarray() Then pass that array to ``imshow``: .. code:: Python >>> from pylab import * >>> imshow(arr) # Show image >>> hot() # Choose hot colormap >>> colorbar() # Show colorbar >>> show() # update .. image:: images/matplotlib_example5.png gamera-3.3.3/doc/src/migration_guide.txt0000644000076500000000000022457710714675724017243 0ustar chriswheel======================================= Migrating from Gamera 2.x to Gamera 3.x ======================================= The migration from Gamera 2.x to Gamera 3.x is intended to be as painless as possible. In future releases of Gamera, backward compatibility will need to be broken in order to fix some low-level design flaws in Gamera. Gamera 3.x is the first step in that process. Certain functions signatures that existed in 2.x have been deprecated in 3.x, but they continue to work in order to maintain backward compatibility with existing scripts. As of Gamera 3.x, these deprecated calls all have easy alternatives, and they should be replaced with the new recommended forms as soon as possible to ensure compatibility with future versions of Gamera. Note, however, that some rarely-used deprecated functions do not have direct alternatives in Gamera 2.x, so this migration process may break your scripts' compatibility with Gamera 2.x. However, if appropriate care is taken, such as switching based on the Gamera version, it should still be possible to write code that is compatible with both Gamera 2.x and Gamera 3.x. This document is divided into the following sections: - `Reasons for deprecations`_ describes the different categories of deprecated functions, and what changes are required in end-user scripts. - `How to migrate existing code`_ presents some tips and techniques for making migration easier. - `Migration tools`_ describes the provided tools for finding and replacing deprecated calls in end-user code. This tools provide only a semi-automated process. - `C++ deprecations reference`_ and `Python deprecations reference`_ list all deprecated functions, with their reason for deprecation and a suggested alternative. Reasons for deprecations ======================== (x, y) coordinate consistency ----------------------------- In Gamera 2.x, some functions received coordinates in the order (y, x), (or (rows, cols)), while others took coordinates in (x, y) order. This self-inconsistency and departure from the majority of image processing systems often resulted in confusion and subtle errors. The new recommended way to call these functions is to pass in Point, FloatPoint, Size or Dim arguments as required, instead of two integers. This solution allows the old function signatures to be maintained for backward compatibility, while allowing migration to a style that consistently uses (x, y) ordering everywhere. For example, ``image.get(r, c)`` becomes ``image.get(Point(c, r))``. 2-element sequences in place of Point type '''''''''''''''''''''''''''''''''''''''''' For convenience in Python code, 2-element sequences can be used wherever Point or FloatPoint is expected. Therefore, ``image.get((x, y))`` is equivalent to ``image.get(Point(x, y))``. Dimensions type ''''''''''''''' Additionally, the ``Dimensions`` class, whose constructor is ``Dimensions(nrows, ncols)``, has been deprecated because it is inconsistent with the new requirement of "(x, y) everywhere". Since it would be impossible to change the order of the constructor's arguments without breaking backward imcompatibility, a new type has been introduced, ``Dim``, which is identical to Dimensions in all respects except its constructor is ``Dim(ncols, nrows)``. All uses of the ``Dimensions`` type are deprecated and should be migrated to use ``Dim`` instead. FloatPoint type ''''''''''''''' A new FloatPoint type has been added to hold coordinates using floating point numbers. The standard Gamera ``Point`` stores coordinates as unsigned (positive) integers, and doesn't have any arithmetic operators. For this reason, ``FloatPoint`` is highly recommended for any analyses that require precision and flexibility. ``Point`` is kept around for backward compatibility, and because it is a more natural way to refer to physical pixels, as opposed to logical coordinates. There are, however, implicit conversions (in Python only) between the two types, so a ``FloatPoint`` can be used in place of ``Point`` where it makes sense. Care should be taken to ensure that negative values are never used to reference image pixels. (Range checking is performed when accessing from Python, but not when accessing from C++.) Additionally, the standard arithmetic operators are available on ``FloatPoint`` objects (+ - * / abs). Functions should be parameterized by arguments, not by name ----------------------------------------------------------- There are certain groups of plugin functions that perform essentially the same functionality. Take for example:: black_horizontal_run_histogram() black_vertical_run_histogram() white_horizontal_run_histogram() white_vertical_run_histogram() These four functions compute a run length histogram, parameterized by the color and direction of the runs. Maintaining four separate functions for a single logical task has a number of disadvantages: - Even if the code is abstracted such that the core of the algorithm is in a single function, the documentation still needs to be updated in multiple places. - The generated documentation becomes longer and therefore harder to browse through, and contains a lot of redundant information or excessive hyperlinking. - Autocompletion in the Gamera shell becomes less useful. - Alphabetization of the functions doesn't necessarily reveal their membership as part of the same family of functionality. Therefore, in Gamera 3.x, these sorts of functions have been merged into a single function. For example, the four functions above are now the single function:: run_histogram(color, direction) How to migrate existing code ============================ There are two distinct techniques for finding deprecated functions: one for C++ code and one for Python code. C++ code -------- On the C++ side, all deprecated function calls will be caught at compile time. Simply recompiling your C++ code will provide compiler warnings to this effect. The compiler warnings produced by gcc can be fairly cryptic. The gamera_deprecation_filter_ (described below) will filter these warning messages and produce detailed human-readable suggestions for updating your deprecated calls. .. note:: This technique only works with gcc version 3.1 and greater. Python code ----------- Finding the deprecated calls in Python code is somewhat more difficult, since the exact function calls being made can not be determined until runtime. When a deprecated function call is made, a deprecation warning is printed to stderr. This message provides the name of the deprecated function, the reason it was deprecated, and a suggested alternative. The only way to find all deprecated calls in your code this is to ensure that all of your code is run. This is sometimes difficult to do, though a code coverage tool such as Garth Rees' `Statement coverage for Python`__ may help. .. __: http://www.garethrees.org/2001/12/04/python-coverage/ A manual search through your code for deprecated functions may in some cases be more efficient. A master list of all deprecated Python functions in Gamera is presented in the `Python deprecations reference`_. Migration tools =============== There are a number of scripts in the ``migration_tools`` directory that make the process of migrating code from Gamera 2.x to 3.x easier. - gamera_deprecation_filter_: Helps display the deprecated calls in your C++ code. - replace_get_set_: Replaces C++ calls to get and set in the old form to the new form. gamera_deprecation_filter ------------------------- The ``gamera_deprecation_filter`` tool is useful for correcting calls to deprecated Gamera functions from you C++ code. This tool only works with ``gcc``, and only on non-MS Windows platforms (for some unknown reason. The output from ``gcc`` about deprecated functions is helpful, but is somewhat limited. For example:: include/dimensions.hpp:314: warning: `__comp_ctor' is deprecated (declared at include/dimensions.hpp:216) Here ``__comp_ctor`` refers to the constructor of the Dimensions class. Not only is this cryptic, but it doesn't specify which of the overloaded signatures it is referring to (except by line numbers). It also doesn't explain *why* the function call was deprecated or suggest a reasonable alternative. This filter replaces these cryptic warnings with more human-readable ones by extracting and displaying the comment associated with the deprecated function. For example, the above warning becomes:: include/dimensions.hpp:314: warning: deprecated call return Dimensions(nrows(), ncols()); Dimensions(nrows, ncols) is deprecated. Reason: (x, y) coordinate consistency. Use Dim(ncols, nrows) instead. This script can be used as a filter or on a given filename. Be sure to send ``stderr`` to ``gamera_deprecation_filter``. Usage as a filter:: $ python setup.py build 2>&1 | ./migration_tools/gamera_deprecation_filter or offline:: $ python setup.py build &> log $ ./gamera_deprecation_filter log replace_get_set --------------- This script searches through C++ source files and corrects all uses of get and set in the deprecated Gamera 2.x style to the new Gamera 3.x style. For example:: get(r, c) will change to:: get(Point(c, r)) Note that this script uses regular expressions and is pretty naive about its understanding of C++, and will replace any method .get or .set (or ->get and ->set), not just those on Gamera Image objects, so it is recommended to check the results with a visual diffing tool. Usage on files:: $ ./replace_get_set source.hpp > source.hpp.new or as a filter:: $ cat source.hpp | ./replace_get_set > source.hpp.new C++ deprecations reference ========================== This is an alphabetical list of the deprecated C++ functions. +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Deprecated function |Notes | +================================================================================+================================================================================+ |black_run_end(T& begin, const T end) is deprecated. [2_] |Use run_end(runs::Black(), begin, end) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |black_run_histogram(T begin, const T end, Vec& hist) is |Use run_histogram(runs::Black(), begin, end, hist) instead. | |deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ConnectedComponent(const self& other, const Point& upper_left, const |Use ConnectedComponent(other, Point(offset_x, offset_y), Dim(ncols, | |Dimensions& dim) is deprecated. [1_] |nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ConnectedComponent(const self& other, size_t offset_y, size_t |Use ConnectedComponent(other, Point(offset_x, offset_y), Dim(ncols, | |offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ConnectedComponent(T& image_data, value_type label, const Point& |Use ConnectedComponent(image_data, label, Point(offset_x, offset_y), | |upper_left, const Dimensions& dim) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ConnectedComponent(T& image_data, value_type label, size_t offset_y, |Use ConnectedComponent(image_data, label, Point(offset_x, offset_y), | |size_t offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ConnectedComponent::get(size_t row, size_t col) is deprecated. [1_] |Use get(Point(col, row)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ConnectedComponent::set(size_t row, size_t col, value_type value) is |Use set(Point(col, row), value) instead. | |deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |corelation_sum(const T& a, const U& b, size_t yo, size_t xo, |Use corelation_sum(a, b, Point(xo, yo), progress_bar) instead. | |ProgressBar progress_bar = ProgressBar()) is deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |corelation_sum_squares(const T& a, const U& b, size_t yo, size_t xo, |Use corelation_sum_squares(a, b, Point(xo, yo), progress_bar) instead. | |ProgressBar progress_bar = ProgressBar()) is deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |corelation_weighted(const T& a, const U& b, size_t yo, size_t xo, |Use corelation_weighted(a, b, Point(xo, yo), bb, bw, wb, ww, | |double bb, double bw, double wb, double ww, ProgressBar progress_bar = |progress_bar) instead. | |ProgressBar()) is deprecated [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |create_ImageDataObject(int nrows, int ncols, int page_offset_y, int |Use create_ImageDataObject(Dim(nrows, ncols), Point(page_offset_x, | |page_offset_x, int pixel_type, int storage_format) is deprecated. [1_] |page_offset_y), pixel_type, storage_format) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Dimensions(nrows, ncols) is deprecated. [1_] |Use Dim(ncols, nrows) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Dimensions(nrows, ncols) is deprecated. [1_] |Use Dim(ncols, nrows) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_bezier(T& image, double start_y, double start_x, double c1_y, |Use draw_bezier(image, FloatPoint(start_x, start_y), FloatPoint(c1_x, | |double c1_x, double c2_y, double c2_x, double end_y, double end_x, |c1_y), FloatPoint(c2_x, c2_y), FloatPoint(end_x, end_y), value, | |typename T::value_type value, double accuracy = 0.1) is deprecated. |accuracy) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_filled_rect(T& image, double y1, double x1, double y2, double x2, |Use draw_filled_rect(image, FloatPoint(x1, y1), FloatPoint(x2, y2), | |typename T::value_type value) is deprecated. [1_] |value) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_hollow_rect(T& image, double y1, double x1, double y2, double x2, |Use draw_hollow_rect(image, FloatPoint(x1, y1), FloatPoint(x2, y2), | |typename T::value_type value) is deprecated. [1_] |value) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_line(T& image, double y1, double x1, double y2, double x2, |Use draw_line(image, FloatPoint(x1, y1), FloatPoint(x2, y2), value) | |typename T::value_type value) is deprecated. [1_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_marker(T& image, double& y1, double& x1, size_t size, size_t |Use draw_marker(image, FloatPoint(x1, y1), size, style, value) | |style, typename T::value_type value) is deprecated. [1_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_black_run(Iter i, const Iter end, const int |Use filter_run(i, end, max_length, functor, runs::Black()) instead. | |max_length, const Functor& functor) is deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_narrow_black_runs(T& image, size_t max_width) is deprecated. |Use filter_narrow_runs(image, max_width, runs::Black()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_narrow_runs(T& image, size_t max_width) is deprecated. [2_] |Use filter_narrow_runs(image, max_width, runs::Black()) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_narrow_white_runs(T& image, size_t max_width) is deprecated. |Use filter_narrow_runs(image, max_width, runs::White()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_short_black_runs(T& image, size_t max_width) is deprecated. |Use filter_short_runs(image, max_width, runs::Black()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_short_runs(T& image, size_t max_width) is deprecated. [2_] |Use filter_short_runs(image, max_width, runs::Black()) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_short_white_runs(T& image, size_t max_width) is deprecated. |Use filter_short_runs(image, max_width, runs::White()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_tall_black_runs(T& image, size_t min_width) is deprecated. |Use filter_tall_runs(image, min_width, runs::Black()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_tall_runs(T& image, size_t min_width) is deprecated. [2_] |Use filter_tall_runs(image, min_width, runs::Black()) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_tall_white_runs(T& image, size_t min_width) is deprecated. |Use filter_tall_runs(image, min_width, runs::White()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_white_run(Iter i, const Iter end, const int |Use filter_run(i, end, max_length, functor, runs::White()) instead. | |max_length, const Functor& functor) is deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_wide_black_runs(T& image, size_t min_width) is deprecated. |Use filter_wide_runs(image, min_width, runs::Black()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_wide_runs(T& image, size_t min_width) is deprecated. [2_] |Use filter_wide_runs(image, min_width, runs::Black()) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_wide_white_runs(T& image, size_t min_width) is deprecated. |Use filter_wide_runs(image, min_width, runs::White()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |flood_fill(T& image, size_t y, size_t x, const typename T::value_type& |Use flood_fill(image, Point(x, y), color) instead. | |color) is deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Image(const Point& upper_left, const Dimensions& dim) is deprecated. |Use Image(Point(origin_x, origin_y), Dim(ncols, nrows)) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Image(size_t origin_y = 0, size_t origin_x = 0, size_t nrows = 1, |Use Image(Point(origin_x, origin_y), Dim(ncols, nrows)) instead. | |size_t ncols = 1) is deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |image_filter_long_black_run(Iter i, const Iter end, const int |Use image_filter_long_run(i, end, min_length, runs::Black()) instead. | |min_length) is deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |image_filter_long_run(Iter i, const Iter end, const int |Use image_filter_long_run(i, end, min_length, runs::Black()) instead. | |min_length) is deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |image_filter_long_white_run(Iter i, const Iter end, const int |Use image_filter_long_run(i, end, min_length, runs::White()) instead. | |min_length) is deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |image_filter_short_black_run(Iter i, const Iter end, const int |Use image_filter_short_run(i, end, max_length, runs::Black()) instead. | |max_length) is deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |image_filter_short_run(Iter i, const Iter end, const int |Use image_filter_short_run(i, end, max_length, runs::Black()) instead. | |max_length) is deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |image_filter_short_white_run(Iter i, const Iter end, const int |Use image_filter_short_run(i, end, max_length, runs::White()) instead. | |max_length) is deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageBase(const Point& upper_left, const Dimensions& dim) is |Use ImageBase(Point(origin_x, origin_y), Dim(ncols, nrows)) instead. | |deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageBase(size_t origin_y = 0, size_t origin_x = 0, size_t nrows = 1, |Use ImageBase(Point(origin_x, origin_y), Dim(ncols, nrows)) instead. | |size_t ncols = 1) is deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageData(const Size& size, size_t page_offset_y = 0, size_t |Use ImageData(Size(width, height), Point(page_offset_x, page_offset_y) | |page_offset_x = 0) is deprecated. [1_] |= (0, 0)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageData(Dimensions& dim, size_t page_offset_y = 0, size_t |Use ImageData(Dim(ncols, nrows), Point(page_offset_x, page_offset_y)) | |page_offset_x = 0) is deprecated. [1_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageData(size_t nrows, size_t ncols, size_t page_offset_y, size_t |Use ImageData(Dim(ncols, nrows), Point(page_offset_x, page_offset_y) = | |page_offset_x) is deprecated. [1_] |(0, 0)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageDataBase(const Size& size, size_t page_offset_y = 0, size_t |Use ImageDataBase(Size(width, height), Point(page_offset_x, | |page_offset_x = 0) is deprecated. [1_] |page_offset_y) = (0, 0)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageDataBase(Dimensions& dim, size_t page_offset_y = 0, size_t |Use ImageDataBase(Dim(ncols, nrows), Point(page_offset_x, | |page_offset_x = 0) is deprecated. [1_] |page_offset_y) = (0, 0)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageDataBase(size_t nrows = 1, size_t ncols = 1, size_t page_offset_y |Use ImageDataBase(Dim(ncols, nrows), Point(page_offset_x, | |= 0, size_t page_offset_x = 0) is deprecated. [1_] |page_offset_y) = (0, 0)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageFactory::new_view(const ComplexImageView& view, |Use ImageFactory::new_view(view, Point(ul_x, ul_y), | |size_t ul_y, size_t ul_x, size_t nrows, size_t ncols) is deprecated. |Dim(ncols, nrows)) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageFactory::new_view(const RGBImageView& view, size_t |Use ImageFactory::new_view(view, Point(ul_x, ul_y), | |ul_y, size_t ul_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageFactory::new_view(const T& view, size_t ul_y, size_t ul_x, |Use ImageFactory::new_view(view, Point(ul_x, ul_y), Dim(ncols, | |size_t nrows, size_t ncols) is deprecated. [1_] |nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageView(const self& other, const Point& upper_left, const |Use ImageView(other, Point(offset_x, offset_y), Dim(ncols, nrows), | |Dimensions& dim, bool do_range_check = true) is deprecated. [1_] |do_range_check) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageView(const self& other, size_t offset_y, size_t offset_x, |Use ImageView(other, Point(offset_x, offset_y), Dim(ncols, nrows), | |size_t nrows, size_t ncols, bool do_range_check = true) is deprecated. |do_range_check) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageView(T& image_data, const Point& upper_left, const Dimensions& |Use ImageView(image_data, Point(offset_x, offset_y), Dim(ncols, | |dim, bool do_range_check = true) is deprecated. [1_] |nrows), do_range_check) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageView(T& image_data, size_t offset_y, size_t offset_x, size_t |Use ImageView(image_data, Point(offset_x, offset_y), Dim(ncols, | |nrows, size_t ncols, bool do_range_check = true) is deprecated. [1_] |nrows), do_range_check) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageView::get(size_t row, size_t col) is deprecated. [1_] |Use ImageView::get(Point(col, row)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageView::set(size_t row, size_t col, value_type value) is |Use ImageView::get(Point(col, row)) instead. | |deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |iterate_black_horizontal_runs(T& image) is deprecated. [2_] |Use iterate_runs(image, runs::Black(), runs::Horizontal()) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |iterate_black_vertical_runs(T& image) is deprecated. [2_] |Use iterate_runs(image, runs::Black(), runs::Vertical()) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |iterate_white_horizontal_runs(T& image) is deprecated. [2_] |Use iterate_runs(image, runs::White(), runs::Horizontal()) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |iterate_white_vertical_runs(T& image) is deprecated. [2_] |Use iterate_runs(image, runs::White(), runs::Vertical()) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |max_black_run(T& begin, const T end) is deprecated. [2_] |Use max_run(runs::Black(), begin, end) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_horizontal_run(const T& image) is deprecated. |Use most_frequent_run(image, runs::Black(), runs::Horizontal()) | |[2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_horizontal_runs(const T& image) is deprecated. |Use most_frequent_runs(image, runs::Black(), runs::Horizontal()) | |[2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_horizontal_runs(const T& image, long n) is |Use most_frequent_runs(image, n, runs::Black(), runs::Horizontal()) | |deprecated. [2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_vertical_run(const T& image) is deprecated. |Use most_frequent_run(image, runs::Black(), runs::Vertical()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_vertical_runs(const T& image) is deprecated. |Use most_frequent_runs(image, runs::Black(), runs::Vertical()) | |[2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_vertical_runs(const T& image, long n) is |Use most_frequent_runs(image, n, runs::Black(), runs::Vertical()) | |deprecated. [2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_horizontal_run(const T& image) is deprecated. |Use most_frequent_run(image, runs::White(), runs::Horizontal()) | |[2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_horizontal_runs(const T& image) is deprecated. |Use most_frequent_runs(image, runs::White(), runs::Horizontal()) | |[2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_horizontal_runs(const T& image, long n) is |Use most_frequent_runs(image, n, runs::White(), runs::Horizontal()) | |deprecated. [2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_vertical_run(const T& image) is deprecated. |Use most_frequent_run(image, runs::White(), runs::Vertical()) instead. | |[2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_vertical_runs(const T& image, long n) is |Use most_frequent_runs(image, n, runs::White(), runs::Vertical()) | |deprecated. [2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_vertical_runs(const T& image) is deprecated. |Use most_frequent_runs(image, runs::White(), runs::Vertical()) | |[2_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect(const Point& upper_left, const Dimensions& dim) is deprecated. |Use Rect(Point(origin_x, origin_y), Dim(ncols, nrows)) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect::dimensions() is deprecated. [1_] |Use Rect::dim() instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect::dimensions(const Dimensions& dim) is deprecated. [1_] |Use Rect::dim(Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect::dimensions(coord_t nrows, coord_t ncols) is deprecated. [1_] |Use Rect::dim(Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect::rect_set(const Point& upper_left, const Dimensions& dim) is |Use Rect::rect_set(Point(origin_x, origin_y), Dim(ncols, nrows)) | |deprecated. [1_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect::rect_set(coord_t origin_y, coord_t origin_x, coord_t nrows, |Use Rect::rect_set(Point(origin_x, origin_y), Dim(ncols, nrows)) | |coord_t ncols) is deprecated. [1_] |instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |RegionTemplate(const Point& ul, const Dimensions& dim) is deprecated. |Use RegionTemplate(Point(x, y), Dim(ncols, nrows) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |RegionTemplate(size_t origin_y = 0, size_t origin_x = 0, size_t nrows |Use RegionTemplate(Point(origin_x, origin_y), Dim(ncols, nrows)) | |= 1, size_t ncols = 1) is deprecated. [1_] |instead | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |resize(T& image, int nrows, int ncols, int resize_quality) [1_] |Use resize(image, Dim(ncols, nrows), resize_quality) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |RleImageData(const Size& size, size_t page_offset_y = 0, size_t |Use RleImageData(Size(width, height), Point(page_offset_x, | |page_offset_x = 0) is deprecated. [1_] |page_offset_y) = (0, 0)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |RleImageData(const Size& size, size_t page_offset_y = 0, size_t |Use RleImageData(Size(width, height), Point(page_offset_x, | |page_offset_x = 0) is deprecated. [1_] |page_offset_y) = (0, 0)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |RleImageData(size_t nrows = 1, size_t ncols = 1, size_t page_offset_y |Use RleImageData(Dim(ncols, nrows), Point(page_offset_x, | |= 0, size_t page_offset_x = 0) is deprecated. [1_] |page_offset_y) = (0, 0)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |StaticImage(const Dimensions& dim) is deprecated. [1_] |Use StaticImage(Dim(cols, rows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |StaticImage(size_t rows = 1, size_t cols = 1) is deprecated. [1_] |Use StaticImage(Dim(cols, rows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |TypeIdImageFactory::create(size_t offset_y, size_t |Use TypeIdImageFactory::create(Point(ul_x, ul_y), | |offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |TypeIdImageFactory::create(size_t offset_y, size_t |Use TypeIdImageFactory::create(Point(ul_x, ul_y), | |offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |TypeIdImageFactory::create(size_t offset_y, size_t |Use TypeIdImageFactory::create(Point(ul_x, ul_y), | |offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |TypeIdImageFactory::create(size_t offset_y, size_t |Use TypeIdImageFactory::create(Point(ul_x, ul_y), | |offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |TypeIdImageFactory::create(size_t offset_y, size_t |Use TypeIdImageFactory::create(Point(ul_x, ul_y), | |offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |TypeIdImageFactory::create(size_t offset_y, size_t |Use TypeIdImageFactory::create(Point(ul_x, ul_y), | |offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |TypeIdImageFactory::create(size_t offset_y, size_t |Use TypeIdImageFactory::create(Point(ul_x, ul_y), | |offset_x, size_t nrows, size_t ncols) is deprecated. [1_] |Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |white_run_end(T& begin, const T end) is deprecated. [2_] |Use run_end(runs::White(), begin, end) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |white_run_histogram(T begin, const T end, Vec& hist) is |Use run_histogram(runs::White(), begin, end, hist) instead. | |deprecated. [2_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ .. _1: #x-y-coordinate-consistency .. _2: #functions-should-be-parameterized-by-arguments-not-by-name Python deprecations reference ============================= This is an alphabetical list of the deprecated Python functions. +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Deprecated function |Notes | +================================================================================+================================================================================+ |black_horizontal_run_histogram() is deprecated. |Use run_histogram('black', 'horizontal') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |black_vertical_run_histogram() is deprecated. |Use run_histogram('black', 'vertical') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Cc(image, label, offset_y, offset_x, nrows, ncols) is deprecated. [1_] |Use Cc(image, label, (offset_x, offset_y), Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Cc(image, label, Point offset, Dimensions dimensions) is deprecated. |Use Cc(image, label, (offset_x, offset_y), Dim(ncols, nrows)) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |convolve_xy now takes a different argument order. [1_] |Change the order of the first two arguments to (kernel_x, kernel_y), | | |rather than the old way (kernel_y, kernel_x). | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |corelation_sum(template, y, x) is deprecated. [1_] |Use corelation_sum(template, (x, y)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |corelation_sum_squares(template, y, x) is deprecated. [1_] |Use corelation_sum_squares(template, (x, y)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |corelation_weighted(template, y, x, bb, bw, wb, ww) is deprecated. |Use corelation_weighted(template, (x, y), bb, bw, wb, ww) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Dimensions(nrows, ncols) is deprecated. [1_] |Use Dim(ncols, nrows) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_bezier(start_y, start_x, c1_y, c1_x, c2_y, c2_x, end_y, end_x, |Use draw_bezier((start_x, start_y), (c1_x, c1_y), (c2_x, c2_y), | |value, accuracy) is deprecated. [1_] |(end_x, end_y), value, accuracy) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_filled_rect(y1, x1, y2, x2, value) is deprecated. [1_] |Use draw_filled_rect((x1, y1), (x2, y2), value) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_hollow_rect(y1, x1, y2, x2, value) is deprecated. [1_] |Use draw_hollow_rect((x1, y1), (x2, y2), value) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_line(y1, x1, y2, x2, value) is deprecated. [1_] |Use draw_line((x1, y1), (x2, y2), value) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |draw_marker(y1, x1, size, style, value) is deprecated. [1_] |Use draw_marker((x1, y1), size, style, value) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_narrow_black_runs(Int *length*) is deprecated. |Use filter_narrow_runs(length, 'black') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_narrow_white_runs(Int *length*) is deprecated. |Use filter_narrow_runs(length, 'white') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_short_black_runs(Int *length*) is deprecated. |Use filter_short_runs(length, 'black') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_short_white_runs(Int *length*) is deprecated. |Use filter_short_runs(length, 'white') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_tall_black_runs(Int *length*) is deprecated. |Use filter_tall_runs(length, 'black') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_tall_white_runs(Int *length*) is deprecated. |Use filter_tall_runs(length, 'white') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_wide_black_runs(Int *length*) is deprecated. |Use filter_wide_runs(length, 'black') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |filter_wide_white_runs(Int *length*) is deprecated. |Use filter_wide_runs(length, 'white') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |flood_fill(y1, x1, color) is deprecated. [1_] |Use flood_fill((x1, y1), color) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |get(y, x) is deprecated. [1_] |Use get((x, y)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Image(offset_y, offset_x, nrows, ncols, pixel_type, storage_format) is |Use Image((offset_x, offset_y), Dim(ncols, nrows), pixel_type, | |deprecated. [1_] |storage_format) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Image(Point point, Dimensions dimensions, pixel_type, storage_format) |Use Image((offset_x, offset_y), Dim(ncols, nrows), pixel_type, | |is deprecated. [1_] |storage_format) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageData(nrows, ncols, page_offset_y, page_offset_x, pixel_type, |Use ImageData(Dim(ncols, nrows), (page_offset_x, page_offset_y), | |storage_format) is deprecated. [1_] |pixel_type, storage_format) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageData.dimensions(nrows, ncols) is deprecated. [1_] |Use ImageData.dimensions(Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |ImageDisplay.highlight_rectangle(y, x, h, w, color, text = '') is |Use highlight_rectangle(Rect r, color, text) instead. | |deprecated. [1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |iterate_black_horizontal_runs() is deprecated. |Use iterate_runs('black', 'horizontal') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |iterate_black_vertical_runs() is deprecated. |Use iterate_runs('black', 'vertical') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |iterate_white_horizontal_runs() is deprecated. |Use iterate_runs('white', 'horizontal') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |iterate_white_vertical_runs() is deprecated. |Use iterate_runs('white', 'vertical') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_horizontal_run() is deprecated. |Use most_frequent_run('black', 'horizontal') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_horizontal_runs(Int n = -1) is deprecated. |Use most_frequent_runs(n, 'black', 'horizontal') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_vertical_run() is deprecated. |Use most_frequent_run('black', 'vertical') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_black_vertical_runs(Int n = -1) is deprecated. |Use most_frequent_runs(n, 'black', 'vertical') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_horizontal_run() is deprecated. |Use most_frequent_run('white', 'horizontal') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_horizontal_runs(Int n = -1) is deprecated. |Use most_frequent_runs(n, 'white', 'horizontal') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_vertical_run() is deprecated. |Use most_frequent_run('white', 'vertical') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |most_frequent_white_vertical_runs(Int n = -1) is deprecated. |Use most_frequent_runs(n, 'white', 'vertical') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect(offset_y, offset_x, nrows, ncols) is deprecated. [1_] |Use Rect((offset_x, offset_y), Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect(Point offset, Dimensions dimensions) is deprecated. [1_] |Use Rect((offset_x, offset_y), Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect.dimensions property is deprecated. [1_] |Use Rect.dim instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Rect.dimensions property is deprecated. [1_] |Use Rect.dim instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Region(offset_y, offset_x, nrows, ncols) is deprecated. [1_] |Use Region((offset_x, offset_y), Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |Region(Point offset, Dimensions dimensions) is deprecated. [1_] |Use Region((offset_x, offset_y), Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |resize(nrows, ncols, interp_type) is deprecated. [1_] |Use resize(Dim(ncols, nrows), interp_type) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |set(y, x, value) is deprecated. [1_] |Use set((x, y), value) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |SubImage(image, offset_y, offset_x, nrows, ncols) is deprecated. [1_] |Use SubImage(image, (offset_x, offset_y), Dim(ncols, nrows)) instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |SubImage(image, Point offset, Dimensions dimensions) is deprecated. |Use Image(image, (offset_x, offset_y), Dim(ncols, nrows)) instead. | |[1_] | | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |white_horizontal_run_histogram() is deprecated. |Use run_histogram('white', 'horizontal') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ |white_vertical_run_histogram() is deprecated. |Use run_histogram('white', 'vertical') instead. | +--------------------------------------------------------------------------------+--------------------------------------------------------------------------------+ .. _1: #x-y-coordinate-consistency .. _2: #functions-should-be-parameterized-by-arguments-not-by-name gamera-3.3.3/doc/src/morphology.txt0000644000076500000000000001732111755375756016267 0ustar chriswheel Morphology ========== ``despeckle`` ------------- **despeckle** (int(1, 100) *cc_size*) :Operates on: ``Image`` [OneBit] :Category: Morphology :Defined in: morphology.py :Author: Michael Droettboom and Karl MacMillan Removes connected components that are smaller than the given size. *size* The maximum number of pixels in each connected component that will be removed. This approach to finding connected components uses a pseudo-recursive descent, which gets around the hard limit of ~64k connected components per page in ``cc_analysis``. Unfortunately, this approach is much slower as the connected components get large, so *size* should be kept relatively small. *size* == 1 is a special case and runs much faster, since it does not require recursion. ---------- **Example 1:** despeckle(15) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/despeckle_plugin_00.png :height: 99 :width: 69 ``dilate`` ---------- ``Image`` [OneBit|GreyScale|Float] **dilate** () :Operates on: ``Image`` [OneBit|GreyScale|Float] :Returns: ``Image`` [OneBit|GreyScale|Float] :Category: Morphology :Defined in: morphology.py :Author: Michael Droettboom and Karl MacMillan Morpholgically dilates the image with a 3x3 square structuring element. The returned image is of the same size as the input image, which means that border pixels are not dilated beyond the image dimensions. If you also want the border pixels to be dilated, apply pad_image_ to the input image beforehand. .. _pad_image: utility.html#pad-image ---------- **Example 1:** dilate() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/dilate_plugin_00.png :height: 67 :width: 96 **Example 2:** dilate() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/dilate_plugin_01.png :height: 99 :width: 69 ``dilate_with_structure`` ------------------------- ``Image`` [OneBit] **dilate_with_structure** (``Image`` [OneBit] *structuring_element*, ``Point`` *origin*, ``bool`` *only_border* = False) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Morphology :Defined in: morphology.py :Author: Christoph Dalitz Performs a binary morphological dilation with the given structuring element. Note that it is necessary to specify which point in the structuring element shall be treated as origin. This allows for arbitrary structuring elements. Examples: .. code:: Python # same as image.dilate() structure = Image(Point(0,0), Point(2,2), ONEBIT) structure.fill(1) image = image.dilate_with_structure(structure, Point(1,1)) # same as image.erode_dilate(3,0,0) structure = Image(Point(0,0), Point(6,6), ONEBIT) structure.fill(1) image = image.dilate_with_structure(structure, Point(3,3)) The implementation is straightforward and can be slow for large structuring elements. If you know that your structuring element is connected and its origin is black, you can set *only_border* to ``True``, because in this case only the border pixels in the image need to be considered which can speed up the dilation for some images (though not for all). The returned image is of the same size as the input image, which means that border pixels are not dilated beyond the image dimensions. If you also want the border pixels to be dilated, apply pad_image_ to the input image beforehand. .. _pad_image: utility.html#pad-image References: A proof that only the contour pixels need to be dilated for connected structuring elements containing their origin is given by Luc Vincent in *Morphological Transformations of Binary Images with Arbitrary Structuring Elements*, Signal Processing, Vol. 22, No. 1, pp. 3-23, January 1991 (see theorem 2.13) ``distance_transform`` ---------------------- ``Image`` [Float] **distance_transform** (``Choice`` [chessboard|manhattan|euclidean] *norm*) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [Float] :Category: Morphology :Defined in: morphology.py :Author: Ullrich Kĥthe (wrapped from VIGRA by Michael Droettboom) For all black pixels, the distance to the nearest white pixel is calculated. In the destination image, all pixels corresponding to black pixels in the input image will be assigned the their distance value, all pixels corresponding to white pixels will be assigned 0. The result is returned as a Float image. *norm*: 0: use chessboard distance (L-infinity norm) 1: use Manhattan distance (L1 norm) 2: use Euclidean distance (L2 norm) ---------- **Example 1:** distance_transform(5) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/distance_transform_plugin_00.png :height: 99 :width: 69 ``erode`` --------- ``Image`` [OneBit|GreyScale|Float] **erode** () :Operates on: ``Image`` [OneBit|GreyScale|Float] :Returns: ``Image`` [OneBit|GreyScale|Float] :Category: Morphology :Defined in: morphology.py :Author: Michael Droettboom and Karl MacMillan Morpholgically erodes the image with a 3x3 square structuring element. ---------- **Example 1:** erode() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/erode_plugin_00.png :height: 67 :width: 96 **Example 2:** erode() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/erode_plugin_01.png :height: 99 :width: 69 ``erode_dilate`` ---------------- ``Image`` [OneBit|GreyScale|Float] **erode_dilate** (int(0, 10) *ntimes* = 1, ``Choice`` [dilate|erode] *direction*, ``Choice`` [rectangular|octagonal] *shape*) :Operates on: ``Image`` [OneBit|GreyScale|Float] :Returns: ``Image`` [OneBit|GreyScale|Float] :Category: Morphology :Defined in: morphology.py :Author: Michael Droettboom and Karl MacMillan Morphologically erodes or dilates the image with a rectangular or ocagonal structuring element. For onebit images, this is simply a wrapper for erode_with_structure_ or dilate_with_structure_ with special cases for the structuring element. The returned image is of the same size as the input image, which means that border pixels are not dilated beyond the image dimensions. If you also want the border pixels to be dilated, apply pad_image_ to the input image beforehand. .. _pad_image: utility.html#pad-image .. _erode_with_structure: #erode-with-structure .. _dilate_with_structure: #dilate-with-structure *ntimes* The number of times to perform the operation. *direction* dilate (0) increase the presence of black erode (1) decrease the presence of black *shape* rectangular (0) use a 3x3 rectangular morphology operator octagonal (1) use octagonal morphology operator by alternately using a 3x3 cross and a 3x3 square structuring element ---------- **Example 1:** erode_dilate(10, 0, 1) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/erode_dilate_plugin_00.png :height: 67 :width: 96 ``erode_with_structure`` ------------------------ ``Image`` [OneBit] **erode_with_structure** (``Image`` [OneBit] *structuring_element*, ``Point`` *origin*) :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Morphology :Defined in: morphology.py :Author: Christoph Dalitz Performs a binary morphological erosion with the given structuring element. Note that it is necessary to specify which point in the structuring element shall be treated as origin. This allows for arbitrary structuring elements. Border pixels at which the structuring element extends beyond the image dimensions are whitened. In other words the image is padded with white pixels before erosion. Example: .. code:: Python # same as image.erode() structure = Image(Point(0,0), Point(2,2), ONEBIT) structure.fill(1) image = image.erode_with_structure(structure, Point(1,1)) gamera-3.3.3/doc/src/overriding_knn_features.txt0000644000076500000000000001225610714675724020776 0ustar chriswheel=================================== Overriding kNN's feature generation =================================== Introduction ------------ The classifier automatically manages the generation of feature vectors from glyphs. When a feature vector is needed because it is being classified or added to the training set, it is automatically generated on-the-fly. By default, the feature generation method in kNN is quite simple. The user of the classifier provides a list of feature function names (either in the constructor or through the ``change_feature_set`` method), and for each glyph, the results of each feature function in the set are appended together to produce a feature vector. This simple feature generation method can be overridden and replaced with something more appropriate to specific problem domains. The only restriction (which is an inherent limitation of the *k*-nearest neighbor algorithm) is that the length of the feature vectors must be the same for all glyphs within a single classifier. If your problem requires variable-length feature vectors, you will need to use another kind of classifier or use multiple kNN classifiers. Creating a subclass of ``kNN`` ------------------------------ Changing how feature generation works is as simple as creating a new class that inherits from either ``kNNInteractive`` or ``kNNNonInteractive`` and overriding the ``generate_features`` method. ``__init__`` may also be overridden in order to accept parameters specific to the class. .. code:: Python from gamera import knn, classify import array class MykNN(knn.kNNInteractive): def __init__(self, database, num_features, perform_splits=True): ... described below ... def generate_features(self, glyph): ... described below ... ``__init__`` '''''''''''' The __init__ function must do two things: - initialize the low-level kNN classifier and set the length of the feature vectors. - initialize the high-level classifier interface with the initial database of glyphs (or filename). In the example below, the length of the feature vector is set using an argument to the constructor. Note that this is in contrast to the default behavior, where a list of feature functions is passed in and the length of the feature vectors is calculated from that. .. code:: Python def __init__(self, database, num_features, perform_splits=True): knn._kNNBase.__init__(self, num_features) classify.InteractiveClassifier.__init__(self, database, perform_splits=perform_splits) ``generate_features`` ''''''''''''''''''''' The ``generate_features`` function is where the feature generation actually happens and is called everytime the classifier needs a feature vector for a particular glyph. The feature vector itself must be stored in the member ``features`` of the glyph itself. This *must* be a Python ``array`` of ``double``, and its length must be equal to the feature vector length for the whole classifier. For efficiency reasons, the type-checking within kNN is very weak, so this point is very important. Of course, the actual content of the feature vector will be computed through some process (which is the whole point of this document). As a trivial example, the following simply generates a feature vector full of zeros: .. code:: Python def generate_features(self, glyph): glyph.features = array.array('d', [0] * self.num_features) Pitfalls and performance issues ''''''''''''''''''''''''''''''' When you start to put this into a real system, things get more complex. ``generate_features`` may be called multiple times on the same glyph. For instance, this can happen when the same glyph is classified more than once. More dangerously, it can happen when glyphs are moved around between different classifiers. If those classifiers have different length feature vectors (or even different sets and ordering of features) things won't work as expected, because the classifiers will be sharing incompatible feature vectors. It is therefore a good idea to always either keep the sets of glyphs orthogonal between all active classifiers, or copy the glyph instances when moving from one classifier to another. Calling ``generate_features`` multiple times on the same glyph may also have performance implications. In the default implementation, when a feature vector is generated, the feature functions that were used to generate it are also stored in a member of the glyph. The next time ``generate_features`` is called for the glyph, the feature vector is re-generated *only* if the set of feature functions being used is different from the last time they were generated. This saves a redundant time-consuming feature generation operation. It is impossible for the classifier system to know what external forces will require feature regeneration, so it is the resposibility of the custom ``generate_features`` method to determine the need to regenerate. In the following example, the feature vector is regenerated if the feature vector length has changed since the last time it was generated. .. code:: Python def generate_features(self, glyph): if len(glyph.features) != self.num_features: glyph.features = array.array('d', [0] * self.num_features) gamera-3.3.3/doc/src/overview.txt0000644000076500000000000003144610714675724015732 0ustar chriswheel=========================== A gentle overview of Gamera =========================== .. note:: This document was adapted from the following paper: Droettboom, M., MacMillan, K., and Fujinaga, I. 2003. *The Gamera framework for building custom recognition systems*. In proceedings, Symposium on Document Image Understanding Technology. Introduction ============ Gamera is a framework for the creation of structured document analysis applications by domain experts. Domain experts are individuals who have a strong knowledge of the documents in a collection, but may not have a formal technical background. The goal is to create a tool that leverages their knowledge of the target documents to create custom applications rather than attempting to meet diverse requirements with a monolithic application. This paper gives an overview of the architecture and design principles of Gamera. Architecture overview ===================== Developing recognition systems for difficult historical documents requires experimentation since the solution is often non-obvious. Therefore, Gamera's primary goal is to support an efficient test-and-refine development cycle. Virtually every implementation detail is driven by this goal. For instance, Python [Rossum2002]_ was chosen as the core language because of its introspection capabilities, dynamic typing and ease of use. It has been used as a first programming language with considerable success [Berehzny2001]_. C++ is used to write plugins where runtime performance is a priority, but even in that case, the `Gamera plugin system`__ is designed to make writing extensions as easy as possible. Gamera includes a full-fledged graphical user interface that provides a number of shortcuts for training, as well as inspection of the results of algorithms at every step. By improving the ease of experimentation, we hope to put the power to develop recognition systems with those who understand the documents best. We expect at least two kinds of developers to work with the system: those with a technical background adding algorithms to the system, and those working on the higher-level aggregation of those pieces. It is important to note this distinction, since those groups represent different skill sets and requirements. .. __: writing_plugins.html In addition to its support of test-and-refine development, Gamera also has several other advantages that are important to large-scale digitization projects in general. These are: * **Open source code** and **standards-compliance** so that the software can interact well with other parts of a digitization framework * **Platform independence**, running on a variety of operating systems including Linux, Microsoft Windows and Mac OS-X * **A workflow system** to combine high-level tasks * **Batch processing** * **A unit-testing framework** to ensure correctness and avoid regression * **User interface components** for development and classifier training * **Recognition confidence output** so that collection managers can easily target documents that need correction or different recognition strategies Tasks ----- Gamera has a modular plugin architecture. These modules typically perform one of five document recognition tasks: 1. Pre-processing 2. Document segmentation and analysis 3. Symbol segmentation and classification 4. Syntactical or structural analysis 5. Output Each of these tasks can be arbitrarily complex, involve multiple strategies or modules, or be removed entirely depending on the specific recognition problem at hand. The actual steps that make up a complete recognition system are completely controlled by the user. Pre-processing `````````````` Pre-processing involves standard image-processing operations such as noise removal, blurring, de-skewing, contrast adjustment, sharpening, binarization, and morphology. Close attention to and refinement of these steps is particularly important when working with degraded historical documents. Document segmentation and analysis `````````````````````````````````` Before the symbols of a document can be classified, an analysis of the overall structure of the document may be necessary. The purpose of this step is to analyze the structure of the document, segment it into sections, and perhaps identify and remove elements. For example, in the case of music recognition, it is necessary to identify and remove the staff lines in order to be able to properly separate the individual symbols. Similarly, text documents may require the removal of figures. Symbol segmentation and classification `````````````````````````````````````` The segmentation, feature extraction, and classification of symbols is the core of the Gamera system. The system allows different segmenters and classifiers to be plugged-in. Classifiers come in two flavors: "interactive" classifiers, where examples can be added and the results tested immediately, and "non-interactive" classifiers, that are highly optimized but static. Gamera has a generic and flexible `XML-based file format`__ to store classifier data, but for efficiency, the "non-interactive" classifiers can also define their own format containing Pre-parsed or pre-optimized data. At present, we have an implementation of the k -nearest neighbor (kNN) algorithm [Cover1967]_ whose weights are optimized using a genetic algorithm (GA) [Holland1975]_. We have tested the extensibility of our classifier framework by porting a simple back-propagating neural network library to Gamera [Schemenauer2002]_. We also plan to examine what modifications would be necessary to support stateful classifiers, such as hidden Markov models. .. __: xml_format.html Syntactical and structural analysis ``````````````````````````````````` This process reconstructs a document into a semantic representation of the individual symbols. Examples of this include combining stems, flags, and noteheads into musical objects, or grouping words and numbers into lines, paragraphs, columns etc. Obviously, this process is entirely dependent on the type of document being processed and is a likely place for large customizations by knowledgeable users. Output `````` Gamera stores groups of glyphs in an `XML-based file format`__. This makes it very easy to save, load, and merge sets of training data. Since a run-length encoded copy of the glyph is included, it is easy to load the original images and inspect, edit or generate new features from them. .. __: xml_format.html .. code:: XML 5 6 4 9 2 4 2 4 2 4 3 3 1 4 6 5 8 4 9 3 8 4 9 4 8 5 7 5 3 3 3 9 3 9 6 4 2 0 180.0 0.8 0.584269662921 0.219907407407 0.228888888889 0.0697385116598 0.126611111111 0.0505606995885 0.0203254388586 0.0177776861746 0.00727370913662 0.0488995911061 ... ... Output of data that is specific to a particular type of document, i.e. post-structural interpretation, is deliberately left open-ended, since different domains will have different requirements. Graphical user interface ======================== Since document recognition is an inherently visual problem, a graphical user interface (GUI) is included to allow the application developer to experiment with different recognition strategies. At the core of the interface is the console window which allows the programmer to run code interactively and control the system either by typing commands or using menus. All commands are recorded in a history, which can later be used for building automatic batch scripts. .. image: images/console.png The interface also includes a simple image viewer, image analysis tools, and a training interface for the learning classifiers. .. image: images/classifier_window.png The training interface allows the user to create databases of labeled glyphs, including the merging and splitting of connected components. The interface can easily be extended to include new elements as modules are added to Gamera. The entire GUI is written in Python, using the wxPython toolkit. The Gamera GUI documentation contains more information. Implementation details ====================== Image classes ------------- The storage and manipulation of images is one of the most important aspects of Gamera. Gamera must provide not only general-purpose image manipulation functions, but also infrastructure to support the symbol segmentation and analysis. The features of the Image classes in Gamera include: **Polymorphic image types.** Gamera images can be in stored using a number of different pixel types, including color (24-bit RGB), greyscale (8- and 16-bit), floating point (32-bit) and bi-level images, though new images types can be added as desired. **Consistent programming interface.** The interface to all types of images (in both C++ and Python) is the same. While some methods are not available for all image types (e.g. thresholding a bi-level image would not make sense), in many cases image types are interchangeable, meaning types can be changed at different points in the development process. **Use of existing code libraries.** The image classes have been designed especially to make transferring code from other ccpp image processing libraries as easy as possible. For example, many algorithms in the VIGRA library [J¤hne1999]_ can be used in Gamera without modification. Using C libraries, such as XITE [B¸e1998]_, often requires only a few minor modifications of the code. This ability has reduced our development time considerably. **Portions of images.** The image classes allow for the flexible and efficient representation of portions of images, including non-rectangular regions, without resorting to memory copying. The bi-level images actually store 16-bits-per-pixel, so that labeling information can be stored to define connected components. This uses a considerably smaller memory footprint than using separate data for each connected component. The `image types documentation`__ contains more information. .. __: image_types.html The plugin system ----------------- Writing wrapper code to call C/C++ from Python is a time-consuming, error-prone and repetitive task. A number of general-purpose tools exist to help automate this process, including SWIG_ and `Boost Python`__. In fact, an earlier version of Gamera used Boost Python, but the additional function-call overhead for our highly polymorphic image types lead to poor performance of that system as a whole. We have since developed our own wrapper-generating mechanism specific to Gamera and its classes. This allowed us to provide optimizations and conveniences to the programmer that would not be possible with a more general approach. .. _SWIG: http://www.swig.org/ .. __: http://www.boost.org/ To add a plugin function to Gamera, a programmer writes metadata about the function (in Python) and a single function to perform an image-processing task (in C++). Plugin functions are grouped into standard Python modules, which are collections of related classes and functions. See `Writing Gamera plugins`__ for more information. .. __: writing_plugins.html Bibliography ============ .. [Rossum2002] Rossum, G. 2002. Python language reference. F. L. Drake, Jr., ed. http://www.python.org .. [Berehzny2001] Berehzny, L., J. Elkner, and J. Straw. 2001. Using Python in a high school computer science program: Year 2. International Python Conference. 217--23. .. [Cover1967] Cover, T. and P. Hart. 1967. Nearest neighbour pattern classification. IEEE Transactions on Information Theory. 13(1): 21--7. .. [Holland1975] Holland, J. H. 1975. Adaptation in natural and artificial systems. University of Michigan Press, Ann Arbor. .. [Schemenauer2002] Schemenauer, N. 2002. A simple neural network library bpnn.py. Computer software. http://arctrix.com/nas/ .. [J¤hne1999] J¤hne, B., H. HauŸecker, and P. GeiŸler. 1999. Reusable software in Computer Vision. Handbook on Computer Vision and Applications. New York: Academic Press. .. [B¸e1998] B¸e, S., T. L¸nnestad, and O. Milvang. 1998. XITE: X-based image processing tools and environment: User's manual, version 3.4. Technical Report 56, Image Processing Laboratory, Department of Informatics, University of Oslo. gamera-3.3.3/doc/src/pagesegmentation.txt0000644000076500000000000002433611755375756017426 0ustar chriswheel PageSegmentation ================ ``bbox_merging`` ---------------- [object] **bbox_merging** (int *Ex* = -1, int *Ey* = -1) :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: PageSegmentation :Defined in: pagesegmentation.py :Author: Rene Baston, Karl MacMillan, and Christoph Dalitz Segments a page by extending and merging the bounding boxes of the connected components on the page. How much the segments are extended is controlled by the arguments *Ex* and *Ey*. Depending on their value, the returned segments can be lines or paragraphs or something else. The return value is a list of 'CCs' where each 'CC' represents a found segment. Note that the input image is changed such that each pixel is set to its segment label. Arguments: *Ex*: How much each CC is extended to the left and right before merging. When *-1*, it is set to twice the average size of all CCs. *Ey*: How much each CC is extended to the top and bottom before merging. When *-1*, it is set to twice the average size of all CCs. This will typically segemtn into paragraphs. If you want to segment into lines, set *Ey* to something small like one sixth of the median symbol height. ``projection_cutting`` ---------------------- [object] **projection_cutting** (int *Tx* = 0, int *Ty* = 0, int *noise* = 0, ``Choice`` [cut|ignore] *gap_treatment* = cut) :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: PageSegmentation :Defined in: pagesegmentation.py :Author: Maria Elhachimi and Robert Butz Segments a page with the *Iterative Projection Profile Cuttings* method. The image is split recursively in the horizontal and vertical direction by looking for 'gaps' in the projection profile. A 'gap' is a contiguous sequence of projection values smaller than *noise* pixels. The splitting is done for each gap wider or higher than given thresholds *Tx* or *Ty*. When no further split points are found, the recursion stops. Whether the resulting segments represent lines, columns or paragraphs depends on the values for *Tx* and *Ty*. The return value is a list of 'CCs' where each 'CC' represents a found segment. Note that the input image is changed such that each pixel is set to its CC label. *Tx*: minimum 'gap' width in the horizontal direction. When set to zero, *Tx* is set to the median height of all connected component * 7, which might be a reasonable assumption for the gap width between adjacent text columns. *Ty*: minimum 'gap' width in the vertical direction. When set to zero, *Ty* is set to half the median height of all connected component, which might be a reasonable assumption for the gap width between adjacent text lines. *noise*: maximum projection value still consideread as belonging to a 'gap'. *gap_treatment*: decides how to treat gaps when *noise* is non zero. When 0 ('cut'), gaps are cut in the middle and the noise pixels in the gap are assigned to the segments. When 1 ('ignore'), noise pixels within the gap are not assigned to a segment, in other words, they are ignored. ``runlength_smearing`` ---------------------- [object] **runlength_smearing** (int *Cx* = -1, int *Cy* = -1, int *Csm* = -1) :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: PageSegmentation :Defined in: pagesegmentation.py :Author: Christoph Dalitz and Iliya Stoyanov Segments a page with the *Run Length Smearing* algorithm. The algorithm converts white horizontal and vertical runs shorter than given thresholds *Cx* and *Cy* to black pixels (this is the so-called 'run length smearing'). The intersection of both smeared images yields the page segments as black regions. As this typically still consists small white horizontal gaps, these gaps narrower than *Csm* are in a final step also filled out. The return value is a list of 'CCs' where each 'CC' represents a found segment. Note that the input image is changed such that each pixel is set to its CC label. Arguments: *Cx*: Minimal length of white runs in the rows. When set to *-1*, it is set to 20 times the median height of all connected components. *Cy*: Minimal length of white runs in the columns. When set to *-1*, it is set to 20 times the median height of all connected components. *Csm*: Minimal length of white runs row-wise in the almost final image. When set to *-1*, it is set to 3 times the median height of all connected components. ``segmentation_error`` ---------------------- ``IntVector`` **segmentation_error** (``Image`` [OneBit] *Gseg*, ``Image`` [OneBit] *Sseg*) :Returns: ``IntVector`` :Category: PageSegmentation :Defined in: pagesegmentation.py :Author: Christoph Dalitz Compares a ground truth segmentation *Gseg* with a segmentation *Sseg* and returns error count numbers. The input images must be given in such a way that each segment is uniquely labeled, similar to the output of a page segmentation algorithm like `runlength_smearing`_. For ground truth data, such a labeled image can be obtained from an external color image with `colors_to_labels`_. .. _`runlength_smearing`: #runlength-smearing .. _`colors_to_labels`: color.html#colors-to-labels The two segmentations are compared by building equivalence classes of overlapping segments as described in M. Thulke, V. Margner, A. Dengel: *A general approach to quality evaluation of document segmentation results.* Lecture Notes in Computer Science 1655, pp. 43-57 (1999) Each class is assigned an error type depending on how many ground truth and test segments it contains. The return value is a tuple (*n1,n2,n3,n4,n5,n6)* where each value is the total number of classes with the corresponding error type: +------+-----------------------+---------------+----------------------+ | Nr | Ground truth segments | Test segments | Error type | +======+=======================+===============+======================+ | *n1* | 1 | 1 | correct | +------+-----------------------+---------------+----------------------+ | *n2* | 1 | 0 | missed segment | +------+-----------------------+---------------+----------------------+ | *n3* | 0 | 1 | false positive | +------+-----------------------+---------------+----------------------+ | *n4* | 1 | > 1 | split | +------+-----------------------+---------------+----------------------+ | *n5* | > 1 | 1 | merge | +------+-----------------------+---------------+----------------------+ | *n6* | > 1 | > 1 | splits and merges | +------+-----------------------+---------------+----------------------+ The total segmentation error can be computed from these numbers as *1 - n1 / (n1 + n2 + n3 + n4 + n5 + n6)*. The individual numbers can be of use to determine what exactly is wrong with the segmentation. As this function is not an image method, but a free function, it is not automatically imported with all plugins and you must import it explicitly with .. code:: Python from gamera.plugins.pagesegmentation import segmentation_error ``sub_cc_analysis`` ------------------- tuple **sub_cc_analysis** ([object *cclist*]) :Operates on: ``Image`` [OneBit] :Returns: tuple :Category: PageSegmentation :Defined in: pagesegmentation.py :Author: Stephan Ruloff and Christoph Dalitz Further subsegments the result of a page segmentation algorithm into groups of actual connected components. The result of a page segmenattion plugin is a list of 'CCs' where each 'CC' does not represent a 'connected component', but a page segment (typically a line of text). In a practical OCR application you will however need the actual connected components (which should roughly corresond to the glyphs) in groups of lines. That is what this plugin is meant for. The input image must be an image that has been processed with a page segmentation plugin, i.e. all pixels in the image must be labeled with a segment label. The input parameter *cclist* is the list of segments returned by the page segmentation algorithm. The return value is a tuple with two entries: - a new image with all pixels labeled according to the new CCs - a list of ImageLists, each list containing all connected components belonging to the same page segments .. note:: The groups will be returned in the same order as given in *cclist*. This means that you can sort the page segments by reading order before passing them to *sub_cc_analysis*. Note that the order of the returned CCs within each group is not well defined. Hence you will generally need to sort each subgroup by reading order. ``textline_reading_order`` -------------------------- [object] **textline_reading_order** ([object *lineccs*]) :Returns: [object] :Category: PageSegmentation :Defined in: pagesegmentation.py :Author: Christoph Dalitz Sorts a list of Images (CCs) representing textlines by reading order and returns the sorted list. Incidentally, this will not only work on textlines, but also on paragraphs, but *not* on actual Connected Components. The algorithm sorts all lines in topological order, based on the following criteria for the pairwise order of two lines: - line *a* comes before line *b* when *a* is totally to the left of *b* (order "column before row") - line *a* comes before *b* when both overlap horizontally and *a* is above *b* (order within a column) In the reference `"High Performance Document Analysis"`__ by T.M. Breuel (Symposium on Document Image Understanding, USA, pp. 209-218, 2003), an additional constraint is made for the first criterion by demanding that no other segment may be between *a* and *b* that opverlaps horizontally with both. This constraint for taking multi column headings that interrupt columns into account is replaced in this implementation with an a priori sort of all textlines by *y*-position. This results in a preference of rows over columns (in case of ambiguity) in the depth-first-search utilized in the topological sorting. .. __: http://pubs.iupr.org/DATA/2003-breuel-sdiut.pdf As this function is not an image method, but a free function, it is not automatically imported with all plugins and you must import it explicitly with .. code:: Python from gamera.plugins.pagesegmentation import textline_reading_order gamera-3.3.3/doc/src/plugins.txt0000644000076500000000000005252511755375757015557 0ustar chriswheel======= Plugins ======= By categories ------------- - Analysis_ - Contour_ - contour_bottom_ - contour_left_ - contour_pavlidis_ - contour_right_ - contour_samplepoints_ - contour_top_ - histogram_ - min_max_location_ - projection_cols_ - projection_rows_ - projection_skewed_cols_ - projection_skewed_rows_ - projections_ - rotation_angle_projections_ - Binarization_ - RegionInformation_ - gatos_background_ - image_mean_ - image_variance_ - mean_filter_ - variance_filter_ - abutaleb_threshold_ - bernsen_threshold_ - djvu_threshold_ - gatos_threshold_ - niblack_threshold_ - otsu_find_threshold_ - otsu_threshold_ - sauvola_threshold_ - shading_subtraction_ - threshold_ - tsai_moment_preserving_find_threshold_ - tsai_moment_preserving_threshold_ - white_rohrer_threshold_ - Classification_ - classify_automatic_ - classify_heuristic_ - classify_manual_ - get_confidence_ - get_main_id_ - has_id_name_ - match_id_name_ - unclassify_ - Color_ - blue_ - cie_Lab_L_ - cie_Lab_a_ - cie_Lab_b_ - cie_x_ - cie_y_ - cie_z_ - color_ccs_ - colors_to_labels_ - cyan_ - false_color_ - graph_color_ccs_ - green_ - hue_ - magenta_ - red_ - saturation_ - value_ - yellow_ - Combine_ - Arithmetic_ - add_images_ - divide_images_ - multiply_images_ - subtract_images_ - Logical_ - and_image_ - or_image_ - xor_image_ - diff_images_ - mask_ - union_images_ - Conversion_ - extract_imaginary_ - extract_real_ - to_complex_ - to_float_ - to_grey16_ - to_greyscale_ - to_onebit_ - to_rgb_ - Corelation_ - corelation_sum_ - corelation_sum_squares_ - corelation_weighted_ - Deformations_ - degrade_kanungo_ - ink_diffuse_ - inkrub_ - noise_ - wave_ - white_speckles_ - Displaying_ - display_ - display_ccs_ - display_false_color_ - Draw_ - draw_bezier_ - draw_circle_ - draw_filled_rect_ - draw_hollow_rect_ - draw_line_ - draw_marker_ - draw_text_ - fill_ - fill_white_ - flood_fill_ - highlight_ - invert_ - remove_border_ - Edge_ - canny_edge_image_ - difference_of_exponential_crack_edge_image_ - difference_of_exponential_edge_image_ - labeled_region_edges_ - outline_ - ExternalLibraries_ - from_raw_string_ - to_raw_string_ - to_buffer_ - Features_ - area_ - aspect_ratio_ - black_area_ - compactness_ - moments_ - ncols_feature_ - nholes_ - nholes_extended_ - nrows_feature_ - skeleton_features_ - top_bottom_ - volume_ - volume16regions_ - volume64regions_ - zernike_moments_ - File_ - PNG_info_ - load_PNG_ - load_image_ - load_tiff_ - save_PNG_ - save_image_ - save_tiff_ - tiff_info_ - Filter_ - Convolution_ - convolve_ - convolve_x_ - convolve_xy_ - convolve_y_ - ConvolutionKernels_ - AveragingKernel_ - BinomialKernel_ - GaussianDerivativeKernel_ - GaussianKernel_ - SimpleSharpeningKernel_ - SymmetricGradientKernel_ - create_gabor_filter_ - gaussian_gradient_ - gaussian_smoothing_ - hessian_matrix_of_gaussian_ - kfill_ - kfill_modified_ - laplacian_of_gaussian_ - mean_ - min_max_filter_ - rank_ - simple_sharpen_ - sobel_edge_detection_ - wiener_filter_ - Geometry_ - convex_hull_as_image_ - convex_hull_as_points_ - convex_hull_from_points_ - delaunay_from_points_ - labeled_region_neighbors_ - max_empty_rect_ - voronoi_from_labeled_image_ - voronoi_from_points_ - List_ - all_subsets_ - median_ - permute_list_ - Morphology_ - despeckle_ - dilate_ - dilate_with_structure_ - distance_transform_ - erode_ - erode_dilate_ - erode_with_structure_ - PageSegmentation_ - bbox_merging_ - projection_cutting_ - runlength_smearing_ - segmentation_error_ - sub_cc_analysis_ - textline_reading_order_ - Relational_ - bounding_box_grouping_function_ - edit_distance_ - least_squares_fit_ - least_squares_fit_xy_ - polar_distance_ - polar_match_ - shaped_grouping_function_ - Runlength_ - filter_narrow_runs_ - filter_short_runs_ - filter_tall_runs_ - filter_wide_runs_ - from_rle_ - iterate_runs_ - most_frequent_run_ - most_frequent_runs_ - run_histogram_ - to_rle_ - Segmentation_ - cc_analysis_ - cc_and_cluster_ - splitx_ - splitx_left_ - splitx_max_ - splitx_right_ - splity_ - splity_bottom_ - splity_top_ - Thinning_ - medial_axis_transform_hs_ - medial_axis_transform_large_image_hs_ - thin_hs_ - thin_hs_large_image_ - thin_lc_ - thin_zs_ - Transformation_ - mirror_horizontal_ - mirror_vertical_ - resize_ - rotate_ - scale_ - shear_column_ - shear_row_ - Utility_ - NestedLists_ - nested_list_to_image_ - to_nested_list_ - ccs_from_labeled_image_ - clip_image_ - generate_features_ - image_copy_ - image_save_ - mse_ - pad_image_ - reset_onebit_image_ - subimage_ - trim_image_ - XML_ - to_xml_ - to_xml_filename_ Alphabetical ------------- **A** abutaleb_threshold_, add_images_, all_subsets_, and_image_, area_, aspect_ratio_, AveragingKernel_ **B** bbox_merging_, bernsen_threshold_, BinomialKernel_, black_area_, blue_, bounding_box_grouping_function_ **C** canny_edge_image_, cc_analysis_, cc_and_cluster_, ccs_from_labeled_image_, cie_Lab_a_, cie_Lab_b_, cie_Lab_L_, cie_x_, cie_y_, cie_z_, classify_automatic_, classify_heuristic_, classify_manual_, clip_image_, color_ccs_, colors_to_labels_, compactness_, contour_bottom_, contour_left_, contour_pavlidis_, contour_right_, contour_samplepoints_, contour_top_, convex_hull_as_image_, convex_hull_as_points_, convex_hull_from_points_, convolve_, convolve_x_, convolve_xy_, convolve_y_, corelation_sum_, corelation_sum_squares_, corelation_weighted_, create_gabor_filter_, cyan_ **D** degrade_kanungo_, delaunay_from_points_, despeckle_, diff_images_, difference_of_exponential_crack_edge_image_, difference_of_exponential_edge_image_, dilate_, dilate_with_structure_, display_, display_ccs_, display_false_color_, distance_transform_, divide_images_, djvu_threshold_, draw_bezier_, draw_circle_, draw_filled_rect_, draw_hollow_rect_, draw_line_, draw_marker_, draw_text_ **E** edit_distance_, erode_, erode_dilate_, erode_with_structure_, extract_imaginary_, extract_real_ **F** false_color_, fill_, fill_white_, filter_narrow_runs_, filter_short_runs_, filter_tall_runs_, filter_wide_runs_, flood_fill_, from_raw_string_, from_rle_ **G** gatos_background_, gatos_threshold_, gaussian_gradient_, gaussian_smoothing_, GaussianDerivativeKernel_, GaussianKernel_, generate_features_, get_confidence_, get_main_id_, graph_color_ccs_, green_ **H** has_id_name_, hessian_matrix_of_gaussian_, highlight_, histogram_, hue_ **I** image_copy_, image_mean_, image_save_, image_variance_, ink_diffuse_, inkrub_, invert_, iterate_runs_ **K** kfill_, kfill_modified_ **L** labeled_region_edges_, labeled_region_neighbors_, laplacian_of_gaussian_, least_squares_fit_, least_squares_fit_xy_, load_image_, load_PNG_, load_tiff_ **M** magenta_, mask_, match_id_name_, max_empty_rect_, mean_, mean_filter_, medial_axis_transform_hs_, medial_axis_transform_large_image_hs_, median_, min_max_filter_, min_max_location_, mirror_horizontal_, mirror_vertical_, moments_, most_frequent_run_, most_frequent_runs_, mse_, multiply_images_ **N** ncols_feature_, nested_list_to_image_, nholes_, nholes_extended_, niblack_threshold_, noise_, nrows_feature_ **O** or_image_, otsu_find_threshold_, otsu_threshold_, outline_ **P** pad_image_, permute_list_, PNG_info_, polar_distance_, polar_match_, projection_cols_, projection_cutting_, projection_rows_, projection_skewed_cols_, projection_skewed_rows_, projections_ **R** rank_, red_, remove_border_, reset_onebit_image_, resize_, rotate_, rotation_angle_projections_, run_histogram_, runlength_smearing_ **S** saturation_, sauvola_threshold_, save_image_, save_PNG_, save_tiff_, scale_, segmentation_error_, shading_subtraction_, shaped_grouping_function_, shear_column_, shear_row_, simple_sharpen_, SimpleSharpeningKernel_, skeleton_features_, sobel_edge_detection_, splitx_, splitx_left_, splitx_max_, splitx_right_, splity_, splity_bottom_, splity_top_, sub_cc_analysis_, subimage_, subtract_images_, SymmetricGradientKernel_ **T** textline_reading_order_, thin_hs_, thin_hs_large_image_, thin_lc_, thin_zs_, threshold_, tiff_info_, to_buffer_, to_complex_, to_float_, to_grey16_, to_greyscale_, to_nested_list_, to_onebit_, to_raw_string_, to_rgb_, to_rle_, to_xml_, to_xml_filename_, top_bottom_, trim_image_, tsai_moment_preserving_find_threshold_, tsai_moment_preserving_threshold_ **U** unclassify_, union_images_ **V** value_, variance_filter_, volume_, volume16regions_, volume64regions_, voronoi_from_labeled_image_, voronoi_from_points_ **W** wave_, white_rohrer_threshold_, white_speckles_, wiener_filter_ **X** xor_image_ **Y** yellow_ **Z** zernike_moments_ .. _Analysis: analysis.html#analysis .. _Contour: analysis.html#contour .. _contour_bottom: analysis.html#contour-bottom .. _contour_left: analysis.html#contour-left .. _contour_pavlidis: analysis.html#contour-pavlidis .. _contour_right: analysis.html#contour-right .. _contour_samplepoints: analysis.html#contour-samplepoints .. _contour_top: analysis.html#contour-top .. _histogram: analysis.html#histogram .. _min_max_location: analysis.html#min-max-location .. _projection_cols: analysis.html#projection-cols .. _projection_rows: analysis.html#projection-rows .. _projection_skewed_cols: analysis.html#projection-skewed-cols .. _projection_skewed_rows: analysis.html#projection-skewed-rows .. _projections: analysis.html#projections .. _rotation_angle_projections: analysis.html#rotation-angle-projections .. _Binarization: binarization.html#binarization .. _RegionInformation: binarization.html#regioninformation .. _gatos_background: binarization.html#gatos-background .. _image_mean: binarization.html#image-mean .. _image_variance: binarization.html#image-variance .. _mean_filter: binarization.html#mean-filter .. _variance_filter: binarization.html#variance-filter .. _abutaleb_threshold: binarization.html#abutaleb-threshold .. _bernsen_threshold: binarization.html#bernsen-threshold .. _djvu_threshold: binarization.html#djvu-threshold .. _gatos_threshold: binarization.html#gatos-threshold .. _niblack_threshold: binarization.html#niblack-threshold .. _otsu_find_threshold: binarization.html#otsu-find-threshold .. _otsu_threshold: binarization.html#otsu-threshold .. _sauvola_threshold: binarization.html#sauvola-threshold .. _shading_subtraction: binarization.html#shading-subtraction .. _threshold: binarization.html#threshold .. _tsai_moment_preserving_find_threshold: binarization.html#tsai-moment-preserving-find-threshold .. _tsai_moment_preserving_threshold: binarization.html#tsai-moment-preserving-threshold .. _white_rohrer_threshold: binarization.html#white-rohrer-threshold .. _Classification: classification.html#classification .. _classify_automatic: classification.html#classify-automatic .. _classify_heuristic: classification.html#classify-heuristic .. _classify_manual: classification.html#classify-manual .. _get_confidence: classification.html#get-confidence .. _get_main_id: classification.html#get-main-id .. _has_id_name: classification.html#has-id-name .. _match_id_name: classification.html#match-id-name .. _unclassify: classification.html#unclassify .. _Color: color.html#color .. _blue: color.html#blue .. _cie_Lab_L: color.html#cie-lab-l .. _cie_Lab_a: color.html#cie-lab-a .. _cie_Lab_b: color.html#cie-lab-b .. _cie_x: color.html#cie-x .. _cie_y: color.html#cie-y .. _cie_z: color.html#cie-z .. _color_ccs: color.html#color-ccs .. _colors_to_labels: color.html#colors-to-labels .. _cyan: color.html#cyan .. _false_color: color.html#false-color .. _graph_color_ccs: color.html#graph-color-ccs .. _green: color.html#green .. _hue: color.html#hue .. _magenta: color.html#magenta .. _red: color.html#red .. _saturation: color.html#saturation .. _value: color.html#value .. _yellow: color.html#yellow .. _Combine: combine.html#combine .. _Arithmetic: combine.html#arithmetic .. _add_images: combine.html#add-images .. _divide_images: combine.html#divide-images .. _multiply_images: combine.html#multiply-images .. _subtract_images: combine.html#subtract-images .. _Logical: combine.html#logical .. _and_image: combine.html#and-image .. _or_image: combine.html#or-image .. _xor_image: combine.html#xor-image .. _diff_images: combine.html#diff-images .. _mask: combine.html#mask .. _union_images: combine.html#union-images .. _Conversion: conversion.html#conversion .. _extract_imaginary: conversion.html#extract-imaginary .. _extract_real: conversion.html#extract-real .. _to_complex: conversion.html#to-complex .. _to_float: conversion.html#to-float .. _to_grey16: conversion.html#to-grey16 .. _to_greyscale: conversion.html#to-greyscale .. _to_onebit: conversion.html#to-onebit .. _to_rgb: conversion.html#to-rgb .. _Corelation: corelation.html#corelation .. _corelation_sum: corelation.html#corelation-sum .. _corelation_sum_squares: corelation.html#corelation-sum-squares .. _corelation_weighted: corelation.html#corelation-weighted .. _Deformations: deformations.html#deformations .. _degrade_kanungo: deformations.html#degrade-kanungo .. _ink_diffuse: deformations.html#ink-diffuse .. _inkrub: deformations.html#inkrub .. _noise: deformations.html#noise .. _wave: deformations.html#wave .. _white_speckles: deformations.html#white-speckles .. _Displaying: displaying.html#displaying .. _display: displaying.html#display .. _display_ccs: displaying.html#display-ccs .. _display_false_color: displaying.html#display-false-color .. _Draw: draw.html#draw .. _draw_bezier: draw.html#draw-bezier .. _draw_circle: draw.html#draw-circle .. _draw_filled_rect: draw.html#draw-filled-rect .. _draw_hollow_rect: draw.html#draw-hollow-rect .. _draw_line: draw.html#draw-line .. _draw_marker: draw.html#draw-marker .. _draw_text: draw.html#draw-text .. _fill: draw.html#fill .. _fill_white: draw.html#fill-white .. _flood_fill: draw.html#flood-fill .. _highlight: draw.html#highlight .. _invert: draw.html#invert .. _remove_border: draw.html#remove-border .. _Edge: edge.html#edge .. _canny_edge_image: edge.html#canny-edge-image .. _difference_of_exponential_crack_edge_image: edge.html#difference-of-exponential-crack-edge-image .. _difference_of_exponential_edge_image: edge.html#difference-of-exponential-edge-image .. _labeled_region_edges: edge.html#labeled-region-edges .. _outline: edge.html#outline .. _ExternalLibraries: externallibraries.html#externallibraries .. _from_raw_string: externallibraries.html#from-raw-string .. _to_raw_string: externallibraries.html#to-raw-string .. _to_buffer: externallibraries.html#to-buffer .. _Features: features.html#features .. _area: features.html#area .. _aspect_ratio: features.html#aspect-ratio .. _black_area: features.html#black-area .. _compactness: features.html#compactness .. _moments: features.html#moments .. _ncols_feature: features.html#ncols-feature .. _nholes: features.html#nholes .. _nholes_extended: features.html#nholes-extended .. _nrows_feature: features.html#nrows-feature .. _skeleton_features: features.html#skeleton-features .. _top_bottom: features.html#top-bottom .. _volume: features.html#volume .. _volume16regions: features.html#volume16regions .. _volume64regions: features.html#volume64regions .. _zernike_moments: features.html#zernike-moments .. _File: file.html#file .. _PNG_info: file.html#png-info .. _load_PNG: file.html#load-png .. _load_image: file.html#load-image .. _load_tiff: file.html#load-tiff .. _save_PNG: file.html#save-png .. _save_image: file.html#save-image .. _save_tiff: file.html#save-tiff .. _tiff_info: file.html#tiff-info .. _Filter: filter.html#filter .. _Convolution: filter.html#convolution .. _convolve: filter.html#convolve .. _convolve_x: filter.html#convolve-x .. _convolve_xy: filter.html#convolve-xy .. _convolve_y: filter.html#convolve-y .. _ConvolutionKernels: filter.html#convolutionkernels .. _AveragingKernel: filter.html#averagingkernel .. _BinomialKernel: filter.html#binomialkernel .. _GaussianDerivativeKernel: filter.html#gaussianderivativekernel .. _GaussianKernel: filter.html#gaussiankernel .. _SimpleSharpeningKernel: filter.html#simplesharpeningkernel .. _SymmetricGradientKernel: filter.html#symmetricgradientkernel .. _create_gabor_filter: filter.html#create-gabor-filter .. _gaussian_gradient: filter.html#gaussian-gradient .. _gaussian_smoothing: filter.html#gaussian-smoothing .. _hessian_matrix_of_gaussian: filter.html#hessian-matrix-of-gaussian .. _kfill: filter.html#kfill .. _kfill_modified: filter.html#kfill-modified .. _laplacian_of_gaussian: filter.html#laplacian-of-gaussian .. _mean: filter.html#mean .. _min_max_filter: filter.html#min-max-filter .. _rank: filter.html#rank .. _simple_sharpen: filter.html#simple-sharpen .. _sobel_edge_detection: filter.html#sobel-edge-detection .. _wiener_filter: filter.html#wiener-filter .. _Geometry: geometry.html#geometry .. _convex_hull_as_image: geometry.html#convex-hull-as-image .. _convex_hull_as_points: geometry.html#convex-hull-as-points .. _convex_hull_from_points: geometry.html#convex-hull-from-points .. _delaunay_from_points: geometry.html#delaunay-from-points .. _labeled_region_neighbors: geometry.html#labeled-region-neighbors .. _max_empty_rect: geometry.html#max-empty-rect .. _voronoi_from_labeled_image: geometry.html#voronoi-from-labeled-image .. _voronoi_from_points: geometry.html#voronoi-from-points .. _List: list.html#list .. _all_subsets: list.html#all-subsets .. _median: list.html#median .. _permute_list: list.html#permute-list .. _Morphology: morphology.html#morphology .. _despeckle: morphology.html#despeckle .. _dilate: morphology.html#dilate .. _dilate_with_structure: morphology.html#dilate-with-structure .. _distance_transform: morphology.html#distance-transform .. _erode: morphology.html#erode .. _erode_dilate: morphology.html#erode-dilate .. _erode_with_structure: morphology.html#erode-with-structure .. _PageSegmentation: pagesegmentation.html#pagesegmentation .. _bbox_merging: pagesegmentation.html#bbox-merging .. _projection_cutting: pagesegmentation.html#projection-cutting .. _runlength_smearing: pagesegmentation.html#runlength-smearing .. _segmentation_error: pagesegmentation.html#segmentation-error .. _sub_cc_analysis: pagesegmentation.html#sub-cc-analysis .. _textline_reading_order: pagesegmentation.html#textline-reading-order .. _Relational: relational.html#relational .. _bounding_box_grouping_function: relational.html#bounding-box-grouping-function .. _edit_distance: relational.html#edit-distance .. _least_squares_fit: relational.html#least-squares-fit .. _least_squares_fit_xy: relational.html#least-squares-fit-xy .. _polar_distance: relational.html#polar-distance .. _polar_match: relational.html#polar-match .. _shaped_grouping_function: relational.html#shaped-grouping-function .. _Runlength: runlength.html#runlength .. _filter_narrow_runs: runlength.html#filter-narrow-runs .. _filter_short_runs: runlength.html#filter-short-runs .. _filter_tall_runs: runlength.html#filter-tall-runs .. _filter_wide_runs: runlength.html#filter-wide-runs .. _from_rle: runlength.html#from-rle .. _iterate_runs: runlength.html#iterate-runs .. _most_frequent_run: runlength.html#most-frequent-run .. _most_frequent_runs: runlength.html#most-frequent-runs .. _run_histogram: runlength.html#run-histogram .. _to_rle: runlength.html#to-rle .. _Segmentation: segmentation.html#segmentation .. _cc_analysis: segmentation.html#cc-analysis .. _cc_and_cluster: segmentation.html#cc-and-cluster .. _splitx: segmentation.html#splitx .. _splitx_left: segmentation.html#splitx-left .. _splitx_max: segmentation.html#splitx-max .. _splitx_right: segmentation.html#splitx-right .. _splity: segmentation.html#splity .. _splity_bottom: segmentation.html#splity-bottom .. _splity_top: segmentation.html#splity-top .. _Thinning: thinning.html#thinning .. _medial_axis_transform_hs: thinning.html#medial-axis-transform-hs .. _medial_axis_transform_large_image_hs: thinning.html#medial-axis-transform-large-image-hs .. _thin_hs: thinning.html#thin-hs .. _thin_hs_large_image: thinning.html#thin-hs-large-image .. _thin_lc: thinning.html#thin-lc .. _thin_zs: thinning.html#thin-zs .. _Transformation: transformation.html#transformation .. _mirror_horizontal: transformation.html#mirror-horizontal .. _mirror_vertical: transformation.html#mirror-vertical .. _resize: transformation.html#resize .. _rotate: transformation.html#rotate .. _scale: transformation.html#scale .. _shear_column: transformation.html#shear-column .. _shear_row: transformation.html#shear-row .. _Utility: utility.html#utility .. _NestedLists: utility.html#nestedlists .. _nested_list_to_image: utility.html#nested-list-to-image .. _to_nested_list: utility.html#to-nested-list .. _ccs_from_labeled_image: utility.html#ccs-from-labeled-image .. _clip_image: utility.html#clip-image .. _generate_features: utility.html#generate-features .. _image_copy: utility.html#image-copy .. _image_save: utility.html#image-save .. _mse: utility.html#mse .. _pad_image: utility.html#pad-image .. _reset_onebit_image: utility.html#reset-onebit-image .. _subimage: utility.html#subimage .. _trim_image: utility.html#trim-image .. _XML: xml.html#xml .. _to_xml: xml.html#to-xml .. _to_xml_filename: xml.html#to-xml-filenamegamera-3.3.3/doc/src/plugins_custom_types.txt0000644000076500000000000002135111542717775020360 0ustar chriswheel============================ Custom data types in plugins ============================ Introduction ============ For common datatypes like *Float* or *PointVector*, the Gamera C++/Python argument passing interface provides an automatic wrapping mechanism that is described in `Specifying arguments for plugin generation and dialog boxes`__. .. __: args.html Occasionally, these built in data types are not sufficient, and you need to pass custom types. A typical situation is that your return type is a tuple. An example ========== Assume we need a plugin *grey_stats* that returns both the mean grey value and its variance on a greyscale image. As the return value is a tuple of two values, we cannot use one of the built in data types. We therefore use the generic argument type ``Class`` in the Python wrapper for our plugin. Note that it is a good idea to give more information about the actual return value(s) in the documentation string: .. code:: Python class grey_stats(PluginFunction): """Returns mean and variance of the grey values as a tuple *(m,var)*""" self_type = ImageType([GREYSCALE]) return_type = Class("m_var") On the C++ side, the return type is ``PyObject*`` and can be constructed with any of the conversion functions from the Python C API, e.g. ``Py_BuildValue``: .. code:: CPP template PyObject* grey_stats(const T &img) { size_t i; double Ex = 0.0; // E(X) double Ex2 = 0.0; // E(X^2) FloatVector* hist = histogram(img); for (i=0; i < hist->size(); i++) { Ex += i * (*hist)[i]; Ex2 += i*i * (*hist)[i]; } delete hist; return Py_BuildValue("ff", Ex, Ex2 - Ex*Ex); } In a Python script, the plugin can be called with .. code:: Python (m,v) = img.grey_stats() # or: m,v = img.grey_stats() It is also possible to call the plugin from the C++ side, by simply converting the ``PyObject*`` return value back to C++ data types: .. code:: CPP double m,v; PyObject* obj; obj = grey_stats(img); PyArg_ParseTuple(obj, "ff", &m, &v); Py_DECREF(obj); The last line is necessary to avoid a memory leak. The ``Py_BuildValue`` function returns an `"owned reference"`__ (in Python lingo), which means that it has increased its reference count. To allow the PyObject to be deleted by the Python runtime library, its reference count must be decreased again. The actual deletion of the PyObject will then occur at some point in the future by the Python garbage collector. .. __: http://docs.python.org/extending/extending.html#ownership-rules Receiving a custom type in C++ ============================== When you have a ``PyObject*`` as an input argument of a plugin function, you can convert it to C++ data types with the conversion functions from the `Python C API`__. These are * ``PyInt_AsLong`` and colleagues for ordinary scalar data types * ``PyArg_ParseTuple`` for tuples * ``PyList_GetItem`` for lists * ``PyObject_GetAttrString`` for properties of arbitrary classes .. __: http://docs.python.org/c-api/ A fundamental problem with the conversion from PyObjects is that you can never be sure what actually is in the ``PyObject*``. For instance, when you expect a list and apply ``PyList_GetItem``, you cannot be sure that the ``PyObject*`` actually is a list. Nor can you safely assume that the list entries are of the data type you belive them to be. It is thus generally a good idea to check data types with ``PyList_Check`` and ``PyObject_TypeCheck``, and to throw an exception when the wrong data type enters your function, e.g. .. code:: CPP PyObject* myplugin(PyObject* list) { if(!PyList_Check(list)) throw std::runtime_error("myplugin: Input argument is no list."); // ... } Returning a custom type from C++ ================================ To return a ``PyObject*`` from a plugin function, you can use the conversion functions from the `Python C API`__. These are * ``Py_BuildValue`` for tuples or ordinary scalar values; as for all common scalar data types the Gamera argument wrapping can be used, calling Py_BuildValue for scalar types is usually only necessary for creating PyObjects for passing to returned lists or custom class properties. * ``PyList_New`` and ``PyList_SetItem`` for lists * ``PyInstance_New`` and ``PyObject_SetAttrString`` for arbitrary classes .. __: http://docs.python.org/c-api/ PyObjects returned from a plugin function must always be `"owned references"`__. As both ``Py_Build_Value`` and ``PyList_New`` create owned references, this is usually automatically fulfilled. There is however one special case when you read a list entry from an input list with ``PyList_GetItem`` and write it to a return list with ``PyList_SetItem``. As ``PyList_GetItem`` yields a "borrowed reference", its reference count must be increased if it is to be returned to Python. Here is an example that returns half of the input sequence and fills the rest with zeros: .. __: http://docs.python.org/extending/extending.html#ownership-rules .. code:: CPP PyObject* myplugin(PyObject* list) { size_t n,i; PyObject *retval, *entry; n = PyList_Size(list); retval = PyList_New(n); for (i=0; i reference count must be manually increased (Py_SetItem does not do so) entry = PyList_GetItem(list, i); Py_INCREF(entry); PyList_SetItem(retval, i, entry); } for (i=n/2; i no Py_INCREF necessary entry = Py_BuildValue("i", 0); PyList_SetItem(retval, i, entry); } return retval; } It is important to note that, unlike ``PyList_SetItem``, ``PyList_Append`` adds a reference to the added item, so that ``Py_INCREF`` must not be called in this case. In contrast, when you add an already owned reference to a list with ``PyList_Append``, you must instead decrease its reference count with ``Py_DECREF``: .. code:: CPP PyObject* myplugin(PyObject* list) { size_t n,i; PyObject *retval, *entry; n = PyList_Size(list); retval = PyList_New(0); for (i=0; i Py_DECREF necessary entry = Py_BuildValue("i", 0); PyList_Append(retval, entry); Py_DECREF(entry); } return retval; } Implementing a Python class in C++ ================================== Occasionally it can become necessary to write some methods of a custom Python class in C++. Let us assume, you want to implement the constructor of a custom class *MyClass* in C++. The basic idea is to write a plugin function *create_myclass* that returns an object of type *MyClass* and to call this function in the Python constructor, i.e. in the ``__init__`` method. This requires a Python wrapper of the form: .. code:: Python # the class definition class MyClass: def __init__(self, arg1, arg2): mc = _myplugins.create_myclass(arg1, arg2) # copy over properties from mc to self self.property1 = mc.property1 self.property2 = mc.property2 # ... # the plugin implementing the actual contructor of MyClass class create_myclass(PluginFunction): self_type = None args = Args([Int("arg1"), Real("arg2")]) return_type = Class('myclass', MyClass) The C++ side of the *create_myclass* plugin will then be of the form (this primitive example simply passes the input arguments unaltered to the new class as properties, so it is not very useful, but nevertheless a nice demonstration of the main ideas): .. code:: CPP PyObject* create_myclass(int arg1, double arg2) { // helper variable for temporary property storage PyObject* prop; // helper object for creating class instances (see below) // declared static so this is initialized only once static PyObject* my_class = NULL; // create a dictionary and store the properties therein // Note that PyDict_SetItemString (unlike PyList_SetItem) INCREFs the passed object // => the no longer needed reference returned by Py_BuildValue must be DECREFed PyObject* class_dict = PyDict_New(); prop = Py_BuildValue("i", arg1); PyDict_SetItemString(class_dict, "property1", prop); Py_DECREF(prop); prop = Py_BuildValue("f", arg2); PyDict_SetItemString(class_dict, "property2", prop); Py_DECREF(prop); // create an instance of MyClass from the dictionary if (my_class == NULL) { my_class = PyClass_New(NULL, PyDict_New(), PyString_FromString("MyClass")); } PyObject* ret = PyInstance_NewRaw(my_class, class_dict); Py_DECREF(class_dict); return ret; } gamera-3.3.3/doc/src/relational.txt0000644000076500000000000000702111755375756016216 0ustar chriswheel Relational ========== ``bounding_box_grouping_function`` ---------------------------------- ``bool`` **bounding_box_grouping_function** (``Rect`` *a*, ``Rect`` *b*, int *threshold*) :Returns: ``bool`` :Category: Relational :Defined in: structural.py :Author: Michael Droettboom and Karl MacMillan Given two rectangles *a*, *b*, and a given *threshold* distance (in pixels), returns ``True`` if the two rectangles are closer than *threshold*. ``edit_distance`` ----------------- int **edit_distance** (str *s1*, str *s2*) :Returns: int :Category: Relational :Defined in: structural.py :Author: Christoph Dalitz Computes the edit distance (also known as *Levenshtein distance*) between two strings. This counts the number of character substitutions, additions and deletions necessary to transform one string into another. This plugin is a straightforward implementation of the classic algorithm by Wagner and Fischer, which has runtime complexity *O(m*n)*, where *m* and *n* are the lengths of the two strings. See R.A. Wagner, M.J. Fischer: *The String-to-String Correction Problem.* Journal of the ACM 21, pp. 168-173, 1974. ``least_squares_fit`` --------------------- object **least_squares_fit** ([object *points*]) :Returns: object :Category: Relational :Defined in: structural.py :Author: Michael Droettboom and Karl MacMillan Performs a least squares fit on a given list of points. The result is a tuple of the form (*m*, *b*, *q*) where *m* is the slope of the line, *b* is the *y*-offset, and *q* is the gamma fit of the line to the points. (This assumes the same statistical significance for all points. See Numerical Recipes in C, section 15.2__ for more information. .. __: http://www.library.cornell.edu/nr/bookcpdf/c15-2.pdf ``least_squares_fit_xy`` ------------------------ object **least_squares_fit_xy** ([object *points*]) :Returns: object :Category: Relational :Defined in: structural.py :Author: Christoph Dalitz Identical to *least_squares_fit* for line angles below 45 degrees. For lines with a more vertical slope a least square fit of *x = my + b* is done instead. The result is a tuple of the form (*m*, *b*, *q*, *x_of_y*) where *m, b, q* are the same as in *least_squares_fit*, but the integer value *x_of_y* determines the actual meaning of the parameters *m* and *b*: When *x_of_y* is zero, *y = mx + b*. Otherwise *x = my + b*. ``polar_distance`` ------------------ ``FloatVector`` **polar_distance** (``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] *other*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``FloatVector`` :Category: Relational :Defined in: structural.py :Author: Michael Droettboom and Karl MacMillan Returns a tuple containing the normalized distance, polar direction, and non-normalized polar distance to another glyph (based on center of bounding boxes). ``polar_match`` --------------- int **polar_match** (float *r1*, float *q1*, float *r2*, float *q2*) :Returns: int :Category: Relational :Defined in: structural.py :Author: Michael Droettboom and Karl MacMillan .. warning:: No documentation written. ``shaped_grouping_function`` ---------------------------- ``bool`` **shaped_grouping_function** (``Image`` [OneBit] *a*, ``Image`` [OneBit] *b*, int *threshold*) :Returns: ``bool`` :Category: Relational :Defined in: structural.py :Author: Michael Droettboom and Karl MacMillan Given two connected components *a*, *b*, and a given *threshold* distance (in pixels), returns ``True`` if any pixel in *a* are closer than *threshold* to any pixel in *b*. gamera-3.3.3/doc/src/runlength.txt0000644000076500000000000001636411755375756016104 0ustar chriswheel Runlength ========= ``filter_narrow_runs`` ---------------------- **filter_narrow_runs** (int *length*, ``ChoiceString(strict)`` [black|white] *color*) :Operates on: ``Image`` [OneBit] :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Removes horizontal runs in the given *color* narrower than a given *length*. ---------- **Example 1:** filter_narrow_runs(3, "black") .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/filter_narrow_runs_plugin_00.png :height: 99 :width: 69 ``filter_short_runs`` --------------------- **filter_short_runs** (int *length*, ``ChoiceString(strict)`` [black|white] *color*) :Operates on: ``Image`` [OneBit] :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Removes vertical runs in the given *color* shorter than a given *length*. ---------- **Example 1:** filter_short_runs(3, "black") .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/filter_short_runs_plugin_00.png :height: 99 :width: 69 ``filter_tall_runs`` -------------------- **filter_tall_runs** (int *length*, ``ChoiceString(strict)`` [black|white] *color*) :Operates on: ``Image`` [OneBit] :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Removes vertical runs in the given *color* taller than a given *length*. ---------- **Example 1:** filter_tall_runs(3, "black") .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/filter_tall_runs_plugin_00.png :height: 99 :width: 69 ``filter_wide_runs`` -------------------- **filter_wide_runs** (int *length*, ``ChoiceString(strict)`` [black|white] *color*) :Operates on: ``Image`` [OneBit] :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Removes horizontal runs in the given *color* wider than a given *length*. ---------- **Example 1:** filter_wide_runs(3, "black") .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/filter_wide_runs_plugin_00.png :height: 99 :width: 69 ``from_rle`` ------------ **from_rle** (str *runs*) :Operates on: ``Image`` [OneBit] :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Decodes a string-based run-length encoded version of the image. The numbers alternate between "length of black run" and "length of white run". Runs go left-to-right, top-to-bottom. Runs rollover the right hand edge and continue on the left edge of the next run. To encode an RLE string, use to_rle_. ``iterate_runs`` ---------------- object **iterate_runs** (``ChoiceString(strict)`` [black|white] *color*, ``ChoiceString(strict)`` [horizontal|vertical] *direction*) :Operates on: ``Image`` [OneBit] :Returns: object :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Returns nested iterators over the runs in the given *color* and *direction*. Each run is returned as a Rect object. For example, to iterate over all runs: .. code:: Python for row in image.iterate_black_horizontal_runs(): # All the runs in each row for run in row: print run ``most_frequent_run`` --------------------- int **most_frequent_run** (``ChoiceString(strict)`` [black|white] *color*, ``ChoiceString(strict)`` [horizontal|vertical] *direction*) :Operates on: ``Image`` [OneBit] :Returns: int :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Returns the length of the most frequently occurring run of pixels in the given color and given direction. ---------- **Example 1:** most_frequent_run("black", "horizontal") .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = 9 ``most_frequent_runs`` ---------------------- object **most_frequent_runs** (int *n*, ``ChoiceString(strict)`` [black|white] *color*, ``ChoiceString(strict)`` [horizontal|vertical] *direction*) :Operates on: ``Image`` [OneBit] :Returns: object :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom, after an idea by Christoph Dalitz Returns the lengths of the *n* most frequently occurring runs in the given *color* and *direction*. *n* The number of runlengths to return. If *n* < 0, all runlengths will be returned. The return value is a list of 2-tuples. The first element in the tuple is the run length, and the second element is its frequency. The list is sorted by descending frequency. ---------- **Example 1:** most_frequent_runs(5, "black", "horizontal") .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = [(9, 32), (7, 22), (8, 22), (5, 19), (4, 15)] ``run_histogram`` ----------------- ``IntVector`` **run_histogram** (``ChoiceString(strict)`` [black|white] *color*, ``ChoiceString(strict)`` [horizontal|vertical] *direction*) :Operates on: ``Image`` [OneBit] :Returns: ``IntVector`` :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Returns the histogram of runlengths in the given *color* and *direction*. *return_value* The return value is an integer array. Each index in the array corresponds to a particular run length, and the value at that index is the number of times that that run length occurs in the image. ---------- **Example 1:** run_histogram("black", "horizontal") .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = array('i', [0, 11, 10, 6, 15, 19, 10, 22, 22, 32, 9, 14, 5, 3, 2, 2, 1, 1, 0, 2, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) ``to_rle`` ---------- str **to_rle** () :Operates on: ``Image`` [OneBit] :Returns: str :Category: Runlength :Defined in: runlength.py :Author: Michael Droettboom and Karl MacMillan Encodes a string-based run-length encoded version of the image. The numbers alternate between "length of black run" and "length of white run". Runs go left-to-right, top-to-bottom. Runs rollover the right hand edge and continue on the left edge of the next run. To decode an RLE string, use from_rle_. ---------- **Example 1:** to_rle() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = '42 12 56 17 53 19 61 10 63 9 63 8 64 7 64 7 64 7 64 7 64 7 63 7 64 6 64 7 64 6 65 6 64 6 63 7 63 7 65 5 65 4 66 5 65 5 65 5 64 5 65 5 53 2 10 4 52 4 9 4 52 4 9 5 51 4 9 5 30 5 15 7 7 5 28 8 14 9 5 6 27 7 14 12 2 6 26 8 14 19 28 7 14 5 2 13 28 7 14 6 2 11 29 7 13 8 2 9 30 7 13 9 5 4 31 8 12 10 39 8 11 12 39 7 11 13 38 7 10 5 1 9 10 1 26 7 10 4 3 9 10 2 24 8 8 5 4 9 9 3 24 7 8 4 6 9 10 1 24 8 8 3 7 9 35 7 20 8 34 8 20 8 34 8 19 9 33 9 19 9 33 8 20 9 33 8 20 9 33 8 21 8 32 9 20 9 32 9 20 9 10 1 19 11 20 9 9 2 20 10 20 9 9 2 21 9 20 9 9 2 21 9 20 9 9 2 21 9 20 9 9 2 21 10 19 9 9 1 22 10 19 9 9 1 22 10 19 9 9 1 22 11 18 9 9 1 23 10 18 9 9 1 23 10 18 9 33 10 18 8 34 11 17 8 35 11 16 8 35 11 16 8 35 11 16 8 36 11 15 7 37 11 15 5 33 2 5 11 14 3 33 3 6 12 12 3 33 3 8 11 10 4 17 1 16 2 10 12 6 5 17 5 13 1 11 13 4 4 18 5 27 14 1 4 18 6 29 15 17 8 31 16 10 11 34 35 36 33 39 29 43 25 47 21 52 15 62 4 329 4 36 2 30 4 31 5 32 6 25 5 35 6 21 7 39 11 6 11 46 21 52 14 66 1 27 0 ' gamera-3.3.3/doc/src/script.txt0000755000076500000000000002672411153763734015373 0ustar chriswheel=================================== Getting started with Gamera scripts =================================== Overview -------- While the GUI is great for experimentation, the ultimate goal of any Gamera application is usually an automated application, or script. This provides, among other things, the ability to run unattended in batch mode. Gamera scripts are merely Python scripts (modules) that use Gamera objects and call Gamera functions. The Python language, being a feature-rich general purpose language, provides a number of ways to structure your application. The high-level structure of your application will largely depend on its size and complexity and your own programming preferences and style, and is out of the scope of this document. Obtaining some level of familiarity with Python through the `Python Tutorial`_ or any of the numerous `Python books`__ available is recommended. .. _Python Tutorial: http://docs.python.org/tut/tut.html .. __: http://www.python.org/cgi-bin/moinmoin/PythonBooks The examples below demonstrate how to start creating Gamera-based applications. The source code of these examples are available in the examples directory of the Gamera distribution. Each example builds on the previous one. Hello, world! ------------- To use Gamera in a Python script, you simply need to import the ``gamera.core`` module and then initialize it: .. code:: Python from gamera.core import * init_gamera() After that, you can use Gamera's functions and methods. The following code loads a given file specified on the command line, converts it to a one-bit (binary) image, and then saves the result to "output.png". .. code:: Python import sys # Import the Gamera core and initialize it from gamera.core import * init_gamera() # Load filename specified on the command line. # load_image is a Gamera function to load a TIFF or PNG file. # sys.argv is the Pythonic way to access commandline arguments. # (A better way to deal with commandline arguments in Python # is the optparse module, but that's too much detail for this # example...) image = load_image(sys.argv[-1]) # The variable 'image' now is a reference to the image # Convert the image to onebit using the default Otsu method onebit = image.to_onebit() # Save the result to a PNG file onebit.save_PNG("output.png") That's about as simple as it gets with Gamera, but clearly only about as useful as the ubiquitous "Hello, World!" you see in programming texts. Using the GUI from your scripts ------------------------------- For interactive use, it may be desirable to have the results of a script displayed in a window, rather than saved to a file. (If you do not wish to do this, you can safely skip this section.) This image window will have all of the panning and zooming functionality of the regular Gamera image window, but it will not be possible to use the right-click menu to perform further updates to the image. Using the GUI for a script is convenient, though slightly tricky for two reasons: 1. Any code that displays images or otherwise interacts with the GUI must run inside the GUI thread. The simplest way to do this is to do all work inside of a function, and then pass this function as an argument to ``gui.run()``. This will have the GUI start the application once it has been initialized. 2. One must be careful about the lifetime of image objects. Since Python uses reference counting for memory management, whenever there are no longer any references pointing to an image object, it is automatically deleted. Whenever an image object is deleted, the window is destroyed as well. So to keep windows open for viewing after processing is finished, there needs to be at least one reference remaining. The simplest way to do this is to assign the image to a global variable. The following is the same as the previous example, except rather than saving the result to disk, it is displayed in a Gamera display window. .. code:: Python import sys def my_application(): # Make the image variable a global variable # IF YOU DON'T DO THIS, THE WINDOW WILL DISAPPEAR! global image # Load the image image = load_image(sys.argv[-1]) # Display the image in a window image.display() # Import the Gamera core and initialize it from gamera.core import * init_gamera() # Import the Gamera GUI and start it from gamera.gui import gui gui.run(my_application) # The GUI thread will automatically stop when all windows have # been closed. print "Goodbye!" Using the classifier -------------------- One of Gamera's core features is the classifier, which allows individual images to be classified based on some training. The classifier is described in detail in `the classifier documentation`__. .. __: classify.html The following is an example that loads an image and classifies its connected components based on a given training set. Some training data for what is expected in the image is required in order for this example to work correctly. .. code:: Python import sys def my_application(): global ccs # Load the image, and convert it to onebit image = load_image(sys.argv[-1]) onebit = image.to_onebit() # Get the connected components from the image ccs = onebit.cc_analysis() # Classify the cc's classifier.classify_list_automatic(ccs) # Display the ccs to show their classification display_multi(ccs) # Import the Gamera core and initialize it from gamera.core import * init_gamera() # Import the classifier module from gamera import knn # Create a new classifier classifier = knn.kNNInteractive() # Load some training data classifier.from_xml_filename("training.xml") # Import the Gamera GUI and start it from gamera.gui import gui gui.run(my_application) Advanced use of the classifier ------------------------------ There are a couple of downsides to using the classifier as described in the previous section: - The classifier may not be as accurate as possible - Loading the XML file everytime the script starts up can be time consuming. If one is willing to give up the ability to add more elements to the training set at runtime, both of these problems can be ameliorated. The following example loads a training set from an XML file, and then optimizes it until the user presses Ctrl+C. At the end, the classifier is saved into a fast binary file format using ``serialize``. (If you don't want to use the commandline, there is also a `GUI interface to the GA optimizer available`__.) .. __: gui.html#classifier-optimization-biollante .. note:: It is good practice to retain the XML file, since it is portable across platforms and to future versions of Gamera. The binary format is not guaranteed to be portable. .. code:: Python from sys import stdout # Import the Gamera core and initialise it from gamera.core import * init_gamera() # Import the classifier module and the XML module from gamera import knn, gamera_xml # Since noninteractive classifiers can not be added to after # they are created, we need a set of glyphs to initialize the # classifier with. glyphs = gamera_xml.glyphs_from_xml("training.xml") classifier = knn.kNNNonInteractive(glyphs) # OPTION: # You can also create a noninteractive classifier from an # interactive one: # # classifier = knn.kNNInteractive() # classifier.from_xml("training.xml") # classifier = classifier.noninteractive_copy() # Set up a function that displays the results of the # genetic algorithm as it progresses def optimizer_callback(classifier): stdout.write("Leave one out performance: %02f%%\r" % (classifier.ga_best * 100.0)) stdout.flush() classifier.add_optimization_callback(optimizer_callback) print "Starting optimization (press Ctrl+C to stop)..." # Optimize until the user presses "Ctrl+C" classifier.start_optimizing() try: while 1: # We have to do something do get around a bug # in the Python optimizer x = 0 except KeyboardInterrupt: print "\nCtrl+C pressed" except: pass # When the user presses Ctrl+C *or* any other sort of # error happens, stop optimizing and then save to disk. print "Stopping optimization (please wait...)" final = classifier.stop_optimizing() print "Final leave one out performance: %.02f" % (final * 100.0) print "Saving to disk" classifier.serialize("training.knn") Once you have the serialized version of the classifier, it can be loaded easily from your production script: .. code:: Python from gamera.core import * init_gamera() from gamera import knn # Load the classifier from the binary format classifier = knn.kNNNonInteractive("training.knn") # Then, we can use the classifier as we otherwise would... # Load the image, and convert it to onebit image = load_image(sys.argv[-1]) onebit = image.to_onebit() # Get the connected components from the image ccs = onebit.cc_analysis() # Classify the cc's classifier.classify_list_automatic(ccs) ... Dealing with command line options --------------------------------- Third party scripts are free to deal with command line arguments as they wish. For instance, the Python standard library has two modules for parsing command line arguments, ``getopt`` (deprecated) and ``optparse``. Of course, this freedom means that Gamera will ignore its own command line arguments when run from scripts. There are two ways to deal with this problem: 1. explicitly tell Gamera to parse the command line arguments 2. programmatically set Gamera options Having Gamera parse the command line ```````````````````````````````````` Generally, if your script would rather ignore the command line and pass all command line arguments verbatim to Gamera, simply do the following near the top of the script, but *after* importing Gamera: .. code:: Python from gamera.core import * import sys from gamera.config import config config.parse_args(sys.argv[1:]) Alternatively, you can send "fake" command line arguments for Gamera to parse: .. code:: Python from gamera.core import * from gamera.config import config config.parse_args(["--progress-bar"]) Programmatically setting options ```````````````````````````````` Gamera also provides an API to set its options that normally would come from the command line. Simply use the ``set`` method on the ``config`` object. For example, .. code:: Python from gamera.config import config config.set("progress_bar", True) is directly equivalent to the following command line:: gamera_gui --progress-bar Note that the name of the command line argument is changed to be a valid Python identifier name when used with the ``.set`` method: the hypens (``-``) have been replaced by underscores (``_``). This is the standard behavior of ``optparse``, the command line parsing module that Gamera uses. Where to go from here --------------------- Obviously, there's a lot more to Gamera that isn't covered in this chapter. Where you go from here is largely dependant on the particular document domain. Most of the work in many Gamera applications involves analysing the positional information, symbolic classification and features of the connected components to recognize structure and semantics of the image. A good example of how to put these things together is in ``roman_text.py``, which puts simple left-to-right, top-to-bottom printed text into its reading order. gamera-3.3.3/doc/src/segmentation.txt0000644000076500000000000003215411755375756016566 0ustar chriswheel Segmentation ============ ``cc_analysis`` --------------- [object] **cc_analysis** () :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom and Karl MacMillan Performs connected component analysis on the image. This algorithm assumes 8-connected components, meaning any two pixels are considered "connected" if they are adjacent in any direction, including diagonally. The original image will have all of its pixels "labeled" with a number representing each connected component. This is so the connected components can share data with their source image and makes things much more efficient. Returns a list of ccs found in the image. Since all the CC's share the same data with the original image, changing the CC's will affect the original. If you do not want this behavior, use the image_copy_ function on each of the CCs:: ccs = [x.image_copy() for x in ccs] .. _image_copy: utility.html#image-copy ---------- **Example 1:** cc_analysis() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |cc_analysis_plugin_00_00| |cc_analysis_plugin_00_01| |cc_analysis_plugin_00_02| |cc_analysis_plugin_00_03| |cc_analysis_plugin_00_04| .. |cc_analysis_plugin_00_00| image:: images/cc_analysis_plugin_00_00.png :height: 87 :width: 65 .. |cc_analysis_plugin_00_01| image:: images/cc_analysis_plugin_00_01.png :height: 3 :width: 2 .. |cc_analysis_plugin_00_02| image:: images/cc_analysis_plugin_00_02.png :height: 10 :width: 1 .. |cc_analysis_plugin_00_03| image:: images/cc_analysis_plugin_00_03.png :height: 4 :width: 4 .. |cc_analysis_plugin_00_04| image:: images/cc_analysis_plugin_00_04.png :height: 7 :width: 41 ``cc_and_cluster`` ------------------ [object] **cc_and_cluster** (float *ratio* = 1.00, int *distance* = 2) :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom and Karl MacMillan Performs connected component analysis using cc_analysis_ and then clusters the CC's according to their similarity. TODO: We need some more detailed documentation here. ---------- **Example 1:** cc_and_cluster() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |cc_and_cluster_plugin_00_00| |cc_and_cluster_plugin_00_01| |cc_and_cluster_plugin_00_02| |cc_and_cluster_plugin_00_03| |cc_and_cluster_plugin_00_04| .. |cc_and_cluster_plugin_00_00| image:: images/cc_and_cluster_plugin_00_00.png :height: 87 :width: 65 .. |cc_and_cluster_plugin_00_01| image:: images/cc_and_cluster_plugin_00_01.png :height: 3 :width: 2 .. |cc_and_cluster_plugin_00_02| image:: images/cc_and_cluster_plugin_00_02.png :height: 10 :width: 1 .. |cc_and_cluster_plugin_00_03| image:: images/cc_and_cluster_plugin_00_03.png :height: 4 :width: 4 .. |cc_and_cluster_plugin_00_04| image:: images/cc_and_cluster_plugin_00_04.png :height: 7 :width: 41 ``splitx`` ---------- [object] **splitx** (``FloatVector`` *center* = [0.5]) :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom, Karl MacMillan and Christoph Dalitz Splits an image vertically. The split point is determined automatically by finding a valley in the projections near *center*. This function is overloaded to work both with a single value and a list of splitting point candidates as input. ---------- **Example 1:** splitx() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |splitx_plugin_00_00| |splitx_plugin_00_01| |splitx_plugin_00_02| |splitx_plugin_00_03| |splitx_plugin_00_04| |splitx_plugin_00_05| |splitx_plugin_00_06| |splitx_plugin_00_07| |splitx_plugin_00_08| .. |splitx_plugin_00_00| image:: images/splitx_plugin_00_00.png :height: 56 :width: 28 .. |splitx_plugin_00_01| image:: images/splitx_plugin_00_01.png :height: 6 :width: 7 .. |splitx_plugin_00_02| image:: images/splitx_plugin_00_02.png :height: 4 :width: 4 .. |splitx_plugin_00_03| image:: images/splitx_plugin_00_03.png :height: 6 :width: 15 .. |splitx_plugin_00_04| image:: images/splitx_plugin_00_04.png :height: 76 :width: 36 .. |splitx_plugin_00_05| image:: images/splitx_plugin_00_05.png :height: 3 :width: 2 .. |splitx_plugin_00_06| image:: images/splitx_plugin_00_06.png :height: 10 :width: 1 .. |splitx_plugin_00_07| image:: images/splitx_plugin_00_07.png :height: 12 :width: 23 .. |splitx_plugin_00_08| image:: images/splitx_plugin_00_08.png :height: 7 :width: 25 ``splitx_left`` --------------- [object] **splitx_left** () :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom and Karl MacMillan Splits an image vertically. The split point is determined automatically by finding a valley in the projections near the left of the image. ---------- **Example 1:** splitx_left() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |splitx_left_plugin_00_00| |splitx_left_plugin_00_01| |splitx_left_plugin_00_02| |splitx_left_plugin_00_03| |splitx_left_plugin_00_04| |splitx_left_plugin_00_05| |splitx_left_plugin_00_06| |splitx_left_plugin_00_07| .. |splitx_left_plugin_00_00| image:: images/splitx_left_plugin_00_00.png :height: 53 :width: 19 .. |splitx_left_plugin_00_01| image:: images/splitx_left_plugin_00_01.png :height: 4 :width: 4 .. |splitx_left_plugin_00_02| image:: images/splitx_left_plugin_00_02.png :height: 3 :width: 6 .. |splitx_left_plugin_00_03| image:: images/splitx_left_plugin_00_03.png :height: 87 :width: 45 .. |splitx_left_plugin_00_04| image:: images/splitx_left_plugin_00_04.png :height: 4 :width: 6 .. |splitx_left_plugin_00_05| image:: images/splitx_left_plugin_00_05.png :height: 3 :width: 2 .. |splitx_left_plugin_00_06| image:: images/splitx_left_plugin_00_06.png :height: 10 :width: 1 .. |splitx_left_plugin_00_07| image:: images/splitx_left_plugin_00_07.png :height: 7 :width: 34 ``splitx_max`` -------------- [object] **splitx_max** (``FloatVector`` *center* = [0.5]) :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom, Karl MacMillan and Christoph Dalitz Splits an image vertically. The split point is determined automatically by finding a peak in the projections near *center*. This function is overloaded to work both with a single value and a list of splitting point canidates as input. ---------- **Example 1:** splitx_max() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |splitx_max_plugin_00_00| |splitx_max_plugin_00_01| |splitx_max_plugin_00_02| |splitx_max_plugin_00_03| |splitx_max_plugin_00_04| |splitx_max_plugin_00_05| |splitx_max_plugin_00_06| |splitx_max_plugin_00_07| |splitx_max_plugin_00_08| .. |splitx_max_plugin_00_00| image:: images/splitx_max_plugin_00_00.png :height: 1 :width: 1 .. |splitx_max_plugin_00_01| image:: images/splitx_max_plugin_00_01.png :height: 57 :width: 37 .. |splitx_max_plugin_00_02| image:: images/splitx_max_plugin_00_02.png :height: 4 :width: 4 .. |splitx_max_plugin_00_03| image:: images/splitx_max_plugin_00_03.png :height: 6 :width: 24 .. |splitx_max_plugin_00_04| image:: images/splitx_max_plugin_00_04.png :height: 70 :width: 27 .. |splitx_max_plugin_00_05| image:: images/splitx_max_plugin_00_05.png :height: 3 :width: 2 .. |splitx_max_plugin_00_06| image:: images/splitx_max_plugin_00_06.png :height: 10 :width: 1 .. |splitx_max_plugin_00_07| image:: images/splitx_max_plugin_00_07.png :height: 10 :width: 14 .. |splitx_max_plugin_00_08| image:: images/splitx_max_plugin_00_08.png :height: 7 :width: 16 ``splitx_right`` ---------------- [object] **splitx_right** () :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom and Karl MacMillan Splits an image vertically. The split point is determined automatically by finding a valley in the projections near the right of the image. ---------- **Example 1:** splitx_right() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |splitx_right_plugin_00_00| |splitx_right_plugin_00_01| |splitx_right_plugin_00_02| |splitx_right_plugin_00_03| |splitx_right_plugin_00_04| |splitx_right_plugin_00_05| |splitx_right_plugin_00_06| .. |splitx_right_plugin_00_00| image:: images/splitx_right_plugin_00_00.png :height: 7 :width: 18 .. |splitx_right_plugin_00_01| image:: images/splitx_right_plugin_00_01.png :height: 61 :width: 54 .. |splitx_right_plugin_00_02| image:: images/splitx_right_plugin_00_02.png :height: 3 :width: 2 .. |splitx_right_plugin_00_03| image:: images/splitx_right_plugin_00_03.png :height: 10 :width: 1 .. |splitx_right_plugin_00_04| image:: images/splitx_right_plugin_00_04.png :height: 4 :width: 4 .. |splitx_right_plugin_00_05| image:: images/splitx_right_plugin_00_05.png :height: 7 :width: 41 .. |splitx_right_plugin_00_06| image:: images/splitx_right_plugin_00_06.png :height: 30 :width: 10 ``splity`` ---------- [object] **splity** (``FloatVector`` *center* = [0.5]) :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom, Karl MacMillan and Christoph Dalitz Splits an image horizontally. The split point is determined automatically by finding a valley in the projections near *center*. This function is overloaded to work both with a single value and a list of splitting point canidates as input. ---------- **Example 1:** splity() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |splity_plugin_00_00| |splity_plugin_00_01| |splity_plugin_00_02| |splity_plugin_00_03| |splity_plugin_00_04| |splity_plugin_00_05| |splity_plugin_00_06| .. |splity_plugin_00_00| image:: images/splity_plugin_00_00.png :height: 45 :width: 44 .. |splity_plugin_00_01| image:: images/splity_plugin_00_01.png :height: 15 :width: 21 .. |splity_plugin_00_02| image:: images/splity_plugin_00_02.png :height: 3 :width: 2 .. |splity_plugin_00_03| image:: images/splity_plugin_00_03.png :height: 41 :width: 52 .. |splity_plugin_00_04| image:: images/splity_plugin_00_04.png :height: 10 :width: 1 .. |splity_plugin_00_05| image:: images/splity_plugin_00_05.png :height: 4 :width: 4 .. |splity_plugin_00_06| image:: images/splity_plugin_00_06.png :height: 7 :width: 41 ``splity_bottom`` ----------------- [object] **splity_bottom** () :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom and Karl MacMillan Splits an image horizontally. The split point is determined automatically by finding a valley in the projections near the bottom of the image. ---------- **Example 1:** splity_bottom() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |splity_bottom_plugin_00_00| |splity_bottom_plugin_00_01| |splity_bottom_plugin_00_02| |splity_bottom_plugin_00_03| |splity_bottom_plugin_00_04| |splity_bottom_plugin_00_05| |splity_bottom_plugin_00_06| .. |splity_bottom_plugin_00_00| image:: images/splity_bottom_plugin_00_00.png :height: 72 :width: 44 .. |splity_bottom_plugin_00_01| image:: images/splity_bottom_plugin_00_01.png :height: 42 :width: 26 .. |splity_bottom_plugin_00_02| image:: images/splity_bottom_plugin_00_02.png :height: 3 :width: 2 .. |splity_bottom_plugin_00_03| image:: images/splity_bottom_plugin_00_03.png :height: 10 :width: 1 .. |splity_bottom_plugin_00_04| image:: images/splity_bottom_plugin_00_04.png :height: 4 :width: 4 .. |splity_bottom_plugin_00_05| image:: images/splity_bottom_plugin_00_05.png :height: 14 :width: 46 .. |splity_bottom_plugin_00_06| image:: images/splity_bottom_plugin_00_06.png :height: 7 :width: 41 ``splity_top`` -------------- [object] **splity_top** () :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Segmentation :Defined in: segmentation.py :Author: Michael Droettboom and Karl MacMillan Splits an image horizontally. The split point is determined automatically by finding a valley in the projections near the top of the image. ---------- **Example 1:** splity_top() .. image:: images/OneBit_generic.png :height: 99 :width: 69 |splity_top_plugin_00_00| |splity_top_plugin_00_01| |splity_top_plugin_00_02| |splity_top_plugin_00_03| |splity_top_plugin_00_04| |splity_top_plugin_00_05| .. |splity_top_plugin_00_00| image:: images/splity_top_plugin_00_00.png :height: 24 :width: 29 .. |splity_top_plugin_00_01| image:: images/splity_top_plugin_00_01.png :height: 62 :width: 64 .. |splity_top_plugin_00_02| image:: images/splity_top_plugin_00_02.png :height: 3 :width: 2 .. |splity_top_plugin_00_03| image:: images/splity_top_plugin_00_03.png :height: 10 :width: 1 .. |splity_top_plugin_00_04| image:: images/splity_top_plugin_00_04.png :height: 4 :width: 4 .. |splity_top_plugin_00_05| image:: images/splity_top_plugin_00_05.png :height: 7 :width: 41 gamera-3.3.3/doc/src/shearing.txt0000644000076500000000000000247511310774405015651 0ustar chriswheel Shearing ======== ``shear_column`` ---------------- **shear_column** (int *column*, int *distance*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Shearing :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Shears a given column by a given amount. *column* The column number to shear. *distance* The number of pixels to move the column. Positive values move the column downward. Negative values move the column upward. ---------- **Example 1:** shear_column(50, 10) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/shear_column_plugin_00.png :height: 99 :width: 69 ``shear_row`` ------------- **shear_row** (int *row*, int *distance*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Shearing :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Shears a given row by a given amount. *row* The row number to shear. *distance* The number of pixels to move the row. Positive values move the row to the right. Negative values move the row to the left. ---------- **Example 1:** shear_row(50, 10) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/shear_row_plugin_00.png :height: 99 :width: 69 gamera-3.3.3/doc/src/thinning.txt0000644000076500000000000001165611755375756015713 0ustar chriswheel Thinning ======== ``medial_axis_transform_hs`` ---------------------------- ``Image`` [OneBit] **medial_axis_transform_hs** () :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Thinning :Defined in: thinning.py :Author: Michael Droettboom and Karl MacMillan (based on code by ˜ivind Due Trier and Qian Huang) "This function is an alias for thin_hs_. ---------- **Example 1:** medial_axis_transform_hs() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/medial_axis_transform_hs_plugin_00.png :height: 99 :width: 69 ``medial_axis_transform_large_image_hs`` ---------------------------------------- ``Image`` [OneBit] **medial_axis_transform_large_image_hs** () :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Thinning :Defined in: thinning.py :Author: Michael Droettboom and Karl MacMillan (based on code by ˜ivind Due Trier and Qian Huang) This function is an alias for thin_hs_large_image_. ---------- **Example 1:** medial_axis_transform_large_image_hs() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/medial_axis_transform_large_image_hs_plugin_00.png :height: 99 :width: 69 ``thin_hs`` ----------- ``Image`` [OneBit] **thin_hs** () :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Thinning :Defined in: thinning.py :Author: Michael Droettboom and Karl MacMillan (based on code by ˜ivind Due Trier and Qian Huang) Derives the medial axis transformation from a ONEBIT image using the Haralick and Shapiro algorithm. Unlike thin_zs_ and thin_lc_, this function performs a medial axis transformation, and the ends of the skeleton extend to the corners of the original image. Consider using thin_hs_large_image_ instead, for faster performance on large images with a lot of connected components. R. M. Haralick and L. G. Shapiro. 1992. *Computer and Robot Vision*, Vol. 1, Chapter 5 (especially 5.10.1). Reading, MA: Addison-Wesley. ---------- **Example 1:** thin_hs() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/thin_hs_plugin_00.png :height: 99 :width: 69 ``thin_hs_large_image`` ----------------------- ``Image`` [OneBit] **thin_hs_large_image** () :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Thinning :Defined in: thinning.py :Author: Michael Droettboom and Karl MacMillan (based on code by ˜ivind Due Trier and Qian Huang) Thins (skeletonizes) a ONEBIT image using the Haralick and Shapiro algorithm. Unlike thin_hs_, this algorithm performs skeletonization on one connected component at a time. On large images with a lot of connected components, this can be significantly faster. However, for small images with a single connected component, this has unnecessary overhead, which is why both versions are included. Please note cc_analysis results in a labelled image, which you can reset afterwards with reset_onebit_image(). ---------- **Example 1:** thin_hs_large_image() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/thin_hs_large_image_plugin_00.png :height: 99 :width: 69 ``thin_lc`` ----------- ``Image`` [OneBit] **thin_lc** () :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Thinning :Defined in: thinning.py :Author: Michael Droettboom and Karl MacMillan (based on code by ˜ivind Due Trier and Qian Huang) Thins (skeletonizes) a ONEBIT image using the Lee and Chen algorithm. This function is a simple extension to the Zhang and Suen algorithm in thin_zs_ that ensure that no two pixels are more than 4-connected. The resulting skeleton is not a medial axis transformation, and the ends of the skeleton will not extend to the edges of the original image. H.-J. Lee and B. Chen. 1992. Recognition of handwritten chinese characters via short line segments. *Pattern Recognition*. 25(5) 543-552. ---------- **Example 1:** thin_lc() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/thin_lc_plugin_00.png :height: 99 :width: 69 ``thin_zs`` ----------- ``Image`` [OneBit] **thin_zs** () :Operates on: ``Image`` [OneBit] :Returns: ``Image`` [OneBit] :Category: Thinning :Defined in: thinning.py :Author: Michael Droettboom and Karl MacMillan (based on code by ˜ivind Due Trier and Qian Huang) Thins (skeletonizes) a ONEBIT image using the Zhang and Suen algorithm. The resulting skeleton is not a medial axis transformation, and the ends of the skeleton will not extend to the edges of the original image. T. Y. Zhang and C. Y. Suen. 1984. A Fast Parallel Algorithm for Thinning Digital Patterns., *Communications of ACM*, 2(3). R. C. Gonzalez and P. Wintz. 1987 *Digital Image Processing.*, 2. edition. 398-402. ---------- **Example 1:** thin_zs() .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/thin_zs_plugin_00.png :height: 99 :width: 69 gamera-3.3.3/doc/src/thresholding.txt0000644000076500000000000001604511310774405016541 0ustar chriswheel Thresholding ============ ``abutaleb_threshold`` ---------------------- ``Image`` [OneBit] **abutaleb_threshold** (``Choice`` [dense|rle] *storage format*) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Thresholding :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by using the Abutaleb locally-adaptive thresholding algorithm. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression ---------- **Example 1:** abutaleb_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/abutaleb_threshold_plugin_00.png :height: 67 :width: 96 ``bernsen_threshold`` --------------------- ``Image`` [OneBit] **bernsen_threshold** (``Choice`` [dense|rle] *storage format*, int(1, 50) *region size* = 20, int(0, 255) *contrast limit* = 5, ``bool`` *doubt*) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Thresholding :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by using the Bernsen algorithm. *storage_format* specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression *region_size* The size of each region in which to calculate a threshold *contrast_limit* The minimum amount of contrast required to threshold. *doubt* When True, *doubt* is low. ---------- **Example 1:** bernsen_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/bernsen_threshold_plugin_00.png :height: 67 :width: 96 ``djvu_threshold`` ------------------ ``Image`` [OneBit] **djvu_threshold** (float(0.00, 1.00) *smoothness* = 0.20, int *max_block_size* = 512, int *min_block_size* = 64, int(1, 8) *block_factor* = 2) :Operates on: ``Image`` [RGB] :Returns: ``Image`` [OneBit] :Category: Thresholding :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by using the DjVu thresholding algorithm. See Section 5.1 in: Bottou, L., P. Haffner, P. G. Howard, P. Simard, Y. Bengio and Y. LeCun. 1998. High Quality Document Image Compression with DjVu. AT&T Labs, Lincroft, NJ. http://research.microsoft.com/~patrice/PDF/jei.pdf This implementation features an additional extension to the algorithm described above. Once the background and foreground colors are determined for each block, the image is thresholded by interpolating the foreground and background colors between the blocks. This prevents "blockiness" along boundaries of strong color change. *smoothness* The amount of effect that parent blocks have on their children blocks. Higher values will result in more smoothness between blocks. Expressed as a percentage between 0.0 and 1.0. *max_block_size* The size of the largest block to determine a threshold. *min_block_size* The size of the smallest block to determine a threshold. *block_factor* The number of child blocks (in each direction) per parent block. For instance, a *block_factor* of 2 results in 4 children per parent. ---------- **Example 1:** djvu_threshold(0.5, 512, 64, 2) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/djvu_threshold_plugin_00.png :height: 129 :width: 227 ``otsu_find_threshold`` ----------------------- int **otsu_find_threshold** () :Operates on: ``Image`` [GreyScale] :Returns: int :Category: Thresholding :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Finds a threshold point using the Otsu algorithm. Reference: N. Otsu: *A Threshold Selection Method from Grey-Level Histograms.* IEEE Transactions on Systems, Man, and Cybernetics (9), pp. 62-66 (1979) ---------- **Example 1:** otsu_find_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 *result* = 143 ``otsu_threshold`` ------------------ ``Image`` [OneBit] **otsu_threshold** (``Choice`` [dense|rle] *storage format*) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Thresholding :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by splitting along a threshold value determined using the Otsu algorithm. Equivalent to ``image.threshold(image.otsu_find_threshold())``. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression ---------- **Example 1:** otsu_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/otsu_threshold_plugin_00.png :height: 67 :width: 96 ``threshold`` ------------- ``Image`` [OneBit] **threshold** (int *threshold*, ``Choice`` [dense|rle] *storage format*) :Operates on: ``Image`` [GreyScale|Grey16|Float] :Returns: ``Image`` [OneBit] :Category: Thresholding :Defined in: threshold.py :Author: Michael Droettboom and Karl MacMillan Creates a binary image by splitting along a given threshold value. Pixels that are greater than the given value become white. Pixels less than the given value become black. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression. ---------- **Example 1:** threshold(128) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/threshold_plugin_00.png :height: 67 :width: 96 ``tsai_moment_preserving_find_threshold`` ----------------------------------------- int **tsai_moment_preserving_find_threshold** () :Operates on: ``Image`` [GreyScale] :Returns: int :Category: Thresholding :Defined in: threshold.py :Author: Uma Kompella Finds a threshold point using the Tsai Moment Preserving threshold algorithm. Reference: W.H. Tsai: *Moment-Preserving Thresholding: A New Approach.* Computer Vision Graphics and Image Processing (29), pp. 377-393 (1985) ---------- **Example 1:** tsai_moment_preserving_find_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 *result* = 153 ``tsai_moment_preserving_threshold`` ------------------------------------ ``Image`` [OneBit] **tsai_moment_preserving_threshold** (``Choice`` [dense|rle] *storage format*) :Operates on: ``Image`` [GreyScale] :Returns: ``Image`` [OneBit] :Category: Thresholding :Defined in: threshold.py :Author: Uma Kompella Creates a binary image by splitting along a threshold value determined using the Tsai Moment Preserving Threshold algorithm. Equivalent to ``image.threshold(image.tsai_moment_preserving_find_threshold())``. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression ---------- **Example 1:** tsai_moment_preserving_threshold() .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/tsai_moment_preserving_threshold_plugin_00.png :height: 67 :width: 96 gamera-3.3.3/doc/src/training_tutorial.txt0000644000076500000000000003447011715210435017604 0ustar chriswheel================= Training tutorial ================= This tutorial walks through the process of creating training data using the Gamera GUI. The training GUI is designed to be as flexible as possible, so this tutorial represents just one possible approach, while introducing most of the key features and concepts. For this example, we will be training on pages from the `Statistical Accounts of Scotland`__. The demo pages used in this tutorial we be made available through the Gamera website soon. .. __: http://edina.ac.uk/statacc/ The goal during the run of this tutorial is to create enough training data that the classifier will perform well on new pages. Starting the GUI ---------------- There is a ``gamera_gui`` script installed somewhere on your system (this location is platform-specific, see `Building and Installing Gamera`__). Run it to start the Gamera GUI. .. __: install.html Console window -------------- .. image:: images/tutorial_console.png The first thing displayed is the console window. It won't be used for anything in this tutorial, other than starting up the classifier interface. Classifier window ----------------- From the console window, start the interactive classifier window. **Classify -> Interactive Classifier** When prompted for a name for the result, simply click **Ok** to accept the default. This will open an empty classifier window. .. image:: images/tutorial_classifier_window.png The classifier window always starts from a clean slate: there is no data in the classifier and it does not yet have an image to use as a source. Opening and segmenting an image ------------------------------- First, load a page image. **Image -> Open and segment image...** This loads an image into the training interface, segments it into its parts, and then puts those parts into the page glyphs pane in the training interface. The method used to segment the image into its parts is user-selectable, and will depend on the type of documents being trained. For instance, if the document were sheet music, the segmenter would need to first remove the staff lines. Most often you will use the default segmentation method, connected component analysis (``cc_analysis``), which will separate all of the contiguous groups of black pixels on the page. For the purposes of this tutorial, select the filename for the first page and use the default segmentation method ``cc_analysis``. .. image:: images/tutorial_open_and_segment_image.png When the page has been loaded, the connected components will be displayed in the **Page glyphs** pane (upper right), and the original image will be in the pane below. .. image:: images/tutorial_starting_training.png Selecting glyphs ---------------- Glyphs can be selected in a number of ways: - By clicking and dragging across cells in the page glyphs pane. - By clicking on glyphs in the original image display. - By dragging a bounding box around glyphs in the original image display. - Adding/removing glyphs from the selection by selecting while holding down the **Shift** key. The selection in the page glyphs pane and on the original image are automatically synchronized. The status bar displayed the number of selected glyphs. Experiment with the different selection methods to get a feel for the interface. .. image:: images/tutorial_selection.png .. image:: images/tutorial_selection2.png Beginning training ------------------ Now, to begin training. Training is simply the act of assigning names to each of the glyphs. In Gamera, these names are made up of dot-delimited tokens. (See `class names`__.) .. __: gui.html#class-names To see what's happening behind the scenes as we're training, open the **Classifier glyphs** pane by pressing the **+** button in the **Page glyphs** title bar. .. image:: images/tutorial_classifier_glyphs_pane.png Since the example being used for this tutorial is text, the characters will be named to conform to Unicode character names. This will allow class names to conveniently map to characters when OCR is output from a Gamera-based system. In Unicode, the character name for ``A`` is ``LATIN CAPITAL LETTER A`` and for ``a`` is ``LATIN SMALL LETTER A`` etc.. To fit these names into Gamera's naming convention, they can be adapted to ``latin.capital.letter.a`` and ``latin.small.letter.a``. Of course, for non-textual documents, a different naming convention may have to be devised. The page glyphs are sorted roughly by size. The first few glyphs are generally specks of dust or bits of broken characters on the page. It's generally easiest to start with the glyphs that make up whole characters and then deal with the broken characters later. To classify a glyph, select it, type its name and press **Enter**. For this example, scroll down to where the first few legitimate characters appear. In the example below, the ``w`` was selected, then ``latin.small.letter.w`` was entered, followed by **Enter** to confirm the classification. .. image:: images/tutorial_first_character.png Note that the following things happen upon manual classification: - Most importantly, the glyph is added to the classifier (as shown by its appearance in the classifier glyphs pane). - The glyph changes color to green, which indicates that it was classified by a human trainer. - The class name is added to the tree of class names on the left. - The status bar at the bottom is updated to show how many glyphs are in the classifier. Bootstrap the classifier by continuing in this fashion for a dozen or more characters. If you make a mistake, you can simply reselect the glyph and give it a new class name. Note that you can also select multiple glyphs and train them in one step, as illustrated in the following picture. .. image:: images/tutorial_more_training.png Using auto-move --------------- Of course, continuing to train in this fashion gets tedious and involves a lot of "mousing around". The **auto-move** mode will automatically move to the next glyph after each glyph is trained. It will also guess the class of unclassified symbols automatically, meaning the trainer only needs to confirm or correct the classifier's guess. Turn on **auto-move** mode by clicking the .. image:: images/icon_next_unclass.png toolbar button. When this button is toggled on, the training interface will automatically move to the next unclassified (white) glyph after each manual classification is made. To try it out, select an unclassified glyph to start with. Type its class name and press **Enter**. The selection will automatically move to the next unclassified glyph, with a "guess" displayed in a box underneath the glyph and automatically entered in the textbox in the upper left. If this guess is correct, simply press **Enter** to confirm and add the glyph to the classifier with that class name. If the guess is incorrect, it may be edited and then submitted by pressing **Enter**. .. image:: images/tutorial_auto_move.png Other useful keystrokes while in **auto-move** mode are: - **F12**: Skip the currently selected glyph and move on to the next one. - **F11**: Back up one glyph to reclassify. It's also useful to close the **Classifier glyphs** pane to increase training speed. With **auto-move** mode and these keystrokes, it is possible to train quite efficiently by keeping one's hands on the keyboard. Training broken characters -------------------------- Occasionally, characters will be broken into multiple glyphs, either because the ink has degraded or the imaging is poor. Also, it may be that the character itself is intentionally broken, such as the lower case *i*. For these cases, in the original image display, drag a bounding box around the connected components that make up the character. (It may be useful to zoom in on the image.) Then train the collection with a class name beginning with ``_group.``. For instance, in the following example, the parts that make up the letter ``N`` are selected, and then trained as ``_group.latin.capital.letter.n``. .. image:: images/tutorial_grouping.png The union of the parts will be stored as a single glyph in the training dataset. Note that when you later in the recognition stage want to recognize glyphs that are broken, intentionally like the letter "i" or unintentionally, you must use the ``group_list_automatic`` classifier method. Saving the training data ------------------------ It is good practice to regularly save the training data. Use the menu item **File -> Classifier glyphs -> Save glyphs in classifier...** to save the training data. .. note:: There is no auto-save feature, so be sure to save your work often. Once the entire page has been classified, save it to a file called ``tutorial_page1.xml``. .. note:: If you don't want to take the time to train the entire page, you can load this training data from the tutorial using the menu option **File -> Classifier glyphs -> Open glyphs into classifier...** and selecting ``tutorial_page1.xml``. On to the second page --------------------- Once the first page has been trained, the next page can be loaded in by using **Image -> Open and segment image...** Note that the **page glyphs** have been replaced with the contents of the new page, but the **classifier glyphs** (the training data) remains the same. Since there is already some training data in the classifier, it won't need to be bootstrapped as it was for the first page. The existing classifier data can be used to classify the second page, and then the user can go through and correct the classifier's mistakes. To run the classifier over the **page glyphs**, use the menu option **Classifier -> Group and guess all**. After some time, all of the glyphs on the page will have been classified, and grouped if necessary. Note that the automatically classified glyphs are displayed in red. The glyphs on the page will be sorted by their class name. Within each class name it is fairly easy to scan for incorrectly identified symbols. Note that the glyphs within each class name are sorted by decreasing confidence. Often the glyphs near the beginning will appear more like the training data and the glyphs near the end will be more unlike the training data. .. image:: images/tutorial_second_page.png Once going through and correcting all of the classifier's mistakes, it is good practice to "reward" all of its correct guesses by confirming them. **Classifier -> Confirm all** will add all of the automatically classified glyphs on the page to the classifier as if they were manually classified. *Again, don't forget to save the training data.* And another page... ------------------- For the sake of this tutorial, it will be assumed that some time has lagged between training the second page and the third page, in order to demonstrate how the training process can be continued. Close Gamera and start it up again. After opening the classifier window, you can continue training by loading in the existing training into the classifier using **File -> Classifier glyphs -> Open glyphs into classifier...** and loading the next image using **Image -> Open and segment image...**. Training can then proceed as for the second page. If all is going well, each successive page should require less manual correction. Optimizing the classifier ------------------------- It is impossible to say how much training data is "enough", and that whole question is well beyond the scope of this tutorial. When you have a representative amount of data collected, however, it may be a good idea to optimize the classifier. In short, optimization involves deciding the relative weight (or importance) of each of the features used for classification. There are many ways to do this, but one that requires minimal manual intervention is an optimizer based on a Genetic Algorithm (GA). Gamera includes a GA for this purpose called Biollante. Once you have saved your training data, start Biollante using **File -> Biollante...** from the main Gamera console. .. image:: images/tutorial_biollante_start.png Load the training data into by going to **File -> Open data...**. You will then by prompted to select the initial set of features used for classification. For now, leave them all turned on. The optimizer will run much slower with all the features, but at this point it is unknown which features are going to be most useful for this domain. .. image:: images/tutorial_feature_selection.png There are some parameters to set for the optimizer. These are typical parameters for Genetic Algorithms, and changing them may help the GA arrive at an optimum faster. For now, let's leave all settings at their defaults. Start the optimizer using **Optimizer -> Start**. As the GA works, it will display the original recognition rate (with all feature weights set to 1.0), and the best rate seen so far. After a few generations have run, look at the **Best weights** tab. This tab shows the weights of each of the features in the best found combination. From this, one can get a rough idea of which features are more important to classification. It's important to note that GAs involve a lot of randomization, and will obtain different results on successive runs. .. image:: images/tutorial_biollante_weights.png After running for some time, stop the optimzier using **Optimizer -> Stop**. To speed up the optimization somewhat, we'll turn off features that don't seem to have very high weights. This can be done by either looking at the **Best weights** tab, or saving the weights out to an XML file and analysing them there. For my particular data and run of the optimizer, it seemed best to turn off the following features: area, black_area, compactness, ncols_features, nrows_features, top_bottom, volume64regions, and zernike_moments. Change the set of features by going to **Optimizer -> Features** and set as follows: .. image:: images/tutorial_biollante_features_subset.png Start the optimizer again. The generations should increase faster now, as there are fewer calculations involved. When the optimizer arrives at a reasonable performance rate, stop it and save the settings using **File -> Save settings...**. These settings can be loaded into a classifier by a Gamera application as the data is loaded. The end ------- That's the gist of training with Gamera. Of course, there are a lot more methodologies and tricks possible. Enjoy! gamera-3.3.3/doc/src/transformation.txt0000644000076500000000000001305011755375757017132 0ustar chriswheel Transformation ============== ``mirror_horizontal`` --------------------- **mirror_horizontal** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Transformation :Defined in: transformation.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Flips the image across the horizontal (*x*) axis. ---------- **Example 1:** mirror_horizontal() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/mirror_horizontal_plugin_00.png :height: 129 :width: 227 ``mirror_vertical`` ------------------- **mirror_vertical** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Transformation :Defined in: transformation.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Flips the image across the vertical (*y*) axis. ---------- **Example 1:** mirror_vertical() .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/mirror_vertical_plugin_00.png :height: 129 :width: 227 ``resize`` ---------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **resize** (``Dim`` *dim*, ``Choice`` [None|Linear|Spline] *interp_type*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Transformation :Defined in: transformation.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Returns a resized copy of an image. In addition to size, the type of interpolation can be specified, with a tradeoff between speed and quality. If you need to maintain the aspect ratio of the original image, consider using scale_ instead. *dim* The size of the resulting image. *interp_type* [None|Linear|Spline] The type of interpolation used to resize the image. Each option is progressively higher quality, yet slower. .. _scale: #scale ``rotate`` ---------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **rotate** (float(-180.00, 180.00) *angle*, Pixel *bgcolor* = None, int(1, 3) *order* = 1) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Transformation :Defined in: transformation.py :Author: Michael Droettboom (With code from VIGRA by Ullrich Kĥthe) Rotates an image. *angle* The angle of rotation (in degrees) *bgcolor* The color to use for pixels outside of the original image bounds. When *bgcolor* is ``None``, white is used. *order* The order of the spline used for interpolation. Must be between 1 - 3. ---------- **Example 1:** rotate(32.0, (255, 255, 255), 3) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/rotate_plugin_00.png :height: 233 :width: 265 **Example 2:** rotate(15.0, 0j, 3) .. image:: images/GreyScale_generic.png :height: 67 :width: 96 .. image:: images/rotate_plugin_01.png :height: 93 :width: 114 ``scale`` --------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **scale** (float *scaling*, ``Choice`` [None|Linear|Spline] *interp_type*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Transformation :Defined in: transformation.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Returns a scaled copy of the image. In addition to scale, the type of interpolation can be specified, with a tradeoff between speed and quality. If you need to change the aspect ratio of the original image, consider using resize_ instead. *scale* A scaling factor. Values greater than 1 will result in a larger image. Values less than 1 will result in a smaller image. *interp_type* [None|Linear|Spline] The type of interpolation used to resize the image. Each option is progressively higher quality, yet slower. .. _resize: #resize ---------- **Example 1:** scale(0.5, 2) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/scale_plugin_00.png :height: 64 :width: 113 **Example 2:** scale(2.0, 2) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/scale_plugin_01.png :height: 259 :width: 455 ``shear_column`` ---------------- **shear_column** (int *column*, int *distance*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Transformation :Defined in: transformation.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Shears a given column by a given amount. *column* The column number to shear. *distance* The number of pixels to move the column. Positive values move the column downward. Negative values move the column upward. ---------- **Example 1:** shear_column(50, 10) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/shear_column_plugin_00.png :height: 99 :width: 69 ``shear_row`` ------------- **shear_row** (int *row*, int *distance*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Transformation :Defined in: transformation.py :Author: Michael Droettboom, Karl MacMillan, and Christoph Dalitz Shears a given row by a given amount. *row* The row number to shear. *distance* The number of pixels to move the row. Positive values move the row to the right. Negative values move the row to the left. ---------- **Example 1:** shear_row(50, 10) .. image:: images/OneBit_generic.png :height: 99 :width: 69 .. image:: images/shear_row_plugin_00.png :height: 99 :width: 69 gamera-3.3.3/doc/src/unit_testing.txt0000644000076500000000000000553211222436501016554 0ustar chriswheel======================== Unit testing with Gamera ======================== Introduction ============ Gamera does not contain its own unit testing framework, but instead uses the great `py.test`__ framework. .. note:: **py.test** is still considered beta-level software, and is somewhat cumbersome to install (perhaps the same could be said about Gamera). It is not required for proper operation of Gamera, and is only needed for those developers who wish to port Gamera to new platforms or write unit tests for new code. .. __: http://codespeak.net/py/dist/test.html This document does not attempt to replicate the `py.test`__ documentation, and will only discuss Gamera-specific additions. .. __: http://codespeak.net/py/dist/test.html Running the provided unit tests =============================== 1. Install and test `py.test` using the instructions here__. .. __: http://codespeak.net/py/dist/test.html 2. From the *gamera/tests* directory, run all the unit tests with the command:: py.test --tb=no Alternatively, you can run an individual test, say *test_graph.py* with:: py.test --tb=no test_graph.py In case of failures you can obtain more information by omitting the option "--tb=no". 3. If you only want to run a single test function from a unit test script, use the "keyword" option "-k", e.g.:: py.test -k test_glyphs_from_xml_gz test_xml.py Adding new unit tests ===================== A new unit test, say *test_mystuff.py*, is added by the following steps: 1. Create a new test script *test_mystuff.py* which imports gamera and py.test: .. code:: Python import py.test from gamera.core import * init_gamera() 2. Define for each test a function with the prefix ``test_``. py.test will run all these functions. To verify certain results, use the ``assert`` statement, e.g.: .. code:: Python def test_something(): img = load_image("data/OneBit_generic.png") assert img.myplugin(3) == 42 3. To verify that certain circumstances (e.g., wrong input data) lead to an exception, use ``py.test.raises``: .. code:: Python def test_wronginput(): def _fail(img): img.myplugin("should only be numeric") img = load_image("data/OneBit_generic.png") py.test.raises(Exception, _fail, img) For more details, see the `py.test documentation`__. .. __: http://codespeak.net/py/dist/test.html Testing Gamera plugins ====================== The unit test in ``gamera/tests/test_plugins.py`` will load and run the ``doc_example`` functions of all plugins available in Gamera. Therefore, writing a unit test for a Gamera plugin is often as simple as writing a ``doc_example`` plugin with the function. This is explained in `Writing Plugins: Documenting and unit-testing Plugin functions`__. .. __: writing_plugins.html#documenting-and-unit-testing-plugin-functions gamera-3.3.3/doc/src/utility.txt0000644000076500000000000007174111755375757015602 0ustar chriswheel Utility ======= NestedLists ----------- ``nested_list_to_image`` ```````````````````````` ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **nested_list_to_image** (object *nested_list*, ``Choice`` [ONEBIT|GREYSCALE|GREY16|RGB|FLOAT] *image_type*) :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Utility/NestedLists :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Converts a nested Python list to an Image. Is the inverse of ``to_nested_list``. *nested_list* A nested Python list in row-major order. If the list is a flat list, an image with a single row will be created. *image_type* The resulting image type. Should be one of the integer Image type constants (ONEBIT, GREYSCALE, GREY16, RGB, FLOAT). If image_type is not provided or less than 0, the image type will be determined by auto-detection from the list. The following list shows the mapping from Python type to image type: - int -> GREYSCALE - float -> FLOAT - RGBPixel -> RGB To obtain other image types, the type number must be explicitly passed. NOTE: This will not scale very well and should only be used for small images, such as convolution kernels. Examples: .. code:: Python # Sobel kernel (implicitly will be a FLOAT image) kernel = nested_list_to_image([[0.125, 0.0, -0.125], [0.25 , 0.0, -0.25 ], [0.125, 0.0, -0.125]]) # Single row image (note that nesting is optional) image = nested_list_to_image([RGBPixel(255, 0, 0), RGBPixel(0, 255, 0), RGBPixel(0, 0, 255)]) ``to_nested_list`` `````````````````` object **to_nested_list** () :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: object :Category: Utility/NestedLists :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Converts an image to a nested Python list. This method is the inverse of ``nested_list_to_image``. The following table describes how each image type is converted to Python types: - ONEBIT -> int - GREYSCALE -> int - GREY16 -> int - RGB -> RGBPixel - FLOAT -> float NOTE: This will not scale very well and should only be used for small images, such as convolution kernels. ---------- **Example 1:** to_nested_list() .. image:: images/OneBit_generic.png :height: 99 :width: 69 *result* = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 21, 21, 21, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] ``ccs_from_labeled_image`` -------------------------- [object] **ccs_from_labeled_image** () :Operates on: ``Image`` [OneBit] :Returns: [object] :Category: Utility :Defined in: image_utilities.py :Author: Christoph Dalitz and Hasan Yildiz Returns all ``Cc``'s represented by unique labels in the given onebit image. The bounding boxes are computed as tight as possible. This is mostly useful for reading manually labeled groundtruth data from color PNG files in combination with the plugin colors_to_labels_. Example: .. code:: Python labeled = rgb.colors_to_labels() ccs = labeled.ccs_from_labeled_image() .. _colors_to_labels: color.html#colors-to-labels ``clip_image`` -------------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **clip_image** (``Rect`` *other*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Utility :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Crops an image so that the bounding box includes only the intersection of it and another image. Returns a zero-sized image if the two images do not intersect. ``generate_features`` --------------------- **generate_features** (list *features*, ``bool`` *force*) :Operates on: ``Image`` [OneBit] :Category: Utility :Defined in: features.py :Author: Michael Droettboom and Karl MacMillan Generates features for the image by calling a number of feature functions and storing the results in the image's ``features`` member variable (a Python ``array``). *features* Optional. A list of feature function names. If not given, the previously set feature functions will be used. If none were previously given, all available feature functions will be used. Using all feature functions can also be forced by passing ``'all'``. .. warning:: For efficiency, if the given feature functions match those that have been already generated for the image, the features are *not* recalculated. If you want to force recalculation, pass the optional argument ``force=True``. ``image_copy`` -------------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **image_copy** (``Choice`` [DENSE|RLE] *storage_format*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Utility :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Copies an image along with all of its underlying data. Since the data is copied, changes to the new image do not affect the original image. *storage_format* specifies the compression type for the returned copy: DENSE (0) no compression RLE (1) run-length encoding compression ``image_save`` -------------- **image_save** (``FileSave`` *image_file_name*, ``Choice`` [TIFF|PNG] *File format*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Utility :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Saves an image to file with specified name and format. ``mse`` ------- float **mse** (``Image`` [RGB] *None*) :Operates on: ``Image`` [RGB] :Returns: float :Category: Utility :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Calculates the mean square error between two images. ``pad_image`` ------------- ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **pad_image** (int *top*, int *right*, int *bottom*, int *left*, Pixel *value*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Utility :Defined in: image_utilities.py :Author: Michael Droettboom and Karl MacMillan Pads an image with any value. When no pixel value is given, the value corresponding to the color *white* is used. *top* Padding on the top. *right* Padding on the right. *bottom* Padding on the bottom. *left* Padding on the left. *value* An optional pixel value of the pixel type of the image. When omitted or set to ``None``, the color white is used for padding. ---------- **Example 1:** pad_image(5, 10, 15, 20) .. image:: images/RGB_generic.png :height: 129 :width: 227 .. image:: images/pad_image_plugin_00.png :height: 149 :width: 257 ``reset_onebit_image`` ---------------------- **reset_onebit_image** () :Operates on: ``Image`` [OneBit] :Category: Utility :Defined in: image_utilities.py :Author: Christoph Dalitz Resets all black pixel values in a onebit image to one. This can be necessary e.g. after a CC analysis which sets black pixels to some other label value. ``subimage`` ------------ ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] **subimage** (``Point`` *upper_left*, ``Point`` *lower_right*) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Returns: ``Image`` [OneBit|GreyScale|Grey16|RGB|Float|Complex] :Category: Utility :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Creates a new view on existing data. There are a number of ways to create a subimage: - subimage(Point *upper_left*, Point *lower_right*) - subimage(Point *upper_left*, Size *size*) - subimage(Point *upper_left*, Dim *dim*) - subimage(Rect *rectangle*) Changes to subimages will affect all other subimages viewing the same data. ``trim_image`` -------------- ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] **trim_image** (Pixel *PixelValue* = None) :Operates on: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Returns: ``Image`` [OneBit|GreyScale|Grey16|Float|RGB] :Category: Utility :Defined in: image_utilities.py :Author: Tobias Bolten Returns minimal view so that outside of the view only Pixels with *PixelValue* exists. When no *PixelValue* is given, white is used. gamera-3.3.3/doc/src/writing_plugins.txt0000644000076500000000000006333111414613300017262 0ustar chriswheel====================== Writing Gamera Plugins ====================== Introduction ============ The functionality of Gamera can be extended by writing plugins in either C++ or Python. A plugin is simply a set of methods (which are automagically added to the ``Image`` class) or free-standing functions. Plugins are technially just Python modules, but with more information that allows for easier wrapping and compilation of C++ methods and to support all kinds of automatic things in the graphical user interface. Plugins can also be grouped together, with other tools, into toolkits. Toolkits provide higher-level workflow framework for end-to-end document recognition by joining together a number of steps from various plugins. Toolkits are a whole other discussion, so see the `writing Gamera toolkits`__ for more information. .. __: writing_toolkits.html Before writing any plugin, you should make sure there isn't already a plugin included that does what you want. Look at the `list of plugins included with Gamera`__. .. __: plugins.html The files involved ------------------ Each plugin is made up of two files: 1. A Python file that describes each method in the plugin and the plugin itself. If any methods are "pure Python", they can also be defined here, or they can just delegate to functions in other Python modules. 2. Optionally, a C++ header file containing implementations of any C++ methods of the plugin. This is a header file (``.hpp``) and not an implementation file (``.cpp``) because the code you write will be templatized and the concrete methods and the glue code connecting to Python to C++ will be generated automatically at compile time by the Gamera build system. (What templates are is beyond the scope of this document, but it's covered very well in [Stroustrup1997]_.) Plugins in the Gamera source tree ````````````````````````````````` The Python metadata files are stored in ``./gamera/plugins/`` and the C++ source files are stored in ``./include/plugins``. If you keep these files in the proper directories, they will be automatically picked up by the build system and compiled. When Gamera is started up, it will search the ``./gamera/plugins`` directory and load all plugins. Plugins in a toolkit ```````````````````` In a toolkit, the Python metadata files are stored in ``./gamera/toolkits/my_toolkit/plugins/`` and the C++ source files are stored in ``./include/plugins``, both rooted at the top of your toolkit directory. Plugin modules included in toolkits will have to be explicitly imported before they are available. A simple example ================ Plugin metadata --------------- Let's look at a simple metadata file, ``example.py``. Each method is described by creating a class that inherits from ``gamera.plugin.PluginFunction`` and defining a number of special members. The whole plugin is described by a class that inherits from ``gamera.plugin.PluginModule``: .. code:: Python from gamera.plugin import * import _example # C++ method class volume(PluginFunction): """ Returns the ratio of black pixels to white pixels within the bounding box of the image. """ self_type = ImageType([ONEBIT]) return_type = Float("volume") doc_examples = [(ONEBIT,)] class ExampleModule(PluginModule): category = "Example" cpp_headers=["example.hpp"] functions = [volume] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.informatik.hsnr.de/" module = ExampleModule() Okay, now let's break it down. The ``gamera.plugin`` module contains all of the utilities necessary to create Gamera plugins, so the first thing we do is import it: .. code:: Python from gamera.plugin import * Next, we import the C++ (compiled object file) side of the plugin, (described in the next section) which *always* has the same name as the Python metadata module, except with a leading underscore: .. code:: Python import _example Let's start by describing a minimal C++ method. All methods and functions in a plugin are described using a class that inherits from ``gamera.plugin.PluginFunction``: .. code:: Python # C++ method class volume(PluginFunction): Each plugin can (and should) be documented in the usual `Python docstring`__ way: .. code:: Python """ Returns the ratio of black pixels to white pixels within the bounding box of the image. """ .. __: http://www.python.org/doc/current/tut/node6.html On a related note, you can also have the documentation system (``doc/gendoc.py``) generate an example automatically. See `documenting and unit-testing Plugin functions`_. Next, we define ``self_type``, which is the type of object this method can be called on. If ``self_type`` is an ``ImageType``, the method will automatically be added to all ``Image`` objects in Gamera whenever the plugin is imported. Within the ``ImageType`` specifier, you can choose which types of pixels are supported using a list of pixel type names. Valid options are ``ONEBIT``, ``GREYSCALE``, ``GREY16``, ``FLOAT`` and ``RGB`` (these are all constants imported from the ``gamera.plugin module``): .. code:: Python self_type = ImageType([ONEBIT]) You can also optionally define ``return_type``. This specifier is used to generate a variable name for the result in the GUI, and so the C++ wrapping machanism knows how to return the result to Python. If you don't specify a return type, Gamera assumes there is no return result: .. code:: Python return_type = Float("volume") Obviously, this is a very simple plugin method with no arguments. Some more involved examples are given below. In the meantime, let's look at how this method is contained in a plugin module. For each plugin module, you also need a class to describe the entire plugin. There may be *only one* of these classes per plugin. This is done in a similar manner to how the methods are described. There is a class that inherits from ``gamera.plugin.PluginModule``: .. code:: Python class ExampleModule(PluginModule): You can specify a category for the plugin's methods on the context (right-click) menu in the GUI: .. code:: Python category = "Example" If you have any C++ methods (which we do in this case), you must specify the C++ header files to include which contain the corresponding method's source code: .. code:: Python cpp_headers=["example.hpp"] You must also list all of the plugins and methods in the file so they can be generated and loaded: .. code:: Python functions = [volume] Optionally, the author names and a URL for more information can be specified: .. code:: Python author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.informatik.hsnr.de/" Lastly, we create an instance of this class so the module loader can do its work: .. code:: Python module = ExampleModule() C++ code -------- Since the ``volume`` method needs to look at individual pixels, it is likely going to be much faster written in C++ than in Python. Below is the corresponding ``example.hpp`` that contains the C++ implementation: .. code:: CPP #include "gamera.hpp" using namespace Gamera; template float volume(const T &m) { unsigned int count = 0; typename T::const_vec_iterator i = m.vec_begin(); for (; i != m.vec_end(); i++) if (is_black(*i)) count++; return (feature_t(count) / (m.nrows() * m.ncols())); } Most of the declarations needed for Gamera are in ``gamera.hpp``, and all of that stuff is in the ``Gamera`` namespace, to prevent name collisions. You may find it most convenient to just put ``using namespace Gamera`` at the top of your plugin file, rather than specifying ``Gamera::...`` everywhere: .. code:: CPP #include "gamera.hpp" using namespace Gamera; Next we get to the function itself. Note that it is templatized. Since it is our goal to write a single algorithm that may work on multiple image types, *all* plugin methods are templatized, and the instantiations of these templates are generated by the Gamera build system at compile-time based on the ``self_type`` specifier in the method metadata class (that we specified in ``example.py``). See how the first argument ``self`` is templatized as ``T`` so that any (image) type can be passed in. The body of the function used the `Gamera C++ Image API`__ to access and examine the individual pixels: .. code:: CPP template float volume(const T &m) { unsigned int count = 0; typename T::const_vec_iterator i = m.vec_begin(); for (; i != m.vec_end(); i++) if (is_black(*i)) count++; return (feature_t(count) / (m.nrows() * m.ncols())); } .. __: image_api.html Building the plugin ------------------- Okay, so now we're done with the minimal plugin, but obviously something more has to happen in order to access the C++ code from Python. Fortunately, that is all done automatically by the Gamera build system. If the ``example.py`` is placed in the ``./gamera/plugins`` directory, the build system will automatically find it, use the metadata to generate a *wrapper* to access ``example.hpp``, and compile everything. The next time Gamera is run, the plugin will automatically be loaded. The plugin author does not have to learn about the intricacies of the `Python/C API`__. .. __: http://www.python.org/doc/current/api/api.html But, for the sake of some sick curiosity, the generated code looks something like: .. code:: CPP #include #include #include "Python.h" #include #include "gameramodule.hpp" init_features (void) { Py_InitModule ("_features", _features_methods); } #include "features.hpp" using namespace Gamera; extern "C" { void init_example (void); static PyObject *call_volume (PyObject * self, PyObject * args); static PyMethodDef _features_methods[] = { {"volume", call_volume, METH_VARARGS} }; static PyObject *call_volume(PyObject * self, PyObject * args) { PyObject *real_self; Image *real_self_image; FloatVector *return_value = 0; if (PyArg_ParseTuple(args, "O", &real_self) <= 0) return 0; if (!is_ImageObject(real_self)) { PyErr_SetString(PyExc_TypeError, "Object is not an image as expected!"); return 0; } real_self_image = ((Image *) ((RectObject *) real_self)->m_x); image_get_fv(real_self, &real_self_image->features, &real_self_image->features_len); try { switch (get_image_combination (real_self)) { case ONEBITRLEIMAGEVIEW: return_value = volume(*((OneBitRleImageView *) real_self_image)); break; case RLECC: return_value = volume(*((RleCc *) real_self_image)); break; case CC: return_value = volume(*((Cc *) real_self_image)); break; case ONEBITIMAGEVIEW: return_value = volume (*((OneBitImageView *) real_self_image)); break; default: PyErr_SetString (PyExc_TypeError, "Image types do not match function signature."); return 0; } } catch (std::exception & e) { PyErr_SetString (PyExc_RuntimeError, e.what()); return 0; } PyObject *array_init = get_ArrayInit(); if (array_init == 0) return 0; PyObject *str = PyString_FromStringAndSize((char *) (&((*return_value)[0])), return_value->size () * sizeof (double)); PyObject *array = PyObject_CallFunction(array_init, "sO", "d", str); delete return_value; return array; } DL_EXPORT (void) init_example (void) { Py_InitModule ("_example", _example_methods); } } **Aren't you glad you don't have to write something like that every time!** Advanced features ================= Specifying arguments -------------------- Of course, many plugin methods will need to have arguments. See this ``resize_copy`` method, for example: .. code:: Python # C++ image method with some arguments class resize_copy(PluginFunction): """ Copies and resizes an image. In addition to size the type of interpolation can be specified to allow tradeoffs between speed and quality. """ category = "Utility/Copy" self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) args = Args([Int("nrows"), Int("ncols"), Choice("Interpolation Type", ["None", "Linear", "Spline"])]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) And the corresponding C++ declaration: .. code:: CPP template Image* resize_copy(T& image, int nrows, int ncols, int resize_quality); The ``args`` member variable specifies a list of the arguments that are passable to the method. Note that this does not include the first "argument" to the C++ function, which always corresponds to ``self_type``. This specification is used to generate wrapper code, and also to generate dialog boxes in the GUI. The format of these argument lists are documented in `Specifying arguments`__. .. __: args.html The *args* parameter in the plugin prototype allows the specification of default values for arguments. These are however used only in the GUI for the argument dialog box. If you need an actual default argument for your plugin function, you must define the ``__call__`` method in your plugin, e.g. .. code:: Python # wrapper for passing a default argument def __call__(self, nrows, ncols, interpolation="Linear"): return _example.resize_copy(self, nrows, ncols, interpolation) __call__ = staticmethod(__call__) ``_example`` must be replaced by the actual name of your source file plus a leading underscore. Free functions -------------- It doesn't always make sense to have everything be a method of images. For example, you may want to create a function that requires a list of images as input. Fortunately, you can still use the plugin system to automate the wrapping/building process, while foregoing the automatic inclusion of the method in the Image class and on the right-click context menu. It's as simple as setting ``self_type`` to ``None`` in the metadata object: .. code:: Python # C++ free function class union_images(PluginFunction): """ Creates a new image by overlaying all the images in the given list. """ self_type = None args = Args([ImageList('list_of_images')]) return_type = ImageType([ONEBIT]) As these functions are not image methods, but standalone *callable* classes, you additionally must create an instance of this class in the same python metadata file: .. code:: Python union_images = union_images() Pure Python methods ------------------- Sometimes there is not much efficiency to be gained by writing the plugin method in C++, or you want the flexibility of Python for experimentation. In that case you can implement the method in pure Python. Everything else is the same, except you add a ``__call__`` method with the Python implementation. It is important that this method is a ``staticmethod``, since the first ``self`` argument is going to be an ``Image`` object and not a ``PluginFunction`` object: .. code:: Python # Python image method class area(PluginFunction): """ Returns the aspect ratio of the bounding box of the image. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) return_type = Float("area") pure_python = True def __call__(self): return float(self.ncols) / float(self.nrows) __call__ = staticmethod(__call__) Free pure Python functions -------------------------- Since the plugin modules are also just regular Python modules underneath, it is of course possible to just add ordinary Python functions as well: .. code:: Python # Python free function def filter_small_images(l): return [x for x in l if x.ncols > 2 and x.nrows > 2] Raising exceptions ------------------ The convention in Gamera is to use exceptions for error conditions rather than by using error codes. C++ exceptions are automatically propagated to Python. (All C++ exception types will be converted to Python ``RuntimeError``.) .. code:: CPP throw std::runtime_error("Input is out of range"); From pure Python functions, the standard Python exception mechanism can be used: .. code:: Python raise RuntimeError("Input is out of range") Progress bars ------------- This section describes how to display a progress bar dialog from a long-running plugin. When the GUI is running, the progress will be displayed in a window: .. image:: images/progress_bar.png It is also possible to display a progress bar made from text characters in the console, when the GUI is not running. To make it appear, set the config option *progress_bar* to ``True`` as follows: .. code:: Python from gamera.config import config config.set("progress_bar",True) Progress bars will add some overhead when displayed, so they only make sense for plugins that take a long time to complete. Supporting progress bars adds very minimal overhead when they are not displayed. Progress Bars in Python ``````````````````````` To create a progress bar that is a message box in the GUI and a text line in a non GUI script, you can use the ``ProgressFactory``: .. code:: Python from gamera.util import ProgressFactory progress = ProgressFactory("Title", length, numsteps=0) where *length* is the total number of which the progress fraction is to be shown. The optional argument *numsteps* can be useful to reduce the overhead by only updating the progress bar in *numsteps* discrete steps; when zero, every update call will result in an update of the progress bar. To update the progress bar, there are two alternative methods: - ``.step()`` increases the progress counter by one. Whether the displayed progress bar actually is updated depends on *numsteps*. - ``.update(steps, length)`` sets the progress bar to the *steps*/*length* fraction. Progress Bars in C++ Plugins ```````````````````````````` To create a plugin method with a progress bar, simply set the ``progress_bar`` member to the message that will be displayed in the progress box. .. code:: Python class cc_analysis(Segmenter): ... progress_bar = "Generating connected components" ... Add an extra argument to the C++ function that takes an object of type ``ProgressBar``. This can be a default argument, to make it easier to call the plugin function code without requiring a ``ProgressBar`` instance. Creating a ``ProgressBar`` with no constructor arguments creates a dummy ``ProgressBar`` object where all methods are ignored. .. code:: CPP template ImageList* cc_analysis(T& image, ProgressBar progress_bar = ProgressBar()) { ... } The progress bar window will automatically disappear when the function returns. There are essentially two ways to update the progress bar: - Call ``.set_length(*length*)`` to set the number of steps that will be performed, and then call ``.step()`` to increase the step. - Call ``.update(*num*, *den*)`` to say that *num* of *den* steps have completed. ``.update`` is useful when the number of steps can not be pre-determined. Documenting and unit-testing Plugin functions --------------------------------------------- The docstring of each ``PluginFunction`` class is used like a regular Python docstring, but also has the following advantages in Gamera: - It will be included in the automatically generated HTML documentation. - It is displayed in the Documentation pane in the Gamera shell window. - It is displayed in the automatically-generated dialog box for the plugin. The docstrings should be formatted in reStructuredText_, which is becoming a de-facto Python standard for documentation, as well as being rather easy to read and use. .. _reStructuredText: http://structuredtext.sourceforge.net The Gamera documentation can be regenerated by going to the ``doc`` directory (in the source distribution) and running the ``gendoc.py`` script:: python gendoc.py In addition to text, image examples can be generated on-the-fly and included in the documentation using the ``doc_examples`` member. The ``doc_examples`` mechanism is also used to write rudimentary unit-tests for Gamera's `unit-testing framework`__. .. __: unit_testing.html The ``doc_examples`` member is a list of tuples or functions: - If the element is a tuple, it is a list of arguments that will be passed into the plugin method to create an example. Where image arguments are expected, image type identifiers can be used, which will load a standard image from disk and use it. For example:: (ONEBIT, 52, 32) will use the standard OneBit image and the arguments of ``52, 32``. - If the element is a function, that function will be called to create the example. The function will be passed one argument, ``images``, which is a dictionary of the standard Gamera example images. Any images or values returned will be included in the documentation. Any exceptions raised by the function will be logged by the unit-testing framework when it is run. For example the following loads the standard RGB and GreyScale images, clips them appropriately, adds them together, and then returns all of them for inclusion in the documentation. .. code:: Python def __doc_example1__(images): rgb = images[RGB] greyscale = images[GREYSCALE] clipped = rgb.clip_image(greyscale) return [clipped, greyscale, clipped.add_images(greyscale.to_rgb(), False)] doc_examples = [__doc_example1__] Examples ```````` The following ``doc_examples`` specifier (from simple_sharpen_) produces two examples, one on the standard GREYSCALE image, and another on the standard RGB image, using different values for the *sharpening_factor*. .. code:: Python doc_examples = [(GREYSCALE, 1.0), (RGB, 3.0)] .. _simple_sharpen: convolution.html#simple-sharpen For draw_bezier_, a custom example function was used, which does not load a standard image. .. code:: Python def __doc_example1__(images): from random import randint from gamera.core import Image, Dim image = Image((0, 0), Dim(100, 100), RGB, DENSE) for i in range(10): image.draw_bezier((randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), RGBPixel(randint(0, 255), randint(0,255), randint(0, 255))) return image doc_examples = [__doc_example1__] .. _draw_bezier: draw.html#draw-bezier Feature generators: A special kind of plugin ============================================ Plugin methods that take an image as input and generate some floating point features from it are called "feature generators". The resulting floating point features are used by the classifier to classify images. For efficiency reasons, feature generator functions are implemented slightly differently from a regular ``PluginFunction``. Rather than returning the features as a return value, which would require a memory copy into the image's feature vector, feature generators write directly to a buffer that is passed in as an argument. As an example, let's look at the ``nholes`` feature generator. The Python metadata is the same as you would expect, except the member ``feature_function`` is set to ``True``. This will tell the build system to treat this plugin method as a feature generator with the different return value behavior. The ``return_type`` must be a ``FloatVector``, where ``length`` indicates the number of feature values that are generated. .. code:: Python class nholes(PluginFunction): """ Returns the average number of transitions from white to black in each row or column. The elements of the returned ``FloatVector`` are: 0. vertical 1. horizontal These features are scale invariant. """ self_type = ImageType([ONEBIT]) return_type = FloatVector(length=2) feature_function = True doc_examples = [(ONEBIT,)] On the C++ side, the function takes two arguments: the image, and a pointer to a floating point buffer. Note that the return type is ``void``. .. code:: CPP template void nholes(T &m, feature_t* buf) { int vert, horiz; vert = nholes_1d(m.col_begin(), m.col_end()); horiz = nholes_1d(m.row_begin(), m.row_end()); *(buf++) = (feature_t)vert / m.ncols(); *buf = (feature_t)horiz / m.nrows(); } (The C++ function ``nholes_1d`` is where all the real work gets done, and is not important for this illustration.) Note how the result of the function is copied directly into the buffer. .. note:: It is extrememly important not to write more values to the buffer than is defined in the metadata ``return_value``. Doing so could cause Python/Gamera to behave erratically or segfault. It is also possible to write a feature generator in pure Python. .. code:: Python class nholes(PluginFunction): self_type = ImageType([ONEBIT]) return_type = FloatVector(length=2) feature_function = True doc_examples = [(ONEBIT,)] def __call__(self, index): buffer = self.features # Do some processing to get values... buffer[index] = result1 buffer[index + 1] = result2 __call__ = staticmethod(__call__) Further reading =============== - `Writing C++ plugin methods that processes Gamera images`__ .. __: image_api.html - `Specifying arguments`__ .. __: args.html - `Passing/returning custom data types to/from plugins`__ .. __: plugins_custom_types.html - `Grouping plugins together into toolkits`__ .. __: writing_toolkits.html - And of course, there's lots of examples in the Gamera code itself! References ========== .. [Stroustrup1997] Stroustrup, B. 1997. *The C++ Programming Language: Third Edition.* Reading, MA: Addison-Wesley. gamera-3.3.3/doc/src/writing_toolkits.txt0000644000076500000000000003264611652050143017462 0ustar chriswheelWriting Gamera toolkits ======================= (c) 2004 Michael Droettboom What is a toolkit? ------------------ A toolkit is a way to distribute code that uses Gamera but is not included in the Gamera source tree. This could be entire applications that process images and return symbolic results (eg. an OCR package), or simply a library of utility functions (eg. for color image processing). A toolkit is based on Python's generic package and module heirarchy, which is described in the Modules chapter of the `Python tutorial`__. .. __: http://www.python.org/doc/tut/ The Gamera toolkit framework actually provides very little beyond that: - A special Python distutils-based framework for building Gamera plugins more conveniently. - Support for adding a toolkit-specific drop-down menu to the Gamera GUI. If neither of these features is necessary for your project, you may decide to simply release your application or library as a standard Python package. `Distributing Python modules`__ in the Python documentation is a good resource for how to do that. .. __: http://www.python.org/doc/dist/ Creating a toolkit ------------------ The directory heirarchy ``````````````````````` Toolkits require a number of different files in a directory heirarchy. Here we assume the toolkit is called ``my_toolkit``. +----------+----------------------------------------------------------------+ | ./ | Basic information files for building the toolkit | | +---------------+------------------------------------------------+ | | setup.py | A Python ``distutils``-based build script. | +----------+---------------+------------------------------------------------+ | gamera/ | All the files needed by Gamera at runtime. | | | Since Python is interpreted, these means | | | Python source files. | | +---------------+------------------------------------------------+ | | toolkits/ | This is where the Python source code of the | | | my_toolkit | toolkit goes. | | +---------------+------------------------------------------------+ | | toolkits/ | This is where the Gamera plugins for the | | | my_toolkit/ | toolkit go. | | | plugins/ | | +----------+---------------+------------------------------------------------+ | include/ | C++ header (``.hpp``) files. | | +---------------+------------------------------------------------+ | | plugins/ | Source code for the C++-based plugins. | +----------+---------------+------------------------------------------------+ | scripts/ | Command line scripts | +----------+---------------+------------------------------------------------+ | doc/ | Documentation | | +---------------+------------------------------------------------+ | | gendoc.py | A script to generate the documentation using | | | | the Gamera documentation system. | | +---------------+------------------------------------------------+ | | src/ | The source files for the narrative | | | | documentation. | | +---------------+------------------------------------------------+ | | html/ | The HTML output from the Gamera documentation | | | | system. | +----------+---------------+------------------------------------------------+ Some toolkits may go beyond this, of course, by including ``.cpp`` files in a ``src/`` directory or documentation in a ``doc/`` directory. The skeleton toolkit ```````````````````` For convenience, a minimal skeleton of a toolkit is provided and available from the files section of the `Gamera SourceForge site`__. .. __: https://sourceforge.net/project/showfiles.php?group_id=99328&package_id=118473 This skeleton provides the very minimum needed to create a toolkit. You will need to change all the references to the toolkit name (Skeleton) throughout its source. The ``rename.py`` script is provided for this purpose. For example:: python rename.py my_toolkit will rename and edit all of the files to create a new toolkit called ``my_toolkit``. Editing the files ````````````````` The files included in the skeleton toolkit are self-documenting. They should require only minimal editing. Mainly, toolkit authors will be adding their own Python modules and Gamera plugins to the toolkit. setup.py '''''''' You only need to edit this file if you are doing anything more complex than installing Python modules and building Gamera plugins. For instance, if you are building and linking to a third-party library. Since this script is based on Python distutils, the distutils documentation is the best resource for how to do that. MANIFEST.in ''''''''''' If you need to include more data files to your toolkit distrubution, you will need to edit this file. The format is described in the distutils documentation. gamera/toolkits/my_toolkit/__init__.py '''''''''''''''''''''''''''''''''''''' If you want to add a drop-down menu to the Gamera GUI shell, you can edit this file. It is self-documenting. You will probably want to remove the example menu items that are included in the skeleton. This file should also import any plugins that you want to have added to the GUI's context menu (right-click menu). Plugins ''''''' `Writing plugins`__ is described in detail. The Python metadata files for a toolkit go in ``gamera/toolkits/my_toolkit/plugins/``, and the C++ source code goes in ``include/plugins/``. .. __: writing_plugins.html Python modules '''''''''''''' The Python modules in your toolkit should go in ``gamera/my_toolkit/skeleton``. Documentation ''''''''''''' Optionally, the toolkit may use the Gamera documentation system. See `Documenting toolkits`_ for more information. Building and installing a toolkit --------------------------------- Building and installing toolkits is very similar to building and installing Gamera itself. **You must ensure that Gamera is installed and working before attempting to build and install a Gamera toolkit. On Windows, you should build and install gamera from the sources before building a toolkit to avoid possible compiler incompatibilities.** The complete instructions for building Gamera toolkits is included in the skeleton example in the INSTALL file. You should redistribute this file with your toolkit. Documenting toolkits -------------------- Optionally, toolkit writers can use the Gamera documentation system. Toolkits are also free to use another documentation workflow if desired, of course. To document a toolkit using the Gamera documentation system, the author should perform four steps: 1) write narrative documentation, 2) write plugin method documentation, 3) optionally write class and method documentation and 4) create a documentation generation script. Writing narrative documentation ``````````````````````````````` The narrative (handwritten) documentation is intended for "how-to" like documents or anything that is not simply documenting methods one-by-one. Put narrative documentation in ``doc/src/``, in ``.txt`` files in reStructuredText_ format. Each ``.txt`` file will be converted into a corresponding ``.html`` when the documentation is generated. .. _reStructuredText: http://docutils.sf.net/ Optionally, any inline images to be included can be placed in ``doc/src/images/``. It is good practice to create an ``index.txt`` here which will act as an entry-point to the documentation. Plugin documentation ```````````````````` Document each plugin method in its Python docstring. This docstring should occur on the line following the ``class`` statement where each ``PluginFunction`` is defined. Optionally, write a documentation example. This is a snippet of code that will be run to generate an image that demonstrates the capabilities of the plugin function. These steps are described in greater detail in the `writing plugins`__ chapter. .. __: writing_plugins.html#documenting-plugin-functions By default, the documentation generator will document all imported plugins. Usually, this is the right thing to do. However, your toolkit may import plugins from other toolkits or from the Gamera core that you do not wish to have documented. In those cases, you can specify the categories of plugins you want to be documented using the ``plugins`` keyword argument when calling the documentation generator from your `documentation generation script`_. For example, if the plugins in your toolkit were all in the category "Foo", and you only want to document those, you would use: .. code:: Python gendoc.gendoc(plugins=["Foo"]) Class documentation ``````````````````` Individual classes and their methods can be documented as well. There are two ways to do this: 1) inline with the narrative documentation, or 2) one-class-per-file documentation. Inline class documentation '''''''''''''''''''''''''' The Gamera documentation system adds a new directive, ``docstring``, to reStructuredText. The directive looks up the docstring of a class, function or method and inserts it inline into the document. It takes at least two arguments: *module* The module that the object is in. This may be a dot-delimited package path, such as ``gamera.toolkits.skeleton``. *object* The Python object to document. Additionally, any number of names may be added to the arugment list which will be looked up in *object* and documented. For example, to document the ``__init__`` and ``display`` methods on the ``Image`` class in ``gamera.core``:: .. docstring:: gamera.core Image .. docstring:: gamera.core Image __init__ display This produces the following: .. admonition:: Image .. docstring:: gamera.core Image .. docstring:: gamera.core Image __init__ display One-class-per-file documentation '''''''''''''''''''''''''''''''' To generate one-class-per-file documentation, use the ``classes`` keywoard argument when calling ``gendoc()`` (See below_). This argument takes a list of 3-tuples, (*module*, *class*, *methods*). *module* The module that the object is in. This may be a dot-delimited package path, such as ``gamera.toolkits.skeleton``. *class* The Python class to document. *members* The members to document, in order. This may be either a list of strings (``['a', 'b', 'c']``) or a single string with method names separated by whitespace (``'a b c'``). .. _below: #documentation-generation-script For example, to document the ``__init__`` and ``display`` methods on the ``Image`` class in ``gamera.core``. .. code:: Python gendoc.gendoc(classes=[ ("gamera.core", "Image", "__init__ display") ]) This will have the same effect as the example above, except it will put the class documentation in its own file. Documentation generation script ``````````````````````````````` A small script is required that loads the toolkits' plugins and then calls out to the Gamera documentation system. The example documentation generation script included in the skeleton toolkit example is as follows: .. code:: Python #!/usr/bin/env python from gamera import gendoc if __name__ == '__main__': # Step 1: # Import all of the plugins to document. # Be careful not to load the core plugins, or they # will be documented here, too. # If the plugins are not already installed, we'll just ignore # them and generate the narrative documentation. try: from gamera.toolkits.skeleton.plugins import clear except ImportError: print "WARNING:" print "This `skeleton` toolkit must be installed before generating" print "the documentation. For now, the system will skip generating" print "documentation for the plugins." print # Step 2: # Generate documentation for this toolkit # This will handle any commandline arguments if necessary # The optional classes argument can be used to document classes # See "Class documentation" in the "Writing toolkits" chapter. gendoc.gendoc() Building the documentation `````````````````````````` Once these three elements are in place, the documentation can be generated and converted to HTML. Prerequisites ''''''''''''' Generating documentation requires two third-party Python libraries: - docutils_ (version 0.3 or later) for handling reStructuredText documents. - SilverCity_ (version 0.9 or later) for colorizing source code. .. _docutils: http://docutils.sourceforge.net/ .. _SilverCity: http://silvercity.sourceforge.net/ Generating '''''''''' To generate the documentation, go to the ``doc`` directory in the skeleton and run the ``gendoc.py`` script. Alternatively, you can call the ``gendoc.py`` script with the documentation directory as a commandline argument:: gendoc.py -d /path/to/doc The output will be placed in the ``doc/html/`` directory. The contents of this directory can be placed on a webserver for convenient viewing. gamera-3.3.3/doc/src/xml.txt0000644000076500000000000000127211755375757014667 0ustar chriswheel XML === ``to_xml`` ---------- str **to_xml** () :Operates on: ``Image`` [OneBit] :Returns: str :Category: XML :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Returns a string containing the Gamera XML representation of the image. (See the Gamera XML DTD in ``misc/gamera.dtd`` in the source distribution.) ``to_xml_filename`` ------------------- **to_xml_filename** (``FileSave`` *filename*) :Operates on: ``Image`` [OneBit] :Category: XML :Defined in: plugin.py :Author: Michael Droettboom and Karl MacMillan Saves the Gamera XML representation of the image to the given *filename*. (See the Gamera XML DTD in ``misc/gamera.dtd`` in the source distribution.) gamera-3.3.3/doc/src/xml_format.txt0000644000076500000000000002140610714675724016227 0ustar chriswheel=============================== Gamera XML format (version 2.0) =============================== Introduction ------------ The Gamera XML format is used to store sets of small ONEBIT (binary) images. This is most commonly used to store training data for a classifier. Since these files tend to be quite large, Gamera supports loading and saving of gzipped XML files. XML format ---------- Below is an informal description on the XML format. A more formal definition is given in the `DTD`_. Gamera uses Unicode internally to store symbol names, so the XML file can be encoded in most standard encodings that Python can automatically convert to Unicode. (See the Python documentation for the ``codecs`` module). All XML files created directly from Gamera are encoded in UTF-8. .. code:: XML ``gamera-database`` (Toplevel) `````````````````````````````` At the top level is the ``gamera-database`` element. A version must be specified. Note that the version refers to the "Gamera XML file format" version which does not correspond to the version of Gamera. The version documented here is ``2.0``. Version ``1.0`` was a weak first attempt and is no longer supported. We plan to make future versions backward and forward compatible whenever possible. .. code:: XML ... ``glyphs`` '''''''''' The ``glyphs`` element simply contains ``glyph`` elements. .. code:: XML ... ``glyph`` +++++++++ Each ``glyph`` element represents a small ONEBIT (binary) image. It has the following attributes that specify the bounding box, and are directly equivalent to the members on the image object itself: ``uly``, ``ulx``, ``nrows`` and ``ncols``. .. code:: XML ... ``ids`` ....... Each ``glyph`` contains an ``ids`` element which contains all of the class names that define the glyph. Since some classifiers will return multiple class names with different confidences, ``ids`` is actually a set of ``id`` elements. ``ids`` has an attribute ``state`` that defines how the glyph was classified. It can be one of {``UNCLASSIFIED``, ``AUTOMATIC``, ``HEURISTIC``, ``MANUAL``}. Each ``id`` element within ``ids`` has two attributes: ``name`` The class name, which is period-delimited by category. ``confidence`` A confidence value represented how sure the classifier was about the identity of this glyph. The value is in the range 0 (not at all confident) to 1 (very confident). .. code:: XML ``data`` ........ Data contains a run-length encoded representation of the image itself. This data is used to reconstruct the image when loading. It consists of decimal numbers separated by whitespace. The numbers alternate between the length of white runs and the length of black runs. Runs "wrap-over" the right side of the image to the next row on the left side of the image. Systems that work on Gamera XML should take care not to modify the data block, as it is very easy to corrupt and there is only minimal error checking upon reloading. .. code:: XML 6 4 12 9 8 12 5 6 1 7 4 5 3 7 2 6 4 6 2 7 3 6 2 7 3 6 3 6 3 6 3 4 5 6 4 3 4 7 5 3 2 6 7 11 7 11 8 11 6 5 1 7 2 6 4 6 2 6 4 15 3 14 4 14 4 6 2 6 3 7 2 15 4 12 7 10 11 3 9 0 ``features`` ............ The ``features`` element contains a set of ``feature`` elements, one for each feature function. .. note:: When Gamera XML files are loaded into Gamera, the features information is discarded and regenerated. This is so the classifier has complete control over what features are used and how they are used. The feature values are dumped to the XML file only for the benefit of third-party applications that may wish to use the features without using Gamera code itself. The ``features`` element has one attribute, ``scaling``, which is used to define how the features should be scaled (if at all). Each ``feature`` element has one attribute, ``name``, which is the feature function that generated the values. More feature functions can be added by `creating plugin methods`__ in the category ``Features``. .. __: writing_plugins.html The ``CDATA`` block of the ``feature`` element contains a list of floating point numbers (in decimal) that were generated by the given feature function. .. code:: XML 468.0 0.692307692308 294.0 0.428571428571 0.302825261159 0.307856673241 0.0657821501667 0.149170828096 0.0533051094428 0.008619818861 -0.000427188837948 0.000613411663867 0.0317229010445 0.944444444444 0.615384615385 3.0 6.0 4.0 2.0 3.0 6.0 4.0 3.0 3.0 10.0 0.206349206349 6.0 4.0 3.0 0.628205128205 0.485714285714 0.514285714286 0.457142857143 0.8 0.771428571429 0.685714285714 0.828571428571 0.8 0.657142857143 0.571428571429 0.714285714286 0.685714285714 0.657142857143 0.885714285714 0.857142857143 0.771428571429 0.0833333333333 0.5 0.5 0.0833333333333 0.0 0.583333333333 0.916666666667 0.416666666667 0.5 1.0 1.0 0.583333333333 0.25 0.833333333333 1.0 0.916666666667 0.833333333333 1.0 0.916666666667 0.833333333333 0.916666666667 1.0 1.0 1.0 0.916666666667 0.5 0.5 0.333333333333 1.0 0.583333333333 0.416666666667 0.833333333333 0.833333333333 0.25 0.0 0.5 0.916666666667 0.166666666667 0.0833333333333 0.833333333333 0.75 0.833333333333 0.666666666667 0.916666666667 1.0 0.75 0.75 1.0 0.583333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.916666666667 1.0 0.666666666667 0.583333333333 1.0 1.0 0.416666666667 -10.6511384992 6.48862460298 -29.6215265124 21.4915669267 -4.95741930842 9.70917594801 -41.1062437889 61.7375776134 5.72778404882 5.31916863982 -16.2283589874 87.6140952777 0.148787539745 -2.75048482171 -4.19045628996 74.7653517483 0.403589004311 -0.403486704972 -4.89682421377 61.1321737136 -1.01342510763 -0.526430778878 -13.8421959343 63.5845586372 -0.188701625589 0.697880091555 ``symbols`` ''''''''''' The ``symbols`` element contains a set of symbol names. This is used to import/export symbol tables without the expense of loading glyphs. Each ``symbol`` element contains one attribute ``name`` which defines a period-delimited class name. .. code:: XML DTD --- This is the formal definition of the Gamera XML Format. .. code:: XML Saving and loading Gamera XML files ----------------------------------- The code for saving and loading Gamera XML files is in ``gamera/gamera_xml.py``. Use the following functions to save and load Gamera XML files: .. docstring:: gamera gamera_xml glyphs_from_xml glyphs_with_features_from_xml glyphs_to_xml strip_features gamera-3.3.3/examples/0000755000076500000000000000000011755376174013600 5ustar chriswheelgamera-3.3.3/examples/classifier.py0000644000076500000000000000131410714675736016275 0ustar chriswheelimport sys def my_application(): global ccs # Load the image image = load_image(sys.argv[-1]) onebit = image.to_onebit() # Get the connected components from the image ccs = onebit.cc_analysis() # Classify the cc's classifier.classify_list_automatic(ccs) # Display the ccs to show their classification display_multi(ccs) # Import the Gamera core and initialise it from gamera.core import * init_gamera() # Import the classifier module from gamera import knn # Create a new classifier classifier = knn.kNNInteractive() # Load some training data classifier.from_xml_filename("training.xml") # Import the Gamera GUI and start it from gamera.gui import gui gui.run(my_application) gamera-3.3.3/examples/example.tiff0000644000076500000000000626766110714675736016135 0ustar chriswheelMM*g˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙üü˙ĝúŝŝ˙˙˙˙˙ü˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝ˙ûŭú˙ġŝü˙û˙û˙˙˙ôù÷˙û˙˙ĝü˙ġ˙ĝ˙˙ŝùö˙˙÷˙ŭ˙˙ŭü˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙˙ŝ˙óŝ˙úŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙ñ˙ü˙ö˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù˙úü˙˙ŭ˙˙˙÷˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙˙˙ŭ˙ú˙˙˙ŭŭû˙ŭúĝ˙˙˙ú˙ü˙˙˙ôġ˙˙˙ŭ˙˙˙ŭ˙˙ĝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûî˙û˙ŭî˙˙˙üġ˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû÷˙˙˙˙ŝŝ˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙üîû˙ĝû˙˙òö˙ú˙˙ö˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙î˙òü˙˙ŭé˙ú˙ùŭ˙˙ïġûûġ˙ġô˙û˙ĝ˙˙˙ûüŝôñ˙ö˙˙ü˙˙ùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙îï˙˙ú˙÷˙˙ŭ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝñ˙ù˙˙û˙ô˙ŝú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙˙˙˙óŭŝ˙˙˙û˙ĝñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùú˙ŭ˙˙˙ü˙˙ġ˙÷˙˙öŭù˙˙˙ŭ˙û˙˙˙ö˙˙úù˙ù÷˙˙˙˙˙˙ŭ˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙û˙úŝŝ˙˙ĝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙û˙ġĠ÷˙ġûŝùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙ùóŭŝ˙ĝĝ˙˙˙ê˙˙úĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙˙ö˙öïüô˙ü˙ùùú˙÷ŭ˙íÓÊüùìäÏüûùŝ˙˙˙˙ĝĝŝ˙ĝôú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙żÒÌÁÛú˙ĝô÷˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙÷ŭú˙˙˙˙˙ŝŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙ĝ˙˙Ġôö˙ŭì˙ġ˙ŝ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝû˙óü˙˙û˙ö˙ò˙ü˙÷˙ĝ˙ì۞ ¨Ş(˙˙ú˙˙úó˙˙ĝ˙˙úî˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ #"—˙ĝŝŝ˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭÍÌĥ—Ìê˙˙ŭ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ìÒԗ$+éê˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ù˙˙˙½.ĥü˙ô˙ú˙Ù˙ŝÇ- ,$Ĉ˙ġ˙˙ö˙˙޽ö˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü &ġ˙˙˙ùüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ǖ, &´úŝĝ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è² . ŞĊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙û!И˙ù˙ò˙˙Ñ !) !İùŭ˙óßïİ%š˙ŭë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ë#˙û˙ü÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó$##šü˙ü˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙ôú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙ùü˙¤˜¨Ëûŝ˙˙ú˙˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙úú÷˙.  ×Ì˙ŭ˙üü˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙˙ö˙˙÷˙˙ûŭŭ˙Ĝùú˙ŭ˙ûöŝ˙ú˙ŭ˙ !˙úü˙ò˙*¨Ĉ˙ŝ˙˙Ï /˘ô˙ĝ˙ü˙˙˙˙ġ˙û˙˙˙˙˙˙ŭ˙ŝúú˙ŭŭŝ÷ü˙˙ŝ˙ĝù˙ĝ˙Ħ!ñ˙ŭ˙ò˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüú˙ùûĠ§Ï˙˙úŝû˙˙ù˙ö˙˙ĝ˙ü˙˙˙˙˙÷˙˙ùû˙ŝù˙˙öû˙úú˙ò˙˙ü˙˙ŝ˙ĝù˙˙˙î˙ŝ˙ŭ˙÷˙˙˙ŝ˙˙˙÷˙˙úû˙˙˙˙ôŝû˙ü˙˙˙ú˙˙ŭ˙˙˙˙˙ùû˙ê˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ó˙˙Ĥ& . ˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙ù /#!'"œü÷ô˙˙ĉ˙˙û˙˙˙˙˙˙˙˙˙ŝĝ˙˙ú˙˙üĝ˙üû˙ûŝŭûÈ˙í÷˙ŝ˙˙û˙ġ˙ö$#Ì˙˙˙—1*—Ú³ # ˙˙ñġ˙!$' Äù˙˙÷ŭ˙ŭ÷ŭ˙˙ŝùŝ˙ûû˙˙˙ŝ˙üŝ˙ê˙˙˙˙˙˙˙˙ŭû˙˙É2˙÷÷˙ú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙ŭ!ĝŭ˙˙˙˙ú˙ú˙ê˙ŭ˙ùŝĝú˙ŝ˙ö˙˙ùĝ˙˙ĝ˙˙˙˙˙ùó˙ûġ˙˙˙˙˙˙ŭûŭ˙˙˙ò˙ġ÷˙ŭŝ˙˙˙ô˙˙÷ñ˙˙˙úúó˙˙˙˙ĝ˙öŝ˙˙ŝù˙˙û˙ï˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûŭ˙ŭûúĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙˙%$ *Â˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ü˙%•ŭ÷ûÒ! %$›˙˙÷˙û˙ŭùú˙˙˙˙˙˙˙˙˙˙˙ê˙ûñ÷˙˙˙ŭ÷ü˙ûĦħŞÉè˙ñ˙û˙ĝ˙ñ&  í˙˙ĝ˙Ċ !˙ê– $°úÖĝ˙ŭ µġúŝ˙˙˙˙ŭŭùò˙ü˙˙ŭû˙˙ŝŝ˙è˙ŝ˙üĝġ˙úòü˙˙˙˙²%ı˙˙ù˙ŝú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ôŝ÷! -# ú˙ŝŝ˙ûŭùó˙ù˙üû˙û˙÷ú˙ġ˙ŭ˙óŭ˙˙˙˙˙÷ûñ˙˙˙ŭŝ˙ġ˙úòü˙˙˙ŭĝ˙˙ġ˙˙˙öû˙ûí˙û˙˙˙˙˙ĝĝ˙ü˙˙÷ùùŝ˙˙ŝüŭ˙˙˙˙ŝô˙˙˙ö÷˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭì˙ĉ˙¨- ''ŭô˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ûî˙Ÿ  ˙˙ŭ˙úÒŝ˙˙˙ġ˙ú˙˙ò˙˙˙˙˙˙˙˙ùó˙ĝ˙˙˙ûû˙˙˙˙˙˙ù  ·ò˙˙ùü˙˙˙“!˙ñŭ˙ĝÖ"'Ñï˙%”˙˙˙ìĝ˘!!Üó˙˙úŭ˙˙˙˙÷˙˙˙˙˙˙˙ŝúô˙˙˙ö˙ì˙˙˙˙ŝ˙ŭú˙úì $Çĝô˙˙ĝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙Í5 ˙˙ôùŝü˙˙ù˙˙˙ŝöùġ˙ŝ˙˙ĝ˙˙ŝ˙˙û˙˙ġ÷˙˙˙ûŭíò˙˙˙˙˙ŝ˙ŭú˙˙÷ù˙úûüü˙˙ŭ˙ö˙ŝŭü÷ùù÷˙˙ŭŝ˙ú˙˙˙úú˙ûúü˙ìŭ˙Ġ˜ÌĦÚ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ìĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ İ˙ŝÔ%"Ûà˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óû˙ÈĦ˙ûö˙ŝ5úùĝĝò˙˙Á Ğ˙˙˙˙˙˙˙˙˙˙ï˙ġ˙üŭ˙ĝèù˙î˙š%˙˙˙ù˙üŝóܚž£Ì˙˙˙÷˙Û˙˙¤˙òâ˙˙öÎĞ&Êû˙ôó˙ú˙˙òú˙˙ó˙ĝôŝ˙˙ŝ˙˙ü˙˙˙˙ùü˙ü˙˙˙ĝ˙˙˙ "!"˙ŝ˙öû˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ò'& !ĝúŝú˙˙ĝüï˙˙ì˙˙ŝ˙÷˙˙˙˙ó˙ùĝ˙˙óû˙˙ú˙üê˙˙˙ġ˙ü˙ü˙˙˙ĝ˙û˙˙˙˙ù˙˙˙˙ê˙˙üŭû˙˙˙˙˙úû˙˙˙˙ĝŝ˙÷˙ûû˙˙˙˙˙ó£”üŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ç÷˙ĝù÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óù˙ŭ' šĝû˙–+˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ü˙ŝ!˙˙ü˙˙È &˙ú˙˙˙ó£'Ş˙˙˙˙˙˙˙˙í˙ùó˙˙ú˙˙ï˙˙ĝ˙˙ô "žù˙û˙ïû˙ñ˙˙ô˙ü˙˙ü˙ íĜï˙!! ˙˙˙ġö˙ö˙î˙ŝù˙ġ˙˙˙˙˙˙˙˙ï˙˙˙˙ûŝŝû˙˙˙˙ï˙ûúúÔ˙˙ĝôŭ˙ŝ˙ŭË ˙˙˙ŭĝ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Á£% (Ç˙˙˙˙˙˙ùŭċù˙ĝ˙üòùŝú˙ĝù˙˙˙˙˙˙ëÛö˙˙ŝŭî˙ñ˙ŝô˙˙˙ĝôŭ˙ŝ˙ó˙˙êĝú˙ò÷˙˙úóĝ˙˙ì˙˙ù˙˙ùĝóúûĜü˙˙û˙˙˙ó˙ŝÖ0#İ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ċġ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŬ¨ ) (Ħ˙÷¤#1×ôġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙˙û&ŝĝú˙˙í²"û˙˙óú˙˘ %š˙˙˙˙˙˙˙˙˙Íè œ˙÷ĝĝ˙üԔĜÍ )û˙ó˙û˙˙ż˙î˙˙ô˙ġó˙ï*$À˙ó˙Ĝ <Ĵóù˙ò˙ôŭô˙ŝì˙ò˙˙ûü˙÷˙ġÔŝëì˙˙˙ûŭ˙˙˙ì˙˙ñ˙˙ûÏü˙˙ûüŭŝü§!˙ú˙ŝ˙˙ĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÎÄ"'%#' ˙ŭùĝôŭŝ˙˙êü˙÷ŭó˙˙˙˙˙÷úŭ˙Ĵ­ -Ħ˙˙ê˙˙˙Ĉ/Ïü˙˙ûüŭŝ˙êĠ²ö˙ú˙˙äܢÍ˙˙ŭ˙˙üŭ˙úñ˙˙˙˙ġ˙à˙˙ûî˙˙˙˙Ü 1ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭò°Ê˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ž  Ħ˙Àİ &Í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭġü˙›% ˙üŭŭ˙÷ŭ˙˙˙ġ˙Ŭì"Ħ˙˙˙˙˙˙˙˙˙  -Ô˙ï˙ $ Ï˙û˙˙ô˙˙÷˙ĝú˙÷˙ŭù˙$ ž˙Ĉ¤˘˙ŭŝü˙ûŝ˙÷ĝ˙ñ˙ŭŝ˙˙˙˙ÒĊĦ˘²è˙˙ĝ˙˙ùϝ§ÈÍ£–ĝ˙ûŝ˙ŭқ ˙ü˙˙ù˙ü˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˘"Ÿ˙ Ñúŝ˙˙˙˙˙ŭí²œ$šŞ˙ó˙ü˙˙˙ġ˙"#›˙˙üŝû#%–ĝ˙ûŝ˙ŭ™#¨ôĈ˙ô.˙í˙ŝúûûĦ .ìĝ˙ĊĤ˜İû˙ö˙ĝĊŸĞ £ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙úü˙öŭù˙úü˙ñ˙ͨ¤˙ġŭú˙ûġ˙ó˙ö˙˙˙˙ûñ˙ì˙˙ù˙£œ!üüœ$ Ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ù˙÷˙˙™ žĝ˙˙˙ú˙ûú˙ĝ˘+ £ò˙÷÷˙ôŸ˙˙÷¤# Ğĝ˙ü˙£—–œĠ˙ü˙û˙ùÓ ˙è$#( Ñ˙ì˙˙—˜Ħ¤û˙ñ˙˙˙˙ĝΟ§òŝ˙ùĝ×#!“Û˙ġ˙˙ŝù#!ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ó˙˙˙˙Ħ  Á˙Íŭŝŝ˙ú˙˙ŭüĤÑ˙˙÷ü˙ÇŞ"*ûüŝ˙ #¨˙÷ûÚ ˙÷Ö Ġ˙üñ²£š(*¨˙*.¨×ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷÷ŭ˙ü˙˙˙ĝŝö˙ú˙˙ ˙˙ŭ˙ó˙˙˙ŭùÜÈ$ ż˙˙ġ˙˙ü˙÷˙ŝ´5É˙› #ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭò˙êŭ˙&ĵò˙ß˙ŝ˙˙êß ˙˙˙ù˙Í$!! , ŭŝ˙˙& —˙˙êĦ!˙ô˙˙ĉÔ%žü˙ Ùû˙Ò˙˙ġ˙ï˙˙+&š!›˙ŝ˙Ó˙˜( 'ġ˙ŭ˙˙÷ß œ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙ôí˙úÎ×˙'ĦóĠ˙ŭù˙˙˙˙+! û˙˙˙˙Ş( ġ˙ŝÈ' (˜ö˙˙‘# ˙˙'..ƒ˙˙Ï0 !(ÌÌ!'#£˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ġ˙úüù÷˙üÓöŝ˙– ƒ˙Ġé˙˙ê˙˙$žò˙ŝ˙ó˙ŭĈï"#+Ħ˙¤ "”ŭ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙ŭ˙˙üä $ ŝ˙˙ñüù˙› %(+‡­Ġ˙ï˙˙ġ›=×˙˙ô˙Ê"  (§ôò´&$!•˙˙ûú˙§Òŝ÷ûš) -˙ĝöÁñ˙÷ŭ˙˙œ¨ċ Ğó˙è˙ --Ż˙˙˙ŭü˙Ÿ Îîŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙û•¤ħȍ' ™˙ñû˙˙ô˙ž  Ş™&!%˙üŝ˙›$˘˙ùÍĴ˙˙È#)ÒÒ£ Ğ˙ó˘(&”˙ü΄˙˙ŝ  " " ĥŞŭ§*˘ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙˙˙˙£Ÿµ &! ·ŭ˙˙ġŝ˙ŝš )-˙˙ñ˙˙ú÷˙ñ˙½  "¤àŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ôŭ§"%Ìîú˙˙ôÏŞ# &ÑÒ˙ü˙˙Ñ '“!# ˙ù˙˙ĝ˙È"!ŸÚ§ž˙ ˙˙î˙Ô˙›,Â˙ĝ˙ÎÖġ˙!â˙˙ŝÏ$ĵŝ˙ÍĞò˙ùûßÒÖżĴ›ĝŭ˙˙˙˙.¤ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙ŭŝÏ# ( " * ˙÷ö˙î˙˙ô !ÑÁúËĦ˙ġÒ¤+ì˙ü˙ŬÓ÷ġ˙ Ó˙˙úË£úٖ$Ù˙˙Ï-!Ññ˙ú˙)ÈĦ"'½ô˙÷œ# Ñ˙ìŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙˙÷ŭ&$$$›É˙˙˙˙ú ĝù˙ü˙˙ü˙˙û('-œçŜë˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ü˙é˙Ûŝ!˙˙ü˙˙˙˙˙'"˜˙˙í˙ö˙Ô %¨˙ó ˜ŝŝ˙˙ó› Ûç˙˙›˙˘˙ú˙˙ìí!á˙úï ˙˙˙Ë.Ïŭ˙û˙£)ċûüö˙öŝ˙˙û˙­Ë˙˙ö!"Ïû˙ûú˙$—˙˙èŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙ġ˙ż* #""é˙˙ú˙üú&ŬĝÛ˙ŝĜŸ˙ä˙!#˙˙ŭ˙ĝŝòŭ˙›˙ġ˙ìħ"›˙û˙ô-"Ĝí˙ġÙ$Êŭ˙˙ŭüùĝ–!á˙ñ˙!˙ÔŝġÑ  °úê˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öôŝ˙˙Û!,!&›˙˙ġ˙ŭ˙˙ò) !˙˙óöò˙ïĝ˙ġô $ ĤÔ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üúĝ÷ö˙˙óñ˙ôĜÈŝ˙üü˙Ĉ˙$˙ĝû˙ô˙ô˙%ğ˙ûÌ*&Ñ˙öġö˙˙ é˙˙òѤĵĝ˙Ĉ ˙˙ĝ˙ô˙ĠÂ˙ûÌ ˙˙ë˙ ˙&óü˙ïÔ÷˙˙ŭ˙˙ġü˙˙"÷˙ŭġâ ˙ù˙ŝ˙˙#" ù˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙¤"+ ŻĠ!×ú˙˙ŭ˙ž %Ìüûñ˙˙òŭü˙Ħ#Žĝó˙˙ì˙˙˙ŝ’)Á˙˙ì˙˙ ˜˙é÷˙˜˙˙îúËö˙ŝô˙˙˙—ĤÇŭ˙Ó˙ö˙˙˙Â)Ä˙˙ôòûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ŝ˙Çћ#'µ˙˙ì˙ñ˙ú˙˜+ó˙˙û˙òŭ˙ö˙˙˙Á' (Îûù÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û£(˙î˙ù˙ú˙îċ & )˙üü˙í˙– Ôû˙ŝô˙˙˙ż"Ô˙ĝ˙£˙ó˙˙ù˙•˙˙˙˙˙ûŝ˙˙˙•$#›˙ö˙˙˙ì—˙ŝ˙˙¤% ˙ï˙˙÷˙éš˙˙ŭ˙ Â˙ûù˙˙ŭö˙˙êĦ˙ö˙˙Ô #"˙ï˙˙˙ıÖû˙ô˙Ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûòçñ£" ÇË˙òĝğ"!ħġ˙˙ŝ˙îÁ% ġ˙˙˙˙ê˙˙ñ˙)”˙˙˙úó˙˙ĉŝû§˙ù÷˙˙ê¤˙˙˙ü7Ìġŭŝ˙ Ÿ˙˙ĝ˙˙ŭö˙)ï˙˙ñ3ż˙ŭ÷˙ÑŞÇ˙ò˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ö*ŽĞ#£ġŝ˙˙ú˙ŝŭ˙ò“˙ó˙˙ġ˙˙˙˙üúÊ! ­ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÒÎ˙ô˙ûŭ˙˙Ë#˙ŭú˙˙ü Û˙ŝ˙˙˙óû&"ù÷˙ŝ¤÷Üö˙˙ò!˙˙ġ˙ù˙˙˙ôġ( Ĥù˙˙ò˙˙›˙˙ĝ˙Ë˙˙˙ŝ˙÷˙ ĝù˙˙żİ˙üú˙ŭŭ˙˙˙Ĉ˙& ħ˙÷˙ $& !›˙˙˙ġÙġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ôĞ Ħ˘˙˙˙˙Ĝú”•˙˙úŭ˙˙  §˙ġ÷÷˙˙î˙˙ÄĴĜöú˙˙˙˙ó˙ŭן˙üŭ˙ö,ġŭú˙Ë#˙˙üŭĠò˙˙˙ùû˙È ˙ÏĝŬ˙ŝ˙˙˙ž˙˙˙ŝù˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙ûŻŸĊ˙ËÒÇ˙˙˙˙˙ù˙ùĝ˙˙ĝ­˙ó˙ŭŝô˙˙÷#ž£İĝÔĝÙ Û˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ü˙ŒŽ˙ŝúù˙˙ĝ˙ '˙ï˙˙˙Öû˙˙û˙úÎ/!ü˙ùŬ’˙ñ˙ü˙Ĵµò˙÷˙˙˙˙÷˙"ûü˙˙ü˙Ÿ˙ĝ÷˙Ï  ˙ù˙˙˙ô˙š˙˙˙ù Ó˙˙ĝ˙˙ùû˙˙÷¤ #Öù˙ú˘" žŭ˙ġ˙ʝ£ŭž•˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ù˙ù˙é˙ĝ˙ĝ˙Ìŝ˙ü˙˙ûĈ$ !#ġ˙í˙˙üÓ £Ë÷˙˙ġ˙˙˙ûû!Üŝ˙ó˙ü˙ûû˙˙˙˙ĝœ)&˙ĝ˙ü—Ôú˙úÌ˙˙˙˙û˙˙˙"Ħġ˙˙˙ ˙˙ĝú˙ËÙ˙˙ü˙˙ġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ú÷–( Ù˙ŝ˙ÒÎ˙˙ŝ˙˙î˙û˙˙íúû3Êë˙˙ŝ˙˙˙ĝü "Î˙ġ˙ä° ,Â˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙üû˙ŝüúÇ( !òû˙˙ô˙Ï˙İ'ò˙òù˙ ,‘˙ĝ÷˙˙˙Ħ˙ŝ˙ĝ !ħñçŝñĉ"˙•˙˙˙˙ž Ġ˙ŭ˙úû˙• Îŝ˙ÛöœŞïŭ˙ŝ˙˙úŝ˙Ħ*˙÷ú˙ôÖü˙úûġ$ !û˙˙ë¤Ò˙–¤ûü  ¨Ö#£˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭĝ˙˙ò˙ì˙˙˙˙Ğ Ì˙ú˙ï˙ù˙˙¨# •Ò˙ŝ˙ĝ˙ &Żî˙˙ŝ˙óû˙ġŜôú˙˙ïÒÏ˙˙÷ô,û˙ô˙ŭ+ŝ˙ġ˙¨˘˙ô˙Ú)İ˙ë˙ö˙˙ŝ$àĝ˙ô‹3¤íÙ˙ŭôÍ3.żÒ›˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĵ Êöŝ˙ŝ˙íŭû÷öû˙˙˙˙˙˙÷È ž˙üĝúġ˙ôÚĝµİÊ˙˙ò˙ó%"Îù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙û˙˙ĝ˙• ˙˙ú˙ö˙˙É(Äúŝ˙ü"ŸÙ˙÷˙ü˙Ò!žÓÖġĥ ˙üü“$"˙ ˙÷˙áí™-žôù˙˙ĝíú*Ŝù˙ö˙Ħ˘!˙úû˙ò%˙ú˙˙Ĥ!"˙˙úž$Ñ÷ùĝ˙ĠúÙŝ%š ŻŭÍ!ġ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙û˙ïè˙˙˙˙÷÷%•˙ü˙˙˙òÖôĠÙüÀŝúŝ˘!˙˙˙ĝĝ’§˙ĝú˙ !$˙ùêùÒ!˙˙˙ ˘ŭ˙ñ ! ˙˙˙˙šÉġ˙Í$”˙ïŭ˙ġ£ 3˜˙ô˙˙Ĵ˙œÖ˙˙ ß˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ñû× %­ÈÑ˙÷˙˙˙˙˙ò÷ûùá˙ùä"Ó÷˙˙˙˙ûĝ˙˙ ˘ġúì˙ŝ˙  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŭ˙˙ŝ/ Ğġ˙˙ĝ˙Ò''+"Ô˙íġ˙‘İúÌ˙œ'Ëúû£3!ŭÏ"ú) ú˙˙ì˙Ĉ0 ˙Èĉ˙ŝ˙ž"ë˙ö˙İ' ›˙˙üñ #ŸÎ˙˙ŭ”' (ñġġ£ü˙˙Ş'ÇòĝĊ$)/ĜĈİ"'Ì˙ôŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òú˙˙˙è˙ġ˙È+˙ôŭ˙ô˙˙˙˙* &Òŝ˙˙˙˙›)ŝĝú˙%$û˙˙Ë•˙˙˙˙ĝü˙ñ1›˙˙Í $˙÷ĝûĞ+¤éööĤ!#‰£˙˙ġÑ"§˙÷˙˙ ù(Âó÷$!%-ŝġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙öù™' +£Ġë˙ŭ˙˙˙˙˙˙˙˙´! œ˙ûôŭû˙˙ó£$ĠÓ˙ŭ˙ò$ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙ö˙˙•% ˙Ö   ˙ú˙Ġ™;œ˙Ñŭ ˙÷˙$%ú˙¤ $˜$.˙ò˙˙ùÚ ½˙˙ġ˙–¤˙˙óû,*ö˙ù˙˙ ˙ñüĴ×˙Ó( Ç˙ì˙•& àÔ˙Ï #(Žŭ˙ ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ç˙˙$ !#Ñù˙üĦ  ¤ıŬ˙ ĠÈô˙ìÉ)(Η' ¨Ïġ˙ĝó˙ * ¨˙˙˙ɍ%˙-˘ûûŭô! ú˙˙˙+-™˙˙Ĥ$" ‘Óü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùúï˙˙ÑŻ!" + ! ˙˙˙óùúûì˙ĝì"% ò˙ŭ˙ü˙˙˙˙“ '£˙ûŭÔ %˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ˙ò˙í<.!&’·  "˙ŝç˙˘ •÷˙ù&(†° ĝÈ$šġûŭ”, &žÂ˙ûúì˙’#ĥĝ˙òû#Éúó˙˙" Ĥġ˙ñ˙í™"#%ô˙ĝ"ħŸ˙ñûŝ$‹˙Ċ-*Ë˙˙˟1Żù˙üï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙üù˙Ÿ# #˙˙ü"  ğùù˙#- !Ë˙˙˙˙˙  ƒ˙˙˙˙í˙ö%*$'#³ó˙˙ïö"˜˙¨! Á˙÷ê˙ ! ĝô˙ġ& ‡§˙ĝÛ) œ˙˙ò˙îŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íù˙Ì%‡%+& ˙ó˙˙˙˙˙é˙ù™(ï˙ôú˙ò˙˙ĉğ Ġ§Âœ *% Şò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ö˙é~ $ŸÉɖ*!%Ĥĝŭò˙˙˙–"û˙ŝ˙˙Ż "ŭ˙'Ö˙ô˙á$˙˙˙ŝ˙˙ù˙™Ñúôò˙˘œ˙˙û˙˙‡ !¤÷û˙˙û˙Ë&#ô˙è˙˙£ #Ġöüü˙˙üÔ êü˙Œ%¤É˙ô˙ŭ˙³ÎÓŭ˙ö˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭ˙ĝü˙Ÿ £ÖĊ“ÔÓÇêÉ˙˙ô÷ÏÖÀħ( -÷˙ôġ˙3 Í˙ĝ˙ù˙ĉÒ$%˙ĝü˙ŭ˙˙ŝûŽ#Ô˙˙˙˙ù˙˙ó Î˙ĝÖ "×üŝ˙ñ˙˙˙˙ì˙˙À,Ûŝ˙˙˙˙ş!$­Ŭû˙ùë˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùö˙˙˙ô˙Ħ›¨Ŭ˜¤Ş*Ë˙ġûŝó˙˙ĝĜ& )ñ˙˙˙ĝ˙ù˙ùÍ  İ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŭĝ˙˙ûü˙˙ú–¤!˜¤˙ŝ˙ù˙ô˙˙–™¨Ÿü˙öü˙ù˙ŸÇ˙û˙ʞ(£ó˙ùû˙ôÈİİÊ÷˙˙óö˙ô˙˙û˙˙ï˙˙˙˙úĦ#Ûùŭû˙˙˙˙ŝû˙ú˙˙ġĝ˙ŭ˙’²£ôû˙˙˙ùô˙ĠĦŸÌ˙˙˙˙˙˙˙˙ùȰ ˙íöÒÔ Ĉ˙ô˙ôûû˙˙û˙ĝ˙˙ñ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷˙˙˙ŝ˙˙Ĉ˙ŝ˙˙÷˙ĝ˙ĝ˙ŭ˙÷˙˙ġ˙˙ùŭ˙˙ôŭ˙˙ŭ˙ù˙Ħ£“¨Óŝŝŝ˙ĝï˙ê˙Ħ˜İ˙î˙˙˙ŝ˙˙ú˙˙˙˙ó˙˙ú˙ôü˙ö˙˙˙ĝ˙˙û˙û˙ü˙˙ŭú˙˙û˙˙ġŭ¤Ò˙ĝ˙òĝ˙˙˙÷ü˙Ìŭ˙ü˙ĦÑġù˙÷˙˙öġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙÷˙˙÷˙Ç˙ó˙ú˙ù˙Ĥ%È˙ôû˙ġ˙˙š (# ˙ŝù˙˙ĝ˙˙è² # $ ÁÚŝñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙Úëŝ˙ŭùŭ˙˙ŝòëò˙˙û˙˙˙˙ü÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙üŭŝÑ"ú˙ŝ˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷ÖÖ÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ó"Ùŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġġ˙˙ĝŝ˙óâì˙˙ï˙÷š×÷˙˙˙ûŝò™/" Íö˙˙˙ŭû˙˙˙ìז,%'˜Ê˙ĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙ëóü˙˙ŭ˙˙˙˙ùġú˙˙ŭŭûüü÷òö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙üŭ˙˙ŭâ Š˙ú˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙÷òúë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙÷û˙˙˙ŝ˙˙˙óû˙à áŭŝŝö˙˙˙˙éĵÎŭ˙˙ó˙ò÷˙˙ûŝŝû˙˙ö˙úñÀÑê˙î˙˙ĝöĝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙ŝüûŭ˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙ŝŝŝú÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙œĦ—ßë˙éŜ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙û˙˙˙ċ˙ú˙ñ˙˙ûúÁ˜˙ĝ˙ùĝö˙˙ïù˙ĝó˙à˙˙˙ŝ˙˙ŝôĝ˙˙˙ù˙û˙÷ö˙˙˙˙˙óŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ŝü˙˙˙ŝŝŝŝ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙0‚˙ĝż ĝ˙ü˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ôôĝü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙ö˙ġó˙ĝ˙˙÷üŝ˙˙Ë#÷˙ùŝŝŝ˙˙˙˙˙ù˙ŭ˙˙˙ùúŝ˙˙˙˙˙˙˙˙ü˙óŭ˙˙ĝ˙ŭùñù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙ŝ˙˙ŭüüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ċ!"˙ î˙˙˙ġ˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ùĝĝ˙ù˙ȝ˙˙˙˙óŝ˙÷&ùûû˙˙˙˙÷î˙ŭö˙˙ëü˙˙ŝ˙˙ûŭ˙˙üŝŝû˙˙˙üĝ˙˙ĝ˙ŝ˙üë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙ü˙˙üüŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ħ%4 (!' ˙˙˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ĝġ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝñ˙˙ß.  ˜÷˙˙˙úñ­ž˙öġúúùŝ˙˙˙˙ŭ÷˙˙ó˙ò˙˙˙ûû˙ŝù˙˙˙˙˙˙˙˙ùĝû˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙ŝ˙˙ŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ /!½˙ġì˙˙÷˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝŝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ñ² %˙ŝó˙˙˙"úü˙˙˙˙˙ù˙˙óĝ˙ŭŭû˙÷˙˙ŭ˙˙˙˙˙˙˙üüü˙˙ŭö˙˙˙úŝ˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙˙˙˙úû˙˙ŝûŭü˙˙ŭŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¨ Ħ û˙ô˙í˙˙ĝ˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭûŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭ˙œ$˙ġ˙ó˙#˜˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ù˙ġ*³ŜÒ§,‡ĉóñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙öä1&À˙˙û˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙ĝ˙ı¨)#¤˙˙ôö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭöŭ˙˙˙˙ÍÙşĦݨÈúŭŝ˙˙üŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙è˙ìò˙˙ĝ˙î˙˙˙îŭ˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭú÷˙˙˙ñ˙ĝ˙˙˙˙˙ŝ˙úú˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŝô˙ĝú˙ò˙˙ŝġ˙úú˙û˙ŝó˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŝŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ú˙˙ŭ˙˙üŭ˙û˙ġ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙ŝ˙ó˙÷˙ŭ˙˙ŭü˙ŭû˙ŝ˙˙˙ú˙ù˙˙ù˙˙úüù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙ûú˙˙ŭŝ˙˙˙˙˙ôŭ˙˙ġüŭù˙˙˙˙˙˙˙˙üú˙˙˙òŝ˙òú˙˙˙ŭŝ˙ŝéŭ˙üü˙ú÷÷˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝŝüü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úüŭûü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ùù˙˙ĝ˙˙û˙˙˙ú˙˙˙üû˙˙˙ú˙˙˙˙˙˙˙˙˙ùûĝ˙ú˙˙˙˙˙ŭŭ˙˙ú˙ô˙˙î˙˙÷˙˙ġ˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüüŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üô˙˙÷ŭ˙˙˙üŭ˙ü÷˙ġ˙ó÷˙óó˙˙˙˙˙˙˙˙˙˙˙˙ĝŭ˙˙˙îò˙˙ŭĝ˙˙ü˙÷˙˙Ó˙ġó˙ù˙ĝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ôŝ˙ú˙üŝ˙˙˙˙ŝŝ˙˙ù÷˙˙˙˙û˙˙˙˙˙˙˙˙ùĝ˙˙ŝŝîù˙˙ùŭŝŝ˙˙ĝ˙üó˙˙˙ŭ˙û˙ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷úŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùû˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ġ˙˙ŭ˙÷ŝû˙˙ŝ˙˙ö˙˙˙úŝ˙îŭ˙˙˙˙˙˙˙˙˙îò˙˙˙ô˙ġ˙ûö˙˙ŭŭ˙ŭ˙ġŝ˙óú˙ú˙˙ü˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öò÷üüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñïôü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î·ĊÊÁó˙˙ö˙˙ù˙˙ÍÑ ˙˙˙˙˙˙˙˙˙˙ĝù˙˙͖* -ı˙˙˙ĝô˙ùöŭ˙Ó ĦŞĊ§ùüŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙“!˙ö˙ó˙˙ó˙ġĤ"& ù˙˙˙˙˙˙˙˙ú˙üŽ"#  ­˙ò˙˙˙˙˙˙˙úÒü˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙üü˙˙ġ˙˙ŝüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ú˙í˙ûŭú˙ŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝġŝ˙˙÷ŝ˙˙ùü˙È˙˙ûÑ˙ú˙˙Ì˙ŝ˙ñ˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝѤ £Ġŝ˙ù˙˙ô˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙ü˙ŭŭŝú˙˙û˙˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙÷˙÷˙˙ŝĝ˙ŭŭ˙˙ŭŭ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙÷Ó§™§žö˙˙ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ô˙ü˙˙ú˙ûü˙˙˙˙˙˙—¨¤–˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝòû˙ù˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝü˙˙ŭ˙˙˙˙˙˙˙˙˙ġ˙˙ü˙ž ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úó˙ö˙˙˙î˙˙˙ŝüġ˙ú˙˙ŝ˙ŝû˙÷˙ŭü˙ö˙ĝ˙˜˙ŭ˙úü˙$ Ù˙ú˙üöŝŝ˙˙ùûŻ #œÍ˙ġ˙˙˙˙ĝú˙! Ĥöŭ˙ó˙˙ôú˙ûü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙î˙ú˙ù˙û˙÷˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ê˙˙˙ôú˙˙ú˙˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙÷ü˙•¨ôúûŭ˙˙Îŭŝŭ˙úÙ˙˙˙˙ĉ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙' ô˙û÷˙˙ġ˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙üü˙üĝ˙ÁËÎğ˙ùŝġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙­ &¤Ô˙ŝ˙ùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô÷˙  "Ĝ˙˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù÷˙öú˙˙˙˙˙˙ŝöџ% œó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙ŝ˙ŭùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙úü˙˙˙˙˙˙˙˙˙˙˙˙êÜġ&*ŝô˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙˙˙ü˙ó˙ùŭöú˙˙˙ŭĝ˙ñùô˙ûú˙ġû˙˙ŝŝ÷") *Ôùŝñ˙ŭÓ% &+Àñ˙ŝ˙˙˙˙ûŝ˙˙Ê)%"í˙˙ŭù˙ö˙ü˙Ğ%2É˙ĝ˙ù˙˙˙˙˙û˙ùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ó˙˙üŭŭ˙ü˙˙˙öġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙˙˙öĝ˙ġö˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙֋'”š–˜­–žš˘–—¤Œ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û - !!·ù˙ĝù˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙ï˙˙Ŝ’$×ú˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙µ&#ŝ˙˙˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Û %Òò˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ö˙˙ŝġ˙˙çĉñĦ$$ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŭġù˙ôü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġ÷˙˙üú˙˙˙˙˙˙˙˙˙ŭ˙˙ú˙!˙ŝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ĝ˙÷ŝŭ˙˙ì˙˙ù÷ò˙˙˙˙˙˙û˙ü˙˙˙ôì˙˙ĝ 2ú˙˙÷˙ĝ"ìş¨ûá˙ìŝ÷ŭŝü˙˙˙ûšŸ˙èè˙ŭ˙˙˙üó˙0†ĝ˙ĝûŭ˙ĝö˙ü˙ñ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üüöŭ˙˙ĝ˙êúû÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙óÑĠ  ˙÷˙˙óö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙öĝ˙½,%)  '  ­ĝÍ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“ċ˙ŭĝ˙˙úüŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ½Ç˙ü˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙ĉ˙‘ œ˙ó˙öŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝúÊ& $Óù˙ŝĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ù˙˙ġ˙ŭŭú˙˙£ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùñ˙˙˙˙˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙˙ö™  1ô÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝŝ˙˙˙˙˙˙ĉ˙˙˙÷Ŭ˙˙ô˙ùŭŝŭ˙ûë˙˙˙˙˙1 Ó˙ġ˙˙˙Ü˙İÎÑ˙í˙˙˙˙˙ŝ˙˙üü˙ú(ì˙˙û˙ó÷û˙˙˙ÔÚ ”Û˙˙úû˙ĝ˙˙˙ìö˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ûÈ,Ĥ™û˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ߔ ˙ŭù˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ûúژ( °+#È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïÍ!#ĴÜäñ˙˙ŝù˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙ĝ˙úŭ䒯% Ô˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙ú˙š œ˙ó˙öŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úñù˙Ġ&!-˙˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝŭó˙˙ŝ˙˙ġ˙˙˙úû÷š +÷ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭö˙˙÷óĝ˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŝô÷üû˙˙˙˙˙˙˙˙˙ŝûĝ˙íß ú˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ë˙îŭï˙ŝ÷˙˙ŭúŭ˙˙˙ûŝ˙ü˙˙˙˙úúúòŭ˙¤›Ĥ˙û˙ò˙ô­9 ˙ñé˙÷˙˙˙˙˙üò˙ö˙ŭú˙ü˙  ˘Ôô˙˙ô˙ú˙îŭ˙ŭ˙Ùŭú÷üŭ˙ü÷˙ŝ˙Òŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú $ .ë˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì/ #&&%´˙ŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭ˙ŭ÷˙ŝÊĥ˘˙Ó÷Ĉş!Ô˙˙˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙&Ÿó˙ĝû˙˙ùú˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙úì˙û˙ŭƒ$ ñ˙˙óö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙ĝúĠ*ŝ˙˙˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûö*&…˙ùëú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ùü˙ġ˙˙˙˙÷êö˙˙ĝŬ '‘û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙ü˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭŭü˙˙˙÷˙˙˙˙˙˙˙˙ö˙˙ŭ˙˙ċ/ "!˙˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ó˙ò˙˙˙˙ó˙˙ù§ŸÍ˙ê˙ùü÷˙˙÷ŝŝĝ˙ŝ˙˙ôúŭ˙îû˙˙ö˙Ž Ÿ˙˙˙˙˙˙˙ò˙˙üŭü˙˙˙˙ôü."˙˙ġù˙÷˙ĝ˙˙÷˙˙ëö˙ûú˙û˙˙˙ġüöĝĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ğ2%- áúó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙,  §˙˙÷ù˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ü˙˙˙ñ˙˙˙óċ¨ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ü˙˙ò˙˙˙ùŭ˙üûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙ċü˙˙,Úô˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙ž" Ô˙ŝ˙ùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙è˙Ñ!˙˙ú˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ĝ˙žĵ˙˙ġ˙˙ŭñ˘% ›˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üñ˙úö˙ì˙ì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙˙‘ $íĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙û˙˙ŬÀŜ°÷Ç ! Ï˙˙ûÊ"Ÿ˙˙÷÷˙ŭġü˙ŭ˙ŭ˙˙ûúĜ˙1 ˙Òî˙ġ÷üŝĜÊ×ÛÇ˙ù˙˙ŝ˙˙#Ĉ˙ÍÎ˙˙˙ù˙˙û÷ĝ˙˙˙˙˙ŝ˙ŭ˙˙ġıĦú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙&!Ÿŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ¨)˙û˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ˙üú˙ŝÑúŝ˙˙ĝ÷˙îŞĜùü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙û˙ĝ÷˙˙ŭ˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙ú˙ġĝ˙˙ñÓ(˜û˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙Ò˙Îİŭŭ˙˙ŭŭ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙!žó˙˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭ˙ú˙ù  öŝ˙˙ö˙˙Ÿ $Öùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙÷˙#™²è˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙ûÍİÇ˙˙˙˙˙˙˙˙˙üù˙˙ûÉ˙˙û˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ġú&%  Şšŝ˙ .ĥ˙˙üŭü˙ò˙ú˙ŝú˙˙ĝÊ !™˙˙˙û˙˙˙˙ž% '˙û˙ñ˙˙Ì$Èû%ô˙÷˙ú˙ö˙˙ĝ˙ġ˙ŭú˙˙ŭ˙Ħ # Î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙ú˙ü˙ó˙ŝ˙˙ú˙—! Ħ˙˙˙˙ŭ˙˙ü˙û˙˙˙˙íĝ˙üġ˙˙˙˙˙û˙ĝ˘Ġ˙ËÔÙûġ˙˙ŭŭ˙ŝ˙˙ŝ˙ĝô˙ô˙ú˙ö˙˙Ê˙˙ñ˙˙˙˙û˙ùŭ˙ñ˙÷˙˙ĝ˙ùû˙÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ ŝ˙ö˙ûû˙úÁµŭö˙ôû˙˙˙ŭŭû˙˙üĝ˙÷ó˙ó˙˙˙ü˙ŝ˙ú˙üü˙ĝü˙ô˙˙û˙ò˙ö÷˙˙û˙˙öÌ˘ ™ËË˙ûô˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ö˙˙ĝú˙ûŭ˙˙ÒÈ˙÷ÁĴ¨ŭ˙ŝŝ˙ûŝ˙úû˙˙ñ˙ŝ˙Ò ŞÍò˙ú˙ù˙˙òӞ˙˙ò˙˙ù˙˙÷Ï˙˙š¤ùġ˙˙˙˙ôûúú˙ŝü˙ôÈĤŝŝŝ˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĈŞœ áôġŝû˙˙÷ŭާ¤Ì˙˙“¤û˙˙òüŝ˙÷ŭúŝ˙öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙Îöĝ˙˙ò˙ŭ˙ü˙ñ˙öö˙ô˙ûŝĜ˙˙˙˙˙û˙Ö˙˘ž˙÷ġ˙ö˙˙¤ (˙ŭúÖù˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŭŭŝ˙ŭ˙öÖÂŝ˙˙ •˙˙û˙˙ĝ˙üö˙ĝö˙˙˙ñ˙˙ô˙û˙˙˙ó˙ï˙˙úِ˙˙ò˙üû˙ĦŸÖ˙ûŝ˙˙˙ü˙˙ġ˙˙úŸĠû˙˙ġ˙˙˙ڛŭ˙ÚÖ˙ŝ˙ù˙÷!! ˙Ôú˙ù˙˙˙ô˙˙÷˙ĝúùü˙қû˙÷˙˙ú˙˙¨¸ûû˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷˙˙˙÷˙÷˙üÇ˙ò˙˙˙ûŭ˙˙ ˙É˙˜¤ž£Í˙ö˙˙˙˙˙˙ñ˙úĝ˙É * ŝ÷˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙÷˙! # œ ˘! İÔ˙ŭ÷ü˙ĊŜœĈ˙ĝ˙Ñġ˙˙˙ŝó˙˘"š˙ñú˙Ġ$™˙˙ŭ˙+˙˙û˙ÇôĤ+4ô˙ŝòü˙˙˙ö˙ö˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝóĝûŭ˙˙ò˙ĝ˙Ħ)£žö˙˙ŝüóù˙è˙ìüŝ÷ù˙úü˙ġ˙ù˙˙öġĉ˙˙ò˙Ê Şé˙˙ù˙˙˙ûü˙÷˙ŝúî˙˙˙ù˙îŝû˙˙í˙˙ċ˙ûò˙˙˙˙˙˙ù˙˙ŭ˙˙öó˙ôû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ "°˙ô˙˙§÷˙˙òê˙ġ˙˙™˙•÷ŭ˙˙û˙Á ¤ŭĠÍö˙˙ĈŻžñüŭ˙˙Éŝİ´$¤˙ô˙˙ĝ§!¨÷ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĉқ›Ĵ÷˙ŝŝĝ˙—#%+œŝ÷˙ó˙ĝ˙˙ñŭÑŭ˙ô˙˙˙û˙û˙˘”Ġ˙é˙˙ŝ˙˙ĵ#%Ğ˙ü˙ĝ˙˙˙÷˙ÉĈ˙Ñ˙ ˜ûüŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ—, -°˙ïŝù˙Í Ǥ! ˙˙˙˙ûĊĜ˘˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝùŝ˙ÓÔ˙˙Í*ûŝú˙˙˙˙˙˙ôŸ÷ŭ˙ï÷˙˙÷ŝĵ* ÙĈ˙˙÷˙ɖ$ö˙ú Ÿ˙Ëö˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭï˙ġó˙ĈÁÔ³˙ÎÇ×ù˙ĝ˙˙Ê˙äÎ˙˙û˙˙ùßÂù˙˙˙˙úĉÖĜÈĜü'Óü˙îÙ÷Í"×Ö˙ôû˙˙öġċó˙Í$ž àù˙ŝö˙½÷ĦĜú"Âü˙Á '  Ħ˙÷ŭ˙£­™ Ì˙˙Ħ½óû˙ôü˙£$ ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ù˙÷ŝ˙ÔĤ Ĵ"'ëù˙ŝ˙Ż ×˙7 $$˙˙ŭë˙Ó÷”$  É˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöŝ˙˙˙)$ ' ( ™ŭ˙˙˙é) #œçŝ˙ġĤ˙˙˙ĝù˙–Ùùı!#é˙˙í ' ŞûìÛ"Ğ˙ë˙Ğ %"÷òŭí˙ĥëċ&˙ĉù˙˙üóŝ˙ò˙ù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙˙ü˙˙ĝŝŝ˙ô˙Ħ( ˙ñ˙ŭú˙˙˙˙˙˙˙˙ŭç˙ûí˙˙ä˙˙÷ú˙˙˙ì˙Ò˙˘Í˙í˙ŝ˙ĝ˙ùüĝ˙ùü˙˙˙˙îü˙ŭ˙ûŝïû˙¤È˙˙˙û˙ûŝò˙÷ù˙ĝî˙ñ˙ŭò˙˙öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝñù#ĝ˙ûšûû˙˙˙ôĝÒ!+ ²ûú˙íĞÀ!Ô˙û˙ú% ˙˙íÙ˙÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĝô˙˙ŝ¨  !äŭô˙ŝòŝô˘'''—ë˙ùéŝ͎!3 ô˙˙ùô˙ѧ* Ç˙ġ˙ŭë˙ôÍ"' ( ˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ* Ġ˙ù˙,˙ú˙ŭİ #é÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úüúÊ´§‹Ĥ£Ô˙ŝ˙ûÁž”š+›°Žĥ˙ï˙˙ÒĥŸ§ŞÉ˙÷˙²!§ĤŸ!šı—˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙í,& '˙˙˙Ê/ É˙˙ '!­˙ŝú( ˙Ϥ) ›˙˙èŭ˙ŝúÒ$!(²˙ġ˙ž' %¨˙˙œ ĥ˘(!Ü˙ġž %%ġ˙ ˙˙ë˙˙*%"˘Ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˜'  ³˙˙Ë!%$ ,ó˙ġ˙˙ŭž/ '%Ĵ˙ŝö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙ôó+% ˘˙ü¤/ˆ˙Ġ…$&ŝöġ˙˙!# ˙˙ó˙üóŭüó˙Â+óû˙䝜î˙˙˙Ü ˙ù˙˙Ĉö˙çÚ˙˙˙˙• &˙˙Ÿ(Ò˙˙ĝ˙˙˙ùöĝóĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙ùŝ˙ú˙˙˙î)*³Š˙ŝŭ˙÷˙üäûùËĈĠÓ˙˙˙˙ñÓĜÏûó˙úÌÀ˙ŝ˙ĝ˙ì˙ù˙˙˙ŭ˙' ­Äïò˙ĝü˙ó˙ŝ˙˙ߝ²˙÷˙˙ûúú­ +¤Í˙í˙˙ĝé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŞ#÷˙Ñ˙ŝüġó˙˙È0#,˙ĝ˙)ÑÚ#Ëûŭî¤*'  ûß #!šù˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È)Ħŭ˙ñĝ'% (µâ˙ö˙˙×Ñ - &˘˙˙ë˙˙Ĥ( +•üÉ˙˙úù£ &$ž˙˙˙˙˙› —ĝŭ˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙"  Ĥû˙íÔ "!ˆ˙˘ ++î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ô½—Ŭ ú˙˙ɰ)ÒżË¨ (Ïŭ£*—˙˙˧!¨ %ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙ò˙Ë'¸Ì  ˙û˙œ ,"•ûöâ ŝ˙ñ˙", !!) .Äù˙˙˙Ÿ ĠĜ §û˙ú *.Úü–)˘˙íŝ˙¤ùŝ˙ ˙˙ќ&§ĝàü§*  )ïÑ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Àŝ!#ŭ˙íû ÍÍŝ1 &àü˙˙éš –È˙˙Ê) Ĉġ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ü˙˙˙ż$Ö˙˙ŭϜ  ˙˙˙˙Ż›ŭ˙˙ŝò˙ ż˙ôŝüż˙ŝ˙˙ê(–ŝ˙÷˙ÑĠ˙˙ñŭ˙Œ%˙ĝ˙˙Ô!˙öúü˙Ÿ÷ŝ˙% "& !˜üó˙û˙˙˙˙˙ö˙˙ŝúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭùġ˙˙ü˙˙üŭ˙‘Ĥ! ò˙ġ˙ŭŭü˙ó˙˙˙$Í˙üÎ˙šĠ˙úŸ"ĦêŝÑĴ"Ğ˙ġöŭĝöġß*%˙ŭùĝ˙÷˙úùò½ #˙˙öü˙ߝ  ˙˙ú˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ú!,£Ğ –˙ŝĝ˙˙ùùĦ)˘Ş  •ŝ˙˘$) ñ# š˙˙˙É5ĜÁŻ'£ŝ$Ìô‰ #•ßĝġ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙³&˙˙˙ü• !!˙‘$§˙˙ĝŜ–Ôû'ĥÁ÷˙ñ˙&Ú˙Ġ$ĝ˙ µĝ˙ŝÎ#ħé˙È1 ˙ñ˙˙ ĉïùŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙+ ÏóÙ˙ú˙ŭÑ%&›˙#Á˙°˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ü!ö˙ĝĦ3 Êû˙˜ ˙˙˙˙° &˙÷˙˙ž $œ—İáò˙Ï )İ˙ö˙ &Ħ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙ĝ¤+ ™öú˙˙˙˙ö˘Ğ˙˙úŬ$#ŭ˙˙÷â'üù˙˙" §ĝ˙ú!Ĥ˙˙ü#˙•)ÎĝÖ£0Ùó˙Żàí˙Ŭòĉŝ˙ĝÏ$şí˙ó˙$Â˙úüÉ ! !Ħŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙öĵ$ ĜÎ Ĝû˙˙Ġ *Ú˙ú˙ş%Óĝ˙˙Ô!èñĠ˙˙ò­ú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝ˙˙÷˙Ş˙ñ˙˙˙&§˙ööŝù˙Çŭü˙˙Ş˙ŝ˙˙˙‡ ™öù˙˙ ˙í˙üö˙ñô˙˙ŝ˙#’ó˙˙ïÔ ˙˙˙ûÂ%˙˙ù& (#˙˙÷ÎÊ˙üÁ˙ĝòûò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝü˙˙ĞĴôû˙ó" )!ŭû–ĞĤÚöŭ -˙ġİ &% "û"& ˙İ% Ż'˙˙÷˙ô¨¤$ ˙ù˙Ê'İ ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ê)*!%ĞòÔ˙öŭüŻ"Â˙úĠĦ$0÷ì˙òĦ à÷˙üê˙ĦœŸ¤Ë£ùŭ+²Ÿĉ­˘˙ŝ˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙™#™ïò˙ġ˙ Ŝ˙˙˙˙³÷ĝĠ”"×˙˙˙ $–ŝ˙÷ġ!ò˙Ŭ Ó $(Ä˙ü˙÷  §óù˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïݝ˙˙ì˙ġ àÄÊÔ˙ó İŜĦ ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙Ò´èú˙˙­œ˙Żš˙ŭôñ˙”˙ùĝÙ ‡˙˙˙ñò˙Ĝñ˙ŭñ˙ (—˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝġöé˙Ŭ1›ŝ˙˙˙Ĵù˙˙˙İÓùŭ˙ı $î˙ĝ˙˙ì˜#ö˙˙ÁöŞÎŝ˙÷½2 ï˙ú˙ !Ħ˙ñûÓ &'˙˙Äö˙ -& ŭü˙ò˙%èó˙Í" ĝü˙˙/˙ŭù˙İ$&%Î˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷û˙) Îûĉ˙"Ç˙ŭ˙ó² ˙üìÎ!ñûüü—""Ñ˙üî˙˙1"ˆ˙úó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŭûç˙ò ""˙˙ï˙ü ò˙˙˙˙"ë˙ú˙˙î§‘Óù˙˙˙ŞÙŭ˙˙˜&ž˙˙˙˙ö˙úú˙üü'˙˙ù˙Ĉ% ô˙˙˙ŭÔ˙´ùÍÍġÒÜË˙ú)&(˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙í%°˙úÙ "+İù˙˙£ $›Í˙!&Ìù& 0 ÏĜ¨˙ Î˙Ĥ%×úü˙˘+—ÉĴ"ï÷˙"òú˙£!Ùüúú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ 6ÂŜŞ—˙˙î˙ù˙ ĉï˙òü˙ ­˙˙úĜ—˙˙•İÍÎ%! 1˙˙) ŭ˙ċ˙˙÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òí²Ġ˙÷ġ˙ù’(ħ˙òŭú%(˙˙˙%ğñüŝô˙ùù˙° -›§Ğó˙ġ“ % ˙ÒŝİĴÌ ˙ñ˙˙ġ)%›˙˙˙˙˙ŝüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ûùô˙çÎ,Ñé˙˙˙)˙˙úĝĠ" 1ŬŜĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙ʘ˙˙ìöò'#˙„'!àûó˙˙ñ×ÏŝŭĠ/´èŭŝ˙˙öË &(üô˙˙÷ ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïû˙û˙˙˙ü˙ $Éûüúĝ• *˙ġ˙ç0ġ˙ġ˙Ù ˙ë˙ì˙˙ ŭû˙˙ ™Öùô˙˙˙û˙Ġ ) &#%˜ġ˙ú˙ž ÷ò˙÷˙˙˙˙û˙ü˙$0üġŝù%˙ö˙ĝ" ôû˙ô˘  #ŽÙŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ›ŞÖ˙˙˙ñ’# !×˙˙î˙¨Şŭûú˙˙ ˙˙˙ĝêö˙üù˙ ëŝ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üùŭ˙˙÷˙úòŝ˙÷˙•˙îùŝû#Öŝü˙ûó'¨úûûŭö¨Í˙ô˙(³òûñ˙˙ġ˙˙ŝ˙üá¤íĝû˙Î"˙ìë˙ù(ü˙"ú˙ġ˙˙üŭÔ& ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ù˙Ì % ŝ˙˙Ĥö÷ß ü˙˙ö$ ˘ž˙÷Ñ!›˙ô˙"˙ùö˙ %ž˙ù˙›ûĜ˙͙ž˙˙Ÿ Ĥ&§÷ú˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙!˙ŝŭÖ ˙ù˙ġ˙ö"ĝ˙˙˙˙ü$È˙û˙˙ü !ÌŝúÚĴ!úò˙ŝŝ÷ûĝ˙ŝ˙˙ Ë˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭû*£ò˙˙ò›˙ñ˙Ö˙˜ ˙˙˙˜Ç˙÷˙˙ĝ ˙˙ü˙÷ñ˙ï˙˙ûĝ˙ö˙˘Ë˙ŭ˙˙˙ö˙ŭò˙Ġ÷˙î˙˙›˙ŝûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ô˙ĠĈ˙ŝò˙ûŸŬ˙÷˙˙˙À" $Ÿ˙¤˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙² œ˙˙ü˙ŝ '˙'É˙˙ûô˙úĜ˙ûÏ ˙˙ò˙ö˙" Ÿ˙ú˙÷˙%˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭó˙üĈ% Ú˙üŝûŻ·í˙ù˙İ Ŝô˙ëÜö˙ŭü˙ù˘ ˙úó˙ġĦ˙ü˙ûù "!ñ˙˙‡- £œ˙˙ĉ˙˙˙ġ˙Ç£˙˙˙˙ùÓ"˙÷ùú˙˙×Ĵ %–÷Ü˙ŝĞ$Èü˙˙ŭ ˙˙ô˙ĈĞĞŝô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ú˙úŝ˙úÌ%˙ó˙ñĝ#Ìŭ˙˙üù ˙ñ˙˙˙ŭŝŝ˙˙™ü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙û˙üġ˙ŝù˙ÒÉĦ"ó˙˙ĝ˙ Ġù˙û˙˙Ÿ™˙˙˙˙ġÌ˙ù˙ ' ˙˙û˙˙˙úĝ˙öû÷ ˙˙˙ĝÑÊ˙˙˙Ê˙û˙ö˙ú˙˙û˙œ" %Ŭé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝú˙À" œ˙–£ÓĊ"¤ûŝ˙Ġ& ˙˙˙ù #&ùû˙˙˙$˘üËÎûŝ˙üĴ˙ï˙˙ÈÓÙù˙÷ú"˙ĝù˙Ğ˙˙ó˙˙˙ËÖü˙˙£# " #­úü˙ô˙ö˙ñ˙˙ó˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü!Ÿùŝŭú ˙ñû˙˙•ù÷˙˙˙˙ĝ£˙˙üġ˙Í!ú˙ĝ˙ĝ#˙û˙ŝŝŝġ˙˙˙ûË!žÜùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭ˙!Ĥ˙ö˙˙$İĠó˙ö˙¨ŭ˙ú›"×˙ö˙Ì˙&úŭû˙§ó˙ú˙ó˙˙˙ö˙ĝÓ˙˙ô˙ġ˙˙ï˙ñ´Ĉ˙˙ú˙˙Ñ'˙˙ù˙ùñ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÒÈ!ÔĈÍ˙ĝ˙ûÉ) ˙ŝ˙û˙óú˙ÒÇ˙˙ú˙˙ĝ˙˙ó˙˙˙û˙˙˙˙˙ŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûÒ×ŭ˙˙ŝ˙!˙$ ï˙˙î˙ù×!Íĝ˙Ò !˙˙ô˙öô˙˙É˙üŝ÷˙!˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙úÛàù˙ú˙’)í˙û˙"™˙ù˙÷ÔÛö˙ç˙ŝÎùù˙È˙˘˙˙˙ò˙!˙÷Ġ#™˙ú˙üù˙˙ö˙üÒ˙›Ûüü˙˙ôÚ$Ì˙üù˙˙óİ  û˙˙ŝ‘É˙˙ŝĝŭù˙˙˙˙Öö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙úŭŬ ˘ŭÒ˙ñ˙˙÷Ĵí˙˙ŭÊÈùŝ˙$Ìŝû˙ŝùÖù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝ˙˙û˙#˙˙˙ü˙§ŝú˙ú˙& Îŭ˙˙ŝ˙$)š˙˙ŭû˙ œ˙ĝ˙ùĴġ˙ü÷˙˙ù˙˙ŝ˙"ĦÙú÷˙Ç&˙˙÷˙˙•˙˙Ô ˙ù˙˙ŝ˙˙˙˙œ(3À˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ò˙˙˙˙˙˙˙”ö˙ù˙öŻ'Ġí˙ù" ü˙ò˙ñ!ó˙˙û˙˙ġĠ’&'—˙˙˙ŭ˙˙÷ú÷˙ŭ¨"ô˙˙ö !î˙˙ö˙ù˙ü˙üġ! %'$˙öŝ˙ŝ˙ó˙ö˙ô˙ôö˙îŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉ˙˙™!×˙ŭ˙ŭ…ž˙˙˙ŝï¤˙˙ŝñĝ˙˙ ßû˙ú˙üü(˙ï˙ġ˙¤žžŝ˙ñúô˙˙˙ùûü˙ŝĤĤŸœ˙˙÷˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙! ›˙è˙˙ĝ"™˙˙˙ŭ‘ ŝ˙ŭĥ Òôŝò˙íĞ"Ç˙üÇŭËĝ˙˙öü˙ùöü˙˙ $˜˙í˙ñ˙ġ˙ù˙ğ*ġû˙÷÷˙żúŭŭ˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ$˙˙&˙ü˙ŝŸ'í˙˙ùô˙"Óô÷˙ĝ˙ĝè˙ô˙˙ĝÎċòġŝ˙ŭŭŝ˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙ŭ˙ñ˙óĝĤ# "ĝ+ ˙ë˙ŭüġ˙Ġ˙úĠÈ˙˙î˙˙˙˙#Ì˙óŝ˙ô# ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôù˙üû˙˙ç!!Êġ˙˙˙ħ!˙˙˙˙îÁĞù˙ûúĠ˙ŝ˙ù˙Ô Ú˙ĝŝ˙ö#áĊ˙˙ĝ¨#ù˙û žòü÷˙˙˙û˙˙˙öŝÈŝ˙ü˙˙ġ˙ö˙ù˙úË˙ċûŝ*–˙˙˙˙˙&!+û˙ġ˙ñŝ˙ĈŸ‘ Ħĝö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙Ġ)Ĵŝı ˙ó˙˙ġ Ż˙üî˙Í˙˙˙ú%ê˙˙˙˙ ˙ċü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù˙˙'!ŝöŝ˙&ù˙ï˙˙ !äúû˙Ġġ"¸½ŝĝŭÈ/›ŝ˙˙˙,# ˙Ë˙˙Éü˙ú÷˙ïŸç˙˙˙×" ö˙˙ù ™Óġ'Á˙˙˙î˙ŭ˙ì˙ù +ñ˙Ľ˙ŝġŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙óŭ˙¤ş÷ùŭëÜŬ˙üù˙˙ŽÏ˙ï˙ %Ĝùú˙˙ŭÉ"›˙üô˙˙ù˙˙Ş–ú˙÷ôú˙Ü˙  )˙î˙ŝ.*ŝ˙˙üû˙êŝ˙ŭÒ!˙Ìñ˙˙ê˙˙ó˙ô˙˟›¸˙˙˙üûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò+& À˙ô÷˙ü˙ŝöôó˙£Ÿŭ˙ŝ˙˙˙ï#+á˙˙íŝ˙§"'×˙Ċ˙ŝüŝ$˙ĝ˙ü˙˙í˙˙˙˙ŝñĝ˙˙˘ ñ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙ö  ó˙é˙˙¨,İô˙˙÷çüŭĔ#!˙î˙˙ú !"˙ï˙˙ù˙ô˙â˙˙˙˙˙˙ê˙ÚÎ˙òġ˙˙ÀÚö˙˙ Ô˙˙˙˙•%í˙ĝ˙ö˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Í˙çü "–˙˙ò˙˙Ö Ë˙˙û˙˙ŝ! •˙˙ì˙ŭ˙˙˙ŝ˙ŭÈ.ûŭŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙Ĥú˙˙˙˙Ԟ + ˙•˙÷˙˙¨Í˙êÍ#ù˙˙˙ó˙ŭÑ$˙î˙˙˙. ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöü˙ĉ#âö˙ô÷Öñïġ˙çÓë˙ü˙ä œôñ˙ġŸ µ˙ŭö˙1ŝ˙éù˙‹( '˙÷˙Ğ Ñ˙˙÷˙ñ˙üŝû˙Ÿ Ô˙ĝ˙˙üŭĤ ˙ĝĝŝĠìĤ'ŝû˙ù˙ž (Ú÷˙÷˙˙û˙ô˙˙í˙ùĥ&˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ö˙#œĝ½ù!Ċ˙˙è˙žÑ˙ëÍÒ˙˙š1·‘ù˙ÄÑ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ú˙˙˙ùœäŝóĠ+˙é˙üÌ ž˙˙˙úĝ)˙ù˙˙*'Ċè˙ñ˙  0İ  + ˙ŝ˙˙° ) ŞûĜúŠ .˙ŝñ¨ )˙˙˙Ï'™ µ#ü˙˙ĝŝ˙˙÷ú˙˙˙ñŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ŝúŭŝ÷˙˙˙˙– Ööġ˙˙û´Ħú˙˙˙˙ú˙ùĝ˙˙×.èŭ˙ġì˙ŭž#˙òñ˙ŝŝ˙§ĠĴ ˙˙ùĠ!ŭì÷˙˙ñ˙ŝô˙À'ô˙˙˙˙˙ĝŭ˙˙˙ŭ!#÷ŭí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôš !ĝ˙˙˙˙ûû˙˙ŭïĝüü÷˙üĝÙÊ˙é˙˙ïĠ“Ş0ÊĜóú˙ù˜˙˙ú˙ïŭîÊ˙ï ˙˙úŝħĵ˙ô˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙ ) ĝ˙˙ûù"˙ġû˙Ħ´ô˙× ˙˙ûĝòÑ ˙˙ĝ˙˙ö˙Á˙˙ï÷ù˙ùúŭÌ ĞÌ˙˙òù˙ò÷£˙ñ˙˙$0Â˙ĝ˙ïú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‘)˙˙˙£Î˙ġŝŞ ˙ê˙˙˙˙šóú˙öö˙Öüŭ˙ Ñ˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙ö˙Ä!')û˙ëÑ˙Ž"ï˙ 0ž˙˙ù˙˙˘ ´˙ëŝŬ"˙ö˙˙˙ï˙Ù›˙˙úö˙ĝ šûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙˙˙˙˙ûѐû˙˙˙–% •˙˙ŝ˙À!îĉ˙ûóÉ( —˙˙˙üĝŜ îĝ˙ĝ˙˙Ž"˙ġù˙˙Ŝ ï˙˙óžûŝ˙ŝùŜÏŝ˙˙Ç  "ĠôÎ÷˙ö˙˙)•˙ġŝûşÊŝôüù&#—Ñ˙˙Ó !ÌŝŝíŬİ˙˙ğ –˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôù˙˙˜&#Â˙˙¤  û˙½ħ ž˙˙ú˙.Ĵ˙Ó˙ü˜1ñ˙Ġ˘ Ò˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ööôùĊ #$˙˙!  ˙˙Ú#'˙ô˙˙ !¨˙ùÁž ›˙˙˙ĝÚ#2 Ôç˙ú‘"‹˙ŝÓ,Ħ˙Ĉ,&—Êŝ˘ $" ¤ġ˙˙˙ŝ˙ü˙ö÷üû˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙öü˙˙˙˙ôï˙˙£ Í÷˙˙öô˙–˙ê˙ĝÄ'ô˙˙êŭĜ $ž˙˙ôû˙˙˙ġĦ ġŝ˙˙˙ùİ ˙˙’+ġ˙˙ ˙˙ŭ˙ò˙˙ù˙˙˙ œ˙ŭùú˙üñ˙ôûĴ%Óü˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙÷²!˙û˙ŝ˙ŝĝ˙˙ôòŻ ġ˙ü˙ŭúŞĞó˙˙üùÔ˙îÜ%”˙ú˙û£#£ñ˙ö˙—öş Ó˙ú˙“6˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ħ#§öŝùÙ"˜˙ĝÉ& ›˙˙ĝ–* ›˙˙Ĝ9šñ˙ï˙ü˜&˙ט˙˙˙ŝ)œ˙˙˙˙¨˙ġ˙Ş$˙µû* ˙˙ġ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŻœûúŞ)ÒÍ˙+’˙ĝ˙û˙ŝ%–˙ù˙˙Ïŝ˙Í,#Íûüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ú˙Ò  ˘Ñ˙ĝÉÎû˙ܛùİ +Ÿù˙˙Ñ#ĤÛġ˙ú !™ú˙˙˙÷)!Ħŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úü˙öÍ #$˙ùú˙˜Ôŭöû˙ŝÎ É˙Şó!ùĝ˙˙˙† ÷˙ùìÂ'  ùö˙ġŽ$ŭ˙ú˙Ĝ"!ûù˙ ›˙Ïó˙#'›˙˙˙ùï˙ôŝ ĦŜ˙Ì&È˙˙˙ŭ˙˙› #š˘— 9¨˙˙™ïŝ˙ŞöÍ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙˙ —Ħ" ñ˙.$żû˙# $Ċ˙ġ˙˙°( + ×ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙ŝ˙˙£§¤ĞИĜóŝŸ† ­¨ñ˙Âı’—’˙˙˙èŸü˙˙˙ °Œ˙÷üûû˙Ĉ²£ó˙˙˙˙˙ż²“ ˙ġŭëĦ˙Ş‘˙û˙!›Ü˙ô˙÷۝(”Ğ÷÷˙ò˙˙íĝ˙˙˙˙˙˙˙üŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙˙ûò÷ŭŭ˙˙ì˙Ë$É˙˙˙ú˙Ñġ˙ü˙Ì #Żñ˙˙˙˙ŝŭ˙÷ö˙óÔ¨C˙˙ó˙ûÉ$˙ŝ˙¤&ô˙úöŞ ÷ù˙˙˙ÈÉĝ˙˙&í˙ñ˙˙˙˙í˙ûŽ#!$É˙˙ŝï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĜ # ˙É˙óĝ˙ô˙˙ä˙ŝ§˙öù˙Ĵ–ï˙ĝ$¤˙˙#ż˙˙˙3ü)Íĝ¤$˙ŝϘú˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĠ%£úÓüÔ¤% ÷˙É/  ™˙ö˙Ĉ ¤ĤŽ˙ĝ˙˙˙ž—’˙Èó˙¤›˘š™ßġîĝ˙&&§ !˙˙ü˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ›$#£Ĉ ñ˙˙˜!/Ëĝŭ˙úŝ˙7ĴŠ”ú˙ò3 žôġĝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝóĜ$)–¨œÇ˙˙óê˙¸$Ô˙÷ó˙Í$ü˙˜"5 ¨˙Ċ˙žĈ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙êş×÷˙˙É% ÷˙˙ĝ˙ò  Û# Ġ˙úŭ!, ¨ú˙Ñ("*˙ô˙ !Ë˙ġòŭ  ./˙ìŝ˙ %!Ħîĝ˙˙ô˙ù˙Ï ¤Ë˙Òùü˙ù˙ŝ˙ù# # Ñà˙ü%6ĤŸ!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭïöŝ¨ +ĝ.˙˙ Ż˙˙ ˘ Ħ÷˙˙˙Ċ¤1 ¨  ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙óí˙íêÎùö˙û˙ŝ˙˙˙ü˙üüŭ˙üü˙˙˙˙ûġü˙˙ÖÎÌôûö÷ĝ˙ûÉ˙˙ü˙ĝô˙ó˙úÊÔÀĠü˙ĝööüÔ˙˙˙˙˙ù˙ŝŝû˙÷˙é˙˙ü˙ÄÍ˙˙ï˙ü˙ñ˙ë˙Ŝ˙ò˙˙˙ûŝ˙ù˙˙ġġ˙˙úú˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙˙˙˙ù˙üö˙˙ !Çüĝú˙˙ÂÍġ˙ŭŜ ˙û˙÷˙+Ç˙ġ˙˙û˙ŝž$˙÷˙˙Ñ ˙˙ı£ÔĜ˙÷£) %ÙÛÀÄù -à˙˙‹×ÇÔÔÏÎÖ½ü˙Ĵ "(Î˙ġ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙+  *Ì˙˙˙ò˙˙˙˙˙ŝ“ §÷˙ĝÏ$²äš)˙ù˙˙ĵÄ" &˙û˙ &£½˙˙ùù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü 6™Ÿ—Ĝó˙˙ü˙÷ûÉ˙÷ŭúĈ”ĴŒÚŝò˙˙ĠџÓž˜żš6­üŭú˙—şĈù˙˙úĝ˙èĴ!Ô÷˙˙˙ì˙ò˙™´•˙¨ŞÏúŭ˙ûù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙œ–œì˙˙¨œ˙˙˙Ï’˙˙ú˙î˙˙ŭ­(,—ŝú˙˙Ñ &*÷ĝúüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ú˙˙˙ħŸÔÎ˙÷ĝ˙ûûûÔ³" ˘Ñóŝ˙˙ġ˙°#ŞÇúû Ñ˜°’˙˙÷á‰ÑŞ˘Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝöû˙˙˙˙îͭ˨Ùö˙˙ö˙˙éÑà˙ġô˙è˙˙˘ !˙ċżĤñ˙˙˙˙ĊН­Çŭŭİ ½ĞΚÏŭúúáĠœĵ˙˙ġ˙ġü˘–"¤Á˙÷˙˙ œ§ È˙üóŭĝìûŭ˙˙˙˙ü˙üû˙˙ô˙ġ˙ó˙˙ÓĠË˙÷˜ç•Ïŭ˙ñöÏȚž´ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝô˙˙ĉ˙× ĊŒ˙˙˙³•Úŭ÷ÊĜÌħ£˙îí˙˙û˙˙ġ˙ĝ÷˙˙òÍ˙˙˙ġ˙ġ˙ÉÑù˙˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĝ˙˙˙˙˙˙û˙Ĝùġ˙˙ĵ˙ì˙ùù˙ûí˙ŝüû˙ô˙˙ûé˙˙ġ˙˙˙û˙˙ġ˙óïĵ˙ġ˙˙ġñ˙Ïúŝ˙ûö˙˙˙ŭ˙˙ĝûù˙ù˙˙ç˙˙ú˙ô˙˙÷ô˙ë˙˙úó˙ĝ˙ó˙˙˙˙ú˙í˙ô˙óîü˙ùŝ˙˙ŭö˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ù˙˙ô˙ñŭ˙ñİ Ö˙üŝ˙üÍŻ›ž£˙ûû˙"Şûû˙˙ëߜ"¨ġ˙ú˙˘# !•˙ŝüÏ$˙ú˙˙Ò ˜ Ŝ˙ŭ Ûö˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙  Ÿ›Òú˙ò˙ŭüŝùŭ˙˙ú˘›µ£˙ĝŝú˙ù˙˙˙ĝ÷˙˙˙˙ò˙ú˙ñ˙ŝ˙âîÚĤŞÖö˙˙ŝú˙Ħ#Éŝ×˙˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙óŭ˙ĝ˙˙÷˙÷˙ü˙˙û˙˙˙ö˙˙ġ˙í˙ŭ÷ûŭ˙˙ŝ˙˙ĝ˙öù÷ĝ˙ŝŝû˙˙ô˙˙Âßû˙ú˙˙˙˙û˙ġŝ˙ó˙˙üü˙ü˙ö˙˙ü˙˙ô˙ŭ˙û˙ûŭüú˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ûú˙ġ˙ĝŭüĝŝ˙˙ġ˙˙˙ŝùÖŭí˙ú˙˙ôù×˙¤–×ö˙úò˙ûüÔĦ%˘˙˙˙˙˙ŝüû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ġ÷˙ŭ˙ŭü˙ŝ˙˙˙ò˙ŝ˙˙ñ˙˙üŭô˙˙üüû˙˙˙öùŝü˙˙ŭ˙ú÷˙˙ò˙ñü˙˙˙ŝ˙ïŝû˙˙˙÷˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ù˙˙˙÷˙û˙˙ûü˙ú˙˙˙û˙˙˙ñ˙ùŭ˙˙ö˙ŝ˙˙ò˙˙ùŭüŝ˙˙˙ĝ˙˙˙ù˙˙˙ü˙˙˙ĝ˙˙ĝ˙ŝ˙˙˙÷ŝġ˙ŭ˙˙û˙ú˙˙˙ü˙ûô˙˙Èü˙ì˙òŝ˙ù˙˙˙˙ŝ˙üò˙ŝŝ˙˙ô˙˙˙˙ŭó˙˙ê˙ïù˙˙˙ġ˙ü˙ó˙˙ŭù˙ġ˙ĝ˙ñ˙ĝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭö˙ŝ˙ö˙˙˙ŭú˙÷˙ĝ˙˙ö˙˙÷˙úŝĝ˙˙úö˙ö˙ŭú˙˙û˙˙˙ü˙ü˙ġŝ˙ŭû˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ù˙ü˙÷˙ŝŭ˙˙ñ˙˙ġ˙ŝ˙˙ó˙˙ù˙˙˙˙÷˙ġ˙˙ŭ˙ġ˙˙ù˙ġú˙ö˙˙˙ŭó˙ü˙˙ŭŝ˙˙ù˙ûŝŭ˙ù˙ö˙˙˙û˙˙˙˙û˙ó˙˙˙÷˙ŭĝ˙ñŝ˙˙˙÷ŝ˙˙ûüŭ˙˙ü˙˙˙ûŝ˙ŭö˙ûüŝŭ˙˙û÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ûü š˙ûó˙˙Ï&  ˙˙˙$ ĦŝËô˙Ĵ!¨ġ˙ü˙§ 6ŠÔ!˙ŝĝû˙ö"+Ì˙ô˙ŭ˙× #$Ş˙û˙ÜżÙ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÏĜĈŬôĜ˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙ú˙˙ĝÙÊŬú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭŭŭŝ˙˙ŝ˙˙ÈĤ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝö# "5²˙˙úŭ˙™  *›˙Êù˙÷ú˙Ԅ·”#Ò˙˙û˙ŞĦ§œžï˙˙ŝó÷İĴŞĉ˙ŝ˙Á´˙ŭ˙˙˙˙ôŬŻ&Ÿ­˙˙ô˙ùŝĝċ‘)£ Œ˙ó˙˙ù˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŭ˙ġ˙˙÷ñïôü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙ŝŭüĝöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ìÙÜÑ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ì˙ù™­•úŬÓöñ˙üü˙éŻ+˙ŝŝŭ˙˙˙öû˙˙˙˙ŝġ˙ŝè˙˙û˙˙÷ŭûŭŝ˙˙û˙˙˙ë˙ù˙˙ġ˙òñ˙èġ÷ûĝ˙˙˙˙˙ç˙˙ŭ˙˙öŝŝ˙ĝö˙ôŭ˙˙ŝ˙˙ùġ˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙˙˙˙üúùû˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙ŝŭûúÛ¤&Öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ñ˙˙ï˙˙˙˙ü˙ŝ˙˙˙˙˙˙ô˙û˙˙ü˙÷ò˙˙÷˙ĝġóú˙û˙˙˙ċ˙ĝŝ˙˙ú˙˙˙óù˙˙ġÛ˙ŭôö˙ñ˙˙è˙˙˙˙˙ŭî˙˙ü˙˙ù˙ùü˙ŝ˙˙˙˙ŝù˙˙úŝĝú˙˙˙ŝŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝüŭ˙˙˙˙˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙ŝûúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŭû÷óñ$$ —˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝôü˙ŭ˙ŝ˙˙˙ñ˙˙ùŭ˙˙ûñ˙ĝŭŝöú˙ùù˙ŭ˙˙˙˙˙ġ˙˙ß˙ù˙˙˙ó˙ù˙ŝúŝ˙ôû˙˙üŝò˙˙˙˙˙˙˙ó˙ú˙ġûü˙˙ö˙÷ì˙ġ˙û˙˙ŭŭú˙ĝò˙ŝü˙˙ŭ˙˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ˙üŭŝŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙û˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúĝĤ¤˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙êġ˙ġç˙˙˙˙ĝ˙ŝ˙˙˙ŭŝ˙˙˙ĝ˙˙˙˙˙ü˙˙áŭ˙÷ŭ˙û˙˙÷˙˙ü˙ñŝ˙˙˙÷˙˙ú˙˙˙˙˙˙úö˙ĝó˙ù˙ŭ˙ö˙ù˙˙ĝ˙˙ŝ˙˙˙˙üŝ˙˙˙üúú˙˙˙˙÷öûúü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ûû˙˙ùúúüŭûü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙ŭû˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙üĠÑúí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙ú˙ŭ˙˙˙÷ġ˙˙ġùù˙˙˙öĝŝĝŭ˙˙ó÷ö˙˙˙ö˙ŭï˙òö˙˙˙˙ĝù˙ù˙ú˙ĝ˙üû˙ĝú˙˙˙˙˙ö˙˙ó˙˙üù˙éŭ˙è˙˙òŝúüùú˙˙˙ò˙˙ŭ˙˙öû˙ŭŝ˙˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙ûŝ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŭŭŝ˙˙˙˙û˙˙˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ġ˙ŝ˙˙ê˙˙ŝŭó˙˙˙ŭŝ÷˙ŭ˙˙òŝ˙ò˙˙û˙ĝ˙ŝ˙˙ù˙˙÷˙˙˙ŝ˙˙˙˙ü˙ú˙ĝ˙ŝ˙˙ĝû˙˙úû˙û˙ġ˙˙ûĝ˙ŭ˙˙˙÷˙˙ú˙˙ŭ˙úù˙û˙ô˙ŭô˙ŝ˙˙˙˙÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝŝ÷û˙˙ü˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙úô˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüüü˙ŭúŝŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ûö˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŭ˙˙˙˙ŝ˙˙ûŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙˙ùùŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙ŝ˙˙˙˙ŝŭüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñóüü˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŭŝöùŭ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉî˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üŝ˙˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝéÜñŭ˙˙ĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˘Ħ›´ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙÷Ùħ”Şĝ˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝú˙û˙˙ŭ˙˙˙ĝ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òû˙ò˙˙ú˙÷ü˙ù˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙÷˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙í˙˙ŝ˙ú˙öú˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ù˙ó˙˙˙úñ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙úô˙ö˙˙òŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭü˙ü˙˙›˙ŭö˙˙˙˙˙˙˙˙˙˙÷˙˙ŝĝ˙˙˙˙˙˙˙˙˙˙ô˙ô˙ö˙î˙ŭ˙ö˙˙û˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙ŭù˙úï˙û˙˙÷˙˙ù˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭú˙˙üŭ˙˙û˙ù˙ü™#Ï˙üĝúĝŝ˙ŭ˙ñ˙˙ü˙£˙ŭ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙ŭŭŝŝŭüû˙˙˙˙˙û˙˙ŭ˙˙úü˙ù˙˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙úô˙˙ûŝ˙˙÷¨,ħġġ˙ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ó˙˙˙ŝù˙Ŝ˙ôô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ŝê˙˙ú˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëö˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŭü˙ô˙éŜ˜•ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭê˙˙ŭ˙˙Ÿšá˙í˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùï˙ùó˙˙˙Ï˙˙˙˙üó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üö˙˙˙Òö‘-Ìñ˙ö˙˙˙˙˙˙˙˙ĝ˙ġûŝ˙ŝ˙˙˙˙˙˙˙˙˙˙ĝ˙ŝ˙Ä˙ùü˙ŝŝ˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙Ôúüġ˙ï÷˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙û˙˙ŭŝ˙˙˙˙û× ˙˙˙˙˙ôŝ˙˙ò˙íÊ "˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ö˙˙üŝ˙˙˙ùŭúŭ˙˙ö÷ûùŝ˙˙˙˙˙ŝ÷ú˙˙ŝú˙˙˙˙˙˙˙˙˙ú˙˙˙˙ûĝ˙˙Û#˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ĝ˙ìê˙˙ê˙ĝ˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È´ Ġ˙ñò˙ġ§£Ħœ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$°˘áá˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙è˙˙Ï*˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùö˙Ԅ' #˙˙ŝë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙é˙˙{Ħšú˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙îÍÎ˙˙˙˙˙˙˙˙˙˙˙›–˙÷˙˙˙˙˙˙˙˙˙˙˙ёĤ˙÷ŭ˙÷֚İ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙Ċ’Ġö˙˙ù˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙ŭ˙˙ŭŭ˙˙˙˙ïù'!(áĝ˙ŝ÷˙ì˙ŭ˙î˙˙û.˙ûġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝú˙˙ŭùùĝġ˙˙ŝġ˙˙˙˙ŝ˙˙üùüúô˙ŭùŝ˙˙˙˙˙˙˙˙˙˙˙˙ĝúûŭ˙ŭûûü˙˙%˙˙ŭüúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĝ˙ú˙˙ÎĈ˙ġë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ħ %˙˙˙Ì%%ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙ġ˙$ / ÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ™' %ĝĠĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷Ù," °˙úġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙üŝôßÂ˙úü˙˙˙˙˙˙˙˙Ħ(˙ó˙˙˙˙˙˙˙˙˙"Ħ˙üŭġ³´û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙ž$ *ñöö˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙üûüŭüŝ˙˙›ĝ˙˙ŝŭ˙˙˙ŝ˙˙ùû˙żÂ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙úŭ˙˙ŭŝ˙íû˙ü˙÷ùûû˙˙ŭ˙˙˙˙˙˙˙÷÷˙˙ŝ˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙˙ûü˙çœÖùŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙ŝ˜ž"˙˙˙îï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˘&)ÄÊ˙ñ"ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùİÓï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙—ݤ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙û˙˙ ˙˙˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙úĊ –˙É˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ùô˙ĝŸž' ˙˙÷˙˙˙˙˙˙˙˙˙/ ˙˙ó˙˙˙˙˙˙˙˙˜!!·à˙Ŝĝ!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙ŭġ¨˙˙ñ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙ŝ˙ŝŭŝ˙ŝ˙ġ˙Ì#ĝ˙˙˙˙˙ô˙˙˙üûò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙üûŭŝŝŝ˙˙˙˙ô˙ŭ˙ŭü˙˙ĝüùġŭġü˙˙˙ŝŭü˙˙˙˙˙˙˙˙˙˙˙˙ĝì˙ŭ˙îñ˙Ôü÷˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù+ú˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü”ŝ˙ĉ˙ï"£˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óÍ Ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùë˙êÖÎÙÇİ ˜ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙úúğÜŭùô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ë˙˙' $Ô˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ˙ÙÌÉ /£˙ê˙ĝ˙˙˙˙˙˙˙˙˙$Ĉûü˙˙˙˙˙˙˙˙˙ÏÖ œ˙˙ô˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙üü˙˙’×ôŝ˙òú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝŝŭŝ˙˙˙˙˙˙÷˙˙ĝ˙ô˙ûúü˙ûû˙ġ˙ŝò˙˙ŝú÷>ñü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙ĝ˙˙ù÷˙˙÷˙÷óÚŝû˙û˙˙˙û˙òçù˙úû˙˙ûŝ˙˙˙˙˙˙˙˙˙÷ùĝ˙÷ç˙ĝ˙˙ŝċÊ$—˙Ĝïĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙ŝ˙+˙˙ñü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ úġ˙ó˙'!È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò!ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ üŬöúö˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝí˙˙˙Ì ü˙ôûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ù˙˙üÀ+&Éò˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙âĤ˙ŝü˙˙˙˙˙˙˙˙˙÷˙ĦÈ˙˙˙˙˙˙˙˙˙˙˙˙˙ê)! ›×ŭ˙ġù˙˙öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙öÎ% #–úû÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙üŝ˙˙üùû˙˙ú˙˙˙˙˙˙ŭ˙˙˙³´ù˙˙˙ñûû˙#‹˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòġü˙˙˙ùü˙ŭ˙˙ï˙ĝ˙˙÷˙ŝ˙˙ùê˙ŝ˙ŝŭ˙˙üó˙˙˙˙˙˙˙˙˙˙ù˙ġċ˙˙ŝŭ˙˙˙³ïÓü˙÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ú˙ĝü§*ĝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙–Ÿ˙˙ù˙ĝ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭÑ$˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúüö­#—˙ġ˙˙û˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ġ÷óŞ"ô˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙˙üÒ÷˙˙÷˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙˙ü˙ġœ$˙ŝ˙û˙˙˙˙˙˙˙˙˙î˙˙÷û˙û˙˙˙˙˙˙˙˙ŭ˙žĤ˙ûùŝ˙˙úö˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙ŭŝùĠ˙– §˙˙ŝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙ŝŝ˙ŝôîï˙˙ġ˙˙˙ĝŝŭ˙ġŭû˙˙Óġ˙˙˙˙ùĦŝ×ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙ôú˙ëÊ˙˙ġİ˘™×ûŝ˙ùŭüÍŻÉÓû˙ĝ˙˙í­˙˙˙˙˙˙˙˙û˙˙˙ʰòŭŭ˙ó˙ŝ!Ĥ‘¨İŒá˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ÷˙ĝù˙˙ù˙÷ü˙ŝü˙˙ŭ˙ì˙û˙ü˙ô˙˙˙˙ŝŝ˙ñ˙˙ĝ˙ŭġ˙˙úú˙˙ŭ˙ó˙ûù˙˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙÷ŝ˙˙ù˙ü˙˙ó˙˙˙˙˙˙˙˙ŝü˙ïü˙÷˙ü˙˙˙û˙ĝüù˙ô˙û˙üŭ˙ú˙˙˙ĝ˙˙˙ĝ˙ġú˙ù˙˙˙ü˙ĝú˙ ˙ú˙˙ú˙˙˙˙˙˙˙˙˙üü˙˙˙˙˙˙˙úüŝû˙˙˙óġ˙˙˙ó˙˙öŝ˙ô˙˙üù˙˙ûü˙˙üŝ˙˙ŭï˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷öĝ˙ŭĠ˙ŝĝú˙ù˙˙ŭ˙ŭü˙í˙ü˙ġ˙ôñ˙ó˙ò˙˙ñŝ˙˙ú˙˙˙ŝ˙˙ó˙ê˙ŭô˙˙ŝú˙˙ŭ˙˙˙˙ô İ˙üŝû˙ÌÎ˙˙úŝ˙ù˙ù˙Á˙˙ĝ˙˙˙˙ġ˙ĝú˙ûĝüÑ"ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙™˙˙û˙˙î˙ÑÖ˙ġ˙ú˙ŝ˙˙ŝ˙ü˙˙ŝú˙Ç˙û˙î˙ö˙ġ˙˙úî˙ŝ˙Ä˙ò˙˙˙ù˙÷ŝ÷˙ŝ÷˙üüüŭŝ˙˙˙˙˙˙˙˙˙˙˙û˙ĝü˙,É˙ö˙ñ˙÷˙'˙ĝ˙˙ù˙ġ˙˙ù˙˙ü˙ĝù˙˙˙˙˙˙˙˙í˙˙˙ô˙ù˙è˙˙üù˙ĝ˙ù˙˙ûú˙ŭ˙˙û˙ĝ˙˙˙ù˙˙˙Ċ&£ñ˙˙ŝü˙˙˙üŭù˙˙óú˙ú˙˙ġĝ˙ú˙˙˙öÓ˙˙ ˘ġ˙˙˙ŭ˙ĝ˙ú˙ü˙˙üô˙ġ˙˙û˙ëŭ˙ü˙˙˙ŭŝ˙ŝö˙˙ġ˙˙˙ö˙ŝŭ˙˙÷˙˙ùŭ˙˙˙˙˙˙˙˙˙˙ûŝü˙˙˙˙˙ŭŝ˙úûü˙ú˙÷˙˘Żüù˙ñ˙öô˙ŝô˙˙ġ˙ŭ˙ú˙ġü˙ü˙÷˙ŭ˙ŭ÷˙ĝ˙û˙˙ŭ˙˙ñ˙˙˙˙˙ü˙ù˙ú˙˙÷˙ĝû˙óü˙˙ŭŭ˙˙˙˙˙˙˙˙ü˙˙ù˙ú˙˙˙ŭÍ˙ÍË˙ŭù˙÷ü˙˙ñŝû˙˙˙ô˙˙üü˙û•$£˙Ê˙˙˙ŭŝÊ×˙ü˙˙û˙˙˙˙˙˙˙˙˙˙÷ ›Óے*%Ĥɧ! ˙í˙˙í "˙ô$–ò˙öü˙÷Ξ"žÑü˙÷­"÷˙üù˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úï˙˙˙˙˙úŭúù˙˙˙ü÷˙úúú˙ü˙üú˙˙˙˙˙ŝĝ÷û˙˙ŝù˙ġ˙üü˙˙ù˙ŝûġ˙˙˙÷˙˙ù˙˙˙˙˙î˙˙˙˙˙˙˙˙˙ŝ˙ò˙˙˙˙ú˙ŝ˙˙ĝú˙˙˙˙˙˙˙˙˙˙í÷˙˙ù˙íüö˙ò˙˙ŭ˙˙ú˙ù˙ŝĝüô˙û˙˙˙ó˙ôû˙ŝô˙˙÷îû˙˙ġ˙Ż˙ŝûô˙˙˙˙˙˙˙˙˙˙˙˙˙ûöġóŝöĝ˙˙ü÷ŝĝ˙üĝïĝ˙ŭ˙É˙ŭ˙ùî˙˙ŭŭú˙ŭ˙î˙ëġé˙üĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“˘ " ħÄ˙úüĝ°žÑ˙Úû˙ù˙˙˙Ë˙˙˙ùü˙˙á ²Ì˙½ŭù˙ġ˙ĝ˙˙˙ġ˙˙Êŝ˙ô˙˙÷ú˙ŭ ŭŝ˙ü˙—&Í˙ö˙ŭ˙ġÎĴ˙ç˙˙úŭ˙˙˙˙ŝ˙˙˙ŝ˜˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġûùú#%ĝ˙êâü˙û˙˙ò˙˙˙óġú˙˙ì˙˙˙úúŝ˙ġ˙ò˙˙˙˙î˙á˙úŝŭè˙ĝï˙˙˙˙ïŜù˙˙˙˙˙˙ŝŭŭüü˙˙˙˙˙˙˙˙˙˙ġ˙˙ĝÛí˙˙˙Ç ˙˙˙ùû˙ï˙˙˙˙˙í˙ò˙˙ü˙˙ùï˙ŭ˙˙ó˙ú˙ĝ˙ŭ˙üñ˙˙ûûü˙˙ì˙˙˙ĝ˙˙ù˙˙˙˙˙ü˙ĝġ¸˘˙Ĝġ˙ŭŝ˙ŭú˙˙ùŝ˙˙îŝ˙˙˙ü÷ñüú˙öĝú ¤˙˙û÷˙˙úÍ˙ġ˙÷ú˙˙˙ĝ˙˙ġ˙˙è˙˙ġ˙í˙˙ö˙ü÷˙˙˙˙Ê˙ë˙˙ëô˙ü˙˙˙˙˙˙˙˙ŭù˙˙Ğ×Äŝ˙î˙Ŝ÷˙ŭ˙ĝö˙$Ĉ˙ö˙ùô˙˙ŝ˙ñ˙ĝ˙÷˙˙íê˙ŝòŭö­ £$ÁÌ˙÷˙ì˙üï˙é‡"ޤÔġ˙ŭ˙ġ˙ú˙Ä#Ğú˙ü˙ê˙˙˙˙˙˙˙˙˙˙ü˙˜Ÿ  ˙Ì# ¤Ÿŝ˘Ÿž!­˙–¸Ÿ˙ŝï%  #’˙ó˙˙%",%Ħ˙ü˙˙˙˙˙˙˙˙˙˙ċ˙Ġ#'  % #§íŝ˙Ĥ&Ú˙˙˙ĉ˙˙ù³& ˙ñ˙È # #°Ä˙úéù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ö˙ï˙ó˙ŭ˙ú˙ôòŝû˙óŭŭ˙ùġü˙˙ûÑ˙ù˙˙˙ûöü˙öüú˙˙÷íŭ˙ö˙ú˙˙ûĝ˙ñ˙ô˙˙çë˙ŝ˙˙˙˙˙˙˙˙ŭ˙˙ñŭôüö˙˙ŭĝ˙˙ó˙˙˙˙˙˙˙˙˙˙˙ö˙òŝ˙˙ü˙˙˙˙ì˙˙÷÷˙˙óÌ˙˙˙˙ü˙˙˙î˙˙ú˙˙ôġŭü˙˙ġú˙˙ó%‰ŭ˙˙ú˙˙˙˙˙˙˙˙˙ûû˙˙˙˙˙˙˙üĜ››Ù˙˙˙îĝ˙÷˙üüÔŭîù˙˙˙ĝú˙ú˙íÒŻ™˙˙˙ġü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙í$%(˙ú˙¤(" !ġúÙ!Öíî˙ .$ĞĝĈ˙˙î˙ñĝ˙˙#˙ûÀ˙˙÷˙˙"˙˙û˙ŭĴĝ÷˙ì˙Ê˘¨ ŸĴħ˙˙ìü˙éÄ£”š•‘)Óî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝݏ#˜­¨˙˙§žŞÊ§€§´˙û˙÷àžĦœ¨ĤĴċ˙˙ò˙ŭ͚¤ÎÍ˙¤İµ•Ï˙ġİ) Üó˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙ôú˙š°˙üŭ˙*˘ #àûġŭöö˙û˙ü˙ö˙˙˙˙ó˙ìù˙ŭ˙úĈ˙˙ùû˙˙Ç!˙ž³ı˙úö˙˙ôŭ˙˙ŝ˙ü˙È- í˙˙÷ŭ˙”˘§˙ġíŝû˙˙˙ÄŞ¤ĦĞ£ ĝö˙üïĞŸÛ˙ú˙˙ԟ#ò˙¤›Ä˙˙ŭöô˙˙›Ĵ"£ž“Ÿ›ħ´˙˙˙ü˙˙˙˙˙˙˙˙˙û˙%" ˘˙ĝ˙û˙úĴ.Ú˙ùò˙üϔ¤ ˙ù˙ġ˙ú˙˙˙% "—ü÷˙ŝŭë– ) %Ħ˙ŝŭ˙˙½5 Ö˙ñ˙û˙˙˙˙˙˙˙˙÷Ġ&$(œüİ$#Í(" Ċ“ !ŭû˙Ê +ŝ˙ŭöÙ˙Í –˙òúŭ˙˙˙˙˙˙˙˙˙˙™"$ Öŭ"˙˜%˙ñĝĜßèê˙˘"ü˙˙Ö£ š˙—!"!˙˙œ 0“ù ,µ˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üò˙ŝ˙úŭû˙ô˙ġ˙˙˙˙üî˙˙˙˙˙˙˙ŝ÷˙˙˙é˙˙˙ô˙˙˙ú˙˙êù˙˙˙˙˙ä˙î˙˙˙é˙ŭ˙÷ŝ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙öû˙ŭŝ˙˙˙˙˙˙˙˙óé˙˙ö˙˙ġ˙Ŝü˙ö˙ü˙ù˙ûô˙˙˙öŬÒ˽ËÎÔÂ˙ú÷˙˙˙ôï˙˙ż˙ÓÔâù˙üŝ˙˙˙˙˙˙˙˙˙˙ŝ÷òŝóÌÇˤœÚÑġ˙ô˙ÀÓÒ˙ŭÑÖĠ˙˙˙êÑ% ÍÇü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˜ —!  ˙˙İ%œ˙Ë˙˙-%!$ İÖŭù˙ôà  Ĝ$°˙ġú˙Ê›˙÷ù˙ŭ’˙üŭ˙Ġİ£òà ›ĝ˙ŝü˙/ !#  ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùÊ" * # ›˙î¨% -˜ŝ˙ù#&'§˙˙˙˙ ʟËÑ"'& Ùĝúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Î!Èü˙ŝ& ' $! É˙˙í˙ôúËĜò˙˙Ĥ  ù˙˙˙ž" ˙˙˙˙ * !Şñíôúŝ˙˙˙˙ú˙˙˙Ġ­"$*˙ĝ˙˙Ç'Ç˙˙ŭ˙í˙È ´ŭ˙˙É"" ˙˙˙##  .úô˙ú˙˙˜#*%& ĝ˙ú˙ñ˙˙˙˙˙˙˙˙˙Ò-&43Ş˙úĝúÏ ïŝ˙ú˙( % Óŝ˙˙˙˙ê!ùñŬ) Îœ$!˜×˙˙ü& /& ë˙˙˙˙˙˙˙˙˙˙˙˙óÑÖŝô›!#“&Ĉŝ˙° Í˙˙˙"$ $ĵĜÑ˙ûó˙' !Í˙ġú­#"ì˙˙˙˙˙˙˙˙˙˙˙÷˙˙$Şúġ˙˙%˙û˙Ì' ú˙˙È #˙˙ĝ˙ ŝù˙ó­˙˙Ò£ġ˙  ŞäÛ˙Ü*§÷ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îö˙ò˙ü˙öù˙˙ŝüŝö˙˙íĝ˙óùĜÀĴ˜Ë˙˙í˙˙˙üô˙öò˙ü˙ò˙˙˙˙úŝ˙ġ˙˙ĝ˙™œÌÌ˙˙˙˙˙˙˙˙˙˙˙˙ò˙ìŭù˙ĝô˙˙ĝ˙˙û˙˙˙˙˙˙˙˙˙˙ġŝ˙òñ˙*‹ŝ˙ġ˙˙˙˙˙%)&—˙ŭĝüë˙˙Ç& $ê˙˙üŝ˙˙˙˙˙˙˙˙ŝü˙˙˙˙ò˘%­öö˙Ò  "§!öúù'/ÁĦ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô½,˙˙ġĞ$)ûùĊ˙ĤĜ !˘üùûÓÖĦ/Ñ˙˙óÑ $˙ö§!˙û˙˙Ĥ šùÛ˙˙˙%ġ˙ŝ˙Š ¨Î³žŬë˙í )›’ 5˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙""—Ğ˙˙˙Ü "Ĵï˙ÄËÌÒż˙öú-#§!# ¤÷ŝ  Ħñó÷ûŭŝŭŭ˙˙˙˙˙˙˙˙ŭéù+Ĉ˙ĝÑ ²óôÌ")˙˙˙˙÷û,Ó˙˙ûï´-Íö˙Ĝ' ˙Éïï! 1 -(­÷ġû˙˙˙˙˙˙÷˙ŭüÀ%!˙˙ñû›#–ç˙ŭ Ë˙˙ùü×Ĥ ĴĤŸ(—Êùŭ$İŭÑ÷¤Ñ÷Ë˙ù˙ŝ˙˜' ˙ġ ! Ĝ˙ùġ˙˙˙˙˙˙˙˙˙˙È*ÂĴ  ç˙˙ŭ˙˘­ó˙˙˙#ĝ˙Ë&Ħ˙ìŝ˙ü"%Ŭ˙˙ö žü˙™3˙ú˙˙  Ċù˙# "+˙î˙ò˙˙˙˙˙˙˙˙ŭ˙˙#!!Ğŭ˙˙˙–#"Ë˙ŝ˙û'×û˙ô”ŭŭŝô˙˙˙Úùŭ˙Ê ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙ûŽ˙˙˙ĝ!ħñú˙Ó §˙ò˙˙§ŭüú˙")œÙú˙œĈú˙òÊ´Ż˙ö¤*Ħ˙ŭ˙ò% Ĥŝ˙üó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ááíŭ˙ï˙ĝ˙˙˙˙÷ê˙ĝñ˙˙À˘) À¸Ŝĝùöĝ´Ê­˙í˙ûœï˙û÷˙˙½ 1 +œĊ˙˙˙˙˙˙˙˙˙˙żŞÉ´àí˙˙˙ù˙ŝú˙ü˙˙˙˙˙˙˙˙ôüú˙Ó "žŝ÷˙ìí·&"  +˘ŝü˙˙Î 3# ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ñ ! * "úùŝĝ   Ĥ˙ŭ˙! ˙íˤ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üΰö˙˙ŭ˙¤$"š&™ïàÖóŝ˙ôÖ ! *ĝ˙ÌÁ˙Î&’ *Ê˙úò%¨˙÷ŭù˙ ÷˙ġĠ%' %É˙ü ˘˙˙˙Ì6­ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙•! ´Óŭïŭ˙ùÂ$# ü˙Í!°ı˙÷üÏ*ù˙óÍ!ñ˙)Ä˙˙Ĥ& úûŭŝ˙˙ŝŭ˙˙˙˙˙˙˙˙ò˙ü£ÏÊÏ˙˙˙ġß,ò˙˙˙š*êù˙ñ˙Şï˙üö˙šÊ˙˙ëË .˙˙ü˙ž"ş˙˙˙˙˙ò˙ü˙ü˙˙÷µ³˙ñŬŝ0¨˙è˙˙Ä4Ëòò˙ü* #é˙ŭ˙& Ĥ˙ĝ÷˙Ì "#˙ù˙ûŸ &™˙˙ûŸ ì˙÷ġ ÷˙˙˙& §¤—˙ùù˙ú˙˙˙˙˙˙˙˙ô˙¤ $ '˙÷ĝÑ!­Ìó˙ġ#˙ú˙ò!˙öġ˙š¨ŭĝ˙ġġ& ŸÙëŭ˙Ëŭ˙ ' Ï™ŞÄ&!áñ˙#$.˙ĝ÷˙˙˙˙˙˙˙˙˙ô˙˙ñ$˙ó$!˙!˘˙˙˙Êú˜ ù˙è˙Û# ˙˙ġ˙üùú"°ì˙˙ùÀ2 ğĈġ˙˙˙˙˙˙˙˙˙ñù˙Ñ - Ü˙ò˙ŭš˙˙˙˙˙İ%ê˙ïó˙ĝ˙ġúÈ˙˙ì§( Ĵ˙úŭ˙˙ëî˙ù˙ ú˙ñ˙˙Ċ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙$* ´Ê™¤˙ö˙ŭ˙ö!&  "°ö˙÷˙˙ £˙”%˙ù˙úÉ (  Ĵû˙˙˙˙˙˙˙˙Â,#˙÷÷˙ú˙û˙˙˙˙˙˙˙˙˙˙î˙ "³ú˙˙˙ %"ö˙˙ ×˙ì˙$!ß˙ô—"˙ĝĝ˙ù˙˙˙˙˙˙˙˙úĝ˙˙ŭŝĤ&´î(Ç˙ùüÖ&' ŞÎ˙ó˙˙ġ"İ šŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ # #" Ù˙ñ˙úô˙¤&  ä˙úġ˙˙˙÷˙Ĥ˙˙í˙Ĵ %§óž%" )!Ê˙ù˙‘ó˙ŝĝ˙0 ˙Ê˙ +"ݤÜñŻöó˙˙À%˘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Á!3˙Ġ˙˙ó˙ĜÓ˙˙˙ùĝÍ % Ò˙ŝ˙ŝŝŬ ï˙˙’"•˙˙Üú§'¤˙˙˙Ž'¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭî˙È*Ë˙˙ê˙ûŝžĠ˙˙íó# ˙˙úĝĤ"œüĉ äÉ˙ú˙˙ í˙˙àÛ˙òĤ˙˙ôü˙ġü˙ûû˙ŝ˙˙˙Ä"–ú˙î˙¤¨˙˙ôèÏ˙üĈ  û˙ûúÓ ħ˙˙ŭê˙˙˙ûÑ Ûí˙˙$"Ğüü˙Î ü˙í˙– ەÖ˙˙ûüĝ˙˙˙˙˙˙˙˙˙ŝ˙ž. œĝŝ˙˙í"Ô˙ĝ˙  ¤í˙û˙ĠŸĠò˙ŝ÷ÜŸŝ˙ŭ÷à!ú˙ĝì˙íĤŭ˙ò"$ ÷˙ú+ş£˙ü˙˙ô˙˙˙˙˙˙˙˙˙˙˙ŭ×˙ò£ ó#"öúŝï˙ü!ħ˙ôúŝ˙ Ôûò˙˙î˙˙%œ˙˙˙ñ˙›Œ˙˙î˙˙˙˙˙˙˙˙˙ùĝŭ$˙˙ú˙ +ê˙üï˙–Ò˙ġ˙ó£ /·˙˙˙û"Ğ˙û˙­ò˙úî˙˙˙ö˙˙“ ˙ŭ˙˙ü "$ùóù÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷£'" +#˙ê˙˙Şħ˘ % Ô˙ó˙ ˙˙Î!"Œ˙˙ŝ & " Î˙˙˙˙˙˙˙˙Ôñ˙ŭ˙ò˙ú˙˙˙˙˙˙˙˙ô˙˙ !!ÖÒ•˙úüŭŭû˙ĝï˙ŭŝ˙ ˘Ä˙˙˙Ïüü˙û˙˙˙˙˙˙˙˙˙˙ŭ˙üĝ˙ŻÂ˙ÉÔûŝ˙˙Ê$˙ñ˙üŝË!˘ŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›$Ôûŝ˙ĝ˙˙ŝö˙ŝú˙òÓ!$ĝú˙˙ĝ˙ù˙ÄÊ˙˙˙Ëŭ" ˙ ˙˙û˙ġ§˙ù˙ġ˙  ŭÖҟ' §¨Îû˙ö˙œ% §ó˙÷˙È ! ŭÑ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝŜ¤˙÷˙˙˙òÜôŭúú˙ŭÓ ˙û˙ŭ˙ŝ˙!™˙˙ĝ Ö˙üĝ˙Ċ(•˙˙ó˙"˙˙˙ŝŭŭŭŝŝ˙˙˙˙˙˙˙˙˙ŭÄ˙Ï˙û˙˙ô˙˙˘×ĝ÷˙˙– ˜˙ŭ˙˙ĝݙУŸ˙ú˙˙ûú˙ġ˙˙˙Ħ˙˙ġŝ˙üŝŝú˙ŭ˙˙˙ĝŭü˙ŭ˙ŭ˙ú˙ó˙˙ò­Òú˙Ñ ˙ŭ˙˙˙Ħĝ˙ù˙˙ $Óŝŭñ˙˙ ˙˙ù˙ú£ú˙˙˙Ĉ˙û˙üÈž÷˙Í˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê˙§˙˙˙ñû˙£ Ĉú˙ŝš ˙û˙˙ĝ˙ûŝĝ˙˙˜İ˙öŝ˙¤˙ŭ÷˙˙ö˙üŭüùÓ!˙ù˙ó˙ŝ˙˙˙˙ûÒ˘%™˙˙û˙˙ŝ˙˙˙˙˙˙˙˙ûú˙îÙ " Áü!$& Î˙ú˙˙öל$ ˙ó˙˙Ì˙˙ô˙ĝŭ˙ ò˙ĝú˙Ο!úÈ˙˙˙˙˙˙˙˙˙÷û˙Ç˙ö˙ö˙š˙˙ö˙˙$š˙ùúûÙûúóĤÇ˙ûĠù˙ù˙÷ûŭŝ˙ŝ˘˙÷˙ñ˙%!Ñ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙êß Ϙ#Şí˙˙  &ŭ˙û˙˙˙ö(˘˙è˙˙Ħ˙Ñ(¨˙š š˙ûùŭ˙ŭŝ˙ŭ§ ÙÚ˙˙ĝ˙˙÷˙˙˙˙˙˙˙˙˙˙ĝ˙Ìŭ˙ü­ŝŝ˙˙ûĝ"úäĝû˙¸ż˙ûĝ)Ċ˙ŝ÷˙˙˙üö˙˙˙˙˙˙˙˙˙˙˙ù˙˙ú˙ Ĵ˙ŝúÎ ˙˙ù˙òÓö˙˙˙˙˙¤ & $Ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó­ #Êó˙ġ˙˙í˙ŭ˙˙ŭ˙ŝù˙Í!ùŭ˙ö˙ŝ˙÷Ë˙˙ù˙˙”#˙ĦĠÒÈÜÇÛò˙˙˙úù İ˙ü˙ġ˙$Ĉ˙ù§%“ËùÉ˙ġŭ˙˙˙ŝ¨&üü˙úü˙ û˙˙ùü˙˙˙˙ŝ˙˙˙˙˙˙˙˙ù˙íÏ šü˙˙ŭúĠÏ˙˙ù˙˙ ˙û˙úŝ˙ŭĠ ˙ò˙Ÿ"ŭ˙ú˙˙ó²öĝ˙ġÒ Ĝüŭ˙˙ŭü˙˙˙˙˙˙˙˙˙˙üŭ˙ù%Í˙ĉ˙˙˙÷˙›˙ó˙˙ùĦû˙ĝÔŝ˙ġ˙ĝŝù˙ùŭ˙˙÷˙˙ ˙ĝ˙˙ùœ Ħó˙˙÷˙˙˙˙˙˙˙˙ġŭ˙˙˙ï˙Èí˙ŝ÷˙ú£˙ô˙˙Ê˙˙˙£üû˙˙˙˙ ˘˙Ñü˙ʨÂ˙ü˙ĝ˙$˙ä˙˙ùĤ˙ï˙üÎŝù˙ġš# ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙ô˙Ĵ˙˙˙ñĴ"¨ó˙ôû˙ùŝ˙˙˙ò&›ŝï˙˙$›ú˙ü˙üúŝ˙˙ŝ˙Ĝİú˙ó˙üö˙˙ú˙˙÷˙£ !#Ħŝ˙û˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙™§ Ò!  "˙ü˙ŝùŭ˙ž˙˙ŝ˙ùÍ˙˙ŭ˙˙óŝ+ô˙ó˙ú˙ İÖ˙ġ˙˙˙˙˙˙˙˙˙ûüÓ!˙˙˙ùöË# ˙ú˙˙ü Ŭöĝ˙˙Ó˙˙˙ù"Ù˙˙ÒÖġ˙ü˙˙˙˙˙ĝĤ&ŭ˙˙˙  " ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íÊ ˙˙ !Éù˙ŭ 2 ˙˙öÏŝ ˙˙˙œ’˙˙ĝÈ ê˙˙’ í˙"Ş˙˙˙˙˙ûü˙˙Ž-™ô˙˙ĝ˙˙ü˙˙˙˙˙˙˙˙˙î˙ôúĤħŽŻ˙˙˙ŸœËÌ˙ò˙ô¤ú˙÷úċşĴ˙ġ÷Ï Ï˙ŭ˙˙˙"­÷ó˙˙˙˙˙˙˙˙˙˙˙ùġ˙˙˙˙˙úŭÔċĠ˙ *µ˙òġ˙Ê ›˙˙ù˙û˙Š,$î˙˙ĝ˙ìï˙ŭ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ߍ3 Úû˙˙˙˙˙˙ûûü˙ò˙ŭ˙Ó&&Ĉ˙ġúûûŭÉ# çóï˙úûÚ7šŞ÷ôé˙˙î˙ŭ˙ĝ˙¤˙ú˙˙˙ü"&İ˙• ˙ú˙ú˙˙˙ĝĝ˙Ĥ˙û˙ô˙+˙ŭ˙˙˙ŝĝŝ˙ŭ˙˙˙˙˙˙˙˙ĝÏ˙ÊĜñû˙ŝ˙˙ż"$Íŝ˙íĝÊ'ġ˙öĝŝ˙ġÇ3œü˙ùŞú˙˙ġö˙ ’˙˙ġú˙ !ĝ˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙û˙˙ù Ñĝ˙ù˙˙˙˙˙˙˙ŭ˙˙úî˙˙Ş˙ŝüġ˙ü×˙Ä˙ĝ˙˙˙žġ˙ŭ˙ù#$ŭ˙í˙˙˙˙˙˙˙˙˙˙˙ñüġ˙ûÛ *ŝŭ˙ġġÚ !Ìġŭ˙ŭİÔ˙îÈ"Ġ˙˙˙÷÷¤( ŝû˙Óŭ˘!˙ïŝñ˙÷ ñ˙é˙úĝ˙ù÷˙, ˘˙í˙)¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ü•˙˙í˙˙˙˜ Ħ˙Ôñ˙Ĥ—˙˙˙öÌ˙—"‹˙˙˙˙í˙˙ Ğ˙˙öú˙˙ü˙ĝĝ˙Ñ.!˜˙÷˙÷˙˙ï˙ò˙ûŭ˙ïé•% ò˙˙˙˙˙˙˙˙˙ûĝûûĝ° %(˙-­üûú˙˙ûĝŞ §ŭ˙˙˙˙ ˙ë˙ëüŭ˙˙˜ù˙˙ù˙˙İ 'Žó˙˙˙˙˙˙˙˙˙˙ûŭ÷˙˙˙ŭ˙˙˘)ñ˙ô˙Ä!ö˙˙˙ċ+ ˙ġêğ+Ħ˙ïù µ˙˙ôú˙óù˙˙˙˙÷÷˙Ħ Ò˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙Ï1’úÓ ›˙˙û˙ñ˙˙˙ó"Üñü¤ Ñ˙ŭöŸ˙˙ñéñ´+,İöô˙ŝ˙˙˙˙ûû˙ò˙üÊË×˙˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙úġ˙ġÔ´)˙˙˙˙˙™&Żñû˙˙˙À ô˙˙Ñ.÷ö˙ç˙•†˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ü˙üŝ˙ç˙öĞİ ˙'Ö˙˙˙˙Ó.˙˙˙ü˙˙ Ÿ˙˙ŭüò˙ġ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŭ ĉċñò˙˙û˙˙ôġ˙˙ĝ˙! #˜Ĝ˙ĝ˙˙ò# ˙˙˙˙üĥ(£ö£ħ˙˙ùú˙ŝî˙ŭŬŭ£&ù˙ù˙ñ˙!#˙˙˘ùŝû˙Òĝù˙ŝË$ ˙˙ó˙˙˙ûûŭ˙˙˙˙ù˙˙˙˙˙˙˙˙˙í˙Í ˙˙÷˙é˙ä ŝ˙ü˙˙˙Ĥ#˙ñ˙úù˙Ġ˙ÀìŻŜ÷˙˙˙"İóù˙˙ÊÒ˙˙ŝ˙˙˙ŝû˙˙˙˙˙˙˙˙˙ŝġŜ Ôü˙˙˙ùüö$³óŭĝ˙íİĜ˙öġĤÇ˙˙˙îĝŭï˙ŭ˙˙üŭ&ĥûò˙í˙Úü˙è˙˙˙˙˙˙˙˙˙ĝû˙˙˙ôĈ"˙˙ġ˙˙ñ&Ó˙˙ġ˙™"ä˙˙Ŝ$ Î˙ó˙˙ġÂ˙ġ˙˙Š&ŝ˙ŭ˙˙ê °öù˙ö˙Ż•˙˙ġ˙˙Ġŭ– .ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙™" ˙ê˙îÖ˙Ħ1ûü˙Ğ  ŝñ˙˙ìÊ °˙–+öû˙˙ûÓġ˙˙ŝñ˙÷˙˙ûı"Ÿ˙˙ŝŭ˙úü˙÷˙ó˙˙ĝ˙š˙ù˙˙˙˙˙˙˙˙˙˙ĝ˙ĝ˙ü  ĴüÂ%÷ŭ˙˙˙ó˙ĝ )û˙îó˙×˙˙˙ŝùüŭ  Ŝ˙à˙˙Ë/ŝùô˙˙˙˙˙˙˙˙˙ġ˙ô$ ĦôŭġŝËŝô˙œ+–˙˙ôü˙5!œÀ , ˙ó˙œ)ò˙ôœ ˙ö˙ü#›ċ˙ë³(% 9¨˙ñú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñûòŜŽ ,£(˙ŝ˙œ+ ÷˙ĝ˙ô˙#ĉ˙˙‹)˙öġ˙™î˙˙˙˙ "+ µĝŭüŭ˙˙ŭŭŝ˙ö˙ö˙ŝġû˙úû˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙ħŬÌ·! Ìûù˙ùíÍ•˙úûÌ÷İ!­˙úéÜ˙ú˙ŭ˙ò­ 3˙˙ĝŭŭ˙˙˙˙˙˙˙˙ŭ˙ġ˙˙˙ö$ Ġúġ ›˙˙é˙Èùúù˙í˙÷ŝ˙û˙˙Öô˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙"#˘˙˙˙î˙Ôöç˙ŭ˙ċ˙, £%! ï˙ü˙ó *úúôï˙µÑ˙%ú÷˙ô˙÷Ô˙ûíӛ ĝ˙˙˙ûë /#˸´(¤˙ĝ˙˙˘Ïúŭ# ŝú˙ûÓ( ´ôÍ˙ŝö˙˙˙ù˙˙˙˙˙˙˙˙˙ö˙ôÏÑû˙ö˙żŝŸ%—ú˙ñ˙Ïë˙í˙ôËħ 0ò˙˙˙˙˙î‘0!˙˙˙óÑ˙ŝ˙ŝûû˙˙˙˙˙˙˙˙˙˙˙ôü˙ù,Áúò˙ë˙˙Ñ˙˙˙˙óĤ *Şùô˙ ,òûù˙˙ŭ˙Ïüó˙úú&ù˙˙÷˙)èú˙˙˙˙˙˙˙˙˙˙üî˙˙ïŝ˙Û-ĝŝ˙ì˙× Ôé˙˙úħ (Äë˙ı %•˙˙úöú% ˙˙˙öĜ­Á˙˙û÷˙& 'ò˙˙˙ġô!²à˙˙ôÔ  °ĦÌŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝéŭ£"˙˙ġ˙˙¨˙˙ë˙˜˙˙îî¨!Àŭù$ ˙ŭì˙˙œ& žú˙˙ì˙ÇÑ÷˙˙ú-ž˙˙ò˙óû ˙˙˙˙ûÖù"¸ŝó˙˙˙˙˙˙˙˙˙˙é˙îûŬ%"óŭ˙"˙˙üù˙˙Ò Ë˙˙˙òĤÍ˙˙Ġ!"Ê˙ŝú#³˙˙˙˙˙˙˙˙˙˙˙Û˙˙úŸ "˘˙˙˜,Î˙˙úġĞ , &Ş˙˙ )šŭ˙Ĥ  ˙û‘ $“˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙ŝ˙üĠ°¤öŭ˙˙˙˙ŝïŝò""˙ó˙Ĥüò˙˙™˙ŭó˙óú˙ŞĞ˙˙˙üü˙˙˙ü˙ù˙²ž˜˙ô˙ŭŝ˙˙˙˙ù˙˙˙˙˙˙˙˙÷˙˙˙ # ˙ %Ñû˙ú˙˙ßž˙ŝû˙÷”÷˙˙Ù¨˙è˙˙§ûúŭ˙ú˙˙˙˙˙˙˙˙÷˙ŭ˙ġû"*Ċú˙1 š˙ŭüŝÙ ˙ŝî˙˙ùĤ#'#ö˙ü˙ĝ(µŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙™í˙˙˙Żñ˙˙û˙—˙#&Òĝ÷òĜöĝ˙˙÷ ˙–µ˙˙ù˙˙Ñ˙˙ġ£ ù˙˙ù˙ ˙˙Ü%˘–’# ˙˙ +Ÿŝ˙Ĉ ! "Ĥ£÷˙˙ĝûüü˙˙˙˙˙˙˙˙˙˙˙úÀ'$Ï÷ûö˙˙÷*˙˙˙˙ŝÏ ˙÷˙˙˙ÎÖ˙ù˙,Ĥ˙ŭ˙˙Ê#–˙ôŭ˙Äİ÷˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙û˙ $Ŭ˙˙˙ġÓĤ ×˙Ü˙˙›'žŝ˙˙¨İ˙ê˙˙˜—˙˙˙˙ #ü÷˙ ˙˙ò˙˙˙˙˙˙˙˙˙˙˙û˙ù˙ʗ­ġ˙ŭ')ÉïŝŭŸ"Öŝ˙¸ '—Ç˙˙Ĝ0 ŝíú˙ÂĴËġò˙ÒÚ˙íŝ˙×˙˙ò˙”+ú÷˙ü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÚû˘ïû˙îŜ$ĝúò˙˙– #!¤ò˙Ö§/ 7ĝ˙ ! °˙ùĉ°!$” ÒÉÜüí˙£Ċŭ˙ŝ- ä× ˙ñ˙ž!˙˙˙˙˙˙˙˙˙˙ó˙˙òĝ˙ŭ!$˜˙Ññ§ + Íúû˙˙˙÷Ë '%Úìż˙™ÑÛ &Èê+  Ċ˙˙˙˙˙˙˙˙÷ù”!…˙Ż  ×ĝúÎûġí˙˙ #" á—"" šĝÏĝ—&*Ĝŭ˙Ħ 2#˙÷5 ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙úüü­ &#Ġŝŭùì,óö˙˙˙˙-™˙Öè§˙˙ôó¤˙ü˙÷˙ò˙Ì˙Ê Ÿ˙˙˙˙˙˙˙ú˙˙›-˙ù˙˙üùŝ˙˙˙˙˙˙˙˙˙˙ĝ˙ùÓüÒ!Ï˙˙ú˙û­ëĝ˙ò˙Ĥ ˙˙ĝĈ"  ô˙˙ñ˙˜#ù˙˙ŭ˙˙˙˙˙˙˙˙˙˙ü˙˙˙òž  ˙˙Ċ§ˆÚ˙˙œ˙˙û˙˙ĉš£Í™üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙Ĝ  )&í˙ìÌ#! ×ï˘)Í˙˙Ü2 İŸ˜)&ûü˙É$4 #Ï÷Ä   òû˙(% *÷ûÏ6™˙˙óá - )(¨ô˙ĝö˙˙ü˙˙˙˙˙˙˙˙öÊ' *˙ù˙˙Î %Ÿúü˙Îŭ•$ "%Ĉ˙ì˙˙ĝ˙, ŝ˙öŻ$'Ĉ˙ïŬ'+Ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭìŜ žŝÄ"¤˙˙´­"¤šÏëÌ–¤ &ĝù˙“ –Ñö˙Ĥ& Ï˙÷˙˙˙˙˙˙˙˙˙˙î˙˙Œ#  ˙ş ×˙£ħë˙È2Ž.&˙˙˙ (˙˙È.˙ûÌ  û˙˙͞  ·Ïüûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˘Ħ£ÇĤ"œ˙˙˙˙  +Çĝ˙Ÿ"  ˙˙÷ $ ˙˙ĝ˙%) Ĵé˙³ ›³(Ò˙÷˙˙˙˙˙˙˙˙ĝ˙˙˙˙í˙"Š˙ŭ˙•#§˙üûú˙ò˙˘+ %Ÿ˙˙ú˙Ħ&Éû°Ş˙˙’*&˘ß˙˙˙˙˙˙˙˙˙˙ŝ˙ÓüŸ˙×éÜİÓï÷˙ŭú˙ÊÔÙĊü˙˙˙ĝ˙™²ïĠÂä½Ö˙˙˙˙˙Ħ"˙ŝ˙ŝıÛÜÀÑÉŭ˙ùı#&İùöûġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ĝ˙˙üÈ$#' ˙˙˙˙ŭ-£ú˙ĝüí˙$˙˙˙˙#ÇŝÒ÷İ ˙ù÷˙ĵ!Ħ˙Ô˙ŝ“òŭ˙˙˙˙˙ŭî˙#$Óü˙úûŝû˙˙˙˙˙˙˙˙˙˙ûô%·ò˙•¤ï˙üù˙´Ì˙ġ˙ !À˙ú˙Ν˙ÇûÒ%Şî˙ó˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙›&,Êïú˙í˙ŝöÛ&˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġôŻ"#ŝ˙Ê˙›%Î˙Ȟ+ Ž˙˙ûëħ,˙ù˙˙˙û’ ˙üÔ !˙ôĞ˙ŭŝĜ(˙˙ġ˙ĝß ! 4&¤î˙û˙˙ûù˙˙˙˙˙˙˙˙˙˙!&Ĥóúĝ ˙˙÷˙˙˙" ! ,Ÿ×˙ç˙”"¤ùĜ ¤ġ˙Úîŭŝŝ˙˙˙˙˙˙˙˙˙˙˙î˙˙Î"Öħ$ü÷+,Ì˙˙Î*(˙˙ò#˙˜ !í˙˙˙˙˙˙˙˙˙˙ŝ˙ġ÷*  ˙Ö0,ÂÏ ŝ˙˙ĠĴ,* ˙ŝŸôü" !(­Ġöœ+˙úí˙™-# !$'Äö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙#"  ,˜İ˘ûù˙í–,Öŝ˙È%$ ³İ 5ñ˙÷ú˙Ż -! ˙ó˙˙˙ú$ #$ŝ˙ñ˙˙ŭ˙˙˙˙˙˙˙˙˙ñ˙Ú˙˙ç˙"¸˙˙ü ÷˙˙˙ûù˙üž(&‘˙˙ê˙üŞĴ˙ó˙ú˜˙˙ô˙ĝ˙ŝ˙˙˙˙îôŭ˙˙˙˙˙˙˙˙ġ˙óñ˙˙ï˙ñ˙ó˙˙˙ô˙ŝò˙˙˙ùé˙˙˙îú˙˙˙ŝ˙ĜœŸžÑ˙ĝ˙ġ˙ï˙˙ï˙ùÈ˘ž Ïġè˙˙˙ġô˙û˙˙˙ŒĤ”ĞĤ¸˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙œ Ôŝ˙˙ö˙× Î˙ŭŭܛœ˙÷ü˙–+Èó˙œ!Ÿö˙ûÌ˙ô˙Üñ˙˙ŭü˙˙ÖĦ !# Ğí˙ü˙˙öŭ˙˙˙˙˙˙˙˙ûû˙Ì “ŝŞ ġ˙˙Ä "ûŝ˙š ö˙ûĝÙ %¨Ĥš š˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝËû % Ÿŝ˙Ÿ¤ŭü˙˙ĝ˙ûŸ!Ñ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙öü“!›˙˙öŝ˙ŭ˙úó˙˙ö˙˙˙˙Çú˙˙ġ˙ĝ˙˘%É˙ò˙˙ĝ˙ü˙ŝ˙ï˙˙ŭ Î˙ì˙˙è˙˙ĝ˙ĝû˙˙˙Ÿ£¨˙ñ˙˙È˙Êœ˘ÓÖ˙ó˙˙˙˙Ë  ž˘ŝ˙Ì•ŝ˙ġŝ˙ŭġ˙˙ô˙˙˙˙˙˙˙˙˙˙ñ!˘™¤ĦĈ˙ù˙Ġ£¤¤×ġ˙˙úô˙¨ Ĵ›ĦùÑü˙û$ ­ Ñ˙ùž"Ÿİ˙öÔ§˘œú˙˙ŭû˙˙ü˙˙˙˙˙˙˙˙˙˙÷ü÷ܑ!# úÍ Ħßġ˙™§(œ˜ŝü˙û˙šİÓ˙ŭġ˙£ )›Ŭ ˙û˙˙˙˙˙˙˙˙˙ŝ˙û˙È£–"Ìô˙ɤ Ÿĝ˙˙&Ħ˙÷˙˙͞%#˙ŭúž #˙˙Í&Öùŭŝ˙˙ûú˙˙ù˙ô˙˙  !$Ĥ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙úž ŸĦ£Ôüĝ˙˙ä˙àŽŞûü˙ü–½ùİ–ŭûû˙óü Ş'ŸŞŭô˙ùġ˙Ħ ¨—§™˙ŭù˙›ŸĤ˙ù˙ú˙˙˙˙˙˙˙˙˙ö˙˙ù˙˙üŝ˙üô˙˙ó˙ĝ˙˙ġ˙÷˙˙˙˙úü˙Û˙ŝù˙ûó˙ù˙ĝ˙Ç÷˙ô˙˙ĝĠù˙ö˙úû˙˙ġ˙˙ì˙˙ŭ˙˙˙˙˙˙˙˙˙ù˙˙òŭ˙ô˙˙ŝ˙ĝ˙˙ŭ˙ò˙ŭġ˙˙˙ó˙˙˙ŝ˙ŭŝŭ˙˙÷˙üŝ˙˙ö˙˙˙ûŭ˙˙˙ġ˙ĝĝ˙˙˙ô˙ġ˙˙˙ŭó˙ù˙˙ŭ˙û˙˙ó˙ġûġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˙˙˙˙˙ùú§#Ê× ! ˙˙ú˙˙˙ Ï˙˙È™ÓÖ˘ïîôŝ˙ŝŝ˙˙Ç#¨üûû˙ŭ˙÷˙˙˙˙˙˙˙˙˙˙÷Ö' ˙ò˙“ŝ˙˙"ù˙ù˙ĝÛ 0 ĝ$Ĉŝ˙ù˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²&œû˙÷ך,Ë˙úù×ÓĠħù˙ĝ˙ô˙˙ö˙ü™!"ù˙ù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝ˙˙˙˙˙˙˙ñ üüü˙˙˙ŝû˙˙˙˙˙˙ġßÍÌÑàô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙ÌÑàô˙˙˙˙öÙÖö˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²ûüĝÓ¤ÌùĞ˙ĝ˙˙î˙˙˙˙˙˙˙˙û˙Ä!ô˙ô˙˙ö˙ü™!˘ü˙ë%$%Á˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġßÍÙòÛÓŝ˙ó˙ÑÌÌÛò˙˙üËÏÑÜ˙˙˙˙ÜÑÏËÒÑÎÏÛñ˙˙ñÛÏÎÑÒ˙˙óÚÌÚġ˙˙˙˙˙˙˙˙˙˙˙÷ñĥ $ĈŜú˙ú˙˙˙˙˙˙˙˙˙˙˙ö˙£Ñ˙í˙˙ġü˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙òÛËËÛò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôàÑÌÍßġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĥ %Ç˙óú÷˙˙˙# *ŸĈ˙ú˙ŭí˙‘&Ż %–˙üŝ° % +¨˙ûùü˙˙ŝü˙ô˙Ŝ˜Ş› #½˙˙ùŭö˙˙˙˙˙˙˙˙˙˙˙üù˙³>—˙ŭ—+ú˙˙ĴĥšÌ˙üü˙ċüŝ˙ñ˙˙ŝü˙˙ŝ˙ôö˙ĝ˙÷Íġ˙ì˙üŝ˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ì˙˙ĝ˙˙÷üö˙Û˙˙˙˙üôŝ˙Öà˙˙ü˙˙˙˙ŝ˙˙˙ù˙ñ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙ŝŭŭ˙í˙%˙˙˙˙ùû˙˙˙˙ŝûŝ˙˙ŭöĝ÷ü˙˙ŝûŭ˙˙˙˙˙˙˙˙ŭûüü÷òö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙ĝ÷ü˙˙ŝûŭ˙ùö˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ìġ˙˙˙˙˙ê˙ŭ˙ç˙üööß˙˙˙˙˙˙˙˙ô˙˙˙˙˙ô˙˙˙ŝ˙˙˙ùŝ˙÷˙÷ù˙˙˙ü˙ë˙˙ë˙˙˙˙˙˙˙˙˙ŝûŝ˙˙ŭöú˙÷ë˙˙ö˙˙˙ŭ˙˙˙˙˙˙˙ŝĝù˙˙˙˙˙˙ùĝŝ˙˙û˙˙˙úú˙˙˙˙úú˙˙˙ûû˙˙ŝĝúüü˙˙˙˙˙˙˙˙÷˙ôúß !£Ĥ–³ Ĥ˙úù˙ñ˙˙˙˙˙˙˙˙˙÷üŸ*2”ŭ˙úö˙÷˙÷˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñ˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ü÷ĝöŭ˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙”+œ˙˙˙˙˙÷ûè˙˘' ˙Ç˙˙˙ì˙˙ú˙˙ĵ%ħ˙í˙˙˙˙üüÓ$°üÀú˙˙˙˙˙ŝŭŝú˙û˙˙™, ¸ü˙˙˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙ùô˙˙˙ïÑĊô˙˙éÒá˙˙÷û˙ßŝï˙ï˙ġöó˙˙ŝ˙˙˙ŭôúûêü˙˙˙ñ˙ù˙˙˙˙ŝ˙˙ġò˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙÷˙ûùùŝ˙˙ü˙ù˙ü˙˙˙˙˙ĝŝ˙˙˙˙˙ùŭ˙˙ûŭ˙˙˙˙ŭôúûê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ŝŭ˙˙˙  ûü˙üú˙üü˙˙˙üûŝ˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙˙ŝŝŝú÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝŝ˙˙˙ü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙˙˙ŝòû˙˙ĝ˙÷˙ú˙˙ŝü˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŭ˙˙ùŭ˙˙ûŭ˙˙ô˙˙ûŝùü˙îô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙˙˙˙û˙˙ü˙˙˙˙˙üúûü˙˙˙ŭûüûĝĝûüûŭ˙˙˙ŭ˙˙˙˙˙ŭüüŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ü˙˙Ì"%Ÿ˙ï˙˙ĊàĴ (Äî˙ŝ˙˙˙˙˙˙˙˙˙˙ñ˙˙Ÿ Ĥ˙óü˙˙˙˙ú˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùú˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙ûŭ˙˙˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ċ˙˙òĝü˙˙˙Ë˙žàġ˙˙ŝ˙úüŝ˙ä˙˙µÚ™Ä˙ûÌİ˙˙˙óù˙˙ġܚ­™ż˙˙ù˙ŝŭŝ˙ŝ˙˙˙˙úûüÈù˙˙˙ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙úġġú˙˙˙ŝŭ˙˙÷ó˙ĝ˙˙ì˙ġ˙ŭŭ˙˙˙úüĝú˙ŭ÷˙˙˙˙˙ö˙ó˙˙ġŭŭûġ˙ö˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙˙˙˙˙˙˙ŭèë˙ŝö˙÷˙ü÷úŝ˙ŭû˙˙˙˙ĝĝ˙˙ŭġú˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙÷˙ò&!˙˙˙ġü˙úĝ˙˙˙˙˙ŝüüüŭüüŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙ŭüüŭŝŝ˙˙ġ˙˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙ùò˙˙ĝ˙ö˙˙ġ˙ö˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙˙˙ĝĝ˙˙ŭġŝñ˙˙˙˙ö˙˙ú˙˙ŭòŭó˙˙˙˙˙˙˙˙˙˙˙˙ŝüüüüû˙˙üŝ˙ŝĝûŝŝüü˙˙úüŭŝŝ˙˙ŝŝ˙˙ŝŝŭüúŝŭŭŝ˙˙˙˙˙˙˙˙ŝŭŭŝ˙ŝĝöú˙˙˙˙˙˙˙˙˙˙˙˙ñ˙Ĵ Íô˙˙ŝÍòü ˙ù˙˙úù˙˙˙˙˙˙˙˙ú˙÷# ÷ŝô˙ù˙û˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüúúüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭüüŭüüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙˙˙ó˙ŭ˙˙ĝó˙÷úûúú˙ŭ˙ò˙û˙˙ï˙˙óï˙˙˙˙˙ĝ˙˙Ŝ˙˙ïü˙˙ô˙ô˙˙ä˙ŝüŭüûü˙˙˙ġü˙üû˙˙ûûü˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙ŝû˙˙˙˙˙û˙ö˙˙˙ö˙í˙ô˙ú˙˙˙˙ŭöûĝö˙ù˙˙ĝ˙ùŭ˙üŭŭ˙òùġü˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙ùùŝüûŭŭ˙˙˙˙ù˙ġ˙˙˙ü˙˙úŝ˙ŝü˙˙ûú˙˙˙˙˙ŭöûĝö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüû˙îĤ •Ŝ˙ùĝ˙˙˙úûŝ˙˙˙˙˙˙ŝ˙˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙ŝ˙˙ŭüüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙˙ŭñ˙ûó˙ú˙˙˙ú˙ú˙û˙˙˙˙˙˙˙˙˙÷˙êüú˙˙ü˙˙ûú˙˙˙˙˙˙÷ĝöù˙ö÷˙ü˙ŭ˙ú˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙˙ü˙˙ûú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙ŝ˙˙˙ŭŝ˙˙˙˙ŭü˙˙˙˙˙˙˙˙ùŭ˙£!˙˙ìĝû˙˙ú˙˙ó˙˙ĝ˙˙˙˙˙˙˙˙˙ġŭ &Ĉ˙˙ü˙ġ˙ö˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭü˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙ŝ˙˙˙˙˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ġôŝüô˙˙÷˙˙ç˙˙˙˙˙ŝû˙˙ĝû˙ŭû˙˙ŭ˙ñ˙ŭô˙÷÷˙˙óñ˙ŭŝ˙ġ˙ôŝ˙ú˙˙˙˙ŭŭ˙˙ŭ˙˙£ŭ˙˙˙ŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙ûôŝüö÷ŭŝ÷÷˙˙úû÷ü˙ûú˙˙˙˙˙˙˙˙˙ô÷ü˙˙˙ŭö˙˙ĝö˙íî˙ŭ˙ŭò˙˙˙˙ĝ˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙ü˙ü˙˙ŭŭú˙˙éŭ˙ĝ˙˙˙˙ü˙˙ù˙˙ŭúü˙˙˙úôö÷ü˙˙˙ŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûĝġô‘1 %4Ë˙˙ûû˙ŭ˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙ü˙˙üüŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙üú˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙üû˙ü˙˙˙˙ò÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙÷ġ˙˙˙˙ùŝúü˙˙˙úôöó˙ôú˙˙˙ö˙ŭ˙ö˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙ü˙˙ŝŭ˙˙˙üúûŭŝüù˙üûüûùùŭŭùùûüûü˙ûüŭ˙˙˙ŭúúŭ˙˙˙ŭüû˙˙˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙ĝ–$( §Ì˙Ŭ’1ĥô˙˙˙ĝ˙˙˙˙˙˙˙˙˙ŭœ0 $èì˙÷˙˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüú˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙úûŭ˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙ŭ˙ŭ˙è˙˙ĝ˙˙ñû˙˙ĝú˙î˙˙÷˙˙óîù˙˙ŝì˙˙˙˙˙ñ˙ŝ˙˙˙˙÷˙óŭ˙ŝó˙˙˙˙˙ŝŭ˙˙û÷éĦ¤§¨Ô˙úóŭ˙˙˙ŝú˙˙˙˙˙˙˙˙÷ŭ˙˙˙˙˙˙ü˙˙˙˙ŭü˙˙ŝ˙ö˙÷˙˙ñ˙üúñŭ˙˙˙ŭûüûú˙˙ü˙ġ˙˙˙ùûû˙˙ŝòúŝ˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù˙ôŭü˙˙öû˙ĝ˙˙˙˙ö÷ŭ÷˙öù˙úŝ˙úòû˙˙˙˙˙ŭûüûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüúĝ÷™ ,Â˙˙ûö˙˙˙˙˙ŭûûûûû˙˙ŭŭ˙˙ŝ˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŭ˙˙ŝŝúú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝùüö˙÷ó˙ĝ˙˙˙ŝ˙˙ĝ˙ù˙˙˙˙˙˙˙˙˙˙û˙òóü˙˙úòû˙˙˙˙ö˙˙˙ùġ˙˙úû˙˙˙ŝúû˙˙˙˙˙˙˙˙˙˙˙ŭûûûûŭúú˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙ŝŝ˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙ŭŭûùŭ˙˙˙˙˙˙˙˙˙˙ë˙ñ$ Ĵ* ˙˙ïû˙ŭ˙˙˙˙˙˙˙˙˙ĝĤ(˙˙˙˙öú˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭŭ˙˙ûûûûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ôŭ˙˙ûüĝ˙öŭ˙˙÷˙˙ŭü˙ĝü˙÷ŝ˙ûġ˙ŝ˙˙ü˙üü˙ĝ˙˙˙˙˙ġö˙ù˙ö˙û˙˙ŝ˙ŭû˙˙ŭü˙˙ú˙˙ŭ˙˙ò˙ö˙û˙˙üŭŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙ôŝŝ˙ŭ˙ûú˙˙ûŝöñ˙˙ú˙ŝŝ˙˙üû˙ù˙üŭû˙˙ŝ˙˙ù˙ĝ˙ü˙öü˙ö˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ü˙ŭû˙ú˙ŭ˙˙ò˙û˙˙˙˙˙ú˙˙ĝ˙ŝ˙˙˙üûüûŭû˙˙ŝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüŝ˙˙˙˙˙˙ԝ¤£˙˙ĝ˙ŝ˙ġ˙˙˙˙˙˙˙ŭ˙˙˙üû˙˙ŝ˙˙˙˙˙˙˙˙ü˙˙ŭŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙üû˙˙ŝ˙˙˙˙ŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ûü˙˙˙ġ˙üö˙ĝ˙û˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙˙ïŝ˙˙˙üûüû˙öŭ˙ŭ˙ûĝŭ˙˙òú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üŝ˙ŝú˙ŝ˙˙˙ŭüŭŝ˙ŝ˙˙˙üúŭŭúü˙˙˙ŝ˙˙˙˙üúúŝ˙˙ŝúúü˙˙˙˙üŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙÷˙û˙Ó!)Â˙ŝ˙ĝ˙÷˙˙˙˙˙˙˙˙˙˙ŝԜ¤Óŭòŝû˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ü˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙ŭŝŝ˙˙ŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûü˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġßÍÏÔIJÉù˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙ŭö˙˙ûôù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙˙˙˙˙˙ûĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüüüùŭ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙ü˙ŝùû˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûûûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝŭŝüúü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙ù÷˙˙ŝö˙˙ú˙˙˙˙ûŝ˙ŝŝ˙˙˙ġ˙ùúŭ˙ŭô˙÷˙˙ò˙˙ú˙ûú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ú˙ŝ˙òŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙ŝüûü˙ŭùùŝ˙˙˙ŭ˙úŭ˙˙˙ú˙˙˙˙˙ġŭî˙˙ö˙˙ù˙ŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝùó˙˙êĝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝöû˙üü˙˙ù˙˙ú˙˙ŝ˙˙˙˙˙ŝûŝ˙ù˙ú˙ĝ˙üñŝò˙˙ñ˙ù˙úùû˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙ü˙ŭŭŭ˙˙ĉĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ú˙˙˙ù˙˙ú˙˙ö˙˙˙ŝŭüü˙˙˙ŭ˙ëŭĝ˙˙˙˙˙˙úŝ˙ûì˙˙˙ö˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙ŝ÷˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭûŭŭ÷˙ŭüû˙ŝù˙öùŭ˙˙˙˙ú˙ŭ˙˙˙˙éĝ˙ŭŭ˙ûüĝ˙˙ìŝó˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙ŝŭ˙˙üùë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ûú˙˙ŝ˙˙˙ù˙˙˙˙ĝ˙˙˙˙ŭ˙˙˙˙û˙ÓÁĴ§Û—÷ÊŜ!×˙ù˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙˙˙ÌĦ·˙ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óàôòäòó˙û˙ġäê›ñŭ˙˙ĝú˙˙˙ó˙™‘!3Ñ -™ġ˙úò˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ìó˙œ$˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ʞĴ¤’ŞÛŝĝ˙ÔĴŞĝ˙˙˙ŭüŭ (—!( * *˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŝŭü˙˙— Ó˙˙˙žĦ˙ùü˙ġ˙Ó ˙Í£ ¤é˙Û—Óû˙üŝô˙ù˙üŭ˙ġ˙ü˙ĝù˙ü˙ŭĝ˙˙˙ô˙˙÷˙˙ġ˙˙ù˙£˙ŭ˙˙ö˙ò˙˙ü˙˙˙ü˙úù˙ŭ˙÷ö˙˙ò˙˙ò˙úŝ˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙üŝ˙˙˙ŭùÇ& )Ëù˙ü’, ˙ŭ˙˙˙ġ¤)˙˙ú˙ġÚ˙˙ĝ˙û˙˙÷˙ô˙˙ŭúï˙˙˙ŭú˙ü˙˙ŝ˙ù˙˙ùù˙ùúù˙˙˙ù˙öÓó*Ĉŝüü÷˙ŭ˙üü˙ù˙ûò˙˙˙ŝŭŝ˙ŭ˙˙˙˙ú˙ü˙ô÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŭùùĝġ˙˙˙˙ &Í˙ï˙˙š×úô˙˙é˙ŝ˙ñ˙˙˙%%ú˙ê˙÷˙˙ü˙˙ŝ˙÷ûĝ˙˙˙ġ÷ö˙úóŝŝòú˙ûû˙˙˙˙÷ü˙üĝŭ˙˙˙˙˙× Ûĝ˙û˙ŭôĝ˙ŭù˙˙˙ù˙÷ü˙˙ó˙ù˙˙˙ĉ˙˙ġ˙˙ŝôö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙ŭŝ˙ùċ˙üĴÊ˙˙˙÷ŝñ˙˙ù˙˙˙˙˙˙ !£˙˙òġ˙"›ġ˙˙ú˙ġò˙˙îò˙÷˙˙ñúŭŭ˙˙ŝŝ˙˙ŝ˙ŝ˙ŭ˙ġ˙ë˙ù˙˙˙ŝü˙ûî˙ï˙!Ûĝ˙˙˙ŭâÓú˙ŝôŝ˙˙÷û˙˙˙˙˙ùû˙˙÷ĝ˙çŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŭŝŝŝ˙˙˙ó˙Ÿ#˙˙û˙ŭ˙˙˙Ñö˙÷˙˙óŝ ˙üŭ˙ĝš˙öû˙ö˙˙˙ŝ˙˙òŝĝ˙ŭ˙˙é˙ĝ˙ĝĝ˙üô÷˙÷˙˙ŝŝŭ˙íôù˙˙ŝ˙˙˙˙˙"Îñ˙ŭġÒ˙˙˙ŝ˙˙ïĝ˙ŝüŭòŝ˙˙ú˙Ħâü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ù÷˙˙÷è˙˙ŝŸĝ˙óù˙ĝŝ˙˙˙ô˙ùŭ˙œ#&ùŝ˙˙ò˙Ħ×ü˙ü˙˙òġ˙û˙ü˙ĝ˙ûú˙ÖÏ£Ê˙˙˙˙ŝ˙ÏÜÉÁ˙˙ĝ˙Ġ Î˙üô˙îüŝÙ˙ö˙ùħ%ëü˙ġ÷˙Ñܔ$ħ¸ß˙ŭ˝ ëûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġü˙˙˙ùü˙˙ò˙˙™Ÿ˙˙˙˙üü˙“İô˙˙ŭ˙­ġ˙÷ä˙# ˙ġĈ§ -’˙˙ú˙÷˙˙ҏ$#Ĥ˙ĉŝ¤"˙ìü™!$=µù˙˙˙˙˙Œ"í˙ü˙Ħ<ô÷˙˙ì /Êġž2âĝ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôú˙ëÊ˙ŝŝöÊ˙˙û˙Î˙ì˙§Ŝä˙˙פú˙˙üŝŸ'§Ë˙˙ÄŸŭ˙˙)­˙÷˙ûÓ×÷˙ûĞ# ˙˙÷˙˙˙Ş .Î˙ô˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŭ˙üû˙˙ŭ˙˙ü¤Òŝ˙Í™Ì˙üĝ$‘˙˙Ë#É˙ûÈ š ×˙ĝ˙˙Ĝ ˙œÇû˙˙œĦ˙ö˙˙˙˙ú÷Ü Ë˙˙ŝŝ! ŝĝ˙ŭ˙˘ Ë˙˘ŞĈ˙˙û˙ò˙úŭ˙üĝĝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭ˙˙ü˙˙ôû˙œ'›ôóÜ Ş˙ò˙˙È"›˙îĦ›"Èëü˙˙ġ˙˙óĝ˙Ÿĉ˙ôû#˙Ù˙Ì +˙ü˙ŝĊ˙ú˙ĝ'œ˙ú˙˙™£ŝĝ˙˙—!Ĵóú˙ü˙˙҇AÏüöœ˙÷˙˙ï˙ú˙ñóĝù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úö˙˙˙˙˙ # Ğ˙ïô˙4’ŭŭ˙˙˙ĝéé˙˙˙Í Ĥàĝì˙ŭ) +À÷˙˙ŭĠ˙ùùÙ§ġï˙ü˜$ĝġ˙ô˙›˙˙˙ï˙  §û˙˙ŝ- Ĥ˙˙ŭ˙ÏÄ˙˙˙ò˙˙˙ŝ™!ïŻÖû˙˙ö˙˙ú˙˙˙˙˙òĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŜòÎ* !Ç˙˙˙˙Ê! İû˙ïŭú˙Ÿ˙˙˙ġÚ$§˙˙˙ò˙# ˙êŭ˙&˙í˙ú$ú˙˙˙˙˙ûí˙ŝ˙úšžòó˙û˙ '"˙ôüŝü "&Ìòù˙ìê!ó˙˙˙˙ĝô˙ı+&ŝ§ &•˙ò˙÷˙˙Â˙î˙ü˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ïò˙ ˙û˙öï˙#ôûú˙˙÷$Òòü˙¸ ûö˙ñ˙˙û˙˙÷#ŭ˙˙˙Ÿ˙˙öüúö˙˙í˙óġŞ%#˙˙ñ˙óĤ˙˙ûŝ˙˙ Ùú˙ûùĵ ˙ŭô˙û˙˙˙˙–%Ï˙˙˙˙˙ü˙òûê˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úó˙˙˙ù% ,šê˙ġ˙˙Ä# ċî˙˙í˙ û˙˙ñ#¨ö˙˙˙ù'˘ö˙ì˙ŭ5Ï˙˙÷½&öŝ˙û˙üü÷˙˙˙˙İ 4óîöŝ˙˙÷ö˙ùñ(Ĉ˙ë˙˙˙ûĝ˙˙ó˙÷ò÷£.%¨˙ŝ˙â˙˘%°í˙˙á˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙à$$˙ĝôú˙˙÷˙ôû߈!#˙é˙ùÍİŭù˙ë˙$Ċ˙˙ġ˙Óü˙˙˙"²í˙íĝ˙˙ó˙˙ûĝ˘'˙˙˙úú ³é˙˙÷˙˙ ˙Ċ˙˙›%ż˙˙˙˙ĝ˙˙˙˙Ü+%ÂÊù˙ù˙˙%˙˙÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ˙˙ŝ!+ úĝ˙üúö ¨ö˙ûüĝ³Í˙ûúÒĤŝ˙ġ˙û " ˙û˙û×ôü˙ù˙˙˙˙ĝü˙˙ġ÷Ŝ˙ž 'É˙ï˙£" —˙˙ĝ˙˙í- ú˙û÷˙Ġŭû˙û˙ŭŭ˙ĝġ û˙˙˙ŭïŭ&Ùó˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ Ì˙˙ûÎĠŝ˙ġ˙ Ïùŭû˙Ħ£ü˙˙ù˙Ÿ˙ò˙˙ Í˙ŝ˙˙š%ÉûÒŝ˘£÷˙Í˙žžŜĠÚ÷˙öÉÑ Ùòŝ˙˙  ġÖË˙ġ˙ü˙˙ĝ#ĝ˙÷˙˙ŭô˙ŞĴï˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô'(Áû˙ ŭŝ˙ĝ›$°ĝ˙  ”˙ È˙ó&+’ĝ˙òóĴ °¨¤´ĝüô˙ü˙"$Ê÷˙¤ Ü˙ġ˙Á"ì˙úġŝŝ˙Ô¤œÒú˙ġù˙˙˙¸0œĉçñ˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôż$! -ĤÁ ”ö˙ï!$›ô˙  Ş˙( ¨˙û- ¨˙˙ŝ˙&""(ë˙˙˙ñüùĥ !9’Ï!˙ŭ !ñ˙ñ˙­˙˙ú˙˙üĝ˙£ °˙˙˙˙ü˙ù˙÷ÁÈß˙ô÷˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙Ê˘ Ż•Ô˙(œÖ˙ġÜ!Ú˙ò˙ó˙ü˙˙ûäŭ˙ó˙ôŝġÜŝ˙ùú˙ĝ˙˙˙˙û˙ò˙˙Ċž¨£˙ì˙ûü˙˙˙˙÷˙˙ô˙˙˙ġ˙Ô˙˙ŝùû˙ó˙˙˙˙˙˙˙ëŝ˙Ĝú˙˙ó˙˙ô˙˙˙ŭÑĝ˙˙ŭ˙ü˙˙˙˙ç˙˙˙˙ġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭŭûï˙ġ˙˙˙û˙ú˙ĝ˙ô˙˙˙˙úŝüí˙ûŭ˙úö˙˙˙˙ŝü˙˙˙ŝŝü˙ì˙û˙ô÷ïŝ˙ü˙ġĜüû˙÷˙˙˙˙ü˙ĝŭñĝ˙˙˙ŭ˙˙ñ÷ġïĝô˙˙û˙˙˙ûúŝüù˙ûù˙˙÷˙˙ŝö˙˙ùô˙ŭüŸ˙˙˙îúŭ˙ŝù˙ĝô˙˙ĝû˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ó˙˙í˙˙ù˙˙˙éúŝĝ˙˙˙öŝŭ˙ü˙˙ô÷ŝû˙˙ĝüúó˙˙ċ˙ó˙ü÷˙˙ò˙ö˙˙˙˙ù˙ú÷˙ú˙÷˙ü˙ôŝöŝ˙˙˙˙˙ö˙ûŝŝ˙˙˙î˙˙óí˙ŝĝ˙˙ġ˙û˙˙ò˙úùŭùĝ˙˙˙ĝ˙˙˙ŝ˙ħù˙è˙ŭ˙˙ĝĝ˙˙˙˙˙ú˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙÷ú˙ùúĝŭŭö˙˙ù˙ô˙ó˙ñ˙˙˙ĉúü˙˙˙ò˙ĝŭ˙˙˙˙˙˙ù˙˙ùó˙ŭ˙˙˙ìò˙˙ŭ˙˙ĝĝĝ˙˙ŝüò˙˙˙˙ïí÷˙÷˙ŭ˙˙÷ĝú˙÷ö˙˙ïú˙˙˙÷˙ô˙˙ŝ˙è˙˙û˙ŭû˙òüôûŭŝ2žü˙˙˙ö˙˙˙˙˙úù÷ö˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙ŭ˙˙ü˙˙˙ú˙˙ï˙ï˙˙˙˙ŝ˙üĝ˙˙˙˙ñ˙üû˙ŝ˙˙ĝü˙ü˙ô˙˙ġò˙ĝ˙÷˙ŭú˙ŝúú˙ü˙ôŝ˙ĝ˙˙˙ö˙˙˙˙ŭ˙˙ï˙ù˙ŭ˙˙ö˙˙í˙˙î˙ùû˙˙˙˙÷˙˙˙÷˙ŝ˙í˙˙û˙˙£ +Ò˙ŭûüü˙÷÷˙˙ŝ˙˙ü˙˙ü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ŝ˙Ĝ ˙ö˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ"˙ç˙˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙üì˙ôÉĞó˙˙ŝï˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĉ˙ó˙û˙˙úù˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ŝü˙ûúùùûô˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îö˙˙ü˙˙˙ŭŭú˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ì˙ï˙èö˙˙˙úŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûò˙˙ú˙ġ˙˙ò˙÷˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ù˙î˙ü˙˙˙ĝù˙ûú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ù˙ú˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙÷˙ġ˙˙öŝ˙˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙ö˙ü˙˙˙úù˙ŝ˙ö˙˙˙˙˙˙˙˙ó˙ù˙˙ĝŭü˙˙˙ùŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙ï˙÷ù˙ŭú˙˙ŝŝú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙÷˙˙ĝ˙öö˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ŝ˙ŝñ˙ô˙˙ñ˙˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùö˙˙ò˙˙˙ö˙˙ñ˙ŭ˙˙˙˙˙˙˙˙˙˙ô˙ĝĝ˙ŭ˙ô˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙û˙˙ĝġ˙˙üû˙á˙˙˙˙˙˙˙˙˙˙öú˙ûô˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ĝ˙ü˙˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙ŝ÷ò˙˙ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙ġ˙ö˙˙˙ġŝŭ˙˙˙ŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ŭ˙ùúö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùûŭŭĜ˙ĝü˙ù÷ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙ŭö÷˙˙˙ûûŝ˙˙˙˙˙˙˙˙˙˙ê˙ġ˙˙˙üû˙˙˙˙˙ġô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙üç˙˙˙˙ô˙˙éó˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ùù˙˙ìû˙˙óû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôüóŝ˙í˙ôŭ˙û˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ó˙Ä˙ġŝù˙˙üù˙˙˙˙˙˙˙˙ĝ˙ùü˙ŝ˙ŭ˙ûóüó˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûñ˙˙ŭ÷ï˙˙û˙ŝ˙é˙˙˙˙˙˙˙˙˙˙˙ŝġü˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙ó˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙û˙˙˙öġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûúŭùġ˙˙˙üù˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝúù˙˙ŝġ˙˙ĝü˙üúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝö˙˙˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ŝüŭ˙˙˙˙ŝ˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙üŭ˙˙úûû˙û˙ö˙˙˙˙˙˙˙˙˙ċ˙˙ĝó÷˙˙˙ĝġ˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙û˙÷ú˙í˙˙˙ùô˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙÷ûûáû˙˙÷˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ûŝ˙œž´Â˙ġù˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ú˙ġóï˙î˙˙üî˙ï˙˙˙˙˙˙˙˙˙ú˙˙÷˙÷˙˙˙ò˙˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ŭö˙˙á˙˙÷ŝö˙˙˙˙˙˙˙˙˙˙˙ĝ˙ü˙ö˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ùÄ˙ŭ˙˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ûü˙˙ñ˙÷ú˙˙ŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙ù˙öì˙ú˙˙˙˙˙ŝ˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭĝ˙ûöü˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭ˙û˙éû˙êÓúù˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙üóûô˙ŝ˙ŝ˙˙úû˙˙˙˙˙˙˙˙˙ù˙ŭ˙˙˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭŝí-Ÿ§óĝ˙˙˙ĝì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭú˙ŝú˙ïùŭŝ˙˙û÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ô˙! é˙˙˙ù÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷˙˙Ä $Ùñû˙ġ÷˙˙˙˙˙˙˙˙˙˙ûĝ˙Ĉ£Ĥ ġû˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙îé˙óó˙û˙%šùîġ˙˙˙˙˙˙˙˙˙û÷˙ò˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙"˘Ëŝ˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭöĝ˙˙úû˙ùû˙˙ĝü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ôûŝ˙˙òù˙˙ò˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙ŭ˙˙˙üĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ü˙™"%˙ú˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙÷ö˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙÷˙òĝÌ'û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙žĥ&×˙ñê˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙Ĥ˘š§Ĝĝûŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˜&á˙íù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙È # ˙ŭô˙˙÷˙˙˙˙˙˙˙˙ĝ˙÷À/ /'•˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙‰!Ò˙˙˙˙˙˙˙˙˙˙ó˙ş Î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙)˙ôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ôŭĝï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙íĜ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙Ğñ˙˙˙˙í˙˙ö˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ĊÉÎÎ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙ŝ˙ġ'Ï˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ıËÚÔÑó˙ûüò˙˙˙˙˙˙˙˙˙˙˙˙Ò°˙òú˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙  #ë˙ŭŝñ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙û˙Ïžŭ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙·& (Ä˙ùü˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭì˙÷Ç#!)Ğòûú˙˙˙˙˙˙˙˙˙˙˙˙˙× " Û˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù˙î˙í) "#È˙˙˙˙˙˙˙˙˙˙۝+Ïú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§˙éô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ë£Ġ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙üñóû˙üû÷˙˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòÖ –Ş äĵö˙ĝŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò™$/óŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭò˙ŭ˙ Ċ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òü˙˙˙ñ(µô˙˙˙˙˙˙˙˙˙˙˙ûö˙˙ì² ™˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò &´“ĦÖ˙öü˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙îôĴ$"§˙˙ŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ĥù–šŬ˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙•ž˙û˙ò˙˙˙˙˙˙˙˙˙ĝ˙ĝùќ" "Ĝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ùù˙‘. '˙ġû˙˙˙˙˙˙˙˙ñ, ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ & š˙òĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙â.Ġüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙š *ħ£˜Ŝŭû˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ%—Ö¨  üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜĦ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ö˙Şüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝ˙˙#ï˙˙ò˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙˘İŭŭ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜİÂĊ˙ÇÏŭŭü˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙òÍ ò˙ĝû˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ £óŭ˙úü˙ú˙˙úŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ñ˙Ï£!ùĝ˙ù˙˙˙˙˙˙˙˙˙˙˙ô˙˙ú˙›˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ó˙˙ö˙Ÿ"Ž˙˙ü˙˙˙˙˙˙˙˙˙—#Ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝÌ%¨ĝ˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ & ""ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙܆0Â˙öú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙Á˙˙˙ġĜ! ĝ˙˙ú˙÷˙ĝ÷˙˙ŭ˙˙ö˙ġŝúŭ˙ö˙˙ġ˙˙˙÷˙˙ŝ˙˙ŭ˙üĝ˙˙ĝ˙˙ú˙˙ó˙ŭ˙ŝ˙ŭ˙úù˙ü˙˙úù˙úĝ˙˙˙ŝù˙˙˙ûñ˙˙öÚŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġúŝ˙˙û˙˙ó˙˙ŝú˙" İ˙ûûü˙û˙˙ì˙˙˙ŭŭ˙í˙ü˙ô˙˙ŝ˙™"˘Ó˙ùò˙ŭùú˙˙˙˙ûü˙˙˙Ĵ˙û˙÷ùŭú˙˙ú˙˙úù˙öŝ˙˙ñ˙ó˙ġ˙ú˙˙ŭ˙˙û˙˙˙˙ġ˙÷˙˙ġ˙û˙˙üñ˙û˙ûŝö˙ĝù˙˙úŝú˙ġú˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙òù˙÷˙˙"™ŝÖù˙˙ó˙ô˙˙ô˙ŝ˙ò˙ŝŭ˙ë˙÷˙˙˙˙ŭ˙˙˙˙òô˙ŝĝ˙ŝù˙˙ĝ˙˙ŭ˙ġ˙˙˙ôü˙˙˙í˙ú˙˙ùŝ˙ü˙ġúö˙˙ó˙˙ò˙˙ûù˙˙ï˙˙ñ˙ŝ˙˙ŭü˙˙˙˙ĝ˙ô˙˙÷˙˙û˙ġ˙ü˙ûŝ˙ú˙üü˙ù˙ŭ˙ö˙ĝü˙˙ĝ˙ŝú˙˙ŭ˙˙˙ï˙ŭü˙˙˙˙ĝ˙˙ò˙Ÿ ˜˙Ò˙ŝ˙ûù˙û˙úŭ˙˙ú˙ö˙˙ú˙ûŭ˙˙ŭü˙˙ûî˙˙˙˙ĝ˙ü˙˙û˙ŭû˙úú˙˙˙ġŝ˙˙˙ò˙˙÷˙˙˙ò˙×˙ùŭö˙˙˙˙˙˙˙˙˙ü˙˙ĝ˙˙†#˙û˙ú˙˙ò˙ŭĝ˙ŝ˙ŭ˙ġ˙˙˙ì˙ŝ˙ûù˙˙˙ñ˙ĝ˙û˙ù˙˙˙û÷ŝ˙˙ĝ˙˙ûŭŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙÷˙ò˙÷ù˙˙˙˙˙˙ï˙˙÷˙˙ñ˙üĝ˙öŝ˙üĦ$ô˙ŭ˙˙ñ˙˙ġŭ˙÷˙˟Ô˙˙˙û˙˙ë˙˙˙ŝ˙ŝġú˙üü˙İúú˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ùÛĝ&" ô˙˙ö˙˙ĝŝ˙ûñ˙˙üú˙ñ˙˙˙˙˙˙˙˙˙˙ù˙ôû˙˙˙Ŭ •˜!úüú˙˙˙ú˙ŝö˙˙ü˙ñ˙ŝùú˙ġ˙ö˙˙˙˙ĝ˙ŭŭ˙ĝ˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ïž ˙ù˙ë˙ù˙ŭŭ÷˙˙ù˙˙ŭì˙üû˙˙ŭ˙˙˙ñ˙˙öúû˙ü˙÷ù˙ŭ˙˙˙˙˙ĝú˙˙˙˙ùû˙öûŝĝ˙ġö˙˙ìŭŭü˙˙ü˙˙˙ñû˙˙˙ġ˙˙˙˙ĝ˙ñ ˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙ü˙ġò˙˙˙˙Ġú '(Ñé˙˙˙ô˙ó˙˙˙˙˙ö˙÷ŭ˙üġü˙˙ŝïÎ §˙üġ˙˙ä˙˙˙ü˙ò˙˙˙éĊŭ ˜ŝĝû˙˙ü˙ċ˙˙öß˙˙˙˙úúü˙˙˙ŝ˙˙˙˙ĝ˙ŝ˙˙ù˙í˙˙˙˙ëù˙ó˙ĝö˙˙ú˙˙ĝú˙ú˙÷öù˙˙ê˙˙ŭ˙ê˙˙˙˙˙˙˙˙˙ï˙˙úù˙ĵ$²˙˙ŭö˙˙˙ìú˙ġ˙˙˙ü˙˙è˙˙˙˙ĝĝï˙ùúî˙˙û˙˙ġ˙˙ġ˙˙ù˙˙˙ŭ˙˙˙ŭü˙úúí˙ĝ˙ĝû˙˙ü˙ó˙˙˙ĝ˙ú˙ŝ˙ŝ˙û˙÷ù˙üŝò˙ŭ˙˙˙˙˙˙˙˙ŝñ˙˙û˙ŝ˙è˙˙òû˙˙ù˙˙ó˙˙˙˙ëò˙òŭ˙˙ŝ˙òü˙˙ú˙ìó˙˙˙ôġ˙ñ˙ò˙ïŝŭ˙"İüŭ˙ġô˙ŭĝú˙˙ò˙˙˙û˙ó˙ú˙˙ó˙ö˙ú÷˙˙˙˙üì˙˙úûŭ˙ô˙˙ó˙˙˙ï˙˙ñ˙˙ŭŭûŭô˙˙˙÷˙˙ !Œ˙÷˙˙÷˙˙˙˙˙˙˙˙ŝ˙˙ŭ˙ŭĵ ˙˙ç˙ŝ˙˙˙ô˙˙ô˙ú˙ŭ˙ĝ˙öŭŝ˙üġĝ˙ŝ÷˙˙óŝ÷˙ŭû˙ìŭ˙û˙ü˙óŭ˙òú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙úìû˙ñ˙ò˙˙ŭ˙˙˙ù˙˙ùö˙ŝ˙˙˙ŝ˙˙˙ú˙÷ (û˙û˙ò˙˙üú˙çŭò˙˙˙˙˙ŝ˙öŭô˙ü˙˙˙˙˙˙˙˙ûûŭñ§#İô˙î˙÷üŭüû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ÀŸ˘Ÿ£â˙˙÷˙˙ŝü˙ùö˙üë˙ö˙öú˙˙˙˙˙˙˙˙ĝ÷˙˙˙˙ŝí¤˙˙ïŸ˙˙˙˙û˙˙ü˙˙˙˙ŝ˙ò˙÷˙˙˙ġ˙÷˙úöĝ˙÷˙˙˙˙÷˙ĝöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙Ì#(£ŝ˙ñ˙˙ŭĞ&ŭŭ˙˙ïôöïó˙˙˙úú÷ĝ˙˙ïĝ˙úú÷˙˙˙ŭ˙˙˙˙÷˙ôŭù˙ŝ˙˙˙ö÷˙˙˙ü˙˙û˙˙ëò˙î˙˙÷˙ŝ˙ġŭ˙˙ùùú˙˙ü÷ĝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙öĉ˙˙Ĝŝûò˙˙î˙ûú˙ô˙ĝú˙˙ĝ˙ŭ˙˙˙ĝ˙˙ûġ˙˙˙ñ˙˙öĜ˜˙ŝĝ˙ü˙ôòúŭö˙ù˙˙˙ü˙Ş$˙ë˙ûî˙ŝŝ˙˙˙û˙ïó÷ü˙˙û˙ġ˙óŝ˙÷˙úù˙ïú˙ġÙŭ÷˙ú˙Íú™&Ħù÷ù˙ó˙˙˙ĝ˙˙òú˙üġ˙ú˙ïĝ˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙Ŝ˙ĉŝ˙˙ŝÇ˙˙ŝ˙˙ġĝùġ˙˙ŝ˙˙ùòŝ˙˙ñ˙ò˙˙ï˙ñîä˙˙˙û˙ñüŝüö˙ó÷ŭ˙˙˙˙˙ôüú˙ŭóŭĝ˙úĝ÷˙˙˙ó˙ŭè˙˙ĝ˙˙˙ò˙˙û˙ŭŭ˙˙˙˙˙úŝ˙˙˙ù˙ùü˙˙ü˙ŭû˙ùŝ˙˙ŭôú˙ġ˙ñ˙˙ùôò˙˙ñŭü÷˙˙˙˙ñŝ˙˙ö˙˙˙˙û˙ñ Ħ˙ì˙˙ĝ˙ó˙˙öû˙ò˙ò˙÷ë˙˙˙ŭ˙˙˙ŭ˙üú˙ôëî˙˙˙ü˙˙óâ˙Ê˙˙ûĈÔğɢĝ˙ùĝ˙˙˙ŭ˙˙ò˙˙ûûÇĝüŭô˙˙˙˙˙˙˙˙˙˙˙˙˙öûú (£òÏŬû˙ü˙éö˙ñ˙˙ŝŝ÷ŝ˙÷ú˙ò˙ôŝ÷˙˙ŝ˙ŝùü˙˙˙ú˙ŭú˙˙öíüú˙˙ú˙ú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ÷Ú˙˙÷ġġ˙˙Öġ˙˙˙ĝîúû÷˙Âüô˙ġ( ˙˙˙ô˙È˙˙ŝò˙˙ĝŝ˙ï˙ùĝí˙˙˙˙öŝĝ˙äÊ˙ñúŝ˙˙™ ż˙óÚûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óü˙ŝ˙˙ŭ˙˙ûñġ˙˙ö˙÷˙˙˙ĝî˙˙ĝ˙ù˙˙˙˙˙˙˙˙˙˙˙ù˙˙óó˙˙  ™ú˙˙˙ġŭ˙˙î˙˙˙˙÷˙ĝó˙úġ˙éí˙˙˙ĝùú˙ù˙˙˙òò˙˙˙ù˙úù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÊ $ ŞúÚ˙óûüÍ™ŭŝĝ˙˙˙ŝ˙˙ú˙˙ù˙ö˙ô˙˙ŭûŝ˙˙ôüëŝ˙ùôŭĝŝ˙˙˙ñ˙˙ġĝ˙˙ŝ˙òŝŝ˙˙ûü˙˙÷˙˙˙˙ùü˙ĝúù˙˙ŝ˙ĝù˙ü˙ġ˙îŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ú˙˙ŝ˙üï˙ê˙˘Ûŝ÷ŭ˙÷˙˙˙˙ô˙÷ŭŭüüú˙˙âö˙˙î˙˙Í&%Ÿô˙ŭúô˙ú˙˙ú˙ĝ˙üŭĝ˙ŭ˙Ñú˙ŝÍġ˙úĝ÷˙ô˙˙˙˙ïĞÌ˙˙ġ˙ŝ˙˙˙ġ˙ï˙˙¸˙î˙˙˙ú˙û˙˙ú˙û˙˙íô˙÷ÌÛ˙÷Ë˙ñî˙ŝ˙ŭû˙˙˙˙˙˙˙˙˙÷˙˙ġ"­ŝ˙˙˙ö˙˙ó˙úüû˙Ë˙˙ü˙ġú˙˙˙˙Äĝ˙÷ĉÑï˙˙˙ù˙ġÍò˙î˙˙˙ûÌĜç˙ġ˙Îí Ïö˙˙ŝ˙˙ġ˙˙˙Ġ˙Ê˙ö÷˙Ĝû˙ŭ˙öùùûÙ˙˙˙ŝŭ˙˙˙˙˙˙öŝŝù˙Ë˙ÑİĠ˙˙ñ˙óĊ˙š×ù˙£"›˙öùù˙˙à,Ûö˙ó˙˙ŝûú˙˙÷˙˙˙ñ˙Ç˙#œ÷˙˙˙ü÷˙˙û˙Ċŭ³ó˙˙˙úùŝĦ Ç˙˙úĝĝ˙Ĝ˙Éñúó˙ò˙Ŝ˘˙˘ "î˙˙˙÷˙ûò˙˙˙˙ĝ΋˙ù˙˙ú˙˙˙˙˙˙˙˙˙ü˙˙û˙˙! ˙ŜÜĈĊ˙˙ò˙˙˙ĝ˙˙û˙Ĵ ˙ù˙ó˙˙ûÉİĝ˙ύŝÂ˙˙ĝ˙Ë(¨ Ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝûĉ˙ì˙ûÙò˙ó˙˙úû˙˙à˙Ä˙˙˙˙˙˙ġ˙˙˙˙š˙ï˙Û˙˙˙ñ˙÷˙óú˙ĝĝġ˙˙˙˙÷ù˙û˙˙Ġ˙îċÔ÷÷˙˙ûğ'˙É˙òö˙òĝ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ü˙˙ŝŭ˙˙ïĉŝ˙˙˙˙öŭĝúó˙˙˙˙˙Ì˙˙˙ö˙˙˙˙˙˙˙˙û˙˙˙˙˙˙Ò$ 3¨˙˙ï˙ü˙û÷˙ì˙çô˙÷˙˙ġ˙˙˙ö˙˙ú˙Ó˙˙˙˙ġóüùúúùüóġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ŭ²  îú˙˙˙˙Ç˙û˙ŭì˙û˙é˙˙˙Í˙˙ó˙ù˙ôŝ˙ûù÷ô˙˙ŝ˙˙˙˙˙˙˙öŭ˙ŭö˙˙ŝòù˙ù˙˙û˙öüùü˙è˙î˙˙ìû˙˙˙ĝ˙ġü˙ŭŝ˙˙˙ò˙ Ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ï˙ɔޘ™˙˙˙˙˙˙˙› Í˙˙˙ó˙ûíö˙˙ŭ˙˙˙˙ùú˙˙˙˙ò˙ŭñ˙Í"˙ä˙˙ûù˙íŭü˙˙˙ŝ˙ŭ˙–öù ĴĦ˘Ĉ˙÷˙˙˙˙ûú•'!ßĝ˙ûùóĠ›žž˘§ı˙ç˙˙ù™1žï˙óí˙˙˙Ĥ "˙˙ö˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙ôÏ£˙ŝö˙˙ó˘˘—à“¨š–˙Ê˙˙˙ûœšŞöô˙ğœ˘˙ñç˙ÎŞĞûĝ(%óï˙˙ô˙È£ ˙Ĝĥì˙˙ï˙â Ö˙˙˙˙˙ŭ˙˙íù˙˙ò­!$Ëŭù˙Ü#­ &ô˙˙ù” '$Ä˙˙ò˙˙öŭ˙˙˙ĉñ˙’Ĵ&ÀœÁóü˙Áġ×,#§ĝĝ˙˙Ħ-˙˙ĜĤ˙ú˙˙ %•öó˙ĝù˙˙˙˙ 4"Ÿ˙ü˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ù˙˙ä !,¸ú˙ŭĝ˙ŝ˙öġ%Ĉüöö˙!(ŭ”2­ôÓŝµ)"É˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‘İİ–§š¨Îĝۙš°–ħ ˙Ĉ œĦĴ›Óù˙˙£!Üžİ™œšĝ˙ò˙˙˙üí˙ŭ˙˙óûŝù˙˙ÓĞĞ˙îúû˙á÷œ™Ó˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙˙ùŝ˙˙˙ŝôù˙úöŭ˙˙ŭ˙˙˙í˙˙üÉ˙˙˙˙˙˙˙˙˙˙˙˙˙üê˙˙ŭŽ Ħñŭ˙˙ùŝ˙˙ġ˙˙Ĝŝù˙˙ġġù˙ŝòöú˙˙˙ŭġ÷˙˙˙ü˙˙ü˙˙˙÷ġŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙ù('×Ö˙˙ï˙˙úñéù˙˙˙˙˙˙ôû˙ñ˙ŝ˙ö˙˙í˙ġ˙˙ô˙˙˙˙˙ö˙ôó˙÷˙˙à˙˙ÀÌĉžÍù÷˙ï˙ŝ×˙˙÷˙ÖÛÇ˙˙˙˙ò˙ÊËÊâ˙˙ġúġ˙˙˘ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙¤#!"£Çïô˙î!˙ŝ˙˙ù˙ġ˜&™ô˙÷ï˙˙˙Ò –˙˙ġġ %ŭÀ$&ĝúúÖ&*ž˙ñó˙òÊ ) ġ˙˙˙˙#)˙˙ú÷˙#Ì˙÷˙÷.Ê˙ö˙ö˙˙˙˙˙˙˙˙˙ì˙ò˙ħ ú˙ĝ˙# %Í˙ò˙(1 ˘˙ù'˙˙ú •"Ù˙˙˙îä0)!Ğú˙˙ # “öŝ˙˙üŭ˙˙˙ö˙ÎÛ&$#Ĥ˙ŭ÷Ï$! ­˙•2'#À˙ûĝû˙˙öúĝ˙ŭ˙)"%˙ŭŭ˙ÔĞ ' Ŝ˙˙ş ž˙˙‘  !˙Ë˙*%'!š˙ü˙˙ġɝ"&-$#ñüŝ÷˙˙˙˙˙˙˙˙˙˙ù˙÷˙û³"!  )˘˙ê˙˙˙˙%$##!™˙ß    ì˙° ÌÖŞ # ­˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙! !ċù ö%% ˜ġ˙üž#  Ÿĝ˙˙ò˙ # ˙˙˙ü˙Àħ+ #%Û˙˙ûİ!  áé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ö˙˙ŝÔÑÑÊ˙˙˙ú·²›ôäÔ͞ĤÙġ˙˙˙˙˙˙˙˙˙úŝöû˙ÄÜŻ%ĝ˙˙úü˙÷ù˙ġ˙ùñ˙˙ġü˙˙˙ŭ˙˙ŭ˙ġ˙ú˙˙ùŭ˙˙˙íí˙˙˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëŝ˙˘!£•˙˙÷˙˙÷˙˙÷˙ôö˙§žĦ˙˙ċ˙˙˙û˙˙î˙˙˙ĝ˙˙ó˙˙ü˙˙˙š ˜˙˙ïċ™ñڙ£˙ëù˙˙Ÿœĝ˙˙û˙ï  è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û"›!ŞÙŝ˙˘ ¤Žà) ˙˙˙˙ “0 (‰˙ü˙ŭüĠżëùŭĜ˙İ  ˙˙îĥİ +˙ú˙Öŝ¨ .#  , ˙˙ñó–-˜ùû˙Îŝġü˙ ›( $" µú÷û˙ú˙˙˙˙˙˙˙˙˙˙˙÷ &˙ôí˙˙  %Ħ²Ñ÷˙î# ĥ˙ž!½˙éüœ-  İĦĤĤ’" •˙ö˙˙™!›˘,#  ˙î£ 8!à÷˙˙ú˙˙ŭó˙ċ'˙ìš ÷Ó˙˙ 4ž Éĝ £˘™˙ĝ.ä˙˙ôŝ˙ŭû˙÷ûùú×' *ŸœÜġü˙ §ŭ˙˙Ĉ&²ĝ˙÷Ù  ³ûù˙–' £í˙˙˙š —˙ëá Ŭ˙ò˙˙”%ı˙˙Ž,' µŭ÷˙˙÷˙˙˙˙˙˙˙˙˙ŭŝŝ˙ġ£šöñĠô˙ü˙ñŽÛ×  $ġÑ# Î˙Ÿ*Ğġ˙˙Ë ,Ò÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ¤ßŝöÎ"% àŭİ!¤Ò˙á˙—*𣍠žë×˙¤ Żäĝ˙ú§ Ħ˙˙)£éô˙! ˙éû°#×ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭû˙Ž*/é˙ûÚ5 ˘ (% ˘úù˙˙˙˙˙˙˙˙˙ù˙˙ú ˙ŭ˙ĉ˙˙˙˙˙ŝ°¤şÀü˙ü˙óˢüÔġ¤˙ĝ˙˙ĝ˙ê˙˙˙˙ê˙ĝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙û˙˙ 1%˙ĝ˙˙í˙ŝ÷˙˙ùħ"–˙˙û"!˙ÏšŸ˙÷˙ŭÊĤ–. ‘˙˙%! /Âŝ˙Í!˙˙ŭĝÖ!˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ Ĵ˙*Ïŝò˙#Ó˙˙ŸŸ˙ò˙"ž˙ %ùùú˙˙Êšŝ˙˙É šŭÔİñÜûž£˙˙Ç˙˙ *Êü˙ñ   #$Òĝ˙§˙Ï˙–*§˙û˙ú ĜËŭ˙˙Ï ħš™È˙˙ú˙˙˙˙˙˙˙˙˙˙ü˙ö˙ï˙˙ö˙üÓ˙˙ÎÌ˘üûü˙‘#¨˙Í×ï˙ÏĜÌ˙÷˙˙û ÒŭŭÔĠŸÑ˙˙úĜ ˙˙Ĉŭ(  ˙÷Ĥ" Ïñ˙˙ú˙˙ùŭ˙£ ˜˙˙˙°Öĝ˙ù˙ûÓÏû˙¨Ĥݘ˙ġŭ˙˙ù˙ĝ˙ŭ˙˙û˙˙ùŝĠ˙ü˙Ë˙úŭŝŭ˙$•˙ù˙˙#˙ŭ˙˙ÇÊ˙ŝ÷˙˙ ˙ŭ˙û˘!Ĉŭ˙úż&Ç˙˙÷˙ !˙ó˙˙÷˙˙˙˙˙˙˙˙˙ü˙ù˙˙ôĴĤ˙˙ü˙Î˙˙öĝ­žĞ‘$  áóÖ#" ùßÑ  !È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙úûĠ! ˙üû˙ ˙˙ĊĴ ,ÈÌ˙ġ˙˙Ğœ˙ŭö§' °˙ĝ˙˙œ'Î˙˙˙ž'Ôù÷˙Óï˙ŝŜ$û˙˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙û˙˙˙˙Ò")ß˙ûÂ+ $$ȧĦ˙˙˙˙˙˙˙˙˙ŝ˙˙ù˙÷÷˙˙ĝ˙üúÔ %È˙ĝü™ ¤ü˙˙ò˙˙îî˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙̞ +§ġ˙˙ö˙˙˘œÔĦÑ˙ü£$ ˙ó˙›Ş˙˙ŝ˙ÎĦŜ #ËĝÙ %Ş ­÷˙ĦŸÒĦŸ üúû˙˙Ÿ˘˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙ŝŝŝùŬĝ˙˙˙™Ë˙ü˙§!Ÿĝ˙˙÷žŭĝ˙Ó›˙˙˙ŭÍ˙˙˙Ó˙ŭŝ˙ŝŸËò˙Ç˙˙ú˙û˙ó˙˙ŭĤÚû–"  $Ş˙˙ûŻŭ˙ŭġ˙Â#˜˙ŝŝ˙ì!÷˙˙ú˙˙˙œ$ "Í˙ù˙ûŝ˙˙˙˙˙˙˙˙ŭ˙÷˙˙úĞù˙ûĝ˙˙ÑÚŭŝ˙úüĞó˙˙˙£Ô÷˙˙˙ó˙ûíŬÏö˙˙˙óÑ ˙úñÚ˙˜ ˙˙÷ŭÒĦ˙ö˙ö% &Ìĝ˙ĝ˙¤™Ò˙˙ĝ÷˙ŭû˙ĝ˙˙˙Òŭùŭ˙"%Ïü˙˙˙ü˙ŝ˙üú¨Ş“(% ˙ŭ˙˙˙˙˙ö˙ĝ˙˙ü˙˙òñ˙ú˙û˙˘Öó˙˙˙ûŭŞÑü˙ó£˙˙üú£ô˙˙˙ì !ŝŝ˙˙$ŭ˙˙Ô%ñ˙ŭ˙û›£î˙ó˙û˙˙˙˙˙˙˙˙˙ĝ˙öú˙ô˘˙˙˙˙üÈ ÷ü˙˙"&˙˙œ˙óŝŝ˙˙Ë"(   Çŝ˙ô˙˙ë˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ĝöÚ ­Ê˙ŭ˙˙íĤ$¤˙˙ĝ˙ú&ŭÔŭ˙ú•!É˙ŭ˙˙˙û˙Ĥ(˙˙˙ë˙˙ü˙Î ˙ĝù˙˙ŝüó˙÷˙˙˙öû˙˙˙˙÷˙ü˙˙˙˙˙˙ôÔ÷˙Ë& ˙˙ġİ›Î˙˙˙˙˙˙˙˙˙ĝù˙óÓ!ûŭ˙ġ˙ÍĦ§›ÔŸŭ˙û Ÿ ) ˙˙˙Ž! ”˙˙ü˙ü˙ĝ˙ì˙ĝû˙˙ù˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝùĝ˙ŭû˙˙Ê •­Ÿ$$àññ˙ŝ¤ŭ˙˙ô& ù˙˙* ô˙˙˙¨%ŞÎÏĝ˙˙"” ‘ݵÛ˙û˙˘"Ù÷÷àĝùù˙‰İ˙÷˙˙ӏĝ˙ûüġÖúĝ˙˙˙˙˙˙˙˙˙˙˙ŝŝŭüûÔÏ˙˙˙òĝ¤Ġö˙ô˙˙˙èòŝĥ $˙ġĝ˙˙˙÷ù˙ž Żï˙˙ûú˙ŭŝ˙ŝİÎ˙ñ˙Ì˙÷˙ġÇġ˙˙÷ö÷Ĥ"í˙Ż3˘—А˙í˙ñ˙˙˙÷â˙òŭ˙ûŻĴ˙ì˙ù˙˙úŭ÷˙÷Û "Ş˘Ş¤Ÿ˙˙ö˙˙òĝ˙˙˙˙˙˙˙˙˙ŝ˙˙Û˙˙ ˙˙ü˙˙˙Ó§Ó˙ûôù˙™#$Ĝ˙ñ˙ηĝü˙˙ü˙Ŝ˙ü˙˙ûŭ˙Íî˙˙êÒİ#Î˙˙˙á £ì˙˙˙­ ™˙×é˙˙—  È˙üü˙ù÷˙˙ŝ˙˙ìû˙ó˙˙ŭ˙Ï˙ĝíŭħŸûüŝ˙˙˙Ÿ&Ĵ˙˙ŭúü˙ĉ˙˙ûùüû˙˙˙˙ú˙˙ùĝ˙˙ ˙Ŭ÷˙÷˙ &Şû˙ïù˙˙żÍ˙ü˙ ˙ô˙˙ù" Ô˙˙ê˙˙Ċ"˘˙˙ĝ˙˙›˙ġüù# ˙˙÷ÒùŻÛü˙˙íŝŭ˙˙˙˙˙˙˙˙ĝŝ˙ò˙ö´ĝŭôú˙˙İÛ˙ú™%$Ÿš%˜Ħä˙ŭüü"(Ħúßóŭ˙ŝ™ +•§’" Ô˙ù˙˙ûċ˙Úö˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙˙÷Ş 2 ˙ôÔ%ùî˙Ä˙ŭ˙˙ú˙İ Ĵ˙ò˙˙˙˙"Ú˙˙ô˙¨ù˙ùá (Ûĉ˙˙˙ġġ˙ïòĝù˙%áù˙˙ô÷ŝ˙˙˙ô˙ëô˙öì˙˙ñŝ˙÷˙˙˙üüûòçôĦ!(ŭáû˙û Ŭùô˙˙"Şŝ˙˙˙˙˙˙˙˙ù˙˙˙˙˙é! "˙ûî˙˙" "œí˙˙Ê ˙˙ŭ˘ " "#šġÇĤ&Ğ˙ġ˙!.ġ˙˙ö˙˙üù˙˙˙˙ù˙ŭùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙óê˙öü˙ÍÄ˙˙"!˙Ùĝ* Ë˙*%—ŭ˙ö˘+ħŝôúž“ö˙˙óŜ²ŝñí˙°ç˙˙ö÷˙˙ó˙˙îü˙ûĠ,Ì˙ù˙˙˙+ò˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙¨/üĝ˙ì˙˙˙ü˙ë˙úô˙˙˙ŝž"›ü÷˙ö˙˙˙˙ż¤ú˙˙ô˙˙ŭŝ˙ŝÑ Ñ˙˙(˙ĝ˙˙ú*/˙˙ì˙˙˙™ ×˙$~˙úÏ˙˙˙˙÷ĝ˙ü˙˙ó˙˙˙˜'™ŭ˙üú÷ž%˙ĝ˙˙˙ûĝ˙ÍÉû˙ù˙ú˙óŝ˙ùï˙˙ü˙˙˙˙˙˙˙˙˙ò˙˙˙Ħ&˙ġù˙ôŭ˙ċôġ˙ŭ˙÷˙ (ùŝ˙˙Ì!ƒ˙˙úùĝ˙ñ˙˙#ġ˙ŝ˙ïÍ#¤ŭŝ÷˙úŸ!û˙óúô ˘˙ú÷ù¸Ħĝ˙˙ñ˙˙#%&§ü˙˙ŝ˙ŝ˙ü˙ó˙˙˙òܢ˜Ú˙(Óñ˙˙íĈ(˙ù˙ŭŭ˙œÈü˙˙˙˙˙ĝ˙˙ŝŭ˙˙úĝúû˙˙˙ŝ˙˙÷˙˙úï˙Ê žÎ˙˙˙˙ġ˙! ×ùŝî´!×ŝ˙ĝ˙ô Ôĝ˙ŭ˙üÓú˙ò˙˙˙(&Ìì˙˙È Ú˙ĝ˙ú˙)–˙üŭ˙˙ù˙˙˙˙˙˙˙˙˙óĝ˙ĝĝ’î˙˙˙óóóûŝÎÇÑÜÈÖÔ˙˙ì˙ġ˙óü˙˙ú˙И˙˙ú˙˙È˙ó˙ó˙˙˙˙ùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙öĝ+" Î˙”¤˙˙Ġ˙˙ê˙˙ġ˙)Âŝ˙ĝôüŭ"’˙ñŝ˙ù•(É˙ù˙ % Ġ˙ŝì˙ŭ˙ŭ˙˙˙ŝ˙ .á˙÷˙ùù" 3ġì˙ïŝ˙˙ûû˙ûñ˙˙úú˙˙˙ŝüŝ˙ûô˙Ş Şŭġ˙˙ûÀ. Ïô˙˙˙íĤ" œ˙˙˙˙˙˙˙˙˙˙ŝö˙ôû˙ ˙˙ü˙şħŭ˙˙ŭĝ´˙˙˙è ĝ˙ĜÍ˙¨÷ô˙˙Îż˙ü˙ñö÷˙˙ŭ˙˙ó˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝ˙˙ŝĜÙ˙ü÷˙˙˙á˙™ ˙˙ôü"ްúĝÁ‘ĴÀ˙˙ò˙˙  ˙ċ˙ùĴ˙ô˙ö˙&ĴÓÌ÷˙˙üŭġ˙˙Ĝ˙ò˙û˙ûù˙˙˙û˙û˘  ˙ŝ˙û˙"˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙ŭĝû˙˙˙˙ëûñú˙ûÒ £ŭ˙˙î˙“ %î˙ê˙÷÷’$ Ĥ˙˙ú˙×˙ŭŝ˙ŝ˙˙2Öë˙Ç˙˙ŝüó˙ ˙ŝŭôü˙ÖĜġ%ÚüŝÓ˙ĉŝŭ˙óñ˙î˙ÙµË)˙ïĝÜÙİ˙ĝ˙÷ŝ˙˙Ñ˙˙êñ˙ü˙˙˙ò˙˙û˙üù˙˙˙˙˙˙˙˙˙˙ŭì˙èÊŝ˙˙ö˙ɧó˙˙ù˙í˙Á.ÎüöŭÏú˙ûŭ˙÷˙÷û/ ›˙˙÷˙ûÎ˙úú˙˙›Żë˙˙ë˙ĝ˙ûÏ˙ôö÷˙ùâ˙ĝ˙˙ĝŭ˙˙ŝé˙°š˙Ù àö˙˙˙ŭŬô˙ĝ˙˙úŸ/Áŭ˙ö˙˙ŝ˙ĵĝùû˙˙˙û˙ŝ˙ù˙˙ŭûô# Ħô˙˙˙˙Ÿ%Ï˙çûè˙ú˙+È˙˙ħôü˙ĝ˙žġ˙˙ŝ˙ŝûáôû˙û½˙˙˙ĝË-’˙˙ù˙Ġ'˙˙üġü˙˙˙˙˙˙˙˙ĝŭ˙˙Ó˙˘˙˙û˙ŭ˙$Ŝüôħ˙˙öĝ˙î˙Ù˙˙ŭüĝ #˙ùúú˙í²(£ûñÊÉ÷˙˙üñ˙ŝúì˙ŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ñ˙˙˙ş,İú¨  ˙ÑúÛö˙ŝ˙ġ÷Ğ˙÷˙˙˙Ġ İŭû˙ôì›ĝ˙ü˙˙ġŭó˙˙˙î˙ò˙ŭ– ˙˙˙ġĝ˙!ƒ˙˙˙˙ö˙˙üŬ˙˙úŭ˙˙˙üüüŝ˙˙˙˙˙1 Ù˙óĝ˙ž˙˙˙˙˙ -›Ĉ˙˙˙˙˙˙˙˙˙ùù˙ö˙ñĝ˙˙ġ##!ü˙ôû˙˙óûöŝ˙˙­"Ë˙ü˙ĝ÷¨#ï˙ŭ˙˙¤ ö˙˙˙ŝÊŝĊùì˙û÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëó˙˘ ˙ùû˙ò˙ŝ˙)˙ŭĝ¨ü˙ü˙˙˙˙˙˙ú˙˙ô%ôáò¤ô˙ïú˙! ˙ùò˙˙Óêú˙˙÷˙ġ !)Ċü˙ŝ˙úûñŭ˙˙ñ˙˙$#˙óĝ˙˙û*˙ò˙˙˙˙˙˙˙˙˙˙ŭŝŝùïĉ#˙˙é˙ĝ˙˙˙óüŝÑ" ´÷üĝ˙ĝ½˙˙˙˙ù˘£'ĦŠ$Êùôŝ˙À˙ŭŝ˙ŝ˙ġ¤×Òŭò˙î˙˙˙˙˙˙ŝ˙˙ú"ĵ˙˘­˙ô˙ü˙˙˙ë˙˙ó˙ɸ˙óİ4Ħûù˙ŭì›1ù˙˙ŝ˙üÓ á˙˙ù˙üò˙öĝ˙ñ˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙–ô˙˙ô˙˙ÔĠ˙öûû˙˙û°˙˙˙˙Ñ %ò˙˙˙˙˙ù÷˙&˙ó˙ĝ˙Áô˙ú˙§'˙ùñ˙˙¨ ĴŭÙ%Öŝġ˙˙ĝ˙ûç˙˙È2ú˙˙û÷˙úö˙˙Á"!û“ğ˙÷òó˙+˙˙˙ŭ˙ĝŻ %ú˙˙˙ŝŝ˙˙˙˙˙ŝ˙üû˙˙üô˙˙î˙˙¨˙˙ù˙! ˙˙˙˙˙˙ĥ!Ħ˙˙ġ˙—" Ò˙ò˙˙Úúŝó˙ŝ—˙Í˙˙˙*Ñġñ˙Ö$ê˙íú˙Şï˙˙ġü˙˙˙˙˙˙˙˙˙˙ò˙ûìġ %˙úñ˙ŝ ˙˙öÎ Çĝ˙˙˙û˙˙˙ĝô˙˙#Ÿ÷Ĝ˙ŭ˙˙Á#˙˙˙˙÷˙óù˙ê˙˙”2#›˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙û˙˙ù˙+ ÷Ñ *'Ħ˙ë˙˙ï˙˙˙*ż˙ŝû˙ÂÇ$§ò˙ûĝġŸ×˙˙˙œ )ñ˙˙˙òí˙˙ŭ˙éùµ×ĝġù˙˙¨˙öúù˙ž“¨˙˙÷˙öĝ˙ĝ˙ŝüŭŝŭŭŭÜ -È˙˙ŭ˙”%˘˙ġôú˙˜%Ğ˙˙˙˙˙˙˙˙˙ö˙˙ö÷˙ï"%)˙üŝù ”˙ú˙˙ûġŭ˙÷÷˙óÉ˙˙òñ˙ŭ¤ Ê˙öŭŭûË.›Ŭ˙˙˙üĤ,(ġ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙¸°˙˙ùú˙ôö—˙ġ˙œ #Ğè˙˙öĝ˙óë˙˙ĝŭġ™ Ħ˙Ĉ ëûï˙ġĞ&ô˙˙ĝŝ˙˙˙÷˙î˙˙’' Ò˙˙˙˙ġ˙˙ŝÒ#°¸ĝŸ ŝ˙˙ù˙ġ ˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙ùó# $˙˙˙˙ëú˙ġŭ¤¨˙ûü˙˙Žŝ˙öööÍß˙˙÷˙˙˙ŭŝ˙ŝ˙˙(—˙˙ü˙ŭŭĝ'˙˙÷˙öûħ ­˙˙ŻŸ˙÷˙ûû˙ïûùŭ²$ž˙ô˙˘˙˙ï˙Ó#˘ô˙˙˙˙ó"İêĝ˙ùŝÏ˙˙ŝ˙üö˙˙˙˙˙˙˙˙ù˙˙˙˙ &˙˙˙ö˙ġšŸ˙˙˙˙˙ú&Ĥüñû˙ѝ˙ù˙üŭû˙˙î& ú˙˙î˙Ü´í˙ġ˙ӟ¨ï˙˙üñ“"˙ÒĊÄû˙ôùò˙˙Ïáú˙ĝŬ !˙ŭ˙˙ĝ˙ûŝ˙ڑ œËò˙ "¨ŝġ˙˙ûĤûû˙í˙˙Ô Ö˙ö˙ŭ‘ì˙˙ŭ˙úòŭĝ˙ŝ˙ü˙˙½ œü˙ĝ˙ù$ !ô˙ŝû˙è°¤òë˙û.Ñ˙ŝŭÍ !żÙ˙ü˙˙˘î˙÷˙Ê’˙ö˙üÍû˙˙û­˙˙˙˙ó÷˙˙˙˙˙˙˙˙˙ġŭ˙˙˙£˙˙˙˙˙×Úġ˙ó ($™˙ü˙˙ĝ˙É˙ĝ˙˙ûŻô˙÷û˙ö$˙óô˙ŭ˙˙˙˙ë˙ #"•˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙óùĝ‘# ˙˙# ˙˙ü˙˙˙ŭñûßùö˙ö˙§'žĉìù˙˙—!“˙˙˙Ô" ˙˙÷˙˙˙ï˙˙÷˙˙Œ Ñ÷˙˙˙ë ÷˙˙úĈ("ü˙ò˙˙ù˙ŝ˙ŭŭ˙ŝûúŭÈĠù÷öüš˙˙˙üŭ%&’˙˙˙˙˙˙˙˙˙˙˙˙ï˙ŭ˙ ġ˙ò˙!ëéĝ˙ö˙˙úù˙˙˙˙¤˜üô˙˙ü˙˘$Èü˙ò˙ùŬĞïù˙˙ ×÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùôĜ˙˙ôù˙ĝ˙˙ŭµ÷˙÷  ˙üë˙˙ŝ˙˙ĝ÷ò˙˙˙ Î)ŝí˙˙ê˙˙ôú˙ŝîò˙˙˙ï˙Ĥ)˙ë˙ûî˙ñö×ù˙˙Ş"ùö˙˙í˙˙ô˙˙˙˙˙˙˙˙úüŝ˙˙˙˙˙)˙ûí˙˙˙ö˙˙ùœûù˙ù˙§!˙˙ġ%%ĝŝ‹Áû˙û˙Ô˙ŭŝ˙ŝ˙í˙ Ñù˙÷˙ġúŬ Ê÷˙ü˙™˙ŭË!ôŝòû˙˙÷ŝ˙˙­ùüùĜ$öŝû˙Ñ'Şú˙÷˙˙š˙˙˙î˙ĠÉûü˙ó˙˙˙˙˙˙˙˙˙üú˙ġ˙˙ %! ò˙˙˙ŝ˙¤š˙˙ġñ˙Ó û˙ç˙ù  üŝú˙úò˙ŝ ˘ŭ˙ú˙˙½ ˙ŝ˙üŝœ˙ü˙ŝ˘ŝö˙˙÷˙ü˙˙˙ġ˙öĞò˙˙ô˙œ˙ò˙˙˙ü˙˙ç˙$ Ĵŝ˙¤ ĝÑĊ' ˙˙˙˙öğ)˘ú“%!"µë˙ú˙˙˙˙ô˙˙ùû˙ä1Ôġ˙ŝ˙3 ˙ö˙û˙! ˙˙ŝà˙ ,ÏÔ((žîü˙˙˙ö˙÷×,é˙ûÎ&˙÷ûÓ ˙ï˙˙ŝ˙˙˙˙˙˙˙˙˙î˙ŝ÷àôž"Ğéŭ÷úÒ !!™˙î˙#šî˙òŝ˙˙˙˙ü˙ĝ$ü˙ġ˙˙˙Ÿ,˙˙˙˙Œ$¤˙˙ô'##%˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûú˙ù˙˙˙Ñ$Ÿ˙˙– +­ê˙˙ŝ˙üú˙˙'Ñŭ÷˙˙ġ œ˙÷˙ó˙&˙ò˙ ž˙üù˲î˙˙ĝġ"Ç˙ĝĝùĞĤ˙˙ñ˙5ç˙ġŝ˙˙ĝŭûŭ˙˙˙˙˙ŝ£,!Ç˙˙˙˙Ÿ'ìċ˙ôü˙²Ĉ˙˙˙˙˙˙˙˙˙ôö˙˙ú˙!' Ù˙ü˙ÄŞžĝ˙˙ù˙ŝ˙û˙÷ë˙˘Ô˙÷ŝ˙Ïü£ &ĝ˙˙˙ġ˙Ĉ˙ú˙û§#-Ìù˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúŝŝ"×ù˙˙˙˙óû˙&˙˙˙˙!È˙˙˙ġ˙ûô˙˙˙üú˙ !ŭŭ˙ûò˙ĝ›#Á˙˙ôü˙˙ü˙û˙ûÓ ˙˙˙˙˙ù˙Ñ"É˙ĝú!˙ï˙˙ö¤ 'À˙˙˙˙˙˙˙˙˙˙˙˙ŭûûŝ˙˙$ Â˙˙£#Ç˙˙˙›˙˙ü˙ÑÏŝ˙˙ ˜˙ŭÌ"Ĥ˙ó˙Â˙ŭŝ˙ŝüŭ˙‘!Ŝ˙ŝŝġ˙÷ '§ñâ“'˙˙î˙×%ÙŞ›Ëú˙˙ĝŭ ˙˙˘%Úù˙É# %İĝ˙ÉÀ­İœ˙˙î˙˙ŭ˙˙˙˙˙˙˙˙˙ùù˙ï$ħïŭ˙Îŝ$ ˙˙˙ŭ Ìú˙˙ò˙Ó&Ä˙ú˙ŝ˙úü! ˙˙ùŭÓŝ˙ùÏŞ¨ôÛï˙ž÷˙üġ˙ġ˙ò˙ü˙úĠ—#÷˙ĈÎ˙˙˙î˙˙˙ù˙ġŸ% œ¤ ĜŝÓħ 1¤˙úúü˙ž' "”ŻÈ˙˙öü˙ù˙˙üô˙˙ñµ"’Ö˙˙ġ˙’#’¨žŸŸûĝ˙ùú Ğ5 ­˙öÍ# üù Ŭŭû˙œ"Ş" %Ò˙ŭ˙˙˙˙˙˙˙˙˙ñ˙˙ÂĤ˙ĝž)˙ÙÏŞ%£˘ û˙ġÖ­ĝö˙ĝ˙ĝ˙͝˙ġ˙˙$ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ĝŝ˙ñ˙˙£Ìĝ˙ŝ˙˙ĝú˙ŭ˙É‘˙˙ŝú˙ !Ó˙ĝ˙÷˜˙ŝ˙ñ˙¤˝Ùò˙û# %Ğċ˙˙˙’! #šüŭ˙úĴî˙˙ó˙˙˙ü˙˙˙üü˙ÎÓüŭü˙Ì˙˙˙˙˙Ÿ˙˙˙˙˙˙˙˙˙ĝ˙ŝ˙ĝ˙É $ĜûÙûÖ˙ôó˙ïû˙˙ù˙˙ùĦÖô˙˙ñ˙ú˙#ô˙ü˙˙ŝİġ˙ó˙È—ü˙öù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—˙í˙˙ĝÌ˙Ġ˙üúŝœ˙úŭ˙–×ŭù˙÷˙”$˙ŝ˙ŝùö˙ù˘Ùó Ğ˙ô˙ûÌÇú˙è˙ú˙™&&˙üĦĠ÷ŭž(§˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú" Şġ˙˙$!”û˙÷˙ú˙%ġÜ ˜ŝÖŭ(ŽÚ˙ĝ˙ùú˙Ó Ĵúô˙˙ö˙ü™! ĠĴù˙˙˙&!˙ùŝ˙ŝŝ%¨ü×˙˙úĴ ˙˙Ğ!!%ŝŝ˙ŝù˙˙˙˙˙˙˙˙˙˙û˙˙Â˙úù˙÷Ĥ#žœĦ˜³˙ŭ÷˙Ġ* "˙ŝ˙í˙˙ò! $˙˙ñà˘˙úú˙˘§ŝÓ˙&£ŭÊ˙üï˙˙ö¤šĦ˙˙˙˙˙˙˙˙˙ŝ˙ùš%$Óü˙!ÇÏ˙§ #–Ö˙ŭĝ˙˙÷Ì )–˙˙˙˙˙˙˙˙˙û÷˙ö˙È*$%Á˙˙˙˙ˢ!!£Ġ˙ġ˙˙ŭ˙˙”%İÑñ˙ùĊ Ĵ˜Ñúü$‘Ŭû˙˙˙ÎË!°—$%šù˙ŝ˙˙˙˙˙˙˙˙˙ŝü˙˙ğ0  %’Ñ˙” ˙÷˙˞& Ĥû×öħ$#Ñĝ˙÷˙ô˙ŝÇ%’°Ìúŝ˙ü˙üŸ Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ *ù˙ô˙ğÖü˙üû˙úö˙# 'Ħôŭ˙˙ ŝÔñµ- ü˙÷˙û* ™ù˙˙Ó $ ú˙÷¸$˘û˙˙.ŸċÄô˙ü˙˙÷ú˙˙ü˙˙˘Ñ˙˙ĝĠ!Ġ˙öġ˙Ê#Ò˙˙˙˙˙˙˙˙˙÷˙ŭ˙ñ˙!§óÔô˙öĤ˙ŭú˙˙šùü˙û˜ ˙òŝ˙÷˙˙ ˙˙ŝ˙˙ÄÖŝ˙ö˙î§ğ¤²è˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙š˙˙ŭùú˙˙˙˙ŭ˙ĝÓË˙˙š$–ü˙ĝ˙˙ 'Ĥŝŭŭŝ˙˙úÒ!!8!Íúì˙ž'šŝ˙˙˙ü§ '·ô˙% 0˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü‘'!#Ñ˙˙˙.+ŭù˙Ĥ(*Ĥó˙ŭ$š˙ù˘’/ Ê˙üüĤŞ™ž³ö˙˙ù˙˙ŝ˙+˙˙˙˙ŝ˙˙˙ùó´ĤŞ•›˙˙ê˙ó÷˙û˙̨ Üü˙˙ĝ˙˙Ŭ˙•¤÷˙É(œŸ˘û÷˙˙ïĦ­Ÿ˘£˙ŝĝ˙ûÍ­¤%Š˙Ŭ˙˙ĝ˙˙ü˙˙˙˙˙˙˙˙ü˙˙ù뙪œÛû˙˙˙˙êĝ’ëÒÉ˙ġûŝŝ˙˙ŝĝ˙ûûôŝ˙˙˙˙ŝü˙ê˙ÔÜòû˙˙öŝú˙˙˙˙˙˙˙˙ú˙Âòĝ˙ö¨ $‘˙˙˙ì˙ö. "#˜˙˙˙˙˙˙˙˙˙ŭûü˙˙˙˙˙ŝ˙û˙÷˙˙˙˙öô˙˙óëïĝ˙˙üïêñúÍĞ—Ĝôŭ˙˙˙˙˙˙˙˙˙˙ŭ˙î˙˙Úŝ˙˙ü˙ë˙˙ëŭ˙üġÂĤ—§˘ĵä˙ûŭŝûô˙úû˙‘ ¤ĤĈïÒĦĦÑ˙˙˙˙˙ü÷÷˙˙ú˙é˙˙óô˙û˙üġ˙ûŝŝû˙ġñìŝ˙˙˙˙˙üûŭ˙˙˙˙˙˙˙˙ü˙ö˙öÚ˘Żñù˙ġ˙ŝú˙ö˙˘ŭĝ˙ŭ˙ġŸ£Ž-ê˙ó˙Ċ+ "—ġ˙ñ˙ĝù˙˙˙ì˙˙û˙òŝ˙ŭ˙˙ġ˙ôŻ#!òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óĴŞŜ˙ŭ˙é˙ËÙñ˙ŭ˙ö˙ĝ˙äħ%œĥ„İŭ˙ġ˙ûĞ·‘é˙ö˙˘ ­ħü˙˙˙ôö Ż(‚ğĠ˙˙ûĝ˙˜+¨’ä˙ŝġñ¤&3œ˙òúö˘ $‘ò˙˙ĝŝ˙˙˙˙ĝŭ˙öÈ%Ñú˙1ú˙˙ê( ˙˙˙˙˙˙˙˙˙˙˙ú˙˙ޤ˙˙˙˙$# ˙ü˙Çŭ˙î˙( ˙ġ˙˙˙úĠûŝûÊ&÷˙ŭġ˙˙íĝ˙˙ì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúö“%Áİ”äî˙ù÷˙ĈĤ'$"ÁÒ˙üó˙÷˙² 0˘ŭ˙úŝŭû˙˙ïŭ˙˙œ&& #÷ú˙ñ˙˙¤ ²ô§çúŝöĤ£ÒáÈıÛ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝӝ%ĉ˙èöĝûËÉŜÊÑĥ˙óüÖĵÑßÍĝ˙˙ò˙Ì˙ġ˙ú˙ñĠ˙è˙˙öŬñ˙˙ü˙˙îù˙ŭßü˙ùŭ˙˙ûŭ˙˙óüûû˙Ô˙÷û˙ŭò˙˙ĝ˙ûç˙Ĉ˙˙ùö˙˙ù˙ú˙˙ŭ˙˙î˙ë˙˙ŝ˙ñ˙˙˙ñüŝ˙˙˙ĝé˙ö˙î˙ùŭÖŭ˙˙˙ú˙ù˙˙ö˙˙˙˙˙˙˙˙û˙ŝò˙é˙ö˙ŭŭ÷˙ó˙˙³›Ù˙ùé˙äŝ˙ú÷˙˙ùñ˙˙˙ŝ˙÷ûĝ˙íñĝ˙˙ûü˙ġüŭù˙˙˙÷ĝ˙˙ĝ÷˙˙é˙˙˙ç˙ôœ-% ùê˙ë˙úÌÏÓÌï˙ĝ˙˙˙˙˙˙˙˙˙˙˙ôĝ˙˙ñûŝŝ˙˙üô˙˙ô˙öó˙˙ü˙˙ŝùú˙˙ùûùù˙˙˙÷˙˙˙˙˙˙˙˙úŭ˙˙˙˙ŭ˙˙îô˙˙˙˙˙ĝ˙ġ˙ß˙ó˙Òê˙˙˙ŭ˙ù˙˙ŭûúú˙üÌ˙˙˙˙ôÛö˙ûĝŝ˙˙˙˙ö˙úó˙˙˙˙˙˙ġ˙˙ûŝ˙ġ˙˙˙˙˙é˙ñ˙˙ĝô˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ŝ˙˙ú÷˙ù˙ïúŝ˙üéûĝ˙˙˙˙ö÷Ĝ˙˙ÄĊĠ˙ù˙û˙˙òŬäÓÉ˙ġ˙ô˙˙˙ŭñöŭ˙ò˙óÏí˙ô˙˙˙ûù˘  ˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ü˙˙íŭù˙ü˙˙˙ù˙ŭî˙ëġ˙ŭŭ˙˙˙˙ŝ˙ùŭ÷˙ò˙˙úö˙˙˙˙ïöŝú˙ŝé˙žÔ÷ü˙ŝû˙˙˙˙úí÷˙˙ûö!˙˙˙˙¸  ­˙˙ŝ˙˙ûü˙˙÷û˙ñı%£ŭó³"" ù˙ö˙#&š˙˙˙˙˙˙˙˙îŭ˙˙ĝó0.”˙ùŝ˙Ħ ) $÷˙Î ( ˙˙îùŭúŞ! ÎÚÎ ˜˙ñ˙ŝ˙˙ú˙˙ŝ˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙ġ˙ĝŭ"ĥ–ûû˙ë˙˙ú˙öÙ§˙˙ù˙˙ù˙üşÂ˙ŭû˙˙ĝŭ˙˙ŭ˙Ĥµ &  Ñ˙˙úê˙ġÔמšÜŭ÷˙˙˙ïŝ˙ŽÙŝ˙ê˙ò˙˙˙˙û˙ŝôġ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙úì˙ŝÊà˙ëù˙˙ù˙˙˙ï˙˙˙üù˙ġ˙˙˙úÇ˙ö˙ŝ˙˙˙ù˙˙˙úĝŝô˙˙˙Îŝ˙˙ù˙û˙˙˙û˙"˙ŭ˙˙ĝĝ˙˙ŭġ˙ġĠŝ˙ŝĊ˙˙ŭ˙ô˙˙ùùû˙˙ûù˙ġ˙˙˙ûö˙˙î˙ŝ˙îü˙ŝŭ˙ù˙ûúëġ˙ò÷˙ü˙î˙˙˙öû˙ü˙öî˙˙öû˙˙˙˙˙˙˙˙˙˙˙ŝŝŭ˙ä˙˙˙˙ġ˙˙ĝ˙äžÚú˙˙ĝíĝ˙˙˙˙˙˙˙˙˙óù˙ù˙˙˙˙˙÷˙˙ñ˙˙˙˙ìù˙˙˙ùù˙˙˙˙ò˙ġŭ˙Ö¨úû˙èħ Ĝ˙˙ŝ˙ŝ˙ŭû˙ŝŬŭ˙˙˙˙˙˙˙˙ôú˙˙˙˙˙˙˙ŝ˙ç˙û˙û˙ô˙ùö˙ô˙˙˙û˙˙˙ŝóŝ˙˙ùôúŭú˙˙˙˙˙˙˙˙˙ŝü˙ŭùûô˙ú˙˙ŭòŭóú˙ŝŭġ˙˙ŭòäùï˙÷˙û˙˙ò˙üù˙öÓú˙ñ˙äë˙ü˙˙˙ùöú˙û˙˙û˙ĝööüŭŝŝŭ˙ŭ˙˙üß˙˙ŝŭ˙˙˙˙˙˙úô˙˙˙˙˙˙˙˙˙üù˙˙ñġ˙˙ŝù˙˙˙˙ŭ˙˙˙˙öù˙˙˙ò˙˙û˙û˙ŭ˙˙í˙öó÷ŝ˙ê˙˙úñ˙ŭ˙˙˙˙˙˙˙ŝ˙˙ú˙ġŝĝÛœĜ˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙ñ˙˙ú˙˙˙˙ñ˙ġüĝ˙ú˙ĝ˙ú˙ùġ˙ŝóö˙˙÷ĝö˙çġ˙ŭ˙˙˙ïüó˙˙˙ñ˙ûó˙Ċ˙ôíïĝ˙˙ü˙˙ü÷˙˙óóċ˙˙˙û˙˙˙ö˙ú*1ò˙ëù˙˙ŭ˙ü˙˙˙ŭĝëߞ°—÷˙ŭ˙˙ġ˙˙ó˙óŝ˙ü˙˙íûúû˙˙˙˙˙˙˙˙˙˙ûüô˙÷ü˙óüÇÒ˙ù˙˙üט–$˙˙˙ö˙Ŭ (¤Ĉ˙˙˙˙˙˙úŝ¤ ĝ˙˙˙ŭ˙ŭû˙ŝúú˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭóôù˙˙ûö˙ŭú˙˙ŭó˙˙˙î˙˙ö˙üóŭ˙ĠŝŝÏ˙˙ô˙ùü˙ûùü˙˙˙˙ġ˙˙˙˙ŭ˙˙ïñ˙ûġë˙ù˙˙ûĉ˙˙÷˙ñ˙ü˙˙òŭ˙ù÷˙˙ŭ˙˙ŝŭ˙˙˙˙˙ŝî˙ù˙˙˙˙ĝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝ˙˙˙ġ˙ġ˙˙˙ñ÷˙úû˙˙˙ŭô˙÷ù˙˙˙ò˙ô˙ĝ˙ġôú˙üŭ˙˙ù˙˙ŝŭ÷ù˙÷˙ú˙ú˙ó˙üë#£÷˙ü˙˙ûú˙˙˙˙ûô˙è˙˙ĝüòù˙ŝû˙ö˙˙˙˙ù˙ŝ˙ú˙˙˙ŭ˙˙é˙˙˙˙˙˙˙ġ˙˙˙ŭûï˙ü˙ĝê˙ġç˙˙ï˙îŭŭ˙˙˙ŭ˙˙˙ú˙˙˙˙˙˙˙˙˙˙ü˙˙˙è÷˙öŭ˙˙˙˙ò˙Ÿ,Çò˙˙˙˙˙˙ŝĝû˙˙ŭ˙û˙öùúöö˙òú˙˙˙˙˙÷ĝ÷ö˙˙òĝ˙˙˙˙ĝòö˙üĝ˙˙½#“˙ñ˙˙ö˙!•˙Ĉ˙˙ŭ÷˙ŝŭöü˙˙˙˙˙˙˙˙˙ŭöûŭ÷öŭ˙÷òû˙˙ŝô˙ŝ˙üü˙ŭ˙˙˙ŝüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ˙˙˙˙ŝö÷˙ü˙ŭ˙úŝû˙ŭ˙ú˙û˙ŭ˙˙˙óŝ˙˙ó˙˙˙˙Ĝŝ˙ùŝŝ˙ġü˙˙˙˙˙˙˙˙˙˙ûĝ˙ü˙˙˙ü˙˙üĝ˙˙˙˙˙˙ŝĝü˙˙ŭö÷ŭûöŭ˙˙˙˙˙˙˙˙˙üü˙ŝ˙˙˙˙üü˙˙ûù˙ó˙˙ç˙÷˙˙ò˙ġóŝ˙˙ñùûú˙˙˙˙ü˙˙˙ŭ˙úŭû˙˙ú˙óü˙ñû˙˙ġù˙˙Ì$ ü˙ëŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙úúŭ˙ġ˙ó˙˙óù˙ŭ˙˙é˙˙ġ˙˙˙üŝ˙˙ŭ˙˙˙ŭ˙˙˙˙ö˙û˙èŭ˙˙ù˙ü÷˙˙öŭ˙˙ù˙ùú˙˙˙˙ŭîŭŭ˙ï˙ġ˙˙˙î˙˙ü˙˙˙ö˙£ ħ˙ġú˙üñ˙˙÷ŝ˙˙ù˙˙óò˙ġ˙ŝ˙ùŭñî˙üúŝ˙ñ˙ĝî˙˙˙ġ˙˙˙˙˙˙˙˙ŭĝ˙˙˙ó˙ü˙úú˙˙ô˙ùüú˙ö˙˙Ĉ˙˙˙÷ûŭûŝùÖòĝ˙˙˙ô˙ó÷˙ì˙˙ŝŸÊ˙˙˙˙˙ì˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ÷ŝĝíŝ˙˙˙ù˙ġë˙ûĝ˙ŝ˙˙ô˙öí˙ùöú˙˙˙ŝùú˙˙ġġú˙˙˙˙˙˙ûû˙˙˙˙˙ŭ˙˙˙ú˙ŭñ˙˙é˙ò˙Î˙ŭ˙ġ˙˙ĝ˙ú˙Û˙˙ĝ˙ö˙˙÷˙ŝ˙˙˙úŭ÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ÷˙ù˙ŭûġ˙˙ù˙û˙òŝŭŝŭ˙˙ûŝ˙˙ġûú˙˙÷˙˙˙˙ö˙öà˙ŝúġú˙˙˙˙˙ô˙ĝ˙˙˙˙ôµ ™˙ġúü˙˙˙úôö˙í˙˙˙˙òĝġ˙ŭ˙˙˙÷˙ù˙˙óŭôöûġ˙˙ù˙ôúŭ˙ċ˙óû˙û˙ŭġ˙˙ú˙ôñ˙˙ŝú˙÷ŭ˙˙ĝ˙ù˙íúô˙ù˙˙ġû˙˙˙˙˙˙˙˙˙ŝŝŭ˙˙˙˙˙ġ˙ü˙ñ˙˙ß˙˙˙òĝûúĝü˙˙ûù˙ûò˙˙˙˙˙˙˙î˙˙˙ûĝ˙ü˙˙ĝ˙ŝ˙˙ŭùùŭ˙˙˙˙üŭ͞-Ù˙˙òû˙÷ʞ  ˙˙ù˙ŝú˙òû˙˙ù˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙˙˙˙˙ô÷ü˙úŭö˙˙úüòü˙˙˙ûú˙˙ġöŭ˙ŝôĝ˙˙˙˙˙˙˙˙˙ĝ˙˙˙üù˙÷˙ŭ˙ö˙ġ˙˙˙üú˙˙ŭü˙ùŭŝ˙÷˙˙˙ĝ˙˙ġï˙˙˙˙úú˙ĝ˙˙ġûüüü˙˙˙û˙˙˙˙îùŝ˙üñúŝ˙˙ùŝ˙û˙˙÷˙˙÷˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙ö˙˙ŝòùĝ˙˙ĝüû˙˙÷ûŝ˙î˙ü˙ù˙˙˙˙˙˙÷˙ü˙˙óòûĝŝ˙˙˙ġġ˙˙ù˙˙˙ĝûô˙ŭ˙˙˙ŝ˙û÷üü -—˙˙î˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ù÷˙˙ôĝ˙˙ôŭ˙˙˙÷ö˙ŭ÷ù˙ĝô˙˙ü÷ôŭù˙˙ï˙˙ö˙˙ĝûŝ˙ġ˙˙òü˙ĝöĝ˙˙úü˙öġŝ˙˙ö˙û˙ù˙ĝüüöö÷˙ŭĝĝ˙™' '˘˙˙ô˙˙ġ˙˙˙ûŝ˙˙˙˙ŭ˙˙˙˙üú˙˙ü˙˙÷˙ò˙ĝü˙ùŝĝé˙˙˙˙˙˙˙˙˙˙úûùöù˙ú˙û˙˙îú˙˙˙˙ó˙çû˙ôù˙ŭ˙˙÷û˙˙˙ú˙üĝ˙˙˙ü˙˙òûû˙ùöúĝ˙ĝ˙ċ˙˙˙˙˙ĝôŭü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ÷ŭ˙˙ŭú˙˙ù˙˙î˙˙ç˙˙í˙ñ˙˙ġ˙î˙ù˙˙êüŭ˙˙í˙˙˙úúŝ˙ù˙ġüôï˙˙˙ûûġ˙ò˙ŭ˙˙˙˙öü˙ö˙˙˙˙î˙ŝŝô˙ì˙˙ġŝú˙òö˙˙ö˙üú˙˙û˙ô˙˙˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ĝ˙öü˙˙ñ˙˙ŭ˙˙û˙˙˙ö˙ŝ˙ú˙ú˙˙˙öñ˙ûì˙úù˙ü˙˙÷˙˙ŭú˙ñû˙û˙ôŭ˙Äŝ˘àŭü˙úòû˙˙˙˙˙ĝ˙û˙ġ˙˙úŝì÷ĝ˙˙˙ŭöû˙ġ˙˙˙˙ûûñú˙˙˙˙ù˙˙˙˙ü˙˙˙úù˙˙ùĝ˙˙ŭ˙ñ˙ô˙˙˙ú˙üù˙˙˙˙˙úñûû˙˙˙˙˙˙˙˙˙ŝ˙˙ĝü˙˙üĝ˙üüù˙ĝž* Ô˙ñ˙ú˙˙˙˙˙˙ó˙ŝ˙˙÷˙˙ġŭû˙˙˙òü˙˙ŝ˙˙ŭŝĝûú˙˙ŭŭ˙˙úûùġ˙˙ì ˙óë˙ŭ˙˙ĝ˙şÓô˙˙ù˙òú˙˙üí˙˙˙˙˙˙˙˙˙ñ˙˙˙ŭ˙˙ûöö˙ï˙˙˙ĝ˙˙öûü÷˙˙˙˙˙˙˙˙ûô˙ŝôû˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙öóŭ˙˙úû˙˙˙ŝúû˙ŭù˙ûŭû˙˙˙û˙ú˙˙ġö˙ñ˙˙ëúúŝñ˙ò˙ñ˙ĝü˙˙˙ûü˙˙˙ûô˙˙˙ûò˙ŝŝùúŝö˙ùñ˙˙˙ô˙˙û˙˙ŭ˙˙˙ñ˙˙˙˙˙˙˙˙˙ġüû˙˙ú˙ŭĝ˙˙˙˙ĝ˙˙ì˙˙ŝû˙ŭ˙ŭû˙ù˙˙ù˙˙˙˙ŝú˙ó˙˙˙˙˙ŭöŝ÷üûû˙ùú˙óö˙˙˙˙˙ÍŻí˙ò˙ü˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙ùô˙˙ġ˙üù˙˙ġ˙ñ˙ĝö˙˙ĝ˙ö˙˙ĝġ˙˙˙˙í˙ĝ˙˙ĝ˙ûñ˙˙ĝü˙ĝ˙˙÷˙˙˙ġ˙˙ŝ˙˙˙˙ûúûüù˙ŭ˙˙ŭ˙û˙˙˙˙÷˙˙˙%Ûó˙ö˙ŝùü˙ö˙ŭ˙ŭü˙˙óïó˙˙˙˙ñ˙˙öù˙˙˙ñŭ˙ñ˙˙ü˙üŭ˙˙˙˙˙˙˙˙˙˙üö˙˙ô˙˙ö˙÷˙˙Ŝ˙˙ö˙˙˙ú˙üù˙ŝû˙˙˙ô˙ġó˙˙˙íġô˙ú˙ŝ˙˙ô˙˙íü˙˙˙ŝ˙˙˙˙˙˙ùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙÷ü˙üŭöŝ˙˙˙ŝö˙ò˙˙ñ˙˙ì˙ù˙˙˙ïû˙˙ŝ˙ñ˙˙ôù˙ù˙ùŝù˙˙˙˙˙è˙ŭ˙˙˙˙˙ŝ˙ġ˙÷û˙˙˙˙ŭ˙ŭù˙÷÷˙˙ò˙ùĝŝ˙˙˙˙˙˙˙˙˙ñŭ˙üú˙ùó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ĝ˙˙ôü˙˙ó˙˙î˙ó˙ĝ˙ŝ˙˙˙˙ö˙ûĝ˙÷˙ü˙˙ü˙üí˙˙ĝ˙ö˙˙˙˙˙˙ü˙ù˙ĝúÒÙöó˙ŝ˙˙˙üûüûû˙ù˙ú˙˙˙˙ö˙˙˙÷ù˙˙˙˙ú˙ĝ÷˙ù˙˙ŭ˙ö˙ŭ˙ûŝö˙úŭ˙˙öŭ˙˙ù˙ŭŝûŭ˙˙ù˙ŭ˙ù˙˙˙ŭü˙ŭ˙ö˙ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙ŝŝĝ˙˙˙ŭ˙ĝ˙!! ˙˙ŝ˙ŝûüüü˙˙˙÷ŝŝ˙ġŭ˙û˙÷˙ŭû˙ûŝ˙òŝ˙ù˙ŝ˙ùû˙˙ûù˙ü˙˙úû˙Ğò˙˙÷˙ôŝ˙ġùü˙ŭú˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙÷ĝ˙û˙˙˙˙˙˙ŭ˙˙˙ŭüŭ˙˙ĝ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙ú˙˙÷öŭ˙˙òú˙˙ŭ˙ü˙ù˙ŝ˙û˙ûŝ˙ûù˙˙˙è˙˙ö˙˙˙˙˙ò˙ö˙÷˙ŝ˙˙úû˙˙˙û˙üĝ˙úú˙öö˙˙ü˙ô˙˙˙ĝŭ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙úù˙úŭ˙ù˙ŝġ˙ö˙ù˙˙úú˙˙˙üû˙˙˙˙ûüô˙ŭú˙ŝú˙ġ˙ŝŝ˙˙˙ó˙˙˙˙ó˙˙˙˙ĝü˙ú˙˙ü˙˙˙û˙÷˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ù˙˙˙ġ˙˙ú˙˙ï˙˙ĝ˙ë˙˙ĝ÷˙û˙˙ü˙˙ŝġùû˙÷˙˙˙ġ˙˙û˙÷˙ù˙ŭúú˙ûŝù˙ûŭ˙ŭû˙ŝü˙˙˙ŭô˙ú˙ġû˙üĝ˙ŭ˙úù˙– ˙ü˙ŭ˙˙ô˙üù˙˙ú˙˙ûû˙˙ú˙úè˙ŝ˙üû˙÷ŝô˙ŭ˙ü˙üù˙ŭ˙ŝ˙˙˙˙˙˙˙˙úûŭ˙˙í˙ü˙˙ĝŝ˙ú˙ŝû˙ùû˙˙ô˙˙ü˙˙öù˙ĝŝŭ˙˙ï˙˙ŭ˙˙ġü˙ô˙ûŭ˙ö˙ŝ˙ùü˙úû˙˙ŝ˙ŝ˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ûŭ˙˙ú˘Ë˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ö˙ü™!% )˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è² Ô˙œŸ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭîÚ"Ċ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ù˙ù˙˙˙äû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ì˙Ş Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŬÔ Îŝ÷úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ûŭ˙ŝġ˙˙ŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙ïÛÈĈÎ×˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙÷˙ĤĤú˙˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙ŭġ˙˙˙öüü˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙˙ŝ˙˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûŝ˙ŝġ˙ö˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ûú˙˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙ŭŝġü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙ŝ˙˙˙˙˙ùû˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙˙úôö˙˙ó˙ġöû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙üġ˙ŝ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙óĝ˙ĝ˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úòû˙˙˙˙ġ˙˙˙ú˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù˙˙˙˙÷˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ŭü˙öŝ˙ü˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙üûüû˙÷üġŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ó˙˙úŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙üĝ˙˙û˙ô˙˙ù˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙üûüûĝ˙˙˙˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙˙ġ˙˙û˙˙˙˙˙˙˙˙ó˙˙ü˙ù˙˙˙˙ġ˙ñ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙û˙ûùü˙˙˙ùúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙üŝŝúü˙˙ü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ûĝú˙˙ŝû˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ŭŝ˙˙˙üŝ˙˙˙˙˙ŭ˙ŭ˙÷˙ŝü˙ġ˙˙÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙ö˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙úü˙˙ŝ˙ü˙ĝ˙˙òŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙÷ŭŝ˙˙ĝñ˙˙ö˙ú˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ŝ˙ù˙ŭ˙÷ŝŝ˙˙÷˙ó˙˙˙ú˙˙˙ì˙˙ï˙ŭ˙˙˙˙˙˙˙˙˙˙˙üŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ò˙˙óŝú˙ü˙˙ŝù˙˙ú˙úú˙˙˙ü˙˙üĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙˙üŝ˙˙û˙˙ü˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŭ˙˙ŝüŝ˙˙˙˙úö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úòû˙˙˙˙˙˙ö˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝ÷ò˙˙˙˙˙˙˙˙˙˙úĝ˙˙ŝ˙ú˙üô˙üġï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ûùù˙˙˙ü÷˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝüö˙ŭ˙˙ŝö˙˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙úò˙ŝ˙˙˙ŭ˙ô˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ˙˙˙˙ċ˙˙úŝ˙ùùŭüüû˙˙ûûŭ˙˙˙˙˙˙˙ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝĝ˙˙ŝùŭ˙˙ò˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭò˙ôĝ˙ô˙˙ñ˙ŝ÷˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ö˙ú˙ûŝ÷˙ñŝûŝ˙û˙ùû˙óó˙ŝ˙˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙úŭ˙÷˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ġö˙˙˙˙˙ùü˙ŭû˙˙˙öŭ˙÷ŭ˙üô˙üû˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ú˙ó˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù˙˙÷˙ê˙ùŭòô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙öö˙û÷òû˙˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙˙úôö˙˙÷˙ġ˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĝŭ˙˙ö˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙ŭ˙ò˙ĝüûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üú˙ü˙˙÷ï˙˙íġ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úö˙˙ŝŭ˙ó˙ù˙˙˙÷ŝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù˙óç˙˙ö˙ŭûŭ˙˙˙˙˙˙ċŭ˙˙óúĝóüĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ùë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ù˙ú˙ĝíŝ˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙˙úí˙ü˙˙÷ĝô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ó˙ü˙˙˙˙˙˙ġúï˙˙˙é˙˙˙ë˙˙˙ó˙óŭ˙˙˙˙˙˙˙˙˙ĝú˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙û˙˙óò˙üŭ˙˙ŭŝ˙˙ĝû˙ö˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ó˙ŭ÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙˙˙ŭ˙üù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷ĝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ú÷˙˙˙˙˙˙üö˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ûú˙˙˙˙ŭĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙ĝ˙ò˙˙˙˙˙˙˙˙ŝŭ˙ûö˙ŝ˙˙˙ġü˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙÷ô˙ĝ˙˙˙˙ô˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝ˙˙ŝù˙˙˙˙˙˙ûí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ġ˙ġĠ˙ôñ˙ġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙í˙Ê˙˙˙˙˙˙ûöûï˙˙ŭ˙ġŝ˙˙˙˙÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ċšöŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙í˙˙ĝŝ˙˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùú˙úüŝâ˙ô˙ö˙ġ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙üġ˙üĠ˙˙íûñù˙˙˙Ü˙ù˙ĝûï˙ú˙÷˙ô˙˙˙˙˙˙˙˙˙˙ù˙ŝ˙ó˙ùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ŭ˙˙˙˙˙˙˙˙üŭŭ˙ú˙˙üì˙ġĉò˙˙˙öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ŝó˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙˙÷÷˙ü˙ġ˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ù˙üïĝŭúŝ˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙ŭġ˙˙ŭ˙ü˙ûġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ñ˙˙ù˙˙˙˙˙˙˙˙˙û˙˙ĝ˙˙ôĝ˙í˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ïñ˙ü˙› ğ˙úŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ó˙úó˙˙÷÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝüޘ- $ĦÛ˙ö˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġôġĊšÔûŝ˙˙ûŝ˙˙û˙˙˙ôèĤµü˙üŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¤*!ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùüô˙˙˙÷˙Š,£ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙óİŸ).÷˙˙üġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùùġû˙ìÑÎá˙˙ü˙üŭù˙ù˙˙˙˙˙Ħ™™˙˙˙˙ü˙˙˙˙˙˙˙˙˙ûóë˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙û˙ùó˙˙ŭ˙˙ûŝ˙üú˙˙˙˙˙ŝ˙˙û˙öĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙÷˙óü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝûúûî˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ûúûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ŭ˙˙ŭó˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ûŭ˙íŭ˙ĝŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝ˙ùó˙ó˙˙˙˙˙˙˙˙ü˙úŝ˙ù˙˙˙ĵÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ĝ˙#1ó˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ĝŝ瓐˙˙ó˙ŭġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öġĜ(’úĈ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!!ĝ˙ŝŝ˙˙˙î˙û˙ñ(6˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙˙ùĜ)  ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙Θ%Ĥö˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ö’(!˙î˙˙ö˙ŝñ˙ñúÖ Äü˙ŝĝ˙˙˙˙˙˙˙˙êèĤŞË˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙çÈàÉ'Ŝŭ˙ù˙˙û˙ġù˙˙˙éÒ(‹óö˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙’'˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝġŝ˙˙ôßÒŬγ˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óü˙ôŝ˙í˙˙ò˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ù˙˙˙ĉ˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ì˙ú˙˙˙˙˙˙˙˙û˙ú˙÷÷˙š#( í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙Ş ˙˙ûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ŝüܒ–í˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙è˙ô˙÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íŭöà& Ĥ˙˙ûú÷û˙˙ú÷Ĥ& ˙˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĥ& !%›˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùôú˙˙"( œò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙É!* œŭŭñ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòô×& ĝû˙˙ù˙˙˙˙ñ˙ $'#&˙Û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙  #Ïú˙ĝ˙˙ú˙˙˙ùçöŞ´8úöü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĝ+§ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙ġÙş§£(#Á˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝüû˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙îĤĞ•%"À˙úŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ö˙ü™!,Êö˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùÜ Ö˙˙˙˙˙˙˙˙ú˙ò˙ŭ˙ñ#– & Ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙û˙ŝ" ˙ûĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙Î˙¤˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ĝĝÎŞ˙˙÷ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙¨˙ùŝ˙˙ŝú˙˙ö˙™#˙ŭ÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙! ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úô˙˙ñ˙ % Ÿ˙Ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĦŜġ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝ˙˙˙óú˙ûŝûû˙˙É ˙˙ô˙˙˙˙˙˙˙˙˙ &Ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ¨ Ëŭ˙û˙˙ù˙ó˙˙˙ $ ˙˙û˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ!Ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ùŸ+ "%ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉ´—¤Îó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙ŝù™&(Żú˙˙ú˙öŝ˙˙úú˙˙˙˙üû˙˙ûü˙˙ú˙ûû˙!!Ħ˙ô˙˙˙˙˙ŭüŭŝ˙˙ù˙˙úŝ˙üû˙ûû˙˙˙˙öŝò˙ĝ˙˙˙ĝ˙ŝ˙˙û˙˙˙ú˙˙ü˙˙˙˙˙˙˙˙˙˙ûü˙ú˙ó˙˙üùûùŭ˙˙˙˙ô˙ŝ˙üŭ˙˙˙˙÷˙˙û÷ö˙˙˙˙ĝ˙ŭ˙˙˙#Ï˙˙˙˙˙˙˙˙˙˙˙˙˙™Ĵ˙Êİ™×˙ü˙˙ù˙ġ÷˙ö˙ü˙˙ì˙ö˙òù˙ŝûŭ˙˙ö˙˙˙ñ˙ú˙˙˙˙ë˙£ ˙ġ˙˙˙˙˙˙ú˙ġ˙üü˙˙ġ˙˙˙˙˙ġ˙û˙ġŭü˙ŝ˙öŝ˙ŭ˙˙ü˙ŝĈ"ž˙ê˙ö˙ĝ˙÷˙˙÷˙˙ú˙˙ü˙ô˙ŭ˙˙ĝù˙›$ûúŭ˙˙˙ô˙˙ġġ˙üû˙˙ŝĝ˙û˙ŭ˙í˙˙– ûü˙ò˙˙˙üĝ˙ù™Í˙ĝ˙˙û˙ú˙˙˙˙ö˙˙ŝ˙ï˙üü˙ò˙˙ü˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ŭúñ˙˙ï˙ŭĝ˙ú˙˙ù˙ö˙ö˙˙ú˙ù˙˙û˙˙ŝüĝ˙ŭû˙ġ˙ôú˙÷˙˙˙˙˙÷˙˙ŭ˙ŝô˙˙÷ù˙˙ĝ˙˙貚˙ï˙÷˙˙ó˙˙ú˙ü˙˙˙˙ö˙ŝü˙˙˙ŭ˙˙ü˙˙÷ú˙ĝ˙ŝú˙ŝùġ˙ïúü˙˙˙˙ñ˙ŝ˙ï˙ûŝŭ˙ö˙ŭ˙ïú˙ó˜ÒÛŝ˙ĝ˙ùú˙ô˙˙üĝ˙˙úù˙û˙˙üô˙üŭ˙˙˙úù˙˙ë˙÷˙û˙˙ûŭ˙ŝ˙˙˙ġ˙˙ùò˙˙÷˙˙˙ü˙óúŭ˙ËĦÔû˙üŝ˙úú˙˙ûû˘ ˙ì˙˙ü˙û˙ŭô˙˙üßñ˙˙û˙˙ûû˙ŭ˙˙òüû˙ú˙˙ġù!'˙û˙˙ü÷˙˙ûùŝŝ˙˙˙˙ï˙úû˙ŝŭü˙ôŭù˙ġ˙ü˙˙ŭ˙˙˙˙˙˙˙˙ŭ ˙˙ŝ˙˙ë˙û˙÷˙˙úŝ˙ŭ˙˙˙ŝ˙ù˙˙û˙÷ŝ˙ù˙ï˙˙úù˙˙ŭŭ˙üùŭŝ˙˙˙˙ü˙˙˙ù˙ĝ˙˙ü˙Ġ!˙’/ù˙˙˙˙˙˙˙˙ŭ÷˙˙˙ŭ˙˙ŝ˙& Şò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭú˙˙"–úüúù˙ŝù˙˙˙˙˙˙ŭĝ˙˙˙˙˙˙ĝ˙úü˙ù˙ߢ$°˙÷ûüŭ˙˙˙˙˙˙˙÷˙ü˙˙˙˙˙ŭŭ˙˙û÷˙˙ò˙˙ó÷˙ë˙˙˙˙ü˙ôö˙ĝ˙ù˙üŭ˙˙˙˙˙˙˙˙˙˙ùúŭ˙ú˙ô˙˙ŝ˙˙ŭĉ˙˙ŝ˙ġù˙˙üö˙ñ˙ùñú˙˙úöĝ˙÷˙˙üù˙¤ ˙˙˙˙˙˙˙˙ùû˙˙úö¨˙ú÷ô˙ñû˙˙ö˙÷û˙˙˙ĝù˙ú˙ì˙ù˙˙ìî˙üġü˙ï˙˙˙˙˙öĝöĝ˙˙É '›ÏÚöŭ÷öñ˙˙˙ï˙˙ŝòô˙ù÷ĝŝï˙ùóñ˙ó˙ï˙ŭ˙÷˙ñ˙˙ĝ˙˙ŝ˙–•'Ĵŭ˙ò˙ù˙˙˙˙ûùüŭ˙˙úö˙÷ù˙ú˙ŝŭŭ$ó˙˙ó˙ŝ˙íöû˙˙ê˙ŝ˙ä˙˙î˙ŝö˙˙üúû%ĥ˙˙˙ûü˙ü˙üòŝ˙ó˙˙˙úŭú˙î˙ñ˙ŭôü÷˙˙ñ˙˙˙˙ú˙ö˙˙ĝù˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝó˙ú˙ôĝ˙ĉ˙ñ˙ŝí˙ŝ˙˙ô˙˙ô˙ĉ˙˙ġ˙ŭ˙ùñ˙˙î˙î˙˙í˙ú˙˙òüè˙˙ú˙÷ü˙˙˙ñ˙˙˙ŭû˙˙˙ìß"ĝô˙˙ò˙˙ŝŭôĝ˙˙úô˙ì˙˙˙˙ïüâ˙ú˙˙˙è˙˙é˙˙ŝ˙˙˙˙÷ë˙˙˙ïúò˙˙˙˙ŭ˙ùù˙üŝ˙ŝûô˙˙ù˙§3 Ċĝ˙ùù÷ŝ˙ŭ˙úú˙˙˙ó˙û˙˙ò˙˙ü˙ô˙ïġ˙˙ġ˙ġ˙˙˙ö˙˙ġ˙ŭ˙ù˙ä˙˙üù˙˙ü÷˙˙ŝĝ˙ö˙˙˙˙ù·ġ˙˙ü˙ú˙ĝ˙îÔ˙™- ö˙˙ù˙ô˙û˙˙ïò˙òßÄ˙÷˙˙ġüô˙˙ŭ˙ë˙˙˙úó˙ŝù˙˙ŸÏ˙ï˙˙ü˙˙˙˙˙˙˙ŝúŭè˙˙˙üú˙ö˙˙˙ŭĝ˙ò˙ùŭ˙ü˙˙˙˙˙˙˙˙ó˙"'Ñô˙ìúù˙˙ŝ÷˙˙ŭ˙˙˙ö˙ġ˙˙ö˙˙ŝüĝ˙üü˙ĝ˙ùü˙˙÷˙ĝú˙˙˙˙˙úûüŝ˙ûĝŭû˙ü˙ü˙ (äË˙Àİ)Ĥġû˙˙˙ŭûûûû˙˙˙ŭ˙˙˙ù-˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúûŝ˙ŭŭ˙˙ŝ˙’$ #'•˙˙˙˙˙ú˙˙˙ú÷ĝĝöü˙˙÷÷˙˙üú˙÷ô˙ù˙ġ '“Ë˙û˙˙ŝŭŭüúĝ˙ô˙÷˙ú÷˙˙ŝú˙˙ŝ˙˙˙˙ï˙û˙ù˙˙˙ô˙ĝ˙˙˙˙÷˙÷˙˙ü˙˙˙˙˙˙˙˙˙ò˙˙÷˙÷ô˙úû˙ñŝ˙˙˙öŭû˙˙˙˙ŭ˙ó˙û˙ú˙˙ùú˙ù˙˙˙ò˙˙ùÔ#˜˙˙˙˙˙˙˙˙˙úñŭ˙ŬÌĝ˙ö˙˙ŝ˙ú˙ú÷˙˙éĝ˙ú˙˙í÷˙ĝ˙˙˙ŝ˙˙ü˙˙˙˙ġûüġ˙˙˙˙ŝí÷Ù""‰˙û˙ü˙˙˙˙ó˙˙˙ü˙ĝ˙ó˙÷˙ŝ˙˙˙˙˙ù˙û˙ĝ˙˙˙›§ĝú˙öô˙ġÛŝ÷ŭï˙˙ŝ˙ûŭŭú˙˙ü˙ŝ˙˙ö˙˙ò˙ŝŝ˙˙˙È›˙˙ù˙Öû÷˙˙˙˙˙ïŝ˙ùŝ˙üŭ˙˙˙ûü˙Ïëïĝ˙˙ŭüú˙˙˙˙÷ŭô˙é˙˙ċ˙˙˙™˙˙˙ġ˙ñŭùŝ˙üö˙˙÷˙˙ŝ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!ôù˙è˙÷˙˙˙ô˙˙ò˙˙ü˙ġ˙˙ó˙÷öü˙ġ˙˙û˙˙˙ú˙˙ŝ˙ġ˙ñ˙˙ù˙˙˙÷˙˙˙˙ŭ˙ö˙˙˙ûŝŝû˙˙ı &§ù˙˙˙úŭ˙˙˙ŭ˙˙˙ó˙˙˙˙ôî˙˙˙˙ü˙˙ñû˙Ŭïû˙˙÷˙èû˙û˙˙˙ġ˙˙˙î˙˙úó˙ŝŭ˙ŭĝ˙ö˙÷˙óôŭ$Óô˙ú˙ù˙˙ġŭ˙˙ú˙ñġ˙˙ôŭ˙ùüĝü˙ùû˙˙ŝ˙˙ûŭô˙˙ŝ˙˙ŭû˙ü˙˙˙ùôĝú˙˙˙ûüú˙ĝ˙âġ˙û ·˙˙üŭ˙ô˙˙ë˙˙êÓ0ô˙ú˙˙ú˙óŭ˙ŭ˙˙üù˙˙ĝ˙ô˙˙˙ŝ˙ĝû˙˙˙˙ëûŭ˙úŭ˙ĝôÁ É˙˙˙ñû˙ï˙˙˙˙˙ŝ"˙˙˙˙öŝ˙˙˙˙ñġŝ˙ŭ˙ĝ˙üŭ˙ŝ˙˙˙˙˙˙˙˙˙ß(#˙˙ú˙˙ôĝî˙˙îü˙ŝ˙˙˙˙˙ŝ˙˙ŭġ˙˙˙˙˙öû˙˙ó˙˙˙ñ˙ŭú˙ö˙ô˙ùû˙˙˙˙˙˙˙˙˙ŝ˙˙£ ·á˙ĝ˙ûèŝ˙˙˙˙˙ŝŭŝ˙˙ùŭŝûû˙˙˙˘"™˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŭŝŭüŝ˙ôù˙ÔĦ" ¨ùŭû˙û˙˙˙ŝŭŝ˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŭ˙ö˙ôù˙+˙ü˙ġ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝö˙ûüŭŭ˙ŭì˙˙ċ˙ŝĝúü˙ú˙üü˙˙ŭúŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝú˙ûú˙üó˙˙ùöġ˙˙÷˙ĝïü˙˙÷ĝ˙ġùû÷˙˙˙ġóüùú˙˙ŭġá˙˙˙˙˙˙˙˙˙ú˙óïôİŻúŝ˙˙÷ïû˙˙ë˙˙üġ˙˙ù˙˙è˙ŝú˙ùò˙îû˙úüŭġü˙˙˙˙÷˙ó˙˙ŝ˙È˙ò˙˙ĝìô˙úûŝù˙ö˙˙˙é˙ûúûöûû˙ĝ˙ġùŝ÷ĈÇ!Ġ˙ġ˙˙˙˙ûù˙˙ŭ˙èú˙úĝ˙ŝ˙˙üûŝġ˙˙ù˙˙ù˙˙üú˙˙ĉ"–˙˙ö˙ù˙˙öĉ˙ùì˙ġ˙Îġ÷û˙ġ˙˙ŭŝü˙òû˙˙˙úù˙˙ġ˙ŭŝúú˙ú˙˙ì˙˙˙ô ˘ö˙˙ñ˙˙ôô˙˙ú˙ìôûŭ˙˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˘˙˙˙˙ĝŝú˙ŭ˙üö˙˙é˙˙ŝ˙ì÷˙ù˙˙˙û˙ġñ˙˙ŝùû˙ú˙üîû˙˙ŭ˙˙ż˙öûüöû˙ö˙˙ò˙ŝ˙˙ŝôĝ˙Ò,›˙˙ĝĝŝ˙ŭùüö˙ûì˙ù˙ó÷˙˙ûÉôù˙ïû˙ó˙û˙˙ëŝ˙û˙˙ŝ˙ĝûü˙òÔ˙˙ô˙˙ù˙ôú˙˙ĝö˙˙˙ô˙˙ħ˜˙˙üó˙˙÷ö˙ó˙ĝö˙˙˙˙˙ú˙˙ò˙˙ŝ˙û˙öï˙˙ò˙˙˙ñ˙ï˙˙ö˙˙úĝ˙ċ˙˙˙˙ùû˙ûú˙˙˙˙é˙˙ö˙£ûŝü˙ŭ˙˙ò˙˙˙¨ Ë˙˙ùë˙ŝ˙˙ñúó˙öñġ˙˙˙˙ñ˙û˙ì˙˙ŝŭ˙˙˙Êŭ˙à° Óüġ˙úü˙˙ŭŭŭ˙ŝ˙ #÷˙ú˙˙òú˙ŝ˙˙ë˙ŭ˙˙ûùŝĝ˙˙˙˙˙˙˙˙ùà +îù˙˙ß˙˙˙ġ˙˙˙ôò÷˙˙òġó˙û˙˙ŭŭî˙ù˙ûŝ˙ò˙ŝô˙˙˙ŝ÷˙ĝ˙˙ú˙öó˙˙˙˙û˙ûŭ˙ËĦ˙˙˙ù˙˙ûúûŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ÷ÂĤµÊî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙ü˙üÉ%ĝ˙˙ü˙˙˙üŭ˙˙˙ŭĝöùü˙˙˙˙üù˙ċ˙˙˙˙ú˙ "˙˙ï˙˙˙˙ŝŭüúĝû˙ï˙ûü˙ŭ˙˙˙ŭùĝŭú˙ü˙˙ĝöŝ˙ù˙˙˙˙ù˙ġû˙ö˙üú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ûï˙ù˙˙úö˙˙˙û˙üî˙ìù˙˙˙˙ŭġ÷˙˙˙ü˙ñ˙˙˙$Ä˙˙˙˙˙˙˙˙ùġĝ˙˙ŭ&–÷˙˙˙ú˙˙ò˙ŝ˙ġ˙˙÷˙òüûú˙ï˙ñ˙ê˙˙ġó˙ŭ˙˙˙˙ò˙ûü˙ìüŝĝÜ °è˙ĝŭü˙˙ŭ˙˙ĝí˙˙ġú˙˙ŝ˙˙˙˙˙ŭŜ˙ö˙˙˙˙Ô %#ŒùÉ˙òë˙ĝ˙ó˙˙˙˙˙˙÷˙–šÙó˙ŝ˙˙óŭŝú˙úùü˙×°ċʜŸµŝ˙˙ö˙˙ïߍÙúû˙˙ĝŝ˙ú˙ü !˙ĝ˙˙˙öü˙˙ö˙˙ü÷˙ĝ˙ĝôú˙˙˙˙î˙ûû˙ġɕà˙˙˙î˙˙ôü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙&ŝù˙ôò˙ù˙˙÷˙˙ë˙˙˙ġŝ˙˙˙ĝ˙ĝûĝĝ˙˙˙˙ë˙˙ó˙ĝ˙˙ŝŭ˙À˙¨Ĥ˙û˙÷ŭ˙ġ˙üúŝ˙˙˙˙˙˙Ĝ"ŝŭ˙˙ŭ˙˙˙˙öü˙˙˙ûġ˙˙÷ï˙˙˙˙ŝ˙ŝô˙Ĉ‡—µ˘˙÷ö˙˙˙֘ĤÎöİΙ¨›˘ñ˙˙˙ŝ˙˙ŭĝú˙ġ˙ !˙öò˙ŝ˙˙˙˙˙ï˙Ż£ñ˙ò˙ŝ˙˙îû˙î˙÷˙˙ö˙òŝö˙˙˙˙ú£˘żó˙›µ’¤Ä˙˙ñ˙˙úĝŭó˙˙ûó˙Ĵúûŭ˙úĝ˙˙˙ô˙ù$×ĝ˙˙öÖ˙û˙˙ŝ˙˙˙û˙˙˙íŝ˙úú˙ü˙˙ù˙˙úö˙ûü˙ó˙ġ˙ñÉ! È˙ŝŭ˙ôĝ˙˙üŭŝ˙$˜˙˙ó˙˙˙ô˙˙ï˙˙˙˙û÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙÷˙×˙ö˙ŭüôú˙˙˙ñ˙˙˙˙ŭñ˙˙ê˙˙˙ê˙˙÷˙ùĉó˙˙ö˙˙ŝ˙˙ûù˙ñ÷Ŭáŝŝŝ÷÷˙ŭüĝµĉ˙ö˙˙˙÷˙˙˙˙˙˙˙ŝüüüŝ÷óù˙˙˙ú˙˙ÈÈö˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôû˙ŝüŝ˙˙üù˙È˙˜˙˙˙˙ŭŝö˙ŝüŭŭûü˙˙˙˙ùù˙˙˙˙˙ü÷ŭ˙ŝ˙ß&£˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ŭĝŝ÷ŝó˙˙˙˙ú˙úŝ÷û˙˙ûû˙û˙öû˙˙˙ú˙˙˙˙ü˙ŝ˙˙˙˙˙˙˙˙˙üöŝ˙÷ÇâÌÛ˙ĝñ˙ê˙ö˙ċŬ˙˙ÉĠÎàÊñŝ˙˙˙ùŭ˙˙˙í˙ó˙ô Ê˙˙˙˙˙˙˙˙ü˙˙÷ °˙öéó˙˙ô˙˙ĠÒËÜÇ˙ŭ˙ü˙ï˙ÎÌ˙ÓÇÖ˙˙ġ˙ç˙˙Ħ˙˙Ìĵä˙˙Ä’˙ĝב˙è˙ùü˙˙˙ö˙˙şú˙÷)Ĥù˙˙ù˙#)§ġùÜ˙û˙˙ö˙˙ñïú˙˙ü›,)˙˙ġ˙üù˙üú˙˙˙ó²ĤĠ­(ĴÌûè˙ŝ˙˙˙ÀÎî˙÷ŭ˙ó˙ *ŸÉŞÍĊÍÔû˙úòüúÄÚĠÈĝ˙˙üÒóĈĝ˙˙ù˙˙¤ŽÒ½˙˙ü˙ŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë50' /Î˙ô˙û˙Ëż˙˙à##İú˙Ĥ/ġŝñ˙˙ž% #Çú˙˙˙ŭöŝ˙˙ûŭ˙˙ü÷!" œ˙êŭ˙ĝ˙ë´ä¤ĝŭ˙á˙˙œ(( §˙÷÷¤%" áé˙˙÷÷˙÷˙˙˙×#"*İ˙òö÷˙˙ğ³'œÎ˙˙ġùù˙£Óá˙˙²""Ĉ˙úïŝ ú (&½˙˙˙˙ö˙ö˙ĤԜŜ˙˙ü˙ŭ˙é˙˙˙˙ö¨$ ™È%ĞĊ˙˙óü÷˙ġù˙ÎÌù˙˙˙ï˙˙ñ•'žßĜ˙˘­üûï˙ħ˘ċÓÖÎ˙˙˙˙˙˙˙£˙ú˙ûÌÌÑ˙Ô×ûÏÍßĜ×Êò˙ŝ÷˙˙˙˙˙˙˙˙˙êŸ*$ ˙Ô˙˙ü˙÷û˙˙ŝ˙ùûóŝ˙êÇÂ˙˙ó˙˙˙˙ë˙ĉö˙ó˙û˙˙˙˙˙ŭüúüû˙˙˙ìë˙ó˙ŭû˙û˙˙ !İ˙ġ˙÷ôú˙ñ˙ô˙˙üûŝ˙˙˙ûŝ˙˙˙ŭ˙˙˙ü˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙çòûüü˙˙˙˙ûû˙ĝŠ7Ô˙ó˙˙˙ùŭúû˙˙˙˙˙˙ö÷˙˙÷ö˙ñ˙úú˙ŝ˙˙˜ )ë˙ò˙öû˙˙ûúŝ˙ı˙÷˙˙ŭ˙ùÜÔ¸ŝü˙˙˙à‘™˙˙˙ùú÷Ŝŝ´Ż ¨öç˙˙ŭ˙˙˙˙˙˙˙˙˙í˙˙˙˙Ë' "˙í˙˙˙÷˙˙×í! ˙Ñ˙ĝ˙˙ĝ˙ê˙˙˙ĠöÚÙ˙˙˙˙˙˙˙˙ú˙˙’  Ïŝ˙˙˙ùÖü´' &Òúñ˙úì˙û$ "  ġ˙î˙ħ¨#İŻò˙˙£˙”˜&š"Żë˙˙˙ú˙É İûÎü×! ˙˙ŝ˙İ ! £ŸÉ˙êܞĴÔô˙˙˙ŝ™%ž˙ĝ˙˙ŭ˙˙û˙˙˙úŸ Ĥ— /˙˙÷, &*!˙öĝ˙öü-£Ħ 4 ›÷û˙ŝ­ &üë˙ŭ$ "Üüñ˙şŻ#1ä˙ûù˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ħ“$ ˙Â˙ïÛ! Ĥ ,Ìŝ˙* ) "È˙ ˙ù˙Òµ Ğ˙üìĝ˙˙˙˙˙ûû˙ŝùÒ: &°ùé˙˙˙²!žž Şí˙˙ñ˜' µĝ”& ß˙£! ˜˘Ÿ!–Üĝ˙ŝ˙˙ùŭĝ˙˙'# "˙Ú÷˙Ï/´Ÿ+”Ç˙÷˙,˙˙Ğ# $ü˙˙˙ ›''ó˙öü÷˙ ) ˙˙˙ŭ˙ŝ˙˙˙ñ˙˙ + œġ˙˙˙ü §%˜˙ġ˙úÎ/ —' -œ˙Ġ˙Š&%%£òŭ˙˙ŝ˙•˙Û˙İŸ !ô" %£ġ˙˙˙˙˙˙˙˙˙˙˙ü (Î÷֑šáïŭùŭ˙˙÷˙ŭٜ ŸÎŭ˙˙ôü÷˙£˙ö˙§­Ż˙˙ŭŝŝ˙˙˙˙ż³˘ŭ˙˙ùûò˙¨% ¤˙˙ü˙˙˙éŭ˙˙˙ŝûŝ˙˙ŭö˙˙˙ŝûĝü˙÷˙÷˙˙ó˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙˙˙üú˙úö˙Ż ™Ö ĤžÈ¤ü˙˙˙óÍŞ˜ÍĴ˙˙ĴͰ‰ß˙ûô˙ùÔ$˙ô˙ŭ˙˙ößÁŞŸž"Ġ½˙˙ñ˙˙ҕ0Îô˙˙͢%$·˙˙ûŭ˙Â*­˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙ž /ï˙÷˙$£ #˙˙˙ò˙˙îž* ŝ˙˙˙˙˙˙˙˙˙üĝ˙ ò˙÷ĝŝ˙˘"ü# £˙úù˙Ï˙˙˙›!#˙ĝל˙ɟ%§˙ùŝ˙˙¤˙˙ûŬ ˙ùÌ˙™!İúú˙žú˙ú÷˙ ŻüԔ' ù˙ú˙ŭ˙üŝ˙ĝü˙ž(ô˙ġ˙Ħö˙ü˙Ӟ˙˙ö˙˙˜¤ñ˙˙Ĥ!Ó˙ŭÍ˙˙˙ŝšĴ É˙˙Ò# ˙ĝµñ˙˙ôü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û ˙ú˙ŝ ü˙˙ŭ§üÑİ% £˙÷Ó§œÔö¨û˙˙˙ġ˙˙ŭ˙üŭ˙ŭ˙˙˙˙˙˙×( ¤+Ÿ˙ùġŞ ˙ù˙Î% œ˙î˙Ö$ÈÌŞÜÈ£ %œ˙˙úĞ ù˙û˙ûĝ˙ŝ˙ôü˙ÑÉ˙˙ŝѧ Ò˙ËüÑ!›˙˙û ŭ˙ÄŻ% ŝ˙úê˙˘ŭ˙Ҝŭ˙ü˙ÓĦ'ùĈĜÑ ˙ùû˙˙ûü˙˙˙˙ġ˙Ï Ĥö˙˘%3˙ŭ˙΢ù˙˙˙˙ "Ä˙ùÌ&˙ĝ˙İ !%Üñ˙˙ü˙˘˙í˙ö“è·!#˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙Ö˙ûŝû˙˙” ˙˙è˙˙˙"§&ü˙˙˙ü˙ûûŸĤÊĝ˙÷˙²“$Ğ ¨•šĦŞÖ÷˙˙˙˙˙˙ġßÍÊĤ“²ê˙˙ô˙ŝ˙ŭŝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ͤ Ĥ#Ôü˙˙ö˙ġĦа Í˙˙˙ö ˘÷˙Çü˙ĝ˙˙˙ ŝ˙ûŝú˙ŸŸŸ£#üù˙˙˙•!&œ˙ó·&œ˙ŝ˙˙˙ %¤Î˙˙ŝ˙˙˙˙˙˙˙˙˙û &Ĉŝ˙ž˙û˙˙Ġ› 3 Ÿ˙üÉĦ˙ú˙üÖÄ˙Ġ'˙˙ŝŭŭŭŝŝ˙˙ŝĝ˙"£˙ú˙ö˙•!œ˙ò˙"ûü˙ "˙ò˙ç˙ú˙Ĝ žÖŞ’Ĝ˙ŝ˙§˙óġ˙ŭ˙üú˙˙×Ĥ˙ò˙ú˘˙˙˙˙˙¤Ö˙˙û˙ĝÒ˙˙ŝ˙˙ĝŝŭ˜˜˙˙ü˙ú˙ú˙˙ù˙÷˙˘ŭŭ˙ŝĦó˙˙Ĉŝ˙ŭ˙œ$˙˙ù˙ŝúÒġü˙˙ûŸüú˙˙˘!Ë˙˙ŝ÷ù˙ú˙ŝÍ+™˙û÷Ĥœ˙˙˙ŭü˙ŭ˙˙ü˙ùú˙˙˙˙˙˙˙˙˙ŭù%Ÿ˙Ò˙ġŻ ó˙ġ˙Ġŝ˙˙œ#š×ù˙ú ˙ó˙˙ü˙¨# ˙˙óŭ˙˙˙˙˙˙˙˙˙Ê˙ŭΝû˙û (üş šù˙Ŝ.!"# ¨Ñ˙ÉÊŝÖ˙$™˙í˙ŭ˙û˙˙˙˙˙÷›˙ûü˙š$ ÔüöĜû£'Ġü˙Î$Éŝ˙ò³#˙ŝ˙˙Ê" ĊĠÚĝ£ô˙˙Ÿ Í˙˙öó5  ˙Ïù˙˙ùŭ˙˙˙ü˙˙ù 'Ï˙˙˙˙ *Üĝù˙ŝÊ"%ġö˙üû˘÷˙ó˙ %˙ġ˙˙˘Ê˙!§Ì˙ú˙˙ ˙ù˙˙˙ÒÜú˙žž²Ì˙˙ü˙˙˙˙˙˙˙˙˙óŜ­§›§úÓôŜÌÙ֛"Ÿ˙î˙ڝ"” #"Î˙û˙öԜϚ"$µĵ˙úĤ"¤Ĥ'ú˙˙ï˙˙˙Ÿ%—˙˙óŝ”(˙˙˙ŭ˙ö˙˙ú˙úü˙ù˙˙˙÷úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ'# #!×˙è˙˙˙ŭ¤ßġ˘Ä˙ĝ˙˙Ħ"˙˙˙˙¤żè˙˙ú˙˙ -òûú˙˙‹' 4Ú˙ë - ŭ˙ùŭĞ Ĥö˙èÛ "Ĝ˙Ä˙''ĥ˙˙––˙ĉ˙˙˙˙˙˙˙˙˙˙ŭÍû˙˙˙ Ô˙òôÇ˙Ĥ*Ïò˙ÒĤİÔú˙ŝ˜#!˜˙÷¨3˙˙˙˙˙˙˙˙ô˙˙ûö;œó˙úú˙%ß˙˙ö˙ œ˙÷˘Ë˙˙íó ˙ûùüû˙úú˙úĝĝ¤˙˙˙Ú˙£Ô˙öġò£*‹ŝ˙üùЍ˙ġôùûĤ$ŭúö˙ûô˙˙$ôûŝ˙, ˙ñû˙ôŸÓ˙ġû˙÷ŭ˙ûĝú˙˙ŝ# §˙˙˙˙ż- ˙˙ô˙ġ˙˙ŭ˙úÜ%È˙˙˙˙û#Ħ˙ñŭ˙Ë ŝ˙êÛ˙˙û˙ĜžÜŝ×˙ïŭ° !Â˙˙ûÎ˙úüû˙˙ùû˙˙ù÷ö˙ù˙˙˙˙˙˙˙˙˙˙ èċ˙ú˙ó#ĝ˙ó˙÷˙ùËŭ" úù˙˙'$˙£"œġô˙ö"'  Ŝüì˙˙ù˙˙˙˙˙˙˙˙Ò)÷ü˙Ԟ"§òĜ$"Ġúè)(  ›˙Ç˙'˙ŭ÷ҚŸñċù˙˙üŭ˙ŭ÷˙˙š ­ë˙˙ùÍ((žĊ˙˙˙˙Ĉž˙ŭŭ!Ĝ˙úÓ§ßï˙ú˙á$—˙úò˙Ö $˙ú•%"˙ê˙˙˙Ż!˙ô˙û˙ŭ˙ŭùŝü÷˙˙* ’ŜúûÓóœ'‹˙ŭ˙˙˙Á˙˙÷ÏĴ$û÷˙Ê˙Ñ*à˙ï˙˙ä!#Îó˙˙ë™ùü˙˙÷˙ùú÷ŭù#öġ˙˘ó˙÷˙˙˙˙˙˙˙˙˙˙˙ü˙˜-ŭĝÖ˙â˘ŝ˙˙ + ˙Ğ˙˙ġì˙-˙˙˙ ˘ŝ˙ŝ˙+Òè˙˙˜èó˙˙  ˙ó˙öż1úġ˙˙˙Í Ĝ˙”ô³ û˙ŝ˙˙˙ŝ÷˙ñ˙˙ûùüû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§! !œÂ!È˙úôŭ˙"(’ú˙Ŭòß ħ˙˙˙íÌ —˙ö˙èÓĊ˙˙˙ŭŝĠĤ˙˙ÁÏë˙˙˙Ô %ŝú˙ö &µ˙˙÷û(!›ŭ˙˙Ħ Ĵŭñ˙İ˙˙˙˙˙˙˙˙˙˙˙˙÷˙üäÒ˙ŝ˙ô˙!÷˙˙˙û˙ùċÍż˙ûúü¤ö˙ü˙˙ Ğ˙˙ċ÷ŭ+°úûŭŝ˙˙ŝŭ˙˙˙˙˙ ˙˙˙˙ óùŝ˙ŝòÙŭ˙˙%˙Èû˙˙Ñ Üô˙˙&˙üŭ˙˙˙˙‘ġ˙˙˙˙&% ˙î˙ġİ#Î˙˙ġ˙#­ñ˙˙ùŭ° ˙˙˙ú˙˙ë˙“ŝ˙û#Ûó˙˙üù˙˙˙÷˙˙úġ˙˙˙ò˙òñ#Ğ˙ûöòž 'ŝâ˙˙˙ïö˙˙Ê2ò˙ù˙é˙ ˘˙ù˙ĝ &È÷˙Ú(í˙ŭĝù î÷˙ĝ˙˙  ÓÎÄ˙˙ñ˙˙ë˙˙˙ŭ˙ŭ˙˙÷˙˙˙˙˙˙˙˙˙éĊ˙˙˙ùħ ˜˙ŭ˙ò˙˙˙˙— ˙˙ùúÄ)û˙ Ò˙˙ï᪴¸˙˙˙üŭ˙˙˙˙˙˙˙˙˙È(”˙˙úŝŝ £˙& ! "ĜË˙ ĜÄŜÚÍÏ˙˙ô˙òë! %“ï˙˙ùĠŝö˙û˙ŭöü˙˙ôò£!ħ˙á˙˙’Óŭûôŝ˙2Ğ÷˙ô $˙ĝü˙˜˜ú˙˙ëÑ0Ĥ˙˙˙ñĴñ˙œ˙áù˙˙Ħ!%ö˙˙ö˙ŝüüŝ˙˙ó˙˘İ˙ĝ˙ġ˙ž"(÷ù˙ġ˙â+ŝġ˙ġŸ À˙˙˙éŭ×˙ô˙ûŝ˙˘'˙÷ŭ˙š"˙˙˙˙Ħġ˙ŝ˙˙˙!Ù˙É˙˙˙ŝ˙öü˙˙˙˙˙˙˙˙ĠûĦ•˙û˙ïòĠ×˙ " "$Şùì˙ù˙( ŝ˙ö˙ħ$Ñ÷˙ŝÄ#* &Íô˙í˙%£ŝ×ŝï´ ˙˙ñó˙1úï˙Ż#˙˙ü˙˙ĝŝë˙˙û˙˙˙˙úü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü&+ +˙˙˙ÈÄ˙ñ˙ŝ°˙÷˙Öüùú˙Ġ›˙˙ô˙ü‡˙ŝô˙˙Ó*˙ö˙•#žñ˙˙ĝöò³˙˙˙ŝš"Ç˙˙˙ ,Ì˙ä!'˜˙ûó˙ġû˙è˙˙˙˙˙˙˙˙˙úùü˙ö˙ó˙ú!Óû˙˙ċÍİŝ˙úû˙˙$Œ˙˙Éŭš-Ôûù˙ùŝ"ċñó÷ûŭŝŭŭ˙ŝùû˙è!–ïÊġ˙%%İ˙ĝ˙˙î˙üú˙Íš˙˙˙ŭíİ•˙û÷Ĥ ˘˙úĝûó˙˙Í !˙˙ó˙Ô¤ ˙˙ö˙Ċ˙˙û˙˙#˙˙ġ˙” Î˙ó˙˙ŭ˙˙&˙˙îÇÄ˙ĝüöŭ˙ŝû˙˙˙˙úŝöĝ˙ô˙¨ ¤ô˙úêŸ!˙˙˙˙ï˙Ö$  Û˙ûù˙˙ üĝĝ˙ŝ˙§Ĥ˙ôË ¤ĝô˙˙ù˙˙˙ĝà   Ê˙ú˙˙ë˙÷˙üéŭŝû˙ú˙˙˙˙˙˙˙˙ĝ˙Í˙óü˙– &Ñ˙û˙˙˙ë™+Ŭîü˙˙ħ ì¤ŝ˙ïŭÊÍŝ˙˙˙÷ì˙ì˙˙ú˙÷˙˙˙˙˙˙˙˙ÑÙ˙˙úŭöÜ/ #‡˜˙˙ö÷ĝ˙ŝñ˙˙›) ÑûÄ˙ú˙˙˙ó˙î˙˙ %Ğ˙ŝ˙ûÚ !˜˙û˙˙ġ˙˙÷ú˙˙˙ ĝ˙˙˙ĝ-Œ˙ŝ˙˙Ò❓ú˙üú˙˙ñÙ#˙˙ï˙˙È"ùġ˙˙˜$Ó˙ü(! ùĝ˙ŝüÔíŭ˙û˙ŭĝ˙˙û˙ŭê)/‘˙ûĝ˙˙“˙˙˙˙ĊÌŞ#Ş˙˙ĝ˙• Ñ˙òŝ˙í‘ Òù˙˙ŭù˙7–ú˙ġ˙ñğ  ü˙ĝġ˙‘˙˙ê˙ŭġË+#œ˙§ ˙÷úŭ˙ŭ˙˙˙˙˙˙˙˙˙÷˙™Şö˙ŭ˙˙ȘÏ! ¤ò˙ü˙˙ŭ˙˙ġ˙ĝפ˙è˙ž, Ĥ˙ŭŝ˙ú !ûù˙˙Í! ŝö˙˙ż(Ï˙˙êҜšÑ˙˙˙-!ñ˙üù˙˙üûüŝùó˙˙˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ-È˙îû˙”+Ş˙ĝû›”˙˙ġ˙Àŭ˙˙üêĤ$üñò˙ùğ÷öŭ˙˙§%ŭġÖ! —˙˙ë˙˙˙Ë(Ôöŭ˙–˙ċ˙ö& ò˙š ›ŞĠúú˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ї!ŝù˙˙˙Ĝ(Ò˙˙˙ñò˙+(ŝ÷˙Ú˙˙ĝ˙˙˙Éĝúŭ˙˙˙˙˙úö˙÷óÔ)˙ŝé(#É˙÷ü˙˙ĝ˙äÚ*ü˙˙ü˙ê)Ĥ˙úö¨ Ĥ˙˙˙˙˙ñŝ˙§–˙ö˙˙˙˙)ùüü˙÷ù˙ùñ§Ċ˙ĝŝĝ§#ŝ˙ú˙ĝö˙˙ô˙˙( ˙˙˙ûü˙ü˙ùü˙˙˙˙˙˙üġ¨°ü˙˙ùĥ$ŝù˙ġʤ &#!ûó˙ú˙˙ ˙ñ˙˙í  +×˙úÔ ˙óìÜ™˙˙ñ˙òòĊ#£&%Ÿ˙ï˙Ĝ¨î˙˙˙˙üġ˙˙˙˙˙˙˙˙˙˙ê% ×ô˙ŝòı$Âù˙˙͏˙ħëÔ˙ìöù ")ž˙÷ü˙ĜÊ˙ŝäú˙˙òŝúûú˙ġ˙˙˙˙˙˙˙˙È Äĝġ˙˙˙° + ˘ħ -˙éŝ˙˙Ġó˙÷ì™§˙˙˙˙ù˙ú˙˙˙ú˙  ž˙˙÷Í Û˙ù˙üŝ˙˙ü˙˙ĝí˘˙ïúŝŝ-Ż˙˙˙˙˙ ˘˙ú÷˘áġñú˙œ%˙˙÷ŭö˙ /˙˙úüâšĜûö Ùŝ˙˙û˙û˙ó˙˙˙ŭ˙˙˙ñ˙˙ċ "ŞÊ˙˙ö˙² û÷óü˙˙’ ­ċ˙˙ö˙ ü˙ûó— ¸úöûù˙ĝö%  ˙ôô˙˙Š#$˙óúŝ˙ Ĵ˙ùŝü÷˙ü+˙(ò˙˙˙üû˙˙˙˙˙˙˙˙˙ù˙(òŭ÷˙úùİ!'˙ —ÚÎ˙˙˙˙ö˙úúüúŝ˙˙ë§˙˙û² ˘ĤżÇó˙ôúŭ.˙˙ûüË˙˙÷˙˙û˙˙˙˙ŭŭ˙ŭÔ ˙öŭŝ˙ó˙Ò˙ùÖû˙üü˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž( Ñ˙˙˙˙˙˙˙˙ħ! ˙ûñ˙˙à!˙˙ġ˙¤ Şŭ˙˙ç˙Ħñŭ˙˙ŝÊ "˙ŭ˙Ñ£ï˙˙˙ûóû%*•˙˙ĝĦò˙î˙•* ĥŭ˙ĝÙĴ"Ç˙˙÷˙˙˙˙˙˙˙˙ç˙Ï˙›-˘$˙ó˙˙ċÑ ˙ôî˙˙ŭ/Çüŭş 0˙˙ŝĝú˙(˙˙˙˙˙˙ŝü˙û˙ŝ˙Ïĝ˙ô˙Êü˙ŝ˙ú˙ï˙˙!¨˙ö˙ŝ˙à(öü˙˙&ñ˙÷ŭ˙ŝ˙ü$˙˙ïġ"ŝ˙úùŬ˙˙ü˙ûİĦ˙Ĝ˙˙ñšŝü˙ŭ˙üé6ġ˙˙˙%²ĝ˙ûüû˙˙˙ŝú˙ŝŭ˙˙ċ˙Ëŝ˘Ë˙üö˙ğ ĝ˙˙˙Ŭ #Ûì (˙ö˙ôú"ùó˙˙˙œ¨ñî˙Ò")˙˙ú˙Ĝ Üñ˙˙˙ŭ˙˙ü÷ĜÑ˙úó™-ˆ÷ï˙˙˙˙˙˙˙˙˙˙˙˙˙á Ì˙˙˙ê˘Ğ˙üü¨Ëû&Œ˙˙è˙˙˙'ŝ÷˙˙ôĜ# 1Äŭ˙˙˙úÙ˙˙˙ú˙˙˙˙˙˙˙˙˙˙ÔÔ˙ĝûóŝ1$ÑĠ´˙ô˙ġ˙˙ñ˙˙""›öú˙˙˙˙˙òö˙˙÷ ĥ˙÷˙% —˙û˙ö˙óö˙˙˙ĝè ü˙˙ŭ˙ *íŭ˙ġ˙ùî- ü˙˙£Â˙˙˙îĤ#ŝ˙˙˙˙ûĦĝú˙ûÂŻ¤ûû˙Úġ˙úġ˙Ï˙ü˙ŭŭ˙˙ŭ˙ŭ˙ġÍŞÓŝ˙î˙“'ĝ˙˙˙ôòĥ%›˙ġûĝ˙Ï 'Ê˙ú˙›ó˙ĝ˙˙ù˙Ë)$û˙˙˙˙£ ˙˙˙˙úžö˙˙˙úġ˙”" šï˙ùŭŝ÷û˙˙˙˙˙˙˙˙ü˙).˙ú˙ô˙˙˘*ïħż˙ù˙˙ñ˙˙ñ˙Ğ/Ħĝ˙ò˙ü"ċ˙í## ò˙ï˙ûŭì˙˙˙˙ù˙ ˙˙û˙Ó˙ŝ˙ì"#˙÷û˙ö˙û˙˙ùùĴÈ˙˙˙˙˙ûïĝ˙Äŝ˙ŝö˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öä Îü˙ó˙ŝà -á÷ù ï˙˙üûÈŝ˙ìŭ !ö˙ÇÏ£.˙˙üŭŭÌ'Ñ˙˙ù£Ê˙˙ŭ˙˘ ùö˙"Ä˙ôô˙0Š˙˙˙˙ç˙ӊ£ĞĞ÷ŭŝ˙˙˙˙˙˙˙˙˙á Ë˙î'ü˙ŭ˙ü˙£•˙˙˙˙ì)Ù˙˙Ŝ .ùŭ˙˙üÉ˙˙˙ŝŭŭüü˙ù÷ú˙ ˙öĝ˙ùÚ˙îŭ˙ú˙˙ùóİ ğÛ˙ü˙˙Ç!˙ùġ˙ ˙˙ŭġŝ˙ŝÉ#Ûŭġ˙˙˙ ŝŭ˙ŭ˙ $ ŭ˙ôüĠ!•˙ĝù˙˙™#˘˙ù˙˙ü˙ŝ˙˙óï!÷úÓû˙ÂĤö˙˙˙û˙ŭú˙˙˙üï"Ċ˙˙˙˙Ç%!ïù˙é&#“³ ˙ò˙˙ñ!â˙˙˙˙ò#§ì˙óÇġ˙˙ü˙Ġ˙ċ˙ò˙–ú˙ĝ˙Ĉ öù˙>ú˙˙ŝï˙˙˙˙˙˙˙˙ï˙âîŭù˙œ "›˙˙÷Ç˙˙(!Ğ˙ñ˙ïĝ˙È!˙ú˙ŭñ÷Î ÍËÎ˙ä˙ĝ˙û˙úŝ˙˙˙˙˙˙˙˙˙ Î˙˙ŝĠ˙ ü˙#˙ĝ˙ò˙ùùŝ÷˙Ż ˙˙˙ĝúòĴ˙úüû˙˙ö÷×ħ÷ġ˙˙ŭĝ˙˙ìú˙í%¨˙˙˙ġ!Ë˙˙ù˙˙òÍó˙ñĤ ˙ûŭú)Ñí˙ô˙Ë'˙ŝ˙˙÷Ğ˙ö˙ù  Ĝ÷˙ùû£é˙˙ü˙ŝüú˙˙˙û·)˙ô˙ùŭ"ë˙ŭû˙˙š.Ž˙˙˙˙ù˙˜*ù÷˙ùûŝŭù˙ŭ÷˙ŝ˙Ğû˙˙ïġ§ %˙˙ûüġ *Ħ˙úöĝ˙˙îÜ+ ˘˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝĝ˙˙ġĤ˙´Öġ÷ĝùŭ˙˙˙÷úáß÷˙ġ˙ĵ˙˙Û”˙Ċ˙ûö˙˙ñ˙ñôú˙5Ÿò÷ĝ˙ż"úŭ˙ù!+ò˙üû˙úú˙ó˙ŭĤ )œ˙Ŝŭĝï­ĥе£˘ç˙û˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ğ§˙ó˙˙÷˙Ç .ñĝ˙œÙú˙˙úŜô˙˙ôŸ˙ùô˙™ü˙ĝŝ˙˙ #“˙ò˙÷˙˙˙ 'œ˙Îĝ×˙ö˙÷˙­Ñ˙ŝû˙ò˙˙ÏġÎü˙˙˙˙˙˙˙˙˙ì˙˙˙÷ß%˙ö˙ĝ˙ü×÷˙˙ö˙Ĥ§ùù˙ÏÒŭÒò˙˙Ğüüüŭŝ˙˙˙ö˙˙˙úĤ#ö˙˙ŭû˙˙ĝ˙˙ûŭ˙˙ĝŭü˙ûú¤ úĝ˙ò!˙ĝù˙üùûÓ! ˙üŭ˙üž áĝ˙ŭ˙ġ¤ü˙˙˘*ï˙˙ŭü­žŝŝġ˙˙ï˙Ħ˙˙˙˙Ħ¤˙ê˙ĈÇ˙ŝ˙˙˙ùû˙öÇÒŻì˙˙ì­§˙ù˙"É˙˙˙ù"˙üŭ˙˙˙Èú˙ŝŝ´˙ï˙˙ìÎ˙˙ô˙˙§Ëû˙ŭÇ!Î˙ô!Úŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙ Ÿ˙˙öܤ" ŝû˙£Ñ™!–×˙˙˙˙÷$Ô˙÷ûü˙ûÎ ŞôĠѧñ˙˙ĝ˙˙˙˙˙˙˙˙˙˙'÷Üù˧•˙ŭö'Ô˙˙˙ù˙˙˙òûÔ "™ÒšĤ'˙ö˙İİ˙Â˙˙™˙ü˙ġ˙ù˙ŭü˙Á#'˙˙í˙˙̛Ñûßê˙¨žŭ˙ô˙Ÿ˘÷˙˙ Ħ˙˙˙˙ö˙ùŭû$û˙é˙Ĥœ×üû˙°÷˙˙˙û˙˙˙ĝú˙ ˙ŭù˙ö˙˙ó˙ÍÜ1Ħ÷ŝĝ˙˙˙ôŬĝ˙ŭ˙˙ö˙ñ˙Û›˙ùú˙˙ŭ˙ĝ˙˙ ŝÍ˙˙ï˙˙ȟ!û˙˙û˙ú˙ġ˙˙˙˙˙˙˙˙˙ŭĠ"&ñ˙˙˙ù ûԒ$›ŭ˙˙ö˙ùš˙˙ŝûÈÍ˙ŭ˙ê%Ù˙üûŸ ü˙ġÑŝûú˙ĝú˙ŭ˙   ˙˙˙ĝ˘í˙˙ŝ ˙ŝ˙˙ô˙˙ŭó˙˙žŭù˙˙Î( (Ĥ˙˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¨ŝŝü˙ġÑŸ˙˙úĤ$É˙˙ëŝÙ˙˙˙ŭš˙Íĝ˙£"!ş˙˙ú˙ü¨úŭ˙!Ĉ˙ĝ˙˙'Ÿ˙˙ŝú%)˘ŭÏŝ)˙ŭ˙˙˙ò˙˙˙üœ$˙ĝ˙˙˙˙˙˙˙˙˙˙˙™˙ĝ˙ž¨Ë˙˙êÙŸ˙û˙Ĉòİ,žÏô˙ŭ‘&)“˙ó˙˙˙˙˙ñ˙˙ó˙ŝŝò˙˙î!ŝö˙˙Òü˙˙Ü˙Á˙˙û˙Íœ˙˙ñú˙É˙˙îŸ(%Ñ˙û˙ú˙˙ ³Ĝ˙Î%,‘Ġù˙÷˙ö° ŒÙŸ!ôŭġ˙§ İî˙ĝ˙”˙úï˙#˙ĝ˙ö˙úüĠù˙˙Ÿ›˙˙ %˜ "ŝ˙˙˙͢˙Ÿ§ó˙ö˙Í% Ûó˙˙#Ž˙ü&˙úÔ ’˙âĝ›# ˙˙ŭôŝ˙˙˙˙˙˙˙˙Ÿ$ £ŝ˙. 'ĝüó Ħ !Ŝ˙˙˙÷ü "ú˙˙üŭ˙˙ñÜ&úġ˙˙ŝ˙˙˙˙˙˙˙˙˙פĤ%—ó˙ï˙!™üÒ˙ġŝ˙ġ˙˙ ( "  Êŝ˙ì"˙ò˙ Ñŭ˙˙ŭ˙ġ˙˙˜&*˙ï˙˙˙˙Ĥ $ ˙˙÷ #"í˙˙˙ó˙ *§Ñ˙óĝÙ&"Ğí˙˙žÒûû˙÷Ĵ !ŞĤ! ŸÖò˙˙˙ĉ˙˙ŭ˙˜œ˙ú˙˙˙ú˙öüÙ˙˙û£ÏÎĠô˙˙˙ô˙ĝŝ˙ö#Òúü˙ú( ŝ˙ñ 'ñ˙˙ñŝ˙ü˙ö¤ ŞË˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙˙œÓ˙˙˙"ž˙˙˙§Üüú˙Êû˙ü˙¤˙ü˙Ô ÔÉ˙˙úĠ£ġ˙˙ù­%ñ˙û˙Ìû˙ö˙›ê˙ŝ˙ŭ˙ĝ÷˙ü˙žô˙ù˙    ü˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙"!˙û˙û˙›î˙ï&¤˙ó˙ŭ“(˜ġüô˙˙  Ï˙˙û %Íó˙˙Ĥ+˙÷ù%á˙˙$"Íû˙˙ċ ˙˙×İ1šŭç˙ÇŻĴúúŭ6›ġ˙ó˙˙˙˙˙˙˙˙ü˙È&˙ŝëµ% ûï˙Î'"”ùì˙Ù ##›˙˙ŭ˙ ) ·ĝ÷ŝ#â˙ġû˙˙ĝ˙˙˙ĝ´%üëÙöŞ '’ ¸˙ĝ˙ü÷+ĴÈĥŞ˙ôŭ˙ 7 Â˙˙˙öŝù§" '?ĥ˙˙ú˙˙ò˙À(Ğô&˙ŝüŭž+ %4Ñ˙!,”˙˙˙Ï% $žö˙ġŝ˙ë˙˙˙ô˙ÛšĦ¨ĞâŬ˘ Şž%˙ĝ˙¤²ü$Ÿ7ì˙ùû˙öž"š˙‹˙ŭ˙˙˙ò™í˙öŝŸŒ? š˙˙Ç'+–'˜˙üĝû˙œ )ûö˙˙˙˙˙˙˙˙˙˙˙Ĝ˜ ,Ç˙˙˜" Ñ˙˙˙Â!˙ġüğ Ĥ˙ġ˙ñü˙˙&Ì˙ŭ˙˙˙˙˙ŭò˙—.Ŭ˙˙û˙˙ö˙˙˙˙˙˙˙˙͐&"'1Á˙˙ñ˙˙ú“6 4è˙ù˙˙˙÷Ñ͚-' Ĝ˙û˙˙”%§˘î˙ùĴ" 4Ë÷˙û˙˙˙˙ô•)(‰ ˙ĉ˙˙ú˙$ &)Âç˙˙î˙ŝ˙$£Ö"*ô˙˙긑£˙ö˙‘#™$!É˙˙˙öò¸ ›ô˙˙ŭ˙˙Îù´ ",ë˙ú¨Ċ˙÷˙Î˙ó˙‘(žĴĠî˙˙úí ˙ûÉ£' # +÷ô°%2x˙ŭġ˙˙ö˙ĝô×&"™˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ) Żğġŝ& )˙ñ˙àĦ-ıñ˙Ó)˙˙ó£ùöġ˙$ö˙˙ä".¤¨›¨ĦİĤ¤ö˙úŭ˜ żíĝ˙#öú˙ëË#&Şŝ˙úŝÉ£˙˙Â$ú˙ŭ+ # ž˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ $ġ˙ô˙ë˙ú÷۔/*ó˙ô§²˙˙˙ġ"!£$#Ù¤!'˙ĝüȎ1ÍÌ%Ö˙ú˙ë˙˙! /â˙˙ ĴĠ& ×ï˙ŭ˙˙˙˙˙˙˙˙˙˙˙Ë!'˙˙Í $˙˙˙íו˙˙àÉ!*‹˙ö˙÷˙*’˙ö—œáġ˙˙ġ˙˙ü˙üš-Ċü˙ŝ˙÷Ô$ñó˙ó˙˙´/Ÿŝü˙˙˙úÓÙ¸ÈÄ˙˙ĝüù˙˙”›Ö£áë˙˙óù˙ù˙˙˙›%“É÷˙ĊĜ˜äó˙úġ֓, +ÓûûĜ“(/Â˙úê˙ßÏÏÙßĊ˙˙÷ñ˙˙ü˙ġù˙˙ô˙˙˙ŭŭ˙ú˙˙ï˙ĝù˙û˙÷˙˙ĝĈüíú˙˙ôûÜ˙˙˙ŝñ˙÷Ôü˙ò˙˙òü˙˙˙˙ĊĜ˙ú˙˙ñ˙˙éÛÂĊÎÔü˙ö˙êš Ì×˙ì˙˙˙Í*+ ˙˙ûúó˙˙˙˙˙˙˙˙ñ˙˙˙˙ïôü˙óÔËġ˙˙ü÷û˙Êö˙˙ö˙íŭ˙˙ñ˙ĝ˙î˙ÌÇ˙ú˙˙˙˙˙˙˙˙íÜÓĊżÚ˙˙˙ò˙ó˙˙ŭ˙˙˙˙˙˙˙˙˙˙ËËżÙ ĊÎÓ÷ú˙ĝĝï˙ġÏӝ˙˙òû˙ŭ˙úĝŭß½ÓÇÈġ˙ñŝ˙ü˙ò˙óü˙˙ö˙íûÔÜê˙ú˙öû˙üû˙˙çù˙ï˙˙ó˙úü˙ŝŭ˙ŭÖ ”ÏÊÎ˙˙ŝŭĝ˙û÷˙Ô¸Ĥ˙˙÷ÄÂÔżŭô˙˙òû˙˙òó˙˙˙˙˙ñó˙˙ŭ˙˙ġ˙…/%˙ϒ)–˙˙ŝ˙ô˙˙÷˙Ħž˙˙úÓĞ"‹ŝ˙ü˙ôħ (ó˙˙˙'  (•ïÁË˙˙ò™  –ó˙ĜĴÄÓÈ˙ŝâĈÁÊĵÒ˙üü˙˙ú÷˙˙½$ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ›) %-1”Ôï˙˙˙˙()%Ä˙ôüÜ "˙ù˙Ÿ ×˙ġ˙Ċœ˘Ì˙˙ġ˙")Ä˙˙Ä/ Ż÷ŝ˙ü ÏÊÖ !ŝŭ÷˙!(ÈŭĝÈÏİ#)‘“˙úú˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û‰0$˙ŭûŭÏ˙ # ˘ü˙ħ% Ħ˙ŝ˙ŝ #!˜ &"ĦÀ˙Í ¤™›°üŭ˙˙֝ĵġù˙˙˙˙͕ݔŻ˙£Àò˙ĝĤ/+ĦŜ˙Ë˙ü˙˙˙˙˙˙˙˙˙óñ˙è÷ù˙úŝ˙ï˙˙éŝö˙éù˙ö÷ùú˙˙ó˙˙ô˙ĝ˙ŝŝúö˙ôŝ˙˙ü˙˙˙ö˙ŝ÷˙ûġ˙ŭ˙˙˙˙ŭúó˙˙ñ˙˙çŭĝ˙˙ûéŭ˙ü˙˙˙ûé˙˙û˙Ġ˘ŝú˙ë˙˙÷ï˙ô˙ù˙˙˙ùŝ˙˙˙ù˙ù˙Ù˙˙˙÷÷ú˙˙˙˙˙ġôŭĝû˙ûò˙˙ñ˙˙ĝù˙˙˙˙÷˙ä˙˙ù˙˙˙ì˙ò˙ì˙ŝò˙˙û˙ġ˙ô˙óóüöö˙˙ñ˙˙ú˙˙öû˙˙ñù˙çŭüĝġàû˙˙î˙ŝí˙˙˙˙˙ûüñ˙˙ó˙üù˙˙ú˙˙ùüŝì˙˙˙ü˙˙ñ˙ù˙ġü˙ûôĝ˙˙˙˙˙ġö˙˙ŝ˙˙˙ôù˙˙ü˙˙ëüÓĦ˙ñû˙˙˙˙˙˙˙˙˙˙˙è˙˙íß˙ö˙˙ŝ˙ŝ˙ô÷˙ùù˙˙˙ù˙î˙˙í˙˙ù˙˙ú˙˙˙öü˙˙˙üü˙˙˙˙üû˙˙˙ĝî˙ë˙ú˙˙˙˙˙˙˙˙˙˙˙ûġ˙˙ġ˙˙ŭ˙˙˙ô˙ú˙˙˙˙ö˙˙÷ŭŭŝô˙˙öê˙˙˙˙÷ó˙˙ĝ˙˙˙˙ŭûû˙ĝ˙Ù˙÷˙˙˙ñ˙˙˙ö˙˙˙˙˙ùù˙˙ġ˙ë˙ġ÷˙ò˙ö˙ŝ˙ù˙í×Ü˙˙úĝöê˙˙ŝû˙ï˙˙ôÖ÷×˙˙˙˙˙˙ùŝ˙î˙ôŭ˙˙ŭ˙˙÷˙˙ŝĝû˙˙ü˙ü˙ñĝ˙úòâ˙ò˙˙˙ġò˙˙ï˙˙ġ˙˙˙Ûù˙÷ó˙ùô˙ü˙˙˙ù˙˙ó˙ôü˙ù˙˙˙ô˙ž $˘İ•$úó˙˙˙˙˙÷ô˙˙ñ˙ûöŭ˙˙ùŝŭö˙˙˙˙˙ò˙˙ö÷˙ü˙öè˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝĈ˜£œİ’Ëûö˙ŝŝ˙˙˙Ĝ‹ Ş˙ĝô˙úùĤ˙Î ,Ÿŭŭ˙ġ˙˙³™ *#˜Ë˙üù˙ŭџ›œµŭ˙ó´Ĥž—Úûó˙ü%$#”ġ˙ĝ”&*˘ĝ˙ô˙ì˙ô˙˙˙˙ü˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙&‰Ö'–÷˙÷˙û¨* ĦĝöŝĠÀÉğË˙˙÷ú˙ûĠ¨#û˙˙Ì˘˙ĝ˙˙Ú˙˙˙ê˙÷˙˙í˙˙Ç˙Ħ¤˙×˙˙˙ŝŭüî˙ö˙˙Ò˙üÈ˙˙öŝ˙˙˙˙ö˙˙ùĝİ Şò˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙˙˙˙ú˙˙ù˙˙ĝŭ˙÷û˙˙ïú˙û˙ñó˙ô˙ĝ˙ŝùü˙˙˙÷öü˙ŭüóò˙˙ê˙ü÷˙˙÷˙˙öŭòŭ˙˙˙üó˙˙˙û˙ù˙ó˙˙˙˙ó˙ùú˙˙ŝîüï˙í˙˙˙ŭ˙˙ü÷˙ĝ˙úĝïöúŭ˙˙÷üüè˙ïúé˙˙û˙˙˙ŭóóûŝ˙˙úŝ˙˙÷˙˙˙˙öû˙ò˙˙ù˙î˙úùù˙˙ĝĝ˙˙˙ù˙ôúĝ˙˙ûŭù˙û˙÷ó˙˙˙ŭŝŭ˙˙ö˙˙ë˙ñġúû˙û˙˙úù˙˙û˙ŭ˙÷˙˙ú˙á˙ŝĝ˙˙÷˙ñ˙˙ûŭ÷˙ôċ˙˙ü˙í˙ò˙ĝ˙˙˙˙˙˙û˙˙ó˙˙˙îŭ˙˙˙˙˙ùúöô˙ü˙˙éüġ˙ĝ˙˙˙žĤĝ˙ööŝ˙˙˙˙˙˙˙˙ŭ˙ô˙˙ġġüô˙ùè˙˙û˙ŭ˙ùúŭ˙˙úŝùû˙˙ö˙˙ò˙˙˙˙ñ˙˙ŝŭŭ˙˙ŭüŭö˙˙ùòĝ˙˙˙˙˙˙ŝŝô˙˙˙˙˙˙˙˙˙˙ùŝú˙ùŭú˙ù˙˙˙ġġ˙üñŭ˙ù˙˙˙˙ŝò˙˙˙ùô˙˙úĝ˙˙˙÷ò˙÷ŭ˙ŝü˙êö˙˙˙ó˙˙˙÷ŭŝ˙÷ùüù˙˙˙˙˙ùö˙˙˙ü˙úê˙úë˙˙ì˙˙ŝ˙˙˙˙˙úûġ˙ŝ˙ì˙û˙÷ŭî˙˙è˙ù˙ĝ˙˙ĝ˙ĝĝ˙˙ôô˙÷üù˙˙˙÷ì˙˙˙˙˙ŭĝ˙ú˙Çú˙ĝ˙˙ôŝ˙˙˙ú˙˙ŝó˙˙óŝġï˙ó˙ġüö˙ġŝŝ˙ŭġŝ˙˙ö× #”Óò˙ôÍö˙ ˙ö˙òü˙û˙˙ĝöùù˙˙ù˙öû˙˙˙˙÷˙ï˙ŝ˙˙ûŭŝ˙üú Í˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïŭ˙˙ŭ˙˙ġÜû÷˙˙ŭûó˙úüĝÔ˙Ġ˙÷˙ûĝ˙˙ù˙ù˙˙ÊÒ˙èù˙úÊĊĜ˙ö˙˙÷˙÷÷˙ÇùÁŝĝ˙ġù˙ġ÷ŝ˙˙˙˙˙˙÷ŭ˙÷˙ë˙˙ù˙˙˙ ‘˙˙ú˙Ğ Ÿ˙ŝŭñ˙˙˙ŭô˙í˙˙ñ˙üĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĤ  šÇĥÓë˙ŭ˙˙ò˙ûĝË˙ŝÏü˙˙ê˙˙˙â˙˙˙˙˙ŭö˙ó˙˙˙ġûùŝ˙ò˙ŭûŭüĊ˙ĝ˙˙˙ŭ˙öŭ˙˙ġ˙˙ü˙˙ŝ÷ŝ˙ŭ˙ŝ˙ô˙˙ç˙˙ì˙ó˙ö˙÷ĝ˙ü˙Â˙˙ġè˙˙ġ˙úû˙˙˙˙˙˙˙˙˙ĝ˙ŝö˙ĉ˙ŭ˙ġŭô˙˙ß˙÷˙˙ù˙˙ú˙˙˙˙˙˙ŝŭ˙˙ŝöô˙ŝ˙˙ù˙˙˙ñ˙ò˙ŝó˙˙ŭĝ˙ŝ˙˙˙˙˙ŭò˙˙ġï˙÷ï˙ö˙˙ó˙ŝ˙ù˙üñ˙û˙˙ü˙ü˙ûú˙ó˙˙ĝ˙˙ŭŭ˙˙˙ŝŝŭùŝ˙˙÷˙ù˙˙˙üü÷û˙˙˙˙˙÷˙ŭö˙˙˙üĝ˙ŭ˙ŝì˙˙˙ŝ˙ûü˙˙ŝ˙ë˙˙˙˙˙˙˙˙ù˙ïô˙˙˙ó˙˙ŝ˙ëóġ÷ŝ˙˙î˙˙˙˙˙ù˙é˙ŭ÷˙˙ĝ˙˙ö˙˙ñ˙üû˙˙˙ġ˙ŝ˙ġ˙˙ö÷û˙˙˙÷˙˙ëù˙úò˙˙îú˙˙ñùŭ˙ŭú˙ô˙˙˙˙ġñûŭŭ˙˙ô˙û˙ŝ˙˙˙÷ŭÇ !Ġ˙˙ú˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ûŝ˙ü˙ŝ˙˙˙úŝ˙˙ŝĝ˙óò˙˙˙˙ï˙˙úú˙˙ñ˙˙ü˙ï˙ûû˙˙˙˙ŝ˙ùú˙˙˙ĝ÷ŝ÷˙ĝ˙˙ö˙˙˙˙˙˙˙˙˙˙˙ŭĝ˙˙˙˙ġ˙úûô˙˙˙˙˙˙ŭü˙˙ùíïú˙˙ùû˙˙öü˙ôñú˙˙˙ò˙˙ëŭ˙û˙˙òûŝŭíĝ˙˙÷˙˙ŭ˙˙üûŭö÷˙˙˙ùì˙ŝùŝ˙ü˙˙˙ï˙÷ó˙ó˙˙óù˙˙ĝ˙üŭ÷˙˙˙˙˙ŝ˙ùè˙ŝ˙˙ġ˙ò˙÷˙˙û˙ġó˙öî˙üúĝŭ˙˙˙úûŭùġ˙˙öĝñ˙ó˙ĝö˙˙ŝüŭŝùù˙˙˙˙ü˙˙˙î˙÷˙ŭúĝ˙ŝ˙ô˙˙˙˙ê˙’1  éĝ˙ò˙˙öŝœñ˙˙ö˙˙˙úüú˙˙ŝĝ˙ñŭ˙üŭô˙ü˙˙ñ˙ŝûŝ˙˙ü˙í°Òöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ÷÷˙öÎ˙˙˙ĝ÷ŭ˙˙˙é˙ú˙ŝó˙˙ú˙˙óüì˙ñ˙˙˙ë˙˙˙˙˙˙ôï˙ë˙óĝ˙˙ŝ˙˙ü˙è˙˙˙ü˙˙ĝ˙ö˙˙ĝö˙û˙˙ü˙ú˙ŭŝŝŝ˙˙úלŬ˙˙ç˙ú˙£Ñ˙ñú˙˙ŝ˙òŝ˙ó˙˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙÷ħ2Êĝ˙÷û˙˙ĝù˙˙÷ô˙ùŭö˙˙ê˙ĝ˙ñ˙÷˙˙öö˙˙˙ĉ˙ŭŭ˙ñ˙˙Ì˙˙ù˙˙ö˙ĝù˙˙ï˙˙˙˙˙ġ˙˙÷ó˙˙ò˙ĝŝú˙òú˙˙ò˙˙úġ˙˙˙˙ŝ˙˙ôü˙˙ô˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙÷ô˙˙˙ù˙ï˙˙û˙˙˙ö÷˙úŭĝô˙ġú˙ù˙ŝ˙ŭó˙˙˙˙˙ûġ˙˙ċ˙ñ˙˙˙ġñ˙˙èù˙ùŭŝŭñĝĝ˙˙˙ûô˙ĝ˙ĝ˙˙˙˙˙öŝ˙˙ñ˙÷˙ò˙˙ĝ˙üó˙ú˙ĝ˙˙ŝù˙ôûĝôĝ˙˙ŭ˙˙ŭù˙îúò˙ŝ˙˙ŭôëó˙˙˙˙˙˙ġĝ˙ŭŭ˙à˙˙ò˙óŭû˙˙˙ú÷˙˙úŝ˙˙ò˙úú˙˙ú˙˙ùûù˙ù˙ñ˙˙˙˙˙úĝû˙˙ĝ÷˙úùĝ˙˙ü˙ĝ˙˙ú˙ŭ˙ŭ˙˙˙ĝü˙˙î˙˙ĝ÷˙÷˙óŝüûîù˙÷˙ó˙˙ö˙˙˙˙ŝ˙ŝ˙ù˙˙ŭñ˙÷ŝġĝ˙˙˙˙ŭúŝï˙ŭô˙˙ĝûüì˙Ĉ)Ĵµ˙í˙˙ŭñö˙˙˙˙˙˙˙˙ô˙ü˙˙˙˙ú˙ùĝ˙÷óû˙ô˙˙ó˙ŭ˙˙˙˙ù˙ġê˙˙˙ĝ˙û˙˙˙û˙üû˙˙˙˙˙˙ĝù˙˙ŝ˙˙˙ü˙˙˙˙úŝ˙˙˙˙˙˙˙˙ŭ˙˙˙ò˙˙ù˙˙ö˙ŭ˙ñúù÷˙˙˙˙ŝ˙˙˙˙˙ë˙˙ô˙˙˙˙ú˙˙ġâ˙˙˙˙ù˙˙ŭû˙˙ġ˙ġ˙ö˙˙üüĝŝ˙ùü˙˙˙˙ŭŭ˙û˙÷ü˙úü˙˙ŝöŝî˙˙˙ûû˙ŭ˙˙ô˙ó˙˙˙ùüùôú˙ù˙˙˙ĝ˙ûŝ˙ñ˙ĝë˙˙˙˙ŝí˙ô˙˙˙ùò÷ñü˙˙˙˙˙ñ˙˙ĝ˙˙˙˙˙ġ˙óú˙˙ú˙˙˙ò˙˙ü˙ù˙ĝü˙ñ˙˙˙û˙˙˙˙ŭù˙È,˙ĵ˙˙˙˙ûĜ˙˜1üûôùú˙˙ŝŭöû÷˙ó˙˙˙ġù˙˙˙ô˙˙˙û÷û˙˙ŭ˙˙˙Óü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ĝŭ˙÷˙˙ü˙˙û˙˙ùú˙˙í˙˙ŝ˙ü˙˙˙î˙˙˙˙ŭ˙ìùŭ˙˙î˙ó˙˙ŝ˙˙˙ö˙û˙ŭî˙ûò˙˙ûôú˙˙˙ó˙üûŭ˙˙˙˙˙ï˙˙í˙ö˙ò˙˙Äĝ˙íôñ˙˙ô˙ûì˙í˙˙ŭûŭô˙˙˙˙˙˙ò˙˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĝœ!'§˙˙÷˙˙ì˙˙ô˙˙˙ŭ˙˙˙ŭö˙˙ŭ˙ŝü˙ŭŝ˙˙ûŭ˙˙˙ü˙ó˙ùúû˙üö˙˙ú˙˙ó˙ŭó˙ġ˙üûû÷˙ŭ˙ŝ˙ö˙˙˙ĝŝ˙ô˙ù˙˙ù˙ùŝ˙˙ŝ˙ŝ˙˙˙ŭü˙ü˙üüĝ˙˙÷˙˙˙˙˙˙˙˙˙ŝüĝ˙ŝ˙ŝ˙ĝ˙÷ú˙ô˙˙ö˙û˙˙˙˙üù˙ûú˙˙˙˙ï˙ĝö˙˙ó˙˙ú˙óú˙˙˙ŭö˙˙ûŝ˙˙ú˙˙ŭ˙÷˙ŝ˙ôġ˙ò˙˙ú˙˙ï˙ì˙ŝ˙˙ŝô˙ó˙˙û˙ü˙˙üû˙˙÷˙ŝ˙ŝ˙ĝ˙˙ü˙˙ġ˙û˙ŭ˙˙ù˙óü˙ĝú˙˙˙ú˙÷ù÷˙ú˙˙˙˙ô˙ŝç˙˙ŝ˙ñ˙˙˙ó˙˙ü˙˙ü˙˙˙üĝ˙ŝĝ˙ó˙˙÷˙úŭ˙ĝŝ˙ùö˙˙˙˙ö˙˙˙ñ˙˙ĝû˙ġ˙ŭŝ˙ö˙˙ñü˙ü˙˙ġ÷˙ŝŝ˙˙ġ˙˙˙˙ü˙˙÷˙˙˙ò˙ġü˙ù˙ü˙÷˙ö˙û˙˙˙˙ŭŭ˙úŝŭúü˙˙ŭ˙ó˙˙úŝ˙˙ú˙óٓâË˙úŝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙ó˙úĝŭ˙˙˙˙˙ŭ˙˙ö˙ùü˙˙ŝüùú˙ù˙˙˙üŭ÷˙û˙öû˙˙˙ŝŭ˙ŭùû˙û˙˙û÷˙˙ü˙˙ö˙óú˙˙˙˙˙˙˙˙˙˙˙ú˙ù˙ùŭ˙ŭú˙ô˙ù˙˙˙˙˙üûŝü˙û˙úĝ˙˙ò˙˙˙ó˙û˙÷˙˙˙ĝú˙˙ŭ÷ŝ˙ù˙˙ö˙ú˙ġ˙ŭ˙ŭ˙òú˙˙ĝŭ˙˙˙ûŝŭú˙ó˙üúú˙û˙˙ġüú˙ò˙ŭ˙ŝ˙ġ˙˙˙÷˙û˙˙ú˙ô˙ô˙˙ô˙ú˙˙÷˙˙˙ô˙ġ˙˙÷ŝ˙ú˙ŝ˙˙˙˙÷÷ŭ˙ġ˙ù÷˙˙÷üùù˙ŭ˙ŭû˙˙˙ŝŭŝ˙ô˙˙ù˙ŭ˙ŭüû˙˙˙˙˙˙ôü˙˙ŭĦ ˙ŝü˙˙û˙ùŝŞ˙˙û˙úŝûü˙˙˙˙˙üû˙û˙ŭ˙ŭûû˙ġ˙ï˙˙˙ĝù˙ŭ!! ˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ċ˙˙ñ˙ŝú˙˙ñù˙ġ˙ŝ÷˙˙÷˙ö˙˙˙ĝû˙˙ûġ˙ŝ˙û˙ġ÷ù˙÷˙ö˙˙ŝŝù˙ôĝ˙˙˙˙˙ŝ˙˙û˙˙úúú˙ö˙ùü˙˙˙ŝ˙ŝû˙úü˙è˙ö˙˙ó˙ú˙˙ù˙ûüŭ˙ô˙ù˙˙ġù˙ŝ˙˙˙˙ùüûö˙˙î˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüüü ô˙˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ù !˙ñ˙ô˙˙ŭ˙Â˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝ˙ĝ˙˙£"˙û˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŭŭŝ˙˙˙$)"˙˙˙ü˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙Ħ’˙ä˙˙ù˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙˙ -Ğ˙ù˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙›! ĵĝûïŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝқ*ú˙˙ĝ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ûû˙˙Ë4#ĵ÷ö˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúĝ"! ',˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭïġ˙˙ù˙ñúó˙ö˙ìù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ĝù˙Ŝ˙˙˙˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŭû÷óñÄ ##éùŭû˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ú˙ï˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝú˙üġ˙˙ÇÖġ˙˙ŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙ŝŭûú˙Ô(£ ™Úî˙˙ùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ì˙˙˙ôñ˙˙˙óô˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙úü˙ü˙ŝ˙ùù˙òŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝġ˙˙ĉûû˙è˙ö˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ġġö˙˙÷ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙˙˙úû˙ŝ˙ġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭŭŭŝ˙˙˙˙ùù˙˙˙ô˙û÷û˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ë˙˙ŝù˙ĝ˙˙ĝŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙üü˙˙ú˙ò˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŭ˙˙˙˙ñ˙ĝ˙ù˙˙˙ĝ˙ü÷˙ò˙ŭ˙˙ûŝ˙˙ú˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝû˙˙˙ùĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙÷û˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûûú˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙ŝü˙ŭü˙˙˙üû˙˙ĝ˙˙˙ù˙˙ô˙˙˙û˙÷˙ŝ˙ŭ˙˙˙˙˙˙ü÷˙ŝĝŝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŝ÷˙˙ĝ˙˙˙˙˙˙˙˙˙üü˙˙û˙ï˙ŭ˙˙˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙÷˙ŭ÷˙˙ü˙ôĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙ö˙ġ˙ùŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ó˙˙˙˙ġ˙˙ñ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙ó˙˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙˙öü˙ö÷˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûĝŭ˙ü˙˙˙˙˙ü˙û÷˙˙˙˙ŝŝùû˙üûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝùùóû˙ú˙úûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñġ˙ŭö˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙ù˙óŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ùŝ˙ú˙˙˙ŭ˙˙˙˙öú˙˙˙˙ĝ˙ùġ˙˙ü˙˙˙ûû˙ŝù˙÷˙ŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝú˙˙òû˙ó˙˙˙˙˙˙˙˙˙˙˙éü˙˙÷˙óò˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝó˙˙˙˙ŭ˙÷˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭö˙˙˙öú˙ù˙˙˙÷˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ĝ˙ñò˙úŝ˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙úù˙ûûü÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŭóö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙ŝüŝŭúû˙÷˙˙ö˙ŝŝ˙îò˙ĝ˙˙ġ˙˙˙˙˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙˙˙˙îüö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝüüùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ûĉŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ó˙ġŭ˙ô˙ñ˙ü˙˙ùü˙ŝ˙˙ûò÷˙˙˙˙ŭö˙˙ŝ˙˙ûŭ˙˙ü˙ùŭüŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ö˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ùûŭ˙˙˙˙÷ü˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óú˙˙˙ġ˙ó˙ë˙˙ŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ñüŭò˙˙˙˙ŭ÷˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙í˙ĝŝû˙˙˙üû˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙ŭ˙ôûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïŝ˙˙ùù˙˙÷˙ùü˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭ˙˙˙ŭ˙˙˙ü˙˙˙û˙˙˙ĝŭ˙û˙é˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŭŝ˙˙˙ùĝ˙ġ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙î˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ôŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ö˙˙üġŭ˙˙˙ġ˙î˙ù˙˙öü˙˙˙˙ëŭó˙ŝ˙ĝúŝ˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŭ˙ĝ˙ö˙˙˙˙˙˙˙˙˙˙˙ö˙ïôú˙˙ïĝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ùù˙˙˙ú˙ö˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ġö˙ġî˙˙ŭ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝ˙ú˙ŝû˙˙ċù˙ö˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙üó˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöŭ˙˙˙˙ŝ˙˙˙˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûü˙ö˙ŭù˙öŝ˙ñ˙ġû˙˙ñ˙ò˙ŭû˙˙˙ó÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ŭùö˙ùáġĝ˙óü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òï˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ĝŝüû˙ùò˙˙ê˙˙˙üü˙ŝúŭ˙ú˙ŝù˙˙˙˙ŝ˙˙ŝôĝ˙ġ˙˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙÷ù˙÷˙˙˙˙˙˙˙˙˙óü˙û˙ü˙˙ññ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷üü˙ŝî÷˙óŝ˙÷ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŝô˙˙ú˙˙ŭ˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙÷˙ö˙ġ˙˙˙ê˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙ŭ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙ôûùŭ˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙î˙˙˙˙ñ˙˙˙˙˙˙˙˙ö˙ġñ˙˙ë˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙ù˙ĉÓ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ûŭŭî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙Èáì˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ùùù˙üó˙ĝ˙ö˙˙˙óŭ˙òÏ˙ÍßÌù˙˙˙ûŝŝû˙˙˙˙ù˙˙ù˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûñ˙Ùû˙˙˙˙˙˙˙˙ûŝŝòĜŜßÄ˙˙û˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġü˙˙˙˙ô˙˙³˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û–0³ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïì˙ù#Ĉî˙˙˙ôġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙ò˙ŭöñŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙˙˙˙ù˙ŭ˙˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝü˙ġú÷×úí˙òÛ˙ê˙ïŝ÷ĝ˙üê˙ú˙˙ŝ˙˙ñ˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙ŭñ™Ĵħİċĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ùâı—Ş Ĥû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭĞ ’˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĠÂ×Éü˙÷˙ï˙͢ Ñù˙ĝ˙˙ò˙˙£&)“˙˙˙ŭû˙˙˙ìÁ­Şê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùùĴ%£˙˙˙˙˙˙˙˙ĝ˙Ë "6&†áùġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙úúŭÈüĞËŭû˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôÙĦ!(Ŭ˙ò÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ʰ š! /$ ˙ĝŝöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙ì˙˙˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġ˙˙ĉĥ—ŝÚ˙˙î˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÔÎÌ£ĦĤšĠҕԙ٣ ġ˙ŝӟü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙ĝŞ$ ˘˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ İ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙– ¤ġ˙˙˙ûŝ˙û˙ŝú˙À"!¸ûù˙˙ĝ˙˙è²%¤ŝùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ü ' ˙˙˙˙˙˙˙˙ÓÏ#•˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙Ë"˙˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙£ Ġ˙ù˙˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ħ &˙ŭù˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ%Çŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ĥ4!*È˙ö˙÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙üŝ÷˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙˙ùŝ¨!!$  %§öĝ­ "¨û˙ŭû˙˙˙˙˙˙˙˙˙üúûŭŭ˙ù˙ŭú˙öü˙ŝú˙Ó­˙˙˙ŝúûŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ü˙ŝô˙0# Ĥŝù˙ò˙˙˙ôŭŭ˙˙ü˙˙ô˙ŭ÷˙˙˙˙ĝ÷ ˙ù˙ò˙˙ó˙ŭûü˙ú˙˙ĝûŝú÷˙˙˙ù˙˙ùü˙ŭü˙˙˙ñ˙ŝ˙ú˙˙˙û˙ġŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ó˙ù˙˙ú˙˙ï˙ù˙ġ˙÷˙˙ò˙˙÷ü˙ü˙˙˙˙˙ö˙ú˙˙˙ŝ˙û˙÷˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ù˙û˙&×üù˙È# ˙˙ĝú˙˙ñĦš££Í¤ Ëŝ˙ú÷˙ô¤˙˙˙ûŭù˙ü˙˙ñ˙˙ŝ˙ûü˙ŭŝú˙ó˙ŭü˙˙˙ë˙˙ŝú˙ûö˙˙˙öù˙û˙ù˙˙ü˙û˙˙˙˙ û˙ĝŝü˙ü˙Ô˙˙š&˙ŭ˙˙û˙ùü˙û˙˙üüŭ˙÷˙ĝŭ˙˙ò˙ŭú˙ŭ˙˙ü˙ŝù˙ô˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŭ˙ò˙ö˙˙÷˙ŝî˙ŭ˙ŭ˙ù˙ü˙ŭŭŝ˙ŝ˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙úù˙ŭŝ˙ó˙ö˘ Ôñ˙ĝ˙˙üŭŝ˙ŝ˙üö˙˙ĝ˙˙˙˙î˙ŭŝ˙ŝ˙üö˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙òĦœ´Ÿ £Ë˙˙˙ġ˙ŭü˙ĝú˙˙˙üŭŭ˙ŭ˙ûŝ˙ġ˙ùŝŝ˙ġ˙˙ŭü˙˙˙˙˙ŝŝúü˙ò˙ĝŝ˙÷úŭ˙ĝ˙˙üġ˙ŝ˙ú˙ŝûŝ˙˙ŭüŝú˙˙÷˙ô˙ž "Óüû˙ŝ˙ĝ˙ò˙˙ûŝ˙˙˙ŭüŭŝ˙˙˙˙˙˙˙˙ö˙˙“ Ó˙˙ŭô˙˙˙˙˙˙˙ŭ˙˙ú˙˙ú˙˙ŝ˙˙˙˙˙˙˙˙ü˙˙ŝŭ˙˙ü˙˙˙˙˙˙˙˙÷˙ĝûÏÚî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙î Ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙— ŻŝÄŝĈ#ŭѵ œ˙˙˜$‹ÖŜïŭŭúü˙˙÷ùŝ˙˙˙˙˙ûúô˙˙ô˙˙˙ò˙˙˙˜”&Ĵ*"‘úúŝ˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙û˙˙• Ş’#"ü˙û˙ùó˙˙˙˙ûó˙˙˙˙ŝ˙˙ĝ÷ü˙˙˙ŭ˘&Ĵ˙˙ûŭ˙ĝ˙ì˙˙ŝ˙ŝ˙˙ŝ˙˙˙˙ûüùû˙ŝ÷ŝ˙˙˙˙˙ú˙˙˙ú˙˙˙ŭ˙ûŝ˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙ú˙˙ŭ˙˙˙ôú˙˙˙˙óġ˙üŭ˙˙ñ˙ŭ˙ö˙˙ö˙ñüùó˙ùüù˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òïû˙˙ġñ˙Ħ š˙˙î˙ ž˙˙˙˙ġüâÓ˙ô˙ó"üŝŝ˙˙˙˙1ë˙˙˙˙üû˙ûŭ˙˙ŝù˙û˙ò˙˙˙ö˙˙ŝ˙ŝ˙ù˙ĝ˙ï˙û˙˙˙ûú˙ü˙˙˙˙˙ú˙ùġŝ˙ê˙š/ĉ˙ñ˙˙ĝŝ˙ž#Á˙ûü˙& ŝŝġù˙îü˙˙ġü˙ĝ˙˙ú˙÷˙˙ùŝ˙ĝŝ˙˙ùŝĝ˙˙ñ˙ĝúÔĵ÷ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ŭ˙ŝ˙ŭö˙ò˙˙˙ñ˙˙öĝ˙˙ò˙˙üüúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ï˙˙ĝö˙ŭ˙ü˙Ԑš˙˙ŭĝ˙ú˙üüúŝ˙˙˙ġ˙˙˙ú˙˙˙˙üüúŝ˙˙˙˙˙˙˙˙˙˙˙˙óĝ˙˙ßĞ£Ìòûßŝû˙˙û˙˙˙ĝ˙ü˙˙úó˙˙˙˙˙ĝù˙˙ù˙ĝ˙˙˙÷˙˙ú˙ü˙û˙ûñü˙˙˙˙ŭ˙÷˙ò˙˙ú˙ü˙˙ġ˙ñó˙˙ô˙˙˙ü˙ú˙˙ö˙úġ˙˙˙ –Ü÷˙˙ŝ˙˙˙˙˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷¸ Ìüŭ˙úúùŝ˙ûû˙˙˙˙ĝ˙˙˙˙˙ù˙˙˙˙˙˙˙˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙ş˙´˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙ÒĵŜĈÍ ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙¤éĥ˙˙ġ +Ğù˙˙ϳûŝÖÌ& ™˙î˙˙˙ûü˙˙˙˙ûùúûúĝŝ˙˙˙ú˙ü˙ŝ˙ŭä" ™Ï˙ĝ˙Ŭ¸˙û˙ùóĝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôù˙ˆ˙˙ÍŜíú˙˙ú˙˙û˙˙˙û˙˙˙üüó˙ŝï˙˙ù˙í˙ûî˙÷ü˙˙ñ˙ü˙˙ò˙öĝ˙˙ôŭ˙ŝ˙˙üú˙˙˙˙˙ŝ˙÷ĝŝŭ˙˙ûê˙˙˙÷ò˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ÷˙ú˙ûŝùŭ˙ù˙˙˙ġûë˙˙˙ŝñ˙î˙˙ñ˙˙ĝ˙úüŝ˙˙û˙ù˙˙˙÷ŭü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙û˙û˙Ħ,Ùüŝ˙ñÚ×ĜĈ˙ûŝ˙ö÷ $˙ùÑù˙ž Ç˙úùûì˙˙ÙÛÑż˙˙ùô˙˙˙ŭú˙ñ˙˙˙˙ù˙ô˙úûĝ˙˙òġ˙˙÷˙˙î˙ġ˙ùêŝŭ˙ú˙÷˙˙÷˙˙ü˙÷˙û˙˙˙úĜò˙úü˙ü˙˙Ä˙˙˙ùñ'" ˙ï˙ûĝ˙˙ö˙˙ûö˙éú÷˙˙˙˙˙ĝ˙ôù˙˙˙˙ï˙ù˙÷˙˙ Â˙ô˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝí˙˙ôü˙˙˙ïŝŝ˙˙˙˙˙÷˙ĝ˙˙˙ŝ˙˙ŝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙÷Ë÷˙ñŝöû˙Ĵ Ĝ˙ê˙úŝ˙˙ŝ˙˙ŝ˙˙ûŭ˙÷ŭ÷˙˙ŭ˙ŝ˙˙ŝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ“4˙Í˙˙ü˙˙ûú˙˙üŝŝöô˙˙˙ŭúúú˙˙ŭ˙˙óŭŭ˙ŝ÷˙˙ö˙ŝ˙í˙ĝ˙˙û˙û˙üü˙ó˙ĝ˙ĝŭ˙ŭüûġí˙ó˙˙üö˙ú˙ù˙˙ŭ˙ŝ˙˙òë$'§û˙ĝ˙ùĝüŭ÷ü˙˙üúûŭŝüù˙˙˙˙˙˙˙˙ùê˙óÈüö˙ŝ˙ü˙˙ŭû˙˙ŝ˙˙˙˙ò˙˙˙˙˙˙˙˙˙˙üŝŝüü˙˙ü˙˙˙˙˙˙˙˙î2 ”ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙7"ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙˙˙öĝÓó˙ñò˙ÊŻ(˙ú˙ô˙ö Ĝô÷˙ £˙˙˙˙˙˙˙ŝü˙˙ŭüŭ˙˙˙ù÷˙ŭ˙ñ÷˙ŝù÷˙àĜ˙ü˙˙˙ŝ˙˙˙˙˙˙˙ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙ŝ˙§˙ġ˙ù˙˙˙ò˙ò˙˙üü˙˙˙˙˙˙˙˙ú˙˙˙˙ùö˙˙˙˙ô˙ŝ˙÷˙ü˙ê˙˙ß˙ŝ˙˙üó˙˙ûŝûŝ˙˙˙˙ó˙ĝü˙ü˙˙˙ġ˙˙˙˙ìŭ˙˙˙óúü˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙ëŝ˙ù˙˙ùé˙˙ú˙˙˙ëù˙ĝï˙˙ü˙˙ùġŝ˙éû˙ì˙ŝ˙ġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úí÷ġ˙ŭò˙˙ĵ–/š˙˙˙ŭ˙˙ġ˙˙˙öú˙úñ˙˙ó˙“#"Ùû˙˙ĝ˙ô˙öôûŜüĝ˙˙˙˙üŝ˙˙òú˙˙ù˙ŝ˙˙˙ô˙÷ú˙ŝ˙ùĜüô˙˙˙˙˙˙˙úù˙˙ġŭ˙˙üĠüó˙˙ñû˙ó˙÷÷˙ûôŭÊ˙ " úúù˙˙ ˙û˙ŭ˙ĉ˙˙ú˙˙û˙˙˙˙˙öùŝŝ˙ò˙˙˙òùö˙ù˙ö˙úé#ù˙˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭ˙˙˙˙ö˙ó˙î˙˙ûŭ˙ŭù˙˙ï˙ŝòüûŝ˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ô˙ŽŬ˙˙˙˙âġŸ ˙îġ˙˙÷˙üûŝ˙üö˙˙˙ĝ˙˙˙˙ġùüûŝ˙üö˙˙˙˙˙˙˙˙˙˙ñ˙˙ġ÷ĝÒ'"™ê˙üñ˙ö˙˙˙˙ï÷˙ò˙˙ó˙˙í˙˙˙ôûŭŭü˙ĝ˙úŝù˙ú˙÷û˙˙˙˙û˙˙˙ú˙ŭŭû˙ü˙˙î˙úŝ˙˙˙Íĝ˙˙÷˙ü˙ŭ˙ü˙ŝŝô˙ò˙˙˙˙œĞÉï˙üŭü˙ŭ˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüŭÄÊ˙ġú˙˙˙˙˙˙˙ŝú˙˙û˙˙˙˙ï˙˙˙˙˙˙˙˙ŝŭüüŭ˙˙ŝ˙˙˙˙˙˙˙˙˙ş˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙ŭÁ &˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷óü˙˙Ğ˙ö˙˙˙˙˙$âĝ˙ò˙ŝ˙ÈÍ˙˙÷-Ĉü˙ġòü˙ŭü˙öü˙˙˙üüŭ˙˙˙ñŝ˙˙˙˙˙ô˙•# Ù˙ì˙û˙˙óìŭ˙ŝĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üùŝ˙ùĜ áô˙˙ü˙˙˙˙˙˙˙ùü˙ĝ˙úó˙ûí˙Ġĝìġó˙˙üùĉ˙˙˙ŭŝ˙ï˙ô˙˙ú˙ŭŭ˙˙˙˙úŭù˙÷ü˙üü˙û˙ŝ˙˙˙˙ŭñŜŝġ˙ĝúüŭ˙ĝ˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ü˙˙˙óŝù˙˙û˙ê˙ü˙˙˙˙ŝŝë˙˙àġ˙˙˙ì˙˙ú˙˙ë˙ô˙˙ï˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙÷˙¤! šùò˙ô˙Ï˙ġ˙üġúŭ#Ĥ˙ö˙˙úş˙ĝ˙÷û˙÷˙˙ûöú˙˙ĝ˙òô˙ßô˙˙˙öù˙˙ïġŭ˙˙ĝö˙ĝë˙ŭĝ˙û˙î˙öŭï˙ù˙ċ˙˙˙˙˙ŭ˙˙ĝĝĝ˙ŭ˙ü˙˙ó˙˙˙˙ġ"(ĝü˙ä˙˙˙ó˙ñ˙˙ĝĝ˙ûô˙˙ì˙˙ġ˙˙öí˙úĉü˙˙û˙ûí˙˙˙˙ù˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭö˙ç˙ûü˙˙˙û˙˙ĝŭ˙À,Ô˙×˙˙ô˙ŭó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŻÁü˙ö˙îÇŞîÜ˙ġ˙üŝ˙˙ô˙ŭó˙˙˙öüî˙ú˙ŝ˙˙ô˙ŭó˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙Ëû˙ú˙ü˙ü˙ġŭàö˙˙ùüòú˙÷˙ô˙˙˙˙úë˙˙ŝù˙˙ùö˙˙ŭ˙ó˙öŭòûŝŝ˙˙˙û˙ùŝö˙˙é˙ŭĦĞ˙ôì˙˙˙˙˙óûôŝü˙˙˙ġ˙˙÷˙˙˙˙˙˙úû˙ì˙˙˙ŭ˙ġûĝûŝŝüü˙˙˙˙˙˙˙˙˙˙ĝö˙˙Ï Ì˙˙˙˙˙˙ĝôŝ˙˙ŝ˙ú˙ü˙ĝ˙ú˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙öĝ( Ÿò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙(ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙˙öż™˙ûë˙ŝË˙Ĥ˙óö˙ó˙ĝû*˜Íŭ÷ĠĠ˙˙˙˙˙˙üü˙˙˙˙ŭúûŝ˙˙ĝ˙˙ĝ˙úïû˙˙˙ Ï˙˙û˙ġ˙ú˙˙˙˙ŭ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùô÷˙”Â˙üĉ˙û˙˙˙Ĝ˙˙ġ˙ŝ˙÷˙˙÷˙˙ù˙˙˙˙ñÚó˙˙ŝüÏĊÛ˙ú˙ŭü÷˙Ë˙ñû˙ġÈÇçö˙˙ĝ˙˙öŝ˙ŝ˙ŝŝü÷˙˙˙í˙˙ô˙ú˙éáö˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ôŝ˙ġüßÛèóŬĈ˙ûġ˙ê˙ĝú˙Û˙ĝÛÀ“ĠÁ˙˙üġ˙ċĤ¸Ô˙÷û˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôú˙ĝúç˙îġû” ×˙˙˙ġ˙˙ü˙ŝ˙ò˙ öĝ˙ù˙#˙âċ˙˙˙ó˙ô˙ŭ˙òŝ˙ñ×Ğ×˙·˙љħ˙˙˙˙÷ôŝ˙ò°# žĜʧŭ˙×ÖÄÚ˙ñĝ˙Ĉ!™×˙˙˙ŭùûĠÁÍ˙˙û˙˙öÑ  ü˙ù˙ç+.ûó˙Ŝġŝ˙˙˙ûú˙ë˙ù˙ĦĤ ĝ˙˙˙ùü˙˙˙˙ïÈî¨"ĝô˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙öŝÜôÓʸ˙îŭ˙ö˙ż˙›˙Ñĝ˙úŭ˙ú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ìÖ(×˙ŝ×úùäžÑĝż¨ĠÖŭĝ˙úŭ˙ú˙ûġ˙úÖµ‘ñĠĝ˙úŭ˙ú˙û˙˙˙˙˙˙˙˙˙óĝŝĝöŸ'žç˙ì˙˙ó˙˙˙ô˙ô˙Êû˙˙˙˙ú˙ü˙ïúíúŝ˙ó˙ŝöô˙÷ù˙˙öŝ˙ŭÜĝ˙˙ó˙ġò˙˙üü˙ù˙˙‘ ¨úü˙˙˙ú˙˙˙˙˙˙˙òñû˙˙ŝ˙ŭ˙ôû˙˙üŭ˙ôôĝ˙ù˙˙˙˙˙üúûü˙˙˙˙˙˙˙˙ŭ˙îöŝ× +*Íò÷û˙ó˙˙ûŝŝû˙˙ġ˙˙˙îà˙˙˙˙˙˙˙˙˙˙˙ú÷úŝŝŝ˙˙˙˙˙˙˙˙˙˙˙š "œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙óŭŝ 0˘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭôú˙˙œ,‹˙˙˙˙öŝŞ%Ĉ˙ŝġ˙ï˙˙ĝô˙˙ôÓ ġ˙ü˙ŭóóŝ˙ŭ˙˙ŝ˙˙˙˙˙Ì˘Ä˙ŭ˙ö˙úñŸİ"šóŭ˙ŝ˙ĝŭù˙úû˙ŝ÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úġ˙ŭÛ¨+!Ûċ˙˙úŝŭŝ˙˙ü˙˙˙ŝûò˙˙òûùšŸ˙곑Ì˙ú˙˙Ħ ë˙ò˙˙£Ÿ˙) "(&ì˙ú˙˙û˙ç˘£ž¤Ĝܟµè˙˙éŭĥ#5“§˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷¤¤™'"—˙˙ù˙˙Ž*  Ĵ %üŭ˙ó.%$˙ŝ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô÷˙˙ß˙˙Ĵ# %û˙÷ĝ˙̔Żñúŭ˙˙,—˙˙ö˙°  Ò˙È˙˜ĤÀ˙˙÷˙˘ +,*ŭüúü˙ї#% Ϩ˙ò˙ Ĝîò˙Ĉ¤1œĝ˙ö˙Ò£˙û˙÷˙ ˙ܟ˜˙˙˙˙ġ˙ż˘ &' Áçö˙ŝúú¨Ĥ&ü˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ò¨˜(*¤ŭ˙˙ùŝ!%›œŝ˙ŝ˙ŝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä ˜Ğğ˙ô˙• İ 'œŝ˙ŝ˙ŝ˙ö׆+/œŝ˙ŝ˙ŝ˙ö˙˙˙˙˙˙˙˙˙˙˙ĝŻ—9—ĥÊ˙˙˙ü˙˙żµħĤĤšÙéÛóĝ˙˙éŭŭá˙˙ŭ˙È µĈŭö˙î˙œ’" Ŝñùž­ û˙˙ûġŝ¤" ÷˙ŭúĝŭ˙ú˙ô˙üŝ˙ŭ˙˙ôì˙˙ú˙˙û˙ô˙û˙ï×Î˙úú˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙÷ĠÑ˙˙ê˙˙ì˙˙˙ûŭ˙˙˙˙î˙˙ĝĝÎ˙˙˙˙˙˙˙˙˙öò÷üüûŭ˙˙˙˙˙˙˙˙ü˙ ˘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙ü˙ 1 ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭ˙˙í˙Ġ™˙ûġ÷˙˙Ŝ  áŭŭö˙˙ü˙û˙ùûŝü˙ŭÔĵÏ˙˙÷˙ŝ˙˙˙ı˜Ä˙ŭ˙Ö"£˙˙˙üó˙ÓÒ*’˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷û˙ŭóüĜ%½˙˙ë˙ĵ&ž# & Î˙ž ú˙˙˙# ) "İ˙ŭ˙ŭ˙˙Ĥŭŝ˙Ž + (˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûĝĴ&ÒùÓô£ &( —˙ûĝÓÍ* ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ–*ĵŝ &˙˙˙ĝ(ŝ˙ûü)¨ûúŬú•'" Óù˙™(,ü÷˙û2# ) $˙ĝ˙˙ñŸ˙ž ,û˙ #ñ˙Ì˙˙ü˙ôü$ ù˙ò˙÷) *ü˙ù÷˙Ç,ÙÖËß˙˙˙ú˙ %& ˙û˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ) ˙üú˙üÌ˙û˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!  ħŭĠÇĤÌ˙û˙ü˙˙ ˙Ô¤Ì˙û˙ü˙˙˙˙˙˙˙˙˙˙ŭ˙ûž '&İ˙öŭ˙óÓ# ž˙ù˙ġ!Îù˙ó˙˙ê˙ÈݕУĜò˙˙˙ÈÑÙÊ×ŭ˙ŭÎʧÊĈ× Ê˙ó˙˙ËùÔŞË˙ú˙ü΢˘ ˙ÒÒÑÑÌÌÛò˙˙ü˙˙˙˙˙˙˙˙˙˙úÌ˙Ë! Ö˙É#²è˙˙ĝ˙˙ùúŭ×ÊНÏÓ˙˙˙˙˙˙˙˙˙û÷ü˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ñ˙˙˙ü˙û˙˙öŭ˙˙˙ŭö˙˙ü˙û˙ùŝ­!˙˙˙˙˙ŝüû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙×Íġ×˙˙˙˙˙˙˙˙ŝŝà˙Ÿ —˙˙˙˙˙ó˙Ħ£! ˙˙Ó ! &—ŝĠ˙ġùܜݕ'Ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙%%Ôù˙ö £ŭ˙ô" '$Ê˙Ÿ˙˙÷Ż !¤˙–%˙˙ŭú˙œ÷Ñ$û˙š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ù &§ôٟ !˙˙ôÓ Ñ˙ú ˙˙˙È˙ó˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝŝœ"•˙ÊŞ!û˙˙÷% ˙˙ġ˙œ$ü˙˙˙˙İ’Ğù˙ûôĤ§È˙ú˙Ê ! ˙˙Äİ÷˙˙ÏÓ˙˙˙˙ ˙ŭÚ˘$•×˙úœ ' ù˙˙˙ §ö˙˙÷˙ Ÿ ˙÷˙ù˙%˙ù˙Ñ×ŭ˙÷˙$ $ '!ġ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĦ "ž ŭ˙ó˙Ë # %Ä˙ġŭ˙ûú˙˙˙˙˙˙˙˙ŝ˙ŝû˙˙ôß!# Éû˙ĝÍ “Şİ Ÿ˙˙ŭŭÇĠŭ˙Í˙˙˙˙ĝŝ˙˙˙˙˙˙˙˙ü˙˙ŽĦ˙÷˙·ÊĦ˘Ĥû˙ŝ§Ÿŝù' ˙˙ó×ŭ˘İ•˘ Ï˙˙ù *#Ħ˙˙üž$Ġù˙˙ñ­œ˙÷˙ŝ$"! ŝ˙˙ù˙˙ó˙˙è˙ü˙û˙ĝÄ, Í - İüĝ˙÷˙Ê#  ­ŭ˙üö˙ô¨–ž˙ŭ˙ò˙˙×ñ˙úú˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙û˙ĝ˙˙öù˙›ž¨Ÿ–°˜î˙˙˙ûô˙Ê' ÷ĝúüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Í Ó˙ó˙˙˙˙˙˙˙˙˙ôÈ* ›'ŝĝô˙˙1ž˙ĝ˙“ÀôŭŬ "(È˙èŭ˙˙˙ÎġĤ$˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ïò§ ï˙˙÷üĴ%§Ĝ '”˙ĝ˙Â&  ˙ìÍ "Îûŭ˙ö° ˙í˙˙&Èŝ˙÷ß Ì˙˙ò Ï˙˙îÌ!žŝž,ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ï˙#! É˙ô•& ùŝ˙úŭ* İ˙ÍÍ˙ùŬ  –* µ˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĴ Óû˙ë˙ ï˙üġ˙  ˙ò˙˙˙’ Ĥ˙˙ôŭŝĊñôĝ˙ù˙˙ŭó˙˙Í$'£˙üú˙˙ôĈ%°˙ġ˙Ÿ°ñôĝü,Í˙üÔ›˙ù˙Ŭ( ˙ûġ˙ ˙˙ö˙ñ',ú˙Ó ı˙ÖĝÚ#*%í˙üï˙ÌÇòàô›ö˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê&'˙˙ü˙Ÿ #ĝô˙˙˙—˙Íŭü˙ĝ˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙úç˙ Â˙Íî˙˙ì˙ù÷÷û˙)˙˙Ì+ $+ûúüŭ˙˙˙˙˙˙˙˙˙ĝù˙˙—£üÒú˙˙˙– û˙˙˙˙ , Î˙ĝ˙˜£˙ŭ˙ɕ% û˙˙˙ĝ˙#&á˙˙˙­ïĈ˙Ù ),! Ğí˙ĝ˙#Ê˙Ö#" ˙Ĉ˙˙£ŭĠ˙×& œ'&Í÷û˙í˙˙ñĝ˙˙˙ùŭŝ˙À!)ü˙Ö!ó˙è˙˙Żš×˘ ĝ˙ü˙&!˙ü˙óúû¸™Ÿœ#É˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ú˙û˙˙É,˙ú˙é˙˙˙&ôġĝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ï-&Ëî˙˙˙˙˙˙˙˙˙ü˙%×˙ġÓ$)˙˙ŭò£ ¤%#Ó˙˙òßĜö˙˙üÍĤŭÈ(&˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙%"è÷úü˙ûÇá˙ñ˙&˙˙˙˙&ÈÊŻŭŝ˙ĉ"Ü˙˙öß˙˙˙˙˙ÌħÀ˙˙É& ĝ˙ó˙"/˙˙ö˙Ï ×Í ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ö˙˘ "ŭ˙˙˘&ûù˙˙ú˜5˙ôŝ˙˙¤›&ÎÄ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óÏô˙ò˙è%Ö˙ñô˙÷Ó-˙˙˙öóĞ˙˙ë˙˙Ħ$Èúŭû˙˙÷úŸĤü˙˙ö˙öô˙û˙&!ü˙-˙÷˙ìÖ ˙˙ù˙ù˙,˜ÏĝôĠ# ž˙ŝú˙˙+˙ŭ˙˙öĠ ñí˙˙˙˙ #˙ŭôö˙Ĥá˙˙% %Ġ› ½˙˙˙˙˙¤ ×˙˙˙˙ü(£ù˙úñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ĥÓ˙ó˙ùú–"’˙öú˙Ëú˙ö˙˙ü˙˙üġ˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙ûí˙Í%#ûïŝ˙˙˙ĝ˙ĦÓ˙˙˙ŝ˙” ˙úö ħ²˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙ŝë˙Ï Âò˙˙é˙öÙ÷ú÷úĝÒ!ö÷˙âÉù˙˙˙ĉĝñ˙ġì˙.†˙˙÷˙ú·˙ġôë˙˘ûŝ˙ü˙ŝ˙˙Ĉ˙ûôċ"˙ŝ÷˙˙ )Ĉŭû˙Ġ#˙˙ú­˙˙˙˙ŝü˙ôĝ÷˙˙ĝÛ'œóí˙Òà˙Â˙÷ —˙ŝÖ. ñ˙)Ÿ#%˙ġ˙ë˙˙™%% Öü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙˙û˙ú˙˙'˙˙ %—ŝ˙ŝ÷˙( ™ûüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÉÈ˙˙˙˙˙˙˙˙˙˙˙$¨ûôâû "Îùùâ"!&”ú˙ù˙ü#Î˙˙ñ˙Ÿ›˙ŭ ,-µ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úï˙ìóú˙ùù!Ü˙ô˙˙‰ )™ñ˙óÙĴ˙Ñ÷ú˙˙ÊĦ$ġ˙ü˙à˙ ™˙ûöñÚĊ˙ı˙Áüü˙ïüŻŝúŝ˙˙˜-# ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ĝû˙˙ö˙ùö ˙ŝ˙÷˙˙Ş˘ö÷˙ù˙˙+˙˙ŭ˙É˙ŝûŝ˙ĝòĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ßĝ˙˙˙ĝ–˙ü˙˙Ò÷žôĝŝġ˙Ġ–˘óí˙÷ó£ Ŭĝ˙˙ôú˙Ñ!³ñ˙˙˙˙ö!›˙˙˙˙ú¨é˙“˙ŝ˙˙˙(“Ŝ˙˙˙î“ 3Î˙˙˙˙"!&ï˙ĝï˙&¤ê˙ñú˙Ġĝ˙˙öï˙ĤÄ˙˙˙˙ŭŞı˙ŝ˙Ü÷˙ù÷˙˙˙í˙ñ˙!!òĝô˙öô˘š˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ôúž'&íŭ˙ŭÙ ÇñÒ˙ĝ÷ŭ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙ŭûŝ˙ŭôçà" ˙˙ûñ÷ó˙˙ ú˙ò˙ġú¨$í˙˙' )˙ĝ˙˙ô˙˙˙˙˙˙ŭ˙üü˙˙˙˙˙˙˙˙ġû÷˙˙˙Ê$ ˙˙ŭ˙˙öž( ˙˙û˙˙˙˙³˙˙óó!×÷üùòË˙˙˙ü˙û( Ùôùû˙ œö˙˙ŝ˙Şö˙ñ˙ü˙˙ù÷˙ò!.Ħñ˙˙è˙ä!Ûŭ˙˙˙™!˙˙Ë˙˘ #ìŝ˙óġ˙ĝü˙˙˙˙ġú˙×&"ŝ˙˙è˙Êî˙˙—(Íŭü $&–˙à++˙Ö ó˙˙í˙ñ —ĠΒ,%ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ùü˙ùû" û˙“$ŭĝ˙˙ .˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ( Ġĝ˙˙˙˙˙˙˙˙˙˙˙À,˙ò˙òŭä™ġ˙‚%™*çŭıÑ˙ü˙öŝàË˙è˙ġ÷îġ˙ÑÔż˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ú˙˙İê˙ĝ˙ŭ˙˙˙ôü˙ٝ˙˙ú£ ĝ˙î˙ŭ˙ŭúİÛ˙ŭ˙ú˙×˙ê˙˙ú˙òû˙Ü˙÷ñ˙Ġ˙˙ù˙ĝ˙ "Šŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙˙ó˙û¨•œ0ŝö˙úïÊ%˙˙˙ë˙ûé Ÿ˙ĝô˙˙˙ŭù˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ—% ˙ô˙˙ĝ˙-˙˙ĝôü˙˙˙˙˙˙ŭ›˙ö˙˙˙Í* Ïŝôùŭ˙úĝ–˙÷ô˙˙û¨˙˙ôġ˙¤Ş˙˙˙˙4—äé˙ŭ Û˙˙òù˙˘)˙÷ġ÷ĝ  ­˙ù˙˙ùœ×˙˙ĝ˙ñ &Úï˙˙ġ˙ž ŝ˙˙ûì˙˜ùùü( §ŝË˙ŝ˙ô˙˙˙˙˙ûü˙ü˙˙¨İü˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙úĊšÂ1 !˙˙˙˙˜2Ñ˙ġùüû˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙Í +˙˙˙˙ü˙Èİŝŝ˙˙˙˙Œ˙ĉÖ!˙ùù˙˙÷òŝü˙ûü˙˙˙˙˙˙˙˙˙˙ù˙˙óÙñÖ(!žÍġŭö˙œ# ˙êû˙ó˙˙í ġŭ˙˙Ż˙ŭ˙˙ĝ£˙ûô˙ġùĦöû˙˙˙˙šŝï˙˙è—˙Ì˙ü˙öŭŭ˙ü˙˙ œ˙ñ˙˙ġĥ(“˙ġó˙˙°İú˙˙ï3˙˙ŝġ˙˙ï˙òŭŬ˙û˙ÍŸ˙Ì˙˙ŭ#Ì˙úè³  #&' ˙ħ˘ùÑ˙˙" ˙ñ÷˙Ú# ˙ï˙˙“#ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙ŝü˙˙ù­5§÷˙˙˙)˙˙˙û˙# ˙ŭŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¨(Êüù˙˙˙˙˙˙˙˙˙˙Ħ˙˙ŝ˙ô%çú˙Ô ˙˙î˙û˙˙˙˙˙ü˙ŝñ&˙ü˙üï û˙˙ġŭ˙˙ŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭô˙ñüö!Èŝŝòŝ˙ ˙ó˙˙ô˙Ħùüù!( Ïŝ˙ë˙ù˙˙Îú˙ĝ˙öÍŭ˙˙é˙¨ü˙˙üŜ Ä˙˙ü˙ûĝ˙˙˙û˙ $ ##˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŝ˙ŝÍÔŭ˙˙˙˙Íû˙ŝ˙ö˙£)“˙˙˙ñ˙÷˙˙˙ĝ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙"2½ö˙ü˙˙Œ!“ŭ˙˙˙ / ŝ˙ŭ˙é($ï˙ú˙è"&ŭ˙˙˙öÜŭŜŞû˙˙Ú˙ž è˙˙˙ú, ż˙ĝŝ˙Ħ˙˘š˙˙ċ˙˙÷#˙˙˙˙âë˙˙˙ö˙˙ö˙ĝ˙ ˙˙öù˙˙Ħäâ˙˙˙ŝ ,•˙˙î  ˙ô˙ŝò˙ì˙ö˙Ùü˙ù˙Ġ£˙ñ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûüà–(!! &˙˙ġû  Ïġ˙û˙ûû˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó’'ŝú˙ü˙˙ùÁ¸ ˙˙˙úñ˙úù#ħú˙úĝ˙ö˙˙˙˙˙˙ŭ˙ü˙˙˙˙˙˙˙˙ù˙ġ˙˙˙—˙×ö˙˙ ™ì˙˙ô˙˙ó˙™ 0˙÷˙˙È˙î˙ä×!˙˙ú˙ú˙œž˙˙˙ûóġĠü˙úŝë!™˙öùĝ˙˙ü˙˙ʟ #& ġ˙ôî˙Ĝ ˘˙˙˙˙÷3Â˙úü˙ÔÖ˙öŭÇ£¤5û˙ġòà™ĝ˙˙û÷! Úû˙Ġ#¨³šÌ˜•˙˙˙ŝ˙ġù˙ŭŸ"˙ü˙îž ¨ġ˙ñüÒ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ï˙ç ,Ä˙˙ìû˙Ş˙ú˙üî°Ĵîŭŭŝ˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ % Ü˙˙˙˙˙˙˙˙˙˙ó˙Ÿñ˙ŝ˙öôŞÍ˙ü‘'Ċü˙˙üŭù˙ó˙ï˙ŝ˙ĴÈô˙˙˙! Çú˙˙˙ŝ˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷˙ù !×ô˙˙˙˙ §ü˙úüĠĝžĤŝ˙Ĵ )˙ĉ˙˙ü˙÷ġ( µöú˙˙ÛÒü˙ô˙É£ú˙÷òĝ˙Ħ£×ò£ù˙ú˙ì˙˙î˙ìé Ĵ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ûŝ(,ŭú#˙ô˙û˙§ )˙ò˙ú˙˙‘˙˙˙˙˙ûŝ˙ëù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ$%(ĝó˙˙)˙˙˙Ö &ùô˙ùû˙ Úö˙î˙ "˙ŝó˙˙ó˙Ħè˙˙çôĤ°˙ñ˙óĝ˜Ŭòüù˙£Ĵ##Ñú˙˙ĝ˙˙÷˙û÷” ˙ĝó˙÷˙&Ôô˙˙˙îĴ,!ôù˙˙óĝ¤%Ô˙˙ñ˙˙¤˙ù˙0Íö˙ò˙ù˙ù˙÷ñ ú˙˙ì˙› /÷Ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙’Ÿ˙ŝ*çŭ˙öŝ¤#!Şûî˙ŝĝĝ˙˙üĝû˙˙˙˙˙˙˙˙üŭŝ˙ŭüüŝ˙! ˙˙ü˙óĝ˙˙¤ ˙ġ˙ġ˙¤ ñ˙˙Çĝ˙óí˙ġŭñöĝŝ˙˙ú˙˙˙˙˙˙˙˙˙ìû˙î˙Ŝ+“ûġ˙ŭû##²˙òè˙ú˙òŭ'Œô˙ó˙"%ü˙˙˙¨  ùŝ˙ñ˙˙˘˘ùñ˙ġ˙ŝèù˙ŝ˙ñÚ˙˙˙˙ŝñ˙ßǘ/˙˙ù˙˙ò˙ĝ˙÷) ˙ĝü˙ü˙ ,ż˙ú3 +-  ü˙˙Ì›ßó˙˙ŭ#Ëŭ˙Ö#ó˙ó˙ŝû˙˙öòû˙ŭ˙˙˙ì•£˙ŝ˙˙™˙òŭ˙Î ¤ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝÓö%˙û×˙ž%ĝ˙ô˙˙!˙˙˙˙˙˙ŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ħ# %Ê˙ü˙˙˙˙˙˙˙˙˙˙  "˙ŭ˙÷×Ĵ ž˙ù˙Ë š˙ŭ÷˙ŝ˙˙ĝ˙ŝ˙ñĜ) Ó˙ùŝҖ%ž˙˙ŝ˙˙ŭù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙!˙ùö˙ŭó˙ë˙ŝöĠ%Ë˙˙ò)˙˙ĝ˙úñ˙ü™' ˙ü˙Ÿ˘ŝŝ˙ôÚ×÷˙˙˙˟˙˙ùŝ˙÷˙öÓĠ˙˙ĵ§ š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ùú˙ Û˙˙ &ŝ˙ö˙ò"˘˙ü˙ù˙Ÿ ( ö˙˙ùŭÑ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ә- ŝ˙òüĞŭöÜ÷Í!˙˙˙˙ó!˙ĝ˙˙ #!üü˙üû˙û˜$˙˙˙˙ÎÑ˙ï˙˙™–ü˙˙ù$٘ÑÏ˙ü˙üö˙˙²­ùŝ˙ û˙ġ˙ĝĦĤ˙Ìŝû˙¤Ò˙ó˙ŝ˙Î˙˙÷˙ö÷˙˙œ !›˙ĝ˙Ĥ”˙˙˙Ÿ!Şġùèñ§ !°ùì˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö×˙ûŝ!á÷ù˙˙˘ ˙˙˙÷˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙üÓ¨ŭ˙û˙ö˙˙ Ë˙ó˙Òö˙üĝŻùü˙ûĝ˙ÎÔ˙˙˙ù˙˙˙˙˙˙˙˙˙˙ġ˙˙ĝŝŭĤ²˙ŝ÷˙˙ ˙ŝ˙ŝ˙ġ˙˙˙ŭ˙˙$Úûö˙ŝÌÓû˙˙˙üŸÒ˙ùú˙ŝ”˙ü÷˙ĝŭ˘ŭ˙˙ġ˙˙˙–$šî˙Ħû˙ú˙óĦ˙ö˙ü˙˙˙ŝüö Ì˙óÖ  Ĥ˙˙!ŻÓöŭ˙ô¤ŭ˙ÍÑ˙˙ġ˙ŭġŝŝ˙˙ö˙˙—˙× İó˙öú˙˙˙˙ġ˙™˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ŝ×˙–%˙›§ Ùŝûü˙úĤŭ˙˙ö˙É˙Óü˙íü˙˙úô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙˙ô˙ĝÈÍ˙úûĝû˙˙˙ŭŭ˙ûžŭ˙ö˙üŝ! Ħ˙ü˙ÌĦ˙˙˙üŭŝ˙ŝ˙˙˙–!Ü˙ù˙˜ ˙ô˙ö˙úĞÏñ˙˙ú˙˙ù˙˙˙˙˙˙˙˙˙˙ŭŭ˙ ˘ùû˙ò)òü˙ġ˙Í˙˙˙ô¨ Úñ˙˙ŭü˙Ç! *È˙ò˙Ô ¨ŭ÷˙˙Ôİż˙ôŬ ÓûÜù˙˙ü˙˙ù˙ÒÒû˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ûô $$  ŭ˙ö˙& Ï˙ô˙˙ġŝ!Ι*òú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙÷˙ôÏ"û˙˙ĝÍ!ġ˙˙ŝú™ üûġ˙˜Í¤Úù÷žù˙˙÷˙™ĦÒÍ˙˙ % Żĝŭ˙Ġ˙˙ŝ˙÷˙˙ò˙ó˙š "Çû˙ ˙˙ŭŝÓ'˙ŝî˙˙"˙ġ˙˙ ĝüûûĠ˙ŭ˙ü Ĥ§Ĥö˙ŝÌ !žù˙˙Ĵùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§˙ú“(§˙˙›ÎÒò˙è˙˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô £˙Ïġ˙ü™$ó˙˙˙˙˙üʧ˙ÔŭÔ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ú˙˙“àûü˙ù¤ž˙ÌÌ˙ó˙£ŝ˙üŝû#!˙ġ˙˙¤ŝ˙ûñ˙‘&Ç˙˙ŝü˙ Ì˙û˙ġ˘"üŝ˙˙ŭû› ŝñ˙˙˙ú˙ü ˙öù˙˙Ÿħò˙ĝ˙ Òû˙ġĠ˘!Ħ˙ŭŭ˙Ñ£ôĝ˙˙˙˙úÍÑ˙˙ûŭ˙˙˙˙ŝôߛö˙ú ™˙ŝ˙ġ  ûùú˙ŝ¨™˙ġ˙ç˙˙ö˙ùŝ˙˙˙ĝû˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙é˙ş&£¨˙#£ò˙˙˙û!Ġüü˙…Ò˙˙ñ˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ùġ˙ö˙Ëñ˙˙˙ú÷ŭ˙˙˙˙ġ *˙ö˙ç˙˙8˙˙êû› !™öú˙ɐŝö˙˙˙™ò˙˙ö˙›×Ÿ.à÷˙˙ú˙˙ŭ˙˙˙˙˙˙˙˙˙ö˙ġö û˙ŝö& ˙˙˙ñó½#¤ùñŝ˙š -­Ïüöüó˙ #—Ġ÷Ÿ0×˙ŝΊ#!³ĝ˙Ĉ+Ôñ˙ŝóġ˙üŝûö˙ú$!ĤêÉ!"İ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙÷Ê% "#ù˙˙ž$$íû˙û˙üÓ  (Ç˙˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÌ 3 œ¤¨ü÷˙­! '•˙û˙#&Ħ˙˙˙ ,ĵÛŻ È˙é˙Ñ"£˙ĉ0&˙˙˙3²œĦħ—#˙î˙ñ˙ûöĵ &#˙ì˙'# ŸúâìĤ ! ˙ù˙(›˙˙ġ›&$Ÿò˙˙ĝ# #Ó˙ŭ˙#İ) )! çüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ş$"!( Èüü´" ,İġêĝĝû˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òÄ* *üî×˙óÜ*Ğù˙˙—  ¨ %í˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ò˙!È˙üü˙ß ­öà˙˙“!Öŝû˙ġ–˙ò­!Öì˙úÇ4ĦĜ˙˙ôÏ'ë÷ŭ˙ù§˙îŝŭ˙è Ô˙Ÿ Èŭ˙˙˙ ġ˙˙˙ñ% ï˙˙ŝĥ Ó˙ç˙ïÑŞĞ˙ĝ˙ú·"˙˙˙ü˙ •è˙Ù%İùòĠ˙ŭûò˙ŭ˙˜˙Îç¤ġ˙ŭ˙.ˆ˙˙˙˙Ê˙˙ï˙ú›İÒ˙˙ŝ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙è˙Ó*’ö×˙ĝú˙˙&İö˙öŭ. ĉ˙˙˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôú˙ó˙ùכ """&Ĉĝ˙˙ûû˙˙˙û›-œ˙÷ŭá (˙˙ú˙˘*)û˙ù“>´ö˙˙èÌ!.£öŝ˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙ŝùĜ.˙ùĝ˙ Âìùû˙˙› ' ˙˙ŝ˙%+ ¤ó˙Ħŭ§6£ûü˙'ÖÔùÜŝ˙˙˙ôĞ)$ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüü߇")°$—ŝ˙ü ,&ü÷˙ü˙˙î˙ħ $!ÏÜ˙èö˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ġ§ 7À˙ü³ &ġ˙Ñ &˙öóÎ%˙û— ´üü˙û - Ê˙µ!Úö˙ñ#"!†ûŝ˙˙ù˙í,#(˜$ %–˙ŭ˙"Öŭ˙( (ċ˙ġ !Î÷œ$ "§ġû˙$" &”Ûíüü˙À0î˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙'& !˙˙É"Ğĝùûù˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö—% §˙Ŭ 'Í˙˙Ĉ&ŭë÷˙Ψ"$%ĴĞ˙˙üŝûŭ˙˙˙˙˙˙˙˙â˙ĝÌ$!#ü˙ûòßĦ"ˆ˜Û˙û˙ü˙˙ &"  0ÉŝġÒ& (Ìù &Ÿ˙˙˙ġ˙ (%ó˙Ò & #ŭ˙óô 7˘ġ˙ŭ$" ˙ôóÌ !ú˙˙˙˙˙˙˙˙ü˙£ŭòò˘ ,˙û˙œ! ˙ġ˙Ċ#&˜üú  Ñ˙î–'½ñĠù˘&˙÷Ĉ˙Ö#íö˙˙è˙ï˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ù˙ü˙ù˙ú2 ÖŞ$™˙˙˙ñ  ˙ï˙˙Ğ˙ïê˙ŭ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ù˙ô$Äì˙˙ŝü˙˙ġ³"Ùó. )˙˙ŭù•1¤˙ŭ˙% %ŭ˙ö˙ü× Ŭ÷˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙ò˙˙Á'Ĥĵ˙ú˙%Ĥñŝ˙ü˙ % ŝì˙ÊᝓĦŸ¤˙úġ˙ŝŝ˙öÑ˙˙˙ë˙˙˙˙ġ˙˙˙/’£›˙öé˙˙!žÏ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŝ¤Ĥš×ÈùÉĞ Ùûù˙š &Ĵ˙ü˙ûġ˙˙˙ğ)ŭûö÷˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úí˙˙ù &˘$ˆ˙˙ŝŸ * ú˙ĝ˙ħ˘ú˙˙˙!ÉïúŻ*úüö˙˙›İž˜˙üΣ£™– ˙˙ñ˙(  -Ŭ÷˙˙˙˙טœ™Ĥ•˙Ëİ–˙ç˙ôœ’šŝġôΛ¤œĞ”˙ŝÒż”ޝ£—Ŭ÷¸•˘™Ż›É˙˙òï˙ú˙˙×˙÷ú˙ñü˙˙ó˙˙˙˙ѐĴ˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŭ°“ž°û˙úœĝ˙óü˙÷À“’­˙ù˙˙ŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ş§­Ô˙É˙üûûġ˙ù˙÷˙ġ˙ŝú˙êŝ˙˙ĝ˙öì˙•Ħ–úŝ˙ü˙˙ġùŭ˙˙˙˙˙˙˙˙˙˙ŝù˙‰!ŞĤ†Ú˙ŝ˙üù˙Ô¤Şµ°—£˙ïôġ˙˙ööÒ!£˙ ™ Ùû˙Ĝ†š­™Ññ˙Ğœ”ž š˙÷ì˙÷Ġš!ž˙ŝ $¨Ż. ˙ġ˙ÙÑ˙›Á˙Ĥ #İ˙ê˙ġ˙ó˙˙˙˙ù˙+(¤˙˙!–ŭŭ˙Ż  ü˙˙&! Ş(- ñ˙Í#˜Ú˙éÏž˙˙ò%·˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ù˙û˙ï˙Ħ%' $šĝÑ˙í˙Ÿ! Çġ˙˙˙ùûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû÷˙˙Ç!#ĤßÓñŭ˙ûŭ˙˙ù˙ !˙û˙ġ˙˙´.—ĠÏùĝ˙óÍ×˙ÁÒàÈ˙˙˙˙˙úŝÊ  *ëò˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ġ“ĊÖ˙˙÷˙˙ ˙ÔÈ˙ï˙˙ŝôĜË˙ÚÚŝ˙ó˙˙˙ö˙÷òŝüġĝü˙˙ù˙˙òŝŭ˙˙˙úú˙˙÷ü¤ &#/(˙ú˙óüÛ “%˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙û˙˙ŝô˙˙˙˙úùŭ˙óŭĠ%Á˙ó˙úù˙˙ŭĝŝ˙ËĊŜÒ˙ŝ˙÷ó˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙áÁ×ĊÎ˙ÔŬË˙˙˙˙ûâêÌßÌ˙˙í˙˙Ûż˙ö˙˙íÜÛÖÇÛú˙˙˙ÉĠıÌÙù˙˙ġ˙ïù˙ġ˙˙öŭŝ˙˙˙˙ê˙˙Ï  $ "" ìŭ˙ò˙ú˙ü˙úÙ˙ôô˙ñ˙˙˙ñŝ˙ŝ˙˙˙û˙ĝ˙˙ŭ˙öĈ˙ù÷ŭ÷û÷÷˙˙˙ĝûúŝŭô˙ü˙ñ˙ŭö˙˙ûŭü÷˙˙˙˙˙ú˙˙íŝ˙˙˙÷˙ëŝÒġô÷˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŭó˙ù˙íó˙˙ëìû˙˙˙ô˙é˙˙˙˙˙ŭñŭ˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙ñĝ˙öûú˙ŭù˙ùŝ˙ġ˙˙ê˙˙˙˙˙ó˙òû˙˙ŝé˙˙˙ŭ˙ù˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙öó˙ö˙úúóĝ˙è˙˙ôĝú˙˙÷÷ü˙˙îÍ˙üġ˙ŭ˙éö÷˙˙ŭĠÏËÙô÷ÛÏŭ˙ŭù˙˙˙˙˙ŭ˙ô˙üò˙˙ŝĊ˙ôû˙˙ì˙Ó˙ÓÚóġ˙˙˙˙ÊÑÏĝì˙½Ħ˙í˙ò˙ŝ­ Ş˙ŭ! ĦË˙ŭ÷ž Ĉ˙ï˙ûñ˙ŝïóŝ˙öö  #’˙óÈŬŞŝ˙˙Ĥ- 0™˙˙˙˙' #Êû˙˙˘ŸĝùĠ 2ñöö !•úè˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙ò˙Ñ0 )˙ŭ¤"˙ġġÑ #›˙ú˙˙ĝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ċ˙˙š˙˙˙˙û˙ò˙˙˙˙˙úú˙˙˙÷ü*'÷ŝġÏ Ñ˙ô˙˙ò˙ŭ˙˙—šĦäŭ˙û˙˙˙˙î˙˙˙â˙˙˙í˙÷˙ü˙Ϟ›Ì˙˙û˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉ˙œŞÓ˙˙ú÷ô˙šÑġ˙˙ò˙ì˙ú˙˙˙ŝĝ˙˙ü˙ü˙ġ˙˙û˙˙ú˙˙˙ĝ÷ö˙ù˙˙˙˙˙öĝ˙ŝ˙˙ú˙“ ™Œâİ˙˙ŭ˙÷óî˙˙˙í÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷÷˙üüÒ˙˙û˙ù÷˙ü˙˙˙É˙ß˙˙˙˙ŝü˙˙˙ĝ˙ô˙ú˙üòŝ˙˙ŭ˙˙ûŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙ê˙ŭ˙˙˙êûî˙˙ñü˙ŝ˙˙÷ú˙ŭ˙˙˙ġŭü˙˙˙˙é˙˙Û˙ŝ˙˙ò˙ö˙˙˙ŝûö˙ŭ˙˙úâñŝ˙üùŝ˙ġ˙ïüûë!áŝŝŭ˙ȍ&˙˙ŝùġ˙˙˙ĝ˙ö˙˙˙óÓ˙ĉ˙˙˙èĝ˙˙ï˙ö˙ñġŭ˙÷˙ñ˙˙˙öÚ˙ŭû˙˙û˙ġ˙˙úü˙˙˙˙ëŝ˙ò˙˙˙˙êöĝñ˙˙˙˙ïë˙ó˙˙ü˙˙˙ôö˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙úûĝü˙˙˙˙˙˙ġ˙ġŝü˙˙óöŝöüú˙ú˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġû˙˙˙ü˙ŭ˙êúĝôŝ˙ë˙˙˙˙ïôó˙ô˙˙˙˙ú˙ä˙ùùÚï÷˙˙ü˙˙˙üú˙˙˙˙˙˙˙˙˙üĝ˙˙˙ĝ˙ŝ˙˙˙í˙˙˙ú˙˙˙ĝŝ˙˙Ñ˙˙˙ûŭû˙˙˙òñ˙ĝ˙ŝŝ÷˙÷˙ù˙ò˙˙ôüö˙ô˙ġ˙û˙˙ùħ˙˙óü˙÷ò˙ŝÙ˙êû˙˙íü˙˙÷˙˙˙ë˙˙ë˙ü˙˙ûùġùù÷ú˙˙˙˙ö˙˙ï˙˙˙Ġ÷˙˙ŭê˙ò˙öŝ˙ċ˙˙˙üŭ˙˙֋˙ñ˙ï˙˙ĝ˙ï˙ó˙ĝ˙˙ĝö˙ġŠ$&Îú˙âûĴ$ü˙žĠ˙èûĝù˙Ŝš˙˙˙Ù  $¤úĝ˙ù˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝ˙ŭ˙ù¤“¤ݏ§ µï˙÷š›”µÀ˙˙÷Ġ˙ê˙˙ò˙÷ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ü˙˙ôù˙ù˙ìú˙˙ö˙ġŝ˙˙ŭú˙˙˙˙ĝ˙ôô˙ĝü˙ôûŭ˙ô˙˙ŝ˙˙îí˙û˙ĝ˙ùóù˙û÷˙˙÷˙˙ü˙˙ĝö˙˙˙˙ŭû˙˙˙ŝŭ˙ìŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭô˙˙ĝì˙ô÷˙˙˙˙ŭ)ŝ˙˙ïü˙˙ġ˙ġ˙˙òù˙÷˙ŝ˙û˙˙ù˙öúüĝ÷úŝ˙˙˙ù˙ŭùò˙˙ŝ˙˙ġúĠ""˙˙˙÷û˙Ë0˙˙ŭ˙˙˙˙˙ñ˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üöî˙˙üŝûŭö˙ì˙ĝú˙˙˙÷˙ĝġŝ˙ġ˙˙ùúë˙˙ò˙ŝ˙ô÷˙÷ùŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙ŭ˙ùüñ˙˙˙˙ù˙ü˙˙ô˙˙ò˙˙ê˙ö˙ù˙ĝ˙ġ˙˙ê˙˙˙˙˙˙÷˙˙ñ˙ôê˙˙ŭ˙˙ëĝ˙˙û˙˙˙˙˙÷˙ŝ˙˙˙üÜ%ï÷˙˙˙˙(ġġ˙˙óôŝŭï˙÷˙˙˙ûê˙ó˙˙˙˙˙ü˙˙˙ù˙˙˙üò˙ëŭ˙í˙úúù˙˙˙ë˙üú˙˙˙˙˙ġò˙ï˙˙ö˙˙ĝ˙ü˙˙˙ûê˙˙ĝ˙˙˙˙ĝò˙ñ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭĝü˙î˙˙˙ï˙úó˙˙˙ûô˙÷˙˙˙ŝŭ˙ŭ˙ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙öüù˙ùñ˙ñ˙˙ó˙ú˙˙˙î˙˙˙˙ûû˙ĝñ˙ŭ˙üŝ˙˙ü˙˙ŭûĝóŝŭ˙˙˙˙˙˙˙˙˙˙ú˙ú˙ìü˙ĉ˙ċ˙÷˙ŭöüġ˙ù˙˙˙ú˙ŝòô˙í˙˙˙ġ˙ô˙ì˙˙˙˙ó˙˙˙ö˙óú˙ï˙û˙ù˙ĝ˙ê˙˙˙˙˙ö˙ġ˙˙˙ûó˙ù˙÷˙˙˙ü˙ù˙ôü˙ôŝ˙˙ï˙ŭû˙˙˙˙˙˙ġù˙ûŝ˙î˙˙ġ˙ŭ˙ġñû˙ù˙˙÷ŝ˙˙ġëü˙ê˙ñú˙ŭ˙˙˙î˙˙˙˙˙˙è˙˙ġ˙ŝŝ˙ô˙˙òÍ˙ó˙ĝ˙˙˙í˙ñ˙òù˙ë˙˙óù˙˙ŝċû˙˙˙ûï˙˙˙ŭġ˙÷ì§) Ġü˙˙û˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙ŭú˙ú˙˙˙˙ŭú˙ô˙Ġù˙˙ò˙˙˙ù˙ú˙ğ˙ŝ˙üúŭ˙˙˙˙˙˙˙˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ûŝ˙ö˙ô˙˙÷û˙û˙˙ûŝ˙˙˙˙÷˙ùú˙öú˙ŝù˙˙û˙ú˙˙ù˙÷˙ŝĝ˙ûŭŝŭ˙˙ûû˙˙˙ú˙ùü˙˙÷˙ùê˙ú˙˙ŝ˙ĝ˙˙÷˙ŝ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ó˙˙ŭí˙ġ˙ŭ# ˙ġû˙üŭù˙˙ĝ˙ü˙ŝ˙ŭ÷˙ü˙ŭú˙ù˙ŭŝ˙˙˙˙ûû÷˙ô˙ŭ˙˙˙ŭ˙˙ûŬùŸÏĝ˙˙ŝô˙ Ï˙˙˙˙ûĝ˙ê˙˙ġ˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙˙˙ŭ÷û˙ü˙˙í˙÷˙˙ôü˙˙û˙˙ùö˙úö˙˙˙˙ûŭŭ˙ì˙˙˙ó˙ġ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ŝĝ˙˙ö˙˙˙˙úú˙û˙˙ï˙˙ô˙˙û˙˙˙ŭ˙ûö˙ŝ˙ñ˙˙ñ˙û˙ù˙˙ú˙˙ó˙˙ú˙ù÷ŭ˙˙ŭŝ˙˙üûŝ˙˙î˙ĝŭü˙Ô¤ò˙˙û˙ñú¨ ˙ŝöŝ˙˙˙˙˙ġ˙˙ġ˙ü˙ûŭ˙˙÷ŭ˙úŭ˙üü˙ŭúû˙˙ñ˙˙˙˙ü˙÷˙ûú˙˙˙ù˙˙÷ŝù˙ô˙˙ö˙˙ù˙ö˙˙˙ñ˙˙ùü˙ĝ˙ô˙ô˙ò˙˙˙˙ŝúû˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙ô˙ĝ˙˙ú˙˙ùĝ˙˙˙˙úûü˙ó˙ĝ˙ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ġ˙ġ˙÷˙ô˙ĝü˙úŝ˙ĝŝ˙˙ĝ˙ŝ˙üûŭŝ˙˙÷˙ŝó˙˙í˙˙ü˙ú˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙ò˙ġ˙üĝ˙û˙ñ˙˙˙˙˙˙û˙˙˙ŭ˙ŝ˙ü˙˙ûô˙ú˙öü˙ûü˙ĝ˙ĝ˙üġ˙ŝ˙÷ĝ˙ó˙˙ŭ˙úú˙ò˙ûû˙˙ŝ˙üû˙ŭ˙÷˙˙˙ô˙ûŭŭ˙˙ŝ˙û˙ùö˙˙ŝŭ˙ŭö˙˙ùŝ˙ŭ˙˙˙ü˙ŭü˙ú˙ŝ˙˙ŭ˙ù˙÷˙˙ò˙˙˙˙ó˙˙˙˙˙ŭ˙ŭû˙ŭñ˙öŭó˙ĝ˙ŝ˙˙ŝû˙ĝö˙˙ñ˙û˙ïġ˙ĝ˙ŝô˙˙ï˙úô˙˙ŭù˙˙˙ìŭ˙˙˙ô˙úŝ˙û˙ÖĤŝü˙ŝŭŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙˙û÷ ˙ëŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙§£ô˙ĝĈ˙ÉÑ˙û˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÎË˙ûĠö˙˙ Ïö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭŝ˙˙˙˙˙ö˙–&“Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˘"%ġ˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûéĴ'$—˙˙ŝ˙ەÂ˙˙˙öŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙) $ıĈ¨˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙ĝòöҜ"ž˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙) Ÿ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙û- " Ż ĦÄ˙˙ĝüù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝîŸ ( ùŝŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ôéÉİ +!û˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙! Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúϖšĦİ•žú˙˙ùŝ˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙˙ĥ›µħ£ĝŝ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ûô˙Ô³‰ùÉ˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ûü˙ÇÓÑÏÎÓŬ˙úöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôġ˙˙˙˙˙˙Ì˙˙˙ûò˙˙öúŭ˙˙÷üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙óö˙˙öŭġ˙î˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙ĝ˙ú˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ùù˙ù˙ĝ˙˙˙öü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ÷˙ĝù˙ùüÍ˙ŝö˙˙˙ŝŝŭùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙˙˙˙÷˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ûúŝ˙ò˙ġô˙ċû˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙˙ŝö˙˙÷ô˙˙ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ÷˙˙˙˙ŝ˙ù˙ó˙˙˙ŝŝûĝôĝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝ˙ó˙˙ò˙ùù˙ë˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝüüŝ˙˙üü˙í˙ŭ˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙üŭŝ˙ùüö˙˙ûŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙üùú˙˙˙ŭö˙˙˙ĝ˙˙ü˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ġ˙˙ŝġ˙˙˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙˙˙˙ġ˙û˙˙ġ˙ĝ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭ˙ö˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ù˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ĝġ˙û˙ŭġ˙˙öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙˙ĝ˙˙˙ü˙ö˙˙÷˙ù˙˙ŭû˙˙˙ü˙˙˙ŭû˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙üûüû˙ûĝ˙ĝŭĝ˙˙˙˙˙˙˙˙˙ûû˙˙ü˙ó˙ŭ˙˙úŝ˙ĝ˙˙˙˙˙˙˙˙˙˙ü˙˙úŭ˙ŭ˙ö˙˙ôû˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûñú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ô˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ëú˙˙ü˙˙˙ûû˙ŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ġŭ˙ĝ˙û˙˙˙ŝŝ˙ĝŭ˙˙˙˙˙˙ŝú˙ù˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úòû˙˙˙˙˙˙ġ˙ġ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭ˙ŭ˙˙ŭú˙úŝ˙˙˙˙˙˙˙˙ôŝ˙˙˙ü˙ŝŭŭŭŝ˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝúŝ˙üûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûġ˙˙ù˙ôú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġû˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ôù˙ôë˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙úú˙˙ŭŝ˙ô˙ŝú˙ŝ˙ĝ÷úŝŝŭ˙˙˙ú˙ò˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙˙úôö˙˙˙öü˙ŭ˙˙˙˙˙˙˙˙ù˙ë˙ó˙˙òŝ˙ú˙ü˙ŝü˙˙˙˙˙˙˙˙˙ûïù˙ûù˙˙˙˙öùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ù˙ĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙óü˙ùŭû˙ù˙˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŝ˙˙˙ŭ˙ġûŝùŝ˙˙˙˙˙˙ûù÷ôó˙˙˙˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ûú˙˙˙˙ġġ˙˙˙ĝġ˙˙˙˙˙˙˙˙˙˙ù˙ö˙˙ġù˙ó˙ù˙˙ü˙˙˙˙˙˙˙˙ŭ˙ô˙˙˙îùġô˙˙˙ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûûûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûö˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùó˙˙˙óñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙òü˙˙˙˙˙˙ŝŝ˙úü˙˙ú˙˙úáü˙÷˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙ŭġ÷Öĝôĝ˙ú˙˙˙˙˙˙˙˙˙˙ò˙˙˙ï÷˙˙˙ù˙óŭ˙˙˙˙˙˙˙˙˙˙í˙˙ġí˙˙û˙Üò˙˙÷˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öúüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝâóù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óü˙˙˙Á˙›–ó˙÷ü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙û˙˙ŝê˙˙ŭ˙˙˙üö˙˙ùù˙ŝô˙˙ú˙üŭ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ûŭ˙˙ö˙üĝ˙óó˙˙˙˙˙˙˙˙ĝŭùŭù˙ñ˙˙ġ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ü˙ë˙˙˙î˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ĝ˙˙Ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙*!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü÷˙!Á˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙Ŝž ´úŝĝ˙ŭŝ˙˙óÉĦ §¤ž˙˙˙û˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ù˘—ĦÍñ˙˙˙˙˙˙˙˙˙˙ú˙ĝ˙üò§£§šó÷˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙먧—™ÔÜ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭàÑż°˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙ŝŝ%˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È$ üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŝ İôü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ôäġšü˙ü˙úĝ˙˙‘&  ˙ġ˙÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ö˙ü™!%&½˙˙˙˙˙˙˙˙˙˙˙î˙# °Îù˙üŝ˙˙˙˙˙˙˙˙ô˙˙Ċ""Ċù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙˙ú˙˙ô˙û˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙ö˙˙˙ò˙˙ú˙ ž˘ŝô˙ŭù˙ü˙˙˙˙˙˙˙˙˙÷˙˙ŭ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ĝ˙ü˙˙˙˙ûŝ˙ŝŝ˙˙ù˙˙ûŭ˙ú˙ŭ˙˙˙˙˙˙˙˙ĝ˙˙ù˙ĝ˙˙÷˙˙÷˙˙ö÷˙˙ú˙˙˙˙˙ŝ˙ŝúü˙ġ˙˙ĝ˙˙˙ĝŝ˙˙˙ĝŝ˙˙ù˙ùû˙˙ê˙ŝ˙ŝû˙˙ûô˙˙üú˙÷˙ŝŭü˙˙ôŭ˙˙˙˙˙˙˙˙˙˙ĝ˙÷ŝ˙ĝ˙˙ŝ˙˙ó˙ûö˙ŝúĴĞ ˙ûú˙ŭûŝ˙ôŭ˙ĝ˙ü˙˙˙ü˙˙ùŭ˙ò˙ú˙ú˙ú˙˙ŝöü˙ĝû˙ù˙ñ˙˙˙ü˙ĝ˙úŭ˙˙ó˙úŝ˙ġ˙úŝ˙ĝ˙ú˙˙ì˙û˙û˙˙˙˙ò˙üĝĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñŝŝŭ˙˙ĝû˙˙ûü˙ú˙˙üûû˙úŝ˙ò˙˙ġ˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙üü˙˙ú˙û˙˙ĝ˙˙˙˙˙˙˙˙ĝ˙˙œĦÍ˙˙üö˙˙˙ŭ˙ĝüô˙÷˙˙˙÷˙ö˙˙˙˙üĝ˙˙ú˙üŝü˙ĝ˙ü˙ô˙˙öû˙ŭ˙÷˙˙û˙ûŝû˙ġŭ˙ú˙ûû˙ŭô˙˙ĝ˙˙˙÷˙ü˙úú˙˙˙˙˙˙˙˙ü˙ŝ˙ô˙˙˙˙˙ĝ˙ú˙ö˙ŝ˙üÑĊú˙û˙ŭ˙ŭĤ˘ ˙ù˙˙ó˙˙˙ŝú˙˙˙ĝŝ˙ŝô˙ù˙ñ˙˙û˙˙ù˙˙úŝ÷˙˙˙˙ĝ˙˙ŝûŝ˙û˙ù˙˙ġ˙ö˙˙ŭŝ˙ŝ˙üö˙˙˙˙˙˙˙˙˙˙úù˙ŭ›#¨ŝúúüŝ˙˙˙˙ò˙˙˙Âħ Ş˙ù˙ûŭŭûŭ˙˙ŭûŭ˙˙ĈŸÚí˙ûġ˙˙ŝ˙óŝ˙˙ú˙˙˙˙ù˙˙÷ŝ˙ú˙ùú˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙î˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙öö˙ó˙ü§×˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙ò˙ò˙˙ö˙˙#˙˙î˙˙ŭ˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùùŝ˙˙˙ŭ˙ûü÷˙˙˙ġ˙˙˙˙ûû˙ŝùòŝ˙ŭúü˙˙û˙˙÷÷˙˙û˙˙ŭóö˙˙˙˙ŝú˙˙˙˙ŝ˙˙ûĝŭúù˙˙ùô˙˙ŝĝü˙î˙˙òú˙˙ôŝ˙˙÷ĝ˙˙ñ˙˙ŝŝû˙˙˙˙˙˙˙ŭö˙˙˙˙˙˙˙˙ù˙û˙˙ŝ˙û˙û˙÷˙˙ŝú˙ĉ! $œĜç˙˙˙÷˙˙˙ġŝĝû˙ŭ˙îú˙ú˙˙˙˙˙ú˙˙˙ööî˙˙ĝ÷˙˙˙˙˙ġ˙û˙ĝ˙˙ü˙˙ûü˙ċ˙˙˙ü˙ŝŭŝ˙˙˙ñú˙˙ŭ˙˙ï˙˙ôŭ˙Ñĝ˙˙÷˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙É!$ Ú˙ü˙˙˙ŭŝûŝĝ˙ŭüô˙˙í˙ô˙˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙ûóú˙˙ŝ˙˙ù˙û÷ŝ˙˙˙˙˙˙˙˙˙˙î˙˙ñ" #˙ïú˙˙ôùñ˙ö˙˙˙ġ˙˙ĝú˙÷˙˙˙ñü˙˙ŝûŭ˙ì˙˙ö˙ü˙˙ó˙˙ŭ˙ġ˙ŝ˙˙ö˙˙ĝĝ˙˙˙˙˙˙ñ˙˙ċ˙˙˙ï˙öŝŝ˙ĝŭî˙˙˙˙˙˙˙˙˙˙˙úĝ˙ŭ˙˙ùġöû˙ú˙˙ĝñ˙˙˙¸$ Ì˙˙˙˙˙÷#˙˙ÜË(Ċï˙òî˙˙˙ò˙˙ûô˙˙ŭ˙˙˙˙ġ˙˙úù˙˙ûŭ˙˙˙˙˙ùĝô˙˙ö˙˙˙˙˙˙ŝŭüû˙˙üü˙üüúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ!'ŬÉ İî˙˙˙˙˙ŝŭ˙˙˙ŭŭŭ˙ö"˙ñŝ˙÷˙˙˙úú˙˙˙ġ˙ ˙˙Ĥ.Î˙é˙ŭ˙îô˙˙˙˙ú˙ôüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È­–ĴĴ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙û˙˙Ì"š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙ŝ˙î˙ù˙÷˙ú$ ¤È˙˙˙ö˙˙˙˙˙˙˙˙˙˙ġûùŭ˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûùŭŭ˙ŝŭ˙˙˙˙ŝûŝ˙˙˙ŝöó˙ö˙ŝ˙˙ûŭ˙˙üú˙˙˙û˙ùĝüù˙˙˙˙ùü÷˙ùü˙˙˙ĝùúŭ˙ŭùùŝóùû˙˙˙ù˙ĝ˙˙ü˙˙ŝ˙˙ú˙˙üŝ˙ó˙˙˙˙˙˙üñ˙úġ˙ŭ˙ùĝë˙˙ĝû÷˙ú˙˙˙˙˙˙˙˙˙˙ù˙ú÷˙÷ü÷˙˙ñĝ˙˙˙ô˙ġ( ˙˙üŝô˙ñé˙˙˙˙ö˙ŭ˙˙˙ù˙˙ë˙˙ûúĝ˙˙˙˙˙˙ġ˙ö˙ñ˙˙ŝŭ˙ú˙û˙˙ö÷úó˙ö˙ö˙ŭùŭ˙ü˙˙˙ù˙˙˙éùö˙˙ò˙˙˙üŭ˙ùí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úÑ")Žô˙˙˙˙˙üû˙˙é˙ŝ˙˙ü˙˙˙ŝĝ˙ç˙˙˙˙˙˙˙˙˙˙ö˙˙˙ĝ÷ŭ˙ĝ˙ŝú˙˙˙ĝ˙˙˙˙˙˙˙˙ö˙ôÛ˙"•ùŭŝ˙˙ŝ˙˙˙ñġ˙ŭ˙î˙ö˙˙ü˙˙˙˙˙ñġ˙˙ĝ˙˙˙˙˙ï˙ú˙ù˙ŝöúŭ˙ŝ˙˙ô˙˙üċ˙ùŭ˙ù˙ŝ˙ñû˙˙÷ĝùú˙˙˙˙ù˙˙˙˙˙˙˙˙˙ùü˙˙˙˙ŭ˙˙ŭñ˙˙î˙˙ï÷öúŬ™Ġĝ˙˙÷òŝÈÔùÊ˙ûê˙öù˙˙öüü˙ùĝ˙˙˙ü˙˙öŝĝ˙˙˙˙ŝ˙üûŝú˙û˙ŝ˙˙ŝ˙˙ù˙ù˙÷˙ö˙˙û˙˙˙ŭ˙˙ŝ˙˙ŝ˙˙û˙˙˙˙˙˙˙˙ï˙ûì.­î˙˙ûġ˙ôúŭŝŭúùü˙÷˙˙ĝ˙Ñ' ˙˙ôû˙ôŝ˙˙˙˙ŝô˙  İî˙û ñ˙˙˙÷˙˙˙ù˙ùò˙˙˙˙ùûùù˙˙ŝ˙ùŭùŭŝüüŭû÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙&!Ñŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙ö Ÿ5§˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭü˙ù˙üŭ÷˙ì˙ÂĦ˙ŭ˙ĝú˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ü˙˙ŝŭüü˙˙ñ˙˙ŝ˙˙˙˙úŝ˙˙˙˙˙˙˙ùûòö˙ŝ˙˙÷ŭúúŭ÷˙ŝ˙˙˙˙ĝŝ˙ŝ˙˙˙˙˙˙˙˙˙˙ĝŝ˙˙˙ĝ˙˙ĝŭ˙úúñ˙ĝ˙˙˙ô˙˙ĝúûòĝ˙˙˙ùŝ˙ó˙˙˙˙ûŝ˙˙˙î˙˙˙˙˙˙˙˙˙ŝùŭ˙ŭ˙˙˙ŭŝĝ˙˙ùúò˙ü˙ ­ùûŭù˙˙˙˙˙úĝö˙˙ĝûôŝ˙öù˙˙˙û˙ù˙üŝĝóŝ˙˙úùúóŭ÷˙˙û˙ú˙ü˙˙˙ŝĝ˙ô˙˙üû˙˙ŝ˙ô˙˙ġŝ˙ŭ˙˙˙ò˙˙˙ñ˙˜Üĝ˙˙ï˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÄĞ˙˙ŭóû˙˙˙ŝ˙ù˙˙óġô˙ò˙˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙ĝú˙˙˙˙˙˙˙˙ô˙˙ú˙˙˙˙˙˙˙˙˙ü˙öö˙ ·ü˙˙ë˙óö÷˙ù˙ü˙˙˙˙˙û˙˙˙üù˙˙˙˙ñ˙˙ô˙˙˙ŝô˙ó˙óô˙ú˙˙˙˙îô˙ŝòï˙ġ˙˙÷ç˙ŝ˙ú˙˙˙ú˙˙˙˙ñ˙ê˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝĝŭ˙öġü˙÷ùŭ˙˙˙˙˙ùΝÓĝ˙˙úŭ˙˙²,Ì˙é˙˙˙ŭñ˙˙˙˙˙ŭ˙˙üĝù˙˙ç˙ŭ˙ĝ˙˙ìŝ˙˙ùĝ˙ŭü˙˙ñö˙÷˙÷˙˙ù˙˙ġ˙˙ú˙ŝùêù˙üûŝ˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙ŬĴĦ˙ô÷˙˙ġ˙˙ŭ˙˙˙˙˙˙˙û˙ŭü˙üÍ$!˘˙ŭûŝŭ˙˙˙ŭŭ˙˙˙Ñ!À˙ú˙˙˙ "û÷ô˙ú˙˙˙ŭ˙˙˙˙˙ùùġĝù˙˙˙˙ŝ˙û˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙  *œü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙!É˙˙½Ì˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ü˙ô˙˙˙ĝ˙˙ò˙Ì  'êâê˙˙˙ï˙˙˙˙˙˙˙˙ù˙˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ü˙˙ö˙ùöùŭ˙˙˙˙ú˙ü˙ŭñ˙˙˙ŝ˙˙ŝôĝ˙˙ù˙˙˙˙û˙ü˙˙˙˙˙˙üôûùŭ˙üŝ˙˙ŭ÷ĝ˙˙˙ùüŭ÷ĝ˙˙û˙˙˙û˙˙˙˙˙˙˙ŭ˙ñ÷ûŝĝú˙˙˙˙˙÷ûŝ˙ûñ˙ŝôï˙ö˙í˙ûŭ˙˙˙˙˙˙˙˙ŝü˙˙üûùĝ˙˙ôü˙˙˙˙ö˙ŭŭ&( ŭŭ˙˙ò˙ŝüûüúâ˙òŝŝ˙üŝ˙ú˙˙˙ôûŬôŝ˙˙˙˙ë˙ĝ˙˙˙˙ĝ˙˙ùü˙ùö˙˙×˙˙˙ŝ˙˙ûú˙˙û˙˙ġ˙÷˙Ìĝġ˙÷˙ï˙˙˙Ì&ó˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙  ˙˙˙úŭŭù˙üò˙ġ˙˙ŝ˙÷˙ú˙˙ô÷˙Ô˙˙˙˙˙˙˙˙˙˙ŝöòöü˙ê÷˙ûú˙÷ú˙˙˙˙˙˙˙˙ġüĝ˙ü úñ˙ùú˙˙˙˙ŭ˙˙ü˙úĵ˙˙ç˙˙˙úö˙˙ï˙˙˙ù˙ŭïû˙˙˙ûó˙ôù˙ŝŭĝü˙˙÷ŭ˙˙î˙˙ĝ˙ŝŭ˙˙ŭ˙ċùû˙ŭüô˙˙˙˙ŝ˙˙˙˙˙˙˙˙ûĝŝ˙úû˙˙Ñ˙˙ŭ÷ĝĜúŝöĝŭ˙ö˙˙˙˙ïû˙ŭöĵ%Í˙˙÷˙ùŭ˙˙è˙ù˙˙öû˙ùĝ˙ŭ˙óúù˙ĝ˙˙úù˙˙˙˙˙˙˙ûġ˙˙÷ù˙ùŭ÷˙˙˙û˙˙ò˙üŝè˙˙˙˙ô˙ŭó˙˙˙˙˙˙˙˙˙˙˙ĝ÷ö&ôô˙˙ûâ÷˙˙˙˙ûûŭŝüùŝ˙üŭ˙úÙ 0ġ˙˙ú˙˙ûû˙˙ûû˙Ö.ŭô˙˙‘ü˙ŝŭ˙˙÷ü˙˙íù˙ñ˙˙˙˙˙˙˙ŝ÷ĝ˙˙˙˙˙ûùùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û&(°˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˙ĝ˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙Öüġ˙ü˙˙¨!)İ˙ŝĝñü˙˙˙˙˙˙˙˙˙˙ò˙ŭ˙˙ŭ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŭü˙ï˙˙˙˙˙˙ŭ˙˙˙üû˙˙˙˙˙ó˙˙ûŝŝû˙˙úŝ÷˙ŭîü˙˙˙ûû˙˙˙ŭ˙˙˙˙ŭúû˙˙˙ûüŭŝ˙˙ŝ˙˙ŭö˙ü˙˙ŝíĝ˙ï˙ŭüö˙˙ó×Ûù˙ŭ˙˙˙˙˙ŝ˙˙˙˙í˙ùŭ˙Î˙˙˙ġ˙˙˙˙˙˙˙˙˙˙ŭô˙˙û˙÷˙ŜÍû˙ċ˙˙ĝöÌ*î˙˙ñ˙ŝû˙ö˙˙ê˙˙˙ñ˙ü˙˙ü˙ĝ˙ù˙÷˙˙ìü˙ú˙ü˙ó˙ì˙ûŭ˙ŝü˙˙˙˙Í˙˙òï˙úö˙ŝ˙òù˙ö˙ŭ˙˙˙ö˙ü˙ù˙ŭè˙'ŭĝ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙›$˙é÷˙ŝ˙˙ó˙û˙úŝÉÍĝç˙˙ŝöû˙Ï˙ë˙˙˙˙˙˙˙˙ġ˙˙˙ŝ˙˙ö˙ÏÔ˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙òï++°˙˙ü˙˙˙ö˙ô˙û˙Ĝ˙˙˙úÌ˙ÜÁ˙˙üŝ˙˙˙ÄéŬä½˙˙ä˙ùò˙ùġ˙˙Ò˙˙ó˙ùŜ˙öö˙È˙Ìĝ˙ï˙˙üĠ˙˙˙˙˙˙˙˙ù˙˙˙˙˙˙˙˙ŝ˙ŭ˙ù˙˙úĝú˙˙˙ûÎò˙òö˙óŭöŝò˙˙î˙Ġ—˙ġü÷˙˙ŭ˙ó˙ŭÍùı˙˙ë˙˙öŭĉŸ!‘ú˙˙ú˙˙÷˙üŭô˙ùì˙ûŝòßŭ˙÷ĝ˙ġ˙÷˙˙ŭô˙ġĝ˙úŭ˙ú˙û˙˙˙˙˙˙˙˙ĝ˙Ĵ$ ˙ŝô˙˙˙˙˙ú˙ŝùĝû˙˙˙ĝ˙û˙óí˙!Ï˙ì˙˙˙˙ŭŝ˙˙ŝŭ˙Ÿ"˙˙è˙ï²%˙ë˙˙˙ŝ˙˙ö˙˙ŝ˙ùŝúôúġö˙ŭ˙˙ŝ˙ŭ˙ŭ˙˙˙üúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙•Óúü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñöÌ#é˙ü˙ŝ÷˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòŝñŸ–´˙ù˙˙óħ&üŭ˙˙ò˙û˙˙˙˙˙˙˙˙˙˙÷úŝü˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ô˙×˙ôñŭ˙˙ĝú˙˙ġ˙ìĝò˙˙˙˙ŭû˙˙˙ì˙˙ó˙˙˙˙úò˙˙˙˙˙˙òŝÚ˙˙î˙ŭ˙ŝ˙˙˙˙˙ŭó˙˙ĝĝŭ˙˙˙ìú˙˙˙˙ùú˙ùŝèĠİ› ƒĈâ˙˙ĝ˙òŭ˙ÊĞ•£˙˙Î — ˙ŭ˙˙˙˙˙˙˙˙ĝŝûġ˙˙ĠĜ˘"ŽÜŝŝŭ˙Ù ŭ˙êô˙˙û˙ùÀ˜š§½˙ĝ˙˙İÒ˙˙ŭÙħ“˜›Ħ˙ùĝ£ŸĴİŭ˙˙ö˙˙ï˙çĠ› Ş!µÁ˙ù˙÷óĞ˙×ó›ı‰˙˙óú˙ßŝü˙Úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ”İžĦ¤è˙ĝ˙úĝĴ›()+ÇùÍ °˙˙˙˙˙˙˙˙˙ĝóú˙úĤ î˙ò˙˙˙˙˙˙˙˙˙÷ù˙‘Ĥ˘Ÿ™ŭ˙ĉ˙˙óä Ĥ¨ò˙óú˙ë¤ $ ¸èĝ˙˙˙˘›¸ôß2  Ş˙ò "ÊŝÓ Îñħ¤'Ÿ×˙˙˙˙˙˙˙˙ŝ˙ìß ·¤Ÿ œÍô˙ËŻÚÛ˙˙ŭ˙Î˙˙ùó˙Ë §÷˙˙˙ĝò˙ûͤ)Ĉ˙ö˙ŭ˙Ÿ$ &Şùŭŝúóé˜6àŭ˙ Ş–ŻÀ˙˙˙û˙˙ôàž£ĤŸœŝ˙ŝ˙ŝ˙ö˙˙˙˙˙˙˙˙˙¨İ $ ˙˙˙ŭ˙ü˙ú˙û˙˙˙˙˙˙˙˙ô˙ĝ˙éĊ‘#˙ùî˙ŝüŝ˙˙÷÷˙˙ŝÏç˙˙ù˙ ¤˙ŝ˙û˙ö˙˙ŝ˙˙˙˙ġ˙˙˙˙÷˙ĝ˙ŭé˙˙˙üü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÒ˙ÒÚ˙ù˙ġ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙š"û˙ŝ˙ü˙Í"í˙ÎÈĠÈ˙˙˙˙˙˙˙˙˙˙ùÒÍÓÙëÛ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭúÑٖĊŞĝ˙˙˙ŭü˙Ĉ!' Çù˙˙ĝ˙˙貙ĠÏù˙͕ÊúúúúÊ*È˙ö˙÷ûûÜÓŭ˙ä²'ĠÛ˙˙Ÿ*Â˙öù˙ŝ˙˙˙&!Ĥ˙˙ŝ˙˙Ä!" '”˙˙˙˙˙˙˙˙˙ĝ˙˙ù˙½8# %˙˙ûï˙) ˙ĝ˙˙ôúÒÓ!÷˙ô˙Ë! ÒÄ˙  ˙˙ö˙ŝÓö%İ˙ġ˙Ê ¤›¨  ˙ô˙ŝù1 ™˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òĤ$#˘˙˙˙ù˙–)"ž˙  &˜˙˙˙˙˙˙˙˙˙úù*$ĥí˙˙˙˙˙˙˙˙˙ĝ˙ú˙˙ Îú˙ü˙!# # Ĝŭ˙˙™$ ˙ĝû˙$.˙Ç & !˙§ÖÙ #˙˙˙˙˙˙˙˙ö˙Ϙ$ŻŝÓáô˙Ï Ŝġ˙˙—" %žÍ˙ĝ˙˙˙ó˙˘ "°˙úĝ˙Ñ   Ë˙˙˙˙ÌÌ˙Ìŭ¤üùô˙û˙Ï˘Ì˙û˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ö˙ÒÑÏŬï˙˙ñÛÎÊÏĠö˙˙ó˙šÏ$ Óû˙˙ûÓ '˙˙ô˙Ì˙˙ò˙˙·Ìĵ˙˙îŝù˙ËĊ³§ö˙ôâÏÈÌÚò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ùù˙÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙úò˙û˙ú˙˙!"Ï˙˙˙ŝô˙ú˙û˙Ó˙˙˙ĝû˙˙ùĠў  !Òö÷ŭ˙˙ûĝ˙ùÚŝÓÙŸ˙ĝ˙ĝ£¨ŝü˙ġ˙˙˙˙ú˙˙ŭü˙˙ĝ˙ŭ˙ ÔÖüŭ÷ÖùŸ£ŭ ˙˙ùŝ˙ô˙˙ŝ™!ĤÎ˙û˙˙ûŭ˙ŭ˙ŝ˙ŝĝ˙ù˙˙ÖÖ,“ŝ˙ŝí˙Ħ'˙˙è˙˙ "!”˙˙ژ!œ˙ó˙˘œİқ# Ğ˙ö˙û˙ü­œ˘ô˙÷˙Ħœ˙˙˙˙˙˙˙˙˙˙˙ú˙Ò˘—ݤ&ĝ˙îù°ö˙˙˙˙ó )˙ú›#$ %"˙˙˙÷˙ù­Â˙Üñ˙× œš˙ù˙ö!"ûûŝ˙˙û˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú›İ˙ú˙ô˙ "˙˙%*Ô˙˙˙˙˙˙˙˙˙ŝ˙ŭ˙˙˙˙˙˙˙˙˙˙ö˙˙˙#"!î˙üû×§ò˙ËĦ'¤ŝ˙˙šŞ—˙÷­ž˙Ġ"œ˙ŝ# ž£›'ùÛ÷˙˙÷˙ŝ˙˙Ï&Ê˙ó#Ë˙˙ÄÏŝ˙ùĠĴ˙öŭ˙üŝ˙£ŭö˙Ë˙ĝ° ¸û˙öÖ ²÷˙˙À$˙˙óŸ¤ŭü˙˙Ş ˜§#Òü˙˙ô˙˙˙˙˙˙˙˙˙Û"ĝò˙˙ŝÓ÷ŭï˙İ Ĥî˙û˙˙¤) $˙˙û˙Ê˙˙ë)$ûĝó˙˙—¨ó˙˙˙ó# œÓ˙ô˙ô˙÷˙ʝ˘"œ˙ŝ˙ŭ˙˙ì˙š Ĝŝġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ñ˙˜"˜Óŭ˙ĝ˙ú˙˙ŭê˙˙ŝûüĝú˙˙ú˙ö˙úŭ˙ù˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙ü˙ïŝ˙˙×5"Áûô˙˙Ħ›Ž·ĝò᜙â˙÷ġÚÂİ !áó˙ġ˙˙¸” "''Ï˘$  ŝü˙ŭü˙˙˙üŭü˙˙˙˙Ô-+$È˙˙÷ù+ *"—˙˙î˙ŝ˙ğ !)Ğ –˙˙˙˙ĝ˙ùó÷ŝú˙˙ŝûĝœ 0ÌĠ•  Ÿì˙—" òÓ ˙˙˙üĞȨĝŞ *´ġ˙˙5"" ˙ç˙˙Ñ$˙˙˙Ĝ 1Ħ˙ò!Ġë˙¨%'ú˙˙˙˙˙˙˙˙öü˙ö˙üúóż3˙˙˙˙½*˙˙öüòŻÉŻ $!›ïĉ  ³& £ûĝ˙˙›Ê˙ó–ü˙Ç˙Ú˙ġ˙˙£ ' %Żü˙˙úŝ˙ŭŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙–!! Ş˙ö˙ĝ£/÷˙Ó ´÷˙˙˙˙˙˙˙˙ĝ˙ġ› ĜÊû¨+ì˙˙˙˙˙˙˙˙˙˙úúŭ˙ÉÑҙ,!•˙˙˙Ô-ö˙+&™˙ÔĊÂ%"Ô˙ì˙˙’#˙˙ò˙£˙÷ôš"Ħû˙ù˙  ’˙Ë˙˙£˙í˙ŝ˙÷˙˙˙ö˙˙İ Ħ˙˙˙˘úû˙ú%"—˙÷˙ŭ˙ ¨÷Î˙ñŝô$Ó˙˙ġĠ/Ñ˙ûĊ!ï˙ô˙˙Ġ!&ûö˙˙–$˙Ìŝ˙Žö˙˙ù˙µŭĝ( ˘˙úŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙ñ˙öŽ(˙˙˙üè¨˙˙˙üġĦ%´˙ċ#˙ŭĝ˙öŭ˙Òô+$ÏÍ˙ö˙ö™' žĞ  –˙û˙˙( #*˜öù˙˙˙Ŭ¤  #ŝŭŭó˙÷ħ°'˙óê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ÏŻ¨$"ñ˙˙ŝ˙ž’²Żôú÷ü˙˙ŭû˙˙˙˙ó÷˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙Ċ "" ¨ùŭ²6—Ŝ &Ġĝ˙›&  Ìġ˙úŝ 1!#$! 5 ,Ĵ˙˙ŭ˙û˙˙˙˙˙ŝ˙ù˙¤"!!ô˙˙˙“°–&&ĝ˙˙ú˙Í)‡˙ûÎ0˙úŝ˙ĝ˙û˙˙˙˙˙úùĝ$' ˙î˙ Ğ˙˙ ùÉ˙Ħ›˙üû˘"Ÿ˙ñ˙2˙× #˙ŝ˙ö" Óùİ ""½Ğ˙˙üÊ Ûúûĝò˙$$™ü˙Ï#$“˙ú÷Ä$£˙˙˙˙˙˙˙˙˙ù˙Ĉ!3 $˙úöû "˙é˙˙Ĉ# !  $ĠïÔ ŽĞߝ" ŝë- £ġ˙÷ò'!­˙˙úĦ,ü˙ö˙š˙˙é˙%™ż˙ġñ˙ñ˙÷ŭ˙˙ŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙-´öŭîÒ¤˙û˙Ë % ˙+(ö˙˙˙˙˙˙˙˙˙˙˙ò˙Ĝ˜ï˙˙˙’ "˙˙˙˙˙˙˙˙˙˙˙ŝ˙üû7˙ġ˙˙ùï*ñ˙˙Ĥŝ˙ç˙˙Ħ !ŭ˙û˙˙Ç&˙˙˙üĤ È˙ŭÍ"Ħġ˙˙§ ˙˙ê˙ĝ£ !Öû˙Éü˘!˘˙ŭ˙û˙ú˙öüöü˙Ċ'£úžĤ˙˙û˙˙´$(˙ùù˙ö&˙˙ö˙˙Ĥ˙ĝ˙ŭû׍–ĝ˙÷Ż›ùŬî˙˙û Û÷ù˙˙ ' û˙˙ċ·˙ö˙˙ŝ /$˜˙˙Ž!óú˙ŝ˙ŭ˙˙˙˙˙˙˙˙û˙Ö #%ŭ˙ö÷˙ô´ŭŝ˙ô˙"%“Óíô˙˙œù˙˙ñ˙ž/ üŭ˙èž˙˙˙ú˙×”˙˙˙˙ġöÇ!ŻÓ˙É1˙ü˙˙6İç˙Ŝ ˙ù˙ĝò לĴ! ³˙Íŭš"•˙˙ż*+ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ï#  "$ĦÇô˙˜  ˙ŝ˙ûò˙˙û÷˙˙˙˙˙ëö˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙òùǤ+ "# ĉ˙  ê˙§Òżá˙˙ڗ $ $¨§".Ÿ¤ ĝ˙ñ˙˙ŭ˙˙˙ŝŝ˙ĝ˙ö$ ĤÌö˙ìûğ #›˙ĝ&Îŝ˙ĝ˙ĞĴ˙É˙ %˙ù˙˙ŝ˙ŝ˙ĝö˙˙ò˙˙) üö˙üÑİĈ˙ġĞ˙˙ù˙ô˙%ġ˙˙öú˜!Çŝ˙˙÷Şŝù˙˙Ĝ˙ŭ˙˙ à˙Ëûö!ĥ˙½˙¤(˙ô˙ħ!˙ŭû˙˙ċ˙ĴŝŝÚ#Éó˙û˙­˙˙˙˙˙˙˙˙üüö) " ğôŭúŝ˙î˙úî'(˙÷˙$ ˙ùí˙% Ò˙˙˙ ˙û˙İ # œ ˙ûúùù˘ŝ˙áĤħñ˙˙û­äÊ˙ûó˙ĝŭ÷ŝúġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ö—˙˙˙ñäÏ˙˙˙˙˙˙ĝŝ˙˙˙˙˙˙˙˙˙ö˙˙ĉ˙˙˙ôĝÉŻ ˙ġ˙˙˙˙˙˙˙˙˙ü˙˙÷´˙ŝëŭ˙˙(Ğ˙úü(#˙˙ü˙ïĝ² ##Ÿ˙ö˙÷÷ÒÂ˙çúÍòûħ% ž˙Ù˙˙˙öġŭ§ ŭù˙ï˙$›ú˙˙ù˙ŝ˙˙ù˙ûùü¨$˙Ġ%Ĉ˙ĝ˙˙˙˙!ñŭŝü˙“'“ĝö˙˙À›˙˙˙˙˙˙˙˙˙Ŭ˙ô˙˙ġí˙˙Î˙˙˙ĝ$!˙è˙ö˙š Ñóü˙˙ ¤úœ'¨ú˙˙÷˙ü˙˙˙˙˙˙˙˙˙˙ ˙˙÷˙˙ĝ£Ôûü˙ĝ˙˙˙ÇĨ ˙÷˙üĝ˙˙ġ˙Ż˙öĝ˙˙Ċ#¤ĊÏò÷˙˙Ù ûĊÔĝĤüû˙˙ûò%%ŝ˙˙ôĞ!Ĥ˙ĝú˙—#!Ġ˙˙ûĤ$ŭ˙˙"˙ù˙˙ ˘ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üîċ§ !­İнĦŒ˙˙ŝ ,'"úüñ˙˙˙˙ü˙˙üòŭú˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙ù˙ %"œÒÜì÷˙  Ĉ˙İ "˙˙ô˙›&˙ê˙Ĝ"À˙î˙˙  !Ž˙˙Î&ŝĝ˙˙˙˙˙˙ûü˙ŝ˙˙ç"'˙˙í˙ì˙ô÷˙˙ü˙Ó"Ĵ˙ñ˙ş' ˙$˙˙˙ŭ˙ĝ˙ŝüùŝ˙ö˙ğ.¨ĝ˙êüûëÚ˙ñÖ&üï˙ûŭ˙ü­£˙˙˙˙! ˙˙ëö˙¨2,í˙˙ġó§)˙÷è÷ +èôó˙ŝÏ,˙ó˙òÈ (Ö˙ôÀ$Ĉġ˙û˙˙ĉ' ˙üߢ"˙ŝ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙,•ĈÑÙĜ˙ú˙˙˙˙ûŝ˙Ó& ˘Ë×ÍÉÚĈ˙ñ˙˙¨ '%ù÷˙ëîĞ!  í˙÷³! ˙ö˙)ŝËÊÔ˙˙ü˙ù˙òñ&˙˙÷˙˙ ˙˙òû%!&èŭ˙ü˙˙ŭ˙˙öüôö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷)İĝ÷˙˙Ê%˙ñ˙ċÌ#"Ȓ-Ñ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ÉÚ­+ö˙˙˙˙˙˙˙˙˙ŭĝ˙˙ŭ˙˙˙˙ùñ° !–úŭ˙˙é˙˙˙ëı üò˙ĝ˙˙ŝ—!˘˙ü˙˙"˙ß%Ì˙—ŭ˙ö˙˙˙ûĠ˙úĝ˙ž!›ìŝüû˙˙˙ĝĝ˙ú˙˙ë ˙,˙ŝù˙ü˙ÇÈû˙ŝó˙Ĵàùĝ˙Ñ›Û˙÷éúó˙úíŝš Ë˙˙ú˙˙ë˙˘˙˙˙Í$ż˙˙˙ìžŻ˙˙ĝڝ3 Ÿû÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙ûúŝ˙Ħ!Î˙ú˙ Ċ÷ĝ˙Û (ŭĝ˙˙˙"û˙ó˙‘"'÷úû˙ò&ĝ˙˙˙ġú˙ÈÄ˙˙ù˙˘#÷˙ù˙˙ŭ•§˙˙ñ˙š Ùó˙èŞ ü˙ôŭ˙‘#ŸùÄ# ž"%˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ı" Ÿĝ˙ö˙ùÊŞ £ë˙˙üö˙˙óó˙˙˙˙ĉú˙÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûû4Ê!œ˙úù˙ĝ!)Ï˙˙ùŭŭ!%ü˙ñùüċ ›˙ġù˜Ö˙˙ù˙£!Ùù˙ÓôÒ(ĝ˙˙÷˙˙ü˙˙û˙ŭ÷˙˙ §ó˙ŝġ˙˙ħ˙˙÷˙úĈœúÈòĤĤĤ¨ú“İċùù˙ö˙ú˙˙˙˙ùü˙ô,·˙÷÷˙˙˙òó˙Ï’˙˙ë˙˙î˙ "Ÿ˙ïúœ$ŝŝ˙˙˙ !˙÷˙˙˙…" ö˙˙ŭ­èö˙˙ŝĊy˙ù˙˙Ô—˙˙) 'œ˙ñ÷˙ó˙Ĵ$üÊêµ#êôûü˙$ ˙˙˙˙˙˙˙˙˙í˙˙˙ú˙˙û˙˙ŝ˙ĝġÑ ôĞ#ŝú÷˙˙ïü˙ì˙öŭ– úú˙ċ˙"!Ÿ˙ô˙˙£ ! üüñħ%û˙ü˙˙ĝ˙öŝ˙˙ĉ"˙ï˙˙îñ)(!˙ò˙ê¤˙˙˙ù˙óú˙˙û˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙'˙ò˙ù˙Ó ×˙î˙˙—$ !Ú úġ˙ï˙˙˙˙˙˙˙˙úùöûÖ/ !˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙½"ùô˙ĝü˙‡ &-Íüû &˙˙üò˙˙‘-ú˙ŝ˙÷üùĞ#˘ŭ˙ùü‡)  +˙Ĥ˙ì˙˙ĝüÓ" ˙ê˙˙˙ £˙ŝ˙˙ŝŭŭ˙˙˙˙˙û+Ñ˙˙ŭ˙ŝ˙ô" ˙˙˙ü˙˙˙˙ŭü—¨èû˙˙ŭ˙˙ĝ˙èĦ˙úì˙˙˙Ú“˙öñ­Üö˙ŝ˙§ İú˙ú˙ì ˙é˙˙ö˙˙˙˙˙˙˙˙˙ĝü˙%$ùĝ˙ê˙ŭ í˙˙ú˙"’˙˙ñÑĊù˙úë˙ žü˙üÚ ›˙˙˙ġ˙‹# öġûô˙˙˙ôó˙öϤ#ŭ˙˙ï˙˙!(˙ô˙ç˙ 'Ë˙˙ !ùŭ˙˙ö˙ö˙˙˜+#)Şñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷ #5ù˙öġ˙˙Ž* äü÷úŜé˙˙öáĊÀ˙˙ġúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òüüï˙ïÚ”ĦÓûñ˙ĝŝ˙) ˙ê˙Ï˙– ġ˙˙˙˙ô ĝŭ˙Ξ˙ġ˙ĈŻ˙˙à ˙˙üŭ˙˙ŝŝ˙úû˙óĝ˙à'˙˙ùù˙ĵ÷Ÿ'ô˙˙í˙á˙˙îĦ* ˙˙˙˙˙˙öûóĝ˙÷˙˙˙ġúŝùü˙˙˙ŭ˙˙ñûö˙ñ˙Ü$ ˙í˙ôŝŝ˙›˙˙ŝÔ #ö˙˙÷í£)˙ú˙óĊ%˙òú˙™$Ž˙óúùË(ĴÉ˙˙ŭÎ(#Óû˙  ˙˙˙˙ü˙%û˙˙–# ˙˙˙˙öÌ ˙˙˙˙˙˙˙˙˙˙ŭ úùû˙˙˙˙˙ì˙˙˙&Ş˙ġ°'üù˙˙ûŝ˙˙˙ġŭ˙¨ ˙˙˙˙û &!˜˙˙Èҟ˙ù˙ ·˙ò˙Ŭ˙˙öñ˙˙÷Ŭ !Ÿ˙˙üÎ$ëôö˙+Şòù˙˙ù˙ӗĤ£½˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú#’˙˙ò˙ġ%üò˙üö˙²–˙˙î˙˙˙˙˙˙˙˙˙˙é˙˙”!/“) ˙ŝ˙˙˙˙˙˙˙˙˙˙ûŭ˙¸÷˙ö˙˙ë­% ú˙˙ !ġ˙ŭ˙ŝ˙  µô˙ŭŭ˙ô/§öú˙ŭ˙—*+˙ !É˙˙˙˙ĝ˙˙œ˙˙ŝö˙) Ù˙˙˙˙ú˙˙úöü˙˙ú˙öŭŝ˙ŝó˙˘˙ñüûö˙œŻû˙Ó°Ÿ˙˙ì˙ù÷ĝ˙ôË (Ìŝ˙˙î˙È%Ù˙ü˙!Í˙ġì˙  !žò˙˙˙˙ע“" Š˙˙ûú˙˙˙˙˙˙˙˙˙ġ˙ĝ!#˙ŭ˙˙˙ŭĦ˙˙˙ô˙˙ċ˙˙Á!˙˙˙˙˙ôȰùû˙Ĝ ħ˙ù˙˙ú² ŻÒ˙ù˙˙ĝúŭ˙˙š!+˙ġû˙÷Ñ %ğ˙˙˙÷ó ˙ûë"È˙˙í˙ŭéù˙£ çé˙˙˙ùÒ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ™, ˙ŭô˙ü˙˙ŝŭġ $Ñú˙§ !+!˙˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙üÔ  Í˙˙û˙û˙Ĥ˙û˙ô$˙ŝ÷ŭ˙ŭ˘˙ŝŭÏ šû˙û˙ š˙˙ŝ÷&˙ġû˙˙ò˙ġ˙ùĝ˙˙ŭ˙Ç£ùö˙˙ö˙۔˙ġ˙ŝĈŭö˙¨ûú˙ŭ˙üò˙û˙˙˙ŝù˙ü˙ú˙˙ĝü˙Ú˙÷˙ŭ˙ô˙ûÈİó˙ö˙˙˙üĴŝì˙Ĉ˙˙î˙˙!Ê˙û˙˙˙˙˙ŭž Ħ˙˙˙˙Ôš˙ĝ˙ĝÒ˙˙Ñ Ħŝü˙ü˙ù û˙ü¤öġ˙ü˙Ô !˙˙˙˙˙˙˙˙ûûӛ&  ŝ˙˙ġô˙˙ô˙˙ôôß Ë˙˙ŭžŝ˙öü˙ûù˙˙˙úÈ*˙˙á˙ŝ Ĝ˙÷˙˙Ÿ$ï˙˙È˙˙˙˙ŭġ˙˙ñ˙˙ĝü% û˙ĝû˙,&í˙˙ŝü ˘˙ü˙ú˙˙˘ 1ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ŭú˙ü (‹˙˙˙÷˙ô# ŝŝô˙ö˙˙˙˙˙˙˙˙˙˙óÌ ñ˙Ħ(ŭú˙˙˙˙˙˙˙˙ŝŭ˙üü˙÷˙û˙˙#Ó˙˙# £˙ë˙˙ŭô­"—˙˙˙˙ż˙£ &ô˙˙ùûû× ,žŭŸ& ˙óûŝ÷˙öŭİžŝ˙öÑ˙˜ Ï˙˙˙ûĝ˙˙˙˙˙˙ö˙Ç#˙˙ûü˙ĝġä‘"˘˙˙ú˙ù˙ĝ˙ú˙Î Ĥ÷ú˙÷˙˙Öġ˙˙¤ Ĝĝû˙ŝ£Şñ˙ó˙ü" ßòŭ˙ñİ–˙˙ûĝ!žÓŭٟÊü˙ġ˙˙˙˙˙˙˙˙˙˙ŭ˙ ˙˙û˙Ï˙Ħ#˙ü˙˙ŝŞö˙óŭϐ˙êù˙ŝ˘&ü˙ú˙—(˙û˙ŭ—Ë˙˙˙ó˙óá–˙¤$ û˙˙ú˙Ï)Ö˙üġ˙ ' ú˙˙ŝö˙˙ùü˙ġ˙Ġœ Ù˙ŭ˙ò˙üù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š  —˙ü˙û˙˙ò˙˙˙˙ž ˙˙È  &  Ċ˙ġ˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĥ%"ö˙ô˙ĝ˙ž#Î˙ô˙ö˙˙%üŝ˙ô˙÷¨Ş˙ġ˙Ğ šú˙˙˙˙ù˙üîĴ ˙ïö˙ġ˙˙˙˙˙˙˙˙˙˙Ò¨ûû˙˙˙ú˙› #ó÷˙ŝÑġŭ˙žĊ˙˙˙û˙˙û˙˙ùĝ˙˙ô˙˙ó˙˙ó˙ġĤ "ĦĊ˙üû˙˙ùûÔ ˙˙ô˙ŝ˙ĝÑ˙ú˙üÖ Äŝ˙ġ˙ÔĦÊ˙˙ŭ˙˙úûóĞ"Û˙˙ü˙˙˙˙ëĊ˙ŝЧúúŭ˙È£$'Ĉñ˙ñ¤˙û˙˙÷Ş Ħ˙ŝ÷˙üġ˙˙û˙˙Ï˘ĝ˙ñ˙ĴÏĝü˙úÍ ú˙˙˙˙˙÷ŝ˙ŭĝ˙˙öúŞ%ŭ˙ò˙˙É˙˙ö˙š*˙ŭ÷˙¨ô˙÷ŭ˙ž˘Ìŝ˙˙ú&˙üüġÑÍ˙˙ŝ˙˙È˙˙˙û) $ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú!˙˙˙ó˙˙!˙ü˙ö˙ûù˜˙ò˙˙ŭ˙˙˙˙˙˙˙˙˙˙ŭ#ĝ˙Ğœ¨˙˙˙˙˙˙˙˙ö˙ñó˙µ&÷˙ùġ˙˙žü˙˙$˙öĝ˙˙×íûŝ˙÷˙˙"Ċ˙ó˙˙ó˙ġĤÊġ­ Ŭ÷ù˙ü˙ö˙ôÓ"ù˙ġ˙˙ £˙ûü˙ġ˙ú˙˙˙˙˙˙˙˙˘˙ĝ˙ŭġ˙Ç˙ Ş˙û÷˙˙( )Ĥö˙÷˙˙ ó˙˙ôĜù˙ò˘˙÷˙Ò­˙öŭ˙ġÑ$ û˙ĝĠ ÷ĝ˙!•˙˙Òŭ˙˙ġ˙˙˙˙˙˙˙˙˙˙ĝú÷˙˙ù˙£ü˙ŭʤ˙ŭ˙óÔ!ÜöÖòö˙ûûŭ÷÷˙ù˙ŝš˙ú˙˙ŝŭ˙( ÓöĤ ˙˙ŭŝú(Ûŭ˙ŭ˙£ ĝ˙˙ò˙ù˙˙ŭ˙ú˙ɨÍ˙ĝö˙ûŭ˙ú˙ùŭᤧ”˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĥ £ù˙˙˙ñ˙üĝ˙˙üĦ!£˙û$´ó˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ×%“˙ŝò˙˙Ӝ¨û˙í˙˙ó" Ò˙˙ô˙˙˙ ,‘˙˙˙ Ĝò˙öô°$œï˙ĝĠ˙‘ ĝ˙˙˙üóú˙˙˙˙˙˙˙˙Ġ)ŝ˙ñü˙ŝž ˙ü˙˙˜˙òŝ Ĥ˙ġ½˙ŝ˙Ÿœì˙ûú˙ü˙˙ö˙˙ù˙˙Í%!Ûùŭ˙ĝ˙˙÷˙ĝœ²ġ˙˙ë˙˙™ĝù˙ĉ ,˙˙ôóË#$Öì˙ú÷ #"÷˙ü˙ž*żúŭ˙ġ÷˙ú˙áôó˙/É˙˙ü'˙ŝ˙ñß $ö˙˙˙(È˙˙ŭ˙˙ûĝü˙ï÷ÜӗŞÎ˙ġç˙’" ˙ĉúÑ Ċ˙˙˙˙ġ˙˙Ä Öŝ˙˙ Îóûû˙÷˙íóĦ ĴĜ˙÷˙û  Óò˙˙¨ö˙ê˙ôħĦ˙í˙˙ô˙ ! ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙œ )—ô˙˙î'˘˙ú˙üĝ˙˙ñÒ*˙ù˙˙ĉ˙˙˙˙˙˙˙˙˙˙ġ˙Ì&Ġ' ˙˙˙˙˙˙˙˙˙˙˙î Ì˙˙öŭ˙˙—˙˙˙ù÷˙Ï!ġ˙ù£˙˙ö˙˙ù˙˙Í#$˙˙ž) ó˙˙˙öüĝ˙˙!˙˙ôÑ ½˙ŝ÷û˙û˙˙˙˙˙˙˙˙İ4 ü˙÷ŝ˙˙ò§ ˘ü˙˙ñ˙ħ ú˙ü˙úŝ!$˙üô˙­ûĝ˙ĦŞœ£$°˙˙ŝ˙ŝ˙ ڝ‘Ş#İÑ˙ #Ñüב Ñ˙ġô˙˙˙˙˙˙˙˙˙˙Ċ­Ŭ˙ûô˙óĞ Á˙Ÿ$6Çö˙˙ñ İŭ˙˙˙( ×÷˙˙˙œ* &˙ñ˙˙ŭ™/ŜżĞ˙ÙĦàÖ˙§Ñ˙˙˙˙(ïŝ˙òà3œ˙í˙Û÷˙˙é˙˙ú˙˙ġ%Ò˙×˙ĝŭ˙ç˙˙û˙  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üñ %!˜˙éüë˙û˙˙ó˙ŝİ ÚùôÙ$3˙˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùîß(Ĝï˙˙ĉŭù"ž˙˙ġ˙ŭ˘ Ĵé˙˙üŭ("àö˙ó"Ä˙˙˙˙$Ĵü˙˙ê˙İ #ïŬïùü˙˙˙˙˙˙˙˙˙˙Ç% ŝ˙˙ü˙úô°$)Ŝñ˙ŭçğôü˙ú´›˙˙üŜ!'§ŭ˙˙˙˙ùŝû˙˙ŝ˙˙ö 2 ˘Ùö˙Ê˙˙ó˙˙Ìŭġ˙ù˙˙˙ò˙˜ûö˙˙½˙˙÷Ġġ˙˙˙ ' Ż˙˙˙š!—÷ĝ˙ ˙˙˙òŬ 0ô˙î˙Î #$¨˙˙˙Ĉŝî˙˙ú˙ĝ˙û˙úß*'—Ûŝù˙˙Ì˙ŝ§) —£ñ˙ż.úú˙ 2!$Ġù˙—(À˙˙˙" #Ëùó˙Ñ " &›˙˙” "´ŭßŭó(  ġü˙İ(İù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙" ' ˙ò˙ŭŝ˙üú˙˙’ôù˙˙û˙˙˙˙˙˙˙˙˙˙óù& #"& ›˙˙˙˙˙˙˙˙˙˙ŝ˙ ( ÍôĴ"œĠû˙( Îô˙÷˙íú$Ç۞ ú˙ŝû˙˙ŝ˙˙ö)‘×˙ñژ !Ïŝ˙óì˙ŭ˙÷ô %œó˙˙•8§ù˙ŭŭ˙˙˙˙˙˙˙˙˙˙Î' ˙˙˙˙ġ˙˙ )#Ñ˙÷ŝ#"#-Ê˙ï˙û#Ÿŝï˙ûó˙£  ɟû˙˙û˙÷ĝ/)!"˙÷םû# 8˙ġĝ˙ò˙˙˙˙˙˙˙˙Ŭ ¤˙üú˙÷!) Ñúí˙Ğ%ùÊˎ#/Ĝġ˙÷ġ  ˙û˙˙´$#Ş˙$ĝġ˙ ġî˙Ÿ$ ß˙ü˙•˙˙Ç#Ô˙ó˙˙Ïó˙ ÏÌÓÈŝù˙˙ö˙Ĉ) & É˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙'!! ˙˙˙˙ŝïĝ˙˙˙Îúüô´İšŸ£ œ¨Ċ˙ûöù˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ÊÛôĝ˙ŝͤ È˙ó˙ĝ˙˙Ì$Êùġ˙Ä% ġ˙˙˙˙ù˙ûş)˙óó˙î" Ŭéŝ˙˙˙ó˙˙˙˙˙˙˙˙Ù1 ş›“˙˙¨ " Ú˙ŝ˙ ˙ŝŝϲž˜’Ñúüüŝ˙˙ŝ˙˙˙˙ŝŝ˙˙+Êü˙ĝ˙( ħú˙ñ˙û)$ĉ˙ò+ÎñĜ # ¨˙ĝ "öûú*Ùĝ§,§ö˙˙ñô˙$(Î˙˙ü˙˙ ˙ŝô .#È˙ù˙˙ù˙ŭú˙ò˙í˙+˙ê˙˙ï˙˙ġôü *Ì˙ûÈ&˙˙")È˙íĴ§› ßġñúà—Ş"/$œŭ˙˙ìÛ!Ħ‹žÓ˙ê­ĞœĤ·˙ùô˙֝–%#˙˙˙Ì'Á˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùĈ"›°Ÿ˙˙ġ˙ú˙˙÷˙í˙Ï˙ġ˙˙ġ˙˙˙˙˙˙˙˙ŝ˙˙è֙ŸÇ˙ìú˙žĤü˙˙˙˙˙˙˙˙ŭ˙ö˙ò˙ §Ş6˜“û˙ġê˙˙ŭü÷˙˙˙ĝ˙˙˙ú˙˙íĜ·Ħ›­&²Óôŝ˙ŝ˙˙˙˙ŝŝ˙ô˙˙Î˙ġ˙˙˙÷òüŝ˙˙ûġ˙˙˙˙ŝóü˙˙ġöäö˙ûĉ×ñ˙˙˙ô˙˙˙˙˙˙˙˙˙˙×˙íúùŭŭĝĦ˘˜˙˙÷â砒›˙ĝ˙˙ù˙˜'”˙û˙˙ú˙˙ó˙˙ò˙ú˙˙ô˙˙úĝ˙˙˙˙ŝÇŞžĞ×È%˘—àñ˙ŝŸ&•Ñĝú˙˙÷˙˙˙˙˙˙˙˙Á-0 î˙ûÄŭš ĤĞ $Ó˙˙ĝœ'" (%'Ò˙ñ˙˙Ù"üġö˙ ­÷÷ %˙÷˙˙ĝ" Óé Ŭòñ˙˙.“˙ò6˙ŝÑ"Ĥ•§İ˘÷˙ĝ˙+û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷üÓÒġ˙Î#Ĥ˙ë˙™›˙˙˙˙˙ŝü˙˙˙˙˙ü˙û˙ŝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĠżœ1Ì˙ü˙˙˙´'ħÍĝ˙˙ŝ˙˙(ò˙  ˙öŝŭ£Ï˙˙% Ġ˙˙Ô%"3Ñŝŝ˙ú˙˙˙˙˙˙˙˙˙"& $Ôġš" %˜˙Ċ%  ˙˙˙Ë" )˙˙˙ŝ˙ŝûŝ˙˙üŭ˙ü÷˙òĞ!˙öó˙˙ó #˙û˙ŭ˙ä˙˙&ĴġĜ,  $Öüŭ”!'#˙˙ë+Ê˙ÔŸ˙˙÷˙˙ËĠÄËáÌÜß÷˙óĝüôÔÒĜĈá˙ŝ˙ÜĜĠÔÏÌ˙˙˙˙ŝ˙÷˙˙ŭĝ˙˙éÒÍÒÀŭ˙÷ó˙˙ÖÊĠÎÖö˙û˙$ÊÈÖ˙÷˙˙ĊÒÍÇŻ˘Îŝ˙֓Ìèğċòĝ˙öú˙˙Ìŝ˙ü˙üú÷û×ɸÒÉ˙˙˙ŭïúÌö˙˙ú˙ù˙ûîö˙˙úü˙˙˙ü˙˙Èßéŝ˙÷˙˙Ċ ",ôô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ùÊĜÊÍÎÓ˙˙ë˙÷ü˙ò˙˙˙èó ú˙üŝŝŭ˙˙˙˙˙˙˙˙˙ġŭñ˙˙ŭù˙˙˙˙ê˙û˙˙˙˙˙˙˙˙˙˙ù˙óú˙ĝÙñ÷ÚĈÇÁ÷˙˙˙˙˙˙ôú˙ö˙˙˙˙˙üĝ˙öĝ˙ŭŭ˙˙˙˙Ï˙òì˙ùü˙˙üŭ˙ü÷˙˙˙ú˙˙ñùó˙ú˙û˙˙úüĝò˙ŝ˙ŭ˙ŝú˙˙óü˙ŝ˙ö˙ùö˙˙ü˙˙˙˙˙˙˙˙˙Ö˙úĝ˙˙˙˙ú˙ûŝŭ˙˙ú÷ó˙û˙ĝ÷ŭ˙˙ŭ˙îŭ˙ĝ˙ÓŬÄÂ˙ñôŭĝ˙˙ĝ˙ùòŭ˙ĝì˙˙î˙˙˙˙÷ñ÷ŭ˙˙ùû˙˙óû˙˙ó˙˙˙è˙ŭ˙şÑÔ˙ü˙˙òü˙ñ˙˙˙˙˙˙˙˙˙ïÙĈÍÂÙŝ×˙˙˙ë˙˙½à‘(Ò˙ŭÑĵŜú˙ìü˙ü˙ĠÇÜÂÏĵÙ˙í˙˙˙ĝĝњ‘*˘ÈÄ˙˙˙ïÙɛ&ĞÒĊ˙˙Ç!™ŭì˙%Żòŝù"Ö˙ż ˙û˙ó˙$§É˙ċ˙Ê$ !#'ċ˙˙˙ì˙!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙Ç##  Ġ!˙ü˙ġ¨ %ßêúüŭüûúûŝ˙öĝ÷˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ - "ù˙óŝ˙&/”˙˙üó˙˙” !²™˘§—÷˙˙êÓĞ +#ŬúïŞ ŞšÏ˙üü•£ˆĝ˙˙ġù˙˙˙˙˙˙˙˙˙ÍĞŞÇ˙Ğİ –§˙˙ $ ݚĞ˙à˙˙“Ż3––£óùŭŭ˙˙˙ò˙˙û˙˙˙ú˙˙ù˙˙”¨£Ÿâ˙ĝò˙˙éĝ˙÷˙˙óúó˙ñ˙ŭñ˙˙ò˙˙ŝùû˙÷˙ó˙˙˙˙ŭ˙˙÷ô˙ŝ˙˙˙ü˙Îüé˙˙ë˙˙ôò˙˙ùñ˙ĝ˙˙˙˙ŭú˙ï˙˙ŭ˙û˙ġŝöġ˙÷˙˙ŭ˙ù˙ĝù˙÷ü˙öó˙ë˙˙˙ŭġ˙ù÷˙ŝ˙îû˙üô˙˙÷˙˙˙˙é˙ü˙˙ĝ÷˙˙˙üŭ˙ŭûû˙ûŝí˙˙ü˙ó˙˙˙˙˙˙ùÏ˙ĝġ˙˙ë˙˙ì˙ü˙˙ú˙íóŝ˙öò˙ŭ˙í˙˙˙˙ûì˙ŝñ˙˙ö˙ûóÑ˙û˙˙˙˙ĝóŝ˙ó˙÷ŝù˙ò˙˙ŝû˙˙òÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñü˙ò˙˙˙˙ü˙ŝ÷˙˙ŭŝ÷˙˙’4ç˙ô˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙÷˙÷ü˙˙ûġŝùŝ˙êó˙˙˙˙˙˙˙˙˙ü˙˙í˙û˙˙ï˙˙˙˙˙˙˙ñç÷˙ù˙˙˙˙üñ˙˙˙ûŝ˙ġ˙üċ˙ùíü˙˙˙ì˙ĝ˙˙û˙˙˙ú˙˙ú˙˙îî˙˙˙÷˙ġ˙˙ŝ˙˙˙˙ù÷ŭúü˙ò˙û˙ü˙÷ĝĝ˙ûó˙˙˙˙˙˙˙˙˙˙˙üï˙ë˙÷óġ˙˙ôó˙˙˙˙ü˙ùûü˙˙ĝ˙ï˙ô˙˙˙ó˙ŝé˙˙ü˙˙˙˙úú˙û˙˙ŝĝ˙˙ìù˙ŝġö˙˙˙˙˙˙ġ˙üú˙˙˙˙ì˙ûö÷˙úö˙ú˙˙˙ü˙˙íò˙ú˙˙˙˙˙˙˙˙˙ù˙üò˙˙ü˙˙íï˙ùù˙ñŝô˙ñ˙˙ü˙ì˙˙˙˙ö˙˙ï÷˙˙˙˙÷ĝ˙ûŝŭ˙ûŝ˙Èŝñô˙˙ô˙ŭ˙˙˙â˙ùġì˙öü˙ò˙˙˙ùâ·˙ñŝ˙ì˙˙˙ù˙ŭü˙˙˙ñŭ˙˙ê˙üÜ 1(˙˙˙˙˙˙–&! ïùì˙˙˙% ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙÷˙Ù&$“£Ż˙ô˙ž#˙˙û˙˙˙ŭûŭ˙˙˙˙úĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ¨ŸŸ˘Öĉ˙üÑ-&ˆ¨˙˙ŝ˙˙ŝ˙ŝùÎÎÚ˙˙˙ŝ˙÷˙û˙˙˙û·Ú˙ô˙˙ŭÖáġ˙ĝ˙ú˙÷˙Ùŝŭ˙˙ñ˙ö˙˙˙˙˙˙˙˙˙˙˙˙ü˙ËÜ˙ü˙ó˙ñ˙˙ġ˙˙í˙˙Ó˙˙˙˙ŝü˙˙Ëò˙˙˙˙˙˙˙ùóŭ˙˙˙ŭŝ˙˙˙˙˙˙ó˙˙ù˙ŭ˙ä˙˙ŭ˙ŭ˙ĝ÷ú÷ŭ˙˙ŭ˙˙˙ŝ˙÷˙˙ôŝ˙˙˙÷˙ŭ˙˙˙ġ˙ġùñ˙˙ôŭ˙˙˙˙úú˙˙û˙˙ŭû˙úûüû˙û˙ûġġ˙ó˙˙˙ô˙ôú˙í˙˙û˙˙ĝï˙óŝ˙ö˙˙ŝö˙˙÷˙ïü˙ĝŭ˙˙˙ŝġ˙˙ĝ˙ĝù˙ŭ˙î˙ĝïú˙˙ŭ˙ġŝñ˙ü˙˙ó˙îú˙˙íĝ˙˙˙è˙ĝ˙ġ˙úġ˙ùü˙û˙ù˙ñëÌŭ˙ü˙˙ŭ˙÷û˙˙ŝû˙˙ŝô˙˙˙ñì˙˙ö˙ġ˙ûĝ˙ġ˙ú˙ûù˙ñó˙ĝ˙ŝ˙ê˙˙˙˙ġ˙˙˙üŭ˙ñ˙ *Ĝó÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ñ˙˙˙üñ˙ŭ˙ĝ˙ŝíġ˙˙ĝ˙ŭħ˙û˙ŝ˙ŝŝ˙˙˙˙˙˙˙˙ôû˙ò˙üú˙˙˙ġ˙ñĝ˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŭ˙ĝûûù˙üë˙˙ï˙÷˙˙˙˙óú˙úŝ˙˙ê˙˙û˙ó˙˙˙˙˙˙˙ó˙úñ˙˙˙˙ŭŝ˙˙˙˙˙˙í˙ü˙ŭ˙òĝ˙ß˙÷ü˙˙ĝû˙ê˙˙ü˙˙ù˙˙˙˙˙ù˙úŭ˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙ĝï˙˙˙ŝ˙ù˙ĝñ˙˙ü˙˙˙˙üù˙˙ĉ˙˙ġġŭ˙û˙ŭ˙öŝüŭ÷˙úġ˙ù˙˙˙˙á˙˙ŝ˙˙˙˙ú÷ùöü˙ġû˙÷ĝ˙˙é˙ŝüġ˙÷˙˙ö˙ñ˙÷ó÷ù˙˙˙˙ŝġ˙˙˙˙˙˙˙˙ŭü˙˙òù˙ĝ˙˙˙ù÷ò˙ĝ˙ĝ˙˙˙é˙ŝŝġ˙ñûû˙úù˙˙ô˙˙˙˙˙ĝ˙÷˙úú˙ù˙˙ĝî˙ù˙òîŭ˙ö˙˙˙˙˙˙ü˙ó˙ü˙û˙÷˙˙ù˙ì˙ü˙˙˙ĝ˙˙˙î˙˙˙˙ġ˙÷öú˙ÚġÏ˙Èù˙ŝü˙ü˙Ŭ÷§Ÿ˙˙˙ĝû˙÷ŝ˙  Ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭè˙˙ü˙Öû˙ó˙ûӆ˙ž²òù˙˙˙˙˙˙˙˙ĝĝ˙˙ŭ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙ĝ˙ŭ˙˙ŝü˙˙ŝĝĊ˙˙ŝ˙˙˙öùŭ˙ġ˙ûĝ˙ûò˙û˙˙˙ŭú˙˙˙ûŝ˙÷ú˙î˙˙Î˙˙ùú˙üŝŝ˙ë˙˙ŭ˙ûŝ˙˙˙˙˙˙˙˙˙ŭó˙˙üŭ˙˙òû˙î˙˙ùŭ˙î˙ùüŝ˙˙ú˙÷˙˙˙˙˙í˙˙ô˙˙úüôŝ˙˙ü˙˙˙ŭ˙˙üŭ˙û˙˙üŝŭ˙óÙ˙˙˙ú˙ô˙˙˙˙˙˙˙ï˙ĝü˙ŝ˙˙ġ˙û˙öŝ˙˙˙÷˙ĝ˙˙ú˙˙˙ô˙˙ŭúŭ˙ġ˙ŝ˙˙ó˙˙ô˙˙ö˙˙˙˙ô˙ŝ˙˙˙ŝ˙ë˙û˙˙û˙˙˙ô˙÷÷˙˙î˙ú˙˙ü˙ŝö˙˙˙ŝú˙ü˙ŭù˙ŝû˙˙˙ĝŭ˙ù˙û˙ù˙ŝ˙˙˙ûĝü˙˙˙˙˙ġ˙ŭ˙˙˙˙üŭ˙˙˙úŝ˙ùù˙˙ĝ˙ĝ˙û˙˙ü˙üû˙˙ŭ˙ö˙ü˙ö˙ü÷˙úü˙öŝ˙î˙úŝ˙û˙ŭò˙ô˙û˙ü˙û˙˙ü˙öŭ˙üû˙˙ŝó˙˙ö˙ĝŭ˙ô˙˙˙÷Ğ ”˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ġ˙ŭ˙ú˙ú˙÷˙÷ŭ˙˙˙˙˙ŭšĜüô˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙˙÷˙˙ü˙˙˙ĝ˙˙ô˙ŭ˙ù˙˙˙˙˙˙˙˙˙˙ŭ˙ö˙˙ŭ˙ġ˙˙÷÷˙˙˙ĝ˙îú˙î˙˙÷˙˙˙ù˙˙˙˙˙ĝ˙˙ô˙˙ö˙˙˙ù˙˙˙ŭ˙˙üŭ˙ûû˙ö˙˙ŝë˙˙ġ˙ú˙˙ô˙˙öŝ˙ü˙ï˙úŝú˙ŭú˙˙ú˙üü˙˙ûŝ˙˙˙˙˙˙˙˙ú˙ö˙˙ò˙óŝ÷ŝ˙ü˙óŭŝŭ˙ô˙ù˙˙û˙˙˙ì˙˙úü˙˙úŝ˙û˙˙˙˙ô˙˙ì˙ö˙˙˙˙÷˙ü˙ú˙˙˙ŭ˙˙ŝ˙˙˙÷˙˙ö˙˙ü˙ġ˙óŝ˙ŝú˙˙ê˙˙˙˙ûò˙˙ú˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙è˙˙˙˙ñ˙ô˙ŝŝŝŭ˙û˙˙ġ˙˙ë˙ú˙ĝ˙üŭ˙ó˙ò˙üó˙˙ñ˙˙ö˙ò˙˙ŭ˙˙˙˙˙üŝô˙˙ò˙˙úŝ˙˙û˙÷ġ˙ŝ˙˙˙ûû˙˙˙òŭ˙ŭô˙˙ê˙˙÷˙˙û˙ŝ˙ŭ˙˙ĝ˙˙˙ŝ˙ö˙˙úó˙û˙ó˙˙ò˙˙ü˙ú#"ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ù˙üü˜˙˙ŭ˙˙ú˙˙˙ŭó˙é˙˙ŝüûü˙˙˙˙˙ö˙˙ö˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ò˙ŭ˙ñ"Ïó˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû֞œ% Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü İ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ú˙÷÷˙ŝċ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö¨"òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙úŝ˙ù˙˙ú˙˙÷˙üĝò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ â˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›Ĝ›Ùġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ĝ˙˙ôĝ˙ŝ˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙Ĥ˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ô˙˙ġ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ûö˙ŝ˙úû˙˙ĝùŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙û÷˙û˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙îüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĝŭ˙˙˙öġ˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙î÷˙ò˙úŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙ŝ˙ú˙ŝ˙ûùïù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙á˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ôŝ˙óĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ü˙ù˙˙ŭü˙ü˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝŝ˙ĝ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüŭŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŭ˙˙˙ûüûü˙˙˙ŝ˙˙˙˙˙˙˙˙ŭû˙˙ĝ˙˙˙ŝ˙ĝû˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ĝüú÷ŭŝ˙˙˙˙ûù˙ŭûúü˙˙˙˙˙ñ˙û÷÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝ˙ŝ˙˙ü˙˙˙˙˙ô˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŝ˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüúûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ùô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûòŭŭ˙ŝ˙˙˙˙˙ûòú˙˙˙˙˙˙˙˙˙˙üŭúü˙ŝŝĝ˙˙˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝ˙˙˙˙˙˙˙˙üĝü˙˙˙˙˙˙˙˙ŝù÷ĝ˙˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙˙˙˙˙ŭ˙ŝŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝñŝ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭŝüüŭû÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙ü˙öôú˙˙˙üú˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙˙˙ŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùüûúúôú˙˙˙˙ŝëĝúûúùû˙˙˙˙ó÷˙òô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üòú˙ġü˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöúŝúŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙ŝûúüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ˙è˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ˙öŝñĝ˙˙˙úû˙˙ü˙˙˙˙˙˙˙˙˙˙ü˙˙ŭü˙˙öĝôó˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭúŝ˙˙˙˙˙˙÷ŭ˙˙˙˙˙ŭüŭ˙˙˙ŭ˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ŝ˙˙˙ú˙ì˙û˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ŭ˙÷˙˙˙ġŭ˙˙ĝĝ˙˙˙˙˙˙˙˙˙˙ü˙úüûô˙˙˙ù˙òñ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝü˙˙ûŝ˙ö˙ùû˙ŭü˙˙ŭüü˙˙˙üö˙ĝüöĝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ü˙ü˙˙âöö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭ˙˙ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙û˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙üúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙˙ĝ˙ŭû˙˙ŭù˙˙˙˙˙˙˙˙˙ü˙ù˙˙˙˙ĝûŭ˙óù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙üĜ˙˙ŝŝ˙˙ĝĝ˙ŝûúŭ˙˙˙˙ŭ˙˙ñ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭôĝ˙˙˙ŭï˙ŭöŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úġ˙˙úô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùúŭ˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ŝ˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùó˙˙˙ó˙˙ù˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙üôœĦ˘Ĥ Ú˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭ˙˙ò¤Ë˙˙ġ˙˙ü˙˙˙˙˙˙ŝ˙˙ô˙ì˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüû˙˙üÏ ˘İÓ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô¨Ĥŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġñ˙ç˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙öù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôâÏÈÌÚò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙Ϙ#!™ü˙ö˙˙ô˙˙˙˙˙˙˙˙˙ŭġ˙ó×Ĥ ġàú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ĝ Ĥ÷ŭ˙÷ÒҘı˙˙˙ŝ˙ÚÏÈ'˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝû˙ĝ–"ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ù§£˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òÜÊËŜñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙Ò˘ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙öÖÙö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙ŭ˙û˙ŭ˙é˙ö˙ù˙ŝü˙ñŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ġ˙˙î˙˙ŝ˙˙ò˙˙˙˙üñ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙ŝŭ˙˙˙˙˙ûŭ˙ò˙ ™ŸĦàî˙ŭù˙˙˙˙˙˙˙˙ŭ˙ûùŭ˙ŭŝ˙ŝüúûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙ŝŭ˙˙˙˙˙˙˙˙˙ŭ˙ŝ˙ŝï˙˙˙ö˙úí˙˙ú¤&ú˙ŝŝ˙˙ŝŭ˙üŝ˙˙˙ŝŭŭ˙˙˙ŭ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûúüŝ˙˙˙˙˙˙˙˙û˙ê°¤Êù˙˙˙ü˙ŝú˙˙ûú˙˙ŝĝö˙˙ûü˙˙ĝŝúú˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ûŝŭ˙˙˙˙˙˙ŝ˙òÖ˙Ğ,Áŝ˙˙è˙ŭú˙˙˙ŝ˙ŭ˙÷ùŭ˙ùĦ%Ìŭ÷ŭ˙ŝ˙˙˙˙˙ü˙˙˙ĝü˙ö˙˙ú˙˙ŭ˙úù˙˙˙˙˙˙˙˙ŝ÷˙ŭ˙ö˙üú˙˙ò˙ßÖû÷ŝÜô˙ĝŞ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ġú˙ŝ˙û˙÷˙ú˙˙˙ñŭ˙ŝ˙ŝû˙˙˙ŭü˙˙ŝü˙˙˙˙˙˙˙˙˙ŭ˙ġ˙Ï  !ŭŝ˙˙ûü˙˙˙ŝ˙˙˙ŭüŭŝ˙÷˙ŝ˙˙ŭ˙ŝ˙˙˙ŭüŭŝ˙ô˙û˙ġ÷˙ŝĝ˙££ŝ÷˙˙û˙˙ŝüûŭ˙˙˙ù˙˙˙˙˙˙ŭ˙ŝûŝ˙˙ŭüŝ˙ûüú˙˙î˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ŝŝŝŝŝŝŝŝ˙˙˙˙˙˙˙ŭúúüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ÒŞ˙ùù˙˙öü˙ŝ˙˙ŭü˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙ú˙˙ôû˙ô˙˙üÏœ˙ġ˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üŭ˙û˙˙ġÚñ)ûú˙˙˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭûùŭ˙˙˙öĊŬ”Ë›˙úòùü˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙üĝ˙ô˙˙˙͔Ì˙ĝ˙É '˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭûŭ˙˙˙˙ŝŭŭ˙˙˙˙˙: ¸˙˙˙ùġ˙˙˙ŭûûûû˙˙˙˙˙ûü˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙é˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙ŭì˙˙ŭ˙˙ì˙ô˙ŭ˙˙˙ôš*$˙ŝŭù˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙ŝ˙ŭŭòû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙³( ñŭ˙üŝ˙˙ûù˙˙˙ŭŭ˙˙˙˙ŭöôŝ˙ŝ˙˙˙úù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ûŭ˙ŭ˙˙˙˙˙ŝË$##…˙˙ò˙úŭ˙˙ĝ˙ġ˙˙ŭê˙ü˙˙˙˙¤˙˙˙˙üŝ˙ŝŝ˙˙˙÷ŭú˙˙ŭ˙úŝúüùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ġüŭ˙˙˙éÈ* Ê˙ŭÒ$ö˙Ĉ ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙ï˙˙ġ˙˙˙˙öú˙˙ĝû˙˙ù˙ĝü÷˙˙üüüü˙˙˙˙˙˙˙˙˙˙óú˙”ĴÚÍ""É˙ŝ˙˙ŭŭ˙˙û˙˙ŝ˙˙˙˙˙˙û˙ŭû˙öŭ˙˙ŝ˙˙˙˙˙ŭġ˙ö˙˙ŝü˙˙ûĴ ½˙˙÷˙˙˙˙ü˙˙˙öú˙ùŝ˙ûû˙˙˙˙˙˙ü˙ú˙˙÷˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙ŝ˙ŭ˙˙˙˙˙˙˙ŭûûûû˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭëĞ%˙˙˙˙˙˙˙úŭ˙˙˙˙˙˙˙ŭŝ˙˙˙˙ŭû˙˙˙˙˙˙˙˙úŝ˙˙˙˙ö˙˙ˆŸ!ù˙ĝŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙öËĤ %Îú˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ñ˙˙³ ' $Ñ˙˙˙ù˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝûŝ˙ŝù $Ĉ˙ öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭû˙˙˙˙ŝ˙˙˙òŝôŭ$ ğ˙íġ˙˙˙˙˙ŝŭŝ˙˙ŝ˙˙˙˙ûû˙ùü˙ŝûúüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙ü˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙òô˙ñ˙˙˙ùù˙ċ˙˙ŭ•Şŭ˙˙˙ú˙ù˙ù˙üüûûüüŭŭ˙ü˙˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüúûŝ˙üù˙˙˙˙˙˙˙˙ŭŝÇ! !'ùŭ˙˙ŝ÷öú˙ŝŝ˙ü÷ü˙öôĝ˙˙˙üû˙˙ŭü˙˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙÷˙÷˙úŝ˙ŝŝüġĝŭ÷$/ Ĝ“œ×˙˙û˙ŝ˙˙û˙˙ûû˙ŝŭ˙ü˙ġò˙ó˙ñùûġ˙˙ŝ˙˙ŭŝ˙ġ˙˙ĝ˙û˙ŝ˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙ûĝç˙˙÷˙˙ì˙˙˙ß( °ŭé˙&'œ˙ŝ˙0Ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùú˙˙ú˙˙˙öü÷˙ùĝô˙˙˙˙ĝ˙ĝ˙ü˙˙ŭ˙ŝû˙˙˙˙˙˙˙˙˙˙˙öġ+ŝî˙ùû˙˙˙˙˙˙˙˙üúûŭŝüù˙ü˙ŭŭ˙ü˙˙üúûŭŝüù˙˙ô˙˙ó˙˙ñ˙˙À%(œáúŝŭ˙ö÷˙ŭû˙˙ŝŝ˙ü˙˙ŭû˙˙ŝüö˙ú˙ù˙˙˙ŭó˙îŝ˙ü˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙û˙ö˙ġŝĝ˙˙˙ŝŭŝ˙˙úŭŝŭúùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“" Ĥïŝ˙˙ùù˙˙˙ŭŭ˙˙˙˙˙˙˙ŝ˙˙˙˙û˙˙˙˙˙˙˙˙˙ùŝ˙˙û˙ŝ$)  "ü˙ù˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ú˙˙#'ßŝò˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙ŭü˙÷) ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙úö˙ž˙˙˙İ'˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙ŭŭ˙˙˙üŝ˙ŭÁ Ĉ˙ŭ˙ŝĝûŝ˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙í˙˙íĝ˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙ùü˙ŭîö˙ú˙˙ù˙˙û§ġ˙˙˙÷˙ö˙ú˙˙˙˙˙˙˙ŝûĝñŝö˙ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙Α˙üú˙˙˙ŝü˙˙˙ĝû˙˙ŭ˙˙˙˙˙˙˙ĝĝ˙˙˙ùùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭĝ˙˙˙˙˙˙ %Ò˙û˙˙ŝíĝ˙ŭù˙ŝó˙ŝ˙î˙˙˙÷ùù˙˙ô˙! ú˙˙˙ö˙˙ú˙˙ŭ˙ŭö˙˙ñ˙ĝŭġ˙û˙˙ŭŭú˙˙˙˙˙˙˙˙ò˙˙˙˙òú˙˙ü˙óôÑ$—"Ÿ˙úŬ˙Ñ )öûŝÇ( ×ëü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ë˙ŝ˙˙ú˙ôŝ˙˙˙ġ˙ú˙ĝ˙˙ŝúŝ˙˙ü˙˙˙˙˙˙˙˙˙î×û!˙˙˙ŭ' Œ˙ŭŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ĝö˙˙û˙˙˙˙è˙ò˙˙˙üúŝ˙ú˙˙˙˙úü˙˙ö˙˙˙˙˙˙ŝú˙ü˙ŭ˙ü˙ŝü˙ŝ˙˙˙˙ĝ˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙ü˙ù˙ú˙˙ûŝ˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭĵ žû˙üöŭ˙˙˙˙˙ŝŭ˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙ü˙Ö"  ˙ŝ˙ŭ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ü÷˙—-ñàÑ÷ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝöú˙˙˙ĝ˙˙ /˙ŭġ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ô˙ö˙ۗ$˙˙ç˙˙Ê ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙ŭŭŝ˙ŝŭü˙˙˙ĝ˙ÚĥÖÄ˙ŭġ˙û˙˙˙˙˙ŝüüü˙˙üü˙˙˙ü˙ŝüŭ˙˙ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ùú˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙û˙˙˙˙˙˙˙˙ö÷˙÷˙˙ê˙üö˙˙˙˙üĝì˙—ÖÍĝŭ÷˙ù˙˙˙˙˙ŭûüüûù˙˙˙÷˙ŭ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙˙ŭüŝ˙˙˙˙˙˙˙˙˙û˙˙˙´˙˙ŭ˙˙˙˙˙ġùŭ˙˙˙ŝùĝü˙˙üùŭ˙˙˙ûûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙û˙ùüĝŝú˙˙˙˙˙ù%¤˙ö˙úû˙ŝŝ˙úû˙˙ŝ˙ö˙˙ôÇÍ˙˙˙˙˙Ġì )ŝŝġû˙˙˙ùŭ˙˙˙ŝ˙ûäí˙˙ù˙ùü˙ŝ˙˙˙˙˙˙˙˙˙˙˙ŝ˙ġî˙˙ġí˙ñ˙˙˙ô˙˙˙ô˙˙ŝú§"‘Ŝû˙ü"!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙í˙ùñ˙ñó˙ġ˙û˙üüú˙ï˙˙úŭüüŭ˙˙ùŝ˙ŭ˙˙˙˙˙˙˙˙˙ġ× "‘˙ì˙Í +­ó˙˙ŝŝŭüüŭĝûŝŝüü˙˙˙˙ŝ˙ŝûŭûĝûŝŝüü˙˙ŭŭô˙˙˙ġ˙ĝôù˙˙˙üöĝ˙ù˙˙ġñôúŝŝŝ˙˙˙˙ĝôŝ˙˙ŝ˙˙˙˙óûôŝüó˙˙îúġ˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙úö˙÷˙û˙˙˙˙˙˙ŝüüü˙˙ûûŭŝüù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙û˙Ìĉ˙ú˙˙˙ûû˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙…ŜûÉçż÷ú˙÷ŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝŝ˙*#Ñ˙˙˛˙ĝ˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝû˙Ĥ7³û˙˙ù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝú˙˙ñùĠ %ġŭ˙ŝ˙Ò+˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙ùŭ˙˙˙˙˙˙ŝŭûï˙˙ñ˙˙ú˙ò˙˙ŭü˙˙üûŝ˙˙˙˙˙˙˙˙˙˙úùúŭ˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙è˙˙˘È˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭûû˙˙˙˙˙˙˙˙û˙ó˙ŝô˙ì£˘ŭĝ˙ö˙˙˙˘™÷˙˙˙˙˙˙˙˙ü˙úööü˙˙˙ĝ˙˙ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙ŭúù˙˙˙˙˙˙˙˙˙óú˙ ˆġ˙˙˙ùöû˙˙ŝ˙˙˙ôĝ˙˙ûô˙˙˙ŭ˙˙û˙˙˙öġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙˙˙˙˙˙˙˙ü÷úòÛ *‘ŝ˙ô˙ó˙˙˙˙üŝ˙˙˙ŭĉü˜7'íĝŭĝŝ˙ŭ§üŝ˙˙˙öü˙ŭû˙˙˙ŭ˙ŝĝ˙ì˙˙ŭ˙˙öŝŝ˙˙˙˙˙˙˙˙˙˙ë˙˙ŭ˙ë˙˙˙ñûŭ÷˙ùó˙ġ˙ŝùĦ Żġ˙ġ˙Ö) üñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭ˙˙ġû˙˙û˙ù˙ġ˙ġú˙˙ŭŝ˙˙˙˙ġ˙˙ġŝ˙ö˙˙˙˙˙˙˙˙ñü² #˙˙üä ˙ŝüŝ˙˙˙˙˙˙˙˙˙üúûüü˙ü˙˙ŝ˙˙˙˙˙˙üúûü˙ŭß§Ĥì˙˙ŭû˙˙˙ñŝ˙˙˙ŭü˙˙˙˙˙˙÷˙˙ùñġ˙˙ûŝŝû˙˙ú˙˙˙˙˙˙˙˙ùûü˙˙ó˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙ŭŝûü˙˙üûŝ˙˙˙˙ŝùĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ú˙öúôúñ˙˙˙˙˙˙ùöŝ˙˙üŭ˙˙˙˙˙˙˙˙ŭù˙˙˙˙˙˙˙˙ú˙˙ŝŭ˙ù2+ë˙óü˙ŝŭ˙˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙ŝ˙˙ö ˙˙ġ˙ô˙ûòüġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝĝúüüŭ˙˙˙,“˙ö˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝ˙˙ó˙˙˙Ĝ ˙ŭġù˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙û˙˙˙ĝöŭ˙˙ŭ˙˙˙íùôŝŭ˙ġ˙ŝ˙ü˙ŝûŝ˙˙ŭöòŭ˙˙˙˙˙ŭ˙˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ÷Öĝ˘#›˙˙˙˙˙˙˙˙˙ûŭ˙üïñŭ˙˙˙˙˙˙˙˙˙˙ó˙˙˙$™ŭ˙˙˙˙˙™)'Ħ˙ïùĝ˙ö˙ú˙ĝ˙˙˙˙˙˙ŝ÷˙˙ó˙˙˙óù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ 1àô˙ŝü˙˙üŭ˙ŝ˙˙˙˙÷÷˙˙ĝù˙˙ù˙ǤĈŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ì˙ġ˙˙˙˙ŝ˙˙ùÒÌ˙˙úù˙öù˙˙˙ŝ˙ŭ˙û˙ǔ4˙˙˙úû˙üâ&óö¸ŒœĠ˙˙ĝ˙ü˙ö̐’­˙˙ô˙ùŝ˙˙˙˙˙˙˙˙ù˙òüŝíÓ˙ٙĉ÷ĝü˙˙˙˙˙˙˙èùۍ˙˙ü˙û*˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙ŬÌ˘,˜ /´ü˙ñ˙˙˙üü˜ĦÜĝù˙˜¤÷˙ü˙ĝ˙˙˙˙˙˙˙˙˙ô%(ú˙òÉ"˙ûŭûŝ˙˙ü÷ĝ˙˙ŭ˙˙˙˙˙ù˙ù˙˙ú˙ù˙˙ŭ˙˙˙˙˙˙òÏ ˙ï˙˙÷ĝ˙˙˙˙ŭûüü˙˙ç˙˙ú˙˙ü÷ü˙˙ì˙˙˙ûŭ˙˙ŭ˙ú˙ô˙üŝ˙˙˙ä˙ñö˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙û˙ú˙ŝ˙˙ŝûŝ˙˙ŭöû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙˙˙˙ŭġ˙˙ĉĥ—à÷˙˙ú˙˙ŭ˙ŭöĝ˙˙˙û˙˙˙˙˙˙˙˙ü˙˙˙ŝ˙ŭ ˙ñ˙ì˙ä˙˙˙˙ùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙˙Í'˙ñ˙ö˙ï˙˙ŭ˙÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óÚÌÚġ˙˙óüö˙'Ğ˙˙˙ô˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ò˙Ë!öŭ˙ü˙ġÚ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝŝ˙˙ŜŬñ˙˙˙ó˙˙ù˙˙ûŭ˙˙˙ü˙˙˙˙˙ġßÍÜñ˙˙ŭü˙˙˙˙òÜÊËŜñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ËÓ˙˙˙˙˙˙˙˙ŭĝŝ˙ĝé˙˙˙˙˙˙˙˙˙üü˙ï˙Ċ   ÔÇ˙˙ĝ÷Ş ™˙ÒÔÔñß˙ġ˙ŝüŭ˙˙ġŬÀĞ#˜Ï˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŜËÊÜò˙˙˙˙˙˙˙˙˙˙ù˙ü÷"ĝ˙˙ŭ˙˙ôÔĈÓÑ˙íš˙˙ö˙ûÖ  &’˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙Ä۞ÌħËŭ˙˙üûŭĜŸĊŬÁ˙˙˙÷˙˙ġ˙˙ù˙ì˙óĴ)!ù˙ûŭ˙÷ŭ1!#(˜ŭ˙ú˙ŝ˙˙ /+Ì˙ô˙ŭ˙˙˙˙˙˙˙˙˙˙˙ĝ˙ț˜˙˙˙ù˙÷ŭ˙˙›Ĝ˙ùú˙Ì˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙í˙ħ &ĠÁ˙ôŝŭÙÒ!™ĊŬÔÌ˙ôü˙˙˙˙˙˙˙˙˙ĝ˙¤Êßŭ˙˙˙˙˙ôàÑÌÑÌÌÛò˙˙ü˙˙ù˙ĝċêÜÑÌÌÛò˙˙ü˙úÉ˙ġ˙˙ŝŝÏÈÏÎù˙ŭġ˙ڟË˙˙“*²è˙˙ĝ˙˙ù˙ŭÎʧÊĈ×ù˙˙žÑü˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜÍÚÎïŜ˙ó˙˙˙˙˙˙ġßÍŬï˙˙ñÛÎÊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭô˙ñÒ˙ô˙˙ĥ4!Ïñ˙˙ú˙˙ù˙ñŬŜ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙(ô˙ù˙ŭ˙üú˙ŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ó˙ġĤİùÖ˙ĝ˙˙ö˙í˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñӖ×ŝù˙ú˙ĝ™˙ûŝĝ˙˙ô˙ġ˙ü˙ûüŝô˙˙öú˙˙˙ŝŭù˙˙˙ĝ˙˙ñ˙˙öŭ˙˙˙˙˙˙˙˙˙ú˙÷÷˙ûŝ˙˙úù˙˙ùû˙ú˙˙ŝú˙üûÍ ›˙ûû˙í!Òŝŭ˙÷˙ò˙ò˙ûû˙ó˙ö˙˙™–°—Ùŝŭ˙˙Ç٘˙ŭ˙ùùŭ˙ŝĝ˙˙ë˙ŝŝ˙ÖŝŸŸĤÊ˙›˙˙ó˙û˙˙ô£' ˘Ç˙”š#žŸ˙˙˙˙˙˙˙˙˙˙˙ú  "Ÿúŭ˙˙û˙˙ô˙‘Ĥ£ Ïŭü˙˙ò˙˙úŭŝ˙˙üùû˙Ó“'#ĝ˙˙˙ŝ˙˙÷š) Ï˙÷˙˙˙˙˙˙˙˙˙ŭú˙ŭ˙˙•! ˙˙÷˙˙ïŝ˙öŸ¨ž£ž#›˙úü˙úüԝ˙ù˙˙ûĝ˙ŭ˙÷˙˙˙ï˙˙ô˙˙í˙˙˙ü˙ .Ċ˙ŝ˙û˙(#•#•˙˙˙˙˙˙˙˙˙˙ÍŭÙúĠ˙÷˙ûÌÒġ˙˙ûüË#'—˙˙ĝ˙˙ù˙˙ú˙˙ñÏŞ‘£ĤŸÑѓŞŝî˙ŭö×ô˙˙ô˙Íİ˙˙˙ó˙ŝ˙ü˙ö˙˙˙˙˙˙˙˙˙úû˙£§˙Ù !Òû˙˙˙˙˙˙˙˙˙˙˙#"(¸˙ŭú˙˙Ħ& ) )Ÿ˙ö˙ŝ˙Ç×ġ˙üú 'ž˜˙ŝ˙Ä %˙ú÷˙"Ĥ   Ïŭ˙˙ú˙̧ "Ğ‹ #Ġü˙˙˙˙˙˙˙˙ŝŭ˙˙ôŭ % "›˙ġ˙ôû˙‘ĠöݧžĦÉ˙˙˙ö˙ô˙˙˙˙˙˙˙˙˙˙ژĞ’Ô˙û˙ù—İ×úú˙˙ÇŻŸÍ˙˙˙˙˙˙˙˙˙÷˙˙ïĠú›"ûü˙ù˙˙úĝ˙ĝñ˙üü˙ô˙ġù˙û˙ó˙˙ĝŝ˙û˙ü˙ŝ˙˙˙Éò˙˙üŝ˙˙˙˙ó˙˙˙û˙ĝ˙˙˙ŝ˙˙˙ôŝÓ ˙û˙ù˙ôò˙ûû÷˙ŝŭ˙˙ú˙üúŭŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˘!.›ŝ˙˙ŭë˙#­à÷˙ëûü˙ï˙ŝ˙í˙ö˙Ñğ×Ûûú˙˙üĊĜ§%ŝ˙Ô­˙ŭ˙˙˙˙˙˙˙˙˙ï˙˙ʧĦó˙ĝùŭô˙ġî˙˙ŝ˙ûü˙İ!›ġĜ˙ú˙!-¨ (£×ŭò˙ú˙˙˙˘"" À˙üÂ"!Ĥ/ġġ˙› !àú˙ù˙Ç $&$"š˙˙÷˙ú² 1"-*Á˙˙˙˙˙˙˙˙˙íâ* ï˙ûġÜ.$°¸˙˙˙˙˙ŭú˙˙ġ˙‰&" +Ï˙ûú$ İÔï˙ü˙é˙)™!/Ï˙˙˙˙˙˙˙˙˙˙ú˙äú˙%%—È˙˙î˙˙Á×" !Ÿ˙ŭ˙ŝĝ ŸÚ•#" Ğĝüœ)ĉ˙˙ö˙˙÷˙˙˙˙˙ó˙—#Íö#!)—ż˙îż" Ĝ˙˙˙˙˙˙˙˙˙˙ŭ˙È%“˙˙ë˙#˘ÌÒÏ&™˙ŝö˙˙¨ Á” %´èßŝĝŭ˙˙ú˙˙÷à.(  ˙ $ Ë˙û˙ŝĦĵ÷ñ˙˙!˙ĝ˙˙ôġû˙˙˙˙˙˙˙˙˙˙˙˙Ì#—Ò˙Ó1 À˙ö½$(Ñöúü˙˙˙˙˙˙˙˙ĝ0&•˙,˙óŝ˙ü›ßÓı×ö˙Ç$$&”˙ú˙¤ ) " ó˙˙›! Ĝë˙öÉ'9Ëĝş ˙ú˙ŝ˙ö3û§2˙˙˙˙˙˙˙˙˙˙˙ö˙ŝž *Ĝóù˙4 ! ˙ôŝ˙í˙˙˙˙˙˙˙˙˙úĝ )!§˙öô! ( %ÔùĠ˙Ÿ*Î˙˙˙˙˙˙˙˙˙ß˙˙Á´$ž˙ü˙ ×˙ü˙ښ%˙ù˙˙Ĉϧ˝÷˙Ë(™Ċ˙˙äÒɧ*•˙ŝùû˙ì˙û›$ ħ°˙ì˙˙ô˙˙ĦŻËÈĦĠ˙ġü˙˙˙ĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ )ŝĝûĝ˙˙¤1Î˙Ì(˙˙î˙˙ò˙˙˙ )ûĜ˙ú˙Ñ%ÔÄ*˙ŝ˙˙˙˙˙˙˙˙ŜÀüÒ Ĵè˙˙˙˙˙÷˙ĈÓÇĜ˙Ê *Ó˙úú˙¨˘´ö˙˙÷˙ì£ĜĦË&ô˙—*&Ĉ˙ü$!“ġ˙ŝ°) " ( 5˙ì˙˙—$§ĞŠ "ŝ˙˙˙˙˙˙˙˙˙š&"ù˙˙Ğ"Š#5ßĝ˙ïŭŭ˙ŭùĝ˙Ö£˙î˙Ċ! û˙˙ʘ(˜Ŝú˙ŭ˙+Ñ˙ù$˙˙˙˙˙˙˙˙˙ú˙˙˙§üè˙Ğ!#üóŝ˙Ÿ#­œĞˆ"%û˙ûï˙ ˜Â˙˙Ä$!ô˙î˙! "˙û˙ġû˙˙ûúüö˙ñÛ'Ï÷˙˙˙” &#Ê˙˙÷˙“ž›ùŝ˙˙˙˙˙˙˙˙÷˙ġŭ2Ĥ˙˙˙ù˙ŝ˙+ï˙˙ü ĝ˙˙ŭÎ #Ĥ#Żŝí˙ĝ˙˙ŭü˙˙ŝö¤% ʝğ×˙Ĉ$áí˙Ñ˙Ó Â˙ô˙ġġ&Ê˙˙˙úú˙˙˙ûö÷˙˙˙˙˙˙˙˙ə¨ú˙˙ġ²#$ġö˙ % & ÍĈ²¤ı˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĠ÷˙˙˙÷.˙ġŭùâ1ûí˙˙Í$üŭ ›˙ŝ% -òôŝŬ *”Í˙ü˙΋#ü˙ü÷˙ĵ!ż˙ùî !ò÷˙˙ô§+ Ï˙úŭ(/ĝ˙˙˙˙˙˙˙˙˙é˙˙›5èóΔ, ŭù˙’ ÏԚœÁ˙ôĝü˙˙˙˙˙˙˙˙˙˙  ˙˙˙˜-Ò˙˙Á%—£ )˙˙˙˙˙˙˙˙ŭ˙ŭ˙Ÿ!È÷˙Ë) ÷˙ĝżÂ˙˙˙,$˙ú• "Şú˙˙ -˙˙é˙˙üü'& ˙˙ôûü˙Ò2 ü˙˙ŝŝ˙üô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù% Ğ˘˙üùú¤)ÄĈĦĦġ˙ĝŭ˙ô ×úÈ˙ $%# ˙˙˙˙˙˙˙˙˙"›0 'Ìïúŝö˙˞. š˙™& ĝ˙ŝ˙ܙ/¤ġ˙ Ġ˙÷˙˙˙#˙û¤Ħ;žôח ;£ %­–ĝʧŝ˙˙ö›*$–Ë#Òô˙ù!¤˙Ĉ˙°&'!˙˙˙˙˙˙˙˙˙˙˙Ġ˙ò˙ñ˙Ŭâ•'( ×â˙ŝ Ħ˙˙ŭ˙˙˙÷ŝ˙ŝö,Î˙˙Éġ˙ġħ$ô˙öŝ˙˘İġ˙ŭ˙—#Ż)˙˙˙˙˙˙˙˙˙˙ò˙ñÊ'™´‘˙˙˙–"ĦïÊġß!˙ŭ÷óĤ˙˙ö˙˙$˙ö˙!!‰$ü˙˙öú˙ĝ˙ö˙˙û˙ƒ˙˙ë˙˙˙+ ×˙öú˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙ŝ˙ġéÊ˙ñ˙ûúë˙ /˙˙˙˙Ċ*˙èÖû˜( $ 1 ˙ü˙˙˙˙ŭ˙˙˙˙˙ŝŝ!˙ŭ˙˙ĝ˙˙ù˜  Î˙üóŝĦù˙˙ĝüÖ Ûûúġ˙ú˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙"°úî˙˙˙Áž˙˙˙Ò˙˙ûġ˙˙÷ïû˙˙˙˙˙˙˙˙˙Ò£"Ûĝò˙ßœü˙ŭ˙!ò˙˙ŝâ˙ Ÿ˙˙£Ħ³˙íŭÎ""˙˙ŝñ°,˙ô˙˙ïû˙Üŝ˙÷˙˙ŝ$ġ˙˙˙Ħ—˙Ô÷˙"ĴÏ˙ÔüŞ#ÍÇ˙ó˙˙˙˙˙˙˙˙˙˙˙ŭ×ÌŝüÉ˙ĴË˙ñ$˙ïÎ˙Ì ¤˙ŭ˙˙ú˙˙˙˙˙˙˙˙ö˙Â$&+£ŝùûÍ Ÿ%Î˙ô· à˙˙Ħ˙˙˙˙˙˙˙˙˙û˙÷ĤĦ2*İ—âĝŭŭĠŝú£%Ê˙ûË$  Ó˙˙ž/Ñ˙ûġ!œŻ ) ù˙˙öí²  Ĵ%÷ÏñĤ•˙˙š ï˙úò˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ê˙˙ú”* šßà—Ĥñ˙öó$&Ĵ˙Ԙ- "Ĥöß  ##%¤ü˙˙˙˙˙˙˙˙ùñÎ Ŭ˙úŭ˙ô­˙ñ˙˙ß˙ô˙ġú”˙ŭ˙äġ˙ûŝœ"%$ ˘˙Òù—! ïŝíï˙ó˙ĠĜúôè˙‘Ċ˙ŝ   Ô˙ü˙ùóŝû$˙˙ŭö˙˙˙˙˙˙˙˙˙ùÇ &˙˙ŭù˙ŝÏ)Ğïŝ˙˙˙$&ññ˙ŭ÷ö˙˙˙ô˙ƒ#˙ö˙ġ˙í˙Œ˘˙˙˙˙˙›ö˙˙ + ! (&­ò˙˙˙˙˙˙˙˙˙˙˙˙Ñ! &!!­ŭì˙’˙˙ú˙˙•"–˙ù˙˙Ž!ùĝŝò˙Ħġŝ˙Ĉ ˘µÈŜÒÄ˙˙ë˙˙ôù˙˙ĝ˙˙ĝĝ.Ÿ˙˙ïöú—Í˙˙˙˙ó˙˙˙ŝ˙˙˙˙˙˙˙˙˙ëö˙ĝ#˙˙úú˙˙˙Ú ŭĝô˙Ç% ŭ˙˙˙&Ñŝ˙˙÷ŭ˙˙˙˙˙ŭŝ˙˙˙ ùŝüŭù˙˙û° "žÚà˙˙˙–˙ù˙ġ˙Ö! ñ˙˙˙˙÷û˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙0Éú˙˙í˙˙— Ú˙ïÌ öúŝ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙•Î˙˙óÇİñ˙˙ù ˙÷ŭü˙˙ ĝ÷ñ˙é˙˙Í #ùŝóùÉ#˙˙ö˙˙÷ŭÒĝġ˙ùûöİŝüġ˙¨°˙÷˙Ŝ#—ŭ˙ñŝÍ $É˙ú˙˙˙˙˙˙˙˙˙˙ú˙ï"& #(ò˙˙˙úê'œ˙˙äÔĤĝ˙ĝôÔ$˙ó˙Ġ˙˙˙˙˙˙˙˙˙ó˙üÊùĝ˙˙Ö $ĝ˙üġĝ˙ #û˙ï˙˙˙˙˙˙˙˙˙˙ù˙ŝì˙ûÈ ì˙ùġ˙˙‘'Á˙˙ĝò,â˙ż˙˙! $&!ÒòúŝĠ’˙ĝ˙úÑ""˙öŭÓ˙ô˙˙Ò+Ċ˙˙•§˙˙Ê"˙Ŝ˙÷Ğ ²ò˙ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ÿ& Ż˙˙ùġ˙œ˙ëüÏ ĦġÊ˙Ù % + È˙˙!˙ݤ˜òŝ˙˙˙˙˙˙˙˙(÷˙Ç˙Ž Ç˙üü˙’'Ê÷é˙Ġ ˙ĝ˙ŭ˙˙"# Ó÷û˙˙›˙ŝüû '&Ğ ùëö˙ŻĞ˙˙˙˙ç˙˙ú)Ä˙˙˙˙ž%˙ùïüÌ ûóÔ“˙˙˙îó˙˙˙˙˙˙˙˙˙˙˙˙˙úĝñú˙˙ĝ´&ö˙û˙ûì ˙ü˙˙˙˙ú˙ŝŝ˙Ş ŝ÷˙˙˙˙˙—. î˙ìü˙ê Á˙ŝú‰-Ĉ˙˙Ğĉ˙˙û÷˙˙˙˙˙˙˙˙˙ûöŝö#¨Êù˙á˙˙˙˙ó!ßñóò˙îÖŻ˙í˙!Ñ˙ô˙áû˘˙˙ëš'!ôô˙èŭŭ˙˙üŭ˙ú÷û˙úŭ˙ùĝ˙§ İê˙ë˙˙˙Ş)Ìöïŝ˙˙ŝ˙ú˙˙˙˙˙˙˙˙úü˙á˙ Üúüġ˙˙˙ï’!²ù˙ô˙è ˙úì)§Ğ’ Ġŝŭ˙ĝ˙ŭ˙˙˙˙˙˙ŭŭ˙óġ"û˙û˙˙˙öŭ§ ˙ŭ˙ĝïÓ"ĝô˙˙ŝÒ Ü÷ú˙˙˙ûû×ïûû˙˙˙˙˙˙˙˙­ •˙ûġ˙ûö˙Ù˙˙˙´ š˙ŝŝ˙üô˙˙ġ˙˙˙˙˙˙˙˙û÷Ŭ œó˙˙úß˙ôġɰġ˙ŝ˙üñ ˙ĝ˙˙ŝĥ˙ œ˙û˙˙Ê Ċ˙ù˙˙˙˙˙Í˙ûú˙˙˙'ßö˙˙˙’™Ô˙ö'ŝ˙˙˙˙ĝ*Ûô˙˙ŭ˙˙˙˙˙˙˙˙ö˙§'Š˙˙ċ˙ü˙ȍï˙˙ġ›˙êû˙% œô˙˙˙è˙˙˙˙˙˙˙˙˙˙ü! ˙˙üô˙˙ž˙Ò˙˙ŝ˙#Ÿ˙˙÷˙î˙˙˙˙˙˙˙˙ü˙ù˙ù˙Ġ(&˙ñ˙ú˙òĦ ˙ü˙˙)&Äï˙ç˙ó)™›˙î˙ü˙˙ü60˙˙ö˙˙Ċäôĝ˙ĝ˙'˙˙ġ˙#˙òû˙˙0îû ¤ÒŻ Çù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íäĥñûòŭ˙˙Ĥ œ˙ü˙ŝÊ&˙˙é˜-µ›˙úùó˙ž"ù˙ġò˙Ŭŝ˙˙˙˙˙˙˙˙˙Ç˙ûï˙áĴ"Ñü˙ô ˙˙˙ŭġÈ5Ï˙ġ˙÷ù˘ħ˙˙ŭĝ¤)öñŭ˙$Ó˙Ëü˙ú˙˙˙˙˙'öŝùù˙ŝñ˙ žüŝ˙ó˙Â˙í˙Ö¤˙ù˙Ì$Şóüú˙(§˙˙ŭü˙˙˙˙˙˙˙˙ĝŝ÷Ş#˜˙˙˙˙ó˙—!Ÿ˙üô÷˙˙Ñ˙˙ŝë˙˙úñŭ˙ó›!ŝ˙û˙ú˙˙Âŭñ˙˙ï˙ŸÔû˙˙ô˙ġŭ˙úŭ˙÷˙˙˙˙˙˙˙˙˙˙˙û˙˙.)˜˙˙ó˙˙˙öòĝ˙(ĵ˙˙˙˙˙Î%–˙˙ü÷Ŭ %Ÿ˙úïÒ #*ŭŝû˙Ù  ”˙˙ê˙áċ˙ù˙ëġ˙˙˙˙ù˙˙˙ü˙Œ˘˙úĝ˙ċġĊİû˙˙Ï Úò÷ú˙˙˙˙˙˙˙˙˙ŝ˙˙˙ġ#Íù˙ü˙û˙˙$•û˙ü˙÷#ŭ˙˙£ Óú˙Ìûú˙˙˙ŝ˙ġù˙˙˙˙˙˙˙ŭ˙˙!!ŭùù˙˙ùĠ˙ !Ğö˙îü˙¤&ü˙˙˙öÊ##˙úúû˙ġ˙é˙˙ĝ˙˙˙˙˙˙˙˙Í %"˙ö˙ġŝ˙ó˙ŭ—&ü˙ü˙ú˙˙˙ú˙˙˙˙˙˙˙˙ŝ˙Ç û˙ê˙ÇÓ˙˙˙ Ĵĵ˙˙ŭ˙˙É1 ô˙˙ŭ˙٘'!  ·˙ŭ˙ñÒ¤÷ŝŭŝôŝ˙Ôġ˙ĝŝòĠ˙˙öÂ˙š!Ħŝù˙ĝ“, Ûòû˙ò¨ Ì˙˙˙˙˙˙˙˙˙˙˙˙÷İ Ğ˙ä˙˙ġû˙œş˙ŭé˙ Ï˙˙˙Ê $˙˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙%˙ĝġ˙÷ô$¤˙ŝô˙˙ġ& !É˙˙˙˙˙˙˙˙˙˙ë˙û˙ïĜ œ˙÷ü˙˙! $ó˙˙ŭċŝü˙ġ˙!•˙˙˙˙ì˙ù˙ó#˜˙ŭú˙ü˙ó˙ü˙˙˜ò˙˙÷ ’˙˙ûñ˙ûÔ˙˙ !! İ˙˙˙ùŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ä "Ĉ˙˙ŭ÷˙òŸ!%Ž˙˙óû(öô˙˘ùŝ˙ñ˙ù˙˙ ˙ġ˙˙ôŭ˙˙˙˙˙˙˙˙˙ú˙ú˙˙ŭ۞Üî˙˙Ö!ŭî˙û˙Ġ  ˙ĝ˙˙£˙ŭĝû˙'û˙ŝŸ%–˙÷ŝ˙ŭüÍ˙˙ù˙û¤ ˙ŭ˙˙˙ŭ˙˙Í˙ŝŝ˙óŞ ŭ˙üŭ˙–úû˙Ò !Ê˙˙Ë %Ê˙î˙ü˙˙˙˙˙˙˙˙˙˙Ξ˙ú÷˙˙Ĥó˙˙˙ô˙Êû˙û˙ò˙˙ö˙˙˙ŝ˙ûü˙û ü˙ü˙ĝ˙ú˙ûöŭ'£ù˙˙ù˙ŝü˙ò˙˙˙˙˙˙˙˙˙÷˙ê˙% ˙ì˙˙ïü˙ú˙˙˙" Ĝĝ˙úÍ˙ŸŻú˙˙˙úÔÉ˙ŝ+ ˙úûĝ˙ûĴùü˙û˙˙ö˙ú˙ŝ˙ġŝ˙˙ù÷˙ü˙—'”˙˙˙ĝ˙˙¤Ĉ˙ù÷ĦÊ˙ŭ˙ó˙˙˙˙˙˙˙˙˙ù˙î˙Ĝûŝ˙˙ú˙ü”˙ö˙ú˙˙ĝ˙Í"ë˙ûŭÑ˙ûġ˙˙ú˙˙˙˙˙üŭ˙˙ŝù˙˙˙˙úû˙ôŝ¨Ò˙˙˙ûÌ& ˙û˙ü˙Ï Ù˙ú˙˙£"úŭ˙˙˙˙˙˙˙˙ú$ó˙ò˙ü˙š˙˙ÔÄİ !Ëûú˙ŝ˙÷˙˙˙˙˙˙˙˙˙˙ŭö×!˙ú˙üü$Ùû˙öĤ˜˙Ï˙í˙˙É ˙ô˙Ö  ô˙˙üÜ Û˙˙˙˙ô˙ö)û˙˙Í˙˙ġ˙ö˙Ï (÷˙˙˙ôâ’!Ûŭ§ĉò÷˙ĝ˙˙˙˙˙˙˙˙˙Ò͞!œ÷˙ĝù˙öÍ˙˙˙˙˙ŭù˙ö˙$Ÿ˙úŝ˙ù˙˙˙˙˙˙˙˙˙÷û"&Éŝ˙ġû§" ˙˙ŭ˙÷ù˙üÑ%˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙Ëŭŭù˙˙ž &™˙Îĝ˙˙ Ìö˙˙ñ˙(›˙ŭö˙÷˙˙é˙)Ÿ˙˙ùü˙ú˙ûÚÇĊŞ˙ö˙ôÏ˙ĝ˙˙ü˙ŭ˙ĝ§ %Î˙ú˙˙ŝĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÓÈ˙˙˙˙é˙¨Ìŭ˙ŝ˙“˙ŭŭÚŝŭì˙˙ŝö˙óŝŭ˙Ì•˙ĝġ˙ùú˙˙˙˙˙˙˙˙˙ú˙˙ùّ¤"ñ˙ġ$ ˙ñ˙˙öÇ(÷û˙˙˙÷"š˙˙˙úÒ¨óìı úúŝ˙÷ó˙˙˙ü˙˙—˘Òŝ˙é˙˙ûŭÁ˙˙úü˙ü˙í˙û!˙ôŭ˙ŝÑ'§Ÿ¤!˙ŝŭ˙ú˙˙˙˙˙˙˙˙˙˙óû˙Ë˙ô˙˙˙Ÿ˙ï˙ú˙ôÒ ˙ò˙˙ü˙ûŭ˙˙úĞ˙ġ˙˙ŭŭ˙˙ĝ˙ŭġü˙˜˙˙í)Òû˙üü˙ùġ˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ ˙û˙ûï˙÷˙÷˙˙"Ċ˙˙ŭü˙#!—÷˙˙ü˙ǨĤË˙ĝû˙÷˙!˙ĝ÷˙ĝ˙ù˙˙˙˙˙˙˙˙˙˙ĝ˙˙öÌ˙˙ù˙öŝ›.Òú˙ĝ˘¨˙ì˙ü˙˙˙˙˙˙˙˙û˙ò˙˙ÔùĜŭù˙ŝ˙ ˙ñü˙û¨Ú˙ŝü˙ġ˙ùߝ˙ŭ˙ġŝ˙˙˙˙˙˙˙˙˙˙˙˙ŭġ˙úúúÛĠġ˙˙ġ˘˙˙ŝ˙ŝ¨!Íú˙û˙˙˙˙˙˙˙˙˙˙˙˙™Í˙ŝŭ˙˙¤üġ˙ôĦ˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙˙úÜ .öú˙˙Î÷˙˙ù+›˙˙˙ó˙˙œÏú˙ŝ˙û˙œ$ ¤˙˙üüÍ—üÓ˙˙ŝ˙ŝÇüûû˙§ ĴÍ˙ë˙ù›˙ŭ˙˙˙Â#˙Ħ˙ù˙÷˙ŝ˙˙˙˙˙˙˙˙×ûž/œŝ˙û˙˙ ù˙áù ˙˙˙ŝŝ›ĝ˙ù˙ú˙˙˙˙˙˙˙˙˙ô˙û˙öŭ˙£ ˙˙üô˙û˙ö˘ Ÿ§ İÀ˙ùŭ˙û˙û˙ŭ÷˙ŝ˙Ç'ôûûù˙üŭ˘ Ë˙˙˙öĠô˙ŝ˙ö¨ŭ˙ŭù˙ŝô˙ŝ üÖ˙ú˙˙—"œĦ!û˙˙ö Ħŭ˙˙ô˙ŝ˙ù˙›ù˙˙òŭ˙ó˙úù˙ò˙ûü˙˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úÏ!!˙û˙ù˙ü” ˙î˙ġÎĜ$™ŝ˙›ë˙˙ŝí˙˙˙˙ĝ˙˙ġ!˙˙˙˙˙ï˙˙˙˙˙˙˙˙˙ġ#'öŻ˙˙˙£ 'Ìó˙ú˙Ù! ˙˙ûŝ˙˙ Ö˙ô˙ŭ˙ š˙ߓ"˙˙˙˙ŝôŭ˙ò÷Ŭ"›Ó÷˙˙ù˙˙ì¤ŝ˙ü˙óŞ˙ù˙˙˙ 2½ŝ˙ûüü%Ĉûĝú˙óŝ˙˙˙˙˙˙˙˙÷˙۔Ĥ˙˙üġ˙Ù ˜˙˙˙˙˙ó­"Ïöú˙ŝ˙˙÷û˙˙î§' ö˙˙˙˙ôÜŝ˙ûŭ˙ô¨Ş˙ù˙Ħ'˙ñ˙˙˙˙Ÿó˙˙˙˙˙˙˙˙˙üúùĈ3˙é˙˙˙ŭù˙˙#¨öÇ˙û÷’!§˙ŭû÷Ùİ#’ßÒıö˙ò˙ü÷˙ŝù% ż˙˙é˙˙üö˙˙˙˙˙˙˙˙ĝ˙˙ŭ˙˙ Î˙˙˙˙Ò˙ŭŝÙ¤Ğ÷˙˙ú˙˙˙˙˙˙˙˙üùġñ˙Î˙ùĝ˙ĝŭÍ %Ÿġ˙÷úÉ# ¤˙Í˙ÇŞó˙˙'”˙ŝ˙û˙˙˙˙˙˙˙˙ö˙" §ô˙úï˙ú˙Ĵ  È˙˙ùĝ£$˙ò˙ù˙Ì×˙˙÷–.˙˙˙˙˙˙˙˙˙ó&žĠÑ˙Ȝ)˙ï˙üŞ-£òĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙ŝ˙£È˙ûô¸ĴÒ˙ĝ˙š&˘ĵ˙û˙˙˙§û÷ŭħĠ˙¤ Ğŝë˙˙àĞ˙üïû˙àġ)ŭ˙öó¨.Á˙˙à˙Ÿ$÷˙÷ü˙Ê!ÁüĞÓÔŻ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙ġé Ħ˙ŝ˙ġ˙˙%"Ÿ˙ïü˙ Żü˙ûŬ֞ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝÍĜü÷˙ñ !ĝï˙˙ŭûú˙É÷Ş7 ıüĝü˙ĝ˙ŝ˙˙˙üŭòŬĠ˙˙ûô˙ҚËĝ˙ù˙ £˙ŭûü˙–ü˙˙˙˙úü˙úĤ˜˙˙˙÷û˙ *”ŝÖ ,ú˙ó˙œ4âĝé˙˙ĝ˙ŭŭġ Ïŭŭö˙˙÷˙÷˙˙ŭ˙ĝû˙÷˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙µ,4˙Í˙˙˙ùîŞ%úġ˙ŝ˙Ñ" Ÿ˙˙ñ˘)˙î˙ò˙ú÷÷÷˙úóıĞù˙˙ġ˙˙˙˙˙˙˙˙˙˙ԙ(˙÷!üó÷ü#Í˙˙û˙í´ üŭ˙ûöŭ"Ïŝûĝ˙ñ°›íѕ)#ŸĊ×˙ñ˙˙Żú˙˙÷# ŝ˙ġî˙òĝ˙0˙óĝ˙˙˘šê˙˙ûġ"Ò˙˙ĝ˙0›úÓÍ˙˙ö˙ùü˙˙˙˙˙˙˙˙˙˙˙ôÑ"' ù˙˙ôû˙œ%Ĝ˙÷îÜĦ˙ú˙ûġ˙û˙˙úŭ˙Ĥ%˙ì˙˙ŭó˙ü˙Éθ˙à™˙˙Ïñ¤0˙˙˙˙˙˙˙˙˙ó˙ü˙˙%›˙˙ñ˙˙ïı*Ìú˙úü+#˙ġĝ˙żĠ÷ŭ˙˙÷˙üŝú˙÷ö¨ÙĝÓÈÒ˙Ê˙˙˙˙˙˙˙˙˙˙˙˙ïùó," Şñ˙˙ò§<™÷˙÷˙—Êò˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙,ġĉ˙˙˙˙ï˙Ç$.Óô˙ړ!&˙˙˙Ù˙˙˙˙˙˙˙˙˙Ú!( Ùĝü˙˙˙Ê*!ûü˙˙ œ˙ŝ˙Ì0"Ĉú˙Í˙˙˙˙˙˙˙˙˙ò˙Ĝ 'ŞĴ˙íċÚ' éô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙ùÖ˙Ñ# Ê˙ôúŸËò˙—!"Í˙˙ù‘#$" ßŝŝĈ  Ż ÇôÑ% Èġ˙Ĝ!ù˙˙ù!Żò˙˙÷£Ĥó˙˙ñ˙˙˙˙û˙˙ŭü˙˙˙˙˙˙˙˙˙û˙ŞÈ˙ú˙˙Ħ ™˙˙˙!(›Öġûŝĵ/Û÷ŭù˙˙˙˙˙˙˙˙˙˙ò"+ Ó˙ù˙˘ áŝÙë˙İ ĜöÄ˙ğ$ ,Àúûŝ˙ö˙˙˙é˙˙ì˙‘.ìù˙˙ù˙¤Ù˙ó˙ï ›˙ôŝû˙˜ Éù˙ú˙ŭ˙˙ŭ + §˙ŭŝ˙˙Ğ Ÿ˙ı˙˙ñûĠ—èûü˙˙˙ù˙˙”(˘ú÷˙öúĝ˙ŝï˙À$ˆ˙˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙& &˙ŝô˙íä˙—' ÷˙˙ñ˙Ô) ˙ò˙Ĥ  ˜˙ñ˙˙ġÚİ˙˙ô˙œ!÷˙û˙üí˙˙˙˙˙˙˙˙Ĉ˙ûñ!‡˙˙˙îŬ! ¨˙öıĝÔ"Ò˙ĝ˙˙˙Ġó˙˙÷˙°˙˙ġ$¤˙ùô˙ô˙ĝ˙ġ˙*Èĝ˙ŝ˙ù˙÷#˙˙˙ú˙%#œ˙Ú÷öË,½˙˙˙Ñ˙˙ù˙éù˙˙˙÷˙˙˙˙˙˙˙˙ŭò˙˙ ù˙ó˙˙ö˙˙˙ĦÛàï˙û˙˙ĝ˙˙ôŝ˙Ċ0 › ŞÓŝÈ& ˙˙Җ! —Ù˙ûš(ŸœİĞ—ú˙˙˙˙˙˙˙˙˙˙˙˙ñ¤ $ “•Ï˙ò˙È' ™ÎŞ %˜Ôŝ˙%™¨êŭ˙Ì˙˙ĝ˙˙˙‘"˙˙˙˙˙˙˙˙˙ù÷˙˙˙˙ô°£‡Ú˙î˙Ê%#&É˙ŝ˙˙˙˙˙˙˙˙ġġñ˙˙˜.!£ĝ£ $˙ò#"—˙ùġ˙¨ “˙˙˙ö˙ï˙˙˙˙˙˙˙˙Ëšŭ˙÷˙Ò %˙ôœ)û˙ö ˙ĝ˙Ħ (Ñ˙˙˙˙˙˙˙˙˙˙èŞ Ż–Ŝô˙˙˙Ğ œôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙Ħ *&½ù˘ñ˙˙û %( ġŝóù˙'!$ËġûŜÜü$ ˙ŭÈ" ÷˙!Ñ˙íÓ# +·œ˙ġ˙ġ˙˙ĉ˙˙˙˙˙˙˙˙˙˙ö˙í˙( #$’ô˙š" ò˙˙÷˙Í §ŭ˙˙Â0 ˙˙˙˙˙˙˙˙˙˙˙˙˙ùÀ  Ûó÷Ş $ ùÙÒ˙˙& Û˙˙˙˙ĝ˙ŝ˙˙üú˙ŝ# *Ĉ˙˙˙óħ Ġ˙ӘÙ˙˙ŝ£˙˙˙ü˙˙öìÏ!ŭ˙ġ÷Ġ&+İ˙òŞ  ˙˙’$"ŒÔü˙몐Ĝ˙ɢ˙Ì˙˙ùŭ˙˙ù*˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö' 'ŝ˙˙ñŭò!ž˙â˙˙̵é˙˙Ó  “˙˙÷ùĝï˙˙˘ÒÎ˙˙ŭŭ˙˙˙˙˙˙˙˙˙Ó ÜĠŜ -Êùö˙û×Ĝ˙˙’ ú˙ġÖÊ'„ßô˙Ĵ"‡Úĵ˙İ  "!'žòŭôŞ˙ü÷˙û" / ú˙˙Ó#ó˙Ô˙ŝö˙Ž4•ç÷˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙÷£,Ÿ˙ïë˙ÍĴÙó˙˙˙˙˙í˙ŭú˙˙˙öË%–ö˙žÛö÷œÚÁÎĴÑ˙˙ö˙óœ%¤Òú˙˙˙˙˙˙˙˙˙ŝùŭ˙ü˙ĈÎ!($˙ŝ˙˙Ü˙¤ . Ħ’!ŭ˙ôÄ##( Ĥ˙û˙÷ïġ˙˙£.$Ìġŝ˙˙˙˙˙˙˙˙˙ùüŝüç˙íÏÜÓ§Ùŭ˙˙ú˙˙ž(%Şü˙˙˙˙˙˙˙˙˙˙˙úĝ˙ŝ‡$ Ä˙˙à“ ×ÔÉĊ˙˙ĊéÍÉÖÌàù˙˙öÎɕ˘ċâ˙û˙é˙˙˙˙˙˙˙˙˙˙˙˙Ê”ħĊÖŭî˙óŝ˙"°(úó˙ÎÒÔÌÊ˙ìüŬÊê·ĉĝ˙˙˙ş½ !Ġ˙˙˙˙˙˙˙˙˙î˙˙ÄĠ)Ìïù˙é˙ù˙ğàÇċġü˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŭëéÖĵÛÜ˙ŝßéÌÌÖû˙ĝ˙˙˙ÓÚÂàù˙˙˙˙˙ûŸ "àċŻÌ˙ŝ˙ô% $›î˙¨ + Ÿ˙˙˙Ĉ  ÔĈŬú˙ÇËÏ×ÇÒ˙˙˙ !! "Ëù˙˙ì˙˙˙˙˙˙˙˙˙ü˙ŭȗ !+&  !ï˙óôû˙/—üóŻ-˙÷˙ĝ˙˙˙˙˙˙˙˙˙ï "ş˙˙ñ%¤ùÍ*%ġ˙˙ŝ˙ü˙üüċ˙ĝ– &*+üôŝ˙˙È"ò6 ˜˙˙˙¨Ĥ˙˙ġ÷ôëĠ˘ $œĈ˙˙Î Èï ˙ö ¨ÍÀÜÂ˙˙ŞÉëµ˙˙ŭò˙ŝ $ôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" !˜Ìŭ˙È/ .—ò˙ġġ- £˙ìü˙ž1Ħ˙ü˙×˙÷ô÷˙˙˙˙˙˙˙˙Û&ó˙˙úĝ)! ˘ġ² ! ˙˙'"ĠĜ—"ŜüúÜ­Œé˙ö˙˙"!)Ş˙˙ŭúß# Ž£è˙˙÷ϧ¨¤ž˙úŭ˙˙Ñĝ˙üöĜ‘$ !#(ŒĦ˙˙ġ˙˙˙˙˙˙˙˙˙ñ˙ïùŝœ$$—û˙˙˙ö˙ŭÎ%˙ŝ˙à˙ò˙˙ú˙˙˙ú˙˙ŭ˙ö§Ÿ—ÚÎ˙ĝ˙Í­˙˙ĝö˙˙ú˙˙˙îĝüĝü˙ï˙Ò˙§Ş”˙ù˙˙˙˙˙˙˙˙˙˙˙ö˙˙ñ˙˙˙˙†Ĥ’Ĉ˙÷˙˙ûñĝŝ´›ÉóÓ˙öŒ·Ÿë˙ĝöàž$¤§ Ò˙˙ŝú˙âŝï˙˙˙˙ö˙ú˙˙˙˙˙˙˙˙˙ŝú˙˙˙ô˙ŝŝö˙˙ö˙˙ù˙ï˙ñ˙˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĝ˙î˙˙˙˙ô˙˙˙˙è˙˙˙ŝó˙˙û˙˙îû˙ĝùġŭ˙˙˙ö˙˙úìĝèù˙˙ŝŭú˙˙˙˙˙˙˙˙˙ó˙îúÏ˙÷˙˙ç˙˙˙ò˙÷˙ñú˙ŭ˙ŝù÷˙˙ŭ˙˙˙ì˙ä˙˙è˙ò˙ġ˙ê&%Á˙˙˙˙˙˙˙˙üŝ˙í˙úúö÷˙˙˙˙˙˙ô˙˙ŝ˙˙ô˙˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙ŝ˙ïó˙ûê˙˙ĉñ˙˙ó˙ĝ˙˙ôŭĝè˙ú˙ï˙÷öò˙üò÷˙ŝ˙˙˙ġ˙ñöù˙úŝï˙˙óĞ£¤Ê˙˙˙ġ˙ŭù˙˙˙û÷˙ŝ˙ĝ˙˙˙ùù˙˙˙˙÷˙ŝ˙˙˙ ( ˙ŭŝ˙˙˙˙˙˙˙˙˙˙ċ˙ü˙˙"-Ù˙˙ġŝ˙ġԞ )§ó˙¤"ġó˙˙˙˙˙˙˙˙˙˙˙ôı™ %Ż˙˙˙¨–#Í˙ÂĦ£˘$*“˙ŝûüŝ˙˙ŭ˙˙˙úĜ/ŭ˙˙ôü™' ÒĦ"&×ùé˙ ' Ïù˙˙ô҈ "’˙ìû$  ˘ )£˙ŝí›*%Ğ˙˙ÎĴŞŝ˙˙˙ŭŸéô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ % ‹˙ #˙üü1˙˙î˙˙Ì%ž˙ò˙˙›.5™ŝü˙˙˙˙˙˙˙˙˙˙˙öž"£òòĞ *Óġ˙óŭû˙ -œ$÷’ 0"×ô˙˙œ žÏí˙ Íĝü˙˙êúÑĜ˙Û·˙˙é˙˙îÜÍôàĵÑ˙ê˙û˙˙Î˙˙Ëòù˙˙˙˙Ĉġ˙íë˙ô˙ü˙˙ŝ˙˙üĴ$!" $˙˙ü˙˙˙˙˙˙˙˙û˙ĝ˙˙Ġŭî˙˙ĝ˙ô˙îú˙üßÇ÷ŝ˙˙˙ĝŝ˙üġ˙û˙ŝúŝ˙ŝĜ˙ù˙ò˙û˙ŝñ˙ċú˙˙˙ĝöû˙ú˙˙˙û˙˙˙˙ġŝĝ˙ô˙Ŝë÷˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙÷ĝġ˙˙˙ŭ˙üùô˙˙˙ñöŭ˙˙ġí˙˙Ĉ÷˙ġĝ˙ğ¤Äü˙üÈ! ,ûúú˙ö˙ŝ˙ŝñ˙ġ˙ċ˙˙˙˙˙˙˙˙˙˙˙ü˙ü˙â˙˙ê˙˙á˙˙ŭ÷˙ú˙ò˙ŭñ˙˙˙óûĝ˙ġ˙˙˙˙˙˙˙˙˙ĝ˙˙˙íĝ˙ûŝúó˙˙˙˙ôŬ˙˙ôñ˙ŭ˙˙ó˙˙ô˙˙˙ô˙˙ö˙˙˙˙ŝ˙ú˙˙˙ŭ˙˙˙˙˙˙˙˙˙ë˙˙ġÓ˙ûñ˙ñö˙˙˙˙˙˙˙í˙î˙˙˙ġ˙ù˙ġ˙˙ó˙˙ŭ˙ĝüŝ˙÷ĝ•˙˙˙˙˙˙˙˙˙˙ö˙˙ó˙ú˙˙˙öü÷ò˙ò˙ù˙˙ò˙˙÷˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙ŝ˙ŝ˙ùï˙ú˙˙˙÷˙˙ë˙˙ŭ˙ġ˙˙ŭ˙ô˙˙˙˙˙˙˙˙˙˙˙˙è˙î˙˙˙˙˙˙î˙˙˙ò˙Ì˙ì˙îû˙˙˙ô˙ùö˙û˙ùî˙˙÷˙˙˙òöóÓĝò˙í˙˙ *% ¤,­èÔ˙˙˙˙˙˙˙˙˙˙˙˙˙ÇÓÒĜÌ˙ŭ÷˙ĝŝ˙ù˙˙˙ëéÒ˙˙˙ûĠ×öċÛż˙˙ùĝ˙˙˙˙˙˙˙˙ë˙ğ˙˙ìġÖŝ˙ó˙ġ˙ûÓŬÁ˙˙ġ˙˙˙ġÌĜÖ˙˙ùŝ˙ŝ˙˙ŝ˙ûó˙úóÈ˙Ö˙ÉÌúü˙˙˙˙ÍŞ-ÑÑŭùĜ Ċù˙˙˙ Ÿ÷˙˙˙˙˙ŭÎÇĠ˙Ê˙˙ŝú˙޳ šÒ˙ò0 Íû˙˙˙–$üòôú˙˙Úó˙ô˙˙ûŸ%Òòĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙¤#˙öÒĤ¤˙ù÷¤Í¤Ô×ûó˙ó˙ŭ˙úûĝ˙˙˙û˙ï˙˙˙ùŭ¤ż˙òû˙ùú˙˙˙˙˙˙˙˙˙˙Ûŝûë˙ù˙ùŝ˙ĝ˙üŭŭ˙˙ô˙˙˙˙˙˙ï˙˙ûó˙˙ú˙˙ü˙˙˙˙÷˙ġ˙˙˙úö˙ĝ˙ŭöŝ˙˙ö˙˙÷˙û˙˙ù˙˙˙˙ĝ˙˙˙í˙ŝ˙ġ˙˙˙ĝ˙÷˙˙ô×˙ġ˙ġ˙˙˙û˙˙û˙£Ħ̖Ħ˙˙˙˙˙˙˙˙˙˙˙ûĝü˙˙ó˙˙˙ĝ˙öŭ˙˙˙üġŭ˙ûŝ˙÷û˙üŝú˙ôû˙û˙˙ù˙˙ŭÚö˙˙÷˙ú˙ö˙˙ç˙˙˙˙˙˙ĝ˙ü÷˙ŭ˙ù˙ù˙ĝ˙ĝ˙ŭ˙˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙ĝ÷˙˙ŝ˙˙ù˙úúüüŝŝ˙ü÷ŝ˙˙ûû˙÷˙ú˙ŭú˙ûŭ˙˙˙ġ˙˙ ü˙ŭ÷˙ú˙˙˙ú˙ŝûŝ˙˙˙˙˙˙˙˙˙ŭú˙˙ùò˙úŝ˙î˙˙˙ú˙˙ŝù˙˙úŝ˙ô˙˙ŝ˙û˙˙˙˙˙˙˙˙˙˙ö˙˙ŭ÷˙˙ûŭ˙ú˙ù˙é˙˙ñ˙ô˙˙í˙˙ġ˙˙ŭ˙üŝ˙˙ġ˙ûġ˙úóŭ˙ûóŝŝ˙˙˙˙˙˙˙˙˙ġ˙ŝúüŝ˙û˙ú˙˙ŝ˙öŝ˙î˙˙ġ˙üö˙ö˙˙˙˙ûû˙ú˙÷ù˙˙˙û˙ÏÑ˙˙˙˙˙˙˙˙˙˙ú˙û˙ĝ˙÷ó˙ŭŭ˙ŝ˙˙ü˙ŝ˙˙˙˙˙˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙÷ù˙˙˙ùŝ˙ôŭ˙ŭ˙˙ù˙í˙ŭùú˙ŝ˙ö˙üĝ˙ŝ˙˙ĝ˙˙ö˙ö˙ŭĝ˙ùùö˙˙ŭ˙˙˙˙ë˙ú˙˙û˙ú˙ù˙ŝ˙ü˙ĝú˙ĝü˙˙ġġ˙˙˙ú˙ġŝ˙ôÍ˙ô˙£ ž˙ŝ˙˙˙˙˙˙˙˙ùŭ˙ï˙˙÷˙ŭ˙˙˙÷˙ŝ˙ŝ˙˙ĝ˙ô˙ô˙ú˙ô˙˙˙ù˙óö˙ú˙ô˙˙˙˙˙˙˙˙˙˙˙ŝüĝ˙˙ôö˙ŝġ˙˙ó˙˙˙÷ġ˙ġ˙˙˙˙ŭ˙ú˙˙˙˙ù˙˙˙˙ŭŝú˙û˙˙û˙ûŝûŝ˙û˙˙˙˙˙˙ú˙ĝ˙ì˙úŝ˙û˙ù˙ú˙˙ï˙Ì˙úñ˙˙ġ˙˙ŭ˙ŝûŝü˙˙˙˙˙˙ŭ˙ġ˙ĈĠ˙˙ŭ˙ĝ˙ù˙Ÿœ£Îú˙ŭ˙ó˙ù÷ÊĞÏĈßŭŭ˙ŝ˙ù˙œĦû˙˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġßÍ˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙ĝ˙ġ˙Ġ$š˙ê˙˙— Ÿüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ï˙˙ô˙˙üŭŜö˙ĝö˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ôû˙ ¨ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ô˙˙ö üĝ˙˙úÒ×ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙ŭö˙˙˙˙˙˙˙˙ñïôü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ĝö˙ù#˙ä˙˙üŝßĵ,Ħû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ï"$÷˙˙û˙˙’Ğ˙ï˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙Š!Ú½˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙öûÁ˙˙˙ö˙˙˙ŝ™Ġò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙˙˙˙˙˙˙˙˙úùû˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝ˙ġ˙˙(˙˙ùô˙˙ú˙–öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷-™ĝġ˙˙ô!í˙÷˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûôĝşÑĝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ùó˙˙& şŭż˙ŭŭ˙˙ì·ŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝü˙˙ô˙ɢ˙ĝ˙˙ĝœ‘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ùÊ-™œ!˙˙ġ˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙ŭûì˙˙úö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙üĝÊ&(Ş˙óĠ™+Úî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ñ˙˙û˙!§ÉÔ˙ÉÓĊŭŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝĦ%Şë˙ŝîü˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙ŭû˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ġ˙ô˙Â$# Ž˙˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙úüŭûü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŝŭ˙ġŭ˙% £˙Òû˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ò˙ùòô˙˙ŭŭ˙üú˙òô˙ô˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙ĝúï˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ġ˙˙˙ó˙ĐĥšÂû˙öŝŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûûûû˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙üû˙˙ïÍÙÔ˙ÔûÖĝ˙÷˙˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙ö˙˙˙ŭöü˙÷ĝ˙ŭ˙˙˙˙ŝí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙ù˙˙˙ù˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ó˙˙Ü˙û˙˙ñ˙û˙˙˙é˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ü˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ûĝŝ˙˙ö˙˙ŝñ˙˙ŝù˙ù˙úò˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ñ˙˙˙ŝ˙˙î˙ŭŝŝ˙ö˙ü˙ùü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ó˙˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ü˙ġ˙÷û˙˙ŝûü˙˙ú˙˙ùġ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üüŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭüüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭüüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝú÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüü÷òö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ü÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôàÑÌ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ĝ˙ûûĝŝ˙˙ùüú˙ŭ˙ŭû˙˙˙˙ŝüġ˙úù˙ŭŭö˙˙˙˙ü˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙÷˙˙˙ûö˙ùô˙˙ĝ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öġû˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭŝ˙˙˙˙˙ġ˙ûò˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôöĞ Ÿ˙ñ˙ûú˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙úüŭ˙á”à˙üô˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ŭިñ˙ö˙˙üù˙˙˙˙˙˙˙˙˙ûû˙˙ŭ˙˙ŭ˙˙˙˙˙ŭ˙˙ûùŭ˙ŭŝ˙˙ŭŝ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙ŭ˙˙˙ô˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙ü˙˙üü˙˙˙ĝ˙˙ŝ˙˙ŝ˙ĝ˙ĝĝ˙û˙üú˙˙üŭ˙˙û˙˙ü˙˙üŝ˙˙ûùŭ˙ŭŝ˙ŭ˙ù˙˙û˙˙˙÷˙ŝ˙˙ŭ˙˙ŭ˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙ó˙˙ì˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙ùĝü˙˙ô˙ġ˙ŭ˙ŭù˙ù˙˙˙˙˙˙˙˙˙˙˙ġ˙ù˙Ì˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙û˙üŭûü˙ôŝü˙ú˙˙ü˙ŭ˙ġ˙˙˙ĝ˙ü˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝŭ˙ŝü˙˙˙ó˙ġ˙˙˙ö˙˙î˙˙öŝû˙ŝ˙ç˙˙ŭ÷˙˙úú˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŝû˙ù˙í˙˙ü˙˙÷˙˙óö˙ôŝ˙˙ù˙˙ñŭ˙ù˙˙Á ËÎñü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙ùú˙˙˙ŭ'˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ù˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙ĝòĊ "Ĝö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙Ĝ #É˙˙ö˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙üú˙˙ò˙˙˙è˘' #Ž˙˙ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĉ (Ħŝ˙öĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝùú˙˙ŝüüü˙˙˙˙˙˙˙ûü˙˙ü˙ŝ˙ùŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ÷˙˙ŝû˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭ˙öïŝ˙˙üŝïŝ˙˙ŝù˙˙û˙˙ŭŝ˙˙˙ŝŭ˙˙˙ŭùú˙˙˙˙˙ûü˙ŭ˙ù˙˙ĝ˙û˙û˙ŭû˙öŭüù÷˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ì˙˙î˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙ñù˙ÇÜÍĠà•Íü˙˙˙˙˙˙˙˙˙ĝĝÏÑ Şòĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙ĊĜ#§ñ˙˙ŝ˙öŝĝ˙ûü˙˙ŝñĜË˙˙ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŭ˙˙ŭô÷˙˙˙˙ġö˙˙˙ü˙˙ġû˙˙ŭ˙ĝ˙˙ï˙Ùíï˙˙û˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ò˙÷ŭ˙Ġ˙Çö˙ò˙ŝìĈŭ˙ûÇ˙í˙Ë˙é˙ë˘#!#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙ï˙˙ä˙á)Ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûó˙˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ôé&œô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŻ ’˙ùñ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙ñ˙ó˙˙ò˙˙Ë.ù˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù›!2"Ħ˙˙˙˙ŝû˙˙˙˙˙˙˙˙˙˙ŭŝŝŭ˙˙˙ŝ˙˙ùü˙˙ŝ˙˙˙˙ûû˙˙ù˙ù˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭŭ˙˙˙ûŭ˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙úüŭûü˙˙ŝŝ˙˙˙ġ÷˙˙˙˙úúŝü˙ûŭ˙˙ŭŭ˙˙˙˙˙ŝ˙˙ŭŝ˙ŝ˙˙˙˙ûû˙˙˙ŝ˙˙û˙ú˙ü˙ŭŭ˙ü˙ô˙˙û˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙ġ˙˙ġ˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙ùö˙˙È˙› ŝ˙˙˙˙˙˙˙˙ú˙Û"0éô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ñ˙ûž*İûìöŭ˙˙ü˙ĝ˙èË °#Ĉû˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙Ŝ£ÑŸšû˙˙ŭġŭŸ¸˙ŭöï˙ŭùùĊ!Çôŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭġ˙˙˙ ˘˘ ™¨"“¨"'˙˙Ëü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙óö˙ŭ˙˙Ö'£óú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ûô /˘ŭÑ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ġ( ò˙öúü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙û˙˙ĝ˙˙Ê)! %)úŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ Ÿ•ù˙˙üŭ˙˙˙˙˙˙˙˙˙˙ŭüŭŝ˙˙˙˙û˙˙ŝ˙˙üŭüŭ˙˙ŭŭŝ˙ú˙ö˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙üü˙˙˙ûŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙üŭŝŭŝ˙˙ŝùĝŝû÷˙˙üó˙ùġ˙˙ô˙˙˙˙üûüŭü˙ŝüüŭŝ˙˙ŭüŭ˙˙ŭŭŝ˙ŭ˙˙ŝŝ˙û˙ŝ˙ŝ˙˙˙˙ŭŝöò˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙ö˙ó˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙÷˙ı$'ú˙˙˙˙˙˙˙˙˙ŭù!ôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š ¤üŝ˙˙˙˙ô˙˙˙Ù˙ŝ˙ôŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙˙˙ó™#Ìü˙ġÖöĝ˙˙˙˙ò'Ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü˙÷Ċ! 3%›˘- ° !#˙˙! $ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙ûü÷˙˙ġùö £˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙÷ŝ˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˘#Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü,”˙˙ê˙˙ö÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïÓ˙ĝú˙˙ú˙˙ä…˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙™·û˙ó˙˙˙÷ïú˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙ûö˙üü˙˙˙˙ú˙˙üü˙˙˙ü˙˙˙ù˙÷ŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙ûúûŝ˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûú˙˙˙˙˙ŭ˙˙˙˙˙÷úĝö˙˙˙ŝ˙ŝŭŝ˙÷û˙˙˙˙ŭù˙˙üü˙˙˙üŝú˙˙ŭ˙˙˙˙˙ŝ˙ŝûŭû˙ö˙˙ûó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙ü˙û˙ú˙ĵò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙ŝó˙4ÖĜ•(˙˙˙˙˙˙˙˙˙ô˙˙§ž˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üù˙ú½ %˙í˙˙úû˙÷˙ŭĝÍÎġòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝôû˙Ż ˙÷˙ùœ ˙ôùúġç²."Éŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙ô˙*ßù˙˙1Ìé˙˙ĝö° 3ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙ûôñ˙˙Ó˙)ž˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ëüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ûúŝ˙˙‘# ûġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙ñ˙˙ġíö˙˙ôŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙üŝ˙˙ġ˙ŝĝ˙˙ÑÛ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙­#“ġ˙˙ìú˙˙˙˙ööŝ˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙˙üĝ˙˙ŝ˙˙˙˙˙˙˙˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙úŭ˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙úùû˙˙ŭŭ˙î˙ŝú˙˙ŭ˙èŝ˙û˙˙óŝŭŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙ú˙˙˙ú˙˙ù˙ü˙ü˙˙ŝ˙˙ùĝ˙˙ö˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ˙ŭÄ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙î˙óÂ˙ŝ˙ç˙żġûŭ˙˙˙˙˙˙˙˙˙üîÇ'£˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ŭî˙ ›ĝĝ˙üù˙˙óü˙ñ˙Ĥâ˙˙˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙ù—! ˙à˙Ħšó˙ŭ˙˙ŭ !£Ôĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙è(áÏ˙Öŝ- Ŭ˙˙êÚËÑ"&˙˙Í(ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙ë˙ü˙˙ġĉ˙ÍĴ(›˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝüüŝ˙úĜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ĝ˙˙˙˙˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŝ &šù˙ŝ˙ŝïġÖûûüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¤÷ò˙˙˙öôü˙˙˙ù˙˙˙˙˙˙˙˙˙˙úñ÷üüò˙˙ĝ˙ŝ˙òŭ˙˙˙˙˙ŭĝ˙ú˙ö˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙üöĝüŭŝ˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙ñïôü˙ŝ˙˙˙˙ü÷˙˙ò˙˙˙˙ùŝ˙ó˙˙üŝ˙˙üùûùŭŝûü˙˙ŭòŭ˙˙˙˙˙ŭ˙˙˙ï˙˙ë˙ù˙ù˙˙ú˙ùú˙˙ŭ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙û˙˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙£ #Çúò˙ŭ˙òŝŭ˙˙˙˙˙˙˙˙˙˙˙ŭ˙ "˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭÇ!¤˙˙ŭ˙ú˙ú˙íû˙ÑÑó˙ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝñŝ˙ŭÛäġ˙˙˙ÊĞÔġ˙˙ú÷˙ä è˙ÇÙÖô˙ù˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙›ù˙˙˙ú˙!Ĉ˙ŝ˙ü˙ú›'ûŝß#˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙ûö˙ĝü˙û˙˘š˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙œġ˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙˙˙˙˙“Ħ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝġ˙úúù÷˙ú˙˙ŭ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ #ó˙ü˙ŝ˙˙ô!˙ú˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$›˙˙ó˙˙ŝ˙ŝĝ˙˙ŭ˙˙˙˙˙˙˙˙ù˙˙˙ùîŬÍĠ˙˙ù˙ôÜùÜñ˙˙ŭü˙˙ŝ˙ġ˙ßñÔÔ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝúŬÊÙĝ˙˙ú˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙üŝ˙ŭ§"Êġ˙š+È˙ŝŝ˙ŝôîïÊß÷˙˙˙îÜÜñ˙˙ŭü˙˙÷˙ùàûùÙ˙˙˙ù˙ĝċêܨ˙÷ Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙ĝŭ˙Êİ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙ûŝ˙! ˙ü˙ñ˙ĝû˙ŭ˙˙˙˙˙˙˙˙˙˙û˙˙›/”˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùö˙ڝò˙ó˙˙ŝü˙˙˙ĝ˙É#Ôò˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ĝó˙Ïü˙ô˙ĝ˙÷˙ŝï˙ŭړ"ž˙ô˙˙ù˙˙˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ùŭ˙Ğ˙ú˙˙˙˙ "Öò˙˙üú˙É˙˙ ˙÷ŭ˙ûŝĝ˙ó˙ŭ˙ï˙ĝ˙ì˙˙ù˙˙ġ˙ĝŭŭŭ˙ġ˙˙˙˙ô˙˙˙ûŝ˙ü˙˙˙˙˙˙˙˙ú˙˙ú˙ĝÒ˙ô˙ġ˙˙˙˙˙öû˙˙˙ĝ˙û˙ö˙˙ôù˙˙˙ŭÈ˙ù˙˙ŝö˙üĝ˙ñ˙ùü˙ù˙û˙ü˙˙ùû˙ŭ˙˙ĝ˙ü˙˙˙üü˙˙˘Ğĝŝ˙˙ù˙ú˙ç˙ġ˙˙˙ŝĝ˙÷˙ġ˙˙˙ó˙˙ŝúú˙˙ġ˙Ò˙üŝ˙úú˙úŝ˙üü˙ö²Ä˙˙ŝüĝûġ˙˙÷û˙˙ü˙ĝ˙˙˙ó˙ŝü˙ĝ˙ŭŝ˙˙÷ûö˙î˙ŝ˙˙÷˙˙ú˙ü˙˙˙ú˙òŭ˙˙Ċ#"Ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŝ˙üùŝ˙˙˙üö˙ŭ˙˜£İœ ž˙î˙˙í˙˙ù˙˙˙˙˙˙˙˙ŭ˙œ$˙ĝò˙úĝ˙˙ ˙˙ǚŞĠùú˙ĝŭġ˙üŭ˙ŝĊĤĴ˘öüüû˙˙ŝû˙ŝùü˙˙˙ú˙ £÷˙˙÷˙ŝûĝڗ¨Ġ˙ù˙÷ŝö˙Ì˘Í˙ÊĦ# Ì˙úÒ"û˙ûġ˙ŭ˙Î"˘£Ä˙˙˙ŝ˙˙˙˙˙˙˙˙üѤ˙íĠŸ ­Îú˙›˘œ˘Ğ÷û˙ûô˙ñ×˙˘Ÿ ¤˙÷ûŝüʛ Ĥ)&˙ŭĝ˙’Ì'Ò˙ġ˙ċ˙˙ËŻ Ħü˙ö˙( ™ "˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ô˙ú˜˘ĦžĴ›Ô˙óŭó˙ŝÓ ü˙˙ù˙˙˙˙˙ġ˙˙˙˙úŝ÷˙Ó ˙ú˙í˙˙˙ì˙ŝ˙ò˙˙ö˙ŝûŝ˙ŭùûö˙ÈĠ˜ž˙É˙˙ó¤Â˙ŝû˙ġ˙˙ôï+˙˙ú˙û˙˙òú˙ûġ˙ä˙˙˙ŭü˙ĝ˙"œù˙ŝ˙˙û˙ĝ˙ô˙÷ó˙ŭñ˙ĝ˙ŝ÷˙˙˙ĝ˙ü˙˙˙ùúŭù˙ŭô˙ö˙ú˙˙û˙Ĵ÷Ĝùú˙ù˙ü˙ú˙˙ö Ô˙ï˙úŭ˙˙ñ˙÷û˙ŭŝ˙ó˙˙ò˙˙ó˙˙ü˙ù˙˙ú˙öü˙˙ġ˙& Öóú˙ŝŝ˙˙˙˙ú˙£ù˙ú˙ġ÷˙üĝ˙ûüûü˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöŝĝ˙ $ Ôû˙ñ˙ġï("ż˙˙ġ˙˙˙—$ù+˙˙˙û˙˙˙˙˙ñġ˙ŭ÷˙ô˙ó˙˙ò˙˙ü˙˙˙˙˙ñŭ÷˙˙èüûô˙ùŝ˙˙˙˙˙˙˙˙˙úíü˙˙üú˙˙ùŭŝùò˙ĝ˙ôô˙˙˙ù˙˙ñò˙˙÷üŝ˙ê˙úô˙˙ù˙˙ĝ˙ŬÈÑ£ĠÀĊŝÇ ÉŜ¨Ê˙ûö˙ŭûŭ˙˙˙˙˙ü˘) ™ĝÛËżûüù˙ü˙˙óĝÖÖËİ˙ùë˙˙ó˙˙˙÷ê˙éĦ™ÍÎŝŭÖ̞Ġ­Ŝ˨÷ùò˙'&ÔÙŭö˙˙ü˙óǘ&" ˙ŝü˙ú¨°ü˙ù÷˙ĝû˙ĝá ĦŞ! ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ˙ħİ ›˙˙û˙ó%—˘' ˙˙ô˙î˙˙˙˙˙˙˙˙˙˙˙™â&Ë˙ìŭ˙ )˜§×˙öŝ˙˙ġöÜÔ˙( 1˙ûïó˙˙˙÷˙û˙ñöÒ"#“˙ö˙˙ìĤŬ+‹˙ò˙Î˙Š%6˜×"Ĥü˙ĝ˙˙Ê( ' éŭ˙˙˙˙˙˙˙˙˙˙˙Ó"$ä“!$˙ĝŭ˙˙ĉƒ)˙˙ô˙˙. '( 2 ˙˙˙ï¸  £˙ùê˙ŭÊ(  ú˙Ä#ûŭ˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙û˙Ž+¤˙˙˙ŭ$ ħó÷˙ñ˙˙˙ë˙˙ô˙˙!!%Šċ˙ò˙˙˙ÎË(”èĊöŭ˙˙˙˙ۙ'´!&Ñ˙˙ú˙ù˙˙ Íó˙è˙ĝó˙˙ç˙˙é˙˙÷˙Ô˙òË . ŭĝ˙ŭ˙ŝĝ˙Ĝ– Ş˙˙˙óñÏ£˙Òқ ÇÚĝ˙˙˙úÛÄÖ§Ĉ˙û˙ûŝ˙˙”(™ùû˙˙è˙˙ĝĝ˙˙ôĜ ù˙˙üü˙ü˙ûôċÎóö˙ü˙˙˙ŝ˙ù˙úĝ˙˙ŝ˙ú˙˙˙˙ĝĝ˙ĉ  Ó˙˙ŭ˙˙ì˙˙˙˙öû˙2™˙ú˙˙˙˙ú˙ĝ˙˙˙˙ûòú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġô˙˙˙îĈ3ñ÷ô˙÷˙˙× Éġ˙ñ˙˙˙ûê˙Î.Ħ˜”˙˙ŝ÷˙ò˙˙ʓÔ˙˙ŝ˙Ġ”˙˙ûĉûüâĉÍĤ$ŸÎ˙˙˙˙˙˙˙˙÷˙˙˙ĞŸ¤˙˙Ĉ%²²ÍĈô$’ ×˙î˙˙íŭÌ‘ž˘§öÓ˙˙íÔ %µ˙%"ı˙ó˙˙ŭŭ˙ŝûúŭ˙! % Ğ˙ü˙÷˙ùöĴ #÷µ$˙ï÷˙û˙˙˙˙ñ*ü˙š'$$ ˙˙˙ "Ì˙ô˙ŝŝü§*'Ħü˙ôÍ"’Üž£úî˙˙ö˙üΠ# Â˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝŭ˙˙ŝ˙Î( Ĝû˙˙ü˙ô˙˙˙˙˙˙˙˙˙% !# ˙˙û –)+˙ŝñ˙ë˙˙ö˙ÊĞ Ŝ˙˙ú÷ú˙úĝ˙˙˙˙“# £˙ûŝçĤ˙¤*˙òö˙("˙™ $¸Ÿ¤ü˙è˙İ)˙÷˙Éĥ˙ö˙ñ˙˙˙˙˙˙˙˙×  ¨˙% ž") ÷˙˙ż&¤˙ˑ5 ˘˙˙ôí÷Ĥ Şú˙› ˙ëö˙ "’ĝŝÌ.˙˙˙˙™˙˙ ­˙Ĉ™*,'ĦĦû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ӝΧ )Ì˙ŝñ 6 2"$˙ê˙˙ĝĝ˙˙˙˙˙‘ Ż£'œû˙Ĝ $(#Żôŭúû— 1*˙óŭ˙˙˙ %žŭ˙˙úüÑ)’˙˙üġ˙ĝññâÒŝ !•˙Â˙˙îĊ×˙ "¤öüŭ˙¨  Ĥë˙ûô˙™ !É˙ŭ˙ôÄöı ²ÖÍŭ˙É˙˙˙˙ï˙ĞÜóúŝ˙ĝô˙È˙–˙$„Öûĝ˙ġ˙ù˙ó˙˙ĝŭ˙˙˙ô˙üÍ˙˙² Ôóŝ˙˙ĝ˙Ëû˙òŝט’˙÷ú˙˙ŝ˙˙üŝöôú˙˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ê˙˙˙ġĵŝ˙ûĝ˙˙ùŬ%˙˙˙˙˙öüü˙˙˙Ò'& ( œ˙˙˙˙˙ĝĴŭòŝ ˙Ŝ¤£˙˙˙˙˙˙˙˙˙˙ñË ĦŸ$  ß˘ Í˙ġó˙ŝ#( ıġŝŝ˙Ġ& ›ë!Ş˙ŝ˙ï˙ŝüŭŝŭŭŭġĦ$ ™% ˙ì˙Ĝ&œìרò˙ŭŝúŝ˙˙×  ˙ù—&0 2ñ˙)˘˙˙ú,ö˙ü˙ġÖ˙˙é$ ˙ö˙,ĝ×òĠú˙ŝü˙ŝÎ&–˙Ĉ ”˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙"É˙ĝŭ˙!,ü˙ó˙ §˙ŭú˙˙˙˙˙˙˙˙˙˙˙É("³ó˙ó˙˙†"˙üîĤ$Û˙ô˙û˙úô˙’”ò˙˙˙ùû˙˙˙˙ïü˙ â÷˙ú²!ĤġûÏ&Í˙ŝòœ÷û˙Ğ(˙ü¤,ù˙˙ !£ –ŭ÷˙˙˙˙˙˙˙˙˙˙ŝ˙ "%ŝûäĦ/Şĝ˙ü!ħġ˙ġĦĜ˙ù˙ċ ”÷üŬ˙Ĥ 'Î˙ñ˙'˙˙ŝ× '˙˙˙ŭĝ˙ôôĉ)•Êü˙î"*‘ùŝ˙ä" ÉÈòû˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙óŞ'Ö÷˙Ğ*¨˙˙˙“  İĤ#“ö˙öî˙ñŝ˙ġĝ˙! ó˙›­ôôߑ  ”š!Ï˙˙³'1 !"Ġ˙ü˙ñô˘"ŭ˙ŝû˙Ğ ˙÷˙˙ü˙âŝ˙$(˙˙÷÷˙”/ĵùÏ˙˘,Ĝ˙˙çÔ" !œ˙˙˙˙ö#&$• ˙˙˙˜•ŝŝ˙öûÖ˘" ¤1#)˙˙ë˙˙˙ŝŭ˙ûö˙ŝ˙ŭ˙…' !ŝ˙ö˙Ôœ˙ŝ˙% %˙ûŭ˙ë˙˙÷ŭŭü˙˙˙úû˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙ö˙ùċ˙˙ô˙ŭġ˙úû$˙˙ôûú˙òŭ˙Ŝ˙Ĝ—&İġî˙£˙˙ġ˙ŭ× ×âҞ*Ğ˙ĝ & ! µġñ˘¤Î˙˙˙˙˙˙˙˙ĝŭ˙á+ $ ( "(Ô˙˙˙·ŞĞû˙ġ˙˙Ñ $ Ô˙Ξŭ˙ú÷˙üüüŝ˙˙˙˙ר ³ŭú˙™!Ĵ˙˙â–"˙˙Ù$ "Öíŝ˙ó˙˙ñö›'#"šô˙ŭ˙¤+à—Ġ˙Ǐ/öŝôŞ È˙˙üú$ ˙üàĴâ˙–"Ô˙˙üÒ.•ŭ˙ùĴŬô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ ŭ˙˙˙š'%˙˙ĝĝ$§˙ü˙ñ˙ö˙˙˙˙˙˙˙˙˙(ġòü˙˙˙î´ –ï˙˙ôğï˙˙ö! (ħ˙˙ġŝ˙˙˙ó˙ö˙˙ô( ŭôŝ˙Ì˙ĝ˙ċ ,×ġ˙˙Ŭ*!˙˙ĝ—÷ñ˙Ÿ'Ĉ˙Ġ"'* İó˙ä˙˙˙˙˙˙˙˙˙˙˙²! öï˙˙˙˙Ŭ˙) •˙˙úŜ, Éŝúè˙Ħß÷˙è˙úÜÇû˙˙&Ï˙á˙˙££˙èú˙ž-˙˙˙Ÿ  Ğ÷ŭ˙˙'&‹˙ù÷˙˙˙ŭŭŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò,Èġ˙˙ĝĤüö˙˙ñ"'ùŝŭüŝ˙˙ü˙˙˙úĝ˙˙˘˙˙˙˙úü˙ô–-˙˙˙˙˙¤$Çó˙ċ"˙˙ûúšü˙˙˙¤ŭù˙˙÷¨â˙üû˙ÀÖ˙˙èĊ( Ë˙ŭ˙š*­˙˙Í öû (('œš*žÀĤĠ£óûò˙˙ ˙˙  ˙ïŭĝ˙-!ó˙˙˙ ¨ÑÇ% Ë˙˙ö˙û˙˙ĝ˙˙ôĝÒ%£°Ä+ Ìó˙Ò›ŭ˙˙Ö&›˙˙˙ŝñ˙˙ĝ˙ġŭ˙˙ĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ûü˙˙÷˙óù˙˙˙˙Ŝñ˙˙˙ċ˙˙ù˙˙˙ġËÌ˙×ġš!œ˙˙Ù ,óì˙Á ï˙˙Ÿ'˙ÒÚĤüŝ˙˙˙˙˙˙˙˙˙˙˙ó˙£- ˙˙ú‘0%×öĜ™*Ä˙ĝ˙ĵŞûŝ‹/0¤ĝ˙˙è˙§"(ñ˙°ó˙ûô˙˙˙˙ŝüŝ˙ûôûœ6‡˙ŝ˙ŝ½†˙ŭÂ% °˙˙ŭ˙˙ĝ˙˙Ú í˙êüüö˙ & ˙˙˙óú˙˙ó˙ŭ˙½˙žÑŝ˙ü˙ !Ĥ˙ñ˙ĝ˙ĝ˙˙˙ŝ +"•˙ŝ˙û ˙˙ï˙˙˙ ˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ö)Ĝûû˙ö§ ’ï˙˙û/ô˙÷˙˙ö˙˙˙˙˙˙˙˙ò´$˙˙˙˙îġ˙“$Żù˙î˙%ŝŝŝÔ  Ĥ˙˙ŝ˙˙ŭ˙˙˙ĝû˙Ċ˙ü˙ú§Çŝô˙˙Ž$$§ŝü˙ĉ ˙÷˙˙˘% §˙ŝÇ˙  ˙˙š  Ħ››£­ŸÀò˙˙ġ˙˙˙˙˙˙˙˙˙ŭĝ ö˙˙˙ö˙#!÷˙˙è˙ #Şò˙˙÷ò˙˙˙˙ûŝ $™úÌô˙ùûİ˙ŭ˙ù˙– Çŝ˙ûċĦ˙ç˙˙˙Ñ"ü˙ĥ"´­ œúĝ˙ġ˙Éö‘# ˙ö˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙˙˙˙ù˙îİëû˙˙Ë˙Ÿŝŝŝ˙˙˙ùĝŝ˙˙˙žî˙÷÷˙î˙ò˙×—ġúü˙üú#É˙ó˙ù+ ûü˙˙!#ŝô˙î˙ É˙ì˙˙Ô%Œ˙÷˙Í­Çü˙˙ŭĞ"Ĥ˙êûä !' -£˙˙˙’›˙à˙ê˙öĤ Òúê˙È˙ŝ˙è˙² âóġ˙È*Íĝ˙˙É ×÷˙˙‡!+§“¤˙˙ç˙üûü˙úŝ˙ù˙˙" Ĥñû˙Ġ%˙˙òù§ -Û˙ŝ˙ Ùŭ˙ó˙˙ĝû˙˙ê˙ŭû˙˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙ŝú˙òĝ˙÷˙˙òŭĝñ "ŝî˙˙˙î˙˙ë˙ú˙ç! ˙ü˙ﵜŭú˙¤ßİ %˙òú˙İ*ì˙ŝ“'–˙ġ˙˙˙˙˙˙˙˙˙ôú˙˙ĵ+)›ŝú˙˙ Â˙úù˙&Ċ˙˙öÖ˙˙ĝĠ˙š „˙ġì˙˙Í1˙Ŭ žú˙˙˙ë˙˙˙˙üüûòç˙Ĥ-Ÿ˙˙óŭ˙İ'˙ŝÙ/ ,¸˙ù˙˙ñí˙˙ì(¸˙×˙û˙˙˙ ˙óô˙˙˙˙û˙÷üÉ#ü˙˙ù#ô˙˙ô˙òûĝúġ& —˜#—ÌâÔò˙×˙ë˙ôôġĦ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íŭ ˙ûó˙˙”,àú˙ôĝ(˙˙ôŭ˙˙˙˙˙˙˙˙˙˙üŬ)ŭìġ˙˙˙˙£ î˙˙òŝ 0Ö˙˙-˙˙ÛÊ×ÇÍŭ˙˙ô÷˙˙üû˙ö˙ŭ˙˙  Ş˙˙˙˙ú˙˙˙ĠŠŭ˙˙Úġ˙˙Û° %“˙˙ë˙$°˙É˙ËÎ˙üÑ÷˙üê˙ġ˙˙˙˙˙˙˙˙˙˙ ˙˙ŭöÜ ŭ˙˙ô£Ë˙ŝ˙˙óúúñ˙˙úİû˙ô˙ŝŭ"Żîŭ˙ö-Ò÷˙ŭ˙Ş Ħ˙˙ì˙£˙ûŝ#˙ë˙˙ġ˙˙ú˙˙ú˙š%˙ó˙î˙û˙˙˙ĝöŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ò˙ïù˙ŭĈÂÍù˙á˙Ë'! Ħŝ˙˙èü˙ö˙˙ó˙öÖ´'˙ĝ˙é˙ŝú÷+ ¸ù˙˙ôʒ0#ġ˙˙›*›úö˙ĝ Ğ˙ö˙˙”'Żò˙˙˙›˙Ŭ˙˘ ˙ú˙ù˙…#ïŭ˙“% ޳ïí˙ŭ0ŭŝ˙ûö˙ìÏÙ˙ô˙˙š'Š˙ġŝûÏï˙˙˙Î"0˙ŭü˙%Ï˙ĝô% '$(#š˙üú˙˙ùû˙ú˙÷÷˙))Ħġ˙ò˙""Ëô˙˙Ĉ0˙˙ü˙˙ž*ç˙ö˙äáĴì˙ù˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ñ˙˙ġ˙˙ù÷˙˙ĝ˙˙Ħ”˙û˙ĝ˙˙ĝŝ˙ú˙ú–"ú˙ô˙“!˙˙ŭ˙ ĝ͚Ĥ˜Öó˙ú˙ñ¨ùŝ Ñ˙÷˙˙˙˙˙˙˙˙˙˙ü÷˙˙  ˙ŭ˙ú#ĝ˙ŝô§˙˙˙ùŸ¤ĝŝ˙˙ĵ"ħûĝ˙ôü˙ &ûĝœ Ä˙˙ûŭ˙ŭü˙˙˙˙˙˙ôü–"Ĥ˙ú˙˙úŝ$ ˙í˙›žĦ—Ĥ˙˙˙ĝ˙˙˙ĝŝü“˙˙˙˙˙÷œ#—˙ŝü˙˙˙˙˙ü˙Ï˙ü˙$Ù˙ûûŭû˙ú˙˙¨á˙˙ü˙˙í˙üû˙›Üú˙˙˙˙ô!˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙%$Í˙˙Ϥ ˙˙ò˙˙˙ŝ˙˙ö˙˙˙˙˙˙˙˙˙˙"˙ŭ˙ù˙÷ú#˙ùŝŭü%"ġ˙ûĦôü˙û˙˙˙˙ĝ˙˙˙ùúû˙ŭ˙û˙ôŝ##Ġì˙˙ûû˙ĈÏ)˙ġŭ˙Ôġ˙˙"˘ùù˙ĝ!˙ù͞ô˙˙ŭúĠŝö˙ûù˙˙˙˙˙˙˙˙˙˙úĝñ˙ü˙ûĝ*˙÷÷ŝ£Ÿ˙˙ó˙˙˙Ÿ˙˙ ×˙òŝ˙û(™˙ŭüûÖŭŭ˙ôŸ˙˙í˙˙ §ô˙˙ŭ˙ŝ˙÷üŭ˙÷˙ñ¤›˙˙˙ĝ˙ŝ˙˙ŜŬñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙ġ˙˙˛ Ë˙˙˙˙˙Ĥü˙ú˙ô˙˙ò˙ŭ˙ĝŝž&›û˙˙˙ŭù˙ö˙˙ó˙˙ôÚ ˙Ùê­ Î˙˙ĝ˙’"˙óÑ( Í˙Ëü˙ £üüüš§ŝ˙÷˙˙& §˙˙ü "Òŝ˙ë˙üñ˙˙ċ˙! ˘˙Óö˙ú˙˙ñŝñ˙ÄÑ'Ĥĝ˙˙Ï™˙ŝùú˙%˙ŝ˙ġù˙Ë!+—‘äĝŭ˙÷ġ˙ú˙ò˙ŭ˙ñ Ô˙û˙˙! Şŭ˙˙Ҟ&›ùüŝŝ£"ß÷ŝü­ 0 !™ü˙ö˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙÷˙ùù˙˙Ä!œ˙ö˙˙˙ù˙ü˙˙óŭ¨ û˙û˙ü-Ö˙ô˙Ë˙˙ú˙÷˙˙ŝü˙˙˙˙˙ù#Ì˙˙ûŝ˙˙˙˙˙˙˙˙ŝü˙÷ŭ÷˙˙ĝó¸Ô˙˙˙˙™Ñ˙ŝ÷˙ŭ˙˙ûö¨ *ıÁù˙ö˙˙×Û²è˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙ŝİ "“˙ŭŝ˙˙İÑ˙ó˙˙˙ú˙î˙˙÷˙ġ˙ú˙ŝüŞú˙üù˙ú˙’àĝ˙üŭ˙üüô² ĵ’$É˙˙íÏ˙ŭüŝ˙˙üŝ˙Ĥŭñ˙ù˙ôĝ˙ĝĝĤ"Úĝ˙ô˙˙Ì˙ï˙˙ġ˙ûŭù˙˙˙ŝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙ù˙ÄĠû˙˙îİ' í˙˙˙òŸŭù˙ùŭ˙˙˙˙˙˙˙˙˙úù!ö˙˙ù˙ü˙›ŝñü˙˙!Îŝ˙ö˙˙÷˙ò˙ŝ˙ŭúŭ˙ġŝú˙úüŭü˙˙ŭ˙˙ú(ŞÀË Ò˙ŝó˙ŝ˙ü˙ĝĦùü˙˙Ħ˙ŝ˙ž ˙˙˙˙ùù˙˙û˙÷ï˙˙˙˙˙˙˙˙˙û˙ ˙÷˙ŭ˙Ä#ġ˙ĝ˙ÖĦ˙Áü˙˙Ñ˙Ö%˙ŝ˙˙˙ù›ú˙ŭ˙×ó˙˙î˘%­˙ï˙˙Ÿ˙˙Ó ˙˙ĝù˙˙˙ô˙˙ü˙™!Ħúú˙ö˙ŭ˙ò˙Ôŭü˙ĝ˙˙˙ù˙˙˙˙˙˙˙˙˙ü˙˙˙û˙ŝ˙Ïŝ˙˙ŝÔ˙ù˙˙ĝ˙˙ĝĝŝ˙ûúħĈŝ˙ö˙˙ü˙ô˙"È˙ì˙üù˙˙˙˙˙”œöû˙ŝ˙Ê˙Ñ˙˙ñ˙ Ò˙ŭ˙˘(›˙ŭú˙û£İ˙˙ü Ï˙˙ú˙ġ˙˙˙˙ë˙Ĝû˙ú˙˙ûü˙˙˙¤™ú˙˙Ò$Ċ˙˙ó˙˙›'Ċ˙˙˘Ġŝ˙× É˙ô˙˙ŝŭ˙ó˙ŝŝ˙ù˙˙ûû˙˙“ 'ù˙öú˙˙ ) ˙Ï˙ù˙ú˙ÒĤ$š˙˙Ĉ".˙÷˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙˙öûĴ $˙ú˙ú˙ŝ˙˙ĝú˙ŝ +)ş˙îú˙˙& Ÿ÷˙Á)Ñöú˙ö˙èŭÚŭĝûüó# ¤Í˙ü˙˙˙˙˙˙˙˙˙˙˙ù˙ŝ˙" ˙˙ŝ˙˙ É÷ò˙˙›Ëú˙˙˙öñÉ.2ˆ˙˙ù˙üĝÑ) ,ì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙ İŝŝġ˙Ç-È Êúü˙˙î˙˙˙ñù˙˙ĝ˙˙˙û˙•˙˙ĝ˙ŭ˙î"­ë˙˙úŭ˙˙Ì"é­* üë˙ĴÊÓ˙ĝĝ˙˙˙—! ˙˙ġüù˙ŝġ˙˙Î5 Ċ˙ï˙î˙Êġ˙û˙ü˙ž˙˙ĝŭ˙˙˙ŝ˙˙˙˙˙˙˙˙˙ú˙ñ˙#û÷÷˙˙“˙ĝóñ˙) "ú˙ö˙ô˙˙˙˙˙˙˙˙˙˙× Í˙öó˙ù÷üÊ( ˙˙˙üê,˙˙$ ˙˙˙ĝ˙˙˙ûòù˙ùù˙ŭ˙ŭ˙˙˙˙ò˙˙Áû ¤˙˙˙ !ù˙˙ù) (˙ôö˙ŝµ˙üŭ˙ *Ÿ˙Ïî"ĝü÷˙˙ÊÔÍ˙˙û˙˙˙˙˙˙˙˙˙úġ"ô˙˙˙˙Ô ˙÷˙˙ù&œó˙˙÷Ħ #Ġôİ˙˙öŝî˙! Ğŝ˙ùúĦ"!í˙óêŞ Ë˙˙˙÷˘ñŝ˙Ħ˙˙ù˙ġ÷ġ˙˙˙ú˙µ £˙È˙˙ó˙éëÒ˙ŭüô˙˙˙˙˙˙˙˙˙˙˙˙î˙˙È!Ëŭ˙$Ûó˙÷˙ù"ó˙˙ŝ˙ï˙˙˙˙˙˙ŭœċ˙˙û˙ó˙˙ùó˙)˙ĉ˙˙ġ˙ĝ’ &šüü˙Ñ$ ħ˙˙ġù˙À˙ù˜"°ċ˙˙ġ˘"˘ôù˙ިŝ˙ġ˙óŞ"Žó˙ì•˙˙ù˙ô˙˙í˙ò˙ç %˘˙ù˙ûû˙˙ž'£˙ÈöĜ-(˙ü˙ûġĞ2 ž˙ĉÍ˙üÉ!İ˙˙˙˙ó˙Ĝĝ˙ôĝ˙˙˙÷˙˙ġÚíĞ ġĝ˙ŝ÷ò ĥ˙÷˙˙!"ĉì˙ôòĦġû˙˙‰ #˙˙˙ŝöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭö˙˙Ÿ+ Î˙˙˙ŭĝ˙˙ó˙˙  Ö˙˙˙˙É %İû˙ŝ½˙˙ú˙˙˙˙˙î˙ö˙˙›$ Ĥüó˙ü˙˙˙˙˙˙˙˙˙ü˙ù˙˙¤ü˙ŭŝ˙¨ Î˙úöòŞú˙òú˙ħ’Ÿ ŝ˙ŭ˙ô˙˙¸‘˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙ÓĦœ˙ġÚ˙Ï%&˙&ĴÌö˙ö˙ĝ˙˙˙˙ô˙˙˙˙ûï˙ Öŝï˙÷˙üó * Ħ˙ü˙˙ë˙ü=š˙ü°"˙˙˙˙Ÿ%ûñ˙˙˙ŭú˙˙,ĝ˙ü˙ê˙Ú˙˙ïÓùúñ˙ü ˙ö˙˙ĝ›' §úŝŭ˙˙ŝû˙˙˙˙˙˙˙˙˙ù˙˙í Ú˙ġ˙ŝ° Ÿ˙ù˙ŝ  ˙ú÷˙˙û˙˙˙˙˙˙˙˙úÚ"¨ù˙˙ŭü˙ŝ*Ë˙ñ˙˙‘°÷ï˙Ü˙ŝ˙˙Ħ š˙˙˙˙üġ˙˙˙ñ˙ġûÛ *˘˙˙ú˙ÖŭïóŒ'+Áŝ˙À Ô˙˙˙ú#Žü˙˙Í - ŝ˙˙ô/˙˙˙úž$Żġóöú˙˙˙˙˙˙˙˙˙ú-˙ŝö˙÷™Ÿñ˙˙˙¤ İ˙ú˙§$˙ó˙Ĵ˙˙˙˙˙$ ÷˙ë Ô˙ü˙ü) Îŭġ˙˙&2™˙˙÷˙Ÿú˙è˙˙А˙äŭ˙œ(‘˙˙ŭ˙ĝä˙ '•ü˙˙ö˙˙ù˙˙˙˙˙˙˙˙˙óö˙# ˙Ġ˙˙ĝ˙ñÄ˙˙˙Ú˙˙˙ġ˙˙˙é˙ŭó1 ĝ˙˙˙˙˙ŭ˙ö˙É$Í˙óö˙Â˙§˙˙úù­ ( ÷ûŝ˙˙(Ÿ˙ŝ˙ - (Œ˙˙ò˙£˙˙˙‡#ô˙ġ˙û0˙˙ŭëšê˙ï˙˙Ĝ£Ç˙˙˙Ĝ&“˙˙ü˙óŝ˙˙— ùġ˙˙Ŭ ˙˙˙ĝüŝ*™ŝ˙Ġ˙ûÌ) ˙˙ŝô˙˙ì˙ü˙˙ĝ˙ŝ˙ŝ˙˙ï˙Ö˙ŝ˙û˙Ü* ë˙îÏ %ùú˙ú˙œ˙üòò˙É£žİ˘+óô˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭì˙˙÷˙˙Äĝŭ˙˙˙ŝ˙öû˙ŭŝü-£óüû˙ġž9 ˙˙Ŭ"óĠ˙òŝŭçù˙ŝ˙˙˙í¨$Îŭ˙óù˙˙˙˙˙˙˙˙˙û˙ĝŝ˙ šġ˙˙˙˙ö(Ëĝ˙˙˙Ÿ Ú˙˙˙˙Îò˙ÓŸ˙˙ó˙˙î˙!!Ü˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙ĝ - Ïġ˙˙ûžü˙”#™˙˙ġ˙ǕĦ“˙˙˙ĝ˙ŭ˙˙˙˙$–˙˙üúûú˙ œ˙˙ŭì˙˙ì˙˙Ñǜ*òŝŭ÷&ĞÄÍŜŭö & šúöĜĦğ˙˙ĝ“2˘Ò˙öû2Í˙ùġ¨%"Ú˙˙ü˙üŝ˙˙˙˙˙˙˙˙˙˙ĝŭ˙) (ġ˙ŭġ+ Ä˙˙ó™&$Ĉ˙˙ú˙˙˙˙˙˙˙˙˙ĝÖ˙î˙Ìŝ' Żŝ˙â˙ ˙úĈÙ²Ĥ–(˙ñî˙˙ŭò˙ġ˙˙˙Ÿ Œ˙˙úĦ& ˙˙ü&˙ô%%˙ô˙ž ­˙ĝâ™%Óùŭ˙Ó!)Žüŝ˙˙ü˙˙˙˙˙˙˙˙Ŝ, û˙ġ˙?­Éùûޝ˙úú¨š- žò˙–  ˙è°!#£ò˙£,  Û˙ó˘ Ñ˙÷˙ŝ‘ $ İŞ˜˙ö˙ ˙ç˙˙˙ŭ $-Ëüŝú˙˙ŭ˙˙˙˙˙˙˙˙÷˙˙ôŸ£ž' ˜÷ï˙˙œ›™­ŝü˙˙óûŝú˙˙˙&”˙ġ÷ÏĦ˙ê˙˙˙˙ò˙ŭû*˜˙˙˙˙ Ĵöùü˙%§ö÷Ó! ˜˙ŭ˙ĵ ˙è˙˙+%Ôü˙îŝĞ ˜üù˙í  ŬûôŝΛ úû˙Î!)ŭĉ˙ĝ˙ŭÀÄ˙˙˘˙ŝô'$˙öó˙éÜ"Ġü֓!ÖûŝŜ $Ñ˙ŝ˙˙˙-›ŭ÷˙˙÷ŝ˙ùüŝ˙˙ì%˙˙ñúġ*Üò˙˙Ô¨Ġ÷ĝ˙÷§ Ë˙˙˙ùê˙˙ûú˙ż˙˙˙ü˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ĝ˙˙ĝ˙¤Ê˙ùĝô˙˙ĝ˙˙ûÈ  ˙˙ô˙ú %üĝ˙ (™ŭ˙˙úÏ'§ġ˙ú˙ù˙™#ŝĝġ˙˙ŝ˙˙˙˙˙˙˙˙˙ĝ˙ôñ*#˙í˙˙ôĜ#ż˙˙˙òŸ—ü˙˙ĝÏ˙ġ !Ê˙ü˙ĝŝ˙ñĦĤ˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙ŭ­%ÒÒ˙ó-¨ŭ˙ü½²Ôˆ•ÚÔĈ"&˙ŭûù˙ŭü˙˙ŝÎÍÍÙ˙˙'(Èù˙ê˙˙Ŭ!–˙ĝ§ ú˙ġĝ˙ŝ% ( $í˙ù˙¤( &Ü˙ĝ˙â ŭ˙ôĴ%‰ó˙ĝŭŝ˙˙˙˙˙˙˙˙˙˙ŭ˙ùĤ 3Ġú˙×#" ˙üá  .ö˙˙˙˙˙˙˙˙˙˙˙˙˙‘,˙˙Ïú˙˙ ”˙ġ˙½°% (Â˙˙˙˙˙˙ġŭ˙˙ú÷Ë-!!·˙Ñ(Žŝ˙Ó) ñ˙˙ §˙˙ $.˙í˙! Ž˙˙˙˙‘#" İ˙˙ùüùû˙˙˙˙˙˙˙˙ĵ$Ò˙› ´÷Ÿ$÷ŝ˙ŝ  $Żó˙Ü *•˙ҟĵȧÌ˙ë!ñô˙%$£ù˙ĝ˙ܚ"˘É˙òŻ!Ħß˙˙˙ñ˙˙, Ĉü˙˙ŝû˙˙˙˙˙˙˙˙˙˙ŝï)#–Ġ¤'­˙ï˙ġ ˙ŭò˙ü˙ġŝñ˙˙&$ Ġ˙˙Í ˙˙ú˘ &—Ó˙Á˙£”˙˙ġ—1Ÿ¨  &úÏ˙˘%˙˙ëŝÖ÷˙˙ '˙˙˙˙–-˙˙ĦŞ˙˙ŝ•˙˙˙ñü˙üÌ˙çĤ# Ĉ˙˙˙ Ĉ˙˙˙ßÉÏ÷˙ĝ ,Ë˙ü'' ¨óĊ˙ ˙ûëŭ˙óú˙˙ĝ˙ú˙œ&ĵ˙˙˙Şğ˙òĝŭ#!Ë˙˙÷˙  %œĉ˙ü˙˙ŭŭ˙ġ˙˙÷˙˙ŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óû˙˙üá˙ÊÚè˙˙˙ù˙ŝú˙üĴ1#Ñ˙˙Ċ" ˙÷˙ژ6š££%•˙ŝ˙ŝöñú+ß˙ö˙ö˙˙˙˙˙˙˙˙˙˙÷˙ċ˙#" Ê˙˙ú˙ ×˙˙é+ö˙é˙! Ĥ ,úü˙ùü˙ñŸöü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙ŭĤ#ú˙ö˙˙ċ˙Ş$ %˙˙ŭ˙ŝ˙ŭöùĝê7$'–ó˙¤É˙ô˙˙üñ ü˙ú˙˙˙˙ò˙˙˜+Ì˙˙ŝô˙##(Â÷÷ô˙÷Ò² -! İŝç˙ü! 0Ó˙÷˙˙˙ü˙˙˙˙˙˙˙˙˙ŝ˙$§˙ĝú˜üŭ˙­™ £–˙˙÷˙ú˙˙˙˙˙˙˙˙˙˙Ú!— Ë˙Ì++î˙ĝ˘ ¨ŝ˙˙˙ê§˘™$ $¨ŝ˙èüŭü˙˙û˙˙ĝ˙ŭħ˜£š‘˙˙ôŞ˘Îŝ˙ÊĤ’˙˙úĝù˙ÜÄŭ˙î˙ˑԐŞûŝ˙Ġ’¨š°˙ñ˙˙˙Қ–ž¤Óú˙ú˙˙ĝ˙˙˙˙˙˙˙˙˙˙ôĴ™İò˙û˙˙ԔޜÏ˙˙Ë˙û˙ŭ˙˙˙˙ŻĞ˙ü˙˙Ĉùŝ˙˙ò˙˙˙ùò÷ŝ˙˙˙ùĝ˙ó˙˙˙û˙˙ù˙ú˙ġĝ˙˙˙ûŝù÷Ÿ˙ú˙˙˙ßœ˙˙ŭû˙ò˙˙˙ò8 Ŝ˙˙˙úĝ˙˙˙˙˙˙˙˙˙ġ˙˙˙#ŸÑ˙ϔ’˙ùîЍ/'£ ˙ï˙˙úû˙˙˙û˙á§Żù˙ġúĞİŠ¤#+‘¤Ïéüŝ%# Şŝò× ²Ì+  Ïŝû#˙ù˙˙˙Ħ()—˙˙ġ—Ñŝ˙˙™ '( % Èĝ˙İ!(˙üö˙ò˙$‹ĥ!",˙ûÑ'$!•Ò’ Ìûüŭ›˙˙”% г#ħóŝ˙˙î˙ú˙˙˙˙ü˙ü"˘˙Î!-ĝ˙˙Ü$Ú˙ĝ˙< &˙˙ŭ˙óôûü˙˙ò˙çûŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙̚'è ˙÷÷˙ú˙û" !Í˙í˙)§Ì˙˙˙˙ŭ³ ’˙˙óú˙˙˙ô¤' ê˙˙ġ˙˙÷˙˙˙˙˙˙˙˙˙ö˙Ê+$˙ê˙ 1Ġŝŭ ÚôÓ˙™ É&Ş˙üüùú˙ûŞ˙ùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙üħ%Ż˙˙ñù˙úġ˙íġŞ#+˙˙ġú÷ĝŭŝ˙˙˙˙À# ˙˙ùĤ#‘˙˙˙öüó˙ûÉÚüü˙Éü˙òĝ˙ŝ˙ú˙ĠÖ şĵò˙˙ù˙ìäÄàÊŜî˙ö˙˙êŝġ˙ϧÖĝÂĉÏÓÈË˙˙˙ûûĝ* Ç˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙ö󒪞¤Îì˙ö˙ġ×ÎÎ˙ì˙˙ŝ˙Ïŝ˙üŝñ˙÷˙˙˙˙˙˙˙˙û˙î׆!˙˙˙˙ú˙ij˜ñ×˙úù˙˙üÂ˙úúñú˙˙Äŝ˙ĵÔçñú˙˙˙û˙û˙ü˙˙ùġ˙˙í˙Öù˙ö˙˙á˙˙Îú˙îù˙ùÎ˙˙è˙ù˙ì˙˙˙îġ˙ŝ˙˙˙àô˙˙ü÷˙ĝ˙˙èû˙ĝġ˙ŭüè˙˙˙ù˙˙ĝ˙˙˙˙˙˙˙˙˙˙ô˙ú˙ŭ˙˙üü˙ñü˙˙˙˙üü˙ó˙˙úó˙ŝù˙Û˙ŝòüĝ˙˙ôŝ˙˙˙˙ë˙ŭûö˙˙˙ï˙úó˙˙˙üö˙ûÍÎÇ˙ñû˙òĝû˙ú˙˙òŭ˙˙˙Î×ÀâÔÎÊË˙íŝú˙ĜÂà÷÷˙ü˙˙˙˙˙óûĜó˙ŝ˙˙˙˙˙˙˙˙˙˙˙úùó˙×ÂÇß÷˙ŭ˙öèĈ˙ú˙˙ú˙öÍÂÇú˙û˙ù˙˙˙ìŝĝ˙úŝÇÍ֘°žûÇ˙ĝü˙ù˙î˙—%ÇÂ˙ò˙˙˙˙ì)¤•œÚí˙ñŬÓËĊ£Ż…Ù˙úŞĴÙ˙˙˙+ÖŜŝû˙÷ü˙½Ġô˙˙úŭ˙Ğò˙ŭù˙Ë% +Ù˙˙˙˙úŽ"$²ü˙öġŭ˙Ĥ Ñ˙—!!ËóŭŬ #$"³ü˙˙˙ôú­!&”ó˙üµ+' ˙û˙í˙˙ùĝĝó˙˙˙ŝ˙˙Ğ Şù˙  Ú˙˙ * ù˙˙ŝ˙˙üûú˙÷˙˙ŭùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úö˙Ñ& ñ˙ŭ˙ò˙úóá˙úÓŝ˙ü˙ŝÂŬöŭ˙úüú˙ŭÉŞĦšŜÖ˙˙˙ù˙˙÷İ™˙ùŝ˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙ŭ˙˙ŸĴާŸÒú˙˙›ž­ŽÄ˙˙ÈĤĤ üû˙ôÙŞÂ¤ŞĝïŬ—%Éû÷˙û˙ŝ˙˙Ĥŭü˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙ĝüġ˙˙›§Ï˙öï˙˙˙˙û˙ûû˙ï˙™Ÿ˙ĝúùû˙˙˙û˙˙˙ò˙˙˙Ÿĵ¤ê˙í˙ü˙˙ûŝ˙ĝü˙˙ŭ˙˙úŝüŝ˙˙˙ûŝ˙˙ŝ˙ï˙˙ä˙ĝ˙˙û˙˙˙˙˙ï˙ŭï˙˙˙˙ü˙ĝ˙ĝ˙˙˙ĝ˙û˙ĝ˙ŝ˙óü˙û˙˙ù˙üû˙Ñ˙ü˙÷ü˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ú˙÷ŭ˙÷˙˙ġ˙ġú˙ñ˙úĝŭŝÖö˙ü˙˙÷˙˙˙˙˙˙˙˙˙˙û˙˙˙Ê˙ùĝ˙üû˙˙êÚ˙ùó˙˙ĝ˙˙×Ġñ˙˙ŝ˙ĝ˙Èü˙˙í˙ŝĝü˙ó˙ŭó˙ŝŭŭ˙úù˙÷Ìú˙˙ŝò˙ö˙÷˙ù˙úúŭ˙˙ö˙˙úĝ˙ü˙ó˙˙í˙ü˙˙ġ˙ŭŝ˙ü˙ŭÑ˙˙˙ŝ˙ġŭ˙÷Ûü˙ŭŝùü˙ŝú˙˙˙˙˙˙˙˙˙˙ö˙ú˙úû˙˙ĝ˙üÖġ˙ûü˙˙ô˙˙ĝ˙ò˙÷ù˙ĝ˙˙˙˙˙ô˙˙ö˙˙˙ŭŭ˙ö˙˙ŭ˙í˙˙ŭ˙úŭ˙˙˙ü˙˙ú˙˙û˙ó˙˙˙ĝ˙ü˙ñ˙úû˙üû˙˙î˙˙ŭú˙üù˙ŝ˙˙ŝ˙ŝ˙öù˙˙ò˙˙"û˙ù˙˙ŭ÷˙˙˙˙˙˙˙˙ù˙˙ŝö˙ö˙ġ˙˙í˙˙è˙÷˙˙ġ˙ü˙˙˙˙˙˙˙˙˙ŝġ˙˙û˙ó˙˙˙˙ô˙ŭù˙˙˙ú˙˙û˙ù˙˙”î˙˙ġ˙˙ó˙˙è˙ï˙É˙˙É˙˙üûü˙˙ûÑ˙ï˙˙û˙˙òü˙ŝù˙ôŝú˙ö˙ŝü˙˙ó˙ú˙ŭ˙˙ŭŝŝ÷ŭ˙í˙˙˙ŞĊÒĦ˙˙û˙÷˙˙˙˙˙˙˙úûó˙˙˙˙˙üüϞ˙ŝ˙Î˙ÈĤû˙˙˙ġŝ£ž¨ĤœŞ’ûŭ˙ö˙˙˙˙ù˙ŝ˙ŭ˙˙ûô£ Ħ˙˙ó˙˙˙ö˙˙ùü˙ö˙ü˙˙ĝ—ŻĈĦ²ÈŭĤ¨ ¨ÔŭÌ£˘œù˙ĝÓİ ˙˙ó˙ûġ˙ŝ˙˙ġü˙û˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ÊĦ²è˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ô˙ù˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙úù˙ŭ˙ñ˙Ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ĝ* &Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ú³ê˙ì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ë˙Îòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öò÷üüûŭ˙˙˙˙˙˙˙˙˙˙ûù˙˙˙ŭù˙–$Ò˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷òöŝŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŜ£(  òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙•#'" ˜òĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüü÷òö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙üô˙ĝ˙˙˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñöÙúž˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷úŝŝŝ˙˙˙˙˙˙˙˙˙ü˙üö˙˙ġûü÷#˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝúĝû˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!*˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ . ˙éô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝú÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ú˙˙ó˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ù!ž˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙üó˙˙Ŭ˜$ û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ÿ+Ÿçî˙ö˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙Ñ˙ì˙˙ôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öôĝ˙˙ó˙˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ó½ ˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüüŭ˙˙ŝ˙˙˙˙˙˙˙˙˙üŝ˙ù˙˙É"˙ùó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ú˙˙àí˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ë˙˙÷ŭ˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭüüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙÷ù˙öŝü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷!( üŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝŝüü˙˙ü˙˙˙˙˙˙˙˙˙üú˙ú˙×'  ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙úĝ˙óŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ù˙˙˙ô˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üüŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù÷˙û˙˙˙ùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü­ $ô˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙ĝ˙ù˙ŭŭ½£ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ùŝ˙ŝ˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ô˙˙à˙˙˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ó˙ĝ˙˙ü˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ! ˙Í˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŝŭ˙˙ü˙˙˙˙˙˙˙˙ü˙ù˙˙ŭñĦ£ İöÓ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭû˙ŭ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙û˙˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ü˙ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ŝ˙ĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭ˙òùóû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝúò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĝ˙ñ˙û˙ü˙ŝò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙ö˙ôÒ˙úŝ˙˙üö˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ö˙˙ü˙ü˙˙˙˙˙ö˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙ñ˙ŭô˙û˙˙ñ˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙óù˙ĝšŸŻ˘ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭ˙ñö˙ŝŝï˙˙ŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô˘ §ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙ú˙˙÷˙˙˙˘Ô˙ô˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ó˙˙ù˙í˙˙ġ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ŭù˙ŝ˙˙˙ö˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üù˙÷˙üŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙üü˙˙ŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ùù˙ĝ˙˙ú˙ú˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙î˙ċŭĝÎ˙˙˙ü˙ġ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙ú˙í˙˙öÏÏÓÍ˙˙üô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙ñüë˙ŝóú˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙ù˙îù˙îў2şÖ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙ö˙˙Û%˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝöù˙˙˙ĝ˙ÒęĜġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙– !˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ó˙˙˙ó˙˙˙Î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ˙ïÖÇÄÎÒÔżÎ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭ˙úŭ˙˙ÖÒÌ˙ŭ÷û˙˙˙˙˙˙˙˙˙üĝŝ˙ùü˙˙˙öÖ× Ĥğ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ĉŭ˙˙˙˙üûúûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙÷˙˙ï˙ŭ˙â˙˙ŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ç˙˙˙˙˙˙íɤ•şò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙ŝ˙öŞ$ĉŝ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙îòÛ˙˙ù˙ú˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙û˙ù˙˙¨  Ĵ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙îü ˙ġĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭü˙ûú• & ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙£& Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝù˙˙˙÷˙ĝ˙Ÿ-'šġö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙- ($#)Ĉ˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ûġĠ˙„'Ü˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙˙ŝü˙ò˙Ñ*­˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙‘&ŽÓ˙˙˙ûü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ġüĝ˙ù£˜˘˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭì˙˙óĝö£" '˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙ûÄë˙˙˙ïĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙ŝ˙’ ħŭ˙˙˙ĝ÷üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙û˙˙ìÌ!üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úġ˙ü˙ó˙ ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭô˙˙Ġ'˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷š )Ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙ûúŝ˙˙ò˙  ˘˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù´ ) îÈ !Ö˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙—* )È˙ĝ˙˙˙˙˙˙˙˙ġ˙˙˙ŭ˙˙ĝ˙˙”˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙Ê (ġ˙˙˙û˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭ ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöĝ˙˙  ˜˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü÷û˙¤'×í÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óôÔ. ²˙ŭĝú˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙ŭ˙ì¸!ĤĊ–'œò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ôô˙˙–!#”˙ġŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ñ˙˙˙û˙˙•˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ%!“ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙úŝö˙˙˙˙.•öô˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙#ĝû˙˙˙˙Èŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝúù˙Ÿ! % Ó˙ĝ˙˙˙˙˙˙˙˙˙˙ŭùĝü˙˙ú˙ù&Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë*×˙˙û˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ù –˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙˙Ĝ%ž•* ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙û˙˙É )ù˙˙ü˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ŭÓ ¨÷ü˙˙˙ġ˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙Í˙˙ô÷˙˙˙ġ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙ŭ˙Îú·§ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ò˙˙˙ŭö˙™!Ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙ü˙˙˙úô˙úż˙ú˙ú˙ëû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙› ˙˙˙˙ëñ˙˙¤˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙È* Ûì˘úŭĝ˙˙˙˙˙˙˙˙˙˙ûú˙˙ŝû˙ú˙˙™ Ĥ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ!Ûñ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ô˙ŭŭà 3˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙òú˙'˙ïßÀÉĊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙ùî˙˙÷0%ŭù˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙ĝÂĥî˙˙ûü˙ŭ˙˙˙˙úöú˙˙˙˙˙˙˙˙˙ù˙Ï,&Ë˙ì˙ŭó˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöŭ˙ù˙™÷˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙¸Ûŝ˙ŝ˙˙úŸ #ˆ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙ Ħú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò£ĴŻ˙úö˙ö˙˙ú˙˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŻĜ˙ûŭï˙˙ĝ˙’ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙Ó˙˙ġĈ˙˙óü˙˙˙˙˙˙˙˙˙˙ùöû˙˙ûú˙˙˙˘%Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûËŻù˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġúö˙˙é˙Ĝ÷˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ˙˙ŭ ˙˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙û˙ô˙ŝ™#˙ġ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙ûüÇäġ˙˙÷˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙ïÏ"Ÿ˙˙ú˙ŝŭ˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙ô˙üùŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ì˘ú˙ü˙˙˙˙.öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û"˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ!˙ŝ˙˙˙˙ù˙÷ûŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙)ìÑ˙˙˙ùûù¨ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝ"Ĵŭüó˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙íĵú˙öŭù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙ĝÓ¨œŝ˙˙üŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ĝĝ˙ûŝÏ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙öû˙ú˙˙˙öùû˙ŭ˙úú˙˙ġ˙˙ï˙˙ü˙˙ĝ˙ŭŝ˙ŝ˙ú˙˙üü˙ġüü˙ö˙ŭ÷˙˙í˙ôÒ˙ŭ˙î˙˙˙ù˙ġ˙÷˙˙ö˙ŭ˙ĝ˙˙ù˙ŭ˙˙˙˙˙˙˙˙˙ïó˙ÌÌ˙î˙ó˙˙ŭ˙˙î˙÷˙ŭ˙ġŝ˙˙˙ġ˙ó˙ŝ˙˙ù˙ñ˙ö˙˙ú˙ö˙ú˙ú÷ü˙˙˙˙ŭü˙ò˙ú˙÷˙˙ö˙˙ĝ˙˙˙˙˙˙˙˙˙ŭ˙÷™£û˙ù˙û˙úÙ˙óŭ˙˙˙˙ò˙û˙÷˙˙ûü˙ġ˙˙ò˙˙˙ù˙ûù˙˙˙˙˙ŝüüü˙ŭ˙ö˙˙ŝ˙ŝ˙˙˙ŭûûŝ˙ŝ˙"˙÷ò˙ŭ÷˙˙˙Îü˙ġ˙˙ŭ˙˙˙˙ûö˙ġ˙˙˙ĝ˙ŭù˙ùŝ˙ë˙û˙ŭ÷˙˙˙˙î˙˙ò˙ŭ˙ñ˙ŝú˙ô˙˙˙üó˙ŭ˙˙˙˙û˙˙ù˙˙ŭ˙òú˙ü˙ŭüüù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ 2ûŭ˙ô˙˙ûû˙ġ˙ñ˙ùûû˙ü˙˙ĝó˙öû˙ô˙ü˙ö˙˙ŝü ­Ïù˙ùŝü˙Ÿí˙˙÷˙ï˙˙ùü˙ġ˙˙˙ö˙ġžŻ–˙˙ŭ˙ŭ˙˙˙˙˙˙˙˙ó˙ü˘˙˙ġ˙Òüû˙ûŭñ˙˙ż·˙˙ô™¨É˙˙˙˙˙ü˙ì˙˙û˙˙ò˙ù˙ġ˙ü˙û˙ŝ˙ġ˙û˙ŭ˙ò˙˙÷úü˙úŝŭ˙ú˙˙öϤÌ˙˙­   Şó˙˙˙˙˙˙˙˙˙˙ô˙˙úéü˙˙ö˙ĝ˙˙˙òŭ˙ùú˙˙î˙ŭŭ˙ŝö÷˙ûùŝü˙ġ˙ŝ˙÷˙üù˙ŭŝ˙˙öŭĦ Ÿü˙üü˙˙˙úû˙˙ĝ˙˙ĝ˙ĝ˙˙ú˙÷˙˙˙û˙ûŭŝŭ˙˙˙÷˙˙óùö˙ò˙˙ĝ˙ŭ˙˙ö˙˙÷˙˙ĝŭù˙ŭ˙ü÷ü˙ü˙û˙˙ĝ˙ŭ˙˙ù˙ù˙˙˙š! ˙˙ñ˙˙ü˙˙ŭġ˙ùò˙˙ê˙˙˙žöö˙ö˙ĝ˙˘ ­ú˙˙ŝ˙÷üú˙ü˙˙ĝ˙é˙úû˙ŭÎ˙˙ĝ˙˙ŝĝ˙ô˙˙÷˙˙˙ĝ˙˙û˙ĝ˙üû˙˙ö˙˙˙˙˙˙˙˙˙ü˙ü˙ú˙ö˙˙ö˙ûĝ˙Î%–ŝ˙ûö˙ġ˙ù˙˙˙ïŝ˙˙î˙ö˙˙˙˙˙˙˙ü˙ŭ˙û˙˙ŝ˙˙ŝ÷˙ĝŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ûù˙òûŭ˙&˙úŭ˙úü˙˙ûü˙˙˙ŭ˙ö˙ù˙ŭúüŭú˙ġŭ˙ĝ˙˙˙ó˙ì˙˙ġ÷˙Ü˙üŭ˙ŝ˙÷ïü˙ó˙˙ö˙˙˙˙˙ó˙˙ŝùĝù˙˙˙˙˙˙˙˙ê˙ö÷Ħ "ŻîÚ˙ŭĝ˙˙˙˙˙ü˙˙ĝ˙ô˙ó˙ŭŭ˙˙˙óûò˙˙é˙˙÷˙ċ˙˙ŝú˙û˙ÁÜÌ˙òĝü˙ù˙ÎÚġ˙ì˙ùĝü˙˙˙˙˙˙˙˙˙˙˙úÉ-ó˙˙úŝ˙ɤ˙ŭ˙ŭòĠŝ˙ôŝ˙˙öü˙˙˙˙˙˙˙üï˙˙÷˙˙˙˙ŝíŝ˙˙˙ú˙˙öö˙ˤ”˙úüŝ˙˙˙˙˙ّ )ü˙˙ù˙˙ĝò˙Ò˙ÄßÖöĝüúü˙ú˙àĈÏġî˙ŝ˙˙Ò×ÌĈ˙üûĝ˙˙ôÏ˙×ȽĜË˙ö˙ġĝßÄ­Ó˙˙ì˙üúçÈÎİ °Òú˙˙ú˙ŭ)Ž˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙µËÊÔŜú˙˙ŭ˙˙ÀÄäÔÚîÚ ĜÈÎ˙ü˙ŝ˙˙˙˙ú˙˘ 4ĈÎ˙˙˙˙ò%!˙˙˙ àÚ˙˙ġ˙ò˙ŝ˙°*ÜÈñ˙˙˙˙˙˙˙˙˙ŭ˙ĝ˘™ĠĠ˙ŝ˙˘ '!"˙ŝ˙ü̅2Ġ˙ŭ˙˙˙ĊÌÄŻ(ÉüÙ"´ÉÛ·Ö˙Ġ (˙˙öÂ" ¤ #˙˙˙˙˙˙˙˙˙ó˙ŭ˙ì  ™àüó˙ŭÙÔ%˙ġ˙˙î·äĦŝĝĜĜ×½Çß˙ŝû˙˙ŭóŭËù£ Ğò˙ò˙ûŝ˙–3ž˙˙ó˙÷˙˜˘Ê(’˙óËßÓ3Ñü˙èġĝ˨£Ä˙ܽÎÓËÁ˙ï˙˙˙ÄĠ}êÍÒè˙üü˙ŭ˙ŝ˙˙˙˙û÷˙˙ġ˙ĝĠÏÒÓŭ˙ë˙˙ġ˙ĝûİ*ûù˙ŝû˙êĝ˙˙ġö˙˙ú˙˙Ú "Î˙ñŝò˙ñ 5Ç˙ĝ˙íó˙ŭ˙ôú÷ŭü÷˙ú˙˙ŭŭ˙˙ĝ˙üê˙˙ò˙˙ñü˙í˙˙éŝ˙û˙˙ŝ˙˙ë˙˙˙˙˙˙˙˙˙˙úúöŭùŭ˙˙ó˙˙˙˙ĝĈ!%˙ĉ˙˙û÷˙˙ß˙û˙˙íüġ˙˙˙×ŝŭóû˙ê˙˙÷˙˙ġ˙ñûĝ˙ù˙ô˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝö˙˙˙˙âü˙” +˙ú÷ġ˙˙ŝü˙ïúû˙î˙˙˙êĝù˙Ĝ…à˙÷˙Â˙ò˙˙˙ôî˙˙˙˙˙Н˙ĝô˙˙û˙˙˙˙û˙›ÑġüËü˙ö˙˙˙˙˙˙˙˙˙˙ŭÑ˙ŒÄ˙˙˙ö˙ôŭ˙é˙˙˙ĝ˙ô˙ú˙úġö˙ô÷Ĵ–˙ġ˙˙˙ï˙ú˙Λ&”ĝ¨˜Ä˙˙˙˙òޤŭ˙˙˙ĝĝ˙ù˙˙˙˙˙˙˙˙˙˙  "˙˙˙ŝú˙˙Ÿ  £Ÿ§œÎĝ˙ò˙ŝŭ˙÷˙û˜ĦÂŝ˙˙úŝ˙÷˙ñ˙ŝ˙ŭó˙ñ˙ĝ÷˙˙# –ŝŭŝ˙˙˙ùó! šÄ˙˙ïġû˙ü™£˘ĥ˙˙˙ùôŝù#˙ò˙Ĵ˙ġö˙ˆŞŞëŸ ˙˙˙™'˙˙˙˙ċ(ÈŝùûĜ!Çġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž(&"Ä˙öùüž"˙  ­ùû÷˙ó÷ŝ˙ġ³! # ġú˙˙ ˙û˙Ž!÷˙÷û˙˙˙Á#$ ’˙÷˙˙˙˙˙˙˙˙˙ú˙ %# #ÛöûË##$ –˙˙ŭÁİ-Ğ˙ööŭÍ%$•˙+Ŭ˙•- ¤˙˙ %" ħ˙˙˙˙˙˙˙˙˙˙ùóŞ#(˙ï£ Şñ˙ï!ÓĤ %Ñ˙˙ùôĝ˙˙Ñ­Ì˙˙˙éİœÎ˙ŝ˙-à˙œ !û˙˙˙˙!î"ßô˙ŭ˙$)#à˙˙˙˙˙ġöŭġ˙˙˙ú˙ñ˙˙Á˙– ˙öŝ˙ü˙ö˙Ӝ#˙ŭù˙÷˙˙˙˙˙ô˙˙ĝ˙˙ˆ Ÿ˘˙˙˙˙Ç ˙˙ò"‹˙ôŝ˙˙ŝ÷ŭ˙Ê §ĤšÁ˙˙˙˙˙ù˙öú˙÷˙˙ûù˙ĞÑ˙ô˙ÁĤ˙ò˙˙˙˙˙˙˙˙˙˙ûġ˙˙ŝĜšú˙˙˙÷˙ì˙×% ˙è˙ŝú˙˙üĝ˙òúê˙˙˙˙íù˙ñŝù˙˙ġ˙˙ôù˙ú÷ŝ˙ùŝ˙˙ŭïû˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óòġġùϜ( "ĦË˙˙ĝ˙÷òĠĦ‹Ż˙ïĝ˙˙˙ ž$žĉ˙˙˙ĝŭü˜! Ĵİö˙ê˙˙ŝÓ" ˙ġ˙ó˙˙˙˙˙˙˙˙˙˙ɜ,!&ôôü˙˙àŸħô˙£ &›ŭí˙˙˙Ċ! Ì˙˙ûóĵ! ”&&û˙ŭ˜˙ú˙˙ŭ˙÷˙˙˙˙˙˙˙˙Ë%!  –ô˙˙˙˘ !0Òĝùŝû˙˙İ. '"Ÿż˙˙˙Ӗ•ĝ˙ŭ´)&˜9#(˙˙ŭŝŝùïĉ!ž˙Ë˙˙˙ù $Ĉü˙˙è˙! )ò˙˙ ! $ù˙˙Ä#&˙ġŝž+"Żù˙˙Ĵ $!&! )ì˙˙š Ĥİ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙”!ΨÁ˙˙˙ Ŭôĥ -¨ó˙˙ò˙˙ÎüĞ & %˙˙ä˙4!˘˙ê˙§"•˙˙ñ˙-(ñ˙˙˙˙˙˙˙˙˙˙Á˙ 2ûïċ!"ûûŝ*  òÖ" ™˙˙˙û(Çŝ-İò˙È&‘˙ŝĦ!-˙˙˙˙˙˙˙˙ö˙˙˙ # ) Ê˙žİĝŭ˙”"! 3˜ĝ˙˙˙˙ż¤— ­é˙ú˙3¤Íĝ˙ô# À˙ú(/˙ò˙!&“˙˙Œ, #¸˙˙˙öú˙˙˙ĝ˙˙ü÷ö˙½İ' "ı˙˙üŒ%''ĉ˙ŭ˙üü˙˙˙ŭú˙ó* ÀüÁŭ¤–Ñ!!˙üĝòô˙˙Œ#'+˘ĝúùì#£Ĝ˙÷˙ğİ!Ħ 0˙˙˙˙˙˙˙˙˙˙÷˙˙ܖ"ú˙îù˙ú#‰Ğ- ŞÓ˙ŝ˙˙˙À #$ß˙ê˙˙üÉŻ‘˙˙˘” ŸœÁ˙˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïŝ˙˙˙ò#%  ×ô˙ŭ¨* 'Ñ˙ôĝż!$"Ú˙ö˙óû´$&* ˙˙ô˙™. —˙Äü˙˙˙˙˙˙˙˙÷˙ ²˙˙˙ÍĞš )˙ŭŭ˙!  ˘˙˙˙˙Ù" ( ")šöú˙ŭ˙ü˙˙˙˙˙˙˙˙  % 3ò˙ö˙Ó"*œ˙˙˙˙˙… ˙׎ /á˙î&˙˙í2 ¤˙ŝüŝ˙˙ŭĝĈ#í÷ŭŝŭİÏïÓ/.Îò˙˙üŭ˙˙ğ#˙ġ˙˙' #(!˙™•˙˙˙) Ûĉ½&£ü˙ċ— Ûò˙&ó÷"ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙(¨üúĦ! "š˙ìĝÎ)Ëŭí‹˙˙˙ŝ˙í˙˙˙–&"ò˙˙œ˙˙û÷Ÿ˙÷˙Ç $)&é˙˙˙˙˙˙˙˙˙û˙ü­$“´!˙ü %£Ù•È˙öÓŞŬġ˙›¸šûġĝÎ- 'ż˙˙Ù  É˙˙˙­é˙ìöĞ#!ŭ˙˙ñŞ0Í˙˙˙˙˙˙˙˙˙ĝñ˙ü Ĥ­˙ġ˙˙–$•Ï˙ë˙ , $Ġ˙ùdz ˘ë˙˙˙œĞ ŒÜŝŭ÷È£ ˘ÈĠ˙ì˙Ġ ! ­˙ŭûÌ ûŝ˙ŭ"" 2í­!Éċİ Ĵôġ˙˙˙˙ŭ˙˙˙÷ö˙˙­°ËŬ"'Ì˙Ñ!#-ı÷˙úó˙˙˙ü˙˙ù˙˜" ( ˙˙ö˙ ŜĈ°ù˙˙˙˙Ħ0³Í!˙˙ È˙ûĞ  " žü˙˙˙˙˙˙˙˙ĝ˙›%&"½˙˙öÖ"! ˙˙ŭëùĞ"Ş˙îü! "Ħ˙ 2ï˙ôì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġ˙Ğ # ) öü'Ĵ#*ĝ˙˙˙# ΔŻóû÷˙ĝ¤ß#ĵ˙˙û"Ş˙˙3˜ñ˙˙˙˙˙˙˙˙˙˙˙ŝĊ" ˙ù˙Ŭ*! ü˙˙—üó˙ Ħ˙ŝ˙˙ * ' #(˙˙˙üû˙˙˙˙˙˙˙˙˙Ê'  %‰˙ŭú˙Ù ’˙˙ 5Ñġŭû˙0 ˙˙÷¸! È˙˙"˙˙™%$³›×˙ŝüŝ˙˙˙˙ѧ–˙˙˙˙˙$,‘ġ˙˙ċ&ŝ˙éú)˙ê˙ŝ˘'­ÌĈ˙ùÍ'+Ħ £˜ŝû"ĜŭŭôŜž˘°ŭ˙—ĦÊĥ"Ĝöġ. ˘í˙˙šŸ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ħ œóŝôß˙Ğ-ñ˙˙˙$¨˙˙˙İ˙˙é˙òŝô˙˙˙ô˙ô,™ŭ˙˙û˙úÎ #Ï˙í˙˙Ô °ü˙ûš&$#Ĥ˙ġ˙˙˙˙˙˙˙˙˙î˙–˙˙˙÷û”/ĉü˙˙ù˙˙ñ˙Ÿ%˙ŝ˙ûö˙Á É˙˙˙˜Ï˙íù¤(˙úûù°˙˙üŝŝüŻ ùĝüó߯˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ˙  üöùŭŭ÷ó¸ ûò˙˙ŝ!(˜ñüúüÏ$% ˙˙˙¤ !˙ġĝ˙˙˙˙˙˙˙òĦ˙˙û˙üûûú &¸˙ŝò˙ ()ĝ˙úüĝ$&¤Ħ˙˙#   !"Ĥû˙˙úŭ˙öûŭŝŭ˙˙½ $Ĝ˙ğ˙ú˙  ˙ôüÖ#& ˘˙îù˙˙ó˙˙ġ˙˙ġ˙ŝ­˜˙îĝù˙ż&"ú˙˙Ô"Ñü˙û &ˆÔ›˙›3 öëá×ö˙!%&Ë˙˙˙˙˙˙˙˙˙˙Ï%!Ξ¨˙ŝĝğ# ˙Λ&˙˙˙#Ħ##ô˙ŝĦ ˙ñàŸ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ú˙š!$&•Ù˙ú˙!­óĤ&Êò˙˙˜ 0 ˙ŝ˙  ˙˙ŭùŞ)Ÿüì&Ħ˙˙ۏ)˜ÖÒ!­˙˙ï˙˙˙˙˙˙˙˙ĝ˙˙–2˙úŭ˙ù­(# ú˙œ*˙ü˙ġÊ#˙úġ˙Ğ%§ÇĜÙŜš$ÂÎŬ !û˙˙˙ü˙˙˙˙˙˙˙˙˙˙ß0›àÊ˙˙ü˙˙Ä&Î˙ġü˙Š#˜˙˙ï×# ,Ħ˙ñ÷áÇ +"Ĥî˙˙˙›$›Óòô˙ĝ˙˙˙ŝŝŭüû˙Ĵ $"—óü˙ĉÛĤġ˙ûĝ˙˙È& ˙ĝ˙˙Ħï˙û˙Ϗ%Ï˙ŭŭ˙ôûİ"È˙ö˙˙û˙Ÿ#Öú˙˙ù˙úËĝ÷Î!&Íú˙Ë˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š-˙˙˙òûÉ* Ŭŝ˙ĝÚ$ Ä˙À˙˙˙˙˙˙˙˙çĝ˙ġ˙È)˙ïó˙ò˙ü$˙˙ŭóÇ%“ŭ˙ĝ%)“ŞÈĠÔ˙ŝ˙˙˙˙˙˙˙˙˙˙ó˙Ôû˙˙û˙%Êüßú#Ï˙˙ï÷˙úœ /%ŝ˙ĝ˙˙˙"#—˙ĉô˙"žúĠ˙§ "÷üü˘˙ŭü˙ŝúÒŻ˙˙˙˙î˘ *ŝ˙˙˙˙˙˙˙˙˙˙ùò˙ë– Ë˙ŭú˙˙˙˙Œ)˙˙˙˙˙Ï˙˙˙˙ŭ˙˙èà ˙ĝĝ˙˙üù˙˙˙ŝ™ ŝúñü˙˙˙ú !'˙˙˙˙Ì!Êùŭ˙˙˙É2 Äü˙í˙óÌ"-# .—ĦÒú˙ŝ˙˙˙ġ˙˙˙˙˙˙à3 ĝ˙˙˙ŭ˙ž)Ï˙ú ' ·ó÷˙÷˙˙ìô˙ŭ˙úüú˙˙üË#Ĵ˙í˙˙˙öŬ"Ÿ˙ó˙ö ûûûŞ, ˙ĝû˙—%˙˙À˙’ .ġû˙˙˙˙˙˙˙˙Á!¨˙˙Ŭ% ˙Ï˙ß! Ż˙÷÷Ë#Ô˙Ċö”%&Ê˙Ĥ -Üù˙ú˙ö˙òö˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙úÎĞ%0 ÖŝÒŝ˙—ĦÇ˙Ë!ü˙ü˙˙Ç% ëòü˙ġúù˙ú£û˙˙ö§ ˙ġ˙Ò! %›œ˙˙ĝ˙˙˙˙˙˙˙˙˙˙öÌ˙– Îùú˙ĝ˙Ê  Ñ˙ÇĠü˙˘£û˙ŭ÷˙Ï!›˙˙üü˙ùóÒ")Ž˙˙îù"/˙ñ˙ŝŝ˙˙˙˙˙˙˙˙û˙Ħ˘ùŝ˙ë˙˙öÍ. ˙ġ˙ĈÙ£&ġü˙Ó Ĥ™§Ż“ŝŭ˙˙üŭ& Ò˙˙ì˙!âĝŝ˙÷˙úŭ˙˙˙ŝŝŝ˙Š%Ĵ˙ü÷˙ĝ˙ĝ˙ö˙ê˙&˙ù˙˙Ñ˘˙˙ĝÈŜ ˙ĝ˙˙ŝÎ˙Ä ˙ú˙ï˙˙˙ ˙÷˙ŝ˙˙ġ˙Î˙Í˙˙ΚͧÍ˙˙ú£0ˆĴÊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙İ×ùû÷˙˙ûû˙ĝ˙ÈÑ˙žš˙ù˙ô˙ù˙˙˙òñ˙˘Í˙˙˙ü˙˙˙˜˙˙ö˙˙˙û˙˙$ö˙˙˙˙ġ˙˙úüü˙˙˙˙˙˙˙˙˙˙˙Ì”˙ö˙üö˙ ¤˙úϝ˙ùû˙˙ôò) Ôü˙˙˙ŭĝ˙Ÿ˙˙˙óİİüŝ"Ĵ˙ŝ§î˙ü˙ïü˙Ážü˙ùÓĜ—$”˙˙˙˙˙˙˙˙˙ú˙ĝ˙˙˙! ġ˙˙ôŭ˙ú³!ö˙û˙ĝŭĤûŭ˙úġ˙ ÷˙÷#˙˙˙û˙ô˙˙ùü˙ŭ° ˙˙˙˙˙óŭÜË˙˙ŝÏ"ò˙˙ó˙˙!Ùùù˙˙˙Ô  ž˙ŭĝ˙˙˙û÷˙˙˙ĝ˙˙ùŝÛË˙ü˙÷˙ĝŸ˘ĝ˙”˙˙ġ˙˙÷˙ŭú˙û˙˙ġ˙ö˙&İ˙˙˙ĝú˙÷$ Ôü˙ÍÊÏ˙üÏÏò˙ùô! ŭû˙˙ÓœĜȞ˙ŝ˙˙˙˙˙˙˙˙   &˙ê˙ɜĥŻ˙ö˙ (¤ġŝŝ˙˙š˙ŭ˙қ—˙üÚ % Ĵûï˙ŝ ĝü˙ŭ "˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ùĝ˙˙û¤#Ÿúġ˙˙˙÷ĝ˙˙˙ÑŭĞÊù˙÷˙Îô˙˙ùüäùô˙òÒŝ˙ù˙ï˙˙ŭ˙Ö!Š˙¨ĦİÌû˙˙ê˙ù˙˙˙˙˙˙˙˙˙˙ç˙£ Îŭû÷˙ù˙Ñ ˙˙ó˙Ö÷İ ú˙˙û˙˙˙ŝ˙üœ$£˙˙ûüÑ É˙úü˙¨ Ĥüò˙ó˙˙˙˙˙˙˙˙˙˙û Ÿ˙˙˙˙˙ó˙ü¤öŭ˙˙üÏ#ö˙ö¨û˙ûŭú˙ùŝ˙û˙úÌŭĦÒŭ˙ġŭû% ú˙ü˙ŭ˙ü˙˙˙˙˙˙ôŝÄ)–Î˙ô˙¨œ˙ŭ˙ùöŝ˙Ğŝ˙˙˙Í˙ŝ˙×˙ޝ˙˙ü˙ô˙˜ü˙î˙˙ú˙"Ħ˙è˙˙ĝ˙ŭŝ˙ġ›ŝü˙ŭ˙˙˙ú˙˙ġ˙÷Ñ ¤÷˙˙ó˙ġö˙˙ŭ˙˙ĝô˙˙ü˙˙˙˙˙˙˙˙¤İì˙˙û˙ŝ™$Üö˙˙ù '˙%™ŝ˙úüù˙ü˙ŭ˙˙˙Ïŝ˙ú˙ú˙ŭùÊ˙û˙÷˙“˙ŝû!­ġ˙û˙˙˙ôü˙˙ú˙˙˙˙˙˙˙˙˙ŭ˙' œÙ˙ó˙÷˙ ˙üġ˙—ù˙˙÷˙˙ġÚöû˙ŭŝñŞ Ĵö˙˙ĝóµú˙£˙Ñ×˙ûŝŭ˙ŝ˙–¨ĝŭ˙ŝô ˙˙üúŭŝ˙˙ü˙÷˙˙ġ˙ ú÷˙ù˙ĝüĤ"˙ŝúö˙˙Ÿ˙˙˙û˙˙Û˙˙Ò ˙ĝ˙˙ŝ˙˙ì˙ĝ˙û˘˙˙ë˙ûĝŝ˙œ É˙˙ü˙ Ï˙ü˙ù÷˙£ ġ˙˙˙÷˙ %È˙Èù˙ùŭ˙˙ĝ˙˙û˙ü˙˙˙ò÷˙úÎ!!Ĝúŭ˙ŝġ˙˙ #›ŝ˙— öóŝ˙úŝŝü˙˙ŝŝ˙ŝôîï! Ĵ÷˙ŝ÷˙ŝ˙§˙˙úĝ˙ÑÉ˙ĝĊ’İĴùÄ˙ġ˙˙˙Ë!£˙ùŝ˙˙$˙˙ò˙ŝ˙˙ŝŭŭŝ˙˙˙˙Îġ˙˙ï˙ŭ˙Ïŝĝ˙ ¨ö˙íŝŭ° ˘˙ûŭû˙ŭû˙˙ûĦ˙˙öŭ ġö˙˙¨Óô˙˙œšžĤ›ĜÏ˙ġ˙ŭ˙ù˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙ü˘š˙ĝîü˙ĝ˙ŝüúüô*!Úü˙˙ŭó'˙˙ö˙–%˙˙É˙˙˙ù˙˙˙ŭ÷ûú )˙Òü˙üû˙˙ŭ˙úû˙˙˙˙˙˙˙˙÷ġ˙˙Ş Ñŭ˙ûŭ˙˙ë­ïŭ˙ġó˙ ü˙ûûŭù˙ŝ˙˙ż/ š÷˙˙˙Í ˙ü˙˙˙ö(Â˙˙˙÷ŝ˙˙˙˙˙˙˙˙ùŝ$­˙ġú˙ô˙ù&˘˙˙üÏ˙¤ !äúù" ˙î˙˙ùó˙ŝŭ˙˙˙ù˙ Ïòû˙˙û ˙ŭ˙ġüû˙˙˙üüûòçö­ş˙ùĜ÷ !˙ġüö˙˙ǜ˙ùĊ˙-ú˙ĝîü˜3ŭ˙÷ú˙˙ç!òñ˙îŝ˙˙#›˙˙ô˙˙û˙öŝĝ'ö˙˙˙ġú˙û˙˙˙ĝ˙˙! $$Ñúï˙ßċÒü˙ç˙˙˙ñ˙˙˙˙˙˙˙˙˙ É˙÷ôüü˙Ğ!Ìö˙˙òİ$Ċ ²˙˙˙˙˙ü˙˙˙˙ùċîĤ-üĝ˙ŭ˙ġ˙ŝ,Á˙üô˙èİÑ˙˙˙˙˙ù˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙ùù² %ĴĊú˙ŭ˙ô% ˙ú˙˙› ˙˙˙˙ô˙˙˙ö˙ĝ˙½-Éöûŝ˙˙œ"Ñ!ȟž˜ûò˙˙û˙˙-$ŭ˙˙˙˙É˙ġü˙˙˙ĝĝ˙û˙˙˙˙š%ŝ˙ü˙÷˙üİ *™˙˙ü˙À(Á˙ô˙ĝò,˙˙ô˙$*ó˙ï˙˙öç˙òŭ˙˙‘,ŭŝ˙ò˙˙˙ö)"Òóû˙Î(!Ó˙û˙û˙Éœô˙˙ŝ˙ġ #Ûùĝ˙ô˙˙ġ˙öö˙÷ŭ˙ġ˙˙˙˙ú:µ˙˙˙ú˙ûî+Ĥĝ˙° Ò˙˙˙üġ˙˙üü˙üŝ˙˙üùûĦ%›ĝ˙÷˙ïŭùœ#öŭ˙ü˙Ç Òŝ˙á# üñŝûê˙˙û˙ġ˙óÄ- Ë˙óù˙û¤ "ù˙˙˙Ŭç˙˙ŭûŭ˙˙ĝò ˙ü˙û˙ú˙ó˙û˙êž˙ö˙˙׆#Ïó˙ŝŭ˙úġÎŬ (ŭûó˙˙"˙˙˙ĝü!—Êŝ˙)›˙˙ŝûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙î˙$(ù˙˙˙ê˙ùĝ˙Ġ¤,Íùû˙ŝ˙ !÷˙ùï˙Ò" ô˙˙˙˙íò˙óú˙÷˙˙$ó˙˙˙ô˙úìĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôž!ġġ˙˙˙ŝñ˙ŝù˙ŝ˙÷-˙˙ú˙˙˙˙ ó˙˙ž"§˙û˙ß!$Ò˙ûġ˙ùÓ˙˙üúĝ˙˙˙˙˙˙˙˙˙òœó˙˙í˙˙ŝ žï˙é˙˙‘Êò˙$˙ġŭ˙˙ŝü˙˙˙úô˙ú'˙˙ú˙ë˙˙ù˙ĝ˙ŭ˙˙ŝüŝ˙ûô˙’#“ĝó˙Ó#. ó˙˙ò˙ìûÚŭ˙û˙× ˙˙î˙˙Ħ ô˙˙˙˙ĝü¨ ˙˙˙ġüġ+ $§óû˙˙ġġ˙˙˙˙œŭò˙˙˙ì˙ö˙˙úš˜˙ôñ˙˙Ĥ ˜˙ö˙ŭ˙ù˙˙˙˙˙˙˙˙˙¨ü˙˙˙ŭÌ#Ġ˙ô˙ï÷%<ë˙ö˙ù˙˙˙ü˙˙ûîî•ó˙ŝôü˙˙  á˙˙óŝ˙ ö˙ĥ Ò˙ŭ÷˙˙“żÜö˙˙˙˙˙˙˙˙˙ü˙ ˙˙˙˙÷˙İúû˙ú˜ )ù÷û˙˙ô˙ #˙˙û˙˙û˙˙˙˙ŭ˙ì˙#$¤ûñ0)ëŭ˙˙ú˙û˙˙%ùúò˙˙Ĥô˙˙ŝŝ˙üô˙û˙÷ö˙˙˙íö˙ŭġöĤ%Żâ˙˙íŞ ä÷˙ïù˙! !˙úÄ Ô˙˙Ŝ˙˙˙˙˙ä˙ıüû˙˙˙˙ô˙×˙˙˙ĝ öĝ÷˙˙ü˙Ÿ &àòŝíŝ˙& ˙˙˙˙ù˙ŝ˙ûû˙˙ûö˙û˙˙˙˙˙Ĝ!&ïÒó˙ŭ˙× %Ħú˙Ĉ˙*ö˙÷˙˙ŭ˙ö˙ŝŭŝ˙˙˙˙˙!¨Ĉûüŭ˙˙˙$˙ú˙ġí˙,ĠüôÈ #üŬŝ˙˙ú˙ñû˙˙˙Ë,˙˙˙˙í&"úŭ˙úĝ˙˙˙ŭûŝ˙˙ôé&-˙ù˙˙ġù˙ŭġ˙ç˙%—˙ßĝ÷ô5˙Ôĝù˙˙§'˙˘ Ì˙˙÷˙ñ-îû˙ö˙Ş'“˙˙˜%˙ô˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ù˙˙òĤŭû˙˙û˙˙ö˜È˙üñ˙÷'˘ùŭ˙˙÷Ê!˙ù÷ĝë˙˙û˙ŭ˙˙ù˙"$Ä˙ŭó˙í˙˙˙ó˙ê˙˙˙˙˙˙˙˙üö˙Ş˙˙˙ġ˙˙ù!œ˙˙÷û˙ö (˙û˙ŭìö˙!˙îï4!áÎ˙˙Πöú˙ĝ˙Íŭŝùü˙˙˙˙˙˙˙˙˙ö˙İ˙ö˙üû˙ü'"#Ñ˙í˙ż­"˙˙üŻ Ħ˙Ëôĝ˙ú˙ŝŭ˙˙˙Ç ò˙ùùâ û˙ĝ˙˙˙üüüŝ˙˙˙˙ŭœ”˙˙ñ˙­˙û˙˙˙˙Ò˘ġ˙ġ˙žŭ˙ùŝ!ö˙ĝġŭ˙ %˙ĝġ˙ġŭ! ŭú÷˙˙ŝô˙˙&Ġİ÷˙ï˙Ô ô˙—'ŝú˙˙%šĝ˙ #!#í˙˙ì˙˙˙˙˙˙˙˙˙˙˙ž# Óùóó˙#"°ç˙˙ŭ˙˙§" ´˙˙ĝ˙ĝ˙˙˙ö˙˙˙ŭù"Ô˙ñ˙˙˙ï$Ôĝ˙˙˙ò“(¤Ŭ˙÷ó­&‘˙˙Á—'”˙˙˙˙˙˙˙˙˙˙ûğ˙§šġ˙ġ˙Ş#Ê˙˙í˙¨ Ĥ˙ġŭú˙ŝŸ˘òŭ˙˙ò§%ìùîú˙˙˙˙¤ 0Ë˙˙“ % œġô˙ĝü˙˙ü˙!œ˙˙˙ú˙˙ï˙úò˙˙÷˙ü˙ŝŝ˙ĉ/˙˙ŝö˙˙˙•+Ĥ˙˙ŝ˙Ĉ‘˙˙˙ò˙ü˙Ĥçû˙ûĝô˙Ġ×ŝ™ '˙ûöŭòŝúö%'˙˙ñ "˙˙˙ġĝ˙ż˙˙˙˙ĝœ,5½˙ï˙ŝĊ  ì˙ü˙ò˙ġ˙˙ŭĝŭ˙Ñ  ü˙ôŭúŝ˘!Ì˙úüÊ  &˙ŝŝ˙˙ĝ˙ġ˙˙˙ŝ˙ŝŭŝ˙ (Ïüáŝ÷ùÔ(ŭ˙ûü˙˙Ċŝ˙˙ "ñ˙ü˙˙ĝ÷˙˙ñïĠ! "œö˙˙˙˙°˙˙ùü˙˙ġ˙ŭŝ˙˙˙ûô. úú˙ö˙˙ġŝ˙˙ò˙ Ĵùöŭ˙˙™˙˙û˙Ĉ)!É˙‘&Ħü˙ñĝ˙û˙û˙˙ž­ü˙#ŝô˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙û˙˙íĤĜ˙úü˙˙÷Ë+ĥÓÍà ˙ŭŭ˙˙˙§Ÿŝ˙ù÷ĝÛ $ò˙˙˙#*˙ĝ˙˙úù˙˙ĝ( µ˙ŭ˙ġ˙È!ô˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ĉ'Èñö˙˙ûîĞıâ˙˙˙ú˙ú˙÷ò˙˙ô"£˙˙˙³ûŭ˙˙˘Ş˙ŝö˙²˙ü˙ŭ˙˙˙˙˙˙˙˙˙ñ˙Œ˙˙î˙˙áé"ŭä˙ú˙ċ ˙ì˙ò¤ ˙Ġ˙˙˙ŭ˘˙ĝġ˙˙'/˙˙˙üĦ§óŝŝ÷˙˙ŝüŭŝŭŭŭŝ"$Äĝ˙ŝ"žÉġû÷ï*¤ĝ˙ûóĠŝϛ#ù˙Ù˙Ĥ -˘˙Ñ˙˙˙öÊ%#Ĥ˙ûÜ£˙ùÑ  ŻË™$ö˙› ˘÷ñÓ )Ô˙ú ĝ˙˙˙˙ŭ˙˙˙˙˙˙˙˙Ñ 0ÛÑ ˜˙˙˙ûúÄ  &ìò˙˙˙˙üú˙ĝ˙ŭŝŝĝĴ ˜ù˙˙% ûŭü˙Ò™˙˙Ò%'Ħ˙ô˙˙˙˙˙˙˙˙˙ŝú ()ÈÓÖ¨ ĦÑ˙ò˙˙- é˙˙ŝü˙˙, ³ÄÛÏĠ —˙ĝ˙ûĝ˙˙ù˙ħ*üŭû˙"˙˙ô˙˙ò˙ŝ!% œêĉ˙%. ²ò˙ŭ˙˙ù˙ŝü˙˙˙ó"$ Í˙ó˙ ³û  -ĝġ˙˙$Ëġ˙Ŝŭ âĝó˙óĠ%Ïŝ# ÖÏÊ˙˙˙˙ Ğĝϒ$ ' û˙ô˙˙˙$Îûúŝ˙Ġ( ŞÍÚÔÚĠ' ˙˙ĝ˙˙˙˙û˙˙˙˙Ï%! ˙î˙úú˙“›˙ġ˙˙‘ Ëú˙ĝô÷˙ü˙˙˙˙üûüŭü%˙Ċ˙˙˙Ì' Óġŝ˙ò&Úêúüš 'ÎáÊÇΒ6ë˙˙Ĉ(˙üûġ˙•ùö÷˙˙ò˙ŭ˙˙˙˙˙˙˙ ²˙ċ˙ñ˙Ċ˙óü˙¸ŽÖ˙˙úӐ)˙è˙ËÇò˙Ż›Ìĝ˙ü˙#ŝĝ˙ñ#%žöŭÒ- ž˙˙üĝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙÷˙äß˙ĵ˙˙ŝò˙˙– Óŭù˙” İ˙ŝúóü˘˙˙˙ŭ/ ùòó˙( ¨˙ú˙ÙÚ˙óÌĞÓéġ˙+úüö˙˙˙˙˙˙˙˙˙ò˙ùâ³î˙˙ü÷˙  &ú˙˙öĝ˙Ô #í˙ġ˙ù™ ÊüÌ&#ü˙üÏĴ!/ ûü˙ŝœ'}ù˙˙ĝ˙˙˙˙˙˙˙˙˙˙"/˜Ê˙÷ŭñ˙''˙˙ġ˙ì !Ó˙ô˙’Ħ£“%ĉ˙˙ġ‘*‘˙ĊĝĤ '˙ŝüŝ˙ŭŭ˙ŝûúŭ× ( Ġ˙ëüĞ Ÿ˙Ġô$Ö˙ò˙ŝ˙ Ÿ$"—ĝ˙òĴûùŝĝ˙˙˘şûŭ˙' ò˙˙°)#·˙÷ùÖ #žġ˙˙û˙û˙˙˙˙˙˙˙˙Ñ % . ˘˙˙˙úĉ˙ö˙²ĝ˙˙ô˙˙ú˙û˙÷˙˙üÑ/' '˘ġ&#ĝ˙çË˙é˙ħ (ß÷˙˙˙˙˙˙˙˙˙ú˙• $ ˙˙˙ú˙²˙˙˙ô˙ġ½$'#í˙˙˙û˙˙˙ó˙ü!œ˙˙ġ˙ü˙ûÎ5˙˙ġ$  Çù˙ŭ˙˙˙˙˙ŭû˙û˙ / Ğġԙ"($$ü˙Ä$Ğ˙ѕ$ œ˙˙˙Ş ‡²š˘­ç˙(""ûŝċ˙˙%$&02ġ˙ĝÖÏ˙˙˙üñë $  ŭŝ˙ô˙ûüŭ˙˙ŝ˙÷œ  ¤˙˙¤- ˙Ĝ˙ü£)) ³—˙ĝŝŝ˙üûŭ˙˙ŭŭ˙˙˙ !% ĴË˙ġš)£˙˙û˙ §˙˙˙ü –Ż$  ˙˙˙› $Ïñ˙˙ïżÑ˙ü˙˙û˙ŭ˙˙˙ûúŝ˙!Ñĝ˙˙֖÷ô˙°.Î˙ûŭúİ˙˙ùÓ&Ğ˙–#Ïüġ˙œ£˙û˙˙Ĵ œ˙Ä˙˙˘üá¨Ù˙˙Ĥŝ˙˙üú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙÷ġĦ ż£š˙÷˙$˙ö¤,# ŝÖö¸şò˙üž °˙˙êä #Ïœ˙˙˙Ä+ !" ŝô˙˙˙˙˙˙˙˙˙ö˙+Ž˙ùöŝŜ *Ï˙˙˙ñ÷ÔÊÜ˙½ "œû˙÷¤ " ,™˙*)ġ˙Ú9ŭ˙ùü˙˙˙˙˙˙˙˙ŝ˙žù˙!Îû˙­ ¤˙÷˙%)˙˙é˙Ŝ!˙ġĜ ‘ŝ˙˙ŭŭûŭ˙˙˙˙˙š, *ŭ˙˙ñó *£˙ŭ˙öë˙˙”#" ²Ĥ ˙û˙˙ !˘ûó˙ú˙ĝž"$Ĵüï˙˙˘)*˙ê˙ĝÀ"  àġ˙ü˙' ×˙˙÷ú˙û˙˙˙˙˙˙˙˙À1$$(Šĝŝ÷ô˙˙éü˙“ !—˙˙˙ŭöù˙˙ŭŝ˙ġ˙˙˙ù +&˜˙2 ŭ˙úÔÖ͘ĤĊ˙òŝ˙´äĞ"!ÚĊ˙ö˙˙˙˙˙˙˙˙˙ñ˙­+“Íŭŭù˙ö)%ŞÊÙ˙íŭŭ˙ŭ˙Á!ħÖÌÖ˙öġû˙˙ïú̝Ğáì˙û˙ÜÍÊÛòù˙üĝ˙ú˙ÌĠĠÚËĈúûü˙ÓÉĈáÔ˙˙˙ùŭ˙˙ü˙˙˙ĝŝò’!–Ïŭ˙™ Ş˙˙#/ú˙°òû÷ĝı#"İÍ˙˙ü’' ŝ˙üö˙ô'”  &–ù˙˙™,# +™ò˙ġù˙÷Ċ( 2,$éé˙˙ü˙ù˙˙˙˙ĝüŭ˙ü˙#&!!/˙˙Ğ ! &ġ˙˙˙ùüŭû˙˙ŭŝ˙˙˙# "&ĜéÛ$û˙'"  ô˙ÉÚÈŭŭ•+ ˙û­ !’˙˙úŭ˙÷ŝ˙˙ŝüüŝ˙Ä%™Êž !*Ê˙Í % ˙˙! Ĥó˙˙ !#( Ŝ˙ó) ˙ĝ˙îó˙˙ŝ˙íû˙˙ùó˙ĝŝ˙˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷÷˙˙ü¤! Ï˙˙ ˘%ŭù˙’  ˙ŭ˙%–ü÷˙˙Ç#$˙˙ú˙˙ž!Îû˙˙˙˙˙˙˙˙˙˙˙ô$Èú˙ÑĦ&Ûô˙˙ĝ˙ŭ$%ü˙ó˙ÑŻûÑ&# ˙ĝÑ# ¨ü˙˙˙˙˙˙˙˙˙˙˙˙ù ˙ħ!ž˙ĝ •ú˙ĝ  §ĝú˙üš ĝû#–èġü˙ù˙ü˙˙˙üü˙ԏħ›šĦĦžúü˙˙˙šĞ˜ Ĥ žŞÍ˙úû˙˙ô˙ږ Ĥžœž£§Ĥúï˙˙œž¤™Í˙öüó˙˙Σ!’Ĵ˘Áŝ˙ì÷˙Ÿİš£Óó˙˙˙˙ŭ˙Ĉ˘Ë˙˙ĝ˙÷˙ĝù¤"ŝü˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙ü˙úİϜ÷˙˙˙ü˙˙üŝ˙Íû& ˙ù˙í˙˙ĝ˙˙ŭ˙˙ò˙úĝ˙˙˙“–Ì˙ùÛ˙ŝû˙ûĝ˙ŭĝ˙˙ö˙˙ŝ˙˙û˙ŝ˙˙éà˙ó˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙ú˙ü˙ġ˙üò˙˙ĝù˙ĝ˙˙ŭ˙˙ĝö˙ú˙ô˙˙˙˙ï˙˙ûĝ˙ŝö˙óüŝĝ˙˙ĝ˙˙˙úó˙ù˙ŝûö˙ġŭ˙ë˙ü˙ġ˙˙ò˙ò˙˙ï˙ŭú˙˙˙ŭ˙ĝŭ˙˙üú˙ú˙˙ŝĝŝ˙˙ù˙˙˙ġú˙ü˙Ĉ˙˙˙˙˙˙Íĝ˙˙üú˙˙ŝ˙ó˙˙Ç˙ü˙üšĜü˙úò˙˙ò˙˙ñĴ˘˜Ğ›Ħ˙˙úüŭŝà—%Ù˙˙ùöŝ˙ŝ˙˙˙ú˙ŭü˙÷˙ŝù˙ü˙÷üĞ—˙˙öú˙úü˙ġ ˜Ħú÷˙˙öù˙˙ü˙ü˙ü˙ö˙ûŭ˙֘ݝĞÉû˙˙ö˙Ÿ  ˙û˙ü÷˙ŝú˙˙üŭ˙˙ûÌ˘˙ŭ˙œ ˜°Ÿ§ŭ•İÇ˙˙úŝ¨   ×˙ù¨ŭ˙Ò % %Â˙˙ö˙ŝŝŭüŝ˙˙˙˙˙Ñ !% ™˙ÏĦ"œ˙$˜˙ŝŝ"Öŭžħïŝ"ú˙÷ù˙ùüŝ˙ì˙ŭ˙û˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙# )Ô˙˙ÎÓÊ* ĦûöŜ’Ĵž˙ŝÚ¸ ›(•ü˙˙˙ËŻ'˘#—ġ˙ŝ˙ï°› ™$Ħ÷˙üü˙˙˙˙˙˙˙˙ŭ˙ž•#›"üĝ˙ŝž™Ħ'è˙û˙ú˙÷˙#™£“"Ĝ˙˙ĝ˙úÙġ˙ÔÖ÷˙ŭŭ˙÷ÖÍßġ˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙ñ˙ÔúŬ˙û˙ŝŝ˙ŝôîï˙ŝŝ˙ŝôîïÂşë˙÷úŭĠĈ³”§ú˙ŝ˙˙ŝñéò˙Ġ˙˙ù˙ôÜùÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙ô˙˙˙˙˙˙üÜñ˙˙ŭü˙˙ŭù˙˙ó˙üÏÜñ˙˙ŭü˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙ü !ì˙ö˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙ü÷û˙˙˙˙ŝŭüüü˙ŝ˙˙œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ö÷˙ŭŭ˙÷Ö˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ùàûùÙ˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙÷˙ùàûùÙ˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙ó˙˙ó˙ġĤ% ˙˙ŝ˙ú˙˙£¨ô˙˙ž¨ôĠù˙˙ŭ˙˙˙˙˙˙˙˙ÓíŞ")ö˙ó˙ŞŸ˘ÒŝÏ£“"Ĝ˙˙™™˘˜'˜˙úÇ!"ĦüŬ¨Ħ§ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ!%͘Ĥ÷˙˙˙¨¸şĵ˙˙ĵ²ş§Ġ˙˙ŝÔ˙ŝóĝ˙˙ûñ˙ŭ˙ö˙˙ûü˙ġü˙èĜñ˙ï˙˙˙úñ˙ü˙˙ħÍ˙â˙˙ñġ˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙û˙ôŝ˙ċ˙öĝ˙˙û˙úÒŭ÷˙ü˙üñ˙úö˙ì˙ö˙˙ü˙˙˙˙ù˙˙ïŝ˙ö˙˙˙˙˙˙ööŭ˙˙ŝûŝ˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙ŭ˙ġ˙ö˙ŭ˙üŝ˙˙üùû˙üŝ˙˙üùû˙ġ˙˙ù˙˙û˙˙ï˙ŭġ˙ò˙˙˙˙úöú˙ò˙˙ĝ˙ŝ˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭçòûüü˙˙˙òŭ˙˙˙˙˙ŭ˙ŭ˙ġäĝ˙öòŭ˙˙˙˙˙ŭ˙˙˙˙úöú˙˙˙˙˙˙˙˙˙ñïôü˙ŝ˙˙˙ë˙)*ë˙˙ü˙˙ù˙˙˙˙˙˙˙˙˙ŭûüü÷òö˙üüŭŭŝ˙˙˙ô˙ò˙%Ûó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙˙˙ö˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ë˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙ï˙˙ë˙ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙˙ÍĴݤ×ùù˙˙ù˙Â˙˙ʚû˙ùŭјşÇŜ˙ó˙ĝö˙˙˙˙˙˙˙˙˙û˙˙•ĈĤÁ­­˙˙˙˙ĝ˙ô˙˙ûó˙˙ö˙˙ü˙˙˙ö˙óĈÉ˙˙˙ùú˙˙ú˙ĝ˙ïÖ£›Óö÷ŝ˙˙˙˙ġ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭ˙˙ú˙úô˙ĝ˙˙˙˙˙˙˙˙˙˙ŭĝġù˙àŝĝûû˙ç˙Ŝ˙ú˙˙û˙ŭĝ˙˙÷˙ì˙˙öüö˙÷˙û˙ĝŝ÷ú˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙ôë˙˙ì˙ù˙˙˙˙ûï˙ú˙÷ú˙ôŭó˙˙˙î˙˙ü˙ùû˙üüêŝ˙÷ŭ˙˙ŭ˙˙˙˙ûŝŝû˙˙˙˙˙ŝûü˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ü˙ŭ˙ŝ˙ûŝŝŭŝ˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙ŭ˙˙÷û˙üûü˙ù˙˙ġ˙˙ŝü˙˙˙˙˙˙˙üĝ˙˙ŝ˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úôû˙ŝüŝ˙˙˙˙˙˙˙˙˙ú˙ú˙˙ïù˙˙˙˙˙˙˙˙˙ú˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙úùû˙˙ŭŭ˙û˙˙Ŝúŭ÷˙˙û˙˙˙˙˙˙˙˙˙˙ŝŝŝú÷ú˙üŝ˙˙˙˙˙˙˙ô˙Í û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ù˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙ú˙˙ù˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙ŝû˙˙ŝ˙˙öú˙˙÷òçë˙ŭ˙ŝ˙ü˙˙üŭŭô˙˙ù˙ûŭŭ˙˙˙öö˙˙˙˙˙˙˙˙˙ĝ˙˙ú˙ŝŝŝ˙ï˙úùŝĝ˙˙î˙˙ó˙ì˙˙ùû˙üüêŝ˙üŝ˙˙˙ö˙ŭĝŭ˙ëûŭ˙˙öû˙ŭù˙ĝúŝŜü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ìöŝö˙˙˙˙ú˙˙ûö˙üñ˙úû˙˙˙˙˙û˙ùñ˙˙˙˙ú˙öùó˙ŭ˙˙˙˙ô÷˙˙˙ŭ˙˙˙˙ġ˙˙ŝô˙ŭ˙ñ˙ôú˙ŝù˙˙˙˙˙˙˙˙˙˙˙ò˙ûü˙÷˙˙ŝ˙˙˙˙ĝŭ˙ôö˙˙˙ŭö˙˙÷óĝ˙ĝ˙ŝù˙û˙˙üú˙˙ûĝ˙˙ûú˙˙úû˙üüüŝ˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ü˙ġ˙ġ˙ú˙˙˙ŝ˙ŝŭŝ˙˙˙ŝ˙ŝŭŝ˙÷üŭ˙˙˙ûü˙˙˙ŝù˙î˙˙üûŝ˙˙˙ŭ˙üü˙˙˙˙ú˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙ŝüüü˙˙üü˙˙˙üûù˙˙˙û˙ŭ˙˙üü˙˙˙ü˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûú˙Ÿ$2Í÷ñŭ˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ŭúĝ˙ג§ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙úû˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙ŭ˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ŝú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝŝ˙ŝù˙˙ŝ÷ŭ˙ŭ˙ù˙íö˙˙˙ŝ˙ŝ˙˙˙ŝ˙üŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙ùü÷˙ù˙ö˙úü˙ö˙ĝ˙÷ù˙ûöġ˙˙˙˙ĝ˙ŝù˙û˙˙ïŭ˙˙òŝ˙ŝ˙ö˙˙ü˙ù÷˙˙û˙˙÷û˙˙ö˙ïŭñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙üúú˙˙û˙ûŭ˙ŝŝ˙˙ĝŝ˙úòŭ˙˙˙÷˙ô˙öï˙˙˙ú˙ü˙˙ü˙˙˙˙˙ú˙î˙˙öûöúú˙ö˙ŭŭü˙˙˙ŝ˙ú˙˙˙˙˙˙˙˙˙í˙˙ô˙˙é˙ô˙˙˙ġ˙ŭöŝ˙˙úú˙òŝ˙ùñ˙˙˙˙˙˙˙˙˙ŭ˙ö˙˙˙ü˙˙û˙ŭ˙˙˙˙˙˙ŭ˙˙˙˙˙˙ŝûŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙û˙û˙˙˙˙˙˙üûüŭü˙˙˙üûüŭü˙˙˙ù˙ŝü˙úö˙û˙ö˙üŝ˙˙ŝŝŭü˙û˙˙ŝ˙˙üŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝŭŭŭŝŭüŝ˙ŭüŭ˙˙ŭŭŝ˙ŝ˙˙ŭû˙˙ŭüŭ˙˙ŭŭŝüŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙üŭŝŭŝ˙˙ŝ˙ŞĤüġô˙˙˙˙˙˙ûû˙˙˙˙˙˙˙˙˙ŝ˙˙ŭüüŭŝŭŭŝŭû÷óñÌ! ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ŭ˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝŝ˙ûŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙ŭ˙˙ŝŝ˙ûŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙üŭ˙ü÷˙˙úŭ˙˙˙˙ü˙úĝ˙˙üöŝ˙˙˙ûö˙ŭ˙ŭü˙˙ù˙˙ú˙˙˙˙˙˙˙˙˙÷˙ŝ˙÷˙˙ŝ˙óû˙û˙˙˙˙÷˙˙üĝ˙˙˙˙˙ŭ˙öġŭ˙ûġ˙ü˙ú˙˙˙òü˙˙˙˙˙öŭ˙˙ĝô˙ôĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôôġ˙˙˙üô˙˙öŝ˙˙˙÷˙ŭ˙úġ˙ġ˙˙˙ûù˙˙˙˙˙˙ġöĝ˙˙˙˙˙ĝ˙úŭŝ˙ü˙˙˙˙˙˙˙˙í˙ö˙˙û˙éú˙˙ûŭ˙˙˙˙˙˙˙˙˙˙÷˙÷üù˙˙ġ˙ŝòŭ˙˙ŭû˙ò˙˙ĝ˙ú˙˙ŭġù˙ôö˙ë˙ô˙ü˙ú˙˙ú˙˙˙˙ŭ˙˙üü˙˙ŭ˙˙ŝŭŝ˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙üŭ˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙ŭ˙˙ŭŭ˙˙˙ŝ˙û÷üûù˙˙ùŭ÷˙ġ˙˙ŭ˙˙˙ŭŭŝŭ˙ŝ˙˙ùü˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙ŭúûŝ˙ŭŭ˙ŝ˙˙˙˙ûû˙˙˙úü˙˙˙˙ŝ˙˙˙˙ûû˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙úüŭûü˙˙ŝôü˙ŭ˙˙˙˙ùô÷ŝ˙üŝ˙˙˙˙˙˙˙˙˙ü˙˙üüŝŝüŭŝ˙˙ŝŭûú&&Êï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üü˙˙ŭŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙û˙úŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙û˙úŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙û˙˙˙ú˙˙ŝ˙ü÷ŭ˙ġ˙˙ŭ˙˙˙é˙òĝ˙˙˙˙û÷˙üŭ˙ùûŭ˙˙˙˙˙˙˙˙˙˙ü˙ŝû˙˙ŝ˙ŭüûŭüô˙û˙ì˙ú˙ï˙ö˙ë˙ô˙ü˙ŝ˙˙ú˙öġ˙˙ï˙ë˙û˙û÷ôù˙˙˙˙˙ŝ÷˙ò˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ç˙üì˙˙˙˙˙ŭ˙˙úü˙üŝ˙ŝ˙˙ú˙ġ˙ï˙ġ˙˙˙˙ü˙˙ŭŭĝ˙ûŭ˙ûŭ˙˙ò˙˙öú˙îŭû˙˙˙üŭ˙˙˙˙ĝŭġ˙˙˙˙˙˙˙˙˙ŝûò˙˙ŝ˙˙ŭò˙˙˙˙÷ŭ˙ô˙úŝĝ˙û˙ò˙˙˙ŝ˙ŭ˙˙û˙ŭĝ˙˙ü˙˙ŭü˙˙ŭŝ˙˙ûû˙˙ŝûûûûŭ˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ûŝŝ˙˙˙ŭŭû˙˙ŭŝ˙˙˙û˙˙ŭŝ˙˙˙ĝû˙˙˙˙˙˙˙˙ŭ˙ĝ˙˙óŭ˙˙ŝü˙˙ŝ˙˙ŝüüü˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙ŭûŭ˙˙˙˙˙ûü˙ú˙˙˙˙˙ŭú˙˙˙˙˙ûü˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭ˙˙˙˙ê˙÷í˙˙˙˙˙˙üö˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŭ˙˙˙˙˙˙˙˙" š˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûû˙˙ŝû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ù˙˙ĝ˙û˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ŭ˙ù˙˙ĝ˙û˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙û˙ú˙˙˙üûŭ˙˙˙ŝŭö˙û˙ù˙˙˙˙˙˙˙˙˙˙˙ú˙ù˙û˙üù˙˙˙˙ù˙˙˙˙ĝö˙˙˙˙˙û˙ŭĝ˙˙÷˙÷ïü˙˙ûŭĝ˙˙˙˙û˙˙ŝü˙ĝóü˙˙ü˙˙ù˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŭ˙˙ñ˙óŝŭü˙ĝ˙ŝ˙˙ŭŝú˙˙÷ŭ˙˙˙˙ú˙ù˙˙ŭŝĝŭû˙ŝ˙ö˙˙û˙ù˙üü˙ö˙˙ü˙˙˙˙ûûú˙˙˙è˙˙ġ˙˙ŝ˙˙˙˙˙˙˙˙üŝ˙ò˙˙ò˙˙˙ö˙ŭ˙ú˙ŝ˙ò˙˙ü˙ŭ˙ŭŝòû˙ù˙ù˙˙üù˙˙ġ˙˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙ú˙÷˙ŝ˙ú˙˙üŭ˙˙ûú˙˙üŭ˙˙û˙ŭ˙˙úü˙üö˙˙ĝ˙˙ŭ˙ŭ˙ŝúü˙˙üŭ˙˙˙˙˙ŭ˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙üü˙˙˙ü˙˙ûùŭ˙ŭŝ˙ŝ˙˙ú˙˙ŭŝ˙ûùŭ˙ŭŝ˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙ü˙˙üü˙˙˙ú˙è˙˙î˙˙˙üŝüôù˙˙˙˙˙˙˙˙˙˙ü˙˙ŭŝ˙˙üŝŝŭŭŭŝ˙˙Ÿž´Ċ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ù˙˙û˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ŭ˙ù˙˙û˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙üŭ˙û˙ŭ÷ŭ˙üö˙˙ĝ˙˙˙ó˙ü÷˙ü˙˙ù˙üû˙û˙û˙úù˙˙˙˙˙˙˙˙˙ù˙ò˙ġ˙˙˙˙˙÷˙ú˙ôû˙ù˙ŭ÷˙÷ù˙˙üù˙˙ġ˙û˙˙í˙ò˙ü˙˙öùû˙úüù˙˙˙˙˙ġö˙ŭġ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Éğì˙ŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úġùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üúúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙˙ŭùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ûû˙˙˙ó˙û˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝù˙ŝ˙ò˙÷ŝŝ˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙ñ˙˙È˙˙ĝ˙˙úüü˙˙˙˙˙˙˙˙˙ù˙ó˙üô˙˙ŭ˙÷˙ŝ˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ġû˙˙ü˙˙˙ú˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙˙ĝ˙üú˙ó˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŭ˙ĝ˙ñĝ˙˙÷˙˙ĝ˙˙˙˙˙˙˙˙˙ü˙˙î˙˙˙üŝŝŝ˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ô˙˙ŭ˙ö˙ġü˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷Ŭĝŝŭ˙ô˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙ŝúú˙˙ĝ˙ŭĝû˙ŝŝÍ˙˙˙˙˙úüŭŝ˙ŭ÷˙ù˙û˙úû˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ú˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙üù˙˙î˙˙ġ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭü˙˙óġ˙÷˙˙ú˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ŝú˙ŝù˙˙˙ò˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ŭ˙ç˙ûĝ˙ŭŭüĝ˙˙˙ŝü˙˙˙˙˙˙˙˙ĝ˙üï˙˙ñüŝü˙óó˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙ò˙˙ŭ˙ûá˙÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙öù˙˙û˙˙ñ˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ö˙ÎĉÜĊÌĜŭ˙˙˙˙˙˙˙˙˙˙˙˙ĝÊâÑÌê˙ûüŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ê˙˙äĝû˙úȟÜ×ù˙˙˙˙˙˙˙˙˙÷˙íü˙˙ŝûô˙ú˙ú˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙û˙˙˙˙ûù˙ù˙ŝġ˙û˙ĝ˙˙ò˙˙ŝ˙ĝĝ˙÷ŝùÎŭó˙˙˙ü÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝĝŝ˙˙˙ŭ˙ŭĝ˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙˙ŭ˙ü˙öñ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙èúŭ˙ó˙Ĉ˙ó˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝûö˙˙™›ĴÍ˙˙ûû˙ù˙ü˙˙˙˙˙˙˙˙˙˙ù˙ôé˙˙˙÷˙˙˙ŭ˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ĝü˙˙¤´˙˙˙û˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙é”"­–İ˙êô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öûò˙– ,¨ŝë˙˙˙˙˙˙˙˙˙ ž%"£˙Ŝ˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝ˙ĝ˙˙ŝ˙•%û˙˙˙˙˙˙˙˙˙ü˙˙ž˘ Í˙˙ù˙ñŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙ò§–í˙üîÍÒ÷˙ާ#™˘ĦĤ$’˙˙ŝĝ³žŞ˙˙˙ö˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭùú˙˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙ŭûû˙ü÷˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙˙ù˙˙ŝô˙˙˙òŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭô˙˙ĝù˙ú˙û˙˙ġ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙ğŬ££˘ö÷û˙ó˙û˙˙˙˙˙˙˙˙ġ˙û˙ù˙ևɧ’×ïó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙÷&œñ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ä˙˙âÔ­  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŝ•! È˙ŝ˙˙˙˙˙˙˙˙  Ÿñĝŭ˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô÷˙ŝÊ!!˙˙˙˙˙˙˙˙ò˙è˘)ŝ˙˙ĝ˙˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭüÏ+##5   ÷˙  Ÿâ˙˙˙üó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭ˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙öŝ˙˙ÇĤŸú˙ôŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŭĝëĞ”á˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûĝîħ„˙÷˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ġ™# ĉŝ˙ĝ˙ĝ˙˙˙˙˙˙˙˙˙ĝüù˙ö(%˙˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û -%˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙é -í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ¤$2­ġ˙˙˙˙˙˙˙˙˙# Ûĉïùŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ôû°–&–Ġ˙˙˙˙˙˙˙˙˙öŜ ùŝ˙û˙ûóù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙£%#œ!" Ч„Ş0*ü˙˙˙˙ëŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üĝġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûĝ˙˙÷ù£Ïĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙÷û˙ñı"˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ĥ!$ñġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙Ğ, Ÿí˙ŝù˙û˙˙˙˙˙˙˙˙˙ùú˙÷Ï  %ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙Ĝ ¤êû˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù÷í˙˙$ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò !Ñ˙˙Ċ˙ġ˙˙˙˙˙˙˙˙˙È,›˙óù˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝó˙˙˙î%˙˙˙ù˙ĝ˙˙˙˙˙˙˙˙üŭ÷Ż˙˙ĝ˙óù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙œ',‘Ü 1!Â˙˙Ҏ šò.Èó˙˙˙ù÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙öĝ˙ô¨!˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŭ˙öț$#ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙û˙ Ó˙˙ĝé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò Ĥ˙ÜĈ¨˘Ú˙˙ĝü˙˙˙˙˙˙˙˙˙˙ò˙˙˙û˙Ĵ Úûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ú˙Ĝ(â÷˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙˙ŝ˙ôĝÜö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝâ  ïĝ˙ï-›˙˙˙˙˙˙˙˙˙˙˙˙ò²ô˙˙˙˙˙ŝüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙öí˙ž(ċ÷÷˙ôù˙˙˙˙˙˙˙˙˙˙˙˙üžçÈ˙˙ó˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû%˘ÄÊ˙˜(  *ĦĝÏüŝ˙$#ĵŭ˙Ÿ'˙˙ŝ˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙öŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙˙û˙î¤!*î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ú˙˙ü˙˙ŭ !É˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôù˙ż° *Ë˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ' Óüö˙˙˙ö˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙÷˙ġ˙ùĜœ!É˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġ˙˙˙ŝî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙÷˙˙ġ˙˙ Ó˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙×+š˙˙ü˙é˙˙ó˙÷˙˙˙˙˙˙˙˙ñ˙+ò˙˙ŝûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙Ïŭ ä˙˙ó˙˙ġ˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ê˙˙˙ü˙ŭò"˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîïÏ›˙ó˙˙ŭÑŝ˙ŭ˙ñŜò˙˙£˙üŝ˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙ò¤İí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ġŭ˙ŝÔ $˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ù˙˙ö˙˙˙˙ñ˙üô˙üŝ˙ü˙ŝû˙û˙öù˙ŝ˙ĝ˙ŭ˙û˙˙öŭ˙Ġšû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙ġ˙ô˙ùú˙˙ü˙ú˙ġ˙ûŭ˙üú˙ú˙ŭ˙ú˙˙˙˙ê˙˙ö˙˙˙˙ò˙ĝĜ"ù˙˙ûû˙˙˙˙˙˙˙˙ġ˙ġ˙˙ûŝ˙ùûú˙˙ŝ˙ö˙û˙˙ŝ˙Èú˙˙˙ŝ˙˙˙˙˙˙˙˙ü˙ġ˙ŝœžÌ˙ĝ˙ô˙˙É #Ùŭü˙˙ü˙ôù˙ù˙˙˙ĝ˙˙òú˙÷˙˙ì˙˙ŝŭ˙ŭ˙˙˙˙˙˙ĝü˙ñ˙÷˙ùŝú˙ŭ˙ù˙˙˙˙˙ñŝ˙ó˙ŝŭ˙ŭ˙ùġ˙ù˙ñ˙˙˙˙ŝ˙ó͵À˙ú˙˙ó˙˙"£úù˙ĝ˙˙ù˙üù˙ü˙˙˙˙˙˙˙˙˙ù˙ŝ˙˙úÇ˙ùü˙ŭô˙ŭû÷˙üó˙÷ù˙Úí˙˙úŭ˙ŭ˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙üú˙˙ù˙öûî˙ŝ˙ŭ˙î˙˙ô˙ú˙˙ó˙˙û˙ü÷ŝ˙ŭü˙ò˙˙˙ñ˙˙ï˙˙˙ò˙˙ž!(Èû˙ü˙˙÷ú˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÛË˙ú˙ôŭ˙˙ü˙úŝ˙˙üŭ˙˙˙ñ. Üù˙˙ù˙˙ĝ˙˙÷˙û˙î˙˙ô˙˙˙˙˙˙˙˙˙úü˙˙ùú˙÷÷˙˙˙ġ˙˙˙÷ŝ˙˙Ì#ġû˙÷ú˙í˙˙˙˙˙˙˙˙ŝú˙˙ŭ˙˙ŝû˙ĝ˙ûš$Ħù˙˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙à#˙ĝü˙ŭ˙Äĝüŭ˙˙˙ĝŞŝŭ˙¨Ÿ˙˙˙È˙ù˙ù˙˙˙˙ġü˙ġ˙÷˙˙˙˙˙ö˙ùûŝú˙˙ŝü˙˙ùŭŝŝ˙üŭ˙˙ò˙˙ĝô˙û˙˙ú˙÷÷˙ŝ˙˙ŭ˙˙˙öĝ˙öú˙˙˙ĝĝŝĝ˙ö˙˙˙˙ĞŞĝû˙ŝŝŭ˙ŭ˙˙ê˙ûû˙ġ˙û˙÷˙û˙ô˙˙û˙˙ö˙˙˙˙˙˙˙˙˙˙˙ö˙ûĝŝ˙˙öö˙ö˙ĝ˙˙ü˙û˙ú˙ô˙˙˙í˙ġ˙ĝ˙ú! ˙ö˙ö˙˙óùŝó˙˙˙˙ô˙ú˙ŭŝ˙ö˙˙üŝ˙÷˙˙ô˙ù˙˙˙˙˙˙˙˙ü˙˙˙ó˙˙ö˙ó˙˙˙ô˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ü˙ü˙˙˙ŝû˙ĝö˙˙˙˙ò˙ñ˙˙ûŝġ˙˙˙òŝ˙˙ì˙ŝ÷úü˙˙"Ĥ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙ŭ˙öú˙ë˙˙˙÷ŝ˙˙ú˙ġ˙ë˙˙˙˙˙˙˙ùü˙ìúô˙ŭ÷˙ê˙÷ù˙˙˙· Çŭô˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ûŝó˙˙˙˙û˙ôó˙˙ŝùĝ˙˙éĴ+ŝôù˙ŝ˙˙˙˙˙˙˙˙˙÷˙ŝĉà¨ìÛû˙˙óÏ+–ûü˙ġĝí˙˙ġġ˙ûŝú˙ĝó˙˙˙˙öŝ˙ŭò˙ù˙˙˙ûû˙ŝù˙˙ŝ˙ĝÎŭú˙˙ó˙˙ú÷˙ŝ˙ö˙ŝ˙˙ŝ˙ŝġ˙ó˙˙÷˙ü˙˙úŭûü˙˙Ÿ ĉġŭ˙ŭ˙ĝŭ5"ü˙˙ù˙ŭú˙í˙˙úü˙˙˙˙˙˙˙˙˙˙˙˙í˙˙˙ú˙˙ĉÍ˙ûä˙úġ˙˙˙˙öûè˙ÇÎÖÓú˙˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙òù˙ĝù˙˙ÑÑÉÚï˙˙˙˙ŝ˙ûô˙óöûö˙˙ò˙üġ˙˙˙ó˙˙˙ù˙ñ˙ŭû˙ïü”˙ú˙û˙˙Í˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷é˘' Óĝ˙ĝ˙ŭġġ˙ù˙ù˙˙û˙î˙Ê˙˙+˙û˙ô˙ò˙˙üàËÌ˙˙üë˙ô˙˙˙˙˙˙˙˙˙˙èŭ˙ŝ‰Û˙³ö˙ŝ˙˙˙ò˙˙˙ Ŭüí˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙ûü˙˙˙Ż0£Ûòóñ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È4Ħéû˙ùŝú˙ 0 É˙˙˙úĝ˙˙ŭñ˙üù ŭ˙˙Ïé˙˙˙ù˙÷÷˙˙Û˙˙ù˙˙â˙ŝ˙˙˙˙˙˙ûûü˙úú˙˙˙üô÷˙û˙úĝ˙˙úúú˙ĝ÷˙˙ú˙ŭë˙˙êĝŭ˙˙ġ˙òöé˙˙û˙˙ŭġġ˙½"ŭ˙˙ŝú˙ç˙ñûû˙˙˙û˙üŝû˙˙ŝö˙÷ŭñ˙ĝ˙îúü˙˙˙˙˙˙˙˙˙ñ˙˙üû˙˙˙ÀĠż˙÷ó˙ú˙˙˙ù˙˙îŝ˙ó˙ŝï˙ùÌÊ˙˙˙˙˙ö˙˙˙˙ŭ˙˙˙˙ĝ˙ûŝû˙˙˙ñŭôúŝ˙ë˙˙˙˙˙˙˙˙˙˙˙ú˙ô˙˙ó˙˙˙˙˙ïû˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙úñì˙ö˙ġĝ÷˙˙˙ù˙˙˙˙ċ˙ñ˙òôŝ˙ò˙˙˙÷˙ù˙˙í˙¸Ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ò˙ŝĝá˙úâ˙ŝä˙˙˙˙î˙Íò÷˙ööü˙˙ġ˙˙˙óŭ˙ù˙˙ú˙˙ğ˙Ù" ŭ˙ûò˙˙˙˙˙˙˙˙˙ö˙ìò˙˙˙ŭóĝû˙û˙˙ŭ˙÷˙ö˙˙ ŭú˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ü§ ˙˙ġġ÷˙˙$çö˙ŝ˙˙˙˙ö˙ŭŝ˙ŝôŝ˙˙ŭû÷˙˙ó˙ĝû˙ûŝ˙˙ûŭ˙˙üü˙ëӖĴ˘ó˙îĝû˙˙ĝ˙ü˙˙ŝô˙˙˙÷˙˙ŭùŝ˙ĝĝ˙˙˙˙˙ñ˙ ˜ÑÄ˙ŭ˙˙ŭ ÓüΜ£û˙˙ì˙˙ïû˙˙˙˙˙˙˙˙˙˙ĝ˙Ëô–Ÿ™—°Î˙˙ŭĝ˙óҒ­˜ÇûÀ‰!#Êŭ˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙ĝ˙î˙˙˙üɚ  ²Ìĝñ˙üö˙Ÿ×˙ó˙ö˙öú˙ŭñ˙ÏóĤžÎ˙ Ĉ˙˙ö˙Ë$Ċ˙£”¨Ÿ˘ŝ˙û÷˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙÷ê˙Ÿ !Ĉ˙ú˙ß˙ü˙˙˙ï˙ó˙üûç’×÷Í*˙˙ġ˙ó˙˙µŸû˙üÖ˙˙˙˙˙˙˙˙˙ġ˙˙ü˙˙’!ž+°£ŭ˙ëó˙ñû˙˙À˙ŭŝ˙ŝ˙˙˙˙˙˙˙˙û˙ù÷˙ŝ˙˙ŭ˙ûù!’˙ĝ˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙ŭ˙ú˙˙ŝ˙£Í˙˙˙˙ŭ˙˙˙˙÷ĝŝ°­ù¨ħŞ‘˙ûŝ˙û˙ġô˙˙÷˙˙ÇáïÔ˙ûòóŭ˙ŭŭ˙˙ĝ˙˙ùü˙˙˙ŭñ˙˙˙ŭùĝ˙ù˙˙ù˙ñúŭ˙˙ù÷˙˙˙ñ˙ñö˙ġ˙ñ˙ü÷ù˙˙Ï &œ˙ô÷ŝ˙˙ôù˙ü˙˙ñó˙˙û˙˙˙êû˙í˙˙˙˙çû˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŝŭ˙ġŭġ°%˙˙˙ŝ˙÷ì˙˙ç˙ú˙î˙ġ˙˙ö˙ #Ĉü˙üû˙û˙îè˙˙òĝ˙îò˙ôö˙˙â˙˙ĝ˙˙ü˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙ûô˙˙ó˙˙ŭŭò˙˙ġ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙÷˙˙˙˙ŝŝ¨È˙˙ĝġ˙ÎÎû˙˙˙˙˙˙˙˙û˙ġûŝ˙éüĝû˙˙ ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙úÑ  (°˙û˙ó˙÷˙ȧž˙˙Í­šœÊ˙ŭŭû˙˙˙ĝó˙˙˙ġŭÇ Ì˙ĝġ˙˙˙˙˙˙˙˙˙˙üŭ˙ùüŝÇ˙˙Ġ!Ġû˙˙ŝŝ˙û¤×§ì˙ŭ˙˙˙˙˙˙˙˙ù˙˙ñÒ 5žŝô˙˙ûŭ÷Ĥ³˙òÖ˘Êï˙÷˙˙ûü˙½Ò *™˘ô˙ô˙˙ŭ˙úŝ˙˙˙˙˙˙ġ˙ß/#(šċġ˙˙ï˙ˢ¤& ŭö˙˙ì˙Ô$$Ĉ˙ñ/ ó˙ê (Éù˙ûŸ% "•ûŭ˙î˙˙˙˙˙˙˙˙˙˙ŝ˙ĝöÍ­ !•ù˙ùöÖ%. 2)ú˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙ĝ˙ñ˙óÏ*+ §˙˙ö˙ş˙÷ŭ˙î˙ùü! ˙ŭùòË$)¤( ' Ò˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ûŝ˙ĝäË ùŭ³Ñ¤Ì˙÷ù˙ûžÓ*×ñö˙˙ûÇÓ$Ĉ²É˙ë˙˙˙˙˙˙˙˙˙˙óûÑŻ# ËÓ˙˙˙òúĤ%" 'Ž˙ë˙ô˙˙˙˙˙˙˙˙˙ó, 0´óŝÂ)-! Íŝüù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ġûúòöû˙Ü!$É˙ú˙˙˙˙ŭùöŝ˙˙ò " —ß² (•˙˙è˙ŭ˙˙ĉöÖ - —˙˙˙úŝ˙˙ü˙ĝ˙˙òŭ˙òÑ˘%ĈʧÔù˙óȞĦıÌ×˙üĠÊ˙÷ûú˙ìÙ܇¨ÎÎÒ˙˙˙˙ù›#˙˙˙ŭè˙˙üÙݧĥÒĝöû˙żáÖÙùĠĥ’ûûŝ˙˙˙˙˙˙˙˙ĝ˙˙ñ˙˙û˙  ŭ˙˙÷ö˙ùü˙˙ó˙÷˙û˙úŝ˙˙Ĥ÷ġü˙ġÏË˙˙ûê˙˙˙˙˙˙˙ġ˙ù˙ĝĉ˙öëŝö˙ö˙˙ü˙˙˙˙˙˙˙˙˙÷˙ü÷˙û˙ԗ˙˙ò˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŭ˙ù˙ñ˜ ™òÖ% §ŭ˙ûŝ˙˙ï˙˙öžĤ“Ĝ˙˙˙ö˙Û ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ñöħ$%¤˙ġ˙÷˙¨š0É˙ŝ˙˙ó˙˙Ĉ“ı£Ë$İ÷˙˙ñ˙˙˙˙˙˙˙˙˙ŭü˙˙û˙˙”&")­ŝ˙ò˙˙Ô."*ú˙˙˙˙˙˙˙˙˙ò˙ûŝ  Ĥŭ˙ĝÚ œŸ'Ĉ˙ì˙˙ú÷Ĝ!%($š˙ŝ˙˙˙˙ŝ˙˙ŝôĝ˙˙ò ¤Ŭô˙˙Ç%&2›˙˙ÑûžÛü˜#Ĥ˙˙Ÿ ĴġÏëÑ & ! $˙˙˙˙í˙˙˙˙˙˙˙˙˙ö˙ĝ˙ ,,Ĥô˙ŭÓ%™İ )–ôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙ûö˙˙û˙¤!˜Ħ˜™ħ“˙˙“›İ(™˙ŭú˙˙Σ¤ Ù˙˙Ô ĦúÍÀŝò˙˙˙˙˙˙˙˙ü˙˙û˙˙üé&ŭ˙ ×˙˙˙ġ ³›+ ˙˙û˙×"Ħ˙î° . —˙˙˙˙˙˙˙˙˙óó˙˙ ô"Êò˙˙˙ĝ# ŞÍ˙˙ù˙˙˙˙˙˙˙˙˙˙î)ş˙˙Ö #*˜Ñí˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ü˙ì˙˙Î(Îö˙˙üüŭŝ˙˙úŝè˙ ) ££ & £ó˙˙˙ï˙Ĝ#& ($Ĥè˙úù˙˙ú˙÷˙˙˙˙¨ ) Ùù¨ò³#!™˙˙Ó# &”ì˙ôú# &! , Ïò˙ù˙ÌÈÖ˙ŭĦ$#É˙˙˙˙˙˙˙˙˙˙üŝü˙˙ô˙É%)œúÏ˙˙˙×úġ׎Ĉġŭ˙ê˙˙Ü Ñ˙˙Ĥ°Ñġŭ˙˙öÌĞÜ˙˘ġ˙˙˙˙Ü Ĥ˜˙˙˙˙˙˙˙˙òü˙÷˙˙› ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙úûóù$$# $ # Ò˙ŭĝġ˙ˆ %Í˙ûüôŜ!öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ #%úÒù˙$& %#›˙ïú˙Ôäİ)Ġùö÷˙ú˙˙˙˙˙˙˙˙˙ì˙íüï¨(  œ&¤˙˙ĉ˙!  Ċ˙˙˙˙˙˙˙˙˙˙÷˙ŭ ˙˙%!ĦŸ!$–˙˙ûĝ˙ʜ &­ *Ÿüù˙˙ŝ˙˙ûŝŝû˙˙Ğ 'Éú˙û( Ñ˙"û˙Ñ$Ĉü˙˙˙”3 ġ˙À*Öô˙˙˙í˙¨/ Ê˙íç¤ôüĝ˙ô˙˙˙˙˙˙˙˙˙˙Ş+Ż!— ûÙ" ¸˙#éô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙ó˙ʞĜ˙ù÷'")”öß˙˙ ŭúûü÷ áü˙š,Îü˙+ Ş˙˙ĝÛ5ö˙˙˙˙˙˙˙˙˙ŭ˙˙ŭ˙˙˙ô”$1ŝ˙˙Ê$Ïì˙ïĞ"Ğöĝî˙%úò˙÷˜' ŞŞ&–˙˙˙˙˙˙˙˙˙˙ĝ˙$  ù˙ô˙ÓÔò˙ĝ)˙ż˙˙çû˙˙˙˙˙˙˙˙˙ú˙òĜìÔŝÍ%#™˙ĉ˙×˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ôŭúöóÑ ßö˙ŝûŝ˙˙˙˙˙˙ù˙ ö˙ù#"˙˙ĝŭ˙—˜£˘ ¤˙ŝ÷˙˙˙ŭŝ˙üü˙ï²! Ì£(ž˙Ä"$+óÍ˙û¤ #-˙˙ŝ÷Ĵ!›˙ú˙˙ë´ §˙˙ %)Ğéú!& Ì÷ġ˙˙˙˙˙˙˙˙˙ôŝ˙ġ˙˙$!"˙îáĦ&(&Ĵô˙˙ó˙Ë Ûĝ  Íö˙úû˙ û˙%  ŭòĝĝ!Ĉ˙˙˙˙˙˙˙˙˙˙ñ˙˜ ,% ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝö˙˙ $ Ô˙ò˙˙ú *  ”ôú˙˙ú$˜ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ÍÏÇĴò˙ì§/ œá -œî˙ö˙Ĉ1 -ÙÀ$˙ŭ˙óüü˙˙˙˙˙˙˙˙˙˙ö˙˙  ĴŬÄ·'"˙é˙˙ÒĦ ³£Öû˙˙˙˙˙˙˙˙˙˙é˙ $ŽĞàù˙˙Ï, ˙üüġ#ž˙ŝĝ˙!Éó˙ /ôö˙˙ŭ˙˙ŭû˙˙˙ì"Ì !#ÔûĦÏ˙˙èš%%ž˙˙÷ú˙‰%+ ›)Ÿ˙˙˙ $Â˙˙ê˙ò˙˙İ˙ÓĝêĴ˙ô˙ŭ˙˙˙˙˙˙˙˙˙˙Ĉ! /ċ˙ú˙&§˙ü +ùö÷ŝ(òĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙ġ˙ì£) * ò˙#µèü˙Öñ˙ñâ,˙ĝò˙%˙ŭ˙Ò1òüŝ˙ö,˘ù˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙ŝÓÏú˙üĤŝÈ˙!#ŭ˙˙˙ú2ü˙ú×"$ °ü˙˙˙˙˙˙˙˙üöĤ&üŭŝ˙˙˙Í. Ġ÷˙ù˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙!#•˙ö˙í3 Żö˙ïñ˙˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙úù˙í˙˙˙˙¨  Ñ˙˙ŭ˙˙˙ŝùùòù˙ÏÄ˙üŝ §ŝ÷˙Â# ĝ¤%%% ˘˙˙˙˙úŭû˙˙ûöŭŝöĦ"ŝ˙˙›! Ë˙ $Èñ˙#Ĵ˙ŝÛ#˙öŭĝĴ.ôüó˙üûÚÓùñ$% ˙˙'#"Ġû˙˙˙˙˙˙˙˙˙˙÷˙ĝö˙ù( + Ħ˙˙‰*ŝï˙úüĈ% 6˙Ô³ĠÒÈ˙ŭ˙Ñ(šÖûŝÔ"°ê˙)™š' ­˙˙˙˙˙˙˙˙ê˙˙Ê&'“0+$ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙´"Ħ˙˙ŭ˜' ˙ŭ˙ó!Ħ˙ŭúİĤË˙˙ĝŝ˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙™˙üÛô£ Ş˙ü˙˙ŭŬó˙˙Ê )Ĵñ˙ú˙äñ˙˙É­ó˙ŭü˙ü˙˙˙˙˙˙˙˙ŭŭ˙˙ĝÏü˙úùĞ Ħ˙˙ĝÙĈ˙˙˙ú˙˙˙˙˙˙˙˙ù˙˙ó!š˙ĝôŝ˙ñÑŸüŝ˙˙%›˙ù˙ÌĴ# ˙˙ŝû˙ù˙˙ĝ˙˙è²!$™ŭ˙˙™È˙˙˙Ĥ×ġ˙˙˙ Öú˙ù˙ġÒ˙úò˙˙˙˙Ċ#"ż˙˙ô!ùü˙óŝ˙˙˙˙˙˙˙˙˙˘›˙ĝ˙ù˙Ÿ˙ŝ¨Í˙Ĝ˙ĝĜ˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙ü˙ö˙"#žĦĦĤ Ÿ˙˙ËÌË˙˙˙ĦÏ˙÷˙› ĝŝú˙ĈŸÓ˙ġŝÎ) ˙Ê˙˙ŝ! ˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝüŝ˙Ú Ó˙ú˙ŭĜüû˙˙ġŝŝ( ˙÷˙˜Ğ ¨§œÖù˙˙˙˙˙˙˙˙ŝŝ™˙˙˙ö˙˙Í & Ş˙ù˙˙˙ùŝ˙úŝ˙˙˙˙˙˙˙˙˙˙Ö É˙üĝ˙#Ç˙ñ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭ˙˙ŝŭ˙)šŭ˙ŝŝ˙ŝû˙˙˙÷˙$˙˙˙ûÛÀ˙˙ŸŸġü˙˙ŭ˙˙˙ŭŝ˙˙ŭ˙Ο) ˙ÌÍĤÓú˙ ŞŸ˙úݘ°üù˙ŝÎ $÷ŭ˙˙ÇÚ˙û˙öü˙ "°!Ħûü˙(ĤјÖ˙ŭ˙ò˙˙˙˙˙˙˙˙ŝ÷˙ĝ˙ġ˙Ġ£ĝ˙˙ŝŭŞŝô˙Ô&˙û˙ŝÑĦ˙ä˙ú˙ûŝú˙˙úÔ Ùŝŭ˙Ì! ˙“˙û˙˙˙˙˙˙˙˙˙ËöŞ !ŝ˙Ċ'Ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ü˙˙óùĞ ™˙Ïöú ˙òÎÔü˙˙óŝ˙Ç#§˙˙˙÷˙˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝü˙˙˙˜ &˙ŭ˙ŭŝĦ Í˙˙ĝŝ˙üñ˘ûġ˙ûö&!üö˙úù˙˙˙˙˙˙˙˙˙ü˙ŝñ§˙˙ö˙÷˙ŭ˙˙Ë˙˙ŝü˙˙˙˙˙˙˙˙˙ù˙ĝŝôŭ˙ŝÍ˙Íĝ˙˙ú˙–!#˙ŭ˙ &! #œĝ˙ĝ˙˙˙˙˙òŭ˙˙­öÔÇ˙ô˙úĝ˙˙ùŝןŝùü˙˙# %úĝ˙ü˙û˙Ĥ #Ĉ˙üü˙ûÓ˙œ˘˙˙˙ù&Îô˙ĝ˙˙˙˙˙˙˙˙˙Û˙ĝ˙ĝ˙ŭ+ ¤Ë˙˙ú˙üžì˙ü˙˙öĝ˙˙˙˙˙˙˙˙˙÷ŭ˙Ö" ÷˙ĝŝ˙˙ó˙˙˙ŭñ˙÷İ 'Ŭ˙ö˙ ù˙û˙ü˙˙ùû˙Ê#š˙˙˙ŭ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Í"úŭŭû# ŝú™˙üŝ÷˙&ù˙˙ ê’Ñ Ù˙úû˙˙˙˙˙˙˙˙˙˙ĝ#§ŭŭù˙˙˙İž˙Ê˙ĝú˙÷˙ĝ˙˙˙˙˙˙˙˙˙˙˙ñ¨&”˙ùü˙¤˙˙ü˙ü˙ŝúŝ÷˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙˙ü˙˙ĝĤ˙˙ù˙˙ġüù˙ŝ÷˙ !¨˙ùŭ˙Ù "¨ó˙$!  œ'¤ö˙˙ü˙òŭ˙˙˙˙˙˙˙˙Îóİ˙û¤$Ö˙˙áô˙˙ĝ˙˙˙é˙˙Ë#Ĝġ˙ŭË)˙ŝ˙˙˙îá!š÷ö˙ĝ­"Ò˙˙˙˙ŭ˙û˙˙˙˙˙˙˙˙û˙˙ĝŭŭùü˙ü˙óü˙Ê$¤˙˙öŝ˘˙˙ñ˙ŝ¨" ˙ġ˘Ñ˙üúüŝ˙˙%"ü˙˙˙˙Ï#Ì˙ûö˙˙˙ĝ˙˙˙˙üŻ™˙ŭü˙Ë(•Ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙û˙˙û˙À$(#˙ü˙˙›&ŝ˙˙ % œ( Î˙˙ġ˙˙˙ú$˙û˙˙ġ˙ù˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙û˙ùúÊ˲ĞôÚóŝÓ÷û˙÷û·ü˙˙ħÈ˙˙û˙˙Š!)Úùŝ˙ŝŭ˙˙˙˙˙˙˙˙ñ˙˙û ˙˙û˙ñ˙Ş"£ù˙úµ°ċĝ˙˙˙˙˙˙˙˙˙˙˙ù˙˙˘˙˙˙ô˙ü˙&˙˙ĝÏ&#É˙˙£ôÈע ġ˙˙ĝ˙˙ûòĝ˙˙˙ĝġ$$ ŝŝ˙˙˙ó˙÷˙ò˙˙˙üĠî£ #˙ô˙ë +Ôúü˙ĝŝ˙ Ïö˙í˙ûôŝ  Ĥŝûĝ˙  Ŭ˙ü˙ï˙˙˙˙˙˙˙˙ñ#!!ùŝü˙˙ŭÁŸù˙Í'Ġú˙˙˙¤!Ħ˙˙üôú˙˙û˙˙˙˙˙˙˙˙ŝ˙˙ĉ"žĝ˙û˙ŭú˙ĝö˙é˙ѕ& -##Ñó˙û$!˙ŭ˙ŝ˙˙ò˙ÖĝĜ ,žġ˙ö˙î˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ó+ Üû˙˙ûÎ˙˙!6ü÷˙î˙ŭĝ˙Ç0÷˙˙˙˙ü˙Ĝ˙÷ö˙˙˙˙˙˙˙˙˙Ħ )íŝ˙ŭ˙ä"  üû˙&Ç˙îî˙˙ĝ˙˙˙˙˙˙˙˙ôûÓĤ# Ŝŭ˙ŭú)Êú˙˙í˙˙ú˙ĠÒêù˙˙òĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝû÷úüŝü˙!!û˙úùú˙˙˙ú˙ì˙&Žò˙ù˙Ç!é˙ó$ŝ˙˙˙û˙ĉ˙˙ü÷˙ĝŝĝ˙˙˙˙˙˙˙˙˙Ö˙Í !½˙§/Ïô™&Äċ˙öù˙÷ú˙˙ñ˙Ÿ Û˙ö˙Î Ç˙ö˙˙ö,ŭüü˙ŝù˙˙˙ï÷Ï ˙î˙÷˙ŭ˙ŝ˙˙˙˙˙˙˙˙÷˙˙˙˙˙˙˙ ˙úô˙ŝ˙óóô˙ĝ˙Ŭ ôü˙÷ùž›ıŸċ˙˙û˙˙ö!·•‹¤İÚü˙˙& ˙ŸÈŝ˙˙ŭ˙ĝ˙ü˙úùŝ˙ä˙˙˙˙ùÓ !!÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭ˙˙ô˙Ğ %˙ô˙ŝëĦ›˙ôù)Îúô˙ù˙ù˙÷˙˙ùûé! ô˙úĜü˙ñî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙óí˙˙˙˙(˙û˙˙µ*"˙˙ġ˙˙²!˙Ŝ "Ğ÷÷îü˙Ġŝö˙˙˙˙˙˙˙˙˙˙˙˙˙ûû·˙ĝúú˙ĝ (Îúŭ˙ĥß˙öŝ˙˙˙˙˙˙˙˙˙˙ú˙˙#Óïŝù˙˙ŝüú˙˙˙Ġ ß˙ ¤÷˙˙ë˙˙˙˙˙˙ĝë˙˙˙ŭ˙üù˙!%ü˙òñ˙˙˙ú˙ôŭû˙è—"ż° Ñù˙˙˙Ġ!˜ù˙ġ˙˙˙î¤ "&Ä˙˙˙ó÷˙˙û˙ùú˙£#Íĝ˙ê˙˙˙˙˙˙˙˙˙ÏÊ˙˙ŝê˙˘)Î˙öú!Ŭú˙ŝ˙… #ôä˙˙ġ˙û˙˙˙˙˙˙˙˙˙ûĝ˙˙§¤˙˙ŝ˙üóġ˙öû˙–! ¨/"Ìûô˙"É˙í˙ì˙ŝü˙ñ˙ž  ²Î˙Ò˙Ĥ!ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙× !ĵ˙˙üóÑü˙  ¤úô˙ŝ˙$"ŝüÜ Íĝ˙˙ò˙˙ô˙˙˙˙˙˙˙˙˙˙˙ĝĠ ""Ŝ˙÷ì˙˙Ĵ˙ĝüÎ Íê˙˙üïŝ˙˙˙˙˙˙˙˙û˙ó˜#’˙ô˙˙š˙ôŝ˙˙ĈϞ›˙˙öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭü˙ü˙˙˙÷×""˙˙˙˙ŭ˙ú˙˙÷˙í²ŭ˙˙îè Ħ˙˙ )Óóŝû˙ûó˙Ü˙ôû˙˙î˙˙˙˙˙˙˙˙˙öö˙%"/žœ¨(Ş‹üù˙˙ĝ˙˙ŭ˙ۘ&"ü˙÷˙!Ĉ˙˙ïü˙² Ó˙ö˙˙˙ĝŭì÷˙ŭà%Ġ˙ŭ˙˙ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙ĝ÷û˙é˙˙ĝ˙ġüµßöüòÒ¨Û˙ı˙ï˙˙£$$Œ˙˙˙˙ê˙˙ġ˙ü!) Ğô˙ç˙˙˙ġ˙˙˙˙˙ö˙˙ŭîŭĝŝ*  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙÷ĉĝˆ &*˙˙üÖÒ !ĝ˙ûĤï˙ŝö˙îù˙ùö˙üûġ Óö˙ŭ˙™Ş˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ ¤˙ Ìô˙˙è˙™—÷˙ì˙˙/#ÖÏ%"•˙˙˙˙ŝ¨”˙û˙÷˙ü˙˙˙˙˙˙˙˙üü˙ŭ ëŭ˙˙˙˙˙ŝġ˙Ùó˙û˙û˙˙˙˙˙˙˙˙˙ûŭù1˙î˙ġ˙÷üÔ˙üü˙ö!'ÊŞ˙˙ô˙û˙ò˙òŭ˙˙ûìŝôŝ˙˙˙Ùú˙˙ŭù÷˙˙ġúĝÙô™#àî˙˙˙ó!ĞĠö˙˙ù÷˙˙!Ó÷ë˙ü˙ġû$û˙˙˙ú˜ /Íû˙öî˙˙˙˙˙˙˙˙ŭ0Ğûóú˙˙˜#öû˙˙˙˙ùñğ%›˙˙˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙ú˙$ ˙˙×˙˙˙˙ò˙˙Í Ù˙ö#Î˙˙ö° ıö˙˙û˙˙˙˙˙Ö##ŸËô˙ñ˙ "ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ 'Ĥü˙˙˙$Éüŝ)& ˙˙úè˙ ˙˙ÏĤ&ž˙éù˙÷ÛĦËŭ˙˙˙˙˙˙˙˙˙ĝżú˙ü˙ú—Ĉí˙ü§Ğŝ˙ùî˙è˙˙˙˙˙˙˙˙˙˙ù˙Ĥ.ö˙ŝŭ İ˙ë˙òûŭ$Ë˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ĝ˙öŭ˙÷˙òŸ'ôËñŝú˙ö˙˙˙ŭ˙ š˙îú˙Ü í˙˙ĝ"#Î˙˙˙˙˙˙˙ó˙˙˙ç˙˙ġ˙˙˙˙˙˙˙˙˙˙ùŸ+  !0$ ˙˙ù˙˙ŝûé & +)‘˙÷˙û÷ ¨˙÷˙÷ĝ ""˙ò˙ù˙ü˙˙˙ü˙ĵÂûŝ˙ŝŭ˙ŝ˙˙˙˙˙˙˙˙˙˙ŭŝúû˙˙ñ˙˙ĝü˙ñú˙÷ö˙ێö˙˙˙ӑ š˙˙˙÷ö' ˘ĝ˙íû˙˙˙ûû˙˙ùĦ ¸ù˙˙ù˙˙ŝû˙ġ˙ïöä!(§í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙úï˙. ˙ôüî˙§ •˙ü˙ ¤Ĝú˙˙˙˙ò˙ûû˙ú(˘÷ê˙$ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùï˙ŝ&Ĵë˙+ù˙ó˙˙ñĤ +ü˙˙ġüùŭ˙ĞÔ˙ĝ˙ĝù¨#’˙üú˙˙˙˙˙˙˙˙˙˙ŝú˙˙Â=Ò˙÷÷˙ġĦ ,ž˙˙ġ Ëóú˙ü˙˙˙˙˙˙˙˙ûú˙˙Š˙ŭö˙˙˙ê× ˙ôü˙ü£0Ç˙ô ˘ë˙˙ìò˙Ĉ˙ġ˙˙ŝ˙˙˙˙ĝ˙(˙˙û˙ġ˙Íòŭ˙/Ñùí˙ĝÚ˙ùúé ”˙÷˙ŭŝ˙ìó'ÛÔ˙ñ˙ŝ˙˙˙˙˙ïŜ#œ˙˙ñ˙˙˙˙˙˙˙˙˙˙ŝ  –Ö˙ŝôÇ–˙˙˙ż(Á˙˙ô˙Ÿ"0°˙˙ù˙ú˙ŝ˙˙˙˙˙˙˙˙úüŝ˙ĊÍä÷ĝÉ˙˙Ê$”Ó˙˙ Ò˙ò˙˙ ñ˙ì˙íĞİûċú›Şô˙÷˙Ĵ/"É˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ!#˙˙üŭġ É˙ŝÑ$üŝèñ!î˙ù ! %¨˙û˙˙‡#˙˙˙˙˙˙˙˙˙˙ĝßÎŭ˙úêŬ%×ĝßĝ&Ê˙ê˙ú˙û˙˙˙˙˙˙˙˙˙ŭ˙ü˙ŝ˙ óĉü˙ö˙" ÁĠ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝ˙ŝŭÒî0˙ú˙˙÷˙ù˙ĝó˙˙¤$%š˙Ò˙÷´ $ħêú˙ĦËÊ˙˙ô̤§ĝóú˙ŝó˙˙˙˙˙˙˙˙˙˙òöÖĞü' °üû˙òġ˙ç¤Ğ“üô!ħì˙˙˙Í"  ˙ŝ˙û˙Ħ% ×˙˙öûûÓû˙ç˙˙ !ñ˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŝ˙˙ù !)é˙ï˙ù˙˙Éá˙ĝ˙˜0Îï˙ü˙ĥ!"£üñ˙˙› ˙ï˙˙˙ôú˙ï˙˙˙˙˙ì# #œô˙˙ü˙˙ü˙ûĝ˙Ċ#Ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ü˙!ù˙˙ü“+öĠúŞ ĝŝé˙ûœş˙üŭÁ+ )˙˙ŝ) " Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï ¨˙ò˘ ˙úŭĝ–˙÷ñ˙˙%(Ö˙ŝ¸&£˙ö˙˙˙ .íóŝ˙ŝ˙˙˙˙˙˙˙˙˙˙ŭġ˙˙²%'˙˙˙È˙˘"Ë˙úò#Ĉ˙˙ú˙˙˙˙˙˙˙˙˙ûû˙û´ Ó˙ŭòġö˙Ĉü˙ŭô˙Ÿ˙úš˙ŝî˙Ùš˙ŝĝ˙ŭŝôñŝú˙˙Ç!#É˙ŝÔ§˙ç™Ï˙Ŭ #œĠüûóú˙˙üö˙˙5“œŬüó˙Í"İòŭú˙™Îġ˙ŝò˙˙˙˙˙˙˙˙˙˙*š˙˙˙¤!ŭúùñĤ# ˙û˙˙Í.í˙˙˙ñ˙û˙˙˙˙˙˙˙˙˙˙ü˙˙Ż3¤Ż1Á˙ġÑ.Ñ˙ÎĦ˙ŭÔ!ğ˙ûĤ›˙˙˙&!žŭ˙˙δ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—Òö˙ż·Ĵŝô·£˙ĝÑ ħÓ˙˙ħ ¤¤ˆ˘,ù˙˙˙˙˙˙˙˙ŝûÁ& ˘Çĝ˙Ï#Éü˙èŞ#£˙ò÷˙÷˙˙˙˙˙˙˙˙˙ûĤ1§êüú3˙öï-ċû÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ù˙˙ĝ£Ħžµ#§°ô÷˙ĝ˙û˙÷¨öŭö˙1"Ŭ˙˙¨˙ë˙üĥ Ĥ÷˙ùŝ˙ù˙˙˙˙˙˙˙˙ç˙˙÷˙ ×ĝ ó˙ŭŭ˙üü”ú˙- %˙˙ïùô$'˙ġ˙íÒ !ü˙úÔŸ÷˙˙ö'§˙ûŝû˙ü˙˙˙˙˙˙˙˙˙ŭù˙˙ŭ˙öÑ ˙ŝÍ÷˙˙Ö" ĝ˙ËħĜ˙˙˙Ą0Ì(˙ċ˙ü§ü˙ùó˙÷˙˙ñۍß˙˙ġ¸ŭ˙˙ú˙˙˙ô˙˙ÑÊ !ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ċĜœ#˙à˙ü˙˘ Öú˙ú¤"şÌ˙˙Ë'˙ĝù˙¤ %‘ò˙À*$ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ +ÓŻ % "Ĝċ˙Ï"Ôú˙“˙ú˙'ĴïġÓ/§÷˙˙úü˙˙˙˙˙˙˙˙öü˙˙˙Ĝ)£ô àŝî˙üùš˙˙ô˙˙˙˙˙˙˙˙˙˙üüó§Ĝ˙˙˙˙ó $ ›öŭĝà•'"Ÿ˙,˙˙è ü˙˙÷˙˙ù˙˙ŭöèÖ §áɢ.ŝ˙ΠÂ# , ž˙Ä˙–#"È˙˙ŭ˙ü˙üœ ! Ş˙˙Ĉ,ĦĝĈ"&˙ôú˙˙˙˙˙˙˙˙˙î˙ . ͝ş˙÷˙§( #˙ê) ˙ûï˙˙˙÷˙˙˙˙˙˙˙˙˙ï˙˙îù . $$˙ŝÔ'Ŭĝ° žû˙˙˘ !ÔìĈ°ûôÈ#$ ˜˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙+'!Ĵí#&ş˙˙ŭ˙Ô˙ΤÉüġùÑ% & ˙ô˙˙˙˙˙˙˙˙˙ü˙ŭ˙â$ĥ›˙ŭ˙ŭ˙˙˙úú˙˙˙˙˙˙˙˙÷° 'ü˙ŝ˘% ˙˙˙° •ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ˙úÄ  'Ë÷˙ŝŭ˙ġ#,›û˙˙Ċ˙˙Ì&$ì˙ĝù˙ŝ˙˙˙˙˙˙˙˙˙˙ó˙˙ä˙% / !ŭ˙$‡˙Öû˙ŭ˙˙›%ò˙Ÿ  “˙˙˙˙% Òô˙û*,Ċĥ" ü˙í&!!*ñĝ˙ù˙÷ŝ˙˙˙˙˙˙˙˙˙û˙˙÷˙¸)ù˙ó˙˙˙’&÷ĝÔĝ˙ë˙°˙Ĝ)' ˘ü˙˙Ë˙˙ŭ˙› ¨˙˙˜)Ĵò˙˙Ĉ" £˙ŭ˙ûü˙˙˙ġù#˙ÙÊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ù˙ĝĵ•Ĥ˙˙žĤ˙öÎß'˘ œžŭġ˙ü˙ôá #˘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû%Ë˙˙(œ˙˙ûĦĤ˙ŭä ˙îѧüö˙ü˙˙˙˙˙˙˙˙˙˙ûù˙ŭ)Ħ "Ħù˙˙™Ĵ"!û˙ŝ˙˙˙˙˙˙˙˙ŝü˙˙ž›ŭ˙ Ĥŭ˙• !“˙œ! ™ž&œ˙óü˙˙˙ġ˙ùĝ˙ù˙˙Ÿ$ ÷˙ú˙ § Ĝŭ˙Ÿ' û˙ùù˙÷⟜ݛޟö˙İ Ş˙È0Ñ˙˙û˙˙˙˙˙˙˙˙˙ñ˙Ê Ħİû˙ú˙ĝÍĦŸ”µ–Ĥö˙ŭ˙—–ú˙ĝ˙˙ûŭ˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ŝ %İŸ›˙˙ŭ£"$•ÏüÉü˙û˙ŭ˙˙$ $˙˙û˙Îù˙Ğ™œ³•˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÏĦĤ™İ˘ú˙Ğ’°Ħ˙˙ġ˙Á˙ŸšŞùŭ˙Ħ˘ ŭû˙ĝ˙Ö˘¤Öü˙û˙˙˙˙˙˙˙˙˙ö˙óö˙¤ $£žœÔŝŝ˙ŭ˙ҙµžĤÒü˙ú˙˙˙˙˙˙˙˙˙˙˙Ċ! "% Í˙é˙˙ްž˜İ×˙öĠöĤ™´Á˙÷ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙úü˙Ó ­Œ˙˙ŝúü˙˙ ü˙ö§û˙˙Ǩ!˜˙ĝô˙˙úĝ˙˙˙˙˙˙˙˙ŝ˙ŝ˙˙öœ'Ç˙˙ÌĦ˙ö˙˙˙˙ġ'$ÑĤĤĝÎĨ! Ò˙ñüĜ—2 Ó˙ĝ ˙ûùŭŭ˙˙˙˙˙˙˙˙˙˙û˙üö˙˙Ĉ§Ê˙ġ%˙û£ š˙ùò§ŭĝ¨$ê˙Ġ"Ôö˙Ê!ŸûÌĤ˙û˙˙ $ ˙ú˙˙ü˙˙˙˙ŭ˘" ĝ #˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙üù!% û˙Î'û˙˙ġ &%¨ŭô˙÷ž¤œÒ˙ü˙Ó $ ô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙ŭö˙ó¤" š˙¨Ñŭó˘, ÜġÔ"˙ŝ˙ĝ$"#*žú˙ŝ˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï£!ŭ˙ĝ˙˙™# 1 +È˙˙˙˙˙˙˙˙˙˙˙ŭ˙ô˙Ì+ Ġ˙ĝ,Ò˙˙ĈŸš˙˙ŭü¨#%Ä˙ġŭ˙ûú˙˙˙˙˙˙˙˙˙ôÈ*!™ü˙ö˙˙ô™ĥġÙ˙ïŝĠ$Êŭ˙îĠ¨"ù˙ù˙ĝ˙˙˙˙˙˙˙˙˙úŭ˙öÖÙöÊÎÛñ˙˙ïŬïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙ùö˙Â*Ÿžù˙˙˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ßöÓ˙Ò˙˙ŝ˙˙ŝñéò˙˙ŝòëò˙˙û˙˙ö˙ŝÓö²è˙˙ĝ˙˙ùÔÔñß˙ġ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙ĝŞ"À˙úŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Íßġ˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙ñ˙ÔúŬ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜÍÎË˙˙ú÷˙˙˙˙˙˙˙˙ĝ˙û˙Óŭ˙ùú˙Ù!˙÷˙˙ŝĠ  (ŭÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙ü˙û˙Ì÷˙ĝ˙˙•û˙ôû˙˙ó˙–.Ê÷ü"œÓŝŭûüÖ˘Í˙˙û˙ĵ5   )ŭ˙˙Ë/ 0 "˙ġ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ğ ")ò˙ù ×÷# .ş˙ ˙ö  $™˙˙ŝĴ! ,•ŭ˙œ2˘¨(ž˙˙˙˙˙˙˙˙˙ŭŝ˙ Ş˙!%œÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ü÷˙˙))¨Ë ˙ŭŭĞ­§Ĥ’ŭŝ÷˙˙ŜÀ….$ġ˙˙é˙ŝ˙é˙Íô˙öġ˙ĝ˙˙!çòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙ö˙ûŭ˙ùü˙˙˙˙ó·ÉïŬöĠö˙ŝšĤ˘°³˙û˙˙öÄŞ¤¤à"2“î˙úó˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙èĠ£™´Â˙ú˙ĝŭ˙ŭô˙ûĠżĵ˙˙ŭ˙˙˙˙˙˙˙˙ŝù˙ô˙˙­–˙í˙˙ïĴŻğ˙˙˙˙ò˙ò˙ŭ˙˙˙˙ö˙˙„¸Ÿü˙ĝ˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙ñŝ˙é˙ù˙˙˙ŝ˙˙˙Öë˙ġ˙˙˙ġ˙ü˙˙ô˙÷˙ñ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙öù˙˙˙˙˙˙˙˙ûûùü˙˙ŝü˙˙˙˙˙˙˙˙˙ù˙˙˙˙úì˙ŝ˙Ùó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ñ˙í˙ŭ˙˙˙˙˙úöú˙˙˙ùġú˙˙ŭ˙˙ö˙˙ï˙çì˙˙˙ûŭ˙˙ùĝ˙ö˙ú˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷òöŝŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙ŭñ˙˙ò˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŭ˙˙ŝûŝ˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙ŭ˙ġ˙ö˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙ġ˙ú˙û˙˙˙˙˙˙˙˙˙˙˙ÄÖ˙ĝ˙ŝ˙ü˙˙ŝ‘ݠް˙úüü˙ùĊİКи´˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ö˙ŝ˙ŝ˙ŝœ½˙ŝü˙îפ Ö˙˙˙˙˙ùù˙˙İĤ¸˙˙úû˙ñ˙˙ŭ˙ûŭúô˙úŭ˙úô˙˙âßĴžÖ˙è˙ŝŝĝż²žŞž­Ĵ˙ŭú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ÁĞ­ž˙ŭ˙û& ¤½˙÷ŞÑŝ˙ә­ÀĊ˙ĠĦ²—Ë˙˙˙ìġÌ! * ²˙í÷˙§,&ŒÎ˙˙˙˙˙˙˙˙˙÷ŝŝŭÍĥò˙ÎĤ›˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ġŭ˙í˙÷˙÷ŭŝ˙ù˙ù˙ġòŝàùŝ˙˙˙÷û˙ó˙˙ùĜúġ˙÷ġ˙Üû˙˙ù˙˙˙üÖĤôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙÷úŭĉ˙˙ç˙üüġ˙˙íÙġü÷˙ñŝ˙ĝ˙ŝ˙˙˙ô˙˙ùŭ˙üî˙ù˙˙Ëŭ˙˙÷ŭ˙ó˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙üŭ˙˙ü˙˙˙ŝóáû˙˙ü÷÷˙ûô˙˙˙˙˙˙˙˙˙ŝŝö˙˙ŭ˙ûû˙ġ˙ôû˙ŝüñ˙˙üî˙˙ï˙˙ôöûóġ˙ù˙ôĝ˙˙˙ü˙˙üġ˙˙˙˙˙˙˙˙˙üĝġ˙ŭ˙˙ĝ˙ŭû˙˙ŭù˙ŭ˙˙˙÷˙˙˙˙ŭíü˙ó˙˙˙˙˙ŭôúûê˙˙˙˙˙˙˙˙ŭ˙˙ü˙˙˙ŝ˙˙˙ûĝùŝ˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙ï˙ĝíŝ˙˙üü˙˙ĝŭ÷ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙ûŭ˙ŝü˙˙˙˙ûŝŝû˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝúĝû˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭó˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ü˙ŭ˙ŝ˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙÷˙˙ê˙˙˙˙˙˙˙˙˙÷˙˙˙˙ò˙˙ŝŝ˙˙˙˙˙ú˙˙˙˙ü˙˙˙ö˙÷ò˙˙û˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙û˙ú˙ŭú˙ĝ˙˙˙÷˙ŝî˙üüŭ˙˙˙˙ŭ˙ûùŝ˙˙˙˙˙˙˙ï˙˙íùôöŝ˙˙ó˙˙ú˙˙ü˙˙˙ŭò˙˙ŝ˙˙ĝ˙ü˙˙˙ĝú˙˙˙˙˙ùĝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óüüó˙˙û˙ïü˙÷ŭ˙˙÷ĝ˙˙˙˙˙ù˙ôù˙˙Ŝ˙˙üòŭŭò˙ï˙ò˙˙ĝÁ˙ü˙˙ĝ˙˙ó˙î˙”’˙˙ĝ˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ìë˙ó˙ì˙ġ˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ô˙˙ì˙˙˙˙í˙˙ó˙˙û˙˙ùŝ˙ú˙ùŝ˙˙˙˙˙˙öû˙ġ˙ŝ˙òü˙òŝŝ÷˙ŝòùĝ%$ŝ˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭŭ˙˙÷˙ĝ˙˙÷˙˙˙˙÷û˙ŝúü˙˙ŭ˙ù˙öŭ˙öúŝ˙ûŭú˙ú˙˙ĝûŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙ĝ˙óŝ˙ó˙˙üŝ˙˙˙˙˙˙ŭġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üù˙ù˙˙ö˙ù˙÷˙˙˙ó˙÷˙ùüûó˙ùë˙˙˙˙˙ïñ˙÷˙ĝĝ÷ŭ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙ŝ˙òí˙ûġŭ˙˙ĝĝ˙˙ŭ˙ĝ˙ô˙ġ˙˙˙˙˙˙˙˙öú˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙˙ġùüŝŭûû˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ġŭŭ˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ú˙û˙ü˙üûŝ˙˙˙ŭü˙˙˙ŝŝŝŝ˙ĝ˙˙ùü˙ù˙ĝôŝ˙˙ŝ˙ĝŭ÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ŭùöŭúŝ˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ü˙ġ˙ġ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ö˙ġ˙ġ˙û˙˙˙˙˙˙˙˙˙ú˙ġë˙˙ñ˙ŝŝ˙ùŭ˙˙˙÷˙î˙˙ŝúŝ˙ĝ˙˙ùö˙ŝ˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙óŭ˙ô˙˙úŝ˙ĝ˙˙ú˙˙üûŝ˙ŭ˙˙˙ö˙˙úú˙ù˙ó˙üġ˙˙˙ġ˙˙ùĝöŭö˙˙óö˙ĝ˙÷û˙öí˙˙˙˙÷˙ô˙ŭ˙ù˙ó˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúŝ˙˙˙˙üû˙˙ç÷˙ûúñ˙˙û÷˙˙˙Êŝŭúŝ˙˙˙˙˙˙ŝ˙˙ĝû˙ĝ˙˙û˙˙˙ġŭöĝ˙˙ùú˙˙˙ùï˙û˙˙˙˙˙˙˙˙í˙˙ï˙˙˙˙â˙ĝ˙÷˙˙ó˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙öêü˙˙ŭ˙˙˙˙˙˙ŭ˙˙ŝú˙˙˙ôó˙ŝú˙˙úö˙ùŭñ˙ü˙˙˙úĝ˙ô˙˙²óŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙öġù˙ú˙ġ˙˙ĝġ˙˙˙ĝŭô˙ŝù˙˙˙üŭŭû˙ùĝ˙˙˙˙˙˙˙˙ûúĝ˙˙ĉ˙à÷ŭ˙˙˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙÷ü˙˙˙˙ŝŭüú˙˙ô˙ŭ˙ö˙ûù˙˙˙˙˙˙˙˙úŭŭ˙˙û˙ġ÷ü˙ŭô˙˙÷û˙˙˙ó˙˙˙ú˙˙˙˙˙ë˙òŭ˙˙ò˙ì˙üû˙˙ù˙˙˙˙˙˙˙˙˙˙˙ĝùû˙˙˙˙ŝ˙˙˙úû˙˙üŝŝü˙˙˙û˙˙ĝ˙÷ĝ˙ú˙˙˙ŭöûĝö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭüûü˙˙˙˙˙˙˙˙˙˙˙úú˙ŭĝ˙˙ĝ˙˙ĝóŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝŭ˙˙˙ŝ˙üŝ˙˙ŝŝŭüŭŝ˙ŝüûŭ˙ŭ÷˙˙û˙ú˙˙˙˙˙˙˙ŝú˙˙÷˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŭŝ˙˙˙˙˙üö˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙û˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙ôġ˙ŭ˙˙˙˙˙˙˙˙˙û˙˙˙˙˙ŝ˙ŝ˙˙û˙÷û˙ĝûŭ˙ŝ˙˙˙˙ö˙˙ĝŝŝŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙öü˙ŝûü˙ŭù˙˙ĝö˙û˙˙˙ŝ˙˙ŭúú˙ŝġĝ˙˙ĝü˙ô˙˙è˙ù˙÷òŝ˙˙˙˙˙˙˙˙˙˙˙ö˙˙ŝ˙˙˙˙ŝ˙û˙ġ˙ûûŝ˙˙ĝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙˙˙˙ŭ˙˙˙ġò˙˙˙û˙˙ŝĝ˙˙ù˙˙ûüüŭ˙ŝö˙à˙˙ŝĝö˙ġ˙ó˙ù˙ú˙˙ëñ˙˙ù˙ġġ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙ù˙ċŭöĝ˙ŝ˙ùü˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ûó˙ú˙˙üúûôŭî˙ŭ˙üü˙ŭûúîû˙˙˙üü˙úö˙é˙ü˙÷˙ùô˙˙ĝġ˙üÊ$ ü˙ŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙ŝ˙ò˙˙˙ŭ˙ü˙˙ûóùü˙˙˙˙ŭ˙˙ŭ˙˙ŭ˙˙˙ŭ˙˙ò˙üî˙˙ü˙˙ñ˙˙ô˙˙˙ùö˙˙˙ŭö˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙ñô˙ú˙˙òùûŭ˙˙˙˙˙ù˙ŝ˙ú˙ü˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙ŝ˙ġö˙˙ŝ˙˙˙ĝ˙˙üöŭ˙˙üú˙ġô˙˙˙ù˙ë˙ĝ˙ĝ˙ûû˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ñ˙öôú˙˙˙üú˙üŭ˙˙ü˙˙ùû˙˙˙˙úŝ÷ü˙˙˙ŭö˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙úü˙˙üùúŭŝŭú˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙ŝ˙˙ü˙˙ĝíü˙˙ùŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙ù˙ŭ˙˙˙ŭŭŝŭ˙˙ŝ˙ŝüŝ˙˙ŝŭ˙ú˙û˙ü˙˙ŭû˙˙ŝ˙˙ú˙ù˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙÷òû˙˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝŝ˙ñù˙úĝ˙˙˙˙˙˙˙˙˙˙ġ˙˙ġŝ˙÷˙ŝ˙˙ŭ˙ú˙˙ï˙ŝŝŭ˙ŝġ˙ŝĝ˙˙üŭŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙û˙˙ŝ˙˙ŝ˙˙˙ġ˙˙ó˙˙˙˙˙ü˙˙˙÷ü˙ŭú˙˙˙˙˙÷˙ñü˙˙˙˙˙ôŭ˙ŭŭ˙û˙ŝŝ˙˙ñûí˙˙ùŭĝġĝ˙˙ù˙˙˙û˙˙ŭ˙ġ˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙ŝù˙ŝ˙ñĝñĝ˙˙˙ĝüŝ˙˙ġĝ˙˙˙ñ÷˙ŝŝ˙ù˙û˙˙ùè˙˙˙ú˙˙˙ŝúö˙÷ô˙˙ì˙ĝ˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙ġû÷ù˙˙˙ŭŝü˙˙ë˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙˙íŭùŝ˙˙˙˙öú˙˙˙ù˙˙˙˙˙˙üüŝŝüù˙ŝûú˙ĝ˙˙˙˙˙ïö˙öüú˙Ċ×˙˙˙ô˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙ŝ˙î˙˙ù˙˙úĝ˙˙˙˙˙úŭûŝ˙ü˙˙˙ŝù˙˙˙ûú˙÷˙ŝŝ˙˙˙˙˙ñ˙û˙ùö˙˙˙ùôĝ˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙ŭ˙úó˙˙˙˙ĝó÷˙˙ûû˙ü˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙úùüúŝï˙˙˙î˙ú˙˙ûö˙˙˙ü˙˙˙˙˙˙˙˙ò˙ú˙˙ö˙ĝ˙ŝĝĝ˙˙üĝû˙˙˙˙˙˙˙˙ûû˙˙˙˙÷˙˙˙˙˙ûòú˙˙ŝùüúüû˙˙˙˙úĝŝ˙ü˙ŭûüûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúŝ˙˙ŭŝ˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙üĝŝ˙˙ôù˙˙˙˙ŝ˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ü˙ù˙ŭ˙˙ŝü˙˙ŝ˙ŭŭ˙˙ŝŝ˙˙˙ġ˙û˙ĝ˙ùŝ˙ûû˙˙˙ŝŭù˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝùù˙˙˙˙úö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ûŝŝ˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙ô˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙˙˙˙˙ŝûŝ÷˙˙ûġ˙ŝ˙˙ŝúó˙˙˙ŝ˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙ŝúüü˙ġ˙ŝ˙ü˙˙ĝ˙˙ûú˙˙˙ŭ˙˙ŝú˙˙ùóĝŭû˙˙ò˙òŭúŝ˙ûô˙û˙˙ġöŝ˙˙˙˙úóû˙˙˙˙˙ŭö˙úûù˙˙ö˙ŝ˙úĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙˙˙˙˙˙˙˙˙ŝûú˙˙˙˙ú˙˙˙ïû˙ŭŭ˙˙˙úŝ˙ŝ˙ì˙˙ŝû˙ö˙üúó˙˙˙˙˙ŝü˙˙˙óŝûñù˙ŝ˙˙˙˙˙˙˙˙ùö˙˙˙óŭ˙˙˙˙üù˙˙ŭ˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù˙ŝĝ˙˙ú˙ñ˙úĝ˙úüû˙˙˙˙ó˙ûú˙˙ŝ˙˙˙ĝ˙ú˙˙ü˙ùûù˙˙ġ˙˙ŝ˙ġ˙˙˙ì˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙ŭ˙ŝ˙ŝ÷˙úû˙ŝġ˙˙óü˙˙ú˙˙ĝû˙˙˙ŭ˙ġ˙ŝŝ˙˙ŭü˙ġú˙úü˙û˙ġ˙˙÷˙˙ŝ˙˙˙ô˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙ŭŝ˙˙˙ûĝ˙˙˙˙˙ûŝ˙ŭŝ˙˙ŭûü˙˙˙˙˙˙˙˙ùú˙ŭ˙˙ú˙˙ŝĝû˙˙û˙ô˙ŭ˙ĝ˙ĝ˙û˙˙ñ˙˙ì˙ú˙ô˙ĝû˙˙÷˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙˙ü˙ĝûüûü˙˙˙ŝ˙˙û˙û˙ü˙˙üò˙˙ĝ˙˙ŭû˙˙ŝ˙˙ù˙˙˙˙˙˙˙˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙ŝüúúû˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙˙ŝĝ˙˙˙ŝ˙ĝŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŭ˙˙ŭ˙ŝúü˙˙ü˙úû˙˙ŝûŭù˙ñ˙˙˙ü˙˙˙˙˙˙˙ŭ˙˙ŝŝ˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝû˙˙ô˙˙ù˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙ú˙÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙ó˙÷ĝ÷˙ù˙˙˙˙˙˙˙˙ù˙˙˙ûĝ˙÷ü˙˙ú˙ù˙ûú˙ŝú˙˙˙˙˙ó˙˙ù˙ŭŝ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙öü˙ŝ˙ŝŭ˙ö˙˙ŭŝü˙˙ŭ˙˙˙ûŭ˙ŭŭ˙ŝù˙˙˙ŭ˙ù˙˙÷ú˙˙˙˙öú˙˙ü˙ĝ˙˙˙ü˙ĝüô˙˙óüŭŝü˙˙ŝü˙˙ŝ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝü˙÷˙˙ù˙ûú˙˙÷ŝùŝ˙ûŭ˙˙üŭ÷˙ôò˙ú˙ġ˙˙˙ü˙ü˙ŝ˙˙˙˙˙ö˙öû˙ŭü˙ŭŝù˙˙˙ùŝŝ˙˙˙˙˙˙˙˙˙ŭ˙÷˙û˙ġ˙ñ˙˙˙ô˙ĝ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙ú˙˙˙ûüö˙˙ùŭ˙˙ŭ˙ô˙ü˙˙ú˙ñ˙ù˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭñ˙û˙ñû˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üúŭ˙˙üü˙˙˙ĝû˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüú˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙úúö˙ġŝû˙˙˙ŝû˙û˙˙˙˙˙˙˙˙ü˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙ġ˙ûüû˙ŭù˙˙ŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ö˙ú˙˙ĝŭ˙ŝü˙˙ŝ˙ûú˙˙˙˙˙ŭù˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ï˙˙ġ˙˙˙üġ˙ù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷˙˙˙öü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ö˙˙ó˙öù˙û˙˙ùúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙÷ĝ˙÷˙ŭ˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙ŝú˙˙˙ġ˙ù˙ĝŝ˙ŝ˙ŭ˙˙öû˙˙ŭûú˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙ô˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŝ˙ò˙óü˙˙ñ˙ù÷˙öú˙˙ġ˙˙÷˙˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úñ˙ŭ˙˙˙˙˙˙˙úî˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŭ˙˙ĝñü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙î˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŭ˙í˙Ïĝ˙ĉŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ö˙˙˙˙˙˙˙˙ŭ˙ü˙üĝ˙˙ùÈöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ñ˙ú˙ġ˙˙˙˙˙üùùü˙ü˙˙üíŝ˙ÖÊû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ö˙ü˙ġŝ˙˙˙˙˙û˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭö˙˙ŝ˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óú˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ñŭ˙˙˙ŝ˙ġù˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ûŝ˙ċ˙˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙üúŝĝ˙ĝ˙˙ûŝ˙˙úŝ÷óúü˙ú˙ï˙ŭ˙˙ùĝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭï˙˙ùö˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŝü˙˙öŝúóŭ˙ó˙óò˙˙ò˙˙ö˙˙ŝ˙ŝî˙˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭñ˙û˙öĝ˙îĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭôû˙˙˙üùûúó˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ò˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙§¤Ĉ˙˙üû˙ŝ˙˙˙˙˙˙˙˙˙ô˙÷ÓĤ™˙˙˙˙˙˙˙˙˙˙˙ù˙ö˙˙ŭ˙Ĉ*Ÿ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙üùö×˙î˙ŭ÷˙˙˙˙˙ò˙˙á˙˙"˙êñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝ˙ŭĊÁñŝô˙˙ŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŝûŭ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙÷ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷˙ï˙˙ì˙˙÷úŝŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ï˙ĝ˙˙˙˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙ü˙˙˙ĝ˙ŭúĝùú˙˙˙˙˙˙˙˙˙ìú˙˙ú˙˙˙˙˙ŭġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ŝü˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òĝùŝù˙˙˙˙˙ù÷˙ŭ˙ù˙˙ù˙˙ġú˙ŭüûñû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úġ˙˙˙÷˙Ï˙ŭ˙˙˙˙Ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙úü˙ŝ˙˙˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úÓĦĜúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ$ '‹˙ùŭ˙ŝù˙˙˙˙˙˙˙˙˙ö˙9˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙öœ ' ù˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝó÷˙ĤÛ˙˙÷˙˙÷˙˙˙í˙˙Í""˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙"2ġ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙üÏĠĊÓÓ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûö÷ÔÉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙÷˙˙â˙ù˙ĝ˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙˙û˙ċ˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŝó˙û˙úŝ˙˙˙ò˙˙öĝ˙ŭ˙ò˙ŝ˙ñóû˙˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ġû˙êú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙û˙ŭ˙ÖñÚŝ˙ñ˙˙òúŝŭó˙˙ŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ŞĴŸĤ÷ô˙ú˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ĉ£Ó˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ÿ ĦĠ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûï"*ġ˙˙üù˙˙˙˙˙˙˙˙˙ë˙Ĥ÷˙˙˙˙˙˙˙˙÷˙û˙ŝùà+ ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“,ú˙ûŝûö˙ü˙ĝ˙˙À% ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúġò+˙÷˙˙ùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïœ& Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ï² !ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ö˙ì˙îŝĝÑ÷üûñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˜ Ċ˙ôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙ü˙íŭóĤğ˙ö˙ŝùüŝŭ˙˙ġ˙ŝÈ˙Ôá˙˙˙÷ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öòöâî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙܃ġ˙ġĝ˙ü˙ùü˙ġ˙˙˙ĠÊĜáü÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙½Ħ!Üŭġñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙÷ġ˙Ğ+ İŝÎö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í#(“˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙.òÖ¨ ü˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙“)Ĝ˙˙˙˙˙˙˙˙ú˙ù˙˙ŝñú˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïü˙ $/í˙ŭ˙˙ŭ˙˙êö˙ú˙ $˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙%˙îŭ˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éÓĞ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÒ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙ö÷Ħ#&2•˙˙ġĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û&"'ûéô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙ŭ˙³,ô˙üù˙˙˙˙úĝ˙•œ(.Éġ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŸ° !ÀË˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùê8 !Ô˙˙ùú˙˙ŭ˙˙ĝ˙ž1ú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĉ./Á ˙ŭ˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙òéòĤ &˙ŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ó ,“ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î,˙ñÍ1ë˙ù˙˙ò˙˙˙˙˙˙˙˙ú˙  ö˙˙˙˙˙˙˙˙˙ŝŝŝ˙˙˙Ħ)Ô˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ċŞ ï˙˙˙ŭùïäù˙˙˙ŭñÒÑ$É˙˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷î˙˙! ŝ˙ŭò˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙! &–˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ëü˙ &ïú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ù&İúòĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙÷˙ê& ˙˙üùŝúġ˙˙˙Ôĝù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¸Ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ Óŝö˙üü˙ŭ˙ú˙ù ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˘ •ü˙˙ĦÊ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙óûߑ˘˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›­•ž×˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¨üŜŭ˙˙ë˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙ì˙ܝ”Ü˙˙˙˙˙˙˙˙˙˙ô˙û˙ûüŝÇÔ˙ù˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ñó˙˙˙˙ŝŭ˙˙˙öŬŭ˙ŭĝ˙˙÷Ö ˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝÔ£Óŝó˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝñ¤Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÎÑ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ż×Ÿ!˙ó˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ!£˙˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙˙˙÷İ %˙üĝ˙˙ú˙˙úû˙ËÜ˙ĝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ )˜˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ġ˙÷ŝ! #óŭ˙÷˙˙ûŭ˙ñŭ§&# ˙˙ü˙úüö˙ŭ˙ĝ˙ï˙˙òŝ˙ú˙ü˙˙úú˙˙ì˙˙ô˙˙ö˙˙˙˙˙˙˙˙˙î˙ĝö˙úŭŝ˙˙ï˙˙˙ŭ˙û˙ŭġ˙ġ˙˙˙ú˙˙˙ùŭö&'˙ñ˙ĝÎ "˙˙˙˙û˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝù˙ü˙ŭ˙ô˙˙ŭú˙˙˙ĝ÷˙ù˙ĝ˙ĝ˙˙ŭ˙û˙ñŝ˙ĝ÷˙˙ö˙ü˙˙ò˙ûú˙ŝ˙˙ü˙ŝ˙ü˙ó˙˙˙üĝ˙˙ô˙ò˙˙˙˙˙˙˙˙˙˙û˙öŝ˙ïü˙˙˙÷ù˙˙˙˙üü˙ŭû˙˙˙˙ûòġ˙˙Ñ˙ġ˙˙˙ô˙˙ĝ˙ï˙ĝüü˙î˙ú˙ŝ˙ùŭ˙ġ˙˙ŭ˙úú˙˙ú˙ô˙ü˙˙˙˙ù˙˙˙ô˙˙ŭ÷˙˙˙˙ñ˙˙ġ˙˙úú˙˙ü˙ŝï˙üûŭ˙˙ê˙ĝ!ċġŝ˙ŭ˙˙ù˙˙ü˙ĝ˙˙˙˙˙˙˙˙˙˙÷ö˙ŭŝ˙ŭú˙˙ûŝ˙ġŭ˙ù˙˙ú˙˙ĝ˙˙˙ŭ˙˙˙˙˙ú˙úö˙˙ŭú˙˙ŭ˙˙ô˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝŭ˙ú˙ĝ˙üŭŭ˙˙˙û˙˙÷˙˙òú˙˙üŝ÷ŭ˙ü˙˙ĝ˙ù›¤ŝ˙ùŝ˙˙ĝÑ ˙˙ó˙û˙úù˙˙˙û˙˙˙˙˙˙˙˙˙ï˙˙÷˙ÒÉ˙ù˙÷˙˙ôĞĤŭ˙ü˙÷˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŭùú˙úŝü˙˙ġ˙üĝġ˙û˙ù˙ûŝ˙ñ˙ûŭ˙ó˙û˙˙ìŝŝŭüò˙É ¤˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝŭÏŝ˙˙ŭ˙úŝ˙ôĝ˙û˙˙÷˙üóŭ˙˙˙˙˙˙˙˙û˙˙ŝ˙ù˙˙˙ŝŝüô˙ú˙û˙˙˙üôú˙˙û˙˙˙˙ôŝ˙˙˙ô˙ô˙˙˙ŝŭ˙ŝ˙˙ó˙ö˙˙˙˙ŭ˙˙÷˙˙ñ˙™öçô˙û˙úĝ˙ùŭ˙˙˙ĝ˙ó˙ŝ˙ŭ˙üġ˙÷˙úü˙óú˙üĝü˙ó˙˙ùüŝ˙û˙÷˙ŝ˙ù×˙œ! ’˙˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙ŭ˙ûĝ÷% ˙˙˙ŭó˙ŝ˙˙üü˙Ĝó˙üŭ˙úŝŭ˙˙˙ü˙˙ù˙˙öŝ˙˙˙˙ú˙û˙ö˙˙•$˜˙˙û˙˙ŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ù˙ŭûÂ$–˙˙ö˙ġ˙˙ûŝ˙˙Á“ Ú˙˙ġ˙ü˙˙˙ġ˙˙˙˙óĝ˙˙˙˙ôüö˙ü˙ü÷˙òò˙˙˙˙˙˙˙˙˙˙˙ŝôñ˙ú˙üûî˙ŝ˙˙éú˙ù˙üĝú˙˙÷ŝ˙ùì˙ŭ˙Ú—÷˙˙˙Ŭ#ŭ˙ö˙˙ĝŝ˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙ĝù˙ûö˙÷ü˙÷÷û˙˙˙èü˙÷˙˙ö˙ù˙ùî˙˙˙ü˙˙ò˙˙˙ŭ˙˙÷˙ü˙î˙˙ò˙˙˙óŝù˙˙ù˙˙˙ç˙˙úġô˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙úûŭ˙ŭ˙ŭ˙óó˙˙˙˙î˙˙ñŝû˙ŝ˙˙á˙˙ù˙ġ˙ĝ˙üú˙ñ˙÷˙˙ŝï˙ë˙˙˙ö˙˙˙ü÷˙ñ˙˙˙ĉ˙˙˙í˙ï˙ġ˙÷ü˙û˙ĝó˙˙ûç˙ġ˙ùüŭé˙˙˙÷òñù˙˙˙˙˙ùó÷˙˙ŝ "´˙˙ûĝ˙ï˙ŭêö˙î˙˙ĝ˙ŝö˙û÷ŝú˙ûí˙ü˙÷˙ï˙˙˙˙˙ŝ÷˙˙ëúÖñ˙ùò˙˙ġìİ!˙ĉ˙ïù˙êë˙˙ö˙˙ñô˙˙ü÷˙˙˙˙˙˙˙˙˙ŝ˙ô˙˙í˙˙ĝ˙ê˙ò˙ûúġ˙òŝò˙î˙˙˙û˙˙˙ŭùŭ˙˙Ĝ! Ä˙˙˙ĝ˙˙˙î˙˙˙÷˙ŝ˙˙˙ï˙˙˙˙˙˙˙˙˙÷˙˙ò˙ĝú˙ŭû÷˙˙˙­ Ì˙˙ĝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ġ˙˙ŝĝ˙ŭñ˙û˙÷˙˙˙ŭŝġ÷˙ò˙˙ô˙˙ñŝ˙˙˙ġ˙˙ŭú˙˙˙Ĉ§" ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üö˙ġ˙˙ŭ˙˙ò˙˙ö˙ŭŭ˙û˙ĝü˙˙˙˙˙˙˙˙˙˙˙ü˙ġ˙˙ì˙ó˙îŭ˙˙˙˙ú˙òü˙ú˙˙ŭ˙÷û˙ċ˙˙˙˙öġ˙˙ôŝ˙˙˙ŝü˙÷˙ü÷ŝùù˙ùú˙ĉú˙ŝŝġŸ˙ôŭ˙˙˙˙ŭ˙˙î˙ĝü˙˙˙ġû˙˙˙˙üù˙˙˙ô˙˙êĝ˙˙û˙ŭ÷˙ŝ˙ŝû˙˙ò÷˙öú˙˘ŭ˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙˙ô˙˙˙˙˙ġ˙˙ï˙˙ú˙úâ˙ )ôö˙ŝüû˙˙˙óù˙˙í˙˙ú˙˙ùô˙ùŭ˙ú˙û˙ġÀŭ˙ŝŝ˙˙˙ŝ÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙úù˙˙ĝú˙˙ġ˙˙˙üöĠ˙1˙â˙˙˙ŭ˙úŭû˙ûó˙˙˙˙ĝ÷ç˙˙˙ô˙üúû˙˙ü˙˙˙ù˙˙˙˙˙˙˙˙˙˙ü˙˙÷ŭ˙˙ü˙ôê˙˙ŭô˙ŝüßù˙˙˙î˙˙ŝĝ˙˙Ħ )´ñ˙˙‡#Ĥ÷Ûç˙ŭû˙˙ûúŝ˙˙˙˙˙˙˙˙ï˙˙˙˙˙ġ˙˙ŝ˙˙˙ŝ˙û˙ú˙˙öġ˙˙ô˙ŝ˙˙˙ú÷˙˙˙ïú˙˙˙˙ŝü˙˙˙ï˙˙ù˙ì˙˙˙ĝ˙˙ġî˙˙ĝû˙˙˙˙˙ô÷˙˙˙˙˙˙˙˙˙ê˙ùïó˙˙ü˙íŝ˙ù˙˙ŭ˙î˙˙úĜ˙˙üŝ˙î÷˙˙úï˙˙ïû˙û˙˙ŭùĜ˙ë˙˙î˙˙ċŝ˙ü˙˙î˙˙ŝĝò˙˙˙ûì˙˙˙˙ġ˙˙Ï˙˙ŭŝ˙ŭĝ˙ĝ÷˙˙˙û˙÷û˙úĝ˙˙ŭĝ˙úó˙˙˙ĝ˙àá 1ö÷ĝ˙˙ûó˙˙ŝĝ˙úġö˙˙˙˙ŝ˙˙˙ó˙˙ûŝ˙˙˙÷˙˙ŝó÷ĝ˙˙ŭ˙ü˙˙ùġ˙ü˙˙úĜ ´ûè˙˙í˙˙÷˙ġ˙ġ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙òùï˙˙˙ñü˙˙ŭ˙˙ù˙ŝ˙˙ŝüŝ˙íŝ˙ó˙ñùŝŝ˙˙˙ìóĞ˙˙óĝ˙˙˙ ˙˙ŭü˙ï˙íï˙˙˙˙˙˙˙˙˙˙˙úñ˙ú˙˙î˙˙ö˙˙Ä˙î˙˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙÷÷ü˙ïÈ˙ŭÈ˙ùïùô˙˙˙˙ú˙ü˙ŭ˙ü˙ï˙ü˙üü÷˙÷˙ñö÷˙˘›˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙ù˙íó˙ü˙ĝù˙˙÷ŭ˙ŝ˙˙ïïŝô˙˙˙˙˙˙˙˙˙ô˙ŭŝ˙˙ŝ÷˙˙ôġó˙÷ĝ˙˙ĝ˙˙ĝñ˙˙ó˙ö÷˙˙˙˙üŝ˙Ëê˙ŝ˙˙ŝ˙ë˙˙ú˙ŝ˙ö˙ŭ˙˙ç˙üġ˙˙˙˙˙üù˙ç˙˙ì˙û˙˙öûĝ˙ĝġĝë˙˙˙˙î˙˙ŝô˙üï˙˙˙Ĝ˙˙òóúü˙˙ŝ˙˙˙˙˙“û˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙˙ù˙˙ġ"ùûó˙öï˙ŭ˙ö˙˙˙• Ùùô˙˙ûûù˙˙üû˙˙˙ġò˙óġ˙öŝ˙˙˙ìû˙ëú˙é °ĝŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ù˙Ú*ùĝ˙óĝĝ˙ġí˙˙˙ù ˙˙ùŭùóô˙˙ĝ˙ŭû˙ú÷˙ĝ˙˙ú˙˙ï˙˙ô˙˙ġ˙ġ˙˙˙˙˙˙˙˙˙ïü÷˙˙˙ô˙˙ô˙˙÷˙ê˙˙ûúû˙ôĝŝ˙ßġ÷÷˙ö˙˙˙ù˙/˙ò˙ù˙ŝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙ŭġôü˙ŭ˙úü˙˙îŭŭô˙íî˙˙˙ñ˙˙ğ˙íèÖ˙ò˙˙˙˙ùöù˙˙ÎÇ˙˙÷˙ï˙˙˙ö˙˙ï˙Ò˙ö˙ù˙ĝô˙˙é˙˙˙˙˙˙˙˙˙˙÷üì˙˙˙˙î˙ù˙$˙ñ˙ò˙˙Ĵ#–×˙˙˙ô˙ö˙î˙˙ü˙˙ñ˙ù˙˙üŝġ˙˙˙˙ô˙ù˙ùĝúĝ˙ŝöŭ˙˙˙óö˙#ú˙ô˙œê˙ó˙ŝ˙˙ûú˙˙û˙î˙˙ï˙ô˙˙ùûŝ˙˙úŭŝŭù˙Íċ ˙˙ĝ˙ËÚÑÏğÒʞÉêĊÍŭ˙÷î˙öġÖÒÄ˙üĝ˙ĜıÖ­Ö­ÊÑĈÔÍΒŬÏ˙˙ġċ˙œšÓÔÖ÷˙ùÖĊÈĠ™Ĝ˽ŝ˙˙üù˙˙˙˙˙˙˙˙˙˙˙ $Ïĝ  š˙Ô"µ˙üüÏÎ(Ë˙ó˙ħ$ÈÊ˙˙Ô !!  ˙˙ñŝ˙˙˙˙˙˙˙˙˙˙ŭ˙ùÊÌÙï˙ü˙ĝ˘˙ÔÒ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝÌ'§ĞĤŸ¸˙˙˙˙˙˙ ÄÖ  İ˙˙˙˙˙î˙ĝí˙˙˙˙ûİ"§˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ó˙˙ì÷˙ú˙˙Ċ· Ü˙˙ĉ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ĉÜÓĤ š˙˙ÂÖ¤Ëŝü˙˙ġç˙ÎÊÖÚÏ˙˙úò˙˙ûÖٛĥğüŭĵӓ¸˙˙˙˙ó˙˙ò˙ùĠ˙ŭġ×˙˙˙ŝġ˙û˙•ĈĠ§Ĉóĝú˙˙˙û˙Ĉ˙úó˙ÇÚŭŭŭ˙˙ŭ÷˙û˙üúñŭ˙˙˙˙çû˙ôŭûû˙³‘Í˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙û˙ŭ˙ ˙ŝ˙ŭŭ˙ĝüü˙îŭÇ& Ä˙ĝ˙÷˙úĉë˙˙˙ŝĝ˙ë˙ŝö˙ċ˙˙ŭŭ˙˙˙˙˙ùÄ+üŭ˙ŝ÷˙ö˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭ˙ü˙½ Û˙˙ú˙˙ġĝ˙˙˙ùġ˙á˙˙˙˙˙ŝŭ˙÷˙ú˙ŭó˙˙˙˙ï˙öĝ˙ŻžĤü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŭÙÊóĉ˙˙˙˙ĝ÷˙§  ,£żú˙ü˙˙ŭÍ!˙ŭ˙ü )'–Î˙˙üŭŭ˙ŝ˙˙˙˙˙˙˙˙üŝï˙öÔùÌó˙î˙ó˙˙ŭÖ˙ġ˙˙ó˙˙ĝüÓûÑç÷ò˙ú˙˙˙˙˙ÒĝŭÉ˙˙˙í˙˙˙˙ĊĊŝ˙˙ŝĜÓüú˙˙ô˙˙˙˙˙˙˙˙˙˙û ™¨û”,ÌûŞ §(œ˙êŝ˙˙˙½#‹+šÒ˙˙Ž.œ Żŭ§³–Ùç˙˙ΕĦ£˙ü³˜'(Š""÷˙ĝ˙ûù˙ù§ ¨ Ĵ#ı˙˙˙óü˙˙˙ô˙û×˙˙úû/ĥò˙˙ñ&˙˙úŻ& #'"–ê˙˙' ™˙Ê˙•#((É˙ò˙˙˙˙˙˙˙˙˙˙÷úü"Î˙'.ĝ™ù˙˙" Ç˙˙É!,#²í˙"- ›ò˙÷˙˙˙˙˙˙˙˙˙ôûÙ1  ŭġ˙ŸÏö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙Ŝ++4£êŭ˙òœ & !*#Żäóï˙˙ü˙öĴŻ !”˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óĝŝħŞ˙ô˙ŝü  Ïï˙ô˙˙˙˙˙˙˙˙ú˙˙˙˙  #­ûö˙üš$—˙˙ù˙–!ݚ"#(™˙ô˙ü˙ô˙ö˙˙ë˙֐˙ü˙ü˙ö˙–#"!˘û˙˙ġĨ ôĵŸ˙ü˙û˘ŻİħŬîù÷˙ŭü˙ŝî˙˙é*˙ôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙ù˙÷úĵ˙í˙û˙óù˙ö˙˙ìÓ+"Ó˙˙˙ñ˙˙˙˙˙˙˙˙˙ñ˙ŝŭ˙˙˙˙˙˙Ñ&Żŭöġ˙ŭÌ(˙û˙˙˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙úûŜ))˙˙˙û˙ŭ˙ġòĝ˙˙¤Şĝö˙ϛĞ “Î˙ö­Ÿ˘ ˙ĝ˙÷ŜŸ !#- —Îŝ÷˙˙˙˙˙˙˙˙˙ò˙÷˙˜¤ ßħí˙˙ôڙ•- ĤĜ˙úôŝĈ¨™˙úȨ* *Ĥĝ˙ŝ˙˙˙ù˙˙˙˙˙˙˙˙˙û÷˙Ÿ"ŝ˙¸$ 1ö˙˙ê§)'6 #äñ˙öŭ˙î"Ĥ˙˙öö– !$ Òú˙˙˙˙˙˙˙˙˙ñ÷ŭ—#)6Ÿ &˙˙ûŝóĞ+*‘˙ŭ˙Ŝİ - ù—* Ü˙ëŭ× šú˙˙ 3ħ!!ù˙˙ùŭ, # Ö˙ö˙˙˙ù˙˙ù˙!#ëû˙˙×'ËŭŞ & !Ï˙ûÏ ˙ù˙ !)&° '˙˙ú! ˙öû§ ”˙"­öĝ˙î˙˙˙˙˙˙˙˙˙˙ú˙ ħ˙˙İ  &ö˙˙'úùìš"&# ˙˙ŭ" Ç˙˙£! ! ×Ĝ”Î˙ùû˙˙˙˙˙˙˙˙˙˙Ĝó˙˙ 1Ê˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¨%¤ â˙ú˙³&ÈĜĦ  ˙˙˙ù˙ñ™&›&Ĵ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˘ $ ù˙úìÍ̲ô÷˙˙˙˙˙˙˙˙˙˙˙èġ˙÷(! §ŝ˙ْ"˘) Š˙˙ö, " ,ĝ÷˙˙ù˙íĝŸ ĊŜ' ˙û˙ŝ˙Ì" Şä˙¸ ) -ĴôÇ˙!& !˙ô˙é˙˙ê˙Ӛ,&’÷éô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙÷˙ŝí—Ħ%ŭ˙˙ûí˙è˙Ö! âïö˙ú£Ÿš˜¤Ĥ– É˙˙˙˙˙˙–šİš“Ş˙ùŝÚŭ۟Ħ˜Ş î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüóà(& "˘î˙ĝ˙˙ùí!–˙ŭġ—. %œ˙˙ž™˙üû˙Ö&  §ú˙˙˙˙˙˙˙˙˙˙Ĉ $)Ġñ˙Ħ·Í)ŭóÛ÷" 2ž˙Ì& Şü˙ŝ˙ü˙ú˙˙˙˙˙˙˙˙˙üŭĝž!# 'Š˙˙™)ŝö˙˙Ü!# Û˙ù˙Ò+ɤ‘' ç˙˙$!™˙ù˙˙˙˙˙˙˙˙˙˙˙˙#¨ÀԚÖ˙˙ÎÎ˙˙˙ŝúò˙÷ĝġİ ĉËÌôŝ˙˙Ä ,ó˙ŭú!Ħġ˙ġ°İóŭ˙ú.Ÿùŭ"'!Ĉ˙˙ŝú˙ü˙˙˙˙˙˙%ŭ˙˙ûú¸)!šû˙Ġ˙–"ï˙˙í§!ñ˙˙öŭ#ÇΎ˘ÜúŜ#˙ì˙Ç"ûô˙ïùü³Ĝ˙û ›˙˙˙ú˙˙˙˙˙˙˙˙˙˙ôôÙ& ÈÄŭ˜#Ħŝï˙"ü˙˙˙˙Ÿ & ŭùüż,ÈÎì˙˙÷¤$Ÿù˙ú˙ Ğ˙üû˙˙˙˙˙˙˙˙˙ŭ˙˘'Ş˙ñ˙ñ. 'ܵ˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŸ˙ŝĝžÒê˙˙Ô 3×˙˙¤" ŭġ˙ï°"›˙½ĉ "˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ ! '˙ôô‰˙˙Î Ÿ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙ó6%"$ŸÌن4İô '*ñúÍ&*#&*(Ê˙˙ŭĝûâ×!§Í˙ŝ˙ŝÊ"ĦžÔ˙) ™ġ˙ˆĴ÷š! ˙˙˙ïĊ !,!˘˙òĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙' 'Êú˙˙˙ùË "ô˙˙ü ) # $˙ù˙ì˙Î& + 5ż˙˙Ó+žÎ "Ş÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙˙½"# ¤ #ğ˙˙ùŝ˙!Ĥ˙ó˙˙€0&žû˙üŬö˙˙ö #ŝ˙Ÿžŝ˙˙˙˙˙˙˙˙÷­ ´ì˙ÎĦ˙É˙˙ĝ˙&È˙ùŝž ˙˙ĦÙ÷˙Ĉ˙ŝü˙ġ˙˙˙˙˙˙˙˙˙˙ü÷˙˙ú˘#˙ú˙Ÿ "ŝú˙˙ĝ  âŭüĞû˙–!˙û˙˙#­ò˙›"Â˙ü˙˜$ú˙˙˙˙˙˙˙˙˙ŭ÷˙óÔû˙˙Ó¤úŝ˙˙û˙ù˙ĝ˙Ĥàú˙˙û˙ûİ$ ˙˙˙˙ü˙ŝ˙˙ Ñ˙˙ŝ˙ô˜¤û˙ò˙ü"œ˙ġ˙˙ ŝ˙ü˙  Ñ˙÷˙˙÷˙ö˙˙ù˙ŝ˙ú˙ŝû˙ĝü˙˙ùûóÒ˙×˙ô˙˜˙˙˙˙˘É˙ú˙˙ò˙÷˙˙ĝ˙§ŭ˙˙˙˙ŭ–"Éû˙˙—ĴÏĝŝù˙˙˙˙˙˙˙˙˙ŝñ˙ö˙ µö˙Ĵ¤˙üĴ Ħ˙˙öËڞû˙û˙ö(˙ó÷˙ġ˙˙È( Ÿ˙ù˙ŭĜ& ˙ŝ˙˙˙˙˙˙˙˙˙˙ò˙ŭž ˙ùŝĝ!ŭŭ˙ú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ċœĝ˙úŸ×˙úŝö/ ˙úö˙ŭ ˙˙÷˙šĠŝ˙Äİ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŜ& ġ˙÷µúü˙¤ Úġ˙ü˙˙˙˙˙˙˙˙˙ú˙˙˙˙ùù"-˜Ĥ›žœ˙ï )#˜#žü˙˙” Şġ˙Ç# ˘˙üú˙ŸÓú˙˙˙˙˙üœ!Ğ!%ñΧ !™Òŭ–#ĵ˙ü˙#—ŝ˙µ÷˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙ĝ˙üüû& §ŝ˙ï˙% ž˙ŭúÓœĦ,ü˙˙Ç,!ݨ Ö˙ŝË! ¨Ñ!¤˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûÍ$ üù˙Ê˙˙úûü !˘ŭô˙˙˙$£˙ô˙”#˙˙˙û¨İĊŻ İ˙˙ŝŭ˙ŭùû˙Ò˙ú˙š,˙˙ĦĦ˙ö˙˙Üî˙˙Á#§˙ë˙ŝ#Ċ˙˙ùü˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙ŭ˙˙ú˙Ü$ "ŬûîÙ˙ñ˙ĝ˙Ô  ù˙é˙Ġú˙ÑÂ˙ù˙û˙ϝÔĠüŻ ˙˙ò˙ö˙ŝ˙˙˙˙˙˙˙˙˙ù˙˙Òü˙ŝÎ Ï˙ĝ÷˙ï!˙˙ú˙ûÌÙ˙ŭŭúó˙& ü˙˙ŝù˙˙˙˙›˙ŝ˙ñ˙£"Èü˙ñ˙œ  ¨˙Ê˙úÊùŭü˙#ŝ˙˙˙˙˙˙˙˙˙ŝ˙ûŭ˙ûû²î˙ö˙˙È"˙˙˙ü˙÷ œ˙˙ûÊ%˙˙ö˙˙ÌÑ˙ġ˙˙˙ŭ˙ (ĝ˙ò˙&ŝ˙˙÷˙ĝ¨¤›£ú˙üġ˙˙ôŝ˙˙˙˙˙˙˙˙˙˙ù˙˙Ÿ(Ó˙•$Ĉ˘Ĝüö˙ŭĝĞ˙˙ġùÉ)™˙ŭ˙ö˙ü™ £˙ŝŝ˙Ï"˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˜İî˙˙ûÉ"­˙Ìġ˙˙ò˙˙÷ŭ˙òù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙ñ˙˙­ Ü˙ú˙Üé"­ġ˙ù˙ĴĠùû˙ ˙˙ġ˙÷&˙˙˙˙÷˙ñ˙˙˙˙˙˙˙˙˙˙˙ŝ˙ž˙ö˙  ˘Ŝû˙Óú˙˙˙˙˙˙˙˙˙˙˙ó˙˙ü˙ù˙˙˘ ŝù˙ĝ˙˙˙-#Â˙öô˙  ˙˙ŭ˙Ë÷ŭû˙˙ñ˙÷˙˙˙˙ġ( !% #Ĉŝúö¨&Ÿ˙ÏÍÉ˙*˜ŝöĜ—˙ŭĜï¤ Ğ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ü˙ÑÖ˙ ¤ÖüûÑŸ˙û˙Öž˙ĝŭž˙üô¤ ˙ŝ˙× ˜Í˙˙˙ü¨Çŝ˙ŝŭ˙öŝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭĠĤ˙áû˙Ô%˘ö˙ŭŭ˙˙˙ŝÇœ˙˙îĵ!& úû÷“!9 &Ĵóú˙üû˙˙˙˙˙–ŭñ˙ú˙˙Ä˙ŝ˙ô˙˙ŭ˙ġ˙ ˙˙ñïéĤ#Ħ˙˙úÎô¤ ˙úù˙˙˙ŭûûŭŝ˙˙˙˙˙˙˙˙˙˙˙öĝÇ0 %Î˙˙˜#ö˙˙˙ô˙œ˙÷˙ú˙7˙ĝÉ%üŝ˙ú˙ŝö+úöú¨+ëü˙û˙ #Ëû˙˙˙˙˙˙˙˙öï˙ùċÓ˙˙üŭ, ˙ó˙öñŝ '˙êġ˙ô˙ñ˙˙˙˙˙˙˙Œüġŝ˙ú˙ö˙ò#Ġŭ˙ûŭòĦĉŭ˙˙˙ùï˙ġÙ*µ˙˙ï˙û˙˙˙˙˙˙˙˙˙ú˙˙˙üï˙œ Êü˙˙ŝü˙Ġ˙ĝ˙ĝûß "™ùù˙ß#Ğû˙é˙×% ˙ŭóü˙˙ŭ˙Ş( ˙ñ˙ġĦÜò˙ô˙˙˙ó* 6 #Ò˙˙ĝù˙˙˙˙˙˙˙˙˙˙è˙ġ˙ŝ& Ÿ˙š " ¤˙Ñ˙ĝŭö˙ï ô˙˙˙ħ˙ó˙ġ˙ûĤ ŭ˙˙˙Î/ ˘÷˙ŝ˙˙˙˙˙˙˙˙óü˙ñ³ !˙˙ç˙§˙ú˙ûġ˙ò˙˙˙Ĉŝ˙ùñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ŭûó˙˙8¸í˙óü˙' ĝû˙ĝ˙” Î˙ĝ˙ –˙˙ö÷ŝ˙ìúŭ˙ñŝ˙÷˙˙˙˙˙˙˙˙˙ò˙í Ÿŭŝ˙˙("¨˙ŝß˙˙˙˙˙˙˙˙˙˙úĝ˙˙ŝ˙úž(š˙É˙˙˙÷ŭ"—š­Š·Ĉġ˙˙ĝ˙˙˙˙÷˙éà–˙˙˙½ Óñ˙˙ĝ˙ £˙úŝ§&.—œŸĉ˙ŝ˙ŝÌ (Äù˙˙˙ġŭ'¨‡‹›˙˙˙ ˙÷ŭù˙£)ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙üœ˙û˙ûÛ!ßŝé"˘ŝ˙ôîÓŞġ˙˙÷#–˙í˙˙˙ööšĠ˙ü˙Ĝ˙Σݽ˙˙ö˙ûú˙˙ŝŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ù˙áÉ÷ŝ˙ñï'ûò˙˙#šġ˙÷ûÛ!-ĵŝ˙ô(˙Ù˙Ğ›/‹šž™˙÷˙ûû˙˙˙˙ŝ²ù˙ŝ˙úñ˙û˙ú˙˙î˙˙Ċ²˙ŝ˙ġÇ,˜˙ŝúú˙İŭúŭòġú˙˙˙˙ü˙˙˙˙˙˙˙˙û˙˙ŝŝĜ‘!Ú˙îñŸ# ˙ò˙˙ÎĤç˙˙îŝŝË˙ éöôó˙˙ĝ &˙˙÷Ħŭûŝú˙ )!˙˙˙˙˙˙˙˙˙˙˙˙ó˙ž &ï˙˙ŭŝ ˙ŭ˙˙˙&í˙ü˙ç˙˙˙ú˙˙íöĝüË8Ç˙˙˙òĝ˙üù˙!˙òüŭ˙˙ĥÎġ˙öô˙%"˜˙û˙Ĝ!÷ì˙ô ˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙ĝè˙¨ ĜŝôŬ˙˙Ë ˙è˙ġ˙˙í!!Ğ˙üüÇ )…˙ì˙ü‘ +ù˙˙˙ú˙˙üúŭ˙û˙˙ì˙˙ñ˙¸# ˜˙ĝ˙˙˙˙˙˙˙˙˙ô˙ù˙ñ˙Ù$#ž’˙˙˙˙ü˙˙ #Ê˙Ê˙Ë÷ŭû˙ö˙İ"Ñ˙˙˙ê˙ "!ûġ˙˙˙˙˙˙˙˙˙˙ŝô˙˘!â˙ŭ˙˙˙˙òŭ˙ô’£Ĥöúú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙Ĥ¤ ( é˙˙˙˙˜Ñ˙û÷úÌ˙˙˙(ŭúö˙˙ì&˙˙ġù˙˙ŭ˙˙˙˙˙˙˙˙˙ùô˙˙  ÷˙÷ŭÄ $& £ŝ˙ù˙˙˙˙˙˙˙˙˙ó˙˙ĝŭ˙˙İŞĝ˙˙˙ôú/µ˙˙ûòù˙ò˙˙ĝù˙êŞÉ÷˙˙˙ú! ´˙Îú Ú˙÷ù˙ĝ˜˙˙ñŸŞ˙˙˙û˙˙˙˙çĝ˙ü˙ùû˙˙˙Ş(—˙ġ˙˙ñ˙˙˙˙ġ  £ġ˙˙ŭ˙˜Žà˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ö¤ŝ˙ê˙ÈÈ˙˙ ˙ë˙˙˙÷˙ñ˙ħ 0 Óŭ˙œ%)ĝ˙ü˙˙˙úóôòĠ.ϟÎ˙˙ìü˙˙˙ŝú˙í˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ġ˙ë#Ó˙ñŭ˙˙(Ñû˙˙ 'Ô˙ŝ˙ÇĜô˙ŝ˙ "ûĝúœ˙ö˙˙˙û˙ù˙ċ˙ŝŭŭ˙˙ŭüŭ%˙ŭüĝ˙˙˙˙ù˙í˙ùŸ% Žüû˙ü˙ü£˙ï˙˙˙ $ġ˙˙˙˙˙üûŝ˙˙˙˙˙˙˙˙˙˙ü˙ŭ˙ùŬĤœù˙˙!˙˙ŭ˙˙˙#˙˙é˙˙˙+ ‘˙ Ÿ˙ú˙ŝĝ˙ş! %˙÷˙š ˙˙ĝ˙ċ$*÷ĝ˙˙˙˙˙˙˙˙úŭ˙û#(Ÿ˙óôĉ˙ Ìĝ˙úì˙ )˙˙÷˙˙Ç˙ŝ÷üü˙ú˙˙Ô* ˆ÷û˙ĝù˙˙ñœ˙ü˙˙÷˙‹%Ù˙ú˙˙˙ $˙öĝ˙Ċ"¨˙ìÛ+™˙˙˙˙˙˙˙˙˙ü˙˙ö˙˙ñ÷Ì  ˙ġ˙˙öÓ˙˙˙û˙˙+œñŝ˙¨% Żö˙ŝö  Ġü˙˙ôĝŝŭ,˙üŭ˙š& ˙˙˙ŝŭ˙ŭ˙Û­˘£,£û÷˙˙˙˙˙˙˙˙˙˙ê˙ŭú˙ÄĦ ˙¤%­ó˙ûüú˙˙”'óü˙÷Ó˙˙˙˙÷˙+î˙ŭüÜü§#–˙˙ŭ˙˙˙˙˙˙˙˙˙˙ò˙’ ·ñûÓġ'Óï˙ïî˙˙÷Ô !Ù÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġô͕ҷ˙ê˙ĝ#$˙ò˙ĝڜùÎ˙¤˙ö˙ß˙˙% ċġ˙˙ĝ˙ïü˙˙˙˙˙˙˙˙˙˙ì˙Ĵ˙ù˙˙Ï '4Ĉó˙˙˙˙˙˙˙˙˙ŝŭ˙ûö˙ŝ˙”8—˙˙ŭüû˙ô¤ĉ˙˙˙˙á˙ñ÷˙ô˙ϓ%ĝ˙ûĉ˙Ú§äŭ˙! #úò˙˙˙û$˙ó˙­!˙ŭ˙ü˙ô˙ŝí˙ûî˙1 ú˙ü˙üġù˙è˙˙ùÖü˙ñûÙ  ˙˙óŭ˙§í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ùİĴü˙˙ŭüÎû˙Ó$!ŝ˙˙˙û˙ŭ˙½  ŝÎò•µ˙˙÷˙ûû˙ŭ˙ĝŜ' Òŭ˙˙˙öü˙öĝ˙ò˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙÷˙í#Ç˙úŝ˙ġÙ$˙żġ& ˙÷öü˙.ż˙ù˙ê§!Î˙öı˙óŭù˙˙ü˙˙˙˙ü˙˙˙üü˙˙  µÒ×ô˙˙òî˙ùġ˙ 5¤ßûç˙÷˙ ú˙˙öí)Òñ˙ġù˙˙˙ŝûú˙˙˙˙˙˙˙˙û˙û˙üñœ Ş˙üç&é˙˙˙÷Ë#(É˙òûüù ĝ $# ’˙˙è˙û˙Ì ÷˙˙˘ó˙ŝŝ˙¨ġ˙˙˙˙˙˙˙˙˙˙˙ŭ˙Ÿ%Ñ˙˙˙& Ï˙÷˙˙š'˙üûöŭŜß˙˙ŭ˙ó˙ŝŞĊ§' 2Ï˙˙ùúŝ˙ĝ¤•˙˙ŭó˙ġ¤'™÷ŝï˙˙  ŝûŝŝĝĠœÄ˙˙˙˙˙˙˙˙˙˙ŝ˙üû˙˙˙˙—˙˙êù˙!"™˙íŝúíÖ#Ï˙û˙ §˙Ìġ˙ %Ĝ˙ċ˙˙˙ü˙$!ŞûûĝùÙ ö˙ü˙˙˙Ħŝö˙Ċ˙˙ù˙˙˙˙˙˙˙˙ŝŝ˙˙ïú˙Ĥ. ˙“˙ö˙˙ŭĝ˙˙§ ˙˙˙# ¤˙ġ˙˙˙§–˙÷˙ŭô— "ö˙˙˙˙˙˙˙˙˙˙ŭ˙ûüµ—˙ġü˙•˙ŝ˙˙ĝÇ˙&ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙áŝİ $  Ôó!ŬŬ˙ü˙ î˙úÌôĴ­ùû˙ %+˙ġí˙˙§ "˙÷˙ñ˙ú˙˙˙˙˙˙˙˙˙˙ŝúםñ˙àÚ ™˙üü§ ˙˙˙˙˙˙˙˙˙˙û˙˙ĝ˙˙ôĝ“#+˙ġ˙˙ñ˙³ Ö˙ŝó˙ŭî˙˙˙úĝ÷ĵ ˙ë˙˙ù˙˙˙ġ#$Ŭ˙÷û˙ŝ žĝ˙˙‘ĵÙ˙˙˙ù˙ŝ˙˙÷·³ĉ˙˙ĝ˙÷#ëá˙ô˙ï˙˙˙˙ĠùĜ˙ü˙Ż ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙úÖ!‘˙ûí˙˙§ùŝĊ˙ò˙ċŜ&&( ˙˙˙! Äù˙úŭ˙üĝ˙˙ûÇ  ġ˙ñ÷˙û÷ñ˙˙ú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙ċ²è˙˙ç˙Â, ×ç˙˙Ÿ ˘˙ü˙˙Ñİü˙üבú˙ĝ ˙ŭ˙üù˙ùì˙úú˙˙˙˙˙˙˙%#–ó˙˙úĊ˙˙ò˙˙×#µó˙÷ûÑ Ĵñ˙ŝ˙ċ™÷˙öä˙˙˙˙ûú˙˙˙˙˙˙˙˙ú˙û˙˙˙§!˙ŝ˙˙ç˙ĝ˙Ŭ˙˙˙ô˙˙"˙ŝĜ$ĝ˙˙˙ì*ğŭ˙ô˙úú˙˙ĴüÈ˙˙˙˙˙˙˙˙ó˙˙˙,›ùìô˙˙˙û˙™“˙Ô˙˙ż“÷˙û˙˙óÊ#˙(û˙˙òôî'"’˙÷ĝ˙˙œ (#ù˙˙ŝ˙˙ŝ˙Ĉ˙7 ĈÜ˙û˙˙˙˙˙˙˙˙˙üĝ˙˙óûŭ$ì˙˙˙˙Ç !ĝ˙Í˙˙Ž˙úĝ˙,˙û˙˙‘0 “ŭ˙˙˙˙÷Ó &ü˙˙ùĦ0žÏ˙úí˙ ŝ˙˙"&˙ĉ˙ü˙˙˙˙˙˙˙˙˙˙óû˙óìö §˙ä˙$˙˙ï˙˙˙ù˙ˆ#'ŭ˙˙’ ˙˙˙ŭĝ˘ (˙ô˙˙×#öûö˙˙˙˙˙˙˙˙˙ò˙˙ƒ%+˘üû˙ô%Ş˙Ïöġ˙˙Öö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ (Ċ˙Ù'œê˙úĦ$˙˙˙˙üÊ˙üŝ"‘×˙˙Ĉ“(–î˙ċ÷˙ûġ˙˙˙˙˙˙˙˙˙ĝù˙‹¤ŭ˙˙#ĠôŭÙ!İûú˙˙˙˙˙˙˙˙ü˙úŝ˙ù˙˙¸Ë˙ñ˙ùùÄ )ï˙üóŜ%Ë˙÷˙˙…# İŝĝ÷˙Á #•ú˙öó˙ĝî˙§öÇ˙ %*˙ó˙ïö˙Ġĝ˙ġ˙ŞÔûùö˙˙*˜˙ŝ˙ŝ˙ġúûżÖä˙üùĦ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉ˙˙û$¨ŭŝ˙˙ŭÚ˙˙½)¤˙ĝü˙Ñ&ŭì˙Ÿ+Ş˙˙ó˙ĝ˙˙ġ˙˙Ù "'˙÷üô˙˙¨$˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙×% ›ĝôü˙ü" Ïú˙ċ˘%Ÿ÷˙ñŝü $çŝŭ˙–$ %žû˙£+˙ù÷˙˙˙ï˙˙ŝŭ˙˙˙˙˙ŭò$Ĥ˙í˙˙ŭ˙˙ġ“& Ŭġö˙ö˙–˙˙î˙ ĠüÓú˙˙ŝ÷÷˙˙˙˙˙˙˙˙˙˙˙˙˙ùüĝ· ĜÈ(˙ŝ˙ġ˙˙˜ŭôï˙˙ë*™üúÏ 5 #ġĜùÉĉ ›ïÙÓ¨"Ŝ˙ŝùĦ- !™˙˙˙˙˙˙˙˙˙˙˙û˙ġ&Ş˙˙˙öÓŝĝùö3&¨˙ü˙îÛ9ĉ˙ġ˙ËŞ ñß$ 2Ù˙˙˙˙ (ü˙˙ç˙˙é˙˜. ˙üŭ˙˘°ĈŸËŝġ˙ĝ˙˙˙˙˙˙˙˙˙ŭŭû˙˙÷á˜È˙ö˙˙ (˘ĵüú(&ú˙ŭ˙Ŝ$" ˙û˙ $Ž˙üúܘ&% Ċ˙˙." !Ħŝ˙ ,˙œġ˙úû˙˙˙˙˙˙˙˙˙ĝ˙ôò˙˙˙Ûœ˙˙ –˙öŝ˙ú˙ìŸ/''œî˙ž,"›˙— ĉûÎ!!·ŝ˙˙˙˙˙˙˙˙˙ûùÔ!ÜŭŭŭÜ  Í˙˙ö˙˙É .%ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úœ4!  &˙˙× Ĉ˙ô˙Ĉ ˙˙˙ %˙û˙Ş˙ë˙˙úû˙˙˙˙˙˙˙˙˙÷Â+ )‘˙˙ö™Úŝ˙" “˙˙˙˙˙˙˙˙˙˙û˙ú˙÷÷˙"Ċ˙ü˙ö˙!Ÿ™ÖÜ $˙ĝ˙#–˙˙ŭùÎ$ œ˙˙˙+ . Ç˙˙˙ú Ħ˙óŝ  —Îá£Ë˙˙ŭ¤—ô˙˙˙éù"#&˘ò˙ü˙ʝ˙˙˙—"§˙ŝ˙˙£! ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ç˙•$ "Ùñ˙óÇŝĤ˙ĝġÒ"œò˙ù4#Ĉ˙Ê˙˙˙ö%˙Éġ˙˙˙˙Í˙Çğï˙ü˙Ï %!Ž˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝĝŝ˙úÍ"˙˙ŝĝù!%Á˙ü˙˙Ï˙˙ŝŬ˙Ϛ " ˙úÌ˙˙ùú˙˙˙è˙˙˙üŭ˙˙ñÜü˙˙Ò ˙ë˙Ż+% ˙˙ĝÒŝù˙˙Ş˘—şç˙˙˙ûú˙˙˙˙˙˙˙˙˙ù˙ú˙˙ô  & !'˙ŭġ˙ġ*§˙Ó˙È"!áúŭ˙Ĥ%¤ ¤˙ü˙ž$ŝŭ˙Ñ !Ħû˙˙˙˙˙˙˙˙ĝ˙û˙É0 Ç˙ŭŞ#ġ˙˙ÒÜ˙ô˙ĝ Ĥñ˙˙ "˙ù˙Ħû˙ž!ŝŝ˙ž# ˙ĝ˙˙ġŝ˙û˙˙˙˙˙˙˙˙ù˙˙ŭŭ˙Ĉ §ĝ˙û˙#"˘# ”˙˙úüüŭ˙Ç""ñ˙˙ġÔ£Ÿ˙ò˙˙™ ˙ö "˙ġŭ˙˙˙˙˙˙˙˙˙˙ò˙ü˙ĝùüöĞú˙îŝûİ˙û˙˙÷˙ù˙" ’˙˙˙ !!"ò! Ï˙¤%™û˙˙˙˙˙˙˙˙ü˙Ÿ$Ġûŝ˙(#Ÿö˙˙ò˙˙' ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û Ÿ% ö˙ ˙˙Ö,˙é˙Ô"šŻ ' ˙˙ö˙˙û˙˙˙˙˙˙˙˙ĝÖ ,š˙÷ Ÿ#˙˙ŭ˙˙˙˙˙˙˙˙ú˙ò˙ŭ˙ñ#˙˙ú˙öĝ"Îĝ˙÷ ˙öùÜ›˙˙í!Ë˙ŝÍ% ž˙˙ô! # ÑŭÄ۟Òŭóġ˙˙üÖˢ ĝùÔĤġû˙¤Ĥ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ù¤"ž˙ġ˙˙ÍĦ˙ûÜ Ùü֛ĝÍĤ +Ħœŝ˙!Ç˙˙üÇ­ Ñ˙˙Ì"Ĵ)˙ù˙ĝĤ%œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙ò˙× ߜÊÛĤ×˙ùü—(Ó˙úú˙  !È˙˙Ó( !–˙Ġü˙˙˙˙˙˙˙˙˙Ħ šÒ¤˙ŭ˙*# ĝ˙Ï"£úŭ˙Ì+Ì˙û˙ü˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ#' *¤˙˙ú˙Ö" -ĝ˙üùŭ˙Ġ˙úÔ!ŭ˙ûĈ˙˙˙˙˙˙˙˙ò˙û‘/ĜĠ–,¨Ĉ#˜˙˙íĜÓÎÎÓĜí˙˙˜##×óŝ˙ÓÎ, ĝÚÍËÏÑÜ˙˙˙ğ)–ÚÔñ˙òÚÌÈÏâôú˙£'ħÎ˙˙ŝ') "˙ŭûú˙úĝ˙˙üù˙˙ĝ˙˙è²"ù˙ù˙ĝ˙ËÑΰżÑàŭ˙ŭ˙˙”(/’üŝ˙ŭ§"ÊÜñ˙˙ŭü˙˙ÌÑàô˙˙˙˙ŝ#Íâ˙üÈ#%ŝŝ˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŬŜ˙˙ŝïîôŝ˙ŝŝ˙ŝŝíۙ ™Î˙ġ˙ÓÊħíßúöŬö*“˙˙Ëİùš˜˙˙˙˙˙˙˙˙˙˙ġȝÍ˙˙öÑ£•ßú˙ŭŭ˙È˙ +–Ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙¨(ĝ˙ġÚÌÚó˙˙ÔÓú˙ġ) ¨˙˙˙úŭ "˙ġ˙˙˙ü˙˙˙˙˙˙˙˙˙ËÚŝ’* $'Ġ÷÷˙˙˙˙˙˙˙˙˙úû˙ŭġ˙Ä% 4¸˙˙ûú˙ü•0Ö˙ñ˙$ŭû˙ ÷˙ûË &šû˙ˢ% (—˙úöĦ% ˜˙˙÷˙ü '+$ Òí˙˙˙•  ! ġ˙˙˙ŭ˙û˙˙˙˙˙˙˙˙˙óû˙ £œŸÄ˙òœ' Î˙°”  ˙˙֒Ë˙˙ѝ" ˙˙ġŸ! ˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ü˙Ó/" )+Ġ˙˙öŝ0×˙˙òó- (š¤–ğ˙ô˙˙/+Á˙ċ˙˙˙˙˙˙˙˙˙ùü²Ĵ ((”Ó˙é÷úĞ­ËĴš%Ĝüŝ  )Ñ˙ü˙*œŝ˙ŝ˙ŝ˙ö˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòù!#˜äŽ£Ôúúôü˙ü#¨ĞÊö˙ŝü˙÷˙Âѝš$Á˙üô˙ı &À˙ŝ˙͢”&Ÿŭ˙˙˙˙˙˙˙˙˙ü˙˙˙ìÉŞ›§Óîû˙Û˙˙ó˙˙üöü˙ŝŝ˙üöü˙˙óíéôß˙ŭ˙˙˙úïú˙˙˙û˙˙ŝĝù˙˙˙ù˙˙û˙˙ù˙˙˙ŝ˙˙üü˙˙˙˙ï˙˙ë˙ŭ˙ñ˙—!' ¨˙˙ĝ˙˙˙ö˙˙˙ŭû˙˙˙ì˙ñ˙˙ŝü˙˙ôÓ(,ŝ˙ôû˙˙˙˙˙ŝú˙˙ö˙ûò˙˙˙ü÷˙˙ò˙òŭ˙˙˙˙˙ŭĝ÷ü˙˙ŝûŭ˙ŭ˙úí˙ó˙ù˙˙˘Ż§™£˙Ŭ˙˙ĝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭöĝ˙˙˙ûûùü˙˙ŝü˙ŭ˙˙÷˙úó˙ûŝġ˙öĝ˙êó˙üñ˙ŝġ˙˙˙ü÷ü˙˙úû˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙÷˙¸ˆ*ó˙òó˙˙˙÷˙öóŝüŝù˙ö) Ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭі­´˙üüúĝŝ˙˙û÷žĤœ˜Ħü˙ġ˙³Ĥ¤§™Îŭ˙ġÜ˙Áĥ™        ­Ĵ˙ŭú÷˙˙˙˙˙˙˙˙˙˙˙˙!ŻĤ ò˙˙ëĞĦĦ•ħÛ˙˙ŝ˙˙˙˙˙˙˙˙˙˙ĝŝ˙ĝ˙ü§ž•¤Ôċ˙˙ú˙˙˙˙˙çĠ™Ğ£Şî˙˙ö÷˙יž"İ ˙û˙렞 ­˙ü˙£) #§üû˙ò§ĦžÍŬ˙ç˙˙! ˙˙˙óŭ˙ġ•3"˜˙ĝ˙úü˙üž($, £˙úù˙÷ü˙˙˙˙˙˙˙˙˙ûŝ˙ù˘# ) œäò˙ +£ŝ 1-!§˙Â˙˘ $#&˙ùœ#  2ò˙Í# ñïôü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙ü˙ôš ¨" $%İż˙˙ó˙ú² —İ İ˙ŭû˙öğ˜ŸĤÑ˙˙Í˙í˙ö˙˙ò˙ŝ¤´˙˙˙ó˙˙˙˙˙˙˙˙˙˙ċ˙û%ş˙˙ċ˙˙ĝòŝ˙˙üéú˙ê˙ĝô˙ü˙ŭ™ ı÷ŝúŭ˙$ĤŸĝ˙úŭ˙ú˙û˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙ŝü˙ñ˙˙ñ˙÷˙˙˙˙˙˙ùù,Ġñ˙˙÷˙˙˙˙ûúû˙ġŭú˙˙ŭŭ˙˙˙ĝ˙÷ü˙˙˙˙ì˙˙÷˙ö˙˙˙ĵú˙ö˙˙˙˙˙˙˙˙˙ġô˙˙˙ù˙˙ú˙˙˙˙˙ù˙ŭ÷˙˙˙˙˙˙˙˙˙˙÷ŭ˙˙ĝ˙˙˙ò˙î˙ü˙˙˙ôùŝ˙˙˙ŭûüûĝ˙ù˙˙ù÷ŝĝûúü˙˙˙ŭ˙ú÷ŭ˙˙˙ġ˙ŝï˙˙ä "-# $ĵ˙˙˙ŭï˙˙˙ûŝŝû˙˙˙˙˙ŭôúûê˙˙•˙ġ˙˙˙ŝüüúö˙ġú˙˙˙˙ùî˙ŝú˙˙ŭ˙˙˙˙˙˙˙ú˙˙˙˙˙ŝüŝŭò˙˙˙ŝî˙ü˙˙ô˙î÷ŝ˙˙ú˙ù˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙˙˙˙ŝŭŝôŝöò˙˙˙˙˙ñ˙˙˙úû˙˙ôú˙˙˙˙ŝġñù˙˙÷˙˙˙÷ó˙˙ŝöú˙˙˙˙˙˙˙˙˙üĝŭ˙ò˙Óê˙÷˙˙ù˙˙û˙˙˙ŝò˙˙˙ üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙üòŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙ĝ˙˙˙ûŭ˙ġú˙ĝġ˙˙˙ŭŭŭŭŭŭŭŭŭ˙˙˙˙ùĝ˙ú˙˙˙˙˙˙˙˙ûŭ˙îĜ˙ê˙ŭ˙ö˙˙ú˙˙ü˙˙ĝ÷˙˙˙˙˙˙˙˙˙˙˙ġü˙˙ü˙˙ú˙˙˙˙ĝ˙üú˙˙ġô˙˙˙˙˙üĝ˙˙˙ó˙˙ï˙˙·˙ŝ˙ü˙ú˙ŭü˙ŝû÷˙û˙˙˙ÚžŸî˙ö˙—1Ċġ˙ú˙ġċ˙ĝñ˙ġ˙˙ċüŝù˙–ÙúĜ¨˙˙î˙üôü˙ùÎĤϤ˙×˙˙ìö˙˙˙ì˙˙ĈÈ˙íŸ˘™Óì˙ôŭ˙˙ö˙˙˙˙˙˙˙˙˙˙ñ˙ù˙¨.!˘îŝ˙ç˙üòĈ˙ŞŠ˙˙ôûÚ‘§˙ÏĤ ”˙˙˙ŝ %‘ĵ–¨˙ġúûĴ­""ħİ˙ŭ˙Ä$úùû˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ûü˙˙ö˙üžÛͤğü˙˙îù˙û˙ò˙˙˙ŭ˙˙ŭŭú˙à˙˙˙ûúû˙˙÷Îö˙ú˙ö˙éü˙ñ˙˙˙˙óù˙˙˙˙˙˙˙˙˙˙è˙û˙˙÷˙˙ôó˙˙ôñ˙˙ù÷ŝ˙ùóûú˙ŝ˙˙ġúü˙˙üä÷˙˙˙ŭ˙˙ġ˙ö˙˙˙˙ô˙ŭó˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙ŭû˙÷˙˙ôô˙˙ùŭ˙Ü!ê˙˙ŝ˙ŝ÷ö˙˙˙ûŭ˙ì˙Âûí˙ö˙ññ˙˙ï˙˙ü˙ĝ÷˙ġ˙˙ï˙ü˙òŭġ˙˙˙˙˙˙˙˙ŭŝ˙ŭ÷óù˙ŭû˙˙ñ˙˙ŝùû˙˙÷ù˙˙ù÷˙˙ûùŝ˙îù˙ù˙˙ŝ˙˙÷ĝï˙˙˙úüŭŝŝ˙˙ŝ˙öŭ˙ù˙˙˙˙˙ûùùû˙˙˙˙˙ĝô˙˙ŭú˙˙Ž£ÉÇĈĵ)¨˙ôïû˙ŝü˙ŝ˙˙ŝôĝ˙ú˙ŭ÷˙˙˙˙ĝú)˙˙úûûûŭ˙˙˙˙ŝ˙˙ôĝ˙ĝ˙˙˙˙˙ŭ˙˙˙˙üü˙˙˙üŭüüŭŝŝ˙˙˙˙˙ĝ˙ŭ˙˙˙ü÷÷üà˙˙î˙˙öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝŭŭ˙˙˙ŝŭŝ˙ŝ˙˙˙ŭ˙˙˙ġĝ˙˙ù˙ùü˙ò˙ùġ˙˙ôĝ˙ŭ˙˙˙ŝŝŝúô˙˙˙ûùŭ˙˙˙˙˙˙˙˙˙˙úí˙˙÷˙ü˙˙ŝ÷˙ġ÷˙ñ˙ĝòŝü˙˙Í$!˙Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙˙ö˙˙˙úöĝŝ˙÷˙ŭ˙˙˙îŝ˙ô˙˙ù÷˙˙˙ö˙˙ùùï˙˙˙˙˙˙˙˙˙ù˙ó˙˙˙˙÷˙˙˙˙˙˙˙˙ù˙ú˙ò˙˙üġ˙˙öúù˙ŭ˙ġó˙ò˙˙ĝ˙˙˙˙˙˙˙˙ú˙˙˙˙ŭ÷ĝ˙˙ŭúŭùŝüŝù˙˙÷ùŝ˙áŜ˙˙ùô˙˙˙ü˙˙ġ˙ĝ÷˙ú˙ñ˙ŝü˙ûö˙ŝŭú˙ŭì˙˙˙˙ô˙ï˙ì˙ú˙˙ûüâ˙˙ĝ˙ü˙˙˙ú˙ññ˙ô˙í˙˙î˙ŭ÷˙˙ĝö˙˙˙ô˙ĝ˙˙ï˙˙ñ˙˙˙˙˙ŝ˙˙è˙˙ŝ˙ŭáġ˙˙˙˙úû˙˙˙˙˙˙˙˙˙û˙ġ˙û˙ÇÛÊĞ˙˙˙ù˙îú˙ŭòġë˙˙˙˙˙˙ô˙ġ˙ĝäÊË˙˙öû˙˙ĝÒê˙ï˙˙˙˙˙ü÷˙Ì͢ù˙ò˙ò˙Îĝ˙ŭ˙!˙˙˙˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙˙ŭ˙˙ó˙ôŝ˙˙˙Èöŝ˙˙˙ĝ˙˙˙ïÊ˙ûùüŭŝ˙˙÷ù˙˙ġö˙˙öñ˙˙˙ú˙˙ú˙˙˙û˙î÷˙ûġŝ˙˙˙˙˙˙˙˙˙˙˙úùú˙î˙˙˙˙öú˙˙ûì˙û˙î˙ĝ˙˙˙í˙˙ġ˙˙÷˙ż˙˙üôŝŝ˙ôö˙˙éŝüûŝ˙üö˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭíü˙öûúġ˙˙˙˙˙ùùŝ˙5à˙˙ú˙˙˙˙˙ŝ˙˙ôĝ˙û˙˙˙ï˙˙˙˙÷ŭ˙ĝù˙üŭ˙˙ù˙˙˙ûô˙ùù˙˙˙˙˙˙˙˙˙ŭ˙˙ŭ˙˙˙ùû˙ù˙ĝ˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙ñġù˙ŝô˙ŝ˙òŭ˙˙˙˙˙˙˙˙˙óü˙˙˙˙ù÷˙˙˙˙˙˙ŝüŝôù˙˙öüúö÷Úù˙˙˙˙÷Ş "ĉ˙˙ĝü÷˙úŝ˙˙˙˙˙˙˙˙ŭöûĝö˙˙ġĞ/öüŝŝ˙˙˙˙˙˙ñü˙˙˙˙˙˙ùĝŝû÷˙˙üŭüŭ˙˙ŭŭŝŝ˙˙˙˙˙ŝŭùú˙ú˙ò˙ö˙˙ù˙˙é˙÷˙˙ŭ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙üŭüûü˙˙˙úúŝúö˙˙ĝŝ˙üö˙˙˙˙˙˙˙öû˙˙ĝö˙˙üú˙˙˙˙˙˙û˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙÷ü˙˙è˙˙ñŭ˙˙˙ú˙˙˙˙˙ô– ­˙ù˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îüû˙÷˙ùüŭ˙˙˙˙ŝŭ˙üúù˙ùú˙˙ĝù˙ŭüĝŭ˙ö˙ġó˙˙ŝüüüüüüüüŝ˙˙ĝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙ûö˙òŝ˙ûù˙û˙˙˙˙÷û˙ŝ˙˙˙ùŝ˙˙˙˙˙˙˙˙˙˙˙ù˙˙ûü˙üĝŝ˙˙˙ŭ˙ġŭ˙˙˙˙˙˙˙úŭ˙˙˙˙÷˙˙ùóüüĝüŭ˙˙÷˙ġ˙üù˙˙úú˙ú˙˙˙ö˙üŭ˙ûĝ˙˙ŝ÷˙˙ü˙˙û˙˙ó÷˙ĝù˙˙îÏ˙ŝ˙˙˙ô˙ĝ˙˙˙˙˙úò˙í˙˙ü˙èûü˙ñé˙˙ñ˙˙ŭ˙˙˙ïú˙óö˙úġ˙˙ŝ˙˙˙˙˙˙˙˙ŭ˙˙ŝöù˙˙ë˙˙ó˙úï˙ü˙˙˙˙ô˙˙˙ñú˙ë˙í˙Â˙ú˙ù˙ë˙˙úû˙˙÷˙ġ˙˙˙˙ú˙î˙ġüñ÷ŭü˙ŭ˙˙ö˙ôùġ˙ŝ˙–¨üŭŝŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙üŝ˙ŝĝ˙ŝ˙˙˙úë˙˙˙ŭŝŝ˙ûüûŭ˙˙÷˙ô˙ĝ˙ó˙˙öĝ˙˙˙ġü˙˙˙˙ó˙˙ûû˙ŝĝŝ˙˙˙ü˙˙óŝ˙˙˙˙˙˙˙˙÷˙ŭ˙ñ˙˙ûì˙ŝ˙÷˙ŝ˙˙˙ù˙˙üö˙ŭŭ÷ú˙úĝ˙˙û˙ġ˙ŭû˙ò˙ü˙˙è˙˙˙ŝ˙˙ŝ˙˙û˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙ŝ˙˙˙˙˙ñŝüĝĝ˙˙˙ĝ˙5Żġù˙˙üŭ˙˙÷÷˙˙ú˙ŝ˙˙˙ŭġûöġŝ˙˙ùû˙û˙úï˙óò˙˙ŭ˙˙üŝ˙˙˙˙˙˙˙˙˙ûġù˙˙˙˙˙˙ò˙úŭŭöù˙ŝ˙˙˙÷÷˙˙˙ŝ˙ùù˙˙˙˙˙û˙˙ù˙ü˙ó˙˙˙üûüûùùŭ˙˙öï˙˙ŭ˙÷ûŭüüŝŭù˙ŝĝ˙˙ġ˙˙˙î˘ú˙ŭó˙˙Ĥ.˘˙üŝ˙˙ŭ˙ŝ˙˙ûŭ˙˙ü÷ü˙˙˙ŭö˙ŭİÖ˙ŭûü˙ŝúĝù˙˙ùò˙˙ù˙ŝ˙˙˙ġ÷˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙û˙˙ŭó˙ĝ˙˙ü˙ŝ˙˙û˙úúô˙ù˙˙ġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙û˙˙˙ŭŭ˙˙ŭ˙˙˙ŭ÷˙˙ùġ˙ŭ˙˙òöġôûġü˙˙ġŝ˙ŝŝ˙˙ûŭ˙ûŭ˙˙˙ùû˙˙˙˙˙˙˙˙˙ì˙ô˙˙˙ü˙öö˙˙ôġü˙ŝòôûú!ŭñġ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ô˙˙˙˙˙üü˙˙˙˙˙˙ŝ˙ú˙ŭ˙ûŝ˙˙˙˙˙ġü˙ġ˙ô˙˙˙ú˙˙˙˙˙˙˙˙˙ŭ˙ġ˙ú÷˙˙˙˙˙˙˙˙˙˙÷˙˙ü˙˙˙˙˙úĝùŝ˙˙˙˙ġĝ÷˙ó˙˙˙˙˙˙˙˙˙˙˙ü˙˙ûû˙ŝ˙˙˙öŭó˙˙˙˙üù˙˙÷ô˙˙˙˙˙üóû˙˙˙˙˙˙˙˙ô˙ŝ˙˙÷˙˙˙˙üü˙˙úŝó˙úú˙˙ù˙ú˙ó˙÷ô˙÷ŭ÷˙ŝù˙˙˙÷˙÷ó÷ù˙úí˙û˙˙ùö˙˙ùû˙˙˙˙˙ü˙ûó˙˙˙˙˙˙˙˙üŭ˙ñ˙ŭûŭ˙˙ô˙ĝ˙ûŝü˙˙˙˙˙˙˙˙˙˙ûŭö˙˙˙óí˙ġĉŬ˙˙˙˙˙ö÷ò˙úŝò˙˙ġ˙˙˙˙ġ˙üï˙ú˙˙÷ü˙üù˙ŝ˙˙˙˙ŝĝ˙˙ŭ˙ŝ˙ŝ˙ŭ˙öôúĝ˙˙˙˙˙˙µ´Èúüŭûü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ŭ˙˙˙ŭ˙ö÷ù˙˙˙ú˙˙öô˙˙ùŭ˙˙í˙ç˙˙˙ùŝ˙ĝö˙ĝ˙˙˙ùġ˙˙ŭ˙˙öŭ˙˙˙ġ˙ûñ˙˙ö˙˙˙˙˙˙˙˙˙˙ï˙˙˙˙˙ù˙˙ĝ˙÷˙úûô˙ûŝĝ˙˙˙˙û˙˙˙˙ù˙ó˙ŭ˙ê˙˙˙˙è˙ôú˙˙ü˙üüúŝ˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ùĝ˙˙ġú˙ú˙ŝ˙˙˙ġù˙Ï˙˙ü˙ŭú˙˙˙˙˙ŭ˙ĝ˙ġŭġ˙˙ú˙˙òô˙ü˙ëġ˙û˙˙ġ˙ŭüñ˙û˙ŝ˙˙˙˙˙˙˙˙üü˙˙˙ĝôúġ˙ĝ˙ŝ˙˙˙˙˙˙ùñôŭ˙˙ŭôñù˙˙˙˙úŭü˙˙˙öġŝĝ˙û˙ŝô˙ŝŝ˙˙˙˙˙ñ˙˙ŝûúŝ˙˙˙˙úû˙˙˙ö˙˙˙˙û˙ġíú˙Ïŭ˙úó˙˙ÉĜġĝ˙˙˙û˙˙˙˙ûû˙ŝù˙ŭûüûú˙˙• ˘˙˙˙˙˙˙˙˙˙˙ûü˙˙ŝ˙˙öïŝ˙˙üŝ˙˙˙˙˙ûü˙û˙˙ŭŭ˙˙ŝúŝ˙ú˙˙˙ù˙˙ùûüŭ˙ŭ˙˙˙úñûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙ŭû˙˙˙ŝŭ˙˙ûúú˙˙˙ġû˙˙˙ú˙ü÷˙˙˙˙ŝ˙ŝġù˙˙úö˙˙˙ü˙˙û÷˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ô˙úŭñ˙˙ñò˙ŭü˙˙˙ŝúôÄ!˙˙˙é˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĝûŭŭ˙˙ŭùûŭŭ˙˙ŭ˙˙ûŝŝ˙ġû˙˙ĝö˙ú˙ŝ÷˙˙˙÷óüŝŝŝŝŝŝŝŝ˙ö˙ŝ˙úĝŝ˙˙˙˙˙˙˙˙˙ò˙˙úŭġ˙ù˙˙˙ù˙˙ûûŝö˙˙˙üû˙˙˙˙˙˙˙˙ûĝü˙˙ĝĝŝ˙÷ôù÷˙ŝ˙ö˙˙û˙˙˙ŭ˙˙ŭ˙ŝùŝ˙˙ŭö˙ŝí˙˙ùú˙˙˙ùü˙˙÷ùü˙˙û˙î˙˙˙öêü÷˙˙˙˙˙˙˙ù˙˙˙˙ö˙˙ĝ˙ġò˙˙öĝ˙˙ô˙ŝ˙˙ŭŝ˙˙ŝùùû˙ïò˙˙ü˙öüó˙˙úŝ˙ù˙ùĝ˙˙ù÷˙˙÷ŭŝ˙ú˙ù˙˙˙˙˙˙˙˙˙˙˙ŭùŝŭ˙˙ŝ˙˙üĝùĝĝ˙˙ġ˙ŭŝ˙ĝù˙úĝ˙˙˙ġŝ˙˙˙íùŭġ˙˙ĝ÷ŭ÷˙˙üú˙˙ĝ˙ùùñ˙ûöô÷˙ŭ˙˙ġïùú˙ '•˙˙˙˙˙ŝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ûû˙ŭû˙ŭ˙˙˙˙ó˙˙ŝû˙ĝ˙÷˙ŭ˙öö˙ûù˙ŝ˙ûŭ˙˙ŝŭû˙÷ù˙ŭĝ˙˙ô˙˙˙ò˙ŭ˙ŭ˙˙÷ù˙ĝ˙˙˙˙˙˙˙˙ú˙˙ñ˙˙˙ûú˙ŭ˙÷˙˙˙˙˙ù˙ôú˙˙ŭŝŝĝû˙˙˙˙˙˙ù˙ù˙ġ˙˙û˙˙ŭŝ˙ŝ˙üö˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ŝ˙˙ŝŭ˙˙ŭ˙˙ŝûü˙˙˙£˙ŝü˙˙ûöùüüö˙û˙ĝ˙ú˙˙˙ĝ˙˙ú˙ù˙˙ù˙ôî˙÷ŝ˙˙ù˙ü˙˙˙˙˙˙˙˙˙˙˙üĝü˙˙ŭ˙ŝ˙˙˙˙ûü˙úù˙˙˙˙ŝŝ˙˙˙˙ùú˙˙ó˙˙ú÷˙üŭ˙˙˙ûöŭ˙˙ŝ˙˙˙üúŭ˙ü˙˙û˙˙ġú˙˙˙˙˙˙úû˙ú˙˙÷˙˙˙˙÷ ˙ŝ˙ü˙ö˙Ô˙ù˙˙ùŝŭŝ˙ŭ˙˙˙˙˙˙ŭû˙˙ŝ˙˙ùÑ˙ŝŭ˙˙ûŭ˙˙û˙˙÷ĝ˙ŝĝ˙˙ŝ˙˙ŝ˙˙ûùŭ˙ŭŝ˙˙˙˙üû˙˙ŝ˙ô˙˙˙ŝö˙˙˙ŭ˙˙˙ú˙ŭ˙ö˙ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙û˙˙ŭü˙˙úŝ˙ŝŭ˙˙üû˙ŭ˙ĝù˙˙ó˙öü˙û˙˙÷ù˙˙˙ŭûüŝû˙˙˙ŭûúĝ˙˙˙˙˙˙˙˙˙ĉ˙üû˙˙˙ġ˙˙ê˙˙ü˙˙ùñ˙˙ö˙˙˙˙÷˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙úü˙ŝú˙˙ŭ˙˙˙ŭü˙ŝ˙ú˙˙˙ú˙˙ô˙ŝù˙ü˙˙˙ûúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ôü˙û˙ŭ˙ò÷˙˙˙û˙˙ŭ˙˙ġĝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙÷˙˙˙˙ô˙˙ŭ˙ŭú˙üĝ˙üŝŝŭŝ˙˙üŭġ˙ġ˙ŝ˙˙ü˙ŭ˙ġû˙˙ĝ˙˙˙û˙ġ˙ô˙ì˙˙ŭ˙˙ù˙ñ˙ġġ˙ĝù˙ŝú˙˙ù˙˙÷˙ùĝġ˙˙üü˙˙˙û˙üú˙˙˙˙˙˙˙˙ü˙˙ï˙ù˙˙˙˙úü˙˙ŝġġ˙˙ĝ˙ġ˙ĝ˙˙ĝ˙ġ˙ĝ˙˙˙˙˙˙˙˙˙ŭ˙ò˙˙ŭŭġ˙˙÷ŭ˙ï˙˙ŝŭüó˙˙ú˙˙üŝ˙û˙û˙ö˙˙˙˙ŝ˙ŭó˙˙˙ê˙ú˙˙ġĝ˙ü˙˙˙ŝ˙ŭ˙üò˙ŝì˙˙˙˙ŭ!˜˘˙íüü˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ó˙ġĤ(#Ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŬÄ"Ġ˙˙˙˙ġÙ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÌÎÒÑËËŬò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÌÑàô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙˙ÍĦˆ²š­ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭî˙ĝġĤżċ˙üü˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ÷ü˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙ŝ˙˙ö˙˙÷˙ŝ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙ŝ˙˙óîŭ˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝŝ˙ô˙Â˙ü˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙úïĝ˙˙˙˙˙˙ŝŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üúü˙˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüüŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ü÷˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙˙ŭŝüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ú˙˙÷˙û˙˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝ˙öûñŝġ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭùûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙ĝ˙ùú˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙˙˙˙˙˙ŝüŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üŭ˙ûû˙˙˙˙û˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙ŭġ˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŭ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ĝ˙˙˙˙ù˙˙ò˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ÷ŝ˙˙˙˙˙˙ù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙˙ŝ˙ú˙˙üû˙ŝĝü˙ŝ˙ö˙˙úŭ˙˙˙˙˙˙˙˙˙ŝû˙üû˙˙û˙ŭü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷˙ö˙˙ùû˙úĝ˙˙ú˙˙˙˙˙˙˙˙˙ŭ˙ŝü˙ŭŭ˙÷˙ŝ˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûûü˙˙÷˙˙˙ùŝŭ˙˙ô˙ûŭ˙üŭ˙˙˙ö˙ï˙˙ö˙ŝ˙ú˙û˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙˙üûûü˙ŝŝ˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úġ˙ü˙ù˙ŝĝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ġ˙˙˙˙ŭú˙÷ú˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ñ˙˙ô˙˙˙˙÷ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ĝ˙˙ô˙˙÷ŝ÷˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú÷˙˙˙ù˙˙˙˙ĝù˙˙˙˙÷˙˙÷˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙öü˙ôġ˙ò˙î˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ˙˙˙ù˙ŭġú÷˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭú˙ó˙˙öŭŝŭ˙˙˙˙ù˙˙ò˙ôó˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úŝŝ˙˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙ë˙ŭ˙ü˙ûû˙ŭü˙˙˙˙˙˙˙˙˙˙˙ù˙˙úë˙î˙ö˙ŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙ö˙Êûé˙˙úô˙˙˙ŝŭ˙˙˙úòí˙˙ŭ˙ô˙Ëùĝ˙˙ü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝġ˙˙˙˙ú˙ŭé÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙üú˙˙˙ġöùü˙úü˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ôô˙˙ŭó˙˙ëûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙úû˙ü÷ò˙˙ŝġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭó˙˙ó˙˙ŭ˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüùû˙ŝù˙ġ˙÷ûùŝ˙üòŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙ü˙û˙˙˙˙˙ŭ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ôüûû˙˙˙û˙úô˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ĝ˙˙˙ŭ˙˙˙˙ŭù÷ĝ˙˙ŭù˙ġŝŝ˙˙˙˙˙˙˙˙ŝŝü˙˙˙ú˙˙ú˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úóŭŝ˙˙ù˙ŝñ˙˙ú˙û˙˙˙˙˙˙˙˙˙˙ëŭ˙öñ˙˙ŝŝ˙˙é˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙û˙˙˙˙˙˙ŝ÷˙˙ŭ˙ú˙˙ŭŭ˙˙˙˙˙ê˙ùú˙ŭ˙˙üú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŭü˙˙ñĝŝì˙˙˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙öò˙˙ŝ˙˙˙˙ŝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭö˙˙˙÷˙ú˙ñù˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙òù˙˙ô˙˙˙ö˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñú˙˙˙˙ë˙ò˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üú˙˙˙÷ŭ˙˙˙ĝŝ˙˙ŝ˙˙÷˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ö˙ŝû˙ġ˙ŭô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúü˙˙˙˙ó˙˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ûùöġ˙úúŝ˙˙˙˙ŝ˙ûù˙íŭ˙ö˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ö˙˙÷ü˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ŝ˙û˙ò˙˙ŭŝ˙úû˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙ŝîù˙ĝû˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŭġ̔Œ˙ü˙˙üö˙˙˙ĝŭ˙˙òîġĊ˙ ½˙öú˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙˙˙˙ŭ˙Ïéï˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝ˙ġĝŭñßÊÉŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ô÷˙ú÷í˙Ûĝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ò˙˙ö˙˙ùô˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ùŭŝ˙˙ú˙˙ġ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙ó˙˙ôĝù˙ŝü˙˙˙ûüù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ñ˙˙ú˙ù˙ü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îŝ˙ú÷˙˙˙˙úıü˙üó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ôŭ˙˙Ó˙˙˙˙÷ŭ˙ûú˙˙˙˙û˙û˙˙˙˙˙˙˙˙˙ŝ˙ùû˙ŭ˙˙ŝŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë÷úžİ˙ùñ˙ŝ˙ù˙˙˙˙˙˙˙˙ġ˙ŭ˙ûì˙˙˙Í˙öúü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùͳ)3›ü˙˙ùü˙˙˙ŝŝŭù˙˙­ )óü˙˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ù÷˙˙˙ ˙˙ŭŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ñĝ˙ü˙ 0˘Ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙×ͨž(£š˙ġñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ÄŞ·Û˙˙ŭ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝö˙ü˙˙Ċú¨œ˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙üü˙û÷ŭĝŭ˙˙ŝÎûò÷˙˙˙ġ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙ü˙ż“˘Ħ™˙ù˙˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ë˙˙ÈŒ°Ĥ£û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭîĝùüġŝ˙ĝŭùÜ£¤˘–˙˙í˙˙˙˙˙˙˙˙˙˙ù˙О£ö˙˙ŝ˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙œ"%!Ò˙û˙û˙ŭ˙˙˙˙˙˙˙˙˙öŭ˙ù˙˙#0£˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òê+"  ê˙˙˙úŭŭ˙˙öû˙ġ Äâ Ö˙˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝü˙ôÊ! ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òñ˙˙˙ż  ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ĝÑ÷—" Ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙Ò % *Èñ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúŸ´&ò˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙öŝ˙ŝ˙ŝ˙˙ŝé˙˙ġ˙ġöû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙öĵ1 ™öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŭû˙˙ž$.&žûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙˙ñ˙ĝ'5“ĝ˙˙–š˙ĝ˙˙˙˙˙˙˙˙˙˙ŭ˙›*Í˙˙ù˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙™.! •˙˙ĝü˙˙˙˙˙˙˙˙˙˙˙û˙˙÷˙Ĉ) ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ìó˙˙ö˙ŝ˙ôĝ˙˙˙ı-%˘÷ìÖ ,Œ˙ĝ˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûû˙˙í´÷˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝìúôŞ4‘ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙%  üò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ "*'ñ˙˙ĝùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ 0Ŭ˙ùúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙û˙ç˘ )†ŭ˙ŝŝİ(Œú˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙ûú˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙ú–% #˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ñ"".”î˙˘ú˙˙˙˙˙˙˙˙˙˙ŭù˙œĤġ˙ó˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô!­ŞŸ÷˙ù˙ġü˙˙˙˙˙˙˙˙ü˙ó˙ŝ•& (ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù ˙Ë£Ùü˙˙ŭĝ˙ŭ˙˙˙˙ò˙­ ü˙˙ù! "˙ú˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭû˙ŭ#š˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙˙˙˙û ¤˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙•Ÿ˙£Ĥó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¤ ˙ùŭû˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝž ż˙ŭ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙˙Ĥ (ûô˙ž #˙ï˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙—Ñû˙÷˙˙ùŝ˙˙üŝŝ˙ú˙˙ó˙˙û˙˙˙ú˙ú˙ŭ˙ŝŭ˙ŭùû˙ú˙˙ò˙˙˙˙ú˙˙üĝ˙˙˙˙˙˙˙˙˙˙˙˙û˙˙Ÿ%ÈÌÓ òÑ˙ùûô˙˙ñ˙ú˙ù˙˙ġ˙˙˙˙÷˙˙ûó˙ŭ˙ö˙˙˙ó˙˙î˙˙íĠ$ Ħü˙û'Ħ˙˙ô˙˙˙˙˙˙˙˙˙ûù˙ )Ÿ˙û˙÷úù˙˙ú˙˙˙˙ì˙ö˙üú˙ô˙˙—œ˙˙ÀÒ˙ö˙ô˙òĝ˙÷˙˙ùŭô˙ôï˙üŝÖ¤ÒÍ֞ ˙ü˙üŝ÷˙˙˙˙˙˙÷ù˙ùŭ˙î˙ùû˙˙˙ŭ˙ô˙ŭ˙˙ĝ˙ü˙ö˙˙÷˙˙˙˙˙˙˙˙˙÷˙˙÷ŝ˙ûŭ÷˙ùü˙ĝ˙˙ù˙˙ô˙˙˙ü˙Ñġ˙ù˙˙˙˙˙˙˙˙˙˙ŝü˙ï›˙ĝù˙ ˙ŭ˙üĝ˙˙˙û˙ŝù˙˙˙ŭó˙˙ŝ˙üñ˙˙û˙üúŭ˙˙ì˙ŭñ˙÷˙ö˙ĝ˙˙˙÷˙öŭ˙˙˙˙˙ĝ˙ü˙˙ó˙ú÷˙˙ŝŭ˙ò˙˙˙˙˙˙˙˙˙˙˙ûú˙˙˙˙˙˙ĝú˙˙ò˙ŭĝ˙˙ŭü˙˙˙ŭù˙ŭñ˙˙˙ùú˙˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭù˙˙ŭ˙ġ˙˙˙˙˙ú˙ĝ˙˙˙÷˙ŭŝú˙ö˙˙ú˙˙˙˙˙˙˙˙˙÷˙˙û˙˙˙úÍÑßġŝ˙˙ùŭ˙ŭú˙˙ë˙˙ĝ˙˙ġ˙ö˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙ô˙úÌĠ˙ġü˙˙ŝŭ$$ùŭŝ˙ŭ˙ö˙˙ö˙ü˙ú˙÷û÷˙˙ö˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òö˙ŝ˙˙˙ô˙ûî˙ŭû˙í˙˙˙ó˙ĝŭ˙ŝ˙ô˙˙ûú˙ŝ !Êû˙˙Ì!ü˙ö˙˙ĝ˙˙ôû˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙÷˙˙÷˙÷˙ô˙ŭĝú˙˙î˙˙üü˙Ô" !™ü˙ö˙˙ô˙˙˙˙˙˙˙˙ŭ˙˙î˙ûú˙ŭ˙üÈ Ü˙úŭö˙˙ú˙˙˙ŝü˙ŭ˙ù˙˙ó˙˙˙ñ˙ó˙üû˙ú˙ŝŭ˙˙˙˙ù˙˙ġ˙˙ô˙˙ŭö˙ò˙˙˙ú˙ú˙ŭô˙ù˙˙˙ŭ÷ú˙ú˙û˙˙ü˙˙ó˙ Ÿ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üó˙$Ïú˙˙˙˙˙˙ġġ˙˙˙˙˙í˙ö˙˙ù÷˙˙˙ŭó˙˙˙üû˙˙˙˙˙˙˙˙ü˙ëû˙˙˙ċ˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙íġ! Ù˙˙óĞ’Ġ˙˙ëû˙˙î˙˙˙˙˙˙ô˙˙ôŭ˙ü˙÷˙˙˙÷ŝ˙ŝûñ˙ŭ˙ĝ˙í÷˙˙ġ%%˙˙˙í˙Ħ ˙ġ˙˙˙˙˙˙˙˙˙˙úùôĜ­ĥüüŝô˙ú˙ò÷ŝ÷ú˙ú˙˙üûŝŝŭ˙˙˙ġ#öú×˙˙ü˙÷öŭ˙˙û˙òü˙˙˙ó˙˙ĝ˙ü‹# Ñ˙ġ˙ĝŞġĝ˙˙˙˙˙ŝè˙öó˙˙˙ê˙˙ó˙ġ˙˙˙ġ˙ŝô˙ûŝü˙˙˙˙˙ŝŝ˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ñ˙˙˙˙˙˙ŭû˙˙ê˙˙óö˙˙˙˙ôü˙˙˙˙˙˙˙˙ĝú˙é˙÷!¤˙ŭ˙ŝĈŞ˙ŝ˙˙˙ĝ˙ù˙˙ġ˙÷ûü˙ŭ˙ċ˙ù˙óí˙öü˙ùĉ˙˙í˙˙ï˙˙÷˙˙˙òü˙˙˙ûü˙˙ŝô˙ü˙òġ˙˙˙ì˙÷ŝô˙˙˙˙˙˙˙˙˙˙ç˙û˙˙”È˙ġû˙ŝ˙˙ŭ˙˙î˙˙ùú˙˙˙˙˙ú˙˙ûö÷˙˙úŭì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙ú˙˙˙˙ù˙ê÷˙˙û˙ô˙ùŝ˙ù˙ò˙˙ì˙ö˙˙˙˙˙˙˙˙˙˙ŭü˙˙ŝ˙˙÷ë˙˙òó˙˙ö˙˙ì˙ôùüŭ˙ù˙ú˙˙˙˙˙˙˙˙˙˙ŭö˙˙ß˙ñ˙Ħ%ñ˙÷˙˙˙˙)ì˙úö˙÷˙˙òôŝ˙ô˙÷ö˙˙ç˙˙˙ü˙óö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġô˙˙üô˙ïò˙˙ġ˙˙ŝ˙˙˙ü˙ô˙ŭ˙ëù˙˙˙ô˙ŭ˙¨! Ï˙ú˙ĝ›˙ì˙˙ú˙ê˙˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġġ˙˙ĝŝ˙ï˙˙˙ñò÷˙ö˙˙ŝ˙!Ñŝò˙˙ù˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙û˙í˙˙üŭ£!ĥìú˙˙ŝ˙˙ñü˙û˙üè˙÷üŭ˙˙÷òï˙˙˙˙˙ĝ÷ŝ˙ŝûŭùöû˙˙î˙˙˙üû˙˙˙˙ù˙ûüò˙ë˙˙˙ì˙˙ġú˙˙˙˙˙˙˙ü˙ëĝ°#û˙éĤ˘ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝġ˙óĝ ' Üú˙÷òòúŭ˙˙˙ôö˙˙˙˙˙ï˙ŝ˙˙úü˙˙˙ŝ˙ûû˙˙˙˙ŝŭ˙ùú˙û˙ŭó˙ö˙˙˙˙ŝ˙˙˙˙˙˙˙˙÷ü˙İ $Ÿú˙ù˙˙úùóġ˙˙ù˙˙˙˙÷ó˙û˙ùü˙˙˙ô˙˙˙ï˙ûüġ˙˙˙û˙ŝûġ˙˙ĉ˙˜ öŝ÷˙Ü#ö˙˙˙˙˙˙˙˙˙˙ó˙˙÷˙û˙˙˙ó˙ġ˙í˙˙˙˙ó˙öŭ˙ö˙÷˙˙˙úġŬ ˙˙˙òŭûġù˙˙˙òú˙ñ˙÷ô˙˙ġ˙˙ġ˙(úò˙˙˙óŝ˙˙˙ìû˙˙˙˙˙ü˙ŭ˙ġ˙ó˙˙˙ôŝĝ˙˙˙ŭ˙Î˙˙˙ú˙ô˙ŝú˙ŝ˙˙˙˙˙˙˙˙˙ŭ÷û˙˙é˙˙ġ˙ĝ˙ûï˙˙˙ŝ˙÷˙ŭ˙ü§$˙˙˙˙˙˙˙˙˙˙˙˙˙˙ç˙öĴ Ħñŭ˙˙Ôô˙ë˙˙óŝû˙í˙˙î˙ŭ˙ïö˙˙˙úĝ˙˙˙û˙ċ˙ä˙ò˙˙ó˙öĝ˙û˙ö˙˙˙î˙˙üüö˙˙ö˙˙˙˙˙û˙ŭ˙˙ù˙ûè˙˙˙˙˙˙˙˙˙è˙û•,°ġ˙í˙˙ŭĝüġ˙ìñ˙˙˙˙î˙˙â˙˙˙ú˙û˙ù˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭ˙û˙˙÷˙˙ôÔ˙˙˙ùô˙˙ü˙ŝ˙˙ġù˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝöù˙ĉ˙˙ŭ˙ú˙˙˙ŭïöú˙˙˙ë÷˙û˙ïú˙˙˙˙˙˙˙˙˙˙óë˙û˙ï˙˙öŝò˙!˙ç˙˙ŭó÷˙˙í˙˙ŝ˙ü˙úôçó˙Ñ˙ŭ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝ˙üż˙˙˙òŝ˙ŭûŭï˙úï˙˙ŭ˙ŭ˙˙ùü˙˙˙ĝ’(§úò˙˙û˙ù˙ġ˙˙û˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙÷û˙˙˙˙ûĝ÷˙˙ú˙úìüŝ˙•$˙ŭ˙î˙ŭû˙˙ŭù˙˙˙˙˙˙˙˙˙÷˙ú˙×Ûî˙˙˙÷˙œ˜˙˙úí˙ĝ˙˙ŝùù˙˙˙úŝ˙˙ü˙˙˙˙çô˙ò˙˙ŭŭ˙˙˙˙˙˙˙÷˙û˙éú˙ŭ˙úñüö˙˙ù˙˙˙ò˙˙ú˙˙˙˙ü˙ò÷˙ġ˙í˙˙ùó ˙˙˙˙ Ĵô˙öü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ûù˙˙° "˙˙˙˙˙˙ŭŝ˙ŝù˙ù˙ŝ˙ùö÷˙ô÷˙˙˙˙ôöŝŭŭ˙˙ŭüŭû˙˙˙˙˙ŭŭŭŭ˙÷ûŭü˙˙˙˙˙˙˙˙˙˙˙ĠĞú˙÷÷û˙˙˙˙ù˙ù˙ŭÚñ˙˙ŝ˙˙ô˙ô˙ġü˙÷ù˙˙ŝ˙˙˙üó˙˙û˙ŭ˙ĝĝ˙ñߨ˙˙˙óğ˙¸ü˙˙˙˙˙˙˙˙˙ôö˙ġÍòĝ˙˙ùüŝú˙ŭú˙ùù˙ĝ˙˙úï˙˙úù˙ó­˙ŝñ˙˙ü˙˙ôñŝ˙ŭùòù˙˙ôú˙ó˙ü˙·ò˙úô˙˙˙˙ë÷ŝ˙˙˙öúĝÂÈÚ˙˙ô˙úġ˙˙ú÷ŭû˙ĝöŜ÷Ċĝ˙˙ġûŝùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙ŝÔÒĠÒó˙˙˙˙î˙ñ˙’ $˙ó˙˙˙˙˙˙˙˙˙˙û˙˙Ô#ĥê˙ôñ“Íċß½˙û˙ûÚÙú˙ÄÄö˙öä˙ĝĝûÊϽ°×ŝü˙é˙˙ĜÏË˙ĉ˙ÎÌÒë˙˙˙˙óü˙˙˙Úĵö˙ô˙˙˙ëŭ˙˙˙˙˙˙˙˙˙˙˙ë" ˙˙˙˙üñ˙ö×ûĦ#Ú˙úü˙û˙Ò³  á˙ò˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ĝŬÌĊĠÑĠŝ÷˙ŝ˙óñàĜŽÍÙ˙˙ü˙˙ô˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙û˙˙íġ˙˙ŭ˙ö˙ò˙˙ġ÷òŝ˙˙˙˙˙˙˙˙˙úŭ˙˙˙ó— ˙ûġ˙ŝ˙Ѩ˙˙˙ü˙˙˙êó˙îû˙˙óŭ˙ÌŜîŝö˙çú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙îù˙ÌÊ×ÓÚî˙ŭ˙˙ĝò˙ôÎÎÍüŜ˙˙ô˙ŭöö˙ ˙˙îê˙˙ó˙ü˙ŭùî˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙û˙˙˙ĝ˙ï˙˙ë˙˙é˙˙˙ĝü(œ˙˙ö˙ġŭ˙˙ĝĝ˙˙˙˙˙˙˙˙˙˙˙êŭâ ˙ġô˙˙ôĴ%š˙ú˙˙˙˙ó˙ü˙˙˙óï˙˙÷˙˙ü˙ê˙˙˙˙î˙ĝ˙˙˙˙ûŭüġ˙ŭ˙ŭ˙˙˙óĝŝ˙˙üü˙˙ôĝġ˙ŝü÷˙˙˙üï˙˙˙˙ŭĝ˙˙í˙˙)%˙ĝñ˙ Öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ŝ˙ĊÛûĝ÷˙ŝ˙˙ġĝ˙˙ŭ˙ò˙ñ˙˙˙˙˙ú˙÷ù˙˙˙ü˙˙˙üü˙˙˙úĝóŭ˙ñ˙˙úô˙üŭ˙ü˙˙˙˙˙˙˙˙î˙ŝÄ% ˙û˙˙ù÷ùü÷˙˙ġ˙ĝüúó˙îŝ˙˙ö˙˙˙òü˙˙ò˙˙òü˙˙û˙˙˙üé˙˙÷üúô˙˙ò˙Ŭ* ›˙í˙˙˙˙˙˙˙˙˙÷˙˙ô˙ö˙ŭ˙˙˙ŭŭŝ˙é˙˙˙˙ŭ˙ġ˙˙ŝ˙ŝŭŝßçŝ˙ùùü˙ù˙ùü˙üġ˙ĝ˙ü˙í˙˙ò˙ñ!$˙û˙üñ˙ġ˙˙˙˙ŭġùŝ×!úáçŭ˙öñÎ*Ħ˙ö爰$ ×˙˙˙˙ŝŝ˙ú˙˙˙˙˙˙˙˙ŝúġíġ˙˙îŭÇİ%"%¨Íöòú˙˙˙ŝ+ ß˙˙˙˙˙˙˙˙˙˙˙û÷É ½˙˙Ġž) ŝ˙Ô#Ħ¤!:˙û˙ĝĠ'˙ŭŝùĤ*Áü˙’!+!Ĥ˙ö˙˙˙˙š ݚ˙›#œÖ˙˙˙˙˙˙˙˙˙ġŭ(*!˙÷û˙ĉ"$ ˙û˙ü -Ÿù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙˙²!&Ĵú˙ò˙˙˙!" &ÌŜ˙˙û˙˙˙˙˙˙˙˙˙˙ŝûĝ˙˙ìŞ …³Ñó˙˙ĝÓ²#˙î˙˙˙˙ŭ˙˙˙˙˙˙˙˙ï˙˙äŭŭ0Ç˙ŭ˙û˙˙—!ŸœŻ š˙˙˙ó˙˙ĝ˙û˙ÇŻ˘§­ġ˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙‡+" Ï÷˙ïì˙˙ġ (ĉ˙úô˙˙ŝ˙Ġ ( Îûĝö˙˙î˙óöż­ŸËÂ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙ö˙ġó˙˙÷˙ó˙˙˙˙ô˙˙í˙Ç"¤˙÷ö˙˙˙˙úû˙˙ü˙˙˙˙˙˙˙˙ûô˙š"˙˙˙ŝò˙ˢË˙ï˙òö˙ŭŝ˙ġü˙˙ġ˙˙ü÷÷˙˙÷ŭ˙ŭ˙ŭŝ˙ŭ˙˙˙˙ŭÜ˙ö˙˙˙ŝò˙˙ûĝŭ˙˙˙û˙˙˙úóì˙óò˙˙˙ŭùó÷ŝ˙úĝ˙úÒ ö˙ŝ˙Ċöŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ô˙˙Ñ"Éŝ˙úú˙ôü˙˙û˙ŭ÷˙˙ö˙˙ö˙ö˙ŭ˙ûóúú˙˙˙˙˙˙˙î˙˙Ô£¤šĞ˙ï˙˙˙ŝü˙˙˙˙˙˙˙˙˙ŭ˙/‘˙ú˙ŝ˙˙ù˙˙˙ä˙˙Ĉ§Ö˙÷˙˙šĦ¤ĦÈñ˙˙˙˙öŝù´œĦ¨›Ÿ”ñ˙˙óòï˙Ş˙˙˙ë˙ÇÓ˙˙ŭ˙˙˙˙˙˙˙˙˙÷ŭ˙ȘİĊ˙îûú˙×´+Ħ˙Í %¤Ôŝ˙˙˙Áâ—Ġ˙˙˙ëŝÉİ˙ï˙˙™šË˙ú˙˙ŝ˙" ˙ó˙˙˙˙ú˙úû÷˙úÉ!3”˙ŭû˙Ó$›ž™ê˙˙ŭ˙˙˙ü˙˙˙˙˙˙˙˙ŭ˙˙˙˙óè İ×˙÷˙ü !Ì˙˙˙˙˙˙˙˙˙ĝ˙˙Ù !£˙÷ê’*°ûöŭ™! &&˙˙ò­!  Ô˙ŝž' %ž˙” ›˙˙ù˙íž 'İö˙˙˙˙˙˙˙˙˙˙ú "¨˙˙È +(û˙§ ,"Żŝĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ïžË˙ù˙”( 1˙÷˙÷˙˙˙˙˙˙˙˙˙˙ŭŭŭ˙ü$›˙ùŝù$  £ú˙ñ˙ûŭ˙˙˙˙˙˙˙˙ŭ˙ù˙˙  +#$‰˙˙öĤ!  +˙ŭ˙˙ó˙Ô¨' ĝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙Ê(!Ż˙Ñ˙Ä(’˙ĝ˙û˙œ' ˙˙˙ûïú˙ÛĴ)Ĵéŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ùĝĝ˙ù˙ž#˙ñ˙˙ŝüï˙Ĉ´ ˘ÌĦüööôú˙˙˙üú˙˙˙˙˙˙˙˙ŭà›(˙ÛĈ˙û˙Ä'"Ĥ˙ÒÙû˙ŭŭ˙êŭ˙á˙ı½–Ĵ§ûñ˙ĉ˙ñ˙û˙˙û˙˙˙˙ĉœÏù˙˙ì˙÷òÀ³Ïñ˙ü˙ŭùûĝû˙˙˙÷˙˙ö˙ÏÉŻĴ—ŭ˙˙˙˙ê($ŭ˙˙úĜ-˙ú÷ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ñù˙ŝÈ+šĊ×ÏÎÍ×ŭ˙ĝ˙ûÌİÛÀ˙Ÿßû˙”(¨˙˙˙ŭ˙˙˙˙˙ŭòáħ/  3Ê˙ò˙˙ö˙˙˙˙˙˙˙˙˙Ĵ*Ò˙ŝ˙óŝòÇÖûúĞ%, ûË˙7'—˙ïô˙˙Ÿ" 1Ó÷˙˙˙˙î‘ òú˙˙˙Ĝ" ˙÷ù˙˙˙˙˙˙˙˙ü˙˙žò˙ŝŭ*"ĝ˙˙öñ/  ú˙û˙&Èŝ˙ù/ĝ˙˙ä˙İ #ĥĝ˙ĠÁ  ù˙˙í˙˜˜Ş› $ ġüġ%$('%´úŝĝ˙ŭŝ˙˙˙˙˙˙˙˙˙˙üöóöŝ²$— ›! ˙ûû÷Ï.$ô˙˙˙˙˙˙˙˙˙˙èí! *ž˙ü˙ڈ%+ċ˙ŝ˙˙˙˙0£"úĝ× љŞ›˙˙Σ-Òô˙Ú' *·˙˙öĤ!¤ÒÈ' %ôú˙˙˙˙˙˙˙˙û˙("˙ü˙ÉŬĝ˙ ŻèĦ#(ċ˙Ì#ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö.'Ĥž &Á˙ü˙+ İ˙ó˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙òŸ'—ŭ˙˙Ñ+˘" üÎ˙ö˙ù˙˙˙˙˙˙˙˙˙÷˙˙É '·˙ö˙›%"#!˙ò˙˙ó &!*.òü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ žÉ ŝ˙÷£Ô2Ħ÷ï˙˙)# ĝ˙ó˙ù˙ÔœÈĞĊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝñ˙˙ß.   Óû˙˙ŭ¸˙˙˙˙˙ûòú˙˙˙˙˙˙˙˙˙ú ()9ì˙ŭË!Ğŝ ò˙˙ġç˙œ.+!˙ùĝ˙î˙ú˙˙˙úġñ¤+ "š˙Ġ(–˙˙Ğù˙ŝ˙Ô˘"Ĥî˙ŭŝ˙™ûî˙úŸ~˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙òΟ!—˙˙ê˙Ì Ϥ,("—Îù˙˙˙üŭ˙˙ñÜ#Ÿ"˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙ %§ĝÏŝ˙ĝ˘&š ˘"$Îû˙Ĥ˙È%ŝ˙ŝò˙ù­ ˙ġ˙˙úûĦ˙û˙˙˙˙˙˙˙˙˙ŭüÏ )Ï˙ò˙ Ù˙”!žú˙û˙!Ĥŭüö×üŝ˙Ò ˙˙÷˙ŝ˙ÓÚĝÖ˙‹+˙˙Î˙§Ó˙˙˙, ÛüĜŸšü˙ü˙úĝ˙˙˙˙˙˙˙˙˙ŭ˙˙˙ú˙! ˙è˙˙Îŭ˙˙˙İ £ö˙ŭ˙˙˙˙˙˙˙˙˙ë˙˙ĊĦ§ô˙ŭŻ˙ùŭŝù˙˙ñ¤$ÙüÚÍ˙˙˙˙˙˙üŝÉ % šÜ˙ò˙ "Ħ˙ĝù¤ )"ĉ˙ù !Ùñ˙˙˙˙˙˙˙˙˙˙ŝ"”˙÷Í!šĴ—-Ç˙£—Ÿ˙ŝÌ#˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ïŭ#£ü˙ĝ˘## Êû˙ö˙˙˙˙˙˙˙˙˙˙ù˙˙ö˙˙̧˙˙˙Ï"Ñ˙ü˙˙ĝ˙˙˙˙˙˙˙˙˙ö˙˙ú˙”£ŭ˙ë˙ġĤê˙˙ÈĞ÷˙ö˙'% ˙  !˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž 0À˙˙Ë&Ïö˘ž˙ù˙ŭ˙˙˙֔ %Ħüû˙˙ù˙Ô÷˙Ž"˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ñ² %œ#áñ˙üʨĦ˙ûüûü˙˙˙ŝ˙˙˙˙˙˙˙˙× "#ŝŝü˙–Ĵ£+¨ú˙÷˙˙  œš ˙˙ġ˙˙ûûû˙˙˙˙¤ +ŭ% !š˙Ó$ Ôŭú˙ĥ#ȝ"§˙üŭ˙ ˙˙û˙Ò³÷˙ü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŭ˙ÄÖ›˙˙˙Î!нÛ!£û˙˙÷˙ùŭ˙˙÷˙Ħ—˙ü› Ï˙ŭ˙˙ü˙˙˙˙˙˙˙˙˙ï³Ö˙˙˙˙ú£ ˙Ħ* ˙ÑÈ! ˙÷ù(ûù˙¤ŝ˙ûû˙˙Ÿ˙ó˙˙˙ß!˙˙ü˙˙˙˙˙˙˙˙ġ˙ŝÍûú˙ï˙,%÷ö˙˙–# Ĵö˙˙˙ïĠÖÖĝ˙ûñĴ $˙ûŝ˙›!˙ú˙˙Ĉ!" ġ˙ôÍ Ħü˙˙˘Ċ˙˙˙÷Ĥ “û˙ŭœ Ë˙˙Í ˙˙ŝŝ˙ë˙˙˙˙˙˙˙˙˙˙÷˙üÈÛĦ˙û˙ôÚ˙ŭŭ˙¨ $˙ò˙˙˙˙˙˙˙˙˙˙é˙˙˙œĦ˙ò˙üË#˙˙ŭ˙û˙˙˙Ħ˙˙ĝĜ˙ñ! ›˙ßï˙ü˘ġ˙Ċ àû˙˙ò# ˙÷˙›ħŝ˙˙ÇÓĈ˙˙ô˙˙˙˙˙˙˙˙˙û—!$ÉÊÜúú$ ' ˘ñ˙˙ŝô˙úÖ& Ó˙ŭü˙ì˙˙˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙̟˙˙ü˙˙˙÷˙ŝ Şö˙÷˙û˙˙˙˙˙˙˙˙˙ŭó˙˙˙ù ˙˙ùÒ'*$Ż÷˙˙ĝ˙˙ú˙˙˙˙˙˙˙˙ú˙˙ù˙ĝ˙ŝüŝü˙û˙˙˙˙˙#œù˙È˙( %˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§˙˙ϤÓúû˙ĉ˙ !˙˙ŭŭ˙Ë%ë˙˙˙Ù ) (Ş˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙)Ù˙˙îŞ˙˙ê˙ÄÑú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üË#˘ÓÒĝ˙˙ġÚ  ˙ġ˙˙£˙ô˙˙ÍàùŬ¤Éŭ˙˙˙ô˙ú˙˙˙ûŸû˙ÔÓ˙Ï" Ô˙˙ÏÇ˙˙§$Á˙˙÷Ï&˙ûî˙Ö+ô˙ġ˙ŝù˙û˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ûú " ×˙ŭü!î˙˙Ğ !×˙ĝ#ó˙˙ñ˙˙˙ŭüóá Ġ˙È˙ ˙ú˙ŝù˙˙˙˙˙˙˙˙ŭŝû¤ü˙ċ˙˙ü!Ò˙ñÜ $$&ó˙˙™**î˙˙ƒ#ù˙ŝ˙œĝ˙˙˙÷úĞ!$ò˙÷ù˙Ä)”ò˙˙˙˙˙˙˙˙˙˙˙ë˙˙’ŝ˙˙û˙(—˙˙ûì.ôÔŭ÷˙¨!œüñ˙˙˙˙ ŭ˙ŭïĠ™˙˙˙˙ùžŞ˙˙˙ĠÑ˙˙×˙˙˙˙ò˙—.˙íû˙˙˙ŭŭ˙* ĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙Ħ& Ï˙ü˙úô™!ġü˙Ô´ŝ˙û˙˙˙˙˙˙˙˙ù˙˙÷Á›' ˜˙˙˙˙Ë"Ú˙˙ô˙ĝ˙ï· -žŭ˙˙ûŭ˙ 7Âëí˙˙˙˙˙ô›¤ĉĜ˙ü˙ Ġô˙ÏÖÉé˙˙ Ż˙˙î˙˙˙˙˙˙˙˙˙˙ó˙˙ #Ïàċ˙Ŝ!Ÿ›Ğ¤‘Ĝ˙ŝ˙û˙ġ˙Ôñİ'#žŝÔû˙ĝ˙ù˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôï˙˙˙ûë˙÷˙."ıè˙˙ô%'"Ö˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙ùôÙñÑ% Êĝŝ˙™*%% ‚˙üü˙ùû˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ì!ü˙˙˙úŝ˙$ Ĝ˙˙ó˙˙·˙Ê˙Ò "# ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éÚ!¤˙ŝüú˙˙ŭ˙÷˙˙ôòÜ˙˙÷$úÂĝ˙ùÈ+—ŭ˙ú˙" ,)&—˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ë%-İŭŭû˙îô˙ġŭ!Ó˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‰(%Ĥòü˙ûü˙öĠ˙˙Ì Ü˙ĉ˙ĦĞö˙úû˙˙ŭ˙üĝ˙ô $×˙˙Ï÷ü˙  ˙ġĝ%˙Ë˙•İô˙˙’"÷˙˙ŭ›+µ˙ñ˙ù˙˙˙˙ì˙˙öò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭò(!ĵ˙˙öĤ(ĤÓŝ˙Œ ˙Ĉ—˙˙ò˙ú÷˙ŭ˙˙ĝ˙áúĝ˙÷ì#Ú˙ŭ˙˙ŭ˙˙˙˙˙˙˙˙˙ŭ˙!œ˙˙˙ŝ˙ú%œ˙˙ŭ˙Á0ÁúùĝÛÂú˙˙ù˙˙ìô#ĝĝù˙˙ö˜" ˜˙˙˙˙­˙ŭ˙˙˙˙˙˙˙˙˙˙÷˙˙²˙ġ˙ì²Ĉ˙˙ú˙§ŝ˙ú˙Ì ˙˙˙ûêûÙŭŝ˙Χ˙í˙ô˙ñ! ûġ˙ò%Ïú÷,”û˙˙î˙öÇ"È˙ĝß $#ùĝ˙˙˙ Ë˙û˙˙ŭü˙˙˙˙˙˙˙˙öĝ˙˙˙žó˙ġû˙˙­&˙˙ù ñ˙˙˙˙˙˙˙˙˙˙˙û˙˙˙´ ˙ŭâŭ×˙ú˙˙˙˙Ù÷˜ #Ê˙ġ˙ûöê$"š˙˙˙üò˙%Éñ˙Ş˙˙ü÷ü%Ô˙úÑċ˙˙ŭó“˙Òĝüö˙˙˙˙˙˙˙˙˙ŝĦŭö˙˙ùĴú˙Öŭ˙˙ûÇöĝ˙úá˜!  $˘ö˙˙úûùú˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙úÂÚٔĤ šĝ˙û˙Ĵ/!˜î˙˙ĝ˙˙˙˙˙˙˙˙˙ò˙˙ŭ˙ù˙Ĝ)˙ŭ˙î˙ !0žù˙ú˙ó˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝâ˙˙˙ùú˙ÍÉ˙ü˙ïú)“˙ù˙¤ ù˙˙˙ìÒĠ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È #–ùù˙˙úé˙è˙˙˙˙˙˙÷˙Ÿ Ġ˙ü˙ġûâ ˙ó˙Ä# §#Ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝŸ !üÖûüŝ˙ "“áĊô˙  Ê˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙° Ÿ˙˙˙üü˙ì ġ˙ŝŝŭ !ï˙˙˙$ % #žĝ˙ùù˙ŭ˙˙˙ô˙˙ĤÈ˙ĝĈ$˙δ˙ù˙ŝ#% şè˙˙!#(Ÿ˙÷˙˙›´ŝ˙˙˙ġ˙÷ú˙˙ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙˙ĝ-Ĝù˙ú˙ŝ!Ÿ˙û˙ù/Ò #Ü˙ç˙˙óú˙ŭ˙˙ö˙˙í˙˙îÊ˙ ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô&¨ú˙ñ˙ï˙6Ÿ˙ŝüŭÜ+ Ù÷˙˙˙¤˙˙÷˙˙˙í˙° ŝ˙ġö˙˙Ô2§˙ù˙ù˙ !â˙ù˙˙˙˙˙˙˙˙˙ö˙ï÷ü˙˙û˙Ôùü˙˙˜Ż˙˙ì˙˙›½˙ü˙ú˙˙)ñ˙˙ûÓ§ú˙˙ŝóĴ)˙˙˙˙ô#/Ó˙˙#§˙˙˙ë˙ŝ+£÷˙˙ ˙˙üù˙ß˙ò˙ŭôŝ˙˙˙˙˙˙˙˙˙ï˙ĉĊš#ü˙˙ò˙úöŸ˙ñ˙™+´˙˙ò˙˙˙˙˙˙˙˙˙ó˙ûû›#ĵ˙üßŝÍé˙˙ü˙ŭòĉĦ Ĥ˙˙˙˙˙ɝ£óù˙˙˙˙" "#Ì˙ö ˙ö˙ŝÏ*›˙˙̧­ĝŝĝÜ ˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ ›ü˙ü˙"! ˙Èñ˙ŝâ˙˙˙˙È*"#÷˙ĝü˙Í'÷÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙š"˘˙ô˙ŝ$Ĉ˙ĝ˙ŝ˙˙˙˙˙˙˙˙ĝ˙üü˙˙ŝÇ$Ñûġ˙˙µ&#Ò˙ï˙ô˙˙˙˙˙˙˙˙˙˙ŭŭüŭĉ"˙üúŝ˙˙Ş’˙˙ü˙ŭ–Şüŝ˙ *Î˙˙ċ˙˙˙ŭüòü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ŝ˙ŝ˙ġ˙˙é˙èĜğ)#¸˙ĝġŭ˙Ì'"Ħô˙˙ áÏŬĤў£˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙Ì , ˙ü˙˙üĠŸĠö˙ᓠ0–˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë­ "˙îĝ˙˙˙˙Ġ˙ïüŭ˙÷"Ĉŭüš ™ÒĤĊ¤ œ¨Çí˙˙ü˙÷˙ü˙˙ûŭöß˙$ĈӘ+”ĝÎğ˙˙ï" ¤Äû˙ñúĤ½˙üûí, ò˙ÈÑÔŜÎÙÉßÑï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙û˙˙˙ ĉ˙û˙˙˙œ˙˙ï˙Ĉ& Żï˙ú˙ġ˙˙˙ú˙˙öġ˙˙˙È˘(íŭüŝŭŝ˙˙˙˙˙˙˙˙ù˙ñ%Ĥ˙ó˙ï˙û™˙ïŝò˙£0 Ñû˙˙ëĴŝó˙ŝùù˘Ÿ ù˙ü˙÷ñÌ$Ĉúù˙ŝ˙žóŭö˙˙˙˙˙˙˙˙˙˙˙˙¤ žî˙ô˙Ğ˙÷˙˙¢ ¤˙ĵ˙˙ÙĈŝü˙˙òù ü˙ŭŭןöûù˙Ì­ #˙˙ùŭ˙!û˙ñ#žô˙÷˙˙˙Ĉ*Ħ˙ŭ˙/˙úù˙˙Îë˙ûñ˙˙˙˙˙˙˙˙˙˙ö÷˙ú˙•$ûŭ˙˙˙ó˙²˙ú˙Ÿ%œŝô˙˙˙˙˙˙˙˙˙ŭ˙ùüÙĴ¨òŭ˙˙%˙ö˙í˙÷˙ŭ÷˙ġË˙• ™˙ê˙˙ġ˙ ˙ĝۙ )˙ú÷˙š$Ñ˙ġù˙Èü˙&–÷˙˙ò˙ĝ˙˙˙˙˙˙˙˙˙àñ °ŭú˙˙ĝ'!Î˙ü˙˙˙¤ ˘òÜ"$(˙ô˙˙°"ĵ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙É›,Ÿ ŭ˙ŭü˙ÒĦ£! ħ˙ê˙˙˙˙˙˙˙˙˙˙˙˙ĝŝŭ˙÷Ö # ×˙ïĜ™ ½ĝڞ%›˙˙÷˙˙˙˙˙˙˙˙˙˙û˙˙ú˙ôöû˙û˙ù›%§È˙í˙ú$•àÌ˙÷ô˙üûüŭ˙˙ġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§Ñüñŭ˙û˙ï˙˙Ï#—˙ü"Ċ˙ŝ˙úïÓ ħ˙ûùÎ$!ċŭ˙ú˙îĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝùèĝŝòö˙ġħ"¤ŭĝîİóì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—0˙˙˙˙˙˙˙Í˙ġ˙óŝš Ô˙˙˙íô˙ĝ˙ŝû˙˙ŝù˙˙ĝ˙úĝŭ˙˙˙ġóğ$–Ö$ $Ô!ž˙ö˙˙"ö˙ô˙˙ö˙˙˙ú˙˙–ħ˙˙˙ ,İŝ˙’˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü˙%&˙úĝ˙öâ( ġ˙˙öá(%˙ó˙÷÷˙ùŝ÷˙˙˙˙˙úô"ÑÓ"ùŭŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙ ›˙ŭ˙˙è˙2žó˙˙ûŭĈ"Ş˙üéŭ˙˘'ûû˙˙Ѳ Ç˙Ĉ&˙öê˙˙˙˙š/ù˙˙˙÷Ñë˙ŭ˙˙˙˙˙˙˙˙˙ŭ˙é˙²°˙ûŝ˙(÷˙÷˙× ˙˙ĝñ˙Í&¤˙ŝŝ˙˙ü+•˙ûö˙É,˙Óŝ˙ġİ •˙˙ġŝ˙*˙˙÷  İ˙ŭŝ˙˙ö¤#3ĝŝŭó" ˜˙ò˙ïû1 )ĉ˙˙ú˙˙÷˙˙˙˙˙˙˙˙˙˙ĝò˙´!˙ŝû˙ï˙Ç& ˙˙ġĦĞûŝ˙˙˙˙˙˙˙˙˙˙˙ù˙ù”( Ş˙÷ĝ˙Ì üúüú˙˙û˙—)™ġ˙˙˙úŝ˙!ŭ˙öŝϤ($ ß˙ġ΍˙ûŭ˙˘à˙ô˙Çö!Ĥ–­Êßûó˙˙ô˙˙˙˙˙˙˙˙˙˙ì˙#œüüö˙˙ï*’˙˙÷ñù˙™%˙ &"£Ê˙Ë  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙àı“˙à‘˘üûúΗ˙ŭöİ!žġ˙ĝ˙˙˙˙˙˙˙˙˙˙ŝü˙û˙˙ü#ÑŝĊĦŭ˙˙– ž˙˙ü˙û˙˙˙˙˙˙˙˙ü˙˙û˙ü!ü˙˙ï˙˙ Ö˙è˙ï˙¸üú˙"ĝû˙˙˙כ˙˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĊùú˙˙ġüû˙ĝù­%˙ëÔ# ëêú˙˙˙Ġ&”˙ú˙È $ „˙˙˙÷ĝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĵ'™˙˙˙˙ġ˙˜!Ĉ˙˙üŻ# ˙ġ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙#Âñ˙˙˙ŝìĴö˙˙˙˙ç˙Ä˙˙ġ˙ġÒóûó˙ü˙˙ŝ˙˙ŝŝ˙˙˙˙˙î($žÉ˙˙ċ˙Ŭĝġ˙˙˙˙öü˙÷§¤Ŝíí˙ ˙˙"'1˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙' ÷˙˙ü˙Ô!Ûî˙ĝ˙ù!#ô˙ô˙ġùŝŝù˙ġ˙óú˙É#“˙Ì ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝġ) £û˙í˙˙ġÁ´ïŝ˙˙ŝÓ —ô˙˙˙˙Ÿ˙˙÷˙ž4˙ċ­  ê˙˙˙ĝô˙"˙˙ô˙˙È6 ˙ú˙˙˙˙˙˙˙˙˙˙ġ˙˙ö˘ —ŭöù˙×) ˙ó˙˙˜˜ï˙˙à˙!ĵ˙˙ú˙ù˙& $â˙˙öœ*™ó˙˙ĝ˙Ñ%ñġ˙˙öš&˘ûġ˙ŬŬé˙ĝÑ' ú˙˙˙ûÄ3­üü˙ĝ˙’¸˙÷˙˙úù˙˙˙˙˙˙˙˙ú˙ŝ˙ŝú(#´ë˙˙üŝ§&–˙ìéü›!›ú˙ï˙˙˙˙˙˙˙˙˙ò˙üÓ!'›˙˙òĝ×"Ġ¨Ħñŭ˙ê™" .Îġ˙ġ˙ó˙Ħ!”ÛÍĜÌÒô˙Ü .˙˙óĦ$ ˙ò˙û˙ä”ÓÎĝ˙ïġ˙ŭ˙˙íŝú˙˙˙˙˙˙˙˙ú˙Ž(’˙˙ü˙÷˙’˙Ä˙' ˙£ŝ $ ÷Ĝ * )Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙(ĞÑĵŻ ¤˙˙’%˙˙ô–ü˙ŭú˙˙˙˙˙˙˙˙˙˙ŭ˙ò÷Ü͜Î˙˙Á! ú˙ö$Ġ˙ó˙˙÷˙˙˙˙˙˙˙˙˙˙˙ŭ˙ò$òú˙ù˙öœ"˙˙ì˙× 0ı˙öĤ ñ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ç+ Ì˙ŭ÷˙˙Żü˙ Ĥĝ˙™ " ü˙ûúĠŸ˙Òò˙$ )Ç÷ùò˙˙)“˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙#ğ÷˙˙ùÜ$˙˙ż˙œ)¨óÒ˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĤçüôŭ˙ŭà”˙öŝ˙œ'Äûŭ  žöü˙˙üÏ˙˙ŭ˙÷ŝù˙ü˙˙˙˙ù÷ŭö˙- %œ˙˙ë˙˙'Ÿ˙˙˙ú˙ú˙˙ŝú˙œ£ĝ˙˙˙  °ùóŸ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙ú˙Ô ) š˙ġö˙ԑ(˙˙˙˙ú$ß÷˙ŝû˙û˙ŝ˙˙ó˙ü˙û˙˙˙˙È˙ûŝŭû˙˙˙˙˙˙˙˙˙˙ŝ˙ÈÌ˙˙ñ˙ò˙!Ç˙ûñÙúĤ•˙ôúŭŭ§-˙˙ú×ü˙×ù˙ġ˙˙˙˙"#ûüù˙ġÚž˙˙÷˙˙˙˙˙˙˙˙˙ü˙˙¨˙˙˙˙˙Îù˙ŝò£Ô˙ùô˙ž˙ö˙û˙ò˙ËŞ÷˙ŝ!Ûŭù˙öÏ ˙Ô˙üŭÌÎŝ˙ù áŝ˙˙˘˙ûŭŭœ#ŭ˙ô˙ŭ"# É˙˙îú˙˙˙˙˙˙˙˙˙˙˙ĝŝŭ˙ËĤüŭŭ¤$˙˙˙ûž!Ĥô˙˙˙˙˙˙˙˙˙ŭ˙ŝú§œŝ˙ôÔ˙˙ñŞ$ $Ħŝ˙˙û˙ĝ˙˘"È˙û˙ġ  ˙˙ŭû &ĝú˙ġ%ŭ˙˙˙˙ù˙ûñ˙˙ú˙˙˙˙˙˙˙˙˙ùŜ #"ĦËü˙ü",&š˙ñŬ!µ’­ú˙Ï£#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öĦ%–˘#)Íħ ²ö÷×Ĥ˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙˙Í ' ĠóÙ  ĝĦüŭ˙ö˙˙˙˙˙˙˙˙˙˙˙üüŭüâ İ›˙ü˘áġ˙˙™( (ġ˙Î !˘$#˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙1˘˙ĝ˙™™ùüš#ŝÏ $÷˙˙˙Ñ&ŭ˙˙˙šû˙ŝö ¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙$ !Ĥ˙˙û˙Σŝ˙˙˙ 'û˙ô˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î" ŭ˙üŝ˙ô§˙ü˙˙˙·û˙£˘ŭ˙ûù˙œ•ĦÑŝġ˙ŝ˙ŝ˙ŝù˙˙˙˙˙ùĈ&Әĝŭŝ˙ŝ÷Ĵ.&úĝÙüû˙ĦŸ˙˙÷§¨ŝ˙˙ġ! Ò˙˙úŸĤ§¤šĠ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙ò˙×  àñ˙ü˙œ#)ûî˙ú˙˙ġ¨Ïñ˙˙ú˙˙ù˙ó˙˙ó˙ġĤĜÁ%Òó˙÷˙˙˙˙˙˙˙˙ŭ÷˙¤¤ŭ˙ü˙÷˙Ñú˙ù÷ŝ§×Çĝ˙÷¤Ĥ˙ŝӝ"ö˙ĝ˙˙ £ġ÷˙ĝœ!Ĥĝ˙˙˙˙˙˙˙˙˙˙˙˙Ü) ˙ùŭ˙ É˙ĝÓ ü˙Ŭ‹"¸˙ô˙ġ˙˙ž) !›ĤÈ" ßö˙ĝד­˙ŝ˙Ùšö˙öü $Ö $*ĝŭô˙Ĥ #Ċ˙§ §˙ŝû÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙”,' &˙˙˙˙Ò$˙˙˙˙˙˙˙˙˙˙ŝ˙üħ ’îü˙ê°!Í˙˙úŸ "˙˙˙˙˙˙˙˙İ!ÉÖû˙ö˙˙šÀ˙ûј˙˙ĝÖĝ§ɧÎ˙ŭû˙˙ġ˙˙˙˙˙˙˙˙ú˙˙Ġŝñ˙ %’üĝ˙òÜÒĦ˜Ĝ˙ô#ûĝ˙˙ô!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙Ç(× * ŭ˙ü( #•˙˙ô˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙˙Ĥ% Ÿ˙ '™# "À˙úŝ˙û˙˙˙˙˙˙˙˙˙üû˙úö˙*Ñŭó(›˙˙Í!§˙˙– # ¨˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭÇ"ŭö˙÷* &İ) ˙ġ˙ü ô˙˙ )! ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ӏ3 /Ù¤&Óó˙¤%“˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙œÔË˙˙" Ĉ˙úÁ$$˙˙ÊŬŭ˙˙Ġî˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙÷Ï"žú&Üñ˙˙ŭü˙˙+úĝ˙òİ£˙ü˙ö˙˙ŭ"–˙˙÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ü˙Ó/6ŝ˙û­ üú˙ĉ˙ûŝ˙˙à÷˙˙ú˙˙ŭ˙ö˙˙ù˙˙Í% )Ş˙˙ġ˙˙˙˙˙˙˙˙˙ŝµ£ġĝ˙£ Ĥï˙˙' ™˙˙×ì˙˙ ħ˙û˙˙)5“˙˙ï  ˙˙˙˙˙˙˙˙˙˙ô˙É +ĉü˙˘ #ĉ˙ì*"$ŝ˙'  )Ó˙ô˙êàŸ ¤É%!˙ôŭ$ *™öÓ  ˙ŭŝ˙Èĥ(¸˙˙˙ĝϞ£“›-§Ĝ˙ÏŻŸ 1³óŭ˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óĥ˘˙ä˙ó÷ñқ¤“ŞŸèû˙˙˙˙˙˙˙˙ú˙˙ݍÓô˙˙˙ĝéᜠ˙ûöû˙˙ò "˘˙˙˙˙˙˙˙˙ŝï˙­Ĥ˙ù˙˙ùĝ˙˙÷ŭü÷˙ûò˙ġŝ˙ò˙ŭ÷˙Ž !Ž˙ßï˙÷˙˙˙˙˙˙˙˙˙˙ġ˙÷$ŭ˙˙÷ÄŞ—ĞŻ ¨Ú˙ü˙ûòòÔÎûù˙œ û˙üûç˙—&%  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïר—#íĤݟŝŭô!+% &†áùġŝ˙˙˙˙˙˙˙˙˙˙˙ú˙˙û˙碘ħ’šò˙ôüŝĠĤŽĞš¨˙˙ò˙˙ĝ˙˙˙˙˙˙˙˙˙˙ö˙ĝ˙äħ—°İ˙˙˙Ԟ£°›…şġòѨ”"™ĤĈ˙ö˙Á(0%˘Íŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ǣ# ) ü˙ĝŭù˙Ş“³Ġû™³¤ë˙˙ŭ˙œ·$Ç˙ĝ˙ö¨ .* ˜ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ü˙˙˙š/'!Á˙ŝ˙ Ò˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñÛ%˘Ġ! ´üú'˙óî˙˙˙™ù˙î˙ġ˙˙˙˙˙˙˙˙˙ó˙˙ŝó˙%òŭ˙˙˙˙˙ŭ˙ —œ,‘íߝ!Ê˙ĝ˙ #ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙ü˙ôš/–Ĵ£˙÷˙˙î˙öŭ˙Ĥšöŝ˙˙üŭ˙˙ŝû˙˙ŝ˙˙öĞĜúÖ"-Éú˙ŝ˙˙˙˙˙˙˙˙˙û.& ˙˙˙*İŝúÏ  ħ­Ĉî˙’(ŭ÷ĝŞ%­û˙ĝ˙˙ë˙˙ùö˙şŝ˙ĝ˙&˙˙×ù˙˙˙˙˙˙˙˙˙û˙Ô  è˙ôÚ˙Ħ˜êöŝ˙Ę˙ôġż˙Òġíû˙˙÷˙Ôù˙óŭöô˙ï˙üż'˙ö˙˙üÈŝÉ˙ĝ˙˙˙îÁ Ÿù˙˙˙ûĝ˙úú˙÷ß˙“Ç˙˙ÏûĦ(ˆ˙˙ġúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙Ż ´ü˙ŭùû˙˙ñ˙ùû˙ëû˙˙˙˙˙˙˙˙˙˙ü˙ġ˙˙½˙ë˙ŭöü˙ö÷˙˙Ñ˙ü÷ù˙˙˙˙ùÌÑŭÀü˙˙˙˙˙˙˙˙ú˙˙˙÷ŝ˙ó˙ŭ˙˙˙ôû˙˙ú˙ûñûŝ˙˙˙˙˙˙üĝÔ %'2 —˙˙ñü˙˙˙˙˙˙˙˙˙â˙˙Öï˙ŝ˙ġ˙öĝü˙ŭÚŝŝĝŜûúùû˙ŭ˙˙ŭú˙ŭ˙ùŭ˙ŝ˙ŭ˙òÖÒ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ë˙ŝü˙˙˙˙ñú˙˙˙˙˙óż˙ġ˙Ä˙˙û˙˙ġ˙˙˙˙˙˙˙˙˙˙ĝ˙˙öŝ˙ŝÔ˙ŝŝ˙ŝè˙˙ŭú˙ô˙ŭû˙ŭó˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙ù˙ŭî˙ëï˙ùòú˙˙ôÛï˙ĝ˙˙ŝú˙ÎÌ˙ŝ˙˙ò˙˙Ĉ˙öŜù˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüÊñ˙Ù˙É˙ô˙ñ˙˙˙üóúó˙ù˙ò˙ù˙ŭûù˙÷ŭ˙Ĉ˙ú˙ü˙í˙ġñÚžüÛ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ŝ÷˙üï1Ĉŝ˙˙áä#ĦĦĞ!–˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġ˙š –¤˙˙ # ĦÂ˙²Ÿ¤¨ĝ˙âûÖü˙û˙ ' ˙ûïŭ˙˙ï˙˙˙˙˙˙˙˙˙˙˙ïÓ#˙˙˙˙Ï Í˙˙˙˙˙˙˙ú˙“"('¤˙˙% ˙ü#Ñ÷˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ûü˙˙öÑ£)!Î˙˙˙ĝ˙ë˙˙˙ĝŝÊ˙˙˙˙˙ŭ˙˙ŝ˙˙˙˙ŝŝ˙È& ˙˙ï˙+œ˙ï˙˙˙˙˙˙˙˙˙˙Ŭ˘Ĥ—ü˙ŭò˙ Ğ ˙˙˙áĞûïŝ˙˙ŝ˙˙ĉ˙üû˙˙úçù˙˙ŭŭ˙ó˙˙ûó¨Û˙˙˙ŭñ˙ҔĤÓöĉ˙˙˙˙˙˙˙˙˙˙˙ööè˙ÒєħÏ÷ü˙úá××Ëġ÷˙˙֖ÒŬĠ÷ĝ˙Ş˙˙ùŭñö˙˙˙ùŭ˙˙ÍÍĥ×˙û˙ĝŭ˙˙˙î˙˙š¤›Ĝñ˙ò˙ù˙˙ò˙üöĝú˙˙ĝú˙˙íÓï˙˙ü˙˙˙˙é˙ĝ˙ê˙˙˙ô˙ŝ˙ŭ˙òĝ˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝġ˙˙ôŭ˙˙ûú˙ĝŝ˙ö˙˙óŝá˙ŭ˙˙˙˙˙˙˙˙˙˙÷˙÷˙˙ŭ˙ûŝûŭ˙˙ŭ˙˙ìúŝŭ˙ü÷ŝñ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙ŝ˙òü˙˙˙˙˙ŭùü˙˙üĝüĝ˙˙˙˙ĝ˙ñ˙òŭġ˙Î ! %Âü˙û˙˙˙˙˙˙˙˙÷˙˙ì˙˙˙˙ò˙ä˙û˙ġúó˙˙˙ŭ˙ŭŝŭûŭ˙˙˙˙ŭ˙û˙˙ġŝ˙˙˙ŝ$¤÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ôù˙˙áŭ×˙ñ˙˙ì÷˙ĝ˙ŝ˙˙˙ññ˙˙ò˙˙˙˙˙˙˙˙˙˙÷ü˙üü˙ûüĝ˙˙ù˙ù˙÷˙˙óö˙ŭŭúŝ˙üü˙˙˙˙˙˙˙˙˙˙üĝ˙ú˙ĝ˙ú˙÷ö˙ù˙˙˙ôŝ˙˙˙˙˙˙úŭ˙üù˙ŭ˙˙˙ùġ˙˙ĝ˙ö˙˙˙ñ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭŭ˙˙˙ïê˙ù˙˙ù˙˙ú˙ù˙˙˙˙˙ñ˙˙˙êŝ˙˙ù˙˙üŝĝ˙òŭ˙÷˙˙˙˙ô˙˙ŝ˙ŝì˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ġû˙÷ߔ´ÉŻÍ˙˙ĝì˙ŝöĝŭŭê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÈĦÄ˙ôü˙˙ġϲ˙ú˙˙˙ëú˙ù˙úġ˙ô˙˙˙˙ġ˙˙Ş˙è˙˙˙ò˙˙˙˙˙˙˙˙˙˙ö˙˙öĤîġ˙÷˙ŭû˙˙˙üü˙˙˙üġ˙!$ ˙úÀ!! Í˙¤ Ġ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙˙ŭ˙˙˙ȗ­›–¤˙÷˙üŭ˙˙÷ù˙˙ŝÑ"š˙ŝŭ˙˙˙˙˙˙˙üŭ˙ü÷˙˙˙èö˙ò˙˙˙ùôöù˙üŝ˙˙˙˙˙˙˙˙é˙˙˙÷ü˙ûñü˙ñ˙˙ì˙˙ô˙˙öóŝ˙Ñ˙óï˙öñ˙˙úú˙˙˙üéÇ˙˙˙ô˙ŭŭ˙˙ĝ˙îù˙ùûġé˙ö˙˙ò˙ü˙˙˙ñŝ˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭúŝ˙ü˙ŝ˙ûŝö˙ö˙˙ŭú˙ŝŭ˙ò˙ôî˙ŝĝŝ˙˙ŝĝü˙˙ġò˙˙ċŭŝĝ˙˙òö˙÷˙˙˙˙úôüù˙ĝï˙ïè˙ĝ˙ŭ˙˙ġöû˙ŭ˙˙˙˙ñŝ˙ŭò˙ŝġ˙ú˙ñó˙ŭ˙ŭìġ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŝ˙˙öŝ˙ôü˙˙ŝŭ˙˙ñ˙ŭ˙˙˙˙˙˙˙˙˙ġ˙ôġ÷˙Ŝ˙˙˙˙ûŝ˙üŭ˙˙˙˙ġç˙û˙˙ġï˙í˙˙˙˙˙˙˙˙˙ŭú˙˙˙óġŝĝ˙˙˙˙˙˙˙˙˙˙úŭùú˙˙ŝ˙ŭ˙Ô "° & %Ğüġ˙˙˙˙˙˙˙˙˙ġ˙ó˙úùü˙ú˙˙ġ˙ü˙ŝ˙˙˙ù˙˙˙˙˙˙ĝ˙˙ĝ˙÷˙û˙˙û˙˙ û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ĝûŝúó˙ó˙ú˙˙ô˙ï˙ùïĝüûŭ˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙ó˙˙÷ñ˙˙˙öŭû˙ŝ˙öü÷˙˙˙üö˙˙ù˙˙˙˙˙˙˙˙˙é˙˙ġ˙˙˙ò˙˙ŭ˙öá˙˙˙ûû˙˙öü˙˙˙˙˙˙˙˙öŝ˙˙˙˙ŭĝŝŝġ˙˙˙ñŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙ô˙˙˙˙÷˙˙í˙ì÷˙˙˙ò÷û˙˙ŭú˙˙÷˙ŝ˙ŭß˙˙˙˙˙ŭ˙˙î˙˙÷˙òġ˙ó˙÷˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙üí˙ŭ˙˙ú˙ü˙ú˙ë˙˙˙˙˙û˙òúù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ë˙˙ü˙ĝ˙öóï˙ôû˙˙˙è˙˙˙ú˙ï˙ûĝ˙˙òô˙˙˙˙ŸŒĝ˙˙ïĝ˙˙˙ĝ˙˙˙˙˙˙˙˙˙ġ˙ù˙ÚÉ˙˙ŭü˙ù˙˙ñŭüŭ˙˙ŭŭŝ˙˙ç˙˙ú˙˙˙ò˙òü˙÷˙úĉ˙˙ŝ˙öŝŭ˙ŭú˙ĝì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙üŝ˙ŝĝ˙ŝ˙ò˙Éüŝ˙ùü˙˙˙óñ˙û˙˙ô­ ³˙ŭŭ˙˙˙˙˙˙˙û˙˙˙ú˙ö˙˙˙ŝ˙˙ĝŭû˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙ëí˙ŭù˙˙˙ù˙ñĝ˙ö˙˙˙ñ˙˙ôŝñ˙˙˙ó˙˙˙˙ü˙˙˙ú˙˙ñö˙˙Ü˙ġ÷˙˙˙˙˙ûŭ˙˙˙˙ĝŭ˙ï˙û˙ó˙û˙˙˙˙˙˙˙˙˙ŝ˙ûüù˙˙ġ˙÷˙˙ùŝ˙˙˙˙˙úú˙˙ĝġ˙ú˙˙˙ûü˙ŭŝò˙˙˙ö˙˙öŝú˙˙ûŭ˙û˙˙ò˙ĝóŭö˙˙˙˙˙ê˙˙˙˙˙ĝ˙˙˙ñ˙˙˙˙ùù˙ö˙ö˙˙˙ï˙ŭ˙˙ġŭ˙ô˙˙úŭ˙ù˙˙˙ïòùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ò˙˙ĝ˙ù˙˙˙˙˙ïôó˙ù˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙î˙˙˙ŝ˙˙ùŭûü˙úù˙òŝ˙˙˙˙üŭ˙ä˙˙˙÷˙˙˙˙˙˙˙˙˙˙ó˙ù˙˙˙˙ûü˙˙˙ĝôöö˙ñŝ˙˙˙ùŭôù˙òĴ!˙( ˙ù.¤É˙ò˙˙˙˙˙˙˙˙˙ù÷÷˙ŭ˙˙˙òŝó˙û˙ó˙˙˙òŝġ˙û˙˙˙˙ĝ˙˙ŝŝ˙˙ù˙˙ò˙&!'˘˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷˙˙üùû˙÷˙˙ŭ˙˙û˙˙˙üô˙ë˙˙˙˙˙÷ü˙÷˙˙˙˙˙˙˙˙ŝ˙˙üú˙˙˙ĝ˙˙˙˙÷÷˙˙˙óñ˙ŝû˙÷òû˙˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙÷ö˙ŭ÷ù˙ĝûê˙˙˙˙úŝŭ˙˙ŭŭ˙üóò˙˙ù÷û˙˙üġò˙˙ĝö˙˙ġó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙˙ïŭ˙ö˙˙ï˙˙˙˙ŭŭ˙ŝ˙÷˙˙öŝŝ˙ïŭùï˙˙˙ĝŝüóŭô˙˙˙ì˙˙˙˙ġ˙ö˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ñöŝ˙˙ûö˙û˙˙÷ġ˙˙˙˙˙˙ú÷ô˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙é˙óúû˙˙˙˙üú˙˙˙˙˙˙˙ŭü˙ê˙˙˙ê˙ŝ˙ó˙íġ˙˙˙ûñ˙˙úüŭ˙˙˙˙˙˙˙˙˙˙˙˙ġ˙úé˙ù˙í˙ëŝ˙ŝ˙˙˙˙ûû˙˙˙üó˙üîü˙˙˙üô˙ù˙˙ùŝôú˙ŝ˙ĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ŭ˙˙˙˙ŝ˙óÎ˙˙ïŭ˙÷ċ˙˙ĝ˙˙˙ôŬ)%Žŭ˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙â˙˙ó˙˙ïô˙ôĝ˙û˙˙˙˙˙˙˙˙ùû˙˙ùŭ˙óôù˙÷˙÷˙˙ï˙é˙˙î˙˙˙ûì÷˙˙ïú˙ù˙ü˙˙˙îĝ˙˙ĝ˙˙é˙˙˙˙ô˙ŭ˙˙ó˙˙ü÷˙ò˙ô˙÷˙˙ü÷˙˙˙˙˙˙˙˙˙ö˙ù˙ï˙˙˙ŝö˙˙˙ù˙˙ô˙˙ûġ˙˙îġ˙˙˙ù˙úŝù˙˙˙öŭ˙˙˙ûĝ˙˙óŭü˙ü˙˙ŝ˙ú˙î˙ë˙üü˙˙óùë˙ò˙÷ĝ˙ĝ˙ŝ˙ïú˙˙˙˙ô÷ü˙ù˙˙ġŝ˙˙˙ŭ˙ċ˙˙ê˙ĝ˙˙ŭ˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ùûŝûó˙ŝĝ˙˙öùù˙ù˙û˙˙˙˙˙˙˙˙˙˙ù˙˙òŝô˙˙˙˙˙˙ĝ˙˙ûúü˙öùö˙˙˙öíúŝ˙˙˙˙˙˙˙˙˙˙˙˙ġĝôŭ˙˙ŝôöŭ˙˙˙ŝ˙˙˙ùñ˙˙˙ù˙˙˙¸ħż˙ŭ˙ )Ħ˙ñŭ˙˙˙˙˙˙˙˙î˙˙˙ŭ˙òúú˙˙ĝ˙ü˙ù˙˙ûŭ˙˙˙û˙˙ŭŭ˙˙˙˙˙üú˙÷÷˙ ‘­Áù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙˙˙ö˙˙˙ŝġ˙˙˙ù˙òŭù˙˙ó˙˙óò˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙ûüùû˙˙öù˙ûù˙ŝ˙˙˙˙˙˙ġö˙˙˙˙úö˙˙˙˙˙˙˙˙˙˙ñ˙ĝö˙˙ĝ˙˙ó˙˙÷ö˙ë˙˙˙˙üöù˙˙˙˙òô˙˙˙ñ˙˙˙˙û˙˙˙üö˙˙˙ù÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝñû˙˙ú˙ĝñ˙˙˙˙üî˙˙˙î˙˙˙ó˙˙ŝñ˙˙˙˙˙òù˙ú˙˙˙˙ûûŝù˙ĝñ˙˙ë˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝüô˙˙÷˙í˙ü˙ĝû˙ó˙˙÷˙˙ŝĝġ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙êŭò˙ŝŝ˙óùĝ˙ú˙û˙˙˙ò˙ó˙˙û˙˙óû˙˙úû˙â˙˙°˙ì˙ó˙˙ëŭú˙˙˙˙˙˙˙˙˙ġ˙ç˙ïë˙˙è˙ù˙ŝ˙ïù˙˙˙˙˙ûü˙ü˙ùó˙˙˙˙ŝúí˙˙˙˙ûŭ˙ĉ˙˙ôô˙ùŭ˙ġüï˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ûû˙ŭûüúŭ˙ë˙ú˙˙ù˙˙ŝ÷˙ûŭĝâŒ!Ğŝ˙˙ŭü˙˙˙˙ŭ˙˙üŭ˙ûĝ˙ö˙ùó˙ŝù˙ûö˙˙üŭ˙˙˙˙˙˙˙˙˙ŝ÷˙ò˙ï˙˙˙˙û˙˙ï˙˙ñ˙òò˙˙üü˙˙üŝû˙˙˙˙ö˙ùŭ˙˙ŭ˙˙˙ï˙ŝöŝŭŭ˙ĝ˙ù˙ú˙÷ĝ˙ŝñ˙˙ü˙ŝ˙î˙˙˙˙˙˙˙˙˙˙÷˙ú˙˙˙öüûù˙ú˙ó˙˙˙˙˙ù˙ü˙˙˙˙ü˙˙ü˙˙˙ĝû˙üú˙û˙ġ˙˙ŝ÷˙˙÷˙˙ĝŭ˙ŭŝö˙ĝ˙˙˙˙ĝ˙˙˙˙˙ŭû˙ŭ˙˙ĝŝ˙˙˙òû˙ù˙˙ŭú˙ĝ÷˙˙˙ú˙ŝ˙ûüġ˙ŝ˙ŭú˙˙û˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŭ˙˙ĝ˙˙˙˙ûù˙ûû˙˙ü˙˙ö˙ŝ˙˙˙˙˙˙˙˙˙öŝ˙˙˙ŭ˙ù˙ŭú˙˙ŭû˙ŭ˙˙ù˙˙ŝŝŝ˙˙ú˙ŝ˙˙˙˙˙˙˙˙˙ŝ˙û˙ú˙üĝ˙˙üû˙˙ö˙óûŭŝ˙˙úô˙˙ġ˙˙ݳž›¤š˙ü˙˙˙˙˙˙˙˙˙˙˙÷˙ôŝ˙˙˙ùüú˙˙û˙ĝü˙÷˙ú˙ú˙ŭ˙ŝŝ˙˙ùüù˙ĝ˙˙ù˙˙˙û˙˙í˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ñŝ˙˙ġó˙ŭú˙ûŭ˙ûŭ˙˙ùù˙úŭ˙˙˙˙˙üŭ˙˙˙˙˙˙˙˙ŝú÷˙˙˙ù˙úŝ˙˙˙ŝŝ˙ü÷˙ùû˙˙ùô˙˙ù˙˙˙ĝ˙˙˙˙˙˙˙˙˙ë˙˙ĝ÷˙ûö˙ĝ˙˙ú˙˙˙ùúŝü˙˙˙üŭ˙üùŝúû˙óú˙öú˙ġüŝ˙˙ùü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú˙˙˙˙ö˙ùŭ˙ŭü˙˙ŝï˙˙˙÷˙˙÷˙ĝ˙˙ŭŭû˙ö˙ĝ˙ù˙ô˙˙ĝŝ˙ï˙˙üĝ˙ġġ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙ù˙ġ˙˙ĝ˙üŭ˙úŭ˙ŝ˙ó˙ĝŝ˙ûöŝ˙˙ġù˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝüö˙˙ú˙˙˙ü˙˙˙ĝ˙˙ŝ÷˙ùĝ˙ġö˙ú˙û÷˙ŝ˙ĝò˙˙ö˙ġ˙ñŭ˙˙ûŝ˙˙˙˙˙˙˙˙˙ò˙ŭ˙˙ġ÷˙˙˙˙÷ù˙˙˙ûùŭ˙ŭŝ˙û˙˙ŭ˙ú÷˙˙ü˙˙÷ú˙ú˙ô˙úè˙˙ú˙úö˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ù˙˙˙ìİ( šŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²(,#˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝöû˙˙˙˙î³(Ôú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ìŞ#˜š´ı˙˙ô˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙êş!&Éó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙˙ŝÌ÷˙˙˙˙ï˙˙üŝ˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úü˙öÍÒŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙ô˙ĝ˙ŝ˙ûîĜ˙öö˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙˙˙˙˙ûİ›­Îó˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙˙˙ĝŭŝùù˙ô˙ö˙˙ö˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöü˙Ġò˙÷˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙üĝüüĝö˙˙ê˙˙ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôù˙üû˙˙Ê˙ġ˙ü˙öĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù˙ŝ˙˙ŝñú˙úùú˙˙÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙ú˙˙üŝ˙ù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ûġ˙˙ôŝŭ˙˙ù˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙˙ŭŝ˙ŭ˙ö˙ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙ù˙˙˙˙˙˙˙˙˙ĝ˙ŭ˙ŝ˙ġù˙˙ġ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙ŝ˙ŝŭ˙ĝ˙÷ŝ˙ŝ˙˙û˙˙ù÷ŝ˙ú˙˙öù˙˙˙˙úû˙ŭ˙ô˙÷˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ĝŝ˙úŝŝü˙ŝ˙ŭ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙í˙˙ù˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙ö˙˙˙˙˙ì˙˙ù˙˙˙öú˙˙ûö˙ò˙ŭó˙ġ˙ûŭ˙ú˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ü˙˙ĝ˙÷˙ŝŝ˙ŭ˙˙˙˙˙˙˙˙˙˙úó˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝ˙ŝï˙˙ŝü˙ü˙ï˙ŭ˙˙˙˙˙˙˙˙ù˙ĝ˙˙ŭ˙û÷˙˙ŝ˙˙˙ô˙˙˙˙˙˙˙˙˙ŭ˙˙üŭ˙û˙ġ˙˙˙˙ô˙˙û˙˙˙öúûûŭ˙˙˙˙˙ŝŭûúü˙˙˙˙˙ŝŝ˙ŝû˙˙ŭûúü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùû˙˙˙˙˙˙úñûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îû˙ó˙˙ò˙˙˙˙˙˙˙˙˙ü˙úŝ˙˙÷˙˙ó˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üç˙ĝ˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝúüü˙˙˙ù˙ŝ˙˙˙ü˙˙˙˙˙˙ŭûŝ˙˙˙ì˙˙˙ùû˙˙ŭúŝĝĝ˙˙üĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŝ˙üù˙˙ö˙˙ì˙ġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷˙ç˙˙ïú˙˙ŝ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙îŭ˙˙ùûŭ˙˙ùùî˙óŝ˙û˙˙˙˙ù˙â˙˙ö˙ù˙˙÷úòġ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ĝôĝû˙ùô˙ôï˙˙˙˙˙˙˙˙˙ô˙˙ñŝóó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭì˙˙ŭ˙˙ì˙˙ĝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙öï÷˙˙˙˙˙ùôĝ˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙û˙˙ŝŝú˙˙ùĝ˙ú˙ŝ˙˙˙ŭŭŝŝ˙˙˙˙˙˙˙ŝù÷˙ŭ˙˙˙ŝùù˙˙˙˙˙ŝù÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙˙˙îúô˙ù˙˙ġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙üû˙˙˙˙˙˙˙˙˙˙˙ì˙˙ŭöŝ˙˙÷˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüüô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ˙˙ŝ˙ŝú˙ú˙˙˙ï˙˙˙˙îíú˙ü˙˙÷ê˙ù÷òô˙ôô˙í˙˙ûû˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭû˙ĝ˙˙˙ô˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙óù˙ï˙ŝ˙ŭü˙ŭĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙üŝ˙˙˙˙ùö˙˙˙ŝ˙ŝü˙öùùġ˙ġ˙˙î˙÷è˙˙ŝ˙˙˙˙˙òô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝùŭŝŝ˙˙ö˙˙ù˙öü˙˙˙˙˙˙˙˙˙÷ĝ˙ú˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òô˙ñ˙ù˙˙˙ïüôŭ˙˙˙˙˙˙˙˙˙÷˙˙˙ŭ˙˙ùö˙˙˙ŭö˙˙˙˙˙˙˙˙˙˙û˙˙˙ú˙˙˙úŝŝú˙˙ŝ˙ü˙òô˙áùöù˙˙˙ĝöĝúûúùû˙˙˙ŝûŝ˙˙˙˙ĝúûúùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭ÷˙˙˙˙˙ŭ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ö˙˙˙ŭû˙˙˙˙˙˙˙˙˙÷ŭ˙ó˙˙˙ü˙÷ŝ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íŝù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙ŝûü˙˙üÒÉÁ˙˙˙ö˙˙˙˙ŝ˙˙ó˙ĝ˙˙˙Ü˙ñ˙˙ë˙˙üû˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ò˙ù˙˙ŭÛú “ŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷˙üü˙ŭ˙˙ŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙öġôüŭ˙ü˙˙úôŭòûŭ˙˙˙ŭ˙˙î˙˙ŭ˙˙˙ŭî˙ġüöù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü÷˙˙ŭúöóò˙û˙˙÷˙˙˙˙˙˙˙˙˙˙ŭ˙ŭĝġġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙ŭî˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ú˙ûûŭ˙˙˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ü÷˙˙˙˙˙˙˙˙˙ñ˙˙î˙˙ù˙˙˙ŭ˙ŝü˙˙˙˙˙ŭüŭ˙˙˙˙üüŭŝ˙˙˙˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ûóüġüî˙˙öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙á˙˙Èû˙ĝĉèü˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ì˙ïôù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŭ˙ô˙˙˙̗Ğ-žñ˙˙ŝû÷ùٚ˙÷ŝ˙ŭóüóÓ˘  ĤÀĝ÷ŭ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ñ˙ĉ)(·Ê˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭü˙˙˙˙ùèü˙ĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙˙˙ĝ˙˙˙í˙˙˙˙ĝ˙ŭü˙òö˙ò˙ŝ˙îûŸ·ç˙˙˙ò˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ŝù˙˙˙˙îû˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙ŭ˙ó˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö÷˙÷˙˙ê˙ŭó˙˙˙÷ò˙˙˙˙˙˙˙˙˙ŝú˙˙˙˙ŝ˙ĝûŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝŝ˙ûġ˙ŝ˙˙ĝû˙˙Í˙Ïç˙÷ü˙˙ŭĝùŝŭüü˙˙˙üöú˙˙˙˙ŭùöŭüü˙˙˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙˙˙ġ˙˙˙ú˙ù˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öĝ˙˙ò˙î˙˙˙˙˙˙˙˙˙ìü˙˙˙˙˙ù! ħ˙ùŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĴÉó˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ú˙ŭú˙ĝœŞÓñ˙˙ŭü˙Ŭ•Ġ˛ÉħŻħ“(Ĥ­˙˙ü˙˙üġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ç˙˙ô˙ü3 'žú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïŝ˙˙ 1µ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ%(%+%Ş˙ûÍ /êü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùüĝ˙˙ÄË "È˙˙˙˙˙˙˙˙˙˙˙ö˙˙Ÿî˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ó˙ŝô˙ì˙ö˙ñ˙˙ŭû˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙ŝû˙˙ŝ˙˙ö˙˙ŭĝü˙˙˙˙ï˙ë˙˙˙ĝáó˙˙˙˙˙û˙ŝûúŭ˙˙˙˙˙˙ŭ˙˙˙˙˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝġ˙ûÏġ˙Ŭ˙˙ĝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙öÉ˙ŭ˙˙˙˙˙˙˙˙˙˙˙ùßŬ¨›' ’˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü–ĥú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙ŝ˙ŝœ&œŝûĝû˙ù—!,)‹ŸŸ¤Ħ ü˙ĝ˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙öĝ˙ô%ŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ (ĴéĜé˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ *#'!)"%ûÒ* ˙ŭŝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝö˙˙˙  ! ˙ĝ˙˙˙˙˙˙˙˙˙˙ù ;”˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙ !‰˙˙ü˙˙˙˙˙˙˙˙ú˙ìĝ˙ú 2“î˙úó˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙˙ÍĝöĴ¨­µû÷˙˙ Ĵ £÷˙˙ġ÷˙˙ŝ˙˙˙˙˙ŝ˙˙˙˙úĝ˙˙ŭñ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙û£%ŝŝ˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙ô˙íŭ˙' Ÿ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙û˙Ì!°ŭĦ˙˙ü˙˙üŭ˙ŭĜ ˘˙˙ŭúĜ%Ä˙ġŭ˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ó˙ú˙¤ ¨ŭż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ô ¤˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŞóŝÌ˙ü  %£Ä°îĞ˙Ëô˙˙ô˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙Ñ$""î˙˙˙˙˙˙˙˙˙˙š"$ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ï˙Ċ !!.Éò˙˙˙˙˙˙˙˙˙ŭ˙Üô¤#*žú˙ŝ˙˙˙˙˙˙˙˙˙˙ó˙˙ó˙ġĤ£Ħ §˘Ħš"Òñ˙˙˙ùÑ ˜ı˙˙˙ŝ˙üŭ˙˙˙ĝޘı˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ñ!˜ŝ˙˙ö˙˙üùù˙˙˙úùü˙˙ù˙˙˙û˙ûŭ˙÷˙û˙úŝ˙ŝŝ˙ú˙ùú˙ŭüŝŭó˙ò˙˙˙ŭ˙˙ŭ÷ĝ˙˙÷˙˙˙û˙˙ú˙÷˙˙˙ö˙˙ù˙ü˙ü˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙ûġ˙ü˙˙ĝ˙ù˙û˙ŝ˙û÷˙˙ŝ˙˙ŝŭ˙ŭùû˙˙ù˙˙÷˙ĝô˙˙˙ŭ˙˙ŝ˙é˙˙•Ï˙ô˙˙ô˙˙ö˙˙˙ĝ˙˙˙˙ĝ˙˙ù˙˙˙üŝ˙˙ŝ˙ù˙÷˙˙û˙#Ñ˙˙˙˙˙˙˙˙˙˙˙ùŸ£Êá•ĤĜĝ˙ú˙öú˙˙˙ġ˙˙ùü˙˙ĝ˙˙í˙ú˙ŝ˙ŭ˙ Ċ˙ù˙˙û˙˙˙˙˙˙ü˙˙˙úŭ˙˙ĝû˙˙ŭ˙÷˙˙˙˙÷˙˙˙ü˙˙û˙˙üĝ˙üŝ˙˙ĝ˙ŝï˙÷ŝ˙ûö˙ó˙ñ˙Ħ™˙˙˙˙ŝü˙˙˙˙˙˙˙˙ò Î˙Ċ˙÷˙˙"Ï˙˙ô˙û˙˙ġ˙ûŝ˙ġ˙˙ì˙˙ö˙ûù˙ŝ˙úú˙÷˙˙˙ĝ˙÷ô˙˙˙ĝ˙ġ˙˙û˙˙˙ĝ˙˙˙ö˙˙˙ġ˙ŝùùŝ˙ú÷˙ŭú˙˙ú˙û˙óĝ˙í˙ŭ˙ġü˙ôù˙÷ü˙˙˙ô˙ú˙ô˙ú˙&û˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û%ûû˙ú˙˙˙ó˙ü˙Ÿ˙˙ ×ŝü˙˙ŝŭŝ˙˙˙ŝ˙˙ö˙ŝú˙˙úġ˙ù˙˙û˙˙˙˙˙˙˙˙˙˙˙˙ü˙ö˙ù˙˙˙ĝ˙ŝĝ˙ŝ˙Î˙ù˙˙ĝ˙ŭ˙ù˙˙í% Ĥù˙˙˙˙ŭô˙ġ˙ù˙ò˙ô˙û˙ŭĝ£! !Ì˙ŭ˙ŭ˙˙˙˙˙˙˙óŻ+ ˘˙÷˙˙üü˙˙˙˙ŭŭ˙ô˙˙ŝĝ£' ™˙˙˙ï* ŭ˙û˙ŝûŝ˙ü˙ġ÷ĤÌöŭ˙üù˙û˙ú˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙5Ìü˙˙ö˙˙˙˙˙ĝù˙˙˙ĝĝ˙˙óŝ˙üò˙˙˙ûŭû˙˙˙ŭĝ˙˙˙ü÷˙˙˙˙˙˙ŝ˙ŭó˙ù˙ü˙˙û˙˙òĝ˙û˙ŝ˙˙˙˙à˙˙û˙ó˙˙˙ĝ˙˙üĝ˙˙˙˙˙˙˙˙˙ŭĝóŝ˙˙˙ù˙˙ü˙ŝ˙ûóú˙˙˙˙˙ûö˙üû˙˙˙˙˙˙úò˙˙˙ù˙˙˙üŝ˙úú˙ġ˙öë#$™ĝ˙˙˙˙˙ëŝ˙ĝü˙ŝ˙˙ó˙˙˙ô÷ñ˙˙ï˙˙ûŝ˙˙˙˙ù˙ûŸ7ó˙˙˙˙˙˙˙˙ŝóŭ˙# ­˙ù˙ö˙ġ˙û˙ü˙˙óö˙˙û˙˙ŭöŝ˙÷ĝ˙˙˙ŝ˙˙ŭŝ—# Ê˙˙˙ô˙ú˙˙˙˙˙óó˙˙ġó˙˙ûü˙˙üöùó˙ĝ˙˙î˙úòŭŝ˙˙˙ŭŭ˙öŭ˙ŭôŭ˙÷ŭ˙˙ù˙û˙˙ĝúî˙÷ ŭ˙èú˙˙˙˙˙˙˙˙˙˙˙Í!´ġ˙˙í˙ô£˘ŝù˙úüùŭ˙üŭùŭ˙ô˙˙íí˙ê˙˙˙ùĝ˙˙ù˙ú˙ú˙˙˙˙ûĝ˙˙˙˙ì˙˙ñ˙ĝú˙ô˙˙"ùî˙˙˙˙˙˙˙íöŭ˙ô˙ô˙˙˙÷˙˙òú˙ùû˙˙í˙˙ú˙˙ù÷˙˙˙ö˙˙˙ùŭ÷.'„˙˙ĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ#!ò˙˙˙˙íúµ !˙˙ú˙ŭô ÷ĝ˙—˙ĝ˙û˙˙˙˙ûŭŭû˙˙˙˙ùġ˙˙˙üü˙˙˙˙ôó˙˙˙˙˙˙˙˙˙˙ó˙˙ôŭ˙ò˙ŝ˙˙û˙ú˙ŭ˙˙ĝ˙˙ûô˙˙ûŝĝœ$"ú˙ô÷˙˙ġ˙˙ü˙ŝ˙û˙öù˙ŝ" Ğĝá™ĦÍ˙˙˙˙˙˙ûû˙ŝù˙È(§œ ššĦ˙˙˙˙ôŝ˙˙úóû˙˙ï˙ó˙ŝĦ"¨˜ ħ“Ż #Ĵ÷˙˙Ò- ¨ŝü˙ú˙˙ü˙÷˙˙à,$˙˙íû˙˙˙˙üüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ # Í˙í˙˙ù÷û˙˙ĝü˙÷ŝ˙˙˙ŝùŝû˙˙˙î˙˙˙˙˙÷ú˙ŝ÷üö˙˙˙ùû˙˙ò˙˙û˙˙˙ŝŭ˙˙˙ú˙ö˙˙ĝ˙ô˙ù˙ŭ˙˙úô˙ù˙ûĝü˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙ŝûùġ˙ú˙˙úú˙˙˙˙˙˙üò˙˙˙˙ûû˙˙˙˙ŝö˙˙üĝùù˙öóú˙˙˙ŭ˙˙ôŭ˙Û#˙˙ì˙Ñ ˙˙ï˙˙ï˙üùöĝ˙˙˙ú˙ŭ˙˙ġ˙ô˙˙˙ŭŭùûŭ˙˙ô˙”%˙˙˙˙˙˙˙˙˙˙ûŝ˙#Ċŭŭ˙˙ü˙˙ô˙ñü˙ï˙óôŝġ˙˙˙ŝ˙ŝñ˙ô˙˙ŝŭ˙ö˙ÒÁ˙˙ŭĝ˙ú˙ê˙˙÷û˙˙üë˙˙ùĝ˙˙˙ùú˙˙˙÷˙ñ˙ŭ˙˙˙˙˙úŭŭû˙˙˙ŭ˙ŭ˙˙ĝ˙÷ŭŭ˙ġü˙ö˙ú˙˙ô˙˙˙˙ü˙ö˙˙˙˙˙˙˙˙˙Ó/˙è˙˙í˙Ğ'! ˙˙ü˙˙˙˙ï˙ì˙òŝ˙ŝ˙˙˙•áúġ˙˙ĝûòù˙ò˙ûé˙˙˙˙˙ûù˙ô˙ŭ˙ġ˙ŭ˙ú˙ûÊ&˙úŭŝ˙ëû˙ġ˙˙˙ŝ˙ïô˙ü˙˙ôŝŭö˙˙˙˙ú˙üŭò˙ŝ˙ù˙ùñ˙ŭ˙ŭüŭ˙ù/ûü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙(í˙˙˙ò˙˙Ö óŭ˙ŝ˙î˙ $ôġŞ"$Ó˙ó˙ïĝŭúĝŝ˙˙úöú˙˙˙˙÷ġŭ˙˙˙÷ïŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ùô˙˙˙˙˙˙ŝùö˙ü˙˙ $óö˙ŝ˙˙˙ŝ˙ŭñ˙ôŝÛ×ôù˙˙˙˙ŭùû˙ú÷ô˙˙˙ù˙˙ġÇ ˙û˙éû˙˙˙ŝ˙˙ûŭ˙˙ü˙ Ž˙Ċ˙˙˙˙á˙˙˙˙ŭ÷ĝ˙˙˙ö˙˙˙ĉÜ"”íé÷˜ "öŜù˙²˙ŝóû˙Á¨ŝü˙ú˙˙˙˙˙ĝ÷ġÉ˙ì˙˙˙ù˙˙˙ŭüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙úú˙ĝ˘ÙŭÛ˙ŭ˙˙˙˙˙˙˙ü˙÷˙ŝêŝ˙ŭ˙˙˙úò˙ööü˙˙˙˙úö˙ú˙ŭ˙ŝ˙ö˙˙˙ô˙˙ö˙ĝ˙˙ù˙ü˙˙˙˙ú˙˙˙˙öüĝ˙ĝö˙ñ˙ô˙˙˙ŝŭŝ˙ġ˙˙˙˙˙˙˙˙÷ĝ˙ù˙˙ôŝúŝ˙ŝ˙úúôüŭŭ˙ĝ˙˙ôŝŭŭ˙˙ŭüŭ˙÷ĝŝ˙˙÷˙˙˙˙˙úŝ˙˙í˙˙+Òüĝ˙ü§%Ú˙ŝ˙í˙ìùûû˙˙˙˙ŭ˙û˙é˙ù˙˙˙˙˙˙˙û˙˙˙öÔÖ Ë˙˙˙˙˙˙˙˙ó˙ŝí+ ²˙˙˙˙˙üĝ˙ö÷˙î˙÷˙˙˙üûûúûŝü˙˙ŝûö˙ŭ˙ù˙ú˙ġù˙˙˙üĝ˙û˙˙˙ŭù˙˙˙˙ù˙ûù˙˙˙ġè˙ûú˙ê˙˙ûû˙ŭ˙˙ú˙û˙˙˙ö˙˙ûó˙˙ĝûÜ˙ŭ˙ġ˙ñî˙# üú÷˙ï˙˙˙˙˙˙˙˙˙˙üÈ"˙˙˙ĝ˙ŭÑòüù˙úöò˙˙˙ôû˙ú˙˙ñš"˙˙˙ûñ˙˙˙˙˙˙ĝ˙ù˙úó˙˙ŭú˙˙ë˙ŭóü˙˙ĝ˙ŝÒ˙˙˙ĝ˙÷˙ëù˙˙˙˙˙Ñò˙ú˙˙˙ŝï˙ú˙ö˙˙˙˙ŭŭü˙ö˙˙ôĝ˙ö˙ü˙Ħ÷ŭì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ùû˙˙ì˙˙ß! ç÷˙ġ˙˙ì˙¨˘ê˙˙Š2”˙˙í˙˙˙˙˙˙ŭŭ˙˙ŝŝüŝ˙˙˙˙ôñ˙˙˙˙˙úŝ˙˙˙˙˙˙˙˙÷˙˙ñ˙˙ç˙÷üŭ˙˙ĝ˙ŝ˙ Ò˙˙˙òú˙ŭĝ˙˙˙ì˙˙ûóô˙ü˙ï˙ûô˙˙ŭ˙˙˙û÷ŝö˙˙!)žü˙ĝ˙˙ûû˙˙úŝ˙˙˙˙˙˙Ïİ &Óè˙Ôö˙ŭŭ˙ôó˙˙˙˙˙úĝ˙ĝ÷˙˙¤˙ûñ˙˙˙˙ñô˙ŭ˙˙˙ŝ˙ù%ŭ˙û˙ŝûûù˙ûú˙Ë$Ïŭü˙ü˙÷˙˙ŝ˙˙˙ĝò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ĈÑ˙ĝŝùŭ˙˙ûü˙˙ú˙˙˙˙˙˙˙ñ˙÷˙˙˙˙˙÷ùĝú˙˙˙ŝ˙˙í÷ŭ˙˙˙ú˙üú˙ö˙óú˙ò˙˙ò˙˙öŝġŝùŭ˙˙˙ôÓó˙˙˙˙úŭ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙˙˙ŭòĝ˙˙˙˙˙˙ù˙û˙˙üü˙˙˙üü˙˙ŭ˙˙ùù˙˙˙üûûüüûûü˙ö˙˙ŭá$š˙˙ĝ˙˙ñ˙í˙˙˙ü˙˙˙û˙üġòáíó˙ú˙˙˙ñ˙úĝù˙˙˙ŝô˙ġŸ%Ö˙˙˙˙˙˙˙˙ŭ˙˙˙'ŝòŭúò˙˙ôü˙ġ˙˙˙˙òó˙ŭ˙˙˙ŝüù˙ûö˙˙ç˙˙ù˙ö˙úööïà˙üüüö˙˙˙ġ˙ù˙˙˙ĝö˙˙ü˙˙ì˙˙˙˙˙˙÷˙ö˙˙˙˙ŝ˙û˙ú˙ú÷˙ŭ˙˙û˙ü˙ñ˙˙ö÷˙˙Ñ á˙ñ˙˙˙˙˙˙˙˙˙˙˙ŭß ŭû˙ù˙ĝ 3 ò˙ĝ˙ĝ˙ĝ˙½Ò˙˙˙ù˙ùù˙ŭ˙˙ĉó˙ò˙—˙˙ŭû˙ôĝ˙î˙˙Ù˙ü˙Éŭŭ˙ú#™¤¤ż˙˙ŭú÷˙ŝġ˙ϟ ³™˙ôŝüï˙˙˙ˆ­Òç˙ĝ˙ö˙óĝ˙÷ó˙˙˙˙úó!˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷˙ô˙˙˙˙ ġ˙ŝŝŭ˙˙˙÷˙ŝ˙ü¤ Ëġü˙ìò˙˙ûùûŭ˙˙˙˙öŭ˙˙÷û˙˙˙û˙˙úö˙˙˙˙˙˙˙˙˙˙ġ˙˙ġ˙˙˙˙ò˙˙ĝôï˙˙4 Á˙ù˙ŝ˙˙ü˙˙öûúû˙˙˙˙ñ˙ù˙˙üŝ˙ĝó˙ĝòÍö˙˙˙ÍĝŠ˙ŝô˙˙ó˙˙˙˙ŝ˙˙ŝôĝ˙˙˙˙˙üú˙˙˙ü˙˙˙üöòöŝ˙˙˙˙˙û-Çû˙ùËġëö˙ùö˙˙˙ĝŭÖŭ˙û˙ŝûġ˙ŭ˙˙ú÷ŸÖ˙˙ĝ˙ġ˙˙üĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üäŭ˙ñ%$Î˙˙˙˙÷˙˙˙û˙˙˙ô˙ñô˙íÛ˙û˙˙ĝñí˙ĝ˙˙˙úŝ˙ġ˙˙˙˙ĝĝ˙˙óŭ˙ü÷˙é˙˙˙˙í˙˙˙÷ü˙˙˙˙û˙˙˙ï˙–˙˙é˙˙ó˙ŭúö˙˙˙˙˙˙˙˙˙ûüú˙ŭĝ˙ôù˙˙˙ĝ˙ĝ˙öĝà÷ö˙ò˙ú˙˙˙˙˙˙˙ŝ˙јĊĈ™Ò÷íñ˙˙˙ûŭûûüè˙ ˙˙˙üö˙˙ġ˙˙÷˙òûç˙ì˙ٟö˙˙ì˙˙î˙˙ö˙˙˙ĝüï˙˙ü˙ċ–!×˙˙˙˙˙˙˙˙˙ĴĞ#ú˙˙˙ĝâÄÓ˙˙ŝ‘Şöò˙ŭ˙˙˙˙›Ĥ˙êŭĦßû˙˙çŭ˙È˙˙ù˙˙ûҜĊ˙ü÷˙ԜĦµÙ˙ĝ˙˙ü÷˙˙ñ ´ÎĥÛ˙ĞÚûö˙ŝ˙ú˙ŭġ˙˙ù™ Ó˙˙˙ú˙ĝ* ç˙ü˙˙˙˙˙˙˙˙˙ŝĝ'!˙ü˙˙Ï ˙ü˙˙Ö£0 ŭóèûŭ#ÚËĈ˙˙çà˙βñ˙˙ó/ &’˙Ğ"âġó˙Ġ  żú˙˙ó˙˙Ÿ ˙֗Ì˙ñĠ%!#Ôü˙˙˙ñ˙˙ÂŻ†#˜ô˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ùŝ˙˙÷˙ċ÷$˙ŭ˙ŭ˙ġ˙ûŭö˙Ŭ˙İ&™˙ùĜ—Ġ·Ĉ˙˙˙˙˙ĝû˙˙úÜ£ŽşÌÎŝ˙ġġ˙˙ü˙˙˙˙˙˙˙˙˙÷ù˙˙˙ÂĤËĞĊÁ›˙˙˙ĝżİŝ˙ż˘ĵ˙˙˙ŭ˙˙÷˙ĝöú˙˙ŝŝüöú˙÷×áÌ˙÷˙üû÷ŝĤ#;òù˙ġŝ˙üġ˙˙˙ûŝŝû˙˙ŭ&ó˙˙ùġ˙˙˙ĝ˙÷ö˙˙ŝ˙˙˙ġü˙ĉ˙ §˙˙İĤ˙˙˙ĝ˙áî˙˙ġó˙ͨŝü˙ú˙˙˙˙ò˙ôòċ˙÷˙ßŝ˙ò˙˙ŝŭ˙ü˙óùô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ñ!Ì÷ûö˙˙ú÷˙˙ŝü˙˙˙˙˙˙˙üùÔ˙ê˙üŝ˙˙˙ñŝ˙˙üĦİş˙˙˙ó˙öáçúßÔá˙˙˙ûñ˙î×˙˙ġ˙ÙÏġ˙ġ÷˙œ%ŝ˙ŭäĜúĠŭ˙˙˙˙˙˙˙˙˙˙˙˙ó˙üô˙ġï˙úŭ×˙ĝ˙ŝ˙î˙˙˙ê˙ŭ˙˙˙˙˙ŭòÎ : Óò˙˙ĝ˙˙ŝġ˙ż˙ïÇ˙èĝ˙˙Á˙˙ß˙˙ù˙˙˙Óŝ‘+—˙ĝ˙˙˙ì˙Ġ0•Ċ˙ú˙ôñ˙˙Ħ˙˙˙˙˙˙˙˙ĝ%˙ú˙ġ˙˜½š4 !àó˙ñŝö”0’²˙¤#Ÿŝ˙˙í!Êúט-Ċû˙˙û˙ê‹"/ž% ˙˙˙ûóû˙˙ô˙™*#-& ˜ù˙ĝ˙/)˙íöĝ˙˙˙˙˙˙˙˙˙Ô%& Ĉ˙˙˙û˙#ġùûú˙˙ ݝ #³ù˙˙³ô˙ġ§ , 1 ˙ö"!¨! ˙˙ġÌ *´÷ġ˙˙˙³-"먿Ċ ( Ĝ˙ï˙˙ĝ˙Ċ$#. $•˙˙˙ûŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ĝí˙˙˙û$*‘˙ö˙ú˙÷ê˙˙˙ú˙˙ž£Òó˙˙ĝŭ˙ŭı5'*˙˙ĝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙ġ÷Ġ¸, '§üñù%#" §(/˜§ì˙˙÷˙Á˙Ĥ$˙û˙˙˙˙·:(#Â˙÷ûŻ Ë˙ĝ˙ĝ˙˙ùŭ˙˙ŭû˙˙˙ì× §àï˙˙úúŭ˙˙ßŜĤú˙úóĝ˙˙˙ŭÄ$'˙˙ü÷”œóó˙˙ë˙ü˙˙ü˙Ï#¨ŝü˙ú˙˙˙ùû˙˙˙î˙àê˙˙î˙˙ôôċùé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ôû˙ Ó˙˙ŝ˙̧£Òü˙û˙ĤÖ˙˙Ê!ò˙˙í˙˙˙ŭš&%–ŭü˙Ê$$ŝĊ' “Ö˙Ġ ĝ˙˙ ˙Ç  Ŭï˙˙˙˙˙˙˙˙ú˙֙˙­’&°ì˙˙û¨” ˘ĝ˙˙üŭ˙˙ñÜ $ ˙˙ö˙û¨•Ħ­˙˙˙ó¤Ĥ˙û˙ŭ˙˙Ħ!˙˙˙ŭ(% É˙ŭ˙˙ó & !Ï˙˙˙˙˙˙˙˙ŝ$•˙˙˙Òİ!Èñċó¨*  ŝ ù˙ġÜ )ù÷³ #Ĥ˙ġû˙ï4 #! Ħ˙óú˙˙˙ï˙˙Ò( Ñû˙˙ šŭ˙˙˙˙˙˙˙˙˙˙˙˙Í!Ş˙˙üÒĤ˙ü˙˙œŒ%Öġ % ‘˙û˙ " É˙İŸÊ˙ĤÏù˙Ö"ĊŬúÒ£˙Ïú7"Ġ˙˙!Ĉ˙£˙ŝ%˙˙ñÑߔÛ ( çñò˙ù˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üò˙ù˙˙˙ŝû˙˙ ü˙ó˙ġ˙˙ûô˙˙ì˙ %¨šû˙ŭ˙ڔ %<ŒÙ˙˙ù˙˙˙˙˙˙˙˙˙÷ßÎ#"  ŭ˙ü'! ˙ġ˙û Ħ˙ó˙˙•% #% "!™˙Ü ' +ŝü˙ü˙ù˙˙ĝ˙˙è²İÑĝ˙üŭ˙ù!*ùú˙ù˙Ğġ˙ËŞ È˙ŝĝ˙üœ­÷˙˙˙úŭ˙û˙ŝûö˙˙ġ˙Ç£¤§ĝŝĝ˙˙%(žĊ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ü˙˙ )ÏŭÛñä#/šÈ¤"˙ü˙ùû˙œ "ûö˙ĦŬ˜  #”"˙ŝĤš˙˙˙˙˙˙˙˙˙˙˙œ%!"' $ÎĠ #Ċ˙ŭ˙˙˙ÔĤ$ ó˙˙ÂŬĦ "¨ġ˙˙ĝÎû˙ŭÈÖ×ĝ˙˙¤'" ŭ˙ö˙˙ Ò˙˙˙˙˙˙˙˙˙ғ!Żġ˙˙ñÔ¨ÈÎ #Şû˙ê%ÌŝĠĤÏûûÎÇ'$˙ÑÉΣ!˙ú˙ûÓ˘ÓÏ  0•ü˙úû˙ü˙ùä+ĦÎÖ×û˙˙˙̝ö˙ûĝ˙˙˙÷ö˙ûŝ˙˙˙Ú£û˙óÍ´ĵÚġ˙˙ô˙˙ÏĠÁ$˘ŭö˙ž!ÖÈÓû˙Ë!› * !÷˙"!Ġò˙ĝÎ#Ħ˙˙˙Ì  Òô˙Ö)' œĤ$Ħößü˙öĦ# !˙î˙ö–äíŝİÌ˙˙ù˙ŭ˙˙ùüù˙ù˙óù˙ŭöŝ˙ġ˙÷˙öö˙ùó˙˙ü˙ï˙˙˙ĝ˙˙ĝ˙˙ġ˙ûüüŭ˙˙˙ú˙ù˙û˙˙˙˙üï˙˙ŝ÷˙˙ŝŝ˙÷ŝŝ˙ú˙ûü˙˙˙˙˙˙˙ŭ˙ú˙ù˙û˙û˙˙˙˙û˙˙˙˙˙ŭŭ˙˙˙ŝó˙ŭŭï˙˙û˙ú˙ù˙˙üŝ˙˙ġ˙òŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ " ßô˙˙ûŝ˙ŝ˙ô˙˙Ġ Ù˙ġĤ¤˙ó˙˙Ó˙˙ŝŝ˙˙˙˙˙˙˙˙˙Ê%§Ì!ŝ˙ŝĦÑÏ( ·ŝûŝÓ×˙ûù0ÂÊ  ˙Ï §˙˙ü˙ŝ˙ġ˙˙÷˙˙ŝ "ü˙ù˙ # Ž˙úĝ˙ $ŸŝĦĞö˙£˙˙òĜÒ˙û˙ü˙˙˙ù˙ĝ" Ş˙ñ˙ò ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ñ˙ï= /Íûİ%  Ë˙˙À)   %˘ñĜŭ˙”)”£“  “ŜûÎ*ûÙ Û§%Ĥòŭŝ'  ¤žŬü˙˙˙˙˙˙˙˙ü˙"­ ³Çħš³˙ê˙üӆÙîßŭĈ*áöüĴ—˙ĝúÖŝ˙ŝ˙˙ $˙˙ù˙¤ Ç˙˙˙˙ #˙ê#”ùí˙Öóü˙˙˙û˙˙˙˙˙˙˙˙˙Ì˙Ĵ "˙˙ú˙û $˙ü˙û˙Ë%ë˙˙ŝŬŝí˙˙˙û˙½4"Ù˙˙÷˙˙êı˙ú˙ûÍħùì˙˙˜"˜ŭë˙˙& Ġç˙˙˙˙˙ú˙ú˙œ˙ûŭĝü÷#œ˙ùï˙¨ŭ˙˙û˙ŭġñ˙ŝü˙çú˙Ċ'³ŭ˙˙üĝŝ˙˙ü˙˙ïö *¤ŝ˙ì˙$Äĝ˙ûŭ˙§#(  Żŝß˙ ­ô˙ñ˙óú˙œ$Ôĝ˙÷ĝ#Şü˙÷ ( )& ù˙ô Ÿ£ú˙˙Ò #ĵ˙˙ŭ" Ûñ˙˙ó˙˙ë˙˙˙ô˙˙˙úĝĝ˙˙˙ĈÇ˙˙˙ŝùŭ˙úó˙˙˙ñûö˙˙˙èú˙˙ŭùġ˙˙˙˙˙ĝĝ˙òñ˙˙˙˙˙í˙˙ò˙˙ôù˙˙ö˙˙˙ŝ˙ö˙û˙û˙üĝŝ˙ûú˙ŝü˙ú˙úŭûŭ˙üŭŭü˙ŭ˙˙˙˙˙˙˙˙ú˙˙üĝ˙˙˙˙˙˙ĝüŝ˙÷˙ó˙ó˙˙˙˙÷ùŝ˙˙é˙û˙˙˙˙˙˙˙˙ù˙˙ çú˙˙ŝ˙˙˙˙˙ŭġÇÖ˙ò˙ò˙ĝûü("& ""Íŭ÷ô˙˙˙˙˙˙˙˙˙Ç".Ÿ˙ŭ˙ ˙ò˙Ħ-óŭ˙Ì+#˙˙˙‘&Íô˙ŭ"“˙ŭ˙¨ $ôÛ ×û˙˙ŝú˙˙ŝ˙ĝ˙ûç-!" ˙ö˙ 0%!£ŝ˙˙”%Ô˙Ċ•/ #›ü˙Ë#Şë˙˙ġ1 *ùġ˙û˙ö˙ŝĝüÉ+ ú˙˙ŭ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û½" ġ˙Ĉ£÷á˙ú˙üı$‹˙×Ç'’˙˙ŝÌ˙ñ˙ŭöÖ'˘˙Ïŝ¤×˙û˙¨'˙ö˙ô˘.Ğŝû˙˙ñ˙úûùûÊ- ˙˙˙˙˙˙˙˙˙˙ŭúŜ%úû˙˘#¤ŝúĝûÔ˙ô˙È'£İñî˙ô˙ĝ˙Ô˘ù˙˙éŝ #ġ˙˙˙$!˙ëû˙÷üĦ÷˙˙¨˙ö˙ñ˙¤˙˙˙ùí˙¤˙˙˙˙˙˙˙˙˙÷˙òÔûùġ˙ûÏ &›˙ŝòó˙  ĝ˙ú˙ Ĥûû˙˙˙÷˙˙óš żŭ˙˙˙òÒ%›úü˙ôÒ!"˙˙ŭö!Ğ˙˙˙íÚ Ğ˙˙˙ôġ˙˙ú˙˙÷Ĉ›˙ŝ˙ûŝ˙–žŭ˙óö! İùü˙˙˙˙ú˙ġó˙˙˙і%Š˙ĝü˙˙˙˙ŭġôî˙˙ ¤Íŭĵñ˙˙ô˙ şû˙ì˙ĝ•& ħ­î˙Ñ˙˜Ĉ˙û˙˙˙ŝû ’˙ĝü˙˙•íçòž˙éĜŝÑ˙ŭŝ˙˙ü˙÷úûŝğ$áòúÒ #Íŝö˙˙˙$˙ġ˙˙íġ˙˙üü˙˙˙îüü²ž˘˙˙˙˙˙ï˙˙û˙óİ˘˙˙˙ì˙÷˙ù˙ìû˙ù˙˙˙ûúĝŭû˙ò˙ŭĝî˙úñ˙ù˙íòó˙˙ôöŭúŭ˙˙üü˙ŝö˙˙ŝ˙˙˙˙˙ŭ˙ü˙˙ü˙ŭŝŭü˙˙˙˙ŭû˙ŭ÷ú˙˙î˙ŭöŝü˙ŝ˙üàġĠ˙ó˙ù˙˙˙úĉ˙ù˙˙˙˙˙˙˙˙˙ŭ˙ö!%íû˙˙üŝ˙˙˙˙ú˙­˙òŝ˙ü  ˙Ï˙Ġ "  & Ú˙˙˙˙˙˙˙˙˙˙˙˙Úì˙˙‰+%Şŭû˙Ÿ( Ñ˙˙ŝ˙¤¤Í˙ġ˙˙ Żü˙˙İ#,˙ġÓ#/˙ŝûŝ˙˙ŭŝ˙ô˙˙˙˙˙¨˙ÛÌ˙˙(ÏÖ˙Í ”ïôè  ĝö˙÷Ĥ  Ĉ˙ô÷˙!ô˙ô˙Ĉ"'˙˙ò˙ù˙˙÷˙˙Ċ ùû˙ Ğé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙ç˙˙Á% áïŸ!˙ú˙ĉ˙˙ûġú˙ù˙˙ù ŞÖ˙ĝ+öġÓ˙Ï˙— !˙˙ĝÖ§ÎŭĊ˙"ü˙˙˙˜”ï˙û˙˙˙˙İ÷Ô˙˙Ê˙‹#Â˙˙˙˙˙˙˙˙üî˙À¤%›úáۓ!Ï˙˙÷˙˙Ê˙ŭ˙öĠ ...&Îú˙ú ÷˙˙û÷˙¤˙òö˙úħ¤üü˙½"Â˙˙˙˙û˙ûì˙ìù˙öî˙ËĤ ŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ϵ¤˙˙˙ö˙Öœ˙ë˙˙˙Ê˙ëú˙§ŭ÷÷˙öö˙öÎ#Ÿ˙˙û˙˙š˘˙üó˙̘ûùöŭ,Ÿñ˙˙ŭÓ˜ŝù÷˙˙ùŝùġ˙%¨û˙ä˙˙óÍġ˙˙ħ²üö˙˙˙˙˙˙˙ġ˙ì˙˙Ì ŭ˙˙üĝ÷û˙˙˙˙˙ĵ$ñ˙˙˙˙˙î˙ü˙é†˙î˙˙ŭ%) ˙ù˙ġ˙ġ˙ë˙˙˙Ħú˙÷˙ô˙ŭù/§˙˙ûĝÚ£ ¸˙é˙# ˙˙˙˙ö˙˙üö˙˙ĝŭĉË£ ˙˙'Ï˙˙˙ù˙ĝŝ˙î˙÷˙ùúûñù˙ĝ˙Ï&ÑóÑ˙ÓÂßÚÒŬûÑ#ż˙ĞŞ§,‰!#$§£'£Ż'(úĜ"+‰ĜÜĈÊÖĜûûèèÓÄĈÒëÑ××ÑëÒÒÏÏÓÙÚĠÎÑ÷˙˙èŬĜĠĈÌ˙˙˙ò˙˙í˙ß˙ĝ˙˙ŝÊ˙˙˙ïŝ˙˙˙˙˙˙˙˙û˙˙#”ôŭ˙ŝûŭ˙˙ŭ˙˙˙ĥ˙˙˙ñ˙Ú(™ùú£#Ĵ"™Ğ¨İ×Ü˙˙ó˙˙˙˙˙˙˙˙ .$Ċú˙˙˙˘¤˙ġ˙˙Żù˙˙ïİŝúüŝùÍúóê£2§Ÿħ£‹­›Ü÷˙äЧ˙˙˙˙˙ŭ˙˙û˙ö˙ü˙ó˙˙Ö $ù˙ŭ˙ù$ï˙ôû˙Ġ˙˙ñÓ ,­ú˙˙£ž˙üó÷Ú˜˙˙˙ôĠ)  ˙÷˙˙ŭú˙˙ġ˙ĝ˙!)Ž˙ô›$ $# ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ˙› ĝڞœÎ˙˙˙ô˙˙ú&‡˙öùĝ˙+¤ôô˙ Ú˙˙ûòÖ/Îû˙òÍ%/˙˙Ŭ /$ùŭ'˙ç˙ïûó™& ˙˙÷ö˙˙˘)˙˙˙˙˙˙˙˙˙˙ùĝ¤˙˙ôêŬÉ˙û˙˙Ş&”ËÊ˙#*Ûí˙ùŭñ˙˙˙ï˙˙Ġ˙÷ġ˙Î˙§ ˙óŭ˙˙‘ħöü˙µ#˙˙˙˙ù˙˙éû˙ó˙˙û˙˙˙ë (Ñ˙ô˙ôÊ˙˙˙˙˙˙˙˙˙˙˙ò˘Ċ˙ñŝ÷˙¨)Ğ˙˙ñŭóó.Ç˙˙˙˙!˙˙˙ú˙ñ˙’%İÈ˙ŝòĞ$ ˙ë˙˙ Ğĝ˙È˙ Ÿ˙˙ù˙Ì!›˙˙˙˙˙ŭġ˙˙˙˙ +öñ˙˙˙¸§$¨˙ò˙˘&$Ċ˙ŭ˙˙ŭ˙˙ñ˙ŝù˙˙˙ʜ˙˙˙˙˙˙ŝ˙˙ĝ˙úĠ ¤˙˙˙ŭúô˙ñ˙û˙ ¨ŭ˙ñğô"  ŝ˙˙ñ˙˙é˙í˙ö˙ ÷˙÷˙ŭû˙˙‘)˙ô˙üġ¨%“˙˙Ÿ ˙ĝġ˙˙ú˙˙ú˙ë˙ ›–#˘ôŭ–'-Çŭ˙ŭöŝ!˙˙˙˙裤´í˙˙ù˙˙ù˙&!  (! "6% $'%*# ( " #%**(­†6Š ¨–ĦœŸ  ˙ôŝ˙˙˙˙˙˙˙˙˙˙˙ùŝĤŝ˙˙˙˙˙˙˙û˙˙íÙ% ˙ô˙ĝ˙ġ˘Ħ˙˙™$óĝ˙˙ç˙ü÷˙÷˙ŝì˙˙˙˙˙˙˙˙˙ Ÿ˙˙ú˙÷˙ö˙ïġ×ú *Ÿ˙˙ŭ˙˙˙˙˙˙úĠ Áò˙˙  ñ˙úġ˙û˙˙˙˙ï˙£ £üú÷ŝ˙ŭŝ˙˙˙÷˙ú˙˙óùÔ­˙öùúœ"ô˙˙ö˙0‘üġ˙ŭ˙ûì˙'ŝç˙˙˙› #Ğùġô˙ĝİöġ˙˙ü˙˙ôûŭ˙˙Ĥ˙˙Ô "  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ĝö˙ó$ " ˙ùġ˙˙ĝŭ˙Ŝû˙˙˙ï˙öĝ""ĵ˙û˙˙˙˙˙ £ú÷˙ŝ$ÂüĈ# ˙—öó˙˙˙˙˙ ˙˙üò˙Ÿž˙˙˙˙˙˙˙˙ö˙ŝ˙ Úüûù˙ó" Ŭéü˙ô˙ £˙˙˙û˙˙ó˙˙ö÷ú˙î˙ Ä÷ö˙üù˙š˙˙˙óŝ´ üÔŭž˙òŝí˙˙ô˙˙ú˙é˙÷ġôĠ˙ôü˙ӟ¤˙˙˙˙˙˙˙˙˙˙˙˙$ŝ˙ŝ˙˙Ì ù˙˙ŝ˙ŭ"#üäûÛÍ˙˙ċü˙˙û˘”˙˙ü˙ù˘ ŭñ˙ûî4î˙˙œ'˜ë‘˙÷˙˙ùü˙˙˙û˙ë%)˙˙ìŝü˙“’˙ü˙%ĵ˙˙˙ŝ˙˙˙˙˙ò˙ùĝœ.ŭĝùŭ˙˙ûĝúĝ˙ŭ 'Íĝú˙ë˙ì˙˙ŝ˙ öĝĝ˙˙ŒÈ˙˙˙˙˙ĝö˙˙˙÷´˙˙ù˙˙ŭ˙úŞĞ˙Ĝë˙Γ´÷ú˙"%Ħ˙˙ġùñÇÉ˙ú˙“%¤üŞ Ï˙˙3£û÷˙ú˙˙ùíŭ./…ġ˙˙˙ŝü! ""# 1   + &" #% $ 0""!+" ""#%$$"!"!˘Ñüòû˙˙˙˙˙˙˙˙˙úې˙˙˙˙˙˙˙˙˙ö˙˙ÎÊùü˙˙˙¸  ˙ê˙£É˙˙ġ˙ĝ˙÷˙îûúŝüŝ˙˙˙˙˙˙˙˙ Ħòùùĝ˙ŝ˙ô˙˙ĉ˙*—Ŝàñ˙Ğä˙÷ŭ˙ÑŒŝ÷ü› —˙üûŝ˙˙˙é˙ò˙˙Ĵŭ˙ŭ÷˙˙ĝ÷˙ûŝ˙û˙˙ŝ˙Ë °ûŝ˙˙ ˙üŭ˙˙Ġ˙˙ġ˙Îúü˙÷œ˙˙ô˙ĝœÍ˙˙çÎ#)÷˙üŭĝ˙ġ˙˙˙éŭœìÛ˙Ŭ  Ż˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙' "Ê˙˙ûù˙˙÷œ˙÷˙û ( ù˙˙İ÷˙˙û˙˙–! £˙ĝ˙úŞ( ˙Ÿ)#ĞŸ˙˙ĝŝŝúì'˙˙˙ü˙ ˙˙˙˙˙˙˙˙˙ŭĝÉ$ĝŭŝ˙˙ù ˙˙û˙ù´#Èĝüĝ -ú˙˙ñġ˙˙÷˙ûÏ-Î˙ùò÷˙ŝ $ ùîĝ˙öİ#˙ù˙"Ĵö˙ö˙˙ê˙ù˙ġúù˙Ğœ˙ġÒ#˙ŝ˙ċĥû˙˙˙˙˙˙˙˙˙ûü !ûú˙˙ò·œüô˙÷üĝ˙˙“'Ċ˙ò˙˙ĉû˙Ş&žŭú˙ïÌ .˘˙üú˙˙ ˙ùŝ˙×&(÷ŝŭ˙˙˙û˙˙ö˙Í˙ħ •ŝ˙ŭŝúĴö˙˙, £ĝ˙ŭü˙˙˙û˙˙˙. ( $ê˙˙ŝ˙˙˙˙˙˙÷˙× Ç˙˙˙û˙˙û˙û›˙ŭ˙ġ˙˜'¤˙ùŝ˙ñ˙˙üŝĝ˙‘#Ï÷ùúöù˙˙È/œüŭ˙˙˙³˙Ġĝ& ĝ˙˙˙§É˙Ê  Ĉ÷ĴùòÙ" àû˙˙í" ˙˙üÚ! *ŝ˙ĝô˙˙È($(  Ÿ   # ›­ $  ' #*)#! '  "˙˙ĝ˙˙˙˙˙˙˙˙ŭ˙”0¤ŝüüŭ˙ŝŭü˙öŝ˙’ $!˙˙ç˙ü"ú˙òž  ˙ŝŭñ˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙ $³ŝú˙˙˙ü÷˙ï˙˙ö¨İ˙˙˙˙Í" ˙ñû˙û İ˙˙Ñ*'ò˙ŭ˙ĝ˙û˙˙˙˙¨+§öŭ˙ûü˙üġ˙˙˙˙ùñî÷˙Ä-%÷˙ó˘ ˙˙ûùú½ "ö˙˙Ĉ%Óŝ˙˙œ0Ġù˙ûŝ2 )Ĥ˙˙ú˙Ó “˙÷˙ĝ˙ġ˙ġñ˙˙ôݐ˙ùïö§ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭú˙˙$$ù˙ŝ˙öü˙ú˙˙ŝò'İ˙˙ü# ˙üû˙˙ûŸ!˙û˙÷˙ÚĦ˙!Ï˙ŝû˙üŭ˙ ˙˙˙˙Ò˙˙˙˙˙˙˙˙˙ô˙û$˘˙ùù˙ö&È˙ñú˙ĈË˙˙ÇŻ ŭ˙ù×˙˙ġû˙ü˙˘ĝ˙û˙˙÷˙ġ˙ÄĜ“!˙ù˙Î! Ħö˙˙ô˙˙ù˙ö˙ĝ˙ #ŭ˙Ó!úû˙óç’Ï˙˙˙˙˙˙˙˙ú˙Ë Íö˙ŝ˙ ˙ô˙ùĝ!#Â˙˙żĞ(ö˙ùûú˙ġ¤ 'ĝ˙ŭ˙˙˙˙˙˙ġô˙ĝûĦ! ¤"À˙ġ˙˙ĝü˙úŭ˙ŭ˙ŝ˙‘( ü˙ö˙˙#˙üŝù£œù˙˙ú˙ü˙÷ŝ×˙–#&ċ˙üû˙˙ŝŭ˙ù˙öÓÂü˙É ˙ù˙§ò˙˙÷ûĦŝüŝ£˙û˙ĝÏ˙û˙˙˙ïÑ ¤Ñ˙› ˙û˙š% &˘òš"™˙›!˙˙"Ñ˙˘˘öúŭ£#™Î˙š˙ñ˙˙ŭ÷˙ġÓĝÛúÖÛ÷Ûĝó˙ûŭ÷Ö˙Ê˙Ġñ×ú˙üŝ˙Ô˙úÒûž°˙ö˙˙ Ş ùÉ+ #˙בޤ"     %$'§˙é˙˙˙˙˙˙˙˙˙˙ò&"˙ŝŝ˙˙˙˙˙ñ˙ĝË !˜˙ù˙úŝ ú˙ŝ˘›Ï˙˙û˙ݍ´Ïŝ˙˙ú˙˙˙˙˙˙˙˙ •˙Ëŭû˙ġ˙˙˙ú˙˙ó˙ĝ˙¨ ŝ˙˙ŝù¨ö˙˙!¤ŭ˙ô˙˙ĝ É˙˙˙Ħ ž˙Êŝ˙ö˙˙ûüŝ˙ġ˙˙˙˙úĜ˙˙ó˙ڝ×ûŭ˙ŭ˙Ϩüù˙˙(—˙ù˙ŭœŸù˙˙Ì !˜˙ĝŭ˙Ô¨û˙öŭ˙üġ˙ùü˙ù$*ó˙˙ü˙›˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ĝŝ˙ú'˙ĝÚ˙ŭŝ˘Ħ˙ö˙ŝħô˙˙ž#!—˙÷˙˙ùŞÌ˙ġ˙ùü˙œ˙ö¤Ïġ˙ô˙˙ö˙Ë'ô˙ö˙ġû˙˙ŝûûŭ˙˙˙˙˙˙Ä›˙˙˙ĝ˙"˙ñ˙˙öÏ˙ò˙¤Í˙ù˙ÎÍŭú˙ġŭ˙˙è˙ĠŜö˙î˙ž 'ûû˙ÉÄċ˙ŭŭù˙ŝœ˙ĝÏ#Ç˙˙ö˙”Ëŝ˙ŭġ˙˙ô˙˙ûÓ ¤û˙ï˙š÷ġ˙–ĞïÜù˙!ü˙˙˙˙˙”(È˙˙ġĜ ˘ú˙˙úù˙%Ïû˙˙ó˙˙üĝù˙˙í˙˙û˙÷˙˙Ë˙˙ù#Íû˙Ġ¤ĝŜï˙˙˙û˙˙˙£à˙öú˙ĝüŭ˙˙ı$# !¤˙ô˙#Ħ˙÷˙˙ù£!* ˙ù˙ò) ĝ˙˙úŝ˙Ĥ&Öġ#‹˙ŭË+&Ħ˙ Î˙ÌާÓĝĤÏÓԘ!$˙—˙üú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŬŜ˙˙ŝÒÍàóóàËÖÒ÷ŭÓĜï׸ĥ×ĞÉŞÒÌËҭʤÑÁÙÖÀĤ×ÇͳÈĤÌŻÈÎÔ¨ÎĞÎÁŬ§Ç³ÉĦÌÇÑĤÍÓ "'žÌ“$"‡Ŝ˙ö˙úú˙ûġ˙ŝĝ˙ÑÒ ÎÎ˙˙ûŝ˙úŭŭÇ ˜˙üĝ˙ö!$Òġ˙˙ µĈÎĠĦÛġ˙˙ü˙˙˙˙˙˙˙˙¤"˙ŝ˙Ȓ—˙˙ŝ!À˙˙üÍ" ˙˙úŭ$˙ĝüĞ  ÓÔĈŝÙ˙˙÷İĜúü˙ġ˙˙ĝ˙˙ü˙ŭ˙ŝ˙Êú˙˙˙˙ö!˙ġ˙˙÷Ö$Ü˙ù˙˙(˙˙˙÷Ħ Ÿ˙˙ïĞ# £û˙˙˙Ó öû˙˙ŝ˙ü˙ġû˙ú˘ù˙üĤ# Ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙!¤!& ¨˙ì˙ú˙$™×˙÷˙+ ‘˙ŭ˙˙š'ûü˙˙˙ ˙ú˙˙üŭ˙É Óĝĝ´%˙˙ï˙÷ü×ĝĠ £˙˙û˙û˙˙˙˙˙˙˙˙ŝüúòñ˙˙"Ôúŝŭ˙í$’ŭĝ˙í˙˘ #š˙û˙ž”Ÿİôü˙Ħ$ŭŝ˙˙–˜Ŭĝ˙î#›ŝ˙ñ˙ •Ì˙!˙˙'—ùÓ' $Ó˙ù˙$¤î˙û˙˙ûù˙˙! š˙Ç˙$ŝ˙›3ù˙ĝ˙ß˙˙˙òúŝ$,âïĝĜ Ú˙î¸'˙ŭ' Ĝĝ˙ü˙˙ûŝ˙ŭï˙ŭ˙û˙÷˙˙ì¨˙İ %ĠĝûÇ$Ĥüô˙˙ŭ˙û˙ŭöœ!$ :†²û˙˙˙ĝú˙ê˙˙‡# - #Ë˙˙÷Ş˙˙˙Ó /%* *˘˙ŝÙ#É˙ö˙ŝ!  ú˙2 İú˙‰!˙˙÷˙ #'› ’˙ŭó¤!/(˙Ï& ú˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭöĝ˙˙˙û˙üĝŭ˙˙˙÷ûô˙˙ôû˙÷ĝù˙ñûô˙˙ü˙ġ˙ġ˙ü˙˙ŝï˙û˙ôŝï˙ñ˙˙˙ç˙ï˙˙˙ñŭöŝ˙í˙˙˙˙ñ˙˙ä˙˙ì˙úŭ˙÷ŝ˙û˙˙ġ÷˙˙Úġ˙˙ŭ˙üùü˙Á ˙˙˙ô˙˙˙á&"×÷˙ù !, Ñ˙˙÷!"˘$,û˙ñ˙ü˙˙˙˙˙˙˙˙˙›*$ ²4Żöû! 5Ċ˙Ŭœ# ĝü˙Ç˙˙Ñ!,(2‘˙û˙£Û˙ŭ˙ùù˙üú˙ù˙ô˙˙ċ¨+–˙ĉ˙í˙+  ˙ñ˙˙ #Íü˙ĝ*›˙÷˙×!  ˙˙˙Ž( "˙ë˙ùË ˙ù˙˙ü˙˙˙˙ĝú *Ŝñ­ #$ ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ñ˙ĠÄ  !˘À˙˜$ !Ÿ˙˚&˙ò˙˙Ŭ ŝ˙öĝħ ŝüŝùö˙˙ġ˙$+ôŝ˙ç!%˙òñ˙ù˙ùûŝ ûĝ˙ú˙Éùóù˙˙˙ŝŭŝ˙˙Š Ó˙ô˙˙£"$˙ì˙˙ $&òô˙*' Â˙˙ûÒ !— ò0 &§üĉğá˙ûúŞ'( Şñ˙˙" Ÿ˘#$ÂùËİ ¨ô˙ĝö˙˙üüŻ$!˙˙ġ‘7 ıÛ˙ŭĝí–"ú˙ò˙˙$ &˙˙Ó  ›ùù˘ +˜í˙ŝŸ#  ġ˙˙˙üù˙˙ġ÷˙Ñܔ$")•âĝ˙˙˙ÉÒ×ÒÙÉ˙˙ġŝŝ˙˙ù˙ŭ˙ߝ£ЎÎûïğÎÌùüó˙˙˙ŭ˙ú˙â'œÂ˙˙ŭí˙÷ -$˙ĝ˙ó”!"œĈ˙ú˙š &˙ŭ˙ñ˙˙ĊĈß×˙˙í˙ŬĦÀÌÎù˙ó˙ì°#- ŭë˙ùŝĵÖ÷àŭöÊ$Ĵ˙ù˙üùĈ˙ÍÙÖŬ¤ 0ĵÀ˙ĝ£–üŬġ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙˙ŭŭŝ˙˙˙ú˙˙ù˙˙ù˙˙ŭ˙ü˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙ú˙˙˙˙ŭ˙˙˙˙ñ˙íú˙ö˙úŭ˙˙˙ĝ˙ŝíú˙˙òŝ˙ù˙˙úûĝ˙˙ĝŭ˙û˙˙˙Ĉ4-#ó˙ô˙˙ûüċ-$ ĝ˙â# )˙ûù˙Í $0Ġô˙˙ċ˙˙˙˙˙˙˙˙˙˙ $#ĝŬ'¨ú–˙˙™", .Á˙Í! ™ÚüŜ#î˙ü˙˙˙ŝ˙ġ˙ŝü›3!-×˙˙˙…)£§Ż Ċ˙òÑ/ ġċ˙Ž’ĝ˙­ Ĥ˙˙˙+ ß˙ĉ˙ûñó˙˙ġ˙˙˙*˘ 'ß˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙üÔ#˙#$!µû'˙Ä˙÷óûž!ž !Ï˙˙˙ù˙ñ˙˙˙Ò˜ŝ˙û˙İ–¤Òò˙˙ä˙ô˙úĴ  À˙üö˙˙ )ĉïùŝŝŭ˙˙ñ˙¨ &šöèä› !’˙˙˙ž&Ħùú˙˙!)ŸÓ˙ĝòü˙óÖĞšĦË˙ġ—)“³Öġ˙ž" ù˙˙ë¤" 5 ŭ˙˙ġÍËŻùŝʞÍ˙˙Ġ£¤•µ÷˙˙ĝûüü˙úòŝŝïĦÍġ˙˙à úé˙Ñ˙˙˙˙ŭŭ˙˙̛³Ĉİö˙˙˙ê˙ÉÏ˙ŭŝ˙˙à˙û˙˙Ϝ×˙˙˙ü˙˙˙üÖ˙ŝ˙Ë,""#Ž˙˙˙˙ù˙ü˙ŝ˙˙ïĝ˙ŝ™­Ğ ˘Ġôĝ˙˙üŝ˙˙˙ġ˙÷˙üġ˙ŭ˙˙ŭ˙÷ü˙ġ˙úùú˙˙ûô˙˙˙ĝ˙˙öûü÷˙ĝ˙˙éĉ˙Ċ˙ô˙˙˙ù˙˙ĝŭúû˙ë˙ġ˙˙˙û˙˙ôĠ£¤˙ŝ˙ŭĝ˙˙ŭû­˙âî˙ĝĝ˙˙û˙˙˙ĝ˙˙ò˙˙˙˙û˙üü˙˙üó˙ùĝñ˙˙ŝ˙˙˙ô˙úÔ˙êŭġ˙ŭĝ˙÷˙˙˙ĝù˙˙˙ĝú˙ñ˙ŭ˙ŝúù˙û˙ú˙˙öú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙ûù˙˙ŭŭŭ˙ó˙ô˙öù˙÷˙ò˙ó˙ùöŭ˙ôûĝ˙ù˙÷˙ĝ˙÷˙ü˙÷˙ñ˙ġ˙ù˙˙ü˙˙û˙ûû˙íû˙˙˙÷˙˙˙ŝ˙˙ŝ˙ġĝü˙˙˙üúŝùú˙˙ú˙êµ˙ùŭ˙˙˙úùô˙˙˙ú˙ó˙˙˙Ê£Ĥ££Ô˙˙˙ñû¤Ÿž›˙ü˙é˙óİ'&šÔ˙˙˙íü˙÷˙˙˙˙˙˙˙˙˙˙À'" !˙˙Ï £˙Ú*ŝï$ 'Óò˙ŝ˙,È˙óÊ $˙˙˙˙˙ŝú˙ŝŝ˙˙ó%(œ˙ú˙˙³).#¤˙üô "š˙Ĉ06 ˙²*Ï˙•"œ˙ü˙˙˙÷˙˙í)$ó3$ŞĊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙£šİÙ&ĦÄĝ¤&˘˙!%Œ˘˙˙˙ô˙ûû˙¤ ×ġù˙ŝì˙˙ŭ˙˙ú÷˙˙˙˙˙˙˙ĝ˙ù˙îŭ˙ŝ˙úöğ˜ż˙˙˙˙ġĝú˙ùÌĝŭ˙˙ŝüŝ˙˙ïû˙ê˙üŝ˙˙ó˙˙ŝ˙é˙úÎ˙ôŭ˙÷˙˙öùú˙›”Ÿ˙˙òûñ˙˙ç˙˙úò˙ú˙˙˙˙î˙ù÷˙˙ĝ˙˙ġ˙ô˙û˙ïû˙Ë&˘ÏÂġĝŭŭ˙í˙˙˙ŭŭ˙˙˙ú˙˙î˙ŭü˙˙üŭ˙˙ŝö˙˙˙ù˙˙˙öŝĝŬ˙˙ô˙ñú˘İ˙˙ê˙ŝôúû˙ûĝ˙ŝ˙ù˙öö˙úġû˙ü˙÷˙ġŭ˙˙˙˙òŝ˙˙ŝŝ˙ŝïü˙ŝô˙˙ùŝĝ˙ž Ÿœ! &î˙üŭû˙˙ŝôŝ˙˙÷û˙ù˙÷˙ñ˙ú˙öù˙ŭ˙ú˙˙˙˙˙˙˙˙ù÷˙ŭ˙ŭú˙ûúŝ˙˙üúùú˙ġĝù˙˙˙˙˙˙ġó˙÷˙˙ġ˙˙óù˙÷ŭûñ˙˙˙˙úö˙ù˙ŭŝŝ˙îĝ˙˙÷ŭ˙˙ġ˙˙˙î˙˙ġ˙˙ú˙˙˙˙úü˙˙ùñŝ˙˙ĝ˙˙ŭìö˙˙ŭŝ˙ú÷ö˙˙˙˙˙Ŭ˙÷˙ġ˙˙˙ŝŭúù˙ü˙ü˙˙˙˙úġü˙úŭüü˙ŝŭ˙ġ˙ŭ˙˙˙ù˙ġ˙˙úùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙ŝŝ˙˙˙˙˙˙ŝ˙˙ŝ˙˙û˙˙˙ŝ˙˙˙˙˙˙˙˙ü˙ŭ˙˙˙ü˙ú˙û˙˙˙ö˙ŭ˙ü˙ŝ˙˙˙ŝ˙ü˙˙˙ê˙˙˙˙ò˙˙˙ŭ˙ŝöû˙úóŝ˙˙óú˙˙˙˙ûòù˙ŝ˙˙˙ôŝ˙˙˙ùü˙˙ò˙ü˙ö˙÷ò˙û˙÷ô˙˙ĝŭ÷˙ù˙÷÷ŝ˙ŭúü˙˙ê˙˙÷ù˙ùĞ›¨°ŭ˙÷ôüĝ˙û÷˙˙˙˙˙˙˙˙úë˙Ĥ˘ŸšÈ˙˙ä˙˙˙û˙˙˙úŝ÷˙ñ˙˙ŭ˙ü˙ü˙˙˙ööŝ˙˙˙ñóŭ˙Ş Ĥŭñ˙û˙ü˙Ŭ˙˙˙˙˙˙˙˙öù˙ùŝŝ˙ŝ˙˙…µĦĴ˜£Ö˙˙ĉ˙û˙›!  ›ï˙üŭĝ˙ĝ˙˙ŭïöÚ˙ùü›ş›˙üŭ˙ÑŞ Ìú˙螤×Á×ùñöúŝö˙˙ñ˙ŒĤ  ß˙Ó" "›£ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ùÍĠÏÑü˙ŝë˙˙ËÀÚñ˙˙˙ïĴ+ ĦĠ˙ġÎÏÜĵâùïû÷˙˙ñ˙˙ô˙˙ĝ˙˙ù˙˙ï˙÷ô˙ö˙ŝŭ˙˙˙˙˙÷˙ôġ˙˙óü˙˙ò˙˙è˙˙ĝŭ÷˙˙ġ˙Ëŭ˙˙˙˙˙˙ŝüŝ˙˙ġ˙˙˙ŭ÷˙ö˙˙ô˙ġò˙ñ˙üĝ˙óŭ˙˙˙˙ùè˙˙˙ú˙ġ˙ġŝŭ˙˙ù÷˙˙˙ó˙îö˙˙ô˙˙û˙˙ŭŭüú˙ö˙óôï˙˙ŭ÷ŝĝ˙˙˙˙ù˙˙˙ûüç˙ôûúŭ˙ö˙˙ô˙˙úŭŭ˙òûûŭ˙˙˙˙ù÷ŭ˙˙ì˙óġ˙û˙ŝÊ'Ħĝ˙ú˙ú˙ŝû˙˙˙ù˙˙óŭ˙˙˙˙ï˙÷˙˙˙˙˙˙˙ñü˙˙ü˙˙˙˙ó˙ó˙˙˙˙˙÷˙û˙&ĴÛÌġ˙È (Ĝ÷ŭ˙ŭ˙˙˙˙˙ù˙÷ü˙˙˙ûü˙˙˙ġ˙˙˙˙ŝ÷ĝúôúóìù˙˙˙÷˙˙˙˙˙˙˙˙ŭġú˙˙ú˙˙˙˙ġúù˙˙ĝü˙˙óôŭ˙˙öĝ˙ú˙˙˙˙˙ŭùŭ˙÷˙ŝ˙ô˙üè˙˙ê˙˙öĝ˙˙ùġô˙î˙˙ë˙î˙ï÷˙˙ó˙ë˙˙òûüú˙˙˙ŝŝ˙úŝ˙ú˙˙˙ŝŭĝ˙÷˙ŝ˙˙ô˙ö˙˙ë˙˙û˙˙ì˙˙ú˙ú˙˙÷˙˙ŝ˙ò˙ŝ˙ó˙˙ê÷ûŭŝ˙êüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙û˙ŝúùü˙ŝŭĝŭûü˙úöŝúú˙˙˙úŝ˙ŝ˙˙˙˙˙üû˙÷ŝú˙ù˙˙ŝĝ˙ú˙ù˙÷ŭŝŝ˙üúü˙ĝú˙úû˙ŭ˙˙ŭ˙óĝ˙û˙ĝ˙˙ŭ˙˙ŝŭùòúŭ˙ŭŝüŝŝ˙˙ŭ˙˙ñ˙ŝ˙ċ˙ĝ˙˙˙ú˙˙˙ù˙˙ŝ˙˙˙ŭ˙ûàò˙˙˙ü˙˙˙ì˙ü˙ùü˙ŭŝŭ÷û˙ú˙˙˙˙˙˙ĉŭ˙˙˙˙˙˙˙˙˙˙˙òù˙ŭÏĝË˙ŝ˙˙ç˙˙ûŭ˙ùúĝġ˙ŝ˙òùî÷˙ú˙ü˙è÷˙ü˙ôŝüŝ˙˙ù˙˙˙îŝ˙˙ññ˙˙ë˙öûô˙úöġ˙˙˙˙˙ú˙ò˙˙˙Ċ˙˙˙÷˙ĝ˙˙ŭŭÈòĠÈ˙Ëú˙ü˙ġ˙úûŬ˙˙˙˙ë˙˙ô˙ġù˙ê˙ŭï˙˙À˙ŭ˙˙ĝò˙ŭÈ˙ü˙˙˙˙˙˙û˙ò˙˙óÛÙùïù˙òÜÖÓÖ÷˙ûŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙ġ˙ùû˙˙˙˙ĝ˙˙˙˙óÓéú˙úġü˙˙˙˙öò˙˙üö˙˙˙ò˙ñ˙˙ì˙˙ö˙˙ġ˙öí˙ġ˙ĝ˙˙Ü˙úù˙ô˙˙÷˙˙˙è˙˙öüô˙ü˙Ĝ˙ŭù˙˙üò˙÷ô˙˙ùûüŭŝŝ˙˙˙˙ì˙ïûġ˙ó˙ùû˙ö˙˙ñ÷ó˙˙ûò˙÷ŝùü˙òŝŭú˙ë˙ù˙˙ù˙ŭ˙˙÷˙˙˙˙˙˙÷˙ŭ˙ŝùúĝúû˙ŝ˙ù˙ü˙˙üû˙ŭó˙ò˙˙ô˙ġü˙é˙˙ġ˙˙˙í˙ó˙ù˙˙ĝ˙ô˙˙˙˙˙˙ŝĝŝ˙ŭ˙üè˙˙ġ˙üüï˙÷Ŝ Ĥ˙ñ˙ñ˙˙ü˙òŭ˙ü˙ü˙˙ĝ˙à˙ŭŭ˙˙í˙˙öüŭŝ˙òŝ˙ë˙ŭô˙˙ŭ˙˙ûü˙÷˙˙ñ1 ˙ê˙ßé˙˙ !Öú˙˙˙ú˙ù˙ûò˙˙˙ŝúò˙˙˙ô˙˙ŭôñüü˙˙û˙˙˙˙˙˙ûö˙˙˙úŝûúŭ˙˙ŭ˙˙˙ú˙üú˙ŭ˙ûŭĝŝ˙öû˙˙˙ë˙˙ñ˙˙ê˙˙˙˙˙˙û˙˙ù˙ô˙˙˙ë˙˙óŝ˙˙ŝ˙˙˙ŝ˙ûûö˙˙˙ñ˙˙˙˙ö˙˙˙úû˙ü˙ú˙˙üù˙üñú˙ŝ˙ú˙ŝŭŝöĝ˙êù˙˙˙˙ñ˙˙ì÷˙ñ˙˙ûö˙˙ú˙ô˙ü˙˙ó˙üüûġ˙˙˙ú˙ŭ˙ö˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙ŭû˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙ŝŭ˙˙ŝŭ˙˙˙˙˙˙˙˙ŭ˙ü˙ŝ˙ŝ˙˙˙˙˙û˙ŝ˙ü˙ŭ˙˙˙üŝ˙˙˙˙úü˙˙ŝû˙˙˙˙÷î˙˙˙ĝóŭ˙˙˙ŭ˙ù˙˙˙˙˙öŭ˙˙ŝŭ˙ü˙˙÷˙˙ú˙ô˙˙ĝ˙ñ˙˙ŭ˙˙÷ú˙˙ŝŭŭ˙ĝë˙ùŝû˙ŝ˙ŭġ˙˙ç˙ùŜġü˙˙ê˙÷˙˙ŝ˙˙˙˙˙˙˙˙ñŝ˙ĉ˙ö˙˙˙ûù˙ó˙˙ï˙ùö˙˙˙˙ùû˙˙ü˙ŭú˙˙˙ü˙˙ê˙ö˙ŭ˙˙ŭġ˙úö˙˙ìú˙˙˙ġ˙˙ö˙˙˙˙í˙˙ŝ˙˙î˙˙˙ù˙ú˙˙ë˙˙Ê˙˙ġ˙˙ġ˙ú÷˙˙˙ûŝöŝ˙÷˙ċ˙ĝ˙˙˙˙ö˙÷˙˙ë˙÷˙˙ĝ˙ġü˙˙ôüŭ˙ï˙˙óû˙ú˙û÷˙ìú˙˙ġ˙˙÷˙Ĉ˙ŝ˙˙û˙˙ĝú˙˙ġÒ˙á˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ö˙í˙ŝ˙ġ˙˙ĝ˙ò˙˙ç˙˙ò˙ü˙˙éŭ˙ç˙ö˙˙üù˙ġŭ˙û˙˙˙ú˙ŝùŝ˙ñ˙÷˙˙üŝ˙˙úû˙ó˙˙˙ŭŝ˙˙ô˙ñ˙ö˙ŝ˙ü˙ü˙ó˙˙ġ˙˙˙˙ñ˙˙öĝ˙ŝŝŝ˙˙˙ŭúû˙˙˙ü˙û˙û˙ô˙üŭú˙˙û˙ú˙˙÷˙˙˙ŭŝ˙ü˙˙˙ŭú˙ŭ˙ò˙˙ú˙˙ù˙ŭúŭ˙ġ˙ûŝ˙ŭ˙˙ö˙÷ú˙˙˙úù˙˙˙ŝú˙˙ĝ˙˙ú˙ġ˙ûû˙ŝñ˙˙ŝó˙ŝ˙˙ŭ˙ñ˙˙˙ûŝû˙ùü˙˙˙˙ŝ˙˙ġ˙ŭüŭü˙˙ĝ˙- ú˙û˙ú˙ûŝ˙ŭ˙˙˙ú˙ö˙ô˙úú˙ñ˙ŝ˙ĝ˙˙ŭ˙ĝ˙˙ġ˙÷ü˙ùûŭ˙ŝ˙ùŝ˙ġ˙%¨˙˙˙ò˙ô˙#Ï˙üü˙ûŝ˙˙˙ü˙úù˙˙˙˙˙ò˙˙ġ˙˙˙˙ñ˙˙ûü˙ùüüú˙˙÷˙ŭŭ˙˙ŭ˙û˙˙ü˙üü˙˙ô˙ĝ˙ü˙˙û˙û˙ù˙ĝ˙˙ĝ÷˙üö˙ôû˙ü˙üö˙ùò˙˙ŝ˙ŭò˙ú˙ò˙ġ˙ó˙˙ċ˙ŝ˙˙˙ö˙î˙ĝ˙ĝù˙ŝòù˙ö˙˙÷˙ú˙˙ŭ˙˙˙˙÷˙ü˙÷˙˙ù˙ŭġ˙˙ù˙ŝ÷˙˙î˙˙ġŭ˙ĝú˙˙˙ü˙ûġ˙˙ûû˙ŭ˙˙ù˙ġ˙ŭ˙ġ˙ŭï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙ĝü˙˙˙ŭŭŝ˙úù˙˙˙˙ŝ˙˙ö˙û˙ù˙˙ŭ˙ö˙ù˙˙ü˙˙ŝŝ˙˙˙ü˙˙ĝŝ˙˙˙˙ĝ˙ú˙ú˙ŭ˙òú˙˙ö˙˙ŭ˙˙ŝöú˙˙˙ùŭ˙ŝ˙˙ü˙û˙÷˙ö˙ü˙˙˙ûü˙üŭ˙ö˙˙öü˙˙˙˙û˙˙˙ô˙÷˙ñ˙ĝ˙ġ˙ŝŝ˙˙˙ò˙˙˙ŭ˙úô˙ú˙û˙ŭú˙˙˙ŭ˙ù˙ó˙˙ù˙˙˙˙˙˙˙˙˙˙˙÷˙˙ë˙ŭûŭ˙ġ˙ûô˙ŭ˙ï˙ùö˙ŭú˙ûù˙üû˙û˙ŭñ˙˙ï˙˙ùŝŝ˙ï˙û˙üú˙˙ŭġû˙úù˙˙ö˙ü˙ûó˙ò˙ġ˙úü˙ĝ˙˙ô˙˙ù˙ŭûû˙ò÷˙ġ˙ù˙ù˙˙ñ˙˙÷ù˙ù˙ġù˙ü˙˙úŝġ˙úŝù˙úĝ˙˙÷˙˙˙üŝŝ˙˙ö˙˙˙ġ˙ó˙˙úġü˙ŝ˙˙ú˙ü˙ó˙˙ù˙úŝö˙˙ġ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝúô'É˙ùŭ˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŞ#˙Ùù˙ŝ÷% ˜˙ġŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü³ $#Ä˙˙ùù˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ċ–*•£Ħ% .ä˙˙ôŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ô”*) È˙˙ü˙ŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙Ì'À˙ûĝû˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙ŭĝ˙ĝ˙ŭçù˙îû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙(. 'ù˙˙ò˙˙öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûó˙˙˙˙˙ŭ˙˙˙˙ŭŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ġ˙˙ò˙ü˙ü˙îŭ˙˙üó˙˙ŝûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝóüñ˙ûûóíĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ó˙˙÷ŝĝ˙˙üŝô˙˙˙˙ñŝ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙ŝ˙˙˙˙˙˙˙ŭöù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉ˙ù˙ĝ˙˙˙˙é˙˙ŭ÷ìó˙˙˙ôġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûü˙ûùùûġ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ù˙˙û˙ò˙˙÷˙˙˙˙˙˙ï˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ŝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙˙ö˙˙˙üŝ˙ŭü˙˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙÷ġ˙˙˙ü˙ê˙˙ò˙ô˙˙˙˙˙˙˙˙˙û˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŝŭ˙˙ŝ˙ġû˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙í˙úü˙˙ŝ˙ġû˙ŝ˙˙˙˙˙˙˙˙ŝ˙˙˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ù˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ùú˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙î˙˙ùü˙ĝ˙ö˙÷˙˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙ŝö˙˙˙˙˙˙ù˙ï˙˙˙˙˙˙˙˙˙ü˙˙˙ó˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ü˙˙ġ˙ùîó˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙û˙˙˙ùîó˙˙÷˙˙˙˙˙˙˙˙˙˙ùô˙˙ŝĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ü÷ŝ˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ŭŭüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôû÷ù˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüġ˙˙ï˙˙˙˙˙˙ú˙˙˙óġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙úúŝŝîù˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙ġĝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ù˙˙˙èġ˙ŭ˙˙ûŭ˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ĝ˙ĝ˙îĝŭ˙˙ûŭ˙ûĝ˙˙˙˙˙˙˙˙ĝ˙˙ü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ú˙˙ü÷ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝ˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ï˙ú˙ëùó˙ûŝ˙˙ŝ˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭŭ˙üġ˙ŝ˙óü˙ù˙˙˙˙˙˙˙˙˙˙˙ú˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ĝ˙˙˙ŝïó˙˙ï˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ò˙˙ïó˙˙ï˙˙û˙˙˙˙˙˙˙˙ĝ˙˙ĝŭ˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙÷ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŭù˙Ñ˙ó˙˙˙˙˙ú˙ŭġöö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ġ˙˙ú˙÷˙˙˙ó˙ú˙˙˙˙˙˙˙˙˙˙ó˙È˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙óñ˙˙è˙˙ä˙ŝüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ùĝ˙ñû˙˙ä˙ŝüú˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùôü˙ĝù˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú÷ùüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭ˙ŭġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ä˙˙ñ˙ġ˙í˙ĝ˙ġ˙˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙öŭ˙ö÷ü˙ìÖ×É÷˙û˙˙˙˙˙˙˙˙é˙˙Ö˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ġï˙˙˙ĵ˙˙ú˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙ŭö˙Üĵ˙˙ú˙˙ì˙˙˙˙˙˙˙˙˙ü˙˙ŝíĝ˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙ô˙˙ĝ˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝúùŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙öù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷÷˙ëä˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ïí™ışü˙˙˙˙êÛûö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ġ˙˙öò–“/-ù˙˙˙˙˙˙˙˙˙˙˙· ”Í˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ö˙˙œ ‘˙íŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙úﵞ‘˙íŭ˙ú˙˙˙˙˙˙˙˙˙˙ìú˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙òŜöüÏòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñĵ‘ŸÓû˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙öÖÙö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ó *ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷! °˙ûú›˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ú˙ö˙ìÏŭó˙˙˙˙˙˙˙˙Ë$#ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭË+˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙!˙˙˙ú˙˙˙˙˙˙˙˙˙˙Ÿ*Â˙öù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˜(%Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ċµ•£Óü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŝ͢ü˙˙˙÷˙ù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ï˙ùÁÖ˙ûû˙˙˙˙˙˙˙˙ü˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü ŞÇ˙üü˙˙˙ü˙˙˙ú˙Ħ”Ú˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙%áüüŭ˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙ùŝŝü˙˙˙˙˙ô˙ó˙ŭûúü˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ŝûû˙ü˙˙˙˙ü˙˙˙ġŭ˙˙û˙÷ùŝ˙òŭú˙˙˙˙˙ûû˙÷˙˙ġü˙˙˙˙˙˙˙˙˙˙úù˙ŝŝ˙˙˙ĝœÉ˙˙  !˙˙úŭüù˙ûüûü˙˙˙ŝ˙˙˙ùû˙˙˙˙˙ù˙˙ġ˙ŝù˙ù˙˙÷˙ô˙˙ô˙˙ġ˙û˙˙˙˙˙˙˙˙˙ó˙˙ó˙ġĤŭ÷˙˙ú˙˙óü˙÷ĝ" ˙ü˙˙˙ġ˙÷÷˙˙ġ˙˙öŭ˙˙ĝ˙˙˙ù˙˙ôú˙ġĞ$ *üñ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ĝ˙˙úŝġ˙˙˙˙˙˙ŝ˙˙ŝ˙ûû˙˙üü˙ġ˙ŭ˙ùŝ˙ü˙÷˙˙˙˙˙ù˙˙ĝ˙üüû˙˙˙˙ŭû˙û˙óŭ˙ôĝ˙÷ù˙ŝ˙˙•  ò˙˙ú÷ŭ˙ù˙˙ĝüö÷˙˙ú˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙÷˙˙öŭ˙ŭĝ˙ŭù˙˙˙˙ûû˙˙› #˙Îüü˙ú˙˙˙ô˙˙ġ˙˙ĝ˙˙ü˙˙û˙ù˙˙˙öûŝ˙˙˙ûŝ˙ŝŝ˙˙ŭúûŝ˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ŭí˙˙ùĤÚŝ˙ùú˙˙÷˙˙˙˙˙˙˙˙˙˙ìܢ˙ö˙ú˙÷˙÷ŭ˙ö˙ŝ˙û˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙œ%Ĥ˙ôó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙ŭ˙Ĥ,$Ĝó˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž" 7Ŝ˙˙˙˙˙ŭûŭû˙͘"!˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙!'ó˙˙ŝúúüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙ŝŭ˙ù˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙ü˙˙˙˙˙ŝù÷˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ŝ˙˙ġò˙˙î˙úôö˙˙˙˙÷˙ùü˙˙ñ˙˙˙˙ùóĝ˙˙úŝ˙üö˙˙˙ŝ˙˙ûû˙˙ŝ˙˙˙˙ŝŝû˙îŭ˙% # Ò˙ġ* ü˙˙ü˙˙ĝ˙˙˙˙ûòú˙˙ŝ÷˙˙ò˙˙û˙˙úû˙˙˙˙ñ˙˙˙ŝò˙÷˙˙ùô˙ù˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙˙Íš˙ûö˙û˙˙˙ŭû˙˙–§˙ŝ˙ïû˙˙˙ó˙ûü˙ó˙˙˙ì˙˙öú˙˙˙˙ŝ˙úÈä!"1á˙ŝó˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ÷˙˙ĝŭú˙˙ô˙ó˙ŝ˙ö˙ŝü˙˙˙ô˙˙˙ŭ˙÷ĝ˙˙ŭŭ˙˙ôġú˙˙˙ñ˙˙û˙˙ùüúġ˙˙ĝ˙˙÷ö*˙ö˙˙˙û˙ô˙˙£ Èú˙˙ŭ˙ü÷ü˙ŝû˙˙˙ŭóö˙˙˙˙˙˙˙˙˙˙˙˙üöù˙˙˙˙˙ó˙˙ŝ˙ïġö˙˙˙î˙# ™˙÷˙ŭ˙ù˙ó˙ŭ˙˙ùûú˙ú˙˙ûïŝ˙üúŝġ˙˙˙÷ùùŝ˙˙˙ŭ˙ü˙˙˙˙˙ûĝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙úŭ˙˙çü"(Óô˙˙˙ŭġŭ˙˙˙˙˙˙˙˙˙÷­š˙˙ŝú÷˙˙ŝü˙ô˙˙˙ú˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙ŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙Ë%˙˙˙˙ñĝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûˆ(ğ*#“˙˙ë˙˙˙˙˙˙˙˙úüŭûü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öš& Êŭúûŝ˙ŭŭ˙˙˙÷š  ˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙ü *)#üĝùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙üü˙˙˙ŭùŝüĝ˙ü˙ŝü˙˙˙÷ĝúûúùû˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝúĝ˙˙˙òú˙ö˙˙˙ûúúüĝŝŭ˙û˙ùĝġŝüû˙˙˙ú˙ò˙˙ò˙úóŭ˙˙üü˙˙ŭĝ˙ïùĝ˙ŭ˙˙˙ôĈ °˙í˙î²& (˙˙î˙˙÷ŝöôú˙˙˙üú÷˙üŝç˙ġ˙˙ĝġ˙˙÷ŭ˙˙é˙˙˙ñ˙ Ï˙é˙˙ĝ˙ï˙˙˙˙˙˙˙˙ŝû˙˙ŝ˙˙öÄ'ĝ˙˙˙˙ŭó˙ĝ÷˙˙ôÛß˙˙ŝŝû˙üîŝŝü˙˙ô˙ŭ÷ò˙ü˙ŝ˙˙ûò÷ò˙˙Ò" 4½˙í˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙úú˙ġ˙ŝ˙öò˙˙˙˙û˙ċġ˙˙óû˙˙˙˙û˙ô˙ù˙˙˙ŝ˙ŝû˙üŭ˙ĝ˙ù˙˙÷ŝùġ˙ġ˙˙Ħ $ĝóô˙ò˙üû˙ö˙˙ Ñ˙˙˙ŝûü˙˙ì÷˙÷˙ùü˙˙˙ĝ˙˙˙˙˙˙˙˙÷˙˙˙˙ĝòû˙ö÷˙˙ŭ˙˙˙˙˙ŭ˙ŭĴ,żßÊ#›û˙˙üü˙ü˙˙ŭúï˙ô˙˙˙ġ˙ĝ˙˙˙î˙ŭ˙ù˙˙˙û˙˙˙˙ŝûŝ˙˙˙ŭĝġĝ˙˙˙˙˙˙˙˙˙˙ûúŝ˙ŝ÷öüú˙ôĤ ×ú˙üû˙˙˙˙˙˙˙˙˙˙˙˙ŝ(*˙ĝ˙ûùüü˙ö˙üĝ˙üú˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙Ş,¨ĝñù÷˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙&·ËúŸĴ§×ñ˙˙˙˙˙˙˙˙˙˙üŭŝŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ñ˘˙ŭŭŭŝŭüŝ˙ú˙˙Ú(Áŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙÷˙˜ ħĝ˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûúúûŭ˙ŭ˙ûü˙˙˙˙ĝ˙ù˙ĝ÷ŭü˙˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭŝ˙ô˙˙˙ñŭ˙˙ûûù˙˙˙˙úö˙ì˙˙÷˙˙˙û˙˙ŝŭ˙ôŝ˙˙˙˙˙ŭ˙˙˙˙˙˙ŭú˙ŭ˙˙˙÷÷ĝ˙ŝÖ˙êŝ˙ê Ğ˙ó˙˙û˙˙˙˙˙úû˙˙üŭ˙˙˙˙˙˙ŭ˙˙˙˙ŭ˙÷ĝ˙˙÷ò˙Ë˙ö˙˙ĝ˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝŝ˙Ĝ&/¤÷Ôú˙ó˙ŝ˙˙˙ú˙˙÷˙˙ï˙ŝ˙ë˙ü˙úúö˙˙ĝ˙ù˙óù˙˙öü˙˙˙˙˙÷÷˙Ööŝŝúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙û˙˙˙˙û˙ù˙˙˙ü˙ó˙÷˙ü˙û˙ġöú˙û˙ú˙è˙˙üöĝ˙üí˙˙ì˙˙˙ŝŭüŭ˙˙˙˙îò˙˙ĝ˙˙ú˙˙ŭ˙úû÷êÓŝ˙˙ŝĝ˙óġ˙ŝŭ˙ŝ˙˙˙˙ĝŝ˙˙˙˙˙˙˙˙˙û˙˙ùŝ˙˙˙˙öŝ˙ñġ˙ùŭòû˙üÍ–ŝ÷˙˙ŝ˙˙í˙ĝŝ˙û˙˙˙˙ö˙ŭ˙˙öŝ˙úŝò˙ó˙˙˙˙ŭöúú˙˙ŝŭüü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭü˙˙ü˙˙˙ ĝ˙˙úŭ˙˙ŝ˙˙˙˙˙˙˙˙ô˙ž ˙ö˙˙˙úúŝùĝ˙ö˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öġȝàĝ˙˙˙˙ŝúú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙™ žü˙ŝġü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙ŝ’˙˙˙˙˙ŝüüü˙ò˙˙˙üŝ˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙ü$ŭûûúĝĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ŭŝ˙˙˙˙úïġ˙˙ġ˙û˙ü˙ŭüü˙˙˙üö˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ŭûŭĝŝ÷˙˙û˙˙˙˙˙ŭùü˙úù˙ŭò˙îû˙˙üùü˙ü˙ġö˙ö˙˙ûú˙˙úû˙ŝ˙ŝŝñŭŭ˙ŭîÖ˙¤'˙˙˙úú !ġ˙ĝŭ˙ùĝġŭ˙˙ĝĝ˙˙÷˙íú˙´˙˙˙à˙ŭú˙Ö˙˙˙ìü˙˙Ž˙ŝġô˙ġ˙˙˙˙˙˙˙˙˙˙˙üŭ˙ü÷˙ ˙í˙ú˙ßíĝ÷˙˙ú˙˙˙ĝġ˙˙ûòû˙˙òŝ˙˙ôŭ˙ŝġ˙˙˙˙üü˙ŝúŭñ˙ñùú˙&›˙˙˙˙ñù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙÷˙ĝ˙ĝû˙˙ú˙ëò˙ô˙˙˙˙ùôáġ÷˙˙ù˙ôĝ˙ûö˙˙˙ñù˙˙ç˙üù˙ö˙ŝŝ˙üú˙ùû˙˙˙˙ó+˙˙ùŭ˙˙ŭüù˙ü˙˙ĞÒüûŝ˙˙˙˙˙˙˙ùğôûùŭ˙üŝ˙˙˙˙˙˙˙˙˙˙˙ĝú˙˙ùĝí˙˙ï˙˙˙˙˙ó˙ŭ˙™"™˙Î˙î˙˙ŭ˙û˙˙ŝ÷˙ĝ˙ŝ˙ïüó˙˙üĝô˙úŭ˙úŭù˙û˙˙˙öùŭ˙˙˙˙ú˙˙üüŝŝûĝ˙˙˙˙˙˙˙˙˙ŝù÷û˙˙˙˙ġĝ”´ħ˙û˙˙˙˙ŭĝ˙˙˙˙˙˙˙˙˙ĝÄŻ&ޝ˙ŭŝ˙˙˙˙˙˙ó˙ĝó˙ö˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙÷˙÷˙è˙î˙ĝ˙ÈÍ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó(#ğ˙÷˙˙˙ô˙˙ü˙˙˙˙˙˙˙˙úùû˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ĝôû˙ŝüŝ˙˙û˙ù˙é˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˘  à˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭ˙ŝŝ˙ŭô˙˙üûŝġû˙öò˙ù˙ô˙˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙ößÈŭ˙ġ˙ġüò˙÷˙˙ù˙˙ô˙ü˙ö˙ŝú˙˙˙˙÷î˙˙˙˙ú˙˙˙˙ûŝŝû˙˙˙ĝü˙˙˙˙ö˙ŝó˙+ ĝüĝù˙ ħíö˙úġ˙˙˙ŭû˙˙ŭù˙˙ü˙˙ü˙ġúú˙ï˙˙í˙öî˙˙ġ˙Ì Ż˙ù˙˙˙û÷˙˙˙˙˙˙˙˙˙˙û˙˙˙ú˙Û(¤÷˙Î˙öê˙ĝ˙ûïù˙ġúùû˙ŝ˙˙˙òñ˙÷˙ŝÛüù˙ŭ˙˙˙ö˙˙˙óŭ˙˙ò˙˙˙×üô˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ü˙ÖÓܨÌÉÀ˙üü˙˙ë˙û˙˙˙˙˙èöü˙÷˙ü˙ġ˙ú˙˙ó˙˙ö˙˙ì˙üŝŭ˙ĝú˙˙˙ĝ˙ò˙˙ü"˙ġûĝ˙úó˙˙˙ñ˙Óŝü˙˙üï˙˙ñ˙ŭŬ˙ŭ˙˙˙˙ŭú˙˙˙˙˙˙˙˙˙ġ˙˙˙÷˙˙üúöü˙ûóùŝŝüÏö­Ğú˙ü˙ô˙÷˙ú˙ŭûú˙˙ö˙ŝ˙˙˙˙ŝ˙úô˙˙ĝô˙˙úŝ˙˙ûù˙˙˙˙ŭ˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙ŭôĝ˙˙ŭöü˙˙˙˙ö˙ê˙ĝ˙˙û÷˙˙˙˙˙˙˙˙˙˙ë˙˙÷ŜÇ÷˙˙˙ŝû˙˙ùóŭ˙˙î˙˙˙û˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭçòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġé˙˙˙ŝ˙˙˙íŝ˙ş0˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûúÑŝ˙÷˙ó˙÷˙˙ù˙˙˙˙˙˙˙˙ñïôü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ÷ٛ §üçòûüü˙˙˙ôú˙˙˙úŝ˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙ĝ˙ÏĤü˙˙ŝ÷ñò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙û˙˙˙ŭú˙˙üĝ˙˙ö˙öŝ˙÷ŝ˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙ï˙ îÙüè˙ô˙ò˙ŝûÜì˙˙˙ŭÖ˙Ùàŭû˙˙ü˙âÙúŝü˙úö˙˙˙˙˙˙öñÖü˙˙ô˙üŭû˙Ο˙˙˙ô˙!É˙˙÷˙˙üûù˙˙˙ŝ˙˙˙ú˙˙Œ&çɧ˘£¨Ë˙Ŝ˙˙"(ž§ŝ˙ŝ˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙Í ˘ŝϟ—˙ó˙˙â˜ĥ˙î˙ŭùó˙œ˙ġۜ§•İöŭ˙ĝ˙˙ò˙˙˙˙ϝ 0Ş÷˙˙˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙Ș, # ! Ï˙èôö˙ïħ“Żíü˙˙˙ŝ˙íÒÍ˙ϰ ìÓŝ˙ä˙˙˙˙í˙˙ġ˙ôŭ˙˙îú˙$ú˙Êŝ˙˙˙úĝŜíŻÔ˙ŝŝ˙ü˙˙ñ˙™)“ŝÚ˙˙î˙ŭ˙˙˙˙˙˙˙˙˙˙ù˙˙ëŭ˙˙£É˙Ĝî˙öñ˙˙öŭŞ &œ˙ö˙öù˙û˙ù˙úŭ˙˙˙ò˙˙ĉüŭó˙ŭü˙í˙˙˙÷ï˙ö˙ñ˙˙ñŭ˙˙ĝú˙˙öü˙˙ŝûûŭ˙˙˙˙˙˙˙˙˙˙˙üöú˙˙˙ëŝ÷˙ġ˙˙˙ŝ˙˙ôú˙ŭ˙˙˙˙˙˙˙˙˙˙üĈü˙˙ñ˙ùû˙˙˙ïñŭ˙û˙˙Û˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙ô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙î˙ó˙˙ġ˙ŝ÷%œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĜڛĝ˙˙˙ĝ˙ü÷ü˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġ˙˙ô˙˙˙˙˙˙ü˙˙ú˙ú˙ï˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙ġž˙Ÿ›ž­Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÌŞš¤¤šŞÌû˙˙˙ĝÍĤ˘ĤùœĤĦ Ĥ˜ı˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñܛ) "&˙˙Á$#*Ìŝš+ž˙˙ú˙ŭï/$Ö÷˙ŭŭ˙÷Ö%) )˙÷˙û͜# ˙ù˙ŭ˙ûÏŭ˙ü˙ñĠ£!™ü˙ö˙˙ô˙ì§ 2û˙˙œ! *˘ŭü˙˙˙˙˙˙˙˙˙˙ŭ˙˙üŭ˙ûÖÎġħöú˙’Í˙ġ˙Ġ#ÀŞ ġ˙û˙ŝú˙À"(Òŝù˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ġ%%˙˙˙›#˙ŝ˙Ó Ÿ*Íù÷˙ô˙˙Ç#¨Ö˙òŝ˙ù˙! £Òó˙˙ġû˙ Ô˙ŝüü˙ɚ* '#*È˙ö˙÷û˙˙˙˙˙˙˙˙ŭù˙óòĴ)$Ûí˙˙úù˙Ö'š˙ŝ˙˙ŭŭ˙î˙˙ŭ˙˙÷˙˙ÀĜ§˙.˜³í˙˙˙÷˙İŒ$Şĝ˙˙˙ŭü˙ġ¨—¨Ô÷˙˙˙˙˙˙˙˙û˙íİœÓ˙˙˙˙û˙ĝ˙ú÷˙ŭ˙˙˙˙ùÏ˙˙˙˙˙˙˙˙˙ñĝ˙˙Ĉ˙˙ù˙û˙û˙ŝù˙˙û˙ŸŸĦ˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üú˙˙ú˙ùû˙ú˙üÈÜô˙ùÌ˙ùùŭ˙Ç ù˙î˙˙˙˙ûŝ˙˙ëçÀÔÑÒĈ˙˙˙˙˙òÑÖÊÛĝĊÛżúŝ˙ü˙ú˙˙ġ˙ûÓ˙ú˙Ċ!ÓÇĠŭüù˙üŭ˙ÇÔß÷ĠÉŭü˙ô˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüüü˙ûÚÎ!˙ú˙˙ġġ°ŸĦÇúŝ˙ù˙˙˙˙˙˙˙˙˙˙É4 ûĦ˘ÌñÚÒÖË˙×ÏÌÎË˙˙˙˙Ò–˙Ó!šÖÓĝ˙˙úġ˙½ÎÖÑŝ˙˙˙÷˙˙š¤ŭ˙ŝü3Ĝ˙˙ŭ÷˙˙ûġ˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙ö˙˙ŭ˙Ñ "˙ôŝ˙û"$Ğô÷˙ŭ˙˙˙˙˙˙˙˙˙ŝö˙÷˙˙ĝžġŭù˙ 'ù¨£Í˙˙˙Ÿ %"É˙˙ü˙םĦ! Ó˙ü˙ü £ŝ˙ŝŭ˙Ôù˙ú˙Ó Ġ˙üùŻĦ˙ŭĦ " § %üû˙ ) (Îû˙ġ˙˙˙˙˙˙˙˙˙˙öŭ˙ĉĠ˙ÖĜ˙ $!›Êüŝ˙¤˙˙ôá.§Òœ ×˙ÙüùöÖ Ÿ"&˙ġú˙ŝŝü˙ú˙ŭ˙ù˙˙˙˙˙˙˙˙˙ŭŝ˙˙úü˙ô  ­ž˙Ö *Ġ˙˙˙›# $"öĝ˙˙""—˙˙˙÷ŝĦ ¤üŭ˙˙×ġ˙ó˙˙!+Á˙˙÷˙˙˙˙˙˙˙˙˙˙ĝ˙˙ş¨$#Œ˙ŭŭù§' İ˙ò˙˙˙˙˙˙˙˙˙˙˙%"ßöùú˙)˙˙˙ŭ˙ù˙ ! $ Ċ˙˙÷˙Ñ˙ËÇ.! ˙ôùûö˙Ĝ˙Äúŝ˙ŝùËù˙˙˙ŝ˙˙Óú˙ï˙˙ĝû˙ù˙üùú˙Ò İ˙ÏĊĠŭ˙üû˙ö˙˙ÙÜÔÏÒÑÌÖÓĈĜ˙ú˙÷˙˙˙˙˙˙˙˙ü˙˙úŝáÊÊ×ÓÍö˙˙òŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ú˙˙Ä­œĤĞ—²ŞŻž˙ú–İŞÉ­Ÿžœšû˙˙û&!"Í˙îŭĊ'Ħ˙û˙˙üœžŞ˙˙ó˙ŭ % ˙˙é˙˙*Œ$§Ê˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŭŭŝ˙˙˙˙ԕ ) )Ĥ˙À˙Ü)ĵ˙ŝŭóŭó˙˙˙˙˙˙˙˙Ÿ ˘˙- œŝž#ùġ˙™& ”˙ŭŝ˙ٔ"+Ëŭüŝúú˙#! ˘˙˙ûħ# "Ğ#$ìó˙˙˙ú˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙ü˙î˙Ĥ  žĞ ›˙ŝü˙İ '§íİ áù˙˙ġ˙˙˙˙˙˙˙˙˙˙ò˙ŭ˙  ­ İġ˙ôˆ$'ŭŸË˙ó˙ù›"­Ôġ1 #Şë˙˙ÂÍ˙˙§/—ŭ˙˙â%ġŝ˙ŝŭ˙ż˙ë˙ù (˙˙ñŝĦ "Ĝóќ˜ŝ˙öÍ#0˙˙ŝ)$Š´ĵ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷˙˙˙ó "ġŞĤÙ˙˙úöüĦ#£˙÷˙úÛ §˙÷˙úÙëù˙˙Ù"ĝ˙˙Î(˙˙˙ò˙ú˙ü˙û˙î˙é˙˙˙˙˙˙˙˙˙ŝû˙ûú˙Ŝ&˙óŝ*"Ğò˙&˙ċĝ%ġġ˙Ŝ $§˙ìĊÚ÷› ,)Çñ˙˙˙“%%Ĵ˙ ˙ú˙˙%Ġ˙ò˙ġ­˙ŝ( &ûö˙û˙˙˙˙˙˙˙˙ù˙ì˘-  ş’%˙˙í˙$1"ó˙˙˙˙˙˙˙˙˙˙ŝ˙ -0 ½˙ŝ§"˜  (˙ŭĝٝ" ĵŭ˙ûԒĞ·Ğ˙˙׋–Ĵ‰²˙˙éݤ§°™ô˙Ħš—´ĦÎö˙ĈŞİ’­ŝ˙˙˙Ñ,&$ ò˙˙˙ñ˙ž% "  Ñ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˜¨$ "Ï˙ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷üúÌĦ›$& ïĠ" $˙ùŻ 2+˙˙ùÏ"%¤+ ŝ˙˙ú× 5í˙óœ"% +ġĝ˙ĝ ÒÔ˙ܛ &ğóû˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙Μ ûŝû#˙ê˙#­ñ˙˙˙˙˙˙˙˙˙˙˙˙˙* ˙‚ )&˙î§"Ô˙ŝΘûüß ċĉ˙ö¤!ü˙ûĝ˙˘ Îĝ­ġî˙ ÊĈ˙’(#˙˙˙˙ŭö˙˙òŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙úù˙˙˙Ħ'˙˙µ! Üñüŭĝ“,ë˙˙ž Ŭ÷ñ˙˙˙˙˙˙˙˙˙˙ù˙÷˙÷#'$™Ëë˙Î%™ Ĉ˙˙ûê" Ì˙˙Ö˙˙ŝû' $“­˙üË˙ŝ˙ŝŭ˙äê˙˙Ô —œİ3›!È˙÷Ò'!Ħ˙í˙î Ùĝöâ šéġî˙ûòġ˙˙˙˙˙˙˙˙ŭĝ˙˙ù˙óĞ ,°˙Àĵ˙˙òüü˙ûŭ ĝ˙ŭŭ˙Ħ!Âö˙˙÷Ÿ" Ë˙˙ĝ˙•#­ì˙˙ö ˙˙óġ˙˙üô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙˙ŭĝÌ ¤˙˙ôí Ú˙ĝĴÍí˙˙Í˙˙ÄöŜ "Ì˙Ê"ö˙Ú˙˙/ Ë˙˙˙ôş öòĝĈ´#˙˙üúİ &Íò˙˙×›Í Ÿ˙˙˙˙˙˙˙˙˙˙˙˙œ&$˙Öö˙° Ñ˙ôËÒ'ŒÔ˙˙÷˙˙˙˙˙˙˙˙˙ü:" ˙ÏÎŬù˙Ğ Ĥ˙üÙ"šàђ#˙ñ˙à÷ùĈô!%˜˙û˙ ˙ÉŞ)˙˙÷ ö˙˙ú+Ç˙Áżëġ˙˙)˙˙˙û˙˙˙˙˙˙˙˙ùüŞ  4 ñ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙¤!  *#/£˙÷' "˙˙˙Ê˙˙À– ùì˙˙$ Ê˙ġĦ—ŝû˙˙!$âöÓ˙˘ ŝߔÊ˙û˙)ùÀ˙öÈ/Ĵŝ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúĝ!ô˙˙ŭö%$ž˙˙Ŝ   ˙ü˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙š # üĝ᪠ü˙È,Şìóù˙¨!™˙ûә%“˙÷˙ŝ ˙˙˙&Ĥ˙˙÷Œ ˙˙Á"%˙Ë˙û'ñ˙úŭ˙˙˙˙ŭŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙ú˙˙ê˙˙" û˙ĝ˙žĜ˙˙ġ˙­ž˙ĈöĦ %À˙˙ŝò˙˙˙˙˙˙˙˙ŭ˙˙ü˙˙   ­Ñ˙öó˙Œ' ˙˙ë˙˙£ ''Ħ˙÷÷ö(%óû˙˙+!& ˙ŝ˙Ŝ#Ġŝ˙ŝŭ˙Ĉ˙÷˙Ĥ'%%û˘÷ŭ˙Ö&Îô˙˙˙% Ĉ˙˙ë+˜ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙óü˙é#—˙˙ŝ˙ñ˙ĝ˙˙"¤÷ŝ˙˙ı- ˙˙ûí˙–$İ˙öŝ˙%+›˙˙ĝ˙£*¤íŝ˙˙˙˙˙˙˙ç÷˙é˙˙˙˙˙˙˙˙˙˙ŝú˙˙˙üÍ$Ĝ˙ġ˙˙ù˙˙Úä˙ŝĝ˙˙˙ù˙ŝ$ ù˙˙û˙ž& Ìĝŝĝ˙ %òĝÔ£˙ñü˙ŭ˘Ù˙ġùû!Ó˙˙˙˙Ә ŭ˙û˙÷˙ŭ× !! !Û÷òú˙˙˙˙˙˙˙˙˙û˙ŭó˙ #ŭ˙ŭĝİ ˙˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙  ö˙ï˙ò÷& "-Şûö")Ùòŭ˙ ˙˙œ !™Ħœ%+ßĝ˙ü˙ññ!.£˙˙ĈĤĝïŜ!˙ê˙ġœ'àġ˙Ö“÷˙˙Á$Ĥœ—' # ˙úĝ˙˙˙˙˙˙˙˙˙˙%Ôŭŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġò˙Ï -ŭ˙˙Ñĝ˙úġÖ!ݝ˙ûġ˙ŭ˙˙üÛ(É˙˙˙Î!8÷Â˙É !ú˙é˙Ö!üü˙î¤ û˙û˙ô˙’ š °²˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝŭû÷óñ ˙û˙ú˙ËĦĝí˙È *¤Ëôôġ˙˙˙üñ˙˙˙˙˙˙˙˙ŝ˙/ $Ġ˙éÉ% ĝ˙Ġ Ğû˙˙Òí  (ú˙˙ê˙ô˙˙(ûü˙İ 'Éí˙˙˙ ˙˙Ä˙˙ŝ˙Ğúü˙˙÷öûŝ˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙ï˙ùù¨ ˙˙ġòŻ#żóü˙ù  ˙˙˙ Ġ˙ù˙˙˙˙˙˙˙˙˙˙˙ŝö˙ü* ¤˙˙£Œ˙û×˙ôŭ˙ùü˙˜' (˜˙ġ˙óü˙£ ĥéĠ˙ûú˙˙˙˙ú˙ܟŞœú˘÷˙˙úġ˙È #ŭŝ˙ŝŭ˙×˙˙ŸòÑñŝ˙ĝ˙ŭ˙˙ûË1žû˙˙ĝÙ ×ŝ˙˙‡/×˙÷÷î˙˙ŭ˙˙˙˙˙˙˙˙˙úû˙˙˙˙˙# ,Ğü˙ñ˙˙ô˙ŝ™˙ü˙˙ĉ !†Ù˙ġ˙˙Ħò˙˙ŭ "öû˙˙˙˙4ġġ˙óùŝĝ˙˙˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙Ó Óö˙˙˙è˙ùö˙˙úúûôûüÛ !/˙ġ˙˙î'#û˙ĝ˙˙£ŝÚ˙öö˙ŭ˙ %Ïòáñ˙Ş%Ĉĝ˙ê˙˙Ĥ3" ġ˙ö˘$ó˙˙¸&¤§#žŭúï˙˙ü˙˙˙˙˙˙˙˙û#ĝ˙ŝ˙˙ù˙˙˙˙›%/öŭ˙ĝ˙ì˙˙˙˙˙˙˙˙ŝ˙˙È+ ˙ü˙ü˙Ë 'Ĉ˙ÑŻġ˙üÁŸ˜˙˙/ ÙñúÓ%˙˙ġ˙žĝûÙž˙˙˙ŭÛ)˙˙ġ˙˙$§ŭÙöÛ,˙ŝ·˙Ê˙ ˙˙ï˙˙ù˙˙˙˙˙˙˙˙ŭĈ&  ,ï˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïĞ " ˙ë÷û .¨ó÷˙˙ġ§ '”ŝ˙˙˙ó˙ŝû˙ó˙˙(Ê˙íò˙,/úö˙"˙˙˙òÉÔû˙˙“'¨ûñ˙é˙˙%&0 $ 0Áùŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙ŝŭûú-Ú˙è˙˙÷ù&!Ï˙ŭÉ-˘˙˙˙˙öö˙˙˙˙˙˙˙˙˙˙˙û˙ƒ" ĝ˙!#˙œ, ˙ì˙˙˙˙’%˙ĝŝ˙˙˙ì˙ '˙˙ĥ$!ó˙ŝìġïÇÎ˙ú˙ ßô˙˙úÒ$ŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ĝ˙üü˙˙è˙ŝôŜĠ° #Ċ˙˙˙ü½+˙˙ï˙Á0Ċ˙˙öî˙˙˙˙˙˙˙˙ŝü˙ı˙Ĵ˙ï˙ŭìéŝĝ˙˙ġ˙ŭ˙üùĦóó˙˙˙ûœ+!—˙˙˙˙ò˙öĝúôŜÌ˙˙ú˙ŭ˙ôúĝ˙˙˙§Şŝ˙ŝŭ˙Î˙˙Ê ˙˙˙˙í˙üùü÷˙ŝÇ-˙˙ĝĝŸ Íú˙˙°#›ï˙˙û˙ü˙˙˙˙˙˙˙˙˙ġ˙ŭû˙˙îî( ô˙ŭ˙öŝöûİ&#!ùúïŜġŸ¸ü˙˙èŝ%˙˙÷˙%˙üĝ˙î,Š˙˙ì˙ûËŭüï˙ü˙˙˙˙˙˙˙˙˙˙˙˙úŭŭÑ ˙êúö˙˙˙ö˙˙ŝ˙ŝÑ×/˙˙ï˙ô9Ŭ˙ġ˙˙/ ĝ˙ô˙˙Ŝ¨&Óŝòü˙Ë ˙ù˙Ġž 4öÇ˙  Ô˙ôÀ˙ċ˙˙ŭù˙ñ˙˙èŝ˙˙˙˙˙˙˙˙˙˜ ’˙ïïûî˙Ğö˙î#ŝ˙ĝ˙ġ˙˙˙˙˙˙˙˙˙üïŭÏË˙˙ë˙úŻ×ÙÀ ÉĊéòù˙!˙˙ŭ˙˙˙˙˙¨$ "* ĜÛ˙˙úÚ !š÷˙˙ŝ #ë˙š"™ŭ˙ŝû˙ü˙˙ìú%'˙÷ġÏ%ŸġŜ˙$5 ˙÷§'“˙ìġ˙ö˙˙˙˙˙˙˙˙˙ù˙ ) $Ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĉ(ê˙˙ £˙˙˙û˙& ²ĝċ˙ù˙˙˙÷ûŭ˙#Ĝ˙ŝ˙ú  8˙˙ú˙"£˙ì˙˙˙˙ï˙òÍ!˙˙ò˙˙ğ* ‘˙ï˙óŝ˙÷ŭó˙˙ŝŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ò˙˙ó˙˙˙ÒúĈ˙ Şñ˙˙ùŝ˙ùú˙˙˙˙˙˙˙˙üĝ˙˘*#˙÷ ˙˙ ó˙öô˙ş˘"žû˙ŭ˙ü Ç˙˙˙ĝ" ˙ĉ˙.˙˙˙˙çġ˙˙ôŝ˙3Ê˙ġ˙öĴĤ˙˙ú˙ŝÌÄ˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙û˙ü˙˙ĉ˙ö˙° +Ö˙˙ô˙á ÷˙ĝ˙˙ Ÿú˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙Ÿ4"ú˙ò˙ö˙˙óŝú˙ó˙ŝ˙É08•˙˙ïúŝœ ›˙üĝë˙˙ü˙ġ˙˜˘ŭò˙˙÷˙ŝ˙ŭ˙ûè &Êŝ˙ŝŭ˙ÌŭöĈ. ˙ŭŭ˙ü˙ĝ˙˙˙ġÖú÷˙ŝ& Ì˙Ïî—& $Ô˙ĝñŝ˙˙ú˙˙˙˙˙˙˙˙˙˙úò˙˙˙˙ &#,Ç˙ü˙˙˙Ó£Ĵ˙˙˙˙Ĵ öż˙˙÷$úô˙˙ %ĵ˙˙ġ˙”-Ï˙÷˙˙Û˙˙÷˙˙˙˙˙˙˙˙˙ŝ˙˙˙û˙ŭÎ˙˙˙˙˙ó˙˙˙˙üŸ2 ĦâŭĦĝ˙˙˙"ğöñ˙˙˙ô. ˙÷˙ŝ™+ Ï˙˙˙˙˜äüÒ˙ïúÛ"˙úŝ*Ċ˙ó&1ò˙˙ë˙˙˙÷˙˙˙˙˙ê˙˙˙˙˙˙˙˙£ ˙ŭ˙˙üŝŬ •˙˙Ö0ž˙ì˙ùí˙˙˙˙˙˙˙˙˙ŭŜ˙Ê" (Ĝç˙˙˙ñ ˙ù˙¤˙˙˙À˙˙ Ĵôü˙ü˙ôùùŝŻ­›•—¤£ú÷úŝ˙ÊÙ˙ŝ÷˙."ĵş #Ñ˙˙ŝ˙Ô! ˙ùó˙˙ ú˙˙˙ĵ-)Ĥùíŭ(Ŝ˙úÈ ˙˙˙˙û˙ù˙˙˙˙˙˙˙˙˙ĉ˙ÄÊİ  ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙œĞú÷%˙ûû˙ö˙žĤġ˙ù˙˙üù˙¤¨ŭ˙˙óĞ%Çŝ˙ô% ü˙ì˙˙Ħ"˘û˙ŭŭ˙ ¨˙ÒúŝúĈ'Úġ˙ó˙ŝô˙˙ù˙ĝ˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭŭŭŝ˙˙"$ûì˙˙˙ô˙š˙ĝ˙òĤÎ˙˙úŭ˙˙ò˙˙˙˙˙˙˙˙˙ü˙üġ ˙¤$!–Ż£ú˙˙ü˙÷Ŭ°&˙˙˙ġ˙ŝù˙û ˙˙ûž,ĝ˙˙ò˙˙÷˙˙˙û(Â˙˙ûĜÏ˙˙ŝùİ£Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙ü˙ï˙˙Ĉ'ÁĤ˙Ñï˙ò¤"ŝŭ˙ó÷#"ŭû˙˙û˙˙˙˙˙˙˙˙ü˙ò˙ì˙! ù˙˙ô˙ù˙ŭ˙ŝŝ˙ûË Ïüü˙˙˘Żû÷˙˙ö˙˙ö˙ġ Öŝ˙ĝĠ˙ï˙ó˙˙.İŝ˙ŝŭ˙£ŬġŬ ŭüù˙öû˙˙˙ü˙Ç"ü÷ŜËĤ !Ħ˙üϰ˘÷˙˙˙ûû˙˙˙˙˙˙˙˙˙˙ú˙˙˙ĝü˙(Óù˙ŝù˙ü˘&Ÿù˙˙ŝú›˙˙ïù˙Ê˙˙˙ö"¨ġ˙˙÷ÒĠ˙˙ûĝá' ô˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙˙˙˙Î!Î˙ò˙û÷§˙ñ˙˙×ú˙ Â˙ûû˙˙ Ÿ˙˙÷˙ôú¨ì˙ŭ˜)'Ïü˙˙ ”ŭ˙ô˙˙œĤù˙ù™˙˙úĞĝŭ˙ĝŝ÷˙˙ö˙˙é˙˙˙˙˙˙˙˙˙Ĥ% ÷˙ù÷˙˙Ñ áûŭŝ&  ú˙î˙˙ŝ˙˙˙˙˙˙˙˙˙ĝ˙Í"Ç˙ù˙˙İÛĝû˙ö˙˙ñ˙˙ñ"ŝü˙ŭü˙˙˙˙üĊÎú˙˙Òû˙˙˙˙ö˙ù˙üŝ˙“% )&Ĉ˙˙˙˙ûÌĤ˙ô˙ġö%ÛüúÛ ˙˙óÑ#Ìŝ˙ ĝü˙ŭö˙˙˙˙˙˙˙˙˙˙˙˙üÎ %&˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ñ˙ÈĞÍ˙ϒ"˙ôî˙óü˘&ŝ÷˙˙÷˙÷Ÿ§˙Ĉ!'À˙ùŭù£üú˙˙¤§ú˙˙ùÔ­Ġû˙îü#™˙öĝ˙ó˙Ò˙÷˙÷˙ö˙˙˙ĝ˙üù˙ÌüÒ˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ĝ˙úà Ò˙˙ù÷˙˙˙û˙˙úġ˙˙˙˙˙˙˙˙˙ü˙˙üœ#İĤ˜ Ê˙˙ò˙˙˙ĝŸ ĝ˙˙ö˙òû˙ô˙˙ úĝÑ˘ûú˙˙˙ŭ˙ó˙ŝÖ ˙˙ô˙Ş ŭúŭ˙÷Îüù˙ŝŭ˙˙˙˙˙˙˙˙˙˙ú˙ö˙˙˙íĞĝ˙˙÷˙É !ĝŭ˙üö§!˙÷˙ŝ˙˙˙˙˙˙˙˙ŭ˙ŝ˙ô˙İ˙Ĉ×ĝĠĈ˙÷ú˙ŝ˙˙ # 'Ì˙ö˙ġ¤¨ùŭ˙˙ŝÇ×üü˙Ħ£û˙ú˙˙úÒ˙ûŝœ×ùó˙˙ É˙ñ˙Ĥ!ü˙ŭ˙Ċìż˙ġ˙Ö %˙˙ġû£#œù˙íĦŭËÍ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙ö˙˙ŝ˙˙Ç1 !"ù˙˙üŝ£ ˙ĝ˙˙ż) ,Éûü˙˙) ˙û˙ùÎ˙˙ġÒĜÏûÏ˙#ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ì !Ó˙û È˙íÑ'˙˙ù!ù˙ú˙ŝ#˙˙÷ŝ˙£ ˙˙ô Ÿ˙û˙Òŭ˙˙˙³÷˙˙ŭž#â˙ùע˙Èü× Ôóŭ˙ĝŜŽ˙˙˙ġ˙˙˙˙˙˙˙˙ŝ %İôŭŝ˙˙Î˙ù˙˙§ û˙ŝüò˙˙˙˙˙˙˙˙˙˙ĝŭŬÌĝ˙˙ùö˙˙úü˙ĝ˙ù˙ĝ˙˙ö˙˙öŭ˙˙úû# Ÿ˙û˙òü˙˙˙ú˙ŝË#˙˙˙üó× Î˙ò˙ŝñ˙ĝ˙ŭĝ˙¨÷˙ûüÜŝ˙˙˙¨ ù˙˙ĝ˙˙ï˙ŝŭŭŝ˙˙˙˙ŭ˙˙› & #ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙úóüĠ% ˙ûĴ™˙˙˙ï˙˙ ÑÍŝ˙úì×˙Ġ˙ ˙˙˙˙ßĦ,Â˙˙˙î˙˙÷˙˙ù!ôüü˙˙˙˘î˙˙˙˙×È˙ġò˙˙ú˙˙ġó˙˙Ġ!˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$  ˙ŭù˙˙˙’%˙ŭ˙Ŭ!İñÉ˙ĝú˙˙˙˙˙˙˙˙˙˙˙ú˙ûù˙˘œ- ˙˙ñ˙˙˙˙š ˙í˙ûû˙ ˙ŝ˙˙+#˙˙ñŒ ˙˙˙ï˙Çĉûü˙Â(Ùĝ˙ŝ–%'˙ŭöÖ+”˙ù˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙ù˙¤) '˘ĵ˙ "§˙Öñ˙è³"Ì˙ġ÷˙%˙îú˙ù˙˙˙˙˙˙˙˙˙ñ˙˙ê˙ş'§›§"˙˙ż¤Ħ˙‘(İò˙ü!ĦÇúɗ)˙ë˙ ˙˙œé˙Í Óŝ˙ìğĠ˙˙ü#œ˙ûŞ´ü˙Ñ#˙û˙˙(£˙á˙˙ Ħ¨'~˙˙ó˙˙˙˙˙˙˙˙ó˙˙˙êú˙À ##˙˜˙ŭ˙" ˙˙˙À(—ü˙˙(Ûî˙˙ì! £- ›ù˙ü¨ ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙” ˙ì˙ ÂùŞ %‘˙˙˙ü˙˙˙ŭ—1 ˙ìħ$¨(-”˙ĝŭ" )şûŝ˙˙ĜêüôÑ˙ö˙ùÖò˙˙§!#˙ĝñ˙˙˙˙˙˙˙˙˙úÓ$ žŝ˙˙˙“˙ç˙˙ï& Îù˙˙˙î˙˙˙˙˙˙˙˙˙óĝÇ ü˙ġô˙˙úÑ˙öñ˙˙ĞœÑ˙š˙ŝù˙ûĝ÷˙û¨šŝ˙˙˙üĝú˙˙í×%”˙üò˙˙Ò $"%›ô˙˙òú˙Ë#%˙ò˙ü÷*!™˙ü˙˙·(ħùûô˙ŭİ &ŞÊ˙ôŝ˙ûŝ˙û˙ŭûŭ˙˙ĝò˙Ö* *&˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙á˙˙˙Ì#˙ĝĜùúû˙÷×ݽ˙ĝ˙ö˙˙€;'ÀùԚ/Ä˙îùú"*˙˙ç˙˙üŝŭö˙˙!)Ñ˙˙ö˙ ˙˙ö˙ùĝ“§Öó˙˙ù˙ùÛ˙úö˙!Ê˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ò%4 Ù÷üî˙#!Â˙ġúŝÁ!ĤÖ˙˙˙˙˙˙úú˙˙˙˙˙˙˙˙˙ô˙û˙Ç&ù˙³(Êú˙ï˙ĝù˙Á/Ŭ˙ù˙ìÒ! ˙û˙ĝ˙÷˙ë˙°úŭĉĈ ˙ĝ֜$/Šŝ˙ŝ˙³ $Ġú˙œ+%Ô˙ûû˙ŭ˙˙˙˙˙˙˙˙ŭû˙˙˙÷Ġ˙Ñ#˙˙Ó*Ĥû˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙ö˙ * ïú² "Éĉ! ˙˙Ê##'Ĵö˙ó˙Ĵ!'  (˘˙Ġ' ' !Ç˙˙ .•˙˙4#% ûü˙Ë%˙˙˜-"î˙˙˙ž" ¨ŝú˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙î&!Ҟ' % 3â˙È) &ô˙ó´!.ÍġÉ!"–ĝ˙˙ŭŭŞ! Ħ˙ööœ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙"!* ˙ĝ˙˙É ÙĴ!Ï˙ïé,!(ÌÉÑĤ Ó˙˙•- #, áû˙ŭ /£É9 Ó˙˙ĝŬ ù˙˙Ù! 0#Éóŝ˙˙˙˙˙˙˙˙˙˙ü˙î İÔóӝ$”ú˙ŭĝ"%°ÎÉ˙˙ï˙˙˙˙˙˙˙˙˙ë˙˙ î˙ú˙ĝë ˙˙ôš“˙ ,˙ŝ˙˙˙ùŝÎ$)%˙ïŝ˙ï˙˙˙ĝŝ×"˙˙˙˙÷˙†Ö˙îù˙ú˙˙˙˙ûìĥ žÜ˙ò˙´ ŝŭ˙ܗ#Á˙ü˙÷ġ˙˙˙˙ù˙ŭûŝ˙˙ôéŝŒ#£ Ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïġ› Ÿì˙ÑİœŻ˙ù˙ŝġ˙ï£!!ŭ˙÷û˙òÖ˙"'Ĝ˙˙ŭ ö˙˙' û˙˙˙˙żÖ˙ö˙ŞÉ˙˙˙ŭ˙ô&:¸ïñúġĦü˙˙  #Î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÊ Ĥ˙ üù˙˙ŝİ"(Ĥĝúöù˙˙ú˙˙˙˙˙˙˙˙˙÷˙òĝ˙ŝÌ"í˙Ñŭ˙ö˙ġü˙˙Ë ›˙˙˙Ž" #Ë˙û˙ù%(Ħ˙˙ï£ '“ *$š˙˙*Ÿ˙îÍĜġèÓı˙û˙˙ü˙˙˙˙˙˙˙˙˙˙˙ïû˙$ #,ĝû¤ Äħ #Ğŭû÷˙˙˙˙˙˙˙˙ĝ˙ŭ˙˙ôÛ˙³# ˙ŭñ˙¸ġ̜) Îû˙ĝ+ "§Ì˙ü˙˙ï  #!˙˙À–-•×˙ùù ˙üù˙œ4 !+İÌô˙ü˙̚˘£›Òġ˙ûħ‹™ ˙üóó˙ Ğ˙˙öŝ˙˙˙˙˙˙˙˙˙ü÷˙ú˙˙Œİ™Ĝöœ Ş’ĤĤÂ˙ù˙ŝĞÌú˙ŝ£Ĥ¤¨“˙˙ە•Ÿ˙˙óĝò˙ô˙Î"š˙˘˘Ó˙ŭ˙˙˘" ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÔîÀ¸ĉüŭ˙é˙˙# úĝéĴ˙û˙˙!İîŝì˙  !- œ˙˙˙+& #$ûè˙úĞ (&š˙ġ˙! Ç˙ô˙ô˙˙˙˙˙˙˙˙˙˙˙  "˙Ÿ$ ˙û˙˙ÏĦ˙ŝ˙ï˙˙˙˙˙˙˙˙˙˙ Ù˙ŭò˙˙܎-+¨( )ù˙ÔĦ Ç˙˙öŸ Ž˘ ˙ŭü˙Ċ!$ È˙÷ġö˙Ğ! ï˙˙üò˙9•ĝ˙˙—* ˙˙ 5ßŭ˙ó Êê˙ñ˙˙ĝ˙ĝ˙˙ŭ˙û˙ŝ˙ŭŝ˙˙˙ûôù˙%"( &˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙üùĴ˙ĝŭġúó÷˙˙˙˙ŝĝß +ï˙˙öú!$" ' ú÷İ $˙˙%#$üì˙×!&‰˙˙ôú" Äùŝî˙(' #¤Œŭ˙ĝ(, -’˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ù (#&Ŭ˙˙ùúŝ"¸î˙ùġ˙˙˙˙˙˙˙˙˙˙˙˙é˙ô˙˙˙”Ğŝŭ˙˙˙ö˙û˙÷˙ï°  '"çŭ !Ïúü) Éġ˙˙( ”˙ôÊĞ* Ï˙˙¨ ¤Ħùû˙˙% 7ü÷˙˙ó˙˙˙˙˙˙˙˙˙ö˙ü˙úŝš#§¤û›Ö˙÷¤“&˙™Ĵ—˙ïú˙˙˙˙˙˙˙˙˙˙˙ŝ˙ö˙é˙ó˙( ¤Î˙í˙˙Ġô˙Üöôŭ˙û˙âèî˙÷˙˙ŸŞ ££˙ú˙˙ó˙˙˙üŭ’³—˙˙ŝ˙ú˙Óä˙˙ġ˙öŭüü˙ê˙Òĝ˙ú˙˙íÇĠéúŝ÷ùù˙˙ġ˙ò˙˙˙˙˙˙ŭï˙ŭ˙˙˙ú˙ü˙˙é˙ó˙èŭòù˙˙˙˙˙˙˙˙˙˙˙ù˙˙òĝ˙˙Ùî˙˙ü˙˙˙ôĝ˙˙ġŝüŭó˙ŭúú˙˙˙˙ü˙ú˙ñ˙˙˙Ŝ˙˙˙ġ˙˙ó˙˙ĝ˙öü˙ĝΤ÷û˙ú˙üò˙ú˙çĠœö˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùú˙˙ëğ#ŭùù˙˙˙˙’+˜ñ˙˙úš"Êĝ˙é˙%–ĤŸ˙˙˙ü÷²ŸĴаÔġ˙ú÷Ç˙˙ŽÜ˙ù˙ó˙˙˙ŭĝÖŝ˙ò˙˙˙˙˙˙˙Îİ $Ĵ˘˙˙é˙ù˙˙˙˙˙˙˙˙˙˙˙˙ü¤#   £˙ú˙üï#-%˙ġï˙˙˙˙˙˙˙˙˙˙ñ) ) Ùû˙˙ŝêĝÜ'˙˙ò˙Àİ)% #äó÷ü˙Á"' ˙˙˙µ §ŭù˙˙˙ï! Ĵ˙˙ŭú˙ğ  #ŝœ"÷˙!Íóŭî &!1’˙›Êŝ˙˙éġ˙˙ù˙ĝŭ˙˙˙˙˙˙˙˙ĝĦ +š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ $'ĠŬŭŝù˙˙ûàŒ ñ˙û˙ŭ˙ &&˙˙ŭ˙˜!“˙˙ĦÙ˘‚à˙˙á '˙òŝ˙Ġ˘˙ŭ˙ûú˙‘-%ğŝ˙˙ñö˙ħôô˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙üĜ ĠÍÏó˙˙˙˙éĵĠĈÛÇĤé˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙ü˙ô˙ïù˙ûÊÏ˙ö˙çÁİŝñ˙˙˙ŭ˙û˙ÊĠÔ¤Ċžœ˙˙Ŝ‡*ÎÂÔ˙ö ($Öú˙˙Ç Üŝŭ˙˙ô˙ŜǙÔüŭôüÑÊĝ÷˙˙˙îòġ&˙ĝ˙ŝù˙˙˙˙˙˙˙˙˙˙ûĝú˙˙˙íÙËÔġî˙˙ÒÇ˙ŝĉ˙˙˙ù˙˙˙ìû˙˙˙˙ó˙òù˙ĝü˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙û÷ŭ˙äĝ˙ġ˙˙ñŝ˙˙ñ˙çŭ˙ŝ˙˙˙ŭô˙ŝ˙ŭô˙ü˙˙ŭ˙˙üŝ˙ù˙˙ïú˙˙ûĠ˙ü˙ŝüġ˙˙ùú˙˙ŝ˙˙˙˙˙˙ú˙ĝùŭ˙ó˙˙ĝ˙˙û˙˙ó˙˙˙î˙ù÷Ûüôŭ÷ï˙˙˙˙ü÷˙ü˙˙úíü˙î˙ó˙ŝ˙˙öŭ˙˙˙˙˙˙˙˙˙ö˙ĝ˙˙èôû˙˙ö˙ôöġ˙˙ŝġö˙í˙üŝ˙ŝ˙ö˙÷˙û˙˙˙˙ĝ˙û˙ñ˙˙˙×úĝ˙í˙ĝ˙û˙˙˙˙ŭ˙˙ĝô˙˙˙ŭë˙  ˙÷ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ûŝù˙˙ö˙˙ŝù˙˙ŝú˙ŭŭ˙˙ôûĝó˙úŝ˙÷˙­ë˙˙ï˙üŭ˙˙ûóĝġ˙ûĝ˙˙˙ġ˙ï˙˙ġ˙˙˙˙ó˙ĝŭ˙˙˙˙ùü˙ï˙ï˙˙ü˙ùî˙íùŝ˙á˙Íöŭü˙ôî˙ûùŭ˙˙˙˙˙˙˙˙ûŭ˙˙ì˙À¤ÈäÎÔçúŭö˙üŝÎÎËŞ—Ç˙î˙öü˙˙˙˙˙˙˙˙˙˙ËÎĠÀ̰úŭ÷˙ó˙˙˙öùÖÍÓ6 ĤÈÙ˙ŝ˙˙ü˙ז&!ží˙ŭ˙˙ġËË ˙˙ñ˙×)˙˙ì˙ô˙û˙ġ˙û˙ùí #+ ¤ġ % İ˙îĦ#³ĵ˙˙ġÏ%)Û˙àï˙ó˙ŭ˙˙˙ûúŝ˙˙îá) ,#Ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙úî),Ç˙òŭ˙ôäĤ—Ş™ŝ˙úú˙úŭ˙ŝû˙ô˙É­úúġŭûÔŭ˙˙ŭ÷ö˙û˙˙ú˙˙÷ġ˙ġûĝ˙ŭ˙ë˙óë˙Ĝ˙ó˙ŝú˙˙ö˙Ê˙˙òġŭô˙ŭ˙˙ô˙÷˙˙ 5˙÷ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙˙˙˙ġ˙˙˙˙û˙˙ó˙˙˙˙ĝŝ˙˙ŝóŭ˙û÷˙˙˙˙˙˙˙˙˙ú˙öù˙û˙˙˙ûú˙ù˙˙ù˙ŝ˙˙˙˙˙˙ù˙˙˙ġ˙ĝûè˙üë˙˙úú˙˙ûŭġ˙˙ĝŭù˙ü˙˙Ĥ˙êŝŝ˙˙ï˙˙ó˙˙˙ö˙ñ˙üÓ˙ó˙ë˙˙˙%"ö˙˙÷˙ü˙˙˙˙˙˙˙˙ŝġ˙˙˙ôß˙˙ùá˙˙û˙˙ôù˙÷˙ä˙ùŝè˙˙ç˙˙ü˙ĝ˙ûöĝ˙˙˙˙˙˙˙˙˙ü˙û˙˙ôŝ˙˙ì˙˙ö˙˙˙˙˙˙ġ˙˙˙˙ú˙˙Ú˙˙ú˙˙˙˙ö˙˙ó˙˙ô˙á˙˙è˙˙ï˙˙ûùó˙ê˙ŝñ˙˙ö÷˙˙˙ùĝ˙ŭġô˙û˙ñ˙˙ù˙˙ûŝû˙˙˙òĝ˙˙ï˙ŭ˙˙˙˙ïŝ˙ŝ˙˙óĝ˙˙ú˙˙òö˙ó˙˙˙öò˙óüüü˙˙˙˙˙˙˙˙˙ù˙˙ú˙˙ü˙ġü˙ŭ˙˙˙˙ôúú˙˙˙ĝ˙˙˙÷ù˙˙˙ŭùŝŭöó˙ûú˙ü˙˙üû˙˙ù˙úñ˙ñ˙˙˙ñ˙ê˙˙ŭ˙ĉ˙ü&£ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝô˙˙÷ó˙˙ŝ÷˙ġ˙ó˙÷˙˙àŝ˙ï˙˙˙˙ô˙˙î3÷˙êû˙î˙˙ĝ˙˙˙˙˙í˙˙ûè˙˙ù˙˙˙ĝġŝġ÷˙÷˙˙ĝù˙˙˙˙ö÷˙ô˙ŭŝċ˙ú˙˙ŭŭû˙˙ó×˙ŝü˙ŭ˙ûö˙˙˙˙˙˙˙˙˙ù˙˙÷ŭ˙˙˙˙éġûĝŝ˙˙ŝ˙˙ŝĝ˙ü˙÷˙˙˙˙ü˙ô˙˙˙˙˙˙˙˙ù˙˙ġù˙˙ô˙˙ô˙˙˙ĝŝ˙ô˙ŝúéü˙˙ùóġ˙ë˙ËŝĝĜŠŻ§Á˙˙ô˙èü˙˙ĝ˙ﭛ˙ñ˙ú˙ëŝŝ˙ùŝ˙ï˙ù˙˙öû˙˙Ŭò˙˙ê˙˙ô˙´—’°™İ˙˙󢜤Ĝò˙ŭ˙˙˙êúò˙˙óË$%  °˙˙˙˙óŝ˙˙ŝüüŝ˙˙˙íŝŸ¤žŭÛ£’Ÿ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝϟ#""›˙˙˙˙öú×÷˙ŭ˙û˙˙î˙ûĝ˙ŭ˙˙îŭ˙˙ï˙˙˙˙ŝ˙ñ˙ü˙˙ô˙÷û˙ŝŭ˙üúŝ˙˙ï˙ŝ˙˙˙˙üŝ˙˙˙˙ûü˙ü˙˙ġ˙˙ŝù˙ôŭŝĝ˙î˙ùĝ ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙ûŝ˙÷˙˙˙ö˙ö˙úù˙ô˙Èû˙ŝ˙÷˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ŝü˙ò˙ġ˙÷˙ùó˙ŝú˙÷ú˙˙ùüúŭĝ˙˙ü˙ü˙˙˙÷˙˙ċ˙ĝ˙ïü˙ü˙˙üö˙˙ù˙˙ŝĝÖŝŭ˙˙ŭûŝ˙ö˙öú˙ŭ˙ü˙˙˙öû˙˙ü˙§ $Ô˙ú˙ŭ˙ŭ˙˙˙˙˙˙˙˙ú˙ŭŭ˙ŭ˙ôù˙˙ì˙ùúŝú˙˙û˙˙ŭú˙˙ŭ˙ĝ˙˙˙üŝ˙˙˙ù˙˙˙˙˙˙˙˙˙ú˙˙ï˙˙÷ġ˙üò˙ùñ˙û˙÷˙˙˙ĝ˙ŝ˙˙˙˙÷ĝ˙í˙ĝŭ˙ö˙ùü˙˙˙ó˙˙÷˙˙÷ù˙˙˙ŝ˙˙˙˙˙ċ˙ù˙ùŭ˙ü˙ö˙˙˙ŭ˙ü˙ŭ˙˙˙˙ù˙˙û˙ü˙ŭü˙ŝû˙ŭúŝŝ˙ù˙˙˙ò˙˙üġü˙ŭŭ˙ŝüï˙ĝŭ˙î˙˙ŝ˙ŭ˙˙˙˙˙˙˙˙˙˙ù˙ŭ÷˙ŝ˙˙˙ò˙ŝĝ˙ŝ˙ú˙ûġ˙˙û˙˙˙ĝĝ˙ú˙˙˙ŭ˙ü˙˙˙ü˙˙ŭŭ˙ĝü˙ġ˙˙˙ò˙˙˙ŭô˙ü˙ŭ˙î˙˙÷˙ ˘˙ġú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú˙ñ˙˙˙ĝ˙˙˙ĝ˙˙ü˙öû˙ŭġ˙ĝ˙ŝ˙ŭûŝ˙Ÿ˙ú˙üü˙÷ġ˙üö˙ĝû˙˙úû˙˙ö˙úô˙˙ĝ˙úû˙üü˙ĝŝ˙ŝ˙ŝĝ˙˙ì˙˙úŝ˙ġüŭĝ˙˙òò˙˙˙˙˙ŭú˙üġ˙ö˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙ŭûúÓ˙˙ô˙ò˙ü˙˙ô˙ĝú˙˙÷û˙úû˙˙˙˙˙˙˙˙˙˙˙òûŝ˙ŭú˙˙ü˙ŝñ˙˙ĝô˙ĝú˙˙ú˙û˙ŭ˙ĝ˙ò˙ú˙Î˙úĠü˙û˙˙˙ŝĝ˙ĝ˙ü˙Òú˙ŝ˙û˙˙˙ŝ˙ò˙˙ï˙ŝó˙˙ùùŭ˙˙ò˙í˙˙ñÒ˙üÒü˙ÏÌú˙ú˙Ïŝ˙ô˙˙ùö˙˙ü˙˙ö§ ' Ĵŭù˙ñ˙ŝŭüŝ˙˙˙˙ĝü˙öÔ˙ü˙ô˙˙×ùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙Ç' Ĉ"˙úŭöŭÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙úúĝ˙ó! ˙÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙œ Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙˙纗Ì÷˙˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙üŝ˙Ş˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˘Ĵ˙ʧ!!ûŝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö÷˙" Ë˙ú˙íü£%Öëŭ˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙ŝ˙ù' Ċ˙ċ˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ç* ˜Ġòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷÷ŝ˙˙úúñêïü˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ñ÷ġ"ġ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ġì!%î÷˙˙ġ ˙˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù3Ö÷˙ñì˙˙˙˜Ì˙îû˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŝŭü˙ Ô˙ó˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüÓ Ĵ˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙˙˙ä˙˙úùŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙˙ "(˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙“+ ‘˙˙óŭ˙•!%6ñúö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙Ë*£ŝż˙ü˙ġ& ­˙˙÷˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ö˙ù˙Ĥ˙˙ġ˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙Íı “˙ĝ˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŝ˙˙˙ùġóŝ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙# œġöù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝòâ#Żüí˙öÏ#  ĵ˙˙öó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô÷˙˙Ġ'¤˙ìŝ˙ŭ­˙ù˙ü˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙úġ˙˙ġŭ˙ŭ˙üĝ˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙èú˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûü˙˙˙˙˙üûüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ġ˙˙à+Ëö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öĝú² ŽİŸĴ—Şö˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙úĊ$Ùü÷˙˙ĝ˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙ö˙ô˙ñóö˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙àŭ˙˙÷ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙úġò˙˙úû˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙úó˙˙ùû˙˙˙Ġ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ċÍĥ#°áè˙˙ö˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öù˙û˙˙ú˙Ĝž£Ş˙üŝû˙˙öŝ˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ó˙˙˙˙˙÷˙ïö˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝúùû˙ê˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭûûŭ˙˙˙ôû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙úû˙ï˙ê˙˙ôġ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ë˙˙ûĝ˙Ë œ²˘˙ĝ÷˙˙ï˙ĝ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝú˙öŝŝü˙Ê˙ÁÒ˙úû˙˙ŝ˙ô˙ü˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ûü˙ò˙˙ñ˙˙÷˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙û˙˙˙ĝ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙üù˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ô˙ú˙ù˙˙˙ġ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ü˙ù˙ŭ˙öÏŭ˙˙˙ŭŝ˙ŝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙˙üŭ˙˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙üŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙üüĝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üúûŭ˙ûû˙˙˙ŝ˙ŭü˙˙ŭú˙˙˙˙úó˙ö˙˙ŝ˙ûü˙˙ŝ˙˙˙ĝû˙ŭ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûöû˙˙˙˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïŝ˙ŭŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ùŝ˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ûù˙˙˙˙ŭŝú˙˙˙˙ü˙˙˙˙˙˙˙üĝŭġ˙˙ù˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝŭ˙˙úôú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ŭ˙úñóġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ú˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ù˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùúûúĝ˙ŝüû÷ġú˙ŝ˙˙˙˙ŝü˙˙ö˙˙ĝ˙÷ŝêġ˙˙ŭŭ˙˙˙˙ò˙˙˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ò˙ĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ô˙ò˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙ö˙˙ĝü˙ŭ˙˙ôŝŝ˙˙˙˙˙˙÷ûû˙˙üîú˙ŭġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üôŭ˙ŝ÷÷öö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö÷÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙˙˙üüŭûüŝ˙˙˙ûôŭ˙ŭġŝ˙˙ô˙˙˙ú˙ë˙îöôŝ˙˙ûŭ˙˙ô˙öŝ˙î÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙˙ŭĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙ûŝ˙˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ò˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úîü˙ġûï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝôñöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúûŝ˙˙˙üö÷ŭ˙ŝ˙ġû˙˙ü˙ŝŭ˙˙ó˙ò˙˙˙˙ŝġŭ˙úüü˙ê˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ú÷ŝ˙ùö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûñµù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ì˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ġ˙˙˙ŝ˙˙˙ژ¨ï˙÷˙˙ö˙˙û˙˙Ŭ“Ŭ˙˙ìß”Ş˙ôġ˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉĞ ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ĝüâ…#˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙# œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž ‘ Íġ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙& )–ó˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ı˜Ì÷˙˙Û˚İû˙˙ö˙ŝ˙˙ġú&''À˙š! #˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ù˙˙÷˙Í˙÷˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙÷˙ŭù˙ú˙˙ó˙óÙÉó˙˙ĝ˙˙ôŝ˙ŝѤ û˙ö˙˙ĝŝû˙˙˙˙˙˙˙˙˙ùË˙öĠ˙˙˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙üïÖŬ˜ò˙ŭ˙ġ˙£˙˙ù˙˙ĝŝ˙öŭÌ˙ ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú¨$˙˙ûŭ˙˙ü˙ù˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ŭŝ˙Í$"Ħüú˙úü˙ü˙˙ŝ˙˙úú˙˙˙ü˙ŝ˙˙üú˙˙˙ûŝ˙ŝŝ˙ú˙˙üùü˙˙ü˙˙˙ŭ˙˙ü˙ô˙ûúŭ˙÷ í˙ù˙˙˙˙˙˙˙˙ù˙ŝ˙ġû˙¤ Èû˙˙˙˙ú˙˙˙ú˙˙˙û˙˙ö˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝ˙ż+"ó˙ûû˙Ñ!ŻüÔö˙ü˙ô˙# $ "›˙û˙˙˙ŭùû˙˙ö˙˙˙ò˙˙˙ú˙˙˙˙ù˙ŝŝ˙÷˙˙˙ó˙ĝû˙˙˙üŭ˙üŭŭŭ˙˙˙üü˙ŝ÷˙˙˙ŝû˙öî˙ôô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙˙úùú˙˙üŭ˙˙û˙˙˙÷˙úŝŝŭ˙ŝúü˙˙ü˙˙ûĝü˙˙ŭ˙ö˙ŝ˙ôú˙û˙˙ŭü˙˙úŭ˙˙üùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙÷ŝ˙ö˙˙˙û˙˙Ëĝ˙üù˙üú˙˙˙˙˙˙˙˙ô˙˙ó˙ù˙˙˙˙îù˙˙Ĉ¨Ë˙÷˙˙úü˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝöû˙˙˙˙îĴ'›˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙ô˙˙ŭ˙˙áŜ×ôù˙óġ˙˙öŽ"$Ĵö˙ùû˙˙˙˙˙˙˙˙˙˙˙ĝ˙­’£!žïòĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙ŭû˙à˙˙˙Ħ+˙˙˙á˙ Ò˙˙ŝ˙˙ïü˙˙Ÿ ' Ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġ˙ü 6%˙˙˙÷˙ġŝû˙ŝĝŭó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝ¸ħ2”<Ò˙˙˙ü˙˙û˙˙ù˙˙˙˙˙˙ŭ˙˙˙˙˙üû˙ùùŝ˙˙˙ŭ˙˙ŝúŭ˙˙é˙˙˙˙ŝ˙˙˙ŝ˙ó˙˙˙˙"İ˙÷˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ġž˙˙ôüŭúŭŭ˙ŭ˙˙˙ŭó˙÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙¸ü˙˙ŭÑ›óö˙ĝ˙˙ôÈ˙Ÿ—˙˙œĴï˙úüú˙˙˙˙ú˙÷úü˙˙˙ú˙˙üġù˙˙üû˙˙˙û˙˙û˙˙ûöû˙˙˙˙üŭ˙˙ûû˙ó˙˙˙üġôü˙í˙˙ò˙˙ü˙˙˙˙˙˙˙˙ñ˙˙˙ŭ˙˙û˙ŝ˙˙ûù˙˙û˙˙ŭŝ˙˙˙˙ùñ˙˙˙ŭ˙ŭ˙˙ŝü˙˙ŝŝ˙˙˙˙úü˙ġ˙üó˙˙˙÷˙˙˙ŝŭ˙˙û˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙ŭûü˙˙ú˙˙úöúâ, Ôù˙ĝùŭ˙˙˙˙˙˙˙˙˙˙˙è˙˙ö˙íġ˙˙ì  Áû˙˙ŝ˙û˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙êş%&¤Êúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôú˙ó˙ġ˙˙í˙˙˙˧˙û˙ŝ˙˙ìÓ* '™ù˙ùú˙˙ŝ˙˙˙˙˙˙˙˙ü˙#  ˙éô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙û˙˙í˙É  ü˙Ï% áùûġ˙˙û˙š!!ı˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭúä +ĉ˙ġú˙ü˙ô÷öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙™'œàÛÖ·ú˙˙ô˙˙˙ü÷û˙˙˙ú÷ĝĝö˙ĝúüġ÷˙˙˙˙˙˙ŝûŝ˙˙˙˙ûú˙ö˙˙ŝûĝûŝü÷ŝ˙˙ü˙˙˙˙ .•˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙÷Ĝ'&ŭŭ˙ü˙˙ü˙üö˙ù˙˙ġŝ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙û%*Ž˙ĝ÷ü˙ÔĠÓġ˙˙˙ü÷ôäë˙˙ë 6Ëùç˙À²ĝ˙˙˙˙û˙ô˙ü˙˙˙˙˙ŭú˙˙öŝ˙˙˙˙üü˙ü˙ŝñú˙û÷˙˙˙ŭ˙úñüúü˙ŭùü˙˙ŝúŭ˙˙˙˙˙ŭ˙ġ˙ŭŝ÷˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙ŝûü˙˙ŝüüŭ˙˙ŭŭ˙˙˙˙ûŭ˙ĝ÷˙˙ŭ˙˙˙ŭŭŝŭüġ÷˙˙üú˙ö˙ü˙ĝ˙û˙˙˙˙ŭŭ˙˙ŭ˙˙ĝ˙ùüó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙û÷˙˙ö˙ŭù˙§ " , ­ċ˙˙ŝ˙û˙˙˙˙˙˙˙˙˙ó˙˙˙ñ˙˙˙÷ġÌ'ùûù˙˙÷˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úü˙ö͓+§˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝċ˙ü˙ŭ ü˙ú÷˙ïà *š˜¨§ħÓ˙˙ú˙˙÷˙˙˙˙˙˙˙˙˙˙Ġ·ôôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙ŝ˙ġ˙­ĴŭŝŭûĤ,ü˙˙ŭúó˙é$)'‹˙˙ç% ×˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öüúĞ0žüŝŝ˙ù˙öù˙˙÷ôĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġüû˙ĵ$Û˙˙ġ˙ûüü˙ĝ˙˙ü˙˙˙˙˙ŝŭŝ˙˙˙˙ü˙˙üŝ˙˙˙˙ŝŭüü˙˙˙ô˙˙éù˙ú˙˙˙ŝ˙˙˙˙˙˙ŝóûûùĝÙ&ĝ˙÷˙˙˙˙˙˙˙˙˙ŭ˙ŭĝúú˙•ŞÙġŝüúö˙ó˙ü˙ŭ˙˙˙˙ó˙˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝ˙ùó˙ü!ôû˙ĝŭ˙ü˙˙úòò˙û˙Ê!˙ŭ˙ íü˙ôü˙Ô˙òŭú˙ü˙û˙ú˙ò˙ü˙ô˙÷ù˙óŭŭúùö˙˙ŝ˙˙˙˙û˙˙˙ŭûŭ˙˙˙˙˙˙ûú˙˙û˙÷û˙˙˙ùïô˙ĞÔ˙ïŝ˙˙˙˙˙˙˙˙˙˙ŭöûŭ÷öŭ˙˙˙˙˙˙˙ŭ˙˙˙üûüŭüùû˙˙˙ü˙òüŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙üù˙ŝöŭûüŭüûü˙˙˙˙˙ü˙ö˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙ŭ˙ŭ˙ò˙˙ "# ˙˙ç˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙ġò˙îûó˙˙í§ú˙˙ñġ˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝüüŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙˙˙˙˙ûÔ™ıĜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ĝŝ˙˙ö˙ó˙˙˙œ ü˙öû˙Әžñ˙ôû˙ü˙ùö˙˙ó˙˙˙˙˙˙˙˙˙˙òÙ $˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝŭŭ˙˙˙˙ô˙˙ö¨›˙˙˙˙÷áÏŝĝöú˙˙˙˙ “˙ù˙û  " ×ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙÷˙˙ı˙˙˙˙˙ò˙˙˙˙ŝùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ĝÛ Ì˙ġ˙˙ŝġ˙˙˙˙óñ˙˙˙üŭ˙˙˙ŭĝöüü˙˙˙˙ûóöùŭ˙˙˙˙ú˙ŭġ˙˙û˙÷ĝûŝŝüü˙˙ġ˙ŝ˙˙˙˙˙Ë' ù˙˙˙˙˙˙˙˙˙˙˙ĝŭ˙˙˙ĝü˙˙ñŭ˙˙ŝ˙˙˙˙˙ù˙ĝúġ˙Ôŭĝŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ô˙˙˙˙ö˙ŝ÷˙˙˙˙ŭ˙ü˙Í ž˙ŝ˙ùÊ' ü˙òû˙ġ˙˙˙˙ŭûĝ˙ŭü˙üôŭŝ˙˙˙˙˙˙˙˙˙ùöú˙ñüö˙ó˙˙üôŭ˙ŝ÷÷˙˙ŭûüŝûö˙ü˙˙ĝŭ˙˙Ŝ“§ô˙ŝ˙˙˙˙˙˙˙˙˙ôú˙˙˙˙˙˙÷ŭ˙úóô˙˙˙˙ŝ˙ŝŭŝ˙˙ĝ÷òûŝ˙ŭ˙üûŝ˙˙˙ŭĝ˙˙ŝô÷üûñ˙˙ŭí˙˙ŝ˙ŝŭŝ˙ŝ˙˙ŭ˙ĝŝü˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝŭŭ˙˙˙ġ˙˙ûü˙¸"%Ĉĵĉì˙˙ìè˙ŝŭ˙ñ˙˙˙˙˙˙˙˙˙ù˙˙˙ù˙˙ü˙ò˙´ 0“ÄĜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöü˙˙—!¤˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ö˙ôÔ˙ŭè˙ĝ˙˙£Î˙ô˙˙˙ı'Ê˙û˙˙Ä˙˙˙ü˙˙ú˙˙˙˙˙˙˙˙˙û˙ËĞ İ˙˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭùï˙˙˙˙˙ '”Í˙÷ô˙˙˙ô˙˙ü˙í˙ò ù˙˙ĝĝÛ Ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŭ˙ŝ˙û˙ŝñ˙ĝŭ˙˙˙˙ôĝ˙˙üĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ñ! Îû˙ó˙˙˙óó˙˙˙˙˙˙ú˙ŝüŭŭûü˙ŭ˙ĝñü˙˙˙˙˙˙˙ŭ˙˙˙ó˙ŭòúġĝŝ˙˙˙˙ŝĝ÷ú˙˙˙˙ñ÷ú˙Ï˙Ùŭ˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ñôú˙˙ó˙˙˙˙ùì˙ġ˙˙˙ñŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷öûö˙˙˙ ŭŭ˙ĝú˙˙˙óò˙ŝú˙˙Ì7ù˙ûûü§˙û˙˙úŝ˙˙ö˙ŝ˙˙˙˙ú˙˙˙÷˙˙˙ù˙ê˙˙ŝü˙˙˙û˙˙ŭú˙ùĝûü˙˙˙ûŝ˙˙ö÷˙˙˙˙˙˙˙ŭ÷÷˙˙Í -$¤˙˙ò˙˙˙˙˙˙˙˙˙˙˙ôĝ˙˙ñ˙˙˙˙˙˙˙úŝŭŝ˙˙˙˙˙˙˙ü˙˙ŝò˙˙ŝü˙˙˙˙˙ùŭŭü˙˙˙÷˙ü˙÷Ŝ ˙˙˙˙˙˙ŝŭŝú˙˙˙˙˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙ô˙ŭú˙ò1˙˙ì˙ú˙˙˙û˙úù˙˙˙˙˙˙˙˙˙ŝ˙ċ÷˙Äú˙˙˙˙˙ê" !˘˙ú˙ûġú˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôù˙üû˙˙˙ Ÿî˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙—É˙˙˙˙ûî˙˙˙ïŭ˙ü˙óĤ &Èñ˙÷û˙˙ó˙˙û˙ŝ˙˙˙˙˙˙˙˙˙˙ö ¤ô˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭöĝ˙˙˙û˙íû˙˙ Ş˙ŭ˙˙ùó˙û˙ġú˙˙òÚ"˙˙ùú˙–#!ĉó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭóú˙Öú˙óù˙ü˙˙ŭö˙ùú˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö÷˙ Ï˙˙ĝö˙˙ú˙êù˙ìù˙ŭúû˙˙˙˙˙ù˙˙ġ˙˙òŭñŭ˙˙ĝú˙˙˙˙˙˙˙ü˙ü÷ĝ˙˙˙˙˙˙÷ġ˙û˙˙óĠ˘˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ġĝ˙ë˙ûħ÷è˙ûù˙ŝúéùúŭԘĴÉô÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ĉ% &˙ùù˙˙˙˙û˙˙˙˙ŭ˙í "ñ˙˙˙˙µò˙óûö˙ùô˙ۚĞĜ˙ġ˙ŭ˙˙óóó˙˙˙˙˙ñ˙˙í˙ö˙ë˙˙˙ü˙ôú˙˙ú÷ŝ˙ùú˙˙˙úĝ÷ġŝû˙˙˙˙Ż))Ìö˙˙˙˙˙˙˙˙˙˙ŭûü˙˙˙˙˙ûŭûĝúŝŭĝ˙üŝ˙˙üùû˙ŝê˙üö˙˙˙˙˙úöú˙˙˙ŭ˙˙ŝ˙˙÷ùü˙˙ûùü˙˙ŝü˙˙óúó˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭöĝ˙˙˙ûüĝ˙ö˙˙Ġ"ž˙òù˙˙ôġî˙˙ŭù˙˙˙˙˙˙˙˙˙÷ù˙˙"Òù˙ñü˙˙Ë£ôÚô˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙ú˙£Ïŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ×­ùöö˙ú˙ùö˙˙ĝ˙˙÷˙˙˘Ĝ˙˙ö˙ò˙Ĝó˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙úÄ/ !ŭ˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŬŜ˙˙ŝŭ˙ġ˙˙˙—™˙ù˙úŭ˙ĝ˙ô˙˙ò˙˙Ċ&˙ŝ˙˙î˙Îŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöü˙˙ŝïšÜŭù˙˙ö˙Ġš•Üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙í $ŸÓô˙˙ûŝĝĝŝ˘È˘Ò˙ü˙˙˙óÍŞ˜Îŭ˙ü˙骢Şĝ˙˙˙ŭü÷$’˙ë×ĦšÁğÁÛġ˙˙ŝ˙˙˙÷˜ Ş˜ù˙ó˙˙˙˙˙˙˙˙˙˙ö˙ŝûü˘ #˙û˙ŭÌ˘&˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙òÔ§•ù˙ú֖ *Ÿö˙˙˙˘*!˙ڔ˘› ¨˘Ö÷˙ëÜ£Ħ$,˙˙ĝÍ&ÛċŜ ı˙üŝÖ˘ —Ğŝ˙˙ĝüâ…#Ôŭŭ˰¸—˙˙˙ĝú˙İ&œ˙ö˙˙˙˙˙˙˙˙˙ŝ˙ùš%$ĞÄγ•˘Ġ˙˙ŝŝ˙ŝôîï˙Ĝ™ĤÉ˙ùŝ˙˙ŝñéò˙ûü˙ûÍİÇ˙˙˙Òúïîôŝ˙ŝŝ˙ŭŻ›Şŭ÷˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŬŜ˙˙ŝ˙˙˙ú˙óÍ"˙ŝ˙˙ġ˙ŝ˙˙ôù˙ĝ˙˙˙˙˙˙˙˙˙ĝû %£˙ŝ˙ú˙óÔĦ˙ö˙ŝú˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙ĝ˙˙ŝ˙˙ò˙˙ġ˙˙˙úŭö˙ùŝ˙ú˙Ïö˙ŭ˙˙˙î˙˙ŭĝÓŭ˙ġ˙ü˙û˙ó˙ûġ˙ġ˙ü˙ùÒ˙ú÷˙˙˙˙˙˙˙˙˙úŭ˙˙˙ŝŝŝüÓö˙˙üù˙ú˙˙ñ˙˙˙˙˙Éàĝ§ÌÛòü˙ú˙˙˙˙˙ġ˙ÎÒÍŭú˙˙öŭŝûßġ˙˙˙ùÑÎĦÈ˙˙˙˙ŭüÒ˙Ò˙û˙ŝ˙û˙Ì˙ġ˙ŭü˙ Ÿ˙ŭù˙ŝ˙ö˙ü˙÷˙˙˙ĠÍÒùö˙˙˙ü˙#÷˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙˙ŝû˙ĊĦí¨Ħ˙Ñüŝ˙ù˙üí˙Í %˙ŝ˙ŝú˙ĝ˙Ş—˙˙úÉ×üÖÂ˙ŭŭù˙û$ ˙ġ˙˙ü—  Û˙˙¤ Ë˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭŝİġü˙üÊ£!!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë¤ (Ñŝ÷üüÍ ÎûŜùž$!˙˙üŝ˙üñ˙ ˙üÎ%˙˙˙ŭ÷˙Ĵ !ŭú˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙û˜(Ĥüö˙ú"&˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙÷ñ˙ÄÂ' $ ŭûôá"£ÓË˙Ìŭ“&!ü˙ŝ  £ÌĴ£Ûúŭ!ĞÄŝ˙œ "§$û˙¤  ×˙ġû˘# !!ú˙˙˙˙˙˙˙˙ö˙ĝ" ˙˙ùŝŭòĜ , Ë˙˙˙˙÷˙—¨˙˙•˘ü˙–˙ŝô˙˙ö˙žÎü˙˙˙˙˙˙˙˙ò˙íûŝ˙úûÇ˙¤˘˙ÉÊÏ˙˙úĝ˙˙ÄúÑû˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙ö˙˙ Ħüú˙÷û˙Κġ˙÷ŭ˙˙˙ü˙ŭ˙û˙˙÷˙úÏû˙ŭ˙ñ˙óû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙÷˙ü÷˙Ĝġ˙˙˙÷˙ŭ÷˙ú˙ü˙˙ö˙ûŝ˙ŭù˙˙û˙ó˙˙˙˙ŝ˙úŝ˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙œÎ˙˙÷ò˙ûñ˙ŭŝï˙˙˙˙˙˙Ż…­–›ŝġó˙ùĝ§Ñŝü× Ĵï˙ĦŞ˙ñ˙ê˙݉‘Ñ˙˙ö˙˙˙˙˙˙˙˙˙˙˙ŝŝŭüûû £˙ŝŝ˙ ü˙÷ú˙ô÷˙˙­ $Ħà˙ü˙öó˙ċ"§ÚÍġè˙˙Ħ–Ĥ¤Ñ˙ï˙¨Œŝûüĝß š¤Ê˙ë˙ô”˙û˙îš:  ²™Ħ˙÷öİ£¤$˘˙ġġ!" µ˙ŭ˙òúÄŸ˙òĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙ù˙Ï%, ¨˙ô˙ġö˙Â"™³ !ġú˙ĝü˙–˙ŭî˙™ $ò˙ú˙ž( !˙ö˙˙˙# & ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĝ˙à ˙˙÷û§£ §˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙"$!Ïüŭ˙ž$($£. Ùü˙˙$)û˙ŭ!˙˙˙ñ"$˙ûŝç…'ùû˙û˙"ĤüÌ  “˙˙û˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙Ż ü˙÷Î"%ĦĤ %ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġû˙˙˙˙¨/ ,Ħ$ö˙˙é #(Ä˙ŭ˙"$ï˙ú–+$(Ñ˙’$ġ˙˙˜(Ñ˙˙"!'Ùû ˙ŭÎ#ô˙'&,!&ç˙ӕ* $# ™˙˙˙˙˙˙˙˙˙˙ĝ "%!œÄ˙ĝ˙Ô­˘–Ç÷˙óߛ£-,—ü—" ˜ĴœÂġ˙Ž+ŸÔ˙˙˙˙˙˙˙˙˙ç˙˙û˙˙# )Ÿô˙˙îÑ("›˙ü˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙'#š˙ġ˙˙ì­ı˙” §—Ôñ˙˙˙ö˙ó˙Ĉ³%Ħ˘˜˙Ä˙˙˙˙ñŭ˙˙˙˙˙˙˙˙˙÷û˙ŭóŝ˙˙ĜŠ˘Ñד Żˆ›˙Ċ˙˙ú˙˙ĝŻžİ˙úúô˙ġ˙ï˙ùû÷˙ó˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙š "! ë˙Éô˙ú "&$Û˙ĝ˙˙Ÿž! ˙§((˙!Ë˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙˙¤˙üŝ’!Ĉ˙˙ò˙˙ñÖÒĝù˙Ñ'%‘˙˙˙ú˙! Ġ˙ŝ™1%ô˙˙û :˙˙óÓ şĊ˙˙ÛĦÈ˙!˙Ù$2ŭü˙˙âŜéô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙ġŭ˙¤!+Ĉ˙˙˙˙›Ë˙ì™"(˘˙öùù˙›"Ċ˙ŭùĦÍŭ˙Î & ˙˙üê˙Ĵ4$Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù+%"û˙  ÈòÏÓ'ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġû Ñ×ÀŝúġÓ %żú÷˙)ùú˙ò<ġ˙˙ċ"˙úŭ˙˙#˙˙˙& ˙˙˙úÌ' ˙È˙2¤ĝó˙˙˙˙˙˙˙˙˙ú˙ù˙ŭ˙è3 šôġ˙Ô'İ÷˙Ĵ  ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûë˙ü†˙ĝ˙¨ö˙˙˙’Ñ÷˙ùĠ–§˙ùĠ•4 ĠÄÌĵµŜŜ‹%!ġ˙ĝÑ!$Ğ˙Ê˙ÏÒ) +Û÷ö. (­Òʵ(˙˙ì˙!ÉÍŝġ˙˙˙˙˙˙˙˙ó˙Í " ĞÀµ&ü˙ô Ú˙óÍ(ĥü˙öÄ "& –˙#" $#Ü˙‡ ˙˙˙˙˙˙˙˙ŝ˙˙÷û˙!Ȳ Ÿ˙î˙Ò )$Î÷˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˘% &ÙîŭÛ $#$İë˙˙˙˙ö˙™#  ˜˙˙˙ġ˙ŭ˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙é!($+$˙ò˙˙ò   È˙˙˙˙˙ô˙Í˙˙˙˙ŝŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ.!'œöŻ&"œ˙ÑĠ¤ ĤĦ§  Ñ˙ì§+Ó˙ĵ" ­ŝÚ˘ !!˙è˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙ŭĝ˙Öŭó˙ Ĵ˙ÙóÜŭ$˙˙˙ĝʔ+! ŝŝ˙÷œ &˙ŝò˙˙—˙˙÷˙+˙˘üí˙˙Š˙úŭŭ˙šÒ˙˙ú˜.!Ġò˙ġü–$#ŝ˙˙öëÖ &!óôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙üö%ĊŞ Ğöûŭ•/!˘ŭ˙˙ĝ“˙ù˙ÔŞ˙˙Îŝ#˙˙ĝ˙'"ŝú˙˙ĝ  ú˙ë˙#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙˙Ú+%ġ˙ó Ĵ˙˙ĉİ›ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ë$Î˙˙˙˙˙žü˙Ö˙˜! °÷÷˙!˙˙˙ú˙”˘ó˙öóö­ À˙ùġ˙˜û÷˙˙$¨òĝ˙ĝܞ-˙ï˙˙˙˙˙˙˙˙˙ŝĝ˙ŝ˙˙ğĠ˙ŭ˙Èâ)"Ÿ˙˙ŝĝ%˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙;!˙öüġĝ(˙˙í˙˙İ˙ŭò˙ġ¨ž˙˙ü ˙˙Ù ) ˙˙ŝ˙ë++Ë˙˙Ìô+ ' âûŭùŸ% Ĝ˙ŭ˙˙ ˙ç˙˙£Ñ˙˙ŭ˙û˙˙˙˙˙˙˙˙ŭ˙û˙ˆ%ò˙ïû&"$˙˙˙Úħù˙˙Ù !šĝĝ˙˙Î) $™ÛúÌ #  —Óùû¤$˙ŭú£Ô˙˙˙˙˙˙˙˙˙˙ö˙˙+ Ù˙ü˙  É˙ûĝ ޝ˙ú˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ %ûï” ™Ï&˙ŭöà˙˙’-+öí˙˙ñ˙˙˙˙˙˙˙˙˙˙˙ġù˙î¸2İ $É˙˙˙Â" &Şġë˙ñÓ˙"¨ß˙üì˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝá#Í˙Ê ÙöúéŸ"Ċŝ˙˙ŭ1Ä˙˙Š(&§Í˙˙¨)Íò˙Í,‰˙˙˙ò˙˙˙˙˙˙˙˙˙˙ŭŝŝùïĉó &Í˙˙ï˙˙ ží˙ú’#$ Ĵ˙˙ï˙ŝ˙˙×û˙˙ó˙!% öù˙ë˙˘Şüü˙ü "˙ü˙ġ˙˙ï˘Ğ˙˙üü˙ Ï˙˙ü˙˙˙˘˙óŝŭĴ“˙úï˙˙ş- ˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ġŭ˙ŭ˙˘2 Ĥ˙˙˙Ġ -§ö˙Ò& ù˙ïö˙˙˙˙üó&Œúŝ˙ùß Óûŝġ˙’ !˙üúù˙£'È˙÷˙ġì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙ö#*“˙˙óß'˜ĤÚ˙ôü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ġ˙¤&Ĥ˙÷ŝŝŸ ñûŝġŝ˙Ħ'˙úĝ!ìù˙ğŻ!Â˙ñ˙ñ˙É ˙˙ŝ˙öÚ-÷ĝû£#$¤˙˙÷úĝ™*šúûô˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙ ŭŭ˙˙˙”!¨ì˙üó ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝ˙˙˙#ô˙˙˙ŝ˙˙ö˙˙ ˙˙ù˙ŭ¨Ñ˙ĝŝ´% ´ġŝ•& ˙˙˙˙˙Èçú˙ŝ˙É&˙˙˙ĉ˙˙Ħİ ´Ë˙ŝŝ˙ö%Íú˙ûú˘$ġ˙˙ô§%˙óġ˙ô˙˙˙˙˙˙˙˙˙˙÷ôûÀ¨ú÷˙ñ˙ ( žÖ˙ĉ˙÷ûŭ᪨˙˙ĝ÷˙&% ™˙î˙ùŞ&˙˙ŝ˙˙˙£˘ô˙ì(Îô˙˙˙˙˙˙˙˙ù˙ú˙’ Ÿ˙Ëô˙ú%İö˙ŝÒÔġŭ˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙š(" %ñ˙ö˙˙˙Ħş÷˙÷Á%˙˙˙˙œ"‹Ú)$,˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙ú˙˙ùöúĝ&˙˙Ï$ ˙ûî˘ % ĝ˙Ñ  :! ˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙úÒ!"-Èŝù,"˙˙˙˙Ĵ ÚÌÍÂ˙Ğ ÜïŭÎ ˙ѝŬúé÷˙ %£˙˙#˙úü˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙ùó˙Ħ ˙ĝ˙ëŝ%­û˙˙ "-†ùÚ˙ ĴÀ˙ò˙ħ˙ùú˙˙#¨˙˙ñ˙ù˘ ˙˙ó˙˙•Ġòġ˙üŭŭ˙è›ĝ˙ñû˙Ï!öûĝ˙ùŝ˙‘/)•˙ü˙÷².÷ŝ˙úüÜ ˜˙˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙˙ü˙ĝâ"òü˙î˙+Ò˙ ˘ù˙˙ù˙˙ ,”è˙˙¨*ŝ˙ü˙˙ĉ˙˙ò˙ü˙ ˙˙öë˙ Ñö˙ôû×˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġùŝġü˙) ħù÷˙ë  ¤˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûé˙ ˙˙ŭ˙•*˙˙˙òó˙”›˙˙Ì$Ĉ˙˙ġ˙™ !Ò˙˙û˙í!ûĝï˙˙˙˙ù&˘˙û˙ü˙ ˙˙˙˙˙˙˙˙˙˙˙ù˙˙ġ˙˙ó˙ #˙éú˙˙ŸË˙˙˙˙.Ĵ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝġ $!Óù˙ġüĝ˙˙˙öħ³òó˙ö˙¤î˙ĝŭ¤ŭĝ˙ù˙öïĝ˙û˙î÷˙ú˙˙˙üò˙˙Í&ĵ˙ü˙˙í˙˙ú˙ŝ˙ġó˙üò˙˙™%"˙úñ˙£ ŭ˙˙˙ë˙˙˙˙˙˙˙˙˙ûñ˙ŝ "˙˙˙öú0$Ÿ˙Ö˙˙˙˙˙˙ż Ĥï˙˙˙ê&Ÿ˙ó˙ó˙ñ˙É"Ô˙˙ĉü˙Ÿ #œġ˙˙˙˙˙˙˙˙˙˙˙ĝ˙ú'"Ñ˙ú˙ú˙â ġù÷Û* Öú˙˙ó˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûôúÒ ,œ˙ú˙û˙óĜ ˙î˙˙ ùÏ˙ž²ü˜$*ä˙˙ŭó˙˙˙˙˙˙˙˙úú˙˙˙˙˙˙ʔ ¤üù˙Ë, ˙ñ˙Ú ´½Ħ´œï˙ É˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ë˙Ú˙ŭŝ"ôŝÍ˙! £ú˙Ġ˙Ÿ*¤ùĝ˙ô˙ŭ˙˙£ * ˙¢ú÷˙˙ö˙˙˙˙˙˙˙˙úüŝ˙˙˙˙˙÷Ĵ7ġô˙˙ö˙’% ˙÷ž$Ÿï§Ĵ˙˙˙ġÜó˙ġ˙ġ˙˙˙÷˙˜Żĝó˙ŭÜ - ÷è˙ó˟&˘ïù˙üî²ú˙ġ˙üĝ˙ÇĞô˙û˙˙—£˙ï˙î˙˙Êİ Ĉ˙˙ùû² ˙˙˙˙ü˙ ĴÎ˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙÷ĝ˙Ġ˙ Ş˙ö˙˙Á $Ò˙(Ÿŭ˙÷˙ñ˙”& Ï˙˙ġ !É˙ùêö˙Èö˙ö˙ô )ġ˙˙˙÷Ħ!™˙˙ŭ˙˙›& ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ù ˙˙è˙Ö¨!(ˆĠ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ëİ" #İ˙îŝû*ûĉ˙˙˙˙%Ĉüŝž Êü˙˙ġĞ(Ñî˙˙ù˙ Ôŭ˙˙ñÌ%ŝ˙˙  ŝùö˙Ò Ĥùî˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙˙˙ù&·˙˙êùħ &˙ŝü˙ö÷ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙Ġ ¤Íô˙˙˙ú÷˙˙˙ ³ûô˙˙ùİ& ħö˙˙œ—˙˙ûŸ/˙˙ù˙˙ŭŭ˙˙úú˙íÔ#$Ĥù˙û˙ôÀ! ˙÷ôġüŝ˙ñ˙˙úû˙Ç'&˙ġ˙ú˙œĝŭ˙ŝ%˙˙˙˙é˙˙˙˙˙˙˙˙˙ŭ˙˙’&¨ŝóŭ˙ú ġĝ˙ŝġüÚ  œ˙ŭû˙˙$"%“˙˙ŭĝ˙ċ˙ Ê˙˙˙ü˙˙Ò˙ô˙˙˙˙˙˙˙˙˙ġ˙Î Ïŝ˙òù˙Ç!%2İó˙ğ1Š˙×û˙ù˙˙˙˙˙˙˙˙˙˙˙üüûòçÇĞ!+ ÷ü˙÷˙÷˙Ñ ˙ú˙ŝòŸ!˙ġ˙)  £˙ï˙÷˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙É˙Ĵ›ô˙˙˙ù˙˙ŭá˙î˙˙ñ×˙˙$1Èòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ö˙ôŭ!.͚!˘˙ü˙˙(˙ÌÚ˙ü˙ĝü˙Ô%Ë˙ŝ˙ô˙ùûĜ ˙Û˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûûŝ˙˙ ‘ô˙öò˙ù)ùŝ§˙˙óü˙˙ù˙ö˙ö˙ü÷˙ŝì˙Ó˙˙ô˙ŭ&×˙˙˙˙§˙ŝüŝ˙“(–˙÷˙ú˙ü˙Ì›ŭ˙˙î˙ ˙˙˙˙ŭ˙ŸÖ˙î˙˙–˙˙÷ò˙¢$šû˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙üŝŝ÷Êû˙ŝêáŸÄÎŞ £˙Í˙˙˙˙Ï˙À˙˙˙ú˙˙˙Ĉêñġ˙ú˙#ŭĝ˙úò$Ò÷ú˙í§ ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ñ˙ !–ŝ˙˙ŝ˙÷Ÿ%˘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙Ïô˙ŝö#Ĥ˙öú˙ĉ˙É˙û Ŝ÷˙ö˙ #Ħ˙˙÷˙˙š˙˙ñ˙Ġ "Ÿ˙ùö"$ĤĝÒ˙úÍ˙˙û˙˙˙˙˙˙˙˙˙˙ó˙üí˙ŝ ˙ġú˙˙)š˙˙û˙üâŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ü˘"˙û˙ŝ÷˙˙ûö˙˘›ü˙ì˙˙œ£ĝ˙˙£ŭÈŭ× ü˙˙ôŝ˙˙ĝŝ˙˙˙œĤ˙ü˙÷üÚ˙ü˙ô˙˙˙ü˙ô˙ĝ˘œò˙üûû)˙˙ŝŝÏú˙ġ˙ŝ˙˙˙˙˙˙˙˙˙ü˙ĝô"¤ĝ˙˙÷üĤ$žÓŭ˙Ċİ Į́ ŭ˙ö˙îŝ³ Ġ˙ü˙˙ô˙Ñ'Êŭüú˙˙û˙ü¤%Û˙˙˙˙˙˙˙˙˙ò˙"Ôó˙˙˙˙Ë Â˙î×˙óü˙÷˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙À˙ŝŝ˙÷˙˙ œ˙ô˙ĝ˙ŝûúÚ âÛÀĦ ÍÓÈ˙ú˙˙ŭŝ˙˙˙˙˙˙˙˙˙ġú˙˙û˙˙ŝž¨˙úŝù˙ü˙˙˙ú˙˙üò˙ÉŝÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ù˙Ò$'úü˙ôÚ ħŝ˙˙ë˙˙ûŝŝ˙˙ó˙ ˙í˙˙ĝ˙ú˙˙ó$  ˙ĝú˙˙ŝ˙˙˙˙˙˙˙˙ŝŭüŝ˙˙˙˙˙Ħ ˙˙˙ô˙üÍúÜ Ì˙Î˙˙˙˙˙ŭ˙˙ú˙ŝפ͠ •˙û˙ü˙'Ë˙ŝ˙ú˙ &˙î˙˙˙Ë ˙÷ŝ˙ì˙˙Ĉ#žŝĝü˙ú" Ë˙ŝ˙˙ùû$÷˙˙˙ö$ ŝ˙üü˙˙œŭú˙˙û˙˙ûŭ˙˙˙˙˙˙˙˙ù˙ó˙ôĤÍĝ˙˙˙ Ó÷™"Ğ˙˙˙ġ˙Éû˙˙ï˙$ ˙ñ˙˙ŭÇ˙˙ĝ˙ŝ%ñ˙÷ŭĝŻ %Á˙ò˙˙” ˙˙ôü˙ÖıáÈÎûû˙ġŝ˙˙˙˙˙˙˙˙˙˙ŝî˙˙ú”%˙ŝ÷Ş˙̝§§ Ïñ˙˙ú˙˙ù˙˙˙˙˙˙˙˙˙˙˙Ë˙û˙ġ¨"ž˙÷˙˙î˙•˙û™Ôŝ˙˙˙ü˙ò˙÷#ö˙˙üŝÔ˙ñ˙ü"˙˙ûŝÎ(˙ô˙˙˙˙˙˙˙˙˙ŝŭú˙˙ü& ˘˙ġ˙Á* ġ˙üôÜ  £ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙£˘˙˙üó"˙ú˙ü˙ +Ñü˙˙ŝš$'˙÷ù›˙˙˙˙  Öùö˙ï˙Ÿ%öŭ˙ĝ %ù˙úüüÖ3É˙˙˙û˙˙˙˙úŭŭŻ Ë˙˙˙ġ û˙öüúûï˙ŭ˙˙˙˙˙˙˙˙˙ŭ˙˙˙Ÿô˙ü˙˙™! ü˙Ħ  ùüİ"˜ŝ˙ŭ˙ü ˙˙˙ù˙ŭù˙ž!Í˙ù˙˙ó˙˙úŝͨ %Ëŭ˙û˙˙ù˙˙ì˙Ħ˙ĝ˙úûÇ÷˙÷˙%÷˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙#ò˙˙ûŝ˙û˙÷˙ĝ˙ŸÌ˙ûŝ×ŝ˙˙÷˙ù˙˙÷˙ó˙˙ĝ˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙Ò¨ Ó˙ûĝ˙˙#Ó˙˙ò˙ŭ˙š (ŝú˙•&$ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙˙˙ûÀ%# ˙˙ĝ˙ĥûÒŝ˙˙á˙˙ú˙ù˙&(˙ë˙˙ĝ˙˙˙ž '" ,é˙ŝ˙˙ö˙˙˙˙˙˙˙˙ŝ˙˙ŝüüŝ˙ô!, À˙óŭ˙˙Úüö!­÷ôöŭĝ˙ä˙˙ïŝ˙˙˙ŝ§ô˙˙ûú˙)Ŝü÷˙˙+’˙˙ùŭÚ¨£˙ġú˙÷ġŜ Ğì˙˙û˙ âĝïóö˙˙&˘˙ûĝ˙Ù2˙˙ŝ˙ú˙& Ğû˙˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ü˙Ĥ˙ûî˙ï ş˙Ĵ ˙éö˙ü˙ ĝ˙˙÷&* ŝ˙˙˙ôĠ˙úô˙–"²ò˙ü˙%Óŝ˙úñ· 'ÎŭŭĠ 1ž˙Ûó˙˙˙ò˙˙˙˙˙˙˙˙˙ü˙ġĝµ $#ŭ˙˙˙üô& à÷˙˙ú˙˙ŭ˙˙˙˙˙˙˙˙ûóĠ˙ž!"˙˙ĝ˙É&ü˙Öô˙"•˙öú˙$Â˙è§"˙˙ĝ˙Ë"˙û˙ĝÄ 'Óò˙ûĠ& !ŝŝ˙ÍĜ˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ĝ÷í×Í˙˙(˙ôù˙§%%÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îû˙Ġ,ŸÑġ˙úħîö˙#’˙ùù˙ ˙˙ž$#˙ùüû(Ġ˙ï˙˙˙˙˙ Èû˙üúÒ(!šÖ˙÷ûĥÇŝ˙˙û˙#“û˙óú˙ $Ê˙ô˙Ĥ˙˙ú˙í˙˙˙˙˙˙˙˙˙˙üûÁ¤ù˙˙˙˙%ö˙&&Ÿ˙˙™%¸ŭ˙ü˙,˙˙è˙ú˙˙Ÿ ³í˙ö˙˙ú˙û˙˙ĝÏĞ Ïú˙ĝ˙˙ú˙ü˙ìŝĦ˙úġú˙é$™û˙ŭ˙ £ó˙˙óü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙ĝ˙ì˙˙ÄŭÙġ˙ÂÇñŝ˙ô˙˙ù˙ò˙˙ġ˙ü˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙ü£!•˙÷˙ûü&œ˙ñ˙ç˙"(-î˙ġ˙ä%™˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óù÷˙˙İôŝ˙*£˙˙÷÷˙˙üĝ˙ù˙ Ĝ˙˙˙ĝ˙ì˙˙˙Óü˙ôüĝ˙˙˙˙˙˙˙˙˙ŭ˙˙˙ûúŝ˙˙‘Ó˙˙˙ì¨ûĝ˙ Í˙˙ú˙˙˙Ŭññ˙‹#£ġù˙ ˙˙ù˙˙Ö˙ĝû˙˙ŝù˙ò &$ò˙˙ŝä˙ÁĠ%ŸÒ˙ôüŭ¤ġ˙˙˙ò˙˙ŝ˙˙ò˙˙÷˙×ŝ˙˙˙˙˙ûñö˙˙˙˙˙˙˙˙˙˙öûî ¤˙˙ä1Ĵ˙û˙£%İÍ˙ôïĤ#" ġġü˙¤˙÷á'˙˙˙íµ ˙ôĝ #Ĝúú˙˙Œ#£˙˙˙ ×ëü˙ñû˙˙˙˙˙˙˙˙˙û˙ôŭÒ#(Úçŭ" À˙˙˙+# öŝ˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙ûĜœ(”ġ˙˙û/ /ŸË˙Ħ£˙˙˙˙˙$ ($$ ûŭ˙Ĥû˙ö˙%%ħú˙ğ˘Î™˙˙˙˙˙˙˙˙˙ĝü˙˙˙˙Ú &!(ó & * İ˙Ó +˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ĝü/•ÍΠ(˙ż! #,÷ë˙ -’ŭ *œ˙˙˙ 'Ĵ˙˙ù-ĦÏ˙ŭ˙˙Ħ   µŸÌû˙֚+ß˙˙˙Î Ñĝ˙Ñ(˙ö˙˙˙˙˙˙˙˙˙˙ŭŭüß ˙àí÷Ħ* ŭ÷Ö ֓&7˘˙˙˙ù!“˙˙˙˙÷ŝĞ&ħ˙ŝñ˙˙ëÎ˙˙×"Ŝŭ˙ù˙˙û˙˙˙Î˙#˙˙˙ġÁ ˙ó˙ž  ˙˙ì˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭÊ#%óùûġ˙÷˙"!˙˙ëŭ˙œÊ˙üÜ.ŭ˙˙ĝġÄŻ˙ïúöú˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙Ÿ ˙ùûï˙ /ĤË˙˙ ĞÄ *#²ñŭ˙ü˙ĵÊÙÍŜû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŭ˙˙˙ĝċ›"˙˙˙˙îġ òĝú˙û÷£ù˙˙ġ"Ëó˙˙˙˙ĝŭó˙Ö0 ˙ûü˙˙ï˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙òĦ)Ññ˙ú˙"$İùÖĈ“!)Ħë˙û–ŝ˙ŝ.“˙üÇ ˙˙˙Ĥ+ &ĠŝÉ#˙˙˙úµ÷ö˙ŝ˙˙˘ Şè˙˙Îâïùô˙ĝò/Δ!!ŻÖ˙˙À›*˜ŝÚúú˙˙˙˙˙˙˙˙˙˙˙˙ċ˙˙ü˙&,ŸġÖ+ñüòï˙¤& É˙Ô İ˙öâ (ŝ˙$ Ì˙ö˙&"¨ŝ˙Ì.Ìŭ˙˙ž+û˙! "Ħ˙˙˙ŝĝú˙˙˙˙˙˙˙˙ü˙˙ĝ" %"˙˙*!Ż”#Ñ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙üŝ0 İüô˙÷) “+Ĉ˙˙˙ó!)###­˙û#ù˙À˘˙˙Ô :& ˙˙˙˙˙˙˙˙˙ŝ˙˙ġ˙ŭ˜ !!ÉÚ +.$¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙üŝ˙˙Û (5 $û ˙Á!%"Ï% öġĝכ)" !˜˙ô˙"!˙ùö÷Ġ% ($ Ĥöù£ '˙ùĝ´ġ˙ò0×÷˙˙˙˙˙˙˙˙˙˙ù˙˙Ê! ž­#ž˙˙Î!˙Ȟ+"œéġ˙˙˙ْÌ2›ŭ˙Ë˙ +ó˙˙ŭ˙˙ûŝ˙˙˙öĈ ˙ż˙×%ž˙à˙Ĉ 1˙ô˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙œ%³ġ˙÷˙˙ĥ˙˙˙ӏ$-˙ôúú­˙÷ô˙Û# ›˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭϚ )˙˙˙˙Ò  û÷È "&#Êŭ˙ĝ˙˙ŭí˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûú˙˙˙' Żâ˙ö˙˙ü§$˙˙˙šĜöü˙£!Ğ˙íŝ˙˙ŭ˙ü÷ #­˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ûôù$Ô˙ŝÏ"˙ŝ˙ß šÜʒ* ä˙Ÿ —6 4" ô˙ûĈ 3"÷î˙§˙Ôĝ¨!˙ŝÍ#˙˙ò˙˙ï  !%˙é˙˙ùñúùó˙˙˙˙˙˙˙˙˙ó˙˙ŭ"£ÚŬ˙ó˙ŭñי! (Ğôûü + ù ! 1ŝ˙Ê, ˙êı˙˙ú% ˙˙˙ß* é÷˙˙˙˙˙˙˙˙˙˙˙ùìö˙"  Ê˙˙"–˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ì5(Żŭöö˙ħ *( !˙˙˙ġö˙–)-Ċñ˙˙ ˙÷Í˙úôüĞŞž“¤˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙¤&)ħż İ'Ÿ ('ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ġ˙ûö˙—&)• ˙û˙àûÒİŝ˙î˙Ġœ îŝ˙˙˜œ˙ŝ˙˙ŝ˙Ç  ­Üú˙˙÷Ş *) ˙˙˙ŝ˙Dz# #û˙˙š$"ĝž#Ŝò˙Â'˙˙û˙˙˙˙˙˙˙˙˙ĝ˙˙~* 0 ô˙˙˙˙ž#Ÿ%˜˙˙! Ş˙î˙î˙Ş(&À˙&  (ž˙˙˙˙˙˙üŭöúú˙˙Ħ#! !˙˙˙˘! ß˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷Ĵ  §ì˙,'Żŝù˙˙* 'Ñ˙ú# ›¨ħ“ ˙óÜ˙ù˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙ü­Ç÷ú ˙˙Ĥ % ³˙ŝ˙˙ĝ˙ó˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üŭŭüûĊ˙ġ˙ú˙˙ú&…$Ûûüŭ )#é˙ü˙˙ġû˙ŝŭ£Ÿçöü˙˙˙ù˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ôé˙#'&”Ó ÙïùĝÒĤ  îŭÍ2(  Ú÷˙ġ˙ž(!$’˙Ú˙› %ùôŝ˙ Çûİ# Óó˙˙˙ - %ñ˙*# ıì˙ûŝ˙˙˙˙˙˙˙˙˙˙˙ñû˙êÖ"Ş &˙ù˙ü˙÷ŝ˙ -#ĝ˙ó˙¤$&™˙Ş%˙ŝ˙ '¨˙˙!$žûĠ%˙ĝÈġ !˙˙ġ˙÷˙˙˙˙˙˙˙˙˙˙˙ûñŬËÏÓ¤˙˙ìŻ. $’ĠÓĝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙úüĦÄ ž˙˙û˙À¨­ §”ħË˙í˙˙˙ùÜŻ  Ÿ§ŞŜ‹˙˙˙úέĈ’Ĝ˙˙ÊĤ›Ì˙ùġüü˙˙˙ĝ˙˙ñŝ˙üŭ˙˙ô˙÷˙˙˙˙˙˙˙˙ûû˙˙˙˙óΕ›Ĥܙ˙÷˙˙˙é"É˙˙ú˙˙Ĉ˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝġù˙ı˙üÍ­½Ñ˙¨—ŭü˙˙˙ñŝ˙ùö˙é˙˙ò˙˙Ĵġ˙ŭó˙˙˙˙í˙úö˙úô˙úĝáŬó˙˙òŭ˙ö˙ŭúӟ¸—Çñ˙˙˙ĝôŭñÏĦŻ ù˙ĉ˙Ä£¤œžÂš˙⢍& Ġô˙˙˙úԘ·Á˙˙˙˙˙˙˙˙˙˙˙˙úû˙/˜)Ċ–ĦÈò˙ñġ˙ûŜŸŸŜ˙ûÄĤ¨‘Ì÷ôÏ"À˙ĝ˙˙è˙›";Ġûü $˘ù˙üŭ˙˙ŭŝ˙÷˙˙é˙˙  !÷ù˙ù #$,ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝ. $ ˙‰Ö˙÷!ó˙˙!#˘˙÷˙ê˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙–%) ™˙ĝù˘ . Îû˙ú˙ŭñ˙ôĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙û˙˙÷˙Í˙úöŭ˙ôó˙Ô )$ %ŽÖé˙˙¤& İ˙ĝŝó˙˙˙ûòŝ˙!Ä˙˙ê˙ü÷˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙ĝòù§#+Ÿŭ˙ò˙˙ú˙ñ˙˙­˙˙˙ġĊ'#("­ê˙ù˙˙Ż™ŸœĞ£ §˙ú÷˘ĤĤ’ĝ˙˙˙ĤĤİ—³ÚóÑĤ˘Ĥ˜¨Ĥ™˙˙ŝ˙÷Ĥ¤œ§¤İžĦ“Ħ’˙˙üŬ—ž²ò˙˙˙˙÷ò˙˙˙˙˙˙˙˙˙˙í˙ß˙ĝóû˙÷˙˙ê˙˙˙û˙ŭ˙î˙ŭ˙˙ö˙˙ó˙ĝû˙ò˙ĝ˙ôûġñ˙˙ʘĴ×ö˙ëŭ˙û›˙˙÷ŝÎ˙֟£˜ĦĜúŭ˙ûù˙˙˙ŭ˙ú˙Ñ*ûú˙˙÷ù˙˙˙˙˙˙˙˙ġ˙˙˙ó˙ó˙˙üüü˙˙š™¤Ĉ˙÷ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ó˙˙ú˙÷˙÷˙è˙ü˙ŭ˙û˙ŭ˙˙ŝ÷ĝ˙èË˙ŭû˙ü˙óÑ˙òû÷üè˙ŭ˙˙˙ùëù˙˙ŭŝŝ˙˙˙˙ì˙êû˙ŝŬġûûÓ˙â˙˙ú˙˙˙˙˙˙˙˙˙ü˙˙öö˙˙˙ŭ˙˙ñû˙ö÷î˙ŝú˙ĝŝûó÷˙ĝ÷É˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ġ˙öò˙è˙˙úü˙˙˙û˙ŭà˙˙ŭŝ˙˙÷˙ĝù˙óŝŝ÷ö˙ò˙˙í˙˙é˙÷ŝ˙˙ï˙˙óŭö˙ü˙˙ú˙üŝ˙ú˙ú˙˙÷ñ˙˙˙˙˙˙ŭÄ˙üûó˙˙ġ˙˙˙ù˙˙˙ô˙üòï˙ġ˙î˙˙í˙ñġ˙ŭŭü˙ö˙˙˙˙˙˙˙˙˙˙˙ŝŭü˙˙ò˙˙ô˙˙ñ˙˙üŝ÷˙ü˙ĝ˙˙˙˙˙û˙˙İú˙ŭċ¤½˙ù˙ú˙ŭ˙ġ˘›Ħ˘ĦÑġ˙ó˙Ħž˘ Ħ˜÷Ü˙ùü˙ŭû˙˙˙êè˙ŭŝ˙ü˘Ż¤ôŭ˙˙˙öĠŽĴ Ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙–!Şĝŭ– ,*÷÷Ħ(˙é˙Í,  É˙÷˙ó˙÷˙˙˙˙˙˙˙˙˙˙˙üüûòç˙–!  üú˙ŭü'Ÿ(/÷˙ùŝû˙˙üù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙÷˙˙ĝ˙˙§ŭ˙˙˙ŭ˙˙ùĝĜ Úù˙ŭò—ËáÑÔÎŭ˙ü˙ŭ˙˙ŭ˙˙ò Ôġĝ˙˙ĝŝú˙˙˙˙˙˙˙˙ŝŭŭŝ˙˙˙˙ŭĜ£ÂÔÙÎĜÑüŭ˙í˙˙û˙˙ó˙Ï×ÏÔô˙˙ô˙ŝÈ×ÍÏĜÏËÏÏÒÁ˙˙û˙üÍÜ˙ú×ÔËü˙ï˙˙ŭ˙ù˙ú˙ŝġ˙˙ĝ˙˙í˙×ëÔĝ˙˙÷˙˙ûŝĜö˙˙ŭġ˙˙ĝ˙î×˙Óüü˙˙Ï˙òŭġ˙ûÎŜ˙ġ˙˙˙ü˙ûŭ˙˙˙˙˙˙˙˙˙üü˙˙ë"¤ŝġ˙˙ô˙ġŭ˙˙öü˙ĝ˙ŭ˙˙˙úú˙˙˙û˙ŭ˙˙ŝ˙ü˙˙˙˙˙ùŭŭ˙ü˙ó˙˙˙˙˙üġû˙ö˙ĝùÒ˙ĠÉ˙˙˙êŭ˙˙˙÷˙˙ù˙Η˙÷˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙û˙˙ó÷˙ŝĝ˙Ìŭ˙Ä˙˙˙˙ŝ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙ŭ˙î˙˙÷˙˙ŝû˙˙ŭĝ˙˙˙˙÷˙˙ô˙˙˙÷˙ñ˙ô˙˙ò˙˙ö˙˙˙˙˙ú˙˙ŭŝ˙îü˙îû˙˙˙÷ù˙˙ö˙ġŝ˙˙ĝ˙˙üŭĝ˙˙˙˙ü˙˙è˙˙˙˙˙˙˙˙˙˙ŭ˙ŝŭ˙˙˙ŭĝ˙ú˙î˙ŝ˙ù˙ĝ˙ŭ˙˙˙÷˙ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙ì˙˙˙˙ö˙ù÷˙ĝ˙ŭù˙ù˙˙˙úüü˙ù˙˙˙˙˙˙˙ó˙˙ċ˙ôü˙ŭû˙˙ġ˙ïüû˙˙˙˙ú˙˙ú˙ú˙ŭ˙ŭó˙˙ú˙ù˙ŭ˙˙ŭŭĝŭú˙ĝ˙˙˙˙˙ŝ˙ġ˙ó˙˙ùù˙˙˙˙ŭüü˙ù˙˙öû˙ù˙˙ù˙˙˙ú˙˙˙˙˙˙˙˙÷˙˙ŝž˙˙˙ŝü˙û˙üü˙ŝ˙÷˙˙ûŭ˙ó˙ñ˙üŭ˙˙ñ˙ùġ˙ó˙˙˙ŝ˙˙÷˙˙˙ŝ˙Ġ˙˙˙˙÷÷˙÷˙˙ĝÔàş˙˙ġ˙ü˙˙ŝù˙˙ù˙˙ü˙ĝ˙öûö'Ç˙È˙üü˙ò˙ù˙ŬùËÖ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ×)"š˙˙ŭ˙ ĤüŭŻ# ˙ŝĝ˙˙((˙ï˙˙˙÷˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ôüŞ #ÜòĈÛĠÄ˙˙üû˙úÍÌËÖÔÌÓ£¨ŝŝ˙˙˙ŝġŝŝ˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ù˙ü 1•Íßġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙ġ£˙ŭü˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙ŝ˙˙š˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙#ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙˙üûû˙£ ,ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ŝĞİöŭ˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙û˙ ñÖ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙÷ò$'"ö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝ•1&£˙ġ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷òöŝŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝġ˙˙˙û™(˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ò˙2˙˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Á)#˙ö˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĝ œ˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷Ï% (˙˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝúĝû˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŭü˙˙ñ˙œ#˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙Î/˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ûò* ˙û˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙ġ™3ä˙öö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§# Úö˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙˙˙˙ŭÒ"˜í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙œŭ˙˙˙˙˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭüŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭÏ&şú˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙ŝ˙˙üëó˙˙˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï + 1%"˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ù÷˙˙˜'¸ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĝ#)ŝú˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙™ Ò˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙ĝü˙ġ˙úóġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ڙ. #¤ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝü˙ôÊ' ˘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙0 ù÷˙ûûûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙÷˙˙̔žü˙úŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙ü˙ó˙˙ó˙˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ì˙˙ù˙Ô½˙˙üġ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûû˙˙í´ &(˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĜÚü˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ŭ˙ŭ˙ú˙˙ú˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙ñ˙÷˙˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ŝú˙ġû˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭû˙ŭÚ ĊÙÙż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙è˙˙ó˙ûúĝ˙˙î˙˙ñû˙˙˙˙ĝ˙ú˙ú˙˙ŝŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝú˙˙˙˙ò÷ŭ˙úŭ˙ú˙ù˙˙˙ê˙˙ŝŭ˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûîŭ˙ô˙˙üö˙˙ñ˙ŭ˙û˙˙Ĉ˙ĝ˙ĝ˙˙ŭŭ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷Û˙˙úŭú˙˙˙îŭ˙ü˙˙Ĵ ˙ġ˙˙ü˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì›(˙˙˙˙ö˙ù˙˙ %Ŝû˙ŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Û0 %˙îġ˙˙÷ĝ˙Ä)  Ë#"Îú˙ü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙× (˙ŭ˙ùġ˙˙ˆ>ĤË˙˙Ìü˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĠÑú˙ŭ˙˙ġŝ*Ì˙ŝ˙ĴÑ˙˙ô˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öüŭ˙ŝû˙ŝü˙˙˙ĝö˙˙˙›Ĥ£ŝŭ˙ġ˙˙úš Ğ˙û˙˙˙Îù˙˙˙˙ŭ˙÷˙˙˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ġ˙ĝ˙ï˙ġŝü˙˙˙é˙˙ġ˙ç˙˙î˙è˙˙! ÷˙ŭ˙ù Ŭ˙ñü˙ú˙˙ŭ˙ó˙ëì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭùñ˙÷û˙˙ġ˙ò˙˙ï˙˙ŭ˙˙˙úĝ˙ŝ˙˙Œ)àŭĝ˙ĝÁ˙˙˙˙ôŝĝô˙˙˙˙ŝŝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙í˙Ŭ˙ô˙ó˙û÷˙ö˙˙ô˙˙ôñ˙íç"ñ˙˙˙˙Öúöú˙˙˙ü÷ûß˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ ,êı §Ò˙ŭŝ˙˙˙ôñ˙˙û  ˙˙ûĝ˙Ĵ ³—£•˘×˙˙˙˙ï˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüœ  ! #$“˙˙ùŝüÓ $˙öû˙˙ ("˙ĝ˙ûŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“#0 ™Ş¨˙ù˙ûû˙Î" ü˙˙˙ç!"É˙ö¤ù˙ġ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙% Ĥ˙û˙ô˙˙Ò!¤˙ú˙˙˙Ì£ú˙îŝ¤Ħ˙ĝ˙˙$Ïú˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙”•˙ù˙ô˙˙˙ ĦüÏ÷˙úÖ&ü˙ŭò Öò˙˙÷ĦŜġ˙û˙ŭü˙˙ñŭ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û× $¨ñ˙ġ˙üôŭĴû˙˙ŭñ× ŭ˙ù˙Ĥ %Îü˙ù˙İ'!À˙˙˙ö˙ĝ˙ŭ˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙ñž#%&Ĉ˙˙˙ö˙˙ĝ!›˙ó˙˙ùĠ,’ġ˙úĉ˙Ò˙ŭû˙ ˙üöÇÍÛûòŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙òúú˙ì˙û× ĝ˙úî˙˙°˙Ôúڛü˙ġ˙˙­! ïŭÊħ +˙˙˙öġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ÷ê˙ÑïÛì˙˙ö˙Ç/›ûÑ÷˙ú˘ ”˙îŭ˙ ô˙˙òö¨ ù˙ó˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ë˙Ğ 0Œüŝ˙ŝùöŜ!˙˙˙˙ô˙˙ô˙ŭĦ(˘˙ô˙ú˙ĦÛ÷û÷˘ ˙óûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭ˙ù$ !(Ĉü˙˙˙ş˙˙˙˙²´úŝ˙ŭû—÷˙ġ˙òš/ &˙ì˙Ÿ" +“ùì˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï &Ö÷˙˙É$+˙ùĜĤüú˙“& ˙˙&!#  ˙˙›  ĤÍ˙˙ġŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ú›% & £ŝ˙ü ($öùŝ!˙˙òŞ ˘ô˙џš£•*›ù˙úò˙ĝ˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ì́İú˙˙ú–&­ı˙˙˙Ŝñäòö˙÷û˙ûò˙˙ŝ˙ŭĝ˙î˙ú˙Éï˙ú˙ġŝ˙é˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙ŭêù˙˙û˙˙˙˙ïû˙ÏÓ§Ö˙û˙ùô÷˙˙ĝ˙˙˙˙˙ŭ˙ò˙˙ò˙ú˙üú˙÷ŭŝ˙˙˙ŝú˙ŝŭäŝúó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙ôôÇ˙Ŝ˙˙ŭ˙˙ò˙ßò˙˙˙˙ó˙ŭó˙ûóöúù˙˙˙˙˙˙˙˙˙ú˙ĝ˙û˙òŝ˙ö˙ŝüî˙˙ŝ˙ûġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙üùŝ˙˙û˙˙˙ñö˙ŭġ˙˙˙˙ù˙û˙˙˙˙ü˙˙ŝ˙˙˙˙ġó˙ĝöùù˙˙˙˙˙˙öĝ˙˙û˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŭ˙ĝ˙ô˙ï˙˙ú˙ŝûĝû˙˙˙ŭ˙ŭ˙˙ġü˙˙˙˙û˙ŝ˙˙ŝ˙˙˙˙ë˙üġû˙ü˙˙ġĝöĝûúúü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŝ˙ŝü˙˙˙ü˙ŝó˙˙÷˙˙˙üí˙˙˙îû˙˙˙˙˙öûô˙ù˙ü˙ŭġ÷˙˙˙ĝŝ˙˙÷ô˙˙˙˙˙˙˙˙üĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝù˙˙˙˙˙ù˙óŝ˙óúô˙üĝ˙ŭ˙ù˙÷˙˙ú˙úû˙ü˙ŝ˙ĝ˙˙ŝŭ˙˙ü˙ü˙˙ŭû˙˙ú˙úŝ˙÷ĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûô˙˙úŝ˙ú˙˙ùü˙˙˙˙˙ö˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝú˙˙˙˙˙ò˙˙ûó˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ô˙˙÷ŝŝ˙öü˙û˙ŝ˙˙˙˙˙ò˙÷ù˙ùö˙˙ŭ˙˙÷˙ŝ˙öĝ˙˙ú˙˙˙ĝ˙üú˙üŝĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ù˙ú˙ù˙ö˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙ŭ˙ŝ˙˙üŭ˙úĝ˙î˙˙ú˙˙˙˙˙˙˙˙˙ġ˙˙˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùú˙ŭ˙˙ŭ˙ò˙îŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ˙˙ú˙üġ˙˙˙˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙ŝŭŭŝ˙˙î˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ĝù˙ò˙ü˙ñ˙ŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙˙öûü˙˙ġĝ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŝûú˙˙ĝ˙ûù˙˙ŝ˙˙ú˙ùö˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙ñ˙˙ö˙úŝü˙˙ġ˙˙˙˙˙˙˙˙˙ú˙ŝ˙ó˙˙ú˙˙ï˙˙˙ŭ˙˙ĝ˙˙˙˙ŝû˙ô˙úŭ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙óò˙˙úġ˙˙˙˙ŭòûġ˙ŭ˙óŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ûóôúó˙˙ü˙÷ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭ˙ô˙˙˙î˙í˙üùü˙ġĝ˙ŝò˙˙ŭ˙Ûü˙ô˙˙úŭú˙ĝö˙ñóŝû˙ò˙˙ö˙˙óŝ˙˙öġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ġ˙ĝ˙û˙˙˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙ô˙è˙˙üÍ˙ö˙˙˙ŝ˙˙˙˙˙˙˙˙˙ŭ˙ôù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙öö˙˙Óù˙ġ˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙úúú˙˙˙˙íü˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙˙˙ú˙ĝû˙ğ¤§˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ċû˙˙Ñŝ˙˙˙˙÷˙ġ÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ì˙ê˙˙Ŝ˙ŭú˙˙ċ˙˙˙˙˙˙˙˙˙üŭŝ˙ŭüüŝ÷˙˙ŝö˙˙ó˙˙÷˙òñû˙í˙˙˙úŭŝġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ú˙˙öî˙ú˙˙ëôŭŝŝ˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ñû˙˙ĝ˙ú˙˙ü˙˙ŝŭùŭú÷˙üŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ÷˙˙˙ö˙˙˙üù˙˙˙˙˙û˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŝ˙˙˙˙Ûóŝï˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙öŭú˙ñ˙˙˙é˙˙î˙˙˙˙ŝüô˙˙˙˙˙ŭó˙ó˙ŝôü˙˙˙˙ŝ˙˙˙ç˙ï˙˙ûùù÷˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙ô˙˙½˜§ż˙ŭĝĝ˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝŝġ˙˙˙˙÷˙É˙ÔÒûúû˙˙˙˙˙˙˙˙˙úÂÙÔÌ˙óö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úö˙üġÉó˙˙˙óŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙üûӃ #Êĝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙úöùüûŝ 7' ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġÍù̙úüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙ž˙÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ÑĠĈŬÒËÁàÙÓÙÚĝÍ÷˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĝ÷ù˙ù˙˙˙˙˙˙ĝü˙˙˙˙˙˙˙˙ġ˙ô˙˙ñó˙Ü×˙˙˙úöŝ˙ŭ˙˙úú˙˙˙üñ˙÷üġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙ñë˙ġ˙˙˙÷ĝ˙òê˙˙˙˙ĝĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ùìúü˙ûŭ˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ŭ˙˙Ï˘¨˙çö˙÷û˙˙ŭóóŝ˙˙÷˙ĝü˙˙ŝ˙ĝ˙˙˙˙íì˙ûñ˙˙ü˙˙˙ùʲ ˙˙ĝöŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ô˙ħ˜#›˙ŭù˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙ù˙ŭ˙ŭŠ“Ħ˙˙û˙˙˙˙˙˙˙˙˙Ğ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭô˙˙üœĤĴ´ğ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üù˙˙ĝġÓċô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙4˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ñ¤¤ĤĞÚ˙ö˙ŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙È˙£–%˜ö˙ŝè˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ó­  Ñö˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú÷˙˙òûüġú÷î˙ŝ˙÷˙˙˙˙˙˙˙˙˙óĝ˙ċê š˙Ñ˙ġú˙û˙˙ŭ˙˙ùì¤˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙ù˙˙̜£ĤĴĴû˙ôŝ˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝĝû˙˙ŭĠ‘(•Ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙öŬ'­Ï˙˙˙˙ò˙˙˙˙óûŸĤÓ˙íï˙˙˙ñ˙ñŭ˙Ĉ "*żò˙üÏïûó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ–  '˙ú˙ü˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ŭ˙ù˙ì˙1 $# ˙˙˙˙˙˙˙˙˙˙˙ -×ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó°Żú˙ùú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ò˙À/Ä˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷ü˙˙˙ûô+%˜˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ Ë˙ù÷÷˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ż'˙÷˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙ŭôÄڙ0  %'(˙÷ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ò˙Ï(˙û˙Ú˙˙˙˙˙˙˙˙˙ġŭü˙˙7‹˙˙ò˙ú˙ú˙˙ŭ˙öÙ$ ”˙÷˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ĝ˙ü™&¤˙üóù˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙§ !š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üó˙ù‰&'Ÿ˙żô˙˙˙ú˙ùñĈ ò˙ôŭ˙÷÷˙˙ôÈ$ ˙˙óš'éû˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öÏÓ!&)›÷˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙ô˙˙˙˙ù•˙ŭ÷˙˙˙˙˙˙˙˙Ğ"'Òú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝ¤˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġü˙ú˙&×ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ûôü˙ù˙ÂÓ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙î°$*‰˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙§ "ô˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙ûí˙‹* ‘ĦĠÁ%' 0 ˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŭĝ˙½Ĵö˙ö˙˙˙˙˙˙˙˙ŭ˙˙óñ-%ħ˙ó˙˙ü˙ù˙ŝúŭÎ ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙˙“&)&Ŭ˙˙ôŝ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úüŝ˙˙˙ßĥ2œú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ë˙+ ˙÷˙ú˙ĝ˙˙ĝ˙ċ˙˙ŝĝô˙˙ü˙˙Ù""ġŭ˙­ç˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ $&˙˙˙˙ù˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòŭ˙ô˙˙˙˙! #¤ŭ˙˙˙˙˙˙˙˙˙˙÷& )ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙'˙˙ë˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙óŭ˙˙‹$)ŭ˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùûŭ˙˙˙˙˙Ö!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëġ˙"%î˙˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùž˙Ÿ!£›Ö˙ġ˙ù˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙úç™*˙Îù˙˙ôÔ$è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝù˙˙Ô+Ô˙ú˙ò˙˙˙˙˙˙˙˙˙ñ˙ï˙ £ŝ˙˙˙ŝ˙ù˙ĝûŭŞ*óï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ìŜÊ #”ÒÄ˙ö˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷ŭ˙˙ö£È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙úœÌ÷˙ù˙úŝ˙ö˙˙ĉÚ ÷ú˙ö˙ŝ˙˙˙ú˙™(˙úŭŭŝ,–˙˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙! İÈù˙÷˙ü˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙ŭ˙ùü˙ô×)Ğöŝŝ˙˙˙˙˙˙˙˙ôĜÓÛĊ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙áĈ§Ġ×ï˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙˙üŝ÷ÑÓĜÇû˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝħ—˙˙öŝü˙˙—$ ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭ£ ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ  Ï˙üĝ˙˙ô˙ú˙÷˙˙˙˙˙˙˙˙ŝ˙ŝû˙˙ôß""ž˙ŭŝ˙ù˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙÷Ŭ  ˙û˙÷˙˙˙˙˙˙˙˙˙ô˙ú˙˙Ĵ ŝ˙ó˙ŝ˙ù˙ĝ˙˙™&À˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙"˙ĝŝûù˙ŝü˙÷˙˙úĝ˙ĝŭú˙˙˙˙ġ˙ŝ˙˙˙˙˙˙˙˙˙ŭ˙˙˙û˙˙ĝ˙ñ˙˙ü˙˙˙˙˙ŭĝ˙˙ü˙ùŭ˙˙˙÷˙úŝŭ˙˙˙˙ó˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ú˙ġ˙˙ü˙ó˙ŝ˙ŭ˙ù˙Ŝ˙ĝù˙˙ñ˙˙ĝ˙ñ£¨ŭ˙÷˙˙úŭ˙˙ĝ˙˙À˙—úÎ˙˙˙˙ŝù˙˙˙ ˙ñ˙˙÷§—˙ŝ˙ûĝ˙˙ú˙˙˙ö˙ŝú˙˙˙ö˙û˙˙˙˙˙˙˙˙˙˙ûŝü˙ò˙˙ò˙˙úĝ˙ŝĝ˙˙í˙öü˙£'ĝ˙ŭ˙ò˙ô˙˙˙˙˙˙˙˙˙ŝ˙ú˙ûÉž˙û˙ŭ˙ġ˙Ğöĝ˙˙ĝü˙úü˙ú˙ì˙ŝ˙˙÷˙˙ù˙û˙˙÷˙˙˙ŝ˙ôó˙÷˙˙˙˙˙˙˙˙ùŝü˙˙ùŝ˙˙ô˙ö˙˙ó˙˙˙ò˙ó˙˙ŭùŭüĜ÷˙˙ûĝ˙ï˙˙˙˙û˙˙ŭ˙˙ú˙ú˙ŭü˙ġ˙˙öŝŝ˙ö˙ô˙˙˙˙÷˙˙˙˙ŝ˙ô˙˙üù˙˙ġ˙˙˙ö˙ŭû˙ö˙÷˙ú˙ü˙ô˙ü˙˙ŝ˙ü˙˙ŭû˙˙ŝö˙˙˙ġ˙˙˙ŝüüŭ˙˙ûûŭ˙û˙ô˙û˙ŭ˙˙÷˙ŭŭû˙˙ö˙òŝŭû˙ï˙˙ö˙˙ĝ˙ŭû˙ò˙ü˙˙ô˙ŝü˙ĝ&÷˙˙ñ˙ĝûŻüù˙˙ü˙˙ù˙û˙ú˙î˙û˙˙êû˙ù˙ú˙ûûü˙˙ü÷˙û˙ġ˙˙˙˙˙ŝ˙˙˙ĝ˙úŭú˙ĝ˙˙ŝüüŭ˙˙˙˙÷˙˙ï˙˙ĝ´í˙˙öû˙ú˙ŭ˙˙ù˙˙ô˙˙˙ù˙˙˙˙˙˙˙˙˙ŭ÷˙ûû˙ĝŭ˙ù˙˙ç˙˙ĝ˙ŭ˙˙ŭ˙˙ü˙Íúú˙ŝ˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙ù˙˙ó˙ŭž! ŸĜ˙ŭŝû˙ġ˙Ì!"û˙ù˙÷˙ŝ˙ŭŝ˙öû˙ó˙˙ùö˙÷˙÷˙˙˙ŭüŭ˙úòŭ˙ŝüö˙˙ô˙ĝ˙š™Ú÷˙ú˙˙ôŭ˙÷ĝ˙ùù˙˙ĝ˙ûú˙öù˙˙˙˙˙˙ö˙˙í˙ĝú˙ü˙˙ŝĝ˙û˙˙˙ü˙ŝ˙üŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙  $÷˙˙˙˙˙úù˙üĉ˙ŝ˙˙÷˙ú˙÷îñù˙˙˙˙˙˙˙˙˙˙˙˙ùü˙˙ġ˙ù˙ì˙ŭ˙˙˙ñôÌ) +ġ˙˙˙ï˙ŭ˙˙òġġ˙˙˙û˙ŝú˙ŝô˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙÷˙˙˙˙˙˙÷ì˙˙˙˙ñ˙ŝ˙˙˙ñ˙ô˙ö˙ú˙ö˙˙˙ññ˙ŭü˙˙ŝ˙ŭÂĤÂ˙û˙ü˙˙ö˙üûóÏ ˙˙öúŭ¤óĝ˙˙˙ĉ˙ï˙ñ˙ŭ˙˙ó˙ò˙ù˙˙˙˙˙˙˙˙˙˙˙ĝ˙üú˙ïŝñ˙˙÷ġó˙˙˙ò˙˙˙˙üİ!$œ Í˙ŭìŝŭ˙˙˙˙˙˙˙˙˙˙ûġ˙ñü˙ ŭ˙ò˙ŭ˙ó$%Žù˙î˙ŭ˙˙˙ŭü˙ü˙˙íĝŝ˙ŭ˙ö˙˙˙ö˙ĝ˙ë˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙ŭúó˙˙ĝĝ˙ŝ˙ù÷˙ġġ˙˙ùü˙è˙ú˙˙÷ü˙ñŭ˙˙ċìĝö˙˙ùü˙˙˙˙ŭ˙ü˙ġÙĝ˙˙ŝ˙šŞ Âô˙˙˙ùġ˙é˙ŝ˙˙ŠŸŬòû˙ĝ˙ġŭïŝ˙˙˙ŝĠ˙˙˙˙û˙˙˙ç˙ú˙ûöû˙ñ˙ĝ˙ú˙÷ĝêóÊĤ’­Ú÷˙˙ŝŝö˙û˙û˙˙˙óü˙˙˙˙ûÓüü˙ê˙û˙ññ˙‹Ħ¨Ó÷˙öŝôŝ˙˙˙ûû˙ô˙óŭ(—ùöĈ˙˙˙Ċ'ŝ˙ô˙˙ä˙û˙˙ŭ˙˙˙˙ûêûû˙˙˙ô˙ù˙˙˙ġŝ˙˙ŭú˙ŝŝûú˙Ŭü˙˙÷˙ĝŝ˙˙˙ù˙Ë˙Ï˙Ċ˙˙˙ùŝ˙óħĈ˙˙ĝ˙˙˙˙û˙ĥ˜£Ġ˙ŭí˙˙ü˙˙˙˙˙˙˙˙˙˙÷˙û˙˙˙˙˙ŝ˙ü˙ñó˙ü˙˙˙ĝô˙ô  ĵ˙˙üûúûŝ˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ìû*!ĥùñû˙˙ï˙˙íŭ¸ ˙òü˙˙ú÷ġ˙ï˙˙úô÷˙ú˙ż˙˙ó˙ġ˙ċ˙ĝŝ˙˙˙÷˙ú˙˙ö˙˙ŭ˙ú˙ô˙ûüñü˙úùüû˙˙˙üû˙˙÷˙ú÷ŭ˙ŭóùŭ˙ò˙ŭ˙˙ì˙˙ü˙ñö˙ŭú˙ñû˙˙ûúŝ˙÷˙˙íû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙' ˙íŭûûöŝ˙ŭ˙˙ûö˙ó˙ŝ˙˙ŝ˙˙û˙ŝû˙˙˙˙˙˙˙˙û˙í˙ë˙˙˙*ĥ˙˙ó˙˙˙ü™Îŭúö˙úü˙ú˙˙÷˙üúù˙í˙˙ûò˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙ġŭóÍÑó˙Ì˙ó˙ŭ˙˙úġ˙ï˙ë˙˙˙˙ö˙ûĜ˙ûó˙˙˙˙˙ú˙íġ˙ü‘˙ŭ˙ŭü˙ŭ˙˙ŝ˙˙û˙ĉ˙ü˙,˙˙˙ûü˙˙ÄÎĜĈßÉ÷˙ŝŭú˙üġ˙˙˙˙˙˙˙˙üö˙ĝ˙˙ô˙˙˙ùħ×ÚÜÇ˙ù˙˙ü˙÷ú  0 œż˙ó˙˙ûüû˙˙˙˙˙˙˙˙˙˙˙ġ˙˙Ê˙ú˙û˙ĝ˙²˙˙Ġ÷˙ĝ˙ù˙˙˙˙êü˙˙ñ˙ùû˙˙íŭ˙úĝġÚóú÷˙ŝü˙˙˙˙˙˙˙˙ġûû˙˙˙ŭ˙àƒ¨ö˙˙û˙˙û˙Ċ˙÷˙°˙ĦÖĊ˙˙˙úÍ˙˙ñ˙˙˙ü˙˙öġ˙˙îù˙˙ŝ÷ ˙¤-ĝüĝ˙êö˙˙û˜(# "×˙é˙÷˙×ĠÛÎÈ# ÒÉŭ˙ŭ˙˙ö˙ż2ÈÍÛŭŭô˙ú˙Ò4–ö˙˙ù˙ü˙ü˙ŭ˙ü˙˙ûïÇ˙˙˙ûòò˙ġĝ'#¨ŭ˙˙˙ú˙÷˙ó˙˙˙˙ Ñ˙˙÷ñ˙Ĵ(˙˙˙˙Ĉà˙˙úú˙˙ìŝ˙ñ)#Íü˙˙ñ˙˙üŭ˙ŝŝù˙ĝ˙ü˙ÀéöĠ˙˙ޝ˙óŝ÷ĝ˙˙˙Ğ)›Ŭ˙ùô˙ùĝ§!ï˙ô˙˙ûöĜ 8 ˙˙˙˙˙˙ŝĝ˙˙˙˙˙˙˙˙˙ĝ˙˙˙ĝ˙íŝ˙˙ûËÎÇ˙˙Ù˙˙è˙ö˙Ô'Ööú˙˙˙ûü˙˙ŭ˙˙˙˙˙˙˙˙˙˙ŭ˙˙É'ĝû˙˙ù˙ġ˙˙ġ˙ò˜%!Ç÷˙˙ûï˙˙˙˙Ë˙ŝ˙˙˙˙í˙˙˙ó˙úúü÷˙˙˙ŭëŝïù˙˙ŝöü˙˙óíÙ˙˙í˙˙ö˙ù˙˙˙˙îŝ÷˙˙ùöó˙ù˙ 2˙ĝ˙ôë˙˙˙˙ñ˙˙ò˙üú˙˙˙˙ûĝ˙ŭû÷˙ïüù˙û˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž  ù˙˙˙ŭü˙˙ñúĝô˙˙ŭ˙é˙ùó˙˙ú˙÷˙˙˙˙˙˙˙˙˙ö˙˙ò˙üüŞ$ûĝ÷˙ùä˙˙ò˙˙˙˙üùï˙óó˙˙ĝ˙˙˙ù÷˙˙ú˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŭ˙Úî˙ÌŻ ”™˙˙úú˙ò˙ù˙˙˙˙ò˙ĝñü˙ûó˙˙˙úŭû˙˙˙˙ìñ˙°ğċĝ˙˙˙ĝ˙úġ˙öò ™î˙˙ŝ˙ ˙ġ˙ĝ˙ÑŞ˙û˙˙˙îġ˙˙˙˙˙˙˙˙˙˙ò˙òû˙ó˙ŭ‚§& #–ú˙ŝ˙î˙Ğ# !˙öŝ˙óŭ˙˙˙úŭ˙˙˙˙˙˙˙˙ġ˙ŭĝœÎ˙Ş˙ŝñž ! Ê’Ğ­Ž˙Óôĝíŭĝ˙˙ÈÔ˙é˙˙ċ˙˙ŒĤ#·’Żú˙÷ò˙˙˙˙˙˙˙˙˙˙ú˙˙éĝĦ .%˙óñ˙”˘% ‘ĥ%  ŞË÷ü£ž¨—½˙üî˙÷òù˙üúú˙˙ïöĤ.$Ì˙ŝ˙˙Ê˘#È˙ô˙ *!(˙ßûè˙ûĴ )Î˙˙ċô˘ë˙öüû˙úŭŝ˙ŝ÷û˙ŭ¸Ÿ•™Ú˙˙˙ô˙°"—üò˙˙ôüû˙ĝ˙˙ו5—‘Û˙÷Ò#ŝàĦ‰/$É˙˙˙˙˙˙ï˙(”˙ŭ˙˙˙˙úö˙˙˙÷˙ל*ž¨Ĥݝçŭó˙’*  ›ŭûŝ˙˙Ġ˙˙˙˙ĝöŞ'!. ˘ô˙˙ĝü˙û˙˙˙˙˙˙˙˙üŭ˙ü˙ĝ˙×ŭÈĤŸ™”˙˙ĝ˙˙ïÙ˙ġ˙˙˙û˙˙ú˙˙˙˙˙˙˙˙ù˙ùĝ˙Ğĝŭ˙˙ġ˙ûú˙ĝ˙˙Ó˙½İŸ˙˙ĝù˙˙™°›†–§öûü˙ôŭ˙“£˙˙ü˙˙íŭ˙˙ú˙˙úŭû˙˙ü˙˙˙ëù˙˙˙÷ŭ˙ñĝúè˙˙˙˙ŝĝĝ˙˙ô˙˙#÷˙˙ûö˙ñ˙ĝ˙˙˙Áù˙ï˙˙˙ù÷˙˙ŭ˙˙úè˙ú˙ŭúôó˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙İ$˜ûùŝ˙˙˙ÜĵÌ˙˙ĥĦŸÜù˙˙ó˙ü˙ö˙˙˙˙˙˙˙˙˙ŝ˙ñï˙ûû˙˙ĝ˙˙˙ ú˙ŭǓ˙À˙˙ġ˙˙÷úèùĊÈ!&›˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÊŞŻ.˙˙›- Ç˙˙˙öÜÍÉÒÜ˙˙ö˙ċ˙üĊìŸÂސßáù˙˙ŝ÷Ï˙Ĝ!)ş˙˙ġ÷û$#•ôá˙ô˙Ö $Ħŝ˙ô÷˙ĝ˙˙˙˙˙˙˙˙˙ŝó˙ñö˙–* !—˙ŭú˙½  *'"ò˙˙ĝŭŝŭ˙˙˙˙˙˙˙˙˙ŭ˙ġÏ$(!"£˙˙˙ *$+ ó˙˙˙˙ô' £˙˙˙ŝŝ# #ż˙˙˙÷˙˙˙˙˙˙˙˙˙˙ë˙Ĥ#) ˘˙˙×( 7 - “¤-ŝ˙˙˙˙˙èÛŭ˙˙# 0 (ŭöŝġš  +˙¸,1$' Òó˙˙˙Ĥ%" $Û÷Ö´ïìúû˙ŝ˙ï˙˙˙˙ĝ£2Ê˙è˙Ş$ ,˙ġû˙ü˙˙˙÷íú˙)*Ġ˙ùÄ+ #òì˙ô÷Ğ!,&‹˙˙÷ù˙˙û˙ü˙˙ûÂ#,  °˙ )§$ ˙˙ó˙ùá £ïÛí˙Ŝù˙è˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙îĦ#  *¤Ôó˙Ê'5 ×˙˙û˙˙ŝ˙˙˙˙˙˙˙˙˙ú˙˙•è÷öôôû˙ù˙óü˙ì˙˙˙úûí˙Ĝ¤É" 4¨˙ô˙²Â&ĦšÚ˙—˜—âùĦÏÛıĝ÷ûï瞛×÷˙ü˙˙â÷ÛÙ£ ×Ŝô˙ï˙˙!Ä %Ŝé˙ĝ˙ŭ˙˙ïĵÂ˙öü˙÷˙ô—+Ş•˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ×˙ŭ˙ŝî- ŝŒ",Â˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙Ŭ˙˙ö' ˘ßŝġ˙úü. û÷–2 ³üï˙ù˙˙˙§/! *¤ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ħ #++#œ $ -Ìó˙ì˙-Ùñ˙˙ú˙˙¨% #Żġï÷ŭ˙ûŬ› + ˙ü˙˙˙­ù˙ʗ£ÚĊ¨ç˙˙ú˙˙˙˙˙˙˙˙˙ü˙ù˙÷˙ş! ¤•Ĥ$˘ŭġ˙ž ¨û˙˙˙ñü˙˙˙˙˙˙˙˙˙˙Ï˙ .Àï˙˜!˘”².‘öì˙˙·$˙˙Ÿ.Ìŝħ&Ïûí˙ŭ˙˙˙˙˙˙˙˙˙÷˙˙ $!´ $"éöùž''$*!(˜˙ġô˙ô˙˙˙ü›#$$§ú˙Ç˙˙˙˙*¤˙(˙˙$ÄŜ+Ë˙˙ĵ  #Ë˙˙%ñô˙˙˙˙˙˙˙úġŭ˙­Ë˙ŭû! -ŭ˙÷˙˙û÷ü˙˙˙î  Ħî˙(˙˙ ˙˙ŝ˙ĝ)&*Êô˙üĝŭ˙˙öŭ˙˙Ù( *&ŠÍ#œÍϙ"! ñŝüüûÒÊ˙˙˙˙œ$!Ĥ˙ŭ˙ĝöŝ˙˙˙˙˙˙˙˙ŝŭ˙û˙ü‘4&¤’İÒ š˙ü˙ ( Ûñ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙ú˙˙ġ1)µ˙ü˙˙˙˙˙ô˙˙ú˙ġöÍ˙ġ˙ò–+‘İĊ˙Ò (/0 Ĵ"!&˙üË ŭ˙ŭ˙úèŻ% Ê˙÷˙ #áù˙˙ù$ŭ˙˙ú˙ïÇ &˙ß˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙: ó˙ú˙ŭ˙ •)%"-çû˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙ŭ˙ùó£  #Ħġû˙²Ê˙˘ ·÷˙üŭ˙Á% %˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ò"% " " ˙˙í˙ ˙ññ˙˙Á—%™‘˙˙˙˙ô 'Œ$+Ò˙ŭ˙ë÷œ˙˙í¤˙ö˙û˜%˙˙ĝôŭ˙˙˙˙˙˙˙˙ö˙˙ó˙˙- ( ˙ĝ˙˙ Ş˙è˙Ÿ*/˘ ˙ûö˙˙˙ù˙˙˙˙˙˙˙˙ù˙˙˙ ×ŝô˙˙ó˙ŭ%Ğ˙ú˙Ó% ˙˙íŭ!˙˙ġĠŸî˙ġ™"É˙˙ò˙˙˙˙˙˙˙˙˙˙ë˙Ĉ­ŝÒ ˙˙˙š+ ˙”! ü& ż˙˙ŭ˙Ô "&‰˙ŭàÄ˙ĝ˙¤ŝ˙÷– !Ĥ"˙˙ ˙˙ŸË˙˙Ħ+Ğ+˘(ò˙ô˘˙˙˙˙ŭŝ˙ŝŝ˙˙˙ŭş1ġò˙˙'ŭ˙˙, 0ĉ˙üŝ˙ú˙ú˙óú˙ú%!ž ˙˙ĝ˙˙Ú # Ùùï˙° Ïòü˙Í!%  $ ´í˙˙ûûŝ˙˙ûŭŭœ +%˙˙›šĉĝ˙ĞĠĝ˙ù˙ Ìö˙˙˙Ï$áèú˙½"à˙˙ŝ˙ü˙˙˙˙˙˙˙˙ûú˙˙öÏ0È˙˙ï˙%Ÿüì˙. +â˙ù˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙( ˙ĝ˙úôĝü˙ò˙˙îŭ˙ü˙î˙˙Ú˙˙˙%(÷ô§# ˘‘/ !$òġ˙úŭ˙˙Ĵ%˜”˙ŝò)™Ò˙ï(˙üüŭ 4Â˙˙û˙Ħ &-Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙"žĝ˙˙˙ï˙£ÏԕĦ ŝ˙˙÷˙˙ġ˙˙˙˙˙˙˙˙ŭ˙˙˙İ ! Î˙˙ô¤Şö˙ûĦ)˙˙˙Ĝö³¨™+Ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûĞŝ˙ú ¨ĠÄġ˙˙òĝ%"˙˙÷Í#Ì˙ŭÎÓİò˙üñµ$ŭ˙Ԗ#Ñ˙÷˙˙ŝ˙ô˙¨ĠĴ—Ú­ŝŝò˙ú˙˙˙˙˙˙˙˙˙˙ĝ˙ŭË # &™ù˙ú˙£!(ù˙˙˙ œ˙û˙ù˙˙ŭ˙ü˙˙˙˙˙˙˙˙˙ŝŭ˙͟˙ŝŭü˙˙î˙ #Ñ÷˙ö˙Èòû˙˙üÔĜûö˙ÊĤŝ˙˙Ö¸ŝô˙ŝ˙˙˙˙˙˙˙˙˙ö˙úŝü˙ò ĴàìĜİ -œ×öӜÓŝ˙òŭ˙ ˙ĝŝ˙ġÔ# ˙ï˙ôĤ úù˙'! ,áĝü˙£­ġŬñü+ž˙É  "ŭûúúÓÔÎÌ˙û¨Ÿ˙û˙˙û˙˙˙ü˙˙ú˙˙Ċž˙˙ûġ % ¨Ô !É˙û˙ŭĝ˙÷˙üŝ˙ö˙¤ö˙ùġ˙ü˙Ë'¨˙ŝ˙˙ö'˘˙˙îŞ   (ŭ˙ûŭ˙˙ŭ˙˙ĝ˙ù˙ùĦ )Žŝ˙ŭĦ˙ô˙÷ŭŭ˙ö˙£ $"Ü˙˙˙ŭÏ˙˙óŬ  $˙ŭë˙ú˙˙˙˙˙˙˙˙˙˙ŭ˙ùͤ%×ŭûúÑ˙Ş $ ˙˙˙Ğ˙˙÷˙˙üŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù*  ’˙öû˙˙˙˙˙ĝ˙˙û˙÷˙ô˙›§˙ô˙í˙' Î˙ĝÓ 'ĤšÎÒ #š˙˙òÒŝ˙˙ë˙¸ì˙Ò˙˙û˙$ !˙úö˙›ü˙ŝ­ô˙ô˙¤Şŝ 1 ˙úŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûü˙˙˙™%×ŭüû˙ú˙ü$˙˙ĝ÷ŝù˙üù˙ĝ˙˙˙˙˙˙˙˙÷ŝ˙˙ŝ‘%,–›˙˙˙˙ŝ˘)˙˙˙÷üĞ˙˙ŭ˙ŭ'ÍĤ !˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˘ûĜ˙óħİ ˙ûĝĴ ŭ˙ŝ˙˙•Á˙ü˙˘ó˙˙˙˙˙í˙˙Ġ˙˙ŭû¨Ĥù˙˙÷ŝ˙˙ó Ÿ˘Ħ›Żš›¸öġ˙ö˙ŝ˙˙˙˙˙˙˙˙ĝŝ˙˙˙Ħœ˙˙˙ĝ˙ñ™˙˙ú˙ġ˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ú˙ÁËú˙ŝ˙˙ú˙4 İ˙˙ġ˙÷´˙˙˙û˙ü¤%Úŭ˙ò˙"¤˙í˙˙ï˙˙ú˙˙˙˙˙˙˙˙˙ûġ(# Ñ˙úü˙É˙˙˙úÍ%˙ô˙ò  ú˙ñ˙û—üġ˙ĝù˙$˙î˙ĝú˙˙Ĉ $›ŸŞ”¤ËÈ˙÷˙˙Ì#˙ûü÷˙ !˙˙ښ˘ú˙ŝŭ˙˙˙˙Çŭ¨ÑÓ˘Èœ­›ĜÎ˙ŝû˙÷ùüĝ˙üù˙ŝÔ£Ë˙ú˙ŸĤò˙ú˙˙é˙˙˙˙˙üüú˙ŭ˙˙ü˙˙ŝ%!ĝ˙˙ùü˙ ¤ò˙˙™¤¤˘š Ô˙ŝ˙˙˙˙˙˙˙˙÷˙ĝ˙˙ü˙ û˙³+•ŝ˙ù˙ü˙˙ñĊ² $!˙˙˙ŝ˙ĜĦ˙ŝù!š—²ž™ĞĊ˙˙ŭ˙ö˙˙˙˙˙˙˙˙˙ġ˙üûò)  ­ù˙˙ŭŭ˙ÑÌö˙˙ "ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ġ˙ž !Î˙öúŝ˙˙ŭĝ˙˙ŝüù˙üĝ˙ É˙ĝú˙˙ Èûù˙ŝ÷×ĝŭ˙˙ĝÒ 'Ĵ˙˙ò˙˙ĝ›Îò˙˙ĝ˙ŭ˙Ò '“˙üù˙Ôĝŝŝ˙ËĤúŝ˙´úŝ×ĝ" #£ö˙ĝ˙˙ĝ˙üûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭŭ˙˙ûÑ $“˙˙˙ĝ˙ŭ˙Á˙úġ˙ÖÚ˙˙ŭú˙ü˙˙˙˙˙˙˙˙˙ù˙û˙˙’—Ĝ˙ö˙ôġ˙'š˙ó÷˙˙˘î˙˙§ '  #˘û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÖА˙˙û˙Ÿ!ŭ˙û˙˙¤ ü˙˙ċŭÔ# Úù˙ê" œ˙˙÷ùĦ Ë˙˙˙Ş)İ˙òŭ˙ûÓ•˙ûŭû˙ ,óö˙ô™ÔÏÓ˙ôÖù˙ĉ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙ù˙ʵÍ÷ü˙ü˙˙µ+Ñúù˙üĦ˙á˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝġÏ%˙˙ŭŝô˙˙ô$ Ñ÷˙ú˙˙"Î˙û˙˙É %û˙é˙öĈ˙˙ò˙ĝ˙˙˙˙˙˙˙˙˙ĝĦ &ġËżĠ˙ò˙û˙óÔ˙˙ú˙œ#˙ü˙ö˙œ“˙÷˙˙ĝı˙ûŝ˙˙™ü˙ö˙˙ŝ˙É & ›˙é˙˙ñ˙ü˙ò˙üÁïû˙úú%Ż˙ùóÑ˙ó˙˙ŝ˙÷ŭó˙˙˘ Ò˙ûô˙÷ĝ˙í˙˙˙ġú˙˙ü˙˙÷óü˙˙˙"œ˙Î˙ġ˙›# áë˙öĝ˙ú˙ŝû˙˙˙ŝ'˙üŭú˙ñ˙˙Ş˙ûü˙˙÷™˙˙ñž‘˙ú˙ôĜĝ˙ô˙˙˙˙˙˙˙˙˙˙˙ûü˙óŭ0Ê˙' ħŝ˙ü˙ñġ˙&&"ŭŭŭġ˙ÄÊ˙ !ŬËíË˙ĝ˙˙üó˙˙ĝ˙˙ò˙˙˙˙˙˙˙˙˙˙ö˙˙ !"›˙ù÷ŝ˙ûŝ%Ĝ˙˙˙œ%˙êġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙ŭ˙Û#™ûÌ˙ŭùŝŝŭ˙üŭ˙˙üú˙öÙ˙˙üĦ "Ó˙÷˙˙ ˙ô˙ü˙ò˙Ú5ïö˙˙˙ú˙İŬ˙ë˙Ñ˙ġŭù˙ĵ×˙˙ĝ˙Ú˙˙˙éÚ˙˙ġ˙öú÷ŝÚ §+ßÉì˙úŭ˙ó˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙Ĥëúüüû˙˙#"Ù˙ò˙÷Ò "Í˙ü˙ú˙ü˙˙˙˙˙˙˙˙˙ú˙üî˙ĜĞ˙˙ò˙ù˙˙ô #Ş÷˙˙˙ŭüÌ$­˙˙ü™ ħĈ˙ħżŝÚÌù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñüôž û÷˙˙ġ˙˙ġ˙—'ħé˙ü˙ĜŸú˙î§˙˙ùû˙ĝ¨Ïô˙˙ĥ í˙ŭù˙ûß ˙ġŝ˙ó ô˙ŭ÷ Ñô˙û˙È˙˙ü˙˙ŭ˙üú˙˙˙˙˙˙˙˙˙÷˙ü˙*İûĝ˙˙èġû ˙˙˙˙ "Ïô˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôÚ Ìŭó˙˙ñ˙"û˙˙ŭ˙â Ÿúùù˙Ó""ò˙˙˙ŝŝ )Ò˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙&Öĝö˙˙˙ġ˙˙˙˙˙żŸü˙ö˙˙£˙˙˙˙˙É &¨˙ö˙ġûÇž˙ïŭ÷˙˙˙˙ü˙ı ï˙ ïË˙ĝĵ˙û˙Ŝñ˙ôì 'ë˙ŝï˙*Şô˙˙Ĝü˙˙ë˙ŝ˙ŭü˙ûĤ0˘ŝ˙˙öçüŭ˙ġĉ˙˙ġ˙û˙÷˙˙˙˙ĝûô% ˙ŭ˙˙˙$ !˙˙˙˙˙ô˙ŭù˙˙˙ŝÍ1˙ú˙˙˙˙ôÜ$Úù˙ŝò˙Ğúë˙ŒÎ˙˙˙Ìŭ˙˙÷˙˙˙˙˙˙˙˙˙˙˙û˙û˙Š!ż%‘˙É˙û˙³  Ù§'ùÉ˙˙öÙ(”˙ĝöÊ˙˙˙ŭ˙òü˙˙ŭ˙ùü˙ĝ˙˙˙˙˙˙˙˙ò˙˙˙#!Ħúĝú˙˙˙üžÌ˙ìü'›ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙ŭŝ+˙˙˙ù˙ŭü˙˙˙úûÏ˙—% ï˙ó˙ö˙˙ !Àù˙ĠÚ˙ŝ˙ġ÷˙˙÷Ċ˙ô˙˙˙ĝ˙È˙Ûí¨.˘û˙˙˙óò˙ûŝ˙Íí˙ġĝ˙˙ò˙ó˙Ŭŝü£´żû˙ì˙˙ô˙˙ġĝ˙ù˙ßú˙ġ˙ŭó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙ŝÄ# ˙˙˙˙÷òĊ³Ċ˙ë˙ŭ™#â˙ĝ˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙ñŝü˙˙ô”˙ûŭŭ˙˙÷ŝ!Ÿ˙ìü˙˙ŭ— +‡˙˙÷­!ì˙˙ë˙˙˙˙ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ͱŝ˙ó˙˙ Î˙îÏ˙ %ğ˙î˙˙ĊŞ˙˙˙Ÿ&Úí˙˙ŝğ Ğ˙û˙ Üô˙˙˙˙Á ˙ûô˙˙˙!˙ġĜ$"Ë˙˙˙ù÷ö˙ŭû˙úúû˙˙˙˙˙˙˙˙ġ˙÷ú˙œ; (˙òü˙˙Î ˙ù˙˙˙Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙çû˙ú˙ú˙˙ ˙û˙úĊŸû˙˙ŭÍÖġüô˙ôü˙Í˙›+˙îĝ˙˙˙˙˙˙˙˙˙˙ì˙ Î÷˙ċ˙ĝúÒĝŝùá,Š˙ô˙˙Ë -óŝîûú˙)ñ˙ŝ˙˙ŻÓù˙úŝû !žéúú˙˙ (˙ġĦ'ßûó˙˙˙÷ö˙˙ü˙‘! ŭ˙˙˙˙˙˙˙É÷ò˙ü˙ü˙˙ĝŝ–Ë˙ò˙÷üö˙˙˙ûü˙ŭù˙ŭ˙û˙˙ù˙˙!0Ôùíŝ—§˙˙È ó˙÷ŭ÷˙˙ŝù˙üŝüÏ—ü˙˙ŭ˙ü½˙˙˙˙ŭ-·˙üÒ,$ó˙û˙˙˙ŭŭ˙˙˙˙˙˙˙˙ŭú˙ŝ˙˙˙Ü" &âû˙ŝ˙˙˘ŭŸ˙˙ĝ˙˙ ˙êŭ˙( "ö˙˙÷˙ù˙˙˙ù˙˙ô˙˙˙˙˙˙˙˙˙˙˙öî˙ü$ ·ô˙˙˙÷ŝ˙˙ì˙û !îñ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ûĝı($ ĝç˙˙˙˙ŭĝŝ˙ŝ£'˘áĝ˙˙ġâß!Ï˙ñ˙Ċü˙˙˙ŭ˙ñÓ˙ú˙ú˙˙üġâÙÚ˙˙ Ôò˙óŝùŭ˙˙ñ˙íœ#¤˙Ïŭ˙öš˙˙˙÷˙œ"÷ï˙Òœ˙Ŝ˙˙ü˙ŭúóŭüĠÊ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭüüŭÊ$ò˙˙î˙˙˙%Ôú˙˙˙Ħ˙úô˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙˙ġžúö˙ġŝû˙ŭžĝ˙ŭë˙ħ Ĉ˙í˙ $˙ñ˙˙òù÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì¨)Ġ˙˙÷û' ×˙ü˙ì› Ĵ˙ú˙ĝÍ#‹ß÷ûĥ š˙˙óù˙ĝ&"Ìï˙ü+šġûŭŝü§ ˙˙˙ïú§ŝ˙ô&›ñ˙ŭ˙˙˙˙á˙ù˙ïù˙˙˙˙˙˙˙˙˙˙ö˙˙œ$ û˙˙˙˙§ù˙ĝôü& œÄ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òġ˙ċ,˙˙É÷˙é÷˙$ ˙ñ˙˙$Şġ˙òŝ"›˙ùúüıĊ˙˙ú˙žŝ˙˙˙˙˙˙˙˙˙˙˙ö˙ö0Ïüùŝ˙˙ŝ˙˙˙˙ŭ ­ò˙˙Ŭ*Ĥ˙˙ŭ˙•#Ô˙ú˙ŭ–—˙ûŭ˙ú˘ĜĠ˙÷Ġ èùŝ¤˙ö˙˙ġËĦÎìŭú˙ñù˙üÌ˙ù˙Ó ˙˙ù˙˙ù˙ú˙´) ¤˙˙˙˙ÁŬ‘´˙ŝŝ˙ù˙˙˙˙ú˙úĝ˙"Ñ˙˙Û)îû˙Á" ÷˙ù˙î˙˙ŭ˙ĝü˙Ü" °˙ŭ˙˙ùò˙Û)È÷üüë˙ ¸ò˙û °ö˙îö˙ÖË˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙ûüúĴ É˙ö˙ñ˙+ ùôĥ&Ô˙ġû°%+ĝ˙˙ú°ö˙˙˙ġ˙Ž˙˙ö˙ŭûŭ˙˙˙˙˙˙˙˙ŝ˙˙üÒİ $Š˙ûñû˙˙ö/ £ë˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ĝ˙‚%# ˙ŭñ˙˙ù˙˙˘ "Ĵ÷!˙óò˙˙ ˜ü˙˙ĝËú˙ù˙˙ŝ˙™÷˙˙ĝ˙˙˙ô˙%Î˙˙÷˜Ñ˙ùŝô˙˙ë˙˙˙˙È,Œüĝŭŭô˙  ˙˙ŭ˙˙ ˙˙ûÇ'ôù˙˙öù˙˙˙ŭ˙£”˙ú˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙˙Ĵ "Ĵ˙˙üŝü Ó˙˙˙óĦ˙ùŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙ŝ˙˙×÷#‰˙˙é˙ô˙˙ù"˙˙ŭ˙÷ ˙ô˙ñ 1˙˙˙˙Ù˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭÛ.Áö˙˙˙Çñ˙˙ú£!ö˙˙˙èĞù˙˙ê#£ùì˙˙ó£˙˙óû+ŝ˙ù÷˙¸ !˙èġ˙˙Ħ˙˙˙'"Üó÷úŝ˜2Ùüû˙ĝ˙˙˙˙˙˙˙˙˙úû˙÷üÎ$œüŝù˙ŭÏ˙˙î˙˙+ ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ÈĦĉ˙ú˙˙˙ŝù˙˙÷÷!&˙è˙˙Ê˙˙˙œ%Ċ˙áö“%&˙è˙ü˙˙˙˙˙˙˙˙˙˙ô-Ġ˙˙íŭÄ ĝûù˙·˙÷÷˙˙ ˘ú˙ŭ™2 Ïüüü˙ŻÖöó˙÷˙  Ÿô˙ò˙ á˙˙Ô³˙ì˙˙£˙ŝ˙  ŝ˙ô˙É* Ħü˙ô. žùĝ÷˙ĤĤùûù(ĝûòÇğ+-é˙˙˙˙üŭŝŭ˙˙˙ġ¸Í˙ġÁ1›˙ôÜû˙ŭè˙˙ŭ˙˙˙úŝ˙ĉ -ùû˙˙˙î˙˙˙˙˙ìÔ)•ŝĝ˙¤' §˙Ó˙Ï˙˙˙˙˙˙˙˙˙ú˙˙˙ùù˙É %˙ò˙˙˙ü— š# —˙˙ö ›˙ö˙&"Ñ˙Ċù˙Ç˙óü˙ûŝ˙˙˙˙˙˙˙˙û˙ĝ˙ŭ•˙ŭü˙˙î'˙ŝü˙)ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûö˙˙˙ß,$ Á˙ò˙ü•* ÒÌÎ˙˙òŭŭà˙˙˙˙Ħ éü˙ġĝü÷˙ĥ˙˙ŝ˙˙ĝ˙˙ü Ï˙ĝŭÚ˙˙˙ûòŝßí˙öóİ!˙˙ŭ˙˙üùü˙ò Ĉ˙üÌ˙÷ŭü˙˙˙âŭ˙í'Á˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ü÷ĝ ­˙ĝ˙ò˙ü*Ì˙ì˙˙İ ê˙˙˙ĝ˙û˙˙˙˙˙˙˙˙˙úóùñ˙Ò˙ùŝ˙úñ ˙ïĝ˙ŝ Œ˙˙˙Ò##!êŭù˙ÎĊŸÏò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙‹. Ö˙ñö˙'Ĵ˙ëÀ˙˘˙˙ġö˙à"ï÷˙û&à˙üò˙Œ#!˙ŝ˙˙$ŭĝ˙ŭ— ú˙˙ó˙ %ó˙öĊ'Œğ—² Ë˙û˙ûĝ˙˙˙˙˙˙˙˙˙ù˙˙ŝ˙!˘ïۋ$%˙ñ˙˙ñûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ìÎ3 ˜ħĉġ˙ ŭ˙ġ˙˙&û˙˙”! ŝ˙ü%%ŭë˙Ĥı˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô &£ĵ˙ĝ˙ġ%™ġ˙ŭùË'˙ë˙ š˙˙˙ó˜!Ġßí˙­˙˙!žù˙ß$- “˙÷-”ö˙ "Ô˙ŭœ' #£"§÷˙ë˙2*!›˙üñ˙ŭ˙ö˙˙ùĝŝ˙ô”( ‘˙˙˙' ˜œ&³öùû˙òŭŝ˙˙˙ŭ˙˙Ŝ#'­™¨ĝ˙Ÿ(†Ŭç˙˙ /˙ú˙ & $ ˙˙˙˙˙˙˙˙˙ûŭ˙˙˙˙˙Ç'¨ó˙ŝù˙˙É(.)é˙ŭ6&˘ùÍû” ( ˙ŭö˙ü˙˙˙˙˙˙˙˙˙ŭ˙˙˙öû/ôĝ˙ŭÎ!5³ġĝ˙ñ™& &Éö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙ŭïŝ•"ĤŽİ‰,½›û˙“Ş˙˙ï° ˙óí˙˙"°˙˙˙˙˙˙Ÿŝûù˙˙ù˙˙“) ö˙ŝ˙'˜Ìŭô˙ú˙˙ñß  #Ñŝ˙ç˙Ö$Î˙ñŝ˙¨(˙˙Û$âŭĠĝ™*òô6Ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôàÑ̜£ü˙ú˙Ĝ& Ħò˙ü˙˜İö˙˙ó˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙˙Ì& ˙ÙÊ˙ü˙ ˙˙˙ú˙²üú˙˙ £ÖÉߕ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š%§ĝ˙ْ# û˙˙Ĝ˜ŝ˙ü͗Üûû˙Ì Êû˙û"˙˙ü˙ 'ĦĠ˙Ç$É˙÷Òù˙˙Ò$#˘ŝ˙öŭ˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙ŝŭ˙ !÷ŭ˙˙È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝĠ˙› ˙˙ #˙˙ù$ ˙ù ĠĝüĜ£¨œ˙ĝ˙ûŭ˙˙˙˙˙˙˙˙ġ˙óúà& ù˙û  ˙÷ûĤÓ˙˙Ċ ü˙ôŞ% •˙˙Ò  ˙˙Ìž˙ġ˙ö¤%˙û˙ Î˙!"‘˙×̤˙ûö˙˙Êĝ˙ŝ˙˙öû˙ù˙˙˙úô¨. &˜ô˙ž#%$Ç˙˙ŝòú˙˙˙ŝ˙ŝŭúΨ˙û˙ùÏÒ˙˙Á##!§˙˙˙˙˙˙˙˙˙˙ù˙üŝ˙û˙œ˙ĝŝû˙ú˙ÏĦÌÌÛÉĤ¤š£ù˙â Ž˙˙üßÄĤ'%"ĦÌÌû˙ŝ˙ú˙˙˙˙˙˙˙˙˙˙úöŝ˙˙§!–˙˙÷Ù ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûö˙˙˙ú˙ûŭ×+"£ûŭĝ˙Ġ" Ğö˙˙é)" +úúŝ˙÷˙Ù%‘˙˙ŭú˙˙û!˙ÄĤ!ŸÑ£Ĥ÷˙ĝ˙˙Ê"Ô˙ó Ċ˙ûú£#İĠš˙˙!˘÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙+’˙Ê˙ò #!›ï˙Ÿ ĝ˙˙ë˙û˙˙˙˙˙˙˙˙ŭü˙ŭ˙$üϕ+ ĝŭ˙˙$ Ğüú˙˙  ! ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĝ# û˙ #˙ĝú˙˜,ĥùû˙ÇŸ’Ĵ˙úŭۚ " ü˙ &žú˙˙ûŝ¤(²è˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĝž' ŸÙġ˙ü˙ÓÒ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ĝùİŞ$ž˙ŭ' Ÿ˙˙úš˙˙ 3$Îúô˙Ÿ"!û˙ùŝ˙˙˙˙˙˙˙˙˙÷˙ü˙ú“%" Ħûŭ˙œ*˙˙ïĤ)(É˙ù&!í˙ĝ  $ù⇙úĝüӝœĤ˜Òĝŝü˙"ž•§×ŝöҝ§£Ħ ¨ÏùÈݘš°ĦÊŭ˙öĦšĞ˘™Óû˙ĝ˙˙í­Ĥ•¤Ħ ˙˙˙˙˙˙˙˙˙ŝ˙˙˙ı˜“Ĵ§“İÛû˙˙ËĤ¤šİÊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úÔĤ“Îġ˙˙û÷ü˙˙˙˙˙öŭĝ¨˘¨œ§˙ûŭŭž Íó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì0¤˙÷˙˙˙˙˙˙˙˙˙˙˙üöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ξ£˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝİ– ˜£žÑÓ˙ü˙÷%ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ôŭ˙ž$ "  üüŭ˙˙˙ĝŞ, 'Î˙ñ˙ï˙#  ħ˙í˙üŝ#û˙ġ˙˙š)˙ĝÖ! Òû˙˙% ˙÷ !˙˙˙÷##˙˙( "ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñûŝ˙*ì˙˙ĝ˙" #Ğ˙˙“" # ò˙˙˙˙ó˙˙˙˙˙˙˙˙˙˙ĝìü˙Ğ&"Ÿó¨! ßüëŞ/ !“˙˙ô˙˙Ÿ È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŸÌŝ˙-&ÇÖò˜!ŸûûûÊ #<á˙˙˙˙ÊÎ! !ëĉ”,³ŭĝü˙ġד $˙ )˙˙ï˙òËÉġ˙üŝĝùĠ* Ûì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öÔ–'Ô˙˙ĝ˙˙üı¤&ıî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éŝ $˙˙ûĥ.˙˙é˙ÚÈÒÓÂÛŝ÷ÜéÖÑÀ˙˙˙˙ĜÊ×ËÎŝ½˙˙˙ù˙ù˙˙˙˙˙˙˙˙ŭ˙÷ŭ˙çÂÒ§ÊŬÉ˙˙˙ô˙ĜĈâç˙˙˙üÏÓŬìÛ˙˙˙ÏôÚÉÒö˙÷ü˙ÓÏÇÙô˙˙˙ŭ˙ŭû˙˙ŝ˙ï˙˙ïêù˙˙ü˙˙˙üÉÑ˙ŝûò˙˙ûŬçĉïü˙ŭ˙˙ü˙ÍÒĝĝ˙˙˙ŭ˙ÔÍÏ˙˙˙˙ŝ˙ŝŭ˙˙üóûÙÔÇŭü˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙Ŭöôâèû˙üù˙˙äû÷Ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷û˙˙˙ĝ˙öò÷üüûŭù˙˙˙ôúĝ˙˙˙˙ôü˙÷ßèŬĈ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙éÔÍû˙˙˙˙˙˙˙˙˙˙˙ŭ÷òöŝŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ċóëíŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙íŜ˙êÉŭú˙ŝò˙íÓÓ÷ÚÌ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙ú˙ëŞÔ˙àÏ˙ŝ˙˙úĝ˙˙ŭñáµ' ˙˙ùŝ˙˙˙úŒ(˜,˘ÌŬ˙é˙ӝ0 İĞ˙˙ûŝò™/!²÷üŭ˙! •˙ò˙êÍÙ÷üĝŝ˙ŭÒÜÌßì˙ûĦ #À÷˙ĝŭŸ("Ħ˙ùŝŭÊ%#  Ĥù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üó˙˙ïĵ .(˜˙˙î˙ġó!˙â˙˙í˙ ˙˙îùì˙˙˙˙˙˙˙˙˙˙öŭ˙˙˙úÇ"§úÖû2â˙˙ġ' )!Ïùí˙úü˙ĥ(ó˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÓĦŞž—˙˙ŝµ¤İ—˙˙˙˙ϙ½Û˙ĝ˙˙¨Ĥ–›À˙ŭ˙üŭ˙ûĞšµ˙˙ϟ–˙˙ö˙˙ŭ˙Öħ›™Ìö͜ĤÉ˙˙ôùûïü˙˙˙˙ù˙˙˙ûùŭ˙ŭ˙ù˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ñŝ÷˙üŭ˙ûè˙ûó˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝùû÷˙ŭ˙ö˙˙î˙ñ˙˙ŭġûôġ˙˙üú˙ö˙˙˙ġû˙˙ĝ˙˙˙û˙öŝĝòú˙ĝġ˙˙üó˙ûŝ˙ú˙˙˙˙˙˙˙˙˙˙ûú˙÷÷˙ö˙üó˙ĝüŭ˙ú˙ôé˙˙úú˙û˙ŝ˙ŭ˙ö÷˙˙˙íû˙òù˙˙ĝì˙˙˙˙ëŭî˙úċìĝŝñ˙ßù˙üùúüŭ˙˙÷˙û˙˙ü˙ùŝŭĝ˙úüú˙ĝ˙ë˙ù˙û˙üú˙ù˙ŝ˙ï˙ü˙òëÙ˙úû˙˙ûŝ˙ëü˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙ŭúûŝ˙ßö˙ŭ˙˙˙ŝĝ˙˙üŭ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝòóĝüûĝ˙ú÷úŝŝŝ˙÷˙öó˙ûâĝ˙úú˙˙˙˙˙ú˙˙ù˙˙ĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ì˙˙í˙˙˙˙˙˙˙˙˙ŝúĝû˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙ŭû˙÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝü˙úô˙î˙˙˙ŝ˙˙÷˙˙î˙˙ï˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙ù˙˙úñ˙ô˙˙ê˙÷˙˙˙ŭ˙˙˙˙ġ˙ŭ˙˙˙é˙˙˙ûöġ˙ġ˙˙ûġ˙˙ŭ˙ù˙îġ˙ŝ˙˙ġŝö˙˙˙˙éĵž$Â˙˙ŝĝŝ¨˘ ÛÒû˙˙÷˙öô˙û˙ŝ˙ñĝüûê˙˙è˙˙ɒħ˙˙˙˙˙˙˙ë靲Ë˙öö˙˙˙Ž' -ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙êŭüó˙ö÷˙˙˙ûùŝŭ˙˙ôö˙ĝ˙ŭû˙˙÷˙ó˙˙ëŝ˙ŭ˙ñ˙˙˙˙˙˙˙˙˙ü˙ġ˙ŭ÷˙û˙ë˙ó˙Ìŝ˙ŝ˙ġ˙ŝġ˙ó˙ĝĉ˙ġö˙˙˙˙ï÷˙ôÈû˙ì˙˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Î˙ó˙ĝ˙ñ˙ó˙˙ï˙˙ú÷˙ŭ˙˙˙˙ùĉ˙˙ġ˙˙ú˙˙˙˙ë˙˙ó˙ŭŭ˙˙ûüò˙ù˙÷˙˙÷ŝ˙˙ï˙ġ˙ŝ˙˙ĝŭ÷˙˙˙˙˙÷˙ŝŭŭ˙˙˙˙ŝó˙ïï˙û˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭùùŭ˙üġ˙˙˙û˙˙óü˙˙˙ó˙˙ïù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝûŝ˙ü˙÷ê˙ùô˙è˙˙˙˙ĝñŭ˙˙úŝû÷úŝ˙˙˙˙üü˙˙˙˙ŝ˙˙˙û˙˙ôö˙ö˙˙ŭ˙û˙˙˙˙˙˙˙˙ĝü˙˙üüŭù˙˙ò˙˙ŭû˙û˙˙ŭ˙˙÷˙˙˙˙üŭĝŭ˙ŭ˙˙˙î˙˙˙˙ù˙˙˙˙û˙˙ĝ÷˙˙˙˙˙û˙˙˙˙˙ò˙ü˙˙˙ŭŝŝü˙˙ü˙˙ò˙˙˙ŭù˙˙ŭú˙ü˙û˙˙ŝü˙˙ĝèŝ˙÷˙˙ü˙˙˙ñ˙˙ġġü˙˙˙ŝŭü˙˙ŭĝ˙˙˙˙˙˙˙˙˙˙˙˙öü˙˙˙üüŭñŭ˙˙˙˙úŭ˙ôó˙˙ġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüüŝ˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ŭ÷˙˙ïŝü˙˙ŝûüŭüüŝû˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ĝù˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôùĝ˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙ó˙˙ŝ˙˙ëŝ˙òö˙ŝö˙˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙ŝé˙û˙˙÷˙ú˙˙˙˙ŭùö˙˙÷ü˙˙˙˙÷ġ˙˙˙÷òûñ˙ñù˙í˙ú˙˙˙ô˙ê˙˙˙ùĝö˙˙ï˙™ šù˙˙˙˙˙§"Ñ÷˙ô˙˙ñ˙˙ü˙ö˙˙˙ŝŝ˙˙˙û÷ĝ˙ú˙ößó˙˙ĝ÷ü˙ġ˙˙Ô˙˙˙ŭ˙˙ĉü(" $!öŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ÷˙ŭ˙ü˙˙˙ûü˙˙ġôĝî˙˙ñ˙öúûüù˙˙˙úö˙˙ö˙öû˙˙˙˙˙˙˙˙˙ò˙˙ö˙ûöüô˙îò˙˙˙ü˙˙˙ŭŭ˙˙ñ˙˙˙˙˙ùúĝ˙˙˙ô˙ù˙˙˙ŝŭŝâ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙üí˙˙˙ŭü˙ú˙ö˙˙˙˙í˙˙ê˙ĝ˙˙˙ŝŝòù˙˙úŝó˙˙ŝ˙˙ù˙ì˙ŭ˙˙˙÷˙˙î˙˙ûŭ˙é˙˙ö˙ù˙ġ˙˙ŝß˙ŭ˙˙˙˙˙˙úú˙ĝ˙î˙˙ö˙˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ġ˙˙öŝüíû˙˙öġñó˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙˙˙˙˙˙ïŭö˙˙˙üüĝŭ˙˙ŭ˙˙˙ŭú˙˙ŭüüñŭ˙ôù˙ùü˙˙˙˙˙ŭ˙úù˙˙˙˙˙˙˙˙˙˙ŭ˙˙û˙˙ŝòù˙˙ìù˙êöö÷˙˙ġ˙ŝĝŭŭ˙ŝ˙˙˙ŝöû˙ŝû˙úŝüŝûö˙˙ġû˙˙˙ôúù˙˙˙˙ò˙ŭú˙ŝ˙˙˙˙˙˙ĝĝùŭ˙ŝŭü˙˙˙˙ŝ˙˙˙˙ŝüù˙˙÷˙˙ü˙˙˙˙÷ŝ˙üġŝĝ˙û˙˙˙˙˙÷÷˙˙ŝ÷˙˙ŝüŭ÷˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙˙˙˙˙˙˙˙û˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷úŭŝüú÷öŝŭüüŭ˙˙ŝġô÷÷˙ŝ˙ŭ˙˙˙ŭü˙˙˙˙ŝö˙ïüùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙üù˙ùü˙˙˙˙˙˙˙˙˙ŝŭüŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝ˙˙˙úöö˙ûŭ˙˙ù˙˙î˙˙ö˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôöŝ˙˙˙˙ú˙˙ŝ˙ûŝġŝ˙˙üüŭŝ˙˙˙˙˙ĝöŝ˙ñ˙ùüû˙˙˙˙ë˙˙ô˙˙˙ó˙˙ò˙˙ß˙ùŝŝŝ˙˙˙˙ó˙˙˙ô˙˙öû˙ùíŝŭüÍ˙˙˙ŝŭ˙˙ŝû˙˙è÷û˙üĝ˙˙ó˙ŭü˙ú˙ò˙˙˙ü˙ù˙˙ŝ˙ġ˙˙ô˙ĝú˙!"$ÙÌú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüú˙˙òúöûû÷û˙˙˙˙˙˙˙úĝ˙ù˙˙˙˙ü÷ŝù˙î˙ú˙ŭŭŝ˙˙˙˙˙˙˙˙˙ö˙ŭ˙˙˙˙÷˙˙˙ê˙ù˙û˙ŭ˙˙û÷˙˙˙ûöùŭ˙˙˙êû˙˙˙ĝùî˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙ô˙ö˙üü˙ġüüù˙˙úû˙˙ï˙ĝ˙˙˙˙˙ĝŝù˙˙ŝĝ˙üù˙ŭ˙û˙üû˙ú˙úŭ˙ö˙ô˙˙ûŭĝ˙üú˙ö˙˙˙û˙˙ġŝ˙ŝŭù˙üùûŝù˙ú÷ü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŭû˙˙˙˙ŭĝö˙˙˙ŝüú˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúûŝ˙˙ô˙í˙ñġ˙ê˙˙ŭ˙˙ġò˙˙úó÷÷ŭ˙üġŭŝŝ˙˙˙˙ŭ˙˙ŝ˙˙˙ü˙˙üò˙î˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙û÷˙˙ġ˙˙ġï˙˙÷˙˙˙˙˙òû˙ĝ˙˙˙˙˙˙˙ú˙˙˙˙˙ĝ˙ñóŭ˙˙˙ô˙˙ŝ˙˙ŝ˙ġ˙˙úŭ˙÷˙ŝ˙úĝĝö÷ü˙˙˙˙ü˙üŭ˙ŝ˙ĝŭ˙öüü˙ú˙ĝ˙˙ùü˙˙˙˙ŭü˙˙˙ô˙ú˙û˙ñúù˙ŭùŝ˙˙˙˙ú˙˙˙û˙ü˙˙˙˙˙˙˙˙˙˙˙ûùúûúĝĝüùú˙˙ŝ˙ŝ˙˙ŝüŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŝ˙˙üŝŝüü˙˙ü˙û˙˙˙û˙úûöù˙˙ŭĝúŝü÷˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝ˙÷˙ñ˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷˙˙úûġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ġ÷˙û˙ûġĝ˙˙˙÷ú˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġù˙˙˙˙ö˙ŭ˙˙˙˙ŝûŝ˙˙˙˙˙îû˙˙ü˙˙ú˙÷˙˙ŝ˙˙˙ú˙˙úù˙ñ˙ĝ÷ĝ˙öû˙˙˙˙÷î˙ŝ˙˙óü˙÷˙˙÷˙˙˙˙ô˙˙ùö˙˙ŝù˙˙ġ˙ü˙òŭŭ˙ŝüûôöŭ˙˙˙óù˙˙ŭ˙ó˙ü˙˙ûŭ˙ŭŭ˙— 'ëñú˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙ù˙˙˙˙ûú˙˙öñùùüŭüġ˙ŭ˙ŭû˙û˙˙˙˙˙é˙˙ö˙˙ŭ˙˙˙˙˙˙˙˙˙ñ˙˙˙ü÷˙˙ċ˙˙ú˙˙ŝ˙ĝû˙ù˙ĝ˙˙ö˙˙ûŝ˙ù˙ò˙˙˙˙˙˙˙ŝû˙ġ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñĝ˙˙û˙ú˙ŝ˙úú˙˙ô˙˙÷˙üù˙ü˙úòó˙˙˙ŭŭŝ˙˙˙˙ŭ˙˙ŝóú÷˙û˙ûöŝ˙˙ġ˙ŝ˙÷˙ġ˙˙ûùö˙˙÷ù˙ĝ˙ü˙˙û˙ĝ˙˙˙˙ë˙˙ç˙ùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙˙ŭüĝù˙˙˙˙üôûò˙˙˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙÷˙˙˙˙˙ö˙üû˙˙üü˙˙˙ŝ˙˙üŭ˙˙û˙ġú˙÷ŭö˙˙úû˙˙û˙ŭ˙˙˙˙ŭù˙˙˙˙˙˙˙˙ùŭ˙˙˙˙˙˙ôĝ˙˙üûùùñ˙˙ú˙˙üúü˙ö˙÷˙ü˙ò˙˙öü÷˙˙˙˙íĝ˙ü˙˙ŝïŭû˙û˙˙˙˙ŭóüŭ˙˙˙˙˙˙˙ŭŭ˙˙˙˙ö÷˙ŭŭ˙˙˙ü˙ü˙üŝü˙˙ŭ˙ŝùùŝ˙˙üŝ˙˙ŭ˙˙ŝú˙˙˙ŝ÷ú˙˙ŝú˙˙˙óùŭ˙ú˙˙˙˙˙˙˙˙˙÷ùŝ˙˙˙˙˙˙˙˙ŝ˙˙ùû˙˙ŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó÷ŝ˙˙˙ŭûŭ˙˙˙ŝ˙˙ŝüò˙ŭ˙ĝ˙ŭ˙˙ùüüùŝ˙û˙ü˙ü˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙ûó˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùŭĝ˙˙ü˙˙˙ûöö˙˙ú˙ñù˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúġû˙˙ûġŭù˙ŝö˙óû˙ŭ˙˙˙ŝùù˙˙˙ġüú˙òù˙˙ŭòü˙ŝġ˙˙ï˙˙ë˙˙ù˙˙ù˙÷ŭġúúùŝ˙˙˙˙ùñ˙˙˙ì˙ü˙ĝŭñú˙öú˙˙˙˙˙÷˙˙úû÷˙˙˙öĝ˙˙ŭ˙˙üĝ˙˙ûöġ˙˙ŝ˙˙ñí˙˙ö˙ö˙˙& Ŭè˙˙îûûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝú˙ġ˙ôŝŝŝŝŭŝ˙˙ú˙üô˙÷ó˙˙ú˙ŝŭŝù˙ĝ˙ù˙˙ĝ˙˙˙˙˙˙˙˙˙˙÷˙˙ôŝ˙ŭ˙ù˙û˙˙ù˙ŝ˙ù˙üö˙˙˙û˙ŝŭü˙û˙ò˙˙óŭ˙í˙û˙ú˙˙û˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙÷˙˙˙˙˙ò˙˙ĝ÷˙˙˙˙üŝ˙˙üŝ˙ôŭ˙ġû˙ü˙˙ûùûŝ˙˙ġ˙û˙ŭ˙˙˙˙˙˙˙ùô˙ú˙ö˙˙˙ŭó˙˙˙ú˙˙˙˙˙ù˙úü˙úŭ˙ü˙˙˙ġ˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙ŭù˙ú˙ü˙üĝ˙˙˙˙˙˙ñŝù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭü˙ò˙úġ˙˙ġ˙˙ŭ˙ú˙˙ŝ˙üŭ˙˙ûŝ˙ü˙˙ú˙ò˙üüŭŝ˙˙˙˙˙˙˙ü˙úŭû˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝüû˙˙ú˙˙ü˙˙ŝ˙ŭ˙ŝĝüú˙˙˙÷˙˙˙ĝ˙˙˙í˙˙÷ûŭġ˙˙˙˙˙ĝ˙ŭ˙˙öġ˙˙úö˙ü˙ŝ˙úûúùŭ˙˙ŭŝ˙ù˙ú˙˙ŝ˙ŭ˙÷˙ĝ˙ĝ˙üù˙ŝñŭ˙ü˙˙ùúŝ˙˙÷ü˙ú˙ŝ˙ġŭ˙˙˙˙ŝüŝ˙˙˙ŭŭ˙˙ùġ˙˙˙˙˙˙˙˙˙˙˙˙˙üúûŭĝ˙üĝ˙˙˙˙ĝ˙˙ŭ˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ü˙˙ŝŭ˙˙ü˙ŝ˙ĝ˙û˙˙ú˙˙˙˙˙˙ùû˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ì˙˙ĝù˙˙˙˙˙˙˙˙˙ŝŭ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙û˙˙üŭ˙ôü˙ü˙˙ġ˙û˙˙üŝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ö÷˙ú˙ŝ˙˙û˙ú˙ŝŝ˙ŝû˙˙˙ù˙ŭ˙ö˙˙˙ò˙÷˙˙÷˙û˙ŝ˙úġ˙ùü˙ŭŝ˙ë˙ú˙˙˙˙ù˙˙ó˙÷˙ûŝù˙ñ˙˙ŝ˙˙˙ùû˙úù˙˙üü˙ŭû˙˙˙ôù˙˙˙˙ñ˙ûúŝ˙ü˙˙ĝ˙ĝù˙˙ĝŝ˙ŭô˙ù˙ŝŭĜú˙ò˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ö˙˙˙˙ŭú˙ġ˙˙ĝü˙˙ŭ˙˙˙ûŭ˙˙˙˙ŭŭ˙˙÷ŝŭ˙ĝ˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ŝ˙û˙ùüö˙ô˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙üĝ˙˙úû˙˙˙ġ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü˙ŝ˙û˙˙é˙˙ô˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙úüü˙ŝ˙üù˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ĝĝ˙˙ġ˙ù˙˙ù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ù˙˙ôü˙ŭŭ˙÷˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙ŭ˙ù˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙˙û÷˙ùü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ù˙ĝ˙û˙˙û˙úŭ˙ŝġ˙ŝò˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ĝûûúû˙˙ù˙ü˙ŭ˙˙ûú˙˙˙ŭûĝü˙˙ĝĝŝ˙ŭûü˙ùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙úû˙˙ò˙˙˙ġġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙û˙˙ŭ˙˙˙ŭñ˙ĝò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙ĝ˙˙ÌôŜúĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ˙˙üŝûú˙˙÷˙˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üúû˙úû˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙˙˙ŝĈ˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ïê˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ú˙÷˙˙˙ôû˙ŝĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙í˙˙˙˙óúû˙˙˙ï˙˙ĝŝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙˙˙˙ĝ˙÷ŝ˙˙ú˙˙˙ü˙˙˙÷˙˙ü˙˙ûû˙ĝ˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝŭ˙ĝì˙˙˙ĝö÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ñö˙úí˙ú˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ë˙˙˙ï˙˙ùñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüĝñ˙˙ŝŭíŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙üË˙ùċ˙˙˙˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ü˙ç˙˙ûĤ Çï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙ü˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ôü˙Ö˙ŝíô˙ŝí˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ÷˙ú˙˙ŝŭûùŝû˙˙˙ó˙ì˙˙ŭüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ûŝ˙˙ú˙ñ˙ŝüŝúĝû˙˙˙ŝ˙˙ŭ˙˙˙ù˙˙ûüñ˙˙ë˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îġ˙ê˙˙ŝ˙ĝùúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ù˙ü˙˙ù˙˙é˙˙ġ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ìû˙˙˙˙È·¨•ŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝ˙˙˙˙ç˙ġ˙˙îĝĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ô˙À˙˙˙ú˙ŝô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙÷˙˙˙ŝġ¤§˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëĝ˙ùŭ˙Ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüù˙˙œĞÍ˙˙öĝ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ġ˙ü˙˙˙ùġòú˙˙˙˙ġ˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝ˙˙˙˙ŝú˙ŝû˙ù˙˙˙˙üûŝ˙ŭ˙˙ú˙˙˙˙ŭ÷ĝ˙˙˙àüö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙óΝ׽˙ŝ˙˙ôï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġù˙ŝë ˜˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙î˙˙˙ΕԧÒĠ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ó˙ŝ˙ò0' "˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È*,™˙˙ô˙ġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ô÷Ħœ* ž˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ÇÎϓ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŬ§úúû˙ôġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ô˙˙ûûĜÓûúü˙˙˙ÒĜ˙Ŭ˙ŭŝ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ô˙ŭüù˙ë˙˙ŝ˙ŝ˙üüüŭ˙˙˙˙ŭ˙ġü˙˙ü˙˙˙öúò˙ô˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úóó˙˙˙˘$í˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ġ˙ôı(&Ç˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ú˙˙ê˙%## §˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ò˙÷ġÖ ˘üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñğ)ç˙ĝ˙ú˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùó˙˙˙˙½ ",ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$!¤˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùÇ &&'û˙ġüĝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙öĦ!ŸŬöĝ˙÷’! –/×˙ù˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—¤ž¤ Ĵ×˙˙ŭ˙Ħœ Ö˙˙˙˙˙ù˙ĝŝ˙ĝ˙üŸž›ŞĤäŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙ +ıî˙ŭŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝñ˙Ú!$ġ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙˙&$¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúù˙˙ŝû²Ò˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú÷œ)%•˙˙úúô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ÷î˙˙Óĵö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙(%$˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙! Â˙ġ÷˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙&( ˙˙˙ê-'Ïġú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝÚ!×ô˙ŝŝ•û˙ôû˙˙úû˙ŭġ˙Ä%' ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙ŝ!£ú˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú'Ÿ# $  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙š˙ËÒÊú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷û˙ŭû—ù˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙É˙˙ü˙˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ŝùúÏ Ò˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙”)ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙œĜò˙˙ŝóŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ʜ/"ž˙üû˙¤˙Ûĝù˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úò˙˙ŭ˙˙˙ò˙ŝ÷˙ŭ˙˙óü˙ûĝúŝ˙˙ü÷ú˙˙ŭ˙˙üúŝû˙ô˙£Ĉ˙ĝ÷˙Ÿ˙ĝ˙ù˙˙üŭ˙˙˙ĝŞ&§ïŝ˙˙˙˙˙˙˙ŭüŭŭ˙ŝö˙ùüġ˙˙ôö˙˙ġ˙˙˙üûŝ˙˙˙ò˙ĝŭ˙ġ˙˙üó˙ùŭ˙˙˙û˙ü˙ĝ˙˙ĝ˙öüü˙˙˙˙ù˙ĝŝ˙˙ù˙îŭ˙ŭù˙˙ùüŭùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ô˙üŭ˙˙ûĝ˙˙ŭú˙˙ú˙˙˙ü˙˙˙˙˙˙˙˙ô˙˙ñ˙üġ˙˙úü˙˙ù#(ġŭ˙˙úŭŭ˙ŝ˙˙˙ŭúŭ˙ö˙ö˙˙ü÷˙˙˙ŝ˙˙ü˙ú˙˙ûû˙˙ŝ˙Í Ğü˙—Ş˙ĝ˙ú˙ŝ˙öġ˙ù˙ŝù˙˙ĝü˙ŝ˙ü˙ü˙˙ö˙˙ü˙è˙ü˙˙ŭù˙ŭí˙ŝ÷üŭ˙ġù˙û˙˙˙˙ú˙ŭĝ˙û˙˙˙˙˙˙˙˙˙˙ŭ˙˙ú˙ü˙˙˙û˙˙ûŝĝ˙˙˙˙ÑŞû˙˙ô˙í˙˙˙˙˙˙˙˙ò˙˙ôü˙ç˙˙ŝ˙˙ĝ˙˙ò˙˙˙˙˙˙˙˙˙˙˙üü˙˙üÏ˙ĝö˙˙˙ö˙˙˙˙˙˙ü˙÷ŭ˙˙˙÷ú˙ë˙˙ó˙ù˙ŭ˙÷û˙˙ûú˙öġ˙˙üŭ÷˙˙˙ù˙˙˙ö˙˙ġ˙˙˙ó˙ŝ˙ü˙˙˙ġ÷˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙í˙ûŝ˙úŝ˙˙ò˙ŭŭ˙ġ˙˙˙û˙˙˙˙ó˙˙ŭ­ Ëí˙ú˙ù˙ô˙ŭŭ˙˙ò˙üŭ˙ùûü˙ù˙˙ûĝ˙˙÷ô˙˙ò˙ù˙˙ö˙˙÷˙ûô˙˙˙÷˙˙˙üñß›Ì˙ù˙ù˙ù˙˙ŝŝĝŭ˙ù˙ï˙ñ˙û˙üŝ˙˙˙˙˙˙˙˙˙˙ï˙˙û˙˙û˙˙ö°ò˙ûû˙˙˙ÛÊŝŭ˙ûŝ˙ù˙öü˙˙˙ŭŭ˙˙ô˙˙˙˙û˙ŝġ˙ĝ˙˙˙˙˙˙˙˙˙˙ó˙öú˙ö˙˙˙ġ˙˙ġ˙˙÷ù˙˙ò˙˙ñ˙ü˙ö˙˙ï˙ü˙˙÷˙ŭ˙úü˙˙ù˙˙˙ó˙ö˙˙ôŭ˙öùĝ˙ŝüüú˙ù˙˙˙ûŭ˙ŝ˙˙ü˙˙üñ˙÷ŭ˙˙ŭ˙˙û˙˙˙ö˙˙ü˙˙úô˙ĝÓŝ˙ù˙˙Ġ˙ĝ˙˙ó˙˙˙˙ö˙˙˙˙ŭŝĝ˙˙ĝ˙ü˙˙˙û˙÷˙ĝŝú˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûúŝ˙˙˙ûúó÷˙˙ŭ˙ŝĝ˙˙÷˙˙ô˙˙˙˙˙úŭ˙˙ùö˙˙üŭ˙˙˙˙üĈ˙!˙ûĝ˙ùıŝĝ˙÷˙ŭ˙˙úĝ˙˙ŭñŸĤ˙˙ïüüüúöġŭ˙˙˙íû˙˙ŭ˙˙ûô˙˙˙ĝ˙˙ùġ˙˙˙ŝ˙ŝüö˙˙ï˙çó˙˙˙ŭ˙÷ö˙ùŝŝ˙˙˙ŭ˙òû˙˙ùü˙˙òŝ˙÷˙ĝ˙ë˙˙˙ġûŝŝ˙˙˙ŭŭ˙÷˙˙˙˙˙˙˙˙˙û˙˙˙ûŝùöü˙˙üû˙˙ûî˙˙ù˙˙˙˙˙˙˙˙˙˙˙÷í˙˙˙˙ġŝ˙ĝúġ˙İ˙˙ü˙ó˙÷˙÷˙ġú˙˙˙û˙ô˙ŝù˙˙ġö˙ĝù˙˙˙ŭ˙ŭü˙˙óúÉĤ )Ĉ˙ô˙˙ü˙öü˙˙ù˙˙î˙ñ˙˙˙ŭ˙˙˙òñüóì˙ú˙˙÷ùñ˙˙˙ó˙ú˙ŭé˙òô˙˙ù˙˙˙˙ùùûĝ˙öĉ˙ö˙ú˙˙˙˙˙˙˙˙ù˙˙÷ù˙úŭöĝ˙˙ñ˙˙˙û˙óĝ˙ì§ŭñĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙÷ŝí˙˙÷˙ŝô˙û˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙Ù÷˙˙ŝü˙˙ùêû˙ô˙˙î˙˙íûġ˙˙ŝ˙ùüŝ˙İË˙˙ŝ˙û˙˙Ó­ċû˙˙ŝ˙ùž˙˙ŭíü˙ô˙˙ċ˙í˙˙ö˙˙˙öŝ˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙˙í˙ŭġ˙˙öú˙ôüó˙ü˙˙íñŭŝó˙˙ö˙ŝú™&Ö˙˙˙ĝ˙î˙˙˙ôú÷úúŝ˙ö˙˙û˙˙íü˙ĝ˙ġ˙ŭñúù˙˙˙ô˙ëü˙ù˙˙˙ñ˙˙ô˙ôŝ˙˙ìÚ˙˙÷˙˙ü˙÷˙ôú˙˙˙ġÁ˙˙˙ŝ˙ó˙˙˙ĝ˙˙˙˙˙˙˙˙ü˙˙ùû˙˙˙ò˙£˙ì˙˙˙îú( ×˙˙íŭŝü˙ù˙˙öúŝ˙˙˙ô˙òò˙ô˙üö˙˙˙ûŭŭ˙˙˙˙˙˙˙˙˙á˙˙˙ĝ˙ŝ˙˙úè˙˙ë˙ŝ˙ç˙˙ô˙ù˙÷˙üù˙ù˙˙˙÷˙úó˙˙ó˙˙üñ˙˙ú˙òú˙˙ó˙˙˙ĝù˙˙˙ï˙ŭú˙ó˙˙ê˙üü˙ï˙ü˙ú˙˙ï˙˙˙˙ùñ˙˙ó˙˙˙í˙˙ï˙/ ˙û˙˙î˙˙Í˙úú˙üġ˙˙˙û˙˙˙ó˙ó˙ú˙˙ó˙û˙ŝ˙òù˙˙ûŝ˙˙í˙ù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ö˙ŭ˙˙˙˙ŝŭ˙˙˙û˙˙˙ö˙÷üòó˙˙˙ü˙˙˙úû˙úö˙ù˙ü˙+Ĵ˙˙ŝöùŞ"˙˙˙û˙˙˙˙˙ŭ˙˙˙˙˙óŭŝ˙˙ĝ÷˙˙˙˙üĝŝ˙úŝŭú˙ìŝŝúĝüŝ˙ĝ˙˙˙ĝĝüŝ˙ó˙ŭòôŭ˙ŝ˙íġ˙ïŭ˙˙ŝŭŝöŝ˙ŝò˙˙úé˙˙˙ï˙ŭ˙˙ó˙˙˙ñ˙üô˙˙˙ŝúóñú˙˙ŭ˙˙˙˙˙˙˙˙ú˙˙ïû˙û˙˙˙úù˙˙˙ĝŝ˙˙öü˙ġġ˙˙˙˙˙˙˙˙˙˙˙û˙Íü˙÷˙˙ŭ˙˙›*˙é˙òŭû˙˙ù˙˙ŭ˙÷ŭ˙˙ŝü˙ó˙û˙˙ŭ˙˙ü˙˙ûŝ˙˙˙˙ŭ˙˙Ĥŭ˙çö˙ŭú˙ĝüû˙ĝò˙ó˙ĝñ˙óí˙˙˙˙ŝ˙ŝ˙˙˙˙ûù˙˙ú˙üŭ˙÷ĝ˙ïñö˙ä˙ó˙˙ùŝ˙˙˙ñ˙î˙˙˙˙˙˙˙˙˙˙î˙˙é˙˙û˙ùüġ˙˙ġ˙˙ùŭŝê¸ù˙˙˙÷ûô˙˙˙˙˙˙˙˙üññ˙˙˙˙ñ˙ĝú˙˙ûŝ˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüúİ &ùùĝôù˙èŭ˙÷û˙ò˙˙˙îĝ˙˙ó˙÷˙˙ùġû ,ž˙ò˙üüó˙ ħÔú˙˙üûùİ!˙â˙˙˙÷˙Òô˙˙˙˙üó˙ŝŝúú˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ë˙˙ĝú˙ü˙˙ñ˙˙˙˙ŭġ˙˙˙˙˙˙˙ô˙˙öú˙œ"Òêŝ˙˙ü˙˙ù˙˙û˙˙ŭ˙ï˙˙÷˙áÑŝóóúüĝ˙˙ù˙˙íùî˙ûŝŝü˙òŝú˙˙ö˙˙ŭ˙ì÷˙˙½˙úöú˙ûù˙÷˙úûĝÓ˙ë˙ĝú˙˙ŭ÷˙ŭ˙˙˙˙˙˙˙˙˙˙ûô˙˙ùû˙Ž˘û˙÷ŝ˙˙ù"Éġé˙˙÷˙˙˙ŭŭù˙û˙˙úŝñ˙˙ó˙ĝ˙˙˙ö˙ŭŭ˙˙˙˙˙˙˙˙˙˙ùŝù˙˙ù˙ô˙ŝ˙˙˙˙˙ö˙˙÷˙ŭ˙˙ŭûô˙ß˙ġŭüŝ˙ġ˙˙ú˙ġó˙˙˙ûüô˙˙ô˙ïŝĝô˙˙ñ÷˙˙ü˙ö÷˙ò˙˙úŭ˙ñ˙˙ġŝü˙ó˙˙ĝñŝ˙˙ê˙˙úò˙˙˙ĉ˙˙ ˙˙ë˙˙íò˙˙˙˙ô˙˙ó˙ê˙˙ĝ˙˙˙ŭó˙ûŝ˙û˙˙öú˙˙˙ŭĝ˙ŭ÷ä˙˙˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ˙ü˙÷öúû˙ü˙ñ˙ñ˙ï˙ġŝ˙˙˙˙˙˙˙úòù˙˙˙ŭü˙ŝù˙ò˙˙ŭ' ĝü˙˙˙Ĥ&˙ŭ˙˙ŝ˙ŝú˙˙˙˙ŭùö÷ž$˙˙ûí˙ŭ˙˙ùĝü˙ö˙˙ŭ÷˙û˙˙÷˙˙˙ġü˙ŝùù˙˙˙˙˙˙ŝû˙ö˙ö˙˙˙ĝ˙˙˙˙ġú˙˙˙˙˙ü˙ŭ˙í˙ġûŭ˙˙ġĝ÷˙˙û÷˙û˙ŝüùñù˙˙˙˙ú÷˙˙˙˙˙˙˙˙˙í˙ĝ˙˙ġ˙˙èġ˙˙˙ùû˙ĝ˙ùö˙˙ĝ˙˙˙˙˙˙˙˙˙í˙ŭ˙ö+ŭ˙˙ü˙úü™˙˙˙ú˙˙˙êŭ˙˙˙ûġ˙˙î˙˙ŝ˙ù˙˙˙˙˙ŝü˙÷ŝ˙˙ù˙˙Óñ# !Ĥú˙˙˙˙˙÷˙ñ˙˙˙ġŭ˙˙üúŭŭ˙î˙˙ç˙üù÷÷˙˙ú˙û˙ë˙ôŝ˙˙˙˙ĝ˙ò˙˙˙ŝ˙Ó˙ġ˙˙ŭúĝŭ˙ù˙˙˙˙˙˙˙˙˙˙ĝ˙û÷˙˙û˙úè˙˙ĝ˙˙˙í˙˙ûŸĤ˙úö˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ë˙û˙˙ù˙˙ġ˙˙ô˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭüžö˙˙˙˙ö˙˙í˙÷ô÷˙˙ŭ˙á¸˙˙÷˙ñî˙Î"˙˙˙˙ú˙-˘À˙˙û˙˙˙›8Ħ˙˙ŝê˙˙˙ġ÷˙òĤŸ˙ïġü˙ŭŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝò˙˙™˙˙ö˙Ÿü˙÷ŭŝï˙˙ĝŝ˙ç˙˙ġ)×˙òÓÓ˙é˙úñ˙îŝ˙óÔħŠĦ˙˙ù˙û˙˙ù˙ŭŝ˙˙˙ó˙ê˙÷˙˙•Ğï˙à˙ù˙˙ĝŭ˙ŝ˙˙üú˙ŝġ˙î˙úÍĴ˜˘Ğ˙ûü˙˙óŝ˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙˙,  ˙˙ġŝù˙ #š˙˙ú˙ú˙ĝûĝŭ˙ü˙ùùÍ˙˙˙òġ˙˙˙˙˙˙úö˙˙ŭ˙˙˙˙˙˙˙˙úġ˙˙ê˙˙˙ġñ˙öúú˙ü˙öí˙ŝù˙òûġ˙˙ü˙û˙ûö˙÷ú˙ċ˙÷÷˙˙ó˙˙ô˙˙ĝ˙˙˙ŭÑŭü˙˙˙òö˙÷˙ŭ˙Éúö˙ï˙ĝ˙˙òú˙˙ó˙ê˙˙˙˙˙ô˙ŭ˙˙ü÷ù˙˙÷Ĥ"ôú˙˙ŭ˙˙˙˙˙ù˙ĝ˙˙˙ŭ÷˙ĝë˙˙ô˙ö˙ŝó˙Ĝ˙˙üê˙˙ú˙˙˙ŭô˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŭòŭ˙˙ú˙ü˙ĝù˙ùù˙˙˙˙˙˙˙˙˙˙üü˙˙ġĝ˙˙ùŝ˙˙ĝ˙˙ì˙Ü" ˙úüŭ˙“#˙ĝ˙˙û˙÷˙˙üüŭŝ˙˙˙&ï˙˙˙˙ùĝûû˙˙˙û˙óüôĝ˙ëòüú˙ó˙˙ŝ˙ŭù˙˙ôô˙˙ò˙úŝú˙˙û÷˙öé˙˙˙˙ûòû˙ŝ˙ö˙ġù˙˙ôùûî˙˙ŭ˙˙ĝ˙ŭ˙÷ŭ˙˙˙˙ŭô˙˙û˙˙˙˙˙˙˙˙˙˙ü˙˙ú˙˙÷˙˙ü˙˙öĝ˙˙˙˙˙ìô˙÷˙˙˙˙˙˙˙˙˙ú˙˙Ùûüó˙ŭ˙˙ ˙ġĠŸË˙˙˙ó˙ŭù˙˙Çí›Ùŭ˙òĝ˙üú˙ü˙ü˙˙˙ŭĝëú ĦË˙ûòñû˙˙ûÎ͕ ™Ñü˙üö˙˙ĝÍÌ˘$ß˙ôö˙ŭ˙ÏĉÈ˙˙ÉĊ żü˙ŝ˙ê˙ġ˙ËÇı Û˙ĝ˙ĝ˙˙˙˙˙˙˙˙ú˙˙˙˙ĝì –û˙ü˙ŭ÷ڜÊ˙˙˙öê˙ï˙˙˙˙˙˙˙˙ŝ˙ÏÛÑ­ğü˙ôú˙ú˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙Ĉ×˙ì˜ÌÎ˙îŭ˙˙˙Ĉ“"& )œËû˙˙Ä % Ä˙ŝœ#Ÿ˙˙ûöûµ÷˙ú˙˙óÍè˘˙ž£Ó˙ú˙˙ġ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġ˙ü˙Ó) ˙´ Ĵüŝ¤ ġ˙˙ì° $œù˙˙˙ġ˙˙ûî+"' ŝ˙˙˙ŭ˙›˙˙"Ĥ˙˙ŭ˙û• %Ïŭĝ˙˙ö˙ġô˙ù˙ï˙˙ÏÔ͝ÛàÇ×Ğ›˙˙óü˙˙˙ŭ˙˙˙˙˙˙˙˙ûú˙˙ġü˙Ċ'žÚ˙ŝĝ˙Ÿ!ËÇٙÏĜ¸ä˙úü˙ŭ÷˙ùÑÀÑÑÓÀĵ÷˙ŭ˙˙ŝü˙˙˙˙˙˙˙˙ŭ˙ÂÄ.Á˙öñ˙üòâ$×ĠÓü÷˙˙ĝ˙²›˙úôÚ& 1žĈ˙è˙ûʚ%”˙Ìö˙˙óîĜ˙ñ˙ÌÉÈÔ˙ü˙˙˙î˙ÊÒ÷óġ˙ǧÛéú˙ñ˙ŭġ˙ĝà˙˙ġ˙÷™˙˙úŭ˙Ŝù˙˙˙ùúĝ˙ĠÏ˙˙ŝ˙ÑÔŭö˙ŝ˙˙˙óëÖÒĈĴ¸˙˙™ĤÒ˙ġ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôî˙ŝ˙ü˙˙˙ë˙ú˙ôöúò˙ó˙ŭù˙˙˙˙˙˙öö˙ŭöûŝ˙˙˙úİ˙˙ûòü˙ ˙û˙˙ü˙ù˙ŝûŝ˙˙˙˙ñµû˙ġŭ˙˙˙û˙˙öïüġ˙˙˙˙à˙˙ç˙íüŭûù˙˙˙˙˙˙÷˙Ï˙˙ĉü˙ïû˙ú˙Úçùŭë˙˙ê˙˙ÙÔ˙˙˙íô˙˙˙ö÷˙ĝÊ˙Û˙˙û½˙Š˘ü˙˙ú˙˙ùŝ˙˙˙˙˙˙˙˙öŝÌ˙Ÿ°ñ˙˙÷ü˙˙ĝ˙˙›­Ġ˙˙˙˙˙˙˙˙˙˙ò˙É*œ˙˙˙˙ùô˙##”˙˙™ż˙˙˙ŭ÷û˙‘'!£˙˙ö˙˙ó˙ü˙˙÷û˙ñı ¨Ûü˙˙˙˙ ž#¨÷˙˙˙˙ôž 1 # ,Á˙˙úÌ›Ò&Éŭŝ˙ó˙ĝ˜Ÿ!!¤Ú˙û˙˙˙˙˙˙˙˙ö˙ŭí˙˜: +  ŝ˙˙ùÎ/ ,ˆ'˙˙˙˙˙˙˙˙˙˙˙˙˙÷!1™ö˙˙üŝ˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùúĜ$Ĥ÷Ö" ˙˙ĝ˙ï˙ )' ġ˙óĜ#*˙˙ .ĝ˙˙ñœ *˙ù˙ñ˙ö˘˙' ü÷ö˙ŭö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ùĦ$ĵûż ü˙ Ô˙ç0˙Ĝ+°úô˙˙ŭĜ &’ !Ùúż# 'Ÿ Ò˙ñİ&#ĞÄ˙ĝĤŸŞ Ĵú˙ú˙š ) #”˙˙ŝû˙˙ú˙˙˙˙˙˙˙˙˙ŭŭ˙÷˙Ï$"'ŝ˙˙ú !Ħ #÷˙˙˙˙üçĤ%!3—˙˙˙üû˙˙˙˙˙˙˙˙˙˙Ĉ(  ›˙˙ùĝ  šÀ˙˙ŭ§ $ž Ġ˙˙ŝž#$ħ™˙˙˙˙ĈŞ$(˙ŝ˙ŝ˙ş ˙˙˙ިŝŝ˙ŭ˙ü˙˙ÏĝŭǕ3Öġú˙˙ŻĴ Êôŝ˙öŠ˘Óùŭĝ·˙.‘-Ç˙˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙ë˙ü˙˙˙è˙÷ò˙˙˙ï˙ŝ˙˙˙ï˙üŝ˙˙úöùŝÏ  ¸·Ñ˙˙úŭŝ˙Ò%ŝŭ˙˙ñ˙"ù˙˙˙ŭ˙˙˙ŭ˙˙˙ŝùù˙•"˙ŭŭÑËüŝîŭ˙ü˙˙òħ ˙˙Ĉ'“¨×ġ˙ü˙üôúúÔ£˜ĥĝñ˙˙úŞ Ž­­òÄ! "™ŭŻ#›*ŭñΤ˘É˘+žŝ˙ŭġĝ˙˙˙˙˙˙˙˙˙˙ÒŞ), "‹ê˙û˙˙ûĦ0'Ò˙˙˙˙˙˙˙˙˙ùú0$ĝ˙ù %-öù˙˙˙Ò œ˙ùŝ1$½˙ô˙˙ö˙˙˙˙ĝŭ˙öÈ 5!›óùŝŝï˙Ù £ŭ˙˙ħúÑ˙ûÒ ³˙ 2%˙ôÔ,§ ˙ŝ˙˙Á˘*÷° %˜ŭ˙˙˙˙˙˙˙˙˙˙íü£œ(!”š"Ŭĝ˙˙Í#-˙˙÷˙˙˙˙˙˙˙˙˙ñ²!&˜ö˙˙˙û˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñעĝ˙™$ŝ˙&ÀÙ”˙˙ûÄ(• â˙È#-!–ŭû˙ĝĦ" ˙ñ˙˙Ì1$Ó˙ü˙Ħ$–òö˙˙ġ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙û˙Á$˙ù˙Ï1 ·óĠò‘+İŝġú˙# ¨ûŭ˙Ħ š˙˙˙úúġ$ó÷˙ ×ü˙˜' *˙˙Ê˙îŝ–2˙üü˙˙Ò%.-˜š#! ä˙˙ûŝŭ˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙Ĉ &(¤˙˙ñ˙#ĤúÊ˙Ğ# ì˙î˙˙˘ —2ĝŭ˙˙ù˙˙˙˙˙˙˙˙˙Ż  ž,#ËŝĝŝÌ %ÓÉú´ )˙àñ/., ùú˙˙% $& Ğ˙ĝ˙Â0 (Óùġç'$ё# ùû÷˙ü˙ġÖ·"Â˙ŝŭ› §˙˙Ċ#"$&Àü˙˙˙š Ĥ—!& !ŝŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Á%$ûò˙ԙ˜ŝ˙É!™ž˙ŝü˙§&Ĥ˙ġ˙ùŝ˙˜œŭ˙ú˙˙üĴ ï˙ŝŭù˙˙˙ŝŝ˙ŝû˙˙ŝ’˙˙% $¤úŭŭ˙Ĥ Ô˙$ ¨˙ó˙ú˙˙¤* 'ŭùô˙# - ŻĈ ú" Ñ˙¨!İ˙üü˙˙ù˙˙˙˙˙˙˙˙˙Ž 4ï˙ûġ˙$˙˙˙˙˙˙˙˙˙ŭÏ! " ŝĠĝŻ$İÏ£ ˙˙ö˙ŭ$˙üĝ˙ĜĤ˙îĝ˙˙÷ú˙˙ü˙˙žħ˙˙ú˙ù™ü˙ŝ˙×ù˙˙˙ ! ÈüĴ˙ΤËá—Ñ!úġù% !ĠÂĜĈ­%™˙ŝ˙˙˙˙˙˙˙˙ü˙˙(˘ù˙ĝ˙ËÒ˙˙ò˙£û˙˙˙ó˙ĝ˙˙˙˙˙˙˙˙×˙ŝû£"-ž˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙ÎĠŭ˙˙˙ ż˙˙( ˙Ï "Óñ˙˙É#Ċ˙˙˙˙& ù˙˙˙˙˙¤$ö˙˙ŭ£žù$"ì˙ö˙ú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ôö˙˙›üŝ˙ Ç˙ŭÓ­Ĥŝù˙ĝ÷›&˙˙ü˙ (Ì˙ó˙˙İü˙úÑ!Ÿô˙ŭ§ѝ›Ġġġ"Í×Í ü˙ ˙ö˙ô˙˜"Í˙˙˙ž Üù÷˙˙ú˙˙˙˙˙˙˙˙˙ö˙û˙ŭú˙Ì İ˙ĝ˙ûü˙ñ"Í˙ŭ˙ û˙˙òŸ˙íĉĝ%˙˙ü˙ö˙˙˙˙˙˙˙˙˙!˙˙ò˙Ñ˙˙Ê#&Ĉ÷˙˙ü£! ˙˙ż˙¨ŭŭ˙ü¤ £ÓÎ˙˙úÖáġœ˙˙É !  ÒË &˙˙˙ŝûü#’˙Ö˙ŭġ˙˙ïĠĦŭġüİ Ŭ˙ûŭĤĈûÛ(! ˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È$ !˙ Öó²!ġŭü˙Û"#žŝ˙˙˙ô ˙ù˙ù˙#˙˙ŭŭ˙˙û˙˙˙˙˙˙˙˙&-˜ÇÔ Ğ¨ġ˙ġϛœÛ žİ" Ñ˙˙ñ˙ú$"œ¤£ %œÎü˙) ˙ÔŞú˙É' £úŭ˙ù!Ŭŭġ¨˙ġ˙˙ŝ˙˙˙˙˙˙˙˙˙¤ó˙˙É˙ó˙òß ûŭ˙ûû˙˙ŭ˙òÖ"›ú˙ú˙û˙£˙ó˙ùó§# ˙˙ŝñĴÇ˙î˙›ġ˙˙ó˙˙˙˙˙˙˙˙˙˙ŝ˙ûŭûû$Ü˙÷˙ú÷˙ö˙û˙ŭ  ¤¨ $Ş˙ûŝŸ"Ç˙üüÖ ' ˙ûË&£Ŭòŝ˙˙˙˙˙˙˙˙˙ú¨"˙ŝŝ˙Ç˙Ĥ˙˙üô˙÷˙ŭ˙ñ˙˙˙˙˙˙˙˙˙ÒúÜ˙ž˙ü˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô%òù˙˙ù˙ ˙˙˙£˙ŭû˙"ż˙˙ü÷!Í˙˙ŭ˙ûÈ#¨Èŝŭĝ˙˙˙$ ûù˙Ċ!›ŝ˙ŭ˙˙óüŝ˙ùú˙ó˙û˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ ¤˙˙û˙˘ Ôŭ˙ĝ¨ ´ĝ˙ĝ˙ŭ$ŝù˙ó˙“Öŭ˙ùŸ$“·(˙Ï˙˘( ˙ô˙˙ûŭû!%Çŭ˙˙$÷˙ŝü˙’Ħ˙˙ûùâö˙ŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙› ô˙ü˙˙ŭ˙Ħ"¤˙ŭú˙Ÿ,Öö˙˙!˙ûü˙˙ĝ˙ó˙˙ô˙ġ #–÷˙ú˙ÓÎ÷˙Ï˙˙û˙"ûĠġ£ ¤˙ŭ˙$ó÷˙˙Ò ù˙÷˙˙ËÒúŝÖÎŝ˙Ĝ#Ìù˙ŝ"Ċ˙ùġ˙ #Ĥû˙ŝ˙ŝúŝ¤'Ôóù˙ĦÑ˙÷ŝÓ™˙˙ïÖ˙˙Ş­šĠ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙+$˙ä˙% &˘Ê˙ž!ŭŭ˙÷”Í˙ĞÑö˙˙ %˙î˙ú˙²˙˙ŝŝ˙˙ü˙˙˙˙˙˙˙˙Ĥŭ˙£Ċ÷üûüú˙˙Ġ#Â˙ÖÁš,œ˙˙˙˙ ´˙ÏÓ #˙ôÍ! °˙ŝù¨ ˙˙î˙+›ùâŭñ˙ÌĊġ˙ŝ˙“ĵ˙˙ĝŝû˙˙˙˙˙˙˙˙§ŝ˙˙˙×˙˙˙˙· )˜ ™˙˙˙ŭ÷ŝ˙˙ü˙і!Ĥ˙ŝö˙ŭŭ˘ ˙˙˙˙˙ "ôûû˙(Ÿ˙ŭ‹ À˙˙éú˙˙˙˙˙˙˙˙˙˙ŭî!Í˙ŭߒ $ĵ˙˙˙˙ĝ˙ġŭĠñ¸!  1ù˙˙˙Ò˙˙ġ˙˙Ż“ü˙˙%" ˘¨–§ħĊ˙˙ü˙˙˙˙˙˙˙˙˙˙÷ 3÷ŝŝġ˙ĝ¨#˙ë˙˙“˙˙ŭù˙ú÷˙˙˙˙˙˙˙˙˙ŝâÉ˙óĝÛ6ú˙ŝġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Í#˙˙öóù˙Í ˙îûŭ˙ö˙Ò¨Ĝô˙ö˙Ï˙ŭġ˙˙˙¤˙÷˙˙˙óĝ‘˙Ï˙Ÿ# #›ÑÒÏ×½˙ñĝöŝó˙˙˙û˙˙˙÷˙ú˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòÎÍí˙É ˙òÓ $ĉ˙˙˙˙ŭŸ˙öù˙ĝ³$ ˙ò˙›!ĤÔÎËĜÂÔÚñ˙ïû˙-˙˙ûġŝ˙Ĥ £ŭÒ˙˙˙™/ ˙ô˙üú"1Òûû˙úž)÷˙˙öò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙£* ˙˙˙ŭ˙ĝ˙ÇŸ˙ŝ˙ë˙'Ç˙ù–"š%!ï˙˙úġ˙˙ŭ˙˙üùÛ!Ö˙˙ĝ˙ŝÔĊïú˙Żúûŭ˙˙çœ˙˙  4ı˙˙˙ž * ŝ˙˙ä˙ ü˙˙˙éï, £˙ŝ˙#0×˙ŭ˙ĊĜġ˙˙Á ùû˙úî˙˙ïô˙˙˙óŞ/˙ô˙˙ÊèŝÂ˙¨Ìë˙½ Î˙óö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŝ˙—&“˙˙ô›$ ˙˙ñŞ˙ÏúġĦ!ħöÊڞÚ˙ñŝĦŞ˙çû˙˙˘ ˙˙ŭŭŝ˙ŝ˙˙˙˙˙˙˙˙É'( Ÿ˙’–˙ŭŝ˙˙üü˙˘˙ñô˙!Ô÷˙- 7ċ˙â˙üĈ!/ Ç˙üĠ  —˙˙óž %×ĉ˙˙ ˙ŝ÷˙˙úà%%ĝì˙˙ï×ĉù˙ŭŭŝ˙˙˙˙˙˙˙˙˙§Ñ˙úü˙Ê%˙ï˙ŝŜÄ˙×˙ĝŝ˙ŝü˙ŭ˙íŭ˘˙î˙üöŝ˙/”˙˙é˙ġ!Ş÷˙§‘û˙˙ĝûĝû˙èŭ˙˙üü˙˙˙˙˙˙˙˙úâ á÷˙ĵ(!Ôú˙öĝ˙˙û˙ù˙ ˜˜ĴĦÜ˙ĝì÷û˙÷Ó§÷˙˙˙˙,˙˙ĦÎ˙úŬ˙ë˙˙˙ŝ˙˙˙˙˙˙˙˙˙¸Äò˙ĝ˙˙ŝ“÷˙˙ôžù˙ŝ˙˙˙ö˙˙˙˙˙˙˙˙ĝ˙ġ˙˙˙  #˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§ìò˙û˙ïĦ,#˙ŭ˙˙ëÚ˙‡Ïù˙ûû(Êŝ˙˙˙ùҘÂû˙ó˙ò˙˙!,ĝñ˙Û˙í˙˙ñ˙˙ñù˙˙˙üŝùŝ˙ĝ˙˙û˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙ĝ° ˙òš%"Ÿ˙Ş ˙ûü˙ù˙š-žŭ˙˙ñû™%û˙û +ûù˙˙÷˙˙˙˙˙˙˙ŭ4öŭ˙ôŝ¤$$˘°Ÿœ—Ëü˙˙˙ûĦ˙˙ü˙˙Ġ( ˙ŭ˙úĞ#Î˙ü˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ìŭ³ œî˙ŭá÷×ŝ˙¨˙ŝ˙˙˙é˙ó˙ŝĝ˙˙˙ùú˙˙ö˙˙Ì #Şîüûŝü˙úà˙™!œ˙ì˙˙˙˙&Ÿú˙“  üù˙˙3˙˙ġ˙ô­ ³˙ż˙˙ùï   İÓú›Şœ£¸˙˙ù˙£ ¤ó˙üú˙Ö˙˙˙ Ó˙÷˙ü˙—ŝ˙˙ôÜ!˘óŝÖŝ›#'–˙úü˙ŸĊï˙ĝŸ#û˙˙û4ò˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙’"+Ä˙ -˙˙™$˙˙ñ˙˙˘ )™ïî˙è$&š˙ìŭ˙˙žüûüŭŭ˙˙˙˙˙˙˙˙˙˙Ê $ž˙É˙ôï˙ô˙é£Ç˙˙˙ġ˙ #Çŝô) ˙˙÷ö˙˙  ˙úĝÍ+# ñô˙&™˙ġ˙ü˙ô˙˙ş! Ûŭ˙ġ÷ŭĝñŭ˙ŝ˙˙˙˙˙˙˙˙˙üŭŝŝĝ˙òİ$¤ŭ˙öúÁ ĝ˙˙ŭ˙˙ú˙ŝŭ˙– ñ˙ŝ˙˙ù˙ Ûĝŝ½—˙è Ì˙ùò˙˙˙˙ġ˙˙ûóü˙˙˙˙˙˙˙˙˙˙ĥ!ûŭü˙Ê˙˙˙ŝŝ˙ĝŝ˙ç#Ú˙˙˙Îûù˙ü˙˙óüáĞ˙˙ú˙Éğ”˙ġĤ#!Ĵŝ˙û˙ê˙˙ü˙í˙˙˙˙˙˙˙˙˙ò˙ ¨˙˙÷˙öü›% ˙÷ó˙§"˙ö˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙ó֌¤Ĵ$&˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!˙˙ú˙˙ù˘˙ûñĜ5œŭù˙ñ˙Ëñ˙˙âĜœ ğç˙˙û˙ŭÓ%˙˙ġ!Äŭ˙ö˙ôŝè˙˙ĝóÔöûĉż÷˙ŭĝü˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ў#$ ÑÖ!*œ˙žó˙ï˙˙ú˙'Ĥŝġ˙˙˙"ġ˙ö  ˙˙ûù˙ôô˙ùŝú˙!”˙˙˙ŭ˙÷!œôÀ˙˙ŭ˙˙ùû˙˙£  ˙ĝ˙û˙+ġ˙˙ÑÄĤ/½˙ô˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝöŭöò˙˙œĴ˙ĝ˙ëŝÈ˙óġ'ù˙ü˙ù˙˙ûĈù˙ó˙ö˙û˙û÷˙˙Ó%Úù˙˙˙üû˙˙˙›û˙ö˙û˙Ê" Ĥ˙ôé˙ú˙úÑ&ûîûġù& “ġ˙öù˙ˆ%"˙ŝŭ˙˙ñ˙˙˙û˙ù˙ ˘˙ô˙â Á÷˙ë Îġû˙ŭüš˙é˙˙ĈĤŝ˙òÙ˘˙é˙ì! Üûóï²£ŭġ˙%Ĵ˙ĉ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭ˙ġ˙$ŭçİ (!áñ˙% ŝ˙ò˙˙•+ž˙˙öÏÎË˙˙˙ô˙˜!˙ĝ˙˙˙Ħŭüŝ˙ŭ˙˙˙˙˙˙˙˙˙˙- %ùĝŭŝ˙ĝ˙ĝäħ #˙÷˙í˙˙&!Ç˙˙˘˙ò˙˙ö˙Ÿ4 ê˙˙ô ˙˙Ġ/(Ĉö˜˙˙˙ĝŝŝ˙ß÷˙˙ó˙Ò£˙˙ù˙ŝ˙˙˙˙˙˙˙˙˙ú˙ÚÑĜ!û˙ó˙˙£"ħö˙˙üû÷˙˙˙ûÊ˘˙ĉ˙ûÊŝıË˙˙˙öù ˙˙Ê*ßíû˙ûüĝùî˙˙ö˙˙ú˙˙˙˙˙˙˙˙˙™È˙˙˙ Ôŝì˙˙ñü˙÷ü˙#ï˙üôùûŝï˙˙½‰˙˙÷ûÓ˙ú ¤˙ö˙ŝ˙˙ĝ÷˙˙ú˙˙˙˙˙˙˙˙ŝ˙–$ öûŭ÷ŭù·°˙ŝġİ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙È*µÑ ( ¨˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!u˙ŭô˙˙œ(ò˙˙• Ìġ ¤˙˙˙˙ÂŬ˙˙ùôúî­ Ó˙í˙˙˙˙Ġ(úÑû™ Żí˙˙ú˙˙˙ŭġĝ˙! !Ĥĝ˙ĝ˙üû˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙üħî)›!ßŭïŝ˙û÷üŸ$ ˙˙ùóûŒ& ˙ŭ˙¤(Ïûó˙˙˙ġ˙˙ö˙ù˙ £ŭ˙ŝóü˙ħŞ˙˙óû˙öü˙ò˙%!Èġ˙˙û!ĝ˙÷ü˙Ĥ ˙û˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙# #˙ú˙˙÷˙êĤ-˙˙˙ú˙Ò ù˙˙Ó&.ŝö˙ĝġ˙é˙˙˙üúü˙ó˙öù˙üñ×&#˙˙ô˙ŝ˙öñ"Ïí˙˙ú˙"#ò˙ëú(—ò˙˙öÛ˙˙ò˙˙0!´ĝ˙ö˙öߢúû˙ŝ˙âúûùó˙ò/Á˙ġ˙œ+˙úöĉ%*Ë˙˙˙ùü# Ĥ˙ö˙˙˙œ˙˙üöŜ ˙û˙ù˙š˙˙˙îÓ˙Á# Ôúô˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝôĤ,Ñŭ$ ›Ŭù˙˙Û˙ö˙Íúŝ˙˙ú˙ôú˙˙ù"£ŭ˙˙ŭû˘˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙È# ˜3ò˙ŝġĝ˙˙ʤú˙ŝ˙ĝ·˙è˙Ûġ˙ôŭ˙ġˤ˙˙î˙Ë" ›ŭ’!­ñ ğ×˙ġ˙˙˙í˙ œŝ÷˙˙íħ ´˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙à Ĝù ì˙˙˙ôû˙‘Ĥ %šô˙ü˙ŝ˙ú˙ùĊĞÓĝ˙˙ĝû˙‰Èúôùû˙Ŝ˙ê˙Á˙ù˙üü˙˙˙ê˙ûûî˙˙˙˙˙˙˙˙˙ñċĠ˙ù˙ ŸÍüŭ˙˙˙˙ĝ˙ĝ§ù˙˙ò˙î˙˙ĝĝÛ$·ò˙˙˙ö# ĦûöĊ- ˙ùù˙ùŝ˙˙ò˙û˙˙˙˙˙˙˙˙ü˙É)Ó˙ü˙˙˙‹!ġġ˙ô-ĝ˙˙ùú˙ú˙˙˙˙˙˙˙˙ôİĜ˙ŭ˘ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙â#Ğ˙Ĝü˙û  ĝ˙˙îĜ-!žŭ˙ú˙Ĵ˙ŭû˙˙ߊ Ħ˙˙˙˙÷˙ì ġ˙˙ú!+Ùü˙íóúö£˙˙˙›)›ü˙˙ôù˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝŝ÷Ú& Ï˙Ä*ö˙˙˙ĝô˙˙!œ˙˙˙˙˙˙ĝôĈ’˙˙˙ĝ˙üîûŭ˙˙ŝÒñóŝ˙˙ò¤ . ùĝû˙ùú˙˙˙ñ˙&Ï˙ùôû˙û˙ñŝ À˙ùö˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Êù˙ġ˙˙Î#üöú˙î"˙ì˙é-ö˙ö˙˙˙–žü˙˙ù˙ŝŝ˙˙ù˙×!¸˙ö˙ú˙ó˙˙Ÿ˙ġù÷˙ŝ#˙ô˙ŭ”ü˙˙˙Â,û˙üôÂĦš˙˙˙ôüĞ ¤˙˙òü˙Ñ˙ŝ˙˙ġ˙˘˙˙òò+ Ċ˙˙Á*Ö˙ô˙ùü!–˙˙÷˙—òŭġ˙ôż˙˙ó˙ Ôèû˙ñĤù´•´˙ï˙ŝë˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íú˙˙Ċ œĦ˙!Ä×ü˙˙˙ö˙š$˙÷ŭò˙˙ì˙˙˙˙ÒĤ˙˙˙ŭŭ ùû˙˙ŭŝ˙˙˙˙˙˙˙˙˙Ë-" )Şċ˙˙˙û˙ù!Ÿßĝ˙ôû˙¤û˙˙ &Ë÷˙˙˙ôú˙Ô +ú˙â˙˙ġ,‘1Ò˙™˙û˙û˙î˙ù˙&Ôú˙ĝ˙ù£ßóŭ˙˙˙˙˙˙˙˙˙˙˙5!Ï˙ŝ˙ê˙ĝû›ġ˙˙â-/Ó˙ü˙˙ŭùóĜ˙¨ú˙ŭëŭ˙Í! ß˙˙ĝ˙׎˙ú˙İ 0½˙˙˙ï˙ŒÜö˙˙ü˙˙˙˙˙˙˙˙üĠ ˙ĝ˙˙‹*%˙˙˙÷§Êġ˙˙ ! ˙ġñ˙˙”!˙˙ĝŝè”˙ú˙˙˙££öŜ˙› –ŝ˙˙ĝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙û˙Ğùú˙÷ġ0žö˙˙Ô’˙˙ŭ˙˙ú˙˙˙˙˙˙˙˙˙ĦžŝìÔ!& û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙É'˙è˙ï´2Î˙ï ˙˙$Ŭĝ˙÷<ŝÊÖ˙ç˙¤,ëŭŭé˙ûĦ$Ö˙˙˙Ä™Ġê˙˙Ô!˙úí"# (5ġ˙˙úŭ˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ú˙˙£ûġ˙Ĥ ûŝ˙˙÷ŝ˙Ĉ Ż˙ġ÷˙ù%$ŭ˙˙˙+ ˙ñúûúÁü˙ïúĝ)×˙˙˙ú÷û˙ "İ˙˙ß˙ùúġù˙ù£$ Ô˙ö˙˙ #Ìúó˙û&“İŬ÷˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ˜˙˙öü÷û¨£˙Ûŭ˙Ġûŝ˙˙ #Çĝû˙ġò£#£˙˙òû˙ô˙˙÷˙˙é*0 Ĉ˙˙˙‘˙Ġ.˙˙û˙˜Ħ˙˙˙Ħ)˙˙ŭŝĜ§˙È˙Ú%!˙ŭŝ˙˙Ë"Ċú˙˙è˙ÜÀ˙ôŝž# ŭ˙˙ŭž%Öù˙˙/ œ˙ñ˙˙Ó ¤ĝ˙ûôĠ ­˙˙˙ò 'È˙ġ˙ôÚğ˙˙˙˙Ù˙ò˙ö÷ó˙ġ˙ŭú˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭŭú˙ Ó˙Ç˙ùüû˙û§Ê˙û˙ŝ÷˙Ċ˙˙ùÎ$ ˙˙ü˙˙žíòŝ˙ŭ˙˙˙˙˙˙˙˙˙˙Ĝ%Ç"˙ĝ˙ĝ˙ûÏĤê˙ü˙˙ôŝ˙û˙Ô Ĥŝüŝú˙˙™˙ŝ˙ŭ˙ŝĝ! #û˙Ÿ˙ôŭ˙ñ˙ŝüÛ Í˙ù˙˙˙”˙˙ù˙ŝ˙˙˙˙˙˙˙˙ ŝñÚò˙ŭüÇ˙÷˙œ ×˙ò˙ùŝ˙˙ŝŝ£Ò˙ú˙˙í˙•"Èŝù˙üÍ˙˙÷˙&%ÔÊŭ˙Í ˙û˙ô˙˙˙˙˙˙˙˙˙˙˙ÌĠ˙ù˙¨&ÎÑû—˙úù'ùÑ  ˙ì˙˙%§˙ñ˙˙×!˙ŭû$ ™ŭ˙Ĥñ˙ù˙˙˙˙˙˙˙˙ŝŭ˙ĜÑ˙úöŻ#˙˙ġŝ˙!ü˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙ *˙ì(#óÙ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Î ˙Ô˙ Ħûñ˙&ĈŞ)š˙˙ô" ˙İĝÜù§ŞÏŜ÷İ›˙üĝ˙!˙Òú ˘ŝ˙ù¨ !( û˙÷˙˙ù˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙ŝ˟ )•˙ĝ˙$ž˙öüü˙ò¤"£˙ŝË Şû˙ï˙#§œŝ˙ü˙  ġ˙ü˙˙ú—œÇ˙˙˙Ġ(ù˙÷˘Ì˙ŭÓ("Á˙úô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ $ ÷˙ & –˙ù˙˘ "Ĥŝġ˙×#”˙›ŭ˙˙ŭúû˙ö˙˙ï˙Î "Ÿü!Ü÷ĝ² )Ë˙Ì˙  ˙˙ñúÓ˙ŭÑ&ùĝ˙Ñ ÑÍÑŭú˙&!Ú˙û˙Ħ Şú˙˙Ÿ!­÷Ä˙ĝÜ ˙ŭ˙˙– ŝ˙ù˙ĤÔ˙ó˙˙Ï˙úô˙'#áú˙˙˙˙ÌĥÍ˙˙˙ü˙ŭ˙˙÷˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ö˙˙ #˘ô˙˘%˙ĝŝ˙˙˙ĝİ ' ˙˙÷˙úŻĜö˙Ħ%Ô÷ŭ˙˙“%İ˙ûûô˙ùŝŭŭŝ˙˙˙˙™ 'ûġħ Úûüŝŭ˙ûœÒĝ˙û˙ùĠüĝ˙’) ˙ġ˙˙˘!ùŝ˙ù˙ĝ˙˙™˙ùÍÒ˙ö˙û˙üúΛúŝù§—Ĝ˙ô˙˙˙˙˙˙˙˙˙£ĝĠ' ›´ż˙!˙ĝúÔ&šü˙ü˙úĝ˙˙ûû˙ŸĞÑŭĈ$û˙÷˙ĥ   ˙˙ùÑŝŞ˙öú˙ûü˙˙˙˙˙˙˙˙Ħ % Ùä˙˙™ úü˙ó˙­ ú˙ŝ˙$ġ˙ĝ˙&(ĝ˙˙Ĉ"+ žŞ š˙ġ˙˙˙˙˙˙˙˙˙˙ú˙Ñ  ²Ş™ŸĜ˙ò˙Ċ&žô˙ñ˙û˙˙üŭ˙˙ñÜ˙£!™)§˙Ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ġ !$3¸˙ŭġ˙ö ˜ŝ¤(ğ˙ûúÔĦ%! ˙ŝ˙˙›Ġŭú÷˙ëşÂ˙ŝ˙˙˙ı˜ ˙òö˙˙ë',Ä˙˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝô˙’'˙˙ŝ˙ż(˜˙˙û˙ŝú˙À"‘;)ŝûÑ"ž žŸ˙˙˙ò˙!' .žú˙ŝúÑ"&÷ü˙ûú˙ü•0#ĦŭÍ˙ĵ( '#˜˙Ĥ˙ġ˙"É÷ŭ˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙# "úË$)­ü$ “˙ô˙ó–ĝ˙ûŝ˙ŭ˙˙˙˙˙˙˙˙ž!# Ĵ˙ô˙ñ ˙˙ö˙•ÉŭÔ˙˙˙ ×ô˙˙#Ĥ™žĞ˙˙Ĉ#ü˙˙Î "!Ë˙ù˙Ÿœ"!¤Í˙Ԝ¤˙˙Ë#ŭ˙ú& ˙ĝò§ "šĴ˘ö˙ŭ˙˙ú˙ġ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ù!% ˙ò ! Ğĝ˙˙ĝŝ˙ü˙! Ĥì˙˙é§ 'Ġô˙˙‘0  Ĵî˙˙î˙˙ŭûŭ˙˙ĝòÑ ˙Ŭŭ˘ À˙˙˙ûġ˙+Ìû˙˙û˙œËĝ˙˙#˙˙í$œ˙ŝ˙ù˙ĝûŭŞ!Î˙ë˙¤ ôúŝú˙˙ŭ˙Í$ ˙˙˙  Úĝ˙ò˙˙˙˙˙˙˙˙¨6•™$ ˙î› ÈÍÒ ´úŝĝ˙ŭŝ˙˙˙˙ñ/ Ĉ˙&%Ù˙˙ú‘ +›ëô˙˙ž -ħä˙ĝ˙ö˙˙˙˙˙˙˙˙˙™ )î˙ïù˙ÉğÍ˙ŭ˙˙ÑÇÔÎ/#(¤Ü˙ï˙ µï˙Ġ)É˙÷ú˙ġë& ™Éĝßù˙ö˙˙˙˙˙˙˙˙˙ùŝñ˙ĈÌ# ¨ù˙ùô˙ùú˙!˙ú˙Ŝ˙ŭ˙˙˙˙˙ŭòì˙ ™Ë#÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙óİšôáé˙˙˙˙˙˙ÒÍÉù˙˙ĝàä˙˙ú˙ĝŝÉÊÓ½Ú˙ġŭ˙ûÇÓ×Ç˙û˙˙ù˙˙ġ˙˙˙ŝ˙˙˙˙˙Î×ͤ˙ç˙˙˙ô˙‰"5öŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĠĊ˙ü˙ëû˙çúû˙ĝ˙˙ò˙˙˙óéŭ˙˙ĝ˙öÜÚôñû˙ù˙Ä˙˘œÏÌô˙˙ŭ˙ò’/'Ì˙ûú˙˙˙˙˙çĠ'Ĵŝ˙˙˙˙È&µî˙òġÏÄÔÑú÷˙ú˙ÚÉÓż˙˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú,*œ˙˙Œ-)Óë˙˙ž+–Öŝ˙û˙˙ÛÛÏü˙˙ûüŭŝ˙˙˙˙˙˙˙˙ûĜÄêÏÖÏú˙ŭü˙òŸ&%Úü˙öûŭŬ%2“˙÷& Èŝ˙ó˙ .$³û˙î˙˙š%4Â˙˙ò¨  Şöĝ6˙˙ċÍ,!Îö¤- ŝŝ+!öŭÄ ŝ˙˙˙. # Éŭïù˙˙˙öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ŝÑ˙Ĥ"™î˙/û˙ŝĝù˙öĝ˙‹# ÙÒçž˙˙ÎĦŞ ˙˙üĊ"!˙çú˙˙˙ŭûŝ˙˙ôé) Öò£/ˆÈ˙˙˙ö  Ôĝü¤´˙ûôà! œ" ˘ċġü˙ù˙ŝúŭΧ,Ĥ˙î˙˙ĝ´Òé˙˙˙˙í˙ġôÌ Ÿĥıò˙Ĥ))Í÷˙Û˙˙˙˙˙˙˙˙˙Á¤ "ĠöâŒ2–û˙˙Ç!#ĉê˙˙ŭ˙˙˙ü˙ù˙ûµ£§š£³öǓ££¨‡İò˙úÖ˙˙˙ï˙˙ĝ˙ú˙˙öœ¨£µşë˙îŭ˙ù˙˙˙˙˙˙˙˙˙˙˙ŝ˙ùÍÓï˙ĝ˙ûñüúŝ˙˙ôŝ˙˙ûŭŝûû˙ġ˙̲  ĥôĝüó˙˙˙÷˙˙ö˙˙úñ˙÷÷˙ëŝĝ˙ŝü˙˙˙ü˙ó˙ŭî˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙íÄÛ˙˙˙˙˙˙ù˙˙ö˙˙ŝ˙˙ùŝ˙÷ùûĝú˙˙˙˙˙˙˙˙˙ĝô˙˙Ŭ˙óŜĴ˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĝ˙ñ˙ùŝ˙˙˙ûùŝòü˙˙ó˙û˙ĝ˙˙˙óŝ˙üüŝ˙˙˙˙˙˙öô˙˙ŝ˙îüü˙û÷˙˙ŭ˙˙˙˙ŭúûŝ˙˙ü˙ê˙ŝûûŭì˙ë˙Ż˙˙ùĝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûú˙ĝ˙˙ù˙˙˙˙˙ŝ˙ü˙ö˙˙˙óŭ˙û˙˙˙ü÷ùŝ˙˙˙˙ò˙ġ˙˙ġú˙˙˙ú˙˙ûŝ˙ĝû˙˙˙ċ˙ù˙˙ôúú˙˙ġô˙˙˙˙¨–³ğî˙˙˙ŝ˙˙˙˙î˙˙˙˙˙ù˙˙ŭûú˙öġ˙˙ġ˙ŭúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùñ˙˙ŭ˙ú˙˙öùù˙úŭ˙˙˙ûŭ˙ŭï˙ŭú˙òîûó˙¨˘˘¨˙ó˙˙ĝôŭ˙ŝ˙˙˙˙˙˙˙˙˙˙úûùö˙˙˙ŝ˙˙ú˙ñ˙˙˙ -ùôò˙÷˙í˙˙ò˙÷ö˙˙ĝû˙˙ëúŞĊ˙˙˙é˙˙˙¨ !& Ïü˙˙íġöŻ–×ü˙š ;˙˙úŜ‚#×èü˙˙Ŝ Ȥ´¤w´Ĥ‰àŝÛ–İ‘İž­˙˙À İ ˘Ÿ˙˙ġ›ĦŸ—İñŝ˙ïŸ) %˙üê˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙üñ˙ïö˙™/›˙˙Â˙ ŝúò˙û˙÷˙ĝ˙Á- â˙ù˙è˙óË˙˙ìû˙˙˙Âù˙˙²˙ò˙˙˙÷˙ŭŝ˙˙˙ûô÷˙ĝòÍ˙˙˙ÌŭÉëŝ˙ò˙üÛŭŭÙ˙˙˙˙–Â˙Û÷ú˙ġ˙˙˙×òüè˙ú˙ú˙˙ŭ˙öε—˙˙òŭòö˙˙é˙ĝġ˙˙˙˙˙˙öĝ˙é˙˙ö˙˙Ìĝô˙ŭ˙ġ˙ü˙˙˙˙˙˙˙˙˙˙Ë˙˙˙˙ŝî˙˙È˙è˙ġŝ˙˙™İúŭí˙˙˙˙ŝŝ˙ú˙ŭ˙˙˙˙˙ú˙î˙ġ˙˙ŭŝ˙˙÷˙˙˙ëŝüġâòü÷˙üó˙˙ġ˙ġĝ˙ú˙ĝ˙ú˙ĝü˙˙˙˙˙˙˙˙ŭûôôû˙˙÷˙ŝ˙˙˙˙˙ññ˙ú˙˙ŝ˙ò˙òü˙˙öú÷Î˙ġ˙˙ŭŝù˙˙ö˙ü˙˙ü˙˙î˙˙˙˙ġ˙ûùüùúÒ˙Ü˙ĝ˙ü˙˙˙˙˙˙˙˙˙ò˙˙üĝû˙˙˙ù˙òü˙úöŝú˙î˙˙˙ôü˙˙÷ŭ˙˙ü˙˙˙üü˙˙÷˙úò˙˙ĝ˙ġŭ˙ö÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭŝû˙ŭĝ˙˙˙˙˙˙˙ö˙˙÷ú˙üŝìûûŭ˙ŭüüŭöôüüû˙˙ŭ˙˙ü˙˙˙üû˙˙˙ŭü÷öü˙˙˙üüŭüñ˙˙˙ô˙ù˙ì˙˙É ")¸ùùú˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ŝ÷ú˙ŝ˙ŝùûüúù˙˙üü˙ŝúŭ˙üġĝ˙˙˙˙ùô˙ô˙ö˙˙ü˙˙ĝïï˙˙ûŭúû˙ŭúüüû÷˙˙˙˙˙ŝù˙˙÷ùŝĝï˙˙˙˙˙úú˙ò˙ö˙óŭ˙ŝŭôûü˙ñ˙˙˙˙ò˙ü˙ûŝûŝ˙ŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ôŝ˙üġ˙îó˙˙˙ĝ˙˙ŭ÷ĝŝ˙˙˙˙ŝîŝ˙˙˙ŭ˙ŭûŭŭûŭ˙ü˙ü˙˙˙ĝ˙˙˙˙˙˙˙˙˙ĝ˙˙ü˙ù˙úú÷÷ù˙˙˙öüù˙òù˙úö˙˙˙˙ġ˙ï˙ô˙òú˙û˙˙˙ò˙ñë˙˙óñù˙ŭÒ˙í˙˙îĝ˙ŝ˙˙öÜÂ˙˙ĝ˙˙˙˙òì˙˙îáê˙ú˙˙Óùùúñ˙ù˙ìú˙˙˙˙ŭġ˙˙˙úô˙û˙ĝ˙ó˙˙ĝŝûú˙ù˙ĝ˙˙ôŝ˙˙úû˙ùü˙ô˙˙˙˙ú ˙˙˙˙úö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙ĝü˙˙ĝ˙Úĵ˙û˙ü˙í˙ü÷˙˙ï˙é˙˙ü˙˙ŝġÚÏÊÍŝú˙˙ŝô˙˙ŭ˙˙˙íû˙˙˙˙ñû˙˙ŝŝü˙ġŭ˙˙˙˙˙˙˙˙üŝ˙˙÷ï˙˙˙˙ù˙ĝġ˙í˙˙˙˙éŝûì˙ŝ˙˙ŭŝù˙÷˙úú˙ġŜÊŬí˙˙˙˙˙ú˙û˙˙ŭ˙˙ñ˙˙êŝ˙˙ü˙ùû˙˙˙˙˙öóŝí˙ì˙˙˙÷ûó˙ġú÷˙˙ù˙ŝ÷˙˙˙˙˙˙˙˙˙˙óö˙îó˙ú˙û˙˙˙ñ˙˙úûüùĝ˙˙˙ġûŝùŝ˙˙ĝ˙˙ŝ˙úô˙˙˙˙÷üö˙˙˙ġôö˙˙˙˙˙óû˙˙˙˙û˙ŝ˙˙˙˙ü˙˙˙ġ˙˙é˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ö˙ŭúŝüġ˙˙˙ùŭ˙ĝ˙˙ö˙˙òó˙˙Óû˙˙úóŭ˙˙üö˙û˙üö˙ì˙˙ò˙˙÷˙˙ö˙˙ġ˙ô˙˙˙˙ċŝ˙ŭ˙˙˙˙˙˙˙˙ŝüü˙ŝ˙˙˙˙ù˙ú˙ú˙˙˙ñ˙˙îú˙ô˙í˙˙˙óŝŝŭŭ˙˙ŭüŭŝ˙÷˙˙î˙ŝŭ˙˙ù÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭŭç˙û˙üùŭúúü÷÷˙ĝú˙˙û˙˙÷˙˙ú˙ö˙˙˙˙˙ŭ˙˙ŭûûûöŝ˙ù˙˙üŝ˙ù˙˙˙˙˙ŭüŭ˙˙˙˙˙˙òï˙ŭ˙ì˙ÏÍ 1ó˙ŝúú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙˙ûĝ˙ŝú˙˙˙˙ù˙˙öü˙˙˙˙˙˙˙˙ŝùġ˙˙÷˙ŭ˙˙úö˙ĝ˙ŭ˙˙ù˙˙˙ü˙˙ü˙˙˙ôû÷ì˙˙˙ġŭ˙˙˙˙˙˙˙˙ëŝûò˙˙˙˙üñġ˙˙˙ô˙ö˙ŝ˙˙ĝĝöü˙˙ú˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝú˙˙˙ü˙˙ŭ˙ú˙˙˙˙öû˙˙öñ˙ï˙˙˙˙ôù˙˙˙ù˙˙ù˙˙˙˙˙ŝ˙ŭú˙˙˙˙˙˙˙˙˙ŝ˙î˙úöñ˙˙˙˙˙ñ˙˙˙˙÷˙˙ôġ˙˙ô˙ù˙ĝ˙˙ïù˙˙˙˙ûûû˙ġ˙˙˙ûĝö˙˙öúù˙öú˙ĝ˙ŭ˙ç˙ĝŭ˙÷˙ŝŝġ÷úòï˙ŝû˙úô˙˙˙˙˙˙ñ˙à˙˙ġüü÷ŝéá˙ġ˙û˙ŝ˙ûúú˙˙˙û˙˙ö˙˙ŝ˙˙ïüö˙ŝŭü˙ŭ˙˙˓òŭ˙˙Ħ#  ż˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙ü˙óûó˙˙˙ŝ˙˙û˙ô˙ü˙˙ê˙˙˙ü˙ŝĝôö˙˙˙öŭ˙ŭô˙í˙úġ˙ŭŭ÷˙˙˙ĝ˙ùŝ˙ò˙üû˙úġŝŭ˙˙˙ûúŝ˙÷úûíû˙˙ŭ˙ùú˙˙üîûġ˙ùû˙˙˙˙˙ö˙˙÷˙ŭŭ˙˙ô˙˙˙˙ô˙òŜŭí˙òŭŝ˙ŭ˙˙úú˙˙ü˙˙˙î˙˙ö˙˙˙˙úî˙ŝ˙˙˙÷üŭĝò˙˙˙ŝ˙ŭ˙üñ÷ŭ˙ü˙˙˙˙˙˙˙˙ò˙ĝ˙˙ô˙˙é˙ü˙˙˙˙úù˙˙î˙˙Ï˙˙ô˙ŝú˙ŝ˙ü˙úŭŭ˙û˙÷˙˙ú˙÷˙˙ùĝ˙˙ó˙ù˙˙˙˙ŭûùô˙ôú˙˙ë˙ĝù÷ŭ˙ö÷˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ùŝŝ˙ûù˙ö˙˙˙ġĝ˙˙˙˙ñŭ˙úüŝ˙ŝ˙ŝ˙ëĝ˙÷˙ú˙˙ġ˙öúü˙˙é˙úï˙˙ú˙ŝ˙ô˙ŝġ˙˙ì˙óú˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŝŭñûŝ˙˙û÷˙ĝ˙˙üì˙ûĝ˙ŭ˙˙ööü˙˙˙ûû˙˙˙˙ŝ˙˙ô˙˙ĉ˙ĝŭ÷ö˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙ù˙ô˙˙òú˙˙˙ú˙˙˙ŝ˙ĝ÷ûŭŭ˙ĝ˙úò˙úŭöġ˙˙ĝŝ˙˙˙˙˙˙˙˙ġŝ˙ùûü÷û˙ŝ˙˙ûùúûúĝ˙úö˙öñ˙ô˙˙š! ñ˙üô˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙ùú˙ŝù˙˙˙ûġóú˙ü˙ŝ˙˙ûò÷û˙˙˙˙ŝ˙˙ĝ˙˙˙˙ù˙˙ôġò˙ó˙ŭ÷ŝúĝ˙˙˙˙üüüŝ˙˙÷ĝ˙˙˙üù˙˙÷˙ñû˙ŝ˙˙ú˙çĝ˙˙ü˙û˙ŭ˙˙úü˙úû˙˙˙˙ĝġ˙ġ˙öüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝ˙˙ôĝ˙˙˙ĝ˙˙ó˙˙ŭôö˙˙˙ù˙˙÷˙˙û˙ŭŭñ˙˙ñŭŭġ˙úòü˙˙˙˙˙˙˙˙˙˙˙î˙˙÷˙˙˙íġ˙ù˙˙úíŭ˙ô˙ŝ˙˙ñ˙˙˙˙üì˙˙˙˙ùóġ˙˙ùûġûú÷ü˙˙ôö˙˙˙˙èŝ˙ôó˙˙˙˙˙˙îê˙˙÷˙˙ŭ˙˙ŭ˙˙ó˙˙˙˙ŭ˙ŭ÷˙ŝö˙ĝ˙˙ê˙˙˙˙˙˙ŝ˙ŝ˙÷ú˙˙˙˙ġúĝ˙ġü˙üú˙ü˙˙˙ú˙ŝ˙ì˙ġôİ ˙˙ġñ˙ 0Ŭ˙˙ë˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝë˙˙˙˙˙òĝ˙ê˙ö˙˙ú˙˙˙˙˙ú˙ġ˙˙˙˙˙ġ˙˙˙ü˙˙÷˙ġú˙˙ìù˙ì˙úú˙˙˙ù˙˙˙ü˙˙ô˙ŝ˙˙ŝüüŝ˙˙˙˙˙ŭ˙÷˙˙˙˙ġú˙˙ŭ˙úŭ÷˙ñŭü˙˙ŭ˙˙í˙ŝ÷ò˙ŭîġü˙ĝ˙˙ù˙˙˙ŝ˙ü˙˙ŝŭùŭù˙˙˙ê˙˙ġô˙˙ë˙˙˙˙˙ŭġüó˙ö˙ü˙˙ŝŝ˙˙öû˙òú˙ü˙˙˙˙˙˙˙˙˙˙˙ù˙á˙˙ŝ˙íù÷˙˙˙˙ûŝûŭ˙û˙˙˙ŝŝ˙ĝŭ˙ûûü˙˙˙ġöŭ˙é˙˙˙˙˙˙˙ûô˙˙ù÷ú˙˙˙˙˙˙ŭü˙ĝ˙˙˙˙˙ĝ˙˙öĝ˙ñ˙˙˙˙˙˙˙˙˙öĝŝŝ˙˙˙î˙ŝ˙ŭüñ˙˙˙˙öġ˙˙˙üúŭ˙˙ŝúŭ˙û˙˙ô˙ù˙ùĝ˙ŭ˙ü˙˙˙˙˙˙ŭû˙÷ù˙ŝ˙ĝ˙˙˙˙˙˙ï˙óò˙˙˙˙˙˙˙˙˙üġ˙˙˙˙ü˙ŭùü˙˙ġù÷˙˙˙˙÷ù÷˙˙ġé˙˙˙öü˙üû˙˙˙˙˙ù÷˙˙ñ˙˙˙˙ö˙˙ŭû˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŭ˙öġ˙ôŭ˙˙ŝ˙˙ûġ˙ü˙ĝü˙˙˙˙˙˙˙˙ñŭ˙˙ŝ÷ĝüŝŭŝû˙˙˙˙˙˙˙˙˙˙˙ûĝ÷ùŝ˙˙˙˙˙˙˙÷éŭ˙úûùö˜'”Ôĝ˙ó˙˙˙óŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ù˙ŝùû˙˙˙˙÷˙˙öú˙˙˙˙˙˙û÷÷úŝ˙˙ŝ˙ġ˙˙ŝó˙˙˙˙˙ŝ÷˙ŭ˙˙˙˙˙ŭ÷üĝ˙ûû˙˙˙ö˙˙û˙˙˙ŭŝ˙ü˙˙ûġ˙˙˙˙˙ñ˙˙˙û˙ü˙ŝ˙ŭ˙ü˙ó÷ŭ˙˙÷˙˙˙˙ú˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭòö˙˙û˙˙˙üòû˙˙˙˙˙úú˙˙ü÷ü˙ĝ˙˙ġû˙˙ô˙˙ŝŝ˙˙ô˙˙˙˙˙˙ŭû˙˙˙˙˙˙˙˙˙˙ġ˙ú˙˙˙˙˙ô˙˙˙ĝ˙ù˙˙ï˙˙ôû˙ŭ÷ġ÷˙˙ŝòú˙˙ü˙˙˙˙˙˙˙ûŭûô˙˙˙˙˙öŭ˙˙˙˙é˙ûóû˙˙û˙ŭô˙ù˙ĝ÷ĝüĝ˙ŭ˙ŭ˙ĝü˙˙˙ù˙˙˙ò˙˙˙í˙ö÷˙ñ˙ö˙˙˙ï˙ŝ˙˙˙˙˙ĉ˙˙ŭ˙˙üù˙˙û÷˙˙˙öĠú˙ĝ ñ˙ï˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ġ˙˙ü˙˙ù˙û˙úŝ˙ú˙úú˙ĝ˙ú˙û˙ë˙ù˙˙ŝúô˙ŭ˙˙û˙úù˙˙˙˙˙ó˙ó˙˙ú˙ŭŝúŝ˙ûŝŭüŝ˙˙˙˙üŝ˙ú˙ŭ˙ŝ˙ú˙˙˙˙÷˙ó˙˙ŭü˙ûò˙÷˙ò˙üú˙ŭ˙ŝ˙˙˙ĝ˙˙ò˙˙úŭú˙ĝ˙˙˙˙ŝû˙ü˙û˙˙ô˙˙öŭ˙˙ú˙ñ˙ü÷˙˙˙˙ùö˙˙ô˙˙˙˙˙˙ĝö˙ú˙ù˙˙˙˙˙˙˙˙ŝŭî˙ûú˙öġ˙ü˙˙˙ŭŝ˙˙ö˙˙˙˙ú˙ü˙ö˙˙÷˙˙ò˙˙ŝó˙ŭ˙˙ô˙˙üġ˙ŝ˙ò˙˙˙ĝ˙˙˙˙ŭŭ˙ú˙˙ü˙ü˙˙˙û˙÷ĝ˙˙ë˙˙˙˙˙˙˙˙˙˙ô˙˙÷˙ŭü˙ú˙˙˙˙˙ü˙ôû˙˙˙ŭŝ˙˙ŝŝŝŭú˙ù˙ŭö˙˙˙ùŝ˙úü˙ûŭŭ˙˙˙ú˙ŭ˙˙˙ĝ˙ŝ˙ô˙˙ŝô˙ú˙˙ú˙˙˙˙˙˙˙˙˙ù˙ö˙˙ûü˙ŝ˙ùú˙˙˙ŭ˙úû˙˙˙˙˙ü˙÷ŝù˙ü˙ŝŭ˙ŭùû˙˙˙ó˙˙˙ùŝ˙˙˙˙üûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ĝ˙üú˙˙ù÷˙˙ŭ˙ŭ˙˙ò˙ù˙˙˙˙úûŝĝú˙˙ù˙ŭô˙˙û˙˙ùŭ˙úü˙òü˙üú˙˙ŭ˙˙˙˙˙üúûŭö˙ù˙˙ó˙˙˙˙Ñŝ˙ĝ˙ŝ˙ĝùú˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñġ˙ŝ˙ĝ˙ûŝ˙÷ġ˙˙ĝ˙˙˙ù˙˙ôŝ˙˙˙˙˙ŝŝò˙ö˙úù˙ŝŝö˙ñŭ˙˙˙˙˙˙ŭ÷˙˙˙˙˙üŭ˙ú˙÷ŭ˙ŭú˙üĝ˙ĝ˙˙ĝ˙˙˙˙ŝ˙úŭ˙˙üŝ˙ŭ˙ġ˙üŝŭ˙ŝ˙ĝ˙òü˙ŝúŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ĝ˙˙ġú˙ú˙˙÷ŭŝû˙˙ŭü˙˙ŭ˙òû˙˙˙ŭ˙˙÷˙ŭŭ˙÷˙ü˙˙ŝ˙ĝù˙˙˙˙˙˙˙˙˙˙ñ˙˙˙÷ùŝúûŝ˙îŝ˙ŭŝ˙ŝ˙óó˙óï˙˙ŭ˙ŝŭŭ˙ŭüü˙ŝô˙û˙ġ˙ü˙˙˙˙˙ô˙˙˙˙ûüóŝ˙ô˙˙ŭ˙üĝ˙ġ˙˙˙˙ûû˙ù˙˙û˙˙ü˙ï˙˙öù˙û˙ò˙ú˙ù˙ô˙˙˙˙÷˙î˙˙˙÷˙ùú˙˙ĝ˙ú˙ĝ˙ŭû˙ûŝ˙˙üŭû˙ŝ§ü˙ôŝ˙ #š˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ù˙ü*Ĝô˙İ ˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙˜! (ÜÓö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙˙ŝġû˙Ä ˙˙ùú˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôû˙ĝĝ˙˙˙˙˙˙ü˙ŭöö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ú˙˙ĉû˙ëô˙òĝŝ˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙˙ö˙˙ŭ˙˙ġŝ˙÷˙óġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙üġ˙˙üîŝü˙˙öü˙˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙û˙üù˙˙÷˙ŝö˙˙˙˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙úüûö˙˙î˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙û˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ûü˙˙˙˙˙˙˙˙˙˙˙˙˙ŝö˙î˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ùù˙ŭ˙˙ġ˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙ŭû˙˙˙˙÷˙˙üŭ˙˙˙ŭúúŭüú˙ŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙üú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üô˙˙ü˙˙ġ˙˙˙îŭ˙ŝ˙˙˙ù˙ġ˙ùù˙üú˙ŝ˙ŭ˙ó˙ŝüû˙÷˙˙˙ŝĝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙ŝġŝúü˙˙ü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙úŭ˙˙ü˙÷ŝù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŭ˙˙ŝ˙ü˙˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙û˙˙ŭü˙ŭ˙ú˙˙˙˙˙˙ú˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙ú˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙÷˙˙˙˙ĝ˙˙ŝŭŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ûü˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô÷˙ŝ˙˙˙˙˙˙ò˙˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûûûû˙÷î˙ŭ˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ù˙˙ŭü˙ë˙˙˙˙˙˙˙˙úĝ˙˙ë˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙ü˙üŭĝü˙˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙˙ö˙ööì˙˙ñŝ˙÷û˙˙ùġù˙˙ŭ˙˙˙ĝò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŭ˙ö˙ŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ó˙û˙í˙˙ĝ˙˙ó˙˙˙ôô˙˙˙˙÷˙˙˙ï˙üú˙ñ˙˙ïü˙öñü˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙ŝö˙˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭŝ˙˙˙˙ü˙ġé˙˙˙öü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ûúü˙ùü˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ŭ˙˙˙ûûù˙˙ŝôü˙ĝ˙ò˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûï˙í˙ôü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŝñ˙ŭúì˙ò÷˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŭüŝ˙÷ó˙˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙ŝ÷˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì÷ŭ˙ġ˙˙˙˙˙˙˙˙˙˙ŭ˙ò˙˙˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ġġ˙˙˙î˙˙˙˙û˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷îŝĝ˙˙ûñ˙˙úú˙˙˙ŭŝ˙˙˙÷˙ö˙˙î˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙ûŭô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íôü˙ŭùû˙˙ù˙óó˙˙ù˙ĝê˙˙ó˙ŭüŭŭ˙˙˙ûü˙˙Éô˙˙˙˙˙˙˙˙ûü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùùûŝ˙ŭŝ˙ï˙˙íġ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüûĝ˙˙˙ŭ˙˙ööü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝô˙˙˙˙üŭ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙úüŝ˙˙ŭ˙÷˙˙òû˙ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ùġ˙˙ŝ˙˙úŬ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝû˙˙üĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î÷ú˙ú÷˙˙˙í˙˙ñ˙üĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙ú˙óùô˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ô˙˙˙˙˙˙˙˙ô˙ü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭùò˙˙ġö˙ûí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ˙˙˙˙ġ˙Ŭ˙˙úŭ˙˙˙÷ú˙˙˙ĝù˙˙öŝ˙˙˙ûò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙÷˙Ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ŝ˙÷˙ŭ˙˙˙˙ĝ˙ü˙˙îĠ˙ï˙˙î˙ġ˙ï˙˙˙˙˙ĝôùû˙ĝüòŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙ûí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙˙˙˙˙÷ô˙í˙˙˙óŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙˙˙òÏ˙˙˙˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙÷î˙òü˙˙üùŝ˙ŭüŭ˙˙üû˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝù˙÷˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üï˙ĝ˙˙ġċüüġ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙ó˙˙˙ü˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙˙˙û˙úï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙˙úô˙˙˙˙˙˙˙˙˙˙˙˙óüÇ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó÷üÔ˙ÑÙÒÍŭ˙˙˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü÷˙Ĉ˙˙˙˙÷˙öĝ˙ĝ˙úĝ˙˙ŝ˙˙ġ˙˙éĝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ò˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ŝ˙ĝ˙Ÿ ­îü˙˙ó˙Ï˙˙îÍÛĜÑï˙˙˙˙ôßıÖǵÇßÚÒÍÂ˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òüŭóö˙˙˙˙÷÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ùġ˙û˙ü˙˙÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÊÏÌĴ”ó˙˙ŭ˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô˙˙ù˙ó˙üôá˙ŝ˙û˙˙˙˙˙ĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ì˙ŝ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ñ˙÷˙ù˙ÖÀĉı˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġú˙˙ġòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙è˙ú͟“˙úú˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙˙üŭü˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷úŝ˙˙ù˙˙˙˙˙˙˙˙˙÷Ÿ $™˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙Žİ œí˙ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙™˘ıÌĤü˙ò˙˙ù˙ŝ˙˙˙úîéïĝ§’˙˙ë˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙䞨•˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙Ê˙ÄĤ+˙˙üŝ˙ĜšĞ%žĞ˜Îôŝ˙Ĥ &ì˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŭ˙˙äА˙˙ó˙ŭġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙˙ì˙˙ùŝ˙÷ùûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïž'Ŝŭ˙ù˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›(Ħžßŝò÷žş˙“š˙ú˙úüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ôù˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġû˙÷ċ˙îÜú  §˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭôù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î;'ž˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙ŭö֕ ,İ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü³‰""Ž˙Ì˙˙˙˙˙˙˙˙î%"”˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éË11Żñ˙ôû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$1 ç˙ġŝ˙˙ĝö˙ĝ“1# Ċ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŭ$) %È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙úĈ äó˙ŝ%6ßô˙ò”  ˙˙÷óû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüöĠ‘B–í˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñœ"!˙ú˙Ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙! !Ïú˙ĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙2ħŞ”$4'Óñ˙úó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝİ“(úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙ë˙ -&ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˘(ğ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üö× # ü˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġßͤ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ÿ 1 /ö˙˙˙˙˙˙˙˙˙˙Ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ĵ! %ÂÙüġ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙"Ĵî˙˙ó˙˙˙ö¤,$  Ó˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġ "À˙˙˙˙û˙š$ ˙ö˙ö˙˙”$˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ş2¤˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭ£&žô˙ñ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Á!Ëŭ˙û˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž  $ ˙úú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¨ !ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ö˙˙ 'ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝŭ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙ŭ˙˙˙˙ŭ˙˙˙ŭü˙ġ˙ĝ˙ó˙˙˙ü¨"ü˙˙˙˙˙˙˙˙ŭ˙˙üŝ˙ŝú˙˙úŝ˙ŝü˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ûŭ˙ĝ˙û˙ü÷˙ŭ˙˙ö˙ŝ˙˙˙˙˙˙˙˙ù˙˙ŝ˙˙ûŭ˙˙˙˙ŝ˙˙ù˙ûŭö˙û˙˙ü˙ŭû˙ú˙û˙úü÷˙˙ĝ˙˙˙˙˙˙˙˙ú˙˙Ħ˙ü˙ûŝ˙˙˙˙˙˙˙ŭ˙˙˙˙˙ö˙üû˙ó˙˙˙˙ó˙ù˙˙˙˙ġŝùĝùû˙˙˙ŝúÏ'ú˙û˙˙ï˙ù˙˙˙ûĝ˙˙ü˙üú˙˙˙ŭ˙˙˙˙•" %Ïû˙˙˙˙˙˙˙˙˙ÇĞ ˙ŭŝ˙ŭ˙˙ü˙û˙˙ù˙˙û˙˙ġ˙˙üŝ˙˙ûùŭ˙ŭŝ˙üŭ˙î˙û˙ĝ˙ĝ÷˙ŝù ûû˙ü˙˙˙˙˙÷˙ñ˙˙ŝ˙ġ˙ú˙˙˙ùü˙û˙˙ü˙˙˙˙˙˙˙˙˙˙&Ŭĝü˙˙üŝË& %!Á˙ġ˙˙ö˙ù˙ŝô˙˙ú˙úĝŝù˙÷˙ŝ˙˙ôù˙ú˙ŝù˙û˙ôŭ˙ŭŭ˙˙ù˙ûŝ˙˙˙ŝú˙ġ˙˙ĝú˙ô˙˙˙ŝ˙Ò% ÷˙ûö˙ĝ˙ú˙öŭŝ˙÷˙ù˙˙˙˙˙˙˙˙ĝ˙˙ŝü˙ù˙ñ˙˙ûô˙ŭ˙˙ôÄ3˙˙˙ŭŭû˙˙ĝ˙˙ú˙˙×˙÷ù˙÷û˙˙êŭ$ ŞÔŝûú˙í˙˙ùĝ˙û˙˙ùŭ˙ŝ˙ŭ˙í˙ŭ˙˙ĝ˙˙ŝúú˙ŭ˙îŭ˙ŭ˙˙ŭ˙ùù˙üú˙˙òû˘&˙üŝ˙˙˙ŭ˙ĝ˙˙˙˙ŝ˙ĝúü˙ĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙˙ĝŭ˙ĝ˙˙˙ó˙ú˙˙˙ô˙ï˙ù˙ú˙û˙÷˙˙ŭ˙˙ġû˙˙ŭ˙ĝ˙˙ù˙§÷˙˙˙÷û˙˙÷ü˙û˙ŝ˙ùú˙û˙˙ġ˙Ĉ" Î˙˙ĝ˙ü˙ùŭ˙ŭü˙ù˙ŭ˙ó˙ú˙˙ó˙û˙˙ŭü˙˙ú͢•.)–˙êĴÖŝÍ˙ŝ˙ġ˙ŝ˙˙ŝí˙ù˙˙ŭü˙ŝ˙˙úï˙ùŝù˙˙˙˙ġ˙˙˙˙˙ŝüŭŝŭ˙˙ĝ˙˙ġ˙˙ŭ˙ô˙˙ŭ˙˙ĝŝüÚŸÔ—™Î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûûûû˙ŝŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙÷˙ŭùûŭŭ˙˙˙í˙ç˙˙ü˙ͨ)˙ö˙˙˙ŭûûûûŭúú˙˙˙˙˙˙˙˙˙˙úúŭ˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŝ˙˙˙˙˙˙˙û˙˙ŝŝ˙˙û˙˙úûüûŭ˙ù÷óŭ˙˙÷˙˙ù˙˙˙˙˙ġ˙ôŭü˙˙öûúôŭ˙˙ñú˙˙˙˙˙˙˙˙˙˙˙ú!˙˙÷˙ġ˙ùŝ˙ûû˙˙˙ö˙öû˙ŝö˙ŝ÷üûû˙ùúû˙ġíü˙˙˙˙˙˙˙ôü˙˙˙áĝ˙ùû˙˙ŭ˙ö˙˙ŝ˙÷˙˙˙˙˙ŭ˙˙˙ŭûó Ò˙˙˙˙˙˙˙˙˙˙ŭġ!û÷˙˙ŭú˙˙˙ġ˙˙˙ùŭ˙˙ù˙ŭ˙ŭü˙˙˙˙˙˙ûü˙˙˙ġ˙öŝû˙ï˙˙ŝÜ˙ $÷˙ŭòù˙ìúŭ˙ñŝ˙÷úŭ˙˙û˙˙òîü˙˙ġü˙ĝ˙˙˙˙˙˙˙˙˙ù"/$œĜ˙ŭ˙ŝüÛ#  # Ÿŝüĝ˙ú˙ĝ÷ù˙˙úï˙ü˙˙˙÷ù˙ŝŝú˙˙úô˙ü˙û˙˙˙ñïŭ˙˙˙ú˙ü˙ŝ˙ô˙ĝñ˙öù˙˙ó˙ù˙÷˙ú˙ÇÌ!¤˙˙˙ŝ˙˙˙ü˙˙ŝûü˙ö˙˙˙˙˙˙˙˙˙˙íï˙ŭí˙ñ˙ô˙û˙êĝ˙˙˙Ï (ŭ÷úĝ˙˙˙ôö˙˙ŝ˙üĈ˙ûŭŭ˙ĝ˙û˙ĝ˘& "îù˙˙˙ñŝ˙úĝ˙ûúú˙úü˙ûñ˙˙ĝñ˙˙û˙öŭó˙˙˙ñ˙˙ŝ˙÷˙úù˙˙úû˙ìŝ˙˙ġ¤ Ħ˙˙ŭûòŭ˙ú˙˙ùé˙˙ĝ˙˙ĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝñ˙ó˙ô˙˙ĝĝú˙ò˙˙üüġĝ˙˙˙ŭ˙˙ó˙ú˙˙ùŭòŝŝ˙˙ùô˙ġ˙ü˙˙˙•%˙ö÷ŭ˙˙˙˙˙ŝŭöûöö˙˙ûĝ˙ġ˙˙˙"Ġ˙ó˙˙ë˙ŝü˙˙ŭŭ˙ŭ˙ŭĝ˙ú÷˙ĝ˙˙˙ŝŭ˙˙ûû˙˙·%§˙˙˙ġ˙˙ä˙û˙ó˙˙˙˙˙˙˙ô˙üü˙˙ûü˙˙ì˙˙ĝ˙÷ġ˙ž  ˙ò˙ŝüüŝ˙˙ŝ˙üŭ˙˙˙óúû˙â˙˙˙ìġ˙˙ô˜ÙûèıËÖ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ŭ˙üü˙˙˙˙˙ô˙ï˙˙é˙˙˙ö˙ŭ˙˙˙ŝŭŝ˙˙˙ü˙˙ŝŭ˙˙˙˙ŭŝ˙˙ü˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙úùú˙ü÷˙ùüĝú˙û˙ü˙˙ŭŭ˙˙ü˙öŭ˙˙˙ü÷˙ú˙˙˙ŝöŝü˙ú÷˙úù˙˙ü˙˙ŭŭú˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙ö˙˙ž  ÷ò˙˙˙ìü˙˙ŭû˙˙ŝ˙ŝ˙ü˙˙˙ê˙˙ĝûô˙ŭ˙˙ï˙˙ŝŝ˙˙ö˙÷˙÷˙ŝüŭŭ!( "Ëŭ˙ġ˙˙ñ÷˙˙ŭŭ˙ŭû˙úúŝüŭŭôïŝ˙˙ŝÒ Á˙˙˙˙˙˙˙˙˙ô˙˙Ħ +ûìñ˙˙˙˙ŝ˙ŭ˙ŭ˙ġ˙˙˙ú˙ù˙˙˙˙ŝ˙˙˙˙ûû˙˙÷˙é˙˙˙û˙óóúġ˙Ì˙˙ŭ˙˙÷˙˙ġù˙˙ŭ˙˙ú˙öó˙˙˙˙ö˙˙ûö˙˙˙˙˙˙˙˙˙˙ĝ˜ !$˙˙˙ö˙Ô§& ˙˙ó˙˙ñ˙˙˙˙˙ïü˙˙ñ˙ùù˙÷˙ûú˙˙ġ˙˙˙˙ŭ˙ŝúĝ˙˙˙˙ŝô˙˙ñ÷˙ú˙ġŝüŝŝ˙ó˙ë˙ŭŭü˙˙û˙˙ŝ˙ñöüû˙˙˙ûġ˙˙ò˙˙ġ˙˙÷˙˙˙˙˙˙˙˙˙˙ŝ˙˙ü˙˙ë˙ù˙ò˙˙úĝ˙Ô£û˙˙˙˙ûú˙˙öŭ˙ŭùż˙˙üñú˙˙ò˙Ÿ0™˙˙˙öġ˙˙ŭ˙˙ĝ˙÷˙˙˙˙ü˙ù˙˙˙˙ö˙í˙ú˙˙û˙ûëü˙û˙˙ŭú˙í¨˙ò˙˙éĈ˙˙ùô˙˙ŭ˙ŭûò˙ù˙˙˙ú˙˙˙ú˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú˙˙˙ê˙˙˙˙˙˙ŝ˙ŝ˙˙ôí˙˙ôġ˙ò˙ŭû˙ĝ˙˙˙˙˙ù˙˙ùúôŭŞ!,ŭú˙ŭèġĝû˙˙˙˙˙˙ú˘˘ù˙˙˙˙ôúô Íû˙÷ü˙ŝŝ˙ô˙˙˙ü˙ĝ˙ĝûñ˙˙ĝ˙˙˙ŭŭ˙˙ŭ÷˙˙×" ó˙ĝ˙ùùáú˙ú˙ûùü˙˙˙ú˙˙ú˙˙òġ˙˙ŭü˙˙ô˙ï˙˙˙í˙˙˙ŝúû˙˙˙ŭ÷˙˙˙óŝ˙˙˙˙˙˙ŝ˙ñ˙˙îü˙š5Ìü˙˙˙í˙Ĥ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙ŝŭüŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙üü˙˙üŭ˙˙˙˙ŝŭ˙û˙ù˙˙˙ñŝ˙˙˙˙˙ŭüûŝ˙˙˙˙˙˙˙ü˙˙ûú˙úú˙úû˙˙ü˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙û˙ŝ˙˙˙ŝ˙˙ŝ˙ú˙˙˙˙ŭŭ˙˙˙˙öĝûöŭ˙˙÷ò˙ôú˙˙˙û˙˙˙ü˙óŝùùŝüûŭŭ˙ŝ˙ò˙ô˙öĝ˙˙˙˙˙˙˙˙ú˙ġûÙ#Ì˙˙öîñ˙˙˙˙˙˙˙ŝúò˙˙˙ĝ÷˙˙˙˙ú˙óü˙˙ġ˙˙ŝûóúù˙ŭ˙û˙ŝûü˙-"Á˙˙ġ˙˙ùŝùó˙˙˙÷˙ĝ˙˙ŝûü˙˙˙˙ġùÊŞ•ċú˙˙˙˙˙˙˙˙˙ñ˙! ˙öú˙˙˙˙ŝŝ˙ûġ˙û˙ùüûŝ÷üüŝüŭüŭ˙˙ŭŭŝú˙˙ŭ˙%Íġü˙˙ŝ˙Îŭŭïüĝ˙ċġ˙˙ĝ˙ïüĝ˙˙ô˙˙˙ôĉ˙˙ú˙˙û˙˙˙˙˙˙˙˙˙û˙˘# %Ôí˙˙˙ŝ'(ûġŭ˙˙˙îü˙ö˙˙ùñĝ˙üŝ˙˙úóÖ˙úüŝŝÎë˙˙û˙ûŝöŝġë˙ŭô˙˙˙ñŭ˙˙ì˙˙ìŭ˙˙˙˙ù˙ŭú˙ŝç˙û˙˙ŭ˙ŝôŝ˙ó˙ö˙üĝ˙˙ĝ˙˙˙˙˙˙˙˙˙ñ˙÷˙ûûîŭ˙˙ù˙˙ì˙ü˙÷)—˙˙íö˙˙ŭú˙ĝù˙ûûİ˙˙˙ê˙˙ġĝá˙‘#Şùù˙˙˙ë˙˙˙ö˙˙ö˙î˙˙˙ùí÷óŝ˙˙˙ò˙î÷˙Èġ˙úô˙ûò˙ĝ˙§Ì˙ù˙˙˙ôİ´˙ñŝŝ˙ô˙˙˙ü˙÷ï˙˙ûġ˙Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òç˙ô˙˙óüòü˙˙óü˙˙ïŝ˙˙Öüŝ˙ĉ˙˙úúÉ˙ó˙ü˙ú˙ù˙ŭ˙˙˙ ĵĉ˙û˙˙˙˙ŭ˙˙öúñíäÖ˙ù˙˙óĈÓ˙ġ˙˙ô˙ŭ˙˙˙îġô˙ŭôü˙Ì˙ŝ˙ŝüŭüûü˙˙˙˙ĝĝŸ˙÷ûÛ˘Ìĝ›§ŝùöĝ˙ù˙÷üñ˙û˙ïĝüü˙˙˙öŭ˙îñ˙˙ò˙ÓŻ Ċŝ˙˙˙˙˙˙˙ŭ˙üö˙˙˙˙Ŝö˙ŝŝ˙ĝôú˙˙˙ò)÷ï˙ù˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûúû˙˙˙úöĝŝ˙û˙ġùëŝ˙˙ü˙óùŭŭŝ˙˙˙˙˙ŝüüüüû˙˙üŝ˙ŝŝ˙ŝü˙˙ûü˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ü÷˙ġ˙ó˙˙úû˙˙ŭŭùŭ˙úû˙˙ûú˙˙˙˙˙÷ŭ˙ú˙˙˙˙˙íŝ˙ó˙˙˙˙ñ˙˙˙˙˙˙ŭè˙üú˙˙ŝŭ˙˙˙˙˙˙˙˙˙û˙˙˙šŸŝÖ˙˙˙ô˙ĝôŝ˙˙ŝ˙˙˙÷ü˙ûî˙ñ˙ŭ˙˙˙˙˙÷˙ĝè˙˙˙˙˙˙˙˙ûŭ˙ŝ˙û˙ö˙˙ġ˙˙÷˙ó˙ġ˙˙˙˙ôŭ˙˙÷÷˙˙ú˙˙˘!!%ŭĝ˙˙˙˙˙˙˙˙˙Ò˙Ğ! Ëû˙˙˙ùŭ˙öĝ˙÷ŝ˙˙üü˙˙î˙˙ŝ˙ŝ˙˙üü˙˙˙üùú˙È ›˙˙˙ŝîûÊÜó˙˙ï˙˙÷˙ñ˙ú˙˙˙÷ñ˙ÚÚ˙˙˙ĝĝ˙ûô˙˙˙˙˙˙˙˙˙ù˙Ħ " "#+˙ġù˙öĦ# ŝ˙˙ö˙˙Ìû˙ûóġ˙˙ŭ˙â˙üâ˙˙òÔó˙ŝúĜï˙˙ùú˙ŝ˙˙˙˙˙˙˙üù˙˙˙ñû˙˙ä˙˙˙í˙˙˙˙÷ġ˙˙ô˙˙˙ë˙ú˙ĝ˙˙˙ó˙˙˙ì˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙˙Ëġ÷˙˙˙˙˙ŭÏŝÓ"ùí˙˙ò˙˙ïŝ˙ĝ˙ü˙—û˙˙÷˙ŝ˙ú˙Ğ ˙ù˙ù˙ÊÇ˙ú˙ôï˙˙òŝï˙ç˙˙ô˙˙˙ïŭ˙˙ñèÎ˙˙É˙˙ñ˙ŭùÖğB™ŝġù˙ù% ŝ˙ûúï˙ĈÒó˙˙ÓÍÔÑÔÓè˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ÊÚÔĠÓ˙´˙˙÷ú˙êûûí˙Ġĝ˙ûĠ˙˙˙˙˙ù˙˙˙˙˙î˙ö˙òž#0Ä˙÷ĝüĝ˙˙ù˙ŝ÷˙ĉ˙"Ñ˙öó˙˙ż*Í÷˙óö˙û˙ŭġ˙˙˙˙üŝ˙˙é÷Öêò˙˙ŝŭŝ˙ŝ˙˙˙ù˙Ñ" ˘ôóŜ ˙˙˙÷˙˙ŭ˙ô˙˙ġ˙˙ŝ÷˙˙˙ŭñĝ˙˙˙ŭ˙˙ü˙÷˙ô• !Ħ˙ôû˙˙˙ŝŭ˙˙ñô˙˙ö˙˙˙Çŭ˙ùî˙˙úù˙˙™˙ċ÷˙òûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙˙ŝúĝû˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙˙˙˙ŭ˙˙˙˙˙˙˙û)Ĝù˙ùŭ˙ú˙˙˙˙ë˙˙˙üûŝ˙˙˙˙˙˙û˙˙ü˙˙ü˙˙û˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ŭĝ˙û˙ö˙˙ĝ˙ù˙˙ú˙ŭŝû˙˙˙˙ûŝêûúôŭ˙˙˙˙ġ˙˙íù˙ŭùŝ˙ñŭô˙ŝ÷˙ûùùŝ˙˙˙˙˙î˙˙˙î˙˙˙˙˙˙˙˙˙ó˙ô‘ .!üĝò˙ĝó˙˙ûŝŝû˙˙˙ö˙˙ì˙˙Í˙˙ŭñöŭ˙ò˙ŭ˙˙ŭï˙ö˙ġö˙˙˙ŭĝ˙ì£ Ûŭ˙˙˙û˙÷Ĥ&ާ˙é÷ù˙ŭ˙˙úü˙˙˙ĝ˙Ô˙˙˙˙˙˙˙˙˙ô˙ù’%Ĉ˙ŝüùĝ˙˙ü˙˙˙ú˙˙î˙˙˙˙˙ŝû˙ú˙˙˙˙˙˙˙ú˙ŝó  šġ˙ċ˙˙ŝö˙çġ˙ûî˙ċ÷˙ûġ˙ġ˙û˙ܨ£˙ġŝ˙˙˙ûú˙˙˙˙˙˙˙˙˙˙-˙ + ˙˙ŭ˙˙ó%# ô˙˙ŭĝ˙ŭü˙˙ŭüü˙˙˙˙˙˙‘£Şôù²™ĤŻû˙üŭ¤˜§—Í˙ò˙ŭ˙ìİž˙ë÷Á·Ğ”˙˙òùŝ˙ùò˙ü˙˙ŝĝá—–ĵ˙ú˙ö˙˙˙˙˙˙˙˙ù˙ŝûȝ™ġ˙ó˙ó˙ŝ˙¤! ä½ĝĝöŭ˙˙÷ü˙ŭ˙š˙˙û˙˙òŭ˙ë˙ Ĝüû˙˙ŝù¤ĤŸ Ñû˙çž'Ħ!”˙àô˙÷ûÌ˘'ĈçÀŠ£˙˙ü˙( §˙ü˙˙˙˙+˙ûĝ²šŻ ³™à˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ì˙úŻÑ˙˙Û˙˙ŝ˙žħ–¨ŝÖħ§ù˙˙˙˙ùôú˙˙ġ˙ŭ˙ĝ˙˙˙˙ĝûò˙˙˙˙à‰!'™û˙ŭ˙üÓ ¤˙Ö¨˙ñ˙˙ë˙ô÷ü˙Ϝ³‘è˙÷˙˙˙˙˙ŝŭŝ÷óŝÓĴ˙ú´$öŭöû˙˙˙î˙ì˙˙ì˙˙ó˙úü˙˙ġôûġôú÷ö­Ċ˙˙˙& Ğúéô˙˙ŝûŭ˙úŭ˙ŝö˙ŝġ›ŸĦ˘˙÷ġ˙˙˙" Öûòôú˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙ŭö˙ŭ÷òöŝŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüĝöü˙üüúĝŝ˙˙û› ˙ŭĉ˙ô˙ö÷ŝù˙ŭ˙ŝûŝ˙˙ŭöú˙÷ë˙˙ö˙˙ö˙˙ë÷˙úòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙ö˙˙˙÷ú˙˙ï˙˙ù˙ĝ˙˙˙öö˙˙˙˙˙üŝ˙˙ñ˙˙˙ô˙Îú˙ó˙öù˙û˙˙˙˙˙ĝ˙˙÷üöú˙ŝ˙ùŝû˙˙˙˙˙˙˙˙˙˙˙úô½ùû˙í˙˙ì˙˙˙ûŭ˙˙ùúŭŝİä˙üĝù˙˙˙ì˙˙ġ˙í˙˙ï˙˙˙ó˙ü˙Ĉ­› •# ĵú˙úê˙ÇĤ 3ŽÛ˙ù˙ĝ÷˙˙貍´‘+˙˙˙˙˙˙˙˙˙˙ù˙¸ #£ż§˘ŞĊñ˙˙˙˙ž¤Ħ˜Ĵ˘­˘¤ĦĦ òŭ˙˙˙˙˙ŭ ˙À˙Ĥ!˙ë˙˙úû÷۔$" ˜˙˙˙˙ġ˙˙˙˙˙˙˙˙ġ˙—ž˙¸ "“ü˙ö+È !·û˙˙îß 7Ò˙ö˙Â% "Öú˙ñ " "#Ġ˙ĝÚ˙ü¸ ) Öî˙ŝÈĴ/—÷˙˙÷Ĝ'#(Òúé˙˙˙˙˙˙˙˙˙˙çÒ2£ż˙˙è˙œ˘!Ì˙˙ŝû˙÷˙ŭŭ˙ž!Ĵ Ԓ,ŝ˙ü˙˙!ŝ˙˙  £˙˙î×#".!ï˙˙öĜ%- "Ċ˙ġÊ˙” #ñĜöĴ1"›' Ïġ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙èàŸ.ĝ˙˙ü˙™*  ’˙˙˙ú˙˙Ż$ ˙ô˙úġ˙˙ü˙ŝüü³'˙˙úĜ  &,Ĥ˙˙˙ïĝ˙ô¨–Ġûùü˙˙ŝü˙˙˙÷̝. -Ù˙û˙˙˙˙îĜ¤£Ÿ™Óü˙é˙˙.ħĦ !žÓîĠ$Ôòĝ˙˙ŭûŭ˙ŝù˙ò˙˙…&$  Ï˙ġ˙   ¤%£˙ùûŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġßÍ˙˙üöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝÙÊŬú˙ġÚÌÚó˙˙­ô˙˙÷˙ŭ˙Ôö˙ŭ˙˙˙˙˙ġßÍÙòÛÓŝ˙ó˙˙ó˙ŝÓÛòÙÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙êìÊ÷ÙĝÏĠù˙ËíĜöÒŭ˙÷ÖÖ÷˙ŭĝ˙ù˙ù"•"•˙ĝ˙Ê"™'À˙Ê&œû˙÷ד)˙˙˙˙˙˙˙˙˙ö˙˙ĝ "–²è˙˙ĝ˙˙ùÏ­ '˙ô˙ŝÇ%¤#¸úĝ˙˙ĝ˙Ӗ!#˙˙ï˙˙û"£¤›!Ê˙ŝŭŭà‰* #Öü˙˙˙˙˙˙˙˙˙˙ô–&#  *–˙ŝŭù#•Üñ˙˙ŭü˙˙˙ĥ& " £ÒŭùÙœÒĤ"' ˙˙ö˙˙û¨İ˘˘*ü˙ù÷˙˙˙˙˙˙˙˙˙˙Ê˙÷˙“6 §˙ù˙˙ŝ˙üŝ˙!Ĥ˜˙ŭŝÓ˙˙µ'žŸ™# Ïô˙üû˙ϙ& Ï˙˙ö$" û˙ĝüœ˘˘ ü˙ó˙˙˙˙˙˙˙˙ú£Ÿ"'›˙Ġù% ˘˙ûú˙ġü˙˙ùü˙ + #  %ŝü˙˙ġâ$˙÷Ӝ ˙ù˙˙ú˙ü§ (Ñó˙ü­˙ŝ˙ú­Ü÷˙#Ôĝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŭž˙ŝÒÎĴ "!!"" ŭġ˙ŭ£ ( $(Î˙˙÷˙˙ĝ˙÷˙ŭŭù  !Ìû˙Ê"İ &œ˙ñ˙˙ò)šÌÓĦïîôŝ˙ŝŝ˙˙ü˙È" ˙ü˙ġ˙˙˙ñ$ú˙˙Ÿ '!˜ŝ˙û ˘ü˙˙˙˙ŝŭŭŝ˙í˙ŭùÄ0 %š˙˙˙"û˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öĠ™ŸŸ˘œ§û§š› ÚûÎ˙üŭ˙úŸ›²•ŻÈ˙ŭ˙÷ûܞ ¨£˙ú  ! Òŭ˙—+ Î˙ŝö˙ŭÉ& ¤Ċûŭù˙Ö-˙˙˙˙ñ˙˙ó˙˙ó˙ġĤ˙!!žú§Ĥú÷˙ŝ֟! Ĵ˙üšİ#ÎñÜ#—–%Öù˙ñü˙˙˙˙ĝ˙ġŸ§úġ˙˙ĠĦ Óú!˙÷˙Œ û˙˙ñԝĝ˙ĝĦ*Íñ˙˙˙˙$î˙˙ġ#$ĝû˙Ž ó˙)!Ê˙˙˙˙˙˙˙˙˙˙ö˙ &Ôç˙ú˙û& Ú˙•#­˙˙˙˙˙˙˙˙˙ú§,Ĥŭŝŝ˙˙ùÍÇ˙üĠ#Ÿ˙˙ö˙ÏĦÔü÷˙™)ş˙˙üŝ˙˙˙˙˙˙˙˙ù˙˙œ˙ŭ˙ , Ë˙Ì!ġö˙"Şùú˙Ö˙˙ï¤&Ôü˙˙˘žĦ£Ï˙÷İ#¨÷˙Ôŝ˙ôß$ĝ˙ŝó!˙ġ˙ûÔ- ÷˙î•+÷˙˙÷˙ôŝ˙ŭö˙˙í˙ù$›Ç˙ù˘úù˙Ÿ˙˙˙˙˙˙˙˙˙˙ŭ÷ú,  Ŭ’üܞ˙¤ ­˙û˙ö˙üù "ûù˙˙%ö˙˙ŝÔ ,ŭ˙ ÜÇ˙˙ ˙˙˙˙ŭ˙˙˙˙ó›˙ı#'ï˙ü÷˙÷ŝ˙üü˙˙ó˙˙˙˙˙˙˙˙˙˙ü˘˙˙˙ŭñ˙" ˙˙£ŭüû˙Êŭ%ó˙˙ŝû˙˙ó˙˙ó˙ġĤ !–Ĥûŝ˙Í Ï۔%ŭĝ˙ûÍ)Èùè ˘ô˙˙˙˙˙˙üûü˙ô&!+ È÷˙ó˙ŝ˙•! İùßĝ2&˙˙ô$!˘Ñ˙˙˙˙˙˙˙˙ô˙ŝí& É˙úöÖÚÓ*˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Í "$ " Ú˙ì˙˙ż³+ ˙˙÷2  ˙Ħ7 ü˙ŝĦ#ĵû˙ĝë5&ôÔġĠ&˙ù˙Ϥñ˙ü˙ŭ˙ö˙˙ù˙˙Í%  Ĝĝ "˙+!Ç˙˙ûÔï˙ñ˙Ĝ˙˙á–$ 'Ž˙˙"˙˙óÎ&&óúŭ˙˙ġ˙˙ŝ˙û-œö˙ô˙˙ћ˙˙ô,&ġ˙í×ĴÏşċóô˙ÜÊ˙ŝ˙ŝĊÎ˙ĝ˙çÓ §˙ùÇŞ !‰˙˙Ĉ"ù˙û˙Ĉ*ùŭ˙˙˙˙˙˙˙˙ü˙˙š /÷˙˙ĉġ°"È˙˙ ,íġ¤ ù˙˙˙˙˙˙˙˙ô˙˙ž ˙˙˙˙ëŭ˙"Ö˙÷˙é˜˙ò˙É ,ĥÏ $ ²ñĝ˙˙˙˙˙˙˙˙˙˙˙úùÌ˙˙ú# û˙˙˙˙Í˙˙ò˙š Òĝ˙˙Ì*+Èĝ˙˙÷ŝ!Ô˙é˙˙ô˙–,ĝ˙˙˙è' Ìŭ˙˙ĝ&òû˙˙Â#$˙˙ú˙˙›$˙ê˙˙˙˙ñ˙ ˙ŭ˙ñ˙˙ü˙ü˙•ü˙˙ÖÌİ#óŬŝ™ +ûŝ˙˙˙˙˙˙˙˙˙ò˙˙§Ĝí˙˙÷˙˙˙ş#!˙÷˙÷˙ŭ˙)Ï˙˙˙”Ġô˙˙˙™1  §˙ûĤ˙˙ûú&!ŭ˙˙˙˙ŭ˙ -ċ˙˙ñ˙ÔÑ˙Ġ˙ôŭà$˙ü˙˙ŝ˙÷ŝ˙˙úû˙ŭ˙˙˙˙˙˙˙˙ĝ˙Ï!Î˙úÒ!­ô˙˙˙˙•$˘˙˙ĉĝ#%&“˙˙˙‘%Ġ˙˙Ĉıŭûû˙ü˙ö˙˙ù˙˙Í #÷Úż˙˙˙˙*ï˙ô˙²İ˙ù˙$' &çòûüü˙˙˙˙ûû Ò!ŝ˙û˙è˙Ò ÙÊË- ˙ġ˙ê“  ”ÓÄÔüŝŝ Ċ˙˙˙˙˙˙˙˙˙ûǵ /˙˙˙ŝ˙!š˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ !"# ˙ŝ˙˘(•ŞĞ ˙˙ó˙¤"!³Ó˙, Íġ˙ï֖ :ô˙˙ï˙‘›ì˙Î˙0Ÿ˙˙ ¨¨Ì˙¨ "Ĥ˙ì˙˙ùŝû˙˙ŝ˙˙ö˙,Çî˙˙Ï"Ïî˙è Ñ˙ŝ˙ó) ¤šŝùò˙¨!‹İ ħ›˙˙Î%,™ŝ§ +Ž˙˙ĝúŝ˙ûŭ˙ŝ˙ô˙˙ ˙ô˙Ï!˙Ÿ(˙ü˙È˙˙÷ġú# ŭ˙˙Ñ˙üúŭ˙Óüĝ˙˙£ "ž' œ˙ĝ˙—!Ċ˙˙ŭ˙ŝȧ˙ŭ˙˙˙˙˙˙˙˙˙ŭúİ ˙÷˙˙˙Ô˙ŝ˙¨Á˙Ç˙˙˙˙˙˙˙˙˙˙ĝġĊ˙˙˙ì˙ûú!ŭċ˙˙ï¸! ˙ŭîÚ #Ġ˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙“˙ŭ˙” ( ˙˙ëúġ˙ûù˙ĝĠö˙˙ìĝ˙ Ú˙ŝïú—÷ü˙˙ŭûÊÔ˙˙ġ˙˙™˙˙˙ŝ ½ŝ˙üú˜ ˙ċù˙˙•)˙˙é˙.ĦŸÒ—­¤ûú˙ú˙ûì˙˙ô¨Ïŝ˙ùóüÙ¸ñ˙Ó$˙˙˙˙˙˙˙˙˙˙˙÷˙˙òĜö˙úñ˙Îĝŝŝħ˙÷˙ŭŭûŝ éúùêħ¨˙˙è˙ &Ì˙ŝ˙Í&!‚˙îŝüÖ ˙˙˙˙˙ŭ˙µ˙ûó˙˙ûùŸ“˙ï˙š"š˙˙ñĝ˙ò˙ŭ˙ĝ˙ûû˙ŝ˙˙˙˙˙˙˙˙ü˙ì˘ùùùÁİ* û˙üìü ,ü˙˙˙Î# Í˙˙˙#ŝ˙úç˙â‹˙ŭŭ˙ŝŝû˙˙ŝ˙˙ö˘#è˙˙˙ŭ˙ü' š˙Ë˙˙™&‘˙˙  %×ôû˙ŝüŝ˙˙˙ŝ˙ò§˙˙Ĥ ˙ó˙ü˙ùġ֟Ġî˙˙Ĥ+ŝ˙í˙ŭ§&˙ñ˙˙˙ü˙ +Ë˙˙˙˙˙˙˙˙˙˙˙Í $š˙ùù˙˙!$Ÿûï  ŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙Ġ+-%Ĵöĝ% Ċ˙ó˙,èŝé˙ĝ)!˜˙Âġ÷ó˙˙ö˙˙˙˙ï˙˙˙Ħ î˙ó˙›). $ !ü˙ +˙˙èú²˙öŝ˙ûúŝ˙˙˙˙ŝŝ˙÷˙'Ĥ˙˙öü (Ï˙ûô" Îġùġŭĉ" " ˙˙ŝüʔ˙˙˙ñì˙ùß "1ċë˙˙˙ú˙úù˙û˙˙˙öĝ˙§Ğĝŭü˙*ž ,—˙÷ġ˙˙˙ŝ˙˙öáĦ˙ù  )$ġŝ˙˙úƒ˙˙î ™!"¤˙¤˙ŭêµ Ġŭï˙˙ó˙7”ġÒ˙˙˙˙˙˙˙˙˙˙´ ŭ˙ġ˙ñôû˙÷(ĤûÔû˙˙˙˙˙˙˙˙˙û÷ĵ öû˙üú˙˙˙˙ùߐ˙Ì˙-˙Íùŝß˙ŭ˙˙ĝ˙˙˙˙˙˙˙˙˙˙ñ˙˙&˙ŝü˙'ħì˙˙ùù˙ö˙˙ĉ˙ï÷˙˙!(˙Ċû˙˙˙™0ĝŭúîü˙Ó ˙÷ĝ˙ï˙Ğ ˙˙ú˙°˙˙˙é µó˙˙ï˙Ê $Ïü÷˙ôĤ 'šĜì˙˙÷ŭ˙ŝ˙˙ĉ¤ òŭôü˙ŭú Ž˙˙ŭúò˙˙˙˙˙˙˙˙ú˙ĝöé×ĉû˙ŝ˙û˙˙ú ˙ö˙˙˙˙ŭ²˙˙ĜÂ("°˙ä˙˙ê/˙í˙úÍ 2£ġ˙˙˙˙ ˙˙˙˙˙ŭ˙˙üü˙÷ü,˙Ë%Û˙÷˙˙˙˙ú˙˙ó˙˙óü˙˙˙˙˙˙˙˙˙ŝ˙˙ŭ˙˙ú˙ħ²í˙˙ŭû$)–˙îñ˙˙&˙ûĝè"˙ü˙˙çɘ˙˙ŭ˙˙ŝ˙˙˙˙ŝŝ˙˘˙÷ĝŝ˙ŝ˙) #Ç˙óúò× Ŭô˙Ċ$Î˙ÑÛŭó˙˙˙˙ŝüüü˙˙üè Ç˙üġ¤ÔĝÔ˙öú˙˙ûŝñ˙ġüœ2ŝ˙˙ċ˙Ú ¤˙ŭ˙öö˙ĝú+òŝ˙˙˙˙˙˙˙˙öñ×/ Ìŝ˙˙ŝôÚ"Ĵ÷˙˙§  ŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë  !+ !ŭ˙Ï˙˙ŝ˙ï" ˙˙˙öü(£˙û˙ê˙è˙ŭüġñ˙ĝ˙êû˙˘#ûŝ˙ô¤  "/˙ŭ¤Ŭ½ÖŜġ˙˙ï˙ùú˙˙˙üŭ˙ü÷˙˙˙ '›½˙ò˙ (ŭŭ˙˙û˙˙˙ü—ÊړŬΊÚÈ˙ó˙˙˙$İïöö˙Ġ˙úœ £ÚӓÙҐÉÓ˙˙óûŝú˙˙ü˙˙˙"ùë˙÷ŝž ˙˙˙ž œÁÉܤ°ż˙úü˙˙ñûúÌÊİ˙ŭ˙¨ ĵ˙÷˙˙˙È Ż˙˙˙,˙ó˙˙÷˙˙˙˙ŝġÜÔ˙ö˙˙˙Î Ğö˙˙˙˙˙˙˙˙˙˙÷ŭ# ˙ŭ˙˙˙˙žÊ˙ú˙˘&Á# Ĥ˙Ò˙˙˙˙˙˙˙˙ô˙˙´!ŭû˙üú˙˙ ĝŭ˙ĝ˙¤—ö˙ó+˙˙˙˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ġ ŭ˙˙˙˙ 0Êûóî˙(ö˙ûü˙úô˙˙ûÒÎ˙÷˙˙î˙˙÷˙˙ŭÍ#.Ç˙˙ì÷˙×˙ŝŭ˙!°˙ŭí˙Ğ ï˙ü˙˙˙#(˙˙˙ûÊ"˘ó˙˙˙ġùŭŝ˙Ü#Ú˙ù˙ŭ˙ü%œ˙˙ù%§˙˙˙˙˙˙˙˙˙˙ô˙˙˙Ĝ $Ç˙ü˙ûĝŝġ˙×&Ï˙ĝŭ˙˙˙˙˙ëñ˙  Ħó˙˙ò˙ ŭ˙ŭûŬ  •˙Ç÷˙ĵ(Ĥ˙˙˙˙˙ŭ˙ëû˙ŭü˙œ˙£žûüö˙ïí˙˙ĈĜËġ˙˙˙ù˙˙˙˙˙˙˙˙˙˙ŝŬŝó˙êÓ °ĝ˙˙î˙¨˙˙é˙í˙˙˙ÛÎ˙˙úŭŭ˙˙üŭ˙ü÷˙ îûü˙ŝü˙ ×ì˙˙˙—!üġú"!Öô˙˙üôö˙˙ŭŭŭŝŭüŝ˙ù˙˙ċ×ĝ˙˙ô˙ï˙÷˙˙˙ûú˙˙˙Èò˙úï˙˙ĝË Û˙öù˙˙ĝ˙Ĉ"#˙ù˙˙˙˙˙˙˙˙˙˙Í"Ò˙˙ó˙ΐ˙Îò™"Ò˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ş˙ & .šµ.û÷ó™˙ü˙ùĉ ˙ôŝ˙+Ìù˙ġòö˙ċ˙› ˙˙˙÷˙˙ŝñ˙•˙˙üÊ  ˙˙ġ˙ùûöâ˙˙úŭ " &‚ ĥïŭ÷ù˙÷˙˙û˙˙˙ú˙˙ä˙š ˙˙ı"Üù˙˙š²˙èû˙ù,˙ô˙ü˙˙ö˙˙˙öġĝµ˙Ò˙˙˙ô˙4›ŭüġ˙ŝ÷˙˙â˙ù˙˙ûò˙ú˙ŭ"˙˙˙ü˙ó)%#ĝŭêĞ˙˙ä˙÷ú˙˙ŭ˙ì˙˙ĈŻ !Şú˙ț%Ö˙˙˙ú˙ÖŸüúú›$ġŝŝġ˙ô˙ëö˙˙˙ôüŭ˙­ö˙˙˙˙˙˙˙˙˙ŝ˙÷š% ŝìŭ˙óóŻÒêú˙•)$  ŝüġ˙˙˙˙˙˙˙˙ŝ˙ú™)˙˙˙ì˙ûú! ˙ġü˙˙ ˙˙òùì˙˙ŝ˙òó˙ñûŝ˙˙˙˙˙˙˙˙˙˙˙÷ù$Óŭúĝ˙!¤÷˙ú˙˙˙ù˙üġüğ §˙ŭ˙˙ôúôŝŝ§˙íŝ˙÷÷Ížġ˙˙˙˙Î˙˙ŝ˙Ċ˙˙û˙$ŭ˙ŭ˙ûó&ú˙ä˙˙˙ĝž(#£ëÙġö˙˙ú˙ß!öò˙û˙ö!˙˙˙¤ $›ó˙˙˙˙˙˙˙˙˙˙ġ˙˙Ê Ŭô˙òù˙ġŭ˙ĝ’! Î˙˙ŝüü˙ôï˙˙ú1˙ñŝ˙˙(§˙ò˙˙Ò &"÷˙˙ŭĝ& Ñú˙˙˙˙ŭ˙×˙ĝ˙û˙ò˙ Úü”žŭ˙û÷˙˙ç÷,Ŭìú˙˙˙˙˙˙˙˙˙˙˙˙ü˙  " '˙˙ŝ˙ÔĦ˙ö˙ĝ˙–"!ġ÷˙!&£ĉ˙˙ò˙Áù˙˙üú˙˙˙û˙˙˙ú˙¨˙˙˙˙˙÷ù")˙˙˙ôó°Ğ˙˙˙Ÿ˙˙óú˙˙úöġŭúûŝ˙ŭŭ˙ù˙˙Ş#Ä˙ñû˙˙ŝ÷ĝ˙ö˙˙ŝú˙“˘ Öòó˙˙Ö'ŝĝ˙˙ċû˙ùÏ #*ï˙˙˙˙˙˙˙˙˙ùùܗ""ÑûÜĝ˙˙Ô$§ó˙˙ĵ Ñöôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙µ,"'Ĥ˙ú÷ŝ˙˙˙˙û˙ #Ü˙˙˙˙ŝ ˙˙˙˙˙ġüŭ˙ó˙úŭò˙˙üĤ˙ĝ˙ù˙Şí˙˙˙ò˙˙˙˙öŭ˙˙˙#)˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙íî˙)˙üŭÇŭŭ˙˙úû% Ĉ˙Ŭŭô˙÷ŝ˙˙û˙í˙ ˙ŝ˙ñġ˙͞İéèúó˙˙ü˙˙ööôŝ˙˙˙÷˙÷ş˙ùï˙çŭŒ˙˙ó% (—ÒÙ˙ô˙˙û˙ï˙àû¢#˙˙˙* ˘ŝ˙˙ù×'ġ˙˙§ŭ˙û˙˙˙˙˙ŭŝöŞ.˙˙˙öŝ˙Ĝ™Ûŝ˙˙˙˙˙˙˙˙˙˙  ˙˙˙ò˙ŝ™ü˙˙ö˙ #Ÿ˙˙ú˙˙˙˙˙˙˙˙˙˙˙ž˙˙˙˙ëŭ˙§úĠ˙ŭİ Ĵüó˙œ!)ü˙ñ˙ü˙˙˙˙˙ŝ˙ù˙˙˙˙˙˙˙˙ŝù˙%Íû˙˙˙!É˙ò˙˙÷ü˙˙ċà°–ö˙÷, ˙ĝ˙˙ĉû Š˙ŭù˙ü˙Ô$ ;‹ŭÖŝüû2Ô˙ŭŝù(˙˙˙ü*üĝú˙˙ ü˙ô˙ì˙˙˙À#*ûöŝ˙˙ù÷˙˙Ĥ'§˙ŭ˙ŭó˙$'˙ùï˙ œ˙ú˙˙˙˙˙˙˙˙˙ó˙ôħ  1÷˙˙˙˙˙Ƚ žç˙˙˙üúÜ!˙òĝ˙Ĉíä÷ŝ˙ú˙˙üÇ:Ċ˙ûú&+Ç˙˙˙˙˙ŭ˙Çŭŭ˙ö˙˙ŝȤ§$ ˙ö˙ûò˙ó&'œ˙î˙˙˙˙˙˙˙˙˙˙˙÷%"šÉÈ(—ŝ˙ĝ˙Ê –ó˙˙÷Êş- ˙ô˙˙ $&%ú˙ë˙öàĝü˙˙ŝ˙˙ŭŝ˙˙˙˙˙ġò˙û˙ûĝ ˙ĝ˙˙˙)ú˙˙Ë-Ñĝò˙˙é˙˙û˙˙˙˙˙ŭûŭ˙˙ñ) #˙˙û˙ñêü˙˙$˙˙˙˙-Í˙˙ôüÈ ‘˙û˙ñ˙˙˙¸˙˙˙˙˙˙˙˙˙˙ŝ˙˙¤$Éü˙˙˙ìÑ˙˙÷êó˙çòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ġ× ÎŭÔ˙ל˙î˙ùúÎŝ˙˘$£ġüġ˙ü˙ ú˙úŭ˙ûù˙˙ —û˙˙ŝ˙˙ú˙ÏÇ˙˙˙˙žÍ˙˙ŭ˙ó˙ŭï˙ŝûù˙Ó ™ŝ˙ü˙˙ŭ˙˙üŭ˙ûŝú˙˙&Ñ˘˙˙% É˙÷˙ŭú˙˙˙•˙÷ŭ˙ü÷˙˙ġ˙ö˙ŝ &ŝùò˙ùġ˙Ï˙ò˙˙ú˙ŝüúû˙˙ŭüü˙ú˙ö £ú˙˙ô˙ú%ŝ˙˙—Îú˙ŝ˙ü˙û˙˙ìĜ% ŝÖ%ĥġÏŭ— 1 ˙˙ò˙ü #û˙˙Ġĝ˙ûú˙ò˙ĝ˙˙  % ˙ŝ˙˙öš˘Ì˙˙˙˙˙˙˙˙˙˙ûŝ£—ûÇ˙˙ñ!!ì˙ŝö˙˙! ŝò˙˙˙˙˙˙˙˙˙˙ü˙¤Ëŭŝŝ˙˙ùÍ! ŭŭû˙Ê£)í˙˙Ï˘û˙˙˙˙úÔù˙ü˙˙˙˙˙˙˙˙˙˙ŝ˙úŭ˙ŭü˙˙ú˙˙ĝ˙$˙˙ŝ˙› ù˙ŭ÷˙Éúú˙˙šÒġ˙óù˙ŝ #Ġ˙˙˙&Ç˙ú˙ó %ùŝŝ˜ŝ˙˙ïù˙ŝ˙ĝžž˙ó×Ħ˙˙ŝ˙û˙˙î˙ĝ ”˙˙ú˙˙›Ï˙û˙ùÑŝ˙˙˙˙˙˙˙˙ùŝ˙ĝ£#˙û˙˙÷˙ĝ˙Ü#·ñû˙˙ù£ŭ˙˙!)˙úú˙ĝ˙˙ŭ˙§'Ŭñĝ˙˙˙˙˙˙ŭ˙ÚûŬìŭ˙ŝ˙˙Á*˙öŝü˙˙ĝ˙% È˙˙˙˙˙˙˙˙˙˙ĝ˙Ħ$™˙˙Ò"( ûúüݤ˙˙ü˙™!‘˙ÍùŞ  ¤Ġ˙Ò˙ÂŬó˙ŝŝ˙˙ŭ˙˙üŭ˙û# ˙˙ûŝûú˙ #ù˙˙ùŭ–ž˙û˙Î ü˙úù˙˙üü˙˙˙ü˙û˙˙%! ÑòÍ˙ŭ˙˙úœ&Ż˙˙$"Ñġ˙üË˙û˙ĠİûÓ˙û˙˙˙“! +ûú˙˙˙˙˙˙˙˙˙ŭô˙!ŭĝ˙ŭŭ˙˙ò˙Ûùô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˜#"ĤË÷˙ġ˙˙şòú˙˙˙ù˙ĊĈ˙˙˙ġŭÓ Ìù˙ùŝ˙ŭ˙—˙˙ŝŝ÷˙÷!Ĝó˙ü˙¨Ëĝ˙˙ŭù˙˙ŭ˙ġòß ô˙ŭûš" ˜˙˙˙˙˙˙˙˙˙˙˙˙ü˙ï˙# ˙úÍ& È˙ü˙˙ĝüü" ˙ùû˙ŭ÷ü˙˙÷û˙˙$§À˙˙˙˙ü !ŝŝûü˙òÄ˙ö˙˙ûŭ˙ŝ˙÷˙  Ħ˙ĝ˙˙ŝ™˙ó˙˙!˙˙ô˙ú˙ü˙ü˙(ŭĝ#—Ô˙ŭ§§˙ŭŭ˙!ÁŝÖ£˙ûû˙Ǖ²ËüĜ+¨ö˙˙û&˙óú˙˙ŭû˙˙ü÷˙ô'™ü˙˙ĝ£ĦĈ˙˙˙ù˙˘!Ĝ˙ú˙˙˙˙˙˙˙˙˙ú˙ü¤ŸĴÊĝöŬ )ë˙˙íáÊ˙óö #Ô¨—›!œ˙˙ú˙˙û˙üö˙˙Ĉ§š •˙ùŜ˙Ê$ŝ˙˙˙˘$ġŝÒœÌ˙ 'Èô˙š '”˙˙÷ŭ˙ú %Ħ˙˘Ç˙˙˙˙˜¤§˙ŭúÓ§ #ŭú!˙˙ü #Ġû˙˙˙˙˙˙˙˙˙Ş™ĝ˙˙˙Û˙üù˙Ë %!Ş˙˙˙˙˙˙˙˙˙˙“   œ˙ó˙˙˘ 'Ö˙ö˙˙ " Ħ #›Ó˙˙Ä'#ÛíÔ÷" Ġ˙Û  œ¤ûŭ˙( ˙ñ˙ĝù˙ŝüĠ ö˙˙üġ˙úú#(*ŭŝô˙˙˙˙˙˙˙˙˙˙˙!#Ÿ "˙˙§ Óŝĝ˙˙"“˙ôĈ-" -üúĠ!$’˙˙ô˙û˙˙˙˙˙˙˙˙&¤˙˙˙ĦÒĝô˙# Í˙÷Ï !Ġŭ˙§™˙˙˙˙˙˙˙˙ûùž* ˜Ġ˙˙ùûÒ. ˙û•!"—˙$ž§Òġ˙Ï›úûö˙üŭĈĞÛú˙˙˙˙˙˙˙˙ü˙˙úÑÔ˙ú˙Ñûŝ˙ûתĦŝĝ˙ñ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙! Ò˙˙˙˙ëİ˙˙˙%ġ˙˙3×ö˙˙˙ŝÔ˙ó˙üé˙˙Ħ"&òŝ˙ŭ˙˙˙ô•˙˙˙îžç˙é˙ŝÓĜĊ˙˙˙$Îû˙ùá 4Òċ˙˙ĝ˙˙˙˙˙˙˙˙ġ˙ö˙ŝ !ùüÇ ž˙˙ġŝ˙˙˙ İúËÊÙ²˜˙ġġÎ1Ÿ˙ġ˙÷ç"×áÀ#&Ŭ˙˙ôŝ˙ñ˙ù˙ŝ$)›˙ûΤ$ œ˙ŝö˘ Ħ×ĝ¤˘÷˙˙#"ѝÈ˙ŝ% Òʤ$"˙òÛ §$#ˆ˙˙ĝçËûó.% 'Úîŭŝŝ˙˙˙˙ñ˙ )ĈÔÔ£!Ĵ˙˙˙é˙ŝ˙÷& ùġù˙˙˙˙˙˙˙˙˙˙î˙ ›ċ#)ÂŝĤ!$ â˙ó%(%$#/ĵ˙˙÷˙˙û˙˙÷˙¸& .˙íĝ˙Ü˙˙ì˜" %** Ò˙¤'’˙ô›"#/ê˙˙ôï˙$˙òûĝ˙Ĝ%"(˜ġ˙Ğ ( ¤˙˙™4šÍ ˙÷÷˙˙˙˙˙˙˙˙Ê(Ë !£üè˙˙ , #˙˙˙˙˙˙˙˙˙ġ0 #- #òû˙¨ /!ù˙û˙Î) &!ó˙Ĉ#!§ġ˙Ĥ! )–˙˙ŝ&"˙˙!ê˙ï˙˙ĝ˙ç˙µ˙˙ü˙ŝ÷û˙Ï$Òĝ˙˙˙˙˙˙˙˙˙˙ĝû$*)˙·ö˙˙Ó-!›ü˙÷ . Ë÷˙˙˙˙˙˙˙˙˙˙%#ùò­ &˙˙" ž˙ö˙“+  "!˙˙˙˙˙˙˙˙1" * òÓ1 ­ŝ˙ ! +Ž˙˙ö&  ×˙˙èŜĞ™*‘˙˙˙˙˙˙˙˙˙êï˙ĉ#ĦÈĞʖ§˙˙ñ˙8 µÑ÷˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙¤% Ïú˙ĝüûÛ#˘óĊò´ ˙˙ñú Ò˙˙˙÷÷Ĵ˙˙î˙˙˙˙Ñ Ż˙û˙ġ˙˙(#"Ġó˙˙ßÊ˙Ùè˙¨˙ŭÏ ŝñ˙Ĉ2 ô˙˙˙˙˙˙˙˙˙˙˙˙ŭñŭ˙š&%˙˙ù•˙ŭĝ˙üġùĠ #&%'˙ù˙£" œ˙ü˙˙ö !#¤˙üóù˙˙ĝ˙ŝ˙Ñ˙óñ˙%˘ú˙í" $£˙ŝ¤ ! !!’ŝ˙ïÑĴ$ŸŬö÷ú˙Ç* Ŭò˙˙˙˙˙˙î˙˙˘ $ ! '£Ïü˙˙÷˙ŝó˙8û˙˙ġ˙˙˙˙˙˙˙˙÷˙˙ɧ $ +˘˙!˙˙Ç! !&ì˙˙ñ)$ Ĥ˙˙î˙˙óŭù˙˙ŭ˙öÑ- &İ Ÿ Ħż˙˙˙ϨĜùó˙!&›& ï˙˙¨ ”Ĝ˙˙ᘝ/‹âùú˙˙˙ì˙Ğœ%š ¤(˙˙ïŝ÷› .˜¨Ìî&˘§Ö˙ö )ä˙ŭĤ $˙ï˙˙˙˙˙˙˙˙˙˙ü˙Ÿœ! !Ĥô˙˙Ŝ˙"!  ˙˙˙˙˙˙˙˙ûüĈĦ¨Ÿ˜£•Ĥ™Ùü˙ñĞ% Ğ +´˙˙ú˙ï˙Ñ !Ĥ˘$Ĝ˙ġĤ!˜Şú˙óÊ "‘˙òí˙Ç#š÷ŭ&ŞŞ˙˙üŭ˙ù˙òĠ ˘˙ïĝ÷˙˙ò˙û˙ $%•˙Á˙˙˙˙˙˙˙˙ü˙˙™$'œ2Ĥ˙Ù'÷ŭĜ 0˙÷î˙˙¨(1 !! ·Öĝġ˙˙˙˙˙˙˙˙¤£ ˙˙§˘'ŞŸžû˙ °òŜü֙•Ô˙˙˙˙˙˙˙˙ $ ) ¤( $ &šúö¨$#"ħö˙× Ä˙ï˙É%  ˙˙˙˙˙˙˙˙˙˙˙ü˙ñԝ  ú˙ô˙ĝѨŠŞ˜˜´šô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġñĥ +Ÿ˙˙˙˙Í Œ˙˙˙˙Œ"ó˙Ġ &&˙ô˙˙"#â÷˙˙ûñ¨ ŝú¨)Ó˙úûż3  û˙˙¨˙Ĉ% Ş˙ġ˙üú˙˙˙˙˙˙˙˙ù˙˙˙ġ% ˙í˙ŝ˜ ˙òò˙ĝ˙˙˙ŝ§ (¨ú÷˙û#Ğù˙ùö˙˙½%Çû˙ôŝ˙ĝü˙˙öŜ# İ£ġ× ´éŭ˙˙ò )$Ħ˙ùŭ˙ĵ•Ğ% Ħòúċ˙Ô"£§ù˟- •˙˙˙óÁ´ #Ù˙ñ˙˙ŝû˙ĝ—š"£–)žÑ˙÷˙˙˙üŭ˙˙˙÷ġ˙ž İ Ÿ˙˙˙ñ˙˙ġ˙˙ġ ×˙òô˙˙˙˙˙˙˙˙˙˙˙˙ú˙Ñ —˙Ùûû˙î×Ì˙ò˙˙ŝË˙ÙĜÏ˙˙÷˙û˙ÁӍ&˘ Ĵ˙úîŭ˙úó˙˙ú˙˙ŝ˙˙ùóÉÉŝÓòù˙˙ġüôġ˙ġ˙˙íòËÚ˙ÂÓÏŭúá×ŝ™İú˙˙˙ëúÙÍ˙ĝ˙ĝââ˙Ô˙ù÷˙˙˙˙ĝġ˙û˙˙˙û˙úŭ)Òŝü˙˙ù˙ĈĜÍ˙˙˙üùßÍŭûé˙˙Í'˙Ġ˙û˙˙˙îÜ ŭ˙÷ŝ˙˙˙˙˙˙˙˙˙ó˙ŭŝĜ˙˙÷ġ˙÷˙û—$Ĵ˙˙˙˙˙˙˙˙˙˙ŝ˙ô˙ŝ˙˙˙˙Ĉ˙î˙í˙˙Ë"ȗЇž˙˙ùŭ˙ï˙üÖ'‘ö˙Ò­í˙˙ŬœÀ˙úöŭ˙˙”'ĦÌ˙˙ĝ˙˙- Òüŝ˙‡£˙ŭ˙˙ñ˙ġŭ˙ë˙Ĥ˙˙ŝ˙÷ï˙˙ż˙(!!Òò˙˙˙˙˙˙˙˙˙˙ôġ˙ÉÏú˙µ˙êÓÛË˙ġûûŭâÚüĊú˙˙óÔġÑ˙ËÑ˙ú˙˙˙żíÉĜüÑô¤™™Óöö˙˙˙˙˙˙˙˙˙˙˙èÚöÖ÷˙ï˙˙÷öÙ˙ŝú˙˙ï˙˙˙ÊÏ˙úĝ˙í˙óÈ›Ê˙˙ġ˙˙˙˙˙˙˙˙˙ĝÜÔÖÎ×ö×˙Ê˙ÔÇü %Â˙˙˙Üŭ°˜˙ë$ ˙÷Ò&1'—˙ö˙ü÷ŝáš˙ú˙˙˙˙˙˙˙˙ü˙ġû˙˙˙˙˙›ĝó˙˙˙ġ˙ŭ˙âü˙ñ˙˙ñ˙ġ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝÑ0Ò˙Ğ §Ŭ˙˙òñÒ­ñ˙Ğ !˙˙˙ ! +˙˙ööú˙÷ä ˙˙üš ,Ùò˙ú˙ÁŬŭ˙ôûô&$Şüû˙ï˙ŭ˙˙˙˙˙˙˙˙˙˙ü˙ĝ¤Ġŭ˙˙˙˙ÎĜ˙ó˙˙˙ûû˙ĉ˙˙•ŻÉŜŸÈ˙ô˙÷˙ĊÁښ̟ÉÍġ˙ùö˙â˙ÑÛŞ ĠĠûê˙˙˙˙ĝĝŝŭñöêĞÉ˙ûġ˙˙úŭÌöù˙òûöüŭ˙ÈáÀԔÉùí˙˙ĝ˙ٛŸ˙ïâ˙˙˙ù˙˙ġüû˙ö˙˙ŭ÷˙˙˙ŭ˙ù˙ŭóŭ˙öö˙î˙˙ŭö˙˙˙˙ú˙˙î˙ù˙óĝ˙û÷ŝ˙ŝûû˙˙˙û˙˙÷˙˙ò˙˙û˙˙˙˙òî˙÷˙˙ġ˙ŝÛ Ì˙˙˙÷˙˙˙˙˙˙˙˙˙˙ûíŝ˙ò˙÷úüù˙ï˙˙ù˙÷÷˙˙í˙ñ˙ö˙öĝ˙÷˙˙î˙ŭ˙òñ˙˙ŭ˙˙ĝĝ˙˙ŭŝúû˙˙û˙˙ġÔ˙˙ŝ÷˙ú˙˙ŝüü˙ü˙üñŝ˙˙ú÷˙ùôö˙û˙˙ô˙öù˙˙ï˙˙˙˙ŭ÷ùŭ˙˙ùĝ˙˙ü˙îö˙à˙ó˙˙6Ĉ˙Òíú˙ü˙˙ŭ˙úö˙ŭö˙˙û˙˙˙˙Ä˙ġ˙˙ŭŝì˙Ì˘Ċßûï˙˙ŝ˙˙˙˙˙˙˙˙˙í˙˙ĝù°Âëŭú˙˙í˙í˙ŬÉù˙üù˙˙˙˙˙˙˙˙ü˙à˙ûû˙ûöûŝ˙˙ŝúŝ˙˙üëÜ˙˙˙˙˙ôùú˙ü˙÷û˙˙ï˙òĝü˙˙˙öŝûì˙˙˙úü˙˙ñ˙˙ŭüŝ˙˙úüĝ÷˙ĝ˙û˙û˙÷ë˙˙óù˙ŭô˙ŭ˙ü˙öš˙ïú˙ñ˙˙˙î˙ݏ˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙í˙ú˙ûŭú˙˙úé˙ò˙˙˙ñ˙ñü˙ùù˙ĝ˙˙üîú˙ûú˙ŝŝ˙˙ŝüö˙˙˙ŭĜĝ˙˙ö˙ĝü˙˙˙˙˙˙˙˙˙ŭù˙˙˙ùûñ˙˙˙ŭ˙ġ˙ó÷˙˙ù˙˙ŭ˙ï˙˙˙˙ĝ˙ŝ˙˙˙˙ŝó˙˙˙˙˙˙˙˙˙˙ŝĝü˙úú˙ô˙˙˙ûñ˙ùġ˙ĝ˙ï˙ŭûìŭġ˙ü÷ž˙˙˙ñ˙“·˙˙ĝ˙˙˙üí˙üúü˙˙˙˙˙˙˙˙˙˙û˙˙˙ôç˙ñ˙ĝ˙˙é˙˙˙ù˙ĝóüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙‡İêŝ˙˙û÷ú˙˙˙ššĦÑóöġĴ ¨˙˙÷˙ ­öû˙ûĝŭ˙˙˙ĝ˙˙ç˙üúŭ˙˙˙˙˙˙îûû˙î˙ŭê˙˙ù˙ġ˙˙í˙˙˙÷˙˙–™£™ĞìÒúû÷˙ù˙˙˙˙˙˙˙˙˙ô˙˙˙ŝü˙Ç˙ô˙˙é˙ŭûß˙ùô÷ôŝ˙˙˙˙ú˙÷˙˙óü˙˙ĝĝŭôô˙˙˙˙ö˙˙˙ùŭ˙˙ä˙ï˙ìŝü˙é˙˙˙˙û˙˙˙û˙˙˙ñ˙öġ˙ô˙˙ġ˙˙ú˙˙˙ġ˙˙ô˙ú˙ûì˙ò˙˙˙˙˙˙˙ñ˙˙ü˙Îùŝ˙í÷ñ˙Ü˙ßûĝĝ˙˙ó˙˙ù˙ûŭ˙ùŝ˙˙˙ċ˙˙˙˙ôŝüù˙˙öĝùê˙ŝŭ˙˙ŝ÷˙ò˙˙ŝ˙˙˙ŝûúŝ˙˙ì˙˙˙û˙˙ŝë˙˙˙ö˙ûû˙ù˙òŭ˙˙ú˙˙˙˙˙˙˙˙˙úŭü˙˙úú˙ċ˙˙ŝ˙ó˙úôŭ˙˙˙ĝĝ˙˙˙˙ïŭ˙ùúú˙ŝ˙˙˙ĝ˙˙˙ŭôú˙˙˙˙˙˙˙˙ŭŝ˙ŭ˙ŭ˙˙˙ñ˙˙˙˙˙ñö˙üì˙ö˙˙˙úùŭ˙ôô˙˙ĝ˙ŭ˙˙óü˙ôú˙˙ŝ˙ġü˙˙˙ŭŭ˙˙˙˙˙˙˙˙ö˙ú˙÷û#Ìüŭ˙˙ö˙ŭġ˙˙˙˙˙ùŝ˙ŭ˙ŝŝ˙ò˙ú˙ú˙˙˙ù˙í˙ŝ˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙ôû˙ô˙˙ŭ˙ú˙û˙í˙˙˙ĝû˙ñ˙˙˙˙˙˙˙˙ô˙˙˙˙ĝúŭ˙˙˙óú˙ü˙ì˙˙ġ˙˙ç˙ûù˙˙ó÷˙ì˙ûè˙˙ü˙˙˙ġġ˙˙˙˙˙óó˙ôŝ˙˙˙ŭ˙ĉü˙˙˙ó˙˙ñ÷ŭ˙˙˙î˙˙˙˙î˙˙ó˙˙˙˙óŭ×&Ôò˙˙ú˙˙óû›% $Ç˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ò˙ĝ˙˙ü˙˙íû˙û˙˙ß˙˙ï˙˙˙˙˙ŝ˙÷ü˙˙˙é˙ìú˙ñû˙ò˙˙ì˙ŭü˙üñ˙˙˙û˙˙˙˙˙˙˙˙ó˙ĝ˙ëĝ˙˙÷÷÷ġ˙ŝ÷˙˙é˙ú˙ìú˙˙˙íë˙˙ġ˙öï˙˙÷˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙ú˙˙ü˙˙ç˙˙ŝ˙ŝ˙ĝó÷˙˙˙˙˙˙ûŭ÷è˙ï˙˙˙öú˙öû˙úé˙ûô˙úö˙˙˙˙˙˙˙˙˙ü˙ù˙˙˙ôü˙ù˙ö˙ĝŭ˙ŭĝ˙˙ü˙˙˙˙üŭòô÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙ċ' žï˙˙ñ˙˙˙ó˙˙ò˙÷ŝ˙˙˙˙ù˙í˙˙ù˙ĝú˙ö˙ô˙ŝî˙˙˙˙ġ˙˙û˙ïĝĝ˙ú˙˙ŝü˙í˙˙öü˙˙ñ˙˙˙˙˙ĝ˙ìó˙˙ĝ˙úû˙ö˙˙˙ûù˙˙˙˙˙˙˙˙˙˙ûĝ˙ü÷ĝñ˙ó˙˙˙ŝ˙ïü˙˙ô˙ñ˙î˙ô˙íĝ˙˙˙˙í˙˙ġ˙˙í˙˙ë˙ï˙ŝ˙öú˙˙ŭ˙˙ì˙ôó˙ŭŝûġ˙ŭ˙óŭ˙ò˙˙ŭġ˙˙ó˙˙ŭ÷˙ôŝ˙ŭüú˙ê˙ô˙ùĝ˙˙ùŝúúî˙ü˙ġ˙ŝù˙ò˙˙ġ÷˙˙˙î˙ó˙ŭ˙ü˙ï˙ŝ÷˙ó˙÷ŝ˙˙è˙ĝ˙ô˙˙úó˙ŭ˙ĝ÷˙ó˙˙ô˙˙˙üô˙ü˙˙˙˙˙˙˙üû˙óù˙˙˙óú˙ċ˙˙ġó÷ĝŭ˙˙ôŝô˙ ó˙ŭ˙ñû˙˙˙˙˙˙˙˙˙û˙˙é˙ŭú˙äû˙ú÷ô˙˙˙ñŝ˙ĉ˙ġ˙û˙ùúû˙ô˙òú˙öĝ˙ñô˙˙˙˙˙ù÷˙˙˙˙˙˙˙ü˙˙ôŝ˙˙û˙ò˙ŝ˙˙ù˙˙ŝ˙÷˙˙ûŭ÷˙î˙üú˙ìŝ˙˙ó˙üù˙ò÷˙˙˙ĝġŝ˙˙˙ŝġġŭöô˙˙˙óü˙ìċúü˙˙˙ò˙˙˙ö˙ù˙ŝĝ˙ŭ˙˙÷˙ŝù˙ŝŭüĝ˙ñ˙ü˙úġ˙ó˙˙ŝ˙˙˙˙˙˙˙˙÷í˙˙ä˙˙ŭúù÷˙ŝ˙˙ö˙ô˙˙˙ì˙˙˙˙˙˙˙˙˙˙ï˙â˙˙ö˙ŭüó˙˙˙ŭŝ˙˙ĝ˙ŝġ˙˙˙íë˙˙˙˙˙ô˙˙˙ç˙ü˙ô˙˙˙ĝ˙î˙ĝûŭ˙öö˙÷˙˙é˙ú˙˙ö÷˙˙üñ˙˙üùî˙ĝ˙ô˙ĝŭĝ˙˙ë˙˙ ü˙˙˙óŭ˙ġ¸4Ò˙ûġ˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙öŝ÷˙ü˙˙˙÷˙ù˙˙˙û˙òŭ˙˙ĝ˙ùùñ˙÷˙˙˙˙ê˙öüŝ˙˙ó˙ġ˙˙óüŝ˙û˙û˙˙˙˙˙˙˙˙û÷˙û˙˙û˙˙ú˙˙˙˙˙˙ò˙˙˙˙ŝ˙˙óŝö˙˙˙˙è˙˙˙û˙ïü˙˙˙˙˙˙˙˙˙ŝüĝôŭ˙˙ú˙˙ô˙ì˙˙˙ĝ˙ô˙÷˙ó˙˙˙ü÷˙óù˙÷˙˙ġù˙ü˙˙˙˙˙í˙˙ŭú˙ùö˙˙˙˙˙˙˙˙˙˙û˙˙ŭ˙ò˙˙ùŝ˙ĝ˙ì˙ŝô˙˙ŝô˙ŝġè˙í˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ï”(£˙˙üù˙ü÷˙ŭû˙˙˙ü˙˙÷˙Ùŭ˙ù˙˙˙˙˙ñ˙ŭ˙ŭö˙ŭ˙÷ò˙í˙˙ú˙˙˙˙ŭü˙ŝù˙üŭ˙˙ú˙ĝ˙˙˙ŝ˙î˙˙ü˙˙˙ö˙ŭ˙ġŭ˙ùġ˙˙˙˙˙˙˙˙˙˙÷˙ü˙˙ú˙ŝù˙úŭ˙˙ì˙ĝ˙˙î˙˙ü˙˙ŝ˙˙ü˙˙˙ŝ˙˙ü˙üŝö˙˙˙ŝô˙ĝö˙˙ò˙ŭó˙ŝ˙˙˙˙û˙˙˙ö˙˙˙ú˙÷˙˙ĝ˙ú˙˙ûô˙ùù˙ġ˙û˙û˙ö˙˙ŭ˙ì˙˙ù˙˙˙û˙÷ŭ˙˙ĝö˙˙ĝ˙ù˙ŝ˙ŭ÷˙ò˙˙ŝú˙ü˙ŝù˙ġ˙öŭ˙ü˙ûù˙ù˙ù˙˙ç˙˙ñ˙ĝŝüô˙˙ġ˙˙˙˙ùúüŭ˙˙ŭü˙˙ù˙ë˙ŭ˙ĝ˙ŭ˙ëŭ˙˙ù˙üú˙˙˙üĝž˙ûû÷˙ü˙˙˙˙˙˙˙˙ĝ˙ûö˙÷ŝ˙ĝ˙˙ŝ÷˙˙ŭ÷ĝ˙˙ñ˙˙÷˙ĝ˙û˙˙ú˙˙û˙˙ñ˙˙ù˙˙˙˙ôŭ˙ûû˙˙ĝŭŭùüŝû˙˙˙˙ûüŭü˙û˙ù˙ûüó˙ê˙˙˙˙ö˙ŭ˙˙˙û˙˙ùö˙ö˙˙ó˙˙ö˙û˙˙˙ŭü˙˙ŝ˙˙˙˙ï˙ù˙˙˙!Âŭ˙˙ï˙˙˙ì˙ú˙ŭ˙ü˙˙ĝ˙î˙˙ñ˙˙ù˙ú˙ù˙˙üï˙˙˙ĝ˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ö˙ü˙ŝ˙˙˙ó˙ŝŝúŭ˙ñó˙ġ˙˙˙˙˙˙˙˙ó˙ù˙˙˙ü˙ŭ˙ŝ˙˙˙ú˙ĝ˙úŭ˙ó˙ù˙ŝ˙ĝ˙ò˙ü˙˙ì˙ŝ˙˙ú˙ûúŭ˙ú˙÷ŭ÷˙ü˙˙ü˙ô÷˙ú˙˙˙˙ú˙˙ù˙û˙ĝ˙˙˙˙úù˙˙˙÷˙˙ö˙úù¨ù˙û˙ŭ˙˙û˙ ˙ŭŭ˙ûŝ˙˙˙˙˙˙˙˙˙÷˙ù÷ü˙ü˙÷˙˙ï˙˙ĝŭ˙öŝ˙ú˙˙˙ò˙˙ñ˙˙ñ˙˙ûû˙˙÷˙˙˙ù˙ü˙û˙÷˙˙ö˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙íû˙˙úù˙˙î˙òûü˙˙úĝŭ˙öŝ˙ú˙òñ˙ĝ˙˙îú˙ë˙ĝ˙˙˙˙˙˙˙˙˙˙û˙˙ŝ˙˙ü˙ĝ÷˙ú˙ü˙˙ĝ˙˙˙˙˙ù˙ĝ˙˙ú˙÷˙ü˙˙˙û˙ĝ˙ŝ˙ŭó˙˙ü˙˙ġ˙ġ˙˙˙ú˙˙˙˙˙˙˙˙÷˙˙ĝ˙ù˙ĝ˙˙ġ˙ŭ˙î˙˙ġĝ˙ŭŭò˙˙ö˙˙öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ $˙ŝŭ˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙öÙ!Ğûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷Ş ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙ç˙›+Èû˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüĊ˙Ŝ˙û˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙û˙™!Í˙ù˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ż#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ûí˙˙ À˙˙ĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙÷˙˘‘˙˙˙˙˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝż%+9ġ˙ĝ˙ô˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È-İ%œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙âŻ2˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŝ"­í÷ŝŝûó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ħ0¤´˙ûŭ˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙˙÷Üĵ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŭ˙˙ÉĠ Ġŝ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷œ&"$˙ĝ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ĝĝ˙˙ùû˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙ê˙˙û˙ŝĉ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§Ħ Ż›™Üü˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙â˙÷üÚ˙ŝ˙ì˙˙ñ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ù˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ĝŝúü˙ñâ˙÷˙˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ñċ˙öĝ˙ŭü˙ôü˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ûú˙˙ŭŝûô˙˙ô˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ö˙ò˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙äŭ˙˙˙ĝ˙˙ñ˙ûó˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ñû˙È˙˙˙ö˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙ü˙ú˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ï˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ü˙ù˙ġö˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙÷˙öû˙ŝ˙úü˙˙ù˙˙ġ˙ŝ˙ġ˙ü˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙üŭĝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ù˙˙ôü˙û˙üùĝ˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙û˙ú˙˙úĝ˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙ŝù˙ĝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙í˙˙˙˙˙˙˙˙˙˙ú˙÷˙ù˙˙ŭú˙˙ü˙ô˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙ŝŭŭü˙˙˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üù˙˙ò˙ŭû˙˙ùŝù˙˙˙˙˙˙˙˙ú˙˙˙üúŭ˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙ú˙˙ŭŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙û˙˙˙˙˙˙˙˙˙÷˙˙ĝ˙ŝû˙˙ŭ˙˙ŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ò˙û÷˙ŭ˙˙ŝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŝ˙˙÷˙ŭú˙ûŝŭ˙˙˙˙ŭŝ˙˙˙˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙˙˙˙ú˙˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙ùġ˙˙˙ŝ˙˙úüŝú˙˙˙ó˙ŝüġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ˙î˙óñ˙˙˙˙˙˙˙˙˙÷˙÷˙û˙ùû˙˙úö˙÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷üû˙ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ùü˙ù˙ù˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙ĝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ü˙˙û˙ù˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭö˙ûŭ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öûĝ˙˙˙÷ŭ˙ĝŝĝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú÷ûŝ˙üúü÷û˙ù˙˙úñ˙˙ŭñ˙ġóġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġú˙ë˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙˙ûò÷ŝ˙ġ˙˙ó˙˙˙˙˙˙˙˙ĝ˙˙˙ĝĝüŝŝû˙˙î˙÷ñ˙˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙÷üŭòö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭ˙ŝ˙˙ö˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûûüüŭŭ˙˙û˙˙ŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭ˙˙ú÷˙˙˙˙˙úĝñ˙˙˙˙˙˙˙˙˙ŝĝĝ˙˙˙ŭ˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙÷˙˙˙ù˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ï˙˙ñ˙ú˙˙˙˙˙˙˙˙ŭ÷ĝ˙ñ˙˙ŭ˙ü˙ŭŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ñúŝ˙˙ú˙˙˙ŭŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ìüù˙ŝ˙˙ŭ˙˙ö˙˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙öü˙˙˙˙ĝ˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙ŝùù˙˙˙˙˙˙ù˙ò˙˙˙˙÷˙ŭ˙˙û˙˙˙˙˙˙˙˙˙˙ñ˙˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙é˙˙˙˙˙˙˙˙˙˙÷÷˙˙˙˙÷÷ġ˙˙ù˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûô˙ġ˙ġ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙üĝ˙˙ûù˙úĝġ˙˙úŝ˙˙˙˙˙˙˙˙ŭûŝ˙˙úŭ˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙÷ö˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙îë˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙úúü˙˙˙˙˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöĝ˙ġ˙ô˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüúöù˙ŭô˙ŝ˙˙˙ü˙˙ûúû˙˙ŝ˙öö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷˙˙âü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ŝúŭ˙ü˙÷˙ûë˙˙˙˙˙˙˙˙˙˙ŭù˙˙ôô˙ŝ˙ê˙˙˙÷÷˙ûûĝü˙˙˙˙˙˙˙˙˙˙˙ô˙úù˙ĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ô˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙öú˙˙˙˙ŝ˙˙óŭŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüüûù˙˙ŭŝöŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙˙ĝ˙Ùôŭ˙ŝ˙˙˙˙˙˙˙˙˙ŝŭ˙˙üùù˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙ŝ˙ŭú˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙ö˙üö˙ûŭûŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙óĠ˙˙ŭ˙˙ùĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙Ŭ˙˙ĝ˙û˙˙öŭ÷ôü˙üúŭ˙˙˙˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ùö÷˙òú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙óŭ˙˙ŝù˓˙˙ö˙˙˙˙˙˙˙˙ù˙˙˙˙˙˙÷ĝ˙˙˙˙ôŝ˙û˙˙˙ġ˙˙ü˙˙˙˙˙˙˙˙ó˙ö˙˙ü˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝÁž˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙˙˙ġ˙üù˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úööü˙˙˙˙˙ú˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙˙÷ûüù§Ħ–Óó˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ú˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙é˙˙ü˙ÒÍ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ü˙˙÷˙ŝ˙˙˙˙˙˙˙˙úüöù˙˙ú˙˙˙ŝ˙˙ü˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝ¸˜™¤˘ü˙˙˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝöġ˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙î˙ö˙ġ˙˙˙ù˙ûûù˙˙Ĉ˙öŝö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùÄŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ò˙˙£"$’˙˙˙˙˙˙˙˙˙ü˙üôúúԣз˙ĝò˙˙ú¤ż§ŭü˙˙ü˙˙˙˙˙˙˙˙˙àĵĦ ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĉ˙˘)§˙˙˙˙˙˙˙˙ú˙ûüĵ4!ž˙ĝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ž™Ş˘ğ˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ûŭŜ˜¤%5—˙˙ú˙˙˙˙˙˙˙˙˙˙ÁĞĈñ˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙÷4Ğ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙É# ˙˙˙˙˙˙˙˙˙˙˙˙˙´­ù˙ú˙˙ù˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‹+Îû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷ŭ˙˙íÛ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŸŸ£˘)ĵ˙˙öü¤Ğ–&™ ˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù˙÷°ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝú˙À"!# $ö˙˙˙˙˙˙˙˙˙ú˙˙¤* #ó˙˙˙™Ô˙ŝû˙˙˙˙˙˙˙˙˙˙Χŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü Ÿ˙˙˙˙˙˙˙˙˙˙˙³  ù˙ú˙ŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ġŬÀĞ,˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙úö˙ÂÇ˙˙˙˙˙˙˙˙˙˙˙óŞ4,ĦöÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙Ë'š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙#!ž˙˙˙˙˙˙˙˙ŭ˙˙ù% "Üêċĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙™'#ù˙˙ŝġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ £š£—ú˙ò˙ñ˙˙í˙ü˙˙˙Ñ˘£›˘•¤£œĈ˙˙öü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙î˙˙úüû˙˙ŭ˙˙ŝ˙÷˙˙ŝŭ˙˙ûŭ˙˙ŝŭ˙ŭùû˙ŭ˙˙ŝ˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ó˙ġĤ!#˙˙òĝ˙Ì! ˙˙˙÷ĝ˙ü˙˙üŝ˙˙˙ŝ˙˙ŭü˙ûú˙ŭŭ÷˙ùó˙û÷ûô˙˙˙˙ĝû˙ó÷˙˙ó˙˙£˙˙˙ŝ˙öŝ˙ü˙˙ù˙ú˙ù˙ŝû˙ŭü˙˙ŭ˙ö˙ŝ˙˙Ôŭ˙˙˙ġú˙˙ù˙úŭ#" ŻĈ˙¤Öûü˙˙˙˙˙˙˙˙˙˙ü"˙üĝ˙ù˙ù÷˙˙ù˙ûú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ü˙ú˙ŭ˙¨ ˙ŭü˙˙ŭû˙˙ö˙˙Ĥù˙ŝġ˙ù˙˙ŭ˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙üû˙ġù˙˙ûûüŭ˙˙˙˙˙ûö˙˙˙˙ú÷ŭ˙˙ó˙˙îô˙ù˙˙ù˙ŝ˙˙í˙˙úŝû˙˙ûŭ˙˙˙ŭŭ˙üŝ˙ŭ˙ûŭ÷˙ġú˙ġ˙˙ĝ˙ġ˙˙˙˙ûŝ˙˙ŭ˙ŭ˙˙˙˙ŭö˙˙üŝ˙û˙˙ü˙ŝ˙ŝú˙˙÷ù˙˙˙ŭü˙ù˙ûŭ˙ô˙ĝ˙˙ôŝ˙˙˙ġ˙ñ˙ùü˙÷ŝ˙˙˙ùû˙˙ŝ˙û˙˙ĝ˙ùġ˙û˙û÷˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝġ˙íİ)ĝ˙ŝ˙˙˙ŝ˙˙˙ŭ˙˙í˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ŭ÷˙˙ñ˙˙˙˙ü˙˙û˙û˙˙üû˙˙ûù˙ùñ˙ŭÉ#Ñô˙û˙˙˙ûŭ˙˙ö˙™&÷÷˙˙÷˙˙÷˙÷˙ûú˙˙ŝ˙˙•$ !ó˙öü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ë" ž˙˙ù˙˙ĝ˙û˙ĝĝ˙'&òú˙ï˙üŝŝü˙ġ˙˙ĝ˙˙˙˙˙˙˙˙˙üú˙˙ġ˙ם!›Ò˙ĝ˙ĝ˙˙÷˙˙ù˙ù˙öö˙˙û˙˙ŝ˙˙˙˙ü˙ö˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î& *3-$Ü˙˙ñ˙ú˙˙úò÷Ĥ" ¸˙÷˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙ô˙˙˙÷ŭö˙ûŭ˙û˙˙ŝŝ˙˙ŭŝ˙˙üû˙˙˙˙˙˙˙˙˙˙úúŝ˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙˙Í!×ŝġ˙˙ô˙§ +(¤ŭñ˙ùŝ˙üù˙ñ˙˙˙˙öôŝ˙˙˙˙˙˙ŝ˙˙î˙˙ç˙˙˙˙˙üġ˙˙˙ô˙˙çô˙û÷¤- ì˙÷˙˙˙úöùüò˙ŝ˙ú˙ïġ˙˙˙˙˙ŝŭ˙˙ġó˙˙ž&ÓàĤÑû˙öŝ˙˙óġ˙ô˙˙Ĉ £˙ùÄ"˙˙˙ü˙˙˙˙˙˙˙˙˙ž (•òŝ˙ùôù˙˙üŝ˙ü˙˙ŭ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŝ˙˙ü˙íġ ž˙ú˙ûù˙˙üŝï˙úòœÓ÷ö˙˙˙˙˙òü˙˙˙˙ûï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ÷ù˙˙˙ú˙˙˙˙ġ˙ŭŭ˙ŝ˙˙˙ġ÷÷˙˙ûúó˙ġ˙˙û˙ġë˙ŝ˙ġŭ˙˙ñ˙ŝ˙ŝë˙÷í˙ëú˙˙ù˙˙˙˙˙˙˙ù˙ŝĝ˙ó˙ô˙˙ó˙ïû˙˙˙˙üòŝ˙÷íù˙˙˙ô˙˙ë˙üö˙˙íŭ˙˙íô˙˙ŝñú˙˙˙˙ŭŝĝ˙˙ü˙ġû˙˙˙˙ü˙ŝü˙íŝ˙ñ˙é˙˙ô˙÷ŝû÷˙ġü˙ô˙˙˙˙˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭòü˙˙˙˙ŭ( ˙ú˙˙˙ŭó˙ŝ÷˙ôĝ˙û˙ñúó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íĝ˙òŭ˙ġŭö˙˙˙üú˙û˙˙ŭ˙˙ïú˙˙˙˙˙÷˙ï#˙˙ò˙üùŭ˙˙˙˙Ùó¤"˙˙ŝġġ˙˙ĝŝ˙˙ô˙˙˙ĝúĜ‘$˙ü˙˙óù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›Ġ˙˙ùû˙ŭ÷˙˙˙È)—÷àġû˙˙˙ü˙ì˙ü˙ĝû˙˙˙˙˙˙˙˙˙ĝô˙ùÏ"˙ŝÓĊû˙óŝ˙ìü˙ĝ˙öŭú˙˙ŝ˙˙óù÷˙ŝ˙úúú˙÷ŝĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ċ  "‰ĝ˙˙˙˙˙˙˙ÒÑö˙ŭ˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙ü˙ŝî˙óŭ˙˙ü˙ŭŭ˙ü˙ŝüüŝŝüüŝ˙ûû˙˙˙˙ŝ˙ŭ˙˙˙úü˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙ŝ˙˙öö˙Ġ+ñ˙ü˙˙˙˙ĝÒĦ“˙˙û˙˙üŭ÷˙ĝ˙˙˙ôüú˙˙˙˙ûû˙˙ŭñó˙˙ïû˙˙ġġŝŭ˙˙ü÷˙ê˙ú˙˙˙ŭ˙ö‡$ !Úü˙˙ë˙ŝ˙˙öû˙÷ñ˙ĝ÷˙˙ú˙˙˙û˙˙úè˙úÖ¸˙˙˙ò˙˙ú˙ùùï˙úóú˙ĝĝŬ˙£ûï˙óŝ­ĵ˙˙˙ŭ˙˙˙˙˙˙˙˙úö˙ÉĦžĝ˙˙ŝ˙˙˙óûû˙˙üìñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ôüŝ˙˙í˙ĝ˙˙¤š˙ö˙ŭüù˙ñ˙˙û˙˙ĝËÎ˙ñ˙˙ó˙ġñ˙˙ĝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŭ˙˙˙òû˙˙˙ú˙˙óŭŭ˙ô˙˙ôòó˙˙ù˙˙˙˙˙ûó˙ïú˙û˙ûû˙˙ô˙ġ˙˙ü˙û˙ŭ˙˙˙˙˙ñö˙ŭë˙üù˙úġ˙˙ì˙ŝ˙ŭŭ˙ùĝ˙ŭ˙˙˙ĝ˙˙˙˙˙˙˙î˙˙ô÷˙˙˙˙ù˙˙˙úû˙˙ġ÷ú˙˙˙ùö˙˙˙ùŝŭö˙ù˙öü˙˙˙óġ˙÷÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭ÷ñùö˙ĝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ġù˙ŝü˙˙ñ˙ê˙ò÷˙˙˙ŝ˙÷˙úü˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙û˙úĝ˙˙˙˙úó˙˙ö˙òôŝĝ˙˙˙˙ûóùú˙˙˙ #Òĝ˙ŝû˙˙˙úù˙˙úÏ(Ħèû÷˙˙˙˙÷û˙˙ċ˙ĝ˙ô˙Î˙œ˙ŭúù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ Îû˙ŝ÷˙˙ò˙˙ôġ˙ ³ġ˙˙˙÷üŭ˙˙˙ô˙ï˙ò˙˙˙˙˙˙˙˙ñ˙÷˙˙˙„"Ÿŭö˙û˙˙û˙û˙ġ˙˙˙ĝ˙ü˙ŭŭù˙˙˙˙ŭú˙˙ü˙üúŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ÙÛ˘# )$×üûö˙˙ùû˙Ñ Äßüù˙˙ŝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝĝ˙˙˙˙ŝ˙ü˙˙˙˙ŝ˙ŝ˙ŝŭüŝ˙ŝŭŭŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝŝ˙˙éÇ5 ˙˙˙óöú˙˙ù#˙˙˙íú÷˙˙ŭú˙ú˙ù˙˙˙˙˙˙˙ú÷ŭ˙ŭ˙˙÷ú˙˙˙ò˙˙˙ġ÷˙ŝ÷˙˙ŭ˙éö˙ò˙˙ċ'ò˙˙˙˙˙óù˙˙˙ĝ˙ô˙ñúü˙÷ü˙ŭü˙˙˙˙îŭÈ˙˙˙óò˙úüüŝŭ˙˙˙û˙˙ö˙˙˙$˙÷˙˙í˙ù˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙ŝ˙â˙ŭ˙û˙˙˙ùüŝ˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öÈ˙ô˙˙úú˙˙ ˙üŝ˙˙ĝû˙ò˙ĝúòÜ˙˙ô˙˙ġ˙˙˙û˙ġ˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙òŭ˙˙üó÷÷ŭ˙˙˙˙˙˙ñ˙˙˙˙öüôóŝ˙˙ú˙ù˙˙ŭü˙ù˙÷ï˙ŝ˙ŭŝ˙ö˙ö˙˙òîŝ˙˙˙˙˙ü˙˙÷˙ôĝò˙˙˙˙û˙ñ˙˙ô˙˙˙ġ˙ûú˙ŭŭ˙˙˙˙ùĝ˙èŝŝġ˙˙ü˙û÷˙˙˙˙˙öü˙˙˙úü˙˙÷˙˙˙ù˙˙Îŝ˙˙˙î˙˙ĝöüùíù˙ġúû˙ôŭ˙üóüô£Í˙˙ù˙÷˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭ˙˙ŝŝüĝ˙ù˙˙˙ú˙˙˙˙ŝ˙ĝĝ˙ĝÌ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ġ˙˙÷íü˙˙ŭ˙˙ŝġ˙˙˙˙÷ó˙ú˙˙û˙˙÷÷Ĵ Ĉ˙ú˙˙ŭú÷÷ŝ˙˙ôŭ¤ùú˙˙˙ò˙û˙˙˙˙˙˙˙˙ûüï˙˙Ż +ï˙˙ĝ˙ġíò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŭ›$ $˙úŝ˙ü˙˙ö˙ù˙ù˙ĝË˙÷˙˙ŝ˙˙˙ŭö˙˙úóŭ˙˙˙˙˙˙˙˙˙˙˙àüĝġ˙İŸ˙ŝ˙û˙ŭöú˙ó˙˙ï˙˙óüö˙ŝ˙˙ù˙ï˙˙È˙û˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ö˙% Ö˙ü˙˙ûúöŽ$%ö˙ü˙˙ûúŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙ġúî˙˙óûŭûŝ˙ŝ˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙ùû˙˙ġ˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ü÷˙ü˙˙ á˙ô˙˙÷û˙ġ–/˙˙˙˙ĝüûüŝú˙ù˙˙ġŭî˙ôû˙˙˙˙ü˙ô˙˙ù˙˙ü÷ĝ˙˙ŭŭŝ˙ó˙™ÏÛúû˙ûġÚ"Ġ˙˙ô˙ĝŭ˙ġġ˙˙˙˙ô˙˙ú˙ŝŝ˙˙˙˙ŝŝöŝ˙×%ö÷û˙˙ŝ˙÷˙˙÷˙üö˙ú˙˙˙˙ê-â˙ü˙Ħ˙ù˙˙˙˙˙˙˙˙˙˙˙÷û˙ê˙ü˙˙ŭüüúíûŝ˙˙ú˙úì˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˜!(ˆ˙˙ñü˙˙Ş&Ÿú˙öü˙˙ġ˙˙ñ˙û˙üù˙˙˙öŝ˙ĝ÷öú˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙ġ˙˙˙ŭ˙˙ĝ˙ó˙ò˙˙ò÷ŝ˙ŭŭë˙˙˙ĝü˙˙ġ˙÷ĝ˙ü˙ñ˙˙÷˙ĝò˙ŭ˙˙î˙ĉ˙˙˙ìû˙ŭ˙ġü˙˙ë˙˙ŭöĝ˙úġïú˙ò˙˙˙ö˙˙˙ú˙˙˙˙˙ŝù˙˙˙ġĝ˙ŝ˙ô˙ùŝü˙˙öùĝ˙˙ŭŭòŭ˙˙ĝûûé˙óÔüùÑû˙ìû˙ùì˙˙÷˙ü˙Ñ˙ŝ˙ì˙ŝ˙ó˙ï´ Ħî˙ú˙÷ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝöŭ˙˙˙˙˙ĝŝê˙˙ġĝ˙ïó˙˙î˙˙óú˙öġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ô˙÷Òùúŝüù˙ĝú˙˙˙˙ü˙÷˙ô˙÷ŝ˙ŝ ×ŭùġ÷úŝ˙˙˙òĝ˙û˙û˙˙ĝî˙˙˙ö˙ġóüŝ˙û˙ù˙ŭöû(—˙ú˙˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š!›ü˙ú˙˙ĝüŝû˙û˙˙˙˙˙˙˙ŭó˙˙úù˙˙ĝ˙ŝ˙˙ċü˙˙˙˙˙˙˙˙ġ˙˙˙ŝú§Ö˙˙÷ò˙˙˙˙í˙öŝ˙÷˙˙û˙ì˙é˙˙˙öôĝŝúù÷ú˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭ˙Ë*Ëü˙ìŭ˙˙Ê&“#Ñ˙ŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ó˙˙üûù˙˙˙ŝ˙˙ü˙ü˙ŝúĝû˙˙ûú˙˙˙˙˙˙˙ŭ˙˙ü˙˙˙ŝ˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ú˙˙ô˙‘"˙î˙ù˙˙ŭö˙ħ"ö˙î˙ġ˙˙˙˙˙˙î˙üú˙ò˙˙ŭ˙˙ŭ˙˙ĝ˙˙üĈóü˙˙˙í˙˙ûŝûŬ•Ş˙˙÷˙˙ûÑÖô˙ŭ˙ù˙˙ü˙˙ġ˙ŭ˙ñ˙˙ö˙˙ŝ˙˙ûŝû˙˙ĝÑ ù˙ġ˙˙ò˙ŭ˙÷˙ġ˙˙ŝÎ˙˙ó˙ò˙˘˙ì˙˙ôĵ˙˙˙ŭ˙˙˙˙˙˙˙˙üú˙ñ˙˙ô˙ú˙ŭ˙˙˙ġ˙˙ġ˙·ħ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ğ˙î˙˙˙ĝ˙§ŭ˙˙˙˙˙˙ü˙û˙ó˙ŭö˙˙ĝñ˙˙ŝ˙ö˙ġñ˙ü˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙÷ñ˙ĊŸ“Żġ˙ĝ˙÷˙˙ì˙˙îŝ˙İš´˙˙˙˙˙÷˙˙ì˙˙˙˙ġû˙šĠ˙ŭ˙˙ŭ˙ĝ˙˙ï˙˙ù˙ŭö˙ü˙÷˙˙ŝ÷˙˙ġ˙˙˙ö˙ö˙ö˙ü˙ñġ˙˙˙ĝö˙˙ŝ˙ŭ˙ŭÑ˙˙öżĠ˙˙ôäó˙Ó¤Ħî˙˙ú˙ġ˙ù˙˙²íĥŝ˙˙˙ô˙İĤ˙˙ì˙÷Ìİ˙ï˙˙ñ˙òÍ!Ò˙÷˙˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüúûûù˙ġ˙˙˙üü˙˙˙˙Ñ ù˙˜İޝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙òÒÇ˙÷˙ô˙˙˙˙˙ú˙˙˙ùŭŝö˙˙˙ú˙ö˙û÷2,Ïó˙˙˙˙˙úú˙˙˙ñüÏòüû˙ú˙ùĝĝ˙ù˙ÏÏ˙÷ġġ˙˙˙ñş Ĥù˙öŝû˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì¸ Ż˙˙˙öûûû˙ĝŝ˙÷˙ì˙ùŭê˙˙˙˙˙˙ùÎÖ ñú˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ $&˙î˙˙ûü˙ġ÷˙˙ġí÷ù˙ì˙ûí˙ŭ˙˙ŭ˙˙¸ĞŞĜ˙÷ĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òï˙!!& ˙˙û˙˙ü’Ê#Ñ˙ŝ˙˙˙˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭöñ˙ä˙˙˙ù˙ú˙˙ù˙ù˙ŭ÷òöŝŝùŭ˙˙˙˙˙ŭò˙ûŝ˙˙öù˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙ŭ˙ù)ġò˙·ġ˙ö˙ûħ˙ç˙˙ġ˙ġ˙òÍ˙Ôŝöû˙ÀĠôö˙˙ô˙˙Ĝö˙˙ŭ˙ÛÈġ˙ĝûŝ÷˙ӛ¤ìÙ˙ġ˙ñ˙ ˙˙˙ÇÄĤĥÜ˙˙û›œ-Í˙˙ù˙˙ö˙˙ò˙˙ 1Ğûüŝù˙˙ŭŭóŞà£ÍÌ˙˙û˙$ü˙˙÷üÓ˙˙˙ü˙˙˙˙˙˙˙˙˙˙½Ħ֐Ö˙˙è˙ö˘ÌŬ ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ &&Óìŝö˙ġ£’˙İÁÀ´µ˙˙î˙ü˙ǚ˘Ħù˙˙˙÷˙ìè7•›î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙Ŭœ!$˙˙˙ùĠ(˙  1Âŭ˙ùŝ˙À& Ì˙ !›Óŝ˙úÏĈ˙÷˙˙û˙˙ß+!âΗʚ̲ĉ˙˙7š˙˙û˙˙ûϤĤ˙ۊ- '£ġۑ%, *Œĝ˙ü÷˙˙î• 6-˙˙÷í˙˘$ ¤È˙˙˙ġި̰Á˙˙˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙í²!ĥ˙˙ûы-!&ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ï' —˙ġĊ› ĤÁ›Ô˙îċ˘Ìè˙˙û˙˙˙˜Ĉ 0€Ĝ˙˙ü˙ö˙ú˙˙˙÷ù˙ŝñ˙˙ß. " (+ĉ˙˙ #•Ġš- $ŸĜ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“*Òġ˙ËĠ˙ŭ˙ŝ˙ö˙ĝ˙ò˙˙˙˙úî˙Ë.*Ž˙ġ˙˙˙˙˙˙˙˙óŭô˙˘" ˙è˙˙˙˙˙˙˙ " ×˙Â˙˙ŭ§ï0…˙˙ŝ˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭô˙˙ó*! &ùü˙úġ˙˘˘Ġ !Ġüŭüùŭŭĝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙üÑž˙˙ùÜêċĝ˙ù˙˙˙˙üöú˙˙˙˙˙üŭ˙˙ñÜ˙úŭ˙öÖÙöïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üŭ˙ûûŝÉ˙ŝó˙˙üŝ˙÷˙ġ˙ĝ˙˙Ċ#Ħüô˙ş* ŞÍü˙ù˙ñ¨ ÊöŞÄ˙˙üù˙"˙˙ù˙ĝ˙˙žÌ˙˙÷$£ġŻĤġ˙ó˙˙ó˙ŝ˙§ !, Ÿŝŝô˙¤#$ "ž˙÷÷˙Ïŭù˙˙˙úÖûü˙˙˙˙˙˙˙˙˙˙ĝ ù˙˙˙%  %˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$İŝ˙ġ˙ Ġ Úû˙ùöÎ"˙˙ŭ˙Îİ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŜœÛġĝ!š˙˙-Şù˙ŭ˙ŭ!). (Ä˙˜)'&•ŝ˙ó˙üĈ$#' ıñ˙˙İ#&šû˙ġ˙£Ż! ' &7Èü˙˙ĝöµ¨2›˙Ï˙ġ×#§ûû˙û# #+Îġ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙ùùü¤%!ħûË˙-%##Şĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙Ô& Ê˙ $+ $ġ˙ ,éü˙ŭŭ÷#" ,˜ò˙ûŭü˙÷Ÿ–ĴÏû˙˙˙ñ² % ħúÏ˙ŸĦ . #Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù¤%Í×˙›§˙ùŭ˙˙˙ŝúÎ˙˙Ìúò˙˙ġ "˙˙˙˙˙˙˙˙˙˙ŝ˙˙ê&#$œ%Â˙ĝú˙¤ĤËÎŞ%ô˙˙˙ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ÂĴ˙Ê#›ù˙˙˙öŻË˙£*÷ô˙ŭŭŝ˙ĝ˘À˙˙ġž™¨ò˙˙Ϝ ŸÑ˘£Ôš#Ñ£˙ö˙˙ù¤ÌɢÍó˙ú˙û˙œ¨ž ŞÉ˙ŝÑ Şó˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ç œĴ˜š›­š+ ñ˙˙û˙ĞĦ˙˙Ġ ™˙û˙Ï$ İ˙ö˙ü "$žúüŭ˙Ó˙˙÷   ˙Î"²è˙˙ĝ˙˙ù˙˙Ÿ! ) ˜˙ŝ˙žĊ˙ĝÔ.üôŭ˙› ĝ˙˙˙öÔĤ˙˙˙üŭ˙˙˙˙˙˙˙˙˙¤ "ŭúü¨$Ŭĝŭ™)Íî˙ŝû˙˙û˙˙˙˙˙˙˙˙Ä * žġ˙ûû¤ĜĊ˙#Í˙ġûĠ &ŝ˙ŝÌ&Ħ¤Ĥĝ˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙Î)Ċŝ˙˙¤Ġŭŝ˜(# !Êüŭ˙ ŞóÒ"˙˙¤š˙˙˙ŝü˙˙&#ŸÊ­  ˙ú×$ Ĥû˙˙$˙˙òĤ , !²ô˙ô˙Ô#%ĝû 5 ˙ĠÔ˙˙ ˙ġö˙$˙ĝŭ˙ĝŝ˙ŝ˙˙÷˙ú˙˙˙˙˙˙˙˙ù˙ûüú˙ċ$!Ĥ˙÷˙Ĉ$ š, %ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙÷Ó!àúÈ)§ÔÑ!™˙˙ĝ˙ÔŸĤ +˜˙ŝ˙˙Ҝ$˙ŭ˙˙ġİ˙Ò* ˙ŭ˙Ñ£Ÿ İ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž¤ÀÙ $˘ŭü˙ŭ§ŭ˙÷£Òüû'Çù˙˙˙˙˙˙˙˙˙ûù˙˙˜"% Ħ÷˙˙›ž˙Ħ"˙  úŝ˙ĝ˙ó˙÷Ġü˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úò˙˙˙  ¨ŝĠ*.˙˙ô÷˙˙˙úŸ+#Û˙ï˙÷›Éí˙ÉĜ˙óĝĞ; ) ĞûŻúŝ˙ÊŞÌĥí˙˙ù˜%" öÔ&û˙˙íù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü!!'+ #$¨˙û˙˙ù1%˙˙—/"˙üû# ĦÚ %˙˙ŭ˙!¨œÙ˙ŭ˙İÍ˙˙˙Ï3Ÿ˙ùê  ßì˙˙˙ûŭ˙˙ö˙ÑÁ%—˙˙ñó˙ò!˙ÍÔÇë˙˙ú ›˙ûïè˙яù˙˙ŝ˙˙˙˙˙˙˙˙˙ËÒ)!ŝ˙˙ŝ’—Ïĝ÷ú$Ŭ˙˙úŝùŝ˙˙˙˙˙˙˙˙˙˙š–Û˙ô˙ù˙÷ž¤ĝ˙Ï˙™%˙˙÷˙× "˙Ñ˙šûĊ˙Ò $÷ŭ˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ŭĤÚÉ˙ Íû˙Ö % ĥ÷˙½°ÙÓ˙Ħ  Ÿûĝ§Óñ˙Ì ˙ĝŝ˙÷ 3û˙ó! #Í˙“2À˙ŝú Û˙˙ĝ.  žßĦÛ6Ó̙á ˜˙ù˙à$*œ-ô˙œ$4ôüï(âŝ˙û Εں˙˙˙òĝ˙ŝò˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ġò˙!œû˙ŝ˙Ÿ˙˙ä3# ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ôôĤ( ù˙˙’ĦóÙ½Ğ' ˙˙ù˙š!ĦôÜü&$Ï˙î ( ü˙ñ˙Ċ Êï˙˙ # ˙˙ëŞ. Ùŝ÷˙"!š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˘%/Ñ˙˙˙˜'Ħŭ˙˙ï™È˙î˙˘#÷˙Ò!˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙òϙ+ (ú˙˙ìü(!—ï˙ü˙Ù /˙˙Ħ£ĦşÚÒ˙û˙˙ġÛÓÚ˙ò˙ú˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ñĊ+2·óî! Ë˙˙˙˙÷ô˙,û˙û˙ü˙ž"˙˙ô˙Ü˙˙Ç  œ"”˙ŞŠ%˜ŝ˙ÊžÇ˙œ ùö˙Ӑ& ˙˙˙— òŝŝö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙™-) Ġì˙˙÷ÑÑñ˙ġ# ˙ŭûĝ˙ŭ÷…#ž˙ġŭŬ˙ġ˙˙úáÒ˙ë˙˙ ĝ˙ô˙Ö+ŭ˙ŝüü˙Ê˙ñüöñŸ$ £˙˙½!Ĝ˙˙˙ûŝŝû˙˙˙ó˙˙ ˙ô˙˙˙˙Ħ,' É˙îóŝĜ ×ŝ˙˙˙ö 9Îú˙úù˙˙˙˙˙˙˙˙˙Òòż˙ġġ˙˙Ó" &ŝ˙ü˙ó!ŝŝŭ˙û˙ù˙˙˙˙˙˙˙˙üÉ˙ï˙÷ĝòú&ü˙ó˙İ.Ì˙òôê(#ù÷˙Ú˙ŭÓÖ˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙Ì %"(˙ûüŝ˙ ż˙˙ÓÀ˙ĝ˙Î#˙÷˙ó˙Á—ß˙ûìİ •˙òó#'"œ˙ġ˙ú˘ŸĠï˙Ç "Ż)$˙˙˙ŭĝİ ħóö˙ŞĞŭ˙ûö· İĉ˙ûŜ(œ˙ĝ˙}˙û˙˙‘ ï˙ùëî˙˙˙ġŭ˙˙˙˙ô˙˙˙˙ĝú˙˙˙˙˙˙˙˙˙üò˙˙ú˙Ò"¨˙˙öŭÄ: ¸×ï˙˙Â%ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óû˙ġ% *ìù˙, "˙ĝ˙˘!,ùÜĝġ˙Ĝ˙ôô˙ ÷˙˙ùÍ,Ĵ˙ĝö˙'%˙˙üŝ˙Ӎñġ÷˙”Ĥŝġ˙óË ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô˙¨$—˙˙ŝöÊ$˙ûú˙˙ž) ˙Ŝëùöó˙˙˙ùü˙˙˙˙˙˙˙˙ûúù˙˙˙ #ä˙Ë˙Î à˙ñ˙˙Ï $˙ôÍ0ú˙˙ŝ˙ê˙ŝ˙›ž#’ü˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙”&ô˙˙Ñ$ ë˙Èŭü˙“óÒ˙ô÷ûÚ œüô˙óŭ'Ê˙˙ĝû¸%Ô˙ÌÊ˙˙ü˙Ħ#žûÎÌŝ˙˙Ġ˙˙˙Ô ˙˙üŭŜ"÷ù˙İ˙˙û˙üó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙& ˙˙˙ôù˙˙˙˙ç% ŭù˙ġ˙ŝ˙Ô"˙ŝü˙ù&û˙ûöÎ#˙ë˙ùó $˙˙˙íÚ¤˙÷÷˙˙˙Ó ³è˙÷˙˙§'žü˙Ç) ŝö˙ĝôŝ˙˙ŝ˙˙ŝù˙ ¤˙˙òÜî‘!œœ¸ëñ˙˙ûûœŭï˙ùöÄ˙˙˙ŭ˙˙˙˙˙˙˙˙â˙˙œĞ˙˙˙ë˙Ĉ%”ŝ˙˙Ä˙'ĝ˙ŭ˙˙˙ġ˙˙˙˙˙˙˙˙Í6 ˙Îô˙˙ü˙˙Żó˙ë˙˙÷;È˙˙˙˙ Ê˙˙ʟ Ġûî˙˙˙ĝŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙¤˙ëÉĈĈ›˙˙ï˙úòż#É˙ Ġ˙ó˙ĝñ˙Ö:Àö˙˙ŝĝ˙˙˙Ïš˙˙ĝ#Ċ÷˙î˙İ ġ˙˙˙4!!›ċ˙öó˙÷-$¸˙˙˙à+ò˙˙˙îÑ˙÷û­ĤÓŭ£˘˙ÂĜùŝ˙œ"!˙ú˙˙ùù!“˙ò˙˙şûûġ˙˙í˙ŭù˙˙˙ú˙ŝŝ˙˙˙˙˙˙˙˙ġ˙˙ùĝ˙ŭÏ $¨ô˙ú˙Ç ˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ò˙ŭÇ"˙˙Ŝ%" "ò˙˙›—ú˙ö˙üŜ+˙ì˙˙ĝ¨²öġ˙÷˙˘ĝŝ˙ŝ%Ħ˙˙˙ùŭü˙ĝ˙ŝ”"+Ğú˙˙÷Ŭž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä"%£úü˙˙˙$˙ġ˙àŭÊûŭ˙ï!İӖ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙ëúœ ˙ôġ˙İ#ñ˙˙ġ˙˙* —˙˙˙›%öŭ˙ŭç˙û˙˘!($&Ó˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙úŭñž  ˙üñ˙ ĵïžĞò˙ĝÔĤêû˙˙˙˙àóùŝâ !˙÷ŭŭ˙×ö˙˙ó˙ŝî È˙˙ĝ˙ñ˙ÔÑ˙úċĝ%! ù˙û÷ĝŸ#šŜĵ˙Ċ Ğû˙êú˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙$!$ ĝĝ˙˙˙ĝïûñĥ É˙ŭ˙ŭ÷˙ĝ˙˙˙˙˙£˙˙ò˙˙Ì ŞÏ˙˙÷˙ ħÀùüü˙.ôô˙ŝî˙Ŭ˙ %‘Í÷˙óôġ£( Ÿŭ˙˙˙˙˙˙˙˙˙ŝúŭ˙üü.(Ĉùĝ˙˙˙$˙ŝ˙ïŭü˙ê˙êú˙˙ž˙˙ï˙˙—'Ġŝùù˙˙˙˙˙˙˙˙˙˙ŭê ġó˙˙˙üšġ˙û˙%˙˙öúü˙ŝ˙˙˙˙˙˙˙˙ù $ñ˙˙ù˙˙è÷Ħ˙˙˙˙ŭġ!Óû˙˙ü²Ë˙ĝ˙Î* ô˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ ù˙˙˙˙˙üö˙˙˙˙ %˙˙ ÔûŜ˙(Ÿ˙˙˙Ù%˙˙öġú˙ŭŝ˙óÑħŭô˙/§˙÷û˙3§ŭĈòÑ äñ˙˙úó˙˙ŝó˙˙˙ë Ùê˙üħ'˙˙ô˙êÔ0 Íùû$üŭ˙˙˙ë˙˙ġ˙ĝ§ê˙˙˙ö͐žÍ˙öóĜ #ù˙óùü˙˙ĝ˙˙òóĝ˙˙ŝ˙˙˙˙˙˙˙˙˙û˙˙˙˙ü˙˙ Ê˙˙˙ö˙Ş ĵĝ˙˙˙§˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġü˙˙öù˙ĝôË!˘ŭÍš˙ŝ˙ù˙ü¤( Ħġ˙˙˙˙•&˙˙ö˙ú' ˘˙˙ŝ˙ ğòôö˙ûî˙˙˙ú˙ Œ˙èó˙Î ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ "˘Í˙úġ˙Ż˙˙üċ˙!àú˙˙˙%%/ÉÊû˙˙˙˙˙˙˙˙˙˙÷˙˙ŝÓ*Ó˙˙ù˙ $ó˙˙÷˙ü# ˙˙ö!+ûû˙ó˙ò˙ô &$˜ġĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĴ )Ç˙˙÷›#$&˘˙˙Ì˙Ħô˙ĝĝúè˙Ğ##•˙˙ùŝôŭ˙ùü÷˙ŭóü˙˙˙¤,ĉíí˙î˙ĝ˙˙˙˙˙˙Ó ˙÷˙ŭŭü$$˙˙—(ŝô˙˙üúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ï "˙˙òġ˙˙˙˙˙¤$)œ˙ï˙üŝ˙˙ ˙˙˙ö˙#Ħîüġ˙÷Ĝ&'Ž˙ö˙˙%˙˙˙˙ĝ–˙˙ü˙ŝ˙ŝš™˙˙˙˙û˙úÇ1Ž˙ôûü˙˙ŭû˙˙ŝûù˙ô’£˙î˙˙ÈÎîŭ˙ŭ˙˙ü˙˙û˙ù%ï˙˙öŭ#ûġ÷ŝ˙˙˙˙˙˙˙˙˙˙ĝ 0˙ĝ˙÷ñÛ¨ŝú˙ñ ġöú˙ŝŭ˙˙˙˙˙˙˙˙˙Ú˙˙ë˙òò˙˙£'ñùŭ÷ŭû$Òġ˙ŝ Ĉŭ˙ó˙› #' Ñ÷ó˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙•&Ĵĝù˙ú˙ö˙˙óŝʨĤî˙Ì˙ñ˙Ë*êö˙§÷˙ŭ˙˙˙öú˙ûÓ"”ġĜ˙Ï$ž˙ŝ˙Ĉ/§ô˙˙Ċ"!Ĉŭöó˙˙ò˙˙˙ü˙ĝ•3Ŭûôú˙Ĥùó˙ò˙ ˙˙˙" ˙˙ö˙˙˙˙˙ï˙ú˙œ /Ÿ˙ŭŭú˙˘#£˙îŝ˙˙  üó˙˙ĝò˙öù˙˙˙úô˙ù˙˙˙˙˙˙˙˙˙÷ġ˙˙˙ùñ#Ġ˙û˙˙˙ &˙ûòü˘û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ò˙˙•- ˙˙ #$ Ġ$Ŭí˙óô÷˙•˙˙óò˙žŝù˙úî›Íúì³ '”˙˙˙û˙˙˙ôġ˙ñ­"Ĥ˙˙üŝÎ# §˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˜àġ˙˙éŭ› ¤ŝù˙˙ï(—ĝöö˙Ӟ›  ­ĝú˙˙˙˙˙˙˙˙ŝ˙˙˙˙|, Ċŭ˙ô˙ #û÷˙ô˙$&šô˙!Ġö˙˙ú˙˙˙$%-˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îĝŭŭ£&œ˙˙˙˙ $˜ò˙í£$İŝ÷˙˙˙ó4 ¨÷˙˙ĝ $ž˙ŭú˙˙ú˙ö˙˙íñ˙šŠ˙˙˙˙˙˙ôó˙ôùÁ,*˙ôŭ˙û˙–"˙ŝÔÙÁ˙ŭúû˙ô˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ô&£ù˙˙˙ôûúŭšàüŝ˙˙˙ŝ&Í˙ô˙˙œ §˙Ö˙ŝ˙Ĥù˙˙óÜ 0ë˙˙ê˙!ŝŭî˙í˙ô˜§öŝ÷˙ú¸˙²Ĵ˙˙˙ùŝ˙ûû˙˙˙û˙ù˙­ "÷˙ŭġĞ ($“˙ġç˙ŭ˙˙òí˙úĝ. ¨ĝ˙ġŝ˙Í˙˙˙ü˙˙˙˙˙˙˙˙˙ó˙úô˙÷˙Â0 ¤˙ĝù˙Ç#çġ˙˙˙ġü˙˙˙˙˙˙˙˙¨ ˙ĝ˙ŝóüŭ˙˙˙ŭâÖúü˙˙ž(âúíŭ˙* -˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙Ŭ ˙ùŭ˙úûû˙ö˙˙˙ $š˙ġ­Í˙˙ŭû˙֜Ô˙ò˙÷ïĜ¤Ó˙èÚ &·è˙ù˙£$’˙˙òŞ ˙òĝÒ£ñ˙˙ó˙ñü˙˙ò˙˙ šü˙˙˙Ÿ!$ù˙ú˙˙+½˙ù– Ëĝ˙ŭöö˙íú˙˙ŝÛ "ŭ˙˙ú­ Ÿ˙˙˙˙Í"œÖ˙üŝñ˙àÊ–Ê˙ú˙˙˙˙˙˙˙˙˙˙˙ŝû˙úò˙˙˙•(ôĝ˙ŝ›!Ĉ˙˙˙˙¤ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ñ˙˙%#Ÿ˙Ŝì˙ŝ˙˙ĝü°˙ó˙˙Ô˙˙ö˙˙˙˙ŭŽ)˘ŭî˙óġú˙˙˙˙ò!8 Çŭġ˙ġÏ)˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó¤˙˙˙˙ċ§%˙òúñħ! ˙˙˙ò˙û˙ĝÚ¸˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŝ( '˙óġ˙˙¨˙˙˙˙ù' ĜŭŭÌ) ­˙í˙˙ġö˙ĠÊ) ÷˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙˜#ž˙ùô˙Ä""ß˙ñ˙¨˙˙˙˙ò˙ü£Óĝû˙úù˙˙ü˙˙ç˙û÷˙Ĝú£ .™˙ûü˙ë˙˙˙ŭݤû˙í˙˙ô˙!§ï£Óù˙û˙˙ûñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ•,Ï˙ġ÷˙û˙˙˙Ÿ% "ü˙ŭ˙üûĜġ˙˙òÏ˙úú˙˙Ë%¤˙û˙ĝŸö˙˙˙ Ħ˙ü˙ûŝ˙ËÑ˙üŭ˙˙Éİ( Ġ÷úú˙˙˙˙˙˙ŭ˙ŭ˙˙ġÒ"û˙˙ù˙™( û˙˙ŭŭŭÓ˙˙üü˙"Ĉ˙˙úĜé$!Ìüû˙ĝ˙˙˙˙˙˙˙˙˙˙˙#û˙öúĠ£Ħ÷˙˙˙˙ % ó˙˙ġ˙û˙˙˙˙˙˙˙˙˙œ–˙ŝü÷˙ô˙ +ûú˙ö˙ê%Ìûŭ˙ûĦÁ˙˙˙œ£—Ğ$˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙Ê(É˙Ó˙÷ŭ˙Ìü˙û˙˘"ô˙™Í˙ü÷˙ ²÷÷˙˙˙˙˙›˙˙Ħ" œ˙˙ò˙Í'Ìù˙£›Úü˙˙˙Ï˙ù˙ŝ˙÷ü˙˙÷˙š ˙ŭû˙İ "˙ö˙˙ó§˙ûŭ­ ˙ŝŝŭ˙žÒŝŭ˙ ŝ˙ùü˙Ġ)û˙˙ġÑ%§ġĝ˙˙˙ú#ï˙˙ï˙˙˙˙˙˙˙˙˙˙òŭ˙˙ŝŭü¨ §˙˙ĝŝ ˙ġ˙˙ô#ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙úŭœ ˙ #%÷˙˙ü˙˙ '$ž˙˙÷ü +ú˙˙÷˙$ĝû˙˙  ˙˙ô˙˙˙ö˙ŝ÷×"ž˙˙î˙Ó  ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙&û˙ġ˙ÁŸù˙Úü£žĝú˙ú˙˙Ë˙ô"’˙˙˙˙˙˙˙˙˙û˙˙˙ô Ċ˙˙üŝ'š˙ŭúŭÑŭŭ˙İ &ŭ˙ŝĝ˙ú˙ŝûù˙˙˙œ›Ò˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙˙˙˙ĝ˙ù˙˙˙  ˙ġġ˙Ùġ˙ûüŸ(Ïŭ˙ŭ˙Ñö×ŭ˙˙ŭö˙˙ú˙Ħ˙ŝöĝ˙˙˙ĝŸ£ü˙ĝ˙˙ë˙Ġ ˙›ŝ˙ú˙ĝ˙˙™"˙˘£˙üġ˙ú˙ö˙÷˙ŭĝĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûûŝ˙˙˙!˙˙ûü˙˙ú˙ÌĞü˙ö÷˙˙Ñ#ú˙˙˙£#˙˙û˙˙ž˘˙ŝ˙ŝĈĝ˙úÙ#š˙Ġĝŝĝ˙×È˙˙÷˙˙î˙$  !û˙û˙û˙˙˙˙˙˙˙˙÷˙Ç˙¤ô˙û˙ŝÑ˙ì˙ü˙Ħ.ôö˙ö"$˙˙˙˙žÍŝ˙ü˙˙˙˙˙˙˙˙˙ŭößÓûü˙÷˜˙ôûĞ  ž˙ûû˙˙ô˙˙˙˙˙˙˙˙Πö˙˙˙óŬ˙˙˙û˙È˙ü˙˙İ$Ûè˙Ü Şŭ˙ùĤ$&›˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ú! Î˙˙ŭÔ ÏÔ÷˙#˙ñ¨Ó˙ÎÄ Ħ˙ŭû˙˙÷˙í˙ù˙ ü!"Ò˙ŭüù˙ŭ˙˙ü˙÷ù˙˙£! —ü˙úÔښÈÖ˙˙Ë'Ñ˙û˙¤ŝû˙Í) "¤ŭŭÍ ˘˙˙Ĉ˙Ê  !Ì˙ûö˙˜ŞÄ˙˙êÜ%*û΢˙˙Ì˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ö˙˙"˙˙˙ÖÍ˙˙üĦĦ“Ùŭ˙˙˙ġŝ˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ôú#Ş˙ ˙˙˙ô˙üü˙È ˘Ñ˙˙˙Í˙ŭġ˙Ï#!üùû˙œü˙ŭúİœĠ¤Ï&£˙˙˙ö( ˙ú˙˙ŭú˙˙˙˙˙˙˙˙˙˙ŭŝ!˘˙Ñŝ˙Ġ˙˙ĝ˙˘)˙˙ô˙ÙÍ˙˙ôĦ+ £˙˙˙˙˙˙˙˙˙˙˙ŭùÍÎ˙ŭ˙˙›˘ù˙˙ËÓù˙û #ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝüüŝ˙˙î˙˙ĝù"§ëÚ˙ïÑ$Ô˙ĝ˙˙œÊû˙˙ŭ˙˙™+Âŭ˙ô˙ ô˙ù˙ûŒ ˙˙˙˙ûöü˙¤ "Ê÷˙ĝ˙ġ˙Ù#Ú˙ž#˙ùï˙˙˙˙§"Ç˙û˙ò˙˙Ċ˙˙˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úüŝ˙˙˙˙˙ÉÉ* !!úî˙˙÷ĝ˙üŝž şŝ˙˙úŭù &%Ïí— İù˙ñġ))ğ˙ú˙Ċ -ŝŝ˙Á'ñĝ˙˙˙˙Ġ"Öûû˙ï˙˙˙ó&'—öŝ˙ì˙˙˙˙˙˙˙˙˙˙˙˙¤Ğü˙˙Ħ§§›ú˙˙Ó $–˙˙ô˙%ġ˙é˙˙˙˙˙˙˙˙˙˙Ö"Ï˙ĝž#%˙úĴ.£ŝ˙ôé˙˙˙˙˙˙˙˙˙˙&‘ú½0$˙˙˙’)÷ö˙Ò)˙íú÷ÒĨ Ĥġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ•6 """%˙˙$‘˙ ™üĜħ &ÍÔĠ÷û˙˙ç˙½+(' ÷˙˙÷&ûŭŭûùÀ˙î˙˙ŭ˙ÌĞ#‘Ş“³ê˙˙Û&"”˙˙Ç #£Îûš˙˙˙!' £Ÿ0 $š˙˙˘) ŞĈ˙˙Í šġè "Î˙˙ġ˙˙˙˙˙˙˙˙ü˙ï˙ü˙Û %1‘ò˙ #Ŭ÷˙&--ĥ˙óó˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙üüûòç˙‡#ú˙"!˙ö˙û˙˙ĝ½# *˙è˙ĝ˙.É˙˙öŞŝ˙ûĈÒ  Ùš ĉ“"-›˙ùÏ˙ ˘˙Êóüû˙ġ˙˙˙˙˙˙˙˙˙Ëß# ĴÒ˙úóÔ - ˙ê˙˙›˙ŝ˙˙‰ŸĝÒĠŽû˙˙˙˙˙˙˙˙˙è˙˙İ /šñ˙˙˙žš˙˙ŝ° ˜ô˙ŝ—.$˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ûúŝ˙˙˙˙ġ˙­  ˙ûŝü˙Áú÷˙Çù§ ö˙ú˙ï˙ŭĞ6ÔŭÙŝ§œ˙÷ŝ˙è ùĝû˙ú˙¤ " ˙ġ˙˙ï˙‘% ˙úÖ  §˙˙ĝŝñĝŝĤ!'Óùŝ÷ĝ˙÷" !Ëŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙ùó" ( ! +Ċ˙˙˙˙Ì ö˙òŭ˙ú&%"##ó˙üÖ!Ñŝ˙ü¨Ìĝ˙Í#)İĦġ˙ż ó˙˙ĝô˙ĝ˙ÍĤġ˙û˙˙˙˙˙˙˙˙˙˙˙˘5/ Ÿú˙ù˙ + +Ĵ˙˙‘#š˙˙¨(ö˙÷˙˙˙˙˙˙˙˙ĝ #*˙î(& "˙ ݚ˙˙ò˙˙ú˙˙˙˙˙˙˙˙öĤĦĦ0Ô˙˙ %İäÈ) ³ŭé‘%Ħ˙ü³$7,–Í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ• !§ĝ˙˙£˙Ċ!& Ï˙ò” ' $˙˙ò˙˙˙˙   %!˙úĉĞ( "µÉžÑ˙ù˙˙ĝŭ˙ùß %Ì˙˙ŝÇ  ) ˙ŝ!* £˙˙˘)§úï˙Ö +!,öĝ*%$˙ù!"Äî˙˙!# ÏËĴ % Úĝà˙˙˙˙˙˙˙˙˙˙ô˙÷˙ï &!#Í˙– ) ¨˙É’ß˙˙˙˙úŝ˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙ "˘˙ùĤ˘úù˙÷ú˙˙¸ •Ŝ˙££  #Ä˙˙“&&—ó˙ó1"#!ż˙'Žù˙! ´˙˙˙ôô˙˙˙˙˙˙˙˙˙")- Ä˙ÈŸ˙ġó'* '˙ü˙$ .%÷ù˙˙˙˙˙˙˙˙ġ˙˙Î ( §˙˙çöá"§ ˙˙˙ŭí.,ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙÷˘¤"! Ÿžö˙İ2§˙ë˙ô'Òö˙ñ˙ŝ˘ñ˙Êó˙ú ¨âŝ˙î˙˙/'ş˙÷ġ˙ïÑ!Íİ'Ħö˙ŝ˙˙ôÙ! ù˙˙ġ˙˙­" öġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŝùïĉ# $ şġûŝ˙Î!# $'Ŝúû˙ŝùœ"!˙˙˙ž (Â˙ž÷˙ŭ÷š(§˙˙- ˙˙ö˙ĝ˙ûü˙Ï&œ˙˙ì˙ñ˙˙˙˙˙˙˙˙˙͙!£%˙˙ŭ˙˙˙Òۖ)—˙ĝùĦ/ Òŝ˙Ğ Ŭ˙ġ˙˙˙˙˙˙˙˙˙˙Ν”ŭ˙úĠÉ˙ôöüÜ˙˙ó˙ŝċ˙˙ŭ˙˙˙˙˙˙˙˙ĝ˙ôÔÂŭ˙Â œ˙˙üÙĊĠßö˙˙ùċÉÊú˙ùü·," Í˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ÜŸ$Ÿ%˙˙éİ( ™ ï˙£!Ş˙÷˙°")§Ï˙ùĝŝ'(ĦúË"ŭ˙˙Ë#$‘“Şġü˙üŭ˙2# –˙˙˙˙–.ÓÄ˙˙ŭŬ˜,§ïÍ˙˙ŭÁ˙Ħġú˙˙öáÍ#&ŠġÓü˙Í-ĤĊĈ˙˙ÏİüĊż˙˙˙üË££Ïŝê˙ħŸ˙˙ö˙˙˙˙˙˙˙˙÷˙÷˙ĝ˙Ñ­§ö˙Ŭ¸$´ÌĝŜÔÒğϲÌÓ˙ùñŝ˙úġ˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙ŭ˙ÌœÉŝ˙˙ç!Ûú˙ü˙˙˙ĝّ  Óö$6 ˙ô4˙ç˙˙¸Ö˙˙Â(×˙˙,Ÿò˙ò˙ù˙û˙˙˙˙˙˙˙˙ )Í˙Ġ#$Ÿ˙÷ (ÛòŭÖ#,!Ċŭ˙˙˙˙˙˙˙˙˙˙˙˙ò˙Ğ"²ïŝ˙˙ú˙îÍŞÓëöĝû˙”#&™˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ûôá' %Ŝó˙Ĥ˙ŝ˜) ĴŜü˙÷½ "š""#˙î˙ & ıŭú˙ĝÄ ×ó˙˙óŝ˙œħÏ˙ĝ˙ôè˙çäĉÇú˙ô˙ġëŻ!™˙˙˙˙ŝñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙ŭĝŸ (œÎ¤¸¤ŭöŝ˙˙ùŭœœ˙”˙ó˙˙˙óö˙šĦĦÒñ˙Ò­™Ŭó÷˙ûÌÓŞÎ˙˙ôÓÏÎÙ˙í˙÷˙÷×Èŝ˙÷Ĵ¤™Ù˙ï÷ġ˙˙˙ü˙˙ÈŞëù˙˙˙˙˙˙˙˙˙˙˙ŭú˙+É˙˙û˙ú˙ŭ˙öù˙ûô˙ŝ& ü˙˙üĝ˙˙ï˙˙í˙ĝ˙ô˙˙ġ˙˙ñ÷˙÷˙˙˙˙˙˙˙˙˙ñ˙ó˙î˙˙ù˙˙ó•˘ĤÁŝ˙˙˙˙˙ùì˙˙˙ŝ˙˙ġĝú˙˙˙˙˙˙˙˙ô˙ö˙˙ó˙˙ú˙ԓĤÜ˙šğ˙ŭöï˙˙ûĝï˙˙÷˙˙û˙˙˙˙–Ÿ°¨Ż˘İÈû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙üġÖ˙ò˙ŝú˙üüöö˙ü˙ô˙ŭö˙úŭŭ÷ç˙ùû% '*ĝ˙˙÷ùü÷ùŝ˙˙˙˙ë˙ä˙ö+*.“˙˙˙ŝ˙˙ñ܂š—˙˙˙˙˙˙ö˙ûŸÌ˙îü˙ô˙ĝô˙˙˙í˙í˙û˙˙ùûġú÷˙˙ŝŝ˙û˙˙ö˙˙ó˙˙ì˙ñ˙˙˙÷˙ġú˙˙˙ô˙ú˙ï˙˙˙ü˙˙˙˙˙È˙ ó˙˙÷˙˙˙˙˙˙˙˙˙˙˙ġŝġú˙˙˙ùŝ˙˙˙ù˙˙˙ö˙˙ù˙ëŭ˙˙˙ù˙òû˙˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭô˙ú˙˙˙˙÷ĝ˙˙ù˙òù˙˙úŭġ÷úáŜŝ˙˙˙ò˙˙ŝ–˙˙ö˙˙÷ŭ䒙­š­˙˙ŝ˙˙˙˙ѨÎ˙ô˙ù˙˙ê˙ġ˙ñ˙ôúÄÔÊ˙ê˙˙ŭ˙ùó˙˙ġ˙˙˙˙˙˙˙˙˙˙ŝŝĦÚż˙˙˙ôÖôùñ˙˙֞!žİ ŝŝ˙˙Òĝ•Ô˙÷˙˙˙˙˙˙˙˙˙˙ôò˙èŝ˙ġ˙˙úó˙úù˙÷ŭ˙˙ü˙ä˙˙˙ü˙˙˙ŭ÷ïġ Í˙ûì˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ôéĝ$# "*£Ï˙˙˙­ë˙ößݍĤݰÇù˙ġ˙˙İ !! ›8 úŭ˙ü'#+ïù˙˙÷˙˙ $óúü˙˙˙ò˙¨˙îü˙“ú˙üġŭ˙˙ĝ˙˙!Ĥó˙ŭ˙˙î˙˙˙˙ ˙öù˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙˙¨ Ë˙ñûò˙÷˙˙û˙û˙˙í˙ŝ˙û˙˙ŭ˙ŭ˙˙ŭ˙ûž´˙ì÷ŝò˙˙úĝ˙˙ġÊ÷ĝò˙û˙÷ĝ˙üïó˙ùĦĤ˘˙Ò˙˙ĝò˙ûñ˙˙˙ô˙í˙ûö­*ş˙˙˙˙öŝ˙˙˙˙˙˙˙˙˙ŭú˙˙˙˙˙˙ë÷ŭù˙ó˙˙˙˙˙˙ŝĝĝ˙ŭùúÚüò˙ŭ˙ï˙˙˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙û˙˙ô˙˙ü˙ŭúô˙ö˙÷ü˙˙è˙÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝġü˙ï˙ŝ˙ò˙˙ò˙˙÷˙˙ú˙˙ô˙öŝ˙ĝö˙˙û˙ôùŝŝĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ü˙ûŝ˙ô˙˙ŝ˙ŝ˙˙˙˙ù˙˙˙ĝ˙˙Óú˙ŝ˙˙ŝ˙à˙'˘˙˙˙˙˙˙˙ŭ˙ŭ˙ö˙˙˙ŝ˙Ô$ŸÍŞ"ŝü˙÷ŭ˙˙˙˙˙ĝ˙ìŭ˙úŭí˙˙ġ˙˙ô˙ù˙˙Û˙˙óù˙˙÷˙ò˙ŭí˙˙˙˙˙˙ĝ˙ŝ˙˙˙˙òüôŝ˙˙ì˙ï˙˙ü÷ŭ˙˙˙ïü˙ôù˙î˙˙ċ˙˙ù˙ġĝŭô˘)&Ŭúŭö˙˙˙˙˙˙˙˙˙ôŝ˙˙˙÷˙˙öñ˙˙ö˙˙ñç˙ûô˙÷˙˙˙ġŭ˙ô˙ĝ˙ü˙˙˙ŭ˙˙÷˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙÷í˙ġĝ˙ô˙˙˙ĝôĝ˙˙û˙˙˙˙˙óö˙üëû˙÷ŭû˙˙ûù˙˙ú÷˙ü˙˙ó˙˙ŭŝùôöú˙û˙˙ü˙˙÷ú˙˙˙˙˙÷˙û˙˙ü˙˙˙˙òŭ˙˙öŝ˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙ŭ˙ġ˙ùŭ˙˙ġ˙˙ĝ÷úü˙ú˙˙˙÷˙ûïú˙ŭ˙˙Ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ġŝ˙˙üû˙ŭ˙ùĝü÷ï÷˙ô˙˙ì÷˙˙÷˙è˙Ï˙˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙ĝò˙Ÿ +! !ùĝ˙ô˙ú˙˙˙˙˙ó˙ó˙ŭ÷ġħ˙˙˙û˙ú˙˙ïŜÑÂÊâÂÜ׿Ñû˙ûüÉÛÀÖÓÁ˙˙ú˙ñ˙ÍÏÒ˙˙˙˙˙â˙˙˙˙ÎÈÍ˙˙÷ŝâÈ˙˙üú˙˙ñ˙˙ŭÊö˙ġ˙÷ĝ˙úŝ˙óÙÛÚö˙˙ú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŭüûö˙˙û˙û˙˙˙ŝ˙û÷˙ŭ˙ŭö˙ú˙˙˙ûüŝ˙˙ç˙ŝ˙ï˙ö˙˙˙˙è˙üûûü˙û˙ú˙˙ġ˙ûú˙˙î˙˙˙ú˙üú˙ó˙ŭ˙ï˙ĝó˙ĝí˙ŭ÷˙ŭ˙˙ Ħú˙˙ù˙ŭ˙˙˙˙˙˙˙˙˙÷˙˙úĝä˙ûŭ˙˙ŭ˙ŝ˙ŭúì÷ë˙˙ü˙˙ó˙˙ùüú˙˙ùö˙˙èŝ˙ġŭ˙ġï˙˙˙˙˙˙˙˙˙˙ñ˙˙ì˙ù˙˙ö˙ò˙ĝì˙û˙ö˙óü˙ù˙˙˙öü˙óó˙˙˙˙˙˙˙˙˙˙ŭ˙˙ĉ˙ò˙ñ˙˙ö˙˙˙ŝ˙˙˙ô˙˙óú˙ĝúü˙˙öö˙˙ó˙˙ô˙ŝġ˙˙˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ô˙˙ġ˙˙ċŝ˙÷˙ôö˙óü÷ù˙˙ô˙ô˙˙ñ˙çž#û˙˙˙î²"§ù˙ç˙˙ó˙˙ï˙˙˙ŝù˙ïê˙˙Ŭ˙Ò&È˙ü˙ó˙˙÷˙ñ˙û˙÷ú˙˙˙˙ôü˙ü˙ï˙ò˙˙ŝ˙˙ë˙ĝ˙ĝ˙ŝ˙˙˙ùûôùĝ˙ï˙ŝŭü˙û˙üŭ˙÷˙ú˙ŭ˙ù˙˙ŝ˙ĝĝ˙ì˙˙ŝ˙óû˙ŝ˙˙ĝ˙ì˙§)•ù˙ŭú˙˙˙˙˙˙˙˙˙˙˙ĝ˙òî˙îŭ˙ìġ˙˙˙˙˙û˙˙˙ì˙úŭüŭ˙˙ċ˙˙óòüŭŭ˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙ùó˙ó˙ġ˙˙ŭ˙ŝ˙˙ŭ˙ü˙˙˙öôŭ˙˙˙˙˙˙˙ñŭúö˙ëù˙üŭñŭ˙úŭ˙ú˙˙ŝ˙˙˙ú˙˙ĝù˙ġ˙ù˙˙˙˙˙˙÷˙˙ùŝûŝò˙˙ï˙óü˙ĝ˙˙˙˙˙˙˙˙˙˙úú˙òŝû˙ü˙˙˙ï˙ĝ˙ñĝ˙˙˙ô˙˙Éì˙˙úŝ˙úû˙óñ˙ù˙ġ˙˙˙˙˙˙˙˙˙˙Ĝ˙ó˙ñ˙˙˙˙˙ĝ˙ŭù˙ŝ˙˙í˙˙ġ˙˙û÷˙ì˙÷˙˙ŭ˙˙ù˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭŝ˙˙˙˙ù˙˙ĉ˙û˙ġ˙˙ù˙˙˙ġ˙˙ú˙÷˙ŝĝ˙Ĉ˙ġ˙˙ïŭŝ˙ġ˙˙÷˙ŭ˙˙˙÷˙Èú˙ĝ˙˙ùö˙ŭŝü˙î˙˙ġ˙˙ŭ˙ŭû˙é˙öŝüô˙˙ù˙ô˙˙˙˙ĝö˙ú˙üô˙˙û˙˙˙ô˙˙˙˙ġù˙ú˙˙ù˙ŭ÷˙ġ˙ĝ˙ġ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙ŝŝŝ˙ô˙˙ġ˙˙˙ĝ˙ú˙˙˙ŝ˙ŭü˙ŭ˙ö˙úú˙˙ġ˙ú˙˙ĝ˙ġü˙÷úóö˙˙˙üŝ˙ŭûŝŭ˙úġ˙ûû˙û˙˙ûüùû˙˙ûû˙ĝ˙üġ˙ü˙˙ú˙ŭ˙û˙˙˙‘$Ġŭô˙ù˙˙˙˙˙˙˙˙˙ú˙÷˙˙ñ˙ï˙˙ò˙÷˙û˙ŝû˙ü˙ñò˙ù˙˙˙ó˙ú˙ùŭ˙˙ù˙ŝ˙˙ŭ˙ö˙ġ˙˙˙˙˙˙˙˙˙˙òù˙ŝ˙ĝŝ˙ùŝĝ˙˙ñ˙ĝ˙ö˙˙ù˙ĝŝú˙û˙˙ü˙˙˙˙˙˙˙˙˙ŭ˙÷ŭ˙ŭ˙ù˙ò÷˙˙î˙ôŝ˙ú˙˙ö˙˙˙ŝ˙˙ŝŝ˙˙˙˙üġ˙ö˙˙üĝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ó˙ġô˙˙ĝ˙˙ùŭ˙˙üŝ˙ŝŝ˙üŭû˙ŝ˙˙˙í˙)–˙˙úŝú˙ġ&×ŭô˙òû˙˙ò˙ö˙ŭó˙ŭ¤˙Ŝġ˙˙ŝú˙ £ü˙ĝ˙˙óû˙ü˙˙í˙˙ó˙˙ĝ˙˙÷˙ŭ˙ŭ˙÷˙˙û˙˙˙˙˙ĝü˙ö˙˙˙˙ŝú˙ö˙˙ŝ˙˙üû˙˙˙˙ùŭ˙ú˙úŝü˙ú˙˙ï˙˙û˙ó˙÷ŝĝŝ˙ŝ˙Ë Ĥ˙÷˙˙ĝ˙˙˙˙˙˙˙˙ŝó˙˙ĝ˙ñ˙˙ë˙˙ŝ˙öŝŝú˙˙˙ú˙˙ö˙÷˙˙ĝ˙ĝ˙˙˙˙úü˙ŭ˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙ŝ˙˙ùŝ˙ù˙ŭ˙û˙˙˙˙ü˙÷ŭ˙˙ûö˙˙˙ĝ˙ö˙˙˙˙ó˙ú˙û˙˙˙ô˙˙ú˙ŭ˙ĝ˙ĝò˙ùú˙˙˙ĝü˙˙ġ˙˙í˙ò˙˙úŭ˙û˙˙˙˙˙˙˙ñ˙ĝġ˙ó˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ù˙öûö˙ŭ˙ĝ˙ù˙÷˙˙öü˙˙öú˙ùô˙˙ù˙˙˙ŝ˙ĝ˙˙˙˙˙˙˙˙˙ŭ˙ŝù˙ŭ˙üû˙ŝ˙ûù˙ùŝ˙úû˙÷ŝ˙û˙û÷˙˙ü˙ŝĝ˙ĝ˙ĝ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ÷˙ó˙˙Ë˙ŝŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙Ó§Ñ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙'šŭüü˙ŭŝö* ­Ĉŭ˙˙˙˙˙˙˙˙ŝ˙üùü×Ĥû˙ŭ˙ŝ˙˙˙ ˜˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝË#˜Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ö˙ŭö˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û×ß#Èŭ˙ûú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙& Şŭ˙ŝÇÌÓË˙˙˙˙˙˙˙˙˙˙ü˙˙˙üž +ĝ˙üûÑ&˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ÌċÜ˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ûòÙö)™˙ŝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷&–ü˙˙üŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê"š/–ġ˙ì˙˙˙˙˙˙˙˙ùŝŝ˙˙ûò¨ $§Ž½# 'òù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ô˙Ŝô˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öô˙َ+! ŝö˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭÜ#Éŝ˙ó÷˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙"'"–û˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŭŭ˙˙ĝ³%˘Çñ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŭ˙û˙˙÷˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ġ”8˜˙˙ù˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ œÄ˙ù˙ùŭ˙öú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ġ˙˧˙üù˙˙úġ˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝġûöŭ˙Ä˙ûü˙˙˙ö˙˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġùŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙Ġ-–Î˙ŝúïŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭôŭĠ˙˙ù˙ò˙˙÷˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷÷˙ü˙÷÷˙˙úûŭġŭ˙˙˙˙˙˙˙˙÷˙ŭ˙˙˙˙˙˙˙˙˙ġŬû˙ĝû˙ŝ˙ïû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙ûÌÉÔŝ÷ĝû˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭüúĉ˙˙˙˙ï˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉ˙˙ó˙˙÷˙˙ôù˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭô˙÷˙úü˙˙ûüö˙û˙÷˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ġ÷üú˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙ú˙ŭÑ˙÷˙˙ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝüŭ˙û˙ñ˙ó˙ü˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŭù˙û˙ì˙˙˙˙ò˙û˙˙˙˙˙˙˙˙ŭ˙ŭ˙û˙ö˙˙ü˙÷˙˙˙˙ŝ˙û˙ú˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭò˙÷˙˙ú˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ĝĝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ó˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙ŝüŝ˙˙˙ûŝ˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭò˙˙˙˙÷˙˙˙˙˙˙˙˙û˙ŭ˙ŭ˙ùô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙ŝ˙˙ù˙ŝ˙˙úüûú˙÷˙˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙ĝ˙ñŭ˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üù˙˙ĝù˙˙ûŭò˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙ó˙ñ˙ŝ˙˙ú˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óú˙˙˙˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ŝ˙˙ïô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŝ˙˙ûŭ˙˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üñ˙˙˙˙˙˙˙˙˙˙˙ùùŭ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙úùü˙˙˙˙˙˙˙˙˙˙ùôú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óú˙ü˙˙ùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙˙˙˙˙ï˙ŭ˙û˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò÷˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ï˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ŝŭŭŭĝ˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙ġü˙öŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙úĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭŭù˙ġ˙ú˙ùù˙ŭùûú˙öú˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ûúö˙úü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭûöĝ˙˙˙îúüî˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ò˙ôç˙üû˙˙÷÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ĝ˙˙öùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙üû˙˙óüŭŝç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙÷˙˙˙˙˙˙˙˙˙ü˙˙ĉ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ò˙˙˙ù˙˙˙˙˙˙˙˙˙˙ġŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭò˙˙˙ü˙˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öö˙˙˙˙˙ó˙÷˙ŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙î˙˙˙˙ê˙ŭö˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙˙ùúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙˙ö˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ĝ˙˙ö˙˙˙˙˙˙˙˙˙˙ü˙˙Öò÷ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙ö˙˙úûö˙˙˙ŭ˙˙÷ùú˙˙ùġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙ô˙úŝ˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ŭŝġñ˙ĝ˙úĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭ˙ŭ÷˙ĝ˙˙˙˙÷ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙ġġ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙˙˙ì˙˙ùġ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ú˙ò˙˙ñ˙˙˙˙˙˙˙˙˙ò˙ü˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üü˙ŭ˙ŭ˙˙ġŝ˙˙˙˙úġ˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝù˙˙û˙˙˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ñû˙˙˙ü˙û˙öŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ñ˙ĉ˙ñġ˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ÑÈĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙ĝêŜû˙˙ëŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙İÂħÎ˙˙˙˙˙˙˙˙˙ġáÇÑÙÇ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙Úġ˙ŝú˙ŭ˙ĝü˙ñÊÏÉ­½ù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙äĠ™'’ì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ù˙˙°ĵÑÒâ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙î˙ĝù˙!Ïŭûï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úâ™Ĵŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙×ݝùñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙òÍŻ˘”&Ħö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô˙ÑĦ˙˙˙˙˙˙˙˙ŭ˙“ ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙£'§ŭùŭŝû˙ù˙˙š)) ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûġ ²è˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭ˙ġàŽ ."ûñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ġ˙˙ !ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ï˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙û˙ĝ˙ò˙˙˙˙˙˙˙˙˙ŝ˙  *Ï˙˙ùû˙˙úü˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙ü˙ŭô˙˙üŝü˙ûùüĝİ"$˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ü˙ŝŭ˙˙˙ù˙ù˙˙Î£İ $ "˙ü˙˙ö˙˙÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙û˙˙˙ü˙óú˙˙ĝĝ#   ˙ü˙ï˙˙ĝ˙“ž˙˙˙˙ŭŝ˙˙˙ò˙˙Ŭ›á˙˙ñ˙ŝ˙ŭ˙˙ûŭ˙ú˙˙˙˙˙˙˙˙˙ùĝ˙ŝ˙˙üöûŝ˙˙ü÷˙˙ó˙˙˙ġ˙˙˙˙ŝüûû˙ûŭ˙ġŭ˙˙˙ö˙ŭŝú˙˙˙ü˙üûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝ˙˙˙ŝŭ˙ŭùû˙ŭ˙÷úĝ˙ùûĝ˙˙üû˙˙öŭ˙˙˙ŝ˙ó˙˙öù˙˙í˙%Ïúġ˙úù˙úĦ#!öüŝúŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙÷˙ú˙˙˙û" ˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙ŝùú˙ò˙˙˙˙ùû˙˙ü˙˙ó˙û˙÷˙üü˙˙üúŝ˙ŭ˙˙ġ˙˙ġù˙ŭ˙û˙˙˙ú˙˙˙ŝŭ˙ŝ˙˙˙˙˙ŝġ˙ò˙˙˙÷˙˙ú˙ûŭŝ˙úÑŻ# ü˙ú˙˙ü˙˙˙˙˙˙˙˙˙ŭŝòû˙ù˙˙ù˙ûòŝŭ˙˙˙ô˙#äöŭ˙˙˙˙˙˙˙˙ü˙ñ˙˙˙˙ġ˙úŭ˙ôû!% Ï˙î˙˙ùö˙˙˙˙ö˙ġ˙üöö˙û˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ž(È˙˙˙˙˙˙˙˙˙˙˙ŭ.#™˙˙ŝ˙úŭü˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù˙˙˙˙˙ûü˙˙˙ü˙˙ġĝ˙ô˙˙˙÷˙ ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù˙˙ŝüġù˙ù˙ö˙%" Ñî˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝöŭ˙˙ûûŝ˙û˙ŝ˙ġ˙˙!œ(ï˙˙ĝü÷˙ò˙ $ŭŝ˙˙˙˙ŭûî˙ôü“#Ċ˙˙˙ü˙ĝ˙ŭú˙˙ŝ˙˙˙˙˙˙˙˙˙˙ûŭ˙˙˙˙˙˙˙˙üĝ˙˙ŝ˙û˙ŝ˙ü˙ŝ˙úñ˙˙˙˙ö˙˙ġ˙˙÷ëû˙˙˙˙˙ûüŝ˙óû˙ġó˙ĝò˙˙˙˙˙˙˙˙ú˙˙˙ù˙ŭü˙üû˙˙˙˙˙üö˙˙óô˙ö˙ŝôöŭ˙˙˙˙ëñ÷˙˙˙˙÷˙˙ŝü˙ú$É˙˙ö˙ŭú(Úú˙­ ˙˙˙˙˙ú˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙ŭú˙ùŝôÙÛ(! §ñ˙ú˙úŝ÷˙˙˙˙˙˙˙˙˙ùŭŭú˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝŭŝ˙˙˙ùŭúü˙ŝüûüŝ˙˙û˙ú˙÷˙˙ŝ˙˙üŝ˙˙ŭúï˙˙˙˙˙û˙˙˙ùòü˙ù˙÷˙˙˙ŝ˙˙ŝŝŝ˙˙˙˙ġġ˙û˙˙˙˙ö˙˙˙˙‡%îŝŝ˙˙ù˙˙˙˙˙˙˙˙˙ò˙˙˙ŝ˙ŭŭ˙ŝ˙˙˙ò˙˙ôÑ ç˙˙˙˙˙˙˙˙˙˙˙ì˙üöùò˙˙˙òġ˙÷œ'Ĉ˙˙ñ˙˙˙úĝû˙˙˙úù˙˙˙÷˙˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ìöö˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙10!ñŝ˙˙˙˙˙˙˙˙ü˙üġ$¨ûŝŭ˙öŝúŝ˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙üŝ˙˙˙˙ûû˙ŭû˙˙˙˙˙ġ˙˙íŝ˙ŝì¸)" ˙˙ü˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙üùü˙˙˙˙˙˙ú˙˙£&ÍɘşĦË˙˙÷ò˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭí˙ŝ˙ü˙û˙˙óŸ) ˙¸Ĵ§Ÿé˙ġö˙˙ü˙˙ġ˙!Ÿ˙˙ŝ˙˙˙˙û˙˙ŝŝĴÒ˙ñüŭ˙ûüüùú˙ĝóü˙˙˙˙˙˙˙˙˙˙˙üòú˙ġ÷˙ü÷ŭ˙ûŭ˙˙ìùü˙ñ˙˙˙˙öôü˙˙ö˙úï˙û˙öù÷ŝ˙ùú˙˙˙ŭ˙ŭù˙ù˙˙˙˙˙˙˙˙˙ö˙˙˙ĝ˙ü˙˙ûû˙˙˙˙ŝü˙ñ˙˙ġû˙ûü˙˙˙ĝôöñ˙˙˙˙öŭú˙˙ûùúô˙ĝ &ĝù÷˙ö˙Êž˙˙ô›,  Ûïġ˙öüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙÷˙˙ô˙˙úŭ! %•˙óòŝ˙˙˙˙˙˙˙˙˙˙˙ö˙˙ú˙ŝùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭûŭ˙˙ŭ˙ŝ˙˙˙˙˙üŭ˙˙˙˙˙ĝ˙ĝŭ˙ŭŝŭŭ˙˙˙ŭ˙ö˙óûŭüùŝĝ˙˙˙ù˙˙÷ü˙ö˙ùö˙˙ñ˙ŝù˙ŝ˙˙˙ġ˙˙ĝŝ˙˙ùú˙% èŝŝ˙ŝŭ˙˙˙˙˙˙˙˙ú˙˙ŭġù˙ôô˙ùġŭ˙˙úñ˙ ħ“Ş›¤—˙˙˙˙˙˙˙˙˙˙˙˙üö˙˙ŭ˙è˙û˙û˙˙˙žÓ˙˙˙óġ÷ŝ˙˙î˙˙˙˙˙ï˙˙óóġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŞ!˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž˙ŭŝ˙˙˙˙ŭ˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙ĝ˙˙ü˙˙úÉü˙˙˙úûúž˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙˙˙˙óñûŝö˙ìïµ"ñ˙òÂ˙üüĝ˙˙˙˙ù˙ĝüñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ù˙óĝ˙ŝó˙˙Ĝ!"˙ÛùÊŝ˙˙üú˙˙ù˙˙ġÑ&Ĝ˙˙ŭŭ˙˙˙˙û˙˙ì)ı˙˙÷˙˙˙˙ú˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ŝ˙˙˙˙˙˙˙˙˙ü˙ŝŭ˙˙˙˙ûû˙˙÷˙˙ĝ˙ĝŭ˙ö˙˙˙ù˙˙˙ŭ˙˙˙˙÷ò˙ú˙˙ú˙ó˙˙˙˙˙˙˙˙ŝ˙ŭü˙˙ŭ˙ŝŭŭ˙˙ŭüŭ˙ŭ˙ç˙˙ġ˙ĝ˙˙˙˙˙˙˙ù˙ĝù˙ú˙üê˙û˙˙úï˙¨˙˙˙÷˙×-Ħĝ˙˙Ì%À˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óü˙ù˙˙˙ċû˙ú˙Ç""ùÜ˙˙˙öŭ˙˙˙˙˙˙˙˙ŭ˙˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙ŝ˙ĝġ˙ù˙˙ù˙˙˙˙˙˙û˙ŝú˙ŝú˙üŭŝŝ˙˙ŝü˙˙˙î˙ûû˙ü˙üĝ˙÷é˙˙˙˙ï˙ġ˙˙˙˙ú˙ê˙öüúüö˙˙ùôŝ˙ĝŭ˙˙•ë˙üöú˙˙˙˙˙˙˙˙˙˙ùñ˙˙˙˙˙˙˙˙ñù˙˙ĝ¤˙ŭÜíÛ˙ñ˙÷˙˙˙˙˙˙˙˙˙˙ö˙üûô˙û÷ŝ˙ĉŝ˙ġ%ĝŭî˙˙ŭŝŭ˙˙ö˙ġġû˙ĝ˙˙ú˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ġôŭû˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷'’ö˙˙˙˙˙˙˙˙˙öóġ˙$š˙úŝġüù˙ŭ˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙˙˙üü˙˙˙ü˙÷ŭ˙úòŭ˙˙ñ˙˙ô˙˙ŝù ŝü˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙ù˙˙˙˙˙˙˙ŝù˙ Ï˙˙Ûŝé˙öŝ˙˙˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ç˙˙í˙˙˙÷˙˙˙ôË #ĝ˙ô˙˙ġ˙˙˙ùù˙üû˙×#Áŭŝ˙ŝŭŭ˙˙˙˙ŭ˙˙ê˙˙˙˙÷˙˙ĝüüúŝüùŝ˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ü˙ü˙àì˙ŝĝ˙ŝ˙˙üè˙˙÷˙öó˙˙ŭü˙˙ú˙˙ò˙˛ñ˙ġù˙˙˙ú˙˙÷˙˙ûŝ˙˙˙˙˙˙˙˙˙˙ĝûü˙ûû˙ü˙˙˙üü˙˙ö˙˙˙ê˙˙ŭ˙ŭùü˙˙üĝ˙ôù˙÷÷˙˙˙˙˙ŭô˙˙ó˙˙éô˙˙ô˙˙ù$Ñŝú÷˙Ğĝûŝûŝ˙ŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›éŭ˙˙öï˙Ó&¤ŭôĝ˙ŭ˙˙˙˙˙˙˙˙˙˙ïûúüĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙ĝŭ˙˙˙ŭ˙˙ùöŭŭü˙˙ĝ˙ŝ˙˙˙üŝŭ˙˙˙ŝûü˙ù˙ŝü˙ó˙ô˙˙÷úû˙˙˙˙ò˙˙ŝü˙òü˙é˙˙˙˙ĝŭ˙˙ôĝ˙˙˙û˙˙ù˙Ò #âŝŝúû˙˙˙˙˙˙˙˙˙˙ŭö˙˙÷óĝĝó÷˙˙öŭ˙í˙– ˙íŭ˙î˙˙˙ü˙˙˙˙˙˙˙˙˙÷î˙ö˙˙ô¤˙ä˙û˙˙˙—(×˙˙ĝöö˙˙ñ˙˙ú˙˙˙ï˙ó˙öö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü˙öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝ#Ĵ˙ù˙˙˙˙˙˙˙˙˙˙ŝ˙Ŭñ˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙˙˙˙˙˙˙˙úŝ˙˙û˙˙ߜ˘ğú÷˙˙˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙ŝëê˙˙úòĝü˙˙ ' ˘ùúñ˙üü˙ġ˙ôûú˙ò˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ĉüö˙˙û˙÷˙˙üúÏ$#òŝ˙˙˙˙˙˙ùû˙˙ú˙˙˙ ˙˙˙˙˙˙˙ŭù˙ó˙ĝ˙˙óŝù˙ġĝ˙˙˙ö˙˙˙ĝ÷÷˙˙˙˙˙˙˙˙˙ŝ˙ŭôĝ˙˙ŝŭü˙˙ŭö˙˙üŭ˙ĝüü˙ŝù˙îî˙ĝü˙ö˙˙î˙ Í˙˙û˙ú˙˙˙ĝ˙ûŭ˙ô˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙˙ùú˙˙˙˙˙˙˙˙ö÷ù˙ŭó˙˙ŭ˙˙˙ôû˙ò˙˙ê˙˙îû˙ċ˙˙ĝ÷ù˙˙ò˙˙˙ò˙˙ô˙ ˜˙òüġĠ  —˙˙ġ˙ŭúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ú´˙˙ú˙˙ÌĈ˙˙˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙ô˙ûó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙÷ŭ˙ġİ˘Ÿ˙˙˙ŭ˙˙û˙üŝ˙˙ïú˙˙˙˙˙˙˙üŝ˙˙û˙˙ì˙˙ö˙ëü˙úĝ˙öĝ˙êÑŜò÷˙˙ü˙ï˙ġó˙˙ġ˙˙˙ŭ÷úö˙ü˙óŬÔġ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙î˙˙üü˙˙î˙˙˙˙˙Ş"ù˙ú˙ö÷ôööù˙˙˙˙˙˙˙˙˙˙˙˙ö˙ !ü˙˙ĝ˙ŝ',Èíŝû˙÷ñ˙˙ü˙ġ˙˙ôÊŜ˙î˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŜ˙óû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ ”˙˙˙˙˙˙˙˙˙˙ì˙˙óĦú˙îĝù˙ò˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ìòŭ˙˙˙˙˙ŭô˙˙ö˙÷ Ê˙Ùö˙ü˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ì÷ú˙˙˙˙˙˙˙ôéÇ˙˙˙ô˙ġ˙˙ò˙ÙÜî˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝŝü˙óû˙˙˙üá‘Ùù÷˙˙òñùû˙ú˙˙üùùË!"ü˙ŭöĝ˙˙˙û˙˙˙˙˙ŭ˙ŭ˙˙˙˙˙˙˙úĈĥĊÒÌë˙˙˙˙˙˙˙˙˙˙ŝŭüû˙˙üÏÊĜŜĉû˙˙˙ŝ÷ŝç˙ĉï˙ô˙ŭÙÑ˙˙ó˙ö˙˙˙ûñ˙üùŭî˙ûŝûö˙ú˙˙˙˙˙˙˙˙˙˙ŝ˙Ŭ˙˙ûŭ˙˙˙˙˙ŭòÓÑ!ŬĈù˙˙ùĝ˙˙÷ËĜ˙Ñ˙˙ÖÔÔÑ˙ö˙˙ŝúöü˙˙ë˙˙ï˙ĝ$ –˙˙˙˙—×Óż˙˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û"“˙ôü˙˙ñĊ,²ìĝĊÖèŜ˙˙˙˙˙˙˙˙˙ĊÏ£Ëâï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙ùÇ"Ÿò˙ġŝ˙ü˙˙ŭ˙˙Ìáŭ˙˙úöú˙˙˙˙˙ó˙˙ú˙˙ĝú˙˙ġ˙˙ö˙˙˙ï˙˙ġï˙˙˙˙˙ï˙˙ë˙˙ï˙˙˙û˙ĝ˙ŭġ$ßù˙˙˙ü˙˙˙˙˙˙˙˙üñ˙úö˙ì˙˙ì˙öú˙ñü˙ġ% "ŭïĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġ˙ôġ£%öûù˙˙í˙ÄíÖĠö˙ġŝ˙ë˙˙öÛÖšÑĠö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙–£§òŝ˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²Üñ˙˙ŭü˙˙˙˙û˙ĝœ2¤ġĝ˙ú˙ö˙ ˙ĝ˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²$™ŭ˙ôú˙úü˙,Ÿĝ˙ö˙ġ˙ŝš Òö˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙֔­  %Ôü˙˙˙˙”&ž˙˙í˙˙˙˙ġ˙ŭ˙˙ü˙˙˙Ŭ  Ÿ˙ñŬŜ˙˙ŝü˙ŝ˙ŭĝŝ˙˙˙ùġ˙ûÂĞ#ž˙ù˙˙˙˙˙˙˙˙ŭ˙ŝû˙ĝ– 0™ĝ˙÷˙˙× ™ú˙§™" ¸îü˙÷úœŸŻĝ˙˙˙֓ž˘ü˙˙˙˙˙˙˙˙ŝ˙ñ˙¨ŭ˙ü˙˙üŭ˙˙ñÜ$ Öû˙ö˙˙š& ˙˙– Í˙÷ĝ˙ü˙à‹Ï˙ó˙ŝĤ ˙ó˙ŭĊ"É÷ŭ˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Í)˙ü˙ú˙˙Ñ˙Ħ%´˙˙˙˙˙˙˙˙˙˙$˙Ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙ú÷˙˙ÔĞîŜô˙˙ŭ˙ú˙ĝÊĝ˙˙òéñŝ˙˙ŝ˙ûûŭ˙Ë'š›ŸŸÔ˙˙ŭĦ££ —ùĴ"›Ñù˙˙ÈÎħ'£˙ú˙û˙ġ˙˙!ĝ˙ûúŝ˙˙˙˙˙˙˙˙˙˙ú˙÷˙#™™#˙÷˙ú˙˙ö­˙ô˙˙˙ûù˙˙˙˙˙˙˙˙˙˙˙ĝĝ'¨˘ûûŝù$ ) ˙ĝ˙ö˙ú˙!˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙ŭĝ˙ö˙˙ŝ˙ŭû˙ġ˙ùü˙ü˙òÙüŝ˙ô˙ŝŝ˙˙˙ù˙÷ö˙˙˙˙˙ŝ˙˙˙˙ŝñ˙˙˙ŭ˙÷˙ò˙ü˙ô˙ŝ˙˙˙ŭ˙˙˙ù˙ŭô˙Çĝ˙üŭ˙˙˙ûû˙öŝ˙öû˙ġĜ˙ŝ˙ô˙ĝ˙˙˙÷ĝ˙˙Ċ˙˙˙÷û˙üŝ˙˙˙˙˙˙˙˙˙ġ˙ĊĤÌĝ˙˘¨œÑ˙ûú˙ŭ˙ĤĤŻ–Ïĝ˙÷ö˙٘­›Îô˙úüœ'Ûò˙˙ŝĠ“!Ċ¨Ç˙˙˙ŝüüœĈÙ˙ùŝ˙÷ô˙ŭŭ˙˙˙ÍÂ˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ$&˙˙ġ˙Â(#˙œ '•˙˙˙˙ŭü˙ü÷Ż% —Ğîû˙Î"šŞ%Öĝ˙˙ô˙˙˙À µÀ˙˙÷˙ ""úû˙˙ù˙­"!"˘úû˙˙˙˙˙˙˙˙˙˙ŭú˙ġÉÏĝ˙‰%%Ĥú˙˙˙˙˙˙˙˙˙ö˙÷Ê,  ­Ê˙ŭ˙˙üûĝûú˙ġ–˙˙˙˙˙˙˙˙˙˙ú˙˙˙  #Òĝ˙˙˙!- 'È˙üĝ"(Ó˙ù( ù˙˙ò˙˙ö˙¨! !›"˙ü˙ž+  Úŭ˙û› & $Ì &#Ì˙˙˙š²ŒÌ˙˙Ô ˙ô˙ˤ &È˙˙ŝö˙˙ù˙˙ĝ˙ó˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ôŸ›—˙˙Ô"˘ŭö÷˙ö˙Ÿ" (ç˙˙˙ö˙˙˙ûĝ˙ŝ˙ġûÓ & ŝ˙úûàĤ˙ú÷Ġ"$ £˙˙üŭ˙ ­˙פü˙ĝ #'œġ˙˙ŝ˙̨Ì˙ö˙˙ú˙ŭ˙˙˙˙ú˙ġ˙­ # œ˙˙ñ˙Ï#˙û˙ü÷˙ŝ˙˙˙˙˙˙˙˙ŭĝ˙Ìü˙Í#!# ˜ĤÀ˙ò˙˙ /#­ú˙î˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ì˙ûñ˙ŝŝûöĝ˙ŝ˙ĝŝ˙˙ú˙ÑÌ˙ô˙òŭô˙ô˙ÜóÙÔ˙ùû˙˙˙˙˙˙ô˙ùéÏÎÍÛÈŝ˙ĝ÷ŭÖÉ×Ûö˙ÌıÌ˙ñî˙˙ŝ˙ŬĊž˙ŭ˙˙ú˙Ó¤Ğì˙÷ĵÊÌÓê˙ñ˙Áğ+ À˙˙ò˙ö˙˙˙˙˙˙˙˙ì°) 8ù˙˙Ñ  ç˙˙ú˜ œ˙ċ˙˙˙öŭ–:˙úúûÚ"›Ñŭ˙ú˙˙Ŝ ( ħû˙˙˙˙˙˙˙˙˙öö˙ĝ"Ħ(!% ˙˙û×#šû"'£ü˙ĝü˙˙÷ü˙ "˙˙ù¤ 5  Ë˙ñ˙˙ġ(' (ŝï˙˙ ŭ˙ùŝŝĠ*) š˙˙˙˙˙˙˙˙˙ŝ˙˙˙êßÉ÷ Ĥï˙³  ġ˙˙˙˙˙˙˙˙˙˙üùÏ ˙!*ù˙ï˙û×0$˙ŭ˙ö• 7Ĥŭ˙˙˙˙˙˙˙˙˙÷˙ñ" $%Ħ˙Ì˙ñŞ&˞Ë/ ûÒ˙£0-û˙¨ Şùì˙ùÒ# ž¤ž" #ĞüΙÎĝ˙ £ï˙´²îüà" )˙ïŝ˙Ï÷˙êò˙òÑĤÍ÷ÓÑ˙˙ú˙˙˙˙òò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûòç %Ĥúú˙Ö# èŝ™ ž˙Ö÷˙Ċż˙ú 'ü˙˙˙˙ġŭ˙˙˙òŭ˙˙Ğ˙ŝ˙¤û˙ % ™ŭ˙˙Ú !–˙ĝ˙˙%µâÎ Î !!!úûû˜!$ ĦĞÚüŭöüŜ’ü˙üùŭ˙˙ŭ˙˙üüü˙˙Ò Ş$ •˙ŝ˙ !&ġ˙˙˙ùüŭ˙˙˙˙˙˙˙˙˙˙ŝş"#˘û˙˙ÔŞĞ$)—˙˙é”%"Ë˙˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ù˙˙ûĜ˜Ÿ³œ¤˙ĝ˙ïö˙í͞ " Ëô˙˙˙ġ˙ & ‘˙˙˙ŝüŭ˙˙˙˙ö (˙ü¨" ˙˜",Š˙ĝ˙ŭù%/˙ġ˙ɰ2şĤ--˙˙Ñ ( 4 œ˙ñ˙˙˙˙˙˙˙˙˙˙Ĝ !(Âŝô˙& Ü˙ĝ˙"™˙˙ŝ ˙¤ .è˙û3Ċŝû$˙÷ì˙ŝ!!# İö˙˙˙˙˙˙˙˙˙˙˙˙ü'§ù›˘& Ñò˙˙˜$,Í˙!6ŽÔŭ˙úú˙˙ŝ˙ŭ–'œ–˙˙ûĊ'$ ŸĞš3#Ó˙÷û˙­ħĤ# "Ħ˙˙˙Ĥ˙üŭû)4 !"! û˙˙˙˙˙˙˙˙ĝ˙˙ú²! ˙ĝ˙˙(#Ĵë˙ùÎ֝à˙˙˙˙˙˙˙˙˙˙˙ĝ˙Ş û˙˙ù£& ˘˙˙öġ–# )˙˙ú˙* ߟ˙ĝ˙˙˙˙˙˙˙˙üĝŭ×" Ş ò˙ĝ˙ġ§‘˙Ó˙—Ë˙ĝú˙# ıËó˙î˙“ž˙˙Ò˙ú˙û$ß˙¤&¨š¤ġ!˙üŭùĴ#˙ûöž( ˙˙ġù²ŝ˙˙ŭ˙''È˙ĝ˙˙›"£ĝ˙˙ġ˘à˙˙ŝ÷˙ŭïúĝŭ˙˙˙˙˙˙ò˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô !#¨Ç˙˙ùüŝÍ#Ö÷ġŝ&ô˙˙û¤#Фž˙ï˙˙÷˙˙ŭö˙˙ŭò˘ ) ç˙˙%Ş$œ˙˙Ô% üÌ+!Ì˙í!!™Ñï˙§,üù˙ö.ŞúŸ“#05£/   •“˙ô˙'Ġó˙•-Ìĝ˙ùŭ÷%Ċ˙ú˙˙ô˙ŝŭ˙˙ùû˙˙˙!*œ˙ôô–˙˙í˙'$#Ž—˙ĝŝŝ˙üû˙˙˙˙˙˙˙˙˙ò˙˙Ċ 0ôÑŭ÷˙ŝÈ%óó˙Ï$ š˙˙Ĥ (şĝ˙ìù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüùö˙%żö˙ġöŻ" ˙é˙˙)ü˙˙˙üŝ˙˙˙û˙š. $*ó˙œ"! Ğ˙•! ó˙ĝʨ !1—ßí + ĦôÏ'%ì˙˙é˙˙˙˙˙˙˙˙ö´ , ĤĴ˙ì' Û×Ïħ#Ğċ˙ÇÚ˙ùĝ˙ ˙˙éùĦ   ŜÑ˙˙Ï$Ħ˙¨È­‘ü˙ĝ˘ËÛù“,¤òü˙˙˙˙˙˙˙˙˙ùĝ˙" ž˙ŭ˙£!#˙ëü˜ ˙˙Ċüü˙˙˙˙ûù˙˙Ï˙'Éü˙˙ï˙˙,˜˙ñ˙É ˙˙%ž÷ûí˙ Ĥûû˙ŸÙŝü˙˙A#- )ô˙˙˙˙˙˙˙˙˙úó˙  ›ŭ˙ĉ˙ #˙˙˙Ċ2œ˙Ëòŭŭ˙˙˙˙˙˙˙˙ŝŭù.Ÿĝ˙ŭú™ ˘÷˙˙ŝ˙˙ù˙™ì˙ÓÒò˙˙˙˙˙˙˙˙˙ŭ˙úü™ÛÉÖġ˙˙˙ŝ÷ûĠ#Îŭùú˙§˙ŭ˙ġœôî˙˙˙ÓÚ˙êŭĝúĝ˙ß $£íü˙˙!˙Ö˙í8 û˙ü˙˙ïž˙î¸û˙û˙Í $˙˙ö˙ġ°£˙ŝ˙÷žö˙˙˙Ŝ $Ôúü˙í˙û˙˙˙˙ç˙ŝä˙ŝ˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙÷$ ˙˙ó˙ò˙˙•˙˙Òț²ĝ˙ûÇ" §˙öû˙ġ˙ŭ˙˙˙ùî˙¤! ˙ĈŝĜôĊô˙î¤$+ %˙ù˙ŭ­ Ñ˙˙˙û˙˙˙Ÿ-&* ™Í۟ ' ç˙˙˙ŝŭû§˙˙ĝ˙ ú˙˙˙û˙û÷˙˙ó˙ûŝ˙˙ü˙˙òĈ!š˙˙˙Ü˙œ)˙ï˙˙˙ú˙ĝô÷˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙!ŭ˙˙˙ô˙×”˙˙ûÊ%§öü› ”˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ßû /˘ ! È˙˙ &œÏË *Ä˙ŭ£#'öŝî˙!áñ˙˙˙˙˙ùĝ˙˙ö ˙ù˙&Ş˙â˙Ÿ&ġ˙ù˙" Ô˙˙Ä/#˘£Ĥá˙ŭ!˙ÏÍŝü˙˙˙˙˙˙˙˙˙˙ö˙ û˙˙˜ñŝÔ"Â˙êŭ˙ò !Ŝü˙É$ Ğ÷˙˙óİġġ˙˙ó°Ĝ˙ëŝû˙î # )*“Ŝ˙“%˙ĝôŭħ­˙˙˙˙˙˙˙˙˙˙˙ŭĝ˙ $Ñû˙˙˙˙˙˙˙ŝ $ Ĝü¤§˙˙üŭüû˙ĝ˙ŭŝöĝ¤ß˙˙ġ˙ŝ£" Ñò×˙˙+–˙úÑßŭ˙˙éŬ!˙Ä˙•À˙˙ŭ£ £’™&ĤĦ˜˙˙˙˙˙˙˙˙˙˙˙ –˙ñ˙˙Ĉì˙˙˙šĝÚúü˙˙˙˙˙˙˙˙˙ŝ˙ĝ!˙˙˙˙Ĵ&Í˙÷˙ö˙Ö*ï˙˙ġħ#&”™ŝĜ˙˙˙˙˙˙˙˙˙˙é˙ŭ˙ú˙üú÷˙$öóú˙˙Ó˙˙˙ñ%ŭ˙ĝ˙œ˙˙˙˙˙ŝöû÷í˙˙Ù2˙˙ĝĊ˘˙˙ŭê !Ħ˙Î˙Ħ Üî˙ŝ˙˙ #›ö˙#Ñù˙˙úôž1ü˙ñ˙ / ­ġ˙ŭ˙°"œ˙ó˙•!Ĉ˙˙˙˙ùñ˙˙ġù˙˙˙ò˙ù˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˘ ĥùï˙ö˙˙û, ­˙˙˙§#—×ò˙è &#$żô˙üŝ˙èü˙˙˙úìúÒ˙˙éÏ ˙ö˙ö˙%""˙öŭġ  öññ÷ŭ% ûûŭ  £¤˜·"–§Ŭ˙Î%  úÖòù˙˙ŝÎ˙ë˙˙3 Ġö˙˙˙â"˙ö˙˙üŝ˙ŝ˙ü˙ŝ˙˙Ï" 6—í˙ŝû˙3÷˙˙ġ!û˙ŝŝ˙˙ĝ˙ġ˙˙˙˙˙˙˙˙˙ù˙ü˙Ÿ§˙ûö˙ñ˙Ċû˙˙Ôœŭ˙˘!Èü˙˙˙î˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù’+-"" ÍëíËѲ!ï˙”˙˙˙ó¤ ñŭ˙˙ü˙˙˙ŭĝñ˙˙3˙ĝ’!!ê˙˙ÎËôÚ˙š $&Ċ˙ŭûÖ Î˙˙ó˙ôñ¨  0#°ŭû˙˙˙˙˙˙˙˙˙ŝŝ"Ç˙ê˙˙˙˙"Ħ˙ŭ˙˙ê˙Ï!Éüëċ “˙÷˙˙›˙˙˙öüž$Ê˙˙˙˙úÌ' '((”˙ĝΤ'ó˙˙˙ñ)œÒ˙˙˙˙˙˙˙˙˙˙˙ûĤ˙˙ó˙˙ -)Áö˙˙î!ìİ$Ŭŝ÷ú˙úù˙û˙÷˙˙˙›+$ı˙ü˙˙è˙ŝĦ˙÷˙úô¨&˙öŻ%"ĉŭ˙óŝü !ú˙§)·ù÷˙Ħ!Şöŭî˙ĝġ˙ú˙˙˙˙˙˙˙˙˙ĝ˙ëÊ+˙ñ˙ġô˙™" ˘˙üô½ œö˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙(ü˙˙öü—"£ò˙˙ë˙˙˙ì˙Ö ˙˙˙˙˙˙˙˙˙÷˙ô÷ŭ˙ù˙˙ò "˙˙˙ÉĉÀ%Ëĝô˙Ö˙ŭ˙úŞ# ›˙ûġù˙˙û˙ùŝ˙ !úġ˙Ĥ,ž˙˙ĝ˙! Ÿ˙é˙Ŭ9(ċ˙˙ö÷Ħ ŞûĝΟú˙ċ˙˙.Î˙ŝ˙˙Ħô˙˙â§.÷˙˙˙,¨üû˙˙öŭû˙Ä˙ìù˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙Ĥ !ĝ˙ñ˙˙ŝĤ#Ëüù÷  "ċ˙ù„%"×÷û˙˙˙ôÔ˙˙˙˙ĝ˙˙˙ŭù˙˙úé”!£˙ë˙Ë/Ħì˙ùúüîÜî˙ûÎ˙˙í˙ù˙˙ú"Ċ˙Ĝ˙ï˙+·˙˙ô˘)"í˙ŝô˙˙ŝŭùöŝ˙!+˙˙˙ö˙úüŝŝù˙˙Ô Ġöŝü˙ĝô˙ŝ˙ú˙ŭ˙˙ù˙ŭŝĝĞ’˙óù˙Ï˙§#˙Ì˙ñĞ $üĝ˙÷˙˙ŭ˙ö˙˙˙˙˙˙˙˙˙˙ŭ˙÷¨! Ħ˙˙ú˙˙òİ˙òŭ÷Ôž˙÷£ ×˙˙ö˙˙ú˙˙ŭŝúĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĝ (˘ğ§˙˙˙ ! Óŝò£!Éù˙ġ˙ŭ˙˙ûġü˙˙˙˙˙˙í˙$Â˙˙"Ûôŝ£ŝ˙ŭŭ +Ÿ£ĊАù˙ü˙˙2£˙ô˙öó˙Ħ" &)™˙˙ŭ˙˙˙˙˙˙˙˙˙˙ĝö§Ôû˙î˙üË- +ŝ˙òĝü˙Û˙˙ñ $¨è˙ö˙˙˙˙˙˙£Âĝŭ˙ù˙¨!˘ÖÏÏÎÈ˙˙˙Ï,˙ù˙˙ŝ­˙û˙˙˙˙˙˙˙˙óŭûú%Ÿġ˙˙ó˙˜Í˙ô˙˙¤'ö(ûùġ˙˙˙˙ü˙÷˙˙îĝ%"Û˙ò˙ñ˙ô˙&§ü˙ô˙˙ )˙)Ó˙˙ŝ˙ĝŝħ˙û˙Ÿ 7˙˙üĴĠ˙˙˙˙ñ˙˙÷÷˙˙˙˙˙˙˙˙ûŭüĜ"Ž˙˙˙ü˙ï˙˙Ċ#*ñ˙ûĝ˙˙˙˙˙˙˙˙˙˙ôĝ%ù˙ê˙˙ £˙ûŭ˙˙ "ôö˙˙ò˙ %·˙˙˙˙˙˙˙˙˙˙è˙˙ëĜĵ$$ĝĝ˙˙˙Żó˙ĝ˙ŭ )ô˙Ĝŭ'"İŭú˙ùü˙˙À'.ùû˙ô&œü˙û˙ ï˙˙Ħ" Ĝüö˙˙ŝ˙ Ï÷˙˙#˙ö˙ñĈÒ˙öŝùž ž˙˙ù˙² ˙ĝó˙)( šĝ˙ùŝ˙˙ġ˙ò˙÷˙ù˙öŭ˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙÷!( ü˙˙˙ë˙¨Ĝ˙˙˙Ù"!Ôŝ˙'ú˙˙ù˙ï˙˙˙òĝù˙˙÷˙˙˙˙˙òû˙˙" ˙öĜ˘ 2Ì˙˙é˙ü¨˙˙óú˙î˙˙ĝ˙˙ġß $˙ġñ˙˙$–ò˙ŭ$ŭ×˙˙ò˙ŭü˙û˙˙ñ ˜ñù˙˙÷˙˙âßۙ%ŝ˙ú˙Ğ˙˙ĝ˙ŭ˙ĝ˙˙ĝ˙üŝù,°˙˙ġ˙ġ˙› —˙ŝŝĤ˙ô˙˙üġ˙˙üü˙˙˙˙˙˙˙˙˙ò˙íŞ %š˙ŭü˙öòŬúü˙˙ġ˙ùÔ 7ë˙˙öĝ˙˙ôê˙˙öú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙œ™˙ú˙˙˙óŝ˙ò™$ ˘¨˜ŸÎŭô˙œ˘˜Ûñ˙˙˙˙˙ĝĝ˙˙ú˙ŭŻÚ÷ûİ˙úͤŭŝ˙ĝÉ" úö˙úË˙˙˙˙ĝ˙úĴ ú˙˙ŝ˙˙#ú˙˙ġ˙˙ġŭÒ÷ü˙ó˙˙˙˙˙˙˙˙ĝÛ˙˙ù˙˙ĝĜ )Í˙ĝ˙˙ü˙# ŭŝ˙š˙ŝ˙ŝ(À˙ü˙üÒ˙˙ù˙û%¤˙˙˙öŝ˙úù˙˘÷ú˙˙ûĝ˙˙˙˙˙˙˙˙˙˙˙ŭ˙Ğŭ˙˙ŭû²ĝĝ˙ûŭÇ!Ż˙˙˙˙ö˙˙˙üŝŝŭ˙˘ Íŭ˙ŭü˙÷ü İö˙˙ú˙˜˙ùš1 Ĥ˙ü˙ĝ˙ŝ ĝ˙˙˜*×üÎù $#Ôùŭ˙÷˙öù˙ü˙˙˙˙˙˙˙˙˙ü˙É! Üò˙ò˙ŝŝœ˙˙˙Ì˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ Ïŭ˙ûŝ¤˙÷˙ûġĦ' ó˙òú˙ô×Ğœ' ú˙˙˙˙˙˙˙˙ü˙ĝï˙Ĥßú˙˙ŭ˙üÌ!”˙˙ŭ˙ŝ˙˙ñ˙Şù˙˙ŝŝ˙ùÑ!—Ó$Í˙ŭ˙(Ù˙÷Ÿ%*˙ô˙˙Ï$Üö˙˙ŭŭÍ˙˙˙˙ Ĥûŝŝ˙Îúî˙ŝ" %ûü˙˙Ž"˙üŝÌ( -˙ĝ˙ĝġ˙ûÒ›Óò˙˙û˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙ù˙˙˙ŝ"˘˙÷˙ġÓ—˙ôöÍŭ˙˙ú˙˙˙˙ŭ˙˙í˙˙ŝ˙ŝĝ˙ü˙ù˙İ Ê˙¤Í˙ò˙ŭ˙Ċ˙ô˙ŭ˙˙ó˙˙˙û˙Îû˙˙˙ü#(˙˙Á$£˙˙ŝ˙ü˙˙÷˙ĝĝ×!£Ñ˙üŝ˙ŭô˙—Ÿ!É˙˙ô˙›˙ô˙˙öù˙ü˙÷˙ŝ˙˙Ħ ž˙ŝú˙˙ôžĤö˙˙& ù˙óŝ˙úŝŝü˙˙˙˙˙˙˙˙˙ŭ˙ġ˙ §ó˙˙ŝü˙“˙˙ûú˙÷˙˙!Ž˙ŭü˙˙˙÷˙˙˙û˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĥ˙ùù˙˙˙˙ö˙ù"#½˙óô˙˙ŭ˙ûô˙£! .™˙÷ŭ˙˙ü˙˙˙ġ˙ú÷ı!Óù˙¤Ÿŭŝ§£ŭ˙÷˙Ò'Ÿ˙ù˙û˙ĝ˙˙˙û˙ĝÒ&ù˙˙ô˙ŝ(˙˙ü˙ü˙ü˙ŭ˙üú˙˙˙˙˙˙˙˙˙ûŭö˙Öó˙ŭŝ˙Ñ #Ñó˙ê˙ŝÊ!Îŝü˙žĦŝ˙˙öĦĠïü˙ó)Ïù˙ù˙óÓúú˙˙ò˙˙÷˙™'Ċï˙ùô˙Ÿ¨ġ˙˙˙˙˙˙˙˙˙˙˙ìö' ĞÊ˙˙ü˙şŸ˙˙˙˙û˙Ħ$!Ì˙˙˙˙˙˙˙˙˙˙ù˙û˙ŸĦüö˙˙ġ˙ŭš˙˙˙û˙–ĝû˙´úü˙˙ĝ˙"§ŭ÷˙Ħ ! ¤û˙˙˙™˙ûö˙˙˙÷˙ñ˙˙˙˙˙˙˙˙˙÷˙û˙À˙ü˙˙*üßóöĴ§ó˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ ,úü˙ŝû§Ħô˙ú˙˙ +ŭù˙íħĦŝ˙û˙' Ó˙˙˙˙˙˙˙˙ŭĝ˙ñ$$÷˙ûúŝû˙¤÷˙ñ˙Ĝ û˙˙Ĵ" ŭû˙÷ú˙ÔÚûü  ˙ñ˙˙Ĉ˙ŝ˙˙È˙ú˙ĝ˙ùŭ# âïû˙Ŭġ"˙÷˙úĦ˙ù˙˙Í›˙˙ûĝ¤˙˙˙“/¨ĝ˙˙˙# ĝ˙ë˙ñ˙Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü"ĝÖüö˙Ä˙—ú˙˙ŭ˙žöĠûÒ$ "˘˙÷˙ù˙û›á˙ú˙˙ĝ˙ö˙˙ĝ˙˙ŝûÎ ûö˙˙˙˙˙ š˙÷˙˙ù˙˙ĝ˙˙÷úû""û˙˙ò˙ ˙˙欄˙˙û˙˙˙˙ú˙˙ùú—˙˙ù˙˙ÌóĞ×ùŭÓù˙ö˙Ş ŝù˙ú÷˙˙ó˙˙ó˙ġĤ$–˙Ġù˙˙óš˙Ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙( ˙÷˙ûù˙›!˙Ĝí˙ô›ì˙˙ŝ§Ċ˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙. &˙Ó˙î˙˙˙˙ò˙Ò)Èüŝû˙ĝĈü˙ú˙ŝ˙ĝĥË(ĝ˙úö˙˙ùü˙ù˙ŝ˙â@#â•)³˙Ìò˙ú˙ċ˙û™ (Ôû˙ġ˙ü˙ôï÷˙˙ü–Ç˙êü˙ù˙Ž1ġ˙˙ĝ˙ĝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š Ÿŭ˙ëŭ˙ĝ$"Ë˙˙˙˙˙×˙˙Ñï “˙Èü˙% ™ô˙ô˙Ñ" §Ûî˙ù˙Û1 ˙òû˙ù˙÷˙óÛ á˙˙˙˙û˘ú˙˙˙˙˙˙˙˙˙ò˙˙˙ ) èüùŝí"-İñ÷˙˙û˙Î Óù˙˙˙˙˙˙˙˙ĝ˙˙ö 'Í˙˙ŭ˙ö˙˙' µŝù˙ŝò.™˙˙ú£˙˙öŭ˙˙ )½˙˙óÉ, à˙ġŝ&$Ó˙÷˙óĦÏ˙˙˙˙˙˙˙˙˙˙˙óŭĦ#ò˙ŭ˙è*˙˙î˙ç‹%Ñŭĝ÷û˙˙˙˙˙˙˙˙ú˙˙ ˙û˙úÖ# ˙ä˙Ïŭ ˙û˙˙ ¨Âàú%˙˙˙˙˙˙˙˙˙˙˙˙×È˙Ÿ! %Öû˙ó(˙è˙˙Í1˙ô˙˙§$žÚğ˙˙î.Œ˙öŭ –Ì˙÷˙ŝŞ ˙ñŭ˙û˙˙˙˙ü˙˙ , ˙˙˙ì§'Ĉ˙ôñ!Ĵé˙˙ "˘ô˙˙/ŭûó× (1ù˙ŝòÒô+ż˙Ú $$Ìñ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö#$  ˙û˙˙í*#Ĝŝ÷úş ˙Îò×ù˙˙˙ŜÂÚ#—êú˙˙û˙˙˙ô˙ĝó˙ŝ¤(" /Ĥ˙˙ùï˙˙Úŝñ˙üû½Ñö˙˙˙˙  ˙óñ˙ŭŻú˙ñĉ ŸÉ˙ìÇ%×˙˙ù˙0ú˙ô˙˙á™úä›'žĠŭû÷µï˙òŝ˙ġ˙ö˙˙ù˙˙Íñ˙úú÷Ĵ#Ú˙ú˙'#ĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŭ˙œ ÜĈ¨Ĝ˙˙˙÷˙ô˙$°ı˙ö›#"ÌàÙù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—#Ŝî˙û˙üò˙üùœ 0#˙ú˙˙˙˙ŝ˙ĝ÷óŝöĝŝ˙É*û˙ŝü˙˙üû˙ŝ˙ĝ˙ú‚§)¤˙û˙ŝ˙ŝ˙´œÏí˙ô˙É˙˙˙û˙ú×˙ì˙˙÷ö­! Ÿŝ˙ç˙˙üŭ˙ìôŝŭ˙˙˙˙˙˙˙˙˙çú'!ŝ˙˙˙˙ġ˙ Şê˙ïö× ŝ˙ĝ˙™3˙ú˙Ë!˙ê˙ĝü ˙˙˙ú˙ż!#ù˙˙˙ŭħ˙÷! ĠŭëÍÏ" –˙ŭ˙˙˙˙˙˙˙˙˙˙ì !’ô˙ô¨—Éèġ˙˙ú˙ûİ2 µ÷˙˙˙˙˙˙˙˙˙˙˙úŝ˙² 3¨Ó“˜˙ó)ŭü˙˙˙˙ë˙í$˙é˙ë* ›˙ñûö² $š˙ĝ˙˙+œ£˙ŸÉŭ˙˙˙˙˙˙˙˙üŝŭ˙ûÈ)˘Ŭ˙Œ˙ùŭñ‘(Çŝ˙˙˙˙˙˙˙˙˙˙ù¤$˙˙ò '˙ŭúÛ Ş˙é˙#˜—! £ŝ˙˙˙˙˙˙˙˙˙˙ġÄ(£$˙ŝ'% ˙˙è$ #˙˙ŝġ¨ ä˙Ô!ï˙Ş 5#$Ò˙ò!Ñ˙÷˙Ì˙óô˙˙˙˙ %¨’Ħ§Ġö˙›'Ĥ÷™&(Ĥù˙“!!ž˙ŝ -Ĥŭû˙!"£ıò×" Úô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ )‰şÜ"ċ˙ä$" ¤ĝ˙É#*Ċ˙’ìŝ˙˙üŭ˙ŝĝ˙ùŬëĴ'Ç˙óë˙˙ñŝî˙÷˙ô˙* ˜ċ˙üÒ'˙î˙û–/&¤û˙ŝšö˙˙ûĠ! Ş Ê˙ü˙Ì'ĤÈú˙û˙–*" • ( Ĉ˙Ä,&üŭ˙û˙˙ŝû˙˙ŝ˙˙ö×''˙Ó­"ġ˙ġž!"£Û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙í› $ú¨˙ĝŻ˙üœ(×˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĵ$ .ŸŬ˙ŭ˙˙˙˙˙˙Ÿŭ˙ëúë˙˙ó˙˙ ˙ŭ˙˙ó–˙ù˙˙˙û˙˙˙˙ŝö˙˙ğ" Ì˙ %ħï˙˙ö˙ŭġšŞûú˙ûÏĵĝôù˙Ĥ Ċ˙˙ŝŭ˙˙ÔàŝŜË˙•"˙˙˙ŝ˙˙˙˙˙˙˙˙ö˙ż  Íöĝ˙˙ñ˙Ú˙˙Ú!˙ĝ˙öù ÓÍ$Żü˙˙ž'•§˙˙ΎâÛô˙Ĵ+½˙ü›$Ì˙˙˙˙˙˙˙˙òù˙˙ 5 /$ ˙óó˙˙˙üü˙Ííŭ˙˙˙˙˙˙˙˙˙ùġúŭü’4ת$ !˘˙Ïù)-˙í˙‘˙ġ4Ĉġ˙÷Ò+ ˙˙ùĉ%Žßö˙˙˙˙˙˙˙˙˙˙˙ûġ‘!•Ĥ 2Ë˙ú˙İ" +˙ĉŝ˙˙˙˙˙˙˙˙˙($Ç˙˙%˙êŬ "î˙ñ%%Û˙û˙˙˙˙˙˙˙˙ú˙˙ŭ˜.+ "˙Ğ(ĥî˙¨!$Á˙˙˙û7²úëŞ &˙ĈŠô˙ĝ+•Òû˙ü˙ŝ˙öŭôü˙❠(&ŭû˙×°Ô˙ Ó˙˙  Ä˙Ş"%˙ŝñ˙$ ö˙îĦ"%&Ĉ˙ûì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙É &Ġ„&' é“$Ğ˙÷˙¨!) Úŝüŝ˙˙ŝŝ˙ü˙ùúŭĈ+ '# ˜˙˙˙îŭù÷ŭù% 4 ˜â˙û¤( ˙˙ ,´˙˙÷öè " $"ŜùĝŝĦ  Í˙˙ûú˙$&$˙ŝœ )˙üŭ˙ŭŝ˙˙˙˙ŝŝ˙ĝÂ&  Êĝ˙¨&/%ˆ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙û˙ 0˙Ĥ˙İ "Äñû˙— *żŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙–'' ›˙˙òùŭ˙˙÷  Öê˙˙˙Ħ”˙íÖİò˙˙É!˙˙˙û˙˙˙ŝüü˙˙˙˙&%˙û -•ù˙ó˙ò˙˙Ç)Ĝ˙ġÈ)˙˙˙ï2˘Úôĝ˙˙˙ŭ ³¤+ĝô˙˙˙˙˙˙˙˙˙˙˙ìž)İĝ˙ï˙˙ŝĵ˙šı˙˙üú˙"#! Ğíŭù$$Éöû'2Ïú˙ó$ĝċ !á˙˙˙˙˙˙˙˙˙ŝñŝĤµ“#Ĥ¨˙˙ŝ˙˙ŭ˙ù˙˙š£˙˙ĝ˙˙˙˙˙˙˙˙˙ù˙˙ĉè   ™ ˙ - ˙ŭÙ$˙˙ùġŞ   Î˙û˙Ğ&$˜÷˙ù˙­§1œ÷˙ü˙˙˙˙˙˙˙˙˙ï˙˙˙˙˙ìĦħ° '™Ê˙˙ĉ˙ö" œš˙ŝ˙˙˙˙˙˙˙˙˙ïÑ §ĞŸÚ˙ÎĴ£“ú˙ŭ"#1˙˙˙͜  ˙ú˙ù˙˙˙˙˙˙˙˙˙ŝ˙˙ġ¤žœÔêĝ(Çŝ˙ú­ŞÜ÷˙ôҚ˙˙ŬĦÖò˙úöíŬ%Î˙˙˙ô)Ĵ¸ŝ˙ÇĞË˙˙úŭ˜&,.ĉĦ%Ÿ˙˙˙˙˙ü˙÷Ĉ£¨›’¤™İüÊ˙ûé˙²ŞĴ§žóŝ—­“°ó˙˙˙'$¨˙ŝÒ§¤£§Ċó˙ĝô䛢šħœ˙˙˙˙˙Ĝ žûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝÔ$ġĞġ÷Ìû˙ŝ˙˙˙ñ˙˙ŭûû˙‘!%ǝ˙˙˙ûŭŝ˙˙˙ü˙ĝ˙˙˙˙   Ûûú˙˙˙˙˙ûÌ$×˙˙˙ü˜&˜˙˙Â!•ûñ˙˙éÈĞ& •Óë˙˙˙´£—¤˙ûŭ˙˙üŬœĠŜ0³ùÏ/Ž˙ö÷˙ù˙˙üŭ˙ü÷˙˙ĝ§›Ñ˙ĊöÏ$ &˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙û(Üé÷˙Ħ­ĴİÉġ˙èĴ–Ğœö˙˙˙í˙˙˙üö˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!%Ê˙˙˙˙û˙˙’˙ú˙Ĉŭ˙Ë% ùñ™%”˙˙˙˙ú˙˙˙üü˙˙ŭü˙žŸäè˙™8 ˙û˙˙˙úñŝĦ-“—İ ÷ööà #Žáú˙˙ûùœ$ !Ëü˙ŭ˙˙˙˙˙˙˙˙˙˙•0 ˙ö˙˙˙üö˖(!£É˙Ċó˙˙öŝ› $İĞ˙ì˙ö˙˜! Ġú˙ûüĤ' Ĵŝò˙ġ˙̙¤+ ıìİ´ò˙˙˙˙˙˙˙˙ü˙ö˙˙ïŬô˙Óóû˙żŝġ˙ŭ˙úü˙üü˙—""Ċ˙ó˙˙˙˙˙˙˙˙˙ë˙ŭ˙÷˙×Öí˙˙Ùĝü˙Ÿ˙!š˙˙é˙ǟ˙Ġ˙˙óġĝ˙û˙&œ÷˙î˙˙˙˙Ì˘˘ùÂçĝ˙˙˙üĊ˙Û-òĝ˙ü˙ú˙˙˙˙˙˙˙˙˙ö˙ñòûî˙üüÄÙġñ˙˙öô˙ô˙˙ĝ¤Îŭ˙ú˙òġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙ë˙˙ë˙˙˙˙ç˙˝Âûñ˙÷˙ĝ˙§˙Ĝ˙ñ˙ö˙˙˙˙˙˙˙˙˙˙ŭ÷ô˙û˙˙˙˙û˙˙ñŭ˙ú˙˙÷˙˙÷˙ü˙˙ôûüŝùü˙ŝĝ˙ú˙ĝÍ÷óûî˙ùŝöŝ˙÷˙˙˙ñ˙òöö˙×  "äó˙˙ŭŭ˙˙ġ˙ûŭ˙÷˙˙ùġ˙ì˙ëġ÷û˙˙˙˙ö˙íŝ˙ô˙˙òĝ˙˙˙ġúúŭúüù˙ŭï˙˙˙˙˙˙ż˙˙˙˙ü˙ôò˙û¤+ â˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïñĜò˙ŝ÷˙˙ò˙˙˙üŝ˙˙òŭö˙˙˙˙üë˙˙ö˙˙˙˙çÈ˙ö˙˙˙˙˙˙ùú˙˙ġ˙ŭ˙˙˙˙$#Á˙˙ìúù˙ñ˙˙ùĊ˙˙ñü˙˙ù˙˙ùŭ˙Óí˙˙è˙á˙˙Ê˙î˙˙˙˙ôÂŭÓ˙˙ñ˙˙ñûäŝú˙˙ù˙ù˙ĝ˙í˙íàġ˙ü˙Èùŝöí˙˙û˙˙ĵ˙˙ŭ˙˙˙î˙˙˙û˙˙˙ú˙÷˙˙˙ëĊ"üûĝü˙˙ûù˙Â˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭêġ˙ќž˙˙ûóú˙óñü˙˙˙íü˙ï˙˙ŝùü˙˙˙î˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ï-­ìûô˙š,£Ĝ÷˙˙œ $›"#•˙˙ú˙˙÷˙ŝŭ˙˙ú˙ŝôŭ˙Ô›˙˙˙üѽŞ˙˙˙ċ˙˙í˙˙Ċ˙Ċ' 2È˙˙˙ûŭœ'Şġġö˙˙˙˙û )  ç˙˙û˙ü˙˙˙˙˙˙˙˙˙˙&ÍÜÂ÷˙˙òù˙ŭ˙ŭ˙͐ÊÈÚö˙ùû˙ĝ˙ô˙˙ʙäûûúÄŬÇ÷û˙ó˙ùûŝĊâú˙ï˙ġ˙üö˙ĠÑÓÍ˙òŭ˙˙˙˙˙ú×ÁÔ˙˙÷ÌÚŭú˙˙˙˙˙˙˙˙˙˙ñ˙˙ñŝ˙˙ŝŝ˙ŝŝ˙˙ûúŝüŝŝŭ˙ŭ÷"ġ˙˙ü˙˙˙˙˙˙˙˙˙ŝù˙˙ü÷÷ï˙÷ï˙û˙˙˙ùùë˙üû˙ù˙˙ü˙ûŭù˙˙ŭ˙ôĜÇ˙î÷˙˙ú˙ôûġ˙˙˙úò˙˙ò˙û˙ŭ˙ŝ˙úúü˙˙ô˙˙˙˙˙˙˙˙˙î˙ç˙ü˙˙ö˙ô˙˙ö˙˙ô˙˙ĝ˙ĝŝöŝŜò˙˙ú˙û˙˙˙˙˙˙˙˙˙è˙ôĝ˙˙˙˙˙˙÷˙ŭüöòŭ˙˙í˙˙˙ŝ˙û˙ŝú˙ĝ˙íĝ˙˙öò˙˙˙˙˙˙˙˙˙ŝŭ˙˙˙˙üíòô˙˙÷˙üûü˙˙ò˙Ġü˙ú˙˙˙÷ŝ˙˙ù˙öú˙˙ù˙˙˙˙ŭĝŝú˙˙ûö˙ûé˙˙˙˙˙˙˙ %²Ö˜§$˙˙˙èâ˙ŭî˙˙ó˙ĝ˙ŭŝü˙ġü˙˙âû˙ùúŝú˙ŝË˙ŭ˙ùû˙üú˙é˙ŭ˙˙ŝ˙˙˙ġ˙ô˙÷˙ñ˙˙ò˙˙ŭ˙ĝ˙˙ŭ˙!Íó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙í˙ûú˙˙ġ˙ó˙ï˙÷˙˙ù˙˙ùĝûù˙˙ĝ˙˙ú˙ëü˙˙ü˙üù˙˙˙úüŭ˙÷˙ùŭ˙ÜËË " ´ŝö˙˙ŝö˙˙ŝû˙÷˙ġ˙÷ù˙˙ŝ÷üŭ˙ŝñ˙˙˙û÷˙ĝñ˙ï˙üġüŝ˙˙˙óò˙òŭ˙û˙˙üù˙ŝöö˙ûŭ˙˙í˙ô˙ì˙í˙˙˙ŭ˙üŝ÷˙é˙ú˙ö˙ûùîú˙˙ŭŝ˙˙˙˙˙˙îŭù˙˙ĈÚÄ˙ġ˙˙óúŭ˙ġ˙˙ö˙öû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŭñ˙î˙ü÷üġ˙ŝ˙˙˙ŭ˙ĝŭŝ˙˙î˙˙˙í˙üûĝ˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ×  ĤĈĝ˙ü˙ñ˙£˘ ' šû˙û÷ü˙Ó!É˙˙ò˙ĝĝŭ˙ôö˙˙ò˙˙û˙˙ô˙˙˙ĝü˙˙˙ŝ˙ûû˙ŭŝ˙ŭô˙üĝĠœÉ°Ÿ˙üŝ˙ü˙ùß÷ĦĴšù˙˙˙ŝ˙ö˙˙ĝ˙œ§Ÿ›Ò˙ë˙ó˙˙ĝ˙˙˙˙˙˙˙˙˙ŭ˙˙òŝ˙˙˙ŝñ˙˙˙ŭ˙˙ò˙˙˙ŝ˙˙ñ˙˙î˙˙˙ú˙˙˙é˙˙˙˙˙ú˙à˙˙ö˙˙˙˙˙˙ĝ˙ì˙ù˙˙ŭŝú˙˙ŝ˙˙ŭŝù˙ô˙˙÷˙˙˙˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ï˙˙ôŝü˙ô˙˙ĝ˙˙ü˙ŭ˙˙ô˙˙Ê.›˙ò÷˙˙˙˙˙˙˙˙˙üġ˙˙ì˙˙û˙˙˙˙˙˙ùŭ˙ŝ˙˙ïŝü˙˙˙ĝŭù÷˙˙úû˙˙˙ĝ˙û˙˙û÷˙˙ü˙˙ú÷˙ŝ˙˙üŭ˙ü˙˙ò˙ù˙ù˙˙ŝ˙ö˙˙˙˙˙˙˙˙˙˙ó˙ûû˙˙üú˙óô˙ò˙˙˙ù˙÷˙ŝŝ˙÷˙˙÷˙˙˙ú˙˙˙˙˙˙˙˙˙ŭ˙˙ŝú˙ŝġ˙ŭûŝĝ˙˙ŭ˙÷˙˙ŭó˙ü˙ô˙˙ú˙˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙ò˙û÷˙ü˙˙˙ĝ˙ŝĝ˙ŝ˙ï˙˙˙ûû˙üŭ˙˙ú˙ô˙ùŝ˙ï˙öŝò˙óû˙˙ü˙ù˙˙ü˙˙ġ˙ŝ˙É˙ "Ġü˙ŝ˙ŸÌ˙ûŝ˙ò˙˙ö˙ûûüŭú˙˙ú˙˙ô˙í˙÷˙˙ö˙ü˙˙˙ûġ˙˙ġ˙˙ŭŭ˙ĝû˙˙ô˙ĝ˙˙ü˙ú˙˙ôŭ˙ë˙û˙ü˙ŭ˙ĝÓü˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙÷˙÷˙˙˙ŝġ˙û˙ġ˙ŭ˙ù˙˙÷ü˙ĝù˙úĝ˙ĝ˙ò˙˙˙˙ŭŝŭù˙˙ŭûù˙˙˙ü  ô˙ùò˙ö˙% ˙˙˙ô˙ĝ˙û˙ĝ˙˙ô˙˙ôŭ˙˙˙˙˙˙ŭùĝ˙ó˙˙˙˙˙˙ĝ˙˙˙ĝŝô˙ñŭ˙ŭü˙÷˙ĝ˙ù˙ĝ˙˙û˙ġö˙ú˙ö˙ŝ˙˙ĝŝ˙ŭ˙üü˙˙ĝ˙û˙úŭ˙˙˙ŭ˙ŭ˙˙üŭ˙ûŝ˙ŝ˙ŭŭ˙ŝ˙ó˙˙ç˙ù˙˙ŝò˙û÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ë˙˙˙ĝ˙˙˙ö˙ġò˙˙˙˙˙ŝ˙˙ĝ˙÷˙ù˙˙ô˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙û˙ÚĝŬĝÍßġ˙˙˙˙˙˙˙üŭ˙˙ñÜÜñ˙˙ŭü˙˙üĜÚĝÙù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ġô˙ŝĝ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ó˙˙¤Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙* "É˙ŭ˙ù˙˙œß˙ĝú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ùû˙ż'ï˙ú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŭ˙˙ñ˙ —˙ü˙Òüġ˙"ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ò˙öŭ˙˙ŝûŝ˙ŭ˙˙˙˙˙ŭòòŭ˙˙˙˙˙ŭ˙˙î˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙éö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙ú˙èÎ %£Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙öú˙˙ŝù˙ŭä¨ 0·˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙˙˙¤Ş˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ġ˙˙Ş˙ŭùŝ˙ŝ˙–£˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ü˙ŝ˙˙˙˙ŝûü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŭ˙û˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ùŸ›˙ìú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭî˙˙Ë# Îôŝù˙˙ËĴ–Üŝ˙öü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûó˘'ŝì˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙÷ž& ˙ÁŜ•Ìŭ"˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ù˙ŭ˙ŭüüüŝ˙˙˙˙ü˙˙˙üü˙˙˙˙üü˙˙˙üû˙ŭ˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöĝĝò#% Ş÷˙˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ò˙”& ÑٛĈòİ %Óŭ˙ùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙˙˙ôÀ˙˙˙òï˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ùú˙  Û­ Ġħù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ù˙ú˙û˙˙˙˙˙˙ŝûŝŭŭ˙˙ŭüŭŭüŭ˙˙ŭŭŝú˙˙ù˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙$ Şú˙˙îû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ú˙ŭĠ&(ŝ %—ô˙˙ö˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ĝ˙˙˙˙ò˙ô˙˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ġ˙˙×˙ !¨Ò˙÷ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙û˙ù˙ŭ˙˙ŝŭŝ˙˙˙˙ûû˙˙˙˙ŝŝ˙˙˙˙ûû˙˙˙˙÷˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ú˙(Ğ˙ŝú˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙˙À˙÷˙˙ÀÄ˙˙˙˙˙˙û˙ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭüġöĝóô˙ú˙ŭú˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üùŭ˙á˙˙ñÙ˙ïܝ÷ö˙˙ù˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ûŭ˙ö˙ŭûûûûŭ˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙ûü˙˙ŭ˙÷˙ü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙àŸĈÏ÷˙÷˙ó˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ùï˙ĝ˙˙ġüġ˙ŝ˙ò˙÷ò˙ĝ÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭùü˙˙˙˙˙˙ï˙˙ôó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ġ˙óŝ˙ìġ˙ûüġ˙ú˙˙˙ĝŝġ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙÷˙˙ŭ˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙ûùŭ˙ŭŝ˙ŝĝ˙ú˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭ˙ŝó˙˙ŭ˙ŝú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ó˙˙ĝ˙ŭ˙˙˙˙÷ô˙ö÷˙ü˙˙û˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙ġ˙˙ùù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üù˙˙˙÷˙˙˙ôúü˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üü˙˙˙˙˙ù˙˙˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙û˙˙úú˙˙˙ûŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝ˙˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭ˙˙˙ŝúöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙˙ŝ˙˙ùùŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úüŭûü˙˙ŝ˙ü˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ŝ˙˙˙˙˙˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ó˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŭŝ˙˙ŝ˙öü˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ü˙ŝü˙˙ŝŭüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûú˙ŝûù÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝú˙ŝ˙öùŭ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ëûĝû˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝúĝû˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùû˙˙ŭŭ˙ù˙˙˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙û˙ô˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙ŝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷òöŝŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñïôü˙ŝ˙˙ö˙ĝî˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭç˙˙ÌÔñŭ˙˙ĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÒŬĈŝ˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙É·ï˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙ü ›Şĝ˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü"˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Â˙ü˙óŝô˙˙ú˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ô˙˙ù˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙úüûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙÷ñ˙˙ù˙˙òÛ˙û˙ô˙˙˙˙÷û˙˙ŝô˙ġĝ˙˙˙û˙ŝŝŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙öü˙˙ŭù˙ŝŝ˙û˙˙˙˙˙˙˙˙˙˙˙ŭ˙úù˙úÉ%Í˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙öĝ˙ô˙ú˙ù˙˙ô˙˙ú÷˙˙öö˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙÷ûŝ˙ûü—ĦİÌ˙˙ö¤Ğ˜–˙ĝ˙˙˙˙˙˙˙˙÷˙ô˙˙˙ï˙˙˘ '–ßœ! '”¤Ô˙ŭ˙˙ŝŭ˙˙ü˙˙ŝŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ü˙üú˙ĝ˙˙ĦžĠì˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú÷˙˙˙ù˙˙òüŝ˙ñ˙˙šŞġ˙ü˙˙ŝŭ˙˙ü˙˙˙˙˙˙˙˙ú˙˙ŝúü˙úʨ͟ĜĦġ˙˙üŝ˙ŝ˙˙˙˙ó˙ĝ˙˙ġ˙ġ˙˙˙÷˙ü˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙û˙ûË!ŭ˙ŭŭ˙ü˙˙˙ùú˙˙ŭĝ˙ŝù˙ŭ˙Ê•˙ü˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙ü˙ü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙î˙˙ñÊÓ˙˙öġ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙úö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙ĝÛÀÖ˙ùÚŭñ˙ùŝŭ˙˙ŭŝŝ˙ß·˙ÛóûÎÏö˙˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ò¤-—ŭ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙üí˙ĝ˙˙ċÚ Ş˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙î˙ÓËÑ˙áü˙Ûɨ˙ü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙˙î˙ŭ0/&š—$ŭ˙˙˙˙˙˙˙˙˙÷˙ĝöë˙ ' *"!öŝŭöû˙˙ûŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷óûü˙ù˙ü˙ - !Í˙˙î˙ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüùû˙ë˙˙ôû˙÷š)$˙˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙˙î˙ë˙˙Ïŝ§ !& Ĝù˙˙˙˙ŭŭ˙ŝò˙ŝÏùĜû˙ù÷˙˙˙ŭ˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙ĝ˙ġİ%Ŭĝ˙ĝ˙˙˙˙ì˙˙é˙˙˙˙òŝ˙ŬĤ( '"˙ü÷˙˙˙˙˙˙˙˙ĝôì˙˙˙ŭüŭ÷ü˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙››Ÿú˙˙˙öú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ÷òû˙˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙ŭùûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġùİ ##°œ†½×˙üŝŭ˙˙ŭú˙ü. :ğ˙˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙)!˙˙ûú˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙ŝò˙¤"™˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝüû˙ŭ˙”&˙˙˙Ù #'ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙é˙˙è'  ' (–’/'˙˙˙˙˙˙˙˙˙ŭŝŭ˙û" –*²ï˙üü˙ŝŭüŝŝüü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ü˙ġ˙˙˙ü Î˙öù˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üú˙˙˙˙˙òò˙˙üĴ 1˙üŝŝüü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙óñ! Ûñ˙˙ŝŝ˙˙˙ŝŝÓ)1é˙˙ûĝ˙ŭŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙ÍŻ!˙ŭô˙ñ÷˙˙˙û˙óöġú˙ü˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙îû˙˙˙˙ú˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—$ Ĥĝöû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙üö˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙È&# (% ˙˙˙˙ŝŝû˙˙Ĝ!(  í˙˙ŝ÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġÎ#'"ġ˙üĝ˙ûüŝ˙˙˙˙˙˙˙˙ñï˙˙˙÷ 'È˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙üùŭ *ûÜòšš˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷˙˙˙§ #$"˙Ĝ "Ħ˙˙˙˙˙˙˙˙˙ü˙ì˙· ˙× &¨˙˙˙˙÷˙ŝŭüüŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙ñ˙ä˙ûúï˙÷ ˙˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙óó˙˙˙÷òüѧ"Ö˙˙ŝŭüüŭ˙˙ŝ˙˙˙˙˙˙˙˙˙÷ô˙˙˘,²½&"×˙˙û˙˙ŝ÷˙ûö ŭ˙ĝö˙˙ĝŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙™ħ•Ô÷˙ŝŝ˙˙˙ê˙ú˙í˙ŝ˙˙˙ĝò˙˙7È˙÷˙˙˙˙˙˙˙˙˙ñú˙üŭ˙˙ú˙˙ü˙˙ûŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï“ "Î˙˙ô˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ŭúŝ˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ŭ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ġİ-  Í˙ŝ˙ûùŝ˙í‰)ö˙˙˙˙˙ûĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙­#Ô˙˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙ġ˙üğ–Öâ§£éü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŭ˙˙˙ì2˙ŝ˙ћ³ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŭ˙ìĦĤ˙˙ì–"’˙û˙˙£­˙˙˙˙˙˙˙˙˙ú˙ŝ˙˙­˙˙ŝĝĝ$ ´ċ˙ŝ˙˙ú˙ò˙ŭò˙˙ĝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙˙˙û˙ŝ˙ë˙Ĝ &˙Èä˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙üü˙ûú˙ï˙˙ŝ˙˙˙5!ü˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñçûœ œ˙˙‹˘›Çġ˙˙˙û˙˙ú˙ŭ˙˙Á$-˙îĝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙Ġ&šû˙Ñàî˙˙é˙˙ô˙ú˙òŭ˙ŝÎ˙éï˙ŭ˙÷ŝÛûùü˙˙˙˙˙˙˙˙˙˙û˙˙˙ùùù˙ŝ÷û˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ĞġÍ÷˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ŭó˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙çö˙Ċ! )!%Ñûù˙ûŭ˙˙Î5!É˙ġ÷˙˙˙ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷# 1Žï˙ŝ˙û˙ŭ˙˙˙˙˙˙˙˙ġ˙˙ğ˙¤!˘ô˙è˙ĝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ñġ˙ ˙û˙˙(Ħ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ġ˙ä Ñ˙ò˙˙°˙í˙ñ˙óġ˙˙˙˙˙˙˙˙˙ŝûŭĞ Èúëŝ˙­%ú˙˙öú˙î˙˙˙üù˙˙ĝ˙˙ú÷úŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ǒ˙ê˙˙ú˙ġĊ£ŝ˙ò˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙öŝ˙ŝü˙í˙˙ôĝġ÷˜ &·˙ó˙ú÷úŝŝŝ˙˙˙˙˙˙˙˙˙ù˙ġ˙& Ĝö˙ñ˙˙ŭ˙˙˙˙ûü˙˙ŭü˙÷˙˙ ú˙˙˙ûġ˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙£ñ˙ŭŭööì˙˙˙˙˙ú˙˙˙ŭí˙™˙˙ï˙˙Ñĝ#Êŭ˙ŝ˙˙˙˙˙˙˙˙ú˙ï˙ùġÖ˙˙ŭ˙ŝġ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ʧŭ÷ĊÛ˙÷˙˙˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙ò˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝü˙ñÊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭ˙˙˙úœ"&Íù˙ù˙˙˙ş!šâô˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙9Êúŭ˙ù˙÷˙˙˙˙˙˙˙˙˙˙˙˙Ò ˙˙˙Óúĝŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ĝ˙˙˙÷˙ ˙êü˙ŝšİż˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙Ĉ(Ë˙ô˙˙Ìò˙ñ˙˙ŭ˙˙˙˙˙˙˙˙˙ó˙ûü‘)Í˙˙óŭ ŝù÷ö˙˙˙˙ôü˙˙˙úú˙˙öò÷üüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙çòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!˘˙˙ŝ˙óŭÛœ˙˙ĝÏŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙û˙ç˘ä˙üò˙˙˙˙ !Ö˙˙˙öò÷üüûŭ˙˙˙˙˙˙˙˙˙˙˙ı $Úŝ˙˙óŭ˙öüûúûŝ˙˙˙ŝ˙÷öŝ!%ü˙ĝû˙˙÷ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙! ™˙˙öü˙˙˙ñí˙ŝò˙˙ùŝŭĉ"•˙üüŝ÷÷˙Ĵ#Öĝ˙û˙˙˙˙˙˙˙˙ò˙ûî˙˙è˙˙à˙˙ġ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙œ˙ù˙˙óö˙ôû˙ü˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ"À˙úŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ù˙˙š)˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙ûİ$!›˙˙ö˙˙ġ·›žú˙ôü˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ë" %²ĝ˙˙ŝ˙ĝ˙˙˙˙˙˙˙˙ŭ˙ġ˙ž!$÷ü˙ġ˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭü˙ġ˙ûĴò˙˙ú˙ Í˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ÷˙ĤĤ÷˙˙ó•/˙˙ú˙ŭö˙ġ˙˙˙˙˙˙˙˙˙üÑ˙Ħ#Òŭĝ˙÷ħŝ˙˙˙˙÷ŭŭ˙ŝŝŭù˙˙ü˙û÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷& Ħŭüû˙ô˙È˙ġŭ˙˙óŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙˙ĤŬú˙˙úûùúÌ˙ù˙û÷ü˙˙˙˙˙˙˙˙˙˙˙˙û˙úÛ( Ċ˙öó˙ġ˙˙˙ŝ˙˙˙˙ŝ˙˙÷˙Í˙Ñú˙ŝŭ˙˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙¤˙Â˙˙÷ŝ˙˙˙˙ù˙˙˙ú˙È"ù˙˙˙ĝ˙÷ġ˙˜§˙˙˙˙˙˙˙˙˙ "Ÿžİ™÷³÷˙ó˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûë˙ĝ˙˙˙ùŭ˙ŝ˙ŝ˙ŝ˙û˙˙ó˙ôŭü˙û˙˙ĝ˙ŭô˙˙û˙ŝĝŞÍ˙˙ĝ˙˙˙˙ó˙˙ñ˙û˙˙ù˙ü˙˙öüûû˙ü˙ü˙ġ˙˙ú˙öİ˘Ê˙˙ò˙˙û˙˙˙ġ˙û˙˙˙˙˙ŭöü˙˙˙˙ĝŝ˙ü˙˙÷ù˙û˙í˙˙˙ĝĝ˙˙ŭ˙ùĝ˙˙ŭûŭ˙ù˙˙ĝÏ'Ò˙úöŭ˙˙÷˙˙é˙˙öÙú˙ö˙÷˙˙ġ˙ŝ˙˙öû˙ĴÑĝġ˙ôúĠ'Ÿ˙˙˙ò˙ŭ˙ó˙˙ŝŝ˙ò˙˙ĝ˙˙÷˙˙öú˙˙˙˙˙ù˙úü˙û˙˙ó˙˙ù˙˙ùü˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙ĝ˙˙! ˙˙ôŭ˙ù˙˙˙˙˙˙˙˙ù˙˙í1!˙ŝŝ˙ú˙ú˙ŭû˙˙ò˙˙˙üÚŝù˙˘˙˙ïû˙öŝú˙÷˙ï˙úüüò˙˙˙˙û#Éü˙˙öû§˙û˙˙˙˙˙˙˙˙˙˙ĝ˙Íŝü˙ñ˙ô˙˙˙ŝ˙÷˙˙˙û˙÷˙ŝö˙˙˙ĝ˙ŭüŝŝ˙÷˙"Ċ˙û˙˘ž˙ŭù˙óŝ˙ËŞ›™˘×ġ˙ĝ˙ŭŝ£ (Ċĝ˙ôĝĴ˙û˙˙˙˙˙úŭö˙ó˙˙ò˙˙œÌ ×Ÿ˙÷˙öï˙öڜ˙˙À˙۟ ¨È˙í˙ü˙÷˙˙˙˙˙˙˙˙˙ù˙ŝô˙˙˙˙˜% ĤÖü˙ĝ˙Ì˙ĝ£! !ŭü˙˙˙˙˙˙˙˙˙˙ŭ£úô˙ŭĝŜߜϣœÓŭ÷˙˙ö˙ö˙ö˙È!˙ŝ˙ŭúŭ˙ġġ˙˙˙΢ĤġŻ(!”˙ĝ˙ö˙˙˙˙ӛݙœ&Á£ĝ˙˙ùû˙ʕ ĝàžžžŞÏĝ¤#£›Ğö˙ġù$Ó˙Ö›İž˙ô˙ŝú˙˙˙˙˙˙˙˙˙÷ñßÑ˙˙ĝ˙˙˙˙úü˙îú˙À˙˙ñĠ˙× "Ħ˙Ç˙ù˙͟§Ğ˙˙ŝŝŭŝ˙˙ú˙ŝúŝú˙óŝ˙ġü§ÚÏü˙ò˙˙ġ˙ú˙ùœô˙ŝü˙˙˙˙˙˙˙˙ú˙öÒ ,Ê˙ġ˙!"!§ù˙÷˙˙Ô¨ % ˙˙í˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óú˙˙ĝÚġ˙ŝ˙ü˙î˙ĝ˙˙úĝ˙˙˙ŭ˙˙ò˙ö˙˙Ê˙˙óúŭò˙˙˙˙úŭŝùŝ˙˙ŭ˙˙˙˙÷˙˙ú˙ġ˙˙ö˙˙˙ĝüû˙ô˙ù˙Ğ œ˙˙˙÷ü÷˙ĝ˙ŭù˙ôġò˙÷˙˙ŭĝ˙úù˙üí˙˙ŭ˙òü˙˙ñŭñ˙˙ó˙üó˙˙˙î˙˙˙û˙ùùŝ')Ó˙˙ú˙ġù˙Ö˙ĝÙġ˙ĝ˙û˙÷ú˙ŭ˙ú˙˙üÉ#Ñú™! ˙ŭóÚŞġ˜Ğí˙ĝ˙ñ˙ŭü˙›Í˙˙˙˙û˙ñÏ"Úüŭ˙Ì£˙˙úÍċÀÏĜò˙ÉÇßéâúüû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ü˙ú˙ĝù %#ôô˙ûü˙˙˙˙˙˙˙˙˙ŝŭöİ ˙˙ç˙ùÛ" ˙ĥ' Û˙Ş)Ó˙÷ó÷˙˙ġ³" ŸŜ˙ò˙ĝ˙ĝ"™ŭ˙òŬ˙$šíáĝ˙˙˙˙˙˙˙˙˙˙˙§ĵ ¤–·˙˙î˙ù˙˙˙™ŸÀ˙˙ü˙Úġ) ˙çÖ +˙˙ù˙˙˙ ލ$ İ˙÷Ĉ 'Ŝüŭŭħ ˙˙ñË #Ĵ˙˙ü˙˙˙˙ ˙ġ˙˙ïÏ$˙Ħ! ˙ŝ˙÷˙˙˙˙˙˙˙˙˙˙ŝŝŭ˙˙ó˙É& #’˙˙£& —$ "Ğĝ˙˙˙˙˙˙˙˙˙¤# ˙ Żö˙öÌ$# . §˙î˙ŭï˙Ê (˙ûòù˙ùù˙˙˙Ê,( #$˙˙˙öò÷ŝ)!,èú˙˙ '/˙$ Ÿĝ˙˙˙˙ () ˙û˙ù˙˙˙˙˙˙˙˙÷˙˙#Ĉî˙Á"—˙˙˙˙˙˙‚ ™$Ħĝ˙ŭî˙%$ ,Éö˙ù˙˙ŝ˙˙ï˙ö˙˙éŭ˙Á  Ÿġ˙˙˙&0 ž˙˙˙˙˙˙˙˙˙úÏù%)ŭŬó#!ü˙˙ó˙"& ç ˙û˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëó˙˙ŭ˙˙˙ġô˙÷˙˙öù˙˙˙÷˙÷˙˙ë˙úüó˙ŭü˙û˙˙ñ£,ÎöÉ˙ï˙ô˙˙ú÷˙Ĉ˙üíôü˙˙ûöûŝĝ˙÷˙˙˙˙ù˙öĦ%Ĥü˙ó˙˙û˙ò˙˙ŝ˙ú˙˙˙÷ù˙˙ô˙˙ö˙ŝ˙ü˙ç˙ïü˙˙î˙˙˙˙ùú˙÷˙˙ü˙ġ˙ôé˙ú˙ô■)İĜĝ˙ŝ˙˙˙Ĥš Ħ§–Ĝêŝ˙˙ŭĝû˙ŝ˙˙˙ÔóĴ„üÏ #™˙·§ô˙ú˙Ô§œ–"£˜˙ë˙Ϟ´—"€ ›)œ˙Ó""Óî* ™ü˙˙ŭùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ˙ù˙˙˙+Ğ˙î ú˙˙ġü˙˙˙˙˙˙˙˙ŭ˙˙–)"÷ŝ˙ùò'%! א# #ä˙ŭ˙˙›#˜&˙˙éŝ˙ŭ*Ù˙íŝúú &ŞÚ˙ú˙˙˙˙˙˙˙˙ôĤ%& $$*'ô˙ó˙ùœ#"!Ìôù˙Ê(È÷*,˙é˙˙‘Ï˙ġ› &˙÷˙(  Ö˙ôŭ"÷˙˙› ˙˙îŝ˙ ,"™–7 ŻĈ÷˙ĝ(! #!##£˙˙˙ô˙˙˙˙˙˙˙˙ŭ˙ŝü˙˙ì˙Ħ%ħ˙˙-Îŭş$ ¤£˙˙ġ˙˙˙˙˙˙˙˙” 2 #œï˙üË)î˙˙ù˙³Ç *š˙˙˙˙üġ˙÷˙˙Î "Ż›¨+ĝúô˙˙ŭœ›˙Ċ›!˙÷˙’#+ħŝ*!Ïê˙˙Ÿ)ĥ ù˙˙˙˙˙˙˙˙˙û˙“ĉĤ!&˙ŝùŭʨ'*% ! •ÛéúçŞ˙œš˙û˙˙ŭŭ˙˙ó˙ú÷˙˙£ $#˙ñġÑ Ĝ˙˙˙˙˙˙˙˙˙ë˙ &'˙ġ˙˙¸!ĝ˙( šú÷˙È "ĝ­˙Ç˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙àÄÛÌÇŞ˙˙ÎŜÄÏ˙˙î˙ï˙ÑӛûŭäĊÛÑĊäÌ˙˙˙˙÷Û" &£ĝúô˙ŭÁ˘,.2ñó˙ùĥ ³‹ ˙÷'×˙˙Ï "Ôú˙Â!!Ŭû˙ŭ˙í°ž˙7›ŭú˙˙˙˙Ù °ô˙˙˙Í&!Ĉĝ˙ô˙ԍÒÔŞ ›˙˙˙÷˙ŝ˙˙ùö˙ù§ġ˙˙Î  '"˙Ÿ"Ħöùġ•˙ûŭ˙Ä%˜ÍĠÑ˙˙Ö$"ò˙‹* ˙ŝ̝Ż÷˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ú˙üû˙ <‚Ì˙ú˘ —˙ùċ˙˙˙˙˙˙˙˙˙˙û˙$ Íûù˙˙˙ ÔŭïĞ!³ÊĊ­Ö˙˙ġÍ* û˙Ë! ×ö˙˙˙ö˘$Ïú˙˙ŭû/ ĉ˙˙˙˙˙˙˙˙˙˙˙Ñ! #àĉ˙ŝž£ÚÀš ×˙ù˙%Ĉ˙ùĜ0ó˙˙ŝĦ˙˙ĝÒ£$! Ë˙˙ˆ -"Êû˙˙Ò. ˙üô˙ %ž˙ù˙˙ #ËŝŭŬà ²ù˙ġÊ ĞÒ˙/žüĈ˙˙˙˙˙˙˙˙˙˙ö˙˙ŭŝû˙Ŝ%Ìó˙˙ÚÉ˙˙˙ œ˙òÉ )Žö˙˙˙˙˙˙˙˙˙ßšËĠÖġ˙˙מ˙÷˙%ûï˙˙§í˙§ (˙ñî˙˙ŭŝ˙ò˙°óŝ˙蝟˙ŝġİ ˘Ïù˙˙­ ˙˙˙  ÄÛÊ ,"!Íû˙˙ŭÙ + ÷ÌÜŭû˙˙˙˙˙˙˙˙˙èı'!Ñĝ¤$Ĝö˙ġ˙˜#11+¨ô˙ĝš+úö˙#ó˙˙ġ˙˙ŭ˙˙ö˙û˙Ë ˙Ÿ ĦÔ˙˙‘) ˙˙˙˙˙˙˙˙˙˙ŝ˙ôŞıµÉíŭ˙ö Ÿĝ˙òÖ(œ˙˙ú#°8˙ĝ÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ !ž˙˙“Ó˙˙˙˙”"ĦÄ ôó˙˙+'% ˙˙ŭ˙ü¨+˙İ ŽŬ˙˙§*##' Ï˙’²÷ñ˙Ó'" Â˙˙Ô  ú˙˙˙Ĵ# ŭ ' ˙˙êµ £  ˙ü˙ô•-"ݧĥ˙˙òüÍ£˙Ö˙Š/ ˙ñ˙˙ŭ˙ĝû˙ööûœ˙ĝġŝÊ÷Ÿú˙˙˙" ˙ö˙ĝ£˙˙óÌ2Ûíñ˙ŜĦ " !ú˙˙˙˙˙ĝÊöûò˙˙üĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙˙˙÷ô2 ˙ŭ˙"-öŝ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙ş)Ûô˙˙˙öË')šġ˙˙ü% ”öŭ˙ûÒö˙ŝÖ˙ü˙û<˙ŭî˙&í˙˙ëŭûÙ˙ü˙˙˙˙˙˙˙˙í˙˙­, ˙ïÒĴ&˙ôü.ŝ÷˙öĜ&Şôò˙˙÷˙˙˙ú˙–˙ïû˙   ­ ˙˙˙˙‹Ê˙ëò˙™"˙˙˙ö˙$›˙û˙-’˙óŭ˙˙Ü Ĉ˙ŝĝáĝ˙ö˙! Ù˙ŝ˙ô˙˙˙˙˙˙˙˙ù˙˙˙˙ó˙†&˘˙˙ŝŝ˙’(Ĉ˙ŭó›/ŭó˙˙Í!Ĵöú˙˙˙˙˙˙˙˙ö )) ˙˙ŭ˙ü÷ŝÖ§î˙˙û *˘úŝ˙Ĉ&§Âß)$Â˙˙˙˙˙˙ġ˙ô˙˙"¤ü÷˙˙ÍÖì˙˙Ä.’Ë˙û˙úÎ˙î˙' ȳ˜›£˙ú˙ݞ›ú˙˙é˙İ%Û˙ùÒ˙” '—ŝ˙˙˙˙˙˙˙˙˙˙˙½+ ›ü÷˙È& *Òúŝŝ ’˙˙˙ù˙˙÷˙  (“Ĥ !#ó˙˙ġ˙˙ŭ˙ġ˙ö˙÷$œ˙˙ĝüŭ­ĥĝ˙  Şù˙˙ó˙˙˙˙˙˙˙˙÷˙ÌĝŞ ˙˙ú˙˙ö˙!Ìŭŭ˙û˙%¨Ċ˙ì$$#šÖî˙˙÷˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˘ °ŭŝù#ú˙˙­"1˙˙˙Í+ Ÿ˙é˙בÜ˙ü÷˙ #Íö˙ÉĴ )Ï˙˙&ùŝ÷û˙˙˙‘-˜˙ŭ˙è*ġ˙ŝŭÂ$ Î˙˙ŝ”ö˙˙˙+(˙˙ù  ŝĝ˙˙'ùŝ˙ó˙˙˙§ĦĦ ú÷˙˙˙˙úù˙ŝ˙˙£ü˙˙ŝ–+£˙Ó¤òĝ˙Ġġ˙ò˙¨ Ñüú˙˙ŻÙ˙˙˙Ä˙ŻÉ˙˙ûâ˙™#÷ġ˙§'¤î˙˙˙ŭö÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ñ˙˙ò &žÖ ' ŝ˙÷˙˙˙˙˙˙˙˙˙˙ĝ˙ä˙ĝŭĝ˙ ˙˙ú˙óßûÙ˙ú! ˙ŝ˙ü˙Ìëŭ˙˙™ ˙ĝŝó˙& ×ü˙ŭ˙Şúŝö˙˙˙˙˙˙˙˙˙˙òĠ ñ˙˙ŭž"!Ç˙óš%˙ô˙µ˙ŝŒ$˙˙ï˙Ç#ûöŭöË/ĝ˙ú˙'!²›(ŝö˙ó˙Ç˙˙˙˙¤!—óô˙÷Î 1³ŭü˙""Òŝ˙˙÷ŝ˙œĞùò˙”!ÄüùûîĞ)ùü˙÷˙˙˙˙˙˙˙˙˙˙˙ü˙˙üŭ*Üû˙˙ĝŭĦ"˙ú˙ŜÙ÷ŭŭ˙ò) ž˙˙˙˙˙˙˙˙˙˙˙1ä˙ġ˙˙˙ŭÍÊ˙ŭïב) ç˙íŻ •#'Ĝ˙Ëöŝ˙èüŭü˙˙ĝ˙ŭ˙Àš˙û÷ú#˙Î˙˙˙ñ˙÷˙û(˙˙ġ™#§˙ë˙˙˙ĉ˙óš˙ú˙ûúû˙ñĤġ˙ŝüóĴ& $˙ú˙˙˙˙˙˙˙˙ò˙˙Ù%˙óú˙ž#Ïŭŝ˙Ž.#É˙ôĝ˙—"'ï˙˙£. -š˙û˙˙ŭŭ˙÷˙ĝ˙˙×ûöû˙˙û˙˙ġ" ġ˙˙ù˙˙˙˙˙˙˙˙˙ú˙˙š $˘˙Á˙˙ĝù˙’(˙˙˙ŝù Ö˙ì%Ò˙Éó˙˙˙ö˙á˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŸ%"—˙ŝ˙˙!Óû˙íġÒËò˘'žù˙÷˙Ħî˙˙˙–+>Ċû˙˙˙ß"İñ˙˙˙£ĜĤÈ˙Á˙˙÷˙˙˙ê˙÷ĥôúú˙ü&ˆ˙ï˙˙ĝ˙Ôüŝôŭê"£ŝüĝĥ ù˙ñ˙ )Ö˙ïäë²˙˙˙ò˙öü"*!, 4Ĵġ˙üó˙˙˙üŭò˙òÎû˙ùÑ#—­ü˙˙ž ˙ù˙˙˙˙˙÷û˙ù˙.ċ˙ûŝüŝÙÒ˙˙ü˙˙ġŞ ˙˙ï˜%Á˙ûġû˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭ÷Ħ#(&! ˙ŭ˙ú˙˙˙˙˙˙˙˙ú˙˙íË˙û˙üü˙Ï& ħë˙ú˙Ç& Úŭŝŝ˙! %ôè˙Ê˙Òü˙üöë1 ù˙˙˙ò‘2Ñŝö˙öÌ'˙Íŝ˙˙˙˙˙˙˙˙ùü˙!Î˙˙ñ˙È# Ë˙˙ )ċ˙˙ŝü˙Ŝ; ’ë˙ôÍ$’û˙Ġ˙›˙ŝÌ"·ö˙ò˙òĝĝê˙˙úŝ'Ï˙éü˙$˙˙˙žê˙ġ'ŭÇôù˙˙úĤ ˙˙îÙ˙É˙˙˙Ô÷˙ŝĝ˙˙˙˙˙˙˙˙˙˙ŭû˙ñ˙Ê ì˙òó˙ù˙˙˙ġÚ Ï˙˙ŭ˙ô1š˙÷˙˙˙˙˙˙˙˙˙+˙˙˙û˙˙˙Í ŭ˙˙ó˙˙É˙ĝ# ³˙ÉÎÍôĝ˙˙˙˙˙û˙û˙ü˙ä˙ŭŭĤ$"óÇ˙˙˙˙‰0Êï˙ùĴ˙ìĝ˙˙í˙ %#óû˙¨  ˙˙˙Âú˙˙ñÜ(˘˙Ïî˙˙ŝ÷˙˙ŭû˙ŝ˙˙˙˙˙˙˙˙˙÷Ó˙Ö#$žë˙˙˙˙!Ô˙˙À§˙ŝ˙˙ĝĉ˙˙ŝ ÒŬĵÎÜșàö˙ù˙˙ŝ˙˙˙ò˙˙êÜŸ˙˙ì˙ä˙ 0(˙ô˙óŸ˙˙Ŝ˙˙˙˙˙˙˙˙˙ö˙ûŭÈ,(Ĵï˙˙ñ˙ö˙$ô˙ï˙˙ŝ!Üñ}"&ö˙˙ó˙ĝġ˙ġ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ĜÎ˙üó( š˙ù÷˙Ÿ!–˙ŝ˙˙˙˙˙ġ§˙˙ö˙ Ŝ˙˙ö˙÷#÷˙ù˙¤ ŭû˙˙ò˙˙–˙˙÷˙ûŝŝ˙— ˙˙˙ó˙%ùŝ÷˙˙ÖÈ˙˙ü˙ó™˙÷˙˙˘˙˙ġ˙! (Çú˙ûŭžŝ÷˙ŝŝٝ­œĦޔސĜÖ÷û˙ġ˙ûĝ˙ŭú˙œ˙ê˙ŭ#È˙ùö°"˙˙ò˙ú˙½˙÷ŭÓ'çĝ÷˙˙˙—û˙˙ŝ˙û˙˙˙ ¨˙˙˜×˙ŝ˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝ˙ïĴ"úĝ˙˙˙Ħ“˙ì˙˙˙˙˙˙˙˙˙ŭ˙ġ˙Ñüô˙˙òÜŞ˙˙ñ¨#˙ö˙ü˙ó˙ġü˙˙ùü˙ٜ£˙ĝ˙ï˙›˙ú˙˙˙$ĤÈ˙ŭ˙˙˙˙˙˙˙˙˙ŝ˙Ĝ úû˙öÖË˙ó$˙˙ó˙ûŭ˙˙ú˙Ħ˙î˙ŭÙ Ï˙˙Ï ˘˙ŭ˙ü˙È˙˙÷÷˙˙ÇÔĝ˙˙öŝ#˙ġ˙ü£#Ÿ˙˙ú ˙˙˙ü˙ŝ÷òû˙îĦ˙˙ö˙ú#˘˙üû˙ŭ˙˙˙˙˙˙˙˙ü˙˙˙Ö˙ž"#ö˙ú˙ŝ˙Ó˙ü˙ú"×ġŝ˙˙˙ $˘˙˙˙˙˙˙˙˙˙˙ú×˙˙ù˙úü˙Ñ˙ġ˙ŝ˙ŭË˙˙Äö˙ü˙ĝ˙˙íĝü˙ó˙ŭó˙ĝ˙ĝ˙Ĝ !œ˙˙éŭ˙(ú˙ú˙ ô˙˙÷˙˙ ˙ù˙#Ÿ÷˙÷˙˙÷÷˙œÍ˙˙˙üúû˙ĝ  Íĝ˙˙÷§%ù˙˙˙˙˙˙˙˙˙˙ôüÖ +œ˙úġŝ˙ Ñò˙Ŭüù˙ġŝ˙Àô˙Èİ˙÷˙ô˙ó˙ĝ˙ŝŝŭŝ˙˙ú˙˙÷ŝ˙Ĥ "Ûç˙˙˙ùĤÂ˙÷˙# ûû˙ù˙˙˙˙˙˙˙˙˙˙˙ù§œ˙˙ö˙ù˙ŭĦ˙˙˙ĝŭ˙Ä˙Ğ­ŭ˙˙ŭ÷˙˙÷˙ġ˙î˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ Ë˙ùô$öŝ˙ŝŸ$Ĵ˙ĝ˙ŭœ˜˙ġú˙Ö! ûŝ˙ ŸÍ˙˙˙ñ˙ŸüÓŭ—"£˙úû˙˙ŭŝ "˙ú˙˙˙û˙Ξ #•˙öĝÜ #˙ŭ˙ö˙Ë" Ó˙˙ö˙û!!è˙˙ûÊġ˙˙ûŝ! ü˙ù˙£$Şû˙˙˙˙•ŭô˙˙˙ĝù˙ĝ˙˙öü˙˙è˙˙ô˙ù˙˙ŝ˙˙§÷˙ú˙žĊ˙ŝ˙ŭù˙˙Ĥ”–- Ç˙ï˙˙î ħò˙˙˙üŭ˙˙ñÜ!ú”(ŝü˙ï˙˙ô˙˙úú˙ïñ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġ˙˙ҟĦ˙˙˙ûüûŭŸ­Ê˙ŝú˙˙˙˙üû˙ĝŭ˙üÒŝ˙ŝûûÏİÀ˙˙ò"Ê÷˙ŝ˙š) ġ˙ö˙ĝÒĤœĦ£˘ùü˙÷˙ŻÚ˙˙˙úġ"İ˙ô˙˙˙˙˙˙˙˙˙ŭ˙üĈŭ˙ûö˙œö×÷˙ú˙ĝĝ˙$ž˙úŭĴ Ĵ˙˙û˙ú$ Ĝĝŭ˙ Ñûû˙÷û˙öÍ˙ò˙˙*Ö˙ġ˙ù¨ "˙÷˙İ!$Ĥ˙˙î´'˙ŝ˙ŭ˙û˙ ˙˙û˙˙˙ú˙ù˙˙ú˙˙Ï£ )˙˙ŭ˙˙ĝ˙˙³#˙û˙˙û˙žû˙üŸ$˙Íŭ˙˙ "£˙Óŝŝŝ˙˙˙ŭúĝ'%˙ñ˙˙ġ˙ġĜ!ġŭ˙ù˙˙š˙˙ŝšúü˙ú÷˙óĝ˙˙ŭñŝ˙ŭ˙û˙óĝ˙ŭĦ˙ŭñ˙˙Ëŭ˙˙˜š˙ö˙˙ü˙ĝ( +ô˙˙›$ŝ˙û˙˙ŭ÷˙ô ġ˙˙˙ú˙ü˙£˙òû˙˙Şó˙˙˙˙˙ŝüŭŝŝ˙˙ÀÒö˙˙ï˙ 'Ï˙ûŜ Ôĝ˙öû˙Ġ !˙üÑ˙˙ò˙ŭ˙ö˙˙ŭ˙ŭù˙ŭ˙˙÷˙Ê˙ÏĊ˙˙ü˙œùŝŝ˙! üŝü˙˙˙˙˙˙˙˙˙˙ġ˙˙ž š˙ş˙ŝöĠ˙ù÷˙˙ 1 Ï˙”!Ô˙ú˙˙¤%–Ùöŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭôŝ *áĝ˙£*ù˙ĝ˙ô™ ÷˙˙÷˙Ċ)Ì˙˙òó *˙üù#ŞĊü˙˙˙˙%œ˙ùÍ Ò˙˙˙ò˙ï˙(£ñ˙ô˙ìü˙˜#+¸ġ˙˙Š-&˙ĝ˙˙˙˙ Îû˙ó˙˘  Ŭìö˙˙˙òÄ˙ŝÚ& ú˙˙˙"—˙÷÷Ûù$Â˙˙ŝŝ˙Ä˙˙ò˙˙üñ˙˙˙÷ö˙(œ˙öö˙ü’À˙˙˙÷İ#˘ï˙ù˙˙ì+Ÿ˙†$Ûŭ˙ŝñ˙А˙˙ŭ˙˙˙˙˙ŭò$"’ŭ˙ü˙÷˙üûݧ˙í˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙É )šÒ÷˙˙ŝ˙ù‘Ï˙ö˙˙ûü˙ùô˙˙öê˙+˙ġ˙˙˙Ö£˙üĉ˙—ŭ˙˙Ċ˙Ş "˙ŭ˙÷˙œ9 Ĥ–˙˙ŝ˙÷ž"ĵ˙Â˙ö³ .ĝ˙ö˙˙˙˙˙˙˙˙ñ˙ĝÙ§˙ĝŝ˙÷Ë˙À˙ŭ˙÷˙˙ó&Óò˙ĝ˙ġĝ˙ùŞ'#è˙˙ı%'Ċ˙ŝó˙ü˙˙ò˙˙ĝ%Ë˙˙ŭ˙š ŭèò£Ÿ˙˙ù”0 Ï÷ŝù˙˙²( İ÷ï˙˙Èŭ˙ßŝĝ'$´ĝ˙ġÌ Şô˙˙˙ŭŝï˙ê#!ŭ˙˙˙ûîĴ ˙˙˙Ô Ññ˙ñĝ˙$ ö˙ûüŭŝŝ˙˙˙˙'÷˙÷˙ŭŝôÍ(˙˙ùġù΢˙ġÒ˙ò÷˙˙ô˙˙ùé˙˙˙˙ü˙ĝö˙˙òûĦ—˙˙˙ù˙Ÿ""˙ûĝÙ §ô˙ĝï˙ŭ˙ •˙˙­!˙ŝ˙˙˙ġùô+˙ùĝ˙ġ˙˙ż !˙˙˙ŝ˙˜!Ì˙˙ŝüüŝ˙˙ŝü˙ñßĤ˙é˙˙ûÒġ˙ĵ  ˙ġ˙ïÔ)ŭ˙#& Äĝ˙öùĝ˙Ïêŝöü˙ŝñ˙˙ûö˙˙Ô˜˙ŭ˙˙˙ë ˙ò˙÷  Ĥ˙ü˙ô˙˙˙˙˙˙˙˙ü˙˙‹!˙˙·÷ß˙˙˙ü* ×è˙$ ²ŭ˙ì" ’˙˙ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ğ$ í˙ü—˙ö˙ûú´ŭ˙û˙÷à$ ŭùîÉ˙Ĥ$$´ŭñ˙”/!Şó˙ŝ˙üĝ(ž˙˙™ ˙ó˙ö˙ò˙ù# Ħ˙˙˙ġ˙˙ûħ(ûë˙ž ­÷˙÷ù˙ '×ó˙˙˙š(Ğ˙˙˙ñ˙›İ˙ô0Ìú˙ñÉ*"˘ĝ˙˙ĝ˙ùÍñ˙ŭ˙˙÷˙ġò˙˙ó˙˙ò˙˙˙˙ )è˙˙˙ëè%Ŭúñ˙˙›˙˙˙ô£, Ïùıö˙î˙óšĉöú˙˙˙˙˙˙˙˙İĝûŝĝû˙üË#$ó˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ĥ˙ôŭ˙ŝŝ˙˙"îÚ˙üöü˙˙˙˙ôŭ˙ŝ Ë˙üüóß ˙ú˙ġĞ#£˙ŝĝ˙˙–'ŝ˙˙ŝ–$&Ĥ' Óŭ˙Êŭ˘$á˙ù˙˙É ˘Üü˙˙˙˙˙˙˙˙˙˙ò˙È )ï˙˙˙îÒò˙ Żñŝ˙ŝöŝ!Ħù˙ï÷#Ï˙üñ˙˙˙ ! İÉò˙ĝ ĦŞĦ˙˙ġŸ!˙ò˙ó+$›˙ŭ˙Ħ$"¤÷˙˙˘Û˙˙˙ï Ÿù˙˙Óû˙˙˙˙‹œ˙˙Ħ !—˙ĝ˙û˙˙˙é‘"Ž˙ñŭ˙˙ˆ*˙˙ë˙  §˙ô˙˙˙$•˙ĝ˙˙˙˙ŝüŝ˙ö*û˙˙ŝû˙˙ 'ġ˙û˙˙œ!˙ñ˙ù‰$)ġûó˙ŭ—³ö˙ŝŭü˙ŝ˙ó˙û˙!ú˙˙ïûÑ˙ŝú˙Ŭ›˙Û˙˙ĝĝÒ Ÿ˙ŝñ˘#˙˙ô˙ŝü˙šÓû˙ö˙÷˙¨!$Œù˙ù˙—%$Ü˙˙ŝúû˙˙˙ŭ˙ò˙İ÷˙˙˙â -#Ê˙úÓ!#%˙ûġ˙˙Ş˙ö˙"2öô˙ŝ˙”ıó˙˙÷˙ĝ˙ŭó˙ôÏ1 '÷Ï÷˙âÚ ˙˙È˙1ħúô˙˙˙˙˙˙˙˙˙˙˙÷ŭ˙´ š¨ß # Á˙ġ˙Éİ˙˙” % –˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Èû– Ĥ˙Ŭ˙Ħ!!˘îŝ˙Úò­ ùò˙ĝúĈ ˙˙ò˙ŝŸ ù˙˙úޝ˙Üùû˙ŝ$ Ô˙Ğ.˙˙˙˙ö˙ôûšġó˙÷˙Ӓ#&˙˙û!¤ûġ˙˙ö˙˘ï˙ë˙ùÉéüûŭŸŻ˙ô÷& ˙ü˙ê˙ !§˙˙˙˙ò˙˙˙ò˙í˙Ì˙ĝ˙ë˙ŝú˙˙üŭ•#Ŝúü˙˙ñÒ˙˙ŝóŞ#˙òöġ£Ò˙1˙˙÷˙!+½˙ü˙˙˙üü˙˙ò'˙û˙ù˙˙ú˙"$ Öġŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĈ •˙î˙î˙ôŝ$ ÓÏû˙˙˙˙˙ùúĝ˙˙‘0#˙÷ù˙ # —˙˙Íô ‘˙˙ê˙£ĝŭ˙+,˙˙Í"ù˙ê˙ñ˙÷˙˙˙˙˙˙˙˙˙ü˙×% & ,˙˙ûÑ÷ċ˙Ħ&¨˙˙ŝì˜Ş˙Ö)žŝŭ£#'  "÷îŸ!ñŝ˙Ê  Ġ×Ĉ£ #È˙ñ )ôŝ*˙ú˙!î˙˙ñĝÔ '&#˙Ìĝ $£úú˙÷˙˙èé˙Ĵ ÒÈӐ#Ÿŝ˙ö˙Ĥ $ Êûôġ‘%ĝĝŭ˙˙ŝüŝ˙˙%—Ï˙öĝ#°â˙óë­Òò÷ıá̒!£î˙ù˙ŭ˙˙óû˙Ħ# Óù˙˙–Ş×ë˙óĠ •ù˙ĝ˙Ò–˙ûú˙£")Ûùñ˙ûüŭ˙Ħ*›ÇÔ˙ú˙—²ĝ˙˙˙˙(Ó˙˙˙˙˙˙˙ŭú˙ú&˙˙Ëé ˙ïŭ˜+ ˙ò˙ 'ĝ˙ù'•ŜĤ ë˙ìö˙˙ô˙˙˙úì҈# £˙èċ &ž˙˙˙˘ -Ò˙ó˙˙˙˙˙˙˙˙ü˙˙ò£ " œä **òô(  ×ĝ˙"%"Ñŝ˙ŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ3Ħ˙òĈ!  ˙˙úî˙'˙úò˙ŝÔ#Ûñüù˙š#Ĵ÷ò˙÷Î&£ûÌò˙ùš˙˙˙˙ %ù˙÷˙˙ŭ˙úŻ˙˙˙˙öϤ!Ż˙÷ŝ$˙ŝ˙ë˙˙ž&Ì˙˙˙! Á˙Óû˙šûŝŝ §Ê˙˙# ˙è˙ü˙ĝ™ ¨÷ÑÙîù˙˙ûġŝ÷˙˙÷+ İŭ˙˙˙İ#1î˙Ñ˙!Ì˙˙Ô# –Ż- !ñ˙˙òÑŝŝŭŭ˙˙ŭüŭ˙˙!˙ĝ÷ö˙˙ù˙Ĉ,& Î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù•#$ %œ˙˙ġ˙â" œÍö˙üú˙˙ŭ˙ò÷&  —ù˙ + ŝ÷˙Ĥ $ş˙˙”  %İ˙ü ÷§  )žÏ˙­í˙˙˙˙˙˙˙˙˙ó˙ìÚ* ''›î˙˙Ë"¨Á¸ûú˙Ò 'ŭ $ ˙˙÷ &"˙˙˙" % ˙$!#- û 1 ˙˙˙Á Ş0 %”÷˙ĠµÊû˙É(•˙˙˙# ¤˙˙ĝù˙ĝŭ˙˙Ĉ˜'&"#§ĵ˙˙˙Ÿ$˙˙"!'˙ĉïùŝŝŭ˙˙ĵĵ  “˙˙" $ŸĊ˙-Ħ˙˙š'&˘Ñ˙˙ŝ˙üù˙˙ŭñĦ%+ %˙ “˙ü˙˙žğ#.ó˙ü˙Ž % %Ò˙˙ĝ˙˙öş%'˙Ώ"Ŭġ÷—" ôû˙˙˙ŝŭ˙˙˙İ "Ğ˙˙úŭ˙¤ š¤š˙Ĉ³ '%á˙ö˙˙÷˙ŝĝù˙ö˙˙˙›%#Ÿš˙ùŻ(& Ħ˙˙˙˙˙˙˙˙˙˙íù˙è* ÑÊ Ĵü %&˘ö˙*í˙ù˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üȘ ÷˙ä£!  ÷öŭ˙˙ ˙˙˙÷˙Ô ñ˙˙˙ñ³Î˙˙˙ù˙ü!“˙˙˙É›˙÷ŝ˙ĉĝ˙˙ôĝô˙ù  ,™˜Ñûú˙û˘˙÷˙"Žà÷˙÷™ ²˙÷öŭĠ$­ñûóŜĦ˙Ġ" öúñ£ '&Òìġ˙ú¨" $ 1 ›˙û˙ùù˙˙˙˙Î#& "˘ñ˙ŭ˘˙˙˙Œ 3ùü•% ÏĤ*˙îŝ˙Ÿ$ ´Ì˙ûû˙˙˙˙ŝ˙˙ÌĦí˙˙ù˙ĝŝ˙ż$ % % ˙˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ú & !ûú˙òÊ(  şê˙ùù˙˙˙û˙ËĤ /)Şû˙¤*Í˙Ä' ˙˙ŝİ.–úùİ *Ħ3% ˙Œ"ò˙–/$ĝ˙˙˙˙˙˙˙˙˙˙ò˙Ŝ '™˙˙˙ï˙­$ ²ĝ˙÷Î"'Ħ İ˙˘ĝïûà!  ˙ûö%˙İ$ Ş˙£Ë˙ó˙˙ 0 !Ġ÷˙˙˙+ ˙ΣĤ˙ïŝ˙ -˙˙ŝûûŝ˙˙ò˙Í#÷ÚúùïÓŻ #Ĉóù‘¤ŭóù˙˙˙ŝŭŝ˙˙Ş' $˙ïùĤ˙˙ ˙˙ò˙Ħ#˙÷˙ù˙û˙˙üú˙ĝŭ˙˙Ç˙¨˙ù˙ĝ˙%Ù'ŞĊĝ˙˙ùö& Żë˙˙ŝÍ$Úġŭû˙˙ùé0% §˙Î#"*ú / "' éô˙˙ŝûŭ˙ĝúÎ3•˙—–ò˙˙ĈÖ #Ħŝ˙Á+ #Ä˙ŝò˙ŝĝ˙˙˙ŭĝĝóò§  Ì˙˙Ï'˜î˙˙˙˙˙˙˙˙˙˙˙ĝ˙îúĠ×˙Ċô˙˙˘ĤġÚÑ˙˙˙Ì˙ĜÌ˙ŭŭùñ˙Ó"˙Ĉ˙˙˙˙˙ĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙¤£ + Î˙˙ŭèİ/ùë˙˙û ÚûÉ˙4 ›ô˙ŝ˙˙Ó£ìÉ,Öö˙ŝôŬ%'˙ëü˙˙˙ûŬ"ĤÉ˙öü˙ +#˙—ŭ˙Û!, ˆ˙˙*  ˙÷˙ó+! ! %ú˙˙˙Ûħ “¤Á˙˙ñûҏ% %İÔóġ˙˙˙úùôġĠ+™ ­˙˙û˙ĴÛó˙ġħ¨=˙ü˙›¤´úĝÌĦ)–Èû˙˙ñ ˙˙üû˙˙˙˙˙ûû˙Ä˙ĝ˙˙÷˙˙ŭ˙ "˘ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŬ# Šß˙ü˙˙úÒ". ˘î˙˙˙˙ûöĝ˙öŝ˙˙éŭ͢÷˙ò˙ŝú˙˙ĝĝ˙˙ÜĠ šà˙ùù˙ĝòÚĠú˙˙˙ü£¤‘È˙ö˙ĵĊĊ˙ŭĠ¨ÎİĈšÎ˙֒Ѩ­Á˙ú˙˙˙˙˙˙˙˙ú˙ñ% '"ŞÀûüŝú˙ĉ˙ʛ&%,Ĉœ˙ĝ˙˙ĉ˙˙½×ú˙˙ùò˙˙ô˙û÷ù˙˙ù˙÷ҜĜ­ĦÓĝŝû˙ú˙˘ŞĞ‘Ï˙ú˙ÎכÏÖßê˙˙ĝġ×Î˙˙ĝ˙éŭŭ˙әÛÓ˙˙ê˙ŝó˙ä“ÛѨ˘Ê˙ġ÷ŝ›ħŽÖÓ˙˙Ġ˙—& ßû˙ŝŝ˙ûì˙ĝÖù˙˙Ÿ0ż˙˙ŭ˙ĝ˙˙ŭ˙ŝî˙ü˙ŭ˙˙ŝ˙ġ&Ħ˙˙˙˙˙˙˙ŝüúûŝï,œ˙Î˙Ĥ 1ŭŝŭĝû×ÍĤ$Á˙ú˙˙˙•+ #Ò˙˙ûŝ˙÷˙˙û˙˙˙˙ġô˙˙ĠÍôñĝ˙ùôŬòŞÍ˙ŝ˙ò˙˙ĝɴ§Ï·ĉ˙˙ò˙˙– ÑĦ£œĠĈ˙ŝ˙ŭĝü˙ħ”µÈ ĜëóĤ¨•Ö”œÔ·˙ӈĞĦÀ¨òĝ˙˙ŭûŭ˙˙˙ú˛›ß™˙˙˙ÊÌÓ¤˙˙ô˙˙ġ˙œĈ³ŒħÉ˙žż²š˙˙ü˙˙˜£ĠœÑ˙˙üĝŝŭü˙ŭüüù˙˙˙˙ùüٜ-¨ĦÎ˙ĝçû˙ ĦĦËĠ˙˙˙˙˙˙˙˙˙˙˙ùġġ˙˙˙˙öú˙ù˙˙ìù˙˙ġ˙óġó˙ó˙˙ñ˙˙˙úŝ˙ùô˙˙˙˙ëñ˙ŝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òĜΘ% &£ŝ˙ò˙Ó ™˙˙òŸ›Ħ˙˙ûħĞ“˘ĝ˙ó˙ĝ˙˙÷Ì) ' Ñ˙ù˙û˙˙ŸĦû˙ŝ˙î˙˙¤¨žÜú˙û˙˙òÚĦ¤ù˙İÏ˙÷ە ¤Ŝï˙˙ž(ŸĦĴò˙ú˙ŝĦ˘ô*”Ùûûü˙˙ó˙˙˙˙û˙ôĝŝ˙÷˙Ï÷Ĵ–¨Ħ˙ü˙˙ĝú˙˙˙˙˙˙ġ˙ü˙˙ġ˙óŭ˙÷˙ĝ˙˙ï˙˙ô˙ï˙ŝó˙íû˙ŭĝ˙ŭ˙˙í˙˙üŭ˙üŭ˙ŭ˙˙™İû˙˙ü˙ŝŭ˙ŭùû˙˙˙ġ˙ö˙˙úŭ˙ĝ˙ü˙§  Ì˙ù˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙é˙ŭö˙˙ĝŭ˙ú˙˙˙˙ï˙üŭ˙˙˙ù˙˙˙ü˙˙˙ü÷˙˙í˙˙ê˙˙ùù˙üö˙÷˙ŭ˙ó˙˙úŝûú˙˙ŭù˙˙˙ôŝ˙úü˙ù˙˙ŝ˙÷ù˙˙˙ùĝ˙ù˙ò˙˙˙ò˙ŝ˙˙˙êü˙˙ŝ˙˙˙˙˙˙˙˙ŝù˙œùÓ˙ö˙ô˙û˙ùù˙ú˙˙ö÷˙ġ˙ŝü˙ŝô˙ĝŭ˙ñ˙üĝ˙˙í˙ĝ˙û˙˙ŝò˙˙ŝ˙ŝü˙ö˙˙ö˙ŭûü˙˙˙û˙˙û˙û˙ò˙˙ŭĝ˙˙ñ˙ŝ˙˙ò˙˙÷˙ŝ˙ĝ˙˙˙ŭĝû˙ù˙ŝúú˙÷˙ĝ˙˙ò˙˙˙˙˙˙˙ŭüĝ˙ûö%& ˙˙ñ˙˙˙˙û˙ô˙úû˙í˙ö˙˙ĝ˙û˙˙ŝŭĠ˙ö˙˙˙˙ĝú˙˙ŝŭ˙ŝûûŭ˙˙˙ü˙˙÷ü˙˙ŝ˙û˙˙ĝüû˙˙ĝ˙˙ŝŭ˙ü÷˙ú˙ûŝŬöŝ˙˙üù˙˙˙˙ŝ˙ûù˙úûû˙˙˙ġ˙˙˙ê˙ù˙˙ö˙˙˙˙ñ˙ù˙˙÷˙ŝŭ˙ïġ˙ù˙ġ˙˙ò˙˙ù˙ŭ˙ĝ˙˙˙ù˙ŝ˙˙ĝ˙÷˙ê˙˙í˙˙ù˙˙÷˙˙ö˙ó˙ġ˙˙ô˙˙ú˙˙˙˙ŝŭŭŝ˙˙˙ü˙ö˙ŝ˙ò˙˙˙ŭ˙ŭû˙û÷˙üú˙ñ˙˙û˙˙˙˙î˙ò˙üü˙ó˙˙ŭ˙˙ò˙÷˙˙˙˙˙ü˙ŝ˙˙ġ˙ó˙˙ü˙˙óü˙óŭ˙î˙˙û˙˙û˙˙˙ù˙ŭŭĝ˙˙˙˙˙˙˙˙÷˙˙üú˙ĝ˙˙ŭ˙˙ï˙û˙˙ô˙ŭĝ˙˙˙˙ŝ˙ú˙ġù˙˙˙ĝ˙˙îò˙üû˙û˙öü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷˙ö˙È*–×܋Ĵ˙˙˙üŭ˙˙ñÜúì˙ŝÒĠŝ˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ġßÍÜñ˙˙ŭü˙˙úŬÊÙĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óÚÌÚġ˙˙˙óÚÌÚġ˙ŝ˙˙ŝñéò˙ŝ˙˙ŝñéò˙˙˙˙˙˙ġßÍŝ˙˙ŜŬñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ï˙ü˙Ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙Şĝ˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ !!£˙ò˙óó˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙üó˙ôó˙ï #"Ÿû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙î˙˙Úŝûŝö˙˙ï˙ùŭ˙˙˙˙˙ŭòûŭ˙˙˙ĝĝŭ˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙ŭöòŭ˙˙˙˙˙ŭ˙üöĝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝĝúüüû˙˙ŝĝúüü˙˙˙˙úöú˙˙˙˙˙úöú˙˙ŝûŝ˙˙ŭöû˙˙˙ĝöŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûö˙˙˙˙ŝ˙˙ôŝô˙ùú˙˙˙˙˙˙˙˙˙ñŭ˙˙ĝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ µä˙˙˙˙üûġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙ü˙ù˙˙˙Ó7#žÈ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙˙ŭ˙˙˙˙ĝ˙˙ŭôú˙˙˙˙˙˙˙û˙˙ûŝ˙˙ú˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ŭ˙ŝü˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙üûŝ˙˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙÷Ò˙˙œŞ˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùúŝ+#˙è˙ú˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙úùŝ³˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙ŭùûô÷˙˙˙˙û˙ü˙˙˙üü˙˙˙ûùü˙˙˙ŝŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙˙üü˙˙˙üûúûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝöú˙˙˙˙ŝĝöú˙˙˙˙üûŝ˙˙˙ŭ˙üûŝ˙˙˙ŭ˙˙˙˙ŝüüü˙˙ŭŭŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ĝü˙˙˙˙+ü˙˙ö˙˙˙˙˙˙˙˙˙öùŭ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì½"Ħ˙ú˙÷ù˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙ŭò˙˙÷¤ ÖġÂġ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ˙˙˙˙ŝ˙˙ò˙ù˙ùúŝŭŭ˙˙ŭüŭ˙ûû˙˙úû˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙üü˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙ŭüŭŝ˙˙˙˙ŭüüŝ˙˙ŝŝŭüüŝ˙˙ŝŝŭüûŝ˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙˙ġĦ* ˙˙í˙ŝ˙˙˙˙˙˙˙˙˙˙ŝŭüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û !# "˙˙ò˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙˙û˙˙û˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙üù˙÷ŝ˙ĝ˙˙ùŝ˙˙ûû˙˙˙˙ŝŝ˙˙˙ûŝ˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙ŝ˙˙˙˙ûû˙ŭ˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙˙˙˙üü˙ŭ˙˙˙ŭŭŝŭŭ˙˙˙ŭŭŝŭ˙˙˙ŝŭŝ˙˙û˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ôî¨ è˙ê˙í˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙- )ž˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙ûû˙˙˙ûíĝ˙˙ó˙÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öóŭ˙˙ŝŝñ˙˙˙˙ü˙üû˙˙˙˙˙ú˙˙ûú˙˙úŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙ŭûûûû˙˙˙˙˙ûü˙÷˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭûùŭ˙˙˙ŭŭûùŭ˙ŭ˙˙ŝü˙˙ŝŭ˙˙ŝü˙˙ŝ˙˙˙ŭûûûûûŭ˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ì $%İóó˙ö˙˙˙˙˙˙˙˙˙˙ùùŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙  ŝ˙ù˙ĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙úòú˙˙ó˙ë˙ŝö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙÷ö˙˙˙ŭù˙ü˙˙ŝŭ˙ŭùû˙˙ŝŝ˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ûùŭ˙ŭŝ˙˙˙˙ŭ˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙ŭ˙˙üŭ˙˙˙ŭ˙ŭ˙ŝúü˙˙üŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙ŭ˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙÷üŭŝó˙ŝ˙ĝ˙ûŭ˙˙˙˙˙˙˙˙˙˙ûŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ĝ˙˙˙˙ûü˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙ùŭ˙˙˙ĝ÷˙ù˙úŝ˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭŭ˙úú˙÷˙˙˙ö˙˙ú˙˙˙˙ŝüŭŝ˙ŝ˙ĝúùġ˙ġ˙ŝ÷û˙ĝ˙ö˙û˙ù˙˙˙˙˙ù˙˙ò˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙ô˙˙˙ĝ˙˙ŭ˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ò˙üü˙ŭ˙ġ˙úŝùûŝ˙˙˙˙˙˙˙˙˙ġ˙˙ôġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭû˙˙ġ˙˙ùô˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭŝ˙˙ü˙é˙˙öú˙úö˙ï˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙ô˙ŭġ˙˙š˙˙ô˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ü˙ú˙ĝ˙ŝ˙ŭ˙˙÷˙ô˙˙˙ù˙˙ú˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝûàôŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙í˙˙ú˙˙ŭú˙ú÷˙˙˨šËÜ˙Ä˙ö˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ˙˙ñ˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ú˙˙˙ü˙˙üï˙÷˙ú˙ŝüüŝ˙˙ŝüġ˙˙˙˙˙ò˙ú˙˙ŭ˙˙ö˙ñ˙óŝ˙ġŭ˙ò˙î˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙óŭû˙ë˙ŝ˙ŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙÷˙û˙ñ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙ġü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ï˙ùü˙öú˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŭ˙˙ŭ˙˙Óí̜Ğù˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝ˙ìà $¤ öûŝ˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙éŭ˙˙ÎĞ•ß˙ĝĝ˙˙˙ġ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġú˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŸ–&¨÷˙ò˙Í÷Ö "Î&Ŭ˙˙ôŝ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĊÇ˙é˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŝ˙˙ù˙ĝ˙˙ŝúû˙˙˙ŭ˙ú˙˙üû˙ĝġ˙ĝ˙ŝŝò˙˙ñ˙ö˙˙˙˙˙˙˙ŭ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ŭ˙ü˙˙ĝ˙ġë˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙û˙ú÷˙˙•Ÿ™Òô˙˙˙˙˙˙˙˙˙ù˙ÖÇù˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ó˙ù˙˙ö·œÉöï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üüŝŝüô˙˙ŝÓ!áċú˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ù˙"!˙ŝó˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝû˙˙óž• • £™Ì˙ñ˙˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙š›Ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú$*" ¤˙üóù˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê"9’ûö˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ġĝ˙˙˙ñò˙ï˙ŝ˙˙˙˙˙˙˙ŭ˙˙˙ŝ˙ò˙˙˙˙ŭ˙˙˙˙ŭŝ˙÷˙úĝ˙˙û˙ġ˙ŭô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ü˙öŞ­ê˙ò˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŭ˙˙˙˙Û # )0ë˙˙˙˙˙˙˙˙˙ùüŸ¨÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùüü˙˙ğ! %—˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭüüŭŝ˙˙î˙#Ĉ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ü–% '# Ù˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭö˙ùÊ)!˙˙ŝÉ (¤˙ùúŝü˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝÚ-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éÙĈ ÈùŬ˙˙òûÍ,—Ìû˙ôŝ˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ '˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŝŭìÍ˙öÓ!˘Ê˙ôû˙˙˙ŝŭ˙ĝ˙ñ˙˙ùûûö˙üû˙Ħç˙ü÷˙˙ëú˙ù˙ü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùûÈ!˙ŭù˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ü˙û÷˙Ĉ%!Ûñ˙˙˙˙˙˙˙˙˙!ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ñĠ# *Àŝŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ġĝ˙˙²­!*ó˙˙ŝî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙×ùß” # &¤ó˙ñ˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ġÒ%# ˆÒòó÷ŝĞ "'ċ˙˙úñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü Ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙—%Çŭö˙˙˙ŝ˙˙ݘ˙˙ê˙˙˙˙ĝĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ (Ĵòŭ˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙ë™*Éüéô˙˙ŝûŭ˙˙ŭ˙˙ Ú˙ô˙ó˙*1ôü˙ŝˆµĦ™˙ù˙˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭĝ˙˙Ñ"˙ŝú˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûö˙Ġ'˙ŭ˙˙˙˙˙˙˙˙ŭÚ ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝùóö˙Ò #Î˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝú÷ú˙˙˙í˙˙ĝ &™˙òĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙$–˙˙ĊÖÇÙ˙ú˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙’˙˙˙˙˙˙˙ü Óŝ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú&™˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭùĝ˘˙ö˙˙ä˙öûú&$˙ô˙˙˙û˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙™&Á˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙ĝ³" Ö˙òĝ˙˙ŭûŭ˙ŝ˙˙É&ž˙˙Ŝé š˙Ñó³ ™öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ôñŭ"!ñò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ß˙˙˙˙˙ġòş †˙ü˙˙˙˙˙˙˙˙ŭô² É˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ĉŭ˙ž$ûŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüü÷òö˙˙˙˙û˙À˙˙˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙á÷ġ˙˙˙ôöï˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòĦŜĝÍĝù˙ì˙,˙˙ùö˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙´˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ħ&$ŭó˙˙öú˙˙ŝ˙˙˙˙ûġ˙ŭ˙óŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—Ñ™¨üŭŝ˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙÷û˙÷İ.#ùŭ˙˙˙˙ŝŭŭŝ˙òŝĜ›ö˙˙˙Ì˙ù˙Ĉ!˙ûú˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üù˙˙ó˙ĦĦ˙˙˙öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĴûŝ˙˙ï˙˙ó¨ûŝ˙˙˙˙˙˙˙˙˙˙ŭ÷˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ÷ü˙ó˙ö˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷û˙ŝ˙ó˙ĝ˙ĠĦú˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú%)ċ˙ŝ˙ġ˙ŭ˙˙÷˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜÒû˙˙ŝ˙˙˙˙Ž ¤ùù˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭó˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!˙˙ŭü˙ŝŝÊ˙š!—˙úû˙˙˙ö˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ë#˙ûûŭüŭ˙˙ó˙˙ùŝÎ˙˙ó˙üü¤ù˙˙˙ŝÎ Ĝ˙ġ˙ò˙˙˙˙˙˙˙˙˙÷˙ŭöŭ˙˙ĝ˙úú˙ú˙ŭ˙ù˙˙˙˙˙ò˙˙û˙˙ûùŭ˙ñ˙˙˙ŝ˙˙˙˙ŝ˙ĝ˙˙˙˙˙˙ŝ÷˙˙ÇÓĝú˙üŭüû˙ô˙ŭ˙ġ˙˙ŝŭ˙˙ú˙ĝ˙ü˙˙öŭ˙÷˙˙ô˙˙˙ú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ç˙˙üĝŝ˙˙ö˙˙û˙÷˙ì˙Ëıŝùûô˙ù˙˙ö˙ŝ˙ù˙˙÷ù˙­Ó˙é˙˙˙˙מ˙ü˙ë˙˙˙˙ç˙˙ü˙ì˙ĝúûú˙ġ˙öú˙Ê÷˙˙˙ûŭŝ˙ú˙ùü˙óù˙˙ö˙ú˙˙ŭû§ À˙ŭ˙ü˙ú˙˙ŝ˙˙ü÷˙˙ò˙˙ġ˙ŭú˙òŭ˙úŭ˙˙˙ŭŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝûÎİŝ˙ò˙ĝ˙ŭúÏ!Ħ˙ßġ˙ûú˙˙ġŝ˙üŝ˙˙ŭ˙ŭ˙˙û˙ù˙ú˙ĝ˙ŭ˙ú˙ö˙˙ô˙˙˙ùŭŭġ˙öŝ˙ûò˙˙î˙˙˙˙Èû˙˙ùĝ˙˙˙˙˙÷˙˙˙òŝ˙ġĝ˙û˙üú˙˙˙˙˙ó˙˙é˙˙ûŝ˙üŭ˙ö˙˙ŝ˙úûŝŝ˙ûŝ˙ġ˙˙˙˙ú˙ñ˙÷˙˙ĝ˙˙ĝü˙òúŭ˙ŝ˙Ö˙˙˙˙˙˙úĝ˙˙˙˙˙˙˙˙˙ù˙ü˙ù˙! ­ú˙ú˙û÷˙ö˙È*û˙˙ĝúŭġ˙ĝ˙˙ó˙˙ù˙ĝ˙˙˙˙ŭ˙û˙ùġ˙úŭŭú˙òĠ˙ù˙ĝġ˙ĝú˙ŝù˙˙úû˙˙ü˙ŭ˙˙üü˙ŭ˙˙û˙ĝ˙ñ˙˙ĝ˙— ˙ö˙Íŭŭ˙˙˙˙œ- ˙˙ñ˙ŭŭ˙Ġ÷ü˙óù˙˙˙ô˙öŭ˙ŭ˙˙ö˙÷˙˙ô˙û˙üġ˙˙˙óö˙˙ġ˙˙ù˙˙úü˙ìŝü˙÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙ûĝûŝ˙˙˙˙ŝŝ˙úŝúŝûĝ˙÷˙ûó˙û˙˙˙˙˙˙˙˙˙˙û˙˙ù˙˙˙ĝ˙ó˙ŝ˙˙ö˙˙ó˙˙˙ù˙˙˙ì˙ú˙˙˙˙˙˙˙ï˙˙˙ñ˙ö˙˙ĝ˙˙ö˙˙ĝ˙ĝù˙˙˙÷˙˙ï˙˙˙ŭ˙˙ĝ˙ŭ˙˙˙˙ñ˙ĝ˙˙üú˙ġ˙˙úô˙˙˙üô˙ŝӞÍ˙˙˙•˙˙ù÷˙ÉÔŭ˙Ë£úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭœÇö˙˙˙˙˙ëû˙ñ˙ù˙ôÙ°˙ŭû˙ŝ˙İ ìôü˙˙Ñŭ÷˙˙˙ü˙˙˙˙˙˙˙˙ŝô˙˙˙˙ù˙ö˙öû˙é˙ò˙˙ġĝ˙ĝù˙÷ŝù˙ŭ˙˙ò˙ö˙˙íö˙ŝ˙óú˙˙˙˙÷úĝ˙ŭŭ˙ï˙˙˙˙üúù˙˙ò˙ó˙é˙ùù˙ë˙ü˙˙˙ŭ˙î˙˙˙ì˙˙˙˙úúúù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üñ˙ŝùġ˙ŝï˙ŭüŭùô˙ì˙ż¨˙˙˙ŝùŝŝ˙˙ùûù˙ŝ˙˙˙ž Ğ˙˙öê˙óŸ$œ˙Èó˙òû˙˙ùúúö˙öó˙˙˙ú˙ó˙˙˙˙˙ŭ˙˙ë˙è˙˙ü˙˙˙˙˙˙˙˙ë˙ŭù˙ü + ¸˙÷ô˙˙˙˙˙ü˙÷˙ŝà˙ï˙ŭ˙ô˙ö˙˙˙ŝ˙˙öġü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ­ ˙˙ô˙˙ù˙Ó"Ĝòó˙˙˙ŝ˙˙ŝ˙ò˙ĝ˙˙÷˙ûÒ˙Ê÷˙ù˙˙ûö˙ö˙˙ĝ˙˙ŝ˙ü÷˙˙˙˙˙˙˙Â˙˙ò˙˙÷÷˙˙˙˙˙ù÷˙˙öû˙í˙Î÷˙ŝ˙òĜ×Ôúŝ˙ù˙ĝùÉĦ˙ñô˙ĝ˙˙èŝ˙ĈœœŝÉ˙˙˙ûŭû˙˙˙ùñî÷˙ü˙ĝ˙͜ŭÒĠŭ˙˙˙˙ġó˙Ïùġûùġ˙˙÷˙˙˙˙˙˙˙˙˙ü˙÷˙˙”3ż˙˙ù˙˙ŭ˙î˙˙Úŝ˙î˙˙˙˙Üí˙÷ŭ˙çú˙ù˙ġú˙˙Öùùŝ÷˙˙ġ˙ŭ˙úú˙˙óù˙˙˙ġ˙˙ŭùŭüÑ˙ŝ˙˙á˙ŭü˙ûü˙ŝ˙˙˙ü˙˙˙˙˙˙Ğö˙î˙û˙ŭûŭÇ -ë˙˙ġ˙˙ùŭ˙˙ê˙˙ü˙Ëŭ˙˙ñ˙ŭò˙ú˙˙ŭ˙˙Ñûë˙˙ö÷˙ôö˙÷ġ˙÷˙ö˙ĝö˙˙ï˙˙ŝûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷ú˙˙ûüÖ˙˙òû˙˙ɢ"­÷ÙÍ֛/¤É˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙ùïë˙à˙òġŭ´Îü˙ô˙ŭ˙·˙˙ŝ÷úú˙óô˙÷ŝċú˙ó˙Íöù˙ŝ˙ñ˙ġ˙˙˙÷É˙Ĉ˙ùĝ˙˙îöËú˙˙˙˙ġö˙˙è˙ÑĤ™²Ú˙ġ˙˙˙ı'!ϟ"§Â3'™˙§ $‹(˙ŭ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ž"ŝ˙˙òòú˙ĝ˙ñ˙üô˙üô˙ü˙ŭ˙÷£öû˙˙ŝÎ˙ù˙î˙ĝ˙˙˙˙˙˙˙˙˙ëŜöú÷˙ĝò˙˙ï˙˙í˙÷˙˙˙òù˙ó˙˙ôŭùĤÔ˙˙˙˙˙˙ŭŭĝ˙˙˙˙óô˙˙˙ñ˙˙˙ŭ˙ù˙˙ü˙öúù˙ú˙˙ŭŭ˙ú÷˙˙úù˙÷˙ñúŝ÷˙˙˙ġî˙í˙˙˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙óŝñ˙ñ˙˙û˙ĉ˙û˙ġ˙Ï'Íô˙ŝû˙˙úġŭ˙˙÷˙óùĝ#—í˙˙˙˙˙˙$žÀ˙˙è˙˙˙ù˙˙˙˙˙ô˙˙˙˙÷˙˙È­–Ÿ¨Â˙ú˙˙˙ŭù˙ġù˙ñ˙ñ˙ŝ˙û˙ŭ ˙ñ÷˙ú˙÷ë˙˙÷˙˙˙˙ö˙ùòİ­Ö˙˙üî˙˙˙˙ŝúġ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öí+ œÙû˙˙óÍᖨ ¤ż˙÷˙ì˙˙Ï˛ !Ü˙ĝüú˙ïŭ˙ó˙˙˙͔Ħ›ÍĝÊ"§İŭ˙û˙äÔû痝Ğè˙˙˙˙˙˙ĉÛ§!¨¨  Ñö÷Ĥ/%˙öö˙˙ö˙ûޝ. Óíġ˙ñ˙ûŝ˙û˙˙ŝ˙˙ĝ•+ 1  ³Íëŝï˙˙—-$*¨˙˙ŭò˙˙˙˙˙˙˙˙˙ŝ˙ñ˙Ù& ˙ġú˙÷úŭ˙˙˙˙ŭ˙˙úŭ˙·¤Ŝĉ˙Ìş¨ Ôùü˙˙ž˙ŭ˙֑´Í˙ô˙җĦ˙û˙û˙˙ç˙ÈĉÇÇûġ˙˙˙ë˙˙˙˙˙˙˙ŝ˙üü˙˙˙ûì÷* İ•ħ—ħ(#'˘˙óû˙ĝˆĥü˙˙÷˙͗äùúù˙Ġ˘Ä˙ëöÊ#™˙ĝڟÏö˙˙ù˙ì˙Θ š˙ĝ˙˙ñü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙ĝ"ü˙ŭÈ*¤  )Žû˙˙˙˙˙˙˙˙üù˙˙ûŭ˙ñ ˙˙˙˙ú—1Ì˙Ŝġ˙˙˙˙˙ĝ˙ŭ)&˙úùĝ˙˙˙˙Ë($(ì˙˙ç˙0˙ó˙˙˙˙ћ¤-%ŞÂ˙˙֛РŻĦ $˙ž ˙%ùöġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ù˙˙˙˙˙ö˙˙ŝ˙˙ô˙˙˙ó˙˙˙£#˙˙˙˙ŝÍ ó˙˙÷˙˙˙˙˙˙˙˙˙˙˙ï˙ÛÍ˙˙˙˙˙üîö˙˙˙ñÚÊÜÚò˙ġùò˙˙, ŝöò˙˙ĉ˙ġ˙üù˙ö˙˙û˙ë˙˙ü˙˙ŝŝĝ˙ŭ˙˙óú˙˙ï˙˙òċËÛÉ˙ŭ˙˙˙˙˙ôÛÍÍàÎÛñ˙˙ùùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ßĜÚ×ÇÇ˙û˙˙ÎĞ˙Ċġ˙òö˙ŝ˙ùŝ˙ú˙üœ!)$ÌÒúîĝ˙ġ+Ÿ˙ÚÈ˙ŝ÷üġ˙ &÷ûŝ˙ŭ˙"Íŭ˙ù˙˙˙˙˙˙ŝí˙˙ÄÏĤÙÍ)ĝ˙˙éÀĜ£-!Ìú˙ó˙Ş ŝ˙›*¨ĝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ó./ê˙˙Ï' ,! Ù˙ò˙˙ò˙¤. $Ÿ˙˙ŭ˙˙˙î˙úñ -$™ŭ˙óŝŞ ,Ĉñö˙ï˙$"!$!.  ˙˙ġġ˙ÒÍ (­ü˙˙óú˙÷˙ú˙˙óùóŻ# ĉ˙˙˙Ÿ1 4Ğ˙˙÷˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙˙Š*ĝ˙ùû˙˙ŝü˙ŭùûôö˙ü˙ħ%"’˙( Î˙÷˙ùË ) ˙˙­ú˙˙˙˙˙¨  ݧŻ˙ú˙ú˙˙ŭ˙ûû˙˙˙÷ô˙˙˙%! 'Ġ˙ï˙˙њ*í˙˙˙à¨"˙ŭ˙Ԍ +˙˙Ç; ĦË͟•˙ŝùġ˙ĝÓĥ#Ò˙ôñŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ìÄú˙˙£("$'("›˙˙˙˙˙˙˙˙˙ŝŝû˙˙Ş!" # •˙˙ŝ÷ÛĤ‰ 3˙˙˙™ ,#˘È- " Û˙íú÷"Ì *˘˙ŭÊ* (™˙û'!"ġŭ %²ú˙ŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷û£,û˙Ìñŭù˙ü˙ŝ˙ê˙˙ß˙éú˙ñ˙ŭ˙ĵúŝŭ˙˙Îĝ˙˙˙û˙˙˙˙˙˙˙˙ôĞĦ&òϟĦ˙˙ŭü÷ȕ- ˙ó˙˙’Ş˙úô˙ĝ˙Á­ÎûÌú˙ùü˙è˙˙Ú˙ÏŬŝ˙˙ò˙ٙ Ú˙˙ż˙ü˙òú˙ž! -í˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙š Ğ˙˙ŭĝ! ŝ˙˙ò˙˙˙û˙ĝúğ!Á˙˙ûú $+‘˙˙˙˙›&˙˙öùö›*²üĝ˙˙ü˙êġú˙˙òÉ(ž˙ôŝ˙  œ˙˙ŝ— ëÒ*šò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭì" £Òü˙˙÷Ï .Œ¨§˙˙˙˙0!ş˙ù˙èû˙˙˙"İҟ9ŭüŭŞ **!Ŝ˙˙˙ŭ (! $%!# ˙˙÷˙Ñ˙$-˙òŝ˙˙˙ö˙ü˙ó˙˙Ù "ŭ, ĝ˙ġ -­˙ĝ˙˙˙ó˙˙˙˙˙˙˙˙˙˙êĞ"1˘˙˙˙úĝ˙ŝĝ˙˙˙˙ŝŝ˙ϛĴ¤Îùô˙£) 'Ĥ "Ŝò˙üĐ& "ñ˙˙ġ˙˙ŝ˙˙˙˙ùŭú˙˙˙ñ—&˜ĴĞ •˘)(Ùô˙ŭ˙ô Ÿĉ˙ġÌŞġġ˙" "Ǣ‘Ş›"'/ìûû˙ÉŞ“ #"Ş˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭû˙ŭñŸ',öû˙›! ˘ÒŞ˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙¤İÖ 4žĦĜ˙ï˙×˙˙˙ #˜ô˙Ù$&²'Ÿ#Óî˙˙˙Ò  ˙üŜ§•‰˙ŭ žžİú˙Äçú—ò˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙")¨›İ ˜İú˙ûö˙ûêْ×ú˙˙˙éÁúŝûŭ˙Ò ô˙ù˙ñ˙˙˙˙˙˙˙˙- ! )"À˙˙Ĥ&" Ö˙%˙˙ȟ# É˙ûï˙Ž! (˙ùò˙Ĥ ( 2Ĝë˙˙˙Ä' äĝòü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ˆ/Ğ  úó˙ù !"˙˙úî˙˙ûúû˙˙˙ż,‘äùù˙˙°Ĵ˙Ó$ĝŭç˙  '&˙ï˙˙˙!İĉ˙˙éùŝ˙˙ĝŭé2!"ŜĈ'$öŭ÷Ë"Ĵ˙£òûŭ·!"˙˙ £˙ŭġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙Ĥ˙ä˙÷è˙×$ ˙ŝÌ!.& ˙ŝ˙Ċ.  Úû˙˙˙ŝĝ˙ûĞ" -ċġ˙"˙ŭ˙ /-#Ÿġù˙˙ç&&#ÏĜÒ$#ž˙È×Ĥöü˙¤#$$Ö˙úġ˙˙ô˙˙˙˙˙Â$'ĦÌĈ˙ü›%ì˙×˙ħàá˙˙ñ˙˙˙˙˙˙˙˙˙˙öò˙˙ Üŝâ˙˙˙ĝ˙˙˙üù˙÷ŭû–  ˲œĠĝ˙ËÒ˙İ#ë˙%˙˙ĝï0$ ñ˙›*Š˙Ëôßû÷î˙ûüüô˙˙˙îĝÛ! ˙ÀĠ˙ûúÊ˙˙  ù˙˙ö˙˙ Öìġ˙Ċż˙˙Ĵ £˙Ĝ˙İ 2žÇ  Ç˙ĝŝĦ Ġ˙ żú˙ĝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙˙׉'Ş˙ŭŝ˙›şÉöóž-Ó˙˙˙˙˙˙˙˙ò˙˙˙ĝ˙ô·ħ˙ġ% ÷˙û"$Ŭó˙ŝœ(óŬž% Ĥ˙˙ġÒœ˙÷Ë*%ì˙ïë "˙úĝúœŞë˙ùŭ×/$˙˙ŭ, 6òàĝ˙˙ġ˙$Ì˙ $Ĥ˙˙ùŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öÛ0 “ %™˙ŭ˙ġóНġ˙˙ûç}˙˙ŭŝ˙Ò(ë˙˙÷˙˙˙˙˙˙˙˙˙˙ !  ¤˙Ò  §˙+á˙ 0‘ŭ˙Ú Ž0ò˙˙˙˘ %"ġú˙˙ ˘Ùž %ž˙ú˙ñĴżŻ ! Èù˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üİ ˙˙$Ï˙ŝŭ˙Íú˙üü˙ô˙˙˙˙ôÍA ú˙ñ˙ûô˙ 'üüĝ×#˙ĝ˙˙˙ %çŭö˙Ç !Ġ•,˜˙˙ç˙˙ûġüç˙ä "Óô˙À) ˙˙˙˙ Ħµ³˙ö%˙˙öÂİ%˘˙áÛ£˘Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä& áòÑ˙ù˙˙˙Ë˙Ż˙ù ˙öÌ# !3" ûé÷˙ü˙˙˙Ĉ-#÷˙˙˙ Ĵ˙ûĠ ÷˙Ö˙ûġü˙£İò˙˙ï™›ŝ˙˙Ì/ ˙˙ŝ .&$$˙ôù˙ġ˙ŝ˙ĝ˙ûç-! Ó˙˙˙˙Â.˙ġÊúœ% Ÿŝô˙˙˙˙˙ġö˙˙˙˙˙˙˙˙˙öŭ% $%˜˙˙˙˙ç˙˙˙˙öóŭ˙˙ġ˙ )˙÷˙úŭ˙˙í')Ê˙ô1×˙˙ !ĦÎÖü˙ Ì˙˙˜›˙É˙˙úĝÜŭ÷é˙úû˙˙ü˙ùġ˙4÷ûŝ˙ü˙˙˙ë˙'§÷˙ú˙Ê#˙ú˙ï)$Ÿ˙Èóšž *İ˙ôÍ ÜĠŸ&œ˙ì˙¨ ŭ™#Ż˙ü˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙ŝġ˙÷èò˙˙û˙) Îü˙ĝ˙& ˙˙˙˙˙˙˙˙˙ûú˙˙öċĜ˙ó˙Ì #ô˙úüÛ Ë˙ŭŝ£#! ĦÇ˙ûġ˙˙÷˙˙ŭ˙é£!ó˙˙ŭ'˘˙˙˙ÌúÌÏ˙ï¨!Ĉ˙˙ñ˙˙ñ›&˙"ò˙˙ñ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê. &˙˙˙ž ˙˙˙ Ÿŝŝ˙ñû&ŭ˙ûŭ˙Ġ˙ó˙ù˙˙˙˙˙˙˙˙˙ž¤²Ĉ˙Ñ˙üÊ˙ò!§Žâġû˙İËÙ˙öĝ˙#ñ˙ôö # Ş˙ŭĦ£ ÷ŝŭÔ˘Û˙÷×#Ĉ˙˙úġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝÑ#­˙î˙ŭÓĝŭ˙ŭ—!! ˙˙ŭû˙˙ŝü˙˙ŝ˙˙ù˙ż ˙ŝ÷˙˙˙˙÷$ĝ˙˙òĜ ˙ġ˙ĝï˙˙ġ)Òŝüö˙˙˙˙˙ĝ˙˙ü˙˙ž ,ŝ˙ú˙˙§ )ĝ˙ù˙£÷˙ü˙˙¨#Ì˙ŝ˙Ë£Ÿŝ˙™ô˙÷˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝ Ç˙ô˙ú˙÷˙Ìŭ˙ó˙üİüúÔ$ ¨™"Ê˙˙˙ŭ˙ö˙˙˙˙Ñ "œĝ˙ŭ˙ŝÔĝú˙ŭ˙ġ˙˙ĝû˘˙ùû˙ŝÊ˙üú˙˘!˙˙˙û˙ü˙Í §Ÿ Ñĝ˙ù˙˙ĝġ˙˙÷˙˙ŝ+ž˙˙ŝûÏ˙ * ŝ˙˙˙Ç!Şġ˙˙˙û÷˙˙ŝ˙˙˙˙˙˙˙˙úŭ˙˙ú˙ĝ˙ŝŭ˙˙˙ú˙˙÷ö˙ú˘"#î˙˙˙˙˙ûË£™˙ŭ˙Ğ ˘ë˙íÛİŭü˙œ!ž˙Êú""Íü˙˙ĝĤĞ‹Ĵ£’İ˘˘ĝ˙ùü˙˙˙˙üû˙ö˙˙˙ÖÊ˙ú˙˙ôÓĦġ˙òŞ'Ü˙ó˙ÓúŸ‘˙Ĉ˙ŸŞŭ˙ŭÒ÷˙š £ûûü˙ùÎ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙ú"˙û˙ñ˙'ñ˙ù˙˙Ĉ" §˙˙˙˙˙˙˙˙˙˙üŝ˙úû˙ ˙˙˙ĝËĞô˙˙ĝŭ!Ñ÷˙Ó! ˙˙ñ˙Ó!÷˙ù˙ôĴ˘÷˙÷˙Ï ˙ËùĠÌ˙ŭŝ÷˙ΜŝÔÉ—˙˙˙ô˙÷ŭ˙Î$Û˘˙˙ë˙˙ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙Ö&˙úö˙›%Íŝ˙˙˙ûš˙ö˙˙ !ü˙˙÷üÖ ×÷÷˙û˙˙˙˙˙˙˙˙ŭÏ$ù˙˙Ê˙ĝÎ, !ŸÇ# "˙ü˙Î%˙˙˙˙ŭġŝ×ÈĜóŭ˙È#˘Òü˙ĝ˙£˙˙˙û˙ Ÿ˙Ì˙˙ô³ ˙˙ù˙ ÔĠÓĊ˙÷ù˙˙÷ùü˙ö˙ö˙ŝ˙˙˙˙˙˙˙˙üŝÏŜùù˙û˙%•Ó˙ùü°­ö˙÷˙˙ŭŭ˙˙˙˙˙üö˙ù˙ĥë˙˙÷÷˙ŝü!­ü˙û˙Ï™Ò˙ûú"Îû˙ü˘ " ×í˙ŝġ˙ü˙ù˙ŝ˙žĦ÷Ĝŭŭù˙ŭ˙˙ö˙˙ö˙ŭŭ˙!¨ÊÓ˙˙úü &Ħġŭĝ˙öŭ˙ŭ˙˙ŭ˙ó˙˙ó˙˙˙˙˙˙˙˙˙üÌùô˙ô˙ŭ˙’!ŝ˙ú˙˙ùĤÊ˙üÎ˙˙˙ĝ˙ú˙ù˙˙˙ġ˙òŭ˙ĝ˙Ê!ü˙ô˙˙™£˙˙ĝ˙ú˙ĜÌĈ˘ġ˙˙˙ùÑ÷˙ü˙˘$÷ú˙ġ˙ŭŝÒËŭü˙˙˙ü˙˙û˙ú˙ŝûûŝ˙ŝò˙"£˙˙˙ú˙£Ì˙ûúÇ˙˙ùü˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙ùü˙˙˙ú˙ŝŭ˙úŝ˙¤˙üÊŭ¤)™˙ôŭŝ˙ôü˙ Ú˙ûÔ#ÑÑ˙Ë!#˙Ç˙˘ É˙˙Á%ĝú˙ù›#( ŝ˙ġù˙Îŝ Ġü˙üŭŭŝ˙˙˙¤–ü˙ĝ˙úĜÉ˙˙ġ$Ĝûú˙˙˙ ÷˙ŭ˙%˙˙ú˙˙ö˙  (Ÿ˙˙úüù˙÷Ĝüù˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙üŭ˙üŝ˙˙ŭ #!ë˙ĝ˙Ž$˙˙˙˙ûÉ"³˙ġ˙˙óŝ˙ú˙˙ö˙˙ġ˙œ˙ù˙÷Î&Öôŝŝö˙÷Ĥ&ÔÛÌĠÔ˙ŭë˙Ù žÔ÷˙ù˘ Ôġŭ˙ĝ™"˙˙Ï%ö˙˙˙˙ŭ!£ú˙ÓœÑ˙˙üŭ˙˙ñÜ " Ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù÷˙˙˙˙ÎÇ˙ġú÷À "˙˙ŭò+ ŭ÷˙˙ÇÙŝù˙ù˙˙˙˙˙˙˙˙˙˙˙1ŭŝì˙˙Ĥ ËLJ™ĦĴž˙ŝ˙ñžÚĝÑü˙˙ò˙˙˙˙ŭôÍÌ˙˙ñùà ,Áö˙ĝ˙ü"Ħ˙ô˙ĝ˙Ù -•ï˙˙œ.Ïŭ˙˙ŭĝñ˙˙˙ú˙é˙˙ĝ˙˙˙˙˙˙˙˙˙ú˙ïġ˙ê˙Ĥ'×˙ì˙˙‡!˜˙öŝĝĝ˙˙üĝû˙ùŝ˙˙ñ˙)!˙˙ġ˙˙ñ˙˙!˙ü˙ú˙Ó"žûûî˙‘ Ĝ˙˙öË %$¨˙˙ü˙˙˙˙ŝùë- §˙î˙ù˙Ĵ÷ü˙˙ù˙˙˙§% ™û˙˙ġ˙ŝ¨˙ĥ4ï˙˙˙˙˙óö˙˙ĝ˙éŝ˙˙˙˙˙˙˙˙˙ú˙§"ü˙ùĝ˙˙ú ħ˙ĵ˙˙ó˙%Ŭ÷ŝÏ#¤˙ñ˙Ï˙˙ïï˙ç˙˙˙ŝ˙˙öê˙˙œô÷˙â˙à é˙˙˙˙÷˙÷˙˙&ż˙˙üù– ˙˙ì˙˙" !˙˙ŭ"Ô˙ù˙ĉÚ˙÷˙ö˙ŝô˙˙˙ĝùĝ˙˙#¤ñŝì˙˙üÙ!–˙˙˙ £˙˙˙˙ŝĝŝ˙ŭ˙˙˙˙˙˙˙˙ŭ˙˙ö''5ċ˙˙ĉĝ˙ùŝ˙"(Ġ˙˙Ñ  ¤áÙü˙˙ŝ˙ ¸Âü˙żĞàòò˙Í×ùĝû˘Ûŝĝ%"…˙üù˙Ħ $$ ŭġ˙˙ü˙ $Éĝĝ˙ŭ˙˙ô˙˙œ##˙˙ì˙ü÷ ˙ûî•Äüŝ˙˙ñ£ Ĥ˙í˙Ş#ßûùŝ ŭ˙˙ÖŸŭüî÷ŝŭ˙Ĉ¨žî˙˙ò˙ŭ˙˙˙˙˙˙˙˙˙ùü˙ŭùĝ˙Ĝ/ #î÷ûöĞúû˙î˙Ċ—˙˙ĝ˙˙˙˙üû˙˙ô˙˙ó˘ ¤ĝ˙üŝË Ĥò˙˙ú˙Ò˙˙Í,Ç˙ġ˙ë˙˙˙ñ˙˙îÉĞŭ˙˙àŽ&°˙˙ó˙Ù$˙ĝÒÛ˙÷ûĝ˙üÎ˙ò×$Ñ˙ŭ˙˙˙˙˙ŭò"Ĵöô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙ü˙+’à˙ŭŝ÷ûĊ˙˙˙˙ĝ ,ġ˙ô˙˙˙ùòï˙˘ß˙˙˙ö˙˙˙˙˙˙˙˙˙˙ö°û˙˙ĝŭœ ô˙ŭ˙Ñŝŝ˙óġÙù²Ċü˙ù˙ö˙˙ġĜĝò˙Ĝ $ĝúĝ˙ù˙ %˙ó˙Î÷–úŭú˙˙üË˙ŝüù˙Á"' .êöù˙˙˙üú˙ö˙ĝ˙ŝ˙˙˙˙˙˙˙˙üú˙˙×—Ş›‘!Ġ˙˙˙ŭ´Ĥ˙˙˙ûû˙˙ü˙˙˙ŭ˙üŝŭ˙ ò˙˙é˙˙˙ú3˘˙ġ˙úÖ ˙˙˙ġÜ ó˙ô˙û¨#Öè˙ġ˙ô˙˙˙˙ (Ĥ˙˙óŝ˙.ġ˙ì˙Í˙ê µ†"£˙˙˙úüûÏ"Ĥ͈˙óĝŭó˙Úô˙ï˙÷÷˙ġ˙˙˙˙˙˙˙˙˙ŝ˜!˙ĝġ˙˙ê˙$$–˙˙˙ëüúžó˙É)ˆŭ˙˙èûí˙÷˙˙öñ˙÷˙˙˙˙ë§!Öô˙˙îŭ,éĝ˙˙ŭ˙•—'&²ĝú˙ò˙Ş Îŭĝû˙Ż$ú˙˙÷˙˙˙ŭ  ˙ò˙˙ġĝ˙˙úġ˙ŭ˙ü˙üùŝ˙û ! á˙˙ŭü˙Ç˙˙ŭ$˙ûûŭ˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙ò˙ž& Î˙û˙üŝ˙)ñè˙Ò)$˙˙ù˙úŝ˙Ê!+ûò˙˨$ñö˙÷ö% ˙ġ˙˙ŝĝ#˙!šù˙ŭó˙ڟ+É˙˙˙˙öêİ!ñ˙˙˙ûŝö˙˙Ê!%‘˙úô˙÷! §ŭ˙˙  ğ§û˙˙÷%˙˙˙ù 'ĈĝŬûĞİÍÑ˙„ĉû˙˙ŝ˙˙˙û !ñ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙üĝù˙˙˙½.'˙˙˙ŝĊ#(˙˙ì˙üâÚùŭŝŭú˙˙ú˙üô˙˙˙Ħ ˙û˙ŝÛ/›˙ë˙˙ö&Ïà˙Ï ħíĝ˙˙˙ùÖùĝ˙˙Ì'úç˙òğ*ŭö˙ĝİ ó˙˙*# œ˙ù˙˙ò'²˙˙Ĝ&Ï˙ú˙˙˙˙˙˙˙¨ Ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙÷Ĵ íê˙ú˙û˙ Ñ˙î˙ö˙ž˙˙ö˙úš.íè˙˙˙ö˙éù˙˙ü˙˙˙˙˙˙˙˙ŝ˙–#§˙ü÷Җ ßñŝĝ˙˙˙˙˙üìßÙ˙ïú÷˙ġúùĝŭ˙ó°'­˙ö˙ûĦĝŭ˙ò˙İ˙˙ĝ˙˙˙˙ç˙˙˙ïŬ­ $ °˙üŭ˙ŭĈÜË˙˙à˙˙˙˙˙˙˙˙˙ŝŝ˙Á#é˜ )˙û˙˙‘—˙˙üû˙˙ù˙˙˙˙û˙ŭû˙˙˙ùŭ˙˙ĝüû) ˘÷˙˙òÙ ³ü÷ü˙Ċ$Í˙˙˙˙òİĤà$­û˙ü˙ù˙ġŝĝ$ Ñ˙˙ûóÚ £˙ù˙üùœ/ÙÙÎ&›Ó˙˙˙˙&Ù˙˙˙˙û˙˜%)Ä˙˙ö˙˙˙˙˙˙˙˙˙üĜĤ 'ù˙˙ìô˙÷ ì˙î˙˙˙!˙úɧ (&Ħû˙˙˙˙³Ĝġĝ˙ù˙˙˙ì˙˙ŭìœ ×ŭö˙˙ŭ%˙ĝĝ­˙˙„”ú˙ö˙˙›!˙˙˙ŭû– ˙ġŝÍ˙%(û˙!!ê˙ĝö˙ĠĤ˙˙˙ñùġ˙˙˙˙˙í,ŭù˙˙˙ñ)˙˙˙ú ŝ˙ŝö˙˙˙ù˙˙˙˙˙˙˙˙˙ôù˙˙“ '-ê˙ĝŝ!ü˙˙÷Ĵ(úó÷ŭ˙ùûé(ŞúÚĤŻŭ˙ô˜Ŭİì˙ŭ˙•& £Ŝ˙˙˙˙ö˙™Ö¤ż¨É˙ùüġÄċĜ²˙ùŭŭú˙ö˙Ŝ& +˙˙ŭ÷˙ïèמ(˙ó˙ñŞ+•˙ó˙£-È˙Ëž˙çŝ˙×â˙˙ó& ´á÷˙˙˙˙˙˙˙˙˙˙ó˙˙˙ŝùòÏ˙ ŝ˙˙Ĥ˙ĝ˙ŝŝĈ˘˙ñ˙˙ê˙ü˙˙˙˙è˙˙Á§§ŭóù˙˘û˙˙÷˙˙"Ĵ˙˙Ċ"Ô˙úŭü˙ŠÒ˙ŝĝĠÂ˙˙ŝ˙$ï˙˙˙Á"%š˙˙˙Ü "œ˙üú˙û­ÏŝÜ÷Ì* Êü˙˙˙üü˙˙*˙êĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙˙ ˙öŭ˙üÒ Ëùċô˙ĝ!ž˙˙ŝŝ ŝ˙˙òġĉ …˙ŝġ˙÷˙˙˙˙˙˙˙˙˙˙Ĝ!ĵŝ˙˙ùû²Ì˙˙˙ġôŝüê˙˙ùŒ˙ŭ˙˙ûÏ˙аŸ˙÷ô Ħò˙˙˙$û˙ŭġ˙Ħúü˙úô˙İĤ˙ŝ÷û˙˙ċ˙˙ġÒ'˙úö˙Í!Ċŝ˙˙˙˙˙˙˙˙˙˙Îŭž1 °˙à+Żú˙üğ ½ïöĝ÷ŭ˙˙˙˙ú˙óû˙ŝüĝ+Ğ÷˙˙÷˙ŝ˙(Ö˙üúûŬü˙Í$×ôô˙˜Ħ˙á!*˙öŭ˙ù˙ŝ˙˙(›˙ġ˙˙›"ë˙ú˙Û–˙ŭ—§ì˙˙˙ĝ˙ġ£. Ó˙˙ï˙Ó!Û˙˙˙˙˙˙˙˙˙˙˙˙òġ #›÷˙˙ŭû˙›(ħ˙ô˙é˙*û˙§ !Ë˙ùġ§(âì˙˙˙ĝ˙˙ŭŭ˙¸"˘˙˙úŭ Ÿ˙ŭΤü˙áÎ˙ġŝĝ˙ 'Äöŭ˙úŜ*÷÷˙ù(0ĝ˙ĝ— ˙ŭ˙Â#üô˙˙ĝ˙˙üŭ˙˙˙ž"/ŠçïíÏ­ ‘˙ô̞$ ÷˙˙ĝûüü˙˙˙˙˙˙˙˙˙˙˙÷˙˙‘Ğ›£Ż%"ŭô˙ Ĵŭ˙˙ùüĝ˙˙0›öħ  !"–˙ù˙"0˙í˙!œ˙˙úĝòùü˙ù˙˙ú˙ù˙˙ñ˙ôô˙˙ÌĦú˙ô˙˙ĝ²’  ›ù˙˙ê!‹# ) -öŭ˙Ô˙˙öË)¤ù˙˙Ÿ&%˙è"иšÎü˙˜  (˙˙˙˙˙˙˙˙˙˙˙˙üó˙ú˙˙ùž ˙˙ŭœ1˙˙÷ûŭ,Ÿç˙ú˙˙˙ö˙˙ü˙˙˙˙›˙˙öŭĥżû˙ĈÖ& ô˙ß ÈŭĈŝŝš§˙Ë˙Ċ"*òûŝ˰ Ä˙˙ġüÛÚŭġó˙ŸÚ˙ŭĞÄ˙ùÇ")!Ĥŝŭŭ˙˙ŭüŭ˙ $˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙ŭ–&²Ï˙üŭ˘ĥ˙ñ˙ġ˙—Ĥ˙ŝ˙˙¤ŭ˙úŝ˙˙˙ù˙˙˙˙˙˙˙˙˙˙ŭ˙Çĵ˙÷ŝ˙ùË2 Î˙ï˙˙˙Ôħûĝ˙š!­Ì˙îĝ˙“ Ö˙˙˙ #ñ˙ĝ˙û˙#Ĉŝĝ˙ê ¨˙îŭ˙˙˙ -Ĉŭŝ˙Ó ˜˙˙ôÒ%"˙˙˙ò#)ö˙ù˙˙˙˙˙˙˙˙˙Ó%üŝàĦ˙˙úž•ĝ˙˙˙ü˙˙üġ˙˙˙˙ùû˙ߤÁ˙÷˙˙˙ј˙Ĉí˙Ì1üĝ˙˙˜¤˙˙˙Ħ %&“û˙˙˙ŝŝĝÓž˙ŭ'˙ĝŭ˙ 5"˜˙ç˙˙ï˙)ĝ˙˙ĝ˙˙½%"˘ïŭ˙˙˙˙˙˙˙˙˙ŭ÷" ŞŬË˙ĝ˙Ĉ œ˙˙í(#˜˙ù–.Ħ(Ġ˙ï÷˙˙˙˙öŭ˙Ħ-˙ùù­,›ù˙Ô"%žĈŸ!ĵ˙˙˙Ÿ& ˙˙˙ ž˙ĈÙĤ ' #˙˙ŝ-$ "˙ù˙˙÷˙˙ûŝŭŝ˙ '– ĉç˙÷˙¨ô˙ĝö˙˙ü˙˙˙˙˙˙˙˙öġŝĝ˙˙ !#!Ž˙˙ŝ¤!#î˙ġ˙ĝ˙˙ŭġ ™-'úü˙! %żü˙Í ˙í˙˙˙÷˙ûò˙˙˙˙ġï˙˙ç˙˙ġò£!#ßù˙˙Ï-#˙ô÷˙* Ĥ™$$–˙˙˙.˜˙ñ˙Ğ •˙ż"ž˙˙' +Î˙ËÉİ& -˙ùĝ˙˙˙˙˙˙˙˙˙ú˙ü˙˙˙ı ˙ÎĞ İ˙öŻ ˙ûŭ˙ü˙ú˙˙˙òġÂ"ñ˙‘% Ÿ˙˙˙¤Ó˙ûĦ$(¤Ö! ò˙¤$%˘˙˙,˙ì˙İ É˙˙ù˙œ ,ŸÍ˙˙˙¤" ˙ûû˙˙˙˙ŝô™ Úòñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ìüŜ Ÿ˙ô˙£&‚˙ŝŝ˙²Ħ˙ġ˙ŭ˙,ó˙úŭ˙Ċ#Ĝĵú˙ü˙˙˙˙˙˙˙˙˙ù˙›"™ĝ˙˙˙˙ŭ—%ñ˙˙÷üÖ÷› "ğú˙˙˙™'4 Îù˙Ğ §˙ŭŭóÔ˙ö˙÷˙ ›˙˙˙ŭġ$úû˙Ç&Éó˙ݍòô˙˙ #Ë˙ŝ˙˙˙˙˙˙˙˙ö˜&- Ñ˙#,˙ù˙% ÔÉü˙ĝ˙ŝĝ˙û˙˙öú˙è2  ˙šĞù˙ú4%ĥ˙˙˙” Şŝ˙%Ġ˙ìĴ"Ĵ˙˙ĝö˙ù˙˙˙ĝĤ!˙üÚñ˙ï $ Ħ˙òù˙ĝ˙##˙˙˙óö˙÷Ê&Ó˙ĝ˙˙˙˙˙˙˙˙ú˙˙Ÿ  Ĵò˙Ħ)ÊÓ Ôüĉ1  Úĝû˙˙ŝŭġ˙ŝ˙Ĉ&&ú˙#!˙˙˙ & (+&ŭû .ŞûÓ"ŝ˙ïşû˙ "$ë˙öô˙ŭ˙˙˙˙ûŭ˙˙'&+ &ñö˙¤1 ") ¤î˙û˙˙ûù˙˙˙˙˙˙˙˙˙˙˙ú˙ŭóÛ+$­“Óü˙˙ù%ÉŜó˙˙ġüùú˙, œÌ (¤ñ˙ŝŭ ¨ĝ˙˙Ê $­Ò˙½˙ú˙˙˙öŭ˙ù˙÷ò˙˙ì˙ŝ› #4 Çûŭ÷ŜˆÔšħ–Ĵ­–ú˙ó˙ŝŸ£Ħ˙ùŸ' ˙òüŭÊ!‡˙˙öú–%¨ùü˙Ñ ‹û˙˙! ˙ùûû˙Ï !$ï˙˙ô˙˙˙˙˙˙˙˙û˙üĝ˙˙Ñ+œĠ÷$ĞñôÔ  ˙˙úú˙˙ĝ˙ñġ˙ù &,ßġ- %$˙ĝ %"­îÎŝ Ê˙ù3˙ŭ(˘˙û% +ùñ˙ŭġ²'" Ëá˙ñ÷ö") Ÿ˙üû˙˙˙˙˙˙˙ áŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙貞¤ ˙ôÙúŸ (Ñ˙÷ĝ˙“% ˙û˙Ş ­ï˙ù˙Ìš§˙ô˙ú˙˙˙˙˙˙˙˙ŭ¤ Ġŝüüû˙Í §Ĥ.÷úĴ#Ö÷Éİ&˙Ç!üû˙  %Ċö˙˙Ÿ—ü˙òÚ˙û˙£˙ùšÀ˙˙é˙ž Öö˙˙˙˙˙˙˙˙˙˙˙* & $ó˙ĝĤ!%Ä˙ġŭ˙ûú˙ĝü˙˙î˙í›˙ü ²û˙› §˙“˙˙Íüüö˙˙˙öŭ˙öÓü¤!ĦŭÎ#˘ïÛ# ö˙û˙ŭ˙ŭ.üúú˙˙ĝ˙˙˜˙˙˙˙˙˙˙˙˙˙˙˙ġÜ£Ĵ ŻÁ˙쨠˜"ĈÎ#!ĦÒû÷ŸĤÒú˙ú˙˙˙˙ŭÒġµ Ħ˙ó££˘÷˙îĤݤ Ĥ˙ö˙ÖŸ­ Ġûú  İĞ˙ô˙œœħ”çùüŭ˙!›Óö˙ŝ˙˙ŝŝ˙ŭüŝŝú˙ŝ˙Ê&  +’˙˙˙˙÷žž˜%››Şŝ˙ŭġ˙˙ô˙˙˙˙˙˙˙˙˙üöù˙˙ì˙î˙ÊĤ£ÊÚ™˙ôßú˙˙÷ŝ÷˙˙ó˙ó˙˙ûû˙˙ĝ˙˙÷Ġ–Ó˙˙ü˙˙Á˙ü˙ŝŭ˙˙ġ˙˙ûü˙Ó"£¨ù˙ĝ˙û˙ŭ˙ĝ˙ú˙ü˙ü˙˙˙ÚüÌ˙ŭŝÍüö˙û˙˙˙˙ú˙˙ù˙ó˙ü˙û˙˙ü˙ûù˙˙ŭ˙ÖÀ°˙öĝ˙ü˙˙úÏ˙ŝôŭ˙˙óùĠû˙ûŝ˜˙ŝ˙÷˙ŭ˙¤üÒ÷˙ŭ˙ú͞ŝùù˙˙˙˙˙˙˙˙˙˙ŝù˙úġ˙ʛ˘˙Ħ˙ŭ˙ġŭ˙üöü˙˙ŭ˙˙ËÈĞĈ˙˙ĝ˙ĝ˙î˙ù˙˙ġŭû“§¨ö˙ɤšú˙Ħ™ĤÎ˙˙üɢ!™Ĝ˙ŝüž!Ûùŭ™ §˘˙ûÒĝš(œœ˙˙˙˙ġ˙ġ£˘ö˙˙ï˙˙˙˙ù΢ĝŝ˙ö˙ŝŭ˙ŭùû˙ú£ġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙˘ # #˙˙ö"Ÿ˙˙óÑ!˙÷× "ü˙˙˙ú˙˙˙˙˙˙˙˙˙˙ -¤˙É˙˙ûŭ7 $ ˙ê˙˙ŭ)1˙ì*'% $!˙â˙ù˙ " (ŭ˙Ë,ë˙˙ ˤĦùö˙˙ñÏ   Ĵû˙˙˙˙˙˙˙˙˙˙ġ $%Á˙˙˙Ż)%*˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙Ĥ &Ë˙Ô +“ŝü!Ö˙öܕšĠŭ˙öÊ,Ìĵ˙˙îŝ˙˙˙˙˙˙˙˙ÖÁĞŞÀßö˙Ê&–ŜĊ˙˙˙ŭ##œÑĜü˙üŭô˙˙úÊ˙ö˙ŭ˙˙˙ġĠÉ"*‹ċü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙ìâ÷˙óÛÑÑÌÌÛò˙˙üŝġâËÑÔÑÜñ˙˙ŭü˙˙˙˙˙˙ôàÑÌÜñ˙˙ŭü˙˙ÌÑàô˙˙˙˙˙Üüĝ˙˙ÑÚëŝ˙ŭùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òÚÌÈÏâô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝÙÊŬúÜñ˙˙ŭü˙˙Ĝì˙˙üöû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙÷˙öŸ "§Î˙˙ŭ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ô˙£ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ôúŬÊÙĝ˙˙úû˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ôàÑÌÍßġ˙˙˙˙˙ñŜËÊÜò˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙û˙˙ŭ˙òÙġ³˜Í˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ôùú  !˙ôÛ#˙ü# ˙˙ % $5½úùה¤Ş£Ÿ˙˙û˙˙˙˙˙˙˙˙˙óċ ­œ–Ÿ˙üö˙ŭĝ¨™ 0Šŝ˙˙˙ ‰' 6‰‹ùô›$,‹°(żò˙ěŸ$•›˙˙ŞĴĥ˙÷Ĝ  ¨¨İ ˙úë˙ÁĤ›ĤĦü˙˙˙ü˙˙ü˙˙˘+$Ħ˙ñ˙˙˙˙˙˙˙˙ú˙êü˙ĝ÷ŝ˙˙ü˙ë˙˙ëŭ˙ôöÜ˙Îİö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙˙ñ˙ġû˙÷ùŭô÷˙˙îîŭ˙˙˙ùü˙˙÷˙÷ŭ˙úù˙ö˙üŭ˙ĉ˙˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙ŝú÷ù˙˙˙ŝ˙á˙˙÷˙ú˙ú˙!É˙÷û˙úñ˙˙ŭ˙úû˙Üó˙˙÷ü˙˙ŝĜ˙ ¨ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭùêéû˙˙ĝ÷˙˙ŭ˙˙˙˙˙í÷û˙˙˙ûòŭ˙˙˙˙˙ŭŭûŝ˙˙ü÷ĝòŭ˙˙˙˙˙ŭĝ÷ü˙˙ŝûŭ˙êú˙ü˙˙ôëóü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüĝöü˙òŭ˙˙˙˙˙ŭ˙óéñ˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ç˙­˙êĝĦ£ó˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭò˙˙ê !*Ġ˙ŭŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙üöĝüŭŝ˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ü÷ĝöŭ˙˙ŝûŝ˙˙˙ŭü˙˙˙˙ñïôü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ùŝü˙˙ó˙ô˙$Ĵĝ˙ôŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙úó˙˙Íš'Ÿ×ûÎîú˙÷˙Ĵû˙ö˙ġ˙Â*¨Ü˙ôûï˙˙ÌËÖï˙˙ü˙˙˙ùġü˙ùŝ˙ŭ˙˙˙˙˙˙˙˙ŭ˙˙üü˙˙˙ú˙ó˙˙ġ˙˙˙ŭ˙ËÈûì˙ġ˙˙ĝ˙˙üĊÙö˙˙÷û˙˙öìùî˙ü˙ŭ˙˙˙˙˙ö˙Îĵ˙û˙˙ó˙˙à˙˙˙˙ùĝŝú˙û˙ê˙û˙˙úö˙ŝä˙˙ëî˙˙ĝġüŬ Ûĝ˙˙˙˙˙˙˙˙˙ñġ˙ö˙˙˙˙˙îô˙˙˙˙˙˙ŝ˙ö˙úú˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙ĝ˙˙ĝ˙ŭä˙˙˙ŝ˙˙ŭĝĝġ˙ô˙˙ó˙ŝĝü˙˙ĝô˙˙˙ŝûŝĝ˙ŭíŝ˙ùŝúôúġ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüġ˙˙û˙˙˙˙˙ó˙Ì·˙ô˙˙˙˙ù˙˙ò˙ö˙ĝ˙×üüŝ˙˙ù˙˙ߟ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûùû˙˙˙˙˙˙˙˙˙üúûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙ŝüŝ˙û˙˙üû˙˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûúü˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝġöŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Íùĝ˙˙˙îŭ˙ü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ǟ&! Ï˙ñŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙úŭ˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙ŝûü˙˙úŝ˙˙˙ŭúùúùû˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙ï˙˙û˙ŝ˙Î#ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙ĝë˙ġ˙ù÷ñ˙úì˙˙˙ô˙˙÷ŝ˙ŭ˙ó˙ŝ˙ìú˙í˙˙˙˙ü˙ŝġĝ˙˙˙˙úëĝ˙ñ˙˙÷˙˙˙˙˙˙˙˙˙î˙˙˙˙˙ùûŭ˙˙ŝ˙úüìû˙ŭ˙˙Ó˙ŝŝ˙˙ù˙˙˙ĝŝô˙÷˙ü˙üú˙ĝ˙ġ˙ŭŭûü˙ù˙ġ˙˙ü˙˙˙ĝúŝà˙ó˙ġ˙˙ŝŝ˙ôúíû˙˙ô˙˙íú˙ú˙˙˙˙÷˙ŝ֏™˙ò˙˙˙˙˙˙˙˙˙˙ò˙ñ˙˙ûġ˙ú˙˙ŭòŭó˙ùô˙˙ġĝ˙öö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙ùóŝ˙ü˙˙ġŭ˙ŝĝû˙˙˙ùùûĝôù˙˙˙ûùŝ˙˙˙ġû˙ü˙ŭ˙˙ù˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭŭûùû˙˙ûüġ˙úĝ˙öŭ˙é˙˙˙ï˙ŭï˙ùŝŝúü˙ĝü’î˙ŭŭ˙˙ġ˙˙·!ŝô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙ûûŭŝĝûŝŝüü˙˙˙˙ŭĝġù˙˙˙˙üü˙˙˙ü˙˙ŝŝŭüüŭ˙˙üü˙˙˙üŭüüŭŝŝ˙˙˙˙üû˙ŝü˙˙˙ŭŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûúû˙˙üü˙˙˙üù˙˙˙ü÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙'ŝ˙ò÷Í˙¨˙ċ˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝî˙ŝÒûú˙ôĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙ûúûŝ˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙ŝŝŭüüŭüüüŝ˙˙˙˙öû˙˙ŭüŝ˙˙˙˙˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ŭ˙ôĝŭ˙ĉԖ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭù˙˙Úò˙˙˙ïü˙˙˙è˙òù˙û˙ŭ˙˙ï˙˙˙ŝ˙ö˙˙ïĝ˙ŝ˙˙˙˙ô÷ò˙òú˙˙˙˙ó˙˙˙˙˙˙˙˙ú˙ôòŭï˙˙˙ġ˙ĝŭ˙öŝ˙úúùġüù˙ŝ˙üŭ˙öò˙˙˙˙˙˙ôò˙ŝ˙ü˙˙˙ü˙ŝ˙÷˙÷ü˙ú˙˙˙˙˙˙ŭöô˙ŭ˙˙˙ù÷ŭ˙ĝ˙ĝô˙˙ġïŝú˙˙˙óŭ˙˙ûŭ¤("˙û˙÷˙˙˙˙˙˙˙˙ŭĝ˙˙˙û˙˙ö÷˙ü˙ŭ˙úŝŝ˙ŝ˙˙˙ô˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙ŭ˙˙üö˙ï˙˙˙ŭŝ˙˙÷˙ú˙˙˙˙ù˙ùĝô÷˙˙ùö˙˙˙ö˙ĝŭ˙˙˙˙ùùġĝù˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ŭ˙ó˙˙û˙˙ùŭüġ˙ùû˙˙˙˙˙˙ñ˙˙˙ô˙˙¨¨˙ñ˙ŭŝ˙˙ùĤ É˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝü˙˙ŝüŝ˙û˙˙˙˙˙˙˙˙ŭüŭ˙˙˙˙˙ŭüŭ˙˙ŭŭŝŭŝ˙˙˙˙˙ŝŭüŭ˙˙ŭŭŝŝ˙˙˙˙˙ŝŭ˙˙üù˙˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙üü˙˙ŭüŭ˙˙ŭŭŝŭ˙˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝù#%Üô˙˙ú˙–˙˙ĝüö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éË"#—˙ġ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙üü˙˙˙û˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙ŝ˙˙˙˙˙˙ŝû˙˙˙ŝŝ˙˙˙üŭŝŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙ôġ˙˙ü˙ ˙ù˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġù˙˙ĝû˙˙˙˙ó˙ù˙ûü˙˙ö˙˙ó˙˙ü÷˙˙ú÷˙ë˙˙˙ú˙˙ĝġ˙ü÷ġü˙˙˙ŝ˙ú˙ü˙û˙˙˙˙˙˙˙˙ŭ÷˙˙˙˙üóŭ˙˙ŝ˙ù˙˙˙˙ŭ˙˙˙ŭ˙ú˙ŝ˙˙˙˙˙ŝúġĝ˙˙˙òú˙˙úôŭ˙ó˙ö˙û˙˙ú˙ö˙ġĝñŭ˙˙˙˙˙˙˙ûŝ˙˙˙ü˙˙û˙ó˙˙˙˙ŭó˙˙üùîíó˘š˙ëŭ˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙òî˙ŝ˙ŭ˙ö˙ġ˙˙ü˙˙óó˙˙˙óġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙ĝ˙ü÷ú˙˙˙ŝŝùó÷˙˙ŝ˙üôû˙û˙˙˙˙˙ûö÷ô˙ŝü˙ġ˙÷˙˙ùò˙˙˙˙ùû˙˙˙˙˙˙˙˙ŭüüŝ˙˙ü÷ġù˙÷ú˙ù˙˙˙˙ü˙˙˙î˙˙ç˙˙˙ŭŝ§ ½˙˙ü˙ŝ˙˙ġĤÊÖŝ˙˙óö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙üŝŝŝ˙˙˙û˙üúûŭŝüù˙˙˙˙˙˙úöŝ˙˙˙˙ûû˙û˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙ûù˙˙˙˙˙ü˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ûŭüüŝŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ŭŝ˙˙˙˙ûû˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙Ï( ˘•§’# áîĝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙Ù! ñ˙˙ú˙ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭŭ˙˙˙ûŭ˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙ŝüúûŝ˙üùúüŭûü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙è˙üÖ Ä˙ŭ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙úö˙˙òñ˙ô˙ŭ˙é˙ŭù˙˙òġ˙ĝùú˙ú˙˙˙˙˙˙ŝê˙ô˙ú˙˙˙ûŭ˙üòĝĝ˙û˙ù˙˙˙˙˙˙˙˙˙˙ô˙ġ˙˙éú˙ĝ˙˙˙˙ó˙ĝ˙˙èö˙ùĉ˙˙˙ö˙öïö˙˙˙˙˙˙˙ŭ÷˙˙˙˙˙˙˙ĝ˙˙˙üôìŭŭ˙î˙˙˙˙˙ŝ˙ŭöù˙ĝŝ˙˙ŝġĝü˙˙ŝ˙˙ü÷é˙˙û˙˙˙ûòġĜ ·ŭŝ˙ú˙üŭ˙˙˙˙˙˙˙˙ùŝŝ˙˙˙˙÷úû˙˙˙ŝúûŝ˙˙˙˙ûú˙˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙ŭ˙ŭġ˙˙ùŭö˙˙˙˙˙ŭûò˙˙ûŭ˙˙ó˙óŭĝŝ˙ûŝüü˙˙˙ö˙˙˙ú˙ôüŭ˙˙˙˙˙˙˙˙˙˙˙˙ûúü˙˙˙ú˙˙ö˙˙ï˙ü÷˙üŝŭ˙ñ˙˙üŭ˙˙—",ç˙˙˙˙÷ö÷˙˙ô˙ì˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙ŭ˙˙˙ŭü˙˙ŝ˙˙˙˙˙ŭ÷ġùüŭ˙˙˙˙˙˙˙ûü˙ŝ˙˙ŭŭ˙˙û˙˙˙˙˙ûü˙û˙˙ŭŭ˙˙ŝù˙˙˙ûŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙÷˙˙˙˙˙ûü˙˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙úùŬ“!'–Á˙ò˙û˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝñġàô˙˙ôŝ˙ô˙ñŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙÷˙˙ŝû˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙ŝ˙˙ŭŭ˙˙ûûûûûŭ˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙ò˙˙ûË$ Í˙˙÷óû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙˙ŭú˙˙ô˙úŝ˙˙ü˙ŝ˙ï˙˙í˙˙˙ñ˙˙˙î˙ûñ˙˙ĝĝ˙˙˙ö˙˙˙˙ù˙˙ü˙˙ĝŝ˙ŭ˙˙˙˙˙˙˙˙˙ö˙˙ô˙˙ó˙ö˙ñ˙˙˙˙ŝ÷˙˙ò˙˙˙ĝ˙ġ˙ü˙˙öŭŭŭ˙˙ŝ˙˙ùŭŝ˙üŝŭ˙˙ŭ˙˙˙˙˙ŝ˙˙˙ŝò˙öü˙˙ü˙ú˙üü˙ŝ˙üĝ˙˙ù˙˙ù˙˙úŭúù˙˙˙˙˙ùô˙ŭù˙úŝ˙˙˙˙˙˙˙˙˙˙ŭ˙ò˙÷ü˙ŭ˙˙òú˙˙ŭŭ˙û˙ü˙ü˙˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙˙ĝ˙˙ùŭú˙˙ŝúùûŝ˙˙˙ù˙ŭûŝ÷˙˙ö˙˙ù˙ü˙˙ĝú˙˙˙˙ĝ˙˙ú˙˙˙˙ù˙˙˙˙˙˙˙˙ŭ˙˙˙˙ŭŭŝ˙ùñ˙˙ŝ˙˙˙˙ö˙ŭ˙˙÷˙ġ˙˙üŭ˙ Ò˙ġ˙û˙ŭ˙˙ġ˙˙û˙˙˙˙˙÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙üú˙˙üŝ˙ŝ˙˙˙ŭüŭŝ˙˙˙˙˙ûû˙˙ûùŭ˙ŭŝ˙ŝ˙˙ûü˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙üû˙˙ŝ˙ŝüûü˙˙ú˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙ŭ˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ö˙˙ó˙Í˙Ž# £˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙˙ù˙ú˙ĝ˙ŭ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙ŭ˙˙˙ôŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙ŝ˙˙ûü˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙ŝûúüŝü˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙üŭú÷˙ŭ˙˙ñ˙˙ú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜÑÌÌÛò˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙òÛËËÛò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙üúûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙ûŭ˙˙˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ĝûŝŝüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙ŝüúúüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭüü˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙üúûŭŝüù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙úûŭ˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ŝ˙˙˙ŭüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙ûŭŝŝ˙˙ŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝŝ˙ù˙û˙û˙ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙÷˙˙üû˙ŝüŝ˙÷ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ûŭ˙˙˙ö˙˙ö˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ĝüú÷ŭ˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ˙ù˙ú˙ü˙òú˙ù˙˙˙ô˙ûŝŭŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙ŭ˙üû˙˙ġ˙˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ŝú˙÷ŭ˙í˙˙ŝ÷˙˙˙˙˙˙˙˙˙ĝ˙üü˙˙ùŭ˙˙ó˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ŝü˙ú˙˙˙ü˙û˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŝù˙˙ŭ˙˙˙ùô˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ùú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭó˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ûû˙ö˙ù˙˙÷˙˙öĝ˙˙ŝ˙˙˙˙ŝ˙ü˙ü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙û˙˙ġûô˙˙ôü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝú˙˙˙˙˙ŭ˙ŭ˙˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öû˙˙ù˙ô˙˙ŭô˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷úŝú˙˙˙˙ò˙úüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝ˙˙˙˙˙˙˙ĝġ˙˙î˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝüŭ˙˙úéŭöû˙˙˙˙˙ú÷˙û÷˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝï˙ó˙ô˙˙˙ô˙˙ŝŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ò˙˙ß˙û˙ö˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙ó˙éû˙˙˙ĝ˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙÷ġ˙ġïö˙ö˙üî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ü˙˙èü˙û˙˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġġ˙Ç˙ħÁû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óó˙˙˙ñ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙ú˙ôü˙˙û˙˙˙ŝûúûüËü˙öù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ġ˙˙ŭ˙ù˙˙ì÷˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝùùüüùü˙òŭ˙ú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ùüŭóû˙û˙˙ŝü˙ŭñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü˙˙˙ŝ˙ŭùú˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùüûúú˙ĝ˙ñî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú÷ú˙˙˙˙Öŭü˙ĝú˙˙ĝ˙˙ĝŭ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝü˙˙ĝŭŭúè˙ù˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭú˙ñ˙˙ġ˙˙ŭ˙ï˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ü˙ûĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙÷˙˙š£ß˙˙˙ĝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙Úèŭ˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙,˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙òüúó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òü˙ùô˙ŝ˙úġ˙ù÷˙˙ŝŭ˙˙üû˙˙˙˙À§Ħ˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûôé˙Ġ  ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ù˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙óû˙˙ĝ˙ŝúüúĝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙ùúû˙ùòÑ˙ġ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭúŝ˙˙ŭú˙ùò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ûŭ˙˙ŝ÷˙ñ˙ŝù˙˙îŝñ˙êĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙î¨$=’÷˙ŭ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óÔٓ !'˙˙ġô˙˙˙˙˙˙˙˙˙˙ĝöü÷ö˙‘˙ġû˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙à˙ŭÍŽġù˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ùó§0öŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÓ $!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝöÇÖ˙˘&Ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙żÌé˙˙üĝùú˙˙û˙˙˙ġ’($ùĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ü˙˙ô 5Ċ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙˙öġ˙˙úĝû˙ûġñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ÷˙˙êû˙˙û˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙˙˙üÄĴ¨”˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝü˙˙ûŝ˙ö˙ü˙Ġ˘°˘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úö˙˙ó˙˙͔Üùû˙˙˙× Ú˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙÷˙"ŝ˙ŭŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ö" # ˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙( ˘˙˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙£" ˙˙ùü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôĝ!£ôúŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ! Ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öż ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙&)äŝ˙˙˙ŝ˙˙û˙˙×˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷˙üî˙˙"ŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ô÷˙˙ùÌŞĤ˘À˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ó˙˙úċÖ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙ŝ˙ö! Öê˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙üĜž$ Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝ˙˙˙ž˙˙óú–,& ÷˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙öó°0˙˙˙ôŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ç $ú˙îû˙˙˙˙˙˙˙˙˙˙ĝ˙ë˙ 1'ëü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ġ%Î˙ö˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭîö˙˘Ĥù˙˙ġô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĊ) —˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ 2Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü÷ù÷ù/˙˙ûŝú˙˙ŝŝ˙˙ñÛ0"#ĵú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïù˙ùüè ! ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ġù˙ċ³$ )ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ü!/ò˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ïìĵġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭ˙˙ò¤&!%"ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŭû˙% 'Ä˙˙˙! /œŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĝ+ŝ˙˙˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û Ĝĝ˙ )˙˙ü˙ĝ˙˙˙˙˙˙˙˙ġò˙ŝö"˙˙ĝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ë)˙í˙ġó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ò˙İ&żéùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ï&'™˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Û& ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙û˙Ž/ ˙˙ġŭü˙ŭŭ˙˙˙˙ùÈ +ĝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ô˙˘ó˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñö˙ü7$˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙öġ# Ğ÷ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙û˙é!˙˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ĝ ˙ĤŸ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïŭ˙ġù˙”#ù˙˙ĝĞ™ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ù˙›& 0˙÷ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š6 ˙ü˙"Ïġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭѤ ²˙ñĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ó˙˙˙˙˙ò˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭŝü ġ˙˙û˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ğ ¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ *›˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙÷˙û˙  Ĝó˙˙÷˙˙ŝ˙ŝü˙˙ŝü˙ġ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙÷ó˙ûí˙ö˙ġŝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùú˙ò˙˙úġ˙˙ô˙ŭ˙˙ŭ˙ùúĞ" ˙Ċ¨$ñ˙˙˙˙˙ú˙˙÷ö˙ûûŭŭ˙˙ĝüġ˙˙ŝô˙˙ñ˙ŭó˙˙˙ĝŝ˙òü˙ü˙˙˙ö˙˙˙ù˙ġù˙ġ˙˙ŭ˙ó˙˙˙˙˙˙˙˙ŝ˙ô˙˙˙÷ŝ˙ö˙˙üû˙˙ù˙Á ›ÑÔĊÖÇÉ˙ì˙˙˙˙˙˙˙˙˙ûü˙˙ü˙÷˙ú˙é˙˙î˙Ħü˙ĝ˙˙˙˙÷˙˙úúüŝ˙ù˙˙˙ġ˙˙ŭ˙ù˙˙ö˙úŭ˙ùù˙ŝ˙˙˙˙˙˙˙˙ö˙ú˙˙üû˙ùŭ˙ĝ˙ŭüŝŝ˙ö˙ŭ˙ŝ˙˙˙ŭ˙üó˙ĝġú˙˙˙ô˙ġ˙ú˙úŝ˙˙˙˙úûĜĦ˙ŝ˙úġÚĴó˙ŝùù˙ü˙ĝ˙û˙ûŭ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙ĝ˙˙˙˙ï˙˙óùŭ˙÷˙˙˙ùû˙ú˙ù˙˙˙Ħ!ùŭü˙ù˙˙ùŝ˙˙ŝ˙÷û˙˙˙˙ŭ˙ŭŭŭ˙ŝ˙úü˙˙˙˙˙˙˙˙˙ù˙üŝö˙ü˙˙ŝù˙ĝ˙˙˙˙˙ôŭ˙ü˙˙˙ŝñú˙ï˙ñ˙ú˙˙ŭ˙ü˙ü˙˙ûü˙˙ó˙ŝŭ˙ö÷˙˙ü÷ŭ˙˙û˙˘ô˙ö£œ˙ê˙üġ˙ŭû˙˙ù˙˙˙˙ûġ˙ÓÎÊ˙ŝ˙ñ˙ŝ˙˙˙ú˙˙ö˙ùġ˙ŭ˙˙û˙ù˙˙˙˙˙˙˙˙˙ŝ˙˙é˙ŭ˙˙˙÷ù˙û˙˙ó˙ġŝ˙ò˙ü˙˙÷˙˙öĝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙– ˙˙üï˙˙˙–˙ôù˙˙˙˙ŭ˙ô˙ú˙˙˙ö˙˙˙ì˙˙ó˙ŭ˙ûġ˙ŭĜĊú˙ù˙˙ŭ˙˙˙˙˙˙˙˙˙ġû˘ú˙˙ŭ˙˙ġŭñ˙öŝ˙˙˙ùŝ˙˙˙˙ŝ˙ûó˙˙ĝ˙Ħù˙ò˙ġú˙˙û¨ö÷˙ç˙ù˙˙¨Ë˙ġ˙˙ŭ÷˙úù˙ô˙ú˙ö˙ü˙˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭŭ˙ŝŭù˙÷˙ùĝ˙ŝ˙˙˙ŭ˙óÔû÷˙û˙˙ö÷˙˙ŝ˙ġŝ˙˙˙˙ŭ˙ùö˙Ô ˙û˙ŝ˙˙ŭ˙˙ò˙˙˙˙ñ˙˙ĝŭü˙˙ü÷˙ŭ˙ú˙˙üû˙˙ú˙˙üü˙ŝŝ˙˙ĝÖ˙ĝġ˙˙˙ŝüô˙˙üŭ˙ŭĝ˙ġë˙÷˙˙˙˙ûúĝ˙ü˙˙ŝ˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ùŭ˙˙û˙˙˙˙ĝ˙ŝŝ÷÷˙˙¨ Ŭë˙˙ġöò˙˙ö˙˙˙öóŭ˙˙ú˙˙ûö˙ġ˙˙˙üò˙˙˙ò˙ŭ˙÷ŝ˙˙ò˙˙ò˙˙ì˙ùû˙÷û˙˙˙˙ġ˙˙ôô˙˙˙˙˙˙˙˙˙˙û˙˙÷ü˙˙ŝġ˙˙ŭú˙˙ĝñ˙ò#­˙ù÷˙˙˙ó˙ŭ˙˙˙˙˙˙˙˙˙˙çú˙ùüüÄ˙˙úâŝ˙Ì ˙ù˙öü˙÷˙ö÷˙ŝû˙ü˙˙üñ˙ò˙ó˙˙ó˙ûü˙ġĝ˙˙ġ˙˙˙˙˙˙˙˙˙˙ü˙ëé Üö˙˙ŭö˙÷˙î˙ù˙÷˙ò˙˙˙ù˙ġúù˙˙ù˙ŝòë˙ô˙˙˙ö˙ŭûöé˙ŭŭĝú˙ïôŭú˙˙˙’&"÷˙ûò˙ŝì˙ú˙ñú˙ŭù˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ö˙˙ŝŝó˙÷˙ĝ˙˙ô˙˙ûúġ˙˙˙üü˙˙ôô–!!•˙˙˙ŭ˙óú˙óô÷˙à˙˙˙ú÷˙˙˙÷ŝ˙˙ü˙ċ˙˙˙˙˙˙˙˙˙˙úü˙˙˙ġúó˙˙˙ü˙òĝŝí˙˙˙˙ú˙öù˙ü˙û˙˙˙˙ôġ˙ó˙˙˙˙÷ġü˙˙ô˙ú÷òù˙˙˙ù˙˙˙ĝ˙˙ !˙˙šŬ˙˙÷˙ç˙˙ïĝ˙ùŝòú˙˙ö˙˙˙×î˙˙úŭ˙˙è˙ö˙ŝ˙ŭ˙ëó˙ġ˙ŝ˙˙˙˙˙˙˙˙ĝĝĝ˙˙˙ŭ˙ö˙˙˙ôĝ˙ġ˙˙˙ú˙˙˙˙ú˙ôü˙˙û˙˙˙˙˙˙˙˙˙ŭÎ"úŭö˙óŝôŸ!ö˙˙ĉ˙ò˙˙˙˙˙˙íö˙˙ùû˙˙ŭ˙˙ù˙ù˙ĝ 'ŭġò˙÷˙˙˙˙˙˙˙˙˙ü˙˙´/Š˙ġ˙ċĝ˙˙˙ĝŭ˙ŭùû˙úü˙÷ë˙û˙ŭ˙ûû˙›˙˙ûġ˙˙˙˙%Üüĝ˙˙˙˙ĝ%Ċ˙é˙öġ˙ĝû˙˙ġ˙˙ò÷˙˙ùü˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ïŭ˙ġú˙ġ˙˙˙˙ó˙˙ï˙üú˙˙˙˙÷ŝŭê˙ü˙ñ˙˙˙üô÷ù÷˙úäôò¤ ûŝŝ˙ŝûĝ˙˙ó˙˙˙ċ˙˙˙˙˙˙˙òŝ˙ŭ˙ìŭü˙ŭġ˙üŭû˙úú˙˙˙ĝ˙ô˙˙ô˙˙ĝ˙öû˙˙˙î˙ŝĝúŝÑ˙˙˙ġ˙öüĝŝ˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙óĝ˙˙ûġúġŭġ˙˙˙ĝ!İ˙˙ö˙˙˙ù˙ĝ˙˙˙üù˙÷ŭûô˙˙˙ĉ˙ûġ˙˙ùŝ˙ŝ˙˙ûó˙ûï˙ò˙˙ŭ˙û˙ŝ˙˙ñ˙îŝ˙ĝ˙ô˙˙öŝ˙˙˙˙˙˙˙˙ü˙ñĝ˙÷ú˙˙öĝŭŭù˙˙˙˙ó(Ò˙˙óë˙ó˙÷˙˙˙˙˙˙˙˙ĝù˙˙÷ñşħĝö˙˙˙öŝ--Í˙˙ĝĝ˙ôŭ˙ûù˙˙ìòŝ÷û˙ŭ˙˙˙˙ŭú˙˙ú˙˙˙ŝô˙˙˙˙˙˙˙˙˙ñ˙˙˙š Ûŭûó˙˙ŝú˙˙˙˙˙òüŝ˙ŭ˙é˙÷˙˙úò˙˙ŝġ˙˙ó˙úùŭ˙˙ó˙˙˙˙˙ù˙ú˙˙˙˙˙ŭùöÛ0˙˙ĝ˙˙˙üĝë˙˙˙ì˙˙ġġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ĝ˙ï˙˙˙ġ˙üíû˙òü˙˙ġ˙ô˙˙ġùñ˙˙Ĵ­÷ĝŭŝò˙˙î˙˙˙ò˙˙˙í˙˙˙÷ûŝŝ˙ú˙˙˙˙ĝ˙˙˙˙˙˙˙˙ú˙û˙ú˙˙ŭ˙ûüŝ˙˙˙˙ĝ˙˙ñú÷˙˙˙˙˙ŝöĝüñ˙ñ˙˙˙ò˙ŭĝ˙˙˙˙ŝ÷˙˙ï˙˙üŭġ˙ù˙ùŝû˙òĞ ˙˙êŻ#û˙ŭ˙üġ˙ÎÊö˙˙ô˙˙˙ġ˙öŭÑ˙ñ˙ġ˙˙˙ĝ˙˙ŭ÷ö˙ŝġ˙˙û˙˙ûò˙˙˙˙˙˙˙˙˙˙˙úü˙úü˙˙ŭĝ˙˙˙˙˙˙ĝ˙˙÷ÛÓ÷úġ˙ù÷˙˙ŝ˙˙˙˙˙˙˙˙÷˙Ÿ !"˙ŭŭŝŭÑ˙Ħ ü˙úù˙˙ġġ˙˙òóŝ˙˙˙ü˙ŝ˙ôû˙˙ûòŝÍ!˙ö˙ô˙˙˙˙˙˙˙˙˙˙˙ùŝŽ ö˙ĝ˙˙˙í˙˙˙˙í˙ü*˙˙˙˙˙û˙ä˙ûĈžúŭ˙ŭù˙ò˙ Ôĝû˙úòŭĝ ĴòŜ˙ĝ˙˙ö˙˙÷÷ùü˙û˙˙üŭ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙û÷˙˙ö¨Ş“šħ˙Çŝ˙˙ìŭ˙ÁŸËĝ˙˙ᕨ˙˙üù˙˙˙˙˙˙˙ú˙û˙˙Ħ˙ûü˙ú˙ùŝú˙˙ñù˙ġŭ˙ò˙˙ò˙ŭúʛħ˘£ù˙˙˙ú˙ġ˙˙ŭûúŭü˙˜Ш û˙˙˙˙š“á˙ʰ "”˙ñ˙˙˙û˙˙ú˙òġ˙úòü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙óŭ˙˙˙˙˙ŭ˙úò˙˙ Ħú˙˙ôüŝ˙˙˙˙ŝĝ˙˙˙˙ŝŝ˙˙˙üò˙˙˙ô˙úûû˙ô˙˙÷˙ŭ˙˙÷˙˙öù˙˙˙ŝĝŭ˙ù˙˙÷÷û˙ŝŭ˙ö˙˙˙˙˙˙˙˙˙ŝŭù˙˙˙˙˙öü˙˙üŝ˙ŝö˙Ħ )Ñòù˙ù˙ü˙˙˙˙˙˙˙˙˙˙˙ŭô˙ôĜ˙˙êùġ˙˙˙ù˙˙íŝ˙û˙˙òúû˙ŭ˙˙ïŝ˙ç˙˙˙˙ĝ÷âŭĝûö˙˙˙˙˙˙˙˙˙û˙˙ŝíÍ#Óù˙˙üô˙˙òŝûô˙÷˙ŝĝ˙ì˙˙öÔ˙ó˙ŭÉÊŜĉî÷˙˙˙úÏ˙˙ġ˙í˙ôŭû˙ôŝö˙ŝüŭ˙Ĉ˙ŭĝ˙ëô˙˙˙ŭú˙ú˙˙úÍá˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙ŝ˙˙˙ìŭŝü˙˙ĝ˙˙ô˙ŝŭ˙ÖżÒá˙úñÊÓÌ "˙ŝù˙ö˙ü˙˙˙½ÚÑ˙÷˙˙ùîùŭ˙˙˙˙˙˙˙˙˙˙ü˙äàÜċ˙˙ĝ˙öŭÖóÀ˙˙í˙˙÷ô˙ö˙˙˙˙˙ü˙ġÖĝñ˙˙˙ġ˙üÉ£û˙ĝŝŭü˙û˙˙ġ˙˙šġ˙˙—2öüŝê˙ûù˙Ğ ˙öù˙í˙˙ûÌ˙˙üŭùŭŝ˙üˆÏ˙ûñÜëúñü˙û˙˙˙˙˙˙˙˙˙òü˙ùÑÓÉÉË˙ŭŝ˙ïÇÌÏĠÔÓ̞ĦûÌé˙˙üĝù˙˙˙˙˙˙˙˙˙ò+'œ˙ÜÏ˙ġû§ ˙Íà½ÊĜ˙öù˙˙ò˙îËĠÙÔÈÒ÷˙ö˙˙Ô²ŭĜŬÓò˙˙˙˙˙˙˙˙˙˙ŭĴ '#"“˘˙ï˙Ò   & ü˙÷˙ŭÑ'ĜÈÔ˙ñ˙Ŝ+úŭ˙Öû˙˙˙"&Ò˙ĝ˙ü˙ëË / #Äú˙˙˙˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ˙ñŭ˙Âħ1"Ĝúó˙˙ԙ#¸• &%ï˙ë˙ëĝ˙˙ĝŞŸżÒŞ˙ú˙üŝ˙˙ô˙ö˙ÛĊò˙öú˙ŭ˙¨#žì˙˙ò˙ûüú˙˙÷ŝúï%Êúŭû›$ Ï !˙˙ġ˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭëúûÜê˙˙˙úù÷ñ˙˙ŝŝŭ÷ (Ĥúù˙û˙ò˙ö÷˙ŝü˙ŭùûô˙˙öŝ˙˙ñû˙ŝ˙˙˙ġû˙úû˙ô˙ĝ˙˙ì˙üö˙ġ˙ŭ˙ô˙˙Ŭü˙˙ŝö˙ûó˙ü˙˙˙˙˙˙˙˙˙ġ˙˙ò˙öġ˙ê÷ò˙ŭùŝñŝ!"Ú˙÷ŭ˙˙˙˙ŭ˙˙˙˙˙˙˙˙í˙ŭ˙˙Ġ˙ú˙ó˙ö¤&òŭúž˙˙˙ò˙û˙˙Ñ˙ëô˙ù˙ó˙˙ò˙ûŭ˙  ˙ü˙÷˙˙˙˙˙˙˙˙˙˙˙ï˙Ÿ " Ò˙ŭ˙˙˙˙˙˙˙˙ùù˙úö˙ú˙Έ0Ä˙Ġ&!)Û˙ö˙‘ݤĵĝ˙ŝ˙˙˙˙˙˙ŭ˙˙˙˙Î#˙˙˙˙ù­š˘ŸŸÓ˙ö‰' Ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙ÏÂ×ùù˙ŝ÷î˙˙˙˙ë (œĝ˙ú'," –ùûŝ˙˙ŭö˙œ˙˙î˙˙ŭ˙ŭ˙˙˙˙˙˙˙˙ù˙ž´Ÿ ˙ŭ˙˙ġŜ £$Ċú˙ŝî˙ò˙˙ŭù˙ï˙÷üžŻö˙ŭôñ˙ô›3 " ˜È˙˙˙˙ùüĝ˙ö˙˙ú§%Ğ˙ê˙£˙ú˙˙˜£°›' –˙˙ŝ˙˙²¨­—¨Ò˙˙˙÷¤)›•Ż ¨Şñċ˙ó˙˙˙˙˙˙˙˙˙üú&ô˙ù˙¨!')äŝ˙˙˙˙˙˙˙˙˙˙˙˙ ×ùüĴ!'Ü˙˙˙ó˙#(İ˙˙ûÏ ó˙˙˙˙˙˙˙˙˙˙˙ +& -,˙˙˙ÈĞĤ%Ċ˙˙óħ!'İù˙÷Ĵ¤Ùġò˙‘ ""è˙ûġú˙!  * ¨ó˙˙ŭ˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġ˙˙&˙û˙È 5˙ûŭ˙˙˙Ċ³#)˙ŭ˙˙˙ö˙˙úö˙0Şüú˙˙È $(&İġ˙ġ˙˙˙ú˙˙ĝ˙˙ñ Ú˙˙˙$ ˙Ì ›˙ò˙ŭò˙ü÷ûñ˙ü˙ü˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙öܢŠÙë˙˙ü˙˙û˙˙ž(”˙˙ŝŭ˙˙ŭ˙˙úŭ˙˙˙˙ŭ˙˙ĤĤÍÙúŭ˙˙ĝñ˙͏çŭ˙Û˘  É˙ĝ˙˙ô˙ġŭ˙ÏÒ#ž·˙˙ò˙˙ŭĝ˙˙˙˙˙˙˙˙˙óÌóĊÎËÔ˙ù˙˙ö˙˙˙¨Ñĵ˙ïŭ˙û˙˙˙˙˙˙˙˙˙˙˙˙"Š˙˙ò˙˙÷ËÍ˙ô& ˙˙ĝ˙˙ŭ˙îÄ#Ï˙˙˙˙òŝ˙ ĦûŽ˙˙˙˙˙˙˙˙˙˙ó˙˙Ċ,½˙ŝóġüŭŭúÑ.3Á˙˙˙ĝĜ#"ĝ#Î,Ğßßĝ˙íɢĊÍ˙û˙˙›.ŝñôû˙×ġ˙/–˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ĵ& ħ²ñġ ˙˙$Ĥ˙˙ŭ ŻÂÇħ˙˙ŭìŭü˙#%/ĉ˙˙ŝö˙˙˙˙˙˙˙˙Ñ# "”ú§  $˙Ž$—é˙×'&0ƒ˙˙ûŝ$ !à˙ù˙ó˙ŭ˙ëü˙ĝ“/%! £ôÏŭŭ"˙˙òŸ &–˙óüġ *˙û˙˙$ !ßà˙ŝ˙˙˙˙˙˙˙˙˙ĝ÷¤ !#˙˙ñ˙œ"ĤÖ˙˙ûŝú˙˙˙˙˙˙˙˙˙(. %˙ú˙—* ž˙× 0žúûĝ¤ +à˙˙× /)Â˙˙˙˙˙˙˙˙˙˙çÉŻ˙˙—)Ġò˙Ï"óöŜ #Úġ˙ġ˙ ,,Ÿ˙ñ˙İ!! Êğ˙˙ġú³ ˙˙ü˙˙•Ûì˙Û#Ŝŭ˙ù˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ïë’ ž(Ĉ˙˙Ò+& ˤ&-˙˙˙˙÷ġ%%%Ñ˙ŭû˙˙ĝûŝ˙ŝù ˙˙ûğ # –ü˙˙ûö˙˙˙úù˙˙˙žBç˙ġúĊ- Ġö˙ŭ£. û˙ì˙˙˙ŝ˙˙˙˙˙˙ĝôŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷Í'6’öŭ˙˙ûŝóİ* –úùö˙˙˙ŝûġ˙ŭ˙î˙˙Úŝ™ ˙˙ú˙˙Ì˙ž&žôĈ "˙˙é˙î˙˙Ó˙— $ !Ç˙ŭ˙úñ˙˙˙˙˙˙˙˙˙ö˙Ïôıœ˙Êċ˙˙ŝùŝ’1É˙˙˙ùö˙˙˙˙˙˙˙˙˙÷˙ì#  *˜˙˙ú˙Ò˙ñ˙™!&“÷ĝ˙û˙–(—(¨˙ü˙ġΚĤ, +Ĉ˙˙˙˙˙˙˙˙ú˙˙ù!‘˙˙˙˙ûڔ" ˙˙ëÊ!Ş£Ÿ˘,(˜Ó Ĵ˙˙˙ ()¸˙˙˙ùéĴ÷˙˙ĝ÷ &×˙ż˜ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ Üĝ˙Ô×ùŭ˜’˙˙ĉü &˙˙˙üÇ Ĵ÷ô˙û˙ #ş˙ï˜Òŝ˙û˙˙˙˙˙˙˙˙˙–&£÷°ž›ŝ˘1³˙˙ä§+ *ġĝ˙ŭ™˙˙ġ˙˙˙ò˙˙ŝö˙˙™•˙ù˙¤ ˘˙óô(ˆ ŝ˙˙˙Ž"$Î˙üô˙™$µ˙ŭ) ˙˙ŝ˙˙˙˙˙˙˙˙öü˙ġ¤# Îñ˙˙Í2Ä˙û˙% ˙˙ġŭü˙˙˙˙˙˙˙˙÷&œ­Â˙˙ġĦ'˙˙ï˙ ˙ŝ´ħı˙Ï*Ö˙ö˙Î%"—ÑÌ˙ï˙˙˙˙˙˙˙˙˙˙˙ !˙ò˙ÔĤ,˙˙˙š˙ĝ˙ĉĞÒ˙ö˙ŭ0 ŝîô˙˙˙ñ # ˙˙à˙˙˙ŭ˙”"˙ù˙éÇ !§ŝÓ˙%Ïú˙ĝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ Óó˙ 'ÔùöúÎ(#˙˙â$˙ĝŭ˙&ġ˙˙¸˙ú˙ġ˙ú˙üĝ˙ô˙˙&Ĵ˙ËŭŬ#ŞÔ §˙ú˙öĝü˙˙˙˙˙òòˇ˙˙˙˙Ñû˙˙˘¤ċ˙ñ˙èô˙˙ÂÏü˙˙ûüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û֖& +ĦÒü˙˙˙˙,İ£Ĝ÷˙˙ó˙˙˙û÷˙ö˙È*šÔ Ôöü˙ #ĞŸ"É˙ò˙ù˙£­˙Ä ğ˙˙˙ġ˙˙˙˙˙˙˙˙˙í¨   Ò×ŭ˙Ĉ˙ġ˙˙÷˙˙˙˙˙˙˙˙û˙Î#œÑ˙˙˙ŝ˙›!! Ô˙˙ŝ˙ ˙˙˙ĝ–(ù˙˙í Ë˙ĝ˙˙  "'Ë˙˙˙˙˙˙˙˙ú˙ööĤ!Ħŭó˙žó˙ĝ$˘ġ˙˙Û$ ù˙˙ô!÷˙û ˙ó˙ô˙#Ğ˙ġ˙ŭ˜ ŭû˙˙˙ŭ"Íĝ˙§ ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝÄ˙¨"¤ġ˙ó˙ ˙Ùô³˜èï˙˙ŭ˙ġöü˙(Ë˙ŝ˙˙Ç˙ô˙˙ħ Öù˙ô˙˙˙˙˙˙˙˙ŭÔ)˙Ùú•& ˙ŭŭŭ#ùùü˙˙úö˙ !!˙ü˙ÍÓ÷ŝŝ˙ĝŭ˙ù˙÷˙ûû˙Ħŝġ˙•#ŭ˙˙‘‘˙ï˙˙˙÷û˙×ûù˙êÜ 'ĤÉ˙Ë ˙í˙˙˙˙˙˙˙˙˙˙˙ö˙ĝÙ˙ëÓŝ›˙˙˙ñÔ Ĝó˙˙÷˙˙˙˙˙˙˙˙˙ë&#ŝÑù˙˙ê˙ $Òó˙üĝ ü˙˙ùĦö˙ôÏŞ Ċ˙˙ôŝ!—˙˙ô˙˙ĝ˙˙˙˙˙˙˙˙üÑĝž%ŝ˙ò˙ñÜÍŭĝ˙˙ûúö˙Ô %À˙˙÷˙˙ ,˜ŭ˙˙ì˙ù˙ ˙ö˙ò˙ŝŭ˙# (ĝ˙ŝ˙İËŭ˙û˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭí˙žšŭÚúû Ġû˙ŝú˙ìŬ˙ ŭ˙ŭûĦ ž˙üî˙ŭ˙˙÷˙ŝ˙˙˙ġ˙˙˜( 'úï˙÷Ĥ!!À˙ÓĦüÏĝŝ˙ûĝ˙˙úŭ˙˙˙§˙˙öŭŭ˘Şĝ˙ïŭ˙ú˙˙Ô˙Şš¤ Ħ–ĝ˙ûŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝö˙˙ġ˙ú&$šÎÛĦĦĜó˙ûĜ+”§˙˙˙˙˙˙˙˙ŝ˙˙ŝٚ–˙ùŭ˙ÓüüÌ˙ú "ú˙˙ù&Êû˙üÍ&Ĵ˙ú˙˙ĝúĝ˙ŝŝú˙úÍİë˙öŜ (Ħó×˙Î §Íßġ˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üž ˙˙ú˙˙ĝ˙Ñ Í˙ù˙˙˙˙ŭ!Şŭŭù˙˙ü˙ùü˙šÙ§Ä˙˙˙˙˙˙˙˙˙ŭ˙˙ù˙ÊÑ˙˙ġ˙˜Ö˙ùÉ%˙ù˙˙Ç£ó˙˙˙ž"˜˙Í˙ö ù˙ĝÖ˙—˙˙ï˙ŭĠÏö˙˙˙ĝž Żü˙‡Ôû˙ü˙ŭ÷ú˙ŝŝ˙˙˙ü˙ö˙÷˙˙˙˙˙˙˙˙˙üó˙ùšù˙ĝİ˙ Ôŭŝû˙÷$¤úü˙Ò˙¨ġ˙ĝÒ)¨ŭ˙úö˙ "žĠö˙˙˙˙˙˙˙˙˙û˙Ÿ ü˙˙´!˙˙ù˙˙ĝŭŝ˙ÍË˙˙Ñ˙˙˙÷£" ‘˙ġ˙ĝü˙ñ˙ù˙˙÷˙ĝ˙˙œ›÷˙—#°˙ô˙ĝÊĠ˙ŭ˙Í ˙û˙ŭ² ñ˙˙ĝŝ%Ë˙ĝ˙Ñŝ˙˙˙˙˙˙˙˙˙˙˙ĝŝ˙˙Î˙ò˙ù¤% ú˙ô˙Ä#&˘ëû˙˙˙˙˙˙˙˙˙˙˙ŭ˘# ˙û˙÷˙˙ñ£!$ô˙ùü˙žú˙˙˙ŝŭ˙˙˙˙ !Ö˙û˙˙ŝ˙˙ü˙˙˙˙˙˙˙˙˙ŝüœ˙˙üüù˙Ÿ !˙ġ˙˙ù˙˙dz ˙ö˙ŝöФ˙ŝù˙˙ûÒĤô˙÷˙ùĝ˙˙˙ŝ˙ë# *”ž %×ÖÈ˙ġù˙ù˙Ò˙˙ûüġ˙ú˙ü˙˙˙˙˙˙˙˙ù˙˙ŭ˙÷˙ò˙÷ÏÙÍ˙˙˙ù˙Í #—ùû˙˙Ğ Îù˙Ĉ !ô˙˙ĝ˙§˙ò˙ûŭ˙ûŭ˙üŭ˙˙Ù Ċ˙ù˙ #"¨ŭ˙˙ġ˙˙ç˙˙˙üüŝŝ˙˙вÄû˙úÒĤŸö˙ö˙ŭ%›˙˙ÇÔ˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙úù.œ˙˙˙  Ĵ˙˙ŭ$!˙˙˙˙˙˙˙˙˙˙˙ô˙ôš/!è˙ġ˙ġż# ˘ú˙&#˙ôü˙!$Óúó˙—$ Ş ¸˙˙÷ù˙˙ĝ˙÷˙ŭûĝ¤İ˙˙ö˙˙’/ ×ö÷˙˜ ¨Ĉöŭ˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙ŝ˙ŭ£•ûŝúû˙ŝŝ¨˙ëúúî÷˙˙›˜ŭ˙˙ŭñ(œ˙˙˙Ġ ˙úû˙˙˙˙˙˙˙˙˙˙˙é˙ùú˙ ! È˙ñ˙˙˙•Ôï˙ë˙˙˜ó˙˙ĝÛâ˙ŝ˙ŭš Ĥ˙ï˙˙)Ġì˙˙ŭĤ"ôúü˙ùŬ!–˙˙˙ú˙˘ +˙óĵŸú˙ü÷˙÷˙˙˙˙˙úú˙÷ŝĝ˙ŝ˙˙˙˙˙˙˙˙÷ŝ˙ĝúÎ'˙ĵ˙•"!'ô¨Ĉ˙ŝ˙÷˙ Ħ˙˙ú˙ò¨&›˙ùùĠ"ŭ˙˙ġ˙Ż# "Ëù˙˙˙˙˙˙˙˙˙˙ŭû "Ï˙ċ™2 *!Éĝóġ1§ñ˙ŭ˙ñ˙ü˙˙˙ĝ )öùúá% ($Ċ˙˙ŝñ˙˙ö˙ù˙˙˙˙ùò³!°öï˙İ˙ŭŝ˙˙˙ĝĝ˙Ë6˘ċ˙ŝ˙˙™Ħ˙˙ïù˙ž#$ĝû˙ôÍ—˙˙ù˙˙˙˙˙˙˙˙ŝó˙ï˙%Ġ÷˙˙ÎĊ$ ­˙ùĝ˙ċ)˙˙ŝŝ˙˙˙˙˙˙˙˙˙íž $Ĥŝ˙˙˙ŭ˙˙ž˙˙˙ġ˙ *İû˙è˙˙˙ù˙ŝœ $Ġñ˙˙ùËŝ˙˙üŝ˙˙˙˙˙˙˙˙˙ùê˙Ğ)ô˙˙˙ŭÓ! -û˙ĝ˙עçúû˙úŝŞ$–ú˙ŭúĝĝ×˙÷úì˙˙˙ú.ñ˙ó˙! ˙˙˙ï÷˙ü˙˙ô˙ü˙ùŝü˙˙úû˙˙ñ˙ŝ˙˙˙˙˙˙˙˙ŝù˙˙ĝ˙ô˙ñĤ #ö˙˙˙˙Ä&ğ˙÷˙˙# "˙ï¨" ˙ŭì˙ï›"˙˙˙ĝ˙˙ŝŭ˙˙˙úòÏ ˙˙˙úœ, $•ûó˙÷˙˙ùûŝ˙˙˙˙˙÷(š˙ú˙ŝ˙Š ˙ë˙˙ġ ˙÷Ú"Ò÷ü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙ŭú˙×  û˙ûùĤ Ì˙÷ ˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷ ”é˙÷ŭ˙0 ˙˙Ö˙ñ˙˙–ŭ˙” $$.Ġóü˙˙û˙û˙÷˙ú˙˙+ 'îŝŝ˙˙ò  ›˙ü˙ĝ6 %˙˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙üŭŭĤ˙˙˙ŝ˙˙÷˙˙˙üäû˙ö˙˙˙ô˙˙¤ #Ĵ˙ûúÑ˙ü˙˙ô˙˙˙˙˙˙˙˙÷˙˙ô˙‚ Ôù˙˙èú˙÷˙˙żúž!ĥ˙˙î˙öÁ˙˙ó÷¨Ğ˙˙ì˙Œ$˙˙˙ù˙›0˙˙ŝġ˙ ˘âô˙˙òċ ""üÌ üĝ˙˙ŭ˙ŭ˙öòô˙ü˙üúŭ˙ŭ˙˙˙˙˙˙˙˙˙˙ò˙˙ó1- ˙˙› ( #Û˙˙ö˙§ï˙ŝġ˙˙˜" úö˙)˙ú˙÷˙‘" ×˙ñ˙˙˙˙˙˙˙˙ŝ˙Ö˙× ˙˙Ĥ…ŭŭ˙üŭ˙˙˙ñĊФ!˙ü˙ċ² š˙ô˙˙ò˙ûĝ˙˙ñ˙˙ñ!Ëĝ˙ü&üŭ˙öû˙žÊ§Û˙÷˙˙ñ&*Ċû˙˙ŭ˙!#˙˙î˙˙ë˙ŝ˙˙˙˙˙˙˙˙˙˙ċ˙ù”%"˙ó˙¨ ÷ŝü˙üĈ ŭŭï˙˙˙˙˙˙˙˙˙ö˙ ˙˙ê˙ùüĉ-&úù÷˙˙ ˙˙˙˙ŝ˙˙ 6" Ŭ˙˙ôù)Ó˙üî˙úï˙˙˙˙˙˙˙˙˙˙í#üûî˙ïÎ# Œĝ˙˙Ħ%(‰˙ŭġŭĝ;Ĥú˙˙˙˙úʘï˙˙ú˙öó˙ ˙úŭŸ™˙˙ßñ˙˙î˙ú˙˙ġ˙疗üúñ˙ŝù˙ü˙˙˙˙˙˙˙˙˙˙üû˙ùÜğ ""ß˙˙˙ ‘Ŝ˙˙ï'Ïù˙ɤ÷˙˙÷˙Ş˙ŭ˙üġú˙˙ŭŭ˙˙˙)˙˙˙÷úŞ*%(Î˙ŝŝî˙ŝü˙˙üû˙˙ĝġ˙ŭŭ,–î˙˙˙Ò (#ñ˙Ë) "üġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙˙ äŭö˙˙ 9÷˙°#Ÿü˙˙˙˙˙˙˙˙ñ˙˙˙'£˙˙ù˙ëİ%ôóĞŭ˙˙˙£ž˙ "" z˙˙ŝ÷˙÷ĝ˙˙˙˙öú§ ˙˙ó˙ûĝğ% Ù˙ü˙–' Ìüüüŝ˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙£œĝġ˙üŝ˙˙Ñ+áŭç˙ô”+÷˙ŝö˙ŜĤ3Í˙˙˙ŭ(—˙ôü˙˙˙˙˙˙˙˙˙˙˙˙ú˙1×˙˙ô˙òüğ¨" Îúú˙Ï%Ÿ˙˙ñ˙¨%žŭ˙ú˙ß ˙ïó˙óÚÓü˙˙˙! ¤Âĝ˙˙Äġ$˙˙˙òġ˙û˙¸ÓġÇ˙û˙˙˙˙üû˙˙˙˙˙˙˙˙ô˙ġ˙ûùÄ*Ì˙# !Şóû˙˙ɨİò˙ûü˙˘úŭġ —˙˙ü˙ü§'"Ì˙˙˙˙˙˙˙˙˙˙û˙Ô Ş#"0 œ³Ğü˙ó˙˙ŝ˙ĉ´!%ú˙˙˙ġ —*Š˙˙ñ˙ö˙˙˙úï˙˙˙Ÿ˙˙˙ħ! "˙˙ġŭÚ'ܨ ˙˙ï˙˙ù˙ö˙ŝô)!Ĉ˙˙ë˙"˙ìŭ˙˙˙˙˙˙˙˙üë˙Ç˙ Ħï˙˙üĤ Ïñ˙˙ü×"Ħ˙˙üú˙˙˙˙˙˙˙˙ĝŝ!%˙˙˙ï˙Û˙Ş$ŝ˙ù˙˙Ħ2ô˙öŝü''#Ï˙˙˙"Ĉ˙ĝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙$˙ŝ˙ĝ˙!Ó˙ŭ—(&›˙œŜü˙ŜŭŽ˙˙îŭŭ˙Ù%!ž˙˙öü˙˙˙Ü ˙˙˙˙ &–˙˙˙˙ô÷˙ŭŝ˙û˙Ê # Ĥú˙˙÷˙˙ġ˙˙˙˙˙˙˙˙ŝ˙˙ñ˙÷Ž,Û'˙ùé÷° Ħ˙ġ˙úĤÓ˙˙–& ü˙öñ˙ˆ$ú÷˙˙˙˙˙ĝŭ˙˙òî# #ñ˙˙˙˙úϛ "˙ŭò˙ù˙öŭ˙úġ˙˙!1ŭ˙˙÷˙˙ëî¤ ™˙˙›&"/˙˙˙ñŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙ò-"›÷˙˙Ġ ˙˙Ë( ™˙˙˙˙˙˙˙˙˙˙ç˙ú™¨˙ü˙ŝ˙Ĥ!Żĝ˙Ĝ˘Ó˙òŭù¤)˙µ*˙˙üñ˙˙˙ûó˙˙˙ûŝ˙ñ˙˙ùä"˙˙ŝŝú˙÷ïŝíÚ (Ŝ˙˙˙˙˙˙ŝû˙˙˙˙˙˙˙˙˙ŝ˙˙˘Ĥ˙÷˙˙ĝ˙˙£˙˙ò˙ü,! “˙÷˙ÈĦ%£#$½˙ü˙#ûüŭ˙˙˙˙˙˙˙˙˙ŭ˙úúŝ Âü˙˙ù˙ĜĴ "!Îû˙ûÉÍŝĝ˙˙”"“ì˙˙˙•/œ˙˙˙öüĈ˙ô÷˙Â#)‘˙˙ô˙˙˙›&#’ì˙÷˙˙ûü 'úù÷ú˙˙ú˙˙˙˙˙˙˙˙˙ŝù˙˙˙˙ĝš  !ô  ŝ˙ġ˙ġ˙÷—6 ˙ġ˙üñ· ˙Ġü)ž˙˙ó˙öŞÍï˙˙˙˙˙˙˙˙˙î˙óíŞ$Ĵ $*Â˙˙ù˙ûúĠ"(ĜüĤ$ ˙˙ċ˙¨ê˙ú(ôù÷˙÷ŝ˙úġ˙˙ï˙°ħüŝö— ġĝ˙˙”Ħ˙˙´!É˙˙îŝĞ !Ħ˙ġ˙˙ú˘ öñ˙˙÷Ż%˙ö˙˙˙˙˙˙˙˙˙˙˙˙ú˙ ×˙ùĉ˙Ħ(­ê˙ŝ÷Ô’Ùú˙˙˙˙˙˙˙˙˙˙˙ï% &Â˙÷÷˙ĝó£%ù˙˙ġö !˙ġ˙ú§'˙ĞÒ˙úú˙Ï˙ġ˙ûôú˙˙˙˙˙˙˙˙óŝî˙˙ï˙— ˙Ż Ì˙£'ŭü˙ú˙(ù˙˙˙ö˙Êİòïŭŝŝ˙ñ˙*äú˙ó˙ġü˙üúñ˙ë˙˙$- Ĵ˙÷÷ŝü˙˙˙˙˙˙˙˙˙˙ö˙˙ë´$- Ħ˙Š# šàáü§  œÎĈ÷˙+ ÊùŭĠ˙ñ˙ú˙§ ˙˙ŭôù˙˙ŝŝŭù˙˙! ˙ŝóϔµÊÓ*”Ä˙˙ŭĝ˙÷ŝ˙˙˙ôÄ (¨˙ĝì˙™(úŭ˙˙Ħ#ïûÔ˙˙ŭ˙˙ö˙˙î˙ŝ÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭ˙ŭÚ!Ŭù˙üÛ% Ĝóü¨ !×˙˙˙˙˙˙˙˙˙öú˙û'+êŝ˙ú˙  Ħ˙˙&„˙ó˙˙ŝ'˙˙Ô÷˙˙ŝô˙˙˙ûù˙˙˙˙ñ˙üüù'˙ġ˙˙˙ġ˙(Ĥ˙˙ï¤'˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¤˙˙˙˙÷˙˙§&ù÷˙ô˙$ŝ˙öĜ 'œÖ•à˙ü˙ŭ áŝŝŭ˙˙˙˙˙˙˙˙ù˙˙û˙"! ˙ŭê˙˙â.ž˙ !‹˙˙ñ˙˙âĝû˙ùħĴü˙ŝŝ!" ˙Öŝ˙ûŻ˙˙˙úğ ˙ĉ˙û˙çÏ#ĉ˙ĝġ˙ùÚĜ˙÷ĝ˙˙ú˙˙˙˙˙˙˙˙˙˙ŭò˙˙ġÑŬ •˙'êû˙˙û÷˙˙™#"›˙ûóŜĈ‘&ô˙ŝèŜ!ë˙ßù˙œ*&›˙ŝ˙˙˙˙˙˙˙˙˙˙óŝ˙Ë(ĈúĤ! “ü˙ŭú˙Ġ˙˜˜ŭù,ĝ˙˙!ƒ÷É˙Ï˙˙ö˙˙ĝ˙ŭ˙ù˙˙„•÷˙ŝ! ˙Ì˙Ÿ2óûè˙ŭû˙˙§ ˙Üòö˙˙˙î˙ĝ)&ï˙ò˙˙˙˙˙˙˙˙˙öè˙û# ×˙˙˙˙Ħ ŜéÏ˙“Ŝì˙û˙˙˙˙˙˙˙˙ö˙"$( ĤÉÓ˙ò˙˙”-ŭ˙ó˙˙!Ò˙ĝ˙§˙ Ûŝ˙˙*°Ëú˙˙˙ŭ˙˙˙˙˙˙˙˙˙ĝ˙ ğŬ!!Ħ˙ï•* ! Û % Ħ÷ŝ˙û&Ìû˙˙ñ˙×˙˙ĝ˙ŝ˙ġŭ˙˙é˙Ğ(à˙úġ˙ ŭ˙˙”(’˙˙˙˙î˙˙˙˙˙˙˙˙˙˙ù˙˙ £ëŠ( ) Ħóš&­ûú˙ù˙ó˙'Ï˙ù˙ô)ĊĊŝ˙˙ŭŭ˙˙öû˙ġÌ˙˙› à˙È˙Ğ â˙ò˙ò˙˙˙˙ùŝ˙6"œĝ˙Û"¨˙ô÷Ż  û˙˙ó˙˙ñĝ˙ú˙˙ŭ˙˙ŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭ˙úê: ³˙ŭù˙”ÙÜŝĈ §ġ˙˙˙˙˙˙˙˙ù˙ú˙Š% ˙ĝ˙ö ˙ûòݳù˙ñü˙˘%Ÿŝĝ¨$Ĝ˙ŭ˙ó˙˙Êù˙ú˙˙ôû˙˙ûù˙˙›!˙˙ùŝ˙˙Óîŭ˙š ˙ûûûûŭ˙˙˙˙˙˙˙˙˙˙˙˙ùġû¤-îôô˙û˙˙˙ĝŝĝĴ  ñ˙÷İ% ˙ô˙ü˙˙*&ç˙˙˙˙˙˙˙˙˙˙˙˙ïù˙÷‘#Ó˙˙ñ˙˙Ĥ$“˙˙ '(şÉû˙ŝÁ˙˙˙÷š##˙˙ìà ü˙ŝúĞ'Áö˙ġ˙¸%žĝĉ˙˙ŭ˙˙–! !£ŝġ˙í˙öÚ 1…˙˙ŝ˙ûü˙˙˙˙˙˙˙˙˙˙ĝġ˙˙ŝó#Í˙ $ĉ˙ë˙÷˙ñÓ" ¤˙û˙ùŭ² 0˙ó˙˙Ñ! Ż˙˙ôŸ›Óġ˙˙˙˙˙˙˙˙˙è˙˙ŭ˙! ˙˙Ê'à˙ö˙û˙ŝí%'ú˙ ˙ñö+"-ŭŝ˙˙ĉ˙÷˙˙ĝġ˙0 %ùÖ +–˙ñ½˙š˙ŭÌ (ġĝ˙˙Ò!$Óĝ˙˙ä "Î˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÉÌù˙Ñ™˙˙Ô"˙ĝ˙˙˙˙˙˙˙˙ŭ˙˜˙˙Ġ( Í˙ġ˙ñ*ġ˙› )"˙è! š¤”ó˙˙˙˙˙˙˙˙˙ò˙˙ # " ˙˙˙˜-  )&+ Ĥ˙ĝÓ˙Ĥ '<ˆŝ˙˙Â"%‹˙ŝùŝ˙Ŝ !Îŝ˙û÷) ıž˙˙™' #çŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙! "%%˙¨1 ĵ˙Û& Ó˙úĥ(!&¤ É˙˙˙ôĝ˙˙˙ı- * $–ġ­žùú˙ .Ìù˙î˙˙˙˙˙ùú˙Ħ! ˙˙$ò˙É ñË˙˙ñö˙˙ŭö˙˙˙ûüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙û˙ŭ˙‘ ˙˙û˙ġÜ!Öûù˙˙'!ž˙˙˙˙˙˙˙˙˙ŭû˙ħ˙˙ñŭ ûŝ˙˙Í˙ĝ˙Ëú§! )ö˙Ç˙˙˙˙žİú˙ùû˙˙ŝ˙ù˙˙÷Ñ ĠüÏŝú˙¨§ĝ˙ü˙÷"œŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙èò£˙˙û˙ŝ˙ö˙ċ˙˙×  ˙ë˙Î˙˙öİ˙ŝ÷ ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙ú !ĝ˙ġ˙ûš˙ûİ "ŭüÄ"š˙òŝÜÍ˙— ˙ĝú˙š" Í˙ŝž˙öŝ˙˙ġùŞ$”˙˙˙˙˙˙(,%ô˙˙˙ü˙ŭ˙˙˙˙˙˙˙˙˙î˙ŝŝú˙˙Ïœ˙ó$Ÿ˙ù˙˙˙˙˙ô˙ŝÏ '–˙÷˙Ħœ 'Ì˙˙ô˙˙˙˙˙˙˙˙˙˙ñú˙˙ġ& "÷˙ġ˙˙ü˙ú˙˙–#ŻËŜŭ' ˜˙ûŭû˙˙˙ĝú˙üÏ #Ÿ÷ Ò˙ŭ%˙ü  %Ôĝ˙ )ù˙* úù˙˙˙˙˙˙˙˙ŭù˙ñ˘&Ó˙˙œŞùÎ'Éŭ˙˙˙˙˙˙˙˙˙ŭŝ˙ŭ˙) *˜˙ÊÑŭ§ Öö˙” " )˙˙˙˙˙˙˙˙˙˙Í÷İ*$™˙˙úùŜ”$˘öĦ˘ŝ˙ĝ˙ž$%(Ëú˙ù#úÒ )˙ĝ˙$# ˙˙ġ˙˜ü˙û÷˙ù˙˙˙˙˙˙˙˙˙í˙˙ŭÍ* §˙˙Š% -–ġ˙˙Ċ)"Ñüŭ˙˙˙˙ò˙­ +&˙ŭ#Ĥ ħö˙ŭ˙ó÷˙ôŭ˙˙üŞ!œšÓúüŞ›"ž˙˙˙˙£ĞŸÏ˙˙öú˙˙úü˙˙ŝ˙ôŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙  ˘˙ĈúÔÈ˙˙˙˙Ĥ  ˙˙üŝ˙ŝ˙˙ŝ˙òù˙›šâĈÌĴŭû˙Ç˙ù˙Òû˙ì ĤÒÇĠ¤ò˙ùŭ˙˙˙˙˙˙˙˙˙˙ż˙ÈÇ#Ŝúù÷˙ĦÏ˙ù˙˙ġ˙˙˙˙˙˙˙˙˙˙ü˙úü˙%˙˙ñ¨Ê˙˙Ÿ%Ä˙ò#  & Üúûİ##Ñ˙˙˙˙˙˙˙˙ŭü˙Ñü˙˙˙˙˙ŭÛ ˙úÓ&¨˙ŭ˙ŝ (Ó˙˜+!ĊÖ˙ë˙ŝó˙÷"Íó˙ú˙˙˙˙îĜ# ×˙ò˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ û˙üì. Ħûûúŝ˙ŝ˙ùš%$˘Ôúûü˙ô֜'›˙˙ï˙#$ *È˙ö˙÷û˙˙˙˙˙˙˙˙û˙˙ö˙˙›!¨ö˙ġ*Ĥ˙˙ŭ˙ŭ˙ŭ˙ !!ı˙“& ²è˙˙ĝ˙˙ùŝü˙ûûÏ&(ÓÏ#Ï˙ŭŸ$)ËÏĞ*›˙˙& ˙ôŝ¤# #Ôô ( %˙ü˙˙˙˙˙˙˙˙˙˙ùĝ +ĥ˙ùġ˙§#Í˙ĝ˙“™ĝ˙˙ŭ˙˙˙˙˙˙˙˙˙ġ˙ŝ&,ë˙Ġ!Ĥ'ÌŭÑÔŝ˙"–ĜĦ-›ú˙ŝŬ—% )˙ĝ˙˙˙˙˙˙˙˙˙˙˙ÜÑÏËÖÁĞŞÀßö˙û˙˙˙ïÛÏÌ˙˙òÜÊËŜñû÷˙ö˙È**È˙ö˙÷û™$›Í¤Ë×ŭ˙œѨž£Ìġ˙ŝúûÖ $%Á˙˙˙÷˙úİ%ò˙˙˙ġ˙˙˙˙˙˙˙˙˙ù˙ŝ˙û˙ËŸ˙ñĤĦÎ˙ËĈ"ë˙˙ŭü˙Ì(#  ˙ö˙û˙ŭó˙˙™"š˙ġ› Üñ˙˙ŭü˙˙˙ì˙˙ä˙ĝ˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙ö˙úĵí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÔĴ‘ħ˙•˘ğ˙òŭô$""ù˙˙˙˙ŭŭ˙ŭú˙˙˙öŸ! !ĤÒúû˙Ÿ)°˙˙!˙ó˙Ì*! ) !ú˙÷˙ìŭ˙˙˙˙˙˙˙˙î˙Ĵ šĤ² ´ì˙˙˙Œ$ "žöŝü˙÷˙˙˙˙˙˙˙˙˙˙ŝù˙˙ŭ¤*"ñ˙˙ $.˙˙Ÿ' )£˙˙– *›˙£ (ï˙˙È & #˙˙˙˙˙˙˙˙˙úÚçĞ$ $É˙ìĝö$&ù÷˙, ĠñÌż ²˘ö˙ûéĵ§¨šħĴ÷˙¸İ˘Şš˙ŝöğŸĴ“ è÷˙ħĴ—¨—Ġŝ˙ö˙÷˙ö˙ĤĠ˙˙ö˙ĝüö˙üö°//Ó˙ü˙˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷›#•˙ù˙˙ñú˙ŭü˙˙ŭûü˙˙˙˙˙ö˙˙˙˙˙˙˙ù˙˙ġĝ˙˙÷˙Ž"+˜ŝÚ˙˙î˙ŭ˙˙˙˙˙˙˙˙˙ûŭŝ˙ŭòÚĊžĠù˙ŭ˙ÜĞ˘ç˙û˙˙ú˙˙ú˙™ ĦŸûÈ´Ë˙Ҕ!#§Ħì˙˙˙ûŭ˙˙ŝû˙ŭ˙ü˜£•ĥï˙˙ú˙­žĴ½˙ĝù˙ÇŞšĉ˙˙ʰĥâ˙˙ûŸ²–Œ²§Êù˙ûûîОŸ¤ó˙ÈĤ˘˙˙˙ŭ˙ü˙˙˙˙˙˙˙˙ú÷˙˙ò˙˙˙ù˙˙˙˙˙˙ġ˙è˙ĝñ˙˙ŭ˙ŭà˙˙ô˙ó˙˙˙˙˙˙˙˙˙ï˙˙ù¤•Ĝ˙˙ôġ˙ĝû˙ú˙˙˙ö˙ŝ´ğġ˙ú˙ù÷˙˙ĝ˙ü˙ö§ğ÷˙ġô˙˙˙ù˙˙˙äû˙˙˙˙˙˙˙˙˙˙˙ùĝŝ˙˙ŝú÷ù˙˙˙ŝ˙˙úòëíĝ˙˙˙˙˙üŭ˙˙˙ŭ˙î˙˙ÚŝŝÚ˙˙î˙ŭ˙˙î˙úù˙ò˙˙˙ê˙ôö˙ó˙üûû÷ñó˙˙ü˙ë˙˙ëï˙ĝ˙Á$˙ŭĉ˙˙ö˙˙˙˙˙˙˙˙˙˙ò˙úûüŞ˙ıü˙ûŜŽİ¤ÓÔûġ˙ š§˘˙˙™˘žĞġ˙ü˙˙ġўĴžŽĴ˜œĦ£žŸ˙ú˙˙ŭû˙˙󘣝£ŞžÁ˙˙Ĝ”§İİĦ òŭ˙˙˙˙˙ŭ˙˙üô˙ûÛĉö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙û˙˙ûöù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ğ˙$#˙˙ùûš8#Ûñ˙˙ŝŝ˙˙˙ï˙˙ô˙ü™( # ˙È˙ŝ˙˙ş#â˙üŽ )Â˙˙û˙˙–İŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü•!2  ôŭ˙öúĴ Ħ 7­ù˙˙˙ĝ˙û˙˙˙˙˙˙˙˙˙ö˙ŭî˙¸ÊÓĞż˙˙ôñ˙˙š˙÷ù˙ïùĴ›Ŭúüû˙Ò˙ÏżÚŝÓĝĠŭú˙ĝ˙ö×Ü·˘Ŭĉ˙˙˙˙˙˙˙˙˙˙é˙˙ċÎÌÈÒ˙˙í˙˙÷ûÊ˙¸˙ù˙ëÏ˙ó˙˙˙ì˙óú˙˙î˙˙ïú˙˙äû˙˙˙ĝ˙˙÷˙ŝüëûùÛâŬ˙ŭúé˙÷ï˙˙ï˙÷˙˙ì˙óí§1ò˙úŭ˙ô˙˙˙˙ŝ˜šô˙ü˙ŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù  ˙˙˙ŭĝù˙˙ù˙˙ì˙˙˙ôĝ˙˙ñ˙ŝü˙ŭ÷û˙˙éĝ˙ûöŝú˙úßÓËĠö˙ŭ˙˙˙˙ŭú˙˙˙˙˙˙˙˙˙öĝ˙˙ùŝ˙Ê˙˙˙ĝŝ˙ĝŝ˙ŝö˙˙ĝ˙˙ï˙˙˙˙ġ˙ùÓî˙ĝ˙˙˙Ä(î½˙ĝú˙˙ûŝŝû˙˙˙˙ûŭ˙˙ò˙Öû˙˙ù˙üûüô˙˙ŝó˙˙˙ó˙˙˙ìüö˙˙ŝ÷ü˙úĜïú˙ü˙ó˙˙üú˙˙˙˙û˙í˙ûó˙öü˙˙˙˙˙˙˙˙˙˙ŝí˙úù÷˙öòŭŝġù˙˙˙˙˙˙˙î˙ï˙ôŝûò˙˙˙˙˙˙˙˙˙˙ô˙˙ġ˙ĝö˙˙˙ú˙ì˙˙ùùĝ˙ùŝö˙úŝ÷˙˙Ü˙ú˙˙úüŝ˙óû˙˙ôìòú˙˙ûŝġ˙˙ŝŝü˙˙˙˙˙˙˙˙˙ĝûüûŭ˙˙˙˙˙˙˙˙ŝüü˙˙ŭûûŝ˙˙ùúŭ˙˙˙ŝúúŭ˙˙˙˙ŭ˙˙ŭ˙˙˙˙ŭú˙òŜŝ˙÷ùòó˙ûüû˙÷˙ù÷˙˙òû˙˙îô˙˙˙˙˙˙˙ü˙Ğ# ëÈ˙˙ú˙˙˙˙˙˙˙˙˙˙ü˙ġ˙˙ĝ˙ò˙˙˙÷úúĠ˙˙ùö˙˙˙ġ˙ù˙ŭ˙˙ú˙üŬî˙úî˙˙üúġ˙˙Ó˙ö˙Üôù˙˙ú˙˙˙úû˙˙óñŭâëú˙ġâû˙˙ġ˙˙Ô˙ĝü˙˙˙˙˙˙˙úŝ˙˙ô˙˙í˙˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙ûŝ˙˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öÔŞš'¤Á˙ú˙÷˙Ó˘£ĴĤƒĞ™×˙˙û˙˙ŝ˙ŭŝ˙ĝ÷˙˙˙Şšž”Ĥ˙ûĝüú˙÷˙™ŸÖ˙íú˙ŝùüÓË˙ùó˙ŝ˙˙Î$ ­ĈÖÀ˙˙ú˙û÷˙˙˙˙˙˙˙˙˙ûÒ˙ŭĊÓ˘¨˙ĝ˙˙ë˙û˙ú˙˙í˙ŝ˙û˙˙úüû˙˙˙˙˙˙˙˙ŭĝ˙˙û˙˙˙ŭ˙˙˙ô˙ö˙˙ùĝ˙˙˙ä˙÷ú˙Ĝ˙˙˙˙úùŭ˙˙ĝ˙ò˙ŝ˙˙ġ˙˙˙ò˙˙ü˙˙ŭ˙˙˙˙˙˙˙˙˙ê˙ŭ˙˙˙˙˙ŭ˙˙ü˙ûù˙˙ö˙˙˙˙ŝ˙˙ñ˙úú˙˙˙˙˙˙üùÙü˙ù˙ġ˙ùúŭ˙ŭ˙ú˙˙˙˙˙óċùú˙˙˙û˙û˙˙û˙˙ô˙ù˙˙¸˙üû˙˙ġ˙üñú˙&ö˙˙üû÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ú˙ġ˙÷˙ûú˙˙˙˙˙ôú˙˙˙˙˙˙üöĝ˙˙ŭú˙˙˙ŭ˙˙üú˙ù˙˙ïù˙˙˙ôûùŭ˙üŝ˙˙˙˙˙˙˙˙˙ŭŭŭ˙˙˙üóÛä÷˙˙üôûû˙üü˙ü÷˙˙ùŝ˙˙óü˙˙˙ú˙˙ĝ˙ŝë˙Ç˙˙ô˙˙ĝôŝ˙˙ŝ˙˙˙û˙úŝ˙˙Ä˙˙˙˙˙ü˙üôú˙˙ĝù˙˙ïú÷˙ü˙úù˙˙˙ú˙üŬ˙í˙ŭüùî˙˙ŭ˙û÷˙ĝ˙ñ˙˙ó˙ŭ˙˙˙˙˙˙˙˙ô˙ŝŝ˙˙ù˙˙˙˙˙˙˙˙˙ü˙÷ü˙ú÷˙˙˙˙˙˙ü˙ñ˙˙˙˙˙˙˙˙˙ìú˙˙˙ùÇ˙ú˙˙˙ññ˙˙öú˙ŭù˙ŝ˙Ñú˙˙˙˙ûĝü˙˙˙ŝûúùġù˙˙üĝ˙˙˙öüü˙ñ˙˙˙˙˙˙˙˙ŝ˙˙ŝŝŭüúûŭŭûùû˙˙˙˙˙˙˙˙ü÷˙ŝüŭ˙˙ûö˙ŝü˙ŭùûôôûùŭ˙üŝ˙˙˙öü˙˙˙ŭ˙öŭ˙˙˙ò˙öú˙˙˙ŝûü˙ú˙˙ŭòŭó˙˙­ £˙˙ò˙˙ê˙˙˙˙˙˙˙˙˙ó˙ŭ˙˙˙úŜĝ˙úô˙˙î˙˙ü˙˙˙òú˙˙˙˙ûü˙˙˙ŝ˙˙ŭüŝü˙˙Ó˙éùô˙Óŭ˙ŭ˙ġ˙˙˙˙ŝüü˙˙˙Ġö˙˙ŭóŝ˙˙˙˙ûÍŝŝ˙˙˙üü˙˙˙ü˙ò˙˙ò˙˙ëöö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙˙üĝùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óĝ˙ìŝ˙˙¤’÷˙ŝ˙ô˙÷ûúï˙ö˙˙˙ġ˙˙˙û˙˙ú÷˙˙ó˙˙ú˙ñ˙˙˙˙˙è˙˙ŝŝ˙ĝ˙˙˙ù˙ë˙˙ĝ˙Êŭ˙÷ù˙˙û÷˙˙ç˙ô˙ĝŭö˙ú˙ġ˙˙˙˙˙˙˙˙˙ü˙ì˙÷ô˙˙ûŭï˙˙ö˙˙ó˙üù˙ŭî˙˙˙óú˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙î˙óùù˙ö˙öĝ˙ġ˙ŭ˙˙˙˙ö˙˙˙ô˙˙ġŝ˙˙˙úî˙˙˙˙ŭġ˙û˙î÷˙˙ñ÷˙˙ú˙˙˙˙˙˙˙˙˙ü˙ö˙ŭ÷üù˙ùó˙ùó˙˙ŭġ÷ú˙ü˙˙ò˙ü˙˙÷˙ùùù˙ŝ˙ñ˙ùġ˙˙÷˙ö˙ĝŝ˙ùŭ˙ŝŭ˙˙˙úüĝ˙ŭï˙˙öó˙úôĝ˙üò˙•˙˙ò˙ŭ˙ŭ˙ġ˙ĠŠ £˙˙ŭ˙˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙í˙˙í˙ŭ˙˙÷ùù÷ü˙ŭöûŭ÷öŭ˙˙˙ŭ˙˙˙˙ì˙˙ĝġ˙˙˙˙ŭù˙˙ûòöŝ˙˙˙˙ĝŝ˙˙˙˙˙˙˙˙˙ù˙˙üġû˙ŝ˙ü˙ôĝ˙ü˙ó˙˙˙˙ŝûŝ˙˙˙ç˙˙÷˙î˙˙öúġü˙˙˙÷ŝ˙˙˙ġ˙˙˙˙˙˙ŝú˙ŝü˙ŝù˙ù˙˙ü˙˙óġü˙˙˙˙˙úŭ˙˙˙ö˙˙˙ŭ˙˙˙˙úŭ˙˙ü˙í˙˙û˙ĝ˙˙˙ŝ˙˙öŝ˙û˙˙ĝŝúú˙˙˙˙˙˙˙˙˙˙˙ù˙ĝ˙üŝ˙ŭùŭü÷ú˙ù˙ú˙˙ú˙ò˙üòû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ûü˙ŭüŭè˙˙˙˙ġ˙˙˙˙ŭ˙ùó˙ïŝú˙÷˙˙˙˙ù˙˙ŝĝ˙˙˙˙úú˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙ŭ˙˙üûŭ˙˙˙˙˙˙ŝŝ˙˙˙˙ŝĝ˙˙˙˙ŝŝ˙˙˙˙ĝŝ˙˙ġ˙˙óù˙ô÷˙÷˙ó˙ô˙ŝ˙˙üŭ˙˙ĝö÷˙ü˙ŭ˙úüü!! $¨ö˙ú˙ŭî˙÷˙˙˙˙˙˙˙˙û˙úò˙˙ŝê˙˙÷ŭ˙˙˙˙˙ûùŭĝŭ˙úŝ˙ù˙˙ŭ˙û˙˙ŭ˙˙ŭù˙˙ù˙˙ŭ˙˙ŝ˙˙ĝû˙öŝŭ˙˙ùû˙˙öï˙˙ù˙˙˙ùùĝ˙˙˙˙˙ŭüŭ˙˙ŭŭŝŝ˙ù˙˙ò˙˙˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙ĝ˙˙ŭ˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙óŝÛĝ˙˙˙ĝûŭ˙˙˙˙˙˙˙˙˙ûĝ˙˙˙ûü˙˙ŭŝ˙˙˙˙˙˙ô˙˙îŝ˙ĵ˙ŭôë˙˙˙ġ˙ŝ˙ôŝ˙ùŝì˙˙˙ú˙í˙˙˙ú˙˙˙ô˙˙ûú˙ġû˙ġ˙˙˙˙˙˙˙˙˙û˙˙˙˙¸ŭ˙˙˙ŭ˙ŝ˙ò˙ò˙˙˙˙ġ˙ú˙˙ùĝ˙˙û˙˙˙˙˙˙˙˙˙˙ŝŝï˙˙˙˙˙÷ŭ˙˙˙ĝ˙ġü˙˙˙˙˙˙ï˙˙˙ŝ˙ûú˙ô˙˙÷ü÷˙˙˙ġ˙˙˙ùŝü˙˙ôô˙˙˙˙˙˙˙˙˙ï˙˙˙˙˙úú˙ú˙˙˙úüö˙ŝ˙ŝñ˙òò˙˙˙ìú˙ï˙˙ŭô÷˙˙˙˙˙üüŭ˙˙˙ú˙˙ŭüŭ˙üúĝ˙˙˙ûú˙ĝ˙ü˙÷ŭ˙˙ûüĝ˙Ó ˙ùŭ˙ö˙˙÷˙ż 2 ½È˙˙ĝŝ˙ŝü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ú÷˙˙ù˙ü˙ĝĝ˙˙˙˙˙˙˙úŭ˙˙˙ù˙ŝĝù˙˙ĝ˙˙ù˙˙˙÷ġï˙˙˙ù˙˙˙÷˙ùü˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙û÷˙˙˙˙˙ĝüĝ˙˙˙˙˙úü˙˙ŝê˙˙˙˙ö˙ï˙ġ˙˙˙˙˙ñ˙ç˙ŭüö˙ùü˙˙ŭû˙˙ŝŝü˙ŭ˙ü˙ĝ˙÷˙˙ú˙˙˙ŝ÷˙û˙óŭŝ˙ŝô˙ŭ˙ġ˙û÷˙ó˙ü˙˙˙ú˙˙öú÷˙˙ôŝ˙˙˙˙ôùö˙ü˙˙ö÷˙˙˙˙˙˙˙˙˙ġ˙˙ú˙˙ŝûû˙˙˙˙ŭŭ˙˙˙üòŝ˙û˙˙ŝ˙˙úü˙˙˙˙˙˙˙˙˙ġ˙ġ˙˙˙ù˙ú˙˙ü˙˙úòö˙˙ó˙˙úú˙˙ŝ˙ŭô˙˙ŭöíŭŝ˙ŭŝ˙˙óò˙˙û÷˙˙ó˙ġöû˙˙˙˙˙˙˙˙˙ŭùùûüûü˙ŭüüŝ˙˙ü÷˙˙üûŭ˙˙˙ùü˙ŝûúüŝĝ˙˙˙üù˙÷÷˙ùü˙˙˙ĝġû˙úü˙ŭ˙û˙û˙˙÷˙ŝ˙ŝĝü˙˙˙˙˙ŭ˙ö˙ġ˙˙˙Ĝ Ëú˙˙è˙˙˙ë˙˙˙˙˙˙˙˙˙˙˙ùú˙ŝŝ˙ŭ˙˙˙÷ŝ˙ġ˙˙ĝ˙ü˙˙ö˙˙û˙˙ŭ˙ŭï˙ôö˙˙˙˙ûĝ˙ŭ˙ŝ˙÷˙˙˙˙ŭ˙ï˙˙ŝ˙˙˙ĝû˙˙˙ù˙˙˙˙ü˙ĝ˙˙˙˙˙ŭŝ˙˙˙˙ûû˙ŝ˙ñ˙˙ò˙˙óġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙÷˙úġ˙˙ôùü˙ôŭùûì˙î˙ü˙˙üûúûŝ˙˙˙˙ĝ˙˙ŭô˙˙˙˙˙ö˙üü˙˙˙˙ĝŭ˙î˙˙˙ú˙ŭ˙ŭ˙ċ˙˙˙ñ˙ĝ˙˙ġ˙ġ˙ĝù˙˙˙öù˙ŭ˙˙˙˙˙˙˙˙˙ö˙ġ˙˙˙˙ġü˙ó˙˙˙ôì˙úü˙˙ùü˙˙˙ù˙˙û˙˙˙˙˙˙˙˙ñ˙˙˙ò˙öŭùï˙÷˙ïŝ˙˙ŭ˙é˙üû˙˙˙˙ûò˙˙íü˙˙ì˙˙é˙˙÷˙ç˙ĝ˙ú˙˙˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙ŝġĝö˙˙˙ëûü÷˙˙˙è˙ĉû˙˙˙ü˙ŭüŝ˙˙û˙˙˙ŭŭ˙úĝ÷˙ŝ˙ñ˙ŭ˙ŭù˙ŝú˙ú˙˙˙úùŝ˙˙˙˙˙öî˙˙ü˙ñ˙˙˙•'öú˙˙ú˙˙üġᜟê˙ü˙˙˙ŭ÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŭ˙˙ŝñ˙ñúú˙˙˙ñ÷˙ñ˙˙˙ŭ˙˙ûġŭ˙˙˙˙˙˙ò˙˙üö˙˙˙˙óìû˙˙ŝ÷˙˙ŭóö˙˙˙˙˙˙˙˙˙˙˙˙ù÷˙˙˙úŭöġü˙˙ñ˙ŝ˙ûùüû˙˙˙˙óûû˙˙˙˙˙˙ŭôùġò˙˙˙˙ĝü˙ô˙ùŝ˙ûû˙˙˙˙ŭ˙ġ˙ü˙ûġ˙˙ġû˙ĝî˙ŝ˙ĝ˙˙˙÷öŝ˙úŝŝ˙ŭ˙üŝ˙˙ôùŭ˙˙˙û˙ĝ˙ŝ˙˙˙÷ï˙˙ú˙˙ôö˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝö˙˙ù˙˙ö÷˙˙ŝġ÷˙˙˙˙˙ġûû˙˙˙ü÷ü˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ŭ˙˙ü˙úúŭ˙˙˙˙úúô÷˙ó˙óŭ˙˙˙ûĝ˙˙˙üûö˙ùŭ˙˙ŭŭ˙˙ġ˙˙˙ú˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙ûúü˙˙˙ŭ˙˙˙˙˙ûĝ˙˙˙˙˙˙ŭŭ˙˙˙öóŭ˙˙˙˙ŭóö˙˙˙ù˙˙ĝ˙˙ôŝ˙úġ˙˙ù˙ù˙ĝú˙˙üú˙úû˙˙˙ŝúûóù˙˙û˙ñ˙˙è˙ô˙˙ù˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ù÷˙ô˙˙˙˙˙˙˙ĝ˙˙˙˙ĝ˙÷û˙ŭ÷÷ü˙ü˙˙˙˙ŭü˙ġ˙˙ò˙˙ö˙˙ôĝ˙ŭ˙ú˙˙ü˙˙˙ĝü˙ŭûò˙˙ú˙ŝ˙ŝŭĝ˙ôŝù˙˙˙˙˙ûü˙˙ŝ˙˙ŭ˙˙ñ˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙˙üù˙ŝĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŭüú˙ĝ˙ŭ˙˙˙ö˙˙˙˙˙ô˙ĝ˙˙ü˙ŝ˙˙˙˙ŝ˙ü˙ûú˙˙ù˙˙˙ó˙˙ŝù˙ġ˙ùû˙˙û˙ŭú˙úï˙ġ˙ŝ˙÷ŭ˙˙î˙üĝ˙ŭŝúŭ˙˙úû˙ó˙ŭ˙˙˙˙˙˙˙˙˙ü˙ùú˙úüû˙ŭü˙˙ù˙˙ŭ˙û÷˙ŝ˙˙˙ï÷˙˙˙ü˙˙˙˙˙˙˙˙˙ŭ˙îŝ˙÷˙˙˙÷˙˙û˙ĝüĝ˙ò˙ŭñ˙÷ú˙ùŝ˙ĝü˙˙òû˙ú÷˙ûû˙ŭ˙˙˙ñ˙˙ó˙÷˙˙˙ô˙˙˙˙˙˙˙˙û÷ŝŭ˙÷˙ŭú˙˙˙˙˙ûùŭû˙˙˙ö˙ü˙ĝ˙˙ö˙ú˙˙ġ˙ù˙üö˙˙ŝ˙ù˙˙÷˙˙˙ŭŝĝ˙ó˙ù˙˙˙ŝûŝŭú˙˙˙öü˙ŭ˙ôŞ˙˙˙ö˙ŝ÷˙ŝŝ˙˙üŝŝ˙ûŭ˙ûû˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ò˙˙˙˙˙˙˙ûú˙˙÷˙˙˙˙˙˙˙˙˙˙ŭŭúùŭ˙˙ŝ˙˙˙úŭ˙ŭ˙˙˙ôŝ˙˙ö÷˙˙ú˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŭ˙˙˙˙ù˙ñ˙˙ŭ˙˙ù˙˙˙÷úŝú˙ġù˙÷ŝ˙˙ĝ˙˙ĝ˙˙üû˙ŭù˙˙öŝ˙˙˙˙˙˙ŭ˙ŭü˙ñ˙˙ŭ˙˙öü˙û÷˙˙˙ŝ˙˙ĝĝ˙˙˙˙ù˙ù˙ù˙û˙óü˙˙˙ùö˙÷˙˙ú˙üüŝ˙˙˙üŭ˙üú˙˙ü˙üú˙˙˙˙˙˙˙˙ü˙öŭ˙˙ö˙˙ŭŝ˙˙ŝŝ˙˙˙˙ĝ˙˙ġ˙˙˙˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙ŝ˙˙ŭ˙÷˙˙˙ô˙ñŝ˙÷˙úġ˙ŝ˙ù˙ùŭ˙ŭ˙úúï˙˙üŝü˙˙úü˙˙˙÷üġŝ˙ü˙˙˙˙˙˙˙˙˙ŭúü˙˙˙ŝ˙ŭ˙˙˙˙ŭŭŝŭ˙˙ŝŭŭ˙˙ŝüúûŝ˙˙˙˙˙˙ú˙˙÷öö÷˙˙ú˙˙˙˙úù˙˙ú˙˙ú˙˙˙î˙˙˙ŭ˙˙˙üŭ˙˙ŭ˙˙òú˙˙ŭ˙˙úú˙ê˙˙ĝ˙ŭ˙î˙ü˙˙˙˙˙˙˙˙˙˙û˙˙ŭ˙ŝü˙˙ú÷˙ŝ˙˙˙úô˙ó˙˙˙ù˙˙˙˙ù˙ŝ˙ö˙˙ĝ˙ŝüŝ˙ġ˙ú˙ĝ˙ŝ˙˙ĝĝ˙÷˙˙˙˙˙˙˙û˙˙˙˙ûú˙ûû˙˙˙˙ŝ˙˙˙ûùŭ˙ŭŝ˙˙û˙ûü˙ô˙˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĈŞ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùጲ' İ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ıú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ĝ˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭüò˙ŝñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝûĝ˙óñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙ö˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝö˙ĝ˙˙ü˙ü˙ö˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ü˙ù˙˙˙ġŭ˙ŝ˙˙ü˙˙˙˙˙˙˙˙ü˙ù˙úö˙ĝú˙˙ì˙û˙˙˙ü˙˙˙üü˙˙ĝö˙óúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ö˙ŝ˙˙ŭ˙ö˙ù˙ùúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙÷˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ô˙˙û˙ö˙˙˙ĝ˙ĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙úĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙û˙ò˙ŭüü˙î˙˙öûú˙öŭ˙ú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû÷˙÷ŭ˙ü˙ù˙˙ñú˙ö˙˙˙˙˙˙˙˙˙ĝŭï˙˙ò˙˙˙˙ôü˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙üöûü˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ü˙˙˙˙˙˙˙˙ú˙˙ùü˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ê˙çĝ˙˙˙˙ŝŝ˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙ŝ˙ú˙˙˙ûñ˙˙˙˙˙˙˙˙˙˙˙ĝ˙ü˙˙˙ĝŭ÷˙˙˙˙ù˙ùŭûŭ˙˙˙˙˙ú˙˙˙ü˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ĝŝĝ˙ĝ˙˙˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙öġ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ù˙˙˙ùö˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ò˙üù˙˙üĝ˙˙ò˙˙˙˙˙˙ï˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ï˙˙˙˙ö˙˙ġê˙˙˙˙˙˙˙˙˙ú˙˙˙ôí˙úġ˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙û˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôûí˙˙˙úü˙ô˙ŝú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĝŭ˙˙˙ôñ˙˙˙ûü˙˙˙˙˙˙˙˙˙˙ö˙ŭ˙ô˙˙˙ú˙úô˙ü˙ŭŭ˙ŝûúŭĝü˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭŭ˙˙˙ú˙ú˙ô˙˙ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üùŝ˙ùŭ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ñú˙˙˙ùŭŝ˙˙üûŝê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝó˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝù˙ù˙˙˙˙ü˙ŝ˙˙óöï˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙êŭ˙é˙˙˙ñûÒç˙˙˙˙ŭ˙˙˙˙˙˙˙˙÷úġöö˙˙û˙ĝĝ˙ŭó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝúŝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġ˙ö˙˙îü˙˙˙˙˙˙˙˙òġ˙ú÷˙ŭġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙úïŝ˙˙ġûŝùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ûö˙ŝ˙ô˙˙˙öù˙˙˙˙˙˙˙˙˙˙ü˙û˙ŝùó÷ù˙ó˙˙˙˙˙˙ŝüŭŝŭŭŭ˙ŝŝ˙˙˙ù÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙üŭû˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙ĝù˙˙ĝ˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ú˙˙öûí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ï˙òŝĝü˙ñ˙˙í˙˙ÍÎ˙à˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ü˙ôï˙ñ˙˙ġüüù˙˙˙˙˙˙˙˙˙˙ö˙˙˙ŭĠŝ÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġ˙ŭ˙ÓÓĜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öú˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙úùû˙˙˙˙˙˙˙ŝŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ĝ˙˙ôĝ×ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙˙ôï˙˙ġ˙ĝĝüüüŝ˙˙˙˙ŝ˙ġ˙ĉŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝù˙˙ŭñĝ˙˙ò˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙ò˙˙îŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ùĝö˙˙˙ŝŝ˙ŝ˙˙˙ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭó˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙÷˙˙˙ŝ˙˙ñ˙ü˙˙˙Ÿ¤Ĵ£ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝġ˙ñ˙ӗ*Œüĝ˙ü˙˙˙˙˙˙˙˙˙˙ö˙÷ï÷˙ İù˙ġ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙+Ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙÷˙˙â˙ĝ˙˙˙˙˙˙˙˙˙ĝù˙÷ò˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġü˙•Ñ™ê˙˙ŭ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙úŝ˙ù˙˙˙˙ġú˙÷˙˙˙˙˙˙˙˙˙˙˙üŝûŝ˙䨖˙˙ü˙˙ŝüŝ˙ûôג,Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙˙˙ü˘$$  ­ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ħËĵ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÚĈÑİĠ ,û¸˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĠ ,˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ËŬ ü˙ùŭ˙úú˙“#Ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭ˙˙ÂŞ)Ó˙˙˙˙ò˙˙˙˙˙˙˙˙˙÷Ö" ()Ċ˙ĝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü§ / Ħ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ô˙˙ü˙˙˙˙˙˙˙˙˙ó˙½­˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ż ´úŝĝ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ú˙÷÷˙ŒıÔö˙˙ì˙˙˙˙˙˙˙˙ġú˙˙˙ï?&èö˙˙˙˙üüûòç"¤ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÎ'$–˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôĦ'Ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïú˙Ÿ"!Ó÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ѧ% ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïÜ"„Ï˙˙ŭ˙ú˙ž' *œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôúìĝ$!$’Äŝġô˙˙˙˙˙˙˙˙˙˙ïµ *Ëû˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!#Ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú§¤!ó˙ġ˙˙˙˙˙˙˙˙ûÑ!ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó "šü˙ü˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ò˙ŭ˙ñ!™˙úú˙˙˙˙˙˙˙˙˙˙˙üû÷˙ " ˙˙ŭü˙˙˙˙˙˙ôœ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙˙ù ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ!—˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙–%#)Ċ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ï Í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öž%!˘˙ô˙˙˙ü Ñ ™˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ž ħü˙ŝ˙ġ˙˙˙˙˙˙˙˙ŭŞ˘ġŜš& Ô˙÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙•%Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ü˙ú˙˙ĝ˙ü˙˙ŝ˙ĝù˙ĝ˙ü˙˙ĝ÷˙˙û˙û˙˙˙ĝŭó˙˙˙û˙˙˙ü˙˙öŝ˙úĝŭ˙˙˙ŝù˙˙˙˙˙˙ûûŝû˙˙˙ŭŭüú# ×˙ġ˙˙˙˙˙˙˙˙˙œ#í˙˙ü˙˙ŝú˙˙˙ĝŭü˙˙ù˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ĝŭ˙üüú˙ûß "œ˙û˙ö˙ġ˙˙˙úó˙ö˙˙˙ü˙˙˙ù˙÷˙˙˙˙˙˙˙˙ŭü˙ñ˙˙ŭ˙˙˙ë˙˙˙ġ˙˙ó˙˙ŭú˙ŝŭü˙ŭ˙ġŝŭ˙ûġ˙˙ŭ˙šŭ˙˙ò˙ò˙÷˙˙˙˙ġ˙÷û˙˙Ÿ ,˙˙ü˙˙ùú˙úù˙ϒ.ù˙˙˙˙üúü˙˙˙ŭŝù˙ġü˙˙ùġ˙˙˙ù˙ü˙˙ŝ˙ìü˙÷˙˙ù˙˙ò˙˙˙˙ŝŭ˙úú˙˙ñ˙ú˙ġĠ—!ô˙˙úü˙úŭ˙˙ŭŭô˙ù˙ú˙˙ûŭŭ˙˙ŝŝüú˙ú˙ûŭü˙ù˙ó˙ò˙˙ûŝ˙˙ŭ˙˙û˙Á, Ÿŝŝŝŝ˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ùò­ ž˙˙˙ĝö˙˙ñ˙ŝ˙˙ŝ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙Ï˙óö˙˙˙˙÷ŝ˙ú˙ĝ˙û˙˙˙˙˙˙˙üü˙ú˙ĝŝ˙˙ġ˙˙ŭŝ˙üĝ˙û˙˙ñ˙ù˙÷˙ŭú˙˙ġ˙˙˙˙ùĝŭû˙˙˙˙ŭĝ˙˙˙˙ŝô˙ù˙˙ó˙˙ì˙˙ûö˙˙ó˙˙÷ŝŝ˙˙ŝ˙˙óġŝ˙ŝ˙˙˙ĝŭ˙˙˙˙˙˙˙˙˙˙ù˙ŝ÷˙˙˙ü˙˙˙öü˙û˙ŝ˙ĝ§ ˙˙˙ŭ˙Ĵ  %‘˙úġŝ˙˙˙üúŝ˙÷˙˙û˙˙ŭ˙˙ûû˙˙ġú˙ĝ˙ŭŝ˙˙ŭ˙ò˙˙ùŝ˙ĝù˙ġ˙ñ˙˙˙ü˙÷˙˙˙˙˙˙˙˙ûú˙˙ġ˙ŭŝ˙˙˙ü˙˙ġ˙ù˙˙ü˙˙ˆ,Ô˙˙˙ò˙˙üü˙˙˙˙ĝ˙ŝ˙˙˙û˙˙ù˙ûú˙˙˙ú˙˙û÷û˙˙ô˙˙óŭù˙˙÷ŭ˙üú˙ŝ˙˙˙ġ˙ŭ˙ùú˙ġŭ˙ü˙˙ŝ˙ĝ˙ü˙˙˙˙˙˙˙˙ô˙œÓŝ˙˙˙ġó˙ó˙ó˙˙˙è˙ú˙˙˙ŝ˙˙ûùù˙˙ġ˙ñ˙˙ü˙û˙˙˙ĝ˙˙˙˙˙úù˙ò˙ï÷˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝùú˙ŭ˙öŝü˙˙˙˙˙˙˙ŭû˙÷˙˙˙˙ûû˙˙û˙öôú˙˙˙˙˙òûŝû˙ŝä˙˙˙˙˙˙˙úù˙˙˙úù˙û˙˙˙˙˙ŝŝ˙˙˙˙˙•-$Ôî˙˙˙˙˙˙˙˙˙ÑĤ˙û˙÷òû˙˙˙ùġ˙˙ŝöüŭŭ˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝùùŝĝ˙ê˙ġ˙˙ŭ÷Ö#Ï˙˙ò˙ŭ˙úŝú˙˙˙˙ü˙˙˙˙öô˙ü˙˙˙˙˙˙˙˙˙˙ŭ˙ġ˙ü˙û˙ü˙˙ôò˙˙˙ŝô˙üç˙˙üĝŝ˙˙ŭ˙ù˙˙ëŭ˙'²úŭû˙ú˙ŝó˙ûò˙˙û˙óú˙˙˙ %)ħó÷ŭú˙˙˙˙˙˙úÑ˙'ŭ˙ò˙öô˙˙˙ûüï˙˙˙˙˙˙˙ó˙û˙éö˙˙˙üüġ˙˙ĝ˙˙ò÷˙ġü˙ġüíŝĝ˙ù˙˙÷ü˙˙˙÷˙ü˙˙ùöú˙˙˙ù˙û˙˙˙êŭû˙˙ŭ˙˙˙÷ñ˙ú˙ŝŝù˙˙˙ŝü˙ġŭüŝ˙ġ˙˙ù÷ü˙˙ü˙úŸ µôûüŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùûĉ÷Ñ%%ñŝ˙â˙˙ñù˙ù˙ñôŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ§š¤ì˙˙˙˙˙ñ˙˙ùî˙˙ò˙˙˙ŭĝö˙˙˙˙˙˙˙ĝ˙˙˙ŝì˙ĝ˙˙ŝ˙˙˙˙ùö˙˙˙˙û˙ôĝ˙ïû˙˙÷˙î˙˙˙˙ŝ˙ù˙ĝŝ˙˙ê˙ë˙˙í˙ĝ÷˙ö˙ö˙˙ú˙ö˙ŝü˙˙˙ó˙˙óù˙˙˙˙ûĝ˙ŝ˙ùŭ˙í˙˙˙˙˙˙˙˙˙úü˙ĝì˙˙úŝö˙˙˙ŭ÷ûô˙Ÿ¨˙é˙˙ë¤ (ú˙ĝŭ˙˙òìŭ˙ġŭü˙û˙˙˙˙üùŝ˙˙í˙ü˙˙—Ğû˙öŝĝ÷ûü˙ôŭ˙÷˙˙˙öî˙úö˙˙˙˙˙˙˙˙˙˙û˙÷˙ŝ˙ŝ˙˙˙é˙˙˙˙ö˙˙˙ùòŭ˙üù˙ü˙ë˙˙ûê˙Ù * +Äġ˙˙ú˙˙˙ġ˙˙ŝ˙÷ŝù˙ï˙ŝ˙÷˙ĝ˙ĉ˙˙öñ÷ú˙ì˙˙ö˙˙˙ŭ˙ó˙˙ì˙û÷ùù˙ŝġ˙˙˙˙˙˙˙˙˙˙˙˙ŝĦ% Ï˙ŭ˙ù˙˙ü˙ŝ˙ùô˙˙ú˙˙ò˙˙ë˙ù˙˙ö˙˙û˙èó˙˙ġŝ÷ü˙öŭĝ˙ŝ˙˙˙˙ü˙˙˙ù˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙ü˙ĝüô˙ö˙ŭġ˙úòü˙˙˙˙ñ˙˙ŝ˙˙úùŝ˙˙˙ŭü˙ûùĝû˙˙û÷˙˙˙˙ñ˙˙ġ˙˙˙úġ˙˙˙˙˙ù˙ôüġ˙ŭû˙˙ĝ÷ü˙È ˙˙˙˙˙˙˙˙˙˙Ñ'Çû˙˙˙˙ûġĝ˙ŭ˙úü˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙ü˙˙Ùé÷˙ü˙ò˙ġ˙Ž#(ŝ˙˙÷˙ò˙˙˙ö˙˙ĝ˙÷ŝúò˙÷˙ŭêŝ˙˙˙˙˙˙˙˙ŝü˙ŭ˙ü˙ĝó˙˙ç˙˙˙ŭù˙óŝ˙˙ŭ˙˙û˙˙˙öġŝ˙òŭ˙ô˙öĜ(Ğ˙ĝ˙í˙˙˙ĉ˙ôŝ˙ŝù˙òó˙ï˙ŝŭ )Ò˙˙ĝ˙ĝĝùóö˙˙˙üû˙˙ü˙˙˙˙ĝŝ˙˙˙˙ööîĝŝ˙ü˙ŭĝ˙öùò˙˙˙ŝ˙˙ùñ˙ŝ˙ŝü˙˙˙ú˙˙ŭùü˙˙˙ìüò˙˙ŭ#3 Â˙ú˙˙ïŭé˙˙˙òŭ˙˙î˙˙üĝ˙ë˙ŭ˙ŝ˙ö÷˙˙˙÷óŭ˙î˙˙˙òĝ˙ŝ˙˙˙ŝü˙÷˙ž)˙˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùûù˙ÁŠ˙˙˙ö˙ù˙Ѳî˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙ò˙˙üŭ˙ï˙˙˙ïè˙˙ù˙÷˙ŝŭù÷ì˙ŝñ˙˙˙˙úö˙˙˙üúûŭ˙˙˙ŝ˙ûġ˙ë˙˙í˙˙û˙ï˙ú˙˙˙ñ˙˙ú˙ñ˙˙ġ˙ç˙˙ŝù˙Î˙ñ˙˙ó˙ŝò˙˙˙ü˙÷ġù˙ü˙˙˙˙àòċ÷ŝ˙ŝùŝ˙˙ù˙˙˙˙˙˙˙˙˙ìŭ˙˙˙˙ü˙˙ŭŭ˙î˙ĝ˙˙ŭ$úö˙ü×˙”% ˜˙ô˙˙ĝ˙û˙˙ĝ˙˙ĉáù÷÷úüŭŝ˙˙ŝŭ˙˙ç˙˙˘÷˙˙˙˙˙˙â˙˙˙˙Ä˙ŝ˙˙û˙˙÷˙˙˙˙˙˙˙˙ġ˙˙˙ò˙˙ûôö˙÷êò˙óġĝò˙ü˙Ċ˙ĝ˙˙ŝĝ˙ŝî˙˙˙ñĊ$&Ô˙ì˙˙˙úú˙ŭĝ˙éŝ˙˙˙è˙˙íú˙˙˙˙öî˙˙î˙úŝ˙ŭú˙˙ú˙˙Ë˙ĝ˙˙ùġ˙ü˙ï˙˙ñî˙ñ˙˙˙˙˙˙˙˙ĝò´$#ŝġ˙ù˙˙ó˙ŝô÷˙˙û˙óü˙ü˙Ï˙˙˙ö˙Íġ˙ò˙˙˙˙˙ù˙ĝïŝ˙ù˙Ë˙˙èú˙˙ùĝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙ú˙˙˙˙ġ˙˙˙˙ŝ˙ŭú˙ŝ˙˙˙˙ûùĝ˙û˙éŝû˙ù˙ú˙˙˙ġ˙ûû÷˙ġ˙˙˙ö˙úŝ˙˙ŝ˙˙˙ġûġ˙˙˙üŝŭŝ˙˙˙˙˙˙ÊÍ˙˙˙˙˙˙˙˙˙˙ŭë˙˙˙˙˙ñúúŝ˙˙ùŭŝ˙ŭ˙ŭìù˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙ö˙û˙úŭ˙ï˙˙˙ûĴ #˙ĝñü˙˙˙˙˙ôŝŝ˙˙˙˙ú˙˙ùûú˙˙˙˙˙˙˙˙˙˙˙ŝü˙ŝù˙ù˙˙˙˙ûû˙˙˙˙˙ä˙˙ñŭŝúĝò˙˙˙˙˙ġ˙˙ù˙˙ò˙ûë˙ĝ˙˙ó˙˙ŭ˙ä˙ú˙ġ˙˙˙˙î˙˙ûôü˙˙˙˙˙˙ŝ˙ûôÖ5˙˙˙˙˙ġö˙˙ġûú˙˙˙˙˙˙˙ġ˙˙˙˙ï˙˙ñ˙ġú˙ó˙˙˙ó˙˙óò˙ô˙óŭĝ˙˙˙ú˙ô˙˙˙öĝĝ,˙˙úŭñ˙˙˙óùü˙˙ĉ˙Û˙ŝ˙˙ê˙ó˙ôû˙ü˙˙üö˙˙˙ŭòö˙ĝ˙˙ï˙˙öô˙˙öĝ˙ɧ'Ş˙ĝŭ˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙°àí˙ĝ˙÷˙›£˙Ĉë˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙öùĝ˙˙˙˙óú˙ü˙˙é˙ġ˙˙ŭûĝ˙ĝü˙˙˙˙˙ù˙˙ùó˙ò˙˙˙ùŭ˙˙ŭúü÷˙˙˙ŭ˙û˙ñö˙˙ġüŝ˙˙˙è˙˙ġ˙˙˙˙˙ïü˙ùûùŭġ˙˙ŝ˙ï˙˙˙ù˙˙óï˙˙û˙ì˙ŝó˙˙˙ŝġĠ˙ù˙˙ĝŭö˙˙˙˙˙˙˙˙˙˙˙ñĝ˙ĝù˙üúü˙ĉ˙÷ñŝ˙£ ˙˙òù˙ó˙û˙˙óü˙÷ĝñ˙ñŝ˙˙ò˙˙ùġ˙˙˙ü˙ûüĝ˙˙(Û˙ŭûûéûñ˙ùùîġ˙˙˙ù÷˙÷ġü˙˙˙˙˙˙˙˙˙û˙úŭ˙˙˙ö˙˙üúûŝ˙˙ß˙˙˙îġ˙ô˙ùóó˙˙ġü˙ûôġ˙Ò% İŭ˙˙üúü˙˙˙ô˙û˙˙˙üŭ˙˙˙˙˙ġüúü˙˙˙ĉ˙˙òö˙ö˙ôŭ˙úŭ˙÷˙˙ôú˙˙˙ŝ˙ĝñ˙ú˙ü˙˙˙˙˙˙˙˙ü˙ĈĦ˙Ó˙üùŝ˙˙ô˙˙ûó˙ù˙ÑÌÏúĴĞĜ˙˙ö˙ó˙Ôĝ˙˙™¨Á˙ó˙˙úÑ'šß˙˙óú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙˙ġĝ£˙˙òü˙ü˙˙˙ĝ˙û˙íò˙ŝ˙˙˙˙˙˙˙ŭ˙ŝ˙öú˙˙ŝ˙û˙˙ù˙ö˙É˙˙ù˙ĝŭġ˙ĝú˙˙˙íĝ˙˙˙˙úù˙˙÷ö˙™ Ħ˙ë˙˙˙˙˙˙˙˙˙ü÷˙ôô˙ô˙˙˙ûûü˙˙˙üĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙ö˙§Ĉ˙ĝë˙ú˙˙˙œü˙˙˙˙òó˙˙˙˙ú˙ë˙î˙ġô˙Ó÷ù˙˙˙˙˙˙˙˙˙˙˙û˙úŝ˙˙ùŭúúú˙÷ù˙óé˙˙˙ûŝ÷˙˙˙˙˙ü˙ĝ˙ï÷˙ö˙ġŝ˙ŝŝ÷˙üĝ˙ì˙ĝò˙˙˙˙üÌ˙ôö˙ġñÊ˙˙ïòŭ˙üû˙˙û˙Òó˙Äú˙˙˙˙˙˙ü˙˙˙ĝ˙ŝñú˙ò÷˙ú˙˙˙˙ûÙù˙˙˙ë˙ùí˙üùú˙˙û˙òŝö˙íŬùöú˙ŝöï˙ĝ˙ŝĝ˙˙ù˙ö˙˙òŝúúó˙˙˙˙ó˙˙üŝ˙÷˙˙ö˙˙˙˙˙˙˙ä˙ŝġûŭ˙˙˙˙˙ú ‹˙ĉïùŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ü÷˙Â#Ô˙ĝú˙˙üž!˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ôĝ˙ë˙˙˙ù˙ġ˙˙ĉ˙½úŭ˙˙˙÷˙˙ŭûù˙ñÒ˙ê˙˙û˙ŭ˙ûû˙ŭĝ˙˙ŭŭ÷˙ó˙ñúÛ˙ù˙ûŭ˙÷˙˙˙ŭ˙óü˙ú˙˙˙üĤš˙üŬĴ§˙˙˙˙˙˙é˙˙ڏ£œ‘ó˙˙ùú˙‘˜£ ĝŭ˙ĝŸ¨˙˙˙˙˙˙˙˙˙˙˙ä˙˙éúŝ˙ö˙˙˙˙˙ŝ˙˙úĈüġ˙˙˙˘ Òöüéú˙˙˙ü䛞¤–˙Âó˙˙˙ù÷˙˙üŭ˙˙˘˙˙é˙˙˙˙˙ŝû䏕™ß˙ü˙˙ĝû˙˙˙˙˙˙˙˙˙˙ù˙˙ì˙˙ûü¨Ħ Ôé˙ùí˙û˙˙ìĤ Ŝġ˙˙˙Ĉ˙î˙˙û˙˙ż-İĝó˙˙˙˙Óô˙ü˙ġ߯›Òú˙͙¤Ò˙üú˙ñ˙öö˙˙ŭĴœĞíú˙˙˙¸Í˘–ĞŻ’˙ô˙˙˙˙˙˙˙˙˙ŭ˙â ¨Êŭ췏Ù˙÷˙ĝñ˙û˙˙"!!˙˙˙˜˘Ĥ ŸÎœ"# Ĥ˙ŭöË#( ¤˙û˙˙úüû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙ûâ Ò˙˙˙˙ĝôŭ˙ŝ˙ĝ˙˙ŭ˙ġĝü˙ùê˙˙˙ù˙˙˙ú˙ñûü˙úĉ˙˙ó˙üŝù˙˙ô˙˙˙û˙˙úú˙˙˙ŝ˙˙˙ù÷˙˙˙ö˙œ ü˙˙˙˙˙˙˙˙˙ó˙÷ù˙˙ö˙ŝù˙˙ù˙˙ĝ˙ŝ˙öó˙÷ü˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙˙˘˙˙ġ˙˙˙ô˙£&$˙ġ˙˙˙˙˙ŭ˙˙ó˙ò˙˙˙ĊĠÎ˙ú˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙ò˙˙˙˙˙˙ü˙ŭúû˙˙ïû˙ŝ˙˙üä˙üö˙ġú˙˙˙˙˙˙üë˙˙üñĝ˙˙˙˙ôŝç÷˙ñÒ˙˙ï˙˙áÛéßßÏó˙˙ŭ˙ğ$˙˙˙ĜÒÜġ˙úú˙˙ê˙ô˙ĠĠİÒŝàô˙ĝ˙˙ĝ˙ö˙ŭö˙ŝ˙˙¨šÎ˙ŭ˙ú˙ÌÛÜ˙˙˙ÍÇâ˙ú˙ Ĝ§"ŽĜÏ˙öö˙˙ó˙˙ÑÖ #żÏ˙˙˙öùó˙˙ñ˙Ŝ—œÀÖ˙û˙˙˙˙úíĝ˙÷Ó֞%Ŭŝóù˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭ˙ŝÊ˙ĝ˙˙ú Ÿöŝ˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙ÀϲÀÎ˙úüñ˙˙˘(1–˙öô˙ŭ˙ù˙˙ŭ˙˙ȰĦİÓ˙˙û˙˙Çњ#˙àŞ Ĥô˙í˙˙˧ Ìèñô˙˙ˆ!' Ì˙ŭúĝ˙ñɛ+ 6˘˙ŭ…8!ʸ)ĝ˙˙˙˙˙˙˙˙ĝ˙ġú˙Ï( " ­Ġġ÷˙è˙ŭİ" ù˙˙ü  )š˙˙˙˙ì˙û¤ -•ŭ˙˙êû˙˙ûŭ˙ġŭĴ  Á˙˙˙ž#(˙ûï˙÷˙˙˙˙˙˙˙˙ô˙˙˙üü˙ż*%!, ˜˙˙ŝî˙£ *ͤ $£Îò˙ŭŝŝ˙ È˙˙ŭġ˙ŝÔ(# Ĥ˙˙˙¨''˙™#Íż$°óá 'Ĥ˙˙ġĥı$ Óó˙˙˙˙˙˙˙˙˙éŝ“Û ú˙˙ûġ˙Ġ #›˙Á)0’˙˙š!) ' ('­ù˙˙˙ĝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ìŝÄ!˙˙òÏü˙˙ûüŭŝ˙é˙ŝñ˙˙˙û˙˙˙˙ġü÷˙û˙ĝ˙˙˙ô˙îò˙ôšİô˙ŝ˙ëĊ!™˙ë˙˙˙ĝĝ˙˙˙úû˙˙û§ö˙˙˙˙˙˙˙˙˙ù˙˙òû÷ï˙˙÷˙˙ú˙˙ó˙í˙Ġ˘˜İ˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙죜ĝĜ•˙ñ˙˙”.˙˙ġÔĝ˙ö˙ö˙˙û˙˙Ŭ ,!Ùô˙˙˙˙˙˙˙˙ŝû˙ŭ˙ü˜­ĦöËŭ˘§”˙÷˙˙˙ô˙˙ë"˘µÉè˙ñü˙ĝħŞÑï˙˙ġġ˙Àµ°ùĠ)™Ó˙ŝò"  œš 'ŭ˙÷˙ö›!Ĥ ˘5à˙ŝ˙ç˙½ ž÷˙ĝ˙ġĴ”Ë˙ñ‘'Ä˙˙Ĝ‰4°’“˙˙ŭ( )˙˙˙ïŭ˙ŭÌ" Èĝ˙˙˙ú˙öŻ&$ *˙ô˙˙ŝ˙ŭÒ·‚.œİÌ˙˙˙˙˙˙ŝüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝ˙˙“ #Ú÷˙˙ŝË ! !"à÷˙˙ú˙˙ŭ˙˙˙˙˙˙˙˙§! ˙û˙òÛ)#–˙˙û˙ŝöŝ˙˙ë°( +( 3ˆÓúĝž-Ŭ˙ŭ˙$*³˙ŭüö& ("ï˙˙˙˙˙ &“Ş! Ĥ˙Ú(˙˙˙˙˙˙˙˙˙˙ġü°))ĝ˙˙Ü˙˙$˙ûüóı#û˙íî˙ú­ÒĴ !%˙˙û÷ú˙òġ˙ŭ. !š˙˙Ǩ *Îùú˙˙˙˙˙˙˙˙˙˙˙öî˙˙è.%* ò˙˙ü˙š -& #œŭû˙îĴ!(ìô˙÷˙˙Ï˙šĞ,$˙ŝĊ ) “ğ# Ŝ /ĴÉö˙- *˙˙˙˙˙˙˙˙˙ü˙˙$  °Ôú˙û˙™(¨ġö°% ˙˙š˙Ħ›šĤŞžöŝü˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è² #™Ĥ–ĝ˙ûŝ˙ŭ*Èô˙˙ôĜ Î˙ž)àĝÌ ˙  ˙ò˙Ċ!2-ú˙˙ú˙˙쳘Ħ›Ĵ ˙ô˙˙˙˙˙˙˙˙˙¨Ÿ ĝŭ˙û÷œ”ß™%#˜˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²Ó–˙ùŭĤ !˙˙$œ˙ŝ˙˙ġú&›²¤˙˙˙˙˙˙˙˙ŝü˙ûûÏ&,İ!Î˙˙üû˙Ĥ*Ò˙˙Ä£˙ï˙˙˙˜"“-  %!”˙ŭ˙"$&¨üüû˙ %+ -›ò˙ó˙óĦ- œÔ'ġ˙ûŭ# !˙˙Ÿ  ˙ô˙' % §ġ˙˙& Î˙Ì ¨öË˙˙ŭ“,%ŸÇĠì˙ŭ˙À)­Èĝ£ Üġûŭú˘# $¤žú˙˙ŝûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ùŭüĞÌŭ˙ñÙ˘"Ïñ˙˙ú˙˙ù˙˙˙˙˙˙˙˙˜!#Ä˙ñ˙”"úĦ!%ë˙˙ŝ˙˙ù˙ܢ" ž .Ħü˙Ÿ#"Ĉ˙˙Ħ"&š˙ŭ˙• #÷û˙ùœÏ˙˙˙(žŝŝ" •ŝ˙˙˙˙˙˙˙˙ŭ˙òœ  ›ü.!úÄ˙ŝ'ôŝ˙ö˙Ħ˙ñ˙˙ĝڛ –ûÖĤ˙˙˙˙ŭú˙˙ö˙œ¤˙˙òĦ!!ž˙ŭŻÔ÷ŝ˙˙˙˙˙˙˙˙˙÷˙˙÷̨£Ïŭ˙˙ġ!(¤ûŝ˙˙ù›!˙˙ü˙÷˙ "ŝ˙÷˙˙ŭ " *˙›İó˙Ĵ¨˙ô $˙˙˙˙˙˙˙˙˙úĞ$ĦúÖÖ Î˙ù˙$›¤Ĥ• ,Éĝ˙"Ĵüŭ˙ޝĦ# Ï˙ù˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭġĴ! # ˙˙ï˙ ˙˙Ŭú§"˘$ !žĈ¤"˙ġĊ˙ŝù˙ŭŞ ˙˙˙˙˙˙˙˙˙›˘˙˙˙Í $ û˙ĝŝ˙˙˙˙ĝ˙˙û˙˙˙#*İó˙ġ(Ô˙ĝû˘! Ĥ˙î˙Ġ”0˜˙˙ŝ§Ï˙ù˙˙ġ˙˙˙úġ˙˙°= ž Ó ù˙ûú! ˙ĝ˙ ˙˙ !, ˙˙÷˙§Ü˙ùĞ%ż˙ú÷! %—ŸÛž""û˙˙˙Î"É××£%Á˙˙˙˜$Üŭ˙Ñ÷ü˙ž"Ĵ˙ù×Ì ˙ò˙Ċ$  $ž˙ù˙£úÏŭÓŝŭ˙ŝĠ-Èó˙ŭùŸÔüö˙¤ŝú÷˙ö˙˙ö¤" Û˙úŞ ˙ŝ˙˙÷û˙˙ŝ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ŝ˙ú˙ŝĈÓö˙˙ŭŞ   ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê&%Ÿ˙Ï˙!Ò˙˜˙˙ñ˙˙˙˙ĝù˙˙*Î˙˙"×ùŝÛô£!Ô˙ŝ÷­!ÛŭġÛ¨ÓËĤ˙˙ž›ŜŸÑŝ˙Ĵ!וɭÈ˙˙˙˙˙˙˙˙˙÷˙ŭ"÷÷Û!˙˙û˙¤ *˙˙í˙É ˙˙˙óáĦü˙˙ó˙Ĵî˙˙ù˙˙ùüû˙ĝ˙˙ö˙÷Ûžüĝ˙Îŭ Ĥġ˙˙˙˙˙˙˙˙˙˙ŭġú˙  ŝġ˙ô#&˙˙úËÌ˙˙ùŸ˙ô˙˙¤"ü˙˙Ïŝš ˜ ŜúûĦ&ÔÏ˙ü˘Ž˙˙š!Ġûü˙Ê ˘ïîôŝ˙ŝŝ˙˙˙)Ċù˙ŝĈÌ˙ö˙—Û˙ü¤" ˙ù˙ô˙˙£Í˙˙ü˙˙úü˙üû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙¨, '"İúùß˙úòÍ% ˙˙ 3! Ĥ˙ !°öû#'!Ĥŝ˙˙—ğ ş˙˙˙˙˙˙˙˙˙!"%Ğìôŭâ%Ĝ˙÷*Ĵġ˙˙˙ù˙˙˙˙˙úûñò%##Ë˙ú˙˙˙ Ïê˙˙ġ &–ö˙úÔ)˙˙ñïĴžöŝü˙÷˙˙÷˙˙ġ˙˙ĉ´˙˙ô˙ #" ˙˙ü˙"Ĝǘž,"Êŝ˙œ˙ù˙ÊËú˙,!"ò˙˙ó˙˙'ż˙÷ĝÎ( ò˙úŭâĦŝúŭ1!üû1œ˙ŭġ,°˙˙ñ $—˙í˙µ˙ġü÷í*#ßì˙˙˙˙˙ŝ+É˙˙˙ï-ú˙ŭ÷Ĵ +Ö˙î˙üĦ%Íû˙ ' ˙˙˙ú˙˜%%ûú˙ %-žöûöËı˙ĝö˙ŝ˙ü˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŻÓùĝ˙˙ñŬ%ŝ˙ñù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŭá !˙ùô˙ó˙˙İ–­˙è˙ñŭ÷˙˙˙ġû˙¤ Ñ˙ŭ˙˙ù'˙˙˙˙ĤÛô˙˙÷ù˙’ú˙óġ˙Ċ ×˙˙üÈ˙˙ö˙›-ô˙(,˙˙Ž(˙˙üĝüú˙˙˙˙˙˙˙˙˙˙$"Ħ˙˙î˙ %ôġ˙ò)İŭú˙úÊò˙˙˙Ċ'Ô÷ŝö˙˙˙ "˙˙˙ü˙˙˙˙ôœ$öù˙˙î˙” Ò˙ĝ˙ĝóĴ Ûñ˙˙˙˙˙˙˙˙÷˙˙˙…!#ôî˙˙Â˙ Ô˙˙Ô Óî˙˙ö˙™+˙˙ö˙–û˙ûüÒ-! (³ ”²ù˙˙˙Ú˙ú÷˙ôö˙ ĞûŭĞ ˙˙˙è&% "%!&ôûùü˙˙ŝü˙ċ˙Í •˙˙˙ûÜ$# ¤ŝ˙˙ž"–Ş”˘İÎ˙ûŭù˙Î!œ˙˙˙ŭ˙Î"¤Ô™™˙Ú÷˙ü˙î˙öû˙˙˙ùüó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üú˙˙Â0* $ "ÁÒ˙ $ İú˙Ĉš ĝŝĝÒ#!Ğ˙‡œ˙÷ŝŻ+ !"ê˙   #& ë˙ù˙Ô˙ü˙Ä!ûü˙˙˙˙˙˙˙˙’$˙ù˙úâĝ˙üž+½˙˙ù˙ü˙ùñüĝŭ˙˙˙#›ùÚĝ˙û÷ü1¨ŭ˙ġŝ›Ĵ˙˙û—™ŠŻßž"­ù˙˙˙ĝ˙û˙˙ŝûü˙˙ú Ħ˙ï˙˙˙ùùĊ 0Ğ˘ +$ Û˙“Ĵü˙÷" Ĥ˙˙ó˙'“˙ù˙˙ûù ŭ˙˙ĝ£ '˙ù˙˙í&%£Ùó˙öêğ !ŝĝÙ–Ŭù˙˙î˙˙!$ž˙˙˙È#)œĝù˙˙‹÷˙˙˙қ ŭ˙öí˙˙ïû¨*úôò˙˙„#ŭ˙ŝ˙!ŝü˙üŭ˙ İà˜! Êé˙ŭù˙ù ÏŝÖ ŝ˙˙Öü˙˙úûöú˙ŝíŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙ĝ˙û˙œÌ˙ŝŭŝ˙Ċ* *ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙$˙üŭ˙!  ž É˙ûÁ˙ú˙˙˙˙î˙ú˙ !Ğûĝ˙˙˙Ħ*˙ùó˙£É˙ù˙˙ö˙î#(˙è˙˙ì˙§&Ġ˙÷$ñüŭ˙ù #Ŭ÷ Á˙µ#œ˙ù˙ò˙ !ùô˙ò˙˙ù˙˙˙˙˙˙˙˙ô˙˙ıêÌû˙˙˙ÁÙú˙ĝ˙ÍŞóĠ˙˙Ü˙ìù˙ Öï˙˙˙çöŞĜ˙ûŭ˙îĝ˙ŭÌŻ ˙Ï÷û˙˙ ˙˙÷ù˙˙Ï˙˙˙˙˙˙˙˙˙˙úŝ˙$ñ˙öùü˙ŝ Ĉ˙ûÇ&ùû˙öß˙  Ĵññŝ,ĝúó˙™Ô˙ÚùÚú˙ĝñô˙ú°!Òöŭ˙˙ü˙˙™ (ùŝĤ'˙ôö˙Ÿ&§ÚÑÊÙ×ĵÏĝ˙˙˙˙˙˙ŝŭŝ˙÷Ĥ§üüùîÜ ÌöóÓ˙É˙˙ĝè˙ĝú˙û*Şñŭó˙˙Ÿ˙ò˙˙˙úĝ˙˙ú˙ûù˙˙ŝí˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ü˙ó˘ ĝ˙ô˙ŭ˙%!Ĉ"˙ó˙˙Î! $Èòä˙ë˙öÒ ŞÈÌ˙û™, Ğĝ˙üħÊ˙ó˙ù˙%ü˙˙˙˙˙˙˙˙˙› ³˙˙ŝ¨% +ïú˙˙İÛ˙ù˙ú˙ú˙˙˙˙˙íö)% ˙÷˙öú˙ù•î˙ĝù˙Ô”˙ĝ˙, ĈİŞÑ˙û˙˙úüû˙íú˙˙ñ÷˙•Ûñû˙ûâ™í˙˙‰ŸŒ°†¸Ĉû˙üžĝö˙–˙á˙ú' ˙˙ñŭ˙˙˙)ġ˙ù˙Ĵ˙˙ôÛ˙šñáü˙˙Ĉ# ˙˙"³ê˙óĝú˙˙, %˜ûû˙ú ž˙ĝùù ğ˙ô˙íÒ ˙Ê˙˙êŝ˙˙ö ô˙˙Ö˙˙˙ĝ ˘ĝ˙ŭó˙˙" £ü+˙˙úö˙Ü˙°£É˜5˙ĝ˙ĝ1ü˙ò˙í˙ñŝ˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙û˙ŭŭĦ Â˙˙ó˙ġ˙Żùñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝôœ !˙ù˙÷ğ0!#ĵ˙ù˙üö˙˙ù˙ù˙˙$Ğû˙óöĝ ’˙˙˙˙”Ħ˙ú˙˙˙˙žÒ˙ġúûú猒˙ġ˙ ˙˙ó˙˙Ó š*Ù˙÷ŝ÷öŭŝŭüú˙˙Û œ˙ŝúĝŭ÷˙˙˙˙˙˙˙˙˙˙ò˙˙ì˙ŭüŝ˙% Ä˙˙ŭ˙£ +˙ñŝ˙Âò˙÷˙ !ü˙üûò˙û+Ĝ˙úĝ˙˙˙ô˙˙“(˙˙ŝù˙ù£#ûŭ˙ö˙˙ŭî˙˙˙˙˙˙˙˙˙ï˙È# ­˙óü˙üŭŭ'˙ûÏ˙ŭ˙˙öĦ˙˙˙%ú˙˙òÑ$˙è˙˙óŝ˙˙˙˙ŭ˙ö&Ġô˙û˙˙ûïĥ! Ò˙˙˙˙ġ˙#İ÷ú˙÷ù˙˙˙ñ˙ŝŭŝ˙ŝ˙˙˙˙Ä  Ù˙˙˙˙Ó˙˙˜!ŝŝÚ˙ŭú˙ú˙ŝ˙ŭÁ! ²ŭ÷˙öœċ˙ġ˙ŝ˙ú˙˙úÚÔ˙˙˙ŭû˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ùŝ˙ĝÎ#'Çŭ˙˙!œž&üԗ˙ï˙òùÓ ˙ŝù˙û˙ŭ˙Żûñ˙˙˙$§äàÊú˙ŝ˙î˙ùÎ  ˙˙ŭöŝñ. -Âŭ˙˙˙˙˙˙˙˙˙ö#˘Ġ˙ĝĉÚ  ĥ˙˙÷ùž+˘éó˙˙ñ˙˙öúöû˙û˙ô ˙˙ô˙˙˙÷˙ô˙÷˙ş!¤ŝ˙˙ —ġÊ˙û˙ô˙û˙˙óú˙˙˙˙˙ŭ˙˙ĝ˙˙˙4 ˙˙˙ŝ "˙ĠÚ# ĴÑß˙˙˙˙ñ˙˙˙èÈ"Ş˙˙ùĠ#Ï˙ŝ÷%üü˙˙îĝùŸû˙˙úü”&úî˙ì˙š.˙ĝñùĝ( ˙$˜÷ŭ˙˙˙ġ÷ÈŸ˙û˙˙ $ ŭ˙˙Îĝû˙ċ˙˙Ÿšïù˙ñ˙÷úŝû#’˙˙ç˙ŝ™'!˙÷ô˙$$˘˙ò˙˙ŝöÂ"œÔÏí˙˙˙ò ˘˙# üù˙ŝ–˙ù˙˙˙˙˙÷˙ö˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ú˙ŝ˙ĝĥ"Ñóŭŝ˙ŝô›žÛ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙­1ë˙˙˙ċô— 2•ûù˙˙ùü˙˙ŝú˙‘˘ŭ˙˙˙˙Ô$úì˙À·#ŝùŝ˙ĝñ( $Ħò˙˙˙˙˙É"Çġ˙–˙ġ˙ĝçú$&Ÿ*û˙˙í˙˙ġ˙ġ˙˙û˙˙˙ŝ˙ü˙ĝú˙˙˙˙˙˙˙˙˙˙˙óû˙˙ġ÷˙˙“ Ŝŝ˙˙êŞŞúŝ˙˙ı%˙ô˙ö˙ç˙˙úŭŭĤżû˙˙˙÷ü˙˙œ˙ŭ˙ŝŝ˙›Öóŭ˙üûô ' ˙˙˙˙˙˙˙˙˙ù˙˙Î ”ü˙˙úŭû˙!Â˙ùĜ˙˙ĝ˙˙˙™¨òĈü*" Éò˙Ĉž˙í˙˙˙˙ù˙˙˙4!˙ö˙˙ü˙˙ĉ˙"$/˘Ì˙˙íĦ'#˘˙ö˙÷˙˙˙˙üŭüûü˙˙˙ö˙Ú$Ħ˙ŝùúĊĝ˙Ċ ˙÷˙ñ˙áġġö˙˙úÔŞú˙˙ĝöż '˙ùùú˙˙ġŭ˙˙Í#ġùùùü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙üö˙˙ž Ŝùúĝß $ ‘˙˙ŝüŝúŝ˙˙˙˙Ú +˙ê˙˙ôûŭ —ÖŬûòû 4Ġü˙˙úŭ˙ò˙ĉ˙×.ċ˙ú˙˙˙– ˙˙˙˙˙˙˙˙˙˙˙Ë%Ÿû˙˙˙# Î˙î˙˙˙ ß˙˙ùù˙˙˙˙˙˙˙˙˙˙1(™˙é˙˙öú˙’Ôí˙öëÜ&ĦüóÒĠ˙òġ˙ñ˙ò˙ú˙˙ùĝ˙˙û˙˙˙ùó˙˙ô%áûî˙ŝœ# ŭ˙û $’˙˙ïüŭ˙úú˙˙˙Ú/Çñ˙ñ˙š$Ċ÷˙˙Ĵ˙ê˙˙˙˙ŭÜ˙ôù˙˙ . ˙ô˙ġ2Ÿì˙˙˙˙ü 'žòĥ *˙˙˙ü˙ġ˙Ş$ ˙í˙ïúŝ˙˙Ĉ!˘ŭĝ˙ü˙˜&˙˙ŝùŭġ˙ù* Żí˙˙ùß ˙˙ü˙ ¨÷˙ŝ˙í˙°(˘û"Ê˙ûŝù˙ž&˙òĤ ˙˙˙í ˙˙ĝ˙öüüġ˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ù˙û˙÷ÁŬĝú˙ò˙Òĥœûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“! Î˙ġŝğ˙¸1 #¤˙öùí˙úúú˙ŝÛ.!›ŭú˙ó˙ŝ , ˙˙÷˙˘'ó˙˙ñ˙Û+˙˙ò˙üñ݃˙òÈ1%ì˙÷˙˙˙ ʵ&ĦùÁ˙˙÷÷ü˙îĝ˙êĝĠç˙ñŭ˙ô˙ĝ˙˙˙˙˙˙˙˙ù˙˙˙"#Ñ˙÷˙›*&´˙ô˙˙ä% š˙ŭù˙Û•˙Ò˙#ĤöÇ˙û˙˙  Û˙ŝ˙ú˙úŭùŜ%ò˙èŝŭ˙ Ġ˙Èŝú˙Ó )‰÷˙˙˙˙˙˙˙˙ú˙ġ˙$Ú˙ùĝ˙˙˙,ÙŭîÎ÷˙˙ùê˙á ¤û˙˙Ĉ" Ğ˙ĝ˙ŝû˙ûôĝ˙˙˙úĉ˙Ë"Û˙îû˙ü˙˙ìĞ "!×˙éî˙ٝÒ˙˙˙˙ô˙î˙˙˙ŭŭ˙˙ŭ˙˙ž˙üúóċĠ˙ŭٟ •˙ĝ˙ŭù×Ĝ˙ôŝûÈ"‹˙˙˙ĝ˙ï üí˙ĝ˙Ċ¨˙˙È!%òö˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙÷˙ĝ' +˙˙ú˙Ċ%Ìö˙òûŝ˙ùüòù˙úÈ" £˙û÷˙éĝ˙˙!"§ò÷ùù˙˙#˙òüġ˙˙íÙ˙ŝ™˙ù˙ôÌŝ¤ !¨ï˙˙˙˙˙˙˙˙˙˙ë/ Üü˙üòÔ§Ġ˙˙˙ìÙ'ßè˙˙ô˙˙ùŝ÷ŝû÷ŭùŭ(§˙ü˙˙˙û˙%ŝ˙ú˙˙ùš˙˙ïÙ÷û˙ú˙˙÷óü˙˙˙ù˙˙ûŭüû˙˙˙ŝ˙"Üò˙ĝ˙•)Ċ˙˙÷#˘ôŝü˙˙ú˙ĝüúŝ˙,’˙˙ġ˙˙²ùóĦ Éö˙˙ùġ˙˙( Ä˙û˙˙˙Â$“˙˙ö˙´˙ü÷˙ ›ùÓ# ù˙÷û˙úöĤúŬùœ˙ŝ˙˙&  ˙è˙˙¤ /¤˙˙ġŭ˙û˙ !˙úú˙ġ#ŭ˙ŭ˙ 7Ÿ˙ġü÷÷˙—'Ò÷(‰˙ö˙ġĝâ òŭ) •˙ú˙ó#$ŭ˙˙ô˙İòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŝ˙û˙ŭµ–˙˙˙ê˙ ­˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙¨Ŭù˙ŞĊ˙üĜċŞÄú˙˙ù˙˙ü˙˙˙ ü˙ŭö˙˙Œ$Àŝü˙Íŝù˙˙ù)ú÷˙ĝÌ˙´*Îŝ˙ Í˙ĝ˙óé! %Ž˙˙–"˙ó˙ü˙ÈŬŝó˙÷˙˙ĵ ¤˙˙˙ùŭ˙ú˙˙˙˙˙˙˙˙˙˙ġĴ !Ÿûî˙°Î˙ü˙Ó#Ĥò˙ġ˙Ì ²ġù˙Ü "˙÷ö×$‘˙˙÷˙ùö˙˙˙Í £ò˙ñÑ˙¤"£ü×÷˙Ȩ)Úï˙˙˙˙˙˙˙˙˙˙í˙ù½$Áü˙ñÚù “˙˙ùÍïü˙˙ŭ˙˙ì˙˜¨ŝô˙˙Ş +Ä˙ü˙˙ݏ˙˙˙Ñ ,˜˙˙˙ü˙˙ä˙Ù"# ïò˙˙ġü÷˙ĝ˙ï˙¤‘˙˙˙˙ŝŭ˙˙ûù÷Żûŝ˙˙í%Êç˙˙ó- Ù˙Λ$ ĝ˙û˙²)°íĝ˙ŝ˙˙†8­Ä˙˙‘%˙öË 3‹˙˙ŝŝùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŝ˙˙ŭ˙ŭ ' Íŝ˙÷˙ ˙ö˙˙û˙í˙˙˙ô˙Ğŭŝĝ˙ö˙˙˙úĠ˙˙˙˙˙÷•!ü˙˙˙ùŭ˙úô˙# ˙˙ü˙˙ü¤ ˙ô˙˙˙˙˙˙˙˙˙˙••˙ù˙˙Ó' Òû˙ŝ˙Û ĝÖ˙˙ü˙ú˙˙ù˙˙ù˙ŝŝ# Ÿ˙ûû˙öÔ˙˙ĝġ˙í­ĉ˙˙$–˘Ĝ˙í˙ĝ˙˙˙ï÷˙˙˙ü˙˙˙üö˙ŝö˙ Ï˙îŜùĞŝù˙¤ "˙˙˙üü˙ġ˙˙ŭŝ˙%$˙ô˙ö×§Ôöü˙˙˙ĝü˙ü—%ĤóÓ˙ù˙·ŝ˙ú–˙Ì˙ù˙!û˙œ˙˙˙ûû­˙˙÷˙›žŭĝúû ö˙˙Ĉ˙ŸÎ˙˙ŭġ˙û˙­˙ĝ˙˙˙–#ŝŭ˙ŭĞ "™˙˙˙ŭ˙%Ë˙˙È  ŝûù˙˙Ì Ñ˙˙Ĉ(Ĥùŝ˙Ùġ˙˙ŝŸÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙÷ŭù˙¤&÷û÷˙˙Ù'˙˙Ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙×üÎ"Ò˙˙›Ì˙˙ĝ &ŝ˙ïû˙˙ġ˙ŭí˙ ŻÒ˙û›*˙˙˙óÒ+˙÷˙ŭ˙˙ £ú˙˙Î !˜˙˙˙ž˙ŭü˙˙œ˙ŭôÖ˙ÍÊÒô˙ŭŭûÌ&È˙û÷˙ġ˙˙˙˙˙˙˙˙˙˙ú˙™0Ñŝ˙"œ˙˙È  "÷˙˘§—˙˙Ħ×ŝŝÚĦ˙˙ŝú˙˙ŝ˙î˙ñ, ²ÉîÑ˙˙ ‘˙˙ŭÖŭ˙û˙˙˙˙˙˙˙˙ĝ˙ŝ˙ž Î˙÷ŭ§ µïŭ˙Ñ Û˙Öôû ŭû˙Ô %Ó˙ú˙—' £šš(Ÿŭ˙ö›÷ú˙úŝ˙˙÷˜˙û˙óûü˙Ŝ '¤Ì˙öÍöû˙˙ŭü˙˙ú˙–ž˙ó×­!Ò˙öö˙— - %˙ú˙"§˙ŝ˙üò˙˙—#!Êŝ˙ԟ óŭù˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ċ˙ó˙ŭ£ Ñù˙˙úö˙Ä˙˙úûÏ˙ú˙ô˙˙ô Ħ˙÷÷˙û Ġ˙˙ûô£Ÿ˙ŝ $Ñ˙ù˙˙•& ú˙˙˙˙˙˙˙˙˙÷! Ÿĝĝ˙ñĠİ˙÷˙˙û!Ħ˙üŭ˙ŭ˙ŝ˙˙˙˙˙˙˙˙ & Î˙Îġ˙ü˙ü˙üú˙Î ö˙ü£ !ÓĠüÖĦĤġ˙ó˙˙ó˙ŭó˙˙ŝë˙ŭ!úû˙ûġ§˙˙ٝĠġ˙˙˙ÑÓġ˙˙˙ŝ Ù˙˙üÎ˙ú˙˙ó˙˙˙˙èŬ ×û˙ûžŞÏÏŭÓ Ä˙˙ŝŞ £˙˙ü˘$˙ú˙Ċ"•˙ó˙˙››ÖÈ£Úûí˙˙—$Ëúûŭĝ˙˙œ&˙÷ŭ˙Ċ%ú˙˙ŭ#÷˙˙íĴ# ´ü˙ùĤ˙÷úÚÏ˙˙˙ü›$Ö˙ò˘!ĤùÑû  Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙ü˙ŝ– Òù˙˙Î%ô˙˙˙ü˙ŭ˙˙˙˙˙˙˙˙ŝ˙+œ˙™µċ¨˜˙ŭ˙ĝ˙ôŝ˙ò˙˙&Î˙˙˙œô˙˙˙Ĥ°ò˙ú˙ù˙Ĥ#%Ïûİ"Ħó˙˙ŭ˙—˙ïĴÏ˙÷˙ĝŸ%( "úú˙öö) !Ì˙˙û˙˙ŝ˙˙˙˙˙˙˙˙˙˙Ÿ#"!÷˙˜ ˙Â."#ġġâ˘! ' ù˙ú˙ŭ˙ü˙û˙ġ˙¨ & œ˙ü÷ Îŝô˙˙˙˙˙˙˙˙˙ŝü˙ûûÏ&#™¨ ”×ŝö˙ß Â˙˙–$$üĝ˙òĞ é˙˙Ġ" %“˙˙Ç Ëù˙˙ĝ˙˙è²"ñ˙ŭ˙ġ˙˙ÙĤŭ& &Ë˙˙˙˙˙˙˙˙(ó˙–&Çû˙üô˙"Ÿö˙ŝ §˙û˙ŝú˙À" Ĝ˙˙˙Ĉ¸$İĝ˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙&§ì˙˙ú˙İ&×ŭ÷˙˙›é˙ü˙  ĝö÷˙˙ú˙˙ ùŝ˙˙ùÔ% Ÿ¤ġĥ•'üü˙ &˙û—& ˙˙˙˙˙˙˙˙˙îĦ#$°ú˙ô˙œ"Ä˙ùġ×+ ˙˙ûüŝŝ˙˙˙˙˙˙˙˙İ˘Ŝġġ›+ ÷˙û˙óŞÏó˙™!Ş $Í˙˙ù˙˙ö˙ü˙ùùù˙Ä0ĥ˙˙˙İ%˙˙ûŻÎ Ħ˙˙ûóÍ $(Ëô˙Ì &÷˙˙ĝì˙ûíŭ˙˙ ˙˙•˙üúß ›Ž'#§˙ôĝ˙ĝ $Ş&"ï˙˙˙ôĝ! #&%˜˙÷–Úö˙öö—$&&!˙˙¤)Èïë˙Ĵ ™Ċ1¤ö˙˙˙È8‹Û§!"ûêŝùú˙µ öÙ ŭ˙÷Ğ'/òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙÷Í4)ò˙˙ŝ*# …˙˙ŝ˙ûü˙˙˙˙˙˙˙˙˙ü'"Í˙) ¤˙ùŝŭ˙ŭ˙˙÷˙ú˘'ž’ ˙˙ùöÉ #)üò˙˙ŝòúĞ",ŽÖ˙˙˙˙%˙è #˙óŭ˙î˙ì## 4ğ˙úóü˙‡5 +ä˙˙ì˙˙˙˙˙˙˙˙˙ôŝ˙›" %#ôÙ,"˙Ϥ*$˙˙çϛ³ $œ¤ž˙ĝ˙˙ŭ˙˙÷÷˙ü˙Ê; ,˜÷˙˙œ"&% 3“§˙˙öû˙˙˙˙˙˙˙˙ŝû˙ŭ˙ü˜" * ŸŬôŭççË3"!ħ—Ÿ Ÿ˙˙ò˙ ğçŝ˙û£ $/–˙îÚ" ­ú˙˙ŭû˙˙˙ì!˙ĉ˙˙˙˙ç˙˙  8µ˙˙˙˙˙˙˙˙˙–"#Úŭ#$&Ĝîù˙ĝŝ!&/ô˙˙˙˙Ó˘İ˘˙ĝ˙˙ò˙˙Ĉ§£¤ż˙òŝ˙í˙ŝ•)$Â˙ûû˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙#¤Ĉñ˙è˙0%¤˙˙ŝ&.˙˙˙˙ö˙ÄĦ$öî˙ñ-" ˙ü÷Ù / ! )"™˙˙˙˙˙˙˙˙ŻŻûĉÁ-ŻöÑ "Ö˙ĝ˙ŭ˙˙˙˙˙˙˙˙˙£$”˙× Ñó˙ñ Ŭ˙Éòħ$&Ġö˙˙ŝ˙˙ûŝ˙ŭ˙ŝ˙ö - “˙É* ”û˙˘&$˙úîÍù˙Ú* ŸŞÊ˙˙ġ˙À# İëÎ&.œ˙˙˙î­/0 ˘úĝ˙˙ú˙&(*£˙˙ïû˙˙˙Â, Ô' Ĥŭô˙)"—˙Àüŝ $%ĈüĈꋲô˙˙˙ĉŝœ) " ¸ŭ˙ö˙˙ĝġ÷+%$™ñ˙˙˙˙ú˙ġ!'#Ħ)˙˙˙ó'Ğí˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙öĤ# Ŭ˙ú˙€1"Ĝ˙÷ĝ˙˙ú˙˙˙˙˙˙˙˙˙˙*  Ġô $Ċ˙ò˙˙˙˙ŭ˙öŭ˙ô·'Ċ˙ü˙˙¨û˙ìĝ˙ü˙ì"“˙ò˙ûŭñ'ĊġêßÇĊ˙ŭ˙˙íŝ˙şĜÀÇÌ×ÍÈ˙û˙ŭ˙÷ĠÇËĠÇÀ˙ù˙˙ú˙˙˙˙˙˙˙˙˙˙öÒË 1¤Òİ ™˙˙­ßá˙˙˙ÎÂĠÎĥ˙ûü˙˙êÔ×˙ù÷˙˙˙ġ˙üù˙ü˙û˙ġĝ˙ß§ÉÍÜèŝ˙˙è˙òÓˋĠÒ˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙ò˙ÈÓµİÒ˙ö˙˙˙ü˙üżÀ›İ 'Ô˙˙ß˙ö˙üÚÒĠÈ˙˙ò˙óûáÒÉÔÛÌÔĝ˙˙ŭŝŝİÍ˙˙˙˙ûŝŝû˙˙Î ĥ˙ä˙˙öùâ˙˙ê˙Ú È˙ŝ˙˙˙˙˙˙˙˙˙Ÿ )Öö˙‹ĞÒÎÖĈ˙˙˙óġ˙ÂÊÙö˙ŝŝûîô˙˙˙ŭÂ˙˙ö˙˙˙óŭ˙˙ó˙÷˙˙˙˙ĝ˙ŭú*ó˙ü˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ. , áö˙üÁ$  Ùùìîŭ %Ôċŭ˙ùŸï˙˙˙ŝ˙ü  % Ħ˙öŭ˙˙Ğšœ  #  +˙˙˙˙˙˙˙˙*&Ç˙ġ¨%žîŸ')˙ö˙ü˙ò˙˙˙˙˙˙˙˙Ó"- &˙˙Ċ¤£!­ŝ˙ĝö¤£ĤĜîŝ˙˙˙!+Ñ˙˙ŝŝ˙˙˙˙ŝ˙ó˙ġ˙ŭ-)˜Ö˙˙$Ÿ–¤˙˙úŭڌ'"Ü˙˙˙Ġ2˙˙ìú—,$$˘˙ï˙˙˙ö˙ŝĝü˙˙û§ –Ê˙úú˙üù˙ $+ñ˙˙˙˙÷˙˙Ë &˙ôó˙˙ŝŭ˙ɲ .%É˙Ÿ*Ëû˙ŝ% ú˙˙ŝò˙Â&˙ú˙íĴ˘È˙ŭóò˙˙̧˘™›ĴšĠò˙˙û˙˙˙˙ÉĦž¤¤Ħ×˙í˙÷˙üü˙ĕ”Ş‘ßž›œ›˜˙ġ˙˙££×˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ŝ˙̘Ħ¤‘¨™ħ˜Ğü˙˙˙îÜÍû˙ùúù÷ú˙˙ú˙˙˙˙˙˙˙˙˙˙ú˙˙ŝ˙ĝö˙ġ˙¤ĦĦ›˙ŭĝ˙ŝö˙˙˙ö˙ŝ˙˙ú“"#Ù÷ĝú˙ġ˙ôġŝ˙˙˙Ëöü˙˙ó˙˙ŝ˙ĝô˙ó˙˙ÀË˙ù˙ŝ˙˙ŝ˙˙á Ö˙˙ġ˙˙ç˙öû˙ùü˙˙˙˙÷˙˙÷ŝù˙ŭ˙ġ˙˙˙˙ûŭ˙ñô˙ŭ˙˙˙˙˙˙˙˙ù˙˙ġ˙˙î˙ù˙˙Ŭ¤ô˙˙ù˙ê˙˙˙˙ô˙ûï˙˙î˙˙˙ŭ˙óÄú˙˙ëúŭ˙÷˙ŝ˙˙óŭŝú˙û˙˙˙˙˙ŝ˙˙ŭ˙˙˙ġöü˙˙˙˙ü˙˙ü˙˙ó˙˙ŝ˙˙˙˙˙˙˙˙˙˙û˙úŝ˙˙˙˙ù˙˙÷˙˙ŭŭŝ˙˙˙˙˙ö˙ñ˙Ëöŝ˙ĝû˙ĝ˙ŝ˙ŝ÷ùŭ˙˙ö÷˙˙ù˙ë˙ù˙÷˙˙öô˙˙˙˙î˙˙˙˙÷ŝ˙ŝ˙˙ŝôĝ˙û˙ĉ˙˙ö˙ŭ˙˙˙ö˙ŭ˙óġ˙˙˙˙˙ûù˙˙˙˙˙˙˙˙ù˙˙˙ç˙ùî˙ŝ˙˙ĝ˙ó˙ù˙ê˙˙ò˙˙ú˙˙ó÷ö˙˙˙ĝ˙˙ñ˙˙ó˙˙üü˙ŝúŭüú˙˙˙âĝ˙˙üü´$›÷˙üü˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Á˘ĥÑû˙ĝ˙˙í̵Ĵ›˙ñ˙ö˙ĝ›Ĵ²—Ï˙˙˙ìûô!í˙Üġ˙˙ñ˙öġŝù“+ %!—˙×ù˙˙üü˙˙÷˙ô˙ŭ  "öÈ˙˙˙˙˙˙˙˙ҟ"˙˙˙üú˙î˙˙˙˙ŝ˙Ċ £…"İ˙ö˙˙ùü˙˙˙˙˙˙˙˙˙ê­ # ô˙ôĝœ™Ó˙í˙˙˙û˙˙óŝ˙ġ™”— Ĥ˙û˙÷ü˙ŭü˙˙˙ŭü˙ú˙…Ħ—*Êġû˙Ÿ$ÁÎ˙òŝûï˙ú˙ĥ›ŸÖ˙ŭ÷ġ˙—¤úġ˙˙˙$$˙é˙ùŝġ˙˙˙ñ˙˙˙˙˙˙˙ûĝ˙˙˙˙úÇŝ˙˙Ûû˙˙˙òŭú˙˙ô˙ñ˙˙˙˙˙ú˙˙˙ùúĝ˙˙ŝ÷˙îÇ˙ü˙êúÏû˙ô˙úòÓ˙ŝÎ˙˙˙˙ü˙˙˙˙˙ŝòüŭ˙÷˙˙÷ġŭ˙üüöŭŭ˙é˙˙˙ü˙î˙ñ˙ïò˙ïüĝ˙ġŝü˙é˙ö˙˙üŝ˙˙˙˙ŭ˙ö˙˙˙˙˙ñŭü˙ġ˙˙˙û˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙ĝ˙˙˙˙˙ŭŝ˙˙ê˙˙˙ò˙ġ˙ú˙ü˙ŭñ˙û˙˙˙˙üû˙˙˙˙˙˙˙˙ŝù˙íÓŝùŝ˙÷˙ŝ÷˙ĝ˙ô˙ġ˙˙ùŭùŝ˙ô˙˙ôŭ° $Ĉ˙˙úó˙ŝ˙˙˙òŝö˙˙˙˙˙ĝ˙ó˙˙ŭ÷˙öùġ˙üŭŭ˙÷˙˙ùŭ˙ħ˙ĝġ˙òġ˙˙úŭ˙ùü˙ĝù˙üûú÷˙˙öŝŝ˙˙ŝ˙˙˙˙˙û˙ĝ˙˙˙˙˙˙˙˙˙ùúĝ˙˙ĝŝ˙ò˙˙˙˙í˙˙˙ó˙˙í˙˙ġ˙˙÷˙˙ú˙˙˙üíŝ˙˙˙˙î˙˙ö˙ŝġ˙˙ù˙˙ù˙ĝ˙ŭ˙˙ïġùüŝôñûŭ˙˙˙û˙˙ġ˙ï˙ñĝ˙˙ŝ˙ö˙˙˙˙˙˙˙˙˙˙ŝü˙ŝù˙ùñ˙÷íóŝ˙ŭ˙ú˙úü˙ôŝë˙ï˙ùû˙ñŭĝ˙ô˙˙˙ûü˙˙˙ŝ˙ú˙öî˙ü˙˙˙ù˙˙˙˙˙úġĝù˙˙ôË˙÷˙úŝ˙˙˙˙˙˙ú˙˙÷ġ˙˙öö˙˙ôú÷˙˙ŝĝ˙˙î˙˙˙˙˙˙˙˙˙˙ü˙ĝĝ˙˙ú˙÷óù˙ö˙˙û˙˙üì˙˙ûúöŝĝ˙úöôŝúô˙˙è˙˙ù˙˙öü˙˙˙˙˙üü˙ú˙˙ú˙öÒ˙˙ùûŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙÷ë˙ü˙ü÷˙˙ûôŭġ˙˙˙˙ì˙ŝÓú˘Ġòŭ˙ùùô˙˙ùÔÊ˙ôŝ˙ù˙ŝŝ˙˙˙˙֖֟äÂ˙ö˙˙˙ŝ˙˙ĝ˙÷ñ˙˙ĝÖÒÓ˙˙˙˙˙˙˙˙˙˙ûá´¨Ĝï˙˙˙ŭŝŝ˙˙üÍ˙è˙ÎċÑÑ˙Ĝ˙úĝ˙˙ö˙˙˙˙˙˙˙˙˙ٟÚÑÍÁ˙ßġ˙˙ç˙˙ŝ˙˙˙ĝŭ˙ŭ˙Ñ˙ŭ˙˙ó˙˙˙˙ö˙˙ì˙˙ú˙˙˙û˙˙˙ĝ˙˙ùü˙˙ġ˙˙î˙ŝ˙ŭŭĝ˙ë˙˙ŭ˙˙˙î˙ú˙˙ŝġ˙˙˙˙˙ù˙ŝ˙óġ˙ü˙œ$Ñ˞"Ç˙è˙˙úĝ˙ö˙˙ú˙ĝ˙ó˙˙ĝüò˙˙˙˙ñĝùú˙èŝ˙˙˙ûñ˙˙ü˙˙ä˙óĝ˙ġ˙ô˙˙˙˙˙ù÷ŝ˙˙úúŭ˙˙˙ë˙ú˙ŭŭ˙ú˙ü˙ò˙ò˙˙ġ˙úö˙˙˙˙˙˙˙ìû˙˙÷˙ŝ˙ĝ˙˙û˙˙÷ĝ˙˙˙ï˙ü˙˙˙˙˙÷˙˙ö˙˙˙˙ŭ˙˙˙û˙÷ïù˙˙˙˙ĝŭ˙˙ñ˙ô˙Ëüú˙ùŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙ŭŭ˙ó˙ô˙×ùûÙ˙ĝŝ˙ŝ˙˙÷ûŝ˙˙˙˙ü˙üúŭ˙ŭ˙˙˙˙˙˙˙˙˙ù˙ùû˙ŭ˙üŝ˙ù˙÷öŝúŝúġ÷û˙˙˙˙ú˙÷ù˙‡%$ŭú˙÷ü˙ĉ˙ĝ÷˙˙˙ġè˙ŝ˙ñ˙˙ì˙ġ˙˙ü˙˙˙˙üó˙˙÷ù÷˙÷ïó ü˙˙˙ú˙ŭ˙˙˙ŝ˙˙˙˙ŝŝ˙˙˙˙ö˙ġ˙ŭŝö˙˙ì˙˙ŝö˙û˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ÷˙˙˙üï˙ê˙óċġ˙üï˙˙ĝ˙˙˙ü÷˙ùù˙÷˙ŝ˙úŭ˙û˙óö˙ĝë˙ŝ˙˙ö˙˙ò˙ú˙ûó˙˙˙˙û˙˙˙˙˙˙˙ùò˙ŝ˙ù˙í˙˙˙ü˙ŝġ˙˙˙˙˙˙˙˙˙ŝü˙ŭ˙ü˙ĝ˙˙˙û÷üû˙ŝü˙˙˙˙˙˙˙ü˙ú˙÷˙˙ù˙˙û˙ŝŝ˙˙˙˙ûûüó˙˙˙˙ŝ÷˙˙ŭ˙÷ôûŝŭ˙˙˙â˙ó˙òù˙ŝ˙˙ûŭ˙˙üġ˙ó˙˙û˙˙˙ûü˙˙˙úü˙˙˙˙úû˙ó˙˙˙˙˙˙˙˙˙ŝ˙˙˙÷öñ˙˙˙˙úŭ˙òó˙˙˙˙ù˙ûú˙˙ŭ˙˙˙˙˙˙úġ˙ñúü˙ŝ˙˙ûò÷ŭ˙ùû˙˙˙ġŝñ ¨ÚÎ˙é˙úü˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ò˙ï˙˙˙ŝŝ˙˙ö˙ö÷˙ú˙˙ùì˙˙˙˙˙˙ġùŝ˙˙üö˙˙˙˙ġ˙˙ú˙÷˙˙˙ù˙˙ò˙ŝùñ˙˙ô˙˙ö˙˙÷˙üü˙ġ˙˙ġ˙ŭ˙ùĝ˙ú÷˙˙˙˙˙˙˙˙ü˙ôŝ˙ûġ˙ĝ˙˙ï˙ŝùöô˙˙ú˙ö˙ù˙û˙ġüò˙˙˙˙˙˙˙˙˙÷ôġï˙˙˙ïò˙˙ö˙˙öŭ˙ùŭ˙˙ì˙ñ˙ñ˙ùò˙ìîô˙˙Ŭ˙˙˙˙˙˙˙˙ŝŭ˙÷ŭ˙ïŝ˙çôŭ˙˙˙˙˙˙˙ó˙˙˙íŭ˙ó˙˙ôú˙˙ú˙ŝó˙˙ì˙˙ĝ˙˙ú˙Ê”˙ç˙˙˙˙—+Ì˙üñì˙˙˙ŝ˙ù˙˙˙ûúóü˙˙˙ñùû˙˙˙ŭ˙ö˙˙òï˙û˙÷˙ùö˙˙ó˙˙ĝúó˙û÷î˙é˙˙ûüĝ˙˙˙óîŭŭŝ˙˙ŝò˙ú˙ú˙ĝ˙˙˙ë˙ù˙˙˙˙ġ˙ŭ÷˙˙ó˙ġ˙ö˙˙ĝ˙˙î˙˙ô˙˙ûŭ˙˙ŭé˙ï˙úŝġ˙ó˙˙ì˙ü˙úùġ˙û˙˙˙ċ˙˙˙ĝú˙ŝ˙˙˙ûûŝû˙ù˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙ò˙÷˙î˙üŝ˙˙˙˙ùíŝ˙ûŝüùöúú˙÷ŝĝ˙ŝ˙˙˙˙˙˙˙˙ĝ˙ùú˙îó˙ŭ˙˙˙˙ù˙˙˙ö˙˙˙˙ĝô˙ġ˙˙ï˙ġ'' ˙ŭ˙û˙ûŭ˙˙˙˙ôü˙˙˙ò˙ñ˙˙˙ĝ˙˙ġ˙ôö˙˙˙ġŝ˙˙ü˙˙òì˙û˙˙ü˙˙˙ôô˙˙öġ÷˙˙öîû˙˙˙ó˙ü˙˙ôô˙˙èû˙˙î˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙˙üöú˙˙˙ù˙ô˙˙˙î˙˙ġû˙˙òŝ˙˙ñ˙˙öû˙ŝúú˙ûŝ˙˙ŝ˙˙˙ú˙˙úö˙÷ù˙ĝ˙˙ŝ˙˙ûóü˙ŝöóù˙ŝú˙ú˙è˙˙˙ŝûöú˙˙ŭù˙˙˙˙˙˙˙˙˙ŭ˙ġ˙ü˙û˙ôŝ˙˙˙˙ŭ˙˙˙˙÷÷˙ĝ÷íŝ˙ŭ˙˙˙˙ä˙˙˙öûúúü˙˙˙˙ùġú˙ü˙êŝ˙˙˙˙ŭúŝüġö˙˙˙÷˙û˙˙˙˙ûû˙ŝù˙˙ôŝ˙òŝ˙˙ü˙úĝü˙ŭñ˙ŭö˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙û˙˙ü˙ûù˙˙˙˙˙èü˙ùŝ˙˙ùó÷˙ùúûûïî˙˙ŭ˙˙˙˙öú˙˙˙˙û˙˙ŝŭüûúŝ˙˙˙ùôù˙˙˙˙˙úŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ô˙î˙ŝŭüŝü˙ŝ˙˙í˙˙˙˙ĝ˙÷ŭ˙ŝ˙˙üŝ˙˙˙öüŭ÷˙ŭö˙ŝġ˙ï˙ŭü˙˙ñ˙ó˙ĝ˙ŭñ˙˙í˙˙˙˙ŝü÷˙ùġ˙ù˙˙ġ˙ŭ˙˙˙˙˙˙˙˙ŝ÷ŭ˙ñ˙˙ú˙ò˙˙üò˙ĝ˙ġë˙˙÷˙ĝû˙öû˙ŝŝû˙˙˙˙˙˙˙˙˙˙˙˙÷ŭ˙˙˙˙ŭú˙ŝ˙˙û˙ŝ˙˙˙˙˙ŭŭû˙ô˙˙˙˙˙÷˙˙˙˙ŝû˙ŭü˙˙ŭ˙˙˙ô˙öù˙˙˙ù˙ŭ˙ĝ˙û˙ġó˙˙û˙˙˙˙ĝŭ˙ö˙ú˙ô˙˙ò÷˙ŭ˙˙ŭ˙˙ûĴ˙Î˙˙ôŝ˙ Ġ˙ú˙˙ĝ˙ŭ˙ô˙˙÷úŝ˙˙÷ŝ˙˙û˙ôŭ˙ó˙üŝ˙ú˙˙ô˙÷˙ùŝŭüŭ˙üú˙˙˙ûŝ˙˙î˙ŝñ˙˙˙üŭû˙ĝŝ˙úŭ˙ö˙˙úü˙˙ó˙ú÷˙˙ŝ˙ûġ˙˙í˙˙ŝŝ˙˙˙˙˙ú˙˙ù˙˙ê˙˙˙˙öŝ˙ó˙˙˙˙ŭŭ˙ûú˙û˙˙˙˙ë˙˙˙ĝ˙üŭ˙˙˙ô˙˙˙˙ĝ˙û˙ŭ˙û˙˙ĝ˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ŭ˙˙˙óú˙û˙˙ûü˙ì˙˙ö˙ô˙˙˙˙˙˙˙ü˙ö˙÷˙˙˙˙˙˙˙˙˙÷ù˙ö˙˙˙ü˙ŝĝ˙˙ì˙ŭ˙ûùŝúŭ˙˙ù˙ù˙ú˘Ñĝ˙˙ŝ÷˙òü˙ŭ˙˙òü˙ü˙ù˙ĝ˙ù˙ġ˙˙ô˙ŝ˙÷˙ûŭŭ˙˙ĝù˙!"úû˙˙ù˙˙ú˙˙÷ùŝ˙˙ŭû˙˙ŭ˙úŝŭ˙úù˙ö˙ġ÷˙û˙˙˙û˙˙˙˙˙˙˙˙û˙ûò˙ŝü˙˙˙ŭöŝû˙úĝŝŝ˙˙ü˙˙ö˙˙˙ŭ˙ñ˙˙÷ŭ˙˙ú˙ŝġ˙˙üùŭü˙ú˙˙ü˙ô˙ŭ˙ó˙˙öŝ˙˙˙ŭ˙˙˙˙˙ŝ˙ö˙ò˙˙ó˙˙ù˙˙˙ò˙˙˙˙˙˙˙˙˙˙ŭü˙ñ˙˙ŭ˙ú˙ŭ˙úö˙ĝ˙ŝŭ˙üĝ˙ŭ˙˙˙ù÷˙˙üŝ÷˙˙òô˙ü˙˙˙˙üì˙ŝ˙˙î˙˙˙˙˙úú˙˙˙üŝ˙˙˙ûġ˙˙˙ŭ˙ŭ˙˙˙˙˙˙ŭô˙ïû˙öû˙˙˙÷˙÷ù˙˙ú˙ó˙ŭ÷ü˙˙˙˙˙˙˙˙ĝ˙ĝ÷˙üñ˙˙˙üŝ˙ûŝùŝ˙˙÷˙˙ô˙ûú˙˙ŝŝ˙˙˙˙˙òü˙ûŭĝ˙˙˙ù˙˙ô˙ô˙÷˙üü˙˙ġ˙ú˙˙˙òí˙˙ŝŭ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ü˙˙ž˙ö˙ú˙˙ö°˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙úŭ –˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙ù ˙ŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûġüç˙ä ™Ñ˙˙ŝ¸ĞÛòù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝûĝ"Ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í,$šîö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙˙ĝŭé$"‘˙ĝúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙á˙ùü˙Ġ 2 Ç˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùóû˙ÒÚÔÜÖÍú˙÷ŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙êġú˙˙ò& !—Ò˙˙üò˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ì˙˙û˙˙˙÷ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙ú˙˙ñúüó˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝí˙˙ħ˙˙˙ü˙˙˙ġü˙˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙òŝ˙úġ˙˙˙ó˙ûĉ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙˙˙û˙˙˙˙˙˙ŝú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ġù˙ñ˙˙ġ˙ò˙˙ŭúú˙˙˙üï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙÷˙ñ˙˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ú˙ġŝŝû˙ŭúû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ó˙˙ü˙ô˙ùó˙ŝú˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú˙ü˙˙ġ˙˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüù˙˙˙öŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ùü˙óù˙˙üüŭ˙˙ü˙˙÷˙˙ŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ô˙˙˙˙ŭû˙˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙üú˙ŭûü˙üú˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ĝù˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ú˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ù˙˙ŭ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙˙ŭü˙ŭ˙˙ù˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ĝ˙ù˙üû˙˙üŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùù˙ŝĝŝ˙ŭô˙˙ú˙üĝ˙˙üû˙˙ö˙ö˙˙ŭö˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙˙ùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙÷˙˙ĝ˙˙÷˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷˙˙÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙üó˙ĝö˙ü˙üü˙û˙˙ü˙˙˙÷˙˙˙öŭ˙î˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝŝù˙˙˙˙˙˙˙˙˙˙˙˙ŭûûûû˙ŝú˙úóù˙÷ï˙˙˙òġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ù˙ö˙˙ûŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙˙ŝ˙ü˙˙ù˙ü˙˙˙ŝôöŭ˙˙˙˙˙öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙êò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙÷˙ŭŭçŝĝĝ˙˙üĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ûû˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úö˙˙ĝ˙ü˙íġ˙û˙ĝ˙ŭ˙˙˙˙üó˙˙˙˙ñó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ĝĝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙ŝ÷˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝò˙˙˙˙úü˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙ŭöú÷˙˙ö˙˙˙êŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙úŝġ˙˙ĝú˙úöûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭĝŝ˙˙ĝ˙é˙˙˙÷˙˙ûü˙˙˙ĝôöŝ˙˙ú˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ú÷ŭ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üúŝ˙˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ü˙ò˙˙˙ûû˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġü˙˙üġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġù˙ç˙˙ŭ˙ôô˙ô˙˙ĝ˙÷ùì˙˙ñŭó˙˙÷˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üò˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ûô˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙˙ĝòüîö˙ŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝ˙˙ŭ˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭü˙˙ù˙ò˙÷˙ûŝ÷ĝ˙˙˙˙˙˙˙ŝü˙ĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙öġŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙óü˙ŭçüû˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙úú˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙˙ġ˙˙ó˙˙˙úù˙˙ë˙ĝ÷˙˙˙ú˙ĝ˙˙ŝñ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙˙öú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ùü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ŝ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙úŭ×ĝú˙˙˙˙ê˙˙ġúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ù˙˙˙ŭúû˙ûĝ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úò˙˙˙û˙˙ñ˙˙ë˙˙˙˙˙ŭùü˙˙üĝ˙ù˙˙ŝŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷ŭŝùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ì˙˙û˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙û˙˙˙ĝ÷ŭ˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝûŝŝûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ê˙óò˙í÷˙í˙úô˙î˙˙òû˙˙˙ñ˙íġŬ˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙żó˙˙÷˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙ïù˙ò˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ñ˙˙í˙ÑĈÀë˙˙˙ú˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ú˙ùŭç˙˙˙úġ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŭ˙˙üüî˙öĝ˙ú˙˙˙ŭ˙˙˙ôû˙÷ùú˙íŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷ü˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ê˙òŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙üŝö˙˙ü˙˙üġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òü˙˙˙ÇÔù˙˙˙î˙ÈÖÀ˙ŝúñŭ˙˙˙ġ˙ŭÈÓ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝêĉ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙÷ú˙ûò˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙ŭö˙û£İ1 &‡˙öûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ÒÏğ˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ï˙˙˙˙˙Ò˙˙ú˙ûù˙˙ùĝ˙˙÷˙˙˙ò˙˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï÷ĤĦ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙Ĉ› ü˙ĝ˙ŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙É  É˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝî˙ööñ!¤+ 2Ŝ˙˙˙ûû˙ù˙Ě :ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“0 )‘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙! ˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï$ "­ö˙˙˙˙˙˙˙˙˙˙˙˙˙ġß͔Ş'ÍÂ˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙úŞĦ”É·Ìù˙÷ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙úœ( £ӝĞÖû˙ö˙˙š ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙öĊ³Óġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙–˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ò"%Ä˙ġŭ˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ££ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ó˙˙˙›$+  èÑ˙ü˙˙˙˙ Ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŭŝ˙ŝú˙é˙ĝ˙˙ġü!˙÷ŭ˙˙˙üûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ù˙˙ü˙ŭûúü˙˙˙˙ú˙˙ò˙ûüüô˙˙ûú˙˙ŭ /Êĝ˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙ŭ˙ŝúŭ÷˙˙˙˙˙˙˙˙˙ü˙˙ŝ˙˙˙ĝ˙ŭûŭŭûŭ˙˙ŝŭ˙ŭùû˙ŭ˙üö˙˙ûùŝ˙˙˙ú÷ü˙ŭ˙˙˙ù˙˙ŭ˙ŭû˙˙üĝĝ˙˙˙˙˙˙˙˙ŝ˙ŭûñ˙˙û˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙úġ˙˙ŭ˙˙˙ö˙˙è˙˙¨ ˙˙˙˙˙˙˙˙˙˙î˙˙ġĤΟ£ĠĊ¤Ñ" Í˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝû˙˙˙˙ûŝ˙ŝŝ˙˙˙ù˙˙˙úŭĝû˙˙˙ŭü˙ŝ˙˙óÓ Ù÷˙˙û˙˙ġ˙˙ö˙ú˙˙í˙÷ö˙÷ûÑ!#˘öג&£˙ô˙ù÷é  ˙˙ö˙ŝ˙˙˙üûüû˙˙ĝ˙ŝ˙ü˙ŝ˙§Ñĝ˙˙˙˙˙˙˙üŭ˙˙üĝû˙˙˙˙˙˙˙˙˙˙ù˙ $›˙ŝüú˙ñ˙˙ġ˙˙ŭ˙˙˙˙˙ó˙˙ü˙ù˙˙ŭ˙÷˙ŝó˙˙ù˙ŭòħŞû˙˙ù˙üû˙ĝ˙˙ŝ˙ú˙úü˙˙ûûĝú˙öù˙öŝ˙ö˙˙û˙û˙˙˙üġ˙˙ŭ˙û˙˙˙˙˙˙˙˙ú˙ûö˙˙ò˙˙ûû˙ùġ˙˙˙ŝ˙˙˙÷˙ü˙ûùŭ˙ŭŝ˙ú˙ŭ˙ûĝ˙˙ĝ˙ù÷˙ŝö˙ü˙˙ŝ÷˙˙ĝùû˙˙ûüŝü˙˙˙˙˙˙˙˙ŝ˙ù˙˙˙öŭö˙ŭ˙˙˙˙˙ŝ˙ŝ˙˙ö˙˙˙˙ù˙ŭ˙ûùŭ˙ö˙˙˙ġŭú˙ô˙ù˙˙˙ġö˙˙˙˙ô˙˙ù˙ĝ˙û˙ġüü˙˙ŭ˙ŝ˙ö˙˙˙÷ù˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙öû˙ü˙ï˙ŭġ˙˙ü$ ĦĠ÷˙û˙ù˙ŝ˙˙û÷˙˙ĝ˙ĝô˙˙˙ĝù˙÷ŭ˙˙ġ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙ŭġ˙Ä%$Ğú˙ú˙ü˙ŭ˙î¨$Óú˙˙ġ˙ŭŭ˙˙ŭġ˙ôŝ˙úŭ˙ĝ˙ñû˙÷˙˙÷˙û˙˙˙ġŝ˙˙û˙ŝü˙û˙û˙˙˙ü˙òü˙üú˙˙˙ö˙˙˙ĉ˙ü˙˙ñ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ôŝ˙˙˙˙ò˙íüó˙ġ˙¤*!Ç˙˙úú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŝĝ˙ú˙˙˙˙˙ŝù÷˙öò˙ñŭ˙ú˙àô˙ĝ˙˙ü˘!Â˙ĝ˙˙˙˙˙˙˙˙÷˙˙úù˙˙÷ġóü˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ŭĝü˙˙ú˙˙˙˙˙˙ú˙üû˙˙˙˙˙˙˙˙ûúü˙˙úĝùŝ˙˙˙˙˙ù÷ú˙˙˙ó˙ûùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙óĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙÷ŭ˙˙ŝġ˙ġó˙˙ò˙˙Ê#$ĥê˙˙˙˙˙˙˙˙˙ŭ˙Á¤ĝ˙ü˙˙üŭÎ! % Ñó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝùùùùŝ˙˙˙ŭ˙˙˙˙ŝúöü˙˙˙˙úú˙˙˙ŝ˙ô˙× È˙˙ü˙˙˙ü˙üŝ˙˙ûŭ˙ê˙˙áŝ˙ –˙ĝ˙˙û˙š&˙˙î˙÷ëŬ âċ˙˙ù˙úòû˙˙˙˙ü˙ù˙ôûö˙ĝ˙š ¨˙˙üĝŝ˙ùü˙˙üú˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙ġŸ˙ŭ˙ŭŭŝ˙˙ò˙˙ŝú˙˙˙˙úĝ˙˙ŝ˙úŭġ˙üü˙ôüüŭ˙˙Â+½ú˙ŝ˙üû˙˙˙˙ġ˙˙ü˙˙úġ˙˙˙ë˙˙üûŭ˙˙˙˙˙ûùĝ˙ŝ˙ŭŝî˙˙˙˙˙˙˙˙˙˙˙ù˙ŭüû˙˙˙û˙ŝü˙ŝê˙üŭŭ˙˙˙ŝ˙˙˙˙˙ûü˙˙÷ĝ˙˙ùùġ˙˙ŭüüŝ˙˙ù˙í˙˙˙ï˙˙˙ŝôö˙˙ú˙˙˙˙˙˙˙˙óŝ˙óôú˙˙˙˙òùĝ˙ú÷˙ñ˙˙í˙˙êüŝó˙û˙÷˙˙˙í˙˙ï˙˙˙˙ö˙ŭ˙ñúĝ˙˙˙ï˙˙˙éŭ˙ù˙˙˙ŭ˙˙˙ġü˙ö˙úŝì÷ĝ˙˙˙ŝŝŝŝŝŝŝŝ˙ñġĝġü˙˙˙ú˙ñ˙˙üü˙š''›ó˙˙ùôŝ˙ŝú˙˙˙ñù˙ŭ˙˙ĝùù˙÷˙˙˙ï˙˙ùì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝ˙ĝ˙ü!!,Á˙˙û˙ü˙ŭŝ˙Ç%Ê˙ġ˙ú˙˙üúûŭ˙˙˙ùŭ˙˙ïè˙˙ù˙˙÷÷ŝ˙˙îúġú˙ŭĝ˙ò˙˙ûŝĝ˙ö˙ŭ˙ó˙˙˙˙˙˙÷ŝ˙˙û˙˙éùö˙˙˙ġòû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙ĝûñ˙ŝ˙û˙ü˙êÊ˘#*žŝ˙˙ŝüúûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ë˙˙ù˙ĝúûúùû˙˙ŭò˙˙˙ì˙÷˙˙˙û˙ĝ˙ù! ›ċô˙˙˙˙˙˙˙˙˙ĝ˙˙˙ü˙˙˙˙˙˙˙˙ĝúö˙˙˙˙˙˙˙˙ûúùúŝ˙ŝö˙˙ŝôôŝ˙˙˙ûû˙˙˙˙ŝŭô˙˙ŭö˙÷˙˙üüŝŝúġ˙˙˙˙òġ˙˙ŝ˙˙˙ŝ÷öù˙˙˙˙˙˙˙˙˙˙˙˙ġòŭ˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙íú˙˙˙˙˙ú˙ê˙™ ó͕žÔ˙˙˙˙˙˙˙˙˙ú˙Ĉ+é˙˙˙ó˙ú˙˙î­ °íû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙˙˙˙˙ŝûŝ˙˙ü˙˙ŝû˙˙û˙ŭ÷ú˙˙öŭö˙ö÷Ğ$Óùöúŭñ˙ü˙÷˙ŝ÷˙ô˙ŝ˙˙˙–˙ġ˙üö÷ŝËġŻÔï˙˙ñ˙˙›.˘úöú˙˙úü˙˙˙úôö˙˙ŝ˙û˙˙˙˙˙ÈÔôŝŭ˙˙˙ŝü˙˙úü˙˙÷ġü˙˙˙˙˙˙˙˙˙˙¤ŝ˙ôú˙˙˙öúŭ˙ŝĝ÷˙˙ŝ˙ó˙˙ĝŭ˙˙˙ŝñ˙˙üûù˙ĝŭ˙˙Î×Ñë˙üŝù˙˙˙ú˙ù˙˙üûûúû˙˙ù˙ì˙˙˙ĝ˙˙óŝ˙ù˙˙ó˙˙˙˙ï˙ŝ˙ö˙˙ġ˙˙˙˙˙˙˙˙ö˙ùûöö˙óŝ˙ù˙üñ˙˙ġü˙˙˙˙òĝŝ˙˙˙˙ûû˙˙˙˙öŭü˙˙ŭġ˙˙üŭ˙ñ˙˙˙ì˙ôĝ˙ŭ˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙úóùûŭ˙˙˙˙˙˙ú˙˙˙ç˙˙ù˙˙ü˙˙˙ûñ˙˙˙÷˙óŭġ˙úûô˙˙˙˙˙ŭ÷ü˙˙ö˙û˙˙ġñ˙˙ŭĉŭ˙ü˙˙ôġ˙ŭ˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭóÊù˙˙÷˙˙˙ÎÄÁÏ˙˙ûö˙˙˙ûï˙ĝ˙ĝ˙˙ĝ˙òï˙˙˙˙úŝü˙˙î˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġü˙˙ü˙˙˙#Ÿ˙ß˙˙ü˙ŭŭŭöôûŝ%˙ŭ˙˙˙ò˙û˙˙ñ˙˙˙ù˙˙è˙˙ĝî˙˙ü˙˙˙˙í˙˙˙˙óúû˙î˙ùú˙˙ë˙˙ĝ˙ù˙î˙˙ùö˙˙˙ŭĝû˙˙˙ù÷ù÷˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝŭ˙˙˙˙ĝ÷™˙ĝġ˙ùÒĴÖ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ú˙ŝû˙˙˙ŭüŭ˙˙˙û˙ë˙˙˙ŝ˙ñ˙ĝù˙˙˙šô˙ò˙˙˙˙˙˙˙˙˙ŝ˙˙˙úü˙ùŭòú˙ü˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûŭ˙˙˙˙˙˙ŭŝŭŭ˙˙ŭüŭ˙ú˙ŭ˙˙˙ùŝ˙˙˙ŝ˙˙˙òòü˙˙˙˙÷ùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ô˙˙˙ŝú˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ÷˙üġ˙üï˙˙ì˙˙Ĉ‹3#Ô˙˙˙˙üü˙˙˙˙˙˙˙˙˙ÏÏ˙Ç÷Î")“Ĝ˙è˙Ä* ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŭŝ˙˙˙˙ŝŭüü˙˙˙öü˙˙˙˙ùŭŝ˙˙˙˙˙˙˙úĝ˙ò˙˙£'š˙ùö˙˙ŝ˙ú˙ú˙ŝ˙˙ŝ˙òü˙ġċÉ˙ġó˙˙˙˙˙˙–Î˙ûö˙˙Ĝœ§˙ú˙ġŝü˙˙ûú˙˙˙˙óġ˙˙˙˙ŝŭê˙* ˙ùġ˙˙˙ŭ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġÓݞüŭ˙˙ñúû˙˙˙˙ŝ˙˙˙÷ü˙ŝŭ˙ûö˙ŝ˙ú˙ö˙˙ĉ˙˙ĝû˙ö˙ú˙÷˙ŝġ˙˙˙úç˙˙ûù˙˙˙˙˙˙˙˙÷˙í˙í˙ŭ˙ü˙˙ŝ˙˙ĝŝïĝú˙ú˙û˙öġ˙˙˙˙˙˙˙˙˙˙˙ù˙Ò"÷˙ŭ˙˙ü˙˙ûî˙˙ùö˙˙˙˙ŭüŭ˙˙ŭŭŝ˙û˙÷˙˙óë˙ŭ˙ŝĝ˙˙˙÷˙˙ŝ˙˙üü˙ùĝü˙ú˙˙˙˙˙˙˙˙˙˙˙öî˙ñŭŝ˙˙˙˙˙ëûúüí˙ïü˙˙ñö˙ûüŝġò˙˙ú˙é˙˙˙˙˙ù˙˙˙ġġ˙ü˙ú˙ò˙˙ûöó˙ù˙÷ŝŝ˙˙˙öġ˙˙ĝüòù˙ŝû˙ŭŭŭŭŭŭŭŭñ˙ŝê˙ûù˙˙Ÿí˙˙˙˙ó˙ŝ˙˙ñġ˙˙óòú˙ŝ˙˙˙˙ŭ˙˙ü˙˙öĝò˙ûġ˙ŝûĝ˙ĝú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ŭ÷ĝ˙š( )£óĝ˙üû˙˙û˙˙ĝ˙ËÜ˙ñí˙˙ùóú˙ü˙í˙ñôû˙˙˙˙˙÷öúŭ˙ġ˙óìöôû˙úñ˙ü˙˙ûċ˙˙ĝ˙ŭĝŝ˙ġ˙˙üġüú˙˙˙÷˙ï˙˙˙ùôüô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙û÷˙ŭéŭü% ‘ô˙ü˙˙. (ù˙ûô÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙¨ôŭüü˙˙˙üöö˙ŝ˙ŝè˙“ ß˙ô˙ŭúġ˙™#÷˙˙˙˙˙˙˙˙˙˙˙˙ŭúü˙ŝú˙˙˙˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙üöġŭ˙˙ûû˙˙ûû˙ü˙˙˙üü˙˙ü˙úì˙ûü˙úü˙˙ŝŭŭŭ˙˙˙˙úû˙˙˙ŝú÷ùŭ˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ü÷˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙ù˙ü˙˙ŝ˙ŝŭ˙˙ô- Îí˙÷ú˙˙˙˙˙˙˙˙˙˙˙šÒúɧ ¨Ô˙ŻÊú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ŭùööùŭ˙˙˙˙ú˙ŝûù÷ŭ˙˙˙úùŝŭ÷û˙î˙ü˙ŭê˙ö˙˙ŭê˙ŝó˙ú˙ú˙û˙ö˙ö˙Ô, ĝŭ˙˙ŭ÷ûĝ˙ú Û˙ĝü˙˙À"$ŭô˙˙í˙˙˙ĝĝ˙˙ŭġ˙˙˙˙˙ùúö˙˙ùòû˙û˙˙˙ŭùĝü˙˙ûü÷ôŝ˙˙ĝ˙˙˙˙˙˙˙˙˙û÷ŝġ˙ñ˙ôö˙˙˙ü˙ü˙üúüŝ˙˙˙û˙˙ĝ˙˙ôĝ˙ĝ˙÷û˙üû˙ù˙÷ŝúú˙˙÷˙ùò˙˙˙úù˙˙ú˙˙úòü˙˙û˙÷ŭ˙˙˙ô˙˙˙˙˙ŭ˙ò˙˙ûë˙˙ĝù˙ú˙˙˙˙˙˙˙˙˙˙ê˙Ç1ĉ˙˙ç˙˙ú˙ê˙ù˙˙˙ŭñúŭ˙˙üü˙˙˙ü˙÷ö˙˙˙ŭ˙éëú÷˙˙ĝ˙˙öí˙÷˙˙ŝ˙˙˙˙ò˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙üŭö˙˙˙˙˙˙˙˙÷˙˙î˙˙ŭ˙÷˙ĝ˙ûŝä˙ïüŝô˙ö˙˙˙ô˙ú˙˙˙úûöüŭ˙ûù˙ŝñ˙˙ú˙ù˙ġ˙ŭúü˙ŭ˙ô˙˙ùù˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙óŸ¨Üĝ˙êìù˙ñ˙í˙˙ùô˙˙˙íĉŝïïû˙ŝ÷ì˙ŭó˙˙˙ŝ˙ĝ˙ŝ˙˙ê˙˙ñù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ûüĠ £ŝ˙ŝûú˙˙û˙˙ŭ˙È1"ĵ˙ö˙ìö˙ë˙ûü˙˙˙˙˙úúï˙ĊİŬ˙˙˙˙ò˙˙ñ˙˙ĝ²˘Ž¨àü˙ú˙˙Ĥ£†­ñú˙˜‘œ§˙üÒ¤“¤Ïŭôü˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙˙ïá˙Û ˙˙˙˙óŭ& ûü˙˙˙˙üüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˘£˙˙ŝûúŭ˙˙˙˙˙˙üó˙ÖŻ­˙˙ó˙˙ü· Û˙ò˙˙˙˙˙˙˙˙ġ˙˙ù˙˙˙÷˙ú˙÷ö˙ü˙˙˙˙˙˙˙˙˙ûööŝ˙˙˙˙˙ŝŭ˙˙ŭŝ˙ú˙˙˙˙˙˙˙ŭ˙˙˙˙ûô˙˙˙˙˙˙˙ŝö˙ĝŭ˙ŭüŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŭ˙ñúġ˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙è˙˙ïŭ˙ġ˙˙ŭó˙"ù˙óù˙˙û˙˙˙˙˙˙˙˙˙û÷³  )Ĉù Öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŭ˙˙˙ù˙˙˙˙ŝû˙˙üŭ˙˙ü÷úù˙ŭí˙˙ċŞŸ˙ŭġŭ˙˙ġ˙˙˙˙ùŝù˙˙è˙ù 4Ë˙˙ë˙˙˙÷˙˙ĝ›ċ˙˙˙ŭ˙ÍÌ˙úġ˙˙˙ùŭ˙˙ûŭ˙ò˙˙ò˙ŭ˙˙ġ÷˙˙˙ŝï˙˙ûú˙˙ŝû˙÷˙˙˙üŭŭù˙˙˙˙˙˙˙˙ñŝ˙ġ˙˙˙˙˙ñ˙í˙ó˙Èù˙˙˙˙˙˙ïü˙úŝ˙ù˙˙˙˙˙˙ûöô˙üŝ˙÷ŝ˙˙ôûö˙˙˙öë˙˙˙ŭê˙ŝß˙˙ùŭ˙˙ú˙üúü÷ô˙˙ñ˙ġ˙˙ò˙ĊÄ˙˙˙ĝÔŭû˙ù˙˙˙˙˙˙˙˙ĝ˙È4í˙˙ôü˙ù÷˙öĵ˜§ÎÖ˙ĝ˙˙˙˙˙˙˙úñ˙˙˙ŝŝ˙íèé˙˙ù˙ô˙˙˙˙ÓË˙ŝ˙×ËÈĜ˙ï˙˙˙˙˙˙˙˙û˙íùĝ˙ëÚßá˙Üġòö˙óèÄĠÓú˙ŭÎÛĈÌË˙˙˙ġ˙˙úÒ#ĊÎÓ÷ú˙ĝĝĝ˙ŭ˙Î˙˙˙˙ï˙˙˙ó˙ġ˙ûú˙ĝú˙û÷û˙ŭò˙˙ĝ˙˙˙˙˙˙˙˙˙í˙ŝŭŭĝ°˙Ä˙˙˙˙ì˙ġ˙˙ġ˙˙˙ö˙ŭúŸ#$²ìÖ˙˙ġ˙ü˙ïġ˙öú˙ŭ˙ñ˙ú˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ûû˙Ĉ," áû˙ù˙ûŭ˙ü˙˙ôŝĤ$˙û˙˙ö˙ĝ˙÷˙˙˙ŭ˙ï˙˙˙˙÷Ô›½˙ŭ˙˙ĝ˙˙ċÌ Ï˙üġŝĊ%# ˙ŭÂ'"" Ç÷*›˙˙ì˙˙÷ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝù˙ŭó“úú˙÷˙‘œ˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ •ù˙˙˙˙˙ŝ˙˙˙ô˙û˙Î !½˙ĝĝ˙öŝ˙Ïñî˙˙˙˙˙˙˙˙˙ú˙˙˙ŝ÷éÛ˙ĝ˙˙ú˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙÷˙˙ŝŝ˙˙÷ŭ˙˙˙˙˙ŭò˙öñ˙˙˙˙ŝ˙˙úöĝŝ˙˙úü˙˙˙˙˙ö˙˙ûóö˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙û˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòŝ˙ú˙˙ï˙˙˙ò˙˙ù° ĉû˙˙˙ĝ÷˙˙˙˙˙˙˙˙›ĉ˙˙"&—˙ž Û˙Ħ0Òü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙ŭññŭ˙˙ĝú˙˙ö˙ĝî˙˙ġ˙˙˙ŭ÷˙˙˙û˙óġ˙öü£ ˙ċóŭ˙˙ëŭù˙ŭŭ˙˙˙÷ù˙˙£ "˙˙ü˙ò˙˙˙ġ˙˙˙˙ï˙˙˙ú˙ûš!üíüġ˙˙˙˙˙ŝ˙˙˙ù˙˙òû˙û÷˙˙˙òċ˙˙ô˙˙ùöû˙˙û˙˙ŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙ë˙ûï˙˙˙î˙˙ûŬœ!™ıŭ˙û˙˙û˙ú˙÷÷˙Ìíäŭúċ˙˙ġ˙ŭŭ˙ú— Ñ˙ôĝ˙ĝĦŜù˙˙ú˙Ô²˙èëúûü˙ϧ™³ šŭŝ˙úŭòÎĤ˙ġ˙Ĥ ˙˙˙˙˙˙˙˙˙û˙Ĝ´Ĥ—Äûŝĝ˙Ä%,˙òŭ˙˙˙˙˙ŭû˙ŭîŭħŒ"*À˙÷˙˙ôóڕ!˙˜ ?‘˙ŝ˙˙˙˙˙˙˙˙ï˙ŝ˙ú¸4 2–˙˙úú˙Ĉ ³ùüœ&*ğúöô˙ù˙1Á˙˙ñ˙ŝü˙ûĴĊîŝ˙˙˙˙ö˙ŝ˙˙ò˙ŭû˙˙˙˙ê˙ó÷˙û˙˙˙˙˙˙˙˙ü˙û˙ü˙̟-˙ġî˙ù˙ñ˙öï˙ñ÷ò˙˙¤’, ´›…Ù˙ù˙ĵ’˜˙žŞ˘•Ğ™˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝü˙˙ĝĝŝĜ %ŝĝ˙÷˙˙ú˙ü˙˙ùü°2Ê˙ÁžĥŠĞ˙û˙ۆ£0ŽÔż­•!ž˙˙˙è˙# Öü˙Ü ˙üž  ·öħ• 9Ŝ˙ŭûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭü˙&& )Ó˙˙ŝ˙ġ°™˙ÏĦÓü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙£ #Ğ˜ı˙˙˙ŝ˙ú˙ù˙Ë &ŻË˙ŭ˙üœÒßò˙˙˙˙˙˙˙˙˙öĝ˙ﵙ%‹¨Ñ˙í˙˙˙˙˙˙˙˙˙ù˙˙ċ° Ì˙˙ûÓ  Óû˙˙˙üŭ˙˙ñÜġŻšÊ¨ñ˙ô˙˙öѨšÉĝŭäˆ ‘˙˙˙çğ››²Ĉ˙˙˙˙˙˙˙˙ĝזĈ, Í˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜĠË "Àßŝŭ˙ü˙˙˙!”˙ŭö˙ŝò˙˙˙˙˙˙˙˙˙§ Öü˙Ÿ ’˙÷¨!™˙™$ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙ĝŞŞĝ˙˙˙ŭü˙˙É·ï˙÷˙˙ġÓ³Ċö˙ĝüŭ˙óùŭ%—ŭ˙÷˙ùüŝ˙ôéñŸŻÊ÷˙ú˙˙÷˙•"œ˙˙ùù˙÷óü˙ì˙˙ñ˙˙ù˙˙˙ĤÍ˙ñ˙˙ì˙ŭô˙˙ö˙ü™! Şò˙˙ö˙ŭĦÛûú˙˙˙íĵú˙ö˙ÇİÍû˙üû˙˙˙˙˙˙˙˙˙˘˙÷ó˙üÉ!,˘ŭ˙ĝûú˙ò˙ŭ˙ñ ”ŭ£Ÿ˙˙&˙˙ùĝà Ċ˙ŽŸ˙ü˙˙ #'Èĝ˙˙˙£Ÿ˙˙˙˙˙˙˙˙˙˙’"!˘ŭ˙ÑÓ & µ•Üñ˙˙ŭü˙˙˙úúÉ)֜Í˙˙Ï( *ġŸ ˘Ñ˙˙˙˙˙˙˙˙˙ò˙Ö% "#Îú˙ŝû"ŜÌ ,£˙˙˙ġ %—ó˙ïœ! / ˙ò˙˙ĝ !ü˙ù˙˙˙–˙ó˙˙Ë! $%ê˙ŝ' ŝ˙ĜùÇĤ£Î&0ë˙ûÏ "& ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙÷Ĉ' * ó˙˙÷˙˙ù˙ŭŝ˙˙˙ ÒÙ%ŝĝ+İ #Ş˙˙öŝ˙ ¨Çú˙!˙ûĝĜ+ÖġüŬ £˙ġž ˙üñ˙ö˙˙ô˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÚ !Ê˙ûġ˙˙ ùÄ'"ĝ˙˙˙˙ò˙˙-—ĝ˙ÏĜ˙úü˙˙ó!Úŭ˙ŭ˙˙˙˙ü˙!˙ûŝŭ#˙ġġ˙˙ö˙˙í˙ĝú˙˙š )Íġ˙˙˙˙˙˙˙˙˙ñ˙Ô›˙Ò ×ĝ˙ĝ˙üÏ&# ˙ŭ˙˙ö&Ÿ£" úӗ Ĥö˙˙˙ùüû›ŭ˙ûŭ˙˙ŭ˙ü˙˙ô˙˙˘$Ġï˙û˙ ˙˙ŭ˙˙˙˙˙˙˙˙˙¤ ˙˙úĝÓĤû˙Î )œ˙È& Ħ˙˙˙˙˙˘ú˙ŝ˙üöĤû˙˙˙ĝû§’˙˙˙ü˙˙÷İüĝ˙ŝÔ !ò˙üÏ›˙ú˙˙˙ü˙˙˙üü˙ġĠ -Óûô˙˙ñÒ µöŭ˙üúùï˙ŭ˙ŝĝŭ˙ŝ˙˙ŭ÷ħ !ÏÓĈÏÓÑò˙˙üŝ˙ù£Òŭŝ˙×ÇĦö˙ĝ˙ŝü ›ßĊÎü˙÷ù˙ŭû˙˙ŝ˙˙ù˙–Öüŝ˙ Ġ$ Ĥ˙ñ˙ûüù˙ñ˙Ϥœ§# %„Óá ˙ŝ˙˙ż%#ĝùġ,Ì˙˙ǢĦÍ£ŝó˙ú'Ĵœš Úè˙˙ü˙ŝŝ˙* Ë˙˙› !˙ŝ•*œ˙˙ġ˙üïŭ˙˙Ĉ)*̚. ĵ˙˙ šüû³Ĥ˙˙˙˙˙˙˙˙ùŝÎİ"¤££!™ŭŝ˙ž Ó˙œ&İÊ˙˙úŭ˙“%˙˙Ħġ˙— ž˙à—˙û˙ôŸš˙ú ġŭŭÒÀĦ˙ġ˙• Ô˙Ô$šú˙ŭ÷˘!Ï˙ŝ˙ö"˙˙˙Öžž˘ 'Óŭ˙ġï˙ù˙˙˙ĝġ˙˙÷ŝú˙˙üŭ˙˙û˙š˙ì˙˙˙˙˙˙˙˙ĝ˙˙ŝŝĞ˙ù§* ŝ˙Íö§#˜ûŝ˙÷* ĝ˙˙üÔ"Ôê˙˙”$˙Ùċ˙•˙˙Ħĝüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙û"$Ŝ˙˙ġ˜˙¨Ħœú˙˙½˘1 ˙˙˙ŝġġ*(>ú˙˙ŝïûŝ˙ó*!–!œô˙ŭ˙Ôû˙˙˙ĝü˙˙ġ˙˙  Ö˙ҟ#"˙˙˙˙˙˙˙˙˙˙˙ċ$"ÌĜ !˙˙ĝŭ, $(˙Ĉù˙˙'6$ )$%!!&Ç˙ïö˙ŭ!(˙˙Ÿ&´í˙˙ûûŝ˙ô˙ĝ˙˙ ˙àġ˙# ,˙úü˙ġ˙˙˙˙˙˙˙˙¤'“ê˙˙üĝù˙î/Öö( ħŭ˙ġŜ$˙ĝ˙˙Í%üúö˙Ĝ Ì˙úöá’Ѥ Ûú÷Ò£(&˙Ĉ&­é˙Ĉüŭûŭ˙˙˙˙˙à   Ù˙˙˙˙! ü˙òúú˙˙˙ü˙˙ü˙˙ñĝú˙˙פžğ•&¤˙ò˙ë˙ Şĉĝ˙Ÿ(#ú˙ô˙4ĵ ¨˙˙ġ˙ŭûüûú˙˙ëş# ŝùöĤñûŭ˘)Î˙ŝġ˙˙ú˙˙½²ÔúŝĴ"ž÷ù§˙ĝùùÒ ( ĝ˙÷Ú˙˙Í"ĞÈĠž˙ê˙" ô˙˙ ˙ĝĝ˙˙˙ĝ˙ž$ï˙˙˙ŭ˙ Á˙÷˙Ĝ“ž˙ġŭ˙˙˙˙˙­(ò˙ŝ—'# š˙˙ŝÙ$ ŭüĝ›&Ħ˙˙˙˙˙˙˙˙˙˙ )ä˙ñß*“ŭ˙ċ˙—  ûĈ˙Íû˙˙ö˙× á˙˙ĝĊòÛ"˙È÷˙˘ ˙˙ġ˙˙›"Óê˙ž‹˙˙ùÍ˙˙í˘ ŭ˙ġ˙à$œ˙˙ŝŝġŝ£ %˙ü˙&Ħúùû˙üĊ%˙ôĝ˙ #,˙˙˙ö³ Ê˙ŝ˙˙˙üöïû˙˙ù˙˙˙û˙˙ŭŝ˙˙˙ĝ .Çû˙˙˙˙˙˙˙˙˙˙˙üœÑŭ˙££˙˙öĝñ˙˙ œôġŭ˙˙ &˙ùü£'İġ˙ŝô˙˙ż&§˙˙˙Ö(’˙˙ŝ% Ĵ˙ô˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝŝ% " *”ú˙ġ˙˙£ Żñŭû˙)˙˙é˙Ú ˙˙ú§Ï˙˙˙˘% -ˆ÷ï˙˙˙˙˙ĝ˙û˜;" Ö˙˙í˙ô˙î$Ñŝê˙íŭ˙˙òüü÷îµ"ŭ˙ŝ˙ġ˙˙˙˙˙˙˙˙˙ŝ $&É˙ġĥ-˙ë˙İÎÔî$!¤˙ŭ˙ġ˙Ş4#ÔÏÏÑşÎ°"(Öĝ˙ü×úó˙ĴÊô˙üĝŭ˙˙˙˙ò˙š*ßıË&˙ò˙Ú ™˙˙ü˙˙˙˙˙˙˙˙˙Ġ¤ñ˙ì˙ŝĝĦ!Î˙Ÿ -ġñ˙˙  Â˙Í˙Â!İ˙÷˙ï! ˙#¨âÉ˙š#ŭĠıĝŻ ßĜÂ˙ò˙˙˙ŭŭ˙ŝûúŭ.ĜáÈùŭì˙˙˙š$û˙ûú˙˙úôîô˙˙˙˙ù˙˙˙˙ġĤ &ÌÀ˙—˙˙˙Ö(Ì˙š  Şûó˙ &šŝù˙ !$'ï˙ö˙÷ü˙˙˙ŭö˙˙ŭœ'"—˙˙˙#˙˙ŝñ˙ĝü˙˙˙÷˙ŭĝ½"ö˙ŝĠ"żùí˙ŝ˙  ˙˙˙˙ò$˙û'Îó˙úó¨ . %!˙Ùü²ž˙ù˙˙/ñ˙˙ù÷ü˙˙˙% ˙˙ï˙ì–"­˙˙÷˙÷ċŸ˙˙÷ôìí˙ğ¨˙Ç÷ ¨ŭüó˙•& ˙˙˙ŝ·™˙˙˙˙˙˙˙˙ġ,)!˙ñú˙˙˙– # Ğ˙ü˙ûĝù $ġ˙ŭù˙ÌÍáû˙Żöú˙ö˙§ %˙÷˙˙û" ˜˙ŭ#˙ĝê˙÷¤×ĝ˙÷˙  ˙ü˙˙˙ ĝ˙˙ö˙˙ñü²é˙ôĠŜ˙˙ŭù˙ ! ħ˙˙˙Ò˙ĝĝ˙ġ˙ Ñù˙ŝġ˙÷˙˙˙ö˙˙÷ġ˙ŭ˙˙ŭŭ˙˙˙É Áû˙˙˙˙˙˙˙˙˙ĝ˙ 2 ˙üó˙ì˙˙˙˙ĉù˙" ×˙÷˙˙ ˙˙˙ ˙ùû˙˙ûâ×ŭ÷# ˙ÏÚü˜˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ûĝĈĥ%&§Ó˙üüŭ˙ µ·˙˙È˙Ħ#ùĝÖ˙”!Ĥġ˙ŝ,"òùñ÷ŜÑ˙î˙˙˙˙üġ˙˙úü˙ü"˙ġéí˙ú˙ùĤ ŝ˙˙˙ì˙ôü˙˙˙ÎĞ  #-ó˙˙˙˙˙˙˙˙˙˙ŭÙ!˙ùŝù0Şü˙ġ˙÷˙˙ù ˙ó˙ĝ˙ ­òüù˙Û*¨ä˙ú̍ ˙öĠ˘žŸ)˙˙÷ù˙˙û˙ó˙ò˙& §ò˙˙ŭ˙ Ùüóŭ""Ĉ˙˙˙ĉ˙ñ˙˙˙˙˙˙˙˙ĝÓ(ĥ2Ş–˙ûÈğ˙˙ûùÏ,˙ôù˙ 2Ĝü˙ŭ*Ïù™ĝÜ˙Ğ˙ġÓ ›ú£›/‹˙Ö˘"›ĝ˙˙ï˙ŝüŭŝŭŭŭ ûöú˙˙˙˙ÀöĜí˙˙˙úù˙˙üŭ˙ï˙˙˙˙ĉûá '•ö˙˙ŭ˙%ö˙î•/óóœ2§˙ŝ˙§Ë˙ü™ " œ› ŭûù˙˙˙ŭöûĝö˙˙˙  Òŭ˙žËŭ˙óŭ˙ü˙ĝü˙˙ĝš "˙˙ñßÛ˙˙ŝû˙Í˙ŝü˙˙€'Òŭ˙ ˙˙ó˙Ï - —Ğžžûŝ˙öšŞìü˙˙“ ˙˙ò˙˙˙ö˙ĝ"ŭü˙ò˙ §ĝĝ˙˙˙•˙ô˙˙˙˙˙˙˙úŭ˙˙ü!˘ŭ˙˙Ì˘#™˙ô˙ùÉ"Ÿ˙˙˙˙˙˙˙˙ÒŞ" ¤ŠŻ˙Ċ˙üŭôô´ ġ˙ŭ˙˙˙˙ùñ˙óú˙à˙˙ë˙µ˙˙˙˙ü!˙˙ëġ˙”% )˙úÊŝ˙ŝöù˙˙ŭ˙ŭ˙ò(!$˙èú˙ġĴ˙ù˙ŭ˙û˙˙˙˙˙ĵ#Ñùü˙ñŭŝ ÷ù˙˰î˙ŝ˙˙é%#Ü˙ĝ˙˙˙÷ġïĝ˙˙ú˙˙ŭ˙˙˙üûüŭüÒ"â˙˙˙˙˙˙˙˙˙˙˙ûüÒŸ™˙ŝ˙üû˙ï˙˙Ĵ "Êû˙˙˙âġ˙Ôä˙˙ú˙˙È"˙ë˙Ĝ¨ĝ¨' "˙#Ĵ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òù˙˙˙żö˙˙÷˙È˙˙üġ˙òŭĤ´ûù˙Ĝ˙üŝó˙˙ ˙ŝ˙˙ö˙ü˙üéŭŝû˙úú˙üû˙ ÷ù˙ûúöö˙&Ĥü˙ŭĉ˙Ä ›˙Â˙˘# !Š˙˙˙˙˙˙˙˙˙˙˙ĝ˙ôĊüò˙˙ü—˙ŝĝö˙ç˙üú˙ Ñô˙˙ŭ˙ ë˙˙ŭ˙Ë.Ï˙˙˙˙œ!1žĝ˙ú %!(. Âŭ˙˙˙˙úö˙˙ÎĜ§ Ĥú˙úŭ+(›˙ö˙’#Éŭëì˙ì˙˙˙˙˙˙˙˙˙ŝ˙ÄĴ ,!£˙ĝû˙İġ˙ĝ˙ŝŝ% Ÿñ˙˙É˙ú˙ŝÈöÓ É˙ùˆ´"ĦŜġ˙ŝ—(˙˙ĝ¤ú˙èŝ˙üüüŝ˙˙˙˙)&ûŭŝ˙öú˙ŭ˙!*ü˙ü˙ĝ˙ŭ˙˙ü˙ŭ˙í˙ŭ˙óŝ˙˙ĝò˙¤÷ŝĤ(×˙˙ %êü˙˙˙%˙ñ˙ĤÂ˙$$˙˙˙˙úŭ˙˙öú˙ŭ÷˙˙˙˙˙˙˙'›˙Ä˙ž! Ü˙˙ë˙˙˙÷ġ˙İ˙˙üŭ&Ċú˙÷˙˙5ŝŝùô˙ı)˙Ħ³ü˙˙˙-˙÷˙˙Ĝù˙˙˙ë˙ŭš ˜˙˙êü˙#˙ŭ˙ŝ˙˙÷ŭ(Óŝ˙˙ô "Ë÷˙˙˙ù˙ $™˙˙ê˙üë˙˙Ĉ˙ʨ #²ô˙ó˙Ž&°ú˙˙÷È!¤˙˙˙˙˙˙˙˙ġ  ³˙˙˙˙ï˙ġ˙ĝ˙˙ú#!˜˙˙˙˙üĠ"!î˙˙ñ˙ŭ˙ŭ˙ĝò˙˙˙úÏ $!ĦñŬ˙ŝ˙ˆ˙$Ĥ×÷˙˙ô˙˙ü˙÷˙û ĝ˙˙îÖ­(Âú÷˙ú˙ùûš œ˙óó²÷˙˙ŭ˙ġ˙&˙ŭĝá œ˙˙˙ò÷³ ˙÷˙ü÷˙˙˙ôû˙ö˙˙ü˙˙ŝ˙ŝŭŝ˙Ġ&"Àŝ˙˙˙˙˙˙˙˙˙üè˙ "7‡ü˙˙˙öŝ˙ò!Êñ˙ù˙ħŭ˙Ïéŝ˙ĝ˙˙É!˙˙ŝퟧĈ˜$‰( È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙óí˙¨ &˙ù˙ú˙˙˙ŭù˙ġ˙( äûü˙˙ù˙ġ˙Á#“˙ġ˙˙ú.˙˙˙ŭ˙ŭ˙˙÷ú˙˙÷ù  ú˙û˙˙˙ü™'É˙î˙˙ò³ áü˙›$#ßòÙ˙Ö×˙˙˙ó˙˙˙˙˙˙˙˙˙ûû$ è˙˙öġ¨ "Ù˙˙˙ġŝ˙ŭ˙üÊ %Ì˙ŝúö˙  ˙íü˙ŭ#÷ûùùŝ›"úŝĝ!Ĥ˙ġĦĈô˙ùñ˙˙üŭ˙ŝŝ˙÷Ĵ %˙˙˙ù˙˙ħùùï0˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙ùÒ§ġü˙ĝ˙ú%–Ĝ˙ô˙˙˙!˙˙úüÄö˙ü˙ (ÒûÖÔ˙˙îú$##˙ü˙˙¨ %¤Ï˙÷ !˙˙˙ü˙˙ŝüŝ˙ûô"×˙ùúŝ˙ŝûù›"Ê˙û˙˙ûï˙˙ûöí˙ûĝñ˙'˙î˙˙˙'†˙˙#Ïóó(ŝ˙ĝ˙˙Ĥ&˙˙ñ˙˙ĠÓôŭíÓ˙˙úñ˙˙˙˙ŭôúûê˙ĝû * ĝ˙˙Âħ,˙ö˙ôû˙˙ġĦóŭ˙Û ˙˙ŝ˙˙ùû˙˙üñÑ%ó˙üŝü. ˙ü˙Êó˙˙÷ûôŭùĴœ˙ü˙˙Ê#˙˙ô˙˙ò˙%ë˙úŭü#( İ˙˙ù˙˙˙˙ú˙˙˙˙˙÷˙ŝŬ'$2ˆ˙˙˙ôŬ# Ċ˙îñ˙Ġ ˙˙˙˙˙˙˙˙)ñ˙˙ùùûù˙ö˙÷˙ĝ÷˙Úġ˙÷˙˙ö  ˙ì˙ŝüûë˙ŝñ˙ùí”2 !&Î˙˙û˙š"0ĦĠî˙ûò˙ùñ˙ Ġ˜$!Ħ˙â˙˙µ´ĝ˙˙˙ŝŭÒ ÷˙Ê"äŭö˙˙Á'Ÿġ˙˙Î* ˙ü˙ù˙î$ßî˙üĝ˙żĈë˙ŝï˙˙é˙ŝŭŝ˙˙˙˙˙É( ŝü˙˙˙˙˙˙˙˙˙˙ò“)! Ġ˙ĝü˙˙î˙³ Ö˙˙ĝ›˙÷×Ħ˙÷ŭ˙˙ôÚ"˙ġ˙˙â&ߔ%.â˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ç˙˙˙Ô ĵ˙ö˙ġü)Ĝ˙˙ö˙Ê&”˙ö˙òŭï˙žĤî˙ġúÓ!Ĵúû˙˙ù÷ö˙ù˙˙˙ü˙¤ ˙î˙˙î˙۝ Ğ˙˙ù˙ëĦ ż˙˙Ú%ż˙öï˙˙ŝú˙ĝ˙˙˙˙˙˙˙˙˙ü˙˙!$Á˙ñ˙˙Ż–ù˙ŝ˙ôĝ˙ŭ˙Ûġ˙˙˙ù$ Ş÷˙ô˙Ùûŭ˙û˙Şœ˙Äú² ¨ù˙˙˙ŭĝ˙˙˙˙ġŝ˙˙ŭ˙ú˙Фóúĝ˙˙óò&˙à˙š˙ġ˙÷ñ˙ú˙˙˙˙˙˙˙˙ü˙˙ô˙ôŝ˙˙˙˙˙Ĉ %‘àûñ˙üôŝ™(”˙ÙóÙ Ë˙˙ö˜4Â˙˙öñ˙˙ß Ÿ”Şċġ˙˙$Ë˙ñ²'–ßŝ˙û˙˙˙üüûòç%Ê˙˙˙û˙è˙˙ 1 ˙˙ŭü˙˙˙Í˙§˙˙˙ŝ˘˙ú˙ùó˙”áôĦ˙÷ü%˙˙÷ŭŽ! ˙Û÷ŝ˙Í š˙˙˙˙ĝûùŝ˙ġ˙ñ˙˙ŝü˙˙˙ü˙ ŝüíü˙ö—#!*ŝ˙à˙˙ò˙˙÷"Ĥ˙˙†#&˙˙ù˙úó(˙û˙ŭ˙˙* #4úú˙˙ôœ! ú˙˙ù˙ç˙˙˙ŭŝħ"§ò˙˙è&$¤ùé˙˙˙ù˙˙  ˙ú˙óä˜Ëüĝù˙üÔ!í˙˙ü˙ĝ˙ê˙˙›&ùı˙ĝ˙ŝÓ $Ñ˙˙˙ó¨ ˙˙˙˙˙˙˙˙Ÿ ¨˙ò˙˙ö˙˙ù˙˙˙˙Ì! & ˙ġ˙ö˙Ñ"# ˙˙ó˙˙ù˙ġû˙óù”˙ šó˙ġ˙ŭž* µ˙˙ü˙ó˙ŝ˙ž.˙ô›˙˙òüÙ Ìú˙˙ò˙ ôÙ˙!˜˙˙˙÷úÙ! ­˙˙˙á#›ġġ˙˙˙˙˙ç˙˙ġĠ.É˙ù˙˙ó˙˙üŝ˙˙üùûÜ ˙˙˙˙˙˙˙˙˙˙é˙˙,&!%˙ûĝ˙˙˙# ŝŭù˙Ğ!˙û˙ í˙˙ü˙öŻ ×ġ˙˙úê¤#'ŭñµ˘˙ŝô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ĝ˙ûÓ"˙ŭ˙ü˙÷'Ë˙÷˙ŝŞÒ˙˙ġ˙ü˙ # ŭ˙˙(ŝŭ˙˙ü˙ùú˙ŝñ˙ö˙”µŭÍ˙˙˙üöš˙í˙ö˙•!Ó˙ùÈ. +É˙˙˙˙ŭö˙ó˙ġ˙˙˙˙˙˙˙˙˙ó˙Òü˙˙ג­ûû˙ë°˙ú˙- Ï˙ñ˙˙˙•˙ú˙˙Ä&×ŝùÎ˙Ħó˙˙ Ÿü˙ŭò˙˙˙ûûü˙˙ü÷˙ö˙ŞÙ˙üŭ˙ġ˙$Ûöġ˙žŝ˙ġ˙˙ûŭ˙˙˙˙˙˙˙˙˙ñ˙˙˙÷˙ĝ˙ĝ˙ĝ§Ö˙ö˙ŭġ˙˙Ì!˙˙ġ×É˙˙òÔ.ä˙÷ĝ˙˙÷Ç ˙Ñŭŭû˙ġ˙É Ĥ˙ü˙Ó´˙ô˙ü˙ü˙˙˙˙˙˙ôĦÁ˙˙ô˙˙˙˙òž"˙˙üŭ˙ŝúĝ×&óŝŭÏ )Ê˙üü˙˙˙ĝŝ*¤î˙'ù˙!¤ŝĝü˙ú( Ĵ˙û˙ŭ˙˙ùŭ˙Ë"ù˙ù˙ĝŭóŝ"ŭù˙ӕÑ˙÷Í˙ĝ˙÷ûŝ˙ġ˙ ˙ûŝĝ˙ĝü˙ ˙÷˙ú˙÷Ó %!˙˙ù˙ŝ˙˙˙˙˙˙ö˙˙š  ˙ŭñ˙"Ä˙ŝ˙˙÷˙˙÷˙ŭĝßëĦ#%˜˙ü˙üûÔÎ˙ĝ˙ûŭ˙˙˙ŝĦ›˙˙ ˙˙ù˙Ì! ¤˙ú˙ʞ›˙˙˙˙˙˙˙˙ŝ œ˙Óùġ˙ĝŝŝû˙˙Ñûœœ°Òŝù˙Ï"  ˙˙üŝ˙ü÷˙˙ù­# Ó˙ö# ˙ĝ˙ü˙˙! ŝ˙ö˙ĝ˙÷û³ë˙Ö ¤ô˙˙öÜ–˙˙˙é˙ŝ˙ ÎùÌ.ŝ˙ŭü˙Ô Ìúŝö˙ž 'ŭ˙˙ŭ÷û&Ċ˙ġ˙Ÿ'¨˙ü˙ü˙ŝŝ˙ŝôîïÇ&#üġ˙˙˙˙˙˙˙˙˙˙úŸÊ  #Ë˙˙˙ö˙ !$Ê˙˙ù˙œù˙ŭž£Ôö˙ŝ&ġ˙úġü˙$ŭ˙Ÿ÷˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ġû˙™+$ĝ˙˙ûŭÄ˙üŝú˙Ï"˙î˙¤"üüü˙˜³ù˙ŝ˙˙ŝŭüúŭü˙ŭ˙Òœö˙ûŝü˙ÌĤ˙ŝŝ˙˙!÷üÓĠĈ˙ŭ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÌ˙ö˙Ħž˙ĝ˙ÖĤôû–' Úŝö˙˙˙˘ŝŭ˙˙Ûô˙˙˙˙ !Ê˙ü!úú˙ŭĝ˙ÓÓ˙öü˙˙÷˙˙˙˙! œ˙ù˙üü× ġ˙˙˙˘¤Ñü˙˙˙ġú˙úö˙îŜĝüü˙˙˙ŝüŭ˙÷˙•žÓ˙î˙˙ġüü˙§'ŭ˙ûÉ ´ùó˙ù˘Şù˙˙ĝĝ˙ù˙úô˙˙ü˙˙˙"Ùó˙˙"Ñġ˙ù˙˙ĝ˙üÈÏ˙ûœÏùú˙ŭ˙ï˙˙˙•˙˙ü˙ê˙˙ô˙˙ ˙ó˙› ú!˙ŭ&üô #ŝó˙˙ü" !’˙ö˙ûî˙˙üŭ§ö˙ú˙˙ö˙#·ñ˙û#È˙ŭ % ü˙˙÷ŝŝ˙÷˙ĝĞŞÀ˙˙ŝ˙ġ˙˙˙×ŝû˙˙ġ˙, !Ÿï˙˙ŭŭä›˙û˙óÒ#Î˙˙òĞ ĤÍ˙ó˙*(˙ôŝ˙˙ŝ˙˙ÒœŸÖŝò*Ğ˙üŝ˙ú šü˙ü˙úĝ˙ü˙Ñ&ÉüÚ" %Ì˙ĝ# ˙üġ˙˙˙ŭ˙˙ŝü˙û£ÏŝÔùĝÛĦ˙ü˙˙ÍùŞüü˙û#™ĠÏŝúÖùĜ˙˙˙Ÿ +ÁÙĜĴö˙ô˙ù$ ˙úú˙˙ġ˙Ŭûü #Ž˙˙ó˙Ù ˙ôÖ˙ü˙í( ˙˙#Ì˙˙ëŭ˙öûŜ (Ê˙ŝô˙—’˙úû Òŭŝ˙ŭ˙˙˙÷ŝ˙˙ ˙˙˙˙ŝŭŭŝ÷˙˙%ϧĤ÷˙óŬ Óŝü˙ú˙˙ŝ³÷˙Ò#“˙˙˙˙˙˙˙˙–˙û­!˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ö %'ŭñùü˙Ÿö˙˙˙òĦ %œù˙˙ ˙î˘÷˙ŭòŞ&Ÿŭäé˙˙˙˙˙˙˙ġóŭ)ُÎ˙ô˙(ŭŝ˙ġô%Ô˙˙ü–žÔĝ˙ôö˙˘˙ò˙˙˙˙˙˙˙˙ü˙˙"Ġ˙üù˙ü%#˘˙ġéŸö˙˙&Ġ˙˙ßóĊ"Ĥú˙ó˙”!Ğç˙úŭ)È˙˙İ%˙ŝ˙֟˙˙üġùúġ˙÷ô)ÓúûÊ˙”'Ëúŝŝú!˙ù˙úû˙˙í˙˙Áğ Ĝô˙Îû˙˙ü˙˙û!£˙˙ŝ˙üù˙˙˙ŭ ĉ÷ŝÜ'ç˙˙ŭ˙  ùüôÉ˙ġ˙˘°ôŝ˙ûùġ˙úÂ'¤ïö˙,×˙ĝùŭ˙˙§$ħúµÖü˙ûĝû˙˙ü˙–Ĥ˙î˙Ì #š˙ôŭ‚˙ĝ!“˙ä˙"×ù˙*#²ö˙˙ '˙˙˙ô˙˙ŝöü !"ûùŭü˙͙ |˙˙ġ$&âôû$ +òöö˙˙ûûüĞü˙ûí˙ô˙˙˙ŭ˙ĉŝ) ˙üŝ˙˙˙˙ò˙ñ˙ġ& ˙˙î! ñ˙˙'™˙˙˙˙ù˙˙˙ü˙óë˘- ’ĥ˙†( ›²˜š˘& ´úŝĝ˙ŭŝ˙˙ċÖ% ĞĤ0 Ĝ÷à" ñ˙˙ĊÁ˙˙ñŭ˙ŭŝ˙Ö "³˘ŞĴ§Ûì˙“˘£ °˙Ä+žüŝÎĞ$ %Ħü˙$ "ž˙úŭüȧŭ˙ù˙û˙˙ µ$/Á˙÷˙ (ĥÂ˙ôÚ  Éò˙Ê&"”Ş&'Ôô˙˙ß #Ÿ—˙˙Ÿ,³öß Ğ˙ŭûûôú˙˙˙ó"'%òĝ˙˙ŭûŭ˙˙Í )›Ç£œï˙Ÿ2 Ô˙Ҙ'"—ġúù˘!4Ħ(†˙˙˙˙˙˙˙˙˙Ч ×˙˙é˘í˙˙˙úù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûó˙ûó! %¨àÔÑ˙Ÿ Şóûŭ˙ $ žġ÷ /ŭ˙Úäñ˙ôĤ% ˙ĝŝ˙ĝ˙ġ˙ŝ˙˙1 $!Ëŭù£!˙˙ĝ˙Ó& ¤Ó÷˙Ç$Ä˙˙ĵŝ˙˙˙˙˙˙˙˙˙ù˙äÑ˙ŝù˙˘Ê˙˙˙ò¨· )& îûŝ˙#˜˙Ì˙˙(  ˙˙˙ĵ5¤ŭŜÑ!"„˙ŝü˙˙˙˙ô˙ŭŸġ˙˙Ħ˙˙˙ïĴ !Ô˙î˙˙óü˙üüŸ +ġÁ˙ñÚŜçŭ˙ëöŭöï˙ŭéù˙üÖ 'í˙˙ ž˙öû˙˙ öÙúŠ%$Ûĝ˙ŝġ!Ñ˙˙÷Ż ;‘Òù˙ù˙ŝÌ˙×  ó˙˙î˙˙ôĝùí´™ÚĜ / ú˙˙÷"%³ù× 'İ˙˙˙ !³ò˙˙ÊùġöŻŜŭ˙ì˙ûĝ÷˙˙µ( Ö˙˙ûöİ+*ùù˙Ĥîß  —˙ŭ˙ñú˙˙îİ$É˙ĝ˙˙ó˙÷˙ñŜÒ˙˙˙óüŬĤñ˙˙˙˙öĝĠ›$ ' Òġ˙ġ#!ÈċŭÎ&Çú˙úŭ˙˙˙#"ïÌì #1% Ĥê˙˙ŭ˙˙˙üù˙Ñ%+ è˙ (&"ŝñ! )ż˙˙˙˙ò˙ŭŝÌ *ħ˙Ï!"°  İòÔ˙ Ì˙ü˙Ĵ :Î˙˙ġŭû# Ġúŭ˙÷˙ûĝ"' )! )Î˙ĝ˙™ âú£!#+Ĥ˙ñ˙Ò!ŭ˙é˙%ùŭ #Ħ˙ò‘"‘˙ŭûŭ˙˙ü˙,   éô˙˙ŝûŭ˙˙. ʧ˙ô -ú× É&·˙˙ŭ˙ÎÔĤ$Î˙˙û˙˙˙˙˙˙˙˙ùôú˙˙˙˙˙Ë˙èü˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ü˙"! $ "ŝĝ˙Ê˙˙Ħ ˜Ċ–üŭ÷œ%‘ŝ˙÷ú˙ú˙ŝŝ˙ġŭ­* ˙ŝ˙&&ì˙˙˙ *Ôĝ˙ŭĝÈ  !›+˙˙ġ˙˙˙˙˙˙˙˙˙ '÷û˙˘%%#‡ô˙ö$ !)˙÷˙“#˙˙ŭŽ"Ĥŝóŝ& ˙úûĦ& !ìĉ˙˙ú˙úù˙ŭŭ$Ò˙ó %ĝ˙˙ġ÷˙úġ˙˙î˙˙ $£×!´Ÿ“ö˙˙ġŝŭ˙˙˙˙˙÷÷˙ġ˙œ˙˙÷˙*˙˙óôÍ" "• ˙ġ˙µüùüö˙Èŝò˙˜‹Ûġŭú˙óö˙îž$".É˙˙ò˙˙ô˙˙˙ú˙ü¨ & ˜œÓ˙ê˙² §èŝô$$‘Ĝíê˙üùѧİÛ˙òÉ£İ÷˙ŝö˙-—ĉ˙˙˙ŭšıġġü˙˙˙î˙˙ö˙Ċ$À˙ġô֚ $È˙ÏĈ$İ%”ô˙ġúö˙˙˙˙§ #!–Ĥ œ˙óü˙ĤŸÚïö˙ú˙ü*˙˙í˙üĝ˙˙˙ŝț%*Ì˙˙ç˙Ġ#Ż˙˙¤ ")Şü˙˙ûûñŝĊ•É˙˙˙êĝ •¨–˘Ş£˙˙˙˙˙ŝŝ˙úŭ˙îÛ#!˜ŝ˙ÇÏ˙˙ŭ£žÏƒ¸ïû˙ߏ'£Ôô÷˙˙ù˙ö˙ŭŜ((-Ìîï˙Ïô˙ü—¨İ›Ù÷˙úŭ˙Ù" (!œ˙ŝ˙óö (£Ŝ¸ #–˙˙û˙û˙È·ì˙÷˙ö˙ŭö֌ ĞûĴž˙˙˙ô˙£Ħ (“Êŝœ" Ëöú˙˙ŭÌ­¤#–°Ë˙˙˙DzŸŸ£˙ù˙ŭ˙ډ´ĴÇ˙˙ÒĞ #²üŭ˙ŝ˙˙˙öñ˙É˘Ş››İ£µ•ôû˙˙˙ŝŭ˙˙ò˘—Ĥ”žßĴ˜˜š˙˙÷˙›­Ş•§˜˙ùü˙˙ŝôñò˙ñĝ˙ŝ˙˙ü˙˙ŭ˙ú˙˙˙˙˙˙˙˙˙ôç˙˙ûŝĝ˙ïûö˙˙˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ż$#")!!ġú÷Ş#Ëò˙˙˙%ÏÖ˙'˜û˙ĝÈ "™Í˙îŭ˙ŭŭ˙÷˙˙ġüÁ"˘³ó˙ù'œÍ˙˙ù˙¨. ˙úġ˙÷Ÿ’!"ŝĝ˙˙˙˙˙˙˙˙˙óÈ %£˙˙êğùù˙˙Ĵž˙ĥ4$šŝüöٞ˙÷˙“%2˙˙Ĉ-˜ İ˙˙˙íÌ 5& ¤û˙öò˙û˙ĝ˙êġ˙íÍ­ -˘Ñûóò˙ĤšÑú˙˙˙ó˙˙ •˙˙î% !"˙ċ˙˙ïŭ˙˙êû˙˙ĝŝŝÏáí˙ôġ˙˙Î˙ŭ˙ŭ˙÷×Ò˜˙ó˙ö˙ŝéÊ&Ñġ˙˙ö˙ûğ˘˙û˙˙˙˙È˙ú˙ŭî˙ò˙ŝü˙üٕ™˙ë˙˙ö˙˙˙ùĝ˙˙ß˙ñ÷ÎÁ¤ĴÊ˙˙ŝĜ˙ùĝùüú˙Ïŝ˙ŭĝÉ˙˙˙î˙˙ïü˙ŝêñ˙˙É÷˙ĝû˙ĝŜî˙öúôù˙Ñ˙ù˙˙˙ùĝö˙˙ċ˙˙ö"˙úġ˙ŭ˙Ü˙˙˙Ĉ˙ĝ˙˙˙úÙüú˙ġ˙˙ü˙öù˙ùŭġ""'˙˙ŭ˙ê˙ñÑ˙÷˙ü÷˙ú˙ΊÎüû˙˙˙ó˙üò˙˙˙˙˙ĈôŜî˙öô˙˙éÈŝġÌ˙˙ŭóù˙Üüîû˙ñŭ˙˙˙˙˙˙ŭô˙˙ŝüúò˙˙˙˙ŝ˙˙˙ù˙˙ġûŝùŝ˙˙ú˙ŝ˙ñÍ˙˙˙˙˙˙ż˙˙ôġ˙û˙˙˙ü˙˙˙ë˙ÏĈ˙ù˙˙ŭûĝ˙˙ü˙ü˙ôúŞÒÏÍùì˙˙˙ú˙˙ŝÔùò˙ġùÛó˙˙ġüú˙ü˙˙˙ÌÏ˙½˙˙ôô˙ñ˙ï˙ġĝ˙û˙ÜÑÍê˙ö˙˙ŭ˙ŝ˙˙ü˙˙˙˙˙ò˙˙˙˙ÌŬûü˙ĝŭĠÑÓ˙˙ôô˙˙˙˙ñÊ˙˙˙÷˙òĜ˙ŝÒ˙˙˙úüî˙˙˙ġ˙˙ĝû˙ï˙˙ò˙÷˙üô˙˙ĝ˙ġ˙ĝ˙ö˙ŝ˙˙˙˙˙Òóŭû˙ü˙˙ôŭ˙úö˙Ë˙˙˙î˙û˙˙˙˙˙˙˙ŭ˙ġôŝÈ˙ĝ˙˙˙ö˙˙ĝ˙óĝ˙ù˙ú˙ŝ˙ö˙˙û˙˙ŝ˙üŝ˙˙ŝü˙ŭ˙ġ˙˙ġ˙ó˙˙˙˙˙˙˙˙˙ë˙ŭû˙ĝ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĝù÷û˙˙ ˜°Û ĦĈ™ĞÎĦ·˙˙Ĝž›šĥ§˙˙ĝôŭÈĴ¨˙öïÎĦœ˙˙é˙˙ĝ˙ö˙˙ôö˙˙ŭ˙˙˙ûöú˙˙˙ŝû˙˙ôù˙ĝ˙˙é˙î˙ùŝ˙˙ôô˙÷˙ü˙˙˙˙ü˙•Óžĉ˙üŭ÷˙˙˙˙˙˙˙˙˙˙ä´ÎŸÀ­ô˙˙àÑ˚Ŭ˙÷˙˙ïî˙ŭ˙ġŝùË˙ĝ˙˙˙ù˙˙ö˙ü˙ñ˙˙ġô˙Ħġö˙˙ç˙˙˙˙óŭ÷˙˙˙ܑœ˘Âàô˙ġ˙˙ĝö˙˙÷˙˙˙˙˙˙ñŸ½‘£˙˙˙˙˙˙÷ёú˙˙ĝ˙˙ùôô˙˙ŭÊ2 !'¨Èò˙˙ŝì˙úġ˙ĝ˙ŝ˙ĝ˙û˙˙ù˙˙üî˙÷˙ö˙ĝ÷˙˙í˙˙ú˙ġ˙˙˙˜ü˙˙ö˙˙˙ô˙˙ï˙ó˙˙˙˙ŭ˙ç˙˙˙˙ùü˙ê˙˙˙ö˙˙ġ˙ĝó˙˙ŭí˙˙ë÷˙˙û˙˙ö˙˙ç˙û˙ñüŭ˙˙˙˙ü˙ŭò˙˙˙ùŝ˙ïŭ˙úè˙˙˙˙üŭ˙˙ù˙˙ö˙˙ë˙˙ġ˙ŝ˙ĝ˙˙ú˙˙˙ĉĝù˙˙äŭ˙óî˙˙½4˙˙˙ĝŭûö˙˙˙û˙˙ì˙ô˙˙ġŝùÔ˙ü˙ê˙ú˙˙ŝá!'˙çĝŝ˙ġ˙ŝòôú˙˙˙ù˙˙÷˙öü˙˙ŭŭġ˙˙ì÷˙ĝü˙˙˙÷ŝ˙û˙˙˙˙ü˙˙ú˙˙˙ĝ˙˙˙˙˙ü˙˙öò˙ŝ˙é˙ùû˙û˙˙öüùûĊġë˙ü˙˙ï˙ô˙ŝú˙ŝ˙˙ö˙˙ó˙ġü˙ĝú˙˙ö˙˙ó˙÷˙ì˙ö˙î˙ñÙ˙öŝĝġ˙˙òû˙öùí˙ŝŝŭï˙˙ĝ˙˙ŝ˙ĝ÷û˙˙˙üï˙ĝûô˙ô˙˙÷˙˙ú÷˙˙ùŭ˙ĝñ˙˙öüû˙˙ù˙ûĝ˙˙˙˙˙ó˙˙˙ŝ÷ĝûŭŭùú˙˙ŭú˙ŝġ˙ŝùúûûŭ˙˙˙÷˙ù˙˙˙îÏù˙˙ùñŝ˙˙˙˙ĝŝŝ˙ñü˙˙ŭù˙úĠġûáöú˙ñ˙˙˙ù÷˙˙ŭô˙˙˙˙˙ë˙˙Ç˙ĝ÷˙ñÎ ˙˙ûŝ˙ŝ˙˙ŝïġ˙Äú˙í˙˙˙˙˙ŝúû˙˙˙ŭû˙˙Î˙ú˙˙ġ˙ú˙éÖó˙˙˙˙ĝŜûó˙˙˙˙öŝîġûŝ˙˙˙˙˙üô˙ô˙ŭ˙ì˙˙˙˙˙˙˙˙˙˙˙ö˙˙ü˙û˙ô˙òúó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ˙î˙üö˙˙Á˙˙÷÷˙ó˙˙üĝúö˙ûï˙˙óġŝí˙ŝŭ˙˙í˙˙˙˙˙ñ˙ú˙˙˙ŭëú˙ûÖŝ˙˙˙úġ˙˙ŭ˙ŭ˙ëì˙˙ĝ˙˙ŝŝú˙˙ú˙˙˙üüĝñ˙˙˙ġŝ˙÷ü˙üí˙˙û÷˙ï˙ñ˙ù˙˙˙˙˙˙˙˙˙˙ŝ˙˙ò˙ú˙˙ŝñ˙èŭ˙˙ġŭ˙÷˙ŝ˙˙˙ġ˙˙˙ùù˙ò˙˙ĝ˙˙÷˙ü˙ú˙ŝĝ˙ġ˙ĝ˙ġĝ˙˙ûë˙˙ö˙ù˙ŭü˙Ï˙˙˙ï˙ô˙˙ĝ˙˙íġ˙ó˙úê˙˙˙á˙˙î˙ĝ˙÷˙ġö˙˙ŭüë˙ï˙˙÷ŭ˙úö-¤ëŝ˙˙ۙ  "Ñ˙û˙ŝùó˙˙ù˙ĝÊù˙ĝû˙úġ˙˙ç˙˙˙í˙ú˙ûö˙ë˙ŭüŭ˙üû˙û˙˙úù˙öù˙˙˙˙òù÷˙˙˙˙üó˙ü˙˙ç˙˙ĉ˙˙˙ó˙ê˙˙˙ġû˙˙ŝ˙˙˙ä˙ï˙ŝì˙˙ì˙˙˙˙˙à˙ĝù˙˙˙ġò˙˙ùú˙ŝï˙˙ĝ˙˙˙˙ü˙˙üŝŝ˙ôù˙ġġ˙ñ˙ŝöŭ˙ö˙ôŝ˙˙ç˙˙˙ûö˙˙˙–&"²òŭü˙˙û˙ŝ˙ĝ˙ŭü˙úü˙í˙˙˙ù˙ŭ˙˙˙ġ˙òúì  #ġ˙)"÷˙˙ġ˙ŝó˙˙˙˙˙ùöûĝó˙˙ö˙ŝ˙˙ä˙˙ô÷˙˙ù˙˙üï˙ô˙˙üŝ˙íñ˙ġŝ˙ú˙ŝü˙˙˙˙ŝ÷ô˙ŝ˙˙˙ë˙˙í˙˙÷˙ûŝü˙˙˙˙˙˙˙ù˙ï˙˙˙˙ŝŝ˙ĝŭ÷˙ĝ˙˙ù˙˙˙˙˙˙˙ë˙˙˙ŭ÷ü˙÷˙˙˙ë˙˙öġ˙ŝ˙üĝùŭ˙˙ôú˙á˙˙˙˙ö˙˙û˙ú˙÷˙ñú˙á˙˙˙˙˙˙ġ˙˙ĝŭ˙˙ġ˙˙ïü˙ü˙ĝ˙ĝû˙ŭ÷˙ĝ˙˙˙î˙ù˙ïŭ˙÷˙ê˙˙˙˙ŭ˙˙ö÷˙ĝ˙öú˙÷˙˙˙˙ù˙ûġ˙ù˙óù˙ŝ˙˙ö÷˙ŝ˙˙öŝ˙üü˙ï˙˙ŝġô˙ŭû÷˙˙˙ŝô˙ì˙ĝĝïŝ˙÷˙÷˙î˙˙ì˙˙ġû˙ü˙ó˙7„˙˙ŝ˙˙˙üĝ˙˙˙ŝŭ˙ûñ˙˙ġ˙˙ŝüüŝ˙˙ŝï˙˙ñú˙˙ñ˙ġŭ˙˙˙˙úŭûù˙ĝ˙÷ŭö˙˙ŭ˙˙ŭ˙˙üì˙˙çü˙˙ġ˙˙˙˙ġù˙˙˙˙˙˙˙˙ĝġ˙˙û˙ŭ÷ö˙ġ˙ü˙ŝö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ñ˙Ì˙˙í˙üò˙ù˙ôŝ˙ò˙˙ŝ˙÷ú˙ñ÷˙˙˙ŭ˙ûüŭ˙˙ô˙˙öŭ˙÷˙ĝ˙û÷˙˙ú˙úú˙˙ù˙˙÷˙ô˙ôú˙˙ù˙ù˙˙í˙˙ò˙ûúóü˙÷˙˙˙ŭŝ˙ú˙ùü˙ö˙˙÷÷˙˙˙˙÷˙˙ó˙˙˙˙˙˙˙˙˙ġ˙ŭö˙ö˙óù˙˙öŝ˙˙ŝ˙ú˙ú˙ġ˙˙˙òŝ˙˙˙ú˙ŝ˙û˙ĝ˙û˙ŭ˙˙ġ˙üüû˙ŭú˙ö˙ŝ˙ĝ÷˙˙˙˙ößùüÖú˙ù˙˙ö˙÷üû˙˙ò˙ñ˙˙üûù˙úó˙ŭú˙˙˙˙˙ĝ˙˙˙˙ö˙˙˙û˙˙ù˙˙ÉĠÑÌÑ˙ü˙˙î˙ù˙##ŝ ˙ò˙òŝ¤“˙ûú˙û˙˙˙ŝö˙˙˙ġ˙˙û˙ùü˙ü˙ö˙ŭŝ˙ò˙˙ô˙˙ŭ˙ù˙ü˙˙ú˙ú˙ŭ˙˙÷˙ûö˙ûù˙ùúû˙÷˙ġ˙ô˙ŭ˙ĝ˙üûù˙ù˙ĝö˙˙ô˙˙û˙÷ö˙ŝ˙˙ĝ˙ñĝ˙˙˙ù˙ù˙˙ŝ˙ŝû˙˙ûŝ˙˙˙˙˙ŭ˙ĝ˙˙ġ˙˙ŭ˙÷˙˙˙ü˙ŝ˙úĝ˙˙ôò˙˙ü˙•ϧ Ìù˙í˙ŭ˙˙ö˙ú˙ó˙ó˙˙ö˙˙ŝ˙ñ˙üûúú˙ó˙˙&&ÈÏû˙˙ÊÊ˘í˙˙ôĝ˙ŭŝì˙ġü˙ú˙˙ù˙˙˙˙ŭö˙˙ì˙˙˙ù˙ô˙˙˙˙ôġ˙˙˙ĝ˙ù˙˙÷˙˙ö˙ùüüŝ˙ŝŭ˙ò˙û˙˙ŝ˙í˙˙ŝ˙÷˙˙î˙ġ˙˙ô˙˙ġ˙˙ü˙ö˙˙÷˙˙˙˙ü÷˙ö˙ŝö˙ŭŝ˙ŭŭ˙ĝ˙ŝŭ˙ôüĝ˙˙ġ˙˙ó˙ŝ˙˙˙˙ù÷˙ĝ˙ú˙û˙ö˙ó˙˙˙ñ˙˙ŭĝ˙˙ñ˙öŭ˙ŭŝĝ˙ùûĝ˙ġ˙˙ü˙˙˙úü˙ġ˙˙˙è˙˙ĝŭü˙˙üüú˙˙ú˙˙ï˙˙ġù˙˙ùû˙˙ú˙ŭ˙˙ö˙ġ˙˙ñŝ˙÷˙ù˙ô˙˙ŭŝù˙˙ĝ˙ŭġ˙ġŭü˙ù˙ŝ˙ŝ˙ŝ˙˙û˙ü˙öú˙÷˙ó˙ŝ˙ĝô˙ó˙ü˙ŭ˙ò˙ġü˙ŭ˙óŭ˙•"Š˙ŭù˙˙ùüŭ˙˙˙ġ˙˙ù˙ûúĝ˙ŭ˙˙˙˙ŝüŭŝ˙ŭ˙˙˙˙ò˙ĝ˙˙ŭĝ˙ï˙˙˙ŭ˙˙ö˙ŭ˙û˙ŭúû˙ĝ˙˙˙ö˙˙˙ġĝ˙˙ñŝù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ú˙ñü˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙ÉŞ# ™˙÷Ú˙–"ü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙úÏŸĠó˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ Ëŝ˙˙˙óŝ˙˙÷˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙ú*ŻÍò˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙ÚèÖħ - ³§˙ŬĞî˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭù˙¨Œ›ġ˙˙˙û˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŝ& Ĥ˙ġŭ˙ù“-çû˙ĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷£Ŝêĝ˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙ÏöÖÀ $ ' %Ĥ’!*Ë˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷˙˙ñ˙Ġ˙ĝĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭñ˙˙­Ö˙˙ĝ‘*Â˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŜÊÌá˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙ú˙ü˙î˙Ö &$'ˆ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙í˙ö÷˙ĝû˙û˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ï˙$Ç˙ñÇ,$˙˙ó˙ü˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙úò˙˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙ġ˙˙˙˙˙ĊÖĴ ##%!ˆ˙˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ġ˙˙ï˙˙˙˙ŝ˙˙ŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙÷˙˙êÒû˙˙ŭ˙Ĝĝûùó˙˙ú˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙÷˙˙˙˙ûü˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙ûòü˙ŭ˙˙˙ç° ÄĦĠ–šŬ˙ĝĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ûôùö÷ŭŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙íú˙û˙˙ï˙˙ü÷˙˙˙ŝ˙˙û˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙ùùù˙ŭŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙÷˙˙˙˙ûôü˙ŭù˙÷üüû˙ûì˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙˙˙˙˙˙˙üüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙üŝ˙ġ˙ôŝ˙ú˙ġ˙ĝ˙÷îñù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝ˙˙ŝ˙˙ŝüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙úó˙˙ì˙ö˙˙˙ŭü˙˙˙ü˙˙ü˙ĝ˙ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙üġ˙˙ö˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úó˙ó˙˙úû˙ïŝ˙˙˙˙ú˙˙˙˙ġ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ü˙ĝ˙ĝ˙ŝüŝ˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝú˙ĝ˙ú˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ġ˙ú˙˙˙˙˙ŝ˙ġû˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭ˙˙ú˙˙˙˙ò˙˙˙˙ù˙˙˙˙˙˙˙˙ŝ˙ŝĝ˙ó˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙ñú˙˙öĝ˙ñ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭ˙ö˙ŭ˙ü˙ŝû˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝŝ˙˙û˙˙˙˙˙˙˙˙˙˙˙ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙˙ñö˙ùîó˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭŝûö˙üü˙˙˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝö˙ŭ˙˙ŭŝ˙˙˙˙˙ûñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûûñú˙˙˙˙÷˙ùü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úüŭûü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭŭ˙˙ü˙˙˙˙˙˙˙˙ŭ˙üŭŭ˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ó˙˙˙ŭ˙˙ûŭ˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭü˙ŭ˙ùù˙˙ŝ˙ú˙˙˙˙˙˙˙˙üû˙˙ŝ˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġùù˙÷úġŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûġ˙˙ù˙ôú˙ùüŝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŭŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝûú˙ôìïó˙˙ï˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙ŝ˙÷ŝ˙˙ŝŭôúú˙˙˙˙˙˙˙˙˙ü˙ü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óúĝ˙ñ˙ü˙˙˙ŝ˙˙ù÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ŭ˙˙˙ü˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ûú˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íĝ˙˙ŭ˙˙˙˙ä˙ŝüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üŭûúŭ˙üĝò˙˙˙˙˙˙˙˙˙˙˙˙ü˙ï˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ġú˙˙ú˙üï˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûö˙˙îŝ˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùû˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙ü˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙üù˙èĵ˙˙ú˙˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙˙ŭ˙˙˙˙˙˙˙öò˙˙˙˙˙˙˙˙û˙˙˙˙ĝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝġï˙˙öÏÇÓì˙˙÷˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙ú˙˙ŭ˙ú˙˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñïôü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öö˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ĝ˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙믐"‘˙íŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ö˙˙ċ˙˙ê˙ñ˙û˙˙˙˙˙˙˙˙˙˙ù˙é˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙Ĉ˙ĦŸ$ ;Û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ĝ˙˙Ŭ˙¤ŸĜ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷ÖÖ÷˙ŭ˙˙˙˙˙˙˙˙ñ᧤ĠĊŬ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙§%˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ö˙µÌ Ïò˙ñ˙˙˙˙˙˙˙˙ġ˙§ÏİË÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ôî˘ Żĝ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙ŝŝ%'žöŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöŝŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙÷˙ü£—İü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ö˙˙˙òĠĠÖ –˙î˙˙ü˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ûŭ˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙ŝ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙÷ŭ˙˙ŝŝ¨Ÿ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ö˙û÷˙ŝü˙Ÿœ˙ŝ˙ü˙˙˙ó˙˙Ñ˙˙ô˙˙ù˙˙˙˙˙˙˙˙˙˙˙ĝĜ ü˙˙˙˙˙˙˙˙˙˙ú˙˙ŭ˙ö˙Ĉ%“!Ŭġŝŝŝ˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüŝŭŝ˙üŝ˙˙˙ŝŭŭûŝ˙˙˙˙˙ŭ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ü˙ġŭ˙˙ĝŭ˙˙ô˙&˙ù˙˙ì˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙í˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ú˙˙ÏÉ!)˙ŝ˙˙˙˙˙˙˙˙˙˙ĝ˙ú˙˙ŝ˙˙˙ŭ˙ĝû˙˙û÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝû˙˙ŝŭ˙˙˙˙ŭ˙˙ŭô÷˙÷˙ùöŻ% !£ŭú˙ü˙˙ŝŭ˙ŭùû˙˙˙ŝúûŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŭü÷˙˙û˙úü˙ü˙û˙˙û˙ĝ˙ü˙˙˙˙˙˙˙˙ġ˙ŝ˙˙˙ġ˙ú˙ó˙ú£  ˘üĝ˙ûû˙ú˙ú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ŭùĝ÷˙ñ˙˙üŭ˙˙ô˙˙ö˙˙˙˙ĝù˙˙û˙û˙˙û˙ûû˙ĝ˙˙˙˙˙î˙˙˙úü˙ŝŭùŝ˙˙ó˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ó)$ 'ïû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙úû˙˙˙˙ä  /ò˙˙ù˙˙ġ˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŝ˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ġ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙äĝ˙¤' !£÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙ô˙ö˙ŝ˙Ġû˙ë˙˙ò˙ѐ#&Ìü˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙ùĝ˙# ˙˙˙˙˙˙˙˙ü˙öûŝŭ˙ŭ $ ŭûüŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙üü˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ŝĝ˙˙ô˙ú˙˙÷˙÷£( ´˙ĝ˙˙ûô˙˙˙˙˙˙˙˙ú˙òú˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙Éñ—''˙ïï˙˙˙˙˙˙˙˙ŝ  ×˙˙˙˙÷ġûŝüŭ˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝùù˙˙îüŭò˙˙˙˙˙˙˙ûĝŝŬ §Ÿ$“˙ùö˙ü˙üû˙˙˙˙˙úŝ˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙úüŝġ˙˙ô˙˙˙ĝôû˙˙˙˙û˙˙ŭ˙˙˙ñ˙ô÷˙í˙˙ĝŭ˙˙ë˙ù2$Şĝ˙è˙˙˙÷˙ú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙üö÷˙ü˙˙˙ŭ˙ê˙˙ò˙˙÷˙˙˙ïî˙˙úöŭ˙˙˙˙ë˙÷˙˙ô˙˙ġ˙ô˙˙÷˙úŝû˙ŭ˙˙íŝ˙ü˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üùĝ˙úó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭ˙˙úŞ" ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŝ˙˙˙÷˙ö°" ÷˙ŝñ˙˙û˙˙˙˙˙˙˙˙ŝüüŝŝüüŝ˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙òû˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ë˙˙˙é )Ğ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭô˙˙˙üĝ˙˙˙!( ¤˙˙˙˙ó˙ô ˙óàÎú˙ü˙˙ù˙˙˙˙˙˙˙˙˙Ò˙Ž $" ˙˙˙˙˙˙˙˙ŭ˙üŭ˙˙˙ŭĜ˙˙˙˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ŝúŭŭ÷üüûûüüŭŭ˙ûúŝ˙üŝ˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙úï˙˙ġ˙ü˙ü˙×  'ó˙ñ˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙ùûĝŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙¨$ŸĠÎÂ*žġ˙˙˙˙˙˙˙˙˙˙˙˙.Ñġîö˙˙˙˙˙˙ù˙ü˙˙û˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙˙˙ô˙û˙˙˙˙ġñ˙ŭ÷˙˙ĝ˙À$%ġ˙÷ûŭ˙˙ò˙˙êü˙ûû˙˙˙˙ŝ˙ùóĝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ö˙ò˙˙˙˙˙úĝ˙˙˙ö˙˙üù˙˙ò˙˙˙ŭú˙˙˙˙üú˙˙˙÷˙˙ôŝ˙ù˙·Ĥó˙ŝŝ˙üĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝŝ˙˙˙÷˙ó˙ö˙˙ùô˙ĝ˙÷˙óŭ˙˙úû˙˙ùû˙ë˙ü˙ú˙˙öû˙ŭ˙ò˙ŝ˙˙˙ŝö˙ì˙ö˙ŭŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ûûû˙ö¨)(˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú˙˙ú˙üòÏ̜#$ #˙˙ûŝ˙ù˙˙˙˙˙˙˙˙˙ŝŭüŝ˙ŝŭŭ˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙ù˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙ĝù˙˙1 œÌú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷î˙ŝŝïĝ˙(Á˙÷˙˙˙ĠĦì˙Ë­°˘¤Ŝû˙ŭ˙˙ü˙˙˙˙˙˙˙˙˙ú˙ĉ¨˙˙˙˙˙˙˙˙÷˙ŝ˙˙˙ûüîùÓ¸ôĝŭ˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙˙ŭü˙˙üŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙ŭö˙˙ö˙ŭ÷˙˙úó˙‹˙û˙ĝ˙î˙˙˙˙˙˙˙˙ĝ˙ü˙˙ùú˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙ŝÌ˙˙ú˙ġ˙˙ûŭĝû˙˙˙˙˙˙˙˙óú™$É˙˙˙˙üĝĝúü˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŭŝ˙˙˙˙˙öò˙˙˙˙˙üŭ˙˙˙÷ ˙ĝ˙ûġÑŝ˙äù˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙˙˙ûôŝŭ˙˙üŝġûûŝ˙˙öĝ˙ŭö÷ŭûöŭ˙ñ˙˙ĝ˙ŭï˙ŝ˙÷ŭ˙˙˙˘ŭè˙˙˙ùŝ˙úöĝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙óġ˙ñ˙ĝŭĝ˙˙˙ú˙÷˙˙ŝġ˙ùġû˙˙˙ù˙˙˙ç˙ŝ˙˙˙ë˙ü˙ŝ˙˙÷ï˙÷˙˙ĝŭü˙˙ġ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùö˙˙é˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ûŝ˙ô˙˙ŞÇÄó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙ôû˙ûŝâî–$0ùù˙˙˙òŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùü˙ûè˙ôœ1¤˙×˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ë˙˙˙˙˙˙ÇÍŝö˙˙í˙˙÷§,Ú˙é˙Ëçü˙ġ˙˙ü˙˙˙ŭ˙˙˙˙˙˙˙˙˙äġĠܵ˙÷˙˙˙˙˙˙˙˙úûŭü˙˙ŭ˙˙˙% ™ĉïùŝŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝġ˙˙ŭü˙˙˙ŭûüüûù˙˙˙ŭüüú÷˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ö˙˙˙Ü˙û˙ú˙ó˙˙Ö% ˙ŝü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙üö˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙Ó$˙ñ˙ü˙ü˙÷˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙"Ïġ˙˙˙˙˙˙˙˙˙˙˙ŭú˙ôü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ŭùöù˙˙ñçëŝ˙˙ŝ˙˙˙è˙Ó"ġ˙ñ˙˙˙ĝ˙˙úċ˙ü˙˙˙üü˙˙ìŭ˙ŝĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úî˙ŭ÷˙˙è˙˙î˙˙˙˙˙ùŭ˙˙ü˙˙˙˙˙˙úô˙˙˙ŝĉ˙˙ġúú˙ôŝ˙íŻò˙˙ìúú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ĝŝ˙û˙˙ŭ˙˙˙ûùüö˙˙˙óŭ˙˙˙˙˙˙üú˙˙ö÷˙Ñ˙˙ê˙˙ö˙˙óûöŝ˙˙ùüŝŭ˙˙˙ïù˙ù˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙òŝ˙óí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ö˙ŭ÷£œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝ˙˙ïî˙(ŝ˙ú˙˙ùŭ˙˙˙˙˙˙˙˙˙ŝúĝû˙˙û˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íŭû§˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙˙˙ĝ˙˙ĵ $§˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùÊÍ˙îûġ˙˙˙˙ù˙òŝ˙ö÷˙ ›ó˙˙ûŜ˙˙û˙˙ŭŭ˙˙˙ü˙˙˙˙˙˙˙˙ŭ˙í˙˙úŝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙÷ŝ˙˙ï˙˙*˘ŭóù˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙úööü˙˙˙˙ö÷˙˙ŝ˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙ï÷˙âô˙˙˙˙óâÂĝ˙ú˙ĝ˙˙˙˙˙˙˙˙˙÷˙˙ò˙ŝñ˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙úĞ˙˙˙ú÷ŝ˙˙òüŭ˙˙˙˙˙˙˙˙˙˙Ì#Ċ˙ŭúû˙˙ŭĝ÷ĝ˙ó÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙û˙ñ˙ûÙ˙˙˙öŭ˙ŭġ˙í%˙˙ĝüó˙˙í˙˙˙ùú˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üġö˙ú˙˙ŝó˙òö˙ĝŝìö˙ú˙ú˙˙ñ˙˙ĝô˙˙˙ŝïü˙ŭ˙ġ˙˙ï˙˙ô˙˙•ĵ˙úñ˙˙˙˙ëŭúùġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭ˙ŝĝ˙˙ġŝòîËÛ˙˙ĝ˙ŭú˙˙ùÌ£ ˜òèç˙ŭ˙˙˙öÒ,ßìġ˙ú˙Ê£ ħĤ/ ”˙ö˙ú˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ô˙öŞÊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŭ˙˙üìñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üò Ĥŭ˙ŭö˙˙÷ú!˙˙÷ò˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷òöŝŝù˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ù˙˙ôóà#ĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙çòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĜĞè˙˙˙˙öü˙òŭ÷˙˙ñ˙öĠžŭ˙˙ŭó˙ŭĝ˙ŝŭ˙˙˙˙ŭ˙˙˙˙˙˙˙˙üö˙˙ġü˙˙˙˙˙˙˙˙˙˙˙ċ˙˙ö˙˙ü˙ú÷(œ˙˙˙˙˙˙ŝüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŝ˙ĝö˙˙˙˙˙˙˙˙˙ŝ÷˙˙˙úĝüŝŭòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙ü˙ĝ ,˙˙ñ˙ôúî×˙öŝû˙ó˙˙˙˙˙˙˙˙˙ì˙˙ú˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŭ2ĝ˙ìó˙ü˙ç˙˙ù˙˙˙˙˙˙˙˙˙ëŝ, Ùñ˙˙û˙˙˙˙˙˙˙ĝ˙˙ñ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙˙ŭñ˙ÇĦޤ•Â˙˙˙˙˙˙˙Ġ½ŭ˙˙˙˙˙˙ûù˙˙ŭ˙˙˙˙˙ŭò˙úû˙ŝ÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝôÍüóŜ˙ÎÍ˙é˙˙ó˙ûú¸Ŝ˙˙˙˙˙˙üûŭ˙˙ö˙í´ù˙˙ôŭ˙ùŝ£˙ġ˙ŝÚ÷ôѸĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġê¸ı˙˙ú˙Ĥœ3 ĦÊ˙ŭé˙ïħ  ++–ŬÈ˙˙ż )%˙úè˙Ï êû˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûÍŬò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ˙˙ŝ˙ù˙š˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï³Ìŭ˙˙ŭ˙˙üĦġ˙˙ŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙üöú˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġĦ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙ü÷˙˙˙šŠ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ 2 ˙ôù˙ö˙ü˙ġ˙óŭü˙ĝ˙ Ħü˙Ç˙˙˙ġ˙˙ú˙˙ŝŭ˙ŝ˙˙˙˙˙˙˙˙˙÷˙û˙˙˙û˙˙˙˙˙˙˙˙̵˙ö˙˙ĝĝ˙˙™˙˙ŝûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŞÇÍ·ıŜúûüŭ˙˙ġŬÀĞò˙ĝ³ÌÈÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙ŝŝ ĴÄÑ˙û˙ŭÉÎÌ˙˙˙˙˙˙˙˙Â-Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙Ì˙ö˙˙ġ˙û˙ġ÷˙˙˙˙˙˙˙˙˙ùÔÇ˙˙˙˙ŭĠ‰8 šÍĤ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙ĝŞ£!#¤˙˙û˙ô÷+  Ñùŭú˙ùü˙üŭ˙˙˙üŭ˙˙ñÜ*’˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙Ä$$֚Ğ˙˙ĝÌ+ 2 $%šù˙ŝ˙ŭúژ/ İ˙ó˙ùĦ!ûÚóàŽ! ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙œ%žœ(Ġ˙î˙˙ô( !š˙û£&2 üû˙˜˙˙ü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ù÷˙î˙üĝ˙˙Íŝ˙˙˙˙˙î˙ü˙ĝŭ˙ü˙ŝ˙è˙÷÷˙˙ĝ˙ùô˙ù˙ŭÄ˙Ê˙û÷˙˙ĝŭŭ˙÷˙˙ú˙Ì˙ÑÎ˙ŭ˙˙÷şÚöü˙û˙ú˙˙˙î˙ġ­˙ûüŝÌ˙˙ö˙û˙ö˙ô˙˙˙ûĝÏ˙ü˙÷˙˙ "£÷Ï˙ó˙ġ˙¤!Óùô˙Ġó˙˙úŝŭüû˙˙ù˙À'œ'ž˙ö˙ŭ˙˙Í˙Ҕ/Ħñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù'ö˙ڝÎŝû˙û˙˙ô˙ù˙˙ñĝ˙òŝ˙üöŬ —Ôû˙ù˙ĠüÍÎ˙˙˙Í˙úÊĜû˙ŝö˙ÀÙüË˙˙˙ûÒ˙Ê˙ĝùú˙ô˙ù˙ñ˙˙ú˙ö˙˙Éž˙˙˙˙˙˙˙˙˙˙˙˙ö˙ú˙ÈĈ˙˙Ê˙Ê˙ò˙ö˙î˙˙ıĜ˙ÑëĤËÒ˙˙˙˙˙˙˙˙˙˙û˙ú˙'š+™˙ü˙üġ˙ ޣݟÎ˙˘˜˙Í˙˙ġŭ˙˘ŭù˙ŝû˙›˙˙û˙–#—ú˙ĝ˙÷ü˙öÊĦ¤ö˙˙˙÷ÎÑ˙úŝ÷˙ú˙˙’ Ïù˙˙ûŝî˙#£ù˙ŝ˙ó˙ùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙é˙˙–! + #!™˙ŭ˙˙ûÎ#  Ù‹# Ô˙ú˙˙˙ü˙˙˙˙˙˙˙˙ŭš"#Ü˙ĝ˙# ˙˙˙ù˙Ì # Ê˙÷úŭ˙û˙ŭ˙û÷˙ŝŝ! ˙÷˙˙ Ÿù˙ŭ˙óŭ˙ùİ Ñŭġ˙˙› İ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭû ! Ì˙ù˙ #×ĝ˙˙˙˙˙˙˙˙ŭ˙˙ü˙Ĉ£) !ùù˙ġġ˙ġ˙˙˙˙˙˙˙˙˙' !ŝҟ%–˙ö˙˙ô+ ! ˙˙öĴ ü˙˙"˜˙ûú˙ŝ˙˙ŝ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!*˙ġ˙ô˙™Ìž'˘÷˙žÑ˙Ċ˙” Ÿ˜)"À˙úŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙úŭ¤İ– £òİ—³žóŝ˙˙ù˙÷ŝ˙ږ­ŸĦŝ˙˙ü˙ùœ( %Ù˙˙ó˙˙÷˙ĝ˙˙˙È#Ï˙ù$˙ŝŝ˙ô#ú  ˙˙˙ %”÷˙ôİŭ˙˙ġ˙÷˙ìġĊ+ĉ˙˙í˙“ $ Ÿ˙˙˙˙ŝ˙˜˙˙Ħ˙˜Î˙ĝ˙˙˙öœ–¤ .ğ˙˙띴#°!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôĤ¤ž$ßĦŞ£´˙ë˙íŭ˙š°š“ĤË˙˙ŝ˙ù˙œ§ġ˙ŝ #’ï˙Ĉ#% šö˙ġ& óĦ üó˙˙ó˙÷ İêŭĝ˙ġ˙Ĝ—˙ó˙˙˙˙˙˙˙˙ġ˙ŝñî˙ú# ï˙ö˙,$; ˙˙˙˙˙˙˙˙è˙ĝ˙%#ħ ˙˙ö˙š0 ˙È (8/û˙§! Ĥ˙ŭ˙˙˙ħ ('äëŝ˙˙˙š %  5Íù˙˜1û˙˙öú. ž˙˙˙˙ż•˙Éû˙˙˙˙ŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙Ċ$)# -Úôó˙ ( -!&Šŝ˙˙ŝ˙û˙˙˙˙˙˙˙˙˙§'šĉ˙˙Í*"Ëù÷ĴÒ˙óü˙Ĝ$#ñ& ż˙˙˙öŭ˙÷˙˙˙ġ˙İŭ˙÷×û˙ŭĝ˙Ş˘%Ô˙˙˙‘(ÏÓ¨#!ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îŝ˙úû& !ù˙ùž4$Á˙ç˙Ĥ#!Ĉ˙˙˙˙˙˙˙˙˙ú˙˙û˙˜$Ħ'&üïú˙ñ˙÷˙˙˙˙˙˙˙˙ü˙Ä*  Ġ˙£ Ĉáú' $Ğŭûü),Ôŝ˘*˙ßô›˙Ôöİ , ú˙ö˙ŭŝ˙˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙'ÊÉ !$˙ß˙˙&˜˙˙ŝ˙Ġûž Ñ˙˙Ğ!ŭ˙˙˙ ! ü˙ĝ˙˙˙ò˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙˙š Ĝ""*Öú˙ŝû˙ږ 'ÀÔ˙˙û˙š! úù˙ù˙ŝ˙˙úüĝ˙Î+" òÖ%—ŭŝĦ +Ùî˙ž%"–!Úġ˙ñ˙ž &Н+%É˙˙Ô" " ˘˙˙î# ˜í"ï˙ùüìâÜÌӚ!üï˙+ $ Ĥñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙'%œ, ž˙˙˙ùİ&5½Ġġ˙˙˙'Ñ˙˙ '' #˙˙˙"¨˙˙¤ !% ”˙ùóùĝ˙Ï ˙˙é˙,ù˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ô)Ó" £ŭ˙˙°! #˙˙˙˙˙˙˙˙˙ö˙"úüÒ™˙˙óÈ "'("êù( &Ëû˙ż ˙ü˙úË ߋÛÊ˙˙ôû‹'É˙˙'˙ï§+% §ŝÛ˙­ ŭ˙˙Ÿö˙˙òûµ%˘Çĝ˙˙ġú˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙ùÔ"ĈÜ(˙˙ù­ó˙+Ü÷ĝŭ˙˙˙˙˙˙˙˙˙˙ö÷$ ¤ÖÇ˙˙ä˙È ›˙˙˙é˙(ü˙˙ĝ!͢'&  Ĵĝî˙ô˙ĝ˙˙û˙˙û%˙˙˙Ŭ##'›˙ïŝ˙ '˙˙ŭ,ĥúó˙̚˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙& Ĥŝú˙ú„ Şŭúú˙ĝ+˙ŝ˙˙˙˙˙˙˙˙˙˙ù˙ŭŭ ¨ŝ¤+ ˙˙û˙ĝú˙˙˙˙˙˙˙˙˙û˙˙#+!*òó *ž˙ċ˙Ä +˙˙²! Òġ˙!û˙ '˙ûü"˙µÊ˙˙ĝöŝ˙˙ŝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷Ĵ%-1Ċ˙Óô¨İù˙ŭ­,$Ûĝ˙ĊçÁû˙ôŸĞê˙÷˙‹.›˙˙í˙˙ŭó˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûó˙˙ôù!$ ")' Ġŭ˙ûŭי,Éò²"Ôŝ˙˙'!İ˙òŝ˙ŝĝ˙˙ŭ˙ĝ˙ú¤” ˘˙öÊ % Ô˙úû$ İ˙ùü !Â˙˙˙ "÷˙˙˙£ĉ˙˙Ì!Ğĝüŭ˘ž­û˙ö˙ -Ğ˙˙ú˙÷˙˙ô˙ûòŭ* •˙˙é*&(˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê"0ŝêí˙÷ġ˙)Ż˙…ž˙˙ù˙Á(™Òúé˙Ŝ Óï÷Î"Á˙˙úÖ*! ˙îŸ˙˙ĉ˙˙úĝüĦĊú˙óŝÛ‚˙˙˙˙˙˙˙˙˙˙˙ŭöŝŭ&!˙öŝÇ$Ìöî˙ Ğ™˙˙˙˙˙˙˙˙˙ù˙$¨˙ò˙#˙Ìü˙Ì"*£ïÊÏĝ˙˙Ô (!ž˙ú˙˙˙÷+.—˙˙ò˙˙“!Ħû÷˙úÌ$Ì˙˙ù˙( ö˙˙ú'£ó˙˙‘˘ûĉŝ˙ôô›!'÷Öü˙ŝ ¸ġŝöŭî˙÷˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éü—*˙ö˙ġÂ%˙ïû˙"ħ˙Êŝĝ%Ù˙û˙ŭ˙˙˙˙˙˙˙˙˙˙çÎ&˙˙÷˙ó˙˙Ï ċñÄ˙ŝ˙%ŭ˙˙˙!( !%—˙˙û˙÷ü˙ŝôŝ˙ŝ'˙ï˙ò™*Ĥ÷˙óΞëù÷˙ ˙˙˙ż#'+!“ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú÷–#!Ùü˙÷˙˙ Ê˙˙ü˙ ûü˙˙˙˙˙˙˙˙˙˙ŝò˙˙ù ŞÇ˙Ó#Ä˙ú÷˙ú˙˙˙˙˙˙˙˙˙ĝü˙(ŝ˙˙ï˙·#•˙ŭ˙ó˙˙ %Ĵí äö˙˙˙ĜĤžñ˙˙Ĥë˙Ô˙˙üüî˙˙ġŝ˙û÷˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭĴ —˙öú˙ö%óâ÷$ İĞŸ˜³ñï˙˙ò˙˙û˙Ĵ ˙˙˙ç˙$˙í˙ù˙ŭúŝ˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝúŭì ! .Ñ#ŞÁñ˙˙™#˘ó˙˙ĝ£! ˙û˙˙ 0Ùù˙ó˙ü˙˙ŝü˙ŭ˙˙öü˙Óµ í˙˙ÎÓü˙ù ÒË˙˙˙˙œ˙î÷÷˙ )İĠôûË+£ĞœžŻ˜˙˙˙˜ ˙˙˙ŭ˙ûŝġ(*ù˙˙ $$™Üó ħü ĤùÒ˙Ó !¨û˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙Ħ()é˙˙ŝ -Ë˙ĝŭ$–ûŝ˙Ĵ˙úġ˙#¨ż˙û˙˙÷˙!Ûŝ˙˙Š'˜˙üôü˙İù˙ġ˙Ïû˙˙ô˙˙˙™*Í˙÷ú˙üżùŭ˙˙˙˙˙˙˙˙˙ú˙˙Ñ Ħ˙Ï˙ú˙µ¤˙˙˙˙ŻúÇÜÌ˙˙˙˙˙˙˙˙˙˙˙˙ú£˙Îŝ˙Ğ °ĝúĝ˙ú* ù˙˙˙ŭ˙˙ï( Ì˙ŭûùú˙˙úŭ˙˙˙Ÿ,˙ûüÀ˙"ÚòûùĤ˙˙é˙ġ¤¨ô˙˙˙× Ô÷˙ï˘Ĉ˙ü˙ŝ˙ó˙ĝ˙˘ž˙˙ġ˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙  ĝ˙ĝ˙˙Ž&˘˙˙ß)"‡˙˙˙˙Ğ ˙û˙ùŝ˙˙˙˙˙˙˙˙üŭ#ñù˙î˙ñîŝ˙˙˙Âüŝ’ #-  0˘Ó˙ŭ˙ñ˙ŭ˙÷ö˙ŝú˙Ŝ+˙ù˙˙ù.›ò˙ŝ *˙˙÷˙˙Ì'ŝ˙˙ĜĤŠ%˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝó˙"ì˙˙ó˙ùÏ2˙ïĝú%˙˙ŝï˙˙˙˙˙˙˙˙˙ûñŝ˙ùÙ˙Ë˙üò*$Şĝ˙ĝ˙úŭ˙˙˙˙˙˙˙˙˙ü˙ûš) µ˙ú÷˙ï #¤ñ÷˙ú˙è& ¤˙! ˙û˙íü˙÷˙˙˙ô›*¨ ħ˙˙˙˙˙˙˙˙öĝ˙˙üŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˜1˙˙˙ö ˙î˙×˙ôü˙öü˙˙ù˙˙żŻ˘  (˙˙ë˙Š,˙÷˙˙ò˙˙˙üö˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙ĝ˙ŭéÖ+ úïĠ˙ù !$ ˙˙ìĜ,–ôÑòú˙ċŸ#É˙ñ˙! ûüô÷ŭ˙ü˙˙ü˙úû˙ŝġ˙˙Öüüß §òŝ˙û˙˙˙ŝޤĝ˙˙˙ì˙˙•# ¤ÛĊ˙ò˙ġ!Ĥ˙ġù˙˙˙ĝ˙˙˙ŝñİš˙ù˙Í&ĵâšĦ›˙ó˙É!Ĝŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Á"“˙ĝ˙ġ×™˙˙ö˙“˙˙ŭü£îÖ˙úÀ˙Öö˙ġÄú(Ì˙Ĉò1²÷ġ˙˙˙˙ /˙˙˙û˙ú˙ŭâü˙ï˙Ĥ­˙˙˙ûĠšé˙˙˙˙˙˙˙˙˙ù˙˙ġÏ ùú˙ù˙ġ$°óíÖ˙Ì˙ü˙üöö˙˙˙˙˙˙˙˙ŝ÷˙ïÑŜòûÓµ£) ˙ü˙ġ˙ħİ˙˙ûè÷˙˙˙!Îü˙ġ˙ŭŝù (²˙˙ŭġñ˘ ˙î˙˙ġŭ˙Ú Ÿġ˙˙˙˙ÊËŝŝö˙Ä+ û˙é˙˙ü˙ĝ˙üĜİ˙ĝ˙ŭòùŝ˙ûù˙ï˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙™"˙˙ôö˙×”˙ŝü˙˙é˙ĝ'Êĝù˙û˙˙˙˙˙˙˙˙˙÷˙ !û˙í˙˙˙úœ"˙˙úúĵ# Ÿŝ÷!£˙ùì˙˙ú˙òĝ˙ŭù˙û˙ġ˙˙ŝŭù˙( ŭ˙ûŭ˙• Ó˙˙˙"÷˙ŝ›!Ùúû—'˙˙ù˙÷˙˙ç˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˜ ˜˙˙í˙ú˙˙ġ˙˙Ö "öú˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙òô˙úŝ'%ĝ˙˙˙ö˙ġ˙˙˙˙˙˙˙˙˙ûû˙#)î˙˙˙˙˙•(™˙˙ñ˙˙ĝ˘"ž˙İü˙û˙˙˙üŝòü˙%(!˜Éù˙òġ˙ġü˙˙÷ŝ˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úµĴ÷˙ò˙& Ö˙˙ú# /ġ˙˙î˙˙˙ŝú˙üô¤%"š ˙˙ú˙ô(ĝ˙˙˙ò÷òû˙˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙öŝĝ˙ŭ˙Ÿ ˙˙ôŭ˙œš˙ô˙Ġ¸˙ŝ˙ú˙˙Ñž˙ġü #˙˙˙˙ñ˙˙ö˙˙˙ŝ÷ŝ˙˙üú "Ôö˙Ä!÷˙Â#˙ö÷˙óù›Òŝŝë˙ Ğùɚ(˙›ŭŭ˙à˙ñ˙˙÷™˙÷˙˙˙˙ô˙˙÷í˙÷˙İ˙û˙£ħŸœ˙˙ċùÛÎ˙˙úŝ˙"˜˙ìö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úüüË$Şû˙˙ŭ•'˘˙ì÷˙˙ûúġ˙& ›˙˙ùĝĉ&˜˙ġ˙˙˙˙˙ ¤˙÷˙ŝ ›Ì˙öóÙ Ĝôî˙˙û˙ĝ˙˙ŝĝû˙˙˙˙× Ĥ˙˙˙˙˙˙˙˙˙˙˙˙óü+˙ò˙˙ì˙Ö ô˙öû‘˙ú˙˙˙˙˙˙˙˙˙˙˙˙ó˙ùŝüĝµû˙™ ˙ĝ÷˙˙Ï!œ˙ò˙˙î˙ôġË˙ú˙˙ŝŭ ˙ġ˙˙ñ£)›˙˙îï˙$Ċ˙üĈĜ˙ú˙ê˙˙˙˙ŝ˙ġÇ% Ĝ˙˙˙üüû˙ü˙” ä˙ò˙˙! ·ġú˙˙˙˙ä˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭœ#)Ëġï˙˙ìÚ&öĝ˙ž"Ëï˙˙ĝĞ+ô˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˜˙˙˙ëÎİ!ĝ˙í˙öŒ%­ü˙ .£ô˙˙ü˙˙û˙˙ùñ˙˙˙ŝŭû˙ôŭ˙ĝïĥ)ò˙òúô! ×ŝôù$ Ä˙˙ô˙ö6À˙˙Ĥŝġ˙ü˙ô˙˙ëü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙úµ ˙ġ˙ûûî˙ ˙ġĉ˙˙ú˙ö˙˙˙˙˙˙˙˙ú÷˙˙ŝ˙üÔĦ›" ˙ŭó˙ó˙˙˙˙˙˙˙˙˙˙˙ôû˙Ê$Êü˙ĝÔ(Ÿùĝ˙ûÓ˙£ &Ž˙ ›˙öù˙˙ŭ˙˙˙˙˙˜ /&Ó˙˙˙˙˙˙÷ߜĦÜòú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙À ŝĝ˙˙ü’!ù˙ìó§˙÷˙˙ñ˙íŭ˙ôü¨šŝÖ$%½ĝù˙˙˙ ˙ŭùĝ˙˙˙˙˙úö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ô˙óĦÖ˙ŝÔ˘$ŭ˙ûÇ!—˙˙ö˙ì˙ܤġ˙˙ü˙˙ú˙˙ŭ˙˙ŭô˙˙ñŭ˙üŭÚ"ü˙Ş! (ïÑÖġ˙˙î˙˙‘˜˙ùŭÚ÷™£˙Ö¤Óü˙É˙˙ô˙˙÷ŭú˙"î˙÷ĝù˙÷˙ ŝü˙ëû˙ĤñŭË žŝ˙ùù˙˙÷˙ùúü˙Ìİ Ûü˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ê˙£˙ŭö˙£œŝ˙˙üü˙˙˙üĤ­ùùŝ˙ž Ŝô˙üó˙ó˙˘ŸÛó˙ŝŞ #ŝ˙ù˙˙ó ˙˙˙ë˙ŭ˙û˙˙÷×úŝœÑ˙ú˙˙ $ĝŝ˙˙˙˙˙˙˙˙˙ġ˙û""Ĉ˙˙ù˙îĝŸ˙ĝü£÷˙ùò˙ö˙˙˙˙˙˙˙˙ŝû˙ùÙ¤ĝüú˙˙î˙˘¨ĝ˙˙ċ˙˙ò˙!Ñŭñ˙ó˙˙Î!ú˙û˙˙Ĥó˙˙ĝ˙Ï˙˙Ċ"&™˙ù˙ûó˙û˙˙˙úŬ %÷ŝ˙úú˙Ë ˘ĝ˙šÒ˙ŝ˙ú˙ "•˙˙˙˙Ĉ¨ ×˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ó Ñ˙˙ñ˙˙Ä!›˙ü˙ ĝ˙˙ôŝ ˙ü˙ûŭ˙˙˙˙˙˙˙˙˙˙ûÚŝú˙˙˙˙ !–˙ĝ˙ú˙˙ ŭÉ˙Ħ˙÷˙˙˙û˙ò˙û˙˙ôú˙˙ô˙ô˙ù˙ú›$Œ˙ú˙˙úĦŝ˙ûĝŭ˙˙ŝŭ˙÷Í˙ŝ˙ü˙˙ġü˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙œš˙üöĝ˙˙ÈÉû˙˙˙ ˙ù˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙ĝ#Ïô˙ú˙˙ŭŭ˙˙˙˙˙˙˙˙˙ú˙˙ $˜˙˙ó˙í$ İŝ˙ġ˙üĝ£"Öġ É˙˙üúŝŭ˙÷˙˙£ ¨î˙˙÷üŝ̖’Üû˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ¤" Í˙üġ˙˘Îó˙˙ $—˙ŭû×˙ŝ˘Ô˙Ò!!Ë˙û˘"˙ŭ˙ù "ü˙ü˙ûô˙˙ù˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û÷˙˙ġ˙ԝûŬù˙ûÎ ˙üÙ£ù˙ù˙Ó˙ £ùû˙÷üô˙˙î˙ġŭ˙˙˙˙˙˙˙˙˙üÎ# ˙˙ÏÒû)%È˙÷û˙˙ù˙ŝ¤–˙üŝŭ˙žŭ˙˙ûĤù˙˙ô˙˙ġ˙ô˙˙ù˙' ˙ĝŝ˙ú˙˙ûš˙úú˙ò§ ŭÒĤĝ˙ġù˙ŝ˙˙ñ˙ô˙É!˙˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ× "Ñ˙ùù˙’˙ûĝ˙ĝĝ˙˙ùÏž˙ŭÑô#Ħò˙ö˙òŝ˙ ¨˙ĝ˙Ò­ ß˙ŝ˙˙ú+Ċ÷˙ġ˙ó÷ü˙ŭ˘Ĉ˙Ô% ˘ë˙ĝŝÊ+ ¨ûúüüüŭŝ˙˙˙ò˙˙ŝ%§ôŭ˙ĝ˙Ì#!¤ü˙ĝ# ˙˙ü˙˙ù˙˙˙˙˙˙˙˙üù˙Ì!Ì˙ž"ĝ˙û˙˙ÊÌ˙úŝ˙˙˙˙ŭ"úû˙ûüï˙—* ˙˙ġ˙˙ĤĠ˙ö˙˙˙™ÎŭÔ˙ Üë˙ô˙öġ˙˙˙ô˙"ġ˙ü˙ú•Î˙ï Ĉ˙˙˙˙¨Ĵùü˙Í! ¤˙÷˙˙˙û˙ú˙˙˙˙˙˙˙˙û˙Ù˙üĝ˙˙Ó˙û˙÷$ ŭ˙ó˙û£Ħû˙ïġ˙ŭ˙˙˙˙˙˙˙˙ö˙ Òĝó˙ĝĝ˙Ĉŭ˙ù˙ú ˙ġŭ' ˙˙÷˙˙˙ô˙÷÷˙úó˙ü˙˙˙ŭûûŝ˙˜# Ûüñ˙˙˙ ÷˙ġ˙#ñÚü˙ġ˙›˙ú˙Ï$˙˙ĝü˙˙ÉΨ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü(Ĉ˙÷˙ÎÉĦÍû˙˙Ê˙˙ö˙˙˙˙˙˙˙˙˙ö˙˙ôúœ" ÔĜî˙˙ï˙ü˙˙˙˙˙˙˙˙üĝ˙û˙˙ùû˙˙ŭ§ ôÒ˙úŭŭžŭ˙$"Ĉ˙ŝ˙˙óĠ˙˙ù—ċ Ħ˙ù˙ġ˙˘- ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙Ĉ £˙ü˙ġ˙(Ñ˙ŭû™Öüù˙˙!ñĠ #Ħ˙üñ˙ !Òġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ġúú˙˙°òó˙ù˙˙˙î˙˙üĦŬ˙˙ùĝüĦ ˙˙˙ + ˙˙˙ß÷˙ĝĝ˙˙˙˙˙˙˙˙˙ĝü˙žÓ ˙˙ 0#Ŭ˙˙ŝ˙ŭ˙˙™'ò˙ù˙ë ˙ô˙ô ˙˙ó˙éûù˙˙˙ĝ˙ċ&í˙˙˙÷˙ë˙!œ˙ġ˙˙ŭ˙ ˙÷˙˙˙˙˙˙éû˙û˙ù˙Ŝ ·ù˙üŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŜ˙ Ôò˙˙²)Ĵüûŝüüü˙  ĝŝö˙Ê£˙˙ü˙˙é£3˙˙ġö Óë˙˙ŝŭ$ ˙û˙û˙˙ĝš*˙ċû “˙ù˙˙Ï ŝ˙˙˙˙ŝŭŭüü˙ñù˙’$—˙üú˙üĜ˙ö˙ –˙ñ˙ûï˙˙˙˙˙˙˙˙˙˙˙˙  ˙˙” ˙˙˙ġ˙ĝ/ħ˙ŝ˙˙˙öú˙'Ö˙û˙˙ûú˙Âŭŝ˙ú1Àóŭ˙üÎ "Ïù˙ŭĤ(#Ĉ˙˙˙ñ˙üËñó˙˙*Í˙óŝòĞ ŝìí#Ĵ˙öĝä¨!˙üŭ’&"—˙è˙ŝûŝ˙˙˙˙˙˙˙˙˙ÑöÄ% "ñ˙˙˙ċĤ *ù˙˙˙+ ˙˙îû#üò˙˙û÷˙˙˙˙˙˙˙˙˙ì ›˙˙ù˙ò˙Ŭ˙ŝ˙ĝ$!˙üúî3˙˙÷Ç(˙ŭü˙Ŝ˙úüŝ˙˙˙˙˙ŻŻíò˙àŬäò (›˙÷ö˙÷, ×ġ÷ü. œ˙˙ò˙Ħ)•ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ûö˙ 0ŭ˙àתĜúñü§#$ ˙˙ö˙˙˙˙˙˙˙˙˙öî˙˙•(Ú˙$  ù˙˙÷˙˙˙˙˙˙˙˙˙˙˙ä˙“# —˙ŝ˙ú˙û!¨ŝö÷˙Ċ˙ġÖ£˙˙˙È–˙à 'çĤ) Ĥ÷˙È"  )•˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§. ĝ˙ŭ˙¤% —˙˙Ù §¤› ġ˙Ç$($&˙& Ñ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ù˙˙ñ˙Ï˙ù÷˙ú˙àóû˙˙$÷÷÷˙˙óÎ#&ĝ˙òï*Ŝìîù˙öñ˙˙ó˙˙˙˙˙˙˙˙˙ŭ˙ġ Í˙˙&$ž˙˙ö˙˙ŭ˙˙ž –˙é˙ú˙ރ˙ûŝ!Úï˙úÜ˙˙ŝ˙ù˙ü˙˙úü˙÷˙ú' ˙ù˙÷û˙·§ó˙˙!&–ûÒüí˙ŝ•˙ôüĝĈ ˙˙ì˙÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óôĤÊûŭòµ%üô˙˙2˙ö˙˙˙˙˙Ġĝ˙˙ŝ˙"ĠÂà£) +•˙ŭġñ˙#Şûġ˙ü˙˙˙ !)”ÍèÖ)¤ŭûôó³$,÷Ö˙˙˙˙˙˙ŝü˙ô˙˙Ċ Ĉü˙üñ*Ĵë˙˙"7î˙˙÷˙ŝ˙˙˙˙˙˙˙˙ñö˙ İ˙È(&%#“ú˙êÚ 5 ġ˙˙ôŝ˙ŭ˙ ¤˙˙˙ú˙˙‘5Ŭŭ˙÷˙ Ż˙˙ù˙§Ó˙˙ŭ— !˙ñ˙˙¤  ˙ù˙Ê#˙ûŭŭ˙ Ñ£  —˙˙˙¤)%ŝ˙ú+%&ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙ğ"! Ĥö˙ú˙°ó˙ú!Óûñ˙Ä+Ï˙ö˙˙ŭ˙˙˙˙˙˙˙˙˙˙¤+œÇ÷Ĝ#" šô˙Ѱ  ü˙ŝžŜİÎ˙ùŭ˙ú˙ŝŭŝ˙˙˙ùóž"ħ˙ġû˙¨ŝÒö! Ğ˙˙• "”Ğ˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûìü˙ü˙ !&Ä ! Êú˙ "+ûö˙˙˙˙˙˙˙˙˙é˙˙ŭ˙ $ ''Èñ˙˙ġ˙˙˙˙˙˙˙˙ù˙˙Ô & ˙˙÷û˙”% )Âϲ!Ħ˙˙˙Ĉ"$(ò˙ $#˙%0ûù˘.˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï#²˙ô&˙˙ô•Ĥ˙ô˙Ħ!Áà*šŝ˙–7ˆĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙ïí˙ïž*,â˙˙ûú½˙˙ŝÒ,˙Óé˙˙—"šŝ˙ĝ˙ #ž˙˙˙ġùġĝ˙˙˙˙˙˙˙˙˙ò˙ë˙³ÒŭûÉûö˙˙ö˙ĝ˙ĝ'š˙˙˙˙ó°Şüġ˙ *ĝóŝñ˙˙úŝ˙˙ŝ˙Öô˙˙û˙ìµ ,˙ŭ˙˙Ò  #Ĵñ˙œ%İ˘ü˙½§ò˙˙Ë  Ċú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ú $Ë˙Ó֙"ÒŭÔĝ+ ĝ˙Â-ú˙˙3  ˙˙÷˙Â˙Ĥ &˜Ĥ# ™˙˙˙” Ӟ˙é˙óŝÄ3Ÿ“ ù˙¤ ¸Çĝúŭ˙˙˙˙˙ŭúŝñüĤ “˙ö˙#'˙˙˙"˜ôŭú˙ŝ˙˙˙˙˙˙˙˙˙÷ĝ$  CĞ˙ĠĦ'"+¸˙˙üŝû˙1™›ş˙ì˙šÉ˙˙È,% ÖËħ% âóû˙! ħɍ#Ĵġ˙ü Ħú˙ò!"Çüœ)ŝ˙'"Ĥ˙ĝú˙˙˙˙˙˙˙˙˙˙˙òó˙ô.,˙ɒ*Ċ˙ü˙×ŝĴ" §˙û÷ŭ˙˙˙˙˙˙˙˙˙ĝ˙ż" ˙&$˙Ó#&Ž˙˙öŞ ' ˙û˙û˙û˙˙˙ŭŝŝùïĉ#! &Ç˙˙û˙!+ ùŭÍ%óúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭú˙¤##¨Ï˙˙ûŭñú˙˙˙˙˙˙˙˙˙ĝôŝ˙Ġ$•#˙˙÷ĝ˙˙˙˙˙˙˙˙˙˙üċ#  "&˙ì˙˙˙ -# '£óŝ˙ò˙–"&#ĜŭÛ'˙!İß˙˙šû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô !&ŭ˙É-(ŭûíï("$ŭ˙˙˙ù&˙˙ô˙ïò˙ù˙ùÜ˙ĵĴĝ˙˙ŝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝó˙˙˙˙ŬĦ"Ó˙Âú˙, %Ĉ˙˙ò"+ĈÉ˙÷ÜĜùúÑ˙—(ú˙ġ˙ù÷˙˙˙˙˙˙˙˙ù˙ŭġâ #Ì˙ôÜ+Ü˙˙ŝñ˙˙ ¤  ˙îʓ"' Ô˙Ĉ" ÎН˙˙˙˙÷&ŝĉ˙£–ŝî˙ž"0›û˙í ­˙˙˙ɧîó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïĦ&Éòġ( Ì˙˙ ŜĞĞÚ˙ĝĞ •˙ĝ˙é!%$ 1İĈúİ  ‘˙˙˙üĜ!)+ ˙Ë(–ñó÷ûŭŝŭŭ˙ó˙ò˙% ¨/ ˙÷$ £˙˙îö˙˙˙˙˙˙˙˙ġ˙˙& İŝ!ûúĊ!'#  ˙˙ŭ˙ŭ˙¤#Ÿ˙˙œ Ê˙$ˆ˙š˙˙ĝµ'$˙˙$ &!é˙ *ĦĦĞ˙÷¨Ÿ ˙ò˙+% )Ğĝû˙˙ġ˙˙˙˙˙˙˙˙˙˙˙ê˙óÁ2 & '( Ï÷˙˙˙ ß˙Í  ù˙˙˙ò˙˙˙˙˙˙˙˙˙ó˙ÔŞ&Ùôš  Îú˙Ë˙ÖÎ˙ŭó˙˙Ŭ¤ĝŭŝġ˙˙˙÷˙ŝüŝ˙˙ŭĝÖ!!˘˙˙úè˙˙œ'& žËĈ,—˙÷˙Ä  ›×˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉ˙ë˙˙˙úÊ$ ˜ĝ˙ù˙ù˙˙ûĜŝÑÈö˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙# ÜûĦ% ŭúè˙˙˙˙˙˙˙˙˙˙˙˙˙˙0–Ĵġ˙˙é˙˙Ì"œĈ˙˙ċ˙ŭ˙)(#"œŭ˙Ó¨#ú¢¨-Ÿî˙ìŜ&ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$#İ˙üʝÂÑÍ˙ú˙úçàöÄ"Ï˙ĝ˙˙ô˙îÖÀÑ˙û˙ô˙˙˙ïù˙óŝ˙ôü˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ë˙÷" #Ò˙͛³÷ü˙ô“ * ËÑ˙ŭ˙˙ìÙ%Ċ˙÷˙ù˙˙˙˙˙˙˙˙˙˙˙í˙˙÷ĥ ĝ˙˙˙™%žÀîù˙˙˙˙È  ˙˙Ô0"%˙˙§" ›ûġ˙˙ü˙%˘˙˙ ' °ùó3 )×˙ŭ˙˙%+œġŝíŝ İ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ş,*Ş˙Ö%#í˙ôĞ ĤĞ-)ö˙íٟ Ñ˙˙î˙˙ŸŞÎö‰Ìù˙Ĉ£ Ë˙˙ôû˙Ñ׌˙Ùúûŭŝ˙˙ŝŭ˙˙ġ˙éù˙   ž˙˙ĝô # ò˙ŭ˙˙˙˙˙˙˙˙˙˙ŝ˙–›ÙÍĝĤĤÌ˙˙˙É–Íéñò˙˙ŭüĠĴ™%‚Ò˙˙šœ˙êŜµ™”Ğœ›˙š×Á˙ö˙ñ˙È #Ħ•×ŝöҜ#)!˙÷ÖĴĠ˙ġù˙ġ˙ĤÍ˙öŭ˙ôö˙ġÒû˙ĝš— ĝ˙˙˙˙ù˙˙˙˙˙˙˙˙˙ò˙ô˙˙˙Ç£²•Ÿ §˙˙˙àŝëĉ𣣭íĝ˙˙Ó¤Ħ µü˙˙ġç˙˙˙˙˙˙˙˙˙ĝ˙˙ġ˙÷ Óúŝ˙ü˙Ñİóù˙í˙˙î˙ö˙˙ô÷˙ŭ˙˙ê´ /ŒÖ˙˙˙˙ŝé˙˙˙ŝüŝ˙˙˙˙ô˙ù .·ô³ ˙ù˙ë˙˙˙˙üĜ˙˙˙û§•ŝ˙ü˙ĝúŜ  "œ˙˙ïŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙é˙˙˘—Ż‘­³ĤÑĝĝ˙˙ŝ˙ĝü˙ù˙ö˙ŭ˙ó˙˙˙˙˙˙˙˙î˙ûû˙÷›ĥŞöȤĤ§Ÿ˙˙ü˙˙ò˙˙˙˙˙˙˙˙˙ô˙˘ĝ˙˙ŝúĝ˙ù˙÷ŭí˙˙îĝ˙ù˙˙˙˙˙ïú˙˙ë˙ó˙ËĤ£ĦĦÚ˙˙ô˙˙ûùŭ˙˙˙ü˙ĝ˙˙˙˙˙˙˙Ĉ!Ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îú˙öö˙òùù˙úŭ˙˙˙˙é˙˙ù˙˙ù˙ó˙˙û˙ŝ˙ŭ˙˙ĝŭ˙úĝ˙ĝ˙ù˙ŭ˙˙ġü˙˙íù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ù˙ŭ˙ŭ—×í˙ĞݐÑ˙˙˙îü˙úĴ–š¤Íò˙ûúò˙û÷Ú­Ĥ˙˙úú˙˙ú˙˙˙˙˙˙˙˙˙˙˙ŝ˙ä˙˙˙òî˙úüÈ˙˙˙úù˙úùĞ˙úĝ˙˙öúù֙˜Ŝ•Ì˙ôú˙ó˘“Ó˙ŭ˙˙ë÷˙ĈĤ"Í÷îœ݇˙öŭ˙˙˙÷ŞÚ˙˙ġ˙ö÷˙ùúû˙˙ċû˙ŭ˙ŭ˙˙Ҍ­Ëüï˙ġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üè˙ׇġ˙ÎĥË˙ü˙˙ŝ˙í˙÷˙ŭú˙Ì ’·ï˙ĝ˙ġúó˙ĦĜ˙÷ŭ˙ó˙ú˙˙üġ˙÷˙˙˙ú˙˙˙˙˙˙÷ò˙˙ĝ˙óĝ˙ú˙é˙ŝ˙ê˙ü˙˙˘ú˙í˙˙ú˙÷ï˙ĝŝ˙˙˙˙˙˙˙˙ŭï˙ĝ˙˙ġ˙ôµ‘ŬÌ˙˙î˙é˙˙˙ú˙ŭ˙˙ë˙÷ġ˙ŭ˙˙˙˙˙˙˙˙ó˙˙ù˙˙üŭŭ˙÷ûô˙ú˙ôú÷ĝ˙˙˙˙ŭŭ˙˙˙öö˙öñ˙ŭ˙˙ŝ˙ĝ˙úŭ˙Óó˙ŝ˙ù˙úŭŭŭ ˙ŭ˙Ôì˙ġ˙˙˙ŭ˙˙˙û *úġ˙ù˙˙ĝî˙!Üê˙˙ŝïŝ˙˙ö˙ŝô˙ü˙˙Ô˙ó˙˙ö˙ú˙˙)"˙ŝôġ˙˙˙˙˙˙˙˙˙˙˙ŭú˙˙˙ŝ̨ŝ˙˙úüŝŭó˙˙ú˙˙ö˙˙ĝ˙û˙˙˙˙ñ˙ŝ÷ġ˙˙ġ˙˙˙˙˙˙˙˙˙ûó÷ò˙˙ù˙˙˙ŭóĝ˙˙ô˙˙ò˙˙ŭġ˙÷˙ó˙ŭñ˙íú˙˙ŝ˙ù˙óòú˙ġ˙˙˙˙ŝŝŭüû˙èü˙ú˙ñ˙ĵ˙˙˙ö˙˙ĝö˙á˙û˙ùè˙˙ù˙˙˙ùûŝ˙úê˙ġŝ˙˙˙ä˙˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëŝ˙ù˙˙˙öû˙ù˙ê÷ú˙ö˙˙è˙˙ì˙˙˙˙ñôġ˙˙˙˙˙˙˙˙˙˙˙˙˙è˙ô˙û˙ġ˙˙˙˙íôó˙ï˙àü˙˙˙˙˙˙˙˙˙ĝ˙ċ˙˙ó˙ŝ˙˙˙ûú˙˙ü˙òù˙ĝ˙ö˙ú˙ú˙˙ô˙î˙˙˙˙üŝû˙˙ċŭ˙˙ŭö˙˙ú˙˙ï˙ê˙˙îù˙˙ĝóĜô˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŭú˙û˙˙˙ó˙˙˙ò˙˙ó˙ö˙òĝ˙ŝ˙ü˙ùôúö˙îŝô˙ô˙˙ŭ˙˙óúŝ˙ô˙˙ü˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ò˙÷˙ĠÑÉĠĈ˙üŝ˙üŭô˙˙ï˙ü˙˙˙è˙ö˙ôÒü˙˙˙ö˙ü˙ŝĝ˙˙ó˙öĝĝû˙û˙ô˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙ĝ˙˙û˙ġŝ˙˙ú÷˙úñ˙ù˙ôŝú˙˙˙÷ŝ˙˙˙Î˙˙ó˙ŝó˙˙È˙ÔÇÑÏ˙ĝ˙˙˙ó˙˙˙ûŝ˙ÙÉ˙˙û˙ĝŭ˙üŭ˙˙úüúü˙üò˙ó˙˙˙ú˙˙˙ò˙˙˙ò˙˙ġĝ˙Ùû˙÷˙˙˙ŭ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙òĜ˙˙˙÷˙ù˙˙ü˙ûû˙˙ûû˙˙úßï˙˙ŭ˙˙î˙ü˙˙é˙ĝ˙ò˙˙ĝĝ˙ü˙ŭ˙˙˙ó˙ö˙÷÷˙ĝ˙˙ûúĝ˙÷˙ó˙÷˙˙ĝ˙˙ŝ˙ûĝû˙ŝ˙ö˙˙ŝ˙˙˙ĝ˙˙˙ŝŭŭŭŝŝù˙üŝŭ÷˙ŭ˙ôŝ˙˙î˙˙˙˙ĝ˙˙˙˙ŭ˙ŭü˙˙ûŝ˙˙˙˙˙˙˙˙˙í˙˙ï˙ú˙˙ú˙˙˙˙ġ˙˙ùŝ˙ì˙û˙üüŝúŭ˙˙˙˙úûúù˙ù˙ü˙˙ùŭ˙ó˙˙ĝ˙˙˙˙ŝ˙˙ùó˙˙ñ˙ú˙ŝ˙ŭ˙ġ˙ÑÍÚ½˙ŝ÷˙˙ñ˙˙ëĜÍŝ˙ù˙ù˙˙ùú˙ĝ˙Ŭġ˙÷ĝ˙ŝŝü˙ì˙úüúÔ!û˙ŝû˙˙ö˙˙˙˙˙˙˙˙˙˙˙ó˙ú˙˙˙Ñĝŝ˙ûûŝ˙ŝ˙úûü˙ŭ˙ù˙ĝ÷˙ŝñ˙˙ôû˙˙ôŝ˙˙˙˙˙˙˙˙˙˙î˙˙÷ŭ˙ŭ÷˙ó˙û˙ŝûü˙˙ó˙ú˙ŭ˙û˙ô˙ġ˙˙ŝú˙ù˙˙˙ġ˙ó˙˙˙è˙üúŭ˙˙˙ŝŝŝü˙û˙ô˙˙˙˙ġó˙ûġ˙˙ù˙˙ò˙û˙˙˙ö˙í˙÷˙˙˙˙ñ˙˙û˙˙˙ñ˙˙ñ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙ûŭ˙ġù˙˙˙˙˙ĝ˙ñ˙˙ñü˙˙ôŝ˙ú˙˙ŭ˙˙˙˙˙˙˙˙˙ĝö˙˙û˙ĝ˙˙ġ˙ĝü˙˙˙ú˙ġ˙˙ġ˙˙˙˙˙˙˙˙˙ñ˙˙ñ˙˙úûŭġ˙˙ô˙ŭûŝ˙ü˙ŝ˙ŝ˙ŭŭù˙˙û˙üĝü˙ġ˙˙÷ŭ˙ĝ˙˙˙ü˙˙òú˙ĝŝ˙ö˙ûŝü˙˙%˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝè˙ù˙˙ĝ˙ô˙˙ú˙˙û˙ġ˙ô˙ĝ˙˙ú˙ûüġ˙˙÷˙ŝ˙˙üö˙ú˙˙ġü˙˙ü˙˙˙ò˙ŝ÷ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙û˙˙òëòŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĊÑ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙üü˙İ#Ğùŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭŭ˙˙úġù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¤ )ž˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝġŭ˙ŝž  ›˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úÍ­˙ó˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙˙ú˙˙ü˙˙˙˙í˙˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙üŝŝŝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ôŭ˙˙ŭú˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙ŭûüŝ˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ôò˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ú˙˙˙˙ùö˙è˙˙ñù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙ŝüŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ûúü˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙úñóúŝ˙ë˙˙ï˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙ŝŝ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙òò˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŭŭ˙˙˙ŝù˙˙ĝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙ŭûŝ˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝùŭüù˙û˙ùĝ˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŭ˙˙˙ŝ˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ŭû˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝĝ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭŝüüŭû÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùüŝŭûúü˙ü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ö˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŝŝûĝ˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙üŝû˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙üúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûúü˙˙˙˙˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙š¤Áô˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôâÏÈÌÚò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙òÛÌÌѲè˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙Ôŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙òŝ˙˙ŝ˙ûŝ˙ŝġ˙˙˙˙˙˙˙˙˙˙óü˙ùŭüŭĝü˙ó˙ŭó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭ˙˙˙˙ö˙˙ô˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ì˙˙ġ˙üŝ˙ü˙ŝ˙˙ó˙˙î˙ú˙˙˙˙˙ŭú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ù˙Òù˙˙˙˙ŭŝûŝŭ˙ġŝ˙ŭúĝŝ˙ûŭ˙ù˙˙ŭÖ˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ü˙ú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙û˙˙ÓÎò´”Ô˙˙ŭ˙˙˙˙˙˙˙˙÷˙ôü˙÷˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙Ċ˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙ù÷˙˙ùúü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ġŭ˙ŝ–˙˙ô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ˙˙üüúÎ!¤˜Ġ˙ŝŝŝ˙˙˙ŝü˙ĝö˙˙ù˙ŝ˙ġ˙û˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙üü˙˙ŭŝ˙˙ü˙˙˙˙˙˙˙˙ŝ˙ŝ˙!Ÿ˙ŝûŭü˙ù˙ó˙˙÷˙˙Òú˙ġ˙ŭġ˙˙˙ûĜ˙î˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙ñŝ˙ú˙ô˙ŝ˙˙˙üüüùŝŭüŭ˙˙˙ŝ˙˙˙úù˙˙˙˙ŭ˙ú˙˙ï˙ò˙˙˙˙ŝ˙ŭŭŝŝ˙˙ŝŝŭú˙˙˙ĝú˙˙˙˙ŝġ˙ĝûŝü˙û˙ùŝ˙÷ŭ˙˙˙ŝ˙˙úûĝ˙˙˙ŭ˙ŭĝŝŝ˙ŝü˙ü˙˙ú˙úû˙ŝöû˙ûûù˙˙üĝ˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙˙˙ġ÷ü˙˙˙ù˙˙˙˙˙˙˙˙˙˙ŭ˙üü˙˙÷˙˙˙˙û˙û˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙öĝ˙˙˙ûĝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ìÖĈÔöû˙è˙ŭ˙˙˙ô˙˙òİœ›Ôüĝöû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŝĤ ³—Ĥ™˘Ĝù˙ûġŭ˙˙˙˙˙˙מ¨ Òö˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙!”ıé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭŝûİ ()‘ö˙˙˙˙˙˙˙˙˙öò˙ɕ£ú˙˙˙˙˙˙˙˙˙ñû˙!Žŝ˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝùï˙˙í˙ûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙˙û˙î¤" ) ôçòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûûûûûûûûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ù˙ï˙žŻ‹ Ħö˙˙ŭù˙˙˙˙ûù˙˙÷ú˙íö˙˙ŝòĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙ŝ˙˙ŝ˙˙˙ŭ˙˙˙˙˙˙˙˙Ŭö+Ë˙˙˙˙ü˙ŝ˙˙˙ġ˙ %ċ˙˙üž˘˙ô˙üû˙˙˙˙˙˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙ú˙ŭú˙ù˙˙˙˙ûŭ˙˙˙˙˙˙˙˙˙ŝ˙˙˙ùû˙˙üĝû˙ġû˙ġú˙ü˙ŭĝûŭ˙˙˙˙˙üü˙˙˙˙üû˙˙˙˙ô˙˙˙˙˙˙ü˙ùîŭ˙˙˙˙üŝûġ÷˙˙˙˙#!˙í˙˙ĝ˙˙û˙˙ŭ˙ó˙üì˙˙÷ü˙˙˙˙˙üù˙˙˙˙ŭ˙˙ùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óġŭñ˙˙ŭ˙ŭëĠó˘˘ġ˙˙˙˙˙˙˙˙˙ï˙ŭüÄÄÓŝ˙èüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï÷×ÈÚîù˙ŭ˙óÂäÎ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙" #$™Ÿ›˙÷˙ìĝ(0!ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙!˙ö˙˙˙˙ŝ˙ŝöì,$˙ïü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ï ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ŭ˙ĝŬ% 3#˙˙˙˙˙˙˙˙˙˙˙˙˙ûó˙˙˙˙˙˙˙˙˙Ĥ-›˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙ü˙ëú˙ŭŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙öĝ˙ô¨ œĠôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙’ .(ğ˙˙˙˙˙ġŝ˙˙˙˙˙˙ó˙˙˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüúü˙˙üüŝŝü˙˙˙˙˙˙˙˙ù˙Ïĥ˙ü˙ú˙û˙˙ô˙˙ò˙Ŝ$äï÷˙#4Ê˙˙ûû˙˙˙˙ŝ˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝôŝù÷ŭ˙ĝĝ˙˙ŭùüùüŝŭûúü˙˙ŭû˙˙˙ŭ˙ò˙˙úù˙ñ˙ŭ˙˙˙˙˙˙üúûŭ˙˙ŭûúüŭ˙îôġ˙˙˙ùĝ˙ġöŭ˙ûŭ˙˙˙üïù˙˙˙˙˙˙öî˙ŭ$÷ĝ˙ü˙ù˙˙ŝ˙ĝ˙ì˙ŭ˙˙üï˙˙˙÷òëó˙˙ë˙˙ç˙˙ü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġúù˙˙ -ô˙˙˙˙˙˙˙˙˙óŭ˙(Â˙˙˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÚĦûŝù˙Ú ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù—! % ( ÷˙ŝ˙Ĝ 3˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭŭœ(  &Ŭĝ˙ùû˙ŝ˙˙Û !+ £–˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ% û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ó¨ %žò˙˙˙˙˙˙˙˙ùù›+˙˙˙˙˙˙˙˙˙ŭ˙š˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙÷˙˙ù˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûĝ˙˙÷ + ˙É˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷˙˙˙!#œŭġĤĤ£í˙˙ŝ÷ŭ˙˙˙ü˙˙ù˙˙÷˙ô˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭüŝ˙˙ŭüüŭŝ˙˙˙˙˙˙˙˙ù˙˙ê#%ù˙˙ú˙ü˙ŝ˙÷˙ŝúöÊ ô˙˙úÇŭ˙ŝŭŭ˙˙ŭüŭŭ˙˙˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙÷ŭ˙ŭ˙ó˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙û˙˙ùû˙˙˙˙ġ˙÷öŭü˙˙û˙˙ŭ˙üûü˙˙˙˙˙˙ü˙û˙ü˙˙ŭú˙ĝ˙˙˙û˙úú˙˙ùĝ˙ŭ˙üúĝĝü˙˙˙û˙˙˙˙÷ûû˙˙˙˙ŝ˙ŭ˙ú˙÷úĉ˙ú˙ġ˙˙˙˙úñ÷ĝ˙˙ü˙ùŭ˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙öì˙˙ó˙˙+$˙˙˙˙˙˙˙˙˙ï˙ú+ (˙ñî˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ä# ˙ü˙òË$Ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝó˙ŭ˙­ # ş˙÷˙ú˙˙Ċĥ ĜŜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙öŭÌŭ! % 'Ħŝ˙úŝ˙óü˙¨,œÏĈ˙ï˙˙â˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‘*˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùùï˙™-׋•˙û˙˙˙˙˙˙˙˙ù˙Ϙú˙˙˙˙˙˙˙˙ö˙˙$Ú˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙˙ìŭ÷˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙öŝ˙ך  ġ˙ŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüüüüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ùúùĵ'Ç˙ö×ü˙ġ˙˙˙˙ûĝŝ˙˙òû˙öò˙˙˙ŭü˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙èŝ˙Ù Î˙˙˙˙ŝ˙ú˙ú˙˙ŝ˙ÈĠŜË˙óù˙˙#˙öü˙˙˙üü˙˙ù˙˙˙ü÷ŭ˙˙˙˙˙˙˙˙˙˙÷ü˙ġ˙˙ôù˙˙ù÷˙˙˙˙˙üüŝŝûĝ÷ú˙˙˙ŭü˙˙˙ß˙˙ŝ˙˙÷˙ŭñŭŭ˙˙ŝüúúüŝ˙˙ĝö˙˙ú˙ġ˙˙û˙˙ùŭ˙˙÷˙öù˙˙˙˙˙˙˙˙˙˙ö÷ù˙˙ñ˙ĝ˙ùö˙û˙ü˙˙ú˙Ġó˙˙ŭ÷˙˙ĝñŭ˙ö÷˙˙ŝ˙˙˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ú˙ŭ÷×İ˙˙˙˙˙˙˙˙˙˙˙ñ$š˙˙˙˙üġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙”$¨ïù˙˙˘"˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ñ˙˙ " ˙˙˙˙˙ô˙ĝ˙ %žġ˙óô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ú˙˙˙ìÚ'ì˙ŝ˙˙ñúüħ Ħû˙íü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĵ§Íü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ùê! üü˙Òè˙ú˙˙˙˙˙˙˙˙˙˙Ŭ˙°ŝù˙˙˙˙˙˙˙˙˙Óí$ *í˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙ʨ˙˙˙û˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙ŭûûġĞ˙˙ŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ä­à÷˙˙ïÍ˙ġ÷˙˙˙ùüŝ˙ŝú˙˙ٝ£˙˙úö˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùú˙ŝŝŝú÷ú˙˙˙˙˙˙˙˙˙˙˙˙ùÂ˙˙üü˙˙ŭŝ˙˙ŭŝúûú˙˙˙˙˙˙ö×&ŝ˙ú˙˙˙˙˙˙˙˙ŝġöŝ˙˙ŝ˙˙˙˙˙˙˙˙ŝ˙˙ú˙ñ˙ôû˙˙˙˙˙˙úüûúü˙˙˙˙˙üû˙˙òô˙ÍĴúñ˙˙˙˙ì˙˙ü˙ŝ˙ûŭ˙˙˙˙ŭû÷˙ûŝ˙˙˙ûŝ˙ñ˙÷˙ì˙˙˙ĝ˙˙ú˙˙÷ĝŭ˙˙ûúŭúô˙˙˙ċ˙˙ö˙˙ûúŝ˙ŝô˙ÌŸŝùüĝ˙˙ĝ˙˙ öĜŽ”˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙óŭ˙ä˙ö˙˙ñ)²˙˙˙˙˙˙˙˙ûù˙ËżÈ˙ûòù˙ùù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙  İ˙˙ŭíÂ)˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ò˙˙Òò& Ġ˙ìùŝô˙ûû,­˙è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ôôúŭ˙+­÷÷ü˙˙˙ŝ ú##Ïû˙˙ŭŝúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭôóùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭÍĝ˙ôêÒŭ˙˙˙˙˙˙˙˙˙ö˙è˙ş˙ú˙˙˙˙˙˙˙˙˙˙˙éŬÜ˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ì’˙ñ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝĝŝ˙˙˙˙œ '˙ö˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûŝ˙˙ŭööŭ˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ŝôĦ"ó˙ñ˙˙ïû˙˙˙˙ŭŭ˙˙ŭ˙˙ú˙çƒ ë˙˙í˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñŭûüü÷òö˙˙˙˙˙˙˙˙˙ö˙˙ŭ˙#$ŝú÷ċĝù˙˙˙˙ûĝ˙˙˙üŭüúúŭĝ˙˙#˙ûŭ˙˙˙˙˙ŭò˙óéñ˙˙˙÷˙˙˙˙˙˙˙˙ô˙˙˙˙úċ˙˙û÷˙˙ŝü˙˙˙˙˙˙ŭ˙˙ŝĝĝŝ˙ĝïë˙˙÷˙ûĜĝüö˙ŭú˙˙˙˙˙˙˙˙ù˙˙ô˙ç˙˙ûÖê˙˙î˙˙ùóŝûê˙í˙˙˙˙˙û˙˙ü˙˙˙˙ü˙˙˙²ħŻĤñÙŻ * ·ûú˙í˙˙”!  +!ì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òä˙˙ò˙ŭ˙ú˘›˙˙˙˙˙˙˙˙˙˙˙ò˙ŝö˙˙ŝ˙ŭúŭ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ—!ŝŝ˙˙Ĝ¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝĝö˙ž%$÷˙˙˙û˙ñ˙ü˙"Éü˙ñŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ˙ú˙˙ú  Ĝ& !˙˙ü˙ùĝÖ£”  &ùü˙ö˙ú˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙Ò˙ġ˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙Ò+Ħ˙÷˙˙˙ï˙ô˙˙˙˙˙˙˙˙˙ï˙ŭ˙˙˙û˙˙˙˙˙˙˙˙ü˙˙“Ë˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è²ü˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙üù˙˙“"˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġßÍÍßġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ùÌ˙ œ˙˙˙ûĝ˙˙ôü˙ŭŝ˙˙˙˙÷ô˙ú-š˙Ìû˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙ü÷û˙˙˙˙˙˙˙˙˙˙˙ôüÊ ˙ó˙÷˙ú˙ù˙˙÷ĝ˙˙÷ŝŝ˙û˙ûŝ˙ġ˙·!œ˙ŝ˙˙üŭ˙˙ñÜĜì˙˙üöû˙˙˙˙˙˙˙˙˙˙ĝ÷˙ĈÍ,Éù̲ÔÙí˙ü˙˙òÛÌÌÑÂçûö˙˙ċĞ#£î˙˙ġ˙˙ÈÔÎùü˙˙òÛËËÛò˙˙˙˙ÎĦ§úĝŜ'è˙ùÏÑÙÖúÎÎ8‰Ġŭ˙˙˙˙È!Ñ˙˙˙ġ+°šû˙ŝ˙ûĦ# '!²è˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŝĝï˙ĝĤ˙ŝŭüü÷äÈ˙˙˙˙û˙ü˙úù˙ŭ˙ĝÔ˙ŭ˙ú˙úô˙û˙ó˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙ġô˙ûñ˙ñŭŭ˙ŝú˙˙ü˙ö˙ô˙˙ù˙˙ĝ˙û˙üù˙˙üžù˙˙ù˙ü˙˙ŝó˙˙ú˙÷˙÷˙˙˙˙˙÷Ùŭ˙˙ŝ˙ŝ˙ŝ÷˙˙É˙˙ŭŭ˙ġĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙üû˙ûô˙Ħ&ü˙üó˙ĝöú˙ŭĦ˙˙˙˙˙ġ˙˙ó˙û˙˙˙˙ö˙˙˙˙ú˙öó˙˙ŝŭù˙˙˙ŭ÷˙Ê˙û˙˙˙˙ò˙˙˙˙˙˙˙˙˙ĝ˙ú˙˙˙ó !ĞÒĝ˙ĝ˙ŭÛ ĝ( *÷˙ûùŝüû˙Ê˙˙ô˙ġ˙˙˙û˙˙üù˙˙ŝ˙÷˙ö˙ŝÍñ˙˙ô˙ŝú˙ŭ˙Ï˙ûö˙ù˙˙˙˙˙˙˙˙ŭú˙Òġ˙˙ú˙˙˙˙ô˙½°Ïúù˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙Í#ûŭ˙ŝúü˙˙ü÷˙ŭö˙˙˙˙˙ŭú˙˙ó˙ô˙˙ù˙˙˙üûûÑÙ£ŝ˙˙ŝŭŭŭŝŝ˙÷˙˙÷ûĦÌŭ˙ġ˙ŝ˙˙û˙ù§ž˙û˙˙˙óŝ˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ùĜ™ž‘˙˙˙˙ĝ˙ŭ˙ïû˙˙û÷˙úö˙˙ŝÏġ˙Úġ˙úŭ˙˙ŭ˙˙ù˙î˙˘Ï˙ŭĝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝùĠÜ˙ù˙üû˙÷Í˙žŞ˙˙û˙î˙ï¤ ŸÒš˙ġġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüŝ˙˙˙˙˙Ò˘¤ž ŭìĉ–§ù˙˙™Ôĝ˙˙ù˙ Ĵó˙– ĦÈ˙˙ŭ˙ġ˙˙é˙˙ö£Èŭŝô˙ŭË"Ġ˙ö˙ġŝ˙˙ÊĴÑ÷˙ô˙˙˙˙˙˙˙˙˙ĝ˙Ñ!Ë#Ç˙˙˙˙˜ùġ˙üŸ ·²˙ùù ĉ˙šŻê˙˙üŸ"Ìö Ĵž İô˙û˙ž$¤˙ô˙’# #÷ÑÊ ˘˙ü˙ż–˙ò£šü˙ü˙úĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ĝ˙˙ £ï˙˙˙˙ŝÉ Àô˙ó˙òù˙˙ġ˙ŝ˙ûò˙˙úŝôŝĝ˙˙é˙Î˙ú˙öó˙˙˙˙˙˙˙˙˙˙ì˙˙ö˙˙˙˙÷˙˙˙Â˙ŭû˙ó˙ċ˙úùé˙ŝ˙ŝ˙ï˙üĦ˙˙˙ĝùÏ˙ê˙˙ó˙ù˙ôÁ˙˙˙˙ġġ˙ù˙˙ó˙÷ġ˙Ŭ˘™ş˙˙ŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üú˙÷ìġ!% ĞĝÒ˙˙÷˙˙÷öŸ ìġ˙ñ˙÷ŝ˙˙˙ÁŸ˜–ÖÓ˙ûġ˙˙˙˙ŝ˙ġü˙˙˙ïô˙óҘžšÌù˙û˙˙˙˙˙˙˙˙û˙˙ŭóü˙• žÌ&ß˙é˙ö•'ž˙ù; ˙˙ó˙˙ù˙˙íüǢŸ˙÷ŭ˙Ċ­š&Í˙ĜĤ˙ñ×Îİ’ĦŸ§ĊŬ 0˙ü˙˙˙˙˙˙˙˙˙˙ù›šò˙ñ˙Ä˙Û4$ü÷˙ìú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ›&&§ŭ˙˙ŝü˙˙ŝú˙ù˙˙÷˙˙ò˙üûȧÛ˙˙ó˙ùó˙šœĦ’!˙˙˙˙˙˙˙˙˙ñ˙˙˙˙˙#Ş˙û˙˙  ,Ê˙í˙ö˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙ŭ˙".–ò÷˙ŭ˙í˙˙#òŝ˙ġûے¤˙Ħ$ ,ñ˙ó˙˘ "/ ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üù§% Ġî˙˙˙ŝï°$˙ïÜġ£)!˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüúĝ÷ $˙˜0 .òÑ!! •˙˙ò¨˙Ş"ĞÚ˙ŝ˙Ó¤ 7˙ŭ˙üúĜĝ˙üú˙ġ##" &Ñ˙˙˙˙˙˙˙˙˙˙˙˙!ĥîóú¤'$ 4ž˙"#¨˙˙œ0#ì˙üœ* Ğŭ˙û!Ï˙!#İö+˙˙˙ñÂ˙˙óĞ.˙˙ùß“ŭŭê°'žŭ÷˙ ´úŝĝ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öϕ²˙ĉ˙ġ˙˙Í'—˙ú˙áĝ˙ê˙˙˙˙ëŭ˙üĠÇ˙˙˙úùÖ̞%—×˙˙ŭ˙˙˙˙˙˙˙˙˙û  &ğ˙ 0˙ôï˙Ĝ˘Ĵ˘+ß˙ŝ˙ġŝŭŭ£˙öŭ˙˙Û -“˙˙úì˙÷Ó# ĦÍ˙˙˙ ›& ˙Ş$°ùüŭöû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙öûŸ˙˙˙÷˙ò˙ûŝ˙(˙Ĝó˙ë˙ŝüÁ'0°óò˙˙£ ÍŝĴ ¤ñ˙˙ñ­ $(Éü˙˙˙˙˙˙˙˙˙öû˙˙˙ûĞ*¤˙Ô °÷ú˙˙ Ì÷(ûú˙é˙˙èĦ%1 £˙ĝûĦ"–‚˙Ż %  +î÷˙˙˙˙˙˙˙˙˙“" ŝ˙˙˙ʨĊ˙˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙' ˜ŭ˙˙˙ŭŭŝŭ ˜˙óù˙ú›) Ÿ÷˙˙ġ˙ÓŸ!"Öúûŭŝ˙˙ŝŭ˙˙ôúü  'ĝ˙ùœ- #!Î˙ò˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙Ĉ *ŸÊİ%Û˙ġ˙ûŬ) -ĴÍù˙˙!!ĝÊ'Ŝ˙˙½!% Úè˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—£÷˙óô˙Ò˘" ˙ĝ˙£-¸çó÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûĝġô’4"'žô£"#óÒ"*Ħ˙öß )ô˙¤˙˙ġĝÌ˙ù˙ü˙ü)!Íüüû˙˘(  ' %—ôù˙˙˙˙˙˙˙˙÷ĝĴ $"# ‚˙ ÇÙËÛó˙%&/%¸˙˙Ë İî˙ʏ(İüù˙Î . %  !˙Ë£$¤˙ìŜ£*ìù˙˙ٟ&¤ŭ˙˙ż Ĉúóüŭ£%İ×˙˙Ħ˙˙ûžû˙úê˙˙ŭ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙÷˙Ĉ!$ ĉ˙˙˙˙úÇ‘˙˙˙˙˙ġ˙ŝ˙ŝŭ˙ĵ›Ĥö˙˙ŭïĤĞ Ĉüŝ˙˙˙˙˙˙˙˙ò”# & Ûò  Ë˙˙˙ ˙ñĝ˙˙ŝ¤ ˙ô˙˙ü¨û˙ú˙˙ŭ Ħœ( Ìö˙$!÷-³˙˙˙ŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙'* ˜Ĥ£•ÂİñÒçĝ˙ĝŝ˙ä˙# 'Ÿ˙É " §˙ë¨ "İĦ“˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙û˙ï–˙¤ù˙÷Ò*˙˙˙ Ÿ˙˙÷˙ĝ˙ŒĴ Ü˙˙Î'##'ĉü .Ĥ ¤˙˙˙˙˙˙˙˙˙˙˙á( ²ù˙ŭÍ/&ëߤ.Ô˙é˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û–" 6üŝ˙˙ŝŝŭüù&ò˙˙ŝ˙ ˙ôü˙Ċ)¨üù$ñó÷ûŭŝŭŭñ˙ŭ˙˙!Ìì˙Ò( ˙˙˙˙' *Ş˙˙ö˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙Š$ ˙˙˙ĉ)! š˙˙ûŭĈ&)   ŭ˙˙ĝ˘Ö˙˙ ŻĴı˙!&ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öĝ˙ òĊ˙˙Í ´Äž"ŝó˙É-  Ĥż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüûŭ˘0˙öü§"$ù˙˙‘Ĝëŭ˙ôá+Ċû˙ü˙Ğ*ŭ˙˙˙ö˙$!˙˙ŝ˙˙Ó-˙úŝŝÀ. ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙û˙ ġĴž³˙”/ĤĤ›˜¨!˙ô˙" &˙è˙˙ĝ˙ùœ#˙ó˙ĞżÔŝŝš)ÍĝÌ›˙˙˙Ò#ġ˙˙÷ÎÌ˙˙ü˙˙ô˙Ĵ"˙˙˙ôךÇ˙ñœö˙˙˙˙ú˙˙˙˙˙ŝŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ö˙Ĵ)À˙ï÷˙Ëŭ– ˙˙è˙˙š½ŝ˙îú²#Ħ˙˙â˙˙›ì˙ŝ!˙˙˙˙˙˙˙˙˙˙˙˙Ô4"É˙Éĥ´ġŭ˙ö .”˙ï­ Ĝŝü˙˙ŝ˘˙ŝ˙ŝûŝ$Í˙ĝ˙˙Ĥ*×Ñ˙ÒÇĉŭŝÄ#'Ĝ˙ŻÖà˙ûî˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙›%!˙š' ­˙˙˙˙˙ŭ&  ˙˙Ħ ˙›/$  & Ü˙ üí˙ï&.˙˙˙˙˙˙˙˙˙÷˙÷˙˙ûí£˙Êë &"Ğġ˙Ž)‘ñ˙ô(°û˙ñ˙öÏ£˙˙Í/·˙˙ùË  ˙˙˙ £˙˙#Ċ˙˙˙˙˙˙˙˙˙˙˙÷ž"' ˙úö­.ÄÏÍ Òĝŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ò %˙üûŝ˙˙˙ŭî˙!Ìôë˙- ×˙üü­‘ùô˙ÊÊ #¨ĝúŭ˙˙˙˙˙ġ˙ŝ˙ŝŜĴÓÉÔ˙˙ "Żñö˙öáš˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙ÓŻ£ò˙ġ˙˜›˙˙ö“˙ÇĈ ,Ĵĝŝ˙ûÎ)%ş˙ŭ˘,Èóû˙-! 5( Á˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉÔ˙¨Ñ˙úĝ£!Ñî˙˙˙˙˙˙"Ġç˙˙ĝ˙üñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙êä!%Ê˙˙Ì" Ĥöùûߪ÷˙˙˙˙ìŸ˙˙ù˙˙Ä*ûŭöü˙ó##÷˙ŝ˙ŝÍ Î˙˙˙ !˘$À˙ñ˙˙˙˙˙˙˙˙˙˙ë˙8ô˙˙ŝŭġÏ$$˙˙í˙ŭ˙˙˙ö˙¨ È˙˙ĝü!˜˙˙ó˙˙&%Ñġ˙˙ôù˙ġŸż˙˙î˙˙Ĥéúŭ˙˙˙ .˙û˙˙½˙ġĈ˙Í  İÙ˙û#ż˙˙ŭŞ´÷˙û˙ġûŝùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝĝ˙ŝѨ žû˙˙ûŭ˙$—úÌ˙˙ò! Ùĝ˙ùĝ,)˙ó˙ö%Ù˙ĉ˙òÔö˙ô˙˙˙˙˙˙˙˙ù˙èŬ˙÷ŭš÷Ó˙˙Ħ$˙˙˙˙˙+•˙˙öŝŭ ó˙üŭ˙˙'ú˙÷˙÷ Ëö˙˙˙Ç˙˙˙Ħ ˙˙ ÷ï˙ŭ˙˙êö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙ŭ( #(Ùê˙ó˙ëù˙ùĤ˙ŝÔ˙ &!ǟ"Ğ& Ż˙˙˙˙˙˙˙˙˙öŝò˙˙òĦ½˙˙˜ ŝû/ Óûŭŭ&˙ü˙é˙ÍĴÎ˙ċ˙ ˙˙üú¤ 9ĜÏİĠôŭ˙§*Ĵñ##Ñ˙ë˙˙ó˙˙˙˙˙˙˙˙ô˙İ˙Ģ̇!'È˙Ö˙˙˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôÚġ&Ğ˙ŝü˙˙˙˙˙˙íœŝ˙˙˙ĝ˙1ú˙ö˙ ˙˙˙óç˙0˙˙˙˙˙˙ŝü˙ùù˙úú&›ŝ˙ù˙ç£5˙ù˙˙˙ñ" "÷ü˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûôô –˙ï˙˙Ô Ĥ˙÷˙Ĝ£Ŭï˙úН˙ùùû˙%÷ù$ù˙˙é  ˙˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïŭ˙˙Ë) !œĜú˙˙ù—Ĉŝ˙üÁ/ġ˙÷˙Óò˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ŝŭûûĈ˜(’˙öÏ  "ù˙˙$ô˙ôùŭ˙ŜÌ˙ö˙˙üÁ'˘˙÷˙÷˙'ĝĝ˙ü˙Ħ)÷úÈ* ›)œ˙ú˙˙˙˙˙˙˙˙˙ö˙˙ô"˙î˙˙ë˙¨+" ˘ŻŒĴ™×ŭôú·ĝ˙÷˙˙ŭš$Í÷ûŭ˙)²ŝ˙˙˙˙ ˙˙˙ĉ˙ñ˙˙!™ĝÖ˙˙͗žúûúŭ™!şġŝô÷â,û˙˙˙È' ñí˙ ! ˙˙ò'Òôŭ˙˙ô˙ŝú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷˙˙ĝ˙ŭ›/!¤Ŭĝñú÷˙÷Ï˙ġ˙üôĤ˜˙˙˙öù×˙úö˙ ˙ûô˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙Ó˙˙ü ˙˙û˙ù͑Ÿ˙û˙ü˙“àŝ˙˙ŭžË˙˙÷˙%"˘˙îĝÛ7"Ÿ§›€´'Ĝĝí˙Ç'%Ìùŝ˘¨˙û˙˙ŭü˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŝ˙˙ó)Ï˙ĊÎ˙˙½˙˙ò˙ï˙˙í&& #£î˙˙Ş-˙÷ŝú˘!#) Ò˙˙˙˙˙˙˙˙˙ŝ˙úġĝ˙û)˜˙÷˙ó#+Û÷ĝ˙$ 'ü˙˙˙˙˙é˙˙˙Ô¤ñö˙˙­œ˙î˙˙üŭġ˙ $˙Ñ*íŭ˙üü˙˙˙˙˙˙˙˙˙˙˙œ û˙òŬ "İïùò˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ !›˙˙˙˙úöú˙˙ž'û÷ú˙ú§"Ù˙ĝĦ'ïúŝ˙˙Ġš˙˙˙ŝŭŭüüó˙˙˙˙û &'—˙˙ôġ˙ (î˙éüú˙™ñ˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙Ÿš˙˙óĜ ¤Èġ˙˙é˙ö˙˙˙“"•˙˙˙ûŝž ŬÏĝ˙˙ġŜ#¨ü˙Ĥ˙ŭ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙âûÚ"Ğó˙˙ü˙˙Î˙ŭ& ˙˙ŝûĠ´ö˙ü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙ŝŭŭ˙˙˙Ô '(˙ĝ¨ 'İġš.œ˙ô˙˙ü÷ÍÊ˙˙˙ġ˙Ö#ŭ˙óŭŭ¨ ˙ŝŭû÷Ì˙Ϥ˙öùúÛŝûÛ˙˙ó˙˙˙˙˙˙˙˙ú˙Î˙ı ŭ˙ŭ˙˙ġĦ$ ˙˙˙˙˙ü÷˙ŝüŭ˙˙˙˙üĝ#ž˙˙ĝ˙”Ïó˙ñ˙°.÷÷˙ŝû˙ïö-˙óûü˙Ħ,#û˙ŭ÷£"ŝ˙˙˙š#'˙ġŭóß-˙˙˙˙! –Ĥ֌,ĦÊ˙˙î˙˙˙ŝŝ˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ô˙ĝĠû'Ê˙ù˙˙˙ŭż&Îù˙ùŭ˙Ħö˙ġ˙˙#È˙ŭ˙ê"•Ĝùù˙˙˙˙˙˙˙˙˙÷˙˙™›û˙Ĥè˙üö˙˙ŭ˙˙˙˙ÍÇ˙ŝ˙ŝž¨ô˙ú˙× ö˙˙  /Ûúû˙ĝ֔&"Ì˙ Ñŭ˙òô˙ôÖ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙û˙ĝĜ"# ˙˙ġŝ˙ŭò˙(˙ŭ˙˙˙Ĥ $×ÎÉ˙è˙ú'˙÷˙˙ü"ÑŬĈÍÌĦĜĝ˙˙˙˙˙˙˙˙ŝö˙˙˙ġ˙Ñ˙ŭ˙Ë! !Ê˙˙òÑ"Ê÷˙üö˙˙ú˙ÔΓ!Ì˙˙ŭ˙†&"İ÷˙˙ĉ˙˙˙˙˘#ôĠ#Í˙˙ñ˙÷˙˙˙˙˙˙˙˙˙ÎÌ˘#“˙ŭ˙ĝ¤˙üí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ &Íŝ˙˙ŝñéò˙˙ù ú˙˙ŝĠ ˙ü˙ ĝ˙ŝ˙ö˙"üüüŭŝ˙˙˙˙ù˙ŝü˙İ˙ò˙öÍ˙ġ˙ü˙Ê˙ö˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ôĈ˘+˙óË˙Ĝœ˙˙ùü˙ĝ˙ÖÉÑ Ħü˙óÒ×§ #˙ï˙˙÷˙ò˙ġ˙˙÷˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭġ˙˙Ċ#˙ö˙ġ˙˙˙Ê˙û˙˙Ì"›˙Ëŝŝ˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝ˙˙˙˙˙ü˙ĝ˙  Í!œ× ˙ĝ˙ŭŭ˙˙ÒÙñ˙˙öŭÑÊ˙˙˙ŭĦŭ˙ò˙˙#’˙÷ž!Ż˙˙˙ġ˙ŭ˙úö˙˙˙˙˙˙˙˙˙ŝ˙û˙“! ˙˙ġ˙ŝûŞ *–˙üŭú˙˙˙ûü˙ü ŝŭŝŝŭ˙˙“Ÿ˙üŭ%²ö˙˙ù˙ $Ò˙÷˙˙ï˙˙´ò˙˙˙˙˘Ì˙ô˙˙”­˙ĝö˙Ê˙˙ŭ˙Ô,÷˙üò­˜˙˙÷˙˙˙ì˙˙ü˙ö˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ù˙˙˙ ˙ù˙ùú˙ö ! ú˙ô˙úŞŝŝüŝÎ˙ÌúŬœ"%Ñû˙˙˙˙˙˙˙˙˙ú˙˙˙ŝŸ˙˙˙˙ö˙ùû˙ŝ˙žÑ˙úüû£Öü˙û˙ü!Çû˙˙ !˙ËĠŭ˙ŭô˙˙üĝ˙Ë"Ŝ˙üù˙˙˙ĝ˙ë˙˙û˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙÷˙Ï %Ÿ˙ù˙˙˙˙˙ò˙ #É˙˙ö˙Í˙í˙û˙˙˙˙ò˙ŭŭ­˙ù˙ŭ˙Üö˙ĝ˙ŝ˙ŭ˙ñ˙˙˙˙˙˙˙˙ĝġ÷˙öŝüÖ˙ï˙˙öÍ#(ó˙ü˙ĝ!$ûù˙ñŝ˙ô÷ ˙˙÷˙Ĉ Ĥ˙˙÷ŭüġ˙ùöŸ™ ­˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙ĤÁú˙˙ôÓ£ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ó ü÷˙ú˙ù˙Ҙ”Ġ˙û˙˙˙"˙˙ù'˙˙˙ŝôÏ(—˙÷ŝŝŝ˙ŝù˙ô˙˙ú˙Ï˙ù˙˙Ÿ˙ŝŝ˙Ï" ˙ĝ˙˙˙˙˙˙˙˙˙ü˙÷˙ĝĝ˙ĝ $ ¨üŝ˙˙Ε˙ó˙˙ŝú£ # ™˙üŝñ˙Ê!&–üŝ˙ó­¨˙˙ŝ˙˙˙÷ú˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üÏİĝ˙˙ûÓȞĤ$™˙û˙üÑ5Ë˙˙˙ûÇ˙œİÈŭ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙úİ $'›!œù˙ŝ˙ŭ˙˙  %Ï˙ĝ˙˙ĝÉ!Ĵ˙ĝû˙ü˙÷ù˙˙ Ñù˙¤( ĝË˙˙ŝŭ˙˙û˙û˙˙˙˙˙˙˙˙ŝ˙ŭöĥ˙ŝ˙úú÷ ž˙ŭ˙ŝï˙ûŝ˙ú %˙˙ŭò˙˙ú•ŝ˙Íù· !™˙ô˙ñü³ž˙˙ñ˙˙ŝ˙¨˙÷ŭ˙Ĉ§ŭŭ˙ÄħÉ˙˙ô˙Ÿ˙ô˙˙³ £˙ï§$š˙÷˙ñ˙ŝú˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝô˙˙ġŝĴ "˙ŭü˙˙˙˙İ˙˙ŭì˙ü–˙û˙ŭ˙ Ç˙˙˙À% %–˙˙˙˙˙˙˙˙˙ö˙ŭûö'( Ó 'Äġ÷˙ïŝŝ˙”  –˙˙ĝ˙˙&˙˙ì˙Î Ġ˙˙Ì(½˙˙ŝŝ˙÷˙˙ŝŭ˙˙ò˙!!Ħ÷úŭŝŝûĈŻâ÷˙˙û÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüúŭ˙˙ûÒ- "Ħ˙˙ï˙öŭ˙˙ü! §úë˙˙œ &Ï˙û˙˙ëŝŝŭ˙î˙ŭ  î˙˙ô˙&!Ì˙óù˙üóŭ˙˙˙˙˙˙˙˙˙˙˙û˙ó˙˙˙Ĉ'Î˙˙˙Ħ 1£ŭ˙˙ô˙˙˙ö˙˙ö˙%ôô˙˙ž˘ùìú˙˙ñ˙˙˙&""-ı˙˙˙ĝô˙˙˙˙˙˙˙˙˙˙˙0ş˙ïŭÓĤç# ¤–˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ü˙–# ˙˙üú˙Ċ•š'*ĊìÇòÖô˙ŝ( ˙˙˙ żŭô˙˙"˙˙˙˙ŝù˙˙˙˙˙˙˙ Ä˙òú÷" /‘˙Ñ˙ù &ŝ˙˙˙˙˙˙˙˙˙˙ġ˙ŝñ˙˙ü˙ '•˙ùú˙Ñ% ˘˙ü˙û'ûܙ' žûŭ˙˙óà "Ô˙˙û˙–# İ˙˙öĝ÷ÏĴÌï˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝö˙ä £˙˙˙ñóĜġú" ŭü˙˙Ë2/˘ĝü˙ò˙˙İ / ĤÈ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ñĠœ³ù+˙ŭíüñ˙˙ĝÉò˙ú˙˙  ˙˙˙òùîŝ˙óŭÑ˙ì# ­˙˙ôù˙˙Ÿ˙û˙˙˙˙˙˙˙˙˙ûŝ˙–"Î˙˙˙˙˙˜"˙ù˙˙˙úĞÔ˙ġ!ô˙˙˙òüüĥ.Ôô˙˙Ö˙ï˙ü’(Ñ˙ùû˙ò÷˙ ˙˙ĝİ"˙ü˙˙ ˙ö˙×)˙˙ñ ! ˙˙ö$%ž×›§É˙ŭÊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ôö˙“  ú˙ú˙˙ĝĝ)(Êô˙˙ôÒ(Ĥ˙ġ˙ü÷ħ)ž˙òü˙ÖÉġÚ!(˙˙˙˙˙˙˙˙˙˙˙û˙ûİ+ + ˙ŭ˙ŭ˙˙˙•×˙âĞö˙˙ŝ™! Żû˙˙úÊ ·´ê˙§%$ Şùò˙˙ŝúŝ˙˙ùĝ˙ö˙Ÿ/!Žŭ˙˙˙ŝó˙А˙ġ˙˙ġŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙ŭ$#Èúû˙˙˙˙ïö˙›˙˙÷ŝŝ˙ü˙˙˙ò˙˙˙í˙0 ˙˙ç˙îœĠùĜ˙˙ŭ˙˙ġû˙˙˙˙˙˙˙˙ûñùġ˙öíèĊ˙˙èŭÉ#Ë˙ú˙˙šûÚñ˙ù×! -˙ŭ˙ŭĈ%˙˙˙úñ˙˙öÊ ġ˙ûö˙˙ŭŭ˙˙˙˙˙˙˙˙ù˙¤$ˆġ˙˙˘"˙èÒĝ#)­ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ò.Êŭ˙˙÷ 2ĝ˙ĉĞ˙˙˙ûù!Ñŭ˙Ş£Ġô˙˙Ê) ò˙ú˙˙ü˙ú˙˙ôï˙ï¨ Îú˙ù˙Ğ &Ĵôù˙˙!Ù˙÷˙˙˙˙˙˙˙˙ûŭ˙ù˙˙ò˙ò"˘á˙˙ŭËœŝ˙˙Ö" Ê˙üĦ% Ÿ˙˙÷ô˙À # "ó÷ĝú˙Ĉ$+’˙˙˙Ġ —˙ġû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭ˙,÷ùö˙§žü˙ú ¤Ü˙Í˙ùż˙˙ ĤÓû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙ÚĈ˙‡- ˙˙˙˙˙ĝ˙ġ*Ğŝëŝŝó& 5Î˙ĝó˙'û˙˙˙˙!˘ò˙˙%ëŭ˙˙ úŝ˙˙˙˙˙˙˙˙÷˙˙ıÓ!§ŝü˙÷úÉ!”Ì˙ûúĦ ü˙#ÚÁÂú˙˙ú™ Ħ˙̖'›úüÔ2“˙˙û˙˙úœħä˙ŭ(! ˙üÓ"#˙˙ú–$,Ò˙¨ÈÄ˙#* Ŝùï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ö˙˙ñ'&˙˙ï˙˙÷ü”˙˙ì˙Ǩ ÷˙ùÙ˙úù˙˙˙ü”*˙˙˙˙˙˙˙˙˙÷˙ê˙˙°#ò˙ûúġ˙ñ—ù˙˙œÔ˙öüŸ)°úüï˙Ë"*„˙˙ñş ŞûÚ˙˙ú˙ûê˙˙˙˙üáċŭ˙˙ċô˙˙!Ñ˙˙ú˙˙öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óŭ˙˙˙˙›#Ċ˙˙˙ä˙˙˙ŭ˙$ŝùö˙Ä)ÌôÙüĝü˙˙ùú˙ë#Ĥ˙˙ŭŭ˙Ë!Ö˙ôùÄ£ú˙˙˙˙˙˙˙˙˙˙û˙˙ó˙˙ħ˙ô˙˙˙–&- ˙î˙êùÛö˙ö˙Í&Ñù˙-‘˙÷ġŭ$œŭôġ˙˙ŭ÷˙ŭ˙Ĵ!)™˙˙ùŭŝŝ˙˙˙˙˙˙˙˙˙˙˙ü$ !˙˙Ċ /‘˙˙Ĝ Ħ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŸ4÷˙Î#ö˙–Ö˙˙˙&ò˙˙É#§˙ġŝ ĥŭóĝ˙ĝ˙úú˙ù˙˙%%Ñ˙ûòÏ(½úĝ˙Óùġ˙˙˙˙˙˙˙˙˙ò˙˙ó˙ò˙öĦĥù˙˙˜<”˙Ö÷!˙ûû$Á˙ë˙˙!Ħ˙˙ü˙ûü£&™ %Üĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝï˙ ˙˙˙Ċİ›˙í œ˙òÙ'šŻÌô°#) ›Ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óġ˙Á-!˙ûċ!Í˙éġ˙ĝù˙ŞĦ˙˙ĝš!›ô˙˙Ĉ#Îúúû—!Üò˙˙$'£Ħ' *ì˙˙˙˙˙˙˙˙˙˙˙ŝÒ#(û˙˙˙˙)÷Ï˙³˙ô˙& (ŝüüĴ)Ÿ . #˙˙˙$ ˙ú˙˙ü˙ Âë• '”˙ú£˙ĝ˙Ö)š­”˙˙Ĥ°‹œ˜˘É˙˙§" &¨Û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙˙ú˙!ñ˙˙ĝĝ˙ŝ#àöÓ˙˙˙¤#Ğ˙˙ŝò˙(Ûù˙Ħ™÷Ġö˙Ĉ/ (ô˙˙˙˙˙˙˙˙˙˙˙˙ó˙È!*–˙ŭô˙˙ò˙"˙úĝËšÓ˙ü˙.•˙˙üŭÈÑòĝ˙ĵÊù˙˙÷˙˙˙˙ô˙ĝ˙˙˙Ö+Ğ˙ñ˙˙˙ŭÍ '³í˙ú˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÇĞ—!!Żñġì˙üŭ˙ġ$(Ô˙ŭ˙˙!İ˙ö˙ġĥ˙ŭ˙Ü& ˙ġ˙ò˙˙™Ò×˙Í$˙û˙˙˙˙˙˙˙˙û˙÷ô˙À   ĜġûúÉÑ˙˙˙É$ œÓÚ˙ó˙#šŞ#˙˙˜, ˙úġ˙ŝŝ˙ŭöÌ"Öîò˙˙ŭĝ˙˙˙˙˙˙˙˙˙˙÷—˙Ó)!µÉ&'  ú˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙É)!¨˙÷ż"ìŝ–Ŝöĝ˙Î%(& žâ˙˙÷˙ŝ˙˙úüŭ˙€# ˘û˙Ç  ÚÊ˘( ßó˙˙˙˙˙˙˙˙˙˙ü˙ĝ˙ŝ˙ # ˙ôÊ/óö˙ Ċ#  ħü˙ĉúû"Ëġĝ˙˙ò˙#ìúó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôú˙µ"˙û˙Šž 0 ˙˙Ñ  )"ş˙ò #!˘˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙˙óÜ  ĴôÑ*Ŭî˙˙úü˙˙ È˙˘*  ˙˙ó +Ĉ˙Î8 ! Îñ˙ % "Ÿë˙÷˙˙˙˙˙˙˙˙ŭúĜ   -öö˙ü÷ž  (/Ġĝġ˙ (%˙ü˙ëš$( ġ˙À "˙ġî˙—# É˙Ŝ) Ê˙˙úÚÉÖáĈÉ˙ŭú˙ë˙˙÷˙˙˙ï˙˙Ï˙˙˙ĝù·/ Ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üî˙˙ "û˙ĵ!àü˙ĉ ˜˙ŝ˙úò$ ˙ĝ˙ü˙ î˙˙ ĠöŬ*œĜ˙˙˙˙˙˙˙˙ê˙ùû˙˙Ó$ Ĥû˙˙ŭ˙˙& È˙×)¨ġĠ˙…2)˙˙˙ı *!žŭ˙˙—-/‹ùċŒĤöú˙˙˙ü˙íù"è˙˙óġ˙÷ó/) Îö˙ŭ˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŭġ…-( ħ˙ĉ˙üĠ#"Ëĝ˙˙# ¤£* £˙ĝĜ! Żö˙˙˙˙¸(& 'ùú˙˙˙˙˙˙˙˙ŝ˙òĝĴ '˙ü˙ŬâóĊ0& š˙˙$ "òĜ‘! +ê˙˙üö˙ûô˙ŝĤĥô˙˙˙ŭŭ˙˙ú˙˙˙˙˙˙˙˙' !"ÌġĦ!ÍÛ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü"# ˙Ò#.”,(Ò˙˙ £˙˙úù–$. $ %˘é˙˙ŭ˙ĝ˙÷˙ŝ˙ñ˙ 6˙ĝúŸ(  %žò˙ö˙˙˙˙˙˙˙˙˙˙ûùú˙ŭġ Ĥ˙˙Ĥ ,#ä˙èŜ  #˙ó˙˙ŭ  ž˙˙˙˙ĝ˙óŭ£œ. #À˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ"#˙ú˙Û Ş™˙ò˙'  ˙˙˙Ñ' ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òġ˙˙˙ŝԛµĠö˙˙÷ûŠó˙ŭ˙ŭü˙›(&#'›Òñ£Í%€˙û˙ ŞòĠĞ$‰˙˙˙úÙ#˜Ĝŝ˙˙˙˙˙˙˙˙˙˙˙ûóİĤŸ˘!ğ˙˙ñ˙˙˙ŝ8"Ŭî˙˙ûûγ "œû˙ñ˙˙ĝĜı—Ŝ˙ġœ—˘ú˙˙ÚĦĞ›£Ÿö˙˙˙ŭŝ˙ġĝŝ˙Ç˙ü÷ùìòü˙í˙˙ŭŝï˙˙˙é˙ò˙˙ġĠ˙ŭ˙÷˙îú˙˙ċ˙Ŝ " %Í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭô˙˙ġÌ1 "+í˙%¤ġ˙Ò%ŞúŝġĠ›"Ş˙ûûĦ'  !•˙ö˙˙˙˙˙˙˙˙˙˙ŝġù˙óŞûò˙ê˙˙˙˙À Ì+"ı˙Ÿ# ˙ñĞ˙ûġ˙ ( š˙˙˙ġ˙˙÷˙ú¤Ĝ˙˙˙ŭ˙˙ùüü#’áü˙˙˙ŝŭŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙2"'ĉ˙ŭ˙ ˙óö˙˙ .(ù˙˙'úúŝúĝ˙È 4*Œ˙˙˙˙˙˙˙˙˙˙ĝô˙ŭ $ Ĝ˙ĝĠô˙ +% ĥĝŜ  /˙,›˙ûĤ)œô˙óï˙˙˙û˙ùû.Óüòú˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙*ħ˙—*") £ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ -) ˙–"%Ĥ³ )Ÿôü÷,žó˙ôúÜ˙‘™ß˙Ë£žü˙˙úóú˙˙˙ö˙˙üúü˙ —‘Ĝŝ˙ĝúÔÓ˙Ĥ  ŝ˙È˙ù˙öû˙˙˙˙˙˙˙˙˙ö˙˙ŝŝì˙˙àĝ˙˙Ċù˙ù÷ùáġû˙ì˙˙˜¨ žû˙ʗžú˙ŭè˙ú˙İĦŬôĝöûô˙ŝú÷˙˙ʛŞ›˙ŭô˙î˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ù˙˙ßê˙÷˙˙˙˙ùŝ˜Ħö˙ù˙˙Ê ˙˙˙ûŭïѐ˙ĝ˙˙˙óú˙ £˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ŭî˙ĝûÙá˙ĝġ˙ŭ˙˙ó˙î˙ùô˙˙˙˙íŝöú˙˙üô˙˙ò˙˙˙ŝ˙÷˙ò˙Ôëçôü˙ú˙àŭù˙˙ùî˙üŜèâ§ŞÎ˙üÍ˙è˙˙˙˙˙˙˙˙˙ŝ˙˙Ċó˙ü˙˙ñ˙í˙ŭ÷˙˙˙ù˙˙ö˙˙Ìĝ˙ŝè˙ŝ˙Ê˙˙ùü˙ñ˙è˙Ñŭí˙ü˙üê˙ì˙˙÷˙î÷ŭ˙ü˙ŭŭ˙ĝ˙˙ö˙ŝ˙ûù˙ö˙û˙˙˙ûŭ˙˙ù˙˙îò˙ŭ˙ú˙˙˙òö˙˙üü˙û˙˙ì˙˙%š˙˙  ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙ó˙˙û˙Ĝ•$šÔ˙˙—$ÒĤÑ˙÷Ĝ¤ÊÏÜû˙ù˙˙ĜŸĠË˙˙˙˙ %#ĝ˙˙˙˙˙˙˙˙˙˙˙ŭúŝ˙˙ġ˙̛Ôŭû˙ñ˙˙˙óŭ˙öÏÒ˙úÛ&˙Ĉœ#œÛÎġܢœÓĠüĝ˙ŝ÷˙Ö( Ÿŭ˙úŭ˙÷ŝ˙ŝŝ˙Ô˙ùŭ˙üö˙˙ó˙ĝ˙ü˙üûŝŝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ $˙˙÷ù #—˙û˙üùĴ˜˙ôúŞ#ŭ˙ŭ˙˙ġÛÄáÇÏĴÈßû˙˙˙˙˙˙˙˙˙˙ŭ˙÷ÓѧÉĜ”ĠÍÔàó˙˙íÚÚŝüġԞ(ɘ°ÍĴÌĜĵ˙ĝÜËİÏÚíİÂĠŭ˙ʤĈÏ£Ó˙ö˙˙üüü˙ŭ˙˙ !È˙˙˙ŭü˙ŭû˙˙˙˙˙˙˙˙˙ÏÍ˘Ñ Ì¤Êú˙ŝ×ˤɚĜùö˙ġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ÓÎĊÂÍÖú˙˙ŝ¤Ĉ˙ŝŝ÷§ÌŭĜ˙˙Ö§ÇâÄÒ˙ò˙˙ĝò˙˙˙û˙ŭ˙˙ô˙˙ó˙˙˙˙û˙ŭ˙˙é˙˙ĝŝÉ˙ú˙úüŭ˙÷˙ûúÎ˙û˙˙˙ĝĝ˙˙ŭŝ˙˙˙˙˙˙˙˙˙öù˙ù˙ŭŭö˙˙˙ŭ˙˙˙ĝ÷˙ŭ˙˙˙˙ĝŭŝ˙ù˙˙˙ġ˙˙ó˙˙öñ˙˙ĝ˙˙÷ü÷˙˙˙ŝúġ˙˙ĝûùŝ˙ó˙˙˙ó˙˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙÷˙ö˙˙ŝ˙ŝ÷˙˙˙˙˙ù˙ŝ˙öî˙˙ûù˙˙˙˙ûŝ˙ù˙ġ˙˙˙Ĉ* ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷÷˙˙ŝ˙ŝû˙˙ü˙ù˙úŝ˙ù˙ö˙üúü˙í˙ŝ÷˙˙˙È˙˙÷˙ĝ˙ŝ˙úù˙ĝ˙÷˙ĝŭû˙û˙üî˙û˙˙û˙˙ŭ˙÷˙ŭù˙üú˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôü˙ŝú˙üŭ˙˙˙ö˙ĝ˙ù˙˙ôŭ˙ï˙ŝŝ˙û˙ŭù˙ŭ˙ûñ˙úü˙ú˙íŭ˙˙ŭ˙ŝŝ˙îÜ˙î˙˙ŝ˙ŭ÷˙ö˙˙ûŭ˙˙˙÷˙ù˙üŝ˙˙ö˙ĝ˙ùü˙ûŭ˙ŝö˙˙ö˙˙ŭ÷˙ö˙˙˙˙÷˙˙˙˙ó˙ŝüÍ &˙üž˙˙üĤ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜĤ˜Òĝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙ž˘˘ž˙˙ͧ›œ Ìü˙˙üÔ˘Íû˙ŭû˙˙ö˙역žö˙òú˙ú˙˙ù˙ù˙ ö˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙쳘Ħ˘Ôúûü˙ô֤ݙĞ÷˙òŝ˙˙˙˙˙˙˙˙˙û÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷û˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙úöü˙˙û˙ŝŭ˙˙ó˙ŭ˙ĝÚ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝŭú -ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü/˙Ħ°˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙ïêù˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñù˙ñ˙˙ñ˙ù˙ġ˙˙ŭ˙˙ŝĝ˙ŝéċ÷˙ŝ˙ù˙˙ü˙˙ëÖúúò˙˙ù˙˙˙÷÷˙ú˙›Ÿ˙ïö˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙˙úû˙ö˙˙˙˙˙˙˙÷ġÓÏù˙û˙˙˙˙˙˙˙˙˙˙öò÷üüûŭ˙˙˙˙˙˙˙˙ŭûüü÷òö˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙üüûòç˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙ŭ˙˙ġŝ˙û˙˙ŭ˙ Ï÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙û˙Ò˙ Ħ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Í6   #Éç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙üùúüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùú˙ŭ˙ŝŝ˙ŭ˙˙ûŭ÷âèûĝĝ˙˙˙˙˙˙ŭ˙û˙˙÷ŭúŜú˙˙˙˙û÷˙èö˙ï˙˙˙ß÷ú˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù÷˙˙˙˙ŝü˙ŭ÷û˙˙˙ŭ÷˙˙ü˙˙˙˙˙˙˙˙˙˙ú÷úŝŝŝ˙˙˙˙˙˙˙˙˙˙ŝŝŝú÷ú˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙û˙˙ŝŝ˙˙ŭ˙ġÊ(ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ñ˙˙/#޽˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ì'% Ä˙ßû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ü˙˙˙ŭŝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙˙ö˙ûû˙ö˙˙ŝ˙˙ùŭ˙˙˙˙ŭûùùŝ˙˙ù˙˙˙˙ŭñ˙úöú˙˙˙ġ˙˙ñ˙ûĝ “˙è˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úù˙˙÷üöĝ˙˙ŭú˙ó÷˙˙˙˙ŭĝ˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙˙û˙Ò ˘˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝö˙˙ġ›ž¨™ġŝ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙¨ž¨› Ô˙˙ġ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭŝ˙˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭüŝ˙˙˙˙˙˙ŝ÷ĝ˙˙˙˙ŝù˙ŭ˙˙˙ŭŭ˙˙ûû˙˙˙˙˙˙û˙˙úû˙ŭíĝ˙û­ !Ż˙˙˙ñġ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ü˙˙úŝ˙˙˙˙˙˙˙˙˙˙ŝŭüüŭ˙˙ŝ˙˙˙˙˙˙˙˙ŝ˙˙ŭüüŭŝ˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝ˙ŝġüü˙ġĤ% Ò˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ò˙˙˙öó˙˙ŭúûċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭÊöùŝĝ˙˙È˙˙˙˙öö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝĝĝö÷ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüú˙˙óĝĝó˙˙˙˙û÷úŝ˙˙˙üŝ˙˙ŝü˙˙ŝü˙ŝ÷ôùŝú˙˙ĝġûü˙˙×/ £í˙ù˙˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙ĝ÷üù˙ŝĝù˙˙ĝ˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙˙üŝŝüü˙˙ü˙˙˙˙˙˙˙˙ü˙˙üüŝŝü˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙ŝüüŝŝüüŝù˙ŝŝŭ˙Ä ""§ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ôò˙ĝ˙˙ĝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙öŝ˙ôûÔ˙ġ˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙ù˙˙˙˙˙˙ùû˙ŝ˙˙˙üü˙üúûûûü˙öü˙˙˙˙˙˙˙ŝû˙˙˙˙˙˙ĉšü˙üĝ˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙˙˙˙ġŭ˙˙˙˙˙˙ĝü˙˙˙ŝüü˙˙˙˙˙˙˙˙ŭ˙˙˙ŝ˙˙ŝ˙˙˙˙˙˙˙˙ŝ˙˙ŝ˙˙˙ŭ˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙÷˙˙˙ŭ˙Ê/—˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĝŭ˙˙˙˙ï˙˙ŭù˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñû˙ê˙˙üüù˙ġġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙úùŭ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ü˙ü˙ŭŭ˙ü˙ŝ˙ŭú˙ŭû˙˙˙˙˙˙˙˙˙˙˙ùôüŝü˙ûŭü˙˙üĝ˙ú˙(Ñ˙ŝû˙ó˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ŭŭüú˙˙ŭŭúùŭ˙ü˙˙ŝ˙üû˙˙˙˙˙˙˙˙˙ü˙˙ŝŭ˙˙ü˙˙˙˙˙˙˙˙ü˙˙ŭŝ˙˙ü˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙˙üó˙ó˙˙šĦĊ˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŝ˙ü˙üĝ˙÷ŭú˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ĝ˙˙ŭü˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙󲟔™Ŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝúü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙÷ùäù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝŝ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ù˙˙ò˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŭŭŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŭŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûŝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙˙˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġŭ˙ŝùŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝñéò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷ÖÖ÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ö˙ġü˙ó˙˙ŭöŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ĝ˙˙ô˙˙˙˙ùŝ˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙î˙ù÷ü÷˙˙˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙÷üñ˙˙ŝ˙û˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝ˙üĝ˙˙ûùŭ˙ŭŝ˙ü˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙ŭ˙ŝ˙˙˙Ö˙˙ûŭŝ˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙ù˙ö˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ùŝó˙üú˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙˙ŭü˙˙˙˙ûŝ˙ú˙ŭ˙ĝ˙˙˙ùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙ü˙÷˙ñ˙üô˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙˘ ¨ġüú˙˙˙˙˙˙˙˙˙˙ü˙ûú˙˙ù˙ġ˙˙÷˙ùû¤˘˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙ŝŭ˙ŭùû˙˙üŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ŝĝ˙ĝ˙ú˙˙üü˙˙˙úúŝ˙ü˙˙ü˙˙öù˙˙ñ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙û÷ú˙ŝÙ˙Ċ˙ìò˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ö˙ö˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷˙ö˙˙˙˙úù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙˙ċ˙˙ŭú•§ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ûġ˙˙˙˙˙˙˙˙ûü˙˙ŭ˙ó˙Îöû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝö˙û˙î˙˙˙ŝüó˙÷˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝó˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙÷˙˙˙Ħ—Óûö˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙˙ĝ˙ÔİËĞö˙˙ùŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úô˙ôÊĤ!"šËĝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüŜ ˙˙˙˙ó˙˙˙˙˙˙˙˙˙ĝ˙˙ŭô˙˙˙ò˙ô˙˙2·˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙üû˙˙˙˙˙˙˙ŭŭûùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙ŭ˙˙û˙˙˙ŝ˙ëŝ˙˙˙˙ĝò˙ùö˙ô˙ŭ˙˙ú˙÷˙ŝĊ’§û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙üĝè˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙î˙˙îĠÌ˘˙ú˙ñĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ê˙ú˙üĝŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝúëô˙ŝûü·$$2—ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŭ˙ùû÷ŝ˙˙˙˙ûû˙úßÎÁ˙¨ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ĝ˙˙üÎÑ˙˙˙ù˙ö˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùû˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙üô˙ì ˙ùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ÷ú˙˙ö˙ŭ’ #‘ü˙÷ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙- "Ĉùŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üûŭüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûġ(&! "Íîġŭ˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙˙ôìú˙˙˙ŝ $ ×ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙ûû˙˙˙˙ŝ˙˙˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙˙˙úì˙˙˙˙˙ù˙ġŭ˙˙˙˙˙˙ġĝù˙˙˙ĝá&ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭü˙ù˙šĴĴ’Š˙ó˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ÉûШ˙˘÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëò˙˙˙˙ÎÌ˙˙˙ú˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙ŭŜ˙ÑĞ*"Ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úôö ˙ŝŭüŭ˙˙ŭŭŝĝ < (˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûí˙˙˙œöö˙ŭ˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙ü˙ŭ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙û˙ú˙˙§ ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙À´ *!$Í˙˙ûúù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ’&&Ŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝŭŝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù§&›Ĉ˙˙÷ú˙˙˙˙˙˙˙˙÷˙˙ó˙˙ú˙˙˙úùŭ˙öâ&"˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙ŝŭŭ˙˙ŭüŭŭŝ˙˙˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭöûŭ÷öŭ˙ŝ˙ú÷˙˙ûŭ˙˙üö˙üòü˙÷ġ˙÷˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¤É%  İ˙˙ü˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ġ˙ħ &Ĥ˙÷ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—& *§û˙˙÷ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙úî˙˙Ê  #È˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ë 4˙˙˙üü˙˙˙ü˙™) #˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙û˙ó  ˙˙˙öĝü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ĝî˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ĝ˙ŭ˙ŭ› Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úùŝŭ÷û˙˙ü˙˙ ™˙ĝ÷˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙$×Ĉ’˙ùó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙*Ôê˙ËĠ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ĝ÷˙˙˙ê˙˙˙ü˙ġ& ¨ËÍù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙ü˙˙˙üü˙˙˙ŝĝöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôú˙˙˙˙˙˙öù˙˙÷ŭŭ˙˙˙óĝ˙˙˙˙˙˙úó˙˙ĝġù İÖçü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûó÷&%) $ż˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú“¸!„÷˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ìü$ Ħùŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üúó˙˙Ï!#"žÊ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îü£%Ä˙˙˙˙˙˙˙úö˙œ,˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôûîŝ$,§Òùĝ˙ŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙ôùü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ùüÓ ˜˙ü˙ì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ü÷ú˙ôËîħ —ŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙™"#Ĥò˙îü˙˙ú˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ûùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Àú˙ü˙˙˙üò˙÷˙˙˙˙˙˙˙˙˙ï˙˙ô˙ü™Á˙˙ĝú˙úŝÖ"ž˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôĝ˙˙ñ˙˙ï˙˙˙÷˙û˙˙˙˙ô˙˙ûú˙ŝóŝò˙Ġ'Ê˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙°§ë&üŭó˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ú˙îòĜ &˙ú˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙Í) ¤ŝêŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷üÑ ˙û˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¨ )˘òŭ˙˙˙˙˙ŭ˙ġÓ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙û˙˙ï"ĦÍŝ˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝô˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙ùü˙Ó˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙˙˙ûó˙ùü')Û˙íü˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö¨ ˙ü˙˙ôŝ˙ùë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üôïñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ż  š˙öü˙ì˙ĝ˙ú˙˙˙˙˙˙˙˙˙˙ŭú˙˙˙öŸ!˙ñú˙˙˙ŝ›!Î˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙ŭ˙˙˙˙˙ŭòû˙˙ŝĝúüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûü˙˙˙˙˙ò˙êü˙ü˙˙ü˙˙˙ñ˙ŸĤ¤À˙ñ˙˙É%§–Ħ'˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉÇ˙˙ü÷Ĝö˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ĝ˙˙Ë ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙Ÿ˙ó˙ŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŝ˙˙ĦÎŭ˙ó˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ¤  Üñ˙˙ŭü˙˙˙ñ˙Ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝñ˙˙ô˙& ›û˙ĝù˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ ŭŝò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ú˙œ˙˙ŭ˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġÓ³Ċö˙ĝ˙ñ˙ù ˘ëàŝúĝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭÒİó˙ù˙ŭ˙û˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ û˙˙˙ö˙ŭĝ˙ö˙ŭ˙˙˙˙˙˙˙˙ŝ˙òù˙›!ú˙˙˙ô˙ĝÎ& ž˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙üŭ˙˙ñÜ˙˙óÚÌÚġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ùš%$Ùû˙ĝ˙ü¤£ÊÖû˙ŭ˙"˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙û˙ü˙ĝ"!Í˙ŭ˙˙˙ġ˙ñ˙˙ŭ˙ŭñ˙˙î˙˙üŝ÷˙˙ĝ˙˙ñ˙˙ùú˙˙˙÷˙˙öù˙ŭŭ˙î˙˙üùİ˙÷˙ïĝ˙˙ó˙ù˙ú˙˙ó˙ö˙ì˙˙÷˙ü˙˙ü˙ŭó˙˙éŝ˙˙˙ú˙ŝ˙˙ö˙˙ï˙ġû˙ŭ˙˙öû˙˙ô˙˙˙ö˙ŝù˙˙˙ŭ˙ïĤ#!Î˙ŝ˙ü˙ü˙ú˙ĝŭ˙ó˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙#˙˙üù˙˙öû˙ü˙˙÷˙ú˙˙˙ó÷˙í˙˙ú˙ê˙ŭĝ˙˙ŭ˙˙˙˙ŭ˙ŝ˙ú˙ô˙úŝ˙ò˙˙˙óô˙˙ŝö˙˙˙û˙˙˙˙˙˙˙˙˙÷˙ñ˙˙˙ô˙×.£áç˙˙˙û˙÷˙˙#˙˙ġŭ˙˙˙ŝ˙ú˙˙˙˙÷˙úó˙˙˙ŝô˙˙˙÷˙˙ġ˙˙úĝ˙ö÷˙˙˙ŭ˙˙˙˙˙ô"—Ö˙üü˙˙ùÚû˙ŭü˙ú˙ô˙ŝ˙û˙ú˙ö˙ûŝ˙˙û˙ŭú˙ôŭ˙û˙ûġ˙˙˙˙÷˙˙ó˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝŝú˙úÚ›×É˙˙˙ñ˙úù˙ŭĝ˙˙˙ü˙ù˙˙ûùŭ˙ŭŝ˙˙˙ŭ˙ŝ˙ó˙ù˙˙ò˙˙ù˙˙˙ñ÷˙ù˙ü§Ÿ˙˙ŭ˙ü˙˙û˙÷˙ò˙ŭ˙ŝ˙û˙˙û˙ŭġ˙˙˙ùòù˙üü˙ôû˙˙ñ˙ŝ˙ó˙ŭ˙˙˙ĝ˙˙ùŝù§ ó˙ú˙˙÷ĝ £˙˙ô˙˙÷ú˙˙˙û˙˙÷˙˙˙ùùü˙ô˙˙ö˙ġ˙˙û˙˙û˙ŝ˙ŝġ˙˙š˘È˙˙í˙˙ö˙˙ü˙ĵû˙ŭ˙û˙˙ú÷ŝ˙ŭûÔŭü˙˙ö˙ñ˙˙˙ù˙˙לĦ˜˙ë˙ûúŝ˙öûü¨£Ħ¨ö˙ôú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ú˙÷û˙—œÔô˙˙˙˙ĝò˙–) '˙ò˙˙˙˙˙˙ŝŭŭŝ˙˙˙˙˙˙˙˙÷˙ŝ˙—Ÿ˙û÷˙úË#$¤˙˙š˙ĝ˙÷˙˙˙˙÷˙˙ŭŝô˙ÑÙôġ˙˙ġ˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ŝû˙˙ŭÓĊ˙ĝòİŸ¤Ïŭŭ˙÷˙ÑĤĜġ˙˙˙ú˙˙›¤Ħ¨•ĞÍ˙üŝ÷˙ŝ$œüġ˙üĦ !Ĉ˙˙í&!Ĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüóüŭŝ˙ Êó˙ú˙˙˙˙ŝô˙ùŝŝ˙ò˙óŭĝ˙˙ĝ˙˙ŝ˙˙ï˙˙˙˙ö˙ġ˙ĉ˙µ˙˙˙˙î˙˙•(üó˙öŜ˙÷ŭ˙˙ö˙˙ĝŜüñ˙û˙ûúû˙ĝŭùġ˙é˙˙˙ĉ˙˙ûú˙˙û˙ö˙ò˙˙˙ŝ˙˙ú˙ú˙óŝë˙˙ö˙ó˙˙˙íüùò˙—+ Ÿüúŭ˙˙˙ù˙˙˙˙ñ˙˙ü˙˙˙˙˙˙˙˙˙ù˙˙é ¤ùġ˙ôŭô˙˙˙˙û˙Àó˙˙óü˙˙ì˙ñûô˙˙î˙˙ùŭ˙˙óò˙˙úüë˙ú˙ŝû˙ŭ˙ĝŝñ˙˙ô˙ä˙ġö˙éŝ˙˙˙˙˙˙˙˙˙ŭ˙˙î˙˙ġ—)* $“òâü˙˙ĝ˙˙˙ú!#˙ŝú˙ŭŝĝüġ˙ĝúġ˙˙û˙˙çû˙ô˙˙ù˙˙˙ï˙˙ñ˙˙î˙˙úíŭ˙íġ˙ú˙˙ Şġ˙ü˙ġ˙ù΋×ï˙˙í˙ò÷˙˙ž™¸Ê˙óù˙˙ġö˙ü¤Îŝ˙˙˙˙÷öî˙ô˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ù˙˙ó˙ê˙¤ĝ˙ŝù˙˙öú˙î˙˙É˙˙û˙ó˙˙˙˙˙ûü˙ŝŝöŭĝ˙˙ŭ˙ì˙˙˙˙û˙ĝ˙˙˙í˙ŭ˙½Ùá˙í˙ó˙˙ŭ£–Ĝ˙÷ó˙ŝŭû˙ĝ˙˙ġ÷ï˙˙˙ö˙˙ó˙÷˙ñ˙˙ĝ˙˙ô˙˙ŭ˙˙˙÷˙˙Í$àä˙˙í˙˙’!"œ-ŸÚ˙ñ÷˙˙â˙˙ĝ’ •˙úü˙˙úüú˙ŭĝ˙ŝ˙ü˙˙ #˘˙Â÷˙˙ô˙ï×͞ĤŜ˘óŝĝ˙ù˙ö× "н˙˙ŭœ"ŞĈċ %Ĉ˙˙ú˙òÑ˙Ÿ ‹˙ŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ûò˙ú˙˙éŬ 'Óú˙ġŭ˙˙ĝ°(˙÷˙òĝ˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙î¤# %Ç˙˙˙Ì)‘ÙŸ™˜ ­ġ˙˙ó˙˙Ğœĥ”İàßŭ˙˙ċ˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ԝ Ì§ĵĞĦ%”˙ġ˙˙Ě#Ÿ˙ó˙è˙Èß, Ÿ¨˙˙˙  ²˙ñĤ Ġ¸ 8£úë˙Ñ ħ×ÍÌ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙˙˙˙˙ü%˙˙öú˙ŭ˙÷˙˙ûó˙˙ñ˙ü˙˙˙ġŭŝ÷˙öĉ˙ûü˙ùĝ˙˙üô˙˙/˙˙éé˙ŝüü³( Ä˙Ïô˙ñ˙˙ĉ˙ĝù˙ö˙˙˙ù˙ĝÚ˙˙è˙˙ü˙ù˙âüòüĝ˙é˙ĝ˙óĝ˙˙˙˙ĝ˙˙ŭŭ˙ûê˙ù˙˙˙˙ëûŝ˙˙ôüù˙˙˙˙˙Ĵ–˙˙˙ŭû˙˙×ÉÎñ˙˙ç˙˙˙˙˙˙˙˙˙ñ˙ĝ˙Ġ0§ŭŬ˙˙ö˙˙ûò˙ôò˙˙˙˙˙˙ĝì˙˙ĜŬ˙Ê ­Òĝ˙ŭĝ˙˙÷˙˙˙˙ÔÍ˙Ôĝ÷˙ò˙˙ÔûÎ˙ó˙˙ñ˙ŝ˙ü˙˙˙˙˙˙˙˙˙üüú˙üó$ ,Ùöŭö˙˙˙˙ĝġ"˙ÊŭÜÇĈ˙˙˙ù˙˙˙˙ù˙ÊԚޒ˙òù˙ûüó·•ó˙˙ÎÓÑ˙ŝŝ˙ĝ˙ĜҞżú˘.–Òŝöê˙ó $ "¤˙˙˙û˙Ô§)!Ħ˙ï˙ó£›Ï ¨Ħ˙ú˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝò˙ġŝ˙§ÒÇĠú˙ġ˙˙˙Ĥ 'É˙û˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙ġĦ§!÷ïü˙˙ŸÒĴ˙ûĈ$ ˙ü˙˙˙úÀ-¨˙ĝ÷#° *Ğŭú"™ #£˙Ĥ%  Ê˙ĝü˙ŝ˙üô˙ì "˜˙Ġ˙˙úŭ£)$ ŝ˙˙ú˙˙ìù¤$# "ÂÌŝ˙ġ˙˙ġ˙˙ŝ˙ó˙ü˙î'$,£ġ˙ü˙úŭŬÛ £ú˙ĝ˙úȝ# ¤˙˙ìäë % #ž˙ïŭ˙˙á"%# ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙˙˙ *¤İû˙û˙Ž$#Ğéô˙˙ŝûŭ˙˙˙˙˙˙˙˙˙˙ú˙Ş ˙ŭ˙íŸ0"Ş %£ŝŭ˙˙òİŠİ’“˙˙˙˙˙˙˙˙˙˙˙˙ŝŝú˙úœ $ &˙˙ĵ! ( #˘˙˙˙ù$Ż•"Ó˙Ċ  "%â˙ù$ßèŭ˙Ğ˙˙˙üüöŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ö˙÷òŝú úö˙˙ìó˙ñ˙˙ë˙˙ó˙˙˙˙íò˙úġ˙˙úŭ˙ù˙òŝ˙ġ˙ü˙˙Î#“Ò˙˙ö˙¸Ħ#!ħ—´–˘Ó˙˙˙ŭ›£•™İüö˙ġŒĥŸœÄ˙ŭ˙ïĞ´û´úŝ˙ġû˙˙ΣÏġĈ˙ŝü˙˙ïĉâ‘Ĥ˙÷üœħÌ˙ûö˙˙˙ò˙üóŝġ% ¨˙ùúŝ˙™ §Ù˙ĝ˙˙˙˙˙˙˙˙˙úż˜"™œĦúĝŝˤŞü˙ú• §Îô˙˙ŝö›  + È˙üùü¤š–˙ɤ#²˙ç˙÷œĤ–˙èô˙˙ò˙˙˙˙˙˙˙˙˙˙û˙˙ô˙˙÷›ħ˙Ò  š˙˙ü˙ú˙˙è˙  *%•ŭùö˙ġö˙Ĝ$" Ò˙ġŝĴ ö˘‹˙û˙˙—Ÿ &%›Î˙˙è˙ *1êû˙ûê ! %Ê˙˙˙˙$# #ûĝŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ġòŝŭ˙ §Ħ™˙˙ôúü%& ïòûŭüŭ˙˙ŭŭŝùŝü˙˙é˙ǝĴÛ֗"˘˙ġ#$¨˙úĝɲİ{#˙ġ˙¤ ! üÁ")"Ÿŭ !Òö˙÷˙û˙ú˙˙§*°žœ˙ĉ˙›% !œ)!Òô÷˙°›œ(#˜˙ù˙˙ü˙˙˙˙ô˙ûŭÙ" $ ˙ĝ˙úÉ£-¤ &Í˙ŭÖ#Ħ£$"ġ˙+ Ûċ§('ŭ˙˙ùĊú$ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ĝ˙áĴ˙ö¤ŝ˙˙á1ôû˙˙˙ŝŭ˙˙˙˙˙˙˙˙˙ŝ˙÷˙# Ğ‘àĝ˙ŭ˙Êŝï˙ó! ˙ö˙ĝŸ! èĝĠĞ &Ôŝï˙˙˙˙˙˙˙˙üĝ˙˙˙˙Ĥ $ùôÁ'!˙  Ùô "Ëú¤ ö " ˙úŭ˙’˙ùü% ŝÚ˙ŝ"˙ì˙ûġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙û›( ˙˙ó˙˙˙òÔÀ Óñġ˙úÖ ü˙˙˙"Żôŝ˙Ô$‘˙˙ü˙¨3 %İÎÁŭ˙—+š˙ŝĤ+ -˙î Ċü˙ŝ× $ö˙÷˙˙͎2Ĥ"÷ĝ˙ïú×֜Žëפû˙éöĉş&"4 ù˙˙˙˙˙˙˙˙˙í˙×/ &! Ĝ˙Ž Óû% ˙˙é˙.0 $˙˙˙ û /!Ë˙Ŭž˙˙ô˙˙÷ü˙˙˙˙˙˙˙˙ŝû˙˙î˙˙*'”ò˙ -Ĉ˙˙úö˙˙˙˙"Ĥü˙í˙˙Î #%˙×˙ğ +é˙ü™""˘˙òó˙Ô âͧ ¤˙˙ìÑĊÉÒĞ šüö›4" &ò­ "˙˙ĝ˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ĝ˙˙Ï! $Îüŝ´* ŭ˙˙üü˙˙˙üŝ˙ŭ˙÷Ŝö·))ù#)˘ŝö Ĥû˙˙Òż˙˙Ï'Ñ˙""‹é¤! Ż˙ù(!ŝò˙ù˙ĝ˙ŭ˙ŭ›*  0¤ùÏ˙žœû˙ù# Ÿ˙ü÷Û˙ü–&*ó˙úŭ˙˙˙ô˙˙˙û˙ŭÂ!3˘˙ùŝáŬ%úÍŜÌĝÌ'˙ŭ  çĝ ™˙û˙œô˙ŝµ ) !ĝí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙°&!˜ú˙˙œ "ï˙ùòÏ * —˙Ê˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙ïÑ˙˙í˙ûúö$˘˙˙Â˙š#Ñŭ˙˙$Ö Ìŭ˙˙˙˙˙˙˙˙˙˙ûŝŭû˙ì#,˙ü˙ #) 1 ž˙Ó!Ĥ˙˙˙Á&˙ó# .ĤĠÔê˙˙ŝ ˙î˙ü² §ñïü˙š/˙˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúüôĴ Ġ˙ĝ˙ù× ˜°&)£˙ġÜ !·ñî˙ ,û˙ó›%&)Ä˙˙˜"*ú!˙ûß- +× ž˙Ë˙ïך "Şû˙ìó'˙ŭÈ˙™˙˙˙üú­ ˘ /"ŭü˙˙˙˙˙˙˙˙˙ŭ–( *”˙˙Ħ $Á˙˙ŸƒŜœ “˙ŝ˙  Ħµ 'İ#"ô˙í˙˙˙ĝ˙˙˙˙˙˙˙˙˙ùĝ˙üù  Ĵê˙Ż Ğúĝ˙˙üö˙í—""ċ˙˙§…/"ù˙˙Í!Ï˙˙˙Ÿ“ú˙Ϩ  £˙ÌĤ"# ½˙ŝò%1§ŝ˙˙˙ · *šŝú˙™ íö˙˙˘Ÿù˙ŝŽ"5Ŝ˙˙ĝ+ú˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷û˙÷ŭ˙ $œ·§ú˙Í Ġ˙ĝ•/ ˙˙˙˙˙˙˙˙ú˙˙˙˙˙ĝ˙é˙  ˙ĝİ1ä˙˙Ĉ('Ä˙ûĉ%ŝù˜ @ŝ˙Ħħ˙ìڝ/¨ùù˙”! Ŭ˙˙ĝ˙˙ö˙˙ùüӜ/Ĵ —˙˙ŭ˙Ò$Ş÷Ö˙˙ öà˙–%-$$ˆ˙˙ĝ˙˙ô˙úŭ˙ŭ˙˙ŭ˙—!˙˙˙˙á%˙÷˙ûŻž˙˙# œ# $"Á˙˙ ˙ĝ˙úçîú˙& %!ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝ' Ñ˙ġ˙˙ġ°àü˙˙˙Ş$˘ŝ˙˙˙ŝúû˙˙˙ŭ˙˙˙˙˙˙˙˙ĝ˙ïŭ˙ ßêó˙ü˙˙ŝ¤$îî˙ù %Ñ˙˙­$ +˙ú˙˙˙˙˙˙˙˙˙ü˙˙ĝ˙˙úŞ',û÷šĊ˙ïÎ# $'  ó˙Ħ# Ñ˙òŭ˙ñ˙ûéç œ¨!ú÷˙˙˙ñû& œ˙ööú #˜˙˙˙ĝö˙˙ûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙˙˙à $"ï˙ùġ˙ıĦÏìô‘"˙˙Ñ Ä˙˙˙ûù˙ΔÖŝÌûú˙˙§ ›˙ŝöž£˙ŭ˙˙ )ï˙ñ˙""#£ÌÇ˙Ÿŝ˙ġ˙Ò!Ç˙î °úó˙˙™'" ¤Ïë˙üĴ,!˙ñ˙Ĥ "ŝí˙˙ñ %Öü˙˙  ˙ü˙˙˙˙˙˙˙˙˙û˙˙Ÿü˙˙˙òĝŸ &ž˙ƒ+İö˙Ù•˙˙˙˙Ñ˙˙è˙ Î˙żûÌ×˙#ŭ˙èñŝ˙˙˙˙˙˙˙˙˙˙˙ñ˙˙÷%£!) $™˙ü˙˙ï˙î˙Ż- ëñ˙ŭ˙' ­ĝŭœ%‘$˙úü˙0 Ĝ˙Ëà˙é˙˙ùë˙Íšŝ˙È˙Ĥ %) Ï˙˙ûô™!ĝ˙˙˙˙!˘˙úŭ˙Ï 'Öñŝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙üû˙˙ĝ'ÇÜ˙ŭ˙ó˘5 ˙˙ú˙ù òŭ˙˙˙˙˙ŭúûġŝû˙˙˙˙˙0‘˙˙˙ûùü˙˙íç! 0 ¤°ü÷˙Ï $˙û˙ġ"$Ħ˙ô˙ , ˙ôĝ˙˙˙ûú˙˙ùü˙Ÿ,˙˙˙ï˙÷¨˙ŭ˙˙ '°ñġ˙Ç! ) Ñ˙˙ú˙˙öġ˙˙ĝŝû˙˙êû'ô˙÷˙ ÷˙üúŝÛÎ˙ú 7") '˜˙üüĦċîŭ˙üî!üû˙ù*- ן$ù˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôï˙Î%˙ò˙ô˙̑ û˙ŭŸ £˙˙ï˙ŝüüŝ˙˙ŝ˙˙˙˙˙˙˙˙˙ŝ˙˙úš˙˙üö˙ù˙Ë˙î˙ú˙$%Íĝ˙¤ .Ÿ$‹”˙î˙˙˙˙˙˙˙˙˙üü˙˙ŝùúŭˢ˙˙˙˙ê˙Ú  ħ޳ ö˙ŭ&!ù˙ŝ˙˙ŝ˙÷˙•âùÎ˙ù˙˙˙˙é˙ûİü˙˙˙Ĝ˘˙÷÷˙3˜˙÷ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùúûÍŭŭ˙Á˘˙ŝ˙˙ô˙ ö˙öĞàĝ˙ûŭÙ¤˙ŝŭ˙Ö #Óú˙û˙˙É˙˜ ˜Ĝĝ˙˙˙˙˙ö˙Ì"Ÿü˙ġÛ Ô˙˙Çú˙ŭ˙ŝ˙ğ˙˙ô˙˙!ÉÑ˙˙ĝ˙˙˙˙˙˙ĝ˙ œ˙ġ˙û÷ÖÒû˙î˙Ĥïŭ˙›˙ü˙˙˙˙˙˙˙˙ĝ˙ñ˙˙#§ùĜù˙ú˙Îù˙÷˙˙ĢÏ˙ù˙ñŝ$˙í˙˙ĈĞó÷˙ú ×úŝûÍûġ˙˙ú˙˙˙˙˙˙˙˙˙÷˙˙ĝñ˙(ù˙ùö˙ü˙˙Ş˙˙˙ĝù ˜˙ŭ&#›üú˙˙ùĤú˙ĝ˙ö˙ù ¨ûÀ˙ŝĝú˙ŭŝÚ ¤ÀŬ˜Î“ÚŭŭÏŝ¤ 'Ħ˘˘§¤ÍĞĠŭŭ˙ù£ *‰˙˙ú˙ʨùŭ˙˙ġú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙üü˙˙úÚ!˙˙ñĠú˘¤˙ŝŭö˙Üñ˙˙ŭü˙˙˙˙ü˙û˙íŭ÷˙˘˙"üö˙û( ˙ĝÔ˘ġ˙úÖü˙ú˙ó˙˜ Ë˙ù˙ş˙ñÇú˙û˙ò˙˙˙ĝ˙˙ú˙ÏÔŝ˙û÷˙ùÇ# ùâóŝ§˘Ì˙ûš Ĵ˙˙ )Ÿü˙ê˙˙òù˙ġ˙÷ŭ˙ŝ˙˙˙œ˙˙˙ùĤ"œ˙ñ˙ŭ˙ö˙ü˙Ê"  ˙“(¤Ĉ˙˙˙ó˙Í˙˙ŭ˙˙!ġ˙ù˙ϗ£ûĠŸ£ÈÑ˙÷ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙Ì˙˙ĝ˙˙ġáŞ˙ü˙Ħü˙˙˙˙˙˙ŝüŭŝ˙˙˙˙˙˙˙˙˙ŭ˙ŝĠüŭ˙˙úü˙Ħ˘ŭ˙˙ĝ˙ŸĜ˙ŝ›!"Úè˙û˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙û˙Î$ ˙ŝġ˙ôÌ  Ïü˙˙ü˙ç˙˙˙ĝ*˙úú˙üŭ˙ġ˙Ñš˙˙ï˙˙ŝôŭ˙˙ĝ˙ ™˙˙ö˙Ö¨ù˙˙ĦË˙ù˙îü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô÷˙ú˙ŭ˙ŭ˙™"ŽÙú˙û˙öĠŭû˙Ë ĝ˙˙ŝ×§˙ġ˙˙˙œŸüú˙ûŝ˙÷˙ĦÔŝŝú˙˙˙˙ŝ÷˙˙šĠ˙ŭÒ)É˙˙ÙÒü˙öŝ˙ġ˙˙ë˙˙ôŝûúü˙óÖ›Ôú˙ĝ˙üĝÒĤÏü˙ûġ˙ݤ˙ûö˙ ˙ŭí˙Íŭ˙˙˙˙˙˙˙˙˙ġ˙Í˙˙˙úû˙ŭüĜ˙û˙˙˙ô ™˙˙û˙ŭ˙˙ üö˙ӗ û˙ê˙üž% Ĉ˙ñü˙'î˙üŭ˙˙˙˙˙˙˙˙˙˙ñ˙˙üûĤ£›žĞü˙˙ú˙ùúİ˙˙ù˙˙Ò#•˙ż-‹—˙˙úŬ£˙˙ôû˙˙Ħ*˙˙÷÷˙ü›,Îü˙ÌŭÒ˙ġ÷ù­ħ÷˙úü˙ûŭŝü˙ !Ö˙üü˙òġ˙˙ç˙˙ġ°Ğôŝùŝ Ĥ˙Ó÷ŝ˙˙ŝû˙˙ûüù˙˙˙˙˙˙˙˙˙ú˙ùû˙ŝ˙˙™˙ï˙ŝ˙"áú˙÷˙û˙ Ïñ˙˙ú˙˙ù˙˙˙˙˙˙˙˙˙ŭ!¤)Ù˙ñ˙Î (ú˙ú Ñ˙ù˙ŝ˙ú˙ôú˙˙˙Ĵŝ˙Î'#ĝ˘ Ïöúú˙û˙˙˙˙˙˙˙˙Ë%ù˙û˙ïŝ˙ Èŝ˙˙˙ŭ˙˙÷! ˙ġ˙˙úü˙ŝ˙÷ŝ˙˙˙ŭŭŝ˙ú˙˙ü˙úĞù˙ûö$ŝ˙˙ŭ÷˙ò˙ô˙Ŭñ˙òŝ˙ó˙˙˙ü˙Î Ìùî˙˙˙˙ó¤˙ŝĝ˙üú˙ôġùŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›& £ŭûŭû˙˙˙¨ó˙ŭ• §òŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙¨ ˙üô˙ĝ˙ŭ!ú˙ò˙˙Ú˙˙œ# ˙Öó˙ú˙˙˙Éù˙÷˙˙˙˙˙˙˙˙ù˙ú˙˙öŭ˙Ú !É˙û˙ŝŝ'ÎŭĠ÷ü˙˙˙ûù˙ %™Óŭ˙ùü˙ú˙˙Ċù˙˙÷˙úö˙˙ú˙ö# ŭŭ˙ù˙'œûĊ˙Ĉ§ŭù˙žŝ˙ŭġ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭú˜( ˙˙˙ô·÷˙ú÷˙ôĠ#˙˙ó˙˙ĝ˙ġÎ"!‹˙˙ûüüÄ!ú˙˙˙ŭü˙˙Ÿ*úú÷˙úôĉŭ˙˙˙ĝÏ °î˙ÈĤ§Àß˙˙˙û˙˙ù˙ñŝ˙˙ĉ˙ž ˙˙˙ù˙˙™¨ù˙˙ì˙ŭ£'‘˙˙î˙˙î(Ä˙û˙ù%'ŝ˙˙˙˙˙˙˙˙˙˙˙û˙ŝ&˙ûĝ˙˙˙ùĦ)Îé˙ĝó˙Ï1 Żŭü˙ë˙ġù¨* %ŭ˙ëħ ù˙˙ì˙Â"–˙ô˙˙ġœ˙˙˙˙˙ö˙˙˙˙˙˙˙˙˙ĝ˙È˙Ì˙ĝÚĝÒ˙ú÷˙û˙üœ ˙ŝ˙˙ôÏ ô˙ .˙˙˙˙ô˙˙˙ï˙˙ïü* ˙ù˙˙÷˙¤£˙˙˙ŭÙĝ˙˙˙!Şëĝ˙˙é˙˙˙ü˙ Êŝú˙ï˙ŝ˙ŭ˙÷˙û"ô˙˙ñ˙;ì˙˙ùúö˙˙üüŭ˙ŭû˙˙˙˙˙˙˙˙˙˙û˙˙÷˙ŝ"4 —˙˙ġĝ5 Áŝü˙ûĝÄ3 à÷˙˙ú˙˙ŭ˙˙˙˙˙˙˙˙˙ŭħ& ˙÷˙ĝĝġ&ù˙&–úàé˙ú˙û˙ú˙ùûü'òÊ + $ Ÿ˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙Ï˙˙˙˙û˙ò §ûôü˙ûİ˘ì˙˙%ò˙ĝ˙ö˙÷˙ĝ˙˙ŝŭŝ˙˙˙ô˙˙ó˙˙˙Ê #˙â˙˙,×ŭġ˙ŝô˙ô˙ùÉ&È˙ù˙˙˙˙ùúĝí˙Ĉ Ó˙˙ġ˙ú$žòġ¨ µ˙˙˙˙ë˙§×ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙Ù(˙ŭ˙˙ó˙ñ ' ˜˙úġ˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ò%˘ŭ˙˙íŝ×$˙â˙˙÷˙ÇûùÒ Ú˙˙˙˙ŭöü˙ĝġ˙˙˙˙˙˙˙˙˙û˙üŭ˙˙˙úÉ, Úë˙˙˙ ŭ˙ù˙˙îùü˙ö""·˙˙˙˙ŭ˙˙˙ &+ë÷˙ċÛ-È÷˙ùú ­ûú˙ï' ˙˙öÓ&¤î˙û˙˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ûġ!¨˙üùٍ÷˙üöû˙˙˜ #ú˙˙’&Ñ˙ó˙˙Ë˙ŭġó˙ñà$ ˙ŝ˙ŝò˙ŝĝЇ˙˙˙ûĝ˙ŭ˙úú˙˙è"˙üÔŭ ˙˙·ŭùġŝ˙üúúÑܽÓ˙#û˙˙ò˙öĦ×˙˙ö˙˙ġôñ˙ŝŝ˙˙˙úû˙&—ž"&İî˙˙˙˙˙˙˙˙˙òú˙˙ ˘ï˙˙˙é˙˙­˙˙˙˙˙îÛÖ˙˙˙ó˙˙(ôü˙ İŭ˙ŝíÖ ü˙üÖĦĝ˙÷˙˙ŭ˙˙˙˙˙˙˙˙ŭŭ˙ŭ¤!˙üó˙ï˙˙Œ'*ú˙ô˙˙ĝ˙š ŭ˙˙ûà ÉÄ$É˙˙˙ŭ˙ŭú˙˙ü˙ò%ñŝġ˙˙ŭ¤Ÿù˙ĝïÏ˙ìó!˙úŭó˙÷˙ĉ˙ïŸ! Úĝ˙ôĝ˙üö÷˙˙ĝ˙(# úì˙÷˙!˙ĝûü˙¤ %Ž˙˙ü˙˙˙˙˙˙˙˙˙˙˙úü˙˙û˙ù ù˙÷˙˙˜ßú˙˙˙˙˙šöŝ˙˙üŭ˙˙˙˙˙˙˙˙˙˙ï˙Ñ –ûĝ˙˙˙˙0˙˙Ħİ˙˙˙˙˙˙ŝ˙ġ˙˙ö—#" *"+˙˙ú˙ġŝ˙˙˙˙˙˙˙˙ż+ù÷˙ç˙ôà¤˙˙˙úûĤ˙÷˙ ˙ò˙ù˙ĝÂÏ˙˙ŭ˙ù˙˙˙ñ˙˙ü˙ó˙˙ $Ħ˙ŝùĴ ĦĈ˙ì˙û˙˙ġ˙Òŭô˙ï˙êÌ˙˙ë­%Âó˙ĝú˙/%Ğù˙ĝ #îò˙ŝö˙ Ĵô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ùÔ ˙óù˙˙˙¨*Ĝ˙ù˙#Ĝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ï  ¤ÇÉŭ˙˙ë˙# %î˙˙ù˙ŝ÷˙Ċ+"$ĝ˙÷˙ĝÙŸ˙˙ù˙˙˙˙˙˙˙˙ü˙ĝŭ˙ú˙˙Í/Ĝú˙û˙ŭô)*šÓ˙˙é˙İÚ˙˙ĊĠ÷˙˙û˙ó˙˙!%ûÓ˙œ—˙é˙İ&)ˆù˙˙Ÿ !Òû÷˙' ¨ô˙ĝö˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙í˙˙œ* ¨ŝú˙˜&¤˙ŭ˙˙ûç˙İ˙ŭÓ)˙ñ˙ŝ˙Ô ˙˙ú˙ù˙”Úô˙˙÷ŝÔġž<ż˙ŭñ˙÷Ĝ ßù˙˙óíĜ ˙ŭŝŭÔ" &âĝ˙˙ö˙˙˙ٝ˙Ùßû˙˙ùĜ ë˙ġŭ˙úÔ+ zĉ˙ú˙÷Ñ˙ú˙˙î˙˙ġ˙˙ĝ.š˙˙˙˙˙˙˙˙˙˙ó˙˙˙$ ¤˙öù˙ĝ˙ò3 ò˙˙ġŝ˙Î ¨˙ŭí˙˙˙$ ˙˙ŭòŻ ġï÷ú˙Ĝ Óĝ˙˙úÛí˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙ )ó˙˙˙˙˙ê˙ ˙üŝúĝùÒ)Ÿ˙ò˙ôĈ Ì˙ô˙˙˙ó˙˙ê˙ú˙û˙˙˙ö˙òŽ'­˙˙˙£Ħ˙Ò˙Ĉ˙˙˙˙öû˙óŭ*$˙ù˙˙û˙˙˙ôġ˙˙˜#ùúú˙˙' Ĥ˙˙˙˘#’úŝëŝ˙˙˙˙˙˙˙˙˙ùü˙ŝ˙˙Ñ$˙ï÷˙ùŸ" Ĉúŭô˙ûò)˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙³(&  ­ü˙úóûŭ'"Ôĉ¤$˙ġŝÌ˙œÌî˙˙ĝû˙Ñ ş  !Ÿ˙ú˙ġŭ˙˙˙˙˙˙˙˙˙˙˙+˙ŭ˙˙˙÷ Ÿŝú˙ö˙! é˙üŸ#˙˙˙˙Ǥ,ŝ˙˙˙ĝ˙úŝ˙ŭû˙˙ò˙ġħ˙˙˙ "İ˙üú͝˙˙÷ ²˙˙ü˙˙"Úüûž ˘˙úü˙˙í×ú(™˙˙ŭ˙Ë%˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙*Ħ÷˙ú˙ôŝÏ˙÷ĝ˙  í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙˜"%™­‘˙ö£ž $ Òġñ˙ù× ­ô˙×!àġ˙Ĉ”˙ñû˙˙˙˙˙˙˙˙˙û÷˙˙ñ˙˙ž% Ĝ˙êöù˙˙  #§™”Ğ™Ħûġ£ Ôú¤–Ë˙ù˙ŝ Ôü˙"5˙˜ ŭ˙ú’¤Ş)&×÷˙˙ĝûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝü˙˙ô˙÷š*Ùûċŭ$°ñö˙ê˙˙ġ$È˙ĝù '˙ġ˙ï˙ŻÉ˙çü˙œ!ŻŝÉ˙˙˙˙Ç˙˙˙˙ ˜ù˙ùü˙˙¤ #˙ġ˙*½˙˙˙˙ö˙ú• Ùô˙Ĥèġ˙˙ŭÔ!-Ì˙Ö˙ö˙Ê%˙˙ĝ˙Ĝ"Ħö˙ÔÒ˙˙Ó˙˙Í Ĉ˙˙˙˙˙˙˙˙˙˙ĉ˙ï #˙öĝ˙û˙˙†4˙÷˙˙ù˙Â,ŭ˙ú˙˙ößÓ˙ŝ˙˙ $×˙÷˙÷ó !û˙öŝ˙˙˙ĝ˙˙ò˙˙˙˙˙˙˙˙˙ù˙§˙˙ĝûû˙î³ ˙÷˙˙˙Ô " •˙Ëĝ˙Ğ&—˙Ê×ñ˙ġ˙˙ž.ġ˙ñ˙Ċû˙ġŭ˙ĞĠ˙Öì#4 ˙˙î¤Â³İ–˙ĝ˙Ì#ÚŭŝŭÌ˘Ĵ˙é˙ïž á˙ñî˙ Ò÷ĝ˙ 0žö˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ù˙î£ $Ÿ˙ùü˙ó*˙˙˙ü˙Í+ß˙ŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ô˙ ó˙˙˙˙Ê ) Ğ˙˙ /›Öĝ˙ú˜&Ş˙çü˙ŭ˙Ŝ!!œġÁ+ &˙ŭŝ˙ûû˙ŝ˙˙˙˙˙˙˙˙Ĵ  ˙÷˙üöù ˙˙ü˙ġ $ŸíÄ˙ÍİĊ˙ÀŞŝ˙˙˙ĝ˙úò˙ü˙˙˙˙Çİ ÓÁèâ&ËĠŞÛ£˙ì˙˜%—Òǝş˙˙-ü˙ŝĈ•,'ôúÒ( –˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ċ˙ùߣÖÏ .Ùûüġä &*š˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üâ  !ú˙$5Ùŝ˙­ " Ÿ˙˙Ê& ˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŝĝÔ* Î˙˙ûŝŭ˙,'0Î˙˙˙˜ $ %˙ŭŝ˙˙Ğ!²üŭïĤÓ˙ú˙ġÂÒ×ŭ˙ġ˙˙˙ŝ˙Á˙˙ô˙ŝö˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úûü˙ñ!.Ê˙˙ô•˙˙ü˙ü˙Ë Ç˙˙ŝÉ&˙ù˙ŭ­ŝ˙˙èĦ&’˙˙˙Ŭ˙˙Ë#Ĵ˙ï˙˙Ô˙ï˙˙ŝì×"Ë˙ñ#$˙˙ŝò˙ŝ˙Ñ+ŭÒú˜ê÷˙û˙É'İùíŝ˙˙ñ*ñŭ˙ż˙(š˙˙÷²ùûŝê˙'˙˙˙˙˙˙˙˙˙ù˙Ô3˙˙˙˙˙ùé*Ë˙˙ĝù˙˙ ­ô˙˙çÎ ˙ô˙ Èŭ˙î˙˙%ûòüŭË —˙üùŝ˙˙˙˙˙˙˙˙˙˙Ë+%¤ŭ÷˙˙ù˙Ŝ - $˙ŭ˙˙ö"&ú˙˙ ,ŭùú£ #ŭ˙Ë ú˙š'&˙ûŭô˙+ ,ú˙Ì´% £˙ŭÖ  î˙ġÏ $*¨˙ĝ˙# ˙ŭü˙ž"˜í˙˙˙'ö˙ö˙!*  ˙÷ñ˙˙˙˙˙˙˙˙ŝ˙üŭŝ˙ö³-#”˙˙úó˙—˙˙ĝî##ö˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙öġ˙¨Ž˙˙˙˙'$˙ŝ$#–ħ Ğ  ˙˙˙ġ˙ôüÙ˙˙  %˙ü˙˙ŭò˙˙˙˙˙˙˙˙˙-¤˙ùÍ˙ħ!ŭ˙–!%˘˙˙ £& ,Ï˙˙ŭ˙ù˙˙ŝ˙ö˙ô˙ñ &•˙˙ö˙& %üġ˙™  $œ˙ŝÜ. Ċ˙ù' )ú˙ô˙ (+!(Úüĉ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙üĝ͝. &Ġü˙ú˙ ) Ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġ˙! $Ÿ˙Ó3˙ù!Òó˙& )›ŝŭ˙ï˙˙˙˙˙˙˙˙ŝ˙˙ûŝ˙ò›$+˘û˙˙˙òŝ‹1) "Ëûĝ÷˙˙8  Üí˙˙úĝû˙–,Ħĝ˙í˙˙˙˙ŝ˙˙öŭ˙˙ü˙˙úùĝ˙ġ˙˙óúö˙÷ġ˙ûûŭ˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙ùŝ˙ïû +ùŭö˙š#%Ÿòŝù˙Ä# Ùîô˙˙§Â˙ò+ )ï˙ö˙ ×˙Îó›Ÿûü˙—–Ûö˙˙ü˙üĜÖñ˙ Ò˙û˙˙ŝ˙ĝ£ ˙ù˘“ŭ˙ûö‘"¨˙˙˙˙ú˙ÌÏ´—Ĥ ÔÊ˙š,˙˙˙ñ)Ñ˙˙˙˙˙˙˙˙˙ŭĈ#)·˙˙ô˙˙ß"ù˙ó˙˙ß˙˙(˙ù˙˙-É˙÷˙˙ò "Ħ˙ü˙ó-—˙˙˙˙¸-, §˙˙˙˙á˙˙˙˙˙˙˙˙œ˘ !ò˙ô˙ύŸ!$İí˙ß' Ĥ — Ġ˙ö!ĤŸ*$ó˙-Ç˙˙˙ĝ˙‹,!&ĴĦš#'Êû˙˙"ž˙˙ŝ÷ŭ˙ç, ˙î˙˙•%&°˙ ŭ˙˙Ÿ%Èġ˙˙˙˙˙˙˙˙˙ĝ˙ü˙˙˙˙é ) 'Ê˙ġ˙˙˘9Ÿŭôŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûúĝ²×ó˙˙úö˙##˙ö˙†#* +˙ö˙ŝ˙÷˙˙ó%ĝòġä#Ìû˙˙ô˙˙û˙˙˙˙˙˙˙˙˙˙!%˙ - ,ŜûĞ•+(Ì˙ŭ9 *! ĝ˙˙ŝŭŝ˙˙˙˙ġ˙ü˙Ú!"!%É˙÷˙Î) $"Áŝ˙ò˙ŝœ"(÷˙öıêü˙ü"ĤÒú˙ġï˙Ĥ- Œü˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üö˙üú˙Ĵ! İ˙Êû˙ġ˙˙öŸ*›/–˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙óúĴĠŝÊŭùûÒ¤Ħ&%˙˙˙ġ¸•)šĴñ˙ŝ˙ž£Ò˙ëù˙˙˙˙˙˙˙˙˙ú˙ŭüĝ˙ù• Ħ˙˙˙ïù˙ġ˙ñ•"Ä˙˙ŭ˙ò˙˙(˙÷ñ˙˙˙ŭ˙ĝû˙˙èüü˙˙˙ûĝü˙ûĝû˙˙÷ĝĝòŭ˙˙û˙˙÷˙ö˙˙ġ˙˙ĝ˙˙˙ŝĝŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙Ö#˙˙#Ò˙˙÷#˙˙˙˙ô  "˙ġö§¤ûô˙§˙ú˙ §úûŝŭ˙˙É!˙˙û ˙˙ĝŭ˙÷˙ŝ¨ ÎĦ ˙ú˙Ò"ŭŝùĝ˙˙Ö Ħ (˜˙÷Ö (İÌ˙˙˙˙˙˙˙˙û˙ %¨ŝú˙¤É˙ñü˙û˙È ' ”˙úŝ˙Ν˙ù(  •ŭÖġ˙÷ġ˙˙˙˙˙˙˙˙˙# 0İùú˙öÛŞ Ù˙ìû¤)  Íûù˙˙ĝŬš% –˙ö˙# ˙ĝŝû˙˙Ǘ%ž²%˘Ĝ÷˙ġŭĦÌ˙ü˙÷˙˙˙îÖ )ĞÊö˙ôŝÔ ÒĠï&ĤĠġ˙˙öĜŭ˙÷˙˙˙˙˙˙˙˙û˙ŭ˙ŝñŭ˙˙#˙˙ĝü˙¤Ë˙ù˙ŝ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙ù˙üŝÔ˙ŝ˙ŝ˙ŝúĞ̗˙ġ˙üŭÚ!Ċ˙ú˙˙ôŭ˙÷û˙˜Ĵö˙˙ĝ܏Ż˙úŭ˙ûû˙ù˙˙˙˙˙˙˙˙ŝј%£˙ò˙Ħ§¤È˙÷ù˙˙úöžĜû˙˙úÖ”!Ĥö˙÷ŝ˙˙˙ŭŭù˙˙ú˙˙Ġ˜×ϟ—Úúĝ˙ù˙Ü !Ġ˙˙ŭú˙÷˙ŭÂ" Íĝ˙˙ŭ˙ʙ¨É×öġ˙˙˙ĝ˙ù˙˙à˙˙˙ǧ܋Ĝ˙˙ġ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ĝŝ˙ü˙ö¤ŞÏù˙˙û˙˙˙ûô˙Ċ§üĠ¤Ñû˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ù˙û˙˙˙ù˙˙ŭ˙˙ö˙˙˙˙ö˙ŝ˙˙ú˙öŭŭ˙˙ÌÍ˙ü˙Íî˙˙ù˙˙˙˙˙˙˙˙˙ĝ˙˙ú÷˙óŝ˙˙ĝ˙÷ŭ˙û˙˙ï˙˙ŭŝŬÇ˙÷˙˙÷ġ˙ü˙ù˙˙ŝ˙ñ˙˙ŭ˙ŝú˙ï˙˙í˙˙˙˙ö˙˙ù˙˙ŝ˙˙ô˙ġ˙˙ŝ˙˙˙ó˙ùú˙ú˙˙í˙˙ú˙˙ùü˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùô˙˙˙Ÿ­ĝ˙ôİĦ#™˘¨§ü˙˙ĝ˙–" µ–#œŭü˙üĜ£+˘ġ˙ו™&˙˙ĈĤ­Ž§¨žú˙÷˙ŭ˙üòħù˙˙ġ§œ˙˙˙˙˙˙˙˙˙Ğ #%Ĉ˙ùï)!Êñ˙ú˙˙˙骝$# Êŝô˙ "ŝö˙÷˙˙˙˙˙˙˙˙˙òĤ”Ĵ¤¤ —ħô˙÷˙ôŞŸšž˙ûŝù˙˙ĝ˙˙è²˘”&Ħö˙úŭ˙ú•¤İ#–ŻÁ˙­”Ĥœ›ĠüÉĦž!™ĦÎ˙ó˙˙˙˙˙˙˙˙˙˙íı™£­ ›ĤÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙í˙ù˙£¤¨›—ĞÑô˙˙ŭ˙ŝû˙ĝ–§˜˙÷˙˙ħĦ œŞšÜñ˙˙ŭü˙˙˙ŭĝ˙˙÷̘ı˙˙˙ŝ˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ò˙˙ġÉüĦ" ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŬŜ˙˙ŝ˙˙˙˙˙˙˙˙ Ĵ¤ö˙ŝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙û˙¨û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñܲè˙˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙áüĝ˘ÉÍÍÔûĝ˙÷˙ÒÊİÈŜú˙ġ˙˙ŭŭ˙˙òĤ%Ñ·ô˙½ÑÓû˙öŭ˙óŭÇÂô˙˙ĝÜ÷˙úŭ˙ŭ˙˙üêà˙ġÓ˙˙ŭùúû˙˙ôí˙˙˙ŝ˙˙Ĉö˙˙˙˙˙˙˙˙˙˙˙“§òú˙ÎÈÖ÷˙ùü˙˙–ûñ˙ûù˙˙îûèî˙Ñі&ò˙-˘ŭù˙˙÷˙ŝÎÔÛŬà˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïä÷ïÒ˙ĝ˙˙í˙˙ĝ˙Óî˙ĝ˙ĝ˙˙˙ŭû˙˙˙ìû˙˙ëŝ˙˙˙˙ŭ˙û˙ŭ˙ùŝù˙˙ïË˙˙ŬĊ˙˙˙ì˙˙˙ġŭ˙ú˙÷˙˙˙˙˙˙˙˙˙îŜëóìíúòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙ŝ˙×˙˙ŭÄüïàŬċîîŝŭüû˙˙üÏ÷Ò˙˙˙˙ŭ˙ö˙÷îŜÙñ˙òŭ˙˙˙˙˙ŭĝ˙˙üïêñú˙˙˙˙˙ŝ˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ôò˙˙á*úö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭöĝ˙˙˙û˙˙˙˙˙˙˙˙÷óÒŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙á˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙çòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòì˙˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙çòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙üüûòç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġġ˙ŝ˙˙ÈĴ™˙˙˙˙ï˙û˙˙úŝ˙˙ó˙˙öŝ˙óû˙ö˙˙˙ûé˙ù˙˙ŝŭġù˙˙ŝô˙˙ú˙˙˙˙˙ûó˙÷˙˙˙˙ŭ÷˙˙ĝäê˙˙î˙û˙˙˙÷˙÷ûìŝû˙ġŭ˙˙˙ù˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙ŭ˙û˙óü˙èŝ˙ĝŝîó˙ŝ˙ĝ˙ĝ˙ô˙˙÷˙˙˙˙˙ŝôö˙ĝŝò˙˙ñúúû˙îù÷ú˙˙˙˙˙˙˙˙ùú˙÷˙˙áó˙û˙˙˙û˙ŭĝô˙ĝ˙úñŝ˙˙ûŝŝû˙˙˙ì˙˙ùġ˙îùöüŝüóû˙áé˙ü˙Ġ˙ïó˙ôñ÷˙ïŭú˙ŝü˙ŝ˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙ü˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙ŝĉ˙˙˙ĝ˙˙üúû˙˙˙˙ŝ˙ŭôĝ˙˙˙ó˙Í˙üü÷˙˙˙˙öóñü˙˙˙˙˙˙˙úü˙˙ŝùú˙˙˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŭŝ˙ûü”,˙ŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙˙˙˙˙˙˙˙˙ñ˙˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ô˙ŝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙ûŝŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙ŝüŝ˙ûô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙÷ŝ˙ĝ˙ġŭü÷ú˙˙ŭùŝôùô˙˙˙ï˙˙˙ĝġ˙î˙ŝĉ˙ŭÌ˙ĝî˙ŭ˙˙úúŝû˙ŭüŭú˙ùĝ˙ûû˙ùŭ˙ôü˙˙˙˙˙ĝġ˙üû˙ñ˙ŭ˙ŭ˙ŭ˙ó÷ŝ˙˙˙òú÷˙˙˙˙˙˙˙˙˙˙ë˙˙ù˙ŝŭ˙˙ġô˙˙ŝ˙˙ó˙˙˙ñ˙û˙˙˙û˙ö˙˙î˙öî˙˙˙÷˙˙ŝ˙üî˙˙ô˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙ûŝ˙÷ûŝñ˙˙üú˙˙üû˙˙ŝ˙è˙˙˙˙˙ŝ˙˙ŝôĝ˙ö˙ŝ˙ü˙˙˙˙˙˙˙ö˙˙ùò˙ŭ˙˙û˙ŝ˙˙˙˙ŭĝü˙˙ĝüŭû˙ŭ˙˙˙˙˙˙˙˙˙úŭ˙˙ü÷÷û˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙ùŝ˙˙ìó˙ûüŭŭŭ˙˙˙˙ĝ˙˙˙ü˙üŭü˙ì˙˙ü˙˙ġŝöŭ˙öù˙˙üü˙˙˙ü˙˙û˙˙˙ŝóŭüü˙˙˙üö˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ò˙Ċ, Ŭŭ˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝŭŭ˙˙˙˙˙˙˙˙˙˙ġ˙ĝ˙˙ŭ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝ˙ò˙úü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙ĝôŝ˙˙ŝ˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙üüüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûù˙î˙˙Ŝ˙÷˙ġ˙˙ü˙ó˙ú÷˙˙˙ĝù˙ŝ˙ñŝü˙÷˙ù˙˙û˙˙˙˙ùñŝüü˙˙ŭ˙úü˙˙˙˙ú˙˙˙˙ü˙ü˙˙ûú˙ù˙˙˙û˙˙ö˙ö˙˙ù˙˙˙˙˙ŝ˙˙û˙ô˙˙˙˙˙˙˙˙˙ü˙öê˙˙òŝġ˙û˙ûì˙˙˙ú˙í˙˙˙ö˙ú˙ö˙˙û˙ü˙ò˙˙óö˙˙ŭ÷ùûùü˙ŝü˙ó˙óŝû˙˙˙˙˙˙˙˙ú˙˙˙˙ü˙˙˙˙˙ú˙˙ü˙˙ú˙˙ĝùŭóúŝ˙˙˙˙˙˙˙˙óüŭŝç˙ŝùí˙ŭ˙ú˙˙˙ŭï˙ü˙úóüŝü˙˙ö˙÷˙˙˙˙ĝü˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙ŭŝü˙˙˙úü˙˙˙˙˙ŭùö˙úŭ˙ŝ˙˙˙ùŭ˙˙ùúñŝ˙ĝ˙ŭü˙ŝ˙ŭüŭ˙˙ŭŭŝ˙˙ŝüûü˙˙˙˙˙ŭüŭ˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ĝŝ˙Ħ)™Üù˙˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙ŝú˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙ŝüŭŝŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙öé˙÷˙˙˙ŭö˙ù˙˙˙óûó˙ŝü˙˙˙ñ˙˙˙ö˙˙ŭ˙÷ö˙˙ç˙˙ô˙üûüòû˙˙˙÷ü˙ŭúŝŝĝ÷˙˙ŝŝùû˙˙ûóöŝû˙ùŝ˙˙˙˙î˙÷ŭ÷ûŝĝüó˙üû˙˙˙˙˙˙˙˙ù˙˙˙û÷˙˙˙ó˙˙˙˙˙ò˙˙˙÷˙÷ŝôŝ÷˙û˙úôöġü˙ŝ˙˙ŭŭ˙ġŭ˙˙˙˙˙÷˙ŭĝ˙˙û˙˙˙˙˙˙˙˙˙ĝ˙ó˙˙ô˙úó˙˙ŭ˙˙úġ˙ó˙˙ù˙˙ŝŝ˙˙ûŭ˙˙üŭŭĝ˙ù˙ŝ˙˙˙û˙ŭŭô˙ù˙ŝ˙˙˙ŝŭ˙˙ù˙ŝ˙ôûüò˙˙üüŭ˙˙˙˙˙˙˙˙˙ŭŝŭüŝ˙˙üŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ŝŝüŭ˙˙˙˙˙˙˙˙üòú˙ġ˙ùŭ÷÷˙˙ü˙˙˙˙ûûġüŝ˙˙˙˙ûû˙ü˙˙˙ûú˙˙ĝúûúùû˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙üĝ˙›Î˙ó˙ŝ˙ü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙ùŝû˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùûŭ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝü˙˙ŭû˙˙ŝ˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙ŭŭ˙ŝûúŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭ˙ù˙öüġ˙üö˙ñ˙ô˙˙˙ĝ˙˙˙˙ûġ˙ŝ˙ñù˙öö˙ŭ˙˙ĝö˙÷ü˙ĝ˙˙˙˙úŝŝù˙˙˙˙ŝ˙˙ŭŝŝŭû˙˙ŝñĝ˙˙˙˙˙˙ó˙üŝ˙˙ú˙˙˙˙˙˙˙üó˙˙˙˙˙˙˙˙˙˙˙üġ˙÷˙˙ĝ˙ġŝĝòúú˙˙ġ÷˙˙ú˙˙˙˙úû˙˙˙˙˙ŝ˙˙ö˙òû˙˙úŝĝĝ˙˙˙ĝû˙˙úġ˙˙˙˙˙˙˙˙˙˙üŭùû˙˙˙˙˙úû˙˙˙˙üû˙ŝ˙˙û˙˙˙ûû˙ŝùûŭ˙˙˙˙ñö˙˙˙ĝ˙˙˙˙ĝ˙ó˙ú˙˙ö˙ô˙˙üò˙˙˙˙˙˙ûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙óú˙˙˙˙˙˙ŝüûûŭ˙˙˙˙˙˙óŭ˙˙üù˙÷ûŭ÷˙˙˙˙ŝ˙˙˙˙˙ûü˙˙˙˙˙˙˙ûô˙˙˙˙˙ŝù÷˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙úŭĝ˙˙ĝ˙˙˙ċ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙ŭû˙˙˙˙˙˙˙˙ùö˙ĝ˙ü˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝö˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ùŝ˙ûû˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ñ˙ù˙˙˙˙ŝ˙ŭ˙î˙˙ŭŝŭ˙ŭŝŭ˙í˙ĝ˙ŭù˙ġ˙ŝö˙˙ŭŝ˙ŭ˙˙ûû˙ûô˙˙˙˙ŭ˙öù˙ŝŭŭŭ˙û˙üûŭŭ˙˙˙˙ùŝĝ˙ú˙úù˙ü˙ŭ˙ġ˙û˙ú˙˙ù˙ŝ˙˙˙˙˙˙˙˙˙˙ùú˙ûö˙ġ˙ù˙˙ĝû˙˙˙˙ŭüú˙úù˙ġ˙ĝŭŝô˙ó˙ŭ˙˙˙˙úŭ˙ŭ˙˙úû÷˙˙ŝú˙û˙˙˙˙˙˙˙˙˙ġ˙˙ú˙ĝŝ˙ú˙˙ŝüŭùô˙˙ü˙ġ˙ü˙ŭ˙˙˙˙˙˙˙˙ûŝ˙ŭù˙˙˙ûŝ˙˙˙ŭ˙ö˙˙˙ŝùü˙ü˙˙üü˙÷û˙÷ŝ˙˙˙ŝ˙˙˙˙˙˙˙˙ŝúû˙˙ŝŝ˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ü˙˙÷˙˙˙öûŝ˙˙ŝŝ˙˙˙ùĝ˙ŝ˙˙ü˙˙í˙˙˙ĝ˙ŝ˙÷˙˙ô˙ĝ˙ûùŭ˙ŭŝ˙˙˙˙ŭüŭ˙˙ŭûúü˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙÷˙ôŝÔü÷û˙ŭñ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙ü˙ô˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ùŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òôü˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙üĝüíĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ú˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ë˙˙îŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭ˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙îŭ˙ò˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüŝ˙˙˙˙˙ü˙û˙ĝ˙ü˙÷ĝ˙˙˙÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ŝ˙˙˙ú˙ŭ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙íŭ˙ú˙ú˙˙ó˙˙û˙˙˙˙˙˙˙˙˙˙ŝ˙ó˙˙ü˙ô˙˙òö˙˙˙ŝ˙˙ŝĝü˙˙ë˙˙ùû˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭúŭ˙˙ù˙˙˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŭ˙˙ĝ˙ŝ˙è˙˙ŝġ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ŝ÷˙˙ûû˙Ëŝ˙úö˙ŭ˙˙ŝ˙˙˙˙˙ìü˙˙ò˙˙˙ûĝ˙ü˙ù˙˙ŝ˙˙˙˙ŝ˙˙ûó˙ö˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝü˙ŝü˙÷˙˙ġù˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙˙ô˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö÷˙ü˙˙ú˙˙˙ŝ÷˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙žŝ˙˙˙˙˙˙˙˙˙öú˙“İ—˙˙˙˙ûŝ˙ŝ˙úó˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝüüŝ˙˙ŝ˙˙˙ĝ˙˙˙˙˙ûôĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûúûüñ˙ŝŝŭç˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ó˙˙ŝ˙ï˙ĝô˙ò˙˙˙˙˙˙˙˙˙˙ĝŝû˙˙ç˙Ñú˙÷û˙˙˙÷˙˙ûù˙˙˙ŭ˙˙ĉ˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷˙˙È˙üñ˙ċó˙˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙îŝ˙ú÷í˙ûî˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ô˙÷üù˙ö˙ŭ˙ë˙˙ö˙˙˙˙˙úúŝù˙˙úî˙ïüÀĴ˙˙ĝ˙ŝ˙˙˙˙ŝûúûüô˙˙òŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙˙˙ŭü˙˙˙÷˙ü˙ĝċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙ù˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŭ˙ì׭ΚĠëù˙óŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙•%Ĝ˙˙˙˙˙˙˙˙÷˙ħ #$)üġû˙˙˙˙ŝö˙˙ĝú÷ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ûúŝ˙÷˙˙í˙˙˙ŭó÷ö˙˙úù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙üû˙˙˙˙û˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙÷ùŝûù˙˙˙˙˙˙ĝù˙˙˙˙˙˙˙˙˙òú˙ĝ˙˙üù˙ĝ˙ôé˙öó˙˙˙óù˙˙ñ˙ô˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ĝ˙ï÷ßĈ£ĥ˙û˙˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙û˙˙˙Î˙˙úí˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ëòâ˙ĊĤĴŒ×˙ì˙ŭ˙ŭ˙˙˙úü˙û˙ì˙˙˙İ!˜˙ŝ˙˙ôŭ˙˙üû˙˙˙÷˙ğ˙ó˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïû˙˙ŭĝÏ&ŝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ŭŝê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙í¸%è˙ġ˙ĝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ$Î˙˙˙˙˙˙˙˙ù˙‹+ šûö˙˙˙˙ŝ˙ĝú˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙û˙˙÷û˙˙˙ŭ˙ûŝù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙û˙˙˙ġş¤™œß˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙ÂŻĤ£è˙˙ó˙ŭŭ˙˙˙˙˙˙˙˙ŝù˙˙ġ™˜ž£Ñŭ˙˙˙˙ĝ÷ü˙˙ú×·Ùú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óö˙›³ ˙úûö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙é†ħĦ›û˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—žù˙˙ŭ˙˙˙˙˙˙˙˙ŭú˙ŭœ ˙ñô˙˙ú˙˙û˙˙˙ġß,Ñó˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ġ˙ċ'$”˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭüûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙½˙£ "Ëĝ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝöÌ  Î˙˙˙˙˙˙˙˙˙üÑ* #˙ġú˙˙û˙˙˙ï˙ñġü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙˙˙ûôš+(—ÇÎٙÇ˙öĝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙û˙˙×.%ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝÍ$ ³ûġ˙ú˙˙˙˙˙˙˙˙˙˙ú˙ùö˙),ÑúÉò˙˙öü˙˙÷–ûúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙á˙˙š" ĵ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙ûĴ­Ççġ˙üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙Ş #!¨ûöù˙˙˙˙ùû˙˙ġ˙ôû˙À&%˙˙˙òĝŝ˙˙û˙˙× 3 ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ù˙ü”  0˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ôĝ˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝö˙˙Ï"×ù˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙§Î˙˙˙˙˙˙˙˙˙˙ŝ(˙û˙˙ŭú˙˙˙˙˙˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŝ˙˙ôé&!")Äö˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙˙ñÛ %Ôü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ö˙0!$ !˙˙˙ùŭú˙˙˙˙˙˙˙˙˙˙ĝŭû À˙˙ùŭ˙˙˙ġù˙ħ)˙˙üî˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙+Ġ˙˙ù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝî4  òġĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû¤%–˙˙˙öŭ˙˙ü˙˙˙ŝ˙˙ŭĝâ Ëġ˙ġ˙˙˙ŝŝ˙˙ñÛ*˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ü˙˙ò—#"˜² *‡˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭ˙ô˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭŭġ˙Ô˙˙ì˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ó 5Ò˙˙˙˙˙˙˙˙ñ˙ô˙'( ˙ŭ˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûŭ˙˙ĝò!1 &ıù˙ŭó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙˙˙ù²#)êì˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû" !öû˙˙ġü˙˙˙˙˙˙˙˙úñ˙˙úĦ"'Ëöġ˙˙˙÷˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ôĠ* ˙ôúü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñù˙ñÈ,Í˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÌ*­˙Ë˙Ì˙˙í˙˙ŭ˙ûŝ˙˙öù˙ô˙ü˙ôĝ¤2ì˙˙ñ÷˙ŭŭ˙˙˙˙ù—#Ġ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷˙˙ú£"œ˙ùĊŬÁ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ĉ²üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùü˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ġġ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙‘  Ż˙˙˙˙˙˙˙˙˙˙öü ˙ŭ˙ŝü˙˙î˜ĵ "ì˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭŝ˙˙˙˙›ö˙ô˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝü˙˙ʛ" û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙üŬî˙öŭü˙ŭ˙˙˙˙˙˙˙˙˙ü˙ê˙˙ $Î˙˙˙ü˙ó˙˙î˙˙üž#˙í˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙úËŸ˙÷˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙Î˙û˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙É Ìù˙˙ĝ˙˙ûû˙˙˙úŭ˙öÖÙö˙ġ˙ġ˙܋(˙û˙˙ŭ˙˙ŝ˙ŝü˙˙ŝĠÌ˙˙ö˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝÙĝİ àġû˙˙ġŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙È# Ê˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïîôŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ù˙˙È•˙˙ó˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ó Ë˙˙˙˙˙˙˙˙˙ö˙˙!Ò˙˙˙ûü˙úÚ *û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ë˙˙˙˙˙ü˙˙òŝ˙˙ûŭ˙ŝ˙˙˙˙ñ˙˙ù˙˙˙ŭ˙ú˙˙ŭĝ˙ù˙˙ö˙˙ï˙˙ü˙ù˙ö˙˙ŭ˙ñ˙˙ü˙˙˙÷ġ˙˙ĝ˙˙˙˙˙ûĝ˙ôŭ˙ó˙˙ŝüü˙ûú˙÷ú˙ô˙˙˙ù˙ŝ˙òù˙˙ŭġ˙˙ü˙ġ˙˙ĝû˙˙ú˙˙˙ŭŝ˙˙ü˙˙˙˙˙ĉ˙˙˙öü˙ġ˙ġ˙ŝùü˙ó˙û˙ûë˙ûû˙˙˙ò˙“˙ŝŭ˙ġ˙˙ġ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÍ˙˙ù˙˙ŭ˙ŝû˙ùó˙˙÷˙˙ó˙ñŝ˙ö˙˙û˙÷˙ùĝ˙˙Ĝ–˙ùü˙ĝ˙úĝ$§Äŝ˙˙ŭ˙ñ˙˙ö˙ñ˙óŭ˙˙˙ù˙ë˙˙ñ˙ù˙˙˙˙˙˙˙˙ú˙˙î˙˙é˙˙˙ú÷ûŝ˙˙˙ô˙˙ò˙˙òĝ˙ŭñŝ˙ŭŭ˙ñŭĝ˙ü˙ŭŭ˙û˙÷˙˙÷˙ûû˙ûñ˙úŝ˙˙ŭú˙˙˘ï˙ûûŝ˙û˙˙öĝ˙ŝĞ#ôû˙ùù˙˙ġ˙÷ŭ˙˙˙˙ï˙üùû˙÷˙˙˙ò˙ú˙ù˙˙ïŭ˙÷ö˙˙˙˙úúŝĝ˙˙ŭŝ˙úŭû˙ŝ˙ñ˙–˙˙ó˙˙úü˙ŭĝ˙˙ŭ˙˙˙ö˙÷ŝ˙ĝ˙ŝüû˙û˙ûû˙˙üŭŝ˙÷÷˙ò˙ö˙˙ġû˙ù˙˙¨Ú÷÷˙˙÷˙ŭ˙˙˙˙˙˙˙÷ö˙ŭ˙ù˙ú˙˙ùü˙ó˙˙ž˙˙˙˙˙˙˙˙˙˙úŝ˙ùĝ  Ş˙È˙˙˙˙Ĵ %ĝ˙˙û˙ú˙ú˙˙ĝ˙˙ú˙˙ù˙úĝ˙ó˙˙˙ŝŝ÷˙˙˙˙˙ŝ˙˙ö˙˙ö˙Óŝ˙ñ˙˙ñú˙ìŝŭü˙û˙ĝ˙üú˙˙ùô˙ò˙˙ù˙ĝ˙ŭî˙ë˙˙ù˙œ˙˙ö˙û˙˙÷˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ġ˙Îġ˙˙˙ç˙˙ĝ˙ŝû˙˙˙˙˙˙˙˙˙öû˙˙ü˙˙˙ù˙˙˙ŭñ˙ü˙˙ŭ˙û˙ŭŭò˙˙ú˙üûû˙ŭŝ˙ŝ˙ù˙ĝü˙ò˙˙üĝú˙˙˙˙î˙˙˙˙ĝĝŭ˙ûĝ˙˙óú˙ĝ˙ü˙û˙ġ˙˙˙ŭ˙˙ÓË˙˙Ĉ˙˙ö˙˙÷˙úŭô˙˙÷˙˙ŝ˙ġ˙˘ ĤĤ‘Ż™Ñĝúĝ˙ï˙Ï÷˙˙ü÷ù˙ )˙÷˙ù˙üĝ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝö˙˙˙÷ĝú˙ñ˙˙˙ŭ˙˙ú˙˙˙óŭ˙˙ô˙ûġ˙ì˙ŭ˙˙ùĝĝ˙˙˙öö˙ŭ˙ü˙ö˙ò˙˙îŝü˙ŝ˙öû˙÷ŝŭ˙˙ŭù˙˙èñ˙ŭü˙ü˙ŭù˙ûûĝ˙ŝ˙ġ˙˙˙ŭġ˙ûûĝ˙ó˙ŭ˙˙ôù˙˙âüúġ˙ü˙ŝûŭô˙óüĝ˙˙ĝ˙˙˙ïñ˙û˙˙˙˙˙˙˙ûŭġ÷˙˙ŝüí˙˙˙ġ˙˙ŝ˙˙ûġû˙(˙ü˙˙÷˙˙ŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÚûŭ˙˙üûó˙ŝĝ˙˙ï˙˙ĝ˙˙ŝ˙˙˙ö˙úûú˙ĝ˙˙ëÄï˙ù˙˙î˙˙!Ÿ˙É˙˙ŝ÷˙ô˙˙˙ù˙üüó˙ùü˙ġú˙ñ˙˙˙˙˙˙˙˙˙˙òö˙˙î˙ĝö˙ü˙˙˙ôŭ˙˙ŝ˙üñ˙ùúû˙ö˙ŭ˙˙ŝ˙˙üóó˙˙ö˙á˙ûï˙ö˙ġò˙˙˙ŭ÷ŭû˙˙˙˙š Ĥ˙ħ˙˙ŭùġ˙ò˙˙ġ˙²-ž˙ñ˙ú˙˙î˙˙˙é˙˙û˙˙ïŭ˙˙˙˙ïä˙˙˙ù˙ü÷í˙˙ûù˙òŝŝĝ˙˙ù˙˙ô˙˙ĝġ˙˙÷˙û˙ô+˙ŭ˙˙˙ŝ˙ü÷˙˙ù˙ó÷ĝ˙ü˙ùó˙ŭ˙ù˙ì˙˙˙˙ŝñ˙ôù˙˙ö˙˙ùŭñ˙˙˙÷˙ó$§ĝ˙˙îŭ˙˙˙˙ûû˙ŝùûù˙˙îÎ˙ù˙ûŝ˙ôó˙ó˙— ˙˙ï˙˙˙˙˙˙˙˙˙˙ú˙³(ú˙˙ôû˙Œ.!ĵĜí˙û˙î˙ĝû˙˙ó˙ĝ˙öù˙˙˙ò˙˙ö˙˙ĝ÷˙íĝ˙úŭ˙˙˙˙Ġ,ĦÁ˙ò˙˙ì˙ÑÚ˙˙˙˙ĝ˙˙÷˙˙˙ŭú˙˙ú˙›ĊĞ˙˙ô˙ŝù˙÷ŝí* —˙î˙ë˙˙˙˙ġñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙ô˙ù˙˙üñ˙ûŭ˙˙˙˙˙˙˙˙˙í˙˙ìŝ˙ó˙ï˙ĝĝġ˙˙˙˙è˙ûóâÈÖ×·À˙÷û˙˙˙ñ˙—ÎóÏßÇĤË˙ĝö˙ÏċžÂÊġĝ˙ë˙î˙÷˙˙ĊÂÑĉċü˙˙ŭ˙˙˙ż²Îóġ˙ÍŻñŭ˙˙)ĝ˙úͧšġ˙û˙ñ˙Ìä‰Í˙ó˙ô˙ġ#&" ( É˙˙˙˙˙Ÿ á˙˙úûŜ¤ŜĊ&Ò˙˙÷˙˙ûûŝŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙û˙˙˙˙˙é˙˙ïï˙ĝĝĝ˙ñ˙ù˙ò˙˙ŝ˙ë˙ñ˙ô˙˙ñì÷˙ŝ˙ï÷˙÷˙ŭ˙ìô˙˙ĝŝ˙˙˙˙˙˙˙˙û÷÷˙˙˙˙˙˙ŝô˙úö˙û˙˙÷˙˙ñöú˙˙ġ˙˙ü˙˙˙ôŭ˙˙˙ó˙˙˙é˙˙˙ú˙˙ùü˙˙˙˙˙˙˙˙˙üùŭô˙˙˙˙÷éŝ˙óúĝü˙˙˙˙ùŭ˙˙˙˙ö˙˙ïûóü˙˙˙Ì ùúôü˙˙ü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÔ&"ù˙˙÷ñ˙ü˙ùĝüûû˙÷ú˙˙éúóĝö˙˙˙ŝ˙ĝ˙/Ÿ˙˙î˙˙ĝñž*£ç˙û˙÷˙ŝ˙˙é˙ŭġù˙ŝ˙ŝ˙ó˙˙ú˙û˙˙˙˙˙˙˙˙û÷˙ġû˙û˙ö˙˙ïûŝŝ˙û˙˙ŭ˙˙˙˙˙ŝò˙ŝ˙ŭû˙˙ôòù˙˙˙ŝü˙˙˙˙ġŝ˙ŭ˙˙˙˙ë˙˙˙˙˙òê˙& ĝ˙˙óŭ˙˙÷˙î˙˙ï˙àì˙ë˙ŭë˙˙ĝü˙˙ŝ˙ŭġ˙˙˙ŝġ˙˙˙˙ŝï˙ò˙˙ŭ˙˙÷˙˙÷˙ŭó÷÷˙˙üûü˙ö˙ĝ˙˙˙˙ŭì˜%˜Èú˙ïó˙˙˙ġ˙ù˙˙˙˙ü˙ú˙˙˙ì˙˙ŝï˙ôü˙˙˙˙˙˙˙˙ŝú˙û˙ŝñĝ˙Ó˙Âŭ˙ú˙˙òŝ˙˙ûŭ˙˙ü˙˙úû˙÷˙üò˙˙ûŭ˙ó˙ñŻ'ù˙˙˙˙˙˙˙˙˙˙˙ñŝ˙ §£Ğö÷˙˙˙Ğġ˙ġ˙ĝ˙î˙ŝġ˙˙˙è˙˙úù˙˙÷˙ó˙Ëœ˙ĝ˙ŝ˙ó˙ü˙î˙ġ˙¤£˙û˙ó˙˙Ä˙˙ċ˙œ!™˙é˙ô˙ù˙öúÌ #( Ħŭĝè˙˙ó˙!#˜-˙˙ó˙˙ŝ˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú™ ›œžÎ˙˙ó˙÷˙˙˙˙˙˙˙˙˙ìĝÒ˙Ä$ ˙˙×Ğĝïĝ˙˙À Á˙˙ċ˙-ž" (Ċ˙˙™$°˙öù˙˙ġô˙“%#Ĵó˙˙öŸ -•˙Ĵ ´˙è˙+›ìŸ #­˙ĝ˙‘ #–˙˙û˙˙!¨#úù˙˙ŭü½˙è˙ß šú˙Ġ .˙˙î˙úŭû˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ûùŝ˙ŝŝ˙ïŭ˙˙ñ˙˙˙˙˙˙˙˙ŝù˙ë˙˙÷ï˙˙˙ŭ˙˙üü˙˙˙÷ż˙˙˙˙üŝû˙˙úöüûùŭġ˙˙ŝ˙êö˙˙÷˙˙îö˙î˙ú˙ĝÙ˙˙ġ˙Ü˙ó˙˙÷˙ù˙˙û˙ïĝŝ˙˙ùú˙üò˙˙˙ê˙´˙˙ò˙ö˙á˙˙ò˙î˙˙ì˙˙˙óé˙˙˙˙Ġŝû˙÷ùúó˙ŝñŭùö˙˙˙ò˙ü˙ü˙˙îŝ*˙ú˙í˙˙í˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝÇÇó˙˙˙˙ûùù˙˙˙üï˙˙ŭü˙˙˙˙˙˙ò˙ġ˙ô˙˙—˙û˙÷˙˙˙" ˙Ç˙ì˙˙ŭúĝ˙ĝ˙ŭ˙ŝò˙ôûġ˙ùï˙˙˙˙˙˙˙˙˙˙˙û˙ú˙÷˙˙ö˙ĝŝú˙ŝ÷ŝŝ˙˙ù˙ġûüĉ˙ĝú˙À˙üú˙˙ŝ˙úüĝû˙í˙˙˙óò˙İĦî˙˙˙ĝ˙˙˙˙˙˙ޤ˙˙ê˙üù˙˙˙÷˙ĝ˙ë!Ç÷˙˙ŝüŝ˙ŭŭ÷˙ù˙÷˙˜ ŸÑ˙íü˙˙˙ô˙˙˙ĝŝîù˙ö˙ó˙˙˙˙˙ŭî˙˙˙ûÍŝĠĴ‘ŭöġ˙ŻŬÂ£ŞŞ›˙ûô˙ŝù˙ëú“ĥÈ˙ô˙˙ëù˙Ôû¤ĤœŻ‡×òŝ˙ò˙ŭ˙˙ö˙˙ü˙ŭà$š˙úê˙ġ˙úŝ˙˙˙˙˙˙÷ò˙뛊ݝüú˙˙ü˙ĵ$ÏĈÂ˙˙˙˙˙˙˙˙óúÜ ' ˙˙˙û$ ’¨ÍË ċ˙î˙ŭüù˙µŸ£Íöùŭöô˙2ŭ÷ŭ˙ïŭ˙÷˙ە1˙ŭ˙ŝü¨–—ÚӚï˙ŭó˙˙ښ/ ¨+ &Ĝ˙˙˙ö™(ì˙óĝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙› .$$Ñú˙˙˙˙˙˙˙˙˙˙˙˙˙# %, ˙ûĝÄ$Ì˙'" óú˙Ì&% "Ŭ˜˙˙˙ŝ˙á)' '–˙˙ñŻ! !˙ü̧›˙Ĥ ˙˙˙² İ˙ž ­˙È÷˙˙%Ç˙ö˙Ĥ"ü˙ġŝġŞ™˙˙˙¤%ŸŞ"+˘¨ ˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ġ˙˙ü˙ô÷˙úÌ´Œàó˙Çú˙˙ì˙ô˙˙ŭ˙˙˙ÑÎñ˙è˙˙ì˙ôĝ˙˙ŝö˙ó˙˙ö˙Ċš˙ĝ˙˙ô˙˙ĝ˙˙˙û˙˙˙˙ûö˙ŭ˙ġ˙˙Ä˙ó˙˙÷úú˙öí˙ïŝ˙úñ˙˙˙ċ˙˙˙ĝ˙úÑ÷˙Ó˙˙˙ĝúûÔŝÂ˙˙ëü˙ŝŝŭü˙ŭûü˙ê˙ûûôŝ˙ïŝ˙˙ŝ˙ÍŜÓÒ˙òÙÉÇÚÚôü˙˙˙Ù$żŬĠù÷˙ŝŭô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙Ğ Ĥ˙ġñġúúÍ×ĠöößĊċşÉÎ˙ĝ÷ĝ˙˙˙˙ú˙û˙)-$ ˙úüó˘ړ Ä˙ŝŭ˙üĝÏ×%(›˙˙˙˙˙˙˙˙˙˙˙ġŭôŬÒ ĴòË"" ÑËòŝ˙ġ˙˙˙#˙ÈĠ˙˙ö˙üÈÖ÷ŝ˙ġ˙óò˙£( ËŜÉċÇĈ˙÷ë&ô!Ï˙í˙û˙ߣ˙Ÿĵîŝ˙ù˙˙ëœ,+ĦÖï˙˙Ÿ ž˙ñ˙ԕĤê˙í˙ײ‹˙ú ˙ġјŭ£ ˙˙÷ô˙˙Ĥ&Ż˙˙˙˙îÒ  ˙˙˙˙˙˙ıÓĊġ˙˙˙ò˙ŝ˙˙ŝôĝ˙˙˙"Ğŭîü˙â "!˙˙˙˙˙˙˙˙˙˙ ˙˙ġ˙$ !¤Ċ˙$!è˙˙˙˙˘š˙˙ú˙ŝ§Ş ˙˙ġ˙˙ò˙˙ĝ ¨˙ŝû˙”$¤÷Ó£(˙ŝ˙˙ñ–!˙ŝܚÂôŭ˙ž"àġï˙˙ï˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙,È #Ħŝġô˙˙˙˙˙˙˙˙˙˙˙Ħ 2 ˙˙è$Íë˙ö˜­÷÷Ĵ ŸŜ”,#"›*$&½úöŭù#šÌĠ(ô˙˙ġ& #Î˙Ñ˙šĞŞÓ˙˙˙ŝ˙ÚÊÉ˙œğ˙˙˙ò Ò˙˙ë˙˜" ù˙ŝ  Íó˙Ú #+О(ĉûŝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝ˙˙ç˙˙˙ġ˙( #!öù˙˙ŝû˙ú˙ùĠ˙äŬû ¤˙û˙ŝí˙˙öü÷¨°”İžœ$Ÿ˙ŝĵİЁŻèûŭ˙˙˙ëϤ İ•Ĵ%š¤¨ü˙ù˙Àĥ’³›Ò˙üċ˙ċğ£›ÌžŸž˘¤˙ġ˙­”£ ­ŝŝŝ˙è˙˙˙ʝާ¤Ğ˙ôòÑŝŸ ™Ù #˙˙˙ûù %˙ĝü˙ú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŭ£*½˙˙˙˙ŭ›' “-!$Ĵì˙˙ûŭü˙˙˙î˙ö¤  ˙ŝ˙˙  Ì˙ŝù˙ŝÌ% - £÷˙˙˙˙˙˙˙˙ĝ˙˙Ġ!%/ Ħ˙ú˙ùĝ÷ž+! #Ħü˙û…*˙ġ˙ĝ˙˙"£Ÿ ²û˙˙Ħ˘œ#( Ë˙˙ñŭ˘ Ż$Ú˙ĝúì˙š! #Ċ˙ŭ˙+ùò˙&Ħġ˙Ç '—˙.ġ˙Ç"!üÓžö˙ŝ˙„­Ê˘( šç˙˙˙!ݧó÷˙ôĤ,0 ¨"Ğüú˙ġì˙˙˙ûŝŝû˙˙ŝ/š–â ˙ùíΙ(Ş˘ ˙˙˙˙˙˙˙˙˙òÔ "”£Ŝĝ˙ü˙û˙˙é™ ŞŭÌġ÷µ2$˙ŭ˙ĉĴ£ŝù­2íĝüò˙˙˙ŭó×'¤ĝ˙ü¨ !˙˙ŝÎ$ ˙˙ïĴ+*ŝòúò˙) ú˙ó˙ޏÑï˙û˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ $ŭ˙Ê' *û˙˙ĝ˙˙˙˙˙˙˙˙˙èš´)Ĵúŭ˙ó˙˙˙Ġ$ Ğé˙ŭ% Ï˙ĠŜĦ#ú˙ŭö" Ŝô˙˙ŭ%Ħü˙ú! ˙˙˙ûÁ % ˜Û$×˙ŭ˙œ˙Ê1ñ˙˙öĝ˙˙%Ë˙ù˙ĵĜô˙ìœ!!˙÷˙˙˙È/ħîú˙ Ë˙˙Î( §£~µĜ˘¨˘˙˙˙˙íù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öâüĤĈÔÌö­›Ê˙Ŭ–#›Ÿ&"˘ #Âŝ˙˙í˙˙  0 ûû '$×˙òí˙è+*( ˙ïŝÂ#  ”ü˙ü˙  * Ŭ)&‰Ïù˙ò˙ŝ&ښú˙öŸ .˜—'Îôï˙ú% "5’+˙˙üû˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĈĜóüüôÈ$( ¨È 5èü˙˙ŭŝŝ˙˙÷ŭÒ'8$šœŝ˙ĝ˙#ĦĊ˙À˙˙˙Ċ˘˙Ğ"(÷˙˙˙˙˙˙˙˙˙˙úŸ  'ÈÉ˙ê˙˙-Ĵĝȝ'ĥ,%$ğ˙ü˙˙˙ôĦ , 1ĝ˙˘˙ï˙ ,˙î˙ûžċÎ+”˙˙˙—'&Áä- ÌŭÈ %˙˙˙˙›Ÿ˙ĝŸ)  §˙ŝÜ(É˙ìÑ Ÿ˙ù˙ü#!·ġ˙Ä '˙ê³íô˙"'ġû˙£%ğ˙˙ӛ˙ŭó˙˙û˙˙ŭû˙˙˙ì˙˙ù˙+ ˙˙ú˘%,÷˙û˙˙˙˙˙˙˙˙˙˙òâžÖúŝû˙ŭ•˙˙Ĝ˙Ï˙ŭ˙˙é£ Ôûü˙ıú˙ô÷#"ò˙ü˙ŝñŝú˙îĦ!#ú˙ú˙˙ (!íŭ˙ŝ Äŭ˙  Œ˙÷˙˙˙, ˙˙ġŭ $Ò˙ĝŝû÷˙˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙%#˜ĝŭÛ !˙ïġ˙˙˙˙˙˙˙˙˙ú˙ö˙(ŝżŞ÷Í%  –˙Ŝìİ )&Ĉ˙ïò£"Ġûŝ˙Ÿ˙ġú˙ÌÎÔ˙˙˙Ï%ġî˙˙˙×ÊûÎÊü÷˙òĤ ˙˟ÎÂ˙ŝö˙˙˙˙˙É˙ĝ˙÷Ş Şì˙ä˙Ŝšï˙ŭñ˙÷–˙ü˙)˙ŭ˙ğ" #˙˙˙ġŭ˙˙ëùìó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ü˙úÏ #Îü˙˙ΨĝÁ&–˙Ğ# *È˙è˙úÔ/Ï˙ù˙Ó÷˙"²üǜ Żò˙˙˙ÏĜĤ™$Ċĝŭ˙Ĥ!ĝ˙#§˙ô˙ĝ¤!¤˘% !˜£˙ú˙ġĠ! #Şô£ŭö˙Ê£Ê˙ûË# ĝ˙ŭ˙û ˙ó˙˙ĝ˙÷˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙Ĝ˙˙˙ö˙˙ ˘Ô˙ú˘˙˙˙ùû˙ġ˙ó˙ü˙­Ğġ˙˙˙˙˙ôŻĦû˙öÒ# $—Îŝû *ÍÌ)& ˙˙˙˙˙˙˙˙˙ö˙ŝ˙ û˙ô¨#¨ó˙éĞ—üÑÏ˘˜˙ǝ#İĝĜĝĤ#Ñ÷Ĝ˙É$ ˙‡˙ûĝÛ %Éŭ˙ô˙ ü˙ŭ˙˙˙˙É Ùé§)Îì˙í˙§£˙˙˙' š˙ûÏΤ˙ô˙ŝ£İüŭ˙œ!Â˙˙ú°ç˙ĝĦġÔ˙ÏΠù˙""ß˙˙é#”˙˙ö+˙˙ÈúŜ™˙÷˙˙ûŝù˙˙ĝ˙˙è²" ³üû˙ŭ¤ žġ˙˙Ĥ÷˙˙˙˙˙˙˙˙˙˙úŭ˙í(Ôöàĝ˙ù˙מŜöġ˙Ë&”˙ù˙˙ËÙĝ˙öŒ"¤Ì˙ÌÓÂ˙˙úŭû˙ù˙˙˙Ï+™˙Ëô˙úİ ˙ġ˙˙ *˙ñ!&ú˙˙úö˙÷˙˙£˙ô˙˙˙ŭ˙öú˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÂĦ×ú˙ŭĝóàĝ˙˙˙˙˙˙˙˙˙˙ĝ˙ùÒİġ˙˙˙½˙#!š ĴÉ˙˙ï˙Ò£˙ù˙˙Ġ ĵ˙˙ĝ˙Ž&˙ŭ˙˙ŝ÷˙û˙œŝ˙û˙˙À!˙ü˙˙˙˙˙žó˙ŝù˙˙ĝ˙ùû˙ô˙ú˙ 'ž˙ŭ˙˙# ˙ŝ˙˙˙˙  ˙ŭö  Ö˙˙Ê ˙ùü˙ù#Ħüú˙˙˙˙ĝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ìúİ! ˞˘Ĥ Ğö×ü§"È˙˙ĝœ Î˙˙÷ü£Î˙˙ġİ ûÙġû˙' œû˙ûÉÍ˙˙ü§ôÔ˙"Ğñ˙˙˙˙Ħö˙ö˙ÏÉ˙óü˙ù˙" ô˙˙Ê&$ô˙ŭ˙˙Ĥ˙úŝ¤& ˙ĉ˙ġ˙Ò"¤üÑŭŭ˙òú˙ï˙ĝ˙ŭ˙ô˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Îŭ˙˙ô˙ĝ˙ ˙˙ĝ˙Ñ Ÿ÷˙˙˙ĝö˙˙ùüİ˙˙ŝ˙ö˙˙˙Ñ˙˙ŝÑ$˙˙Í" )ù˙˙˙˙˙˙˙˙ŝŝúŝ˙˙¤ŝÏġÑÀÔ˙"! Ú˙Ä#ùÛ˙+Ÿï˙ùü $ë˙˙ġ˙à"Ñ˙ŝù˙ ŝ˙ġŭÙŝ÷ù˙Ÿ#"›ĝĤ˙ŭ˙ù˙Ŝ,ŽÖŭ˙ "Ż˙˙Ġ§˙˙ú˙˜!Í˙˙ü˙ùŭ™ Ġ˙˙ûĞĊ˙˙"˙ŝġ˙ú£( ˙–Ħ˙úö˙ ˙Ùñ˙˙üö°-ñĝ˙˙ö˙û˙÷û˙ŭ­ŝù˙˙ùûÙ & ˙û˙ £öŝ˙˙˙˙˙˙˙˙˙˙˙Ϥ˙ŭŝ˙ó˙˙&•˙ŭ˙÷Ï"Ħ˙ŝŭŝ˙Ôü˙íü˜Ä˙Àĝ˙üù˙˙ñ˙úÑ'š˙˙˙˙˙œ#˙ŭù˙š#£ò˙§˙úò˙˙ġÒ!˙ù˙˘¤˙˙ŭ˙˙ü˙˙óù˙˙ü˙úġ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙ùùĜĦ""˙ŝï˙˙˙˙˙˙˙˙˙û˙ô˙˙  Şŭûû˙ù˙"’˙ó˙ú˙ŭŭï˙üÏ˙Ô!ĦËŭüö˙$Ì˙÷˙ùĴĤûú˙ŭùŝ˙ʰ'' Ñù˙˙ŝĴ"˙˙ŝ˙ŝ˙Ç˙´! ˙˙üü˙˙ĝĝ˙˙ėĞÓÊò˙˙Ëŝ˙˙ü˙ò˙˙"ù˙Ġ ˙˙ô˙ùĦ¤ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üĝ˙˙!! "Ë˙ûû˙  ûŝì˙˙"$Çê˙Îİ ħ÷ñ˙ö­ú˙˙ö˙ûŝ˙˙˙˙Ĝ Íû˙ï£˙˙÷ ¨˙ìŝ˙•' $˙˙˙˙˙“# ùö˙˙$ ´üûöû (ù˙˙§#,)  ˙óüî˙%Òü˙˙– à˙ì˙˙Î ż˙ü˙˙˙˙˙˙ú˙é˙˙ù˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝúÜĤ˙ŭüûŝ˙ìŸ "ù˙˙ò˙˙ŝúì˙ú˙˙˙˙ŝĦ( ˙˙ö˙˙ö˙ù$ ˙ûö˙Û§ùĝĤ2$' %ĤŻ˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙œ*"Îŝŝ˙Ĝ—˙ù˘ 'ŞÊö˙˙˘!˘˙÷Ë %˙˙ú˙—’˙ŭ˙˙÷Á (”ŭûŝ˙ġ,ç˙˙˙"$šŭ˙˙ŝÔ*˙ ûġ˙û˙ó# #!Úó˙"˙ï˙ùĠĝ˙ù˨% !%ùùùŝ˙˙˙%Ìçŭ˙öê˙ŭ Î÷˙ŭó˙ò$ ĝİ"üŭ˙ċ&&£'ö˙ŝ˙ô˙ Ô˙˙˙ì˙˙ù˙˙üžÉ˙Ë˙˙ô˙”ĉ˙÷“"Ħ˙˙˙˙˙˙˙˙˙˙û˙ŝŸ)Áĝ˙ġ˙ûû ˙ġú˙Í'­ë˙˙û˙ -Ċûì˙ü"!'”˙ĝ˙ŭ˙˙˙úŭÎ*$ö˙˙ï˘ ˙˙ŭùôĈ ˙ä $é˙˙é˙˙˙ !˙÷˙˘#û˙û˙û˙üñ˙ŝ Ô˙˙ĝ˙˙˙ûù˙˙˙˙˙˙˙˙û˙Í& % 'ŝŝ˙ĝ˙˙˙˙˙˙˙˙û˙ü˙˙%+™˙Ò˙˙À !ĝÛú˙ŭü˙û˙˙ĝġ› ˘˙˙˙˙˙á˙˙ñ˜: œ˙ü˙ûßҞ 'Ċ˙˙˙ŝüÖĝ˙úŭü˙˙“# (!Ê˙˙úò˙˙àı&żÜ&Ô˙òöĤ!âġ˙í˙Ż"žŝ˙˙"Ö˙ì˙› ôŭ˙ôÜ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙àô($ ¤ ¤ñŝ˙í˙¨ ˙˙ġöŝħ˙ş˙›-ô˙˙ĉ˙*Â˙˙ù÷˙˙˙ñ&˙˙òä! ö˙ü˙İÍġ˙˙ğ"%"˘œĞ# ˜ŝġ˙ŭóĦ˘˙˙ñ˙ •˙ŭ˙˙³&˙òû#ˆĦ¨žšĦ‘ü˙˙˙ô !4§ñ˙˙ŝ˙#0 ‘÷˙÷óż'¨˙ì˙ŝĝöŝ˙˙ĝö˙ŝû˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙  “˙ġ˙û˙˙˙ üô˙˙­7ĥúġ˙ú˙öüùù˙ú˜˙˙ŭôï˙öÓ “˙ü˙ûġ#˙˙Ï'&ûö˙˙˙úĝ÷˙ù˙˙˙˙˙˙˙˙˙ĝ˙ŝҙ' ú˙ĝĝö&Í˙#˙î˙ŻÍö÷˙˙˙÷ž ˙˙Ŭ˙÷ġÊ "ĞĝŜá˙˙Ü'8˙˙ĝ˙ú‘ !˙ò˙úÍġ˙ü˙˙É-÷ ñ˙˙û˙˙İ ÏŝüŝüüŭÄ(Ïŝü˙˙ (Ê˙˙ŝû˙˙ôħ%˙˙˙óÏÉ˙óĦ˙˙ŭ˙òÖ*$Ĉž -Şù˙ŝ˙è -†Ñ˙ĝ˙ĝĈ8Êü˙ôĝ˙ñü˙ù½˙Šœ˙ŭö˙˙ġŞ "ġ˙˙° ¨ŭí˙˙˙˙˙˙˙˙˙óù× Ü˙˙˙ú˙˙Ùû˙ġ˙Ë˙Íôùŭ ˘˙úö˙÷)Úìú˙˙÷˙ñ˙˙§™˙ŝûü˙0˙çüô˙Ġ"ŝ˙˙ö˙îûĦ& ‘Ê˙#˙ù˙û˙ĝò˙ü˙ŝü˙û˙˙˙˙˙˙˙˙˙ġ³$˙˙˙û˙˙˙˙˙˙˙˙˙ġ˙ù§ &Š˙ġ÷û˙˘)˙ö˙÷˙êŝ˙˙ï˙˙Ö!¨óŝ˙ù "ż˙ĝĝ˙™ Ħù˙ĝ˙ż"°,! ˙˙ç˙˙ñ)–˙˙û˙˙ï˙ + ¨˙ö˙÷ñ˙Ò ş˙˙É˙˙˙¤“˙Ĉ˙ĦË˙äÙÊîú˙°%­ŭÏ)ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙Ì£$Ĥú˙ö˙˙˙ġ£(‘˙ŝ˙˙úİ*˙˙ù˙ü˙ŝ×ĝ˙û˙˙˙÷”Ħ'  "êï˙ĊĞŝ˙úĝ˙ŭ˙ü˘˙ŝíÌüÜ˙˙˙ûü˙ŬĦÜùú˙˙ ˙÷ĝö" í˙û¸Ç˙˙éà˙˙˙ù˙ŝ˙ŭœë˙÷˙˙ú–É˙˙˙˙˙- ˘Ìú˙˙˙˙üġ˙ŭû˙˙û˙ú˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭáġ˙˙ŭ˙ô¨û˙ù˙˙Ö òĊ˙ġ˙ï˙ö˙˙˙˙!(üï˙˙ŭ˙˙É)İ˙˙ïáÓ˙ùŬ×ô˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ĈĴ ½ôë˙ú˙ ĴüÌĴèŭ˙ñúô˙˙ùûŝ˙Ħğêŭ˙—û˙ &ù˙ŭù˙÷Ê#•ü˙˙ĉ˙·˙ô˙ù“˙˙˙˙Äŝ'"•˙˙ġï˙˙/Ĉ˙˙¤ ú˙÷˙à˙ĝ˙ïĝíÍĝú˙˙˙˙˙û˙ġù˙"Ç˙û$îĝ˙ú˙˙— Ħ˙˙îŭ˙˙ Ğ™˙˙ö˙ڄ# ³ü˙ñ˙˙ġ˙û˙˙óİŸú˙˙˙ôà”§˙ŝŭ#'—ŭ˙˙˙˙˙˙˙˙˙ŭ˙ŝħ—˙ê˙˙ö÷Ħ-ŭŭ˙ç˙˘%¨˙ùŭŝŭ$˙˙˙ġ˙Ċ1  ˙˙ŝŭù˙÷ù˙"š˙üŭ˙˙"!ò˙˙üëž ˙çŝ˙˙˙÷˙²˙òĉ ŝÈ˙˙˙û˙Ëœš˙ô˙ö˙˙˙˙˙˙˙˙˙˙¨ $*µŝú˙˙˙˙˙˙˙˙˙˙üŭ˙, ·˙ó˙˙˙,2 Ĵ˙ö˙ö˙˙î˙˙˙ú˘'İÙŭü-Ċ˙˙˙ë  ,˙˙ĝ˙#“˙ ˙ù˙˙ö˙!ùġô˙ûü˙Ŝ’Ñ& ˙˙˙ûŭ+ ˙ ­íӖ"œĊŬÍŭ˙Ğ˙˙ùÊ  -Ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ċ˙šĞ!İĝô˙˙ñ˙ŭôœ ĤîĜö˙üİ˙÷˙%!™ûïŝœŝŝ˙öñŭ4*Ï'Ö˙ú˙˙ü˙ñ²&“ŭ˙ùüÚö˙Ö˙í˙ì˙˙ú˙ò˜!Ôò˙˙ġ¤Ë˙˙˙%ûö˙%÷˙˙˙í˙ê˙ŭû˙î˙%İÚŭ˙û˙ž!Ïĝ˙ŭ˙ú˙˙ġöü˙˙˙ëÌÖ˙ċú˙ô˙ïû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ċ!Ì˙÷ë˙ôŭ$#Òï˙ġî˜Ğ˙˙ë˙üì˙ùìŭ4'÷˙í˙˙ġŝî ­Òü˙˙˙/Ĉú˙ûöò˙û˙ôôŝ˙ó˙˙˙˙˙˙˙˙ŝ˙˙˙üĤž˙˙˙ġĦÖûŸ˙˙è˙˙ġ˙î˙˙î˙·ï˙ŝ˙˙£™Óä˙îĝ˙˙ûÓ(Û˙öĝ˙ù”÷˙˙˙œœ˙ú˙óĝŸ"(ö Ûê÷˙˙˙˙—Úôŭ(˙˙ô÷Á#˙˙˙÷÷(%Á˙˙˙˙ĝ˙˙ü˙ĝ˙ĥ×˙˙ ˙˙˙˙˙í%ġ—˜˙Î˙˙äÚ ó ·ĉûġ˙úšíü˙˙˙ù˙ùû˙ü˙Ÿ#Şġ˙˙ĝ˙Ş$Ħúñú¨¨úî˙˙˙˙˙˙˙˙ġ˙˙Ÿ' 1ġ˙ö˙˙ŝ” Ġĝ˙üË&÷˙˙ĝŝ#úüô­יÎĞ /šŝ˙ûó˙ŝ˙ôúıÛÊġ˙˙'˙ûŝü˙› .˙˙˙Ì*­ñöö˙Ħ$ìŝ˙÷œ1/ÊŝÁÑôë˙ 3èù˙ûŝ˙˙˙˙˙˙˙˙˙": ”œ  .¨ĝ˙˙˙˙˙˙˙˙˙˙ó˙˙Ĥ $î˙˙ĝĝ˙Ĵ ÔÏÉ˙Ç%”˙ò˙0/˜ò˙û÷²Şŝ˙ï˙,ú÷˙˙ ˙û* ÑÒ˙ŝ˙Ĝ-ġ˙˙üô˙ċÒ #"öœ.Ÿ÷ô¤! ˜˙Ğ"’˙˙Ó - $Ûûöŝ ĉ˙˙üכ, )˙ò˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ú˙ŝ˜%$%˘µİ" ˙˙ô˙˙è÷ê˙˙ù˙˙˙&#ê˙÷ŝË!%ŬĝŞ#˙˙÷˙˙˙– ĦìôÌ È˙˙ġ˙ž%°Ÿ ™˙ñù˙óɧù˙öé˙è˙öù˙ġ˙0ŭŭ˙ï÷!œŝ˙ü÷!˙˙˙˙ûĝ˙˙˙ù˙ŝü˙˙üİŝì˙ú˙Ò ˙ù˙ûŭ$ ġġ˙˙˙÷óÑ-"Œ˙ûŭ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙ó"¨ó˙˙˙ù˙ Ò˙ŝ˙ŝŻ žŭ˙˙˙˙˙˙˙˙˙Ĥ˙˙öû˙˙˙*¤èÍ˙˙ï›(×˙Ë˙Ĥ&Ŝ˙ù˙û˙˙˙ġ˙˙˙˙˙˙˙˙˙ù˙üì˙ú$Çŭ˙ò˙ûŞ"£ûÀħ à˙˙˙˙ĝ÷˙ĝ˙ó´˙˙ùŭî­žÉаĉ˙ú˙ŭĝ˙Í˙ĉ˙í˙û ˙˙ŭ˙° ħò˙˙˙ó*$—÷(÷˙˙˙÷ôÒ-ò˙˙§“ŭ˙˙Ö!"ú˙÷˙˙éŬŭ˙ŭ˙ö˙˙Ë# èö˙ööż 3Ë˙éŻ% ÷ûġŭž 'çú˙¤ñ˙û˙#ÇñĞ ”û˙˙ûÖ#˙ú˙ìŝ˙é˙˙˙ï˙) ,ĊùŝÄ˙!û˙˙˙Ž&'Ĥ˙ú˙˙˙˙˙˙˙˙˙óüüϞŬ˙˙ħ!*žö˙˙˙•'òóò˙­+!˜ö˙ûú˙˙%İöŝ˙˙ŭü˙û˙¤“˙˙üòÙ˙˙ûûÎĈ˙ô˙˙)˙˙Ñı­˙ù˙û­ Ÿ3›˙˙î#²˙ü˙ùü˙˙˙˙˙˙˙˙"'! Üû˙˙˙˙˙˙˙˙ŭŝóĊ( %˙˙ç˙ŝ˙˙³ž ˙ìä)˙ù˙ Ï˙ú´ "˙÷ĝ %˙ò߄+)'ô˙÷˙öà# ù- ˙Ċ Â+ "Ġùŝġ•ş›¤ŻŽ£§êŝĝ˙ŭ˙Ĥħü˙˙ïŭùġ˙ù£ŸĈ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙úó›2 .§Ğ˙˙ù˙˙˙Â&“˙˙÷˙÷ ˙í˙˙Ë ŞüĞŸ˙ï˙ûë˙˙ñ$&ßéù˙ŝ˙ö˙úĦ !Ž6˙ò˙ü˙˙˙ú˘$Íú˙í˙˙öí˙˙ŝ˙ ’˙˙Ŝ˙˙›³óñà˙  ­û˙˙Ÿ &˙ŝŝÙë˙˙ñ˙úç˙ú#›û˙÷˙ùÔ î˙÷˙÷$ß˙÷û˙û˙•Â˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ò ¨˙˙ġ˙ûĊ·üĝü˙˘üü˙˙˙ú˙ĝù˙ŭ& žï˙˙˙ê˙Ÿ Ħü˙ĝú˙ !˙˙ĝİ& ú˙ġĝ÷ ŝ˙˙˙˙˙˙˙˙ù˙ĝáò˙ Â˙˙öö˙ Ù˙ŭœ$ĝ˙ġî˙ŭ˙ü˙˙Ç-Ŭêü˙µĊ˙˙˙˙ä˙ö˙˙üúúž #Ë˙û˙üü›$Ĉĝŝû!ó˙ò˙Ù! ŭ˙ ³ĝê˙˙˙ Ğ˙˙òĦ" "ŭúïÈ˙˙üŝ˙-‹˙˙˙˙ŭ˙É'öġ˙ó&˙úŻ˙ú˙­'˙˙ù ħ’(!–Ŝ˙òİ#Óî˙ŭ !#Żŝ˙˙ĝ˙˙ŝ˙˙˙˙Î"˙˙˙ġ# ˙˙ùĊĦ  ˙˙˙˙˙˙˙˙˙˙ü˙˙2+˙˙!#*ë˙ŝ' !—è˙ġ &˘˙“, ¤ï˙˙ġ˙ôù˙Ù% !"Î˙ò˙œ%’˙ù˙* Ì˙÷˙ï˙Ä  Ż˘ĉ˙˙˙“*"žĈ˙É#˙ò˙ŭ˙˙˙˙˙˙˙˙˙ ( *Öŝ˙˙˙˙˙˙˙˙ġ˙˙•% Ó˙˙úû˙˙ŝ&"²×û˙!Ŭî˙"%ŝĝ% ˙˙î'%$# ŭ˙ (  'ĝ÷ñ˙˙¨ 'Ĝš .# £˙üÌ$˘˙żħÒÌÒ˙˙˙˙ß˙ì˙Ä˙˙üġ˙˙˙˙÷˙ĝóû˙ü˙ö˙˙˙í˙˙˙ŝùġŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙­ ÓĝŝÚò˙ġÖ Ŝ÷úû˙ü ù˙úœ#ÒúÔŭ˙˙ö˙˙òĤŬϤ,Áú˙ŭŝ+˙”Éù˙û˙ñ˙ôÎ˙ô˙˙òĦ"ŭ˙ó˙ùĤ ˜˙Ò˙úĝ! ˙˙ġŭ- ˙ùûÓ¤üûÛŝŸĝ˙˙úÑÔ˙˙ü˙ô˙ĝ˙ '£˙ĝ˙úü))˙˙ú˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˘%- É˙ûĝ˙Î#À˙Ĉ˙!Ğö˙ö˙ù˙û˙˙˙Ž&ŭÉ˙Ċġ˙˙üÍ )˙Ŝıİ#ş $¤˙˙˙˙˙˙˙˙˙˙˙÷ù˙’ ŭö˙˙Ê+šÍ˙ŭ§§˙•Ħŝ˙Í÷ "ŭ˙ŭ”"ĴġÓŭ˙ĝŭ˙˙ûž"üŝ˙˙%˙˙˙£÷áÄ )Ĝö˙˙Á0'Éû£Í˙ù˙Ó!ŸÒ"˙˙ÍĤ*¤Ëŝ÷˙ÇĦ˙ü! , É˙ú™" Öù˙˙Ó" ˙ó˙Â!"üŭ ż˙˙ŝ˙üöŝ˙ú˙ùĞ–Ö˙ù˙Ò! Ë˙˙˙˙˙˙˙˙ŝù˙˙Ï›˙(˙˙Ħú˙"˜˙ûÔ #Ş˙Ëú˙ú˙˙öÖ !*šü˙ú˘Ú˙‚˙ŭŝúü˙úù˙ûÎĤžÓ˙ŭ˙ŝ˙˙˙•"û˙˙ŭĝĠ¤˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙Ì˙˜ ˜˙˙˙˙˙˙˙˙˙˙˙ĝù "•˙ġŝ˙ô˙ŝĦŝŭö˙˙Òô˙ ˘ùÖ üü˙Ĵ$ ż˙! "Ùŭ˙úû%Óġ%œË˙˙ŭŝ˙˙›˙ü˙ò˙ó˙ü˙öü÷˙˙ŝüĠ˙ô˙˙î˙ü˙˙ĝù˙˙˙ü˙ù˙ù˙ô÷áġ˙üö˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ö˙˙ '"¤§˙ú˙˙ñ˙˙ÉÖ˙˙šùŭעú˙ôÎ˙˙ó÷É'$˙ò˙ÇšÓÖŭû˙ŭ˙˙ö˙˙ûÏ !’œ&Ÿ˙ŭü˙Ӑ(Ÿ˙˘žü˙žĞû˙ûÈ š œ˙Ó÷¤ $ô˙” (—˙˙˙˘ú˙è˙È* #Ĥ˙˙ŭ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ú˙˙ñÏ 'Ċ˙úÍ$˙ġĞ"˙û˙üúû˙ŭġ˙Ä%#5žï˙˙×ú˙˙Ĉ "˙ŝ˙ŭ )!# '%öŭ˙˙˙˙˙˙˙˙˙ô˙Ï!˙ô$  £˙üז Ô˙úŝ˙ ŝ˙Ñ"§ Ñ˙˙ŭ˙›š˙˙ġ""Ĉ˙ġ(¤ü˙ó˙Í "#˙û˙ô˙Ì "#Ÿ$˜˙úÍ ! Ĥù˙ŭùŭ˙–˙˙÷š˘˘˙ŝ˙˙˙ı˜ Ż“üŭ˙˙˙ĝŞĜ˙ÍĦ­ò˙˙÷˙˙˙˙˙˙˙˙˙ĵ( '#žÖü˙ûŝûĤŒ˙ñü˙ò˙˙˙˙˙˙˙˙˙˙˙úöü˙˙ŭ˙íĜ˙›+ &û˙˙÷!$%î˙˙ž% ŭû˙Ñ $žÔ˙˙ŭ˙˙û˙˙÷ ˙˙˙ŝĠ¨ñÚ˙ê˙˙˙˙˙˙˙˙˙û˙ï˘¨§˙˙˙˙˙˙˙˙û *ާ Ë˙üġ˙Ñ˘ !%˜˙˙ï˙˙˙˙˙˙˙˙˙˙ü™˜¨Í˙̟“ĴÎ˙ü˙˙˙˙˙˙˙˙ŭ˙ö˜( ™#˙÷˙ú˙˙˙˙˙˙˙˙˙˙òéñŝ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŝ˙ŝôîï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙˙ë˙ !)#˘Ïú˙˙£Í˙ûí  ġë˙& ÊŜ˙˙ò˙˙£Ġ˙ɢ(Çô˙öÔ! !,%ÙĊ˙˙˙÷ûË#&Ċú÷˙ûÒ*$ Ĉ˘ûÄ" $¤äŝ˙˙•( –Ü˙ù˙• ˙˙˙˙ 1§ÎÌŭ˙ì˙È)˙í˙˙ŝÂ# ˘ç˙û˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ú˙˙÷à"ĜĤÙûĝĠ'+˙˙‰!›úü˙ù˙ĝŝ˙ĝ˙üÒ§žĝ˙üï˙ĈÜÇáüö˙˙ÈÓÌÚżßûŭ˙ĝш:%ƒÉ˙˙˙˙˙˙˙˙˙˙ó˙ŭ˙'"š #İġÙŞ°,˜íĝŭßĤ &Ž˙˙ë˙îöФĵ˙÷˙š " %! ŸŬ˙ê˙˙Çɵ˙ŝûÑÙË£ĴÁ˙˙˙ĝ×Ó³3'·á˙îĝ˙˙˙˙é( Ûĉ˙óö˙ùĜĊ˘ ˘àÊûٕ›ê˙˙˙ŭ"+˙˙ò˙˙Ž- ³úŝĵ'$Â˙í˙˙Ê!!Ê˙˙ŝ˙˙˙˙˙û.˙˙˙˙úĝ˙˙ŭñ§Àú˙î˙˙˙é˙˙˙˙˙˙˙˙˙˙˙È&˙˙żö˙÷˙ÊÓŭû˙˙ï˙˙˙˙˙˙˙˙˙ùŝŝöò÷ŭ˙ú˙˙ĝ˙ĜÇÓÒËż˙óû˙ÙÇÌÔż˙üûÓÁÎÖÀ˙üúŝ˙ÔÑÚÍÓï˙˙ùŝ˙˙÷ü˙ÓĠÈ×ÒĠüò˙ŝú üí˙ö˙˙˙˙˙˙˙˙˙˙˙ġ˙˙Ê˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙öŭ˙ĝ˙˙˙î¨' ”û˙ŝ˙˙ñ˙˙˙˙˙˙˙˙˙û˙í˙˙ê˙˙˙ê˙ò˙˙û˙˙˙˙˙˙˙˙˙ó˙˙ó˙Ìà˙ì˙öú˙ñü˙˙˙˙˙˙˙˙˙úöú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙üùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġû˙÷ċ˙î˙ "µ˙ĝ˙˙ŝ˙ӇħĦò˙ò˙÷ÜÍÈ˙ÌÏ˙˙˙œ %( œö˙ġù˙ó×Öġ˙ï˙˙˙˙û˙˙˙–# ˙ĝŭö˙˙˙˙’³Ğ’˙˙˙ö˙ŭ˙Ù·›­˜Ÿ˙ךĴĴħĤĝ˙Ĥ§’—Ôäô˙˙ôôŞ“£œ˙÷ĝŝ˙ÒĦŭúû˙˙ùö˙÷ûò˙˙˙˙ġ˙üÇ˙ô˙ê˙ö˙˙íŝ˙û˙ŝ˙ŝö˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙ŝöÓÏŝú˙ôŝô˙ŭ˙ïí˙˙˙ĉü˙˙˙ŝ¨ĦÀö˙˙ŝ˙˙ġü˙˙ü˙˙˙˙ûü˙˙˙ĝ˙˙˙˙˙ñŝ˙˙˙˙ú÷˙˙ġ˙˙˙ŭ˙˙ĝÖĊ˙ŝë˙˙˙˙˙˙˙˙˙˙˙˙óÍ˙˙ï˙˙÷˙öúŭùĉ˙˙ŭ˙öúŭ˙  ˙êġ˙ġ˙û˙á˙˙˙˙ü˙+ " )™˙ŝ˙Ì˙ôŝ˙û˙˙÷˙˙úñÎĜ˙˙ìŭ÷û˙˙É­˘¤Ħ˙˙˙ĝ˙˙òé˙˙™ œ˘Ö˙ŭ˙˙ŭö˙ü˙ġОĜü˙˙˙ÌÙ˙˙îÛû¤Ÿ£°Ż˙˙ŝ˙˙˙éò˙˙úŭ˙˙˙˙˙˙˙˙˙ùû˙ñ˙úú˙ñ˙˙˙˙ŭúûŝ˙˙ŭá˙ü˙ü˙˙˙ŭ˙˙˙˙˙ù˙÷ê˙ù˙ñ˙ó˙˙˙˙ô˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ġ˙÷˙˙ú˙ú˙˙üŝ˙ñ˙˙˙˙˙˙˙˙˙û˙˙ûĝúŝ˙ŝġ˙˙û÷˙û˙˙˙˙˙ŭú˙˙ê˙˙˙˙˙˙û˙˙ŭ˙ĝŝ˙ùí˙˙ŭ˙˙ù˙˙˙ŭû˙˙˙ùŭ˙ŝ˙˙˙ïù˙˙î˙Í"˙˙ó˙˙â˙˙˙˙˙˙˙˙ôûûúÍŝ˙ò˙˙˙˙˙˙˙˙ùù÷˙ŝĠ˙˙ú˙èŭİ"!­ŭùŝ˙ŭ˙˙˙˙˙˙˙˙˙÷˙˙˙ô˙ë˙ĝ˙˙ôĜŭŝ˙˙˙˙˙˙˙˙˙ĝ˙ŭ˙öŭúü˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ñ˙÷˙öŬÒ˙ĝúġ˙ôûĝġ˙˙úúù˙˙ĝ˙˙÷˙˙˙˙˙ñŭĝ² 4+%Ú˙˙í˙ûôŭ˙˙úò˙˙ŝ˙íŝ˙!™' ""Ġ˙ù˙ùĝŭûû˙èü˙ô˙úġ˙ĝŭ˙ôĜĝ˙ùòû˙êúûéÑ˙˙˙ŝüèŭô˙÷û˙ô˙˙ü˙ûÓÔ˙˙ô˙ġú˙˙˙˙˙˙éŭ˙˙˙˙ùĝûù˙˙÷˙˙ŭŭù˙ùô˙ì˙˙è˙ñû˙üü˙ü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙§¤˙ġü˙˙ĝŝ˙˙ġô˙˙ûú˙˙ŝ˙ú˙ĝŭï˙˙ŭùĝ˙ú˙˙˙˙ŭ÷ĝóù˙˙ŭöü˙˙ó÷÷˙ŭŭ˙˙ô˙˙úĝ˙˙ŝŭŝŭúùúĊ˙Íġġ˙˙ĝ˙˙˙˙˙˙˙˙˙ĉ˙˙ĝ˙˙ġ˙˙ċ˙˙ò˙˙˙˙ŭ˙˙ġ˙˙˙ü˙ÊÇŝ˙˙ú˙ĝ˙ġ˙˙ĝġèüà”˙âÁÉ˙Ĵ" œ˙˙˙ç˙˙˙˙úĝŝ˙˙˙˙˙ï˙˙ú˙˙˙öù˙ŝ÷ú˙ìŝŭ˙˙˙˙˙ŭ˙˙üûŭ˙éó˙˙˙ùŭ˙úïŭ˙ûú˙˙úŭ˙ôö˙ĝ˙ó˙˙ŭŝëüö˙˙û˙˙˙˙üò˙˙÷˙˙ŭ˙˙ù÷˙˙˙˙û˙ûû˙û˙öü˙˙˙üüŭġ˙˙˙üĝ˙îú˙˙˙˙ŭùööû˙˙ë˙ĝŝ˙˙˙ġ˙ĝ˙˙˙˙˙˙˙˙˙˙ú˙ò˙ö˙óŭ˙˙ó˙˙÷˙˙˙î˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ùĠ÷ú˙ê˙˙ô˙òáûóöŭ˙˙÷˙ïñ˙÷˙˙˙ö˙˙ġŭ˙ŝ˙˙ŭ˙˙˙ŝŭ˙˙óġù˙ùü˙˙üġ˙ĝċ%Ùò˙úü˙˙˙˙˙˙˙˙˙ŭ˙ġŝ˙˙÷˙˙˙˙˙˙˙˙˙˙˙ô˙˙ç˙ĝŝ˙Ċ.”Óòû˙û˙˙˙˙˙˙˙˙˙˙˙˙û˙ŝ˙˙˙ġ˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüġ˙˙üĝó÷˙˙öŭ˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üï˙ĝ˙˙ġċ˙ŭ˙üì˙˙˙û˙˙ûù˙ú÷Ù˙ô˙˙í˙í˙ùŝ˙ĝ˙˙ĠÎ֛Ó Ôî˙˙ŭ˙ú˙ñû˙˙ö˙ü˙ô,œÑĠ•Ñ!˙˙ùù˙ú˙ïċ˙üŝ˙ú˙˙˙˙÷˙öò˙˙˙˙˙ùĉŝ˙ŝ×ĝ˙˙ŭüñ˙˙˙˙˙ŝ˙÷÷ŝ˙˙Çŭî˙˙ñ˙˙öŭïñú˙˙ŝúúŭ÷˙˙ĝġ˙˙ĝú˙ġü˙˙˙˙üü˙˙ŭ˙ó˙˙˙˙ŝûŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŭ˙ĝ˙òò˙˙÷ú˙úúüú˙ŭù˙˙ö˙ŝáĝöô˙ŭŭ˙˙˙ù˙˙ûü˙ŝûùŭ˙˙ŝúü˙˙ŝ˙÷˙˙˙˙˙˙˙ü˙˙öĝ˙˙˙˙˙ûúĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙ö˙ó˙˙˙ŭ˙ŭö÷˙ŭ˙ŝû˙ŝ˙üï˙˙˙úù˙˙ŭĝ˙öçü˙˙˙×%Ï˙ŭ˙˙ŭяÜ˙÷˙ù˙˙˙ŝ˙˙ŭúŝ˙˙ôûîŝŭ˙î˙˙öŭ˙˙ù˙˙˙úü˙˙˙ùĝ˙ü˙˙÷˙˙˙˙ê˙ĝ˙ñ˙˙ĝŭ˙˙˙˙÷˙ŭ˙˙úŝ˙ĝü˙ŝ÷ô˙ûúñ˙ĝ˙öû˙ú˙ŭ˙˙û˙˙ġúŭ˙˙ŭ˙˙ùĝ˙˙ĝù˙˙˙ŭüŭ˙˙˙˙ùò˙˙û˙˙˙˙üüŭŝ˙˙˙˙ò˙û˙˙˙ö÷˙˙˙í˙˙˙˙˙˙˙˙˙˙˙˙üñġ˙˙˙ŭò˙ŭù˙÷ĝ˙˙ü˙˙ŭ˙˙˙˙˙˙˙˙ŭŭŝ˙ŝüŭŝĝ˙˙üü˙˙ü˙˙˙ĝ˙÷˙˙ŭŭ˙˙˙˙˙ú˙ŝ˙˙˙ŭü˙ú˙úŝüŭúŝ˙úú˙˙˙ŭŝ÷˙ŭü˙˙˙˙ñ˙ŝúĜ˙‘š˙˙ġ˙ñ˙˙˙˙˙˙˙˙ŭĝñ˙˙ŭĝ˙˙˙˙˙˙˙˙˙ùŭġ˙˙˙ŝúÍö¸& ˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙üġ˙ŝ˙ġ˙ì˙ĝ˙˙˙ó÷ö˙˙˙˙˙˙˙˙ùúî˙û˙ĝ˙˙˙˙˙ñù˙˙˙˙˙˙˙˙˙üŭŝŝ˙˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûüŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ùġ˙˙˙üö˙˙ĝ˙ŭñŭ˙˙˙˙˙˙ġó˙÷ó˙ĝ˙úò˙÷˙òö-Ïĝ˙˙ûú˙ Ï˙˙˙ñóúû˙ó˙úúŝ˙ġ­Ğëü˙˙û˙˘›˙÷˙˙ù˙˙ì˙ù˙ĝù˙ìŝö˙˙˙üö˙˙˙íñò˙˙ûŭĝú˙˙ü˙ŭĝ˙˙ü˙ì˙˙ò˙ċ˙˙ŝ˙ùû˙ĝ˙˙ŝ˙˙í˙˙ŝù˙˙öú˙˙˙˙üû˙˙˙öïìñ˙˙ô˙ñ˙˙˙˙úü˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙û˙ü˙ĝ˙ä˙˙˙˙ö˙˙û˙˙ûġ˙˙û˙÷˙˙˙˙˙ŭ˙˙ü˙˙ûû˙˙˙ûġü˙˙ôŭ˙˙üê˙ú˙ö˙óóó˙ġ˙˙˙˙ĝöŭ˙˙˙üû˙úŝ˙ú˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙ôù˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ô˙üü˙î˙˙ü˙˙ĝ˙˙Òœ˙ŝîñ˙˙ĝ˙şè˙˙ù˙ùĝ˙üŝ˙˙˙˙í˙˙˙ù˙˙üü˙˙˙ĝûôŭĝô˙˙˙úï˙˙ġ˙˙ïó˙óù˙÷ö˙ŭ˙ü˙ŝ˙˙òóü˙û˙ù˙˙ò˙ù˙˙˙ŝ˙˙ü˙ûŝ˙öô˙˙ġ˙üüüü˙ġ˙˙˙ûú˙üóù˙ûîîû˙ù˙˙ûùúûúĝö˙˙˙÷˙ûç˙ŝûŝ˙˙˙˙ö÷˙˙ñ˙÷úŭ˙˙í˙˙û˙˙˙˙˙˙˙˙˙çĝ˙˙ü˙û˙óú˙˙˙˙îû˙˙ûŝ˙ü˙˙˙˙˙˙˙˙˙ŝüüŝŝüüŝò˙ü÷ù˙û˙üĝ˙˙˙÷˙ñ˙˙ġ˙˙˙ù˙˙öŝ˙ë˙ù˙ö˙ï˙˙˙ŭ˙˙ŭüŝŝŭŝ˙ŭ÷˙ŭ˙îû÷˙ġŭ˙ï˙ (”˙˙˙ŝ˙˙˙˙˙˙˙˙˙û˙˙ú˙ŝö˙˙˙˙˙˙˙˙ŝ˙˙îĝ˙ù˙˙˙–•¤¤ħ˙˙ġû˙ĝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙÷÷˙˙˙˙ĝûĝ÷˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ŝ÷˙ô˙ùġŭ˙˙ú˙˙˙˙˙˙˙˙ŭŝŭŭ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŝñ˙ŭúìú˙˙ĝ˙˙ö˙˙÷ö˙ùôŝ÷˙ŝ˙˙˙˙˙ĝ˙˙íúû˙³ ŝŭŭ˙˙˙Ê$Ì˙ĝûĝ˙ú˙ŭ˙ŭ˙˙˙÷˙ŭ˙˙î˙îûš1Éô˙îŭ˙îû˙˙òü˙˙˙ü˙˙˙üĝ˙ŭü˙ëú˙˙˙ùó˙˙ŭĝ˙üöüĝú˙ŝ˙˙˙è˙öŝ˙˙ŭüĝû˙ŝò˙ü˙˙˙˙˙ŭ˙ü˙˙˙ùôŝú˙˙ûû˙ŝ˙˙ĝĝù˙˙ŭ˙ûùüû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭñĝî˙˙˙ï˙ëüŝü˙˙˙ï˙ĝŝ˙˙ŭú˙ôŭ˙˙ŭüö˙ûĝü˙˙ĝĝŝ÷˙˙˙ŝ˙˙˙ŭ˙ú˙˙˙˙û÷˙˙˙˙˙úúêü˙˙ü˙˙˙÷˙ô˙˙í˙ó˙˙˙˙˙˙˙˙ò˙˙˙˙óû˙ò˙û˙˙í˙˙˙ŝŭúúûööŝ˙˙˙˙ö˙˙˙ö˙˙Ü˙˙ñ˙÷ĝô!Í˙˙˙úô˙˙!˙˙˙î˙˙˙˙˙˙ùŝ˙˙÷˙˙˙û˙ú˙˙ùà˙üĝ˙˙öŭ˙˙ŝ˙˙ġ˙˙ó˙˙˙ŭ˙÷˙˙˙˙öû˙ŝüù˙˙˙˙˙÷˙˙òù˙˙˙öûúúúó˙óü˙ûü˙˙ô˙ġ˙˙ŝ˙ô˙˙ûû˙˙úŝ˙ŝ˙˙˙˙˙˙ŝ÷ùŝ˙˙˙˙˙˙˙ùúŝ˙ŭ˙˙ŭ˙˙˙ŝùù˙ĝ˙òŭ˙˙˙˙ù˙˙˙ù˙û˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙ö˙˙÷ô˙˙û˙óï˙˙ú˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŝŝ˙˙˙ŝ˙˙˙÷ĝ˙÷ùñû˙˙˙˙˙ô˙úĝġ˙ŭôú˙˙˙û÷˙˙ó˙ûùĝŝ˙˙˙üü˙˙˙˙ù˙˙˙û˙˙˙˙˙ö˙˙úŝ˙˙˙˙˙˙˙˙ò˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙öü˙ü˙˙ôù˙ĝ˙˙Ï˙÷˙˙ġü˙˙ĝŭ˙˙˙˙˙˙˙˙˙ĝŭ˙˙ü˙ŭ˙˙˙û˙ŝ˙˙î˙˙˙˙˙˙˙˙ŝ˙˙ġûŭ˙˙ŭ˙ŝ˙˙˙ò˙˙˙˙˙˙˙˙˙ŝ˙˙üŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙÷˙˙˙˙ŝ˙ġ˙ŭŭ˙üûŝû˙˙˙˙˙˙û˙˙üú˙˙÷ü˙˙ŝ˙#$”˙˙ĝĝ˙ŭö˙˙˙ĝ˙˙ġ˙û˙÷û˙˙"òÔñ˙˙˙˙˘Äû˙˙ŝ˙ù˙˙ûġ˙ĝ˙ŭŝŝ˙ġŝû˙ù˙ö˙˙ĝ˙÷ŭ˙˙˙ĝ˙˙ú˙û˙˙˙˙ò˙û˙˙ŝŭ˙˙ö˙˙ŭ˙û÷˙ú˙ŭ˙˙˙ŝ˙˙˙ĝ˙üù˙˙˙˙˙û˙˙˙ù˙˙ĝŭ˙˙ú˙ŭ˙ù˙˙˙÷úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ŝ˙ŭ˙ċ˙˙ù˙˙˙˙ó˙ŝ˙˙˙ö˙ĝ˙û˙˙˙˙úö˙˙ú˙˙˙˙ŭŭ˙˙÷˙ŝ˙˙˙ùû˙˙˙ŝ˙˙ô˙˙˙ôĝ˙ûġ˙˙˙˙üŝ˙˙üù˙˙˙ĝŭ˙û˙˙˙˙˙˙˙˙˙˙˙úú˙˙˙˙˙˙˙÷˙˙ŝŭ˙ù˙˙˙˙ü˙ùü˙öù˙ĝ˙ŭ˙˙ŝ˙˙÷˙ü˙˙˙š(š ûùĜò§šÍ˙úê˙ôŝŭò˙˙û˙˙ö˙˙ùû˙˙˙üĝ˙˙˙÷˙úüŝ˙ùó˙˙ĝ˙î˙˙ŭġüŭü˙ùŝĝ˙ü˙˙ú˙˙÷˙ùúú˙ġ˙˙ŭ˙ü˙ŭ˙üŝ˙˙˙÷˙üüŭ˙ü˙ù˙˙ŝü˙˙ú˙˙ŭûü˙˙÷˙ŭ˙ùù˙ŭ˙˙˙˙˙üúûŭĝ˙˙˙ŝ˙ù˙˙ŝŝ˙ŝû˙˙ö˙ò˙ù˙ë˙ŝ˙î˙ġûú˙˙˙˙˙˙˙˙˙ŝ˙úŭ˙˙üŝ˙ŝ˙˙˙˙ŭ˙û˙ŭŝ˙ŝú˙˙˙˙˙˙˙˙˙˙ŭû˙˙ŭŝ˙ûĝù˙ô˙˙˙˙ü˙ŭü˙˙ñ˙˙˙˙˙˙ŭŝ˙ŝö˙ġû˙˙ò˙˙˙˙˙˙ŭ˙˙ŭ˙˙˙ĝŝĝ˙ŝġ˙üúŝ˙ü˙ ,›ŝ˙ú˙˙˙˙˙˙˙˙˙˙ĝ˙ü˙÷˙˙˙˙˙˙˙˙˙ö˙ŝ˙û˙ŝô˙úŭ˙˙ô˙÷˙˙ùŝ˙˙ĝ˙˙˙˙˙˙˙˙˙ü˙ô˙˙ùúü÷˙˙öŝû˙˙˙˙˙˙˙˙˙ü˙ó˙˙ú˙ú˙ù˙ûòŝŭ˙˙˙˙˙˙˙˙˙ü˙˙üúŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙üŭ˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙ŭġ˙Ä% Ëö˙ô˙Ö (#šú˙ö˙˙˙˙˙˙˙˙ü˙ó˙ŝ•&˘Ĉ˙ĝ˙˙›˙˙ö˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ÑùÚ # ì˙ö˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ë£¤ "¤ó˙öŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝ˙ĝ˙ü '—·Ù˙˙˙˙˙˙˙˙˙˙˙˙û˙˙÷˙Ĉ / #˙ĊÚòŭ˙ŝŭû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙ñ˙˙ĜßĠԔ"‡˙ë˙˙ü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ú˙˙˙˙Ŭ˙ö˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġü˙˙ü˙˙ú÷˙ÈĈĠĴŞü˙˙˙ĝŝŭ˙˙˙˙˙˙˙˙˙öŭ˙ù˙˙˙Œ›§ħ˙˙ŝù˙˙ĝö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ĝú˙˙ú˙üúÜ˙˙˙Ŝúŭ÷˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôŝ˙˙û˙ç˙˙ĉŭú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙ŭ÷ĝ˙ü˙ñŭ˙˙òû˙ìÏ˙ó˙˙˙˙˙˙˙˙˙˙ġ˙ŭ˙ûì˙˙˙ŝ˙ö÷˙óóü˙˙˙ŭŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüû˙üô˙ë˙ĝŝŝ˙ôŝ˙ñŭ˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙üŝè˙îŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ûüŝù˙˙ô˙˙˙ü˙ù˙óüû˙˙˙˙˙˙˙˙ü˙˙˙˙˙ŝîĝ˙Óó˙˙˙ŭŝ˙ûġü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭúŭ˙˙˙˙˙˙˙˙˙˙ó˙˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙ŝ˙˙ġ˙ú˙ùġö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ûû˙˙ĝ˙ú˙˙˙˙ŭŝ˙˙í˙ŝ˙˙˙˙˙˙˙˙˙˙ëŭ˙öñ˙˙˙î˙ĉŝ˙˙˙˙÷û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙í˙ñ÷û˙ù˙ñ˙ùô÷ŝ˙üŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ŭŭ˙˙˙ò˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûĝü˙˙ĝĝŝ˙˙ùù˙˙˙ñ˙˙ĝü÷˙üú˙˙˙˙˙˙˙˙˙˙˙ù˙˙úë˙˙˙˙ô˙ó˙ŭú˙˙˙÷ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙˙˙÷˙˙ù˙ë˙û˙ŝ˙˙˙˙˙˙üö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ô˙˙ŝ˙˙ù˙˙î˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙÷ĝ˙ô˙öġ˙˙ŝ˙ŝö˙÷÷˙˙˙˙˙˙˙˙˙ŭ˙ŝü˙ŭŭ˙û˙˙ŭ˙˙ŭ˙˙˙˙ŭ˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úĝ˙ŝû˙ŭùö˙˙ú˙ö˙˙üŝüôù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙ì˙˙ú˙÷ŝ˙ŝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙éŭ˙ġŝü˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙ò˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷˙ù˙˙úûüûü˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ù˙ŝ˙˙ô˙˙ú˙˙÷˙˙ġ˙úûú˙ŝù˙˙ŝ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙üŭ˙ûüŝ˙ü˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙÷˙˙÷˙˙˙ĝŝ˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝü˙˙ú˙˙˙˙ŭŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙˙ó˙÷ù˙˙ŝŝ˙û˙ŝô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ú˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ö˙÷˙ŝ÷˙˙úö˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙û˙ú˙í˙˙÷˙ü˙û˙ü÷ŝ˙ĝŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü÷˙ġû˙˙˙˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ŝî˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙üä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ó˙˙ô˙˙˙˙˙ûòú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ŝŭï˙úó˙˙öô˙˙û˙ï˙˙ŭ˙˙˙ü˙˙ùóŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŭ˙ú˙ô˙˙˙û˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭòü˙ŝŭí˙˙˙ĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙˙ċ˙˙ŭöë˙ġ˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙úí˙ŭù˙ïĝ˙˙˙ŭú˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ĝì˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝóŭ˙˙˙˙˙˙˙ü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙ú˙˙û˙˙˙˙û˙üŭùŝ˙˙ŭ˙ŝó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙ĝ˙ôġ˙ù˙ó÷ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŭ˙ŝŭ˙˙üü˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ôŝô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙ö˙˙èöôú˙˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷˙˙˙ŝ˙˙ûúŭ˙˙úû˙˙˙ó˙˙˙ġûû˙˙˙˙˙üó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙û˙ĝü˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙÷˙˙ŝ˙˙ú˙óû˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ö˙óó˙˙˙ì˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙ġñ˙û˙ûĝ˙˙ġ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙˙˙öò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùö˙˙˙öü˙Âñ˙óü˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úúö˙˙ĝ˙˙˙˙˙û˙˙í˙ŝ˙ïŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙îŭùô˙ó˙Îòü˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ŝ˙ï˙˙úù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝ˙úê˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙ùü˙˙˙˙˙˙úû˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üûü˙ĝŭ˙ŝ˙˙˙˙óŝ˙˙˙ŭ˙ġô˙˙ŭö˙ĝïŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òú˙òŝŝĝŝüù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùüû˙˙˙êö˙˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭû÷˙ŭŭ˙íŭ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭŭè˙˙ñ˙˙û˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó÷˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙öòö˙˙˙˙÷˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùùŝü˙˙˙ë˙˙ù˙˙˙˙˙ö˙ú˙ó˙îö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙ŝú˙ô˙˜Ÿú˙éú˙ùï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙é˙ŝ•¤˙û˙˙ŭ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ġġ˙˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭù˙˙÷ŝġŭ˙˙ĝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ûüû˙÷û˙ü˙ŭü˙˙ôàŝ˙·ÖÔ˙˙úüüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝú˙˙˙ÉÖÌÛÔÖ˙ŭ÷˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ġ˙˙˙÷òû˙˙ì˙˙ô÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŭü˙ôú˙÷˙˙˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙ÌÉĜÍÁĈ˙ùö˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝËÑ×ÊÔÙ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úú˙ŭ˙˙—ĞÓôù˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ôû˙ÏÔÀÚüûúŭí××ĠÑñ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙û˙”*" û˙ùñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙óĝ"Ìó˙ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ù˙Éú˙˙ŭû˙˙ŭù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙ü˙˘¤Ÿ“äġü˙ŭ˙û˙ĝŭôҕ/)­ŝ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙҉& Ŭò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûöġ˙ġ˙í˙ŭġ˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ˙˙˙ï˙'’ ×ĉ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙Î.'$é˙ŭŝ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‘- 'Ş˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙œˆ+( ˙úüġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙éŭĤ›!—ó˙˙˙š!˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïû˙ì¤ î˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙êİ ¤ä˙ù˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ“×üù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê(&+ ù˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é˙Éĥ#Ċ˙˙˙÷˙˙ûù˙˙ŝú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úž!%0ë˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙úŒ()˙˙÷ü˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ò˙Ê3!—˙ŝé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòÑ Ĝ˙˙÷ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú  /›˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üó™#!è˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ì˙2 ĥ˙ŭë)˘˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙˙˙ ) ˙óï˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ !Ĥ˙úŭ˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Î"ĦÚ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙À³ !™ü˙ö˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ï˜+Í˙ĝ˙û˙˙˙üüïÚ !Ħ˙ŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭ "Éúŭ˙ô˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ï˙# ùü˙ú˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙ ôó˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ ,˜›Ħ˙˙ĝ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò* Ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú$‘˙ĝÍĜî˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙Ž*"È˙ú˙˙›˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙ûÖÓ˙ú˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝú˙˙˙ú÷˙˙ŭŭ˙˙˙ŝ˙ŭ˙˙ú˙˙ü˙ûœ ú˙˙ú˙û˙ĝ˙˙˙ù˙˙ôù˙˙˙˙úĝ˙ûüûü˙˙˙ŝ˙ŝŭ˙ŭùû˙Ïúúû˙ùŭûŭû˙˙˙˙ĝ˙˙ûŭ˙˙˙˙˙˙˙˙˙÷˙˙˙ü˙˙÷˙˙˙˙ó˙û˙˙ò˙˙˙÷÷˙˙ü˙˙˙ü˙ĝùŝúú˙ŝúŝ˙ü˙˙ĝ˙ò˙ù˙˙÷˙˙˙ûŝ˙ú˙üÇ##ĤÀ!˘˙Ĉŝ˙î˙ŭû˙˙˙ĝ˙÷ú˙˙í˙˙÷˙˙ï˙˙˙˙ŭŝü˙ú˙ùŝô˙üú˙˙˙ñ˙˙ĝô˙˙˙˙÷ùŭ˙˙Î˙ŝŝ˙ü˙˙û˙ò˙û"#•˙˙òŭ˙ŭ˙˙˙˙ùú˙˙ĝ˙˙ŭ˙˙˙˙ôü˙˙ï˙˙˙˙˙˙˙˙˙˙üûü÷˙ü˙ĝú˙ö˙ŭ–ġù˙ö˙˙˙˙˙ùŝ˙÷˙˙˙ŭ˙ŭö˙˙ġû˙˙˙˙÷˙ü˙ŭò˙˙ĝ˙˙ŭù˙ü˙˙ú˙˙ċ˙˙ôŭŝ˙÷üŝûŝ˙ŝ˙˙˙˙ŭû˙ŝ˙ŭú˙ù˙˙ŭ˙˙˙˙˙î˙ŝ˙˙˙˙ ô˙˙ù˙ŝö˙ùú˙˙ĝ˙ù˙˙˙˙÷ĝ˙ŝ˙ŝûŭ˙˙ù˙ú˙˙ó›û˙ĝŝ˙˙˙˙˙˙ĝŝ˙˙ú˙˙˙˙ü˙úû˙÷˙ŝ˙˙˙˙˙˙˙˙˙ûġú˙ó˙ġüŝ˙˙˙ö˙ôŭ˙ó˙˙˙ëÙ˙ûùö˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙˙ú˙˙ú˙ö˙˙ĝŝ˙ù°ü˙ù˙˙ĝ˙ĝ˙ù˙ò˙˙÷û˙ûŝ˙˙ú˙ŝ˙ùû˙˙ùú˙˙ò˙ŝùĝ˙ŭ˙ĝ˙˙˙ŭö˙üŭ˙˙üû˙ŭ˙˙˙˙˙˙˙˙˙ëŝĤúÒ˙òË˙˙ĝ˙ĝ˙ó˙˙ï˙ŭúĝ˙˙˙˙ó˙ú˙˙˙ñ˙˙ûŝ˙˙ùú˙˙ĝ˙˙ï˙˙˙%á˙˙˙&Ĥó˙ġ˙˙˙˙˙˙˙˙˙˙ùô˙˙ŭ˙˙˙ŝñ˙˙ŝúûü˙˙ŭò˙í˙ĝ˙ò˙˙˙ù˙ŝġ˙ô˙˙ŝù˙ûûüÉ"Ÿĉ˙÷ù˙ùġ˙˙ö˙ŝù˙ó˙íŭ˙û˙ŭü˙˙ú˙˙ĝ˙˙˙˙ù˙ĝ˙ñ˙ĝ˙üüŭù˙ûġ˙ġ˙ô˙öû˙˙í˙˙ġ˙˙ĝ˙˙˙ġ˙˙ĝ˙ù˙ù˙˙ŭ˙÷˙˙íö˙ġ¤—˙˙ú÷˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ö˙˙˙˙˙ŝĝĝ˙˙üĝû˙˙˙òñ˙˙˙ŭù˙˙÷(×˙ŭĝ˙˙û˙˙˙öú˙˙˙˙˙ŭíĝ˙˙˙˙˙˙˙˙ûòú˙˙üû˙˙˙˙˙ +‚˙˙˙˙˙˙˙˙˙ûüŝŝ˙üúŭü˙˙˙˙˙˙˙˙˙ú˙˙üĝŝü÷˙ö˙ïü˙˙ú˙ü˙˙˙ùúú˙˙˙˙úĝûŝùŝ˙˙˙ŭ˙˙ŝ˙ù˙˙ú˙ĝ˙î˙ä˙˙ùööü˙ú˙ŝ˙"ò˙˙ÈÜĈĝ˙˙óü˙˙˙ŭúûŝ˙ü˙ú˙˙˙ñ˙ú˙ô˙˙˙ġ˙˙û˙˙ô˙óú˙˙˙˙ï˙˙ò˙˙ŭö˙ù˙˙ŭ˙ĝèĜ›$Î˙ŝŝ˙ü˙û˙˙˙ŭŝ %˙ú˙˙ù˙ïġüŭ˙˙˙˙û˙˙˙û˙˙ù˙˙íĝ˙˙ġ˙˙˙˙˙˙˙˙˙ú˙˙ß˙üĝ˙÷˙ġĠı ˙˙ô˙üñŝüŭú˙˙ŭùŭŝ˙û˙˙úî˙öì˙˙ñŝ˙÷ûŝ˙˙˙÷˙˙ŭò˙ŝŝ˙ĝ÷˙ġ˙˙ôü˙˙û˙˙˙˙˙˙ù˙í˙öŭ˙é˙üë˙ú˙˙úĝò˙ò÷˙˙˙˙ŝ÷˙ñ˙+Ñ˙ó˙˙˙ü˙ĝ˙˙÷ö˙ò˙úïô˙˙˙˙÷ü˙ö˙˙˙ü÷˙ó˙˙˙˙Ĵ÷˙ï˙˙ŭê˙˙ċ˙˙˙ùġĝü˙˙ù˙ŭó˙˙ŝ˙éû˙˙˙˙˙˙˙˙ûŭ˙˙˙ü˙˙˙˙ûŭû˙ŝ˙ú˙˙ñ˙˙üÉö˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙˙ùú˙ÒË˙÷öŝ˙˙˙ËĈ˙˙÷ì˙÷˙ù÷˙˙ñ˙˙˙÷˙ŭ˙÷ŝ˙ñ˙ĝûġ˙˙˙úĝ˙û˙˙˙˙û˙ġŭ˙í˙˙˙˙˙ŭö˙ù˙ġ˙˙˙˙˙˙˙˙ġ˙¤ ˙ĝŝŝÊÜóüĝ˙˙í˙˙˙˙ï˙˙˙ŝùúô˙˙˙ûö˙˙ôî˙ùŝ˙˙˙ġ˙˙˙˙˙ġéúİ2Âú˙˙ôœâ˙˙˙˙˙˙˙˙˙˙˙ò˙˙öô˙ñú˙û˙ôŝô˙˙˙÷ó˙˙ñ˙˙÷˙˙ê˙ôû˙ò˙îò˙ġ÷˙úŭ˙˙˙÷˙˙ú˙ú˙˙é˙˙óĝ˙˙ó˙ŭù˙˙ŭúóŭ˙˙úô˙ñ˙˙ù˙˙ŝ˙ù˙ĝ˙üĝú˙˙úŭ˙ŝ˙ùö˙˙ï˙ù˙ì˙ŭ˙ÖÄÎ˙öô˙ù˙˙˙³˘™ŜÔ˙˙˙˙˙ ’û˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŭŝ˙ûû˙˙ü˙˙öĝ˙˙˙˙ùö˙öíúÊó˙˙úŝ˙ùü˙ŝ˙˙ûò÷ï˙ŭü˙˙˙ôöôú˙˙˙üú˙ûû˙˙˙˙ŝ÷˙˙ĝ˙˙ĝùî˙ú˙˙ü˙˙˙˙ŭú˙˙˙˙˙˙˙˙˙˙˙ĝì˙˙˙˙˙˙˙˙ĝ˙˙˙ŭ˙˙ŝ˙ŭŭ˙˙úĝú˙ŝúŭ˙˙˙û÷˙˙ĝ˙÷˙úîúŭ˙÷÷˙˙˙ñ˙ü˙˙ĝóúŭš§ûóü˙ù÷üüû˙˙û˙ñö˙˙˙˙˙ŭùġ˙˙ĝ˙˙ï˙ì˙òéü˙û˙˙˙ġ˙ġñ˙ú˙úĝ˙˙öùôŝ˙ô˙˙óù˙ŝ˙˙ü Î˙ŝŝ˙ü˙˙û˙÷˙˙! ü˙Êŝŭ˙÷˙˙ö˙˙ü˙ŭ˙˙ġ˙˙îŝŝù˙˙˙î˙˙˙˙˙˙˙˙˙ùüô˙×§ŭ˙ü˙é˙îž+˙î˙ô˙˙˙˙ŝ˙üŝ˙ŭŝĝúúü˙˙˙˙˙ûñ˙˙úú˙˙˙˙úù˙˙â˙ĝô˙ú˙÷˙ŭ˙ïò˙˙ôŝŝ˙˙üġ˙˙ŝ˙ĝ˙˙ĝ˙˙˙˙˙˙è˙˙ŝ˙ô˙ŝñÎì˙˙üô˙™ Ħú˙ü˙üüŭŭ˙˙úŝ˙˙ŭ˙˙˙˙üúĝ˙˙˙˙ô˙ù˙î˙˙ù˙÷ĝ˙À™£ŝ˙ïŝ˙ö˙˙™˙ò˙ĝ˙˙˙ûü˙ò˙˙˙˙˙÷˙ü˙˙˙˙˙˙˙˙˙˙˙˙üúùò˙˙î˙Ù˙÷ŭ˙òî˙ù˙˙Ô˙ïò˙˙˙˙˙˙˙˙˙˙˙ĝû˙˙û˙˙˙Ŝû˙˙ĝ˙ùïž*ô˙˙ú˙˙˙˙ö˙˙˙˙ĝŭ˙ó˙á˙î˙ùú˙ü˙˙˙˙÷˙ĝ˙˙ĝ˙˙ŭò˙˙úú˙ŭ˙˙í˙ù˙û˙˙ï˙˙˙˙˙˙˙˙˙˙Ê#¤ş˙ĝ˙ú˙˙˙üûû˙ŭ˙˙óŭ˙öîú˙˙˙˙ò˙ö˙˙ú˙˙˙˙ö˙ô˙÷ŝŝú˙˙˙ĝä.Œ˙úî˙˙) Ĵìîŭ˙˙˙˙˙˙˙˙˙˙ùĝ˙˙˙˙˙üûŭ˙˙ŭġ˙˙˙ò˙˙úĝŭ˙î˙˙ĝ˙˙ü˙˙˙˙ġ˙˙öü˙ĝĝö˙ŝ˙˙ü˙öĝ˙ġò˙òôû˙úú˙ñúŝ˙˙ü÷ê˙˙˙ïÓ˙Êúĝ˙î˙˙ùô˙ñ˙ùġó˙í˙÷û˙˙˙ü˙˙é˙˙  ,  Ó˙ö˙˙˙”/$ Ĉ˙˙ï&$" &˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŭ˙˙óŝ˙üû˙˙ù˙˙˙˙ŝü˙˙˙˙˙ö˙˙˙ö-Ä˙˙ö˙˙ċ˙ù˙˙öü˙˙˙˙ï˙÷ŭ˙â˙˙˙˙úû˙˙üŝŭŭ˙˙ŭüŭ˙˙óġ˙ġú˙˙˙ì˙˙˙˙ü˙üŭ˙˙ü˙˙˙˙˙˙˙˙˙˙ŝ÷˙˙˙öŭú˙ĝ˙ŭ˙ù˙˙ó˙˙˙ŭ˙úö˙˙˙˙˙˙ŝûú˙˙˙˙óó˙ŭ˙˙˙˙˙÷ĝ˙˙ôöŝ˙ŭŝùù˙úß&ç˙˙˙ü˙˙ü˙ùĝúù˙˙˙ŭ˙ġ˙ŝŭ˙˙˙á˙ü˙˙ñ˙í˙˙˙è˙ùôú˙˙˙ü˙÷˙˙ô˙ù˙˙÷˙˙öö˙˙˙˙èôü˙•. Î˙ŝŝ˙ü˙˙ĝ˙˙ŝ‰!(ġ÷ŝŭ˙ô˙ü˙ŭù˙˙ŭùü˙˙˙˙ŭ˙˙˙÷ñ˙ú˙˙˙˙˙˙˙˙˙ŭ˙˙ê›#ïŭ˙÷˙˙ùĴ²é˙ĝ˙úĜ˙ŭ˙˙ùġ˙˙ú˙ù˙öúî˙üŬ˙˙úŭ˙˙˙ĝŝŭ˙˙ŝ˙˙ŭäòô˙è˙˙˙û˙˙ûí˙Ö˙ò˙ü˙˙˙ûġ˙˙òÒ˙óÏùî˙˙ŭŝŭüú˙˙ž"Ĵ˙û˙÷ü˙û×˙˙ò˙ó˙˙ú˙˙˙üÓ˙ĝŝĝ˙úŝ˙˙˙˙˙˙˙ü˙ŝ˙˙Ŝûù˙ûöú˙˙úäñë˙˙ñ˙˙Ô!ì˙ŭû˙˙˙˙ċ÷ê˙˙˙ĝú˙˙˙˙˙˙˙˙˙˙˙ŝŭû˙˙ù˙˙˙ú˙˙÷˙ö˙˙ê˙ò˙ÓïÙ˙ï˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûü˙ŭš %÷˙üö˙˙× ˙ĝ˙ôü˙ò˙˙û˙öġ˙úġċ˙˙ï˙˙˙ŝù˙òŭ˙ġô˙˙˙ò˙ġú˙ŭ˙ó˙˙ĝ˙ï˙˙ŭ˙î˙ö˙ñ˙˙˙˙˙˙˙˙˙˙+ §Ŭü˙˙ùùû˙˙˙˙ĝòïĝ˙˙ŭ˙˙ú˙ŝġŝ˙ó˙˙è˙˙òùŭû˙ö˙ù˙ŝ˙˙ó˙˙ŭ İ˙˙˙û•"Ħ˙˙ü˙˙˙˙˙˙˙˙ö˙ú˙˙ïö˙˙ŭĝŭ˙˙ŭô˙˙ü¤Òŭú˙˙˜ ’Ÿ˙˙óñ˙˙ÔÔö˙ó˙˙ŝ˙òùùûë˙ŝ˙ù˙ŭ˙˙û˙Äݨ¨Ê˙ûüö˙˙ġûçĞš§˜˙˙ùù˙Ò "Ĵ—˜(-ú˙ö˙ŝġ˙ !! / ò˙ñŸ$œİ%ĝ˙  ŭûó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôô˙˙˙˙òĝ÷ŭ˙˙˙˙úü˙ŭ˙ġ˙üŝ˙ùè˙Ĝġíù˙˙˙˙˙˙üü˙ŝúŭĝ˙˙˙˙˙˙˙ġŭ˙˙ĝĝ˙˙ü˙˙˙üü˙˙˙˙ó˙ŝ˙˙öí˙˙˙ĝñ˙ŝ˙˙ôûüú˙ü˙˙˙˙˙˙˙˙˙û˙éú˙˙û˙úúġ˙˙˙ú˙˙˙üŝŝ˙˙û˙˙ŝŭŝŝüó˙ŭ÷˙˙˙˙ġ˙ċò˙ö˙˙˙ò˙˙˙˙î˙ö˙ŝ˙úË Ŭ˙ùú˙ġ˙˙ö˙˙ò˙˙ô˙ô˙çûê˙Ó˙˙ġò˙˙˙˙˙ûŭü˙˙˙˙˙˙ö˙˙ġŝ˙ë˙˙˙úùü˙ġ˙˙öŭ˙úġ˙˙ô˙ĦÎ˙ŝŝ˙ü˙ù˙˙˙ûü²  ˘ĝ˙êğÙù˙˙ó˙˙ò˙˙˙˙ŝĝĝ˙û˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙Ş&Ò˙ŝó˙÷ŝô#˙˙ŝñúñ˙÷˙˙üŝ˙˙î˙÷Ñàöŭ˙˙÷˙öĝ˙ĝù˙û÷öĝÛê÷ú˙˙÷ü÷˙ŝìŭ˙˙˙ŝĈ×Ñüù˙ñô˙˙ĝ˙˙÷˙˙˙ŝ˙×ı˙˙ò˙ô˙üĊ) É˙ĝûùġ˙ŭŝ˙˙˙ô˙ñ˙ù˙˙ñÊ˙˙˙˙ŝ˙˙˙üö˙ö˙ġŭ˙ŝö˙÷˙ŭ˙˙˙˙ñ÷˙÷˙˙˙ü˙˙˙"Ó˙˙ù˙ûû˙ŝ˙í˙˙˙÷˙˙˙á˙˙˙˙˙˙˙˙˙üŝ˙˙˙˙ĝĝß˙ëĜûü˙ôġ˙ŝ˙ĝüĜóŝ˙ô˙˙˙˙˙˙˙˙˙ŝ˙ŝ˙ü˙˘#0–ö˙˙ñ̝'´˙ĵ×ÑË˙˙ŭ˙˙˙ŭĊĞ˘˜½×˙ÏÀŝ˙˙˙˙ŝúáÔĈÎÓì˙û˙˙îö˙ĊÄŬĈÊç˙ŝ˙˙ì˙î˙˙˙˙˙˙˙˙ŝ %Ğĝùú˙˙˙˙ŝù˙ü×ÒÜÔŝûí˙ÍÊÖÄÚÑ˙ïü˙ŝ˙˙˙˙ŭĦ. žËú˙ŭġä˙–%˙ûú˙˙˙£—ĝü˙˙˙˙˙˙˙˙˙ŭù˙˙ġ˙˙ŬÍàÓöÎàñ˙˙ŝŭóž$ü˙Ÿ+$"“ĝ˙™ !É˙ġġ˙Ä Ŭ˙˙÷ú˙ÒĦü“6 Şĝ˙˙ûĝ˙Ù# ġüŭĦ&(˙˙÷˙ÇÍ˙  ™˙ŭĠ$ É˙ï) ,Ì˙Éä˙ '˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ĝŝ˙÷˙˙˙ü˙˙üġ˙ŝ˙ŝ˙˙˙˙ŭü˙˙˙ü"Ñ˙˙˙ġ˙ï˙ö˙˙˙óŭ˙˙ҊĞèö˙ö˙ŭû˙˙ŭù˙ú˙˙˙˙˙˙˙ï˙˙˙ï˙˙˙˙˙³˙˙ó˙˙ĝ˙˙˙˙ù˙ü˙˙˙˙˙˙˙˙˙ġûŝ˙ú÷˙ġ˙˙˙úû˙ŝŝíù˙˙ùüüû˙˙˙ŝú˙˙˙ŭò˙˙Ċ—¤çí˙˙÷ŝï˙öĝ˙Â˙˙˙Í˙˙ôò˙ŭ ˙ûŝ˙÷˙óôô˙˙ü˙˙˙˙÷úÀ§Š÷˙ñ˙˙˙ç˙ĝò­˙˙˙ú—Ĥí˙ü˙ô˙˙ġ˙ŭ˙˙ġ¨Ô˙úî˙˙ú˙ŭ˙íŝ˙ì%'Î˙ŝŝ˙ü˙ù˙˙˙˙˙ž (˙˘/•Żúù˙˙ú˙ûôİÄ˙˙î˙òĵá÷˙ùîù˙˙˙˙˙˙˙˙ûӞŝ˙ĝó˙˙˙ ˙í¤"!² ˙üô˙ŝ˙ûٟĤü˙ò˙˙ù˙ŝĝ˙ñ˙˙ôН%˘ŽÓü˙˙˙˙öéۙ£.™È˙˙û˙ö˙¨´ïš£.Ğ–ö˙û˙˙ù .˙˙˙˙˙˙˙˙û÷î÷˙ŭŝ÷˙Ċ¤ĞĦ·Êëј§­ì˙ñ鞝Üü˙˨˘šħÇŭñö˙˙ù˙ö˙˙˙š.ÏÎŭ˙ŜÀûúל˘ôŝ͛ĠÔ˙˙˙˙˙˙˙˙˙˙˙˙úùì˙˙‘˘)§Ü˙ë˙ö˙²!-œ¤ùó˙˙˙˙˙˙˙˙û˙ĝŝ˙˙)0ä˙˙ŝ—(š˘ ”˙˙öñŭ× Ż­–+ î˙ñ˙ûž #$%ñ˙î˙˙˙ñ(#+ +{˙ôŝö˙˙˙˙˙˙˙˙˙˙§§˙˙ŭ˙˙òùŝŝ˙ŭÑ! Í˙áü¤ŭ˙˙˙ä˙˙ü˙(.²˙÷˙ŭġ˙—!˙ùú˙ġĝž™êìŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙ĝ˙ ¨ú÷ŭùħ"Ò¤ +£‡*›ŝù˙ÑĤ+ úû˙˙™ + ˘)!üöŭ˙˙ž˘š ï÷ÖĦ  ²öĝü˙Ĵïŭô˙&Ìò˙˘ ž˙¤ 0ò˙˙ġ˙ö˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙½• –ü˙ĝ˙ŝĝ˙˙²ž£ĵÇ˙üŝ˙˙Ċ §™›ÔÉ˙˙ĝ˙˙ò˙˙—.%Ôù˙˙˙ŝ˙˙˙ŭ˙˙˙˙˙ŭò˙ôԟÍ˙úöû˙#'œôü˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙ĊҔ# $š´żŝûúû˙˙˙˙îúÑ˧ɺĈñ˙˙ú˙ġ˙ı/$ ö˙˙úÄßĤ§™Ĥ„Ŝó˙÷˙˙Ò$à˙ïŝ˙˙ŝ˙ûġö˙ò˙÷ -šÒ˙ûüñû˙˙˙÷ ) 4í˙ŭ˙î˙˙ŭ $ Ê˙öŝûù˙ŝÓ Î˙ŝŝ˙ü˙˙ù˙ó˙˙Ÿ$˙˙ö˙) Ä˙'˘ġ˙˙˙˙˙˙˙˙˙˙üĴ ##šÌÒ˙˙ë˙. Ş ò˙ġ˙ĝíò£ *$ ç˙ġŝ˙˙ĝ˙ġö˙—.% /–ŝ˙÷ò˙•)( 'ğ˙ĝöéŒ  2,Ç˙ŝ˙) á˙đĴ˙î˙˙ŬÖ()"  ˙˙Ô%!˙˙Ê"ó˙˙ߪ˙÷ï´ &,ĝŸ#˜% Ä˙˙˙˙˙˙˙˙˙ù˙ŭ˙Û˙Ì + # ô˙ŭ÷˙+ Ñ˙˙˙˙˙˙˙˙˙ú˙÷˙˙˙ĥ#żŝ˙˙Ğ!0İî˙˙˙– "˘˙˙˙˘)˙ġŝ˙Ì´,Üû˙˙ò˙˙˙˙˙˙˙˙˙+'­˙˙ĝ³- + £&#)ñüġ˙ÌÓ˙û˙˙˙È(›˙˙˙˙˙$+“˙˙÷˙˙˙˙˙˙˙˙÷˙ŝ˙÷˜.&#)Ó˙˙˘ÍÓ·&!  Úö˙ä¸% ŝŝòúÚ ˙Ì1˙˙˙üž' ˙ĝè )šú˙Ġ (Ê˙ì˙$ ˙ü˙“Ç˙ú˙˙ú° ˙˙É1*!-ŸÏ˙ŭž$¸Àŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙" ĤĤ$%Ä˙ġŭ˙ûúĦ %!Ÿ˙˙üô˙›%(Î˙û˙ŝú˙À"!™ü˙ö˙˙ô˙˙üŭ˙˙ñÜ#İüŭ˙˙û $Ĥ×ó˙ġŭ˙˙˙˙˙˙˙˙˙÷û % Ê˙˙ó˙˙÷%4 ")ú˙ü˙˙$&)ò˙ì˙&š˙˙ü˙É# ï˙˙˙ñ˙ĝŭ÷˙ŭĝ˙ŭ)“š˙ö˙˙!œûÖŞ Ş˙˙û˙ŭú Ĥžó˙˙˙òÒ œ¤"Î˙ŝŝ˙ü˙˙˙ü˙ŝ÷˙ %™˘#ŒÜùû›"#¤Î Ò˙ó÷˙˙˙˙˙˙˙˙˙Îüŭ˙ûŭ —Ô˙ú˘ŭ˙˙úġÏ % ˙Ċ#Ĵî˙˙ó˙˙ġ˙˙Ä#!ú˙˙˙˙Ğŝ˙˙Á' $'˙û˙ŝó""œ˙˙˙ċí "  Ĥ˙êÀ  /ŭó˙ ˙ùò˙"šüÛ˙˜$   ˙Ĉ& "£œ˙˙˙˙˙˙˙˙˙ĝ˙˙ŭœž‘³™Ĥúŝ˙üĜ#"šüŝ˙˙˙˙˙˙˙˙ú˙û˙ûŭÇ$ žž˙˙ôÎĤ!Ôڛ Şù˙ï%!÷ù#›ù˙Ì˙ùĠ§˙֞"Öġù˙ĝ˙˙˙˙˙˙˙˙Û˙˙ŝü°% š£¤İÙô˙ñĞ $˙û˙ñ˙Óŝ÷û˙ù˜" Ğóù˙˙˙˙˙˙˙˙˙˙ö˙û˜, ”˙ġŭ  û˙ü¨"ž˙˙Ä×˙öĜĞ úú˙÷ "Ĝô˙úòÖ§ú˙üÊ)˙ü˙ŭ "’²  İŝù˙˙ ˙ŝ˙ŭ!˙ó˙Ĥù˙üĝ˙î˙ŭô§˘Ë˙ŝö˙Ñ˙Èú˙#£ŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝġŝ˙ĝÏ !š˙˙ÊÎ˙ú˙é!˙÷˙ Ûö˙˙˙ #Éü˙ŝ,ĝ˙˙˙Ë"(˙÷˙ò§Ò˙˙˙ŭüù˙˙ĝ˙˙貤Éö˙˙Ċ˙úŞ˙˙ŝ˙ù˙ûĝ˙˙ò˙£˙÷Ĥ ˙ûġßħóü˙˙'Ñ˙˙ 'ú˙˘Ì¨2 ŭ˙ï˙–!Ì˙˙ù˙˙ŝù˙˙ġ˙ÈŞĦ˙ú˙“¨ü˙” ›ó˙˜%!Ž˙û˙˙Ä.ġŝĝ$ ˙üö˙œ §ü˙Ùö˙˙ú˙ŭ˙úù˙˙î˙%œú˙&"˙ĝô £Ò˜˙úû˙˙˙˙˙˙˙˙˙úŸ#!£Ä˙ŭ˙ùĤœÔŝŭ˙&óŝ˙˙òާŭ÷˙Ìİ˙üöŭŝ˙˙˙˜"Ÿ˙òÒ ÷ŝû˙›˙ÎŝŸ"ó˙Ô! !ŝÑ˙˙ü˙ù""#Š×˙ï˘Ÿ˙˙ö˙İžŸ˙˙ûÓ ŭò˙ÔžÙ˙˙ŝŸ"%’˙Ñ˙Ħš˜˙üŭú×  ˙ï² "ù˙˙˙˙˙˙˙˙˙ŝŝ˙˙ù! !£ŭ˙ú˙™Ġ˙ûŝ˙Ì!˙Ñ˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭ˙˙ĝÓĦ˙û˙˙ÑúĴ Ê˙ŝ˙ŝ˙úŭÍ"Ÿ#Ë÷˙É&ÑùĠÇ˙Ï$˙˙òÇ˙˙ó˙˙˙˙˙˙˙˙˙ûÀ&İĊ˙˙ùŭ%  Ŭí˙˙“ Ùó˙ġ– Ëú˙˙ĦÛú î˙ù˙ôÜ%ĦòÙ˙˙ŭİ#­ôü˙˙˙˙˙˙˙˙üŝúן˙˙—"˙˙˙Ä˙ú˙ü,˙ú˙ü˙û˙úŝ˙ Î˙ŝò˙˙ ˙ŝüú˙˙˙ï°—. #˜—˙ĝûŝ˙œŝù˙ó#Ì˙ŝ# §Ñûŝŝ˙ŭú˙óĦ˙ŭúú˙û˙˙ñö×üĞ  ™ŭñ˙Ħ§¤’Üüó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙ġÎ'ŸÛŝ˙Ä#¨ñÜô!ûö˙˙öóŝ˙ô ' ŝ˙˙˙ûÉ˙˙ñ˙§1˙˙ĝ˙à &ğó˙ó˙ġ˙˙ŭû˙˙˙ì+%˙˙ŝúĦÇúŝŝ Ó˙òŭ˙ŝ˙üù˙˙ô˙˙, )È˙ùŝ¨!“ĝ˙˙àç˙Ĥŝ˙˙ü–Ë˙ġ˙Ġ ˙ŭ˙Œ+ĦÒ˙˙• ˙ĉ˙ŝ˙ġ˙û˙˙ċ˙˙ï˙ûĝÜ™˙˙ñġ֞¨ùîċŸ(Ó˙ûš%÷üġñ.™ÌÑÍ똞˙˙˙Ñ"ù÷ú˙˙˙Ô˙˙ŝù˙ŭ÷˙˙ú˙˙È˙˙˙˙ş . –˙˙ö˙ŻÒ˙ŝħò˙˙˙ŭ˙˙˙˙˙˙˙˙˙ñž À˙˙˙˙˙˙ü ġ˙úí˙˙úœž˙ĝùçċ%˙˙úŝñ˙˙˙ŝ÷ŭĈĤ˙ŭÚü"•˙˙˙&Ĝ˙˙Ò˙ŝÎ)×ŭ˙áŸ!$ Ïöòŭİ"žŝ˙ú˙˙ŝ&­ù˙ŭ›÷ñ˙ġĴ˙üŝ˙Ĉ˙˙ù˙ŭù˙í˙$Ğ˙˙÷ŝ(ĵ˙â˙˙˙ï  ˙üÎ˙˙ô˙˙˙˙˙˙˙˙˙ĝŭ˙ˆ& š˙˙í˙Ġŭ˙ûü˙˙!žöŭö˙÷˙˙˙˙˙˙˙˙˙ûŝ˙ŭ÷ù÷-î˙˙ü˙ùüŸ&˙˙ŝ˙ŝúî˙üÊ '˜˙˙óû˙ú("˘˙ù•Đ˙úú˙ŝ˙˙˙˙˙˙˙˙˙Ò $˙˙˙û˙–"—ûŬ˙˙ÙĦò˙˙óñ $Ħ˙éûÏŞÒĜìŝù×ij“êĉô˙úËœ˙ûë÷˙”ż˙˙˙˙˙˙˙˙˙˙˙˙ü˙– %ì–$&Î˙ù˙¨˘˙ì˙ĝ˙Ö˙ûü˙˙È%Èö˙ŝĝ* ˙û˙˙ô$ċ˙˙˙÷ /˙˙˙’*÷˙ŭŝ×˙˙÷˙ŝ˙î¨ŭúŭ˙" ˙˙ü!#§ù˙˙˙û˙ŝĝ˙"¨ûÊ˙÷ì˙ġü˙˙ġ˙È˙ " '˙˙ö  û˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙üòôİ ҙ¨- Í˙˙÷Ÿ˙˙˙ŭ˙¤¤Ħ˙˙ŭ˙ ˙èò˙˙Ôŝú˙ŝ$ö˙˙˙ë˙Ħ0˙˙˙ġ˙˙˙ûŝŝû˙˙Ĝ ö˙ŝ×û˙ûÌ£‘˙˙˙ĝ˙ô˙˙˙ù˙ŭ˙‘( ˙˙÷˙ŝ˙%˙ŭÉ—˙ŭŝòӗ$ ˙ó˙ŞÉ˙˙˙ü˙¤ĝô˙˙˙ĝĠùĝùüĥ£ö˙÷ü˙ğ%Ħ˙÷˙ï˙˙ûû˙ĝ˙˙˙ŝì˙ŭ˙ÏĴ˙˙ġš(÷˙˙˙˙ŭ˙˙ú  /&'Ñü˙şĝ)˙˙˙üñÌĠ˙˙ûû˙˙˙úŝ˙˙Ŝ%!˙î˙˙ó˙$!ê˙ü˙Ê™˙˙ ÷˙úŭ˙ó˙˙˙˙˙˙˙˙ö˙˙Ħ˙˙ĝüúŝž˙˙˙ĝ˙˙ŝÊ˙˙˙–0Ĥ˙˙ûŝ˙Ÿ˙˙˙ùòû˙˙˙Î 1Ôü˙˙˙˙ï˙˙î“0 œ˙ßí˙˙İ"°ıĠúœô˙˙Ż˘˙˙˙ŭ(˙û˙ûò×û£È÷˙'ŭ˙˙˙áÖċŭüü˙(è˙˙Á+Ħü˙ô˙û+Ğïü˙ġĊ˙üó˙˙ñ˙˙!÷˙›áï˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙)Î˙÷˙òï˙›"’˙˙˙ö"ž˙˙ö÷˙˙˙˙˙˙˙˙˙˙ùŝ˙˙ŭ˙˙"Ĵüç˙÷˙ü˙›%¤ë˙ŝ˙ŝ˙˙û˙˙.Ëú˙˙ôîÓ/ŸĜ›Ħ˘†Ĥ˙˙ò- %Ħ˙˙˘³š˙˙úúùġ˙˙˙˙˙˙˙˙óгöôŭûú°°üùü˙"˙û˙˙í ˙˙˙úï˙÷˙˙ĝ˙˙üú&ô˙˙ĝÈĞÓ˙˙˙ä£'­ĝŝï˙˙˙˙˙˙˙˙˙ñġ(&˙Ĵİ˙ġ˙˙—,ïŝ˙˙òĞ*Ŭŭ˙ü×%Â˙ú˙˙ Ĥ÷˙˙ï˙%˙˙˙î˙óó˙Î* ˙˙˙ï˙ŭòĜ˙òùó˙% Ç˙˙÷˙ #ġì˙Ÿ"˙öï˙ñù˙íè˙úĝ÷˙ù˙ó˙ÇĦŞĠ–¤˙›˙š%# ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙Ÿ#£ݤ˙˙ÁĴ­ë˙ĝüùü˙ûé˙üï˙%×Û˙˙ñ˙˙˙ö˙1 Ä˙ñèüÖĝÚ Ċŝ˙˙ġ˙ŝ˙˙ŝôĝ˙& š˙ŭ˙Ĉ(3–Öŭ˙ù˙Ŝ˙˙˙üŭ˙˙ù˙˙˙#$!İ˙˙ġ˙˙÷˙Ĵ,üó˙ŝ˙ö˙Çç˙ú˙ àŝġü˙öó˙ĝŭ˙ü˙üŝ˙˙‘Ó˙˙ôŝúâ˙ù˙˙ó˙ŝùô˙û3!Á˙÷ï˙îÓ%Éô÷˙¤(œŭġŭöÔ+İ˙ŭŭ”ÂÙÛĝ˙ŝ˙ġüûà ĝġ˙˙˙˙ ôŭ˙ü˙˙˙˙ú˙˙ġô˙Ĥ˙˙ŭ˙˙Ħ Ù˙˙÷ù& 1§ï%óüüŝ˙˙˙˙˙˙˙˙˙˙˙ì˙!”ŝ˙˙˙˙ú˙—(˙˙ŝġ÷˙ĝŝÑ˙ëìÖĦ˙ö˙˙ô˙û˙ġù˙˙˙ŝôñÛ Úŭ˙ĝö˙û˙ŝ˙ ·÷˙˙úġ˙ Ĝí˙Ğ˙˙û˙ž3™ô˙˙ŝ ˙ŝ˙˙˙ġ˙™˙Íñ—˙ô÷˙Ñú˙˙˙ü! ˙˙ö˙ 'û˙˙í¨—˙ŭó˙žú˙˙÷˙˙ôÔĝ˙˙ŭùô˙˙˙˙˙˙˙˙˙ü˙ù% ċ˙˙˙˙üÒ #˙öì˙ )˙ûŭü˙˙˙˙˙˙˙˙˙üŝ˙üŭ˙˙íœ! –˙˙ö˙÷áǝ+ ˙˙ŝ˙ŝù˙óú˙Ġú˙ó˙˙Ü(ûùŝ˙ùÛ˙ûô˙%ó˙óÄ˙â˙îŝ˙˙˙˙˙˙˙˙˙˙˙˙w1%Ĝ˙˙˙˙–•ü˙ù˙Ċ ˙íŝ˙˙%˙÷ĝ˙üŭ÷óû˙ü˙˙˜˙úò˙Ú-Ĉŭò˙˙˙¨Ĥ˙ò˙˙˙˙˙˙˙˙˙÷˙˙ ÊîŝŝĜÊÔÇ˙˙˙ó˙ ˜˙˙˙÷˙ÏÀ˙˙ùó˙ÎÁ˙î˙˙ (˙˙ü÷˙˙ú˙çù˙ù˙˙üú£ $ûë˙˙÷˙˙ï˙ù˙˙ù˙˙úŭĝ!•˙˙ŝÍ %˙˙˙ûÔ˙ŝ˙ó -$ò˙˙˙ö˙˙ŭÙ'ûÖÎĝ!$˘ŝĞ% !˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝÓ($Ÿ˙"Ò÷ŭü÷ó˙ $˙˙ĝ˙˙úù˙˙˙˙˙ġ™˙ĝûĝ˙ŭ%üü˙ú0Ï˙˙˙˙ü˙Ħşóú˙˙úŝ˙˙˙˙˙˙Ñ" ù˙ôŝÇ"Ħ˙˙˙öú˙˙ĝŭ˙˙òĝ#¤˙˙û˙˙ü1 ˙ï ö˙˙ôŭ˙ú˙˙ë˙ù,—˙˙ġ˙˙˙˙˙ùü˙î˙ŝÌĈ˘ ! Öúö˙˙ûÊ ¤ù˙˙˙ò˙œ)ò˙˙’  ĝû˙˙üû˙š£˙˙ìà÷ŭ˙˙÷˜! ˙òÁ˙˙ŝû˙˙÷˙ô˙ 'ú˙÷˙ü !˙ŝ˙˙˙ùû˙ŝ÷˙˙˙ï$) ˙ŝ˙˙íĞ Ì˙ġ˙˙Ĉ"Ċ˙˙˙éíú˙˙˙˙˙˙˙˙˙ü # Ġï÷˙˙˙Ô­ô˙ùŭ˙íëò˙˙˙à'˙ú˙ñò˙÷˙ü˙˙ü÷˙˙˙í%&òŭûú˙˙˙˙ŝÖ&#„ŭĝú˙˙˙(" £˙˙Œ˙˙˙ïŻ %šġ˙˙%ù˙˙ûúŝÑ(ž˙ĝ˙Ñ!! ˙˙˙ï°÷ùĝġ˙Ó$˙ùò˙ ï˙˙îĜŸ˙úï˙!ž˙û˙ŝ˙òŝ˙! ˙ Ûóñ˙˙˙˙˙˙˙˙˙˙˙üû¤˙÷˙û˙ç&˙˙˙˙ ì˙ŭ˙ñ˙˙˙˙˙˙˙˙ŝ˙˙üù˙ùÜ%·öŭî˙˙÷üŞ&Í˙ŝ˙ŝ˙ü˙ì˙ž+Ï˙˙û˙˙*'–üŭüùĜŭëú˙î"˙÷˙˙˙úû˙˙˙ñüûî˙˙˙˙˙˙˙˙˙# Òö˙÷˙š$¤˙ĝ˙Ŝ˘˙˙úɤ ĝŭ˙üè˙˙˙˙û÷ü.œ˙˙ö˙Ó İÈ˙˙öñ˜ '#óŜö˙˙˙˙˙˙˙˙˙ŝç!"÷˙˙é˙˙˙˙ĝû˙üù°*Ħ˙˙ġŝШŝúú˙ŭœÙ˙˙úĈ$Î÷˙ë˙˙ú˙üí˙ü"òŭ˙—Ĝ˙ġġ˙èèÊġ˙óô›%ŝŭ˙˙˙¨—˙ôö˙&ÓôÏËÇ#˙˙úœ #Ĉ˙œ"œŝ˙Ş ĥŭĴ£ïŸ4 !Ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è˙œ˙ç˙öû˙˙ĝö˙È# ˙ŝŭ˙˙ï˙˙ŭ˙úġ˙ĜŻ˙˙ô˙˙ôó˙ġ˙ŭóŝ˙üúûŸ$ ×ó˙î˙ŝ˙˙ûŭ˙˙üÍ#˙˙í˙˙ĝ˙˜)%&„ùŝŭ˙˙˙ŝŭ˙ŭġè •˙˙ô˙˙ġĤ ÇÙ#Ö˙˙˙÷ġù˙ŝ˙òŞ* ˙˙˙˙ĝèŭ˙˙˙˙˙˙Ş"ü˙˙˙ïàĦô˙üñ˙˙˙˙Ŝ"'Òúöïûüûžûú˙%ü˙ŭŭòŜ ïû  ó˙˙˙ù˙ù˙˙Ç˙ŭ˙˙ì˙$żö˙˙˙ŭŭú˙˙˙ë˙ü% ¤˙˙˙ü˙Ÿ$&˙˙ŝùË Óó÷˙˙˙˙˙˙˙˙˙˙˙˙Ĉܙ (Ç˙˙üê˙˙)Ŭĝü˙ú˙Ä£Î˙ŭż' ˙ù˙˙˙î˙ü˙˙üŭ˙˙˙ûÙâó˙˙ä˙˙û˙ü›"³˙ŝ˙ŭŝ˙( "£÷îħ!é˙ù˙›İ˙˙˙à#˙ôŝ˙ŝ˙™%˜˙ñë˙˙˙˙Û˙ġ˙öŝĦ5ì˙˙Í ˙ìĉ˙Ç )˙˙˙˜# œġû˙˙ô˙˙˙›" &$û˙˙ö˙˙˙˙˙˙˙˙ŭ˙˙˙§ôÌ˙é˙˙ /ŭ÷˙ó#ü˙˙û˙˙˙˙˙˙˙˙˙˙ù˙˙˙ùüüù˙ĝ˙˙ŭ*+Í˙ŝ˙ŝóŝ˙˙ŝ˙ù˙˙û˙ ĝ˙˙úñ˙˙˙˙˙˙ú˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô İ˙ŭûĝŭ˘˙ĝü˙Šüû˙˙”'+˙˙ûù˙ö˙÷ô˙˙Ì ˙˙ùŝ˧Ö˙ŭ˙˙%Ÿù˙ŝ˙˙˙˙˙˙˙˙û˙˙™ Ĥùú˙˙˙ŭüŭô˙´˙ü˙˙˙ŝ˙˙ú˙ ù˙û˙Ì!˙˙˙ġ   ŭŭ˙˙úÇ"Ċî˙ŭ˙˙˙˙˙œœ˙˙ü¨'Ż˙ġôüż(,û˙˙ûž# ! ŝŭ˙˙&˘òûš™&•˙ĝİ' ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùö˙˙#ċó˙˙óüù˙ô˙•˙˙˙ò˙÷˙˙ì˙˙˙$ˆ˙ûġ˙äĝúÜ˙˙ëü&$˙ôĝ˙˙˙›#˙˙˙˙˙˙ûû˙ŝùÍ1Îô˙ĝôŭ˙˙# *7û˙ûö˙ü˙ŝŭġ˙í$#+›ôô˙úó˙™  ħĈ§÷˙˙˙˙üŭ˙˙üŞ˙÷ú˙û˙˙ò˙ó˙œ ,…˙"˙ŭñ˙˙ŭ˙ġ˙˙ı#˙ĉŝ˙ À˙˙˙í˙˙Ş$µù˙òš˙ü˙˙Í)ŝŝ˙#'ú˙˙ŭù˙˙ĉ˙Ó!!§íù˙üœ@ùü˙ŭ˙˙˙úô˙üúĥ"úù˙˙› Żïġ˙˙ò $›˙˙ö˙˙ùó˙˙˙˙˙˙˙˙˙˙àö˙˙˙ïì˙˙˙ë˙"$ûô˙ù› ˙ĝü˙òí˙Ñŭ˙öŭ˙˙ĝŭÜ"½˙ï˙˙˙ĝ˙û˙ŭ!—Ĉú˙ŝéì- ù˙˙Ħ˙ŭ˙˙ ù˙÷˘ ú˙˙˙û˙™ Ħò˙˙ñ'Ĵ1 ¤ċ˙˙˙û$ó˙ŝú' ˙ġ˙˙˜' (ġù˙˘Şü˙˙ñ˙˙çñ˙$–û˙˙ü˙˙˙˙˙˙˙˙ġ˙ġ˙+Şĝ˙ŭ˙ó!'Œ˙˙ë˙ ò˙˙ñ˙˙˙˙˙˙˙˙˙˙ĝŝ˙˙˙˙˙"Ş˙˙˙˙ô˙˙–! Ô˙ŝ˙ŝÖ˙ċŭ˙Ÿ'!ûì˙ôŝŭü!˙ê˙˙˙úŸÉ˙ñĦ"Ñ˙î˙˙ÍÑù÷˙ŭì˙˙˙˙˙˙˙˙˙ú ö˙˙˙˙Ÿ%™ó˙˙˙  £ġŝŝ˙§  ˙˙é˙Ĥ¤û˙ŝĊ$"§˙ĝĝ˙×$ŭü˙ċŭ"¤ŝ˙ù˙˙˙˙˙˙˙˙˙ñ˙È Ĥŝ÷ô˙úŬùŝÌ)Žüò˙÷ï"%!û˙ġñíÒë˙÷) %½ì˙úŸ)úûüì˙" —Ñí˙$Ñ˙öŸ˙üġ,˙˙˙Í* –˙˙ŝÓ !(ŸúĝûïÓ% (ü˙Ĥ ,$Ĝí˙É.Ÿñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ú÷Ÿ!$Ħ˙úö˙˙Ïĝ˙˙$*ş˙˙˙ŝ˙÷˙˙öú£-Í˙ġ˙˙˙–öŝ˙Ê£˘˙˙ġ÷˙˙˙öó˙˙ŭ˙˙˙˙˙˙˙£ü˙˙˙Íù˙ŭšÉö˙ù˙ŝ˙ù˙÷˙˙œ ³û˙˙ú˙ó$˘úû' ˙ùñ˙ü˙˙ó˙˙÷˙ĝ˙û˙ È˙Ù˙—˙Î&˙ŝ˙úĠ ˙ú˙ġ˙¨ô˙˙ĝû˙ú˙˙Ëúŭ˙˙Ì˙ùŭ˙Ê ž˙ñĜŭô˙˙ŝ÷˙˙òĜ×ú˙÷&˙˙˙÷˙ŭ˙û˙ŝ˙˙ž"Ñ˙ŝ˙ÓÈ˙ŝ˙ġ˙ ! Ŝï˙˙ŭ˙ú˙˙˙˙˙˙˙˙˙ŭôĴÑ˙˙÷˙òà#ö˙ù˙˙–˙˙Î˙İÉû˙˙˙–Ħú˙˙˙û˙˙ï%&˜˙˙ġ˙˙Ċ˙˙›Ŝŝû˙˙™•˙úù ˙ĝ÷˙ž+Ù÷˙ÇĦŝŝŭ˙÷˙ž–˙ò˙˙ !˙ç˙ûüÒİú˙Ĥ˙ôú¨˘˙ò˙™œŝù˙˙ô˙˙˙ú"Ÿ˙ú˙˙˙˙˙˙˙˙˙˙˙ŝÑ֍'˙ñ˙ù˙Ĵ×˙ġ˙‘úù˙î˙˙˙˙˙˙˙˙˙˙ŝùü˙ĝĠ'˜!™ŭ˙Ċ&˙ŝ˙ŝ Ñ˙ĝ˙ ˙ĝ˙üû˙—/˙ñ˙˙˙–œġÖûŸÔŝöŭ˙û˙˙˙˙˙˙˙˙˙Öû˙ö˙˘#Ĥ˙ó˙˙˙üÎúĴ ½˙˙ġ§˙ŝ ! ü˙˙ùÎ$Î˙ñ˙Ï ˙é˙˙˙˙˙˙˙˙˙˙˙öÑ˙˙üûÓÎ˙Í! &×ŭ•˙˙'Ĥ˙˙ò¨Ĵĝ˙Ê'ġ˙ĉ‘ #˙ŝ¤ İ˙óÔ! ˙ù!˙üüŝÎĤ*"Ċŝ˙˙û˙˙˙˟›£Íŭüĝ˙ŝȞ— —˙ûû˙úü¤û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝ˙!Ç˙˙˙óÛÊòŭ¨( ˙òŝ˙ËĞŭûÛ ˙ùò˙ġ%ôù˙ù° ¤˙ñú˙2œĝ˙û˙˙˙öù˙ù˙ŭŭúœÒùŭÈ'Ħĝû˙›* ˙óù˙ĝ˙˙˙˙˙˙˙˙%›ŭ˙˙˙œ˙ŭ¤ ˙ûĈŭ˙ÒÒĝû˙˙ú˙ĝ£Ċ˙˙ü ¤Òú˙öÌ ­úûù˙˜ Ĝ˙ù˙Î'˙÷˙÷˙šĦ˙˙ùùĤ³ïù˙û™'¤ĝ&È˙ĝ˙ûÍĝ˙˘#ŝ÷˙˙ĦÙŝġ˙ĝ˙ù˙˙˙˙¤+ŭ˙Ë˙ù˙˙ĝ˙ĝ¤$Ĥ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˘#÷˙Ïĝ˙ ¤˙ô˙Í”˙À˙Ŭ ŞĤš)Ô˙ó˙˙ú˙˙úĠ"#Ë˙·˙˙˙ŞÙô˙½%¤ù˙˙üÜĝúĜ™ŭġ˙˙Ò˙ġ˙˙˙Ë ˙˙ïÓ+  "˘˙˙ġ˙˙˙$ŝÏôÒ#Î˙ĝĤ(Ï˙í˙ü˙úŭ˙Ä' ˙˙˙û˙˙˙˙˙˙˙˙˙˙ĝ˙ŭž"( &ùù˙˙£ ô˙˙Ä"šÙŭ˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜ) ˙’¤ .Ñû΢ "˙ĝĠ )š˙ŝ˙˙˙§ "Ħİ˘­ Ó˙Èş‹¤ Ş˙˙û˙ŭ˙üû˙ûû˙ ! ž˙ż"-˙˙£"  Í˙%#˘˙ú˙! ˙˙ÈÏ˙•ü˙˙˙˙˙˙˙˙ŭ˙˙óĦ(­ û˙ž # •ĝ"•˙  ˙÷ú)  óŝİ"ú˙ŭ ġ˙˙¤! (Ħ˙˙˙˙Ħ’'›È˙ĝŝĴ›úĠ˙ŝġ˙û˙˙ñŜ"”İ˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙ü˙˙˙˙˙˙ôŝú˙˙ĝĝ˙˙%ĝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ú”-9‘ÁڟÊ˙˙’ŒÓ×ù ) ˙ŝ˙˙˙Ë”˙˙˙î +/Ë ÷˙ö˙˙ôö˙˙ŝŝì˙˙Ĵ  ˙ŝÛ ŝú÷˙˙é˙˙˙˙˙˙˙˙˙­"ÒÂÇ*˙úŭĈ, ßÖÑ˘˙ŭò˜$)$ÔŝĝŬ$’Ĝ ’˙˙˙$( Ĉ˙ġŭ˙˙ü ÖÒóü˙úö˙ "Í˙úŝ"'$!—˙ £$˙˙˙İ˙ùí $ñ˙˙ġ˙ü˙éĜéĴ(%áĤ !&üŝ˙˙ö˙ö˙˙‘%—˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óÔ#!­+$˙ù˙!"ĝ˙öñĦ)! ! ç˙˙˙üĝ˙û˙û! ˙é˙ïš +ŞÏÜÔÙŭúŭĊ"'˙ÌŻ$Ŭ˙îó ÇÜ˙úîĞ&$ĥ˙˙‘ . §ÍÖŝûŭ˙ôò´, $ Ğ˙˘$$$§ŝ˙ŝ .üù÷˙ùù˙³˙ì˙˙ù˙˙˙˙˙˙˙˙üŝŝôԒ<#žĜÊ׌0–Óŝù§$&'–˙ú˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòэ$#,ġ. + —˙Á'üò# & "Éġ˙ŝ˙    !çüû˙Ì(* 4í˙ŭ˙î˙˙˙ġ˙ċ%$ ö˙›$&˙úĦ )"ù˙ß˙˙ĝóä" *ŭ˙İ""˙%0½˙˙˙˙˙˙˙˙˙˙˙û˙˙ĝ!& % +Èŭ˙÷•*šĉ˙ӟ™%,…Ú˙ɤ×ۛÌáê˙˙³6ĤÈÛĈ˙˙ïÒÈĈšĠĝ˙˙ÓÚÈȽÊÀ˙ó˙üÈ,ŬÒù˙ôô˙ùÒÒ˙ó˙˙ŭ˙˙ìĜ˙ê˙ŭù˙ü˙ù˙˙á˙ŭ˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙üüûòçâö˙˙˙˙žÔ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ŝ˙ü˙›Ħ& #˘Óŝî˙˙ ""0Ô˙ŝ°ž˙˙˙ì˘!ĉíî˙˙˙% §œß˙˙û˙˙ŝ˙ûùú˙ŭġ (!½˙÷—/#Ċ˙˙˙ô˙ù˙˙˙˙˙˙˙˙ìŬ &+"z˙ŝ˙ŝ˙Ì+ Ÿ# Ŭċ˙˙˙Ò%  ˙ĝúüĵ*Ĥ˙%&Ğ˙ŭŭ ÉóĤ(ĵġ˙ò˙ % #Ÿ˙˙ŝŝ˙, £˙û¤ œ˙ŝ¤&%òô˙˙–˘ıÊç˙˙"ޏéñû˙ü˙˙˙ŭ˙˙µĥ’Š,š£ž˙ó˙˙˙˙˙˙ïÛÑ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÜĞ *מœµŸĵì˙òš£ŭú˙ûÙĊĊ³×˙éù˙üüŝ˙˙ûïÖ%$# £ïĝŝö˙˙˜($ $Éï˙óŝ¤˙˙˜#²ñú˙˙² üó˙ °û˙Ĥ!%Ë˙˙ĝö˙ò¤! "ŞĈ"Ĝô˙ Ĥŝĝ˙˙ #Ëò˙öù˙Îĝû˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙û˙˙˜  #œ½˙˙úñҖ¤œž­ĤݏĠŝ˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙ϰ‘Ĵñ˙Ċħ“Ĝâ× £­Ĥî˙˙Ĥ$ ¨§¤Ž˙˙ŝ˙˙ĝ÷ä  $!Äë˙òĝ˙—­!ĤĤí˙ü˙ô˙˙˙˙ò˙ûŝ˙ĝÑÍ­ŸĦžÁ˙úĜ˙˙˙˙Ô˙˙˙öÀ@  ˙ŭñ˙ޝ£˙˙˙˙ä˙İ›ċ˙볍·ğù˙ôûŭóù˙½Ħ˙ôŭĝŬːĦ­ò˙ú˙˙˙˙˙˙˙˙í˙˙û˙˙˙ ™˙˙˙˙ûġ˙˙ŭ˙ŭ˙ò˙ĝ˙ñ˙ó˙ûü˙öúî˙˙˙ŝ˙˙éŝ˙üĝ˙˙ü˙˙˙ù˙ûĝ˙˙˙ñ˙÷˙˙˙úö˙˙ŭ˙˙˙÷˙˙˙˙˙˙˙˙úï˙ûúóŭô˙ü˙ĝ˙ŝ˙˙˙˙˙˙÷˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ŝüŝ˙ûôí˙˙ïû˙Ĥ ³˙ŝì˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙úü˙Ĝ˙¤#&˙Ñŝ˙˙ĈΝ)˙ú˙ê˙ÒÖÍ˙˙˙ôŝ˙÷ÎÏûĝ˙˙˙íŝž# (%Ìê˙ŭòú˙ŭ÷˙˙ü˙ĝ˙ŝ˙›¸î˙š(”˙ċ˙ô˙˙ú˙˙˙˙˙˙˙˙˙½Ş&Ħ×ŝŭó˙÷Éı *"”ù˙÷˙í˙ğӘ.İ&žÜò˙˙˙˙ĵÖĜÚÄö˙ÂÓ÷ÊËòŝ˙˙˙Ÿž×˙˙êÚÇĊÍÀŭ˙ó˙˙ÖÔ!˙ôó˙ŝ˙ġĠĠëĠŬú˙›Ħó1˜ùŬç˙ÔËǨ Ï˙ò˙ôû˙˙˙üö˙˙é˙˙Èğ˙˙ê˙˙˙ü÷ĝ˙üèù˙˙î˙ùÎŬÙùúú˙ì˙˙ñŝŭŝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ò˙ÓÔÌßÛí˙˙ÉŭòÎġ˙˙ü˙˙˙ú˙÷˙÷˙ùŝ˙ŭúĝĠËĜúĝ˙ë˙ŭñ˙˙˙ġú˙˙½˙ǤĈÓñ˙ġ˙˙ó˙˙ŝ˙ĠÉä÷Àô˙˙è˙˙öĝĠñ˙ŝ˙Àĝ˙Éô˙˙ñùŭöÓ×ÑĜö˙˙ú˙ëÄûŝúŝëĜ™!(( û˙ü˙ä˙˙ÌĈÙ÷Ĉ˙öÑÛÁ˙í˙˙˙Œ%Ì˙˙ôô˙Íñ˙˙ġ˙ġû˙ĝ˙ŝŜ#İöġ˙˙ù˙˙˙˙˙˙˙˙˙ñ˙˙ó˙˙ŝàÍßÒÑğ˙Ù˙ï˙˙˙˙÷˙È˙ô÷˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙ù˙ñêé˙ŭ˙˙ôîŭ˙ù˙˙˙˙˙úùÑùŭ˙ŝúò˙Î˙ó˙Ú˙÷úĝ÷˙˙ú˙ÚÉĵËÊÉ˙ö˙˙˙ġ˙˙˙ğÖò˙˙˙ö˙˙ġŝŭüû˙˙ìġĝ˙ŝô˙ġÓô˙˙öí˙˙ú˙÷ì˙÷˙˙˙í˙˙˙ŭî˙ŝ˙öüù˙˙öô˙êéò˙˙ŭ˙˙ġ˙˙˙í˙˙˙˙˙ü˙˙˙üí˙˙˙Ġûŭ˙˙˙˙˙˙˙˙˙˙ö˙ĝ˙˙ôŝÏÛÖÜËŭ˙î˙ĝŭ˙˙˙ŭüŝü˙˙˙ô˙ŝ˙˙íŝ˙˙˙˙ú˙ĝ˙öŭú˙üüû˙ùŝŭ˙úĝ˙î˙˙˙üù˙öôŭġ˙˙˙˙˙îñ˙ù÷úŝ˙˙ŝú÷˙ïŭ˙ŝ˙˙ŝŭŝûŝ˙ŝ˙˙˙ĝ˙ĝúŝöŭ˙˙˙˙˙˙˙˙˙˙üü˙˙˙üüüüŝ˙˙˙˙˙˙ûŝ˙˙˜!•˙ò˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝü˙û˙Ê˘› •ŸÙ÷Ôŝ÷˙˙˙Ï ­³£Ż×ö˙ŝ˙÷ĝĝ˙û˙ûŝü˙ġü˙˙ŝ˙ûö˙˙ġú˙÷ûŭĝ˙˙ú˙˙ü˙˙ĝ˙ò˙˙ó˙ò˙öû˙˙˙Ċ˙˙ü˙üÁĠĈëòŬúŭ˙˙˙ó˙˙˙˙˙˙˙˙˙˙û˙˙à˙ŸË˙÷˙öû˙ú˙ĝù˙³˘œÔ³é÷˙˙ó˙÷˙ü÷ùùûüĝ˙ĝŝù˙ó˙ùü˙˙ò˙˙˙˙˙˙ò÷˙ù˙û˙ĝ÷˙˙ô˙˙˙˙í˙ĝ˙ôĝ˙˙ٙ›Ħ˙˙û˙ó˙ĝ˙˙˙ŭŝ˙îü˙˙˙ô˙˙ûĝ˙÷˙ŝúÍÂ˙ó˙˙ġ˙˙ö˙î˙ëú˙˙ò˙˙˙û˙˙û˙˙˙ĝŭ˙˙ŭ˙üüË˙˙ŭö˙ü˙˙ĝ˙˙˙úŭò˙ĈŠ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝí˙˙˙òġ˙ŝ˙Ï˙˙úÌ˙˙ĝ˙ñú˙ŝó˙˙˙ù˙ù˙Òġ˙˙î˙˙ûû˙üû˙÷˙˙˙˙í˙û˙ö˙˙˙î˙˙÷˙˙ŭ˙ùüŝú˙ó˙˙û˙ĝ˙˙˙˙˙ôíŝ˙üġ˙ùï˙òŝŭŝ˙˙ŝ˙˙öû˙ŝŝ˙˙˙ĝ˙˙˙˙˙˙Ħ  üġ˙ù˙ŭä˙üùú˙ŭ˙û˙˙˙˙ö˙î˙ )Ġè˙˙˙˙˙ŝ˙ñ˙òù˙˙ù˙ñ˙˙˙ŭ˙ŝü˙˙˙˙˙˙˙˙˙ŭù˙˙˙úíì˙û˙ù˙˙˙÷˙˙˙÷÷ŭŝŭ˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭ÷˙˙˙ô˙ú˙ó˙ç˙ĝ˙ûòô˙÷ò˙˙ò˙ùĝ˙˙ĝù˙ĝ˙˙ŝñ˙˙˙ü˙˙Á˙ëô˙ŭú˙ê˙úë˙ìĝüñ˙˙ĝ˙˙ùôú˙˙˙ü˙˙˙ö÷˙˙˙˙ġ˙˙˙˙ù˙î˙˙˙˙îġ˙ŝ˙˙÷˙ĝ˙˙ŝñ˙ú˙˙ú˙ô˙ü˙ï˙ñ˙ŝÓì˙˙ŭ÷úŝÊû˙˙ú˙ŝù˙óù˙ċ˙ô˙˙ü˙ĝñ˙˙ü˙˙˙˙˙˙˙˙ŭ˙˙˙ĉ˙ŭ˙˙ëŭü˙ú˙ü˙úùúóù˙˙˙˙ö˙ó˙˙üñ˙˙˙ġġ˙üüù˙û˙ġ˙ùüŭ˙˙˙ŝ˙ŝ˙ö˙˙˙˙ú˙˙˙˙˙˙˙úŝŭŝî˙˙ï˙˙˙˙üü˙˙˙˙˙÷˙öŭŭŝ˙÷˙˙ŝ˙ú˙ù˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙ŝüŭŝŭŭŭ˙ŝ˙˙ĝĝ˙ŭ˙÷˙˙ŭû˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ġ˙˙˙˙˙˙ŭ˙Ñù˙ŝŭü˙ŝ÷ö˙ë˙˙úûġĝ˙˙ŝ˙ĝ˙˙˙ó˙ùö˙˙˙û˙˙ŝû˙˙˙÷ô˙˙˙ï˙ùüûŭġ˙˙˙˙˙ûŭûŭ˙ù˙˙ò˙˙îġ˙ú˙ŭú˙˙˙˙˙˙ï˙÷˙ü˙˙÷˙ŝ˙˙˙˙˙˙˙˙˙ùüÏ˙˙ĝû˙ì˙ù˙ŝ˙üĝú˙Ŭù˙ĝ˙˙˙ŝġ˙üö˙ì˙˙˙úó˙˙˙û˙úüŭû˙î˙˙î˙˙ŝ˙äô˙öû˙òŝ˙ŝñúùŝûñòŝô˙˙öŝġ˙ùí˙˙˙òñ˙ŝ˙ġ˙ï˙üó˙˙˙ŝ˙òï˙˙˙í˙û˙˙ġ˙û˙˙è˙˙ú÷ŭúó˙˙ŝ˙˙ù÷˙ŝŝŭüŭ˙ë˙˙üŭĝŭ˙üŭ˙ŝü˙˙˙ŝŝ˙í˙ù˙êû˙˙ŭ˙×÷ĞÚû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭġ˙ôùù˙˙üŭ˙ûûŭ˙˙˙é˙ġ˙˙˙˙˙˙ò˙üù˙÷˙ô˙˙˙ä˙˙˙üû˙˙ò˙÷˙ö˙ü˙ġ˙ë˙˙˙ò˙ŝ˙ŭùŝù˙ù˙ú˙˙˙ûïŭ˙ŝ˙Ŝ˙÷˙ĝ˙˙û˙˙˙˙˙ö˙üĝ˙è˙ŝ˙ùúù˙˙˙˙˙˙ï˙ûġŸ 0µ˙ŭ"˙—" ˙ô˙˙ü˙˙ŭ˙˙˙êù˙ö˙˙ôú˙üżö˙˙óŝûü˙ñë˙˙˙˙ô˙ëÚ¸#˙˙ŭ˙˙ù˙˙˙˙˙˙˙˙÷ü˙úòô˙˙˙ü˙˙úŭŭú˙˙îüŝ˙˙ĝ˙ô˙ŭîï˙÷˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙ùî˙˙˙ûŝ˙ôċù˙ù˙˙˙˙˙˙è˙˙ú˙óû˙ûû˙ŝùŭ˙ú˙÷÷˙÷ó˙ö˙ùûú˙î˙üü˙ŭ˙˙ó˙ôó˙˙ó˙˙ġ˙ġñ˙úûù˙˙˙ìíü˙˙˙÷ô˙˙ŭüġ˙˙˙˙üùĝ˙˙ù˙˙ĝ˙òġŝŭĝ˙ûĝ˙ò˙ġ˙û÷˙˙ü÷˙˙˙ĝ˙˙úĝ˙˙˙üô˙ùô˙ï˙÷˙ú˙ŭ˙ú˙ü˙˙˙˙˙˙˙˙˙˙ö˙÷˙ì˙˙ŝ˙ò˙ú˙ŝ˙˙˙˙˙˙÷÷ŝö˙û˙û˙ŭŝü÷˙˙ó˙öùñ˙ĝ˙˙˙öüïŭû˙˙úü˙ûûö˙ô˙î˙˙ŝ˙û˙˙˙˙˙ú÷˙ŝĝû˙˙ûĝŝô˙ùŝ˙÷˙˙˙˙û˙ŝŝ˙˙ŭ˙ùŝŭù˙ô˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙ŭŭ˙ŝûúŭ˙ù÷ü˙˙˙ĝí˙˙ïù˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ĝ˙íĝúüò˙˙ú˙ûĝûü˙ú˙˙˙î˙ü˙˙˙˙˙î˙ŭ˙˙ĝ˙ġŝú˙˙˙ú˙üŝóú˙ĝ˙˙ñü˙˙˙÷ġ˙û˙ŝ˙ĝġ˙˙ü˙˙˙ġ˙ŝñ˙˙üĝ˙˙˙˙ċ˙úò˙˙ŝû˙÷˙˙ŝ˙ġ˙ĝ˙˙˙˙˙˙˙˙˙˙ô˙óĝûŭ˙ñ˙˙˙ŭġ˙˙ŝ˙ò÷ŝŭ˙ë˙˙ù˙ü÷˙ü÷˙˙ó˙˙ëüŝó˙û˙˙˙˙ġú˙˙ĝ˙ġ˙˙˙÷˙ú˙˙ŭ˙˙ĝŝŝ˙˙˙˙˙è˙˙˙úü˙÷ŭó˙˙˙˙ô˙úü˙˙˙˙ë˙˙˙˙˙ó˙ĝ˙˙˙˙üü˙îô˙ŝ˙ö˙˙úŭĝ˙ŝûó˙ŭ˙˙˙˙ĝï˙˙ú˙ùú˙˙˙ŝ˙˙úúûġ÷˙˙ĝ˙ġŝ˙˙ùĝġ˙ûúù§Ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ûù˙˙ò˙óöû˙ĝ˙ŭ˙ù˙˙ù˙˙úùġ˙˙ù˙˙ù˙ò˙öúù˙˙ŝŭòŝ˙üŝ˙˙óü˙ù˙˙˙˙ú˙˙˙ù˙ŭ˙˙˙ü˙˙˙˙ŝôù˙˙˙÷ü˙˙û˙˙ü˙÷ó˙é˙˙î˙˙˙í˙÷˙ê˙˙˙˙üúŭù˙ù˙ùüÎ'—˙˙ûöŭ˙Ì Ŭĝġï˙üŝú˙ñ˙ö˙˙ö˙˙˙ç˙ŭ˙ù˙ÚĊ˙úó˙˙˙ó˙˙˙ŭèĝñ˙ĝŭŝŞġ˙˙öú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝí˙÷úò˙ŭ˙˙ûû˙˙ö˙ó˙ñ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙ŝûĝ˙˙˙˙˙ú˙˙˙ì˙ò˙ú˙˙˙˙˙ô˙ù˙˙î˙˙˙ò˙ûö˙˙˙˙˙˙˙ġóû˙˙ü˙˙û˙ï˙˙ŭĝù˙˙ç˙˙üû˙˙ô˙óú˙ŭ˙ûŝ˙˙ûöòŝ˙˙úö˙ŭ˙˙üôûŝ˙üüúû˙˙˙ŝü˙˙˙ï˙û˙˙˙ù˙öúó˙ĝ˙˙˙öôü˙ùü˙ùüüü˙ĝ˙˙óŭúò˙úóŝ˙˙ü˙û˙˙˙˙˙˙˙˙˙˙ġ˙˙ü˙˙÷ó˙ùü˙ĝĝŝ˙˙ĝĝ˙˙˙˙˙˙˙˙ĝ˙˙˙ú˙˙üùŝ˙ó˙˙˙ù˙˙ë˙˙˙˙˙ö˙˙ŭŝ˙ô˙˙˙ö˙˙˙˙˙ô˙˙ŝĝúĉ˙˙ç˙˙ŝü˙˙üŝ˙˙˙ûĝ˙ŭ˙ĝ˙ü˙ú˙ŝ˙˙ò˙ü˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙ŭûŭ˙˙˙˙˙÷˙˙˙÷ĝŭö˙˙òŝ˙÷ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷÷˙˙˙ŝ˙û˙ŝ˙ù˙û˙˙ôü˙˙ô˙ô˙ü˙ġ˙ġ˙ü˙ĝü˙ñ˙˙ĝ÷ŭ˙ù˙ŝ˙˙˙˙˙ñ˙˙˙˙ù˙˙û÷˙ġ˙ŝü˙˙ôŭ˙ü˙ü˙÷˙ĝĝ˙ù˙ù˙˙ò˙ŭ˙ó˙˙ú˙˙ö˙ĝû˙í˙˙˙˙˙˙˙˙˙˙ô˙û˙˙ò˙ó˙ûü˙ŝ˙úúù˙ôü˙ó˙˙˙˙ó˙˙˙ĝŝ˙ĝ˙˙í˙˙ó˙ú˙ùĝŭ˙ù˙í˙˙ñ˙ŝúû˙ú˙˙÷ùú˙˙ó˙˙˙ûùôù˙û˙˙ò˙ö˙˙˙ĝ˙ĝ˙ô˙ŭ˙ŭ˙ġ˙ŭû˙˙ü˙ûü˙˙ü˙÷˙ùù˙úû˙ú˙óŝ˙˙˙ú˙˙ĝ˙˙ú˙˙ù˙ġò˙˙˙ì˙÷˙˙˙˙˙˙ŭŝ˙˙ü˙ŝ˙ü˙˙˙ñ˙úñ˙üŭú˙İ%ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙î˙ŝĝ˙ú˙˙ü÷ŝ˙ĝŭ˙˙˙ù˙˙˙˙˙ü˙˙÷˙ŝ˙ö˙ú˙óúû˙˙˙ĝô˙ġü˙˙˙ŝ˙ì˙˙˙ġ˙ĝ˙ŭ˙ŭ÷˙üú˙÷˙˙ŭ˙ì˙öü˙ĝ˙˙ó˙˙ö˙˙ó˙˙ü˙˙úú˙ĝü˙üù˙ûü˙ü˙˙ù˙˙ŭ˙֘! Ħ˙˙˙ĝ˙ŭï˙˙˙ù˙ĝ˙ö˙ûü˙˙˙ú˙˙˙ï˙˙ġô˙ô˙˙˙ú˙˙û˙ùö˙˙÷ú˙úÚ ü˙ŝŝ˙úö˙˙˙˙˙˙˙˙˙ŭüŝ˙˙˙˙˙˙ĝ˙ëö˙ü˙˙ö˙ú˙ú˙˙˙ùû˙ŝù˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙ĝ˙˙˙ì˙˙ù˙ë˙ó˙˙˙ġ˙˙˙û˙˙ö˙˙˙˙˙ú˙ġ˙ü˙ò˙úô˙ü˙òû˙˙ñüü˙ûü˙˙û˙ŝ˙ü˙ó˙˙ë˙ü˙ú˙ùŝô˙˙ô˙˙ĝû˙˙˙û˙ŭ˙˙ò˙˙÷÷˙˙˙ô˙û˙ŭ÷˙ŝò˙ü˙ôô˙˙ûñ÷ŝ˙˙ô˙ŭŝ˙úú˙˙ŝûŝ˙ü˙˙ŝ˙÷ŭ˙î˙˙ü˙ŭû˙˙ö˙ŝû˙ù˙˙˙˙˙˙˙˙÷˙˙ĝ˙˙í˙˙˙˙˙ĝ˙ù˙û˙˙˙˙˙ü˙üŭúŝü˙óŝü˙˙û˙˙öŝŝŭ˙˙˙ŭ˙˙˙üö˙˙˙ôü˙˙ġ˙˙û˙ŭ˙ï˙û˙ŭ˙û˙˙˙˙ŝŝ˙üĝ˙˙úú˙˙ĝŝü˙˙˙ŝĝ˙ù˙ŝ˙ŝùû˙ôŝü˙üú˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙ü˙˙˙üü˙˙üüŭû˙˙ŝŝŭ˙˙ôŭ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ó˙˙¨‘˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ü˙àŭ˙³&˙Îüü˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûÖ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü÷ġ˙ŝ£)˘éÔ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙üö˙ ”"™˙÷˙ŭ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙*¤˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ú˙ĵĤ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñĝâ*"#û˙˙üü˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ$ #Ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôġ÷˙˙Í÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙ú˙˙÷­ Ì˙í˙ĝŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üó˘ĠÈü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙˙ġġĝµ•Ÿċû˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĉ˙ĝö˙˙˙ñ˙˙˙˙úü˙ŭ˙û˙˙ŝ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝûú˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ĝü˙úĝ˙î˙˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ġ˙ñ˙ì˙˙˙ŝ˙ŭ˙ñ÷˙ú˙ŭûú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ċû˙˙ŭù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ùŝ˙úùö˙˙ĝ˙ġ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôû˙˙˙˙üò˙˙˙ò˙˙û˙ù˙úŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ĝ÷˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú÷˙˙û˙ŝö˙˙ï˙÷˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙˙ü˙÷ŝû˙˙üù˙˙ü˙î˙˙ŭ˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙ú˙ûĝ˙˙ùö˙˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝ˙ûŭú˙ŭŝĝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùĝ˙ŝ˙˙üô˙˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙ú˙óŝ˙˙˙ó˙˙˙˙˙˙˙˙ü˙ŝ˙ñ˙˙˙ŝ˙˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝġ˙ö˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ù÷˙˙ù˙û˙˙˙˙˙˙ü˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙ŭ÷˙˙úŭ˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ŝ˙˙˙üûüû˙ŭù˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙â˙ŝü÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝ÷˙˙ö˙˙÷˙˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙úù˙ŝùŭ˙˙ü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûüú˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ö˙ĝ˙˙˙˙úĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙˙˙ŭ˙ġ˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙˙˙˙˙˙˙˙ùúĝ˙ûù˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙ö˙ĝ˙ŭûüĝ˙˙ŝüùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙ŝôû˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ĝŭ˙û˙˙˙˙úġú˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ĝŝ˙˙÷ŝ˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙úòû˙˙˙˙˙˙˙˙˙ŝŝĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙ġò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙ŝù÷˙ĉŭ˙˙üû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙˙˙˙˙˙˙ö˙ïü˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñŭ˙ŭú÷˙˙û˙ûúŭ˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ïŭùġóġ÷ŝ˙˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙î˙òü˙˙˙ĝûŭö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üòú˙ġĝùĝ˙ù˙˙˙˙˙˙˙˙˙˙˙ûúûóü˙˙ĝ˙˙˙˙˙˙˙˙ġ˙˙˙ŭüú˙˙˙ú˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ûô˙üĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ïüù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñġ˙ùĝ˙˙˙˙ü˙˙ŭû˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙ŭü˙ñ˙˙ùŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙úü˙˙˙úôöġ˙˙öú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ùġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ûŭ˙˙üŝü˙ñŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ŝ÷ú˙ö˙˙˙ĝ˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ì˙˙ò˙˙ŝûÓŝ˙ú˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭó˙îŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙û˙ĝ˙ĝ˙ŭŝŭ˙˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùú˙ŭ˙˙˙öûü˙û˙ùû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŭ˙ŝ˙˙˙˙˙˙˙ù˙ŭ˙˙˙˙˙˙˙˙˙ü˙˙ŝú˙ûû˙˙˙˙˙˙˙˙˙˙ôòû˙˙˙ĝûö˙˙ŭùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ò˙˙˙Ëú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üôü˙˙˙ŭŭü÷ĝŝ˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙ü˙˙ûú˙˙˙˙˙˙ùŝ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝ˙˙˙˙˙˙ĝŝÓ˙úġ˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙ï˙ĝ˙ŭ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úġ˙˙ŝ˙˙˙ï˙˙ôû˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ŝ˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ùò˙˙ŭŭöö˙˙ñ˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ŭ˙˙ö˙ö˙ĝ˙˙é˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙˙ü˙ü˙˙óŝóŝû˙˙˙˙˙˙˙˙˙˙óġŭ˙ûû˙˙˙˙˙˙˙˙˙ġ˙˙ü˙˙ĝġ˙˙éíŭú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ö˙öôü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ġûú˙˙˙˙˙ûûŭŝ˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙÷˙˙ġ˙òò˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙ŭġú÷˙ú˙˙ĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙êŭ˙˙öĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ŝôĝ˙˙ô˙Ëú˙â˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ß˙úúġ˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙˙ÊÌËĦÇü˙˙óú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙îúġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ÷˙è˙˙÷ñ˙˙ü˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ŝû˙óü˙˙ï˙ĝÔó÷ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭôĝ˙˙ñ˙˙˙˙ŭú˙˙˙˙˙˙˙˙˙ĝ˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙ù˙˙ŝ˙˙˙Öċ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙é˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ôġ˙ĦŸ´À˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙˙ü˙üöñôŝ˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ŝ˙ŝú˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙ùŭ˙˙ûŭ˙˙í˙ŝö˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝŝû˙˙˙üĦ²”˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ò˙ġ˙˙˙úû˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úۑ& % -žËùí˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùûü˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üö˙˙óÈäÌö˙ġŝ˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ù˙˙˙½½²ÒÓû˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭüû˙˙üÏĞĈÒÇ˙˙üú˙˙˙˙˙˙˙˙ü˙ŝŝí˙ġ˙˙˙˙˙˙˙˙˙ĝ÷˙˙*#0˙˙ŝú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ïü˙Í˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝԞ( Ż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙óö˙ù˙ŭ˙˙˙éòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙ŭŭĝ˙ĈÔÎÏòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ùÎĥô˙ú˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ĝÌ­¸Ûó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙˙˙ì'& óï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úô˙ù˙˙ۚ´żŝûúû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ëĜ&ž%û˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä˙ñö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üüÑ —˙ĝ˙ö˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝù˙û!&¤÷ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŝû˙ĝ–!Ç˙˙û˙˙˙˙˙˙˙˙˙&š˙ĝ˙ù˙˙˙˙˙˙˙˙üĝ˙ŝÇ/)–˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙Ë£ ¨˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙× ! !˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭ0˙üúü˙ó–) &Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙ŭ˙˙÷%Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙ô˙˙ö˙ü™! ˘ü˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙“/-’˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ĝ˙˙è² Ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ĝ˙Â! Ê˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ËôĞ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙žÑü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙üûüûü£Ò˙˙ò˙òò˙ö˙ú˙ù˙˙˙˙÷˙úŝŝ˙˙˙˙˙˙˙˙˙ŝŝŝ˙ùŝ˙ô˙˙ù˙˙˙ĝ˙ùü˙ŝùŭ˙˙˙˙˙˙˙˙˙ù˙ì˙˙ĝŭ˙˙ġ˙ñ˙˙˙˙˙˙üù˙ò˙˙ŭú˙ĝĝ˙úŭ˙˙˙˙˙˙ŭ˙÷˙ö˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ĝü˙˙˙öùĝ˙˙ùü˙˙˙í˙ö£ *û˙ö˙ŝŭ˙ŭùû˙˙ñ˙˙˙˙ŝġ÷˙˙û˙˙ù˙ŭ˙˙úùŬ Ĝŭĝ˙˙úü˙˙ú÷ŭü˙˙ŝŝ˙˙˙üŭ˙˙˙ĝû˙¤' òŭ˙û˙ŭ˙˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úû˙˙ŝûŭ˙ŝ˙˙ó˙˙úùú˙˙ñŝ˙ĝ˙ŝŭ˙ŭùû˙˙!˘û˙˙ŭü˙˙ú˙ŝŝ˙ŝû˙˙˙ô˙˙üö˙ġÉ$ž˙öú˙˙˙˙˙˙ŝŭ˙ŭùû˙ú˙ñŝ˙û˙ŭ˙˙˙˙˙˙˙˙ŝ˙˙˙üûüûüŝ˙ŝ˙˙ù˙˙ŭ˙˙˙˙˙˙ŭÙ$—Ü˙˙öü •˙ùú˙ĝ˙üû˙˙˙˙ŭŭ˙û˙ĝġ˙ùú˙˙˙ö˙ŝûûûûŝ˙˙˙˙˙˙¤  ˘ûû˙ŭŭ˙ùúŭ˙û˙û˙˙˙˙˙˙ŭŝŭ˙ô˙˙ñ˙˙üü˙˙˙ó˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙ù˙˙˙˙ú˙˙ûú˙úüŭŝ˙˙ú˙ġ˙˙˙ŝ˙üú˙û÷˙ĝ˙˙ŭŝ˙ĉ˙˙˙ŭ˙ûŭġ˙˙ŝûŭ˙˙˙ŭĝ˙˙˙ù˙˙ôŝ!˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ê˙˙ó˙˙ù˙˙˙ŭ÷˙ŸÏûû˙ô˙˙˙ú˙˙ŝŝŭ˙˙ûû˙ñ˙˙˙ò˙ú˙˙˙˙˙˙˙˙ŝŭû˙˙Ñú˙˙˙û˙ġ˙˙˙úŭ˙˙ĝ˙˙ö˙ĝÈ ˘˙üü˙Ĉ# #–Ó˙ŝ˙ġ˙˙óŝ˙úŝ÷˙˙ġĝ˙˙˙ü˙˙úúü˙û˙˙ŭ˙ŭó˙˙˙ŭ˙÷ŝ˙ûŝ˙ŝ˙ŭû˙ûò˙ŝŭĝ˙ĝ˙ù˙˙ùö˙˙úŭŭü˙˙ŝú˙˙ö˙˙ġ˙ö÷ŭü÷˙ò˙˙˙ŭŝ¤ž˙Öô˙ï˙˙ŝ˙úġ˙˙ò˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úòû˙˙˙˙­ !!'Ĥùŭó˙é˙˙úŭ˙˙˙ĝü˙ùñ˙˙˙ŭ˙˙˙˙˙˙˙˙˙÷úú˙˙˙ùŝ˙˙˙˙úö˙˙÷˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙ì˙úîŝ˙˙ô˙ú˙üŭ˙˙˙ġ˙˙ù˙ù˙˙÷˙˙˙˙÷˙ùŝ˙ûû˙˙˙˙˙˙ô˙˙ĝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭùû˙˙˙˙˙˙˙˙ĝ÷˙çÑ  .Ŝġĝ˙˙üû˙˙˙˙˙ü˙üĝĝúĝ˙˙ĝûû˙ĝ˙˙˙÷˙˙˙ŝ‰& + Ôñ˙ú˙˙˙ġû˙úß!!ŭ˙˙˙˙ŝôû˙˙˙ú÷˙˙î˙( Ÿŝŭ˙˙ùöĝŝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ŝŝ˙˙˙÷ö˙ü÷˙˙ûü˙˙ŭü˙˙üû˙˙˙˙˙˙˙ä”)•˙˙˙ŝŭ˙˙û˙ŭ˙˙˙ŝùùû˙˙íŝ˙ë˙˙  '›ù˙˙úŝ˙ò˙˙üû˙˙˙˙˙ġ˙˙ó˙ŝ÷˙˙˙˙˙˙˙˙˙˙úòû˙˙˙˙˙˙˙ö˙˙˙˙˙˙ûû˙ŝù˙Ïġ÷˙˙Ô$ô˙ö˙îñ˙˙ûñŝü˙ú˙÷î˙× %)ï˙˙ŝġù˙ŝ˙˙˙˙˙˙ŝŝ˙˙ġ×ȑ&­˙˙˙ŝî˙˙ŝ˙ùŭü˙˙ù˙û˙ú˙ô˙ú˙ú˙˙ûü˙ù˙ûù˙ĝ˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ŭû÷˙˙üù˙˙˙˙˙û˙ùŝ˙ó˙˙ó˙˙˙÷úû˙˙˙ùŝ˙˙ê˙ŭò˙ü˙ŝû÷˙˙˙üŭ˙˙˙˙ù˙˙˙˙öú˙˙˙˙üü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ò˙÷ñ˙˙ôŭû˙óĊ‘0 ˙˙˙˙ŝġú˙˙íñü˙üû˙˙˙˙˙˙˙ġù˙˙˙˙˙˙˙˙˙˙ü˙ï˙˙Ë#"-İ˙ü˙ġ˙ŝ˙ŝö˙ù˙ù˙úû÷˙ú˙Ù¤ìŭ˙ê˙¨˙˙˙˙ĝ˙˙˙˙ü˙˙˙ù˙˙ûï˙üŝñŝ˙˙˙ŝö˙˙ñ˙ŭî˙ġüù˙˙˙ï˙ùúüù˙˙˙˙ô˙˙˙ġ˙˙˙÷÷úŭŭ˙íüô˙ü˙ú˙üŝ˙î˙˙˙˙˙˙˙î˙ùüŝĤ˙ô˙ĝ˙ïöà'ÇÇ˙ŝ˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙˙˙úôö# /Üûó˙˙˙ŝ˙˙ûù˙üñ˙˙û˙ûŭ˙ĝ÷˙˙˙˙˙˙˙˙˙˙˙˙ù˙÷˙ĝ˙÷òû˙˙ŝ˙ü÷˙˙÷ûŝûû˙˙˙˙˙˙˙˙ù˙˙˙˙˙ĝù˙˙˙˙˙ŭ˙ĝ˙÷˙˙úŝ˙ü˙÷ûúúû÷˙ü˙˙ŭû˙˙ŝĝ˙ŭ˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙üù˙ĝöûŭûŭ˙ñ˙Ô"!Â˙˙óò˙˙˙û˙˙ûû˙˙˙˙ŝ˙˙÷˙˙˙˙ĝôŝġ˙ú˙÷˙˙ü÷üŭ˙˙Ÿ Ÿù˙÷ú˙úöŭ˙˙ùñ›˙˙˙ùû˙˙˙ĝòôŭ˙ŭ˙˙üŝÈ$˙˙˙˙˙˙ú˙˙üŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝüŝ˙û˙ŭ˙˙˙÷˙˙˙öú˙˙÷˙˙ûû˙˙˙˙ŝî˙ê˙  Ĥ˙˙˙ŭŭ˙˙ŭ˙ŝûŝ˙˙˙˙˙˙í˙ö˙˙è˙˜/ Ĵŝ˙ü˙é˙˙˙˙ûû˙˙˙˙ŝ˙˙˙î˙˙ĝú˙˙˙˙˙˙˙˙úü˙˙˙úôöúŭŭù˙ġ˙úŝ˙˙ûŭ˙˙üŝü $˙˙ñü˙—!ĞÇ˙˙÷˙˙˙˙ò˙˙˙ò˙˙˙˙ú˙˙  É˙ùö˙˙÷ŝ˙˙ûĝĝû˙˙ñ˙òù˙˙Ó 7½üûĝü˙ġñ˙˙˙˙˙˙üô˙ŝ˙ü˙˙˙ù˙ñŝûŝ˙˙˙ù˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙÷û˙˙ŝ˙ûŭö˙û˙˙˙úú˙ò˙ŭĝ˙ŭü˙ŭŭ˙û˙˙˙˙ñ˙˙ñŭ˙˙ü˙ö˙˙ĝü˙ĝ˙ú˙˙ü˙ŝ˙˙ûò÷˙˙((˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝüú˙˙ŭ˙ġ˙˙ŝ˙ö÷˙Ú !"Ÿ˙ĝù˙˙˙ù˙ŭ˙ŭ˙ŝûŭ˙ŭôó˙ûû˙˙û˙˙˙˙˙˙˙˙ö˙˙÷ó˙ ½˙˙ġ˙ü˙î˙˙÷˙ñ˙ŝ˙ŝó˙ċ˙Ş Î˙˙˙˙ŝ -úü˙˙ùŭŝŭú˙˙ú˙ġ÷˙˙ö˙˙ù˙˙˙˙ûöú˙˙ä˙üô˙˙ò˙˙ú˙˙˙÷˙û˙û˙˙˙ĝ˙é˙˙ŝ˙÷˙ĝì˙ú˙ù˙˙˙˙˙ü˙˙üŭï˙™˙ú˙Ϙ’šÒ˙˙ŭŭ'% ›­ŝù˙ ßĝ˙ö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ûú˙˙˙2³ï˙ú˙˙ù˙ë÷˙˙˙˙˙ġ˙˙ûùû˙˙˙ü˙ò˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙üö˙˙ù˙˙ùü˙˙û˙˙˙˙˙˙˙˙˙˙ċû˙ùòŭ˙˙í˙ïŭ˙ü˙ùû÷ĝ˙ï˙ù˙˙˙ŝŝ˙˙˙˙˙˙˙˙˙ŝú˙ë˙˙ĝü˙ê˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öùù˙÷˙ùŝ˙˙˙˙˙öö˙ùŭ˙üú˙˙ùô˙˙üŝŭŭ˙˙ŭüŭ˙ó˙˙ûé˙ôñ˙˙˙˙˙ì˙ŭ˙ù˙˙ö˙4 üú˙˙ŭöû˙˙ùŭ˙˘(”˙ö˙ŝüŭ˙˙ŝ˙˙˙üó˙ĝù˙Ħ&šġ˙ŭù˙˙ŝ˙ûĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŝ˙ŝüûŭ˙ù˙˙˙ì˙˙÷û˙ŝú˙˙ŭ˙ŝŭŭ˙˙ŭüŭ˙˙˙˙üŭüûü˙˙˙˙˙üüŭŝ˙˙÷ëŬÌ˙öô˙˙éÈ ˙ü˙ŭ˙˙˙ò÷ŝŭŭ˙˙ŭüŭ÷˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙ü˙˙ûú˙˙˙˙÷˙˙˙ò˙˙úŝ˙˙˙˙˙˙˙˙˙Ĵ$ŭñ˙˙û˙Ôúġ˙îû˙˙˙ûîŭ˙˙ĝ˙ü÷û˙˙÷öÚÌŜ˙˙˙û˙ŭ˙˙ü˙˙˙˙˙˙ü˙˙˙˙ïċ˙ûÒÎï˙˙˙˙˙˙˙ŭ˙ĉ˙˙ŝ˙ŝ˙ŝ˙ĝĝöŝ˙˙ĝ˙˙ĉ˙˙ñ˙˙û˙ì˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙üġ˙ŭü˙ùġó˙ġ˙ŝ˙ü˙ŝ˙ùó˙˙ùŭ˙û˙˙û˙˙˙üôŝ˙˙˙ò˙˙òġû˙ŝ˙ŝ˙˙˙ô˙ŝ˙÷ù˙˙öü˙˙˙˙ŭ˘#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üú˙˙ñ÷›ó˙òŝ˙˙çÎ,ñ˙˙ġ˙ì˙úùû˙ŝ÷˙˙ü˙˙˙˙˙ñŭ˙˙û˙˙˙˙˙˙˙˙˙ó˙ĝ˙˙û  Ùü˙ġ˙˙ï˙˙ŝ˙óû˙˙ĉ˙ŝñ˙˙”"²˙úì˙Í$ Üŝĝù˙ñ˙˙ê˙ü˙ŭ˙˙ú˙˙ĝï˙ŝêö˙˙ŝ˙ï˙ûŭ˙ùúû˙˙ó˙˙á˙ŭô˙˙÷ê˙úŭ˙ñ˙˙è˙ê˙˙ŝúΝ—Ì—˙ŭ÷ŝò˙'(– ,%§î˙˙£ #˘ü˙˙#¤˙ ˘ïô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙ŭġ!Í˙ŭù˙óŝ˙˙˙˙˙˙Ŭ˙˙˙ö˙˙ĝ÷òûŝ˙ŭ˙˙˙˙˙˙˙˙ŝû˙ù˙ùùñŭúŝ˙üü˙˙ĝŭüûŝ˙ŝ˙˙˙˙˙˙˙˙˙ó˙˙—˙˙ö˙˙˙˙û˙ü˙˙˙ŝô˙˙úŝ÷üŝ˙˙ŝü÷˙ĝôŝ˙˙ŝ˙˙˙÷˙ġ˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úñ˙ġŝŭ˙˙˙ĝ˙˙ò¤#™˙˙ùŝ˙˙ŭûùöü˙˙˙üü˙˙ŝŭ˙˙˙˙˙˙˙üùè˙ŝ˙üûüó˙ŝ˙òÏ.Ú˙˙ñùù˙˙ŭö˙˙˙˙üĝï˙˙ò˙˙˙ŝôû˙˙óû˙˙˙ü˙ì4%Ğû˙öŭ˙˙˙˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙ŝŝŝŝ˙˙öù÷˙˙˙ŭ˙˙˙ŝû˙üü˙˙˙üü˙˙˙óúé“+ ˙ŝŭŝ˙ŝ˙˙ú˙˙˙˙ŭùö˙ÒÍŝ˙úĝû˙˙  ""˙ö˙ùóü˙ûü˙˙˙üü˙˙˙ûŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙ĝĝ˙˙ŭġ˙ì˙ö˙˙úû˙ŝ˙˙ŝôĝ˙û˙ò¨˙˙ïú˙ĝ˙˙Ù˙˙˙ïú˙ŭ˙˙úñ˙˙ùö˙˙ġ˙˙˙í˙ìúĝŭ˙˙ùúùŝ˙ŝĝĝŝ˙ŝüô˙˙˙˙˙÷˙ù˙˙ĝŭüö˙ú˙˙û˙˙ùüŝ˙ò˙ü˙˙ùŝ˙û˙ûóù˙ì˙˙÷˙˙ù˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙ñû˙˙ü˙˙˙˙˙ĝ˙ç˙˙öŝ˙˙˙ü˙˙ŝ÷˙˙÷ĝŭñ˙˙ü˙ùê˙ú˙˙˙˙÷üŭ˙ŭ÷ûñ˙ü˙ŭ˙˙üü˙ŝúŭŝö++˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝü˙˙íŭáÒî˙˙˙ú˙ŭ çâ˙ŝ˙˙óú˙ġ˙ú˙ü˙û˙˙˙²ñ˙ŝó˙ü˙˙˙˙˙˙˙˙˙û˙˙ôô˙Ż,Ê˙ĝ˙óŭ˙ëŭñÜ˙˙˙ŭ˙˙˙˙˙Ç'Ò˙úßï‘# ˙ßŭç˙ú˙˙˙ö˙ü˙˙ö˙ûô˙û˙˙Ñ×Ç˙˙˙˙ĝŝ˙ñ˙ŭÈÑ˙Ĉ˙Î×˙˙óù˙˙öÛÇ×˙ĊÔÙó˙ú˙ô˙İ% ĊÒĜ˙÷– /"Î˙ô#,š­í˙š$ÊüÌ §˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ûŭ˙—ŭĝ˙˙ŭ˙ŝù÷üŝĝ˙˙˙û˙ü˙˙˙ü˙˙ŝò˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙˙ŭó˙˙˙ö˙ú˙˙˙ñĝ˙ù˙˙˙˙˙˙˙˙˙˙Ğżü˙ĝüñó˙˙ó÷÷˙÷ô˙î˙˙˙ó˙˙ó˙˙˙˙ûŝŝû˙˙ñ˙ò˙ŝöó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŝïñ˙˙˙ö˙˙ûñ˙˙ŭ˙ùĝ )ċûü˙˙ŭ˙˙˙˙˙ú˙˙˙˙˙˙˙÷˙üö˙˙ç˙˙ó˙˙üŭ˙˙˙ú˙˙é˙˙Ĝ'ĝ˙˙ŝ˙ŝ˙ŭûŭ˙˙úû˙˙˙÷ġ˙ŭ˙ùü˙˙ö÷˙ŭûĝú˙˙ò$ 0˙˙˙úö˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ŝ˙ŭúô˙ùó˙˙˙üúŝ˙ŝ˙ú˙˙˙˙˙˙˙ü˙˙Ö( ˙˙˙˙˙ŝŭŝ˙˙˙ŭ˙˙˙˙˜È˙Í˙÷˙éĝ"Ĵŭù˙ùÜ˙ñú˙˙˙˙˙˙˙˙û˙ĝôüí˙˙˙˙˙˙˙˙˙˙ùŭ˙˙ûŭ˙ú˙˙üü˙ŭ˙˙˙ûŝŝû˙˙úŭ˙$2­î˙˙˙üí˙ä˙ûö˙ŝ˙˙úö÷˙˙ŭúûŝûġ˙˙˙ö˙˙˙˙˙÷ĝ˙˙ü˙˙˙˙üü˙˙˙˙˙˙óì˙˙˙÷ßìô˙˙˙˙˙ŝû˙ĝ˙˙üġŭâùñ˙ô˙˙ĝ˙óù˙÷ö˙ùé˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ú˙˙˙ġù˙îùö˙ò˙Ú˙˙ùú˙öò˙îŝü˙˙˙˙˙˙ĝûùñ˙˙ó˙é˙ŭößüŝ˙˙˙˙˙˙˙˙˙˙ö˙˙˙óŭ˙Ñ˙‘$˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙óôäŝ„$(—˙ċŝ˙ġ˙ŝÁ˙˙˙ż÷˙ú˙˙ġù˙û˙˙˙˙ìDz¨žô˙òŝ˙˙˙˙˙˙˙˙˙˙í˙˙˙ Ü˙ù˙ŝú˙˙óĴ—˜ġ˙ö˙úúöÊŻ$Ċìŭ˙Ú'+ ˙ûŭ˙ü˙ú˙é˙˙ïŝ˙ëĦ“š˘Òóġ˙˙˙˙Ĉ  $ ˙á˙˙ñ² !'Íûŝ˙ ˙˙&%â˙ú/!™˙˙÷ Ö˙úġ˙˙˘- òÛ˙Ïžùâ˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ù¨!Ì˙ùû˙˙ġË˙˙öŭŝà˙ŝú˙˙÷˙ŝê˙üö˙˙˙˙˙˙˙˙˙ú˙÷˙ñ˙ßĜ˙˙ò˙˙ĝ˙˙ìĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$›üÓ˙˙˙˙öûû˙˙˙˙˙úï˙ġ÷˙˙˙˙˙˙÷ì˙˙˙ûŭ˙˙˙÷˙˙˙É˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙˙˙˙Ë˙˙ù˙˙ĝ˙˙˙#" ‹˙ŝö˙˙˙˙˙ŝŭ˙˙˙˙˙ŭò˙í˙òŝ˙ù˙úŭú˙˙ŭû˙ŭ˙÷˙˙ùÏ +Ò˙üúùóèï˙˙üù˙˙ëÜí˙˙˙˙ĝô˙˙ñìö˙÷˙ŝà˙˙$( ÁĞ˙ûĝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùġú˙˙ŭüü˙ŝÂÓġ˙ó˙˚Ó˙˙˙ŭ˙˙˙˙˙ŭòġ˙ĝù İûùü˙˙ŝü˙˙˙úĝ˙˙ŭñ ×üò˙˙Ċ˙İ Òü˙ò˙ù˙ò˙ŭ˙˙˙˙˙ŭò˙ú›™˙˙˙û˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ù÷˙Úġ˙ŝú˙˙˙ŭû˙˙˙ì˙ò˙ Œ˙ù˙÷ñ˙ùù˙˙û˙˙óú˙ĜÏÎËŞÔĝ˙ŝ˙ċ˙ŭŭ˙üôö˙˙ĝö˙ıÜğ××ğŝóô˙˙ġĝ˙ü˙˙ŭ˙óûùŝ˙˙˙˙˙íĠŜÒÒî˙˙˙˙˙˙ó˙ü˙˙ü÷˙ŭ˙˙żÚòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙ìÔÖ˙Ô˙˙ù˙˙ìġáġ˙Ë×ËÒĠ˙û˙üú˙üĉ×לäÍú˙ú˙˙û˙ŝĝŜÊÌËûŭ˙ġ˙˙ĝ˙˙ò˙˙ú˙ܧò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŝ˙ïš#ÒÏ˙˙û˙˙Ì÷˙!!ô˙ô˙ú˙ö˙úÒÊĴ Ì˙ŭ˙˙˙˙˙˙˙˙û˙ġ˙ĝö˙ *ŭ˙˙ĝŝٕ "" /˙ûŭ˙˙° ! Ż˙˙ö™% ˙˙úú˙˙ĝ˙ó˙˙ù˙É)2 ˙ù˙÷üÉĊĦ)›˙í˙˘ ĦŸ( ÒùÓ /˙+§ä˙ߟ2 Ú˙öüĦ­ë˙˙­''öù˙˙ù÷Ğ-¤Íô˙Ĉï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙ö˙ü™! #×˙ú˙˙ĤŞú˙Í'™É˙˙ù˙˙Ĝ™ĤÉ˙ù˙˙˙˙˙˙˙˙ĝ˙î˙ݘ- "À˙úŝ˙û˙˙Ÿ§ù˙öŝŭ˙˙˙˙˙˙˙˙Í£!ù˙ö˙üġ(–Ħ˙úôͤ˜¤ö˙ĝĝ˙ö¤²è˙˙ĝ˙˙ùŝœ#œ ˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ĊŽàġ˙ŭ÷˙˙Ë % Ÿ˙ŭû˙ŝĝŭ˙˙˙üŭ˙˙ñÜ™¤˙˙Èž¨ž˙î˙öôŬ˜˙úü˙&›˙Î$ĦĜò˙˙ŭ˙˙˙ù˙ó˙˙ŭï˙ġ˙˙ô˙û—œ˙ù˙üü ! " %˜˙˙ö˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝòëò˙˙û˙ŭ˙ûŸ˙˙Î˙”'”˙ŝü˙˙üŭ˙˙ñÜ˙÷˙ô"›ïîôŝ˙ŝŝ˙üŭ˙˙˙ĝŞœݨ”ŝ˙ۚ!Ξ—˙ú˙˙üŭ˙˙ñÜĦ&Ë˙˙˙˙˙˙˙˙˙ô˙˙ö˙ü™!£'§ŭùŭŝù˙˙ĝ˙˙è²Ì˙û '›˙˙ġ˙Ñ˘É˙ü˙˙œ%)Ĵ˙ĝ˙˙˙¤•¨˙ġ˙ú˙÷"£˙˙úú˙˙Ÿ"œ÷˙˙ó˙˙˙Œ$Ô"'›Î˙ô˙˙˙ü˙ŭò"ĤÒĝ›!Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙ŝœ#'›Òüž•µ ’Ïŭ˙ġá͐:ž˙˙˙û÷˙ñ˘& #”Í˙ĝ˙˙û˙ŝú˙À"˙™Ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙ù§' ê˙û˙ʨ– ""ŝ˙öŝ˙ü˙¤ # *ŭ˙˙˙˙˙˙˙˙˙ù˙˙ŭ˙˘˘˙û˙ҟʧËŝ˙ŭù ) ˘˙ó˙˙ħ Î˙˙ŝ˙˙ĝ˙ĝ˙î˙ü˙ü˙¨'#Ħ"ü˙ŭĝߘ˙˙ĝ!Ì˙˙—û˙˙ŝ˙˘˘ ˙ï˙Ò–ûû˙˙Ç#š˙˙ú–$ ˙˙ô˙ġ˙"˜Ĵ¤ŭÔñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ġŝ™+ ˙˙ŭ! ­˙  !ü˙£ Ŝûú˙û˙˙ŝôŞ•˙û’-˙˙˜!ñ˙ŝ÷˙ŝŭüŝ˙˙˙˙Ì'Ĥŭö˙ Ħ˙ $˙˙$Ìġ˙ĝûĤ Ö˙ġ˙ŝŝŭ˙˙˙ó˙˙ù˙ù˙û˙Ÿ§ Ħ' šŬóû˙˙˙ šü˙ü˙úĝ˙˙î˙˙÷˙›¤ üü˘Ğúĝ¨¤š¨œ˙˙ġž ¤Ċ"´Êĝ˙ĝ˙Ċ£¨‘×˙˙˙˙ĝİ›– "Ÿ˙˙˙˙Ë˙Í&Ë˙ô˙˙ŭ÷û˙ŭ˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŭœŸí˙˙ú˙&œŞ# üŭü˙ĝö§¤Ĥ˙Ì ĦÚëŝ˙ŭùŭ˙˙˙ûü÷û($û˙üÏ!Χ(˙ŝŭĝ˙ĝ§Ê˘# %ô˙˙˙˙˙˙üĝ˙ŭüÌ!›ú˙ûö˙˙û˙–  '‘Ò˙˙Ç×ú˙˙öĈ.ž˙üî˙—×úŝùÎ ! ö˙˙û˙˙úŭ˙ù˙úü˙˙"‘Ó˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙ž* &Ëġ*"ÎûüÔ§ #Ñŭ˙ò֟œ ¨Î˙˙ôù˙˙'Ä˙˙˙úŝŭŭġ˙ŭŝ˙ŝ˙üö˙˙˙˙˙˙˙˙˙˙ï˙˙%!˙ù˙˙Ò!ŝÓĝ˘ "£û˙˙ò˙œüרÛĝ˙ŭġ˙˙ŭ˙ŭ˙˙˙˙Ì! ŝ˙ŝ˙•&É˙˙ó%˙ġ˙˙û£"Ñ˙˙ï˙Î˙÷ġ˙˙˙˙˙˙˙˙˙ŝ˙üûŭž"#ŝö˙& ú˙ŭŭĤ$˙ü˙ġë Ûĝ˙Öû˙ô˙˘ Ċû˙"Ÿ˙˙üË!Ĉ˙ú˙˙ö ÚĝŝÈĴ ò˙˙˙˙˙)ú˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙!$)ŭô˙  È$0˙˙˙ &˘­ò×ÙÎ˙ï˙úí Ĉ˙ʕ! !  A— , ô˙˙íŝ˙˙ŝüüŝ˙§ ž˙– $,İ˙˜8$ĝ! Ù˙˙Ş$Ĥ" ŭ˙ï˙˙ùĝ˙˙˙ú˙˙˙ŭž¤ċÀğĤĠ˙ú˙ìğ!´úŝĝ˙ŭŝ˙˙˙ê÷˙ż!ÙûÑ'Ÿ˙ùĤÖĝì˙)ü˙ʧ+˙ëù˙( $ ñ˙÷ü µĦœ"¤úñ˙!É˙ûòÓ&*í˙˙ü˙ì˙˙˙ġ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üö£ £ÊĴ !˙ŭü˙É!˙ó˙5¤ġ˙ŭú8 µ÷˙Á#Ÿëóü˙˙ŭ˙˙üùù˙˙˙— +˘Ĉ™Ĉŝùŝ" #˙ü˙Ä# ˙ŝ˙ú˙˜"%Ġ* çòûüü˙˙˙˙˙ûü+£Î(ûĠ˙ù˙Á* –# % ×ùò˘.§˙Öé˙ ó˙˙˙˙ü¨ ,ž˙˙˙ħĦĜ˙À"ŞóĊ˙˙ )%ó˙˙ĉ œ*Â˙˙û˙×éÜ "Àë˙ŝŝ˙˙ŝ˙˙˙˙˙˙˙˙§'˙ûŝ%! ) û÷˙šĤúŝŬ .Ħ˙÷ŬŸ ˙˙ìÏ! "÷ó˙˙™ÖĠ#Ĝóí˙˙˙˙˙˙˙˙üüúŝ˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙ï0¸Âê˙Ñ˙—%›˙÷˙á˙ŭè˙›.÷Ü˙!–î÷˙˙˙˙˙˙ü˙˙ó˙Ï'˘˙˙ŝŬ³˙ú˙û%˙˙àŭ˙ö–ĝ˙Ŭ˙Ö %˙˙ĝ˙˙˙˙˙˙˙˙ú˙ġ˙ŝѐ˙˙ö"˙ùġ˙ Úû˙ŝ˙ŭñ˙î˙ŭ& ô˙ŝ˙˙˙î˙ûô! &#&Ĉ˙˙˙˙"Żè˙üĝ˙ ™˙ù˙›˙üġ˙ò˙˙– '%ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ŝí˙˙˙ ' °úġ˙îô"!§“›Ġóĝ$*…˙˙˙˙ŭ —˙ġ˙ó 'Â˙˙üï%½˙˙ĦÔŝ˙˙ŭ˙˙˙ûúŝ˙ú( )Ë˙ŭüëŞŭ˙˙-'ñù˙ΧêŝĠ!˙˙ö˙& Û˙˙ŭü˙úġ˙˙˙˙ġóŭœ& '˙ëú˙˙Ŭ Ìù˙ô˙Ħ÷˙ê˙˙ŭ˙˙˙üŭü˙˙üԐ÷˙˙— ,ùú˙˘˙ü˙ŝ˙¤˙úù˙˙˙˙ĝÈ#˙˙÷˙™,é˙ŝ˙ɐù˙î(úô˙Ö˙£Ò˙÷üü˙üóóŭĝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ž$Ċ˙˙íµóû˙û÷Ż(§˙ŝŝÓ ˙ÙêĦÇ˙˙¨Ĵŝüûŭ˙˙˙˙˙˙˙úôòŝ° ‘˙˙˙˙˙˙˙!#žĝ˙ö˙‹!#ĉ˙ġ˙Â#1%# ôû˙ŝüŝ˙˙˙ŝŝÚ* ’ĝĝÛ Öû˙îû(˙˙˙ĵ:ùú˙˙÷ ˙ŭüË ˙û˙˙îΐġÜġ Ñó˙ġëÔ*•Ïŭŝ× §ĝâûġ˙“  ˙˙ü˙ĝ Ë˙˙˙#­ŝ˙²˙àñÂ1#%3ñ˙˙û˙˙üŭ˙˙˙˙˙˙˙˙÷###ëù˙!#,” #%Â˙˙˙ !$ÊüË˙" & )÷áë' ˙ô˙ûÚ"!›˙ó˙  (ñó˙0Ì˙˙˙ü˙˙ë˙÷˙ŝ˙˙ŝ˙˙û˙˙˙˙˙˙˙˙ûàü˙× ž÷˙˙ĝüû*ĵöŭŭ&˙ó˙˙ٛš¨ŭñó˙˙ŭú˙ûŭ˙ŭ˙÷˙˙˙˙ĝ˙˙ŝ˙˙îŜ#žûû˙û˙Żä˙úġŭ"˘˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙öüˤù˙ûï ó˙úĞù÷úôûù˙˙˙öĤ!˙öó˙ö˙˙ú˙Ħ˙˙ĝ˙ú˙ú˙÷˙ÇŸ˙ê˙˙ĝ (˘ñĜ˙¸—ú˙˙˙˙˙™˙’ 2Ĵö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙˙â˙˙' Ċ˙ŭñ˙˙–˙˙˙ì§Ö˙Ôòóú°'Îû˙ö˙ #úĉ÷˙˙"˙˙ó˙Ú&"›ù˙ŭŭ˙˙˙˙˙˙˙˙'˙ôú˙î˙ó›$%˙˙˙Ü*˙˙öԔĴûË˙ŝ˙ !œ˙ċ˙ÎġĊüŝ˙˙˙˙ŝúü˙˙˙û+˙ŭô˙óġ$ ž˙˙˙ö ˙˙˙˙˙ŝŝ˙ú÷üüôòŭ˙/¤˙ô˙›# Ë˙˙ó!Í˙î˙òŭ §˙˙˙°˙û˙ŝ—(šò˙˙Ċ “˙ú˙÷˙ ˙˙è˙!!•˙ï˙î˙–) ˙û˙˙ö˙˙˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭŭÈËúö˙ö ˙˙˙˙˙˙˘  ˙î˙˙ö"³íü˙"'˙˙èôĝ ˙˙ŭŝ˙˙˙ŝ˙˙üû˙˙ĝî 'š˙ŝş˙ôŭċ#§û˙ġŭÚ Ĵĝ˙ûÚ $Ħ˙˙˙˙ŝüüüé˙ûÔù˙˙Ì˙"œ˙ú˙Ÿö˙òù˙Ħ"Ú˙ĝ˙Úġ˙ʝ/”ŝûî˙˙ż&Ŝ˙ü§ )›˙˙˙ù ¸ÌŝêŬ "˙úû˙˙§&&˙ôñ˙˙›4˙Ë˙Ŭ(°óĝ˙‘˙ô˙ċ ç˙˙ûú˙˙ú˙˙˙˙˙˙˙˙˙ü˙ ċ˙ġ£˘Ġ!¨ŝġôĝù˙˙÷ë­!§ċ İ˙˙˙˙üœ!˙Ċ¨ Ÿ˙û˙ô²Üûö˙˙ĝ˙û˙íüûŝ˙üö˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ŭ§&Ğŭó˙ûú˙˙  Á˙˙˙˙­–˙×ĝĜ ,,ĊĠ#  Î˙ôó˙˙üú˙˙úûô˙˙Ş(;˙ġŭ˙ĉù÷ŭ˙û“ ˜˙ŭ˙ïí! Ì˙ù˙ŝĜ˙ô˙˙˙˙˙˙˙˙˙ûŭ˙ġŝ˙˙ú˙˙Ç)! ü˙ċ%Ò˙˙˙˙˙˙ôü÷˜§ú˙˙ûü˙÷ġ˙›"Íŝñ˙ĝ˙ëÇ˙˙˙˙˙—- ċ˙ĝ˙ŭš˙ġ˙˙Ü˙ġ˙˙ÈÖÑ&˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙÷úú˙û˙  ˙÷˙ùüŭï %üëĝ˙óüúŝ˙˙û%  üṳ̆ "‘˙ŝ˙ĝúšñùŭ÷˙İĜ˙ö˙˙ŭŝ˙˙˙ûô˙3˘ĝ˙˙ŝġŭŜ˙“ ŭ˙˙"ñü˙˙Íü˙ì˙Ċ) "Ù˙˙ùò˙,#á˙˙˙ë˙ŭŭ˙˙ú˙ċ ˙ŝ˙ó˙˙˙Ċ2–ŭĝ˙Ï# ˙˙˙ġûŝùŝ˙˙˙˙ŭö˙ôî˙ ¨ŝüŝÑ%—˙üÑ &ü˙˙öü˙ĞĦó˙ŝŝÀ$œŝ÷˙˙ 'â˙÷û²ŝġô˙ü˙˙˙ëŭó˙ "—˙˙˙ŭħ¤˙öĝ˙Öĝû˙é˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙Ğ‹˙˙áîËŭ˙ôġ˙ı,˙˙ê˙˙!ú˙ûÇüë˙˙û'œ˙˙˙˙˙˙˙˙üù˙˙˙ġĜµ-Ûúó˙ú˙˙˙(˜Í˙˙ŝü£!§úñ˙פ“—£§˘—Ŝŭŭŭŝŭüŝ˙˙ġĝ˙Ħ”˙ñê˙í !˘ĝÂ˙Ÿ˙ï˙˙ŝ˙û˙˙÷Ĥ #È˙ñË&%Ñ˙˙ùöë˙ ”ï˙™ §˙ïû˙Í˙˙û˙˙–Ñ˙˙íó .ô˙˙˙üÚ ˙˙ùôİ$•˙˙÷! ˙ûĝù#œ˙˙˙ŝúŭ˙ŭù˙˙˙˙˙˙˙˙˙˙ùύ÷û/ï²#ï˙˙¤# ù˙ûĝ˙²$ž˙™&Ġù˙û˙ùŭ&%˙Í žì˙ú˙Ï%Ŝó˙ñŝŭ˙Ìġ˙˙˙ô˙ŭó˙˙˙˙˙˙˙˙˙˙ö˙÷ġ˙ $Ŭó˙˙è˙ùŭ!) ĝ˙˙ÖèŸ'ó˙ù˙ ! ˙ŭ˙˙ġÇË˙÷˙˙˙˙˙˙˙˙˙û˙ġ˙ü˙Ú £˙ù˙˙˙˙òö³.Ÿ÷ŭ˙ü˙˙ġ˙ĝ˙ ĝġ˙ŝ˙˙˙˙˙˙˙˙˙ġ˙˙˙˙äûŞ ! è˙˙œËö˙˙˙ë˙˙˙ú*£÷í˙ûû˙˙˙û#!Ş˙í˙úŝ˙˙èü˙ñùĦ)˙˙ĝû˙˙êħÔÂ˙ü÷Û Ş™#/Ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ï˙/ ĝ˙ï˙˙ù˙+! ŝ˙ûö ˙û˙˙˙ŝö–!˙É˙˘ !óŭù˙ûŬ˙˙˙˙û!êúŝ˙˙ŭûŝ˙˙ôéĊ›$¨ó˙ġ˙˙˙ñġ˙ŭû (˙˙˙ò˙ġ˙˙ŝüáŭŭüü˙˙„Ì˙˙û˙˙ĝ˙˙ô˙˙Ìúŭ˙ŝüŭĠ ´ù˙ŝœ"Ħ˙ĝ˙ô˙ŝú˙ŝ˙÷ó˙úú˙˙ùŸ'œ˙üӞ!öĝÖ&˘óûóü˙ù›0˙öŭŝ °ü˙÷ûë( ĝ˙˙ù Ç˙öö˙ô˙˙˙ŝ˙÷̘˙˙˙úŭ˜)˙ú˙û˙ĝ˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ûŝ˙ô"˙üŭ˙ü˙‡Ïúĝ˙˙ï%¨˙ò˙™!˙˙ô˙˙"úŝ˙˙˙˙˙˙˙û˙ŝóùÒü˙ñ˙˙ôíÙ! ú˙ô÷˙÷#' ˙˙ŝ ÒÚ˙˙˙óû˙ĝúŭúûŝ˙ŭŭ˙˙ċ˙ĝü˙ŭ˙ı "  ˙˙ö"ŭ˙˙ô˙&ï˙˙˙Š,Ú˙ù˙#Éüô˙˙˙˙”£˙ċ˙$½˙˙÷˙Ú%#ñö˙íŝ°Ĝûö˙˙Ê#Ġ˙˙÷óĝÈ'˙˙ŝ˙˙§ %Ğŝü˙ ó˙˙ŭ°ü˙û˙ŝ˙˙ŭĝ˙˙˙˙˙˙˙˙˙ó˙óĦ˙› !(àż#ŝôû˙Ÿ é˙ó˙÷ŝ– +’ò#˙ò˙ñ˙˙˙òÍ&ûú˙˙ë!Ä˙˙ô˙ˤĝ˙úŭ˙ú˙û˙˙˙˙˙˙˙˙˙ĝ˙ôŭ3“˙˙ŭ˙ŭ˙˙˙ŭúû˙˙ Ö˙˙˙°˙öġ˙÷˙ޝ˙ü˙˙ŭû˙˙˙ùŝ˙üŭôÙ# Í˙˙ŝĝË% (óúü˙̙ù˙˙˙$˙ĝ˙ü˙˙˙˙˙˙˙˙˙ü÷˙ôŭ˙Ħ) ˙˙˙£#Ñ˙ġñ˙˙ó˙˙ŭ&˙˙ġ˙˙˙˙ú÷Ë —˙ùŝ˙ ŞàûŝÇò˙˙¨ùù˙›#* Ë˙Ċß ) ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úü˙ò˙ŝŭÌ"˙˙üû˙ñû  Ÿ˙úġ˙ĝùüóö˙˙ĤĈï˙˙™" ˙˙˙˙ŭ"“ûûïúöĴ ¤˙˙ûŝ˙ŭûŭ˙˙ĝò˙“%ż˙˙˙ù˙˙˙˙ö˘°ŭߏÒĴ˙ä˙˙˙ĝùü˙—)ü˙ĝ˙ŝ˙ݽ˙˙˙˙ô˙ô˙˙˙ġûšù˙˙öĝ˙ġĤ˙˙ĝ× ˙ŝ˙˙˙ŝŝ˙ĝŭ˙˙ĝ˙˙˙ġ˙Î!Ìü× ˙È˙˙˙ĝ˙è˙ ˙˙ü˙˙ñ$úï˙˙ŝ˙Ž'àïŭÔ *&ï˙˙ŭú˙˙ĝ÷ŭù÷Ğ·ûċ˙Ï˙Ġœ˙ôûöóßÊÖÓòû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷š"#œġ˙òö˙÷#Ì˙˙˙ú˙— áÍ˙÷ħ šŭö˙ò˙³ ŭ˙˙˙˙˙˙˙˙óġŭ˙ŭ˙Ħŝüô˙òû˙ŝó˙ëÍ˙÷˙ú˙Ğ#¤˙÷ġ˙ê˙î˙˙˙˙ĝ˙˙˙˙˙˙ŭûŭ÷˙˙˙˙ġË 1˙ôû˙ó˙ù˙û˙ù˙˙˙Ġ ûî˙˙¤˙˙˙íŝÍŭĴ %˙û˙!£˙Öġ˙Ċ ˙ì˙˙ö"Ä˙ü˙ï§Ñî˙˙˙˙&Ê˙ù˙˙”!Éù˙˙˘ *Żüóß$$ŭú˙ü˙˙˙˙ŝù˙˙˙˙˙˙˙˙˙˙ñ˙˙ +˙Ş 0‡ÈË˙ú˙óĜ!#ĝö˙ŭ˙ùĦ&%˙§$/ŝó˙˙ëßĉ%˙Ġ ˘Ë˙˙ú˙Ì˙ö˙ò  "œŝ˙ŝ˙ŝ˙ö˙˙˙˙˙˙˙˙ö˙ùüÎ!˙úíŝ˙ĝ˙0÷ö˙ŭ˙ä#Ġ˙˙ì›""ö˙ŭ˙ê˙Ÿİ˙ú˙˙ûúŝ˙ü˙úûó˙˙),÷ŭ˙ #*#˙˙˙ŭ˙Ĥ˙ġ˙ŝ Ñĝ˙ŭ˙˙˙˙˙˙˙˙ù˙ŝ˙ûëÌ* !ŝ˙Ċ˙§ï˙ŝ˙ĝÇÙÈ˙Ê%­˙˙óÎÇ˙˙ŭ '*ÑÉĈܟµ˙œ  !ù˙ "$²˙˙— 1Ä˙â   !)œ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ü˙Òŭ§. ŭŝ÷˙˙ŝÚŭŭ˙˙ú˙˙ü˙ó˙ŭ£Üĝ˙ü˘ ˘ûÔ˙ó˙˙˙˙ÏŝĦŭö˙úŝŭŭŝ˙˙˙˙î'˙ö˙û˙ûú˙ú˙Ħž˘“äÁ§ —ܤ˙÷˙˙ú˙ÏÎĝ˙˙ġŭŸħÏü÷˙ŭú˙˙ù˙˙˙!˙ŭó˙˙˙˙"ùŝ˙ĝ¤$úŭ˙ü˙ö˙˙÷˙ĝ˙ô˙ùŭ˙ùÌ& $Ӓž"͵ßŭüûü˙ûÍ ˙ï˙ûüĴ¤ûŭ˙ŝËÉ˙˙É# ˙ŝû˙üŭĝ˙˙˙ú˙’ŝ˙˙ñ˙˜* ¤˙üü˙˙&˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙ÉÊ!£ù˙˙üĝŝ­Ôŭù˙ü(š˙˙˙î%Ïü˙ö˙˙è#˙˙ŝŭ˙˙˙˙ŭ˙˙˙ĝ˙ê˙ #Ĝû˙û˙üĝ˙Ϝ×˙ŭ˙˙ĝ˙£˙˙ŭ˙˙ú˙˙˙÷˙ú˙üü˙˙˙ü˙˙÷˙˙ŭÓ$ùžê˙˙÷! ˙ú˙˙÷ŝ˙û˙ĝŸ$ ˙ù˙÷§'÷ú˙˙˙ùÑ™˙˙÷˙!Ĥô˙˙÷è!˙˙ùû˙Èž˙üŝŝ˙Ï›˙˙ôŭŝÓ ˙ŭ˙ŭġ×˙˙öüŭ­ ¤˙ ! ŭ˙˙˙ŭ˙üù˙˙û˙˙˙˙˙˙˙˙˙ù˙˙ìÚ# ĦÈ İûó˙˙˙ù5 ˜˙óŝù˙˙ žü˘˙˙˙˙ŭ˙˙İ÷ĦŸ˙˙ìĠ"ú˙ùÙ Ì˙û˙ü˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ ùÖŝ˙ġ˙Ä- ü˙˙ŭ˙£"Ì÷÷˙Ĝüú˙˙Ô ˙˙˙ŝ˙˙˙˙˙ġŝ˙˙û˙!û˙¤#°ÓŭŝŭÍĤ#™˙üĝ˙Ÿ Ş˙ŝ˙˙˙˙˙˙˙˙˙˙üô˙˙ $ ! ĝ˙ú%˙˙Ĉ"Ëö˙‘" Ôž#˙ĝ˙Ê -  §˙ò# ˙ž%”üüÖĤ $—˜Ï˙ü˙˙Ê$ $§ö˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙î˙˙ŝÏ˙÷˙˙ì˙˙˙˙Ĥì˙ĝú˙—%˙˙ï˙˙ŝ£¨˙˙˙ñ ŭ˙ú÷˙ŝ˙ò˙ŭ&Ĉû˙û˙˙˙˙˙˙˙˙˙Ôġ˙ü˙˙ġ˙˙˙Ë!#œĠùœ$Żö˙÷ŭ˙˙ĘÜë˙˙òŝ ħô˙öò˙ú˙˙˙ùŭó Ğ÷ŝ˙ŝÌ˙˘û˙ŭ˙!—˙˙ô˙˙ö˙˙ĝ˙˙˙˙˙˙˙˙ú",˙ŭĴ !›˙˙ġ˙˙ó˙ž˙˙˙ô˙ġü˙ú˙Ĥ$“˙˙Êî˙ôû˙˙˙˙ü˙ûİġ˙÷˙ŭ˙ŭ˙ĝĴ!"Î˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙÷˘ ޞÎü$ Ħ˙í˙˙ŭ˙¤Òù˙˙˙ñ# İú˙˙ŭ!˙ġ˙˙Ê & Ïŝ˙˙˙ŭ˙˙˙ŭ˙üŝ˙ĝĝÔ˙ŭ˙üŭüĝÛû˙˙ü˙˙ ¨˙÷˙Ġ !û˙ú˙˙ŭ˙ŝú˙˙˙˙˙˙˙˙˙úĝ˙ó Óù˙ Ĝĝ˙ŭŭ# ˙˙û˙úÉĤ˙ü˙ö˙”&˙è˙˙™Â˙÷˙˙ŝ¤ ŭ˙ŭ˙ Ħ˙ö˙üÏ"ö˙˙ü˙Ê÷˙˙ŝû¤Ò˙ö˙˙˙ó$"Ä˙˙ù˙ü ˙˙ù˙˙Ä$Ĥη˜ŝ˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙˙  ÌÜûí˙˙˙˙ ˘˙÷˙É˙—(žú˙÷$šÚÍÎ˙˙•&ù˙Ï˙ŝú˙˙—È˙ŭ˙è#&Ġùŝ˙˙ŭ˙˙˙˙˙˙˙˙˙˙ûŝ˙Ï ĉû˙Ó­§’Ñ˙˙ô£#Ùö˙ " ĝ˙˙ğ˙˙˙˙˙˙˙˙˙ú˙ŝûûÖÜĦŭԗ('ĝ˙öİ "˙˙ġ˙­ ##˙˙˙ù˙˙üü˙ô˙ĝÎ(÷˙ ('" Ï˙˙ž ! #ŝ˙ŭŝÔ™˙˙öİšŸ˙÷˙ŭÓ˙Ö˙ùÏ˙ù˙ŝòëò˙˙û˙úŭ˙öÖÙöÍŭÑŻî˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ëĝ˙öÙ ˙˙˙òö˙‘#˙ú˙˙÷§% Ĥù˙˙˙™ŸöĠñ˙˙¨ ö˙˙ö)˙ĉ˙˙’% š˙ú˙˙˙˙˙˙˙˙˙ġ‘$÷ô˙˙˙ô˙ú• !Ÿ˙˙Ó œûß˙ö˙ï˙'§ûú˙Ô<è˙˙˙˙ŝ˙üùŝŝ˙˙‹'!˙˙ùŝ˙Òûùü˙‘('°ó˙˙˙˙úú˙˙˙˙˙˙˙˙˙˙˙ô# "î˙È &Ŭ÷˙˙˙˙˙ö ! ˙é˙ù˙“"ŭ˙ĝÓ !+˙ġ˙™%Ĵ÷˙˙ï˙Ô÷˙ú˙ŝ*˜Ŝŝĝ˙ûİ6˙î˙–"É˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙ù˙Ĝ"Ô²/ŭ˙ŭ˙˙ú“˘˙ġìö˙% ˙ñ˙˙ ,ŝ˙ü÷Ë+Ï˙ùô˙ĝñ˙ĝ˙˙˙û˙˙˙%  £÷ġ˙˙˙˙™˙˙üĉ)ġ˙ŝö$œıÙ˙ôÎÒ˙˙˙˙˙˙˙˙˙˙ŭ˙ŝò§Ì˙éÔ˙Í˙˙Ĥ !ŸġúüŝÔ$‰˙˙ĝî˙˙Şî˙ŭñ˙ˆ!²ó˙˙è˙ô˙ô˙í =™˙˙òĠ ˙Üĝ˙÷ı§÷˙˙˙îŞ!ú˙öù˙Ü×çó˙˙£%#äû˙˙ĝ$ŭ÷˙˙ñ˙ñ˙ò˙û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙ĝ˙'&Ž˙˙7Ŝ˙˙˙˙ĝò›%#Òßî˙šŜŭú˙Ħ!–˙ġûö£ ³˙÷£(Ê˙˙˙ĵ˘ $î˙ê˙Ùû˙ê˙˙˙˙˙˙˙˙˙˙û˙ĝûŭ $ % %•˙ûÔ#;”˙÷ !Ÿ˙ÌÌö˙˙˙˙˙˙˙˙ĝ˙ú˙˙% % §˙ŝû/Ñ÷˙ùş3!0éġ˙˙˙ûŝ˙ŝ˙à˙˙! # - óŝ˙ '¤˙ê˙˙•$(''È˙î˙ñ˙Üû˙ŝû˙Â˙˙ó˙˙ü˙ġ˙ò˙˙í˙˙˙˙ùġú˙˙ŭ˙ûŝ˙˙öù˙û˙ŝñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙˙Ä- 0Îó˙˙˙!!×ôñ˙˙$¨ĝĝ˙˙$ ˙ŭ˙ĝé¤"$˙öĝ˙$"ż˙˙˙˙' &˙Ë˙˙˙˙˙˙˙˙˙˙  ŝ˙úü˙˙ŭµ& ñ˙ú! ŝö˙˙˙˙É›˙Ô˙ö%‰˙˙û˙˙ô˙ö˙˙˙öòА¤Ú‘¸Ħ˙ŝŭó˘üö˙˙ü˙˙˙˙˙˙˙˙˙˙ö˙Ҙ·˙ĝÑ% 'Á˙˙ŭôú˙ĊĴŞòċ˙ù  Ìû˙ŝĠ˙˙™ §î˙˙§˘÷˙Ħ 'Œú˙ò˙˙÷¨ .îŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙÷ŝ˙ 3 !û÷ó§%!Î˙˙Ŭ”%š˙˙öÓ(”ñĜ ­ßö˙˙ŭ˙üŝ˙ü˙÷÷òĴ )$ £ûû("ó˙˙Ù"&µò˙˙Ġ(9 ™! ™˙˙˙˙˙˙˙˙˙ùóĜ˙İ •ħ$ —ĤûĝÖ2²˙˙˙ $Ñ˙ú˙˙Ğ˙ñ˙ŝú˙Ĥ˙ŭú˙$Ħ˙˙˙˙"%•Á˙öĦ /§˙˙˙Ëúŝ˙˙ú—!˙ì˙˙üÓ #é˙ûú–&  Ù˙˙ùß˙˙ŝ˙ùò˙÷˙úû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›  ħûġÖ (Ôĝö˙ñġ˙˙˙Ħ %”ù˙˙ò˙&¤¤·˙˙û˙˙É ËŭÌĤ# ġ˙üż / 1Î˙˙ôŭ˙˙˙˙˙˙˙˙ú˙ö˙˙  &')-#%÷˙ Ùòù² , ß˙˙˙˙˙˙˙˙˙ü˙ġ˙ŭ"  !)    - žĝĝÏ$ ˙˙˙˙ !ş˙˙ŝ÷˙ö˙û˙˙˙öüŠ2 ˙˙˙çŞ #!Ĝ˙˙˙˙ëŬĜ‹'£•˙ù˙ó˙óüŭċŸĝŭüîû˙ŝ˙˙˙ö˙ôó˙÷˙˙ŝ˙˙˙˙ú˙˙˙˙ŝ˙˙˙ŝŭ˙˙ü˙˙˙ŝ˙ġ˙˙˙ùŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùô÷%*˙ŝñ›(Ë˙˙ôó˙”ÜÓĠĞġ˙ŭáĜż˙Ŭô÷˙ $ Íüġ˙˙˙˙˙˙˙˙Ì$Îĝ˙˙˙ĝüê*ĝŭ˙™°˙ó˙˙˙˙%!,Ġ˙ĝ˙÷˙ù˙ú˙üùùùġ˙¤# & ü÷ġ˙£)!$ú˙è˙˙ùú˙˙˙˙˙˙˙˙ŝ˙üü'.ê÷ŝá·"˙ŝô˙˙˙Î! 1(˙ŭ!Ÿûġ›˘ĝŭ˙Ž(' Ö¤ù˙œ¤§Ù˙ĝ˙ &Ĵù˙Ĝ $(Żŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙ñ$(" ˙Û $ ò˙" §ŭä˙ÒĤ %% ˙ìü˙˙ĝŝ˙ô˙˙˙˙Ÿ& #&Ċŝ˙ % Ÿ˙˙˙ğ# ˙˙ŝ˙ž Ô˙˙˙˙˙˙˙˙˙˙˙êú "ġ ˙ŝ˙£ ͜$˘ñ˙ïԞ˘˙ŭŝŭ˙ùí˙ŝñ× ˙÷ê˙ !&à˙Ĥ ˙˙Á˙ÏîÀ²˙ñ÷˙’5 ò˙˙!@Ĥóŭ÷™§˜Ûžħú÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŭ˙í˙& ! Í˙öÒ Ö˙˙ùö˙ĝ˙îÔ!$š˙˙ò˙û˙ž 0ï˙ôŝ˙˘˘ ! #Ġ˙öó˙* !¸ù˙ï˙˙˙˙˙˙˙˙˙˙˙ŭŭ˙˙ 'ĥ˙*˙˙& "ô˙Àş""ñ˙˙˙˙˙˙˙˙˙ŭ˙÷˙ĝ#"(%•ô–"#Ĝ &ŝ˙ĝà# šû˙éüɕ$â˙ŝ˙ŭ˙ó˙˙òü˙˙ù˙Ħ"˙!!÷ûŝ˙í$) Ñîú˙óö˙˙üĠ›˙˙˙û˙é˙ú˙ó˙˙˙˙˙˙˙öô˙˙˙˙˙˙˙öŭ˙ö˙úŭ˙öŝü˙˙˙ŝŝŝŝ˙˙˙ùû˙˙ġ˙ü˙ùö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙Ò& !"žùö˙%+%! Ìĝ˙˙˙ŝ˙È!+¤û˙˙˙–,™ İ͝Ĵ˙˙ÒÏ˙˙˙˙˙˙˙˙˙˙ö#'# ×÷üûŭù˙˙Ê Ŭ˙˙ĝÍ&¤ë˙˙˙˙ĝó˙Ê " ! û˙ûú˙ĝ˙˙ŝü˙ûŭ˙˙˙ŭ˙ '0 Ô˙˙ù˙ó # Ÿ˙ĝô˙ġê˙ó˙˙˙˙˙˙˙˙û˙ŝ˙ˆĦÇ˙ŭ˙”™Ò˙÷ö˙ûÎ ‘˙ô#&˙Ñ!Û˙ú˙¨  #ŭ˙.ĥĉûö˙˙ĝ£!Êû÷˙éŝúóà"¨˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙ĝó˙žÄ$Ġôŭ'%˘˙˙ú 'È˙û˙˙Ñ§Żœ ËËħ˙˙ú˙˙ù˙˙ú˙û˙ó˙˙˙˙ö˙ÌŜ£‘·Î˙ë˙ܘŸÓ˘İ˙òŝ˙β!!$î˙˙˙˙˙˙˙˙˙ú˙˙˙ŸµÄ÷,ú˙ċ˙+Ÿ—”˙˙ò˙î $$÷ü˙ĝüŝö˙ö˙#˘Ì˙ġ˙Ï˙" Áġᙯñù•´ŜóüÒ %!™Äü˙ġö˙Ĵ£Ġü˙ü˟Ħ£Çü˙˙˙É + Öúġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭû˙üš!'˙ġ˙ë¨#àñô˙˙ö˙˙˙÷÷"$¤Ä˙ŭö˙˙ñ0 3$ŭŭŭ˙ñ˙úÂ&×˙˙ŭ˙˙"–Ï˙˙ùúñ˙˙˙˙˙˙˙˙ú˙˙÷ĝŭĤ“ "ȝ˙˙Ù0 İŠ˙˙ !'˘Ġ˙ġ˙Ȩż ²Ŭġû˙˙˙˙˙˙˙˙ú˙ŝ˙˙• œ™—™ĤÛġ☜ž‘§˙ê˙˙û˙ù˙˙˙ÉÇü˙˙ŭ˙˙ù˙˙îö˙üúŝìôüŭù˙ú˙˙ó˙ï˙˙â˙˙˙÷˙˙ç˙ï˙˙˙˙ï˙úĝï˙˙˙ó˙˙ò˙˙ŝñû˙ù˙ôŝ˙êüŝ˙ûú˙˙÷˙˙˙ŭŭ˙ö˙˙üùôŭĝŝ˙˙˙ŭ˙˙˙ŝ˙˙˙ŭŝ˙ŝüûŭ˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙ò˙͟!Ĵîù˙ê˙˙˙ġ–(˜˙˙ù˙ì˙ĝ˙ÙĞ"¨ôĠ˙˙˙óĦŞ˙Íô˙É˙˙ġ˙û˙ĉ˙˙êù˙üİŭ˙ôü˙˙˙˙˙˙˙˙˙ŝ§.¤˙˙ûù˙˙ûö˙™§˙ğġ˙˙˙öñÛŝìŭŭ˙ü˙óġÁ1˙˙˙˙˙˙ŝ˙ŝô˙˙˙˙˙íü˙˙ġ  ­ġ˙˙˙öû˙˙ü˙˙ÏûÓê˙ïí˙˙ŝŭö˙ŝ˙˙˙˙˙˙˙˙˙˙ĝ˙˙ĵ˙˙ŝ˙˙Ĥ˙ù˙˙˙ùĜ/ § ö˙ŝÇ£“!ÊġĠ œĦġ÷÷˙ȝ-"’˙˙ĝòÓù÷˙˙˙˙ô˙˙ñ˙ġó˙˙˙˙˙˙˙ ,’˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ĝ˙òü½İ ž˙˙˙˙§ú˙˙ñú˙Îü˙ü˙÷˙˙ñġ˙ŝö˙ôí˙˙ì˙é˙û˙˙˙Èûĉ˙˙ó˙˙ġ˙ŝ˙ü˙ööòĴ˙Ôġ˙˙ġ˙ġ˙ô˙˙ŝ÷˙˙˙ŭ÷˙˙ôûġ˙˙˙˙ïĝ’( ­˙í˙˙˙˙˙˙˙˙˙˙ŝ˙Äô˙˙͘˙ŭġŭ˙ó˙˙ìâÒÙ˙˙û˙˙• ˙üü˙˙˙ŝ˙˙˙Ê˙˙ŭ˙˙˙ĉŸ¨­˘Ü˙òÓġ˙Îú˙˘§˙üô˙˙ŝĞ §Ĝ˙ó˙û˙˙˙ùí˙óù˙˙÷˙˙˙û˙˙ò#&1™Û˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙ù˙ùòžĝġôù˙˙˙êù˙˙ï˙˙˙ô˙˙ï˙˙$ ”ù˙˙ó˙˙÷˙˙ó²"‡ĝÇ˙È˙˙ġ˙ŭ˙û˙˙ôÑöú˙ŭĊ˙˙ùù˙Ĥ  Ĥŝ˙úŭ˙˙˙˙˙˙˙˙˙˙˙ù˙ü˙˙˙˙ŭÍ˙˙˙ö˙ĝ˙ġ˙÷ĝ˙ï˙˙’Ġ˙˙ġ˙ñó˙ĝ˙˙˙úÛ˙ò˙ïò˙ŭ˙˙˙˙˙˙˙˙ŝ˙˙ü˙ûûùŭ˙ùüü˙ġ˙Ú˙˙˙ö˙úûò˙˙ô÷˙˙˙Ĝùúĝ˙ó˙óû˙˙˙üŝ˙˙˙˙úó˙˙˙ú˙˙˙é˙˙ôùŭ˙ĝ˙˙˙ü˙óô˙ù˙˙˙˙ĝ˙˙˙ûí˙ŭôü˙˙ŝ˙˙÷ñ˙˙ĝù˙˙˙ĝú˙˙ûôġô˙˙˙ŝ÷˙˙˙˙÷˙ôŭùû˙ŝ˙˙÷˙ü˙˙ŝ˙ŝüŝ˙˙ŭ˙˙˙úü˙ġ˙ŭó˙˙÷ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙˙öû˙ĝġ˙˙Ŝ˙˙˙ñ&˜¸˙û˙ï˙î˙˙˙úê˙ϸŜ˙Ë˙˙ê˙ŝ˙˙ìùî˙üû˙˙˙öô˙˙˙˙˙úŝüù˙ûü˙ú˙˙˙˙˙˙˙˙˙úüüҞÊß÷ŭ˙˙ŭûŭ˙ŝñġ˙÷˙üġĝ˙÷˙ò˙˙÷öŭ˙˙˙éŬ ÒĠż˙É˙ĝü˙˙ŭ˙üŭ˙˙óüù˙˙˙û˙½˙úü˙û˙÷˙˙ġ˙ù˙˙ùï˙˙˙ñ˙˙˙÷ŭ˙˙û˙˙˙˙˙˙˙˙˙üŝ˙ñ÷˙ñġĝüï˙÷üŝĝŭ˙ü˙ö˙ÄŻÍüï˙˙ŭ˙˙˙˙ÖĊÖ˙˙ïâ·˙˙ô˙˙˙ü˙˙ŭùÔÙ Œ˙ŭë˙ŝ˙ŝî˙ñŝ˙ú˙òŭö˙˙÷ŭûġÉ!Ùòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙ŝ÷˙ùŝ˙ĝñüûŭ˙˙öúñ˙ö˙ôŭ˙˙û˙ġ˙˙ù÷˙˙ŭü˙ŭ˙˙˙˙û˙ûĝó˙ü˙öò˙˙ŭ˙öŝĝú˙˙˙úϞÖüñ˙öô˙˙˙ûñŝ˙ì˙ñ˙ïŝ˙˙è˙˙˙÷û˙˙ŭÎÓÖĊÎġ˙ĝ˙˙˙˙˙˙˙˙˙˙˙òŭÛÇÔ˙˙í˙Ë˙ú˙˙÷ûüÓËġ˙˙ŝ§ö˙ë÷˙ÍùĤ#˙˙˙˙˙ŝ˙÷ôö˙ú˙˙˙íô˙˙ŝ˙ŝï˙˙ó˙ó˙˙˙û˙˙ò˙˙úŭ˙úù˙ĝ˙ĝ˙÷˙˙ù˙ùúùüûû÷÷˙˙˙˙ù˙ĝô˙˙ŝôü"  &Ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙ŝ˙˙˙˙ù˙˙˙ô˙ë˙˙˙ŭ˙˙˙ï˙˙î˙˙˙ß˙˙ŭù˙ġö˙ú˙úûö˙˙˙˙˙˙ûúûûô˙˙˙ì˙˙˙˙˙é˙ô˙í˙˙÷'”ûĝ˙÷˙˙˙î˙˙˙˙˙˙˙˙˙üú˙üŝóü˙á˙öĝ˙˙ŝ˙û˙˙˙ó˙˙˙ó˙ûŭ˙Éŝ˙˙˙˙ôĝ˙÷ŭ˙ó˙û˙ö˙˙˙˙˙˙˙˙˙ŭ˙ĝö˙˙˙˙ú˙Ĉ˙ĝ˙ûùñÑò˙˙˙˙ò˙óŝ˙ñ˙óï˙˙ô˙ñ˙ŭŝ˙ġùó˙˙îú˙˙˙˙üġ˙÷ŭ˙˙ŝ÷˙ù˙ö˙üúŭĝñ˙˙˙ôŝ˙î˙ö˙˙ç˙˙˙û˙˙ŭ˙˙ŭ˙ôŝ˙ù˙˙˙ĝü˙˙ù˙ò˙˙˙˙÷òù˙˙ú÷ù˙ŭ˙˙˙˙ü˙˙˙ŭû˙û˙ŭŭ˙˙ŝŝ˙˙˙˙˙˙úúŝù˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûú˙û˙˙ñ˙˙ö˙˙üö˙˙ò˙˙ò˙˙ò˙˙˙˙˙˙˙˙˙ŭŭ˙ŝë˙ù˙˙˙˙÷ŭ˙˙˙îŭ˙î˙ŭ˙˙ó˙ĝö˙˙ŝ˙Ò÷˙ĝŝ˙ú˙˙˙˙˙˙˙˙˙˙ŭġ˙˙í˙˙ŭŝùù˙˙ĝĝ˙ŝ˙ĝ˙˙˙ú˙˙ï˙ŭò˙ŭ˙˙ŭĝ˙˙˙˙ò˙˙˙÷˙˙ĝ˙˙ù˙ŭ˙ŝ˙˙˙˙ûü˙˙û˙÷˙ŝü˙˙˙ġ˙˙ù˙ŝ˙˙ġŝ˙ù˙ùŭ˙ŝŭ˙ü˙˙˙˙˙˙˙˙˙˙ó˙˙˙ĝ˙˙˙ù˙üÖĝ˙ŭü˙ù˙ŭ˙˙ŭ˙ŭ˙ü˙ïŝŝŝú˙˙ôŭ˙˙ġ˙ŝ˙ĝ˙ú˙˙˙ô˙úñ˙šÜġ˙˙˙˙ô˙˙˙˙óŭ˙ô˙˙ŝ˙˙˙ú˙ŝ* ûÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙üŝ˙íŬ˙ĉ˙ü˙˙ûöû˙˙˙ŭ˙˙ô˙ö˙˙ñ˙ö˙˙ġ˙úŝ˙˙ô˙ġ˙ŝ˙ó˙˙ŝ˙˙˙˙ü˙úù˙ŭ˙ŝ˙ûùŝû˙˙ġ˙˙ö˙˙ŝ˙ġ˙˙ô˙˙ú˙ú˙˙ŝ˙˙ùù˙˙ù˙ñ÷˙˙ġ˙˙ŭ˙ú˙˙˙˙˙˙˙˙˙ĝ˙ĝû˙ñŭ˙˙ûì˙˙˙ŭ˙ûû˙ŝ˙÷˙˙ŝŭ˙ùü˙ĝ˙˙˙ö˙Ġ%Î˙˙ù˙˙ü˙˙˙˙ú˙ö˙˙˙˙ŝ˙˙˙ü÷˙ĝ˙˙ĝ˙ŝ˙˙ŭ˙ó˙˙˙˙˙÷˙ö˙÷˙ŭ˙ùŭ˙˙÷˙˙˙˙˙ĝñ˙ö˙ü˙ŝŭ˙ŝŭ—$%œÍ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙úô˙ġ˙üûŭ˙ú˙˙û˙ĝù˙˙ûŝ˙˙˙ú˙ŭü˙˙ùúù˙˙ŭû˙ĝû˙ú˙˙÷úüü˙úŝ˙û˙˙˙ûú˙˙˙üùŝ˙ñ˙˙ĝŭ˙÷  ˙ú˙ô˙˙ù˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ˙˙˙˙÷˙ĝ˙ĝŭûüġ˙ùö˙˙ò˙˙˙˙ò˙ġ˙ùú˙î˙ŝ˙˙ŭ˙˙÷˙öŭ˙ŝ˙˙˙˙˙˙˙˙ŭù˙˙ù˙ŭüŝ˙÷˙ï˙˙˙ŝ˙÷ú˙˙í˙ñ˙ûô˙ŭŭ˙˙˙ŝ˙üúŝ˙˙ĝ˙˙ü˙ô˙˙ĝû˙ġ˙˙üŭ˙÷˙÷˙ù˙÷˙˙ĝŝ˙˙˙˙üû˙˙˙˙û˙ĝĝ˙ĝí˙ü˙˙ĝ˙˙˙ŝ˙˙ú˙ó˙î˙ŭ˙û˙ú˙˙ù˙ŭö˙˙ġŭ˙˙˙ŝ˙˙ŭ˙üŝŝ˙ûŭ˙˙˙˙úû˙˙ŝûŭŭ˙˙ŝ˙˙˙˙˙ú˙˙öĝ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝŝŭö˙˙ù˙üĝ˙˙ûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙÷˙˙ŝ Ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Üñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙û˙ɟ˙˙ŭš˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙û˙ŭË& %ÍÁŭÙú£Ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üÓĦŭ˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ú˙˙ÇÙŬÁ˙˙ŭ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ĝ˙ûç-(à˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙òŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŭ˙˙ĝë )ùŭ˙Ċ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙ĝ˙úÏ ˙˙üùĜ.$’ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙™ĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùúü˙Î ġ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙˙§Ĝö˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙ŝ˙ĝìĤŠı #˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙ù˙ŭŜħ˙Ħš ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙î˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ŝ÷Ô'%)Ŝ˙˙˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ü˙ó˙˙ĝ˙ó˙úŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ò˙˙÷˙÷%+äú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝû˙˙ŭ˙˙óÎ')& %˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ûŝöŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙óù˙˙} )Ä˙ŭ÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ú˙˙óù˙ë˙˙ĝ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ŝí˙˙Ĝ–ĞŸÁŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭü˙˙˙˙˙˙ó× ĥ &('Ïŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙ú˙ŭ˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ú˙íġíÑ˙ŝñ˙˙˙ŭĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŝ˙û˙˙ŝ˙ŝ˙˙˙˙ùĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙˙óĝ˙˙¤œû˙˙˙˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙˙ŭü˙ġ˙û˙ÔêĠ—˜%İı˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öï˙˙îĝŭĝ˙û˙úüú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùñî÷˙ġ˙ĝé˙˙˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙ġú˙˙îùÑ˙ĝĝ˙˙ä˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûŭ˙üù˙˙û˙ê˙˙Ġ˙˙ùò˙˙˙ŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û÷˙ĝ˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûġ˙˙˙ú˙˙˙üŭ˙üú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙ġ˙˙˙˙ú˙ì˙˙í˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙÷˙ŭĝ˙ŝË˙ŝ˙ŝŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŝ˙˙ü˙úŝú˙˙÷˙öĝŝ˙˙ë˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŝ˙˙ù˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙üŭû˙üÍ˙ó˙Ŭޏ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙öŭ˙ü˙ġ˙˙Öö )œ˙Ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝ˙˙ó˙îï•"+ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭô˙˙ôÖ$ "Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙ġ˙Ó ˙ĝÔĴ˘Íŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙ì˙÷˜, ˙ġ˙ĝüġò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭò˙ŝúŜ % ˙ù˙˙˙ŭ˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜó˙ÊĞ"ŭÏ˙ûŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ï˙˙î˙ú˙÷Ô˙˙Ÿ˙ü (ù˙˙ùû˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙ü˙ï˙˙ñ˙À˙Çġüô˙Ò˙›1 ˙‘˙÷˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙ñ˙ù˙ҙ&Ħ¨˘ŭ˙÷û˙üŭ‰"¨#­˙÷˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›£ ÓÂ˙˙˙ŭ˙°'› Ħ˙öŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óóü˙Ӕ+.ş* —öúö˙˙ ˙×Êŭ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙‘$ œ˙˙ŽÖü˙ûú'ĉŭ˙ùŝ˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙íÜ!Ż˙ĉ˙§ŭ˙ĝ—˙˙˙ñ˙î˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙•"ó˙˙˙˘ ˙˙ùû"˙óû˙ŝ˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙û˙˙˙ú˙˙›˙˙ùÒ( "ö˙ü˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙›$ó˙í˙˙Ĉ-ù˙˙Èĝ˙˙ô˙ŝû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝġü ˙ŭ˙˙ôÛ +ŭùôñ&˙û˙ĝ˙˙ù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙§ĝġû˙˙È#ŝ˙û˙˙†#Ċġ˙˙î˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùñÍ!%Î˙ö˙ ñĝ֕Ĵ%£˙ù˙ŝü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ñ˙˙ĠĞê˙˙˙ -ñ˙ŝ§" #Ò˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ï¨˙˙î  ÖŝËü6Ò˙ï˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öü˙ù˙ ö˙ú˙ûô˙ù˙žĦ#›˙í˙˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŭ˙˙ñÜÜñ˙˙ŭü˙˙˙˙˙˙ôàÑÌÜñ˙˙ŭü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙˙˙ŭòòŭ˙˙˙˙˙ŭŭûŝ˙˙ü÷ĝòŭ˙˙˙˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙˙üü˙˙˙˙üü˙˙˙ü˙˙ŝŝŭüüŭ˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭŭ˙˙ŭüŭŭüŭ˙˙ŭŭŝŭŝ˙˙˙˙˙ŝŭüŭ˙˙ŭŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ûû˙˙˙˙ŝŝ˙˙˙˙ûû˙û˙˙˙˙˙˙˙ŝ˙˙˙˙ûû˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üû˙˙˙˙˙˙˙˙˙˙ûü˙ŝ˙˙ŭŭ˙˙û˙˙˙˙˙ûü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝŭ˙ŭùû˙˙ûùŭ˙ŭŝ˙ŝ˙˙ûü˙˙˙˙ûùŭ˙ŭŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙öö˙ŭ×ÄĠÑÌŝ˙ö˙ġû˙ÉÚÏÓŜÏÀ˙ÌËŭ˙û˙˙ú˙ö˙˙ú˙˙ö˙˙˙û˙˙ÉĠûŭù˙˙ÙÁ˙û˙˙÷˙ú÷˙ù˙˙ÏÎ˙ġ˙ġü˙÷ù˙ĝŭ˙û˙˙ŭ˙ë˙ûü˙˙ü˙˙ó˙ŝ˙˙˙ù˙ÙĈŝú˙÷˙˙˙˙ŭ˙˙˙ĝĝ˙ġ˙ŭ˙ó˙ĝ˙˙ú˙û˙˙ĝÛÒÙ˙ë˙ĈÛÌÙÊÖ˙ú˙ġ˙ò˙ÏÊÑÏ˙ËÍù˙˙˙˙˙ò˙÷˙ġ˙ÚÄŜû˙ù˙ü÷˙˙î˙˙˙˙ù˙˙˙ó˙ĝ˙˙û˙öûġ˙˙ŭ˙Ñ˙˙˙ü˙ù˙ù˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭú˙ö˙˙Ċ%§ġ˙ó˙˙˙  )¤Ç(ü˙˙ùù˙÷÷˙ë÷˙ô˙òü˙ɘ˙˙ñ¨İ˙öûú˙ûú˙ë˙˙ŝú˙˙ĝûŭ˙ŝŭ˙ú˙÷ŝ˙ġ˙í˙˙ŭ˙˙˙ê˙ü˙òö˙ŭšĥ˙üĞŞû˙í˙˙˙ö˙˙ĉ˙ôŭ÷˙˙ùó˙˙˙û˙ï ˙˙óŝ" 4‘˙üó˙˙ùÈ$Ç˙˙ŭûĝûô˙÷˙˙üŸ Äú˙˙˙ó˙ñ˙˙˙ùú˙˙î˙ó˙ŭ˙ŭĝ˙ĝ˙˙˙˙ġù˙ï˙ì˙˙˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙íŝġ˙Ġ 3Òûùĝ°!˙˙í˙ö¨+/³Â¤˙óŝ˙ŭ˙˙˙ï˙ê˙˙ï˙˙ü˙˙÷î˙Ç™ü˙˙˙˙ú˙˙î˙ž%–˙˙˙çĝ˙˙û÷˙ŭ˙˙ü˙˙ö˙÷˙ŭö˙ë˙ġûü˙ú˙ĝè Šû˙ üŭ˙úûġ˙˙ŝë˙ó˙˙˙íú˙ö˙˙è˙ú˙Ż˙Ëĝ˙ŭ˙Ğ,•* àŝ˙˙˙˙Ç­òœ'ëġ˙ŝù˙ò˙˙ù˙ĦĠ˙ñù˙˙öŝŭĝû˙í˙ü˙˙ŝ˙ò˙˙˙ĝ˙ġĝĝ˙˙ŭ&ú˙ŭóġ˙˙˙˙ġ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙ùŝ™êŞúŬ!ü˙ŭö˙ĝó˙èü˙÷#˙ÍÛĈŭ˙ôċúàÒ˙ŝö˙öü˙éĜ% ˙˙óÙ&˙ġëÖŭĈĊÄŭ˙˙ġ˙˙üÄá˙˙óíàÎ˙˙íäÒÌÔòù˙×ŭ˙Ö˙˙ôÈÊÉ˙ŝùŝ˙Ĝìî ˙ÍĈÒú˙˙ŝż˙˙üöġ˙ŝ˙û×îàÎ˙ŝËí˙ûġ˙ġ˙˙˙ë˙˙÷ô˙Ùş˙° Ç˙˙˙ù˙ËÔ˙Îì˙öŻ ÔĝŬŝ˙û˙Î˙˙ñ˙ù˙öòÙüÏùûܵÚ˙×ŭġ˙˙˙ÏÓû˙˙˙üúŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ˙˙˙ÑÇ˙£ú°ŭ˙û˙í˙üù˙˙˙ġÏ "ĵê˙Û%  ĴÊ˙˙˙˙˙ó ŝù•˙ö™+%$˙ó$ŭ$Ë˙˙£ùŭ( ˙Î ˙Ĵ Ĥ˙ŭÒ–Ñ!Ô˙íŻñ˙û˙ô˙É (÷Ĝ'˙˙üñ˙› ÷û˙˙ö˙˙ĝ ­ŭ âĉİ#,˙ŭ”'ċóÌž·˙%¤ùŻŝ% 1 # ˙÷ċ˙ú˙˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġü˙%˙˙˙ìÑ˙‰˙ĝúì˙ù˙˙˙óûúğ"˙ ˙˙¨Ÿ&Ĵí÷ġùûá ˘ŭ˙˙ÍŞñ˙#’™Ş˙İ$úİħïǝ˙–!Ô* öĈ˖%Ŝ¨È˙š(Ü "“ž&˙ŭ ˘˙Ŭ˙˙˙À!œ!)žò(+ ˙ċ˙˙ŭ! §ŭĴ& Ĵ£Á˙#ŭ˙ݟĤĝĴ*½0Ö˙%˘˙˙”œ˙ş!ŝİ ŽŞ $ĝ˙˘ )˙˙ô˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙÷ä“ŝ"ĝñ˙ŭ˙ċ½˙˙ù˙˙ëòû˙˙˙%˙ï˘$̖$ó˙Ğ˙˙˙ŭġÍ!Ħ÷˙˙–˙ö ˙Ċ"¤˙˙—˙ß,Ŭ$ĝÁ#ÍŬĦ˙˙—*‘ŭÑ˙°›˙÷"í˙ü›!Êíùö˙ù&˙˙ÈÎ˙'‘˙Ó˙˙úœ- 6•˙µüïÏ£˙˙˙™û˙ ï˘$ż˙Ġö …˙û§!˘˙ñ˙ŭ!§˙˙šġ˙ ž˙ï ûġ˙˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ûô×˙É˙Ԙ˙˙˙÷˙ġ˙˙˙˙ŭ˙ġ£ù˙ŬÍŞ'ĝú˙˙˙ËĤ˙ô÷Ù›˙üÛĝĠœò-˙˙ ›$›ù  '  ÒĈ!ò˙°£˙Ç ˘üÓ˙ô˙Ÿ£—˙˙˙˙ñŝ+ ÏŭüÓ$¨ò˙ĝüüŭ˙%ëß˙÷Í˙û!ĵ˙˙ÈÉ˙!Îù§§ú˙ #˙Ï™˙˙ü œ˙µù˙¤ġÔ™˙ŭŭÏ˙óÎ+”˙ô˙ñ˙'˙˙˙ù˙˙ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙ÍÒô$Î˙˘ŝŭŭŝ˙˙˙˙˙˙ġ˙È˙˙Á'ΣŬ›ŸĊ˙ĝ˙˙ôË&”˙Ìù££˙ü˙ùÍĤü›#ġüŸÙû˜"ɧÔÊâĝÔ˙ôò˙ÙÂÓ˙…(šôŝ ŝú˙Ĥ Ğ˙ġ˙˙ŭûÎ˙˙Ì §˙˙üú˙ŭ˙˙÷˙ŝó˙ŭÂ˙ö¤ŝÇû)šü˙˙ ï˙ ͤ˙ŝ—›˙š˙˙ŝŸÓ˙˙Ê˙˙˙ŭ˙˙˙ŭŝ˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙üŝù˙ïĦ"ÏĜ’Ħ¤˙À§˙ŭûŭ˙˙ĝò&˙ó˙˙Ċ ˙àİ#×Ò&óĜ˘˘Ğġ˙î˙˙˙ ,˙û˙˙˙ò˙Ó# ˙ŝ˙Ĝ' Ú÷á ÚûĠœ™éÜ÷ú˙Ğç˙"ġ· Ĥ˙ŭ˙ÔêÓ.ġù˙˙ù˙ŝ˙òĴÍ%œû˙˙ġ˙ŝĴ$ó˙ù˙˙ò˙ "%ô˙â¤÷ŝ˙“+Ò˙ŭŻ ô˜#À˙˙ ˙ÑĞúĜĦ˙ŬĴîé˙"˜˙öħ˙ñ˙ùñ˙ù˙˙÷ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭûú˙ì"•˙˙Ĥ2ŭ˙ŭûŝ˙˙ôéŝ˙˙˙Ü ú˙–Ï˙˜Ħ,ŝ˙˙˙˙ŝ7 #Ñ˙÷˙˙ó&˜ó ˙ŝĝ‹ –ö˙ùž(£´˙ż#üŭ˙›!’›"ż˙ ġ˙˙˙-û˙˙ŝŭŝ˙À )+­˙˙˙˙ò˙˙˙ '#"˙ù™² Ĝġ3˙˙›Ħ˙ĝ!˙µŸ-÷ŭ§ §£˙È"˙˙ĝÔ!,˙˙( áŝ˙ Ġú˙ĝ˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ġ˙˙ĝĦ" ˜˙÷˙ŭŝ˙˙˙ûô$í˙úÇžò˙Ş-Ëġ˙" ñ˙ú˙ïŝ˙˙‹%' ûë˙ù˙üž˙£%˙˙×˙ĝ˙˙êŠ&–ÌŭÒ˙˙ô %Ï˙ùĊ/”˙ġ¤ ŭġż0§ŝû˙ó˙úà˙Í) ġĝú -™ï˙˙˙üÇÂ"Ë˙ÔÊ˙ ˙ñš$Ëö˙£*ó½ °˙˙ôÙ$ž˜Ħ˙ҝĉÔ˙üÙÔ9˙˙ò˙˙ (ù˙ŝûúĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŝ÷ì˙˙˙úòì˙ġĝŭ˙ŭ˙˙˙˙˙˙˙ġû˙ô˙˙˙ŝ˙˙ôĝ˙ĝ÷˙è˙ú÷ŝ˙˙÷ûŝ˙òü˙˙˙úôò˙˙ö˙÷˙ö˙ġ˙˙ŝŝ˙î˙˙˙˙ùó˙˙˙úéü˙˙üç˙˙ö˙ŭ˙˙ô˙ŝ˙ĝ˙˙˙˙˙ôûö˙˙ú˙˙˙˙˙ŸÓúĝ˙˙í˙˙ŭŝ˙üŝ˙˙˙ü˙ë˙÷˙û˙˙˙îùúö˙˙˙˙ñ˙ô˙˙˙÷ú˙˙˙úŭ˙î˙˙ï˙˙ü˙˙ŭ˙˙÷îó˙ò˙ĝ˙˙íŝñü˙ï˙˙˙˙ù˙˙û˙žŸ¤˙ŝ.ü˙˙ò˙ú˙óûî˙˙˙˙ò˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙ñ˙˙˙ŭŭ˙òġŝġ˙˙üŭ˙˙˙ûúŝ˙˙˙ŭúû˙ò˙˙ġ˙˙ġ˙˙ì˙üû˙˙ĉ˙ò˙ġŝ˙˙˙òġ˙˙˙î˙ú˙˙˙ôù˙ûŝò˙˙ñ˙˙ò˙ùŭ˙˙ù˙ü˙ì˙ġŝ˙ú˙îö˙˙û˙˙ŭŝ˙úû˙ôŭ˙˙˙ĝ˙ñî˙˙ûĤ–!ħÈ˙˙óü˙˙ú˙˙üá˙ûö˙ŝó˙ġ˙˙˙ú˙˙ġ˙˙˙ĝö˙ĝ˙˙û˙ĝóö÷˙˙öŝ˙˙˙˙˙üñ˙˙ġ˙ì˙˙˙˙ö˙˙öúŭĝ˙˙˙ü˙ï˙˙ĝ˙ĝù˙ĝ"´•û˙ì˙˙÷ŭû˙˙˙ù˙÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĝ˙˙ŝúŬ˙ĝù˙˙ù˙˙ó˙ŝ˙˙ŝüüŝ˙ŭùü˙ûŭ˙úú˙˙˙˙ûġ˙÷˙ì˙ö˙ŝ˙÷˙˙˙ò˙ġ˙˙é˙˙ó˙úöŭ˙˙ö˙ŭ˙˙üġ˙ö˙˙ñ˙ú˙ü˙ñù˙í˙ŭ˙ó˙˙˙ò˙ŝŭ÷˙ġï˙˙˙˙˙˙ŭòú÷˙˙ù˙˙÷ŝ˙˙˙ŭò˙ĉ˙ŭ˙˙˙˙˙ü÷ŝë˙ûö˙˙˙˙˙ìëú˙˙˙˙˙ĝ˙˙ù˙÷ù˙ŝî˙ñ˙˙ĝ˙˙é˙˙˙˙˙üùúù˙˙ûŭ˙ò˙˙ġ˙˙ï˙ŝŭï˙û˙ñ˙ú’ .÷ĝ˙ûùúŭ˙ŝùí˙˙ò˙˙ô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ùŭġ˙˙ô˙ŭ˙˙ö˙ù˙˙ŝŭüŝ˙˙˙˙ü˙ûô˙ŭ˙ŝ˙ŝŝŭú˙˙ŝ˙˙˙î˙üĝ˙˙÷˙ê˙ù÷˙ŭ˙ï˙˙ġ˙˙ĝ˙ĝ˙ñ˙ŭûĝ˙ŭü˙ù˙ĝü˙˙ŭŝ˙î˙ü˙˙˙ŝù˙˙ŝü˙ŝú˙˙÷˙˙ú÷˙˙˙˙˙ù˙ŝ˙ñ˙ü˙ô˙ĝŭ˙ġ˙ŝ˙˙˙ŝŭ˙ñöúüŝ˙˙˙ĝŝ˙òĝù˙ú˙˙˙ŭúŝùŝ˙˙˙ġ˙úú˙ú˙˙˙ŝ˙˙˙ü˙ġ˙˙˙ĝ˙ûü˙˙ù˙ĝ˙˙˙ġĝ˙ô˙˙ü˙÷˙öô˙˙ù˙˙ĝÌ˙ñ˙ü˙˙˙üŝüû˙ó˙˙˙ûù˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö˙˙ù˙ĝ˙˙˙ñ˙˙˙ĝ˙ŝŭ˙˙÷˙˙÷û˙˙ŝû˙í˙ĝŭ˙˙ġúŝ˙ô˙ĝû˙˙üùúú˙ĝ˙ŝ˙˙˙˙ŝ˙ûĝ˙˙˙ŝû˙ö˙ŭ˙˙ŝ˙÷˙˙˙ġ˙÷˙ŝû˙ô˙ô˙˙ó˙ĝ˙˙ĝ˙˙ô˙˙˙û˙óŝ˙ù˙˙ù˙˙ù˙ôù˙û˙üü˙ôü˙ġ˙ġú˙˙ġ˙ùû˙û˙˙ó˙˙˙˙˙ó˙üŭù˙í˙÷˙úŝ˙ŭù˙˙ŭù˙ġ˙˙˙˙˙ì˙ŝ˙û˙ù˙ì˙ŭŭ˙ô˙ñ˙˙ü˙˙˙ó˙üû˙˙üü˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙îû˙˙ġ˙ġ˙˙ŝŭ˙˙˙üò˙˙é˙ŭ˙˙ñù˙ù˙ò˙˙öŭŭ˙ĝ˙ŝ˙˙ùûí˙˙ŭ˙÷˙û˙˙ùúü˙˙ĝ˙˙ŝô˙ù˙ŭú˙÷ġ˙ùĝúò÷˙÷û˙˙˙ö˙ü˙˙û˙ġ˙˙ĝ˙ġù˙ï˙ö˙ê˙˙ñ˙ġö˙ö˙˙ŭ˙˙˙˙ò˙úí˙˙òŭ˙˙˙ĝ˙˙âŝ˙ë˙ï˙˙˙ŝ˙ù˙˙˙˙˙í˙÷ŝö˙ŭú˙üñ˙˙ĝ˙ùüĝŝ˙˙˙˙ô˙ü˙û˙˙ĝŝŝġ˙˙˙ŭ˙ú˙˙ï˙ü˙˙ĝ˙˙˙˙˙ŭûŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ˙˙˙ŝġ .ñ!İëú˙ú˙˙ò˙˙˙üç˙ûŝ˙˙ü. ˘îü˙Ù%”ö˙ë˙˙úûŭ˙ù˙˙˙ġ˙˙úúü˙˙˙˙˙ù˙˙û˙˙˙ù˙ûï˙˙ġüóŝ˙˙˙Ç˙ôŭ§Ù˙ñ˙÷ĝ˙˙˙˙ŝ˙˙ê˙ùì˙ó˙ù˙˙˙óû­ŭó˙ï˙ĝĉ# û˙˙˙ ˙ĉŝù˙˙˙í˙˙ú˙ŝĉ˙˙ì˙˙üû˙ĝĝ˙˙óü˙ĝ˙úû˙˙ü˙îüġŭ˙ŝŝú˙˙ù˙ĝŭúûŝ˙ŭŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷˙ŝ˙˙ 1 ˙Ş˙Òí˙ìĝ˙ü˙û˙˙ö˙˙÷ŭû˙&!"˙˙òú Ħ˙˙˙˙˙÷˙˙˙ô˙"úġ˙óê˙ŭ˙ŭé˙ùġ˙ñ˙ĝŝúûó˙ü˙˙˙ŭ˙˙˙ċü÷Ò#ĝ˙ ˙úŭü˙ö˙ĝì˙ó˙˙ü˙˙˙ŝ˙íö˙ëÒ/—Ñ˙÷ŭ˙˙Î#1˙˙ç/˙˙˙ü˙˙ñ˙ŝñ˙ô˙˙˙úùòú˙˙˙×ùú˙˙˙û˙˙ó˙÷û˙˙ü˙˙ï˙˙û˙ŝ˙îŭ˙ŭŭŭŝŭüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙˙óüŭ£˙˙ò˙$Ž˙ĝ˙˙˙˙ġġ˙÷ù˙˙ŭ˙˙˙˙˙  ü˙ġ˙ ¨˙˙˙ôò˙úööŭñ˙˙û˙ġ˙˙ĝġù˙˙ô˙ĝ˙Û˙÷˙ŝ˙öô˙ô˙ü˙ĝ˙˙ò˙˙ù˙ġ3˙˙˙î˙÷ŝ˙˙˙˙˙ò˙î˙ó˙ôġ˙˙ö˙˙˙óüŭ˙˙ï×˙ñ™˘ûĈ%ĝ÷öö˙ò˙û˙˙Äü˙ëŭŝ˙˙ŭ˙ġŭ˙˙ùŝô˙˙ĝó˙öü˙˙Ĉôû˙ü˙ŝ˙ñ˙˙ú˙˙˙˙˙ŝüüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ù˙˙ñ,"ŭĝ˙ï#' ñ˙ÔĴÁ˙˙˙ûù˙,˙˙üÜ%—÷  "ù˙˙üž!Ĥòü˙³ È˙Ħ! $Ċ˙úĞ×ì Ŝ˙û°üĵê˙ñ !–û˙˙÷˙˙(üĉŝĝ˙˙£Éí˙˙˙ÉÍ˙Ôŭ˙ ˙ú˙ïó˙˙!—Ò˙˙À2.˙çĞ)ÂĝĜĊ˙Ġ/şôû˙ŝüŝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙í˙û˙˙ùú˙˙ì˙˙  İĴġ¤™ħĝŭ˙˙˙˙•˙˙Ĝ˙ &“­ Ğ˙â)úÔ˙ü×#Ǩ" ›Ë˙!! ' §£/‘˙À*ôš0 ­ ŬĝŞ˙˙ŭò˙˙–“'˙Ö ò˙ŝü÷Ğ˙˙ò˙ô˙˙˙ûÚ ˙ŝ™Ĵ ġ Ĥ £!!˙˙ ­¤Ô& #Œ˙¤8˙ ¤ù”& Úçòûüü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ú˙ü˙˙÷˙˙˙ ġ˙˙ùüĜ›˙Ùù˙˙˙˙ú˙ü÷˙ĝÄ"˘ú$˙òĤù˙ ü˙¨ó˙ž#’˙ÑĤĤŭ"ó˙ĤĤñÒË÷˙Ê˙˙!ŭ˙%—öĤ™˙ŭ˙˙ŭÎ!ËûĠ°ëÜûŝü˙ŭ˙ "š˙ù˙“˙ô /ú˙İ˙÷ ˙œ¨ĝ˘É˙ɧóÏ&™˙–˙˙&˙ öĴ˙Ÿ˙ô˙˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŭ!˜˙ĝ˙ĠĊ˙™œ˙ !üúŭñ˙!Żóŝ˙ñ£Ġ˙ŭÊ"ö˙á÷%ŝ Í˙  ˙˘Óĝŝ! çôñ˙˙˙ú˙˜"ŭĜöĝ˙û˙ ˙˙ü¤İÎÖ˙˙˙˙˙˙ #ÑûúĤÊĊú˙˙!&›˙ŸÏŝ˙˙ò˙¨¨ù ×˙ġ˙!Î˙ŝ ˙$˙ñ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙é1(˙ŝô˙Ş˙úĞĤÂğŸĦĦ£’˙ü˙˙ñ# ˙úùÛ ˘˙!˙˙Î˙ü+íù˙"!˙Ŭ,š—ŞšÓ˙ /˙˙˙üĤ ˙ ġ˙˙çŜ Óù˙˙˙ö˙ É˙˙ ˙ĥ'ŭĝ˙˙ġé£Üô˙ôŞŻûë˙Ä%,ŽİÊö‘! Ô˙˙Ùô¨Ÿġ8ê˙Í0Ŝé˜Ħ² %!ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ŭ˙˙˙¤È˙£˜˙"˘˙úÏÍŭ˙˙öô˙ğ/"÷ûŝÖ ˙˙"˙íÖô˙ è˙˙ĦîĠ£-˙˙Ä×È˙İ˙˙·ÎÈ˙·ÎĊġú"ĝ˙÷&ûïôŭ˙ùİ&Ì÷ĝœÒì "˙óùŝ˙˙˙ŭü˙Ĝ›œ˙ä˙žĦûŭŞ–˙³Ä˙˙œ-íÄ *ĦÍ˙. ˙'“˙˙ŸÓ˙¨ šÂ!% ˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙,™ú˙ġ˙%ĤŭɎ%¨ñš"Ċü˙ì˙˙!•& ˙êħ"ġ˙Ù•˙ô&ġ˙˙Ñ(Ë˙¤ú˙˙£­À¨ùÓ˙˙ú˙×(Ë˙˙ú˙ŭóŝ&£×ç˙˙˙˙ĝŭĝúİİ ™˙é˙ì·êŸŞ $˙Ş› £ûÌ!˙ĉÔŞ˙˙ë˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ö %ú˙˙›˙˙ž˜˙˙#Ô˙ù˙˙ġö˙ž''ĝ˙˙ûÙ%˙ĝ÷ŭ˙ôĠ˙˙ù+ ¤÷üòúîŻ!ĞûÄŭî­öö˙&î˙û˙í˙˙ëŬÖ˙˙ñëû˙˙˙ú˙üÓ (# ™Ġ÷Ċ&îŜ ) ˙û(/ ˘˙˙î'ž˙êĞ ˙˙˙êü#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÎÓü˙ġùחĠëŭŜÉÙûŝÀÖÏÖÏôô˙ïŭ˙ú˙˙˙ÓÎÖθŝ˙ï˙ÖÑüô˙ĈËŝŝÏ×˙í˙˙˙Óĝŭġŝ˙˙ÈÙÍÌ˙˙ÎÇÔ˙˙˙˙ÇËÜĊÛü˙˙Ç˙˙˙ïŜÉÉ˙ö˙¤˙ùüùú˙ù˙ŭéÚÈĠÎ÷˙ô˙ĊÌ˙˙ŭŝóö˙˙˙˙ÉÀÇÜÏû˙˙˙Ô˙ùÒŬÍÀżĜË˙˙ÜĊÜÛŭ˙ÙŬıÑ÷ĦĈ˙˙úÀ×Íáġ˙ùîúĠĜ˙ÓÈ˙öŭô˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ġ˙˙úô˙˙öí˙˙˙÷˙óú˙ì˙˙ù˙ûŝŭ˙˙˙úŝ˙ĝú˙ö˙˙˙˙ûô˙ù˙˙ú˙˙˙ò˙˙îŭ˙˙˙ê˙÷˙˙ô˙ŭ˙ô˙˙˙ç˙ġ˙˙ĝöĝġ˙˙ê˙ñ˙˙ë˙˙ó˙ġ˙ŭ÷™¤§˙˙ì˙˙˙úü˙˙˙ùŭŭ˙˙î˙ü˙ûŝĝ˙˙ĝ˙˙ŭûŝ˙˙î˙ù˙ŝêġ˙˙˙ŝö˙˙˙˙ó˙÷úû˙˙˙û˙˙Ë$˙Ş˙ĝ˙˙˙ġô˙ñ˙ö˙˙ĝ˙ü˙˙˙˙ĝ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ô˙ŝ˙òù˙˙ñùŝ˙é˙ûö˙ŭ˙úüü˙˙˙˙ü˙˙˙ü˙ĝ˙ùü˙÷˙˙ôŭ˙ù˙ù˙ġ˙˙ù˙˙˙ûú˙˙˙úó˙ĝ˙ë˙ü˙˙˙˙ïŭŝ˙û˙öĈ˙ù˙˙ü˙ü˙ûù˙˙È˙ú"óü˙˙ù˙ŭ˙úŝ˙û˙Ïò˙û˙˙÷˙ö˙˙üó˙öù˙˙ï˙˙ê˙ô˙˙ŝö˙í˙ŝ˙Ïô˙ŭû˙˙˙üĝŝ˙˙ù˙Ÿ 0™ġ˙ó˙ŝú˙û˙˙˙ŝ˙˙˙ùû˙ûŝ˙ú˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙¤Ï˙˙ŭ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ÓͤÎĦ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙è $hĥÑhÚÑloboj(1?orStAS.1.2.518.P.Aberdeen.Midmar.tiffH>ˆ]È}œHğˆÚÈúH8ˆWÈw–HµˆÔÈôH2ˆQÈqH݈ÎÈî H,ˆKÈkŠH݈ÈÈèH&ˆEÈe„H£ˆÂÈâH ˆ?È_~HˆĵÈÜûHˆ9ÈYxH—ˆĥÈÖġHˆ3ÈSrH‘ˆ°ÈïHˆ-ÈMlH‹ˆŞÈÊéH ˆ 'È G fH …ˆ ¤È Ä H ˆ !È A `H ˆ žÈ  ŬH üˆ È ; ZH yˆ ˜È ¸ ×H öˆ È 5 TH sˆ ’È ² ÑH ˆ È / NH mˆ ŒÈ Ĵ ËH êˆ È)HHgˆ†ÈĤĊHäˆÈ#BHaˆ€È żHŜˆŭÈ 1 4 1 12 2 3 32 3 2 5 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 4 1 5 2 1 3 0 132.0 0.272727272727 64.0 0.671875 0.22095959596 0.235537190083 0.0202589775162 0.38576884548 0.0605017113282 0.00224524138258 0.0276922528411 0.00373879971347 0.636211775046 1.33333333333 195225785.955 1.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 2.0 8.0 0.12 0.0 7.0 1.0 0.484848484848 0.416666666667 0.25 0.333333333333 0.0833333333333 0.583333333333 0.333333333333 0.75 0.583333333333 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.25 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -2.40179277757 -0.260435361423 -3.61207813889 5.26649532847 2.3775189583 8.61050961465 -0.567512334747 33.6857732683 -2.95629780562 -0.270370007237 -5.74268633386 37.6086349074 2.97160985791 -1.33192388271 1.60018580275 24.6440267801 -2.20036038004 -0.964628929079 -3.19035419412 13.6120631293 1.4558724163 -0.674296483715 0.0802572696432 5.68073987681 -0.233481370841 -0.00307851928399 5 6 5 3 3 3 4 2 4 3 3 3 3 5 1 12 1 4 4 2 3 3 9 4 10 3 11 3 10 4 4 2 4 9 4 8 2 0 169.0 1.0 79.0 0.772151898734 0.212562585344 0.213928083751 0.082998933664 0.0949861492344 0.0464004272802 0.0257787224446 0.0119805851772 0.00578626277788 0.017468431982 0.923076923077 0.384615384615 0.0 3.0 6.0 3.0 2.0 2.0 0.0 1.0 1.0 8.0 0.310344827586 0.0 2.0 4.0 0.467455621302 0.25 0.6875 0.75 0.375 0.5625 0.5625 0.3125 0.8125 0.5 0.4375 0.0 0.5 0.75 0.625 0.0 0.4375 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.75 0.75 0.25 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.0 -7.44355426153 1.37118104818 -18.3005074673 3.96159231206 -0.433492571444 1.57633662343 -19.665965974 14.0298890414 1.04668916398 4.21356617497 -14.2500382793 36.2560698474 -0.619159755573 1.00505992265 -15.9352771165 44.2340714474 0.166628955639 -1.31515244733 -13.4818142653 36.2725757921 0.976231949869 0.688648683594 -4.281528979 38.73283142 0.0193207563508 -0.0327101131601 1 4 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 3 3 3 3 2 4 3 3 3 3 3 2 5 1 5 120.0 0.3 66.0 0.621212121212 0.259722222222 0.259583333333 0.0216383101852 0.363513310185 0.0600109953704 0.00124377167302 0.0184262424749 0.00159201854936 0.574990340575 0.5 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 1.0 0.130434782609 0.0 9.0 1.0 0.55 0.4 0.0 0.0 0.0 0.8 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.9 0.9 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.32366216914 1.17774657888 -4.05297840924 3.59331370297 1.73813113351 1.49908040898 -1.44342539293 11.4928151643 -1.81399233713 2.36068956665 -4.18979386988 23.6205231176 1.70803614732 0.273325199089 -0.89770903474 27.2405884476 -1.41402221825 -0.464017221634 -3.24932997096 20.7277182432 1.1359082003 -1.11119738861 -1.64267146957 8.33218848993 -0.306226746011 -0.229780919365 5 6 1 3 2 3 3 7 1 4 4 4 3 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 5 3 4 3 6 2 4 1 8 2 12 3 11 4 12 6 2 1 6 11 3 4 4 5 2 4 6 3 1 4 8 2 1 4 8 2 2 3 8 1 4 3 6 2 4 7 1 2 3 0 315.0 0.714285714286 133.0 0.864661654135 0.177777777778 0.195767195767 0.0535752078609 0.129434226365 0.0420122616948 0.0168935265067 0.0138500889393 0.00752585797804 0.0796651343763 1.33333333333 0.809523809524 3.0 4.0 5.0 4.0 5.0 4.0 2.0 5.0 1.0 10.0 0.267857142857 2.0 3.0 1.0 0.422222222222 0.583333333333 0.5 0.625 0.75 0.375 0.416666666667 0.666666666667 0.458333333333 0.416666666667 0.166666666667 0.291666666667 0.125 0.833333333333 0.416666666667 0.458333333333 0.375 0.166666666667 0.5 0.5 0.166666666667 0.0 0.166666666667 0.166666666667 0.666666666667 0.5 1.0 1.0 0.5 0.166666666667 0.666666666667 0.666666666667 1.0 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.333333333333 0.5 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 -12.7323954474 -0.48504363609 -28.6442019882 0.831799316164 2.82117216909 2.49945955332 -21.3727382325 7.43426089616 0.013645523182 -0.224526063415 -15.9322088876 17.2358871505 0.140463215488 4.82998985445 -12.0819757539 39.3918750067 1.78660602132 -2.02557471869 2.6706457633 36.8032149781 0.297837225161 0.831080108273 7.90749637952 31.1797229701 -0.0505641304194 -0.610905816078 3 1 7 3 5 4 4 8 1 8 2 4 5 3 7 2 7 2 7 2 7 2 6 3 6 3 6 7 3 7 4 1 4 0 144.0 0.5625 60.0 0.85 0.148919753086 0.193576388889 0.0276006167481 0.154737600737 0.0451020501115 0.00657904323133 0.0193779613043 0.00758847728563 0.145590440823 0.555555555556 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 7.0 0.153846153846 1.0 3.0 1.0 0.416666666667 0.5 0.833333333333 0.416666666667 0.5 0.833333333333 0.916666666667 0.666666666667 0.666666666667 0.416666666667 0.583333333333 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 -8.11690209769 3.81971863421 -15.5116281941 10.210269803 5.33604248655 1.63382496268 -2.32748792683 17.0220128701 -2.50676320905 0.54507459514 -5.81132233724 18.8096834055 1.06411272735 -0.841927404101 -3.45836866183 11.6460030352 0.347570726303 -1.11184579192 0.831779144272 1.25367179565 -0.448499410866 -0.18237419603 -0.363367081493 -2.82692850945 0.257418883882 -0.0413059467945 1 5 11 6 12 5 12 5 13 4 13 4 13 4 13 4 13 3 4 1 9 4 3 4 6 5 3 4 5 4 6 3 4 3 7 3 4 3 7 3 4 3 7 4 3 3 7 4 2 4 7 3 3 4 6 4 4 3 6 5 2 5 5 5 1 7 3 7 1 5 6 5 374.0 0.772727272727 148.0 0.648648648649 0.155866624725 0.220588235294 0.0539700518549 0.139830362355 0.06568485869 0.0211823104567 0.0232551781796 0.0213932258321 0.0960980338963 0.411764705882 0.636363636364 3.0 2.0 1.0 1.0 0.0 2.0 5.0 5.0 2.0 1.0 0.166666666667 1.0 0.0 2.0 0.395721925134 0.766666666667 0.6 0.6 0.766666666667 0.4 0.4 0.3 0.3 0.0 0.266666666667 0.266666666667 0.366666666667 0.0 0.1 0.633333333333 0.766666666667 0.777777777778 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.444444444444 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.111111111111 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.555555555556 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.888888888889 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.444444444444 0.555555555556 -12.2115247245 -11.4302186402 -30.0083081434 -28.0165251515 0.328473800656 0.00113596691163 -22.4680050392 -24.7230228609 6.27322977657 3.79084684186 1.23329443743 -9.31946071789 -5.06599626233 -2.54441034987 -17.4986863649 -14.1827053074 1.20093578227 1.79153528178 -17.0820897201 -11.0884747159 0.927863525104 -1.75634463234 -8.79603648964 -21.5071564066 -0.513321342364 -0.0758041464523 6 1 1 2 6 7 4 3 2 4 2 3 3 4 1 11 1 9 2 4 9 2 9 3 10 3 9 3 10 3 4 3 2 9 5 6 2 0 168.0 0.857142857143 80.0 0.7 0.21626984127 0.21343537415 0.0730044001728 0.106716843483 0.0444724516791 0.0207890398169 0.0119429512057 0.00541506055073 0.0340729027484 1.08333333333 0.285714285714 1.0 4.0 5.0 3.0 2.0 1.0 0.0 1.0 4.0 12.0 0.121212121212 0.0 3.0 1.0 0.47619047619 0.0833333333333 0.666666666667 0.833333333333 0.5 0.5 0.916666666667 0.5 0.833333333333 0.583333333333 0.583333333333 0.0 0.333333333333 0.583333333333 0.583333333333 0.0 0.25 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.75 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -8.68531260873 5.77505079219 -20.2508652906 14.245224616 1.23008674675 1.31639234272 -15.1473392997 25.2025675655 2.06700671287 4.89986432254 -3.08622655241 47.3616973056 -0.387721443794 -0.413181716355 -2.26339200513 45.0382178702 0.303342434538 -2.66348305498 0.775639576837 24.6637109436 0.795496311959 0.763653806585 8.14798032221 24.8386458626 -0.0280365708707 -0.0463080127266 1 5 4 6 2 12 2 7 2 5 1 5 4 5 5 2 4 3 5 4 4 2 6 3 4 4 4 1 7 3 6 2 12 4 5 3 2 1 8 4 5 3 1 2 9 5 3 5 10 5 3 5 11 4 4 3 12 4 4 3 21 1 7 0 299.0 1.76923076923 121.0 0.801652892562 0.189617565799 0.145870851556 0.136855180217 0.0357466466055 0.04052748095 0.0603186898558 0.00911567241148 0.00810222341145 -0.0119937002623 0.217391304348 1.46153846154 0.0 2.0 1.0 2.0 6.0 5.0 5.0 3.0 5.0 5.0 0.277777777778 4.0 1.0 2.0 0.404682274247 0.791666666667 0.375 0.25 0.0416666666667 0.375 0.333333333333 0.666666666667 0.541666666667 0.875 0.541666666667 0.5 0.333333333333 0.458333333333 0.208333333333 0.458333333333 0.333333333333 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 0.833333333333 0.166666666667 0.166666666667 0.0 0.166666666667 0.333333333333 0.5 0.666666666667 0.833333333333 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.666666666667 0.833333333333 -5.70189883077 12.7323954474 -13.2455982816 29.037005647 1.86627385886 -2.46924963406 -1.41844436533 21.3171082379 3.89210940416 -1.35505625596 6.61032323198 11.0795370949 -6.81429373219 0.973790513202 -18.4992740121 16.6087589995 4.29229868332 0.439391069004 -5.91370428316 18.3348349075 -1.23017259656 -1.02978094943 0.504112659796 13.8317956298 0.24510691168 0.443532094416 0 1 1 1 1 1 4 4 2 6 2 6 1 6 4 4 2 4 5 4 2 5 4 4 2 5 4 4 3 3 5 4 3 3 5 4 2 3 6 4 3 3 5 4 2 4 5 4 3 4 3 6 2 13 5 3 7 0 210.0 1.07142857143 117.0 0.623931623932 0.267619047619 0.248979591837 0.111949141561 0.0893527696793 0.0580395205701 0.0292854051528 0.00867133399218 0.00762655257302 -0.0194844598024 0.466666666667 1.0 2.0 3.0 2.0 0.0 5.0 3.0 3.0 2.0 4.0 6.0 0.179487179487 0.0 1.0 2.0 0.557142857143 0.8125 0.6875 0.5625 0.5625 0.5625 0.625 0.4375 0.6875 0.1875 0.0 0.0 0.3125 0.875 0.75 0.75 0.875 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.75 1.0 0.75 0.5 0.25 0.25 0.5 0.25 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.46159645315 1.95230063526 -11.0494660264 7.19067170848 -6.97508916818 3.85140815176 -30.8506456941 21.3923085481 3.12970873153 0.617652170919 -22.6736223171 23.8084618128 -1.02083352477 -2.06620166647 -25.5265730971 9.2574513478 -1.86575229059 -0.809738267219 -42.6373233932 0.576426928498 -0.748741600359 0.596914592476 -57.1899287873 5.03255464994 -0.568246627755 0.0528601949232 3 2 6 1 7 3 3 3 4 8 1 5 3 7 3 4 4 4 4 4 4 3 6 3 4 3 6 3 4 3 6 3 4 3 5 4 4 3 5 4 4 3 5 4 3 4 5 4 2 6 3 6 1 6 3 6 3 1 1 1 10 0 240.0 1.06666666667 114.0 0.745614035088 0.232291666667 0.225 0.103311342593 0.0875390625 0.0609635416667 0.0339800297967 0.0108934100378 0.013709083499 -0.00215571278449 0.25 1.0 2.0 1.0 1.0 0.0 3.0 3.0 3.0 3.0 3.0 5.0 0.142857142857 0.0 0.0 2.0 0.475 0.5625 0.375 0.25 0.4375 0.8125 0.875 0.75 0.8125 0.375 0.1875 0.0 0.0625 0.625 0.375 0.375 0.5625 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.238732414638 4.37676093503 -0.753203285728 12.1048365864 -1.72241706967 2.06683831371 -4.97332215503 17.5360407623 1.16196270991 -2.08223750643 -1.83631845778 6.72514435566 -0.469513165733 -1.03651542864 -2.52005051111 -1.80125965567 0.0400243828207 0.653912267179 -2.64117110898 1.78413174599 0.240140713168 0.0862789261884 -2.0272052056 3.90228565353 -0.185656680845 -0.0440283781208 2 2 3 4 2 4 3 1 28 4 2 4 2 4 3 4 2 4 2 3 3 3 3 2 4 2 3 3 4 2 2 6 2 1 1 1 1 0 126.0 0.285714285714 54.0 0.944444444444 0.191798941799 0.226379440665 0.0185270169208 0.362772298808 0.0588104436366 0.00235403423941 0.0241560898642 0.0051428038202 0.59208767314 1.33333333333 204522252.048 0.0 3.0 1.0 2.0 4294967295.0 4294967293.0 0.0 0.0 5.0 4.0 0.0 2.0 7.0 1.0 0.428571428571 0.166666666667 0.25 0.0833333333333 0.25 0.5 0.5 0.583333333333 0.666666666667 0.583333333333 0.5 1.0 0.916666666667 0.416666666667 0.5 0.916666666667 0.583333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 -1.6370222718 -4.45539584187 -0.650232311255 1.95997224379 5.15853805831 -1.11641859628 18.6546249194 -1.87718815613 1.92351091951 -4.18186784396 30.3147368043 1.73072994837 -1.16274915285 0.13655957554 23.319146589 -1.20051283444 -0.585227653681 -3.07305060442 14.5115464195 0.493008686742 -0.818899389596 -2.85742903116 4.77091443571 -0.0404242075078 -0.138295077698 17 2 12 5 1 6 8 3 1 6 1 6 5 3 4 3 4 3 6 2 5 3 12 3 5 3 12 2 6 2 13 2 7 2 12 2 7 2 11 3 6 4 4 2 3 5 4 6 1 5 1 6 4 5 2 5 2 4 6 3 5 3 3 3 6 3 5 3 3 3 6 3 5 3 3 3 6 3 5 2 4 3 6 2 6 2 4 3 6 3 6 2 4 3 5 3 5 3 4 2 6 3 5 3 1 7 3 5 3 12 3 5 3 1 1 3 506.0 1.04545454545 202.0 0.846534653465 0.19255885891 0.210204814948 0.0915259523472 0.0965124284338 0.0588803223509 0.0351502474714 0.015674176492 0.0171271504789 0.0222472753267 1.0 1.68181818182 3.0 4.0 6.0 8.0 6.0 6.0 10.0 10.0 1.0 7.0 0.333333333333 2.0 1.0 3.0 0.399209486166 0.222222222222 0.472222222222 0.666666666667 0.555555555556 0.333333333333 0.0833333333333 0.111111111111 0.111111111111 0.527777777778 0.527777777778 0.638888888889 0.527777777778 0.416666666667 0.194444444444 0.472222222222 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.777777777778 0.444444444444 0.333333333333 0.0 0.222222222222 0.555555555556 0.666666666667 0.888888888889 1.0 1.0 1.0 0.222222222222 0.777777777778 0.555555555556 0.333333333333 0.444444444444 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.222222222222 0.0 0.0 0.111111111111 0.222222222222 0.0 0.0 0.666666666667 0.777777777778 0.666666666667 0.444444444444 0.666666666667 0.888888888889 0.666666666667 0.666666666667 0.555555555556 0.777777777778 0.555555555556 0.555555555556 0.888888888889 0.888888888889 0.666666666667 0.555555555556 0.555555555556 0.222222222222 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -9.07875153637 2.29736700463 -27.9944512645 7.03751869854 -8.91550228103 2.72809388604 -57.5199623165 19.7404261927 1.97633516006 2.48184317347 -47.5827062107 30.1436574152 3.86890165504 -1.70009338945 -16.1488229094 20.0220774132 1.09350643626 -1.68502087924 -3.63815849709 -2.32312960365 -1.07188426279 -2.33882946708 -12.9233248648 -23.7829200618 -0.152600038809 0.171517168636 2 6 4 7 2 22 3 4 1 3 2 3 2 7 4 7 3 8 5 7 4 6 4 7 2 4 2 8 1 0 140.0 0.714285714286 99.0 0.383838383838 0.343571428571 0.319897959184 0.0706337463557 0.142088556851 0.0469289358601 0.00529421336407 -0.000632977328676 -0.000257903608043 -0.000524921840403 1.1 0.357142857143 2.0 3.0 2.0 1.0 0.0 2.0 0.0 3.0 7.0 16.0 0.075 1.0 3.0 2.0 0.707142857143 0.583333333333 0.833333333333 0.333333333333 0.583333333333 1.0 0.75 0.75 0.0833333333333 1.0 0.666666666667 0.916666666667 0.5 0.916666666667 0.916666666667 0.916666666667 1.0 0.0 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.75 1.0 -3.09215318007 5.82052363308 -9.32529600701 15.1079053159 -2.54091098651 1.84489811584 -16.3780047378 23.636764533 1.82379992977 1.32104189808 -7.51857482367 30.8115852994 1.14266915355 0.809839721905 3.03253458178 37.1918349741 0.227527561278 0.359036571115 6.76400716621 39.0455379566 0.206931142879 -0.590360218546 8.54438017973 32.6472397314 -0.00734961972466 -0.147533823546 2 6 5 9 2 10 2 4 3 4 2 1 6 2 9 3 9 3 5 3 2 2 4 3 3 3 2 3 4 2 3 3 4 3 2 3 4 4 2 4 2 3 1 0 156.0 0.923076923077 78.0 0.820512820513 0.229166666667 0.220414201183 0.0796042899408 0.105201063319 0.0561205621302 0.0199382942989 0.0133685292266 0.0111857146584 0.0202008182022 0.833333333333 0.615384615385 2.0 5.0 1.0 2.0 0.0 2.0 2.0 3.0 3.0 8.0 0.15625 2.0 2.0 1.0 0.5 0.75 0.333333333333 0.25 0.583333333333 0.916666666667 0.166666666667 0.583333333333 0.75 0.75 0.0 0.25 0.166666666667 0.833333333333 0.583333333333 0.416666666667 0.333333333333 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.25 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.25 1.0 1.0 0.75 0.25 0.25 0.5 0.25 0.0 0.75 1.0 1.0 0.75 0.75 1.0 0.75 0.5 -1.37118104818 2.44853758603 -6.23433567464 6.9342145806 -3.9686592637 1.89913790992 -17.4198673832 16.079387382 1.78160193322 2.01991448466 -12.8936412575 26.2792299282 -0.388468701957 0.317606102879 -10.3718961509 32.8001671726 0.555348347425 1.37543677545 -6.00421995696 42.6357356276 0.723023265729 0.390804681956 2.40399384293 50.9195363769 0.0743409839583 0.265027904856 2 1 2 4 1 4 1 4 2 3 22 3 1 4 1 4 2 3 3 2 2 3 2 3 2 3 2 3 2 3 2 14 110.0 0.227272727273 61.0 0.639344262295 0.209090909091 0.301652892562 0.0139481592787 0.551690458302 0.0573403456048 0.00122906218474 0.0174026947791 0.00353317118482 1.28231399184 1.2 195225786.0 2.0 2.0 1.0 1.0 0.0 4294967292.0 0.0 0.0 3.0 0.0 0.3 0.0 5.0 1.0 0.554545454545 0.583333333333 0.25 0.583333333333 0.583333333333 0.75 0.333333333333 0.916666666667 1.0 0.75 0.333333333333 1.0 1.0 0.333333333333 0.166666666667 0.5 0.666666666667 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -3.87759315897 -2.31498099043 -6.77337390444 -1.36829326009 2.83094911923 6.15741896287 -2.91322341569 18.8227730136 -3.13341822107 0.0628057773827 -7.10066445447 24.6562986535 3.35920549678 0.318286476026 0.290372576578 27.7230571596 -2.87107027325 1.3354410629 -6.47139291903 34.4271420693 1.92417305792 -1.35040644077 -4.06664754513 25.1033010361 -0.464630177555 -0.0622130598012 5 5 5 2 2 4 3 2 5 3 1 3 5 3 1 10 1 3 9 3 10 2 9 3 10 3 9 4 5 1 2 11 2 9 7 3 3 0 168.0 0.857142857143 74.0 0.864864864865 0.188988095238 0.208333333333 0.0683441903547 0.111990976946 0.0462992488662 0.0228407805156 0.0155042156549 0.00828458031029 0.0474068970082 1.25 0.285714285714 1.0 5.0 6.0 3.0 2.0 1.0 0.0 1.0 5.0 15.0 0.0512820512821 0.0 3.0 1.0 0.440476190476 0.25 0.833333333333 0.833333333333 0.583333333333 0.5 0.583333333333 0.416666666667 0.916666666667 0.25 0.25 0.0 0.583333333333 0.416666666667 0.25 0.0 0.5 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.5 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -8.82173113138 -0.0909456817668 -21.4008551269 3.09028101858 -0.0881616302841 5.37971548165 -21.4968953708 24.7746465934 1.41181712772 3.20133723992 -13.2539894123 42.8116819943 -0.30797521111 -0.754481333787 -13.1230791924 39.1963514485 -0.193538718799 -0.705771282806 -14.6994936697 32.1935054726 0.158401653226 0.462257303337 -13.6416401363 35.8013310483 -0.0193685113586 0.189837956826 8 1 5 4 4 4 2 4 4 4 2 3 6 3 2 4 5 4 2 3 5 4 1 4 5 3 3 3 5 4 1 4 5 4 2 3 5 4 2 3 5 4 1 4 4 6 1 5 1 7 2 6 1 4 1 0 196.0 1.0 106.0 0.556603773585 0.246355685131 0.284620991254 0.102470059244 0.111592932154 0.0649038665862 0.0283253443118 0.00883848886792 0.0115017800639 0.00372753088482 0.428571428571 0.928571428571 3.0 1.0 1.0 1.0 2.0 3.0 3.0 3.0 2.0 12.0 0.179487179487 1.0 1.0 2.0 0.540816326531 0.6875 0.875 0.875 0.8125 0.125 0.1875 0.25 0.375 0.375 0.25 0.25 0.4375 0.5625 0.875 0.9375 1.0 0.5 1.0 1.0 1.0 0.75 0.75 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.25 0.25 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 -0.0454728408834 -2.95573465742 -6.59510925359 -6.18120227517 -8.98088607447 1.60593369691 -32.8528367475 0.669868783167 3.07292049789 1.8189988614 -25.7173398313 11.9410782585 0.0891758881068 0.640715696506 -19.7246903466 18.6778826922 -0.984949090805 0.543487166838 -28.0720475985 23.6901285526 -0.164910319453 0.232004433262 -30.7364773229 25.9350643003 0.0232283833844 -0.0628609862566 5 2 1 1 7 7 3 2 4 3 2 3 4 4 1 3 2 10 4 2 2 3 9 3 9 3 9 4 9 3 6 1 3 3 4 2 4 7 7 3 4 0 168.0 0.857142857143 69.0 0.971014492754 0.170138888889 0.178996598639 0.0638006070484 0.0928285872881 0.0372540509259 0.0227920527653 0.0117489721137 0.00708579044709 0.0408861906349 0.833333333333 0.5 0.0 3.0 5.0 2.0 2.0 3.0 0.0 2.0 2.0 10.0 0.161290322581 2.0 2.0 1.0 0.410714285714 0.25 0.833333333333 1.0 0.5 0.416666666667 0.583333333333 0.416666666667 0.75 0.416666666667 0.0833333333333 0.0 0.333333333333 0.583333333333 0.416666666667 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.75 0.5 0.75 0.75 0.25 0.0 0.0 -8.95814965403 5.22937670159 -22.66507853 15.0734957866 -1.41754621325 4.25078260544 -26.8296525608 34.1483141497 1.7943401197 3.43772593775 -17.422188118 50.911419954 -0.122968023195 -1.06611213436 -16.2409174232 43.0551825003 -0.649668836899 -2.04882060374 -19.994445941 26.6642652378 0.5811234025 0.988555332774 -15.2289092049 32.2285016871 0.107664036388 0.172132537399 9 3 9 6 8 6 10 4 10 4 10 3 11 4 10 4 5 9 3 11 2 4 4 4 2 3 5 3 2 4 5 3 2 3 6 3 2 3 7 3 1 3 7 3 1 3 7 3 1 4 6 3 2 3 5 4 3 4 3 5 3 5 1 5 294.0 0.666666666667 132.0 0.628787878788 0.24101068999 0.239390994493 0.0720399317115 0.158866471296 0.0610625989486 0.016601988614 0.0137982394803 0.00971001788854 0.0826367111384 0.714285714286 0.52380952381 0.0 3.0 4.0 2.0 0.0 0.0 5.0 5.0 3.0 9.0 0.0909090909091 1.0 2.0 2.0 0.448979591837 0.0 0.208333333333 0.791666666667 0.666666666667 0.0 0.375 0.166666666667 0.375 0.416666666667 0.5 0.166666666667 0.208333333333 0.916666666667 0.958333333333 0.791666666667 0.875 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -1.15197863571 -4.24413181578 -5.18334038879 -13.4603437916 -2.31509347736 -3.34003687505 -5.40046301833 -15.3543927147 5.70264433223 8.17647293539 13.0340639022 18.5963607347 -3.28000003204 -0.88137364104 6.16799742648 27.6977339055 1.50458260737 0.832268820398 5.53467235679 27.7402496015 -1.04044121765 -0.581902858105 3.70766737362 22.9605461625 0.12796301868 -0.296935925568 1 2 11 4 10 4 11 3 11 3 11 3 11 3 11 3 11 3 11 11 3 5 1 6 2 4 4 4 2 3 6 4 1 3 6 4 1 3 6 4 1 3 7 3 1 3 7 3 1 3 7 2 2 4 5 3 2 4 5 2 3 11 6 5 5 0 308.0 0.636363636364 125.0 0.664 0.157699443414 0.223878394333 0.0460944225281 0.158514109331 0.0620760164106 0.0167542354629 0.0193184860575 0.0165132802974 0.131183042304 0.5 0.454545454545 0.0 2.0 3.0 1.0 0.0 0.0 5.0 4.0 1.0 11.0 0.106382978723 0.0 2.0 2.0 0.405844155844 0.791666666667 0.75 0.75 0.75 0.208333333333 0.458333333333 0.375 0.458333333333 0.0 0.291666666667 0.166666666667 0.166666666667 0.0 0.291666666667 0.791666666667 0.583333333333 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -12.0089638878 -9.46248479837 -29.0708170488 -22.4924366562 0.788600187597 1.82268880357 -21.5316925794 -8.39917888126 4.88063069505 7.42931550714 -3.75607290849 24.1134035024 -4.67163327677 -2.57413910728 -19.5091577719 25.0629726666 2.24503864797 2.45890876929 -13.4207217896 29.0776614462 -0.102289152364 -2.23669159634 -9.13795588394 19.6847364846 -0.27888950819 0.254300706182 1 3 1 4 4 3 4 1 7 1 6 2 4 3 4 5 3 2 4 5 3 3 2 6 3 3 2 6 2 4 2 6 3 2 3 6 3 2 4 5 3 3 3 5 3 2 4 5 10 3 5 1 1 1 1 6 1 1 1 1 0 196.0 1.0 96.0 0.760416666667 0.229956268222 0.221209912536 0.0995826303241 0.094730272888 0.0533848300878 0.0324884779081 0.01127989634 0.0128320511914 0.00720268898066 0.571428571429 1.14285714286 3.0 2.0 1.0 2.0 3.0 3.0 3.0 3.0 3.0 10.0 0.142857142857 0.0 1.0 2.0 0.489795918367 0.6875 0.625 0.625 0.75 0.5625 0.375 0.3125 0.5625 0.5 0.0 0.0 0.0625 0.8125 0.6875 0.6875 0.8125 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.00040249943 3.63782727067 -5.82318702518 10.8836029835 -4.60018106651 3.31487729868 -17.9976268848 23.5915451146 3.15198187826 0.775140537974 -4.18946812705 27.3490540935 1.55872319124 -1.0684237223 8.49814486236 19.5525384851 -0.997924607478 -0.567802830144 5.1803109873 13.2707989824 0.917490526301 0.137898269888 11.1590266075 12.9613822721 0.103758529574 -0.0562013511239 8 1 1 2 8 9 6 4 1 5 4 3 5 3 4 3 5 3 3 11 1 2 1 3 10 5 12 2 13 3 12 3 13 3 6 1 5 6 1 3 7 8 9 2 5 0 225.0 1.0 85.0 0.929411764706 0.191703703704 0.161777777778 0.0828546282579 0.0743711604938 0.0474458600823 0.0292535125515 0.0156286082634 0.00952187150008 0.0152705107343 0.933333333333 0.466666666667 0.0 1.0 6.0 4.0 2.0 2.0 0.0 2.0 2.0 15.0 0.3 1.0 3.0 2.0 0.377777777778 0.0 0.25 0.5 0.125 0.4375 0.8125 0.6875 0.75 0.5625 0.375 0.0 0.3125 0.625 0.375 0.0 0.1875 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.75 1.0 0.5 0.0 0.5 0.5 0.0 0.0 -4.75342763368 5.34760608789 -7.27081792501 15.287720293 6.13418518441 4.01777811894 12.2681285534 32.3589989566 -0.618029427081 2.07367651759 10.4191876221 40.1606651152 -3.14068820855 -2.5656404236 -9.13979516779 22.7199328656 0.892417884938 -1.54640785519 -6.57177777665 7.77057307109 0.580815403732 0.666888997281 0.697903409712 7.35589145303 -0.0748245527083 -0.427738437216 1 2 7 3 10 2 2 4 4 3 1 5 3 9 3 8 4 5 7 4 8 3 4 2 3 2 4 2 4 2 29 3 3 1 0 156.0 0.923076923077 96.0 0.458333333333 0.275106837607 0.315581854043 0.0804092596807 0.128877341155 0.0534672701832 0.0122058622641 0.00165704052971 0.00409861914244 -0.000218121556022 0.833333333333 0.384615384615 3.0 5.0 2.0 0.0 1.0 1.0 1.0 1.0 5.0 14.0 0.0810810810811 0.0 3.0 2.0 0.615384615385 0.583333333333 0.0833333333333 0.5 1.0 0.5 0.166666666667 0.833333333333 0.916666666667 0.583333333333 0.333333333333 0.666666666667 0.666666666667 0.916666666667 0.833333333333 0.916666666667 0.833333333333 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.75 1.0 0.75 0.25 0.0 0.25 0.75 1.0 0.5 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.9098593171 -2.64442059291 -5.39945148745 -4.68928282358 -0.897990293385 2.89825715213 -6.85828748884 7.69629129396 1.35221926311 2.63468851116 -2.74915476986 22.3979683076 -1.09630332776 0.127760727556 -6.25733488164 29.5184277776 0.457777559145 1.90857102667 -3.5609685231 43.4608821195 0.742617401561 0.627414545085 3.72803969812 54.5910013897 -0.08498699924 0.213056579783 5 5 6 8 4 3 1 6 2 4 1 7 1 11 2 6 1 3 2 4 9 3 11 3 10 3 10 4 5 2 3 10 3 9 6 5 4 0 182.0 0.928571428571 96.0 0.614583333333 0.226120033812 0.230376766091 0.0720424817303 0.100463824908 0.042008151853 0.0172036065339 0.0087850646313 0.00328838164949 0.0184271071904 0.769230769231 0.285714285714 0.0 4.0 3.0 3.0 1.0 2.0 0.0 1.0 4.0 11.0 0.212121212121 1.0 3.0 1.0 0.527472527473 0.375 0.8125 0.8125 0.625 0.75 0.75 0.1875 0.6875 1.0 0.6875 0.0 0.5 0.625 0.5625 0.0 0.4375 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 -9.82213363081 5.82052363308 -24.2185759586 15.6139952042 -0.62919563508 2.90840578222 -25.6609006577 29.9222244091 2.08355003919 3.11863007784 -13.1855446121 44.5185672346 0.592158483717 -0.584582157027 -5.98195340825 41.0583989222 0.127987481636 -1.35754784976 -4.23817238544 28.8006242364 -0.11389057727 -0.0829352940344 -7.18418272596 21.5264728462 -0.277016628485 -0.422996333486 1 5 3 11 2 5 1 6 4 2 4 3 5 1 5 4 3 2 6 3 3 1 7 4 2 1 7 4 1 2 8 6 8 5 10 4 10 4 10 3 6 0 182.0 1.07692307692 76.0 0.697368421053 0.17464678179 0.155536770921 0.0674722421643 0.0636973821976 0.0387096902614 0.0210195083015 0.0116826047236 0.00353745237086 0.0109017096093 0.214285714286 0.615384615385 0.0 1.0 2.0 0.0 3.0 3.0 2.0 0.0 2.0 7.0 0.275862068966 0.0 1.0 2.0 0.417582417582 0.8125 0.375 0.125 0.0 0.6875 0.75 0.875 0.5625 0.1875 0.25 0.75 0.6875 0.6875 0.3125 0.1875 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 0.5 0.5 0.25 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.25 0.0 0.0 0.0 0.0 0.25 0.75 -7.36660022311 4.45633840657 -14.8530376015 14.6350451945 4.08837960228 5.42658034828 -3.29616131444 31.3445083181 -0.999119373666 -1.58120393349 -5.14119416437 28.1939176663 -1.23131905817 0.247140118218 -11.7950118293 23.3549076035 1.25517468242 -0.683577228644 -6.09678881572 22.2890913626 -0.511568914675 1.22590670258 -4.75252535639 30.7768165574 0.235017413642 0.108437991622 3 1 6 2 5 4 4 4 3 15 2 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 5 5 5 3 1 0 136.0 0.470588235294 62.0 0.725806451613 0.15625 0.214532871972 0.0221399221453 0.190152401791 0.0426038062284 0.00425941622782 0.0166284609705 0.00466173419758 0.21505057516 0.375 0.0 0.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 1.0 5.0 0.130434782609 0.0 2.0 1.0 0.455882352941 0.4 0.7 0.5 0.3 0.7 1.0 1.0 0.7 0.9 1.0 1.0 0.8 0.8 0.7 0.5 0.7 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 -8.05136770935 3.96951152182 -13.7994375312 9.10739231487 7.25083097952 -0.480736689494 3.52588455985 9.36786470771 -4.16248099287 1.19682671719 -4.4252420259 14.776229396 1.79843579822 0.634155451366 -2.81909158484 17.6434296984 -0.624793471418 -1.20143785602 -3.13730876679 9.51843848233 -0.417825464372 0.124981682502 -7.40766787371 9.05342844154 0.243308135398 0.141217431324 6 3 9 8 4 3 4 4 3 3 5 4 1 3 7 3 1 3 7 7 8 6 7 7 8 7 6 3 1 4 6 2 3 3 5 2 5 3 3 3 5 7 4 0 196.0 1.0 88.0 0.738636363636 0.206997084548 0.211370262391 0.0955841103622 0.0903705088866 0.0488386004131 0.0371390592172 0.00985906832938 0.011166950175 0.0146584696877 0.642857142857 0.785714285714 0.0 2.0 3.0 3.0 1.0 3.0 3.0 3.0 2.0 7.0 0.305555555556 0.0 2.0 2.0 0.448979591837 0.25 0.75 1.0 0.625 0.5 0.3125 0.3125 0.5625 0.5 0.0 0.0 0.0625 0.625 0.5 0.375 0.5625 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.00160999774 1.9098593171 -12.6345574816 7.5993169209 -4.7143271773 4.8804422491 -30.9206353389 27.5096686841 -1.55869004777 2.85319823071 -39.7001717784 43.3681344198 0.777164318838 -0.587896842229 -34.5136836494 39.6831344796 0.39878294923 -1.13749017232 -29.2424890223 28.3737922808 -0.0206278225623 -0.240203494777 -28.5078222563 24.1396970438 -0.030469364838 0.0884929201107 8 4 9 6 1 4 3 6 1 5 4 4 1 4 5 4 2 3 5 4 2 3 5 3 3 2 6 3 3 2 6 3 3 3 5 3 3 3 5 4 2 3 4 5 2 13 2 5 3 2 6 1 9 0 210.0 0.933333333333 102.0 0.754901960784 0.232653061224 0.223492063492 0.091657920311 0.0965062088327 0.0519267897635 0.0254780136958 0.00966409379081 0.00804300868689 0.0093490668575 0.357142857143 0.733333333333 0.0 2.0 2.0 1.0 1.0 3.0 3.0 2.0 1.0 6.0 0.15625 0.0 1.0 2.0 0.485714285714 0.5 0.875 0.625 0.75 0.1875 0.3125 0.125 0.4375 0.5625 0.25 0.25 0.5 0.9375 0.9375 0.75 0.9375 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.0 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.64995336157 2.88600963473 -14.9652531738 10.327942581 -8.12722948511 5.14049245528 -35.9126931154 28.937487159 5.65100387636 0.751108633883 -15.855571759 34.6841189617 -0.188836400622 -0.489762108644 -7.78352264909 33.3946915085 -0.681671139793 1.50316087064 -13.8073995711 45.7994588757 0.446927519932 1.44820242683 -11.6045809952 62.9317998865 -0.136865949322 0.228141524056 1 3 3 6 2 5 2 5 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 4 3 4 4 3 4 3 4 3 4 3 4 3 4 2 6 1 2 1 2 1 0 147.0 0.333333333333 86.0 0.546511627907 0.271137026239 0.275996112731 0.0241320462657 0.319953609654 0.0581673735717 0.00137708503504 0.0115695198568 0.000768154570488 0.456234877621 0.285714285714 0.047619047619 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 3.0 4.0 0.115384615385 0.0 10.0 1.0 0.585034013605 0.416666666667 0.0 0.0 0.166666666667 0.833333333333 0.5 0.5 0.666666666667 1.0 1.0 1.0 0.916666666667 0.916666666667 1.0 1.0 0.916666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.33467499812 3.09215318007 -5.89975394594 9.05835869945 2.39304691887 2.63226912034 -2.37488881907 20.1576554761 -2.52311834036 1.66977339797 -6.13909845821 29.9665955929 2.40016761447 0.498727232989 -1.54638092259 33.5252502604 -2.06414866477 -0.300622205055 -5.73834608741 30.2510103292 1.47185746656 -0.475222804618 -4.74230663194 24.1381393363 -0.452229512919 -0.112234914335 1 0 7 2 5 1 6 2 5 1 6 2 4 4 4 3 2 5 4 3 2 5 4 2 3 6 4 1 2 7 7 7 6 9 5 9 4 11 3 11 3 11 3 11 2 12 2 12 2 11 3 10 3 9 4 9 5 10 4 8 0 308.0 0.636363636364 114.0 0.649122807018 0.164424860853 0.131198347107 0.0395188778796 0.0976242065196 0.0307974382465 0.010019233069 0.00926532983036 0.00194243829023 0.0649120492006 0.428571428571 0.318181818182 2.0 3.0 1.0 0.0 5.0 2.0 0.0 0.0 2.0 7.0 0.189189189189 0.0 6.0 2.0 0.37012987013 0.541666666667 0.0416666666667 0.0 0.208333333333 1.0 0.708333333333 0.291666666667 0.541666666667 0.416666666667 0.833333333333 0.666666666667 0.291666666667 0.791666666667 0.375 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.833333333333 0.5 -6.88706844652 11.6327794769 -14.7704014997 24.7394776092 2.00575883954 -4.1289407851 -12.6090044726 16.5888042406 -2.30097386124 2.92984593409 -16.336654662 22.7733007516 1.55952337528 -0.515438925092 -15.2057756941 24.6171794553 -1.91894094164 0.106255374095 -22.3911632037 23.2771415299 0.521702683296 0.0911343680585 -27.5184162308 21.4006335743 -0.394294414403 -0.364206548022 1 2 4 9 6 10 5 11 4 11 4 11 4 11 4 12 3 11 4 11 10 5 5 3 3 4 4 4 4 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 2 4 6 4 1 5 4 5 3 1 1 1 4 1 1 1 2 0 330.0 0.681818181818 128.0 0.6875 0.158383838384 0.201790633609 0.0471387149734 0.138818070512 0.0622820491416 0.017197753272 0.0232659383981 0.0186475239768 0.100805745065 0.266666666667 0.636363636364 2.0 1.0 0.0 0.0 0.0 0.0 5.0 5.0 5.0 9.0 0.212765957447 0.0 2.0 2.0 0.387878787879 0.625 0.458333333333 0.5 0.583333333333 0.75 0.833333333333 0.625 0.541666666667 0.0 0.208333333333 0.0416666666667 0.0 0.0 0.25 0.583333333333 0.541666666667 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.5 0.5 0.5 0.5 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -9.95441825884 -5.90320152559 -21.9050538665 -14.9341492607 3.40598752745 -0.139903293326 -9.66669992151 -10.2079958205 1.4065177644 4.68394387955 -4.45461680818 8.69755975303 -3.62148007979 -1.74551565253 -19.4016449845 11.7036591868 2.53311100304 3.00432976222 -7.57922506361 25.5649951422 -0.0607084470385 -1.10855834353 -4.32141377892 24.0232723434 -0.334861104068 0.0647631317223 4 3 10 4 8 3 1 4 4 3 3 4 2 4 4 4 1 28 11 2 10 3 10 3 10 4 10 4 5 2 3 9 6 6 3 0 195.0 0.866666666667 90.0 0.7 0.189349112426 0.211965811966 0.0651271936479 0.102109610749 0.0416264603247 0.0207157892626 0.0086364597703 0.00706597283562 0.0407703921617 1.07692307692 0.266666666667 1.0 4.0 6.0 3.0 1.0 2.0 0.0 1.0 2.0 9.0 0.28125 0.0 4.0 4.0 0.461538461538 0.1875 0.75 0.75 0.8125 0.6875 0.75 0.25 0.1875 0.5 0.6875 0.25 0.0 0.3125 0.9375 0.25 0.125 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 1.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.75 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.25 0.75 0.75 0.25 0.5 1.0 0.5 0.0 -11.3742732663 6.11154981473 -29.6393013186 12.5445664824 -3.29570982602 -2.38576796471 -41.5211717202 10.6741694115 0.985409860525 4.10595545907 -35.508736917 23.9716634242 0.801807316272 -1.59914255417 -27.170353912 16.5804895721 0.416632702669 -1.8810630329 -20.0039190754 -0.193365821298 1.17142635994 0.538658003005 -5.56992886629 -0.875583914962 0.42902620559 -0.207336307713 1 0 5 2 4 1 12 1 10 3 5 7 4 8 4 9 2 10 2 23 1 10 3 8 4 8 6 4 0 156.0 0.923076923077 62.0 0.645161290323 0.151709401709 0.130177514793 0.0495140680052 0.0703990289789 0.0249171850503 0.0161198516858 0.00906811738971 0.000463830190038 0.0328823477493 0.5 0.0 1.0 3.0 2.0 0.0 1.0 0.0 4294967295.0 0.0 0.0 4.0 0.15 3.0 2.0 1.0 0.397435897436 0.75 0.25 0.0 0.166666666667 1.0 0.916666666667 0.416666666667 0.75 0.833333333333 0.666666666667 0.25 0.666666666667 0.75 0.0833333333333 0.0 0.166666666667 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.63943726841 6.46413922712 -15.9645471535 16.7537254413 3.54328018958 1.99939755546 -5.14269512787 25.9491762424 0.152482997515 1.33317174794 -0.708310089257 32.7312104124 -0.493171967213 0.455898180563 -2.17951024864 36.1270703848 0.971608549382 0.0825073472773 3.45007725712 37.5444762919 -0.270661177444 0.49796647004 3.84225093811 42.7495981829 0.06816678674 0.193674159084 3 2 6 3 6 3 5 17 1 7 2 4 6 3 6 2 7 3 5 3 6 4 5 4 5 4 6 7 2 7 144.0 0.5625 73.0 0.58904109589 0.203703703704 0.246961805556 0.0365547839506 0.183384438765 0.0508696630658 0.00750573345336 0.0150317747479 0.00520291914938 0.1646682378 0.777777777778 0.0 1.0 0.0 3.0 2.0 0.0 0.0 0.0 0.0 1.0 5.0 0.0714285714286 0.0 4.0 1.0 0.506944444444 0.333333333333 0.75 0.416666666667 0.583333333333 0.916666666667 1.0 0.916666666667 0.916666666667 0.5 0.833333333333 0.25 0.25 0.25 0.666666666667 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 -7.55985979687 2.14859173174 -13.1989111265 3.85645478142 6.56731734903 -1.68511512989 2.99842094826 0.45891722317 -3.35022660886 1.82611209096 -2.58205084959 9.00547821897 1.45167747315 1.17390749176 -0.910491402677 16.9470413842 -0.171258943694 -1.00814939581 1.7488839785 9.57122717468 -0.209606835191 -0.648799697744 -1.28346538125 0.613091788233 0.0283137918923 -0.0904385524332 1 9 1 3 6 2 10 4 4 1 4 4 3 2 4 3 3 4 4 2 2 5 4 2 2 5 8 6 7 6 6 8 5 8 4 10 3 10 3 10 3 10 2 11 2 10 3 10 3 9 4 7 5 8 4 9 2 10 0 299.0 0.565217391304 111.0 0.765765765766 0.151273475688 0.144248945761 0.0316737570255 0.113095111392 0.0312768006792 0.00791656726776 0.00866384274545 0.00208827311356 0.0897210629092 0.461538461538 0.260869565217 2.0 3.0 1.0 0.0 4.0 2.0 0.0 0.0 3.0 5.0 0.305555555556 0.0 6.0 1.0 0.371237458194 0.666666666667 0.333333333333 0.0 0.166666666667 0.5 0.875 0.583333333333 0.708333333333 0.375 0.75 0.5 0.208333333333 0.625 0.166666666667 0.0 0.0 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.5 0.5 0.833333333333 1.0 1.0 0.833333333333 0.5 0.5 0.166666666667 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.666666666667 0.166666666667 0.166666666667 0.5 0.833333333333 1.0 0.666666666667 0.5 0.166666666667 -8.801960331 13.950276751 -16.7823791415 31.5435367257 5.47952404384 -1.99666396922 -5.02688369195 33.0689626583 -3.25154855612 4.74962278368 -6.84368642721 48.2075022989 3.16213052925 -0.801711646936 0.0411505335752 50.049693915 -2.08877037454 0.179825737636 -0.902094898377 47.8892711063 2.01580550169 0.159162120529 3.70037858315 46.5196447215 -0.469797290342 -0.368513186742 2 3 2 4 2 4 3 2 23 1 2 4 2 5 1 5 2 3 4 2 4 3 3 2 3 4 3 3 2 4 2 4 1 6 2 2 2 0 126.0 0.285714285714 61.0 0.852459016393 0.194444444444 0.256235827664 0.016975308642 0.392776158082 0.0538548752834 0.00178256462265 0.0210385913656 0.00361376164843 0.688623096574 1.5 204522252.048 1.0 3.0 1.0 3.0 4294967295.0 4294967294.0 0.0 0.0 1.0 3.0 0.15 1.0 7.0 1.0 0.484126984127 0.166666666667 0.5 0.333333333333 0.416666666667 0.5 0.5 0.75 0.833333333333 0.666666666667 0.583333333333 1.0 1.0 0.583333333333 0.5 0.75 0.916666666667 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 -3.94097954323 -2.42521818045 -6.05608953271 -2.18671542178 3.98469946281 5.85022018222 0.719898285779 20.0938194228 -3.9350038204 2.28448940895 -6.14673385548 31.7910507146 3.5366731391 -2.39800462751 2.00546402206 19.9953110715 -2.48353567791 0.349730105984 -3.54425086264 14.744646814 1.22449555801 -0.977965536603 -3.64364640161 7.25063846227 -0.193258152174 -0.10284623393 6 4 7 7 3 9 3 9 2 4 3 2 3 4 8 4 8 3 9 3 8 4 7 5 8 4 9 3 9 3 8 4 9 3 9 3 8 4 8 4 8 4 7 6 7 5 6 0 264.0 0.545454545455 101.0 0.574257425743 0.134785353535 0.165289256198 0.0266064027847 0.147599444862 0.0192015715001 0.00775333881142 0.00506632347011 -0.00160244909662 0.142960191816 0.333333333333 0.0454545454545 3.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 3.0 6.0 0.2 0.0 2.0 1.0 0.382575757576 0.111111111111 0.5 0.555555555556 0.611111111111 0.555555555556 1.0 1.0 1.0 0.722222222222 0.444444444444 0.333333333333 0.388888888889 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.166666666667 0.166666666667 0.0 0.166666666667 0.5 0.5 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -13.9766977297 7.78412358031 -24.531815246 19.1868872511 12.1152664757 0.537491712395 5.85922346277 20.8013203112 -6.2384209636 -1.37371949921 -8.15984082634 11.9603918221 0.917019530014 -0.714515001871 -12.1268947324 4.14341198142 0.974047111315 -0.674457461998 -4.73948578426 -3.08292623553 -1.67646607935 -0.60565564998 -15.7871726783 -11.7263648925 0.215419997801 -0.310217888345 9 1 8 1 3 5 3 6 2 5 2 6 3 5 2 5 4 4 2 4 6 3 3 3 6 3 3 2 7 4 1 4 5 5 2 2 7 3 3 3 6 4 2 3 5 5 1 5 3 6 1 5 4 4 1 0 210.0 1.07142857143 106.0 0.707547169811 0.248571428571 0.249659863946 0.114728539035 0.0944783500702 0.0648351149984 0.0362669372345 0.010555793426 0.0147085976793 -0.00730091739106 0.533333333333 0.928571428571 2.0 3.0 1.0 0.0 2.0 3.0 3.0 3.0 2.0 4.0 0.206896551724 0.0 0.0 2.0 0.504761904762 0.5625 0.75 0.5625 0.5625 0.4375 0.625 0.375 0.5 0.4375 0.0625 0.0 0.0625 0.75 0.6875 0.5625 0.6875 0.0 0.5 1.0 0.75 0.5 0.25 0.0 0.25 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.25 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.169765272631 2.84356831658 -3.94284414202 6.75169566606 -6.24057142193 -0.334437587084 -23.6328938641 4.39083115303 0.976724585343 -1.6073166426 -23.5594341673 -5.22589166583 0.0980939794186 -0.907831182943 -23.4151639217 -14.1291940028 -2.05089579656 -0.801124437237 -39.3504470554 -22.2838954528 -0.630199918363 -0.58546193923 -50.8030685504 -29.1843968145 -0.275300465621 -0.0723667389474 3 2 11 6 10 6 11 5 12 4 12 4 12 4 13 3 13 3 12 4 4 1 7 5 2 5 4 5 3 4 4 4 5 3 5 2 7 2 4 3 7 3 3 3 6 3 4 3 7 2 4 2 7 4 3 3 7 2 4 3 7 3 2 5 5 12 3 6 1 1 1 1 12 0 368.0 0.695652173913 131.0 0.847328244275 0.137398097826 0.188445179584 0.0429356614909 0.133018435336 0.0571213414423 0.0168875429561 0.0229322730737 0.0185392141438 0.102696434821 0.6875 0.608695652174 4.0 2.0 3.0 2.0 0.0 1.0 5.0 5.0 2.0 6.0 0.222222222222 3.0 1.0 2.0 0.35597826087 0.666666666667 0.416666666667 0.458333333333 0.541666666667 0.708333333333 0.791666666667 0.708333333333 0.5 0.0 0.0833333333333 0.125 0.0 0.0 0.208333333333 0.541666666667 0.375 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.166666666667 0.333333333333 0.5 0.333333333333 0.5 0.833333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.333333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -11.3484394205 -6.86442189335 -25.5604316439 -16.9488327562 3.15814056222 0.177899829543 -13.2536546852 -11.9651725068 2.09636759536 4.25796802959 -6.7682253897 6.10533821707 -4.7501555692 -1.66678207859 -26.1181595703 5.10187275951 2.94636107596 0.837525502493 -14.9289488732 0.938117571225 -0.567059714069 -2.1316983747 -14.3113072413 -11.5419274305 -0.34248012461 0.315800218076 3 1 6 2 5 3 5 5 2 15 1 5 4 3 6 2 6 2 6 2 6 2 6 2 6 3 5 3 6 4 1 0 128.0 0.5 54.0 0.759259259259 0.1513671875 0.1865234375 0.0236392021179 0.156492233276 0.0415906906128 0.00461097256985 0.0168503811575 0.00461614280278 0.15927530338 0.375 0.0 0.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 6.0 2.0 0.153846153846 1.0 4.0 1.0 0.421875 0.25 0.875 0.375 0.0 0.625 1.0 0.75 0.5 0.875 1.0 1.0 1.0 0.625 1.0 0.625 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 -6.88345128872 5.4510568009 -12.4168938228 11.288117084 5.40660532265 -2.44856149753 0.62277251471 5.66927473711 -2.79275446146 1.65253907388 -3.22821819444 12.3421661408 1.45837229651 1.43489940279 -2.33171909758 21.8555067539 -1.09643066476 -0.90429234626 -5.7616645166 15.7959036991 0.186669792975 -0.564161786451 -6.16257912809 7.69572960967 0.156203369747 -0.0630661748745 5 1 13 3 6 1 3 4 6 3 2 4 5 3 3 4 4 3 4 3 5 3 4 3 4 4 3 3 4 3 5 2 4 4 5 2 4 6 2 3 1 9 2 3 1 1 1 6 11 3 4 0 195.0 1.15384615385 84.0 0.928571428571 0.193504273504 0.223668639053 0.0906547986311 0.0822705709806 0.0557855661761 0.0313881642256 0.0101274726979 0.0113763680788 0.00640739324004 0.333333333333 0.923076923077 0.0 2.0 0.0 2.0 2.0 3.0 3.0 4.0 0.0 1.0 0.518518518519 1.0 1.0 2.0 0.430769230769 0.25 0.5 0.5625 0.5 0.625 0.625 0.1875 0.3125 0.0625 0.0625 0.5625 0.8125 0.1875 0.75 0.75 0.8125 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.0 0.25 0.5 0.5 0.5 0.5 0.75 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 -6.62084563262 1.01859163579 -20.2336604961 6.61963283706 -5.56830094231 5.45512409389 -34.5827691908 20.4025931011 4.30157535396 -3.8257798832 -18.7897501068 6.51466874428 -0.485965849754 -0.567916991452 -12.3111871491 -5.27569777208 0.49792757469 -0.400000923674 -11.1206038105 -5.18232086244 0.150508429052 0.895896177187 -4.90665748777 -0.146976236406 0.334657400588 -0.125036028826 4 6 7 7 4 11 1 3 2 26 7 4 9 3 10 3 10 3 11 3 11 2 12 7 8 4 4 0 182.0 0.928571428571 82.0 0.573170731707 0.177937447168 0.166797488226 0.0646403922125 0.0742227673305 0.0265334985025 0.0212583760972 0.00662044595945 0.00255078492401 0.0237128236869 0.692307692308 0.0714285714286 0.0 5.0 3.0 1.0 0.0 1.0 0.0 0.0 6.0 6.0 0.142857142857 0.0 3.0 3.0 0.450549450549 0.3125 0.9375 0.8125 0.5625 0.75 0.625 0.0625 0.375 1.0 0.5 0.0 0.25 0.6875 0.5 0.0 0.0625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.75 1.0 0.75 0.25 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.75 0.75 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -9.27645954021 10.0494978352 -22.4175994469 25.109072769 0.12528231672 1.7036075031 -20.9971904712 34.6578985607 2.30664347076 2.12508590932 -7.14792223681 44.9180134754 0.455509140472 0.734805653618 -1.62591433657 46.4766034133 -0.391436023045 -2.3564198669 -4.9680437978 27.3747882254 -0.458133844134 -0.761780048197 -10.8884377373 15.673726409 -0.141969534187 0.00925376052473 3 1 7 3 5 4 4 18 1 4 5 4 5 4 5 4 5 4 5 3 6 3 6 4 5 7 2 8 3 4 2 0 144.0 0.5625 75.0 0.586666666667 0.191358024691 0.255208333333 0.0331254286694 0.180989583333 0.0483378343621 0.00690222249213 0.0133372002886 0.00476500283398 0.169253474455 0.555555555556 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 7.0 0.148148148148 0.0 3.0 1.0 0.520833333333 0.5 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.416666666667 0.666666666667 0.333333333333 0.166666666667 0.25 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -9.70845152861 2.66584529679 -17.7797215654 6.8944078823 7.28444714144 1.007307799 -0.42161315492 12.5936330078 -4.05118979885 1.52051910632 -7.81249261506 18.8454775157 1.70197413325 -0.52412382229 -4.33250875434 16.6826607905 0.633335631022 -0.531724010402 5.30694492808 8.01035561231 -0.292676969489 -1.37834442371 0.746521104133 -6.38206789329 -0.151178394862 -0.168904665893 1 4 5 6 3 1 5 2 3 3 4 1 3 4 20 1 1 1 1 1 1 2 3 9 3 9 4 8 4 8 4 9 6 2 2 2 10 4 8 7 4 2 0 180.0 0.8 94.0 0.627659574468 0.218518518519 0.237407407407 0.0674787379973 0.122294067215 0.0431529492455 0.0182923334139 0.0119423689744 0.00449331515294 0.0472887651619 1.0 0.466666666667 0.0 5.0 5.0 2.0 2.0 4.0 0.0 1.0 3.0 12.0 0.181818181818 0.0 3.0 4.0 0.522222222222 0.25 0.916666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.833333333333 0.5 0.333333333333 0.0 0.5 0.583333333333 0.416666666667 0.0 0.333333333333 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 0.75 0.75 0.75 0.25 0.0 0.25 1.0 0.75 0.25 0.5 0.75 0.25 0.0 0.0 0.75 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.75 0.25 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.75 0.5 0.75 0.75 0.25 0.0 0.0 -11.4167145845 3.90460127052 -26.5054370669 13.6478506386 1.63936664938 6.83814518159 -20.7466155812 41.2836465405 1.8664580916 3.68837480575 -8.39703419445 62.9363844774 -0.198999458051 0.164387779472 -6.05556531541 66.2698302754 0.509246730105 0.192577653515 -2.87060901766 67.9207081114 -0.0541863528427 1.00823008276 -3.359819644 79.1340867411 -0.161295354759 0.397728440864 3 2 6 2 5 3 5 3 3 16 1 4 5 3 4 4 5 2 5 4 5 3 5 3 5 3 5 6 3 5 4 2 2 0 136.0 0.470588235294 65.0 0.661538461538 0.202205882353 0.226211072664 0.0306075717484 0.193650375916 0.0555239288622 0.00511348918811 0.0199300715163 0.00590090017392 0.19345087274 0.75 0.0 2.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 7.0 0.0769230769231 0.0 4.0 1.0 0.477941176471 0.2 0.6 0.2 0.0 0.4 0.9 0.7 0.3 0.8 1.0 1.0 0.7 1.0 1.0 0.9 0.9 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 -5.28019928846 3.29544352755 -8.12004044566 7.51863189771 5.70703127099 -0.4986185394 4.08227294043 7.08582996855 -4.23648249228 0.668073301597 -3.86621954261 9.46733241382 2.96210207356 0.136414359114 2.46737531912 8.54759103956 -1.59458525925 -1.33402792072 -0.697744958486 -1.52421851016 0.298150519763 -0.0560555062932 -2.87444769482 -4.04237411128 0.122549283615 0.0794311214802 0 4 2 4 2 5 2 3 28 1 3 5 1 5 1 5 2 3 3 3 3 4 2 4 2 4 2 4 2 4 2 4 1 6 2 2 2 0 132.0 0.272727272727 70.0 0.642857142857 0.191919191919 0.280303030303 0.0153219523054 0.426442454852 0.0555364248546 0.00161944471768 0.017833772344 0.00393017312194 0.816193644685 1.16666666667 195225786.0 2.0 1.0 1.0 2.0 4294967295.0 4294967293.0 0.0 0.0 1.0 4.0 0.15 2.0 6.0 1.0 0.530303030303 0.583333333333 0.333333333333 0.666666666667 0.583333333333 0.666666666667 0.416666666667 1.0 1.0 0.666666666667 0.416666666667 1.0 1.0 0.416666666667 0.333333333333 0.833333333333 1.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -4.716773768 -3.79078137183 -7.36569923295 -3.8062047562 4.5824905215 7.92773371303 0.055798466054 22.6940311143 -4.7229314103 0.249210091176 -7.95734748043 27.7562097662 4.47855366533 -1.89887314266 3.00387749777 16.176088897 -3.11266130417 0.49427709422 -3.77532620148 11.964941681 1.71924234284 -1.43711314011 -1.66356063592 3.99292401379 -0.227529528966 0.216633682197 1 2 2 3 3 2 4 3 2 2 4 4 1 1 5 4 7 3 7 5 4 6 3 4 2 3 1 3 4 3 1 3 3 4 1 3 2 10 3 4 1 2 6 1 1 0 143.0 0.846153846154 75.0 0.773333333333 0.246026700572 0.257665411512 0.0828238219798 0.11993336997 0.0562220800374 0.0181648935432 0.00641414184133 0.00923320173457 0.0215599033166 0.818181818182 0.769230769231 2.0 2.0 3.0 2.0 3.0 1.0 2.0 3.0 3.0 5.0 0.346153846154 0.0 1.0 2.0 0.524475524476 0.583333333333 0.0833333333333 0.666666666667 0.916666666667 0.0833333333333 0.166666666667 0.583333333333 0.416666666667 0.416666666667 0.583333333333 0.416666666667 0.25 0.916666666667 1.0 0.833333333333 0.666666666667 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.75 0.5 0.5 0.5 0.75 1.0 0.5 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.88147353097 -0.293824510324 -4.78821599807 -1.23279346287 -3.62673330494 -0.518104757849 -15.2555424683 -1.6159830008 1.24758909672 0.840425955739 -14.0078777687 -0.662031047571 -1.10781633327 -1.42236924716 -18.2700549895 -6.65123291333 -0.534520210335 0.224950083827 -25.2551415307 -10.9039711856 -0.120834244173 -1.17125462839 -24.1165715698 -19.6566700882 0.239882611111 -0.048081670401 4 6 5 4 2 2 3 3 4 2 2 5 1 4 2 11 4 1 20 1 10 4 9 3 9 5 3 3 2 9 4 7 8 1 1 1 3 0 168.0 0.857142857143 72.0 0.944444444444 0.193948412698 0.190051020408 0.0658657188074 0.102808273607 0.0468629788225 0.0197780644211 0.0151800513119 0.00823566641059 0.0384397405922 1.25 0.285714285714 2.0 4.0 6.0 3.0 2.0 1.0 0.0 1.0 5.0 9.0 0.25 0.0 3.0 0.0 0.428571428571 0.25 0.333333333333 0.5 0.416666666667 0.75 0.583333333333 0.333333333333 0.833333333333 0.75 0.5 0.0 0.666666666667 0.5 0.416666666667 0.0 0.5 0.0 0.0 0.25 0.5 0.25 0.0 0.25 0.75 0.0 0.25 0.75 1.0 0.5 0.0 0.25 0.75 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.25 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -6.09336067838 2.27364204417 -14.1740402273 8.66257182891 0.808302947131 4.95468362197 -11.4516017757 27.310665714 0.957164475388 1.41723371768 -4.32251366262 35.9376294081 0.462312852292 -0.846372619046 1.08404479861 30.3891581982 0.647750360059 -0.294601179065 5.77449582076 25.9599120415 -0.329625835624 0.121793786695 3.91716502779 27.6783850619 -0.00343198377359 0.193153970137 2 3 3 5 2 5 3 2 34 2 4 3 3 4 4 3 4 3 5 2 5 2 4 3 4 3 5 3 3 4 2 13 147.0 0.333333333333 60.0 0.866666666667 0.182701652089 0.225785552316 0.020711954549 0.351991155109 0.0627330574971 0.0028600435732 0.033365737993 0.00705153673407 0.545362474668 1.14285714286 204522252.0 0.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 4.0 0.0 0.0 1.0 2.0 1.0 0.408163265306 0.166666666667 0.0833333333333 0.0833333333333 0.25 0.5 0.25 0.416666666667 0.583333333333 0.666666666667 0.416666666667 0.833333333333 0.916666666667 0.583333333333 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.97089227105 -4.24413181578 -5.24659975323 -6.13209590766 1.96739638108 6.33031439345 -3.6346337457 16.8521700377 -2.85686034059 2.14228603556 -8.33491168392 31.8079980891 2.92392839062 -0.438115755954 -1.97642342604 32.0987171544 -2.44758839122 0.837246544586 -6.69196886958 34.0353872697 1.90421257804 -1.0198578852 -3.37657863637 26.3791077832 -0.470413873859 -0.0656983395074 1 1 5 1 15 1 3 3 1 10 11 10 1 10 10 7 6 8 10 6 8 8 8 2 1 4 8 8 8 2 1 4 7 3 2 4 8 1 2 4 7 3 2 5 6 2 1 5 8 2 3 4 6 1 3 4 8 2 3 4 5 2 3 4 8 2 4 4 4 2 3 3 9 2 4 4 4 1 4 3 9 2 5 4 2 2 4 4 8 2 5 7 4 5 8 3 5 6 5 4 8 3 6 5 5 4 8 3 6 4 6 4 8 3 6 4 6 4 8 3 7 2 6 5 7 6 5 2 6 5 5 9 4 2 3 10 2 10 4 2 3 11 22 1 9 0 713.0 1.34782608696 297.0 0.73063973064 0.201058679817 0.196231477529 0.11897529557 0.0663182126018 0.0561300713041 0.0487064712614 0.0126606351809 0.0150188756873 -0.0061296874755 0.612903225806 2.13043478261 6.0 3.0 3.0 4.0 8.0 14.0 12.0 10.0 10.0 17.0 0.242718446602 3.0 4.0 4.0 0.416549789621 0.625 0.333333333333 0.291666666667 0.5 0.458333333333 0.541666666667 0.4375 0.291666666667 0.145833333333 0.208333333333 0.375 0.395833333333 0.708333333333 0.520833333333 0.479166666667 0.625 0.666666666667 0.333333333333 0.0833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 0.916666666667 0.75 0.666666666667 0.5 0.5 0.583333333333 0.75 0.75 1.0 0.833333333333 0.416666666667 0.166666666667 0.0 0.0833333333333 0.25 0.25 0.583333333333 0.75 0.916666666667 0.916666666667 0.666666666667 0.416666666667 0.0833333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 0.583333333333 0.916666666667 0.833333333333 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.666666666667 0.666666666667 0.166666666667 0.333333333333 0.416666666667 0.333333333333 0.416666666667 0.333333333333 0.0833333333333 0.0 0.75 0.916666666667 0.666666666667 0.583333333333 0.5 0.5 0.583333333333 0.5 -6.44834221043 8.21444867571 -20.3408701501 22.5813952948 -8.24376767567 3.07806760471 -53.4117262989 27.6340526458 -0.725430552921 -4.73262274804 -35.8260199414 10.6065164778 14.8135343792 1.14438618844 36.6728888951 -2.52244700614 -9.05925413712 -4.59185188378 -11.2060397791 -19.004813065 -3.45739812979 4.33432270297 -49.3705640767 -2.3897103409 1.88909873705 -0.745268947761 17 2 1 1 11 4 4 6 7 17 6 3 3 5 3 4 5 3 5 4 5 1 6 3 5 4 12 3 5 4 11 4 5 3 12 4 5 3 11 5 4 4 10 6 3 5 4 5 2 5 4 4 4 5 2 5 5 3 5 4 3 3 6 3 6 2 4 4 4 4 6 2 4 3 6 3 5 3 4 3 6 3 5 3 4 3 6 3 5 3 4 4 5 3 5 3 3 4 5 4 5 4 2 5 4 5 4 4 1 6 3 7 2 6 12 1 6 1 4 0 552.0 1.04347826087 231.0 0.813852813853 0.193916062802 0.207939508507 0.0880884767902 0.0899821237774 0.0551271997114 0.0325344886208 0.0143927057784 0.0149204969674 0.0169345527084 0.791666666667 1.5652173913 5.0 5.0 2.0 7.0 6.0 5.0 10.0 10.0 2.0 15.0 0.194805194805 2.0 9.0 3.0 0.41847826087 0.25 0.694444444444 0.722222222222 0.611111111111 0.388888888889 0.25 0.222222222222 0.111111111111 0.583333333333 0.611111111111 0.583333333333 0.583333333333 0.5 0.0833333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.222222222222 0.666666666667 0.777777777778 0.444444444444 0.333333333333 0.0 0.333333333333 0.666666666667 0.888888888889 1.0 1.0 1.0 1.0 0.222222222222 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.444444444444 0.444444444444 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.444444444444 0.0 0.0 0.333333333333 0.333333333333 0.111111111111 0.111111111111 0.555555555556 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.777777777778 0.777777777778 0.333333333333 1.0 1.0 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.444444444444 0.555555555556 0.333333333333 0.111111111111 0.0 0.0 0.0 0.0 -14.4300481737 6.26009442828 -38.5834102472 17.6466036378 -6.67898139656 4.47346966781 -67.8265927598 38.0707949229 -2.30284727739 3.71280623466 -67.2389003748 55.3411702307 7.3365241742 -1.41002272875 -29.3723924484 46.1012177143 -2.00663156429 -2.01652097453 -23.6665497581 27.0903655325 1.67610034112 0.192096170745 -17.3413727563 27.320911441 0.0601217217819 0.35990895112 5 2 9 8 4 10 2 4 3 5 1 4 3 17 1 4 9 3 10 3 10 4 9 4 6 2 2 4 4 4 1 11 3 9 5 8 2 0 195.0 0.866666666667 106.0 0.575471698113 0.229980276134 0.261538461538 0.07384561439 0.121494967886 0.0484903656501 0.0192327448739 0.00953890155969 0.00579261599359 0.0349804429631 1.0 0.266666666667 0.0 4.0 5.0 3.0 0.0 2.0 0.0 1.0 4.0 13.0 0.075 0.0 3.0 1.0 0.54358974359 0.375 0.875 0.875 0.875 0.75 0.5625 0.125 0.5 0.6875 0.5 0.0 0.3125 0.5625 0.6875 0.0 0.5625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.75 1.0 0.75 0.5 0.75 0.5 0.0 0.0 1.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.75 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 -11.3742732663 2.7162443621 -29.5417695546 8.80686742925 -3.06935612917 3.82537747663 -40.08086932 25.1971426433 1.47232181284 2.49183563036 -31.9174975631 36.2003396183 0.582675774124 -2.00025546373 -24.8314407879 23.6894457524 0.201060552172 -1.18053646696 -19.1591536837 11.3078280829 1.42065377448 0.130300790614 -3.45153728564 5.45717575335 0.37095238905 -0.580181902146 2 2 5 4 3 5 3 21 3 4 5 3 5 3 4 4 4 3 5 4 4 4 4 5 3 7 3 4 2 0 128.0 0.5 73.0 0.438356164384 0.1708984375 0.26611328125 0.0248866081238 0.202178478241 0.0313038825989 0.00482030279551 0.00624240068454 0.00177370863128 0.238170324307 0.625 0.0 1.0 1.0 2.0 1.0 0.0 0.0 0.0 0.0 2.0 4.0 0.217391304348 0.0 4.0 1.0 0.5703125 0.625 1.0 0.75 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.875 0.875 0.875 0.5 0.375 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 -11.6183108457 4.05845104884 -22.3966284062 9.97663720304 7.49147290726 0.594965939605 -3.13641648324 14.5982451847 -2.97492683849 1.83190409138 -6.86786625223 23.8673391532 0.50765373417 0.913774467544 -9.47111959918 30.9328664248 0.183720241378 -0.250465656882 -6.84670640378 28.2233198719 -0.644801152854 -0.656036371148 -13.1628642932 21.0159586266 -0.0493595452759 -0.0550259123289 5 4 6 6 3 1 4 4 1 2 5 3 1 1 9 2 9 2 9 2 9 2 9 2 9 3 6 1 2 3 4 2 3 4 1 2 5 4 4 0 154.0 0.785714285714 50.0 1.1 0.129279811098 0.150278293135 0.0499900883397 0.103741679134 0.0309599744159 0.020584631112 0.0148391347506 0.00730240649668 0.0707910046386 0.636363636364 0.357142857143 0.0 1.0 2.0 2.0 1.0 1.0 0.0 3.0 2.0 7.0 0.130434782609 3.0 1.0 1.0 0.324675324675 0.25 0.583333333333 0.666666666667 0.666666666667 0.25 0.0833333333333 0.0 0.5 0.416666666667 0.0 0.0 0.166666666667 0.75 0.0833333333333 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -7.82132863194 1.31871238562 -19.9588043312 6.54390920051 -1.38181755256 5.42866838689 -23.0127593741 28.1753591249 2.79610623619 2.73087278499 -6.30607770341 42.9164636109 1.84537446867 -1.34473639309 8.45572697996 34.1868812851 -0.39649987869 -1.25037388883 7.48389590491 20.9551852386 -0.274207439664 -0.32438199892 4.52751677879 12.8573554637 0.0848400588841 -0.365094354035 1 5 10 6 11 5 12 4 13 3 13 3 13 3 13 3 13 3 13 9 7 4 1 5 6 3 5 3 5 4 5 3 4 3 7 2 4 3 6 3 4 3 7 3 3 3 6 4 3 3 6 3 4 3 6 3 4 4 4 3 5 6 1 3 6 8 5 0 352.0 0.727272727273 126.0 0.690476190476 0.148970170455 0.191244834711 0.0453998614396 0.131229506678 0.0620319185895 0.0164734559662 0.0240201066908 0.0172538828051 0.0925784221772 0.5625 0.5 0.0 3.0 4.0 2.0 0.0 0.0 5.0 5.0 4.0 9.0 0.137254901961 0.0 2.0 2.0 0.357954545455 0.583333333333 0.25 0.25 0.25 0.75 0.833333333333 0.833333333333 0.833333333333 0.0 0.291666666667 0.166666666667 0.166666666667 0.0 0.291666666667 0.333333333333 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -8.94161407553 -9.92548099646 -19.5764774763 -23.875391241 2.57099205967 1.41278411167 -14.3038297955 -11.3558053311 -1.80890896658 7.26375981791 -20.269911104 19.6272031526 -0.848459682625 -3.0100351406 -23.659078645 16.9037372649 1.89877125167 1.83139639119 -14.3066387087 14.3853278431 -1.68232283853 -2.85158005839 -25.2004023768 -1.78219279564 -0.135402478048 0.21080652188 1 7 4 6 7 3 3 1 4 4 2 9 3 9 4 8 4 8 4 8 4 8 6 4 9 4 5 8 3 9 4 9 3 8 4 8 4 8 3 9 4 8 5 6 6 6 1 1 4 5 0 264.0 0.545454545455 100.0 0.69 0.136363636364 0.178891184573 0.0239194632273 0.156277337337 0.030601730111 0.00557505661185 0.0115387429158 0.000510178148913 0.151359906024 0.75 0.0909090909091 2.0 3.0 4.0 0.0 1.0 0.0 0.0 0.0 0.0 5.0 0.441176470588 1.0 8.0 2.0 0.378787878788 0.111111111111 0.444444444444 0.444444444444 0.388888888889 0.555555555556 1.0 0.944444444444 1.0 0.444444444444 0.777777777778 0.666666666667 0.722222222222 0.388888888889 0.277777777778 0.166666666667 0.111111111111 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.166666666667 0.5 0.5 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 0.5 0.166666666667 0.333333333333 0.5 0.833333333333 0.5 0.333333333333 0.5 0.666666666667 0.166666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.5 0.333333333333 0.0 0.0 -13.542638794 2.54647908947 -23.0224293677 6.20511472696 12.5238558375 0.912121642303 7.42392345574 14.519451875 -6.93862227153 3.60802460381 -6.20605237558 27.3195849127 2.6665889968 -2.09725742788 -4.16518305946 19.9480718335 -0.364235947271 -0.463775348472 -1.09021700087 3.76364196649 -1.0505678876 -2.6057905119 -11.6743484729 -15.0144362498 0.128763798439 0.171861136034 1 0 3 2 2 1 3 1 10 1 9 3 8 4 5 7 4 6 5 6 5 6 5 6 5 7 4 6 4 7 4 7 4 7 4 7 5 6 5 6 5 5 7 3 9 1 10 1 0 231.0 0.52380952381 125.0 0.424 0.246359700905 0.251288394146 0.0378097692991 0.211807657245 0.0494474011087 0.00423441412907 0.0120801776869 -7.86281713135e-05 0.18209784826 0.727272727273 0.0952380952381 2.0 3.0 0.0 2.0 2.0 0.0 0.0 0.0 3.0 8.0 0.117647058824 0.0 5.0 1.0 0.541125541126 0.444444444444 0.0 0.0 0.333333333333 0.722222222222 0.555555555556 0.611111111111 0.833333333333 0.944444444444 1.0 1.0 1.0 0.833333333333 0.666666666667 0.444444444444 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.333333333333 0.5 0.333333333333 0.333333333333 0.5 0.5 0.666666666667 1.0 0.833333333333 1.0 0.833333333333 0.833333333333 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.833333333333 0.833333333333 0.833333333333 0.5 0.5 0.5 0.166666666667 0.0 0.333333333333 -6.42682817819 2.84963136203 -11.3445056383 8.71099708745 4.84713674432 3.3812820822 -3.17117855966 24.9384120156 -4.91017301337 3.82412248754 -13.6556364866 44.6827268059 3.35260323054 0.439337618432 -6.91484203117 53.2925435772 -1.99615694612 0.981131052149 -9.24445853664 57.6338009788 1.1638084911 -0.523796012321 -7.43343274711 55.0784485242 -0.0957243038643 -0.0512934218201 1 2 1 4 4 2 4 3 3 3 2 23 1 3 4 1 6 1 4 3 3 3 3 3 3 3 3 4 2 3 4 2 4 2 4 1 5 1 5 2 1 1 1 1 0 138.0 0.260869565217 67.0 0.791044776119 0.235507246377 0.263390044108 0.0203453330046 0.434233156474 0.0719751970266 0.00198092969449 0.0269413001131 0.0050861733493 0.785471587017 1.16666666667 186737708.435 0.0 2.0 1.0 1.0 0.0 4294967293.0 0.0 0.0 2.0 5.0 0.217391304348 1.0 5.0 1.0 0.485507246377 0.166666666667 0.25 0.25 0.0833333333333 0.583333333333 0.333333333333 0.666666666667 0.5 0.75 0.416666666667 1.0 0.916666666667 0.583333333333 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -2.10361316087 -2.43576260732 -3.35405922979 -1.45078095853 1.84827458199 6.84935273132 -1.1123669758 23.2429037039 -2.27954349113 1.43592006661 -4.52095821811 31.3664414845 2.46119163838 -2.55940881446 1.01025288561 18.938597162 -2.13606179651 1.22295636581 -4.56619466492 19.2022371435 1.38222826242 -1.40727756207 -1.75441870927 8.95997455559 -0.216209750934 -0.169312784923 3 1 7 3 6 2 6 3 5 5 2 2 1 5 2 1 1 4 5 3 6 3 6 4 5 3 6 3 6 3 6 4 5 4 6 7 3 1 5 0 153.0 0.529411764706 61.0 0.950819672131 0.129992737836 0.194925028835 0.0221958092762 0.162883556601 0.0401487947907 0.0059483492647 0.0163485757695 0.00611349894738 0.167687959732 0.666666666667 0.117647058824 0.0 0.0 4.0 1.0 0.0 2.0 0.0 0.0 2.0 3.0 0.208333333333 0.0 3.0 1.0 0.398692810458 0.466666666667 0.733333333333 0.666666666667 0.466666666667 0.733333333333 0.866666666667 0.733333333333 0.8 0.133333333333 0.266666666667 0.0666666666667 0.333333333333 0.133333333333 0.2 0.0 0.2 0.0 0.5 0.666666666667 0.5 0.5 0.5 0.5 0.166666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 1.0 0.666666666667 0.666666666667 0.5 0.833333333333 0.833333333333 0.166666666667 0.166666666667 0.666666666667 0.166666666667 0.166666666667 0.0 0.333333333333 0.5 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 -9.06246970076 1.8724110952 -15.6552670118 4.67295201693 8.17019130619 0.51883280451 4.92814792525 8.59604373091 -4.02464117272 1.60749499957 -2.63602064754 15.4805994576 1.2568010146 -0.524786331021 -1.75203797414 11.1802906633 0.583903529084 -1.542487566 4.51934452434 -1.53589567687 -1.00437514197 0.110368881299 -4.0115800821 -2.36524227087 0.0400579542298 0.173020743977 2 7 2 3 2 3 2 2 4 2 2 2 8 2 8 7 4 7 7 4 1 1 4 7 3 8 2 13 2 7 2 0 130.0 0.769230769231 75.0 0.68 0.263846153846 0.295266272189 0.071953117888 0.151692762858 0.0570655439235 0.0138878453904 0.00533317237036 0.0054933821675 0.045630162418 1.1 0.384615384615 1.0 3.0 3.0 2.0 2.0 0.0 1.0 2.0 2.0 7.0 0.206896551724 1.0 3.0 2.0 0.576923076923 0.583333333333 0.583333333333 0.416666666667 0.916666666667 0.583333333333 0.666666666667 0.333333333333 0.75 0.333333333333 0.5 0.5 0.666666666667 0.666666666667 0.416666666667 1.0 0.916666666667 0.25 0.5 0.5 0.5 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.25 1.0 0.75 0.5 0.5 0.75 1.0 0.5 0.0 0.75 0.25 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 0.5 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.25 0.75 1.0 1.0 -4.26045539969 -3.03618660668 -12.7609347808 -5.16046583456 -3.03995358758 3.89737639433 -19.1576989084 12.4527611079 3.53969495651 4.0370821767 -5.8342016734 31.6538216537 -0.760975360947 -1.83612459711 -3.09381392752 26.822015974 0.474650852126 1.04062811703 -2.11297815637 32.1608597185 0.316062556797 1.34959244396 4.95405760418 48.7123298635 0.233005565355 0.294448078522 6 5 4 7 3 2 3 1 4 3 8 3 8 3 8 3 8 3 7 4 6 6 6 5 7 3 8 3 7 4 7 4 7 4 7 4 8 3 7 5 5 6 5 6 5 0 231.0 0.52380952381 87.0 0.632183908046 0.118457300275 0.185528756957 0.0197670185864 0.17599944704 0.0241988105034 0.00514745571234 0.00928667325394 -0.000504055194144 0.192556885455 0.454545454545 0.047619047619 3.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 1.0 5.0 0.214285714286 0.0 1.0 1.0 0.376623376623 0.166666666667 0.555555555556 0.555555555556 0.722222222222 0.666666666667 1.0 1.0 1.0 0.444444444444 0.444444444444 0.388888888889 0.5 0.388888888889 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.333333333333 0.5 0.0 0.333333333333 0.5 0.666666666667 1.0 0.666666666667 0.833333333333 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.5 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 -13.8843740831 0.0606304545112 -24.4888130551 1.08305707932 11.7161135432 1.84861018448 4.15052224421 10.528689976 -6.18910271322 2.75543267108 -7.01492749113 24.4821233207 2.45957136193 0.0979825078089 -3.95158288935 29.2578152986 0.321568870793 0.399144021209 5.98803570735 29.205969475 -0.0959683957626 -0.619895014553 3.72265789868 25.4205724651 0.0246904147189 0.00375854248178 3 2 7 6 1 5 1 11 1 11 2 5 8 3 9 3 9 3 9 3 9 3 9 4 8 4 7 6 5 7 4 0 168.0 0.857142857143 76.0 0.578947368421 0.183531746032 0.186224489796 0.0525481521974 0.0987837099125 0.0351246153223 0.0144881964049 0.00839588524799 0.000125998923518 0.0438666835175 0.333333333333 0.0714285714286 2.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 0.125 0.0 1.0 1.0 0.452380952381 0.583333333333 0.25 0.0 0.0833333333333 0.916666666667 0.833333333333 0.666666666667 0.75 0.75 0.833333333333 0.666666666667 0.916666666667 0.666666666667 0.333333333333 0.0 0.333333333333 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -7.73038295018 6.18430636014 -13.8834577853 16.8555054579 6.35413350058 2.9158299195 2.63677167403 27.4682497029 -2.67812495244 -0.048332648869 -1.61639374759 28.5684763496 0.648681966267 0.429159236301 -1.68372241434 30.4794200399 0.750688622015 0.411928911133 5.34813744009 33.7382662287 -0.424913833983 0.0648645834933 2.3289234147 35.4941976721 -0.0361385298003 0.0935732660173 2 1 6 1 4 4 2 7 1 6 4 3 2 4 5 3 3 3 6 2 2 4 6 2 2 4 6 3 2 2 6 4 2 3 5 3 2 3 6 3 2 4 5 9 4 11 3 5 182.0 1.07692307692 94.0 0.670212765957 0.237441130298 0.256973795435 0.113207149691 0.100195602007 0.0604063850652 0.0399714835411 0.00979933532123 0.0149658949089 -0.000104509727492 0.642857142857 1.0 3.0 3.0 1.0 1.0 3.0 3.0 3.0 3.0 1.0 12.0 0.210526315789 0.0 1.0 2.0 0.516483516484 0.75 0.6875 0.625 0.875 0.4375 0.5 0.375 0.5 0.3125 0.0 0.0 0.125 0.6875 0.5625 0.6875 0.875 0.5 1.0 0.75 0.25 0.25 0.5 0.25 0.0 0.75 1.0 1.0 0.75 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.0 0.5 0.75 0.5 0.5 0.5 0.25 0.25 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.45513090827 1.6370222718 -6.33947697044 5.35438646064 -4.04986689011 2.06298214865 -19.043483796 12.1631585479 1.02960663131 -0.453885617739 -15.6934995653 9.65883956999 0.881263899823 -1.08333540912 -8.46038188056 1.58037286558 -0.334349517351 -0.103348598752 -8.50226599878 -0.0509761902925 0.420399451139 0.579480569244 -4.99250275846 7.58932848634 0.134322211097 0.328268059647 4 1 1 2 3 2 4 2 1 8 2 2 4 6 1 3 4 4 2 3 5 3 4 3 4 3 4 3 4 3 5 2 4 2 6 2 4 2 6 4 9 4 10 4 10 7 2 1 5 9 5 11 2 4 4 4 1 3 8 2 1 3 8 2 1 3 8 1 2 3 7 2 2 11 4 7 6 0 308.0 0.636363636364 141.0 0.794326241135 0.186224489796 0.22181227863 0.0474095999084 0.156377078711 0.0405998512156 0.0129249928664 0.0100879322175 0.00517290292785 0.11579759747 1.5 0.727272727273 3.0 6.0 6.0 4.0 6.0 4.0 2.0 4.0 5.0 17.0 0.166666666667 1.0 2.0 1.0 0.457792207792 0.5 0.625 0.666666666667 0.791666666667 0.333333333333 0.375 0.75 0.25 0.583333333333 0.333333333333 0.458333333333 0.208333333333 0.708333333333 0.25 0.458333333333 0.541666666667 0.0 0.5 0.666666666667 0.166666666667 0.166666666667 0.5 0.166666666667 0.5 0.166666666667 0.833333333333 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.833333333333 0.5 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.5 0.833333333333 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.5 0.666666666667 1.0 0.5 0.333333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 1.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.666666666667 0.5 0.5 0.5 0.166666666667 0.166666666667 0.833333333333 0.333333333333 -14.381819403 1.53367490616 -30.9110539606 7.16762840278 4.83766456249 4.65423580012 -20.2666116573 21.5747394332 -2.4075412939 0.378098606602 -22.6150350482 37.3829072339 0.789515908525 5.65571152718 -20.0061559303 60.225826315 1.07529117365 -3.90137299632 -10.3467174501 45.5494406639 -0.695725929773 0.671015353306 -15.8558700193 32.3233921733 -0.0839969866996 -0.600813990917 7 1 8 9 4 5 1 5 2 4 4 5 1 4 4 4 2 3 5 10 5 8 7 7 7 7 7 8 5 4 1 5 3 4 3 11 6 5 9 5 5 0 210.0 0.933333333333 114.0 0.570175438596 0.24387755102 0.254285714286 0.0914049238743 0.0999491415614 0.0513641075478 0.0242511321219 0.0049372902227 0.00707818788392 0.00482052994211 0.642857142857 0.666666666667 0.0 4.0 3.0 1.0 1.0 3.0 3.0 1.0 4.0 10.0 0.230769230769 0.0 2.0 2.0 0.542857142857 0.5625 0.9375 0.8125 0.875 0.5 0.1875 0.0625 0.4375 0.625 0.4375 0.0625 0.4375 0.5625 0.9375 0.8125 0.8125 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.75 0.75 0.5 0.5 1.0 0.75 0.5 0.25 0.25 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.0 -2.75868568026 4.75342763368 -14.1007667383 15.3078160561 -10.5407257777 6.09344151898 -46.3337851599 39.0769606998 3.15561784635 2.22202202372 -36.6352767335 51.9108004166 1.56417183951 -0.616899707889 -23.3997885043 49.3636882931 -1.98028744287 0.433311585291 -35.8129195915 52.1280239535 -0.411296293493 0.955864032407 -48.3079953918 61.3732744738 -0.572127820948 0.0814387090997 2 3 6 2 5 6 3 6 4 6 1 8 6 5 3 5 5 4 5 4 6 3 6 3 6 2 7 3 6 3 6 2 7 3 6 3 6 3 6 3 6 3 5 4 5 3 6 4 4 6 3 6 8 1 3 1 2 1 2 0 252.0 1.28571428571 106.0 0.811320754717 0.221560846561 0.178287981859 0.124637255696 0.0620905144833 0.0618935515123 0.0465945069502 0.0156387927469 0.0179571333192 -0.00969814277645 0.444444444444 1.07142857143 1.0 3.0 1.0 2.0 3.0 3.0 3.0 3.0 2.0 10.0 0.209302325581 1.0 2.0 2.0 0.420634920635 0.65 0.1 0.0 0.15 0.6 0.7 0.55 0.7 0.65 0.1 0.0 0.1 0.65 0.75 0.55 0.8 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.5 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.0 0.333333333333 0.833333333333 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.833333333333 4.63317723223 7.53333397302 12.7347457779 17.6713618204 1.22280773149 -1.1022953466 9.75741877751 11.6526426848 -6.34015840201 -3.1475451208 -15.8081933862 -5.71994267627 2.70200969032 0.0218227947462 -4.81973662468 -8.54779599358 1.81777647089 0.592317724098 11.3569426281 -3.72761442446 -1.43576792677 -0.157582693344 5.45989370206 -3.98180339236 0.383582902239 -0.0280377267491 1 1 3 3 3 1 21 2 5 2 2 3 4 7 4 7 4 7 4 7 4 7 4 7 4 6 6 4 7 4 7 4 0 154.0 0.785714285714 82.0 0.426829268293 0.1906729634 0.22680890538 0.0443387991668 0.124905811847 0.0277184234217 0.0101580372919 0.00403149356878 -0.00261860523731 0.0672657871582 0.272727272727 0.142857142857 2.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 2.0 4.0 0.166666666667 0.0 1.0 1.0 0.532467532468 0.833333333333 0.416666666667 0.333333333333 0.583333333333 0.916666666667 1.0 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.75 0.0833333333333 0.0 0.166666666667 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -11.2772645391 4.22897420216 -22.3557870384 11.9339274277 6.32350893428 2.62605656102 -7.09069482994 21.3946559791 -3.11698237391 -0.0990113819381 -12.7038384907 20.9335733401 0.275015382958 -0.63932362849 -16.9091269711 15.9298902138 0.265358219907 -0.0492953948062 -10.3884260291 12.8871709527 0.783633336394 -0.67498527231 -4.83729353898 4.17937559628 -0.0718878614618 -0.34853364517 5 1 1 6 2 6 2 5 3 4 2 4 3 4 3 4 3 4 3 3 4 3 4 3 4 4 3 3 4 3 4 3 4 3 4 3 3 4 3 5 2 5 1 0 147.0 0.333333333333 80.0 0.6125 0.253644314869 0.253644314869 0.0243228208957 0.307849809367 0.0481639830721 0.00191848196856 0.00879103059367 -0.00126244240701 0.435541194922 0.571428571429 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 0.148148148148 0.0 8.0 1.0 0.544217687075 0.25 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.75 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.39530545263 4.60791454285 -5.67987882015 11.61884449 2.83932006024 1.12351944278 -1.2891306072 18.565069403 -3.01357747527 2.26380757189 -6.66621736535 29.9389373876 2.56420571528 0.648278160762 -1.96039089264 34.5201765267 -2.11513118651 -0.699257818541 -6.19736551156 29.7176920295 1.47324742798 -0.0837431890704 -4.69553486708 24.2979075006 -0.401762242249 -0.257485259694 6 3 6 4 6 5 6 2 48 1 1 1 5 5 5 5 6 4 7 3 7 3 7 3 7 2 8 3 7 3 7 2 8 3 7 2 8 3 7 3 7 3 7 3 7 3 1 3 3 2 2 3 3 2 2 7 4 2 7 0 300.0 0.333333333333 88.0 0.943181818182 0.173666666667 0.157555555556 0.0286910740741 0.257328740741 0.0575378518519 0.00591104906617 0.0309302292171 0.00991552953483 0.344042809068 0.9 143165576.5 0.0 0.0 3.0 5.0 4294967293.0 0.0 0.0 2.0 0.0 3.0 0.15625 2.0 1.0 1.0 0.293333333333 0.0 0.0 0.0 0.375 0.0 0.0833333333333 0.0 0.208333333333 0.25 0.5 0.333333333333 0.416666666667 0.458333333333 0.833333333333 0.875 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.125 0.25 0.0 0.0 0.0 0.0 0.25 0.0 0.25 0.625 0.0 0.0 0.0 0.0 0.75 0.125 0.375 0.875 0.5 0.5 0.5 0.5 1.0 0.25 0.375 1.0 1.0 1.0 1.0 1.0 0.875 0.125 0.375 1.0 0.875 0.75 0.75 1.0 1.37934284013 -4.26535247486 -0.711926958607 -8.97879952086 -4.55918786758 3.00526973876 -7.92570910139 8.37812172924 5.31995216332 6.67810997412 4.76840951906 39.9700154497 -3.42744225743 -1.76172439326 2.8185521578 35.4254774497 3.35434154631 -1.03213417741 7.16722429098 22.8361314936 -3.40787341989 -0.10348990592 -1.30588607159 14.7973145386 0.82470355564 -0.558642728692 0 7 3 6 2 4 1 6 3 5 3 4 1 6 3 4 5 2 3 6 3 4 4 2 4 4 3 5 3 2 6 3 4 4 3 1 7 3 4 4 11 3 3 5 11 4 1 8 10 5 3 4 10 5 3 4 11 3 5 3 12 1 14 0 286.0 1.69230769231 127.0 0.708661417323 0.202479338843 0.161915008069 0.130824356826 0.0390098922545 0.0413267596993 0.0516859717947 0.00802649295648 0.00586300512341 -0.0152897366921 0.227272727273 1.38461538462 0.0 1.0 2.0 0.0 6.0 6.0 3.0 3.0 4.0 10.0 0.157894736842 2.0 1.0 3.0 0.444055944056 0.833333333333 0.458333333333 0.291666666667 0.0833333333333 0.5 0.416666666667 0.625 0.583333333333 0.791666666667 0.708333333333 0.75 0.333333333333 0.458333333333 0.208333333333 0.166666666667 0.25 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.333333333333 0.5 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.333333333333 0.333333333333 0.166666666667 0.166666666667 0.166666666667 0.0 0.166666666667 0.5 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 0.166666666667 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 -8.30499430316 12.8481444969 -18.4160837319 29.1033283573 3.22106407178 -2.77295501901 -3.50942197699 20.091172287 3.43873465188 -1.91771868626 6.04959285022 4.57505446914 -6.26667590962 -0.454614435607 -20.9629348551 1.8108972089 2.95947574342 0.68365751922 -10.0788765858 1.61659319434 0.76797137938 -1.67825598642 3.08936271848 -9.14678981516 -0.297317425823 0.198936200192 2 3 4 4 2 5 2 5 3 3 31 5 1 6 1 6 2 5 3 3 4 3 4 3 4 3 4 4 3 4 2 5 1 14 3 2 2 0 161.0 0.304347826087 83.0 0.66265060241 0.221827861579 0.273291925466 0.0208248617814 0.380265311634 0.0576972890155 0.00211797971409 0.0173861053407 0.00357319296854 0.634894917396 1.14285714286 186737708.348 1.0 2.0 1.0 2.0 0.0 4294967292.0 0.0 0.0 0.0 4.0 0.142857142857 1.0 6.0 1.0 0.515527950311 0.166666666667 0.25 0.416666666667 0.25 0.583333333333 0.333333333333 0.75 0.666666666667 0.833333333333 0.333333333333 1.0 1.0 0.833333333333 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -4.37330104496 -2.87862853592 -6.94114832254 -2.15301322811 4.19320362929 7.42867829388 0.44488970477 24.5968575339 -3.83588767731 1.49110086284 -4.74869500061 32.703649416 4.07844831849 -3.02982712228 5.81308854757 17.4510630529 -2.97093593867 1.02391855994 -2.4201923713 13.3835476248 1.34398684782 -2.05855495266 -1.3185408746 -0.602154326071 -0.107510266205 -0.00672564475714 3 1 4 4 3 5 3 4 3 3 37 6 2 5 3 3 4 3 4 3 5 2 4 3 5 2 4 4 3 4 3 4 2 6 1 2 1 2 1 0 161.0 0.304347826087 66.0 0.893939393939 0.182786157941 0.222522279233 0.0188427282994 0.360354838315 0.0617526114345 0.00243823746784 0.0324256003493 0.00615407914524 0.582625474232 1.28571428571 186737708.348 0.0 2.0 1.0 2.0 0.0 4294967291.0 0.0 0.0 0.0 3.0 0.3 1.0 2.0 1.0 0.409937888199 0.166666666667 0.166666666667 0.25 0.0 0.5 0.166666666667 0.583333333333 0.333333333333 0.75 0.166666666667 0.916666666667 0.833333333333 0.75 0.166666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.1554197413 -2.43576260732 -5.26500790582 -1.1771057535 2.53852592062 6.9347446495 -2.1199698407 21.9251667729 -3.11787858457 0.202950214525 -7.30833799216 27.7187748591 3.04379285069 -0.520396506957 -0.92804780894 25.6050573185 -2.56076069025 1.23083603444 -6.50394294836 30.4188484194 1.83335851736 -1.06455837704 -3.11354288146 24.2406467607 -0.382368413169 -0.0453778408669 5 5 5 8 2 11 1 11 1 10 1 4 8 3 9 2 10 3 10 3 10 3 5 1 3 5 1 3 4 8 6 5 2 0 168.0 0.857142857143 85.0 0.611764705882 0.22123015873 0.210459183673 0.0703648026671 0.104822769882 0.0427612265144 0.0178495716641 0.0134678370266 0.00498816595789 0.0311108249024 0.75 0.142857142857 1.0 3.0 3.0 2.0 0.0 0.0 0.0 2.0 1.0 5.0 0.0952380952381 0.0 2.0 1.0 0.505952380952 0.333333333333 0.833333333333 0.833333333333 0.333333333333 0.666666666667 0.75 0.333333333333 0.833333333333 0.916666666667 0.5 0.0 0.583333333333 1.0 0.5 0.0 0.416666666667 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.75 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.25 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -8.91267681315 6.45714340544 -21.4570155391 18.489189185 0.163331020316 4.66143019913 -20.6558721538 37.1348241563 1.44797191874 1.73476709971 -12.3421886093 46.6443181422 -0.548766579274 -0.452833819863 -14.1448388733 42.7825311104 -0.461386505419 -0.803016791428 -18.3596255552 34.1725655953 0.07772857785 -0.309862448309 -17.7570432404 29.7183953525 0.0850890097111 0.0612406790922 1 1 4 3 5 2 4 5 1 33 3 2 6 2 5 3 4 3 4 3 3 4 3 4 3 4 4 3 4 3 4 2 5 1 7 2 1 4 0 154.0 0.318181818182 70.0 0.8 0.196660482375 0.242621015348 0.0201617407723 0.34459611901 0.0603143693884 0.00243119253194 0.0227498528617 0.00521125444588 0.530348844782 1.14285714286 195225786.0 1.0 2.0 1.0 2.0 4294967295.0 4294967293.0 0.0 0.0 4.0 3.0 0.130434782609 2.0 7.0 1.0 0.454545454545 0.25 0.25 0.0833333333333 0.25 0.5 0.416666666667 0.583333333333 0.666666666667 0.583333333333 0.5 1.0 1.0 0.583333333333 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -3.58822053516 -3.64609505992 -5.99945493346 -3.91328842598 3.01306255149 7.75602334618 -1.37033098418 25.4888077182 -3.26255922849 3.11049431985 -7.20043987503 42.6769366491 3.01299305606 -2.40677278868 0.393951404605 31.9623273031 -2.07536126295 0.555180952255 -5.0813366928 26.2894939942 0.794616216247 -1.55594003122 -5.97970140439 15.5910015069 -0.123067732362 0.0928534634384 2 8 3 9 2 3 4 4 8 4 7 5 6 5 7 5 5 8 2 3 4 2 3 3 3 3 3 3 1 7 1 11 2 4 3 2 1 0 156.0 0.923076923077 89.0 0.61797752809 0.286324786325 0.272682445759 0.0878681366847 0.118782293616 0.0585942109611 0.0132280882555 0.00620105341407 0.00352873854884 -0.0083547573314 1.0 0.384615384615 2.0 5.0 3.0 2.0 1.0 0.0 1.0 2.0 5.0 11.0 0.2 0.0 3.0 2.0 0.570512820513 0.5 0.0 0.333333333333 0.583333333333 0.583333333333 0.0 0.5 0.833333333333 0.5 0.416666666667 0.416666666667 0.583333333333 0.833333333333 0.916666666667 0.75 0.666666666667 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.25 0.5 0.75 0.5 1.0 0.5 0.0 0.25 0.75 1.0 1.0 0.5 1.0 0.75 0.5 0.75 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.538678268926 -0.979415034412 -0.579941858695 -1.61895631263 -2.47954273653 1.78844662497 -6.91128349173 8.91043109112 1.50258644158 3.79206210169 -2.65104745478 26.363853908 -0.376493971339 -0.578983806963 -2.71107599954 31.3776189895 -0.200738360623 1.90945266644 -3.43260797221 42.7358323556 0.735500608439 0.347219197162 1.35375572326 51.9053648258 -0.148884614651 0.200836772632 3 6 6 10 2 3 3 10 2 19 1 5 1 1 1 3 2 3 10 2 11 3 10 3 10 4 6 1 3 6 1 3 3 10 4 7 7 5 5 0 195.0 0.866666666667 104.0 0.557692307692 0.208284023669 0.228034188034 0.0647557780812 0.108179301741 0.0341872250038 0.0171324277586 0.00677071754764 0.00152833458603 0.0365926186218 0.923076923077 0.4 1.0 5.0 4.0 2.0 1.0 3.0 0.0 1.0 7.0 11.0 0.0975609756098 1.0 3.0 1.0 0.533333333333 0.625 0.9375 0.6875 0.8125 0.6875 0.5625 0.0 0.5625 0.875 0.6875 0.0 0.4375 0.6875 0.5625 0.0 0.3125 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.25 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.25 0.75 0.75 0.25 0.0 0.0 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 -12.9870433563 3.98948390684 -33.3019686286 11.9212716616 -2.76830571238 3.56054365132 -42.0844578424 25.309772032 2.378499496 0.695568143454 -29.0377951572 29.7288394422 0.540809245317 -0.411826611939 -22.0615141978 26.1110546251 -0.328955591769 -0.505240219892 -20.5660486426 18.1877838622 1.45198077344 -1.40713944942 -5.12558394686 1.53469175686 0.437054206522 -0.408320721804 2 1 11 4 3 6 1 4 4 5 2 3 5 4 3 2 6 3 3 2 6 3 2 3 6 2 3 3 6 2 3 3 6 2 3 3 6 3 2 3 6 3 2 4 4 11 3 5 1 5 3 5 196.0 1.0 94.0 0.723404255319 0.22193877551 0.245626822157 0.100810860058 0.109076043995 0.0609065419171 0.0350522595283 0.0126820645023 0.0149107556466 0.01847406068 0.214285714286 0.928571428571 2.0 0.0 1.0 1.0 2.0 3.0 3.0 3.0 3.0 5.0 0.0967741935484 1.0 0.0 2.0 0.479591836735 0.75 0.625 0.75 0.8125 0.1875 0.25 0.25 0.4375 0.375 0.0625 0.0 0.125 0.75 0.75 0.5625 0.875 0.5 1.0 0.75 0.25 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.45513090827 -0.2728370453 -7.84573326153 0.306138835878 -6.08779257541 1.5729890877 -25.9896499301 6.7000413483 2.28481612835 1.05140556503 -17.7787066724 12.9197043052 1.15235381077 0.0383091165751 -8.71690611972 13.9108829648 -1.29596693734 -0.0500809979723 -13.9771554899 12.9230736296 1.14042708143 -0.12726651707 -6.17508835665 10.9303335179 0.103193128299 -0.0735489811844 3 6 7 9 4 4 1 6 2 4 3 5 2 3 4 5 9 5 8 6 7 7 3 5 2 4 3 4 3 4 3 4 2 21 1 5 2 6 1 5 3 4 1 0 196.0 1.0 122.0 0.467213114754 0.293731778426 0.311588921283 0.0929178106061 0.112850911397 0.0588825128135 0.0139036897309 0.00276239420958 0.0048979934588 -0.0271124139961 0.714285714286 0.571428571429 3.0 4.0 1.0 0.0 1.0 2.0 2.0 2.0 4.0 14.0 0.190476190476 0.0 3.0 2.0 0.622448979592 0.625 0.4375 0.375 0.8125 0.75 0.125 0.5 0.6875 0.875 0.8125 0.75 0.6875 0.5 0.75 0.75 0.9375 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.25 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 -0.0909456817668 0.0909456817668 -4.04303469513 1.42343380403 -5.29433790285 2.30983471344 -19.6955964036 12.729285138 1.53340631492 2.88653109199 -17.7545539478 26.6288801707 -0.49216767842 -0.385146737291 -17.0091875205 30.2395027584 -0.189400713082 1.22511976777 -19.0064279996 35.1491068843 0.506460604995 -0.677756373389 -12.5130092825 32.0873019993 0.132933039364 -0.0455484877326 1 3 1 9 3 6 5 4 8 2 8 2 9 2 7 4 6 3 7 2 6 4 5 4 4 7 2 7 0 130.0 0.769230769231 71.0 0.56338028169 0.230769230769 0.252071005917 0.0544196631771 0.106747382795 0.0418889394629 0.00998116039814 -0.00223797348013 0.00182294548592 0.028531010285 0.2 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 4.0 0.05 0.0 5.0 4.0 0.546153846154 0.25 0.583333333333 0.333333333333 0.75 0.75 1.0 0.916666666667 0.75 0.666666666667 1.0 1.0 0.416666666667 0.333333333333 1.0 0.833333333333 0.0833333333333 0.0 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 -7.63943726841 7.14972975121 -17.5920533173 15.9204942785 1.26570558293 -1.89797883887 -13.5057331668 10.4946884745 0.940925645573 -0.0361266670898 -6.76064206464 9.2273815983 -0.287492961462 1.43229618482 -6.61554262936 17.9275986463 0.285097986511 0.0584709354639 -5.43962252372 20.8844048689 -0.188219596229 0.188221253268 -6.61221927033 22.9083271738 -0.0217362213222 0.121289362216 7 2 5 8 2 3 2 4 1 3 3 8 2 10 1 3 2 3 8 3 8 3 8 3 8 4 6 6 3 3 1 5 1 4 2 7 5 4 4 0 165.0 0.733333333333 86.0 0.627906976744 0.217079889807 0.243232323232 0.0643958037677 0.13471486212 0.0408263349751 0.0180843721697 0.00928742543929 0.00408834688223 0.0669267728626 0.909090909091 0.466666666667 0.0 1.0 3.0 2.0 1.0 3.0 0.0 2.0 2.0 9.0 0.137931034483 0.0 2.0 1.0 0.521212121212 0.25 0.916666666667 1.0 0.916666666667 0.583333333333 0.666666666667 0.333333333333 0.75 0.333333333333 0.25 0.0 0.25 0.75 0.666666666667 0.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.0 0.25 0.25 0.0 0.0 0.5 0.5 0.0 0.25 0.5 0.25 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -10.9498600847 4.15924917947 -25.4779937353 12.9978422068 1.66369967179 4.873395093 -18.2993797874 33.0129884761 3.04428116965 2.41141300022 0.150246625199 44.1360222104 0.253149056245 -2.01631342347 5.93204944013 30.549634673 0.0914614561708 -1.4697240635 5.51335332157 15.0026577389 -0.497168011307 -0.244227078467 -0.624355167997 5.56714903009 -0.195600368845 -0.565036973044 3 8 4 10 2 42 1 1 6 5 9 3 10 4 9 4 9 5 5 3 1 6 1 5 2 10 5 5 10 1 6 0 195.0 0.866666666667 112.0 0.464285714286 0.240631163708 0.228376068376 0.0758394443602 0.0980321313576 0.0372480992599 0.0194493922379 0.00773807673937 0.00366297775337 0.0127678882319 0.769230769231 0.266666666667 0.0 3.0 3.0 3.0 0.0 2.0 0.0 1.0 3.0 9.0 0.264705882353 0.0 2.0 1.0 0.574358974359 0.625 1.0 0.9375 0.8125 1.0 0.6875 0.1875 0.6875 1.0 0.5 0.0 0.4375 0.8125 0.5625 0.0 0.625 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.25 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -11.2045079937 7.97896781367 -27.3471150173 23.8388721325 -0.439126171873 6.74534016589 -29.1806839792 46.4193141923 1.25621271665 -1.40921104878 -21.2699092576 39.8271887988 -0.157331729269 -2.16129589119 -18.6852652983 22.8127202977 0.67252313312 -0.00366838660063 -12.0407436571 16.135738584 0.853194692957 -1.25727354542 -2.02885688414 2.84660088792 0.146132076431 -0.364997526947 7 3 9 3 5 1 3 2 4 2 3 2 2 5 1 2 3 7 4 4 6 3 7 4 8 2 9 6 5 6 6 3 6 0 143.0 0.846153846154 55.0 0.890909090909 0.162110616656 0.183431952663 0.0561533434535 0.0974055530269 0.0305111779022 0.0200595035927 0.00501542284506 0.000279229889151 0.0465112479531 0.545454545455 0.230769230769 0.0 1.0 2.0 1.0 1.0 2.0 0.0 0.0 0.0 3.0 0.421052631579 0.0 1.0 3.0 0.384615384615 0.0 0.25 0.666666666667 0.583333333333 0.0833333333333 0.833333333333 0.666666666667 0.833333333333 0.25 0.833333333333 0.166666666667 0.583333333333 0.25 0.416666666667 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.25 0.0 0.25 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.75 0.25 0.0 0.25 0.75 0.5 0.0 0.0 -8.61885230282 1.07735653785 -18.0880652651 0.638416541618 3.9338871323 -2.4328901269 -5.67993533011 -4.49670905382 0.531362061595 2.18629947633 0.510584606527 1.94770791514 -1.08566724486 -0.765526554197 -6.45049678519 1.68678307662 -0.122517476133 0.291170885649 -8.44867767528 1.9093538692 0.244834034083 0.00353651456269 -6.41259245039 0.246650655674 0.0076830907895 -0.303697269742 4 6 4 9 3 3 2 4 2 26 9 3 9 3 9 3 9 4 9 4 4 2 3 5 2 1 4 8 5 4 5 0 168.0 0.857142857143 85.0 0.611764705882 0.201388888889 0.209183673469 0.0635924508692 0.102293893748 0.0324546485261 0.0179055784173 0.00778111110325 0.00215390610813 0.0365288280081 0.833333333333 0.214285714286 0.0 4.0 4.0 2.0 1.0 0.0 0.0 2.0 3.0 11.0 0.242424242424 1.0 3.0 1.0 0.505952380952 0.333333333333 0.916666666667 1.0 0.583333333333 0.833333333333 0.666666666667 0.416666666667 0.916666666667 0.833333333333 0.5 0.0 0.583333333333 0.916666666667 0.5 0.0 0.333333333333 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -11.4136830617 6.13883351926 -28.1636702692 17.2936697788 -0.818975144482 3.93525677074 -30.6367828544 32.7922260333 1.88780470519 1.16825050124 -19.6389783028 39.5172360075 0.00490016058457 -0.139961830156 -16.5759465841 38.4620159653 -0.113182914064 -0.00380834483344 -16.2937792421 37.4372999266 0.521404284485 0.114878100829 -11.0725695863 38.0954556719 0.0922797805407 0.025530960855 8 7 17 8 15 10 14 3 4 4 14 2 6 3 13 3 6 3 13 3 6 3 13 3 6 3 12 4 6 3 5 1 5 5 5 12 2 6 6 5 1 6 1 6 5 5 4 4 3 4 6 3 6 3 3 4 5 4 6 3 3 4 6 2 7 3 3 4 5 4 6 3 3 4 6 3 6 3 3 4 5 4 6 3 3 5 4 4 6 3 2 6 4 4 5 5 1 7 3 5 3 6 1 6 3 6 3 6 550.0 1.13636363636 237.0 0.594936708861 0.194836363636 0.237107438017 0.094749866266 0.095891744553 0.0651747498122 0.0372980916809 0.0147675180539 0.020614540938 0.014145386794 0.52 1.45454545455 1.0 8.0 2.0 2.0 2.0 6.0 10.0 10.0 2.0 8.0 0.185714285714 0.0 2.0 4.0 0.430909090909 0.238095238095 0.571428571429 0.666666666667 0.690476190476 0.547619047619 0.166666666667 0.214285714286 0.357142857143 0.428571428571 0.595238095238 0.5 0.452380952381 0.0 0.285714285714 0.52380952381 0.547619047619 0.0 0.0 0.166666666667 0.333333333333 0.75 0.833333333333 0.5 0.5 0.166666666667 0.583333333333 0.666666666667 0.75 0.75 0.75 0.75 0.75 0.75 0.416666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.583333333333 0.25 0.25 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.75 0.75 0.75 0.75 0.916666666667 0.916666666667 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.583333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0833333333333 0.75 0.583333333333 0.25 0.25 0.0 0.0 0.0 0.0 0.416666666667 0.75 0.75 0.75 -16.5011844998 -0.967662053999 -47.0153269471 -2.69951941555 -10.5812928872 -0.0846653367667 -82.6347017648 -0.517328213187 2.55273862028 1.59245345137 -70.0757085912 1.29032823686 3.27228019832 -3.69256515019 -42.4911107607 -21.2093417209 0.251496992911 -2.08478442997 -33.6991074474 -49.827387469 0.32915593555 -2.65416491133 -30.6057654521 -75.5093900253 0.0197852939816 -0.073543681043 0 8 1 7 3 11 2 7 2 5 1 5 5 4 4 3 3 4 5 4 4 2 4 4 5 4 4 2 6 3 4 4 12 4 2 5 13 3 2 1 2 3 12 6 3 4 10 6 3 4 11 5 3 4 11 4 5 2 13 2 14 0 299.0 1.76923076923 130.0 0.684615384615 0.194706994329 0.154617957294 0.13315968161 0.0370797854573 0.0389432469144 0.0561721008407 0.00795122453476 0.00564509062555 -0.0136228782066 0.217391304348 1.38461538462 0.0 3.0 1.0 0.0 6.0 5.0 4.0 3.0 3.0 8.0 0.222222222222 3.0 1.0 2.0 0.434782608696 0.875 0.5 0.208333333333 0.0416666666667 0.458333333333 0.333333333333 0.833333333333 0.708333333333 0.833333333333 0.708333333333 0.625 0.291666666667 0.458333333333 0.166666666667 0.291666666667 0.333333333333 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.166666666667 0.5 0.666666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.666666666667 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 -9.07875153637 13.950276751 -19.437151074 31.7984133299 3.91714495262 -2.49645784328 -5.59432163062 24.8894396647 1.15751563638 -1.32891825476 -1.51815369764 11.0688241466 -3.64793040416 -0.441138796258 -16.3648170954 13.6387988015 2.93898721309 2.45502967534 -1.09093065803 21.7693883789 0.281026218396 -2.66075847781 6.45078807595 13.2143805481 -0.349332194469 0.721197393572 9 4 10 5 10 5 11 4 12 3 12 3 12 3 12 3 8 1 3 3 6 9 4 3 3 5 3 3 6 3 3 3 6 3 2 3 8 2 2 3 7 3 2 3 7 3 2 3 7 3 2 4 6 3 3 3 5 4 3 14 3 11 6 1 9 0 330.0 0.681818181818 126.0 0.746031746032 0.198585858586 0.208126721763 0.0629095639592 0.146817736595 0.0577874335643 0.0171832067522 0.0173807754765 0.0114457275715 0.088453515959 0.666666666667 0.454545454545 0.0 3.0 5.0 0.0 0.0 1.0 5.0 3.0 5.0 13.0 0.22 0.0 2.0 2.0 0.381818181818 0.0 0.0833333333333 0.708333333333 0.708333333333 0.0 0.25 0.166666666667 0.416666666667 0.25 0.291666666667 0.0833333333333 0.375 0.916666666667 0.833333333333 0.75 0.875 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.5 0.166666666667 0.0 0.0 -2.25710646567 -6.85813118414 -8.2919306451 -16.156996846 -2.68147978876 2.17083276812 -7.8054855035 1.52076880663 7.41368126223 9.38213379216 17.2419092571 43.8084954018 -4.22715872528 -2.39639232412 5.91691404529 42.0095948002 1.13482368371 -0.433383155173 3.67007620502 26.3735741519 0.0969206194501 -1.53373065684 8.1911539044 16.8709650143 -0.112149428478 0.296660307549 1 0 6 2 3 1 2 4 3 1 6 2 7 2 11 2 7 3 3 3 3 5 4 5 1 5 2 4 5 11 3 3 6 3 1 6 3 3 7 2 1 7 3 2 7 1 1 8 6 2 6 9 4 4 5 9 4 4 5 9 4 4 4 11 2 14 0 286.0 1.69230769231 135.0 0.688888888889 0.214558169104 0.181280258203 0.133498244139 0.0429803704047 0.0461089963877 0.0468096377506 0.00810844832726 0.00683914136994 -0.0199334184241 0.272727272727 1.53846153846 0.0 3.0 1.0 2.0 7.0 5.0 5.0 3.0 0.0 11.0 0.333333333333 2.0 2.0 2.0 0.472027972028 0.875 0.458333333333 0.333333333333 0.125 0.541666666667 0.375 0.666666666667 0.583333333333 0.708333333333 0.791666666667 0.791666666667 0.375 0.458333333333 0.166666666667 0.416666666667 0.333333333333 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.5 0.666666666667 0.833333333333 1.0 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 0.166666666667 0.333333333333 0.166666666667 0.0 0.166666666667 0.5 0.666666666667 0.833333333333 -7.35006464461 11.6906540017 -17.455922145 25.6894204621 1.21094072779 -3.13694273259 -8.8757982234 18.5940645865 4.14171312468 0.351019210941 6.06202266233 9.41145172694 -4.20583257883 -2.60640371662 -12.2712744751 0.113910164311 0.525857257016 1.7848419528 -14.5425066916 0.819432753409 1.30858574683 -2.24995515056 0.0525950096678 -8.27210564517 -0.0122814390892 0.421080473585 1 3 11 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 12 3 1 7 4 3 1 8 3 2 6 4 3 2 7 3 3 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 2 3 3 6 3 3 5 4 3 3 6 2 4 9 1 6 0 345.0 0.652173913043 121.0 0.793388429752 0.144347826087 0.185255198488 0.0444409376912 0.137168844689 0.0613327488745 0.0173972331883 0.02501770887 0.0189689709955 0.10639789128 0.4 0.521739130435 0.0 1.0 2.0 1.0 0.0 0.0 5.0 5.0 2.0 3.0 0.232558139535 2.0 1.0 2.0 0.350724637681 0.75 0.5 0.5 0.5 0.458333333333 0.541666666667 0.5 0.583333333333 0.0 0.166666666667 0.333333333333 0.0416666666667 0.0 0.166666666667 0.625 0.333333333333 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 1.0 0.333333333333 0.5 0.5 0.5 0.5 0.333333333333 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -8.41445264347 -7.69479550949 -19.5600926978 -17.3704374746 1.63291114129 3.02283204481 -11.6592853102 0.246337262073 2.39609013427 6.6809464976 -4.35669291277 29.2969974133 -3.85509554707 -2.85735265871 -17.7248322497 26.6993505752 2.89651279487 1.92444503084 -6.32298141107 23.4785678165 -0.961661137708 -3.12635163372 -9.71179929353 9.16491525543 -0.296347200862 0.529869446523 4 8 6 3 4 3 4 3 5 4 2 3 7 4 1 3 8 3 1 3 8 6 10 5 9 2 1 4 8 2 2 3 8 2 2 4 6 2 5 5 1 3 3 0 180.0 1.25 75.0 0.826666666667 0.19037037037 0.185648148148 0.116242112483 0.0688784293553 0.0438556241427 0.0546147680762 0.00980325095381 0.0141865318065 0.00272628367767 0.6 0.916666666667 0.0 3.0 2.0 2.0 2.0 3.0 3.0 3.0 2.0 10.0 0.166666666667 2.0 2.0 2.0 0.416666666667 0.25 0.666666666667 0.75 0.833333333333 0.666666666667 0.333333333333 0.166666666667 0.0833333333333 0.333333333333 0.0 0.0 0.0 0.75 0.5 0.166666666667 0.166666666667 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.73483599789 6.91793485973 -13.6444590542 19.7855740776 -7.26595366862 4.71777692643 -41.1344397702 36.6942827389 -2.00985315855 -0.399694519536 -52.3251153753 32.4932562764 1.76698648446 -2.95337825156 -43.1267947168 10.8373197514 -1.00270677526 -0.660792080896 -50.8516724578 3.95583933106 -2.11787247789 1.67082781773 -70.9541276726 20.5890385685 0.0413219321179 0.355024279263 5 7 5 9 2 4 3 4 2 2 6 2 3 2 10 3 10 3 10 4 9 4 8 5 9 5 5 1 3 10 4 8 8 1 1 1 4 0 182.0 0.928571428571 75.0 0.8 0.174978867287 0.186420722135 0.0663043031115 0.0968875195569 0.0388994534025 0.0237522893579 0.014297383848 0.00534201850809 0.0359231224237 0.615384615385 0.285714285714 0.0 2.0 3.0 3.0 1.0 1.0 0.0 1.0 6.0 7.0 0.258064516129 1.0 2.0 1.0 0.412087912088 0.25 0.625 0.8125 0.625 0.5625 0.25 0.4375 0.8125 0.5625 0.0 0.0 0.5 0.8125 0.125 0.0 0.375 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.5 0.5 0.5 0.75 1.0 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -10.913481812 -0.0454728408834 -24.8798354494 5.39125015112 2.1826963624 8.51478945542 -17.6622499718 36.5786559854 1.56963686245 2.00575521286 -5.49991315594 47.9972274459 0.496035994851 -3.05694116013 1.91039864635 28.0873295035 1.25503554559 -0.846155858284 10.870428872 14.8371396446 -0.43330820326 -0.376894820615 8.30754258993 8.10069557511 -0.15685112353 -0.275332160135 6 2 10 6 5 9 3 3 3 5 1 3 5 4 1 3 9 4 9 3 10 4 9 4 9 4 9 4 11 9 4 9 5 6 4 0 195.0 0.866666666667 82.0 0.670731707317 0.160946745562 0.204102564103 0.0563402619734 0.111012795226 0.037288423608 0.0195494815682 0.0119338676504 0.00530197479738 0.0597631306376 0.615384615385 0.133333333333 0.0 3.0 3.0 2.0 0.0 2.0 0.0 0.0 1.0 6.0 0.347826086957 0.0 1.0 1.0 0.420512820513 0.1875 0.75 0.9375 0.875 0.5625 0.3125 0.1875 0.4375 0.75 0.1875 0.0 0.25 0.5625 0.5 0.0 0.125 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.0 0.5 1.0 0.75 0.5 0.5 0.25 0.25 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -13.6661044468 3.31042281631 -33.6952022168 11.795886237 -0.984638581262 5.89651380273 -37.0017867468 33.5052435992 1.96086854186 0.964442801421 -25.2213902595 38.2722679305 0.0881721982635 -2.34690860532 -20.3290063572 22.2488419457 0.500306757644 -0.635645028442 -14.2079831664 12.3659597277 1.05867002925 -0.338731120145 -2.11568141888 4.85916422496 0.238175159665 -0.461597483939 5 3 7 7 4 9 1 3 5 7 2 1 2 3 1 3 2 6 1 2 10 2 10 2 10 3 9 4 6 1 1 4 4 3 2 4 2 4 4 6 3 0 168.0 0.857142857143 77.0 0.831168831169 0.183531746032 0.207908163265 0.0662244560523 0.108902377915 0.0391169116456 0.0212281509235 0.0108079803653 0.00797001186179 0.0499873724805 1.0 0.5 1.0 4.0 5.0 2.0 0.0 4.0 0.0 3.0 6.0 11.0 0.138888888889 2.0 2.0 1.0 0.458333333333 0.333333333333 0.916666666667 0.75 0.916666666667 0.5 0.25 0.0833333333333 0.666666666667 0.666666666667 0.25 0.0 0.0833333333333 0.75 0.416666666667 0.0 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.25 0.5 0.25 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 1.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.75 1.0 0.75 0.5 0.75 0.5 0.0 0.0 -8.2305841999 4.50181124746 -23.0517354649 11.8813623864 -4.83264936531 2.19800864556 -40.2990857271 24.4270022474 0.476934533755 3.78378164313 -37.1854649614 41.4482242624 1.65409555545 -0.867621979919 -25.4996977394 37.2613048644 -0.546106273996 -1.36576584977 -27.8853400354 26.30772493 -0.745039206074 0.904303509601 -34.492474578 30.266212741 0.137645006901 -0.0625425203387 1 3 2 5 2 4 2 3 32 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 5 120.0 0.3 53.0 0.792452830189 0.193055555556 0.229166666667 0.0190271990741 0.36869212963 0.0645775462963 0.00222117750538 0.0332881800546 0.0061044633463 0.596464564696 1.0 214748364.55 1.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 1.0 2.0 0.235294117647 0.0 5.0 1.0 0.441666666667 0.5 0.0 0.3 0.0 0.8 0.0 0.6 0.5 0.8 0.0 0.8 1.0 0.6 0.0 0.8 1.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -2.45098612362 -2.19633821467 -4.13590703383 -0.650682825313 1.96604101201 6.55224985215 -1.38372027269 19.4187694654 -2.21222983574 -1.0108646633 -4.80663151334 21.4643037609 2.2522139541 0.52045729437 0.440074245492 21.2324919496 -1.79497421473 0.0739167671403 -3.93202785394 21.6384287882 1.09170153755 -0.664214106198 -2.37245600595 13.6864631257 -0.199032477072 -0.260674414433 7 3 9 7 6 9 4 2 5 2 5 2 11 3 11 2 12 3 11 3 11 2 6 2 2 5 3 5 2 4 4 4 3 2 6 3 3 3 5 3 3 3 5 3 3 3 5 3 3 2 6 2 4 3 6 1 4 2 7 2 3 3 5 3 1 6 3 5 1 5 8 0 308.0 0.636363636364 115.0 0.973913043478 0.167439703154 0.191263282172 0.0482324114577 0.146975684124 0.0514734148462 0.01579317533 0.0189233571813 0.0126987851277 0.111444846502 1.14285714286 0.590909090909 2.0 6.0 3.0 5.0 1.0 1.0 5.0 5.0 2.0 5.0 0.25 3.0 1.0 2.0 0.373376623377 0.166666666667 0.583333333333 0.625 0.583333333333 0.458333333333 0.416666666667 0.458333333333 0.458333333333 0.458333333333 0.0833333333333 0.125 0.0416666666667 0.416666666667 0.25 0.833333333333 0.625 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.5 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -7.61050000603 -0.0289372623803 -17.0544199816 2.82974195369 2.75920384061 4.60473155787 -3.87617193787 20.2838731821 3.04565131255 1.49057141004 2.81171486941 28.1452934796 -6.31787499457 -1.50560607274 -22.681539378 20.017718745 3.7360114733 -0.423578312052 -10.2011449073 6.87450059354 -0.893115880042 -2.48228956662 -9.98707452202 -12.2994750583 -0.384410415739 0.189160907673 1 2 1 2 11 7 10 6 13 4 14 2 15 2 14 4 14 2 15 2 14 3 4 3 8 5 1 5 5 4 4 5 5 3 5 3 6 2 6 4 4 3 6 4 5 2 7 3 5 2 7 3 5 3 6 3 5 2 7 4 4 2 7 3 4 5 4 13 3 7 2 1 14 0 391.0 0.739130434783 130.0 0.923076923077 0.139310967354 0.177916157011 0.0477297162624 0.122596564792 0.0611242841686 0.0187144752632 0.0256806687979 0.020561579252 0.0855432903719 0.941176470588 0.608695652174 7.0 6.0 1.0 2.0 1.0 1.0 5.0 5.0 4.0 12.0 0.1 4.0 1.0 2.0 0.332480818414 0.666666666667 0.466666666667 0.466666666667 0.433333333333 0.366666666667 0.333333333333 0.366666666667 0.3 0.0 0.233333333333 0.466666666667 0.233333333333 0.0 0.0666666666667 0.533333333333 0.7 0.888888888889 0.444444444444 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.888888888889 0.888888888889 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.555555555556 0.444444444444 0.444444444444 0.555555555556 0.777777777778 0.444444444444 0.333333333333 0.111111111111 0.0 0.0 0.0 0.222222222222 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.888888888889 0.666666666667 0.444444444444 0.0 0.0 0.0 0.0 0.222222222222 0.777777777778 0.888888888889 1.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.222222222222 0.333333333333 -7.03049661658 -9.18946801852 -17.6053711251 -21.1979275034 0.176016184289 2.35539374315 -11.2063752932 -7.99061009798 4.4061558379 5.23875374591 -1.00950348702 15.5347278411 -6.51845293726 -2.29083846624 -24.3885145764 13.9942090175 3.93614470295 2.01562794053 -11.9270930928 16.4295483415 -1.0292292711 -2.27294749689 -11.4717909918 4.94638138745 -0.350019736189 0.234295992029 9 1 9 6 4 10 3 3 2 5 2 3 9 4 9 4 9 4 9 4 8 5 8 5 8 5 8 4 10 4 9 3 10 3 10 3 10 3 9 4 9 5 8 6 7 6 7 0 286.0 0.590909090909 100.0 0.57 0.0973641742873 0.161315956771 0.0216612572229 0.135297749099 0.0144906807213 0.00781332916079 0.00386898040236 -0.000863632409386 0.13604466352 0.307692307692 0.0454545454545 1.0 3.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 5.0 0.428571428571 0.0 1.0 1.0 0.34965034965 0.291666666667 0.833333333333 0.875 0.875 0.5 0.5 0.375 0.375 0.458333333333 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 1.0 0.666666666667 0.5 0.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.833333333333 0.5 0.5 0.5 0.333333333333 0.166666666667 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -18.7513460225 8.13137072888 -35.3859015113 20.2221493667 13.908539715 1.11988401167 5.92068437325 25.9506499337 -1.94612922366 0.50326372983 9.01448088385 26.6726702891 -2.1147614452 -0.30241035465 -4.84522574874 24.1984707955 2.46394246006 -0.171095916151 9.76857883902 22.9700519174 -0.221495201005 0.531987991913 14.1995417719 26.7437430709 0.0421299658131 -0.0454400149253 2 3 3 1 6 11 3 12 2 6 2 4 4 2 5 3 3 4 5 3 2 3 6 3 3 2 7 2 3 2 7 2 2 3 6 3 3 4 4 2 3 5 3 3 3 5 2 3 4 6 1 2 5 4 10 3 11 4 9 6 8 6 7 8 6 8 7 7 6 0 308.0 0.636363636364 145.0 0.641379310345 0.190398886827 0.214285714286 0.045692308935 0.148853697323 0.0344342577645 0.0131778012417 0.00324307547585 0.00137253305541 0.107036568304 1.0 0.545454545455 4.0 3.0 3.0 2.0 3.0 5.0 3.0 0.0 3.0 8.0 0.2 1.0 1.0 2.0 0.470779220779 0.583333333333 0.375 0.458333333333 0.75 0.791666666667 0.625 0.875 0.875 0.458333333333 0.0416666666667 0.291666666667 0.25 0.666666666667 0.416666666667 0.416666666667 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.5 0.5 1.0 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.5 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.166666666667 0.0 0.333333333333 1.0 0.833333333333 0.333333333333 0.666666666667 0.5 0.0 0.0 0.166666666667 0.5 0.5 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.166666666667 0.0 -12.5298346107 7.26325285747 -26.2560908278 20.1512477402 4.98641644018 3.82844764311 -16.0163559428 33.4613890051 -3.54160685682 -0.274255715715 -24.8829362741 34.9978055472 0.108700314377 0.66041423009 -28.6414063021 34.2144331648 0.703009336984 -0.98962764095 -22.9668453147 29.6012711573 -0.997785506681 0.275930763977 -32.8621008777 23.3844083626 -0.184133740501 -0.578107541525 2 4 2 6 1 6 1 6 3 4 3 4 2 5 2 4 2 4 2 4 4 2 4 0 77.0 0.636363636364 49.0 0.469387755102 0.307977736549 0.257378984652 0.0563551813341 0.132704536145 0.0337368821093 0.00552584799132 -0.00567822749487 -0.00322177419846 0.0296312000847 0.285714285714 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.333333333333 0.0 1.0 1.0 0.636363636364 0.333333333333 0.333333333333 0.0 0.166666666667 0.833333333333 0.666666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.89372623803 5.4402053275 -6.80769941046 13.1499181946 0.300373566527 0.139664142398 -5.56621300047 14.6811819184 0.663369100218 0.218050306321 -1.22203105432 15.2270039233 0.223329496511 0.516173459505 1.29906480546 18.0592043675 0.167246574817 -0.0815045112176 3.17493326098 17.5628820825 0.182693616219 -0.259149012289 5.20544642986 13.1669938662 0.00763922462387 -0.209603406391 2 1 3 5 2 5 1 5 2 3 3 4 3 2 3 4 2 3 4 2 3 3 3 3 3 3 3 3 3 3 3 3 2 4 2 4 2 4 2 11 1 3 2 0 132.0 0.272727272727 78.0 0.564102564103 0.280303030303 0.293044077135 0.0215011687119 0.414521854217 0.0534190040905 0.00123814283419 0.0037487319108 -0.000664951494551 0.744547863081 1.16666666667 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 8.0 0.193548387097 0.0 6.0 1.0 0.590909090909 0.333333333333 0.0 0.0 0.5 0.75 0.333333333333 0.5 0.916666666667 0.916666666667 0.833333333333 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.66222813899 1.38898859426 -5.00138937894 5.63177382785 1.64535838989 3.52556299183 -2.10920043774 18.7917623644 -1.34238776286 1.0350531255 -3.24336750782 25.7044805376 1.42897086938 -0.319378126879 -0.341630007526 22.5703520381 -1.18055568137 -0.653025017611 -2.13337862516 16.3381527896 0.964691163367 -0.240052003435 -1.49140285601 11.0866208946 -0.328482988048 -0.193849929745 5 4 6 8 3 3 3 3 2 3 5 3 1 3 9 2 9 3 9 4 8 4 8 4 10 4 4 1 3 8 5 7 6 5 3 0 168.0 0.857142857143 69.0 0.811594202899 0.15873015873 0.196003401361 0.0534465770435 0.110685730145 0.041556999784 0.0179133219219 0.0164231241971 0.0069347353509 0.0595067818343 0.666666666667 0.214285714286 0.0 3.0 3.0 2.0 1.0 1.0 0.0 1.0 0.0 8.0 0.296296296296 1.0 3.0 1.0 0.410714285714 0.25 0.75 1.0 0.416666666667 0.583333333333 0.5 0.583333333333 0.833333333333 0.5 0.0 0.0 0.666666666667 0.583333333333 0.0 0.0 0.5 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.75 1.0 0.5 1.0 0.75 0.5 0.25 0.0 0.25 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -10.7770632894 0.318309886184 -25.1269053882 6.40108753455 1.39620181855 8.68856066879 -20.1461644212 38.0842923314 1.81608223604 1.93695173646 -8.25428444214 49.8343350902 -0.130273114549 -2.58977426909 -5.6686510389 33.5265601085 0.46770750075 -0.308672279989 -1.96568492641 25.2715840495 0.397506284239 -0.190544159629 4.35691707851 22.3449332064 0.249696666889 -0.0705380098777 3 8 3 3 2 4 3 2 4 8 4 15 2 3 8 3 9 3 9 3 10 2 10 4 4 2 3 9 3 8 5 5 4 0 168.0 0.857142857143 82.0 0.682926829268 0.201884920635 0.213860544218 0.0676372607575 0.111358916086 0.039662082591 0.0202282243947 0.0119183668956 0.00378969066973 0.0424838846925 1.08333333333 0.285714285714 1.0 5.0 5.0 2.0 2.0 1.0 0.0 1.0 5.0 12.0 0.162162162162 1.0 3.0 1.0 0.488095238095 0.416666666667 0.916666666667 0.916666666667 0.5 0.75 0.666666666667 0.333333333333 0.833333333333 0.333333333333 0.25 0.0 0.583333333333 0.583333333333 0.333333333333 0.0 0.5 0.0 0.0 0.5 1.0 0.75 0.75 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 0.75 0.5 0.75 0.75 0.25 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 -9.36740522198 0.818511135901 -22.9249928588 4.86432406835 -0.249636616278 4.62430951269 -22.3695019834 23.0438559966 2.69691256516 2.20616193919 -6.54410663874 35.7097547807 0.769399953685 -0.663066232261 1.90074138956 32.353592478 -0.0441263270207 -0.309774124366 3.48035203017 28.4720573251 0.49548885236 0.321028535452 8.23980055442 31.2044655468 0.0978929557855 0.116826895445 1 9 1 3 2 5 1 2 4 4 7 4 7 4 7 4 4 7 2 3 3 3 2 2 3 4 1 3 3 3 3 2 2 17 2 1 5 2 1 0 143.0 0.846153846154 82.0 0.634146341463 0.289256198347 0.26412049489 0.0874992775819 0.123483734223 0.0563708383162 0.0131154250037 0.00644666688343 0.00432253271881 0.000325801367456 1.09090909091 0.538461538462 3.0 3.0 3.0 1.0 2.0 0.0 2.0 2.0 5.0 10.0 0.228571428571 0.0 3.0 2.0 0.573426573427 0.583333333333 0.0 0.583333333333 0.75 0.333333333333 0.166666666667 0.5 0.5 0.583333333333 0.5 0.416666666667 0.5 1.0 1.0 0.916666666667 0.833333333333 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.75 0.25 0.0 0.0 0.0 0.5 0.5 0.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0979415034412 -0.979415034412 -2.72010126626 -2.00570047947 -3.88868336148 0.720942191011 -12.9406884936 1.55499393131 1.93035052728 0.934615909698 -10.1632452681 4.82561799128 -1.82741273407 -1.22593363111 -17.8064354618 -2.53165377719 -0.558404365647 -0.769635427702 -26.2404333888 -12.6840695685 -0.0572440078825 -0.930124106693 -25.513197207 -23.0803598461 0.119210622142 -0.171177139918 1 4 1 7 2 12 1 6 4 4 1 5 4 4 2 3 6 3 2 3 6 3 2 3 6 2 3 3 6 2 3 3 6 2 3 3 5 3 2 4 5 3 2 4 5 10 3 5 1 3 10 0 196.0 1.0 104.0 0.576923076923 0.246355685131 0.219023323615 0.103250983859 0.0917882589312 0.0450115385596 0.0335158747395 0.0073147910452 0.00858752655927 -0.000907191886062 0.428571428571 0.857142857143 2.0 1.0 1.0 1.0 2.0 3.0 3.0 3.0 4.0 8.0 0.205128205128 0.0 1.0 2.0 0.530612244898 0.8125 0.5625 0.5 0.75 0.8125 0.5625 0.5 0.5625 0.5 0.0 0.0 0.0625 0.875 0.5625 0.5625 0.8125 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.27364204417 4.45633840657 -6.5464994743 13.573829344 -1.44677875382 4.39787332544 -10.5506071394 30.2008655621 1.13954825619 0.960422005014 -5.05351258863 35.7639487972 0.352832530407 -0.852200458592 -3.25275149087 29.2634513484 -1.36998232448 -0.530077237419 -15.1257697318 22.5657907881 -1.08236707878 -0.207288631836 -28.3350578467 19.9300314956 -0.0963358747741 0.05535103926 5 4 6 8 3 2 4 4 2 2 4 4 1 4 1 15 3 3 9 3 9 3 9 4 9 3 10 4 3 2 3 9 4 7 7 1 6 0 180.0 0.8 82.0 0.780487804878 0.192592592593 0.196666666667 0.0618079561043 0.104214506173 0.0391296296296 0.0185499487119 0.0114176524426 0.00499008168707 0.0438240299182 1.0 0.266666666667 0.0 5.0 5.0 2.0 1.0 2.0 0.0 1.0 5.0 11.0 0.171428571429 1.0 3.0 4.0 0.455555555556 0.166666666667 0.75 1.0 0.583333333333 0.5 0.75 0.416666666667 0.833333333333 0.416666666667 0.416666666667 0.0 0.416666666667 0.666666666667 0.583333333333 0.0 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.25 0.75 0.5 0.0 0.0 1.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -9.93126844893 6.70572826894 -22.5096012207 19.9477573751 2.36200082654 6.2213313577 -13.4331278211 45.8056704734 2.42019887704 3.26702997428 1.41729021572 61.9262201594 -0.402377323167 -1.46898850781 2.3879076378 54.043323395 0.260810800773 -0.200358165808 3.63682021303 52.2958168422 0.195812147885 1.83219798381 5.17084462983 68.0620711884 -0.0897860286032 0.120067719495 1 3 11 4 11 4 12 3 12 3 12 3 12 3 12 3 12 3 12 3 2 5 5 5 1 6 3 4 4 4 3 3 5 4 3 3 6 3 3 3 6 3 3 3 7 2 3 3 7 1 4 3 6 2 4 3 6 3 3 3 6 4 1 6 2 13 2 11 5 2 4 0 345.0 0.652173913043 134.0 0.701492537313 0.139710144928 0.221424070573 0.0411160972759 0.163705371847 0.0592055377478 0.0148817206149 0.0216151896251 0.0174361443467 0.147133220747 0.466666666667 0.608695652174 1.0 2.0 2.0 1.0 0.0 1.0 5.0 5.0 1.0 8.0 0.191489361702 0.0 1.0 2.0 0.388405797101 0.833333333333 0.75 0.75 0.791666666667 0.25 0.375 0.375 0.333333333333 0.0 0.291666666667 0.208333333333 0.0833333333333 0.0 0.25 0.833333333333 0.625 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -14.1163514742 -12.1788130366 -33.0462571738 -29.867732881 2.65531192637 0.43156405708 -18.7504007766 -21.8326603642 4.72837509905 6.59776640861 -6.67906303201 6.23801481247 -8.54522515886 -2.85853712911 -41.0844493062 3.44566226986 4.28124118683 1.59614037674 -30.1746471563 0.278162959173 -1.12377158231 -2.72328356263 -27.4276156704 -14.6826646275 -0.222440792164 0.310477976987 8 2 9 5 8 7 6 7 7 5 9 4 70 5 7 6 5 3 1 4 4 3 3 3 9 3 10 2 10 3 9 4 9 3 10 2 10 4 9 4 9 4 10 2 8 0 325.0 0.52 85.0 0.894117647059 0.121893491124 0.121969230769 0.0279945380064 0.125758223031 0.0295161766045 0.0082382232753 0.0129851054232 0.00293286716904 0.116767809613 0.615384615385 171798691.72 1.0 4.0 3.0 0.0 0.0 4294967291.0 2.0 0.0 0.0 0.0 0.5 0.0 3.0 1.0 0.261538461538 0.0 0.0357142857143 0.285714285714 0.357142857143 0.107142857143 0.25 0.678571428571 0.714285714286 0.678571428571 0.214285714286 0.5 0.0357142857143 0.607142857143 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.375 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.125 0.375 0.0 0.0 0.0 0.125 0.5 0.125 0.625 0.875 0.0 0.0 0.0 0.375 0.375 0.375 1.0 1.0 0.0 0.0 0.0 0.5 0.5 0.75 0.875 0.875 0.375 0.125 0.0 0.5 0.875 1.0 0.5 0.375 0.75 0.375 0.0 0.5 1.0 0.625 0.125 0.0 0.875 0.625 0.0 0.5 0.875 0.125 0.0 0.0 -4.22715528852 4.48180319747 -4.8739904926 15.7756185927 6.72645321342 7.13372689307 10.6255180569 38.5060380286 -4.50485237793 -1.66543415679 1.73208270365 34.4359210836 2.8740208167 -0.243310670738 7.80887336199 31.8117024174 -1.03241966326 1.51035764129 8.75376088496 37.7862960355 0.238600582455 -1.77255121499 4.78892083373 26.1597829265 -0.137073955467 -0.0138765737332 0 5 8 5 8 5 9 4 9 3 10 3 10 3 11 3 9 3 3 5 3 2 3 5 3 2 3 2 5 3 3 2 6 2 10 3 1 2 8 6 7 7 5 8 5 3 2 5 3 4 2 5 1 5 1 12 2 11 2 2 1 1 2 0 286.0 0.590909090909 131.0 0.648854961832 0.162721893491 0.259853782581 0.0354686330345 0.202895733784 0.0615842602798 0.00973349374417 0.0188692422487 0.0125224693671 0.204438615398 1.07692307692 0.5 5.0 3.0 3.0 3.0 0.0 2.0 2.0 4.0 5.0 8.0 0.19512195122 2.0 1.0 1.0 0.458041958042 0.875 0.625 0.583333333333 0.791666666667 0.416666666667 0.291666666667 0.583333333333 0.708333333333 0.0 0.333333333333 0.416666666667 0.833333333333 0.0 0.25 0.0 0.541666666667 1.0 0.666666666667 0.5 0.333333333333 0.166666666667 0.166666666667 0.166666666667 0.166666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.5 0.666666666667 1.0 0.5 0.333333333333 0.0 0.166666666667 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.0 0.0 0.0 0.166666666667 0.5 0.333333333333 0.5 1.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.166666666667 0.833333333333 -13.4268897445 -12.703458185 -27.5354919316 -26.687843143 6.61013167101 6.11192049867 -10.1634285365 -4.9462745472 -2.34753318709 2.86284142734 -14.6308416128 15.1148761456 -0.998653900051 -0.432129734158 -19.3589157076 17.6074359188 2.60779648392 1.0337795351 -4.50248740896 21.1850323179 -1.31452131512 -0.560561573782 -7.5320826941 22.8847604901 0.245592034546 0.345609060563 1 6 9 7 10 6 11 5 11 5 12 4 12 3 13 3 13 3 13 4 12 5 3 3 5 4 5 2 5 3 6 3 3 4 7 3 2 4 7 3 3 3 7 2 4 3 7 3 2 4 7 2 3 4 6 4 2 4 6 12 3 5 1 7 3 5 6 1 9 0 368.0 0.695652173913 139.0 0.690647482014 0.153532608696 0.198842155009 0.0475935162735 0.141230646132 0.0619290075101 0.0188760335944 0.0242239565537 0.0195644263465 0.104072434869 0.5 0.521739130435 4.0 3.0 4294967294.0 3.0 0.0 0.0 5.0 5.0 2.0 5.0 0.2 1.0 1.0 2.0 0.377717391304 0.625 0.25 0.333333333333 0.5 1.0 0.875 0.833333333333 0.791666666667 0.25 0.166666666667 0.125 0.0833333333333 0.0 0.0833333333333 0.166666666667 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.333333333333 0.166666666667 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.333333333333 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -10.0475207552 -8.63588560777 -20.7734075755 -19.4824265992 4.49422060557 2.8819772386 -10.3389957891 -4.15159337843 -2.3485747772 5.88075947369 -14.6485906586 24.9976364924 0.246606851438 -1.3070092328 -15.8231411256 25.5623872757 0.754794751066 0.371539955384 -9.25284316391 22.6684250276 -0.308175893745 -0.495608502567 -10.0442028221 19.5042489343 0.0734845815223 0.0363975892286 7 3 7 7 3 9 3 4 2 2 3 4 8 4 8 4 8 3 9 4 7 6 6 7 6 5 7 3 9 3 9 3 9 3 9 3 10 2 9 3 9 4 8 4 6 7 5 0 264.0 0.545454545455 97.0 0.680412371134 0.133838383838 0.161157024793 0.0246933870384 0.142496765172 0.025277308206 0.00635457392104 0.00880273799479 -0.000219054816261 0.136072676423 0.583333333333 0.0454545454545 2.0 2.0 3.0 0.0 1.0 0.0 0.0 0.0 2.0 2.0 0.275862068966 0.0 6.0 1.0 0.367424242424 0.111111111111 0.444444444444 0.388888888889 0.277777777778 0.555555555556 1.0 1.0 0.944444444444 0.666666666667 0.722222222222 0.555555555556 0.444444444444 0.5 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.833333333333 1.0 0.833333333333 0.5 0.5 0.666666666667 0.833333333333 0.5 0.333333333333 0.833333333333 0.666666666667 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.5 0.5 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -12.2983365116 7.72624905555 -20.3927903593 18.0152955297 11.9992782752 -0.248597390449 8.56719581455 21.3969633917 -6.86812907648 1.80717166355 -5.37803240127 22.9309257119 2.65465956379 -2.38991370738 -3.78149180795 13.4392547708 -0.592086202655 0.440842591027 -2.1611371822 3.71724764245 -1.05700083087 -2.5882955007 -14.2205159092 -13.276999398 0.0864260581761 0.0986409221459 3 2 6 3 6 3 5 17 1 5 5 2 7 2 7 2 7 2 6 3 6 3 6 4 6 3 5 8 3 5 1 0 144.0 0.5625 64.0 0.71875 0.172839506173 0.213107638889 0.0325788751715 0.172686457797 0.0473679698217 0.00760908048824 0.018347100369 0.00620756966672 0.162189425307 0.777777777778 0.0 2.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 8.0 0.0740740740741 0.0 3.0 1.0 0.444444444444 0.333333333333 0.666666666667 0.333333333333 0.583333333333 0.916666666667 0.916666666667 0.666666666667 0.75 0.5 0.666666666667 0.0 0.0833333333333 0.25 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -7.16197243914 2.26795793906 -12.8303120937 5.10886336838 5.8545394496 -0.387473899539 1.8478622652 5.14563467888 -2.85888769221 0.993335356908 -3.13598991399 10.3618891024 1.09276599702 0.882310904683 -0.662741081941 15.4353529744 0.613140383816 -0.863978194795 4.60611535499 8.03436966876 -0.975398335571 -1.0028784492 -2.04069303832 -3.73281229051 0.0927291146257 -0.0975727889641 1 2 1 5 2 1 22 1 6 1 2 3 4 7 4 8 2 9 3 8 2 8 4 7 4 7 4 7 5 6 1 2 1 5 0 154.0 0.785714285714 67.0 0.65671641791 0.17119244392 0.161410018553 0.0462934771418 0.0892903689328 0.0287854328165 0.0130517172917 0.00752983980857 -0.000544082879202 0.0434324122213 0.363636363636 0.214285714286 0.0 1.0 3.0 0.0 1.0 1.0 0.0 0.0 2.0 6.0 0.111111111111 0.0 2.0 1.0 0.435064935065 0.75 0.333333333333 0.0833333333333 0.333333333333 0.833333333333 0.916666666667 0.75 1.0 0.75 0.666666666667 0.5 0.75 0.75 0.166666666667 0.0 0.0833333333333 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 1.0 1.0 0.75 0.5 0.25 0.25 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -8.27605704078 7.45754590488 -15.5695157193 20.1142971537 5.84047600203 3.19237903345 -0.596524351234 31.5700482784 -2.49541447171 -0.458563581795 -4.79042718036 29.1137547837 0.193618487097 -0.680966749866 -8.52149414008 22.3302924289 0.0694928952543 -0.395117640004 -6.46098163169 16.8314530892 -0.0224389174805 -0.540612622595 -5.45288907403 9.00789724341 0.185986414025 -0.327813047421 8 2 7 6 3 10 1 4 3 4 1 3 3 15 2 4 2 3 3 3 9 3 9 3 10 3 9 3 6 2 3 3 3 2 5 6 2 0 168.0 0.857142857143 79.0 0.746835443038 0.203373015873 0.199404761905 0.0723995451355 0.0942356977513 0.038032053099 0.0225174126828 0.00949773350684 0.00567176075216 0.030700037946 1.08333333333 0.357142857143 0.0 5.0 5.0 3.0 0.0 2.0 0.0 2.0 4.0 11.0 0.194444444444 0.0 3.0 1.0 0.470238095238 0.25 0.833333333333 1.0 0.583333333333 0.5 0.833333333333 0.416666666667 0.583333333333 0.5 0.416666666667 0.0833333333333 0.166666666667 0.666666666667 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.0 0.5 1.0 0.75 0.75 0.75 0.25 0.0 0.25 0.75 0.75 0.25 0.5 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.5 1.0 0.5 0.25 0.75 1.0 0.5 0.0 0.75 1.0 0.75 0.75 1.0 1.0 0.5 0.0 -9.5947694264 7.86680147283 -23.8828263143 18.0279391486 -0.921057032179 -0.520153618676 -26.328279601 22.6675728161 1.84083567337 4.11898522947 -16.8847076565 37.4327116615 -0.453203471014 -1.1832039556 -16.0921700006 33.2871337715 0.251209343642 -1.35058968813 -12.6878362767 18.0084462487 1.13806526508 -0.538134276901 -0.93348175271 10.4134140172 0.127004202358 -0.0442680509071 1 4 1 11 4 10 5 11 5 11 3 13 2 12 4 12 2 12 3 13 2 12 3 2 5 5 3 5 3 5 2 6 3 3 3 6 3 4 2 6 3 4 2 6 3 4 2 6 3 4 2 6 3 3 3 6 3 3 3 6 3 1 6 5 11 3 5 1 3 1 2 8 0 345.0 0.652173913043 115.0 0.895652173913 0.135458937198 0.190170132325 0.0419798300808 0.151856880633 0.060129274997 0.0166669052979 0.0254845672861 0.0193433800052 0.131295998393 0.666666666667 0.565217391304 7.0 2.0 0.0 0.0 0.0 0.0 5.0 5.0 0.0 6.0 0.173913043478 1.0 1.0 2.0 0.333333333333 0.541666666667 0.375 0.375 0.458333333333 0.5 0.541666666667 0.5 0.541666666667 0.0 0.125 0.125 0.0 0.0 0.125 0.583333333333 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.0 0.666666666667 1.0 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.666666666667 0.666666666667 0.5 0.5 0.5 0.5 0.0 0.166666666667 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -8.35909440239 -10.29663284 -20.5081062469 -24.0453293315 -0.144203508888 1.59984270238 -19.9329283715 -16.6324189072 1.15861848476 2.88700622722 -19.7623484032 -1.75314648437 -3.86039982307 -0.834869129672 -34.3940310801 1.66017416669 2.63347413856 1.53667059309 -26.0912505913 3.14658776972 -1.60714520626 -2.6658513125 -33.7792320422 -11.5670805203 -0.126771892885 0.377608590429 7 5 7 7 4 3 1 5 3 3 3 3 4 3 3 3 3 3 4 3 2 4 3 4 2 3 3 5 1 3 3 32 1 11 2 0 156.0 1.08333333333 100.0 0.42 0.325443786982 0.340277777778 0.115289789106 0.10856002082 0.0463099934254 0.0155340642887 -0.00333520180766 -0.00389086491155 -0.0618457554791 0.538461538462 0.583333333333 0.0 3.0 3.0 0.0 1.0 3.0 3.0 0.0 2.0 5.0 0.257142857143 0.0 2.0 2.0 0.641025641026 0.0 0.166666666667 0.5 0.75 0.333333333333 0.75 0.583333333333 0.333333333333 0.833333333333 0.416666666667 0.333333333333 0.75 0.916666666667 0.833333333333 0.75 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 -1.86088856538 -0.391766013765 -7.59277201751 2.04890062996 -4.12107710633 3.951273198 -18.7569039915 12.4412993166 2.1323512346 -2.0358088465 -13.9141933798 7.91470263314 -1.15612783568 0.756985562932 -15.6069929019 7.32595500807 0.159957839553 -0.197537650716 -18.479854431 10.5951120248 -0.420410792071 1.02984566427 -20.0908773225 19.2410316818 0.0360385038189 0.182790086149 11 1 10 5 9 5 9 5 10 4 10 4 10 4 10 4 6 1 4 3 4 10 3 3 4 4 2 3 5 4 2 3 5 4 1 4 5 4 1 4 6 8 6 3 1 4 6 3 1 4 6 3 2 4 5 3 3 4 3 5 3 11 12 1 1 0 308.0 0.636363636364 132.0 0.689393939394 0.236085343228 0.230371900826 0.0702828437375 0.15761056019 0.0630227579386 0.0172475878724 0.014306434514 0.0106502784917 0.0852129725731 0.642857142857 0.5 0.0 2.0 5.0 0.0 0.0 1.0 5.0 4.0 4.0 11.0 0.25 0.0 2.0 2.0 0.428571428571 0.0 0.125 0.833333333333 0.75 0.0 0.291666666667 0.291666666667 0.5 0.333333333333 0.333333333333 0.166666666667 0.208333333333 0.875 0.958333333333 0.916666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.954929658551 -4.36952661943 0.141888017235 -10.0970999666 -1.73874682757 1.91930577879 3.17826349107 4.68920393006 6.22752872585 7.37852854627 21.2773861482 37.2164275874 -4.93528050655 -2.57461850353 4.95713091572 29.0941769952 1.38929777402 -1.42601830577 -0.0843112433852 8.96295560966 -1.13249960596 -0.976771542694 -2.5051867275 -1.35963606843 0.10181357296 0.0481753466282 5 2 7 7 4 3 2 4 2 3 4 3 2 2 5 3 9 3 8 4 6 6 4 3 1 4 3 3 3 3 2 3 4 3 2 4 2 18 1 4 3 3 1 0 168.0 0.857142857143 88.0 0.681818181818 0.239583333333 0.278486394558 0.0751266652494 0.134044776145 0.061290922619 0.0156317121028 0.00816024046015 0.0092484043176 0.0362298416776 0.916666666667 0.571428571429 3.0 6.0 2.0 0.0 1.0 2.0 2.0 2.0 6.0 11.0 0.289473684211 0.0 3.0 2.0 0.52380952381 0.5 0.416666666667 0.25 0.916666666667 0.5 0.0833333333333 0.5 0.666666666667 0.5 0.0833333333333 0.5 0.333333333333 0.75 0.75 0.916666666667 0.833333333333 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.00080499887 -2.09175068064 -7.7479845005 -3.54640798181 -3.93293672783 2.6383527884 -18.7961365709 8.12908534932 1.73175577872 2.64176183103 -15.7693186947 21.7088441378 -1.36513353558 -0.665834050207 -19.7122260565 20.7778052178 0.174963094522 -0.0134908831379 -20.3816927695 16.5567463271 0.325514064744 -0.780352548724 -18.1537136769 9.22562540968 -0.232943610525 -0.116477351487 2 1 6 6 2 6 2 6 3 6 3 5 3 4 3 4 3 4 3 5 4 1 6 0 88.0 0.727272727273 48.0 0.6875 0.241477272727 0.231404958678 0.0546992392938 0.107931066867 0.0403244740796 0.00903943902165 -0.000975817665578 0.000967854128814 0.0308699107931 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 4.0 0.1875 0.0 4.0 1.0 0.545454545455 0.333333333333 0.333333333333 0.0 0.166666666667 0.833333333333 0.833333333333 0.166666666667 0.5 0.833333333333 1.0 0.666666666667 0.833333333333 0.666666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.34058935705 5.55595437703 -10.1824940243 12.625409796 0.297025453524 -1.05609050142 -10.3106163291 9.87791433034 -0.357576096942 -0.236415516487 -10.9959422227 5.65942907142 -0.309271431565 -0.671267271578 -13.7795779063 -0.09802289544 -0.351641973547 -0.822866927967 -16.8080409626 -7.99258758526 -0.0771765917004 -0.362197083895 -16.7378951625 -14.3052204796 0.151238113216 -0.189290057087 2 6 4 2 1 5 2 2 4 3 2 2 5 2 8 3 8 4 5 6 3 3 1 3 2 3 4 2 2 3 3 3 2 3 3 3 1 1 1 5 1 4 1 2 5 1 2 0 143.0 0.846153846154 71.0 0.816901408451 0.225047679593 0.235610543303 0.0730433926189 0.11767976754 0.0532896610944 0.0167739201949 0.00932484063722 0.00955930947228 0.032387932207 1.09090909091 0.769230769231 2.0 3.0 4.0 1.0 2.0 1.0 2.0 4.0 3.0 14.0 0.194444444444 0.0 3.0 2.0 0.496503496503 0.583333333333 0.166666666667 0.583333333333 0.833333333333 0.416666666667 0.0833333333333 0.5 0.5 0.583333333333 0.416666666667 0.5 0.333333333333 0.833333333333 0.916666666667 0.916666666667 0.75 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.25 1.0 0.75 0.25 0.25 0.5 0.75 0.75 0.25 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.54647908947 -0.0979415034412 -9.11374904793 0.162448633069 -4.12165664186 1.03041416046 -21.7361248714 6.50640846619 0.927812368406 2.28822914435 -23.0027306702 16.1123587047 -1.77189428202 -1.04342537315 -30.9912717195 12.1019929952 -0.289096379389 -0.585360155801 -36.0160095957 1.93019491262 0.316226139583 -1.19073990437 -30.9473023173 -8.92997193415 0.149576742451 -0.0728334640999 4 7 5 9 3 3 3 4 3 3 3 4 2 9 4 2 3 1 6 4 9 4 9 4 10 3 7 2 2 4 4 3 2 11 3 9 4 1 1 4 1 1 2 0 182.0 0.928571428571 92.0 0.652173913043 0.225274725275 0.235871271586 0.0784950920351 0.110988380657 0.0522258353891 0.0215997609205 0.0146312475403 0.00844348442929 0.0232639152248 0.923076923077 0.5 0.0 4.0 5.0 3.0 1.0 2.0 1.0 1.0 6.0 13.0 0.277777777778 0.0 3.0 1.0 0.505494505495 0.3125 0.6875 0.9375 0.5 0.6875 0.5 0.25 0.75 0.75 0.4375 0.0 0.5 0.6875 0.25 0.125 0.75 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.75 1.0 1.0 1.0 0.5 0.25 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 -7.73038295018 0.318309886184 -18.610440625 4.13163500435 0.0468648666247 5.52935824885 -18.9116413789 26.7876164093 0.686273425256 3.49099933104 -14.1314609445 45.5572038194 -0.224601544 -1.22210327114 -13.9244426185 38.3718445602 0.0847740831114 -1.39113932304 -13.9232327775 23.4642187002 -0.22883380517 -0.604354747432 -16.5674017784 12.6777654687 -0.131912127036 -0.3143627025 2 1 8 22 2 5 2 1 3 4 7 3 9 3 7 4 7 3 8 3 9 3 7 4 6 6 7 3 5 0 154.0 0.785714285714 65.0 0.753846153846 0.157615112161 0.168831168831 0.0409885484729 0.0962066269032 0.0306505772858 0.0116419304799 0.0083932835059 0.000419971662428 0.0541973129495 0.545454545455 0.0714285714286 1.0 2.0 3.0 0.0 0.0 1.0 0.0 0.0 1.0 3.0 0.0434782608696 0.0 7.0 1.0 0.422077922078 0.666666666667 0.25 0.25 0.333333333333 0.833333333333 0.916666666667 0.916666666667 0.916666666667 0.75 0.666666666667 0.5 0.666666666667 0.583333333333 0.0833333333333 0.0 0.0833333333333 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.25 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.5 1.0 1.0 0.75 0.25 0.25 0.5 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -8.82173113138 6.00241499661 -16.4984887975 16.1592056239 6.46688758563 2.65598511445 0.914557160493 26.4610133474 -2.14669781917 0.214116285967 -1.29449912448 26.7465413863 0.0976547825078 -0.665841490578 -4.51878771968 22.9055642117 0.500340372746 0.323797823985 0.487790963939 21.1016085079 -0.0705738980195 -1.00769913901 0.0693006679896 11.8536980361 -0.0330201530233 -0.228489152483 1 14 2 11 7 8 5 1 3 7 5 12 4 13 4 13 4 12 5 11 7 8 10 7 11 4 10 6 6 1 4 8 3 2 4 10 7 10 8 10 6 13 4 13 4 13 4 10 8 9 1 1 2 1 1 7 0 374.0 0.772727272727 139.0 0.611510791367 0.174583202265 0.180359747205 0.0494553388234 0.103717685473 0.046073772293 0.0118221866345 0.0134636123218 0.00404518683758 0.0493675161973 0.588235294118 0.227272727273 0.0 5.0 3.0 2.0 1.0 0.0 2.0 0.0 7.0 11.0 0.297872340426 1.0 8.0 3.0 0.371657754011 0.0 0.133333333333 0.533333333333 0.0666666666667 0.233333333333 0.7 0.9 0.666666666667 0.6 0.766666666667 0.7 0.666666666667 0.366666666667 0.1 0.0666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.888888888889 0.777777777778 0.222222222222 0.0 0.0 0.0 0.333333333333 0.888888888889 0.888888888889 0.666666666667 0.888888888889 0.111111111111 0.555555555556 0.666666666667 0.888888888889 1.0 0.888888888889 0.777777777778 1.0 0.444444444444 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.333333333333 0.444444444444 0.888888888889 0.555555555556 0.333333333333 0.444444444444 0.666666666667 0.222222222222 0.0 0.0 0.333333333333 0.222222222222 0.0 0.0 0.888888888889 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -10.8225361302 1.7651730052 -17.6757658458 4.37711447698 11.4145542544 0.698500075185 13.2195923646 10.2953018061 -4.4494163707 2.6346034891 4.55209714881 21.224648618 0.0865139158265 -0.564234354655 -0.316896966786 23.1558475202 2.00414789398 1.0340727968 14.6209838007 28.1717376612 -1.01626144293 -0.190499871483 6.57873528838 26.6824419751 -0.232125571448 -0.221349614163 1 5 10 7 9 6 12 4 12 4 13 3 13 3 13 3 13 3 13 3 3 2 8 5 1 5 4 4 5 3 4 4 5 3 4 4 5 4 3 3 6 4 3 3 6 4 3 3 6 4 3 3 6 4 3 2 7 3 4 3 6 4 2 5 5 5 11 1 4 0 352.0 0.727272727273 126.0 0.761904761905 0.147194602273 0.182463842975 0.0481873934292 0.12060086016 0.0608715169149 0.0185088471814 0.0242709174229 0.0199642802362 0.0794806162266 0.3125 0.545454545455 2.0 3.0 4294967295.0 1.0 0.0 1.0 5.0 5.0 3.0 6.0 0.139534883721 3.0 1.0 2.0 0.357954545455 0.666666666667 0.25 0.458333333333 0.541666666667 0.791666666667 0.791666666667 0.708333333333 0.5 0.0416666666667 0.166666666667 0.125 0.0 0.0 0.25 0.583333333333 0.5 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.333333333333 0.5 0.5 1.0 1.0 0.666666666667 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.5 0.5 0.666666666667 0.666666666667 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -8.59436692696 -6.04788783749 -19.9886888833 -12.6663922774 1.57803740344 3.49602785212 -12.6631068009 2.87747439759 2.13498236391 3.73231292265 -6.27100531241 21.1767407537 -3.76642578902 -1.32393521099 -20.3387397976 23.042936486 2.48771695027 2.31373838469 -10.8125491625 31.5039990859 -0.571849857037 -1.49611638082 -11.364116411 27.0258498564 -0.322386378455 0.216189458227 23 1 2 3 22 10 20 11 19 12 19 5 3 5 17 5 4 4 18 5 3 5 17 5 4 5 17 5 4 5 17 4 5 4 18 3 4 6 18 3 2 9 16 3 4 8 16 3 5 7 16 3 5 5 17 4 5 5 17 4 4 6 16 3 6 5 17 3 5 5 18 2 6 4 19 2 6 3 2 2 15 3 5 4 2 2 15 3 5 7 15 3 5 8 14 4 5 6 16 3 6 5 17 3 27 3 28 2 28 3 20 5 3 3 20 5 2 3 21 9 22 8 23 0 1054.0 0.911764705882 284.0 0.654929577465 0.167105343698 0.120102690032 0.0835344432213 0.0659533688879 0.0414163956792 0.0348370691516 0.0100618028466 0.0117207787006 0.0223510398501 0.451612903226 0.794117647059 0.0 0.0 4.0 8.0 5.0 8.0 10.0 3.0 7.0 8.0 0.342105263158 2.0 1.0 2.0 0.26944971537 0.0 0.0 0.0 0.263888888889 0.0 0.0277777777778 0.305555555556 0.361111111111 0.458333333333 0.458333333333 0.347222222222 0.0833333333333 0.694444444444 0.708333333333 0.638888888889 0.0972222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.4 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.55 0.0 0.0 0.0 0.0 0.0 0.35 0.7 0.35 0.0 0.0 0.05 0.35 0.6 0.6 0.2 0.0 0.1 0.55 0.75 0.75 0.25 0.0 0.0 0.0 0.65 0.9 0.4 0.0 0.15 0.55 0.3 0.0 0.75 0.2 0.45 0.6 0.85 0.9 0.35 0.0 34.5272605955 20.4467291596 70.9305156553 51.8633735649 -17.9721014163 3.72428397873 16.5771447451 64.1043100197 1.95175009052 -3.77592229281 18.6925611322 41.607190298 7.96965235785 -0.374719672135 51.2511185758 43.892078965 -8.67733402998 4.5215748729 19.2872720966 62.3831910011 6.08200821295 -4.2788361652 35.7532594952 48.3722422768 -1.0328317023 1.05998594628 5 5 5 8 3 11 3 2 5 3 3 1 6 3 10 3 8 5 5 8 4 4 1 4 3 4 3 3 2 5 3 3 3 4 1 7 1 11 11 1 2 0 182.0 0.928571428571 95.0 0.705263157895 0.245984784446 0.249215070644 0.0797874387417 0.107338425974 0.056647615155 0.0157144890457 0.00871165712669 0.00714711349174 0.00677337026632 0.846153846154 0.428571428571 3.0 4.0 4.0 0.0 0.0 2.0 2.0 2.0 4.0 10.0 0.184210526316 0.0 3.0 2.0 0.521978021978 0.5 0.1875 0.375 0.8125 0.625 0.0625 0.625 0.6875 0.875 0.625 0.8125 0.75 0.375 0.5 0.5 0.6875 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.75 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 0.75 1.0 1.0 0.5 0.0 0.0 0.5 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 -3.09215318007 0.591146931484 -10.3425755279 4.0565059996 -3.99696991193 4.36144865187 -22.5888735131 21.6834032395 0.959636031296 2.10171502816 -23.7913398651 30.7348127059 -2.06000549302 -2.23903210241 -34.0911717606 20.6323842465 -0.519091000169 0.710383728202 -40.4367024484 18.7069901168 0.522651006137 -0.804650535646 -35.7468802346 12.4547272817 -0.0236096608725 -0.269940006371 1 6 4 7 8 3 11 2 4 2 5 1 5 2 5 1 11 2 3 10 3 9 4 9 4 10 4 9 4 5 3 2 10 5 7 7 4 4 0 195.0 0.866666666667 99.0 0.606060606061 0.228402366864 0.219829059829 0.0741042836191 0.103530538276 0.042624184494 0.0194845614419 0.00994463214217 0.00389944320039 0.0238382049232 0.846153846154 0.2 0.0 2.0 5.0 3.0 0.0 2.0 0.0 1.0 3.0 12.0 0.210526315789 0.0 4.0 1.0 0.507692307692 0.25 0.6875 0.875 0.75 0.6875 0.6875 0.25 0.5625 0.875 0.5 0.0 0.25 0.75 0.6875 0.0 0.375 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 0.75 0.5 0.75 0.5 0.0 0.0 1.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 1.0 1.0 0.75 0.5 0.75 0.5 0.0 0.0 -10.1859163579 7.13014145052 -23.6709881168 19.6567390372 1.48940732522 4.16943509583 -18.0038402426 37.7452203345 2.05046268846 2.31756005073 -5.09889357413 46.827357262 -0.0898687145639 -2.30471210312 -1.64789904668 30.2831831299 0.675544755782 -2.06215033159 3.33000162537 10.2027718613 0.160427306872 -0.0915990195139 4.98693162002 1.25433492754 -0.116862894962 -0.508568912673 1 5 1 11 8 3 5 1 3 4 5 2 3 2 5 1 5 2 8 5 3 9 4 10 2 11 3 6 2 2 4 4 4 2 4 2 5 2 9 4 9 7 3 5 0 195.0 0.866666666667 95.0 0.768421052632 0.213806706114 0.232820512821 0.0683107941806 0.111104233045 0.0526540231629 0.0184701119353 0.0122105150043 0.00794094052002 0.0335213907154 1.0 0.4 0.0 3.0 6.0 4.0 1.0 2.0 1.0 1.0 7.0 8.0 0.257142857143 0.0 5.0 1.0 0.487179487179 0.25 0.6875 0.75 0.625 0.75 0.75 0.1875 0.625 0.5625 0.5 0.0 0.4375 0.5 0.375 0.125 0.75 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 0.75 0.75 0.5 0.0 0.0 0.5 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.5 1.0 0.5 0.0 0.0 -10.1859163579 3.73483599789 -25.0410555582 12.6030826109 -0.362165914947 5.56830094231 -24.3443642444 33.1853935868 3.12690026899 0.895388156944 -7.63568053402 37.454628536 -0.0247143212676 -2.25068141979 -3.46480942969 21.6392550229 -0.106849680521 -0.857706142599 -3.08124183553 9.81462950573 0.712587418104 -0.529856544348 2.12532427319 0.952903133398 -0.0558223283533 -0.348662346832 4 1 1 1 1 2 1 1 1 1 2 12 1 3 4 6 1 3 4 4 3 2 5 4 3 2 5 4 3 3 4 3 5 2 4 3 6 2 2 4 6 4 9 2 11 4 10 10 5 10 4 11 2 2 5 5 1 3 7 7 8 2 1 3 8 2 1 4 8 1 3 3 9 0 294.0 0.666666666667 136.0 0.786764705882 0.207240038873 0.206511175899 0.0570380334095 0.131931871735 0.0427572458943 0.0150939031816 0.00965485268543 0.00669468596653 0.071121805984 1.42857142857 0.761904761905 3.0 7.0 4.0 3.0 7.0 4.0 0.0 5.0 6.0 19.0 0.224137931034 1.0 3.0 2.0 0.462585034014 0.5 0.458333333333 0.583333333333 0.708333333333 0.333333333333 0.375 0.625 0.125 0.625 0.416666666667 0.583333333333 0.0833333333333 0.791666666667 0.375 0.541666666667 0.5 0.166666666667 0.5 0.5 0.166666666667 0.0 0.333333333333 0.166666666667 0.5 0.5 1.0 1.0 0.5 0.166666666667 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.833333333333 0.666666666667 1.0 1.0 0.666666666667 0.666666666667 0.333333333333 0.166666666667 0.666666666667 0.833333333333 0.833333333333 1.0 0.333333333333 0.5 0.0 0.0 0.166666666667 0.5 0.5 1.0 0.333333333333 0.5 0.0 0.0 0.0 0.333333333333 0.333333333333 1.0 0.333333333333 0.5 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 1.0 0.333333333333 0.666666666667 0.5 0.5 0.666666666667 0.333333333333 0.333333333333 1.0 0.5 -9.30677476747 5.15358863345 -20.8661645654 16.0278877279 1.81045836787 4.60750209078 -18.8526776759 28.2323175628 -1.99977262167 -2.36580606509 -23.2759188602 26.9142944507 0.793252084902 3.67311436668 -18.6211104325 37.1690705413 1.29595731792 -2.5152641797 -8.26765138792 30.0340477414 -0.744083767115 0.859257617213 -12.5401395645 22.6058805911 -0.0454795913483 -0.655484560838 2 5 10 6 10 6 10 5 13 3 13 3 13 3 13 3 13 2 14 3 1 6 5 7 1 4 4 5 4 3 4 4 5 4 3 3 6 4 3 3 7 3 3 3 7 3 3 3 7 3 3 4 5 4 2 4 6 4 1 5 6 4 1 6 4 12 4 6 352.0 0.727272727273 146.0 0.609589041096 0.172052556818 0.23166322314 0.0543606111109 0.152349527934 0.0664175765842 0.0193107037028 0.0209131245803 0.0196005312864 0.106435233471 0.5 0.590909090909 2.0 4.0 2.0 0.0 0.0 1.0 5.0 5.0 2.0 6.0 0.272727272727 0.0 1.0 2.0 0.414772727273 0.541666666667 0.291666666667 0.5 0.708333333333 0.875 0.75 0.708333333333 0.583333333333 0.125 0.25 0.166666666667 0.0 0.0 0.291666666667 0.458333333333 0.458333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.0 0.0 0.166666666667 0.5 0.5 0.5 1.0 0.833333333333 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.666666666667 0.5 1.0 0.666666666667 0.5 0.333333333333 0.5 0.833333333333 0.166666666667 0.0 0.5 0.166666666667 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -9.25992396171 -10.9961597045 -21.6101201485 -27.7547530663 1.42868764843 -0.877205606703 -15.4797954654 -25.7797031959 1.77881646686 4.82808567838 -10.0288442199 -8.19073907485 -3.64597437372 -3.37335460652 -25.7763221804 -14.0062038729 1.87417431118 2.79267972448 -16.087664675 -6.02393489993 0.924775485505 -1.69660034554 -7.83627951212 -11.6566685796 -0.564460586259 0.0152503632113 1 1 3 2 4 3 3 32 4 2 4 3 3 3 3 4 2 4 2 4 2 4 2 4 2 4 3 2 4 1 11 1 0 126.0 0.285714285714 52.0 0.75 0.146825396825 0.233560090703 0.0131780225318 0.411744592017 0.0547727027319 0.0017503847829 0.0307111717156 0.00630801205138 0.756787097347 1.0 204522251.952 2.0 2.0 1.0 0.0 4294967294.0 4294967293.0 0.0 0.0 4.0 1.0 0.25 0.0 3.0 1.0 0.412698412698 0.333333333333 0.416666666667 0.166666666667 0.416666666667 0.5 0.5 0.666666666667 0.75 0.5 0.5 1.0 1.0 0.25 0.25 0.5 0.833333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -3.81971863421 -5.3961104515 -6.23433850827 -10.5772202542 3.29177998268 4.07213930197 -1.64685099697 6.15617545071 -3.75818564852 3.37427538506 -7.70113292664 24.9049084898 3.80067500617 -0.849313814612 1.8327989871 23.101171552 -2.61551298248 -0.156008354737 -2.52086471949 17.9978823206 1.75137098355 -0.614014660593 -0.58557718427 10.9197171338 -0.373861112102 -0.168876341002 4 1 3 5 2 4 4 4 4 2 4 3 4 4 3 4 3 3 4 3 4 4 3 4 3 3 4 3 5 2 5 3 3 3 4 4 3 3 3 5 1 7 2 3 2 0 154.0 0.318181818182 77.0 0.805194805195 0.229128014842 0.251180637544 0.0213711276074 0.33523343329 0.0571379834536 0.0017493653889 0.0162264802454 0.00243695945583 0.512602011301 1.28571428571 0.0 0.0 1.0 0.0 6.0 0.0 0.0 0.0 0.0 0.0 3.0 0.296296296296 0.0 4.0 1.0 0.5 0.166666666667 0.0 0.0 0.25 0.5 0.5 0.333333333333 0.583333333333 0.75 1.0 0.833333333333 0.916666666667 0.916666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.5303460104 1.3311140695 -6.37829795877 4.42624454291 2.43993735071 2.45500385922 -2.38614318416 17.3963245346 -2.28491171404 3.86766691308 -5.30744441929 36.4118422228 2.24812981454 -0.186258710084 -0.932260429234 38.7453157615 -1.94468778703 -0.633328230987 -4.99739764933 29.5043338005 1.39218472226 -0.957411797351 -3.98402628476 20.1088093375 -0.448833527584 -0.0439709219913 2 2 3 3 3 3 33 3 2 4 2 5 2 4 2 3 3 4 3 2 3 3 4 2 3 4 2 4 1 12 3 1 2 0 132.0 0.272727272727 59.0 0.813559322034 0.169191919192 0.258608815427 0.0146906391741 0.424028073434 0.0578295002365 0.0019000507943 0.0241715084938 0.00587442741219 0.795646448438 1.33333333333 195225785.955 1.0 3.0 1.0 2.0 4294967294.0 4294967293.0 0.0 0.0 0.0 4.0 0.157894736842 1.0 5.0 1.0 0.44696969697 0.166666666667 0.416666666667 0.5 0.583333333333 0.416666666667 0.5 0.916666666667 0.916666666667 0.5 0.5 1.0 1.0 0.25 0.333333333333 0.75 0.833333333333 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.08015399563 -5.52701711465 -6.05980014387 -9.29324686186 4.33018629165 6.46556493458 1.05467407811 15.4642131936 -4.44550645066 3.16623081554 -6.71991176095 32.6591654229 4.0847975374 -2.48666601661 2.49145841393 19.5752772503 -3.06263865762 -0.507236000269 -4.85262206981 8.78293254341 1.69693107595 -0.576043400262 -2.65568802885 3.63835554001 -0.228311726581 0.0323656001903 0 4 2 4 1 21 2 5 6 5 6 4 8 3 8 3 8 3 8 3 7 4 6 6 5 6 5 0 143.0 0.846153846154 71.0 0.422535211268 0.160203432931 0.190424959656 0.0423451554558 0.101700050646 0.0191289467538 0.0123564110975 0.00310440518864 -0.00284867201815 0.0553653304969 0.272727272727 0.0769230769231 2.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 5.0 0.173913043478 0.0 1.0 1.0 0.496503496503 0.916666666667 0.583333333333 0.333333333333 0.75 0.916666666667 1.0 1.0 1.0 0.75 0.5 0.333333333333 0.5 0.75 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -12.0468049233 5.38678268926 -26.0785339438 14.0909491784 4.03704445545 1.73049307264 -15.782406248 20.9415180826 -1.16318952098 0.0937853078538 -17.0134738049 20.623804244 -1.38075047607 -0.572495711883 -26.9824825359 15.3652976443 0.106634252095 -0.576601995205 -29.1661605639 9.42135927167 -0.653963098631 -0.229011755929 -34.2517720851 4.63418786129 -0.0680692537145 -0.217234432522 9 3 11 5 10 5 10 5 11 4 11 4 11 4 12 3 11 4 6 9 5 2 4 3 5 2 6 2 4 3 6 2 4 3 6 3 3 2 7 2 4 2 7 2 3 3 7 3 3 3 5 4 3 3 5 4 3 5 3 6 2 12 4 2 1 1 4 2 2 0 330.0 0.681818181818 122.0 0.795081967213 0.196363636364 0.202066115702 0.0613500292178 0.14870080975 0.0589074213206 0.0165424158381 0.0194102522809 0.0117296077457 0.0942206226464 0.733333333333 0.545454545455 0.0 3.0 5.0 2.0 0.0 0.0 5.0 4.0 3.0 11.0 0.163265306122 0.0 2.0 2.0 0.369696969697 0.0 0.0416666666667 0.541666666667 0.666666666667 0.0 0.208333333333 0.208333333333 0.375 0.375 0.333333333333 0.0416666666667 0.291666666667 0.958333333333 0.916666666667 0.583333333333 0.875 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 -0.81024334665 -6.30832319892 -4.50807183637 -16.5108426134 -2.60602767073 -0.736943586984 -6.34235103937 -11.3604502708 4.96234323098 7.14628384174 7.32862183291 20.7517707023 -3.840005465 -0.75862998454 -2.42992368994 27.8972541673 2.18717178514 0.459954856015 1.37266653451 24.6455505997 -1.00177064204 -0.909174884382 1.56478370643 19.769394094 0.201052769334 0.141974841135 6 5 4 9 2 4 1 5 1 4 4 7 6 6 8 4 8 4 8 5 7 5 7 6 4 2 1 6 2 3 2 9 6 3 4 0 168.0 0.857142857143 87.0 0.574712643678 0.21130952381 0.235969387755 0.07269648931 0.114353665573 0.0383602101555 0.0233408368547 0.0103966091981 0.00388297088411 0.0377067799872 0.666666666667 0.357142857143 0.0 2.0 3.0 3.0 1.0 2.0 0.0 2.0 2.0 8.0 0.259259259259 0.0 2.0 1.0 0.517857142857 0.25 0.916666666667 1.0 0.75 0.666666666667 0.75 0.833333333333 1.0 0.583333333333 0.0833333333333 0.166666666667 0.75 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -12.6869226065 1.95533215799 -29.8357893692 9.5548635355 0.825471264608 7.4023288838 -30.0503271238 36.2443446385 -0.896663438236 1.1711671266 -31.8249692205 43.8566710521 -0.809282032292 -2.0534060532 -35.1634319652 30.3323630534 1.04197943654 -0.10863941504 -28.7951902186 25.7458901822 -0.357561916086 0.342509133154 -29.6031033637 29.1232850598 -0.0679597124321 0.0568361281462 2 5 3 7 2 7 1 3 2 3 1 3 6 6 4 7 2 7 7 3 7 3 6 4 5 5 3 2 1 6 5 3 4 0 135.0 0.6 74.0 0.702702702703 0.228806584362 0.231111111111 0.0502346187065 0.149223593964 0.0425935070873 0.0103761798327 0.00664247984635 0.00622667275242 0.095015890135 1.33333333333 0.266666666667 2.0 3.0 4.0 3.0 0.0 1.0 0.0 2.0 1.0 10.0 0.25 1.0 3.0 1.0 0.548148148148 0.666666666667 0.916666666667 0.333333333333 0.5 0.833333333333 0.666666666667 0.5 0.0833333333333 0.916666666667 0.583333333333 0.583333333333 0.0833333333333 0.583333333333 0.333333333333 0.75 0.666666666667 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.5 1.0 1.0 0.5 1.0 1.0 0.75 0.25 0.5 1.0 1.0 0.5 1.0 1.0 1.0 0.5 0.25 0.75 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.5 1.0 1.0 0.25 0.5 0.5 0.25 0.0 0.25 0.5 0.75 -6.79061090525 5.9417845421 -17.3029921961 14.0801804874 -0.756021347452 0.507032280926 -16.2264696519 21.432935571 3.77886598366 3.25488232588 0.197583451444 29.7575917453 -1.12118370097 -3.03486928978 0.11714666582 18.6317044504 0.313064262627 1.10610694139 -1.1883204274 16.6043484729 -0.0258320238115 -1.13562184646 1.07946946617 8.21543171107 0.107782116335 -0.372571860749 0 7 7 7 7 5 11 3 11 3 11 3 11 2 12 3 11 2 4 2 6 3 1 6 5 2 5 2 6 1 5 3 3 2 12 2 12 2 12 2 7 1 4 2 7 1 3 3 6 3 2 3 6 2 2 5 5 3 1 6 3 5 294.0 0.666666666667 96.0 0.9375 0.113216715258 0.16488500162 0.0330114090155 0.137015692945 0.0473001454735 0.0130852018414 0.024147387889 0.0160962692312 0.125038451218 1.0 0.47619047619 3.0 5.0 1.0 4.0 0.0 2.0 2.0 5.0 2.0 5.0 0.230769230769 3.0 0.0 2.0 0.326530612245 0.75 0.458333333333 0.375 0.75 0.666666666667 0.458333333333 0.291666666667 0.375 0.0833333333333 0.25 0.0 0.0416666666667 0.0 0.25 0.25 0.583333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.5 0.333333333333 0.166666666667 0.5 0.5 1.0 1.0 1.0 1.0 0.833333333333 0.5 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.5 0.5 0.833333333333 0.5 0.333333333333 0.166666666667 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 -9.33708999472 -4.36539272481 -21.0052388423 -12.7925784996 2.49038560775 -2.42521818045 -12.0040249724 -15.4343739223 1.31210699531 4.73981316131 -6.6186405636 2.19089584935 -2.64297946378 -1.38828418955 -15.3922544371 7.19198567595 2.58953331595 2.58902055153 -2.5936219709 18.9914813853 -0.554306621897 -1.10018451833 -3.22415794143 14.0813647641 -0.249991048117 -0.282851849337 4 2 5 3 5 2 4 4 3 4 4 3 2 6 1 1 2 3 2 6 1 5 6 5 2 3 1 1 1 3 5 4 4 2 4 3 5 3 4 3 3 4 4 4 4 2 4 3 5 3 4 3 3 4 4 3 5 2 4 3 5 3 4 5 1 4 4 3 5 5 1 3 5 3 4 5 2 3 5 2 5 3 4 0 286.0 1.69230769231 136.0 0.830882352941 0.227749523204 0.214631522324 0.167795106502 0.0525870774538 0.0506336418728 0.0714706785699 0.00706681411842 0.0133879407826 -0.0265437471587 0.454545454545 2.15384615385 2.0 0.0 2.0 5.0 7.0 7.0 6.0 6.0 7.0 5.0 0.428571428571 0.0 2.0 3.0 0.475524475524 0.625 0.666666666667 0.583333333333 0.541666666667 0.333333333333 0.208333333333 0.291666666667 0.416666666667 0.583333333333 0.625 0.458333333333 0.25 0.583333333333 0.458333333333 0.5 0.75 0.0 0.333333333333 0.666666666667 0.5 0.166666666667 0.166666666667 0.333333333333 0.5 0.5 0.833333333333 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.5 0.333333333333 0.166666666667 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.666666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.166666666667 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 -3.64609505992 9.20204943695 -13.3665849629 20.9046878487 -7.27246016822 -1.69211239646 -40.6670593164 16.5635664364 -1.13342865063 -0.664798570542 -43.1687079922 7.03132980889 3.99280808457 -1.36427317178 -25.9887733001 0.774050266229 -3.52501436759 0.816413720451 -42.2975543694 -0.113540596335 0.0770845279183 -1.38962275015 -51.551066192 -7.011322214 -0.0104509258861 0.187921198044 5 3 6 10 2 5 1 5 2 4 3 4 2 3 4 4 9 4 7 6 5 8 4 9 3 10 2 12 1 26 1 5 1 5 3 4 2 4 1 0 195.0 0.866666666667 131.0 0.389312977099 0.305325443787 0.347692307692 0.0758399838163 0.129571435796 0.0546822434633 0.00813989372776 -0.00105429101269 0.000852722320195 -0.0148311571783 0.538461538462 0.333333333333 3.0 3.0 1.0 0.0 1.0 2.0 0.0 1.0 1.0 11.0 0.138888888889 0.0 2.0 1.0 0.671794871795 0.6875 0.4375 0.375 0.9375 0.625 0.1875 0.875 1.0 0.8125 0.8125 1.0 1.0 0.375 0.5 0.5 0.8125 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.25 0.75 0.5 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -5.26272345157 -3.56507072526 -14.1447634889 -5.58691423354 -2.21373915511 4.67646737675 -22.4079414874 11.556431588 -0.00551632342674 1.72546908061 -22.6969455102 22.5288328918 0.163984255104 -1.04423283353 -19.724935749 16.7058057924 0.626377908232 -0.370716603314 -12.3709336651 9.78242475738 0.943987804041 -0.850886645991 -1.97186354629 -0.366507536332 0.11490374922 -0.262490488251 6 6 6 8 4 9 4 3 4 1 4 3 10 4 9 3 10 3 9 4 8 5 8 6 8 4 9 4 9 4 9 4 9 4 9 4 9 4 9 5 7 6 6 9 5 8 4 0 286.0 0.590909090909 111.0 0.558558558559 0.143087681549 0.189129052765 0.0283437526824 0.162680343765 0.0297622569127 0.00732420314939 0.0116959745599 -0.000153857012811 0.152914013426 0.461538461538 0.0454545454545 1.0 0.0 5.0 0.0 1.0 0.0 0.0 0.0 2.0 3.0 0.310344827586 0.0 1.0 1.0 0.388111888112 0.0833333333333 0.458333333333 0.541666666667 0.625 0.666666666667 0.833333333333 0.791666666667 0.875 0.583333333333 0.0833333333333 0.0416666666667 0.208333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.5 0.0 0.166666666667 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.5 1.0 0.5 0.166666666667 0.0 0.166666666667 0.166666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -14.4686311902 0.83918060903 -24.2462351697 3.91244767821 13.9963081059 3.33322585737 10.9335125909 19.1630149365 -7.01019065753 3.51328945981 -2.07525626192 38.3012779058 2.51464625364 0.358829899457 0.409524505164 43.0545996626 0.686765276857 -0.590444451794 11.8280710286 35.6121701359 -0.696989798548 -0.813930486627 5.59212192175 27.5947898197 0.0828693665457 0.014251550442 3 2 6 3 5 4 4 17 2 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 5 5 6 1 0 135.0 0.6 69.0 0.565217391304 0.174485596708 0.242469135802 0.0290305339633 0.161493268303 0.0401068942742 0.00549045347531 0.00993952408247 0.00250834469854 0.143626168389 0.333333333333 0.0 0.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 3.0 7.0 0.0740740740741 1.0 3.0 1.0 0.511111111111 0.5 0.833333333333 0.666666666667 0.666666666667 0.916666666667 1.0 1.0 1.0 0.5 0.666666666667 0.333333333333 0.333333333333 0.25 0.416666666667 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 -10.7800948121 3.22554018 -20.4691835704 7.68036548632 7.24105476197 0.00452707393684 -2.57329002516 9.19409092347 -3.37251079701 1.06807087722 -7.26305628346 15.4027845449 1.21892602175 1.25218879997 -6.39295476624 22.4655234412 0.348216072322 -0.984149555334 1.54446986794 13.6675505108 0.331743950377 -1.47386957673 2.09216451916 -2.99124753619 -0.155365588962 -0.164185266129 6 1 1 1 8 9 4 3 3 4 3 3 6 8 6 8 6 7 8 6 8 6 9 2 1 2 8 2 2 3 6 3 2 4 4 3 4 4 2 3 8 4 5 0 196.0 1.0 86.0 0.813953488372 0.203352769679 0.197886297376 0.0963506914636 0.083524270287 0.0484202479409 0.0370647814705 0.00999925115895 0.012259195318 0.0132059613848 0.642857142857 0.857142857143 0.0 3.0 3.0 2.0 2.0 3.0 3.0 3.0 2.0 11.0 0.138888888889 0.0 2.0 2.0 0.438775510204 0.375 0.875 0.6875 0.625 0.5 0.1875 0.0 0.375 0.5 0.0 0.0 0.1875 0.5625 0.6875 0.4375 0.625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -0.818511135901 3.63782727067 -6.89609604797 11.8736955676 -7.56983598134 4.99087629124 -34.2616935392 31.8551540811 -1.29322032238 2.29489174324 -41.6570415333 44.3196711891 2.73100907906 -0.89118732531 -25.5473988128 38.0365829099 -0.684257540296 -1.08568985511 -27.707892692 27.0742535456 -1.16814145097 -0.0679183848291 -38.0770315951 24.5281100617 0.183420904049 0.0740281078476 3 1 10 5 9 5 9 5 9 5 10 4 10 4 10 4 11 3 11 3 11 8 6 9 5 10 3 4 5 3 2 4 6 3 1 4 6 3 1 4 6 3 1 3 7 3 1 3 7 2 1 5 6 2 2 4 5 2 4 10 4 7 5 0 322.0 0.608695652174 135.0 0.6 0.148624667258 0.227788279773 0.0368803346815 0.168942044641 0.0577117260975 0.0125831790763 0.0189849543923 0.014279037786 0.155936620769 0.642857142857 0.347826086957 2.0 2.0 3.0 1.0 0.0 0.0 3.0 4.0 3.0 12.0 0.274509803922 0.0 2.0 2.0 0.419254658385 0.833333333333 0.625 0.625 0.791666666667 0.458333333333 0.583333333333 0.75 0.416666666667 0.0 0.166666666667 0.5 0.0 0.0 0.0416666666667 0.541666666667 0.5 0.666666666667 1.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.5 0.666666666667 1.0 1.0 0.833333333333 0.5 0.5 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.666666666667 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 -15.9985316708 -9.0233932953 -34.7080121532 -20.7109579075 5.32119319555 2.48567920655 -20.5842708979 -7.17439375971 -0.900313787748 5.10325769481 -17.4515235706 16.3443434072 -0.340441587743 -1.67876303966 -17.7903827729 19.396249544 1.64881170968 2.08130915902 -8.96666105175 18.2377520846 -1.35087252878 -3.95103955032 -15.1586956232 -3.69385575834 0.168480041222 0.433463315194 1 10 3 10 6 9 7 6 9 5 3 4 2 5 4 10 4 10 4 11 3 12 3 10 4 11 4 11 4 5 2 4 3 5 3 4 4 2 3 6 9 7 7 7 0 255.0 0.882352941176 91.0 0.714285714286 0.140130718954 0.177393310265 0.0535078665068 0.103067085812 0.0260452465492 0.0209689633991 0.00619967009871 0.00141955769994 0.059819779529 0.533333333333 0.235294117647 0.0 3.0 3.0 0.0 0.0 1.0 0.0 3.0 2.0 5.0 0.260869565217 0.0 1.0 1.0 0.356862745098 0.0 0.25 0.8 0.9 0.15 0.7 0.35 0.55 0.5 0.25 0.05 0.55 0.8 0.05 0.1 0.2 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.833333333333 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.833333333333 1.0 0.0 0.0 0.5 1.0 0.833333333333 0.5 0.333333333333 0.833333333333 0.0 0.166666666667 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.666666666667 0.0 0.5 1.0 0.5 0.0 0.0 0.166666666667 0.833333333333 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.5 0.833333333333 -11.9834310093 2.62137553328 -26.1769853201 6.07788441115 4.1599920969 -0.459744952648 -12.1452871662 4.12823287585 1.4930757308 -0.548938985087 -2.66339379859 2.46319957907 -2.28577366531 1.29946669792 -13.3699482485 10.4009653226 1.01093026819 0.388402585852 -6.85206878966 13.5920393501 1.40477683804 -0.933634684002 7.79613254533 4.0275857821 -0.0455438677791 -0.241417111828 4 1 8 6 3 9 3 2 4 2 3 1 6 2 8 3 9 2 9 2 3 1 5 2 2 3 4 2 2 3 3 3 1 4 3 3 1 4 2 5 1 2 8 0 154.0 0.785714285714 62.0 1.09677419355 0.184179456907 0.198979591837 0.0652680091034 0.120337686432 0.0538394814833 0.0211933954612 0.0142331005639 0.0145337084206 0.0616701720771 0.636363636364 0.5 2.0 2.0 1.0 0.0 0.0 2.0 2.0 3.0 1.0 5.0 0.2 1.0 1.0 1.0 0.402597402597 0.5 0.25 0.25 0.833333333333 0.666666666667 0.0833333333333 0.25 0.666666666667 0.583333333333 0.0 0.0 0.0833333333333 0.583333333333 0.5 0.333333333333 0.666666666667 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.25 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.75 0.75 0.5 0.5 -2.63742477124 1.31871238562 -10.4957048126 5.37492605634 -5.62888808935 3.31557331155 -26.4871924935 16.8981735476 2.53711842658 -0.0890304626771 -20.2844307278 15.6507566903 -1.15893557972 -2.1098711542 -23.4778702884 0.653526358647 -0.755126179441 -0.634140380517 -29.08603981 -7.91672494492 0.893336792544 -0.129485052653 -24.6216925416 -11.3659016394 -0.226338675905 -0.203634317467 6 1 11 6 7 8 5 4 2 4 3 3 5 4 2 3 6 8 6 7 7 7 8 2 1 3 8 2 1 4 6 3 2 3 7 2 2 3 6 2 4 3 4 2 7 2 8 0 210.0 0.933333333333 86.0 0.883720930233 0.181632653061 0.180634920635 0.0800025915128 0.0787592052694 0.0436307094266 0.0313465312481 0.0085119109329 0.0132704945391 0.0204005870225 0.428571428571 0.733333333333 0.0 3.0 1.0 2.0 0.0 3.0 3.0 3.0 3.0 9.0 0.21875 1.0 1.0 2.0 0.409523809524 0.1875 0.75 0.8125 0.8125 0.6875 0.375 0.0625 0.1875 0.6875 0.1875 0.0 0.0 0.375 0.8125 0.625 0.5625 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -5.34760608789 8.82779417683 -19.8313422335 22.2810821031 -10.2368459397 1.52109684278 -54.1925805626 28.2828974523 1.0450247175 -0.48335736093 -51.4392818118 25.0072744857 2.7473636919 0.0810321643181 -33.7797060827 25.1014321754 -2.09054612185 0.799342658883 -46.8970852178 32.8380520223 -1.55412754743 0.990304662374 -67.8904609264 43.0805247587 -0.395238860395 0.0162428888267 7 5 5 9 3 4 2 4 2 4 5 1 3 3 10 3 10 3 10 2 11 2 10 4 8 5 2 6 1 4 5 3 1 3 6 3 1 4 5 3 1 4 5 3 1 3 6 3 1 3 6 3 1 3 6 3 1 4 5 3 1 4 5 3 1 4 4 4 273.0 0.619047619048 122.0 0.680327868852 0.208227669766 0.22780394209 0.0597962776444 0.169065049635 0.0577857025146 0.0190062688358 0.0193902998447 0.0135569250716 0.119172419854 0.769230769231 0.619047619048 0.0 3.0 2.0 4.0 2.0 0.0 5.0 5.0 0.0 4.0 0.170731707317 1.0 1.0 4.0 0.446886446886 0.291666666667 0.625 0.791666666667 0.75 0.583333333333 0.416666666667 0.416666666667 0.375 0.375 0.125 0.125 0.0416666666667 0.5 0.166666666667 0.791666666667 0.791666666667 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.5 0.5 0.0 0.333333333333 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.5 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -7.76069817743 -1.81891363534 -15.8583487864 -0.717814307959 4.56171991084 5.8766171148 0.89879675638 22.012206087 1.85763674327 2.77139547034 9.98758062804 38.6041976509 -2.85890455873 -0.409542554654 -2.19270544343 41.0214757499 1.61360464268 1.16862344457 4.20040749948 43.9225536805 0.246964540387 -1.02891488782 10.4207501538 41.4711584741 -0.115072247041 0.330994566133 3 1 12 1 9 6 3 4 1 4 4 3 3 3 4 2 4 4 3 2 4 4 2 3 5 7 6 7 6 6 7 6 8 5 8 4 10 3 5 0 182.0 0.928571428571 75.0 0.746666666667 0.179628064243 0.194270015699 0.0599732805535 0.0846730102406 0.0509930384795 0.0168655869248 0.0112288509798 0.0063512196227 0.0241659869711 0.0769230769231 0.357142857143 0.0 1.0 0.0 0.0 1.0 3.0 0.0 0.0 1.0 4.0 0.346153846154 0.0 4.0 2.0 0.412087912088 0.5625 0.5625 0.3125 0.125 0.4375 0.625 0.9375 0.875 0.125 0.3125 0.8125 0.6875 0.4375 0.5625 0.25 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.75 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.25 0.0 0.25 0.5 0.75 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 1.0 -6.63903476898 2.4555334077 -13.4550985577 8.76082486372 3.76078954449 3.89906410146 -1.46136100894 20.1503940386 0.248836438216 -1.63303085105 2.05168237619 15.2436564082 -1.32992984378 -0.141678103875 -4.77451118914 9.2450102339 0.736756229998 -0.660115335812 -2.42403070041 5.30760109405 -0.255729738654 0.249389136727 -1.99217277462 5.81065687822 0.075477984395 0.00996433221004 2 4 11 5 11 6 11 4 13 3 13 3 13 3 13 3 13 3 13 7 1 1 7 6 1 3 6 4 5 2 4 4 6 2 4 4 6 2 4 4 6 2 4 4 5 3 4 4 6 3 3 4 6 2 4 4 5 4 2 6 4 4 1 7 3 6 1 2 2 1 10 0 352.0 0.727272727273 129.0 0.77519379845 0.139204545455 0.201058884298 0.0413369881668 0.136411487743 0.0562704703935 0.0153639448236 0.0207222044247 0.0165793516254 0.102475581603 0.5 0.590909090909 2.0 2.0 3.0 1.0 0.0 1.0 5.0 5.0 3.0 6.0 0.282608695652 0.0 2.0 2.0 0.366477272727 0.5 0.25 0.416666666667 0.625 0.791666666667 0.833333333333 0.833333333333 0.833333333333 0.0416666666667 0.291666666667 0.166666666667 0.0833333333333 0.0 0.208333333333 0.375 0.458333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.166666666667 0.5 0.5 1.0 0.833333333333 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.166666666667 0.166666666667 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -12.7902699721 -8.97055133791 -26.5751397493 -20.8328533548 5.97901237001 2.22386448657 -9.68088530194 -7.4615665939 -1.08558512381 5.56612718554 -10.1822314565 16.1345609493 -2.13210086147 -3.06449228867 -22.9357625415 10.5567688966 1.52534896613 2.01771944424 -12.830925528 12.0802544768 0.499208119981 -1.78553968705 -8.81068861733 8.64220599268 -0.416055941126 0.631216645245 4 1 6 3 6 4 4 26 1 4 6 3 6 3 6 3 6 3 6 3 6 3 6 6 3 7 2 7 144.0 0.5625 76.0 0.5 0.228395061728 0.256944444444 0.0410665294925 0.183652692044 0.0574417009602 0.00739474578316 0.0157923497593 0.00487472533404 0.152285353716 0.444444444444 0.0 0.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 1.0 5.0 0.107142857143 0.0 3.0 1.0 0.527777777778 0.333333333333 0.833333333333 0.416666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 0.583333333333 0.833333333333 0.333333333333 0.333333333333 0.25 0.75 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -6.36619772368 3.02394391875 -10.9264710285 6.19434477922 5.53312106843 -1.48026531055 1.26190881314 2.57416544683 -3.6676355172 0.89343488516 -4.36755427579 6.5746068808 2.79730682049 1.10168408015 2.78460535834 13.6101100031 -1.20960628714 -0.502488418655 1.04764223744 10.9485345992 -0.0889285989753 -0.316055358309 -3.99652154001 4.93260543401 0.0678738651043 -0.231826929636 1 8 3 3 1 4 2 1 5 3 9 2 9 2 8 3 7 4 3 2 4 2 2 2 4 3 2 2 4 4 1 3 3 8 2 6 7 1 3 0 143.0 0.846153846154 63.0 0.920634920635 0.212968849332 0.204948897257 0.0757107824446 0.113056291843 0.0572373980365 0.0191373031305 0.0156953277171 0.0137779746757 0.0347032232119 0.727272727273 0.538461538462 2.0 2.0 4.0 0.0 2.0 0.0 2.0 3.0 2.0 6.0 0.0769230769231 2.0 1.0 1.0 0.440559440559 0.416666666667 0.0 0.5 0.666666666667 0.416666666667 0.0 0.0833333333333 0.166666666667 0.5 0.25 0.333333333333 0.333333333333 0.916666666667 0.833333333333 0.916666666667 0.833333333333 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.25 0.25 0.0 1.0 0.75 0.25 0.0 0.25 0.75 0.5 0.25 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.0979415034412 -1.17529804129 -3.75057559751 -1.54200622588 -4.67916981529 2.07241903139 -16.3693829125 6.33792864902 2.23209992869 0.793257250867 -11.8304427643 9.99448964536 -1.04878791816 -1.19553278148 -12.3019850368 3.31329981551 0.419090383046 -0.169776552381 -12.3700303661 -2.20995559425 -0.108191503807 -0.836103039459 -11.3718234514 -10.9057514753 0.00899912138983 -0.204495448761 4 3 13 13 5 13 6 5 3 6 4 5 4 5 5 3 6 4 5 4 5 4 5 3 7 4 3 4 7 3 5 4 6 3 5 3 6 4 5 4 5 4 5 4 4 4 5 12 6 6 1 1 10 5 13 4 14 6 12 6 11 8 9 9 8 11 9 8 8 0 414.0 0.782608695652 185.0 0.6 0.195249597424 0.205734089477 0.0571040925312 0.117466213508 0.039342275757 0.0167804329064 0.00495102044047 0.00223805663769 0.0560415495351 0.888888888889 0.478260869565 3.0 4.0 6.0 1.0 2.0 5.0 3.0 0.0 3.0 8.0 0.166666666667 0.0 2.0 2.0 0.446859903382 0.4 0.233333333333 0.3 0.5 0.8 0.666666666667 0.833333333333 0.9 0.433333333333 0.0 0.266666666667 0.2 0.666666666667 0.7 0.5 0.0 0.222222222222 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.777777777778 0.444444444444 0.444444444444 0.444444444444 0.333333333333 0.555555555556 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.777777777778 0.777777777778 0.555555555556 0.444444444444 0.444444444444 0.555555555556 0.888888888889 0.666666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.555555555556 0.222222222222 0.666666666667 0.666666666667 0.111111111111 0.0 0.0 0.111111111111 0.555555555556 0.111111111111 0.666666666667 1.0 0.777777777778 0.444444444444 0.444444444444 0.777777777778 0.666666666667 0.0 0.222222222222 0.777777777778 1.0 1.0 1.0 0.888888888889 0.333333333333 0.0 -11.4868350232 10.1305581168 -23.3516697591 28.0549614053 5.66877806839 5.05852932958 -10.1812581547 44.4771058362 -3.26721958653 -1.24797907455 -18.3600493917 43.2102137849 -0.242278935476 1.09771083688 -22.528640576 39.5959485979 1.45344542607 -2.39318357173 -11.6023198549 28.5933200648 -0.435425612662 1.04389619225 -12.857667417 22.852919928 -0.0800660717492 -0.731791788808 1 4 3 5 1 7 1 6 1 6 1 6 3 4 2 4 3 4 1 4 3 2 5 0 77.0 0.636363636364 52.0 0.423076923077 0.300556586271 0.272727272727 0.0534944899931 0.128183504807 0.0345758137966 0.00551746458998 -0.00618837335091 -0.00087642204167 0.0314283795883 0.428571428571 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 4.0 0.0555555555556 0.0 2.0 1.0 0.675324675325 0.666666666667 0.666666666667 0.333333333333 0.0 1.0 1.0 0.666666666667 0.333333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -3.35672243612 6.01895057511 -7.7677312605 13.9055272839 0.526132043279 -0.925992396171 -5.97080110471 11.0192203043 0.427111700047 -0.59631987619 -3.53337759575 7.01652566358 -0.423537683258 0.61930058004 -4.39970110134 9.50078786315 0.598827046845 -0.226700431408 0.0291801598279 8.15173735053 0.313585855121 -0.340402042416 3.26716144869 3.83344527296 -0.101357610123 -0.0906792573689 7 6 6 3 2 3 5 3 4 2 4 4 2 4 4 11 3 10 1 5 11 4 10 4 10 4 11 4 11 4 11 6 3 0 182.0 1.07692307692 77.0 0.714285714286 0.198587127159 0.175824175824 0.0820918002418 0.0687460106612 0.037297082823 0.0261885797069 0.0076572573432 0.00205344445254 0.00632581823995 0.714285714286 0.230769230769 0.0 1.0 6.0 2.0 2.0 1.0 0.0 0.0 5.0 14.0 0.135135135135 1.0 3.0 1.0 0.423076923077 0.0625 0.4375 0.625 0.1875 0.5625 0.875 0.6875 0.75 0.5 0.625 0.0 0.4375 0.8125 0.75 0.0 0.125 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.5 1.0 1.0 1.0 1.0 0.5 0.25 0.5 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 -7.32112738223 6.72998045074 -14.1305070635 15.4405845911 5.28714576986 -0.583722794197 3.82474884101 17.705507196 1.2348949173 2.36012756183 14.1379723537 23.7199025693 -0.884817902862 -1.88554198696 9.53882865419 12.6740583011 0.130620578745 -1.37642217076 7.6239205991 -0.200793457306 -0.351150029528 0.753485897413 6.26426813624 4.94977501401 0.167362143303 0.184988642744 7 2 7 6 5 2 3 4 2 2 5 3 2 10 1 10 2 2 9 3 10 4 8 4 8 4 9 4 4 2 2 10 4 6 2 0 168.0 0.857142857143 78.0 0.769230769231 0.212797619048 0.224489795918 0.0721201054827 0.113540654357 0.0496639131843 0.0213437861105 0.0125979770082 0.00663421081813 0.0389203761844 1.16666666667 0.214285714286 0.0 5.0 6.0 3.0 1.0 1.0 0.0 1.0 1.0 11.0 0.15625 0.0 3.0 1.0 0.464285714286 0.0833333333333 0.5 0.75 0.5 0.416666666667 0.75 0.666666666667 1.0 0.333333333333 0.5 0.166666666667 0.583333333333 0.5 0.5 0.0 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.75 0.25 0.75 0.75 0.75 1.0 0.5 0.0 0.5 0.5 0.75 0.25 0.5 1.0 0.5 0.0 0.25 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 -7.68491010929 3.31951738449 -16.3843417439 8.77700614172 3.24666803736 1.94280392631 -5.35091853939 21.4225266757 1.23590105835 4.9331024882 4.06693583046 45.0922059907 -0.481584427321 -0.194168989988 2.58330415211 44.8005652321 0.17804370483 -2.32586844339 2.30017389006 26.5852346224 -0.219392646798 0.476089733541 0.870085184172 25.5914296194 -0.00554148575208 0.0440321265644 10 1 1 3 1 1 14 3 1 4 11 4 4 4 7 5 6 4 5 3 9 4 5 3 9 3 5 4 10 2 4 4 11 2 4 4 16 5 16 5 15 5 16 5 15 5 16 6 15 6 10 2 3 6 9 3 4 5 8 4 4 6 6 5 5 5 4 7 6 14 8 9 1 2 15 1 10 0 483.0 0.913043478261 164.0 0.737804878049 0.139899438036 0.175803402647 0.0589317826643 0.0987534215352 0.0411476938382 0.0257211841313 0.0155980966051 0.0100210845719 0.052017791289 0.619047619048 0.652173913043 0.0 5.0 5.0 3.0 6.0 3.0 1.0 4.0 3.0 10.0 0.52 2.0 2.0 1.0 0.339544513458 0.0555555555556 0.472222222222 0.861111111111 0.805555555556 0.444444444444 0.388888888889 0.166666666667 0.361111111111 0.333333333333 0.0 0.0 0.472222222222 0.527777777778 0.194444444444 0.0555555555556 0.444444444444 0.0 0.0 0.0 0.0 0.222222222222 0.555555555556 0.888888888889 1.0 0.0 0.0 0.111111111111 0.555555555556 0.888888888889 1.0 1.0 1.0 0.0 0.333333333333 0.777777777778 1.0 1.0 0.777777777778 0.555555555556 0.666666666667 0.111111111111 0.666666666667 0.666666666667 0.444444444444 0.333333333333 0.111111111111 0.0 0.0 0.555555555556 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.333333333333 -24.1361931089 -6.86442189335 -57.3352860888 -12.418044397 1.88699395666 6.66140679376 -47.9565082464 13.3678045923 6.10762933215 3.70614898933 -13.3938212448 33.1168352777 -1.06502541143 -3.06375840637 -14.8979368248 14.613100865 -1.97954729904 -1.59978240541 -31.7512069782 -1.68456891761 0.177029402779 0.858981846252 -33.3419553979 3.26703827494 0.0686078920213 0.0110698604726 1 4 10 5 12 3 12 3 12 4 11 3 13 2 12 3 3 2 7 3 4 3 5 3 5 3 4 3 5 3 4 3 6 2 4 3 6 2 4 2 6 3 4 2 6 3 4 2 6 3 4 2 6 3 3 3 7 2 3 3 6 4 1 6 3 12 9 0 315.0 0.714285714286 107.0 0.869158878505 0.129735449735 0.185034013605 0.0420668434334 0.133170931865 0.0541502357557 0.0165779151947 0.0213816032597 0.0176700010099 0.10546413622 0.4 0.619047619048 3.0 2.0 0.0 0.0 0.0 3.0 5.0 5.0 1.0 4.0 0.216216216216 2.0 0.0 2.0 0.339682539683 0.625 0.458333333333 0.5 0.75 0.541666666667 0.5 0.375 0.416666666667 0.0 0.125 0.0 0.0416666666667 0.0 0.416666666667 0.666666666667 0.625 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.5 0.5 0.5 0.166666666667 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 -9.03393772217 -6.4874586327 -22.5258157798 -16.2053098637 -0.113011867592 -0.45782179937 -17.7320143223 -15.6078897502 4.57889543766 2.66249347097 -3.73140052629 -2.63632829357 -5.22985590514 -0.173049230187 -21.7415432096 1.84595866396 3.30920189332 0.694610432722 -4.80774143175 5.31692864836 1.17392390954 -0.316438303723 7.03276534487 2.73016950001 -0.788382201898 -0.128968516803 2 7 4 7 3 5 1 3 2 4 2 2 2 5 7 7 4 8 4 8 6 5 6 8 2 7 1 9 2 9 3 6 3 0 154.0 0.785714285714 100.0 0.49 0.294569067296 0.310296846011 0.0645180633163 0.136058346275 0.0546157123362 0.0071965210059 0.00331221322647 0.00140649846747 0.012355106353 0.909090909091 0.214285714286 2.0 2.0 2.0 2.0 1.0 1.0 0.0 1.0 3.0 10.0 0.21875 1.0 3.0 1.0 0.649350649351 0.5 0.75 0.25 0.5 1.0 1.0 0.5 0.583333333333 0.75 0.666666666667 0.833333333333 0.916666666667 0.833333333333 0.583333333333 1.0 1.0 0.0 0.25 0.5 0.75 0.75 0.5 0.25 0.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.25 0.75 1.0 1.0 -7.45754590488 0.909456817668 -19.6583128695 5.27936504404 -2.28199419862 4.82661725377 -26.5497839963 23.3178540689 1.57576366962 1.30237738967 -20.0738653952 30.4348213424 -0.534998680363 -1.53808106609 -20.2462343851 21.6761359433 -0.177875359538 0.108174800808 -22.7730545181 18.1152919223 -0.161952962781 -0.503697921275 -24.9524122165 11.7295131092 -0.0495062091079 -0.269930384949 7 2 8 8 4 9 3 3 4 4 1 4 9 3 9 3 10 3 10 3 10 3 10 5 9 4 5 1 4 5 2 3 4 8 6 4 5 0 195.0 0.866666666667 75.0 0.853333333333 0.146351084813 0.180854700855 0.0525219912676 0.102404153812 0.0367269846086 0.0194032993029 0.0146426267335 0.00706268883199 0.0573615575122 0.692307692308 0.2 0.0 3.0 3.0 3.0 0.0 1.0 0.0 2.0 1.0 8.0 0.344827586207 1.0 2.0 1.0 0.384615384615 0.1875 0.6875 0.75 0.75 0.5625 0.3125 0.0 0.5 0.6875 0.0625 0.0 0.125 0.625 0.25 0.0 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -13.4963391742 2.88600963473 -33.1010481751 11.6557235039 -0.617945592378 7.32933270374 -34.4069309186 39.060948757 2.6767330668 1.76265815466 -18.5890727472 48.0226226477 0.324147883364 -2.88519043928 -12.5846663284 28.5019282256 -0.108178147722 -1.07766314463 -11.6251561535 14.3265878517 0.6989633356 -0.280322039362 -3.92234790945 5.8938230951 0.234732558972 -0.552495750661 1 4 1 5 2 4 4 1 26 5 1 5 2 4 3 3 3 3 3 2 3 4 2 4 2 4 2 4 2 4 1 12 126.0 0.285714285714 68.0 0.617647058824 0.219576719577 0.298563869992 0.0189784320548 0.444748387303 0.0582770439157 0.00185746711947 0.0148267356896 0.00342205966558 0.84294198537 1.33333333333 204522252.0 2.0 2.0 1.0 2.0 4294967295.0 4294967293.0 0.0 0.0 4.0 0.0 0.217391304348 1.0 4.0 1.0 0.539682539683 0.333333333333 0.416666666667 0.25 0.666666666667 0.5 0.5 0.75 1.0 0.583333333333 0.5 1.0 1.0 0.583333333333 0.5 0.916666666667 1.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -3.91066431597 -5.82052363308 -6.51793126396 -10.0818326423 3.39963619938 6.19338030572 -0.635710778138 12.7064484206 -3.30694671515 2.40274936284 -6.7677371702 27.7220321596 2.78075245248 -1.23927052973 0.296169115503 24.405786977 -1.53507363232 0.989896347089 -1.52556386124 24.3206916993 0.795937085454 -1.71001054359 -1.65396785955 11.035099672 -0.131662811716 -0.150991386567 3 1 6 4 4 4 5 2 45 4 4 4 4 4 5 3 5 3 5 3 5 3 4 4 4 4 4 4 3 6 1 8 1 7 176.0 0.363636363636 68.0 0.735294117647 0.175426136364 0.238894628099 0.0222868657847 0.339472311408 0.0675957706259 0.00338235533892 0.0313293888662 0.00840216433343 0.506266173433 0.625 195225785.955 0.0 3.0 2.0 0.0 4294967295.0 4294967292.0 0.0 0.0 4.0 1.0 0.047619047619 2.0 7.0 1.0 0.386363636364 0.0 0.0 0.0 0.25 0.166666666667 0.166666666667 0.166666666667 0.583333333333 0.5 0.333333333333 0.666666666667 0.916666666667 0.583333333333 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.32778517374 -8.94161407553 -5.96359576451 -16.5427023349 2.32251424468 7.54007005751 -2.38568757343 9.38501791291 -2.29651794579 2.01598007117 -5.13233613232 26.8431044479 2.49358544715 0.0994622950791 0.744704700921 29.5539913901 -1.92712581746 0.530935458185 -2.61509296639 28.9491401827 1.52566698858 -1.69365084054 0.356224061214 14.2546762223 -0.36562957699 -0.156392156803 3 2 8 5 6 10 2 5 2 3 2 3 5 2 9 3 8 4 5 7 4 8 3 4 2 3 2 5 2 4 1 11 1 6 1 5 2 3 3 1 1 2 168.0 0.857142857143 96.0 0.572916666667 0.244047619048 0.299744897959 0.07097303207 0.131395899133 0.061414297862 0.0146389894198 0.00594108192092 0.00843840866435 0.0313178912069 0.833333333333 0.5 3.0 4.0 3.0 0.0 0.0 2.0 1.0 2.0 2.0 10.0 0.222222222222 0.0 3.0 2.0 0.571428571429 0.666666666667 0.5 0.25 0.916666666667 0.916666666667 0.333333333333 0.666666666667 1.0 0.583333333333 0.166666666667 0.666666666667 0.583333333333 0.416666666667 0.666666666667 0.916666666667 0.75 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 0.75 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.25 0.75 0.5 0.0 0.0 0.25 0.75 1.0 0.0 0.5 0.75 0.25 0.25 0.75 1.0 1.0 0.0 0.5 1.0 0.75 0.75 1.0 1.0 1.0 -5.36579522424 -2.27364204417 -14.7535799602 -3.37862474576 -2.40634849818 3.18588291332 -21.4596984297 7.40632640252 1.7151840437 0.108653764327 -15.458511526 8.04234089119 -0.765369978288 -1.56846060746 -16.1718606445 1.64895611821 0.166594195789 1.91678356914 -16.984093782 14.0443332477 -0.33974167376 0.627649461595 -22.0215067506 23.4723064448 -0.326964664332 -0.0905435349952 6 5 8 8 6 11 3 3 5 4 3 3 5 5 1 3 7 4 1 3 7 8 7 4 1 3 7 3 2 3 7 4 1 4 6 3 3 3 5 4 4 9 7 7 4 0 210.0 1.07142857143 104.0 0.615384615385 0.251111111111 0.228911564626 0.111146636432 0.088031638052 0.0555109599395 0.0324201945017 0.00870855234907 0.00905444302258 -0.00969559167273 0.533333333333 0.642857142857 0.0 2.0 3.0 0.0 0.0 3.0 3.0 2.0 2.0 7.0 0.388888888889 0.0 2.0 2.0 0.495238095238 0.1875 0.625 0.8125 0.5625 0.625 0.375 0.25 0.5625 0.75 0.0 0.0 0.25 0.75 0.625 0.5 0.625 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -2.46159645315 5.9417845421 -11.9209350546 18.1225433615 -8.8583519259 5.94404807907 -41.8212322482 40.7710524723 0.324130110407 1.35220345105 -43.9236163294 47.6303018749 1.47335633307 -1.67502913075 -35.6827901314 37.1754281129 -2.05218200213 0.324555989802 -47.2932328018 40.2544721851 0.105116513518 2.27320526106 -49.8610567725 64.2840396255 0.0608642116178 0.479096894497 2 2 10 5 9 5 10 4 10 3 11 3 11 3 11 4 11 3 10 4 2 2 7 10 3 12 3 3 1 2 2 4 1 3 7 3 2 2 7 3 2 2 7 3 1 3 7 3 2 2 7 3 1 4 6 2 3 3 6 2 2 5 4 2 3 11 4 7 5 0 322.0 0.608695652174 132.0 0.704545454545 0.159050576752 0.222792330543 0.0420937686679 0.167306730604 0.0612334755316 0.0146306114432 0.0196463021235 0.0152305377316 0.147337616275 1.0 0.478260869565 6.0 3.0 3.0 1.0 0.0 1.0 5.0 4.0 2.0 10.0 0.16 0.0 2.0 2.0 0.409937888199 0.791666666667 0.666666666667 0.583333333333 0.625 0.375 0.5 0.583333333333 0.416666666667 0.0 0.25 0.416666666667 0.0 0.0 0.125 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.333333333333 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.833333333333 1.0 1.0 0.666666666667 0.5 0.333333333333 0.333333333333 0.0 0.333333333333 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 -12.2618503982 -9.13410977745 -28.4068965544 -22.6607751 1.82844398335 0.503875105441 -22.395373655 -12.8458800429 1.38706922445 7.06291303965 -14.4735743627 14.0120777182 -1.81593890758 -4.09673147278 -21.3194870191 7.38995655233 1.1937052003 2.73775513928 -14.3209344437 7.36658801269 0.230651747282 -3.29641994067 -13.7212597362 -5.92416398794 -0.398248908133 0.530522828016 1 4 1 6 2 13 2 5 4 3 2 4 5 4 2 3 6 3 2 2 7 3 2 2 7 2 3 2 6 3 3 2 7 2 3 3 6 2 3 3 5 4 1 5 3 5 1 5 3 5 182.0 1.07692307692 95.0 0.589473684211 0.255102040816 0.227387996619 0.115764141667 0.0950262151808 0.057709558887 0.0367905501352 0.0125321196204 0.012624582621 -0.00681367838939 0.5 0.923076923077 1.0 2.0 1.0 2.0 2.0 3.0 3.0 3.0 4.0 9.0 0.0833333333333 0.0 1.0 2.0 0.521978021978 0.8125 0.5625 0.5 0.625 0.75 0.375 0.3125 0.625 0.5 0.0 0.0 0.125 0.8125 0.5625 0.5625 0.8125 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.227364204417 2.91026181654 -1.17113108331 9.26439485336 -2.28315422007 3.48934452493 -6.78264155481 22.2726180724 1.92832733208 0.573476727176 2.2935368199 24.8727205365 1.12116855334 -1.37748860953 9.40053337745 15.6843816285 -1.5037074825 -0.0854974805844 -1.31819355585 14.463791154 -0.443109738151 1.13229177882 -7.44188386641 26.4656986857 0.159691076546 0.289128865081 7 2 9 6 5 2 5 2 4 2 5 3 2 3 4 4 1 4 4 3 2 3 9 4 10 3 10 3 11 3 10 4 5 2 3 5 2 3 4 7 2 0 182.0 0.928571428571 68.0 0.970588235294 0.167371090448 0.1852433281 0.0701718882494 0.0975097237022 0.0485451934854 0.0284222421573 0.0172118845883 0.0119921720167 0.0421603761827 0.769230769231 0.428571428571 0.0 2.0 3.0 4.0 1.0 3.0 0.0 2.0 1.0 7.0 0.266666666667 0.0 2.0 1.0 0.373626373626 0.125 0.5625 0.8125 0.5 0.375 0.4375 0.25 0.625 0.375 0.125 0.0 0.125 0.4375 0.625 0.0 0.3125 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -7.00281749604 1.45513090827 -15.4130777715 5.2085983645 2.55622326966 3.01141568707 -4.46560196466 19.2910566658 3.06438368697 3.47390913746 12.7457187379 38.5752189256 -0.507499323449 0.577343859911 12.5692383261 42.0451782701 -0.266931134488 -1.92456243543 9.90637886115 23.9650924702 0.318803477882 -1.68865745619 9.48688137655 2.19299208343 -0.33728318621 -0.31615699714 7 5 8 5 6 8 4 3 2 3 4 3 9 3 10 3 10 3 10 3 9 7 5 9 5 8 6 3 10 3 10 3 10 3 10 3 10 3 10 3 10 4 8 7 5 8 9 1 8 0 299.0 0.565217391304 104.0 0.740384615385 0.125546694109 0.158644757889 0.025721544195 0.136241508376 0.0254177384756 0.0072817915477 0.00951526253009 0.000477860013911 0.125220719536 0.692307692308 0.0434782608696 2.0 2.0 5.0 0.0 1.0 0.0 0.0 0.0 1.0 12.0 0.179487179487 2.0 4.0 1.0 0.347826086957 0.125 0.625 0.625 0.541666666667 0.416666666667 0.666666666667 0.666666666667 0.625 0.5 0.208333333333 0.25 0.0833333333333 0.541666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.833333333333 0.833333333333 0.5 0.5 0.333333333333 0.833333333333 0.166666666667 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.5 0.666666666667 0.0 0.0 -14.0609932332 4.76080873249 -23.4352829625 11.30106981 14.0247853855 0.83843143194 13.4289866929 20.8256361436 -6.06534760885 3.99206544905 2.01471392917 31.0905222287 1.01111239152 -3.88238265557 -2.35755479046 18.3994343276 0.771030824982 1.7471537175 4.17220279728 14.5673188959 -1.43944625936 -2.20437434134 -5.40065286652 9.14527469966 0.218261107926 0.609836186094 1 5 1 1 1 8 5 4 3 2 5 1 3 4 4 2 1 5 4 8 4 8 3 6 6 4 8 3 9 3 10 2 10 2 11 3 3 3 2 1 0 168.0 0.857142857143 93.0 0.634408602151 0.274305555556 0.295068027211 0.0785398360733 0.13092116807 0.0631584230915 0.0120746630366 0.00482074850472 0.0029276440831 0.0100386278452 0.583333333333 0.357142857143 2.0 3.0 1.0 1.0 2.0 2.0 0.0 0.0 3.0 8.0 0.241379310345 0.0 2.0 1.0 0.553571428571 0.416666666667 0.333333333333 0.25 0.666666666667 0.333333333333 0.0833333333333 0.583333333333 1.0 0.416666666667 0.0 0.75 1.0 0.75 0.666666666667 0.916666666667 1.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.5 0.25 0.5 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.09175068064 -2.4555334077 -6.42802894327 -1.92995865164 -1.87181061351 5.8270197532 -11.7269265439 17.3124717564 1.0531479646 0.319143207716 -8.02947645913 24.3790251139 -0.0249746192649 0.145380111108 -5.2448815738 23.6528660697 0.421551325995 -0.0341477268365 -1.95158862335 22.9183896042 0.162515049742 -0.332397440945 -0.703646905595 17.9015668738 -0.13303825025 -0.20383062894 4 3 11 6 11 6 13 4 13 3 14 3 14 3 14 3 14 3 14 4 1 5 7 6 1 4 6 4 5 2 6 3 5 3 6 3 6 3 5 3 6 4 4 3 6 3 5 3 6 3 5 3 6 3 5 3 6 3 5 4 4 5 2 7 2 15 2 7 2 2 1 2 4 2 4 0 391.0 0.739130434783 146.0 0.719178082192 0.158567774936 0.212276214834 0.0492329498675 0.143592652032 0.0657308625663 0.0171392178353 0.0237875355088 0.0185210269069 0.101266173571 0.529411764706 0.652173913043 2.0 3.0 3.0 1.0 0.0 1.0 5.0 5.0 2.0 9.0 0.211538461538 0.0 1.0 2.0 0.373401534527 0.5 0.4 0.4 0.466666666667 0.533333333333 0.566666666667 0.533333333333 0.5 0.0 0.3 0.333333333333 0.3 0.0 0.1 0.533333333333 0.7 0.444444444444 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.333333333333 0.222222222222 0.0 0.0 0.555555555556 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.888888888889 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.444444444444 -9.2448262596 -13.2859778581 -20.4708893284 -32.0511084566 3.01613463946 1.08372390279 -9.53304090727 -22.4291657764 1.18493650247 6.12877157855 -6.54587555797 2.886974957 -3.94221723171 -3.78630039173 -22.5858364487 -5.63645212794 2.8651497407 2.16498535378 -10.6321142141 -2.82679564212 -0.698050198942 -1.60083354516 -10.6420373423 -9.61378785644 -0.184961294426 0.0289558421947 2 1 5 1 2 2 3 8 1 5 1 5 1 3 1 4 7 2 8 3 7 2 8 2 8 2 8 3 6 4 5 6 6 2 6 0 140.0 0.714285714286 55.0 0.836363636364 0.143571428571 0.159183673469 0.0393072157434 0.102790087464 0.0238804664723 0.013644793242 0.00545476671239 -0.000276183456811 0.0705081834639 0.5 0.285714285714 2.0 0.0 1.0 0.0 3.0 1.0 0.0 0.0 4.0 7.0 0.16 0.0 1.0 1.0 0.392857142857 0.666666666667 0.5 0.333333333333 0.583333333333 0.583333333333 0.916666666667 0.75 0.916666666667 0.416666666667 0.333333333333 0.0833333333333 0.333333333333 0.75 0.166666666667 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 0.75 0.75 0.75 0.5 0.0 0.25 0.75 0.75 0.25 0.25 0.25 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -7.32112738223 5.41126806512 -13.7739799638 13.9633542765 5.42008422815 1.32567251433 1.86572252809 18.4451237286 -1.06391485758 -0.8265697339 2.6839309348 13.6219221254 -0.0243303507913 -0.29100676905 3.24879589341 11.827028461 1.70928709429 0.901777492226 14.558447725 17.9525962455 -0.645505084348 0.0657600349108 12.5780666994 19.8105243263 -0.000834295682429 -0.0716640146517 9 2 4 3 1 5 1 4 3 9 3 15 1 9 3 4 8 3 9 4 8 4 6 1 1 4 5 3 1 5 2 3 3 9 4 5 4 0 168.0 0.857142857143 92.0 0.619565217391 0.22371031746 0.25212585034 0.0743438124258 0.113019103971 0.0407127756857 0.0214696916688 0.00790739496512 0.00337748153974 0.0327640414536 0.916666666667 0.428571428571 0.0 4.0 4.0 3.0 2.0 1.0 1.0 2.0 3.0 7.0 0.15625 1.0 3.0 1.0 0.547619047619 0.416666666667 1.0 1.0 0.75 0.666666666667 0.916666666667 0.583333333333 0.833333333333 0.333333333333 0.583333333333 0.0 0.416666666667 0.333333333333 0.583333333333 0.0 0.333333333333 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.25 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.25 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -12.1412485159 3.04668033919 -30.3428035149 8.39868438008 -1.60222162827 2.27410605275 -36.7066677292 21.361470859 0.814789597695 4.10703464113 -31.6331548212 40.0251470448 -0.296196765898 -1.04043203266 -30.8449206148 35.4269056429 0.1397069802 -1.23033011866 -29.5620073371 26.115536036 0.0809371776213 1.33275892108 -29.1063664763 34.0236015674 -0.117901995681 -0.0764979559248 6 6 5 7 3 4 1 3 4 2 10 2 9 3 9 3 10 2 9 3 1 2 4 8 5 7 6 3 9 3 9 3 9 3 10 2 9 3 9 3 9 3 8 5 6 7 5 0 252.0 0.571428571429 87.0 0.724137931034 0.124007936508 0.157218442933 0.0252104479358 0.139189332406 0.0241229648826 0.00717137723282 0.00922878923412 -0.000138248262158 0.130984301816 0.75 0.0952380952381 4.0 2.0 3.0 0.0 1.0 1.0 0.0 0.0 2.0 8.0 0.235294117647 1.0 7.0 1.0 0.345238095238 0.0555555555556 0.444444444444 0.333333333333 0.444444444444 0.5 0.944444444444 0.944444444444 0.944444444444 0.5 0.611111111111 0.444444444444 0.5 0.444444444444 0.333333333333 0.111111111111 0.0555555555556 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.833333333333 0.666666666667 0.5 0.333333333333 0.166666666667 0.5 0.833333333333 0.833333333333 1.0 1.0 1.0 0.833333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.833333333333 0.333333333333 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.833333333333 0.166666666667 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.833333333333 0.166666666667 0.0 0.166666666667 0.5 0.166666666667 0.0 0.0 -12.0351452205 3.45593590714 -20.8069270816 7.96969107197 10.7990263622 0.372444220569 6.22135493126 14.962171782 -5.39348344667 3.75797427852 -3.45114119697 27.3879433807 2.05191159316 -1.98322334416 -0.481953607005 24.6152958977 0.554063741534 1.25545935865 7.51079966079 20.3878354154 -0.8645487643 -2.71377396092 2.24646681879 5.35931113405 0.273983208391 0.314723005394 1 2 2 4 22 1 9 1 5 6 2 8 2 7 4 6 4 6 4 7 3 6 5 4 7 3 7 3 6 4 0 150.0 0.666666666667 82.0 0.463414634146 0.195333333333 0.239555555556 0.0414521481481 0.153075259259 0.0249845925926 0.0101375834859 0.00287444794826 -0.00316115671073 0.109944581735 0.6 0.0666666666667 3.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 3.0 5.0 0.125 0.0 5.0 1.0 0.546666666667 0.75 0.5 0.583333333333 0.666666666667 0.916666666667 0.833333333333 0.916666666667 1.0 0.75 0.416666666667 0.25 0.583333333333 0.833333333333 0.25 0.0 0.0833333333333 0.5 1.0 0.75 0.5 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.5 1.0 1.0 1.0 0.5 0.0 0.25 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -11.6289211752 4.83831026999 -23.4157638181 14.264049081 6.03345778932 3.72917715547 -9.22153620455 26.3814075616 -3.34712564908 -0.9643925006 -17.4778677552 23.5724908439 -0.588680686197 0.0182684013992 -27.2048930523 21.9543848624 -0.185829709927 0.45453137003 -29.2376684036 23.5669352175 -0.929474994727 -0.70268663013 -41.4697161653 17.6265342086 -0.471518215303 -0.0925369340646 6 3 7 8 4 5 1 4 2 4 3 5 1 4 1 19 1 3 10 3 10 3 10 4 10 4 9 4 6 2 2 4 4 2 5 6 3 0 182.0 0.928571428571 87.0 0.689655172414 0.195266272189 0.200941915228 0.0719487612979 0.0886260219674 0.0355424372753 0.0236171992279 0.00775782923213 0.00572923488656 0.0254995336233 1.0 0.357142857143 0.0 4.0 5.0 3.0 1.0 2.0 0.0 2.0 3.0 13.0 0.263157894737 0.0 3.0 1.0 0.478021978022 0.375 0.8125 0.8125 0.75 0.6875 0.5625 0.0625 0.5 0.75 0.625 0.0 0.0 0.5625 0.6875 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.75 1.0 0.5 0.25 0.75 0.5 0.0 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -8.82173113138 7.82132863194 -22.1165754697 18.1251641906 -1.17254968278 -0.430599962651 -26.0357104256 22.0385278335 1.26370842971 3.67885888657 -19.0653583679 38.1356837747 -0.207298961651 0.625169379869 -19.0852523809 41.7885448764 -0.710998544489 -2.3735269674 -24.8255786565 22.5135104132 -0.169768249314 -0.785291297658 -28.0770665074 6.82161233451 -0.0918061054619 -0.402718061579 4 5 7 8 4 2 4 5 1 3 5 4 1 3 5 7 10 2 11 3 10 3 10 3 10 4 7 1 2 4 4 3 3 9 6 6 7 3 1 1 4 0 195.0 0.866666666667 79.0 0.79746835443 0.165285996055 0.184273504274 0.0630292486387 0.102331327231 0.0399695207269 0.0232943409475 0.0143425535333 0.00802149313162 0.0492561356446 0.769230769231 0.4 1.0 3.0 3.0 3.0 1.0 2.0 0.0 1.0 3.0 8.0 0.193548387097 1.0 2.0 1.0 0.405128205128 0.375 0.6875 0.6875 0.75 0.5625 0.125 0.0 0.4375 0.625 0.125 0.0 0.3125 0.625 0.5 0.0 0.375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 0.75 0.75 1.0 0.25 0.75 1.0 1.0 0.75 0.25 0.25 0.5 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -9.50685526736 1.01859163579 -24.6644995476 7.70933331539 -2.46272822164 8.15778723418 -32.5719685032 37.8034664302 1.81337814969 1.92742687902 -22.1381202319 48.3053655507 0.977183850473 -3.03135613137 -13.4118438563 28.8765880508 -0.357268220384 -0.621327872079 -13.4722677369 17.4753031651 0.51332588185 -0.467043349799 -6.96924557144 7.16622381174 0.376085694134 -0.690895806834 1 2 4 2 4 3 2 6 2 3 5 4 1 4 5 3 1 3 6 7 6 7 6 6 8 5 7 3 1 2 7 3 1 2 7 3 1 3 7 3 1 3 4 5 169.0 1.0 82.0 0.621951219512 0.226217569413 0.218934911243 0.112930509577 0.0916634571619 0.057472131174 0.0397491810951 0.0124247239182 0.018641782893 0.00845949873206 0.384615384615 1.0 1.0 0.0 1.0 2.0 3.0 3.0 3.0 3.0 5.0 5.0 0.142857142857 2.0 1.0 2.0 0.485207100592 0.75 0.8125 0.5625 0.625 0.1875 0.0625 0.0 0.0625 0.5625 0.25 0.1875 0.25 0.5 0.9375 0.8125 0.8125 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 5.77854870303 4.01560164109 8.8829973423 10.6002872637 -7.58612000027 1.3642266219 -17.2461919789 15.3915197002 -1.45238803473 -0.502820794373 -29.765471345 11.6888132812 1.07527176427 -1.07315823813 -22.8736518423 2.11489256032 0.263235533165 -1.09559231453 -15.7574618234 -9.71737119604 1.2077855323 -0.901825988619 -3.84505326879 -20.6001393466 0.136045660304 -0.125571224921 5 5 4 1 1 6 1 3 4 3 1 3 4 3 1 24 8 3 8 3 8 4 7 4 6 1 1 4 2 4 1 10 2 1 1 5 2 0 154.0 0.785714285714 87.0 0.551724137931 0.24852420307 0.262987012987 0.0759860185354 0.131784832641 0.0419528818289 0.0191338213733 0.00794879711591 0.00301943940032 0.0418328722373 1.0 0.428571428571 0.0 1.0 4.0 2.0 2.0 1.0 0.0 2.0 3.0 12.0 0.117647058824 2.0 2.0 1.0 0.564935064935 0.333333333333 0.833333333333 1.0 0.833333333333 0.416666666667 0.75 0.416666666667 0.833333333333 0.333333333333 0.5 0.0 0.333333333333 0.666666666667 0.583333333333 0.0 0.416666666667 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.5 0.25 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -9.54929658551 2.09175068064 -22.9077709944 5.29626116452 0.271445019559 1.09088417262 -21.8358599416 14.2248906672 1.54806046346 4.18111029665 -11.7568185878 32.4724558209 0.348528529535 -1.28257205259 -5.38885919494 24.3147171804 1.01781547863 -2.77890170471 3.49573836676 0.820070271887 0.347014418205 0.125399612063 7.16668530681 -5.82401614366 -0.159790420412 -0.22886053056 1 5 10 7 9 6 12 4 12 4 13 3 13 3 13 3 13 3 13 3 3 2 8 5 1 5 4 4 5 3 4 4 5 3 4 4 5 4 3 3 6 4 3 3 6 4 3 3 6 4 3 3 6 4 3 2 7 3 4 3 6 4 2 5 5 5 11 1 4 0 352.0 0.727272727273 126.0 0.761904761905 0.147194602273 0.182463842975 0.0481873934292 0.12060086016 0.0608715169149 0.0185088471814 0.0242709174229 0.0199642802362 0.0794806162266 0.3125 0.545454545455 2.0 3.0 4294967295.0 1.0 0.0 1.0 5.0 5.0 3.0 6.0 0.139534883721 3.0 1.0 2.0 0.357954545455 0.666666666667 0.25 0.458333333333 0.541666666667 0.791666666667 0.791666666667 0.708333333333 0.5 0.0416666666667 0.166666666667 0.125 0.0 0.0 0.25 0.583333333333 0.5 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.333333333333 0.5 0.5 1.0 1.0 0.666666666667 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.5 0.5 0.666666666667 0.666666666667 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -8.59436692696 -6.04788783749 -19.9886888833 -12.6663922774 1.57803740344 3.49602785212 -12.6631068009 2.87747439759 2.13498236391 3.73231292265 -6.27100531241 21.1767407537 -3.76642578902 -1.32393521099 -20.3387397976 23.042936486 2.48771695027 2.31373838469 -10.8125491625 31.5039990859 -0.571849857037 -1.49611638082 -11.364116411 27.0258498564 -0.322386378455 0.216189458227 8 3 7 1 6 1 1 1 3 5 3 1 1 3 5 16 1 4 3 5 4 5 4 3 4 4 4 4 6 3 3 4 5 3 6 3 3 4 5 3 6 3 3 4 5 3 6 2 4 3 6 3 6 3 3 3 6 3 6 3 4 2 5 4 6 3 2 4 5 4 5 4 1 7 2 6 4 5 1 5 4 1 2 1 10 0 336.0 1.71428571429 152.0 0.802631578947 0.205233134921 0.210246598639 0.151193486757 0.0527558602186 0.0513710522031 0.0718807046919 0.0078051586646 0.0167966840866 -0.0191708169825 0.375 2.0 3.0 3.0 1.0 2.0 6.0 6.0 6.0 6.0 1.0 12.0 0.228070175439 0.0 2.0 3.0 0.452380952381 0.5 0.708333333333 0.583333333333 0.625 0.625 0.25 0.0833333333333 0.25 0.625 0.625 0.5 0.666666666667 0.5 0.208333333333 0.166666666667 0.25 0.166666666667 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.5 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.0 0.5 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 -8.67394439851 8.09037627384 -21.9139548231 15.9337340198 -2.44452045405 -5.52372650582 -36.3648332971 -3.47218600088 -3.11730814119 -1.47326480076 -42.0835209804 -11.3220893633 4.96687161348 3.38090714208 -16.4814029911 7.43488428161 0.0137615074055 -0.48237742814 -3.89588618804 7.89416412361 0.121862157023 -0.984643856002 -10.2455299424 -2.13046724392 -0.479012602497 0.0492448030811 5 2 1 1 7 9 3 4 2 5 1 4 4 4 1 5 2 5 1 6 2 2 3 3 9 3 11 2 10 3 11 4 6 2 1 5 2 1 1 3 2 10 5 6 8 4 4 0 195.0 0.866666666667 93.0 0.763440860215 0.211834319527 0.214017094017 0.0731672482678 0.105729901044 0.0470241238052 0.0222366516719 0.0125460653689 0.00686798927245 0.0321503743006 1.07692307692 0.533333333333 1.0 4.0 5.0 3.0 2.0 3.0 0.0 2.0 3.0 12.0 0.147058823529 1.0 4.0 1.0 0.476923076923 0.375 0.75 0.6875 0.6875 0.6875 0.625 0.0625 0.5625 0.5625 0.3125 0.0 0.3125 0.6875 0.625 0.0 0.5 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.25 0.25 0.0 0.0 0.75 0.75 0.25 0.25 0.25 0.0 0.0 0.0 -8.99755944946 4.15924917947 -21.6218583756 14.1496693454 0.285205658021 6.52577707995 -19.8134070975 39.3717118569 2.13726513946 2.1124249171 -6.65852011447 49.8475750998 0.532982139409 -2.46211343382 -0.17187138992 31.7448533031 0.0789744174746 -2.05606095289 1.11357540071 9.8395175641 0.076974903884 -0.710047492879 2.3462378992 -2.51320269961 0.0750118985033 -0.297835239362 1 3 2 5 1 5 2 4 2 4 3 3 3 3 2 4 3 3 2 4 3 2 3 4 2 3 4 3 3 2 4 2 4 2 4 3 3 3 1 13 2 2 1 0 132.0 0.272727272727 77.0 0.649350649351 0.243686868687 0.273760330579 0.0181824268859 0.398125104349 0.051056797312 0.00122265165676 0.0118131239736 0.0019828529352 0.726294824947 1.33333333333 0.0454545454545 1.0 4.0 0.0 3.0 0.0 0.0 0.0 0.0 7.0 5.0 0.0344827586207 0.0 2.0 1.0 0.583333333333 0.583333333333 0.166666666667 0.166666666667 0.333333333333 0.916666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.916666666667 0.916666666667 0.666666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -3.96440494611 2.63329087661 -7.03439203621 6.76044876036 2.85319015561 1.21309308615 -2.53471592302 15.2137634733 -2.73849455605 3.28427848102 -5.56077874498 29.3289156217 3.02749805053 -0.924133898538 1.29383965563 25.6544534062 -2.47326484068 -1.05008318347 -3.68255030417 14.3841714696 1.8484973857 -0.346769877476 -0.247707779845 7.24055835514 -0.383391192863 -0.221276226353 2 5 9 7 10 6 11 5 11 5 12 4 12 4 12 3 13 3 3 1 9 10 6 10 6 4 3 4 5 3 6 2 5 3 6 3 4 2 7 3 4 2 7 3 3 3 7 3 3 4 6 3 3 4 6 3 3 4 5 5 1 6 4 5 1 6 3 6 352.0 0.727272727273 144.0 0.611111111111 0.174005681818 0.219008264463 0.0527956394393 0.145405827385 0.0674811290853 0.0181372673881 0.0235811646726 0.0192200839691 0.0984980941151 0.4375 0.545454545455 2.0 3.0 2.0 0.0 0.0 1.0 5.0 5.0 2.0 4.0 0.159090909091 0.0 1.0 2.0 0.409090909091 0.583333333333 0.25 0.25 0.5 1.0 0.916666666667 0.75 0.708333333333 0.25 0.458333333333 0.208333333333 0.0416666666667 0.0 0.375 0.458333333333 0.333333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 1.0 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.333333333333 0.0 0.5 0.5 0.5 0.166666666667 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -9.05736312505 -8.2471197784 -20.0733851181 -22.8481588536 2.69200242962 -3.09401514087 -11.4209067467 -26.1392181138 0.585418744392 6.09993478776 -7.95452976729 -5.64892055463 -2.02122296444 -3.40499987013 -16.5253386786 -7.84098436691 1.317989236 3.22334602285 -12.1760650233 -0.417245100176 -0.727453849411 -2.71757959332 -15.8240624712 -11.7524803232 -0.142914130068 0.163924446122 3 3 9 7 3 3 4 3 2 2 5 3 1 22 2 3 9 3 9 3 9 3 9 4 9 5 3 1 4 8 5 5 9 2 5 0 180.0 0.8 80.0 0.775 0.162037037037 0.191481481481 0.049365569273 0.0999401577503 0.0340346364883 0.0153041943101 0.00924301782837 0.00451577410019 0.0526204444887 1.0 0.2 0.0 6.0 5.0 1.0 1.0 1.0 0.0 1.0 5.0 12.0 0.157894736842 1.0 3.0 1.0 0.444444444444 0.333333333333 0.916666666667 1.0 0.75 0.583333333333 0.666666666667 0.333333333333 0.75 0.416666666667 0.5 0.0 0.416666666667 0.416666666667 0.583333333333 0.0 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 0.75 0.75 1.0 0.75 0.5 0.5 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -12.4777475384 6.96037617789 -29.4924224384 19.3053039108 1.11705549391 4.35278159027 -24.8134606433 38.9766233278 2.51994540612 3.47660834714 -10.4552351586 56.5477711869 -0.923076076481 -0.185416652696 -13.4019803673 56.6922045813 -0.525887665936 -0.565171066177 -18.5925663568 52.2704670816 0.11128414928 0.784353782714 -20.5635978665 56.5554390346 -0.305307027634 -0.0448971468446 3 1 6 2 6 3 3 16 1 3 6 2 6 2 6 2 5 3 5 3 5 3 5 4 4 5 1 1 2 6 4 3 1 0 128.0 0.5 59.0 0.728813559322 0.181640625 0.2275390625 0.0308666229248 0.197599411011 0.0528469085693 0.00667136669887 0.0204940578707 0.00693510060343 0.205635361603 0.625 0.0625 1.0 0.0 2.0 2.0 0.0 0.0 0.0 1.0 0.0 6.0 0.166666666667 0.0 3.0 1.0 0.4609375 0.25 0.625 0.125 0.5 0.5 0.875 0.625 1.0 0.875 1.0 1.0 1.0 0.75 0.75 0.5 0.625 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -6.20704278058 2.14859173174 -10.6629784715 6.38209050564 5.46473417882 1.75878646096 1.72489790618 12.3367630517 -3.60109429648 -0.227396121999 -5.60069759053 12.1601746764 1.82939080943 0.0786438985229 -2.15123796181 12.3356411279 -0.441097611549 0.312798049811 -1.39446080399 13.792817588 -0.476750004928 -0.296626009805 -6.96424051143 12.5576272469 0.0802659419729 0.104611828166 8 2 7 1 2 4 4 8 4 2 4 1 4 3 9 3 9 3 9 3 9 3 6 6 6 5 9 3 10 2 10 2 10 2 10 2 9 3 9 4 8 4 8 4 7 6 6 7 10 1 5 0 276.0 0.521739130435 84.0 0.869047619048 0.110809178744 0.144612476371 0.0210433256775 0.144831077687 0.0277164210113 0.00591335686318 0.0142175877247 0.00167854374542 0.148801783837 0.416666666667 0.0869565217391 2.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 2.0 5.0 0.28125 0.0 3.0 2.0 0.304347826087 0.0 0.333333333333 0.222222222222 0.333333333333 0.333333333333 0.777777777778 0.777777777778 0.944444444444 0.555555555556 0.611111111111 0.333333333333 0.611111111111 0.277777777778 0.0 0.0 0.0555555555556 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.166666666667 0.0 0.166666666667 0.5 0.5 0.833333333333 0.833333333333 0.5 0.666666666667 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.666666666667 0.5 0.5 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -10.5734240454 2.43576260732 -16.9283468774 7.10414698004 11.3233241504 2.40562428326 12.0574592096 19.4742147458 -5.35920912109 3.26410124564 2.88916116209 34.1809460285 2.08870926408 -1.25497309037 4.19138396535 26.7780741017 -0.261221901036 -1.7376895269 6.58713992673 9.88097092622 -0.72555550055 -0.301278444441 0.266491313126 3.2426919713 0.174947849657 -0.0350598392324 2 2 5 2 6 3 4 16 1 3 5 3 5 2 6 3 5 2 6 2 6 2 6 3 5 3 6 4 6 2 2 0 128.0 0.5 52.0 0.846153846154 0.1318359375 0.173828125 0.021644115448 0.150993347168 0.033052444458 0.0054206899209 0.0135479253297 0.00356286539962 0.156617193841 0.625 0.0 0.0 3.0 2.0 0.0 0.0 0.0 0.0 0.0 1.0 5.0 0.181818181818 0.0 3.0 1.0 0.40625 0.5 0.75 0.5 0.5 0.875 1.0 1.0 1.0 0.875 1.0 0.75 0.625 0.5 0.75 0.25 0.125 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -7.28133864645 4.89401450008 -13.1552358035 11.1206612834 5.83122573723 -0.926020655216 1.5521395181 8.86368113052 -2.84766796813 0.0543938051662 -4.13664309941 7.76781717258 0.661270057891 0.427095162868 -3.65942064938 10.2900009274 0.830073442116 -0.12621714645 1.8317644034 9.21250765572 -1.24501986643 -0.171293057526 -6.49654593773 8.87908576737 0.131956488385 0.196338551298 3 1 5 2 2 5 1 25 6 5 7 4 7 4 7 4 8 4 8 4 8 3 9 1 11 0 144.0 1.0 62.0 0.564516129032 0.139467592593 0.149884259259 0.0541888369127 0.0571546933942 0.0109247068973 0.0225061770226 -0.00204164931089 -0.00163460175136 0.0186835863977 0.166666666667 0.166666666667 2.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 8.0 0.166666666667 0.0 2.0 1.0 0.430555555556 0.555555555556 0.777777777778 0.444444444444 0.888888888889 0.777777777778 1.0 1.0 0.777777777778 0.555555555556 1.0 0.666666666667 0.111111111111 0.555555555556 0.666666666667 0.111111111111 0.0 0.25 0.75 1.0 0.5 0.0 0.25 0.75 1.0 0.5 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -9.70845152861 8.43521198387 -22.1253681043 19.4910194325 1.90322786114 -1.17818867594 -16.243888667 16.5328570741 0.967148730185 -0.391931327838 -8.2912227478 11.5940166473 -0.220282281663 -0.155533198207 -7.21758406838 8.52545959085 0.678909482104 -0.801251714477 -1.51947027871 1.97063390372 0.579613516617 -0.202605695531 6.92147211677 -3.42122378528 0.227147535316 -0.249766987361 10 3 9 6 8 6 10 4 10 4 10 4 10 3 11 4 10 4 6 1 2 5 2 5 2 5 2 3 5 4 1 4 5 4 1 4 5 8 6 8 6 8 6 9 5 4 1 5 4 4 2 4 4 4 3 4 3 4 294.0 0.666666666667 135.0 0.481481481481 0.272594752187 0.25299643667 0.0870942851665 0.166009658989 0.0668922435002 0.0205361256297 0.0109085730568 0.00903610802532 0.0672681143016 0.285714285714 0.571428571429 0.0 2.0 0.0 0.0 0.0 1.0 5.0 5.0 0.0 5.0 0.171428571429 1.0 0.0 2.0 0.459183673469 0.0 0.0833333333333 0.75 0.75 0.0 0.208333333333 0.5 0.583333333333 0.166666666667 0.166666666667 0.0833333333333 0.0416666666667 0.833333333333 0.833333333333 0.791666666667 0.75 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 4.51696886108 -8.48826363157 6.60209378837 -19.5514243266 -5.50066705162 2.07380901553 -5.89098238433 -8.22174469381 4.2909388908 4.79043097547 8.16526250198 16.1033560292 -0.185532849325 -0.612172222514 11.8402983075 20.8273769803 -1.29537306281 0.835795652247 1.2147524476 21.6886317768 0.399254977852 -0.794763061531 2.40622016679 18.8477220942 0.0143626288611 0.120908913482 0 1 1 2 3 19 1 2 3 3 6 3 8 3 6 4 7 3 7 3 7 3 7 3 7 4 5 6 3 0 130.0 0.769230769231 59.0 0.627118644068 0.160769230769 0.179881656805 0.0406504324078 0.109769685935 0.028654528903 0.0117566579695 0.00986460666216 -0.000977391663355 0.0673047132147 0.6 0.230769230769 3.0 0.0 2.0 0.0 3.0 0.0 0.0 0.0 1.0 6.0 0.0454545454545 0.0 1.0 1.0 0.453846153846 0.75 0.5 0.416666666667 0.416666666667 0.916666666667 0.916666666667 1.0 1.0 0.5 0.25 0.333333333333 0.583333333333 0.583333333333 0.0 0.0 0.0833333333333 0.75 1.0 0.5 0.25 0.25 0.25 0.25 0.0 0.75 1.0 0.75 0.75 0.75 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.5 1.0 0.75 0.25 0.25 0.5 0.5 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -8.52091079938 3.72177713076 -16.3365101762 11.2123581067 5.79129848454 3.52705319493 -0.11854769169 24.9347139784 -1.31168092471 1.15596418756 0.74496767045 31.959034611 -0.00909090171088 -0.0298307900698 -2.29532085065 32.7314085198 0.216991470406 0.533458897365 0.315951198623 37.1051458296 0.105453405288 0.68725767169 1.97728176732 45.285500128 0.0603154318275 0.217944157315 8 1 4 1 3 23 1 7 4 4 6 3 7 3 7 3 7 3 7 3 7 3 6 4 5 6 5 1 2 2 4 0 150.0 0.666666666667 67.0 0.626865671642 0.170666666667 0.188 0.0397819259259 0.119295111111 0.0278257777778 0.0107467936405 0.00455845371981 -0.00106420253151 0.0820476178005 0.3 0.133333333333 2.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 4.0 7.0 0.111111111111 0.0 2.0 1.0 0.446666666667 0.5 0.583333333333 0.333333333333 0.416666666667 0.583333333333 1.0 1.0 1.0 0.5 0.75 0.333333333333 0.333333333333 0.75 0.416666666667 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 -9.59173790367 7.80920254104 -18.9669676011 18.9090037155 5.18463142616 0.230880770779 -8.60046497572 21.0564928856 -4.41008260945 0.154356454306 -22.1802428997 20.8510118572 -0.211592417758 0.550248511184 -32.3245204719 23.6383390652 -1.09804461036 0.0270237307967 -42.5677681347 25.6736953046 -1.98175718727 0.668067803807 -64.4352803995 32.1777592948 -0.30146856311 0.12568465757 2 6 4 7 2 2 4 2 2 2 5 1 2 3 7 4 2 1 4 7 6 5 7 3 8 4 5 7 3 2 2 3 1 3 4 5 3 0 140.0 0.714285714286 67.0 0.910447761194 0.225 0.220918367347 0.0635841836735 0.136213921283 0.0544770408163 0.0155927725989 0.0123623367806 0.00910088527962 0.0641988724317 1.3 0.428571428571 1.0 3.0 4.0 3.0 1.0 2.0 0.0 3.0 3.0 9.0 0.290322580645 1.0 3.0 2.0 0.478571428571 0.5 0.583333333333 0.0833333333333 0.583333333333 0.666666666667 0.75 0.25 0.333333333333 0.5 0.333333333333 0.416666666667 0.166666666667 0.666666666667 0.416666666667 0.75 0.583333333333 0.0 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.0 1.0 0.75 0.5 0.75 1.0 1.0 0.5 0.0 1.0 0.5 0.0 0.25 0.75 1.0 0.5 0.0 1.0 0.5 0.0 0.0 0.25 0.75 0.75 0.25 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.5 1.0 0.75 0.25 0.0 0.25 0.75 1.0 0.75 0.75 1.0 0.75 0.25 0.25 0.75 1.0 1.0 -3.59235442979 1.13682102208 -11.2335197949 3.75480597005 -3.1482982183 2.40495647244 -17.6133488269 17.7796632044 3.94251045589 4.5037903861 -1.54758677864 36.5894379805 -0.204616623419 -1.78652603934 3.68994272487 34.0095734028 -0.0209219017326 1.15695019993 2.91863554711 35.473934776 0.515649511346 -0.392650636995 8.09913555642 36.7462486289 0.0330957754992 0.082003137402 1 6 4 3 2 3 3 2 4 3 8 3 8 3 9 2 9 2 3 2 3 3 2 2 4 4 1 3 3 4 1 3 3 5 2 2 3 4 132.0 0.916666666667 59.0 0.830508474576 0.210743801653 0.221590909091 0.0822220135237 0.115453345438 0.0651582978546 0.022819875311 0.0176641566517 0.0175310473178 0.0337735287844 0.545454545455 0.583333333333 2.0 3.0 1.0 0.0 2.0 0.0 2.0 3.0 1.0 4.0 0.25 0.0 1.0 1.0 0.44696969697 0.777777777778 0.222222222222 0.0 0.444444444444 0.444444444444 0.0 0.0 0.111111111111 0.666666666667 0.333333333333 0.111111111111 0.222222222222 0.666666666667 1.0 0.777777777778 0.888888888889 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.5 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.69765272631 -1.27323954474 0.850913602089 -2.41082154478 -4.20876405065 0.884194128288 -9.50127673563 0.204686169898 2.65929571065 0.15289190135 -2.26748275873 3.56059085204 -0.48460171771 0.81034612326 1.36668782393 6.74320815417 0.662224489598 -0.601416048927 3.62405132603 4.60248266215 -0.163188109092 -0.00842608815163 4.02710955254 -0.824037742043 -0.0527711115682 -0.353587981796 11 1 11 5 10 5 12 3 12 3 11 4 11 4 11 4 7 8 4 11 4 11 3 3 5 4 3 2 6 3 3 3 7 2 3 3 7 2 3 3 7 2 3 3 7 3 3 3 6 3 3 4 4 5 2 6 1 7 2 13 315.0 0.714285714286 133.0 0.616541353383 0.215873015873 0.24111866969 0.0669502933449 0.156842833547 0.0631114950389 0.0165817724568 0.0154826869994 0.0109763221554 0.0893918827058 0.666666666667 0.428571428571 0.0 3.0 5.0 1.0 0.0 0.0 4.0 5.0 5.0 7.0 0.25 0.0 2.0 2.0 0.422222222222 0.0 0.166666666667 0.666666666667 0.708333333333 0.0 0.416666666667 0.208333333333 0.458333333333 0.208333333333 0.625 0.25 0.333333333333 0.791666666667 1.0 0.708333333333 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.333333333333 0.166666666667 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 -2.66773999849 -7.70006772292 -8.60532555207 -23.6478563522 -2.04576227466 -5.79495160464 -8.35021229609 -32.2907457843 5.70862971947 9.75625134894 11.8256596925 7.46089983801 -2.6633915584 -0.844630208035 8.02586993402 21.2328400789 1.35195204734 1.07840787656 8.75095395824 19.3988583095 -0.598084773419 -1.5064565868 8.72355383079 12.8111593635 -0.0180929795591 0.216317499635 1 1 4 3 5 3 4 3 5 3 4 4 3 4 4 4 3 4 4 4 3 4 4 4 4 3 4 4 4 3 4 4 4 2 5 4 4 3 4 4 5 2 5 2 7 2 12 4 5 3 2 2 0 195.0 1.15384615385 112.0 0.517857142857 0.254017094017 0.278106508876 0.103668099597 0.0922591412532 0.0567197693825 0.0257071173854 0.00727165233971 0.00731522394135 -0.020893091136 0.133333333333 0.923076923077 0.0 0.0 1.0 1.0 3.0 3.0 3.0 2.0 1.0 9.0 0.138888888889 0.0 1.0 2.0 0.574358974359 0.75 0.75 0.8125 0.5625 0.5 0.5 0.5 0.8125 0.375 0.25 0.25 0.5625 0.875 0.875 1.0 0.875 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -6.62084563262 0.509295817894 -21.8296255403 4.13472234608 -7.6190654357 4.44105953204 -41.2448226252 20.0910562255 5.53092743192 0.764119779716 -23.7431636671 25.2378855235 -1.93237335003 -1.15176898508 -23.566285485 17.5620021679 0.597136168448 -0.23998521232 -21.4765529206 12.018639004 1.58462400554 -0.667256265122 -1.11158183859 3.31535570377 0.418412516225 -0.328592430914 2 6 4 3 2 3 2 3 3 4 1 2 5 3 8 3 7 4 5 6 3 3 2 3 2 3 3 3 2 2 4 3 2 3 3 4 1 4 3 3 2 2 4 2 1 0 143.0 0.846153846154 72.0 0.847222222222 0.250476795931 0.232920925229 0.0837416776583 0.114327747659 0.0606376361181 0.0189931419273 0.01115535271 0.0101492555935 0.0183150981596 0.727272727273 0.692307692308 1.0 3.0 2.0 0.0 2.0 1.0 2.0 3.0 4.0 7.0 0.3 0.0 2.0 1.0 0.503496503497 0.666666666667 0.166666666667 0.416666666667 0.583333333333 0.5 0.0833333333333 0.583333333333 0.666666666667 0.416666666667 0.333333333333 0.333333333333 0.0833333333333 0.833333333333 0.833333333333 0.75 0.5 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.75 0.5 0.25 0.0 0.25 0.75 0.5 0.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.47376475225e-16 -0.293824510324 -3.11969672127 -0.837906617876 -4.26306330955 0.267745411774 -15.48534257 2.98791223254 1.22908168122 2.32068999206 -15.8587048223 12.4269700013 -1.70928667046 -0.687703827026 -24.5720398124 13.0365888776 -1.0469813378 0.542197442423 -36.0415861464 11.8518902381 -0.0772418705393 -1.12542762479 -36.7387323671 3.36330066668 0.055243029599 -0.111999471999 3 2 4 1 1 22 1 6 1 2 3 4 7 4 7 4 8 3 8 3 8 3 8 3 7 5 5 6 6 2 7 0 154.0 0.785714285714 70.0 0.628571428571 0.177095631641 0.17254174397 0.0456900158368 0.0938354949149 0.0299091193846 0.0120040707212 0.00679363005169 -0.000573540438789 0.0449547253978 0.272727272727 0.142857142857 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 2.0 5.0 0.125 0.0 1.0 1.0 0.454545454545 0.666666666667 0.416666666667 0.0833333333333 0.25 0.916666666667 1.0 0.75 0.833333333333 0.833333333333 0.75 0.666666666667 0.833333333333 0.666666666667 0.166666666667 0.0 0.166666666667 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -8.73078544961 7.32112738223 -16.7735722472 19.3550894042 5.47901331787 2.48592596972 -4.23785766391 27.8717754697 -3.28904433118 -0.961716967736 -10.8245484695 22.6177035811 0.956956145005 -0.533377651845 -11.7366667204 17.7377480759 -0.138165753627 0.348871427186 -7.95489671435 18.1356911829 0.447764742493 -0.579309330255 -4.91192963374 10.9634587572 0.102389853638 -0.367916915464 4 1 2 1 7 7 4 3 2 4 2 4 4 3 1 10 1 11 1 4 8 3 9 3 10 3 9 3 6 1 2 5 2 3 3 9 4 7 6 4 4 0 180.0 0.8 89.0 0.730337078652 0.203703703704 0.228148148148 0.0597668038409 0.116725651578 0.0461796982167 0.015795730515 0.0117311035496 0.00575443000008 0.0503439429935 1.0 0.333333333333 0.0 4.0 6.0 2.0 2.0 1.0 0.0 1.0 2.0 15.0 0.138888888889 1.0 4.0 2.0 0.494444444444 0.25 0.833333333333 0.916666666667 0.583333333333 0.75 0.916666666667 0.5 0.833333333333 0.5 0.583333333333 0.0 0.416666666667 0.5 0.5 0.0 0.333333333333 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.75 1.0 0.5 0.5 1.0 0.5 0.0 0.0 -11.28939063 6.19643245104 -26.5911214426 18.3913222713 1.16232623328 5.7482521313 -21.716841118 42.8147709613 2.41308969427 3.564156927 -7.91506815347 60.8882503944 -0.840189563062 -1.02570271882 -11.3296369727 54.9329193635 -1.02180421646 -0.98585107012 -21.7245031013 46.1899750132 -0.610735818261 0.983679379265 -30.3211926517 53.2414955274 -0.189328209309 0.151910087113 7 1 8 9 4 5 1 5 2 4 4 5 1 4 4 4 2 3 5 10 5 8 7 7 7 7 7 8 5 4 1 5 3 4 3 11 6 5 9 5 5 0 210.0 0.933333333333 114.0 0.570175438596 0.24387755102 0.254285714286 0.0914049238743 0.0999491415614 0.0513641075478 0.0242511321219 0.0049372902227 0.00707818788392 0.00482052994211 0.642857142857 0.666666666667 0.0 4.0 3.0 1.0 1.0 3.0 3.0 1.0 4.0 10.0 0.230769230769 0.0 2.0 2.0 0.542857142857 0.5625 0.9375 0.8125 0.875 0.5 0.1875 0.0625 0.4375 0.625 0.4375 0.0625 0.4375 0.5625 0.9375 0.8125 0.8125 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.75 0.75 0.5 0.5 1.0 0.75 0.5 0.25 0.25 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.0 -2.75868568026 4.75342763368 -14.1007667383 15.3078160561 -10.5407257777 6.09344151898 -46.3337851599 39.0769606998 3.15561784635 2.22202202372 -36.6352767335 51.9108004166 1.56417183951 -0.616899707889 -23.3997885043 49.3636882931 -1.98028744287 0.433311585291 -35.8129195915 52.1280239535 -0.411296293493 0.955864032407 -48.3079953918 61.3732744738 -0.572127820948 0.0814387090997 2 8 3 3 3 4 1 3 4 4 2 1 5 4 8 3 8 4 9 3 5 1 4 2 3 2 4 3 3 2 4 3 3 2 4 5 1 3 4 4 144.0 1.0 64.0 0.90625 0.231481481481 0.196180555556 0.0986153978052 0.0943739149306 0.0593332047325 0.0267201947747 0.0163741109575 0.0138931681408 0.00996958135632 0.583333333333 0.666666666667 2.0 2.0 2.0 1.0 2.0 1.0 2.0 3.0 2.0 5.0 0.185185185185 1.0 1.0 1.0 0.444444444444 0.666666666667 0.444444444444 0.0 0.222222222222 0.666666666667 0.111111111111 0.0 0.222222222222 0.333333333333 0.0 0.111111111111 0.0 0.777777777778 0.666666666667 0.777777777778 0.555555555556 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.75 0.5 0.5 0.5 0.75 0.75 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 4.03192522499 -6.36110936293e-16 6.6273411221 -0.585392401706 -4.02308328371 -0.760406950328 -3.23684759459 -2.68194231969 2.14458011023 0.177821263578 0.377712865984 -3.67774869919 -1.12616096962 -0.546316216444 -1.81415510881 -4.67394654193 0.18866858921 0.706947090578 -2.39769193218 -1.7272770693 0.513238835651 -0.317852509858 2.9112112847 -1.37605174491 -0.0641062863291 0.101289150066 2 4 1 6 2 5 3 4 3 4 3 4 3 4 3 4 3 3 4 3 4 3 4 3 4 3 4 2 5 2 5 3 4 3 3 4 3 5 2 6 1 5 1 0 147.0 0.333333333333 80.0 0.5875 0.24101068999 0.254292193068 0.0220095998046 0.32481804791 0.0496851431581 0.00166030201669 0.0139673164773 0.000562129415614 0.478663905775 0.428571428571 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 4.0 0.0769230769231 0.0 10.0 1.0 0.544217687075 0.25 0.0 0.0 0.333333333333 0.666666666667 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.00160999774 2.48584863496 -6.80915678452 6.42654594736 3.26167098146 1.29922402524 -1.37054982489 15.5929882138 -3.13620885995 3.75742122487 -6.30964913207 33.1009280581 2.75083996835 -0.0356286262584 -1.73489612149 36.8590601678 -2.44886120007 -0.378558061135 -6.70639871106 30.498840634 1.88069250569 -0.716433240069 -3.58348102036 23.1073157509 -0.482318618943 -0.072800306663 1 2 5 9 7 10 6 11 5 12 3 13 3 13 3 13 4 12 4 12 10 6 5 1 5 5 3 5 3 5 3 6 2 5 3 6 3 4 3 6 3 4 3 6 3 4 3 6 2 5 3 6 2 4 4 6 3 3 4 5 4 2 6 4 5 1 6 4 5 2 4 8 1 1 0 368.0 0.695652173913 141.0 0.68085106383 0.159307065217 0.202150283554 0.0467208143698 0.141420869944 0.0615386473787 0.0165134553763 0.0224314363599 0.0174845169899 0.102761788225 0.375 0.565217391304 2.0 2.0 1.0 1.0 0.0 0.0 5.0 5.0 4.0 4.0 0.152173913043 0.0 1.0 2.0 0.383152173913 0.541666666667 0.25 0.25 0.416666666667 0.916666666667 0.916666666667 0.791666666667 0.791666666667 0.166666666667 0.375 0.125 0.0416666666667 0.0 0.333333333333 0.416666666667 0.333333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 1.0 0.666666666667 0.5 0.5 0.5 0.333333333333 0.0 0.333333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -9.63233394713 -8.08230319701 -21.2464174583 -21.0475401262 2.86502443131 -1.0801659062 -13.0654569934 -17.7103882101 -0.236450297405 6.09159678508 -13.0314963147 3.91871657784 -1.87612417935 -4.0890783196 -20.3976825896 -6.34962797886 2.07909272057 1.99297669847 -9.8174349981 -5.01099847373 -0.659553541521 -1.39992638923 -10.5079362511 -10.5053986156 -0.00473120766667 0.0225672334054 1 1 3 3 3 1 5 1 16 1 9 3 5 6 4 7 3 8 3 8 3 7 5 6 5 6 5 5 7 5 6 4 0 154.0 0.785714285714 82.0 0.439024390244 0.193624557261 0.219851576994 0.047115980663 0.119542289385 0.0252758289105 0.0117574552095 0.00323901976993 -0.00337732049636 0.0611875015218 0.363636363636 0.142857142857 2.0 0.0 2.0 0.0 2.0 0.0 0.0 0.0 3.0 5.0 0.2 0.0 1.0 1.0 0.532467532468 0.833333333333 0.416666666667 0.416666666667 0.75 0.916666666667 1.0 1.0 1.0 0.666666666667 0.75 0.416666666667 0.75 0.916666666667 0.333333333333 0.0 0.0833333333333 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -11.3682102208 5.09295817894 -22.8088363006 13.3231015968 6.29798846235 1.57670115634 -5.70165926087 19.4061316403 -1.69032170639 0.143198729662 -6.19759063153 21.2107661936 -0.363919105682 0.637352141596 -10.6927904123 23.0915626783 0.684782641189 -0.648065616439 -6.17796040267 18.1143924006 -0.289098679639 -0.562047854338 -5.72878750272 9.22649869497 0.162071705198 -0.280173901724 9 4 10 6 9 6 11 4 11 4 12 3 12 3 11 4 7 2 2 4 4 10 3 6 2 5 2 5 4 4 2 4 6 3 2 3 7 3 1 4 7 3 1 4 7 3 1 5 6 2 3 4 6 3 2 5 4 4 3 5 3 5 3 4 3 5 11 1 3 0 330.0 0.681818181818 140.0 0.714285714286 0.228282828283 0.220798898072 0.0723287976181 0.14193118513 0.0583373681721 0.0192724420949 0.0137891235718 0.0101366036993 0.0670021839385 0.6 0.545454545455 0.0 2.0 2.0 2.0 0.0 1.0 5.0 5.0 3.0 6.0 0.121951219512 1.0 1.0 2.0 0.424242424242 0.0 0.166666666667 0.833333333333 0.708333333333 0.0 0.375 0.5 0.666666666667 0.208333333333 0.333333333333 0.0833333333333 0.0833333333333 0.833333333333 0.75 0.625 0.625 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.166666666667 0.5 0.0 0.0 0.0 -0.520870722846 -3.47247148564 -1.56733958414 -8.36226701846 0.488944073856 1.83022205782 6.17884895856 9.43328521173 4.74509190617 9.6118276358 23.5480163683 48.7689837117 -3.10679630048 -4.03697105852 10.5780510329 39.7743669002 -0.365051812725 0.882267179413 2.52092297312 32.6186391369 0.848555384457 -0.933059353284 8.46405173377 27.0289428878 -0.251939285029 -0.155402317709 1 4 11 5 10 5 10 5 11 4 11 3 12 3 12 3 12 4 3 3 5 4 1 6 4 4 4 4 3 4 5 3 3 4 5 3 3 3 7 2 3 3 7 2 3 3 7 3 2 3 6 3 3 3 7 3 2 3 7 2 2 4 7 2 1 6 5 4 1 3 9 2 330.0 0.681818181818 125.0 0.736 0.150909090909 0.195454545455 0.0472916771016 0.135089990817 0.0576758494031 0.0188426162217 0.0206838620435 0.0186402328645 0.100350364761 0.4 0.636363636364 1.0 2.0 0.0 2.0 0.0 2.0 5.0 5.0 4.0 4.0 0.166666666667 1.0 0.0 2.0 0.378787878788 0.666666666667 0.5 0.5 0.625 0.666666666667 0.625 0.625 0.541666666667 0.0 0.166666666667 0.0 0.0 0.0 0.416666666667 0.416666666667 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.666666666667 0.666666666667 1.0 1.0 0.666666666667 0.5 0.333333333333 0.5 0.166666666667 0.166666666667 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -9.66504563504 -2.98053802518 -21.6149537854 -8.47515524558 2.80464251707 -0.91696444861 -11.0990768481 -5.69096043433 1.8424923781 4.63271444005 -2.70159163706 9.61173104095 -2.72547424142 -3.251711598 -13.4468277631 1.63531853471 1.76950499787 2.1758467962 -4.09381271574 9.78927190107 0.537070553484 -0.0705654398523 1.54089172118 13.1327753443 -0.420324812047 -0.180537288 5 3 10 4 9 3 9 3 9 3 9 3 9 3 5 1 3 3 3 3 3 3 2 3 4 3 2 4 2 23 3 4 156.0 0.923076923077 69.0 0.608695652174 0.225961538462 0.263313609467 0.0879363589238 0.133961083295 0.0659943483538 0.0227160241824 0.0112730125435 0.0131356805208 0.0356449370769 0.25 0.384615384615 0.0 2.0 1.0 0.0 0.0 0.0 2.0 2.0 3.0 5.0 0.08 1.0 1.0 1.0 0.442307692308 0.0 0.0 0.416666666667 1.0 0.0 0.0 0.333333333333 0.75 0.25 0.0 0.0 0.416666666667 0.75 0.666666666667 0.666666666667 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.27323954474 -3.81971863421 -0.089355025045 -8.2130779598 -3.85564983665 1.66732370059 -7.94448703568 -1.33041293173 3.5957710195 1.77081708576 2.01111827862 9.73960979081 -1.59046277391 0.470799087717 1.32141147915 15.3445167738 1.16694267911 0.515642661335 5.73065842807 20.3921606541 0.363507231271 0.513609286564 13.4704731288 26.6531425919 0.0556354407985 0.142196679861 3 1 12 6 10 6 10 6 11 5 12 4 12 5 11 5 11 4 12 5 11 10 6 6 1 5 4 5 4 4 3 4 6 3 3 4 6 3 3 4 6 4 2 4 7 3 2 4 7 3 2 4 6 4 2 5 5 4 2 5 4 3 4 12 5 1 1 5 1 1 4 0 368.0 0.695652173913 157.0 0.56050955414 0.168308423913 0.232514177694 0.0476894910092 0.150220627517 0.0655814652338 0.0165677276996 0.0204467068104 0.0164802835967 0.109731921337 0.5 0.521739130435 0.0 3.0 4.0 1.0 0.0 0.0 5.0 4.0 5.0 13.0 0.148148148148 0.0 2.0 2.0 0.426630434783 0.75 0.5 0.5 0.5 0.666666666667 0.916666666667 0.875 0.833333333333 0.0 0.291666666667 0.333333333333 0.0833333333333 0.0 0.125 0.5 0.208333333333 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.666666666667 0.833333333333 0.833333333333 1.0 0.666666666667 0.5 0.0 0.0 0.166666666667 0.333333333333 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 -14.5868965234 -11.6252306258 -31.0211141569 -27.7529501006 5.79791241524 1.76371983948 -15.2090442735 -13.8059891198 -1.41559432366 7.90554281262 -17.7800850561 22.3451992597 -2.34043204262 -2.13426901135 -29.1002586892 24.0695157989 2.72219686195 0.835773482346 -12.9819302157 13.5033913845 -0.284767188902 -3.53164458937 -10.7546262581 -8.1794047967 -0.26119687104 0.403831625116 6 1 8 6 5 7 3 3 3 4 3 1 5 3 9 3 9 3 9 3 4 3 3 2 3 4 3 2 3 2 4 3 2 3 4 5 1 3 3 5 2 3 3 3 1 0 168.0 0.857142857143 72.0 0.958333333333 0.207837301587 0.21981292517 0.0735542108709 0.11833879137 0.0628393346426 0.0199380149787 0.0166279154501 0.0148096039548 0.0431586155991 0.666666666667 0.571428571429 3.0 4.0 1.0 0.0 0.0 2.0 2.0 3.0 3.0 6.0 0.241379310345 1.0 1.0 1.0 0.428571428571 0.333333333333 0.333333333333 0.25 0.75 0.5 0.0833333333333 0.5 0.583333333333 0.666666666667 0.0833333333333 0.166666666667 0.0833333333333 0.833333333333 0.75 0.5 0.583333333333 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 -1.0913481812 0.727565454134 -5.90067413068 2.59782711334 -4.22062204771 1.551644693 -16.4613664099 9.96920309828 2.75655187209 1.76527803126 -9.18902759479 19.440324376 -1.00919295936 0.460550837202 -6.57297540497 25.7388991084 1.52208380983 0.607398081765 0.993422510239 26.5914571991 -0.176498959921 -1.3271973596 2.92325521317 16.7614258061 -0.135408169677 -0.0113826115696 3 1 4 3 7 2 5 4 1 7 3 5 4 21 3 22 3 3 6 4 3 5 3 3 6 3 5 4 3 3 6 3 6 3 3 3 6 3 6 3 3 3 6 3 6 3 2 4 6 3 6 3 2 4 6 3 6 3 1 6 5 4 5 10 3 7 3 11 3 7 3 5 336.0 1.71428571429 184.0 0.527173913043 0.260540674603 0.256164965986 0.177805210316 0.0610960266423 0.0550964045713 0.0643926063679 0.00592436925128 0.013002208967 -0.0435952052217 0.291666666667 1.71428571429 2.0 2.0 2.0 1.0 4.0 4.0 6.0 6.0 1.0 12.0 0.107142857143 0.0 1.0 3.0 0.547619047619 0.625 0.583333333333 0.541666666667 0.833333333333 0.833333333333 0.25 0.0 0.166666666667 0.666666666667 0.666666666667 0.5 0.666666666667 0.791666666667 0.5 0.166666666667 0.25 0.333333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 -3.84624445805 9.09835758009 -12.6181831221 17.2872109603 -5.8182736748 -7.19540602961 -37.6990364958 -8.28283807611 -3.3987164822 -2.10635521607 -49.144953108 -20.2305757071 4.70706869174 3.63961928784 -24.0984812176 -0.542707016018 0.267760714377 -0.758820591336 -9.39312582672 -2.76162833835 0.465770440588 -1.4166921907 -11.4801229858 -14.1875781208 -0.366597973249 0.392276388967 8 1 5 3 3 3 2 4 4 9 1 23 1 1 1 2 1 4 8 3 9 3 9 3 7 1 1 4 5 2 2 10 2 9 5 6 3 0 168.0 0.857142857143 91.0 0.637362637363 0.215277777778 0.258078231293 0.0709620653817 0.116349602837 0.0431872401738 0.0206429235875 0.00732579899502 0.00412206650584 0.0405313058316 0.75 0.5 0.0 3.0 4.0 2.0 2.0 3.0 1.0 1.0 4.0 10.0 0.147058823529 1.0 2.0 1.0 0.541666666667 0.5 1.0 1.0 0.833333333333 0.75 0.916666666667 0.416666666667 0.75 0.333333333333 0.583333333333 0.0 0.5 0.333333333333 0.5 0.0 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.25 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.5 0.25 0.5 1.0 0.75 0.25 0.0 0.0 -11.3682102208 2.1826963624 -29.1373512079 6.07613212841 -2.50100624859 1.64815847773 -37.8410866422 15.0543646178 1.37734791889 2.75041559536 -30.217877459 28.8279784834 0.12813333154 0.149445935565 -27.5644676454 31.5043278759 -0.702621038082 -0.453403001329 -31.8365332935 28.7715885425 0.186528436538 0.696430331501 -30.6250754748 34.2219435744 0.070087287629 0.135737957834 1 2 3 5 2 5 3 4 21 2 1 1 3 5 3 5 3 5 3 5 3 5 3 5 4 4 4 4 7 1 7 3 1 4 0 136.0 0.470588235294 71.0 0.619718309859 0.191176470588 0.244809688581 0.0286484836149 0.206338731427 0.0458668328923 0.00590751343321 0.0141177565321 0.00445001364912 0.226278977052 0.625 0.0588235294118 0.0 0.0 3.0 2.0 0.0 1.0 0.0 0.0 2.0 6.0 0.0714285714286 0.0 3.0 1.0 0.522058823529 0.5 0.7 0.5 0.4 0.8 1.0 1.0 0.8 1.0 1.0 1.0 0.9 0.8 0.7 0.6 0.9 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 -8.01391948745 3.44523641517 -13.9868925973 9.29007051204 6.78603246059 1.43624945185 1.464826065 14.3059491391 -4.35161332256 -0.240829716382 -6.74846966084 13.8401173864 2.48779281172 0.191226384834 -0.546352718758 13.4152984581 -0.375778298687 -0.322665019635 1.14634400243 10.6196835194 -0.907268158361 -0.201662578395 -7.51707687313 9.01438331098 0.187520699745 0.104971997142 1 0 3 3 3 1 3 3 3 1 16 2 1 1 5 5 5 5 5 6 3 7 3 7 3 7 4 6 4 5 6 5 3 6 0 140.0 0.714285714286 70.0 0.5 0.146428571429 0.198469387755 0.0343276239067 0.114802842566 0.019152696793 0.0103309085611 0.0033002090044 -0.00200040593674 0.0823888870396 0.3 0.214285714286 1.0 0.0 1.0 0.0 2.0 1.0 0.0 0.0 5.0 4.0 0.16 0.0 1.0 1.0 0.5 1.0 1.0 0.75 0.75 0.666666666667 1.0 0.75 0.916666666667 0.583333333333 0.416666666667 0.0833333333333 0.333333333333 0.833333333333 0.0833333333333 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.0 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -12.0048299932 6.00241499661 -24.3055622258 15.4490114028 6.7262683821 1.48668349174 -3.23742714937 20.9589022541 0.509310969195 -0.564423825076 6.49015092674 16.5326757921 -0.48012848203 -0.858939405366 5.10805812988 10.9291719705 1.19143593909 0.606731761358 12.4554413661 14.8037382742 -0.162215150061 0.488276208128 14.6641414323 19.6895226362 0.0963722213412 -0.0948088600026 4 1 4 3 3 5 2 5 4 2 32 3 2 6 2 5 2 5 3 4 3 3 5 2 4 3 4 3 5 2 4 4 3 4 3 5 2 1 4 0 161.0 0.304347826087 66.0 0.939393939394 0.18544809228 0.210640021604 0.0191230832527 0.317083369176 0.0586957839647 0.00241527042304 0.0289538021143 0.00543626375098 0.476556757323 1.14285714286 186737708.348 0.0 1.0 1.0 2.0 0.0 4294967292.0 0.0 0.0 0.0 3.0 0.25 1.0 6.0 1.0 0.409937888199 0.166666666667 0.166666666667 0.333333333333 0.0 0.416666666667 0.25 0.666666666667 0.333333333333 0.583333333333 0.333333333333 0.916666666667 0.833333333333 0.75 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.04470325915 1.27222187259e-15 -4.53131027067 4.01717992594 3.16724484762 6.02766481275 0.267955423348 24.50524421 -3.50031633466 -0.169397511436 -5.77587344588 23.9323732091 3.44295580774 -2.70818468279 2.94331562365 7.48345574941 -2.42145597014 0.661094147018 -2.50067831846 4.88542176951 1.44410550092 -0.837582324134 0.689598562599 1.35752772138 -0.1631782129 0.125459551082 1 3 3 4 3 4 2 7 1 6 3 4 2 4 4 4 2 4 5 3 3 2 6 3 2 3 5 4 2 3 6 3 2 3 5 4 2 3 6 3 2 3 6 3 1 5 4 10 4 9 5 5 196.0 1.0 109.0 0.56880733945 0.256195335277 0.258381924198 0.107286690707 0.105328535517 0.0554978420981 0.0304945193042 0.00849849147701 0.0120691730969 -0.00210020152675 0.428571428571 1.0 2.0 1.0 3.0 0.0 3.0 3.0 3.0 3.0 2.0 7.0 0.25 0.0 1.0 2.0 0.55612244898 0.875 0.6875 0.75 0.875 0.5 0.375 0.25 0.375 0.5625 0.125 0.125 0.125 0.875 0.875 0.875 0.875 0.75 1.0 0.75 0.5 0.25 0.25 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -0.545674090601 3.18309886184 -6.65799333532 9.14619207581 -7.45568987056 2.35066746852 -28.6626708912 18.4898128994 2.68734830667 0.766598992269 -19.9861179686 22.1923999432 1.29959874937 -0.625873847707 -7.7204399199 17.6341001872 -0.797287471225 -0.50971693184 -11.5397301041 11.1527894744 0.247977820944 -0.583819574656 -9.79901709741 3.3579566767 0.173372470652 -0.173515714289 3 5 3 9 1 9 1 3 2 4 1 3 7 4 6 7 5 6 5 6 4 1 2 6 4 3 1 2 4 3 1 3 2 3 2 8 1 0 140.0 0.714285714286 85.0 0.611764705882 0.294285714286 0.275 0.0696705539359 0.145706632653 0.0537142857143 0.0106511823356 0.0069216901459 0.00323064525881 0.0351599662408 1.2 0.357142857143 1.0 2.0 4.0 2.0 0.0 1.0 1.0 3.0 3.0 10.0 0.212121212121 0.0 3.0 1.0 0.607142857143 0.5 0.666666666667 0.166666666667 0.583333333333 0.833333333333 0.833333333333 0.583333333333 0.416666666667 0.833333333333 0.416666666667 0.833333333333 0.166666666667 0.916666666667 0.416666666667 0.833333333333 0.75 0.25 0.5 0.5 0.5 0.5 0.5 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.25 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.25 0.75 1.0 -3.59235442979 3.77424579332 -9.40968892737 10.8500132037 -0.837535487699 3.0629206395 -10.4302651634 24.5776099079 2.14367229383 2.28168170304 0.498565817492 35.1220682242 0.439699197969 -0.643996900039 5.26820338633 35.0200665577 -0.518498453661 0.803695542362 2.38268524113 36.6232749261 0.28620059875 -0.654637301009 3.58386079104 32.8456128396 -0.00338743269346 0.000410616543603 2 3 3 5 2 5 3 3 31 2 1 1 3 5 1 6 2 4 4 3 4 3 4 3 4 3 4 3 4 3 3 4 2 6 1 11 3 0 154.0 0.318181818182 73.0 0.739726027397 0.186456400742 0.256198347107 0.0181588735097 0.366994280808 0.0499279351109 0.00216888718198 0.0157917568799 0.00346596768139 0.608244970729 1.14285714286 195225786.045 1.0 2.0 1.0 2.0 4294967295.0 4294967294.0 0.0 0.0 3.0 3.0 0.2 0.0 6.0 1.0 0.474025974026 0.166666666667 0.333333333333 0.25 0.416666666667 0.5 0.5 0.666666666667 0.75 0.666666666667 0.416666666667 1.0 1.0 0.666666666667 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -5.09295817894 -3.64609505992 -8.85012135886 -4.90151410355 3.90102994998 6.30389890673 -2.73433198082 19.7309719466 -4.0020386059 3.24945484464 -9.00055738272 37.1413272288 3.89592934303 -1.96906378354 0.691241566786 29.5319718693 -2.7134396406 0.622865701401 -5.17436851834 27.2034703763 1.44518903739 -0.648215702878 -4.3716149057 24.5974153199 -0.238040191177 0.0873629879915 3 1 10 2 4 1 1 11 2 8 3 4 8 3 8 3 7 3 9 2 9 3 7 4 7 4 8 3 7 5 4 0 154.0 0.785714285714 57.0 0.859649122807 0.144037780401 0.16094619666 0.0380925365746 0.0954260152059 0.0346267411118 0.010721337902 0.0106204685978 0.00252131540304 0.0584507671839 0.454545454545 0.0714285714286 0.0 3.0 2.0 0.0 1.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 7.0 1.0 0.37012987013 0.333333333333 0.166666666667 0.0833333333333 0.166666666667 0.75 0.833333333333 0.75 0.833333333333 0.583333333333 0.75 0.5 0.666666666667 0.5 0.25 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.25 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.0 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -7.63943726841 4.45633840657 -14.1128536405 11.0619104558 5.72957795131 0.409719576531 0.496467137035 12.2873825969 -2.6035426753 -0.759511024463 -4.34028013175 8.12327065091 0.38029663011 0.145323716479 -6.24257147024 8.28202207713 0.346477318343 0.338721840395 -3.53486132745 10.7731217245 -0.636615766717 -0.117470284142 -6.62413850352 9.83777816626 0.215436280396 -0.0688672531097 1 1 4 1 11 2 1 1 1 28 3 2 4 2 5 2 3 3 3 3 4 2 4 3 3 3 3 2 4 2 4 2 4 1 1 1 1 2 0 126.0 0.285714285714 63.0 0.666666666667 0.25 0.248677248677 0.024785840262 0.379048738837 0.0733812043336 0.00257564688918 0.0287935001184 0.00537325705421 0.591958529637 1.33333333333 204522252.095 0.0 2.0 1.0 1.0 0.0 4294967293.0 0.0 0.0 2.0 7.0 0.260869565217 0.0 3.0 1.0 0.5 0.5 0.166666666667 0.0833333333333 0.0833333333333 0.583333333333 0.416666666667 0.5 0.333333333333 0.583333333333 0.5 0.916666666667 0.75 0.583333333333 0.5 1.0 0.916666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -1.45513090827 -1.15197863571 -2.83505582164 2.66120010585 0.581557420822 8.098496424 -3.19936366437 30.1910781701 -1.22935034211 0.376389793824 -4.42958336927 35.8211698429 1.77987322003 -1.77545658473 0.708808375559 23.3696087283 -1.37889485865 -0.0657690534483 -2.06137167209 16.9501456216 1.0841565921 -0.937381469015 0.570349881161 9.21176255415 -0.234309977191 -0.0349832473388 4 6 6 9 2 3 5 4 1 3 6 3 1 3 6 6 7 7 6 6 7 3 1 2 7 3 1 2 7 2 3 1 6 3 3 4 3 2 5 7 3 0 169.0 1.0 79.0 0.708860759494 0.230314064634 0.20254893036 0.105423272394 0.0871557171622 0.0510007750462 0.0362098117501 0.0111896430776 0.011168714414 0.00555856150551 0.615384615385 0.769230769231 0.0 4.0 3.0 1.0 1.0 3.0 3.0 3.0 3.0 9.0 0.2 0.0 2.0 2.0 0.467455621302 0.4375 0.8125 0.6875 0.375 0.5625 0.1875 0.0625 0.4375 0.5625 0.0 0.0 0.375 0.6875 0.75 0.6875 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.75 0.75 0.5 0.75 0.75 0.5 0.5 0.25 0.25 0.25 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -0.489707517206 1.6650055585 -5.64641082458 6.46503786131 -6.86517780925 4.04168073964 -30.5437061757 23.3374795364 -1.3859437726 2.74765335856 -39.2519894169 38.7740620044 1.89639825978 -0.171363871622 -27.7076490506 37.4708978892 -0.101115558882 -1.33757183462 -24.0557640824 24.3328378602 0.154637173541 -0.785309115658 -21.4555019797 14.3148083043 0.199270786527 0.000964363605008 1 6 5 5 9 3 3 2 5 2 3 4 5 1 3 3 5 2 3 1 3 5 3 10 3 11 1 12 2 11 4 6 1 3 4 3 3 3 9 5 6 8 4 5 0 195.0 0.866666666667 84.0 0.869047619048 0.186193293886 0.186324786325 0.0642082300781 0.0996658743404 0.0393641160505 0.0197281051755 0.0124728708233 0.00477792786463 0.0399349510891 1.0 0.4 1.0 4.0 5.0 3.0 1.0 3.0 0.0 1.0 2.0 9.0 0.297297297297 2.0 3.0 1.0 0.430769230769 0.375 0.75 0.5625 0.5625 0.5 0.3125 0.0 0.5625 0.8125 0.4375 0.0 0.3125 0.75 0.4375 0.0 0.375 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.5 0.75 0.25 0.0 0.25 0.25 0.0 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 1.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 1.0 1.0 0.75 0.75 0.75 0.25 0.0 0.0 -9.33708999472 4.07436654315 -22.8311429155 13.9170715964 -0.280678584084 6.50540524723 -22.7612632715 39.1225548562 2.42180011986 2.0989526804 -7.7489915639 49.1630052351 1.02653439633 -2.52841796472 0.929151842651 32.8066082482 -0.740090297204 -0.886356697647 -5.07238595005 19.9375788751 -0.785773798831 -0.667750763472 -11.7170136412 5.86752083252 0.267978611077 -0.830060751573 5 6 10 7 6 4 4 3 4 5 5 4 2 6 5 4 1 5 5 11 5 11 5 11 5 4 2 5 6 3 3 4 5 3 5 4 4 2 7 8 11 3 6 0 224.0 1.14285714286 113.0 0.619469026549 0.229352678571 0.224489795918 0.104582939482 0.0721745171283 0.0496367073615 0.0347935728644 0.00659988038845 0.00868270561159 -0.0117240178977 0.5 0.714285714286 0.0 3.0 5.0 0.0 1.0 3.0 3.0 2.0 4.0 12.0 0.105263157895 0.0 2.0 2.0 0.504464285714 0.3125 0.8125 0.9375 0.375 0.625 0.8125 0.75 0.8125 0.5 0.0625 0.0 0.3125 0.625 0.4375 0.4375 0.5 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.5 0.5 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -7.00281749604 9.62887405706 -20.2300503713 27.4347077177 -4.78335207871 6.32951748289 -35.8989085518 49.5429892941 1.05731571203 -1.0960456167 -34.3787957138 41.537910393 -0.840759327916 -3.4946762685 -36.2680254665 17.7813026156 -0.128499261172 0.779032896682 -37.2967993487 20.7935363877 0.430283393055 1.54435324038 -33.7114438745 33.6899703914 0.00237681749887 -0.360945398178 2 3 6 3 4 5 4 5 4 8 2 4 5 3 6 3 6 3 6 3 6 3 6 4 5 4 4 5 5 8 3 4 2 0 144.0 0.5625 68.0 0.617647058824 0.146604938272 0.229600694444 0.0235004608196 0.179188836913 0.0432587716478 0.00494431899414 0.0169017791554 0.00641700028707 0.186546676086 0.555555555556 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 5.0 0.25 1.0 4.0 1.0 0.472222222222 0.666666666667 0.833333333333 0.666666666667 0.666666666667 1.0 0.916666666667 0.666666666667 0.833333333333 0.333333333333 0.416666666667 0.0 0.166666666667 0.0 0.166666666667 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 -10.8225361302 0.755985979687 -20.6555114279 2.85796329818 7.2912858304 1.75707678872 -1.71352876313 10.7235863362 -2.85280184188 1.82499618983 -5.23899507513 21.5928157948 0.7834985129 0.498644432435 -3.60997005194 22.2792257736 1.2423597914 -2.24268734702 5.61164213359 3.02838610624 -1.07883644283 -1.22258511717 -0.810561484537 -10.7581105309 0.078000057663 0.202311663192 7 3 6 6 4 6 4 3 2 1 5 2 8 2 9 2 9 3 9 2 7 6 4 8 3 6 6 4 8 3 8 4 7 4 7 4 7 4 7 3 8 3 6 6 6 1 9 0 242.0 0.5 86.0 0.825581395349 0.125469571751 0.166040570999 0.0213958198448 0.155741461908 0.0266022451386 0.00518267419785 0.00951331350336 0.000468177749038 0.15642479491 0.818181818182 0.0454545454545 2.0 1.0 4.0 0.0 1.0 0.0 0.0 0.0 2.0 4.0 0.333333333333 1.0 4.0 2.0 0.355371900826 0.0555555555556 0.444444444444 0.611111111111 0.444444444444 0.388888888889 0.833333333333 1.0 1.0 0.444444444444 0.444444444444 0.611111111111 0.555555555556 0.5 0.166666666667 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.666666666667 1.0 0.666666666667 0.5 0.0 0.333333333333 0.833333333333 0.833333333333 0.833333333333 1.0 1.0 1.0 0.166666666667 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.5 0.833333333333 0.166666666667 0.333333333333 0.833333333333 0.833333333333 0.666666666667 1.0 0.666666666667 0.5 0.0 0.0 0.666666666667 0.5 0.166666666667 0.5 0.833333333333 0.333333333333 0.0 0.0 0.5 0.333333333333 0.0 0.0 1.0 0.5 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -11.1119087541 3.47247148564 -17.4050694249 10.3416443 12.0044200202 3.25293093304 10.5591206498 23.2190186737 -7.71616321101 0.661058625542 -6.01205191787 23.9092852573 3.59727564671 -1.99250034333 -0.148872590023 15.8226201728 -0.516662807082 1.4064213461 5.35570814189 16.4664774886 -0.421234484112 -1.53684789031 -0.332488377708 13.6049354873 0.239092089884 0.552954068766 2 3 2 4 1 12 2 7 1 1 3 3 9 3 10 2 10 2 22 1 11 2 10 2 9 5 6 6 5 0 156.0 0.923076923077 53.0 0.811320754717 0.130341880342 0.120315581854 0.0451330939497 0.0720890439825 0.0223273740286 0.0166248634955 0.00908135936019 0.000672431240824 0.0403022205049 0.5 0.0769230769231 2.0 3.0 1.0 0.0 2.0 0.0 4294967295.0 0.0 1.0 5.0 0.15 2.0 1.0 1.0 0.339743589744 0.5 0.166666666667 0.0 0.25 1.0 0.833333333333 0.416666666667 0.833333333333 0.666666666667 0.333333333333 0.166666666667 0.666666666667 0.666666666667 0.0 0.0 0.166666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.00281749604 4.60325066173 -15.1715282876 13.1955391157 2.57690470444 3.35840835764 -6.68744550061 26.6903324282 0.78449391933 1.3072641096 -0.553793245298 33.9484800719 -0.692765687639 -0.119001849925 -2.32050520741 34.1927262218 0.954625283473 0.481373698817 3.98741304602 38.5972691655 0.22164228479 0.909178837971 6.96080144861 47.3332967555 -0.130733081694 0.0430991474918 2 2 1 1 1 1 3 6 1 3 2 3 1 3 2 7 3 2 1 4 5 6 5 7 4 5 6 4 5 5 4 6 3 2 2 6 6 1 4 0 135.0 0.6 74.0 0.72972972973 0.247736625514 0.236049382716 0.0573871869126 0.144720215414 0.0505479855713 0.011158485886 0.00885446605193 0.00655243546886 0.0768253727269 1.33333333333 0.533333333333 2.0 3.0 4.0 2.0 3.0 2.0 0.0 2.0 4.0 12.0 0.294117647059 0.0 3.0 1.0 0.548148148148 0.666666666667 1.0 0.333333333333 0.5 0.583333333333 0.583333333333 0.583333333333 0.0833333333333 0.666666666667 0.416666666667 0.75 0.333333333333 0.666666666667 0.416666666667 0.75 0.916666666667 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.25 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.5 0.75 0.5 0.0 0.0 0.25 0.75 1.0 0.75 0.75 0.75 0.5 0.25 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.75 0.25 0.25 0.75 1.0 0.75 1.0 1.0 1.0 0.5 0.0 0.5 1.0 0.5 0.5 0.75 0.75 0.25 0.0 0.5 1.0 -4.92319290631 5.85690190578 -13.1384621798 15.5391130788 -1.20872874114 2.54195201553 -13.0539014714 27.1580606054 4.00644366716 1.4442623379 3.74598855927 31.2080253616 -1.2080844435 -1.72311850459 1.60030071191 22.9078506611 -0.543313300991 0.117877354523 -5.12384729649 15.069361017 0.387006862422 -1.7468072759 -1.02077194008 1.03299188673 0.146304611982 -0.111969227458 4 7 5 9 4 10 1 3 5 4 1 6 1 4 2 10 2 3 10 3 10 3 11 3 10 3 11 4 4 1 4 9 5 6 4 0 182.0 0.928571428571 88.0 0.636363636364 0.203296703297 0.196624803768 0.0702748977867 0.0920140570696 0.0320591888488 0.0203446283839 0.00751370783229 0.00148547852753 0.0254513415809 1.0 0.214285714286 0.0 5.0 6.0 2.0 0.0 2.0 0.0 1.0 6.0 10.0 0.315789473684 1.0 3.0 3.0 0.483516483516 0.3125 0.75 0.75 0.625 0.75 0.5625 0.0625 0.5625 0.8125 0.5 0.0 0.25 0.8125 0.5625 0.0 0.1875 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 -10.2768620396 6.27525204191 -25.6864645519 15.6169657278 -1.17997382007 1.42404233338 -28.9989902554 25.8436320821 2.14831711442 3.75390990707 -16.3189799722 41.5446678166 0.689072272931 -1.08431508613 -8.85870821965 34.5461049615 -0.200300726063 -2.19396207341 -9.40180041875 17.397470628 -0.10253247949 0.96332388996 -11.8134476857 19.2558648698 -0.142833333024 -0.251673763812 4 4 5 8 3 4 2 4 2 3 4 3 9 3 9 3 9 3 5 2 2 3 4 2 3 3 3 2 4 3 2 3 4 3 2 4 2 12 1 4 9 3 1 0 168.0 0.857142857143 79.0 0.835443037975 0.218253968254 0.227891156463 0.0738952326963 0.11840648958 0.059282542382 0.0178141331593 0.0140532352093 0.0124701944598 0.0366625518407 0.75 0.571428571429 3.0 5.0 1.0 0.0 1.0 1.0 3.0 3.0 0.0 7.0 0.21875 1.0 2.0 1.0 0.470238095238 0.666666666667 0.25 0.25 0.916666666667 0.583333333333 0.0833333333333 0.416666666667 0.583333333333 0.583333333333 0.0 0.0833333333333 0.25 0.833333333333 0.666666666667 0.666666666667 0.75 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.818511135901 -0.545674090601 -5.4639859314 0.385224371843 -4.45726642373 2.81189199748 -16.4732684493 12.0205193626 2.73694987696 2.02553949708 -11.8266261549 23.3244374769 -2.47426758504 -0.363229434037 -18.7373407891 21.3074132136 0.86280697638 -0.883202854938 -19.9369578907 12.1979444505 -0.643342010493 -0.556473243592 -21.7523119027 4.68074287269 -0.0854197360627 -0.0859468836224 0 3 4 5 3 6 2 22 1 7 2 7 2 10 5 5 4 4 1 4 5 4 5 3 2 4 6 3 6 2 2 4 5 4 6 2 2 4 5 3 6 3 2 4 6 3 6 3 1 4 6 3 5 4 1 4 5 4 5 3 2 5 4 4 4 12 2 5 4 5 2 2 5 1 13 0 322.0 1.64285714286 175.0 0.582857142857 0.249527410208 0.22338065661 0.17119407967 0.0540660034635 0.0459925895237 0.0680549163907 0.00593985283988 0.0109812685003 -0.0338614615198 0.521739130435 1.78571428571 1.0 3.0 1.0 3.0 4.0 6.0 6.0 6.0 3.0 17.0 0.174603174603 1.0 2.0 3.0 0.54347826087 0.833333333333 0.708333333333 0.666666666667 0.791666666667 0.625 0.125 0.0833333333333 0.291666666667 0.833333333333 0.666666666667 0.541666666667 0.625 0.75 0.25 0.25 0.416666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.166666666667 0.833333333333 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.833333333333 0.5 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 -5.25903290217 13.9779558715 -14.9415360195 30.6521391827 -4.2355856475 -4.70968869323 -35.3523626353 14.4561607591 -4.15092249944 -2.08911322686 -52.4794349959 1.16729088929 2.2736479092 2.25865747947 -43.8012901905 12.0352511667 -0.22901243738 -0.25947777623 -37.7111977058 14.3081337645 0.362422969857 0.0113072829614 -36.7387080018 13.5264709249 0.0118433358963 0.00701750779666 3 6 3 3 1 3 2 3 3 2 2 3 3 2 2 5 5 6 4 8 4 7 3 2 1 4 1 2 4 6 4 7 2 4 1 9 2 7 1 0 140.0 0.714285714286 89.0 0.561797752809 0.304285714286 0.315306122449 0.0688644314869 0.15510058309 0.0576282798834 0.0094193761693 0.00390151856859 0.00294035536437 0.0331135397013 1.1 0.5 1.0 2.0 4.0 2.0 2.0 1.0 2.0 2.0 3.0 12.0 0.2 1.0 3.0 2.0 0.635714285714 0.416666666667 0.666666666667 0.333333333333 0.833333333333 0.75 0.916666666667 0.666666666667 0.583333333333 0.416666666667 0.666666666667 0.666666666667 0.333333333333 0.833333333333 0.5 0.916666666667 0.833333333333 0.0 0.25 0.5 0.5 0.5 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 0.75 0.75 0.25 0.0 0.25 0.75 1.0 1.0 0.75 1.0 0.75 0.5 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 -5.04748533806 -0.682092613251 -13.0274152884 -0.841387854806 -0.883936345744 2.14511166739 -13.6979156227 12.7239486415 2.60465061416 5.22915890164 -1.65368683623 35.8094530958 -0.277001961968 -1.48815364137 0.747173381715 35.0966692061 0.0726554902693 0.798664954424 1.89491314342 35.7245949298 0.919114288633 0.0287598696083 11.1229619042 38.3849064732 0.0402620252991 -0.00328685779965 4 2 11 5 10 6 11 5 12 4 13 3 13 3 13 3 13 3 13 5 2 3 6 4 4 3 5 3 6 2 5 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 4 5 4 1 6 4 5 2 5 9 0 352.0 0.727272727273 120.0 0.783333333333 0.142045454545 0.184659090909 0.0467605418858 0.128443189889 0.0608535640496 0.0188873832235 0.0247034580874 0.0195417024223 0.0926381520568 0.125 0.545454545455 2.0 1.0 4294967295.0 0.0 0.0 1.0 5.0 5.0 0.0 3.0 0.105263157895 1.0 0.0 2.0 0.340909090909 0.541666666667 0.25 0.25 0.333333333333 0.708333333333 0.833333333333 0.791666666667 0.833333333333 0.0 0.125 0.0416666666667 0.0833333333333 0.0 0.208333333333 0.291666666667 0.291666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -8.13137072888 -8.36286882792 -18.0122011522 -19.8032676755 2.20030812009 1.11934592208 -12.5112551828 -12.8777108768 -0.745161682536 3.48646576788 -15.2080851161 2.51962271691 -1.81284522777 -1.99456674227 -25.2352014207 -1.99767641847 0.938501413441 1.11695739254 -21.5849847561 -0.0191944649519 -0.397980241503 -0.712094438611 -24.6168182573 -4.31227719695 -0.259184572559 -0.114224702655 8 1 1 1 8 7 4 9 4 9 3 9 4 3 10 3 10 3 9 4 9 4 7 9 5 6 8 4 9 4 10 3 10 3 10 3 10 3 10 2 10 4 8 6 6 8 6 1 3 2 6 0 299.0 0.565217391304 111.0 0.657657657658 0.145870851556 0.162570888469 0.030086754658 0.136974442947 0.0263745712406 0.00808593973387 0.00812991811159 -0.000215116814057 0.120846449562 0.692307692308 0.0869565217391 3.0 1.0 5.0 0.0 1.0 0.0 0.0 0.0 9.0 6.0 0.166666666667 1.0 3.0 5.0 0.371237458194 0.0833333333333 0.458333333333 0.541666666667 0.375 0.583333333333 0.791666666667 0.833333333333 0.75 0.708333333333 0.125 0.166666666667 0.0416666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.166666666667 0.5 0.666666666667 1.0 1.0 0.833333333333 0.5 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.666666666667 0.5 0.666666666667 0.833333333333 0.5 0.5 0.666666666667 1.0 0.333333333333 0.0 0.333333333333 0.5 0.0 0.0 0.833333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 -12.0127383134 9.85376691143 -18.6569028999 23.8460566775 13.3087908951 0.556721819511 13.2436394283 28.8322801753 -7.96957270601 0.903024124192 -3.58996860299 28.8260651103 3.37602693957 -0.900889421371 0.372058010601 26.3486702707 -0.514308842373 0.579807988523 4.53384275874 22.1357503788 -0.93607930898 -2.02723958246 -6.73465497255 8.81746962875 0.0834273160661 0.08786829379 1 7 1 2 4 1 21 1 3 2 3 7 3 7 2 8 3 7 2 8 3 8 2 7 3 7 4 5 4 5 0 140.0 0.714285714286 58.0 0.724137931034 0.155714285714 0.159183673469 0.0404358600583 0.100137026239 0.0267434402332 0.0124492488925 0.00703206004035 -0.000237861114573 0.0654100922631 0.5 0.142857142857 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 5.0 0.181818181818 0.0 4.0 1.0 0.414285714286 0.75 0.5 0.333333333333 0.25 0.666666666667 0.916666666667 0.833333333333 0.916666666667 0.583333333333 0.333333333333 0.166666666667 0.416666666667 0.75 0.166666666667 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.75 0.25 0.75 1.0 0.75 0.5 0.25 0.25 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -6.59356192809 7.23018170046 -11.8063513821 18.9815332914 5.54072645907 2.3038026019 3.00776993772 27.3386424653 -2.14836919701 -0.428545067509 -0.857691388761 25.6552806575 0.0870438836673 0.276294450343 -2.27637994093 26.6209080758 1.18227163158 0.587960209617 5.99402391461 31.4264662858 -0.621353008205 0.245568991876 2.93387190707 35.0630299132 0.000556430491545 0.0743283047346 1 1 6 2 4 13 1 7 1 5 2 4 5 3 2 4 5 3 2 4 5 3 2 3 6 3 2 4 5 3 2 3 6 3 2 4 5 3 2 4 5 3 1 5 4 4 1 6 3 5 182.0 1.07692307692 102.0 0.56862745098 0.245290423862 0.261200338123 0.106409515494 0.0964713344861 0.0510127778272 0.0327306358718 0.00675509101534 0.0102538754437 -0.00541273773257 0.357142857143 0.923076923077 1.0 3.0 1.0 0.0 2.0 3.0 3.0 3.0 4.0 5.0 0.111111111111 0.0 1.0 2.0 0.56043956044 0.75 0.75 0.75 0.875 0.625 0.4375 0.375 0.5625 0.5625 0.0 0.0 0.125 0.75 0.75 0.75 0.875 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 1.0 0.75 0.5 0.5 0.25 0.25 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.45633840657 4.91106681541 -15.3931516892 13.3283851262 -6.68497161844 2.25786575243 -36.779214032 21.6002424009 1.59893095517 -0.1587193432 -31.5977418012 20.488545729 1.18062307697 -0.564286009116 -21.3095306453 16.3704799945 -0.51072558609 0.333754914043 -20.6339577882 18.9382236039 1.02503061206 0.700300650035 -11.8422450485 26.9116533449 0.183906754752 0.176976091456 4 2 12 6 11 6 12 5 13 4 13 4 13 3 14 3 14 3 14 3 3 4 7 5 3 3 6 4 4 4 5 4 5 3 5 4 5 4 3 4 6 4 3 4 6 4 3 4 6 3 5 3 6 3 5 3 6 3 4 4 5 5 1 6 5 13 4 6 1 2 9 5 391.0 0.739130434783 150.0 0.686666666667 0.164886414924 0.21605693317 0.0542110289515 0.142160449719 0.0675599769013 0.0199523189697 0.0237983656689 0.0208366975248 0.0960530200815 0.352941176471 0.608695652174 3.0 2.0 0.0 1.0 0.0 1.0 5.0 5.0 3.0 5.0 0.113636363636 2.0 0.0 2.0 0.383631713555 0.533333333333 0.4 0.466666666667 0.6 0.566666666667 0.5 0.566666666667 0.4 0.0 0.2 0.266666666667 0.266666666667 0.0 0.1 0.666666666667 0.733333333333 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.111111111111 0.333333333333 0.777777777778 0.888888888889 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.777777777778 1.0 0.888888888889 1.0 0.888888888889 0.666666666667 0.777777777778 1.0 0.888888888889 0.666666666667 0.222222222222 0.333333333333 0.222222222222 0.0 0.222222222222 0.444444444444 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.555555555556 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.888888888889 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.555555555556 0.555555555556 -9.18946801852 -10.29663284 -20.6715694623 -24.2049266366 2.60277915317 1.52951994624 -10.336044914 -16.0793848599 1.98029196245 3.43492741555 -3.49796239509 -1.28704680513 -3.99411320067 -2.46032161257 -22.5529954538 -5.78583074632 1.11967152424 2.46027300191 -21.2194294907 4.38231870619 0.14017860225 -0.972887402804 -19.5309958574 0.965921347382 -0.399395874445 -0.149943029383 8 1 2 7 3 10 3 4 2 4 4 3 3 3 3 3 4 3 4 1 5 4 2 2 5 8 6 6 7 6 8 4 9 4 10 2 12 1 12 1 11 1 12 1 11 2 10 3 8 5 7 5 10 1 10 0 286.0 0.590909090909 95.0 0.863157894737 0.134211941904 0.120311506675 0.0318642370393 0.0928325611012 0.0250772688117 0.00949149113567 0.00717057454525 0.00190063237212 0.071748036691 0.615384615385 0.318181818182 3.0 3.0 2.0 0.0 5.0 2.0 0.0 0.0 3.0 8.0 0.315789473684 0.0 4.0 1.0 0.332167832168 0.625 0.333333333333 0.0 0.333333333333 0.416666666667 0.833333333333 0.458333333333 0.5 0.375 0.625 0.291666666667 0.0 0.625 0.125 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.333333333333 0.5 0.666666666667 1.0 1.0 0.833333333333 0.166666666667 0.333333333333 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.5 0.333333333333 0.333333333333 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 -8.27605704078 13.1664543831 -16.0295677886 28.1638768368 4.80490088525 -3.95358336658 -6.10314980898 24.2372847633 -3.12383439583 5.37220221739 -9.10122019091 38.0988863076 2.55189241259 -2.29670046943 -4.98999248688 34.3450165586 -1.97026764369 0.804418592675 -6.8843686295 33.3282323178 1.86815962389 0.284631488346 -1.50064723999 38.5599761308 -0.322232895711 -0.0764104318363 7 2 7 3 4 12 3 6 2 22 2 5 4 4 4 4 3 3 6 3 5 4 1 4 6 2 6 4 2 3 5 3 6 4 2 3 6 2 6 4 2 2 6 3 7 3 2 2 6 3 7 3 2 2 7 2 6 4 1 4 5 3 6 9 4 6 3 5 3 1 5 1 13 0 322.0 1.64285714286 150.0 0.746666666667 0.23156899811 0.192768411713 0.175695004722 0.0484335047173 0.0534569502988 0.0806652154502 0.00898838930529 0.0183700218828 -0.0239367134037 0.521739130435 1.64285714286 4.0 1.0 2.0 2.0 2.0 6.0 6.0 6.0 2.0 18.0 0.112903225806 2.0 2.0 3.0 0.465838509317 0.708333333333 0.625 0.416666666667 0.541666666667 0.666666666667 0.125 0.125 0.166666666667 0.541666666667 0.5 0.458333333333 0.541666666667 0.75 0.375 0.25 0.333333333333 0.5 1.0 0.833333333333 0.5 0.5 0.5 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.166666666667 0.0 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.833333333333 1.0 0.833333333333 0.666666666667 0.833333333333 0.833333333333 0.833333333333 0.0 0.5 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.885731857207 12.9261492911 1.01413955336 28.1161481237 -2.84388574568 -4.89564633859 -15.8514387453 9.89808359768 -5.56086895356 -3.12181511037 -37.198866499 -7.5931120007 3.63420596869 2.67666865021 -25.5721104419 6.1834098535 -1.11248597356 0.515749202786 -22.1089395804 14.2946695975 0.242912843074 -0.34388852011 -30.9019580697 13.063819467 -0.476663267269 0.159017061653 3 2 5 3 4 4 3 16 1 4 4 3 5 3 5 4 4 3 5 3 5 3 5 3 5 4 4 5 1 1 3 5 128.0 0.5 66.0 0.621212121212 0.1904296875 0.24169921875 0.0292925834656 0.197188854218 0.0454039573669 0.00577784494936 0.0154308693727 0.0044702890237 0.207643846619 0.625 0.0625 0.0 0.0 3.0 2.0 0.0 0.0 0.0 1.0 3.0 7.0 0.0384615384615 0.0 2.0 1.0 0.515625 0.375 0.75 0.5 0.5 0.625 1.0 1.0 1.0 0.875 1.0 1.0 1.0 1.0 0.875 0.625 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -7.95774715459 3.89929610575 -13.939701107 9.30974535636 6.73548692757 0.0926331504715 1.79626469834 11.5816174545 -4.09489815251 1.25001325879 -6.40988324221 17.690676805 1.7962968733 0.8119103923 -3.51282287354 22.9578429833 -0.0605792932548 -0.707746341567 0.226363148208 15.5892037542 -0.590887309698 -1.15897818015 -6.59961018921 4.246739118 0.0260794856688 0.0218187350024 11 1 12 4 11 4 12 3 12 3 13 2 12 3 12 3 12 4 5 9 5 2 3 5 3 4 4 4 2 5 5 3 2 4 6 3 3 3 6 3 2 4 7 2 2 4 6 3 2 4 6 3 3 4 5 4 2 6 1 7 3 12 4 5 1 4 1 0 330.0 0.681818181818 134.0 0.641791044776 0.209494949495 0.243112947658 0.0653287976181 0.168438239141 0.0671223251802 0.017530647886 0.0180618871678 0.0124858313342 0.107442181559 0.733333333333 0.5 1.0 2.0 4.0 1.0 0.0 0.0 5.0 4.0 5.0 8.0 0.208333333333 0.0 2.0 2.0 0.406060606061 0.0 0.0416666666667 0.791666666667 0.791666666667 0.0 0.208333333333 0.375 0.541666666667 0.0833333333333 0.25 0.125 0.291666666667 0.708333333333 0.791666666667 0.791666666667 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -2.43073003995 -14.2371330911 -7.47178286015 -35.3319680396 -0.861660796334 0.0251108475201 -1.16671673602 -25.9222437868 7.05514905568 9.67450988481 22.6620973342 19.9577279346 -4.63207909279 -0.868546838486 9.99558634521 31.1643057911 1.88333199915 0.875107499933 9.38171189208 28.9173735922 -0.920707874976 -1.14498000555 9.51602142704 25.0927619032 0.077755994623 0.261288699471 2 2 3 8 1 4 1 4 1 4 1 4 1 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 1 10 105.0 0.238095238095 72.0 0.444444444444 0.297142857143 0.331065759637 0.0170728862974 0.467189288414 0.0375898931001 0.000731967055131 -0.00290729614402 -0.00223456684203 1.04196853749 0.4 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 3.0 0.0 0.0 10.0 1.0 0.685714285714 0.416666666667 0.5 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.916666666667 0.666666666667 0.5 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -3.57719681616 2.42521818045 -5.648476245 5.96143972098 3.47037172964 0.326662040632 0.614947221799 8.50731392637 -3.03014570304 1.05674273537 -3.24199952294 14.2428684028 3.12370485549 0.676285412638 3.91356461591 17.7741213138 -2.29119071933 -0.947408995501 0.410294714017 9.26380845239 1.79167234678 -1.05390165921 3.17728470799 -3.57200483232 -0.450159853319 -0.177518519048 7 1 1 1 6 9 3 11 1 4 4 4 1 3 5 4 1 3 9 3 10 3 10 3 10 4 10 3 10 5 1 1 2 2 3 10 4 9 4 2 1 4 3 0 195.0 0.866666666667 89.0 0.696629213483 0.193688362919 0.217435897436 0.0689727068899 0.116072624286 0.0463007130936 0.0224423193389 0.0149364704452 0.0071067212352 0.0491118669638 0.692307692308 0.4 0.0 3.0 3.0 3.0 1.0 2.0 0.0 2.0 3.0 7.0 0.307692307692 0.0 2.0 1.0 0.45641025641 0.375 0.75 0.8125 0.75 0.625 0.25 0.0625 0.5625 0.6875 0.125 0.0 0.3125 0.75 0.5 0.0 0.3125 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.8649774484 1.27323954474 -26.8559479496 8.41961667393 -0.860144047999 8.17815906689 -29.5261854394 37.7392430621 1.80787859321 1.18355317996 -18.5129735017 44.9786508196 0.423188039865 -2.86833452221 -12.3292696035 25.8796795966 0.298699738241 -0.488677628 -8.04213448027 15.3672766019 0.706664862127 -0.665508060644 0.559921860628 4.82164910686 0.24401696515 -0.544135268864 1 1 5 9 6 9 6 9 6 11 4 11 4 11 4 11 4 11 4 3 3 5 4 2 5 4 5 3 4 3 4 5 3 3 4 5 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 4 2 3 6 3 2 5 5 10 3 12 5 4 330.0 0.681818181818 146.0 0.561643835616 0.179393939394 0.235261707989 0.0530438266967 0.157775996883 0.0665098923115 0.0184384186675 0.0203495774304 0.0185878098143 0.116089030382 0.333333333333 0.636363636364 2.0 1.0 0.0 0.0 0.0 2.0 5.0 5.0 4.0 4.0 0.159090909091 2.0 0.0 2.0 0.442424242424 0.791666666667 0.5 0.5 0.625 0.75 0.791666666667 0.666666666667 0.583333333333 0.0 0.166666666667 0.0416666666667 0.0416666666667 0.0 0.416666666667 0.541666666667 0.583333333333 0.833333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -9.20204943695 -7.49475095651 -20.6829384057 -19.6907133068 2.65349913009 -1.47872998027 -9.93104081365 -19.2799111274 2.26371029245 5.14856595807 -1.1643673958 1.63139247882 -3.57636958707 -1.67924133959 -16.2898762342 3.7563982845 1.92107404553 2.03971962476 -5.9307392943 13.8336116212 1.09322016225 0.0992129566142 3.42225565727 20.3259062626 -0.581455689498 0.0864320639053 5 6 1 4 4 12 3 3 4 6 3 2 5 4 4 3 6 2 5 3 6 2 5 3 6 2 6 3 4 3 6 9 7 4 2 1 8 4 12 4 13 10 6 11 5 5 2 5 2 4 7 3 2 4 7 3 1 4 8 3 2 4 7 2 4 4 3 1 1 4 4 11 6 9 3 0 352.0 0.727272727273 167.0 0.712574850299 0.225674715909 0.231534090909 0.0633206270764 0.143045472705 0.053394916629 0.0155208528768 0.014668027526 0.00607933730871 0.0673102712311 1.625 0.681818181818 2.0 9.0 11.0 4.0 4.0 4.0 2.0 5.0 4.0 18.0 0.132352941176 0.0 4.0 1.0 0.474431818182 0.25 0.375 0.416666666667 0.666666666667 0.583333333333 0.75 0.833333333333 0.583333333333 0.333333333333 0.25 0.416666666667 0.208333333333 0.708333333333 0.458333333333 0.5 0.458333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.166666666667 0.5 0.166666666667 0.166666666667 0.333333333333 0.0 0.666666666667 0.166666666667 0.666666666667 1.0 0.666666666667 0.666666666667 0.833333333333 0.5 0.833333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.833333333333 1.0 1.0 1.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.5 0.833333333333 0.666666666667 1.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.5 0.333333333333 1.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.333333333333 0.833333333333 0.166666666667 -10.4752889817 -3.47247148564 -22.0133199073 -5.72133553014 4.43983699249 4.51421293133 -9.9835470134 15.2343938811 -0.701868446841 6.87172721091 -5.64223008742 60.1661390873 1.12059065929 4.68713401508 2.15823977013 87.9325314867 1.309239354 -2.85202889846 10.6899953013 79.2885340648 -1.38570264229 1.55538435361 3.00408241569 72.955462165 0.211103262224 -0.924212908713 13 1 6 1 2 30 1 6 2 1 1 11 2 6 5 7 5 6 6 5 6 6 7 4 7 4 10 1 8 4 20 3 19 4 19 4 19 4 20 3 19 4 20 4 18 5 18 5 19 4 18 5 18 5 14 12 11 10 19 1 11 0 529.0 1.0 166.0 0.680722891566 0.143420728199 0.118846059012 0.0614091897675 0.06133989576 0.0370035606703 0.0234688854323 0.0148020360425 0.0070671132877 0.0243238399306 0.521739130435 0.521739130435 0.0 8.0 3.0 0.0 8.0 4.0 0.0 0.0 2.0 15.0 0.05 3.0 3.0 1.0 0.313799621928 0.638888888889 0.138888888889 0.0 0.0277777777778 0.583333333333 0.333333333333 0.277777777778 0.416666666667 0.638888888889 0.527777777778 0.555555555556 0.722222222222 0.388888888889 0.0 0.0 0.0555555555556 0.666666666667 1.0 0.777777777778 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 0.777777777778 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.555555555556 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.444444444444 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.888888888889 0.555555555556 0.555555555556 0.555555555556 0.444444444444 0.555555555556 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.444444444444 0.666666666667 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 -6.91978013443 4.20722632173 -12.1517133478 14.6869811723 5.52263859077 7.06157676327 -0.476709835346 41.9681267073 -3.40663218357 3.19597350396 -0.805341414761 65.6108245071 4.79627534099 2.70901215666 15.0684279253 82.4967764496 -2.23141268169 -0.260268369793 15.719450053 82.7074021254 1.95494928815 -0.398698958124 19.2714381789 77.0933942395 -0.44008909828 0.0589632425815 2 4 6 8 2 3 2 5 1 3 3 4 2 1 5 3 8 3 8 4 3 1 1 5 3 9 1 3 3 3 1 4 3 8 1 17 1 4 3 3 154.0 0.785714285714 95.0 0.536842105263 0.300472255018 0.31586270872 0.0820819634068 0.147898673261 0.0613156661183 0.01255928056 0.00133736415055 0.00478648379501 0.0155395624152 1.09090909091 0.571428571429 2.0 2.0 4.0 0.0 1.0 2.0 2.0 2.0 9.0 10.0 0.268292682927 0.0 3.0 2.0 0.616883116883 0.75 0.333333333333 0.25 0.916666666667 0.666666666667 0.0833333333333 0.5 0.75 0.666666666667 0.0833333333333 0.416666666667 0.416666666667 0.75 0.75 0.833333333333 0.833333333333 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.25 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.00040249943 -2.13722352152 -6.30803465687 -2.90871241441 -5.40337991926 3.4427116626 -22.3471587643 9.37436826478 1.66392056512 0.846761209322 -19.6867149802 14.7658337307 -0.564788656895 -1.19122158928 -19.3254431912 7.14661741452 -0.22076821474 -0.380139101568 -21.702098276 0.943762316154 0.218218825338 -0.571190296876 -20.3457753592 -7.16544838157 -0.0403604298932 -0.334692676581 3 1 6 2 5 4 3 7 1 13 1 1 2 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 4 4 6 4 1 0 128.0 0.5 61.0 0.688524590164 0.1591796875 0.2197265625 0.0235247612 0.178342819214 0.0381441116333 0.00458671179017 0.0119885103741 0.00292158924573 0.192022561736 0.375 0.0625 0.0 0.0 2.0 1.0 0.0 1.0 0.0 0.0 2.0 7.0 0.115384615385 1.0 2.0 1.0 0.4765625 0.375 0.875 0.5 0.5 0.625 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.75 0.875 0.5 0.5 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -8.75352187005 4.77464829276 -15.9155007128 10.8673031538 6.77900585732 -0.824372869296 0.745032500442 9.50213693322 -3.36916171462 0.715497832543 -4.27619729765 12.8627467397 1.57465989092 1.15654189232 -1.95255814749 19.434801874 -0.293766584427 -0.693381312413 -1.15630646598 14.4734271479 -0.687028950782 -0.647858225872 -7.57078378159 6.68810296131 0.159250332709 -0.00799067544278 3 2 3 4 4 13 2 6 3 4 3 4 5 3 3 4 5 3 3 4 6 2 3 4 6 2 3 3 6 3 3 3 7 2 3 3 6 3 3 3 6 4 1 5 4 11 4 5 1 3 11 0 210.0 1.07142857143 103.0 0.699029126214 0.228571428571 0.215986394558 0.104023323615 0.085598207537 0.0501554907677 0.0368807133302 0.00923344698173 0.0125025164086 -0.000386273990876 0.333333333333 0.857142857143 1.0 1.0 0.0 2.0 2.0 3.0 3.0 3.0 3.0 5.0 0.242424242424 0.0 1.0 2.0 0.490476190476 0.5625 0.5 0.5 0.6875 0.8125 0.75 0.5625 0.625 0.4375 0.0 0.0 0.0 0.75 0.375 0.375 0.625 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 0.75 0.5 0.5 0.5 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.39530545263 6.2388737692 -9.58402082341 17.1595345135 -2.00096668008 3.1785717879 -16.0196462174 28.3967047804 0.758066914193 -0.61089090216 -12.7165433041 23.8802382923 0.201604202259 -1.74413100211 -11.703306037 10.9130478612 -1.20854852141 -0.105562545392 -22.7478234012 8.79661619043 -1.29214224172 0.920714277759 -38.6839023895 18.2911646406 -0.273823723232 0.184601472439 5 5 5 8 4 2 3 4 1 3 5 2 2 3 5 7 8 4 9 3 9 2 10 3 10 3 4 2 3 4 1 3 5 6 7 4 10 1 5 0 180.0 0.8 69.0 0.927536231884 0.160648148148 0.16 0.0539525034294 0.092012345679 0.0363641975309 0.0186472756921 0.0138347018525 0.00562142070632 0.0450942369213 0.75 0.333333333333 0.0 3.0 3.0 3.0 1.0 2.0 0.0 1.0 2.0 10.0 0.285714285714 1.0 2.0 1.0 0.383333333333 0.166666666667 0.833333333333 0.75 0.333333333333 0.5 0.666666666667 0.583333333333 0.833333333333 0.5 0.0 0.0 0.5 0.583333333333 0.0 0.0 0.416666666667 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -8.82779417683 5.60225399683 -19.3249744527 19.9505095816 3.10104564673 9.55891661763 -8.13324205459 52.5772504494 1.75576694211 -0.456379353655 2.02114646251 53.6082743911 -1.66638066831 -1.6542671127 -5.61331529795 43.246800882 0.44226211854 1.83121515604 -2.42246219043 53.1712935014 1.42694195014 0.156400997711 11.9986767278 59.114312668 0.0788433221802 0.127145926474 5 1 8 8 3 9 2 4 3 4 2 2 5 3 9 3 8 4 6 6 4 2 3 2 3 4 3 2 3 3 3 4 2 3 3 5 1 4 2 5 1 4 4 3 2 1 7 1 1 0 180.0 0.8 87.0 0.908045977011 0.240277777778 0.23037037037 0.0775478395062 0.118538408779 0.061066872428 0.0188010949708 0.0118445791997 0.0111226974904 0.0304454497787 0.833333333333 0.6 2.0 4.0 3.0 1.0 0.0 2.0 2.0 3.0 1.0 8.0 0.30303030303 0.0 2.0 1.0 0.483333333333 0.5 0.416666666667 0.166666666667 0.666666666667 0.666666666667 0.25 0.416666666667 0.833333333333 0.583333333333 0.0 0.333333333333 0.166666666667 0.666666666667 0.5 0.583333333333 0.583333333333 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.25 0.75 0.5 0.5 1.0 1.0 0.75 0.5 0.75 1.0 0.75 -2.12206590789 3.48018808894 -9.02571301126 10.9885360694 -5.34307901395 4.18188454915 -24.5848554483 27.3167347256 1.86390532491 1.18217829084 -22.3893863042 32.4531312423 -1.68429770916 -1.36148477234 -29.4331657557 27.3064804528 -1.08677390932 1.18298139659 -43.7206848096 30.3843405094 -1.3954354491 -0.513297054821 -59.7001238725 32.1391604563 -0.38578892276 0.252493633652 1 3 4 5 3 7 2 5 2 6 4 4 3 5 5 3 3 4 6 3 4 3 6 3 3 4 6 3 3 4 6 3 3 4 6 3 3 4 6 3 3 4 6 3 2 6 4 11 4 6 1 0 208.0 1.23076923077 109.0 0.550458715596 0.220552884615 0.243343195266 0.111312567564 0.084375977896 0.0512208586994 0.0392984343452 0.00935644799203 0.0131665362005 -0.00627926334608 0.25 1.0 2.0 0.0 2.0 0.0 3.0 3.0 3.0 3.0 2.0 2.0 0.233333333333 0.0 0.0 2.0 0.524038461538 0.875 0.6875 0.75 0.875 0.6875 0.5625 0.5 0.5625 0.25 0.0 0.0 0.0625 0.8125 0.5 0.5 0.6875 0.75 1.0 0.75 0.5 0.25 0.25 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.89401450008 5.09295817894 -17.0146600793 13.6568993527 -6.96194078703 1.91483290907 -35.2961951314 19.2727047857 5.18521369584 -1.70345525028 -13.339863885 8.79484685841 1.30126318243 -1.82064239958 0.592900876289 -4.7296991079 -1.37861947714 0.296254586368 -4.76953723151 -3.86551608147 1.61264352472 0.683764144457 6.7153418892 2.91898797594 0.124118740959 -0.0347434633816 1 3 4 4 1 6 3 3 2 5 4 3 1 4 5 3 1 4 5 3 2 2 6 3 1 3 6 3 2 3 5 3 2 3 5 3 1 3 6 3 1 4 5 2 1 5 4 4 1 4 4 2 2 0 169.0 1.0 88.0 0.613636363636 0.243513882567 0.232134729176 0.109077446404 0.0957580877967 0.0512062938476 0.0384999662539 0.007492575199 0.0106465756684 0.00113080133047 0.384615384615 1.0 3.0 2.0 4294967294.0 1.0 3.0 3.0 3.0 3.0 3.0 4.0 0.206896551724 0.0 0.0 2.0 0.520710059172 0.8125 0.6875 0.625 0.8125 0.5625 0.375 0.375 0.4375 0.1875 0.0 0.0 0.125 0.75 0.75 0.75 0.6875 0.75 0.75 0.5 0.5 0.25 0.25 0.25 0.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.5 1.0 0.75 0.5 0.25 0.0 0.25 0.5 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.979415034412 1.37118104818 -4.02976930076 4.42029462806 -2.54763816052 1.80583269067 -13.221053775 11.8073298464 -0.387136587987 1.03230708123 -16.011031127 18.0039591688 0.43423790595 0.242128119498 -13.6250012336 20.1742489552 -0.269075045902 0.0520041625399 -13.8228510123 20.3653767601 0.354008757975 -0.0303911262232 -9.9591308574 19.465878247 0.14833175276 -0.0684605638852 4 5 2 3 3 13 2 3 3 7 2 2 5 5 2 3 5 3 4 3 5 3 4 3 5 3 5 3 3 3 6 3 3 3 7 3 1 2 8 3 12 4 11 8 7 8 7 11 3 4 4 4 3 3 7 3 1 3 8 3 1 3 8 2 2 3 8 2 3 4 1 6 5 9 4 0 330.0 0.681818181818 156.0 0.717948717949 0.204242424242 0.220247933884 0.0532567827031 0.145281158694 0.0434641455881 0.0133630646937 0.0116989800498 0.00476483020558 0.088096522502 1.53333333333 0.681818181818 2.0 6.0 8.0 3.0 4.0 5.0 1.0 5.0 3.0 11.0 0.25 1.0 3.0 1.0 0.472727272727 0.5 0.541666666667 0.541666666667 0.75 0.5 0.458333333333 0.791666666667 0.25 0.5 0.333333333333 0.541666666667 0.208333333333 0.833333333333 0.416666666667 0.416666666667 0.625 0.0 0.166666666667 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.666666666667 1.0 0.666666666667 0.333333333333 0.5 0.5 0.833333333333 0.666666666667 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.833333333333 0.166666666667 0.0 0.333333333333 0.666666666667 0.833333333333 1.0 0.5 0.666666666667 0.0 0.0 0.0 0.166666666667 0.5 1.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.333333333333 1.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.333333333333 0.5 0.333333333333 1.0 0.333333333333 -13.0796425959 2.25710646567 -27.6068094973 8.54325845634 4.88178790884 4.46506741547 -17.9489922713 24.518874488 -3.37996256997 1.83793763996 -23.5108003628 44.1869875389 1.70262889256 4.24663062512 -17.378427179 62.3239814161 0.895707384226 -3.0647171243 -6.40073830968 51.0299903376 -0.420455247922 0.781563240276 -10.88608976 39.0126935771 -0.182562751077 -0.860396968397 2 7 2 8 1 2 5 2 2 2 5 1 2 2 8 6 5 8 3 1 2 4 7 5 5 6 4 3 1 3 2 3 2 7 2 0 130.0 0.769230769231 70.0 0.785714285714 0.253846153846 0.251479289941 0.0746927628584 0.1365430132 0.0564588074647 0.0165166721105 0.00991028578211 0.0080515467726 0.0415035210643 1.4 0.461538461538 2.0 4.0 4.0 2.0 1.0 1.0 1.0 3.0 5.0 12.0 0.117647058824 1.0 3.0 2.0 0.538461538462 0.583333333333 0.583333333333 0.25 0.75 0.583333333333 0.666666666667 0.333333333333 0.5 0.5 0.5 0.333333333333 0.333333333333 0.75 0.416666666667 0.833333333333 0.75 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.75 0.75 0.75 1.0 1.0 0.75 0.25 0.0 1.0 0.5 0.25 0.5 0.75 1.0 0.75 0.25 1.0 0.5 0.0 0.0 0.5 1.0 0.75 0.25 1.0 0.5 0.0 0.0 0.5 1.0 0.5 0.0 1.0 0.5 0.0 0.0 0.5 1.0 0.75 0.25 1.0 0.75 0.25 0.0 0.25 0.75 1.0 0.75 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 -2.84030359979 -0.0979415034412 -9.43684944981 0.815001347174 -3.441861473 2.3708798259 -18.641412785 14.1714810936 2.33576477408 4.31997095457 -9.25020096702 33.1781193989 0.649456978299 -1.39583607327 -0.0292588630448 32.3107356361 0.215777162768 1.07714248471 0.0698843597522 35.3271768256 -0.468688955291 0.16401405298 0.380339567551 42.9838362071 0.370828427111 0.411289906119 2 3 2 4 1 5 2 4 2 4 2 4 3 3 2 4 3 3 3 3 3 3 3 3 2 3 4 2 4 2 4 2 4 2 4 2 3 4 2 4 1 12 132.0 0.272727272727 76.0 0.618421052632 0.246212121212 0.276170798898 0.0180745992988 0.41559012995 0.0495424284164 0.00116753203261 0.0113733877198 0.00114829893625 0.774261847888 0.833333333333 0.0 1.0 3.0 0.0 1.0 0.0 0.0 0.0 0.0 5.0 3.0 0.0 0.0 11.0 1.0 0.575757575758 0.5 0.166666666667 0.0833333333333 0.333333333333 0.916666666667 0.666666666667 0.583333333333 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.75 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -4.02227947087 2.17029467853 -7.49896838826 4.68301495898 2.53918498614 -0.129500227925 -3.11988276146 9.00546653065 -2.1307804228 3.63884641504 -4.98276973965 24.592164446 2.29963264734 -0.0826641556352 -0.174834304966 29.4466052818 -1.86048466051 -0.0438461000407 -2.50015809341 24.0132508333 1.76818778588 -1.27602700932 1.57819968763 12.2213333056 -0.432228405492 -0.221585503753 8 3 7 8 4 4 1 4 4 2 10 4 9 4 9 3 10 3 9 4 7 9 5 8 7 4 9 3 11 3 9 3 10 4 9 4 10 2 11 3 9 5 7 7 5 4 2 1 5 0 286.0 0.590909090909 99.0 0.777777777778 0.136632598171 0.160680228862 0.0278702909883 0.134274907693 0.0337331625292 0.0069049712513 0.0142015116044 0.00205935249928 0.116946436401 1.0 0.0909090909091 2.0 2.0 9.0 0.0 1.0 0.0 0.0 0.0 2.0 4.0 0.382352941176 0.0 7.0 1.0 0.346153846154 0.0833333333333 0.5 0.291666666667 0.208333333333 0.625 0.875 0.875 0.875 0.458333333333 0.291666666667 0.25 0.333333333333 0.416666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.166666666667 0.5 0.666666666667 1.0 0.666666666667 0.333333333333 0.5 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.5 0.833333333333 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.5 0.333333333333 0.0 0.666666666667 0.5 0.166666666667 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -11.2276578036 4.716773768 -17.9572213537 12.2403361165 11.830557295 2.07062852896 11.008395628 24.6600650545 -6.39963635994 3.76044848589 -0.273554381903 40.8814532369 3.11312981605 -0.488767850679 3.89591724893 44.0418235956 -0.6820684152 0.207933523104 8.67045990653 34.6957823309 0.182598650616 -2.74224392113 5.46117996136 17.8237535257 -0.0314375277819 0.515746019373 1 5 3 7 7 5 4 1 3 3 3 3 4 1 4 1 1 1 15 1 3 9 3 9 4 8 4 8 4 6 1 1 6 3 3 1 5 2 3 4 7 7 1 1 1 4 0 180.0 0.8 89.0 0.707865168539 0.201851851852 0.223703703704 0.0629602194787 0.112384087791 0.040585733882 0.0182579182113 0.00919705449284 0.00613506936623 0.0459016280944 1.0 0.533333333333 0.0 4.0 5.0 3.0 1.0 3.0 0.0 2.0 5.0 10.0 0.194444444444 0.0 3.0 1.0 0.494444444444 0.0833333333333 0.75 1.0 0.916666666667 0.583333333333 0.833333333333 0.5 0.833333333333 0.75 0.5 0.0 0.333333333333 0.666666666667 0.5 0.0 0.0833333333333 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.75 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.25 0.75 1.0 0.75 0.5 0.75 0.5 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 1.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.75 0.75 0.5 0.5 0.75 0.5 0.0 0.0 -11.6713624934 6.53596299631 -27.6712696064 18.2624866252 0.884477070409 4.15924917947 -23.8879089402 35.7780865333 2.5349308592 1.92331059512 -7.39824687065 43.151058343 0.856004569837 -2.23530244662 2.63614361882 27.9215862875 0.669747443024 -1.19820402408 8.49184805834 17.0666201021 -0.0621347160907 1.25407978054 8.74241327405 25.0309483482 -0.0420674190035 -0.0756569736602 1 3 1 8 3 2 4 1 11 1 5 2 2 3 3 7 5 6 4 8 4 7 3 8 3 8 4 7 4 6 6 6 4 5 0 154.0 0.785714285714 66.0 0.787878787879 0.150531286895 0.184601113173 0.0377281050877 0.103617920282 0.0309063090729 0.0107679363434 0.00794103357442 0.000519670733307 0.0633164970407 0.545454545455 0.142857142857 2.0 0.0 4.0 0.0 1.0 1.0 0.0 0.0 0.0 4.0 0.173913043478 0.0 2.0 1.0 0.428571428571 0.583333333333 0.583333333333 0.416666666667 0.416666666667 0.75 1.0 1.0 1.0 0.5 0.5 0.416666666667 0.666666666667 0.583333333333 0.0833333333333 0.0 0.0833333333333 0.25 0.75 0.75 0.25 0.25 0.5 0.25 0.0 0.5 1.0 1.0 0.75 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.75 0.75 0.75 0.75 0.25 0.75 0.75 0.25 0.25 0.25 0.25 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -10.7315904485 4.77464829276 -21.1003742244 12.8669576485 6.5434490014 2.01078118335 -3.12986229874 19.7759582353 -1.70799664548 -0.722951409628 -3.63901671992 15.0917960543 -0.457282992516 -0.972794453922 -9.69862429367 8.83447924186 0.371124476742 0.650346214764 -6.51442892385 11.291498484 0.0755437484346 -0.24076918729 -4.47225066948 8.80820026664 0.112268088607 -0.290028380656 6 5 6 9 3 10 2 11 1 12 1 11 2 3 9 4 10 3 10 4 9 5 6 1 2 6 2 3 2 11 4 7 10 1 4 0 195.0 0.866666666667 106.0 0.547169811321 0.259171597633 0.228034188034 0.0805105952562 0.100079367488 0.043832296566 0.0181379569115 0.00876362079664 0.002511619712 0.00616937293441 0.692307692308 0.133333333333 0.0 2.0 3.0 3.0 0.0 0.0 0.0 1.0 2.0 9.0 0.3 0.0 3.0 1.0 0.54358974359 0.1875 0.6875 0.8125 0.625 0.75 0.8125 0.3125 0.8125 1.0 0.75 0.0 0.375 0.875 0.6875 0.0 0.5 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -8.82779417683 9.08244208578 -19.1829596469 24.8581001286 3.0965185728 4.59271650892 -9.399632851 42.3835537654 0.717155579357 0.4310864239 -2.37886941938 43.5740245834 -0.492391835594 -1.62568871958 -3.27938036032 29.1869896372 0.761509091666 -1.77480855671 0.487601755628 10.9233569816 -0.408387338222 -0.802394743516 -1.33358389869 -1.18823555509 0.0164387140911 -0.234158168575 0 4 1 4 2 2 27 4 1 4 2 2 4 1 3 3 2 3 2 2 3 3 2 3 2 2 3 3 1 5 100.0 0.25 45.0 0.866666666667 0.156 0.243 0.011916 0.468004 0.051392 0.001417104 0.027149376 0.004404848 0.936629592 1.8 214748364.55 2.0 2.0 1.0 4.0 4294967294.0 4294967293.0 0.0 0.0 3.0 0.0 0.210526315789 1.0 5.0 1.0 0.45 0.5 0.2 0.6 0.5 0.6 0.2 0.9 1.0 0.5 0.2 0.8 0.9 0.2 0.1 0.3 0.4 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -3.24676083907 -3.53323973664 -5.27203562064 -5.33373479851 2.85380728458 4.93054055952 -1.22565061734 12.7319792077 -3.34484405163 1.93059919562 -7.84195732915 26.4929738243 2.78155177101 0.244585146187 -2.23931069189 31.032846401 -2.16863118223 0.892132219637 -7.2461718182 34.7814847258 1.20983334106 -1.02135292415 -6.73812038117 26.4084158722 -0.270626949387 -0.12531410941 0 4 2 4 1 17 2 3 2 4 3 1 3 3 8 3 8 3 8 3 8 3 8 3 8 4 6 5 6 6 6 2 1 1 5 0 154.0 0.785714285714 69.0 0.594202898551 0.159386068477 0.170222634508 0.0422762429003 0.101467199523 0.0254072542401 0.0129813588717 0.00738567874588 -0.00128555123627 0.057491339133 0.272727272727 0.285714285714 1.0 0.0 2.0 0.0 2.0 1.0 0.0 0.0 1.0 6.0 0.2 0.0 2.0 1.0 0.448051948052 0.833333333333 0.333333333333 0.333333333333 0.5 0.916666666667 1.0 1.0 1.0 0.666666666667 0.416666666667 0.333333333333 0.666666666667 0.583333333333 0.0 0.0 0.0833333333333 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -10.0040249943 3.68330011156 -19.6555994867 11.1229700383 6.16853006841 3.36383020392 -2.50728742294 23.0119566324 -1.57553640011 -0.0321089202885 -3.61696207147 23.5999182508 -0.736693943638 -0.659686401539 -9.55698884792 18.0293780904 1.02029741776 -0.212514400615 -3.0070607884 13.7848231118 -0.14472342453 -0.580160560136 -1.25553876174 6.77674697401 0.051638673549 -0.213008527053 5 2 1 4 7 2 3 3 5 3 5 3 3 4 6 2 2 5 6 3 1 4 7 3 1 4 7 3 2 3 7 4 1 3 7 4 1 3 7 3 3 3 5 2 6 3 3 3 8 5 5 0 195.0 1.15384615385 81.0 0.83950617284 0.189401709402 0.188954635108 0.100935484415 0.0705951212933 0.0501551273622 0.041865645185 0.0118934781253 0.0146770890845 0.00505182160225 0.4 0.923076923077 0.0 2.0 2.0 0.0 3.0 3.0 3.0 3.0 1.0 7.0 0.264705882353 0.0 1.0 2.0 0.415384615385 0.3125 0.9375 0.8125 0.375 0.5 0.375 0.25 0.5 0.25 0.0 0.0 0.3125 0.6875 0.5 0.5 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.24413181578 4.75342763368 -15.7942746384 14.7596871497 -8.02197501607 5.0386332917 -41.3213088957 32.9701375611 2.10500554593 0.214013228629 -32.6630415318 33.3918743556 2.49156080157 -2.24445484877 -15.0266683494 17.3253111646 -1.23818404077 -0.539578511941 -16.9171225239 9.24651085006 1.43534407616 0.0401438017976 -3.63403720465 6.697940908 0.480426034439 -0.298562127369 2 3 2 4 1 12 2 7 1 1 3 3 9 3 10 2 10 2 22 1 11 2 10 2 9 5 6 6 5 0 156.0 0.923076923077 53.0 0.811320754717 0.130341880342 0.120315581854 0.0451330939497 0.0720890439825 0.0223273740286 0.0166248634955 0.00908135936019 0.000672431240824 0.0403022205049 0.5 0.0769230769231 2.0 3.0 1.0 0.0 2.0 0.0 4294967295.0 0.0 1.0 5.0 0.15 2.0 1.0 1.0 0.339743589744 0.5 0.166666666667 0.0 0.25 1.0 0.833333333333 0.416666666667 0.833333333333 0.666666666667 0.333333333333 0.166666666667 0.666666666667 0.666666666667 0.0 0.0 0.166666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.00281749604 4.60325066173 -15.1715282876 13.1955391157 2.57690470444 3.35840835764 -6.68744550061 26.6903324282 0.78449391933 1.3072641096 -0.553793245298 33.9484800719 -0.692765687639 -0.119001849925 -2.32050520741 34.1927262218 0.954625283473 0.481373698817 3.98741304602 38.5972691655 0.22164228479 0.909178837971 6.96080144861 47.3332967555 -0.130733081694 0.0430991474918 0 1 1 2 3 26 1 5 3 1 4 2 9 2 9 2 8 3 9 2 8 3 8 3 8 4 6 6 4 0 143.0 0.846153846154 62.0 0.612903225806 0.167196439924 0.15653577192 0.0518998826007 0.089824694353 0.024588204597 0.0171905869401 0.00716586245565 -0.00169913282864 0.0445757890697 0.454545454545 0.230769230769 1.0 2.0 2.0 0.0 2.0 1.0 0.0 0.0 4.0 3.0 0.0416666666667 0.0 7.0 1.0 0.433566433566 0.833333333333 0.166666666667 0.166666666667 0.416666666667 0.916666666667 0.75 0.833333333333 1.0 0.666666666667 0.416666666667 0.333333333333 0.583333333333 0.666666666667 0.0 0.0 0.0833333333333 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.25 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.73737877185 5.19089968238 -15.5958189264 14.471867054 4.14599713383 3.10283319186 -4.80301303851 26.8187883888 -1.59371925993 0.986619792604 -8.20782342351 32.3575797525 -0.796497341633 -0.127836433835 -14.8464269136 31.0334619989 0.47007735674 -0.277165435691 -13.6227330372 27.4385022789 -0.69012286146 -0.2897606519 -18.0767064786 22.7123950147 -0.00126939911881 -0.18032652224 5 3 9 6 5 3 2 6 1 4 4 4 1 4 1 6 2 10 2 8 5 3 10 3 10 3 10 4 10 3 11 5 1 3 5 7 8 1 7 0 195.0 0.866666666667 86.0 0.755813953488 0.171203155819 0.18188034188 0.0570170097271 0.085117550869 0.0317674943947 0.0181512605263 0.00726769521118 0.00388112420829 0.0336154412866 0.923076923077 0.266666666667 0.0 4.0 6.0 2.0 1.0 2.0 0.0 1.0 3.0 11.0 0.176470588235 1.0 3.0 1.0 0.441025641026 0.3125 0.8125 0.8125 0.75 0.5625 0.8125 0.25 0.375 0.625 0.6875 0.125 0.1875 0.5625 0.5625 0.0 0.125 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.75 0.75 0.5 0.5 0.75 1.0 0.5 0.0 1.0 0.5 0.0 0.25 0.75 1.0 0.5 0.0 1.0 0.75 0.25 0.5 1.0 1.0 0.5 0.0 0.75 1.0 0.5 0.5 1.0 0.75 0.25 0.0 -13.2416912652 9.16732472209 -32.0915456599 22.5582727418 -0.140339292042 1.51656976884 -32.4738991891 33.9608300808 2.11032066607 3.80384872502 -18.6530064603 46.9189590398 0.471998168595 -2.50531148126 -13.0225620007 31.5372354359 -0.294727608602 -2.21181533216 -13.2917218445 10.7986124561 0.612897609996 0.523380608701 -5.7997281253 6.76775039857 0.344391737123 -0.585617412045 6 5 5 8 4 2 1 1 1 3 3 2 10 2 10 2 9 3 9 3 7 5 7 5 8 4 9 3 9 3 9 2 10 2 10 2 10 3 9 3 9 3 8 5 6 7 5 0 252.0 0.571428571429 78.0 0.717948717949 0.102843915344 0.141534391534 0.0217810926546 0.133421604238 0.0201505242015 0.00709679526593 0.00988928187269 -8.96646196389e-05 0.133074688393 0.416666666667 0.0952380952381 2.0 2.0 1.0 0.0 2.0 0.0 0.0 0.0 1.0 7.0 0.233333333333 0.0 2.0 2.0 0.309523809524 0.0 0.555555555556 0.388888888889 0.5 0.444444444444 0.944444444444 0.833333333333 0.944444444444 0.5 0.333333333333 0.166666666667 0.444444444444 0.388888888889 0.0 0.0 0.0555555555556 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.666666666667 0.5 0.5 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.5 0.5 0.5 0.166666666667 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 -12.095775675 3.15278363458 -21.0975616823 8.33930229525 10.8943027907 1.61186269544 7.98003904289 17.8941358042 -4.29566166966 3.32124115668 0.393144367094 35.0937362224 0.340637794174 0.854004636093 -3.54656696904 42.425924287 1.33995717727 -0.756479036722 6.31069330766 35.2907992655 -0.980001414491 -0.81650776049 1.32904108011 23.5071048112 0.106753112335 -0.305564812284 1 10 1 5 2 2 6 2 7 1 5 3 4 4 3 4 3 5 2 12 2 11 3 3 2 7 3 2 2 7 3 3 1 6 4 2 2 7 2 3 2 7 2 3 3 5 4 3 2 5 3 1 0 196.0 1.0 73.0 1.05479452055 0.202988338192 0.165451895044 0.101314476749 0.0784149249037 0.0605426416714 0.0399025252989 0.0190250391526 0.0205513136115 0.0142296685678 0.571428571429 0.785714285714 2.0 2.0 0.0 3.0 2.0 2.0 3.0 3.0 3.0 5.0 0.25 1.0 1.0 1.0 0.372448979592 0.5 0.1875 0.3125 0.4375 0.5625 0.375 0.1875 0.3125 0.4375 0.0 0.0 0.0 0.6875 0.625 0.625 0.625 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.5 1.0 0.25 0.75 1.0 1.0 0.5 0.0 0.25 0.5 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 3.50140874802 4.95653965629 6.14223300027 12.9456047247 -3.33204561616 1.51962810095 -4.22048401207 18.7451032104 0.36108390165 -0.0723948081119 -3.83460060788 18.438972851 1.40607349964 0.0862301776581 5.45081783229 18.4637045756 -0.102356304862 0.212481537108 8.47761400973 19.7247811527 0.642990844414 -0.0692666097575 13.4497388311 18.6265473904 -0.00513744050308 -0.0946506871035 4 1 7 2 6 3 5 5 3 8 2 5 1 1 3 3 6 2 7 2 7 3 6 3 5 4 6 3 6 4 5 7 3 6 144.0 0.5625 62.0 0.774193548387 0.172067901235 0.221354166667 0.0314264912337 0.179482542438 0.0572534882973 0.00659360431628 0.0236339595256 0.00902982856275 0.171099055342 0.555555555556 0.0625 1.0 0.0 2.0 2.0 0.0 1.0 0.0 0.0 0.0 5.0 0.230769230769 1.0 3.0 1.0 0.430555555556 0.25 0.666666666667 0.333333333333 0.416666666667 0.75 1.0 0.833333333333 1.0 0.416666666667 0.666666666667 0.166666666667 0.333333333333 0.0 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 -6.84366255295 0.676408508141 -11.8016899667 1.66959235802 6.08705487427 0.184489177197 2.93219888198 3.64838861091 -3.27055928238 1.39845967952 -2.29729794086 12.2647312319 1.7425479044 1.04675169323 0.54204476641 16.4604830496 -0.607044286422 -1.78915162419 0.0131025181703 4.8623172743 -0.358603194033 -0.134591835342 -4.13482306748 -1.78721106958 0.165900212648 -0.0877260903094 7 1 1 1 4 9 3 9 2 3 5 1 3 9 3 4 2 2 3 3 10 2 9 3 10 3 7 1 2 3 5 2 2 4 3 2 4 7 7 5 2 0 168.0 0.857142857143 74.0 0.891891891892 0.186011904762 0.196428571429 0.0621437935293 0.102944302721 0.0467244189342 0.01905119309 0.0162795020984 0.00918328321769 0.0434110455994 1.16666666667 0.428571428571 1.0 5.0 6.0 2.0 1.0 2.0 1.0 2.0 3.0 12.0 0.114285714286 0.0 3.0 1.0 0.440476190476 0.333333333333 0.75 0.833333333333 0.333333333333 0.666666666667 0.75 0.416666666667 0.833333333333 0.5 0.333333333333 0.0 0.5 0.583333333333 0.416666666667 0.0 0.25 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.75 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.5 1.0 0.5 0.5 0.75 0.25 0.0 0.0 0.5 1.0 0.5 0.5 0.5 0.0 0.0 0.0 0.75 1.0 0.5 0.5 0.75 0.25 0.0 0.0 0.75 1.0 0.5 0.5 1.0 0.5 0.0 0.0 -8.59436692696 4.41086556569 -20.2236154839 12.9250782421 0.973025993189 4.05868305313 -15.7573817576 31.676384068 2.28380288513 3.72971043916 -2.50677708193 48.9477747392 -0.112724661763 -1.64764407755 0.19882295862 37.9690575668 0.159681449407 -2.10562932581 1.22913036495 20.704927216 0.178414647572 1.20847930539 2.650264779 27.5535653532 -0.0182161089021 0.0836022982177 3 3 11 5 10 6 11 5 12 5 11 5 11 4 13 3 13 3 12 11 6 4 3 4 4 5 4 3 5 3 6 3 3 4 6 3 3 4 6 2 4 3 7 3 3 3 7 3 3 3 7 3 3 3 7 3 3 3 6 4 2 5 4 6 1 6 4 4 1 0 352.0 0.727272727273 137.0 0.700729927007 0.157492897727 0.209065082645 0.0495372287856 0.137998126666 0.0631965390728 0.0184976915779 0.023009744907 0.0191771229977 0.0978508407291 0.625 0.545454545455 4.0 3.0 2.0 1.0 0.0 0.0 5.0 5.0 1.0 6.0 0.2 0.0 1.0 2.0 0.389204545455 0.625 0.375 0.416666666667 0.541666666667 0.833333333333 0.875 0.791666666667 0.541666666667 0.0833333333333 0.25 0.0833333333333 0.0 0.0 0.291666666667 0.375 0.375 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.5 0.833333333333 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.666666666667 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.166666666667 0.0 0.166666666667 0.333333333333 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -10.7067870807 -8.1024334665 -23.4557593065 -21.8998661553 3.63437666441 -2.72153756932 -11.2587580051 -27.0347876681 1.13609933404 3.80882442 -4.69508735025 -14.6129406052 -2.47895910596 -2.49107233899 -15.7806984606 -17.8891176007 1.37190271114 1.99332554318 -9.60097942957 -13.4972674921 0.15598627634 -1.75933138392 -7.35343739631 -22.7142494233 -0.366676043947 -0.0182169214182 3 3 8 6 5 2 2 3 5 2 3 2 5 2 4 1 5 2 9 6 7 8 5 9 4 8 1 2 2 10 2 7 1 11 2 9 4 7 3 0 180.0 0.8 100.0 0.57 0.227777777778 0.308148148148 0.0576913580247 0.14544170096 0.062804526749 0.0111223064086 0.00642736456419 0.00768185970492 0.0592215929604 0.75 0.333333333333 3.0 4.0 2.0 0.0 1.0 2.0 0.0 1.0 7.0 8.0 0.0625 2.0 3.0 1.0 0.555555555556 0.416666666667 0.75 0.5 0.583333333333 0.583333333333 0.5 0.916666666667 0.583333333333 0.666666666667 0.25 0.916666666667 1.0 0.5 0.25 0.75 1.0 0.0 0.25 0.5 0.5 0.5 0.75 0.75 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.75 1.0 0.75 0.25 0.0 0.25 0.75 1.0 0.5 1.0 1.0 0.75 0.25 0.0 0.5 1.0 0.25 0.5 0.5 0.5 0.25 0.0 0.5 1.0 -11.0771840392 -6.11154981473 -27.7297120512 -9.61670671611 -1.76499295112 7.30669733405 -36.0651540772 13.0907076065 -0.398118427129 -0.395766863723 -35.5510147509 19.0679757816 0.506657726105 0.250592880275 -33.0676506335 18.290963496 -0.910020087502 0.137094925718 -42.2625947841 17.99998825 -1.96575181585 -0.774811695369 -62.4733206894 12.0110960499 -0.232539465425 0.0805133660272 1 8 2 3 3 4 1 3 4 3 1 2 6 2 9 2 8 3 8 3 4 2 2 3 2 3 3 3 1 3 4 3 1 3 3 4 1 5 3 7 7 0 143.0 0.846153846154 69.0 0.855072463768 0.2180546726 0.223238300161 0.0804088082684 0.11915640719 0.0482459005125 0.0229730679103 0.00755061789917 0.00991147827969 0.0378961752034 0.818181818182 0.615384615385 2.0 3.0 1.0 0.0 2.0 1.0 2.0 3.0 1.0 4.0 0.259259259259 1.0 1.0 1.0 0.482517482517 0.833333333333 0.166666666667 0.416666666667 1.0 0.416666666667 0.0 0.416666666667 0.583333333333 0.333333333333 0.0 0.0833333333333 0.166666666667 0.75 0.5 0.666666666667 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.25 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.25 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 -0.685590524088 -0.88147353097 -5.78136838078 -0.72354750081 -5.65278949447 2.12457722849 -22.2928666845 6.75698318695 1.662680558 0.435608390485 -21.9854107924 10.2347541665 -1.84437759609 -0.254769099867 -29.7386007065 8.77993090294 -0.83707584564 -0.0233716944043 -41.2779537865 6.38386742247 -0.552277946963 -0.707166526853 -44.6758614147 -0.609934543994 0.160124718061 -0.100950260281 5 2 8 8 3 3 3 4 1 3 4 4 1 3 2 11 4 1 2 3 10 2 9 3 10 3 10 2 10 3 4 2 3 9 5 5 8 1 1 1 4 0 180.0 0.8 73.0 0.945205479452 0.173148148148 0.173333333333 0.0591021947874 0.0973827160494 0.0404197530864 0.0201501533899 0.0141434418007 0.00705945166592 0.047264281081 1.0 0.4 1.0 4.0 5.0 2.0 1.0 3.0 0.0 1.0 6.0 10.0 0.21875 2.0 2.0 1.0 0.405555555556 0.25 0.833333333333 0.833333333333 0.416666666667 0.583333333333 0.666666666667 0.416666666667 0.833333333333 0.5 0.166666666667 0.0 0.333333333333 0.5 0.333333333333 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.75 0.75 0.25 0.0 0.25 0.25 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.75 0.5 0.75 0.5 0.0 0.0 0.0 -8.36093967709 7.29990672315 -19.1980486124 22.4857191901 1.58504176213 7.70734337746 -13.2893629502 52.3766212115 1.59272102089 2.42166598434 -4.26319209405 65.9556319864 -1.14432582348 -1.16672666093 -9.72314797455 59.467401538 -0.303730828645 0.39860578605 -13.0903744893 62.3504892839 0.437121757824 1.76551413634 -9.64937007093 80.4734198937 -0.0185402333322 0.317926280438 5 6 6 7 3 3 2 4 2 3 4 2 3 2 9 3 9 3 9 3 9 3 8 4 8 4 8 4 9 2 10 2 10 2 10 2 10 3 9 3 9 3 8 5 7 5 7 0 252.0 0.571428571429 78.0 0.679487179487 0.0912698412698 0.131897203326 0.0218523917504 0.12264819214 0.0108579587038 0.00846874020302 0.00397021434693 -0.0012532723106 0.12283530894 0.25 0.0952380952381 1.0 2.0 0.0 0.0 2.0 0.0 0.0 0.0 3.0 3.0 0.259259259259 0.0 1.0 1.0 0.309523809524 0.222222222222 0.777777777778 0.777777777778 0.777777777778 0.5 0.666666666667 0.444444444444 0.722222222222 0.388888888889 0.0 0.0 0.111111111111 0.388888888889 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.333333333333 0.833333333333 0.5 0.5 0.5 0.333333333333 0.0 0.166666666667 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 -14.1268959011 5.57800181503 -27.1455684963 14.2431542443 9.91081082619 1.39408800169 2.84147650038 20.8168149308 -1.07068972578 0.78020468873 4.53937291322 23.1849089648 -2.74401305992 -0.727392098474 -10.9566575205 17.266591053 2.332213466 -0.942501651832 1.07122442757 8.37951746331 -0.389638486349 -0.142527481112 1.881217647 3.52076555601 -0.189692115914 -0.216012068937 1 2 4 1 3 3 2 3 1 10 1 4 6 4 6 4 7 2 8 2 7 4 6 4 6 4 6 5 4 6 4 0 130.0 0.769230769231 58.0 0.672413793103 0.14 0.198224852071 0.033325443787 0.118445607647 0.0265088757396 0.00976617078729 0.00642004873304 -0.000131418980408 0.0849567235884 0.4 0.153846153846 2.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 6.0 0.173913043478 0.0 1.0 1.0 0.446153846154 0.75 0.583333333333 0.5 0.75 0.75 0.916666666667 0.833333333333 1.0 0.416666666667 0.25 0.166666666667 0.5 0.583333333333 0.0 0.0 0.0 0.5 0.75 0.75 0.5 0.5 0.25 0.0 0.25 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.0 0.5 0.75 0.5 0.5 0.25 0.0 0.25 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.0390041027 3.72177713076 -20.3719700305 10.7760530213 5.49718420646 2.77597515671 -3.58554931911 21.2829628289 0.0879573751799 0.621337523494 2.91399454524 25.9548876603 -0.447563560434 0.412202975551 0.404142331351 29.1176370802 0.598310579863 0.745544816788 2.93173906363 37.2658098191 -0.480620044088 1.21078221789 1.33453221504 50.3370009018 0.141826374468 0.204031005986 3 1 11 5 2 5 3 5 1 7 3 5 5 3 3 3 6 3 3 3 6 3 4 1 7 3 4 2 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 4 4 4 2 5 4 5 1 5 3 6 210.0 1.07142857143 99.0 0.737373737374 0.224761904762 0.232653061224 0.105148040168 0.096918691286 0.0647379332685 0.036925962777 0.013964138429 0.016771811418 0.00706985817405 0.4 0.928571428571 2.0 2.0 1.0 0.0 2.0 3.0 3.0 3.0 0.0 5.0 0.297297297297 0.0 1.0 2.0 0.471428571429 0.75 0.5 0.375 0.5625 0.5625 0.5 0.4375 0.625 0.4375 0.0 0.0 0.0 0.5625 0.5 0.5 0.625 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.25 0.5 0.75 0.75 0.5 0.25 0.25 0.5 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.59417845421 1.57032877184 -4.58204836667 4.46408464602 -4.47388081808 0.848260478915 -18.3021413075 6.01325811982 1.25420906726 -1.65402095538 -14.6745763825 -4.42241313874 0.548026817047 -2.06374424778 -11.4837728298 -20.0787649557 -1.64729120489 -0.532927891873 -22.8685542356 -27.7716308932 -0.251329384597 -0.469900615426 -31.087179315 -34.654718577 -0.336065888091 -0.304833956408 1 4 1 2 4 8 3 1 4 4 7 4 8 2 8 4 5 5 4 3 2 2 3 4 2 2 2 4 2 3 2 4 1 5 1 11 1 4 2 3 1 0 143.0 0.846153846154 79.0 0.632911392405 0.254926891291 0.284561592254 0.0740631562677 0.13957014671 0.0551900053587 0.0133425773491 0.00520620792145 0.00500552940563 0.0309748212081 1.0 0.538461538462 1.0 2.0 4.0 2.0 2.0 0.0 2.0 2.0 6.0 14.0 0.117647058824 1.0 3.0 2.0 0.552447552448 0.416666666667 0.0 0.5 0.916666666667 0.5 0.0833333333333 0.75 0.833333333333 0.583333333333 0.416666666667 0.5 0.583333333333 0.916666666667 0.916666666667 0.833333333333 0.916666666667 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.0 0.0 0.0 0.5 0.75 0.5 0.75 0.75 0.5 0.25 0.25 0.75 0.5 0.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.54647908947 -2.84030359979 -7.40011891344 -5.5250816046 -1.66674416507 2.25207504362 -12.2789537267 3.67470783352 0.544783967147 1.56923474137 -13.476468943 11.0758840171 -1.76385330526 -1.28824848197 -21.7614305066 5.81085499977 0.118388200537 0.0438096993243 -25.3827721796 -1.08102924982 -0.374560116967 -1.76041877066 -25.7960848512 -16.363751616 0.131045434007 -0.183651664189 1 3 2 4 1 4 1 4 22 1 2 10 2 3 2 3 2 3 2 2 3 2 3 2 3 2 3 3 2 3 1 8 1 1 1 1 2 0 115.0 0.217391304348 59.0 0.627118644068 0.245217391304 0.256332703214 0.0181566532424 0.502740856415 0.0583525930796 0.0016062761788 0.0172086792092 0.00253642054269 1.02470998263 1.4 186737708.391 1.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 3.0 10.0 0.037037037037 1.0 8.0 1.0 0.513043478261 0.333333333333 0.333333333333 0.166666666667 0.0833333333333 0.666666666667 0.416666666667 0.583333333333 0.583333333333 0.666666666667 0.416666666667 1.0 1.0 0.583333333333 0.333333333333 0.833333333333 0.75 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -1.82682195549 -0.332149446453 -3.32395159752 2.15315477624 1.23755493187 4.85227017426 -1.37025180548 21.2625311754 -1.2355009633 1.89902420267 -2.94533459702 28.3073381249 1.46193213815 -3.21972276063 2.01533053084 13.1434909088 -0.790780090142 1.26618937835 -0.507804196148 13.7877588106 0.0223347938724 -0.732888205329 -1.68074801251 9.97067640236 0.102880304878 -0.192494658683 1 4 3 5 3 6 1 6 3 7 2 5 3 5 4 4 4 4 5 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 4 5 4 2 6 2 7 1 1 1 3 4 1 1 3 14 1 2 0 240.0 1.06666666667 115.0 0.713043478261 0.216927083333 0.200833333333 0.0948575665509 0.0797389322917 0.0533782552083 0.0310537262562 0.0129599232446 0.0135171163646 0.00226272867388 0.3125 1.06666666667 1.0 2.0 2.0 0.0 3.0 3.0 3.0 5.0 2.0 8.0 0.184210526316 1.0 1.0 2.0 0.479166666667 0.875 0.5625 0.5 0.5625 0.75 0.625 0.5 0.6875 0.4375 0.0 0.0 0.125 0.9375 0.5625 0.5 0.625 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.06373265452 5.17253565049 -11.2171039209 14.5629671414 -4.776357965 2.99130472143 -21.0591760808 23.9679770194 5.8370820932 -1.5419373653 4.1964990667 15.0997495882 0.590732657134 -1.72467885361 12.7237410286 2.815231906 -2.07849648914 0.684686786905 -0.822754212175 5.90467842284 0.865693880882 0.388398495529 0.310420626439 10.4508791586 -0.18867388819 -0.0570581118094 1 2 4 10 6 10 6 11 5 12 4 12 4 12 4 12 4 12 4 12 10 6 11 5 5 3 4 4 3 6 3 4 3 6 4 3 3 6 4 3 3 6 3 4 3 6 4 3 3 7 2 4 3 7 3 3 4 5 4 2 5 4 13 3 6 2 4 4 1 3 2 368.0 0.695652173913 154.0 0.597402597403 0.16796875 0.225307183365 0.0495263948783 0.149979336236 0.0654089193939 0.0172125171982 0.0217817731785 0.0184209795935 0.109805819676 0.5 0.565217391304 2.0 2.0 2.0 2.0 0.0 0.0 5.0 5.0 6.0 11.0 0.115384615385 0.0 1.0 2.0 0.41847826087 0.708333333333 0.5 0.5 0.541666666667 0.75 0.833333333333 0.666666666667 0.583333333333 0.0 0.333333333333 0.208333333333 0.0 0.0 0.291666666667 0.625 0.458333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -12.0680965544 -9.63233394713 -27.2378698352 -25.1070463526 3.43179235884 -1.62056280018 -12.8940914294 -24.2715856098 2.99781805877 5.66110887063 -3.215719892 -4.60411472142 -5.49850934403 -3.85919622356 -24.6541575038 -12.5444584791 3.63986006804 2.28554555035 -8.60176509516 -11.8655165774 0.0638589920936 -2.54044403956 -1.12960826063 -22.9923919269 -0.358667623963 0.329634009326 6 4 6 9 3 3 5 3 1 4 5 3 1 22 3 4 9 4 9 4 10 3 10 4 6 1 3 4 3 3 4 7 7 6 3 0 182.0 0.928571428571 88.0 0.715909090909 0.199070160609 0.211930926217 0.0709483578853 0.0949101013707 0.0392623919976 0.0224609720519 0.00992320212491 0.00426828786103 0.0269451740984 1.0 0.285714285714 0.0 3.0 6.0 4.0 1.0 1.0 0.0 2.0 1.0 13.0 0.222222222222 1.0 3.0 2.0 0.483516483516 0.375 0.875 0.9375 0.5625 0.5625 0.6875 0.25 0.625 0.5 0.5 0.0 0.3125 0.625 0.5 0.0 0.3125 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 -10.2768620396 4.04708283862 -24.2762090391 11.012791276 0.947041512684 2.81722809616 -20.243351461 27.7683082517 2.21172530737 5.78625565245 -7.06785173167 55.041902075 -0.194948622481 -0.817342617208 -4.61866021097 50.7071448373 0.268551107861 -2.89440207212 -3.08314302388 26.7697270372 -0.0679529425657 0.243203006857 -6.19293694633 19.1558402385 -0.393024763623 -0.426926169825 1 3 4 5 3 7 2 5 2 6 4 4 3 5 5 3 3 4 6 3 4 3 6 3 3 4 6 3 3 4 6 3 3 4 6 3 3 4 6 3 3 4 6 3 2 6 4 11 4 6 1 0 208.0 1.23076923077 109.0 0.550458715596 0.220552884615 0.243343195266 0.111312567564 0.084375977896 0.0512208586994 0.0392984343452 0.00935644799203 0.0131665362005 -0.00627926334608 0.25 1.0 2.0 0.0 2.0 0.0 3.0 3.0 3.0 3.0 2.0 2.0 0.233333333333 0.0 0.0 2.0 0.524038461538 0.875 0.6875 0.75 0.875 0.6875 0.5625 0.5 0.5625 0.25 0.0 0.0 0.0625 0.8125 0.5 0.5 0.6875 0.75 1.0 0.75 0.5 0.25 0.25 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.89401450008 5.09295817894 -17.0146600793 13.6568993527 -6.96194078703 1.91483290907 -35.2961951314 19.2727047857 5.18521369584 -1.70345525028 -13.339863885 8.79484685841 1.30126318243 -1.82064239958 0.592900876289 -4.7296991079 -1.37861947714 0.296254586368 -4.76953723151 -3.86551608147 1.61264352472 0.683764144457 6.7153418892 2.91898797594 0.124118740959 -0.0347434633816 5 1 1 3 4 8 3 8 2 4 7 3 8 3 8 3 8 3 7 4 6 7 5 6 6 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 7 5 5 7 4 0 231.0 0.52380952381 89.0 0.629213483146 0.134986225895 0.17316017316 0.0230448636588 0.161156172963 0.0258002524827 0.00563122746391 0.009833349881 -0.000337969707889 0.164572599591 0.545454545455 0.047619047619 2.0 0.0 4.0 0.0 1.0 0.0 0.0 0.0 4.0 7.0 0.166666666667 0.0 1.0 2.0 0.385281385281 0.166666666667 0.555555555556 0.388888888889 0.5 0.722222222222 1.0 1.0 1.0 0.611111111111 0.555555555556 0.444444444444 0.5 0.444444444444 0.111111111111 0.0555555555556 0.0555555555556 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.333333333333 0.5 0.666666666667 1.0 0.666666666667 0.5 0.5 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.833333333333 0.5 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -11.7623081752 5.69926272405 -19.9500693591 14.7658617425 10.8639875634 2.15299981325 6.02860999595 26.5177226345 -6.26605105611 2.84732530914 -6.09032502507 38.6056643931 2.74634404333 -0.321381799017 -2.67362338145 42.3935760061 -0.47706568026 0.984012469326 0.788658825105 43.0742157919 -0.569364401489 -1.21124191311 -6.87888408677 39.5486070932 0.0668190762054 0.361638416119 1 4 2 11 5 10 6 11 5 12 4 13 3 13 3 13 3 13 3 13 5 2 3 6 4 4 3 5 3 6 2 5 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 4 5 4 1 6 4 5 2 5 9 0 352.0 0.727272727273 120.0 0.783333333333 0.142045454545 0.184659090909 0.0467605418858 0.128443189889 0.0608535640496 0.0188873832235 0.0247034580874 0.0195417024223 0.0926381520568 0.125 0.545454545455 2.0 1.0 4294967295.0 0.0 0.0 1.0 5.0 5.0 0.0 3.0 0.105263157895 1.0 0.0 2.0 0.340909090909 0.541666666667 0.25 0.25 0.333333333333 0.708333333333 0.833333333333 0.791666666667 0.833333333333 0.0 0.125 0.0416666666667 0.0833333333333 0.0 0.208333333333 0.291666666667 0.291666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -8.13137072888 -8.36286882792 -18.0122011522 -19.8032676755 2.20030812009 1.11934592208 -12.5112551828 -12.8777108768 -0.745161682536 3.48646576788 -15.2080851161 2.51962271691 -1.81284522777 -1.99456674227 -25.2352014207 -1.99767641847 0.938501413441 1.11695739254 -21.5849847561 -0.0191944649519 -0.397980241503 -0.712094438611 -24.6168182573 -4.31227719695 -0.259184572559 -0.114224702655 4 8 3 3 2 4 3 2 5 1 3 3 9 3 9 3 9 2 9 3 8 4 9 3 9 3 9 3 10 2 9 3 9 4 9 2 9 3 9 3 9 4 7 6 6 0 240.0 0.6 72.0 0.777777777778 0.0875 0.132916666667 0.01946875 0.121180266204 0.0145503472222 0.00728847053464 0.00719045992455 -0.000809628341522 0.118758863394 0.5 0.1 3.0 3.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 5.0 0.2 0.0 2.0 1.0 0.3 0.133333333333 0.533333333333 0.666666666667 0.533333333333 0.733333333333 0.8 0.666666666667 0.733333333333 0.533333333333 0.133333333333 0.0 0.0666666666667 0.266666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.0 0.333333333333 0.5 0.833333333333 1.0 0.833333333333 0.833333333333 0.833333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.5 0.5 0.5 0.666666666667 0.666666666667 0.833333333333 0.5 0.333333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -13.7828180718 1.43239448783 -26.6481157748 4.08564645731 9.31263318514 1.06617896377 0.719810651825 8.98642949246 -1.49294498593 1.22667876613 1.56738968605 17.6557141672 -1.61909013942 1.71643940895 -7.01614798254 29.7516280943 2.53175622086 0.276076475855 6.80760377016 31.7654652565 -1.06565043733 -1.05362842582 3.21443150291 21.5003391717 -0.0337455300234 -0.11821568587 5 1 1 2 1 1 5 1 2 6 3 3 2 6 1 12 1 11 2 2 10 3 10 3 10 4 10 3 10 3 11 5 2 2 5 8 6 7 8 3 4 0 195.0 0.866666666667 86.0 0.720930232558 0.190138067061 0.187692307692 0.0651832970886 0.0961302786628 0.0401573863349 0.0195396376303 0.0132320643913 0.00498456061978 0.0358169254453 0.769230769231 0.333333333333 0.0 4.0 4.0 2.0 4.0 0.0 0.0 1.0 2.0 4.0 0.444444444444 0.0 3.0 1.0 0.441025641026 0.375 0.6875 0.8125 0.5625 0.5625 0.5 0.125 0.625 0.8125 0.5 0.0 0.375 0.75 0.4375 0.0 0.25 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.25 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.75 0.75 0.75 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -10.1010337216 5.85690190578 -23.7979488131 18.2116353164 1.0389634685 6.163611165 -19.3520808346 40.029072121 2.27318634268 -0.0108398270376 -6.06053824338 40.5133342596 -0.420030638669 -1.93016175331 -6.06650637223 25.2670163953 -0.305922294447 -0.950688934076 -8.3521662984 10.8004981126 0.507456112265 -1.6894688333 -2.91270425624 -8.26522273898 0.203209138544 -0.329212308552 2 8 4 2 4 4 2 3 5 3 2 1 7 3 9 4 7 6 6 7 4 3 2 4 3 3 4 4 2 3 3 5 1 13 1 12 1 3 4 4 1 0 169.0 1.0 95.0 0.6 0.274920345926 0.291761492945 0.0963315515489 0.115533471492 0.0637263666327 0.0172627962491 0.00584924123414 0.00659855883232 -0.0140385071245 0.923076923077 0.538461538462 3.0 5.0 4.0 0.0 2.0 1.0 2.0 1.0 3.0 16.0 0.175 0.0 3.0 2.0 0.562130177515 0.5 0.0625 0.5 0.8125 0.25 0.3125 0.4375 0.625 0.6875 0.8125 0.75 0.8125 0.4375 0.5 0.625 0.875 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.5 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.75 0.25 0.0 0.25 0.75 1.0 0.75 0.25 1.0 0.75 0.5 0.75 1.0 1.0 1.0 0.75 1.37118104818 -4.79913366862 0.843481853358 -11.8099225946 -3.19439980454 0.028976776166 -7.08082778427 -9.88693084177 1.86206478245 1.71228742711 -3.14465620005 -5.39151144237 -0.949755339315 -2.87434027848 -4.9990170132 -20.3188490439 -0.059430495163 -0.492669729203 -8.64183391953 -31.0889461757 -0.0961316359752 -0.678157907055 -6.43748088632 -37.5492178806 0.254588229474 -0.170900840831 3 2 11 6 10 6 11 5 12 4 12 4 12 4 13 3 13 3 12 4 4 1 7 5 2 5 4 5 3 4 4 4 5 3 5 2 7 2 4 3 7 3 3 3 6 3 4 3 7 2 4 2 7 4 3 3 7 2 4 3 7 3 2 5 5 12 3 6 1 1 1 1 12 0 368.0 0.695652173913 131.0 0.847328244275 0.137398097826 0.188445179584 0.0429356614909 0.133018435336 0.0571213414423 0.0168875429561 0.0229322730737 0.0185392141438 0.102696434821 0.6875 0.608695652174 4.0 2.0 3.0 2.0 0.0 1.0 5.0 5.0 2.0 6.0 0.222222222222 3.0 1.0 2.0 0.35597826087 0.666666666667 0.416666666667 0.458333333333 0.541666666667 0.708333333333 0.791666666667 0.708333333333 0.5 0.0 0.0833333333333 0.125 0.0 0.0 0.208333333333 0.541666666667 0.375 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.166666666667 0.333333333333 0.5 0.333333333333 0.5 0.833333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.333333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -11.3484394205 -6.86442189335 -25.5604316439 -16.9488327562 3.15814056222 0.177899829543 -13.2536546852 -11.9651725068 2.09636759536 4.25796802959 -6.7682253897 6.10533821707 -4.7501555692 -1.66678207859 -26.1181595703 5.10187275951 2.94636107596 0.837525502493 -14.9289488732 0.938117571225 -0.567059714069 -2.1316983747 -14.3113072413 -11.5419274305 -0.34248012461 0.315800218076 2 8 4 4 2 4 3 3 4 4 3 1 5 4 9 4 8 5 5 2 2 3 5 3 2 3 3 3 4 3 3 4 3 3 2 5 1 20 2 3 4 3 1 0 169.0 1.0 92.0 0.695652173913 0.268548020027 0.271279016841 0.0980440701093 0.113095836193 0.0591817492675 0.02039140957 0.00658854440389 0.00671051508393 -0.00850850802346 0.846153846154 0.692307692308 2.0 5.0 3.0 1.0 2.0 1.0 3.0 2.0 4.0 12.0 0.0882352941176 2.0 2.0 1.0 0.544378698225 0.5625 0.0625 0.4375 0.8125 0.4375 0.125 0.5 0.6875 0.6875 0.5625 0.5 0.6875 0.5625 0.6875 0.5 0.8125 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.75 0.25 0.0 0.0 0.25 0.25 0.0 0.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.5 1.46912255162 -2.84030359979 0.763429710159 -5.85724182253 -3.7101864203 1.66790323612 -9.42106628628 0.825652760073 1.22545015389 1.14719571222 -10.1030200297 6.1027343456 -1.69860175691 -1.21996308209 -16.5012258343 0.750617776117 0.236498351212 0.358935115635 -18.3091400479 0.557728386082 0.232463032354 -0.266188546675 -12.7155271485 -3.4181384193 0.166555743883 -0.332090918303 0 6 9 6 9 6 11 4 11 3 12 3 12 3 12 3 12 3 4 2 6 10 6 3 3 4 4 4 4 3 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 3 2 5 5 3 1 6 4 11 3 6 330.0 0.681818181818 130.0 0.638461538462 0.148686868687 0.212121212121 0.0430715975179 0.154759718396 0.0600857055403 0.0155101743158 0.0231285311953 0.0177485844599 0.128176901379 0.466666666667 0.590909090909 3.0 2.0 1.0 0.0 0.0 1.0 5.0 5.0 2.0 7.0 0.155555555556 0.0 1.0 2.0 0.393939393939 0.75 0.458333333333 0.458333333333 0.625 0.666666666667 0.625 0.583333333333 0.583333333333 0.0 0.25 0.0416666666667 0.0 0.0 0.375 0.625 0.541666666667 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.5 0.333333333333 0.333333333333 0.5 0.5 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.5 0.333333333333 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -10.9961597045 -8.1024334665 -23.9635937453 -21.1104062223 4.2403851179 -1.34402821965 -8.12519214397 -20.1286938432 1.99981267781 5.11295791653 -1.0609191745 -0.362820086516 -4.47575455632 -2.07099469156 -17.9600915321 2.89458119151 3.61834091981 3.50248628416 -1.72835207113 19.85758692 -0.652144558136 -0.988006863076 -0.203874146301 21.5398973475 -0.285587847952 0.160909301171 3 8 6 3 3 5 3 3 5 5 2 3 6 4 1 3 8 7 8 7 8 7 8 3 1 3 8 3 1 4 6 4 2 4 4 4 4 4 1 5 6 7 9 6 5 0 210.0 1.07142857143 102.0 0.627450980392 0.22380952381 0.222108843537 0.103315516683 0.0872671417773 0.0492695173307 0.0340741784752 0.00813635696027 0.00808841737872 0.00121647089131 0.533333333333 0.785714285714 0.0 3.0 3.0 0.0 2.0 3.0 3.0 2.0 4.0 12.0 0.102564102564 0.0 2.0 2.0 0.485714285714 0.5625 0.75 0.8125 0.625 0.5 0.0625 0.0625 0.625 0.4375 0.0 0.0 0.5 0.8125 0.5625 0.5625 0.6875 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.1034742721 0.721502408683 -8.98149603604 6.74959831685 -9.22957198872 7.47816025941 -39.2495853958 32.5311381797 0.807688674623 0.531029964526 -40.2759887574 39.4617329433 1.17100442909 -0.623934799417 -33.1298360376 36.5300250753 -2.08919277609 1.49953364174 -46.4626972933 48.0271279216 -0.306537565953 1.27671714414 -54.4477609537 66.3709007159 -0.116698035357 0.573721924711 3 2 5 3 4 4 3 16 1 4 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 3 7 3 5 4 2 2 0 136.0 0.470588235294 68.0 0.617647058824 0.212316176471 0.23053633218 0.0310683231987 0.200049215729 0.0556706219469 0.00476793686538 0.0196260415587 0.0051058136565 0.199205577373 0.5 0.0 1.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 7.0 0.0769230769231 0.0 3.0 1.0 0.5 0.5 0.3 0.0 0.1 0.7 0.7 0.5 0.4 0.9 1.0 1.0 0.7 1.0 1.0 1.0 0.9 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 -5.46744039798 4.56868307228 -9.41461626042 12.385457128 4.48264286694 2.0279054422 -1.06554002503 19.4784816275 -3.91391736071 -0.438643813782 -7.79679163822 17.2263995201 3.26008126532 -0.425315980447 0.359884532251 13.2700721102 -1.79167734376 -0.0135862475807 -2.05044912475 11.4455893294 0.770953964494 -0.347059264729 -3.39864629982 8.16160065933 -0.132027690616 -0.0268098081098 2 2 5 2 4 3 3 19 2 4 3 4 3 4 3 4 3 4 4 3 4 3 4 4 3 4 1 1 2 5 112.0 0.4375 66.0 0.439393939394 0.198979591837 0.283482142857 0.0254077077259 0.231653152332 0.0429231960641 0.00423026757488 0.0117428261643 0.00333663459904 0.300006198947 0.428571428571 0.0625 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 4.0 6.0 0.115384615385 0.0 4.0 1.0 0.589285714286 0.375 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.625 0.875 0.5 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 -8.35563451232 2.86478897565 -13.9604585941 6.35885328605 8.03017508768 -0.695681177031 5.52778156997 5.20602626895 -4.50018032838 0.795230728838 -3.51705236441 9.41926729899 1.66905796702 1.09180045492 -2.432940551 15.6779265667 0.0151309095084 -0.821231764756 2.89140557611 8.60007985875 -0.246367667379 -1.1796033012 -2.33503345476 -4.64783702229 -0.107896999446 -0.0894504521439 1 4 2 5 4 5 4 12 1 8 3 7 1 14 3 5 4 5 3 4 3 4 6 2 6 3 4 2 7 2 6 3 4 3 5 3 6 3 3 3 6 3 6 3 3 4 5 3 6 3 3 4 5 3 6 3 3 4 5 3 6 3 2 5 5 4 4 4 1 7 2 7 3 5 1 5 3 5 5 3 2 0 336.0 1.71428571429 178.0 0.589887640449 0.250124007937 0.234268707483 0.172255855157 0.0589542798766 0.0511685111793 0.0665179172244 0.00683037526461 0.011391650485 -0.0365678600339 0.458333333333 1.85714285714 4.0 4.0 2.0 1.0 4.0 6.0 6.0 6.0 4.0 12.0 0.196428571429 0.0 4.0 3.0 0.529761904762 0.75 0.541666666667 0.583333333333 0.791666666667 0.708333333333 0.166666666667 0.125 0.291666666667 0.75 0.5 0.5 0.666666666667 0.833333333333 0.25 0.166666666667 0.291666666667 0.666666666667 0.666666666667 0.5 0.333333333333 0.166666666667 0.0 0.166666666667 0.333333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 0.666666666667 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.833333333333 0.5 0.333333333333 0.5 0.666666666667 0.666666666667 0.333333333333 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 -5.09295817894 11.1408460164 -14.1280848068 24.5084315001 -3.43067321776 -4.14355473369 -30.281701257 7.08622194327 -2.72945815213 -4.04258621149 -39.7439384121 -11.4173488473 2.56627573946 3.85172485499 -27.5561554017 5.80157359439 0.178934310345 -0.717008247174 -15.7355224463 4.7037399058 1.24532606646 -1.51717293424 -10.8909387852 -8.5496473655 -0.415246647498 0.294456529119 6 4 11 2 1 2 7 3 5 2 4 3 6 3 2 4 6 3 1 4 8 7 8 7 8 8 7 8 8 2 1 5 6 2 2 5 6 1 5 9 7 7 10 1 8 0 225.0 1.0 92.0 0.815217391304 0.176 0.196148148148 0.0819326419753 0.0828098545953 0.0470581728395 0.0351119865679 0.0104872695455 0.0121594840201 0.0202173015219 0.6 0.733333333333 0.0 2.0 3.0 2.0 2.0 3.0 3.0 1.0 4.0 12.0 0.25641025641 0.0 3.0 2.0 0.408888888889 0.1875 0.8125 1.0 0.6875 0.4375 0.375 0.375 0.75 0.4375 0.0 0.0 0.25 0.4375 0.375 0.1875 0.3125 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.75 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -5.77201926947 1.86741799894 -15.7574460984 9.56087331747 -2.90638146745 7.84541913254 -27.1621159293 38.4597600496 -0.51048627067 1.65249935553 -28.7398206972 47.0412884889 1.18998419589 -3.18409982956 -19.1676923376 26.0941578141 0.951619287638 -0.759632113008 -9.62871481301 13.9372758437 0.0488732964746 -0.237744143081 -5.5385995867 6.18692594562 0.259554997861 -0.593665957581 7 7 6 10 4 3 3 5 4 2 13 2 12 3 12 3 12 3 12 2 7 1 5 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 3 4 6 2 3 4 5 3 2 5 6 2 2 5 6 2 1 6 5 4 1 5 5 4 1 6 3 5 2 1 2 2 3 3 2 0 315.0 0.714285714286 124.0 0.741935483871 0.187724867725 0.208919123205 0.0613486584522 0.148256479782 0.0556257343619 0.0212089845887 0.0203552223578 0.0129579242004 0.092822969541 0.533333333333 0.714285714286 0.0 1.0 0.0 4.0 1.0 2.0 5.0 5.0 6.0 5.0 0.1875 1.0 1.0 2.0 0.393650793651 0.0416666666667 0.25 0.416666666667 0.708333333333 0.5 0.708333333333 0.75 0.75 0.333333333333 0.0 0.0 0.0833333333333 0.458333333333 0.125 0.291666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.0 0.333333333333 0.5 0.5 0.5 0.833333333333 1.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -7.70006772292 -7.09376317781 -15.1025348797 -13.8286099668 4.87270877276 5.54418074517 -0.613582769316 9.98543443825 -0.260307137944 6.04326178067 4.33563178064 47.4004024783 0.0207454944887 2.22388790808 1.87704658862 67.1783959519 -0.358308678471 0.0735850777725 1.11444993704 67.9446965914 0.672084931638 -0.62737464832 7.17618267266 60.6579166768 0.10396264059 -0.0873500204889 1 5 10 6 12 4 13 3 13 3 13 3 13 3 13 3 13 3 2 4 7 10 6 4 3 4 5 3 5 4 4 3 5 4 4 2 6 4 4 3 5 4 4 3 5 4 4 3 5 4 4 3 5 4 3 5 4 5 2 5 4 12 3 6 2 3 9 2 352.0 0.727272727273 141.0 0.63829787234 0.182173295455 0.222494834711 0.0583148500599 0.144766196373 0.071909273235 0.0199848279706 0.0226327688954 0.0199813232867 0.0903869176863 0.375 0.590909090909 3.0 2.0 1.0 0.0 0.0 1.0 5.0 5.0 2.0 6.0 0.1875 0.0 1.0 2.0 0.400568181818 0.5 0.25 0.25 0.458333333333 0.75 0.833333333333 0.75 0.875 0.0 0.291666666667 0.0416666666667 0.125 0.0 0.416666666667 0.541666666667 0.541666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 -5.0061463918 -11.3144695907 -12.4312616935 -27.7651228262 0.0493846667896 0.299297387347 -9.37316650819 -21.4415929345 2.39136401827 5.13398046904 -3.26859887882 -3.09972090351 -3.39362820344 -4.73723551599 -15.2226878852 -19.6837370494 2.11000952172 1.55438826571 -7.95972804527 -22.5257885224 -0.528412305504 -1.8108983041 -8.4842893811 -35.1147247174 -0.238503466383 -0.25901529192 6 1 1 1 9 7 5 5 1 5 2 3 6 3 1 4 6 8 6 8 6 8 7 7 7 7 7 8 6 8 6 15 3 11 4 9 6 1 10 0 224.0 0.875 119.0 0.546218487395 0.234375 0.259207589286 0.0868798080756 0.11093228621 0.0490816077408 0.0265709546968 0.00476923808673 0.0071133681499 0.0192340624126 0.5 0.6875 0.0 2.0 3.0 1.0 3.0 4.0 4.0 0.0 3.0 14.0 0.139534883721 0.0 2.0 2.0 0.53125 0.3125 0.9375 1.0 1.0 0.5625 0.25 0.25 0.5625 0.5625 0.0 0.0 0.25 0.5625 0.75 0.5625 0.5625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -9.42993037819 3.30246506916 -28.2876251561 14.1797627304 -8.37148783673 9.39666948188 -58.2311843265 47.1649964713 -0.255328863629 0.436699831797 -62.1346279392 50.4888217271 0.77131241192 -3.34050169065 -56.9784766536 28.823867533 -1.26004888509 0.558876414425 -63.7384544022 28.0855967176 -0.0762004239328 0.817687593012 -66.8151783136 36.7709275188 -0.0101625449047 -0.016418391501 11 1 9 5 8 5 9 4 10 3 10 2 11 2 11 2 11 2 5 8 3 3 1 1 1 4 2 3 6 3 1 3 6 6 7 2 1 3 7 2 1 3 7 2 1 3 7 2 1 3 7 2 1 4 6 2 2 3 5 4 2 4 3 4 4 3 3 2 1 0 286.0 0.590909090909 105.0 0.780952380952 0.201183431953 0.200572155118 0.0633734205547 0.164767405317 0.0573913714043 0.0197712261387 0.0185467332734 0.0127564055896 0.120524537338 0.692307692308 0.590909090909 0.0 3.0 2.0 2.0 0.0 0.0 5.0 5.0 7.0 8.0 0.204545454545 0.0 1.0 3.0 0.367132867133 0.0 0.0833333333333 0.708333333333 0.75 0.0 0.25 0.208333333333 0.208333333333 0.208333333333 0.291666666667 0.125 0.0833333333333 0.75 0.583333333333 0.625 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.5 0.166666666667 0.0 0.0 -2.01435129826e-15 -5.03508365418 -0.633285432339 -12.0829645597 -0.0631358451935 1.46970203271 4.72739055363 1.6393750252 4.19912664155 7.70117230186 19.127109778 35.5578654606 -2.93885607315 -1.78402009699 7.99033625364 39.6811921015 0.407512359416 1.79006948568 6.23320411331 41.4917324843 0.768894646968 -1.77702783376 11.2819924966 32.015690491 -0.383285195501 0.0263018860254 0 7 2 6 3 2 1 7 2 7 2 3 1 5 4 5 3 2 3 4 4 4 4 2 3 4 4 4 4 1 5 4 3 4 4 1 5 4 3 4 3 1 7 7 1 3 1 2 8 6 2 4 9 5 3 4 9 4 4 4 10 3 4 3 12 2 5 1 6 0 273.0 1.61538461538 129.0 0.666666666667 0.214896214896 0.178360101437 0.128033451787 0.0442146644296 0.0458530855826 0.044887052143 0.00861426161225 0.0068710755552 -0.0185516866103 0.190476190476 1.61538461538 0.0 2.0 1.0 1.0 6.0 6.0 5.0 3.0 4.0 11.0 0.181818181818 0.0 4.0 3.0 0.472527472527 0.875 0.583333333333 0.291666666667 0.0833333333333 0.5 0.416666666667 0.833333333333 0.583333333333 0.833333333333 0.666666666667 0.625 0.416666666667 0.416666666667 0.208333333333 0.291666666667 0.208333333333 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.166666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.666666666667 1.0 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.833333333333 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 -7.63943726841 12.4898736293 -17.6738253325 28.8825277449 1.43698301712 -1.76034544118 -11.2117363414 23.2570224944 2.20680937671 -2.16928403208 -1.07299928774 5.75067774646 -1.92473876472 -1.01211515302 -9.13039371588 3.71038524 0.341744757709 2.6063156363 -8.83929754405 12.3358396906 0.613744546266 -3.18695605083 -3.80790852216 -6.72116093251 -0.162368438861 0.102603182974 1 5 5 5 9 2 2 5 3 2 2 5 3 1 11 1 4 8 3 8 4 8 4 9 3 10 3 10 3 3 3 4 6 6 6 2 0 168.0 0.857142857143 74.0 0.756756756757 0.196924603175 0.190901360544 0.0695454645152 0.101225696132 0.0424450906355 0.0226415785869 0.0147679591791 0.00599165586252 0.0379445344035 1.08333333333 0.214285714286 0.0 4.0 6.0 3.0 1.0 1.0 0.0 1.0 2.0 12.0 0.257142857143 0.0 3.0 1.0 0.440476190476 0.166666666667 0.583333333333 0.833333333333 0.25 0.5 0.833333333333 0.666666666667 0.666666666667 0.416666666667 0.333333333333 0.0 0.5 0.5 0.25 0.0 0.25 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 0.5 0.75 1.0 0.75 0.5 0.5 0.75 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -8.27605704078 3.45593590714 -17.864487327 10.7169419976 3.16361050146 4.10183585111 -7.37550461045 29.0689436543 0.896028977524 3.60127475801 -0.987780102201 47.8431690548 -1.33244933935 -0.479587364152 -6.08284659991 43.5476842671 1.2349853958 -2.33396765974 2.11540574708 23.9454333904 0.636814033207 0.0438844305958 9.52646490375 20.7031425444 -0.104574152809 0.183440312948 5 5 4 2 2 3 4 2 2 3 2 3 3 3 1 10 1 4 4 1 2 4 7 3 8 4 7 4 7 5 5 1 1 10 1 10 3 3 1 2 2 0 154.0 0.785714285714 82.0 0.609756097561 0.214876033058 0.262523191095 0.0638234256888 0.137028429489 0.0451248869195 0.0171227368973 0.0115569028806 0.00563266683639 0.0635473109631 0.909090909091 0.428571428571 0.0 1.0 4.0 2.0 2.0 2.0 0.0 1.0 5.0 12.0 0.181818181818 0.0 3.0 1.0 0.532467532468 0.166666666667 0.916666666667 1.0 0.833333333333 0.5 0.75 0.583333333333 0.916666666667 0.333333333333 0.25 0.0 0.583333333333 0.75 0.5 0.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.75 0.5 1.0 0.75 0.75 0.75 0.5 0.25 0.25 0.5 0.5 0.25 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 -12.095775675 -0.13641852265 -28.3860431987 1.44278032824 1.16048545969 2.92951817263 -25.1677898579 13.6146715545 1.14194879038 2.11010506086 -16.2485512098 25.4598682488 -0.0179810934392 -0.251534375861 -12.3069373418 24.3676815733 1.10964340686 -0.695785481664 -4.97688913373 17.8634720383 -0.497303932426 -0.0450489406422 -9.26970600988 15.4762349177 -0.285778851039 -0.0600832262944 1 5 4 8 6 5 3 2 5 2 3 3 6 1 12 1 10 3 2 3 1 1 2 3 3 10 3 10 4 10 4 6 1 2 4 5 2 2 6 1 4 3 10 5 1 1 4 3 0 195.0 0.866666666667 100.0 0.69 0.222090729783 0.237264957265 0.0707828520373 0.11229643116 0.0461353697803 0.0180704932635 0.00989737813967 0.00563092199039 0.0323707715711 0.923076923077 0.533333333333 0.0 5.0 4.0 3.0 1.0 1.0 0.0 2.0 3.0 10.0 0.171428571429 1.0 3.0 1.0 0.512820512821 0.3125 0.6875 0.75 0.8125 0.5 0.625 0.125 0.5625 0.8125 0.875 0.1875 0.1875 0.5 0.6875 0.0625 0.375 0.0 0.0 0.25 0.5 0.5 0.5 0.75 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.75 1.0 0.5 0.0 0.0 0.75 0.75 0.25 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.75 0.25 0.0 1.0 0.75 0.5 0.75 1.0 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 -10.2707989942 4.75342763368 -25.5486688272 12.0730226992 -1.00727395095 1.77914005718 -28.4368467301 24.4362664554 1.93437677586 4.63082776469 -17.2353806597 43.537638223 0.383218187368 -1.83672577901 -10.5942178612 33.5546296997 0.620532561393 -2.1986397004 -3.24585128892 12.2879479512 1.06535153731 -0.263908215224 8.72298000672 0.96627934644 0.194547436614 -0.554773071553 7 2 6 7 3 8 2 3 8 3 8 3 8 3 8 3 8 3 6 8 3 8 5 3 8 3 8 3 8 3 8 3 8 3 8 3 7 4 7 4 7 5 5 7 4 0 242.0 0.5 92.0 0.663043478261 0.129601803156 0.180879038317 0.0210907922448 0.175515618711 0.0273568762239 0.00504610532356 0.00983407683479 0.000297056136053 0.192253375066 0.636363636364 0.0 2.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 6.0 5.0 0.114285714286 1.0 2.0 4.0 0.380165289256 0.166666666667 0.555555555556 0.444444444444 0.5 0.666666666667 1.0 1.0 1.0 0.5 0.555555555556 0.444444444444 0.388888888889 0.444444444444 0.222222222222 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -12.0379011502 4.10909125801 -20.4529351995 10.1606327273 11.1386936581 1.26187987562 6.72925337664 20.2678852513 -5.92683991491 3.95741966371 -2.98990009486 35.2069350472 3.13041279006 -1.46354246653 3.12430079188 34.222518341 -0.529366739434 0.772694405085 6.06470120666 28.2463848925 -0.703379913406 -2.33873758443 -1.24221310463 15.5478693554 0.228465843816 0.398366720469 1 7 5 5 7 4 2 3 3 3 2 9 3 9 3 9 3 9 3 9 3 8 4 8 4 9 3 9 3 9 3 9 3 9 3 9 3 9 4 8 4 7 6 5 7 9 1 7 0 264.0 0.545454545455 82.0 0.768292682927 0.107323232323 0.145833333333 0.0216098658764 0.140804948156 0.023619241659 0.00689754631311 0.011850388979 0.000285999922681 0.140457182163 0.25 0.0454545454545 1.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 4.0 0.233333333333 0.0 2.0 1.0 0.310606060606 0.111111111111 0.444444444444 0.388888888889 0.5 0.5 1.0 1.0 1.0 0.388888888889 0.333333333333 0.333333333333 0.666666666667 0.277777777778 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -12.3562110364 1.01280418331 -21.0471629475 4.7115101047 11.5977438658 3.72226463073 8.6380736537 20.050519626 -5.41661931421 2.39853459322 -0.847467453459 33.4755024141 1.86299761625 -0.358892258059 1.09254203568 30.9590959668 0.522485948338 -1.24125779943 6.03132734283 18.1579174676 -1.81267228009 -0.974712544978 -6.53704815966 4.96038221514 0.333341926144 -0.252061391796 1 1 2 4 3 4 12 2 7 1 4 3 5 4 3 3 3 5 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 2 2 4 6 8 5 4 1 0 182.0 1.07692307692 93.0 0.602150537634 0.221350078493 0.222316145393 0.101624797133 0.0861551200882 0.04978197144 0.0350239528472 0.0093292846223 0.014364308998 0.00358255267484 0.285714285714 0.923076923077 2.0 0.0 1.0 1.0 2.0 3.0 3.0 3.0 6.0 2.0 0.2 0.0 1.0 2.0 0.510989010989 0.8125 0.6875 0.75 0.875 0.6875 0.4375 0.25 0.25 0.625 0.0 0.0 0.0625 0.625 0.75 0.75 0.75 0.75 1.0 0.75 0.25 0.25 0.5 0.5 0.5 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -3.0012074983 6.63903476898 -12.4645501534 16.6375397606 -7.50997887447 0.793918681138 -36.232112701 18.6204243416 1.79322744606 -1.63495317232 -30.4303756371 9.22577896407 1.58479737895 -0.423349574933 -18.2222054863 5.31530226869 -0.968897098993 0.799405617284 -20.0458714294 12.2496814504 1.19764007884 0.829725123887 -9.54024337946 23.1724516492 0.328801939501 0.282636045718 4 5 5 8 3 5 2 3 2 5 1 16 1 5 1 1 5 3 9 3 9 3 9 4 8 4 5 2 1 11 3 8 2 0 156.0 0.923076923077 86.0 0.53488372093 0.206196581197 0.248520710059 0.0670980208702 0.110194457088 0.0353765235422 0.0185013623238 0.00733205223236 0.00449506280058 0.0359308409964 0.833333333333 0.307692307692 0.0 3.0 5.0 2.0 1.0 2.0 0.0 1.0 4.0 12.0 0.166666666667 0.0 2.0 4.0 0.551282051282 0.416666666667 0.916666666667 1.0 0.833333333333 0.833333333333 0.833333333333 0.416666666667 0.833333333333 0.833333333333 0.583333333333 0.0 0.5 0.75 0.5 0.0 0.5 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 0.75 0.5 0.75 0.75 0.25 0.0 0.0 1.0 0.5 0.25 0.75 0.75 0.25 0.0 0.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.0 -8.96164756487 4.89707517206 -22.4185633779 12.3544462868 -1.17269013144 1.41986203214 -26.6732193 22.0170031235 1.04778822395 3.70206606456 -20.1386977862 40.0532419705 0.166322829729 0.492517537056 -17.7377517213 44.0635215566 -0.486141777562 -1.44032526364 -21.5587190307 33.8024558691 -0.368710278766 0.55893171558 -26.3191964824 36.8804896045 -0.109725520646 0.253198959976 3 2 10 7 8 6 9 6 11 4 11 4 11 3 12 3 12 4 11 9 6 11 4 4 1 7 3 4 4 5 2 4 5 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 6 4 2 3 6 4 2 3 6 3 3 5 2 4 5 9 3 0 330.0 0.681818181818 144.0 0.569444444444 0.184646464646 0.231404958678 0.0528052981607 0.14967192587 0.0688237749395 0.0174097359645 0.0205552104809 0.0171037788823 0.101611326337 0.6 0.454545454545 0.0 2.0 3.0 1.0 0.0 0.0 5.0 5.0 2.0 10.0 0.196078431373 0.0 2.0 3.0 0.436363636364 0.708333333333 0.5 0.5 0.5 0.75 0.75 0.708333333333 0.583333333333 0.0416666666667 0.333333333333 0.291666666667 0.0833333333333 0.0 0.25 0.666666666667 0.5 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.666666666667 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.333333333333 0.166666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -9.43354753599 -8.3918060903 -21.3654543203 -20.5197107559 2.09340765493 0.985660552897 -15.0736882218 -8.95458250157 0.272478389495 7.41877359585 -13.4528082689 22.8087625759 -1.81981177112 -2.03612681008 -18.8552961372 30.1491608455 2.34623793961 3.61092471742 -6.78206592806 40.0484720526 -0.636481044317 -3.38243700121 -5.41404812906 24.0945333646 0.0500755355748 0.198837176096 1 4 1 5 1 11 1 12 2 5 2 2 3 4 8 4 9 3 8 3 10 3 8 4 8 4 7 6 6 6 7 2 8 0 168.0 0.857142857143 78.0 0.551282051282 0.171626984127 0.167942176871 0.0478105428679 0.0870280527886 0.0234370782043 0.0136376722911 0.00477535323525 -0.00187481994144 0.0366858398848 0.416666666667 0.142857142857 3.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 5.0 0.25 0.0 1.0 1.0 0.464285714286 0.75 0.25 0.166666666667 0.5 1.0 0.916666666667 0.833333333333 1.0 0.916666666667 0.75 0.583333333333 0.833333333333 0.833333333333 0.0833333333333 0.0 0.166666666667 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.25 0.25 0.25 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.25 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.3678077214 7.09376317781 -20.2768395607 19.3231833297 6.52581667535 3.28518074954 -1.93830477121 30.8381683301 -1.39623022724 -0.603968719605 -0.902181307391 28.1629305294 -0.201082109079 -0.358809853768 -3.99525247602 25.1877534887 0.874825908457 0.901053781575 3.12993661033 32.7741578748 0.175293504907 0.852643053746 7.6197923567 41.4255076204 0.129276825388 -0.0430270001958 2 2 4 5 1 6 2 6 2 5 2 5 2 4 2 5 1 5 2 4 3 2 1 1 3 0 77.0 0.636363636364 50.0 0.46 0.269016697588 0.289256198347 0.0478913901076 0.141921832595 0.0319845443812 0.0057795090975 -0.00788650488039 -0.00122028737911 0.0638642553414 0.285714285714 0.0909090909091 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.111111111111 0.0 5.0 1.0 0.649350649351 0.5 0.5 0.0 0.5 0.833333333333 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 -4.74571103038 4.39846388181 -10.3684223222 10.1426395789 1.49038858805 -0.554830154731 -6.25152719409 9.51697212362 0.00105147350497 0.478539032001 -3.51226939911 10.652382677 0.279197087455 0.217145188415 -1.3252224888 11.2356166032 0.329506361774 -0.642162180975 0.779096804594 6.40651997367 -0.350949349519 -0.133347049328 -0.76169998956 2.63619454347 0.0877864872912 -0.134641876255 0 5 1 5 1 10 1 5 1 3 3 3 8 3 8 3 8 3 8 3 8 3 8 4 6 5 5 7 4 7 4 0 143.0 0.846153846154 69.0 0.463768115942 0.171010807374 0.200107584723 0.0466027199853 0.114933723912 0.023924092925 0.0136140881877 0.00578288793072 -0.00272770016349 0.0610338369331 0.363636363636 0.153846153846 2.0 0.0 2.0 0.0 2.0 0.0 0.0 0.0 3.0 2.0 0.125 0.0 1.0 1.0 0.482517482517 0.666666666667 0.333333333333 0.333333333333 0.75 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.416666666667 0.833333333333 0.666666666667 0.0 0.0 0.166666666667 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.5776823716 1.95883006882 -22.0109520793 6.8667579677 4.79855413309 3.18976352036 -9.13414778781 17.8408669546 -1.31990072737 -0.100420818136 -10.7461411592 18.0334755663 -1.31373570798 -0.976462063412 -20.8071869165 9.85579706259 0.15895614246 -0.626536786226 -22.2276928817 2.17016431833 -0.460452737605 -0.588006733253 -24.7643699059 -5.31728718233 0.0288175574572 -0.173781911877 3 1 6 2 5 3 4 8 1 7 1 4 4 3 5 3 5 3 4 4 5 3 5 3 5 3 5 4 5 5 1 0 120.0 0.533333333333 56.0 0.678571428571 0.158333333333 0.222222222222 0.0257962962963 0.172685185185 0.0378009259259 0.00572161577381 0.0107227115392 0.0028148262401 0.176933545094 0.5 0.0 1.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 1.0 9.0 0.153846153846 1.0 3.0 1.0 0.466666666667 0.375 0.625 0.625 0.625 0.625 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.625 0.875 0.5 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 -8.36093967709 3.39530545263 -15.2474939678 7.46943994968 6.43353794849 -0.842035752252 0.540469605346 6.67407805244 -3.34883168528 1.52921204198 -5.89655226854 14.7342473505 1.00705551497 1.52457989522 -5.25589936173 24.1554748344 0.488705391222 -0.984983434156 0.546328877596 16.7187119965 -0.5686125227 -0.963219741534 -4.37461509036 5.82930570102 -0.0294584629752 0.0476998387113 2 2 4 2 1 11 1 10 2 4 7 4 7 4 8 2 9 3 8 3 7 4 7 4 6 6 5 3 1 1 5 0 143.0 0.846153846154 63.0 0.634920634921 0.168467895741 0.17536309844 0.047039761549 0.0951054422618 0.0283570896315 0.0135491492927 0.00661190883984 -0.0010780377317 0.0456320855123 0.363636363636 0.153846153846 1.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 7.0 4.0 0.0384615384615 0.0 2.0 1.0 0.440559440559 0.583333333333 0.25 0.0833333333333 0.5 0.916666666667 0.916666666667 0.75 0.916666666667 0.666666666667 0.583333333333 0.583333333333 0.666666666667 0.583333333333 0.0 0.0 0.0833333333333 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.5 1.0 0.75 0.5 0.5 0.25 0.25 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -8.8147353097 4.9950166755 -17.3736434101 13.8946550635 5.14627544709 2.73656674112 -4.39130211122 23.450859452 -2.1415723649 -0.393696655774 -7.50919002234 21.6916027969 0.0029933503869 -0.671111023529 -12.8402092438 14.9597350406 -0.555376732942 -0.433202759678 -16.1679117282 11.0742050311 -0.334073680648 0.121050017954 -20.4094033492 8.6746809983 0.0488187069886 -0.302787706192 8 1 11 6 7 3 3 4 5 3 3 4 3 3 7 3 2 3 7 8 8 7 7 8 8 3 1 3 7 4 1 4 6 3 2 4 6 3 4 10 7 5 5 0 210.0 1.07142857143 92.0 0.782608695652 0.210476190476 0.22074829932 0.103669258179 0.0873759853148 0.0580728862974 0.0392084003602 0.0111925076258 0.0148700526036 0.00658770395561 0.6 0.714285714286 0.0 2.0 3.0 2.0 1.0 3.0 3.0 2.0 2.0 7.0 0.257142857143 0.0 2.0 2.0 0.438095238095 0.125 0.6875 0.9375 0.625 0.5 0.375 0.25 0.5625 0.4375 0.0625 0.0 0.25 0.625 0.5625 0.375 0.625 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.97089227105 3.35286413447 -12.6549353711 11.1120970492 -8.3354748862 4.73135814824 -42.3281028429 28.9093959177 -0.912716789958 0.977592274514 -49.3780568553 33.1740759271 1.8105754997 -2.16707983362 -38.2517869637 18.197721169 -0.671301881934 -0.652693355322 -38.3187794145 12.2170410684 0.39972766409 1.65688285097 -34.2931945505 29.883768299 0.212491836507 0.55627565533 4 1 8 2 7 4 5 8 1 10 1 8 3 3 7 3 7 3 7 3 7 3 7 3 7 3 7 4 6 7 3 7 1 0 160.0 0.625 72.0 0.638888888889 0.180625 0.21796875 0.0362888183594 0.152811523438 0.0491840820312 0.0078011330941 0.0157486300982 0.00528722199574 0.123301924102 0.4 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 6.0 0.0833333333333 0.0 1.0 1.0 0.45 0.25 0.666666666667 0.333333333333 0.333333333333 0.75 1.0 1.0 1.0 0.583333333333 0.833333333333 0.333333333333 0.333333333333 0.25 0.75 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -8.3954232481 3.62077495534 -15.6448160418 7.42988844866 5.85485029909 -1.68449343089 -2.37440226946 3.94481614274 -3.61583536253 1.60281286821 -8.53599160642 11.6683124121 2.17011432186 1.53449300931 -1.84978097371 21.4263238484 0.168305946054 -0.910459827433 3.54086318925 16.2613941726 -0.688986871108 -0.250529050018 -2.97471957915 11.1527954312 0.0433706870021 -0.0477878680757 1 4 1 6 1 4 4 1 28 2 2 5 1 5 2 4 2 4 3 3 3 3 3 3 3 3 3 3 2 5 1 5 1 5 126.0 0.285714285714 65.0 0.630769230769 0.228835978836 0.275888133031 0.0207525985115 0.423572368395 0.0649847828608 0.00209738301626 0.0244511572644 0.0039163491298 0.746752898504 1.16666666667 204522252.0 1.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 0.0 3.0 0.25 0.0 6.0 1.0 0.515873015873 0.333333333333 0.333333333333 0.333333333333 0.25 0.5 0.416666666667 0.75 0.75 0.583333333333 0.5 1.0 1.0 0.583333333333 0.416666666667 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -2.84963136203 -4.18350136127 -4.06269420442 -5.44858289867 3.14329723694 7.07314057423 0.56646533379 19.8022761703 -3.57564676952 2.02085521998 -5.76326922113 34.90533651 3.46561445977 -0.593045632963 2.5504663567 31.399723804 -2.59229026557 -0.404903519471 -3.78622234887 23.7738247115 1.48497321706 -1.24409247494 -1.2225431768 10.6773382661 -0.204006253597 -0.186182805302 1 2 4 4 3 4 1 7 2 13 2 4 4 4 2 4 4 4 2 3 5 4 3 2 6 3 2 3 5 4 2 3 5 4 2 3 5 4 2 3 6 3 1 4 5 4 1 6 3 10 6 2 1 0 196.0 1.0 111.0 0.558558558559 0.255466472303 0.254008746356 0.101672533341 0.0997600648964 0.0493585527714 0.0270495745856 0.00532065152116 0.00945709247178 -0.00385100342842 0.428571428571 0.928571428571 2.0 2.0 2.0 0.0 2.0 3.0 3.0 3.0 4.0 7.0 0.277777777778 0.0 1.0 2.0 0.566326530612 0.8125 0.6875 0.6875 0.875 0.5625 0.375 0.25 0.375 0.75 0.1875 0.1875 0.1875 0.8125 0.9375 0.9375 0.9375 0.75 1.0 0.75 0.5 0.5 0.25 0.25 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.59154943092 6.41167056456 -10.2939472186 17.1567833864 -9.04306322425 2.60169611054 -37.477143647 27.0329755305 2.79824635739 0.12161759589 -30.2328209995 27.9236862015 0.732147707966 -0.0741260471231 -20.7813512986 26.6632558174 -1.08829074786 0.312955089953 -29.6400300199 30.5989051747 -0.637417575504 1.0429149233 -36.8391861436 40.5466841163 0.00621908716322 0.0637505086841 3 4 4 3 2 3 1 3 4 2 2 2 5 1 1 4 7 4 7 7 7 3 7 4 7 3 6 3 1 3 2 4 3 5 7 2 4 0 140.0 0.714285714286 60.0 1.06666666667 0.199285714286 0.191836734694 0.0591322886297 0.117865889213 0.0571268221574 0.0158588694688 0.0175774942538 0.0114796640658 0.0584345213334 1.4 0.285714285714 3.0 3.0 4.0 2.0 2.0 1.0 0.0 1.0 3.0 9.0 0.333333333333 1.0 3.0 2.0 0.428571428571 0.583333333333 0.666666666667 0.0833333333333 0.333333333333 0.5 0.75 0.25 0.333333333333 0.333333333333 0.333333333333 0.416666666667 0.5 0.583333333333 0.333333333333 0.916666666667 0.75 0.25 0.75 0.75 0.75 0.75 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.75 0.75 0.5 0.75 1.0 1.0 0.5 0.0 0.75 0.25 0.0 0.25 0.75 1.0 0.5 0.0 0.5 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.5 0.75 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.5 1.0 1.0 -2.63742477124 1.81891363534 -8.60313182828 6.67380403242 -2.55668727824 3.81229449692 -12.597141306 22.3441085462 3.82049513836 1.94868452485 0.723865440499 31.2415656395 -1.46646259303 -1.3511037018 0.0947158432205 27.1539215646 0.726525831411 1.2068947934 0.716339284768 31.1691984922 0.0607008781989 -0.341638312346 6.2360750033 32.6917915621 0.191382593602 0.190445853197 3 2 4 4 2 5 3 4 33 1 3 5 2 5 3 4 3 3 5 3 4 2 5 2 5 2 4 3 4 4 3 4 2 13 154.0 0.318181818182 66.0 0.863636363636 0.203153988868 0.237308146399 0.0223294373025 0.36694609152 0.0642877951868 0.00277555405115 0.0289339219802 0.00581358766917 0.580997465095 1.28571428571 195225786.0 0.0 2.0 1.0 3.0 4294967295.0 4294967293.0 0.0 0.0 4.0 0.0 0.0 2.0 8.0 1.0 0.428571428571 0.0833333333333 0.166666666667 0.0833333333333 0.0833333333333 0.333333333333 0.333333333333 0.333333333333 0.416666666667 0.583333333333 0.333333333333 0.75 0.833333333333 0.666666666667 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 -3.93546768373 -4.51758339496 -6.47147211308 1.76541215613 4.89924592664 -2.30208003807 12.4633944929 -2.09848615337 2.34769327987 -5.38701149053 24.4188809543 2.26651133811 -1.99084554908 0.742153934208 17.5594495436 -1.46671332881 1.3560567067 -0.80277308067 20.0040984822 1.27247067764 -1.1935019572 2.78162955302 11.3166116274 -0.222297816409 -0.301309285835 1 3 2 14 1 9 2 4 2 1 3 3 7 3 6 4 7 3 7 3 6 4 6 4 6 5 4 3 1 1 5 0 130.0 0.769230769231 64.0 0.5625 0.181538461538 0.188165680473 0.046483386436 0.107936276741 0.0200418752845 0.0132851065284 0.00218645365308 -0.00356739579917 0.0563345006206 0.4 0.230769230769 3.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 6.0 0.166666666667 0.0 2.0 1.0 0.492307692308 0.666666666667 0.416666666667 0.5 0.75 0.916666666667 1.0 1.0 0.916666666667 0.75 0.416666666667 0.333333333333 0.416666666667 0.833333333333 0.0833333333333 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.25 0.25 0.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -8.71679380626 6.07237321335 -16.6374946354 16.2984188443 6.04049875957 2.58125122087 0.363199343014 26.382087759 -1.34394973699 0.447600317852 1.15029252775 29.4070140556 -0.108558482221 0.406180887013 -2.44036297916 32.6015938757 0.292342366475 0.833523156267 0.528330315944 40.0226222978 0.0943998164163 0.622579434059 2.29215873644 47.393562371 0.0661730170052 0.112911123369 3 1 2 1 5 7 3 4 3 3 1 3 4 3 1 2 5 3 8 3 6 5 4 7 3 4 1 2 3 3 3 2 3 3 3 2 3 4 2 3 2 5 1 4 1 4 3 3 1 4 6 0 165.0 0.733333333333 85.0 0.811764705882 0.231955922865 0.253737373737 0.0639416757103 0.138688482622 0.0552671619779 0.0145235957846 0.0073283013081 0.00685328585235 0.0594805932385 0.818181818182 0.666666666667 1.0 2.0 3.0 1.0 2.0 2.0 2.0 3.0 3.0 5.0 0.290322580645 0.0 2.0 1.0 0.515151515152 0.666666666667 0.416666666667 0.25 0.666666666667 0.583333333333 0.0833333333333 0.583333333333 0.833333333333 0.333333333333 0.166666666667 0.583333333333 0.25 0.583333333333 0.75 0.833333333333 0.666666666667 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.0 0.0 0.0 0.5 1.0 0.75 0.75 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 -4.41389708842 0.339530545263 -11.9931055192 2.49960883449 -1.82441079654 3.1463163861 -17.5250125388 17.1608220434 0.858769158877 2.92264539974 -15.4970860235 28.0595216931 -0.737156676388 -2.86201182072 -15.2612684868 15.2419453407 1.2818687313 0.217157798123 -6.63220085913 6.32177687277 0.400151169889 -1.58091601847 0.940750492989 -6.08762309208 0.111369743038 -0.108187946728 2 1 4 8 2 15 2 5 2 2 3 4 7 4 7 3 8 3 8 3 8 3 8 3 8 4 6 6 5 6 4 0 154.0 0.785714285714 70.0 0.6 0.170011806375 0.185528756957 0.0454293555997 0.109168450035 0.027363301229 0.0133061519339 0.00736986913349 -0.00202385675393 0.0624074463338 0.272727272727 0.214285714286 1.0 0.0 2.0 0.0 2.0 1.0 0.0 0.0 1.0 6.0 0.0833333333333 0.0 1.0 1.0 0.454545454545 0.75 0.416666666667 0.333333333333 0.416666666667 0.75 1.0 1.0 1.0 0.5 0.583333333333 0.333333333333 0.583333333333 0.75 0.0833333333333 0.0 0.0833333333333 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -10.0949706761 3.91066431597 -20.0472529913 10.1172643053 5.84233203636 1.0890281383 -4.57243584694 14.4075499563 -2.11771148723 -0.143127707941 -8.82703743014 12.2099765336 -0.989584792105 -0.931641889722 -16.6606432095 5.58201574213 1.12937447482 -0.136204771598 -9.24730529325 3.25386814513 0.00482918536783 0.104564840314 -5.22837774006 2.06420577172 0.137732965844 -0.244657970357 9 4 2 2 7 1 1 2 1 7 5 4 3 5 6 3 4 2 9 2 4 3 9 2 4 3 9 2 3 4 9 2 2 3 12 5 11 3 15 3 15 4 14 6 11 9 8 3 4 4 6 3 6 4 4 4 7 3 4 4 7 3 5 4 5 3 8 8 13 3 9 0 378.0 0.857142857143 127.0 0.92125984252 0.150205761317 0.158856135047 0.0525238292238 0.0937846832944 0.036957459405 0.0171335779844 0.0122152504505 0.00545491332117 0.0473177660339 1.11111111111 0.666666666667 0.0 7.0 9.0 1.0 6.0 3.0 1.0 4.0 2.0 14.0 0.314814814815 0.0 4.0 1.0 0.335978835979 0.0 0.0666666666667 0.366666666667 0.566666666667 0.433333333333 0.5 0.6 0.3 0.5 0.366666666667 0.433333333333 0.466666666667 0.633333333333 0.133333333333 0.1 0.233333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 0.0 0.0 0.0 0.0 0.222222222222 0.333333333333 0.666666666667 0.777777777778 0.333333333333 0.666666666667 0.666666666667 0.555555555556 0.777777777778 1.0 0.777777777778 0.111111111111 0.555555555556 0.666666666667 0.333333333333 0.555555555556 0.555555555556 0.666666666667 0.666666666667 0.0 0.555555555556 0.111111111111 0.111111111111 0.666666666667 0.333333333333 0.222222222222 0.777777777778 0.333333333333 0.666666666667 0.444444444444 0.777777777778 0.666666666667 0.111111111111 0.0 0.555555555556 0.888888888889 0.777777777778 0.777777777778 0.666666666667 0.222222222222 0.0 0.0 0.111111111111 0.555555555556 0.888888888889 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -12.6717649928 0.606304545112 -27.4676396405 2.61210752051 3.61844202331 1.38501405611 -21.8910352083 6.18717934273 -3.06846914086 -0.146975721317 -24.9240002529 11.8964440555 2.97562513989 2.5800119887 -12.0874853896 19.1425383991 -0.0410246419428 -3.09751337936 -7.65349668715 4.65146531331 -1.19884956286 0.619108904761 -19.9627932635 -5.59709082409 -0.0276460827297 -0.726651183727 8 1 6 8 3 3 4 3 1 3 5 3 1 20 3 3 9 3 9 4 8 4 8 4 8 4 6 2 2 9 5 5 3 0 168.0 0.857142857143 79.0 0.73417721519 0.184523809524 0.218112244898 0.065132005183 0.107090343578 0.0383386985747 0.0223511109637 0.00972125882659 0.00606673450197 0.0471771590253 1.16666666667 0.214285714286 0.0 5.0 6.0 3.0 1.0 1.0 0.0 1.0 4.0 11.0 0.25 0.0 3.0 1.0 0.470238095238 0.25 0.833333333333 1.0 0.833333333333 0.583333333333 0.75 0.5 0.75 0.333333333333 0.5 0.0 0.25 0.333333333333 0.5 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.5 1.0 0.75 0.75 1.0 0.5 0.0 0.25 0.5 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 -11.9138843115 4.27444704304 -29.1905798352 10.7464417679 -0.735917608582 1.52658822966 -32.9182517584 22.5975327422 0.444747489573 5.30948920344 -30.0471587002 47.3677675673 -0.998369925405 -0.328562040781 -33.8437951196 45.637218131 0.3702240314 -2.9537271239 -31.2123025857 22.4932520911 0.422285717583 0.514756144056 -27.3709612768 21.2493387412 -0.157220821098 0.138635397968 7 2 12 6 7 5 3 3 5 3 5 4 3 4 6 4 2 4 6 10 7 4 1 4 7 3 1 6 5 4 2 5 5 4 2 5 5 3 4 4 5 3 5 9 8 7 5 0 224.0 1.14285714286 106.0 0.688679245283 0.211774553571 0.235969387755 0.099274749311 0.0831345093841 0.0539817698843 0.0353143699865 0.00786501601727 0.010395410628 -0.000427442027209 0.5 0.714285714286 1.0 3.0 4.0 0.0 1.0 3.0 3.0 2.0 2.0 10.0 0.325 0.0 2.0 3.0 0.473214285714 0.25 0.75 0.875 0.5625 0.5 0.5 0.625 0.8125 0.4375 0.0 0.0 0.25 0.5 0.5 0.375 0.5625 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -8.8330993416 3.58098621957 -27.0473737417 11.9756740651 -8.35376941534 4.87349843319 -54.6144968069 27.7770490223 1.72635125863 -1.35140847949 -48.6966771891 20.1185214691 1.41057685251 -2.76405859798 -36.2872359921 1.34244603588 -0.723890779074 0.8489695491 -37.9162020368 6.56142696669 0.340832017752 1.6017582733 -36.6438705544 21.6286013772 0.00482631010474 -0.209494954222 1 3 1 9 2 3 26 4 1 4 2 3 2 3 2 3 2 3 2 3 2 4 1 4 1 3 1 10 1 4 110.0 0.227272727273 63.0 0.507936507937 0.229090909091 0.313223140496 0.015675432006 0.564850488355 0.0589872276484 0.00140966848677 0.0163065664182 0.00300467118924 1.30370089035 1.4 195225785.955 2.0 1.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 6.0 4.0 0.260869565217 0.0 3.0 1.0 0.572727272727 0.5 0.333333333333 0.583333333333 0.666666666667 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 1.0 1.0 0.416666666667 0.166666666667 0.5 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -3.47247148564 -3.93546768373 -5.68518891212 -3.73620879302 2.96308000738 8.51520796954 -1.54336785766 24.9547141758 -3.29971952755 0.830250990054 -6.34859506494 35.923103822 3.40093609295 -0.296557101315 0.569792188389 33.7784146864 -3.06418276537 0.404694874496 -7.29520216673 32.3635244158 1.9819012747 -1.37515579791 -4.83476137627 21.166355031 -0.454008478524 -0.0179279804598 3 1 5 2 4 3 4 4 2 13 1 5 3 3 4 2 5 3 4 3 4 3 4 3 4 3 4 4 4 5 3 4 119.0 0.411764705882 61.0 0.639344262295 0.188475390156 0.24962926347 0.0232939443696 0.240232524053 0.0511079369959 0.0037682935897 0.0192626751977 0.00527864060161 0.312335193975 0.571428571429 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 2.0 4.0 0.24 0.0 3.0 1.0 0.512605042017 0.4 0.8 0.5 0.3 0.7 1.0 1.0 0.7 0.9 0.9 0.9 0.9 0.7 0.7 0.4 0.8 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 -6.44109416748 2.62137553328 -10.3460207497 5.63648187276 6.59399694204 -0.811162176882 4.85378783646 4.76454034788 -4.22574629811 1.43652475037 -3.59849284915 11.8218261226 2.09800114862 0.85373113042 -1.38097710165 15.8650728583 -1.02530168141 -1.48775181628 -1.94351993028 5.56155740882 0.362919324407 -0.330146629933 -1.68407676167 -2.40146334456 0.130323516064 -0.131531330615 1 1 57 5 13 3 4 5 1 1 1 7 1 1 1 4 1 6 1 2 2 118 1 11 2 11 1 1 2 30 41 2 2 4 5 5 354.0 9.83333333333 217.0 0.566820276498 0.320597529446 0.280602636535 1.15537886325 0.0073459492144 0.0603953882551 0.65911795813 0.000383462200062 0.0136958075215 -0.0431380520988 0.0 2.16666666667 0.0 0.0 0.0 0.0 0.0 8.0 0.0 3.0 4.0 8.0 0.121212121212 0.0 1.0 26.0 0.612994350282 0.2 0.666666666667 1.0 0.9 0.233333333333 0.733333333333 1.0 0.9 0.366666666667 0.866666666667 1.0 0.966666666667 0.4 0.9 1.0 1.0 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.95617142961 3.4312726714 8.1374405261 4.86485557818 -9.08561083805 -3.69250565012 -22.282024344 -0.225517380239 -1.60878684902 4.06126219628 -42.3217962523 5.18629511953 -2.25207481522 -4.08201219658 -55.3254149573 -0.05524035454 -0.902186655912 4.19220932546 -70.3357111599 6.45545031191 -1.54075099971 -3.99570022575 -76.8705140825 0.594293964842 0.63405056017 1.17692472383 2 3 4 5 1 5 2 5 3 4 3 1 7 3 12 4 10 5 9 4 10 5 9 6 8 1 2 3 7 2 2 5 5 2 3 5 1 5 3 5 1 4 10 0 196.0 1.0 82.0 0.865853658537 0.185860058309 0.19387755102 0.0705164302289 0.0927217825906 0.0482016421729 0.0216883562912 0.0131381649167 0.00918268904686 0.0249771035028 0.642857142857 0.5 2.0 1.0 3.0 3.0 3.0 0.0 1.0 3.0 1.0 4.0 0.25 2.0 1.0 2.0 0.418367346939 0.5 0.0625 0.0 0.375 0.6875 0.75 0.625 0.4375 0.25 0.4375 0.75 0.625 0.5625 0.0 0.125 0.75 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.25 0.25 0.0 0.25 0.75 0.75 0.75 1.0 -3.95613715686 0.773038295018 -7.22868449556 3.93879388045 3.05271245073 3.29399691256 0.466581135449 17.0131156494 -1.41938330845 1.87867604658 -1.75427906482 29.0566186278 0.569064249079 0.420860179044 -0.113778472009 31.1790742956 0.521771236737 -0.564266424652 4.7996485086 29.8856212686 -0.288782106132 1.21775737766 2.64904314357 38.7685378486 -0.0336478668864 0.0532293310015 2 7 4 9 2 10 3 3 4 3 10 2 9 3 5 7 5 2 1 3 4 3 2 3 3 3 4 2 3 4 3 3 3 10 2 3 2 1 1 2 1 0 156.0 0.923076923077 83.0 0.722891566265 0.255876068376 0.242603550296 0.0827672731334 0.111699034036 0.0589787842007 0.0168144411103 0.0108483631854 0.00748325663047 0.00840457072806 1.08333333333 0.538461538462 2.0 5.0 5.0 1.0 0.0 1.0 2.0 2.0 2.0 9.0 0.388888888889 0.0 3.0 3.0 0.532051282051 0.666666666667 0.166666666667 0.25 0.5 0.916666666667 0.25 0.583333333333 0.916666666667 0.75 0.25 0.5 0.416666666667 0.833333333333 0.416666666667 0.666666666667 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.25 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.25 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.5 1.0 0.75 1.0 1.0 0.5 0.0 0.0 0.5 0.75 0.25 1.0 1.0 0.5 0.0 0.0 0.5 0.75 0.5 1.0 1.0 0.75 0.25 0.25 0.75 1.0 1.0 -0.979415034412 0.783532027529 -4.68671137655 3.84763951643 -3.14224160744 3.25930778315 -13.4860469339 17.2158468237 1.46887221971 1.78694463349 -9.15966827384 25.8738685767 0.105698424396 -0.927393356167 -4.21658390313 24.8436739369 0.481424131209 1.76284439185 -1.310294618 37.7291151908 0.133589360654 1.37618878584 3.41693962047 55.4643782136 0.1866554966 0.206017239587 2 7 2 3 2 5 1 2 4 4 1 2 4 4 7 4 7 4 5 6 3 3 2 3 3 2 3 3 8 3 1 4 2 16 1 3 4 3 1 3 4 2 1 0 154.0 0.785714285714 86.0 0.651162790698 0.281582054309 0.262987012987 0.0822035318367 0.13389311397 0.0581789815851 0.0136903844852 0.00653813921947 0.00597668737183 0.0195653039602 1.0 0.571428571429 2.0 4.0 3.0 0.0 2.0 1.0 2.0 2.0 4.0 11.0 0.121212121212 1.0 3.0 2.0 0.558441558442 0.666666666667 0.166666666667 0.166666666667 0.666666666667 0.333333333333 0.0833333333333 0.5 0.583333333333 0.583333333333 0.5 0.333333333333 0.333333333333 1.0 1.0 0.75 0.75 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.25 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.181891363534 -0.954929658551 -2.93148710111 -2.1884495942 -4.61502934108 0.497649202525 -16.5170536407 1.41172840061 1.0600323368 1.50029835575 -18.3087598525 6.67704830141 -1.58042726023 -1.22830515842 -22.9050682514 2.6358556527 0.692682968248 0.388646984426 -21.2284431293 -0.6500626793 0.111842182266 -1.49749705544 -16.597541673 -14.6802799821 0.0505865591596 -0.30983842309 1 5 2 9 5 4 4 1 5 1 3 4 4 1 3 5 3 9 3 9 3 6 6 4 3 2 2 4 3 3 3 2 3 4 3 2 3 4 3 2 11 2 4 2 4 168.0 0.857142857143 83.0 0.807228915663 0.250992063492 0.254676870748 0.08482058498 0.127879810158 0.0668179226056 0.0192236819034 0.0123025124071 0.00998933874115 0.0271967490558 1.0 0.571428571429 2.0 5.0 4.0 1.0 1.0 2.0 2.0 2.0 2.0 7.0 0.314285714286 0.0 3.0 2.0 0.494047619048 0.416666666667 0.5 0.0833333333333 0.583333333333 0.416666666667 0.166666666667 0.416666666667 0.833333333333 0.583333333333 0.0 0.416666666667 0.333333333333 0.75 0.416666666667 0.5 0.5 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.25 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.227364204417 0.0454728408834 -2.76608709213 2.07111599879 -4.55146016556 3.25687622613 -15.6176802707 15.4285454437 2.04106011061 1.9824624556 -8.83629152603 25.8354973633 0.640049445119 -0.685893628146 -1.81594550726 23.6981302038 -0.428377562537 -0.0254664084507 -3.23890211694 19.5154327197 0.445288604986 -0.518181903716 -1.16437340852 16.6904907974 -0.0836596220061 0.0565488957502 3 1 13 3 10 5 11 4 11 4 12 3 12 3 12 3 13 2 13 2 3 2 8 10 4 4 1 7 3 3 5 5 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 3 6 4 2 3 6 4 2 4 4 4 3 4 3 4 8 5 4 0 345.0 0.652173913043 126.0 0.730158730159 0.16270531401 0.203024574669 0.0501325930188 0.148022099851 0.0684076965928 0.0185497548048 0.0257066667724 0.019794380946 0.11152467056 0.533333333333 0.521739130435 1.0 1.0 3.0 1.0 0.0 1.0 5.0 5.0 2.0 10.0 0.22 0.0 2.0 3.0 0.365217391304 0.625 0.375 0.458333333333 0.5 0.458333333333 0.583333333333 0.625 0.541666666667 0.0 0.25 0.291666666667 0.0 0.0 0.208333333333 0.583333333333 0.416666666667 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.333333333333 0.0 0.333333333333 0.5 0.5 0.833333333333 1.0 1.0 0.833333333333 0.5 0.833333333333 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.0 -6.91978013443 -9.63233394713 -16.5373808573 -22.3095843121 0.415448425462 2.93848659622 -14.7848209237 -3.17134921026 0.811337365051 8.2690305613 -12.3366909555 31.9128615243 -1.54307153086 -3.68629109577 -14.7807343081 28.8900725006 2.30512350989 2.98498825897 -4.2460112646 30.594360307 -1.19385293926 -3.58522109015 -7.33738815566 11.9398857858 0.0962801183885 0.194715957352 1 8 4 9 5 10 4 11 3 10 4 11 3 11 3 10 4 6 8 5 2 3 4 4 2 4 4 3 2 6 3 2 3 6 3 2 3 7 2 2 3 6 3 2 3 6 3 2 3 6 4 1 4 5 4 2 4 4 4 2 4 4 5 3 1 5 3 2 0 294.0 0.666666666667 114.0 0.728070175439 0.202623906706 0.208292840946 0.0633782598143 0.148651528731 0.058088749869 0.0168267921827 0.0174218037359 0.0127051547953 0.0907048094886 0.428571428571 0.571428571429 0.0 2.0 4.0 0.0 0.0 1.0 5.0 5.0 3.0 9.0 0.190476190476 0.0 1.0 2.0 0.387755102041 0.0 0.125 0.666666666667 0.708333333333 0.0 0.25 0.0416666666667 0.25 0.458333333333 0.5 0.25 0.25 0.75 0.75 0.708333333333 0.916666666667 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.166666666667 0.5 0.666666666667 0.166666666667 0.0 0.0 -1.97048977161 -5.21421908796 -8.069419785 -14.3040383277 -3.43716933788 -1.3866638644 -10.9411580153 -11.5183848714 6.39258920054 6.68405361641 7.27038148405 16.557422649 -4.81727643712 -1.48229807402 -5.90998977647 18.7935012697 2.13867187475 0.389131496191 -4.9815820833 14.4395297628 -1.07712779777 -0.796671167307 -5.58069814914 8.28394657853 0.0908199057107 -0.173928908759 2 3 3 4 2 7 1 6 1 6 2 5 3 4 3 3 3 4 1 5 2 4 3 0 77.0 0.636363636364 51.0 0.43137254902 0.300556586271 0.291617473436 0.0531571649804 0.14617563243 0.0393553149499 0.00506814540029 -0.00627294650402 -0.00152129557595 0.050233548256 0.428571428571 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.111111111111 0.0 2.0 1.0 0.662337662338 0.5 0.666666666667 0.166666666667 0.0 0.833333333333 1.0 0.5 0.166666666667 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -3.2409733866 4.16696578277 -8.03337079055 9.49850174541 -0.198973572731 -0.780588631483 -8.06509933741 7.40119570588 0.958912213274 -0.0818726287032 -3.42061269189 6.21784367123 -0.240773777139 0.555321230034 -2.93034965097 9.30736557152 0.278280408083 -0.0701687727726 -0.482406670607 9.21512976727 0.395952157796 -0.222733606989 2.84276356186 5.8853548239 -0.0821240368612 -0.120061466481 1 5 9 6 9 6 10 5 11 4 11 4 12 3 11 4 11 4 11 9 6 9 6 4 4 3 4 4 4 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 6 2 3 4 5 3 2 6 4 11 3 6 330.0 0.681818181818 138.0 0.557971014493 0.156363636364 0.223691460055 0.0421177059855 0.155555110332 0.0606334418566 0.013840899461 0.0213145063158 0.0164853464298 0.125606832122 0.4 0.5 3.0 1.0 1.0 0.0 0.0 0.0 5.0 5.0 1.0 3.0 0.279069767442 0.0 1.0 2.0 0.418181818182 0.75 0.458333333333 0.5 0.625 0.75 0.833333333333 0.666666666667 0.541666666667 0.0 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.708333333333 0.708333333333 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.333333333333 0.333333333333 0.5 0.5 0.5 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -12.5587718731 -7.46581369413 -26.3390578802 -18.7787726047 6.03437581002 -0.526251618743 -6.29175846066 -17.4912273293 0.806272156537 3.06444393089 -2.1176092673 -5.19737935977 -3.95905831096 -0.97317100396 -17.5658095612 2.85775541205 3.78045638873 3.83596230213 -0.129158071841 21.5607605471 -1.13736619715 -1.93178821649 -1.41111027295 20.7121635577 -0.177476426599 0.594557248642 1 3 6 4 3 3 3 1 3 4 3 1 3 3 4 1 13 5 1 2 3 8 3 8 3 8 3 9 4 4 2 1 5 1 4 3 6 6 5 2 0 154.0 0.785714285714 77.0 0.688311688312 0.213105076741 0.224953617811 0.0681716874793 0.122852291072 0.044909951745 0.0201743554235 0.0132682689231 0.00614221407664 0.0522875963591 1.09090909091 0.428571428571 0.0 1.0 4.0 2.0 2.0 2.0 0.0 2.0 2.0 14.0 0.176470588235 0.0 3.0 1.0 0.5 0.416666666667 0.833333333333 1.0 0.583333333333 0.75 0.583333333333 0.333333333333 0.75 0.333333333333 0.25 0.0 0.5 0.583333333333 0.5 0.0 0.416666666667 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.5 0.75 1.0 0.75 0.25 0.0 0.0 -8.45794840431 1.45513090827 -20.0277816699 5.88649626367 0.778142389403 3.91344836745 -16.1259728762 22.0679675282 2.41015052767 2.45324177349 -1.82202867211 35.1957826535 0.310595828084 -0.761872158505 3.65700998896 30.1182086609 0.198283379602 -1.21828988697 5.68904118041 18.3776074082 0.151911563272 -0.224163271665 5.77307431391 12.5612236854 -0.185362828436 -0.166558575665 3 1 4 4 2 5 3 4 4 2 28 1 5 2 2 5 3 4 4 3 4 3 4 4 3 3 3 5 3 4 2 5 2 5 1 7 1 5 1 0 154.0 0.318181818182 72.0 0.75 0.190166975881 0.26800472255 0.0188105241023 0.38844398981 0.0632610347992 0.00223641056547 0.0235581941542 0.00579461177887 0.659683838417 1.28571428571 195225786.045 2.0 3.0 1.0 1.0 0.0 4294967293.0 0.0 0.0 4.0 4.0 0.148148148148 1.0 7.0 1.0 0.467532467532 0.333333333333 0.166666666667 0.25 0.416666666667 0.583333333333 0.166666666667 0.666666666667 0.833333333333 0.75 0.25 1.0 1.0 0.666666666667 0.416666666667 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -4.74571103038 -5.2955190156 -8.65946628412 -6.70196824586 3.09676537655 8.82341372899 -4.21327108006 21.9473531909 -3.24565066489 0.19260864982 -8.33905115767 31.2202258931 3.46169815875 0.116468716375 -0.299926407543 31.1448066209 -2.7389129999 0.74072274817 -5.78410118152 33.6936474093 1.94325758933 -1.30503278931 -2.89223774297 21.8324116668 -0.446452882864 -0.207434503962 3 6 4 2 1 6 2 2 3 5 2 2 4 4 8 4 7 5 6 6 5 2 1 4 3 2 3 4 2 2 4 3 3 2 3 6 1 3 1 13 2 5 156.0 0.923076923077 88.0 0.590909090909 0.268162393162 0.282544378698 0.0838506633625 0.125095616497 0.0586010595256 0.0127325872175 0.00667305601099 0.00683287947835 0.00655136133976 0.916666666667 0.692307692308 4.0 6.0 0.0 1.0 2.0 1.0 2.0 3.0 6.0 11.0 0.0833333333333 0.0 3.0 2.0 0.564102564103 0.5 0.166666666667 0.333333333333 0.833333333333 0.333333333333 0.0833333333333 0.333333333333 0.416666666667 0.75 0.583333333333 0.583333333333 0.583333333333 1.0 1.0 1.0 0.916666666667 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.5 1.0 0.75 0.25 0.0 0.25 0.75 0.75 0.25 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.685590524088 0.391766013765 -0.232047815106 1.47508619686 -2.56908097488 1.14284405199 -7.56629577053 7.96181411029 0.791264883181 2.29917173521 -6.99569799621 19.9779672863 -0.341816934412 0.577527429993 -5.51991443635 28.044118391 0.775933591739 1.28076839485 -0.512799341083 40.7474576341 0.147694730588 1.53883131333 2.46528431975 57.3148293112 -0.0379605379744 0.154466056896 8 1 1 20 1 5 2 1 2 4 6 4 7 2 7 3 7 3 7 3 7 3 7 5 5 5 5 4 5 0 140.0 0.714285714286 63.0 0.666666666667 0.15 0.186224489796 0.0360714285714 0.115887390671 0.0232397959184 0.0110991176106 0.00535290028063 -0.00146608391126 0.0825754272973 0.3 0.0714285714286 1.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 2.0 5.0 0.0869565217391 0.0 1.0 1.0 0.45 0.666666666667 0.583333333333 0.583333333333 0.666666666667 0.75 0.916666666667 0.666666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.333333333333 0.666666666667 0.0833333333333 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.25 0.25 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -10.4132805623 6.22977920103 -20.8622041617 16.9220409121 6.15878588822 2.98218314651 -1.66709637618 28.5749050355 0.15148459717 0.536195058172 4.36591770024 31.4080626046 -1.23799281715 -0.191333532307 -1.97417866956 30.5700476212 1.10744913676 0.575269463129 3.40337882773 34.6770993615 -0.247121912713 0.364706935514 4.40241938223 37.4613965813 0.0367720646886 -0.143739851577 2 3 5 5 3 18 1 7 2 4 5 4 6 3 6 3 6 3 6 3 6 3 6 4 1 1 3 4 1 1 4 5 1 0 135.0 0.6 71.0 0.56338028169 0.210699588477 0.223209876543 0.0379998983895 0.151146065132 0.0460836254636 0.00681734788635 0.0143163398181 0.00285981557539 0.110581578297 0.333333333333 0.133333333333 0.0 0.0 1.0 2.0 0.0 0.0 0.0 2.0 7.0 4.0 0.0689655172414 1.0 3.0 1.0 0.525925925926 0.75 0.75 0.416666666667 0.333333333333 1.0 1.0 1.0 1.0 0.75 0.666666666667 0.333333333333 0.416666666667 0.5 0.416666666667 0.0 0.0833333333333 0.25 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 -6.87549354157 6.11154981473 -12.1226867673 15.5609644963 5.5977269229 1.27663485019 0.085589146171 20.6798103267 -4.01875898496 -0.122130394652 -8.98162877219 19.558962732 1.67765610047 -0.119632791194 -7.28310867115 16.3936979843 -0.379970650974 -0.927952824738 -3.86564687275 6.69194675774 0.406874725756 -1.10454812729 -1.68047732186 -6.09836425449 0.146148880959 -0.144923553706 1 4 4 4 2 5 4 5 2 4 5 5 1 4 5 4 3 3 5 4 3 2 6 4 3 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 4 5 4 12 4 4 1 1 1 4 195.0 1.15384615385 101.0 0.564356435644 0.261196581197 0.240631163708 0.121727473491 0.089409464084 0.0644852408166 0.0341842013747 0.0130557758951 0.00979452707064 -0.0187194481783 0.266666666667 1.0 0.0 1.0 1.0 1.0 3.0 3.0 3.0 2.0 3.0 7.0 0.157894736842 0.0 1.0 2.0 0.517948717949 0.8125 0.5625 0.5 0.3125 0.5 0.4375 0.5 0.6875 0.125 0.0 0.0 0.5 0.875 0.75 0.75 0.875 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.5 0.5 0.5 0.5 0.25 0.25 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.65431943371e-16 0.933708999472 -3.26724188617 5.51264596337 -3.89328358568 4.94582827599 -9.84959015112 22.9475521843 5.42605021905 0.411770908436 11.533458919 25.7188553562 -0.480070444433 -1.79922968365 14.0054560427 13.9232213602 -1.5218704554 0.00145248354144 1.73028175723 10.0241104886 0.512138174665 -0.270340282138 0.56383655741 5.33866885917 -0.288749985701 -0.342129906276 3 2 3 3 2 23 2 6 1 3 3 4 8 4 8 4 8 4 8 4 8 4 8 4 8 5 6 7 4 8 5 1 4 1 4 0 180.0 0.8 87.0 0.551724137931 0.210185185185 0.195925925926 0.0547812071331 0.105750857339 0.0372143347051 0.0122147988049 0.00870436208297 -0.000676034249869 0.0390569012378 0.333333333333 0.2 2.0 0.0 2.0 0.0 1.0 1.0 0.0 0.0 3.0 8.0 0.166666666667 0.0 2.0 1.0 0.483333333333 0.5 0.0833333333333 0.0 0.0833333333333 0.916666666667 0.75 0.666666666667 0.75 0.833333333333 1.0 1.0 1.0 0.75 0.416666666667 0.333333333333 0.583333333333 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -8.10629176815 6.79061090525 -14.430069876 19.7487182576 6.46635923453 5.09748525288 -0.167656027699 38.0245349538 -4.65310683689 -0.036887269115 -12.2979498958 38.4173769679 0.819865329828 -1.09413303695 -17.8095265825 30.2717961424 -0.964732908093 0.297502591208 -21.2591003955 30.6633965588 -0.512334720165 0.387656672621 -31.968176673 35.3385945058 -0.290945454263 0.0981560804024 1 1 4 2 4 1 11 2 11 2 8 4 4 8 4 9 2 10 3 9 3 9 2 10 3 8 4 8 5 7 4 6 0 168.0 0.857142857143 72.0 0.555555555556 0.166170634921 0.150510204082 0.0473708208482 0.0814225988014 0.025514000243 0.0134623848446 0.00683218156523 -0.000985928908296 0.0367149394314 0.333333333333 0.0714285714286 1.0 2.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 6.0 0.12 0.0 1.0 1.0 0.428571428571 0.666666666667 0.25 0.0 0.166666666667 1.0 0.916666666667 0.666666666667 0.833333333333 0.833333333333 0.666666666667 0.5 0.666666666667 0.916666666667 0.25 0.0 0.0833333333333 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.5 1.0 1.0 0.75 0.5 0.25 0.25 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -8.95814965403 7.50301874576 -17.4599307785 19.5253090309 5.67064886159 2.19522459408 -1.78454197689 27.9999833906 -1.33038835663 -0.0115623362596 -0.461754987532 28.5252015892 0.4447660905 0.587446023397 0.466667017587 32.1086153535 0.78253711552 0.663511405246 6.69937870033 37.0752433285 -0.54523586576 -0.17819177366 2.4111729118 35.4746009313 -0.0633415366342 -0.0999224114967 1 2 3 6 3 4 1 1 1 5 3 5 3 5 3 3 5 4 3 3 5 4 3 3 5 4 3 3 5 4 3 2 6 4 3 2 7 3 3 2 7 3 3 3 5 4 2 5 4 5 1 5 3 7 195.0 1.15384615385 101.0 0.584158415842 0.232136752137 0.239447731755 0.108525632597 0.0899281511826 0.055026821086 0.0315529956813 0.0104131678887 0.0132564201614 -0.00453728023722 0.333333333333 1.07692307692 1.0 2.0 2.0 0.0 4.0 3.0 3.0 3.0 7.0 5.0 0.105263157895 0.0 1.0 2.0 0.517948717949 0.8125 0.75 0.5625 0.8125 0.375 0.25 0.0625 0.3125 0.625 0.25 0.125 0.25 0.875 1.0 0.875 0.9375 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 0.75 0.5 0.5 0.5 0.25 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.78253536263 5.4324887242 -12.6414662995 14.1080327506 -11.5644103716 1.71576102206 -46.5552372104 21.5229825885 4.24496177934 0.401467623495 -34.0691820897 21.080918271 1.3233126712 -1.36246847011 -16.3212771066 12.9294992627 -0.0441917058183 -0.0289931848691 -15.4322689068 8.33287412047 0.399723794814 -0.575832221919 -7.19260006334 3.07334827412 0.515309345521 -0.115231444031 1 9 6 10 5 13 3 13 3 13 3 13 3 13 3 13 3 12 4 6 3 3 4 4 3 6 3 4 3 6 3 3 4 6 3 3 4 6 3 2 5 6 3 3 4 6 3 3 4 7 2 4 3 6 3 4 4 5 3 5 5 3 5 4 3 1 1 3 3 1 0 336.0 0.761904761905 117.0 0.769230769231 0.186569940476 0.19175170068 0.0699486748444 0.127593173616 0.0576560190669 0.0233106823419 0.0195333466699 0.0135879746407 0.0674613509288 0.3125 0.619047619048 0.0 2.0 2.0 1.0 0.0 1.0 5.0 5.0 2.0 9.0 0.255813953488 2.0 1.0 2.0 0.348214285714 0.0 0.0833333333333 0.708333333333 0.458333333333 0.0 0.208333333333 0.5 0.666666666667 0.0833333333333 0.0416666666667 0.0 0.166666666667 0.666666666667 0.583333333333 0.5 0.416666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.39450045376 -8.6701549951 -5.72659936209 -21.273130765 -2.12454062032 0.151369910242 -4.02701701357 -16.313645633 7.06064854513 5.10625048353 21.812261942 9.83511057592 -3.10293162469 0.290027360691 14.5881674797 18.5523328708 0.489951996421 -0.178675346626 11.4672797193 14.8931534381 0.429391918316 -0.627132209789 12.6497613232 7.51490828133 -0.517320881779 -0.165416999814 0 4 1 4 1 4 1 4 26 4 1 4 2 3 2 3 2 3 2 2 3 3 2 3 2 3 2 3 1 7 1 2 105.0 0.238095238095 56.0 0.607142857143 0.188571428571 0.27619047619 0.0135743440233 0.510548752834 0.052589569161 0.00139569291232 0.0210033675253 0.00385281681667 1.0978122288 1.2 204522252.0 2.0 1.0 1.0 2.0 4294967295.0 4294967292.0 0.0 0.0 0.0 3.0 0.2 0.0 5.0 1.0 0.533333333333 0.666666666667 0.333333333333 0.583333333333 0.666666666667 0.666666666667 0.333333333333 1.0 0.916666666667 0.666666666667 0.333333333333 0.916666666667 0.916666666667 0.333333333333 0.166666666667 0.416666666667 0.666666666667 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -3.81971863421 -2.24332681691 -6.58988030954 -0.957094961733 2.87974036325 6.52086725049 -2.70102018204 20.5640815628 -3.26929807135 0.135371882652 -7.52068651418 26.5065262433 3.37165158934 -0.150043481126 -0.0333643268783 25.4231896297 -2.81235633811 0.80034532863 -6.81334910413 29.3036276773 1.75602491257 -0.56056751186 -5.27577606614 26.0496935707 -0.429711291512 -0.00916810077777 3 2 5 3 3 5 3 7 1 7 1 5 4 4 4 4 4 4 4 3 5 3 5 3 5 4 4 5 3 7 3 4 4 2 1 1 1 0 136.0 0.470588235294 73.0 0.575342465753 0.193014705882 0.250865051903 0.0257209825972 0.20612405862 0.048951760635 0.00381793605252 0.016402735873 0.00472469852192 0.22790788217 0.375 0.0588235294118 0.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 4.0 5.0 0.304347826087 0.0 2.0 1.0 0.536764705882 0.6 0.7 0.5 0.3 0.7 1.0 1.0 0.6 0.9 1.0 1.0 0.8 1.0 1.0 0.7 1.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 -8.72543570363 4.41889018467 -15.4813616261 12.0488167435 7.00903726992 2.31971650009 -0.00358432428238 21.6640533771 -4.84885940465 0.72059972245 -10.2841881981 23.8837439063 2.28718952287 -0.860037800993 -6.70260865076 20.9680773716 -0.627121980878 0.872899364369 -5.69553476881 22.6502022841 -0.465243087613 -0.875642517726 -11.5538076948 17.4341495894 0.160765977893 -0.0543515476233 0 3 3 3 3 3 3 2 30 2 2 4 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 5 1 11 1 0 132.0 0.272727272727 61.0 0.590163934426 0.138888888889 0.266873278237 0.0110384144475 0.45436240852 0.052580731558 0.00145253426192 0.0232124304739 0.00558294993149 0.923865618369 0.666666666667 195225786.0 2.0 1.0 0.0 0.0 4294967295.0 4294967293.0 0.0 0.0 2.0 1.0 0.210526315789 1.0 6.0 1.0 0.462121212121 0.666666666667 0.333333333333 0.583333333333 0.666666666667 0.583333333333 0.416666666667 1.0 1.0 0.25 0.5 1.0 1.0 0.0 0.25 0.5 0.666666666667 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -5.35339354036 -6.85813118414 -8.89764511784 -13.0761593424 4.5492485424 5.36475320948 -1.72210799015 6.38702729859 -4.63029303689 2.25853840656 -8.49224125864 21.5422376212 4.78396103549 -0.748595679405 3.72111045405 18.955735666 -3.28536402778 0.0474286740282 -2.35790740774 15.5324022714 2.07912474973 -0.732338277595 0.230228410657 9.11796427003 -0.387493408535 -0.0171168895358 1 7 1 17 4 3 3 0 36.0 2.25 27.0 0.333333333333 0.320987654321 0.236111111111 0.180212620027 0.0276920438957 0.0229766803841 0.0241642534167 0.000425494081187 -0.00545045216684 -0.0513823794645 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.166666666667 0.0 2.0 3.0 0.75 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 -2.40500802894 4.10266075526 -5.59217945696 7.75621868606 0.172909073976 -2.97089227105 -5.95027489321 -0.732854411005 -0.32949539337 0.642323033381 -5.70138041582 -0.667635612809 0.640548525789 0.33010712731 -1.90566972923 2.4261482039 0.279262282 -0.279807110314 2.31091645133 0.359827795994 0.313225239211 -0.141572553523 5.16857044623 -1.99065593907 -0.0232136912502 -0.0405849847309 5 5 5 8 2 11 1 28 1 1 1 1 1 1 1 4 8 3 9 4 9 3 9 4 5 2 1 5 1 5 1 10 3 8 2 0 168.0 0.857142857143 103.0 0.446601941748 0.262896825397 0.27593537415 0.0761045985855 0.121451643653 0.0400212416316 0.016319565476 0.00632624069721 0.00150070034693 0.0190345496688 0.75 0.357142857143 0.0 3.0 3.0 3.0 0.0 3.0 0.0 2.0 1.0 6.0 0.333333333333 0.0 2.0 1.0 0.613095238095 0.333333333333 0.916666666667 0.916666666667 0.666666666667 0.666666666667 0.916666666667 0.583333333333 0.916666666667 0.916666666667 0.666666666667 0.0 0.5 1.0 0.666666666667 0.0 0.416666666667 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 -10.4132805623 5.32032238336 -25.1363060763 14.238767922 -0.0440808151421 2.57942369868 -26.0169706389 26.9255793843 0.783748370619 2.84135180756 -20.5042853191 41.221153793 -0.313317059163 0.240999360348 -18.9569501199 43.8197647732 0.982012049286 -0.63552886078 -10.9326866068 38.6196132959 0.445439105367 0.176914334729 -5.78470809893 37.7045493445 -0.115473984666 -0.0340534962486 3 1 6 3 4 4 3 8 1 4 4 4 5 2 6 2 6 2 6 2 6 2 5 4 4 4 5 5 3 5 1 0 120.0 0.533333333333 52.0 0.807692307692 0.161458333333 0.21 0.0258883101852 0.181201388889 0.0475520833333 0.00482953009157 0.0195807116336 0.00535749050787 0.185242082822 0.5 0.0 1.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 0.0 4.0 0.047619047619 0.0 6.0 1.0 0.433333333333 0.375 0.5 0.0 0.25 0.625 0.875 0.5 0.75 0.875 1.0 1.0 1.0 0.875 0.875 0.5 0.75 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 -6.57840431447 2.54647908947 -12.2553872074 7.19174423546 4.59894123558 1.70444333722 -1.75263247181 14.243003006 -2.77432085228 0.864419617828 -6.48700976357 19.2454109471 1.46626866787 0.163068780152 -3.69913047328 19.9539190179 -0.362225302258 -0.413767420028 -2.21380934311 15.3307625027 0.0259521625284 -0.625553323567 -3.02549655267 8.0315137411 0.0476890145976 -0.0787219258773 8 3 7 1 1 5 5 9 3 4 1 4 4 3 10 3 10 3 9 3 10 3 9 4 8 5 10 3 10 4 9 4 9 4 9 4 9 4 9 4 9 4 8 5 8 7 6 7 5 0 286.0 0.590909090909 100.0 0.64 0.122915545992 0.168308963764 0.0250960773297 0.147363413397 0.02661281332 0.00710753470707 0.0111616435705 0.000242478515873 0.141077528294 0.307692307692 0.0909090909091 1.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 1.0 4.0 0.206896551724 0.0 1.0 1.0 0.34965034965 0.125 0.541666666667 0.583333333333 0.583333333333 0.583333333333 0.583333333333 0.666666666667 0.791666666667 0.5 0.0 0.0 0.0833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.666666666667 0.5 0.5 0.0 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.666666666667 0.5 0.666666666667 1.0 1.0 0.5 0.833333333333 0.5 0.166666666667 0.0 0.166666666667 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -14.2950076159 3.21203612422 -24.5597468332 10.2605466683 13.2871060266 3.65954729967 10.3582693868 22.7505629968 -5.6437380854 0.0644529046989 0.192788845568 27.0100314552 1.06798206482 1.04953709284 -1.24455876634 30.8761559004 1.73856358867 -0.392978748808 13.1786757741 30.0465429721 -1.09631938501 0.242819812566 7.64218349037 31.2954132163 0.130925773873 0.071467960023 4 1 2 5 1 5 2 4 2 4 2 4 2 3 3 4 2 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 1 6 126.0 0.285714285714 74.0 0.513513513514 0.301587301587 0.280423280423 0.0244034121585 0.376319251981 0.0528680608046 0.00111251393799 0.00467322359808 -0.00205770288874 0.611119726162 0.5 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 3.0 0.142857142857 0.0 7.0 1.0 0.587301587302 0.166666666667 0.0 0.0 0.25 0.583333333333 0.5 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 0.916666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.9098593171 3.69845772518 -3.4941782692 9.20005191189 1.1876557399 0.746950701495 -2.12220937438 14.4094212048 -1.4289084027 1.92605234754 -4.00797466386 24.070971924 1.55189067029 0.771394997713 -0.464639409478 30.6836720761 -1.20745583107 -0.0825008191671 -1.89123095203 28.7591857531 1.12950174417 -0.90792381016 0.27594573448 16.6122314869 -0.318682531916 -0.440329146705 1 7 1 11 6 6 8 4 2 4 2 4 3 10 2 11 2 11 2 10 3 9 4 8 5 10 3 10 3 10 3 10 3 10 3 10 3 10 3 11 2 11 2 9 6 7 7 10 1 7 0 299.0 0.565217391304 79.0 0.962025316456 0.0897864677129 0.123454994911 0.0189890358719 0.117317416073 0.0221588881092 0.00619122780052 0.0117717888289 0.00155530184632 0.11443007343 0.384615384615 0.0434782608696 2.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 1.0 5.0 0.266666666667 0.0 2.0 1.0 0.264214046823 0.0833333333333 0.5 0.583333333333 0.458333333333 0.416666666667 0.5 0.5 0.583333333333 0.375 0.0 0.0 0.0416666666667 0.375 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.5 0.0 0.166666666667 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -11.5145141437 4.20722632173 -18.5057763402 12.4797184029 12.4592668855 3.83552032495 14.5958639497 28.5611221852 -5.29959101687 2.30939972339 4.57423489037 41.3956954552 1.175969019 -0.00987715673864 5.06137116188 40.6856374606 1.80174078779 -1.15149976662 16.8587313454 29.8192795738 -2.15614451202 -0.495926871654 4.50389334342 22.9117672712 0.326089249461 0.0167507753378 3 1 4 5 4 4 5 3 5 3 5 3 5 2 6 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 4 3 5 3 5 3 4 6 2 15 2 5 1 0 176.0 0.363636363636 81.0 0.62962962963 0.181818181818 0.252324380165 0.0194226615327 0.321976361465 0.0611734598047 0.0025674063092 0.0253187525769 0.00672290280489 0.486507090228 0.5 0.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.133333333333 0.0 10.0 1.0 0.460227272727 0.25 0.0 0.0 0.333333333333 0.583333333333 0.5 0.5 0.75 0.916666666667 1.0 1.0 1.0 0.916666666667 0.916666666667 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.72957795131 -4.51421293133 -9.53404023832 -8.47596016183 5.02432186239 3.90581296856 -0.407969721972 7.2029104427 -4.41516294129 3.13054890404 -6.99691869871 26.7803666242 4.04568198021 0.358106897337 1.77687750292 29.4062355716 -2.89022268731 -1.25799978588 -2.61748510573 18.9650085331 2.13395191316 -0.548889208083 0.769937726063 8.48015047754 -0.46624909952 -0.302887126351 1 4 1 8 7 3 2 3 4 2 2 4 3 2 2 4 2 3 2 1 1 8 5 6 7 7 5 7 5 1 1 5 7 4 3 2 3 2 4 3 7 5 5 3 0 165.0 0.733333333333 78.0 0.974358974359 0.226997245179 0.238383838384 0.0630761610596 0.137752177422 0.0626184712135 0.0137527274523 0.0135252681502 0.00881115642484 0.0612128781773 1.18181818182 0.466666666667 1.0 3.0 4.0 2.0 1.0 3.0 0.0 2.0 1.0 8.0 0.266666666667 1.0 3.0 1.0 0.472727272727 0.416666666667 0.583333333333 0.166666666667 0.5 0.5 0.583333333333 0.5 0.25 0.416666666667 0.333333333333 0.75 0.166666666667 0.666666666667 0.416666666667 0.833333333333 0.833333333333 0.0 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.5 0.75 0.5 0.5 0.5 0.75 1.0 0.5 0.75 0.5 0.0 0.0 0.25 0.75 1.0 0.5 0.75 0.5 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.75 0.5 0.25 0.25 0.75 1.0 0.5 1.0 1.0 1.0 0.5 0.0 0.5 1.0 -3.56507072526 0.509295817894 -10.43485914 3.84217961472 -2.2001579333 4.40937001448 -14.5511183478 22.3352184803 3.18580253099 2.87152299814 -1.09597876718 36.0050781108 -0.113276555827 -1.77989673057 3.42068574145 27.4415416112 -0.142798523798 -0.437415386534 0.0359150571936 16.5042396545 -0.352804989991 -1.40968896335 -1.61869550608 1.89960035978 0.158840617211 -0.294124980239 5 2 10 8 4 4 3 4 3 3 5 4 2 3 6 8 6 7 7 7 7 8 6 8 6 4 1 3 6 3 2 4 5 3 3 10 6 6 8 6 4 0 210.0 0.933333333333 105.0 0.619047619048 0.234693877551 0.240952380952 0.0934434726271 0.10212601231 0.0563070942663 0.0282738148364 0.00852779115879 0.00925274160948 0.0111778287636 0.5 0.666666666667 0.0 3.0 3.0 0.0 1.0 3.0 3.0 1.0 1.0 11.0 0.162162162162 0.0 2.0 2.0 0.5 0.4375 0.8125 0.875 0.75 0.5625 0.1875 0.125 0.5 0.5 0.0625 0.0 0.25 0.5625 0.8125 0.75 0.75 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -2.58892040763 2.12206590789 -12.3864267784 9.88065074528 -8.83401890349 7.55002755816 -40.4755295963 39.0581679253 1.74204739304 2.9858986828 -36.6064399354 56.2451171313 1.1961556782 -1.25742422125 -27.2356216287 50.4722964143 -1.61151846829 0.406306155647 -37.3737293342 51.9519260451 -0.470447367523 0.998811061135 -49.0928229844 60.5927467186 -0.538419839082 -0.043042121689 1 3 2 5 5 3 5 3 6 2 6 3 5 3 5 3 5 2 5 2 5 2 4 5 2 5 0 96.0 0.666666666667 55.0 0.509090909091 0.286458333333 0.255208333333 0.0594437210648 0.129299587674 0.0448404947917 0.00720131079072 -0.00379103584841 -0.000363380182043 0.0310998928802 0.125 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.0555555555556 0.0 5.0 1.0 0.572916666667 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.166666666667 0.166666666667 0.833333333333 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.44037579408 4.77464829276 -6.40086771966 10.7415267899 -0.623356860443 -1.20692498511 -7.67805012188 6.55969765031 1.00769476186 -0.721232238255 -3.26157757277 2.09471356653 -0.25648537487 0.604877305499 -3.44262753265 4.12299569148 -0.0434382680735 -0.473145982715 -2.62287008199 0.348675927091 0.729882965364 -0.644816569269 3.1336168857 -6.63891626325 -0.0545362142865 -0.0365255927283 5 4 7 8 5 2 5 2 3 3 4 4 1 19 6 5 8 4 10 3 9 5 9 4 6 1 3 4 1 1 1 3 3 11 3 6 4 0 182.0 0.928571428571 89.0 0.696629213483 0.19864750634 0.233516483516 0.0692628829931 0.107106861862 0.0454492675541 0.0220141135791 0.0115277602745 0.00695526060242 0.0344704572358 1.15384615385 0.357142857143 1.0 3.0 6.0 4.0 1.0 1.0 0.0 3.0 0.0 11.0 0.410256410256 0.0 3.0 1.0 0.489010989011 0.25 0.8125 0.9375 0.6875 0.625 0.75 0.375 0.6875 0.5 0.375 0.0 0.375 0.5 0.5 0.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.75 1.0 0.75 0.25 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -10.8225361302 1.81891363534 -24.9766570244 6.01348437962 1.66254274373 3.03554413326 -20.0200633788 21.002537384 0.970009937416 3.98013302916 -12.2824957308 40.9739628709 -0.344658860309 -0.546252579432 -11.0615651805 37.2577677843 0.944245424952 -2.31061365056 -5.53473516606 17.6990849744 -0.514777578519 -0.103580771956 -10.5187843059 10.783008704 -0.322998829952 -0.13244826228 1 2 3 4 2 4 3 2 27 4 2 4 2 4 2 4 3 3 2 4 3 3 3 3 3 3 3 3 3 3 2 5 1 6 2 2 2 0 132.0 0.272727272727 63.0 0.634920634921 0.143939393939 0.259986225895 0.0109931964271 0.416014048891 0.0475180524251 0.00132223796116 0.0211054170446 0.00456166867319 0.813733038265 1.0 195225786.0 3.0 1.0 1.0 0.0 4294967295.0 4294967293.0 0.0 0.0 1.0 7.0 0.2 1.0 5.0 1.0 0.477272727273 0.5 0.5 0.75 0.666666666667 0.666666666667 0.5 1.0 1.0 0.5 0.5 1.0 1.0 0.166666666667 0.25 0.5 0.666666666667 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.0 -5.72957795131 -3.70396958468 -8.72920402268 -5.11642103679 5.8924397338 5.97303359679 1.34168384397 17.0928966961 -5.82220051308 2.30299577363 -8.92783942254 30.8601204408 5.26521373265 -1.69465389574 3.87870399684 20.7952461623 -3.49022888623 -0.726542999271 -3.60931558191 10.2912643302 1.68479897829 -0.592437179266 -3.06189277485 3.42037013045 -0.181090365419 -0.0424530301632 3 1 6 3 4 4 3 6 2 16 1 3 6 2 5 3 5 3 5 3 5 3 5 3 5 4 5 6 2 5 1 0 128.0 0.5 65.0 0.6 0.1865234375 0.2412109375 0.0289301872253 0.195768356323 0.0468664169312 0.00564219795161 0.0149815582844 0.00460798738759 0.208782129606 0.625 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 4.0 0.307692307692 0.0 3.0 1.0 0.5078125 0.375 0.875 0.375 0.5 0.625 1.0 0.875 1.0 0.875 1.0 1.0 1.0 0.875 0.875 0.5 0.5 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -7.95774715459 3.9788735773 -14.5618335156 9.14744658479 5.96706696795 -0.340691050056 -0.394576457281 10.7397796647 -3.26283175813 1.97348632377 -5.42280017962 20.0389710118 1.76347022524 0.705236763461 -1.97851189439 23.4166325498 -0.42711353086 -1.69270926267 -1.13232090956 10.7705728512 -0.376360385506 -0.26263854088 -5.29789968681 5.12357231473 0.131724783791 0.0681834117901 4 1 8 3 7 3 5 5 1 1 2 9 2 7 4 4 6 4 6 3 7 3 7 3 6 4 6 4 7 4 6 8 2 7 4 4 8 1 4 0 180.0 0.555555555556 78.0 0.75641025641 0.169444444444 0.207716049383 0.0294504458162 0.158602709191 0.0492789780521 0.00566565626666 0.0174531017313 0.00636373594514 0.138684621137 0.5 0.0555555555556 1.0 0.0 2.0 2.0 1.0 0.0 0.0 0.0 1.0 7.0 0.103448275862 1.0 2.0 1.0 0.433333333333 0.333333333333 0.533333333333 0.466666666667 0.333333333333 0.733333333333 1.0 1.0 0.933333333333 0.666666666667 0.733333333333 0.333333333333 0.8 0.266666666667 0.333333333333 0.0 0.466666666667 0.0 0.5 0.5 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.833333333333 0.5 0.5 0.833333333333 1.0 0.333333333333 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.5 1.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.5 0.5 0.0 0.0 0.0 0.333333333333 0.666666666667 -8.66510245723 4.13802852039 -14.9188144323 11.4624342545 7.60210462744 2.31134894721 2.52052957879 20.0384825095 -4.75488902693 -0.153236057844 -5.88664597415 17.4127917329 2.90832757659 -1.62719671727 1.13585386084 7.64392090907 -0.768032560367 0.591755459504 1.07966012309 9.89580843608 -0.889173556607 0.441444303858 -8.6975089214 14.2508255969 0.179912110022 -0.137332080654 3 1 11 12 3 13 2 6 3 5 2 5 4 4 3 3 6 4 2 3 7 3 2 3 7 3 2 3 7 2 3 3 7 3 2 3 7 2 3 3 6 3 3 4 4 3 4 8 7 4 3 1 7 3 12 3 12 3 12 4 10 5 9 8 7 8 8 1 1 1 1 2 8 0 345.0 0.652173913043 145.0 0.675862068966 0.161352657005 0.178323881537 0.0437560005966 0.122961136529 0.0303658042854 0.015017566604 0.00440251544492 0.00304341942702 0.0891213634194 0.866666666667 0.565217391304 2.0 2.0 4.0 1.0 2.0 5.0 3.0 0.0 6.0 10.0 0.214285714286 0.0 3.0 2.0 0.420289855072 0.75 0.5 0.5 0.625 0.708333333333 0.5 0.666666666667 0.666666666667 0.375 0.0 0.208333333333 0.0833333333333 0.666666666667 0.291666666667 0.333333333333 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.666666666667 1.0 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.0 -13.6181273046 13.175261376 -29.3332759732 33.8185233701 4.68399786491 2.9150456775 -18.2618494098 44.3753575938 -2.34834303068 -0.664361008491 -25.348390152 43.1734101963 -1.78344919469 1.14256762117 -34.713580383 41.931102342 2.33271083738 -2.06948060169 -22.4079329614 33.2424225617 -1.22597659248 1.36577332143 -28.1513011409 33.5248152479 -0.141769112052 -0.486632547685 1 1 28 5 13 3 4 65 1 11 2 11 1 1 2 1 150.0 6.0 98.0 0.397959183673 0.311777777778 0.345333333333 0.660545481481 0.0151019259259 0.0566438518519 0.31473357082 -0.00226913697821 -0.000729998425015 -0.0697442570136 0.0 1.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 5.0 8.0 0.0789473684211 0.0 1.0 9.0 0.653333333333 0.375 0.8125 1.0 0.9375 0.0 0.5 1.0 0.875 0.1875 0.6875 1.0 1.0 0.25 0.75 1.0 0.8125 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.94967161197 1.35812218105 -9.9375004303 2.80697019581 -3.98913022919 -0.487792216694 -23.0356996831 2.37852542959 -0.0131775053211 0.597867181121 -29.7088837609 2.87899709515 -2.26871270478 -0.719596033164 -38.826594971 1.41093915786 0.992907582114 0.789115589076 -38.1475469309 4.25286714261 -0.879042811168 -0.411430229501 -38.9392109981 3.5423316451 0.366376207413 0.0620638849621 1 3 2 3 1 20 2 3 7 2 8 2 8 3 7 3 7 3 7 2 8 2 8 3 6 5 4 0 130.0 0.769230769231 54.0 0.648148148148 0.151538461538 0.148520710059 0.0406194811106 0.0926850250341 0.0230555302685 0.0126826550955 0.00723101770831 -0.000979356990662 0.0559827389691 0.4 0.0769230769231 1.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 2.0 3.0 0.142857142857 0.0 1.0 1.0 0.415384615385 0.75 0.333333333333 0.333333333333 0.416666666667 0.916666666667 0.833333333333 0.916666666667 0.833333333333 0.666666666667 0.166666666667 0.25 0.25 0.75 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.25 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -6.80693448916 5.48472419271 -12.6754732384 15.1052090093 5.15467871217 2.98113073196 1.88067696024 27.015579878 -1.20224301392 0.96146657921 2.00396698405 32.7843400409 -0.217192112715 0.288069879428 -2.20858880885 35.0485840513 0.151932510453 0.399293269043 -0.0116459129102 38.5875959681 0.266624371855 0.486147682751 1.93015546918 44.1984023614 -0.0531899529104 0.152229542936 8 1 8 2 4 3 2 6 3 5 2 22 1 6 3 5 2 5 1 4 5 4 5 3 2 3 6 3 5 3 2 3 6 3 5 3 2 3 6 2 6 3 2 3 6 2 6 3 2 3 5 4 4 4 2 3 5 4 5 3 1 4 5 4 5 3 1 5 3 6 3 3 2 5 3 6 3 3 1 0 308.0 1.57142857143 160.0 0.625 0.257969303424 0.240955473098 0.17112426703 0.0629750135806 0.056737410001 0.064871913801 0.00699116932934 0.0117731954483 -0.0369295795444 0.363636363636 1.78571428571 1.0 2.0 2.0 2.0 3.0 6.0 6.0 6.0 4.0 14.0 0.0701754385965 0.0 2.0 3.0 0.519480519481 0.583333333333 0.625 0.5 0.625 0.625 0.166666666667 0.0416666666667 0.25 0.583333333333 0.625 0.458333333333 0.708333333333 0.708333333333 0.416666666667 0.375 0.416666666667 0.333333333333 0.833333333333 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.0 0.5 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.144686311902 8.2471197784 -0.648881908717 19.003103641 -1.49146476723 -1.76027041116 -6.16926620211 10.7740728682 -0.821031820572 -2.72942460884 -13.8545525625 -0.68353025646 -1.71545546314 2.97148809365 -25.1887017669 14.3549443183 -0.473424179769 0.383969405629 -32.0835637961 20.3548492788 -0.198997180347 -1.23169075051 -31.9539539004 9.20724864434 0.203646304985 0.0537059686751 12 1 8 7 5 4 1 4 5 3 3 3 3 4 5 2 3 3 10 4 9 4 10 3 10 4 10 4 10 4 5 1 4 4 4 2 4 4 3 3 4 8 7 6 7 0 224.0 0.875 82.0 0.756097560976 0.134566326531 0.181919642857 0.0517574566099 0.103480035988 0.0245870251002 0.0222069512593 0.00554908869573 0.00132433831857 0.0624286698906 0.428571428571 0.375 0.0 2.0 3.0 0.0 2.0 1.0 1.0 2.0 3.0 8.0 0.1 1.0 2.0 1.0 0.366071428571 0.0 0.25 0.75 1.0 0.25 0.75 0.4375 0.25 0.5 0.1875 0.0 0.1875 0.625 0.1875 0.0 0.125 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -13.9658462563 3.14331012606 -31.9279440722 8.48052086801 2.91794423985 1.19521632068 -20.7320685348 11.7225168134 2.97819561525 -1.09732301386 -4.48482934857 6.76917005755 -2.28015159119 -0.000496839343873 -16.0965584655 5.15657946668 -0.865543921817 0.114391747641 -25.5411400608 4.69491125783 0.519472346551 -0.656490184119 -22.316531462 -1.43118022686 -0.0092108231807 -0.0942689345334 9 4 9 5 10 4 11 3 11 3 11 3 11 3 11 3 6 2 2 4 4 4 2 4 3 4 4 3 2 4 5 2 3 5 4 3 2 5 4 3 1 6 4 2 3 5 4 3 1 5 5 3 2 4 5 3 3 4 4 3 4 4 2 5 3 5 1 5 294.0 0.666666666667 128.0 0.671875 0.232264334305 0.246193715581 0.0696859427745 0.167586382973 0.0632539100142 0.0179162074766 0.014899569679 0.00884719118047 0.0944109151229 0.571428571429 0.619047619048 1.0 2.0 2.0 2.0 0.0 2.0 5.0 5.0 1.0 3.0 0.210526315789 1.0 0.0 2.0 0.43537414966 0.0 0.125 0.75 0.583333333333 0.0 0.375 0.708333333333 0.75 0.166666666667 0.166666666667 0.0 0.208333333333 0.875 0.833333333333 0.666666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.833333333333 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 1.0 0.833333333333 0.0 0.0 0.0 0.333333333333 0.833333333333 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78859840808 -10.1252859034 -3.07962021588 -23.2836333873 2.11237328421 2.47100036038 5.78736806542 -9.99250713183 1.59698277772 5.67805682658 13.1397199136 19.7520822011 -1.32023522667 -0.330515794571 6.73675274387 26.4701995167 -0.127802463776 0.512089683398 2.17045378762 24.942223208 -0.302396155474 -1.24452807938 -1.06053209116 13.5919341937 -0.0996984818633 -0.207143489929 2 2 4 4 2 6 1 6 2 6 2 5 3 3 3 4 3 4 1 5 2 3 4 0 77.0 0.636363636364 48.0 0.520833333333 0.257884972171 0.278630460449 0.0465639942786 0.14246505729 0.0413179332053 0.00559161198181 -0.00321381547833 0.000948118601549 0.0711009299124 0.428571428571 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 7.0 0.0588235294118 0.0 3.0 2.0 0.623376623377 0.5 0.833333333333 0.166666666667 0.0 0.833333333333 1.0 0.5 0.333333333333 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 1.0 1.0 1.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -4.51421293133 4.05121673325 -10.590650621 9.53329950077 0.430471671774 -0.330984885408 -9.40366830365 8.83575918364 0.467352302606 -0.164369816857 -5.48334293669 7.49336070791 0.2534275254 0.446634164841 -2.32538330201 9.64932157347 0.500099973688 -0.113176491328 2.07776735249 8.71749364492 0.144866661966 -0.380765237425 4.48029429376 3.83067298572 0.00282129163705 -0.136880876883 3 2 2 3 3 2 4 3 1 2 5 3 1 4 1 12 2 4 9 2 9 3 8 3 8 3 9 10 1 10 2 7 2 0 143.0 0.846153846154 73.0 0.657534246575 0.215511760966 0.250672404519 0.0755712574383 0.129758255828 0.0467155710933 0.0235118419999 0.0121196400859 0.00570044493524 0.0512011308053 1.09090909091 0.384615384615 0.0 3.0 2.0 2.0 3.0 2.0 0.0 0.0 3.0 10.0 0.0967741935484 0.0 2.0 1.0 0.51048951049 0.416666666667 0.75 0.916666666667 0.666666666667 0.666666666667 0.5 0.25 0.833333333333 0.25 0.416666666667 0.0 0.75 0.583333333333 0.333333333333 0.0 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.75 0.75 1.0 0.5 0.0 0.25 0.5 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.0 -8.71679380626 -2.15471307571 -22.4163111078 -3.74361143689 -2.1918033492 2.36914121933 -31.3389421705 5.79678704738 -0.233607683167 1.77050502817 -32.7873272843 16.5742977665 -0.561744973845 0.129667588338 -35.290165494 18.823228895 -0.0276712146658 -0.118901237641 -34.9782856569 16.674290745 0.370496400147 -0.382956832646 -30.445665655 12.4508145283 0.119117968638 -0.0357158484359 3 2 10 7 8 6 9 6 11 4 11 4 11 3 12 3 12 4 11 9 6 11 4 4 1 7 3 4 4 5 2 4 5 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 6 4 2 3 6 4 2 3 6 3 3 5 2 4 5 9 3 0 330.0 0.681818181818 144.0 0.569444444444 0.184646464646 0.231404958678 0.0528052981607 0.14967192587 0.0688237749395 0.0174097359645 0.0205552104809 0.0171037788823 0.101611326337 0.6 0.454545454545 0.0 2.0 3.0 1.0 0.0 0.0 5.0 5.0 2.0 10.0 0.196078431373 0.0 2.0 3.0 0.436363636364 0.708333333333 0.5 0.5 0.5 0.75 0.75 0.708333333333 0.583333333333 0.0416666666667 0.333333333333 0.291666666667 0.0833333333333 0.0 0.25 0.666666666667 0.5 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.666666666667 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.333333333333 0.166666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -9.43354753599 -8.3918060903 -21.3654543203 -20.5197107559 2.09340765493 0.985660552897 -15.0736882218 -8.95458250157 0.272478389495 7.41877359585 -13.4528082689 22.8087625759 -1.81981177112 -2.03612681008 -18.8552961372 30.1491608455 2.34623793961 3.61092471742 -6.78206592806 40.0484720526 -0.636481044317 -3.38243700121 -5.41404812906 24.0945333646 0.0500755355748 0.198837176096 11 1 6 3 2 7 2 14 3 6 2 5 4 4 5 3 5 3 5 4 3 4 6 3 3 4 6 3 4 2 6 4 4 3 5 4 3 3 6 4 3 4 5 4 3 4 5 4 2 5 4 6 224.0 1.14285714286 111.0 0.684684684685 0.243024553571 0.233737244898 0.113245572015 0.0852676258143 0.0614598221404 0.0352344193493 0.0114210006579 0.0137652145842 -0.0102068338469 0.4375 0.857142857143 3.0 2.0 2.0 0.0 1.0 3.0 3.0 3.0 4.0 7.0 0.2 0.0 1.0 2.0 0.495535714286 0.5625 0.5 0.375 0.4375 0.625 0.8125 0.6875 0.6875 0.5625 0.125 0.0 0.0 0.8125 0.5625 0.375 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.25 0.5 0.25 0.5 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.25 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.83028184556 6.52535266677 -7.7073894337 15.5820751767 -4.6447132025 -0.353125029985 -21.8699060695 14.0589785774 1.4668307838 -1.01028029733 -17.5162670335 9.83192092936 0.417812878868 1.66518509323 -13.1339724465 20.1181278494 -0.844670712228 1.09518082344 -18.5196478652 31.7902075971 -0.0243088912129 0.478150877607 -22.2533928573 39.4797394362 -0.198962141046 0.224036898146 1 2 2 3 4 2 4 2 3 3 1 1 1 22 2 4 3 1 5 2 4 3 3 3 2 4 3 2 3 4 3 3 3 3 3 2 15 1 1 132.0 0.272727272727 65.0 0.830769230769 0.209595959596 0.271349862259 0.0178628572224 0.446503603528 0.0612965049949 0.00186445497336 0.0215688335788 0.00475806035848 0.842207297692 1.5 195225786.136 1.0 3.0 1.0 3.0 1.0 4294967293.0 0.0 0.0 0.0 4.0 0.142857142857 1.0 8.0 1.0 0.492424242424 0.333333333333 0.166666666667 0.333333333333 0.333333333333 0.666666666667 0.333333333333 0.75 0.75 0.75 0.5 1.0 1.0 0.583333333333 0.416666666667 0.833333333333 0.916666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.44353422326 -3.6750323223 -6.03914346998 -5.21396511286 2.51096517655 5.62566687276 -2.46543322546 14.9385176436 -2.68232571105 1.4661009336 -5.74956953062 24.9638648752 3.07626801972 -0.976019559547 2.20899603089 22.6453438948 -2.326175285 1.24907945586 -3.15304860433 24.9504253553 1.42619046833 -1.68898610878 -1.18417018674 13.5095423848 -0.254854527627 -0.0564130201367 4 2 6 7 3 8 3 9 2 1 5 3 8 3 7 4 6 5 4 7 2 3 2 4 2 3 2 33 1 5 8 1 2 0 165.0 0.733333333333 98.0 0.510204081633 0.26391184573 0.301414141414 0.0636344714361 0.146599660517 0.0598471770042 0.00978559722788 0.00458065294041 0.00695776826299 0.0464015031274 0.727272727273 0.266666666667 2.0 3.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 9.0 0.212121212121 0.0 3.0 1.0 0.593939393939 0.666666666667 0.333333333333 0.333333333333 1.0 0.833333333333 0.25 0.416666666667 0.666666666667 0.916666666667 0.583333333333 0.833333333333 0.833333333333 0.583333333333 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.25 0.75 1.0 0.75 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 -6.02666717841 -0.933708999472 -16.246980801 1.20792822196 -2.34276076231 5.30799419094 -23.1883645724 20.2240843351 1.60036255402 0.980958237821 -16.0377235076 26.2229947294 0.145374739615 -1.85306870222 -11.3428118031 15.131464298 0.378147960242 0.0716338357186 -7.22371141329 10.366795456 0.567565448607 -0.803659438254 -1.05240338653 0.443117261364 0.0846611400503 -0.425354597385 1 2 1 4 2 3 3 3 5 1 10 2 2 4 2 5 2 3 3 3 2 4 3 3 3 3 3 3 6 2 4 96.0 0.375 51.0 0.549019607843 0.149305555556 0.265625 0.0187671802662 0.286458333333 0.0396592881944 0.00387780488341 0.0164109411738 0.00604272403041 0.462856372069 1.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 8.0 0.181818181818 0.0 4.0 1.0 0.53125 0.625 1.0 0.875 1.0 0.875 0.875 0.75 0.875 0.625 0.75 0.25 0.375 0.25 0.625 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 -7.24154991068 1.35281701628 -12.9586432694 3.45736066827 5.93536031913 0.496737498166 1.91901848381 6.99566369099 -2.92399609102 1.69083670346 -3.73440093956 16.9191768137 0.668718132536 1.14671435053 -4.92535349342 23.1376998692 0.219968316772 -1.40433394636 -1.88905064392 12.3299084561 -0.553291685797 -0.708682448179 -6.48840559712 4.67192603436 0.0685185647724 0.229004871525 2 7 2 8 2 3 2 3 2 2 4 2 1 5 6 6 5 7 4 6 8 5 5 6 4 2 2 3 3 2 2 3 2 2 2 0 130.0 0.769230769231 72.0 0.75 0.247692307692 0.236686390533 0.0678361401912 0.120427856168 0.0470550751024 0.0140620937662 0.00790204063931 0.00633666972201 0.0333699433724 1.1 0.461538461538 2.0 3.0 3.0 2.0 1.0 1.0 0.0 3.0 4.0 8.0 0.259259259259 1.0 2.0 1.0 0.553846153846 0.583333333333 0.666666666667 0.25 0.75 0.75 0.833333333333 0.416666666667 0.416666666667 0.583333333333 0.583333333333 0.5 0.0833333333333 0.916666666667 0.5 0.833333333333 0.666666666667 0.25 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.25 1.0 0.75 0.25 0.5 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.25 0.75 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.5 1.0 1.0 0.5 1.0 1.0 0.75 0.25 0.25 0.75 1.0 0.75 1.0 1.0 1.0 0.5 0.0 0.5 1.0 1.0 -5.2398704341 4.21148464797 -14.4528882524 10.7052154786 -2.54503025066 1.52012167767 -22.3253691147 20.6837629787 1.33597169323 3.28115524362 -16.052306716 33.7485849597 0.618678134992 -0.976013081146 -8.60619815766 34.3880479588 0.488405266945 1.21440079713 -3.18396599017 38.7381548623 0.460935162165 -0.105556852602 2.95322443229 43.7993735426 0.163168216804 0.348642263849 7 4 4 5 2 3 3 15 2 20 2 4 4 5 4 3 3 2 6 3 6 2 2 3 5 4 6 3 1 3 6 3 6 3 1 3 6 3 5 8 6 3 6 3 1 4 5 3 6 8 5 3 5 9 4 5 3 11 2 6 4 4 1 3 7 1 8 1 1 0 308.0 1.57142857143 163.0 0.61963190184 0.254722550177 0.233766233766 0.170113797907 0.060055351968 0.04889391895 0.0646720804286 0.00567541266494 0.0122227428332 -0.0358148156285 0.545454545455 1.71428571429 4.0 4.0 1.0 3.0 2.0 6.0 6.0 6.0 4.0 18.0 0.172413793103 1.0 6.0 3.0 0.529220779221 0.5 0.5 0.583333333333 0.833333333333 0.708333333333 0.25 0.166666666667 0.333333333333 0.75 0.541666666667 0.5 0.583333333333 0.833333333333 0.375 0.375 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.833333333333 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.333333333333 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.07067870807 12.1247129374 -4.18129526373 26.2869600269 -3.62445190087 -4.81255371497 -24.8694337814 7.83102316497 -6.78663987985 -3.41565535197 -55.5974815156 -10.3948171007 1.43360868597 2.91486710214 -58.0954776251 4.38600844396 -1.36737720944 0.355999680334 -61.3695455539 10.0927228277 -0.0515970490512 -1.04987227295 -68.0935463199 3.3726832692 -0.15725331042 0.255783236822 1 4 9 5 9 5 10 4 10 4 10 4 10 5 10 4 10 3 3 4 4 3 4 3 4 3 5 3 3 3 5 3 2 3 6 3 2 4 5 4 2 3 6 3 2 3 5 3 3 3 5 4 1 4 6 3 1 4 5 3 1 5 5 10 3 5 3 1 10 0 308.0 0.636363636364 128.0 0.703125 0.165584415584 0.217827626919 0.0486255922354 0.154987153174 0.0626619543385 0.0178423395026 0.0204017718094 0.0183536606274 0.121885433132 0.571428571429 0.590909090909 3.0 2.0 0.0 2.0 0.0 2.0 5.0 5.0 0.0 9.0 0.157894736842 1.0 0.0 2.0 0.415584415584 0.833333333333 0.583333333333 0.583333333333 0.75 0.5 0.583333333333 0.458333333333 0.541666666667 0.0 0.125 0.0 0.0416666666667 0.0 0.375 0.708333333333 0.75 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.166666666667 0.333333333333 0.0 1.0 1.0 1.0 0.666666666667 0.5 0.666666666667 0.833333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.5 0.5 0.666666666667 0.833333333333 0.5 0.333333333333 0.333333333333 0.5 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 -10.2437908826 -6.53982129796 -24.8425685821 -14.9518456355 0.413970257689 1.88235696029 -20.7933844488 -4.47591386355 2.73774646822 4.25890449147 -13.2136242359 15.6788486376 -4.3208930174 -1.51992400135 -27.9596463189 12.8422311674 3.15536055391 0.445059797465 -14.6733639146 12.9605230732 -0.698074618103 0.384002860712 -16.1251820372 17.0414532009 -0.40748728777 0.00701046118917 8 2 1 5 1 16 1 8 4 5 6 4 7 4 7 4 7 3 8 3 8 3 8 3 6 7 5 5 6 2 8 0 165.0 0.733333333333 74.0 0.621621621622 0.162534435262 0.177373737374 0.039874224337 0.103617775552 0.0237326432368 0.0110931332068 0.00378884781465 -0.00156966660354 0.0620872200865 0.363636363636 0.0666666666667 2.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 1.0 9.0 0.107142857143 1.0 2.0 1.0 0.448484848485 0.666666666667 0.416666666667 0.333333333333 0.5 0.75 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.833333333333 0.333333333333 0.0 0.0833333333333 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -10.7800948121 7.5545546321 -20.9338710578 18.5862105718 6.74307662892 0.722068292925 -3.80698073745 22.4102808754 -2.9403261385 -0.129315028659 -9.18688084992 18.5129172809 0.0358977960659 -1.10707696598 -12.6839913222 12.0481249601 1.06180613868 0.32610032935 -3.06820841585 10.7912646601 0.13627660837 -0.553362196678 0.879318723603 5.40299181496 0.108965375018 -0.224162847438 1 7 2 7 8 4 10 3 3 4 3 2 4 3 4 1 11 2 4 9 3 10 4 9 4 10 3 6 3 2 3 4 4 2 9 4 8 3 0 182.0 0.928571428571 90.0 0.677777777778 0.204142011834 0.233516483516 0.0723702544286 0.106442690868 0.0457964478463 0.0218005282635 0.0109298984478 0.0077985920226 0.0324431936538 1.0 0.285714285714 0.0 4.0 6.0 3.0 0.0 2.0 0.0 2.0 4.0 6.0 0.216216216216 0.0 3.0 1.0 0.494505494505 0.3125 0.8125 0.9375 0.6875 0.625 0.5625 0.1875 0.5 0.6875 0.4375 0.0 0.3125 0.5 0.5 0.0 0.5625 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.75 1.0 0.5 0.0 0.5 0.5 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 -9.00362249491 3.91066431597 -23.083956501 10.3132960076 -1.95858021805 2.00219702461 -29.6149044514 22.2257369339 1.39797736159 3.83363415684 -21.5377129264 38.9181222232 0.552891673048 -1.28156252955 -15.5933808723 31.7728286677 -0.112080706468 -1.69616086956 -14.5930593384 17.8628592768 0.335332440458 0.857899950268 -11.9141925633 18.8207397647 -0.0253955130619 -0.36598323128 1 4 2 9 2 8 3 3 2 3 4 2 2 3 4 1 3 3 3 2 4 2 3 1 5 2 3 1 6 4 7 4 8 3 8 2 9 3 8 2 9 2 9 1 10 1 9 2 8 2 8 3 7 4 8 2 8 0 242.0 0.5 79.0 0.924050632911 0.123215627348 0.114199849737 0.0247837923729 0.111919657297 0.0217528496055 0.00716952459643 0.00755687386912 0.00139750685484 0.105668315623 0.636363636364 0.363636363636 2.0 2.0 1.0 0.0 5.0 3.0 0.0 0.0 2.0 8.0 0.277777777778 0.0 5.0 2.0 0.326446280992 0.777777777778 0.222222222222 0.0 0.333333333333 0.777777777778 0.611111111111 0.333333333333 0.555555555556 0.111111111111 0.5 0.722222222222 0.166666666667 0.555555555556 0.388888888889 0.111111111111 0.0 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.833333333333 0.5 0.5 0.666666666667 0.833333333333 0.5 0.5 0.5 0.333333333333 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 0.666666666667 0.166666666667 0.5 0.166666666667 0.333333333333 0.5 0.5 0.333333333333 0.166666666667 0.0 1.0 0.666666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 -7.23431559509 9.08630038743 -14.4586175055 21.1945435763 3.45106747752 -0.453310585471 -8.65120447991 24.2441706583 -2.82229373324 2.4412630572 -10.7172382147 32.0078036173 2.98575698099 -0.221520319878 -4.54706454648 35.6678290424 -2.53507266081 1.02837763275 -8.95566370686 41.6298758694 2.18337220213 0.311276677461 -2.70307892022 47.348831688 -0.34770672363 0.119874337159 3 1 4 1 4 4 2 4 1 23 2 10 3 4 8 3 9 3 10 2 9 3 9 3 9 3 8 5 7 6 6 5 6 0 180.0 0.8 80.0 0.6125 0.161111111111 0.177037037037 0.043987654321 0.0971803840878 0.0250884773663 0.013257889356 0.00403575336702 -0.000813082166633 0.0548243930589 0.333333333333 0.133333333333 2.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 6.0 3.0 0.0714285714286 0.0 1.0 1.0 0.444444444444 0.666666666667 0.583333333333 0.25 0.416666666667 0.833333333333 1.0 0.916666666667 1.0 0.583333333333 0.75 0.333333333333 0.416666666667 0.75 0.5 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -11.5440385389 9.08244208578 -24.3138233002 21.9864647351 4.77832654033 0.241066687137 -12.1076223883 24.3808587506 -1.78755706131 0.310515354716 -16.2095280057 26.1514837296 -1.5483197219 1.66862635781 -26.9449374536 37.0543859627 0.682073123391 0.766529512185 -26.4278508319 46.6136252385 -1.27673186829 0.870539760588 -36.9188680431 56.6294443914 -0.24865097563 0.210806022782 9 1 16 3 2 6 4 3 5 21 3 6 2 8 2 4 3 4 4 6 3 4 3 3 6 4 5 3 3 4 5 3 6 3 3 4 5 4 5 3 3 3 6 3 6 3 3 3 6 3 6 3 3 3 6 3 6 3 3 4 4 4 6 11 3 5 5 11 2 7 2 6 2 4 4 1 2 2 5 1 2 1 360.0 1.6 181.0 0.701657458564 0.237847222222 0.241481481481 0.157317708333 0.0618257887517 0.0572093621399 0.0630901072549 0.00718342144997 0.0151326015874 -0.0307458948238 0.458333333333 1.86666666667 3.0 3.0 3.0 2.0 2.0 6.0 6.0 6.0 7.0 14.0 0.123076923077 1.0 2.0 3.0 0.502777777778 0.541666666667 0.666666666667 0.583333333333 0.666666666667 0.625 0.291666666667 0.0833333333333 0.208333333333 0.625 0.791666666667 0.541666666667 0.625 0.541666666667 0.375 0.166666666667 0.166666666667 0.166666666667 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 0.833333333333 0.5 0.5 0.666666666667 0.5 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.0 0.5 1.0 0.833333333333 0.5 0.166666666667 0.166666666667 0.166666666667 -6.12746530904 7.95774715459 -16.432316876 15.5282644292 -3.10006750698 -5.4803457314 -30.9983076261 -2.79873745594 -1.95287215701 -0.86740633656 -34.2334215332 -9.32087993809 4.07087763483 2.59183331725 -10.9082315845 6.95526794567 0.713146832428 0.0926069084461 5.7408013957 9.25645588023 0.795564582893 -1.10084898748 8.31091927669 1.52870953423 -0.372809340241 0.227901220061 9 1 10 6 5 10 4 3 2 5 3 3 10 4 10 4 10 4 10 4 9 5 4 3 2 5 3 5 1 5 3 5 1 4 5 4 2 4 5 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 1 4 6 3 1 5 5 10 2 12 3 4 1 0 308.0 0.636363636364 149.0 0.651006711409 0.204777365492 0.258854781582 0.0560332919526 0.174874680472 0.0564016593543 0.015907973245 0.0139345456122 0.0121160127339 0.131414816006 0.785714285714 0.636363636364 1.0 3.0 4.0 3.0 1.0 1.0 5.0 5.0 2.0 7.0 0.3 2.0 1.0 2.0 0.483766233766 0.291666666667 0.833333333333 0.875 0.875 0.5 0.5 0.375 0.375 0.458333333333 0.125 0.208333333333 0.0833333333333 0.5 0.291666666667 0.875 0.791666666667 0.0 0.0 0.333333333333 0.5 0.833333333333 1.0 0.666666666667 0.5 0.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.833333333333 0.5 0.5 0.5 0.333333333333 0.166666666667 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 -12.6166463978 -2.02560836662 -28.6429561543 -3.5564258657 3.96368749332 2.32717768779 -8.58933622515 6.13254662874 5.86997733458 1.41998532166 10.2878813717 11.0587395409 -8.20540848992 -2.11798253632 -23.4764784354 2.49331197687 3.25940912064 0.907396288469 -17.8971124706 0.592791044731 -0.163001824748 -1.45926498563 -7.6569163876 -8.17474347794 -0.0547517687833 -0.04986791786 4 3 7 5 5 4 2 4 2 3 4 3 2 2 5 3 8 4 8 4 5 8 3 4 1 3 3 3 3 4 1 4 3 9 2 18 1 3 4 3 1 0 168.0 0.857142857143 94.0 0.617021276596 0.257936507937 0.297619047619 0.0797362595832 0.133125472411 0.0645667989418 0.0157858649108 0.00571658769456 0.00924091282163 0.0227864921092 0.916666666667 0.571428571429 3.0 5.0 2.0 1.0 1.0 2.0 2.0 2.0 7.0 10.0 0.27027027027 0.0 3.0 2.0 0.559523809524 0.583333333333 0.416666666667 0.25 0.916666666667 0.583333333333 0.0833333333333 0.583333333333 0.75 0.583333333333 0.166666666667 0.5 0.333333333333 0.583333333333 0.833333333333 0.833333333333 0.833333333333 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.25 0.5 0.75 0.75 0.5 0.75 0.75 0.5 0.75 1.0 1.0 0.75 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 -1.3641852265 -3.2740445436 -6.3823252042 -6.78622066751 -4.27908712884 2.12144722978 -19.1853465661 3.28067032468 1.19185812146 2.73905211992 -18.4290581447 15.9090806559 -0.967873874592 -1.39004119151 -20.8646085354 11.994605304 0.0535739414832 0.515834034783 -21.4456675049 12.1416516938 0.453794467632 0.0993786086506 -17.4532702671 14.9922535415 -0.152781878061 -0.0166422278423 8 4 9 7 8 5 10 4 10 5 9 4 10 3 11 3 11 3 6 8 4 10 3 4 4 4 1 4 5 3 2 4 6 2 2 3 6 3 2 3 7 3 1 4 6 3 1 4 6 3 1 4 5 4 2 5 3 5 2 6 1 5 10 2 2 0 308.0 0.636363636364 134.0 0.664179104478 0.230751391466 0.229486422668 0.0671132686465 0.16130744519 0.0573615091899 0.0161289151065 0.0140620773275 0.00915116537876 0.0929259257131 0.928571428571 0.454545454545 0.0 3.0 5.0 2.0 0.0 0.0 5.0 5.0 4.0 14.0 0.132075471698 1.0 2.0 2.0 0.435064935065 0.0 0.0833333333333 0.791666666667 0.833333333333 0.0 0.291666666667 0.333333333333 0.416666666667 0.416666666667 0.5 0.291666666667 0.208333333333 0.958333333333 0.791666666667 0.75 0.875 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 0.666666666667 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -1.82304752996 -5.2955190156 -5.02240991736 -12.8714107487 0.142414378078 1.47687656058 1.7295084156 2.35286369874 4.63022979037 8.77805559302 15.8992350604 39.2199015116 -4.27221252154 -3.20747202855 0.922842994649 34.4419739927 1.61426159587 0.677933870534 1.06128846364 24.6129554677 -0.56148640985 -1.94432559254 2.91299266812 12.668970694 0.0557114312895 0.0380369909173 1 4 3 5 2 4 4 2 34 1 3 5 2 5 3 4 3 4 3 4 3 4 3 4 4 3 4 3 3 5 2 13 4 3 154.0 0.318181818182 73.0 0.684931506849 0.188311688312 0.262101534829 0.0190339471626 0.37323260312 0.0609063309772 0.00257943794985 0.026969172901 0.00647271446217 0.616951291667 1.0 195225786.0 1.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 1.0 1.0 0.375 0.0 5.0 1.0 0.474025974026 0.25 0.333333333333 0.583333333333 0.416666666667 0.583333333333 0.333333333333 1.0 0.833333333333 0.666666666667 0.416666666667 1.0 1.0 0.583333333333 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.80358555514 -5.46914258989 -6.86510650493 -7.39126792855 5.41186594245 8.79292198557 1.96681505228 23.6663127457 -5.73867705121 2.25136461987 -9.17206419617 41.1325401519 4.90436453965 -0.876244172876 1.78985456509 35.5093916148 -3.53903486607 -0.480908360908 -7.19876239034 27.4774418308 1.56941858032 -0.826138068036 -7.3002611654 19.5815767316 -0.189886744532 0.0163012304603 4 9 4 3 1 2 1 4 2 4 4 4 1 13 1 8 1 4 1 4 9 5 10 4 10 4 8 1 1 4 7 2 2 6 2 4 3 10 6 6 3 0 182.0 1.07692307692 101.0 0.554455445545 0.25863422292 0.239222316145 0.102549228938 0.0889325624261 0.0458453815234 0.0286670345462 0.00944552220156 0.00359010191023 -0.012930527708 0.928571428571 0.538461538462 0.0 1.0 6.0 3.0 3.0 1.0 1.0 2.0 4.0 8.0 0.162162162162 0.0 3.0 1.0 0.554945054945 0.375 0.8125 0.8125 0.375 0.8125 0.75 0.5 0.75 0.625 0.4375 0.0 0.625 0.875 0.4375 0.0625 0.625 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 -8.00321999548 3.81971863421 -18.3489434929 11.5308932294 1.28437575067 3.88931992127 -15.5855045618 28.2407752761 -0.410486611123 2.67186557138 -16.6837749789 42.0465519561 -1.26532840136 -0.607683324739 -22.2640389894 37.7314902114 1.33448559215 -1.28252463575 -12.4556270305 27.2244502752 0.795493959077 0.678733430529 -1.78860831041 32.5849125143 0.0903823090319 0.293713251408 1 6 3 6 4 1 3 3 4 3 3 1 7 1 3 1 11 1 10 1 4 8 3 10 3 8 5 8 4 6 1 1 11 3 9 4 6 2 0 168.0 0.857142857143 94.0 0.553191489362 0.249503968254 0.261904761905 0.076353247152 0.117677626606 0.0494496409675 0.0182914912826 0.00967218434641 0.00450748058379 0.022575097686 1.08333333333 0.285714285714 1.0 3.0 6.0 3.0 2.0 1.0 0.0 1.0 4.0 13.0 0.0606060606061 0.0 2.0 1.0 0.559523809524 0.25 0.75 0.916666666667 0.583333333333 0.666666666667 0.916666666667 0.666666666667 0.916666666667 0.75 0.75 0.0833333333333 0.666666666667 0.583333333333 0.666666666667 0.0 0.5 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 0.75 0.75 1.0 1.0 0.5 0.0 0.0 0.75 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.75 0.25 0.25 0.75 1.0 0.5 0.0 0.0 -9.45835090375 3.45593590714 -21.742278126 9.26458237764 1.61660589426 2.04163775395 -16.6095162284 21.2271797215 1.04900029606 4.01263256892 -9.0147463453 40.7075397194 -0.462516447894 -0.0162687090041 -8.75612567527 42.2371173876 0.910592502619 -1.37399075179 -1.65520945223 30.3656203375 0.587345096376 -0.101283503313 6.2990806104 25.307070206 0.11470123447 -0.0400540677406 5 5 4 3 3 3 3 2 4 4 1 3 4 20 8 3 9 3 9 3 9 4 7 6 4 3 1 10 3 9 4 6 3 0 168.0 0.857142857143 87.0 0.632183908046 0.217261904762 0.251275510204 0.074974186103 0.123226559969 0.0462435718335 0.0225083876335 0.0108555873452 0.0056563884155 0.0425478805668 1.08333333333 0.357142857143 0.0 5.0 5.0 3.0 2.0 1.0 1.0 1.0 7.0 12.0 0.15 0.0 3.0 1.0 0.517857142857 0.333333333333 0.916666666667 1.0 0.75 0.583333333333 0.666666666667 0.416666666667 0.916666666667 0.25 0.25 0.0 0.583333333333 0.5 0.333333333333 0.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.75 0.75 0.25 0.0 0.0 0.5 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.0 -10.3223348805 -1.31871238562 -26.3420381056 -0.512532709887 -2.21656898878 4.30646363509 -34.9929017505 16.5831959417 0.357826372024 2.52410251242 -32.8048388749 31.3210108234 -0.188209929356 -0.427465875541 -31.8066256298 30.4168672464 0.197273032633 -0.0650699839008 -29.4460587593 29.231104608 0.24200428869 0.564042764263 -27.5091898064 35.0400181287 -0.12829691487 0.182917891877 0 5 4 4 2 5 4 4 3 4 5 3 3 4 5 4 2 4 4 5 2 3 6 4 2 3 6 4 2 3 6 4 2 4 5 4 2 4 4 5 3 13 3 5 2 2 3 0 180.0 1.25 100.0 0.56 0.257407407407 0.259722222222 0.126405178326 0.0821774691358 0.0591023662551 0.0368582038715 0.00767285332001 0.00887917893511 -0.0273634358369 0.2 0.916666666667 0.0 1.0 2.0 0.0 3.0 3.0 3.0 2.0 2.0 5.0 0.25 0.0 1.0 2.0 0.555555555556 0.916666666667 0.75 0.75 0.75 0.5 0.5 0.333333333333 0.333333333333 0.166666666667 0.0833333333333 0.0833333333333 0.0 0.916666666667 0.833333333333 0.833333333333 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.73483599789 2.16450722605 -16.0773739538 8.19880380571 -9.9550355871 4.36466515935 -46.6251237238 22.5195895989 2.65484382597 -0.792376266206 -42.0400859095 19.180370136 -0.58786547755 -1.47554905766 -41.5054869045 10.3611703559 -1.60896523421 1.4031701307 -54.3571462299 19.6518111886 -0.155155444402 0.778098013426 -62.113620923 29.8525520441 -0.447704715793 0.0587972922694 5 5 5 3 2 3 3 3 3 4 1 4 1 1 1 4 1 4 1 4 3 2 10 2 9 3 10 3 9 4 9 4 4 1 3 9 4 7 2 0 156.0 0.923076923077 70.0 0.814285714286 0.192307692308 0.204635108481 0.0691662873616 0.103591123839 0.0422134982046 0.0220350714783 0.013251274682 0.00522342849674 0.0374658824107 0.833333333333 0.461538461538 0.0 3.0 5.0 2.0 2.0 3.0 0.0 1.0 4.0 4.0 0.333333333333 1.0 1.0 2.0 0.448717948718 0.25 0.666666666667 0.75 0.333333333333 0.666666666667 0.666666666667 0.583333333333 0.916666666667 0.583333333333 0.333333333333 0.0833333333333 0.75 0.583333333333 0.416666666667 0.0 0.5 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.75 0.25 0.25 0.5 0.25 0.0 0.0 0.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.0 -9.01061831659 1.37118104818 -21.903049937 5.15669549778 -0.171542514903 3.23496729118 -22.3904744637 19.9358145306 1.34711489254 3.39051599732 -14.3968922798 38.6757797911 -0.263374414077 0.477706539986 -14.1025349649 43.3783107939 -0.280813265341 -0.592795257202 -17.2231861278 39.685743342 -0.380787224766 0.639954715574 -22.8525801013 44.8332412353 -0.262223775139 0.205553626812 1 4 1 1 1 2 1 5 10 2 4 3 5 1 3 4 5 1 12 1 3 4 3 3 3 9 4 9 3 11 3 10 4 5 2 3 6 1 3 4 8 7 4 4 0 182.0 0.928571428571 88.0 0.761363636364 0.210481825866 0.209576138148 0.0767220341547 0.0950733242123 0.0429850007498 0.0234388874552 0.0104942314138 0.00522846515546 0.022352408826 1.0 0.5 0.0 5.0 5.0 3.0 3.0 2.0 0.0 2.0 2.0 13.0 0.114285714286 1.0 3.0 1.0 0.483516483516 0.5 0.75 0.8125 0.5625 0.5625 0.4375 0.1875 0.6875 0.625 0.5 0.0 0.4375 0.75 0.625 0.0 0.4375 0.0 0.25 0.5 0.5 0.5 0.5 0.75 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.75 0.75 0.5 0.5 0.25 0.75 0.75 0.25 0.5 0.5 0.0 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.75 0.5 0.75 0.75 0.25 0.0 0.0 -7.73038295018 4.54728408834 -19.2864093133 13.7444882764 -0.74380575445 4.75330389806 -20.6538693933 34.7307652947 2.15011633136 3.7398239323 -8.77167159521 53.4763724062 0.356907401678 -1.03056238077 -3.64923983589 46.059287772 -0.205184180324 -2.23761919722 -4.51757151842 25.4644748985 0.0225644407067 -0.390202847872 -7.10195397843 15.4724310604 -0.298173777755 -0.223931048658 7 5 5 7 4 4 1 2 5 2 9 3 9 3 10 2 9 2 10 3 7 8 4 8 5 4 9 3 9 3 9 3 9 3 9 3 9 3 9 3 8 4 6 8 5 1 10 0 264.0 0.545454545455 87.0 0.83908045977 0.131313131313 0.14979338843 0.0259194910538 0.136205155898 0.029357364972 0.00664884127954 0.0118392174396 0.00131514505902 0.123893864965 0.75 0.0454545454545 2.0 2.0 5.0 0.0 1.0 0.0 0.0 0.0 1.0 9.0 0.142857142857 2.0 5.0 1.0 0.329545454545 0.0 0.222222222222 0.166666666667 0.222222222222 0.333333333333 0.722222222222 0.777777777778 0.777777777778 0.611111111111 0.722222222222 0.722222222222 0.722222222222 0.388888888889 0.333333333333 0.166666666667 0.111111111111 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 0.833333333333 0.833333333333 0.5 0.5 0.166666666667 0.666666666667 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.333333333333 0.833333333333 0.666666666667 0.5 0.5 0.833333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -9.83866920932 3.00947528756 -16.2305211519 7.52738219621 9.40054470782 1.14840275992 4.38445465049 16.0097993331 -6.77884573367 2.84568259525 -10.4053074431 23.9976320277 3.37060700883 -2.9224386992 -5.86525614942 11.1736890547 -1.5805991749 -0.263140321918 -8.98398270555 -5.54124154276 -0.566639614211 -2.95844823323 -18.8876042479 -26.3064318429 0.120694113798 0.26992259164 6 7 5 8 4 8 4 4 8 4 10 3 10 3 9 4 8 6 6 7 1 1 5 7 7 5 8 4 10 3 9 4 9 4 9 4 10 3 9 4 8 6 6 7 7 6 6 0 286.0 0.590909090909 112.0 0.580357142857 0.13878429263 0.179275270184 0.0267621273049 0.146377633321 0.0255741984066 0.00682429105915 0.00843175685666 -0.000957662329948 0.132157988445 0.692307692308 0.0454545454545 5.0 0.0 4.0 0.0 0.0 1.0 0.0 0.0 1.0 8.0 0.162162162162 1.0 2.0 3.0 0.391608391608 0.166666666667 0.583333333333 0.5 0.583333333333 0.666666666667 0.875 0.833333333333 0.833333333333 0.541666666667 0.208333333333 0.125 0.0833333333333 0.458333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.166666666667 0.5 1.0 0.666666666667 0.333333333333 0.5 0.0 0.5 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.666666666667 1.0 0.833333333333 0.5 0.5 1.0 0.5 0.0 0.166666666667 0.666666666667 0.5 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -16.0891178835 4.42740114419 -28.1558085694 10.896901423 13.9786109371 1.06057458133 6.94358031229 19.3299167057 -6.68158344623 3.10493331959 -3.61088047584 30.3560351317 2.66643584918 -1.39903583593 -1.20857341676 28.4246500329 0.120903461067 0.888142477247 8.01050695966 26.4340495844 -0.201452565469 -1.32688815603 2.93500365337 21.4001934567 -0.0715132200394 0.29681131709 4 8 4 3 2 5 2 3 4 4 1 4 2 6 1 12 1 3 5 1 3 4 9 4 10 3 10 3 10 4 4 4 2 3 4 4 8 4 9 2 3 0 182.0 0.928571428571 84.0 0.714285714286 0.217666948436 0.178178963893 0.0882055240979 0.0791418459574 0.0424263274463 0.0293618917252 0.013324344533 0.00930325873056 0.0107027276972 0.769230769231 0.428571428571 0.0 2.0 4.0 3.0 2.0 2.0 0.0 2.0 5.0 8.0 0.242424242424 1.0 2.0 3.0 0.461538461538 0.375 0.8125 0.875 0.5 0.625 0.5 0.25 0.3125 0.625 0.5 0.0 0.25 0.9375 0.5625 0.0 0.6875 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.0 -5.63863226954 6.00241499661 -13.8822447038 15.8718485979 -0.301605577288 2.44718125326 -14.4217843218 27.4494432972 1.14624323714 2.2791438602 -8.68283730263 39.7868661185 -0.505073170713 0.741081056834 -10.060833644 43.6057554677 -0.0337614884214 -1.28324357021 -9.53889028674 32.7042376013 0.654422595569 -0.714410101769 -5.52345110326 22.2112605812 -0.244750620007 -0.149449582917 6 4 9 9 6 4 3 4 5 4 5 3 3 3 7 4 2 3 8 3 2 3 8 3 1 4 8 3 1 5 7 9 7 3 2 5 5 3 4 6 3 2 6 9 7 8 5 0 224.0 1.14285714286 104.0 0.692307692308 0.200613839286 0.227359693878 0.0936929686076 0.085608568553 0.0501314836063 0.0342382287028 0.00875182999809 0.0103149201353 0.0065100590093 0.5 0.714285714286 0.0 4.0 4.0 0.0 1.0 3.0 3.0 2.0 2.0 7.0 0.315789473684 0.0 2.0 2.0 0.464285714286 0.3125 0.6875 0.9375 0.625 0.6875 0.375 0.375 0.8125 0.5625 0.0 0.0 0.375 0.625 0.375 0.25 0.5 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -9.54929658551 4.21760599194 -29.4581478734 14.7801543317 -9.60524949519 6.84925784392 -62.8629267514 37.9466375685 0.537963912868 -0.825179135182 -62.0550140545 33.7333136896 2.04023556169 -2.85061052747 -48.2310637922 16.2327993129 -1.41811683114 1.78508519545 -54.361418676 27.8167010442 -0.0783316702864 1.58236009773 -56.7957432853 43.5021524588 0.151665515927 -0.29546780079 3 1 4 4 3 5 3 5 3 3 6 3 3 3 6 2 5 2 6 3 4 2 6 3 4 2 6 3 3 3 6 3 3 3 6 3 4 3 4 4 4 4 2 5 4 13 2 12 1 0 195.0 1.15384615385 94.0 0.659574468085 0.228376068376 0.25325443787 0.105290514001 0.0998379608557 0.0656867445506 0.0313820878259 0.0135121402694 0.0120813698171 -0.00109782962918 0.333333333333 0.846153846154 1.0 1.0 2.0 1.0 3.0 3.0 3.0 2.0 5.0 5.0 0.1 1.0 1.0 2.0 0.482051282051 0.6875 0.5625 0.625 0.5 0.3125 0.25 0.3125 0.8125 0.25 0.0 0.0625 0.6875 0.75 0.6875 0.8125 1.0 0.5 0.75 0.5 0.25 0.0 0.0 0.25 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 -2.63136172579 -11.2411138486 -2.24241231842 -6.59594672597 6.10928627776 -26.9645213844 18.4064254005 5.78887004468 0.382747334419 -4.2278871409 22.8188674204 0.280452044088 -1.92221019945 4.29312601704 9.39057757929 -1.44224892643 -0.276032695583 -4.51164169252 4.3897956035 1.32085816862 0.248320739208 4.86031011185 5.62728433596 0.134193273573 -0.12800514566 2 3 9 5 9 5 9 6 9 4 10 5 9 4 10 5 10 4 10 4 2 2 6 10 4 4 4 2 4 3 5 3 3 3 5 3 2 3 6 3 3 3 5 3 3 3 5 3 2 4 5 3 2 3 6 3 2 3 6 3 2 4 5 9 4 5 308.0 0.636363636364 130.0 0.646153846154 0.159554730983 0.22373081464 0.0435061649432 0.161769795393 0.0627383453113 0.0151362523786 0.0225963503897 0.0180065603377 0.137419195418 0.571428571429 0.545454545455 3.0 4.0 1.0 0.0 0.0 1.0 5.0 5.0 1.0 8.0 0.159090909091 0.0 1.0 2.0 0.422077922078 0.833333333333 0.625 0.541666666667 0.666666666667 0.583333333333 0.75 0.583333333333 0.416666666667 0.0 0.25 0.166666666667 0.0 0.0 0.166666666667 0.708333333333 0.75 0.666666666667 0.833333333333 0.5 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.833333333333 1.0 1.0 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.333333333333 0.333333333333 0.0 0.166666666667 0.166666666667 0.333333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 -12.1825874621 -6.74238213462 -26.5733750961 -17.056791549 4.24887497587 -0.726899247976 -12.8881474327 -17.7503713602 0.695764168795 1.65385813013 -8.48833168651 -14.1279259813 -2.81059532483 -2.29671010081 -19.5092427483 -17.0865988663 2.40888762483 3.16903247408 -10.3902727391 -5.04471759608 -1.51811698311 -2.25280802107 -18.6821128235 -14.1200555628 -0.14801762327 0.0432580181199 3 2 3 5 3 4 2 5 3 1 1 1 34 1 2 5 3 5 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 2 5 2 6 154.0 0.318181818182 71.0 0.788732394366 0.212430426716 0.252361275089 0.0220304446776 0.368952792022 0.0646653692066 0.00245272608708 0.0260061298491 0.00471170290141 0.581088892873 1.14285714286 195225786.045 0.0 3.0 1.0 2.0 1.0 4294967292.0 0.0 0.0 1.0 2.0 0.1 1.0 6.0 1.0 0.461038961039 0.166666666667 0.166666666667 0.25 0.0833333333333 0.5 0.166666666667 0.666666666667 0.583333333333 0.666666666667 0.166666666667 1.0 1.0 0.75 0.25 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.12522433708 -3.55928327278 -5.28819478526 -2.42767548617 2.54910974969 8.52854063382 -1.34159037744 22.803359219 -2.68146200067 -1.72941475316 -5.76882470863 25.7700627598 2.5164339052 1.92134482156 -0.326109138567 32.5223248039 -2.10425529215 0.388021143642 -6.57273996537 39.0801355848 0.980264047427 -0.298953090305 -6.45603389961 33.4444712401 -0.184608778041 -0.325253104187 3 2 4 6 3 7 2 7 3 6 4 5 3 6 4 5 3 5 5 4 5 4 5 4 5 4 5 5 3 7 2 8 1 7 1 0 153.0 0.529411764706 92.0 0.445652173913 0.23892519971 0.293733179546 0.0325320382614 0.208338393953 0.054472652689 0.00328450543432 0.00958208547225 0.00282718712156 0.195438767994 0.444444444444 0.0 3.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 3.0 0.166666666667 0.0 7.0 1.0 0.601307189542 0.733333333333 0.533333333333 0.4 0.533333333333 0.933333333333 1.0 1.0 1.0 0.8 0.933333333333 0.666666666667 0.933333333333 0.2 0.266666666667 0.0 0.533333333333 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.166666666667 0.0 0.166666666667 0.5 0.666666666667 1.0 0.833333333333 0.833333333333 0.666666666667 0.5 0.666666666667 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.833333333333 0.5 0.5 0.833333333333 1.0 0.166666666667 0.5 0.5 0.333333333333 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 -8.31350526268 1.12344665712 -15.4150936095 3.12789161377 5.72996668718 1.01226819901 -3.43106473884 9.34741055446 -4.11628240281 2.21109464165 -10.4148408805 19.2830803615 2.87997003959 -0.548244249057 -2.35874816365 17.0730848853 -0.60734936355 -0.886634522842 1.92185943733 6.81238255382 0.386913023318 -0.899640119004 1.84308399915 -4.4671613128 0.047978431329 -0.20022619937 8 1 2 1 7 7 4 9 4 4 1 3 4 4 9 4 9 3 10 3 10 3 10 3 8 7 1 1 4 9 5 4 10 3 10 3 10 4 9 3 10 4 8 5 8 5 7 7 5 9 5 2 1 3 1 1 4 0 299.0 0.565217391304 115.0 0.678260869565 0.151273475688 0.189326741312 0.0292129344397 0.165237764731 0.0344240573428 0.00696302227239 0.0119926203797 0.000927533387921 0.155903267897 0.769230769231 0.217391304348 2.0 0.0 7.0 1.0 2.0 0.0 0.0 0.0 3.0 12.0 0.238095238095 1.0 3.0 3.0 0.384615384615 0.0833333333333 0.333333333333 0.458333333333 0.416666666667 0.625 0.833333333333 0.875 0.958333333333 0.583333333333 0.166666666667 0.333333333333 0.25 0.5 0.0416666666667 0.0833333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.5 0.5 0.666666666667 1.0 0.666666666667 0.5 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.5 0.666666666667 0.833333333333 0.5 0.666666666667 0.666666666667 0.833333333333 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.166666666667 0.833333333333 0.5 0.0 0.0 0.166666666667 0.5 0.0 0.0 -12.455604242 2.32504612517 -20.7923038836 6.89552206699 11.9592637175 2.53915380237 7.94654999505 19.3354830059 -6.88906694447 2.5032434765 -5.57611251261 28.4739815923 3.05233900638 -1.84041557637 -1.29289784312 23.0033533692 -0.53972969559 0.710595765897 0.69364246826 16.4559268496 -1.10356662184 -2.23314943908 -8.95543261811 5.57560011007 0.33004418616 0.392021923691 1 1 1 5 4 2 2 5 5 1 3 5 4 1 3 5 3 2 3 6 2 2 3 5 3 2 3 5 3 2 3 5 3 2 3 6 2 2 3 5 3 2 3 5 4 2 3 3 6 1 6 2 4 3 2 8 0 182.0 0.928571428571 87.0 0.701149425287 0.207100591716 0.226059654631 0.0872711396803 0.102012285505 0.0510575645825 0.0279450010927 0.0117208921777 0.0117292494105 0.0242037874649 0.307692307692 0.928571428571 0.0 0.0 3.0 1.0 3.0 3.0 3.0 3.0 0.0 6.0 0.212121212121 0.0 1.0 2.0 0.478021978022 0.5625 0.75 0.75 0.75 0.0 0.0 0.0 0.3125 0.625 0.4375 0.4375 0.5625 0.625 0.5 0.5 0.8125 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.25 0.25 0.5 0.5 0.25 -2.4555334077 -1.04587534032 -11.5963740522 -1.31001346043 -7.58236421302 1.94489196493 -31.9331318163 6.18232123327 4.40873017926 0.908862602598 -17.7793185158 11.1656730219 -0.394939195341 -0.596573963328 -12.8729661052 8.30939103503 -0.844885279083 -0.106015869456 -21.9351780905 4.43790622655 -0.39540572604 -0.675746239803 -27.7730917032 -1.58742090332 -0.194888022393 -0.035925665818 4 2 8 3 6 5 3 27 3 6 5 4 6 4 5 6 5 4 6 4 5 5 6 4 6 8 2 8 3 4 3 0 170.0 0.588235294118 94.0 0.531914893617 0.235294117647 0.263667820069 0.0409281498066 0.168665988195 0.0509362914716 0.00622628167034 0.0106911821135 0.00232782290243 0.120454733368 0.7 0.0 2.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 7.0 0.0967741935484 0.0 4.0 1.0 0.552941176471 0.333333333333 0.666666666667 0.466666666667 0.333333333333 0.666666666667 1.0 1.0 0.933333333333 0.933333333333 0.866666666667 0.733333333333 0.866666666667 0.6 0.4 0.0666666666667 0.466666666667 0.0 0.5 0.833333333333 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.0 0.0 0.666666666667 1.0 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.666666666667 0.666666666667 0.5 0.666666666667 1.0 0.5 1.0 0.833333333333 0.166666666667 0.166666666667 0.0 0.333333333333 0.833333333333 0.166666666667 0.833333333333 0.5 0.0 0.0 0.0 0.333333333333 0.666666666667 -8.61309103791 4.94316529132 -14.566095214 11.9719614926 7.95016680518 0.228576690099 4.13049484302 14.0076580792 -4.71223825126 0.266239680723 -4.24338324272 12.9531150505 2.64084129222 -0.90590522017 1.7449543034 5.91280552474 -0.258020873679 -0.816575747501 6.8398474399 -1.38824111437 -0.294313903073 0.166941228372 0.10616129933 -2.86035547991 -0.144545884379 -0.177528152965 1 1 13 5 10 6 10 5 11 4 11 4 11 3 12 3 13 2 12 4 2 4 5 4 2 4 5 4 4 3 4 3 5 3 4 3 6 3 3 3 5 4 3 3 5 4 3 3 5 4 3 3 6 3 3 3 5 4 2 4 6 4 1 5 4 11 4 1 1 2 1 0 330.0 0.681818181818 129.0 0.697674418605 0.15797979798 0.218457300275 0.0479604864068 0.153990705958 0.0655616217269 0.0173913139612 0.0232956796941 0.019343524382 0.120610252396 0.4 0.636363636364 3.0 2.0 4294967295.0 0.0 0.0 1.0 5.0 5.0 2.0 5.0 0.243902439024 1.0 0.0 2.0 0.390909090909 0.666666666667 0.458333333333 0.5 0.583333333333 0.583333333333 0.625 0.583333333333 0.541666666667 0.0 0.166666666667 0.0833333333333 0.0 0.0 0.25 0.708333333333 0.666666666667 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.166666666667 0.5 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -9.08630038743 -9.63610837265 -20.6212937419 -22.6605673506 2.60351658598 1.21231584563 -8.75289191462 -17.4171520231 2.89727940814 1.76292750645 0.36016134667 -10.1630278277 -4.46362059554 -1.83139141083 -13.6927978345 -10.9067534353 3.97118702632 3.22321611735 2.90719959104 3.54242156992 -1.16293063278 -1.78030547151 3.5239496233 -0.508191617084 -0.0314733730281 0.261584956184 11 9 3 5 1 5 3 5 1 4 5 3 3 3 4 3 4 3 4 2 6 3 3 2 6 4 1 2 8 3 1 2 8 6 8 5 10 3 12 2 12 2 12 2 12 1 12 2 12 3 10 3 10 4 8 5 9 4 11 1 11 0 322.0 0.608695652174 101.0 0.910891089109 0.134205856256 0.116392114502 0.0341641564515 0.0912041389017 0.0269704460351 0.0107520621872 0.00909561552503 0.00236597861931 0.0683611393308 0.571428571429 0.347826086957 2.0 4.0 2.0 0.0 4.0 4.0 0.0 0.0 2.0 5.0 0.486486486486 0.0 5.0 2.0 0.313664596273 0.583333333333 0.166666666667 0.0 0.166666666667 0.5 0.75 0.375 0.625 0.166666666667 0.625 0.5 0.25 0.75 0.291666666667 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 0.5 0.0 0.166666666667 0.333333333333 0.166666666667 0.166666666667 0.833333333333 1.0 0.833333333333 0.5 0.666666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 0.666666666667 0.5 0.166666666667 -8.05462407648 11.9573800723 -16.0350629792 27.4836193649 4.01451894756 -0.941822626992 -8.69916011622 31.7712491322 -3.10747610321 4.07876258582 -12.2101262648 42.6712747782 2.60305073862 -2.21489377726 -7.54625107181 36.6103803926 -1.9896593231 0.792185304107 -10.0500766374 35.1867109747 1.49835929497 -0.340530090403 -9.0300567676 33.1002680903 -0.40996479424 -0.194093975816 7 3 6 2 5 4 1 6 3 6 3 4 2 6 1 8 4 3 4 5 3 5 3 2 5 4 5 4 3 2 6 3 6 3 3 2 6 2 7 3 2 3 6 3 6 2 4 2 6 3 6 3 2 3 6 3 6 3 3 2 6 3 5 4 2 3 5 3 6 4 1 5 3 6 3 6 3 1 9 1 3 1 2 1 2 0 322.0 1.64285714286 142.0 0.859154929577 0.217661355658 0.192990239574 0.161606299696 0.0514387840167 0.0555495184724 0.0718348280779 0.0108118923266 0.0193475950565 -0.0198762311625 0.565217391304 2.0 5.0 2.0 3.0 3.0 5.0 6.0 6.0 6.0 1.0 12.0 0.210526315789 2.0 5.0 3.0 0.44099378882 0.5 0.375 0.416666666667 0.541666666667 0.666666666667 0.25 0.166666666667 0.291666666667 0.5 0.5 0.458333333333 0.5 0.708333333333 0.458333333333 0.333333333333 0.5 0.5 1.0 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 0.333333333333 0.666666666667 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.5 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 0.166666666667 0.5 0.666666666667 0.5 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.666666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.110716482151 9.79840867035 -3.62967449385 20.283959697 -6.8441203834 -5.23810351046 -38.0668410798 1.45899608126 -8.13518294708 -2.12668237517 -65.4933607176 -10.3406124823 9.35933436341 3.02399742237 -18.874024967 7.18171231955 0.521169182895 0.70505595686 6.14314029701 17.9020724545 -0.490867393662 -0.279233788528 -7.59129765533 14.1091361234 -0.491237561938 -0.152300534762 3 5 3 8 2 8 1 5 2 2 1 4 7 5 5 8 3 7 6 5 6 6 4 8 2 3 1 8 5 3 4 0 140.0 0.714285714286 85.0 0.611764705882 0.269285714286 0.270918367347 0.0620302478134 0.135662900875 0.0490863702624 0.00970772961858 0.00475234135844 0.00395229690406 0.040048269282 1.1 0.214285714286 2.0 2.0 3.0 2.0 0.0 1.0 0.0 2.0 2.0 11.0 0.172413793103 1.0 3.0 1.0 0.607142857143 0.583333333333 0.833333333333 0.25 0.666666666667 0.916666666667 0.916666666667 0.5 0.416666666667 0.833333333333 0.5 0.75 0.5 0.833333333333 0.416666666667 1.0 0.916666666667 0.25 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.5 1.0 1.0 0.75 0.25 0.5 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.5 1.0 1.0 -5.86599647396 4.59275692922 -15.6344601408 13.1929170797 -1.64955050347 3.55569775193 -17.7649490618 28.1180622337 3.63730644471 1.6347022289 -1.41224786202 34.5207627881 -0.236471556504 -1.47433619636 3.30701908597 29.2252749324 0.204114156818 1.3638267152 3.94751917093 35.7497996188 0.358551813603 0.128509540378 8.34617586205 38.183572525 0.0633644424122 -0.220339628628 5 5 5 3 1 4 3 2 4 4 1 3 5 2 2 3 8 3 9 4 9 4 8 3 9 3 9 4 10 4 1 2 6 6 2 0 156.0 0.923076923077 59.0 0.898305084746 0.144230769231 0.168639053254 0.0545978101451 0.0909858139888 0.0334926414808 0.0210695215855 0.0142691489601 0.0053764108922 0.0461632189491 0.666666666667 0.307692307692 0.0 4.0 3.0 1.0 2.0 1.0 0.0 1.0 1.0 7.0 0.25 1.0 2.0 1.0 0.378205128205 0.25 0.833333333333 0.75 0.333333333333 0.5 0.583333333333 0.75 0.666666666667 0.333333333333 0.0 0.0833333333333 0.583333333333 0.5 0.0 0.0 0.416666666667 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.5 0.75 0.5 0.5 0.25 0.25 0.75 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -9.54929658551 0.685590524088 -22.1945634851 4.58681870343 1.33090332931 4.8234741606 -17.5139225215 24.4934664739 1.58305272001 3.22375036398 -6.94459660468 42.6935091162 -0.0770001949859 -0.285876264119 -4.55064589823 42.2731485728 0.4010085938 -0.571005750419 -1.26717759757 36.9997011047 0.275368578087 0.42164009345 1.85811864581 39.8809467425 -0.020859186474 0.127204115246 11 2 4 4 3 6 2 14 2 7 3 5 2 5 6 3 3 3 6 4 3 3 6 3 4 3 6 3 4 4 6 2 4 4 6 2 4 3 6 3 4 4 5 4 1 6 4 13 3 12 4 1 5 0 240.0 1.06666666667 123.0 0.658536585366 0.226302083333 0.244444444444 0.0991058304398 0.0954050925926 0.0503935185185 0.0327203180015 0.0072235951997 0.010279232005 0.00442677053138 0.5625 0.866666666667 2.0 3.0 3.0 1.0 1.0 3.0 3.0 3.0 3.0 8.0 0.142857142857 0.0 1.0 2.0 0.5125 0.6875 0.6875 0.5 0.625 0.625 0.6875 0.625 0.6875 0.4375 0.0625 0.0 0.0 0.8125 0.5 0.375 0.5 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 -3.58098621957 4.93380323585 -11.1547792588 13.3675344152 -3.13429549062 2.05968877525 -17.452321003 19.4586281113 4.35614529916 -1.71968256549 3.22607422365 8.8721834757 1.13547950992 -1.86681401354 13.2755099064 -4.14737721576 -1.71618328657 0.719822835279 3.23897128683 -0.407466058144 0.726111670205 0.580906399152 5.54051622644 5.40000923952 -0.00365949952636 -0.141823533841 1 2 2 5 4 11 3 5 3 4 3 3 6 3 2 2 7 3 2 2 7 3 2 2 7 3 2 3 6 4 1 3 6 4 1 3 5 4 2 3 5 3 2 4 4 4 3 9 5 3 11 2 12 2 12 2 11 4 10 4 10 5 9 4 10 0 294.0 0.666666666667 118.0 0.686440677966 0.147716229349 0.160349854227 0.0452431794135 0.105191431008 0.0241757261005 0.0165146314014 0.00101244984964 0.00451101381575 0.0713696753585 0.785714285714 0.52380952381 2.0 5.0 3.0 0.0 4.0 5.0 2.0 0.0 3.0 12.0 0.142857142857 0.0 2.0 3.0 0.401360544218 0.708333333333 0.666666666667 0.708333333333 0.833333333333 0.375 0.166666666667 0.291666666667 0.208333333333 0.416666666667 0.0833333333333 0.291666666667 0.0 0.625 0.791666666667 0.291666666667 0.0 0.833333333333 0.666666666667 0.5 0.5 0.5 0.666666666667 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.833333333333 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.0 0.333333333333 0.5 0.666666666667 0.5 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.5 0.333333333333 0.0 -11.4288406754 11.4591559026 -27.5904437601 26.6421834729 0.612285100149 -1.17342614343 -22.6617126723 25.8736339086 3.15233205724 1.4069525782 -12.1324475491 30.8946066758 -4.0074121447 1.01851244305 -25.9512038504 33.4290484306 2.25356457766 -2.31638023742 -18.8287083059 18.5734192234 -0.142621808943 0.0837554641762 -10.625153283 9.92074788833 0.180874075194 -0.289223456727 4 1 7 6 1 29 2 5 8 4 8 3 9 3 9 3 9 4 8 4 7 6 5 7 5 7 4 0 168.0 0.857142857143 82.0 0.524390243902 0.192956349206 0.208758503401 0.0536522024484 0.106292306109 0.0359304560118 0.0137950374835 0.00702029995397 -0.000687157588977 0.0452174658098 0.333333333333 0.0714285714286 2.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 0.166666666667 0.0 1.0 1.0 0.488095238095 0.75 0.333333333333 0.0 0.25 0.833333333333 0.833333333333 0.666666666667 0.833333333333 0.75 0.916666666667 0.75 1.0 0.666666666667 0.416666666667 0.0833333333333 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -8.18511135901 5.63863226954 -14.8949623257 15.751475325 6.45899943976 3.19980317073 1.8965851931 27.1751984826 -2.60394039694 -0.0268556802885 -1.2631685394 29.0452694126 0.944643007689 0.546374838253 -0.0300316298296 31.112662084 0.487871299096 0.258890422194 5.47575049159 34.1950755354 -0.50640984829 0.217299802906 1.01036384246 35.215730017 -0.0350348262925 -0.0506187998237 8 1 13 6 11 4 11 4 11 4 11 4 11 4 11 3 12 4 4 11 3 5 2 5 2 4 5 3 3 3 6 3 3 3 6 4 2 3 6 3 3 3 6 4 2 3 6 4 2 4 5 3 3 5 4 4 3 14 2 13 3 1 6 1 4 0 330.0 0.681818181818 140.0 0.657142857143 0.209292929293 0.238016528926 0.0622184378217 0.157241172051 0.0596063110443 0.0152717921699 0.014105264783 0.0103531711809 0.094731504374 0.8 0.454545454545 0.0 3.0 4.0 4.0 0.0 0.0 5.0 3.0 3.0 14.0 0.0980392156863 0.0 2.0 2.0 0.424242424242 0.0 0.208333333333 0.791666666667 0.791666666667 0.0 0.291666666667 0.166666666667 0.458333333333 0.333333333333 0.416666666667 0.291666666667 0.5 0.833333333333 0.958333333333 0.875 0.958333333333 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -5.09295817894 -8.1024334665 -14.5889261461 -19.7832932869 -1.66927348277 0.946081074187 -9.95810892303 -7.96377961786 7.99967762529 8.44604196333 15.8724842684 32.497882241 -6.02500904761 -0.664493212489 -2.89945477756 38.3014777627 2.01437673718 -1.15601731372 -4.47141787316 22.5068317651 -0.267023485785 -1.08681087227 5.62250766449 13.7357138375 0.375520033069 0.263365260247 4 1 7 2 6 4 4 17 1 7 3 3 6 3 6 2 7 2 7 3 6 3 6 3 6 4 5 7 2 6 1 0 144.0 0.5625 67.0 0.641791044776 0.197530864198 0.224392361111 0.0364047496571 0.173168710884 0.0522708762003 0.00718090722324 0.017170299888 0.00501115904866 0.15180970905 0.555555555556 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 8.0 0.0714285714286 0.0 2.0 1.0 0.465277777778 0.25 0.666666666667 0.333333333333 0.333333333333 0.75 1.0 0.833333333333 0.916666666667 0.583333333333 0.833333333333 0.166666666667 0.25 0.25 0.666666666667 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 -6.20704278058 3.50140874802 -10.8710928382 7.39244345548 5.17937433945 -1.40006614001 0.722455365428 4.15318706686 -3.42549832915 0.92008537261 -5.44054335267 8.13428559547 2.28126431439 0.999982876464 1.56241960905 13.9268212503 -0.254340952138 -0.853427650776 3.59849732814 8.10248963164 -0.671816477307 -0.45344181448 -1.98850283658 0.9774658235 0.183717878638 -0.127160457146 6 2 5 8 3 8 3 3 2 4 1 5 1 4 1 18 3 3 8 3 8 3 8 4 8 3 4 3 2 4 1 4 3 6 2 0 154.0 0.785714285714 85.0 0.564705882353 0.239079102715 0.246289424861 0.06830420802 0.119247951408 0.0423148490909 0.0161787471017 0.00769577282851 0.00447703442961 0.0385857341881 0.909090909091 0.285714285714 0.0 1.0 4.0 2.0 0.0 2.0 0.0 2.0 5.0 11.0 0.205882352941 0.0 3.0 1.0 0.551948051948 0.25 0.666666666667 1.0 0.75 0.75 1.0 0.5 0.666666666667 0.666666666667 0.75 0.25 0.166666666667 0.833333333333 0.75 0.166666666667 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.75 1.0 0.5 0.25 0.75 1.0 0.5 0.0 1.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 -9.27645954021 6.54808908721 -21.4468393632 14.2002330362 1.49503564619 -1.44213866802 -15.8839333476 15.838209445 1.92187619238 4.32198424863 -2.85920906198 30.837772932 0.483177173975 -1.33292924327 3.45050716941 26.9130782022 0.475242251435 -1.08907933054 7.14865408135 13.7996011051 -0.206362355594 -0.403735470305 4.5562553931 6.30454727809 -0.208402498159 -0.290035357531 1 2 3 4 2 4 2 4 32 4 2 4 2 4 3 4 2 3 3 3 3 4 2 4 2 4 2 4 1 5 1 11 1 0 132.0 0.272727272727 68.0 0.558823529412 0.171717171717 0.295110192837 0.0138819322704 0.468146948131 0.0559590394301 0.00164849934782 0.0184257730475 0.00515889177905 0.969665391931 1.0 195225785.955 2.0 1.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 2.0 2.0 0.25 1.0 7.0 1.0 0.515151515152 0.583333333333 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.333333333333 1.0 1.0 0.583333333333 0.333333333333 1.0 1.0 0.25 0.166666666667 0.666666666667 1.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -5.46914258989 -6.27938593653 -9.24024453977 -9.65569903574 4.47798156563 7.93945210854 -2.19797559495 15.747806622 -4.54324605173 0.0302170163173 -8.60604438728 23.2364062769 4.8224207632 -0.374627110194 4.11675995017 19.2701686773 -3.30641160624 0.23607730306 -2.68830972105 18.4821431784 1.94552842928 -0.84304371677 -0.196535645098 11.0996686785 -0.31034690648 -0.0416181956038 2 4 4 7 2 2 2 7 2 6 5 1 1 3 7 5 1 1 3 6 3 1 1 5 6 5 4 5 4 3 1 2 1 4 2 7 1 0 126.0 0.642857142857 74.0 0.662162162162 0.273368606702 0.27664399093 0.0630701428132 0.164775022296 0.0574052078209 0.0105436571264 0.00853132072852 0.0054739800516 0.0790394152083 1.44444444444 0.571428571429 2.0 4.0 4.0 2.0 1.0 2.0 1.0 3.0 4.0 10.0 0.290322580645 0.0 3.0 1.0 0.587301587302 0.666666666667 0.833333333333 0.333333333333 0.5 0.666666666667 0.416666666667 0.666666666667 0.166666666667 0.75 0.333333333333 0.75 0.5 0.666666666667 0.416666666667 0.75 0.916666666667 0.25 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.75 1.0 1.0 0.75 0.75 1.0 0.75 0.5 1.0 0.75 0.5 0.25 0.25 0.75 1.0 0.75 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.75 1.0 0.75 0.5 0.25 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.25 0.75 1.0 0.5 1.0 1.0 0.75 0.25 0.25 0.75 1.0 0.25 0.75 1.0 0.75 0.25 0.25 0.5 0.75 -4.27444704304 2.1826963624 -11.7403467052 7.39972007973 -1.87877074221 3.46614409591 -16.6446529296 21.252577785 1.7905664989 1.49174023831 -8.57235470852 28.8140183783 0.172225053589 -0.861630283114 -4.59644522253 24.4895895288 -0.193657411866 -0.275727760504 -6.63143301525 15.856532249 -0.248067524987 -1.83375499218 -9.09456218536 -2.00699006366 0.0376701199431 -0.220634198666 1 7 5 6 8 4 8 3 10 3 8 5 8 5 5 1 1 6 4 8 5 7 9 4 9 5 6 8 4 10 3 9 3 10 3 10 3 10 3 10 4 9 5 6 8 5 8 5 2 1 4 6 0 299.0 0.565217391304 136.0 0.5 0.16645227682 0.198778537153 0.0301223688736 0.156700752938 0.024630335104 0.00649834711646 0.00496381540527 -0.00162782650643 0.141672438174 0.692307692308 0.0869565217391 3.0 1.0 5.0 0.0 0.0 1.0 0.0 0.0 1.0 6.0 0.25 0.0 1.0 2.0 0.454849498328 0.25 0.708333333333 0.583333333333 0.583333333333 0.708333333333 0.916666666667 0.75 0.708333333333 0.958333333333 0.5 0.166666666667 0.125 0.625 0.0416666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.0 0.0 0.0 0.333333333333 0.5 0.666666666667 1.0 0.833333333333 0.333333333333 0.5 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.333333333333 0.0 0.833333333333 1.0 0.833333333333 0.166666666667 0.666666666667 0.5 0.0 0.0 1.0 1.0 0.833333333333 0.166666666667 0.666666666667 0.333333333333 0.0 0.0 -17.2164129745 11.2377229383 -30.8140915784 24.2974872848 14.1334089285 -3.22584714441 4.98966147028 19.5883573265 -6.55314941622 2.90196124691 -6.12493459477 23.749930214 1.76716150276 -1.62360330325 -8.05364205438 23.2800151995 0.500029436738 1.65545271841 2.65617854214 24.3170179556 -0.0152051821333 -2.07772545725 0.151118629076 15.0083713617 -0.145668818888 0.294549561901 1 1 5 11 6 12 5 12 5 13 4 13 4 13 4 13 4 13 3 4 1 9 4 3 4 6 5 3 4 5 4 6 3 4 3 7 3 4 3 7 3 4 3 7 4 3 3 7 4 2 4 7 3 3 4 6 4 4 3 6 5 2 5 5 5 1 7 3 7 1 5 6 5 374.0 0.772727272727 148.0 0.648648648649 0.155866624725 0.220588235294 0.0539700518549 0.139830362355 0.06568485869 0.0211823104567 0.0232551781796 0.0213932258321 0.0960980338963 0.411764705882 0.636363636364 3.0 2.0 1.0 1.0 0.0 2.0 5.0 5.0 2.0 1.0 0.166666666667 1.0 0.0 2.0 0.395721925134 0.766666666667 0.6 0.6 0.766666666667 0.4 0.4 0.3 0.3 0.0 0.266666666667 0.266666666667 0.366666666667 0.0 0.1 0.633333333333 0.766666666667 0.777777777778 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.444444444444 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.111111111111 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.555555555556 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.888888888889 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.444444444444 0.555555555556 -12.2115247245 -11.4302186402 -30.0083081434 -28.0165251515 0.328473800656 0.00113596691163 -22.4680050392 -24.7230228609 6.27322977657 3.79084684186 1.23329443743 -9.31946071789 -5.06599626233 -2.54441034987 -17.4986863649 -14.1827053074 1.20093578227 1.79153528178 -17.0820897201 -11.0884747159 0.927863525104 -1.75634463234 -8.79603648964 -21.5071564066 -0.513321342364 -0.0758041464523 2 3 4 1 6 4 3 5 2 14 1 7 3 4 2 5 5 3 3 3 6 3 3 3 6 3 3 3 7 2 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 2 5 3 12 3 1 1 3 1 0 210.0 1.07142857143 108.0 0.62962962963 0.233333333333 0.235714285714 0.103548752834 0.0926553287982 0.055612244898 0.0345079722907 0.010120961537 0.0127776357018 0.00140717042223 0.4 1.0 2.0 1.0 1.0 1.0 2.0 3.0 3.0 3.0 7.0 7.0 0.209302325581 0.0 1.0 2.0 0.514285714286 0.8125 0.6875 0.5 0.5625 0.75 0.6875 0.5 0.5625 0.5 0.0625 0.0 0.0625 0.75 0.5625 0.4375 0.625 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 -2.20694854421 3.94704258868 -7.62612210502 9.62182115626 -3.17574236669 -0.0413095496736 -16.6042865876 8.15050543496 1.93569298069 -1.87497569738 -7.6029464396 -2.87682021441 1.11703198294 -0.874199345737 0.0765061591664 -10.7020164111 -1.42638670201 -0.0652871020655 -10.2461217721 -13.106003107 -0.793895676145 -0.486493636114 -22.7719485051 -18.831181068 -0.292121305742 -0.221800806641 1 2 3 10 6 9 6 10 5 11 4 11 4 11 4 11 4 11 4 11 4 2 4 5 11 4 4 4 4 3 4 5 3 3 3 6 3 3 3 6 3 3 3 6 3 3 2 7 3 3 2 7 3 3 3 6 3 2 4 6 3 1 6 4 11 3 6 330.0 0.681818181818 138.0 0.601449275362 0.167676767677 0.225482093664 0.0494253833097 0.15488051312 0.0650293569302 0.0173922921946 0.021868583428 0.0187528760531 0.118806497417 0.4 0.545454545455 2.0 2.0 1.0 0.0 0.0 1.0 5.0 5.0 3.0 7.0 0.108695652174 0.0 1.0 2.0 0.418181818182 0.708333333333 0.5 0.5 0.625 0.708333333333 0.791666666667 0.666666666667 0.458333333333 0.0 0.25 0.166666666667 0.0 0.0 0.291666666667 0.625 0.541666666667 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.333333333333 0.5 0.5 0.5 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 -9.89654373408 -6.88706844652 -21.8969161317 -18.4637149881 3.26046418729 -1.88391144133 -9.73403951341 -20.1024435137 1.81421129843 4.29490609441 -2.22203681147 -3.78107376213 -3.28865760725 -1.2403966904 -14.9243739039 4.33418853035 2.37805493194 3.66252814592 -3.80835828694 21.4778612427 -0.0293707136974 -1.74190289904 -0.221545866721 20.6904462437 -0.286317967962 0.454444829957 8 1 7 6 6 2 1 4 2 3 4 2 1 1 1 4 1 13 1 2 2 3 9 3 9 3 9 3 10 3 6 1 2 4 5 1 2 10 5 6 2 0 168.0 0.857142857143 75.0 0.826666666667 0.181051587302 0.214285714286 0.0635627142722 0.110048185941 0.0426232993197 0.0206795771964 0.0120627268123 0.00754371542641 0.0517202034402 1.08333333333 0.5 0.0 5.0 5.0 3.0 1.0 4.0 0.0 2.0 2.0 15.0 0.25641025641 1.0 3.0 1.0 0.446428571429 0.166666666667 0.833333333333 1.0 0.75 0.333333333333 0.75 0.333333333333 0.75 0.416666666667 0.416666666667 0.0 0.333333333333 0.583333333333 0.5 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.5 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.5 0.75 0.25 0.0 0.0 0.75 1.0 0.75 0.75 0.75 0.25 0.0 0.0 -10.2768620396 4.63822977011 -25.6539580992 11.8325461133 -1.18693394877 1.7010554559 -29.4658798644 23.3443993987 1.64938952091 4.48397059102 -19.9494975481 44.6708886431 0.10434578962 -0.0098950167978 -16.8111189666 45.4096595214 -0.22969665714 -1.94989620098 -16.9183963343 31.9466832756 0.62963647191 1.20496043827 -10.9660408875 38.5265238887 0.0859155959147 0.0900037705523 5 5 5 3 2 3 3 3 4 3 1 3 5 3 1 21 2 4 8 4 8 4 9 4 8 4 6 1 2 6 2 2 3 8 4 8 1 0 168.0 0.857142857143 89.0 0.61797752809 0.228670634921 0.25 0.0731999024808 0.118480725624 0.0479910714286 0.0200210709234 0.0117082115959 0.00490911154714 0.0343346392497 1.08333333333 0.357142857143 0.0 4.0 6.0 3.0 2.0 1.0 0.0 2.0 4.0 12.0 0.216216216216 0.0 3.0 2.0 0.529761904762 0.25 0.833333333333 0.916666666667 0.416666666667 0.583333333333 0.833333333333 0.75 0.916666666667 0.416666666667 0.5 0.0833333333333 0.666666666667 0.333333333333 0.5 0.0 0.416666666667 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.75 1.0 0.75 0.5 0.5 0.75 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 -10.4132805623 1.22776670385 -23.6584312377 3.97575538075 2.09407072354 2.29823449893 -17.785627676 17.6591891317 0.308300558234 5.09989936852 -14.2685577968 42.9538142594 -1.24853108783 -0.0451742114544 -19.262814772 45.2549027384 1.09667382333 -1.50955506051 -12.7225193401 34.0651937683 0.0702448130097 0.869086923111 -11.2604643671 38.8130936591 -0.224946659022 0.149562201935 3 9 4 3 3 4 3 3 5 3 3 3 5 3 2 3 7 2 2 3 7 2 2 3 6 3 2 3 6 3 2 3 6 3 2 4 5 3 3 5 3 3 3 11 6 2 4 2 11 3 11 3 11 3 11 3 11 3 11 4 9 6 8 3 1 1 1 0 294.0 0.666666666667 115.0 0.704347826087 0.19436345967 0.163751214772 0.0600343520258 0.109310911648 0.0604838214614 0.0166148194927 0.0276729658254 0.0156250452349 0.0581791168944 0.642857142857 0.571428571429 0.0 3.0 5.0 0.0 4.0 5.0 2.0 0.0 7.0 11.0 0.265306122449 0.0 2.0 2.0 0.391156462585 0.625 0.791666666667 0.25 0.0 0.333333333333 0.166666666667 0.375 0.0 0.333333333333 0.208333333333 0.333333333333 0.333333333333 0.666666666667 0.708333333333 0.708333333333 0.833333333333 0.166666666667 0.666666666667 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.666666666667 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.5 0.833333333333 0.166666666667 0.0 0.5 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 -2.1826963624 5.88115408759 -7.45986567409 15.4562758915 -2.43264231774 2.14763793633 -10.7584902451 24.9299637228 3.80291284901 1.15037683772 0.372069937336 30.5469688253 -2.93240115348 0.123868196569 -9.8273131255 31.7443431208 0.534560860631 -0.119283185514 -11.1413780936 28.5370890352 0.537645455757 -0.706087477707 -5.90324173469 20.8657536165 -0.214871475192 -0.16958860233 3 2 5 3 4 4 4 5 2 8 1 4 5 3 5 3 5 3 5 3 4 4 4 4 4 4 4 5 4 6 3 3 2 0 128.0 0.5 64.0 0.65625 0.1943359375 0.2412109375 0.0274424552917 0.197233200073 0.0501089096069 0.00399734869984 0.0151272388662 0.0040622067728 0.199347641861 0.5 0.0 1.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 6.0 0.2 0.0 4.0 1.0 0.5 0.25 0.5 0.0 0.375 0.625 0.875 0.5 0.875 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 -6.9232400245 2.62605656102 -12.1069087072 7.51606337491 5.76501479411 1.88561305624 0.777529458536 15.0630849201 -3.69000696702 0.738432697084 -5.26222711997 19.362930303 2.28269706989 -0.0253513475239 -1.92150981137 18.3505599155 -1.38514811574 -0.619724232831 -4.01204838439 11.9390852174 0.497907852919 -0.547292725989 -5.8819621442 6.39236031636 -0.0726971880153 0.0890962840937 1 5 3 6 4 5 5 4 5 4 6 3 5 4 5 4 6 2 6 4 5 3 6 4 5 4 5 4 5 5 3 6 4 6 2 8 1 16 1 7 2 0 189.0 0.428571428571 104.0 0.451923076923 0.219870664315 0.293524817334 0.0257527881055 0.288511389488 0.0586393461733 0.00290869445133 0.0125825815803 0.00480929973235 0.374259424582 0.777777777778 0.0 3.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 2.0 6.0 0.133333333333 0.0 5.0 1.0 0.550264550265 0.5 0.222222222222 0.388888888889 0.722222222222 0.944444444444 0.888888888889 1.0 1.0 0.666666666667 0.555555555556 0.722222222222 1.0 0.0 0.0 0.111111111111 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 1.0 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 0.5 0.5 0.5 0.333333333333 0.166666666667 0.333333333333 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 -7.70006772292 -5.82052363308 -14.1343813948 -9.99431802229 5.10203212451 5.95415810424 -5.98160304498 10.0439487849 -5.22108985985 1.24578856798 -15.6469917075 22.9957437931 4.23626882621 0.406766607569 -5.61212171601 23.8258063578 -2.56032923644 -0.570644563374 -9.00870590534 20.746171612 1.48053997246 0.102624887 -7.96047805148 18.1063240171 -0.260885122635 -0.163831210727 1 5 10 6 11 5 12 4 13 3 12 4 12 3 13 3 13 3 3 3 8 3 1 5 7 4 3 3 6 3 5 3 4 3 6 3 5 1 7 3 5 2 6 3 4 2 7 3 4 3 6 3 4 3 7 2 4 3 6 3 4 4 5 4 1 7 3 6 2 3 1 1 3 4 2 0 352.0 0.727272727273 126.0 0.785714285714 0.143465909091 0.192794421488 0.0452711189895 0.135398973656 0.0607154439214 0.016650742155 0.0247478799687 0.0187928584419 0.10136988363 0.75 0.681818181818 5.0 5.0 2.0 0.0 0.0 2.0 5.0 5.0 3.0 8.0 0.3 0.0 2.0 2.0 0.357954545455 0.625 0.416666666667 0.333333333333 0.583333333333 0.75 0.666666666667 0.541666666667 0.583333333333 0.0 0.25 0.0416666666667 0.0416666666667 0.0 0.333333333333 0.541666666667 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.333333333333 0.5 0.166666666667 0.166666666667 0.166666666667 0.333333333333 1.0 0.833333333333 0.833333333333 1.0 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 0.833333333333 0.5 0.833333333333 0.833333333333 0.333333333333 0.333333333333 0.5 0.5 0.333333333333 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 -9.43354753599 -9.08630038743 -22.7580361799 -23.4713130844 0.868357022339 -1.45762491081 -15.2685217897 -23.7356415973 4.2365903263 4.59660932034 -1.40846147837 -5.70649002213 -5.08738982619 -1.91788170696 -22.3905756887 -3.54120077458 1.36930670718 2.76362396662 -23.9418905435 7.45179689663 -0.607647127433 -1.68590035049 -27.3943710097 -0.718478011606 -0.369369777429 -0.0700030110729 0 4 1 4 2 3 27 3 1 4 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 4 1 12 2 0 105.0 0.238095238095 56.0 0.607142857143 0.2 0.29387755102 0.0143310657596 0.519085195983 0.0560544217687 0.00143397561739 0.0155445991795 0.00367269733965 1.13059393749 1.0 204522251.952 2.0 1.0 1.0 1.0 4294967294.0 4294967293.0 0.0 0.0 2.0 3.0 0.1875 1.0 6.0 1.0 0.533333333333 0.416666666667 0.416666666667 0.583333333333 0.666666666667 0.5 0.5 1.0 1.0 0.5 0.5 1.0 0.916666666667 0.25 0.25 0.5 0.666666666667 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -3.45593590714 -4.60791454285 -5.49304298855 -6.72377601142 3.10411429014 6.72296876553 -1.47864103225 17.3222512889 -3.80377048744 1.92444587322 -8.26184334715 30.956457213 3.6095908837 -0.988138390566 -0.289721965991 26.8636068342 -2.87619017723 0.558771614569 -7.04738600684 27.246052283 1.73405863888 -0.443238288934 -5.478175133 24.7283024473 -0.390873723269 0.0193380886205 4 7 1 4 3 13 2 4 3 7 2 3 4 5 3 5 4 3 4 5 4 3 5 4 3 4 5 5 2 3 8 6 10 5 9 2 14 4 12 11 5 12 4 12 3 4 5 5 1 5 5 5 1 4 7 4 1 4 6 4 3 3 6 4 5 8 5 0 336.0 0.761904761905 177.0 0.610169491525 0.23828125 0.243197278912 0.065327270231 0.133097212099 0.0470056512188 0.0144628875361 0.0096389253451 0.00418405925678 0.0471727061891 1.625 0.571428571429 3.0 11.0 9.0 3.0 4.0 3.0 0.0 5.0 4.0 16.0 0.241935483871 0.0 4.0 1.0 0.526785714286 0.458333333333 0.375 0.541666666667 0.791666666667 0.75 0.708333333333 0.75 0.458333333333 0.416666666667 0.416666666667 0.5 0.166666666667 0.875 0.458333333333 0.625 0.666666666667 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.666666666667 0.833333333333 0.333333333333 0.166666666667 0.5 0.5 0.833333333333 0.5 1.0 1.0 0.666666666667 0.333333333333 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.833333333333 0.333333333333 0.5 0.833333333333 0.666666666667 0.5 1.0 0.333333333333 0.666666666667 0.0 0.0 0.5 0.666666666667 0.333333333333 1.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.333333333333 1.0 0.333333333333 -13.2174390834 1.69765272631 -30.1772036405 7.77697321722 1.86345845906 5.06656124636 -29.1628824084 23.5901540192 -2.56173763383 -0.20368460772 -36.5102885581 32.4761014733 -0.240700485041 3.10053212443 -39.7526245999 42.0976174158 0.831195571916 -2.72727135975 -31.5582294923 30.1906901054 0.378393049011 0.160265218375 -25.8403132305 14.7845714523 0.0284555219858 -0.902107679051 0 6 3 3 1 4 5 2 1 4 5 1 3 3 5 1 3 3 9 4 9 3 3 1 6 3 1 2 5 6 7 5 7 4 9 3 9 3 4 0 156.0 0.923076923077 61.0 0.83606557377 0.166666666667 0.158284023669 0.0581032215648 0.07899740176 0.0456114398422 0.0189500773734 0.016048093703 0.0068510552833 0.0268145838419 0.25 0.461538461538 0.0 2.0 0.0 1.0 3.0 1.0 2.0 0.0 1.0 6.0 0.181818181818 2.0 3.0 1.0 0.391025641026 0.666666666667 0.25 0.0 0.0 1.0 0.916666666667 0.5 0.166666666667 0.416666666667 0.5 0.916666666667 0.833333333333 0.0 0.0 0.666666666667 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 -5.43575344098 0.293824510323 -10.8295066392 4.19628985085 3.13557694893 4.73770290315 -2.11697807777 17.7209593676 -0.716619679016 -1.6675706033 -2.21989778183 15.4886306588 -0.518674036196 0.816424285375 -6.90018968916 14.9424121254 0.173735586252 -0.470878028694 -5.70852094705 15.5598127628 -0.10057197639 0.724908414724 -8.7484543226 19.7724498784 -0.238186885735 0.0626372268726 4 2 4 7 1 8 1 27 2 7 3 6 3 5 4 5 2 6 3 4 5 2 6 0 117.0 0.692307692308 79.0 0.392405063291 0.308641975309 0.281393819855 0.0605027556595 0.114422148172 0.0401133107686 0.00619596957665 -0.00360256145731 -0.00208566309472 0.00624548413725 0.222222222222 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.2 0.0 4.0 1.0 0.675213675214 0.666666666667 0.833333333333 0.0833333333333 0.5 0.833333333333 1.0 0.75 0.75 0.916666666667 1.0 1.0 0.583333333333 0.583333333333 1.0 0.833333333333 0.25 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.75 -5.58266569615 9.20650132347 -14.3050356857 22.2502866019 -1.16486640187 0.0579535523321 -17.9803657082 22.9896101229 0.970893461776 -0.720098606758 -13.2935624158 18.7234491914 -0.305136440686 0.854003677028 -14.7006392664 22.1190780605 -0.816802793598 -0.157359023675 -21.2614235796 20.9091722346 -0.112439589794 -0.594080230333 -24.5640828632 14.1000104781 -0.1149485969 -0.13776287221 4 6 4 4 2 3 2 4 4 3 1 3 9 3 8 3 9 4 8 4 9 3 9 3 10 4 4 1 3 8 6 5 3 0 156.0 0.923076923077 61.0 0.852459016393 0.137286324786 0.176528599606 0.0491292313593 0.0955964783628 0.0350188177481 0.0188856701226 0.0156351624721 0.00633858269819 0.0518763245692 0.666666666667 0.230769230769 0.0 3.0 3.0 2.0 2.0 0.0 0.0 1.0 2.0 5.0 0.2 1.0 2.0 1.0 0.391025641026 0.416666666667 0.833333333333 0.833333333333 0.333333333333 0.75 0.583333333333 0.666666666667 0.75 0.5 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 1.0 0.75 0.5 0.25 0.25 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -10.871506882 -1.27323954474 -26.023516441 0.439079558544 0.425958609641 5.72986771907 -24.2071969426 23.6358675194 1.87887817104 3.67008187624 -12.8767640295 44.3918433768 -0.261558782303 -0.747695118056 -11.5687859706 41.6510943037 -0.0934124167975 -0.505320136672 -13.9268471037 36.8674747692 -0.664698905364 0.862824295029 -23.0644536015 44.6140516841 -0.416975287891 0.224123454049 0 6 2 5 1 4 3 5 2 3 4 3 2 4 4 2 4 4 2 3 4 5 1 2 6 4 1 2 6 6 7 6 7 6 8 4 9 4 10 2 6 0 169.0 1.0 80.0 0.6125 0.209376422394 0.177514792899 0.0724739677911 0.0709358916004 0.0388103196128 0.0191751993986 0.00831085776896 0.000122861622616 0.00438971330589 0.230769230769 0.538461538462 1.0 1.0 1.0 0.0 3.0 3.0 1.0 0.0 3.0 7.0 0.25 0.0 3.0 2.0 0.473372781065 0.75 0.5 0.25 0.0625 0.5625 0.8125 1.0 0.75 0.375 0.5625 0.75 0.5 0.8125 0.375 0.0625 0.0 0.75 0.25 0.25 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.75 0.75 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.5 0.25 0.0 0.25 0.5 0.5 0.75 1.0 -6.95384674432 4.11354314453 -13.7713647052 12.102755697 4.25494981222 3.28248920409 -1.12574709963 24.101410489 -0.450038482095 0.498352541196 0.384712581536 28.8658735572 -0.954050975682 0.368629476855 -5.93755800095 28.8092500362 0.464032028232 -0.541466524598 -4.43803137772 26.8785185934 -0.279103438637 0.636081687522 -6.4032133427 29.2514684808 -0.116291245548 -0.108023944816 8 4 6 6 4 8 4 8 3 3 9 3 8 4 9 2 9 4 6 7 6 8 4 6 7 4 9 3 9 3 8 4 8 3 9 4 8 3 8 5 6 7 5 7 5 0 264.0 0.545454545455 106.0 0.603773584906 0.153724747475 0.188188705234 0.0298242736421 0.164397015524 0.0266836864687 0.00771833478982 0.00698760573136 -0.00136571177037 0.157192534252 0.916666666667 0.0 4.0 3.0 4.0 0.0 0.0 0.0 0.0 0.0 1.0 7.0 0.264705882353 1.0 2.0 2.0 0.401515151515 0.0 0.388888888889 0.333333333333 0.5 0.333333333333 0.888888888889 0.888888888889 1.0 0.611111111111 0.722222222222 0.777777777778 0.611111111111 0.555555555556 0.222222222222 0.222222222222 0.0555555555556 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.833333333333 0.833333333333 0.166666666667 0.333333333333 0.0 0.166666666667 0.666666666667 0.833333333333 1.0 1.0 0.666666666667 0.833333333333 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 0.5 0.333333333333 0.833333333333 0.833333333333 0.5 0.333333333333 0.666666666667 0.666666666667 0.0 0.0 0.5 0.5 0.0 0.0 0.833333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -12.4719600859 3.96440494611 -20.6641203393 8.94512011072 12.0573919509 -0.476986527418 7.52374851097 9.8688524651 -7.56636480095 1.01822065538 -9.11339825157 9.38257636846 2.71165751897 -1.9636686048 -9.49175014647 1.25907769869 -0.995694316456 0.422077761506 -7.45795997518 -5.32023669464 -0.03199186464 -1.77835138436 -13.6244659647 -15.1111053626 -0.0909478944005 0.165617785224 6 5 10 8 6 5 2 4 3 5 5 4 1 5 6 10 7 8 8 9 7 9 7 9 7 4 1 4 7 3 3 4 5 3 4 6 2 4 6 8 4 0 224.0 1.14285714286 117.0 0.547008547009 0.241908482143 0.246492346939 0.116175971295 0.0840134690176 0.0523173607473 0.0387548021329 0.00686634827721 0.00986682888553 -0.0131575595295 0.5 0.785714285714 0.0 4.0 4.0 0.0 1.0 3.0 3.0 3.0 5.0 13.0 0.142857142857 0.0 2.0 2.0 0.522321428571 0.25 0.9375 1.0 0.6875 0.625 0.5 0.4375 0.6875 0.625 0.0 0.0 0.125 0.6875 0.375 0.25 0.4375 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.75 1.0 0.25 0.75 1.0 0.75 0.5 0.25 0.25 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.89401450008 7.20176117491 -17.3025340573 21.171599425 -8.32859060598 5.81133136934 -47.0536758729 42.1473806824 -0.895669115929 -0.136652353634 -55.3658351199 39.3171671537 0.46731924731 -3.37627317477 -53.9826951195 14.8664385189 -1.6330679041 -0.831617846902 -62.6952559136 4.93343636486 0.604358890186 1.09992459881 -58.5523190395 12.810593958 0.203676725817 -0.115542495082 4 1 8 3 6 4 5 8 1 10 1 7 4 4 6 4 6 4 6 4 6 4 6 4 6 3 7 4 6 5 6 6 1 0 160.0 0.625 75.0 0.613333333333 0.186875 0.21953125 0.0346188964844 0.144295898437 0.0467485351562 0.0061464308728 0.0127654368696 0.00342951994251 0.108216755645 0.4 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 6.0 0.206896551724 1.0 3.0 1.0 0.46875 0.25 0.666666666667 0.333333333333 0.333333333333 0.75 1.0 1.0 1.0 0.666666666667 0.916666666667 0.666666666667 0.583333333333 0.25 0.666666666667 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 -8.91267681315 5.33169059358 -16.1570662384 12.0221949453 6.7653284794 -1.03015523712 -0.751447621243 10.5409573958 -4.09245021271 1.15273679394 -7.11870811767 15.8420946073 2.57623981739 1.28524348836 -1.08973954701 23.5067855044 -0.609460601836 -0.825909431222 1.72009946969 17.5198139265 -0.13396869174 -0.792943572093 -4.51220850897 6.29915056636 -0.120779447311 -0.234685732722 7 3 6 6 5 6 5 6 1 10 1 10 1 9 3 7 4 5 7 4 7 4 6 4 6 4 7 4 2 2 2 10 1 10 1 8 3 7 4 5 7 3 8 2 8 0 231.0 0.52380952381 129.0 0.46511627907 0.240850059032 0.255411255411 0.0418769776166 0.17648572076 0.029280833295 0.00699817616774 -0.00297453143133 -0.00260187121363 0.134470647039 0.636363636364 0.047619047619 1.0 1.0 2.0 2.0 0.0 0.0 1.0 0.0 3.0 6.0 0.166666666667 1.0 4.0 1.0 0.558441558442 0.222222222222 0.333333333333 0.611111111111 0.888888888889 0.333333333333 0.888888888889 0.944444444444 0.833333333333 0.666666666667 1.0 0.722222222222 0.555555555556 0.944444444444 0.666666666667 0.5 0.333333333333 0.0 0.166666666667 0.5 0.166666666667 0.0 0.166666666667 0.666666666667 1.0 0.0 0.333333333333 1.0 0.666666666667 0.166666666667 0.5 1.0 1.0 0.0 0.333333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 0.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.666666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 1.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.333333333333 1.0 0.833333333333 1.0 1.0 0.833333333333 0.5 0.166666666667 0.5 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.0 0.666666666667 0.833333333333 -10.4284381759 8.30637226803 -17.838833172 20.8833104725 9.65962751464 1.01380719176 7.16986199295 22.9162202046 -3.92732310862 -2.31816800671 3.36729093911 12.3290227446 1.76603389401 1.34886715423 1.83259347047 20.2651149364 -1.45435212551 1.34722565164 -0.352337072393 26.4509262084 0.972914798378 -2.17689425033 1.7179677915 14.0991743864 -0.0670257893652 0.273068693463 8 1 2 1 9 9 5 10 4 10 5 7 1 2 4 6 9 7 8 6 9 6 6 9 6 8 7 9 9 5 10 4 11 4 11 4 11 4 11 4 10 5 10 5 9 6 8 8 9 1 1 1 10 0 345.0 0.652173913043 142.0 0.5 0.15729468599 0.175677378702 0.0346098036888 0.117029463424 0.0250700954921 0.00877611537523 0.00437404401048 -0.00120543777228 0.0825983516836 0.4 0.130434782609 3.0 0.0 3.0 0.0 2.0 0.0 0.0 0.0 3.0 9.0 0.205128205128 1.0 2.0 1.0 0.411594202899 0.0416666666667 0.5 0.5 0.416666666667 0.541666666667 1.0 1.0 1.0 0.833333333333 0.75 0.416666666667 0.25 0.666666666667 0.0416666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.666666666667 0.166666666667 0.0 -18.378936037 14.5038591618 -31.4023414187 32.9244710539 17.1277770006 -2.34283610812 12.8274756283 30.0889876783 -7.50172147531 1.7392083171 0.840847021781 30.0435360763 1.87751952174 -1.1706873521 -5.81932075286 27.3658691908 -0.858787895954 0.508219351636 -2.61217302794 24.0934979189 0.615656938266 -1.05402952085 -2.12297418519 18.4743794698 0.0257669162031 0.0511929498985 1 2 4 3 14 12 2 7 3 7 1 4 5 5 3 5 4 3 6 3 4 3 5 3 7 2 3 3 6 3 7 2 3 3 6 3 7 2 3 3 6 3 7 2 3 3 6 3 6 3 3 3 6 3 6 4 2 3 6 2 7 4 1 4 6 4 4 10 5 4 5 5 1 0 312.0 1.84615384615 138.0 0.724637681159 0.193509615385 0.202662721893 0.163744140526 0.0500939570374 0.0559196489531 0.08717931262 0.0116535605597 0.0247881591636 -0.0167811454623 0.25 1.84615384615 2.0 1.0 1.0 2.0 4.0 6.0 6.0 6.0 6.0 2.0 0.176470588235 1.0 6.0 3.0 0.442307692308 0.791666666667 0.583333333333 0.5 0.583333333333 0.666666666667 0.208333333333 0.166666666667 0.208333333333 0.375 0.5 0.5 0.5 0.5 0.208333333333 0.25 0.416666666667 0.833333333333 1.0 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.5 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -7.21502408683 6.15399113289 -20.9616111929 12.2723957099 -7.40291533909 -4.07502968875 -59.0316168979 -2.91406858341 -8.23636296699 -1.95815100191 -83.0651727524 -13.2737445376 10.4673605192 2.34326778932 -33.5539414745 0.175858716565 -1.30549562954 0.321781470698 -17.7015467489 3.79041641806 -0.0301077239981 -1.32187563151 -31.8991874921 -5.96085567868 -0.390549814483 0.140099932581 11 3 20 4 19 4 18 5 18 6 16 7 16 7 15 9 14 2 3 4 13 3 3 5 12 3 4 4 11 5 1 6 11 13 10 4 4 5 9 4 6 5 8 2 9 4 7 4 8 4 6 5 9 4 4 6 8 6 3 7 7 6 1 8 7 8 483.0 1.09523809524 172.0 0.552325581395 0.183904941939 0.202602780243 0.0858055488396 0.0920989717416 0.065882801672 0.0292172232375 0.0178580233984 0.0197644783534 0.0207517042523 0.347826086957 0.571428571429 0.0 2.0 4.0 0.0 0.0 2.0 4.0 5.0 2.0 8.0 0.25 0.0 4.0 4.0 0.356107660455 0.0 0.0 0.0555555555556 0.555555555556 0.111111111111 0.416666666667 0.638888888889 0.5 0.777777777778 0.722222222222 0.444444444444 0.0277777777778 0.0555555555556 0.333333333333 0.638888888889 0.777777777778 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.444444444444 0.777777777778 0.0 0.0 0.0 0.222222222222 0.555555555556 0.888888888889 1.0 0.666666666667 0.0 0.222222222222 0.555555555556 0.777777777778 0.666666666667 0.888888888889 0.666666666667 0.111111111111 0.666666666667 0.888888888889 1.0 0.666666666667 0.0 0.555555555556 0.333333333333 0.0 0.888888888889 1.0 1.0 0.888888888889 0.555555555556 0.777777777778 0.444444444444 0.0 0.222222222222 0.444444444444 0.666666666667 0.888888888889 1.0 1.0 0.888888888889 0.444444444444 1.21788130366 -3.32149446453 1.08807051894 -15.5132205801 -2.28004793299 -10.2394956007 -3.99992625929 -43.983844277 1.49987735994 5.50990331308 -2.09645982833 -25.0612465239 -1.29757157526 -0.220607774526 -3.37268901099 -24.0943366037 1.41000195691 -3.90014676661 0.70283580729 -49.5031071348 -0.925419617448 1.16918677343 -0.0878795694283 -56.3504446756 0.278765912771 -0.88228551633 7 3 6 8 4 8 3 3 4 2 2 4 8 4 8 3 9 3 8 4 7 5 8 4 9 3 9 3 9 3 8 4 8 4 8 4 9 3 9 3 8 4 8 6 5 7 5 0 264.0 0.545454545455 95.0 0.631578947368 0.119949494949 0.166494490358 0.0230290160559 0.155001667415 0.0220974813563 0.00686657028955 0.00875946917277 -0.000568826424729 0.159399838355 0.416666666667 0.0454545454545 3.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 3.0 5.0 0.2 0.0 1.0 2.0 0.359848484848 0.111111111111 0.555555555556 0.5 0.555555555556 0.555555555556 1.0 1.0 1.0 0.666666666667 0.388888888889 0.333333333333 0.444444444444 0.444444444444 0.0 0.0 0.0555555555556 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.166666666667 0.5 0.0 0.166666666667 0.5 0.666666666667 1.0 0.666666666667 0.666666666667 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -14.0924467792 4.60102471847 -24.5161089716 12.3997578314 12.638050406 2.12330152102 8.22707907094 21.3229643769 -5.74101470213 0.992631506003 -3.5902872353 26.7466259071 0.520748491011 0.0968624495767 -10.013381815 25.9013068437 0.733711766836 -1.03742835289 -4.40541130551 15.2343075476 -1.34471869132 -1.2101849977 -13.748121269 0.28972987547 0.110022852359 -0.277054583111 1 5 10 7 9 7 11 4 12 4 12 4 12 4 13 3 13 3 3 3 7 4 2 3 7 4 4 3 5 3 5 3 5 3 6 3 4 3 5 4 4 3 6 3 4 3 6 2 5 3 6 2 5 3 6 2 4 4 6 2 3 5 6 3 1 7 3 6 3 3 6 1 3 0 352.0 0.727272727273 129.0 0.77519379845 0.142933238636 0.1875 0.044098817523 0.127376840134 0.0562885379003 0.0166310467124 0.0214111507877 0.0169952974105 0.0916840135591 0.4375 0.636363636364 3.0 1.0 2.0 1.0 0.0 2.0 5.0 5.0 3.0 6.0 0.181818181818 2.0 0.0 2.0 0.366477272727 0.708333333333 0.333333333333 0.25 0.5 0.833333333333 0.833333333333 0.791666666667 0.791666666667 0.0833333333333 0.166666666667 0.0416666666667 0.0416666666667 0.0 0.333333333333 0.375 0.333333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.333333333333 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -10.9672224422 -5.81638973845 -25.6566497093 -14.5011870565 1.35969260548 -0.024752121127 -21.0461439944 -10.7367879721 0.99906881654 3.60378016894 -17.7996512746 3.34621770707 -2.90566944497 -2.04236592547 -29.6066317055 0.259178067291 1.7302824564 1.76973607346 -24.0259698857 6.84348374407 -0.88065342789 -0.668437308763 -28.6573365662 3.95966999552 -0.233172499489 -0.134815376623 0 5 11 4 11 5 11 3 12 3 12 3 12 3 13 2 13 2 2 4 7 10 5 3 3 5 4 2 6 3 4 3 5 4 2 4 5 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 6 4 2 3 5 4 4 3 4 3 5 9 3 0 315.0 0.714285714286 120.0 0.708333333333 0.170793650794 0.206500377929 0.0555660655797 0.138375713366 0.0694929513252 0.0202654499039 0.0240450990674 0.0198090029243 0.0905510105251 0.666666666667 0.52380952381 1.0 3.0 3.0 1.0 0.0 1.0 5.0 5.0 3.0 11.0 0.265306122449 0.0 2.0 2.0 0.380952380952 0.666666666667 0.333333333333 0.375 0.416666666667 0.541666666667 0.625 0.625 0.625 0.0 0.333333333333 0.0416666666667 0.166666666667 0.0 0.416666666667 0.541666666667 0.541666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.166666666667 0.0 0.0 0.333333333333 0.5 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.833333333333 0.833333333333 0.5 0.166666666667 0.166666666667 0.0 0.0 0.5 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -5.33547999699 -9.64024226728 -13.8277891077 -23.6466415157 -1.12021982621 0.706942850559 -16.2513143491 -13.6545057363 1.5326107937 7.08890915003 -11.0606430195 15.9481737654 -1.05241822619 -3.009261141 -10.9723475945 13.3119443275 1.59029059311 2.04738146358 -3.2351547296 14.0640794201 -0.557781609871 -2.3948017321 -3.94559226645 -0.862781951918 -0.0285339942032 -0.133545660512 4 3 6 4 5 5 4 19 1 5 6 4 7 2 7 3 7 4 7 3 6 4 6 4 6 7 3 7 5 3 3 0 160.0 0.625 77.0 0.636363636364 0.204375 0.21875 0.0395583496094 0.147578125 0.04869140625 0.00702269774222 0.0147072546593 0.00355889413746 0.101617159952 0.6 0.0 0.0 2.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 6.0 0.0833333333333 0.0 5.0 1.0 0.48125 0.25 0.666666666667 0.25 0.25 0.75 1.0 0.916666666667 0.916666666667 1.0 0.833333333333 0.5 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.25 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -7.55985979687 5.49084553667 -13.6418864867 14.9535383755 5.74014683425 2.45260254101 -1.17898646514 23.2111594046 -3.93985225122 -0.603388018198 -8.12965290906 21.2581520286 2.60777552176 -0.114666240315 -0.866071307663 16.3702880109 -0.460330346955 -0.958178749302 2.0706717422 10.0546588687 -0.335576049874 0.110793308931 -4.08163147534 5.85254175734 -0.030314343602 -0.238400420625 3 5 5 7 3 2 3 4 2 2 4 3 8 3 8 3 7 4 7 4 8 3 1 3 4 3 1 3 2 22 1 9 3 4 154.0 0.785714285714 84.0 0.583333333333 0.278630460449 0.290352504638 0.0834605603538 0.155816775567 0.0636427158606 0.0144826938095 0.0057286294128 0.00791487295542 0.0363003027638 0.636363636364 0.428571428571 1.0 2.0 3.0 0.0 1.0 1.0 1.0 2.0 6.0 4.0 0.0344827586207 2.0 2.0 1.0 0.545454545455 0.416666666667 0.166666666667 0.25 1.0 0.583333333333 0.0833333333333 0.0833333333333 0.666666666667 0.583333333333 0.0833333333333 0.166666666667 0.583333333333 0.833333333333 0.75 0.833333333333 0.916666666667 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.25 0.5 0.25 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.181891363534 -3.31951738449 -4.77057668768 -5.66011690639 -6.97590499838 3.69281228745 -23.8674254941 7.93021924422 3.03773160228 1.30502649989 -18.6354882417 15.4251889552 -1.71600434458 -1.28230855355 -21.3421096917 9.24102708499 0.33623421056 -0.020570065111 -22.6126139701 2.31272262125 0.349240041414 -1.49829090245 -16.73939889 -9.56278790165 0.0288391341847 -0.0647824960571 2 1 9 4 6 8 5 4 6 5 6 5 6 4 8 4 5 4 8 4 5 5 7 5 4 5 7 4 5 5 6 5 5 5 6 5 5 4 6 5 6 4 5 4 8 4 17 4 17 4 17 5 16 5 14 7 12 9 12 9 12 10 11 12 11 1 18 0 462.0 0.954545454545 169.0 0.656804733728 0.146464646465 0.164305391578 0.0597643807502 0.0817517471253 0.0288482452001 0.0258196745829 0.00406634716727 0.00316858570263 0.0355194716031 0.380952380952 0.5 3.0 2.0 2.0 1.0 5.0 5.0 0.0 0.0 4.0 8.0 0.14 3.0 1.0 2.0 0.365800865801 0.416666666667 0.333333333333 0.333333333333 0.833333333333 0.472222222222 0.611111111111 0.555555555556 0.75 0.222222222222 0.194444444444 0.0833333333333 0.0555555555556 0.583333333333 0.694444444444 0.0555555555556 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 0.444444444444 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.555555555556 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.555555555556 0.666666666667 0.888888888889 1.0 0.777777777778 0.666666666667 0.777777777778 1.0 0.111111111111 0.0 0.222222222222 0.333333333333 0.111111111111 0.0 0.111111111111 0.333333333333 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.111111111111 0.0 0.0 0.333333333333 0.222222222222 0.0 0.0 0.888888888889 0.555555555556 0.333333333333 0.555555555556 0.888888888889 0.333333333333 0.0 0.0 -16.1469924082 7.89987262983 -32.7669373347 19.5187113809 9.04169873921 1.18182410222 -4.34281852988 27.5852581932 0.197885040714 2.54664832334 1.88175104772 39.4260748236 -3.30788032279 0.700909031324 -13.6533256694 44.6131982546 2.91690904427 -0.81473602173 1.810818686 37.5413603326 0.00602380845051 -0.24043304146 9.33401269818 35.2314469771 -0.00604980573377 0.259126646385 9 1 5 2 6 3 2 4 4 4 2 4 5 4 1 4 5 4 2 4 4 5 1 4 4 5 1 4 5 2 3 3 5 3 3 3 5 3 3 3 5 4 2 4 4 4 2 13 2 3 5 2 2 0 196.0 1.0 99.0 0.69696969697 0.231778425656 0.254737609329 0.0989755544034 0.100013998207 0.059007088883 0.0307900635747 0.00865368041945 0.0107725821604 0.00654889267783 0.357142857143 0.857142857143 0.0 1.0 2.0 1.0 2.0 3.0 3.0 2.0 1.0 9.0 0.243243243243 1.0 1.0 2.0 0.505102040816 0.625 0.875 0.75 0.75 0.125 0.375 0.375 0.5 0.3125 0.25 0.1875 0.4375 0.6875 1.0 0.75 0.9375 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 -1.72796795357 0.181891363534 -9.19683873248 1.34376015267 -6.96476879245 1.45698694259 -29.8061703915 7.18048153829 2.24078266102 0.837677531142 -26.2224338361 12.0722790349 -1.08614465641 -0.102554013046 -28.6326319486 11.7900896579 -0.599764219888 0.0743976620702 -32.4109217314 14.6691857358 1.25815799407 1.32389570413 -22.3330382029 27.3767318857 -0.0459542977096 0.129915026869 1 3 2 8 5 8 5 9 4 10 3 10 3 10 3 10 3 10 3 10 3 2 6 2 3 2 6 3 2 2 3 5 3 10 3 2 1 7 6 7 6 7 8 5 8 5 3 1 5 3 4 2 5 2 12 2 7 1 1 2 0 286.0 0.590909090909 126.0 0.603174603175 0.171866594944 0.253019707565 0.035910120248 0.19764093308 0.0654194453402 0.00911951957544 0.0203703926664 0.0111814016804 0.188881038484 0.769230769231 0.318181818182 2.0 1.0 3.0 3.0 0.0 1.0 2.0 2.0 1.0 10.0 0.2 1.0 2.0 1.0 0.440559440559 0.666666666667 0.5 0.458333333333 0.583333333333 0.5 0.5 0.666666666667 0.875 0.0 0.25 0.458333333333 0.875 0.0 0.333333333333 0.208333333333 0.458333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.333333333333 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.5 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.333333333333 0.666666666667 -11.6327794769 -13.1375171207 -23.3128370475 -28.05121734 6.37779654372 5.65651734257 -7.2486066103 -7.82872199781 -3.06145849719 2.94665814556 -15.1860655518 13.1634969129 -0.582633123958 0.378020379963 -17.8845756211 23.4453669657 2.57310249879 2.11346544229 -5.01246842204 32.2256633069 -2.02582521124 -2.29719621793 -10.0523848148 19.7939476007 0.576155503331 0.197117469311 0 5 1 7 2 8 1 5 2 5 5 3 3 4 5 3 3 3 6 4 2 3 6 4 2 3 6 3 3 3 6 3 4 2 6 2 4 3 6 3 2 4 5 4 2 4 5 4 3 1 1 1 5 1 1 2 1 0 195.0 1.15384615385 97.0 0.60824742268 0.236923076923 0.199211045365 0.117085722956 0.0743505453565 0.0517898143934 0.0406625101142 0.011169399925 0.0127472966322 -0.00925449799021 0.266666666667 1.15384615385 2.0 0.0 0.0 1.0 3.0 3.0 3.0 3.0 5.0 8.0 0.19512195122 0.0 1.0 3.0 0.497435897436 0.8125 0.5 0.4375 0.5625 0.8125 0.5625 0.5 0.4375 0.4375 0.0 0.0 0.0 0.75 0.5 0.5 0.625 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -0.509295817894 8.23361572262 -3.74765660361 22.6747095255 -3.41794082231 4.25318596366 -12.9649393701 37.9337290413 2.11469683754 -0.481890253636 -4.38221041165 34.6292859719 0.689409795246 -1.59340229894 0.8318899246 21.6882534965 -1.31603201256 -0.578433114893 -6.55894132372 12.9971763454 0.616001906241 -0.659556291488 -4.49162361511 3.69407172516 -0.0227376774929 -0.344045899018 7 4 7 7 4 10 1 5 3 4 1 3 6 2 2 3 10 3 9 4 9 4 9 4 10 3 10 3 6 2 3 10 4 8 9 1 5 0 195.0 0.866666666667 80.0 0.8 0.171992110454 0.179829059829 0.0638829380131 0.0957567052715 0.0376046797822 0.0228221720798 0.013540993015 0.00665478999587 0.0411752007944 0.615384615385 0.2 0.0 2.0 3.0 3.0 0.0 2.0 0.0 1.0 2.0 5.0 0.344827586207 1.0 2.0 1.0 0.410256410256 0.25 0.75 0.9375 0.75 0.5625 0.375 0.25 0.4375 0.75 0.0625 0.0 0.25 0.8125 0.375 0.0 0.3125 0.0 0.0 0.25 0.5 0.5 0.5 0.75 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -11.5440385389 4.83831026999 -27.5521207272 16.60055285 0.656425720841 7.58058530723 -24.2389412576 44.1274130219 2.69766659202 0.73974903169 -7.89808816862 47.0242186747 0.364458440092 -3.51592652455 -1.05159558765 22.9621100484 0.447549728975 -0.653675620375 3.26987949217 11.9640938413 0.333269718757 0.105822730232 6.39045493063 7.64206242489 -0.0515718436109 -0.592846425835 1 3 3 1 3 5 4 2 4 2 4 4 4 1 4 3 4 2 11 2 2 10 3 11 2 11 3 9 5 9 5 4 2 3 9 5 7 9 2 5 0 182.0 0.928571428571 81.0 0.83950617284 0.179205409975 0.189167974882 0.06455197984 0.0905535112153 0.0380418699764 0.0214487802662 0.0112224834743 0.00527007296523 0.0309644941969 1.0 0.357142857143 1.0 4.0 5.0 3.0 3.0 1.0 0.0 1.0 4.0 14.0 0.111111111111 1.0 2.0 1.0 0.445054945055 0.5625 0.6875 0.75 0.625 0.625 0.375 0.1875 0.8125 0.5 0.375 0.0 0.5 0.6875 0.375 0.0 0.3125 0.0 0.25 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.25 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.5 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.25 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.0 -9.64024226728 2.4555334077 -23.5130587728 9.46996540042 -0.288613337035 5.54443852771 -24.1477205325 30.3846355298 1.81064670695 1.59073031373 -12.3651273887 39.6776019593 0.824716236069 -1.18341710531 -4.26176467934 32.3804243223 -0.000782241453911 -0.15808587379 -4.82754832412 28.3226900752 -0.858720336128 0.00241836849275 -13.4426610298 26.261556407 -0.118011667169 -0.232442216802 7 3 7 7 4 3 3 3 3 3 5 2 3 3 1 1 1 3 3 10 3 3 11 2 10 3 10 4 10 4 5 3 1 5 2 5 2 10 4 7 3 0 182.0 0.928571428571 84.0 0.761904761905 0.187658495351 0.233516483516 0.067710275475 0.113144779988 0.0512456689549 0.0212791591941 0.0149301527815 0.0107446206031 0.0438477547358 1.07692307692 0.428571428571 1.0 5.0 6.0 2.0 1.0 3.0 0.0 2.0 3.0 8.0 0.361111111111 0.0 3.0 1.0 0.461538461538 0.3125 0.8125 0.75 0.75 0.375 0.4375 0.0625 0.625 0.625 0.5 0.0 0.375 0.4375 0.25 0.0 0.625 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.75 0.5 0.0 0.25 0.75 0.5 0.0 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 -9.82213363081 -1.13682102208 -25.396188121 -1.7189635676 -2.57803167294 2.32862706095 -35.0371223301 11.8605561628 0.500617910483 5.03111009647 -32.407881864 35.1304801709 -0.137095934594 -1.6824608278 -31.7736200558 26.0666461383 -0.308913826313 -2.41601188382 -33.3281942078 5.11033217875 0.157423805656 0.392327669637 -32.5412891372 0.00282581911023 -0.0575012047038 -0.430555491174 1 2 2 7 2 5 3 4 2 5 4 3 3 4 4 3 3 3 5 4 2 3 5 4 2 3 5 4 2 3 6 3 2 3 5 4 2 3 5 4 1 4 5 4 1 5 3 10 10 0 182.0 1.07692307692 97.0 0.60824742268 0.23273155416 0.237109044801 0.104783922152 0.0884483678379 0.0478241267246 0.0329111219409 0.00601067549488 0.0112309977126 -0.00350314923542 0.285714285714 0.923076923077 1.0 1.0 2.0 0.0 3.0 3.0 3.0 3.0 2.0 8.0 0.176470588235 1.0 1.0 2.0 0.532967032967 0.8125 0.75 0.75 0.9375 0.5 0.3125 0.25 0.3125 0.5 0.25 0.1875 0.25 0.75 0.9375 0.9375 0.75 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.00080499887 3.45593590714 -11.7332376912 9.48152178607 -9.73768406917 1.71590373048 -41.3401436251 15.5255529328 2.87875658088 -0.313186852673 -33.2140446241 13.7141103453 1.33353715538 -0.472367667964 -19.3568201627 10.8308420181 -0.579308795932 0.697404390833 -20.1852201122 17.0457243296 0.791108703165 1.01019934399 -12.5115948903 28.7041539788 0.300759193885 0.199407326679 1 0 6 3 11 2 6 1 5 3 4 3 4 3 3 4 4 3 2 5 5 2 2 6 4 1 3 6 7 8 6 8 6 9 4 10 4 11 2 12 2 11 3 11 2 12 2 11 2 11 3 9 5 9 4 11 2 10 0 308.0 0.636363636364 113.0 0.672566371681 0.151901669759 0.124852420307 0.0365371657142 0.0887612450798 0.0263732988634 0.00996105187174 0.00702071521673 0.00143521524529 0.058679993116 0.428571428571 0.318181818182 2.0 3.0 1.0 0.0 5.0 2.0 0.0 0.0 3.0 7.0 0.289473684211 0.0 3.0 2.0 0.366883116883 0.708333333333 0.166666666667 0.0 0.291666666667 0.791666666667 0.833333333333 0.416666666667 0.583333333333 0.333333333333 0.833333333333 0.541666666667 0.0833333333333 0.791666666667 0.291666666667 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.166666666667 0.5 0.5 0.5 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 1.0 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.166666666667 0.833333333333 1.0 0.833333333333 0.5 0.166666666667 -9.23098669933 13.5137015316 -18.9128560125 28.8742466724 3.959741503 -4.51409335587 -11.9020711056 20.6672442038 -3.14132156633 3.45799297218 -15.8758702546 26.731287608 2.26272212468 -1.51198453885 -13.5970136517 23.4986062418 -2.390879847 -0.155572057352 -21.2108656586 16.1335421303 0.909558413531 -0.407577159196 -25.3616502559 13.5697750653 -0.446546736559 -0.0502298744403 2 1 6 1 3 4 1 2 2 10 3 4 1 4 5 3 2 3 5 3 2 3 5 3 1 3 6 2 3 2 7 1 3 2 6 2 3 2 6 2 3 2 6 3 1 4 5 9 2 9 4 5 182.0 0.928571428571 89.0 0.741573033708 0.232882502113 0.235478806907 0.100255483558 0.112908405446 0.0585833982465 0.0352617043094 0.0126285796406 0.01365064764 0.0229877533524 0.538461538462 1.07142857143 3.0 2.0 4294967295.0 2.0 4.0 3.0 3.0 3.0 0.0 8.0 0.264705882353 1.0 0.0 2.0 0.489010989011 0.75 0.625 0.5625 0.6875 0.5 0.4375 0.25 0.4375 0.25 0.0 0.0 0.125 0.75 0.6875 0.4375 0.75 0.5 1.0 0.75 0.25 0.0 0.25 0.25 0.0 0.75 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 1.04587534032 -4.13733791067 3.71056520596 -1.39295375849 1.93329175042 -7.57534213077 11.5358991698 1.2151058983 0.969349435406 -3.1642118428 16.2417471596 -0.552111195058 -0.841975233064 -7.82672925958 9.49800496073 -1.73790469822 -1.22273025654 -20.5364074416 -1.83971638796 0.552635958201 -0.194952575753 -17.833249726 -5.66712453578 0.133526866633 0.00716730488452 1 4 3 5 2 4 3 4 37 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 3 4 2 13 2 2 3 0 154.0 0.318181818182 67.0 0.746268656716 0.179962894249 0.232880755608 0.0184521162764 0.356411529944 0.0592032777477 0.0024542544967 0.0292022091598 0.00613080172223 0.565663305288 1.0 195225785.955 1.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 1.0 3.0 0.142857142857 2.0 7.0 1.0 0.435064935065 0.333333333333 0.25 0.0833333333333 0.25 0.666666666667 0.333333333333 0.583333333333 0.666666666667 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -3.93546768373 -3.73290684706 -6.60197736988 -3.18192345508 3.19744791756 8.73409085709 -2.08943641901 27.0203915257 -3.54118290745 1.34770318872 -7.24180396846 39.1819704385 3.74353797443 -1.23485528649 1.84221016109 31.0094282822 -2.87379618971 -0.022577016841 -4.98742565524 26.5243411921 1.54519846966 -0.576744330777 -5.88132580833 21.6789005885 -0.440381498418 -0.00394164096994 1 5 9 6 9 7 10 5 11 3 11 4 11 4 11 4 11 4 2 2 7 11 4 5 4 2 4 4 5 3 3 4 5 3 4 3 5 3 4 2 7 2 4 2 7 2 3 3 6 3 3 3 6 3 3 3 7 2 3 4 5 3 2 6 3 5 1 6 5 1 5 3 9 0 345.0 0.652173913043 135.0 0.762962962963 0.152270531401 0.194706994329 0.0412027920087 0.13889592066 0.0553256075176 0.0144992853774 0.0195290679585 0.014944015977 0.107282756277 0.6 0.565217391304 3.0 1.0 0.0 2.0 0.0 1.0 5.0 5.0 1.0 3.0 0.295454545455 0.0 1.0 2.0 0.391304347826 0.666666666667 0.5 0.375 0.5 0.833333333333 0.833333333333 0.708333333333 0.625 0.0833333333333 0.291666666667 0.0416666666667 0.0416666666667 0.0 0.291666666667 0.416666666667 0.458333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.333333333333 0.5 0.5 0.5 0.166666666667 0.166666666667 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.833333333333 0.5 0.5 0.833333333333 0.666666666667 0.333333333333 0.0 0.166666666667 0.333333333333 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 -11.9573800723 -3.87507687528 -26.6690443805 -10.8806249259 3.13438570263 -1.12809421322 -17.5081352949 -7.68654996243 0.300419459953 5.74026153537 -13.7558571353 12.5997376457 -1.92208399077 -3.57054007556 -23.389454204 2.01856722829 1.0382855152 1.07772408706 -16.7144669294 1.89544234228 0.731846734941 0.0994910295262 -9.92088602155 4.1217683235 -0.247136491977 -0.191502425318 1 4 2 6 2 5 3 4 3 4 3 4 4 2 4 3 5 2 5 2 4 3 4 3 4 4 2 5 2 4 4 3 3 4 3 4 3 5 1 6 1 3 1 3 147.0 0.333333333333 83.0 0.602409638554 0.239067055394 0.279883381924 0.0218578615675 0.350122445202 0.0491981326753 0.00169394354937 0.00868924384968 0.00125589762223 0.544471996758 1.0 0.047619047619 1.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 3.0 0.259259259259 0.0 5.0 1.0 0.56462585034 0.333333333333 0.0 0.166666666667 0.583333333333 0.75 0.25 0.666666666667 0.916666666667 1.0 0.75 1.0 0.916666666667 1.0 1.0 1.0 0.916666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.60791454285 -0.303152272556 -8.31870709518 2.11193339107 3.28146868089 4.08740002861 -2.46513293805 15.7321384742 -2.92956694282 0.554395752848 -7.32510270363 25.2362211987 2.34590268066 2.06438157919 -2.86721378544 35.1654118721 -1.71056038917 -0.629271375274 -5.5221836724 34.1064871248 1.17953055695 -0.145362544445 -4.3260368295 28.1335180419 -0.284503298906 -0.214924570074 2 2 5 3 5 4 3 13 4 3 5 2 6 2 6 3 5 2 6 3 5 3 5 3 5 6 2 6 4 4 1 0 128.0 0.5 59.0 0.745762711864 0.154296875 0.22412109375 0.0234966278076 0.201968669891 0.046534538269 0.00490748947856 0.0205578300038 0.00621980799811 0.229369129839 0.625 0.0 0.0 2.0 2.0 1.0 0.0 0.0 0.0 0.0 1.0 5.0 0.0909090909091 0.0 3.0 1.0 0.4609375 0.5 0.75 0.5 0.5 0.875 1.0 1.0 1.0 1.0 0.875 0.625 0.875 0.75 0.625 0.125 0.375 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -7.95774715459 1.43239448783 -14.5671486113 5.18423378549 6.09389356323 2.55145268144 0.644679543414 13.8874991368 -2.99728857427 -0.0174269999943 -4.87354674141 15.4332461853 0.903835517773 -0.0212997172537 -3.6726984095 14.4589285369 0.642092658282 0.0356448825336 1.31050626284 13.8510024128 -1.13176993571 -0.292651847158 -6.74607051639 10.6371550755 0.113060009396 -0.0805010766912 4 5 4 3 2 3 2 3 3 3 2 3 4 2 2 3 3 2 4 3 1 3 4 8 5 1 1 4 2 2 5 7 4 7 4 3 1 3 2 4 3 7 5 2 6 0 154.0 0.785714285714 81.0 0.814814814815 0.247343565525 0.243970315399 0.072313775784 0.118966208357 0.0523220665319 0.0160204303412 0.00722661124799 0.00612365367077 0.0272763975622 1.09090909091 0.714285714286 1.0 2.0 4.0 1.0 2.0 3.0 3.0 2.0 1.0 9.0 0.411764705882 0.0 3.0 3.0 0.525974025974 0.416666666667 0.5 0.5 0.75 0.666666666667 0.833333333333 0.583333333333 0.75 0.333333333333 0.416666666667 0.416666666667 0.333333333333 0.666666666667 0.75 0.666666666667 0.666666666667 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.25 0.25 0.75 1.0 1.0 0.75 0.5 0.25 0.5 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.25 0.75 0.75 0.5 0.5 0.75 1.0 0.75 0.25 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.25 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.75 0.5 0.25 0.25 0.75 1.0 1.0 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.75 -5.27484954247 1.72796795357 -14.8640189527 5.00788524243 -2.58267175874 2.1330474443 -19.8849322938 17.7590425861 3.72448324046 3.83664547783 -4.16693702316 30.7509124718 -0.393084429264 -3.32178170916 -0.794064111429 18.2509150445 -0.186089121708 1.21891061526 -2.723717788 18.9058576631 0.569798145369 -0.0710856572135 2.02946297882 20.3502921635 -0.0499818222991 -0.351903204452 6 5 5 8 4 8 3 3 1 4 4 3 9 2 9 3 9 3 9 3 7 5 8 4 9 3 9 3 9 3 9 3 9 3 9 3 9 3 9 3 8 5 6 7 7 5 5 0 264.0 0.545454545455 92.0 0.619565217391 0.126262626263 0.155475206612 0.0249933912124 0.14844940234 0.0226816199182 0.00715792492877 0.00990149140523 -0.000609828300525 0.147177142609 0.333333333333 0.0454545454545 2.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 4.0 8.0 0.161290322581 0.0 2.0 2.0 0.348484848485 0.0 0.444444444444 0.388888888889 0.5 0.444444444444 0.944444444444 1.0 1.0 0.666666666667 0.333333333333 0.333333333333 0.5 0.611111111111 0.0 0.0 0.0555555555556 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 0.666666666667 0.5 0.5 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -12.3562110364 4.42740114419 -21.2900396565 12.1157047656 11.1701420052 2.34499443199 6.39909805587 21.9455760245 -5.96245265053 1.17151442426 -6.35895333935 28.5686805341 1.6258246932 0.274878925542 -5.85673636292 30.0745093169 0.867168389986 -0.31599068852 2.55543155487 27.0299331537 -1.30639708651 -0.213208346925 -4.74362013963 23.1322839887 0.326517812438 -0.157566289703 2 2 5 3 5 3 4 7 1 12 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 4 7 5 1 2 0 128.0 0.5 60.0 0.7 0.1533203125 0.212890625 0.0235857963562 0.175712585449 0.0404796600342 0.00523759215717 0.0152084900876 0.00514028496213 0.186536145781 0.5 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 6.0 0.222222222222 0.0 3.0 1.0 0.46875 0.5 0.875 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.625 0.75 0.5 0.5 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -8.3954232481 3.93908484152 -15.0503462911 9.85450778377 6.74263646603 0.610819264015 1.21605801883 12.8567480638 -3.66409474713 0.358521182993 -5.29304255196 14.7267281828 1.60689616399 0.383470592857 -2.69658440727 15.8269298393 -0.0547700718091 -0.688732745843 -0.101934523112 10.0599827853 -0.741325871281 -0.362193936995 -6.86105860353 6.96179328866 0.116009928976 0.218178864662 1 5 1 14 1 6 1 6 3 4 2 4 2 4 3 3 3 4 3 0 70.0 0.7 50.0 0.34 0.312244897959 0.278571428571 0.0576705539359 0.121997084548 0.0264868804665 0.00568614205598 -0.00665893170163 -0.00424756669388 0.0128260325553 0.428571428571 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 1.0 0.176470588235 0.0 2.0 1.0 0.714285714286 0.833333333333 0.666666666667 0.166666666667 0.333333333333 1.0 1.0 0.5 0.833333333333 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.43774677078 5.5385920196 -7.54889383046 13.1853996868 1.13445643436 -0.0706647947328 -3.6331113689 14.6563243727 0.592438360165 0.767954431407 0.542155017776 17.6038975956 -0.217683855104 0.507104890947 -0.190210264474 20.5263501178 0.0122787834877 -0.385528712838 -0.105684246732 18.0772408664 0.248744965859 0.0114629218017 2.93627259716 16.7509332213 0.0890079002281 -0.0239290586942 4 1 7 2 6 3 5 5 4 5 3 8 2 4 5 4 6 2 7 3 5 4 5 4 5 4 5 4 5 6 4 7 3 6 153.0 0.529411764706 72.0 0.666666666667 0.17501815541 0.248750480584 0.0279971643776 0.202357788203 0.0559130796294 0.00535316568873 0.0205662300965 0.00796353906178 0.214075157342 0.555555555556 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 5.0 0.222222222222 1.0 3.0 1.0 0.470588235294 0.333333333333 0.666666666667 0.533333333333 0.466666666667 0.8 0.933333333333 0.933333333333 0.933333333333 0.466666666667 0.466666666667 0.266666666667 0.733333333333 0.0 0.133333333333 0.0 0.466666666667 0.0 0.333333333333 0.666666666667 0.333333333333 0.166666666667 0.5 0.5 0.166666666667 0.166666666667 0.833333333333 1.0 0.833333333333 0.666666666667 1.0 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.5 0.833333333333 0.833333333333 0.333333333333 0.333333333333 0.5 0.666666666667 1.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.833333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 -8.83778036934 -0.599171550464 -14.9695565759 -1.20158463986 8.33035048361 0.598134921484 6.05367869951 2.78510147064 -3.96626622746 2.02561607042 -0.362964376337 14.1368355898 1.40945239847 0.591849006204 -1.81401488681 16.8712114741 -0.782946307854 -1.55115323096 -2.15227150546 6.26338844978 0.20500939774 -0.0260211716523 -3.18404146146 0.573844758159 0.0745096798831 -0.189464406859 3 2 5 3 5 3 3 16 1 5 3 4 4 3 5 3 5 3 5 3 5 3 5 3 5 4 4 7 2 6 128.0 0.5 68.0 0.544117647059 0.2021484375 0.25634765625 0.0308985710144 0.207866191864 0.047483921051 0.00575931350691 0.0146480364427 0.00425821003326 0.221228792687 0.5 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 6.0 0.115384615385 0.0 2.0 1.0 0.53125 0.25 0.75 0.5 0.5 0.5 1.0 1.0 1.0 0.875 1.0 1.0 1.0 1.0 1.0 0.625 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -7.71901473996 2.86478897565 -13.4077504932 6.14017949808 6.71124066671 -0.779610541552 2.46132429251 6.37109733817 -3.99543602712 2.18822504276 -5.57924801173 16.6072842565 1.74215476061 0.892865930402 -2.4622287027 23.4897587942 0.0182394373594 -0.749842696475 0.603171410045 17.5446428858 -0.932204132087 -0.554591503281 -8.13203475145 9.35658691861 0.0658230131699 -0.147470573758 2 1 4 4 3 4 1 7 2 6 3 4 2 4 4 4 2 4 5 3 2 3 6 3 2 3 6 3 2 3 7 2 2 3 6 3 2 2 7 3 2 3 6 3 1 5 4 4 1 5 3 6 1 1 12 0 196.0 1.0 96.0 0.75 0.217565597668 0.211734693878 0.09612106244 0.0873268950437 0.0482434774201 0.0328960930734 0.00944421219505 0.0128381958946 0.00859610453704 0.428571428571 0.928571428571 1.0 2.0 2.0 1.0 3.0 3.0 3.0 3.0 1.0 11.0 0.236842105263 1.0 1.0 2.0 0.489795918367 0.75 0.75 0.6875 0.8125 0.5 0.375 0.1875 0.3125 0.5625 0.0625 0.0 0.1875 0.8125 0.8125 0.6875 0.875 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.59195193035 5.41126806512 -11.8545231088 15.7335740515 -8.23104820848 4.19324554146 -39.1276576855 31.79923638 0.869391097181 0.96090495272 -37.4833207904 37.3489418243 2.03592321096 -0.559150969553 -24.2321656896 33.1822205313 -1.4849079418 -0.179562769036 -31.6338032381 30.135746137 -0.183327329537 0.057320121499 -35.9868483535 30.0993478665 0.0722496415457 0.0222664534842 1 3 2 4 1 4 2 2 26 4 1 5 1 4 1 4 1 3 3 2 2 3 3 2 3 2 3 2 2 4 1 4 105.0 0.238095238095 52.0 0.692307692308 0.226666666667 0.256689342404 0.0177898715042 0.474103444552 0.0608193499622 0.001764124407 0.0258405834532 0.00307930176219 0.920956805608 1.4 204522251.952 0.0 3.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 1.0 4.0 0.166666666667 0.0 5.0 1.0 0.495238095238 0.25 0.333333333333 0.5 0.25 0.583333333333 0.333333333333 0.916666666667 0.75 0.666666666667 0.333333333333 1.0 1.0 0.5 0.25 0.75 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -2.06143545338 -1.6370222718 -2.86427005444 -0.129461885235 2.36087565729 5.54583055345 0.638247343087 17.979457983 -2.67706584223 0.00338659626058 -4.07176286108 23.0425670946 2.62664075214 0.0872247577923 2.29752272303 21.3285648465 -1.97474450484 -0.387328029171 -2.61906643732 15.4800323879 1.16329196634 -1.34234959093 -0.0688619386476 1.91312163787 -0.141261389036 -0.134811355036 4 3 4 3 6 3 5 4 5 4 4 5 5 4 5 4 6 3 6 4 6 5 5 3 1 1 108.0 0.75 46.0 0.739130434783 0.158436213992 0.206790123457 0.0363860945994 0.121310267744 0.0510846923741 0.00816194172818 0.0203346635748 0.00955852538138 0.0776345520053 0.222222222222 0.0833333333333 0.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 2.0 6.0 0.277777777778 1.0 2.0 1.0 0.425925925926 0.222222222222 0.555555555556 0.777777777778 0.555555555556 0.777777777778 1.0 1.0 1.0 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.5 0.25 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -7.74554056381 0.636619772368 -14.6918092535 3.1575459088 5.40021563852 2.42269191151 -0.0229953107481 11.437803979 -1.52725091578 -0.0570428017486 0.0430482004676 11.4563765361 0.310704271672 -0.959581030216 -2.26103592719 4.79457122421 -0.148106420762 -0.00989096062151 -0.843921200831 3.29671016356 0.286401052126 0.169334257697 -0.120926334224 4.86411052456 -0.0770894131003 -0.024792024984 3 11 2 12 1 3 1 1 1 6 2 3 4 4 2 4 5 3 3 3 5 3 3 3 5 3 3 4 3 3 4 5 1 4 4 11 3 9 1 1 3 8 6 10 5 11 3 11 2 3 3 1 2 7 8 2 1 4 7 2 1 5 5 2 2 8 1 2 4 9 6 1 1 5 5 0 308.0 0.636363636364 187.0 0.513368983957 0.25974025974 0.279811097993 0.0538167558534 0.159096385146 0.0396404805348 0.00908919108797 0.0021742531478 0.000104454656006 0.0804999615935 1.5 0.727272727273 2.0 5.0 6.0 5.0 4.0 4.0 2.0 4.0 11.0 21.0 0.138888888889 1.0 4.0 5.0 0.607142857143 0.666666666667 0.75 0.666666666667 0.875 0.541666666667 0.625 0.875 0.5 0.625 0.625 0.833333333333 0.333333333333 0.875 0.625 0.625 0.5 0.166666666667 0.666666666667 0.666666666667 0.5 0.5 0.5 0.166666666667 0.5 0.5 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.5 0.833333333333 0.166666666667 0.0 0.5 1.0 1.0 1.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.166666666667 0.833333333333 1.0 1.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.166666666667 0.833333333333 1.0 1.0 0.5 1.0 0.5 0.0 0.5 1.0 1.0 1.0 0.5 -16.2916787201 3.21203612422 -35.9873054603 9.06225558545 4.3921263822 2.79053261227 -25.1822682788 24.9679032988 -0.769264538538 5.3904392051 -20.7832254203 51.8766862462 -0.103019250661 0.0560928515665 -24.536133503 53.3133923107 -0.574658143738 -2.32837687486 -27.0665451747 34.7344617789 -0.0214642348515 -0.0711343735196 -31.269560696 24.0576536653 -0.245775453818 -0.532091441805 4 4 14 6 13 6 14 5 14 4 15 5 14 4 15 4 16 3 2 5 9 3 2 6 8 4 4 3 8 3 5 4 6 4 5 4 6 4 6 2 7 4 6 3 6 4 6 3 6 4 6 3 6 4 6 3 2 2 2 4 6 3 2 9 4 5 1 10 2 7 2 8 2 7 3 5 4 3 3 1 437.0 0.826086956522 175.0 0.617142857143 0.179212332892 0.22952940006 0.059995648113 0.135529538844 0.0674328598482 0.0199658706569 0.019719822685 0.017771672243 0.0741482474543 0.421052631579 0.739130434783 1.0 1.0 1.0 1.0 0.0 2.0 5.0 6.0 2.0 6.0 0.25 1.0 0.0 2.0 0.400457665904 0.266666666667 0.1 0.133333333333 0.533333333333 0.933333333333 0.766666666667 0.766666666667 0.866666666667 0.133333333333 0.266666666667 0.0333333333333 0.133333333333 0.0 0.333333333333 0.633333333333 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.444444444444 0.333333333333 0.222222222222 0.0 0.111111111111 0.333333333333 0.333333333333 1.0 1.0 1.0 0.888888888889 0.666666666667 0.777777777778 1.0 1.0 0.888888888889 0.888888888889 0.777777777778 0.666666666667 0.777777777778 0.777777777778 0.666666666667 0.666666666667 0.222222222222 0.222222222222 0.111111111111 0.111111111111 0.333333333333 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.888888888889 0.666666666667 0.444444444444 0.333333333333 0.0 0.0 0.0 0.111111111111 0.555555555556 0.888888888889 0.888888888889 1.0 -9.13410977745 -13.3966943403 -21.1251175853 -34.6654532065 1.12704774363 -2.45711058686 -19.2919878786 -37.1394165177 -0.387509270091 6.16064953466 -18.7867615092 -12.9231484541 -0.711184852779 -3.35189276714 -23.9257595084 -22.1676934913 -0.117912766002 0.495674725348 -23.4235057221 -23.6735600305 0.776614807459 0.823519786571 -16.9515893506 -18.0842661092 -0.0332237495374 -0.446742588124 3 1 1 2 1 1 6 10 3 4 2 5 3 4 3 5 2 3 4 5 9 5 9 5 5 9 4 10 3 11 2 5 2 6 1 28 1 5 3 4 4 1 6 1 3 0 210.0 0.933333333333 130.0 0.476923076923 0.280612244898 0.305079365079 0.0827648202138 0.110142425224 0.055615484289 0.0126734281062 0.00155468118315 0.00417279376868 -0.0159902784372 0.642857142857 0.533333333333 3.0 4.0 0.0 0.0 3.0 2.0 0.0 1.0 3.0 14.0 0.166666666667 0.0 3.0 2.0 0.619047619048 0.75 0.4375 0.375 0.9375 0.625 0.0625 0.75 0.875 0.8125 0.75 0.9375 0.9375 0.4375 0.75 0.75 0.9375 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.75 0.75 0.75 0.5 0.25 0.0 0.0 0.5 1.0 0.75 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -3.31042281631 0.0848826363157 -10.7461125004 2.79122997139 -4.04607233105 4.06418062679 -24.5512150085 18.2952160927 -0.0018359799855 1.69397238287 -28.7298796306 29.3314755468 -1.33340968552 0.136434942275 -37.3866531415 32.2512233835 -1.18188808536 0.667663710999 -47.5179281769 36.2861820032 -0.0605518518277 -0.128232670081 -53.2299738919 34.8601774226 -0.451256151155 -0.156925485579 1 4 1 5 4 3 5 4 4 5 3 5 3 5 3 5 3 5 3 5 3 5 3 4 4 5 3 5 3 4 4 4 4 4 4 4 4 4 4 3 6 1 8 1 6 1 0 176.0 0.363636363636 85.0 0.623529411765 0.219460227273 0.261363636364 0.0236471564496 0.321184142562 0.0604096720041 0.00214251514673 0.0170365056995 0.00359687478509 0.459444050452 0.375 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.206896551724 0.0 9.0 1.0 0.482954545455 0.0833333333333 0.0 0.0 0.25 0.333333333333 0.0 0.25 0.666666666667 0.666666666667 0.5 0.75 1.0 0.916666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.22484030753 -2.66222813899 -7.92408436971 -4.06418691499 2.61894182089 3.73458090357 -3.48911211168 10.431170614 -2.32798408101 2.32783979987 -6.16127078461 26.0549567232 2.45341048206 0.774094575483 0.471462638652 31.7914686574 -1.46504653359 -0.573315741148 -0.498861849002 24.9175971617 1.19594180051 -1.39962793407 1.26216857002 9.74217167223 -0.308294602221 -0.194558306925 3 1 8 1 7 3 4 7 2 8 1 8 1 6 4 3 6 3 6 3 7 2 7 2 6 3 6 4 5 8 1 8 1 7 1 0 153.0 0.529411764706 77.0 0.571428571429 0.182280319535 0.262206843522 0.0308098918437 0.208123963271 0.0534052457898 0.00639572327715 0.0170536298188 0.00725528045272 0.227295904109 0.555555555556 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 5.0 0.304347826087 0.0 5.0 1.0 0.503267973856 0.466666666667 0.866666666667 0.533333333333 0.666666666667 0.733333333333 0.866666666667 0.666666666667 0.933333333333 0.466666666667 0.533333333333 0.0 0.666666666667 0.2 0.266666666667 0.0 0.533333333333 0.0 0.666666666667 1.0 0.666666666667 0.333333333333 0.166666666667 0.5 0.5 0.166666666667 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 0.666666666667 0.5 0.5 0.833333333333 1.0 0.166666666667 0.833333333333 1.0 0.333333333333 0.0 0.0 0.5 1.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 1.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.833333333333 -9.88633058265 0.149792887616 -18.6738827273 -1.05784547543 6.83242160745 -1.68970523747 -1.38164350248 -3.73866083927 -2.91185493542 2.61616996993 -4.44943428412 7.67635551299 1.45242737878 0.299599216991 -0.68516113699 10.977761857 0.352107222266 -1.18308801315 3.66450815099 2.85516401239 -0.83758514313 0.291789411152 -1.11641999225 1.72626559687 0.265104373084 -0.107863253545 2 2 3 4 1 5 2 4 32 4 1 5 2 4 2 4 3 3 3 2 4 2 4 2 4 2 4 3 2 3 3 5 1 1 1 1 2 0 132.0 0.272727272727 56.0 0.928571428571 0.174242424242 0.21349862259 0.0153654311712 0.367761638423 0.0527329075883 0.00185566610829 0.0270849473107 0.00431938773625 0.625312905766 1.33333333333 195225786.0 1.0 2.0 1.0 3.0 4294967295.0 4294967292.0 0.0 0.0 1.0 1.0 0.3 0.0 3.0 1.0 0.424242424242 0.333333333333 0.25 0.333333333333 0.166666666667 0.583333333333 0.333333333333 0.75 0.666666666667 0.666666666667 0.333333333333 1.0 1.0 0.583333333333 0.333333333333 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.2409733866 0.0578745247607 -5.37254465991 3.86726670753 2.67944700586 5.73651332824 -1.7797248274 24.5416969299 -3.09183807684 0.988873278804 -6.32125729118 30.4405632097 3.32245867933 -1.91101183886 1.74321361118 19.3297243123 -2.60056650598 0.198989142014 -4.00016742773 14.3133558715 1.81145362335 -0.95094594293 0.122255348049 7.18397678097 -0.306925848406 -0.0164692092848 2 2 4 3 3 4 3 5 2 11 3 4 3 4 3 4 3 3 4 4 3 4 3 4 3 5 3 6 2 5 2 4 1 0 119.0 0.411764705882 72.0 0.388888888889 0.189675870348 0.299060800791 0.022612703015 0.259103146943 0.0464460623597 0.00362493979676 0.0141099795493 0.00520399693862 0.377548604659 0.571428571429 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 2.0 4.0 0.2 0.0 4.0 1.0 0.605042016807 0.7 1.0 1.0 0.5 0.9 1.0 1.0 0.8 1.0 1.0 0.9 1.0 0.7 0.6 0.4 0.9 0.333333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 -9.28715903219 1.27323954474 -15.7986017053 4.40930466313 8.54804256942 2.09658211213 4.7233534275 12.4147183648 -4.98809006524 0.678395651242 -5.9819913388 16.5345745696 1.72664470646 -0.281480656213 -4.46491876964 14.0321178305 0.341835268847 -0.597613436421 2.72379672239 6.9388189442 -0.413689716145 -0.837651926385 -1.38180608474 -2.49435473393 0.0481196837033 -0.108291122554 3 2 4 3 3 4 2 5 2 11 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 5 5 2 5 112.0 0.4375 59.0 0.576271186441 0.192602040816 0.249441964286 0.0245073057125 0.230308599444 0.0483377084093 0.00389540381931 0.0187478436817 0.00461448589338 0.282172001976 0.428571428571 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 6.0 0.166666666667 0.0 3.0 1.0 0.526785714286 0.375 0.875 0.5 0.5 0.625 1.0 1.0 1.0 0.875 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -6.68450760986 2.98415518297 -11.203598918 7.4177846526 6.23315413843 0.456482488145 3.07546510786 10.1942605156 -3.91282777297 0.776044272113 -3.81227092142 14.3083735492 2.33056127113 0.451372161953 0.391802504062 15.6051162685 -1.00567784476 -1.19754103328 -0.140463168167 4.98896785016 0.11946900502 -0.948258524655 -2.70906750949 -5.64980191789 0.077498935487 0.0297951231799 5 5 7 8 5 3 4 3 4 2 6 3 3 2 6 3 2 2 8 6 8 6 8 6 8 3 1 2 8 3 1 3 6 3 3 3 4 3 4 4 1 5 7 3 11 2 7 0 210.0 0.933333333333 83.0 0.867469879518 0.191496598639 0.175238095238 0.0852068891048 0.0827897635245 0.0497985098801 0.0324884787066 0.0128194064525 0.0137323963884 0.0193330420018 0.571428571429 0.733333333333 0.0 3.0 3.0 1.0 1.0 3.0 3.0 2.0 2.0 11.0 0.27027027027 0.0 2.0 2.0 0.395238095238 0.3125 0.5625 0.6875 0.5625 0.5625 0.125 0.0 0.375 0.5625 0.0 0.0 0.25 0.5625 0.625 0.5 0.6875 0.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.419155135 4.15924917947 -11.0522309661 15.2568422518 -7.70904103019 8.05705983908 -36.790128066 44.9508165172 0.759856785093 1.65735338481 -34.5824883928 55.8311591326 2.41893682943 -1.20521629066 -20.2359552796 49.5485016397 -2.05590984043 0.946835935263 -33.5414708905 54.4028453607 -1.3568725129 0.601258267998 -51.9669613932 61.0480402786 -0.310210287995 -0.0155776975459 1 1 4 2 5 2 5 2 5 37 5 2 5 2 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 6 1 13 5 2 5 1 2 0 168.0 0.291666666667 76.0 0.618421052632 0.146258503401 0.230902777778 0.0132477594212 0.36202197893 0.0461604780801 0.00192247805916 0.0246378692372 0.00532598312854 0.625299408736 1.0 178956970.458 2.0 1.0 1.0 0.0 4294967294.0 4294967293.0 0.0 0.0 2.0 6.0 0.181818181818 1.0 6.0 1.0 0.452380952381 0.583333333333 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 0.583333333333 0.666666666667 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -6.47230101907 -2.25469502714 -10.0236640124 0.529971628359 6.48280082434 9.31982057816 1.13171029539 34.6495296095 -6.36921731314 2.10601030745 -10.4532932153 44.3168771342 5.45632018472 -4.94555059754 1.50602519391 16.1812144223 -3.89831403058 0.697190220337 -7.02953130508 13.0374206284 2.13841479685 0.80683200753 -4.44957931552 23.0261080419 -0.257283661053 -0.0160836015436 3 1 4 1 2 5 1 27 1 5 7 4 7 4 7 4 7 4 7 4 7 4 6 6 5 7 4 7 3 0 154.0 0.785714285714 83.0 0.457831325301 0.204840613932 0.234693877551 0.0493811509792 0.122593547454 0.0339794713635 0.0115143022591 0.00573219455576 -0.00208146008847 0.0595008954859 0.272727272727 0.142857142857 1.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 1.0 4.0 0.125 0.0 1.0 1.0 0.538961038961 0.75 0.583333333333 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 0.666666666667 0.75 0.666666666667 0.833333333333 0.833333333333 0.25 0.0 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -10.6406447667 4.77464829276 -20.712687175 13.2051957929 6.50215223775 2.57037553136 -4.63819810663 22.6241772357 -2.99011390541 -0.00995014318164 -9.35685491551 22.8004811481 0.50370456523 -0.37563113713 -11.9752007078 19.435111279 0.334153557965 -0.0756489001037 -4.99095450815 16.4211199149 0.614316808667 -0.706229036091 -1.37357929597 8.12911512252 -0.13646225029 -0.237816749956 1 5 6 5 8 3 3 3 3 3 3 3 3 3 2 9 3 9 3 9 4 7 5 6 6 7 5 8 4 8 4 8 3 10 2 10 2 10 3 9 3 9 3 8 5 6 6 7 2 8 0 264.0 0.545454545455 91.0 0.725274725275 0.128156565657 0.146349862259 0.0252470903943 0.131560743454 0.0251349149206 0.00724067530794 0.0110104022349 0.000147577844613 0.120997560136 0.416666666667 0.0909090909091 2.0 2.0 1.0 0.0 2.0 0.0 0.0 0.0 2.0 6.0 0.266666666667 0.0 1.0 1.0 0.344696969697 0.0555555555556 0.555555555556 0.277777777778 0.166666666667 0.555555555556 1.0 0.888888888889 0.777777777778 0.611111111111 0.555555555556 0.5 0.722222222222 0.333333333333 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 0.666666666667 0.333333333333 0.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.833333333333 1.0 1.0 0.666666666667 0.666666666667 0.833333333333 0.333333333333 0.0 0.333333333333 0.5 0.5 0.166666666667 0.166666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -11.5459676898 6.16363688701 -18.5884934052 16.1773250139 11.9674712017 2.51574819512 10.2470942855 28.9310093251 -6.94357625337 2.69819465987 -3.91587479999 40.314592053 2.84009733034 -0.908188966499 -1.403839419 36.4212500204 -0.457285499119 -0.632502121006 3.59773939681 26.8098819613 -0.155552486683 -0.730191716486 -0.151847293151 19.240336418 0.136113263132 -0.0424669089947 6 1 5 8 2 2 4 3 2 2 5 2 2 2 5 2 9 2 9 2 5 1 4 2 2 3 3 3 2 3 3 2 2 3 4 3 1 3 2 12 1 4 143.0 0.846153846154 65.0 0.892307692308 0.204068658614 0.247982786444 0.0743524654718 0.138336307929 0.0624562488223 0.0215286661495 0.0150623937696 0.0147613505983 0.0634774662774 0.909090909091 0.692307692308 2.0 3.0 2.0 1.0 1.0 2.0 2.0 3.0 4.0 3.0 0.233333333333 1.0 2.0 1.0 0.454545454545 0.5 0.333333333333 0.333333333333 0.916666666667 0.25 0.0 0.416666666667 0.583333333333 0.416666666667 0.0 0.0 0.333333333333 0.75 0.666666666667 0.583333333333 0.75 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.5 0.75 0.5 0.5 0.25 0.0 0.0 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.5 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.25 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.75 -1.07735653785 -3.03618660668 -5.51689775944 -6.00402956354 -3.79827581984 2.15007679152 -15.2206669183 2.52685973454 2.30798821941 1.57124425508 -10.0734079532 11.5592116324 -1.56115730141 -0.516745859561 -14.1850466244 8.76140998206 0.255924520308 -0.758629597616 -15.9754380206 -0.386533087263 -0.150778981641 -1.15670657332 -17.9852648045 -15.5602607565 -0.236656017208 -0.44888035158 4 1 1 3 8 6 5 3 4 4 2 4 2 5 1 12 1 3 1 2 1 2 3 4 2 1 6 4 9 4 10 3 8 1 1 4 5 3 2 4 2 1 1 3 3 9 6 5 10 1 5 0 195.0 0.866666666667 92.0 0.771739130435 0.211439842209 0.20547008547 0.0733908528465 0.094429643116 0.0481530706856 0.0222825998883 0.0123375716272 0.00868794790726 0.0226542449727 1.0 0.666666666667 0.0 3.0 6.0 3.0 2.0 3.0 1.0 2.0 4.0 11.0 0.216216216216 0.0 3.0 1.0 0.471794871795 0.25 0.75 0.9375 0.5625 0.625 0.75 0.3125 0.625 0.625 0.625 0.0625 0.3125 0.5625 0.5625 0.0625 0.625 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.75 0.5 0.25 0.75 1.0 0.75 0.25 0.0 1.0 0.5 0.0 0.5 0.75 0.5 0.25 0.0 1.0 0.5 0.25 0.75 0.75 0.25 0.0 0.0 -8.6580289042 7.13014145052 -20.3666626717 20.7408426515 0.787710865009 5.71769438222 -18.0145815229 43.5233455934 0.955363503137 1.7759208046 -11.4371907161 50.171592935 -0.367000159234 -2.93955765373 -11.3879529569 29.7969550958 0.466658437865 -1.56839885541 -7.37330498932 11.3337226653 0.494783216286 -0.444890811982 -1.88727847125 1.25013236434 0.0400359435671 -0.440256676398 2 4 3 6 2 6 2 6 3 6 4 3 5 3 5 3 3 4 2 5 4 1 6 0 88.0 0.727272727273 47.0 0.702127659574 0.247159090909 0.207644628099 0.0565540477085 0.104842165195 0.0411374201728 0.0081472953745 0.00294044351608 0.00212056185475 0.0277663818654 0.375 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.1875 0.0 2.0 1.0 0.534090909091 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.166666666667 1.0 1.0 0.333333333333 0.333333333333 1.0 1.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.18309886184 5.4402053275 -8.57238994692 12.760291731 -1.13405370419 -0.586398077327 -11.5695940946 10.6638958519 0.829513772728 -0.927454972099 -10.207220049 4.32419528311 -1.37279313851 -0.251703730863 -15.6630569126 0.129250139896 0.445332814152 -0.789381061255 -15.1195099652 -7.17739664731 -0.114712535195 -0.586086673078 -15.3887213515 -14.7192380466 -0.0610980164529 -0.117278155658 2 1 11 4 10 5 9 4 11 3 12 2 12 3 11 2 11 3 12 2 4 2 6 3 2 4 4 5 2 4 3 4 4 4 2 3 6 3 2 3 6 3 3 2 6 3 3 2 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 5 4 1 6 2 6 11 3 322.0 0.608695652174 117.0 0.897435897436 0.145962732919 0.203078584931 0.0429901557072 0.16182926575 0.0647988956411 0.0158322472901 0.0276115049057 0.0202249108678 0.143239249633 0.642857142857 0.565217391304 4.0 4.0 2.0 0.0 0.0 1.0 5.0 5.0 2.0 5.0 0.0952380952381 3.0 1.0 2.0 0.363354037267 0.75 0.541666666667 0.666666666667 0.666666666667 0.25 0.333333333333 0.416666666667 0.25 0.0 0.208333333333 0.25 0.0416666666667 0.0 0.125 0.75 0.791666666667 0.666666666667 0.833333333333 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.5 0.166666666667 0.833333333333 1.0 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 0.666666666667 0.5 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 -8.91267681315 -9.74305042928 -20.1558607969 -22.0962875277 2.739552728 2.80956154328 -7.58055774108 -8.77596310142 2.9193595456 4.12224982626 0.667736326818 10.3710300078 -4.89622918181 -2.07510775207 -14.1804858019 8.48826802762 4.68638879753 1.68821202048 5.20620272087 6.12570030914 -1.73154665458 -3.33559346282 2.48550744238 -11.3252816143 -0.119266181843 0.592256230045 8 3 7 8 4 9 3 3 10 3 9 4 9 4 9 4 10 3 2 1 6 4 1 2 7 3 1 2 7 4 9 4 9 3 10 4 9 4 9 4 9 4 9 4 8 1 1 4 6 8 4 9 6 6 5 0 299.0 0.565217391304 112.0 0.669642857143 0.146642655004 0.186418496437 0.0273976569213 0.166768427803 0.0372596896199 0.00617532855489 0.0149333672857 0.00180971653395 0.15998933181 0.692307692308 0.173913043478 2.0 1.0 6.0 0.0 0.0 2.0 0.0 1.0 3.0 7.0 0.25 1.0 3.0 2.0 0.374581939799 0.166666666667 0.416666666667 0.25 0.333333333333 0.583333333333 0.75 0.916666666667 0.958333333333 0.416666666667 0.208333333333 0.25 0.375 0.416666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.833333333333 0.666666666667 0.5 0.5 0.5 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.5 0.5 0.833333333333 0.833333333333 1.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.5 0.333333333333 0.5 0.833333333333 0.333333333333 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 -12.6770372063 0.221432964302 -22.2289813515 2.41524985547 10.5800168038 3.39223580851 2.05329653462 17.9289744632 -6.33932818287 3.33769674145 -7.42233573955 34.1528455119 4.20034283214 -0.868399026208 1.02262783703 33.205147139 -1.9853332783 -0.00896843497765 -1.42412814312 24.95398351 0.173585948476 -1.92792108915 -7.59033366614 9.74386657867 0.0203242277115 0.0329543627224 3 1 7 3 6 2 6 4 1 1 2 8 1 8 2 4 6 3 6 3 5 4 5 4 5 4 5 4 5 4 5 8 1 8 3 4 2 0 153.0 0.529411764706 77.0 0.636363636364 0.18663761801 0.261053440984 0.0297879956232 0.201019271678 0.0536314031501 0.00562241008346 0.0155511481934 0.00636124766679 0.207877707219 0.555555555556 0.0588235294118 1.0 0.0 2.0 2.0 1.0 0.0 0.0 0.0 5.0 3.0 0.107142857143 1.0 5.0 1.0 0.503267973856 0.466666666667 0.666666666667 0.6 0.533333333333 0.8 1.0 1.0 0.933333333333 0.4 0.6 0.333333333333 0.733333333333 0.2 0.266666666667 0.0 0.466666666667 0.0 0.5 0.833333333333 0.166666666667 0.333333333333 0.5 0.5 0.333333333333 0.333333333333 0.833333333333 1.0 0.666666666667 0.833333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.5 0.833333333333 0.5 0.5 0.5 0.666666666667 1.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.666666666667 -9.21226258838 -0.224689331424 -16.1285991337 -0.245484350832 7.85712935422 0.76036735686 2.85052168336 4.75945058415 -4.08592603237 2.26321484025 -2.50461827242 16.3565116098 2.55323634135 0.0875447887593 2.43677082987 16.4558442866 -0.962673898133 -1.63603099667 2.17437180459 3.13695803006 -0.239231284928 -0.325325043232 -4.67355262774 -3.27583887137 -0.0144384522241 -0.0102616277039 4 7 5 9 3 3 3 5 1 3 5 4 1 12 1 3 4 1 4 4 10 2 10 4 9 4 10 4 5 3 1 11 3 9 5 8 9 1 5 0 195.0 0.866666666667 97.0 0.680412371134 0.218540433925 0.217777777778 0.0732694752103 0.105513039667 0.0429787420557 0.0206944023048 0.0109162496377 0.00475968519403 0.0269011250786 1.23076923077 0.266666666667 1.0 5.0 6.0 3.0 1.0 2.0 0.0 0.0 7.0 15.0 0.116279069767 0.0 3.0 1.0 0.497435897436 0.375 0.8125 0.875 0.75 0.625 0.4375 0.1875 0.6875 0.6875 0.375 0.0 0.5 0.8125 0.5 0.0 0.5 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 0.75 0.75 0.75 0.5 0.25 0.25 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.75 0.25 0.5 0.75 0.25 0.0 0.0 -10.1010337216 3.22554018 -24.4399459231 13.3023033242 0.0656425720841 8.3569784874 -23.4265376687 42.8759130617 2.15930528276 0.714355500292 -10.8216121845 48.5303446596 0.0425005427177 -2.32016123662 -7.04005488852 31.1391057024 0.162659858469 -1.0377270609 -4.90103923937 15.4209165474 0.481397325976 -1.47968691227 -0.375933058322 -0.843097535421 0.0173017397207 -0.22879971044 5 4 8 10 3 3 3 6 2 3 3 6 1 12 2 12 1 4 10 4 10 4 11 3 11 4 7 1 3 5 2 4 4 9 7 5 4 0 196.0 1.0 99.0 0.666666666667 0.221209912536 0.217201166181 0.0827040338209 0.0878715501194 0.0412386633121 0.0237305363627 0.00850912240014 0.00414280384217 0.00928507843797 0.857142857143 0.285714285714 0.0 3.0 4.0 3.0 1.0 1.0 0.0 2.0 3.0 11.0 0.138888888889 1.0 3.0 1.0 0.505102040816 0.3125 0.75 0.9375 0.5625 0.625 0.6875 0.25 0.6875 0.6875 0.625 0.0 0.375 0.75 0.75 0.0 0.5 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -9.3219323811 4.95653965629 -24.0565410117 12.3261361103 -2.42166078133 1.35258501199 -33.4852421086 23.0288350127 0.114666936747 4.69344679118 -33.0062119924 44.5637867701 -0.323042300226 -0.281581172011 -33.3331102462 43.6411928477 0.116229242069 -2.25167187839 -31.1995232759 26.1803250518 0.495453653005 0.567380595439 -26.9430149944 25.2790557463 -0.11401657162 -0.052537324831 1 0 5 2 37 1 5 7 4 7 4 7 4 7 4 7 4 7 4 6 6 4 8 3 3 1 3 5 1 9 0 165.0 0.733333333333 92.0 0.402173913043 0.207162534435 0.210101010101 0.0483076494977 0.113983916298 0.0238762278432 0.0115079431845 0.00253874204932 -0.00310728527265 0.0522540150415 0.363636363636 0.133333333333 2.0 0.0 1.0 0.0 1.0 0.0 0.0 1.0 5.0 3.0 0.142857142857 1.0 2.0 1.0 0.557575757576 1.0 0.583333333333 0.333333333333 0.583333333333 1.0 1.0 1.0 1.0 0.833333333333 0.75 0.666666666667 0.833333333333 0.916666666667 0.25 0.0 0.25 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -10.7800948121 8.14873308631 -20.3392947935 22.2987484576 7.42213771944 3.80274210694 -1.9568427703 34.5958031902 -3.52381566814 -1.72954344716 -7.68399680227 25.4256507997 0.900479941437 -1.31507898562 -8.99417214609 14.4800331987 0.358582504393 0.358551395384 -0.934463317883 13.6653020419 0.598464791775 -0.609982736856 2.62837007766 6.7077557358 -0.0804732253684 -0.344291189885 2 3 3 5 3 14 3 4 4 3 5 3 5 4 4 4 4 4 4 4 4 4 4 4 5 5 3 1 2 1 2 0 120.0 0.533333333333 63.0 0.619047619048 0.178125 0.227222222222 0.0255086805556 0.167846643519 0.0390399305556 0.00402835201983 0.0118049769041 0.00222074607525 0.156552346557 0.375 0.0666666666667 0.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 2.0 8.0 0.125 0.0 5.0 1.0 0.525 0.75 0.625 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.875 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -8.48826363157 4.83831026999 -15.3394883431 13.991677086 6.51219585814 3.39417368414 -0.763198362016 25.5209427411 -4.47090468614 -0.476675735138 -11.9029165074 24.7491505776 0.918036269503 -0.0751635488414 -15.5716292749 22.260724281 -0.397035362508 0.168919720144 -14.0167542806 25.2974903724 -0.160783192149 1.08504992346 -20.4571125501 37.3099007274 -0.282486611313 0.298740310788 2 1 11 4 10 5 9 4 11 3 12 2 12 3 11 2 11 3 12 2 4 2 6 3 2 4 4 5 2 4 3 4 4 4 2 3 6 3 2 3 6 3 3 2 6 3 3 2 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 5 4 1 6 2 6 11 3 322.0 0.608695652174 117.0 0.897435897436 0.145962732919 0.203078584931 0.0429901557072 0.16182926575 0.0647988956411 0.0158322472901 0.0276115049057 0.0202249108678 0.143239249633 0.642857142857 0.565217391304 4.0 4.0 2.0 0.0 0.0 1.0 5.0 5.0 2.0 5.0 0.0952380952381 3.0 1.0 2.0 0.363354037267 0.75 0.541666666667 0.666666666667 0.666666666667 0.25 0.333333333333 0.416666666667 0.25 0.0 0.208333333333 0.25 0.0416666666667 0.0 0.125 0.75 0.791666666667 0.666666666667 0.833333333333 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.5 0.166666666667 0.833333333333 1.0 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 0.666666666667 0.5 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 -8.91267681315 -9.74305042928 -20.1558607969 -22.0962875277 2.739552728 2.80956154328 -7.58055774108 -8.77596310142 2.9193595456 4.12224982626 0.667736326818 10.3710300078 -4.89622918181 -2.07510775207 -14.1804858019 8.48826802762 4.68638879753 1.68821202048 5.20620272087 6.12570030914 -1.73154665458 -3.33559346282 2.48550744238 -11.3252816143 -0.119266181843 0.592256230045 10 3 10 4 7 8 5 2 3 2 6 2 12 3 10 3 11 4 10 4 9 5 7 9 5 9 7 4 11 3 11 3 11 3 11 3 11 3 11 3 10 4 10 5 7 8 6 2 5 1 6 0 322.0 0.608695652174 100.0 0.76 0.111579414374 0.149068322981 0.0250497450327 0.122727297778 0.0257361653816 0.00762893565418 0.00962339466529 0.00122618800166 0.109096176682 0.642857142857 0.0869565217391 3.0 0.0 3.0 0.0 1.0 0.0 0.0 0.0 6.0 7.0 0.170731707317 1.0 4.0 4.0 0.310559006211 0.0 0.375 0.541666666667 0.333333333333 0.333333333333 0.916666666667 0.833333333333 0.791666666667 0.291666666667 0.291666666667 0.25 0.0416666666667 0.541666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 1.0 0.666666666667 0.5 0.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.5 0.5 0.333333333333 0.5 0.166666666667 0.333333333333 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -13.5074108224 3.70900215205 -21.2748962075 8.11809020409 14.9839794076 -0.265489333853 17.4226084271 13.4107752765 -6.98583452116 4.19174707814 4.72419227453 27.9782414192 2.26644453739 -1.69198903444 4.81154268768 25.9332208381 0.322736707059 0.493558452781 12.5788076583 18.8616940018 -0.733910359814 -1.51024862206 7.3234822216 16.2431447444 0.266887228119 0.750071365354 6 4 10 4 1 4 5 4 5 3 4 3 7 3 2 4 7 3 2 4 7 9 7 9 7 3 2 4 7 3 2 4 7 2 3 5 5 3 6 3 3 3 8 7 4 0 208.0 1.23076923077 91.0 0.769230769231 0.197415865385 0.206360946746 0.10742798685 0.0714001870448 0.050977051448 0.044566816094 0.0102717947106 0.0134457161569 -0.000773069067843 0.4375 0.846153846154 0.0 3.0 4.0 0.0 2.0 3.0 3.0 3.0 3.0 10.0 0.236842105263 0.0 2.0 3.0 0.4375 0.25 0.75 0.875 0.375 0.5625 0.5 0.5 0.625 0.4375 0.0 0.0 0.3125 0.5 0.25 0.25 0.5625 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -6.20704278058 5.80915542285 -19.196020991 17.2992367366 -6.12870870703 4.66491841988 -39.0983458157 31.2228347308 1.66659529962 -3.01946331465 -31.66368844 12.2132854393 1.8273736269 -4.66934336268 -17.566607706 -20.1773561555 -0.425212823579 0.857734457795 -13.7694324444 -16.2512755058 1.74476115453 2.18624374959 3.50614789531 4.30885616021 0.413985149338 -0.22533587785 6 2 8 7 4 3 2 4 2 3 3 4 1 4 1 6 1 9 3 3 8 3 9 3 10 3 10 3 9 4 4 1 3 9 4 8 1 0 168.0 0.857142857143 79.0 0.721518987342 0.209325396825 0.218537414966 0.069372739175 0.111727776428 0.0453826868049 0.0199510010778 0.0122270713478 0.00515398341735 0.0413283450225 0.916666666667 0.285714285714 0.0 4.0 5.0 2.0 1.0 2.0 0.0 1.0 3.0 9.0 0.259259259259 0.0 2.0 3.0 0.470238095238 0.0833333333333 0.583333333333 0.833333333333 0.416666666667 0.5 0.916666666667 0.5 0.916666666667 0.583333333333 0.5 0.0 0.5 0.583333333333 0.583333333333 0.0 0.25 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.75 0.75 0.25 0.25 0.75 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -9.0490953358 4.68370261099 -20.6808455376 11.7569130601 1.90197117124 1.40548199016 -13.2837991219 21.984640329 2.1298088538 4.10146653816 -0.653602788602 40.3689405665 -0.584745168788 -0.545641961727 -0.833757689966 38.2156452912 0.446479543022 -1.61305371077 2.79598008227 26.3409356043 0.748752746113 1.09002767547 9.74253063673 31.5315397768 -0.0673987024031 -0.0441046587752 5 4 6 8 3 3 3 4 1 3 5 2 1 3 7 1 1 3 9 3 9 3 9 4 8 4 8 5 8 5 3 2 3 8 6 4 4 0 168.0 0.857142857143 69.0 0.811594202899 0.145833333333 0.191326530612 0.0514987244898 0.107165634111 0.0329329648526 0.0192735676152 0.0127357004377 0.00524929190463 0.061933598637 0.666666666667 0.285714285714 0.0 3.0 3.0 2.0 1.0 2.0 0.0 1.0 1.0 7.0 0.16 1.0 2.0 1.0 0.410714285714 0.25 0.916666666667 1.0 0.75 0.583333333333 0.416666666667 0.5 0.916666666667 0.5 0.0 0.0 0.5 0.583333333333 0.0 0.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.75 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -12.9597596518 0.500201249717 -32.0449399336 5.35589607975 -1.20410226625 6.58752981655 -37.1400630884 30.7355442917 0.87995912934 2.64440383907 -31.2326221 45.2475376497 -0.242036953879 -1.88330970661 -29.608768194 33.9576024116 0.371277644505 -0.580024757348 -27.1274554613 26.6512101195 -0.204797207355 0.652670745023 -29.3826229269 30.9262875594 -0.191487233763 -0.0242159666488 3 1 4 1 1 1 6 5 1 6 4 13 3 7 1 5 4 5 3 5 4 3 5 5 2 4 6 4 2 4 6 4 2 3 7 4 2 3 7 3 3 4 6 3 3 4 6 3 3 5 4 3 5 10 5 6 1 1 1 1 6 4 12 4 13 3 12 4 12 5 9 8 8 7 12 2 11 0 368.0 0.695652173913 163.0 0.638036809816 0.184273097826 0.182537807183 0.0513795119162 0.109009621793 0.0318685685088 0.0161680842772 0.00256774809356 0.00275501126824 0.0594990431229 0.8125 0.652173913043 4.0 5.0 4.0 0.0 5.0 5.0 4.0 0.0 5.0 12.0 0.160714285714 0.0 2.0 2.0 0.442934782609 0.541666666667 0.458333333333 0.458333333333 0.541666666667 0.791666666667 0.666666666667 0.875 0.833333333333 0.5 0.0 0.333333333333 0.125 0.75 0.291666666667 0.416666666667 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.5 0.5 0.5 0.333333333333 0.5 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 0.5 1.0 0.666666666667 0.333333333333 0.166666666667 0.666666666667 1.0 0.666666666667 0.5 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.5 0.166666666667 -12.510962483 16.9396217691 -26.3748000536 42.2447951378 5.27943905909 1.35308517411 -11.9844338092 43.6945699985 -1.37229748529 -4.38824656928 -14.8852929806 24.3074719592 -2.25763079248 1.62374990944 -27.2373857307 19.8150584045 2.03410698478 -2.64687629122 -14.6318182591 10.5432114463 0.233031454556 1.74714579454 -9.85666950511 11.1067335253 -0.269161040905 -0.640471855727 5 2 7 6 4 1 3 4 2 2 4 3 2 2 5 1 3 3 8 7 6 7 5 6 2 1 5 7 4 7 4 3 1 4 2 4 2 8 4 5 4 0 165.0 0.733333333333 83.0 0.867469879518 0.231404958678 0.261818181818 0.0635044661491 0.144834794223 0.0565122297354 0.0137087278047 0.0076706543327 0.00695114735142 0.0646765189405 1.18181818182 0.466666666667 1.0 3.0 4.0 2.0 1.0 2.0 1.0 2.0 1.0 6.0 0.333333333333 1.0 3.0 1.0 0.50303030303 0.25 0.666666666667 0.25 0.833333333333 0.333333333333 0.583333333333 0.5 0.333333333333 0.5 0.25 0.75 0.0833333333333 0.75 0.416666666667 0.833333333333 0.75 0.0 0.0 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.25 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.25 0.75 1.0 0.75 0.75 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.75 1.0 0.75 0.25 0.0 0.5 1.0 1.0 0.5 1.0 1.0 0.75 0.25 0.25 0.75 1.0 -6.28131508736 -0.59417845421 -17.4709684928 0.550033452142 -2.8882731717 3.51527291195 -23.8124877203 15.839778247 3.6464239206 2.53582369878 -8.23822334946 25.5509164269 -0.334315207048 -2.72022446118 -5.11000714443 14.3383784933 -0.485165386774 0.951068116125 -8.57952338657 11.8686907258 0.82358329413 -1.2601623792 -0.273138534005 3.60877799398 0.217092480059 -0.155494478204 4 1 8 2 7 3 7 3 1 1 3 10 1 5 6 3 7 3 7 3 7 3 7 3 7 3 7 3 7 4 6 6 4 7 3 6 4 2 6 0 180.0 0.555555555556 71.0 0.788732394366 0.147777777778 0.199074074074 0.025707133059 0.165115740741 0.0475565843621 0.00542575311387 0.0187583686398 0.00623617921846 0.158645604233 0.4 0.0555555555556 0.0 0.0 2.0 2.0 1.0 0.0 0.0 0.0 1.0 7.0 0.133333333333 1.0 3.0 1.0 0.394444444444 0.333333333333 0.533333333333 0.333333333333 0.333333333333 0.8 1.0 1.0 1.0 0.533333333333 0.533333333333 0.333333333333 0.8 0.266666666667 0.2 0.0 0.466666666667 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.833333333333 0.5 0.5 0.5 0.833333333333 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.166666666667 0.666666666667 -8.70047022236 1.41471060526 -15.4257634806 5.01206490844 7.00412741327 2.31331382305 0.178509717951 12.4979995727 -4.59737282802 -0.4387521932 -7.7375515461 11.5672572504 3.07901692718 -0.14767747803 0.928652806289 10.4903976045 -0.633796708744 0.596027216104 2.44331056861 14.0067963411 -0.744270366191 -0.194786013388 -5.91606619844 13.6716722192 0.163932156265 0.0174019004306 0 6 3 6 3 2 1 8 2 6 3 11 3 5 3 4 1 5 4 5 4 3 2 4 4 5 3 2 4 5 3 5 3 2 5 4 2 7 1 2 6 5 1 7 1 2 7 14 8 7 2 5 9 5 3 4 10 5 3 4 11 3 5 2 13 1 14 0 308.0 1.57142857143 161.0 0.527950310559 0.240112160567 0.197124304267 0.134407418248 0.0445713946199 0.0442307155233 0.0421353535896 0.00553192188472 0.00268245691302 -0.0271936913991 0.136363636364 1.5 0.0 2.0 0.0 1.0 7.0 6.0 3.0 3.0 4.0 11.0 0.25 0.0 4.0 3.0 0.522727272727 0.958333333333 0.666666666667 0.416666666667 0.166666666667 0.5 0.458333333333 0.875 0.791666666667 0.833333333333 0.875 0.916666666667 0.5 0.416666666667 0.375 0.5 0.333333333333 1.0 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.833333333333 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 0.166666666667 0.333333333333 0.166666666667 0.0 0.166666666667 0.333333333333 0.5 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.666666666667 0.833333333333 -8.07349620412 16.1180551459 -18.3460099157 37.4131398017 2.36077839329 -1.7913600319 -6.32288289355 34.0753848525 4.21738018207 -0.545719690217 12.1026388738 23.8488927614 -3.13749699929 -0.558833309086 -1.66296328583 26.1116995184 0.0257573147328 2.6012613569 -4.19488050635 36.4864161237 1.62786788972 -2.40312158993 8.56085165455 24.3850438719 -0.265350689316 0.205238134492 1 2 12 4 5 4 2 5 4 4 3 4 5 3 3 4 5 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 5 5 2 4 4 5 3 13 4 1 5 2 3 0 210.0 1.07142857143 96.0 0.75 0.202857142857 0.224149659864 0.0953880790411 0.0895463772811 0.0614684159378 0.0339902401383 0.0142705877014 0.0160806911794 0.0110364813691 0.133333333333 0.857142857143 0.0 1.0 1.0 0.0 2.0 3.0 3.0 2.0 2.0 8.0 0.114285714286 1.0 1.0 2.0 0.457142857143 0.8125 0.75 0.75 0.6875 0.3125 0.375 0.25 0.5 0.125 0.0 0.0 0.375 0.6875 0.75 0.75 0.9375 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.41389708842 -0.636619772368 -18.0910880543 0.524638875519 -10.4530137202 3.04841841222 -49.8421208545 10.6651756079 3.23075469849 -0.115100854844 -42.2591120975 10.6630019427 -0.370441033505 -1.37875257862 -41.1815202698 0.729228441058 -2.44049125235 -0.33548827273 -59.0109320925 -4.3061374488 0.382892743356 -0.104239634328 -60.6530702973 -6.48829774162 -0.0885423729801 -0.133824083637 6 1 9 7 4 2 3 4 2 2 5 3 2 2 6 13 2 5 6 3 9 4 8 4 8 5 8 5 4 2 1 11 3 7 5 7 2 0 180.0 0.8 87.0 0.712643678161 0.20462962963 0.248888888889 0.0650198902606 0.132691358025 0.0496255144033 0.019599875953 0.0123286788853 0.00624992076103 0.0629264700674 1.33333333333 0.266666666667 1.0 5.0 6.0 4.0 1.0 2.0 0.0 1.0 1.0 14.0 0.25 0.0 3.0 1.0 0.483333333333 0.0833333333333 0.583333333333 0.916666666667 0.833333333333 0.416666666667 0.833333333333 0.666666666667 0.916666666667 0.416666666667 0.416666666667 0.166666666667 0.5 0.416666666667 0.25 0.0 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.75 1.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.25 0.75 0.75 0.5 0.75 1.0 0.5 0.25 0.5 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.5 0.75 0.25 0.0 0.5 0.5 0.0 0.0 -10.7376534939 0.763943726841 -23.3510232101 5.05600894607 3.79651738028 5.5762233217 -10.7835515696 29.7321180162 1.53118634923 4.95058170363 2.46393950511 54.5001258687 0.552345403394 -1.55970548052 10.2053798001 48.2445824395 1.5904798309 -0.551441979625 21.998575054 42.6490770609 -0.185196489019 1.30230425702 23.6639707102 50.4403167952 0.0391573643728 -0.218655906048 1 9 4 10 6 11 4 11 4 11 4 11 4 11 4 11 4 9 6 5 2 2 6 3 3 4 5 2 4 5 4 2 3 6 3 2 4 6 3 2 4 6 4 1 4 6 3 2 4 6 3 2 5 5 3 3 5 4 4 3 5 2 6 3 12 4 1 7 1 2 0 330.0 0.681818181818 141.0 0.673758865248 0.233333333333 0.231818181818 0.0735766758494 0.152816345271 0.060886134068 0.0184267365152 0.0136040299507 0.00942795003828 0.0754809838722 0.533333333333 0.545454545455 0.0 2.0 4.0 2.0 0.0 1.0 5.0 4.0 2.0 12.0 0.0697674418605 1.0 1.0 2.0 0.427272727273 0.0 0.0833333333333 0.833333333333 0.75 0.0 0.166666666667 0.333333333333 0.625 0.125 0.208333333333 0.0416666666667 0.25 0.833333333333 0.875 0.791666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.462996198086 -7.43687643175 -2.01350693832 -17.2500604871 -2.83728661885 2.41859313031 -0.315733635874 0.248161474876 8.28601836872 8.94059101355 26.2390574566 43.2037562419 -5.20695935712 -1.14732182413 10.5645151085 46.6628093352 1.22857624237 -0.862615765299 6.14650493013 32.7028292389 -0.132404967909 -0.848531271496 8.76763636022 24.9844848463 -0.205560004467 0.110703987571 1 8 3 5 1 4 2 3 3 4 9 3 9 3 9 3 9 3 9 3 3 2 4 3 2 3 4 3 2 4 2 18 1 4 4 2 1 0 156.0 0.923076923077 78.0 0.589743589744 0.232371794872 0.244575936884 0.0836628546503 0.122738920076 0.0585931573358 0.0198994427858 0.0111695350449 0.0112798455041 0.0263215353911 0.583333333333 0.461538461538 3.0 3.0 1.0 0.0 2.0 0.0 1.0 2.0 3.0 9.0 0.166666666667 0.0 2.0 1.0 0.5 0.666666666667 0.0 0.416666666667 0.916666666667 0.583333333333 0.0 0.166666666667 0.75 0.5 0.0 0.0 0.416666666667 0.916666666667 0.666666666667 0.666666666667 0.666666666667 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.25 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.51809330334 -2.15471307571 -0.161794360736 -3.97000294576 -4.83129789016 2.0179426922 -11.211211661 4.33325098373 3.66483004989 1.80231432708 -1.35117114508 16.0377862874 -1.42651408985 0.993651954278 -2.02439983839 26.1165049147 0.419112980963 1.4343108646 -3.46271367118 40.3918553267 0.075155525183 1.35442774149 0.717061716021 56.6202158959 0.0972436545756 0.273986294952 1 1 10 2 7 1 4 1 5 4 3 2 3 5 3 2 3 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 3 6 2 2 3 6 3 1 3 6 2 2 3 5 9 3 5 1 1 2 1 3 3 6 1 4 1 3 0 195.0 0.866666666667 99.0 0.636363636364 0.233530571992 0.208888888889 0.0898553246009 0.0991067280298 0.0508367302213 0.0287218721378 0.0114523961281 0.0118224694155 0.0161973228938 0.461538461538 1.0 1.0 1.0 1.0 1.0 2.0 3.0 3.0 4.0 4.0 11.0 0.146341463415 0.0 1.0 2.0 0.507692307692 0.875 0.75 0.75 0.8125 0.6875 0.25 0.25 0.3125 0.5625 0.0625 0.0 0.1875 0.6875 0.75 0.6875 0.8125 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.63136172579 3.22554018 -9.49168549655 10.797355726 -4.35278159027 4.71721104218 -21.9703228982 28.6444296224 2.38713447036 1.21816852864 -11.3747806337 35.4147203136 1.37145569926 -1.22375892468 -0.512403112233 26.6398597829 -0.860614706005 -0.787074223831 -2.92736014383 16.2147947171 0.807468291172 -0.88448119618 1.5940433708 4.12000200199 -0.0249956658665 -0.360735309205 2 3 4 4 3 8 1 7 1 5 1 1 2 3 5 2 6 2 6 2 6 2 6 3 5 3 5 6 2 6 4 3 1 0 120.0 0.533333333333 60.0 0.616666666667 0.221875 0.219444444444 0.0388142361111 0.177693865741 0.0559635416667 0.00694568781896 0.0210843468789 0.00569182684427 0.147444472699 0.5 0.0666666666667 0.0 0.0 2.0 2.0 0.0 1.0 0.0 0.0 6.0 2.0 0.12 0.0 2.0 1.0 0.5 0.5 0.25 0.0 0.0 0.875 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 0.875 0.5 0.875 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -4.15924917947 4.58366236105 -7.21590774431 13.0250471953 3.26062500301 2.92675330016 -2.23672771423 23.3539986765 -3.99775000851 -0.113227149242 -13.9069273983 24.2075692849 1.61481670002 0.125960634541 -12.6272476877 23.8949657519 -1.03868366269 0.335747385154 -17.001383541 28.0793992426 -0.659485025588 0.850914206088 -24.6070799752 36.7311591127 0.104618251875 0.133593986869 2 2 4 4 3 4 2 7 1 4 1 1 1 3 5 2 5 2 4 3 4 3 4 3 4 3 4 3 4 6 3 4 105.0 0.466666666667 54.0 0.685185185185 0.2 0.24 0.0282267573696 0.215437641723 0.0496870748299 0.0049201296739 0.0179905518754 0.00493889528075 0.2373027828 0.571428571429 0.0666666666667 0.0 1.0 0.0 1.0 0.0 1.0 0.0 0.0 5.0 1.0 0.130434782609 0.0 6.0 1.0 0.514285714286 0.5 0.5 0.25 0.5 0.875 0.875 0.75 1.0 1.0 1.0 1.0 1.0 0.875 0.75 0.5 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 -5.34760608789 2.63136172579 -8.95314845481 7.08741754507 4.94130120206 1.18835690842 1.94981675064 11.9750789026 -3.40041098601 0.465525719701 -4.47289278829 14.5939388992 2.08090713027 0.00275469654567 -0.14521323034 12.9200259331 -0.747797783137 -1.03631838602 0.595926615972 2.88358704949 0.137631814395 -0.903718082482 -1.93861182497 -6.75620269429 -0.0247765652334 0.0558096580191 1 3 4 5 2 5 3 5 3 4 6 3 3 3 7 2 3 3 6 3 3 3 6 2 4 3 5 3 4 2 6 4 2 3 6 4 2 4 5 4 2 4 5 4 1 6 4 11 4 4 1 0 195.0 1.15384615385 97.0 0.639175257732 0.227692307692 0.242603550296 0.114223638295 0.0931330602337 0.0562666262075 0.0405215306869 0.00977179307055 0.013795268314 -0.00305707272012 0.266666666667 1.0 2.0 1.0 4294967295.0 2.0 3.0 3.0 3.0 3.0 2.0 5.0 0.294117647059 1.0 0.0 2.0 0.497435897436 0.75 0.5 0.625 0.875 0.4375 0.5 0.375 0.625 0.25 0.0 0.0 0.0 0.6875 0.5 0.75 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.44300481737 1.78253536263 -7.82513818641 6.58757260739 -5.73806621494 3.47452924652 -22.479230982 18.9517265746 4.04171292652 0.243078719997 -7.7732097631 20.3818347455 0.101025958415 -1.39581053732 -1.91997943351 9.8002586301 -0.975098889916 -0.707500914194 -8.08094241404 1.88618727761 0.844652982989 0.0201790930346 -2.65413786189 0.932296295392 0.023319638536 -0.0282999750397 7 4 12 8 9 3 2 4 8 3 4 3 8 3 4 4 6 3 6 3 6 3 6 2 7 3 6 3 5 4 6 3 4 5 5 13 5 6 2 5 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 5 4 6 4 4 5 5 7 1 4 7 5 3 1 10 3 2 0 414.0 0.782608695652 164.0 0.719512195122 0.174584004294 0.194391934468 0.0588146268725 0.113486616805 0.0532871837437 0.0186161953307 0.0173935496198 0.0143642410662 0.0594193718051 0.444444444444 0.913043478261 1.0 1.0 1.0 4.0 3.0 5.0 5.0 5.0 3.0 12.0 0.166666666667 0.0 1.0 2.0 0.3961352657 0.266666666667 0.766666666667 0.733333333333 0.666666666667 0.466666666667 0.2 0.2 0.233333333333 0.666666666667 0.466666666667 0.466666666667 0.4 0.233333333333 0.533333333333 0.466666666667 0.533333333333 0.0 0.0 0.222222222222 0.444444444444 0.888888888889 0.777777777778 0.333333333333 0.333333333333 0.111111111111 0.555555555556 0.888888888889 1.0 1.0 1.0 1.0 1.0 0.555555555556 0.777777777778 0.444444444444 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.888888888889 0.444444444444 0.111111111111 0.0 0.222222222222 0.222222222222 0.0 0.0 0.777777777778 1.0 0.777777777778 0.666666666667 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.222222222222 0.444444444444 0.555555555556 0.555555555556 0.888888888889 0.777777777778 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.555555555556 0.222222222222 0.0 0.0 -11.7913053491 4.59473400926 -31.7491809812 11.0453629474 -2.46537769659 0.351509133785 -25.5775530659 14.9785178386 12.2709654648 1.44887789218 18.5380325471 19.3112468845 -7.44459844797 -0.53409787149 -1.64739823962 20.4943571535 2.39258000648 1.16299060065 -3.96994234114 25.6064009015 -0.463080538637 -0.292171841352 0.657998165276 27.6464413248 -0.147190544683 0.0811196220208 7 5 5 9 3 4 2 4 2 4 5 1 3 3 10 3 10 3 10 2 11 2 10 4 8 5 2 6 1 4 5 3 1 3 6 3 1 4 5 3 1 4 5 3 1 3 6 3 1 3 6 3 1 3 6 3 1 4 5 3 1 4 5 3 1 4 4 4 273.0 0.619047619048 122.0 0.680327868852 0.208227669766 0.22780394209 0.0597962776444 0.169065049635 0.0577857025146 0.0190062688358 0.0193902998447 0.0135569250716 0.119172419854 0.769230769231 0.619047619048 0.0 3.0 2.0 4.0 2.0 0.0 5.0 5.0 0.0 4.0 0.170731707317 1.0 1.0 4.0 0.446886446886 0.291666666667 0.625 0.791666666667 0.75 0.583333333333 0.416666666667 0.416666666667 0.375 0.375 0.125 0.125 0.0416666666667 0.5 0.166666666667 0.791666666667 0.791666666667 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.5 0.5 0.0 0.333333333333 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.5 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -7.76069817743 -1.81891363534 -15.8583487864 -0.717814307959 4.56171991084 5.8766171148 0.89879675638 22.012206087 1.85763674327 2.77139547034 9.98758062804 38.6041976509 -2.85890455873 -0.409542554654 -2.19270544343 41.0214757499 1.61360464268 1.16862344457 4.20040749948 43.9225536805 0.246964540387 -1.02891488782 10.4207501538 41.4711584741 -0.115072247041 0.330994566133 3 2 7 2 6 3 6 3 5 17 1 8 2 3 6 3 6 3 6 3 6 4 5 3 6 4 5 6 4 5 4 2 1 2 1 0 153.0 0.529411764706 73.0 0.616438356164 0.20697167756 0.230296039985 0.0352905996437 0.176679713992 0.0555006914552 0.00626330787529 0.0161959979461 0.00496656456422 0.154221333486 0.444444444444 0.0588235294118 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 6.0 0.192307692308 0.0 5.0 1.0 0.477124183007 0.266666666667 0.6 0.333333333333 0.2 0.866666666667 1.0 1.0 0.866666666667 0.466666666667 0.733333333333 0.4 0.733333333333 0.2 0.6 0.0 0.4 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 1.0 0.666666666667 0.5 0.666666666667 0.833333333333 0.833333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.166666666667 0.5 0.833333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.333333333333 1.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.166666666667 0.5 -5.76702617321 2.99585775232 -9.48908935717 6.07845191629 5.48843213483 -1.41085204184 2.45693479359 3.76008054736 -3.7643827336 1.83575155425 -3.53807017275 11.8941100832 2.78285592208 0.700276070833 1.75750762727 15.359183623 -1.87757760585 -1.59228015036 -3.04993390119 5.27187257851 0.629141336492 0.248741082453 -3.1180193356 1.4833213397 0.112413176504 -0.240585013273 2 1 4 4 1 6 1 5 2 2 27 4 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 4 2 3 2 5 1 5 1 5 3 3 4 2 4 2 150.0 0.24 73.0 0.712328767123 0.243333333333 0.250666666667 0.020056 0.447614814815 0.0728266666667 0.0019438453855 0.0326502830106 0.00517727055134 0.82166040368 1.16666666667 171798691.68 0.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 3.0 6.0 0.04 1.0 2.0 1.0 0.486666666667 0.285714285714 0.142857142857 0.0 0.214285714286 0.571428571429 0.428571428571 0.5 0.5 0.642857142857 0.571428571429 1.0 0.642857142857 0.5 0.571428571429 1.0 0.857142857143 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 -0.203718327158 -2.71513970979 5.78895797147 1.7230496111 9.22078041114 -0.51486929151 35.9305970959 -2.15640184422 -1.08750514555 -4.74150717854 32.4883527117 1.79863377338 -3.46841285759 -1.78805907975 10.598708668 -1.52516762286 1.59076083109 -3.77600505059 16.0583194293 1.46899931318 -0.100636563258 0.174889036536 16.55805342 -0.312649165052 -0.352848790144 2 3 2 5 1 5 1 4 32 4 2 5 1 5 2 3 4 2 3 3 3 3 3 3 3 3 3 4 2 4 1 11 132.0 0.272727272727 67.0 0.611940298507 0.251262626263 0.272038567493 0.0227842300415 0.448574936695 0.0676661588335 0.00217410937287 0.0232009409594 0.00338509949924 0.799976674895 1.33333333333 195225785.955 0.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 3.0 1.0 0.272727272727 1.0 6.0 1.0 0.507575757576 0.25 0.166666666667 0.166666666667 0.0833333333333 0.583333333333 0.333333333333 0.583333333333 0.583333333333 0.666666666667 0.333333333333 0.916666666667 1.0 0.666666666667 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.96773384186 -3.12522433708 -3.53214469403 -2.87754492668 1.29667633575 7.06404013381 -2.10920985588 21.7277667937 -1.67120645474 1.04419620151 -4.6085980713 30.3138038394 1.88653836099 -1.27523023406 0.894304108244 25.4136368662 -1.23053580962 1.36369824898 -1.7045492124 28.1595200701 0.67874275009 -1.56394590399 -0.850860877911 18.8561584257 -0.105320566798 -0.0381855091788 4 4 3 1 3 4 3 3 3 3 3 5 1 12 1 16 9 4 9 4 9 4 10 3 13 1 4 4 5 7 7 5 2 0 169.0 1.0 80.0 0.675 0.211197086937 0.193445607647 0.0877440976015 0.0796965448602 0.0457664680745 0.0292994827074 0.0138374317201 0.00971318101657 0.0107110351941 0.923076923077 0.307692307692 0.0 3.0 5.0 3.0 3.0 0.0 0.0 1.0 3.0 11.0 0.0588235294118 1.0 3.0 1.0 0.473372781065 0.4375 0.875 0.9375 0.1875 0.75 0.625 0.25 0.3125 0.5625 0.5 0.0 0.5625 0.75 0.5 0.0 0.5625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.25 0.75 1.0 0.5 0.0 0.0 0.0 -4.79913366862 4.9950166755 -11.8147186658 12.8252660442 -0.360471095505 1.58213197866 -13.4798920684 21.8061906301 0.122892393782 2.72616596454 -13.6837439461 36.3874877444 -1.17318873571 1.20402332895 -20.7771020102 44.9302726789 -0.19906642879 -0.546017859106 -21.096394042 43.0677426795 1.3881855346 0.647624530701 -6.40266106463 47.2187111485 0.313842819876 0.0338156371506 2 1 22 7 3 7 2 5 1 7 3 6 3 6 1 6 4 5 3 4 4 5 4 5 3 2 7 5 3 5 3 2 7 5 3 5 3 1 9 5 1 1 2 3 2 2 9 8 1 7 9 7 2 6 11 6 2 6 12 5 3 5 13 3 4 4 14 2 6 2 8 0 350.0 1.78571428571 161.0 0.670807453416 0.205371428571 0.195102040816 0.134421947522 0.0420633002915 0.0479561049563 0.0498874980209 0.00725474871712 0.0068909422477 -0.020190926398 0.12 1.5 0.0 2.0 1.0 0.0 4.0 6.0 5.0 3.0 4.0 9.0 0.30612244898 1.0 2.0 3.0 0.46 0.75 0.678571428571 0.464285714286 0.214285714286 0.392857142857 0.5 0.678571428571 0.642857142857 0.464285714286 0.571428571429 0.714285714286 0.75 0.535714285714 0.321428571429 0.214285714286 0.107142857143 0.625 1.0 0.875 0.625 0.375 0.25 0.125 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.875 0.75 0.125 0.25 0.25 0.25 0.375 0.5 0.625 0.875 0.375 0.75 0.625 0.5 0.5 0.5 0.375 0.5 0.5 1.0 1.0 1.0 1.0 1.0 0.875 0.75 0.25 0.375 0.25 0.25 0.25 0.25 0.375 0.75 0.375 0.75 0.75 0.625 0.5 0.375 0.375 0.5 0.375 0.875 0.75 0.25 0.0 0.0 0.0 0.0 -10.7970713394 10.644282594 -24.0711138933 24.4911466039 3.7220153245 -1.70789296756 -7.45457168611 19.172912125 4.17323349194 -1.4421686487 9.51663985879 7.57442322401 -4.44876194089 -0.186848399057 -7.6179747561 7.41601658949 1.83243666685 1.03674606818 -3.63397572618 11.1296661795 0.482477757019 -1.05648195183 9.02894010632 8.08415046383 0.0870690627539 0.28471492787 0 12 2 7 2 4 1 6 4 3 2 5 4 3 2 5 4 3 3 4 4 3 3 4 4 3 3 4 5 2 3 3 5 3 3 3 5 3 3 3 5 3 2 5 2 6 2 3 4 2 2 1 182.0 1.07692307692 103.0 0.582524271845 0.254709576138 0.236263736264 0.103873589881 0.0880350026739 0.0531832766919 0.030090300521 0.00990116784815 0.00935204933947 -0.0118022766969 0.357142857143 1.0 1.0 1.0 2.0 1.0 2.0 3.0 3.0 3.0 5.0 5.0 0.0789473684211 0.0 1.0 2.0 0.565934065934 0.9375 0.625 0.5 0.5625 0.875 0.75 0.625 0.5625 0.375 0.0 0.0 0.1875 0.8125 0.75 0.6875 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.72877295244 3.63782727067 -10.3518777918 10.2106034963 -1.93166772038 2.34602738272 -16.2843396611 19.8488087333 1.22105751856 0.939797297091 -9.00198911803 23.9250930636 1.3802891482 -0.842594939859 0.784347742088 18.2788560743 -0.480244312488 -0.325557159369 -1.51819321601 15.7681205399 -0.465416254955 0.92809518787 -6.77739312237 24.4934791919 0.0300046347647 0.185247997062 0 15 1 3 3 2 2 3 2 4 1 4 1 3 2 3 3 2 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 14 105.0 0.238095238095 74.0 0.418918918919 0.297142857143 0.331519274376 0.0170728862974 0.484884137782 0.0409925494007 0.000731967055131 6.90890343652e-05 -0.00153060006665 1.07708077751 1.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 8.0 3.0 0.0645161290323 0.0 5.0 1.0 0.704761904762 0.666666666667 0.416666666667 0.416666666667 0.666666666667 0.916666666667 0.916666666667 0.916666666667 1.0 1.0 1.0 1.0 1.0 0.75 0.666666666667 0.5 0.75 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -3.69845772518 1.69765272631 -6.38828136821 5.43637052876 2.88139017153 2.40872009759 -1.79372358782 16.9390431994 -2.90673243642 2.92187531961 -6.53963035651 32.9416732253 2.57661921177 0.491309815757 -1.58288061673 36.4933934411 -2.07651508128 -1.05787171319 -5.51283023108 28.8962927611 1.43472095275 0.109460644265 -4.72687677502 25.3332187264 -0.433338893719 -0.20519066555 1 2 2 5 1 7 2 4 2 5 13 3 5 3 4 3 4 5 4 2 4 5 4 3 3 5 3 3 3 6 4 2 4 6 3 3 3 6 3 2 4 5 4 2 4 5 4 1 6 3 6 1 5 2 7 210.0 1.07142857143 111.0 0.630630630631 0.24 0.269387755102 0.104362811791 0.10192808552 0.0628299319728 0.0322943170855 0.00935273772625 0.013880014874 -0.00112531174101 0.6 0.928571428571 3.0 2.0 2.0 1.0 2.0 3.0 3.0 3.0 6.0 2.0 0.179487179487 0.0 1.0 2.0 0.528571428571 0.6875 0.6875 0.625 0.75 0.5625 0.5625 0.4375 0.5625 0.5 0.0625 0.0 0.0625 0.625 0.8125 0.625 0.75 0.0 0.5 0.75 0.5 0.5 0.25 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.0 0.5 1.0 0.75 0.5 0.5 0.25 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 -3.98948390684 0.806385044999 -15.4691143188 1.28897930805 -8.33094781226 -1.07914124969 -41.6172419128 -3.36757385525 2.00422785001 -1.28076370929 -37.3882464917 -12.4820696118 0.115514867865 -1.39375940023 -35.0074619779 -22.3363957247 -2.0873274082 -0.17833557653 -50.5951767069 -25.8202869491 -0.436790522375 -0.199876267582 -61.5415154635 -28.8669433721 -0.405098776425 -0.203869100015 5 1 3 1 1 1 2 10 1 12 2 6 7 4 8 4 8 4 8 3 9 3 9 3 9 4 8 4 7 6 3 0 156.0 0.923076923077 66.0 0.636363636364 0.201388888889 0.168145956607 0.0651675158887 0.0825776205769 0.0419097907079 0.0155460362997 0.0122623347691 0.00163910563042 0.0221341058762 0.25 0.230769230769 0.0 1.0 2.0 0.0 2.0 1.0 0.0 0.0 2.0 7.0 0.12 0.0 2.0 2.0 0.423076923077 0.333333333333 0.0833333333333 0.0 0.0 0.666666666667 0.416666666667 0.333333333333 0.416666666667 0.833333333333 1.0 1.0 1.0 0.75 0.75 0.416666666667 0.666666666667 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.0 -4.45633840657 5.58266569615 -7.51464688037 14.7600322652 4.08717427822 2.3210397709 1.74261313835 25.6623912907 -2.65954509839 1.82908612489 -3.25711628224 34.0317633749 1.53133776279 -0.0935914462107 0.00683995748006 36.2638998019 -0.351322633026 0.636495941425 1.75142574199 38.7384523971 -0.0325036597862 -0.131459263517 -0.509186128833 40.960077628 0.0405897227225 0.272680230004 8 3 8 8 6 10 5 3 4 4 3 3 6 4 1 4 6 4 1 4 7 3 1 4 7 7 8 3 1 3 8 3 1 4 7 2 3 3 7 1 4 3 6 2 5 9 9 1 2 1 5 0 225.0 1.0 96.0 0.791666666667 0.205333333333 0.185777777778 0.0928900740741 0.0774668641975 0.0471079506173 0.0349382984691 0.00987650598628 0.0113737555226 0.00932605237494 0.533333333333 0.733333333333 0.0 2.0 3.0 1.0 0.0 3.0 3.0 2.0 1.0 10.0 0.375 0.0 2.0 2.0 0.426666666667 0.125 0.5625 0.8125 0.625 0.625 0.5625 0.375 0.4375 0.625 0.0 0.0 0.0 0.75 0.5 0.25 0.3125 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.58366236105 7.38478935946 -14.0597408564 20.8275345456 -4.61761541557 4.75116409671 -30.9653389257 39.2071549255 -0.397929799048 0.899252936731 -32.6842979523 42.5159418283 1.75048647365 -2.0305702412 -20.0217161555 26.1851106733 0.566551802415 -1.78746290563 -11.310336279 8.56248909773 0.552530642118 -0.0934683007326 -2.63927303352 3.46634753447 0.371918686893 -0.162905491905 4 1 2 6 2 5 3 4 3 4 3 5 3 4 3 4 2 4 3 4 3 4 3 4 4 2 4 4 3 3 4 3 5 2 4 4 2 5 2 6 3 1 2 1 147.0 0.333333333333 80.0 0.6625 0.271137026239 0.25267249757 0.0272788832318 0.2960444486 0.0580587642526 0.00205196887127 0.0126340719445 0.000927958916025 0.393761471505 1.0 0.047619047619 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 3.0 11.0 0.0645161290323 0.0 10.0 1.0 0.544217687075 0.25 0.0 0.0 0.166666666667 0.583333333333 0.333333333333 0.416666666667 0.5 0.833333333333 0.833333333333 0.916666666667 0.833333333333 0.916666666667 1.0 1.0 0.916666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.24332681691 4.78980590638 -4.03990282807 11.9117464762 1.50545006099 1.16558955407 -2.03608387465 20.498992576 -1.71181482779 3.26011501148 -4.6221886959 34.531492012 1.65614910878 -0.42801958007 -1.90023278834 34.2674402923 -1.81220908904 -0.891061701148 -8.29586312938 23.728911213 0.945874428249 -0.541179085641 -6.65046846488 18.7139748968 -0.12385171278 0.132971496163 1 1 2 4 5 2 4 1 7 2 12 3 4 4 4 2 4 5 3 3 2 6 3 3 2 7 2 3 2 6 3 3 2 6 3 3 2 6 3 2 3 6 3 2 3 6 4 1 5 2 6 8 5 1 0 196.0 1.0 98.0 0.69387755102 0.24416909621 0.215014577259 0.103022018887 0.0932418677592 0.0604738459315 0.0299026034092 0.0155887365905 0.0143269805782 0.0021406369417 0.428571428571 0.857142857143 1.0 2.0 2.0 1.0 2.0 3.0 3.0 3.0 3.0 7.0 0.315789473684 1.0 1.0 2.0 0.5 0.8125 0.625 0.5 0.6875 0.5625 0.375 0.25 0.375 0.75 0.0625 0.0 0.125 0.8125 0.75 0.6875 0.8125 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.00040249943 4.36539272481 -1.34023549573 12.5505801744 -5.24422497617 3.15154627837 -16.5521438813 24.6052283421 2.11248902331 0.691353845734 -8.46396208944 28.856277123 1.49307341748 -0.207039816917 0.846354880693 27.2204730211 -2.15890276052 0.0278576318206 -14.7291630177 26.6649446478 -0.907056987064 0.142337805146 -28.0943014382 27.8900303879 -0.0579760520431 0.016668678229 9 1 9 5 5 1 4 5 2 3 4 4 1 31 1 5 1 4 9 4 9 5 8 5 7 1 1 4 5 3 1 12 3 8 7 1 1 2 4 0 195.0 0.866666666667 104.0 0.615384615385 0.239053254438 0.256068376068 0.0811765538866 0.107825688228 0.0472935821575 0.0219580359068 0.00640822054329 0.00458151060087 0.0182082433158 0.923076923077 0.4 0.0 2.0 6.0 3.0 1.0 1.0 0.0 1.0 5.0 10.0 0.194444444444 1.0 2.0 1.0 0.533333333333 0.1875 0.8125 1.0 0.875 0.25 0.8125 0.4375 0.625 0.5 0.75 0.1875 0.25 0.6875 0.9375 0.1875 0.5 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.25 0.25 0.0 0.5 1.0 0.75 0.25 0.0 0.5 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.5 0.75 0.25 0.5 1.0 1.0 0.5 0.0 -10.6103295395 5.00807554262 -25.7257071266 12.2626222814 -0.3010504168 1.2109922781 -28.1830310541 23.0426873177 0.144505876758 4.7650052061 -26.0146963758 41.3863659548 -0.373374130297 -2.4326578689 -24.4276353499 27.5594361333 1.54958349584 -2.52863337593 -11.9362804937 3.45781511331 0.6359063053 0.069654199815 -1.99308226762 -4.50471479919 0.142690402582 -0.457682298545 1 2 3 19 25 4 2 4 1 4 1 3 3 2 2 3 3 2 2 3 3 2 2 4 1 9 110.0 0.227272727273 61.0 0.55737704918 0.24 0.278099173554 0.0174876033058 0.524087903832 0.0572231404959 0.00162451113553 0.0198946022408 0.00203704309338 1.1218587729 2.0 195225785.955 2.0 4.0 1.0 1.0 0.0 4294967291.0 0.0 0.0 5.0 5.0 0.12 0.0 7.0 1.0 0.554545454545 0.666666666667 0.166666666667 0.5 0.333333333333 0.833333333333 0.166666666667 0.916666666667 0.833333333333 0.75 0.166666666667 1.0 1.0 0.666666666667 0.0833333333333 0.666666666667 0.666666666667 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 -2.77797718851 0.318309886184 -4.92502072433 4.97126334898 1.98877912359 5.73633396505 -1.85813962457 21.3280015921 -1.8969688844 -2.16183174974 -3.35534364094 17.4526308577 2.4135822805 0.94992033217 2.70723164511 18.6600936656 -1.96264203233 0.205301253948 -1.56279551756 20.5605447584 1.46946536312 -0.998089055098 1.66344532537 8.69872141572 -0.30222526121 -0.375051891555 1 4 1 6 1 4 2 3 29 1 2 5 2 3 3 4 3 3 3 3 3 3 2 4 2 4 3 3 2 11 1 5 126.0 0.285714285714 66.0 0.651515151515 0.22619047619 0.281934996221 0.0202146996365 0.4402372354 0.0625832343519 0.00209535419196 0.0221274507673 0.00385534584674 0.796382125937 1.66666666667 204522252.0 2.0 3.0 1.0 2.0 4294967295.0 4294967293.0 0.0 0.0 3.0 2.0 0.208333333333 0.0 7.0 1.0 0.52380952381 0.416666666667 0.25 0.25 0.5 0.666666666667 0.333333333333 0.75 0.916666666667 0.666666666667 0.416666666667 1.0 1.0 0.583333333333 0.333333333333 0.916666666667 1.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -3.18309886184 -4.48665363383 -5.19820711255 -5.39031045532 2.82880253242 8.00239509134 -0.551815768765 21.432987321 -2.74605304958 0.852789394701 -4.26636341799 32.6117551903 2.89271420005 -0.211915824673 2.6507284864 30.0521293595 -2.21440612794 -0.0289968423212 -2.51459796996 26.6330369665 1.25831542915 -1.25616947334 -2.41095583936 12.4353713155 -0.322801127586 -0.322281432739 1 8 3 9 3 2 4 3 3 2 4 4 8 4 8 4 7 5 3 3 3 3 2 3 4 3 2 3 3 5 1 3 2 19 2 2 3 4 1 0 156.0 0.923076923077 89.0 0.550561797753 0.258547008547 0.28057199211 0.0837589979602 0.123011545626 0.0610059593048 0.0152016609801 0.00828683139794 0.00919766028614 0.00909312642563 0.75 0.538461538462 3.0 5.0 1.0 0.0 1.0 1.0 2.0 2.0 1.0 13.0 0.15625 1.0 2.0 1.0 0.570512820513 0.75 0.166666666667 0.666666666667 0.833333333333 0.5 0.0 0.333333333333 0.583333333333 0.666666666667 0.416666666667 0.25 0.5 1.0 1.0 0.833333333333 0.916666666667 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.25 1.0 0.5 0.0 0.0 0.0 0.25 0.25 0.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.146912255162 -2.44853758603 -2.9455906686 -5.2919095966 -4.3004433508 1.27208047369 -13.82383384 1.3754147266 2.62384022343 2.38087938558 -7.09917555952 13.7903062137 -0.975818357129 0.128562187382 -7.25297087204 19.2621005443 0.125937109894 0.832104780537 -9.78357949623 23.7452075208 -0.1719478206 -0.21157538552 -10.0697826996 24.8491428176 -0.0651291071556 0.123637101178 2 4 2 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 4 3 4 3 4 3 4 4 3 4 3 4 3 3 4 3 4 2 13 147.0 0.333333333333 81.0 0.567901234568 0.282798833819 0.278911564626 0.027624544195 0.346337174326 0.0626392442302 0.00145631873999 0.0118381199228 0.000925717442489 0.492953957878 0.428571428571 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 11.0 1.0 0.551020408163 0.0833333333333 0.0 0.0 0.25 0.333333333333 0.166666666667 0.333333333333 0.5 0.75 0.666666666667 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.87954408985 -0.848826363157 -3.72637092469 -0.672403182401 0.743238632852 2.38892239816 -3.87100646871 10.1428858723 -1.49900265261 2.79432568558 -6.59263439135 26.8907980964 1.47217936269 1.15548202634 -3.67987197833 36.6163153443 -1.40612769143 -0.0198594851231 -6.99612620136 36.4119333439 1.14215203103 -0.476066864602 -3.70650710463 29.8488107467 -0.243764689453 -0.216334894601 4 7 6 4 2 4 3 3 5 4 1 3 7 3 1 2 8 6 8 6 9 2 1 3 8 2 1 3 7 3 1 4 6 3 2 4 4 3 3 5 1 5 4 8 7 7 3 0 196.0 1.0 94.0 0.670212765957 0.236516034985 0.230685131195 0.103342755782 0.101433474785 0.0569292716045 0.0342201045955 0.011786037007 0.00899525759479 0.00635320559371 0.642857142857 0.785714285714 0.0 3.0 3.0 2.0 2.0 3.0 3.0 2.0 1.0 10.0 0.194444444444 0.0 2.0 2.0 0.479591836735 0.375 0.6875 0.75 0.5 0.625 0.0625 0.25 0.8125 0.375 0.0 0.0 0.4375 0.6875 0.4375 0.375 0.6875 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.75 1.0 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.22816920329 -4.50181124746 -8.00925286802 -6.1349012532 -4.1923175243 7.52389913188 -24.3775273169 22.8615193961 -1.64746719964 3.87565534206 -33.3727123248 45.857461342 1.02139753491 -1.24772955697 -25.8245347131 41.2018480834 1.17548203783 0.0327374176606 -13.0602977006 38.2355529776 0.68182066257 0.21587774277 -4.24983396951 39.4724579007 0.038680605275 -0.0168507220046 3 3 7 6 4 2 2 4 2 2 4 4 1 2 5 3 8 3 7 4 5 6 3 3 2 3 2 3 3 3 1 2 5 3 1 3 3 9 2 5 1 2 4 3 10 1 1 0 165.0 0.733333333333 79.0 0.911392405063 0.236914600551 0.227878787879 0.0717500069566 0.125772101177 0.0612371650388 0.0160865296174 0.0121926302229 0.0118953934427 0.04275655986 0.909090909091 0.6 2.0 4.0 3.0 0.0 1.0 2.0 2.0 3.0 3.0 7.0 0.206896551724 1.0 2.0 2.0 0.478787878788 0.416666666667 0.333333333333 0.25 0.833333333333 0.5 0.0 0.5 0.416666666667 0.666666666667 0.166666666667 0.416666666667 0.166666666667 0.666666666667 0.833333333333 0.833333333333 0.833333333333 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.75 1.0 0.75 0.25 0.0 0.25 0.75 0.5 0.5 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 -1.69765272631 1.61277009 -8.21423229217 5.32628725042 -5.56830094231 2.51026249798 -23.8138931318 16.1410825834 2.52969538202 1.46037536773 -17.3506793406 21.4389749999 -0.462061110894 -1.55761821999 -13.0621612143 15.5486439037 0.759264811193 0.743990748694 -8.21975733289 13.3197193698 0.599727335402 -1.4777811087 0.694695852712 3.36089238691 0.124957764268 -0.0681688232812 2 2 3 5 1 5 2 3 27 2 3 4 1 5 3 3 3 4 2 3 3 3 3 4 2 3 3 3 3 3 2 5 1 5 126.0 0.285714285714 62.0 0.693548387097 0.239417989418 0.263038548753 0.0224862725808 0.409764964187 0.0671573744136 0.00223913350672 0.0247760208125 0.00358361346062 0.691695603243 1.33333333333 204522252.0 0.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 2.0 7.0 0.173913043478 0.0 5.0 2.0 0.492063492063 0.166666666667 0.25 0.166666666667 0.166666666667 0.5 0.416666666667 0.583333333333 0.666666666667 0.666666666667 0.5 1.0 1.0 0.583333333333 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -2.06143545338 -2.1826963624 -3.20465723328 -0.43807156088 1.96574657279 7.0925258216 -0.394502932977 23.2115394211 -2.2459346488 0.341592618567 -4.19848297388 30.5564314409 2.21679945687 -0.22378551131 1.04154995597 28.1387981228 -1.72267890671 0.226592274792 -3.32302806943 25.9363232317 0.999844373762 -1.44952778009 -1.52498751117 11.6080624922 -0.143474128289 -0.24537154975 2 2 5 3 5 4 3 7 1 12 4 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 4 7 2 5 2 0 128.0 0.5 65.0 0.492307692308 0.1357421875 0.2431640625 0.0211215019226 0.203275680542 0.0290651321411 0.00488607558679 0.00915402944458 0.00326442224823 0.253825815309 0.5 0.0 0.0 1.0 2.0 1.0 0.0 0.0 0.0 0.0 3.0 4.0 0.130434782609 0.0 2.0 1.0 0.5078125 0.5 1.0 1.0 1.0 0.875 1.0 1.0 1.0 1.0 0.875 0.5 0.5 0.75 0.625 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 -11.6183108457 2.38732414638 -22.9013392557 5.1586863286 7.16321583713 -0.719927437892 -2.27042035756 4.31676337996 -1.24458310662 1.27485207651 -0.93640609878 11.4684746951 -0.789560078116 1.48501100188 -5.80635310432 20.7096318592 1.51960736263 -0.737559266485 2.67968885929 16.1473520654 -0.811307032419 -0.456315548634 -1.07822365867 11.2499717425 -0.0407990522808 0.137481074066 3 1 6 4 3 6 2 6 2 6 3 6 3 4 4 4 3 5 2 5 2 5 3 0 88.0 0.727272727273 52.0 0.596153846154 0.267045454545 0.284090909091 0.0542824943651 0.133474302686 0.0490056818182 0.00597162868946 -0.00128035184378 0.000147979577791 0.0406237963824 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.0 0.0 6.0 3.0 0.590909090909 0.166666666667 0.5 0.166666666667 0.0 0.5 1.0 0.5 0.166666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.34058935705 3.47247148564 -10.3534076335 8.40163818197 0.239629230621 0.0286981114516 -9.30885995929 8.60376977933 0.796040548517 -0.413395109588 -4.83724008051 5.76772002693 -0.33613160418 -0.104401851666 -5.90098940283 3.63843643103 -0.111817296051 -0.455781073337 -6.84496550685 -0.92120235198 0.224193344229 -0.498886285238 -4.83375835348 -7.04771890377 0.0328581067944 -0.1020873833 4 5 6 9 2 5 2 4 2 4 3 4 4 1 5 4 9 3 10 3 6 7 3 1 1 3 1 5 2 3 4 3 2 4 4 4 2 4 2 6 1 6 1 5 3 2 8 0 182.0 0.928571428571 95.0 0.778947368421 0.249788672866 0.246075353218 0.0856742430375 0.107382880976 0.0575707199454 0.0186928756228 0.00866746507658 0.00857084642952 0.00602439604645 1.07692307692 0.642857142857 3.0 5.0 4.0 2.0 1.0 2.0 3.0 3.0 2.0 9.0 0.222222222222 0.0 3.0 1.0 0.521978021978 0.625 0.3125 0.3125 0.8125 0.625 0.0625 0.4375 0.5 0.8125 0.5625 0.6875 0.625 0.375 0.5625 0.5625 0.8125 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 -1.45513090827 0.318309886184 -7.93336393921 2.4544045207 -6.15460981099 2.69797789098 -26.3033344987 12.8597489068 1.93050296415 0.963023767411 -22.1761137478 17.2829904383 -0.0248413689874 -1.37852607624 -17.4686531533 8.36051903031 -0.0312553137378 -0.685272964991 -18.0948654947 -0.79169901022 0.109311802951 -0.528905968857 -17.022736255 -7.15172678613 -0.0915367594292 -0.138135008479 2 4 12 5 12 5 13 4 13 4 14 3 14 3 14 3 14 3 14 10 7 4 2 5 6 3 5 3 6 3 5 3 6 3 6 3 4 3 6 4 4 4 6 3 4 4 5 4 4 4 6 3 4 4 6 3 3 5 5 5 1 7 3 7 2 5 3 7 2 4 4 7 391.0 0.739130434783 154.0 0.616883116883 0.166240409207 0.228733459357 0.0525387321711 0.152088168604 0.070085485642 0.0183599991293 0.0244817766242 0.0200499199992 0.10741606675 0.470588235294 0.565217391304 2.0 2.0 4.0 0.0 0.0 0.0 5.0 5.0 2.0 7.0 0.148936170213 0.0 1.0 2.0 0.393861892583 0.633333333333 0.4 0.466666666667 0.7 0.4 0.533333333333 0.4 0.433333333333 0.0 0.3 0.4 0.333333333333 0.0 0.1 0.5 0.7 0.555555555556 0.444444444444 0.111111111111 0.0 0.0 0.0 0.111111111111 0.333333333333 1.0 1.0 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.777777777778 1.0 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.888888888889 0.777777777778 0.555555555556 0.555555555556 0.0 0.0 0.0 0.0 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.777777777778 0.555555555556 0.555555555556 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.888888888889 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.333333333333 -11.016289974 -16.2753228762 -25.5054121069 -40.1754867626 2.3572773884 -0.44454027994 -14.1895587274 -37.0229956496 3.13286861846 5.49332794699 -6.12516000267 -13.9918546503 -6.02034153976 -3.10550485477 -29.1342250977 -18.6675822374 3.83933105046 2.14778008442 -15.757883844 -14.4097126242 -1.0475245436 -1.62780630028 -14.8674719702 -21.0568656051 -0.147339914957 0.0856177072603 1 6 2 1 3 7 8 6 4 1 1 1 3 3 4 6 3 2 4 7 8 7 7 8 7 8 3 1 4 7 3 1 4 7 3 1 4 6 3 3 4 5 3 4 4 3 2 9 3 6 0 210.0 1.07142857143 94.0 0.755319148936 0.206349206349 0.197619047619 0.101045243494 0.0756364323507 0.048246409675 0.0404473063569 0.010000707374 0.0129718714102 0.00357085169709 0.466666666667 0.928571428571 0.0 2.0 2.0 1.0 3.0 3.0 3.0 3.0 2.0 10.0 0.138888888889 2.0 2.0 2.0 0.447619047619 0.25 0.875 0.875 0.5625 0.625 0.4375 0.375 0.6875 0.5625 0.0 0.0 0.0625 0.6875 0.3125 0.25 0.4375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -5.34760608789 5.72957795131 -16.2716161956 17.2423803315 -5.31591657033 5.23386335522 -36.9195042593 36.1039295679 -1.77745497966 -0.0393226672236 -48.0333517747 34.1160903932 -0.180508820171 -3.05795656577 -50.8999836999 12.1032714655 -0.894205237517 -0.738017571446 -57.3018205829 3.99355333142 -0.382450000969 1.49139681546 -61.7660117818 18.799301368 -0.0279178233324 0.350780885179 0 13 3 5 3 5 3 3 6 4 2 3 6 4 2 3 6 4 3 2 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 4 6 3 2 4 5 3 3 6 1 3 5 4 11 4 11 3 13 2 13 3 11 4 10 6 8 7 8 0 300.0 0.75 123.0 0.634146341463 0.174888888889 0.164166666667 0.059115962963 0.100432407407 0.0294112962963 0.0228009257176 0.00379688239002 0.00285311698632 0.052526718422 0.8 0.55 4.0 2.0 2.0 1.0 4.0 5.0 2.0 0.0 6.0 10.0 0.132075471698 2.0 2.0 2.0 0.41 0.65 0.45 0.5 0.4 0.65 0.5 0.75 0.65 0.25 0.0 0.15 0.0 0.7 0.3 0.35 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.333333333333 0.5 0.5 0.5 0.5 0.166666666667 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.0 0.0 0.0 0.333333333333 0.666666666667 0.333333333333 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 -8.27605704078 8.21239506354 -16.2177718796 21.0495620609 5.21041452694 1.93325509374 -1.53088474383 29.2730401572 -1.34028356451 0.845817008441 -3.81917917604 36.683177059 -1.34696897732 2.52003051711 -12.3092069327 51.6033550927 1.31205206691 0.307981001572 -4.04979899442 59.2678687401 0.186268928837 0.622338589812 0.62063709548 62.4103790075 -0.0611140126581 -0.0900776708984 7 1 9 8 4 2 4 4 2 3 4 4 2 3 1 7 1 16 9 4 9 4 10 3 10 4 9 4 5 2 3 10 4 8 9 2 4 0 195.0 0.866666666667 89.0 0.775280898876 0.202761341223 0.208547008547 0.0720880662182 0.0998236652675 0.0438685749928 0.0228339237085 0.0104794904782 0.00576465835402 0.0314696835101 0.923076923077 0.266666666667 0.0 3.0 6.0 3.0 1.0 2.0 0.0 1.0 1.0 14.0 0.25 1.0 3.0 2.0 0.45641025641 0.1875 0.6875 0.9375 0.6875 0.4375 0.625 0.25 0.5625 0.4375 0.5625 0.0 0.25 0.6875 0.75 0.0 0.3125 0.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 -10.0161510852 5.68713663315 -23.3801187726 16.0072751862 1.28116192412 4.0494676365 -18.6574347356 34.6284821033 1.79934422049 3.39635338641 -7.1919108662 49.383649595 -0.1348780387 -2.13774303453 -4.23695080437 33.967863866 0.683642271156 -2.76543598925 0.679078070175 8.85318049552 0.094837845705 -0.0166504871572 1.74403378076 -0.342884732801 -0.125990296134 -0.443965539556 8 4 5 4 4 13 1 8 2 6 3 7 2 4 2 5 5 4 5 3 3 3 6 3 6 3 3 3 6 4 5 4 2 3 6 3 6 4 2 3 6 3 6 4 2 3 6 4 5 4 2 3 5 4 6 4 2 3 5 5 5 10 4 5 3 6 1 5 4 6 3 5 12 2 10 0 336.0 1.71428571429 167.0 0.682634730539 0.253844246032 0.21768707483 0.187837831995 0.0517222762121 0.0571722984829 0.0754961974413 0.00830691289242 0.0152134737336 -0.0359402638681 0.375 1.71428571429 2.0 1.0 4.0 2.0 4.0 6.0 6.0 6.0 4.0 7.0 0.25 0.0 1.0 3.0 0.497023809524 0.625 0.583333333333 0.5 0.708333333333 0.541666666667 0.0416666666667 0.0416666666667 0.25 0.708333333333 0.583333333333 0.583333333333 0.833333333333 0.625 0.166666666667 0.166666666667 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.833333333333 1.0 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.833333333333 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.166666666667 0.166666666667 0.0 0.166666666667 2.12206590789 11.5122075503 3.83609743477 26.0650311318 -2.63158277432 -3.11070546758 -9.31683577152 12.5229263924 -3.3246364416 -3.78466683544 -21.4451739988 -4.94643281521 3.20687564597 3.18884384995 -9.57988639382 7.57787871528 -1.47403559728 -0.890002911891 -12.338870957 6.75821069097 0.0789458989899 -0.28067616776 -16.4964258634 4.35707821627 0.101775070908 0.319695540388 6 1 1 2 8 5 3 3 4 3 1 3 5 3 1 6 2 3 1 5 7 2 9 3 9 3 9 3 9 4 9 4 6 1 2 5 1 3 4 7 2 0 168.0 0.857142857143 69.0 0.869565217391 0.164682539683 0.196428571429 0.0620005938883 0.108967545351 0.0383715986395 0.0239650079601 0.0132931816358 0.00683680023957 0.0578680029987 0.916666666667 0.428571428571 0.0 4.0 4.0 3.0 2.0 2.0 0.0 2.0 2.0 5.0 0.259259259259 1.0 2.0 1.0 0.410714285714 0.25 0.666666666667 0.916666666667 0.75 0.416666666667 0.75 0.333333333333 0.75 0.25 0.416666666667 0.0 0.333333333333 0.416666666667 0.0833333333333 0.0 0.166666666667 0.0 0.0 0.25 0.5 0.5 0.5 0.75 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.5 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.25 0.5 1.0 0.5 0.0 0.0 0.5 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.75 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -10.7315904485 1.00040249943 -25.610985301 2.92216351463 0.499273232556 1.20363825767 -23.8412802739 10.4375801827 1.57539435667 2.98656755411 -14.1564862429 25.3025412151 -0.39272847516 -0.106132831412 -13.189545571 23.3284338755 0.561359689875 -2.51523418397 -7.40222182081 2.49414222254 1.07186030622 -0.470852350917 3.56395680835 -5.93598350014 0.0117254289886 0.142429123617 2 2 10 6 8 6 9 5 9 5 9 4 10 4 10 4 10 4 4 1 1 2 2 4 2 6 2 4 4 2 5 3 11 3 11 3 2 1 8 6 8 7 7 8 5 4 1 6 4 3 2 5 3 3 4 6 1 4 3 6 2 1 9 1 1 0 308.0 0.636363636364 129.0 0.759689922481 0.149350649351 0.220779220779 0.0357296186694 0.158855986314 0.0582623545286 0.0110948736603 0.0222839618107 0.0139547541359 0.137198344176 0.714285714286 0.454545454545 2.0 2.0 3.0 3.0 0.0 3.0 1.0 4.0 4.0 6.0 0.15 2.0 1.0 1.0 0.418831168831 0.791666666667 0.75 0.541666666667 0.625 0.625 0.5 0.666666666667 0.666666666667 0.0 0.208333333333 0.291666666667 0.75 0.0 0.375 0.0833333333333 0.625 0.666666666667 0.666666666667 0.5 0.5 0.5 0.166666666667 0.0 0.0 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.666666666667 1.0 0.333333333333 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.333333333333 0.833333333333 -15.7418707349 -6.19257414939 -31.7606556041 -10.6891356657 8.51807778069 6.15694066101 -8.83983171585 8.77287691638 -2.82959426005 -0.202359238359 -14.9351399767 12.5190778587 -2.11134541201 -0.874530856046 -28.8073010765 8.39785078683 1.831390252 1.33742838749 -22.3897162867 13.5953934356 -1.88933111571 -1.28342509121 -32.8002063261 5.56363995292 0.0825899588482 0.0157946535341 3 7 5 2 4 4 3 1 6 3 2 12 1 14 11 2 11 2 12 2 11 2 11 3 6 2 3 9 5 7 3 0 169.0 1.0 72.0 0.847222222222 0.184342284934 0.182521620391 0.0772535229797 0.0867446795595 0.0395302569462 0.0271975085155 0.0117770116822 0.00707898528347 0.0264346003654 1.23076923077 0.230769230769 1.0 6.0 6.0 3.0 2.0 0.0 0.0 1.0 3.0 9.0 0.166666666667 0.0 2.0 6.0 0.426035502959 0.4375 0.625 0.5 0.5 0.5625 0.5 0.0 0.5625 0.6875 0.5 0.0 0.5 0.6875 0.5 0.0 0.3125 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.25 0.5 0.75 1.0 0.75 0.5 0.5 0.75 0.75 0.75 0.75 1.0 0.5 0.0 0.0 0.25 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.0 -4.50530915829 1.76294706194 -12.6062652623 3.78474014221 -2.73540767007 -0.319903608873 -23.2197661686 5.74040560978 -0.575317602056 2.60599635895 -26.0628893561 18.9760749302 0.60614890813 0.944358867501 -21.0975895643 24.100871564 0.504243999396 -2.03737342933 -15.3680847902 8.79997012954 0.220508744506 -0.415186782613 -11.4188435602 1.91202997316 0.124299360129 0.176190512675 6 7 4 2 1 8 2 12 1 5 2 1 2 3 1 5 8 5 9 6 9 5 9 5 9 6 8 7 4 2 2 11 4 8 3 0 182.0 1.07692307692 98.0 0.520408163265 0.222919937206 0.244294167371 0.0846920860808 0.0953500068341 0.037771158922 0.0262502090964 0.00888984486225 0.000691064996105 0.00569556409687 0.642857142857 0.307692307692 0.0 1.0 3.0 3.0 1.0 2.0 0.0 1.0 3.0 7.0 0.375 0.0 2.0 1.0 0.538461538462 0.375 0.875 0.8125 0.5625 0.6875 0.6875 0.8125 1.0 0.8125 0.0625 0.0625 0.6875 0.875 0.125 0.0 0.4375 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.5 0.75 0.75 0.5 0.25 0.25 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -13.5054337424 2.1826963624 -30.2244268338 8.78517860555 3.14528216253 5.2340167874 -22.7752585941 26.6860419273 -0.829981143923 -0.0732944165842 -22.3746906614 28.3049895374 -0.943703703148 -0.976052194922 -27.1069932222 21.6615352787 1.14228930079 0.626952639358 -19.090355992 25.114140042 0.384460015708 0.559593010784 -9.71392479811 33.4841916294 0.379243556194 0.269990501687 0 5 3 5 2 4 4 5 2 3 5 4 2 3 5 3 2 4 5 3 3 3 5 3 3 2 6 3 3 2 6 3 3 2 6 3 3 2 6 3 4 3 4 4 3 6 1 4 5 3 6 0 182.0 1.07692307692 85.0 0.729411764706 0.240973312402 0.196534234996 0.114677979912 0.0802122494098 0.0579417865072 0.0379458231177 0.0141276422519 0.0114546673214 -0.00563416778356 0.285714285714 0.923076923077 1.0 1.0 1.0 0.0 3.0 3.0 3.0 3.0 1.0 4.0 0.161290322581 0.0 0.0 2.0 0.467032967033 0.6875 0.5625 0.5 0.25 0.5 0.4375 0.25 0.625 0.1875 0.0 0.0 0.3125 0.875 0.75 0.75 0.5625 0.75 0.25 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.75 0.5 0.75 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.409255567951 1.54607659004 -1.48992748103 6.41868403736 -3.13136190512 4.25356665692 -8.06741489552 22.7603345283 3.44500092942 1.49799488458 6.62374496832 30.9890292259 0.5870053928 -1.08258401622 11.3358897459 24.8109090343 -2.14962293358 0.0280534911276 -3.93154112131 24.2131124312 0.130613735788 0.88376812876 -8.03357964733 32.5678506285 -0.0248218065014 0.0898031931035 8 5 6 7 5 8 4 9 4 3 9 4 9 3 10 4 9 4 8 7 6 8 5 5 9 3 10 3 10 3 10 4 9 4 9 3 10 4 8 5 7 8 4 9 10 3 10 3 4 0 312.0 0.541666666667 119.0 0.621848739496 0.164940828402 0.17374465812 0.0322825198819 0.154113214937 0.0354141577214 0.00750845637006 0.0140038412934 0.000960572177683 0.135401328173 0.692307692308 0.0 1.0 0.0 7.0 1.0 0.0 0.0 0.0 0.0 2.0 6.0 0.216216216216 1.0 4.0 2.0 0.38141025641 0.0416666666667 0.333333333333 0.333333333333 0.375 0.541666666667 0.958333333333 0.875 0.958333333333 0.666666666667 0.416666666667 0.25 0.291666666667 0.666666666667 0.0416666666667 0.0416666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.833333333333 1.0 0.833333333333 0.5 0.833333333333 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.833333333333 0.5 0.0 0.333333333333 0.833333333333 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -9.97370976709 5.35821641743 -14.2165285581 14.5192729792 12.6826595276 3.45084389631 16.5459860114 33.3561203385 -7.20164732468 4.75192973565 3.93642129819 50.2782255241 4.14839925476 -3.70482711044 10.3336125895 34.3605101693 -1.98060533153 0.275166526154 6.86195591106 25.8949786949 -0.0452201853008 -0.377254003455 1.3651604472 25.353318819 0.271532549573 0.000999773967762 1 2 2 4 2 5 11 2 13 1 6 3 4 2 4 5 3 3 3 5 3 3 3 5 3 3 3 5 3 3 3 5 3 3 3 4 5 2 3 5 4 1 4 5 4 1 4 4 5 2 4 3 1 1 2 1 0 196.0 1.0 108.0 0.583333333333 0.262390670554 0.247813411079 0.103006612891 0.0974806415694 0.0593253023825 0.0280522414019 0.00975112723504 0.0112567098091 -0.00770604905281 0.285714285714 0.928571428571 1.0 1.0 2.0 0.0 1.0 3.0 3.0 3.0 2.0 10.0 0.105263157895 0.0 1.0 2.0 0.551020408163 0.8125 0.6875 0.5 0.625 0.75 0.5625 0.5 0.5 0.6875 0.0625 0.0625 0.125 0.75 0.8125 0.8125 0.875 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.13641852265 5.13843101982 -2.76542220468 14.0646917435 -3.18356287042 2.53116680632 -10.5099300799 23.4513314508 2.5527195314 0.192563560884 -0.43288709745 26.0067020325 0.483683964688 0.690592560519 5.83207251015 30.3129908999 -0.481434888291 0.676522060071 2.83524788767 36.9659667478 0.0570888923467 0.447865136298 0.0238572685041 41.4351680402 -0.204405183064 -0.0418586725654 2 7 4 3 1 5 2 3 3 4 3 1 4 4 9 3 8 4 7 5 5 7 3 2 4 3 3 1 5 3 2 3 3 10 1 7 1 4 2 4 1 0 156.0 0.923076923077 83.0 0.650602409639 0.258012820513 0.261834319527 0.084876631012 0.122105427856 0.0615114360492 0.0153608385175 0.00956636139967 0.00869327061322 0.0114411573953 1.0 0.615384615385 4.0 6.0 2.0 0.0 2.0 1.0 1.0 3.0 3.0 11.0 0.243243243243 0.0 3.0 1.0 0.532051282051 0.583333333333 0.0833333333333 0.25 0.75 0.5 0.0 0.25 0.5 0.583333333333 0.333333333333 0.416666666667 0.333333333333 1.0 0.916666666667 0.833333333333 0.833333333333 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.5 1.0 0.75 0.5 0.25 0.25 0.75 1.0 0.5 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.76294706194 -1.46912255162 1.65055134147 -3.40056820568 -3.49112199248 0.596342053497 -7.66278180221 1.1192091744 1.67603730867 2.29564994241 -3.22054749465 12.2811954033 0.0880715433331 0.170736327239 1.37201822176 18.9052151951 0.50171982169 1.21492828129 6.67005989372 25.7097178842 0.908610065103 -0.461570484837 14.916761588 24.9297327517 -0.088425375896 0.0701880424824 3 6 6 8 3 11 2 4 3 4 3 1 6 3 10 4 9 3 7 7 3 4 2 3 3 4 3 3 2 4 4 4 1 5 2 19 2 1 1 1 4 2 2 0 182.0 0.928571428571 101.0 0.643564356436 0.259087066779 0.268838304553 0.0856881766947 0.116376061446 0.0580192510062 0.0171757411645 0.0071369921765 0.00839947451638 0.00539031404973 1.07692307692 0.571428571429 3.0 5.0 4.0 2.0 0.0 2.0 2.0 2.0 5.0 14.0 0.166666666667 0.0 3.0 2.0 0.554945054945 0.6875 0.3125 0.3125 0.9375 0.8125 0.0625 0.4375 0.5625 0.875 0.5625 0.625 0.6875 0.3125 0.5625 0.5625 0.8125 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 -0.909456817668 0.2728370453 -6.49448460231 2.75880562701 -5.96807836166 3.42855940089 -24.2827926492 16.4060864162 1.68792117221 1.6481158647 -22.6122001543 24.833217551 -1.01816486288 -0.999629123617 -25.7817575209 20.6178051111 -0.886641212148 0.122007624374 -34.6482044638 16.9245652833 -0.0377456717128 -0.673681899306 -35.7292240202 11.6118200792 -0.0162271303795 -0.135286331025 7 3 7 7 4 8 3 5 1 2 4 4 8 3 9 2 9 3 9 3 7 5 8 4 9 3 9 3 9 3 9 3 9 3 9 3 9 3 9 3 9 4 7 7 5 1 1 5 4 0 264.0 0.545454545455 90.0 0.677777777778 0.125946969697 0.156163911846 0.024620722984 0.149261152764 0.0265753153957 0.00678653707831 0.0127479086948 0.000562645790708 0.14907573435 0.333333333333 0.0909090909091 1.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 6.0 0.172413793103 0.0 3.0 2.0 0.340909090909 0.0 0.388888888889 0.388888888889 0.388888888889 0.388888888889 0.888888888889 1.0 1.0 0.722222222222 0.388888888889 0.333333333333 0.5 0.611111111111 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.666666666667 0.5 0.5 0.0 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.666666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -11.488093165 4.19590304515 -19.0070165667 11.1665264847 11.4592754781 1.72607182835 9.76225931104 18.5851947241 -6.00204299974 0.887482179051 -3.35644761727 23.2258135068 1.47019970913 0.0131584770229 -4.47655180045 21.5624073289 0.554857623016 -1.22728459188 0.480578864483 9.24208137498 -1.73272235172 -1.33247759257 -12.0554525709 -7.65873787144 0.20199444597 -0.363188625993 0 7 9 7 9 6 11 5 12 4 13 3 13 3 12 3 14 2 13 3 3 4 6 5 1 6 4 5 2 5 4 4 5 3 4 3 6 3 4 3 6 3 5 2 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 3 5 4 12 4 6 352.0 0.727272727273 139.0 0.625899280576 0.155184659091 0.20867768595 0.0479717985478 0.140843644346 0.0626981005823 0.0170797904189 0.0234455352427 0.0188280237671 0.102075329494 0.5 0.590909090909 5.0 2.0 1.0 0.0 0.0 1.0 5.0 5.0 1.0 4.0 0.0975609756098 1.0 0.0 2.0 0.394886363636 0.75 0.375 0.458333333333 0.5 0.833333333333 0.666666666667 0.708333333333 0.541666666667 0.0833333333333 0.208333333333 0.208333333333 0.0 0.0 0.291666666667 0.666666666667 0.541666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.166666666667 0.166666666667 0.333333333333 0.5 0.5 0.333333333333 1.0 1.0 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.5 0.833333333333 0.5 0.5 0.166666666667 0.333333333333 0.833333333333 0.166666666667 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -10.3884771945 -8.76799050124 -24.1196960172 -21.6341744738 2.22398406203 -0.110129002695 -12.6176581587 -19.2577500498 3.73822449644 2.80403376925 -1.08100883157 -9.19188182609 -5.65387219585 -2.08511757602 -23.3652903337 -9.08482328177 2.95221051273 3.09961347322 -13.0339963768 -0.33586418238 0.0760222879606 -3.19357789553 -7.16150896672 -14.9501381624 -0.496092561462 0.32746304467 3 5 5 9 1 4 2 4 1 3 3 3 1 3 8 3 8 3 8 3 8 3 8 4 7 4 5 1 2 5 1 3 3 8 5 3 1 1 2 0 154.0 0.785714285714 72.0 0.680555555556 0.17414403778 0.211038961039 0.0545582137545 0.12399569144 0.0383879697634 0.0176032334662 0.0149844156154 0.00639320105763 0.071485090005 0.636363636364 0.357142857143 0.0 1.0 2.0 2.0 1.0 1.0 0.0 2.0 3.0 9.0 0.153846153846 0.0 3.0 1.0 0.467532467532 0.416666666667 0.916666666667 1.0 0.75 0.833333333333 0.416666666667 0.416666666667 0.833333333333 0.583333333333 0.0 0.0 0.416666666667 0.75 0.166666666667 0.0 0.416666666667 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -11.5501015844 1.45513090827 -27.6584211467 8.20583360383 0.489529052367 7.33783169112 -25.1493520505 35.7218973117 2.46684480055 2.16745036619 -10.2120447047 48.2641566327 0.182269554201 -1.87626891752 -5.34072762686 36.9730946076 0.0357914077639 -0.261044920297 -5.42041608295 29.7450243675 -0.256633054415 -0.555854382584 -9.57942966946 20.3592653174 -0.251817116289 -0.500654269044 2 4 4 4 1 4 1 3 2 4 1 1 5 3 8 2 7 3 5 5 4 1 2 3 2 2 4 2 1 3 4 2 1 2 4 8 2 4 1 2 5 2 130.0 0.769230769231 64.0 0.890625 0.237692307692 0.229585798817 0.0773095129722 0.130294037324 0.0589203459263 0.0185202152077 0.0123185339918 0.0125109960384 0.0458064633325 1.0 0.692307692308 2.0 4.0 3.0 0.0 2.0 1.0 2.0 3.0 1.0 8.0 0.25 0.0 2.0 1.0 0.492307692308 0.666666666667 0.0833333333333 0.416666666667 0.833333333333 0.5 0.0833333333333 0.333333333333 0.333333333333 0.583333333333 0.416666666667 0.333333333333 0.166666666667 0.75 0.916666666667 0.833333333333 0.75 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.25 0.75 0.5 0.25 0.0 0.0 0.5 0.5 0.0 0.75 1.0 0.75 0.25 0.25 0.75 0.75 0.25 0.5 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.391766013765 0.88147353097 -2.03619217219 2.71414551201 -3.9165010666 1.34742009172 -12.1494357363 10.3433972286 2.20370268805 2.31219242386 -6.71626853207 20.4675220648 -0.731706442955 -0.33664273185 -5.74905575264 25.6566867262 0.470089201849 2.18421408309 -3.36108339877 39.4167911593 0.648133402931 0.245568174347 4.93323793252 50.156613201 0.0676386331652 0.421788632311 4 1 5 4 3 6 2 7 1 7 3 5 4 4 4 3 4 3 3 4 3 3 5 0 88.0 0.727272727273 47.0 0.68085106383 0.258522727273 0.232438016529 0.0629637021037 0.111017033715 0.0470892421112 0.0102723651599 -6.29759331392e-05 0.00259544461669 0.0274423228016 0.375 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.0625 0.0 1.0 1.0 0.534090909091 0.166666666667 0.5 0.166666666667 0.0 0.5 1.0 0.333333333333 0.0 0.666666666667 1.0 0.5 0.166666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 5.78745247607 -7.3949175651 12.8822933386 -1.59370178928 -1.60518103386 -11.2067918822 7.68950894265 1.54886000191 -0.64699615564 -5.45230674901 2.61354155264 -0.442558553439 0.388096498942 -5.39381124591 3.7823454861 -0.0307361045249 -0.320328316534 -6.39522016348 1.05490048982 0.173734139437 -0.542223477321 -4.74327868179 -5.78412136108 0.0124585606537 -0.163698532527 2 2 6 2 5 2 5 3 2 2 1 2 2 4 1 7 1 3 5 3 5 3 4 4 4 5 3 5 3 5 3 5 4 7 2 6 128.0 0.5 70.0 0.528571428571 0.1923828125 0.29150390625 0.031482219696 0.226108074188 0.0490221977234 0.00660752805281 0.0108697756224 0.00529685589453 0.26412156666 0.875 0.125 1.0 2.0 2.0 2.0 1.0 1.0 0.0 0.0 2.0 4.0 0.230769230769 0.0 5.0 1.0 0.546875 0.375 0.75 0.625 1.0 0.75 0.875 1.0 1.0 0.75 0.625 1.0 1.0 0.25 0.5 0.5 0.875 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -9.07183175624 -1.51197195937 -16.328978389 -2.91805204774 7.24403670667 1.35841230725 1.49317434875 4.11660731453 -3.64958681821 2.77982020812 -4.41788390115 21.054092372 1.52269323142 1.25280380847 -2.83543064189 26.801190571 -0.184431816652 -2.3844422364 -0.587067376958 11.0890430119 -0.499014425565 0.0829991166805 -6.30741959309 6.13832648422 0.0364047933993 0.030440949354 8 1 9 9 6 3 4 3 4 3 6 3 2 3 7 3 1 4 7 3 1 3 8 7 8 7 8 7 8 3 2 2 8 3 3 2 6 3 4 4 1 1 1 4 5 8 4 0 210.0 1.07142857143 89.0 0.797752808989 0.201587301587 0.209523809524 0.102242198467 0.086917611489 0.0568556311413 0.0397248276113 0.0125495313184 0.0157920222873 0.0118959662357 0.533333333333 0.857142857143 0.0 3.0 3.0 0.0 1.0 3.0 3.0 4.0 4.0 13.0 0.146341463415 0.0 2.0 2.0 0.42380952381 0.25 0.75 0.75 0.5625 0.5625 0.25 0.0 0.25 0.3125 0.0 0.0 0.125 0.5 0.5 0.5 0.6875 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.75868568026 -12.3280761284 9.7170733885 -12.2717656743 4.7981324888 -56.5413380632 27.7550357486 -2.26703287551 1.04067788817 -72.6523165476 32.0633417545 2.10850443381 -2.52832181563 -61.6862924557 14.0868872591 -1.68117885017 -1.20747847867 -72.5038224408 2.52953398147 -1.9302326216 1.2193289632 -96.2897927139 14.9193397313 -0.47566160342 0.496515759847 1 2 1 4 4 1 3 2 16 1 9 2 8 3 5 6 5 7 4 7 4 6 5 6 5 6 6 4 8 3 8 3 0 154.0 0.785714285714 91.0 0.406593406593 0.226092089728 0.262059369202 0.0532330083477 0.129874784517 0.0261780090377 0.0113577941453 0.00133508156505 -0.00498975425166 0.0548819493404 0.363636363636 0.142857142857 2.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 6.0 3.0 0.0769230769231 0.0 1.0 1.0 0.590909090909 0.666666666667 0.666666666667 0.5 0.75 0.75 1.0 1.0 1.0 0.583333333333 0.833333333333 0.666666666667 0.833333333333 0.916666666667 0.5 0.0 0.25 0.25 0.75 0.75 0.5 0.5 0.5 0.25 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -12.3686127203 4.72917545187 -24.8786219077 11.9501756464 6.66316321516 0.892752508772 -7.08617647076 15.9043037683 -1.61001507851 0.203273636485 -4.05077186635 16.597641597 0.922287398954 0.0710146193242 -3.93166879363 15.5142467954 -0.549269770586 -0.678962864057 -4.18937218781 9.18601826351 0.175686782531 -0.526806122324 -5.3297995106 2.32918879119 0.00102581722594 -0.103309601212 0 4 4 4 2 5 3 4 3 4 4 3 4 3 5 2 3 4 4 3 3 3 5 3 4 2 6 3 2 3 6 3 3 3 4 4 2 4 4 4 3 4 2 6 2 12 3 4 3 3 1 0 182.0 1.07692307692 97.0 0.639175257732 0.249607535322 0.258664412511 0.105467168986 0.100110673049 0.0654619803575 0.029519587405 0.0119603612423 0.0113847125867 -0.00824361912483 0.5 0.923076923077 3.0 1.0 3.0 0.0 3.0 3.0 3.0 2.0 2.0 9.0 0.2 0.0 1.0 2.0 0.532967032967 0.8125 0.625 0.625 0.5 0.4375 0.375 0.375 0.8125 0.3125 0.125 0.125 0.5 0.6875 0.6875 0.875 0.9375 1.0 0.75 0.25 0.25 0.5 0.25 0.25 0.25 1.0 1.0 0.75 0.75 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -3.0012074983 -2.36458772594 -11.7641580879 -3.18790759879 -6.11516908166 3.75754148443 -28.5326288528 9.58098157608 3.53121419714 0.42392392083 -16.260395851 13.6925921254 -0.132282099221 -0.834209134643 -13.3300149334 9.57758191226 -1.49795954023 0.911033422238 -23.0981049074 17.1327889659 0.934878596461 1.13436225078 -17.498550785 29.2632089203 0.106769416784 0.0803800193282 3 3 9 6 10 6 10 5 11 4 11 4 11 3 12 3 12 3 12 9 6 5 1 5 4 3 5 2 5 2 6 3 4 2 6 2 5 2 6 3 4 2 6 3 4 2 7 2 3 3 6 3 3 3 6 3 3 4 5 3 2 5 5 4 4 2 9 0 330.0 0.681818181818 114.0 0.833333333333 0.146060606061 0.172727272727 0.0434800066784 0.123662075298 0.0570670339761 0.0158900997578 0.0233175761842 0.0174883154045 0.0890855174777 0.466666666667 0.5 2.0 1.0 0.0 3.0 0.0 0.0 5.0 5.0 3.0 5.0 0.181818181818 0.0 1.0 2.0 0.345454545455 0.5 0.25 0.25 0.458333333333 0.916666666667 0.875 0.625 0.583333333333 0.166666666667 0.333333333333 0.125 0.0 0.0 0.291666666667 0.583333333333 0.458333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.666666666667 1.0 0.833333333333 0.5 0.833333333333 0.5 0.0 0.0 0.166666666667 0.5 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -7.35006464461 -2.34391825281 -16.7726141725 -6.6157118435 1.54670863178 -0.338099625539 -11.3559611754 -1.21216864587 0.94061667311 5.15853370949 -6.60223382335 17.802978314 -1.35916131965 -2.27224457342 -10.0692219363 18.4032870142 1.60446922475 2.8538452175 -2.32812713185 27.8521326642 -0.663337094896 -1.66385698453 -5.31719307992 24.3614169583 -0.0925077164068 0.31974272297 1 1 1 1 1 1 14 7 4 3 1 2 2 18 3 5 7 3 5 4 7 3 5 4 8 2 5 4 15 4 4 2 9 4 4 3 8 5 1 5 8 11 8 11 8 4 3 4 8 4 4 3 8 4 5 1 9 4 15 4 14 5 14 5 14 5 11 12 7 12 7 0 418.0 0.863636363636 170.0 0.641176470588 0.165575421808 0.186602870813 0.0523688679639 0.101310457757 0.0374337752534 0.0165867317034 0.00742619237804 0.00307255952328 0.0495957439985 0.736842105263 0.590909090909 3.0 0.0 7.0 1.0 6.0 4.0 3.0 0.0 4.0 6.0 0.156862745098 1.0 2.0 1.0 0.406698564593 0.466666666667 0.2 0.2 0.433333333333 0.733333333333 0.866666666667 0.866666666667 0.833333333333 0.2 0.366666666667 0.433333333333 0.133333333333 0.466666666667 0.4 0.433333333333 0.0 0.555555555556 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.777777777778 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.555555555556 0.777777777778 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.555555555556 0.666666666667 0.0 0.0 0.444444444444 0.333333333333 0.0 0.222222222222 0.777777777778 0.888888888889 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.555555555556 1.0 1.0 0.777777777778 0.111111111111 0.555555555556 0.777777777778 0.333333333333 0.111111111111 0.333333333333 0.333333333333 0.222222222222 0.0 -14.989501913 6.25044867415 -30.5864401041 14.3030515442 8.53613367581 0.264740078141 -1.48052714622 24.4242413604 1.67002898229 6.21245332329 8.07469183471 46.2366434162 -4.75365938335 -2.68890672184 -12.0299795433 41.7281244301 3.60359536466 1.00881158543 2.89479965747 35.9290770989 -0.911205529061 -1.37329152049 3.27507030392 35.0142952442 -0.202091818361 0.650554504653 1 5 9 7 10 5 11 4 11 4 11 4 11 3 11 4 12 3 2 3 6 11 5 3 5 3 4 3 5 3 4 2 7 2 4 2 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 3 6 4 2 3 6 4 2 4 5 4 1 6 3 4 2 2 2 1 5 2 2 0 330.0 0.681818181818 129.0 0.720930232558 0.171717171717 0.202341597796 0.0526042797117 0.141962573392 0.0651075493224 0.0191137776348 0.0234000475026 0.0194804709873 0.0986233833725 0.6 0.636363636364 4.0 1.0 0.0 1.0 0.0 1.0 5.0 5.0 3.0 11.0 0.2 0.0 2.0 2.0 0.390909090909 0.5 0.333333333333 0.333333333333 0.541666666667 0.958333333333 0.833333333333 0.583333333333 0.625 0.208333333333 0.291666666667 0.0 0.0416666666667 0.0 0.333333333333 0.333333333333 0.458333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.166666666667 0.166666666667 0.0 0.166666666667 0.5 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.833333333333 1.0 0.833333333333 0.5 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.5 0.333333333333 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 -5.84532700083 -4.48527566895 -12.9736612266 -12.1076376594 1.70048267897 -0.473817777612 -7.47921876201 -4.52348538932 0.465359542904 7.8870160439 -4.62888025529 28.0523112175 -1.28069464075 -2.25464842793 -10.8853274473 29.6898560727 0.505457960394 1.91578396366 -8.89082495803 35.8536653001 0.165495750564 -0.417547661473 -6.80957743759 33.8367955794 -0.0859072069777 -0.327537970916 5 5 5 3 1 4 3 3 3 8 5 14 1 5 7 4 8 3 9 3 9 4 9 3 6 2 1 5 4 2 2 5 1 1 8 3 4 0 168.0 0.857142857143 77.0 0.766233766234 0.176587301587 0.193027210884 0.0631951193176 0.0955611907461 0.0328427005723 0.0227669326703 0.00966008792908 0.00528625834525 0.0402519870266 1.08333333333 0.428571428571 0.0 5.0 6.0 2.0 2.0 1.0 0.0 3.0 4.0 13.0 0.166666666667 1.0 3.0 1.0 0.458333333333 0.333333333333 1.0 1.0 0.666666666667 0.583333333333 0.833333333333 0.5 0.833333333333 0.416666666667 0.333333333333 0.0 0.416666666667 0.5 0.25 0.0 0.166666666667 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.75 0.75 0.25 0.5 0.75 0.25 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.0 -11.686520107 4.50181124746 -28.2671614537 12.6315472765 -0.0756333986122 3.14458614966 -28.9123268757 27.4207142847 1.25218870648 3.18151744484 -21.1155607209 43.8545761493 -0.475201941949 -0.0287404614975 -20.4378726399 42.7498309668 0.701230095957 -1.82870677151 -14.372608254 29.2217938458 0.651545080669 0.785468470978 -7.76805798961 35.1191069551 -0.0914340808209 0.398719366909 3 2 6 3 5 5 3 18 2 3 6 2 7 2 7 2 7 2 7 2 7 3 6 4 5 6 3 6 1 0 135.0 0.6 60.0 0.666666666667 0.176131687243 0.204444444444 0.0347199105827 0.155961591221 0.0480512117055 0.00766489940274 0.0184862097079 0.00564236467272 0.133484053721 0.444444444444 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0454545454545 0.0 6.0 1.0 0.444444444444 0.5 0.666666666667 0.333333333333 0.333333333333 0.916666666667 0.916666666667 0.666666666667 0.833333333333 0.583333333333 0.583333333333 0.0 0.25 0.25 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -6.79061090525 3.64995336157 -13.265304275 9.11393531283 3.90686480749 0.559093631199 -5.02372053891 12.0476545664 -2.83428362327 0.528602949888 -10.908224167 15.1291291055 1.58414799106 0.663590644378 -4.17583592405 18.3558521616 0.885636243228 -0.643050605417 3.35740762308 12.0861809544 -1.13785705022 -1.07031489576 -2.65548767411 -0.178432885924 0.279078066159 -0.16997351306 1 5 4 5 7 3 9 1 2 4 7 3 14 2 4 7 3 8 3 8 3 8 3 7 5 5 2 2 8 3 6 3 0 154.0 0.785714285714 80.0 0.6 0.213695395514 0.230055658627 0.0664979311463 0.121036157299 0.0353802463349 0.0185396706144 0.00779228097896 0.00392171742448 0.0526477445674 1.09090909091 0.285714285714 0.0 2.0 4.0 2.0 0.0 2.0 0.0 2.0 2.0 10.0 0.257142857143 0.0 3.0 1.0 0.519480519481 0.25 0.916666666667 1.0 0.833333333333 0.5 0.583333333333 0.416666666667 0.583333333333 0.666666666667 0.333333333333 0.0 0.25 0.916666666667 0.666666666667 0.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.5 0.75 1.0 0.75 0.5 0.5 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.75 1.0 0.5 0.0 0.5 0.5 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 1.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -10.913481812 5.54768658777 -27.0296077131 13.7105720265 -1.05793956341 1.21152640354 -31.2736440203 23.2236175419 0.949418372963 3.80673112873 -24.9763068944 38.6696717647 0.0594857647333 -1.47917505843 -21.7367987256 28.7315178311 0.286816666934 -2.60178904875 -20.2772918944 7.94627963823 -0.623041236437 0.930733301417 -28.0621814124 8.60956004607 -0.394992927492 -0.280926249274 1 3 1 7 2 6 3 6 3 6 4 1 2 1 6 4 3 5 4 5 4 5 4 5 4 5 3 6 4 6 3 1 1 4 6 3 8 3 4 2 0 153.0 0.529411764706 69.0 0.666666666667 0.132897603486 0.240676662822 0.0217915180938 0.197561576925 0.045420774145 0.00511400559082 0.0187197239826 0.00791502393586 0.230149036642 0.666666666667 0.117647058824 1.0 1.0 2.0 2.0 0.0 1.0 0.0 1.0 0.0 8.0 0.333333333333 1.0 3.0 1.0 0.450980392157 0.466666666667 0.866666666667 1.0 0.6 0.666666666667 0.8 0.6 0.8 0.133333333333 0.266666666667 0.0 0.666666666667 0.133333333333 0.133333333333 0.0 0.333333333333 0.166666666667 0.5 0.666666666667 0.833333333333 1.0 1.0 0.666666666667 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.5 0.666666666667 0.833333333333 0.5 0.5 0.333333333333 0.666666666667 1.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.5 1.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.166666666667 0.666666666667 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 -11.7587416778 -1.64772176377 -21.3925279473 -3.364366069 9.56964042925 1.29889611199 5.22693107645 3.84943893139 -2.87651180567 2.75233782232 1.21079566752 17.8586551974 -0.841588393586 -0.274625222401 -7.89991898992 16.6577061229 1.23092542078 -1.51632546416 0.893668823458 3.04577451471 -0.0778261721201 -0.506419610084 2.39845836708 -4.74365212787 -0.0543188264566 -0.00796106812319 1 2 2 3 5 2 11 1 6 2 4 1 5 4 3 2 3 5 3 3 2 6 2 2 3 5 3 2 3 6 2 2 3 6 2 2 3 5 3 2 3 5 4 1 4 4 10 4 8 8 0 182.0 0.928571428571 97.0 0.639175257732 0.234573119189 0.233516483516 0.0915515923516 0.10414828198 0.0439130818463 0.0287402918011 0.00639679769902 0.00893008907516 0.0147292500517 0.461538461538 0.857142857143 2.0 2.0 0.0 2.0 2.0 3.0 3.0 3.0 2.0 7.0 0.242424242424 0.0 1.0 2.0 0.532967032967 0.8125 0.75 0.75 0.8125 0.625 0.3125 0.25 0.4375 0.625 0.1875 0.125 0.1875 0.75 0.6875 0.625 0.875 0.25 0.75 1.0 0.75 0.25 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.72917545187 3.72877295244 -15.4199490066 10.8020582847 -5.5922314115 2.78358747408 -31.9878338665 21.1432415537 2.61077742133 0.305852676233 -21.97043414 22.94430757 0.476535797519 -0.596265145664 -17.6278873597 18.0993495559 -1.99741361504 -0.339710407197 -30.7160581737 13.2573749988 0.331163303856 -0.430983744596 -33.0825174007 7.56605686463 -0.149042585163 -0.170852373985 1 5 11 6 11 6 13 4 13 4 13 4 13 3 14 3 14 3 2 4 8 11 6 5 3 3 6 4 5 3 5 4 5 3 5 3 6 3 5 3 7 2 5 3 7 3 4 3 6 3 5 2 8 2 5 3 6 4 3 5 4 6 1 7 2 8 1 5 4 5 4 1 14 0 391.0 0.739130434783 146.0 0.753424657534 0.139461411163 0.196819748693 0.0429303027942 0.128436287248 0.0567278218883 0.0155186416157 0.0212762498045 0.0171081679692 0.0925184546199 0.647058823529 0.565217391304 2.0 4.0 4.0 1.0 0.0 1.0 5.0 5.0 2.0 10.0 0.2 2.0 1.0 2.0 0.373401534527 0.766666666667 0.6 0.6 0.666666666667 0.4 0.5 0.333333333333 0.266666666667 0.0 0.366666666667 0.366666666667 0.433333333333 0.0 0.0666666666667 0.4 0.633333333333 0.888888888889 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.555555555556 0.333333333333 0.777777777778 0.777777777778 0.444444444444 0.333333333333 0.0 0.0 0.0 0.222222222222 0.666666666667 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.777777777778 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.777777777778 0.777777777778 0.555555555556 0.444444444444 0.0 0.0 0.0 0.0 0.222222222222 0.555555555556 0.666666666667 0.777777777778 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 -14.6145756439 -8.69124384884 -33.9224096659 -21.3188511014 2.82295635397 0.812688280136 -20.7903308816 -10.588800429 3.74683271994 7.17083075967 -9.85463061674 17.4818700143 -6.82896827818 -4.45599684059 -37.2161944149 3.81951241943 3.60266881221 1.2298712278 -26.6602377212 0.818690444244 -0.790210303597 -0.764823771922 -22.7755363284 -4.64642492 -0.0986655393564 -0.321305484704 4 4 6 8 4 3 4 3 3 3 4 3 3 1 7 3 10 2 9 4 10 3 5 3 3 3 3 2 4 4 2 3 4 4 2 4 1 20 2 10 2 0 182.0 0.928571428571 90.0 0.711111111111 0.217666948436 0.269623233909 0.0749221042211 0.130955311444 0.0627948461392 0.0175265292935 0.0110515460962 0.0110230408146 0.0394281842347 1.0 0.5 3.0 5.0 4.0 1.0 1.0 2.0 2.0 2.0 2.0 9.0 0.162162162162 1.0 2.0 1.0 0.494505494505 0.5625 0.25 0.25 0.8125 0.4375 0.0625 0.1875 0.4375 0.6875 0.6875 0.75 0.875 0.125 0.3125 0.375 0.6875 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.25 1.0 0.5 0.0 0.0 0.0 0.25 0.25 0.0 1.0 0.75 0.5 0.25 0.0 0.5 0.75 0.25 0.75 1.0 1.0 0.75 0.5 0.75 1.0 0.75 -1.3641852265 -6.45714340544 -7.31943996527 -14.008273651 -5.40523595358 2.58963188745 -22.4382441084 -3.76652936422 2.15495527799 2.21982178362 -19.9585260524 9.483516843 -1.89626432226 -0.256198431497 -24.7949132426 10.8995864539 0.5448763084 -0.200897375818 -25.536305849 2.62251869011 -0.0484855492283 -2.37622795308 -21.5346294239 -19.0224111677 0.186315716459 -0.165483623268 4 1 4 3 3 5 2 5 3 3 39 3 3 5 3 3 4 3 5 3 3 3 4 4 3 3 4 4 3 3 3 5 1 7 1 3 1 1 1 0 161.0 0.304347826087 67.0 0.910447761194 0.184560780834 0.233864434243 0.0187986382896 0.38030508849 0.0604603428334 0.00239052986128 0.0279686990622 0.00549762814201 0.630181528841 1.57142857143 186737708.348 0.0 2.0 1.0 5.0 0.0 4294967291.0 0.0 0.0 1.0 5.0 0.238095238095 2.0 6.0 1.0 0.416149068323 0.166666666667 0.0 0.0833333333333 0.0833333333333 0.5 0.0833333333333 0.5 0.583333333333 0.666666666667 0.166666666667 0.916666666667 1.0 0.75 0.166666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.32149446453 -4.09650983958 -6.07227398184 -4.37886069104 2.15489017056 7.67062206206 -2.81435979666 18.26877532 -2.00065440107 -1.77361560405 -3.80494450804 17.842558372 2.71484191678 0.390439976148 3.00604729697 16.2024632896 -2.2026537089 0.19326474626 -1.08858815444 15.406042097 1.76672761638 -1.40628797287 1.91343496648 3.89388465942 -0.4515249235 0.00268677881457 1 3 1 4 1 4 2 2 22 1 1 1 2 4 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 14 105.0 0.238095238095 58.0 0.603448275862 0.20380952381 0.304308390023 0.0143276104092 0.535418637296 0.0572534283555 0.00137177364825 0.018308019248 0.00393244198497 1.20739271862 1.0 204522252.048 2.0 1.0 1.0 1.0 4294967295.0 4294967294.0 0.0 0.0 3.0 0.0 0.235294117647 0.0 6.0 1.0 0.552380952381 0.5 0.416666666667 0.583333333333 0.666666666667 0.666666666667 0.416666666667 1.0 1.0 0.583333333333 0.416666666667 1.0 1.0 0.25 0.166666666667 0.5 0.75 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 -3.88034908872 -4.00160999774 -6.45549733855 -5.29014940892 3.20392769145 6.52829138778 -2.07739941519 17.2551304518 -3.72961921181 1.2959019623 -8.41392490623 29.2562103107 3.58737849708 -0.0646974489772 -0.199327368451 29.2712014583 -2.75028114072 0.302491946959 -6.33210541278 29.4834482586 1.63783789549 -0.549075160865 -5.27226843569 24.6956517702 -0.381804917484 -0.0597144950888 3 1 8 2 6 3 5 7 1 17 2 3 6 3 6 3 7 3 5 4 5 4 6 3 5 4 5 7 3 7 4 1 4 0 153.0 0.529411764706 72.0 0.722222222222 0.177196804648 0.225297962322 0.0301967541114 0.173505134749 0.0467539857443 0.00631151510027 0.0149769809587 0.0052301547647 0.165294092797 0.777777777778 0.0 2.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 6.0 0.321428571429 0.0 4.0 1.0 0.470588235294 0.4 0.8 0.533333333333 0.4 0.8 0.8 0.933333333333 0.866666666667 0.533333333333 0.4 0.266666666667 0.6 0.333333333333 0.333333333333 0.0 0.333333333333 0.0 0.5 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.166666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 0.833333333333 0.5 0.833333333333 1.0 1.0 0.833333333333 0.333333333333 0.833333333333 0.666666666667 0.0 0.333333333333 0.5 0.666666666667 0.833333333333 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.5 0.5 0.0 0.0 0.0 0.166666666667 0.5 -8.53819459411 3.96951152182 -14.7978250781 9.98907186722 7.5259263951 0.49499033797 3.61024892427 11.3729573823 -3.90309642481 -0.537957533107 -2.50622330358 9.93017434364 1.98405650861 0.680613780463 0.732805242015 9.38998197687 -0.422355786545 -1.59469987868 2.24555264184 0.249203636159 -0.556592863952 0.447398487037 -5.09665472751 0.579590761651 0.0514032190703 0.0431627046529 1 6 3 6 5 4 6 4 6 5 5 6 3 43 5 4 6 3 7 3 2 1 4 5 5 5 4 6 4 6 3 6 4 6 3 6 4 6 6 4 6 4 5 5 0 240.0 0.416666666667 96.0 0.583333333333 0.1625 0.203993055556 0.0260460069444 0.237472149884 0.0286740451389 0.00570462374491 0.00547043605382 -0.000838798521719 0.291603161958 0.8 178956970.542 2.0 1.0 3.0 0.0 0.0 4294967292.0 1.0 0.0 4.0 7.0 0.0909090909091 2.0 4.0 2.0 0.4 0.0 0.0555555555556 0.555555555556 0.555555555556 0.111111111111 0.166666666667 0.944444444444 0.888888888889 0.666666666667 0.222222222222 0.944444444444 0.333333333333 1.0 0.222222222222 0.277777777778 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 1.0 0.166666666667 0.333333333333 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.5 0.833333333333 0.166666666667 0.0 0.333333333333 1.0 1.0 1.0 0.833333333333 1.0 0.5 0.0 0.333333333333 1.0 1.0 0.666666666667 1.0 1.0 0.666666666667 0.0 0.166666666667 0.5 0.5 0.166666666667 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 -7.74554056381 -1.27323954474 -12.0812473838 0.298370419146 7.91906366148 4.70170227717 3.19287970692 14.0680326002 -6.90332774759 -1.51774378215 -10.0581131579 10.5328798332 5.35271189306 -0.186055017584 2.81354638733 8.11158398611 -2.94761154486 0.818865334547 -2.63160269635 10.2250214076 0.863410156412 -1.53557116467 -5.89930346126 -0.186786008564 -0.0153198054669 0.0695799402016 2 4 10 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 2 5 5 11 4 3 4 4 4 3 5 4 3 2 7 3 3 2 7 3 3 2 7 3 3 2 7 3 3 2 7 3 2 3 6 4 2 4 5 10 4 11 5 4 330.0 0.681818181818 127.0 0.614173228346 0.17797979798 0.212534435262 0.0572726994463 0.152987199822 0.0710804185102 0.0211271756398 0.0248794094431 0.0217834618223 0.108922965471 0.333333333333 0.545454545455 2.0 1.0 0.0 1.0 0.0 1.0 5.0 5.0 1.0 5.0 0.186046511628 0.0 1.0 2.0 0.384848484848 0.5 0.25 0.25 0.458333333333 0.75 0.791666666667 0.666666666667 0.583333333333 0.0 0.25 0.166666666667 0.0 0.0 0.333333333333 0.5 0.416666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 -3.00947528756 -7.78412358031 -7.59168928096 -20.7720788713 -0.428080162486 -1.74048067181 -9.05124521909 -19.537542506 0.178701084497 6.34457111742 -9.14268590664 5.03373423195 -0.517501650856 -2.38434661007 -8.78751288115 6.89288632369 1.16310003425 2.64364591714 -3.95673605078 15.4091672774 -1.00524516998 -1.16192341727 -8.34733288066 17.0601289985 0.141299893676 0.383776412294 1 8 3 14 1 4 5 3 6 3 3 5 7 1 5 2 4 5 4 5 3 3 3 5 4 5 3 3 2 6 3 7 2 3 3 5 3 6 3 3 3 5 3 7 1 4 2 6 3 6 2 4 3 5 4 5 3 3 4 4 4 5 3 3 4 4 3 5 4 2 5 3 5 3 9 5 3 6 6 19 2 2 0 345.0 1.53333333333 143.0 0.951048951049 0.207687460618 0.194396135266 0.147614488492 0.0558921429854 0.0579082338688 0.0679426300619 0.0123290982628 0.0204750185864 -0.0153992568677 0.478260869565 1.73333333333 3.0 1.0 2.0 5.0 4.0 6.0 6.0 6.0 2.0 7.0 0.176470588235 3.0 1.0 3.0 0.414492753623 0.333333333333 0.5 0.458333333333 0.666666666667 0.416666666667 0.166666666667 0.166666666667 0.333333333333 0.583333333333 0.583333333333 0.541666666667 0.625 0.541666666667 0.291666666667 0.291666666667 0.458333333333 0.166666666667 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.5 0.833333333333 1.0 0.833333333333 0.833333333333 1.0 0.833333333333 0.0 0.0 0.166666666667 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.166666666667 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.442865928604 7.08585485766 1.02184960945 15.2039352439 -1.28506465105 -3.04815660878 -10.4611051305 3.79054044397 -4.99694963889 -1.78235174579 -24.9864950895 -6.12058071491 5.48124759747 1.31493254237 -1.77989646041 -2.23128349499 -0.820074681554 -0.821343086848 7.34844253606 -3.20278407585 0.605728551741 0.618682749801 2.66867489382 -3.18671887637 -0.415885473497 -0.288627739082 1 6 9 7 10 6 10 6 12 3 12 4 13 3 13 3 13 4 11 12 5 5 2 5 3 5 4 4 3 5 4 4 3 5 5 3 3 4 6 3 3 4 6 3 3 4 6 3 3 4 6 3 3 4 6 3 3 4 6 11 4 6 1 5 4 2 1 1 1 0 352.0 0.727272727273 154.0 0.564935064935 0.177911931818 0.232438016529 0.0534584509708 0.14475282917 0.0638085644018 0.0185919500636 0.0179207182925 0.0170985713338 0.0944285504045 0.5 0.636363636364 5.0 2.0 1.0 0.0 0.0 0.0 5.0 5.0 4.0 11.0 0.0980392156863 0.0 1.0 2.0 0.4375 0.666666666667 0.333333333333 0.458333333333 0.583333333333 0.916666666667 0.875 0.916666666667 0.791666666667 0.166666666667 0.291666666667 0.208333333333 0.0416666666667 0.0 0.291666666667 0.416666666667 0.291666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.166666666667 0.333333333333 0.5 0.5 1.0 0.833333333333 0.666666666667 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 1.0 1.0 0.833333333333 0.5 0.5 0.333333333333 0.0 0.166666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -10.9093479174 -8.82586502601 -23.6876496839 -22.4182996135 3.86192877313 -0.746987925992 -11.5635829792 -19.8307258277 0.627936221909 4.81593938059 -6.12587990908 -1.83656336564 -2.15389691189 -2.9738768261 -18.674963341 -6.84616434339 0.201374270366 2.28343013729 -18.5057002799 -0.598917553744 0.820237490279 -1.34794161346 -12.6573752646 -6.88430206778 -0.28641571082 -0.201302451632 1 3 2 1 2 3 9 2 3 4 2 2 2 5 3 8 3 7 4 5 6 2 5 1 3 2 2 4 3 1 3 4 3 1 4 3 3 1 5 1 5 1 3 4 2 1 0 143.0 0.846153846154 77.0 0.727272727273 0.246662428481 0.264658418505 0.0803581962563 0.125837192784 0.0562405465824 0.0176980800668 0.00642199467889 0.00872822036397 0.0269533838555 0.909090909091 0.692307692308 2.0 3.0 3.0 0.0 2.0 1.0 2.0 3.0 4.0 8.0 0.25 0.0 2.0 1.0 0.538461538462 0.666666666667 0.166666666667 0.583333333333 0.916666666667 0.5 0.0833333333333 0.5 0.666666666667 0.416666666667 0.333333333333 0.416666666667 0.166666666667 0.75 0.833333333333 0.75 0.666666666667 0.5 1.0 1.0 0.5 0.0 0.0 0.25 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 0.75 0.25 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.5 1.0 0.5 0.75 0.5 0.0 0.0 0.25 0.75 0.75 0.25 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.76294706194 -0.685590524088 -7.93670646989 -1.14032472003 -5.17409315221 1.3294544905 -23.7963690683 7.04084719533 1.2473319064 3.05257820313 -23.4124063722 20.4128057552 -1.34836539551 -0.95384936282 -31.657776606 19.7946842172 -1.93028204057 0.437359689109 -47.1458695339 17.432585429 0.476754079391 -1.03834970882 -45.1757415637 8.15579564456 0.117606310385 -0.287484637336 4 5 8 8 4 11 2 4 5 4 1 4 6 8 6 3 1 4 6 8 6 7 7 3 1 4 6 3 1 4 5 4 1 5 3 5 3 10 6 3 7 0 196.0 1.0 107.0 0.551401869159 0.23833819242 0.249635568513 0.0965164387288 0.0942574681893 0.0488165539019 0.0282190945161 0.00597652719588 0.00902720728286 4.65785693271e-05 0.571428571429 0.642857142857 0.0 3.0 3.0 0.0 0.0 3.0 3.0 2.0 3.0 12.0 0.189189189189 0.0 2.0 3.0 0.545918367347 0.5 1.0 0.9375 0.875 0.75 0.25 0.1875 0.5 0.75 0.0625 0.0 0.4375 0.5625 0.8125 0.75 0.875 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.25 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.68249511269 3.77424579332 -10.2761068845 12.7452437227 -9.06997572192 5.60754369465 -39.9073621753 33.3671223493 1.0548808946 0.945109721859 -38.7322028007 39.2378903452 1.79416527098 -1.26926537212 -26.0420017939 30.830533281 -1.18410258399 0.0431509413394 -30.3116849863 28.8787908251 0.374789596514 0.375698630602 -30.3715168148 32.4366720734 -0.0794473121396 0.0230516951311 4 3 7 5 5 6 4 3 3 22 4 2 56 2 3 1 4 3 3 1 5 4 4 0 154.0 0.785714285714 52.0 0.980769230769 0.13813459268 0.121521335807 0.0442081952455 0.0710178672736 0.0309873546929 0.0148704043954 0.0118989394063 0.00655455228719 0.0424871765455 0.818181818182 306783378.214 0.0 2.0 4.0 1.0 0.0 1.0 4294967293.0 1.0 1.0 6.0 0.0833333333333 4.0 3.0 0.0 0.337662337662 0.25 0.833333333333 0.166666666667 0.0833333333333 0.666666666667 0.666666666667 0.0 0.416666666667 0.75 0.5 0.0 0.166666666667 0.583333333333 0.5 0.0 0.166666666667 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.75 1.0 0.75 0.75 0.75 0.25 0.0 0.0 0.25 0.5 0.75 1.0 0.5 0.0 0.0 0.0 -6.54808908721 9.00362249491 -16.4769846828 21.3203171914 -1.0913481812 -0.24082045325 -21.0462849348 23.4917875199 0.187610979505 1.31277970448 -18.9102118362 27.4108066397 0.33940807225 0.0660643207862 -15.5503442605 26.9336533877 0.119952878488 -1.04951129787 -14.7343981758 18.8584330465 -0.45383726047 0.0402499221474 -18.7330568349 14.2621024975 -0.0493906912613 -0.314503051784 2 3 3 5 2 6 1 6 2 5 3 4 4 3 3 3 4 3 1 4 4 2 4 0 77.0 0.636363636364 44.0 0.590909090909 0.282003710575 0.229043683589 0.0569991654492 0.125690804389 0.0440274854173 0.00704127907655 -0.000217449740027 0.000960583480946 0.0396498120499 0.428571428571 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 5.0 0.3125 0.0 2.0 1.0 0.571428571429 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.0 1.0 1.0 0.5 0.333333333333 1.0 1.0 0.833333333333 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.08348289138 5.4402053275 -6.0655673412 12.4783370976 -1.26271690387 -0.916426359021 -8.68615978194 10.0175886778 1.51483337059 -0.156875103453 -3.12196070532 8.27333866877 -0.446136817154 0.628187762427 -2.25737255431 10.8866013139 0.42737258117 -0.488307449073 -0.312678132168 7.6113192032 0.103543233561 -0.302391335367 1.79666675161 3.08953565899 -0.0290942956203 -0.089871150655 8 2 9 5 4 8 4 8 3 3 9 3 9 2 10 2 10 2 10 3 1 1 6 7 3 8 5 5 8 4 8 4 8 4 8 3 10 2 9 3 9 4 8 5 5 8 4 7 7 2 1 1 6 0 288.0 0.5 106.0 0.707547169811 0.140046296296 0.179253472222 0.0248434017061 0.17525943709 0.0299695175862 0.0061225500948 0.0103226565516 0.000406925207868 0.183820016839 0.833333333333 0.0833333333333 3.0 2.0 5.0 0.0 0.0 1.0 0.0 1.0 3.0 9.0 0.263157894737 1.0 3.0 2.0 0.368055555556 0.0 0.0555555555556 0.5 0.277777777778 0.333333333333 0.722222222222 1.0 0.944444444444 0.555555555556 0.555555555556 0.777777777778 0.555555555556 0.5 0.222222222222 0.277777777778 0.0555555555556 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.0 0.166666666667 0.5 0.5 0.666666666667 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 0.833333333333 0.5 0.833333333333 1.0 1.0 0.833333333333 0.333333333333 0.833333333333 0.333333333333 0.0 0.5 0.833333333333 0.5 0.333333333333 0.5 0.666666666667 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.833333333333 0.666666666667 0.0 0.0 0.5 0.5 0.0 0.0 -11.5122075503 2.0159626125 -18.2631691913 5.4885616072 11.9813830596 1.7175470942 8.78526127176 15.8369902384 -8.00425049537 2.69247601635 -6.44616891134 21.6962157104 4.88663457614 -4.03182358062 3.79618173577 5.31036718913 -1.7206531783 1.78161571051 4.901540984 7.09451565945 0.185455988972 -0.502121788249 0.332593445316 12.8770337474 0.175627528432 0.349334725493 1 4 3 5 4 5 1 7 3 5 4 3 18 2 3 6 3 6 3 7 2 6 3 6 2 7 2 7 2 7 8 1 8 3 1 1 1 1 1 1 0 162.0 0.5 72.0 0.777777777778 0.172839506173 0.216049382716 0.0313214449017 0.192653558909 0.047210791038 0.00749097487413 0.0196458466714 0.00718860825954 0.202041512316 1.11111111111 0.166666666667 1.0 1.0 4.0 3.0 0.0 1.0 0.0 0.0 6.0 8.0 0.1875 0.0 3.0 1.0 0.444444444444 0.2 0.8 0.6 0.666666666667 0.666666666667 0.866666666667 0.6 0.6 0.533333333333 0.466666666667 0.0 0.4 0.2 0.4 0.0 0.4 0.0 0.166666666667 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.5 0.5 0.0 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 0.666666666667 0.833333333333 1.0 0.666666666667 0.5 0.333333333333 0.0 0.666666666667 0.666666666667 0.333333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.666666666667 -7.63943726841 1.80375602171 -12.9701373263 2.75801137628 7.2228835902 -1.5421000556 5.55660270829 3.64139974576 -3.31491534725 5.07592319056 -0.10588219291 26.1537557128 0.997020232945 0.0775479510689 -1.20876219285 27.8425380126 -0.261361749672 -2.83845755902 -1.09200466471 6.85491691308 -0.485781724969 0.373853793091 -4.48553826843 0.292865478762 0.237375581116 -0.443820676478 6 4 2 3 1 16 2 5 1 1 5 3 8 3 8 3 8 3 8 3 8 3 8 3 8 4 6 5 5 5 6 0 154.0 0.785714285714 64.0 0.640625 0.147579693034 0.168367346939 0.0389676102275 0.101592053586 0.0220405753801 0.0116762208398 0.00525793311876 -0.0017536887193 0.0633355179179 0.272727272727 0.142857142857 2.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 3.0 8.0 0.08 0.0 1.0 1.0 0.415584415584 0.583333333333 0.416666666667 0.333333333333 0.416666666667 0.666666666667 1.0 1.0 1.0 0.666666666667 0.416666666667 0.333333333333 0.5 0.833333333333 0.0833333333333 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -10.2768620396 4.95653965629 -20.67546934 13.1873801578 5.61311179762 1.78620103041 -5.61669813752 19.0962171471 -1.79026347288 -0.889435794378 -8.51586776466 13.8736255584 -1.03193284634 -0.818344530779 -16.4863075271 7.02692517634 0.941694376826 -0.0344865997507 -10.3194227227 4.46132308441 0.13895788244 -0.460030838815 -5.27875759178 -1.14850175099 0.17016054246 -0.21219276665 8 1 10 6 5 5 1 5 3 3 4 4 2 4 4 9 7 7 7 7 7 7 7 7 7 7 7 2 2 4 5 3 3 5 1 4 5 8 6 7 9 4 5 0 224.0 0.875 109.0 0.633027522936 0.222895408163 0.232979910714 0.0829429515249 0.10547649061 0.0513263846973 0.0257477715376 0.00856327280275 0.00745623337437 0.0235130384689 0.5 0.6875 0.0 2.0 3.0 1.0 2.0 4.0 4.0 1.0 3.0 9.0 0.162162162162 0.0 2.0 2.0 0.486607142857 0.25 0.8125 1.0 0.8125 0.5 0.375 0.25 0.5 0.5625 0.125 0.0 0.1875 0.625 0.75 0.5 0.625 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -8.43521198387 5.80915542285 -24.5190061642 20.6269746104 -5.96209337598 10.0634416556 -43.3294121578 56.7517621624 2.42414038382 1.11840735248 -32.1761635771 65.658698222 1.37287933093 -1.50967781267 -21.8830927028 57.4849561041 -1.72537493408 1.57860707088 -31.3760308938 65.119901876 0.351358524592 -0.044295354326 -30.8174872134 65.5210998199 0.168802932403 -0.255511021748 2 2 3 5 3 1 1 4 4 3 2 7 1 7 4 5 3 13 4 3 5 5 4 3 4 3 5 4 5 4 3 2 7 3 6 3 3 3 6 3 6 3 2 3 7 2 7 3 3 2 7 2 7 3 2 3 6 4 5 4 2 3 6 4 5 4 1 6 3 6 3 5 1 6 2 7 3 11 6 4 9 0 336.0 1.71428571429 168.0 0.684523809524 0.238715277778 0.228954081633 0.170691203999 0.0582910852213 0.0517528300383 0.0673420483075 0.0067083941145 0.0133981751544 -0.0322117828762 0.5 1.92857142857 5.0 3.0 2.0 2.0 6.0 6.0 6.0 6.0 6.0 16.0 0.186440677966 1.0 2.0 3.0 0.5 0.541666666667 0.458333333333 0.458333333333 0.75 0.541666666667 0.0833333333333 0.0416666666667 0.375 0.791666666667 0.625 0.458333333333 0.75 0.791666666667 0.25 0.208333333333 0.416666666667 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.166666666667 0.5 0.5 0.333333333333 0.166666666667 0.166666666667 0.166666666667 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 0.833333333333 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.666666666667 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 -2.62605656102 9.36361581857 -10.9053856133 19.8936272918 -8.44267237183 -4.63732189221 -49.8537098086 0.571192537802 -7.33836034114 -4.06131329474 -76.2671647489 -18.2484093462 8.1606446404 3.7908439776 -34.807165944 0.294457141663 0.451594335688 0.0617242954388 -13.4937731296 5.66033749213 -0.752710481639 -1.18313567162 -27.2932087343 -3.54280474106 -0.333197965289 0.217322839781 5 5 5 9 3 9 1 6 1 4 1 8 4 3 8 4 8 3 10 2 10 3 9 4 9 4 8 8 7 2 1 1 3 0 168.0 0.857142857143 75.0 0.666666666667 0.182043650794 0.174744897959 0.0588605357818 0.0899063866618 0.0285629504778 0.0180859978532 0.0086648102924 0.00115982246192 0.036314281055 0.666666666667 0.142857142857 0.0 3.0 4.0 1.0 0.0 1.0 0.0 0.0 3.0 12.0 0.285714285714 0.0 2.0 1.0 0.446428571429 0.166666666667 0.75 0.833333333333 0.5 0.583333333333 0.833333333333 0.5 0.916666666667 0.916666666667 0.5 0.0 0.5 0.916666666667 0.416666666667 0.0 0.25 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 0.75 0.75 0.5 0.0 0.0 0.0 1.0 1.0 0.75 0.75 0.5 0.0 0.0 0.0 -11.5046287435 7.68491010929 -26.2574112499 20.6492980616 2.51167844594 3.44062362398 -16.2257652064 34.9737230046 2.98553537176 1.34292605787 1.14001931455 41.4063713064 -0.840705423869 -0.523548795163 -0.228266206103 36.1814438364 0.0701515087007 -1.13286199249 -0.0678512592213 26.3249022341 0.712288745297 0.216204787789 5.91599035261 26.4584289378 -0.0511832878566 0.0981141277244 1 3 3 4 2 4 2 3 26 4 2 5 2 4 2 4 3 3 2 4 2 4 3 3 3 3 3 3 2 4 1 12 1 1 4 0 132.0 0.272727272727 68.0 0.720588235294 0.208333333333 0.274449035813 0.0173754591368 0.418090599521 0.0571481864096 0.00180768915717 0.0166560386225 0.00418282260317 0.77169612944 1.16666666667 195225786.0 1.0 3.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 2.0 4.0 0.105263157895 0.0 3.0 1.0 0.515151515152 0.333333333333 0.416666666667 0.333333333333 0.416666666667 0.666666666667 0.5 0.833333333333 0.75 0.666666666667 0.5 1.0 1.0 0.5 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -3.96440494611 -2.86478897565 -6.41989700139 -2.3785832739 3.62660425923 6.94530169768 -0.265891199873 22.5263975113 -3.49372923617 1.65642949673 -5.60585031965 33.2427866311 3.45611099803 -2.12439851218 2.89680510885 19.3900597318 -2.52435574888 -0.663592840195 -3.75426551352 9.97101147348 1.15694605379 -0.00329154388146 -3.47166772523 9.29012221931 -0.139805551944 0.0206897614241 2 1 1 1 2 2 2 10 1 16 2 3 1 5 7 3 8 3 9 2 8 3 8 3 9 2 8 5 5 6 5 6 5 0 154.0 0.785714285714 71.0 0.535211267606 0.144037780401 0.185064935065 0.0386828553467 0.108417409037 0.0193041904966 0.0124931377309 0.00386619437751 -0.00132274425633 0.0732157611734 0.454545454545 0.214285714286 3.0 0.0 1.0 0.0 2.0 1.0 0.0 0.0 4.0 8.0 0.115384615385 0.0 1.0 1.0 0.461038961039 0.833333333333 0.833333333333 0.583333333333 0.666666666667 0.916666666667 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.166666666667 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -11.8229386297 6.45714340544 -26.0636038237 17.5680146292 3.60905873868 3.03136805603 -14.8968259419 28.7003684389 0.624868044851 -0.103317665651 -9.50426565512 28.4161323597 -2.07960140058 -0.298585209482 -20.6878780732 25.8925119389 0.395282812095 0.365267459794 -21.4265285405 26.7613340301 -0.13926426494 -0.474482709265 -21.7173099939 20.3071129698 -0.064865720343 -0.370638998376 4 6 7 9 4 4 2 5 2 3 6 3 2 3 6 3 2 3 6 8 7 6 7 7 8 6 7 4 1 2 6 4 3 4 3 4 3 10 6 5 5 0 196.0 1.0 99.0 0.646464646465 0.244533527697 0.232871720117 0.102974074365 0.0959425653852 0.0551958314563 0.0304199314086 0.00948658236192 0.0101923193051 -0.000161255043601 0.642857142857 0.714285714286 0.0 3.0 3.0 2.0 1.0 3.0 3.0 2.0 2.0 10.0 0.2 0.0 2.0 2.0 0.505102040816 0.375 0.8125 0.8125 0.5625 0.6875 0.25 0.0625 0.4375 0.625 0.0 0.0 0.375 0.6875 0.6875 0.625 0.875 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -0.13641852265 1.31871238562 -6.30040800604 6.863351484 -9.00779857214 5.81077945289 -37.8199038921 29.1516157686 -0.970412393838 2.2165121714 -46.091137052 42.0623048922 2.07488166899 -1.11537618238 -32.5800418293 34.9245078314 -0.207773024739 -0.695284231975 -28.5493995764 26.9830456729 0.468261966489 0.17968856197 -24.9000122487 28.1627361358 0.00199138461417 0.147582512152 6 1 12 7 7 4 2 4 3 4 5 4 2 3 7 4 1 3 7 8 7 8 7 8 7 4 1 3 7 4 1 3 7 3 3 3 5 3 4 5 1 4 8 6 11 2 6 0 225.0 1.0 98.0 0.765306122449 0.210074074074 0.201777777778 0.096767648834 0.0814585679012 0.0542833251029 0.0354086006044 0.0105656003951 0.0129286476281 0.00753179227069 0.466666666667 0.733333333333 0.0 2.0 3.0 0.0 1.0 3.0 3.0 2.0 2.0 9.0 0.27027027027 0.0 2.0 2.0 0.435555555556 0.25 0.8125 0.9375 0.625 0.625 0.3125 0.25 0.5 0.4375 0.0 0.0 0.1875 0.5625 0.5625 0.5 0.625 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -0.848826363157 4.66854499736 -7.32098312004 16.2739045214 -7.68697154475 7.75714119077 -32.2252042467 44.8243492141 1.11716447903 1.17315767685 -29.3141052313 50.0443942282 2.13018837277 -3.53371557775 -15.0837875582 24.9456818518 -1.08844290369 -1.46244603034 -16.578334844 7.06285538151 1.30844733785 -0.146036091486 -4.49652573887 0.968402200838 0.422291684978 -0.329060676541 1 3 3 4 1 5 1 5 32 3 2 4 3 3 4 2 4 2 4 2 3 3 3 3 3 4 2 4 2 4 2 5 3 2 1 0 132.0 0.272727272727 58.0 0.810344827586 0.167929292929 0.226584022039 0.0142901988202 0.403694312269 0.0542364067674 0.00174507766774 0.0319519464774 0.00485774127162 0.72222289984 1.0 195225785.955 1.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 2.0 1.0 0.294117647059 0.0 4.0 1.0 0.439393939394 0.5 0.25 0.333333333333 0.5 0.666666666667 0.333333333333 0.75 1.0 0.666666666667 0.333333333333 1.0 1.0 0.583333333333 0.166666666667 0.5 0.833333333333 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.79078137183 -1.4758003814 -6.15644688363 1.85512068437 3.37621323681 8.04443936627 -0.816928096381 28.9092105243 -3.41836111744 0.0277049433383 -5.85762227893 31.8451208163 3.38566409039 -2.41023944145 1.40524815014 16.2236296419 -2.6824461532 0.459902865924 -3.69425723335 13.0162184389 1.93940419523 -0.814113416482 -0.935720824607 7.34472895604 -0.438162499145 -0.0444045695136 2 4 2 5 2 5 3 5 3 4 3 4 3 3 4 3 2 4 2 3 4 0 70.0 0.7 40.0 0.6 0.279591836735 0.234285714286 0.0597696793003 0.123218658892 0.0426588921283 0.00669963219772 -0.000417239821408 0.000279527183971 0.029807697269 0.285714285714 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.2 0.0 2.0 1.0 0.571428571429 0.333333333333 0.166666666667 0.0 0.166666666667 0.833333333333 0.5 0.0 0.333333333333 1.0 0.833333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 4.20169049763 -4.99007906387 10.0368141764 -0.919278951299 -0.0878535285867 -7.44301004756 10.4545081755 0.798830490367 0.101986487533 -3.94199813872 10.6394021118 0.00785716123056 0.489977590902 -3.1070848063 12.6269905083 -0.278058450067 -0.506721798633 -4.38522313964 8.1668763525 0.351428026424 -0.61360906903 -2.2086143198 1.28488248689 -0.0324594115063 -0.0117792643886 1 4 1 12 1 5 1 5 3 3 2 4 2 3 1 4 2 3 3 0 60.0 0.6 43.0 0.348837209302 0.316666666667 0.286666666667 0.0515 0.14637037037 0.0292222222222 0.00414839549527 -0.00785880917016 -0.00244428282294 0.0497189057153 0.5 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.2 0.0 2.0 1.0 0.716666666667 0.833333333333 0.666666666667 0.166666666667 0.333333333333 1.0 1.0 0.5 0.666666666667 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 -3.37408479355 4.26535247486 -8.276913546 10.0222162941 -0.176980296718 -0.36032679116 -9.02258542573 9.35981873954 0.183601142351 -0.0547493004236 -8.9598471707 8.51100577064 -0.957524520744 0.371044921648 -14.369946187 8.9092378999 -0.216656539231 -0.916760320505 -18.6058335173 1.00140327565 -0.574083405301 -0.812392798017 -25.1895548202 -9.26564551808 -0.189680720554 -0.136865350598 2 1 1 1 3 5 1 14 1 6 2 5 4 3 3 4 3 4 2 4 3 3 4 2 3 0 84.0 0.583333333333 52.0 0.461538461538 0.311224489796 0.252976190476 0.0544673226433 0.137314747328 0.053778952057 0.00474158781936 0.00364716587228 -0.000546540371854 0.0430912468326 0.285714285714 0.0833333333333 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 3.0 0.388888888889 0.0 2.0 1.0 0.619047619048 0.5 0.833333333333 0.166666666667 0.0 0.833333333333 1.0 0.5 0.0 0.833333333333 1.0 0.666666666667 0.333333333333 0.833333333333 1.0 0.833333333333 0.833333333333 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -1.69765272631 6.36619772368 -4.93032756757 15.5953261333 -0.884194128288 0.309467944901 -5.81913624656 16.7112022339 1.7528329895 -0.800072881361 0.0456566221764 11.8669472954 -1.06909997458 -0.00336504886626 -2.47631207135 8.90776623487 0.521220058657 -0.738290708545 -0.722948475955 2.76359544004 0.176983212398 -0.440876106432 1.22780755166 -4.1730228313 -0.147837532723 -0.145126190033 4 5 5 4 1 4 2 4 3 4 1 3 4 11 1 3 1 3 9 3 9 3 9 3 9 3 10 3 5 3 1 4 3 3 3 9 6 3 4 0 168.0 0.857142857143 78.0 0.769230769231 0.1875 0.201530612245 0.0676551870748 0.104189443635 0.0409403344671 0.023008961743 0.0134440800256 0.00829661280536 0.0430518071086 1.0 0.428571428571 0.0 5.0 4.0 3.0 2.0 2.0 0.0 2.0 2.0 9.0 0.09375 1.0 3.0 1.0 0.464285714286 0.416666666667 0.916666666667 1.0 0.666666666667 0.75 0.583333333333 0.333333333333 0.75 0.5 0.25 0.0 0.333333333333 0.583333333333 0.25 0.0 0.333333333333 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.75 0.5 0.0 0.0 0.0 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.0 -9.50382374463 2.68289761212 -24.5120126109 9.36707926252 -2.26946596695 4.77789635282 -31.9736019444 29.2595273061 1.58672942342 3.01144409576 -22.9286996346 45.4075958477 0.672728230172 -0.743476010743 -16.1298553235 40.5442903186 -0.217263721572 -1.24913667051 -15.4289308895 30.0360570651 0.508452814991 0.722312566067 -10.4491707365 35.7950988489 0.113502832175 0.293558273679 3 8 5 4 3 4 2 4 5 3 1 4 6 3 1 3 7 7 8 6 8 3 1 2 8 2 1 3 8 2 2 2 7 2 4 3 4 3 4 9 8 3 6 0 182.0 1.07692307692 80.0 0.7875 0.197802197802 0.1842772612 0.0986084920996 0.0752782418644 0.044759551522 0.0389814400706 0.0106271880525 0.0111225082603 0.00853242872298 0.642857142857 0.769230769231 1.0 3.0 3.0 1.0 2.0 3.0 3.0 2.0 5.0 14.0 0.179487179487 0.0 2.0 2.0 0.43956043956 0.625 0.8125 0.625 0.375 0.625 0.0625 0.0 0.5 0.3125 0.0 0.0 0.4375 0.75 0.625 0.5 0.4375 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.81891363534 2.1826963624 -9.21522044963 8.96356087423 -7.27008643838 5.69060123055 -34.4305604658 29.6660031971 -0.137516991943 0.892373726257 -35.9855433971 34.7027839014 2.68281678264 -1.95712934574 -19.3565620106 22.2097403019 -0.872252606513 0.0960096271376 -20.9786813464 20.6027315791 0.0150996480456 0.848084104599 -18.4892316254 29.1837320486 0.588923842779 0.109121922663 7 3 9 10 5 4 4 4 3 5 5 4 2 4 7 8 8 8 8 8 9 7 8 4 1 3 8 3 2 4 6 4 2 4 6 3 5 10 9 2 8 0 224.0 1.14285714286 102.0 0.735294117647 0.210658482143 0.205038265306 0.110735123081 0.0729282034382 0.0505170905555 0.0441235150642 0.00915760413129 0.0136982165523 -0.00211183756231 0.5625 0.714285714286 0.0 4.0 4.0 1.0 1.0 3.0 3.0 2.0 2.0 8.0 0.351351351351 0.0 2.0 2.0 0.455357142857 0.375 0.875 0.9375 0.625 0.625 0.4375 0.25 0.5625 0.4375 0.0 0.0 0.25 0.625 0.3125 0.1875 0.5625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.46162001225 8.07711336191 -14.4617447157 23.8513640429 -9.21637677291 6.45727662666 -46.7922018977 45.53404556 -0.562691019047 -1.6173547963 -52.6724065833 35.4456301097 1.69340863017 -3.64385012335 -44.0080896758 9.7546500339 -2.06519252063 0.489307876001 -55.5746672145 9.77710153651 -0.0117402890943 1.2428371314 -55.9753236285 21.3591171912 0.47113302577 -0.139841250812 2 3 3 4 2 6 2 4 3 1 1 1 25 3 4 4 3 4 3 4 4 3 4 4 3 2 5 2 5 3 4 4 3 4 3 4 2 6 2 1 4 0 154.0 0.318181818182 67.0 0.940298507463 0.177179962894 0.215761511216 0.0175455553049 0.315446254707 0.0558428963514 0.00223894989169 0.0287522062828 0.00546449707752 0.476605786405 1.14285714286 195225786.091 0.0 2.0 1.0 2.0 1.0 4294967293.0 0.0 0.0 1.0 3.0 0.142857142857 1.0 8.0 1.0 0.435064935065 0.416666666667 0.25 0.166666666667 0.0833333333333 0.666666666667 0.5 0.666666666667 0.583333333333 0.75 0.5 1.0 1.0 0.75 0.416666666667 0.833333333333 0.916666666667 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -4.28271483229 0.289372623803 -7.10978827149 5.23344451841 3.57124081922 6.95343282925 -2.1211706181 30.132309895 -4.11399780496 1.00418536172 -9.22053696111 35.9515870658 3.91712237388 -2.58075123445 -0.158837636454 21.1471126766 -2.99222761278 0.749363932437 -7.28051311835 21.0051657273 1.71048465757 -0.262266240371 -5.04386588209 18.7064053318 -0.254150664789 -0.187829078572 1 2 3 6 3 13 2 6 3 4 2 5 5 3 3 4 5 3 3 3 6 3 3 3 6 3 3 2 7 3 3 3 6 3 3 3 6 3 3 4 5 10 3 12 3 7 9 1 1 2 2 0 210.0 1.07142857143 111.0 0.576576576577 0.235873015873 0.235714285714 0.103632545082 0.0911133786848 0.0567369614512 0.0309241385004 0.0122372400793 0.0141924481847 -0.00304394244386 0.333333333333 0.928571428571 1.0 2.0 2.0 0.0 2.0 3.0 3.0 3.0 3.0 10.0 0.15 0.0 1.0 2.0 0.528571428571 0.875 0.8125 0.6875 0.875 0.625 0.375 0.1875 0.4375 0.5625 0.0 0.0 0.25 0.875 0.75 0.75 0.875 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.25 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.05577490736 2.97089227105 -14.6018406881 9.85291040408 -10.1994975797 4.03928172014 -45.8794313164 23.9373463206 2.70185832715 -0.120663287357 -41.037937357 23.5554331386 -0.50786257982 -1.42593130267 -42.054925909 13.9176482468 -2.72867097394 0.296673558255 -63.0848085125 14.1477332498 -0.0306380982939 0.430013048715 -68.4669033017 19.4911108421 -0.0238840002123 0.115743882931 6 3 6 6 4 8 2 2 4 3 1 3 2 5 2 8 2 2 9 2 8 3 8 4 7 4 8 4 7 10 2 7 5 2 2 1 3 0 165.0 0.733333333333 77.0 0.727272727273 0.203305785124 0.214949494949 0.0586145755071 0.127702590645 0.0386135737541 0.0160511377744 0.0094443602749 0.00311437956412 0.0664010029316 1.18181818182 0.2 1.0 1.0 4.0 2.0 0.0 2.0 0.0 0.0 5.0 12.0 0.142857142857 0.0 3.0 1.0 0.466666666667 0.0833333333333 0.5 0.833333333333 0.833333333333 0.416666666667 0.666666666667 0.416666666667 0.833333333333 0.583333333333 0.333333333333 0.0 0.333333333333 0.833333333333 0.583333333333 0.0 0.25 0.0 0.0 0.0 0.25 0.25 0.25 0.5 0.75 0.0 0.0 0.25 0.75 0.75 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.75 1.0 0.5 0.25 0.75 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 -8.40338099525 4.49877972473 -17.5058686728 12.6532767417 4.29845670303 3.07614674008 -1.97090809455 26.0157923755 2.11688492328 1.76229766544 11.7448201674 32.4899469424 -0.96497856106 -2.1122325444 8.21367402085 18.2950611453 0.138655772282 -1.21536847432 5.93987581501 7.0900797548 -0.557450045871 0.843654453248 -0.464815180831 9.16719138698 -0.23595734469 -0.402802234238 1 1 2 2 1 3 6 1 1 1 1 2 1 12 6 18 8 7 4 5 10 4 6 5 10 4 6 5 10 4 7 4 10 4 6 5 10 4 6 5 10 3 7 6 8 5 6 18 8 4 10 3 7 5 10 3 7 5 10 3 7 5 10 3 7 5 10 4 6 5 10 4 6 5 10 4 5 6 10 4 3 10 6 8 1 10 6 8 2 4 22 1 1 1 20 0 575.0 1.08695652174 238.0 0.588235294118 0.183860869565 0.184801512287 0.0916216046684 0.0774168238678 0.0449454846717 0.0390810387533 0.0106228335987 0.0118658489888 0.0128081510706 0.68 1.13043478261 5.0 4.0 4.0 4.0 10.0 5.0 5.0 4.0 11.0 19.0 0.144578313253 2.0 1.0 2.0 0.413913043478 0.690476190476 0.547619047619 0.547619047619 0.738095238095 0.380952380952 0.428571428571 0.404761904762 0.380952380952 0.238095238095 0.309523809524 0.285714285714 0.238095238095 0.714285714286 0.52380952381 0.452380952381 0.666666666667 0.75 0.5 0.166666666667 0.166666666667 0.25 0.166666666667 0.25 0.25 0.833333333333 1.0 0.916666666667 0.916666666667 1.0 0.916666666667 1.0 1.0 0.833333333333 0.583333333333 0.5 0.5 0.75 0.666666666667 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.583333333333 0.333333333333 0.25 0.25 0.583333333333 0.5 0.25 0.25 0.916666666667 1.0 1.0 0.916666666667 0.833333333333 0.75 0.75 0.916666666667 0.833333333333 0.416666666667 0.25 0.166666666667 0.0833333333333 0.0 0.0 0.166666666667 -10.8480009211 6.77363437799 -28.93216247 18.6318368293 -3.17947267561 4.57127628676 -33.299581681 41.7490875349 7.2966526624 4.82639877792 3.22107271007 57.8144776936 1.23293323237 -4.86392585339 15.3451458879 33.3802481824 -3.12923780446 -0.576835929472 -5.63845374982 15.2081268617 0.633413506703 -0.689172831616 -6.77604391167 13.7448132717 0.0781543588305 0.304315590509 1 1 1 3 3 4 1 1 3 1 2 8 3 7 1 6 1 5 4 5 1 6 2 4 6 4 1 5 4 4 4 6 1 3 6 4 3 6 1 3 6 4 2 10 8 3 2 2 1 7 8 7 1 6 9 6 3 5 10 5 3 4 12 3 5 3 12 3 5 2 13 3 5 2 7 0 322.0 1.64285714286 161.0 0.521739130435 0.239400486092 0.190550133097 0.141665903878 0.0428942180026 0.0436534527629 0.0426213246997 0.00548803664592 0.0021929005875 -0.026371248516 0.217391304348 1.71428571429 0.0 2.0 1.0 0.0 9.0 6.0 4.0 3.0 10.0 20.0 0.152542372881 0.0 1.0 5.0 0.5 0.791666666667 0.583333333333 0.375 0.125 0.333333333333 0.375 0.791666666667 0.666666666667 0.791666666667 0.916666666667 0.791666666667 0.416666666667 0.666666666667 0.708333333333 0.583333333333 0.333333333333 0.666666666667 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.833333333333 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.5 0.166666666667 0.166666666667 0.333333333333 0.5 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 -6.25548124152 15.6387031038 -17.2785192388 33.5380644815 -2.24582837754 -5.55670117578 -19.2363321133 19.0960396827 4.70909552895 0.648865444722 -5.05597041726 10.7442327111 -4.25292214397 -1.10606235549 -20.7674240059 11.0879365726 0.97734051397 1.72124319918 -19.7539837793 13.6252395237 1.46831241559 -2.40972937897 -3.96867948679 1.48112971162 -0.267571398289 0.366769771964 1 1 1 1 6 1 1 1 10 6 2 8 2 11 3 7 2 5 1 5 4 5 4 3 3 4 4 4 12 3 4 4 12 3 4 4 13 2 6 2 13 3 6 2 12 5 4 4 11 4 4 4 11 5 3 5 10 4 5 3 12 3 5 2 7 0 322.0 1.64285714286 124.0 0.83064516129 0.165001350257 0.153283052351 0.10887380936 0.0423222459739 0.0403498470388 0.0496447210839 0.00986030997923 0.00893468215084 -0.00421633483426 0.173913043478 1.35714285714 0.0 2.0 2.0 0.0 7.0 4.0 3.0 3.0 2.0 4.0 0.388888888889 1.0 0.0 2.0 0.385093167702 0.791666666667 0.625 0.375 0.208333333333 0.416666666667 0.333333333333 0.375 0.708333333333 0.791666666667 0.708333333333 0.458333333333 0.458333333333 0.416666666667 0.0833333333333 0.0833333333333 0.375 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.166666666667 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.166666666667 -10.4627075633 10.1028789963 -22.897245611 23.4602586542 4.30381546448 -1.00246553947 -4.11935011255 22.2265132462 4.18831608221 -0.186082766715 11.9132223102 14.9289329798 -5.42996114139 -1.29347095618 -12.0266068709 11.6313005184 1.55822158982 1.8151093499 -9.80518386254 17.4510495715 1.34338438533 -1.24073746935 10.7417211355 16.896634968 0.17811109 0.464205731263 11 1 3 4 4 5 3 4 5 2 4 3 6 2 5 3 5 3 4 3 5 2 5 2 6 2 5 3 5 3 4 2 6 3 4 2 6 3 4 3 4 5 3 4 2 7 3 6 1 4 6 2 4 1 3 0 210.0 1.07142857143 84.0 0.988095238095 0.189523809524 0.202721088435 0.0895649497894 0.0872674657164 0.0633482345319 0.0328882275704 0.0175993965998 0.0172991140293 0.0159666834826 0.466666666667 0.928571428571 0.0 3.0 2.0 2.0 2.0 3.0 3.0 3.0 0.0 8.0 0.162162162162 1.0 1.0 2.0 0.4 0.625 0.5625 0.5 0.4375 0.25 0.375 0.3125 0.625 0.125 0.0 0.0 0.375 0.5625 0.5625 0.6875 0.875 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.75 1.0 0.75 0.75 0.75 0.0 0.25 0.25 0.25 0.5 0.25 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -3.05577490736 -1.82497668079 -11.7023377616 -1.43708139206 -5.50039483326 4.52650805259 -24.1758251885 14.7626464251 5.33681656167 1.14344246654 -4.4269383274 23.0215515958 -1.0783937236 -0.660566912957 -6.55396980487 19.5100774048 -2.41599913581 0.206762956297 -26.552551225 19.8697693154 0.244536016772 0.342631645793 -32.3565742324 24.8422211125 -0.420798700235 0.217033361068 4 1 8 1 6 3 5 5 3 15 1 1 2 5 5 3 6 3 6 3 6 3 6 3 6 3 6 4 5 7 3 6 3 3 1 1 1 0 153.0 0.529411764706 70.0 0.642857142857 0.188816267248 0.229911572472 0.0327297165466 0.184489681501 0.058900032025 0.00636571245167 0.0217512645282 0.00781703781906 0.175946870066 0.444444444444 0.117647058824 0.0 0.0 1.0 2.0 0.0 1.0 0.0 0.0 2.0 7.0 0.172413793103 0.0 2.0 1.0 0.457516339869 0.4 0.666666666667 0.333333333333 0.2 0.733333333333 1.0 1.0 0.866666666667 0.533333333333 0.6 0.333333333333 0.733333333333 0.2 0.266666666667 0.0 0.466666666667 0.0 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.666666666667 0.5 0.5 0.5 0.166666666667 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.833333333333 1.0 0.666666666667 0.5 0.5 0.833333333333 1.0 0.0 0.5 0.666666666667 0.166666666667 0.0 0.0 0.5 0.833333333333 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.333333333333 0.833333333333 -6.66578349891 1.72261820758 -11.0588836178 3.81099092654 6.3001126262 -0.363338457504 3.090532922 3.70312066881 -4.03804202348 0.692960467759 -2.95637661496 6.02841817466 3.09334092866 -0.179771020851 4.67490011754 4.59447043 -1.40986769631 -0.698523509779 2.52603791457 -1.55444551243 -0.0031242840258 -0.199885297455 -2.94853598651 -4.81666755706 0.0210275259097 -0.000879605516643 3 2 11 6 10 6 12 4 12 4 13 3 12 4 13 3 13 3 13 3 13 10 6 4 3 5 4 3 6 3 4 3 6 3 4 3 6 4 3 3 7 3 3 3 7 3 3 3 6 3 4 3 6 4 2 4 6 3 3 5 4 3 5 10 7 1 1 3 1 2 4 0 368.0 0.695652173913 132.0 0.704545454545 0.153362771739 0.195297731569 0.047149801172 0.138631081223 0.0647511623718 0.0175187635766 0.0251354675913 0.0183589795474 0.101473668424 0.625 0.521739130435 2.0 2.0 4.0 2.0 0.0 0.0 5.0 4.0 6.0 16.0 0.145454545455 0.0 2.0 2.0 0.358695652174 0.583333333333 0.291666666667 0.25 0.333333333333 0.708333333333 0.791666666667 0.833333333333 0.791666666667 0.0 0.166666666667 0.208333333333 0.0416666666667 0.0 0.166666666667 0.416666666667 0.208333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -8.33141528185 -10.4627075633 -18.8321653015 -23.9973576973 1.67011313505 3.00786752974 -15.1873863575 -6.75200576141 -0.551169892828 7.12948986989 -14.5974726249 27.1802978119 0.233884419356 -1.77782693016 -9.63521210962 30.0603681515 1.88700554834 1.43983921614 0.880121610637 27.3592964166 -1.60757456683 -2.69366589271 -7.82746919541 11.2843929167 0.0908832710694 0.242058476717 1 13 3 1 5 2 13 1 7 1 5 3 4 4 4 3 4 4 4 4 2 6 4 2 3 6 5 1 3 6 8 8 6 9 6 10 4 11 4 12 2 13 2 13 2 13 1 13 2 12 2 12 3 10 5 10 5 9 5 10 0 345.0 0.652173913043 123.0 0.707317073171 0.147632850242 0.130938878387 0.037757845295 0.0921651218079 0.025508439647 0.0111592272964 0.00544764738932 0.00135618829326 0.0643759283865 0.6 0.347826086957 3.0 3.0 2.0 0.0 5.0 3.0 0.0 0.0 2.0 4.0 0.342105263158 0.0 5.0 1.0 0.35652173913 0.583333333333 0.208333333333 0.0 0.166666666667 0.708333333333 0.875 0.416666666667 0.5 0.291666666667 0.708333333333 0.666666666667 0.166666666667 0.75 0.5 0.0416666666667 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 0.666666666667 0.5 0.333333333333 0.166666666667 0.166666666667 0.833333333333 1.0 1.0 1.0 0.833333333333 0.166666666667 0.166666666667 0.0 0.5 1.0 1.0 0.666666666667 0.333333333333 -10.3519910811 18.0467865906 -21.0378843399 39.39256788 4.4845407619 -4.83134078255 -14.2458882517 32.3663714088 -4.34196036888 4.67212429261 -20.7596108747 42.4324057893 3.47578671116 -1.49216385286 -14.3350041137 41.9796711261 -2.75668740965 0.585393892895 -19.3667644081 41.6184774213 1.82183495795 0.705911293069 -17.8443466654 51.0755426712 -0.480521941415 0.0524661406813 1 4 1 1 2 3 2 4 2 1 8 2 2 4 6 1 3 4 4 2 3 5 3 4 3 4 3 4 3 4 3 5 2 4 2 6 2 4 2 6 4 9 4 10 4 10 7 2 1 5 9 5 11 2 4 4 4 1 3 8 2 1 3 8 2 1 3 8 1 2 3 7 2 2 11 4 7 6 0 308.0 0.636363636364 141.0 0.794326241135 0.186224489796 0.22181227863 0.0474095999084 0.156377078711 0.0405998512156 0.0129249928664 0.0100879322175 0.00517290292785 0.11579759747 1.5 0.727272727273 3.0 6.0 6.0 4.0 6.0 4.0 2.0 4.0 5.0 17.0 0.166666666667 1.0 2.0 1.0 0.457792207792 0.5 0.625 0.666666666667 0.791666666667 0.333333333333 0.375 0.75 0.25 0.583333333333 0.333333333333 0.458333333333 0.208333333333 0.708333333333 0.25 0.458333333333 0.541666666667 0.0 0.5 0.666666666667 0.166666666667 0.166666666667 0.5 0.166666666667 0.5 0.166666666667 0.833333333333 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.833333333333 0.5 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.5 0.833333333333 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.5 0.666666666667 1.0 0.5 0.333333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 1.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.666666666667 0.5 0.5 0.5 0.166666666667 0.166666666667 0.833333333333 0.333333333333 -14.381819403 1.53367490616 -30.9110539606 7.16762840278 4.83766456249 4.65423580012 -20.2666116573 21.5747394332 -2.4075412939 0.378098606602 -22.6150350482 37.3829072339 0.789515908525 5.65571152718 -20.0061559303 60.225826315 1.07529117365 -3.90137299632 -10.3467174501 45.5494406639 -0.695725929773 0.671015353306 -15.8558700193 32.3233921733 -0.0839969866996 -0.600813990917 5 5 5 3 3 2 3 4 4 2 1 3 6 1 2 9 3 3 9 3 9 3 8 4 9 3 9 4 5 2 2 5 1 4 3 9 6 3 3 0 168.0 0.857142857143 72.0 0.888888888889 0.181051587302 0.205782312925 0.0635627142722 0.111097613649 0.051886776536 0.0221720947184 0.0192004467405 0.0120592734603 0.0495338325687 1.16666666667 0.357142857143 0.0 4.0 6.0 4.0 2.0 1.0 0.0 2.0 3.0 12.0 0.228571428571 0.0 3.0 1.0 0.428571428571 0.25 0.666666666667 0.75 0.416666666667 0.583333333333 0.75 0.666666666667 0.833333333333 0.5 0.25 0.0 0.583333333333 0.25 0.25 0.0 0.416666666667 0.0 0.0 0.25 0.5 0.5 0.5 0.5 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.75 0.75 0.5 0.5 0.5 0.75 1.0 0.5 0.5 0.5 0.0 0.0 0.0 0.75 0.5 0.25 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 -9.09456817668 -0.909456817668 -20.2641607424 0.409576849749 2.6429928742 4.35240048455 -10.6399147291 18.7309571877 1.9214121838 3.39559585256 1.61525031264 37.1907637831 -0.542930622959 -0.762117183444 1.61317126242 33.1145624623 0.555646285716 -1.19879765456 4.29124219566 23.4801107368 -0.0959821347268 0.944728664497 3.399972649 31.7727509564 -0.132570020718 0.340337829798 0 5 2 5 1 4 4 2 2 4 4 2 3 2 5 1 4 3 4 1 5 2 3 1 6 3 2 1 6 5 8 4 8 4 9 2 81 2 8 4 7 4 8 3 8 0 252.0 0.571428571429 64.0 1.0625 0.0988756613757 0.0844671201814 0.0237187283791 0.0801541185257 0.0195205176427 0.00791055727426 0.00886626525194 0.00243754523619 0.0738141076621 0.666666666667 0.047619047619 2.0 4.0 2.0 0.0 5.0 2.0 4294967292.0 4294967294.0 5.0 2.0 0.384615384615 2.0 1.0 2.0 0.253968253968 0.5 0.0 0.0 0.277777777778 0.888888888889 0.444444444444 0.0 0.5 0.277777777778 0.777777777778 0.111111111111 0.277777777778 0.166666666667 0.5 0.0555555555556 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 1.0 0.833333333333 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.5 0.333333333333 0.666666666667 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 0.0 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 -5.21421908796 6.4874586327 -11.0737298789 11.9504187757 1.88078144606 -4.21814733528 -6.95926472165 5.92025040182 -0.762874219603 5.22463576299 -5.48497498346 20.1648987667 1.13040970678 -2.49178195909 -1.49405308246 16.1701871496 -0.415920677953 0.977894773883 -0.296076663461 14.9908265787 0.515449372058 -0.203761862323 1.79909297947 18.8978169271 -0.031579017905 0.145329591572 0 5 1 4 3 3 3 4 2 4 2 3 3 3 3 4 2 4 2 4 2 4 2 3 3 3 3 4 2 3 3 3 3 4 2 3 2 5 1 6 120.0 0.3 76.0 0.578947368421 0.234722222222 0.305833333333 0.0168744212963 0.374747685185 0.0437002314815 0.00118651121005 0.0045642525114 0.0008393464309 0.688142881974 1.0 0.0 1.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0 4.0 0.0 0.04 0.0 10.0 1.0 0.633333333333 0.7 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.8 0.8 0.8 0.7 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.47493004236 0.127323954474 -9.20973681686 0.309688887641 4.78101449048 0.375605665697 0.0226344488544 4.09969752487 -3.94771103944 2.12627820872 -6.38500488145 14.5490416125 3.2777871403 0.598369109965 0.640944943816 23.1691293977 -2.19726422412 0.892396879747 -3.10704312009 26.134842682 1.33646776011 -1.4602390833 -1.4783936197 13.8716185515 -0.221840338873 -0.256867183846 1 4 2 5 4 3 7 2 9 1 8 2 4 5 3 5 4 5 4 6 3 5 4 5 4 5 4 5 7 2 8 3 5 1 0 144.0 0.5625 80.0 0.5375 0.221450617284 0.265625 0.0367955755959 0.187065972222 0.0490089699074 0.00611213886029 0.0122205946181 0.00315620411898 0.160409935217 0.666666666667 0.0 2.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 2.0 4.0 0.214285714286 0.0 2.0 1.0 0.555555555556 0.583333333333 0.583333333333 0.5 0.583333333333 0.833333333333 1.0 1.0 1.0 0.833333333333 0.75 0.333333333333 0.333333333333 0.333333333333 0.5 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.25 0.5 0.25 0.75 1.0 1.0 0.75 0.5 0.75 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -8.27605704078 2.9443664472 -14.6293663904 8.12406949202 6.72678314162 1.74417653455 0.311087736245 15.8632130916 -4.60105827609 1.23182127761 -9.37108885752 21.8603239736 2.24302414377 -0.342048725652 -4.43897374992 18.7230635716 0.120490066626 -1.10121917628 3.16907298671 7.63339923894 -0.0290175868748 -0.931652451525 0.515749075073 -5.56187463309 -0.0416222982052 -0.330946946487 0 5 2 5 3 4 3 4 4 3 4 3 4 3 4 3 4 3 3 4 3 4 3 4 3 4 3 4 3 4 3 5 2 5 2 4 2 6 1 7 2 1 1 1 2 0 147.0 0.333333333333 86.0 0.511627906977 0.220602526725 0.289925494007 0.018532212737 0.335686535246 0.0491427261821 0.00147517855838 0.00900351292334 0.00229736182601 0.53807682565 0.428571428571 0.047619047619 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 6.0 0.142857142857 0.0 8.0 1.0 0.585034013605 0.5 0.166666666667 0.5 0.583333333333 0.833333333333 0.666666666667 1.0 0.916666666667 1.0 1.0 1.0 0.916666666667 1.0 1.0 1.0 0.916666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -6.24493681465 -0.848826363157 -10.2797606041 1.1844961603 5.6695661749 4.96592294092 0.330321509496 19.343227191 -4.91202577427 1.53161255369 -7.73588967248 30.3773389506 4.19424003484 -0.126742979936 0.997242436806 29.6096846898 -3.15818923439 -0.331196440504 -7.06270729199 24.1452430274 1.46717662856 -0.797382581518 -7.32769153949 17.5910713865 -0.255396523609 0.16046039062 11 2 11 5 12 4 13 3 13 3 14 2 14 3 13 3 12 4 6 10 4 3 3 6 4 2 6 4 4 2 6 4 3 3 6 4 3 3 7 3 3 3 7 2 3 4 7 3 3 4 6 4 2 5 4 5 3 13 6 11 10 4 2 0 352.0 0.727272727273 131.0 0.75572519084 0.202592329545 0.214617768595 0.0682179302671 0.143616960785 0.0683566694596 0.0190165811434 0.0214615364059 0.0148842062679 0.0776491458311 0.6875 0.409090909091 0.0 4.0 6.0 1.0 0.0 0.0 5.0 3.0 4.0 7.0 0.30612244898 0.0 2.0 2.0 0.372159090909 0.0 0.0833333333333 0.625 0.625 0.0 0.208333333333 0.291666666667 0.541666666667 0.125 0.25 0.0833333333333 0.333333333333 0.75 0.708333333333 0.708333333333 0.708333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 1.04174144569 -10.9382851798 -1.10350014361 -26.3485054957 -3.51838846396 1.66520791698 -1.5366802795 -10.5275010079 8.24066270332 9.7763970745 23.6946389027 33.5766161258 -5.37650014923 -2.93023508726 7.97081909787 28.161956846 1.59857059515 -1.07871514329 5.95907083068 8.01450466566 -0.0994772926957 -1.07774435709 8.89140094898 2.25542917856 -0.361363451006 0.39189795254 3 2 1 1 1 1 4 9 2 5 1 4 2 5 2 3 2 2 5 3 10 2 9 2 7 1 3 1 6 2 3 1 4 3 4 2 2 4 4 2 2 5 1 5 1 6 1 5 1 4 3 3 1 0 168.0 0.857142857143 83.0 0.771084337349 0.206845238095 0.241921768707 0.0674584193797 0.129813321658 0.0524964822238 0.0177031387289 0.0126176551875 0.0104380546526 0.0541842907986 0.916666666667 0.857142857143 3.0 4.0 3.0 1.0 3.0 2.0 3.0 3.0 3.0 13.0 0.176470588235 1.0 2.0 1.0 0.494047619048 0.666666666667 0.416666666667 0.166666666667 0.916666666667 0.916666666667 0.25 0.416666666667 0.833333333333 0.666666666667 0.0833333333333 0.166666666667 0.333333333333 0.833333333333 0.583333333333 0.416666666667 0.583333333333 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.25 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.25 0.25 0.25 0.0 0.75 1.0 1.0 1.0 0.75 0.75 0.75 0.5 -3.68330011156 -0.13641852265 -10.8486773471 1.86884325177 -2.57942369868 3.5872503354 -17.8014854141 16.2743976094 1.68756132882 2.00999994441 -12.6661987187 27.4368367846 -0.703582095182 -0.42674686516 -11.8946342576 28.0946971365 0.567004370683 0.850904667629 -11.3258520265 32.3413510697 -0.656337744221 -0.0224310820438 -14.3428055281 33.695160602 0.034299535794 -0.0452244927675 9 5 1 6 3 6 1 5 4 4 2 4 5 3 4 3 5 2 5 5 3 2 6 3 12 3 13 3 12 5 11 4 11 5 11 2 13 1 8 0 210.0 1.07142857143 71.0 0.929577464789 0.146984126984 0.11768707483 0.0662629305691 0.0478440773135 0.0299807796134 0.0269049431396 0.00952232763292 0.00385932181673 0.0113589228499 0.2 0.357142857143 0.0 1.0 1.0 0.0 2.0 3.0 0.0 0.0 0.0 1.0 0.368421052632 1.0 3.0 1.0 0.338095238095 0.625 0.5 0.125 0.0 0.5 0.6875 0.75 0.5 0.125 0.0625 0.25 0.75 0.875 0.4375 0.0 0.0625 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 0.75 0.5 0.75 1.0 1.0 1.0 0.25 0.5 0.25 0.0 0.5 0.75 0.5 0.75 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -7.21502408683 6.91793485973 -14.052289735 20.4146756174 4.43313715265 5.09126052621 -3.07600116486 35.3372597805 -2.22464604991 -2.50750014453 -8.43650382213 27.4964387761 -0.293536405561 0.71987143249 -13.2181012056 25.8110895742 0.403640386185 -0.0181465388285 -11.7297131809 29.2671524392 -0.917531674994 0.812783401329 -19.5223594804 36.7449233116 -0.128314240783 0.199065981136 5 2 8 6 5 7 1 2 1 5 3 3 1 4 2 4 2 9 2 3 9 3 9 3 9 3 9 4 6 1 2 4 4 2 2 5 2 3 2 9 6 5 3 0 180.0 0.8 87.0 0.735632183908 0.188888888889 0.227407407407 0.056950617284 0.121653635117 0.0421995884774 0.0166932750004 0.0110736043641 0.00636760998432 0.062633992535 1.0 0.4 0.0 4.0 6.0 2.0 1.0 2.0 0.0 2.0 0.0 9.0 0.129032258065 1.0 3.0 1.0 0.483333333333 0.25 0.75 1.0 0.833333333333 0.666666666667 0.833333333333 0.333333333333 0.75 0.833333333333 0.5 0.0 0.25 0.583333333333 0.416666666667 0.0 0.0833333333333 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 0.75 0.75 0.5 0.0 0.0 1.0 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.75 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.5 1.0 0.5 0.5 1.0 0.5 0.0 0.0 -12.90216072 5.00807554262 -31.404307482 14.2302756641 -0.119967459326 3.82650924511 -30.2043653756 32.0361817598 3.32072610125 3.56316767751 -11.3458311596 49.1388761728 0.105368894085 -0.824323491639 -7.52827796377 45.7123923733 -1.00758113739 -0.526828146134 -15.8902410088 42.7244513459 -0.445245802815 1.7126829613 -24.2573786823 55.3768322875 -0.336234129233 -0.0600431842859 5 8 9 4 1 5 7 4 3 4 7 2 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 5 3 6 4 5 7 1 5 3 9 2 4 5 4 6 3 6 2 7 3 6 2 7 3 6 2 7 2 7 2 7 2 7 2 7 3 5 3 6 4 5 3 7 3 6 3 5 4 6 14 4 6 4 1 10 1 3 0 396.0 0.818181818182 156.0 0.820512820513 0.17157687991 0.183539944904 0.0590750087087 0.104851748662 0.0475122069331 0.0188163835699 0.0153125279942 0.0122533971561 0.0515016201855 0.833333333333 0.954545454545 3.0 3.0 3.0 5.0 4.0 5.0 5.0 5.0 4.0 16.0 0.121212121212 3.0 1.0 2.0 0.393939393939 0.366666666667 0.733333333333 0.566666666667 0.7 0.466666666667 0.233333333333 0.133333333333 0.233333333333 0.633333333333 0.6 0.433333333333 0.466666666667 0.366666666667 0.566666666667 0.233333333333 0.5 0.0 0.111111111111 0.333333333333 0.444444444444 0.777777777778 0.444444444444 0.333333333333 0.333333333333 0.333333333333 0.777777777778 1.0 1.0 1.0 1.0 0.888888888889 0.777777777778 0.888888888889 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.222222222222 0.111111111111 0.666666666667 0.111111111111 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.666666666667 0.222222222222 0.0 0.222222222222 0.555555555556 0.111111111111 0.0 0.111111111111 1.0 0.888888888889 0.666666666667 0.888888888889 1.0 0.777777777778 0.666666666667 0.777777777778 0.555555555556 0.666666666667 0.666666666667 0.666666666667 0.888888888889 0.444444444444 0.333333333333 0.333333333333 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -11.2276578036 5.4402053275 -30.2247582311 11.9483966976 -2.88224699345 -0.913556547875 -29.4985611067 14.5966240154 9.25201419298 3.87944311987 4.45254765728 29.5279673099 -5.12111843357 -0.0192751957024 -8.54380529983 37.6975458472 1.12995907025 1.19677738625 -14.8859944979 40.9197717625 -0.493013242648 -1.19933379662 -11.4568284594 34.8926059459 0.136387670194 0.136667181426 2 4 3 6 2 6 3 6 2 6 3 5 3 4 3 5 1 6 2 5 4 2 5 0 88.0 0.727272727273 55.0 0.490909090909 0.285511363636 0.265495867769 0.0588710908152 0.120408468727 0.0358972929189 0.00661342220475 -0.00502210136065 -0.00158466915781 0.0173815175282 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 4.0 0.1875 0.0 4.0 1.0 0.625 0.333333333333 0.166666666667 0.0 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.5 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 -4.22484030753 4.51421293133 -10.4552693947 10.3047480421 -0.453908462793 -0.892511266144 -12.705709023 7.35980149344 -0.0794099670731 -0.564736141962 -12.8271630947 3.4753304502 -0.281822504351 0.286740607838 -13.9585706304 3.37309129822 0.116231769478 -0.68470018035 -13.3341216374 -3.04968161904 -0.0164454548907 -0.949322447386 -13.0428238911 -14.522136877 0.00527060853166 -0.214596316899 1 4 7 5 3 1 5 2 4 2 6 1 4 1 6 2 11 1 4 9 3 10 3 10 4 9 5 5 2 1 5 4 3 2 11 3 10 1 0 169.0 1.0 96.0 0.520833333333 0.236686390533 0.262630860264 0.0855712335002 0.108294734679 0.0407764218555 0.0225130101481 0.00820127503816 0.00427723255993 0.0112469907164 0.846153846154 0.384615384615 0.0 4.0 4.0 3.0 2.0 1.0 0.0 2.0 2.0 12.0 0.142857142857 0.0 2.0 3.0 0.568047337278 0.4375 0.8125 0.875 0.8125 0.6875 0.5 0.1875 0.75 0.875 0.5 0.0 0.5625 0.75 0.375 0.125 0.6875 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.25 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -7.34561275809 1.46912255162 -19.5887782935 4.04042653127 -2.87565526672 1.09532213908 -30.4599950316 10.5244448735 -0.0305644977477 2.31363268965 -30.7859901397 22.026654274 0.104606151814 -0.00907217297982 -29.2763183014 21.5597060137 -0.21895964732 -1.50915567167 -29.5650909279 9.4859959665 0.310595749278 -0.106550619742 -25.3272983404 4.18312817628 0.218752457595 -0.142998994977 19 2 1 2 26 8 22 1 7 6 18 2 9 6 16 2 12 4 15 2 5 2 6 5 14 2 4 4 6 4 13 2 4 7 4 4 13 2 3 4 3 2 3 4 13 2 4 2 4 2 3 4 13 2 10 2 3 3 14 2 10 2 2 4 14 3 8 2 3 4 15 5 1 3 5 4 17 1 1 5 5 4 30 3 30 3 30 3 30 2 31 1 18 7 21 3 2 5 2 2 2 1 18 2 1 4 4 6 21 15 19 6 7 5 30 7 1 1 7 2 17 8 6 4 18 7 2 1 2 4 20 8 2 4 21 13 24 9 28 1 6 0 1088.0 1.0625 270.0 1.09259259259 0.133569420415 0.125 0.0733487466773 0.0641185932093 0.0521734429066 0.034732192094 0.0233233569281 0.0230102980089 0.0247904489746 1.47058823529 1.1875 5.0 16.0 20.0 6.0 10.0 16.0 5.0 7.0 1.0 7.0 0.371134020619 6.0 3.0 1.0 0.248161764706 0.0555555555556 0.180555555556 0.180555555556 0.347222222222 0.277777777778 0.430555555556 0.138888888889 0.319444444444 0.472222222222 0.416666666667 0.222222222222 0.416666666667 0.277777777778 0.333333333333 0.0833333333333 0.263888888889 0.0 0.0 0.0 0.0 0.0 0.0 0.35 0.8 0.0 0.1 0.35 0.4 0.15 0.0 0.4 0.6 0.15 0.4 0.3 0.25 0.5 0.0 0.2 0.65 0.1 0.25 0.65 0.1 0.4 0.0 0.05 0.5 0.4 0.15 0.5 0.4 0.15 0.25 0.15 0.15 0.8 0.45 0.3 0.45 0.6 0.4 0.0 0.0 0.25 0.7 0.8 0.65 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.1 2.24689331424 12.1332238969 6.91625356432 26.9221672222 3.12077154441 -2.92718108239 22.5598803487 20.1246551819 3.01648541359 -0.460551119995 30.3303096404 2.12147588077 -3.8871279746 -6.54281724693 20.1640106355 -36.7077119911 4.38391761884 -0.211244069869 39.8904936146 -52.5770363457 -0.728397569863 -1.49230451889 48.8213959965 -68.3977083584 0.257486307663 -0.331601458777 8 3 4 13 2 7 3 4 1 7 3 4 3 4 5 3 3 3 6 3 3 3 6 3 4 2 6 3 4 2 6 3 4 2 6 3 3 3 6 3 3 4 4 4 2 6 2 6 1 5 5 3 1 0 210.0 1.07142857143 106.0 0.688679245283 0.239365079365 0.230612244898 0.105913400281 0.0921321671526 0.058019436346 0.0334937027681 0.0112753397629 0.0123945865657 -0.00136467753335 0.4 0.857142857143 2.0 1.0 1.0 0.0 1.0 3.0 3.0 3.0 1.0 7.0 0.131578947368 0.0 1.0 2.0 0.504761904762 0.75 0.625 0.3125 0.5 0.75 0.6875 0.5 0.6875 0.5 0.0625 0.0 0.125 0.75 0.5625 0.5 0.6875 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 4.49877972473 -5.73762265815 12.5802673654 -3.72238654456 2.56798269067 -16.7011219741 21.3546716946 1.5452160867 -0.705410337532 -11.1464250157 16.6197876201 0.510155589343 -1.56458018903 -6.95728059321 4.98486586864 -1.01149500422 -0.12432643373 -12.5718509972 2.15677857968 0.323342823198 0.394003097369 -14.7552710366 5.78212729195 -0.361676150375 0.0260604922305 5 5 5 3 1 4 3 4 2 3 2 3 5 3 1 3 6 1 2 3 8 3 9 4 8 3 10 3 10 3 10 3 3 2 4 8 1 0 156.0 0.923076923077 61.0 0.885245901639 0.154914529915 0.171597633136 0.0608521300089 0.0923607950235 0.0359992161028 0.0238421289116 0.0152285277745 0.00769069506134 0.0446489394931 0.75 0.384615384615 0.0 4.0 3.0 2.0 2.0 2.0 0.0 1.0 1.0 7.0 0.37037037037 1.0 2.0 1.0 0.391025641026 0.25 0.75 0.916666666667 0.25 0.583333333333 0.583333333333 0.5 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.25 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.75 0.5 1.0 0.75 0.5 0.5 0.25 0.25 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -8.42296929594 2.25265457915 -20.139541866 7.73936489386 0.405674866324 3.80349163955 -18.2058813928 23.6741450815 1.6476983645 2.58317500447 -9.04428969369 38.599518704 -0.668897015615 0.330066938422 -11.8313205613 41.8168660095 -0.7147394015 -0.315079166057 -19.0262977179 39.1220496198 -0.439284276636 0.222034955432 -26.6010812605 41.3822990046 -0.341453197478 0.226532366043 2 16 2 4 2 3 3 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 12 126.0 0.285714285714 78.0 0.435897435897 0.301587301587 0.288737717309 0.0236475542598 0.397423284423 0.0503605322199 0.000973029792734 0.00617469496649 -0.0016247701613 0.664921500114 0.666666666667 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 3.0 0.121212121212 0.0 9.0 1.0 0.619047619048 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -2.51616386221 2.42521818045 -4.78177780891 7.02903937309 1.38563273422 2.0292641918 -3.14329146418 16.278477271 -1.6249431624 1.99265166627 -5.15988919386 28.0580841251 1.84671959977 0.963847774794 -0.0638735748524 34.3200797784 -1.16348794303 -0.781962491345 -0.742492616956 26.3815979347 1.07035085396 -1.38316958638 1.22963281147 9.93671489048 -0.291182233233 -0.28545140667 3 1 6 3 5 3 4 4 3 20 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 5 6 3 4 5 3 1 0 144.0 0.444444444444 69.0 0.63768115942 0.177951388889 0.226851851852 0.0255188909251 0.208863811728 0.0489928948045 0.00492533097657 0.0199516027771 0.00581132179171 0.242131627854 0.5 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 6.0 0.107142857143 0.0 2.0 1.0 0.479166666667 0.3 0.8 0.5 0.3 0.6 1.0 1.0 0.7 0.9 1.0 1.0 0.9 0.9 0.7 0.5 0.8 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 -7.35649514736 4.10266075526 -11.8972463199 9.9006995419 7.42723067762 0.141471060526 5.107127515 11.6980590585 -4.90189354438 0.692552698904 -5.2369339779 15.1408009166 2.36903282239 0.665191181406 -1.98371252304 18.4846948871 -0.900736315284 -0.635673425256 -2.87117914045 14.1113281453 -0.392579809354 -0.163969967659 -7.92347336472 11.1403420787 0.233539027562 -0.0121346537226 1 4 2 15 1 5 2 1 4 3 8 3 9 3 8 3 8 2 8 3 8 3 7 4 7 5 7 4 5 0 143.0 0.846153846154 58.0 0.689655172414 0.144945963128 0.153308230231 0.0412966660705 0.089930706 0.0233064895885 0.0134749304988 0.00754721302975 -0.00135081984687 0.0495257014752 0.363636363636 0.153846153846 1.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 4.0 0.227272727273 0.0 5.0 1.0 0.405594405594 0.666666666667 0.166666666667 0.166666666667 0.5 1.0 0.833333333333 0.833333333333 1.0 0.583333333333 0.5 0.416666666667 0.5 0.5 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.25 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.5 0.75 0.25 0.0 0.25 0.5 0.25 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -9.79415034412 2.35059608259 -20.675761284 6.5561214461 3.87129729578 1.59951804436 -11.4257253793 13.9114810403 -1.6755777953 1.17649140438 -13.7357189384 17.9778174432 -0.188277518777 -1.28127701112 -17.8993043604 10.7653644305 -0.111133225352 -0.370607143063 -19.6546352069 4.03478476003 -0.736366011967 -0.542899242231 -25.8619121127 -2.92057819303 0.0212457798301 -0.247173027544 3 1 10 6 5 8 4 2 3 4 2 3 4 3 9 3 9 3 8 4 5 2 1 4 3 3 3 3 2 4 3 4 1 4 2 10 2 6 1 4 2 4 9 2 2 0 180.0 0.8 87.0 0.804597701149 0.225 0.247777777778 0.0698086419753 0.127918209877 0.0636018518519 0.0161090754023 0.0121544327514 0.0122152191398 0.0439312067933 0.666666666667 0.533333333333 3.0 3.0 2.0 0.0 0.0 2.0 2.0 3.0 1.0 5.0 0.185185185185 1.0 1.0 1.0 0.483333333333 0.416666666667 0.416666666667 0.166666666667 0.916666666667 0.666666666667 0.166666666667 0.333333333333 0.666666666667 0.583333333333 0.0833333333333 0.25 0.166666666667 0.666666666667 0.75 0.833333333333 0.833333333333 0.0 0.25 0.5 0.75 0.5 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 -4.20169049763 -0.0848826363157 -14.5798504828 2.5918062976 -6.01478360933 4.45577252233 -31.9110599892 19.7884430255 2.3696088258 1.88583648309 -28.4402311163 30.7670694627 -1.98144644027 -0.633004950404 -32.5260454103 29.2511978865 0.765508834891 0.497772949518 -33.3620333435 29.7037690547 -0.98211452582 -0.225922367836 -40.7292950639 31.1615546415 -0.290110040852 0.249716759805 0 1 2 4 8 20 5 10 2 7 7 9 3 4 10 5 6 4 11 4 6 4 11 3 7 3 12 3 7 3 12 3 7 4 10 4 7 6 1 5 2 5 6 19 5 7 8 4 7 5 9 4 7 4 11 3 7 4 10 5 6 4 10 4 7 4 11 3 7 4 11 3 7 4 10 5 4 7 8 8 1 11 4 9 17 2 1 4 18 2 3 1 3 0 575.0 1.08695652174 241.0 0.643153526971 0.203686956522 0.185860113422 0.101486925618 0.07802369557 0.0523506586669 0.0388498831237 0.0147062952337 0.0134176760138 0.00643302235112 0.96 1.04347826087 4.0 8.0 7.0 5.0 6.0 6.0 5.0 5.0 3.0 19.0 0.176470588235 2.0 2.0 7.0 0.419130434783 0.690476190476 0.52380952381 0.595238095238 0.690476190476 0.261904761905 0.357142857143 0.357142857143 0.261904761905 0.357142857143 0.404761904762 0.380952380952 0.309523809524 0.761904761905 0.47619047619 0.47619047619 0.595238095238 0.666666666667 0.333333333333 0.25 0.25 0.25 0.333333333333 0.25 0.25 1.0 1.0 0.916666666667 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 0.416666666667 0.166666666667 0.0833333333333 0.666666666667 0.75 0.333333333333 0.25 0.0833333333333 0.0 0.0 0.0 0.583333333333 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.583333333333 0.333333333333 0.0 0.0 0.916666666667 0.5 0.25 0.333333333333 0.666666666667 0.666666666667 0.416666666667 0.416666666667 1.0 1.0 0.833333333333 0.75 0.916666666667 0.833333333333 0.833333333333 0.833333333333 1.0 0.5 0.0833333333333 0.0 0.166666666667 0.0833333333333 0.0833333333333 0.0833333333333 -6.21340897831 4.63459194284 -20.5908075376 12.3092932663 -7.19956865641 3.50346630313 -36.7981904306 35.9836049756 8.26988844983 8.40093767912 2.77022852942 66.4806072314 3.00201752588 -5.67511450153 25.927931234 43.8343450598 -4.14737688108 -0.181081758322 -1.35037557042 22.9288245319 -0.00174489387636 -1.81236054689 -9.60132092289 13.2761079927 0.234348977469 0.318446521055 4 5 3 2 4 2 3 7 2 2 5 4 4 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 3 4 5 4 2 3 6 4 11 3 12 3 12 4 1 1 2 2 5 11 4 12 2 5 3 5 1 4 7 3 1 4 7 3 2 3 7 3 3 3 5 3 4 3 4 4 2 0 315.0 0.714285714286 143.0 0.762237762238 0.203174603175 0.222373393802 0.0578512039737 0.137582902414 0.0518412938368 0.0156308040158 0.0145388548477 0.00900960757228 0.0741521426706 1.0 0.809523809524 0.0 4.0 5.0 3.0 5.0 4.0 2.0 5.0 4.0 13.0 0.0943396226415 1.0 2.0 1.0 0.453968253968 0.375 0.5 0.541666666667 0.75 0.5 0.583333333333 0.75 0.416666666667 0.375 0.25 0.416666666667 0.0833333333333 0.75 0.458333333333 0.583333333333 0.708333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.5 0.666666666667 0.833333333333 0.666666666667 1.0 0.666666666667 0.333333333333 0.0 0.0 0.166666666667 0.333333333333 0.166666666667 0.833333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.5 0.0 0.0 0.333333333333 0.166666666667 0.166666666667 0.833333333333 0.333333333333 -10.7315904485 -1.51576136278 -22.8922425626 -1.37060041061 4.17813948434 2.73290742579 -11.291960035 4.59541090155 -0.681158516865 -1.32431938004 -10.3748990771 9.62691756062 -0.920881956298 4.82151785365 -13.0773133336 31.3689573902 2.21544480376 -1.5192235069 1.29573773856 32.5675816702 -0.322229105089 0.85419421751 3.16287162651 31.0517052105 -0.0102157812091 -0.26988705276 8 3 14 4 2 6 3 5 3 22 4 4 4 5 4 3 4 3 6 3 6 3 3 3 6 3 6 2 4 3 6 3 6 3 3 3 6 3 6 2 4 3 6 3 6 3 3 3 6 3 5 4 4 2 6 3 5 4 3 3 5 5 4 4 3 4 4 4 4 6 4 2 4 5 3 1 1 3 1 0 336.0 1.71428571429 151.0 0.754966887417 0.220858134921 0.207482993197 0.164564199626 0.0535798644855 0.0622131789224 0.0725913913134 0.0125854861354 0.0209980563226 -0.0233256849059 0.375 1.78571428571 2.0 1.0 2.0 4.0 2.0 6.0 6.0 6.0 1.0 13.0 0.203389830508 0.0 6.0 3.0 0.449404761905 0.583333333333 0.541666666667 0.5 0.5 0.625 0.0833333333333 0.0 0.125 0.625 0.583333333333 0.5 0.625 0.541666666667 0.208333333333 0.208333333333 0.375 0.333333333333 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 -3.20962468569 7.02934331989 -10.5429389512 14.4230274552 -5.01365701806 -3.97638678131 -32.4664558534 0.190471114688 -2.73386697022 -1.30192660409 -37.337195126 -5.43632524616 6.62330843642 3.35504770095 -0.989211948893 13.0585436544 -0.25846948663 -0.475457304086 9.159463412 12.6366016871 -1.08658421206 -1.25843181159 -7.17674339578 1.40160815072 -0.245056377703 0.19777468655 0 6 3 10 3 4 2 4 4 2 3 4 4 1 5 4 2 2 5 4 1 3 5 4 1 2 6 7 7 5 9 4 9 4 9 4 10 2 5 0 169.0 1.0 76.0 0.605263157895 0.206190259445 0.166135639508 0.0743232226508 0.0678087738711 0.0445932291914 0.0199581851585 0.0115440996028 0.00352019059901 0.00502691764363 0.0769230769231 0.538461538462 0.0 0.0 0.0 1.0 3.0 3.0 1.0 0.0 1.0 6.0 0.269230769231 0.0 3.0 2.0 0.449704142012 0.75 0.3125 0.125 0.0 0.75 0.9375 0.8125 0.4375 0.125 0.5 0.8125 0.6875 0.6875 0.375 0.125 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 1.0 -4.70119216518 4.30942615141 -9.36884014136 12.5254853005 2.74004395426 3.18976352036 -1.70618955535 24.1498172058 -0.73099661796 0.491734176935 -3.15295102223 29.5850620145 -0.857240034223 0.975714050474 -8.88479088315 34.063712689 0.389198835631 -0.0654824457903 -8.43225969864 36.5278516031 -0.526026664241 0.606782994833 -11.5272482308 39.4858831561 0.0345689482332 -0.109473307048 3 2 1 5 1 5 1 5 2 4 3 3 2 4 3 3 2 4 3 3 2 4 3 3 2 4 3 3 2 4 3 3 2 3 3 3 3 4 1 5 1 6 126.0 0.285714285714 80.0 0.575 0.261904761905 0.306878306878 0.0189504373178 0.390974496795 0.0461073318216 0.000980511700909 0.00245887567945 -0.00018277232827 0.724714272068 1.33333333333 0.0 1.0 6.0 0.0 1.0 0.0 0.0 0.0 0.0 3.0 1.0 0.107142857143 0.0 10.0 1.0 0.634920634921 0.583333333333 0.25 0.25 0.583333333333 0.75 0.75 0.75 0.916666666667 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -4.75949067913 2.1826963624 -8.83436806274 5.96912723653 3.13649177776 1.29509950452 -2.94725294689 12.4375590174 -2.45653289473 1.68510520479 -5.50146869537 21.8211438736 2.52024617227 0.67142276458 0.819819500505 26.4437285805 -1.68104141276 -0.539762566204 -1.70153665438 21.8447515809 1.17254217478 -0.550212560626 -0.06043367308 13.2592709503 -0.26038249836 -0.303945405792 6 4 6 6 3 3 1 4 3 2 4 1 4 2 8 3 9 1 9 2 7 4 7 5 6 5 7 3 8 3 9 2 9 2 9 3 8 3 8 3 8 3 7 4 7 5 6 5 5 0 242.0 0.5 78.0 0.769230769231 0.107062359128 0.150450788881 0.0197964535232 0.158250054613 0.0218167057189 0.00595980921197 0.0112488480637 -0.000123729563473 0.173868371284 0.454545454545 0.0909090909091 1.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 2.0 4.0 0.214285714286 0.0 3.0 2.0 0.322314049587 0.0555555555556 0.611111111111 0.555555555556 0.444444444444 0.5 0.777777777778 0.777777777778 1.0 0.444444444444 0.166666666667 0.111111111111 0.388888888889 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.5 1.0 1.0 0.666666666667 0.5 0.166666666667 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.333333333333 1.0 0.833333333333 0.5 0.833333333333 0.666666666667 0.5 0.833333333333 0.5 0.666666666667 0.333333333333 0.0 0.333333333333 0.166666666667 0.0 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -11.1697832788 2.28604372805 -18.6374036309 6.97676406211 10.9905396577 2.46379265585 9.30882217138 17.5639632563 -5.4751870802 1.71277597552 -2.01378612896 26.8187543032 1.5383400608 0.046795028457 -0.288044131024 28.1392560292 1.31677912181 -0.35458759495 9.92688103403 21.7507949955 -1.68053899881 -1.17504387616 0.713649825378 11.5752150125 0.348756419806 0.0971874109658 4 4 1 1 6 9 4 3 4 4 2 4 5 3 3 2 7 3 1 3 7 3 1 3 7 7 7 3 1 3 7 3 1 3 7 3 1 4 5 3 3 4 3 4 4 9 7 4 6 0 196.0 1.0 92.0 0.70652173913 0.201895043732 0.217930029155 0.0867373500837 0.0927085015597 0.04851454326 0.0291342078789 0.00945238767627 0.0108182150855 0.0172426961579 0.571428571429 0.785714285714 1.0 3.0 3.0 0.0 2.0 3.0 3.0 2.0 1.0 11.0 0.324324324324 0.0 2.0 3.0 0.469387755102 0.5625 0.75 0.75 0.75 0.5625 0.0625 0.0 0.4375 0.625 0.0625 0.0 0.4375 0.5625 0.75 0.75 0.6875 0.0 0.25 0.75 0.75 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.50060374915 0.863983976785 -10.4820424956 5.26114536965 -10.068522187 4.97463599093 -43.6936453258 24.0975311121 0.940980992449 1.76729504815 -42.5476538743 35.1613262694 2.70091108808 -0.487973676666 -23.8290812206 33.1324820317 -1.01945341708 0.19214598215 -26.6210260408 33.2686351031 -0.218379447519 0.285830085835 -31.6382839859 36.3003323958 -0.0453829093242 0.0491713797415 4 1 3 3 1 23 2 9 4 4 8 3 9 4 8 4 8 4 8 4 8 4 7 6 6 6 6 2 1 2 6 0 168.0 0.857142857143 79.0 0.53164556962 0.170634920635 0.187925170068 0.0465426249865 0.0956320524241 0.0250124851528 0.0129086965614 0.00473024464746 -0.00234348483011 0.0438683416224 0.25 0.142857142857 1.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 5.0 6.0 0.111111111111 0.0 2.0 1.0 0.470238095238 0.666666666667 0.416666666667 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.833333333333 0.25 0.0 0.166666666667 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.5 1.0 1.0 0.75 0.25 0.25 0.5 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -11.3682102208 6.91187181428 -22.2697387325 18.7654893762 7.15965239623 3.1199936949 -1.60207600475 29.8854372081 -0.971482454441 -0.327116579649 2.56621866474 29.610575988 -0.113901931346 0.478744573057 -1.2386955033 32.2902520458 0.174380081421 0.81625693821 1.90019324185 37.3552303491 0.503399379345 -0.552976782025 6.40016918894 33.2208116458 0.00560373912713 -0.0525903707385 5 2 10 3 7 3 3 2 3 3 4 3 1 11 1 8 4 4 2 1 5 2 10 3 8 4 9 4 6 1 1 5 1 1 2 2 2 9 5 6 7 1 1 1 4 0 180.0 0.8 79.0 0.886075949367 0.186111111111 0.211481481481 0.057475308642 0.111285836763 0.0492829218107 0.017562274203 0.0135071294814 0.00855880834902 0.0512874535125 1.0 0.466666666667 0.0 4.0 5.0 3.0 1.0 1.0 0.0 2.0 5.0 7.0 0.225806451613 0.0 4.0 1.0 0.438888888889 0.0833333333333 0.583333333333 0.75 0.666666666667 0.416666666667 1.0 0.666666666667 0.916666666667 0.583333333333 0.666666666667 0.0833333333333 0.5 0.25 0.583333333333 0.0833333333333 0.333333333333 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.25 0.5 0.75 0.75 0.75 1.0 0.75 0.25 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.25 0.25 0.0 0.5 1.0 0.75 0.25 0.0 -9.29464867657 3.81971863421 -19.4941442394 10.9980029907 4.42464888902 3.04558899101 -4.44100612801 23.9545311324 1.42868165844 1.36986742288 6.25126398137 26.6789519881 -0.966970231403 -3.52163261249 3.05435117139 2.48092993682 0.68559834521 -1.95997337681 4.08023390086 -17.2966792946 -0.894391304235 0.633466698516 -2.70617070812 -14.7200305032 -0.052261369387 0.0169583075961 6 6 5 7 5 2 1 1 1 2 3 4 9 3 8 3 10 2 9 3 6 6 6 6 8 4 8 4 8 4 9 3 9 3 8 4 8 4 8 4 8 5 6 7 5 6 6 2 9 0 264.0 0.545454545455 95.0 0.673684210526 0.133522727273 0.168904958678 0.0252416011875 0.153433384725 0.0281819681839 0.0065228998985 0.0114918362101 8.30571239117e-05 0.146590289983 0.5 0.0909090909091 2.0 2.0 2.0 0.0 2.0 0.0 0.0 0.0 2.0 8.0 0.25 1.0 3.0 1.0 0.359848484848 0.0 0.388888888889 0.222222222222 0.444444444444 0.277777777778 0.777777777778 0.888888888889 1.0 0.722222222222 0.666666666667 0.666666666667 0.833333333333 0.555555555556 0.0 0.0 0.222222222222 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.5 0.166666666667 0.333333333333 0.0 0.166666666667 0.166666666667 0.5 1.0 1.0 0.666666666667 0.833333333333 0.0 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 -12.4140855612 1.24430228235 -20.5074504951 4.79888151601 12.1561612845 2.979461846 8.63927937826 17.1973981616 -6.93911144388 1.85229015448 -4.29038770381 26.3906704687 3.12162263564 -1.1182682381 -2.49435300856 18.1071617981 -1.55655086455 -1.61540438064 -4.42465509908 2.1406963669 -0.140441661607 -0.755363286092 -12.5162100581 -10.4558622353 -0.0833009576903 -0.374471500638 3 2 6 2 7 2 6 4 1 2 1 8 1 8 1 5 4 4 5 4 5 4 6 3 6 3 6 3 6 3 6 4 2 2 2 6 3 5 2 0 153.0 0.529411764706 74.0 0.635135135135 0.159767610748 0.236063052672 0.0268982071305 0.183347168021 0.0430656663252 0.00603326235326 0.0151859431596 0.00564819365186 0.195379132289 0.555555555556 0.117647058824 0.0 0.0 3.0 2.0 1.0 0.0 0.0 1.0 3.0 6.0 0.25 1.0 4.0 1.0 0.483660130719 0.466666666667 1.0 0.8 0.533333333333 0.8 0.866666666667 0.666666666667 0.866666666667 0.4 0.466666666667 0.0 0.466666666667 0.266666666667 0.266666666667 0.0 0.333333333333 0.0 0.5 1.0 1.0 0.833333333333 0.5 0.5 0.166666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 0.666666666667 0.5 0.5 0.666666666667 1.0 0.166666666667 0.5 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.833333333333 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.333333333333 0.5 -10.7850879083 1.94730753901 -19.4034031329 3.09997147517 8.95647438755 -2.05356200946 4.8162975127 -1.32417378495 -3.11569780153 2.01358364165 0.816992332061 7.55641339492 0.294227527523 0.879575190361 -2.37061433775 13.0078619679 0.800159522415 -1.47460869036 3.56353255128 3.49474762261 -0.795247979133 0.192163638516 -1.43942939139 2.17694101378 0.0535326851297 0.0388871051877 1 5 1 6 3 4 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 2 5 2 5 3 4 3 3 4 3 3 4 3 4 4 3 4 2 6 1 6 147.0 0.333333333333 77.0 0.636363636364 0.262390670554 0.254940071267 0.0265667838703 0.338914593094 0.0623115274154 0.00185431859632 0.0185502452801 0.00185197114295 0.479635123011 0.714285714286 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 3.0 0.148148148148 0.0 3.0 1.0 0.52380952381 0.25 0.0 0.0 0.166666666667 0.416666666667 0.0833333333333 0.166666666667 0.666666666667 0.75 0.583333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.75828318082 -0.303152272556 -3.44665497444 0.912139946714 0.893371186879 2.75765455008 -2.21166964587 12.9512435486 -1.03812191165 2.80600621601 -4.66845464254 30.3450561326 0.522063937365 1.25754775473 -4.31991704828 39.0732457327 -0.374204182747 -0.623056327895 -4.63771744475 35.6014709598 0.105191177066 -0.251084741783 -7.06907095149 27.8291224498 -0.149389249143 -0.37260284995 1 5 6 5 9 3 3 4 4 2 3 4 4 1 6 1 5 1 3 9 4 10 3 10 3 10 4 9 4 6 1 3 4 4 2 5 7 7 5 3 0 182.0 0.928571428571 80.0 0.8 0.192307692308 0.185635792779 0.0726814394397 0.090801828892 0.0393521313851 0.0246851866082 0.0126528976584 0.00556182161995 0.027869597105 0.846153846154 0.357142857143 0.0 3.0 5.0 3.0 1.0 2.0 0.0 2.0 2.0 8.0 0.230769230769 1.0 3.0 2.0 0.43956043956 0.3125 0.75 0.8125 0.5 0.625 0.5 0.3125 0.625 0.625 0.25 0.0 0.25 0.8125 0.5 0.0 0.3125 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.5 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 -9.18551385845 3.95613715686 -21.3822855647 12.6851122748 1.25328717578 5.23053672304 -16.9008901984 34.8649632496 1.49838313666 3.54842276026 -7.57272500056 53.7781656685 -0.5009578847 -0.716951131032 -7.59502630604 47.5825276379 0.483490179436 -2.4448824966 -4.82802666072 25.062542958 -0.0420248708283 -0.755424157187 -6.79910901608 12.8093310499 -0.346939439504 -0.0682932675031 3 2 7 3 5 4 3 6 3 18 1 5 5 2 7 2 7 2 7 2 6 4 5 4 5 5 4 8 2 6 3 5 2 0 153.0 0.529411764706 78.0 0.576923076923 0.19825708061 0.248750480584 0.0324611197805 0.195522810203 0.0499187927553 0.00594095639649 0.0144819303968 0.00439857629793 0.191970523303 0.666666666667 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 5.0 0.0666666666667 0.0 3.0 1.0 0.509803921569 0.466666666667 0.666666666667 0.466666666667 0.533333333333 0.866666666667 0.866666666667 0.8 1.0 0.666666666667 0.533333333333 0.133333333333 0.8 0.2 0.4 0.0 0.4 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.333333333333 0.5 0.166666666667 0.166666666667 0.833333333333 1.0 0.666666666667 0.5 0.833333333333 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.833333333333 1.0 1.0 0.833333333333 1.0 1.0 0.333333333333 0.0 0.333333333333 0.833333333333 1.0 0.333333333333 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.5 1.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.5 -8.53819459411 2.77116842089 -16.0039051813 7.17913812348 5.9678730381 0.929337880607 -1.42653674948 12.0083479126 -2.8072540496 1.17494093268 -3.78871349674 17.7187691274 2.12233572256 -0.104226918199 2.87900883764 14.9854861208 -0.34355767319 -1.59960203615 3.31533447887 2.43388123242 -0.831509508521 -0.134669092134 -2.85946153707 -2.93746241623 0.289932183276 -0.0860428096072 1 5 2 5 3 14 2 14 3 5 4 4 3 5 5 4 3 3 6 3 4 3 6 3 4 3 6 3 4 3 7 3 2 4 7 2 3 4 6 3 3 5 4 5 1 6 4 6 2 1 13 0 224.0 1.14285714286 116.0 0.629310344828 0.224330357143 0.207908163265 0.102124806396 0.0744223191509 0.0453560609512 0.0336969936083 0.00853676765231 0.0112978387004 -0.00564290413545 0.4375 0.785714285714 2.0 1.0 2.0 2.0 1.0 3.0 3.0 3.0 2.0 9.0 0.184210526316 0.0 1.0 2.0 0.517857142857 0.875 0.625 0.5625 0.8125 0.875 0.625 0.5 0.625 0.625 0.0 0.0 0.0 0.9375 0.5625 0.375 0.5625 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.97359197162 11.1806347522 -16.5963714219 28.7523760362 -6.25771124879 2.5760097918 -33.9082453176 37.3691487924 3.98349260656 -1.78751575443 -17.4924527718 26.7076079491 0.741234990891 -0.887385633258 -10.6804310973 19.5839702365 -2.51823064695 1.03115482315 -26.638957228 25.7819691963 0.800456432702 0.0624881150237 -24.7635054999 26.5336919337 0.0320470223167 -0.230007251737 5 6 6 8 3 3 4 4 1 4 4 3 2 3 9 4 9 4 9 4 9 4 10 4 9 4 10 6 1 2 5 8 7 5 3 0 182.0 0.928571428571 76.0 0.697368421053 0.160185967878 0.189952904239 0.0588625690214 0.0979615723004 0.0371063244207 0.0208133733159 0.0146984156299 0.00541553707855 0.044280706061 0.538461538462 0.214285714286 0.0 2.0 3.0 2.0 1.0 1.0 0.0 1.0 2.0 6.0 0.0909090909091 0.0 2.0 1.0 0.417582417582 0.3125 0.875 0.9375 0.5625 0.5625 0.3125 0.3125 0.75 0.625 0.0625 0.0 0.4375 0.75 0.1875 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -11.4591559026 0.181891363534 -27.0417046791 5.20161800066 1.04958740896 7.52900322627 -22.9165511579 34.0247972592 2.14971387494 2.98034605131 -9.82327452342 51.1135568119 -0.310151688675 -1.74845958031 -8.11976497156 40.5331448417 0.246402955541 -0.880397764392 -6.91704264198 28.0750685891 -0.0357576741456 -0.826587504587 -8.66498048894 15.8178034205 -0.259481714443 -0.393558217303 7 3 8 6 5 1 5 3 3 2 5 4 1 11 2 6 2 3 1 5 8 4 10 3 10 3 10 4 6 1 3 4 4 2 4 9 4 7 3 0 182.0 0.928571428571 81.0 0.851851851852 0.192307692308 0.213893249608 0.0712323390895 0.101467048228 0.0455711870547 0.0230336892175 0.0121671226285 0.00677318529167 0.0340961127415 0.923076923077 0.357142857143 0.0 3.0 6.0 3.0 1.0 2.0 0.0 2.0 1.0 7.0 0.181818181818 2.0 3.0 1.0 0.445054945055 0.1875 0.75 0.875 0.5625 0.25 0.6875 0.3125 0.625 0.5625 0.4375 0.0 0.25 0.625 0.625 0.0 0.375 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.25 0.25 0.0 0.5 1.0 0.75 0.25 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -9.45835090375 2.86478897565 -22.369135967 7.6245583421 0.675596493125 1.86461848051 -20.4791326855 20.1912045673 1.00684180218 5.31680680814 -13.303547578 46.9543603706 -0.130182139105 0.502183558969 -10.9468684073 49.8760601127 0.768810169708 -3.16512079019 -5.72616412822 24.9430352216 -0.260228582438 -0.335561576872 -9.22426818398 13.4884789899 -0.366995145145 -0.199475059179 2 8 3 3 3 4 1 3 4 4 2 1 5 4 8 3 8 4 9 3 5 1 4 2 3 2 4 3 3 2 4 3 3 2 4 5 1 3 4 4 144.0 1.0 64.0 0.90625 0.231481481481 0.196180555556 0.0986153978052 0.0943739149306 0.0593332047325 0.0267201947747 0.0163741109575 0.0138931681408 0.00996958135632 0.583333333333 0.666666666667 2.0 2.0 2.0 1.0 2.0 1.0 2.0 3.0 2.0 5.0 0.185185185185 1.0 1.0 1.0 0.444444444444 0.666666666667 0.444444444444 0.0 0.222222222222 0.666666666667 0.111111111111 0.0 0.222222222222 0.333333333333 0.0 0.111111111111 0.0 0.777777777778 0.666666666667 0.777777777778 0.555555555556 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.75 0.5 0.5 0.5 0.75 0.75 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 4.03192522499 -6.36110936293e-16 6.6273411221 -0.585392401706 -4.02308328371 -0.760406950328 -3.23684759459 -2.68194231969 2.14458011023 0.177821263578 0.377712865984 -3.67774869919 -1.12616096962 -0.546316216444 -1.81415510881 -4.67394654193 0.18866858921 0.706947090578 -2.39769193218 -1.7272770693 0.513238835651 -0.317852509858 2.9112112847 -1.37605174491 -0.0641062863291 0.101289150066 4 7 4 10 2 12 1 11 1 12 2 2 10 3 10 3 10 3 10 4 10 3 5 3 2 4 3 4 4 7 7 6 3 0 182.0 0.928571428571 94.0 0.563829787234 0.214285714286 0.209576138148 0.0731385960978 0.0964016662 0.0370253765073 0.0197020597128 0.0103501789988 0.00428963682633 0.0229312370458 0.769230769231 0.142857142857 1.0 3.0 3.0 3.0 0.0 0.0 0.0 2.0 3.0 10.0 0.0689655172414 1.0 2.0 1.0 0.516483516484 0.5 0.75 0.8125 0.6875 0.9375 0.5 0.0625 0.5 1.0 0.5 0.0 0.4375 0.75 0.375 0.0 0.4375 0.0 0.25 0.5 0.75 0.75 0.75 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -9.00362249491 5.59315942866 -23.6670504415 15.5306790631 -2.74925083912 3.31789335446 -32.2384182519 29.2760566822 2.02774117044 1.54728632669 -20.9132674434 37.5545167787 1.06634151761 -0.203180505026 -12.4375649104 34.6928438655 -1.06442241355 -1.23889981639 -19.8404808037 22.5262272235 -0.665014511675 -0.852999461624 -28.7675565465 10.2679368287 -0.127526223863 -0.284994847754 0 6 1 1 1 2 3 21 2 4 2 6 2 4 3 5 3 2 5 5 2 2 5 5 2 1 7 7 7 7 8 5 9 5 10 4 10 3 11 2 6 0 196.0 1.0 97.0 0.505154639175 0.223032069971 0.171647230321 0.0751005108416 0.064274212913 0.0440005864903 0.0166482376036 0.00991243406692 0.0031422949998 -0.00135038027316 0.214285714286 0.5 0.0 0.0 3.0 0.0 3.0 3.0 0.0 0.0 7.0 6.0 0.162162162162 0.0 5.0 2.0 0.494897959184 0.9375 0.4375 0.0625 0.0 0.9375 1.0 0.75 0.375 0.625 0.4375 0.875 0.9375 0.875 0.5625 0.375 0.1875 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.0 0.0 0.25 0.5 0.75 1.0 -3.95613715686 9.14004101756 -7.56086395922 25.2300820021 2.70749006688 4.48928301578 -0.163094272304 39.556919638 -0.827118968547 -1.68619771177 -0.992003016678 34.1626980195 -0.0393822209671 0.628292306423 -1.75579324095 33.1978525119 0.597729830629 -0.247322032869 2.03359398077 30.8922071824 -0.375988043025 -0.717328995772 0.365230666894 23.4154696719 0.0618463930283 0.0306111830365 0 4 5 3 3 5 4 4 2 6 4 4 1 5 5 4 2 4 5 4 2 4 5 3 3 4 5 3 3 4 6 2 3 4 5 4 2 4 5 4 3 4 3 5 3 13 3 7 1 4 6 2 7 0 210.0 1.07142857143 114.0 0.59649122807 0.244444444444 0.249659863946 0.103779289494 0.0899885541518 0.0598110355253 0.0304793733802 0.0103094448363 0.00979759964244 -0.00969153518109 0.266666666667 0.857142857143 0.0 1.0 1.0 1.0 3.0 3.0 3.0 2.0 1.0 5.0 0.264705882353 0.0 2.0 2.0 0.542857142857 1.0 0.8125 0.75 0.5 0.5 0.5 0.5 0.8125 0.125 0.0 0.0 0.5625 0.8125 0.75 0.6875 0.875 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.49877972473 0.0424413181578 -15.0049923847 4.29858533012 -5.53547965627 6.20605248316 -29.7591250035 25.0903679715 3.73553182592 -0.171102436137 -16.3606388496 26.5203877505 -0.444806401458 -1.63988784041 -13.792214674 15.8836640175 -0.752152166231 0.795955086046 -17.8848299811 19.9536042504 1.18905081924 0.701767608373 -10.5941896384 29.5088290768 -0.163304585462 0.210539066705 1 2 6 4 2 6 3 5 3 3 5 4 3 3 5 3 4 3 5 3 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 4 3 5 3 4 4 4 4 3 13 3 6 2 3 5 5 3 2 1 0 210.0 1.07142857143 99.0 0.69696969697 0.226031746032 0.228911564626 0.0990018356549 0.0961495518842 0.0609798077961 0.0314630188818 0.0143952547414 0.0108741071664 0.00442504528396 0.266666666667 0.928571428571 0.0 1.0 1.0 1.0 3.0 3.0 3.0 2.0 1.0 7.0 0.162162162162 0.0 1.0 2.0 0.471428571429 0.625 0.5 0.5 0.4375 0.4375 0.5 0.5 0.8125 0.125 0.0 0.0 0.4375 0.875 0.625 0.5625 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.24413181578 -2.24938986237 -12.187241248 -1.73457952259 -2.27032757932 5.52812316112 -15.5706830166 17.2900479222 4.31532424518 0.745856389769 4.18297138651 24.5722185859 0.0980467339062 -0.574153119635 7.5382229889 22.0880754463 -1.86534291046 0.82880938433 -5.76925259115 26.173101307 0.397860896849 -0.134113974748 -8.92258193935 27.7177182854 -0.310598843575 0.155691043003 2 3 3 5 2 5 1 7 1 6 3 4 3 4 4 2 4 3 4 2 4 2 5 1 4 0 84.0 0.583333333333 44.0 0.636363636364 0.258503401361 0.189484126984 0.0497381492279 0.108659634489 0.047956484181 0.00666660473886 0.00779247921979 0.002875838063 0.0413585085094 0.285714285714 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.294117647059 0.0 2.0 1.0 0.52380952381 0.333333333333 0.666666666667 0.166666666667 0.0 0.833333333333 1.0 0.333333333333 0.0 1.0 1.0 0.666666666667 0.333333333333 1.0 1.0 1.0 0.833333333333 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 -1.9098593171 7.42723067762 -5.23015687858 17.0658231991 -0.658724625575 -1.13618945485 -5.89694423321 14.4357816446 1.41821054035 -0.0642064115843 -0.599929779495 11.6086362883 -0.62454105916 0.100776995133 -1.24620734491 10.7980157604 0.356138445458 -0.791267424386 -0.400511986886 3.2673566494 -0.0348897075088 -0.694304201908 0.122946745467 -4.86932110414 -0.0580775781147 -0.0703415635036 4 6 5 3 3 4 2 2 6 6 8 5 8 5 8 5 8 5 8 6 7 7 6 2 1 4 5 3 3 8 8 2 6 0 169.0 1.0 73.0 0.780821917808 0.207100591716 0.194811106054 0.104618185638 0.0857137707334 0.0469763771469 0.0409947855819 0.00945608618313 0.0125073553531 0.0118319905152 0.615384615385 0.769230769231 1.0 3.0 3.0 1.0 2.0 3.0 3.0 2.0 1.0 10.0 0.2 0.0 2.0 2.0 0.431952662722 0.375 0.5 0.6875 0.625 0.3125 0.0 0.0625 0.5 0.4375 0.0 0.0 0.375 0.6875 0.75 0.6875 0.375 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.75 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 3.13412811012 -1.17529804129 4.13581950693 -0.655576170946 -5.21813785198 3.51198527132 -14.2067797872 13.1401478704 -0.964621447148 1.82810880167 -20.3973727259 22.9180859448 2.0496270382 -1.21026172115 -7.74521927374 15.7900158111 0.179297425353 -0.545418683191 -1.30049820347 10.1647768219 0.621034017336 0.509993718851 6.48992563218 13.0628862005 0.293452423304 -0.0766666744018 5 1 3 1 1 1 2 10 1 12 2 6 7 4 8 4 8 4 8 3 9 3 9 3 9 4 8 4 7 6 3 0 156.0 0.923076923077 66.0 0.636363636364 0.201388888889 0.168145956607 0.0651675158887 0.0825776205769 0.0419097907079 0.0155460362997 0.0122623347691 0.00163910563042 0.0221341058762 0.25 0.230769230769 0.0 1.0 2.0 0.0 2.0 1.0 0.0 0.0 2.0 7.0 0.12 0.0 2.0 2.0 0.423076923077 0.333333333333 0.0833333333333 0.0 0.0 0.666666666667 0.416666666667 0.333333333333 0.416666666667 0.833333333333 1.0 1.0 1.0 0.75 0.75 0.416666666667 0.666666666667 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.0 -4.45633840657 5.58266569615 -7.51464688037 14.7600322652 4.08717427822 2.3210397709 1.74261313835 25.6623912907 -2.65954509839 1.82908612489 -3.25711628224 34.0317633749 1.53133776279 -0.0935914462107 0.00683995748006 36.2638998019 -0.351322633026 0.636495941425 1.75142574199 38.7384523971 -0.0325036597862 -0.131459263517 -0.509186128833 40.960077628 0.0405897227225 0.272680230004 9 2 6 3 3 4 2 6 4 5 2 4 5 12 3 4 4 6 3 3 5 2 5 4 5 3 3 3 6 3 6 3 2 3 6 3 5 4 2 3 6 3 5 4 2 3 5 4 5 4 2 3 6 2 6 4 1 4 6 3 5 4 1 4 5 4 5 10 3 6 3 11 3 6 3 5 322.0 1.64285714286 164.0 0.615853658537 0.256008641642 0.251330967169 0.182477288254 0.0649510840511 0.0617903515244 0.070942886039 0.00767150698149 0.0160243158148 -0.0400686147277 0.434782608696 1.85714285714 3.0 1.0 2.0 2.0 4.0 6.0 6.0 6.0 3.0 9.0 0.188679245283 1.0 6.0 3.0 0.509316770186 0.5 0.5 0.5 0.708333333333 0.458333333333 0.125 0.0416666666667 0.166666666667 0.583333333333 0.625 0.5 0.583333333333 0.708333333333 0.333333333333 0.333333333333 0.375 0.5 1.0 0.833333333333 0.333333333333 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.833333333333 0.833333333333 0.833333333333 1.0 1.0 1.0 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.166666666667 0.5 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.0 0.5 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 2.87862853592 4.73312961195 4.99964406092 9.08643030751 -3.67394542094 -3.6591378763 -12.6579628118 -4.50632998179 -4.75440054047 -1.72987920889 -35.3091168236 -14.4823304512 1.76221086071 1.50171196875 -29.799964791 -5.64717912008 0.110870417257 0.366319804752 -25.7145777718 -3.03339941585 -0.886300564869 -1.23185392361 -33.5951480952 -11.5870018405 0.113860906571 0.153179829539 10 2 8 5 8 5 9 4 10 3 9 4 9 5 8 4 8 5 4 9 3 2 4 4 2 3 5 3 2 2 6 2 2 3 6 2 2 3 6 2 2 3 7 1 2 4 5 3 2 3 5 3 2 3 5 3 3 3 4 4 2 4 3 3 1 0 273.0 0.619047619048 109.0 0.743119266055 0.218089602705 0.20966335252 0.0646672089735 0.157867107511 0.0564630126277 0.016785104129 0.0148588761632 0.0101056822867 0.101370716011 0.615384615385 0.52380952381 0.0 3.0 2.0 2.0 0.0 0.0 5.0 5.0 2.0 9.0 0.333333333333 0.0 1.0 2.0 0.399267399267 0.0 0.125 0.666666666667 0.708333333333 0.0 0.208333333333 0.0833333333333 0.333333333333 0.458333333333 0.625 0.25 0.208333333333 0.708333333333 0.791666666667 0.541666666667 0.708333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.666666666667 0.5 0.333333333333 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 1.06018489382e-16 -2.12206590789 -2.14302693971 -7.41980263122 -2.01936534209 -2.12247835996 -2.04877454285 -6.31896159375 4.84099392073 6.79070287303 11.2328367859 20.3459730691 -4.00184357658 -1.64849841951 -0.713391337651 23.3898272347 1.86157658678 1.18577311459 1.14461544494 25.1280944454 -0.870330560483 -0.298592062914 -0.552457779825 26.2184700127 -0.0432638169879 -0.0924805162391 2 3 3 3 1 5 1 15 2 5 2 1 4 4 7 4 7 3 8 3 8 3 7 4 7 4 7 5 5 6 7 2 6 0 154.0 0.785714285714 70.0 0.628571428571 0.187131050767 0.174860853432 0.0490164456896 0.0980808068639 0.0300627227386 0.0127524945741 0.00692594665615 -0.00166294691967 0.043785299481 0.272727272727 0.214285714286 1.0 1.0 1.0 0.0 2.0 1.0 0.0 0.0 1.0 6.0 0.0833333333333 0.0 1.0 1.0 0.454545454545 0.583333333333 0.0833333333333 0.0833333333333 0.416666666667 1.0 0.75 0.75 1.0 0.75 0.916666666667 0.666666666667 0.833333333333 0.583333333333 0.25 0.0 0.166666666667 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.91227431371 5.41126806512 -14.4137759927 14.4452628812 6.10960097869 2.25345767092 0.764041609163 23.602126058 -2.91008662962 0.504299203048 -3.52629570113 25.0605336075 1.13070038704 -0.801861995664 -3.13990392969 20.0466176805 -0.137034181414 0.136104687654 0.295627521847 19.7879039873 0.209421122115 0.187964495215 0.0686795589806 18.7787325005 -0.0389446848085 -0.382793966235 7 2 8 8 3 3 4 4 2 3 4 4 1 5 1 17 2 4 9 4 9 4 9 4 10 3 8 1 1 6 4 2 2 7 1 2 4 1 1 6 2 0 182.0 0.928571428571 90.0 0.677777777778 0.208791208791 0.231161695447 0.0776217503062 0.102971883207 0.0428476547001 0.0251799233825 0.00964890053795 0.00586089656764 0.0278055216995 1.0 0.5 0.0 3.0 6.0 3.0 1.0 2.0 0.0 3.0 5.0 13.0 0.157894736842 0.0 3.0 1.0 0.494505494505 0.25 0.8125 1.0 0.75 0.4375 0.625 0.25 0.625 0.5 0.5 0.0 0.25 0.6875 0.625 0.0 0.3125 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.75 0.5 0.0 0.25 0.75 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 -9.64024226728 3.45593590714 -23.1760178175 8.43386628674 0.145698694259 0.919665006438 -23.170025505 17.4025776791 0.719980334279 4.67799246458 -19.877074498 39.0579505787 -1.74441337138 -0.219904048971 -29.6164548921 38.0585427062 -0.334610919044 -2.73923871758 -32.9878489935 14.8468411943 0.705799783043 -0.616001632512 -28.1128695914 0.322428113746 -0.183555284836 -0.368901477186 1 2 2 3 4 2 4 2 3 27 2 3 4 2 4 3 3 3 4 2 4 2 4 2 4 2 4 2 4 3 3 2 11 126.0 0.285714285714 64.0 0.6875 0.199735449735 0.28835978836 0.0171352785676 0.436798381904 0.0601291957112 0.00191960004059 0.0214353304329 0.00470124116692 0.826823970165 1.0 204522252.0 1.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 4.0 0.0 0.210526315789 1.0 3.0 1.0 0.507936507937 0.25 0.416666666667 0.583333333333 0.5 0.583333333333 0.5 1.0 0.916666666667 0.666666666667 0.416666666667 1.0 1.0 0.5 0.166666666667 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.3047622703 -4.91106681541 -6.55982308818 -6.49323319465 4.34930709402 7.56973286833 0.317170608258 16.8466768341 -4.65963441149 -0.644460570421 -8.22669262458 22.3059123567 4.21396592667 0.549753382076 1.98994412276 22.0763901614 -2.80130738514 0.0551910000327 -3.30185209762 23.8762447933 1.6199848949 -0.304791280561 -1.25511892526 16.4189523099 -0.224315551229 -0.432040883182 3 2 11 5 9 6 10 5 11 4 11 4 12 3 11 4 11 4 11 4 3 3 6 3 3 4 5 3 5 3 4 3 6 2 3 3 6 3 3 2 8 2 3 2 8 3 2 3 7 2 3 4 5 3 3 4 5 3 3 4 5 3 2 5 4 11 4 11 4 5 345.0 0.652173913043 135.0 0.681481481481 0.160579710145 0.219911783239 0.0472621206725 0.167030796721 0.0658418490818 0.0173993138571 0.0247145430148 0.019509665222 0.141052615174 0.466666666667 0.608695652174 4.0 2.0 4294967294.0 2.0 0.0 1.0 5.0 5.0 2.0 8.0 0.159090909091 1.0 0.0 2.0 0.391304347826 0.625 0.416666666667 0.375 0.541666666667 0.708333333333 0.75 0.541666666667 0.625 0.0 0.0833333333333 0.0416666666667 0.0 0.0 0.291666666667 0.458333333333 0.458333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.333333333333 0.0 0.333333333333 0.5 0.833333333333 1.0 0.833333333333 0.833333333333 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 0.166666666667 0.333333333333 0.5 0.5 0.5 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -9.63233394713 -9.63233394713 -21.7514081187 -23.8943572651 2.35204504048 -0.114274478742 -13.8478741914 -19.2987018383 0.774263657774 5.10753555961 -11.6926990661 2.53714378442 -3.35255251031 -1.98875232843 -27.7668403647 3.16571772854 1.43331655804 2.56648720282 -23.1706352842 18.21979937 -0.134660296442 0.62880506026 -23.0822132416 27.8454418493 -0.35658618943 -0.211895008103 1 6 11 6 12 5 13 4 13 4 13 4 13 3 14 3 14 3 3 3 8 4 1 6 6 5 2 5 5 4 4 4 5 3 6 4 4 3 6 3 5 3 6 4 4 3 6 3 4 4 6 4 3 4 6 3 4 4 5 5 1 1 1 4 5 4 2 7 3 7 1 1 1 4 3 3 1 3 374.0 0.772727272727 153.0 0.627450980392 0.176627870399 0.227272727273 0.0573150313578 0.141010609397 0.0681246246676 0.019597508307 0.0210509143189 0.0189762128058 0.086357291486 0.588235294118 0.772727272727 2.0 2.0 2.0 4.0 0.0 2.0 5.0 6.0 4.0 7.0 0.166666666667 0.0 1.0 2.0 0.409090909091 0.566666666667 0.4 0.4 0.666666666667 0.6 0.566666666667 0.5 0.433333333333 0.0 0.366666666667 0.3 0.333333333333 0.0 0.166666666667 0.666666666667 0.733333333333 0.555555555556 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.111111111111 1.0 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.777777777778 1.0 1.0 0.888888888889 0.666666666667 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.222222222222 0.0 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.666666666667 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.888888888889 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.555555555556 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.111111111111 0.444444444444 0.555555555556 0.555555555556 -8.73905323886 -9.92548099646 -21.1915757299 -24.9929334145 0.507836997229 -0.361655992022 -15.9755105358 -19.3386090695 3.54243252046 6.4443953833 -2.82882113271 6.57387722148 -3.17033403656 -2.83126415155 -12.2663047974 6.73926657279 2.05952844757 3.39487545418 -3.58180768665 20.609169017 0.138209958953 -1.28117264219 0.850345687581 18.2170684254 -0.304656882063 -0.0169910652808 8 2 1 1 4 11 4 6 1 5 2 6 4 3 3 4 5 3 3 4 6 3 3 3 5 4 3 3 5 4 3 2 7 3 3 3 6 3 3 3 6 2 3 4 5 4 2 4 4 12 3 6 210.0 1.07142857143 108.0 0.638888888889 0.237777777778 0.245578231293 0.103890400605 0.0969998920203 0.0590219198791 0.0321876064184 0.0111154169693 0.0139583827555 0.000340559085796 0.533333333333 0.928571428571 2.0 2.0 1.0 1.0 2.0 3.0 3.0 3.0 2.0 7.0 0.157894736842 0.0 1.0 2.0 0.514285714286 0.625 0.75 0.5 0.625 0.6875 0.5625 0.4375 0.5 0.5625 0.0 0.0 0.0625 0.75 0.6875 0.625 0.6875 0.25 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -2.80112699842 4.54122104289 -11.5394860201 11.6999341262 -6.70799180591 1.1572332751 -31.6725207831 16.0065747258 2.45269320775 -0.48617839867 -23.5455599666 11.572010667 0.697861786396 -1.25069909456 -17.4679659964 2.79916259256 -2.06208351809 -0.0685044233893 -34.1481588272 -0.0806330571316 -1.28018502917 -0.0926423646367 -52.7152754752 -1.79393547087 -0.39556103287 -0.111815029769 5 5 7 3 3 3 5 2 5 3 3 3 6 3 1 3 7 3 1 3 7 7 8 6 7 7 7 7 7 3 2 3 6 2 4 3 4 3 5 7 3 0 182.0 1.07692307692 79.0 0.759493670886 0.207613814757 0.207945900254 0.107759089721 0.0846509486167 0.0544003152988 0.044656149729 0.0123877950806 0.0155374052129 0.00731099589103 0.571428571429 0.846153846154 0.0 2.0 3.0 2.0 2.0 3.0 3.0 3.0 2.0 9.0 0.342857142857 0.0 2.0 2.0 0.434065934066 0.25 0.75 1.0 0.4375 0.5625 0.3125 0.25 0.5625 0.3125 0.0 0.0 0.25 0.5625 0.4375 0.4375 0.5625 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.81891363534 1.72796795357 -6.99156130396 7.16551524682 -3.99882594626 4.92823513288 -21.5294558961 27.5253231245 -0.611658004652 3.1273373409 -25.2624049438 44.6182285184 1.16128208666 -0.713197844425 -17.4084257233 39.9932271362 0.274664826229 -1.34819442449 -11.0571783768 28.0974891448 0.93593362752 0.409297561488 0.360661532874 30.8599195918 0.332052757734 0.271420791446 8 2 3 5 1 10 3 4 1 4 3 3 2 3 5 1 4 2 4 2 4 3 3 1 5 3 2 2 6 3 1 2 6 6 7 4 8 4 9 3 9 2 10 2 10 1 10 2 10 2 10 2 7 4 7 5 7 4 10 1 9 0 276.0 0.521739130435 92.0 0.923913043478 0.134057971014 0.127756773787 0.0279843931216 0.115337545927 0.0260495146252 0.00767979218617 0.00756507882823 0.00220292840904 0.102755861396 0.75 0.347826086957 3.0 4.0 2.0 0.0 4.0 4.0 0.0 0.0 2.0 11.0 0.236842105263 1.0 2.0 1.0 0.333333333333 0.555555555556 0.166666666667 0.0 0.277777777778 0.722222222222 0.722222222222 0.111111111111 0.5 0.222222222222 0.555555555556 0.722222222222 0.5 0.333333333333 0.611111111111 0.444444444444 0.0 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.666666666667 0.833333333333 0.666666666667 1.0 0.833333333333 0.333333333333 0.0 0.166666666667 0.5 0.333333333333 0.166666666667 0.666666666667 1.0 0.833333333333 0.5 0.666666666667 0.166666666667 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.333333333333 0.833333333333 1.0 0.666666666667 0.166666666667 0.666666666667 0.333333333333 0.333333333333 0.833333333333 0.833333333333 0.5 0.166666666667 0.0 -8.08230319701 11.2930811794 -16.6414306065 25.9609181408 3.40667708879 -0.737133176059 -10.1878674466 31.4535462052 -2.23054972377 4.592574009 -10.6675074608 45.02328164 2.41408022315 -2.14127596253 -5.02201920508 40.3459537181 -1.78344120807 0.760356923233 -7.74514577057 37.0787940294 1.22606300208 -0.771619948084 -7.57423518819 33.5609542255 -0.374488055317 0.00660600580746 1 2 2 5 3 4 7 1 13 4 4 4 4 4 3 5 3 5 3 5 3 5 3 5 5 4 6 3 5 4 3 1 0 128.0 0.5 67.0 0.582089552239 0.197265625 0.24072265625 0.0308361053467 0.193004131317 0.0537099838257 0.00576719035777 0.0206862382803 0.00678051386563 0.193851211419 0.5 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 3.0 5.0 0.16 0.0 3.0 1.0 0.5234375 0.625 0.75 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.625 0.625 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 -7.32112738223 4.13802852039 -12.7595121246 11.8241743267 6.133682299 2.81380965794 0.2745804551 21.9453500113 -4.89137227934 -0.185499438067 -12.8426996142 20.3455948373 1.52796363306 -1.04151604255 -11.4630244276 15.0633579483 0.296061173435 1.2794107748 -6.20235122281 23.8270065368 -0.862138012812 0.650645475624 -13.9837683722 30.9141090007 0.0120940721071 -0.155659774731 1 4 2 5 3 4 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 11 3 0 147.0 0.333333333333 76.0 0.565789473684 0.203109815355 0.254616132167 0.0180411097291 0.333347499766 0.0495853485084 0.00154083306692 0.0134885121183 0.00282002011142 0.521166407612 0.285714285714 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.192307692308 0.0 10.0 1.0 0.517006802721 0.416666666667 0.0 0.0 0.5 0.833333333333 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.916666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.15358863345 -0.242521818045 -9.57049962407 0.938272810741 3.27734416018 2.57370092619 -4.17758006483 12.045734354 -3.02221901644 2.29851464991 -7.97398901581 25.2074719773 2.97680974515 0.246386572487 -1.56460701046 28.0157261064 -2.3177444588 -0.359806352968 -5.4586588211 25.3001170278 1.76024868086 0.234273770256 -3.15066297809 26.6854965155 -0.478754980988 0.0477049573612 2 2 6 3 6 4 4 8 1 8 2 3 6 3 6 3 6 3 6 3 6 3 6 3 6 4 5 7 2 8 3 2 4 0 144.0 0.5625 67.0 0.701492537313 0.154320987654 0.223958333333 0.0268239883402 0.172405478395 0.0450585133745 0.00626368368325 0.0167808445502 0.00669178252648 0.170660045957 0.444444444444 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 8.0 0.115384615385 1.0 3.0 1.0 0.465277777778 0.666666666667 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.833333333333 0.666666666667 0.75 0.333333333333 0.5 0.0 0.0833333333333 0.166666666667 0.333333333333 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 -9.78802900015 1.71091563824 -18.4857292965 5.32111932727 6.82718752955 1.83354576529 -0.957969361377 12.0840510915 -2.90049538325 0.288739113409 -5.3883707868 14.0232661136 0.751767744976 -0.315475782193 -3.9272031938 11.0218824423 1.23845319011 -0.51381475918 5.30711531075 4.84064698416 -1.03632695317 -0.702291259556 -0.831262517457 -2.49018065834 0.0716550742557 -0.0165989027956 7 1 1 1 15 7 10 4 1 5 9 2 5 3 8 3 5 3 8 2 6 3 8 2 5 4 7 4 4 5 6 4 4 6 1 1 3 3 5 8 1 5 3 10 2 4 4 6 5 4 5 5 6 3 7 3 6 3 6 3 7 3 6 4 6 3 6 4 6 3 6 3 7 3 5 5 6 4 5 5 4 5 5 8 1 6 4 7 5 1 8 2 1 1 2 0 437.0 0.826086956522 184.0 0.744565217391 0.195953269902 0.214903989653 0.0661337524284 0.114634154203 0.0589471474596 0.0186049365024 0.0154889884647 0.0133428664291 0.0471824275865 0.736842105263 1.04347826087 1.0 3.0 4.0 5.0 4.0 6.0 5.0 5.0 6.0 11.0 0.229508196721 1.0 1.0 2.0 0.421052631579 0.2 0.6 0.733333333333 0.633333333333 0.433333333333 0.3 0.233333333333 0.266666666667 0.533333333333 0.633333333333 0.566666666667 0.433333333333 0.3 0.7 0.633333333333 0.666666666667 0.0 0.0 0.0 0.222222222222 0.555555555556 0.777777777778 0.444444444444 0.333333333333 0.111111111111 0.444444444444 0.666666666667 0.888888888889 1.0 1.0 1.0 1.0 0.444444444444 0.777777777778 0.444444444444 0.555555555556 0.444444444444 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.222222222222 0.0 0.0 0.111111111111 0.111111111111 0.0 0.0 0.666666666667 0.222222222222 0.111111111111 0.333333333333 0.555555555556 0.666666666667 0.111111111111 0.0 0.666666666667 0.777777777778 0.777777777778 1.0 1.0 1.0 0.666666666667 0.666666666667 0.333333333333 0.666666666667 0.666666666667 0.888888888889 1.0 1.0 0.888888888889 0.888888888889 0.0 0.0 0.0 0.333333333333 0.888888888889 0.555555555556 0.222222222222 0.222222222222 -9.57697570605 2.7125538127 -28.3979897552 4.45508677875 -5.31711196416 -2.08854399883 -30.6380100975 3.82526168984 13.2711700167 4.48925620529 17.8759271487 18.7997358515 -6.30900911945 -1.62844129914 1.25840667002 16.8777618757 0.0460780212956 -0.31452598942 -13.0076853875 1.92094275956 0.812128907784 -2.63848589136 -3.1213772055 -15.5333341822 -0.116213425309 0.289280496084 0 6 2 12 2 5 2 5 3 3 4 5 2 2 5 4 3 2 5 4 3 2 6 4 1 2 7 7 8 5 9 5 10 3 11 3 12 2 11 2 12 2 12 2 11 3 11 3 9 5 8 5 9 4 9 0 294.0 0.666666666667 107.0 0.672897196262 0.142614188533 0.130709426628 0.0339325813161 0.0950051754702 0.0266988858573 0.00906363439136 0.00846075336248 0.00134805712713 0.0669533531349 0.5 0.333333333333 2.0 3.0 1.0 0.0 5.0 2.0 0.0 0.0 2.0 7.0 0.27027027027 0.0 3.0 2.0 0.363945578231 0.708333333333 0.166666666667 0.0 0.333333333333 0.791666666667 0.791666666667 0.458333333333 0.708333333333 0.375 0.666666666667 0.375 0.166666666667 0.708333333333 0.166666666667 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.166666666667 1.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.333333333333 0.666666666667 0.5 0.666666666667 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 1.0 0.0 0.166666666667 0.166666666667 0.833333333333 1.0 1.0 0.666666666667 0.5 0.333333333333 0.0 0.166666666667 0.833333333333 0.833333333333 0.5 0.166666666667 0.0 -9.70087272179 10.1859163579 -19.1566576856 22.0844977826 5.15400108552 -2.91356143311 -8.72917990192 17.5235040792 -3.34342191253 2.46675893149 -10.9600845693 20.6715811131 3.23655810404 -1.80263786854 -3.37857180064 15.1032065485 -2.1224758229 0.527178287265 -5.88610195733 13.7717512652 1.47917993596 -0.151967064175 -4.28664728678 12.7181417124 -0.297647454415 -0.248165152311 5 2 1 1 6 8 4 3 3 4 3 2 5 4 10 3 9 4 9 3 7 6 4 3 3 3 3 4 3 3 2 4 4 3 3 4 2 6 1 6 1 5 169.0 1.0 81.0 0.79012345679 0.240327719618 0.25261720528 0.0946882298429 0.114224532191 0.0644247576401 0.0237454790785 0.0111494044029 0.0111983285418 0.0108619820652 1.0 0.615384615385 2.0 5.0 5.0 1.0 2.0 1.0 1.0 3.0 3.0 11.0 0.157894736842 1.0 3.0 2.0 0.479289940828 0.4375 0.125 0.3125 0.8125 0.4375 0.0 0.375 0.5625 0.6875 0.4375 0.625 0.625 0.375 0.6875 0.5 0.75 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.5 0.5 0.75 1.0 0.75 0.25 0.25 0.5 0.75 0.75 1.6650055585 -1.56706405506 0.152932512468 -2.6190177135 -5.32593145932 1.81278711695 -15.3731083294 4.10683945092 1.40664244964 0.782791319405 -15.3309602286 9.08178845535 -1.13346385936 -0.331186949005 -19.6353469232 6.91981958311 -0.688457321577 -0.544725728186 -26.8836490947 -0.962032515711 0.0993069426012 -1.49808492512 -26.673412456 -18.2115081164 0.012816419448 -0.374027236832 0 5 1 5 2 3 33 4 2 4 3 2 4 3 2 4 3 3 3 2 4 2 4 2 4 2 4 3 2 5 1 1 2 1 1 0 126.0 0.285714285714 51.0 0.980392156863 0.169312169312 0.201058201058 0.0162489451983 0.346798801825 0.0563464068755 0.00213074621904 0.0323551061371 0.00567466117255 0.558216816105 1.33333333333 204522252.0 0.0 3.0 1.0 3.0 4294967294.0 4294967293.0 0.0 0.0 2.0 2.0 0.111111111111 2.0 7.0 1.0 0.404761904762 0.416666666667 0.166666666667 0.0833333333333 0.166666666667 0.5 0.416666666667 0.583333333333 0.583333333333 0.5 0.5 1.0 0.833333333333 0.416666666667 0.416666666667 0.75 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.39490295319 -2.1826963624 -3.73954164242 -2.10595138832 2.23280928909 4.99067006521 -0.780367921073 16.9523960672 -2.69862729646 2.31753171443 -5.57486675673 30.6556153099 2.57406182732 -1.09717995233 0.281411911094 24.0573575347 -1.94770718966 -0.794447646081 -3.51408458081 14.4836703055 1.35641281405 -0.592867397567 -1.18595619612 5.71382250709 -0.277095073353 -0.149339591168 10 4 10 5 10 5 11 5 10 5 10 5 10 4 11 5 7 7 5 10 4 3 2 6 3 3 5 4 2 4 5 4 2 3 6 4 1 4 6 4 2 3 6 4 1 4 6 4 2 4 5 4 3 3 5 4 3 4 4 5 4 11 11 4 330.0 0.681818181818 148.0 0.567567567568 0.267676767677 0.236363636364 0.0828367699029 0.149355371901 0.0682920110193 0.0177230684356 0.0148294277121 0.00889487549666 0.0534382794284 0.666666666667 0.454545454545 1.0 2.0 4.0 0.0 0.0 0.0 5.0 4.0 5.0 12.0 0.222222222222 0.0 2.0 2.0 0.448484848485 0.0 0.0416666666667 0.666666666667 0.583333333333 0.0 0.25 0.416666666667 0.5 0.0833333333333 0.375 0.0833333333333 0.166666666667 0.833333333333 0.875 0.791666666667 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 6.4819467732 -4.13802852039 12.3590014329 -10.0811586182 -3.36437526584 1.42025757819 10.7209237544 4.65137084181 6.38432575937 8.33709908006 29.1094437565 38.7507153692 -3.85957942683 -3.5809307025 16.1452752445 30.3843126649 -0.093574740269 0.457898527374 4.37267196663 20.0042709683 -0.285763589139 -1.38135610953 4.64460641447 12.9474717909 0.0385446234302 0.243931822245 2 3 3 11 2 5 1 4 3 3 4 3 4 2 4 4 2 3 5 3 2 2 6 7 6 6 7 6 7 6 7 5 9 4 9 3 6 0 169.0 1.0 80.0 0.6 0.210286754665 0.186162949477 0.071251628146 0.0757386505246 0.0395611262016 0.0179852473268 0.00806249243766 -0.000342741497939 0.00635988985691 0.153846153846 0.461538461538 0.0 1.0 1.0 0.0 3.0 3.0 0.0 0.0 3.0 7.0 0.148148148148 0.0 1.0 2.0 0.473372781065 0.6875 0.375 0.25 0.125 0.5625 0.75 1.0 0.875 0.4375 0.5625 0.8125 0.5 0.75 0.375 0.0625 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.25 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.5 0.25 0.25 0.5 0.75 1.0 1.0 -7.54149576497 3.62383562732 -15.6470297089 10.8835911598 3.55255275795 3.23960357536 -5.67115406517 22.6993625118 -0.72992327702 0.478768355553 -6.55690264868 27.3307307847 -1.41531636822 0.436148277102 -15.86640725 28.7556469325 0.393982565516 -0.208239863251 -15.0957122248 27.4313120764 -0.102613522735 -0.0167351362945 -15.3124756927 26.1501377641 -0.0952815240459 -0.0588089041591 4 1 11 4 10 5 11 5 11 3 13 2 12 4 12 2 12 3 13 2 12 3 2 5 5 3 5 3 5 2 6 3 3 3 6 3 4 2 6 3 4 2 6 3 4 2 6 3 4 2 6 3 3 3 6 3 3 3 6 3 1 6 5 11 3 5 1 3 1 2 8 0 345.0 0.652173913043 115.0 0.895652173913 0.135458937198 0.190170132325 0.0419798300808 0.151856880633 0.060129274997 0.0166669052979 0.0254845672861 0.0193433800052 0.131295998393 0.666666666667 0.565217391304 7.0 2.0 0.0 0.0 0.0 0.0 5.0 5.0 0.0 6.0 0.173913043478 1.0 1.0 2.0 0.333333333333 0.541666666667 0.375 0.375 0.458333333333 0.5 0.541666666667 0.5 0.541666666667 0.0 0.125 0.125 0.0 0.0 0.125 0.583333333333 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.0 0.666666666667 1.0 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.666666666667 0.666666666667 0.5 0.5 0.5 0.5 0.0 0.166666666667 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -8.35909440239 -10.29663284 -20.5081062469 -24.0453293315 -0.144203508888 1.59984270238 -19.9329283715 -16.6324189072 1.15861848476 2.88700622722 -19.7623484032 -1.75314648437 -3.86039982307 -0.834869129672 -34.3940310801 1.66017416669 2.63347413856 1.53667059309 -26.0912505913 3.14658776972 -1.60714520626 -2.6658513125 -33.7792320422 -11.5670805203 -0.126771892885 0.377608590429 3 1 5 3 3 4 3 4 5 1 33 3 2 6 1 6 3 3 4 3 5 2 4 3 4 3 4 4 3 4 3 4 2 6 1 6 154.0 0.318181818182 66.0 0.80303030303 0.186456400742 0.247343565525 0.0197611673198 0.370887756197 0.0671380820225 0.0026011142024 0.0315493168123 0.00719599090508 0.606979031504 1.0 195225786.0 0.0 2.0 1.0 1.0 0.0 4294967292.0 0.0 0.0 0.0 1.0 0.25 1.0 3.0 1.0 0.428571428571 0.166666666667 0.166666666667 0.333333333333 0.0833333333333 0.416666666667 0.25 0.583333333333 0.583333333333 0.666666666667 0.333333333333 0.916666666667 1.0 0.666666666667 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -3.58822053516 -5.23764449084 -5.69306497636 -8.52049731822 3.35457007776 6.16967544796 -0.441449546101 12.3823987984 -3.51564811055 0.761960305884 -5.9593643359 19.8222064065 3.59807036803 -1.07257210987 3.5086996698 16.2142829197 -2.41835210293 1.37831797842 -1.49421586266 19.3020587392 1.37480230396 -1.83517829039 0.245805594689 6.48262863521 -0.197076204277 -0.137553835317 9 1 10 6 5 10 4 3 2 5 3 3 10 4 10 4 10 4 10 4 9 5 4 3 2 5 3 5 1 5 3 5 1 4 5 4 2 4 5 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 1 4 6 3 1 5 5 10 2 12 3 4 1 0 308.0 0.636363636364 149.0 0.651006711409 0.204777365492 0.258854781582 0.0560332919526 0.174874680472 0.0564016593543 0.015907973245 0.0139345456122 0.0121160127339 0.131414816006 0.785714285714 0.636363636364 1.0 3.0 4.0 3.0 1.0 1.0 5.0 5.0 2.0 7.0 0.3 2.0 1.0 2.0 0.483766233766 0.291666666667 0.833333333333 0.875 0.875 0.5 0.5 0.375 0.375 0.458333333333 0.125 0.208333333333 0.0833333333333 0.5 0.291666666667 0.875 0.791666666667 0.0 0.0 0.333333333333 0.5 0.833333333333 1.0 0.666666666667 0.5 0.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.833333333333 0.5 0.5 0.5 0.333333333333 0.166666666667 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 -12.6166463978 -2.02560836662 -28.6429561543 -3.5564258657 3.96368749332 2.32717768779 -8.58933622515 6.13254662874 5.86997733458 1.41998532166 10.2878813717 11.0587395409 -8.20540848992 -2.11798253632 -23.4764784354 2.49331197687 3.25940912064 0.907396288469 -17.8971124706 0.592791044731 -0.163001824748 -1.45926498563 -7.6569163876 -8.17474347794 -0.0547517687833 -0.04986791786 4 5 6 8 3 4 4 3 2 3 5 3 10 3 10 3 7 6 5 4 1 2 5 3 3 3 3 3 4 3 3 2 5 3 3 2 5 5 2 2 4 4 1 0 169.0 1.0 74.0 0.864864864865 0.212107419208 0.203004096495 0.0858181875438 0.0919779506502 0.0599489227769 0.0238499400211 0.0160080682764 0.0146462823502 0.0141950452073 0.692307692308 0.615384615385 2.0 4.0 2.0 1.0 1.0 1.0 2.0 3.0 2.0 8.0 0.30303030303 0.0 2.0 1.0 0.437869822485 0.5625 0.1875 0.375 0.5625 0.5 0.125 0.5625 0.125 0.6875 0.625 0.6875 0.5 0.3125 0.5 0.4375 0.6875 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.25 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 1.27323954474 0.783532027529 0.359343912807 2.12645725168 -3.8469568038 0.644443501932 -11.6846487676 6.10235666869 0.271946187017 1.18269140572 -15.4239117349 9.80653962223 -1.10501112242 -1.16343055955 -21.8417521021 4.41518108587 -0.78359854684 -0.303539590608 -28.8424795943 -4.54587702128 0.313878919815 -1.66249122396 -26.3928464253 -19.3086791764 0.0878785923753 -0.117509163713 1 3 1 7 1 6 2 5 3 4 8 1 4 1 2 1 3 5 3 6 2 5 3 5 3 5 3 5 3 6 2 5 4 5 5 4 1 4 0 136.0 0.470588235294 53.0 0.943396226415 0.135110294118 0.18598615917 0.0205509458325 0.17184478679 0.0387229989314 0.00471350079809 0.0150437431728 0.00424902410646 0.187766013891 0.625 0.0588235294118 2.0 0.0 2.0 1.0 0.0 1.0 0.0 0.0 7.0 2.0 0.0740740740741 1.0 5.0 1.0 0.389705882353 0.3 0.5 0.4 0.2 0.5 0.9 0.9 0.6 0.8 1.0 1.0 0.9 0.6 0.7 0.5 0.7 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 -6.74067994272 2.8460648647 -11.1136946941 6.13210026997 6.60384491735 -0.985315845529 4.56268602373 3.78317404961 -3.84015618705 0.516038569301 -2.04314081552 5.5420522003 2.23193206511 0.353084927061 2.38040333952 5.82715601302 -0.792095954223 -1.36638194921 1.17529150223 -3.75297572953 -0.560293671619 0.162836750938 -5.25424060532 -2.42754382263 0.203567746603 0.321410804706 2 3 9 5 10 4 10 4 11 3 11 3 11 3 11 3 11 3 6 1 3 4 2 7 1 4 2 6 3 3 11 3 11 4 9 8 7 7 6 9 6 3 1 5 4 4 2 5 2 5 3 5 1 6 2 6 294.0 0.666666666667 126.0 0.650793650794 0.153547133139 0.248137350178 0.0376627211577 0.17533117185 0.0598792295853 0.0115159303832 0.0189586370722 0.0130344161707 0.156277385697 0.928571428571 0.333333333333 5.0 1.0 3.0 3.0 0.0 2.0 1.0 3.0 4.0 8.0 0.0681818181818 1.0 1.0 1.0 0.428571428571 0.666666666667 0.583333333333 0.583333333333 0.75 0.5 0.5 0.708333333333 0.75 0.0 0.25 0.375 0.75 0.0 0.375 0.166666666667 0.583333333333 0.5 0.333333333333 0.0 0.0 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.333333333333 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.333333333333 1.0 -14.4603634009 -12.3079822658 -29.2839914535 -27.1138991066 7.99765189251 3.97067609238 -5.65141829115 -13.757679914 -1.19680263618 1.44567755667 -6.95586503589 -3.32634232972 -3.12038969817 -0.755402383777 -22.3729885337 0.421216517068 2.97159767829 2.73598885546 -8.31737810554 11.7128836452 -0.963266779761 -2.21115286841 -7.43242804969 5.27453178285 0.124715854887 0.438322670196 4 1 9 3 5 1 2 3 5 3 1 3 1 1 2 1 1 2 1 8 2 3 10 3 9 3 9 4 9 3 9 3 5 2 3 9 4 6 3 0 156.0 0.923076923077 62.0 1.0 0.14797008547 0.198224852071 0.0589721990425 0.10092360795 0.0440167779295 0.0248019876447 0.0147708654183 0.0103079314839 0.0530985960808 0.833333333333 0.538461538462 1.0 4.0 3.0 2.0 2.0 4.0 0.0 1.0 1.0 4.0 0.434782608696 0.0 3.0 1.0 0.397435897436 0.416666666667 0.75 0.916666666667 0.416666666667 0.666666666667 0.5 0.5 0.75 0.25 0.333333333333 0.0 0.5 0.0833333333333 0.333333333333 0.0 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.5 1.0 1.0 1.0 0.5 0.25 0.5 0.75 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.25 0.5 0.25 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 -8.66782305454 -1.37118104818 -21.8427458888 -2.6949988673 -1.39349316582 1.38277175864 -27.1226509035 5.45558508208 0.638104617821 3.31931199965 -23.7817438486 22.2378333544 -0.522808702873 -0.267594120963 -26.0351428324 20.9717014638 -0.509283757903 -1.69940390639 -30.5343158678 9.24445902746 -0.191292287391 1.13016897752 -34.5418548349 18.1115745144 -0.244781377828 0.343801512988 1 3 2 5 1 5 1 12 2 4 2 4 2 4 1 4 1 4 2 1 5 0 66.0 0.545454545455 46.0 0.391304347826 0.287878787879 0.285123966942 0.0443275732532 0.148249019117 0.0375240003339 0.00433256938401 -0.00483560703242 0.000710885144725 0.079326164654 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 6.0 0.0625 0.0 2.0 1.0 0.69696969697 0.833333333333 1.0 0.333333333333 0.166666666667 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -4.22484030753 4.74571103038 -9.81439481168 11.1626606654 0.579223549464 -0.45438676465 -7.96783152455 9.61606319669 0.463245231284 -0.715753035887 -5.05822580007 4.72480315231 -0.481354841851 -0.0844353544402 -7.19443498535 2.35038975054 0.0491038474569 -0.467131540218 -7.26453527198 -1.88056403739 0.176879721275 -0.358339703612 -5.05509399712 -6.64733776161 0.0616900241394 -0.0847293576986 2 3 2 4 1 5 1 5 3 3 31 5 1 5 1 5 2 3 3 3 3 3 4 3 2 4 2 4 2 4 2 4 1 6 132.0 0.272727272727 69.0 0.623188405797 0.20202020202 0.276170798898 0.0166471881348 0.444745318196 0.0519328964577 0.00169919587012 0.0191719091602 0.00289074304076 0.853512257492 1.33333333333 195225785.955 2.0 2.0 1.0 2.0 0.0 4294967291.0 0.0 0.0 3.0 1.0 0.285714285714 1.0 3.0 1.0 0.522727272727 0.416666666667 0.166666666667 0.75 0.416666666667 0.666666666667 0.166666666667 1.0 0.916666666667 0.833333333333 0.166666666667 1.0 1.0 0.833333333333 0.166666666667 0.75 0.916666666667 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 -4.62996198086 -2.48860456471 -7.74345121642 -0.679543370788 3.86324410324 7.46748775063 -1.81626819774 21.7167066861 -4.04800697202 -1.69355421963 -7.85449313929 20.8733528244 4.20388420307 0.38654996864 2.89191458185 20.6714818139 -3.00801375622 0.91310150391 -3.61894669312 25.4476765962 1.90321557132 -1.21849639917 0.705562545177 15.8463180393 -0.239819352793 -0.175348183213 4 1 6 6 2 2 1 19 2 1 1 6 6 5 6 5 6 5 5 6 6 5 7 4 6 6 3 9 3 8 5 2 2 1 3 0 165.0 0.733333333333 91.0 0.56043956044 0.210468319559 0.252121212121 0.0442832735064 0.131134819267 0.0432082811587 0.00800941410244 0.00728229575643 0.00110423627667 0.0676902582751 0.545454545455 0.2 3.0 1.0 0.0 1.0 1.0 1.0 0.0 0.0 2.0 6.0 0.21875 0.0 6.0 1.0 0.551515151515 0.75 0.583333333333 0.416666666667 0.416666666667 0.833333333333 1.0 1.0 0.916666666667 0.75 1.0 1.0 1.0 0.5 0.416666666667 0.333333333333 0.583333333333 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 -11.034742721 3.73483599789 -21.3408714234 11.2033954878 6.88567945793 3.29570982602 -4.4702931526 22.7843216392 -3.19281111213 -0.162941127845 -8.52638209507 22.2570360014 1.20012752421 -0.921831783196 -7.77262101678 15.3244954567 0.192943734995 0.016179504412 -0.40110912146 13.2800072047 0.650480507339 -0.144331199705 3.52613224259 11.0390550104 -0.0438913621076 -0.167095782852 3 1 6 1 6 4 1 7 4 13 3 5 3 5 4 3 5 4 4 3 5 5 3 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 4 3 5 4 3 5 4 11 4 7 224.0 1.14285714286 111.0 0.648648648649 0.232979910714 0.235969387755 0.107349896222 0.0888743053025 0.0593614049973 0.0333251090384 0.0114620617916 0.0142856503518 -0.00415977960346 0.3125 0.928571428571 1.0 1.0 2.0 1.0 2.0 3.0 3.0 3.0 3.0 8.0 0.128205128205 0.0 1.0 2.0 0.495535714286 0.625 0.5625 0.5 0.5625 0.6875 0.5625 0.5 0.5625 0.5625 0.0625 0.0 0.0 0.8125 0.75 0.5 0.625 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.06373265452 6.08767657326 -12.770955363 14.3832760346 -7.15295780369 -0.592168294121 -31.2284824644 11.4177546828 5.23893601752 -1.92491123265 -10.5398277923 -0.99433985837 0.55126344852 -0.921846517914 -3.3683455673 -8.18698516944 -2.73655614018 0.573963285481 -22.3228795178 -3.39710379587 0.448985457681 0.771231161098 -26.0187656231 4.52148301115 -0.188565542092 -0.0411939774431 3 2 11 6 10 7 11 4 12 4 13 4 12 3 13 4 12 4 12 5 2 2 7 6 1 4 5 5 3 3 5 4 5 3 4 4 5 2 4 4 6 2 4 5 5 3 3 4 5 4 3 3 6 3 4 3 6 3 4 4 5 4 2 6 3 13 3 6 352.0 0.727272727273 143.0 0.678321678322 0.165305397727 0.228047520661 0.0494625742143 0.150228384292 0.0663104555286 0.0171044702934 0.0221401494467 0.0182161563269 0.108321703785 0.6875 0.590909090909 3.0 5.0 1.0 2.0 0.0 1.0 5.0 5.0 3.0 5.0 0.119047619048 1.0 0.0 2.0 0.40625 0.583333333333 0.25 0.333333333333 0.541666666667 0.791666666667 0.958333333333 0.958333333333 0.75 0.0833333333333 0.333333333333 0.333333333333 0.0833333333333 0.0 0.208333333333 0.375 0.5 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 1.0 0.666666666667 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.833333333333 0.833333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 -11.1408460164 -10.9672224422 -23.1034947739 -27.4174352713 5.09833907484 -0.742444058345 -9.54190652722 -26.5400032657 -1.23332999821 3.75088566048 -8.47403209472 -11.8987267345 -0.274156409113 -2.35654981292 -12.9739168181 -15.0259562321 0.196911253874 1.80521352583 -9.70232461181 -13.4273476045 0.216388377038 -2.35652995654 -10.9751734835 -26.7935937289 -0.291906008814 0.0919117318074 7 3 8 5 5 8 3 3 2 4 2 2 1 1 3 3 1 11 1 11 1 3 8 4 9 4 8 4 8 4 9 4 4 2 3 8 6 1 1 2 3 0 180.0 0.8 87.0 0.67816091954 0.229166666667 0.214074074074 0.0720293209877 0.10574005487 0.0423611111111 0.0192093077373 0.00805628606708 0.00311990017334 0.0296948964021 1.0 0.333333333333 0.0 3.0 6.0 3.0 0.0 3.0 0.0 1.0 4.0 15.0 0.147058823529 0.0 3.0 1.0 0.483333333333 0.0 0.416666666667 0.75 0.583333333333 0.25 0.833333333333 0.833333333333 1.0 0.5 0.75 0.333333333333 0.416666666667 0.75 0.583333333333 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 0.75 0.75 1.0 0.75 0.5 0.0 0.5 1.0 0.75 0.75 1.0 0.5 0.0 0.25 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.75 1.0 0.5 0.0 0.5 1.0 0.5 0.0 1.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 -6.66328695078 7.38478935946 -12.227914465 17.1323899127 5.80653820823 -0.20711363261 7.87861408213 22.1716093658 1.4953721643 3.55870767134 19.650955821 33.9176054406 -0.808175120827 -1.68442864034 16.3634658021 27.0839965158 0.507954085733 -0.440834156165 17.1458763929 22.3873386293 -0.373269838837 1.37663101283 15.9385295265 33.0273562803 0.148468952833 -0.0351641592065 1 7 4 9 5 4 2 4 4 2 3 5 3 1 6 1 11 2 1 4 4 9 4 9 5 9 4 10 4 5 1 3 10 4 8 8 1 1 1 4 0 182.0 0.928571428571 81.0 0.827160493827 0.191039729501 0.205651491366 0.0730422216354 0.0938697216321 0.0418318247385 0.0248975404709 0.0113261525062 0.00517972102667 0.0272294354011 0.769230769231 0.428571428571 0.0 2.0 4.0 4.0 1.0 3.0 0.0 1.0 4.0 8.0 0.258064516129 4.0 1.0 1.0 0.445054945055 0.1875 0.8125 0.9375 0.5 0.25 0.625 0.375 0.8125 0.4375 0.25 0.0 0.5 0.75 0.4375 0.0 0.375 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.75 0.0 0.25 0.5 0.75 1.0 0.5 0.0 0.25 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.5 0.25 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.5 0.25 0.0 0.0 -9.54929658551 2.81931613477 -21.2904965513 10.2609441505 2.65459308871 5.57691912834 -12.3353863228 32.4155977713 1.36079038821 2.45643775096 -2.6293634901 44.8713144976 -0.568348367036 -1.84908831286 -3.16428770271 32.4156478819 0.627587216541 -1.36901990854 -1.26014476225 17.8840678311 -0.825452410899 -0.0546722021965 -10.055847676 13.8514233816 -0.378771613203 -0.110687817021 1 4 3 5 1 7 1 6 2 3 38 5 2 5 3 4 3 4 3 4 3 3 4 4 3 4 3 4 2 5 1 14 154.0 0.318181818182 81.0 0.555555555556 0.237476808905 0.27774498229 0.0240530257397 0.395054957692 0.0610448751788 0.0025611915929 0.0180579734388 0.00323737789008 0.642096510554 1.28571428571 195225785.955 1.0 2.0 1.0 2.0 0.0 4294967291.0 0.0 0.0 4.0 1.0 0.16 1.0 6.0 1.0 0.525974025974 0.416666666667 0.0833333333333 0.166666666667 0.25 0.75 0.166666666667 0.666666666667 0.666666666667 0.833333333333 0.166666666667 1.0 1.0 0.833333333333 0.166666666667 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -3.58822053516 -3.21203612422 -6.96981359433 -1.24030714479 1.80200224823 9.07452220419 -5.0431956499 25.9630292899 -2.27572367371 -1.73292197071 -8.4150561143 28.5624591593 2.38942015844 1.50452322583 -2.23269277466 32.6510091343 -1.77621033724 0.283097949517 -6.0553381163 36.4914812312 1.2284807823 -0.761789872619 -2.38673960151 27.2030502122 -0.148264963457 -0.267894973914 4 8 6 11 4 4 1 6 2 4 6 9 7 8 7 7 8 7 8 7 8 3 1 4 7 2 3 4 5 3 3 5 2 4 6 7 11 2 6 0 210.0 1.07142857143 105.0 0.609523809524 0.232698412698 0.206462585034 0.10590659756 0.0762013821402 0.0448363027751 0.0360116306123 0.00830840068885 0.00820480665518 -0.0059127311964 0.533333333333 0.714285714286 0.0 2.0 3.0 1.0 1.0 3.0 3.0 2.0 4.0 12.0 0.225 0.0 2.0 2.0 0.5 0.3125 0.9375 0.9375 0.4375 0.8125 0.4375 0.3125 0.75 0.6875 0.0 0.0 0.375 0.8125 0.3125 0.25 0.5625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.15924917947 7.34234804131 -12.5596911087 23.5984406066 -3.81971863421 8.92456038223 -26.1058354876 55.2477959488 0.0923103909602 0.0727391796536 -25.7347591039 55.9307400432 1.18489922995 -2.87024988434 -17.5948067167 39.2438057315 -0.241692624896 2.30451877463 -16.4043278761 57.0067357144 0.331521989449 3.15220289211 -11.8305259544 91.8334265225 0.273153678888 0.362166586205 7 2 8 8 5 9 4 3 5 4 1 4 6 3 1 3 7 3 1 3 7 8 6 7 7 7 7 4 1 3 6 3 3 3 4 3 4 3 4 3 5 8 3 0 196.0 1.0 94.0 0.68085106383 0.223032069971 0.227405247813 0.0979035095921 0.0932785234044 0.05585151595 0.0319807703311 0.0104313522085 0.0130399573079 0.00894000473118 0.571428571429 0.714285714286 0.0 4.0 3.0 0.0 0.0 3.0 3.0 3.0 4.0 9.0 0.179487179487 0.0 2.0 3.0 0.479591836735 0.375 0.8125 0.8125 0.625 0.5625 0.125 0.0625 0.3125 0.6875 0.0625 0.0 0.125 0.5 0.8125 0.75 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.75 0.75 0.5 1.0 0.75 0.5 0.25 0.0 0.25 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.13641852265 3.04668033919 -7.12844360966 9.49802304193 -10.154827783 3.47681629326 -41.9554568468 23.6398504844 -0.489055574224 1.82343061682 -48.4120255407 34.3401112768 2.45018750127 0.187634991611 -31.2214017942 36.1076715107 0.0214593063274 -0.200729008958 -25.1199075522 33.5020951844 0.330739652952 -0.172930194619 -23.7294979426 31.3269938025 -0.145667587152 0.0468980782245 3 2 3 3 4 13 2 14 1 7 2 5 1 6 4 4 3 3 5 3 4 3 6 3 3 3 5 3 4 3 6 2 4 3 5 4 3 2 7 3 2 4 5 4 2 4 4 12 3 6 11 1 3 0 225.0 1.0 120.0 0.65 0.245037037037 0.224 0.0976062331962 0.088411654321 0.0532993580247 0.0275097697806 0.0105571827124 0.0115272216113 -0.00222882519616 0.666666666667 0.8 2.0 2.0 1.0 2.0 1.0 3.0 3.0 3.0 4.0 10.0 0.116279069767 1.0 1.0 2.0 0.533333333333 0.8125 0.75 0.5 0.625 0.875 0.6875 0.5 0.4375 0.75 0.125 0.0 0.0625 0.875 0.75 0.625 0.75 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.27323954474 6.96037617789 -6.58282721904 18.6581590462 -4.58366236105 2.82942121052 -17.6403882568 28.9512666088 4.00024828264 -0.372913523812 -0.749518642657 26.5458025221 0.96209285882 -0.770996982554 8.78962060438 19.76560312 -1.51986299716 -0.264545983586 -1.45803207956 14.8694973519 0.0933059024195 -0.66285507053 -4.68001464382 6.046459237 -0.0407605123082 -0.329601714281 1 3 2 5 3 3 1 1 2 4 2 4 4 3 2 4 5 2 2 3 6 2 2 3 6 3 1 2 7 3 1 3 5 3 2 3 5 3 1 4 5 3 2 3 5 9 4 9 3 4 1 0 169.0 1.0 89.0 0.61797752809 0.238507055075 0.250341374602 0.104033120018 0.106440921942 0.0534881326359 0.03416753486 0.00877931486677 0.0124381914092 0.00749706772603 0.461538461538 1.07692307692 1.0 2.0 1.0 1.0 4.0 3.0 3.0 3.0 4.0 13.0 0.157894736842 0.0 1.0 3.0 0.526627218935 0.75 0.6875 0.75 0.9375 0.5 0.25 0.1875 0.375 0.4375 0.0 0.1875 0.3125 0.625 0.625 0.75 0.875 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.5 0.75 1.0 0.75 0.5 0.25 0.25 0.5 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.37118104818 -0.195883006882 -7.63568853307 0.856110258062 -6.26361993605 2.01214733697 -27.858771393 8.0154150875 0.863741115639 0.420756506748 -27.2024976263 11.433141738 0.743986849595 -0.129008856458 -20.8795435181 10.2308498109 -0.648404749039 -0.230536408882 -22.7247888365 6.92294632713 0.73213438605 -0.537323499607 -15.7456899904 0.874045331208 0.259174032159 -0.12228470522 1 5 3 4 4 5 3 5 3 6 3 4 4 5 4 4 3 5 5 3 4 3 6 2 5 3 7 1 5 3 7 1 5 3 7 1 4 4 6 3 3 4 6 2 3 6 4 4 1 8 2 6 1 4 11 0 224.0 1.14285714286 104.0 0.788461538462 0.198381696429 0.207589285714 0.092757689362 0.0828489965322 0.0459912358498 0.0360986230376 0.00966032784936 0.0111235585638 0.00827517295374 0.4375 0.928571428571 2.0 1.0 1.0 3.0 3.0 3.0 3.0 3.0 1.0 8.0 0.228571428571 2.0 0.0 2.0 0.464285714286 0.6875 0.375 0.3125 0.6875 0.875 0.875 0.75 0.875 0.25 0.125 0.0 0.1875 0.8125 0.25 0.0625 0.4375 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -6.20704278058 6.12746530904 -14.5236375825 17.200274285 0.544608320893 3.60398908244 -13.8914183216 29.6909603728 -0.178991026697 -0.66431451985 -13.2311927664 26.1944571941 -0.282922220748 -0.969525279516 -14.3527494699 19.9581630379 0.243064532081 1.0904555213 -13.4108373127 27.2417565433 -0.199921194532 0.484685115374 -12.5233813455 31.6273190523 0.224818443658 -0.257739271095 1 2 1 1 2 6 1 6 3 3 4 3 4 3 4 3 4 3 4 3 4 3 5 2 4 3 5 2 4 3 4 3 4 3 4 3 4 4 3 4 2 6 1 2 1 2 1 0 147.0 0.333333333333 73.0 0.657534246575 0.213799805637 0.236151603499 0.0205816233662 0.317541538342 0.057197445131 0.00187184059591 0.0230165911407 0.00356900080994 0.468174968692 0.571428571429 0.0952380952381 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 6.0 4.0 0.206896551724 0.0 7.0 1.0 0.496598639456 0.416666666667 0.0 0.0 0.166666666667 0.75 0.416666666667 0.333333333333 0.666666666667 0.916666666667 0.916666666667 0.833333333333 0.916666666667 0.916666666667 1.0 1.0 0.916666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -3.81971863421 1.87954408985 -6.85730245391 6.80282919635 2.67516413578 3.73269124712 -2.72999241392 22.3324581888 -2.8137265207 2.45996173382 -7.88643762319 36.3893966276 2.26487763435 0.0613719616757 -3.44857501925 37.1560187531 -1.61023162973 -0.804143891807 -5.29458741687 28.7755689523 1.25677742927 -0.676643332556 -3.68424214104 19.6199607855 -0.324385820174 -0.145136445847 1 3 3 5 3 5 5 4 6 2 18 1 4 6 3 6 3 6 3 6 3 6 2 7 2 7 3 6 4 5 6 1 0 144.0 0.5625 68.0 0.617647058824 0.181327160494 0.203559027778 0.0310326512131 0.150245614176 0.0414553460434 0.00590238884649 0.0129743177874 0.00313633389331 0.129468320825 0.555555555556 0.0 0.0 0.0 3.0 2.0 0.0 0.0 0.0 0.0 1.0 6.0 0.0357142857143 1.0 4.0 1.0 0.472222222222 0.416666666667 0.833333333333 0.416666666667 0.333333333333 0.916666666667 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 0.333333333333 0.166666666667 0.0833333333333 0.583333333333 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 -7.87816968305 6.04788783749 -14.7080181803 12.4465528527 5.42463459355 -2.88779183852 -2.33963727844 5.2244244219 -3.0105943899 1.46138120354 -4.93446642595 10.597121983 2.58846776751 1.42767680976 1.63068547102 19.2923617794 -1.34531159817 -1.23195236106 -1.02289097363 10.7872802352 0.175816706726 -0.66757829581 -3.71713197321 0.19141332256 0.10899682275 -0.205682183581 6 1 1 1 1 1 7 10 4 5 2 4 3 5 4 4 1 5 5 10 6 9 7 2 1 4 7 8 8 2 1 5 6 3 2 4 6 3 3 4 4 3 5 4 2 4 9 2 6 0 210.0 1.07142857143 103.0 0.718446601942 0.218412698413 0.213265306122 0.100725191664 0.0760307742144 0.0467988338192 0.0356159534266 0.00817735490404 0.0105914362217 -0.00144656633495 0.666666666667 0.928571428571 0.0 2.0 3.0 2.0 3.0 3.0 3.0 3.0 6.0 12.0 0.179487179487 0.0 2.0 2.0 0.490476190476 0.375 0.9375 1.0 0.625 0.75 0.5625 0.375 0.6875 0.5 0.0 0.0 0.125 0.75 0.5625 0.375 0.6875 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.34760608789 7.76676122288 -17.6756836955 22.0900510707 -7.16296273656 5.15237602436 -42.7408078026 41.013448681 -0.0953955080134 0.0888438260104 -46.0227752771 40.4381602616 0.641924366596 -2.03900321119 -43.4641274168 26.0269905901 -2.05290798472 0.104080362458 -57.6551994757 26.65567788 -0.52380190644 2.01632484222 -66.0897539162 48.6413414176 -0.0234795869935 0.524545858769 10 1 2 23 1 7 1 2 3 5 7 4 9 3 8 5 8 3 9 2 9 4 8 5 7 5 6 7 5 3 8 0 180.0 0.8 79.0 0.708860759494 0.167592592593 0.17962962963 0.0448141289438 0.099265260631 0.0287842935528 0.0127713540001 0.00611009437389 -0.000766193810352 0.0520915348324 0.583333333333 0.0666666666667 3.0 1.0 3.0 0.0 0.0 1.0 0.0 0.0 2.0 6.0 0.111111111111 1.0 2.0 1.0 0.438888888889 0.583333333333 0.333333333333 0.0833333333333 0.25 0.75 0.916666666667 0.75 0.916666666667 0.75 0.833333333333 0.666666666667 0.75 0.666666666667 0.25 0.0833333333333 0.166666666667 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.25 0.25 0.5 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.5 1.0 1.0 0.75 0.25 0.0 0.25 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -11.2045079937 8.31849835894 -22.1654590794 22.4329369439 6.36053888125 3.73709953486 -6.90351223345 36.9111027723 -3.44289002979 0.336898135603 -15.7010587619 37.9221030789 -0.810837468791 -0.571557653134 -27.7058868602 36.2132973944 -0.564409693269 1.43370548198 -32.9676333889 45.1103311311 -0.856989536163 0.47005910182 -42.9311582702 55.1453255758 -0.169658630969 0.280598331068 1 3 2 4 1 21 2 4 8 2 9 2 9 3 8 3 8 3 8 4 6 6 5 6 5 6 4 0 143.0 0.846153846154 67.0 0.537313432836 0.165289256198 0.192576654115 0.0445631926878 0.109235084931 0.0282209843558 0.0125541291007 0.0085452195318 -0.00124052675539 0.0587148612859 0.363636363636 0.0769230769231 1.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 1.0 5.0 0.136363636364 0.0 1.0 1.0 0.468531468531 0.833333333333 0.416666666667 0.333333333333 0.583333333333 0.916666666667 0.833333333333 1.0 1.0 0.666666666667 0.166666666667 0.416666666667 0.916666666667 0.75 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.25 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.6756238751 2.05677157226 -22.8764987119 8.00313505938 3.86086565636 4.4334467534 -13.2487442141 22.5333923064 -1.43535174787 -0.64271861218 -16.3518948047 21.1280844162 -1.5389967688 -0.869555219894 -28.4162601531 14.2237240127 -0.264951534554 0.249246003235 -33.0219090922 12.6915762449 -0.391118802735 -0.81808691061 -35.6708473189 4.52812221166 0.0316123203156 -0.224882210832 4 2 6 7 4 8 2 2 5 3 2 1 6 2 9 2 8 3 8 3 8 3 2 3 3 3 2 3 3 3 1 3 3 9 2 5 1 2 8 0 154.0 0.785714285714 67.0 0.955223880597 0.210743801653 0.212894248609 0.0727529554271 0.124343968563 0.0592829543538 0.0206078718784 0.013800038563 0.0143326712644 0.0519286040571 0.636363636364 0.428571428571 2.0 3.0 1.0 0.0 0.0 2.0 1.0 3.0 1.0 5.0 0.28 1.0 1.0 1.0 0.435064935065 0.5 0.25 0.166666666667 0.833333333333 0.583333333333 0.0 0.166666666667 0.583333333333 0.666666666667 0.0 0.0 0.166666666667 0.583333333333 0.5 0.666666666667 0.833333333333 0.25 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.25 0.5 0.5 0.25 0.75 1.0 0.75 0.5 0.75 1.0 1.0 -0.727565454134 0.818511135901 -6.80572679782 4.51001077095 -6.79679768633 3.70974860064 -25.772724567 16.5983254345 2.73431733848 -0.604323828212 -21.8359455988 14.0133513382 -1.86815062746 -1.65456624346 -25.6587090283 1.78250955006 0.3640189899 -0.287416043847 -27.7949316286 -4.64725218829 -0.0736652501273 -0.705251008054 -25.4710239508 -12.3846443692 0.0441791147786 -0.191855139665 2 2 11 5 10 5 10 5 12 3 12 3 12 2 14 1 13 2 13 2 3 3 7 3 1 6 5 2 4 5 3 3 5 5 2 3 6 4 2 3 7 4 1 3 7 4 1 3 7 4 2 2 7 4 2 2 6 4 2 4 5 4 2 4 4 4 3 11 8 5 5 0 345.0 0.652173913043 129.0 0.759689922481 0.155748792271 0.210333963453 0.047242151661 0.156529385801 0.0658670782231 0.0168613808283 0.0239202780927 0.0185725577995 0.125845254957 0.666666666667 0.521739130435 3.0 2.0 3.0 0.0 0.0 1.0 5.0 4.0 3.0 7.0 0.25 1.0 1.0 2.0 0.373913043478 0.75 0.458333333333 0.666666666667 0.666666666667 0.458333333333 0.375 0.333333333333 0.333333333333 0.0 0.291666666667 0.291666666667 0.0416666666667 0.0 0.166666666667 0.75 0.666666666667 0.666666666667 0.666666666667 0.0 0.0 0.0 0.166666666667 0.5 0.5 0.833333333333 0.833333333333 0.5 0.333333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.5 0.666666666667 0.666666666667 0.5 0.5 0.333333333333 0.5 0.333333333333 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 -8.63588560777 -13.230619617 -23.1703099512 -29.8963916716 -2.26163006828 4.214133021 -24.4443468092 -8.87809278419 5.24747960099 6.84001699613 -9.68623656948 21.8036397402 -5.10976188205 -3.698502175 -23.2467004959 15.8052068073 3.5826816467 2.75949854992 -11.9310168723 18.0192766587 -1.33895683859 -3.07768562355 -14.489991407 3.14901634835 -0.297227021433 0.219730078343 1 4 3 5 2 5 2 4 33 1 4 4 3 4 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 5 2 13 1 1 1 1 2 1 161.0 0.304347826087 73.0 0.739726027397 0.188997338066 0.242506076154 0.0182556602347 0.381053180938 0.0587154327734 0.00234133447103 0.0275103760618 0.00553913618071 0.63394383162 0.857142857143 186737708.435 0.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 3.0 4.0 0.0869565217391 3.0 7.0 1.0 0.453416149068 0.333333333333 0.166666666667 0.166666666667 0.166666666667 0.666666666667 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.416666666667 1.0 1.0 0.666666666667 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.04115159851 -3.87507687528 -6.55975702775 -4.10739019385 3.5376950809 8.0992560043 -1.45288684574 25.3935655659 -3.88196517725 2.44145389843 -7.26793402914 40.9813465096 3.98446562771 -1.92532925248 1.61578960527 30.4758474431 -3.26478279474 0.0512616417814 -6.08145869804 25.7511065103 2.05922071526 -0.224188529192 -4.00027189944 24.1413674553 -0.475766340791 -0.0216427650164 29 4 27 6 27 6 24 9 23 10 22 10 22 11 22 10 21 11 21 4 3 5 20 5 2 5 20 5 3 4 21 5 3 4 18 15 17 16 17 6 1 1 1 6 17 4 7 4 17 3 9 4 15 4 9 5 14 4 10 4 14 4 10 5 12 6 9 6 8 2 1 9 5 9 7 13 3 12 6 1 18 8 5 0 825.0 1.32 265.0 0.554716981132 0.197906336088 0.173818181818 0.131957336005 0.0677297270223 0.0590614375157 0.0556014298503 0.0136477369104 0.0142227678645 -0.00138852262135 0.484848484848 0.64 0.0 3.0 9.0 4.0 0.0 3.0 5.0 7.0 5.0 15.0 0.246376811594 2.0 3.0 2.0 0.321212121212 0.0 0.0 0.015873015873 0.460317460317 0.0 0.031746031746 0.412698412698 0.333333333333 0.15873015873 0.571428571429 0.650793650794 0.650793650794 0.793650793651 0.619047619048 0.333333333333 0.238095238095 0.0 0.0 0.0 0.0 0.0 0.0 0.05 0.55 0.0 0.0 0.0 0.0 0.0 0.05 0.55 0.75 0.0 0.0 0.0 0.0 0.1 0.5 0.55 0.55 0.0 0.0 0.0 0.1 0.75 0.45 0.0 0.1 0.0 0.0 0.25 0.85 0.9 0.15 0.15 0.6 0.05 0.5 0.75 0.45 0.8 0.7 0.9 1.0 0.45 1.0 0.95 0.85 0.75 0.45 0.25 0.55 0.95 0.9 0.55 0.15 0.0 0.0 0.0 0.0 30.8664132057 -8.98984284616 59.2403671393 -14.8485854808 -20.820798726 10.5840760819 2.55202680182 22.895865355 6.97321013444 2.47361658567 16.395568314 36.8318409716 3.41537061521 -4.55020670749 41.3993798138 16.1035066685 -4.99145350462 2.69609435134 10.142673428 24.0454591784 1.60746672939 -0.898086192135 19.1803357289 23.1009018485 0.572757392751 -0.115348854001 5 3 7 6 3 10 2 11 1 3 2 6 9 1 13 1 10 2 9 3 9 3 2 1 5 4 1 3 3 5 2 11 1 11 168.0 0.857142857143 84.0 0.642857142857 0.248015873016 0.248299319728 0.0824796188317 0.133358303639 0.0675632356117 0.0179601827546 0.0156944614929 0.0119872489493 0.0366514874775 0.916666666667 0.214285714286 3.0 3.0 3.0 2.0 0.0 1.0 0.0 2.0 5.0 4.0 0.172413793103 2.0 3.0 1.0 0.5 0.5 0.5 0.0 0.5 0.666666666667 0.333333333333 0.0 0.333333333333 0.916666666667 0.416666666667 0.0 0.333333333333 0.916666666667 0.583333333333 0.166666666667 0.75 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.25 1.04587534032 1.13682102208 -2.04000971319 4.52741067413 -6.2636518274 2.59984007622 -19.7175808746 13.381388266 2.69133499263 0.245896138946 -11.103563538 18.1762075643 0.966268445488 1.1501545048 -0.489823819603 23.9675737025 -0.350798527661 -0.224065117766 -1.47960743531 22.9059743166 0.287442762194 -0.498492038905 -0.509839284883 17.621401977 -0.0861506305156 -0.00429000202653 2 4 4 7 1 2 4 3 1 1 5 2 7 2 6 3 4 5 3 2 2 2 1 3 3 2 1 2 4 2 1 2 4 2 1 2 4 2 1 2 4 2 117.0 0.692307692308 54.0 0.87037037037 0.247863247863 0.207100591716 0.0777828351793 0.130975460364 0.0613856156262 0.0201960618525 0.0144446320097 0.0126542486089 0.0503150805345 0.666666666667 0.615384615385 1.0 2.0 2.0 1.0 1.0 1.0 2.0 3.0 4.0 3.0 0.25 0.0 2.0 1.0 0.461538461538 0.5 0.0833333333333 0.333333333333 0.666666666667 0.5 0.0833333333333 0.5 0.333333333333 0.5 0.333333333333 0.333333333333 0.0 0.583333333333 0.833333333333 0.75 0.666666666667 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.25 0.75 0.75 0.25 0.0 0.25 0.75 0.5 0.0 0.5 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.88147353097 1.76294706194 -0.0164627418394 5.24924121778 -3.04951592371 1.95419378464 -9.29710296535 14.9274848691 0.721048496343 2.11334315527 -8.25887600633 23.1804398064 -0.120561163898 -1.35533532422 -10.5259683603 18.7214925058 -1.48345479282 0.38290004521 -18.5125850626 14.3818902156 1.07554607832 -1.36674547661 -14.7236089586 4.15863687857 -0.227369235904 -0.0776464608564 7 5 5 9 3 4 2 4 2 4 5 1 3 3 10 3 10 3 10 2 11 2 10 4 8 5 9 4 9 3 10 4 9 4 9 3 10 3 10 3 10 4 9 4 9 4 8 0 273.0 0.619047619048 85.0 0.717647058824 0.0966469428008 0.132740275597 0.0232936344517 0.110986027663 0.0136976451431 0.00890351239331 0.00491275818575 -0.00121069812493 0.0997545988626 0.230769230769 0.0952380952381 0.0 3.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 3.0 0.222222222222 0.0 1.0 1.0 0.311355311355 0.291666666667 0.625 0.791666666667 0.75 0.583333333333 0.416666666667 0.416666666667 0.375 0.375 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.5 0.5 0.0 0.333333333333 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.5 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -16.0670704455 6.54808908721 -30.7029864498 18.296545951 11.2921128137 4.03873068417 2.17228372452 34.8428238689 -2.00673395843 1.81756872359 3.16808932161 45.4428136838 -1.53228817165 0.418026966279 -7.11820063698 48.0331498015 2.12854231657 -0.279850281263 5.18555421174 45.0705681342 -0.626384650829 -0.0618050377296 5.01157113298 44.8219057845 0.0161837385269 0.173815665824 2 3 3 5 2 5 3 3 33 2 2 5 2 6 2 4 4 3 4 3 4 3 3 4 3 4 3 4 3 4 2 6 1 13 1 0 154.0 0.318181818182 77.0 0.649350649351 0.192949907236 0.280401416765 0.0183447855905 0.393135874077 0.0516901297387 0.00207162256332 0.0150937487674 0.00341357022349 0.683676463665 1.14285714286 195225786.0 1.0 2.0 1.0 2.0 4294967295.0 4294967293.0 0.0 0.0 2.0 1.0 0.285714285714 0.0 6.0 1.0 0.5 0.166666666667 0.333333333333 0.333333333333 0.666666666667 0.5 0.333333333333 0.75 1.0 0.666666666667 0.416666666667 1.0 1.0 0.666666666667 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -5.61382890179 -5.72957795131 -9.52260937533 -9.13745009718 4.66834570492 7.32339931605 -1.50782721735 17.913584357 -4.48837524287 2.82275424702 -9.29461789742 35.6501243595 3.89555686364 -1.314391778 -0.102756261968 31.9788793656 -2.52205506729 1.04139497263 -4.58186287572 33.1468913231 1.33949805474 -1.13993240873 -4.56602322064 25.544135533 -0.256077832232 -0.06062992197 3 1 6 2 1 1 3 6 2 6 3 6 2 6 3 4 4 4 3 4 3 5 2 5 3 3 5 0 96.0 0.666666666667 53.0 0.641509433962 0.243489583333 0.259548611111 0.0497764304832 0.136690492983 0.0422713668258 0.00738323880925 -0.00332897823982 0.00069754334773 0.0640517581454 0.25 0.0833333333333 1.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 4.0 0.0588235294118 0.0 5.0 1.0 0.552083333333 0.166666666667 0.333333333333 0.0 0.0 0.5 0.833333333333 0.333333333333 0.166666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.56244170197 4.03192522499 -10.5816587444 8.69242030721 0.561463271463 -1.52081390066 -9.35994375788 3.80609222156 0.105653011348 -0.400425322357 -7.24134104669 0.0761753565882 0.0675883745293 0.192474825475 -5.92716698148 0.591701298716 0.372207166752 -0.177208234824 -2.68254733294 -0.0693544041929 0.177283427919 0.0926168944256 0.972110938716 -0.268547533281 0.164624695198 -0.0818581766514 1 3 4 4 3 4 3 4 31 4 2 5 2 6 1 5 3 4 3 4 3 4 3 4 3 4 3 4 3 5 2 20 154.0 0.318181818182 84.0 0.52380952381 0.203153988868 0.311393152302 0.0187875246696 0.399880457711 0.0585978998232 0.00226032355697 0.0149056667023 0.00506786704386 0.732908932517 0.857142857143 195225786.0 1.0 1.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 3.0 0.0 0.111111111111 0.0 6.0 1.0 0.545454545455 0.333333333333 0.416666666667 0.666666666667 0.583333333333 0.666666666667 0.5 1.0 1.0 0.666666666667 0.5 1.0 1.0 0.583333333333 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -6.42407224844 -7.14750380795 -10.162529223 -12.8999757836 6.18336683864 6.78560866499 0.223001014974 12.0355620473 -6.37880898226 2.74484119676 -12.5752574305 29.3037608537 5.23833669841 -1.32950422146 0.977362555285 26.199318559 -2.88127393473 1.45644806357 -4.2116517374 32.6244994838 0.951697647864 -0.286102173182 -6.54055030474 32.2092535156 -0.0323844137544 -0.205199918332 6 2 2 1 5 8 4 3 2 3 3 3 9 3 9 3 9 3 9 3 6 6 6 6 7 5 8 4 8 4 8 4 8 4 8 4 8 3 9 3 9 3 9 4 7 6 5 0 252.0 0.571428571429 88.0 0.647727272727 0.120701058201 0.161753590325 0.0227439116446 0.138106535971 0.0263000555895 0.00609001462891 0.0104344967086 0.00027765769685 0.129374135404 0.25 0.0952380952381 1.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 1.0 6.0 0.172413793103 0.0 1.0 1.0 0.349206349206 0.0 0.444444444444 0.388888888889 0.388888888889 0.444444444444 0.833333333333 1.0 1.0 0.722222222222 0.666666666667 0.666666666667 0.555555555556 0.333333333333 0.0 0.0 0.0555555555556 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.5 0.5 0.0 0.333333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -12.9142868109 4.12287090676 -21.199850902 11.1352083892 13.0091507873 2.11670403096 11.2326751291 21.3325157445 -6.67057425873 2.37089671503 -0.889274377985 34.98344662 2.59311347934 1.25548672655 0.320251792738 43.07868957 -0.425942332035 -0.873208448316 4.70350723087 35.2766870856 -0.384450461477 -1.12902406284 -2.19658690875 20.9990709368 0.00304581117362 -0.256472873149 1 3 2 5 2 4 3 2 3 4 3 2 4 2 4 3 3 3 3 2 4 2 3 3 4 3 2 3 4 2 4 2 4 2 4 2 4 3 1 12 126.0 0.285714285714 64.0 0.796875 0.210317460317 0.249433106576 0.0172812511248 0.393100097182 0.0532969801677 0.00155532074834 0.0200703713709 0.00340839090364 0.694285641353 1.5 0.0 1.0 4.0 0.0 4.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0740740740741 0.0 10.0 1.0 0.507936507937 0.416666666667 0.0 0.166666666667 0.333333333333 0.833333333333 0.5 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.75 0.666666666667 0.583333333333 0.75 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.45593590714 0.0606304545112 -6.00891867396 0.676096482554 2.60628463984 1.10495909956 -2.04662894642 7.03729246647 -2.63787042523 2.56692243383 -5.44100330242 21.7567749543 2.76474596544 1.17729912227 0.588644332915 30.3280947203 -2.21815040648 -0.669637142236 -3.16653453345 25.1820795453 1.79632025714 -0.906216555639 0.105146520058 10.9224441563 -0.432509696244 -0.436580492997 3 1 1 3 1 2 5 13 2 13 4 4 4 4 3 4 5 3 3 3 6 3 3 3 6 3 3 4 6 2 3 3 6 3 3 4 5 3 3 12 3 11 4 10 4 9 6 4 11 4 11 4 11 5 10 5 9 7 7 8 7 8 7 0 330.0 0.681818181818 165.0 0.478787878788 0.219595959596 0.220936639118 0.0551559952138 0.133917244066 0.0350644739405 0.0145612259164 0.000255264702529 6.54182774572e-05 0.0697257640687 0.8 0.409090909091 2.0 0.0 4.0 2.0 4.0 5.0 0.0 0.0 4.0 11.0 0.122448979592 0.0 2.0 2.0 0.5 0.416666666667 0.25 0.375 0.625 0.916666666667 0.875 0.916666666667 0.916666666667 0.541666666667 0.25 0.666666666667 0.25 0.583333333333 0.333333333333 0.583333333333 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.5 1.0 0.666666666667 0.166666666667 0.166666666667 0.5 1.0 0.666666666667 0.0 0.833333333333 0.333333333333 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 -9.43354753599 10.880410655 -18.1429473317 27.9577595597 6.25463381541 3.0996351877 -1.47194842597 42.9944076077 -2.25864760564 2.43373820287 -5.05047714501 53.365098845 -0.122273730859 -0.348142389305 -7.00061532249 52.3191060833 1.52309354321 -0.139812979642 2.23298821293 50.6282625786 -1.02810628897 0.680530260033 -1.54507242251 54.7967753793 0.209152741247 -0.122973454015 1 3 3 6 2 13 3 5 3 5 2 4 5 4 2 5 5 3 2 4 5 4 3 3 6 3 2 4 6 3 2 3 7 2 3 3 6 4 2 4 5 4 1 6 4 4 1 6 3 6 195.0 1.15384615385 111.0 0.54954954955 0.255384615385 0.256804733728 0.116276538714 0.0910890608405 0.0501556668184 0.0344274954909 0.00709793024669 0.00985542469247 -0.0167269515481 0.6 0.923076923077 2.0 3.0 1.0 1.0 2.0 3.0 3.0 3.0 4.0 8.0 0.162162162162 0.0 1.0 2.0 0.569230769231 0.8125 0.6875 0.6875 0.875 0.625 0.5625 0.375 0.5625 0.5 0.0 0.0 0.0625 0.9375 0.625 0.5625 0.8125 0.75 0.75 0.5 0.5 0.5 0.25 0.25 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 0.75 0.75 0.75 0.5 0.5 0.25 0.5 0.75 0.25 0.25 0.25 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.39530545263 6.87549354157 -13.0177867542 18.4664486853 -6.85851701431 2.8452659693 -34.1469378937 28.7504477968 2.24455679176 -0.460428569787 -25.7555301702 25.4192275019 1.53829212272 -1.22184004149 -13.1487242486 14.7700235699 -0.797351162469 -0.811151510158 -13.887720308 5.59624627595 1.12901766343 -0.377256022191 -5.6489152635 0.150324109869 0.0988057004401 -0.115293951374 0 5 7 1 11 7 3 7 2 4 1 7 3 6 3 4 3 4 5 4 5 4 2 5 4 5 4 3 4 5 3 5 4 2 5 5 3 5 3 2 7 4 3 6 2 2 7 4 1 3 1 7 9 7 1 7 9 6 2 6 10 6 2 6 11 4 4 4 14 1 6 2 7 0 336.0 1.71428571429 165.0 0.636363636364 0.227306547619 0.208545918367 0.143453535618 0.046049730346 0.0531134375253 0.049375865164 0.00722008733967 0.00728132196405 -0.026907366707 0.208333333333 1.57142857143 0.0 2.0 2.0 1.0 5.0 6.0 5.0 3.0 2.0 8.0 0.340425531915 0.0 3.0 3.0 0.491071428571 0.875 0.583333333333 0.333333333333 0.125 0.291666666667 0.375 0.708333333333 0.916666666667 0.708333333333 0.791666666667 0.833333333333 0.625 0.333333333333 0.333333333333 0.708333333333 0.666666666667 1.0 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.666666666667 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.166666666667 0.333333333333 0.166666666667 0.166666666667 0.5 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.833333333333 1.0 -6.73755925756 10.3981229487 -16.1620878506 25.3630497811 0.92121975741 0.308362702241 -8.98288364592 25.6436508205 3.43491126051 -2.49209705709 0.760808556202 9.82450822775 -4.8925710891 -0.773255756034 -19.6282431541 5.06235243046 1.78809598093 1.39518597134 -15.5711567397 9.59280413237 0.563108895259 -1.48170775158 -4.95817925857 3.49824228458 -0.0963629222575 0.216771484377 4 8 5 8 3 3 4 4 1 4 3 5 1 5 1 5 1 4 9 4 9 4 9 4 10 4 9 4 5 2 2 5 3 3 3 10 5 5 11 1 5 0 195.0 0.866666666667 92.0 0.70652173913 0.19842209073 0.196923076923 0.0686263760347 0.0958470641784 0.037218024579 0.0215531412948 0.0109501158291 0.00449587030211 0.0292427887004 0.846153846154 0.333333333333 0.0 3.0 5.0 3.0 1.0 2.0 0.0 1.0 6.0 11.0 0.147058823529 2.0 2.0 1.0 0.471794871795 0.3125 0.875 0.9375 0.6875 0.625 0.4375 0.3125 0.6875 0.6875 0.3125 0.0 0.3125 0.875 0.4375 0.0 0.5 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 -11.5440385389 4.66854499736 -27.2397060664 16.2180991687 1.04122700547 7.55342286361 -23.218987402 43.3359774236 2.15401531303 0.676990373373 -9.58347514776 47.7850556468 0.00438831818917 -2.28437104705 -6.13335263139 31.3636932232 0.171200441065 -0.690831778754 -4.88532014782 18.4194342926 0.129806953692 -1.52627987203 -2.64163716483 0.0520137063014 0.107960911344 -0.494147537574 5 6 6 7 4 8 3 4 3 1 3 4 8 3 9 3 9 4 8 4 6 9 3 9 4 5 1 1 6 3 9 4 8 4 8 3 9 4 8 4 8 4 7 5 6 8 4 8 4 0 264.0 0.545454545455 115.0 0.55652173913 0.15845959596 0.206611570248 0.0279706065476 0.175898969029 0.0292295371066 0.00630347868636 0.00833407765086 -0.000692728897197 0.172605548453 0.833333333333 0.0909090909091 2.0 3.0 5.0 0.0 1.0 0.0 1.0 0.0 6.0 4.0 0.114285714286 1.0 2.0 1.0 0.435606060606 0.111111111111 0.555555555556 0.5 0.5 0.5 1.0 1.0 1.0 0.722222222222 0.666666666667 0.611111111111 0.666666666667 0.555555555556 0.333333333333 0.222222222222 0.111111111111 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.166666666667 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.833333333333 1.0 0.833333333333 0.833333333333 0.833333333333 1.0 0.833333333333 0.166666666667 0.333333333333 0.833333333333 0.5 0.333333333333 0.333333333333 1.0 0.5 0.0 0.0 0.666666666667 0.5 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.5 0.0 0.0 -14.6422547645 2.43073003995 -25.4685531033 5.30380123801 12.9000402484 -0.0186537724435 6.41823393622 10.0190346267 -6.85279871137 2.92906918769 -7.96996476911 17.3967418167 1.73572546243 -2.72387996945 -10.001064048 9.51736086653 0.19995406807 1.30177542301 -5.35632840694 4.33154074277 -1.32323199358 -2.98046188716 -16.284380974 -14.5213578874 0.146923077713 0.0435636066755 1 3 1 3 4 1 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1 5 126.0 0.285714285714 65.0 0.707692307692 0.248677248677 0.254346182918 0.0207540982295 0.375681871808 0.0642379232704 0.00133886003987 0.0224393849787 0.00252789105125 0.621674482442 0.333333333333 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 4.0 0.08 0.0 9.0 1.0 0.515873015873 0.25 0.0 0.0 0.0833333333333 0.583333333333 0.5 0.5 0.583333333333 0.916666666667 1.0 1.0 1.0 0.916666666667 0.916666666667 0.833333333333 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -2.36458772594 1.87954408985 -4.18993412766 5.94187205359 1.63207284694 2.26064980392 -2.18800401099 15.2497587247 -1.95875733395 1.47277593835 -5.30101294589 24.7191184331 1.86761841594 0.680878471661 -1.53705611531 27.894828702 -1.42683604999 -0.930133990009 -2.42928042009 20.4563790539 1.49178736181 -0.782848502802 0.836136421345 7.60407299428 -0.400713239514 -0.366949798356 2 2 3 2 1 9 1 20 2 3 7 4 7 3 6 4 6 4 6 3 7 4 5 5 4 7 4 6 3 0 140.0 0.714285714286 76.0 0.460526315789 0.206428571429 0.23112244898 0.0441031341108 0.135266399417 0.0318815597668 0.0089183305526 0.00475821273411 -0.00216132844606 0.0785516843226 0.6 0.0714285714286 2.0 1.0 3.0 0.0 1.0 0.0 0.0 0.0 5.0 1.0 0.24 0.0 5.0 1.0 0.542857142857 0.833333333333 0.416666666667 0.25 0.583333333333 0.916666666667 0.916666666667 0.916666666667 1.0 0.75 0.666666666667 0.583333333333 0.666666666667 0.916666666667 0.25 0.0 0.0833333333333 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.25 0.25 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.5 1.0 1.0 0.5 0.25 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -8.00321999548 5.63863226954 -14.6464071001 15.4714473756 6.05623999194 3.01048766991 0.194527852747 27.5636932322 -2.96124594301 0.869040723355 -3.75769208946 31.9650347229 1.522368863 -0.139478544251 -0.608790851006 32.8411565542 0.185062314299 0.838184939585 6.17287637798 36.3227057921 0.208300030253 -0.602872824622 5.08247908066 32.4584727677 -0.159193019419 -0.0153142075824 0 1 7 4 3 5 3 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 5 2 4 3 4 4 3 4 3 3 4 3 3 6 140.0 0.35 65.0 0.769230769231 0.202040816327 0.232142857143 0.0207128279883 0.295721574344 0.0592201166181 0.00204165472679 0.02332981264 0.00429405945582 0.420268344405 0.571428571429 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 0.208333333333 0.0 7.0 1.0 0.464285714286 0.3 0.0 0.0 0.0 0.6 0.5 0.5 0.4 0.8 1.0 1.0 0.9 0.8 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.69239467973 1.40056349921 -6.29353202701 4.77772232249 2.97587912593 2.30297202654 -1.53628376491 14.3474198244 -3.03557018734 1.47631329437 -6.87556143845 23.1392325511 2.47858702253 0.492428766022 -3.14184023963 28.6849708207 -2.25491139391 0.755879857846 -7.87715506409 33.2989681614 1.69156614383 -0.502317701863 -5.15870742669 28.0431507979 -0.426203048241 -0.235570395353 5 3 7 9 2 4 2 4 1 4 3 32 8 4 8 4 8 4 8 4 9 5 3 3 2 10 3 8 6 2 1 1 3 0 180.0 0.8 101.0 0.50495049505 0.242592592593 0.248518518519 0.072548696845 0.116409293553 0.0434766803841 0.0182449968897 0.00906935618714 0.00384109628236 0.0308439183021 0.916666666667 0.266666666667 0.0 3.0 5.0 3.0 1.0 1.0 0.0 1.0 7.0 11.0 0.194444444444 0.0 3.0 1.0 0.561111111111 0.25 0.916666666667 1.0 0.75 0.666666666667 0.916666666667 0.666666666667 0.833333333333 0.666666666667 0.583333333333 0.0 0.416666666667 0.583333333333 0.583333333333 0.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -10.9498600847 7.46967199578 -25.0649020566 21.1473274291 2.01567967038 5.39627213271 -18.6939762799 45.3786564359 1.21006171291 4.34807007999 -9.36127822891 67.6109403726 -0.2007190941 -0.27283642519 -6.78563250537 67.3974201204 1.083862338 -0.779483924355 -0.321951256339 62.3723986023 -0.594440938678 1.59011166276 -5.53751793587 75.9028126887 -0.286132526486 0.309763474081 4 4 5 7 3 3 3 2 2 4 3 2 3 3 8 3 8 7 5 7 4 8 2 1 5 7 4 3 1 3 4 3 1 5 1 3 3 8 2 0 154.0 0.785714285714 83.0 0.686746987952 0.220779220779 0.272727272727 0.0592728236513 0.139184900106 0.0528335301063 0.0128794763585 0.00817436389981 0.00750821799881 0.0612507869641 1.09090909091 0.428571428571 2.0 2.0 4.0 1.0 1.0 1.0 1.0 3.0 6.0 14.0 0.236842105263 1.0 3.0 2.0 0.538961038961 0.5 0.75 0.416666666667 0.833333333333 0.666666666667 0.75 0.75 0.416666666667 0.5 0.25 0.75 0.166666666667 0.75 0.333333333333 0.833333333333 0.75 0.0 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.25 0.75 1.0 -8.45794840431 -0.773038295018 -21.5291499778 0.0719943618271 -1.56046085603 3.17961879748 -26.5209323219 12.7743419384 1.35107461671 1.68358174502 -19.8198350599 21.2453716017 -0.314618532209 -1.1367094588 -19.7334721913 16.057942443 -0.493589939295 -0.229526374539 -24.3464880427 6.64197006214 -0.157170724998 -2.09430903211 -25.1144747562 -12.4923050278 0.16877695177 -0.147067586918 4 1 3 1 6 7 4 1 5 3 2 2 5 9 2 4 1 3 9 2 10 2 10 3 9 3 9 4 6 1 2 4 4 2 3 8 6 4 4 0 168.0 0.857142857143 64.0 1.0625 0.143849206349 0.180697278912 0.0551092957024 0.10203554388 0.0367548557121 0.0214668374427 0.0134308078259 0.00829472458033 0.0589012729316 1.0 0.428571428571 1.0 5.0 4.0 2.0 2.0 2.0 0.0 2.0 5.0 11.0 0.151515151515 2.0 3.0 1.0 0.380952380952 0.25 0.833333333333 0.833333333333 0.75 0.416666666667 0.416666666667 0.166666666667 0.75 0.333333333333 0.0833333333333 0.0 0.333333333333 0.5 0.25 0.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.75 0.25 0.5 0.5 0.75 0.75 0.25 0.0 0.25 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.0 -9.54929658551 1.81891363534 -24.9975897662 6.83286610648 -2.91490190234 4.12967636594 -35.3194642607 24.6657296196 0.950384268376 3.27571118667 -30.0068720984 42.2179004818 0.421912991516 -0.457995408023 -26.1412109902 39.3150336958 -0.785340568563 -1.45412735547 -31.6962378852 27.1949592941 -0.392975273565 0.395995194606 -36.1340682399 28.4250662062 0.0462616870032 0.133069820014 2 2 3 4 1 11 32 4 1 5 1 5 3 2 4 2 3 4 2 4 2 4 3 3 2 4 2 4 1 12 132.0 0.272727272727 70.0 0.628571428571 0.213383838384 0.291666666667 0.0181719919581 0.462240779002 0.0573107973676 0.00192738698573 0.0174629123982 0.00342649512252 0.907435352319 1.66666666667 195225785.955 2.0 3.0 1.0 2.0 4294967295.0 4294967292.0 0.0 0.0 5.0 3.0 0.0769230769231 0.0 8.0 1.0 0.530303030303 0.416666666667 0.25 0.5 0.5 0.583333333333 0.333333333333 0.833333333333 0.916666666667 0.666666666667 0.333333333333 1.0 1.0 0.583333333333 0.333333333333 0.833333333333 1.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -4.28271483229 -3.76184410944 -7.35799104608 -3.87244719389 3.33232904139 7.6750707568 -2.3870322427 21.4698138828 -3.52972145095 0.0621258772216 -7.45447517607 26.4985829588 3.75174017463 -1.11150255648 2.52587805229 20.7090046468 -2.5394520276 1.084969872 -2.39977275775 21.3389702333 1.53455606526 -1.76468112823 -0.395882732122 11.5773098642 -0.247723550746 0.163108738793 5 4 9 6 7 7 5 4 5 2 3 7 2 4 1 8 6 3 11 3 10 3 12 3 12 2 7 1 4 3 6 1 4 4 4 1 7 6 4 0 196.0 1.0 72.0 0.972222222222 0.134110787172 0.154518950437 0.0499547382468 0.0717090668004 0.0319376917781 0.0185698687976 0.0104538525205 0.00698309091056 0.0320258251635 0.928571428571 0.357142857143 0.0 4.0 5.0 2.0 0.0 2.0 0.0 3.0 3.0 10.0 0.228571428571 2.0 3.0 1.0 0.367346938776 0.25 0.75 0.75 0.5625 0.6875 0.6875 0.1875 0.4375 0.6875 0.3125 0.0 0.0 0.25 0.3125 0.0 0.1875 0.0 0.0 0.25 0.5 0.5 0.5 0.5 0.75 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 -11.686520107 6.04788783749 -29.4610299565 14.279366512 -1.90197117124 0.0218084032808 -36.5270811705 18.175073876 1.17128076135 2.50529596057 -28.5834064489 28.7841258172 0.754542547747 0.201354359012 -20.6634916296 30.4138128998 0.30596446815 -1.20777018271 -16.9669005543 21.4095976518 -0.0414313952557 0.261307814268 -16.3027544839 20.3422115336 0.0389665966151 -0.0333416147041 2 3 3 5 2 5 2 5 3 5 3 4 3 4 3 3 3 3 2 4 3 2 5 0 77.0 0.636363636364 43.0 0.627906976744 0.256029684601 0.230224321133 0.0510499788624 0.128717967814 0.0402292933917 0.00690743642095 -0.00159323527392 0.00204106321666 0.0537110324043 0.285714285714 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.2 0.0 2.0 1.0 0.558441558442 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.166666666667 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.77797718851 5.09295817894 -7.08230855657 11.7206203252 -0.424732049483 -0.738498068021 -7.72196723165 10.2055362556 1.01301961679 0.127663113972 -3.14075553612 9.35446899484 -0.255517535621 0.213513478771 -2.68943290593 9.86689821178 0.248365498645 -0.4229211063 -0.452467056718 7.04064731266 0.398905687649 -0.00813844123357 2.43697134886 4.53440060735 -0.124899458053 -0.17731913983 10 1 3 12 2 7 1 5 1 6 3 5 2 3 5 4 2 3 6 3 2 3 6 3 2 3 6 3 2 3 7 2 2 4 5 3 2 4 5 3 2 4 4 4 2 11 3 11 3 4 10 4 10 4 10 3 11 3 10 5 8 7 7 8 7 2 11 0 322.0 0.608695652174 150.0 0.593333333333 0.195652173913 0.19889278963 0.0494588071112 0.133470074265 0.0339904022758 0.0150112112307 0.0018275362697 0.00244439080935 0.0884916952503 0.857142857143 0.434782608696 2.0 2.0 4.0 2.0 3.0 5.0 1.0 0.0 6.0 12.0 0.107142857143 1.0 3.0 2.0 0.465838509317 0.666666666667 0.5 0.5 0.625 0.625 0.583333333333 0.833333333333 0.708333333333 0.333333333333 0.0 0.333333333333 0.0416666666667 0.708333333333 0.458333333333 0.541666666667 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.666666666667 0.5 0.0 0.0 0.333333333333 0.666666666667 0.833333333333 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 -10.29663284 13.230619617 -21.0806601939 33.7824024586 4.86608357279 2.84922274057 -9.99712631438 45.2750000584 -2.94035599841 0.184238586619 -17.524320353 46.8066609472 -0.19321138693 0.418581526031 -21.4521973465 41.2582183775 0.919750024217 -2.94653043669 -16.51238334 21.49351124 -1.17920291465 0.159459312321 -23.3531174846 11.2383428072 0.145609123816 -0.356900463831 2 4 3 5 3 6 2 6 2 6 3 6 3 4 3 5 2 5 2 5 3 4 4 3 5 0 96.0 0.666666666667 59.0 0.491525423729 0.248697916667 0.265625 0.0456802933304 0.133531358507 0.030510796441 0.00584903422213 -0.00577633174934 -0.000576750680206 0.0585312897844 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.222222222222 0.0 2.0 3.0 0.614583333333 0.333333333333 0.5 0.166666666667 0.166666666667 0.833333333333 1.0 0.5 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -6.36619772368 4.77464829276 -14.2436960674 10.3466149962 1.56502360707 -1.66670593182 -9.84221377246 5.40926078506 0.199434897825 -0.139628989426 -6.30967755045 2.47333400168 -0.0768297154876 0.0849243103316 -5.58720695559 2.15732010504 0.548513341064 -0.453665512286 -1.51755127935 -0.896925360095 0.0958132085104 0.0113365030444 1.86385180309 -3.15337538033 0.156526197422 -0.169921792521 4 7 6 4 1 4 4 3 4 4 3 3 5 3 2 3 7 3 1 3 7 7 7 7 7 3 1 3 7 3 1 4 5 3 2 4 5 2 4 5 1 4 5 8 8 3 6 0 196.0 1.0 93.0 0.698924731183 0.222303206997 0.215014577259 0.0943755365536 0.0899099227363 0.0494787461007 0.0316848650915 0.00934974040858 0.00861857203372 0.00672896748424 0.5 0.785714285714 0.0 2.0 3.0 1.0 2.0 3.0 3.0 2.0 2.0 11.0 0.171428571429 0.0 2.0 2.0 0.474489795918 0.3125 0.75 0.875 0.5625 0.6875 0.3125 0.3125 0.75 0.5 0.0 0.0 0.4375 0.75 0.5625 0.5625 0.625 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -4.27444704304 0.818511135901 -13.9589738399 6.69657428962 -5.46323702613 7.29143083308 -32.9860376455 33.3415068684 0.0838435096172 1.57276181819 -34.1709138617 42.688834848 0.915695230405 -2.20172815457 -28.4703299064 29.5812231987 -0.964688208733 0.302663642192 -33.0854720108 28.5419135713 0.135473051986 0.646977432697 -33.3617154342 33.8915393459 0.0326905254028 -0.124898769023 1 3 1 10 1 3 22 3 1 4 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 14 105.0 0.238095238095 62.0 0.532258064516 0.232380952381 0.310657596372 0.0159861785984 0.526094374258 0.0518907245438 0.00135385346921 0.0126395149572 0.00166401547848 1.17133076933 1.2 204522252.0 2.0 1.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 4.0 0.0 0.2 0.0 6.0 1.0 0.590476190476 0.5 0.416666666667 0.583333333333 0.666666666667 0.666666666667 0.5 1.0 1.0 0.666666666667 0.5 1.0 1.0 0.5 0.25 0.5 0.75 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -3.69845772518 -2.1826963624 -6.02896936204 -0.905944713282 3.18825451273 6.63882854294 -1.65658430197 22.7312364033 -3.70052590889 1.48953745432 -7.83289274688 33.9912795801 3.61111308021 -0.758832081425 0.257032555879 30.915009049 -2.88107625813 0.702554988739 -6.55849171284 32.18432475 1.73519745496 -0.763119348767 -5.01398428649 25.7144805633 -0.392798756759 -0.16348319819 4 3 5 3 4 7 3 4 3 7 2 6 1 6 4 5 2 6 4 4 4 4 5 3 5 3 5 3 6 3 5 2 7 3 4 3 7 2 5 3 7 1 6 2 7 2 5 3 7 2 5 6 3 4 1 1 1 6 4 5 3 5 5 3 4 3 6 0 272.0 1.0625 123.0 0.772357723577 0.192474048443 0.198299632353 0.0795559532745 0.084273338512 0.0395925231847 0.0257558187806 0.00818672073136 0.00513667247971 0.0162219153039 0.529411764706 1.0625 2.0 3.0 2.0 2.0 4.0 4.0 4.0 5.0 2.0 5.0 0.375 1.0 0.0 2.0 0.452205882353 0.55 0.7 0.55 0.35 0.8 0.45 0.15 0.1 0.4 0.45 0.55 0.65 0.8 0.5 0.05 0.1 0.166666666667 0.333333333333 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.666666666667 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.5 0.333333333333 0.5 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.5 0.833333333333 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 -8.76288392553 7.5645408246 -25.1630515387 22.7042708173 -5.13986564029 6.32214099202 -37.8826094675 42.5789916013 4.59607124037 -2.16723160538 -21.0112504151 34.695229678 -1.0007008607 -0.635249670155 -15.8745365293 26.9845544212 0.761681657408 1.0251844399 -18.0771102021 36.2499588185 -1.53111565247 1.12691423585 -25.1325258998 47.5348998235 0.229057064024 0.0285180646998 3 1 8 4 2 9 1 5 2 4 2 2 4 3 7 4 8 3 8 3 8 3 8 3 8 3 7 5 5 6 5 6 6 3 6 0 165.0 0.733333333333 67.0 0.791044776119 0.157024793388 0.179797979798 0.0387411303114 0.114264407157 0.0344302529426 0.0105838848328 0.0093781446472 0.00106265488917 0.0740602819675 0.363636363636 0.2 1.0 2.0 1.0 0.0 2.0 1.0 0.0 0.0 0.0 4.0 0.291666666667 0.0 7.0 1.0 0.406060606061 0.5 0.166666666667 0.0 0.25 0.833333333333 0.833333333333 0.666666666667 0.833333333333 0.416666666667 0.666666666667 0.666666666667 0.833333333333 0.5 0.0833333333333 0.0 0.166666666667 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.25 0.25 0.0 0.0 0.75 1.0 1.0 0.75 0.75 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -8.31849835894 3.05577490736 -15.3689103806 9.09480404118 6.03006248387 2.53063433069 -1.11095544205 17.6149576069 -3.24498983098 -0.435303309438 -5.58207970266 16.1728725925 1.88633177851 -0.356105075812 -1.74966597405 13.4052735034 -0.411013654681 0.468525748034 1.28357979465 15.743784311 0.231910135301 -0.187553114106 0.739836003498 13.5064853689 0.0110195017977 -0.223371390466 1 13 3 15 5 13 4 13 4 8 2 4 3 6 5 3 3 6 5 2 4 4 7 2 3 5 8 1 4 4 7 1 5 4 6 1 6 6 3 1 6 7 11 5 12 5 12 5 13 4 13 3 13 4 11 8 9 2 14 0 357.0 0.809523809524 155.0 0.6 0.176964903609 0.154195011338 0.0518087610724 0.0816700162792 0.0255889470634 0.0161151503857 0.00387751906583 0.000254578810163 0.0330696095397 0.705882352941 0.380952380952 5.0 2.0 2.0 3.0 1.0 5.0 2.0 0.0 4.0 7.0 0.163265306122 2.0 2.0 2.0 0.434173669468 0.566666666667 0.433333333333 0.433333333333 0.4 1.0 0.733333333333 0.833333333333 0.633333333333 0.8 0.0666666666667 0.1 0.0333333333333 0.666666666667 0.333333333333 0.0666666666667 0.0 0.555555555556 0.0 0.0 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.0 0.888888888889 0.666666666667 0.666666666667 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.555555555556 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.555555555556 0.333333333333 0.777777777778 0.777777777778 0.666666666667 1.0 1.0 0.555555555556 0.111111111111 0.0 0.222222222222 0.111111111111 0.0 1.0 0.777777777778 0.111111111111 0.0 0.0 0.111111111111 0.0 0.0 0.888888888889 0.888888888889 0.444444444444 0.222222222222 0.222222222222 0.222222222222 0.0 0.0 0.333333333333 0.777777777778 0.888888888889 0.555555555556 0.222222222222 0.0 0.0 0.0 -14.2481568101 20.7356154428 -24.2660145401 53.3721518563 13.7635256261 4.76464633002 13.6307459978 69.5581128101 -4.67786897057 -2.36709891372 5.57165920873 59.8379112912 -0.941473156727 1.54361090119 -8.81386795971 62.350589856 1.06637997403 -0.226860548031 1.42113720928 62.8100178631 0.374679881931 -0.236837103466 2.68920402005 57.3587845452 -0.304772497087 -0.148049910309 2 2 5 3 3 5 2 5 37 4 3 4 3 5 3 4 3 3 4 3 4 3 4 3 4 3 5 3 3 4 1 11 1 2 154.0 0.318181818182 67.0 0.791044776119 0.187384044527 0.244391971665 0.0198616529364 0.370558097662 0.0613477010424 0.00266688395506 0.0267988483539 0.0062825263208 0.604535605964 1.14285714286 195225786.0 0.0 2.0 1.0 2.0 4294967295.0 4294967292.0 0.0 0.0 0.0 3.0 0.210526315789 2.0 5.0 1.0 0.435064935065 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.5 0.333333333333 0.666666666667 0.5 0.666666666667 0.333333333333 1.0 0.916666666667 0.583333333333 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.64609505992 -4.65889924324 -6.17778380825 -7.19073060608 2.86012553254 5.87599810744 -2.48145741429 11.6457876958 -3.40542374395 -0.0476159875551 -7.57772040602 16.2411181792 3.79668273614 -0.544815443901 3.38595880302 12.8008975441 -2.41385591327 0.696286621184 -0.973020270799 15.1580765579 1.52769610973 -0.730001327167 1.99888390505 9.80814199365 -0.229844679769 -0.10721681328 8 1 11 2 5 9 2 4 2 4 2 3 4 2 2 4 8 4 8 3 8 4 9 3 9 4 8 4 9 4 3 3 3 9 4 1 2 1 4 0 180.0 0.8 69.0 0.898550724638 0.159259259259 0.185555555556 0.054524005487 0.107733024691 0.0437818930041 0.0204402696627 0.0162775626644 0.00936123502635 0.0607974933359 0.666666666667 0.266666666667 0.0 2.0 3.0 3.0 0.0 2.0 0.0 1.0 3.0 11.0 0.166666666667 0.0 2.0 1.0 0.383333333333 0.0833333333333 0.5 0.75 0.583333333333 0.416666666667 1.0 0.75 0.916666666667 0.416666666667 0.416666666667 0.0833333333333 0.333333333333 0.5 0.0833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.0 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 -8.99755944946 3.64995336157 -17.2877065662 10.9346643488 6.72723187014 3.32853111206 6.25787088046 23.5488635707 2.04259899336 0.655511922584 20.8942082304 26.9048778827 -1.37665822008 -0.876926376831 15.4186064948 21.5029338101 0.856389807509 0.309396161288 18.0125661562 24.2903252528 -0.240164390546 1.25803800268 18.1041998919 37.3645156492 0.0722232823764 0.193555956905 2 3 12 5 10 6 11 5 12 4 12 4 12 4 12 4 12 3 13 4 5 1 6 5 3 3 5 4 5 2 5 4 5 3 4 3 6 3 4 3 6 3 4 4 5 3 4 4 5 4 3 4 6 2 4 3 6 4 3 3 6 4 1 7 3 5 1 7 3 6 1 5 4 6 368.0 0.695652173913 147.0 0.632653061224 0.154891304348 0.228024574669 0.0463420522725 0.16087243864 0.0657191969056 0.0169150423506 0.0243135866252 0.0193821538989 0.130519349681 0.375 0.608695652174 2.0 3.0 0.0 1.0 0.0 1.0 5.0 5.0 3.0 5.0 0.0975609756098 1.0 0.0 2.0 0.399456521739 0.666666666667 0.5 0.5 0.583333333333 0.708333333333 0.75 0.708333333333 0.708333333333 0.0 0.0416666666667 0.0416666666667 0.0416666666667 0.0 0.166666666667 0.541666666667 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 0.666666666667 0.833333333333 0.333333333333 0.5 0.5 0.333333333333 0.5 0.666666666667 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -12.815432809 -13.2859778581 -27.9310261483 -31.3096018979 4.9398073551 1.25325197565 -9.50823855932 -26.8328563543 2.25993919895 1.95436681593 -2.01682434901 -15.1445616768 -5.47154472737 -0.806078206671 -23.1661588763 -14.8132463773 4.28644913181 0.85391782047 -4.39419911754 -12.9298313727 -0.907477827009 -1.05641388344 -3.97082194998 -18.2106249425 -0.336613272022 0.188730462517 10 1 5 1 1 1 5 4 2 5 1 7 3 5 5 2 4 3 6 3 3 3 6 3 3 3 6 3 2 4 6 3 3 3 6 3 2 4 6 3 2 4 6 3 2 4 5 5 1 4 5 12 2 2 2 2 210.0 1.07142857143 100.0 0.74 0.219682539683 0.245238095238 0.104800345535 0.0984482237339 0.0599123204837 0.0385796630331 0.010752681374 0.0156950271312 0.00836944882292 0.466666666667 1.07142857143 3.0 1.0 1.0 0.0 3.0 3.0 3.0 3.0 3.0 8.0 0.181818181818 1.0 2.0 2.0 0.47619047619 0.5625 0.5625 0.625 0.75 0.4375 0.5625 0.5 0.5 0.3125 0.0 0.0 0.0 0.6875 0.5 0.5 0.625 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.25 0.25 0.75 1.0 0.75 0.5 0.5 0.75 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -3.81971863421 0.933708999472 -13.2270984348 2.20447633592 -5.82521238822 -0.268229130758 -32.1757086873 -0.305145460649 1.1298822034 -1.76187849192 -28.9678353456 -11.0176128584 0.821094327937 -1.43095698816 -23.6182377898 -22.3901472243 -1.68773443835 -0.441318688255 -35.6438882274 -28.9558064114 -0.778970087697 -0.821065377736 -49.0421625506 -39.2033691252 -0.389878762509 -0.354076800514 1 4 6 8 4 1 4 5 3 5 4 2 4 5 4 2 3 7 4 1 3 7 8 7 4 1 3 7 4 1 3 7 3 2 3 7 3 3 2 6 2 5 4 3 3 6 9 6 8 9 2 8 0 225.0 1.0 100.0 0.74 0.21037037037 0.197037037037 0.0911319615912 0.083309739369 0.0496109739369 0.031659141391 0.00988854788396 0.00922853142306 0.00956190369354 0.466666666667 0.733333333333 0.0 2.0 3.0 0.0 2.0 3.0 3.0 1.0 3.0 12.0 0.153846153846 0.0 2.0 2.0 0.444444444444 0.375 0.8125 0.8125 0.5 0.6875 0.3125 0.25 0.5625 0.4375 0.0 0.0 0.3125 0.625 0.5625 0.5 0.625 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.63136172579 1.86741799894 -10.8864688359 9.57077081854 -6.3356399746 7.68697154475 -29.410520933 36.8214835961 2.970624 0.831992354888 -16.7849452747 42.9963498844 1.87738806889 -2.09901885393 -2.51741793798 28.9567259272 -1.33319008182 -0.0757952803612 -6.76841455069 22.5926382237 1.24703344992 -0.769967682931 2.13224131968 12.0192491981 0.181363057028 -0.53011758393 9 4 10 6 9 6 10 5 10 5 10 5 11 4 11 4 11 4 5 3 1 5 5 3 1 6 4 2 5 4 3 3 6 3 3 3 6 4 1 4 6 3 2 4 6 3 2 4 6 3 2 4 6 4 2 3 6 4 3 4 4 4 4 12 4 3 2 5 1 0 330.0 0.681818181818 143.0 0.622377622378 0.241616161616 0.232782369146 0.0736584578568 0.156814981774 0.0629112057211 0.0167367825682 0.0153436513102 0.00906182837097 0.0771086286068 0.666666666667 0.545454545455 0.0 2.0 5.0 2.0 0.0 1.0 5.0 4.0 4.0 8.0 0.25 0.0 2.0 2.0 0.433333333333 0.0 0.0416666666667 0.708333333333 0.75 0.0 0.25 0.333333333333 0.458333333333 0.333333333333 0.291666666667 0.166666666667 0.166666666667 1.0 0.875 0.833333333333 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.5 0.333333333333 0.0 0.0 1.9098593171 -6.51088403558 1.58275649066 -16.6310250381 -2.93115335839 -0.105644922781 1.42438624539 -8.8746109948 6.96009693788 7.57589896778 23.5865355482 26.2263303478 -3.69710247759 -0.134832334965 16.5124647428 39.7148826209 1.7972286768 1.16635386395 16.5875105419 37.8178251812 -1.25679962914 -2.51147273082 10.1269612123 23.3664462054 -0.228161915125 0.33726906873 6 2 13 9 5 10 4 3 3 4 5 2 4 3 5 2 5 2 5 3 4 3 4 3 5 2 5 3 5 2 4 3 5 3 1 1 2 3 3 6 3 7 1 4 4 4 3 3 4 0 195.0 1.15384615385 87.0 0.804597701149 0.208547008547 0.220512820513 0.0969834285811 0.086167872014 0.0431908831909 0.030505658295 0.00604614278716 0.00497941785831 0.00432568618846 0.6 0.846153846154 0.0 3.0 3.0 2.0 0.0 3.0 3.0 4.0 3.0 14.0 0.243902439024 1.0 2.0 2.0 0.446153846154 0.0 0.1875 0.6875 0.8125 0.4375 0.5625 0.25 0.4375 0.6875 0.125 0.3125 0.6875 0.6875 0.6875 0.625 0.6875 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.5 0.0 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.41389708842 5.00807554262 -13.7189098558 13.826029907 -3.68956525852 1.96248655162 -21.1318481238 16.3911256541 4.22449772845 -4.05333241629 -7.65157020611 -1.14282571871 -2.21764682101 0.676611328738 -11.4180782073 -0.879274893481 0.85133752861 1.27681254071 -11.04943964 9.91697027158 0.163214279987 -0.402894096062 -3.28661853099 7.91209477245 0.30670630901 -0.14179852901 8 1 10 7 7 10 4 3 4 4 3 3 6 4 2 3 6 5 1 3 7 8 6 9 6 9 5 6 1 3 5 5 2 3 5 5 3 4 3 4 5 9 10 1 7 0 225.0 1.0 109.0 0.688073394495 0.240592592593 0.230518518519 0.102352241427 0.0878587434842 0.0583364828532 0.0299367036261 0.00818982513804 0.0111793986266 -0.00430463764589 0.466666666667 0.666666666667 0.0 2.0 3.0 0.0 0.0 3.0 3.0 2.0 3.0 6.0 0.444444444444 0.0 2.0 2.0 0.484444444444 0.1875 0.6875 0.9375 0.75 0.5625 0.3125 0.25 0.375 0.625 0.0625 0.0625 0.25 0.625 0.75 0.75 1.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.254647908947 4.83831026999 -7.347642023 15.9245152247 -11.3425837487 6.29036923523 -42.7663325859 37.4552637576 2.04802309861 -0.326225977971 -40.7063093976 37.5547857386 1.30675468404 -1.77354988469 -25.3569226118 20.4162623133 0.602949861091 -1.86023765072 -16.5109616631 3.98636795799 1.32970372403 0.205969094306 -0.244751998964 2.28746294075 0.405907473907 0.00537545199282 6 5 5 10 1 4 3 5 1 3 4 9 3 10 3 9 11 3 7 1 2 3 7 1 1 4 6 2 2 3 6 3 1 4 4 4 2 10 3 2 1 7 6 5 3 0 195.0 0.866666666667 107.0 0.616822429907 0.265483234714 0.249230769231 0.0914210961075 0.114599908967 0.0514139483134 0.0218906482336 0.00993628377872 0.00463858353004 0.0103046338644 0.923076923077 0.666666666667 1.0 3.0 4.0 3.0 1.0 3.0 3.0 2.0 3.0 11.0 0.222222222222 1.0 3.0 1.0 0.548717948718 0.4375 0.875 0.8125 0.75 0.5 0.1875 0.1875 0.5 0.75 0.5 0.0 0.3125 0.875 0.75 0.25 0.75 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.5 1.0 0.75 0.5 0.5 0.25 0.25 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.5 0.25 0.0 0.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -5.09295817894 1.86741799894 -14.6381090013 8.10562717243 -3.28665567814 5.90783148757 -24.4281483904 32.2223207855 1.93768824661 3.33777807975 -15.0280967014 49.1935978543 1.026986284 -1.91677428282 -6.43781932217 36.8079125923 -0.574482293427 -1.75715460034 -7.02377598065 17.5447482525 0.923799200671 -0.941157240639 0.350944756873 0.857738633277 0.0889489662061 -0.605642804137 1 2 2 3 3 1 5 1 5 1 10 2 4 7 4 7 4 7 4 7 3 8 3 8 3 8 3 8 4 6 6 6 3 6 0 154.0 0.785714285714 66.0 0.636363636364 0.159386068477 0.166512059369 0.0415172616218 0.0967326020244 0.0257878400904 0.0122021587975 0.00685734874396 -0.00133316517894 0.0535311020037 0.272727272727 0.142857142857 1.0 0.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 6.0 0.125 0.0 1.0 1.0 0.428571428571 0.583333333333 0.333333333333 0.333333333333 0.416666666667 0.916666666667 1.0 1.0 1.0 0.583333333333 0.666666666667 0.416666666667 0.583333333333 0.666666666667 0.0 0.0 0.0833333333333 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 0.75 0.5 0.5 0.5 0.25 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -9.91307931258 4.91106681541 -19.0748194179 12.7887624972 6.65063498349 1.61474985994 -0.614409844925 19.819833176 -1.81380480617 0.470874013521 -2.38973564018 19.9431762202 -0.766584534275 -1.26310677427 -9.64392291675 12.741623506 0.716963956699 0.267147409951 -5.05039012957 12.627268567 -0.0598643323041 0.224784446625 -3.02017759633 13.272458372 0.0868881503625 -0.285921112633 2 2 11 5 2 5 3 8 1 4 2 6 4 4 2 4 6 3 3 2 8 2 3 3 7 3 2 3 7 2 2 4 6 4 1 4 6 3 3 3 6 3 3 2 7 2 3 4 6 3 2 4 7 3 210.0 1.07142857143 95.0 0.757894736842 0.197777777778 0.200340136054 0.0980219198791 0.0798865133355 0.0528715041572 0.0411305431125 0.0120349112577 0.0173196386195 0.0107660138206 0.533333333333 0.928571428571 2.0 2.0 0.0 2.0 2.0 3.0 3.0 3.0 4.0 8.0 0.210526315789 0.0 1.0 2.0 0.452380952381 0.875 0.6875 0.625 0.625 0.625 0.5 0.5 0.4375 0.375 0.0 0.0 0.0 0.625 0.4375 0.375 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.25 0.75 1.0 0.75 0.25 0.25 0.5 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -3.31042281631 5.77201926947 -11.2610541503 14.3538739641 -4.94469650751 0.278415047115 -28.7645986076 12.6931610111 -0.271448383335 -3.36690225541 -31.7240199685 -6.61907666813 0.752380201391 -1.55250445218 -27.5946751428 -19.2664384551 -1.11938306778 0.698436478126 -36.8050975853 -15.5016837474 -1.47278314574 0.156275552721 -54.9211981507 -12.8878528756 -0.390360843634 -0.102066731757 4 7 5 9 4 3 2 5 2 3 4 4 1 4 5 2 2 3 10 3 9 5 8 4 10 4 9 4 6 1 2 5 5 1 3 10 5 7 2 0 182.0 0.928571428571 84.0 0.702380952381 0.192307692308 0.209183673469 0.0702058930081 0.105544965239 0.0398049752445 0.0235506213276 0.0130639645511 0.00535026332381 0.0371825307255 0.692307692308 0.357142857143 0.0 3.0 3.0 3.0 1.0 2.0 0.0 2.0 2.0 9.0 0.21875 1.0 2.0 1.0 0.461538461538 0.25 0.6875 0.875 0.6875 0.75 0.375 0.375 0.6875 0.6875 0.0625 0.0 0.25 0.8125 0.375 0.0 0.3125 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -11.2772645391 1.18229386297 -26.6400803846 5.97505872401 0.811086998614 5.0535174496 -24.732530613 26.250791597 0.800007610061 2.73856443743 -18.891788173 41.5862082678 -0.787946430757 -0.766883332804 -21.2245921413 36.9092104845 0.434333348164 -1.07385256592 -19.7189217694 24.7206321052 -0.401263927109 -0.913422428014 -24.8353522685 10.9603537462 -0.375418750385 -0.439582215697 1 6 1 1 1 1 1 8 6 5 4 1 5 4 3 5 4 2 2 6 4 1 3 7 3 1 3 7 7 7 7 7 7 6 3 2 3 7 2 3 3 5 2 5 4 1 3 7 6 4 0 196.0 1.0 87.0 0.747126436782 0.212827988338 0.207725947522 0.0962077875715 0.088357635849 0.0505943526932 0.0347070461384 0.00985880115996 0.0109194839138 0.0114279410171 0.571428571429 0.928571428571 0.0 2.0 3.0 2.0 3.0 3.0 3.0 3.0 5.0 12.0 0.175 0.0 2.0 2.0 0.44387755102 0.25 0.625 0.9375 0.625 0.5 0.3125 0.25 0.5 0.5625 0.0 0.0 0.1875 0.5625 0.625 0.5625 0.5625 0.0 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.41046306625 3.77424579332 -12.600949408 12.1811391361 -6.61908240002 4.90039461806 -35.9837883394 31.4199681123 -0.354966564039 1.87032389214 -39.060794992 41.6010127633 1.78320154638 -1.03031448114 -27.8498578401 34.1373883416 -0.710169998287 -0.941585201635 -29.8382368412 25.1353224717 -0.224668869095 0.441187244033 -32.4732514062 28.6197615212 0.0907588792746 0.203645668274 7 7 17 8 15 3 4 4 14 2 5 4 13 3 5 4 13 2 6 4 12 4 5 4 12 3 6 4 12 4 5 4 3 3 4 5 6 11 3 5 6 5 2 5 2 5 6 5 3 4 4 3 7 3 5 3 4 3 7 2 7 2 3 4 7 2 6 3 3 4 7 2 6 3 4 3 7 2 7 3 3 3 6 3 6 4 2 5 5 4 5 4 2 5 4 5 5 4 2 5 3 7 3 6 525.0 1.19047619048 209.0 0.66985645933 0.175695238095 0.21306122449 0.0916069642587 0.0846762915452 0.0611457492711 0.0382062657936 0.0158746817357 0.0220657999383 0.0152930153349 0.52 1.47619047619 5.0 3.0 2.0 3.0 3.0 6.0 10.0 10.0 2.0 11.0 0.132352941176 0.0 1.0 3.0 0.398095238095 0.261904761905 0.547619047619 0.571428571429 0.595238095238 0.52380952381 0.285714285714 0.190476190476 0.309523809524 0.380952380952 0.595238095238 0.428571428571 0.380952380952 0.0 0.285714285714 0.47619047619 0.571428571429 0.0 0.0833333333333 0.333333333333 0.5 0.833333333333 0.833333333333 0.583333333333 0.666666666667 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.583333333333 0.5 0.5 0.5 0.666666666667 0.0833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.5 0.5 0.5 0.416666666667 0.25 0.25 0.583333333333 0.75 0.75 0.75 0.916666666667 0.916666666667 0.583333333333 0.5 0.0 0.0 0.0 0.0833333333333 0.583333333333 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.916666666667 0.75 0.416666666667 0.416666666667 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.583333333333 -14.0565645739 2.34276076231 -43.2935322941 3.17662948505 -14.0673209016 -2.48536359132 -91.9498389594 2.21586297337 1.54101799623 5.08537399008 -82.3252131889 16.2925081971 6.44062280286 -4.07351631712 -37.133985845 -0.822621994495 -0.231785372617 -0.595953435173 -27.6275942697 -15.3558002328 -0.358688062255 -0.0101157635134 -30.0602386636 -11.5197992967 0.38079510391 0.327363591641 3 1 4 4 3 5 1 21 2 5 2 5 2 4 2 4 2 4 3 1 6 0 84.0 0.583333333333 54.0 0.462962962963 0.27380952381 0.279761904762 0.0476780990174 0.135102850664 0.0387613378685 0.00601758065095 -0.00544344480067 0.000467396224177 0.0622480884352 0.285714285714 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.111111111111 0.0 3.0 1.0 0.642857142857 0.333333333333 0.833333333333 0.666666666667 0.0 0.666666666667 1.0 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -4.98685488355 6.52535266677 -11.0769171382 14.9730502239 1.461130797 -1.12403178559 -6.0233594656 11.6223936822 0.839789981035 -0.536334351532 -0.200916610788 7.24885145201 -0.273012881667 0.348070367697 -0.592135136965 7.80294579115 0.170847293079 -0.418235960575 0.053567216153 5.07554886688 0.00711303014382 -0.135387608585 0.565041554287 1.96600283864 -0.00489209264196 -0.120135517321 3 1 6 2 6 2 5 4 4 4 3 8 1 4 4 4 4 3 5 3 5 3 5 3 5 3 5 3 5 4 4 7 2 4 2 0 136.0 0.470588235294 62.0 0.709677419355 0.155330882353 0.233564013841 0.021247439828 0.212255750051 0.0457380292082 0.0040750455571 0.0161435033277 0.00513795503911 0.255156664063 0.5 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 6.0 0.259259259259 0.0 3.0 1.0 0.455882352941 0.2 0.6 0.5 0.4 0.6 1.0 1.0 0.9 0.9 1.0 1.0 1.0 0.7 0.9 0.5 0.8 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 -8.12626415316 0.674067994272 -13.8530141667 0.719548389275 7.4153958301 -0.803128302287 3.91017149854 1.93209447688 -4.20630008898 3.31951645572 -3.81678694681 17.029730185 1.9405942909 0.301308210098 -1.74673591711 21.4215410969 -0.737805504478 -1.04555607964 -2.5005411097 12.8686023223 -0.401647387258 -0.0373401263955 -7.44180450978 10.5868032844 0.17596876171 0.0347379079944 0 4 5 3 3 3 5 3 3 3 5 3 3 3 5 4 2 3 5 4 2 3 5 4 2 3 5 4 2 3 5 3 3 3 5 4 2 3 5 4 2 13 2 6 2 4 5 2 7 0 182.0 1.07692307692 92.0 0.652173913043 0.238226059655 0.240490278952 0.107250179479 0.0893640081691 0.0599955080543 0.0328779408138 0.00966198523074 0.0109502932195 -0.00724709735317 0.0714285714286 0.846153846154 0.0 0.0 0.0 1.0 3.0 3.0 3.0 2.0 1.0 6.0 0.151515151515 0.0 2.0 2.0 0.505494505495 0.8125 0.75 0.75 0.5 0.25 0.25 0.25 0.6875 0.25 0.25 0.25 0.5 0.8125 1.0 0.9375 0.6875 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.68249511269 -0.545674090601 -9.63964930408 1.00676053285 -7.59094837175 3.41046306625 -30.9664033335 12.21443227 3.49394436509 -0.201275558721 -21.023817163 12.7061326673 -0.224831138625 -0.832445428559 -15.2564626297 7.3890329152 -0.0631182311581 0.466621995165 -14.8238979379 8.86315793491 1.16583867306 -0.0956885139674 -1.65522007306 10.2801241268 0.351148371634 0.149709365303 1 5 10 6 10 6 12 3 13 4 12 3 13 3 13 3 13 3 3 1 10 3 2 3 7 5 4 2 6 3 5 2 5 3 6 2 6 2 6 2 6 2 6 2 5 2 7 2 5 3 6 2 5 3 5 4 4 3 6 4 3 3 5 5 1 7 2 6 1 6 3 10 1 1 5 1 2 2 1 0 368.0 0.695652173913 132.0 0.787878787879 0.135360054348 0.200850661626 0.0411514102888 0.15141141253 0.0604856341693 0.0153840750915 0.0261677428335 0.0192211924517 0.127570322481 0.75 0.739130434783 5.0 4.0 3.0 0.0 0.0 2.0 5.0 5.0 3.0 4.0 0.255319148936 1.0 0.0 2.0 0.358695652174 0.708333333333 0.458333333333 0.375 0.583333333333 0.666666666667 0.625 0.583333333333 0.541666666667 0.0 0.166666666667 0.0416666666667 0.0833333333333 0.0 0.166666666667 0.5 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.5 0.333333333333 0.333333333333 0.166666666667 0.333333333333 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.833333333333 0.833333333333 0.5 0.333333333333 0.5 0.333333333333 0.166666666667 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 -10.6287822865 -11.9573800723 -23.3862698396 -27.9373824345 3.79115001452 2.02177923928 -8.97323543177 -17.3681210251 2.05569197538 4.51284370888 -1.44968955281 3.74710211949 -3.95321533945 -2.51699002671 -14.1352214088 -3.99719065874 3.9605535891 0.430930949804 3.83193403282 -7.58043597209 -1.23945174191 -0.346548122808 2.89927626073 -7.55235151677 -0.0145375091571 0.179134575662 3 1 3 4 2 4 2 4 28 1 3 4 1 5 2 4 3 3 3 3 2 4 2 4 2 4 2 4 2 4 2 11 3 2 1 0 132.0 0.272727272727 66.0 0.772727272727 0.215909090909 0.280303030303 0.0183354724935 0.435854759718 0.0623565197429 0.00182041489251 0.0191320060615 0.00397534564072 0.810221714081 1.0 195225786.0 1.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 2.0 2.0 0.4 1.0 5.0 1.0 0.5 0.25 0.25 0.416666666667 0.583333333333 0.5 0.333333333333 0.833333333333 1.0 0.583333333333 0.416666666667 1.0 1.0 0.583333333333 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.44353422326 -3.84865589659 -5.4434796684 -3.49608712938 3.30590286376 8.52489358216 0.179170446685 24.7114041757 -3.22208738082 0.121801939764 -5.15222191747 30.2180632762 2.9835681639 -1.6733388505 1.59180042319 19.1162372154 -2.23337264101 0.447890409576 -3.77678293434 16.3142168059 1.19748217725 -1.14043448487 -2.93626508279 8.27781203591 -0.20893027222 0.0241694441502 3 5 4 8 2 10 1 4 3 3 2 4 2 3 3 5 6 7 7 5 8 3 2 1 6 3 1 2 4 4 1 2 3 4 3 7 5 4 4 0 154.0 0.785714285714 84.0 0.72619047619 0.25678866588 0.232374768089 0.0690785222536 0.115581184712 0.0557782788977 0.0124411081917 0.0106361750554 0.00625796402743 0.0250798626135 1.18181818182 0.357142857143 1.0 2.0 4.0 2.0 0.0 2.0 1.0 2.0 3.0 13.0 0.151515151515 1.0 3.0 2.0 0.545454545455 0.666666666667 0.583333333333 0.166666666667 0.5 0.833333333333 0.916666666667 0.25 0.416666666667 0.75 0.583333333333 0.416666666667 0.333333333333 0.833333333333 0.666666666667 0.75 0.75 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 0.75 0.75 1.0 1.0 0.5 0.0 1.0 1.0 0.5 0.25 0.75 1.0 0.75 0.25 1.0 1.0 0.5 0.0 0.5 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 0.5 0.5 1.0 1.0 -3.18309886184 5.13843101982 -10.1942938287 13.4573209359 -3.14273011534 2.31053072632 -17.064673936 26.039219101 3.43878179401 2.8349906287 -3.38986809323 34.9475363829 -0.164881576686 -2.58808695363 1.38394166491 24.2442183041 -0.19582308778 0.496496501091 -2.71146263067 17.8321133059 -0.476994688076 -1.40365938515 -6.61570966134 7.63741663271 0.0334042403747 -0.150384863348 1 7 3 7 9 4 3 4 4 2 3 6 4 1 2 8 6 8 3 1 2 9 5 9 5 9 5 8 2 1 4 6 3 3 3 4 4 4 8 3 0 182.0 1.07692307692 78.0 0.794871794872 0.204081632653 0.203296703297 0.107725084962 0.0866980350889 0.0511627305191 0.0440349981219 0.0120306026945 0.0149662327004 0.011709386863 0.714285714286 0.769230769231 1.0 3.0 3.0 2.0 1.0 3.0 3.0 3.0 4.0 9.0 0.138888888889 0.0 2.0 2.0 0.428571428571 0.375 0.625 0.6875 0.625 0.4375 0.0625 0.0 0.4375 0.5 0.0 0.0 0.3125 0.6875 0.5 0.3125 0.6875 0.0 0.0 0.25 0.5 0.75 0.75 0.75 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0454728408834 3.0012074983 -3.92844185173 10.0982260282 -6.4462392038 4.57280456026 -28.8896742538 28.094322544 -2.67012080442 1.78655140424 -42.4495663332 37.1866929319 2.73634319081 -1.4876743293 -24.4305147371 26.5090746684 1.51599922616 -1.20594814685 -8.69211584443 15.4523615407 -0.490742109955 0.772923140223 -8.4828312728 23.4442033943 0.256209399786 0.477779013372 6 4 8 9 5 3 4 4 3 3 6 3 3 2 8 2 2 4 7 3 1 4 7 8 7 3 1 3 8 3 1 4 7 3 2 3 6 4 3 4 3 3 6 4 1 4 9 3 6 0 210.0 1.07142857143 90.0 0.822222222222 0.191428571429 0.197959183673 0.0919620991254 0.0794791059281 0.0497466796242 0.0346092470517 0.0114806726677 0.0134130887146 0.0108023384464 0.6 0.785714285714 0.0 4.0 3.0 0.0 1.0 3.0 3.0 3.0 2.0 10.0 0.277777777778 0.0 2.0 3.0 0.428571428571 0.375 0.8125 0.9375 0.625 0.5 0.1875 0.1875 0.5625 0.5625 0.0 0.0 0.25 0.6875 0.5625 0.5 0.6875 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.75 1.0 1.0 0.75 0.5 1.0 0.75 0.25 0.25 0.5 0.5 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.90460127052 3.5226294071 -16.3211027716 12.598826906 -10.2243964863 6.31130695219 -50.8966808031 35.6823175172 0.501482423618 1.00463734955 -52.1314737651 41.6981757981 1.96588763235 -1.7466408268 -40.3250888923 30.4994181397 -2.17684766103 0.232586257318 -52.982887749 30.8638465513 -0.440756142216 1.33756444627 -61.8431121729 46.8253334028 -0.0739827383153 0.509969318728 6 2 9 7 4 4 1 4 3 4 2 5 2 24 1 8 5 4 9 4 9 4 9 4 6 1 3 4 5 2 3 10 5 6 3 0 182.0 0.928571428571 97.0 0.59793814433 0.213863060017 0.241758241758 0.0700763431714 0.0987524732242 0.0404354732334 0.0184448525957 0.00705028109019 0.00475887844698 0.022513041941 0.769230769231 0.285714285714 0.0 3.0 4.0 3.0 1.0 1.0 0.0 2.0 2.0 7.0 0.259259259259 0.0 3.0 2.0 0.532967032967 0.3125 0.875 1.0 0.8125 0.5625 0.875 0.4375 0.5 0.75 0.8125 0.125 0.25 0.4375 0.625 0.0 0.375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.75 0.75 0.25 0.5 1.0 1.0 0.5 0.0 1.0 0.75 0.5 0.75 1.0 1.0 0.5 0.0 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 -10.8225361302 6.68450760986 -26.5177751134 14.5260938247 -0.776286355081 -1.43726657792 -30.8195470249 16.4340096776 0.110703924687 4.65650365905 -28.1584629134 33.7785968835 -0.0550830098482 -1.0207541542 -27.9073298083 29.7887095836 -0.20844639124 -2.23029243052 -28.8743991868 9.23438285013 -0.0583240242719 -0.196328390812 -30.359662974 2.22633703206 -0.115523826346 -0.139869388157 4 7 4 3 3 3 2 4 3 3 1 4 6 1 1 3 8 4 8 4 8 4 9 3 9 4 8 5 8 6 1 2 4 8 1 0 156.0 0.923076923077 68.0 0.676470588235 0.165064102564 0.203648915187 0.0605252427553 0.107232452924 0.0380071625449 0.0231874546622 0.0153928603145 0.00543795377194 0.0509008699659 0.583333333333 0.307692307692 0.0 2.0 3.0 2.0 2.0 1.0 0.0 1.0 2.0 7.0 0.185185185185 1.0 3.0 1.0 0.435897435897 0.25 0.833333333333 0.833333333333 0.416666666667 0.75 0.75 0.75 0.916666666667 0.666666666667 0.0833333333333 0.0833333333333 0.75 0.25 0.0 0.0 0.416666666667 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -11.9978341715 -2.05677157226 -28.2086843212 -2.47739725303 1.19123526819 4.0283514226 -24.1460479723 13.6509989998 1.63020770807 2.65413209943 -14.5279840016 29.6054999446 -1.22610554788 0.0722525428248 -19.6685132317 32.9885988363 -0.155260024616 0.499481829517 -22.9628089907 37.2930457901 -0.14989000887 0.81627942291 -26.3776448289 46.8069952725 -0.285533919467 0.27177643064 3 2 6 3 5 5 1 18 3 4 5 5 4 5 4 4 5 4 5 4 5 5 4 5 5 7 2 7 3 5 1 0 144.0 0.5625 83.0 0.493975903614 0.229938271605 0.279513888889 0.0376787015604 0.185854981139 0.0534470378944 0.00620973099903 0.0132235086274 0.0038089745414 0.155297891254 0.555555555556 0.0625 0.0 0.0 2.0 2.0 1.0 0.0 0.0 0.0 2.0 7.0 0.307692307692 0.0 3.0 1.0 0.576388888889 0.5 0.833333333333 0.666666666667 0.666666666667 0.916666666667 1.0 1.0 1.0 0.583333333333 0.75 0.5 0.5 0.416666666667 0.333333333333 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.75 1.0 0.75 0.0 0.25 0.75 1.0 0.5 0.25 0.5 0.25 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -8.8330993416 2.9443664472 -15.2246405409 8.77472580639 7.80822854595 2.65247876837 3.04248817807 18.8928123691 -4.88714424046 0.413597399949 -8.12274542277 19.8685062659 1.54642938625 -1.40440804858 -7.33690871353 10.8826699688 0.500608666738 -0.325201561175 2.40880152272 3.14423022697 0.146233387676 -0.943785070295 1.44146158818 -4.84737432521 -0.137136899363 -0.00267933525117 2 2 9 2 7 22 1 6 2 1 3 4 6 5 7 4 7 4 7 4 7 4 7 4 7 5 6 5 4 0 154.0 0.785714285714 72.0 0.555555555556 0.170602125148 0.204081632653 0.0415186306357 0.105618870925 0.036443148688 0.0107973337294 0.00734390049696 0.00101684456067 0.0576836697414 0.181818181818 0.0714285714286 1.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 5.0 0.0 0.0 0.0 1.0 1.0 0.467532467532 0.666666666667 0.666666666667 0.416666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 0.5 0.833333333333 0.666666666667 0.75 0.5 0.333333333333 0.0 0.0833333333333 0.0 0.5 1.0 0.75 0.25 0.25 0.25 0.0 0.5 0.75 1.0 1.0 0.75 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -10.1859163579 5.13843101982 -19.3445035536 12.3547172994 6.95270456936 -0.131082423975 -1.36014627496 11.6280126404 -2.70284051152 -1.00433000063 -4.59875139558 5.56160493408 0.399556706384 -0.00725482657601 -8.29530542231 4.18357290119 -0.030126530801 0.121811194356 -4.65992271722 5.23833090505 0.477835712471 0.0241876029402 -2.50456959303 5.33845018848 -0.0746264568233 -0.0482311984203 2 2 5 4 4 5 3 7 1 7 2 6 2 6 3 4 4 4 2 4 3 3 5 0 88.0 0.727272727273 52.0 0.557692307692 0.268465909091 0.263429752066 0.0590237016341 0.116487544609 0.0484671417168 0.00894962525859 -0.00190825894185 0.00201046240385 0.0242484468383 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.117647058824 0.0 4.0 1.0 0.590909090909 0.333333333333 0.5 0.166666666667 0.0 0.833333333333 1.0 0.666666666667 0.166666666667 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.5303460104 4.51421293133 -8.85374016085 9.95765854071 -0.459648085083 -1.44351500601 -10.2590795308 4.94274876877 0.651514329385 -0.690723222979 -6.46919301774 0.835882353586 0.141240960631 0.852854517885 -4.75717973887 4.83719052938 -0.173626510142 -0.277091198106 -5.8390482909 2.93614420529 0.00217355885902 -0.661614676026 -5.62946080935 -4.26424159023 0.0789135178227 -0.0853654625648 1 8 4 5 7 4 8 3 6 2 1 3 3 8 4 8 4 8 4 8 4 6 7 5 8 5 7 6 4 8 4 8 4 8 4 8 4 8 4 8 4 8 4 7 6 7 5 5 0 264.0 0.545454545455 110.0 0.545454545455 0.156565656566 0.189566115702 0.028296045858 0.156814301329 0.028759965356 0.00679391448559 0.0088706551564 -0.00128387184403 0.143577408978 0.333333333333 0.0454545454545 1.0 0.0 3.0 0.0 1.0 0.0 0.0 0.0 1.0 4.0 0.148148148148 0.0 2.0 2.0 0.416666666667 0.0555555555556 0.555555555556 0.5 0.388888888889 0.444444444444 1.0 1.0 1.0 0.666666666667 0.777777777778 0.777777777778 0.722222222222 0.555555555556 0.166666666667 0.222222222222 0.0555555555556 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.833333333333 0.666666666667 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 -13.8320114178 5.61382890179 -22.2500159731 14.073464634 14.5080910934 1.30409001455 13.7785898401 21.8349039356 -7.64098087895 1.70876896218 -0.839399060299 26.8892309769 2.86874089126 -1.01643268734 0.223799473937 25.3957884348 -0.319850807263 0.852945559063 7.1725582221 23.1010203745 -0.0697016579815 -1.74825646005 2.50238066867 14.2244251196 -0.0301270325659 0.191253303607 1 4 1 7 2 6 3 5 4 4 6 3 14 5 4 6 3 6 3 5 4 5 4 5 4 5 4 5 4 5 6 4 5 2 0 153.0 0.529411764706 71.0 0.619718309859 0.152505446623 0.233756247597 0.0222036270615 0.184369064242 0.0417997435208 0.0038617248274 0.012281817687 0.00346766046154 0.198469764881 0.333333333333 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 2.0 0.166666666667 0.0 2.0 1.0 0.464052287582 0.4 0.8 0.533333333333 0.6 0.8 1.0 1.0 1.0 0.4 0.533333333333 0.333333333333 0.6 0.0 0.2 0.0 0.133333333333 0.0 0.5 1.0 0.5 0.166666666667 0.5 0.5 0.333333333333 0.166666666667 0.833333333333 1.0 0.833333333333 0.666666666667 1.0 1.0 0.833333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.833333333333 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 -10.7850879083 1.64772176377 -19.6720749056 3.41507309337 8.33760688647 -0.592951776583 1.61497543216 3.38553528834 -3.2947153764 1.6375312346 0.124334786801 11.5939719029 2.12925866305 0.794038759322 2.78748160758 15.9013167292 -1.26616584173 -1.38221612548 0.413468699796 5.84086664761 0.218946937068 -0.298453475259 -2.9599967312 0.411939449397 -0.0199029774186 0.021265084024 1 3 7 6 4 3 3 4 3 5 3 2 3 7 7 7 7 7 7 8 6 7 7 8 7 6 3 1 4 6 2 3 4 4 3 3 9 7 6 4 0 196.0 1.0 95.0 0.631578947368 0.21027696793 0.228862973761 0.0939812227473 0.0965180324525 0.0501677659819 0.0362068356856 0.00996779699272 0.0106770702524 0.0154764263081 0.642857142857 0.785714285714 0.0 2.0 3.0 3.0 2.0 3.0 3.0 2.0 2.0 10.0 0.189189189189 0.0 2.0 2.0 0.484693877551 0.5 0.9375 1.0 0.6875 0.625 0.25 0.3125 0.6875 0.3125 0.0 0.0 0.25 0.5625 0.4375 0.375 0.5625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.18350136127 -2.63742477124 -12.7759919017 -3.30371047587 -4.25031859686 5.04377326941 -29.3697014052 17.35391453 -1.45660816008 3.61936162308 -37.7813926923 37.3542326604 0.428365145815 -1.01628633835 -34.8348538437 32.5629591829 0.348390049256 -0.862593925019 -30.0491502941 24.9914388817 0.212174144939 0.913368485929 -27.3339560719 32.517776083 -0.0413308309565 0.200080521797 1 4 1 10 6 9 6 10 5 11 4 11 3 12 3 13 2 12 3 13 3 2 4 5 11 4 5 3 4 4 3 5 3 3 4 5 4 2 3 6 3 3 3 6 4 2 3 6 3 3 3 6 3 3 3 7 2 4 2 6 4 2 3 6 4 2 3 5 5 330.0 0.681818181818 125.0 0.688 0.164646464646 0.202066115702 0.05192100064 0.139554804241 0.0681446698389 0.0193237475461 0.0262803888862 0.0210778866276 0.0984950485206 0.6 0.545454545455 4.0 1.0 0.0 1.0 0.0 1.0 5.0 5.0 5.0 9.0 0.282608695652 0.0 1.0 2.0 0.378787878788 0.625 0.416666666667 0.458333333333 0.458333333333 0.625 0.625 0.75 0.5 0.0 0.25 0.208333333333 0.0 0.0 0.291666666667 0.625 0.458333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.666666666667 0.5 0.833333333333 1.0 0.833333333333 0.5 0.333333333333 0.5 0.166666666667 0.0 0.5 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 -7.11856654556 -6.45300951082 -15.5948509467 -15.4778497174 2.53440196757 0.859448650243 -6.36970080763 -8.99034328561 1.25262957699 3.05527293747 -0.736980289555 0.892160385551 -2.36115260718 -2.9602711705 -11.8626445276 -2.72335440954 0.842164148985 4.19983316466 -9.44170501704 16.3404854039 0.205972654531 -1.42223526434 -6.67342705756 19.7945482077 -0.15085572048 0.415175895183 1 17 2 12 5 1 6 8 3 1 6 1 6 5 3 4 3 4 3 6 2 5 3 12 3 5 3 12 2 6 2 13 2 7 2 12 2 7 2 11 3 6 4 4 2 3 5 4 6 1 5 1 6 4 5 2 5 2 4 6 3 5 3 3 3 6 3 5 3 3 3 6 3 5 3 3 3 6 3 5 2 4 3 6 2 6 2 4 3 6 3 6 2 4 3 5 3 5 3 4 2 6 3 5 3 1 7 3 5 3 12 3 5 3 1 1 3 506.0 1.04545454545 202.0 0.846534653465 0.19255885891 0.210204814948 0.0915259523472 0.0965124284338 0.0588803223509 0.0351502474714 0.015674176492 0.0171271504789 0.0222472753267 1.0 1.68181818182 3.0 4.0 6.0 8.0 6.0 6.0 10.0 10.0 1.0 7.0 0.333333333333 2.0 1.0 3.0 0.399209486166 0.222222222222 0.472222222222 0.666666666667 0.555555555556 0.333333333333 0.0833333333333 0.111111111111 0.111111111111 0.527777777778 0.527777777778 0.638888888889 0.527777777778 0.416666666667 0.194444444444 0.472222222222 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.777777777778 0.444444444444 0.333333333333 0.0 0.222222222222 0.555555555556 0.666666666667 0.888888888889 1.0 1.0 1.0 0.222222222222 0.777777777778 0.555555555556 0.333333333333 0.444444444444 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.222222222222 0.0 0.0 0.111111111111 0.222222222222 0.0 0.0 0.666666666667 0.777777777778 0.666666666667 0.444444444444 0.666666666667 0.888888888889 0.666666666667 0.666666666667 0.555555555556 0.777777777778 0.555555555556 0.555555555556 0.888888888889 0.888888888889 0.666666666667 0.555555555556 0.555555555556 0.222222222222 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -9.07875153637 2.29736700463 -27.9944512645 7.03751869854 -8.91550228103 2.72809388604 -57.5199623165 19.7404261927 1.97633516006 2.48184317347 -47.5827062107 30.1436574152 3.86890165504 -1.70009338945 -16.1488229094 20.0220774132 1.09350643626 -1.68502087924 -3.63815849709 -2.32312960365 -1.07188426279 -2.33882946708 -12.9233248648 -23.7829200618 -0.152600038809 0.171517168636 4 6 4 3 3 3 2 3 5 3 1 2 10 2 9 3 9 3 9 3 9 4 9 4 5 1 2 4 4 3 2 9 4 7 2 0 156.0 0.923076923077 63.0 0.809523809524 0.153846153846 0.205128205128 0.0614031760481 0.113357440281 0.0468852728468 0.0248333148439 0.0195578734359 0.011848438023 0.0594277485796 0.75 0.307692307692 0.0 3.0 3.0 3.0 2.0 0.0 0.0 2.0 2.0 8.0 0.275862068966 0.0 2.0 1.0 0.403846153846 0.416666666667 0.833333333333 0.916666666667 0.416666666667 0.583333333333 0.333333333333 0.583333333333 0.916666666667 0.333333333333 0.0 0.0833333333333 0.666666666667 0.333333333333 0.0 0.0 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -8.47194004766 -5.48472419271 -21.2782347246 -10.1681828705 -1.26715442174 5.09991260522 -26.1335782086 10.99130905 0.679261927589 4.39994342759 -21.8525157858 36.3520772662 -0.000818514537582 -0.272448129184 -20.1717635137 38.3389389287 -0.085814026212 -0.219179101146 -20.8839914751 36.7134057483 -0.202535223654 0.96876810397 -23.3310248785 45.7455119538 -0.107516980184 0.218973801929 5 4 6 7 4 9 2 11 1 20 3 4 1 2 1 1 3 3 9 3 9 4 8 5 5 1 1 5 5 1 2 10 4 7 8 1 5 0 180.0 0.8 98.0 0.591836734694 0.217592592593 0.23 0.0602091906722 0.106807098765 0.0348611111111 0.0141675008606 0.00626511842317 0.00293633453342 0.0352931545263 0.666666666667 0.266666666667 0.0 3.0 3.0 2.0 0.0 0.0 0.0 1.0 2.0 7.0 0.322580645161 1.0 2.0 1.0 0.544444444444 0.25 0.833333333333 1.0 0.916666666667 0.666666666667 0.916666666667 0.5 0.916666666667 0.916666666667 0.916666666667 0.166666666667 0.416666666667 1.0 0.916666666667 0.166666666667 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 -13.8783110376 10.5254469031 -32.6436111281 27.1225956793 1.29191372472 3.24591201271 -28.5709543697 43.1525306283 1.73345433603 2.63130304149 -16.8745429054 52.1981832119 -0.503856901843 -1.80649386748 -16.8507664669 43.9500653267 0.176928831712 0.611608912779 -16.8789709252 47.6836782985 -0.333910259248 1.79335628968 -21.270401327 63.6306134891 -0.274089052524 -0.0571796797886 7 3 8 7 5 9 3 2 5 2 4 2 10 3 10 2 11 3 10 3 10 2 9 5 9 4 10 2 11 3 10 3 10 3 10 2 11 3 10 2 11 3 8 6 8 5 7 0 286.0 0.590909090909 79.0 0.835443037975 0.0898332436794 0.123966942149 0.0202203537574 0.114782229849 0.017275794771 0.00706131859383 0.00794007727099 0.000166955247758 0.111182728685 0.615384615385 0.0454545454545 2.0 6.0 0.0 0.0 1.0 0.0 0.0 0.0 3.0 3.0 0.266666666667 0.0 2.0 1.0 0.276223776224 0.166666666667 0.583333333333 0.625 0.583333333333 0.458333333333 0.416666666667 0.458333333333 0.458333333333 0.458333333333 0.0 0.0 0.0 0.416666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.5 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -12.327273774 5.87426426321 -21.6818110379 16.1481019048 10.999627393 3.14417704818 8.48536931728 28.7178299674 -3.83638458808 1.0046075817 1.83197664227 34.5355252296 -0.230456096897 0.0479315190881 -2.632800082 33.7505099198 2.28401692778 -0.519683012652 11.0620343226 28.7982420683 -1.5712017206 -0.108054252858 5.04153174648 27.2772586777 0.307519151917 0.091803612639 4 7 4 3 2 4 3 1 5 3 2 2 5 3 1 16 7 3 9 4 8 4 8 4 9 4 5 2 1 5 3 3 2 8 5 7 2 0 168.0 0.857142857143 83.0 0.650602409639 0.21130952381 0.232993197279 0.0739719995141 0.119347937588 0.042036159702 0.0236911215792 0.0115897624733 0.00453057782955 0.0428753033958 1.16666666667 0.357142857143 0.0 5.0 6.0 3.0 2.0 1.0 0.0 2.0 1.0 11.0 0.222222222222 0.0 3.0 2.0 0.494047619048 0.0833333333333 0.75 1.0 0.666666666667 0.5 0.75 0.583333333333 0.916666666667 0.416666666667 0.333333333333 0.0 0.5 0.333333333333 0.25 0.0 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.75 0.75 1.0 0.75 0.75 0.5 0.75 1.0 0.5 0.25 0.5 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 -11.4591559026 -0.2728370453 -27.4756508064 1.17953756947 0.150338780063 3.31023721288 -28.3593514925 16.8502871262 0.321927259199 4.22045159558 -24.9408923471 40.0782563703 -0.489323427574 0.495932506057 -24.1344417133 44.7908542706 1.44916306828 -1.22118288674 -12.6655269378 36.5417490131 0.524001103421 0.7622464152 -5.46853921808 41.9863886479 -0.0684818374635 0.2363250677 1 2 6 7 3 3 1 8 2 8 1 13 3 5 4 3 3 5 5 4 4 2 5 4 5 4 4 2 6 3 4 5 4 1 8 3 3 6 3 1 8 3 3 1 2 4 1 1 10 3 1 2 3 5 10 6 3 4 12 5 3 4 12 4 5 3 13 2 15 0 312.0 1.84615384615 136.0 0.727941176471 0.197916666667 0.160996055227 0.141359508547 0.0357937262407 0.0402824005588 0.0580231785908 0.0075820126951 0.00619143728142 -0.015605093829 0.25 1.76923076923 0.0 3.0 2.0 1.0 7.0 6.0 7.0 3.0 2.0 10.0 0.347826086957 0.0 3.0 3.0 0.435897435897 0.791666666667 0.583333333333 0.25 0.0416666666667 0.416666666667 0.291666666667 0.708333333333 0.708333333333 0.875 0.791666666667 0.666666666667 0.291666666667 0.5 0.291666666667 0.5 0.375 0.833333333333 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.5 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.166666666667 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.5 0.666666666667 0.5 0.166666666667 0.0 0.166666666667 0.333333333333 0.333333333333 0.5 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 1.0 -7.7985922115 12.7323954474 -17.8591911638 26.9352626254 1.98308164335 -5.23221875415 -8.39818156682 11.4702980785 2.76223454536 -0.680614570487 1.55283167488 -1.17827491649 -3.50502841335 -0.494230081484 -11.7458912994 1.38673215984 1.79711816587 1.56678052411 -5.3704969761 2.08241759793 0.495544957498 -2.95015097878 5.23583944752 -9.68176428282 -0.0383582130915 0.792850045554 2 1 4 4 3 12 2 6 2 5 3 3 5 2 4 3 6 1 4 2 6 2 4 2 6 3 2 3 6 3 3 2 6 3 3 2 5 4 2 4 5 4 1 4 5 4 1 5 3 5 4 1 9 0 196.0 1.0 90.0 0.866666666667 0.215379008746 0.201166180758 0.0944646522707 0.0876558661782 0.0553818986987 0.0327065427548 0.0137422400214 0.0153478124954 0.00972781650907 0.571428571429 0.857142857143 2.0 2.0 2.0 2.0 2.0 3.0 3.0 3.0 4.0 2.0 0.228571428571 0.0 1.0 2.0 0.459183673469 0.6875 0.5 0.5625 0.6875 0.5625 0.375 0.25 0.5 0.5625 0.0 0.0625 0.125 0.6875 0.5 0.8125 0.875 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.86438647622 2.86478897565 -8.72168567819 9.31602379351 -5.77737083509 3.75150937288 -24.8190650787 23.5803042273 3.19238850301 1.09870603155 -12.2861419063 30.4195798021 1.00546431899 -0.391342198796 -3.58517196677 27.2548096046 -1.74223323575 -0.322810751469 -14.7480501953 24.8516536126 0.167708221586 0.629193374531 -17.7224638529 29.9152898719 -0.0561050536497 0.046135874214 4 1 9 8 3 3 3 4 2 2 4 4 9 3 8 4 8 4 7 5 4 7 4 2 4 2 3 3 3 4 2 3 3 4 1 5 3 4 1 4 3 2 1 1 168.0 0.857142857143 79.0 0.860759493671 0.243055555556 0.241921768707 0.0845675075586 0.123931802384 0.0631170871126 0.0200445801772 0.0102702321647 0.0102097334195 0.0283419571442 0.833333333333 0.571428571429 2.0 4.0 3.0 1.0 1.0 1.0 1.0 3.0 4.0 8.0 0.25 1.0 2.0 1.0 0.470238095238 0.416666666667 0.166666666667 0.0833333333333 0.666666666667 0.583333333333 0.0833333333333 0.333333333333 0.75 0.333333333333 0.0 0.333333333333 0.0833333333333 0.583333333333 0.583333333333 0.75 0.5 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.75 0.5 0.25 0.25 0.5 0.75 1.0 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.81891363534 1.18229386297 0.783720349405 4.67412235834 -4.78485648153 3.07266481969 -11.6812262685 17.9311339466 2.57867560322 2.53289973632 -4.68651654064 32.7052909053 -0.233803507166 0.740258050362 -0.489242382223 40.0379417207 0.368565380868 0.259837972054 2.3675989832 40.1915751535 0.661934231859 -0.733401218179 8.39020346787 33.8219706394 -0.0913574637792 0.00183490037103 9 2 7 3 1 5 3 3 5 3 2 4 4 5 1 12 2 5 9 3 10 4 11 3 11 4 11 3 6 2 3 5 3 2 7 6 11 1 5 0 196.0 1.0 75.0 1.05333333333 0.159620991254 0.159620991254 0.0684403394844 0.0690130175352 0.036005937152 0.0274184342121 0.0108659818811 0.00735770271416 0.020746882599 0.928571428571 0.357142857143 0.0 3.0 5.0 3.0 2.0 1.0 0.0 2.0 1.0 11.0 0.212121212121 2.0 3.0 1.0 0.382653061224 0.3125 0.75 0.8125 0.4375 0.4375 0.625 0.3125 0.625 0.3125 0.3125 0.0 0.3125 0.8125 0.5 0.0 0.375 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.25 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.25 0.25 0.0 0.5 0.5 0.0 0.0 0.0 -9.73118794905 5.09295817894 -23.8711696445 14.5173957149 -0.591146931484 3.77888587913 -26.4452457922 31.0245254517 0.806560547564 2.62435677448 -21.4266113485 44.0745863845 -0.392721034789 -0.738263354584 -21.172201835 38.4649843018 0.482163540785 -1.40335465148 -16.6562991845 28.2445426793 0.607783063274 1.31677306512 -10.1575224018 39.079443645 -0.00377112728796 0.289975750891 1 8 5 1 20 2 5 1 5 4 4 2 4 3 3 4 5 2 3 5 4 2 2 6 4 2 2 6 8 7 6 9 4 10 4 11 2 12 2 12 2 12 2 11 3 11 3 10 3 9 5 8 5 9 4 10 0 308.0 0.636363636364 119.0 0.647058823529 0.147727272727 0.140348288076 0.0348664212116 0.100677107405 0.0231716888483 0.00963587845876 0.00495253965903 0.000344880400978 0.0735107875034 0.642857142857 0.272727272727 3.0 3.0 2.0 0.0 3.0 3.0 0.0 0.0 2.0 12.0 0.204545454545 0.0 6.0 2.0 0.386363636364 0.75 0.416666666667 0.0 0.333333333333 0.583333333333 0.833333333333 0.583333333333 0.666666666667 0.541666666667 0.625 0.333333333333 0.125 0.833333333333 0.208333333333 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.166666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.166666666667 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.333333333333 1.0 0.833333333333 0.5 0.5 0.666666666667 0.333333333333 0.5 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 -12.2115247245 15.973368834 -24.3217946207 36.8893235634 6.13302556813 -1.51095556793 -13.0813650434 38.4060255753 -5.08514920936 2.82844791675 -22.2181409265 42.9606639608 2.91228071817 -1.70171265404 -19.9754951793 37.0467324939 -2.59567144392 -0.126038695206 -25.8073966122 26.7112200095 1.37318729517 -1.6217276664 -26.8967516333 13.3799068479 -0.460326399471 -0.0664228732885 1 5 11 7 10 7 12 4 13 4 13 3 14 3 14 3 14 10 7 11 6 5 3 5 4 3 5 6 3 3 5 6 3 3 5 6 3 3 5 6 3 3 5 7 2 3 5 7 2 3 5 7 2 3 5 6 2 5 4 6 2 6 2 7 11 5 2 0 374.0 0.772727272727 171.0 0.543859649123 0.205882352941 0.24890617404 0.0667126597844 0.139003713449 0.0768537847808 0.0203096175188 0.0195530315613 0.0189678071298 0.0665042921822 0.352941176471 0.5 1.0 4.0 1.0 0.0 0.0 0.0 5.0 5.0 3.0 6.0 0.142857142857 1.0 1.0 2.0 0.457219251337 0.766666666667 0.6 0.6 0.666666666667 0.433333333333 0.533333333333 0.266666666667 0.3 0.0 0.4 0.6 0.633333333333 0.0 0.133333333333 0.8 0.9 0.888888888889 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.888888888889 0.777777777778 0.444444444444 0.555555555556 1.0 0.555555555556 0.333333333333 0.333333333333 0.222222222222 0.111111111111 0.0 0.333333333333 0.777777777778 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.777777777778 0.333333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.222222222222 0.888888888889 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.444444444444 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.111111111111 0.555555555556 0.666666666667 0.888888888889 -6.30832319892 -13.3979524821 -18.4657369149 -30.691103492 -3.23367928327 3.41071075829 -20.4555782908 -13.4063242615 6.91575025223 6.32831626597 -0.707760501137 16.0791345576 -6.02232775659 -3.25254601684 -19.0632873939 7.73269520544 2.58186749398 1.29346202845 -16.8593402323 7.95297353933 -0.814668245289 -0.752679256909 -13.2262554972 2.12977585157 -0.0222899903021 -0.31679743006 6 6 6 8 5 10 3 11 2 13 1 17 3 2 5 4 10 4 10 4 11 3 11 4 5 3 3 11 5 7 3 0 196.0 1.0 107.0 0.514018691589 0.240160349854 0.233236151603 0.0847896869077 0.0910090608505 0.0383216176933 0.020698004243 0.00647121094095 0.0028325860065 0.00277939334828 0.642857142857 0.142857142857 0.0 2.0 3.0 3.0 0.0 0.0 0.0 1.0 1.0 8.0 0.137931034483 1.0 2.0 1.0 0.545918367347 0.1875 0.75 1.0 0.75 0.75 0.8125 0.25 0.5 1.0 0.875 0.125 0.25 0.875 0.75 0.0 0.4375 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 -8.68531260873 8.5034212452 -22.3421402354 18.9567560428 -2.10520692947 -1.45652293401 -30.2914068848 20.418060425 0.377712454043 4.2149876578 -28.7889531105 36.8906842117 -0.61883965349 0.204639620929 -32.1662626844 41.5650478509 -0.697956774523 -1.16611008324 -37.0895224929 30.8824834111 0.369545078405 -0.0819448288084 -33.7826445485 28.5674816391 0.107726407607 0.110298039667 4 4 7 8 3 4 1 6 2 3 4 4 9 4 9 4 8 5 5 8 4 4 2 3 3 4 3 3 2 5 3 3 3 4 1 6 2 12 10 1 2 0 182.0 0.928571428571 95.0 0.684210526316 0.244294167371 0.25 0.0791080070756 0.106856056032 0.0577224972829 0.0156127721786 0.00868640707454 0.00777109714305 0.00779764336886 0.769230769231 0.428571428571 3.0 4.0 3.0 0.0 1.0 1.0 2.0 2.0 3.0 10.0 0.222222222222 0.0 3.0 2.0 0.521978021978 0.5625 0.1875 0.375 0.8125 0.625 0.0625 0.625 0.6875 0.8125 0.8125 0.75 0.75 0.3125 0.5 0.5 0.6875 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 -2.27364204417 0.682092613251 -7.86404783591 2.93871757023 -3.1436581325 2.46318954928 -16.3212383304 14.5337256805 1.74540615359 2.2284982706 -12.623139445 22.0624697598 -1.49541180766 -2.51681640246 -18.4203865724 11.3926161647 -0.260663453762 0.713027931945 -22.2689186713 8.38791938379 0.533955918434 -0.919825206572 -17.4758993525 2.50602562618 -0.047972051367 -0.202815357486 6 2 6 1 6 6 2 6 3 16 2 14 4 8 2 4 7 3 4 3 7 3 5 3 6 4 4 4 6 3 5 3 6 3 5 4 6 3 5 3 7 2 6 3 2 1 3 3 5 3 2 2 2 4 4 7 3 3 5 6 4 3 6 3 6 0 288.0 1.125 136.0 0.720588235294 0.21875 0.205729166667 0.0934229721258 0.077564380787 0.0443582417052 0.0264285424688 0.00718197654185 0.00653981813886 -0.000506501592411 0.611111111111 1.0 2.0 1.0 4.0 3.0 2.0 4.0 5.0 5.0 5.0 13.0 0.224489795918 2.0 1.0 2.0 0.472222222222 0.4 0.35 0.4 0.55 0.85 0.8 0.45 0.1 0.65 0.5 0.4 0.6 0.75 0.7 0.5 0.35 0.0 0.166666666667 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 0.5 0.166666666667 0.5 0.666666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.666666666667 0.333333333333 0.333333333333 0.5 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.166666666667 -5.23442923947 12.5909243868 -16.5107880537 32.1142990417 -4.64234665282 2.09586756335 -25.842406835 36.8780010876 5.10467735611 -3.36799664328 -10.8132717934 22.0863085754 -3.04101001126 0.995587737666 -14.2253582723 18.8202672805 2.49018299212 -1.41681716013 -6.0956980315 12.5494695603 -0.952944961454 0.606971480631 -7.60012466523 14.5582914744 -0.115525895004 0.0849109410009 3 1 8 2 6 3 5 4 4 17 2 3 6 3 6 3 6 3 6 3 6 3 6 3 6 4 5 7 3 6 1 0 144.0 0.5625 65.0 0.676923076923 0.154320987654 0.227864583333 0.0273062414266 0.176646291474 0.044118119856 0.0063132485838 0.0153336666685 0.00557690716211 0.180230373109 0.444444444444 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 5.0 0.0869565217391 0.0 3.0 1.0 0.451388888889 0.25 0.833333333333 0.666666666667 0.666666666667 0.75 0.916666666667 0.666666666667 0.666666666667 0.25 0.583333333333 0.0 0.0 0.0 0.416666666667 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 -9.78802900015 1.51197195937 -18.3158967145 2.49298043459 7.17782576354 -1.33696369187 1.13143423293 0.953259285225 -2.24619604567 2.53008906397 -0.0914430303756 12.9672655064 0.611309268426 0.860000497302 0.166283218284 17.914182131 0.658999896704 -1.93711449548 4.47569618188 4.2424597668 -1.13221327642 -0.0694135119288 -3.64831651425 -0.615438187618 0.0781978925877 0.00181715564202 3 1 6 2 5 4 3 6 1 7 3 4 4 3 5 3 5 3 5 3 5 3 5 3 5 4 4 4 1 1 3 5 4 3 2 0 128.0 0.5 59.0 0.762711864407 0.1552734375 0.22265625 0.0221858024597 0.188079833984 0.0444679260254 0.00400877576414 0.0170813169113 0.00479281844047 0.206006672704 0.25 0.125 0.0 0.0 2.0 0.0 1.0 0.0 0.0 1.0 1.0 2.0 0.166666666667 0.0 2.0 1.0 0.4609375 0.375 0.75 0.5 0.5 0.625 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.75 0.875 0.5 0.625 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -8.35563451232 2.9443664472 -14.841774203 8.11737577076 6.88034279374 1.59963151787 1.66910790463 14.3508092092 -3.86946426797 0.307323299231 -5.79069647267 15.7261575513 1.56794790197 -0.404834077516 -3.38506389748 12.5050306479 0.128842118289 -0.231497819572 0.556389373946 10.268728312 -0.744640894629 0.24220810559 -6.07299251195 12.1700437606 0.0844053170055 0.0305453653498 5 2 7 6 3 3 3 8 3 9 1 15 1 10 1 2 9 2 9 3 8 4 5 6 5 2 1 10 3 7 6 3 3 0 165.0 0.733333333333 92.0 0.597826086957 0.2391184573 0.254545454545 0.0674544898016 0.127696802738 0.0475999666082 0.01598496542 0.00902894216108 0.00595115569261 0.0496032640828 1.09090909091 0.333333333333 0.0 2.0 4.0 2.0 1.0 2.0 0.0 1.0 6.0 11.0 0.210526315789 0.0 3.0 1.0 0.557575757576 0.416666666667 1.0 0.833333333333 0.916666666667 0.5 0.916666666667 0.333333333333 0.666666666667 0.416666666667 0.666666666667 0.25 0.25 0.666666666667 0.916666666667 0.25 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.5 0.75 0.5 0.75 1.0 1.0 0.5 0.0 0.75 0.5 0.0 0.25 0.75 1.0 0.5 0.0 1.0 0.5 0.0 0.25 0.75 1.0 0.5 0.0 0.75 0.75 0.5 0.75 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 -8.74291154051 6.11154981473 -20.7740901267 15.7037680311 0.749230736546 2.46272822164 -16.5290725459 31.2704427235 2.85573692365 4.93772984373 -0.0369080528841 49.4720779248 0.261668748575 -3.37289438735 4.41852290005 30.9935526287 -0.528827821238 -1.93723239448 0.466990107191 9.47886232269 0.0159413684992 0.0622669709696 -0.677098709913 1.53569573107 -0.00204994255182 -0.603143266758 3 1 9 8 3 5 1 4 2 3 4 3 2 1 6 3 9 3 8 4 6 6 3 4 2 3 3 3 3 3 2 4 3 4 1 18 1 5 2 3 7 0 168.0 0.857142857143 88.0 0.704545454545 0.229166666667 0.269557823129 0.0721194727891 0.126112697063 0.0576636904762 0.0164156425801 0.00687555805329 0.00886636242978 0.0352148938034 0.833333333333 0.5 3.0 5.0 2.0 0.0 1.0 2.0 2.0 2.0 2.0 10.0 0.257142857143 0.0 3.0 2.0 0.52380952381 0.666666666667 0.333333333333 0.333333333333 0.916666666667 0.666666666667 0.0833333333333 0.5 0.833333333333 0.416666666667 0.0833333333333 0.416666666667 0.416666666667 0.666666666667 0.75 0.833333333333 0.75 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.5 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.5 0.75 0.25 0.0 0.0 0.25 0.75 0.5 0.5 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -3.18309886184 -1.0913481812 -10.4741178981 -0.470001673697 -3.63689925351 3.61369882449 -19.8873415868 14.2106248744 2.40221976877 2.01769869902 -13.5299708206 23.2644187044 -1.4553263871 -1.92730089911 -16.7037741273 14.7948644109 0.244719690702 0.504200994294 -18.7916705341 12.5975716719 -0.232040066458 -0.492340684015 -20.6993178371 10.2308414759 -0.224999374196 -0.0597833685743 3 1 3 5 5 4 4 12 2 7 3 7 1 7 1 5 4 4 4 5 4 4 3 4 4 4 6 3 3 3 6 3 6 3 3 3 6 3 6 3 3 3 6 3 6 3 3 4 5 3 6 3 3 3 6 3 6 2 4 4 5 3 6 2 3 5 4 5 4 4 1 7 2 6 3 6 2 4 6 1 8 1 2 0 336.0 1.71428571429 165.0 0.709090909091 0.228546626984 0.21343537415 0.162715469062 0.0532344138052 0.0486903032542 0.0696079026244 0.00721087525551 0.0130873954382 -0.0267026352815 0.416666666667 1.92857142857 3.0 3.0 1.0 3.0 5.0 6.0 6.0 6.0 6.0 16.0 0.114754098361 2.0 5.0 3.0 0.491071428571 0.625 0.583333333333 0.541666666667 0.75 0.708333333333 0.166666666667 0.0416666666667 0.291666666667 0.708333333333 0.625 0.5 0.666666666667 0.708333333333 0.208333333333 0.166666666667 0.291666666667 0.333333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 0.833333333333 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.0 -7.48028232532 11.6713624934 -19.7714676881 24.5113582604 -3.42901535377 -5.74063037791 -36.7808949621 3.51688188931 -2.68633450014 -2.84993471897 -41.6458630031 -12.7540518547 4.92407314775 2.72766601487 -16.0349305737 0.277209547888 -0.362630279626 -0.372200214902 -7.23058418236 2.16175411001 -0.108344549821 -0.304197448296 -14.3600988973 -0.49065337794 -0.225724244139 0.146983511145 1 4 2 8 3 6 6 2 1 1 21 1 9 3 5 7 4 7 4 6 5 6 5 6 5 6 5 6 6 6 7 6 2 1 1 3 0 176.0 0.6875 91.0 0.56043956044 0.186983471074 0.232954545455 0.0374300044609 0.128903315177 0.038117486852 0.00748604236913 0.00735970401553 0.00141185023832 0.0828202264021 0.363636363636 0.125 1.0 0.0 1.0 1.0 1.0 0.0 0.0 1.0 4.0 6.0 0.0714285714286 0.0 3.0 1.0 0.517045454545 0.416666666667 0.916666666667 0.5 0.666666666667 0.75 1.0 1.0 1.0 0.833333333333 0.916666666667 0.666666666667 0.666666666667 0.333333333333 0.75 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -13.2894377482 6.44577519522 -25.712748192 15.6353032943 8.42495395043 0.331054715611 -3.88405964636 18.5569469936 -2.92958895348 0.645170562081 -4.55985597291 19.9211773291 1.3205397763 -0.402480370612 -4.11831520146 14.714380888 -0.254778906854 -1.66798340191 0.245317419855 0.638108651644 0.620307192729 -0.335022094482 2.60620923416 -6.36976198714 -0.0556644394437 -0.0815596931161 0 4 4 4 3 4 4 5 3 3 5 4 3 4 5 3 3 4 5 3 3 4 5 3 3 4 5 3 3 4 5 2 4 4 4 3 4 4 4 4 3 5 3 4 3 7 2 5 2 3 1 1 3 3 2 0 195.0 1.15384615385 101.0 0.623762376238 0.217435897436 0.246548323471 0.0980844586052 0.0890412852543 0.0527689273251 0.0316298884269 0.00952586871046 0.0099806566818 -0.000852645850115 0.133333333333 1.07692307692 0.0 0.0 1.0 1.0 3.0 3.0 3.0 3.0 1.0 4.0 0.25 0.0 1.0 2.0 0.517948717949 0.875 0.75 0.75 0.6875 0.3125 0.5 0.5 0.75 0.3125 0.0 0.125 0.3125 0.875 0.75 0.75 0.875 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.25 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -6.45108035999 1.52788745368 -19.9810636704 6.01497951329 -5.7267485301 3.30476397389 -34.3758120082 16.3632181815 4.59410816498 -0.772771521018 -18.6567156082 14.6579541291 -1.42604155462 -0.387940801091 -17.993110884 9.22894416451 0.545642504751 -0.377145676058 -13.5971231348 6.10916342477 1.8289419971 -0.095222941359 4.26023772519 1.99642145506 0.0409601575244 -0.275777281478 4 6 7 3 2 3 5 3 4 3 3 3 6 3 1 4 6 7 8 6 8 6 8 6 8 7 7 3 1 3 6 4 2 4 3 4 4 9 5 8 3 0 196.0 1.0 95.0 0.621052631579 0.229227405248 0.23943148688 0.102520394351 0.102475770087 0.0597034133312 0.0346128924384 0.0117595450289 0.0129688181243 0.00996410840904 0.571428571429 0.785714285714 0.0 3.0 3.0 1.0 2.0 3.0 3.0 2.0 4.0 12.0 0.0769230769231 0.0 2.0 2.0 0.484693877551 0.375 0.8125 0.8125 0.625 0.5625 0.125 0.0625 0.5625 0.4375 0.0 0.0 0.3125 0.5625 0.625 0.5 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.773038295018 -2.41006056682 -2.73509368948 -2.67149071753 -7.16846855926 5.15838338878 -29.3696807617 18.3667755273 -2.2196750054 3.63908672253 -42.6995860962 39.0251278103 1.73203614542 -0.645645956772 -33.442269533 36.5917210078 -0.276677622538 -0.860139838108 -31.5812234501 28.1083236187 -0.0299281634752 0.20360431612 -30.506001821 28.599277096 0.202811588771 0.117670099503 0 1 2 1 1 1 5 1 1 1 1 1 5 1 2 8 2 7 2 12 3 7 2 5 1 6 4 4 5 2 4 5 4 4 5 1 6 4 4 5 3 2 6 5 3 5 3 1 7 5 2 6 2 2 8 8 1 6 10 6 2 6 10 6 2 6 11 5 3 4 12 4 4 4 6 0 312.0 1.84615384615 158.0 0.607594936709 0.227297008547 0.217209072978 0.147614355223 0.0461590286734 0.0497517263651 0.050422797322 0.00706861075188 0.00457012977517 -0.0292449087094 0.208333333333 1.92307692308 0.0 2.0 2.0 1.0 10.0 6.0 5.0 3.0 7.0 17.0 0.19298245614 0.0 1.0 3.0 0.50641025641 0.833333333333 0.625 0.375 0.0833333333333 0.416666666667 0.375 0.791666666667 0.875 0.791666666667 0.75 0.833333333333 0.541666666667 0.416666666667 0.291666666667 0.541666666667 0.583333333333 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.666666666667 0.833333333333 0.166666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 1.0 0.666666666667 0.333333333333 0.5 0.666666666667 0.666666666667 0.833333333333 -10.6633811872 9.54929658551 -24.2112972856 23.0585749296 3.00266799753 -0.0851036848478 -9.95701926477 21.9528888861 4.3883132153 -2.34419281909 8.43549739538 7.58349812852 -4.1683083589 -0.207326535938 -9.78535956158 6.52380462264 0.418820960821 1.30580982494 -14.2428621441 10.399261379 0.706963024932 -1.81067454625 -4.82225336546 2.70362649632 -0.00742126013342 0.393946754598 7 4 5 8 3 9 2 4 8 4 8 3 9 3 9 3 9 3 7 5 1 2 4 8 6 3 9 3 9 3 9 3 9 3 9 3 9 3 9 3 9 3 8 6 7 5 5 0 264.0 0.545454545455 94.0 0.68085106383 0.124368686869 0.155819559229 0.0232435842586 0.14047624793 0.024525884708 0.00633976807103 0.0105214167643 1.30165183829e-05 0.13587468918 0.5 0.0454545454545 1.0 2.0 3.0 0.0 0.0 1.0 0.0 0.0 0.0 6.0 0.161290322581 1.0 2.0 1.0 0.356060606061 0.166666666667 0.555555555556 0.444444444444 0.388888888889 0.666666666667 1.0 1.0 1.0 0.611111111111 0.5 0.444444444444 0.444444444444 0.444444444444 0.222222222222 0.111111111111 0.0555555555556 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.166666666667 0.0 0.5 0.333333333333 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -13.4847642692 6.30832319892 -23.4925388552 15.9745704891 11.9510893631 1.85365884884 7.02363522081 27.1569448925 -5.49653228882 2.95616439498 -2.01695012135 38.013501391 1.94576159098 -1.12234168316 0.00293669931057 37.2864036651 0.582587527185 0.769071735023 7.58633887937 32.2514469034 -1.08132931804 -2.40044644223 0.147642121373 17.3854450907 0.205073944563 0.237479138496 1 3 2 1 11 3 3 3 3 3 3 3 3 3 3 4 2 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 3 3 3 2 5 1 5 126.0 0.285714285714 68.0 0.647058823529 0.261904761905 0.257747543462 0.0219738689126 0.381112350878 0.0606126048303 0.001326817165 0.018888178982 0.0011856534077 0.625753261225 0.666666666667 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 3.0 4.0 0.178571428571 0.0 7.0 1.0 0.539682539683 0.333333333333 0.0 0.0 0.166666666667 0.583333333333 0.333333333333 0.5 0.666666666667 0.916666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.916666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -2.21301158966 2.06143545338 -4.16755812785 6.72568422042 1.31592833414 2.7906507158 -2.16831807499 18.0984908793 -1.28867999823 1.82531958028 -3.74202158499 30.5744016393 1.30910463728 1.25544307093 -0.780022252189 36.3331043541 -0.921532914748 -1.57708246999 -1.19811532689 24.0468552405 0.92702661877 -1.08275751751 0.262410095777 8.08617117317 -0.293410378951 -0.316252276812 6 6 5 9 3 10 2 4 4 3 2 4 4 2 2 4 9 4 10 3 10 3 9 4 8 6 2 5 1 4 5 3 1 4 5 2 2 4 5 3 1 4 5 3 1 4 5 3 1 4 5 3 1 4 5 3 1 4 5 3 1 4 5 9 2 5 273.0 0.619047619048 140.0 0.571428571429 0.234714003945 0.255014826443 0.0613624502044 0.177602474185 0.0535097162316 0.0168296450741 0.0139890840297 0.00927771733425 0.117740736048 0.923076923077 0.619047619048 2.0 2.0 2.0 4.0 2.0 0.0 5.0 5.0 4.0 8.0 0.108695652174 2.0 1.0 2.0 0.512820512821 0.333333333333 0.708333333333 0.791666666667 0.791666666667 0.666666666667 0.541666666667 0.541666666667 0.541666666667 0.5 0.0833333333333 0.0833333333333 0.0833333333333 0.666666666667 0.166666666667 0.75 0.791666666667 0.0 0.0 0.333333333333 0.166666666667 0.5 0.666666666667 0.5 0.5 0.0 0.333333333333 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.666666666667 0.166666666667 0.0 0.166666666667 0.166666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -9.2158290857 0.606304545112 -17.669690779 5.15493206018 6.77411282239 5.74958187678 4.52596141259 26.3907470774 0.510128702969 1.43692627768 10.0815062248 35.4644021835 -2.59260662979 -0.819211592829 -3.1065218706 34.6030472777 1.58791281604 1.90752702391 3.88396891558 44.9125303524 0.0942723376916 -0.271679155882 8.39859605279 47.4588849871 -0.100304754509 0.00800347519975 2 2 5 3 4 5 3 6 2 7 1 4 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 6 2 7 3 3 2 0 128.0 0.5 64.0 0.625 0.162109375 0.23876953125 0.0232372283936 0.199393749237 0.04723072052 0.00434590379557 0.0183531863101 0.00627941944697 0.225420660288 0.375 0.0 0.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 2.0 4.0 0.25 1.0 3.0 1.0 0.5 0.625 0.875 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.5 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 -9.11162049201 2.42711288215 -16.9644716513 7.22208366211 6.45354643268 2.23780553773 -1.82803057753 16.5266036347 -3.73039311668 1.29003027466 -8.98023018666 23.8664269388 1.37191439596 0.106794693942 -8.32455491489 24.61968591 -0.384697653832 -0.334272767836 -8.69067336273 21.6335120183 -0.846560187186 0.0522906447789 -16.8481642746 22.0474846166 0.121809125777 0.124718192004 1 4 2 4 1 5 1 6 1 10 3 5 1 1 5 4 9 3 8 4 8 4 8 4 8 4 7 6 6 6 6 6 8 3 6 0 168.0 0.857142857143 79.0 0.53164556962 0.171130952381 0.185799319728 0.045298960358 0.0965235176412 0.026310561427 0.0121246494744 0.00595347296179 -0.00209522604827 0.0428976174969 0.25 0.214285714286 2.0 0.0 1.0 0.0 2.0 1.0 0.0 0.0 2.0 6.0 0.25 0.0 1.0 1.0 0.470238095238 0.666666666667 0.25 0.333333333333 0.583333333333 1.0 0.916666666667 1.0 1.0 0.75 0.75 0.666666666667 0.916666666667 0.833333333333 0.166666666667 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.25 0.25 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -12.095775675 4.54728408834 -23.9712878129 12.9262217543 7.18934894538 2.91026181654 -3.53803243073 23.1785898303 -1.09405647618 -0.115263519207 0.876121578935 24.3756265401 0.324371082815 0.487966574494 0.165104115977 27.4217748417 0.46726388762 0.82209325343 5.74103628444 34.0601806284 0.268769360258 0.148950174904 8.43612898659 37.4169062496 -0.0344001039763 0.098090924633 12 6 2 2 10 9 1 4 8 15 8 14 8 6 5 4 8 6 5 4 8 6 6 3 8 6 7 2 8 6 7 2 9 6 18 5 18 6 18 7 17 6 18 5 19 5 9 1 9 5 7 2 9 5 7 2 9 5 6 4 9 4 6 4 8 4 6 5 7 5 6 8 2 7 5 9 2 6 6 3 4 8 17 4 10 0 598.0 0.884615384615 226.0 0.592920353982 0.198196888178 0.175456650373 0.0745446122108 0.0995156953008 0.0459484078706 0.0217806723642 0.0123652544397 0.00645674555713 0.0341210540874 0.608695652174 0.615384615385 0.0 3.0 7.0 2.0 4.0 3.0 3.0 6.0 4.0 10.0 0.263157894737 2.0 3.0 1.0 0.377926421405 0.0 0.0 0.119047619048 0.690476190476 0.47619047619 0.47619047619 0.0238095238095 0.357142857143 0.738095238095 0.666666666667 0.571428571429 0.547619047619 0.690476190476 0.142857142857 0.5 0.452380952381 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.416666666667 0.916666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.25 0.583333333333 0.666666666667 0.166666666667 0.583333333333 0.583333333333 0.0833333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 1.0 1.0 0.666666666667 0.0833333333333 0.0 0.0 0.416666666667 0.833333333333 1.0 1.0 1.0 0.5 0.0 0.0 0.583333333333 1.0 0.5 0.416666666667 0.833333333333 0.916666666667 0.416666666667 0.333333333333 0.916666666667 1.0 0.25 0.0 0.333333333333 1.0 1.0 0.916666666667 0.833333333333 -0.685590524088 7.71289339599 -6.09633928712 20.1459588261 -4.77261991843 4.2912070034 -10.9901461859 48.0016151505 8.43385230437 9.4573552251 16.8449995601 85.2808639848 -3.72584940882 -4.01081657831 12.7338839036 76.587176982 1.75081279652 1.34878903367 11.07575683 68.68721782 -1.03978742473 -1.6947561675 14.2526847237 64.3219043025 0.509473283136 0.438961019257 2 2 4 1 3 3 2 12 2 6 5 4 6 4 6 4 7 3 6 4 6 3 7 4 6 4 5 6 3 7 6 1 1 1 4 0 150.0 0.666666666667 69.0 0.666666666667 0.172 0.203111111111 0.0342328888889 0.13247437037 0.0355537777778 0.00697576357838 0.00905773067054 0.000694872217932 0.0928769736399 0.5 0.2 2.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 3.0 8.0 0.214285714286 0.0 6.0 1.0 0.46 0.583333333333 0.416666666667 0.25 0.416666666667 0.916666666667 1.0 0.916666666667 1.0 0.583333333333 0.75 0.583333333333 0.666666666667 0.583333333333 0.0833333333333 0.0 0.0833333333333 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.5 0.5 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -9.54929658551 4.3290144521 -18.3227821309 12.237032203 5.96272225906 2.88487786625 -5.08830398408 23.6989131679 -3.86812059971 0.849002416032 -13.3222050532 28.090275144 1.07540084335 -0.189607307287 -15.7970657633 29.3261003307 -0.894632097741 1.21194051283 -18.8249694967 37.3670263281 -0.567160733258 0.373705982052 -29.2851264016 45.0274621072 -0.258752192225 0.19826747287 4 1 1 3 6 7 4 9 1 28 4 1 3 3 9 3 9 3 9 3 9 4 6 1 1 5 4 2 2 6 1 3 5 5 9 1 5 0 180.0 0.8 88.0 0.647727272727 0.188888888889 0.199259259259 0.0586790123457 0.0998141289438 0.0333806584362 0.0171837376473 0.0086834756994 0.00517021449744 0.0423846844181 0.666666666667 0.333333333333 0.0 3.0 3.0 2.0 1.0 1.0 0.0 2.0 5.0 9.0 0.212121212121 1.0 3.0 1.0 0.488888888889 0.333333333333 1.0 1.0 0.916666666667 0.75 0.75 0.333333333333 0.75 0.916666666667 0.5 0.0 0.333333333333 1.0 0.583333333333 0.0 0.166666666667 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 -12.4353062202 10.0161510852 -30.4091237625 27.486172713 -0.379708326452 5.14501952921 -30.6408587454 46.8785097453 2.66593934885 0.332102790618 -15.9808366649 48.3727887063 -0.423916414391 -0.914316095263 -15.6381830329 42.4541549336 -0.673142012519 0.917607248058 -20.4894659656 49.6947396703 0.370877587921 1.40118122487 -19.8868367606 64.0325217498 -0.213903479657 0.0811578665764 7 3 1 3 1 1 7 5 1 1 6 10 5 8 9 6 8 5 12 4 10 3 12 4 10 4 12 4 10 4 11 4 11 3 12 4 11 3 11 4 11 4 11 5 5 8 12 18 12 3 2 3 1 2 2 4 12 4 10 4 12 4 10 3 12 4 11 3 12 4 11 3 12 4 11 3 12 4 10 3 12 4 10 5 9 7 8 6 8 9 5 9 7 9 5 1 15 0 660.0 1.36363636364 223.0 0.681614349776 0.154696969697 0.159573002755 0.0921255634861 0.0597955136767 0.0392998476501 0.0418007468093 0.00930203120376 0.00967248672612 0.00831738440629 0.666666666667 1.18181818182 1.0 8.0 7.0 2.0 8.0 5.0 7.0 5.0 4.0 15.0 0.342105263158 2.0 3.0 4.0 0.337878787879 0.0625 0.166666666667 0.375 0.645833333333 0.666666666667 0.5625 0.395833333333 0.145833333333 0.0833333333333 0.3125 0.520833333333 0.583333333333 0.604166666667 0.416666666667 0.208333333333 0.125 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0833333333333 0.0 0.0 0.0833333333333 0.25 0.333333333333 0.583333333333 0.75 0.75 0.416666666667 0.583333333333 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.916666666667 0.916666666667 0.666666666667 0.416666666667 0.583333333333 0.5 0.0 0.0 0.75 0.25 0.0 0.0 0.333333333333 0.583333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.583333333333 0.5 0.0 0.0 0.0833333333333 0.0 0.0 0.0833333333333 0.75 0.833333333333 0.75 0.75 0.75 0.666666666667 0.75 0.833333333333 0.833333333333 0.583333333333 0.333333333333 0.25 -13.2841325834 11.841127766 -34.150516851 27.9614956511 -0.99227801853 -0.953797890067 -24.4329906501 23.3505831246 11.7665547023 -3.89960262638 20.5891519939 -2.82820315419 -7.29950872488 -1.05263395797 -5.84960429811 0.422822750903 0.697239899622 5.91168484715 -6.45364022381 27.0471100125 4.21369547702 -5.11055100295 24.7863194254 5.11993137357 -0.971328061519 0.545431808149 1 2 17 20 1 8 1 9 5 5 6 4 5 5 7 3 5 5 8 2 5 4 17 3 5 1 10 5 4 2 10 4 3 3 9 5 1 1 1 2 10 10 11 4 3 2 10 5 4 2 10 3 5 2 10 3 5 1 10 4 17 4 16 4 15 5 13 9 10 8 11 0 440.0 0.909090909091 159.0 0.792452830189 0.147727272727 0.149690082645 0.0511729902329 0.0795515472389 0.0323391716754 0.0181519893198 0.00848109650781 0.00298285155834 0.0367884758279 0.95 0.590909090909 8.0 4.0 7.0 0.0 3.0 4.0 4.0 0.0 4.0 15.0 0.0833333333333 4.0 3.0 2.0 0.361363636364 0.466666666667 0.133333333333 0.1 0.166666666667 0.833333333333 0.866666666667 0.833333333333 0.833333333333 0.4 0.233333333333 0.366666666667 0.2 0.433333333333 0.266666666667 0.366666666667 0.0333333333333 0.777777777778 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.555555555556 0.333333333333 0.222222222222 0.222222222222 0.222222222222 0.111111111111 0.111111111111 0.666666666667 1.0 1.0 0.888888888889 0.888888888889 0.888888888889 0.777777777778 0.777777777778 0.666666666667 1.0 0.888888888889 0.777777777778 1.0 1.0 0.888888888889 0.666666666667 0.555555555556 0.444444444444 0.222222222222 0.111111111111 0.444444444444 0.666666666667 0.222222222222 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.111111111111 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 0.777777777778 0.666666666667 0.666666666667 0.333333333333 0.666666666667 0.666666666667 0.111111111111 0.111111111111 0.222222222222 0.0 0.222222222222 0.111111111111 -15.7997452597 11.5170304274 -30.9793715159 30.5707696349 10.4253064376 5.09798034844 1.80854327792 54.6174634089 -0.233314460229 3.83609355524 5.58049788594 69.0021531925 -4.24045280328 -2.49492529305 -16.9340794297 57.406841049 2.46002930001 -0.3014163176 -9.16973286502 44.4652767815 -1.17325407649 -1.10477739641 -12.7969523228 38.8285653182 -0.0840670731359 0.274470266538 4 1 1 1 1 1 5 9 2 4 3 4 1 4 2 16 1 5 1 1 6 2 9 3 9 3 9 3 9 4 8 6 4 1 3 8 5 5 4 0 168.0 0.857142857143 81.0 0.679012345679 0.177579365079 0.207482993197 0.0580045014037 0.103758368427 0.0302258800346 0.0187206221863 0.0073253740088 0.00254701332775 0.0486613145462 1.0 0.428571428571 1.0 4.0 5.0 2.0 3.0 2.0 0.0 1.0 4.0 14.0 0.138888888889 1.0 3.0 1.0 0.482142857143 0.416666666667 0.833333333333 0.916666666667 0.833333333333 0.833333333333 0.833333333333 0.333333333333 0.75 0.583333333333 0.5 0.0 0.416666666667 0.666666666667 0.5 0.0 0.25 0.0 0.25 0.5 0.75 1.0 0.75 0.75 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 0.75 0.25 0.0 0.0 0.75 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.75 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.75 0.75 0.75 1.0 0.5 0.0 0.0 0.0 -12.5959769247 5.13843101982 -30.993091441 13.3007290607 -0.845887642147 1.85742634751 -34.110625761 23.6982625534 1.51146533776 2.99547841277 -25.2369747392 38.2112284825 -0.453618102588 0.0861706546915 -25.6723516604 38.272648063 -0.364830680521 -1.69113049127 -28.7681420187 25.5202072124 -0.00233544291526 0.471597749175 -30.2749612467 27.5076629537 -0.151664597264 0.23187166649 10 4 10 5 10 5 11 4 11 4 11 4 11 4 12 3 7 2 2 4 5 10 4 3 4 4 3 3 5 4 2 4 6 3 1 4 7 3 1 4 7 3 1 4 7 3 1 4 7 3 2 4 6 3 3 3 5 4 4 4 3 5 4 6 1 4 5 4 3 2 1 0 330.0 0.681818181818 137.0 0.656934306569 0.235555555556 0.223829201102 0.0759608203245 0.150331552439 0.0644475053566 0.0196780968059 0.0168794816561 0.0108340120209 0.0729389486815 0.6 0.590909090909 0.0 2.0 4.0 0.0 0.0 1.0 5.0 5.0 4.0 11.0 0.166666666667 0.0 2.0 2.0 0.415151515152 0.0 0.0416666666667 0.75 0.583333333333 0.0 0.291666666667 0.416666666667 0.541666666667 0.0833333333333 0.25 0.0 0.208333333333 0.833333333333 0.75 0.583333333333 0.625 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 2.72010266375 -6.74238213462 4.69270586563 -16.9697540363 -1.62801994756 0.559672961038 6.86761773871 -4.69798410078 5.67765798821 9.31440170329 27.2852571973 35.6638819009 -2.37514235358 -2.63881930801 18.8918782058 33.1850055443 -1.28346582807 0.022088896931 3.23756103542 23.3644501549 0.237728088488 -0.703286676748 4.48510373913 18.301372755 0.0848170484231 0.024341357403 5 5 6 10 2 6 1 3 3 5 2 4 1 11 2 11 2 3 10 3 9 4 10 4 9 5 5 2 2 10 4 8 6 5 4 0 182.0 0.928571428571 99.0 0.575757575758 0.242603550296 0.236263736264 0.076853408637 0.100494180376 0.0421260903087 0.0181494693041 0.00779769160549 0.00185297896009 0.00996380385638 0.923076923077 0.214285714286 0.0 2.0 5.0 3.0 1.0 1.0 0.0 1.0 5.0 14.0 0.184210526316 0.0 3.0 1.0 0.543956043956 0.3125 0.6875 0.8125 0.5625 0.875 0.8125 0.3125 0.8125 0.8125 0.625 0.0 0.5 0.75 0.625 0.0 0.4375 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 -10.1859163579 5.95694215573 -24.0473102181 16.2254997693 0.861199925302 3.41162308771 -20.9849823414 32.7906248367 1.65550685852 3.53672785012 -9.87508667544 49.1374362011 0.285147477026 -0.908432794359 -4.09364759668 44.2287928983 0.814409917918 -1.33228641257 1.40985467163 31.0683651421 -0.527607883395 -0.26329445502 -5.12143703746 21.6510595571 -0.448923115692 -0.494187406627 2 4 11 7 10 6 12 5 13 5 12 4 13 5 13 4 13 3 3 4 6 11 7 5 3 3 6 4 4 3 6 3 6 2 6 3 6 2 6 3 6 3 5 4 5 3 5 4 5 3 5 4 5 3 5 3 6 3 4 5 4 5 2 6 3 7 2 1 7 3 4 0 374.0 0.772727272727 143.0 0.727272727273 0.151305441963 0.19822557122 0.0470384540746 0.122639123606 0.0608306929759 0.0164393436806 0.0225849308249 0.0175106314907 0.0791830168682 0.588235294118 0.590909090909 3.0 5.0 2.0 0.0 0.0 1.0 5.0 5.0 4.0 8.0 0.208333333333 0.0 1.0 2.0 0.382352941176 0.766666666667 0.5 0.4 0.5 0.466666666667 0.633333333333 0.533333333333 0.566666666667 0.0 0.366666666667 0.266666666667 0.3 0.0 0.133333333333 0.466666666667 0.7 0.777777777778 0.666666666667 0.333333333333 0.111111111111 0.111111111111 0.0 0.0 0.0 1.0 1.0 1.0 0.777777777778 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.777777777778 0.777777777778 0.888888888889 0.888888888889 0.888888888889 0.888888888889 0.666666666667 0.888888888889 0.111111111111 0.111111111111 0.222222222222 0.222222222222 0.555555555556 0.333333333333 0.0 0.222222222222 0.0 0.0 0.0 0.222222222222 0.555555555556 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.888888888889 0.555555555556 0.333333333333 0.333333333333 0.0 0.0 0.0 0.111111111111 0.444444444444 0.666666666667 0.777777777778 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.333333333333 -11.8064030512 -6.68450760986 -25.438109257 -16.3207555903 4.80262895142 0.965870813542 -8.57526176294 -5.43132700266 1.53854488871 6.76398996456 -2.06861982397 22.7110211082 -4.06054759484 -2.58093962517 -18.364941763 23.4093893811 3.22807991634 3.07081186514 -2.78580490145 34.7854556929 -0.288881782223 -1.53570923178 -0.305786015206 27.4492457559 -0.35441151204 -0.186331721995 1 4 3 1 2 5 8 3 2 3 4 2 2 5 8 1 17 2 3 4 1 4 2 10 2 10 3 9 3 10 3 5 1 4 8 5 4 5 0 168.0 0.857142857143 76.0 0.776315789474 0.181547619048 0.184948979592 0.063373117104 0.0924978994574 0.0296670007289 0.0200774819365 0.00663035804878 0.00315117482656 0.0379784054568 1.08333333333 0.428571428571 1.0 6.0 5.0 1.0 2.0 2.0 0.0 1.0 5.0 7.0 0.171428571429 1.0 3.0 3.0 0.452380952381 0.25 0.916666666667 0.833333333333 0.75 0.5 0.583333333333 0.166666666667 0.583333333333 0.5 0.416666666667 0.0 0.25 0.666666666667 0.666666666667 0.0833333333333 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.75 0.75 0.75 1.0 0.75 0.25 0.0 0.75 0.75 0.25 0.25 0.75 0.5 0.0 0.0 1.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.75 0.25 0.5 1.0 0.75 0.25 0.0 0.75 1.0 0.75 0.75 1.0 0.75 0.25 0.0 -10.0949706761 6.45714340544 -26.4986856733 15.124798639 -3.18773894764 0.162403003155 -37.8361160838 21.875758038 0.885498823617 4.36745708951 -33.222920589 39.8772653099 0.287644059636 -0.59206344989 -29.3555901278 38.3431769082 -0.387827175743 -1.56914252642 -31.6768483583 26.2929957338 -0.0929658331581 1.09908605488 -31.663576675 32.8143705515 0.144097255581 0.0303282074707 1 6 1 3 1 3 5 2 3 2 4 3 3 1 11 1 17 6 3 9 3 9 4 9 3 9 4 6 1 2 5 1 3 4 7 9 1 4 0 168.0 0.857142857143 79.0 0.759493670886 0.194444444444 0.196428571429 0.066940665155 0.0917481575964 0.0375566893424 0.0222468332139 0.00972414346416 0.00480648957772 0.0304110695905 0.833333333333 0.357142857143 0.0 3.0 4.0 3.0 3.0 0.0 0.0 2.0 3.0 10.0 0.290322580645 0.0 2.0 1.0 0.470238095238 0.333333333333 0.833333333333 0.916666666667 0.416666666667 0.75 0.833333333333 0.5 0.833333333333 0.75 0.666666666667 0.0 0.583333333333 0.416666666667 0.5 0.0 0.416666666667 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.25 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.5 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -10.8225361302 6.72998045074 -25.3366439956 18.2351941253 1.16280550259 3.28889281818 -21.8583293446 32.0447925581 1.10201090899 1.44062353796 -14.2745715418 38.8439375993 -0.672872641006 -0.593008376985 -15.7573459331 34.2506623666 0.413152182638 -0.645347865701 -13.9517203592 29.006995019 -0.120035675327 0.763324452701 -14.7304775483 35.8259201278 -0.0986819557348 0.242501731757 1 1 6 4 2 13 2 5 3 4 3 3 5 3 3 3 5 3 2 4 5 4 2 3 5 4 2 2 6 4 2 2 6 4 2 3 5 4 1 4 5 9 4 10 4 5 3 1 10 0 196.0 1.0 102.0 0.637254901961 0.26056851312 0.229956268222 0.113096344848 0.090680089716 0.055917788294 0.0336989354547 0.00806235558834 0.0119276180232 -0.0103021727904 0.357142857143 0.857142857143 3.0 1.0 1.0 0.0 2.0 3.0 3.0 3.0 1.0 6.0 0.1875 0.0 1.0 2.0 0.520408163265 0.625 0.5625 0.5 0.8125 0.5625 0.5 0.375 0.5 0.4375 0.0 0.0 0.125 0.875 0.75 0.75 0.875 0.75 0.75 0.25 0.0 0.25 0.25 0.0 0.0 0.75 1.0 0.75 0.5 0.75 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 0.75 0.5 0.5 0.5 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.6370222718 5.00201249717 0.467110941508 14.5787586759 -5.00015646285 3.96356129414 -15.3939560741 29.9767453405 0.382153679028 1.10507904736 -18.6392495247 36.1327767174 -0.651202899182 -0.54488879328 -23.5905512659 32.3577807351 -1.56558938354 -0.146141872562 -34.9409435928 29.9581708168 0.297562321853 0.247317748832 -37.8273005359 31.9499631492 -0.328459338037 0.0587027587862 2 4 9 6 10 5 10 4 12 4 11 3 12 4 11 3 12 3 4 1 1 1 5 3 3 6 3 3 2 5 4 4 3 2 6 4 2 2 7 8 7 8 7 9 6 10 5 10 5 5 1 6 3 5 2 5 2 6 2 7 1 1 13 0 330.0 0.681818181818 147.0 0.646258503401 0.154343434343 0.24696969697 0.0354933355595 0.15977073768 0.0554906642179 0.00964039704168 0.0153093260235 0.0109934555437 0.130161648588 0.733333333333 0.409090909091 2.0 3.0 2.0 3.0 0.0 3.0 2.0 3.0 5.0 10.0 0.191489361702 1.0 1.0 2.0 0.445454545455 0.666666666667 0.5 0.708333333333 0.791666666667 0.666666666667 0.541666666667 0.75 0.875 0.0 0.25 0.708333333333 0.791666666667 0.0 0.375 0.208333333333 0.708333333333 0.5 0.333333333333 0.0 0.0 0.0 0.333333333333 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.5 0.5 0.833333333333 1.0 0.5 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 1.0 1.0 -18.6355969729 -11.6906540017 -37.2476675864 -22.1736219187 11.0375328152 8.93683105695 -3.79118167472 7.61000769294 -0.697400672672 1.58707572739 1.12807454361 23.6886251887 -3.12005377733 -0.607162938424 -16.2113908931 22.0344646509 2.44076112257 0.849868732409 -3.00460887064 23.3228485529 -0.0461037568266 -1.13289171282 0.47425828389 19.2518899 -0.235688146516 0.411501688876 5 1 12 4 11 5 11 6 11 4 12 4 12 5 12 4 12 4 12 4 12 10 6 10 6 4 4 3 5 3 5 3 5 3 5 3 4 3 7 3 3 3 7 2 5 2 7 2 5 2 7 2 5 2 7 3 3 4 5 4 3 5 3 5 1 7 2 7 368.0 0.695652173913 136.0 0.727941176471 0.152513586957 0.20474952741 0.044221739002 0.14560113855 0.0635271684551 0.015237653116 0.0251308640614 0.0181238123501 0.113477750905 0.625 0.478260869565 3.0 3.0 3.0 1.0 0.0 0.0 4.0 5.0 3.0 7.0 0.125 0.0 1.0 2.0 0.369565217391 0.5 0.333333333333 0.291666666667 0.375 0.708333333333 0.958333333333 0.833333333333 0.541666666667 0.0416666666667 0.333333333333 0.375 0.0 0.0 0.166666666667 0.625 0.291666666667 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 1.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.166666666667 0.166666666667 0.5 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -10.9055734919 -8.08230319701 -22.999685883 -22.2082075081 4.72617058921 -3.10194514548 -9.25491122389 -27.7578956494 -0.649921508594 4.51327535285 -9.7696137769 -11.6250721861 -2.07348725162 -1.63446049336 -18.3370353394 -6.69818673829 2.55244930946 2.5671433722 -5.55947642669 -0.453158099412 -1.08877477162 -2.552908513 -8.99787838975 -9.67988496358 -0.0247527214573 0.354104147589 4 6 4 3 3 3 2 3 5 3 1 2 10 2 9 3 9 3 9 3 9 4 9 4 5 1 2 4 4 3 2 9 4 7 2 0 156.0 0.923076923077 63.0 0.809523809524 0.153846153846 0.205128205128 0.0614031760481 0.113357440281 0.0468852728468 0.0248333148439 0.0195578734359 0.011848438023 0.0594277485796 0.75 0.307692307692 0.0 3.0 3.0 3.0 2.0 0.0 0.0 2.0 2.0 8.0 0.275862068966 0.0 2.0 1.0 0.403846153846 0.416666666667 0.833333333333 0.916666666667 0.416666666667 0.583333333333 0.333333333333 0.583333333333 0.916666666667 0.333333333333 0.0 0.0833333333333 0.666666666667 0.333333333333 0.0 0.0 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -8.47194004766 -5.48472419271 -21.2782347246 -10.1681828705 -1.26715442174 5.09991260522 -26.1335782086 10.99130905 0.679261927589 4.39994342759 -21.8525157858 36.3520772662 -0.000818514537582 -0.272448129184 -20.1717635137 38.3389389287 -0.085814026212 -0.219179101146 -20.8839914751 36.7134057483 -0.202535223654 0.96876810397 -23.3310248785 45.7455119538 -0.107516980184 0.218973801929 5 1 3 5 2 6 3 5 4 4 4 4 4 4 4 4 4 4 5 3 5 3 5 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 5 2 8 1 1 6 0 176.0 0.363636363636 88.0 0.625 0.211647727273 0.242252066116 0.0219341366923 0.277598345934 0.0522273842506 0.00204522127209 0.0139286561087 0.00291372345101 0.373353773852 0.375 0.0 2.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 7.0 0.193548387097 0.0 5.0 1.0 0.5 0.333333333333 0.0 0.0 0.25 0.666666666667 0.333333333333 0.333333333333 0.666666666667 0.833333333333 0.833333333333 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -5.49807985227 3.00947528756 -10.2850611778 9.52984171691 3.52675874647 3.51169223796 -3.76969836532 22.8929541244 -2.89604461853 1.15275491153 -7.67931550084 30.9632622521 2.61024808189 0.202800167269 -1.37235117518 29.2341351419 -1.56900122507 -1.63600741094 -2.38229116949 15.2490664281 1.28334266454 -0.778688459456 0.363965362707 4.48255226685 -0.242092859035 -0.0285907151931 5 3 6 6 3 9 1 3 2 5 2 2 4 3 8 2 8 4 5 6 3 3 2 3 2 3 3 2 2 3 4 3 1 4 1 17 1 4 2 3 2 3 7 0 165.0 0.733333333333 91.0 0.725274725275 0.260055096419 0.271515151515 0.068238528536 0.143218632607 0.052182652976 0.0121081036054 0.00378595848527 0.00485463329205 0.0462902442526 1.18181818182 0.466666666667 2.0 3.0 4.0 2.0 0.0 2.0 2.0 2.0 2.0 11.0 0.305555555556 0.0 3.0 2.0 0.551515151515 0.416666666667 0.416666666667 0.25 0.916666666667 0.5 0.166666666667 0.5 0.666666666667 0.833333333333 0.25 0.416666666667 0.416666666667 0.916666666667 0.833333333333 0.833333333333 0.833333333333 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.25 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.5 0.75 1.0 1.0 1.0 0.5 0.0 0.25 0.75 0.5 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -4.66854499736 1.69765272631 -14.1417193468 6.896529014 -3.71446416517 4.4365324581 -23.4843456339 23.3233247752 2.99295756476 0.498816480077 -13.009823052 23.3472649335 -0.60136219398 -3.01198875017 -8.43316822128 7.76224527336 1.21708356034 1.21193504039 -1.28895651106 7.67133018997 0.253379508089 -1.02888025192 4.30847844055 3.36669335668 -0.0300112530872 -0.00284544542211 1 2 2 3 3 3 3 3 3 33 3 2 4 3 4 3 4 1 4 3 3 2 3 4 2 4 2 4 4 1 11 1 2 3 0 132.0 0.272727272727 57.0 0.842105263158 0.17803030303 0.244834710744 0.01632153143 0.420528894315 0.0619560793889 0.00227182242426 0.028233127556 0.00667217115803 0.763562466006 1.5 195225785.955 1.0 4.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 3.0 6.0 0.130434782609 1.0 7.0 1.0 0.431818181818 0.25 0.25 0.416666666667 0.333333333333 0.583333333333 0.333333333333 0.833333333333 0.75 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.166666666667 0.833333333333 0.75 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.26991064898 -4.54315019371 -5.45979382211 -6.22807535966 2.68961092034 6.88766632384 -1.69021844086 16.3697642975 -3.02777626297 0.468361282351 -6.13531897823 24.87939245 3.32789665759 -0.496723900952 2.95585209774 18.2706895241 -2.35476895876 -0.861200111237 -3.12153798199 12.495813585 1.11307166526 0.406094161911 -2.6824379095 12.0382757177 -0.163360696885 -0.15462035139 0 6 9 4 11 3 11 3 12 2 11 3 12 2 12 2 11 3 3 5 3 3 3 3 1 1 3 3 11 3 3 1 7 6 8 7 7 7 1 1 5 9 5 4 1 5 4 3 3 4 4 3 4 3 3 4 4 5 280.0 0.7 108.0 0.75 0.147193877551 0.218035714286 0.0383414267493 0.153298059402 0.0610059675656 0.0118070153252 0.0227067456018 0.0143820420412 0.121464442796 0.714285714286 0.45 3.0 1.0 3.0 3.0 0.0 3.0 2.0 4.0 4.0 10.0 0.159090909091 3.0 1.0 2.0 0.385714285714 0.6 0.35 0.5 0.5 0.55 0.5 0.6 0.95 0.0 0.1 0.35 0.75 0.0 0.2 0.35 0.3 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.166666666667 0.166666666667 0.5 0.5 0.5 0.5 1.0 0.833333333333 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 1.0 1.0 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 0.833333333333 1.0 -10.8861981075 -10.8861981075 -21.0052603952 -21.8637463727 7.36919217504 6.07048783941 0.170046940275 -4.77563985598 -1.69027324212 -1.0806461481 -2.00652199717 -2.38945664726 -1.454112652 -0.0975096579278 -9.17969326253 -4.01259107182 2.57487884099 0.983613429074 5.3091585496 3.18346105509 -0.901895549278 -0.31448193969 4.33971552824 2.09151787013 0.0450452781876 -0.00490554215782 9 4 2 5 4 5 2 4 5 3 3 4 6 2 4 2 7 3 3 3 6 2 3 4 6 3 2 4 6 3 3 3 6 2 3 4 5 4 3 4 3 6 2 13 3 12 3 4 5 1 1 1 210.0 1.07142857143 105.0 0.685714285714 0.244126984127 0.256802721088 0.109002159594 0.101147284311 0.0666045783393 0.0338660743938 0.012670795311 0.0118634213387 -0.00523049121277 0.533333333333 0.857142857143 2.0 1.0 1.0 3.0 2.0 3.0 3.0 1.0 2.0 7.0 0.162162162162 0.0 1.0 2.0 0.5 0.625 0.625 0.6875 0.5 0.375 0.4375 0.5 0.8125 0.125 0.0 0.0 0.5625 0.8125 0.5 0.5625 0.9375 0.5 0.75 0.5 0.25 0.0 0.25 0.5 0.25 0.5 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.25 0.5 0.5 0.25 0.25 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.90460127052 -4.49877972473 -12.9150318755 -6.94782698216 -4.85528679726 5.60112222835 -27.2750025424 10.2837689767 2.15456862206 -0.8929485671 -19.9050071893 8.70311612294 0.0467227564163 -1.83020817115 -17.0229314374 -3.07760569917 -0.930872283227 0.92741972456 -22.2140048745 0.616864424005 0.622384180005 -0.0809641476931 -20.7817062951 1.72642537215 -0.220328476326 -0.0894618619126 3 1 6 2 5 4 3 5 3 15 2 2 6 2 7 1 6 2 6 3 5 2 7 2 6 2 5 7 4 3 1 0 128.0 0.5 53.0 0.88679245283 0.146484375 0.18994140625 0.0255260467529 0.17058134079 0.0447473526001 0.00620243032563 0.0216241400028 0.00772264344381 0.182963616241 1.0 0.0 2.0 2.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 7.0 0.16 0.0 4.0 1.0 0.4140625 0.375 0.875 0.375 0.375 0.625 1.0 0.875 0.875 0.875 0.875 0.5 0.75 0.75 0.75 0.0 0.25 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -6.9232400245 4.21760599194 -13.0666755246 9.59755105516 4.82500591147 -0.640971665343 -0.797615526027 9.45903117436 -2.14011136887 1.38309570022 -4.21856144921 16.2569258177 0.602147238444 0.958944178127 -3.21673311207 19.9034455146 0.597660012267 -1.89694312404 0.205932982658 7.37642102136 -1.17407598427 0.18800078495 -7.16513552696 6.51669961917 0.193770943376 0.24031287012 7 2 1 30 1 9 50.0 2.0 41.0 0.219512195122 0.39 0.384 0.197 0.039872 0.03024 0.0128297454378 -0.00270985945968 -0.00822732882046 -0.129170148597 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 2.0 0.142857142857 0.0 1.0 2.0 0.82 0.5 1.0 1.0 0.833333333333 0.5 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.78253536263 3.05577490736 -5.27915024161 6.02014497433 -1.57627055638 -1.89458044257 -11.6085443202 0.557451386554 -0.640439491002 0.363637213976 -14.8619309549 0.698563896476 0.41349345483 0.438503699207 -11.344033617 3.7941183491 0.693024482825 -0.113813497619 -4.57687393796 4.96776577275 0.239161554271 0.566437141838 -1.57312300016 8.55836557179 -0.0763161640785 -0.108583644186 2 1 3 5 2 19 1 11 4 4 1 4 4 4 1 3 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 3 5 4 1 4 3 5 1 1 11 0 182.0 0.928571428571 101.0 0.544554455446 0.270076077768 0.221350078493 0.108123355331 0.0894885816997 0.0489615444331 0.03072597257 0.00790528064059 0.00979853029645 -0.00798477568908 0.230769230769 0.857142857143 0.0 1.0 1.0 1.0 2.0 3.0 3.0 3.0 2.0 11.0 0.0769230769231 2.0 1.0 2.0 0.554945054945 0.8125 0.8125 0.75 0.75 0.625 0.375 0.25 0.3125 0.75 0.125 0.0 0.1875 0.875 0.875 0.75 0.875 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.54607659004 6.86639897339 -7.25610099744 18.7337169805 -5.18900795509 3.37450240127 -24.4813233409 31.5932127429 0.523340126581 0.298090002074 -23.4540043553 32.7058732507 1.36723907598 -0.848008528305 -14.5257434455 25.4602123137 -0.854131608392 -0.595508010716 -18.4255628844 18.2145778597 -0.238961738011 -0.431956826306 -24.7098068158 11.2127941995 -0.305964057522 -0.271863488773 1 4 6 6 10 4 3 4 4 2 4 5 3 1 4 7 2 1 4 7 7 7 7 7 7 7 7 7 3 1 3 6 3 3 4 4 2 5 8 7 6 11 1 6 0 210.0 0.933333333333 98.0 0.673469387755 0.207142857143 0.199365079365 0.0850997732426 0.085985962639 0.046820861678 0.029998417332 0.0103643301716 0.0102331901455 0.0143441093946 0.5 0.666666666667 0.0 2.0 3.0 1.0 1.0 3.0 3.0 1.0 3.0 11.0 0.162162162162 0.0 2.0 2.0 0.466666666667 0.4375 0.9375 1.0 0.625 0.6875 0.3125 0.25 0.5625 0.5625 0.0 0.0 0.25 0.6875 0.5625 0.5 0.5625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.58366236105 4.75342763368 -14.3980384206 17.6568391851 -4.80548898395 9.58834259822 -29.6486190962 53.1907031204 1.58201113764 2.0980807995 -22.720547502 66.1212720666 1.21468085598 -1.83294673418 -14.8102286329 56.8315791297 -1.68126282526 1.45960631184 -25.7619959836 66.505178874 -0.451454033667 1.70010704796 -35.1403383965 84.4200200728 -0.273784889789 0.0826730780967 8 1 7 8 5 8 3 4 5 3 1 4 5 7 7 6 7 6 7 2 1 3 7 2 1 3 7 2 1 4 6 2 2 3 5 2 3 3 5 1 7 5 3 0 182.0 0.928571428571 79.0 0.79746835443 0.194420963652 0.19387755102 0.0837870618694 0.0871012817638 0.0472898373212 0.0334943084822 0.011471935765 0.012589719292 0.022457316607 0.538461538462 0.714285714286 0.0 2.0 3.0 2.0 0.0 3.0 3.0 3.0 0.0 9.0 0.147058823529 0.0 2.0 2.0 0.434065934066 0.3125 0.875 0.875 0.625 0.625 0.375 0.25 0.4375 0.5625 0.0 0.0 0.0 0.4375 0.625 0.5 0.4375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -5.72957795131 5.68410511042 -15.3293398233 16.2044639095 -2.34277932266 3.95590515257 -24.2490988643 31.7876127582 -0.0109231407661 1.20583756364 -23.3001694066 38.2922869135 1.04648147689 -0.590039795851 -14.250191099 33.1002716232 0.883885540883 -0.9260661596 -6.07698562608 22.618570646 -0.338915377153 -0.842037666249 -9.70109847902 11.6781528335 -0.300827770228 -0.186156502767 4 2 7 1 4 3 6 3 1 5 5 3 3 4 5 3 3 3 5 3 4 3 4 3 5 2 5 3 4 2 5 3 5 2 4 3 5 3 4 3 5 3 4 3 6 2 5 2 5 0 180.0 1.25 67.0 0.955223880597 0.155925925926 0.166666666667 0.0863681412894 0.0599382716049 0.0368209876543 0.0390737416141 0.00717492049858 0.00862315025932 0.0095139478018 0.0 1.0 1.0 0.0 0.0 0.0 3.0 3.0 3.0 3.0 3.0 3.0 0.346153846154 0.0 0.0 2.0 0.372222222222 0.333333333333 0.583333333333 0.5 0.5 0.666666666667 0.666666666667 0.416666666667 0.0833333333333 0.0 0.0 0.166666666667 0.5 0.25 0.583333333333 0.75 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.25 0.5 0.0 0.5 0.75 0.5 0.5 0.5 0.75 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 -7.21502408683 5.64469531499 -21.2690354824 15.586842609 -5.1461512977 2.34672195201 -35.7228485848 20.2216245057 2.77968208151 -3.20368866478 -29.2014933084 8.28944161358 -2.28117508189 1.31732778631 -36.249095486 10.4107691548 -0.185464616877 0.133826012741 -45.9488338684 16.2596031903 -1.48293252529 0.445026887726 -58.3509773174 17.8298916443 -0.216357294629 -0.0925534191251 3 3 2 3 6 13 3 6 1 6 4 5 3 5 4 3 6 4 2 4 7 3 2 4 7 2 4 3 7 3 2 4 7 3 2 4 7 2 3 4 6 3 3 5 4 3 5 5 2 3 6 10 6 4 12 4 11 5 11 5 11 5 10 6 9 8 10 6 8 0 352.0 0.727272727273 156.0 0.602564102564 0.181463068182 0.19021177686 0.0510937169832 0.115161715192 0.033027815156 0.0164544626935 0.00421744461678 0.00203511628825 0.0642631208774 0.8125 0.545454545455 4.0 3.0 4.0 2.0 4.0 5.0 2.0 0.0 6.0 7.0 0.211538461538 0.0 2.0 2.0 0.443181818182 0.5 0.458333333333 0.333333333333 0.583333333333 0.875 0.75 0.958333333333 1.0 0.416666666667 0.0 0.375 0.291666666667 0.583333333333 0.0416666666667 0.416666666667 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.333333333333 0.0 0.166666666667 0.833333333333 0.833333333333 0.833333333333 0.833333333333 1.0 0.833333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.833333333333 1.0 1.0 0.5 0.333333333333 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.5 0.0 -13.6583878435 10.7646616055 -28.1623862796 29.2493548624 6.52929865709 4.33628464033 -11.0538021998 41.6556543474 -2.47769849178 -2.67619376265 -17.9997594689 33.7318034361 -2.39002742903 1.57019159178 -33.0169346253 31.7363598885 1.68960818725 -2.24716695776 -26.763746195 22.505179686 -1.39367157901 0.996918224559 -34.8188080547 19.4673291121 -0.0539181332858 -0.466941001859 5 2 1 1 9 8 4 11 2 4 4 5 1 3 6 4 1 2 8 6 8 7 7 7 7 3 1 3 7 3 1 3 6 4 1 4 4 4 2 5 3 4 5 7 3 0 196.0 1.0 100.0 0.63 0.250364431487 0.241253644315 0.108522357819 0.0982419102585 0.0558783436323 0.0333611717357 0.00878853128297 0.0107592548589 -0.00161051588276 0.571428571429 0.785714285714 0.0 3.0 3.0 1.0 1.0 3.0 3.0 3.0 3.0 10.0 0.184210526316 0.0 2.0 2.0 0.510204081633 0.3125 0.6875 0.875 0.75 0.6875 0.1875 0.1875 0.4375 0.6875 0.0625 0.0 0.125 0.6875 0.6875 0.5 0.8125 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.75 1.0 0.25 0.75 1.0 0.75 0.25 0.0 0.25 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 3.18055468146e-16 2.728370453 -4.45015884556 9.27791762289 -6.90444767699 4.32641600405 -29.9259118521 26.5294331431 -1.87724614259 2.06622073915 -41.4314383219 38.6170835176 1.59889510611 -0.150369894341 -32.9658403837 38.062213209 -0.489406886724 -0.417347129967 -33.0599931082 32.8067834696 -0.0719224427427 -0.343641257862 -32.8156848498 28.6305134815 0.199769510734 0.0304132501286 2 4 9 7 8 7 10 5 11 3 12 3 12 3 12 3 12 3 12 4 2 4 5 11 4 4 4 4 3 3 5 4 3 3 6 3 3 3 6 3 3 2 7 3 3 2 7 3 3 2 7 3 3 2 6 4 2 4 5 4 1 6 3 5 2 5 3 5 11 1 1 1 1 0 345.0 0.652173913043 136.0 0.669117647059 0.185507246377 0.203654694392 0.0557588376574 0.146646186254 0.0718614101897 0.019316533903 0.0264718132456 0.0205074948748 0.0993553237879 0.466666666667 0.565217391304 2.0 1.0 0.0 1.0 0.0 1.0 5.0 5.0 3.0 5.0 0.133333333333 1.0 1.0 2.0 0.394202898551 0.583333333333 0.25 0.25 0.375 0.875 0.833333333333 0.791666666667 0.625 0.125 0.25 0.208333333333 0.0416666666667 0.0 0.333333333333 0.458333333333 0.416666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.833333333333 0.5 0.166666666667 0.333333333333 0.333333333333 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.26613622345 -6.47691420583 -7.83226329633 -16.0663634234 -0.182295001802 0.839477901526 -9.97265394467 -3.99007194742 -0.489841335056 8.0250712017 -8.84649225455 28.8205898176 1.50105862856 -3.39490344829 -2.02341385085 23.6426930739 -0.707142088945 1.63025008663 -3.42218670951 23.4405477397 0.251336426298 -0.916829890591 -2.58294889702 22.1538506652 0.101611263689 0.110919590357 1 12 2 12 2 4 5 4 2 3 5 4 2 2 6 4 1 3 6 3 2 4 5 3 2 4 5 4 1 4 5 4 1 4 5 3 2 4 5 10 3 10 4 5 182.0 1.07692307692 110.0 0.436363636364 0.292778649922 0.274302620456 0.123542439929 0.100613114093 0.050984578759 0.0315343106791 0.00489208559188 0.00748324119795 -0.0313069565753 0.428571428571 0.846153846154 1.0 2.0 1.0 0.0 1.0 3.0 3.0 3.0 7.0 8.0 0.105263157895 0.0 1.0 2.0 0.604395604396 0.6875 0.625 0.75 0.875 0.75 0.375 0.5 0.5625 0.5 0.0 0.0 0.125 0.875 0.75 0.75 0.875 0.5 0.5 0.25 0.0 0.25 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 2.63742477124 -6.69637348269 8.50790300677 -5.22659265011 3.37937449137 -23.4309675076 21.416417218 0.865508576406 0.870106049178 -22.0846308587 25.5617154402 0.74022795068 -1.28870968212 -15.075082628 16.8676175431 -0.0231271210086 -0.326816600014 -11.6510273863 13.9588632296 0.970400263513 1.15013762015 -3.11747518319 25.9155765151 0.0754771218323 0.323855028094 5 4 6 7 4 9 2 4 2 5 1 5 1 16 1 4 8 3 9 3 9 3 10 3 9 3 5 2 2 10 4 7 7 2 5 0 180.0 0.8 90.0 0.644444444444 0.206481481481 0.21 0.0616330589849 0.105523148148 0.0379043209877 0.0162877063675 0.00931956478684 0.00444863014668 0.0406065918871 0.833333333333 0.2 0.0 4.0 4.0 2.0 0.0 2.0 0.0 1.0 3.0 14.0 0.171428571429 1.0 3.0 1.0 0.5 0.25 0.833333333333 1.0 0.75 0.666666666667 0.916666666667 0.416666666667 0.666666666667 0.75 0.5 0.0 0.25 0.916666666667 0.583333333333 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 1.0 1.0 0.75 0.5 0.75 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -11.5015972208 9.67662053999 -27.6556515748 25.7694748903 0.359336493736 4.18075278067 -25.348616906 44.5436839039 2.60302140459 2.65221141631 -10.5856371405 56.0543865286 -0.388565034286 -1.15888316068 -10.4842086974 48.930806924 -0.815320206317 -0.578891978511 -18.0813837439 45.5350194958 -0.41292799497 1.9840481465 -25.3796462946 61.5179571186 -0.289360037214 0.0526206865151 5 5 5 10 2 3 3 6 1 3 4 8 2 7 1 3 2 1 7 3 10 3 10 3 10 4 10 4 5 3 1 5 3 4 1 10 6 4 5 0 182.0 0.928571428571 89.0 0.719101123596 0.20202874049 0.216640502355 0.0769409916252 0.102034844759 0.0394047143534 0.0253412153261 0.0101636399757 0.00638554005307 0.0299044573484 1.0 0.428571428571 0.0 4.0 5.0 3.0 1.0 3.0 0.0 2.0 4.0 9.0 0.222222222222 1.0 3.0 1.0 0.489010989011 0.5 0.75 0.8125 0.8125 0.5 0.25 0.0625 0.625 0.8125 0.375 0.0 0.3125 0.75 0.4375 0.0 0.5625 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.25 0.5 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.0 1.0 1.0 0.75 0.75 0.5 0.0 0.0 0.0 -7.27565454134 2.09175068064 -18.8714931249 7.28773155317 -2.03050154802 3.89442401566 -26.5717904568 24.7850518837 0.334237690925 3.59151637347 -23.8802379465 43.1353314595 0.614848570941 -0.81004002007 -18.5027968598 37.446000466 0.00623904772207 -2.07004856923 -18.5843016479 19.7117267195 -0.780457011443 0.0468077137383 -27.0868134678 13.482760761 -0.237031341345 -0.3237022228 7 4 7 4 2 3 5 3 4 3 3 3 5 3 2 5 3 4 2 5 1 3 4 5 2 2 5 5 8 6 9 5 9 5 7 1 2 5 4 3 4 8 7 6 10 2 5 0 210.0 0.933333333333 93.0 0.817204301075 0.197959183673 0.200952380952 0.0725403304179 0.0891827016521 0.0455484288954 0.0237722536401 0.0116537839912 0.0064506251667 0.0202895375657 0.857142857143 0.533333333333 0.0 0.0 5.0 4.0 2.0 3.0 0.0 1.0 1.0 11.0 0.1875 1.0 3.0 1.0 0.442857142857 0.0625 0.5 0.8125 0.5 0.5625 0.875 0.75 0.8125 0.375 0.375 0.125 0.3125 0.5625 0.5 0.0625 0.3125 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.75 1.0 0.75 0.5 0.5 0.75 0.75 0.25 0.25 0.5 0.25 0.0 0.0 0.75 0.25 0.0 0.0 0.25 0.5 0.25 0.0 -10.9923014029 4.41389708842 -22.8506741368 13.6926985524 5.30063769579 5.24687869279 -6.31294816903 36.6582237036 0.583594323015 3.73248862622 2.94711240175 53.4032935115 -0.0117252146461 -2.25480727947 5.66245141183 42.2952634124 1.50695734489 -0.0540491749512 14.6855311954 40.5007647192 -0.856066643134 2.03131626902 9.62855526282 59.7202164389 -0.121781104371 0.235634147606 1 8 4 7 7 4 9 3 9 4 5 1 3 4 4 9 3 10 3 10 3 10 3 8 5 1 2 5 8 6 5 9 4 9 3 10 2 11 3 10 3 10 3 10 3 9 4 8 6 6 1 1 1 10 0 299.0 0.565217391304 106.0 0.707547169811 0.145356315925 0.144830594736 0.0304846462515 0.1200234979 0.0249653406719 0.00813886878419 0.00736592365028 -0.000159077461119 0.0984130521148 0.538461538462 0.130434782609 2.0 1.0 4.0 0.0 1.0 0.0 0.0 0.0 4.0 11.0 0.0571428571429 2.0 3.0 1.0 0.354515050167 0.125 0.333333333333 0.458333333333 0.291666666667 0.666666666667 0.791666666667 0.833333333333 0.708333333333 0.75 0.125 0.291666666667 0.0 0.708333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 0.5 0.5 0.666666666667 1.0 0.666666666667 0.5 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 1.0 0.833333333333 0.5 0.5 0.833333333333 0.833333333333 0.333333333333 0.666666666667 1.0 0.5 0.0 0.166666666667 0.666666666667 0.333333333333 0.0 0.833333333333 0.833333333333 0.166666666667 0.0 0.333333333333 0.666666666667 0.0 0.0 -10.4627075633 11.9573800723 -15.8719335094 29.2877472648 11.9944250956 1.03349336269 12.4732413678 35.2690774273 -7.37746874093 -0.12191588274 -2.22339596953 28.7734135333 3.84216268763 -1.78381659156 5.09422206457 21.1432592526 -0.621385319235 1.49770101736 10.6388150623 23.9029162882 -0.367270412891 -1.22687523789 3.25981138693 20.7050303182 0.0784436328458 0.199407716873 5 6 7 5 1 5 4 5 4 4 3 4 5 4 3 4 6 4 1 5 7 8 8 9 7 8 8 3 1 5 7 3 2 5 5 4 3 5 2 6 4 10 7 7 5 0 224.0 1.14285714286 119.0 0.571428571429 0.237723214286 0.251913265306 0.108963591017 0.0869706490297 0.0536148471665 0.0348744776303 0.00759302096525 0.0092536559031 -0.0110600680803 0.5625 0.785714285714 0.0 5.0 4.0 0.0 2.0 3.0 3.0 2.0 2.0 10.0 0.25641025641 0.0 2.0 2.0 0.53125 0.5 0.875 1.0 0.625 0.6875 0.4375 0.375 0.8125 0.4375 0.0 0.0 0.375 0.75 0.4375 0.25 0.6875 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.75 1.0 0.75 0.5 0.5 0.25 0.25 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -5.76936668708 4.81443702853 -20.0856984744 17.3033935837 -9.2543004117 8.59778627144 -52.4049684448 47.526119681 -0.188399081042 0.182920358636 -56.6300754041 49.1924494751 1.3723520593 -2.99979276827 -48.1407057325 29.452645215 -1.38373912746 0.60519682512 -53.7800335631 29.8357447273 0.492845089753 0.845121337996 -51.355477777 38.0104047251 0.0952075396582 -0.129393783703 8 3 8 6 6 8 4 2 4 2 4 3 10 3 10 2 11 3 10 2 8 5 8 5 9 4 10 3 10 3 10 3 10 3 10 3 10 3 10 3 10 4 8 6 7 7 5 0 286.0 0.590909090909 86.0 0.744186046512 0.102743410436 0.144151303242 0.0225656049657 0.131994289392 0.0229174097456 0.00728007654594 0.0111833035423 0.000635297166174 0.128863609079 0.384615384615 0.0454545454545 1.0 2.0 2.0 0.0 1.0 0.0 0.0 0.0 1.0 1.0 0.285714285714 0.0 1.0 2.0 0.300699300699 0.0833333333333 0.5 0.625 0.541666666667 0.458333333333 0.583333333333 0.5 0.625 0.416666666667 0.0 0.0 0.0416666666667 0.458333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.0 0.166666666667 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -12.9638935464 2.69116540137 -22.1124187713 7.63990424829 12.4626331997 2.00832971202 11.8623317934 16.9326683711 -4.58950001545 1.97458052543 3.43557455725 27.8277769497 -0.073868953904 0.502775086044 -2.03438596226 31.5584259622 2.07005461637 -0.489022361497 10.7701644259 27.8049070945 -1.49601467475 -0.0299013694544 5.50153987078 25.983519852 0.371340064408 -0.0154009365629 4 6 5 7 4 3 4 3 1 4 3 4 1 10 1 5 7 4 8 4 9 3 9 4 9 3 5 2 2 4 3 3 4 7 7 1 5 0 168.0 0.857142857143 77.0 0.766233766234 0.193452380952 0.188775510204 0.0663493075802 0.0919278425656 0.0414287738905 0.0217171090011 0.0134773428488 0.00806209944164 0.0302071901015 1.0 0.285714285714 0.0 3.0 6.0 3.0 1.0 1.0 0.0 2.0 2.0 14.0 0.194444444444 0.0 3.0 2.0 0.458333333333 0.25 0.833333333333 0.833333333333 0.333333333333 0.75 0.916666666667 0.75 0.833333333333 0.666666666667 0.416666666667 0.0833333333333 0.583333333333 0.583333333333 0.333333333333 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 0.75 0.5 0.75 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 -9.23098669933 6.04788783749 -20.6044218676 17.5145075088 2.38268406057 4.81037695345 -13.7663841157 37.5989007734 0.141238530149 2.59620376408 -11.1334426159 50.8870233761 -1.31586441459 -0.918137363028 -17.5024885384 43.0440304227 0.705991809047 -1.90842374656 -15.1321719151 26.7960898261 -0.416278782401 0.459582797165 -17.9393937867 29.0855579956 -0.117902842251 0.297501981298 6 1 12 4 2 2 1 2 3 6 2 12 4 4 4 3 3 4 5 4 4 2 4 4 5 5 3 2 5 4 4 6 2 2 5 4 4 10 6 5 1 2 1 6 9 7 1 6 9 6 2 5 10 6 2 5 11 4 3 4 12 4 4 2 14 2 14 0 322.0 1.64285714286 145.0 0.710344827586 0.221036997029 0.188775510204 0.141108908075 0.043612597618 0.0480946226722 0.0510079125895 0.00667454441074 0.00523976218655 -0.0221625072185 0.173913043478 1.42857142857 0.0 1.0 1.0 1.0 6.0 6.0 4.0 3.0 4.0 11.0 0.217391304348 1.0 1.0 3.0 0.450310559006 0.541666666667 0.583333333333 0.291666666667 0.0833333333333 0.291666666667 0.25 0.791666666667 0.833333333333 0.583333333333 0.791666666667 0.791666666667 0.541666666667 0.416666666667 0.625 0.708333333333 0.375 0.166666666667 0.666666666667 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.5 0.166666666667 0.5 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.333333333333 0.333333333333 0.166666666667 0.0 0.166666666667 0.333333333333 0.666666666667 1.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.5 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.333333333333 0.5 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 -5.48046586647 10.9332526124 -13.8842072921 25.807021155 -0.00910428539426 -0.712070229486 -8.44874282446 24.1825961155 4.40338516625 -1.39892420164 4.30585122458 11.5606074508 -5.26816795966 -1.29893966202 -17.8286425194 5.73944180175 1.46724124971 1.65133965744 -15.5377091263 12.4993475324 0.787863004344 -0.79755646618 -9.86065765463 12.1394197638 -0.740425227824 0.120699897762 1 1 4 4 3 26 1 5 3 2 4 3 4 2 4 4 3 1 5 4 2 2 6 4 1 2 6 6 8 5 8 5 8 4 9 4 10 2 6 0 182.0 0.928571428571 86.0 0.593023255814 0.205409974641 0.174254317111 0.0644916006587 0.0738689519634 0.0389860411295 0.0154570886554 0.00907197557081 0.00134886347142 0.011477933051 0.307692307692 0.428571428571 0.0 1.0 3.0 0.0 1.0 3.0 1.0 0.0 1.0 11.0 0.212121212121 0.0 4.0 2.0 0.472527472527 0.75 0.5625 0.25 0.0 0.75 0.6875 0.875 0.75 0.8125 0.3125 0.6875 0.625 0.6875 0.375 0.125 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.75 1.0 0.75 0.25 0.25 0.5 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.5 0.75 -7.27565454134 7.73038295018 -14.527617794 22.408110666 4.29486342058 5.24840105339 -1.7144390268 38.6331710607 -0.374388637477 -2.01932272905 0.46853765866 32.1749385834 -0.702408207586 0.125774818538 -3.20866999056 26.4665252175 0.891771442733 -0.598379609498 0.51939602515 22.7909072857 -0.748707292374 -0.294975359112 -3.39108560733 13.6010088977 0.0637276815586 -0.519179584237 1 3 1 5 4 3 6 2 23 2 4 4 4 5 2 5 3 5 3 5 3 5 3 5 5 1 1 1 7 2 6 128.0 0.5 75.0 0.493333333333 0.2255859375 0.27685546875 0.0341868400574 0.209556102753 0.0502161979675 0.00588112316746 0.0129699069856 0.0040817583007 0.217618772867 0.625 0.0625 1.0 0.0 2.0 2.0 0.0 0.0 0.0 1.0 0.0 3.0 0.269230769231 0.0 3.0 1.0 0.5859375 0.625 0.875 0.375 0.5 0.75 1.0 0.875 1.0 0.875 1.0 1.0 1.0 0.875 1.0 0.75 0.5 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 -8.07711336191 4.33697219925 -14.9409914273 10.0820196801 5.72553690783 -0.0413429832641 -2.34077518291 13.8195560773 -3.89610504137 2.70552232102 -10.4826364279 25.4127094508 1.69474256611 0.26241744265 -8.48200222657 30.2689826625 -0.566703263375 -0.102881791514 -8.66789332134 27.7853188612 -0.538625249031 -0.364547091192 -15.4540649833 23.106762065 0.0407200788666 -0.155897933724 1 5 9 6 9 6 9 6 11 4 11 4 11 4 11 4 11 4 3 3 5 4 2 5 4 5 3 4 3 4 5 3 3 4 5 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 4 2 3 6 3 2 5 5 10 3 12 5 4 330.0 0.681818181818 146.0 0.561643835616 0.179393939394 0.235261707989 0.0530438266967 0.157775996883 0.0665098923115 0.0184384186675 0.0203495774304 0.0185878098143 0.116089030382 0.333333333333 0.636363636364 2.0 1.0 0.0 0.0 0.0 2.0 5.0 5.0 4.0 4.0 0.159090909091 2.0 0.0 2.0 0.442424242424 0.791666666667 0.5 0.5 0.625 0.75 0.791666666667 0.666666666667 0.583333333333 0.0 0.166666666667 0.0416666666667 0.0416666666667 0.0 0.416666666667 0.541666666667 0.583333333333 0.833333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -9.20204943695 -7.49475095651 -20.6829384057 -19.6907133068 2.65349913009 -1.47872998027 -9.93104081365 -19.2799111274 2.26371029245 5.14856595807 -1.1643673958 1.63139247882 -3.57636958707 -1.67924133959 -16.2898762342 3.7563982845 1.92107404553 2.03971962476 -5.9307392943 13.8336116212 1.09322016225 0.0992129566142 3.42225565727 20.3259062626 -0.581455689498 0.0864320639053 6 4 6 4 5 2 7 3 7 3 7 3 7 3 8 2 8 2 3 2 3 2 3 7 3 6 6 1 7 0 130.0 0.769230769231 44.0 0.840909090909 0.156153846154 0.163313609467 0.0500596267638 0.106747382795 0.0333145197997 0.0145352057806 0.00861111722031 0.00283627684408 0.0609518172591 0.1 0.0769230769231 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 5.0 0.2 0.0 1.0 1.0 0.338461538462 0.0 0.0 0.166666666667 0.75 0.0833333333333 0.333333333333 0.0833333333333 0.583333333333 0.583333333333 1.0 0.75 0.583333333333 0.666666666667 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.40736765485 0.195883006882 -9.9765032691 0.38709777843 0.91972287551 0.0846121864048 -7.28009159451 2.18785152849 0.441143126192 1.29608147444 -2.48532035289 8.50704764411 0.580275643002 0.331054528963 1.80869868244 13.3238875739 0.286616550332 0.702972945185 6.2215453081 19.8735544381 0.624453978257 0.647120729819 13.5019215887 27.2819103344 0.186269559151 0.0913909954357 6 6 5 9 3 10 2 4 4 3 2 4 4 2 2 4 9 4 10 3 10 3 9 4 8 6 2 5 1 4 5 3 1 4 5 2 2 4 5 3 1 4 5 3 1 4 5 3 1 4 5 3 1 4 5 3 1 4 5 3 1 4 5 9 2 5 273.0 0.619047619048 140.0 0.571428571429 0.234714003945 0.255014826443 0.0613624502044 0.177602474185 0.0535097162316 0.0168296450741 0.0139890840297 0.00927771733425 0.117740736048 0.923076923077 0.619047619048 2.0 2.0 2.0 4.0 2.0 0.0 5.0 5.0 4.0 8.0 0.108695652174 2.0 1.0 2.0 0.512820512821 0.333333333333 0.708333333333 0.791666666667 0.791666666667 0.666666666667 0.541666666667 0.541666666667 0.541666666667 0.5 0.0833333333333 0.0833333333333 0.0833333333333 0.666666666667 0.166666666667 0.75 0.791666666667 0.0 0.0 0.333333333333 0.166666666667 0.5 0.666666666667 0.5 0.5 0.0 0.333333333333 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.666666666667 0.166666666667 0.0 0.166666666667 0.166666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -9.2158290857 0.606304545112 -17.669690779 5.15493206018 6.77411282239 5.74958187678 4.52596141259 26.3907470774 0.510128702969 1.43692627768 10.0815062248 35.4644021835 -2.59260662979 -0.819211592829 -3.1065218706 34.6030472777 1.58791281604 1.90752702391 3.88396891558 44.9125303524 0.0942723376916 -0.271679155882 8.39859605279 47.4588849871 -0.100304754509 0.00800347519975 2 3 3 4 2 6 1 7 1 6 2 2 4 3 4 3 4 3 4 3 4 3 4 3 4 4 3 6 4 3 105.0 0.466666666667 59.0 0.576271186441 0.221768707483 0.248888888889 0.0306541410215 0.209027966742 0.0464822373394 0.00474673909565 0.0148638724356 0.00335933587189 0.216563611864 0.571428571429 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 5.0 0.272727272727 0.0 5.0 1.0 0.561904761905 0.625 0.5 0.5 0.5 0.875 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.625 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -5.68713663315 4.15924917947 -9.63666908426 10.9715670683 5.02278853292 1.49167086219 0.682597360852 16.9663664004 -4.07400605393 0.264573937727 -8.49776249786 17.9457544965 2.25173676829 -0.34703349032 -3.48385557016 14.0104352339 -0.516439663971 -0.837556587649 -1.17939327422 5.71641981326 -0.0782665494888 -0.548028973771 -3.82366213373 -1.32768565084 0.127313883561 -0.076881566278 8 3 8 5 5 1 1 5 4 2 2 4 3 3 2 3 3 8 3 8 4 5 6 5 7 4 8 4 3 1 4 8 5 5 9 1 8 0 168.0 0.857142857143 75.0 0.693333333333 0.1875 0.199404761905 0.0639703798186 0.0922515707672 0.0254659155329 0.0202535447794 0.000237078389953 -0.00167031207719 0.0302736043683 0.416666666667 0.285714285714 0.0 2.0 3.0 0.0 1.0 2.0 0.0 1.0 1.0 8.0 0.178571428571 2.0 3.0 1.0 0.446428571429 0.0 0.25 0.833333333333 0.916666666667 0.0833333333333 0.75 0.916666666667 0.833333333333 0.25 0.833333333333 0.5 0.416666666667 0.5 0.666666666667 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.25 0.25 0.5 0.25 0.0 0.5 1.0 0.5 0.0 0.75 1.0 0.75 0.5 0.75 1.0 0.5 0.0 -10.6861176076 5.50221374689 -22.8733786588 11.2694332226 4.16262097515 -2.46156551925 -10.2298614885 6.23919248519 0.414946775233 1.53155975016 -3.66283432148 7.41361803717 -1.00730953095 -1.20039527059 -10.7160776891 6.06020784575 -0.331815187628 1.48749371223 -13.7703557654 13.591731319 0.35212923077 -0.0796563781137 -10.5014494578 15.2927137931 0.0875240871714 -0.164215149583 7 4 5 6 4 7 3 2 9 2 8 3 8 3 8 3 8 3 7 4 6 7 5 4 8 3 8 3 8 2 9 3 8 3 8 3 8 3 7 4 6 7 4 7 4 0 242.0 0.5 86.0 0.674418604651 0.123966942149 0.173929376409 0.02195888259 0.179542222932 0.0258396408591 0.00598595272613 0.0112674125025 -0.000122736578201 0.200530026736 0.636363636364 0.0 2.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 5.0 2.0 0.1875 1.0 3.0 1.0 0.355371900826 0.0555555555556 0.5 0.5 0.5 0.444444444444 1.0 0.944444444444 1.0 0.444444444444 0.444444444444 0.388888888889 0.444444444444 0.444444444444 0.0555555555556 0.0555555555556 0.0555555555556 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -11.2276578036 0.925992396171 -18.56052999 2.4894851586 10.9523950846 0.94751597976 7.38194292893 9.59726217715 -6.55607664352 3.15169696137 -5.40316309049 24.2000095833 3.2671936261 -0.0423915663742 1.20871138345 28.3298947395 -0.231748147665 -0.0975693135828 7.00754731043 22.3875835748 -0.655127536511 -1.26112554878 0.340457678936 14.2381865255 0.227447955682 0.240250794152 6 2 12 4 2 1 6 3 3 4 5 2 5 4 2 3 7 4 1 3 7 3 2 3 7 3 2 3 7 8 7 3 1 4 7 3 2 4 6 3 2 5 5 3 3 5 2 4 6 8 10 2 6 0 225.0 1.0 94.0 0.872340425532 0.198814814815 0.206518518519 0.0910208175583 0.0883328175583 0.0547632812071 0.0338749069585 0.0116535062306 0.0131845450616 0.0150911549467 0.533333333333 0.8 0.0 2.0 3.0 0.0 2.0 3.0 3.0 2.0 2.0 14.0 0.25 0.0 2.0 2.0 0.417777777778 0.125 0.625 0.875 0.75 0.5 0.3125 0.25 0.625 0.375 0.0 0.0 0.125 0.5 0.5625 0.5 0.625 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.05577490736 1.35812218105 -12.5443326021 7.40391589135 -7.56474054845 6.52351354298 -37.3215926463 32.2485783715 1.21436243315 2.09439207259 -32.9753682887 42.3823940656 2.46563359709 -3.07484793561 -15.0971577488 21.0571264665 -0.365560105286 -1.82199827316 -11.2447614198 1.58083011856 0.955874161857 0.0177373621057 -2.95272317767 -3.23400893133 0.171753176415 -0.237449294824 3 2 4 4 3 6 2 6 2 8 1 5 3 4 4 4 4 4 4 3 5 4 3 5 3 6 2 6 3 7 3 5 128.0 0.5 79.0 0.430379746835 0.2236328125 0.302734375 0.0304751396179 0.216728210449 0.0475330352783 0.00421963513016 0.00945190493061 0.00375723085989 0.235215165755 0.625 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 7.0 0.153846153846 0.0 2.0 1.0 0.6171875 0.625 0.75 0.5 0.75 0.75 1.0 1.0 1.0 0.875 1.0 1.0 1.0 1.0 1.0 0.875 0.875 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 -9.62887405706 2.14859173174 -17.6691730637 6.4334490402 7.12529219834 2.19894935045 -0.993191836418 16.5342650173 -4.11002292341 2.14430783709 -8.49813237888 28.1730511258 1.61496533051 0.344546957461 -8.6443025956 31.0739336889 -0.941963535145 -0.739822087406 -10.6905894578 23.1749339643 -0.299494761701 -0.690941459317 -16.8371241586 17.4308712938 0.0417586319021 0.206485776052 0 6 2 4 2 4 2 3 4 3 3 3 3 2 4 3 3 2 4 2 3 4 3 2 3 3 4 3 2 3 3 3 3 4 2 4 1 5 1 2 3 0 120.0 0.3 65.0 0.553846153846 0.298611111111 0.249583333333 0.0288744212963 0.351041087963 0.0610966435185 0.00176206189119 0.0141608354489 -3.74771904903e-05 0.492835929628 1.5 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 14.0 0.09375 0.0 6.0 1.0 0.541666666667 0.2 0.0 0.0 0.0 0.5 0.0 0.2 0.4 0.9 0.5 0.7 0.9 1.0 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.413802852039 1.30507053335 -1.02560248777 5.43708546538 -0.0590464838871 3.45032001129 -1.27843566937 17.6779001217 0.0925247261665 0.440548840226 -0.193614376322 21.5824040238 0.331966991745 -0.468747375895 1.55061762677 16.6529560255 -0.154763072743 -0.830803181355 1.0821450547 8.16085554234 -0.045895282267 -0.566805268599 -0.468137837826 0.687475470818 -0.0499498863037 -0.129183258657 3 3 6 2 4 13 2 4 3 8 1 4 3 12 6 3 3 4 6 2 5 3 5 3 5 3 5 3 6 2 5 3 6 3 12 4 12 4 12 5 11 6 1 1 8 12 4 4 3 6 3 2 7 4 2 2 9 3 2 3 8 3 2 4 6 4 3 4 3 5 5 9 5 0 352.0 0.727272727273 160.0 0.71875 0.183416193182 0.211647727273 0.0541507712349 0.134325011703 0.042896869754 0.0159337492734 0.0135355457308 0.00685201039251 0.082624574935 1.375 0.681818181818 4.0 8.0 8.0 2.0 4.0 4.0 2.0 5.0 5.0 12.0 0.190476190476 1.0 3.0 1.0 0.454545454545 0.708333333333 0.708333333333 0.75 0.708333333333 0.541666666667 0.333333333333 0.708333333333 0.208333333333 0.333333333333 0.125 0.333333333333 0.166666666667 0.75 0.458333333333 0.333333333333 0.75 0.166666666667 0.666666666667 0.833333333333 0.333333333333 0.166666666667 0.5 0.5 0.5 0.5 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.5 0.5 0.833333333333 1.0 1.0 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.5 0.5 -15.5682471606 2.9516007628 -35.3298152892 12.5503803165 2.98149462889 7.68320188837 -28.3010093395 37.4956587229 -0.433046991279 0.0243044543058 -26.1035495919 50.0390838829 -1.36184634818 3.88231593245 -33.6868757358 65.6835163991 0.830501616625 -1.83174515808 -26.2388823413 60.7979505013 1.14806505152 0.440993691433 -14.7369182632 54.5714803051 -0.0826656319189 -0.43242498563 0 4 3 4 4 12 3 6 3 4 2 5 5 4 1 5 5 3 3 3 7 2 3 3 7 2 3 3 6 3 3 3 7 3 2 3 7 2 3 4 5 3 2 5 5 4 1 6 3 11 4 5 1 0 210.0 1.07142857143 112.0 0.580357142857 0.215238095238 0.246258503401 0.0956695821186 0.0988644854767 0.0514855847101 0.032544875167 0.0102792818028 0.013730304913 0.0115081576304 0.533333333333 0.928571428571 1.0 2.0 1.0 2.0 2.0 3.0 3.0 3.0 3.0 7.0 0.236842105263 0.0 1.0 2.0 0.533333333333 1.0 0.875 0.75 0.875 0.625 0.375 0.25 0.5 0.5 0.0 0.0 0.0625 0.75 0.625 0.5625 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.26272345157 2.63136172579 -19.0457396538 8.06637202689 -9.15600703725 2.59514513429 -48.4593164214 17.1031712468 1.86899409135 -0.331692000576 -44.2601211984 14.0242848108 0.548661166296 -2.04137564012 -40.887850989 -1.44664075584 -2.97654194098 -1.03774898729 -61.6338120401 -12.8209870352 -0.0248984378957 0.0144274391432 -66.2021565565 -12.7125126238 0.145027079252 0.19635059715 1 8 1 8 8 5 4 2 5 3 3 4 4 2 3 6 4 1 3 7 3 1 2 8 6 8 6 8 3 1 2 8 2 3 2 6 2 4 3 5 2 5 7 9 3 6 0 196.0 1.0 78.0 0.935897435897 0.192419825073 0.174562682216 0.0915668641467 0.0754993401984 0.0479392090031 0.0364842432177 0.0110031815124 0.0128275777491 0.0139927161011 0.571428571429 0.714285714286 0.0 3.0 3.0 1.0 1.0 3.0 3.0 2.0 2.0 8.0 0.264705882353 0.0 2.0 2.0 0.397959183673 0.3125 0.625 0.625 0.4375 0.5625 0.25 0.0 0.4375 0.5 0.0625 0.0 0.25 0.625 0.6875 0.5 0.4375 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.54607659004 5.54768658777 -8.18333356726 16.7476815596 -6.72719639926 5.30547410878 -31.5545858397 37.2309318556 -0.0744497032539 1.47541471193 -31.7159281114 45.1378922816 3.23496027567 -1.15671319168 -11.1729389481 37.2253551824 -0.584106449533 -0.364882286878 -11.6125669484 32.6726961737 -0.852526623112 0.574334592692 -18.2356659368 37.2574856339 0.328924508474 0.0618059989971 4 13 2 6 1 7 2 6 4 4 3 6 4 3 4 7 3 3 5 5 4 3 6 4 4 3 7 3 3 3 8 3 2 4 7 3 13 4 13 6 1 2 8 12 6 12 3 7 1 7 1 6 8 2 1 5 9 2 2 4 8 2 4 4 7 2 5 6 1 4 3 0 340.0 0.85 173.0 0.676300578035 0.218685121107 0.229852941176 0.0665129248931 0.114998244453 0.0445096682272 0.0172599513219 0.00952525975867 0.00504827071754 0.0344429568308 1.47058823529 0.75 4.0 6.0 9.0 6.0 4.0 4.0 2.0 5.0 7.0 10.0 0.2 3.0 3.0 1.0 0.508823529412 0.64 0.44 0.48 0.76 0.76 0.64 0.64 0.68 0.6 0.52 0.44 0.56 0.64 0.32 0.12 0.52 0.333333333333 0.666666666667 0.333333333333 0.0 0.111111111111 0.333333333333 0.333333333333 0.888888888889 0.777777777778 1.0 0.888888888889 0.444444444444 0.666666666667 1.0 0.888888888889 1.0 1.0 1.0 1.0 1.0 0.777777777778 0.888888888889 1.0 0.666666666667 0.666666666667 0.444444444444 0.444444444444 0.333333333333 0.111111111111 0.555555555556 0.888888888889 0.222222222222 0.555555555556 0.0 0.0 0.333333333333 0.222222222222 0.555555555556 0.888888888889 0.222222222222 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.333333333333 0.444444444444 1.0 0.333333333333 1.0 0.777777777778 0.666666666667 0.444444444444 0.111111111111 0.222222222222 0.888888888889 0.555555555556 0.666666666667 0.111111111111 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 -13.7509870831 2.29183118052 -30.8468979016 8.11774842076 3.25058055771 3.22002280864 -22.1694064759 16.6501304548 -0.189171565359 -0.63459850459 -19.7140135593 28.0285260356 -1.43466272429 7.27511083395 -24.7397488029 65.9794081274 2.11077127609 -0.827754337705 -9.84981190804 75.3367030341 0.634028747805 0.388432891081 -0.0139191401382 68.4209224279 -0.109579502588 -0.392162972736 2 7 5 7 4 2 4 3 10 2 10 3 9 3 9 3 3 2 4 3 2 3 4 3 1 4 4 3 1 4 3 4 1 4 2 6 2 4 1 4 1 0 156.0 0.923076923077 74.0 0.716216216216 0.233974358974 0.246548323471 0.0884381479796 0.124565906371 0.0628350528498 0.0229992781396 0.0122513750485 0.0127138879632 0.0257537053346 0.583333333333 0.538461538462 2.0 3.0 2.0 0.0 1.0 0.0 2.0 3.0 6.0 8.0 0.151515151515 1.0 2.0 1.0 0.474358974359 0.333333333333 0.0 0.5 0.833333333333 0.583333333333 0.0 0.5 0.75 0.5 0.0 0.0 0.25 0.75 0.333333333333 0.333333333333 0.666666666667 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.46912255162 -3.42795262044 -0.584487896673 -6.96066277184 -5.52355307277 2.15645168228 -15.2856526859 1.8554242308 2.83235470427 1.98547155687 -7.65377498699 14.2684369521 -0.380838803599 0.51315231726 -5.39792346459 20.1166403294 -0.576212643824 0.408963502285 -10.9246511419 23.3575992687 0.115476528971 0.0259004489938 -11.4927343308 23.9877765053 -0.0940181467667 0.0168819884927 3 2 11 5 9 6 10 5 11 4 11 4 12 3 11 4 11 4 11 4 3 3 6 3 3 4 5 3 5 3 4 3 6 2 3 3 6 3 3 2 8 2 3 2 8 3 2 3 7 2 3 4 5 3 3 4 5 3 3 4 5 3 2 5 4 11 4 11 4 5 345.0 0.652173913043 135.0 0.681481481481 0.160579710145 0.219911783239 0.0472621206725 0.167030796721 0.0658418490818 0.0173993138571 0.0247145430148 0.019509665222 0.141052615174 0.466666666667 0.608695652174 4.0 2.0 4294967294.0 2.0 0.0 1.0 5.0 5.0 2.0 8.0 0.159090909091 1.0 0.0 2.0 0.391304347826 0.625 0.416666666667 0.375 0.541666666667 0.708333333333 0.75 0.541666666667 0.625 0.0 0.0833333333333 0.0416666666667 0.0 0.0 0.291666666667 0.458333333333 0.458333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.333333333333 0.0 0.333333333333 0.5 0.833333333333 1.0 0.833333333333 0.833333333333 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 0.166666666667 0.333333333333 0.5 0.5 0.5 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -9.63233394713 -9.63233394713 -21.7514081187 -23.8943572651 2.35204504048 -0.114274478742 -13.8478741914 -19.2987018383 0.774263657774 5.10753555961 -11.6926990661 2.53714378442 -3.35255251031 -1.98875232843 -27.7668403647 3.16571772854 1.43331655804 2.56648720282 -23.1706352842 18.21979937 -0.134660296442 0.62880506026 -23.0822132416 27.8454418493 -0.35658618943 -0.211895008103 5 4 8 10 5 6 1 4 3 5 5 3 1 5 6 3 2 4 7 2 1 5 7 8 7 7 8 8 6 9 6 3 3 5 3 4 4 10 6 8 10 1 7 0 225.0 1.0 114.0 0.622807017544 0.221925925926 0.229333333333 0.0908970315501 0.0883247407407 0.0521370864198 0.0301059277029 0.00962154333059 0.0107857053791 0.00436778561317 0.6 0.666666666667 1.0 2.0 3.0 1.0 1.0 3.0 3.0 1.0 3.0 12.0 0.205128205128 0.0 3.0 3.0 0.506666666667 0.4375 0.875 1.0 0.6875 0.8125 0.5625 0.4375 0.75 0.625 0.0 0.0 0.3125 0.5625 0.375 0.3125 0.6875 0.0 0.0 0.25 0.75 0.75 0.75 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.75342763368 3.22554018 -14.3973268033 13.8224723162 -4.41389708842 9.17185179603 -29.9936345101 46.193343177 0.0958398319369 0.493836698747 -29.9421761657 48.8425410966 1.28801669652 -3.96485233974 -19.4495202104 21.9530343097 0.657109817976 -0.430545291686 -9.7394230042 10.8740845658 1.02040137182 -0.287642063215 1.35333365975 4.58248203238 0.133829474063 -0.472719996217 0 5 4 4 2 5 4 5 2 4 5 4 2 5 4 4 2 5 4 5 1 5 4 4 2 5 4 3 3 4 5 3 3 4 5 3 3 5 4 3 4 4 3 5 4 11 5 3 4 1 3 0 195.0 1.15384615385 109.0 0.577981651376 0.251282051282 0.245364891519 0.110154250746 0.0804202363492 0.0514277044455 0.031663872939 0.00725099204574 0.00551954203108 -0.0191925108149 0.2 0.923076923077 0.0 1.0 1.0 1.0 3.0 3.0 3.0 2.0 2.0 6.0 0.264705882353 0.0 1.0 2.0 0.558974358974 0.875 0.75 0.75 0.375 0.5625 0.75 0.625 0.8125 0.125 0.0 0.0 0.375 0.875 0.75 0.75 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.0 0.0 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.60225399683 3.81971863421 -16.9627579665 12.2841320282 -4.51349271503 4.64251432223 -28.6566218106 28.7211397103 3.41336344755 0.0601849329492 -17.0962764507 29.4498880172 -1.20114933883 -1.44984926878 -17.8543255953 19.0193492763 0.18702142626 -0.184809838191 -15.7568071237 12.857506728 1.56072289929 -0.957842912215 -1.40954673306 1.14490740735 0.0288957100185 -0.390486086862 1 4 1 5 1 6 1 4 31 5 1 5 2 4 3 3 3 3 3 2 4 2 4 2 4 2 4 3 3 3 1 12 132.0 0.272727272727 65.0 0.630769230769 0.203282828283 0.249311294766 0.0181719919581 0.427856387567 0.055666861452 0.00206264193113 0.0251305693121 0.00404227243537 0.78314661296 1.5 195225785.955 2.0 2.0 1.0 2.0 4294967295.0 4294967292.0 0.0 0.0 5.0 2.0 0.115384615385 0.0 7.0 1.0 0.492424242424 0.5 0.333333333333 0.25 0.166666666667 0.666666666667 0.333333333333 0.666666666667 0.583333333333 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 0.833333333333 0.75 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -3.41459696088 -1.9098593171 -5.90261397131 -1.51684690107 2.5467182404 4.88513602185 -2.65599130649 16.8935106067 -3.05907835251 1.84616018253 -7.4590405647 27.4764679327 3.24827313752 -1.23182815047 1.50953332201 22.8485046776 -2.10734712135 0.679624140259 -2.15180183279 22.1145159051 1.34030208442 -1.11868921258 -0.0361130495289 12.5988290023 -0.22329562331 -0.232948514368 1 9 3 5 2 3 3 4 3 4 2 3 5 3 3 1 6 3 9 4 6 7 3 5 2 3 3 4 3 3 3 3 3 3 3 5 1 20 1 4 4 3 1 0 169.0 1.0 99.0 0.575757575758 0.254893035958 0.28812016386 0.0879653617949 0.113653554553 0.0563875637093 0.018583895106 0.00593361796599 0.00752060113305 -0.00154480333524 1.0 0.692307692308 3.0 5.0 4.0 1.0 2.0 2.0 2.0 2.0 4.0 12.0 0.230769230769 0.0 3.0 2.0 0.585798816568 0.875 0.25 0.5625 0.875 0.4375 0.1875 0.5625 0.625 0.75 0.6875 0.6875 0.75 0.375 0.5 0.4375 0.75 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.75 0.5 0.25 0.0 0.25 0.75 0.5 0.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 -1.56706405506 -3.42795262044 -6.38009978534 -7.84228265405 -3.51430341342 0.854235361374 -16.4412069389 -3.95815390713 1.28877726933 1.02927909385 -15.4469676715 -0.370076622696 -1.50886092159 -1.47286271776 -21.3676692694 -6.18258570814 -0.132418270984 0.528736004669 -25.0721180606 -7.81533252236 0.310807121016 -0.973151681105 -19.6377202931 -14.5933227595 0.193059186531 -0.125362705021 1 5 9 6 9 6 10 5 10 5 11 3 12 3 12 3 12 3 4 1 7 3 3 3 6 4 2 5 4 4 4 4 3 3 6 3 3 3 6 4 2 3 6 4 2 3 6 4 2 3 7 3 2 3 7 2 3 3 6 3 3 3 5 3 4 5 3 2 7 5 6 0 330.0 0.681818181818 125.0 0.736 0.149898989899 0.190771349862 0.0450654200406 0.131976097059 0.0586579291538 0.0170485230474 0.0217054249541 0.0171295232837 0.0960771493221 0.333333333333 0.590909090909 0.0 2.0 1.0 1.0 0.0 2.0 5.0 5.0 2.0 5.0 0.15 3.0 1.0 2.0 0.378787878788 0.791666666667 0.5 0.5 0.5 0.708333333333 0.541666666667 0.583333333333 0.583333333333 0.0 0.208333333333 0.0833333333333 0.0416666666667 0.0 0.291666666667 0.625 0.458333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.166666666667 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -10.1280418331 -5.46914258989 -24.4066265198 -11.7558361243 0.63123887647 3.05760441197 -19.5275238925 4.0586644011 3.02789435609 4.91522530983 -8.36178541374 25.6159824752 -2.88759530287 -2.30890737881 -13.6189876651 23.6006061076 3.42208523262 2.32957340852 2.93357497189 29.1754312713 -0.927304736167 -1.78174578148 1.77259871684 22.6048323331 -0.233135541629 0.190753705138 2 8 4 3 3 4 2 3 5 3 2 3 5 3 9 4 9 4 7 2 1 3 5 2 3 2 5 3 3 3 3 2 5 3 3 4 2 6 1 6 1 4 3 2 9 0 169.0 1.0 77.0 0.909090909091 0.214383249886 0.208466090123 0.0849526053341 0.0935118833167 0.0543595157795 0.0233297921286 0.0116976483884 0.0106604825955 0.012584845857 1.0 0.692307692308 2.0 6.0 4.0 1.0 2.0 1.0 3.0 3.0 5.0 12.0 0.162162162162 0.0 3.0 1.0 0.455621301775 0.6875 0.1875 0.3125 0.625 0.3125 0.125 0.375 0.4375 0.6875 0.6875 0.5625 0.5 0.4375 0.5 0.4375 0.5625 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.25 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.75 0.25 0.0 0.25 0.5 0.5 0.25 0.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.5 0.391766013765 -0.979415034412 -2.26362143939 -2.05672764635 -4.37201598793 0.776577601249 -14.9298226908 2.51577703009 1.13864670595 1.54825144038 -16.4819580448 7.91199783727 -1.97318248591 -1.62176363748 -25.89768655 -0.196568681664 -0.627364567155 -0.294942070841 -35.5186339552 -6.64123581366 -0.382720270963 -0.391196352201 -37.6820208415 -11.1068717026 0.109990082939 -0.140265179817 1 7 5 3 4 1 1 1 1 8 2 7 3 12 3 5 4 3 3 5 5 4 4 3 4 5 4 4 4 2 5 6 3 4 3 2 7 5 2 5 3 2 7 5 2 1 2 3 11 8 2 5 10 6 4 4 11 6 3 3 13 4 4 3 14 2 6 1 7 0 312.0 1.84615384615 145.0 0.675862068966 0.205795940171 0.17825443787 0.141681489858 0.0378614659194 0.0439680806845 0.0578100182716 0.0072001343626 0.00668861657359 -0.0191346529483 0.208333333333 1.69230769231 0.0 4.0 1.0 0.0 7.0 6.0 5.0 3.0 3.0 9.0 0.272727272727 1.0 1.0 3.0 0.464743589744 0.875 0.5 0.291666666667 0.0416666666667 0.5 0.541666666667 0.833333333333 0.708333333333 0.75 0.708333333333 0.583333333333 0.291666666667 0.375 0.416666666667 0.541666666667 0.458333333333 0.833333333333 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.166666666667 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 0.666666666667 0.5 0.833333333333 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 -10.689907011 12.9446020381 -22.8120043195 29.1973465864 4.8427588717 -2.77968529081 -4.87952372878 21.1953760469 2.09552489335 -1.26956435705 3.28945756873 7.70843680155 -4.48149446001 -0.59699596774 -15.6490012748 8.11741739022 2.66055695324 1.8856849298 -5.94995291154 13.8635368425 -0.214983321405 -1.94055323163 1.37674154915 9.30268608926 0.165779361205 0.600052375732 1 4 1 15 1 11 1 6 6 4 8 3 8 3 8 3 8 3 8 3 8 3 7 5 5 6 6 3 6 0 154.0 0.785714285714 72.0 0.513888888889 0.181227863046 0.170222634508 0.0452434435189 0.0985999369158 0.0283092897994 0.011056119783 0.00780779373489 -0.00149287624789 0.047800120949 0.363636363636 0.0714285714286 1.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 3.0 4.0 0.16 0.0 1.0 1.0 0.467532467532 0.833333333333 0.25 0.0 0.25 1.0 0.833333333333 0.666666666667 0.833333333333 0.916666666667 0.75 0.666666666667 0.833333333333 0.833333333333 0.0833333333333 0.0 0.166666666667 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -8.63983976785 5.63863226954 -16.8446099984 15.5787984318 5.05908555257 2.99935146398 -5.58207817923 26.4506675977 -3.11572765683 -0.165518489338 -11.0130120858 25.538406576 1.39575818644 -0.697129264486 -9.30263459955 19.8658154702 -0.371158059352 -0.0521282267024 -7.43039247156 16.8649009078 0.067990568048 -0.55355189123 -7.79113082094 9.42664175501 0.173466119105 -0.329461772756 8 5 9 5 10 4 10 4 10 4 10 4 10 4 4 4 1 5 4 10 3 11 2 3 5 4 2 3 6 3 1 3 7 3 1 3 7 3 1 3 7 3 1 3 7 3 1 4 6 3 2 4 4 4 3 5 2 5 2 12 280.0 0.7 134.0 0.537313432836 0.25943877551 0.257678571429 0.0783560040087 0.158244852405 0.0617196155248 0.0167349532109 0.0106693990309 0.00754165044802 0.0664108702227 0.571428571429 0.5 0.0 3.0 4.0 0.0 0.0 1.0 5.0 4.0 6.0 6.0 0.127659574468 0.0 2.0 2.0 0.478571428571 0.0 0.1 0.6 0.8 0.0 0.4 0.5 0.05 0.35 0.5 0.45 0.0 1.0 1.0 0.9 0.75 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.833333333333 0.5 0.666666666667 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 -0.541126806512 -5.76140893993 -4.24504452564 -18.7500192891 -3.2841622507 -5.46967792924 -8.37465891923 -26.1361591041 5.4872725082 9.67352497634 11.2154068391 13.2709735614 -1.82386215188 -0.713142165309 9.06075561493 27.4465841265 0.0298470605404 1.16962927273 4.72256836408 27.1525642881 0.325943876005 -1.38868166464 6.93121106038 19.0647283491 -0.20217230423 -0.065949356211 1 1 3 5 3 1 1 2 15 1 4 2 1 2 3 5 3 5 3 4 4 4 4 5 3 5 4 4 5 3 7 2 5 1 0 120.0 0.533333333333 68.0 0.529411764706 0.194791666667 0.265555555556 0.030666087963 0.198053240741 0.044244212963 0.00583506869007 0.013749297773 0.003718277905 0.20242553975 0.625 0.133333333333 1.0 0.0 2.0 2.0 1.0 1.0 0.0 0.0 1.0 8.0 0.153846153846 0.0 3.0 1.0 0.566666666667 0.75 0.75 0.75 0.625 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.625 0.5 0.75 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 -9.16732472209 2.97089227105 -17.0642356938 9.43274414598 6.58915611506 3.47339747804 -1.1408638496 22.2298976853 -3.6768894515 0.632641815732 -9.87702727591 27.0767702936 0.24214509949 0.00676680184973 -14.7866247937 27.1694106351 0.155255438934 0.287744963617 -12.977515507 28.5924582004 -0.822284099745 0.0698014677571 -21.7761283249 31.2826337954 -0.194472119355 0.241395654037 0 12 2 7 1 5 2 5 3 4 3 3 5 4 2 2 6 4 1 3 6 3 2 3 6 3 3 2 6 3 3 2 5 4 2 3 6 3 1 5 4 10 3 9 6 4 1 0 182.0 1.07692307692 103.0 0.543689320388 0.268838304553 0.246407438715 0.118308195246 0.0953833480853 0.0535787271538 0.0324146421623 0.0079232689855 0.0108933069774 -0.0169096870956 0.571428571429 0.923076923077 3.0 1.0 3.0 0.0 2.0 3.0 3.0 3.0 8.0 9.0 0.0487804878049 0.0 1.0 2.0 0.565934065934 0.8125 0.625 0.625 0.875 0.8125 0.3125 0.25 0.3125 0.5 0.0 0.0625 0.25 0.875 0.75 0.8125 0.9375 1.0 0.75 0.25 0.0 0.25 0.5 0.25 0.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.40965806739 3.91066431597 -1.01040407946 12.1399310957 -6.08013643383 4.07074727623 -18.2104125795 26.5060913102 2.61175041892 -0.00568647250114 -9.54906143238 27.1798349195 0.942300263201 -1.02152748775 -2.02998350439 19.4822261274 -1.7766652328 0.115749050855 -13.8300626086 20.0035801446 0.153297670847 0.839166581832 -14.8838349773 28.3242026054 0.211713488026 0.120631774381 7 2 9 8 7 3 3 4 4 3 5 4 2 3 7 3 2 3 7 3 2 3 7 8 8 7 7 4 1 3 7 4 1 3 7 3 2 4 4 4 4 10 6 8 4 0 210.0 1.07142857143 97.0 0.711340206186 0.217142857143 0.233673469388 0.101680596048 0.0936854551344 0.0570599287334 0.0361545148921 0.00974011713629 0.0124117837569 0.00685286993459 0.533333333333 0.714285714286 0.0 2.0 3.0 1.0 1.0 3.0 3.0 2.0 1.0 11.0 0.297297297297 0.0 2.0 3.0 0.461904761905 0.25 0.6875 0.875 0.6875 0.5625 0.3125 0.25 0.5 0.4375 0.0 0.0 0.3125 0.5625 0.5625 0.4375 0.6875 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.41389708842 1.69765272631 -17.7608344746 7.50810645095 -10.8423420787 5.22424332311 -56.7855775977 26.1793025759 -1.62548781437 0.424170060941 -69.4163716335 27.5045325174 1.1610071967 -2.92407185652 -64.9440330416 7.45689237569 -2.30733977988 -0.572930976149 -80.4571976616 0.823207805913 -1.06486287738 1.54470695569 -95.1688636878 17.5241133808 -0.196083092379 0.498187518249 5 4 9 7 1 1 3 3 4 5 1 3 6 4 1 3 6 4 1 3 6 3 1 4 6 8 6 8 6 8 6 4 1 3 6 3 3 3 5 2 5 3 1 4 8 4 5 0 196.0 1.0 94.0 0.670212765957 0.234329446064 0.216472303207 0.105101164268 0.0857407415278 0.0512629197868 0.0347840510461 0.00827797360841 0.00995437172909 -0.000230460346457 0.5 0.857142857143 0.0 2.0 3.0 0.0 2.0 3.0 3.0 3.0 1.0 6.0 0.371428571429 0.0 2.0 3.0 0.479591836735 0.3125 0.8125 1.0 0.625 0.5 0.25 0.25 0.4375 0.5 0.0 0.0 0.1875 0.625 0.75 0.75 0.625 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.45513090827 2.63742477124 -9.09248309842 9.42421732872 -8.1758311874 5.01222068594 -36.095604848 30.0158146625 0.629157756829 2.94463632974 -37.0733371009 46.0169897977 1.27518080512 -0.773826297928 -27.9814454699 40.5746720181 -0.99572834529 -1.47943028972 -31.4095797258 26.6103946987 0.487412946505 -0.120711624747 -30.1652693528 23.0673796675 -0.114667478688 0.110903705242 7 3 4 8 2 9 2 4 3 1 3 3 8 3 8 3 8 2 9 2 7 8 3 7 6 3 8 3 8 3 8 3 8 3 8 3 7 4 7 4 7 5 6 5 5 7 4 0 242.0 0.5 96.0 0.666666666667 0.136739293764 0.184635612322 0.0226162124815 0.180624107778 0.0260815179381 0.005547307836 0.00941826280897 -0.000429146568043 0.197304691257 0.727272727273 0.0454545454545 2.0 0.0 4.0 0.0 1.0 0.0 0.0 0.0 7.0 2.0 0.117647058824 1.0 2.0 4.0 0.396694214876 0.222222222222 0.555555555556 0.444444444444 0.555555555556 0.777777777778 0.888888888889 1.0 1.0 0.555555555556 0.444444444444 0.444444444444 0.444444444444 0.444444444444 0.166666666667 0.0555555555556 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.166666666667 0.5 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.166666666667 0.666666666667 0.666666666667 0.5 0.5 0.666666666667 0.5 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.5 0.166666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 -12.5008973483 4.94827186704 -21.7808673672 13.7175358544 10.8191880172 3.41561335233 4.28347795257 30.517835213 -5.90036729062 3.5320474902 -5.65174306576 45.6018260312 2.87790248631 -1.15132464057 -1.84226520112 45.0785915267 -0.875670452908 0.936250889576 -0.153176971847 42.6202562765 -0.113093318011 -1.63619098419 -4.09340113271 36.1357922955 0.13322341436 0.439126982998 1 3 12 2 3 2 8 1 3 4 4 4 3 4 4 4 3 6 2 4 3 5 3 5 2 5 2 7 2 4 1 8 3 2 1 7 3 12 3 12 6 10 8 7 11 4 3 4 4 2 4 7 3 1 3 8 2 2 3 8 2 2 3 8 2 3 6 1 3 12 1 6 0 315.0 0.714285714286 129.0 0.945736434109 0.166560846561 0.178987150416 0.0494507352618 0.117406535571 0.0370358212656 0.0154435968779 0.0128437869965 0.00676323116415 0.0702635270384 1.6 0.666666666667 3.0 7.0 7.0 3.0 4.0 4.0 1.0 5.0 7.0 8.0 0.3 2.0 3.0 1.0 0.409523809524 0.625 0.541666666667 0.666666666667 0.666666666667 0.416666666667 0.375 0.666666666667 0.208333333333 0.5 0.166666666667 0.416666666667 0.166666666667 0.791666666667 0.25 0.458333333333 0.416666666667 0.166666666667 0.5 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.5 1.0 0.833333333333 0.166666666667 0.666666666667 0.833333333333 0.5 0.833333333333 0.833333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.666666666667 0.833333333333 1.0 0.5 0.5 0.0 0.0 0.5 0.333333333333 0.666666666667 0.833333333333 0.166666666667 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.666666666667 0.666666666667 0.0 0.5 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.833333333333 0.333333333333 0.0 0.166666666667 0.166666666667 0.333333333333 0.666666666667 0.0 -13.0961781744 1.94017454436 -28.4950941813 8.6765990535 4.13276975648 5.37342558756 -17.9706873629 24.6263381038 -0.661307507301 -0.829772511527 -12.9519439502 32.0228558077 0.944966457375 3.75353750285 -6.75100531538 43.945065469 1.45413239013 -2.8485332308 9.02614714731 34.7361197302 0.859122415083 1.21111061942 15.598354112 31.2030427243 -0.319868739361 -0.419080571464 1 3 3 4 1 1 1 13 1 6 5 2 2 5 5 2 3 4 5 2 3 3 6 2 3 3 5 3 3 2 6 3 3 3 5 3 3 3 6 2 2 4 5 4 1 5 3 11 3 5 182.0 1.07692307692 98.0 0.581632653061 0.245290423862 0.247252747253 0.107858615844 0.0994035399451 0.0567283971915 0.0349270255938 0.0110185579156 0.0124551315256 -0.00305819266406 0.5 1.0 2.0 2.0 1.0 2.0 3.0 3.0 3.0 3.0 3.0 8.0 0.108108108108 0.0 1.0 2.0 0.538461538462 0.875 0.5625 0.5 0.75 0.6875 0.625 0.4375 0.625 0.4375 0.0 0.0 0.125 0.6875 0.5625 0.6875 0.8125 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.25 0.5 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.68289761212 2.09175068064 -8.08945939121 6.69677201616 -2.02794950083 2.62489653957 -12.4134290724 16.9170602445 2.55057230802 0.858373260786 -1.00671157699 21.1286709458 0.270529050726 -0.92255871884 3.0602722467 14.743431124 -0.863916683445 -0.429617420444 -3.52583483127 11.2521940476 -0.152410057467 0.935765011012 -8.27294111939 21.5547297884 -0.129571853548 0.391649318931 1 8 3 3 1 4 2 1 5 3 9 2 9 2 8 3 7 4 3 2 4 2 2 2 4 3 2 2 4 4 1 3 3 8 2 6 7 1 3 0 143.0 0.846153846154 63.0 0.920634920635 0.212968849332 0.204948897257 0.0757107824446 0.113056291843 0.0572373980365 0.0191373031305 0.0156953277171 0.0137779746757 0.0347032232119 0.727272727273 0.538461538462 2.0 2.0 4.0 0.0 2.0 0.0 2.0 3.0 2.0 6.0 0.0769230769231 2.0 1.0 1.0 0.440559440559 0.416666666667 0.0 0.5 0.666666666667 0.416666666667 0.0 0.0833333333333 0.166666666667 0.5 0.25 0.333333333333 0.333333333333 0.916666666667 0.833333333333 0.916666666667 0.833333333333 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.25 0.25 0.0 1.0 0.75 0.25 0.0 0.25 0.75 0.5 0.25 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.0979415034412 -1.17529804129 -3.75057559751 -1.54200622588 -4.67916981529 2.07241903139 -16.3693829125 6.33792864902 2.23209992869 0.793257250867 -11.8304427643 9.99448964536 -1.04878791816 -1.19553278148 -12.3019850368 3.31329981551 0.419090383046 -0.169776552381 -12.3700303661 -2.20995559425 -0.108191503807 -0.836103039459 -11.3718234514 -10.9057514753 0.00899912138983 -0.204495448761 0 5 10 5 11 4 12 2 13 2 13 3 12 2 13 2 13 2 13 2 4 1 1 1 7 1 4 5 5 1 6 4 3 2 7 3 3 2 7 4 2 3 7 3 3 1 8 3 2 3 7 3 2 3 6 3 3 3 6 3 3 3 5 3 5 9 9 3 6 0 330.0 0.681818181818 99.0 0.969696969697 0.129090909091 0.162534435262 0.0444413557058 0.127333388986 0.0602120377327 0.018736108762 0.0282448221557 0.0205757371175 0.0991870053717 0.6 0.545454545455 2.0 3.0 2.0 1.0 0.0 2.0 5.0 4.0 2.0 7.0 0.279069767442 1.0 1.0 2.0 0.3 0.708333333333 0.458333333333 0.375 0.416666666667 0.416666666667 0.291666666667 0.291666666667 0.541666666667 0.0 0.125 0.0833333333333 0.166666666667 0.0 0.208333333333 0.541666666667 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.5 0.333333333333 0.166666666667 0.5 0.333333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 1.0 0.833333333333 1.0 0.666666666667 0.666666666667 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.166666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -4.62996198086 -9.8676064717 -13.5003606963 -21.2679180166 -2.39724890992 4.66206799304 -15.406642101 -0.152938408548 5.04208425409 5.64905104069 1.01120830888 27.671320468 -3.17174989171 -2.32820428386 -4.90211863656 22.6092935479 2.27967844843 0.440621742755 2.88620326422 12.6556681433 -0.580272018458 -2.66635739544 1.56974382247 -6.74314251699 -0.303099214731 0.0859557074616 1 6 9 7 10 6 11 5 11 5 12 4 12 3 13 3 13 3 13 4 12 5 3 3 5 4 5 2 5 3 6 3 3 4 7 3 2 4 7 3 3 3 7 2 4 3 7 3 2 4 7 2 3 4 6 4 2 4 6 12 3 5 1 7 3 5 6 1 9 0 368.0 0.695652173913 139.0 0.690647482014 0.153532608696 0.198842155009 0.0475935162735 0.141230646132 0.0619290075101 0.0188760335944 0.0242239565537 0.0195644263465 0.104072434869 0.5 0.521739130435 4.0 3.0 4294967294.0 3.0 0.0 0.0 5.0 5.0 2.0 5.0 0.2 1.0 1.0 2.0 0.377717391304 0.625 0.25 0.333333333333 0.5 1.0 0.875 0.833333333333 0.791666666667 0.25 0.166666666667 0.125 0.0833333333333 0.0 0.0833333333333 0.166666666667 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.333333333333 0.166666666667 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.333333333333 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -10.0475207552 -8.63588560777 -20.7734075755 -19.4824265992 4.49422060557 2.8819772386 -10.3389957891 -4.15159337843 -2.3485747772 5.88075947369 -14.6485906586 24.9976364924 0.246606851438 -1.3070092328 -15.8231411256 25.5623872757 0.754794751066 0.371539955384 -9.25284316391 22.6684250276 -0.308175893745 -0.495608502567 -10.0442028221 19.5042489343 0.0734845815223 0.0363975892286 7 6 6 3 2 3 5 3 4 2 4 4 2 4 4 11 3 10 1 5 11 4 10 4 10 4 11 4 11 4 11 6 3 0 182.0 1.07692307692 77.0 0.714285714286 0.198587127159 0.175824175824 0.0820918002418 0.0687460106612 0.037297082823 0.0261885797069 0.0076572573432 0.00205344445254 0.00632581823995 0.714285714286 0.230769230769 0.0 1.0 6.0 2.0 2.0 1.0 0.0 0.0 5.0 14.0 0.135135135135 1.0 3.0 1.0 0.423076923077 0.0625 0.4375 0.625 0.1875 0.5625 0.875 0.6875 0.75 0.5 0.625 0.0 0.4375 0.8125 0.75 0.0 0.125 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.5 1.0 1.0 1.0 1.0 0.5 0.25 0.5 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 -7.32112738223 6.72998045074 -14.1305070635 15.4405845911 5.28714576986 -0.583722794197 3.82474884101 17.705507196 1.2348949173 2.36012756183 14.1379723537 23.7199025693 -0.884817902862 -1.88554198696 9.53882865419 12.6740583011 0.130620578745 -1.37642217076 7.6239205991 -0.200793457306 -0.351150029528 0.753485897413 6.26426813624 4.94977501401 0.167362143303 0.184988642744 4 1 2 5 1 4 2 5 2 4 2 4 2 4 2 3 3 3 4 2 4 2 9 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 126.0 0.285714285714 69.0 0.623188405797 0.279100529101 0.2649281935 0.0242919331166 0.389833211356 0.057577675397 0.00157017711476 0.0130618239591 9.57265757181e-05 0.644431849225 1.0 204522252.143 0.0 1.0 1.0 1.0 0.0 0.0 4294967295.0 0.0 7.0 2.0 0.08 2.0 4.0 0.0 0.547619047619 0.25 0.0 0.0 0.25 0.666666666667 0.333333333333 0.333333333333 0.666666666667 0.833333333333 0.833333333333 0.75 1.0 0.916666666667 1.0 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.87954408985 2.84963136203 -3.79448404471 7.67506292582 0.818717361937 1.28396329859 -2.72696946824 13.3583734903 -0.885040153843 1.22407513311 -3.78722108329 22.6312809462 1.00807977943 1.94830732091 -0.368186196308 33.4451735263 -0.452144267871 -0.799966884531 -0.612715657802 29.5069409798 0.206797397535 -0.65498896785 -1.06042802584 17.3601238316 -0.0578469717503 -0.444993781229 10 1 5 1 5 4 3 12 1 6 3 4 2 5 4 3 2 4 5 4 1 4 5 3 2 4 5 3 2 4 5 4 1 3 6 4 1 3 6 3 2 3 6 3 2 5 3 11 2 11 4 3 2 0 210.0 0.933333333333 115.0 0.608695652174 0.254761904762 0.273968253968 0.0981761148904 0.112482561278 0.0559856386999 0.0277129772268 0.00558751570045 0.00947981331266 0.00696148834922 0.5 0.866666666667 1.0 2.0 2.0 0.0 1.0 3.0 3.0 3.0 7.0 14.0 0.0666666666667 0.0 1.0 2.0 0.547619047619 0.5 0.8125 0.75 0.75 0.4375 0.625 0.4375 0.375 0.4375 0.0625 0.0 0.0625 0.75 0.8125 0.75 0.8125 0.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 -3.5226294071 3.48018808894 -12.5513232782 9.39757972253 -5.62545525076 1.55618166579 -29.0087737733 15.3126338982 2.62185067878 0.0731457779609 -18.9667215428 15.4936131772 0.887203002337 -0.27866472549 -9.86027311581 13.9940889168 -0.785949105637 0.565416827198 -13.6522582675 19.8318714988 0.216578151686 1.16405191555 -16.0822358834 32.0229368275 -0.298510347693 0.109446312259 0 3 2 7 1 18 4 4 1 3 5 4 1 3 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 3 5 4 1 2 1 1 4 2 1 1 156.0 1.08333333333 88.0 0.454545454545 0.274654832347 0.225427350427 0.129775820142 0.0831046966402 0.0508811468501 0.03965898968 0.00884561356773 0.0111969160958 -0.0205972610492 0.153846153846 1.08333333333 0.0 1.0 0.0 1.0 2.0 3.0 3.0 5.0 7.0 6.0 0.102564102564 0.0 1.0 2.0 0.564102564103 0.916666666667 0.833333333333 0.75 0.75 0.666666666667 0.333333333333 0.25 0.25 0.75 0.166666666667 0.0 0.0 0.916666666667 0.916666666667 0.75 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -0.391766013765 5.28884118582 -4.48335319766 14.531642507 -5.45458834549 2.77133887252 -24.4910871218 25.1684032048 -1.43995031081 0.35868790928 -34.4654642499 26.6549377467 0.40981231289 -0.729620106954 -33.8836756378 20.6855025008 -0.968373274943 -0.408337147515 -39.7057706287 16.6824789818 -0.211797551432 0.457098289644 -44.057164765 21.8752468662 -0.146959322641 0.280148724771 4 7 7 10 4 5 2 5 2 4 6 9 6 8 7 8 8 7 8 8 7 8 6 4 1 4 6 3 2 5 3 4 4 11 6 4 1 2 4 0 210.0 1.07142857143 116.0 0.51724137931 0.252380952381 0.253401360544 0.109781341108 0.0917465716445 0.049107547781 0.0337292893993 0.00613642823804 0.00723963684718 -0.0118559168079 0.533333333333 0.785714285714 0.0 2.0 3.0 1.0 1.0 3.0 3.0 2.0 3.0 15.0 0.121951219512 0.0 2.0 2.0 0.552380952381 0.375 0.9375 1.0 0.75 0.8125 0.375 0.375 0.6875 0.625 0.0 0.0 0.3125 0.75 0.4375 0.3125 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.25 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.90460127052 3.77727731605 -13.7660031148 14.113147848 -6.65706222412 7.72941286291 -37.9656986756 42.5221505908 -0.993860398541 1.36552059355 -45.0139212118 50.1158970092 1.00827027981 -2.44675184238 -39.7428881625 35.337868353 -0.998409703205 0.680845987381 -44.7367162397 39.7184051117 -0.180386857975 2.27201395537 -47.6864974174 64.3619735932 0.0154597391629 0.448650864126 3 4 1 1 5 4 1 4 3 4 3 3 3 3 4 3 4 1 6 3 9 4 9 3 9 4 5 4 2 3 3 6 1 3 2 13 1 12 1 6 1 4 10 1 3 0 182.0 0.928571428571 93.0 0.698924731183 0.233305156382 0.256671899529 0.0778831722558 0.113087552467 0.0620830684833 0.0173940901514 0.0101457124332 0.00971971461429 0.0152370193638 0.846153846154 0.571428571429 3.0 3.0 4.0 1.0 3.0 2.0 2.0 1.0 4.0 14.0 0.108108108108 0.0 3.0 1.0 0.510989010989 0.6875 0.25 0.3125 0.8125 0.5 0.0 0.5 1.0 0.75 0.6875 0.75 0.875 0.1875 0.375 0.375 0.8125 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.5 0.25 0.25 0.5 0.75 0.5 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.75 -2.54647908947 -3.50140874802 -8.68889943011 -4.99626034474 -3.59885054991 5.28436171837 -20.3378124192 13.7846128394 0.224106674791 1.32941062427 -24.7606315372 23.5973327747 -1.91247325465 -0.615296726458 -33.6919967705 21.8650386246 0.196122076976 0.391415385593 -35.7363041567 17.4255067913 0.00312553141219 -2.13846317615 -33.3939621961 0.854374353399 0.0472335588295 -0.0301829982886 1 4 3 4 3 4 4 3 4 3 4 3 4 3 4 3 5 2 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 5 1 7 140.0 0.35 68.0 0.617647058824 0.20306122449 0.241785714286 0.0195987609329 0.314756195335 0.0546271865889 0.00173715499444 0.0198581950183 0.00369863534733 0.46290788092 0.285714285714 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.153846153846 0.0 8.0 1.0 0.485714285714 0.3 0.0 0.0 0.0 0.8 0.4 0.4 0.5 1.0 0.9 0.9 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.26535247486 -0.318309886184 -7.68776792044 0.300108060761 2.94293405271 1.77728324951 -3.17269567828 8.02812641302 -3.05919275977 1.89575421027 -8.39588369421 20.7623362252 2.57329872163 1.61893151665 -3.76560346755 32.255765024 -2.09294949512 -0.017422696012 -7.17987332739 33.024137553 1.66604353165 -0.501665456053 -4.37146675988 27.3831390098 -0.423454265083 -0.0633705862238 1 3 2 15 1 10 2 5 7 4 8 2 8 3 8 3 8 4 6 4 7 5 6 6 4 7 5 5 6 4 6 0 165.0 0.733333333333 80.0 0.5125 0.163085399449 0.201616161616 0.0360328352394 0.124808192114 0.0243461613379 0.00900135305143 0.00565625451238 -0.00209540628529 0.0815635567526 0.545454545455 0.0666666666667 2.0 1.0 3.0 0.0 1.0 0.0 0.0 0.0 1.0 5.0 0.24 0.0 4.0 1.0 0.484848484848 0.833333333333 0.333333333333 0.416666666667 0.75 0.916666666667 0.916666666667 1.0 1.0 0.75 0.5 0.416666666667 0.75 0.75 0.0 0.0 0.166666666667 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.25 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.25 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -12.8172780837 3.05577490736 -25.8815107438 10.0272915169 6.73854955498 3.80726918088 -8.46904626008 22.1929805825 -2.3433559887 -0.936701898353 -10.4475950724 19.3399160193 0.0160996907944 -0.569296500797 -14.1320715309 12.748526326 0.660304245644 -0.346927555449 -6.70368138218 7.96399513348 0.466314144735 -0.548649259466 -0.366558281527 2.31526607372 0.199978921487 -0.0632428651652 1 0 8 2 8 1 6 1 6 4 6 3 4 3 5 4 6 4 2 5 4 4 6 4 1 7 4 3 5 4 2 7 4 3 5 3 2 9 3 2 2 2 3 2 2 9 7 2 6 11 6 2 6 11 5 4 4 12 4 5 4 13 3 5 3 23 1 8 0 325.0 1.92307692308 143.0 0.664335664336 0.207876923077 0.156213017751 0.151511450159 0.0325840691853 0.0423103504779 0.0590034027211 0.00780606859385 0.00708760563277 -0.0180407201682 0.24 1.53846153846 0.0 2.0 2.0 2.0 6.0 6.0 5.0 3.0 5.0 9.0 0.212765957447 0.0 1.0 4.0 0.44 0.785714285714 0.428571428571 0.214285714286 0.0714285714286 0.5 0.535714285714 0.75 0.428571428571 0.75 0.571428571429 0.607142857143 0.428571428571 0.464285714286 0.25 0.25 0.0714285714286 0.875 0.625 0.375 0.125 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.875 0.75 0.625 0.5 0.375 0.375 0.25 0.25 0.375 0.5 0.5 0.75 1.0 0.625 0.5 0.5 0.5 0.5 0.5 0.625 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.625 0.5 0.5 0.375 0.25 0.375 0.75 1.0 0.625 0.375 0.25 0.375 0.5 0.5 0.5 0.5 0.875 0.625 0.375 0.25 0.125 0.0 0.0 0.0 -6.21340897831 15.3298041186 -14.194757596 31.9344195094 1.77805355943 -6.76198168968 -5.1857286891 13.8539135884 2.68733091872 1.02310212253 3.52743075316 6.42959243662 -3.68988980507 -1.09322066746 -10.757973926 7.20283394146 1.9145736364 1.49434080912 -3.92412435224 9.40130886978 0.405042882458 -1.71048012333 4.7394366539 4.11431645939 -0.199333263423 0.426043134998 8 1 2 1 3 3 3 4 3 6 2 5 1 6 2 5 2 4 5 4 1 3 6 3 2 4 5 3 2 3 6 3 2 3 6 3 2 4 5 3 2 4 5 3 1 5 5 3 1 5 4 4 1 1 1 1 8 1 2 0 196.0 1.0 98.0 0.734693877551 0.218294460641 0.227405247813 0.0956471952588 0.0887491606388 0.0469330381049 0.032974205863 0.00634216152598 0.0111181813004 0.00811001619384 0.285714285714 1.07142857143 1.0 2.0 1.0 1.0 3.0 3.0 3.0 3.0 2.0 7.0 0.225806451613 0.0 0.0 2.0 0.5 0.6875 0.8125 0.75 0.875 0.4375 0.5 0.375 0.5 0.5 0.125 0.0 0.0625 0.6875 0.8125 0.75 0.8125 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.75 0.75 0.5 0.0 0.5 1.0 0.75 0.25 0.25 0.25 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 -2.86478897565 5.77505079219 -11.3248819797 15.3187602204 -6.31283673692 2.10706296379 -31.1458857041 23.0485417621 1.62852807391 -0.305971045769 -26.2491553925 20.9868440958 0.887574348878 -0.571228720591 -19.1619026556 15.8956249778 -1.29036633279 -0.152218370958 -26.7061859 13.2453063399 0.0606224399816 -0.121414278975 -30.1431978818 11.4856317079 -0.124556344421 -0.036820325059 1 2 11 4 10 4 11 3 11 3 11 3 11 3 11 3 12 2 12 2 11 5 1 5 3 4 3 5 3 2 5 4 2 3 6 4 1 3 6 4 1 3 7 3 1 3 7 3 1 3 6 4 1 3 6 3 2 3 6 3 2 4 3 4 3 9 4 0 308.0 0.636363636364 116.0 0.724137931034 0.146799628942 0.215023612751 0.0450757050969 0.163588222264 0.0634653943417 0.0174206605929 0.0231509908075 0.0189565645131 0.14284345311 0.571428571429 0.5 2.0 2.0 3.0 1.0 0.0 0.0 5.0 5.0 1.0 9.0 0.204545454545 1.0 1.0 3.0 0.376623376623 0.791666666667 0.666666666667 0.708333333333 0.75 0.208333333333 0.333333333333 0.375 0.291666666667 0.0 0.125 0.25 0.0833333333333 0.0 0.125 0.791666666667 0.666666666667 0.833333333333 0.666666666667 0.5 0.333333333333 0.166666666667 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 -10.4463517193 -11.4302186402 -26.1541900462 -25.9222815896 -0.611150198454 2.98017929878 -24.5197428322 -13.1282003702 3.45532475934 3.68162280802 -15.1047718396 6.31864342743 -4.52438234843 -1.14335898214 -28.9057573812 8.56523238025 3.11124791692 1.68467810285 -20.0840723089 12.3651801006 -1.63446260309 -1.83069819761 -24.6491106054 2.98355016338 -0.109760217766 0.0549651974466 9 1 10 4 2 4 2 6 1 5 4 3 1 4 5 3 2 3 6 2 2 3 5 3 2 3 5 3 2 3 5 3 2 3 5 4 1 3 5 3 2 3 5 3 1 5 3 4 1 5 2 5 1 1 1 1 10 0 195.0 0.866666666667 93.0 0.795698924731 0.211439842209 0.233162393162 0.0824375326624 0.108685041892 0.0508974190394 0.0267484505827 0.00795901821534 0.0111267940553 0.0317445264871 0.307692307692 0.866666666667 1.0 0.0 2.0 1.0 1.0 3.0 3.0 3.0 4.0 6.0 0.193548387097 2.0 0.0 2.0 0.476923076923 0.5 0.875 0.75 0.8125 0.25 0.3125 0.25 0.3125 0.5625 0.1875 0.25 0.3125 0.5625 0.6875 0.8125 0.8125 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.24413181578 3.48018808894 -14.4208617733 10.8744159558 -5.34194724547 3.76878905242 -26.7097365164 24.304726045 5.37576616447 -0.00778824386541 -4.60492099526 23.7687507593 0.256393198414 -1.71549096254 3.83520868086 11.6815060331 -1.05450071891 -0.193541825921 -3.56060255797 7.54482084463 0.558106231715 0.189979306343 -1.51160936882 7.26882099256 -0.0211185528229 -0.264517401044 2 1 4 4 1 5 1 5 2 3 26 1 1 2 2 5 1 5 3 3 2 4 2 3 3 3 3 4 2 3 3 4 2 4 1 5 1 7 3 1 1 0 138.0 0.260869565217 72.0 0.722222222222 0.192028985507 0.27756773787 0.0152176196086 0.444058229759 0.0509837630019 0.0016190668576 0.0153642383567 0.00359816857791 0.883181912756 1.5 186737708.435 2.0 2.0 1.0 3.0 0.0 4294967293.0 0.0 0.0 3.0 4.0 0.304347826087 0.0 5.0 1.0 0.521739130435 0.5 0.25 0.583333333333 0.583333333333 0.75 0.25 0.916666666667 1.0 0.75 0.333333333333 1.0 1.0 0.583333333333 0.25 0.833333333333 0.833333333333 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -5.0652790584 -1.60538899119 -8.55945156913 1.42224545957 4.23678908753 7.78897777219 -1.25875465982 27.0900344523 -3.9296320647 -0.343301567981 -6.76595344529 29.030719466 3.98479738943 -1.73991029846 3.11594640954 17.878341131 -2.88676839248 0.774623165181 -3.74210980244 16.6938375441 1.59474985676 -1.36113403879 -1.28041934406 7.98436303637 -0.177035897508 0.0483952497643 2 4 10 7 9 7 10 6 12 4 11 5 11 4 12 4 13 3 12 6 1 3 6 12 4 5 4 3 5 4 4 4 4 3 6 2 4 3 6 3 4 3 6 4 3 3 6 3 5 2 6 4 3 4 6 3 2 5 5 4 1 7 4 12 3 13 3 5 1 0 368.0 0.695652173913 164.0 0.579268292683 0.178328804348 0.244210775047 0.0504199852829 0.16225318661 0.0658325686925 0.016386805965 0.019311904442 0.0171746310806 0.121033144497 0.875 0.565217391304 6.0 3.0 3.0 2.0 0.0 1.0 5.0 5.0 4.0 7.0 0.163265306122 0.0 1.0 2.0 0.445652173913 0.666666666667 0.458333333333 0.416666666667 0.583333333333 0.958333333333 0.875 0.791666666667 0.666666666667 0.208333333333 0.333333333333 0.25 0.0416666666667 0.0 0.291666666667 0.541666666667 0.458333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.5 1.0 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 1.0 0.833333333333 0.5 0.833333333333 1.0 0.5 0.0 0.333333333333 0.5 0.333333333333 0.0 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 -11.6805888669 -10.8502152508 -25.9050421072 -28.1935302112 3.63972586549 -2.03475546214 -12.8333329424 -29.9298482068 1.82250076804 5.07049211885 -4.53694827501 -10.6839447814 -3.50408490932 -2.29685261585 -20.1261900341 -8.12084251632 1.79507138991 3.45651021468 -11.3564993002 6.25517419631 0.663962796769 -1.77653479861 -5.2227451617 1.42179148811 -0.483881667548 0.0818953982338 2 5 4 7 3 2 3 3 2 1 4 3 1 3 7 4 7 7 5 7 3 7 6 6 5 6 3 3 1 4 1 3 3 6 3 0 140.0 0.714285714286 77.0 0.727272727273 0.242142857143 0.266326530612 0.0625579446064 0.146922740525 0.0542354227405 0.0127994973069 0.00646860509714 0.00703973806083 0.064750724104 1.4 0.357142857143 2.0 4.0 4.0 2.0 1.0 1.0 0.0 3.0 5.0 10.0 0.25 1.0 3.0 2.0 0.55 0.5 0.75 0.166666666667 0.666666666667 0.583333333333 0.5 0.583333333333 0.25 0.666666666667 0.333333333333 0.833333333333 0.333333333333 0.75 0.416666666667 0.916666666667 0.833333333333 0.25 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.75 1.0 0.75 0.75 1.0 1.0 0.5 0.0 1.0 0.75 0.25 0.25 0.75 1.0 0.75 0.5 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.5 1.0 1.0 0.25 0.75 1.0 0.5 0.0 0.25 0.75 1.0 -4.95653965629 0.863983976785 -14.0897336225 4.09093759861 -2.86154091559 3.30420510133 -21.7784713245 17.4958023043 2.46622454418 1.7400227071 -9.83735744662 26.3201520806 0.994551324179 -0.835127851341 -0.271973989643 23.6829200992 -0.377628836147 0.369673285213 -1.11416323068 21.1509816932 0.38707230271 -1.21840774428 2.38671207455 10.4759268611 0.106043280285 -0.115410258856 4 1 7 2 6 3 5 17 1 4 6 3 6 3 6 3 6 3 6 3 6 3 6 4 5 5 4 7 3 5 1 0 144.0 0.5625 66.0 0.636363636364 0.192901234568 0.228732638889 0.0352031357167 0.177099073538 0.056137608239 0.00690643042318 0.0196465890182 0.0061213008782 0.157025270598 0.444444444444 0.0 0.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 1.0 6.0 0.222222222222 0.0 4.0 1.0 0.458333333333 0.25 0.666666666667 0.333333333333 0.333333333333 0.75 1.0 1.0 1.0 0.5 0.666666666667 0.333333333333 0.416666666667 0.25 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -6.28662025213 2.02922552442 -10.5085739915 5.36888185941 5.81133136934 0.700810193751 2.18623643231 7.95486903994 -4.07415623404 0.0423617439243 -5.3369717207 9.28334862591 2.71654168814 0.710925601934 1.47207374431 13.0234681459 -0.825301846208 -0.284342976042 2.413238288 8.88819080577 -0.155863431046 -1.3844728757 -2.87216734392 -4.51631154563 0.00919687999981 -0.0457713006501 3 1 7 3 5 4 4 8 1 9 1 7 2 3 6 3 6 4 5 3 6 3 6 3 6 3 7 2 7 5 6 3 2 0 144.0 0.5625 64.0 0.734375 0.154320987654 0.192708333333 0.0274026920439 0.139033564815 0.0366673096708 0.00615919551453 0.0118502532722 0.00361072114102 0.123683236972 0.444444444444 0.0 0.0 0.0 3.0 1.0 0.0 0.0 0.0 0.0 2.0 5.0 0.260869565217 0.0 3.0 1.0 0.444444444444 0.5 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.916666666667 0.75 0.666666666667 0.416666666667 0.75 0.0833333333333 0.0 0.166666666667 0.583333333333 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.25 0.5 0.75 1.0 1.0 0.5 0.0 0.25 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 -9.15140922778 6.68450760986 -16.9829548059 14.884511702 6.6953873423 -1.55362579214 -0.316819432338 12.0808983987 -3.26222705872 1.21429470863 -6.21757548393 15.9072573872 0.881195693688 0.53045418628 -5.59157871535 17.5553458107 0.865310886487 -1.78071118485 3.15696407785 3.19226499243 -0.40340668738 -0.626829703315 0.44207920107 -5.5725054024 -0.000901308676917 0.0307419808277 1 3 2 5 2 4 1 1 5 1 4 2 8 1 5 3 4 5 3 4 2 6 3 4 2 6 3 4 2 6 3 4 2 7 2 4 2 6 4 3 2 6 4 3 3 5 3 3 4 5 4 1 5 4 5 10 2 3 0 210.0 1.07142857143 91.0 0.824175824176 0.226031746032 0.189115646259 0.110112946766 0.0782295648418 0.0610860598208 0.0393526119662 0.0155448760528 0.0173433882774 -4.02955338741e-05 0.333333333333 1.0 2.0 1.0 4294967295.0 1.0 4.0 3.0 3.0 3.0 1.0 5.0 0.242424242424 1.0 0.0 2.0 0.433333333333 0.5625 0.3125 0.25 0.4375 0.8125 0.5625 0.5 0.6875 0.375 0.0 0.0 0.0 0.75 0.5 0.4375 0.5625 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 2.37671381684 4.96563422447 4.18894740701 13.8338200584 -2.26806404235 2.75189506935 -3.35457817717 23.2362167113 -0.426182093802 -0.743710221385 -8.62199771529 18.5095441953 -0.727866300953 -1.45096078653 -14.5422891495 7.53605082385 -0.76884593879 -0.0834264659848 -19.7703013838 4.70606406028 0.5289330972 0.144321104284 -18.0439567694 5.24839659681 -0.220445979548 -0.104040909782 3 3 4 4 3 6 3 6 2 6 3 5 3 5 2 5 3 4 2 5 3 2 6 0 88.0 0.727272727273 51.0 0.549019607843 0.278409090909 0.253099173554 0.0621712997746 0.117109727179 0.0421381949662 0.00788356010161 -0.00374609035544 0.000366237367521 0.0186398274398 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.0625 0.0 5.0 1.0 0.579545454545 0.166666666667 0.166666666667 0.0 0.0 0.5 0.666666666667 0.166666666667 0.333333333333 0.833333333333 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.89372623803 4.8614600799 -7.52064411514 10.9789322665 -0.861899947262 -1.19958105868 -11.1226894831 6.49263125964 -0.306437327266 -1.10850606035 -13.3485624628 -0.6100900172 -0.575920061852 0.058226137553 -16.8508302 -2.38906896869 -0.0364423502438 -0.489051962445 -17.0099696214 -6.81495411485 0.328460571143 -0.572813315295 -13.8224210858 -13.6806934022 0.0247239036187 -0.110092746574 0 7 1 8 1 5 3 4 29 4 3 6 2 6 2 6 6 2 6 2 5 3 4 3 3 4 3 0 128.0 0.5 60.0 0.816666666667 0.205078125 0.19873046875 0.0352458953857 0.180716991425 0.0519571304321 0.00589394700467 0.0197806868983 0.00541698429096 0.155907694452 1.25 268435455.812 2.0 4.0 3.0 1.0 0.0 4294967293.0 0.0 0.0 1.0 3.0 0.238095238095 2.0 3.0 0.0 0.46875 0.75 0.125 0.25 0.25 1.0 0.25 0.625 0.5 1.0 0.25 0.75 0.5 1.0 0.25 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.30246506916 2.26795793906 -6.44265661025 9.45363301859 1.85359555792 5.75662185765 -2.79751749449 28.2171232278 -1.36085539002 -0.615380008997 -4.02461810013 29.6612068997 1.68597184431 0.250898632179 3.64398722317 29.6473233973 -0.130938614913 0.725130189529 4.24628024779 34.5149533914 -0.741763261558 -0.364444705176 -0.592109081729 30.649794796 0.256022866479 -0.245868139959 3 1 3 4 2 4 3 2 27 4 1 5 2 4 3 3 3 3 3 4 2 4 1 5 2 4 2 4 2 4 1 5 1 4 1 0 126.0 0.285714285714 64.0 0.703125 0.246031746032 0.289493575208 0.0230176726775 0.422222622147 0.0751598699445 0.00228022603528 0.0208645139986 0.00490614676663 0.739526838505 1.0 204522252.0 0.0 3.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 0.0 2.0 0.266666666667 1.0 2.0 1.0 0.507936507937 0.166666666667 0.333333333333 0.166666666667 0.25 0.416666666667 0.5 0.666666666667 0.75 0.583333333333 0.5 1.0 1.0 0.5 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -2.27364204417 -4.42602317932 -3.7941382371 -5.38258009582 1.83190587559 7.78420794551 -1.55657959553 20.3546143832 -2.30276246979 0.333066426803 -5.48824881804 27.5219142329 2.34896290638 -0.968606539106 0.785716459307 21.1807609891 -1.57828268397 0.523731809979 -2.5257523452 20.2652348252 0.817100757438 -1.24381390259 -2.56069341747 9.34602504192 -0.16123804566 -0.158131591456 7 3 10 9 5 4 4 4 3 4 6 4 1 5 7 8 8 8 8 8 8 9 7 3 1 5 7 3 1 5 7 2 3 5 5 3 4 11 9 3 7 0 224.0 1.14285714286 106.0 0.669811320755 0.20703125 0.221301020408 0.106348154496 0.0778427791317 0.046837631537 0.0421118446704 0.00701246272057 0.0110417037562 5.81889014339e-05 0.5 0.714285714286 0.0 4.0 4.0 0.0 1.0 3.0 3.0 2.0 4.0 9.0 0.3 0.0 2.0 2.0 0.473214285714 0.3125 0.9375 1.0 0.8125 0.5 0.375 0.375 0.6875 0.4375 0.0 0.0 0.25 0.625 0.3125 0.25 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.61021174399 6.96302876027 -19.3947635371 21.1853976796 -8.84149227805 6.54058429218 -50.6379653822 43.3579474234 -0.516675579263 -1.39562196359 -56.674935237 33.3903271353 0.888796067321 -4.52779719273 -53.0414078015 1.91011576245 -2.235877879 0.119535387606 -67.1945629431 -0.968096612291 -0.114408410936 1.79278030249 -69.8964952705 14.5135311468 0.318604738985 -0.201071950407 1 11 2 6 3 3 2 5 5 3 2 4 4 4 2 4 5 3 2 3 6 4 1 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 9 4 5 1 1 1 1 6 4 182.0 1.07692307692 97.0 0.556701030928 0.244897959184 0.229923922232 0.114435799679 0.0883944578547 0.0561181361809 0.0377205621054 0.0115962795303 0.0154334799998 -0.00713696272108 0.357142857143 1.0 1.0 1.0 2.0 0.0 2.0 3.0 3.0 3.0 6.0 9.0 0.0487804878049 0.0 1.0 3.0 0.532967032967 0.875 0.75 0.75 0.75 0.6875 0.375 0.25 0.3125 0.375 0.0625 0.0 0.0625 0.8125 0.8125 0.75 0.8125 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.818511135901 3.0012074983 -7.00122639901 8.1272361148 -7.23714182917 1.41012207597 -29.916771231 13.7761933773 1.39277857158 0.412479954107 -26.6650766954 16.22605781 1.3139350757 0.13776260873 -17.2139273583 17.103977173 -1.19617297834 0.132027483071 -21.2465669306 18.568517266 1.18403252781 0.38433591881 -10.6512622838 23.7197051182 0.401960769099 0.241725489753 3 3 5 4 4 6 2 18 1 4 6 3 6 3 6 3 6 3 6 3 6 3 6 4 5 6 4 5 1 0 135.0 0.6 68.0 0.558823529412 0.204938271605 0.221234567901 0.0370772748057 0.153048214195 0.0471708581009 0.00643596620981 0.0150804612101 0.00330657356976 0.115168236044 0.333333333333 0.0 0.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 4.0 0.136363636364 0.0 4.0 1.0 0.503703703704 0.5 0.75 0.333333333333 0.333333333333 0.916666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.333333333333 0.416666666667 0.333333333333 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -7.21502408683 5.51737136052 -13.3363744268 13.892685093 5.01373438505 0.94389491583 -3.03022913192 18.0207144076 -3.82919195559 0.127219161095 -10.5857288913 18.5265823251 2.36028698441 0.269915102515 -4.1088741648 18.2210579974 -0.291478654544 -0.898290720617 0.165687997291 9.09739751414 -0.0288595514204 -1.22215924824 -1.96105755857 -4.84808116518 0.088549884411 -0.158283591616 7 4 6 7 4 8 3 5 1 3 3 3 9 3 8 4 8 4 7 5 7 4 8 5 7 4 9 3 9 3 9 3 8 4 8 4 8 5 7 5 7 6 5 7 6 6 5 0 264.0 0.545454545455 105.0 0.552380952381 0.141098484848 0.188016528926 0.0265459671613 0.169494532098 0.0243635998414 0.00716656301764 0.00802160518867 -0.00139055393817 0.170786654797 0.333333333333 0.0454545454545 1.0 2.0 1.0 0.0 1.0 0.0 0.0 0.0 3.0 4.0 0.185185185185 0.0 2.0 1.0 0.397727272727 0.0 0.444444444444 0.5 0.722222222222 0.388888888889 0.944444444444 1.0 1.0 0.666666666667 0.611111111111 0.388888888889 0.666666666667 0.555555555556 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.166666666667 0.5 0.333333333333 0.0 0.333333333333 0.0 0.0 0.166666666667 0.666666666667 1.0 0.833333333333 0.5 0.833333333333 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.833333333333 0.5 0.5 0.333333333333 0.166666666667 0.0 0.0 0.833333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -14.5554429773 2.80691445089 -25.2314925559 7.37846579578 13.0517815127 1.27981619528 7.73899599396 14.2874857082 -6.56254755378 1.58470398264 -6.72105649563 19.1493129415 0.891264211495 -1.88980055745 -12.469262735 7.11795390773 0.623530548349 -1.27341084618 -6.51016667813 -6.56076742702 -1.31459309972 -0.138630844105 -15.7241654937 -10.9067807928 0.176430792055 -0.194562466007 1 1 1 2 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 3 3 3 3 3 3 3 3 3 3 3 2 4 3 3 2 4 1 6 2 4 126.0 0.285714285714 71.0 0.619718309859 0.263227513228 0.278155706727 0.0208305838502 0.396751410735 0.0593718380944 0.00112058823459 0.0140682805763 0.00130186333294 0.677164544308 0.666666666667 0.047619047619 1.0 2.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 3.0 0.111111111111 0.0 10.0 1.0 0.563492063492 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.5 0.5 0.75 0.916666666667 1.0 1.0 1.0 1.0 0.916666666667 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.63742477124 0.121260909022 -4.66018364874 2.08336941304 1.98698785447 2.84674419753 -1.07546664292 13.4488640017 -1.68013193066 1.83309101281 -3.20494863387 25.5814110315 1.5522006143 0.720108320286 -0.669131674846 29.0000152242 -1.42166559583 -1.15277926789 -3.59844744328 19.6428544404 1.08795559719 -0.850673785251 -2.19187236032 6.39937218023 -0.299959001321 -0.300250495878 7 1 9 7 4 3 3 4 3 3 3 4 2 12 1 11 2 4 8 4 10 3 10 3 10 4 6 1 3 3 5 2 4 10 4 6 9 2 5 0 195.0 0.866666666667 87.0 0.827586206897 0.197238658777 0.197948717949 0.0672701832465 0.0939333434481 0.0466636322258 0.0204187569863 0.0125185327227 0.00791680400715 0.0298604980594 0.923076923077 0.266666666667 0.0 3.0 5.0 3.0 1.0 1.0 0.0 1.0 3.0 9.0 0.305555555556 0.0 3.0 1.0 0.446153846154 0.25 0.6875 0.8125 0.5625 0.4375 0.75 0.3125 0.5625 0.5625 0.625 0.0 0.25 0.5 0.625 0.0 0.4375 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.5 0.75 1.0 0.75 0.25 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -8.82779417683 7.5545546321 -19.9261411621 20.1114537115 2.13677889819 3.38398776779 -12.4114023015 36.0209626731 1.49782432935 2.68270209762 -2.7895848232 46.3943767746 -0.724644216625 -2.18939325942 -4.77343892079 30.0591168754 0.290796084469 -2.62304940221 -3.95640979897 6.79045181363 0.0924342591911 0.318376716016 -1.61504286337 1.40920689561 0.128797196132 -0.379939582355 3 4 10 6 9 7 11 5 12 3 13 3 13 3 14 2 13 3 13 3 3 5 5 5 2 4 5 4 4 3 5 4 4 3 5 4 5 3 3 5 5 3 4 4 5 3 4 3 6 3 4 3 6 3 4 3 6 3 3 5 4 5 1 6 3 6 1 7 2 6 2 5 4 5 368.0 0.695652173913 152.0 0.651315789474 0.18308423913 0.233695652174 0.0539945876911 0.161671860232 0.0724668448724 0.0178899491823 0.0240450497776 0.0188838297223 0.114531681135 0.5 0.608695652174 4.0 3.0 1.0 0.0 0.0 1.0 5.0 5.0 2.0 3.0 0.175 1.0 0.0 2.0 0.413043478261 0.5 0.208333333333 0.291666666667 0.375 0.916666666667 0.75 1.0 0.875 0.166666666667 0.125 0.291666666667 0.125 0.0 0.291666666667 0.416666666667 0.375 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.833333333333 0.833333333333 0.5 0.333333333333 0.5 0.5 0.666666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.666666666667 1.0 1.0 0.833333333333 0.5 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -7.7778328711 -14.2824261975 -16.7874336798 -34.2729665231 2.64877149146 1.0177963189 -10.2662512975 -26.8205374793 -1.02512012235 4.99056676787 -12.5858508659 -3.70707352747 -0.97014063617 -2.2809548005 -18.1800554986 -6.77981227482 1.07754069398 1.46866406502 -10.6953184444 -2.74248851026 0.106842884881 -0.404067969833 -9.3375062587 -1.66790658044 -0.198289733421 0.00774977612585 3 1 6 3 5 3 4 4 4 5 2 8 1 4 5 2 6 2 6 2 6 2 5 3 6 2 6 2 5 4 5 5 4 4 1 0 136.0 0.470588235294 56.0 0.875 0.154411764706 0.195069204152 0.0223005292082 0.188657245446 0.0458954559332 0.00401983496847 0.0207510481017 0.00552035101643 0.211240018868 0.625 0.0 2.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 5.0 0.0 0.166666666667 0.0 6.0 1.0 0.411764705882 0.2 0.4 0.1 0.1 0.6 0.8 0.6 0.5 0.9 1.0 1.0 0.9 0.9 0.8 0.5 0.8 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 -6.17895661416 3.29544352755 -10.6813115766 7.16614573563 5.39293269004 -0.784728137891 1.99277019799 7.55720437319 -3.0752679262 2.31095447434 -2.7434709566 18.2902126899 1.7261752797 0.767212172551 -1.6393462351 22.8958886102 -1.50018494507 -1.54882104841 -6.69558155971 11.7884924457 0.451127702696 -0.0552106968289 -6.01467614322 8.2729609405 0.148130108412 0.0630815358659 4 2 12 4 10 6 11 5 12 4 12 4 12 4 12 4 13 3 13 4 3 1 8 10 6 11 4 4 5 3 4 4 5 3 4 3 6 3 4 3 6 3 4 3 7 2 4 3 6 3 3 4 6 3 4 4 5 4 2 5 5 11 4 6 5 1 6 2 2 0 368.0 0.695652173913 139.0 0.697841726619 0.151324728261 0.205103969754 0.0448348496124 0.139905841621 0.061420459799 0.0159003952713 0.0229035582587 0.0181153377533 0.104160132559 0.4375 0.521739130435 4.0 1.0 2.0 0.0 0.0 1.0 4.0 5.0 4.0 12.0 0.211538461538 0.0 2.0 2.0 0.377717391304 0.541666666667 0.375 0.416666666667 0.583333333333 0.708333333333 0.833333333333 0.75 0.583333333333 0.0 0.208333333333 0.333333333333 0.0 0.0 0.208333333333 0.666666666667 0.458333333333 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.333333333333 0.0 0.166666666667 0.5 0.5 0.666666666667 1.0 1.0 0.833333333333 0.5 0.666666666667 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -11.9850591928 -8.69124384884 -26.028982511 -21.5195457704 4.61676219404 0.218398202504 -9.41227494245 -15.1221906412 1.91824155827 5.17352466563 -0.977496921323 5.16111976557 -3.9195098467 -2.55425541778 -16.6109544561 6.15553368915 2.74983355149 3.48879551187 -5.58721595977 18.0471253454 -0.735628397895 -2.01452662938 -7.01051943007 17.4657956844 -0.260532594426 0.630417633126 1 1 4 2 4 3 4 2 4 2 3 3 4 2 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 3 3 3 3 3 1 6 1 2 3 0 126.0 0.285714285714 70.0 0.585714285714 0.27380952381 0.25283446712 0.0224822733326 0.352162293489 0.0507639563762 0.00131960246783 0.00835072567511 -0.000470176851985 0.547352760257 0.666666666667 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 5.0 0.214285714286 0.0 10.0 1.0 0.555555555556 0.166666666667 0.0 0.0 0.25 0.666666666667 0.5 0.5 0.666666666667 1.0 1.0 1.0 0.916666666667 1.0 1.0 0.916666666667 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.06143545338 3.45593590714 -3.60539466587 8.78570638207 1.50792477342 0.966375203536 -1.50317279689 14.493584745 -1.65409866048 1.73450873262 -3.84277141905 22.9833273769 1.69583803419 0.267608503082 -0.256330313477 24.5428133317 -1.44128160851 -0.930670882883 -3.426603579 16.6424479422 0.997643937156 -0.370486845053 -2.33320141841 10.0772403075 -0.25476166714 -0.1397104082 2 1 14 6 9 7 11 4 12 4 12 4 13 3 12 3 13 4 12 5 1 5 5 5 3 4 4 4 5 4 3 4 5 4 3 3 6 4 3 3 6 4 3 3 6 4 3 3 7 3 3 3 6 4 3 3 6 4 2 4 6 11 4 12 10 0 352.0 0.727272727273 139.0 0.68345323741 0.161221590909 0.216296487603 0.0525711254461 0.139272940598 0.0627119492804 0.0198302957507 0.019673917658 0.019151326806 0.0960192623805 0.4375 0.545454545455 3.0 2.0 2.0 0.0 0.0 1.0 5.0 5.0 0.0 3.0 0.243902439024 2.0 0.0 2.0 0.394886363636 0.583333333333 0.458333333333 0.5 0.625 0.708333333333 0.791666666667 0.666666666667 0.541666666667 0.0833333333333 0.166666666667 0.0416666666667 0.0 0.0 0.291666666667 0.541666666667 0.5 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.5 0.5 0.5 0.5 0.833333333333 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 0.833333333333 1.0 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.333333333333 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -10.3306026698 -7.14750380795 -25.252428632 -16.8761393816 0.187613903615 1.2334209151 -21.4822909641 -8.86866987718 3.11594785043 3.75085008431 -13.0784373168 6.50871180206 -5.05555232385 -2.4518443036 -34.3135423513 0.93707043258 1.90959272708 1.65820310367 -28.9978471522 4.69385441119 0.451056866622 -0.958978464393 -21.8673019277 1.98041860236 -0.402382674612 0.103131849692 2 2 11 3 3 5 3 5 3 4 2 4 5 3 2 4 5 3 3 2 6 3 3 2 6 3 3 1 8 2 3 1 8 2 3 2 7 2 3 2 6 3 2 3 6 10 3 4 1 1 13 0 196.0 1.0 76.0 1.09210526316 0.18221574344 0.171647230321 0.0899752654081 0.0783829176194 0.0506421644043 0.0379778875777 0.0132867970762 0.0175035886507 0.0194727582879 0.357142857143 0.857142857143 1.0 3.0 1.0 1.0 2.0 3.0 3.0 3.0 0.0 3.0 0.21875 2.0 1.0 2.0 0.387755102041 0.6875 0.625 0.375 0.6875 0.4375 0.375 0.125 0.375 0.25 0.0 0.0 0.0625 0.625 0.75 0.5625 0.75 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.54607659004 4.18350136127 0.632935754147 11.5865974822 -4.35332850171 2.40170841237 -11.8367084163 21.214141215 2.11760258726 0.696618922688 -0.578696502416 24.0714032956 3.24604913379 -0.889045851307 20.1067587144 17.1454413791 -1.49933895513 -0.756673868887 11.7020754769 9.89294801898 -0.997920535431 0.193521491654 0.748414502368 10.5458704028 0.237400082434 0.0693492184305 2 3 2 6 4 3 1 8 3 4 4 4 3 4 4 4 3 3 6 3 3 3 6 3 4 2 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 2 5 4 11 4 11 6 2 1 0 210.0 1.07142857143 106.0 0.584905660377 0.245714285714 0.232993197279 0.110640751539 0.095614404492 0.0521153223194 0.035158858451 0.00837604848118 0.0110665600964 -0.00425673203459 0.2 1.0 1.0 1.0 0.0 0.0 3.0 3.0 3.0 3.0 2.0 7.0 0.25 0.0 1.0 2.0 0.504761904762 0.5 0.4375 0.4375 0.6875 0.6875 0.5625 0.5 0.625 0.4375 0.0 0.0 0.0 0.875 0.5625 0.5 0.625 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.1034742721 3.48018808894 -5.3053490072 9.77848092933 -3.61600030705 2.03378796612 -15.27882857 16.5296804216 2.16460363596 -0.755811760695 -6.03210798948 11.5361639758 0.963071712806 -1.47073510137 0.643550499239 0.73139192117 -1.63327337433 -0.0462198534229 -11.0629553089 -0.765489530865 -0.616923648404 0.668419064085 -23.1175970101 6.55845060947 -0.37012383295 0.171265885926 9 1 4 3 4 5 2 4 3 5 2 5 4 3 2 5 4 3 2 4 5 3 3 3 5 4 2 3 5 3 3 3 5 3 3 3 5 3 3 3 5 3 3 4 3 5 3 12 2 6 1 4 1 0 196.0 1.0 103.0 0.631067961165 0.231413994169 0.268221574344 0.0916214491836 0.108763142908 0.0618104488776 0.0252949794589 0.0111956337168 0.0106334767206 0.0124133764703 0.285714285714 0.857142857143 0.0 1.0 2.0 1.0 2.0 3.0 3.0 2.0 0.0 6.0 0.181818181818 1.0 1.0 2.0 0.525510204082 0.6875 0.9375 0.75 0.6875 0.1875 0.375 0.25 0.5 0.5 0.25 0.25 0.5 0.625 0.8125 0.8125 0.875 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.18350136127 -1.18229386297 -16.1430152314 -1.39523733018 -8.17026308444 2.36737177742 -38.656139249 8.12216748176 4.53694332569 1.59408727377 -23.6267151287 17.6767563111 -0.351872722571 0.0480357104334 -19.4363323644 19.5480798758 -1.43627104526 0.156309836396 -30.6587161634 20.3522109262 0.566678081927 0.0714233382673 -26.52808604 20.2018296244 0.161342990835 -0.106582518679 2 2 4 4 3 5 2 4 38 4 3 4 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 4 3 5 1 7 1 5 1 0 154.0 0.318181818182 66.0 0.772727272727 0.171614100186 0.243506493506 0.0168982855566 0.377776907693 0.0576795653326 0.00215327814827 0.0265043827898 0.00541921844389 0.631063326371 0.857142857143 195225785.955 0.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 3.0 1.0 0.0952380952381 2.0 8.0 1.0 0.428571428571 0.25 0.166666666667 0.0833333333333 0.416666666667 0.583333333333 0.333333333333 0.583333333333 0.833333333333 0.666666666667 0.333333333333 1.0 1.0 0.583333333333 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.39846388181 -5.1508327037 -7.71355274207 -7.23392014578 3.2567573479 7.74143513953 -2.70823958625 19.1868440671 -3.2779627224 1.22357669205 -7.037662579 31.2062002512 3.37906563761 -0.620567243543 0.196850083278 27.7537304714 -2.82358305526 0.424583316955 -5.92223119756 28.0019439786 1.96526087608 -0.464639320083 -3.55472508173 24.883323826 -0.51007848737 -0.0179182928405 6 1 2 1 4 2 3 13 2 3 3 8 2 3 4 7 2 3 4 5 3 4 4 4 4 4 5 3 5 3 4 4 6 3 2 4 7 3 2 1 1 1 7 3 13 3 13 3 13 10 6 11 5 13 2 7 1 6 1 4 6 5 1 4 5 5 2 4 5 6 2 13 4 3 1 7 12 1 6 0 368.0 0.695652173913 188.0 0.664893617021 0.235903532609 0.249527410208 0.0610842974015 0.14928636373 0.0512047187063 0.0132840862429 0.0106707555071 0.00409058623215 0.0704553544748 1.375 0.695652173913 2.0 8.0 8.0 4.0 5.0 6.0 0.0 4.0 3.0 13.0 0.27868852459 1.0 3.0 1.0 0.510869565217 0.416666666667 0.5 0.5 0.833333333333 0.541666666667 0.583333333333 0.75 0.625 0.458333333333 0.208333333333 0.5 0.541666666667 0.875 0.625 0.458333333333 0.958333333333 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.166666666667 0.5 0.833333333333 0.5 0.166666666667 0.5 0.5 0.666666666667 0.5 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.833333333333 1.0 0.5 0.0 0.0 0.166666666667 0.333333333333 0.0 0.666666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.5 0.166666666667 0.0 0.166666666667 0.333333333333 0.0 0.666666666667 0.833333333333 -12.4832833625 -0.0553582410754 -26.9829253983 8.67146472912 4.28304304321 12.4683711709 -15.5054714547 48.8753878672 -0.548507033265 0.252367910865 -10.8483742613 68.2633513861 0.760440464146 3.83216505232 -3.38966581024 75.6659344763 2.00355837098 -4.71600037246 9.26501539346 53.4565571018 -1.60331788995 1.48446503624 0.0159202711548 47.9189056666 0.0834842234558 -0.323625399049 0 6 3 4 1 7 2 4 2 6 2 2 6 4 2 2 7 6 9 4 10 4 10 5 8 7 7 7 5 4 2 5 1 5 3 11 4 5 182.0 1.07692307692 98.0 0.540816326531 0.244505494505 0.252747252747 0.0899173734127 0.10273948971 0.0588697017268 0.0205361042979 0.0111658171883 0.00896846840858 -0.00268007801087 0.642857142857 0.538461538462 3.0 2.0 1.0 3.0 3.0 1.0 0.0 2.0 2.0 9.0 0.285714285714 0.0 4.0 1.0 0.538461538462 0.75 0.0625 0.0 0.625 0.9375 0.6875 0.625 0.625 0.4375 0.75 0.9375 0.5625 0.75 0.1875 0.3125 0.875 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.25 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 -3.13762602095 0.545674090601 -6.36871867369 2.35224039657 1.4330905007 1.48946754322 -3.90333617193 7.23867347581 -1.35454757889 -0.0487209009465 -6.72994610829 8.72707955823 0.985317443514 0.407234999974 -1.8935583929 10.7007868425 0.5494000819 0.191858497748 3.70306183061 13.9110104555 -0.312839628008 0.565192112938 2.02061220349 20.2972234785 0.00391230671413 0.200270322111 1 2 4 5 2 3 4 4 2 3 5 3 1 4 5 2 2 4 5 2 2 4 5 2 2 4 5 2 2 3 6 2 2 4 5 2 3 3 4 4 3 3 3 4 3 5 2 4 2 4 7 0 169.0 1.0 82.0 0.719512195122 0.201183431953 0.223031406463 0.0870417702461 0.0940894905931 0.0474234634103 0.0306848686161 0.0113110831338 0.00983988195291 0.0180526245763 0.230769230769 0.923076923077 0.0 1.0 1.0 1.0 3.0 3.0 3.0 3.0 0.0 2.0 0.153846153846 0.0 0.0 2.0 0.485207100592 0.75 1.0 0.875 0.5625 0.1875 0.25 0.1875 0.625 0.4375 0.25 0.3125 0.375 0.6875 0.5 0.5625 0.625 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.25 0.5 0.5 0.5 0.5 0.5 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -5.19089968238 -1.56706405506 -17.1413437595 -2.11519811895 -6.35750469083 2.56386515517 -35.5467164176 7.25854912687 3.1435687095 0.952001975397 -24.6214946525 13.8533199981 -0.0709811196829 -0.213969036078 -21.1914828744 12.2225865167 -1.20511171512 -0.446610880335 -27.5673214988 7.72738692623 1.28812003527 -0.19824818043 -18.7889314772 5.02790848736 0.00621515459726 -0.022000032726 6 6 5 7 4 7 4 3 9 3 9 2 10 2 9 3 9 5 6 7 6 6 6 3 10 2 10 2 10 2 10 3 9 3 8 4 8 4 7 6 6 8 3 7 5 0 264.0 0.545454545455 95.0 0.715789473684 0.138257575758 0.174414600551 0.026074927999 0.167986630684 0.0311831512438 0.00642433220991 0.0135670964733 0.000791948769948 0.169403462454 0.75 0.0 2.0 2.0 5.0 0.0 0.0 0.0 0.0 0.0 5.0 3.0 0.114285714286 1.0 2.0 1.0 0.359848484848 0.0 0.277777777778 0.111111111111 0.333333333333 0.388888888889 0.888888888889 0.777777777778 0.888888888889 0.611111111111 0.666666666667 0.5 0.777777777778 0.5 0.277777777778 0.111111111111 0.222222222222 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 1.0 0.833333333333 0.5 0.5 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.5 0.833333333333 0.833333333333 0.666666666667 0.166666666667 0.333333333333 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -11.1697832788 -0.0578745247607 -19.5201068413 -0.160422366184 9.51366309713 0.909969283944 2.72286381928 8.70244074228 -5.73416530094 4.30049698854 -8.10846091747 24.0849190838 2.86836670442 -2.7829993376 -2.92973111084 14.9139165469 -0.751573266401 0.141026213226 -3.20810692779 1.96374690843 -1.04048914957 -2.54636669003 -12.8330340455 -14.8352536796 0.245474107966 0.216484230588 1 4 5 5 4 2 4 1 3 5 3 1 11 1 7 1 1 2 7 5 3 9 3 10 3 9 3 9 4 5 2 3 4 1 3 5 6 2 0 156.0 0.923076923077 76.0 0.723684210526 0.200320512821 0.206607495069 0.0712342904466 0.0949050367505 0.040343049866 0.0229521409317 0.0120471900608 0.00597955025635 0.0279210751731 1.16666666667 0.384615384615 0.0 5.0 6.0 3.0 2.0 1.0 0.0 2.0 2.0 13.0 0.121212121212 0.0 3.0 1.0 0.487179487179 0.416666666667 0.833333333333 0.833333333333 0.333333333333 0.75 0.833333333333 0.5 0.666666666667 0.666666666667 0.75 0.0 0.583333333333 0.583333333333 0.5 0.0 0.416666666667 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.75 0.75 1.0 1.0 0.5 0.0 0.25 1.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.75 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.75 0.25 0.5 0.75 0.25 0.0 0.0 0.0 -9.05958906831 3.13412811012 -21.2633514071 7.63924100625 0.857422806753 0.853076290328 -19.0146396733 16.259319154 0.654551081548 4.81504174727 -14.4483141469 40.6421133808 -0.984303223075 1.28565308161 -19.9469383833 50.9044600247 -0.414695822582 -1.6325876513 -24.7852681915 38.6650621566 -0.21466594159 -0.207475039053 -28.2169428479 33.7912041178 -0.17114013004 0.208476869523 11 1 10 4 11 3 11 3 11 4 11 3 10 4 10 3 11 3 6 1 3 4 3 3 4 4 3 3 5 3 2 4 5 3 2 4 5 3 2 4 5 4 1 3 7 2 2 3 7 3 1 5 5 3 1 5 5 3 2 4 4 4 3 12 10 2 2 0 308.0 0.636363636364 117.0 0.794871794872 0.194109461967 0.217237308146 0.0605964889176 0.161863162137 0.0598624579165 0.0176070268503 0.017745100324 0.0130441921126 0.112930473265 0.571428571429 0.5 0.0 2.0 4.0 2.0 0.0 1.0 5.0 4.0 3.0 7.0 0.209302325581 1.0 1.0 2.0 0.37987012987 0.0 0.125 0.875 0.791666666667 0.0 0.0833333333333 0.208333333333 0.416666666667 0.208333333333 0.291666666667 0.25 0.208333333333 0.708333333333 0.791666666667 0.75 0.791666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -2.74903992613 -8.59436692696 -8.35561794405 -20.0167696964 -0.984464798254 2.01855341423 -2.63240576189 -6.88014026623 6.54890804502 6.65128243062 16.0186170706 26.7137929641 -6.0353826275 -0.427044670081 -1.74679889249 31.8829861232 3.59430539073 -0.664062470582 5.91042909163 21.9497945735 -1.66445799476 -0.785586175187 3.22477690455 13.7927067495 -0.00441346838678 -0.0763552304162 5 6 3 2 5 2 2 3 5 3 1 11 1 15 8 3 9 4 8 4 9 3 6 1 2 4 4 3 3 8 7 4 2 0 156.0 0.923076923077 76.0 0.75 0.211538461538 0.213510848126 0.0811460071815 0.0957078992397 0.0440847367623 0.0264367829294 0.0123143284836 0.00738866262951 0.0218961738176 1.08333333333 0.307692307692 0.0 4.0 6.0 3.0 2.0 0.0 0.0 2.0 2.0 8.0 0.161290322581 1.0 3.0 1.0 0.487179487179 0.416666666667 0.833333333333 0.916666666667 0.333333333333 0.583333333333 0.75 0.583333333333 0.583333333333 0.416666666667 0.5 0.0 0.416666666667 0.5 0.5 0.0 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.25 0.5 0.75 1.0 0.75 0.25 0.25 0.5 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -6.75796373744 1.76294706194 -16.2918185022 4.45345736133 0.043465164249 0.678056562285 -16.3647046408 9.74657024407 0.67677061068 2.50760562975 -12.6255413701 22.3255478144 -0.754212716467 0.354242930051 -16.1649556076 24.2303833872 -0.136299351361 -1.55822187782 -17.7282905448 12.9483390164 0.224344211497 0.275286373693 -16.3567251612 13.308571324 -0.0904296875522 0.207988895069 2 7 8 9 1 11 5 9 2 8 9 5 6 5 10 4 7 5 10 4 8 4 10 4 8 4 10 4 7 5 11 4 7 4 10 4 7 6 5 1 3 4 8 11 3 4 7 12 3 4 7 5 10 4 7 5 10 4 7 5 10 4 7 5 10 4 7 5 10 4 8 4 10 5 6 5 10 5 2 11 6 8 1 12 4 9 1 12 4 9 1 0 572.0 1.18181818182 267.0 0.494382022472 0.225457235073 0.233153210426 0.11391782349 0.0925669549044 0.0582125662616 0.0420086043301 0.0120185245815 0.0122259977517 -0.00210975588251 0.730769230769 1.04545454545 7.0 6.0 2.0 4.0 5.0 6.0 5.0 5.0 10.0 6.0 0.0933333333333 4.0 2.0 2.0 0.466783216783 0.571428571429 0.333333333333 0.404761904762 0.595238095238 0.52380952381 0.547619047619 0.619047619048 0.547619047619 0.0952380952381 0.119047619048 0.190476190476 0.119047619048 0.738095238095 0.571428571429 0.571428571429 0.761904761905 0.583333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.583333333333 0.583333333333 0.583333333333 0.666666666667 0.75 0.75 0.916666666667 0.833333333333 0.75 0.75 0.916666666667 0.916666666667 0.75 0.75 0.333333333333 0.0833333333333 0.0 0.0 0.416666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.416666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.916666666667 0.75 0.75 0.666666666667 0.75 0.75 0.75 0.75 0.916666666667 0.583333333333 0.5 0.583333333333 0.5 0.5 0.5 0.5 -5.1174435548 -0.122426879301 -10.1958739367 1.72391446455 2.80038809063 4.24256224041 -3.05974199574 23.66021846 -0.70979684845 5.60592813203 -0.166207369097 44.3064505133 1.13748592854 -4.90912295018 0.0236496918884 22.4525351231 -2.39787958429 -0.34892650988 -14.7988227049 3.07446097711 0.0954310366253 -1.18860618037 -15.9254661416 5.44708920794 0.468522012922 0.953963529103 4 7 8 4 2 4 5 4 3 4 4 3 6 4 3 3 7 4 1 4 7 5 1 3 7 5 1 3 7 4 1 4 7 5 1 3 7 3 3 4 5 4 4 11 6 8 5 0 208.0 1.23076923077 103.0 0.621359223301 0.231069711538 0.235946745562 0.116584649344 0.0799523320152 0.0541614364048 0.0386400845236 0.0074933128204 0.0106155200006 -0.0128275606607 0.5625 0.769230769231 1.0 4.0 3.0 1.0 2.0 3.0 3.0 2.0 6.0 15.0 0.186046511628 0.0 2.0 3.0 0.495192307692 0.375 0.8125 0.8125 0.5625 0.6875 0.25 0.25 0.6875 0.4375 0.0 0.0 0.5 0.8125 0.5625 0.5 0.6875 0.0 0.0 0.25 0.5 0.75 0.75 0.5 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.01866231307 4.77464829276 -17.9478108135 14.6974478584 -11.7686065781 4.50980452027 -54.4808687067 28.2962819173 3.33563732479 -2.4573527099 -42.7625333339 14.3499463006 2.8866106166 -3.1193046104 -19.0124463775 -7.72453246601 -0.743438821296 0.80758367038 -16.2287593234 -4.83845791496 1.68228063688 0.85384653984 -0.732988557637 4.61005247827 0.42059457194 -0.0684113645948 9 3 11 5 11 4 11 4 12 3 12 2 13 3 11 4 11 4 5 10 4 3 3 5 3 3 5 4 3 2 7 2 4 2 7 2 3 2 8 2 3 3 6 3 3 3 7 2 3 4 6 2 3 4 5 4 3 5 3 6 2 13 4 1 1 2 2 1 1 1 2 0 330.0 0.681818181818 123.0 0.772357723577 0.191111111111 0.209090909091 0.0606623813897 0.15204040404 0.0585068870523 0.0169912554524 0.0187733968782 0.0122737947782 0.0999219750636 0.866666666667 0.590909090909 1.0 3.0 6.0 2.0 0.0 0.0 5.0 4.0 7.0 11.0 0.137254901961 0.0 2.0 2.0 0.372727272727 0.0 0.125 0.583333333333 0.791666666667 0.0 0.25 0.125 0.375 0.208333333333 0.333333333333 0.166666666667 0.291666666667 0.833333333333 0.875 0.708333333333 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 0.833333333333 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -2.77797718851 -8.59436692696 -9.34682091476 -23.0580898795 -2.38768287277 -1.9100386803 -8.24778622628 -19.464795601 6.9471486939 9.55950768782 13.7415626172 24.3381751492 -4.67492550799 -0.0705250845092 2.272140712 39.1085275289 2.45552163133 0.22016061658 6.48459818031 33.5836279055 -0.689924220757 -1.03114505017 9.36515540744 29.3415558524 0.0440361913821 0.288824884671 2 3 3 4 5 5 2 5 3 6 4 4 3 5 5 3 4 4 5 3 4 3 6 3 4 3 6 3 4 3 6 4 3 3 6 4 3 3 6 3 4 4 5 4 2 5 4 5 1 7 2 7 4 1 7 2 2 0 224.0 1.14285714286 109.0 0.715596330275 0.223214285714 0.224489795918 0.105645271501 0.083654108965 0.0580499498907 0.035800601598 0.0118775786958 0.0148321964763 -0.00359912133336 0.3125 1.0 2.0 0.0 2.0 1.0 3.0 3.0 3.0 3.0 2.0 11.0 0.075 2.0 0.0 2.0 0.486607142857 0.75 0.5625 0.5 0.6875 0.6875 0.625 0.5 0.75 0.25 0.0 0.0 0.125 0.75 0.5 0.5 0.6875 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.9443664472 5.01338070739 -11.714138311 14.888547629 -6.13554739599 4.20206351702 -27.6673304589 29.6456985787 4.37733406379 -0.285680402917 -10.7861866303 28.3773289664 0.293514136603 -1.19347799959 -4.77369146488 20.4508657364 -1.74276765803 0.640004582297 -15.987477075 22.7070951277 0.721152223096 -0.111786361518 -16.0828267712 20.1392823318 -0.299114110127 -0.373926946233 0 4 2 5 1 6 2 2 27 3 2 4 3 4 2 3 3 3 3 3 3 2 4 2 4 2 4 2 4 3 2 5 1 6 126.0 0.285714285714 59.0 0.728813559322 0.157407407407 0.235827664399 0.0137699112567 0.395799589677 0.0420550936424 0.00194972984881 0.0200591739573 0.00310095403734 0.720998114879 1.5 204522252.0 2.0 1.0 2.0 2.0 4294967295.0 4294967293.0 0.0 0.0 4.0 2.0 0.125 0.0 7.0 1.0 0.468253968254 0.5 0.333333333333 0.5 0.666666666667 0.583333333333 0.5 1.0 1.0 0.666666666667 0.5 0.833333333333 0.75 0.5 0.333333333333 0.416666666667 0.416666666667 1.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 -4.60791454285 -1.75828318082 -7.49236121504 -1.65724552339 4.10554791976 4.23876993885 -1.06643773247 15.2834964097 -4.3094875432 2.41514568311 -8.21303519276 28.0444044629 4.12097938431 -1.18187828097 1.77344176841 24.0242721755 -2.85163141698 0.288224436491 -3.34052005424 19.9452754062 1.90175147885 -1.21000777722 0.314165376408 9.55066601286 -0.290078376423 -0.166437585648 4 4 6 8 1 3 1 6 1 2 2 10 1 10 1 4 2 2 9 2 9 2 9 3 8 4 5 2 1 5 2 2 2 9 4 5 7 2 5 0 165.0 0.733333333333 85.0 0.647058823529 0.219283746556 0.21696969697 0.0622947936667 0.119350196177 0.037013440187 0.015714692073 0.00836254720667 0.00306990811201 0.0514855166546 0.909090909091 0.4 0.0 3.0 2.0 2.0 1.0 3.0 0.0 1.0 2.0 9.0 0.172413793103 0.0 3.0 1.0 0.515151515152 0.333333333333 0.833333333333 0.75 0.833333333333 0.5 0.416666666667 0.0833333333333 0.75 0.833333333333 0.5 0.0 0.416666666667 0.916666666667 0.75 0.0 0.333333333333 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.75 1.0 0.5 0.0 0.0 0.75 0.75 0.25 0.25 0.5 0.25 0.0 0.0 1.0 0.75 0.5 0.5 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -9.25220735841 7.13014145052 -21.7598004462 20.4074026133 1.17477568661 4.99336255233 -15.616927354 39.151113875 3.3338462322 0.462465753059 3.29654847818 40.2018039346 0.00946952087983 -2.12499613567 5.59994602857 25.3161460968 -1.14474312163 -0.464247454359 -3.57203624659 16.4787559199 0.0105125902899 -0.700300009961 -4.83498678738 4.42486445063 0.139372899583 -0.643385880602 6 1 9 6 6 8 3 3 5 3 3 2 5 3 10 3 10 2 10 4 4 4 2 3 3 4 3 3 2 4 4 3 3 3 3 4 3 4 2 6 2 4 4 2 1 0 182.0 0.928571428571 79.0 0.924050632911 0.200338123415 0.227237048666 0.0746744500518 0.111369897462 0.0600185649395 0.0213774257234 0.013833674442 0.0134409223359 0.0348683135071 0.846153846154 0.571428571429 3.0 5.0 2.0 1.0 0.0 2.0 2.0 3.0 1.0 5.0 0.214285714286 0.0 1.0 1.0 0.434065934066 0.375 0.3125 0.3125 0.8125 0.5625 0.0 0.3125 0.375 0.625 0.5 0.5625 0.625 0.1875 0.4375 0.4375 0.625 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.25 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.25 0.5 1.0 0.75 0.5 0.5 0.5 0.75 0.75 -3.18309886184 -0.818511135901 -12.1230877692 -0.71349630898 -5.99359883358 1.88897893098 -29.0428581801 5.57684875009 2.63561134995 -0.0820869057055 -23.7003144075 5.38032362547 -1.5443398553 -0.815679990253 -26.4307697119 1.12438590455 0.0125234735963 0.477688087852 -31.7041221444 1.77604758383 -0.668265575312 -0.471765657611 -35.9050241148 -1.14419594627 -0.0442179945969 -0.102783205207 3 1 10 3 2 3 3 3 4 2 3 2 5 2 3 1 6 3 9 2 8 4 6 7 2 10 1 4 4 2 2 4 3 4 2 3 2 6 2 3 3 4 156.0 0.923076923077 73.0 0.945205479452 0.22702991453 0.258382642998 0.0857637835264 0.120229184578 0.0685994369426 0.0232144285257 0.0122565846673 0.01357708188 0.02546919007 0.833333333333 0.615384615385 2.0 3.0 3.0 2.0 2.0 2.0 0.0 3.0 1.0 7.0 0.172413793103 2.0 1.0 2.0 0.467948717949 0.416666666667 0.25 0.416666666667 0.75 0.583333333333 0.0833333333333 0.5 0.75 0.0833333333333 0.0833333333333 0.583333333333 0.166666666667 0.333333333333 0.5 0.833333333333 0.583333333333 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.25 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.25 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.25 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.75 0.5 0.5 0.5 0.75 1.0 1.0 -0.391766013765 -2.64442059291 -4.10873194207 -4.37830048103 -4.44967374805 3.1486164982 -17.5070208724 7.72455462561 1.36848569361 1.96574677386 -13.6033903153 21.6169729965 0.636175304881 1.21306614064 -7.12067664092 32.3843428487 -0.177141154285 1.14273026222 -5.41375758709 43.6789187165 0.95596620028 0.790835322872 2.79860048545 53.4504391126 0.0463092337925 0.190007301828 3 1 6 3 2 5 3 6 1 5 3 6 2 4 5 4 2 4 5 4 2 4 5 3 3 4 5 3 4 3 5 3 3 4 5 3 3 4 5 3 3 4 4 5 3 3 4 5 3 13 3 5 1 5 1 0 210.0 1.07142857143 116.0 0.568965517241 0.260634920635 0.269047619048 0.107421336789 0.10071579743 0.0602849584278 0.0275853925387 0.00998412970572 0.00723526796836 -0.0127957135665 0.266666666667 0.928571428571 1.0 0.0 2.0 1.0 3.0 3.0 3.0 2.0 4.0 5.0 0.184210526316 0.0 1.0 2.0 0.552380952381 0.75 0.75 0.6875 0.625 0.4375 0.5 0.5 0.625 0.25 0.0 0.0 0.375 0.875 0.75 0.75 0.9375 0.5 1.0 0.75 0.5 0.5 0.5 0.25 0.25 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 -4.66854499736 -1.78253536263 -16.6316911618 -2.3885236656 -7.32593739829 2.8237623681 -37.6047607226 6.8646342005 3.33505345192 -0.120596219595 -29.273884047 6.35389688682 -1.74815068979 -1.86124690786 -36.1669186242 -7.56160198197 -1.82251184619 -1.03026609579 -51.2180984345 -18.9325063769 0.653137197757 -0.30803090273 -50.9011345357 -23.3237772952 -0.300568568692 -0.0337339585468 1 1 3 5 4 1 4 4 5 1 4 4 4 2 4 5 3 3 3 6 2 3 2 7 2 3 3 6 2 3 3 6 2 3 3 6 2 3 3 5 4 2 4 4 5 1 5 1 7 2 6 2 4 4 2 8 0 196.0 1.0 95.0 0.705263157895 0.217201166181 0.22667638484 0.0946395634472 0.0976702946901 0.0563726636011 0.0319747764432 0.0133134210902 0.0122521133922 0.0122586551711 0.285714285714 0.928571428571 0.0 1.0 2.0 1.0 3.0 3.0 3.0 3.0 1.0 6.0 0.242424242424 0.0 1.0 2.0 0.484693877551 0.9375 0.75 0.75 0.6875 0.25 0.1875 0.25 0.625 0.375 0.0625 0.0625 0.4375 0.875 0.5625 0.625 0.9375 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.5 0.5 0.5 0.5 0.25 0.25 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 -3.59235442979 -2.50100624859 -13.4696556387 -3.41069271177 -6.71188411611 3.91205634171 -33.5227244142 9.93397701272 2.56071184246 0.579148995333 -25.592619523 15.6893893535 0.107283721499 -0.333922151562 -22.4093710241 14.5402885662 -1.48282893102 0.706455541547 -30.3456451153 19.5378645514 1.24895722456 0.322244095788 -23.1176841697 23.5673817922 -0.0929735410822 -0.0225975123322 2 1 3 3 1 4 1 4 4 1 27 3 2 3 2 3 3 2 2 3 2 3 2 3 2 3 3 2 2 3 1 5 1 3 1 0 110.0 0.227272727273 49.0 0.897959183673 0.176363636364 0.245454545455 0.0125176558978 0.516396694215 0.056958677686 0.00126772948527 0.0284712382085 0.00407941583488 1.08602463492 1.2 195225785.955 1.0 3.0 1.0 1.0 0.0 4294967291.0 0.0 0.0 0.0 6.0 0.1 2.0 2.0 1.0 0.445454545455 0.416666666667 0.0833333333333 0.416666666667 0.5 0.583333333333 0.166666666667 0.916666666667 0.916666666667 0.666666666667 0.166666666667 1.0 1.0 0.333333333333 0.0833333333333 0.5 0.583333333333 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -2.83585171327 -2.43073003995 -5.02919728663 -0.907687429943 1.99081190649 6.85597882578 -2.15464586365 19.1695160249 -1.96455422156 -1.7842428212 -3.50441529977 18.263928974 2.56225408782 0.606769410719 2.71459279841 16.2800287352 -2.08780269373 -0.592317473666 -1.07740347704 11.2113613204 1.60991503069 -1.04966436865 0.308624418938 0.578874998928 -0.480677741193 -0.000203667747521 4 3 4 2 5 3 3 3 3 5 4 3 4 3 4 2 5 3 4 2 4 3 5 2 3 4 4 2 4 2 5 3 3 3 5 4 2 2 5 5 1 3 5 4 2 3 5 3 3 0 168.0 1.16666666667 72.0 0.902777777778 0.210459183673 0.202380952381 0.107515513646 0.0779174765144 0.0515468091999 0.0391463733588 0.010118076637 0.012585703933 0.000154375761106 0.214285714286 1.0 1.0 1.0 4294967295.0 2.0 3.0 3.0 3.0 3.0 3.0 6.0 0.321428571429 1.0 0.0 2.0 0.428571428571 0.166666666667 0.166666666667 0.25 0.583333333333 0.833333333333 0.833333333333 0.75 0.416666666667 0.25 0.25 0.0833333333333 0.166666666667 0.583333333333 0.5 0.5 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.25 0.25 0.0 0.0 0.25 0.5 0.75 0.0 0.5 0.5 0.0 0.25 0.75 1.0 1.0 0.5 0.75 0.75 0.5 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.86438647622 4.22897420216 -6.98599179752 11.9476935045 -3.50001672228 2.39567630083 -17.8753988441 18.934955043 0.756741177325 -1.49858673226 -17.8230658683 12.2363273432 -0.648523351089 -0.506596924837 -19.3981497215 5.53287727802 -0.149883778611 -0.287934668925 -22.6610187411 3.55430423259 -0.44706550279 0.384369538779 -27.2771605511 7.60875832037 -0.131537896478 0.148376703509 1 4 3 10 2 11 3 5 1 4 3 3 3 4 3 3 4 4 2 2 5 4 2 2 6 3 2 2 7 5 8 5 8 4 10 3 10 2 11 2 11 2 11 2 10 2 11 2 10 3 8 4 8 5 10 1 10 0 286.0 0.590909090909 103.0 0.728155339806 0.147391070468 0.121424030515 0.0344513914371 0.0941256894604 0.0243668625374 0.00977346370578 0.0067374080568 0.00121330617869 0.0692377541832 0.461538461538 0.363636363636 3.0 2.0 1.0 0.0 5.0 3.0 0.0 0.0 4.0 8.0 0.230769230769 0.0 5.0 2.0 0.36013986014 0.791666666667 0.208333333333 0.0 0.333333333333 0.541666666667 0.75 0.541666666667 0.541666666667 0.541666666667 0.583333333333 0.333333333333 0.0416666666667 0.708333333333 0.125 0.0 0.0 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.166666666667 0.5 0.5 0.833333333333 1.0 1.0 0.666666666667 0.5 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 1.0 0.833333333333 0.5 0.333333333333 0.666666666667 0.5 0.5 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 -7.92880989221 14.0924467792 -15.5282938214 32.4306823972 4.3364042158 -1.3745797508 -6.78458196397 34.5905527104 -2.68936336948 3.40694289588 -6.96403031946 43.8717299692 3.28618819749 -0.606222584049 1.48263052324 47.1493756715 -2.25057652154 0.948494619204 -0.78600088074 47.7735115026 1.98825292391 -0.981608790095 3.38736549912 42.0184365954 -0.471874388187 -0.0473660111984 3 5 5 7 2 4 2 3 2 3 4 3 8 3 8 3 6 5 3 4 1 3 3 3 2 2 3 3 3 3 1 4 2 9 2 5 1 4 3 3 143.0 0.846153846154 79.0 0.670886075949 0.265734265734 0.275416890802 0.0822609343319 0.132271757779 0.0605107641149 0.0160928411219 0.00746874124869 0.00833633261294 0.0205487164942 0.909090909091 0.615384615385 2.0 2.0 3.0 1.0 1.0 1.0 2.0 3.0 5.0 7.0 0.241379310345 0.0 2.0 1.0 0.552447552448 0.583333333333 0.25 0.333333333333 0.833333333333 0.666666666667 0.0833333333333 0.666666666667 0.75 0.583333333333 0.166666666667 0.416666666667 0.25 0.833333333333 0.75 0.75 0.75 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.5 0.75 0.25 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.979415034412 -0.783532027529 -5.11968539175 -0.516776369089 -3.87593357997 2.311187667 -17.0732422705 8.98622932002 0.792893755214 1.44188438202 -17.4673133272 16.0560149966 -0.774281048939 -0.803418977415 -20.2236364306 13.6415244314 -0.320200146134 0.218147638378 -23.5250256007 9.01030099442 0.114501062094 -1.66620550027 -24.465410589 -5.43507535638 -0.231036356479 -0.204044826526 2 2 4 3 3 13 1 6 4 3 2 4 5 3 3 3 6 2 3 3 5 3 3 3 6 2 3 3 5 3 3 3 5 3 3 2 7 2 3 3 5 3 2 4 5 4 1 4 5 4 182.0 1.07692307692 88.0 0.681818181818 0.224882260597 0.212172442942 0.105331315828 0.0863229874823 0.0556251501186 0.0378716805787 0.0132010657568 0.0150106736353 0.00307564000205 0.357142857143 0.923076923077 1.0 1.0 0.0 3.0 2.0 3.0 3.0 3.0 1.0 6.0 0.114285714286 0.0 1.0 2.0 0.483516483516 0.8125 0.5625 0.5 0.625 0.625 0.5 0.4375 0.4375 0.375 0.0 0.0 0.0 0.75 0.625 0.625 0.6875 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.09175068064 4.45633840657 -7.01655275394 12.029208624 -2.66108920884 1.95208409792 -14.1444773357 19.2005479642 1.98380239874 -0.167133049807 -4.82428550188 17.8021003486 1.0760104486 -0.710029768349 4.07764808858 12.1693201994 -0.593777805713 -0.0448172246365 0.209095161568 12.1898855485 -0.490595762417 0.952392799615 -6.74590256196 23.1312552604 -0.0957787382911 0.352235551626 1 2 2 4 1 30 40.0 2.5 36.0 0.111111111111 0.41 0.375 0.226 0.03125 0.015 0.00745902243092 -0.00158113883008 -0.00373544048607 -0.128220477002 0.0 0.25 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 5.0 1.0 0.125 0.0 1.0 2.0 0.9 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.65521140816 3.31042281631 -4.88439857683 5.96033248316 -1.37255222922 -2.72473262573 -9.8894788634 -1.22927117893 -0.00356507072526 1.11943220773 -9.17347967296 0.864965270634 1.01230183244 -0.0813549139504 -1.23050519953 1.60957555401 0.744692222694 -0.4549901345 6.33276688035 -1.39716396038 0.092906425149 0.364682280846 8.01215159079 0.303721005974 -0.0582495210166 -0.0581586169027 1 5 10 6 10 6 12 3 13 4 12 3 13 3 13 3 13 3 3 1 10 3 2 3 7 5 4 2 6 3 5 2 5 3 6 2 6 2 6 2 6 2 6 2 5 2 7 2 5 3 6 2 5 3 5 4 4 3 6 4 3 3 5 5 1 7 2 6 1 6 3 10 1 1 5 1 2 2 1 0 368.0 0.695652173913 132.0 0.787878787879 0.135360054348 0.200850661626 0.0411514102888 0.15141141253 0.0604856341693 0.0153840750915 0.0261677428335 0.0192211924517 0.127570322481 0.75 0.739130434783 5.0 4.0 3.0 0.0 0.0 2.0 5.0 5.0 3.0 4.0 0.255319148936 1.0 0.0 2.0 0.358695652174 0.708333333333 0.458333333333 0.375 0.583333333333 0.666666666667 0.625 0.583333333333 0.541666666667 0.0 0.166666666667 0.0416666666667 0.0833333333333 0.0 0.166666666667 0.5 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.5 0.333333333333 0.333333333333 0.166666666667 0.333333333333 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.833333333333 0.833333333333 0.5 0.333333333333 0.5 0.333333333333 0.166666666667 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 -10.6287822865 -11.9573800723 -23.3862698396 -27.9373824345 3.79115001452 2.02177923928 -8.97323543177 -17.3681210251 2.05569197538 4.51284370888 -1.44968955281 3.74710211949 -3.95321533945 -2.51699002671 -14.1352214088 -3.99719065874 3.9605535891 0.430930949804 3.83193403282 -7.58043597209 -1.23945174191 -0.346548122808 2.89927626073 -7.55235151677 -0.0145375091571 0.179134575662 5 3 7 6 3 10 2 11 1 3 2 6 9 1 13 1 10 2 9 3 9 3 2 1 5 4 1 3 3 5 2 11 1 11 168.0 0.857142857143 84.0 0.642857142857 0.248015873016 0.248299319728 0.0824796188317 0.133358303639 0.0675632356117 0.0179601827546 0.0156944614929 0.0119872489493 0.0366514874775 0.916666666667 0.214285714286 3.0 3.0 3.0 2.0 0.0 1.0 0.0 2.0 5.0 4.0 0.172413793103 2.0 3.0 1.0 0.5 0.5 0.5 0.0 0.5 0.666666666667 0.333333333333 0.0 0.333333333333 0.916666666667 0.416666666667 0.0 0.333333333333 0.916666666667 0.583333333333 0.166666666667 0.75 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.25 1.04587534032 1.13682102208 -2.04000971319 4.52741067413 -6.2636518274 2.59984007622 -19.7175808746 13.381388266 2.69133499263 0.245896138946 -11.103563538 18.1762075643 0.966268445488 1.1501545048 -0.489823819603 23.9675737025 -0.350798527661 -0.224065117766 -1.47960743531 22.9059743166 0.287442762194 -0.498492038905 -0.509839284883 17.621401977 -0.0861506305156 -0.00429000202653 0 5 9 5 9 5 10 4 11 4 10 3 11 3 11 3 11 3 5 4 2 3 3 6 2 2 5 4 3 3 3 2 6 3 3 1 7 3 1 2 8 6 8 8 6 8 5 4 2 4 4 4 3 5 2 5 1 13 1 9 1 3 2 1 1 2 1 1 308.0 0.636363636364 141.0 0.574468085106 0.177179962894 0.261068476978 0.0434188218595 0.188171877772 0.066030960522 0.012766395752 0.0185204959567 0.0134538910388 0.164715992981 0.928571428571 0.636363636364 2.0 3.0 4.0 3.0 0.0 2.0 3.0 4.0 3.0 13.0 0.16 0.0 1.0 2.0 0.457792207792 0.791666666667 0.5 0.5 0.708333333333 0.541666666667 0.458333333333 0.666666666667 0.75 0.0 0.125 0.5 0.791666666667 0.0 0.458333333333 0.25 0.666666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 0.5 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.666666666667 1.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.5 0.833333333333 -11.7485285264 -14.4107566654 -24.0718305355 -31.579233928 6.0005359536 4.60532943519 -7.13099314613 -16.8942159794 -1.40405114986 1.93593072125 -9.3482493558 2.37567132109 -1.59980001954 1.8354363068 -15.7615397455 14.3029908559 2.64214361445 -0.460641281579 -3.58103968453 11.3318410922 -1.6515287741 -1.10034250628 -7.0580069245 1.86459928977 0.400554036112 0.200479608578 1 1 1 9 1 1 6 2 11 2 5 1 5 2 3 5 7 6 6 8 5 9 4 9 4 9 4 8 1 2 3 6 2 3 3 3 4 3 5 1 4 3 5 182.0 0.928571428571 89.0 0.674157303371 0.232037193576 0.220172684458 0.0799103535035 0.103784679878 0.0579565495487 0.0197600231183 0.0147624854957 0.00839299054036 0.0195371058387 0.615384615385 0.571428571429 2.0 2.0 0.0 3.0 3.0 1.0 0.0 3.0 4.0 11.0 0.235294117647 0.0 2.0 1.0 0.489010989011 0.75 0.3125 0.0 0.25 0.5625 0.875 0.5625 0.4375 0.375 0.75 0.75 0.625 0.6875 0.1875 0.0 0.4375 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 1.0 -2.54647908947 3.09215318007 -4.74539888623 6.8076846908 1.75766450272 -0.752621917478 -0.902161888733 6.04368381085 -1.19655502464 1.17817460312 -3.2843215459 11.1200552693 0.567385430862 0.557498699932 -2.7049985647 14.6639417942 -0.347950994907 -0.660981919011 -3.67243748344 10.570976291 0.0897394461394 0.0773971596215 -2.08292222461 8.5026023183 0.187499803752 -0.14842329952 7 1 1 1 7 8 4 9 2 5 2 5 1 12 1 11 2 3 9 3 10 4 9 4 10 4 5 2 2 5 2 4 3 10 4 7 3 0 182.0 0.928571428571 98.0 0.602040816327 0.236686390533 0.249607535322 0.0792453531253 0.106433235886 0.0435960911447 0.0198899490914 0.00720611567378 0.00321407102544 0.0165014611648 0.846153846154 0.285714285714 0.0 3.0 5.0 3.0 1.0 1.0 0.0 2.0 2.0 3.0 0.28 0.0 2.0 3.0 0.538461538462 0.25 0.75 0.875 0.75 0.625 0.75 0.1875 0.625 0.75 0.625 0.0 0.375 0.6875 0.6875 0.0 0.5 0.0 0.0 0.25 0.5 0.5 0.5 0.75 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.25 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.75 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 -9.54929658551 5.59315942866 -24.1021042854 13.9282788237 -1.55489275306 1.28553577212 -29.6594438784 23.0695666852 1.05124931724 3.27510276726 -23.7331053589 36.3841297876 -0.125355452183 -1.17118458611 -22.7777883762 29.1092212807 -0.401813955627 -1.86272619552 -26.0178048482 13.2955969891 -0.229886173043 0.34231625967 -30.0031127841 8.35417798612 -0.188996708782 -0.495209706733 1 3 3 2 1 1 3 12 2 7 2 4 2 4 4 4 2 3 6 3 2 4 5 2 3 3 5 3 2 4 5 3 2 4 5 4 2 3 5 4 2 3 5 4 2 3 5 4 1 5 4 10 3 4 2 0 196.0 1.0 110.0 0.563636363636 0.240160349854 0.258017492711 0.0956185082321 0.103147923059 0.0513986519222 0.0272092762713 0.00761994073417 0.0106071481417 0.0049915705181 0.5 1.0 2.0 2.0 2.0 1.0 3.0 3.0 3.0 3.0 4.0 11.0 0.146341463415 0.0 1.0 2.0 0.561224489796 0.875 0.75 0.875 0.8125 0.6875 0.375 0.25 0.3125 0.5625 0.125 0.25 0.25 0.75 0.75 0.875 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.75 0.75 0.5 0.5 0.5 1.0 0.75 0.25 0.25 0.25 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.77384329389 3.31951738449 -12.9918912 10.2938117575 -8.76373005882 3.59096240405 -39.1220521418 24.1933799545 2.87758235509 1.24951828976 -32.6970408621 32.3329085421 -0.303303672829 0.260424139376 -28.5913614195 34.1807075695 -0.629830075086 0.0148634935144 -34.0695966036 33.3446753959 0.164839885811 -0.16058883835 -33.0195850005 32.7275286511 0.0036518485717 0.159780212067 8 3 7 8 4 9 3 4 3 2 4 3 10 3 10 3 10 3 8 5 7 6 7 6 8 5 9 4 8 5 9 4 9 4 9 4 9 4 9 4 9 4 7 7 6 8 6 1 11 0 299.0 0.565217391304 109.0 0.614678899083 0.122716748135 0.168387378217 0.0238479820675 0.143613276905 0.0234295150343 0.00672830479803 0.00824390450582 -0.000254548359675 0.136012552475 0.384615384615 0.0434782608696 3.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 3.0 3.0 0.272727272727 1.0 4.0 1.0 0.364548494983 0.125 0.583333333333 0.666666666667 0.583333333333 0.625 0.75 0.75 0.791666666667 0.458333333333 0.0 0.0 0.0416666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 0.666666666667 0.5 0.0 0.333333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -16.3306811173 5.6465405897 -27.461113748 16.1833635199 15.7412047997 4.14653108577 12.4586570751 33.061127716 -7.73983089189 1.78286489175 -2.90242924605 42.2054871989 1.9529481801 -0.838781906755 -5.13219094183 34.6145584878 0.694677371438 -1.73421734153 5.3657940433 18.1602522448 -0.850843275642 -0.477328049575 -2.56071200401 11.1622228085 -0.0134422057653 0.0896671228325 3 5 5 7 3 8 3 3 2 3 3 3 3 2 2 6 6 7 5 8 5 7 5 5 1 2 5 3 1 2 5 3 1 4 1 4 3 7 3 0 154.0 0.785714285714 89.0 0.61797752809 0.250885478158 0.269944341373 0.0624941132404 0.129047626349 0.0504651361457 0.0101574269596 0.00533654793077 0.00511465345615 0.036383211679 1.09090909091 0.357142857143 2.0 2.0 4.0 1.0 0.0 2.0 0.0 3.0 5.0 13.0 0.147058823529 2.0 3.0 1.0 0.577922077922 0.416666666667 0.75 0.25 0.583333333333 0.833333333333 0.833333333333 0.583333333333 0.166666666667 0.833333333333 0.5 0.916666666667 0.333333333333 0.916666666667 0.583333333333 0.916666666667 0.833333333333 0.0 0.25 0.5 0.5 0.75 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.5 1.0 1.0 0.75 1.0 1.0 1.0 0.5 0.25 0.75 1.0 -7.36660022311 3.59235442979 -20.0604417571 9.72235469932 -3.3478219079 1.66509479092 -31.3161030687 16.2319192518 1.13272543615 0.258829194431 -25.4569296569 17.1807332753 0.829162280384 -0.509697234355 -18.6367517719 12.4709298795 -0.566856820296 -0.742629820837 -21.1018880382 4.19010899676 0.0384503411915 -0.829736834533 -21.2498801648 -6.91019072777 0.097215319555 -0.30883013057 1 3 3 5 3 4 4 4 4 4 4 3 5 3 6 2 4 3 5 3 4 2 6 2 5 2 7 1 4 3 6 3 3 3 6 3 4 3 5 3 4 2 6 5 1 4 4 6 1 4 4 6 11 2 2 0 210.0 1.07142857143 88.0 0.875 0.195873015873 0.193537414966 0.0958320915668 0.0837932188749 0.0605719684699 0.0364434648049 0.0182432463133 0.020131709441 0.0119584273505 0.4 0.928571428571 2.0 1.0 1.0 1.0 3.0 3.0 3.0 3.0 1.0 3.0 0.206896551724 1.0 0.0 2.0 0.419047619048 0.75 0.5 0.625 0.625 0.375 0.375 0.3125 0.4375 0.375 0.0 0.0 0.125 0.6875 0.5 0.625 0.875 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 0.806385044999 -9.24424638137 3.79861390226 -6.64008569685 2.75529037481 -27.0502157702 13.2059400772 3.96704974044 0.00532769534604 -13.5177893978 14.4812326834 -0.217198686506 -0.368938808785 -11.5932762765 12.787055357 -2.19621277176 0.866486706913 -27.9806889715 19.8958673546 0.385460577639 0.730161377367 -29.8469250352 27.9757946675 -0.135542867942 0.000695657041717 6 1 11 9 5 4 3 5 3 3 5 4 2 3 7 3 2 3 7 8 8 7 8 7 8 3 1 4 6 3 2 5 5 3 3 6 1 4 6 9 9 4 4 0 210.0 1.07142857143 98.0 0.744897959184 0.221587301587 0.226870748299 0.103809091891 0.0873578447252 0.0573927221682 0.0363805199938 0.0109151411603 0.0121166556459 0.0014501960441 0.533333333333 0.714285714286 0.0 2.0 3.0 1.0 1.0 3.0 3.0 2.0 1.0 10.0 0.171428571429 0.0 2.0 2.0 0.466666666667 0.3125 0.75 0.9375 0.5 0.625 0.3125 0.3125 0.75 0.375 0.0 0.0 0.4375 0.625 0.5 0.3125 0.75 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.22554018 3.14065754368 -12.1338104447 13.0795521461 -6.73854955498 8.32868427529 -37.1183095228 42.2464058634 -1.54562687674 0.166336433298 -46.9536322949 42.8318473554 1.0552025112 -3.86420088025 -41.5126360347 17.2029344295 -0.709568534903 0.185068515271 -44.5922667336 14.534410917 -0.376746147549 1.60070870057 -48.7481040122 32.3363613263 0.0158473900893 0.380233765133 1 5 59 39 1 1 1 5 14 2 2 63 2 129 38 1 7 4 4 9 3 0 390.0 10.8333333333 258.0 0.457364341085 0.31258382643 0.296581196581 1.13354749743 0.00672607427637 0.0586018644954 0.686098759147 0.000236941896003 0.0171239860154 -0.0428737822649 0.0 0.833333333333 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 2.0 11.0 0.0547945205479 0.0 1.0 17.0 0.661538461538 0.647058823529 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.382352941176 0.882352941176 1.0 1.0 0.0588235294118 0.5 0.941176470588 0.970588235294 0.555555555556 0.555555555556 0.555555555556 0.555555555556 0.555555555556 0.555555555556 0.555555555556 0.555555555556 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -8.97144171521 4.01560164109 -24.5611251633 5.95998021731 -4.90927787204 -3.97970752892 -46.2196668089 0.891590311793 -3.62132260218 4.60932167012 -67.4097026251 7.16199674555 -1.82421962328 -4.70792941077 -79.7101285746 -0.0146346068002 0.700617528738 4.43723775062 -72.592927424 5.37768601429 1.24516525691 -4.35867003818 -59.8049982961 -0.699762614845 -0.066392679648 1.31221822568 1 3 11 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 12 4 2 4 6 2 5 3 5 2 6 3 3 3 6 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 7 2 3 3 6 3 3 3 6 2 5 4 3 2 8 2 2 1 5 0 330.0 0.681818181818 104.0 0.884615384615 0.12303030303 0.163223140496 0.0400837298606 0.120310126054 0.0548864679856 0.0172302576326 0.0246952232585 0.018634713048 0.0927979638848 0.266666666667 0.545454545455 1.0 1.0 0.0 1.0 0.0 0.0 5.0 5.0 1.0 3.0 0.384615384615 1.0 0.0 2.0 0.315151515152 0.75 0.5 0.416666666667 0.458333333333 0.458333333333 0.541666666667 0.541666666667 0.583333333333 0.0 0.0833333333333 0.0833333333333 0.0416666666667 0.0 0.125 0.541666666667 0.375 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.166666666667 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.666666666667 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -8.50755513982 -6.53982129796 -19.5835151184 -13.5971263491 1.87721521533 3.76172453398 -11.0491180071 2.20260860631 2.46846894591 3.38235654983 -1.10573214251 19.7229859762 -2.44283923278 -1.33088738217 -5.62913733887 17.7047696197 2.94956507415 0.636284917098 6.31508852483 13.6488710847 -1.67637106513 -1.85186336597 -0.518624601087 1.31479233642 -0.0163129236329 0.0602600065665 6 1 1 2 6 1 6 3 2 6 3 6 3 20 4 5 2 7 2 4 3 3 5 5 4 3 4 2 6 3 6 3 2 3 5 3 7 3 2 3 5 3 6 4 2 3 6 3 6 2 2 4 6 2 7 2 2 4 5 3 7 3 1 4 5 4 5 4 1 5 3 5 4 6 1 4 4 2 7 3 1 1 322.0 1.64285714286 157.0 0.71974522293 0.218606535242 0.222049689441 0.154264384545 0.057127383706 0.0522744274828 0.0670384010087 0.00837340178525 0.0179557435424 -0.0226059103888 0.521739130435 1.92857142857 3.0 3.0 2.0 4.0 4.0 6.0 6.0 6.0 7.0 15.0 0.172413793103 0.0 5.0 3.0 0.487577639752 0.625 0.541666666667 0.541666666667 0.708333333333 0.791666666667 0.375 0.25 0.333333333333 0.583333333333 0.583333333333 0.375 0.416666666667 0.625 0.458333333333 0.375 0.458333333333 0.5 1.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.833333333333 0.5 0.5 0.666666666667 0.5 0.166666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 0.166666666667 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.0 0.166666666667 0.666666666667 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 -5.867973554 9.05107241583 -17.3384767832 16.4569850342 -6.78719243794 -7.97080186267 -53.0221500067 -10.0698307919 -8.26301128407 -1.02997858984 -77.4012295026 -20.3649109153 10.5860157725 2.05820843836 -24.4096746037 -6.82643789454 0.00524463143245 0.171771144051 -1.56219121435 -3.2059036777 -1.00940972676 -0.720663511531 -22.1517442663 -10.7236394156 -0.580647648207 -0.127522975507 7 6 4 9 4 9 3 4 9 3 10 3 10 3 9 4 9 4 8 8 4 9 5 6 8 4 9 4 10 3 10 3 9 4 9 4 9 4 8 5 7 8 5 8 5 0 286.0 0.590909090909 115.0 0.539130434783 0.145508337816 0.188493324857 0.0287989615646 0.15457763421 0.0266095218293 0.00747588361601 0.00822375521709 -0.000943100137193 0.140971368569 0.615384615385 0.0 3.0 0.0 5.0 0.0 0.0 0.0 0.0 0.0 1.0 5.0 0.258064516129 0.0 1.0 1.0 0.402097902098 0.125 0.541666666667 0.541666666667 0.583333333333 0.666666666667 0.833333333333 0.833333333333 0.791666666667 0.5 0.25 0.166666666667 0.0833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.833333333333 0.333333333333 0.166666666667 0.0 0.333333333333 0.5 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.5 0.0 0.0 0.666666666667 0.5 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -15.5103726359 4.28271483229 -26.8667625639 10.8493225296 13.8664491515 1.81108998352 8.07930992706 23.9605903873 -6.67057756237 5.03744848134 -3.25248132634 45.3579815218 2.39307821434 -0.612382908499 -1.70693525473 52.0577155293 0.377938758669 1.50066577282 7.8372063714 52.7333704341 -0.545649363677 -2.03239234147 1.0496944924 45.2708912726 -0.0421019785233 0.528567961144 1 11 1 9 7 6 7 5 3 2 4 4 4 10 3 11 3 11 3 11 3 10 5 8 6 8 6 9 5 10 3 11 3 11 3 11 3 11 3 11 3 11 3 9 6 7 8 7 2 1 1 1 2 6 0 322.0 0.608695652174 100.0 0.74 0.111357586513 0.148663246017 0.0242986273869 0.127101583862 0.025920432868 0.00733479842149 0.0106565835042 0.00105015383301 0.116968364695 0.357142857143 0.130434782609 2.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 6.0 0.151515151515 0.0 2.0 1.0 0.310559006211 0.0833333333333 0.375 0.458333333333 0.333333333333 0.458333333333 0.833333333333 0.875 0.791666666667 0.416666666667 0.0833333333333 0.125 0.0416666666667 0.541666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.5 0.5 0.833333333333 1.0 0.666666666667 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.833333333333 1.0 0.666666666667 0.5 0.5 0.666666666667 0.166666666667 0.0 0.333333333333 0.5 0.166666666667 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -13.8949185099 4.04115159851 -23.0646062102 9.79751057986 13.5654898844 0.383112515269 9.89550151121 13.1618646913 -7.66357787766 0.935327987491 -6.0396284024 14.6673086718 2.67285046696 -1.20222935656 -5.27999170349 8.59602721016 -0.253640489568 -0.195250054285 -0.388192251868 1.95284903025 -0.915789842255 -0.927759252755 -11.1553847688 -5.75752975718 0.0363684414907 -0.0593572497813 8 3 4 4 10 17 6 3 2 13 6 3 2 13 5 2 6 3 13 2 6 3 13 2 6 3 13 2 6 3 13 2 6 3 11 4 5 4 4 3 3 5 4 5 4 4 2 5 5 4 4 4 4 3 6 3 5 3 4 3 6 2 6 3 4 3 6 3 5 3 4 3 6 3 5 3 4 3 6 3 4 4 4 3 6 3 5 3 4 3 5 4 5 3 3 5 4 5 4 4 1 7 2 7 1 14 2 6 3 6 528.0 1.09090909091 237.0 0.649789029536 0.213383838384 0.230716253444 0.0972876579152 0.100819880972 0.0589601681415 0.0323583268438 0.0145015149785 0.0146931617489 0.0124562355427 0.75 1.54545454545 3.0 5.0 4.0 6.0 4.0 6.0 10.0 10.0 2.0 9.0 0.12676056338 2.0 1.0 4.0 0.448863636364 0.25 0.472222222222 0.611111111111 0.638888888889 0.472222222222 0.0833333333333 0.0833333333333 0.194444444444 0.722222222222 0.555555555556 0.527777777778 0.666666666667 0.611111111111 0.166666666667 0.388888888889 0.444444444444 0.0 0.0 0.0 0.0 0.555555555556 0.777777777778 0.333333333333 0.333333333333 0.111111111111 0.444444444444 0.666666666667 0.666666666667 0.888888888889 1.0 1.0 1.0 0.555555555556 0.777777777778 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.555555555556 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.888888888889 0.444444444444 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.777777777778 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.666666666667 0.888888888889 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.666666666667 0.888888888889 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -8.35563451232 3.74014116266 -25.3459021328 11.7843184411 -8.75324555939 4.80366091259 -60.8325787802 32.8526822565 -2.25995452389 3.34434724198 -60.1563756805 46.9445365277 9.17209059225 -2.56947741845 -12.776144579 33.9780667197 -3.05393710522 -0.288478696129 -14.8177037899 25.9007947626 0.232795966143 0.420305935477 -24.5735139572 32.1299705043 0.0308223771973 0.237346956053 8 2 6 2 1 3 3 2 4 2 2 3 5 1 1 3 8 3 7 4 7 4 8 3 7 4 8 4 8 4 4 1 2 6 1 2 4 4 3 0 154.0 0.785714285714 57.0 0.912280701754 0.140495867769 0.188775510204 0.0477391557675 0.117783654194 0.0402260077585 0.0194502038844 0.0175430776245 0.00750910054504 0.0786587269881 0.545454545455 0.357142857143 1.0 0.0 2.0 1.0 2.0 1.0 0.0 2.0 1.0 2.0 0.473684210526 1.0 2.0 1.0 0.37012987013 0.0833333333333 0.666666666667 0.916666666667 0.583333333333 0.416666666667 0.75 0.666666666667 0.916666666667 0.333333333333 0.0833333333333 0.0 0.5 0.25 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -10.5496990849 -0.682092613251 -21.7218365026 1.11549340372 5.71472967673 4.36608873768 -1.56578933532 17.7820169254 2.30881200065 1.76445654668 14.3744833584 27.5666034386 -1.11112705424 -1.44699803339 10.6540243407 17.4571351255 0.53241516689 -1.35250950698 10.9604528291 2.59272401754 -0.505531807255 -0.752687490516 6.46731373966 -6.69089240194 -0.171799577329 0.00325514559809 7 7 6 10 4 3 3 5 4 2 13 2 12 3 12 3 12 3 12 2 13 3 12 3 12 3 12 3 11 4 11 4 10 5 10 5 9 6 10 5 10 6 10 1 2 2 8 0 315.0 0.714285714286 90.0 0.666666666667 0.0996825396825 0.130763416478 0.027782744844 0.101765508084 0.0183181561866 0.0107150864305 0.00761379346738 -0.000418247290481 0.0815054737014 0.133333333333 0.0952380952381 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 5.0 2.0 0.235294117647 0.0 3.0 1.0 0.285714285714 0.0416666666667 0.25 0.416666666667 0.708333333333 0.5 0.708333333333 0.75 0.75 0.333333333333 0.0 0.0 0.0833333333333 0.458333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.0 0.333333333333 0.5 0.5 0.5 0.833333333333 1.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -16.4308531725 1.57639181729 -32.0066690285 6.61190566678 10.5414500435 4.67720649086 -2.25556280734 26.6189871817 -2.19938929224 3.91004252031 -0.0533070794554 50.6094408858 0.0944581108208 1.72827046741 -1.07858845779 64.0488101538 1.83348900235 -0.171068204215 10.3053337203 62.3200350114 -1.26713803399 -0.718304753265 5.68650242348 54.1957537135 0.290042178779 -0.0476849410239 0 5 2 15 1 5 3 2 2 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 7 6 5 6 4 0 143.0 0.846153846154 63.0 0.539682539683 0.157024793388 0.171597633136 0.0455945834204 0.100610524494 0.0255758227786 0.0154119120343 0.00842334076519 -0.00155537438636 0.0550004173269 0.272727272727 0.153846153846 1.0 0.0 2.0 0.0 2.0 0.0 0.0 0.0 3.0 1.0 0.0869565217391 0.0 1.0 1.0 0.440559440559 0.75 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 0.583333333333 0.333333333333 0.333333333333 0.666666666667 0.416666666667 0.0 0.0 0.166666666667 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -9.79415034412 2.25265457915 -20.0085944135 7.36610251615 5.07441304219 3.10283319186 -5.37070702359 19.7000917035 -0.705579355836 1.32292185634 -4.13994583913 26.6731135209 -1.3332381 -0.779916063509 -13.9363927235 20.8250982636 0.0237955002773 -0.976062669834 -16.5221437611 10.4764429822 -0.400708600931 -0.570764730421 -18.8637524309 2.01439157821 0.0432123478174 -0.183012861306 3 2 2 6 2 13 3 6 3 4 3 4 4 4 3 4 5 3 3 3 6 3 3 3 6 3 3 3 6 2 4 3 6 2 4 3 6 3 3 3 6 3 3 4 5 4 2 4 4 5 195.0 1.15384615385 97.0 0.60824742268 0.239658119658 0.211439842209 0.113688228055 0.0800706687571 0.0548888551729 0.0376241719694 0.012950149715 0.0132440459256 -0.00851575259089 0.2 0.923076923077 0.0 1.0 0.0 1.0 2.0 3.0 3.0 3.0 3.0 8.0 0.0810810810811 0.0 1.0 2.0 0.497435897436 0.625 0.5 0.5 0.5 0.8125 0.625 0.5 0.625 0.5 0.0 0.0 0.0 0.875 0.5625 0.5 0.5625 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.88600963473 7.72431990473 -8.91397576511 19.8514040249 -2.48536359132 1.82214725958 -14.3804688236 26.4466949066 3.04288113011 -0.7711702782 0.0730870052134 21.2275773206 0.896668256962 -0.845173778317 8.01812854974 12.8290806707 -1.07894198079 -0.751523678704 2.14440071166 4.70521894351 0.423954467983 -0.454411577241 1.55963510791 -1.43383625734 -0.192840940229 -0.115826344248 1 2 2 4 1 4 1 4 26 4 1 4 1 4 2 3 3 2 3 1 9 1 3 2 3 2 3 3 1 10 110.0 0.227272727273 50.0 0.8 0.156363636364 0.234710743802 0.0116333583772 0.501409466566 0.0494154770849 0.0014442096081 0.0292553711559 0.00490933009507 1.07706786688 1.6 195225785.909 2.0 2.0 2.0 2.0 4294967295.0 4294967292.0 4294967295.0 0.0 3.0 0.0 0.3125 2.0 4.0 0.0 0.454545454545 0.583333333333 0.333333333333 0.416666666667 0.416666666667 0.666666666667 0.333333333333 0.666666666667 0.75 0.583333333333 0.333333333333 0.75 0.583333333333 0.25 0.166666666667 0.333333333333 0.25 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -3.5303460104 -0.925992396171 -6.27202644359 -0.365062538069 2.40836942811 3.36939743534 -3.3575784098 14.8759659604 -2.83731478332 3.20966042656 -6.95516382912 29.6699707775 3.17277143102 -1.47975235111 0.0939492728753 26.9429978601 -2.75384280986 1.28610868478 -6.22713442086 30.7583605486 1.92725773098 -0.603123406023 -3.82135898903 27.2333175835 -0.502227030259 -0.194236960506 5 4 7 7 1 1 3 3 4 4 1 4 3 5 1 11 2 9 4 4 8 4 10 3 10 4 9 4 10 5 1 3 5 7 8 4 4 0 182.0 0.928571428571 86.0 0.720930232558 0.193575655114 0.201726844584 0.0644683778967 0.0897951221584 0.0371189310629 0.0189187081784 0.00866530483218 0.00271431574987 0.025672244542 0.846153846154 0.285714285714 0.0 3.0 6.0 2.0 2.0 1.0 0.0 1.0 0.0 13.0 0.129032258065 1.0 3.0 1.0 0.472527472527 0.375 0.75 0.8125 0.5625 0.625 0.75 0.375 0.75 0.625 0.625 0.0 0.4375 0.625 0.5 0.0 0.1875 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.75 1.0 0.75 0.25 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.25 0.75 1.0 0.5 0.0 0.0 -11.4591559026 5.95694215573 -26.5179815817 15.8962052959 1.81798561818 3.05526449793 -19.8453297445 32.2246842335 2.13175958375 4.37580687657 -6.25168927838 52.170578242 -0.272317403038 -1.02039008333 -4.02491983188 46.3289215888 0.491220668643 -2.04940045097 -1.91883887544 28.0519145472 -0.479105788565 -0.0310327822259 -8.08701514841 19.0697036965 -0.379359871199 -0.505877517432 9 2 13 5 5 3 4 5 4 4 4 5 3 4 4 5 4 3 4 6 3 3 5 4 4 3 6 4 2 4 6 4 2 4 6 3 3 4 6 3 4 3 5 3 5 3 4 3 6 5 2 1 8 3 13 3 13 3 13 3 13 3 12 4 11 7 8 8 10 1 1 1 1 1 9 0 368.0 0.695652173913 133.0 0.789473684211 0.15964673913 0.156309073724 0.0491708489151 0.101921898597 0.0317343884842 0.0174000341365 0.00520739284744 0.00373773446004 0.0635669279219 0.4375 0.608695652174 2.0 2.0 2.0 1.0 3.0 5.0 3.0 0.0 4.0 8.0 0.191489361702 3.0 2.0 2.0 0.361413043478 0.291666666667 0.375 0.291666666667 0.375 0.458333333333 0.75 0.791666666667 0.791666666667 0.166666666667 0.0 0.0833333333333 0.0833333333333 0.791666666667 0.375 0.291666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.166666666667 0.166666666667 0.5 0.166666666667 0.0 0.0 0.333333333333 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.5 0.5 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.333333333333 0.5 0.5 0.5 0.5 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 -9.2448262596 14.1717097153 -18.7360570395 32.7986792719 4.82600378767 -1.94475907778 -6.51417951732 28.1547947795 -2.37368717886 -0.00967262322399 -13.956825622 26.7836942999 -1.07526724678 2.15643348032 -17.8606222609 36.4353717081 2.88117816947 -1.39787676158 -3.04345746761 29.1505932548 -1.88777679706 -0.29914059571 -9.22086935427 21.2665495508 0.300998018287 -0.066022366155 0 3 1 2 2 12 3 5 1 5 4 2 4 4 3 2 5 4 3 2 6 3 3 2 6 3 2 3 7 6 8 5 10 4 11 2 12 2 12 2 12 2 12 1 12 2 12 2 10 3 10 4 9 4 10 4 11 2 10 0 308.0 0.636363636364 97.0 0.80412371134 0.125927643785 0.10847107438 0.0318318651116 0.0846371935326 0.0230562125301 0.00982921009066 0.00762634359136 0.00188749331156 0.0632459837861 0.5 0.363636363636 2.0 3.0 2.0 0.0 6.0 2.0 0.0 0.0 2.0 7.0 0.315789473684 0.0 2.0 2.0 0.314935064935 0.625 0.0833333333333 0.0 0.375 0.708333333333 0.625 0.291666666667 0.583333333333 0.25 0.625 0.416666666667 0.0833333333333 0.666666666667 0.208333333333 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.333333333333 0.5 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.166666666667 0.833333333333 0.833333333333 0.5 0.333333333333 0.0 -9.05736312505 9.28886122409 -19.4901909335 19.4337432405 2.66617412932 -3.66869482269 -15.6629025051 12.2827962653 -2.28140400238 2.75161821032 -17.365960459 18.0330719139 1.91123395921 -0.897083451394 -15.2701518505 17.1813530032 -2.17784836431 -0.0206201349734 -21.7741963721 14.2955455755 1.01738259638 0.129777505575 -25.2845453814 14.2565211395 -0.49873551293 -0.18303882023 1 3 4 9 7 10 6 10 6 12 3 13 3 13 3 13 3 13 3 13 3 2 6 5 4 3 4 5 3 6 3 4 3 5 4 4 3 5 4 4 3 6 3 4 3 6 3 4 3 5 4 4 3 6 3 4 3 5 4 3 4 5 5 1 6 3 6 1 6 5 2 1 1 352.0 0.727272727273 137.0 0.686131386861 0.171875 0.212164256198 0.0551717458678 0.143418378708 0.0690030184659 0.0198217353931 0.0244531480065 0.020146464825 0.0957573366792 0.4375 0.636363636364 2.0 1.0 4.0 0.0 0.0 1.0 5.0 5.0 4.0 4.0 0.0681818181818 1.0 0.0 2.0 0.389204545455 0.541666666667 0.25 0.25 0.375 0.916666666667 0.791666666667 0.791666666667 0.791666666667 0.166666666667 0.125 0.0416666666667 0.0416666666667 0.0 0.291666666667 0.416666666667 0.458333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.5 0.5 0.5 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -6.25044867415 -9.66504563504 -15.2437291542 -22.880556632 0.0373075448871 1.27108718638 -14.1930657889 -15.2334140199 1.01968421954 3.78312063629 -13.1101829007 1.77528039591 -2.90450625894 -1.86656802111 -25.0864430016 0.849342929924 1.46167652344 2.25219504208 -22.1520492315 10.9634849975 -1.02520992881 -0.558125432598 -28.2911797319 12.8176576897 -0.240090938563 0.0840121700613 3 5 4 9 3 4 1 4 3 3 5 2 10 2 9 4 6 6 4 8 2 3 3 3 2 4 3 3 2 4 3 4 1 24 156.0 0.923076923077 92.0 0.532608695652 0.263354700855 0.309171597633 0.0833741613143 0.133010449856 0.0607544062611 0.0155643310704 0.00459073479355 0.00777091177997 0.0126252257572 1.0 0.384615384615 3.0 5.0 3.0 1.0 1.0 1.0 1.0 2.0 6.0 5.0 0.157894736842 0.0 3.0 2.0 0.589743589744 0.75 0.25 0.416666666667 1.0 0.666666666667 0.0833333333333 0.5 0.833333333333 0.666666666667 0.166666666667 0.416666666667 0.5 0.75 0.583333333333 0.833333333333 0.833333333333 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.5 1.0 1.0 0.5 0.0 0.0 0.5 1.0 0.5 1.0 1.0 0.5 0.0 0.25 0.75 1.0 0.75 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 -1.17529804129 -3.13412811012 -6.22605734825 -6.16564910876 -4.5899213447 2.51286602912 -18.8807011277 5.26286986776 2.40215759814 2.97128205727 -11.1068561042 20.9204672646 0.0327749141278 -0.353878622752 -7.07254685036 22.9507849393 -0.449100690837 0.298103814957 -9.76492115086 21.9996506823 0.5027118034 -0.425347156758 -6.71020686928 20.1044371552 -0.0828788641716 0.102234119384 4 6 5 4 2 3 3 3 6 7 6 6 8 5 8 5 8 5 8 6 7 6 6 7 6 2 3 4 1 5 7 3 4 0 169.0 1.0 77.0 0.727272727273 0.198907601274 0.207555757852 0.0976508496607 0.0898291189894 0.0484183235757 0.0407377409159 0.0119142787939 0.0144036647679 0.0170902330818 0.615384615385 0.846153846154 0.0 3.0 3.0 2.0 2.0 3.0 3.0 3.0 2.0 10.0 0.228571428571 0.0 2.0 2.0 0.455621301775 0.5625 0.8125 0.875 0.625 0.5 0.0625 0.125 0.375 0.375 0.0 0.0 0.375 0.5625 0.5625 0.5625 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.25 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -0.979415034412 -0.587649020647 -4.94682623813 1.6461624909 -4.15411063116 5.06282233173 -21.3761431879 22.6221635627 -1.98558472062 3.62265941026 -32.2156239143 42.8910275231 0.972595381947 -0.522529243016 -26.2005191709 40.8723360084 0.700684291295 -0.948010217605 -18.3451037903 32.186458099 0.116949499836 0.329492962841 -14.1032216217 33.1263703534 0.224361106706 0.035653085216 4 1 7 2 6 3 6 4 4 24 3 5 5 3 5 4 5 4 5 4 5 4 5 4 5 8 2 7 2 7 4 3 2 0 162.0 0.5 87.0 0.528735632184 0.22085048011 0.27366255144 0.0344450277641 0.206641941438 0.0572264842193 0.00587812934678 0.0140689076196 0.00531699933809 0.205163154296 0.555555555556 0.0 1.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 2.0 7.0 0.133333333333 0.0 3.0 1.0 0.537037037037 0.266666666667 0.733333333333 0.6 0.533333333333 0.8 1.0 1.0 1.0 0.533333333333 0.8 0.333333333333 0.733333333333 0.2 0.466666666667 0.0 0.6 0.0 0.166666666667 0.833333333333 0.5 0.333333333333 0.5 0.5 0.166666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.833333333333 1.0 1.0 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.833333333333 1.0 0.833333333333 0.5 0.5 0.666666666667 1.0 0.0 0.5 1.0 0.5 0.0 0.0 0.333333333333 1.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 1.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 -7.92237938946 1.343975075 -12.6291391622 3.13961747265 8.22104051724 0.224650804447 6.25514970307 6.55171778382 -5.32070049586 2.01018792596 -4.37008480335 14.8865624032 2.75245548752 -0.504337887587 -0.525703627127 13.4672600335 -1.11038777922 -0.565193192104 -0.344747722829 6.32589086268 0.0933333882614 -0.669090558984 -3.85107657046 -2.55856729661 0.104787663461 -0.203039512032 4 5 1 4 4 1 2 9 2 2 3 8 2 2 4 4 5 2 4 4 5 2 4 5 4 2 4 4 5 3 3 3 7 3 2 1 8 2 13 2 13 4 11 8 8 9 10 5 11 5 3 2 5 5 2 3 6 4 2 3 6 3 4 4 4 3 5 7 6 0 315.0 0.714285714286 133.0 0.834586466165 0.196825396825 0.191836734694 0.0557348018573 0.12838239211 0.0444789979484 0.0139728052332 0.0139605105985 0.00558598083496 0.0710634268843 1.33333333333 0.619047619048 2.0 7.0 5.0 3.0 5.0 4.0 0.0 4.0 1.0 10.0 0.297872340426 1.0 3.0 1.0 0.422222222222 0.375 0.458333333333 0.291666666667 0.541666666667 0.375 0.375 0.5 0.25 0.666666666667 0.291666666667 0.541666666667 0.416666666667 0.875 0.375 0.458333333333 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.5 0.5 0.333333333333 0.333333333333 0.5 0.166666666667 0.333333333333 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 0.5 0.166666666667 0.5 0.5 0.5 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.0 0.333333333333 0.0 0.0 0.5 0.333333333333 0.666666666667 0.666666666667 0.0 0.5 0.0 0.0 0.166666666667 0.166666666667 0.5 0.666666666667 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 1.0 0.666666666667 0.5 0.5 0.166666666667 0.333333333333 1.0 0.666666666667 -7.70006772292 3.69845772518 -17.0825836679 12.6906933588 1.69847763046 4.67473177843 -14.9828420615 24.1453663377 -1.64414088904 -2.57766426949 -16.6644201785 25.8928682001 1.77715464579 5.98645605718 -5.82861603993 50.1809986442 1.41992270843 -2.14469675618 8.22006160051 50.1130738701 -0.277937653982 0.969882597164 7.10037791701 44.4737457679 -0.071358480704 -0.54898777236 5 6 5 3 3 3 3 2 6 3 1 4 3 5 1 16 9 4 9 4 10 4 9 4 9 6 4 2 2 11 3 8 8 1 1 1 4 0 182.0 0.928571428571 87.0 0.735632183908 0.206255283178 0.217425431711 0.0770896173022 0.0982263117875 0.0451500256777 0.025432980044 0.01188834679 0.00642954429109 0.0233881311699 1.15384615385 0.357142857143 0.0 4.0 6.0 4.0 2.0 1.0 0.0 1.0 5.0 11.0 0.333333333333 0.0 3.0 1.0 0.478021978022 0.375 0.875 0.875 0.5625 0.5 0.5 0.375 0.875 0.4375 0.375 0.0 0.5625 0.75 0.5 0.0 0.5 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 0.75 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.25 0.75 0.5 0.0 0.0 0.25 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.0 -8.82173113138 0.682092613251 -19.9819893668 4.99517965519 1.88990694814 5.2528091349 -14.3028979578 25.0433337604 0.655762493702 2.14884030777 -8.35043431871 39.0370135636 -0.392628452902 0.0401938555093 -8.49159704262 39.7387425639 0.687267804417 -0.355820609299 -5.00510322218 34.4623646015 -0.496483447882 -0.716908957609 -9.42647214018 26.3976966639 -0.22212772467 -0.11458176247 1 0 5 1 5 2 4 32 4 1 5 2 4 2 4 3 3 3 3 3 3 2 4 2 4 2 4 2 4 1 12 126.0 0.285714285714 68.0 0.573529411765 0.220899470899 0.298185941043 0.0192528804585 0.446860490228 0.0604851287958 0.00189822174628 0.0149752936986 0.00359423403776 0.842236367345 1.16666666667 204522251.952 2.0 2.0 1.0 1.0 4294967294.0 4294967293.0 0.0 0.0 3.0 0.0 0.190476190476 1.0 4.0 1.0 0.539682539683 0.416666666667 0.333333333333 0.25 0.666666666667 0.5 0.5 0.75 1.0 0.5 0.5 1.0 1.0 0.5 0.5 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -3.63782727067 -6.42682817819 -6.09030300204 -11.3007113713 3.07029322028 6.51426801735 -1.14341102106 12.4125790925 -3.14738902336 2.46885829071 -6.53142258114 28.7033496446 2.89080293063 -1.02901547921 0.557411985298 25.4592505226 -1.88995883476 0.512789110786 -2.4322622423 23.1967292067 1.24931212859 -1.4569629862 -0.424958263984 10.0031504632 -0.230761117688 -0.205655001668 1 3 3 1 1 15 1 2 1 4 5 4 5 4 5 4 5 4 5 3 7 3 6 2 6 4 4 6 3 6 3 0 126.0 0.642857142857 65.0 0.523076923077 0.166666666667 0.221088435374 0.0313366087176 0.149335924846 0.0267699672462 0.00735658621288 0.00575759555152 -0.00109075532748 0.12389007994 0.555555555556 0.142857142857 2.0 0.0 3.0 0.0 2.0 0.0 0.0 0.0 3.0 5.0 0.173913043478 0.0 5.0 1.0 0.515873015873 0.833333333333 0.666666666667 0.583333333333 0.583333333333 0.916666666667 1.0 0.916666666667 0.916666666667 0.5 0.333333333333 0.25 0.333333333333 0.5 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.0040249943 3.77424579332 -19.5396009882 10.0470033615 6.09057662689 1.63539824177 -4.09602461105 17.3414122373 -2.5580224866 0.898583392107 -8.03889925621 20.4612707771 0.114751655514 -0.908234271737 -12.2363820493 14.473752548 0.16549171125 -0.638166826397 -8.9709560701 6.37735529402 0.117025626004 -0.548796251623 -7.66051065485 -0.513293195491 0.0756549895495 -0.141250989141 4 6 6 10 3 4 5 3 2 3 6 3 1 4 7 6 8 6 8 7 7 7 7 3 1 3 6 4 1 3 6 3 2 6 1 4 4 8 7 3 1 2 5 0 196.0 1.0 98.0 0.622448979592 0.222667638484 0.231413994169 0.0962698099856 0.0957343188212 0.0494972067336 0.0334212128368 0.00806243419036 0.00937341675011 0.00920568526796 0.571428571429 0.785714285714 0.0 3.0 3.0 1.0 1.0 3.0 3.0 2.0 2.0 13.0 0.189189189189 0.0 2.0 2.0 0.5 0.5 0.8125 0.875 0.6875 0.625 0.125 0.1875 0.625 0.5 0.0 0.0 0.4375 0.625 0.5625 0.5625 0.625 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 1.0 0.75 0.5 0.25 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.13722352152 0.0454728408834 -9.62553153825 4.6976493068 -6.80468583219 7.17125261074 -33.9474142754 31.5473916324 -0.871815305275 2.28723086688 -40.3522780941 44.9258871256 1.49162288337 -1.86330525506 -31.2362983857 33.8248842877 -0.477843163159 -0.281442883264 -30.8154262379 27.9055442844 0.235635681719 0.238445538846 -29.1891775743 29.0394418807 0.0406432227756 -0.0343839541656 3 1 5 6 2 7 1 7 2 6 3 5 3 5 3 4 3 4 3 5 2 3 5 0 88.0 0.727272727273 53.0 0.547169811321 0.294034090909 0.263429752066 0.0648346520473 0.118295395849 0.0448308954733 0.00785387815141 -0.0037169985602 -0.00121317727809 0.0137347011909 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.0588235294118 0.0 5.0 1.0 0.602272727273 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.166666666667 0.833333333333 1.0 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.25710646567 5.90320152559 -5.98734940259 14.1182676106 -0.747585803314 -0.215235835887 -8.22217604378 13.4089227364 0.553316191 -0.856081266814 -5.68476173551 7.71351372554 -0.0416897516674 -0.104971527767 -5.35731572226 5.03174166154 -0.216889115525 -0.412058700566 -6.27820879782 0.757492127531 0.311859445054 -0.579206555011 -4.14860352388 -6.88350516151 -0.0164747210245 -0.215168588957 6 3 6 5 3 2 2 3 3 2 2 2 3 3 2 2 2 3 7 3 6 3 7 2 8 2 8 7 3 5 7 1 7 0 130.0 0.769230769231 48.0 0.979166666667 0.140769230769 0.160946745562 0.0476563495676 0.0970942193901 0.019177969959 0.0178480474736 0.00274915634119 0.000168089531311 0.0588394638155 0.5 0.230769230769 0.0 2.0 2.0 0.0 1.0 2.0 0.0 0.0 5.0 5.0 0.304347826087 1.0 2.0 1.0 0.369230769231 0.0 0.416666666667 0.75 0.75 0.333333333333 0.75 0.25 0.583333333333 0.416666666667 0.166666666667 0.0 0.333333333333 0.833333333333 0.333333333333 0.0 0.0833333333333 0.0 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -8.17811553734 4.01560164109 -17.9596051407 9.90350675603 2.79249191912 0.30889243393 -7.65951196615 11.1541234102 1.98110789443 -0.281822295343 5.00519309133 10.1612800984 -0.446499878082 0.751173264588 4.88171061115 14.5585312435 0.256019991427 0.308058860538 6.28386544625 17.5641115516 0.395679201983 -0.0663140921497 11.4177608196 19.1189924608 0.143910387498 0.246299864432 3 1 4 1 3 3 2 5 1 4 1 5 2 5 6 5 6 6 5 6 5 5 6 5 6 4 7 5 5 6 5 6 4 7 6 4 7 1 8 0 176.0 0.6875 84.0 0.619047619048 0.182851239669 0.208806818182 0.0380287084429 0.120788528362 0.0325515941961 0.00798125482826 0.0045766930535 -0.000777497537959 0.0706565025001 0.272727272727 0.1875 1.0 0.0 1.0 0.0 3.0 0.0 0.0 0.0 2.0 9.0 0.0740740740741 0.0 2.0 1.0 0.477272727273 0.416666666667 0.333333333333 0.333333333333 0.5 0.75 1.0 1.0 1.0 0.5 1.0 0.916666666667 0.916666666667 0.666666666667 0.5 0.333333333333 0.25 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.25 0.5 0.25 0.0 -11.0612685449 5.17253565049 -19.9812207558 13.0678876277 8.96334528136 1.10942185917 3.78651644594 18.4680718024 -3.19362646008 0.461264227692 1.15827874263 17.9678556532 0.940714796917 -1.40746784052 -1.36462606913 8.6795925092 -0.330310014105 -0.591147414183 1.2039590705 0.779728745599 0.381863318027 -0.153357361825 1.3249318027 -1.0520951838 -0.0541975132261 -0.0240588027049 5 6 5 9 3 3 4 4 2 3 4 4 1 11 2 4 1 5 2 4 10 3 9 4 10 4 9 4 6 2 2 5 2 3 4 9 5 7 2 0 182.0 0.928571428571 94.0 0.648936170213 0.232037193576 0.23273155416 0.0799103535035 0.105266955602 0.0462572537956 0.0213846668929 0.0114305887303 0.00469249295275 0.0181133453372 1.07692307692 0.357142857143 1.0 3.0 6.0 3.0 1.0 2.0 0.0 2.0 6.0 11.0 0.184210526316 0.0 3.0 1.0 0.516483516484 0.3125 0.75 0.875 0.5625 0.625 0.625 0.3125 0.75 0.625 0.5625 0.0 0.375 0.8125 0.5625 0.0 0.5 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.75 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 -8.91267681315 2.63742477124 -21.0603461252 7.78201319267 0.761902089087 3.00631159269 -18.1625557252 24.7183387273 1.53447637552 5.66856082298 -8.81915433377 52.7051251541 -0.294063239564 -0.222330370807 -7.27920961882 53.0265399544 0.583785255696 -2.33256569079 -3.09014365489 32.8558928262 0.0812261568997 -0.40858446196 -4.32563849069 19.9991953865 -0.414016038091 -0.488539588559 1 8 3 4 12 3 6 2 5 3 4 5 3 3 3 6 3 2 4 6 3 3 3 6 3 2 4 6 3 2 4 6 3 2 4 6 3 2 4 5 4 2 5 4 6 1 4 3 1 1 4 1 0 195.0 1.15384615385 101.0 0.564356435644 0.214017094017 0.247337278107 0.102679276454 0.0887561826733 0.0512865017954 0.0344986104862 0.00943410847751 0.0140343992187 0.00160681012365 0.333333333333 0.923076923077 2.0 1.0 2.0 0.0 1.0 3.0 3.0 3.0 2.0 10.0 0.210526315789 0.0 1.0 2.0 0.517948717949 0.6875 0.8125 0.9375 0.9375 0.5625 0.3125 0.25 0.375 0.5 0.0 0.0 0.1875 0.75 0.75 0.75 0.875 0.5 1.0 0.75 0.5 0.75 0.75 0.75 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -3.90460127052 5.00807554262 -16.4160781845 13.4783262625 -9.63361333759 1.91721581225 -43.962494739 18.9471970033 4.70612809451 -1.70730210058 -26.4009881115 9.61408587619 1.49135929517 -1.04085694047 -10.8029575913 1.17929472717 -1.36112344671 0.446793125628 -16.736675231 2.95340805389 1.22490841026 0.0140577615811 -5.94598986289 3.66716590233 0.4273088523 -0.0897981673252 1 4 1 8 3 6 4 5 5 4 20 1 6 4 5 6 4 6 3 6 5 5 5 5 5 5 5 6 8 2 8 3 6 1 0 170.0 0.588235294118 93.0 0.494623655914 0.220588235294 0.278200692042 0.0392316303684 0.180122939141 0.0565560757175 0.0070996856528 0.0127789713569 0.00524594465424 0.146893619592 0.6 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 6.0 0.206896551724 0.0 4.0 1.0 0.547058823529 0.4 0.733333333333 0.533333333333 0.4 0.8 1.0 1.0 0.933333333333 0.666666666667 0.866666666667 0.6 0.866666666667 0.2 0.466666666667 0.0 0.6 0.0 0.5 0.833333333333 0.333333333333 0.166666666667 0.5 0.333333333333 0.0 0.166666666667 0.833333333333 1.0 0.833333333333 0.666666666667 1.0 0.833333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.333333333333 0.666666666667 1.0 0.666666666667 0.333333333333 0.5 0.666666666667 1.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 1.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 -10.1110199141 1.79751465139 -18.0459022889 4.40800405526 8.17822518079 0.528680779821 1.53070221788 9.46005865922 -4.43893048263 2.70194294739 -5.52544467922 22.6867142033 2.28428441332 0.302537811483 -1.68204464429 24.6511191859 -0.446750135051 -1.61402849865 1.70775317297 11.4626136331 -0.153198337893 -0.394968326362 -3.85973025233 4.14010438131 -0.115616410111 -0.0215449937882 4 5 5 3 1 1 1 3 3 2 5 3 1 3 5 3 1 3 5 7 1 2 5 3 9 3 9 3 9 3 10 5 5 1 2 4 3 3 3 8 4 7 6 1 2 2 3 0 180.0 0.8 78.0 0.858974358974 0.181018518519 0.201851851852 0.0621500342936 0.115335219479 0.047380829904 0.0214857812575 0.0170997548796 0.0092505732059 0.057404032404 0.916666666667 0.6 0.0 4.0 4.0 3.0 3.0 3.0 0.0 1.0 2.0 11.0 0.205882352941 2.0 3.0 1.0 0.433333333333 0.333333333333 0.833333333333 1.0 0.5 0.666666666667 0.583333333333 0.333333333333 0.75 0.416666666667 0.166666666667 0.0 0.583333333333 0.416666666667 0.0833333333333 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.5 0.5 0.25 0.0 0.0 0.75 0.25 0.0 0.0 0.25 0.25 0.0 0.0 0.75 0.25 0.0 0.0 0.5 0.5 0.0 0.0 0.75 0.25 0.0 0.0 0.25 0.25 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -9.25220735841 1.52788745368 -21.2286328048 9.44722905696 1.62635131181 8.99755944946 -16.0282458055 43.2551276139 1.16341608442 2.88158316244 -7.07691625871 61.0312734756 -0.00782535469373 -1.31980525081 -5.33549219813 55.5857035568 0.106136638431 1.18486398718 -5.35327081215 64.4183452816 -0.34966581543 1.89335622867 -8.60058044242 84.3697747481 -0.0808561048683 0.222998951364 4 2 10 6 10 6 11 5 12 4 12 4 12 4 12 4 13 4 11 10 6 5 4 2 5 4 5 3 4 4 6 2 4 3 7 2 4 3 6 3 4 4 6 2 4 4 6 2 4 4 5 3 4 4 5 4 2 5 5 12 3 5 1 6 4 5 2 4 11 0 368.0 0.695652173913 144.0 0.694444444444 0.143002717391 0.213728733459 0.0410079999949 0.146815842 0.0565182637334 0.0149715321244 0.0196216615566 0.0161847421308 0.117757807127 0.5 0.521739130435 3.0 2.0 3.0 0.0 0.0 0.0 5.0 5.0 4.0 7.0 0.217391304348 0.0 1.0 2.0 0.391304347826 0.625 0.458333333333 0.5 0.625 0.708333333333 0.875 0.708333333333 0.791666666667 0.0 0.25 0.0416666666667 0.0416666666667 0.0 0.208333333333 0.375 0.458333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.666666666667 1.0 0.666666666667 0.166666666667 0.333333333333 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -14.9190459698 -9.07875153637 -32.2625383237 -21.4816657855 5.54236454245 1.57012296615 -15.037348346 -10.6522981785 0.106950081834 5.38992290452 -14.5100337071 11.8259473029 -4.530518543 -3.33902721597 -34.7009799106 1.87087202646 3.72518090688 1.11580856681 -14.9562090626 0.558674622469 -0.0740213769629 -0.791007733816 -10.2065043646 -4.23193792401 -0.451242840335 -0.116659533569 2 2 6 1 5 4 2 6 3 5 3 4 4 4 4 4 3 3 5 4 3 3 6 3 3 3 6 3 3 3 6 4 2 3 5 4 3 3 5 4 3 3 5 5 1 4 5 11 4 5 1 5 4 5 210.0 1.07142857143 108.0 0.611111111111 0.254603174603 0.256802721088 0.115444984343 0.0998320915668 0.0652067811251 0.0356252168917 0.0098796229224 0.0143633412895 -0.00926758709718 0.2 1.0 1.0 1.0 0.0 0.0 3.0 3.0 3.0 3.0 5.0 5.0 0.114285714286 1.0 1.0 2.0 0.514285714286 0.625 0.5 0.5 0.6875 0.5625 0.5625 0.5 0.5625 0.25 0.0 0.0 0.0 0.75 0.625 0.625 0.75 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.59417845421 1.52788745368 -2.31881279744 4.21900774553 -5.14162422376 0.52966765061 -16.8112107382 4.10598576892 2.18878156417 -1.98995080017 -10.7972914785 -6.65270858333 -0.0950869217884 -1.20284108587 -10.0153426044 -18.3649304358 -1.72161048895 -1.00500344787 -24.1911816791 -28.6695084035 -0.604765561391 -0.694956063585 -36.287273839 -36.1993986434 -0.414302235223 -0.0123592269464 1 3 3 6 2 7 1 6 2 5 4 4 3 3 5 4 3 3 6 3 3 3 6 3 3 2 7 2 4 2 6 4 3 2 6 4 3 2 7 3 2 4 6 9 5 11 4 5 195.0 1.15384615385 100.0 0.6 0.249230769231 0.231558185404 0.124119961564 0.0897299010435 0.0566344004451 0.0403653522368 0.0107406767607 0.0142505723098 -0.0115150021925 0.466666666667 1.0 2.0 2.0 0.0 1.0 3.0 3.0 3.0 3.0 1.0 7.0 0.138888888889 0.0 1.0 2.0 0.512820512821 0.75 0.5 0.5 0.8125 0.625 0.4375 0.25 0.5 0.375 0.0 0.0 0.0 0.875 0.5625 0.625 0.625 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.933708999472 5.85690190578 -1.8137118315 15.8567147077 -5.45286055692 2.60080397671 -16.0012282311 25.2028128333 3.55818789618 -0.354897446237 -1.52110677108 22.9427080143 1.55822332024 -0.920115593685 11.3240110441 14.0958679294 -1.52685923842 -0.924117447458 0.86674585435 4.74739302742 -0.371659068604 -0.362148710421 -5.4005349368 -1.09176509987 0.0787748246097 -0.13330031708 3 1 3 1 3 1 3 14 2 5 4 4 3 3 6 3 3 3 6 3 3 2 7 3 3 2 7 3 3 3 6 3 3 2 7 3 4 2 6 3 3 3 6 3 2 4 5 11 3 6 12 1 2 0 210.0 1.07142857143 92.0 0.869565217391 0.21746031746 0.194557823129 0.108267465716 0.0805437857683 0.0573059064896 0.0404865995835 0.0139757768032 0.0168665632338 0.00327638476541 0.533333333333 0.928571428571 3.0 3.0 1.0 0.0 3.0 3.0 3.0 3.0 3.0 13.0 0.116279069767 2.0 1.0 2.0 0.438095238095 0.625 0.5 0.4375 0.625 0.625 0.375 0.375 0.5625 0.3125 0.0 0.0 0.0625 0.625 0.5 0.5 0.6875 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.5 1.0 0.75 0.5 0.25 0.0 0.25 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.679061090525 4.37145577026 -1.8619370791 13.0097805265 -4.9164022954 3.72408419729 -16.2926686471 26.0661948502 1.90452323829 -0.43918066443 -8.7691164334 22.2070135181 1.51203017559 -2.47164042805 0.312359527116 4.3769400805 -2.10347830806 -0.466040162075 -14.2721697385 -1.54101446648 -0.734182745631 0.898272715151 -26.6782374786 6.33656324497 -0.158147792623 0.0462081352669 3 4 4 7 3 3 2 3 1 3 3 3 1 3 7 4 7 7 5 5 5 6 1 1 6 5 4 7 3 3 1 8 2 8 2 0 140.0 0.714285714286 80.0 0.6875 0.233571428571 0.283673469388 0.0577153790087 0.156116618076 0.0507317784257 0.0112819526183 0.00605636623736 0.0063565139181 0.0827212661263 1.3 0.357142857143 2.0 3.0 4.0 2.0 1.0 1.0 1.0 2.0 2.0 9.0 0.172413793103 1.0 3.0 2.0 0.571428571429 0.583333333333 0.916666666667 0.25 0.75 0.666666666667 0.583333333333 0.583333333333 0.333333333333 0.666666666667 0.333333333333 0.75 0.416666666667 0.75 0.416666666667 0.75 0.833333333333 0.25 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.75 1.0 0.75 0.5 0.75 1.0 0.75 0.5 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.5 0.0 0.5 1.0 1.0 0.25 0.75 1.0 0.5 0.0 0.25 0.5 0.75 -6.86639897339 0.591146931484 -17.8164474444 3.79292113888 -1.66161472657 3.86379944935 -22.1877600672 19.1380334111 2.21844396222 1.73371597823 -9.48127338681 27.5985625257 1.31808502708 -1.30624063313 1.79643227159 22.4105657555 -0.222139069417 0.464711046696 1.55513908433 18.866115006 -0.182579689181 -1.41371850651 -0.0746333582949 8.97560654055 0.0782213332701 0.0883848134983 3 3 2 6 3 5 4 4 5 4 4 3 5 3 5 3 5 3 5 3 5 4 4 3 5 3 5 3 5 3 5 3 5 3 5 4 4 4 2 7 1 7 168.0 0.380952380952 81.0 0.617283950617 0.235119047619 0.239512471655 0.0281185887053 0.288862357939 0.0660287428463 0.00263983930663 0.0244561486926 0.00494505135742 0.367657471929 0.5 0.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 2.0 3.0 0.037037037037 0.0 10.0 1.0 0.482142857143 0.25 0.0 0.0 0.166666666667 0.416666666667 0.0 0.0 0.333333333333 0.75 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.36458772594 -0.424413181578 -4.6697036313 0.0161506065923 1.08103687941 1.88366861056 -3.70018385004 8.94000968989 -1.45051163212 2.45265294594 -5.76691272876 22.9177048718 1.61100552216 0.773121606635 -0.864735473853 30.226276678 -0.869202585531 -0.140243701987 -1.13453299536 26.3816352063 0.686306636367 -1.42432057142 -0.466166412963 10.9155878327 -0.187413336083 -0.331917232077 0 4 10 5 9 5 10 4 11 2 12 3 11 2 12 3 11 2 3 2 7 3 1 5 5 4 3 3 4 3 5 2 4 3 5 3 3 3 5 3 3 2 6 3 3 2 6 3 3 2 6 3 3 2 6 3 2 3 6 3 2 4 5 3 1 6 3 5 9 3 2 0 308.0 0.636363636364 111.0 0.837837837838 0.144944341373 0.191263282172 0.0427637145069 0.148050907601 0.0623432479142 0.0156490184907 0.0265797055706 0.0193129901236 0.12269176216 0.571428571429 0.590909090909 2.0 5.0 1.0 0.0 0.0 2.0 5.0 5.0 2.0 9.0 0.152173913043 1.0 1.0 2.0 0.36038961039 0.791666666667 0.5 0.5 0.666666666667 0.416666666667 0.5 0.458333333333 0.375 0.0 0.291666666667 0.0416666666667 0.0416666666667 0.0 0.208333333333 0.708333333333 0.791666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.166666666667 0.166666666667 0.5 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -7.78412358031 -7.43687643175 -18.0051720224 -17.4455887215 1.4928996728 1.6292157022 -11.8168056675 -6.58313945113 1.32545449359 5.22478074027 -8.90773957717 17.393976435 -3.37331746021 -1.28271847703 -21.1853700024 22.8225091914 2.6011085629 2.63587923896 -12.1446805759 32.6262652623 -1.48206634046 -1.9865588195 -19.2799070081 22.3434877037 -0.16376795838 0.0670747097339 4 1 4 3 5 2 5 6 1 6 3 5 3 13 3 5 4 21 3 6 4 6 2 4 3 4 6 3 6 1 5 3 5 3 6 2 4 4 6 3 5 3 3 4 6 3 5 3 3 4 6 3 5 3 3 4 6 3 5 3 3 4 5 3 6 3 3 4 5 4 5 3 2 6 3 6 3 5 11 1 12 0 360.0 1.6 173.0 0.739884393064 0.219097222222 0.200925925926 0.144945794753 0.0505781678669 0.0509545396091 0.0607105410995 0.00879719482148 0.0152598798856 -0.0208033656499 0.5 1.66666666667 2.0 4.0 3.0 3.0 5.0 4.0 6.0 6.0 1.0 11.0 0.220338983051 2.0 2.0 3.0 0.480555555556 0.75 0.708333333333 0.625 0.666666666667 0.791666666667 0.416666666667 0.166666666667 0.166666666667 0.583333333333 0.708333333333 0.5 0.541666666667 0.75 0.458333333333 0.166666666667 0.166666666667 0.5 1.0 0.833333333333 0.666666666667 0.5 0.166666666667 0.166666666667 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.5 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.833333333333 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.333333333333 0.166666666667 0.333333333333 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 1.0 0.166666666667 0.333333333333 0.666666666667 1.0 0.666666666667 0.166666666667 0.166666666667 0.333333333333 -8.80657351775 13.5812218105 -24.1443002449 28.0262365168 -4.14300211236 -7.22607651344 -37.9454903836 3.1641505144 1.07865863218 -2.01621333884 -34.1600176698 -9.01251637796 0.620209207792 4.05201272563 -20.8275429837 13.9108679472 2.96997078277 -0.239776415663 1.29427298319 16.2137360322 0.119905519727 -1.39971702821 10.6097896316 3.461781917 -0.0189415736689 0.13291628649 0 2 1 1 3 3 1 5 1 5 1 9 3 3 9 2 8 2 10 1 10 2 8 3 9 2 8 5 5 6 4 7 4 0 143.0 0.846153846154 58.0 0.724137931034 0.147488874762 0.170521785906 0.0439927816328 0.106326946075 0.028886805893 0.0139155721162 0.00989833435585 0.0004730918668 0.0647887667613 0.727272727273 0.230769230769 2.0 3.0 2.0 0.0 3.0 0.0 0.0 0.0 2.0 8.0 0.153846153846 0.0 7.0 1.0 0.405594405594 0.666666666667 0.166666666667 0.0833333333333 0.5 0.833333333333 0.666666666667 0.666666666667 0.916666666667 0.5 0.166666666667 0.25 0.833333333333 0.666666666667 0.0 0.0 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.25 0.25 0.0 0.25 0.75 1.0 1.0 0.75 0.75 0.75 0.5 0.75 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.25 0.75 0.75 0.5 0.25 0.0 0.25 0.5 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.93326177873 1.56706405506 -16.6776508825 6.1162244148 3.33464740119 3.3821693141 -8.08103618985 16.9787722354 -1.2068707251 -0.738842637352 -10.9955161133 14.2276383198 -1.28782658839 -1.02522202053 -20.4409821505 6.23446786872 0.115239764894 0.0318352797373 -22.6160119407 3.16801573779 -0.678191085646 -0.703770655907 -28.0065375951 -3.62687820522 -0.0418440904455 -0.131508455219 4 7 4 3 3 3 4 2 4 3 4 2 4 3 10 3 10 3 9 4 6 8 3 10 3 3 2 5 2 3 4 17 1 12 2 6 2 3 3 1 10 0 195.0 0.866666666667 101.0 0.663366336634 0.259171597633 0.265641025641 0.081667728721 0.121471501543 0.0583854751429 0.0157184425879 0.00503179520759 0.00546473423087 0.010096058056 0.769230769231 0.4 1.0 5.0 4.0 0.0 2.0 1.0 1.0 1.0 7.0 7.0 0.131578947368 1.0 3.0 2.0 0.517948717949 0.375 0.125 0.25 0.8125 0.4375 0.0625 0.5625 0.6875 0.625 0.5625 0.875 0.8125 0.5 0.5 0.6875 0.8125 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 -0.933708999472 -3.48018808894 -5.38423031517 -5.53672310411 -4.17169863279 4.53386454774 -16.4459245307 11.3399821368 2.47227699426 1.56349205185 -8.5191751447 19.0431314522 -0.14730658924 -2.30718273043 -4.58278170415 7.87566324968 0.0704300641793 0.661127312547 -3.54818057816 5.93059425868 0.75840207158 -0.765066388694 4.25917719348 1.59592853973 0.0794709121222 -0.020238282111 2 2 3 4 2 4 2 4 2 4 2 4 3 3 3 3 3 3 3 2 4 2 4 2 4 2 3 4 2 3 3 3 3 3 3 3 3 3 3 4 1 6 1 5 132.0 0.272727272727 73.0 0.671232876712 0.229797979798 0.275482093664 0.0167045802376 0.419278876924 0.0494128613963 0.00125920216588 0.0128990493757 0.00140350285341 0.787755833705 0.5 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 1.0 0.115384615385 0.0 4.0 1.0 0.55303030303 0.416666666667 0.0833333333333 0.25 0.583333333333 0.916666666667 0.583333333333 0.75 1.0 1.0 1.0 1.0 1.0 0.916666666667 0.833333333333 0.583333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.13802852039 0.954929658551 -7.01959015149 3.4890213638 3.51539907735 1.88151993204 -0.251081588636 11.2658251953 -2.77019885397 1.52504669641 -3.78591765558 22.2166663083 2.50117571639 1.50152999581 0.434281630834 30.4843794842 -2.13902797969 -0.906516993097 -3.54466064735 24.7432521428 1.6235975575 -0.794192697533 -1.40206207704 11.1924505775 -0.404524248452 -0.411278135564 1 1 3 4 3 3 5 2 5 2 4 4 2 5 2 5 3 4 3 4 3 4 2 5 2 5 3 4 6 2 4 1 0 105.0 0.466666666667 50.0 0.7 0.148299319728 0.222222222222 0.019033797646 0.212365835223 0.0451398337113 0.00338145268067 0.0215944700906 0.00631199367342 0.259525757406 0.428571428571 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.333333333333 0.0 6.0 1.0 0.47619047619 0.75 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.875 0.75 0.75 0.375 0.375 0.25 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 -6.96037617789 1.61277009 -12.7250090721 5.08275950331 5.18349965768 1.93079703406 -0.721682909391 12.8846401198 -3.01937387952 0.909883177012 -5.60404792591 17.6011106619 1.6359403996 -0.493853167608 -2.75637341474 13.6571253015 -0.472201430414 -0.791288337235 -1.29592871305 5.83857586031 -0.0224805274683 -0.325099888546 -4.18989220776 0.84776496032 0.0240873659107 -0.075573710126 2 3 2 6 3 14 2 7 2 5 4 5 4 3 4 5 4 4 3 4 6 3 3 4 6 4 2 3 6 5 2 3 6 4 3 4 5 3 3 5 5 3 3 5 5 11 4 8 13 1 224.0 1.14285714286 122.0 0.565573770492 0.251116071429 0.232461734694 0.114754635113 0.0801278606448 0.0508805433446 0.035851892705 0.00717031624875 0.0120027024664 -0.0169585650752 0.4375 0.928571428571 2.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0 4.0 13.0 0.204545454545 0.0 1.0 2.0 0.544642857143 0.75 0.5 0.5 0.75 0.875 0.875 0.625 0.75 0.625 0.125 0.0 0.0 0.875 0.375 0.4375 0.5625 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.22288759761 11.3397896953 -10.9203629276 29.7160348569 -4.28319523606 3.39913926311 -23.0236312558 40.9814055711 2.27531632953 -1.81154830627 -15.4247988295 31.36322996 -0.265023235709 -0.612357289807 -13.9023884125 24.8156007575 -0.76321550221 0.643340233541 -20.0048794708 28.3536942701 -0.0194440411023 -0.00332742030622 -24.2777205469 28.4302004132 -0.297367099851 -0.170125837809 4 4 6 7 3 8 2 8 3 7 4 6 6 7 5 7 5 6 3 9 1 10 1 3 1 16 2 6 4 0 154.0 0.785714285714 104.0 0.413461538462 0.315820543093 0.334879406308 0.0646987731445 0.136576107313 0.0494498754745 0.00556072900246 -0.00205707602359 -0.000906506796044 -0.00271105138273 0.636363636364 0.0714285714286 1.0 2.0 0.0 2.0 0.0 0.0 0.0 1.0 2.0 4.0 0.166666666667 0.0 7.0 1.0 0.675324675325 0.25 0.583333333333 0.166666666667 0.666666666667 0.75 1.0 0.75 0.916666666667 1.0 1.0 1.0 0.916666666667 0.916666666667 0.75 1.0 1.0 0.0 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 1.0 1.0 0.75 0.25 0.5 1.0 1.0 -6.91187181428 2.27364204417 -16.8334406262 8.11734747735 -0.213443947004 3.98444168026 -17.7067108573 22.2846703817 0.869779349259 0.322632741632 -12.0265276767 24.9474996282 0.0874253717713 -0.983244581568 -9.58457615453 16.9887884912 0.153814955132 -0.669989103034 -8.44011810316 8.26346251785 -0.0959172100365 -0.755658994633 -8.92403265369 -0.139738807976 0.0200861904184 -0.0871596354688 4 13 2 4 2 9 2 4 3 5 1 1 3 3 5 4 5 3 5 4 5 3 5 3 6 4 4 3 7 3 3 4 7 9 8 8 8 4 13 8 10 10 7 11 6 11 4 4 7 4 1 4 9 3 1 4 9 2 3 4 7 3 4 3 3 2 1 3 6 9 5 0 357.0 0.809523809524 176.0 0.642045454545 0.219476025704 0.224623182606 0.0638544427493 0.11893718876 0.0450599089529 0.0153293211838 0.01013976706 0.00417772584878 0.040737638724 1.52941176471 0.666666666667 2.0 9.0 10.0 5.0 5.0 3.0 0.0 6.0 8.0 14.0 0.171428571429 0.0 4.0 1.0 0.49299719888 0.533333333333 0.5 0.533333333333 0.7 0.433333333333 0.566666666667 0.766666666667 0.3 0.766666666667 0.566666666667 0.6 0.333333333333 0.6 0.1 0.3 0.466666666667 0.222222222222 0.333333333333 0.333333333333 0.111111111111 0.111111111111 0.222222222222 0.0 0.555555555556 0.777777777778 1.0 1.0 0.777777777778 0.777777777778 0.888888888889 0.666666666667 0.777777777778 0.777777777778 0.444444444444 0.444444444444 0.777777777778 0.888888888889 0.888888888889 1.0 0.444444444444 0.444444444444 0.0 0.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.333333333333 0.888888888889 0.444444444444 0.333333333333 0.666666666667 0.666666666667 0.555555555556 1.0 0.333333333333 1.0 1.0 1.0 0.888888888889 0.333333333333 0.333333333333 1.0 0.444444444444 0.888888888889 0.666666666667 0.444444444444 0.222222222222 0.0 0.111111111111 0.555555555556 0.777777777778 0.777777777778 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.444444444444 -13.399330447 1.45513090827 -28.9236259245 4.05175865203 4.14184370205 0.818304909865 -21.4807604525 8.19557327179 -3.28364192608 1.9600395829 -28.4276203062 24.3329272129 0.978053576425 3.62566393047 -24.4339505663 41.6416258187 2.02157485429 -2.7420449674 -3.31237232586 29.065796441 0.881431836861 0.0806063750128 5.06284949423 16.7406275502 -0.26468595656 -0.44243674735 2 3 3 4 5 5 2 5 3 6 4 4 3 5 5 3 4 4 5 3 4 3 6 3 4 3 6 3 4 3 6 4 3 3 6 4 3 3 6 3 4 4 5 4 2 5 4 5 1 7 2 7 4 1 7 2 2 0 224.0 1.14285714286 109.0 0.715596330275 0.223214285714 0.224489795918 0.105645271501 0.083654108965 0.0580499498907 0.035800601598 0.0118775786958 0.0148321964763 -0.00359912133336 0.3125 1.0 2.0 0.0 2.0 1.0 3.0 3.0 3.0 3.0 2.0 11.0 0.075 2.0 0.0 2.0 0.486607142857 0.75 0.5625 0.5 0.6875 0.6875 0.625 0.5 0.75 0.25 0.0 0.0 0.125 0.75 0.5 0.5 0.6875 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.9443664472 5.01338070739 -11.714138311 14.888547629 -6.13554739599 4.20206351702 -27.6673304589 29.6456985787 4.37733406379 -0.285680402917 -10.7861866303 28.3773289664 0.293514136603 -1.19347799959 -4.77369146488 20.4508657364 -1.74276765803 0.640004582297 -15.987477075 22.7070951277 0.721152223096 -0.111786361518 -16.0828267712 20.1392823318 -0.299114110127 -0.373926946233 7 3 5 7 4 7 3 4 1 1 1 1 3 2 9 2 8 3 8 3 8 3 6 5 7 4 7 4 7 4 7 4 7 4 7 4 7 4 7 4 7 3 8 4 6 6 5 0 231.0 0.52380952381 86.0 0.604651162791 0.125934671389 0.174603174603 0.0234011723302 0.16366509873 0.0206455401261 0.00671067891139 0.00626591660102 -0.0013899051104 0.169665805344 0.272727272727 0.0952380952381 1.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 1.0 3.0 0.307692307692 0.0 1.0 2.0 0.372294372294 0.0 0.444444444444 0.666666666667 0.722222222222 0.444444444444 0.944444444444 1.0 0.944444444444 0.611111111111 0.333333333333 0.333333333333 0.333333333333 0.555555555556 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 0.0 0.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -12.1260909022 3.94097954323 -19.8056050028 11.4252019783 12.3983092694 3.03317253385 11.1770011949 23.2772856532 -6.57505341417 0.910271122136 -2.94204164107 28.5003045704 1.84977873188 -0.228433889554 -2.88745972463 27.1921228446 0.760950721394 0.0863875225059 6.36295405632 26.8880657476 -1.09138853443 0.0126771378669 -1.56997781022 25.3144340298 0.174578522927 -0.219697468425 2 2 3 5 3 14 1 6 2 1 1 4 2 5 5 3 2 4 6 3 3 3 7 2 3 3 6 3 3 2 7 3 3 3 6 3 3 2 7 3 2 4 6 3 1 6 5 3 1 6 3 6 5 1 4 1 1 2 1 0 210.0 1.07142857143 106.0 0.679245283019 0.233015873016 0.218367346939 0.106723248029 0.0872406867509 0.0527677356657 0.0358333138766 0.0114750773747 0.0131413199549 -0.00100037247986 0.533333333333 1.07142857143 2.0 3.0 1.0 1.0 3.0 3.0 3.0 3.0 3.0 12.0 0.227272727273 0.0 1.0 2.0 0.504761904762 0.8125 0.625 0.5 0.8125 0.6875 0.5625 0.375 0.5625 0.5 0.0 0.0 0.0625 0.75 0.4375 0.5 0.625 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.25 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.86741799894 4.58366236105 -7.61499321167 13.3001453096 -4.33920036846 3.40662313747 -20.2791237142 25.452579968 2.06543556633 -0.241997252335 -11.550227301 23.12786419 1.15406069051 -1.84439035737 -3.76437086372 9.62622570452 -1.74421538095 -0.372924817427 -16.0531210807 4.65893196614 -0.683794265996 0.589268677445 -28.2965329084 10.1635779835 -0.29398671594 0.114757322475 8 4 9 6 10 4 10 3 11 3 11 3 11 3 11 3 6 8 5 9 3 3 5 3 3 3 5 3 3 3 5 3 2 4 5 3 2 4 5 3 2 3 7 2 2 3 7 2 2 4 5 3 3 4 4 4 2 5 2 6 4 3 3 3 1 0 294.0 0.666666666667 120.0 0.716666666667 0.206997084548 0.221574344023 0.0625311071256 0.155474712445 0.0563144041457 0.0162980879283 0.0154934863413 0.010315062533 0.0965203259742 0.642857142857 0.52380952381 0.0 3.0 4.0 1.0 0.0 0.0 5.0 5.0 2.0 8.0 0.243902439024 0.0 1.0 2.0 0.408163265306 0.0 0.166666666667 0.833333333333 0.666666666667 0.0 0.333333333333 0.208333333333 0.375 0.375 0.5 0.208333333333 0.208333333333 0.833333333333 0.75 0.708333333333 0.75 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.5 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -3.88034908872 -6.79061090525 -10.4427039474 -18.5183176436 -0.404203030075 -1.8411860472 -4.91836727393 -16.152159839 5.30298014547 7.9543604804 11.8215885332 18.8160862416 -4.37043462713 -0.775061797529 -0.0230274524607 27.6609071327 2.65593774085 0.594874134518 4.48458988071 24.3394726754 -1.79583771723 -1.4621105841 -3.14131903029 11.1283430089 -0.0751622314523 -0.323504417878 9 4 12 4 13 3 13 4 12 4 12 4 12 4 11 5 6 10 4 4 3 5 3 5 4 4 3 4 5 4 2 5 5 4 2 5 5 4 2 4 6 4 2 5 5 4 2 5 5 4 2 5 5 4 3 5 4 6 2 14 3 6 1 4 2 0 336.0 0.761904761905 156.0 0.49358974359 0.231956845238 0.267715419501 0.0740238540233 0.151953984409 0.0630167260977 0.0175541350055 0.0107341499922 0.00921225866237 0.0659211224062 0.4375 0.52380952381 0.0 4.0 3.0 0.0 0.0 1.0 5.0 4.0 3.0 11.0 0.125 0.0 2.0 2.0 0.464285714286 0.0 0.208333333333 0.916666666667 0.75 0.0 0.375 0.5 0.708333333333 0.0833333333333 0.25 0.0 0.291666666667 0.833333333333 0.875 0.75 0.791666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.833333333333 0.833333333333 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.0 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 -5.15358863345 -13.2174390834 -16.3095181549 -35.266051358 -4.14555577069 -4.06100309604 -20.7898850859 -43.1388603037 7.53415786396 6.66246394834 2.93436266753 -12.6811333503 -4.99101643508 -0.0135019376644 -11.3080486999 -1.44293119052 1.2407262416 0.0685555492095 -16.3121330778 -3.87171260786 -0.673958342231 -0.591828793228 -15.8186264469 -10.9761193154 0.00718304308514 -0.276085717543 4 2 12 6 11 6 12 4 13 4 14 3 13 4 13 4 13 4 14 10 7 4 2 5 6 4 5 2 6 3 6 2 5 3 7 3 4 4 6 3 5 3 6 3 5 3 6 3 4 4 6 3 4 3 7 3 4 3 6 5 2 6 4 13 3 7 12 1 4 0 391.0 0.739130434783 140.0 0.8 0.145178275914 0.194373401535 0.0465810034186 0.129037694447 0.0608112345742 0.0175022908795 0.0239036750375 0.0191950107518 0.0905154178302 0.588235294118 0.521739130435 4.0 4.0 2.0 0.0 0.0 0.0 5.0 5.0 2.0 9.0 0.137254901961 1.0 1.0 2.0 0.358056265985 0.566666666667 0.5 0.466666666667 0.566666666667 0.466666666667 0.533333333333 0.433333333333 0.366666666667 0.0 0.3 0.3 0.266666666667 0.0 0.1 0.5 0.7 0.444444444444 0.444444444444 0.222222222222 0.333333333333 0.111111111111 0.0 0.222222222222 0.111111111111 0.777777777778 1.0 0.888888888889 1.0 0.777777777778 0.666666666667 0.888888888889 0.777777777778 0.888888888889 0.777777777778 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.555555555556 0.666666666667 0.222222222222 0.111111111111 0.0 0.0 0.444444444444 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.555555555556 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.888888888889 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.333333333333 -12.0680965544 -8.801960331 -27.1343329732 -21.2836920229 3.3407495049 1.02156360941 -14.5257862163 -11.493942966 2.01624541315 5.90588720643 -7.70185838837 12.6562606274 -4.64969060998 -3.0722445249 -27.7730523342 8.13174942469 2.39665655323 2.21150411582 -20.4385138505 10.4521032414 -0.760795464966 -2.51100195307 -23.3745558174 -5.88778412129 -0.338248357066 -0.100399525571 1 7 3 12 3 4 1 7 3 3 2 7 3 3 4 5 3 2 5 6 2 1 7 8 7 8 8 7 8 6 9 5 11 4 11 4 12 3 5 0 210.0 1.07142857143 102.0 0.470588235294 0.227301587302 0.176870748299 0.0836911780585 0.0639995680812 0.0458514199331 0.0202719494292 0.0103054594514 0.00254833073883 -0.00557868015328 0.0 0.428571428571 0.0 0.0 0.0 0.0 3.0 3.0 0.0 0.0 1.0 7.0 0.2 0.0 4.0 2.0 0.485714285714 0.8125 0.3125 0.0 0.0 1.0 0.9375 0.625 0.375 0.5 0.6875 1.0 1.0 0.5 0.5 0.6875 0.3125 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 -4.66854499736 8.06385044999 -9.3156692556 21.7623656326 2.69700429787 3.35343001871 -1.91983059302 33.0144829581 -0.920798455282 -1.14106575272 -4.93933603368 27.9244028414 -1.25662179274 -0.210551451572 -13.1447576057 24.717416574 0.393534636668 0.60975956753 -14.1927732771 29.2020006384 -1.03242795228 0.420182304753 -23.5441064702 36.3734163513 -0.209443748009 0.313655056411 4 7 7 8 6 4 4 3 3 4 6 3 2 3 7 4 1 3 7 8 7 8 7 4 1 3 7 4 1 3 7 3 2 4 6 2 3 5 5 2 5 9 3 0 195.0 1.15384615385 94.0 0.627659574468 0.222222222222 0.222879684418 0.111803637957 0.0816817545812 0.0516151654613 0.0417530178323 0.00844196005323 0.0127381100695 -0.00371609424738 0.466666666667 0.769230769231 0.0 2.0 3.0 0.0 1.0 3.0 3.0 3.0 4.0 13.0 0.0975609756098 0.0 2.0 2.0 0.482051282051 0.375 0.8125 0.875 0.625 0.75 0.3125 0.25 0.625 0.5 0.0 0.0 0.25 0.5625 0.5 0.5 0.5625 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.39530545263 5.68713663315 -14.1079617462 16.5792363931 -8.75988806778 4.41616062538 -43.6421016164 32.8221457252 0.578593583009 0.127604800727 -43.1988513409 31.5940034215 2.37626714554 -2.69049496171 -26.2982254821 11.7899857432 -0.312050810915 -0.996824908979 -20.3920089753 1.83228896539 1.76558229937 1.11069061808 -1.79349585937 9.91622691786 0.542896067456 -0.0767506852594 4 6 5 4 2 2 3 3 4 2 2 5 1 4 2 11 4 1 20 1 10 4 9 3 9 5 3 3 2 9 4 7 8 1 1 1 3 0 168.0 0.857142857143 72.0 0.944444444444 0.193948412698 0.190051020408 0.0658657188074 0.102808273607 0.0468629788225 0.0197780644211 0.0151800513119 0.00823566641059 0.0384397405922 1.25 0.285714285714 2.0 4.0 6.0 3.0 2.0 1.0 0.0 1.0 5.0 9.0 0.25 0.0 3.0 0.0 0.428571428571 0.25 0.333333333333 0.5 0.416666666667 0.75 0.583333333333 0.333333333333 0.833333333333 0.75 0.5 0.0 0.666666666667 0.5 0.416666666667 0.0 0.5 0.0 0.0 0.25 0.5 0.25 0.0 0.25 0.75 0.0 0.25 0.75 1.0 0.5 0.0 0.25 0.75 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.25 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -6.09336067838 2.27364204417 -14.1740402273 8.66257182891 0.808302947131 4.95468362197 -11.4516017757 27.310665714 0.957164475388 1.41723371768 -4.32251366262 35.9376294081 0.462312852292 -0.846372619046 1.08404479861 30.3891581982 0.647750360059 -0.294601179065 5.77449582076 25.9599120415 -0.329625835624 0.121793786695 3.91716502779 27.6783850619 -0.00343198377359 0.193153970137 6 1 9 8 4 3 3 4 3 3 4 4 1 4 2 6 1 11 1 4 9 3 10 4 9 4 10 4 6 1 2 5 4 3 2 10 3 10 7 3 4 0 195.0 0.866666666667 95.0 0.747368421053 0.209072978304 0.232820512821 0.0714658035368 0.110788651191 0.048969807313 0.021523536676 0.0114938252302 0.00760075277005 0.0361934955198 1.07692307692 0.333333333333 0.0 4.0 6.0 3.0 1.0 2.0 0.0 1.0 2.0 13.0 0.25641025641 0.0 3.0 1.0 0.487179487179 0.3125 0.75 0.9375 0.75 0.5625 0.5625 0.1875 0.625 0.5 0.5 0.0 0.25 0.5625 0.6875 0.0 0.4375 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.5 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.75 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.5 1.0 0.5 0.0 0.0 -10.6103295395 3.73483599789 -25.7980503312 11.9003210755 -0.287469194989 4.94356473903 -27.1834514044 33.4468020707 1.17426429492 3.60519401389 -19.1281609089 50.1711657356 0.246470597542 -2.18281421004 -13.8055010465 35.4975754122 0.91357065855 -2.32028386988 -5.28875743311 12.9956954329 0.632616128158 -0.286672151088 3.47498587878 1.52609623875 0.185404619423 -0.531073893704 4 2 7 1 4 3 6 3 1 5 5 3 3 4 5 3 3 3 5 3 4 3 4 3 5 2 5 3 4 2 5 3 5 2 4 3 5 3 4 3 5 3 4 3 6 2 5 2 5 0 180.0 1.25 67.0 0.955223880597 0.155925925926 0.166666666667 0.0863681412894 0.0599382716049 0.0368209876543 0.0390737416141 0.00717492049858 0.00862315025932 0.0095139478018 0.0 1.0 1.0 0.0 0.0 0.0 3.0 3.0 3.0 3.0 3.0 3.0 0.346153846154 0.0 0.0 2.0 0.372222222222 0.333333333333 0.583333333333 0.5 0.5 0.666666666667 0.666666666667 0.416666666667 0.0833333333333 0.0 0.0 0.166666666667 0.5 0.25 0.583333333333 0.75 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.25 0.5 0.0 0.5 0.75 0.5 0.5 0.5 0.75 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 -7.21502408683 5.64469531499 -21.2690354824 15.586842609 -5.1461512977 2.34672195201 -35.7228485848 20.2216245057 2.77968208151 -3.20368866478 -29.2014933084 8.28944161358 -2.28117508189 1.31732778631 -36.249095486 10.4107691548 -0.185464616877 0.133826012741 -45.9488338684 16.2596031903 -1.48293252529 0.445026887726 -58.3509773174 17.8298916443 -0.216357294629 -0.0925534191251 2 3 10 5 10 6 11 3 12 3 11 4 11 4 11 4 12 4 2 2 7 10 5 5 1 5 4 3 4 4 4 3 5 3 4 3 5 3 3 4 6 2 3 3 6 4 2 3 7 2 3 3 6 3 3 3 6 3 2 4 6 3 2 6 3 12 3 1 1 4 4 1 10 0 345.0 0.652173913043 138.0 0.746376811594 0.149951690821 0.211720226843 0.0419286899293 0.148314475403 0.0569814525629 0.0144231543237 0.0192457430866 0.0162030040973 0.119986943953 0.666666666667 0.608695652174 3.0 3.0 1.0 1.0 0.0 1.0 5.0 6.0 4.0 7.0 0.25 0.0 1.0 2.0 0.4 0.708333333333 0.625 0.583333333333 0.833333333333 0.541666666667 0.708333333333 0.541666666667 0.333333333333 0.0 0.375 0.166666666667 0.0416666666667 0.0 0.333333333333 0.791666666667 0.75 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.0 0.0 0.166666666667 0.5 0.833333333333 0.666666666667 0.833333333333 0.833333333333 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.5 0.666666666667 1.0 0.666666666667 0.5 0.166666666667 0.166666666667 0.166666666667 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 -14.0609932332 -7.52872078626 -32.567240725 -19.8532464237 2.81458459729 -1.29887804958 -19.5631046979 -17.4291780136 3.76268010718 5.76172939404 -6.76221456011 1.78855494564 -5.44948935744 -4.38056096646 -24.8943256416 -10.1428499425 3.92023267069 2.0898399288 -12.6902196772 -9.67456743173 -1.92290023662 -1.82804335207 -16.5719609317 -18.4986909626 0.101301898236 -0.0299583865467 1 1 4 2 4 2 3 33 4 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 1 6 1 5 126.0 0.285714285714 60.0 0.7 0.210317460317 0.267195767196 0.019296872188 0.426552308166 0.0659381036365 0.00205393648599 0.0249125571538 0.0050960701704 0.760181604588 1.0 204522251.952 1.0 2.0 1.0 1.0 4294967294.0 4294967293.0 0.0 0.0 3.0 0.0 0.15 2.0 3.0 1.0 0.47619047619 0.25 0.333333333333 0.0833333333333 0.333333333333 0.5 0.5 0.583333333333 0.75 0.5 0.5 1.0 1.0 0.416666666667 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -2.84963136203 -5.51737136052 -4.74674813595 -9.71386783541 2.38603523365 5.69637555955 -1.19464866438 11.9445821614 -2.58689908072 3.00977562114 -5.2927869355 30.6344729887 2.60605234761 -0.616603564736 1.24142439137 29.546615632 -1.88075836881 -0.137300333799 -3.14265495116 22.5395338132 1.01668217141 -1.69309321789 -2.32271885089 5.84838095358 -0.171571850643 -0.200068889297 2 1 6 1 3 4 1 2 2 10 3 4 1 4 5 3 2 3 5 3 2 3 5 3 1 3 6 2 3 2 7 1 3 2 6 2 3 2 6 2 3 2 6 3 1 4 5 9 2 9 4 5 182.0 0.928571428571 89.0 0.741573033708 0.232882502113 0.235478806907 0.100255483558 0.112908405446 0.0585833982465 0.0352617043094 0.0126285796406 0.01365064764 0.0229877533524 0.538461538462 1.07142857143 3.0 2.0 4294967295.0 2.0 4.0 3.0 3.0 3.0 0.0 8.0 0.264705882353 1.0 0.0 2.0 0.489010989011 0.75 0.625 0.5625 0.6875 0.5 0.4375 0.25 0.4375 0.25 0.0 0.0 0.125 0.75 0.6875 0.4375 0.75 0.5 1.0 0.75 0.25 0.0 0.25 0.25 0.0 0.75 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 1.04587534032 -4.13733791067 3.71056520596 -1.39295375849 1.93329175042 -7.57534213077 11.5358991698 1.2151058983 0.969349435406 -3.1642118428 16.2417471596 -0.552111195058 -0.841975233064 -7.82672925958 9.49800496073 -1.73790469822 -1.22273025654 -20.5364074416 -1.83971638796 0.552635958201 -0.194952575753 -17.833249726 -5.66712453578 0.133526866633 0.00716730488452 6 6 2 6 5 11 2 4 4 10 3 3 4 2 6 2 11 2 6 2 11 2 6 2 11 2 6 2 11 2 5 3 10 3 3 5 8 5 2 6 9 4 4 4 10 3 5 2 11 3 5 3 10 2 6 3 10 3 5 3 10 2 6 3 10 3 5 3 10 3 5 3 10 3 4 4 8 7 1 6 7 4 1 1 3 2 1 2 7 0 441.0 1.0 156.0 0.730769230769 0.136486340568 0.161213691826 0.0521753105751 0.0835581219769 0.0312253832723 0.0184683738854 0.0103104532051 0.00422278504973 0.0390271713276 0.666666666667 1.09523809524 4.0 7.0 3.0 0.0 5.0 5.0 5.0 5.0 2.0 12.0 0.241935483871 0.0 1.0 3.0 0.353741496599 0.277777777778 0.5 0.472222222222 0.611111111111 0.472222222222 0.277777777778 0.194444444444 0.361111111111 0.527777777778 0.444444444444 0.472222222222 0.527777777778 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 0.444444444444 0.333333333333 0.333333333333 0.222222222222 0.555555555556 0.666666666667 0.777777777778 1.0 1.0 0.888888888889 0.888888888889 0.777777777778 0.555555555556 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.222222222222 0.222222222222 1.0 0.333333333333 0.0 0.111111111111 0.333333333333 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.444444444444 0.888888888889 0.444444444444 0.333333333333 0.333333333333 0.888888888889 0.777777777778 0.666666666667 0.888888888889 1.0 0.888888888889 1.0 1.0 0.666666666667 0.444444444444 0.333333333333 0.333333333333 0.333333333333 0.222222222222 0.333333333333 0.333333333333 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -20.4324631703 2.78900090752 -50.7641238927 8.88166119816 -2.40789519344 4.0007850936 -60.5368580641 28.3136235758 2.29446214464 4.79275230436 -39.8844019231 52.4098786486 4.0528934537 -0.127355207681 -12.9176113009 57.1611318143 -0.719891230941 0.347870023238 -9.24105166954 56.8992010237 0.486635784104 -0.185160810954 -6.24808071358 53.8287674467 0.271333639041 -0.186756121961 2 4 3 4 4 15 2 15 3 6 5 4 4 4 6 3 4 5 5 3 4 4 6 2 4 5 6 3 3 5 6 2 4 5 6 3 4 4 6 3 3 5 5 4 1 8 3 11 2 1 9 0 238.0 1.21428571429 128.0 0.5859375 0.233316856154 0.233493397359 0.107826620515 0.0786807060936 0.0460799248023 0.0366807903042 0.0059696076406 0.00918565344806 -0.0123964168847 0.588235294118 0.857142857143 4.0 2.0 1.0 3.0 1.0 3.0 3.0 3.0 2.0 11.0 0.155555555556 1.0 2.0 2.0 0.53781512605 0.85 0.5 0.55 0.65 0.75 0.65 0.6 0.65 0.75 0.05 0.0 0.15 0.55 0.6 0.5 0.75 0.666666666667 1.0 0.833333333333 0.333333333333 0.0 0.0 0.166666666667 0.333333333333 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.666666666667 0.333333333333 0.5 0.5 0.333333333333 0.333333333333 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.333333333333 0.5 0.666666666667 0.666666666667 0.5 0.5 0.5 -6.51599061129 10.3357092455 -14.5356857675 26.0330924868 1.33025413864 1.42121833164 -13.1798298848 29.5482836819 -1.56823581554 -2.82886184537 -16.5897603741 12.7881612466 0.703006985178 -1.20573173694 -14.4540353483 3.9063336584 -0.213498583781 1.66308054664 -17.6668718492 16.1709813554 -1.43669361614 0.718099809742 -27.3385807864 24.2744991464 0.348412675675 -0.186928706243 2 2 5 3 5 4 3 22 3 3 5 3 5 3 5 3 5 3 4 4 4 4 4 5 4 6 2 6 1 0 128.0 0.5 71.0 0.478873239437 0.181640625 0.267578125 0.0263500213623 0.21019744873 0.0377006530762 0.00498060372401 0.00819716164031 0.00237051788436 0.243800984559 0.5 0.0 1.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 3.0 3.0 0.130434782609 0.0 7.0 1.0 0.5546875 0.5 0.875 0.5 0.75 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.875 0.5 0.5 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -10.0267614148 2.46690161792 -18.8469397408 5.37145038604 7.01276467999 -0.627294287421 -1.26901959428 5.21740803605 -3.07245586856 1.51538158981 -4.48726337533 12.8385899297 1.54125298034 1.03827477628 -1.81229411843 19.721373855 -0.187152482584 -0.669836940645 -0.0720359102323 15.6137331016 -0.573139689138 -0.189560318908 -5.47148142599 11.7119726427 0.131576648083 -0.0399465928224 1 1 6 1 9 1 4 13 1 8 2 6 2 7 1 5 2 5 4 5 3 5 2 4 5 3 5 4 2 3 6 3 6 3 2 3 6 3 5 4 2 3 6 3 5 4 1 4 6 3 5 4 1 3 7 3 5 3 3 2 6 4 5 4 1 4 1 1 3 5 4 4 1 6 2 6 3 5 299.0 1.76923076923 158.0 0.620253164557 0.265377344772 0.243889889375 0.199279492994 0.0564680596788 0.0600184827304 0.0781009473156 0.00727624083665 0.0144286125489 -0.044192718986 0.478260869565 2.0 3.0 3.0 1.0 2.0 5.0 6.0 6.0 7.0 3.0 14.0 0.140350877193 1.0 1.0 3.0 0.528428093645 0.708333333333 0.625 0.541666666667 0.583333333333 0.541666666667 0.125 0.0 0.291666666667 0.666666666667 0.583333333333 0.5 0.708333333333 0.625 0.333333333333 0.333333333333 0.375 0.666666666667 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.941090098283 7.36264606303 0.178985364821 15.3051378979 -3.47574408144 -3.89182038865 -14.1132315474 0.965411746818 -2.26076618687 -1.88579457195 -25.2201224571 -9.31555686246 1.58099912981 2.0127705729 -16.3609567438 -0.568472506647 0.559897863083 -0.919447010452 -10.4193085932 -4.9203112437 -0.720363626816 -0.593850775254 -14.0480698304 -9.86295181566 0.237065576425 0.293185816498 2 3 2 4 2 10 1 12 2 6 7 4 8 3 9 3 9 3 9 3 9 3 9 3 8 5 7 6 6 6 4 0 168.0 0.857142857143 74.0 0.527027027027 0.176091269841 0.173469387755 0.0480743760798 0.0968375445416 0.0323432944606 0.0120122969864 0.0100538707877 -0.000278570914476 0.0446013874571 0.25 0.0714285714286 1.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 2.0 5.0 0.0833333333333 0.0 1.0 1.0 0.440476190476 0.583333333333 0.0833333333333 0.0 0.166666666667 1.0 0.75 0.666666666667 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.833333333333 0.833333333333 0.25 0.0 0.25 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -8.82173113138 4.72917545187 -16.6336709217 13.3491649758 6.23163523535 3.13112990083 -0.190858125258 26.1227306084 -2.214267885 1.396495375 -1.94234823173 34.208189646 0.764905969708 0.215163349061 -0.678862435215 35.5618722096 0.729821404937 -0.215734918624 6.46092749016 33.0869600656 -0.353072871626 -0.121275221357 3.97975794509 31.3903132328 -0.0360263120394 0.0462059020819 9 3 11 5 11 5 10 4 11 4 12 3 12 3 12 3 11 4 5 3 1 6 4 3 3 6 3 2 6 3 3 3 6 4 2 3 6 3 2 4 6 4 1 4 6 3 2 4 6 4 2 3 6 4 2 4 4 5 3 13 3 12 5 1 4 1 1 1 2 0 330.0 0.681818181818 137.0 0.693430656934 0.226868686869 0.233195592287 0.0699852797952 0.158194646186 0.0669850293569 0.0171657511364 0.0175363326539 0.0116435149436 0.0846066224494 0.733333333333 0.545454545455 0.0 2.0 5.0 4.0 0.0 1.0 5.0 3.0 5.0 11.0 0.127659574468 2.0 1.0 2.0 0.415151515152 0.0 0.125 0.75 0.708333333333 0.0 0.208333333333 0.291666666667 0.541666666667 0.25 0.25 0.0833333333333 0.375 0.916666666667 0.875 0.791666666667 0.875 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.983866920932 -9.40461027361 -0.629769951548 -21.3084588896 -2.70061186306 3.5775185311 1.17140051432 0.715601344892 7.89872282774 9.55210290308 25.9293504562 46.1635616012 -5.1315865142 -2.02229009721 10.941041464 46.8052357316 1.60712522839 -0.122560708731 8.59645064153 35.3391313059 -0.634221635052 -1.09371785443 6.16440183054 28.8446763098 -0.328749391527 0.156490103075 24 1 30 4 26 7 25 6 25 5 27 4 26 4 28 4 9 1 17 3 5 9 11 7 3 5 1 5 6 4 1 5 3 4 4 5 4 3 5 4 2 4 4 4 4 4 5 3 3 3 5 6 1 4 7 3 2 4 5 5 1 4 7 3 2 3 7 9 6 4 2 3 7 4 1 4 6 3 3 3 7 4 1 4 7 3 2 4 5 4 3 3 6 4 2 5 3 4 5 3 5 5 2 11 5 5 2 7 4 5 10 3 4 4 5 5 11 1 5 4 1 0 713.0 1.34782608696 258.0 0.705426356589 0.185178482559 0.213976461979 0.127700545465 0.0753067194951 0.0625401427816 0.063075657305 0.0133629000618 0.0206949297347 -0.000373571119345 0.774193548387 1.60869565217 5.0 4.0 3.0 12.0 0.0 2.0 14.0 13.0 5.0 19.0 0.223529411765 0.0 1.0 4.0 0.361851332398 0.0 0.270833333333 0.5 0.520833333333 0.0 0.208333333333 0.625 0.541666666667 0.0 0.0833333333333 0.5 0.5 0.520833333333 0.583333333333 0.479166666667 0.5 0.0 0.0 0.0 0.0 0.416666666667 0.916666666667 0.916666666667 0.833333333333 0.0 0.0 0.0 0.0 0.583333333333 0.416666666667 0.166666666667 0.0833333333333 0.0 0.0 0.0 0.0833333333333 0.666666666667 0.583333333333 0.416666666667 0.0833333333333 0.0 0.0 0.0 0.0 0.416666666667 0.833333333333 0.916666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0833333333333 0.5 0.833333333333 0.0 0.0 0.0 0.0 0.0833333333333 0.5 0.916666666667 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.333333333333 0.25 0.333333333333 0.333333333333 0.166666666667 0.0833333333333 0.5 0.25 0.0 0.0 5.05188593556 -13.7181292884 12.3595702929 -24.0954202662 -2.22867138732 10.8018717914 -13.3427624144 -3.90905712131 -16.6294957196 -10.110208259 -90.4403337153 -29.4449701152 3.60495448197 4.27521577674 -69.6869635917 -27.6557633864 8.86011101989 -2.33031665861 -11.1841788298 -24.006244244 -6.37438474334 2.52727166148 -36.0478306182 -15.3093554013 0.854464043367 -0.333562254607 6 7 5 10 2 4 2 6 1 4 4 5 1 4 4 4 1 5 9 4 10 4 10 4 10 5 10 5 5 1 4 5 2 3 4 10 6 7 7 1 5 1 3 0 210.0 0.933333333333 99.0 0.636363636364 0.198639455782 0.2 0.0746467984019 0.0924716553288 0.0358049886621 0.0243940074601 0.0105282350857 0.00293043519109 0.0235527176922 0.571428571429 0.4 0.0 2.0 3.0 2.0 1.0 2.0 0.0 1.0 2.0 8.0 0.166666666667 0.0 2.0 1.0 0.471428571429 0.3125 0.875 1.0 0.6875 0.5625 0.4375 0.3125 0.8125 0.6875 0.125 0.0 0.375 1.0 0.5 0.0 0.4375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -11.5440385389 4.41389708842 -27.6585523239 17.2503037686 0.407436654315 10.0817936573 -25.866787625 53.6727899553 2.07232677888 1.58685678344 -12.9509494507 65.7859818406 0.0627763194943 -0.965852528519 -9.63847619757 63.0530247295 -0.186631778063 2.56372574809 -11.8130751638 81.7934698664 -0.420303642495 1.51281384131 -17.5470381519 101.23456027 -0.256652965084 0.223148722922 4 8 4 4 1 5 2 3 4 4 1 4 5 2 2 4 6 1 2 3 9 4 10 3 10 3 10 3 7 2 2 5 3 2 3 10 4 8 8 3 11 1 5 0 195.0 0.866666666667 82.0 0.80487804878 0.18540433925 0.177435897436 0.0673551475918 0.0925091791837 0.0429474535983 0.0232514905618 0.015354632418 0.00738621630713 0.0312145652573 0.692307692308 0.4 0.0 2.0 3.0 3.0 2.0 2.0 1.0 0.0 2.0 9.0 0.3125 0.0 2.0 1.0 0.420512820513 0.375 0.8125 0.8125 0.5 0.6875 0.375 0.25 0.8125 0.5 0.0 0.0 0.5625 0.8125 0.1875 0.125 0.5625 0.0 0.0 0.25 0.5 0.5 0.75 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -9.08244208578 1.78253536263 -20.8708241263 11.4923391197 1.64559137604 10.4552772571 -14.9227201739 45.2829287132 1.69442509027 -1.61845408283 -4.09144715834 40.9504272185 -0.504386383194 -2.92639523284 -6.33567122406 19.480766549 -0.7008238505 0.703253714326 -11.9758961163 17.6824751412 0.316708983824 -0.895748042294 -8.54641742747 9.07381691273 0.251092966068 -0.393418148601 2 4 2 5 3 4 4 1 31 5 2 5 3 4 3 4 4 3 4 3 4 3 4 3 4 4 3 4 2 5 1 13 1 0 147.0 0.333333333333 70.0 0.657142857143 0.195335276968 0.266277939747 0.0204619957104 0.368897690966 0.0566912312614 0.00246352248885 0.0211825528458 0.00434184074899 0.596438742076 1.0 204522252.0 1.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 4.0 1.0 0.142857142857 0.0 6.0 1.0 0.47619047619 0.0833333333333 0.416666666667 0.166666666667 0.416666666667 0.333333333333 0.5 0.666666666667 0.75 0.583333333333 0.5 1.0 1.0 0.583333333333 0.5 1.0 1.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -4.66854499736 -5.82052363308 -7.50158224865 -9.91640394779 4.24083219921 6.47054809777 -1.12892832219 14.3063045415 -4.74647193969 3.04175265925 -10.1688512017 33.784703984 4.16307109083 -0.612592191349 -0.21367083897 33.3649115993 -2.78451452531 0.484383794536 -5.8285129019 33.3684975962 1.42348421137 -0.597014826475 -5.74085952706 27.6290614071 -0.2577911986 -0.163777292642 2 2 2 5 12 12 2 6 4 19 4 6 2 7 1 3 4 4 5 4 5 2 4 3 5 4 5 3 3 3 6 2 6 2 4 2 7 2 6 2 4 2 6 3 6 3 2 3 6 3 6 3 2 3 6 3 6 3 2 3 6 4 4 4 1 5 4 5 4 5 1 4 4 5 3 6 322.0 1.64285714286 160.0 0.6375 0.226843100189 0.223824312334 0.153396691955 0.059789917094 0.0583373729207 0.0625699144059 0.0109009090039 0.0195277352956 -0.0248617555763 0.391304347826 1.71428571429 3.0 1.0 1.0 3.0 2.0 6.0 6.0 6.0 4.0 12.0 0.175438596491 0.0 3.0 3.0 0.496894409938 0.75 0.625 0.416666666667 0.583333333333 0.875 0.25 0.0833333333333 0.208333333333 0.708333333333 0.666666666667 0.416666666667 0.583333333333 0.583333333333 0.416666666667 0.333333333333 0.416666666667 0.666666666667 0.833333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 1.0 1.0 0.666666666667 0.333333333333 0.333333333333 0.166666666667 0.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 -6.0894065183 8.91267681315 -18.43542895 17.1709532856 -6.70724216161 -6.71404421391 -48.034811008 -6.98293207595 -3.80132470576 -2.37261578391 -56.1942198098 -20.7902003865 8.00643287352 3.07996203588 -12.0410227656 -3.32407963313 -0.0351461983966 0.131003992088 2.07426146369 0.774671058939 -1.77399945433 -1.32257924624 -24.4423318448 -11.7547286892 -0.665556428243 -0.0539851231975 2 4 11 6 12 5 13 4 13 4 14 3 14 3 14 3 14 3 14 3 2 5 7 4 3 4 6 3 5 3 5 4 6 3 4 4 6 2 5 4 6 3 4 3 7 2 5 3 6 3 5 3 7 2 6 2 7 3 4 4 5 4 2 7 3 14 3 7 374.0 0.772727272727 134.0 0.708955223881 0.139351997483 0.20320855615 0.0464631546077 0.136758103396 0.0611188397118 0.0179836332068 0.0244307287775 0.0196721914721 0.101528725724 0.588235294118 0.590909090909 4.0 1.0 3.0 2.0 0.0 1.0 5.0 5.0 1.0 4.0 0.181818181818 1.0 0.0 2.0 0.358288770053 0.666666666667 0.4 0.533333333333 0.633333333333 0.4 0.466666666667 0.4 0.3 0.0 0.266666666667 0.3 0.333333333333 0.0 0.1 0.466666666667 0.566666666667 0.666666666667 0.444444444444 0.111111111111 0.0 0.0 0.111111111111 0.333333333333 0.333333333333 1.0 1.0 0.777777777778 0.666666666667 0.666666666667 0.777777777778 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.777777777778 0.777777777778 0.666666666667 0.444444444444 0.0 0.0 0.0 0.0 0.222222222222 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.333333333333 0.444444444444 0.0 0.0 0.0 0.0 0.333333333333 0.777777777778 0.888888888889 0.777777777778 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.222222222222 0.111111111111 -11.4012813779 -10.7646616055 -25.7944721196 -26.931364901 3.35636370973 -0.757630142322 -10.4279322073 -25.9104912074 4.0376103301 4.14160886673 4.12513497266 -7.30513425418 -5.34025537049 -0.91536155466 -15.7386361849 -0.970966696494 3.3012285942 2.07440425088 -1.75326004941 5.04215386803 0.381680450028 -2.23011975624 8.77600827167 -5.1373718158 -0.248893864224 0.381237900112 2 3 2 5 4 5 3 22 2 22 3 5 4 4 4 4 4 3 6 3 5 4 2 4 6 3 5 4 2 4 6 3 5 4 2 4 6 3 5 4 3 3 6 3 5 4 3 3 6 3 5 4 2 4 6 3 5 4 2 5 4 4 5 11 3 6 3 6 1 1 2 1 5 1 1 1 7 2 2 0 336.0 1.71428571429 182.0 0.554945054945 0.2578125 0.227678571429 0.179857457306 0.0534402237457 0.0525101642219 0.0664027887595 0.00718728317566 0.0137959049755 -0.0382840114692 0.333333333333 1.85714285714 4.0 2.0 1.0 1.0 2.0 6.0 6.0 6.0 3.0 18.0 0.125 0.0 2.0 3.0 0.541666666667 0.833333333333 0.666666666667 0.583333333333 0.75 0.75 0.0833333333333 0.0 0.208333333333 0.75 0.541666666667 0.5 0.625 0.833333333333 0.375 0.333333333333 0.375 0.666666666667 1.0 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.13004721414 13.8995316967 -12.7339882126 29.327223555 -8.8623882721 -6.5717728585 -49.9750268573 5.84396202276 -4.85725878554 -2.66621115258 -67.3332755354 -8.32318147795 6.71311968628 4.30890097583 -33.3551294239 13.9545482457 -0.954499385158 -0.836537436277 -25.9287272927 12.028487557 -0.312883947545 -1.47914410468 -31.4936108781 -0.135771134729 0.362554001371 0.396895012048 1 1 4 1 5 1 11 31 5 1 5 2 4 2 4 2 3 4 2 3 3 3 4 2 4 2 4 1 14 1 1 2 2 4 0 138.0 0.260869565217 75.0 0.573333333333 0.201690821256 0.275992438563 0.0165356961301 0.440312137567 0.0456266038373 0.00189164437588 0.0107676578913 0.00262007001816 0.854638251986 1.5 186737708.348 2.0 2.0 1.0 2.0 4294967295.0 4294967292.0 0.0 1.0 1.0 6.0 0.16 0.0 3.0 1.0 0.54347826087 0.583333333333 0.333333333333 0.5 0.666666666667 0.666666666667 0.333333333333 0.916666666667 1.0 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 0.75 0.916666666667 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.87152521464 -1.93753843764 -8.25882698796 1.08746405229 3.97595654333 8.73519557144 -1.84414036012 31.1779556306 -3.91611945199 0.278340534261 -7.24699495016 32.6569295578 4.09905409781 -4.16772931532 3.02618397345 9.31631969182 -2.94018794802 1.52891301575 -2.95511588944 10.2287898047 1.85661454648 -0.535078918746 -0.281257347035 14.049080379 -0.326266285295 0.283049144778 3 6 5 9 3 10 3 11 2 11 6 8 3 10 3 10 1 9 1 2 1 5 1 6 1 13 1 12 1 11 1 0 169.0 1.0 133.0 0.218045112782 0.347291761493 0.390077378243 0.0808169538094 0.103607994433 0.0430945164808 0.00534130447914 -0.00406034679106 -0.000703795317203 -0.0773573867229 0.461538461538 0.153846153846 3.0 2.0 0.0 1.0 0.0 0.0 1.0 1.0 4.0 11.0 0.2 0.0 3.0 2.0 0.786982248521 0.75 0.625 0.75 0.875 1.0 0.9375 0.9375 0.9375 0.9375 1.0 0.9375 1.0 0.25 0.625 0.6875 0.875 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.5 0.5 1.0 1.0 1.0 0.5 0.25 0.5 0.75 0.75 1.0 1.0 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -5.19089968238 0.195883006882 -13.7957304289 0.561933112819 -1.96230728196 0.31758546678 -21.1035262955 2.97574723532 0.225507902657 1.12896949147 -19.1288324686 8.1124714797 0.6484683732 -0.289361370516 -15.3265661156 6.02324087341 -0.749832853339 -0.985471071364 -20.7151973877 -3.75875855971 -0.565430904442 -0.874417982245 -26.1065947737 -15.8981695834 0.146333312276 -0.308896764049 1 4 1 8 7 3 2 3 3 2 2 5 2 2 2 4 3 9 2 8 3 8 4 3 3 2 3 2 3 3 3 1 3 3 8 3 10 1 5 1 3 9 1 8 0 165.0 0.733333333333 73.0 0.931506849315 0.206060606061 0.221414141414 0.0646562595654 0.127014720205 0.0562301805938 0.0173476094567 0.0107141684959 0.0119222570953 0.057572208458 0.909090909091 0.533333333333 2.0 3.0 3.0 0.0 1.0 2.0 2.0 2.0 0.0 5.0 0.222222222222 1.0 1.0 1.0 0.442424242424 0.416666666667 0.333333333333 0.25 0.916666666667 0.416666666667 0.0 0.416666666667 0.583333333333 0.416666666667 0.166666666667 0.25 0.333333333333 0.666666666667 0.833333333333 0.833333333333 0.916666666667 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.25 0.25 0.25 0.5 0.25 0.5 1.0 0.75 0.75 0.75 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -3.73483599789 0.254647908947 -12.9091402798 3.36877722074 -5.05221451351 4.30298377696 -25.7675926348 19.3053968487 3.47072315103 1.08224732542 -15.8008854364 25.3988028943 -1.40837650226 -1.29634725776 -14.5979310114 18.3754381387 1.31764779775 0.104101578375 -8.38393209079 13.6800816226 0.392464566203 -0.983307431755 0.980264716481 5.01812698405 0.189541501433 -0.190041661322 8 1 1 2 6 8 4 8 4 6 7 5 8 5 9 4 9 3 8 7 5 9 3 10 6 5 8 5 8 4 9 4 9 4 9 4 9 4 9 4 7 6 7 8 4 8 7 2 9 0 299.0 0.565217391304 126.0 0.595238095238 0.167224080268 0.19514323106 0.0297866525177 0.153988311429 0.0339214180563 0.00565439392202 0.00836657104486 0.000264221746965 0.131959817328 0.692307692308 0.0434782608696 3.0 1.0 4.0 1.0 1.0 0.0 0.0 0.0 3.0 8.0 0.166666666667 1.0 4.0 2.0 0.421404682274 0.125 0.416666666667 0.375 0.416666666667 0.708333333333 0.916666666667 1.0 1.0 0.666666666667 0.666666666667 0.458333333333 0.333333333333 0.375 0.0833333333333 0.0416666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.333333333333 1.0 0.666666666667 0.5 0.5 0.166666666667 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 0.833333333333 1.0 1.0 0.666666666667 0.5 0.833333333333 0.833333333333 0.5 0.5 1.0 0.666666666667 0.166666666667 0.0 -13.7842020278 6.20012300045 -24.1260308743 13.9986139052 11.6076499368 -0.35621824692 2.73876452841 19.6709985037 -6.95057324381 4.22896835939 -9.09565517853 31.689572171 3.77198108769 -3.12402830842 -3.8812133676 19.9277093477 -1.69383511633 0.0435774386875 -4.30053052842 8.05735672393 0.138970862908 -1.44187256712 -12.0326267447 0.834308778857 -0.119011326348 0.307560505434 8 5 8 6 10 4 10 4 11 3 11 2 12 2 11 3 6 8 5 9 3 4 4 3 3 3 5 3 2 3 6 3 2 3 7 3 1 3 6 4 1 3 7 3 1 4 6 3 1 4 6 3 2 4 4 4 2 5 3 5 4 2 4 3 1 0 294.0 0.666666666667 121.0 0.710743801653 0.215500485909 0.221088435374 0.0675981647229 0.15411981119 0.0577512346046 0.0180847832687 0.0158200276786 0.0112309216473 0.0893906638165 0.642857142857 0.52380952381 0.0 3.0 5.0 1.0 0.0 0.0 5.0 5.0 1.0 6.0 0.292682926829 0.0 1.0 2.0 0.41156462585 0.0 0.166666666667 0.75 0.708333333333 0.0 0.375 0.125 0.375 0.291666666667 0.416666666667 0.166666666667 0.0833333333333 0.875 0.666666666667 0.791666666667 0.833333333333 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.666666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.5 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -2.48584863496 -6.60871954172 -7.79831207884 -17.2876402352 -1.44564451062 -0.585269489465 -5.35400067623 -10.4351236371 5.60539979341 7.82565392298 12.6688729849 21.7551244323 -3.97921457125 -2.68227647337 0.853195242873 19.7089982652 1.33866204531 1.15695722356 -1.2927215561 18.8159245114 -0.765210715421 -0.665450802799 -1.84639029445 14.6211685244 0.0270981389765 -0.311021200108 3 1 12 10 3 12 1 13 2 5 4 4 1 4 5 4 2 3 6 3 1 3 7 3 1 3 7 3 2 2 7 3 2 2 6 4 1 4 5 4 1 4 4 5 1 1 1 3 3 5 196.0 1.0 108.0 0.564814814815 0.273688046647 0.252551020408 0.112386606558 0.0976871615993 0.0620230781817 0.0314167556362 0.00976795629524 0.0126908387915 -0.0121003329896 0.428571428571 0.785714285714 2.0 2.0 1.0 1.0 0.0 2.0 3.0 3.0 2.0 5.0 0.2 0.0 1.0 2.0 0.551020408163 0.625 0.75 0.625 0.625 0.8125 0.6875 0.3125 0.375 0.75 0.25 0.0 0.0625 0.6875 0.75 0.5 0.75 0.0 0.25 0.75 0.75 0.5 0.25 0.25 0.5 0.25 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.682092613251 7.59396442753 -0.776413528106 19.0322683325 -3.63179515913 1.1530613224 -13.2410405807 24.2395745919 -0.249456694584 0.34000465471 -15.9630311316 27.3584269573 0.793703248582 1.79406516418 -12.2232363433 39.2289086206 -0.905935831275 0.803485086159 -16.7241656554 46.578193394 0.256743717804 -0.392931739816 -15.2081235353 44.1030482618 0.107712569372 0.0388255227809 3 1 4 4 3 13 2 7 3 4 3 4 4 4 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 2 5 5 3 2 5 5 1 1 2 195.0 1.15384615385 95.0 0.642105263158 0.22735042735 0.211834319527 0.111536607158 0.0787951246649 0.0516158397815 0.039922809978 0.0100062053157 0.013014641282 -0.00472235615605 0.133333333333 1.0 1.0 1.0 0.0 0.0 2.0 3.0 3.0 3.0 3.0 8.0 0.0810810810811 0.0 1.0 2.0 0.487179487179 0.6875 0.5 0.5 0.625 0.75 0.5625 0.5 0.625 0.4375 0.0 0.0 0.0 0.8125 0.5625 0.5 0.4375 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.7162443621 7.97896781367 -9.23161862413 20.5461323847 -3.61713207553 1.8923169056 -18.8431619197 26.9940781476 2.79015303586 -1.17742486321 -5.53276800988 19.6048872967 1.53212665788 -0.970196283907 6.36728678866 10.7168660332 -1.05632978555 -0.292798054781 1.05111668428 6.43557531956 0.0751379362607 -0.211125881589 -2.19310863123 3.0709776137 -0.122769069299 -0.155304393318 1 4 2 6 1 14 1 6 3 4 3 3 3 4 3 3 2 3 4 0 70.0 0.7 47.0 0.425531914894 0.29387755102 0.26 0.0583206997085 0.114040816327 0.0384897959184 0.00622000751612 -0.00226096831161 -0.000735536019995 0.0171870389391 0.428571428571 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 7.0 0.0588235294118 0.0 2.0 1.0 0.671428571429 0.833333333333 0.833333333333 0.166666666667 0.0 1.0 1.0 0.333333333333 0.333333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -2.92845095289 5.79323992854 -7.3482213555 13.8915370646 -0.388338061144 -0.129233813791 -8.6447131349 13.7439236117 0.354597213209 -0.530495256314 -7.14195482847 10.3488751685 -0.332547887393 0.386474356761 -7.89934588678 11.4223068709 0.323527863754 -0.180251089954 -4.63169856167 9.56795824163 0.609060835374 -0.531535345721 1.26973071305 3.38993032186 -0.0159642144221 -0.110110729766 2 2 11 3 3 5 3 5 3 4 2 4 5 3 2 4 5 3 3 2 6 3 3 2 6 3 3 1 8 2 3 1 8 2 3 2 7 2 3 2 6 3 2 3 6 10 3 4 1 1 13 0 196.0 1.0 76.0 1.09210526316 0.18221574344 0.171647230321 0.0899752654081 0.0783829176194 0.0506421644043 0.0379778875777 0.0132867970762 0.0175035886507 0.0194727582879 0.357142857143 0.857142857143 1.0 3.0 1.0 1.0 2.0 3.0 3.0 3.0 0.0 3.0 0.21875 2.0 1.0 2.0 0.387755102041 0.6875 0.625 0.375 0.6875 0.4375 0.375 0.125 0.375 0.25 0.0 0.0 0.0625 0.625 0.75 0.5625 0.75 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.54607659004 4.18350136127 0.632935754147 11.5865974822 -4.35332850171 2.40170841237 -11.8367084163 21.214141215 2.11760258726 0.696618922688 -0.578696502416 24.0714032956 3.24604913379 -0.889045851307 20.1067587144 17.1454413791 -1.49933895513 -0.756673868887 11.7020754769 9.89294801898 -0.997920535431 0.193521491654 0.748414502368 10.5458704028 0.237400082434 0.0693492184305 9 1 6 2 3 6 3 4 1 7 3 5 4 4 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 2 7 3 3 2 7 3 3 2 6 4 3 3 5 5 1 5 3 10 6 5 1 0 210.0 1.07142857143 97.0 0.742268041237 0.208253968254 0.227891156463 0.0978408379225 0.093523377605 0.0596382680056 0.0326740073142 0.0137254135911 0.017377249572 0.0125158059924 0.333333333333 0.928571428571 1.0 2.0 2.0 0.0 2.0 3.0 3.0 3.0 4.0 6.0 0.222222222222 0.0 1.0 2.0 0.461904761905 0.625 0.8125 0.625 0.6875 0.375 0.3125 0.125 0.1875 0.625 0.0625 0.0 0.25 0.6875 0.8125 0.75 0.9375 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.0 0.25 0.75 0.75 0.5 0.5 0.5 0.25 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.86741799894 3.14065754368 -12.32134752 8.56086185888 -11.0573780907 1.18043452903 -46.2374265876 10.5265045182 2.8927834787 -2.35997202674 -39.6479362183 -2.14073054237 0.825429252735 -1.23195769777 -30.679181609 -12.7794234887 -1.92645628689 0.0830626104094 -44.4612518138 -14.5982790024 -0.424059080874 -0.468668914402 -53.1784007606 -19.1961271793 -0.142011564576 -0.159150899503 4 2 5 3 5 2 4 4 3 4 4 3 2 6 1 1 2 3 2 6 1 5 6 5 2 3 1 1 1 3 5 4 4 2 4 3 5 3 4 3 3 4 4 4 4 2 4 3 5 3 4 3 3 4 4 3 5 2 4 3 5 3 4 5 1 4 4 3 5 5 1 3 5 3 4 5 2 3 5 2 5 3 4 0 286.0 1.69230769231 136.0 0.830882352941 0.227749523204 0.214631522324 0.167795106502 0.0525870774538 0.0506336418728 0.0714706785699 0.00706681411842 0.0133879407826 -0.0265437471587 0.454545454545 2.15384615385 2.0 0.0 2.0 5.0 7.0 7.0 6.0 6.0 7.0 5.0 0.428571428571 0.0 2.0 3.0 0.475524475524 0.625 0.666666666667 0.583333333333 0.541666666667 0.333333333333 0.208333333333 0.291666666667 0.416666666667 0.583333333333 0.625 0.458333333333 0.25 0.583333333333 0.458333333333 0.5 0.75 0.0 0.333333333333 0.666666666667 0.5 0.166666666667 0.166666666667 0.333333333333 0.5 0.5 0.833333333333 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.5 0.333333333333 0.166666666667 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.666666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.166666666667 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 -3.64609505992 9.20204943695 -13.3665849629 20.9046878487 -7.27246016822 -1.69211239646 -40.6670593164 16.5635664364 -1.13342865063 -0.664798570542 -43.1687079922 7.03132980889 3.99280808457 -1.36427317178 -25.9887733001 0.774050266229 -3.52501436759 0.816413720451 -42.2975543694 -0.113540596335 0.0770845279183 -1.38962275015 -51.551066192 -7.011322214 -0.0104509258861 0.187921198044 3 1 3 5 4 12 2 6 3 4 2 5 5 4 2 3 7 3 2 3 7 2 3 3 8 2 2 3 8 2 2 3 8 1 3 3 7 2 3 3 7 3 2 4 5 4 1 6 3 6 195.0 1.15384615385 93.0 0.698924731183 0.20547008547 0.213806706114 0.104738650348 0.0849314384936 0.0487712874458 0.0407381103967 0.0122584749187 0.0150345332689 0.00750233483599 0.533333333333 0.923076923077 1.0 2.0 1.0 3.0 2.0 3.0 3.0 3.0 3.0 10.0 0.216216216216 0.0 1.0 2.0 0.476923076923 0.75 0.8125 0.75 0.8125 0.625 0.3125 0.25 0.4375 0.5 0.0 0.0 0.0625 0.875 0.5 0.3125 0.6875 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.3290144521 6.62084563262 -15.2958347072 17.6766015954 -7.22747354016 2.57590507006 -39.8029563781 26.9474399422 0.818318914905 -0.538671497662 -35.3630451763 23.0180278263 3.27584360971 -1.25031269111 -13.8603726694 12.6088479565 -0.859372652783 -0.56090044267 -14.3045261647 5.84769597424 0.222719520172 -0.151564374985 -8.79743202042 2.40989810887 0.746118216163 -0.169167371832 2 5 3 5 3 5 3 6 2 6 4 4 4 4 4 4 1 14 1 4 6 1 5 0 96.0 0.666666666667 58.0 0.448275862069 0.30859375 0.259548611111 0.0640089246962 0.132350215205 0.0436028374566 0.00648471401652 -0.00313886215066 -0.000107853256809 0.0191871104885 0.25 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 6.0 0.117647058824 0.0 2.0 1.0 0.604166666667 0.0 0.0 0.0 0.166666666667 0.5 0.5 0.166666666667 0.333333333333 1.0 1.0 0.333333333333 0.333333333333 1.0 1.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.0159626125 4.24413181578 -6.23918751909 10.3292462684 -1.54291875386 0.00884194128288 -8.32797392571 9.77468194909 2.67767548675 -0.997338228779 1.44989092875 5.21339219682 -1.08576076858 0.690165481727 -0.585405645094 7.44105675114 0.172298674722 -0.326924411281 -0.569956561772 3.7046577855 0.602420194367 -1.19568045961 3.75090449531 -8.19648166278 -0.201211971727 -0.0894974613805 5 2 2 1 3 8 3 3 2 3 2 4 1 5 1 13 4 3 1 3 8 3 8 3 10 2 9 2 6 1 2 4 2 2 4 6 2 0 143.0 0.846153846154 68.0 0.75 0.204704386523 0.196880043034 0.0688022427961 0.0970827304633 0.038430247927 0.0204761991351 0.00995224492159 0.00522688811358 0.0341640021657 0.909090909091 0.461538461538 0.0 1.0 4.0 2.0 2.0 2.0 0.0 2.0 2.0 11.0 0.235294117647 0.0 3.0 1.0 0.475524475524 0.333333333333 0.833333333333 0.833333333333 0.25 0.75 0.666666666667 0.416666666667 0.75 0.666666666667 0.416666666667 0.0 0.416666666667 0.75 0.666666666667 0.0 0.333333333333 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -8.22708628906 6.95384674432 -20.850581244 16.8691067179 -1.39088525597 0.703556125311 -25.3964621923 23.8434697481 1.13390068723 3.17469216755 -20.4534208387 38.5485107023 -0.865726279967 0.508005243965 -23.6626766449 40.7540941356 -0.0808388876917 -2.23065111084 -22.7494867143 23.1419571173 1.24528972298 -0.298462938569 -11.5916932837 15.6479265768 0.000845854162443 0.0385425965225 3 2 7 3 6 5 4 9 2 6 4 5 6 3 7 3 6 4 7 3 7 3 6 4 7 4 6 8 2 6 2 0 150.0 0.666666666667 68.0 0.705882352941 0.162666666667 0.220888888889 0.0317819259259 0.147567703704 0.0486020740741 0.00678131142989 0.0172944043143 0.00701062657116 0.118892775579 0.6 0.0 2.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 6.0 0.107142857143 1.0 3.0 1.0 0.453333333333 0.5 0.666666666667 0.416666666667 0.416666666667 0.916666666667 1.0 1.0 1.0 0.583333333333 0.75 0.333333333333 0.416666666667 0.25 0.333333333333 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.25 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 -10.3981229487 2.03718327158 -20.4003747845 5.55219264104 6.00346592449 1.31285144168 -6.85040976346 12.990271971 -3.88986732155 2.59250434116 -16.9915661454 27.6425417531 0.0276758659693 1.4317718242 -23.6695138818 39.1451538245 -0.120386694392 0.2098586091 -24.3015097556 43.093154084 -0.92286247982 0.551437979765 -34.1752142856 48.7795453286 -0.175966485723 0.191851761976 3 6 4 7 2 10 2 3 3 2 3 3 4 1 3 6 5 7 6 7 7 5 7 7 4 8 3 14 2 8 2 0 154.0 0.785714285714 94.0 0.553191489362 0.278040141677 0.295454545455 0.0709425715118 0.142103911437 0.0551008908447 0.0114233799386 0.00496243715325 0.00525218911815 0.0295418393143 1.18181818182 0.285714285714 2.0 2.0 4.0 2.0 0.0 2.0 0.0 2.0 3.0 10.0 0.1875 1.0 3.0 1.0 0.61038961039 0.5 0.666666666667 0.166666666667 0.75 0.833333333333 0.833333333333 0.416666666667 0.5 0.75 0.5 0.583333333333 0.25 0.916666666667 0.5 0.833333333333 0.75 0.0 0.5 0.75 0.5 0.5 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.25 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.5 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.75 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.75 1.0 -5.54768658777 0.818511135901 -16.2148879653 3.25134623423 -3.90648823875 2.48754999975 -27.8901304942 15.4066658695 1.83909800859 2.67909558263 -21.5639731188 25.0064867294 -0.182212398625 -2.76226244125 -18.7671225127 10.995291332 -0.347904193214 -0.445796891587 -23.7764339049 -0.596431866791 -0.583343752087 -0.898398917606 -26.3623705313 -9.12768082487 0.280395289636 -0.155792099203 6 4 6 8 3 4 1 4 2 3 4 3 1 3 7 5 8 4 8 4 9 3 9 4 8 4 5 2 2 10 2 9 5 6 8 1 5 0 180.0 0.8 81.0 0.703703703704 0.199537037037 0.207407407407 0.0660800754458 0.113820301783 0.0471021947874 0.0208387807877 0.015577397784 0.00709254054157 0.0461013218134 0.666666666667 0.266666666667 0.0 2.0 3.0 3.0 1.0 2.0 0.0 0.0 1.0 7.0 0.275862068966 0.0 2.0 1.0 0.45 0.0833333333333 0.75 0.833333333333 0.5 0.5 0.75 0.75 1.0 0.666666666667 0.0833333333333 0.0833333333333 0.666666666667 0.666666666667 0.0 0.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -9.12488340394 3.56507072526 -19.3659846399 16.1754791268 3.98552271714 11.2429881221 -5.79252637528 54.1991237978 1.54264655306 -0.587765099466 6.33661774934 53.9211749666 -0.167625494314 -3.45171711602 8.07981588815 30.6682070977 0.801385632487 1.0891079512 13.5191309603 33.9829378153 0.21624671819 1.014539487 19.074802337 47.7824088106 0.262966978415 0.252805536301 1 4 3 4 3 4 3 4 37 5 2 5 4 3 4 3 4 3 4 3 4 4 3 3 3 4 3 5 2 5 1 7 1 4 2 0 154.0 0.318181818182 70.0 0.685714285714 0.176252319109 0.252066115702 0.0171017210147 0.376462380595 0.0571497569727 0.00210526820597 0.0243235239254 0.00535325670878 0.628827866549 1.0 195225785.955 1.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 3.0 1.0 0.190476190476 0.0 6.0 1.0 0.454545454545 0.333333333333 0.333333333333 0.166666666667 0.416666666667 0.666666666667 0.333333333333 0.583333333333 0.833333333333 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.8614600799 -5.49807985227 -8.42137524918 -7.82245338038 3.76949693917 8.08509502416 -2.3359773448 19.5896356307 -3.72228143059 1.14893492015 -7.87434368745 31.5791062621 3.6280416905 -0.691164348411 0.642232004676 27.2405016957 -2.62994310011 0.342525225005 -4.57964861022 27.4923151828 1.54444512137 -0.192757405369 -4.7145620125 26.2150115252 -0.423075612856 -0.068143747426 2 4 10 5 10 5 11 4 11 4 11 4 10 5 10 5 10 5 1 2 2 1 4 12 4 4 5 3 3 4 5 3 3 4 5 3 3 4 5 3 3 4 5 3 2 4 6 3 2 4 6 3 2 3 7 4 1 4 5 5 1 5 4 11 4 3 2 0 315.0 0.714285714286 140.0 0.6 0.174814814815 0.240060468632 0.0522655020856 0.148697036957 0.0634609333445 0.0184952999188 0.0179359043742 0.0177220669702 0.103293789377 0.333333333333 0.619047619048 2.0 2.0 0.0 0.0 0.0 2.0 5.0 5.0 2.0 8.0 0.0909090909091 0.0 1.0 2.0 0.444444444444 0.583333333333 0.666666666667 0.541666666667 0.791666666667 0.75 0.791666666667 0.708333333333 0.541666666667 0.0 0.25 0.0 0.0 0.0 0.291666666667 0.5 0.625 0.333333333333 0.166666666667 0.166666666667 0.5 0.333333333333 0.0 0.0 0.333333333333 0.833333333333 0.666666666667 0.666666666667 1.0 0.833333333333 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -12.9142868109 -6.97250226879 -28.6464368351 -18.1406334192 3.876224568 -1.16064012921 -15.2410147024 -17.4300831485 1.92436762268 4.47626252272 -3.74731415391 1.56945330287 -2.40496440796 -0.702494520155 -16.0294695696 11.3000855925 0.146130978862 3.23822112289 -17.147957662 29.0272033601 0.844633715705 -0.989925481214 -10.3865129234 29.285694834 -0.178281111438 0.11142987043 1 2 4 3 6 2 5 4 4 35 6 2 6 3 5 3 4 5 3 4 5 3 5 3 5 3 5 3 5 3 5 1 15 4 1 4 0 176.0 0.363636363636 89.0 0.685393258427 0.230113636364 0.268078512397 0.0262637349737 0.311536644205 0.0617296088467 0.00286412352094 0.014833354258 0.00410535231257 0.421053720288 1.125 195225786.0 2.0 3.0 2.0 2.0 4294967295.0 4294967293.0 0.0 0.0 0.0 2.0 0.238095238095 3.0 7.0 1.0 0.505681818182 0.166666666667 0.166666666667 0.0 0.333333333333 0.5 0.416666666667 0.416666666667 0.666666666667 0.666666666667 0.5 0.916666666667 1.0 0.666666666667 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.99334220849 -4.10909125801 -7.25268305314 -3.63966102103 2.79304369703 9.53470837886 -2.22410096053 29.9338781974 -2.36390020231 1.73196462582 -4.81753093887 42.195115968 2.66899273642 -2.72298365983 3.51418692594 25.6210467288 -1.44576560373 -0.0363081613249 0.347691092736 17.4399836504 0.271603102916 -1.01471780868 -3.39509090108 7.72266049438 -0.0847117314569 -0.17192390739 0 7 10 6 11 5 11 5 11 4 12 4 12 4 12 4 12 10 6 11 6 3 4 5 4 2 6 4 3 3 7 3 4 3 6 3 4 3 6 4 3 3 6 4 2 4 6 4 2 4 6 3 3 5 4 4 3 5 4 4 4 9 4 0 336.0 0.761904761905 142.0 0.612676056338 0.17931547619 0.220663265306 0.0563194275726 0.133556310359 0.0665558820254 0.0194753483647 0.0203601392462 0.0176463166529 0.078176531572 0.625 0.47619047619 2.0 4.0 4.0 0.0 0.0 0.0 5.0 5.0 5.0 12.0 0.078431372549 0.0 2.0 2.0 0.422619047619 0.625 0.458333333333 0.291666666667 0.416666666667 0.916666666667 0.833333333333 0.666666666667 0.875 0.166666666667 0.333333333333 0.0 0.25 0.0 0.416666666667 0.375 0.416666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.5 0.5 0.333333333333 0.166666666667 0.166666666667 0.166666666667 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.5 0.666666666667 0.833333333333 0.166666666667 0.333333333333 0.5 0.5 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -9.67055749454 -7.94258954097 -23.3475017555 -20.5737797821 0.392448146037 -0.668584807909 -20.2645440476 -14.2312616612 2.25626699406 7.61946966242 -12.1478467594 16.293700295 -2.68674878171 -2.89006408576 -20.0337847051 16.8529504325 2.13170837898 2.90958655457 -10.5674479331 25.3435682577 -0.283513838272 -1.90707640467 -8.33905606304 14.2415689244 -0.149953005137 -0.30852290148 2 1 6 2 4 3 4 4 2 5 2 6 1 5 2 4 3 3 5 2 5 2 4 3 4 3 5 5 1 21 2 4 1 0 126.0 0.388888888889 73.0 0.465753424658 0.19387755102 0.311728395062 0.0229861785984 0.300953920663 0.0524376417234 0.00368258756904 0.013609323759 0.00657953660673 0.477725408806 0.714285714286 0.0 2.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 3.0 9.0 0.0833333333333 0.0 5.0 1.0 0.579365079365 0.4 1.0 0.8 0.9 0.8 1.0 1.0 1.0 0.9 0.9 0.5 0.9 0.6 0.7 0.0 0.8 0.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.666666666667 1.0 -8.4175281013 -1.62691719605 -14.5816788318 -2.69983548819 7.50124100095 2.0742539291 4.14165924934 6.0951827884 -3.73044346269 1.81805864674 -2.13875538614 16.0418146912 1.56660930828 -0.328159718946 -0.219664745794 15.1476230845 -0.163013332214 -0.514115818453 1.18065640559 8.03991763284 -0.731309909846 -0.947525939998 -4.03155748914 -2.30415362645 0.258187723678 -0.12294421127 2 1 4 3 1 4 2 16 1 10 2 4 7 3 8 3 8 3 8 3 8 3 8 4 6 6 5 6 5 1 1 2 1 1 4 0 154.0 0.785714285714 73.0 0.561643835616 0.183589138135 0.191094619666 0.0497951407675 0.10692217211 0.0280390464654 0.0142299405899 0.005796947661 -0.00199269771397 0.0541124062705 0.272727272727 0.285714285714 1.0 0.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 9.0 0.214285714286 0.0 2.0 1.0 0.474025974026 0.75 0.416666666667 0.333333333333 0.5 0.75 1.0 1.0 1.0 0.583333333333 0.583333333333 0.333333333333 0.75 0.916666666667 0.25 0.0 0.166666666667 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -9.27645954021 5.54768658777 -17.7798748572 15.0504387547 6.32814902008 2.38639612922 -0.197603859272 22.7971664687 -1.76761701329 -1.00013261689 -2.22814729457 18.4992642881 -0.688917969786 -0.0275502558148 -7.81803740879 16.9066398335 1.23194839414 0.41068685666 0.349043794761 18.0750548797 -0.161311729978 -0.809036074327 2.21062669047 9.99885629756 0.0361136863397 -0.236622637727 8 4 6 8 5 3 2 3 4 3 9 4 9 4 9 4 9 4 6 7 6 7 6 7 6 7 6 7 6 7 7 5 9 4 9 4 8 6 8 5 7 8 5 7 5 4 9 0 286.0 0.590909090909 122.0 0.5 0.14093598709 0.20979020979 0.0265287306952 0.158121329988 0.0274651384119 0.00655095662138 0.00752036992511 -0.000485235922937 0.146427189759 0.461538461538 0.0454545454545 3.0 0.0 3.0 0.0 1.0 0.0 0.0 0.0 4.0 9.0 0.285714285714 1.0 2.0 1.0 0.426573426573 0.0833333333333 0.625 0.875 0.625 0.625 1.0 0.916666666667 0.916666666667 0.458333333333 0.25 0.166666666667 0.291666666667 0.416666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.666666666667 0.0 0.166666666667 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.666666666667 0.5 0.5 0.5 0.5 0.333333333333 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 -19.4458403196 2.02560836662 -33.183672182 6.36133819328 18.4127083073 2.86036468347 15.9643801295 20.9091235865 -6.99614894039 3.94071665132 5.83667894872 39.9298982663 0.866992893419 -0.573164406747 -4.82706941473 39.5950364663 0.197247989146 -0.565156950696 6.34670463964 32.362654562 1.32446507024 -0.155014211674 11.3223876875 28.8117653926 -0.398395198405 -0.113615544701 2 1 6 4 1 12 2 4 6 3 6 3 6 2 7 3 6 3 6 3 6 3 5 6 3 5 3 0 117.0 0.692307692308 52.0 0.75 0.158594491928 0.199211045365 0.033357621348 0.132537635496 0.037512807401 0.00758728028167 0.0118902747863 0.00187886991981 0.0995775274523 0.444444444444 0.0769230769231 1.0 0.0 2.0 1.0 1.0 0.0 0.0 0.0 0.0 4.0 0.15 0.0 7.0 1.0 0.444444444444 0.75 0.416666666667 0.333333333333 0.5 0.75 0.916666666667 0.916666666667 1.0 0.5 0.25 0.25 0.583333333333 0.416666666667 0.0 0.0 0.0833333333333 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.25 0.75 0.75 0.5 0.5 0.25 0.25 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -7.44355426153 2.44853758603 -14.4750467723 7.54475908084 4.45546910329 2.4676622583 -4.32961072005 16.3739423215 -2.7287824474 0.157835985396 -10.1755067925 17.9406415449 0.673250928164 -0.430384616644 -10.8393015372 13.7677025134 0.0871164209122 -0.315749592603 -8.8172841445 11.4304426705 -0.684671263465 0.264223863375 -16.3356571374 10.4393774263 -0.114496797746 -0.307163164488 0 3 2 15 1 4 2 2 2 4 7 3 7 3 6 3 7 4 6 4 6 4 6 4 5 6 6 2 6 0 130.0 0.769230769231 61.0 0.590163934426 0.155384615385 0.180473372781 0.0392972234866 0.105054619936 0.0197086936732 0.0120631716448 0.00447076340948 -0.00281612978252 0.0615659261537 0.4 0.153846153846 2.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 6.0 0.227272727273 0.0 5.0 1.0 0.469230769231 0.833333333333 0.5 0.666666666667 0.666666666667 0.833333333333 0.916666666667 0.916666666667 0.916666666667 0.583333333333 0.25 0.25 0.333333333333 0.666666666667 0.0 0.0 0.0 1.0 0.75 0.5 0.25 0.0 0.25 0.5 0.5 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.75 0.5 0.5 0.5 0.25 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.5287116199 4.01560164109 -21.2784292094 11.7808585422 5.76898636689 3.27147802914 -4.47327704511 24.4070123282 -0.561084689692 0.988245235433 -0.531832836285 31.0437503766 -0.504159533403 0.333525402539 -4.88120570479 33.3310378908 0.509652384937 0.338833871278 -0.266567047473 37.4948425338 0.582840200664 0.890147700587 7.34082524217 46.8046673721 0.17173384262 0.192973007293 3 2 3 4 2 5 3 4 4 4 3 3 4 3 5 3 3 3 4 3 4 4 3 4 2 6 91.0 0.538461538462 48.0 0.708333333333 0.232339089482 0.256128486898 0.0354180296216 0.196607884327 0.0610081863554 0.00371534676002 0.0160881569215 0.00459062344024 0.168793121162 0.571428571429 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 5.0 0.157894736842 0.0 2.0 1.0 0.527472527473 0.5 0.125 0.0 0.125 0.75 0.625 0.375 0.625 0.875 1.0 0.875 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -3.91766013765 1.27323954474 -7.87412750101 4.22864027088 1.86146810091 1.90435372963 -4.75771446011 12.1790795557 -1.8163534894 1.24424905175 -8.82784386355 19.3358628034 0.963874245855 0.112848254446 -7.055047805 20.2536096564 -0.502357758864 -0.384943034632 -8.28602508086 16.0035911381 -0.0831965768768 -0.504053190291 -9.51942084919 9.31007757922 0.110830143834 -0.155623189472 1 5 16 6 17 5 18 4 18 4 19 3 18 4 18 4 7 7 5 2 6 3 3 3 4 4 5 2 4 3 4 3 6 2 4 3 4 4 11 3 4 4 11 3 4 4 10 4 4 5 6 8 2 6 4 10 3 6 3 3 2 5 2 8 1 3 4 5 1 20 1 8 1 12 1 7 3 6 2 3 12 1 10 0 484.0 1.0 205.0 0.639024390244 0.182193839219 0.248779113449 0.0820041618663 0.113254946838 0.0707563837768 0.0330399453346 0.0153049604377 0.0206980246856 0.0366958026106 0.772727272727 0.863636363636 5.0 2.0 8.0 2.0 0.0 5.0 5.0 7.0 8.0 9.0 0.242424242424 1.0 1.0 2.0 0.423553719008 0.75 0.555555555556 0.666666666667 0.861111111111 0.166666666667 0.111111111111 0.194444444444 0.666666666667 0.0 0.277777777778 0.277777777778 0.805555555556 0.0 0.388888888889 0.694444444444 0.861111111111 0.777777777778 0.444444444444 0.222222222222 0.222222222222 0.222222222222 0.333333333333 0.333333333333 0.444444444444 1.0 1.0 0.888888888889 0.888888888889 0.888888888889 1.0 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.444444444444 0.555555555556 0.777777777778 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.666666666667 0.222222222222 0.0 0.444444444444 0.0 0.0 0.0 0.444444444444 0.444444444444 0.111111111111 0.222222222222 0.777777777778 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.444444444444 0.777777777778 -7.58156274365 -22.0501939338 -25.7406134709 -49.215912376 -10.4535262472 6.42048498451 -56.9621343114 -25.3361741433 4.73234031936 4.70612858699 -36.3847218109 1.57667416614 3.09994608309 -3.23855764125 -11.1319413002 -11.6191706721 -1.57845511273 -0.169832783077 -17.1812361494 -23.3710388717 0.264627004346 -1.03505858039 -20.3514639799 -24.7115436278 -0.189884878124 0.587364468387 6 7 5 8 4 4 3 1 4 4 10 2 10 3 10 3 9 4 7 6 7 6 8 5 9 4 9 4 9 4 9 4 9 4 9 4 9 4 9 4 7 7 6 7 6 0 273.0 0.619047619048 99.0 0.535353535354 0.120597351367 0.172335600907 0.0248359207422 0.140782526968 0.0235216844322 0.00713828766577 0.00890998838035 -0.000699982673403 0.128997470639 0.307692307692 0.047619047619 2.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 4.0 0.233333333333 0.0 2.0 2.0 0.362637362637 0.0833333333333 0.625 0.541666666667 0.666666666667 0.625 0.75 0.75 0.833333333333 0.458333333333 0.0 0.0 0.0833333333333 0.375 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.5 0.5 0.0 0.166666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 -16.248961809 1.81891363534 -28.9195111391 5.53684142042 13.7297045563 1.96492166865 6.98925849378 14.3597181479 -5.68393122899 1.86717707456 -2.19826893908 25.4316956151 1.04240639245 0.853511389951 -5.71309161547 31.5579555305 1.01115119154 -0.360137050759 5.53959435094 28.2695498237 -0.364714115108 -0.555775617545 3.91816690138 21.6093807643 0.0754182086973 -0.0729898871743 3 1 5 1 2 21 1 10 2 4 3 1 3 4 7 4 8 3 7 4 8 3 8 3 7 4 6 6 5 6 4 0 154.0 0.785714285714 75.0 0.573333333333 0.197166469894 0.199443413729 0.0507509862376 0.108591273796 0.0314725332013 0.0129376040631 0.00529130081665 -0.0019571992973 0.0511949473804 0.363636363636 0.142857142857 1.0 2.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 6.0 0.0416666666667 0.0 1.0 1.0 0.487012987013 0.583333333333 0.416666666667 0.166666666667 0.25 0.833333333333 1.0 0.833333333333 0.833333333333 0.75 0.75 0.666666666667 0.75 0.75 0.25 0.0 0.0833333333333 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -8.63983976785 7.23018170046 -16.4187713395 18.6154025179 5.66044067282 1.78388098751 -3.42561774227 25.3651613187 -3.45299560787 -0.326351912448 -10.8389077664 23.6209531961 0.856987407171 0.109875972059 -12.3494075873 22.5517685793 -0.00977237405268 -0.283400574326 -7.94526389417 17.9029596966 0.34971017396 -1.15473020615 -5.74443356951 4.84334801005 0.0786994704447 -0.27134315803 7 5 3 13 2 6 2 5 2 5 4 5 1 5 4 5 2 3 6 4 2 3 5 4 3 3 6 3 3 3 5 4 3 3 6 3 3 3 6 4 2 4 5 11 3 5 1 0 195.0 1.15384615385 109.0 0.559633027523 0.251623931624 0.250493096647 0.114295116236 0.0859218800047 0.0513420657799 0.0315075412515 0.00759323255181 0.0103261914932 -0.0157279861926 0.466666666667 0.846153846154 1.0 2.0 3.0 1.0 1.0 3.0 3.0 3.0 1.0 9.0 0.135135135135 0.0 1.0 2.0 0.558974358974 0.75 0.875 0.75 0.8125 0.5625 0.375 0.25 0.4375 0.625 0.1875 0.125 0.0625 0.9375 0.9375 0.875 0.8125 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -2.29183118052 7.63943726841 -12.6996142687 19.130001323 -9.79885153628 1.09102481878 -40.379129427 23.4802207525 4.60073948995 -0.591889766831 -25.3403306432 18.5911431429 0.790821467812 -0.805807833757 -11.9492058849 10.9373186674 -0.464385072339 -0.680632850654 -13.7710490952 4.18040365937 0.935110830149 -0.128144140035 -2.34846643634 0.72239293666 0.453685614596 -0.141591502612 2 2 6 3 6 3 5 5 1 2 1 17 1 4 5 4 6 3 6 2 7 3 5 4 5 4 6 3 6 4 1 1 3 6 4 5 5 1 5 0 162.0 0.5 76.0 0.631578947368 0.143347050754 0.211934156379 0.0224571024817 0.17239919389 0.0347776140719 0.00509556241791 0.0115551322228 0.00340109500187 0.186279439536 0.555555555556 0.111111111111 1.0 1.0 2.0 1.0 1.0 0.0 0.0 1.0 2.0 8.0 0.1 1.0 4.0 1.0 0.469135802469 0.733333333333 0.933333333333 0.8 0.666666666667 0.8 0.8 0.6 0.866666666667 0.333333333333 0.4 0.0 0.533333333333 0.333333333333 0.333333333333 0.0 0.2 0.333333333333 0.833333333333 1.0 0.833333333333 0.5 0.833333333333 0.666666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.5 0.833333333333 0.833333333333 0.5 0.333333333333 0.5 0.666666666667 1.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -11.2469493118 4.81001605789 -20.5774141031 11.698054965 8.82687723477 0.127061971028 2.87836604017 12.3244660286 -3.33172190871 -0.472292542941 -1.9647253937 9.31827855282 0.434102494077 0.0756393552748 -4.03021601081 7.6094730679 1.01509316703 -0.640807594221 3.48400220742 2.5365257826 -0.839469796154 -0.230992305308 -0.0826601595475 -1.16973067229 0.200040141488 -0.0329602853374 1 4 2 6 7 1 9 1 9 1 9 1 9 1 8 3 7 4 7 6 4 6 6 5 3 1 2 4 3 1 4 2 3 4 3 4 0 150.0 0.666666666667 95.0 0.526315789474 0.281333333333 0.270666666667 0.0576343703704 0.128820444444 0.0474524444444 0.0066523377106 0.00380677946774 0.00284678077009 0.0382400810202 0.7 0.2 2.0 2.0 1.0 1.0 0.0 0.0 0.0 3.0 1.0 6.0 0.346153846154 0.0 4.0 1.0 0.633333333333 0.583333333333 1.0 0.5 0.25 0.833333333333 1.0 0.75 0.0 0.916666666667 1.0 0.916666666667 0.5 0.75 0.916666666667 0.833333333333 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.75 -7.59699595025 10.3556816305 -19.5354246749 24.56759811 -1.62125835363 -0.174292346568 -24.3144400372 27.7681965947 1.53977940624 1.96845558244 -17.246792833 36.2187784107 -0.407374784305 1.45579169606 -17.3052711884 47.1429705013 -0.593740702182 0.138544434133 -25.8034886716 49.2695594946 -1.56892421159 0.0164288660535 -42.6316088794 49.1722402603 -0.309649912307 0.0622169466545 1 0 9 1 29 1 0 40.0 2.5 38.0 0.0526315789474 0.405 0.35625 0.2011875 0.031109375 0.00759375 0.00728410894784 -0.00159867958898 -0.0024769527985 -0.118347129694 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 2.0 5.0 0.95 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.61014106671 4.01070456592 -6.83905688004 7.3274320579 -0.803414152728 -3.2276622459 -9.62220771611 -1.67472309109 0.363891861885 0.952637827371 -7.09260744253 -0.397380138817 0.603660693513 0.265488270431 -1.68818031216 2.37236740839 0.543266358243 -0.453505740909 4.20251360235 -0.446405193293 0.379705608261 0.165204792737 8.47305341737 -0.464448705002 -0.0142576877361 -0.0438592446989 3 2 6 3 5 5 3 8 1 8 1 5 5 3 6 4 6 2 7 2 6 3 6 4 5 3 6 5 1 1 2 8 3 6 144.0 0.5625 72.0 0.652777777778 0.182098765432 0.244791666667 0.0321769975995 0.18716242284 0.0520190329218 0.00682229350836 0.0196623067415 0.00784145006954 0.182621931888 0.777777777778 0.0625 1.0 0.0 4.0 2.0 0.0 0.0 0.0 1.0 0.0 5.0 0.16 1.0 3.0 1.0 0.5 0.5 0.916666666667 0.5 0.583333333333 0.916666666667 0.916666666667 0.75 0.75 0.583333333333 0.583333333333 0.0833333333333 0.0833333333333 0.166666666667 0.333333333333 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 0.75 1.0 1.0 0.75 0.25 0.25 0.25 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 -9.39014164242 1.87007058133 -17.6884879474 4.92785432242 6.56949329552 0.843800962935 -0.981107220807 9.58144557613 -2.80793751664 1.40196402191 -4.58194645615 16.9650469156 1.00509640194 0.414121287316 -3.40788010874 19.5213471797 0.336575054369 -0.89976801352 0.83492866771 10.0218445587 -0.530032119416 -1.27716795527 -1.942861524 -3.64372272503 0.189478584122 -0.102633518484 4 6 7 8 4 5 2 4 3 3 7 2 2 3 7 3 1 3 7 6 8 6 8 6 8 7 7 3 1 3 7 2 2 4 5 2 4 10 5 5 6 0 196.0 1.0 91.0 0.692307692308 0.206268221574 0.213192419825 0.0923451325553 0.0926945564773 0.0485907763772 0.0349014804302 0.00972036732212 0.0120120775387 0.0162801730966 0.571428571429 0.714285714286 0.0 3.0 3.0 1.0 1.0 3.0 3.0 2.0 3.0 11.0 0.184210526316 0.0 2.0 2.0 0.464285714286 0.4375 0.75 0.8125 0.75 0.6875 0.1875 0.0625 0.5 0.625 0.0 0.0 0.25 0.5 0.5 0.5 0.5625 0.0 0.25 0.5 0.5 0.5 0.75 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.9098593171 2.1826963624 -9.02954073163 8.67946469537 -6.84041449289 5.52355814159 -34.1525096973 30.7904395349 -1.41321862302 2.72132509823 -42.3145431225 45.0447179984 2.07900126703 -1.57439328859 -29.8292287836 34.5770438528 -0.292750197017 -1.27582973246 -28.6421793628 22.8895401724 -0.483819014279 0.83284042637 -32.1165529192 28.9787226826 0.160967822 0.174314088849 2 3 5 4 4 4 4 2 6 1 32 1 6 4 3 5 4 3 5 3 5 3 5 3 5 4 4 4 4 4 4 4 4 5 1 8 168.0 0.380952380952 65.0 0.815384615385 0.160714285714 0.222505668934 0.0197096695821 0.302756308377 0.0591593780369 0.00295022413961 0.0302677465705 0.00726709704663 0.430431067264 0.75 204522252.048 1.0 2.0 3.0 0.0 0.0 4294967293.0 0.0 0.0 4.0 0.0 0.05 2.0 6.0 1.0 0.386904761905 0.0 0.0833333333333 0.0833333333333 0.166666666667 0.416666666667 0.25 0.583333333333 0.583333333333 0.75 0.416666666667 1.0 1.0 0.583333333333 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.36539272481 -6.24493681465 -7.12688663114 -10.6321066976 3.82508051114 6.53942759371 -1.39114071108 10.8438116378 -4.19677558406 0.434544600641 -8.83731044145 18.2044825852 3.76968136258 -0.470666304792 -0.908435674298 18.1786134451 -2.94619656798 1.62417684303 -6.9190205186 24.1763069999 2.12285227654 -1.72661331536 -1.04714945359 14.6362008464 -0.249952732794 0.0694524267337 2 4 9 6 9 6 11 4 11 4 11 4 11 3 12 3 12 3 12 3 3 3 6 5 2 4 4 4 4 3 4 3 6 2 4 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 1 6 4 6 1 1 2 1 4 1 1 1 1 1 330.0 0.681818181818 123.0 0.715447154472 0.146060606061 0.196694214876 0.0445084731614 0.141567075716 0.06025144002 0.0170041328148 0.024409928688 0.0193151540908 0.11052343338 0.266666666667 0.772727272727 2.0 2.0 4294967295.0 0.0 0.0 1.0 5.0 5.0 5.0 8.0 0.0869565217391 1.0 1.0 2.0 0.372727272727 0.666666666667 0.5 0.5 0.583333333333 0.75 0.625 0.625 0.541666666667 0.0 0.166666666667 0.0833333333333 0.0 0.0 0.25 0.625 0.541666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.333333333333 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -9.78079468456 -5.49807985227 -21.3942611742 -12.1209794797 3.7327872716 2.33901565877 -6.88312322321 -0.56407219839 2.2493128136 3.49003079671 1.45747987264 15.4378454854 -4.06248037233 -1.25587783976 -13.9372527733 19.3037220973 2.93238232996 3.06468570474 -2.22321051408 32.8161761546 -0.737680269261 -1.82243506031 -3.15961409569 26.4255145034 -0.30079753725 0.179396933756 7 1 9 6 5 3 2 5 2 3 4 5 1 2 6 7 6 7 7 6 8 5 7 6 7 2 1 3 6 3 2 2 1 1 4 3 3 9 5 7 8 2 6 0 195.0 0.866666666667 88.0 0.784090909091 0.214990138067 0.21264957265 0.0856750788112 0.101090847789 0.0517709334277 0.0279298547784 0.0101355804084 0.0101036209668 0.0253390924462 0.615384615385 0.733333333333 0.0 3.0 3.0 2.0 1.0 3.0 3.0 2.0 2.0 7.0 0.342857142857 0.0 2.0 2.0 0.451282051282 0.3125 0.6875 0.75 0.625 0.375 0.0625 0.0 0.3125 0.625 0.25 0.0 0.375 0.5 0.9375 0.625 0.625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -4.24413181578 4.49877972473 -15.6275889761 15.5386905247 -7.69602569262 7.15504035717 -39.4157654475 41.3108504583 2.73597905108 0.684250458612 -26.9739577033 45.447099581 2.88852325993 -2.37322122587 -6.53966698014 28.3430352902 -1.4948630325 -0.752546465652 -11.8717063615 16.2114318941 0.495069477902 -0.938045109818 -8.61137471114 2.62214366374 0.364812260934 -0.545814474539 6 5 6 3 2 3 3 3 5 3 2 4 2 5 1 11 1 5 1 2 6 3 10 3 10 3 10 4 10 4 6 1 3 10 4 8 6 4 4 0 182.0 0.928571428571 84.0 0.761904761905 0.20921386306 0.208398744113 0.0761595456832 0.0972637283016 0.0487500514218 0.0234247302068 0.0143987380621 0.00714102405623 0.023601666222 1.07692307692 0.357142857143 0.0 3.0 6.0 4.0 2.0 2.0 0.0 1.0 3.0 12.0 0.162162162162 0.0 3.0 2.0 0.461538461538 0.25 0.75 0.75 0.375 0.5625 0.6875 0.3125 0.75 0.5 0.5 0.0 0.5 0.75 0.4375 0.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.5 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.75 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.5 0.0 0.25 0.75 0.75 0.25 0.0 0.0 -8.63983976785 2.59195193035 -19.2499204798 8.73559522514 2.40866854108 4.25751072985 -11.2894050618 27.5034598375 0.999668608313 3.57999901764 -4.48980282391 46.3860737134 -1.16994546844 -0.321500071999 -9.74604845832 45.5888836278 0.362130213288 -1.12857349483 -8.97279616624 32.9480751819 -0.0174260079059 -1.10148630804 -9.96294761629 17.7681385224 -0.252170458794 -0.32553670081 4 1 4 1 6 4 2 6 3 13 1 7 3 4 3 4 5 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 4 3 5 3 4 3 5 3 3 4 5 4 1 6 2 13 2 6 1 2 12 0 225.0 1.0 114.0 0.728070175439 0.240296296296 0.235851851852 0.0989194183813 0.0962356323731 0.0564713525377 0.0306087366227 0.00910616313692 0.0115419448043 0.00201497952467 0.466666666667 0.866666666667 3.0 1.0 1.0 0.0 2.0 3.0 3.0 3.0 2.0 11.0 0.179487179487 0.0 1.0 2.0 0.506666666667 0.625 0.625 0.4375 0.4375 0.6875 0.6875 0.5625 0.8125 0.5625 0.0625 0.0 0.125 0.75 0.5625 0.5 0.625 0.25 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.18835690842 4.66854499736 -4.35094786111 14.2525467582 -1.97380423646 4.443323069 -9.35985576594 29.3128710422 1.66849501677 -0.8340463051 -1.64731908386 24.1267659326 0.728636089821 -2.36519485419 4.22218819246 7.39571435705 -0.647186635849 0.10227125563 0.730810122871 4.58278017908 0.108651221365 0.18943841544 -0.707541060509 4.44134539478 -0.0769099837047 -0.333791315666 4 1 3 4 1 5 2 4 3 2 4 2 4 2 3 4 3 3 3 3 3 3 2 4 2 4 2 3 3 3 3 3 3 3 3 3 3 3 2 4 1 6 1 2 2 1 1 1 4 0 138.0 0.260869565217 73.0 0.657534246575 0.282608695652 0.257403906742 0.0241134946075 0.38837025774 0.0560098810078 0.00167701561032 0.0065051432257 2.18568251743e-05 0.640495714883 0.833333333333 0.0434782608696 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 6.0 0.206896551724 0.0 4.0 1.0 0.528985507246 0.0833333333333 0.0 0.0 0.25 0.333333333333 0.0833333333333 0.416666666667 0.666666666667 0.666666666667 0.583333333333 0.916666666667 1.0 0.916666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.21788130366 2.60183733055 -2.53501273014 8.50117593355 0.539559718308 3.63533069323 -1.01681053541 23.1175905494 0.0361920220329 1.47424241586 0.429913582996 29.0391241797 0.220944918718 -2.11120305043 0.85184214077 15.0794086684 -0.271025796026 -1.06103188024 0.381983241966 3.24118216942 0.299631236225 0.262688823692 0.978706258564 4.12134903541 -0.0949894297583 -0.02430161266 6 1 12 5 7 5 1 3 4 4 4 3 2 4 4 4 2 4 5 9 5 9 6 8 6 3 1 4 6 2 2 4 5 2 3 4 5 2 4 4 4 1 6 3 8 0 196.0 1.0 88.0 0.761363636364 0.193148688047 0.206632653061 0.0845178242059 0.0795176488963 0.0431795531624 0.0331288205847 0.00527882082356 0.00998178699057 0.0123492953996 0.214285714286 0.785714285714 0.0 1.0 1.0 1.0 1.0 3.0 3.0 3.0 1.0 7.0 0.241379310345 1.0 1.0 2.0 0.448979591837 0.1875 0.75 0.9375 0.6875 0.625 0.5625 0.5 0.5625 0.5 0.0625 0.0 0.0 0.4375 0.8125 0.5625 0.4375 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -6.63903476898 7.63943726841 -19.5514343444 19.7758686416 -5.3667232414 2.08247050903 -38.9122520507 27.7196088179 -0.189523831204 -0.369767490799 -41.0537132264 24.3541138106 0.748465455777 -0.958993453816 -35.7055911887 16.2124265016 -0.518523625305 -0.371190023441 -37.2182339211 12.4117902507 0.0968579471678 0.400341630714 -36.948770381 14.8715316485 0.0171195293627 -0.0554916597819 1 1 3 4 4 1 6 3 3 2 5 4 3 1 4 5 3 1 4 5 3 2 2 6 3 1 3 6 3 2 3 5 3 2 3 5 3 1 3 6 3 1 4 5 2 1 5 4 4 1 4 4 2 2 0 169.0 1.0 88.0 0.613636363636 0.243513882567 0.232134729176 0.109077446404 0.0957580877967 0.0512062938476 0.0384999662539 0.007492575199 0.0106465756684 0.00113080133047 0.384615384615 1.0 3.0 2.0 4294967294.0 1.0 3.0 3.0 3.0 3.0 3.0 4.0 0.206896551724 0.0 0.0 2.0 0.520710059172 0.8125 0.6875 0.625 0.8125 0.5625 0.375 0.375 0.4375 0.1875 0.0 0.0 0.125 0.75 0.75 0.75 0.6875 0.75 0.75 0.5 0.5 0.25 0.25 0.25 0.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.5 1.0 0.75 0.5 0.25 0.0 0.25 0.5 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.979415034412 1.37118104818 -4.02976930076 4.42029462806 -2.54763816052 1.80583269067 -13.221053775 11.8073298464 -0.387136587987 1.03230708123 -16.011031127 18.0039591688 0.43423790595 0.242128119498 -13.6250012336 20.1742489552 -0.269075045902 0.0520041625399 -13.8228510123 20.3653767601 0.354008757975 -0.0303911262232 -9.9591308574 19.465878247 0.14833175276 -0.0684605638852 5 5 5 9 2 3 3 4 2 2 5 3 1 4 4 3 1 3 8 3 9 4 8 4 9 3 9 3 7 1 1 5 3 3 2 9 6 5 2 0 168.0 0.857142857143 76.0 0.723684210526 0.197420634921 0.207057823129 0.0725311453947 0.112290240997 0.0435187715959 0.0250641873674 0.0150080816248 0.00741579263636 0.044854756921 0.833333333333 0.357142857143 0.0 4.0 3.0 3.0 1.0 2.0 0.0 2.0 0.0 6.0 0.444444444444 0.0 2.0 1.0 0.452380952381 0.166666666667 0.666666666667 0.916666666667 0.583333333333 0.583333333333 0.666666666667 0.583333333333 0.833333333333 0.5 0.0833333333333 0.0 0.416666666667 0.583333333333 0.0 0.0 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.5 1.0 0.75 0.75 0.75 0.25 0.25 0.5 0.75 0.75 0.25 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -9.36740522198 1.3641852265 -21.9186280805 6.81976530755 1.05329947761 5.73236200279 -18.5334010572 29.9563098345 1.15557075656 3.20512506506 -10.7278633651 47.5669404139 -0.278758904078 -1.0747717114 -8.22063794737 40.6124179051 1.43219188612 -1.43235742401 4.19233689511 26.3599613618 1.05421848398 -0.153006096379 15.9102818803 22.5391876271 -0.0565194826915 0.104211652469 8 1 12 5 8 8 5 4 1 1 2 4 3 4 5 4 1 4 6 4 1 4 6 4 1 3 7 8 7 9 6 3 1 4 7 3 2 4 6 2 4 5 3 2 5 9 8 5 11 1 9 0 240.0 0.9375 105.0 0.761904761905 0.200555555556 0.201822916667 0.082638599537 0.0849721498843 0.046380931713 0.0296357192321 0.00710792376874 0.00905785123808 0.0155422844486 0.533333333333 0.6875 0.0 3.0 3.0 0.0 2.0 4.0 4.0 1.0 3.0 8.0 0.25641025641 0.0 2.0 2.0 0.4375 0.125 0.625 0.875 0.8125 0.4375 0.625 0.375 0.5625 0.625 0.0625 0.0 0.0625 0.5 0.5625 0.5 0.5 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -7.00281749604 8.35563451232 -20.6846877916 24.4418524047 -5.07057701507 6.31242076048 -34.0163348453 45.5055040811 4.40149289823 -1.72603798062 -13.1911498932 35.3290902952 1.56376304506 -3.17472146881 0.987927401972 13.12543446 -1.24280077972 0.777082710737 -2.87180481861 13.6469531057 1.46151952397 -0.0433236959456 6.6777308779 10.1598749504 -0.0240155092523 -0.674261013326 0 2 1 1 3 2 1 8 1 11 2 6 2 3 2 5 3 3 2 4 5 3 1 4 5 3 1 3 6 6 7 5 9 4 9 4 9 4 10 2 11 2 11 2 11 1 11 2 11 2 11 2 8 4 9 4 9 3 10 0 286.0 0.590909090909 105.0 0.619047619048 0.134749865519 0.122536554355 0.0300671686375 0.0943632324935 0.0176952674691 0.00856722529239 0.00279932669651 -7.43635488154e-05 0.0742421802049 0.384615384615 0.409090909091 3.0 2.0 0.0 0.0 7.0 2.0 0.0 0.0 3.0 11.0 0.358974358974 0.0 5.0 2.0 0.367132867133 0.791666666667 0.416666666667 0.0833333333333 0.458333333333 0.541666666667 0.916666666667 0.625 0.375 0.916666666667 0.5 0.0833333333333 0.0 0.583333333333 0.0416666666667 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.833333333333 1.0 1.0 1.0 0.666666666667 0.333333333333 0.0 0.166666666667 0.666666666667 0.5 0.833333333333 1.0 1.0 0.833333333333 0.5 0.666666666667 0.166666666667 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 0.333333333333 0.5 0.5 0.833333333333 1.0 0.833333333333 0.5 0.166666666667 0.833333333333 1.0 1.0 0.833333333333 0.5 0.333333333333 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -10.648912556 16.7836121806 -19.7527224714 37.8136341468 7.23288068951 -3.2584314044 -5.29244211876 32.3608567948 -5.6226280748 2.17145584523 -15.3382513715 35.9682384257 3.86538560335 0.491884317613 -6.14316257709 42.3155283851 -1.48583388712 0.0802748759288 -3.32429168639 41.7393884313 1.26483743601 0.0264065907527 0.613286698777 41.9128396987 -0.0799718092584 -0.069017087107 4 1 8 6 4 8 2 9 2 9 2 6 6 5 7 6 7 5 7 5 1 1 5 4 1 3 4 7 3 4 1 9 4 6 3 0 165.0 0.733333333333 94.0 0.595744680851 0.233608815427 0.276363636364 0.0543048111974 0.140624759997 0.0533086234243 0.00925531301511 0.00718225515537 0.00649258150567 0.0657027023613 0.909090909091 0.2 2.0 2.0 3.0 1.0 0.0 0.0 0.0 2.0 1.0 6.0 0.222222222222 0.0 4.0 1.0 0.569696969697 0.5 0.916666666667 0.25 0.583333333333 0.833333333333 1.0 0.583333333333 0.166666666667 0.833333333333 0.833333333333 0.833333333333 0.333333333333 0.666666666667 0.5 0.666666666667 0.916666666667 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.5 1.0 1.0 1.0 0.5 0.0 0.5 1.0 0.25 0.75 1.0 1.0 0.5 0.0 0.25 0.75 -9.67662053999 3.39530545263 -24.5440782985 8.94570000707 -1.69765272631 1.14987677996 -30.0262946087 13.4662030157 1.71641493274 0.285373327426 -19.4185079625 16.0241604705 1.06428221935 0.523868375747 -9.3012982031 16.2240022039 0.265347925634 -1.42841356668 -5.13197613257 4.98844672635 0.240413682981 -0.673185121548 -1.42210410294 -4.52901650346 0.178794047069 -0.0585080511731 7 2 8 6 4 2 3 4 2 2 5 3 2 3 1 1 1 4 1 23 1 3 8 4 9 3 9 4 6 1 1 4 5 2 2 10 4 6 7 3 4 0 180.0 0.8 90.0 0.7 0.239351851852 0.232592592593 0.0759895404664 0.112128943759 0.0496371742112 0.0199110480214 0.00910577820482 0.0048146424269 0.0277918358962 1.16666666667 0.4 1.0 4.0 6.0 3.0 1.0 3.0 0.0 1.0 4.0 13.0 0.184210526316 0.0 4.0 2.0 0.5 0.0833333333333 0.583333333333 0.833333333333 0.583333333333 0.333333333333 0.916666666667 0.75 0.916666666667 0.25 0.666666666667 0.25 0.416666666667 0.5 0.666666666667 0.25 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.75 0.75 1.0 1.0 0.75 0.5 0.25 0.5 0.25 0.25 0.75 1.0 0.5 0.0 0.5 0.5 0.0 0.25 0.75 1.0 0.5 0.0 0.75 0.5 0.0 0.25 0.75 1.0 0.5 0.0 1.0 0.75 0.25 0.25 0.75 1.0 0.5 0.0 -6.2388737692 5.85690190578 -12.6349791928 15.1328329106 3.67768168944 2.52044841433 0.291792885173 30.8449703327 1.49135648205 4.94263417383 11.762755736 49.2795410839 0.27541221848 -3.27378533735 16.8031456754 32.0218217362 1.13054370243 -1.46975648019 23.8421883698 16.5518109523 -0.506931955562 1.36310362702 21.7335575285 25.1457020845 0.0670276956489 -0.038242280679 2 1 3 3 1 4 1 4 4 1 27 3 2 3 2 3 3 2 2 3 2 3 2 3 2 3 3 2 2 3 1 5 1 3 1 0 110.0 0.227272727273 49.0 0.897959183673 0.176363636364 0.245454545455 0.0125176558978 0.516396694215 0.056958677686 0.00126772948527 0.0284712382085 0.00407941583488 1.08602463492 1.2 195225785.955 1.0 3.0 1.0 1.0 0.0 4294967291.0 0.0 0.0 0.0 6.0 0.1 2.0 2.0 1.0 0.445454545455 0.416666666667 0.0833333333333 0.416666666667 0.5 0.583333333333 0.166666666667 0.916666666667 0.916666666667 0.666666666667 0.166666666667 1.0 1.0 0.333333333333 0.0833333333333 0.5 0.583333333333 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -2.83585171327 -2.43073003995 -5.02919728663 -0.907687429943 1.99081190649 6.85597882578 -2.15464586365 19.1695160249 -1.96455422156 -1.7842428212 -3.50441529977 18.263928974 2.56225408782 0.606769410719 2.71459279841 16.2800287352 -2.08780269373 -0.592317473666 -1.07740347704 11.2113613204 1.60991503069 -1.04966436865 0.308624418938 0.578874998928 -0.480677741193 -0.000203667747521 3 1 3 3 2 5 2 3 28 1 3 5 1 4 3 4 2 3 4 2 4 2 4 2 4 2 4 2 3 3 2 5 1 12 132.0 0.272727272727 59.0 0.813559322034 0.164141414141 0.254820936639 0.014346286557 0.446482733673 0.0545920638896 0.00187506491329 0.0256941461104 0.0055713514736 0.870972922789 1.5 195225786.0 2.0 2.0 1.0 3.0 4294967295.0 4294967293.0 0.0 0.0 4.0 0.0 0.166666666667 0.0 3.0 1.0 0.44696969697 0.333333333333 0.333333333333 0.333333333333 0.416666666667 0.5 0.416666666667 0.75 0.75 0.583333333333 0.416666666667 1.0 1.0 0.416666666667 0.25 0.583333333333 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.39846388181 -4.22484030753 -7.59721330349 -7.60898546768 3.35289602126 4.30782567981 -2.69470678213 9.90735778035 -3.53725964634 3.02198426465 -7.27519329476 25.750520832 3.8981649248 -1.40919827291 2.38387619745 21.4568984512 -2.9589487333 0.381202996514 -3.7057148246 18.0382915757 2.05342777546 -0.928930112129 0.42329923607 11.423877987 -0.349170904027 -0.0501888791959 7 5 5 7 5 3 1 3 4 2 9 3 9 3 8 4 9 3 8 4 7 8 3 9 4 5 8 4 9 3 8 5 8 3 8 4 8 4 9 4 7 5 6 7 4 8 7 4 5 0 276.0 0.521739130435 110.0 0.654545454545 0.153079710145 0.195809703844 0.0266181348913 0.17796939163 0.0344815039314 0.005964286444 0.0125639748655 0.000366365942542 0.178197058555 1.0 0.0434782608696 6.0 0.0 6.0 0.0 1.0 0.0 0.0 0.0 1.0 8.0 0.25 1.0 2.0 2.0 0.398550724638 0.0 0.388888888889 0.388888888889 0.277777777778 0.277777777778 0.888888888889 0.888888888889 0.888888888889 0.555555555556 0.777777777778 0.777777777778 0.833333333333 0.388888888889 0.333333333333 0.222222222222 0.222222222222 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.833333333333 0.833333333333 0.333333333333 0.333333333333 0.0 0.166666666667 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.166666666667 0.166666666667 0.833333333333 0.166666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -12.6493580857 -0.276791205377 -20.5163181075 -0.25599582529 12.848291954 1.555367745 10.1037278667 11.2883235005 -7.52848270948 5.16599641486 -4.05859920946 34.0415395304 3.77451378241 -1.13737428498 2.05807553609 35.0128485692 -0.792153246704 0.231206310896 6.75917014892 27.6333334789 -0.295423230835 -1.95342202495 -1.44642398583 10.9320722122 -0.037617591575 -0.168276038645 7 3 6 2 5 4 1 6 3 6 3 4 2 6 1 8 4 3 4 5 3 5 3 2 5 4 5 4 3 2 6 3 6 3 3 2 6 2 7 3 2 3 6 3 6 2 4 2 6 3 6 3 2 3 6 3 6 3 3 2 6 3 5 4 2 3 5 3 6 4 1 5 3 6 3 6 3 1 9 1 3 1 2 1 2 0 322.0 1.64285714286 142.0 0.859154929577 0.217661355658 0.192990239574 0.161606299696 0.0514387840167 0.0555495184724 0.0718348280779 0.0108118923266 0.0193475950565 -0.0198762311625 0.565217391304 2.0 5.0 2.0 3.0 3.0 5.0 6.0 6.0 6.0 1.0 12.0 0.210526315789 2.0 5.0 3.0 0.44099378882 0.5 0.375 0.416666666667 0.541666666667 0.666666666667 0.25 0.166666666667 0.291666666667 0.5 0.5 0.458333333333 0.5 0.708333333333 0.458333333333 0.333333333333 0.5 0.5 1.0 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 0.333333333333 0.666666666667 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.5 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 0.166666666667 0.5 0.666666666667 0.5 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.666666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.110716482151 9.79840867035 -3.62967449385 20.283959697 -6.8441203834 -5.23810351046 -38.0668410798 1.45899608126 -8.13518294708 -2.12668237517 -65.4933607176 -10.3406124823 9.35933436341 3.02399742237 -18.874024967 7.18171231955 0.521169182895 0.70505595686 6.14314029701 17.9020724545 -0.490867393662 -0.279233788528 -7.59129765533 14.1091361234 -0.491237561938 -0.152300534762 5 1 12 6 11 6 12 5 13 3 15 2 15 2 15 3 14 3 13 4 3 1 9 6 2 3 6 5 4 3 5 5 5 2 4 5 6 2 4 4 7 2 5 3 7 2 4 5 6 2 5 4 6 2 5 5 5 3 4 5 5 3 2 7 3 5 2 7 3 7 1 1 9 1 4 0 391.0 0.739130434783 135.0 0.859259259259 0.136753422597 0.195485377516 0.0423319402713 0.133670922126 0.0582216705299 0.0161180779582 0.0228004467749 0.0174183938885 0.099202994453 0.529411764706 0.652173913043 5.0 3.0 0.0 1.0 0.0 1.0 5.0 5.0 2.0 5.0 0.232558139535 1.0 0.0 2.0 0.345268542199 0.466666666667 0.266666666667 0.466666666667 0.5 0.466666666667 0.6 0.666666666667 0.666666666667 0.0 0.133333333333 0.133333333333 0.0666666666667 0.0 0.0666666666667 0.433333333333 0.533333333333 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.222222222222 0.222222222222 0.666666666667 0.888888888889 0.444444444444 0.333333333333 0.555555555556 0.666666666667 0.888888888889 0.888888888889 0.777777777778 0.888888888889 0.666666666667 0.888888888889 1.0 1.0 0.888888888889 0.777777777778 0.222222222222 0.222222222222 0.0 0.222222222222 0.555555555556 0.777777777778 0.333333333333 0.111111111111 0.0 0.0 0.0 0.0 0.222222222222 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.777777777778 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.333333333333 0.333333333333 -12.5663207241 -11.4037976615 -24.9297813703 -26.0212733721 7.21164050184 3.22270773565 -6.50245723735 -9.19227020856 -3.20375753642 6.14753879397 -15.3088991523 18.4934839083 -2.00934133903 -3.51484654696 -31.5174559166 7.05744987401 1.2853025701 0.508393349165 -20.2977480512 0.163334735403 0.991765310469 -0.844694847731 -15.6595165728 -3.95998317591 -0.700847990774 0.0634300373305 8 2 4 1 6 2 2 1 7 2 2 1 6 3 1 2 4 1 30 1 10 3 10 2 7 1 2 4 3 4 2 9 4 4 9 3 5 0 168.0 0.857142857143 46.0 1.5652173913 0.121527777778 0.151785714286 0.0528524777967 0.099077912415 0.0455419146825 0.0237045834149 0.0207005653948 0.0135744320555 0.0620184937996 0.666666666667 0.285714285714 3.0 0.0 3.0 2.0 2.0 1.0 1.0 1.0 1.0 3.0 0.260869565217 2.0 1.0 0.0 0.27380952381 0.25 0.25 0.5 0.416666666667 0.0833333333333 0.0 0.166666666667 0.75 0.0 0.0833333333333 0.0 0.583333333333 0.166666666667 0.166666666667 0.0 0.416666666667 0.0 0.25 0.5 0.75 0.5 0.0 0.25 0.75 0.25 0.5 0.5 0.5 0.25 0.0 0.25 0.75 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.25 0.0 0.25 0.25 0.0 0.0 0.0 0.0 -3.59235442979 -4.86559397452 -8.9004437666 -8.4236445371 -0.119250205174 5.07207779282 -7.68661555152 9.56674837942 2.05344629884 1.43690199975 3.77696824164 19.3526631664 0.694180172051 -1.23609146421 9.85910030655 13.6866159377 -0.460262795462 0.621863108222 7.36723977967 15.5226178402 0.124695707317 -0.0412006221996 7.92773221205 15.7269828947 0.0982696325678 -0.0721187072744 4 6 4 10 1 4 3 4 1 4 3 8 8 4 8 3 9 3 9 4 8 5 8 4 5 2 1 11 2 9 3 8 2 0 168.0 0.857142857143 89.0 0.505617977528 0.212797619048 0.252976190476 0.0701359784985 0.129879121788 0.0450901714853 0.0212863815904 0.0134649274012 0.00558709261046 0.0507887399836 0.75 0.214285714286 0.0 3.0 3.0 3.0 1.0 1.0 0.0 1.0 2.0 8.0 0.0333333333333 0.0 2.0 1.0 0.529761904762 0.416666666667 0.916666666667 1.0 0.666666666667 0.833333333333 0.666666666667 0.583333333333 1.0 0.666666666667 0.0833333333333 0.0833333333333 0.666666666667 0.666666666667 0.0833333333333 0.0 0.5 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.25 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 -11.5955744253 -1.59154943092 -28.0874120547 1.03703880323 -0.232468298802 7.61670084797 -29.9242636791 29.5199215003 0.706722946266 2.73097458279 -24.3239718637 46.5523568651 -0.143509534244 -1.20959968569 -21.9113858835 41.0746867547 0.889918631652 0.286628379999 -14.0690178013 39.1330664697 0.579734242785 -0.316226856391 -6.29477731751 35.5596272464 0.0738062225078 -0.10126570691 3 5 5 8 3 9 3 5 1 4 3 1 5 3 9 3 8 4 6 6 4 3 2 3 2 5 2 3 2 4 3 4 1 5 1 6 1 10 9 2 2 0 168.0 0.857142857143 93.0 0.623655913978 0.245535714286 0.262329931973 0.0708800261176 0.119649732413 0.0568683946793 0.0129256872937 0.00862380706378 0.00801766010061 0.0214826492934 0.833333333333 0.428571428571 3.0 5.0 2.0 0.0 0.0 2.0 2.0 2.0 3.0 11.0 0.171428571429 0.0 3.0 2.0 0.553571428571 0.666666666667 0.333333333333 0.333333333333 0.916666666667 0.916666666667 0.25 0.583333333333 0.916666666667 0.916666666667 0.25 0.5 0.5 0.916666666667 0.833333333333 0.833333333333 0.833333333333 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.75 0.5 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -4.36539272481 0.545674090601 -13.533215478 3.60738683699 -4.04244275282 3.76960570752 -25.0750740097 18.666204373 1.92224550533 1.67304448895 -20.6908299756 25.931993238 -1.23411942774 -1.89927910979 -22.1966001726 16.614963285 0.677195109942 0.226116347939 -19.8702899619 11.513254299 0.119435033777 -0.916693606412 -16.5397853967 4.72467008845 -0.0806553848053 -0.0846680336075 3 1 2 4 1 4 1 3 27 3 1 4 2 3 2 3 3 2 2 4 1 3 2 3 3 2 3 2 2 9 3 2 110.0 0.227272727273 52.0 0.826923076923 0.212727272727 0.256198347107 0.0162441773103 0.504748309542 0.0614500375657 0.00169769611318 0.0286683231782 0.00395571381606 1.03034183881 1.6 195225785.955 1.0 3.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 3.0 8.0 0.136363636364 1.0 6.0 1.0 0.472727272727 0.25 0.25 0.5 0.416666666667 0.5 0.333333333333 0.916666666667 0.833333333333 0.583333333333 0.333333333333 1.0 1.0 0.5 0.166666666667 0.583333333333 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -2.25710646567 -1.93879657948 -3.16107037272 0.0541864251336 2.53583687314 6.86524592427 0.634642538672 22.3367477226 -2.70944710636 -0.231559122059 -3.15656991088 26.5087514086 2.8865925659 -0.557352964724 2.74541058251 19.7047832757 -2.57634506168 -0.681455464279 -3.49080938627 10.8069169813 1.76976335858 -1.13234719262 -0.941076586426 0.84957404308 -0.381596426309 0.105121576164 8 1 7 1 10 6 3 6 4 17 4 3 2 5 4 3 3 3 4 4 5 1 4 2 5 4 10 2 6 3 10 2 6 2 10 3 5 3 9 4 5 4 7 5 2 10 4 5 4 8 6 3 5 3 10 3 5 3 10 3 5 3 10 3 5 3 10 3 5 3 10 3 5 3 10 4 3 4 9 5 3 5 7 6 2 6 7 7 1 7 8 3 6 2 8 0 483.0 0.913043478261 192.0 0.734375 0.160997732426 0.190116122063 0.0567275129213 0.0984740783091 0.0362615835784 0.0183221882331 0.0087550666876 0.00391232697294 0.044722199497 0.761904761905 1.04347826087 2.0 7.0 5.0 2.0 6.0 5.0 5.0 5.0 3.0 18.0 0.0882352941176 2.0 2.0 2.0 0.39751552795 0.25 0.5 0.611111111111 0.666666666667 0.527777777778 0.194444444444 0.277777777778 0.361111111111 0.583333333333 0.611111111111 0.666666666667 0.555555555556 0.472222222222 0.0555555555556 0.111111111111 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 0.777777777778 0.333333333333 0.333333333333 0.111111111111 0.444444444444 0.666666666667 0.777777777778 1.0 1.0 1.0 1.0 0.444444444444 0.888888888889 0.444444444444 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.777777777778 0.444444444444 0.0 0.0 0.222222222222 0.222222222222 0.0 0.0 0.777777777778 0.666666666667 0.222222222222 0.111111111111 0.555555555556 0.666666666667 0.333333333333 0.333333333333 0.555555555556 1.0 0.888888888889 0.777777777778 1.0 1.0 1.0 1.0 0.333333333333 0.777777777778 0.666666666667 0.444444444444 0.666666666667 0.777777777778 0.333333333333 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -24.5237007964 5.48046586647 -61.7905013439 15.6524907488 -3.01404170029 4.67834692915 -66.8009237457 38.9607242727 7.92557825422 5.4050547756 -26.4223611293 62.5188557113 -0.263510201209 -2.10767847052 -19.6484856055 55.4854727143 -2.22376125418 -0.263519398847 -36.6409826665 43.4045391433 0.446821625498 -1.53685249723 -37.0695311803 29.2557151595 0.00442200403733 -0.0789012507583 1 3 2 4 1 3 3 1 23 3 1 10 1 4 2 3 2 3 1 4 1 4 1 4 1 4 1 14 105.0 0.238095238095 64.0 0.453125 0.281904761905 0.347392290249 0.0204435806068 0.537129035741 0.0645174387215 0.00147717352569 0.00160309409561 0.00182048224607 1.21862774355 1.2 204522252.0 1.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 3.0 1.0 0.15 0.0 2.0 1.0 0.609523809524 0.25 0.416666666667 0.416666666667 0.666666666667 0.583333333333 0.5 0.833333333333 1.0 0.583333333333 0.5 1.0 1.0 0.333333333333 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -2.48584863496 -5.75989317856 -4.22538354827 -9.24403059236 2.05318641195 6.99106261201 -0.736616138045 14.7746227468 -1.97416177972 1.26234494905 -3.7378351236 25.7472024337 2.02517679469 -0.959212717897 2.23465436382 21.7314205726 -1.17854715926 0.711918069496 -0.52200135176 20.1680684053 0.420259155271 -1.93631713413 -0.51194533626 3.75249319803 0.00632890205046 -0.199102732306 6 5 5 9 3 3 3 5 1 3 2 7 1 18 1 1 1 3 1 4 9 4 9 4 9 4 10 4 6 2 2 11 3 9 5 7 2 0 182.0 0.928571428571 103.0 0.514563106796 0.256551141167 0.256279434851 0.0870231537572 0.107477762547 0.0462545997656 0.0207707224059 0.0092559349476 0.00347811185682 0.00615241444318 1.0 0.357142857143 0.0 4.0 5.0 3.0 1.0 3.0 0.0 1.0 3.0 12.0 0.131578947368 0.0 3.0 2.0 0.565934065934 0.375 0.875 1.0 0.625 0.5625 0.625 0.25 0.6875 0.875 0.625 0.0 0.5 0.8125 0.6875 0.0 0.5625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.75 1.0 0.75 0.5 0.5 0.5 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.25 0.75 0.75 0.25 0.0 0.0 1.0 0.5 0.5 1.0 0.75 0.25 0.0 0.0 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.0 -7.09376317781 3.45593590714 -16.8112939371 9.90705690378 0.503913318361 3.0132717214 -15.110099168 25.4716518735 0.950639946573 4.4716317506 -9.3957765327 49.0013982429 -0.490443372482 0.674387940164 -9.98393778436 54.0669482284 0.501220402793 -1.94805138415 -6.27586151179 36.3080384054 0.258403159083 -1.37015044235 -5.35686133008 16.4741780769 -0.32785295628 -0.383822609756 5 4 8 7 6 5 1 3 3 5 4 4 1 4 6 3 1 4 6 8 7 7 7 7 7 7 7 2 2 4 6 2 2 5 3 3 3 6 2 2 7 6 4 0 196.0 1.0 98.0 0.632653061224 0.207725947522 0.23360058309 0.0872643413884 0.0936762902787 0.0468259929961 0.0310022565021 0.00743170496661 0.00998366608219 0.0153645463039 0.5 0.785714285714 0.0 2.0 3.0 1.0 1.0 3.0 3.0 3.0 4.0 12.0 0.0540540540541 0.0 2.0 2.0 0.5 0.4375 1.0 1.0 0.8125 0.75 0.3125 0.25 0.625 0.6875 0.0625 0.0 0.1875 0.4375 0.75 0.5 0.5625 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.86559397452 2.68289761212 -16.3258378775 8.78382909802 -7.01070564191 3.68098006865 -41.6421868801 23.123320854 -0.692613297595 1.22987841637 -46.2471448735 29.038706933 1.77719107955 -1.43039133708 -35.020064493 18.9154538332 -0.543132541371 -0.896790193718 -35.1322431626 10.0895989408 -0.0118781548726 0.437066592233 -35.2794008487 12.5815015987 0.0957498923544 0.0441317631855 3 2 6 3 6 3 4 18 1 5 4 3 6 3 6 3 6 3 6 3 6 3 6 3 6 5 5 7 3 5 1 0 144.0 0.5625 69.0 0.608695652174 0.176697530864 0.227430555556 0.0324472602666 0.172898448217 0.0462333354767 0.00749067738611 0.0168749570834 0.00575203864802 0.162620026194 0.555555555556 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 7.0 0.148148148148 0.0 3.0 1.0 0.479166666667 0.416666666667 0.833333333333 0.666666666667 0.666666666667 0.916666666667 0.916666666667 0.666666666667 0.666666666667 0.5 0.666666666667 0.0 0.0 0.25 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -8.75352187005 3.02394391875 -15.772998436 6.95554264977 7.11658841239 -0.282873043386 2.50016140899 7.86012331812 -3.29334843622 1.29204108235 -4.24949758498 13.8548325515 0.466603756535 0.479979486741 -4.8355305865 15.7970976142 1.41933838016 -1.37960695958 5.65182628048 4.26653075164 -0.897220951918 -0.796257600726 0.823025714165 -6.42327704226 0.0249616491622 -0.0635940731308 1 5 2 9 6 3 4 3 2 3 3 4 7 5 19 9 2 10 2 10 2 10 3 7 2 1 4 4 3 1 10 3 9 4 1 2 1 2 1 2 0 180.0 0.8 83.0 0.795180722892 0.196759259259 0.221851851852 0.0685656721536 0.120483367627 0.0506387174211 0.0221855414235 0.0140830753212 0.010667776288 0.056269158891 1.25 0.466666666667 1.0 6.0 5.0 3.0 1.0 2.0 0.0 1.0 2.0 20.0 0.0952380952381 0.0 3.0 1.0 0.461111111111 0.333333333333 0.916666666667 0.75 0.75 0.5 0.583333333333 0.0833333333333 0.583333333333 0.5 0.25 0.0 0.333333333333 0.5 0.416666666667 0.0 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.0 0.5 1.0 0.75 0.75 0.75 0.25 0.0 0.25 0.75 0.75 0.25 0.5 0.5 0.0 0.0 0.75 0.75 0.25 0.0 0.5 0.5 0.0 0.0 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.5 0.75 0.5 0.5 0.75 0.5 0.0 0.0 -8.53070494973 3.31042281631 -22.7509987425 11.2240217515 -3.15933172367 5.4969995278 -33.1773734408 34.9512767922 1.62523211853 4.02670651476 -23.1544242085 55.1257720374 1.82995892127 -1.27271663975 -9.08679147974 50.1810240606 -0.320570043161 0.0549668965239 -10.0137511656 51.5272975476 -0.837744919064 2.16435105098 -19.4463908464 69.0599602288 -0.169373241427 -0.0988911981706 5 1 1 2 9 7 6 9 4 2 5 4 3 1 7 4 10 4 1 2 8 3 1 2 8 6 8 7 7 3 1 3 6 3 2 3 5 3 4 3 3 4 6 5 5 0 196.0 1.0 81.0 0.851851851852 0.212827988338 0.194606413994 0.100112410645 0.0879092682471 0.054245573698 0.0358955086716 0.0115214174039 0.0142456813092 0.0120014771077 0.642857142857 0.714285714286 1.0 3.0 3.0 1.0 1.0 2.0 3.0 3.0 2.0 7.0 0.258064516129 1.0 2.0 1.0 0.413265306122 0.1875 0.3125 0.6875 0.75 0.5625 0.0625 0.0625 0.3125 0.6875 0.0625 0.0 0.1875 0.5625 0.75 0.5 0.6875 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.0 0.0 0.25 0.5 0.25 0.5 1.0 1.0 0.0 0.25 0.75 0.75 0.25 0.25 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.77344079445 4.04708283862 -0.748424614684 12.361369705 -7.75219135346 4.12921235736 -28.7892306569 28.5437495339 -1.69829981311 1.42981876673 -38.4358745012 36.3424483044 3.10694971025 -0.755316346312 -19.1638286446 30.8574251067 0.2754761752 -0.663890146348 -11.2816381421 23.2832052477 -0.0717329754928 -0.218847748729 -9.67677006297 19.5823531362 0.251140410961 -0.0173924142745 3 6 6 9 3 2 4 5 1 3 5 4 1 3 6 3 1 2 7 3 1 2 7 3 1 2 7 7 6 3 1 3 6 3 1 3 5 4 2 3 4 3 5 3 1 3 3 0 169.0 1.0 82.0 0.69512195122 0.223031406463 0.216203914429 0.0980809474748 0.0917314109591 0.0502706860785 0.0299131190302 0.00987059165344 0.0122291584391 0.00886178900998 0.461538461538 0.846153846154 1.0 3.0 2.0 0.0 1.0 3.0 3.0 3.0 3.0 10.0 0.0857142857143 1.0 2.0 2.0 0.485207100592 0.5 0.625 0.625 0.625 0.5 0.0 0.0 0.25 0.75 0.3125 0.25 0.5 0.5 0.75 0.8125 0.5625 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.25 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 2.44853758603 1.86088856538 -0.717797903512 5.99428255697 -9.84167225703 2.40507242178 -34.1588868669 15.5704475723 -0.732659782035 1.12431606126 -43.4598844395 22.4126501314 1.69161023841 0.094132996702 -30.5759847479 22.5465887141 0.386045825954 -0.667353671858 -23.0716349607 14.3514057155 0.426452490614 -1.34255013278 -19.4778302008 -0.848326287747 -0.0661394529382 -0.225797001658 0 5 3 12 1 9 2 4 7 3 7 3 7 2 8 3 7 2 8 3 7 3 6 5 4 6 4 6 3 0 140.0 0.714285714286 66.0 0.545454545455 0.190714285714 0.192857142857 0.0439690233236 0.130479591837 0.0366887755102 0.00990547934614 0.0111642413043 -0.00026972863959 0.080010704015 0.5 0.0714285714286 1.0 1.0 3.0 0.0 1.0 0.0 0.0 0.0 1.0 2.0 0.0909090909091 0.0 7.0 1.0 0.471428571429 0.75 0.0833333333333 0.0 0.25 1.0 0.75 0.666666666667 0.833333333333 0.75 0.583333333333 0.5 0.833333333333 0.583333333333 0.0 0.0 0.166666666667 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 1.0 0.75 0.5 0.5 0.25 0.25 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -5.95694215573 3.50140874802 -10.8285460454 10.9803153693 4.51526749629 3.95103306247 -0.274927733558 26.0237080842 -2.46872450878 1.13743654367 -2.99826394776 33.5224836327 1.92250016893 0.015265273539 2.28537314782 33.5572724034 -0.614122734469 0.0285456314533 2.65781633904 33.4186197985 -0.0158642605062 0.273784100258 0.774018510117 36.0074418734 0.112927106772 0.038732463779 10 1 15 4 1 2 8 10 6 11 6 10 6 4 1 6 5 3 4 4 5 4 4 4 5 3 5 3 5 4 5 3 5 3 5 4 5 3 4 5 4 3 5 5 1 2 1 3 4 8 1 4 3 9 1 5 1 1 2 5 4 5 3 5 4 3 7 1 5 0 306.0 0.944444444444 150.0 0.64 0.254901960784 0.245824255628 0.0945790080738 0.105352335019 0.0533733464337 0.0214880976514 0.00495979435291 0.00488804352858 0.00150990060523 0.588235294118 0.888888888889 0.0 4.0 3.0 2.0 1.0 3.0 5.0 5.0 5.0 7.0 0.283018867925 0.0 2.0 2.0 0.490196078431 0.0 0.2 0.56 0.76 0.32 0.6 0.24 0.28 0.8 0.6 0.6 0.88 0.68 0.64 0.48 0.64 0.0 0.0 0.0 0.0 0.222222222222 0.444444444444 0.777777777778 0.888888888889 0.0 0.0 0.111111111111 0.555555555556 0.888888888889 0.888888888889 0.666666666667 0.888888888889 0.0 0.222222222222 0.666666666667 0.888888888889 0.555555555556 0.222222222222 0.0 0.444444444444 0.222222222222 0.888888888889 0.777777777778 0.222222222222 0.0 0.0 0.333333333333 0.333333333333 0.666666666667 1.0 0.555555555556 0.0 0.111111111111 0.555555555556 0.888888888889 0.777777777778 0.777777777778 1.0 0.888888888889 0.666666666667 0.777777777778 1.0 1.0 1.0 0.555555555556 1.0 1.0 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.777777777778 0.555555555556 0.888888888889 0.555555555556 0.222222222222 0.0 0.222222222222 0.666666666667 0.222222222222 0.424413181578 4.42097064144 -3.10606434313 11.6823124575 -5.03139206927 0.866182766416 -13.6502530276 11.0990471673 4.29533987627 -2.9467309017 -5.29682824655 1.98972751185 -4.16279390796 2.58212522678 -19.6162971283 8.4715956296 1.33754727039 -2.10668079643 -17.0775100815 -2.85092163189 0.85907994488 -0.928601046129 -6.62592711396 -17.4283016217 -0.269184008967 -0.0218684390274 4 1 8 6 3 9 3 2 4 2 3 1 6 2 8 3 9 2 9 2 3 1 5 2 2 3 4 2 2 3 3 3 1 4 3 3 1 4 2 5 1 2 8 0 154.0 0.785714285714 62.0 1.09677419355 0.184179456907 0.198979591837 0.0652680091034 0.120337686432 0.0538394814833 0.0211933954612 0.0142331005639 0.0145337084206 0.0616701720771 0.636363636364 0.5 2.0 2.0 1.0 0.0 0.0 2.0 2.0 3.0 1.0 5.0 0.2 1.0 1.0 1.0 0.402597402597 0.5 0.25 0.25 0.833333333333 0.666666666667 0.0833333333333 0.25 0.666666666667 0.583333333333 0.0 0.0 0.0833333333333 0.583333333333 0.5 0.333333333333 0.666666666667 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.25 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.75 0.75 0.5 0.5 -2.63742477124 1.31871238562 -10.4957048126 5.37492605634 -5.62888808935 3.31557331155 -26.4871924935 16.8981735476 2.53711842658 -0.0890304626771 -20.2844307278 15.6507566903 -1.15893557972 -2.1098711542 -23.4778702884 0.653526358647 -0.755126179441 -0.634140380517 -29.08603981 -7.91672494492 0.893336792544 -0.129485052653 -24.6216925416 -11.3659016394 -0.226338675905 -0.203634317467 6 2 10 4 5 9 3 5 2 4 3 2 5 3 10 3 9 3 8 5 5 4 2 3 4 2 4 3 3 3 4 3 2 4 2 6 2 12 2 4 3 3 1 0 182.0 0.928571428571 87.0 0.804597701149 0.223584108199 0.252354788069 0.0773279823666 0.118684403991 0.0635207233293 0.018378853535 0.0123532200906 0.0112428744628 0.0282190486604 1.0 0.5 3.0 5.0 4.0 1.0 0.0 2.0 2.0 2.0 2.0 12.0 0.289473684211 0.0 3.0 2.0 0.478021978022 0.4375 0.375 0.25 0.75 0.5625 0.125 0.375 0.5 0.75 0.625 0.6875 0.75 0.1875 0.4375 0.375 0.6875 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.25 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.75 0.5 0.75 1.0 1.0 0.75 0.5 0.75 1.0 0.75 -3.36499022537 -1.0913481812 -11.8360978953 -1.4200068645 -5.12033468519 2.007301119 -26.9837159584 6.29567525026 1.86102951618 0.592832513674 -23.4382344241 7.57707115272 -1.11097427299 -1.76321113007 -26.5342979733 -0.128390776883 -0.639103224759 0.928570422857 -34.1948031635 0.420597667144 -0.244056917125 -0.877746978954 -36.7970474363 -2.83436678368 -0.0507089103952 0.0562419425726 4 1 6 4 4 5 4 6 2 17 2 4 5 3 6 3 6 3 6 3 6 3 6 3 6 4 5 6 3 6 4 5 2 0 153.0 0.529411764706 76.0 0.592105263158 0.171387073348 0.23414071511 0.0261426740232 0.183730239501 0.0389861784348 0.00476118357436 0.0112779465899 0.00241651985788 0.190217385972 0.333333333333 0.0 0.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 2.0 5.0 0.166666666667 0.0 3.0 1.0 0.496732026144 0.533333333333 0.8 0.666666666667 0.6 0.866666666667 0.866666666667 0.666666666667 0.933333333333 0.733333333333 0.466666666667 0.0 0.666666666667 0.266666666667 0.333333333333 0.0 0.2 0.166666666667 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.666666666667 0.5 0.5 0.833333333333 1.0 0.833333333333 1.0 0.833333333333 0.166666666667 0.0 0.0 0.5 1.0 0.333333333333 0.833333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 -10.4855021331 4.34399374086 -19.5287988834 10.0005864392 7.66690793638 -0.440567316517 0.235373773434 10.7563193064 -3.13499918749 1.4096270979 -3.40223400163 16.7626516711 1.28483807959 0.471605902793 -0.524664254914 19.21377099 0.609014124002 -1.11818628961 4.38431390457 9.93963244835 -1.33971663659 -0.680995724132 -4.70121234617 -1.18375788152 0.224007646815 -0.319497175886 2 2 6 2 5 4 3 7 1 7 2 4 4 3 6 2 6 2 5 3 5 3 5 4 4 4 5 6 2 6 3 4 1 0 128.0 0.5 63.0 0.666666666667 0.1875 0.2431640625 0.02880859375 0.206449508667 0.0567016601562 0.00524374230433 0.0217583948374 0.00752102082307 0.219494172624 0.5 0.0 1.0 0.0 2.0 1.0 0.0 0.0 0.0 0.0 1.0 5.0 0.1 0.0 7.0 1.0 0.4921875 0.375 0.75 0.25 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.875 0.5 0.75 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -6.96302876027 1.63133816669 -12.2996810527 5.46576973387 5.70191234597 2.28505466146 0.580107912255 13.519300195 -3.74108828222 0.19927881348 -6.91040862784 16.0757243074 1.93341586167 0.0850003192102 -2.53867276089 15.2748848355 -0.174265323457 -0.381546042688 0.304901890849 11.7532996396 -0.538527177777 -0.244202756808 -5.53534550977 9.14390718423 0.0513113228033 0.0574759017729 16 6 3 4 2 6 2 8 2 6 2 6 3 5 3 4 4 5 4 5 3 2 6 3 5 4 4 2 6 3 5 4 4 2 6 3 6 3 4 1 7 3 6 3 4 2 6 3 6 3 4 2 6 3 6 3 3 3 6 3 6 3 2 5 5 4 4 5 1 5 3 6 3 10 1 1 3 2 1 1 7 1 1 1 1 0 336.0 1.71428571429 154.0 0.766233766234 0.239831349206 0.209608843537 0.18574606802 0.0550113336505 0.0554459941219 0.079749920901 0.00876030777253 0.0152229483794 -0.0294446808781 0.416666666667 2.07142857143 4.0 2.0 1.0 3.0 4.0 6.0 6.0 6.0 3.0 15.0 0.206349206349 0.0 2.0 3.0 0.458333333333 0.541666666667 0.416666666667 0.291666666667 0.625 0.416666666667 0.0833333333333 0.0 0.166666666667 0.583333333333 0.583333333333 0.5 0.625 0.666666666667 0.291666666667 0.166666666667 0.291666666667 0.333333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.5 0.166666666667 0.666666666667 0.833333333333 0.5 0.333333333333 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 4.74812246891 8.99225428469 10.2799654342 19.6927981573 -2.76338296157 -3.17674371654 -5.21821554283 8.10343111782 -5.28207300135 -1.83624363192 -26.5008127026 -2.05577071126 3.6884998562 1.89054487492 -13.1538946376 6.2508191783 -0.936454974719 -0.607824879864 -13.7736092535 4.03074524376 -1.66595506085 -0.581138453483 -36.5094189511 -1.82204832064 -0.306006219158 0.101309143709 1 2 1 4 4 2 4 2 3 33 3 2 5 1 5 2 4 3 3 2 4 2 4 2 4 2 4 2 4 2 4 1 12 132.0 0.272727272727 68.0 0.647058823529 0.205808080808 0.303719008264 0.0172015436737 0.472603097087 0.0611147633358 0.00184889613635 0.0160330985681 0.00435852823125 0.953797868402 1.0 195225785.955 1.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 3.0 0.0 0.190476190476 1.0 4.0 1.0 0.515151515152 0.25 0.25 0.583333333333 0.583333333333 0.583333333333 0.333333333333 0.916666666667 1.0 0.583333333333 0.333333333333 1.0 1.0 0.416666666667 0.25 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -4.25377756991 -6.45300951082 -6.92683542399 -9.89656337249 3.80572830487 8.16257992508 -0.785070705256 16.0316408031 -3.87433695107 -0.0507721374672 -6.98695560188 24.2359056838 3.7956776506 0.24814054986 2.45069943001 24.4110462395 -2.66877340435 0.488954090429 -3.33589221798 25.6857773229 1.56613743772 -1.2028988219 -0.794106700006 14.9410907903 -0.225873412868 -0.154816874892 4 3 1 2 5 3 2 3 3 2 5 3 1 3 1 2 2 3 1 11 1 3 8 4 8 3 9 3 9 4 8 5 6 1 1 11 2 8 7 2 5 0 168.0 0.857142857143 79.0 0.746835443038 0.190972222222 0.21556122449 0.0668476592026 0.107955868359 0.0398286918934 0.0226227436004 0.01054095788 0.00602286581245 0.0426524876132 1.08333333333 0.428571428571 0.0 5.0 5.0 3.0 3.0 2.0 0.0 1.0 3.0 12.0 0.142857142857 0.0 3.0 1.0 0.470238095238 0.25 0.75 1.0 0.75 0.583333333333 0.75 0.5 0.916666666667 0.583333333333 0.416666666667 0.0 0.583333333333 0.333333333333 0.333333333333 0.0 0.5 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.75 0.75 0.5 0.25 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.5 0.25 0.0 0.5 0.5 0.0 0.0 0.0 -11.1408460164 1.77344079445 -26.9672653065 6.65539712282 -0.120178222335 3.84616712329 -27.9121210638 22.1430385236 1.01276027898 2.02460201035 -21.6649394587 33.4740762229 -0.652393696712 -0.490314011489 -22.3186778675 30.3446689124 0.759306262422 -0.750865748394 -15.4985138252 22.9294634634 0.914481206964 0.0358940292111 -6.24018669138 22.5811092305 -0.0761333843008 0.150083813036 6 5 9 5 10 3 11 2 12 2 11 3 11 2 12 2 11 2 12 2 11 3 4 2 5 4 4 2 3 3 6 2 3 3 6 1 3 4 6 2 2 3 7 1 2 3 7 2 2 2 7 2 2 4 2 5 3 3 3 5 3 2 4 3 5 0 294.0 0.666666666667 89.0 1.03370786517 0.139212827988 0.167476514415 0.0418371360761 0.137713625873 0.0475467988112 0.0140307563392 0.0198154002423 0.0124510756893 0.109477592788 0.714285714286 0.52380952381 0.0 1.0 4.0 2.0 0.0 0.0 5.0 5.0 1.0 5.0 0.470588235294 0.0 2.0 2.0 0.302721088435 0.0 0.0 0.25 0.666666666667 0.125 0.416666666667 0.708333333333 0.291666666667 0.75 0.416666666667 0.125 0.458333333333 0.208333333333 0.0833333333333 0.291666666667 0.375 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.833333333333 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.5 0.333333333333 0.0 0.333333333333 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.166666666667 0.0 0.0 -4.5775993156 -5.09295817894 -9.03544874068 -10.8450666107 1.93254418104 2.90861200825 -8.5997583059 3.98039829921 -3.32453313526 4.82923576326 -13.0572330018 26.8229956222 4.19587584631 -1.90905304652 -0.543553068828 19.8523209309 -3.20353004219 -0.827553682115 -11.4714903335 7.57369468094 1.03023263976 -0.517298066659 -11.1207606668 0.396787615111 0.13539945589 -0.220700053965 1 8 3 4 3 3 2 3 5 2 2 2 5 3 9 3 6 6 5 6 4 5 2 1 4 2 4 2 3 3 4 2 3 4 1 6 1 12 1 5 2 4 3 1 6 1 1 0 168.0 0.857142857143 88.0 0.727272727273 0.222718253968 0.252976190476 0.0701882811656 0.121163135393 0.0549812807067 0.0167471235044 0.0103070550707 0.00935218696042 0.0338806681531 1.16666666667 0.642857142857 3.0 6.0 4.0 1.0 2.0 1.0 3.0 2.0 6.0 16.0 0.19512195122 0.0 3.0 2.0 0.52380952381 0.833333333333 0.166666666667 0.583333333333 0.916666666667 0.5 0.25 0.583333333333 0.75 0.25 0.5 0.416666666667 0.583333333333 0.666666666667 0.833333333333 0.666666666667 0.75 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.75 0.25 0.25 0.5 0.75 1.0 0.5 0.25 1.0 0.75 0.75 1.0 1.0 1.0 0.75 0.75 -4.22897420216 -3.50140874802 -10.2934036722 -8.24661106474 0.0320165920506 0.692764810601 -9.55517335364 -3.36821376985 0.874050122111 2.58478347126 -6.35120320645 8.8356276388 -0.976958905566 -0.634371765783 -9.26184921739 9.21596904946 0.400869283045 0.506670086183 -11.1566930935 12.6279898162 -0.931532141893 0.70546109187 -14.6221895089 19.6397237509 0.28267333752 0.00118998719363 6 3 7 1 2 4 3 2 4 4 1 3 4 8 1 10 1 7 1 3 9 3 9 3 9 3 9 4 9 4 9 8 5 6 9 1 5 0 180.0 0.8 77.0 0.805194805195 0.171759259259 0.182962962963 0.0587138203018 0.0956248285322 0.0323089849108 0.0197477902365 0.0081919713036 0.00352520865301 0.0451779988713 0.833333333333 0.333333333333 0.0 4.0 5.0 1.0 2.0 3.0 0.0 0.0 5.0 10.0 0.151515151515 2.0 3.0 1.0 0.427777777778 0.25 0.916666666667 1.0 0.75 0.416666666667 0.583333333333 0.333333333333 0.75 0.166666666667 0.416666666667 0.0 0.333333333333 0.583333333333 0.583333333333 0.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.25 0.25 0.0 0.25 0.75 0.5 0.0 0.0 0.25 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -10.8649774484 7.38478935946 -25.6440845981 20.1144098509 1.10234250362 4.09360660738 -20.4919813159 39.3153329993 2.84850198882 3.72127992649 -3.97617322123 57.4115051074 -0.214332396656 -0.352487627028 -2.17453162032 57.5206631255 -0.440116009771 -0.00457476328871 -6.14938493713 60.9743903034 -0.00891209925632 2.75057920391 -8.06588797499 86.1294627542 -0.12666850292 0.274631525187 1 3 2 11 5 9 6 10 5 11 4 11 4 11 4 11 4 11 4 11 4 2 1 8 10 5 11 4 4 4 4 3 3 6 4 2 3 6 4 2 3 6 4 2 3 7 3 2 3 6 4 2 3 7 3 2 3 6 3 3 4 4 4 3 11 6 6 5 0 345.0 0.652173913043 143.0 0.608391608392 0.173719806763 0.222810333963 0.0475562983054 0.154720777817 0.0668846941789 0.0158428157083 0.0220270198036 0.0167705928529 0.116452369694 0.533333333333 0.434782608696 0.0 1.0 3.0 2.0 0.0 1.0 4.0 4.0 1.0 9.0 0.102040816327 0.0 2.0 2.0 0.414492753623 0.625 0.5 0.5 0.5 0.708333333333 0.791666666667 0.708333333333 0.541666666667 0.0 0.208333333333 0.333333333333 0.0 0.0 0.125 0.666666666667 0.458333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.333333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.0 -10.6841405276 -8.30373616132 -23.7304671869 -19.5482562649 3.02032051781 2.17121509609 -14.6752842948 -3.37245675885 0.120150731868 8.08545170551 -13.1609212088 33.0773890262 -2.03709109134 -1.72606997954 -19.3600090965 41.0846177092 2.76266738973 2.73123950223 -5.84142001197 44.2605303771 -1.33507970438 -3.42969281181 -11.61328581 29.5710924409 -0.139029327841 0.64092958928 2 3 10 5 10 5 11 4 12 4 11 4 10 5 11 3 12 4 2 2 7 11 4 4 2 5 4 3 4 5 3 2 7 3 3 3 6 4 3 2 7 3 2 3 7 3 2 3 7 3 2 4 6 3 2 4 5 4 2 5 3 4 3 5 2 4 4 1 2 2 1 2 5 0 330.0 0.681818181818 134.0 0.694029850746 0.170505050505 0.215564738292 0.0508852714473 0.144270946378 0.06601830982 0.0179983489158 0.0215306090409 0.0177016037822 0.101867850761 0.666666666667 0.636363636364 2.0 3.0 2.0 1.0 0.0 1.0 5.0 5.0 4.0 9.0 0.183673469388 0.0 2.0 2.0 0.406060606061 0.708333333333 0.541666666667 0.458333333333 0.5 0.583333333333 0.75 0.5 0.75 0.0 0.333333333333 0.125 0.125 0.0 0.375 0.583333333333 0.5 0.666666666667 0.5 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.5 0.5 0.333333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.5 0.666666666667 1.0 0.833333333333 1.0 0.5 0.333333333333 0.5 0.0 0.166666666667 0.5 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 -8.62330418934 -8.01562167936 -20.1748776126 -20.2729904203 1.58856004431 0.242797980427 -11.7282491081 -9.55449547258 2.95275056488 8.62440680359 -1.91895043565 24.8848487091 -3.66473889037 -3.91629034776 -11.6152241018 18.350179985 3.6306453448 1.66266287879 4.36356846949 14.138457511 -0.99427635888 -2.24416539798 4.89323371115 0.974559745666 -0.122413340032 -0.029227165916 7 3 8 7 5 8 3 2 5 4 1 3 7 1 2 3 10 3 9 3 10 3 11 2 11 4 5 2 2 5 3 3 3 5 2 3 4 7 8 1 7 0 195.0 0.866666666667 72.0 1.01388888889 0.157001972387 0.171623931624 0.0602675028237 0.0959282523306 0.0399580572835 0.0228176226053 0.0147956487126 0.00864215545403 0.0459467112146 0.692307692308 0.333333333333 0.0 3.0 3.0 3.0 0.0 2.0 0.0 2.0 1.0 7.0 0.321428571429 1.0 2.0 1.0 0.369230769231 0.125 0.6875 0.6875 0.625 0.375 0.25 0.0625 0.5625 0.75 0.0625 0.0 0.1875 0.6875 0.3125 0.0 0.5 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.0 0.25 0.5 0.5 0.5 0.5 0.25 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -9.84638581262 3.05577490736 -23.7668486553 12.855395542 0.294259805894 8.32528896984 -20.7804156895 42.204639036 3.33008205406 0.359852077157 -1.2958458854 43.7909261224 0.852170436291 -3.84312315934 7.69827445016 17.9010462715 -0.422189576755 -0.28472399345 5.3079237204 9.15511068055 -0.050850552687 0.126894243222 3.42987805008 6.64347458005 -0.0308585589274 -0.507224750527 1 5 10 7 9 6 11 5 12 4 12 4 12 4 12 3 13 3 13 7 1 4 4 4 5 4 3 4 4 5 3 3 6 4 3 3 6 4 3 3 7 3 3 3 7 3 3 3 7 3 3 3 7 3 3 3 6 4 1 6 5 4 1 7 3 6 1 5 5 4 1 0 352.0 0.727272727273 146.0 0.623287671233 0.166903409091 0.223269628099 0.0542014198676 0.145631052156 0.0648872037296 0.0202672032855 0.0210180062371 0.019557291201 0.101761209749 0.5 0.590909090909 2.0 4.0 2.0 0.0 0.0 1.0 5.0 5.0 4.0 6.0 0.116279069767 2.0 1.0 2.0 0.414772727273 0.75 0.5 0.5 0.666666666667 0.791666666667 0.708333333333 0.583333333333 0.625 0.0416666666667 0.125 0.0 0.0416666666667 0.0 0.208333333333 0.458333333333 0.416666666667 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.5 0.5 0.666666666667 0.5 0.5 0.166666666667 0.5 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -9.78079468456 -9.49142206075 -24.1221404261 -23.9150589303 0.113596691163 -0.86046504169 -18.9965064095 -23.3076858642 4.46379161444 3.82829644438 -4.13204147089 -7.90698632514 -4.7989464951 -2.14383266338 -22.8937296858 -12.2117010133 1.48216169049 1.00394100996 -20.5502292835 -11.5534509607 0.684774109868 -0.752650340613 -10.8487557311 -15.7708423037 -0.244759672505 -0.100223478442 3 5 5 9 2 4 3 3 2 2 5 4 9 3 8 3 7 5 5 2 1 4 4 3 3 2 3 3 4 2 2 11 1 24 1 5 3 2 3 2 8 0 180.0 0.8 98.0 0.663265306122 0.246759259259 0.27037037037 0.0701459190672 0.132945816187 0.0537157064472 0.014093122461 0.00503841508652 0.00572149477386 0.0343020842512 1.08333333333 0.4 3.0 5.0 4.0 1.0 1.0 1.0 3.0 1.0 2.0 13.0 0.210526315789 0.0 3.0 2.0 0.544444444444 0.583333333333 0.166666666667 0.25 0.916666666667 0.583333333333 0.0 0.583333333333 0.916666666667 0.5 0.166666666667 0.416666666667 0.75 0.75 0.666666666667 0.666666666667 0.833333333333 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.25 1.0 0.75 0.5 0.25 0.25 0.75 1.0 0.5 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.75 -4.92319290631 -1.69765272631 -14.0116293148 -0.382910091043 -3.05803844433 5.83539830458 -24.5975405275 21.3136051788 -0.219328348769 1.82367305116 -31.1230975492 32.107912998 -2.44065137737 -1.22066561046 -42.1568297526 29.5500859889 0.849670111373 1.75800064197 -42.6424280784 36.0153371963 -1.19972419613 -1.08623108022 -51.8579243443 31.7706586628 -0.325413525311 0.0441336571141 3 2 24 7 22 6 23 6 25 4 25 4 25 3 26 3 26 4 25 9 11 6 3 11 7 3 2 3 3 4 1 7 5 3 4 2 3 4 4 5 3 4 2 4 3 4 5 4 3 11 2 3 6 4 3 10 3 3 7 8 11 3 7 3 2 4 10 3 6 4 2 4 10 3 6 4 2 4 10 3 6 3 4 4 9 5 2 4 6 4 9 9 8 6 3 0 638.0 1.31818181818 221.0 0.683257918552 0.139174143336 0.198703334283 0.084806976264 0.0727512524814 0.0601223850809 0.0442257068744 0.0155135243133 0.0229436847322 0.0171306646808 0.655172413793 1.13636363636 4.0 5.0 1.0 9.0 0.0 1.0 11.0 10.0 7.0 21.0 0.218390804598 1.0 4.0 7.0 0.346394984326 0.604166666667 0.541666666667 0.520833333333 0.416666666667 0.0 0.208333333333 0.604166666667 0.4375 0.0 0.0416666666667 0.541666666667 0.583333333333 0.0 0.229166666667 0.583333333333 0.0625 0.75 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.666666666667 0.583333333333 0.916666666667 0.833333333333 0.666666666667 0.5 0.0833333333333 0.0 0.0 0.0 0.666666666667 0.583333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.916666666667 0.583333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0833333333333 0.5 0.75 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0833333333333 0.25 0.583333333333 0.0 0.0 0.0 0.0 0.166666666667 0.75 1.0 0.75 0.0 0.0 0.0 0.0 0.416666666667 0.416666666667 0.833333333333 0.333333333333 -19.0107835473 -16.1789231805 -52.8485681742 -27.2506365699 -11.1442524243 15.4835983416 -95.3717320919 12.4011591363 -0.272564086086 -6.60984496881 -87.5716118908 6.6286402102 7.66591972282 4.35861313118 -40.4618460879 15.363218776 0.0251858339618 -1.31978671858 -13.4913140412 18.8683367238 3.69983627099 0.660278828303 5.2090980296 20.2046416636 -0.916113301296 0.263467418222 4 1 9 6 8 5 10 5 9 4 11 3 11 3 11 4 10 3 11 4 1 4 5 11 3 4 4 3 3 3 5 3 3 2 7 3 1 3 7 2 2 3 6 3 2 3 7 3 1 3 7 2 2 3 7 3 1 4 6 2 1 5 4 11 3 5 1 1 1 1 1 1 3 1 1 1 1 1 322.0 0.608695652174 132.0 0.704545454545 0.16437444543 0.223332433162 0.0455979659649 0.170614439814 0.0633824441728 0.0161391481888 0.0220098194519 0.0182105993594 0.149317593541 0.928571428571 0.739130434783 2.0 5.0 1.0 2.0 0.0 1.0 5.0 5.0 8.0 16.0 0.16393442623 0.0 2.0 3.0 0.409937888199 0.666666666667 0.5 0.583333333333 0.791666666667 0.541666666667 0.666666666667 0.5 0.333333333333 0.0 0.291666666667 0.166666666667 0.0416666666667 0.0 0.25 0.708333333333 0.625 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.5 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.666666666667 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.666666666667 0.833333333333 0.833333333333 0.166666666667 0.0 0.166666666667 0.166666666667 0.0 0.166666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -10.5180658043 -7.63943726841 -23.8667837551 -19.9807151039 2.51048053573 -0.890964205135 -14.6219871699 -14.5349353366 1.57647972488 7.42140681391 -8.32312069082 14.6433437208 -3.07177176571 -3.06957792395 -19.3690608321 12.8741291713 2.64999095773 2.27916537926 -5.05535955098 16.3959353744 0.22153314461 -1.63753988835 1.3414327856 11.2559334398 -0.2116123174 0.188744892152 4 1 2 4 2 4 2 4 3 3 3 3 3 3 3 3 4 2 4 2 4 2 3 3 3 2 4 2 5 1 5 1 4 3 3 3 3 3 2 10 1 0 126.0 0.285714285714 59.0 0.864406779661 0.222222222222 0.228269085412 0.0200302343159 0.368520718105 0.0564793818762 0.00172457983429 0.0217950954143 0.00298937859718 0.613418970835 0.666666666667 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 1.0 0.384615384615 0.0 5.0 1.0 0.468253968254 0.25 0.0 0.0 0.25 0.666666666667 0.25 0.25 0.583333333333 0.833333333333 0.75 0.75 0.916666666667 0.916666666667 1.0 0.666666666667 0.916666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.36458772594 2.06143545338 -4.83064925407 5.07903984175 0.946577504103 0.629401861116 -3.6282690257 10.5476765381 -0.927750610227 2.52175565857 -4.02997011118 21.7180120001 1.18089410459 -0.142615701747 -1.11464109022 24.1583423744 -0.879196004412 0.0122979095606 -1.60456589353 21.5457744137 0.90681988915 -0.55645573949 -0.277089376272 14.8628091932 -0.300989317478 -0.279767622854 2 2 3 6 1 4 2 7 2 4 5 3 2 4 6 2 3 3 6 2 3 3 6 2 3 2 7 2 3 3 6 2 3 3 6 3 2 2 7 2 3 3 6 3 1 4 6 2 2 3 6 3 1 0 182.0 1.07692307692 79.0 0.772151898734 0.204474097331 0.181318681319 0.103174916498 0.0777015370814 0.0482709990167 0.0422895430707 0.0131641773001 0.0146788139927 0.00838604284413 0.285714285714 1.0 1.0 1.0 0.0 1.0 3.0 3.0 3.0 3.0 5.0 5.0 0.0909090909091 1.0 0.0 2.0 0.434065934066 0.75 0.5625 0.5 0.625 0.4375 0.4375 0.375 0.375 0.4375 0.0 0.0 0.0 0.8125 0.5 0.5 0.5625 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.0 0.25 0.5 0.5 0.5 0.25 0.25 0.5 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.54607659004 3.45593590714 -4.59590225344 9.26462139308 -1.22451864379 1.40408996442 -8.26193713369 14.3181761002 0.726519067438 -0.284096355548 -4.20401551089 12.110474401 0.757940345273 -0.795022730708 0.786484326779 5.64684150816 -0.516730752174 -0.318678269089 -2.27313704824 2.84554789516 -0.141194889724 0.588036192364 -3.17876030226 10.0338466015 0.208809029185 0.334984913856 1 3 4 5 2 5 3 5 3 4 6 3 3 3 7 2 3 3 6 3 3 3 6 2 4 3 5 3 4 2 6 4 2 3 6 4 2 4 5 4 2 4 5 4 1 6 4 11 4 4 1 0 195.0 1.15384615385 97.0 0.639175257732 0.227692307692 0.242603550296 0.114223638295 0.0931330602337 0.0562666262075 0.0405215306869 0.00977179307055 0.013795268314 -0.00305707272012 0.266666666667 1.0 2.0 1.0 4294967295.0 2.0 3.0 3.0 3.0 3.0 2.0 5.0 0.294117647059 1.0 0.0 2.0 0.497435897436 0.75 0.5 0.625 0.875 0.4375 0.5 0.375 0.625 0.25 0.0 0.0 0.0 0.6875 0.5 0.75 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.44300481737 1.78253536263 -7.82513818641 6.58757260739 -5.73806621494 3.47452924652 -22.479230982 18.9517265746 4.04171292652 0.243078719997 -7.7732097631 20.3818347455 0.101025958415 -1.39581053732 -1.91997943351 9.8002586301 -0.975098889916 -0.707500914194 -8.08094241404 1.88618727761 0.844652982989 0.0201790930346 -2.65413786189 0.932296295392 0.023319638536 -0.0282999750397 5 4 8 8 4 10 1 12 1 5 1 1 1 9 9 3 10 3 10 3 10 3 10 4 9 4 6 1 3 5 2 3 3 9 7 3 5 0 195.0 0.866666666667 90.0 0.7 0.193293885602 0.19452991453 0.0639768033851 0.0982692223402 0.0364288002158 0.0199270305984 0.0102928309255 0.00385335185018 0.036652184753 0.615384615385 0.266666666667 0.0 2.0 3.0 3.0 0.0 2.0 0.0 2.0 3.0 7.0 0.333333333333 1.0 3.0 1.0 0.461538461538 0.25 0.8125 0.75 0.6875 0.8125 0.625 0.25 0.5625 0.9375 0.375 0.0 0.125 0.6875 0.5 0.0 0.25 0.0 0.0 0.25 0.5 0.75 0.75 0.5 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 -11.3742732663 7.13014145052 -25.5896398564 20.0498360394 2.97881465044 4.45011367991 -14.382122158 37.037661214 2.63447199325 0.684594180893 1.78172385792 40.1291638452 -0.701131153495 -1.31471026197 1.56828402853 29.0279780859 0.456811292696 -1.30299924706 3.18911430645 14.41224112 -0.121443875673 -0.97880088806 0.805099143411 1.01253978468 -0.259736576668 -0.303017877303 2 2 5 3 4 5 3 7 1 5 4 3 5 3 5 2 6 2 6 2 6 2 6 2 6 5 1 1 1 7 2 5 1 0 120.0 0.533333333333 56.0 0.696428571429 0.155208333333 0.227777777778 0.0263883101852 0.194803240741 0.050619212963 0.00618604678325 0.022965166516 0.00908712471036 0.213244095693 0.5 0.0666666666667 0.0 1.0 2.0 1.0 0.0 0.0 0.0 1.0 1.0 7.0 0.166666666667 1.0 3.0 1.0 0.466666666667 0.625 0.75 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 0.625 0.625 0.75 0.75 0.125 0.25 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 -8.10629176815 1.27323954474 -16.0362475102 4.25854283779 4.67137441857 2.1288565188 -4.44436782 14.2234921429 -2.30707652118 2.30822924834 -9.97509681211 26.3003066026 -0.25880121052 0.0807394135368 -13.2723272166 29.1353794335 0.923150187699 0.15625338905 -10.3097174399 30.457209715 -1.87493554414 0.480159001915 -24.569354269 34.6614387979 -0.0457552762059 0.0536080061875 6 1 2 1 8 7 5 3 2 5 3 3 5 4 2 2 7 7 7 7 8 6 8 6 8 6 7 8 6 4 1 4 4 4 3 10 6 6 10 3 5 0 210.0 0.933333333333 97.0 0.701030927835 0.224149659864 0.222222222222 0.0953967174171 0.0977475434618 0.0561980347695 0.0310788455209 0.0104421675201 0.0116948763182 0.0134002718985 0.571428571429 0.733333333333 0.0 3.0 3.0 1.0 2.0 3.0 3.0 1.0 1.0 12.0 0.263157894737 0.0 3.0 2.0 0.461904761905 0.3125 0.6875 0.75 0.75 0.4375 0.0625 0.0 0.4375 0.625 0.0625 0.0 0.3125 0.625 0.75 0.5625 0.8125 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.763943726841 2.97089227105 -7.73712837501 12.8464146185 -8.74291154051 8.78818227988 -37.2208462729 45.3417936405 0.180102091454 2.10062099098 -39.4883186211 58.5273603936 2.10951797674 -1.7124985853 -26.8219306031 48.3486790205 -1.66575512611 0.29681739923 -36.7171655159 47.8044927353 -0.991567060216 0.812585383901 -51.650838224 56.4779510806 -0.368720528734 0.156908650451 2 3 3 5 2 4 3 3 4 3 4 1 7 1 6 2 4 4 2 5 2 5 3 4 3 4 3 4 3 4 3 4 3 5 2 5 2 5 1 16 5 0 154.0 0.318181818182 87.0 0.597701149425 0.205936920223 0.299881936246 0.0180457929657 0.366294440928 0.0501508105657 0.00199048447139 0.0106175321257 0.00375127998024 0.641560588076 0.857142857143 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 2.0 6.0 0.25 0.0 7.0 1.0 0.564935064935 0.416666666667 0.5 0.583333333333 0.666666666667 0.833333333333 0.75 1.0 1.0 0.833333333333 0.75 1.0 1.0 0.666666666667 0.583333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -7.11856654556 -2.89372623803 -11.6445588592 -2.29450461187 6.52630927048 7.18935522048 0.313182174596 23.5587281744 -5.9064582276 1.80690286582 -10.1055138693 35.7013082981 4.97598038913 -1.59759446026 1.54186531409 27.1975505344 -3.21655606131 0.410291865495 -5.52556588912 26.0524385892 1.32528610234 -0.227853960106 -6.40471670792 24.1546947436 -0.114331416551 -0.0900232107113 1 4 5 1 1 1 2 1 1 11 2 20 3 19 3 5 1 6 2 5 4 4 2 4 4 4 3 6 2 3 5 4 2 6 2 2 6 4 2 7 1 1 8 3 2 6 1 1 9 6 2 5 9 5 3 5 10 4 4 3 11 4 5 2 12 3 5 2 13 1 14 0 330.0 1.46666666667 168.0 0.535714285714 0.240082644628 0.179595959596 0.130053176392 0.0430678409439 0.0383697303615 0.0397396449161 0.00487359079942 0.000697357874426 -0.0227535194796 0.272727272727 1.53333333333 0.0 2.0 3.0 1.0 6.0 6.0 5.0 3.0 6.0 21.0 0.220338983051 1.0 4.0 3.0 0.509090909091 0.916666666667 0.75 0.416666666667 0.25 0.458333333333 0.5 0.708333333333 0.708333333333 0.833333333333 0.791666666667 0.833333333333 0.541666666667 0.958333333333 0.625 0.291666666667 0.25 0.833333333333 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 0.666666666667 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 0.666666666667 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.5 0.666666666667 -5.90320152559 19.3879657948 -13.803881417 43.159590737 1.27419614845 -4.88525559731 -6.23906161079 29.9388020678 2.8678455617 -0.692018294434 2.73974994444 15.7947130212 -3.87967869562 -0.457060477567 -13.3488817438 19.8995352395 1.48949371271 2.91998357924 -9.1546767889 33.6009820916 0.628747459394 -2.03070946463 0.467896333083 25.8744483624 -0.124508449312 0.293221231297 3 2 6 3 5 5 3 9 1 7 2 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 6 3 6 5 4 1 0 144.0 0.5625 67.0 0.65671641791 0.188271604938 0.216579861111 0.0326271004801 0.166947646069 0.0525401341735 0.00587659123673 0.0197100498591 0.00587443300532 0.145047393289 0.333333333333 0.0 0.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 4.0 0.130434782609 0.0 3.0 1.0 0.465277777778 0.5 0.666666666667 0.333333333333 0.333333333333 0.916666666667 1.0 1.0 1.0 0.583333333333 0.666666666667 0.333333333333 0.333333333333 0.25 0.416666666667 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 -6.76408508141 3.66056369111 -11.8702256595 9.75215554773 5.47001862029 1.4373680798 -0.597348609906 15.324750051 -4.27157966458 0.137555759989 -9.35458503779 15.977117326 2.60699899091 -0.171241778656 -3.17906283674 13.6976017071 -0.705844120061 -0.488179457528 -0.495815702205 7.78050297067 0.317924081748 -0.850374162376 -0.178547428725 -2.44511313167 0.149098004691 -0.214928902035 1 0 5 4 5 2 4 4 5 3 3 6 3 3 3 6 3 3 3 6 2 4 3 7 2 3 3 6 3 3 3 6 3 3 3 6 3 3 4 5 3 3 4 4 5 3 12 3 6 2 2 2 0 195.0 1.15384615385 95.0 0.610526315789 0.240341880342 0.233136094675 0.117096512079 0.0911457037374 0.0627579021899 0.0393597046147 0.0134762784268 0.0114817204227 -0.00896081613356 0.266666666667 0.923076923077 0.0 0.0 1.0 2.0 3.0 3.0 3.0 2.0 3.0 9.0 0.236842105263 1.0 1.0 2.0 0.487179487179 0.6875 0.5 0.5 0.375 0.5 0.5 0.5625 0.875 0.125 0.0 0.0 0.4375 0.75 0.4375 0.5 0.6875 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.69765272631 -0.933708999472 -5.58945935346 1.70166197371 -1.86515446198 6.00969065115 -9.33315013101 22.8265940372 2.55303496321 0.710138614755 2.8941608136 27.3995033081 0.829881583377 -2.32389482441 9.8663055505 13.1755626473 -0.992554585637 0.289235913352 3.35150402402 10.5815102559 -0.1007437294 -0.226679762893 -1.33184516051 6.3342811349 -0.137704264548 -0.409048589778 3 8 3 4 2 4 1 4 4 3 1 2 7 2 1 2 9 3 9 3 9 3 9 4 9 4 8 5 4 2 2 5 1 3 4 7 2 0 156.0 0.923076923077 68.0 0.705882352941 0.171474358974 0.200197238659 0.0679027272038 0.108208373371 0.0391837986143 0.0269017527573 0.0157214094029 0.00695801253039 0.0483651140027 0.75 0.384615384615 0.0 3.0 3.0 3.0 2.0 1.0 0.0 2.0 3.0 9.0 0.166666666667 0.0 2.0 1.0 0.435897435897 0.416666666667 0.833333333333 0.916666666667 0.416666666667 0.75 0.333333333333 0.583333333333 0.916666666667 0.5 0.0 0.0833333333333 0.75 0.333333333333 0.0 0.0 0.416666666667 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -8.86370606143 -3.03618660668 -21.6613163444 -4.0095251669 -0.438418623392 5.44125902846 -23.8460441934 18.1963126582 0.553821635027 3.96663260397 -20.3548010524 41.182207566 -0.599571907378 -0.314894677724 -22.2934477706 41.6941881263 0.127275041061 -0.517018483642 -21.9124149803 36.5469862562 -0.00646700704971 0.425959534758 -22.9121891181 40.6264179941 -0.213448557617 0.273095650912 1 1 13 4 4 5 2 4 4 6 2 3 5 4 3 4 5 3 3 3 6 3 4 2 6 3 4 2 6 3 3 3 6 2 5 2 6 2 4 4 5 3 4 4 2 6 3 4 2 7 3 6 1 3 6 1 10 0 225.0 1.0 97.0 0.917525773196 0.197333333333 0.205037037037 0.0857805432099 0.0893968504801 0.0569615802469 0.029268979358 0.0141120314879 0.0130259181856 0.0173898246373 0.466666666667 0.866666666667 2.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0 2.0 8.0 0.114285714286 1.0 1.0 2.0 0.431111111111 0.75 0.6875 0.5625 0.5625 0.1875 0.3125 0.25 0.5625 0.3125 0.0625 0.0 0.25 0.75 0.8125 0.625 0.8125 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.5 0.75 0.75 0.5 0.5 0.5 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 -3.05577490736 -1.1034742721 -12.2367867337 -0.10128727651 -6.39675547275 3.77331612635 -28.4021999268 12.3281911664 4.85614191122 -0.189625713662 -10.1391065468 12.4079317666 0.0214357509807 -1.50096742276 -3.72997709261 1.98732658199 -1.07830969395 -0.0752127169629 -9.76330549762 -1.51498884602 1.38271263709 -0.112371565802 0.691183229429 -2.27079089306 0.102789944925 -0.0193932303204 1 8 1 9 5 5 1 1 6 4 8 3 4 1 3 3 4 8 4 8 4 8 4 8 4 7 6 5 8 5 5 8 4 8 4 8 3 9 3 9 3 9 3 9 4 7 5 6 7 5 7 5 0 276.0 0.521739130435 110.0 0.6 0.14402173913 0.189350976686 0.0253441971909 0.170016841243 0.0270640416244 0.00617164992087 0.00694234248458 -0.000513061455886 0.175320493204 0.5 0.0869565217391 2.0 1.0 3.0 0.0 2.0 0.0 0.0 0.0 2.0 7.0 0.258064516129 0.0 1.0 1.0 0.398550724638 0.0555555555556 0.388888888889 0.555555555556 0.388888888889 0.388888888889 1.0 1.0 1.0 0.611111111111 0.722222222222 0.722222222222 0.444444444444 0.666666666667 0.0555555555556 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.333333333333 0.5 0.666666666667 1.0 0.666666666667 0.5 0.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.833333333333 0.666666666667 0.5 0.666666666667 0.833333333333 0.5 0.166666666667 0.666666666667 0.833333333333 0.166666666667 0.0 0.166666666667 0.5 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.0 0.0 -13.0922240143 5.81261531292 -21.0097769203 12.5009330322 13.4765922931 -1.88647072187 10.1197755911 8.40030363479 -8.86108437893 0.648308085921 -10.0200809728 6.23013605136 3.44730410125 -0.933327898231 -7.76212816359 4.77760391051 -0.757186397685 0.993205574802 -2.66335006403 6.14001336127 -0.2309587741 -1.24523494289 -9.92820449846 -1.92427205679 -0.00689502159263 -0.208188456775 5 4 5 9 3 4 3 4 3 2 5 3 10 3 9 4 7 6 5 3 1 4 3 4 3 3 3 3 4 3 3 3 4 4 2 4 2 6 2 4 3 3 1 0 169.0 1.0 83.0 0.795180722892 0.235776058261 0.241693218025 0.0884522258909 0.104218749903 0.061462759351 0.021001352932 0.0114369233977 0.0108637048245 0.00754049400989 0.769230769231 0.615384615385 2.0 5.0 3.0 0.0 1.0 1.0 2.0 3.0 1.0 7.0 0.387096774194 0.0 2.0 2.0 0.491124260355 0.5625 0.125 0.4375 0.6875 0.4375 0.125 0.5 0.4375 0.75 0.6875 0.6875 0.5 0.3125 0.5 0.5 0.75 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.5 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.0 0.0 0.0 0.25 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.25 1.0 0.75 0.25 0.0 0.25 0.75 0.75 0.25 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 -0.195883006882 -0.88147353097 -4.04739979404 -2.22646994109 -4.96314222172 0.281654264334 -18.8943874089 1.34589389633 1.23668765631 2.07751139975 -18.5902555725 9.13668592909 -0.876801838728 -1.17343141786 -20.9358404697 5.97632775773 -0.407913827549 0.156686557328 -25.8660312941 0.142380588879 0.154863873234 -1.71046930578 -22.6120360257 -15.5406144481 0.176037462578 -0.29142971792 3 7 4 3 2 5 1 3 4 4 1 3 5 7 8 5 7 4 8 4 8 3 9 4 8 5 6 1 1 11 2 8 2 0 156.0 0.923076923077 77.0 0.571428571429 0.183760683761 0.231755424063 0.0695856302365 0.115137013436 0.0372941216136 0.0260647099477 0.0123042564099 0.00592144062026 0.0488374480815 0.833333333333 0.307692307692 0.0 4.0 3.0 3.0 2.0 1.0 0.0 1.0 2.0 8.0 0.2 0.0 2.0 1.0 0.49358974359 0.416666666667 0.916666666667 1.0 0.75 0.75 0.75 0.583333333333 0.916666666667 0.333333333333 0.0833333333333 0.0 0.583333333333 0.5 0.0 0.0 0.5 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.25 0.75 0.25 0.0 0.0 0.25 0.25 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -9.10855982003 -1.37118104818 -21.5349396734 -1.16363795464 0.683272381995 3.64991472587 -19.5753188584 14.6817761088 0.844582151326 3.45691910899 -14.8048712522 34.2253008393 -1.30002873206 0.173636926781 -21.4891928021 37.721439778 -0.178187855946 -0.306452028775 -24.4936673283 36.3040218258 0.0599892245174 0.920734476058 -25.6674629059 44.7873414564 -0.248068058385 0.224973755451 5 1 2 2 7 8 3 4 3 3 3 3 5 3 2 3 6 1 2 4 8 4 9 4 10 3 10 4 9 4 6 1 3 4 4 3 4 7 6 7 2 0 182.0 0.928571428571 73.0 0.849315068493 0.165680473373 0.192307692308 0.0643549181165 0.100494180376 0.0457859976034 0.0245385642752 0.017532127445 0.0101788181652 0.0446066900226 0.692307692308 0.428571428571 0.0 2.0 3.0 3.0 2.0 2.0 0.0 2.0 3.0 6.0 0.3 0.0 2.0 1.0 0.401098901099 0.25 0.6875 0.875 0.5 0.5625 0.4375 0.3125 0.625 0.4375 0.0 0.0 0.25 0.625 0.25 0.0 0.375 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -9.54929658551 0.727565454134 -21.5935751306 5.43578494226 2.33164311673 5.98107060191 -12.7984291896 29.5447953067 2.18327874052 3.40212985093 0.721717637539 48.1927931858 -0.391845861171 -1.24821064458 2.55825887576 40.0515028153 0.893320295169 -1.66002501335 9.14081419011 23.0013433279 0.38309070759 -0.64885269403 11.6926817423 11.295659858 -0.32611288028 -0.348815478028 0 6 10 6 11 5 12 4 12 4 12 4 12 4 13 3 13 10 6 11 5 4 4 3 4 4 6 2 5 3 5 4 4 3 5 4 3 4 6 3 3 4 6 3 3 4 6 3 3 4 6 2 4 4 6 3 2 5 5 5 1 6 3 6 336.0 0.761904761905 140.0 0.6 0.171130952381 0.222789115646 0.0548553746896 0.136951581228 0.0658102526725 0.0197021240485 0.0207453129035 0.0186920949126 0.0864970958434 0.5 0.52380952381 3.0 1.0 3.0 1.0 0.0 0.0 5.0 5.0 2.0 6.0 0.159090909091 0.0 1.0 2.0 0.416666666667 0.708333333333 0.333333333333 0.375 0.583333333333 0.75 0.875 0.791666666667 0.791666666667 0.0 0.375 0.0416666666667 0.0416666666667 0.0 0.416666666667 0.375 0.375 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.166666666667 0.0 0.166666666667 0.166666666667 0.5 1.0 1.0 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.666666666667 1.0 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -9.91307931258 -8.00321999548 -22.4356021579 -21.6408089224 2.50667746457 -2.39717143959 -12.5536662655 -23.7769493517 2.33937717761 5.25707856331 -0.813164096171 -5.93079525732 -2.03975648725 -3.29051152023 -7.9861194907 -10.6383396873 1.07376291424 2.93574629883 -3.62552225903 1.28296681698 0.188246836992 -0.69432582809 -1.02604426082 1.42083660861 -0.210819862698 -0.237743701648 0 20 1 8 3 4 6 4 6 3 7 3 7 3 7 3 7 3 6 4 6 6 4 3 1 1 4 0 130.0 0.769230769231 65.0 0.492307692308 0.185384615385 0.185207100592 0.0438001820665 0.109786527082 0.02442284934 0.0106179301308 0.005889179434 -0.00276748915998 0.0567001927577 0.3 0.0769230769231 1.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 5.0 2.0 0.0833333333333 0.0 2.0 1.0 0.5 0.75 0.333333333333 0.333333333333 0.583333333333 1.0 1.0 1.0 0.916666666667 0.916666666667 0.5 0.333333333333 0.5 0.75 0.0 0.0 0.0833333333333 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -8.5698815511 4.70119216518 -16.5657487355 12.7670817375 5.55455822327 2.32277837747 -1.67792545075 22.425455363 -1.76590132143 1.01213650165 -2.89273650602 28.0478133888 0.200388747958 0.277662305311 -4.10810975555 31.0656386055 0.781429353491 0.768914866408 3.15517304997 39.1292789191 0.0878365507833 1.25681898626 5.31221076282 51.9762104294 0.0049447862589 0.108747667412 1 1 4 12 1 5 1 5 3 1 27 4 2 4 2 4 3 3 3 3 3 3 3 3 3 4 3 3 3 2 3 4 1 5 2 3 1 0 138.0 0.260869565217 69.0 0.695652173913 0.242753623188 0.244171392565 0.0215416472608 0.416543001866 0.0665929243948 0.00216354684874 0.0298744550689 0.00353431341251 0.725825234961 1.33333333333 186737708.348 0.0 2.0 1.0 1.0 0.0 4294967292.0 0.0 0.0 2.0 6.0 0.2 1.0 4.0 1.0 0.5 0.583333333333 0.0833333333333 0.25 0.0 0.75 0.166666666667 0.75 0.333333333333 0.75 0.25 1.0 0.833333333333 0.75 0.25 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -1.9098593171 1.66074723226 -3.11488000758 9.50650230571 1.50330588312 7.66580830197 -1.94104214789 32.4580189325 -2.13719761412 -2.27478235125 -4.42967340358 28.8223874522 2.69709532697 0.767859448343 1.8116556236 28.5605858681 -2.43175946873 0.188477889115 -3.73669796289 26.8080922607 1.92697114495 -2.12812473642 0.682528901442 7.53061137119 -0.422018771684 -0.114695926617 11 2 10 5 9 5 10 3 11 3 11 4 11 2 11 3 11 4 5 1 2 5 4 3 2 6 2 3 5 4 2 3 6 2 2 4 5 3 2 3 6 3 2 3 7 2 2 3 7 2 1 5 5 4 1 4 6 2 2 5 5 3 3 3 5 3 11 2 1 0 308.0 0.636363636364 112.0 0.785714285714 0.21219851577 0.192886658796 0.071204429636 0.142949243264 0.0598350434142 0.0222981049634 0.017665433001 0.0131619991654 0.0819974476061 0.642857142857 0.545454545455 0.0 2.0 0.0 3.0 0.0 1.0 5.0 5.0 9.0 12.0 0.292682926829 2.0 0.0 2.0 0.363636363636 0.0 0.0416666666667 0.583333333333 0.708333333333 0.0 0.166666666667 0.458333333333 0.5 0.0833333333333 0.166666666667 0.0833333333333 0.0 0.791666666667 0.791666666667 0.708333333333 0.541666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 3.0962870747 -4.25377756991 5.58329128564 -9.5041453309 -1.89395578034 2.12545387938 5.13871223373 4.01930697635 4.15061359096 5.65407642193 18.7592967624 29.3391919091 -1.79913953231 -1.67302258112 14.7265248278 30.1020455 0.194048320495 1.55293058866 11.401202825 34.4226070615 0.232585023345 -0.45940519596 14.4608243897 35.8030906101 -0.0702639889279 0.0860016469828 5 5 6 9 3 11 1 6 2 4 1 12 1 11 1 4 9 4 10 3 10 3 10 4 6 2 1 6 2 4 2 5 1 4 5 6 3 0 182.0 0.928571428571 103.0 0.533980582524 0.253169907016 0.244505494505 0.0827667532323 0.101812072121 0.0423734127242 0.0201388719952 0.00750735816218 0.00322267795368 0.00627730516056 0.846153846154 0.285714285714 0.0 2.0 5.0 3.0 0.0 1.0 0.0 3.0 7.0 14.0 0.105263157895 0.0 3.0 1.0 0.565934065934 0.375 0.8125 0.875 0.6875 0.875 0.8125 0.25 0.6875 0.875 0.625 0.0 0.3125 0.75 0.6875 0.0 0.5625 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 -9.27645954021 6.22977920103 -22.49117165 15.2572105122 -0.164259037477 1.03265109578 -23.6034343563 24.0791756969 0.703484355766 3.76475018916 -19.5579229432 40.4864330187 -0.897441126086 -0.409370005927 -23.1590131859 38.1732867618 0.139995568924 -2.04534944255 -22.9355198445 21.0347915527 0.0705455706271 -0.142791150078 -24.1571808999 11.0995314586 -0.328982681315 -0.512119805269 4 1 6 2 5 3 4 5 3 13 1 1 1 4 5 3 5 3 5 3 5 3 5 2 6 3 5 3 5 5 3 6 3 2 3 0 136.0 0.470588235294 62.0 0.725806451613 0.191176470588 0.21669550173 0.0282159576633 0.191901190082 0.0523769845308 0.00460340597253 0.0185550930966 0.00486469588716 0.196911881283 0.5 0.0588235294118 0.0 0.0 2.0 2.0 0.0 1.0 0.0 0.0 0.0 9.0 0.185185185185 0.0 4.0 1.0 0.455882352941 0.2 0.4 0.0 0.0 0.5 0.8 0.5 0.4 0.7 1.0 1.0 0.9 0.9 1.0 0.9 1.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 -5.28019928846 3.59502930278 -8.53374039588 8.02527913115 5.19389992587 -0.77125196115 2.70977803433 6.88212338157 -3.56070083193 0.703200317519 -2.56182212095 8.67019577819 2.81282314397 0.00962057623881 2.92249621113 8.55172679012 -1.92289214706 -0.758929265181 -1.30718545349 0.737741683165 0.852277625813 -0.717153694037 -1.54455283086 -5.98177540129 -0.0653664837926 0.107515372038 2 2 13 3 2 7 3 14 3 5 4 4 4 3 5 4 4 3 6 3 4 2 7 3 4 3 6 3 4 2 6 4 4 3 5 4 4 2 6 4 3 4 5 5 1 6 4 13 2 7 5 1 5 4 1 0 240.0 1.06666666667 118.0 0.703389830508 0.231510416667 0.239166666667 0.102117983218 0.0956278211806 0.063345703125 0.0311469052872 0.0127953765513 0.0154334453548 0.00159309814617 0.5625 0.866666666667 2.0 5.0 2.0 0.0 1.0 3.0 3.0 3.0 6.0 5.0 0.186046511628 0.0 1.0 2.0 0.491666666667 0.75 0.5625 0.5 0.6875 0.625 0.5 0.375 0.5 0.5 0.0 0.0 0.0 0.6875 0.625 0.625 0.75 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 0.75 0.75 0.75 0.0 0.5 1.0 0.75 0.5 0.25 0.25 0.25 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.517253565049 3.89929610575 -6.90466012447 11.4261332055 -7.21714822507 2.78490065461 -23.1425084016 19.5326913327 6.91229107948 -1.68772577997 4.79064725655 11.4934934214 1.01860725842 -1.09862967173 19.0783033775 0.602852848596 -1.82976021007 -0.413249758772 4.58735872605 -2.75270651707 -0.119259206693 0.514893198424 1.00239327168 1.14603193613 0.135661375031 0.000796377615659 4 1 9 1 7 6 3 7 2 10 3 5 4 3 2 5 4 4 4 2 4 3 5 4 4 2 4 4 4 4 4 1 6 4 2 6 3 1 6 5 1 6 2 1 8 7 1 6 8 6 3 4 9 6 3 4 10 5 3 4 11 3 4 3 6 0 286.0 1.69230769231 133.0 0.721804511278 0.205340114431 0.208176438946 0.126673829862 0.0492118034052 0.0501671051331 0.0460558140551 0.00790620795256 0.00720219007357 -0.0196923387125 0.181818181818 1.53846153846 0.0 2.0 2.0 0.0 5.0 6.0 5.0 3.0 3.0 10.0 0.340425531915 0.0 3.0 3.0 0.465034965035 0.75 0.625 0.416666666667 0.208333333333 0.333333333333 0.375 0.833333333333 0.75 0.625 0.708333333333 0.75 0.5 0.375 0.25 0.291666666667 0.291666666667 0.5 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 0.333333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.666666666667 0.833333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.5 0.333333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 0.666666666667 -10.5910380312 6.88706844652 -24.0659785714 17.0616298598 2.5379892315 0.779751603232 -13.9244972818 19.9616917467 2.58418637217 -1.41406040681 -0.835456135295 7.89282396245 -2.11002889511 -2.10274477001 -9.19162425212 -1.42234571264 0.520548010612 2.08263122209 -8.04494719203 3.33425687541 0.845979962089 -2.22558978335 2.33206618879 -5.43410611429 0.0885589216529 0.401800524454 1 1 2 6 3 1 4 4 4 1 4 5 3 2 3 5 3 2 3 5 3 1 4 5 3 2 2 6 3 2 3 5 3 2 3 5 3 2 3 5 3 2 4 4 4 1 5 2 5 2 5 2 4 4 2 7 0 182.0 0.928571428571 91.0 0.703296703297 0.232459847844 0.234301412873 0.0954568315394 0.102364110349 0.0574169520855 0.0303435128368 0.0112612351891 0.0108563485302 0.012195655609 0.153846153846 0.928571428571 1.0 1.0 0.0 0.0 3.0 3.0 3.0 3.0 0.0 6.0 0.137931034483 0.0 0.0 2.0 0.5 0.8125 0.75 0.6875 0.6875 0.1875 0.1875 0.1875 0.625 0.3125 0.25 0.25 0.375 0.75 0.75 0.75 0.9375 0.75 1.0 0.75 0.5 0.75 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.25 0.5 0.5 0.5 0.5 0.25 0.25 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -3.54688158891 -1.31871238562 -13.1339840991 -1.178778644 -6.20704278058 3.18797095193 -30.3311851726 11.1167242476 3.51277695824 1.55060067369 -17.9182564889 20.1581825258 0.0184582917679 -0.616098088216 -13.5972352785 17.4720881579 -1.32719364827 -0.0168221353296 -22.9739993704 15.5633523296 0.304569769027 -0.126615023564 -25.4303232287 12.1991266373 -0.307997023125 -0.277212586894 3 2 4 4 3 6 3 4 44 5 3 5 4 4 4 3 6 2 5 4 4 4 4 4 4 4 4 4 3 6 1 8 1 3 1 1 2 0 176.0 0.363636363636 73.0 0.767123287671 0.164772727273 0.234245867769 0.0191174398948 0.317628420537 0.0588329381104 0.00277670114603 0.0263442522791 0.00675934387767 0.470412588522 1.125 195225786.0 3.0 3.0 3.0 0.0 4294967295.0 4294967292.0 0.0 0.0 0.0 6.0 0.25 1.0 4.0 1.0 0.414772727273 0.333333333333 0.166666666667 0.0833333333333 0.25 0.5 0.333333333333 0.5 0.666666666667 0.583333333333 0.333333333333 0.916666666667 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -5.26658175322 -5.84532700083 -9.62606797997 -8.52126506767 3.40383516909 8.34517165919 -4.9670061065 19.815267463 -3.78723561343 1.01523522168 -10.3816154181 30.0194668763 4.05759241844 -1.3934709019 1.09089579692 22.4771321169 -2.4665339466 0.48864538642 -2.04473349378 18.3116115891 1.69781518595 -1.64273412009 0.692597744411 8.77964751535 -0.302305245746 0.231032411869 4 5 4 9 1 3 4 7 3 21 5 4 7 3 8 3 8 3 8 4 8 3 5 2 2 7 6 4 3 0 154.0 0.785714285714 78.0 0.602564102564 0.194805194805 0.206864564007 0.0607546442426 0.107705248032 0.030708623473 0.0188919234724 0.00856990221231 0.00292871708547 0.0496775420779 1.09090909091 0.214285714286 0.0 1.0 4.0 2.0 1.0 1.0 0.0 1.0 2.0 9.0 0.171428571429 0.0 3.0 1.0 0.506493506494 0.5 1.0 1.0 0.75 0.666666666667 0.833333333333 0.416666666667 0.666666666667 0.5 0.416666666667 0.0 0.25 0.75 0.416666666667 0.0 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.75 1.0 0.75 0.25 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.0 -11.5501015844 5.95694215573 -26.9625956316 15.4624204731 1.40269793868 2.28408223723 -22.2866034002 28.4870735062 1.62322038392 3.96371043976 -11.2319384017 47.7614845562 -0.180840833903 0.0291528525054 -8.63496252376 46.4055382336 0.684779809637 -2.86482991365 -4.44780131883 23.2442895651 -0.317415450256 -0.239879530998 -8.26001665207 14.3382239764 -0.32138312123 -0.080835441597 1 3 1 1 2 10 7 10 7 12 5 12 4 14 3 14 3 14 3 14 3 14 3 4 1 9 5 2 4 6 4 4 4 5 3 6 3 5 3 5 4 5 3 5 4 5 2 7 3 4 4 5 4 4 4 6 3 4 4 6 3 4 4 6 3 2 7 4 5 1 8 2 7 2 1 1 3 6 1 1 1 1 0 391.0 0.739130434783 146.0 0.719178082192 0.149390702573 0.208273101301 0.0471421272092 0.141383187375 0.061886373319 0.0172601012115 0.0226170286103 0.0183521324653 0.103245490191 0.529411764706 0.739130434783 3.0 4.0 2.0 0.0 1.0 1.0 5.0 5.0 8.0 6.0 0.1 2.0 0.0 2.0 0.373401534527 0.633333333333 0.4 0.4 0.633333333333 0.5 0.466666666667 0.466666666667 0.4 0.0 0.133333333333 0.366666666667 0.266666666667 0.0 0.0666666666667 0.566666666667 0.633333333333 0.666666666667 0.555555555556 0.111111111111 0.0 0.0 0.0 0.0 0.111111111111 0.777777777778 1.0 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.777777777778 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.777777777778 0.888888888889 0.666666666667 0.555555555556 0.333333333333 0.222222222222 0.0 0.0 0.222222222222 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.666666666667 0.555555555556 0.555555555556 0.0 0.0 0.0 0.0 0.222222222222 0.888888888889 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.333333333333 0.333333333333 -11.735947108 -12.0127383134 -28.1533132657 -27.5895109833 0.914614417768 2.52931698827 -22.1022366802 -16.6169733339 3.11863366479 3.57885575635 -12.9688690955 2.25796839385 -4.91312690492 -1.37734845478 -31.0082541083 0.695920754373 2.91540413106 0.645141310865 -21.3431301025 -1.87320604507 -0.792136342563 -1.43237332881 -21.5555872688 -9.63143525899 -0.235077114166 0.298578094063 7 1 2 1 8 7 3 9 4 3 10 3 9 3 10 3 10 3 9 4 8 6 7 6 8 5 9 3 10 3 10 3 10 3 10 3 10 3 10 3 10 3 9 6 7 6 7 1 1 1 9 0 299.0 0.565217391304 92.0 0.75 0.0944172883972 0.140031990694 0.0179028771161 0.125271881054 0.0206707974917 0.00537456792831 0.00943847528452 0.000494042102467 0.122841089641 0.307692307692 0.0869565217391 1.0 2.0 1.0 0.0 1.0 0.0 0.0 0.0 2.0 10.0 0.228571428571 1.0 2.0 2.0 0.307692307692 0.208333333333 0.708333333333 0.625 0.541666666667 0.541666666667 0.583333333333 0.583333333333 0.583333333333 0.375 0.0 0.0 0.0416666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 0.833333333333 0.5 0.5 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 0.666666666667 0.5 0.833333333333 0.833333333333 0.5 0.5 0.5 0.666666666667 0.166666666667 0.0 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -15.6663822244 5.81261531292 -27.3169115437 15.3974053091 14.0948988477 2.54354897463 10.2904145024 27.7652461638 -5.39952688409 2.37194082092 2.45406874233 37.9827917061 1.1157254566 -0.818577916612 0.469143218636 33.5754170904 1.25724085387 -1.02111264691 11.5305009155 20.4585290308 -0.982265765329 -1.09539200726 7.1304067113 10.5565869562 0.248792428786 0.198610529688 1 6 2 9 3 5 2 3 4 3 2 4 3 3 1 6 2 9 3 8 4 7 1 1 3 4 3 2 3 3 4 3 2 2 4 3 4 1 4 2 6 1 5 2 4 2 1 6 1 2 0 168.0 0.857142857143 71.0 1.01408450704 0.204861111111 0.227465986395 0.07368581113 0.118526068662 0.0615714167611 0.0204776293221 0.0136371192666 0.0135440674291 0.04103031094 0.75 0.714285714286 2.0 3.0 4.0 0.0 1.0 2.0 3.0 3.0 4.0 10.0 0.181818181818 0.0 2.0 2.0 0.422619047619 0.333333333333 0.25 0.25 0.833333333333 0.166666666667 0.0833333333333 0.5 0.833333333333 0.333333333333 0.0833333333333 0.333333333333 0.333333333333 0.75 0.666666666667 0.666666666667 0.583333333333 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.25 0.0 0.0 0.25 0.5 0.25 1.0 1.0 0.75 0.25 0.25 0.75 0.75 0.5 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 -1.50060374915 -1.77344079445 -6.42247227131 -2.94601312957 -3.63179515913 2.25090562373 -15.7543699382 6.12706397993 2.12550967225 1.20376136199 -11.628073469 10.6683482088 -1.6903957719 -1.83442985229 -15.77931654 2.09521641665 0.637077148113 0.31135799158 -15.2973805511 -3.20231840017 -0.00301390438718 -1.52772442331 -12.5224167148 -15.0628179627 -0.0525973584997 -0.0592118304187 4 8 5 5 2 3 4 4 6 2 2 4 7 3 1 4 8 2 1 4 8 7 7 4 1 3 7 4 1 3 7 3 2 4 5 4 2 5 3 5 3 5 1 5 5 1 1 6 4 0 195.0 1.15384615385 98.0 0.642857142857 0.225299145299 0.241025641026 0.110030715285 0.0876405873329 0.0562822704361 0.0388220206002 0.0101759472501 0.0120455958358 -0.00493958645584 0.533333333333 0.923076923077 0.0 2.0 3.0 1.0 2.0 3.0 3.0 3.0 4.0 12.0 0.230769230769 0.0 2.0 3.0 0.502564102564 0.5625 1.0 0.8125 0.5625 0.625 0.25 0.3125 0.75 0.375 0.0 0.0 0.5 0.625 0.375 0.5625 0.8125 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.73483599789 1.52788745368 -14.7164609987 9.20596573749 -8.41583044858 8.26643700866 -43.0072076246 37.4742031757 0.57862711689 -0.193306057103 -43.3197113614 36.6803309616 1.73856778714 -3.98750633935 -29.2932655129 9.09335354878 0.285440496535 -0.375999984605 -18.9239923275 0.479749657941 2.18460005968 0.636788421553 2.65889368971 5.80358344308 0.303185205838 -0.084052689663 1 3 6 4 8 3 3 3 4 2 2 4 4 9 3 9 3 8 4 6 6 4 3 1 4 2 4 3 3 2 4 2 4 2 24 1 10 1 0 168.0 0.857142857143 99.0 0.464646464646 0.268849206349 0.313775510204 0.0750214272217 0.145056385649 0.05874686184 0.0112273549877 0.00409574370376 0.00474463606788 0.0242044638709 0.833333333333 0.357142857143 3.0 5.0 2.0 0.0 1.0 1.0 2.0 1.0 7.0 11.0 0.205128205128 0.0 3.0 2.0 0.589285714286 0.583333333333 0.166666666667 0.333333333333 1.0 0.5 0.0 0.5 0.833333333333 0.666666666667 0.166666666667 0.5 0.583333333333 1.0 0.833333333333 0.916666666667 0.916666666667 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.25 0.75 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.27364204417 -5.63863226954 -7.73467334253 -11.909055992 -2.93903034852 2.87499716442 -15.5242460073 0.141128207098 1.61317791251 2.89431507267 -13.3226280961 16.8675995909 -2.13027624436 -0.0333612699775 -22.6532071046 20.8728480168 -0.0171995559906 0.340174885977 -25.8698678174 19.8860034061 0.380219114297 -0.973359499338 -23.5109439961 11.9728072613 -0.245219630323 -0.0459740288679 2 1 3 3 4 11 2 12 1 4 4 5 1 2 6 4 1 2 7 3 1 2 7 3 1 3 6 3 1 3 6 3 1 3 6 3 1 2 7 2 2 3 5 3 2 10 3 5 1 1 6 3 10 3 10 3 10 3 10 4 8 5 8 6 8 1 11 0 286.0 0.590909090909 124.0 0.66935483871 0.169714900484 0.172123331214 0.0453179699659 0.122548651652 0.0259497275672 0.0151857626337 0.00111824808327 0.00294330514927 0.08839683869 0.846153846154 0.5 1.0 6.0 3.0 1.0 3.0 5.0 2.0 0.0 3.0 14.0 0.0925925925926 1.0 3.0 2.0 0.433566433566 0.708333333333 0.625 0.708333333333 0.833333333333 0.416666666667 0.125 0.416666666667 0.416666666667 0.583333333333 0.0 0.25 0.0 0.666666666667 0.708333333333 0.291666666667 0.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.833333333333 0.833333333333 0.833333333333 1.0 1.0 0.666666666667 0.5 0.0 0.333333333333 0.333333333333 0.5 0.833333333333 0.5 0.666666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.333333333333 0.5 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.5 0.0 1.0 0.5 0.0 0.0 0.0 0.333333333333 0.5 0.0 -10.2437908826 14.2081958287 -21.4560655037 36.4329771653 4.79079098045 3.39241571224 -6.46432097503 50.7222190432 0.113228576613 0.988396706344 -3.89432483649 56.8660703605 -2.28724839256 0.876968747941 -12.7989533076 55.2658076589 2.70783422122 -2.46301317611 2.50042985576 42.7522532164 -0.291995514117 1.59064938487 4.48691352796 46.0499273117 -0.22403460842 -0.264983913677 1 2 1 1 1 12 5 10 6 11 5 12 4 12 4 12 4 12 4 12 4 12 4 2 4 6 11 5 5 3 4 4 4 5 3 4 4 5 3 4 3 7 3 3 3 7 3 3 3 6 3 4 3 7 2 4 3 6 3 4 4 5 4 2 5 5 11 4 6 1 1 2 1 11 0 368.0 0.695652173913 141.0 0.716312056738 0.148607336957 0.203095463138 0.0443680387716 0.136100061096 0.0587244787065 0.0163035175496 0.0209986186563 0.0175597355318 0.101110529401 0.4375 0.608695652174 2.0 1.0 3.0 1.0 1.0 1.0 5.0 5.0 4.0 12.0 0.134615384615 1.0 1.0 2.0 0.383152173913 0.625 0.5 0.5 0.541666666667 0.666666666667 0.791666666667 0.75 0.583333333333 0.0 0.25 0.208333333333 0.0 0.0 0.291666666667 0.541666666667 0.416666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 -12.815432809 -6.47691420583 -28.0626899576 -16.4272780726 4.66416726626 -0.0436377817173 -10.8984929563 -10.0463959931 2.16306737094 5.53177413177 -2.82205779845 10.2136081508 -4.96378693784 -3.27517365193 -23.7585162718 6.36699870533 3.07626668875 3.14536123653 -10.4019954175 15.0444015595 0.173305374844 -2.08166254588 -2.1216621022 9.9722389658 -0.232102009054 0.428844914306 4 3 12 4 11 6 10 5 12 4 12 4 12 4 13 3 12 4 13 9 6 11 6 4 2 4 5 3 5 3 5 3 6 2 6 2 6 3 4 3 6 3 5 2 6 3 3 4 5 4 2 5 5 4 1 6 5 4 2 7 2 6 1 7 2 6 6 1 9 0 368.0 0.695652173913 146.0 0.72602739726 0.175441576087 0.217745746692 0.0502813506501 0.147130313264 0.0654505760009 0.0159579550832 0.0210566510793 0.0169220735496 0.100347948209 0.6875 0.478260869565 6.0 3.0 2.0 0.0 0.0 0.0 5.0 5.0 1.0 6.0 0.173913043478 0.0 2.0 2.0 0.396739130435 0.291666666667 0.166666666667 0.166666666667 0.541666666667 0.958333333333 0.916666666667 0.75 0.75 0.291666666667 0.5 0.25 0.0833333333333 0.0 0.333333333333 0.5 0.458333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.666666666667 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.666666666667 0.5 0.0 0.0 -9.41090098283 -8.91267681315 -22.0297799804 -22.2021862546 0.973635302393 0.667542948621 -19.5770616213 -9.78148223782 0.475988570279 8.81484872163 -15.6409705775 24.9504897655 -0.616426884284 -4.34907854594 -15.7015653554 18.9433353748 1.17086003689 3.05738690036 -10.4050432527 23.8389693667 -0.8811875429 -2.03138410468 -13.6004194393 19.4711416105 0.187941358235 0.420819523304 1 2 8 3 6 1 4 3 4 2 4 3 2 5 3 10 3 10 3 10 3 6 3 2 2 4 3 3 3 3 4 3 4 2 4 2 6 1 12 1 11 1 0 169.0 1.0 92.0 0.597826086957 0.262630860264 0.275375512062 0.092609009389 0.121325289648 0.06457786086 0.018856528061 0.00981194466048 0.00802731067312 -6.05168596298e-05 0.769230769231 0.538461538462 2.0 4.0 4.0 0.0 2.0 1.0 2.0 2.0 5.0 5.0 0.194444444444 1.0 3.0 1.0 0.544378698225 0.6875 0.125 0.3125 0.75 0.5625 0.0 0.4375 0.75 0.75 0.5 0.5 0.8125 0.4375 0.5 0.5625 0.875 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.25 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.25 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.25 0.685590524088 -4.89707517206 -1.54292187491 -10.1668128174 -4.42417418503 2.65890898099 -14.5088751385 0.165310971808 1.25916609037 1.89855151599 -13.7970993745 11.171820969 -1.0434807274 -0.822172220192 -19.0214070305 6.42063461984 -1.03003561778 -1.01080381665 -27.2385749218 -4.78781602777 0.449312790331 -0.908705141171 -26.4525489731 -16.3571796137 -0.1146929911 -0.217167765277 2 4 1 6 2 5 2 5 3 4 4 3 3 4 3 4 3 4 3 4 3 3 4 3 4 3 4 4 3 3 4 3 4 3 4 3 4 4 2 13 4 1 2 0 154.0 0.318181818182 86.0 0.604651162791 0.257884972171 0.255608028335 0.0230290033798 0.321814633334 0.052905266432 0.00155728263853 0.0132519028481 0.00104224469989 0.46661216232 0.714285714286 0.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 2.0 8.0 0.133333333333 0.0 7.0 1.0 0.558441558442 0.333333333333 0.0 0.0 0.25 0.666666666667 0.416666666667 0.5 0.666666666667 0.916666666667 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.47247148564 3.84865589659 -5.94708624678 10.7045380221 2.73349511576 2.64064476767 -1.73309264543 23.6816058843 -2.7900315812 2.98498134073 -5.7535051553 37.5401233965 2.75006130159 -0.855973305314 -0.128241417301 32.5821107359 -2.3282255444 -1.26887537744 -5.5781970815 21.3949832775 1.40466694381 0.29387625041 -5.94273154023 19.7221865402 -0.438295632342 -0.12442587473 9 4 9 5 10 4 11 3 11 3 11 3 11 3 11 3 6 2 2 4 4 4 2 4 3 4 4 3 2 4 5 2 3 5 4 3 2 5 4 3 1 6 4 2 3 5 4 3 1 5 5 3 2 4 5 3 3 4 4 3 4 4 2 5 3 5 1 5 294.0 0.666666666667 128.0 0.671875 0.232264334305 0.246193715581 0.0696859427745 0.167586382973 0.0632539100142 0.0179162074766 0.014899569679 0.00884719118047 0.0944109151229 0.571428571429 0.619047619048 1.0 2.0 2.0 2.0 0.0 2.0 5.0 5.0 1.0 3.0 0.210526315789 1.0 0.0 2.0 0.43537414966 0.0 0.125 0.75 0.583333333333 0.0 0.375 0.708333333333 0.75 0.166666666667 0.166666666667 0.0 0.208333333333 0.875 0.833333333333 0.666666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.833333333333 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 1.0 0.833333333333 0.0 0.0 0.0 0.333333333333 0.833333333333 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78859840808 -10.1252859034 -3.07962021588 -23.2836333873 2.11237328421 2.47100036038 5.78736806542 -9.99250713183 1.59698277772 5.67805682658 13.1397199136 19.7520822011 -1.32023522667 -0.330515794571 6.73675274387 26.4701995167 -0.127802463776 0.512089683398 2.17045378762 24.942223208 -0.302396155474 -1.24452807938 -1.06053209116 13.5919341937 -0.0996984818633 -0.207143489929 4 7 4 4 1 5 3 3 4 4 1 3 4 5 1 16 2 3 4 3 10 3 10 3 10 4 10 4 6 1 2 6 1 1 1 2 3 10 6 5 3 0 182.0 0.928571428571 92.0 0.684782608696 0.213863060017 0.220957613815 0.0773218449224 0.102023067501 0.0399328663125 0.0231089716002 0.0103542449279 0.00453908371235 0.0249886813554 1.07692307692 0.5 0.0 5.0 6.0 3.0 2.0 2.0 0.0 3.0 5.0 13.0 0.0789473684211 1.0 3.0 1.0 0.505494505495 0.4375 0.8125 0.8125 0.75 0.5625 0.4375 0.0625 0.6875 0.625 0.5625 0.0 0.375 0.8125 0.5 0.0 0.375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.75 0.75 0.25 0.0 0.0 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.75 0.25 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.25 0.75 1.0 0.5 0.0 0.0 -8.36700272255 2.1826963624 -20.934085296 6.83842872118 -1.08949214688 3.07359283685 -24.8892395769 22.6824816029 0.908490922256 4.44573249616 -19.6993864854 43.8373406859 -0.208861016775 -1.08579766457 -19.522648403 37.6810411219 -0.34827188333 -2.25776222913 -22.7334200986 16.8153349573 -0.314421861845 -0.456226591209 -27.553611895 5.26049958646 -0.215866032746 -0.316868503555 2 3 2 6 2 14 1 7 2 5 2 5 4 4 2 5 5 3 3 3 6 3 3 3 5 4 3 3 5 4 3 3 6 3 3 3 5 4 3 3 5 4 2 5 3 13 2 6 2 5 2 5 1 0 210.0 1.07142857143 126.0 0.5 0.286984126984 0.274149659864 0.112256127848 0.101281071159 0.0563347370694 0.0256715163375 0.00716598628178 0.00653823650126 -0.0266301745546 0.466666666667 0.928571428571 2.0 1.0 1.0 0.0 2.0 3.0 3.0 3.0 4.0 9.0 0.1 0.0 1.0 2.0 0.6 0.8125 0.625 0.5 0.6875 0.8125 0.625 0.5 0.6875 0.5625 0.0 0.0 0.1875 0.9375 0.625 0.6875 0.875 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.18835690842 2.29183118052 -6.50104702678 7.83234469665 -4.78285361427 3.44170796048 -18.551204303 19.5931389972 3.51926344379 -0.34473668029 -5.61109630415 17.5683699956 0.0163318197707 -1.6559951881 -1.73557357398 5.99017121948 -1.29915806886 -0.0517574918786 -12.3458073909 2.49343061193 -0.330831747238 0.0276010667445 -22.1748124811 3.96775521257 -0.499708986771 0.135339738633 1 2 1 1 2 10 6 8 6 9 6 11 4 12 3 12 3 12 3 11 4 11 4 4 2 5 4 2 5 4 4 5 3 3 4 5 4 2 4 5 4 2 3 6 4 2 3 6 4 3 2 6 4 3 2 6 3 4 2 6 3 3 3 6 3 2 4 6 3 2 5 4 5 2 1 8 4 12 3 360.0 0.625 137.0 0.722627737226 0.170555555556 0.193981481481 0.0508393132716 0.14351303155 0.0680264917695 0.0183775436478 0.0275104960697 0.0209908901734 0.105078224077 0.333333333333 0.625 3.0 1.0 4294967295.0 0.0 1.0 3.0 6.0 5.0 4.0 5.0 0.2 2.0 0.0 2.0 0.380555555556 0.625 0.375 0.5 0.416666666667 0.75 0.75 0.666666666667 0.5 0.0416666666667 0.0833333333333 0.0833333333333 0.0 0.0 0.25 0.583333333333 0.5 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.166666666667 0.5 0.5 0.5 0.333333333333 0.833333333333 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -6.20704278058 -4.11150269654 -14.3374939216 -8.77609840888 1.20222770381 2.52782811958 -9.29320116237 5.03347836243 1.26010423461 4.7946988849 -5.12879113082 27.0576608556 -2.27552564652 -1.49207240092 -13.3648959064 27.5592331132 1.69624400767 1.59550045631 -6.32222242985 32.798088975 -0.542262139429 -0.637313039901 -9.0983727 31.6020938956 -0.256096585033 0.0627034855669 1 2 3 4 2 5 1 4 33 3 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 2 12 2 3 1 0 138.0 0.260869565217 65.0 0.646153846154 0.157004830918 0.261184625079 0.0122629821405 0.464030285319 0.0525130209522 0.00156735030442 0.0251917053846 0.00510580975387 0.937732691056 1.0 186737708.304 2.0 1.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 4.0 5.0 0.1 1.0 6.0 1.0 0.471014492754 0.583333333333 0.25 0.583333333333 0.666666666667 0.666666666667 0.333333333333 1.0 1.0 0.583333333333 0.333333333333 1.0 1.0 0.333333333333 0.166666666667 0.5 0.583333333333 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -4.98224169679 -4.65009225034 -8.11450022199 -6.11956430817 4.43849610014 7.66894771072 -0.870472121643 20.4111873763 -4.30710145811 1.30331872052 -6.56790520973 31.0941256229 4.52268221922 -1.73679806289 3.58327208627 19.2076159737 -3.6435067341 -0.634241158031 -4.43599256262 9.24477026848 2.46424646749 -0.627828473175 -0.663156797548 4.43500107486 -0.503054951995 0.175688982024 10 2 10 5 9 5 10 4 10 4 10 4 10 4 10 3 10 4 7 8 4 3 1 5 4 3 4 3 3 3 6 2 3 2 7 2 3 2 7 3 1 3 7 2 2 3 7 3 1 4 6 3 2 3 6 3 2 4 4 5 3 11 4 4 1 4 1 0 308.0 0.636363636364 123.0 0.723577235772 0.223330241187 0.220926800472 0.06655909184 0.167091802509 0.0646235116081 0.016587527034 0.0193415359157 0.0113359220161 0.106366522468 0.785714285714 0.5 0.0 3.0 4.0 3.0 0.0 0.0 5.0 4.0 3.0 6.0 0.239130434783 0.0 2.0 2.0 0.399350649351 0.0 0.0416666666667 0.541666666667 0.708333333333 0.0 0.208333333333 0.25 0.333333333333 0.291666666667 0.5 0.166666666667 0.208333333333 0.916666666667 0.875 0.625 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 1.53367490616 -7.32112738223 1.65537485208 -19.8089494893 -1.9535043616 -1.5036614646 1.77034615658 -14.2482701325 4.69669003111 9.49797301739 15.8775440561 26.336324695 -3.04594247403 -1.59924669614 7.29772307951 34.6195483236 0.92003312518 1.32448312427 4.11521516863 30.5763318145 -0.892247736417 -2.69106242339 -0.785841595681 12.5262587607 -0.128048732846 -0.00735267146557 0 12 2 5 3 5 2 4 4 4 2 3 5 4 2 3 5 4 2 3 5 4 2 3 5 3 3 3 5 4 2 3 6 3 2 3 5 4 1 5 4 10 3 6 1 2 1 1 3 1 1 1 1 1 1 0 182.0 1.07692307692 104.0 0.528846153846 0.262166405024 0.253169907016 0.113157220753 0.0943595560339 0.0523630155619 0.030612118718 0.00724221261738 0.00975532243575 -0.0157437086888 0.357142857143 1.15384615385 1.0 1.0 2.0 1.0 2.0 3.0 3.0 3.0 10.0 5.0 0.116279069767 0.0 1.0 2.0 0.571428571429 0.875 0.75 0.75 0.8125 0.5625 0.25 0.25 0.375 0.5 0.25 0.1875 0.3125 0.9375 0.9375 0.875 0.875 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -0.318309886184 2.00080499887 -6.714603441 6.26336091225 -8.21596792961 2.34324333124 -30.4751058059 15.7202576218 3.19157648799 0.997097621994 -21.1648510636 20.4190976386 0.681375167039 -0.739646756259 -11.4766536263 16.988309941 -0.679592924303 0.367465508741 -14.7477973272 19.4442973126 0.684697618911 0.852180185257 -8.65496170938 29.3582629967 0.178004044445 0.217737664338 1 5 3 9 4 9 3 10 2 10 3 8 4 6 1 2 2 6 2 2 2 4 3 3 2 3 4 2 4 2 4 2 12 1 4 2 4 2 3 2 0 156.0 0.923076923077 66.0 0.757575757576 0.198717948718 0.246548323471 0.0722765892884 0.126127379086 0.0593233196783 0.0188961145051 0.0116156047286 0.011514570354 0.045038597777 0.416666666667 0.538461538462 0.0 2.0 2.0 1.0 0.0 0.0 3.0 3.0 6.0 4.0 0.0769230769231 1.0 1.0 1.0 0.423076923077 0.0 0.0 0.416666666667 0.916666666667 0.0 0.0833333333333 0.583333333333 0.833333333333 0.416666666667 0.166666666667 0.25 0.416666666667 0.833333333333 0.75 0.75 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.5 0.25 1.0 0.75 0.25 0.0 0.25 0.25 0.0 0.0 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.00780082054 -3.52589412388 -6.71619421919 -7.46072642372 -2.36247656082 1.78728755392 -12.4984770704 0.205133835477 1.67993802854 2.00538494613 -8.39781504227 11.6643789111 -0.909399093696 -0.159681688653 -6.76005733924 11.4368850845 1.57147693627 -0.856970120631 0.263895546007 2.73120504961 -0.45831565653 -0.747999199752 4.4322702274 -6.88596263578 0.332843555132 -0.156037883757 2 2 5 6 1 8 1 5 3 4 4 4 5 2 5 3 5 3 6 2 5 4 4 4 4 7 2 5 4 4 1 0 120.0 0.533333333333 63.0 0.650793650794 0.205208333333 0.242777777778 0.0323327546296 0.190943865741 0.0498327546296 0.00544573381722 0.0173576428794 0.00421969744428 0.176748918533 0.75 0.0 2.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 5.0 3.0 0.0384615384615 0.0 3.0 1.0 0.525 0.5 0.375 0.25 0.375 0.875 0.875 0.75 0.875 1.0 1.0 1.0 1.0 0.875 0.875 0.5 0.875 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -6.70572826894 3.73483599789 -11.785619788 12.188224106 5.58980454351 4.85755033423 0.818397123528 29.9484210911 -3.91570936861 0.778489047731 -9.58566484282 35.609976181 0.649463230166 -0.610044935492 -13.7680726247 30.6243532384 -0.647837778866 -0.141352617368 -17.0355819117 29.1855633907 -0.703133204037 0.561105589252 -24.4931246375 33.1364822938 0.046424109709 -0.0269248151077 2 2 2 12 1 5 1 5 2 4 2 4 2 3 2 3 2 4 3 1 4 0 66.0 0.545454545455 43.0 0.46511627907 0.290404040404 0.258953168044 0.0455971561343 0.143821131424 0.0347622227788 0.0047362502205 -0.00487042992131 -0.00195646510958 0.0701965347364 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 4.0 0.125 0.0 4.0 1.0 0.651515151515 0.666666666667 0.666666666667 0.166666666667 0.166666666667 0.833333333333 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.833333333333 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.18309886184 5.55595437703 -6.8118607561 13.0324546035 1.20197256796 -0.36733582658 -3.4479049575 13.3150678884 -0.0911026686811 0.477005303731 -2.21875240679 13.6863654655 -0.0628889681265 -0.128972735232 -2.62836892858 12.4160836332 0.157946869596 -0.547925269941 -1.56108510979 6.48994461831 -0.0571027099122 -0.730391786297 -1.78408418466 -4.40274853493 -0.0180966701373 -0.395948636958 2 3 1 6 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 2 3 3 3 3 3 3 2 4 2 3 1 0 126.0 0.285714285714 69.0 0.391304347826 0.334656084656 0.243386243386 0.0320604726311 0.344825172868 0.0740040872316 0.00125068182163 0.0208097300871 0.00073956089165 0.469797614532 0.333333333333 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 0.08 0.0 2.0 1.0 0.547619047619 0.25 0.0 0.0 0.0 0.5 0.0 0.0 0.166666666667 0.833333333333 0.5 0.416666666667 0.583333333333 1.0 1.0 0.916666666667 0.916666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.00040249943 4.36539272481 0.570546722415 11.9160274424 -2.21507385002 2.34272776615 -3.96263501183 22.170217045 1.78892855679 1.47094811787 -0.861945473111 29.4074133423 -1.43463616637 -0.264747545809 -2.65633068737 27.4912643701 1.30141940783 -0.672434815737 -0.376140388338 20.2424374521 -1.16752941688 -0.555502478401 -3.35415524492 11.4227575511 0.245063687785 -0.295246708457 9 6 10 5 13 3 13 3 13 3 13 3 13 3 13 3 12 4 6 3 3 4 4 3 6 3 4 3 6 3 3 4 6 3 3 4 6 3 2 5 6 3 3 4 6 3 3 4 7 2 4 3 6 3 4 4 5 3 5 5 3 5 4 3 1 1 3 3 1 0 336.0 0.761904761905 117.0 0.769230769231 0.186569940476 0.19175170068 0.0699486748444 0.127593173616 0.0576560190669 0.0233106823419 0.0195333466699 0.0135879746407 0.0674613509288 0.3125 0.619047619048 0.0 2.0 2.0 1.0 0.0 1.0 5.0 5.0 2.0 9.0 0.255813953488 2.0 1.0 2.0 0.348214285714 0.0 0.0833333333333 0.708333333333 0.458333333333 0.0 0.208333333333 0.5 0.666666666667 0.0833333333333 0.0416666666667 0.0 0.166666666667 0.666666666667 0.583333333333 0.5 0.416666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.39450045376 -8.6701549951 -5.72659936209 -21.273130765 -2.12454062032 0.151369910242 -4.02701701357 -16.313645633 7.06064854513 5.10625048353 21.812261942 9.83511057592 -3.10293162469 0.290027360691 14.5881674797 18.5523328708 0.489951996421 -0.178675346626 11.4672797193 14.8931534381 0.429391918316 -0.627132209789 12.6497613232 7.51490828133 -0.517320881779 -0.165416999814 1 23 2 28 6 5 5 9 6 5 6 7 8 4 7 6 8 4 8 4 8 5 20 5 20 5 20 4 21 5 20 5 20 5 20 5 20 4 21 4 21 4 21 4 20 6 18 7 16 12 13 4 1 7 7 0 550.0 1.13636363636 186.0 0.44623655914 0.159490909091 0.125537190083 0.076756730278 0.0601117295267 0.03800440571 0.0295604789728 0.0148156895079 0.00621559061392 0.0165575871532 0.4 0.454545454545 0.0 5.0 5.0 0.0 6.0 3.0 0.0 0.0 5.0 4.0 0.125 0.0 6.0 1.0 0.338181818182 0.619047619048 0.119047619048 0.0 0.0238095238095 0.571428571429 0.404761904762 0.428571428571 0.595238095238 0.619047619048 0.404761904762 0.380952380952 0.428571428571 0.642857142857 0.047619047619 0.0 0.0 0.833333333333 0.916666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.75 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.916666666667 0.666666666667 0.583333333333 0.75 0.75 0.75 0.75 0.75 0.916666666667 0.75 0.75 0.75 0.666666666667 0.75 0.666666666667 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.916666666667 0.916666666667 0.416666666667 0.0 0.0 0.0 0.0 0.0 -3.76878905242 8.09780350452 -2.47566084224 24.7372213772 8.61467764418 8.76567366827 20.0880987696 62.2910307085 -3.24222183177 5.75265809695 23.1630248907 90.1957285154 5.45331871616 -2.66735891265 41.8040288719 72.3891025935 -2.3923321854 -3.22188666228 41.3617311514 39.9800344832 1.98462648033 -0.609038593712 47.7963230188 27.4636074965 -0.125981015138 -0.0250078560662 4 7 7 10 4 4 4 4 2 4 6 3 1 5 6 3 1 4 8 2 1 4 9 1 1 4 8 7 7 8 7 3 2 4 6 3 2 5 4 3 5 9 6 7 5 0 210.0 1.07142857143 104.0 0.625 0.212063492063 0.228571428571 0.0951728754994 0.0902857142857 0.0471519274376 0.0339154189371 0.00919968489594 0.00954458504234 0.00776078084662 0.6 0.714285714286 0.0 2.0 3.0 2.0 1.0 3.0 3.0 2.0 3.0 8.0 0.263157894737 0.0 2.0 2.0 0.495238095238 0.375 0.9375 1.0 0.6875 0.75 0.375 0.25 0.625 0.5 0.0 0.0 0.25 0.6875 0.3125 0.3125 0.625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -6.53596299631 2.33427249868 -20.9585684229 10.3146988023 -7.82617906831 7.25746540499 -48.5923509047 37.0081913788 -0.139844667297 1.4092739248 -51.2656075985 44.3133094471 1.4208664198 -2.8415892587 -42.5309512306 26.4954422665 -1.38586901589 0.173084903144 -50.8275135724 26.8258941117 -0.736758584124 2.38909278021 -60.7507412228 52.0746834713 -0.122646954416 0.489270581039 1 3 4 4 2 5 2 5 37 5 2 5 2 5 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 5 1 14 154.0 0.318181818182 72.0 0.569444444444 0.17254174397 0.258559622196 0.0172605266213 0.383582347826 0.0587356226165 0.00231539444226 0.0265366541819 0.00655695808531 0.66318173536 1.0 195225785.955 2.0 2.0 1.0 0.0 4294967295.0 4294967292.0 0.0 0.0 4.0 0.0 0.173913043478 0.0 6.0 1.0 0.467532467532 0.5 0.333333333333 0.333333333333 0.25 0.666666666667 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.333333333333 1.0 1.0 0.583333333333 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -5.55595437703 -4.77464829276 -9.78295083199 -7.24022797481 4.00912616979 6.46191788291 -4.29125793453 15.4437264741 -4.61690947892 1.70020671659 -11.9628504496 29.3722511867 4.58372846363 -0.0758164611305 0.52358624917 30.2185318982 -2.84755216883 0.442706312884 -4.36339871147 31.2731707963 1.54736206679 -0.553551568415 -3.86464890424 26.6615509948 -0.274660071416 -0.087767560561 10 5 11 4 12 4 13 4 12 4 11 4 13 3 12 4 8 9 5 10 4 5 2 5 4 3 5 4 3 4 6 3 3 4 6 3 3 4 6 3 2 4 7 3 3 4 6 3 4 3 6 3 4 5 3 4 5 13 4 12 336.0 0.761904761905 143.0 0.608391608392 0.233072916667 0.238945578231 0.0777029670375 0.144999759576 0.0657651732568 0.0193586869994 0.0158205730603 0.00950971910732 0.0600162659381 0.75 0.428571428571 0.0 4.0 5.0 3.0 0.0 0.0 5.0 4.0 6.0 7.0 0.122448979592 0.0 2.0 2.0 0.425595238095 0.0 0.0833333333333 0.708333333333 0.5 0.0 0.333333333333 0.541666666667 0.666666666667 0.0 0.416666666667 0.0833333333333 0.375 0.666666666667 0.833333333333 0.625 0.708333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.833333333333 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.5 0.333333333333 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -3.88734461068e-16 -10.3071772669 -2.28386155719 -27.8878633713 -2.12825268896 -2.80054956552 -1.41831349574 -26.9491249452 6.18247885142 9.58858786722 20.6323309574 13.011576266 -2.63810954144 -2.138729988 14.8898072231 18.4482929202 0.162696563126 1.22626384548 8.0107703083 14.4866575862 -0.104034250667 -2.0069550907 9.69687462144 3.76341717598 0.000146270190576 0.202156164267 6 1 12 5 8 5 9 4 5 3 3 3 7 3 1 4 7 3 1 4 8 7 8 2 1 4 8 2 2 2 9 1 3 3 7 1 4 4 5 2 5 4 4 2 6 7 10 3 7 0 225.0 1.0 79.0 1.0253164557 0.132740740741 0.167407407407 0.0610761920439 0.0765278463649 0.0405140192044 0.0287479216689 0.0116337244526 0.0123655730854 0.0332480764111 0.533333333333 0.666666666667 0.0 3.0 2.0 1.0 0.0 3.0 3.0 2.0 2.0 11.0 0.212121212121 2.0 2.0 2.0 0.351111111111 0.3125 0.875 0.875 0.625 0.625 0.3125 0.1875 0.375 0.3125 0.0 0.0 0.0 0.1875 0.5 0.25 0.375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -8.31849835894 1.1034742721 -24.9932736775 4.82148699704 -7.33838685161 3.33871702842 -50.1268148728 17.0802873767 1.12796238871 0.652795678222 -43.7142949999 20.6576906043 3.08576477879 -1.22112495011 -21.9169189123 12.2115531657 -0.391937475147 -0.474258064529 -17.9212791218 5.83863596775 0.761083503527 -0.198940484463 -6.8623087489 2.13914368375 0.72079420802 -0.165543310333 4 4 5 1 5 13 2 3 3 8 1 3 5 5 3 3 5 4 4 3 6 2 5 3 5 3 6 3 4 3 7 2 3 3 8 7 8 3 12 4 13 6 11 8 8 11 4 3 3 6 3 3 7 3 2 4 8 2 2 4 8 2 3 4 7 1 4 6 11 7 7 0 352.0 0.727272727273 150.0 0.82 0.174005681818 0.193698347107 0.049405918365 0.121529204428 0.0373988219619 0.0145332568385 0.00940018501508 0.00473996507399 0.0721753478158 1.5 0.590909090909 4.0 11.0 7.0 2.0 4.0 4.0 1.0 4.0 5.0 18.0 0.261538461538 2.0 4.0 3.0 0.426136363636 0.5 0.5 0.458333333333 0.791666666667 0.5 0.5 0.75 0.458333333333 0.416666666667 0.333333333333 0.5 0.125 0.75 0.458333333333 0.416666666667 0.375 0.0 0.333333333333 0.5 0.166666666667 0.0 0.166666666667 0.0 0.166666666667 0.166666666667 0.833333333333 1.0 0.5 0.166666666667 0.666666666667 0.166666666667 0.5 0.5 1.0 1.0 0.833333333333 0.666666666667 1.0 0.666666666667 0.833333333333 0.833333333333 0.666666666667 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.833333333333 0.166666666667 0.0 0.333333333333 0.666666666667 0.666666666667 1.0 0.5 0.666666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 1.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 1.0 0.333333333333 0.666666666667 0.166666666667 0.0 0.166666666667 0.5 0.166666666667 0.833333333333 0.5 -15.7708079973 4.89039734228 -35.2873540177 14.9854734261 3.31379484441 4.38782166548 -29.7733936079 29.006457808 -2.13137533544 -0.218936745921 -30.8436661028 37.2798419094 1.16503296407 3.80807015575 -26.7252336209 53.0774527758 0.40934863372 -1.68050542135 -18.8624237832 51.2435580557 0.237802233269 1.00709051308 -18.3809382582 48.2297757761 -0.15229969426 -0.535651613737 8 1 10 7 6 11 4 3 1 1 3 3 3 3 6 4 2 3 7 3 2 2 8 3 1 3 9 7 7 7 8 3 1 4 7 2 2 4 6 3 3 4 4 3 5 9 9 1 2 1 6 0 225.0 1.0 95.0 0.852631578947 0.185777777778 0.196740740741 0.0841829135802 0.084078266118 0.0459190781893 0.0319996193361 0.00906858855906 0.0121385421198 0.0190678625364 0.666666666667 0.8 0.0 4.0 3.0 1.0 0.0 4.0 3.0 2.0 1.0 14.0 0.342105263158 0.0 2.0 3.0 0.422222222222 0.25 0.625 0.75 0.875 0.625 0.3125 0.0625 0.25 0.625 0.0625 0.0 0.0625 0.5625 0.625 0.4375 0.625 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.75 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -2.97089227105 5.68713663315 -13.7987491042 16.9876958983 -9.85317642352 4.96393657174 -47.0240168169 34.7302935458 0.745751596391 -0.089292341669 -44.1749408058 33.6720481341 4.10113239274 -2.09611750254 -16.1895590413 18.2235327218 -0.340511507264 -0.458182662996 -10.6875991844 11.0696714307 0.383493112442 0.0819248399243 -5.02236497727 9.52394886285 0.512105204316 -0.252162619924 3 2 3 2 3 4 2 4 1 12 1 10 3 5 8 3 9 3 9 2 10 3 9 3 9 3 9 3 8 6 6 5 5 0 168.0 0.857142857143 70.0 0.657142857143 0.166170634921 0.16156462585 0.0482211609842 0.0869641507397 0.0313301411835 0.0135947666971 0.00888264904855 0.00054144639429 0.0411054934047 0.333333333333 0.142857142857 1.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 6.0 3.0 0.0 0.0 1.0 1.0 0.416666666667 0.583333333333 0.25 0.0 0.0833333333333 0.916666666667 0.833333333333 0.666666666667 0.75 0.666666666667 0.833333333333 0.583333333333 0.75 0.75 0.333333333333 0.0 0.166666666667 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.25 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -7.82132863194 6.18430636014 -14.5062545975 15.9330856428 5.88177276569 1.551644693 1.16128544879 21.9439250023 -2.13970454699 -0.0790140325554 -1.50066242376 22.0244455416 0.43972185728 0.551972702701 -0.923791690291 25.2461483467 1.17058730223 0.64582225491 7.90290282496 32.5191962934 -0.650611709588 0.89294653931 4.20802948422 41.4759994764 -0.0317114157159 0.0473990728414 1 2 3 5 5 2 6 3 5 4 1 32 2 3 6 2 5 4 5 4 4 4 4 4 3 5 3 5 3 5 4 3 5 2 6 1 16 176.0 0.363636363636 86.0 0.697674418605 0.230823863636 0.270144628099 0.0275974288012 0.340438785453 0.0657433467553 0.00314171096061 0.0193196315448 0.00498276207885 0.486595304944 1.25 195225786.045 2.0 3.0 2.0 3.0 0.0 4294967293.0 0.0 0.0 4.0 0.0 0.0 1.0 7.0 1.0 0.488636363636 0.0833333333333 0.166666666667 0.0833333333333 0.25 0.416666666667 0.333333333333 0.25 0.416666666667 0.75 0.333333333333 0.666666666667 0.75 0.75 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.32778517374 -5.2955190156 -6.56926658445 -8.58019177835 1.60506145839 6.50622059247 -4.56599505818 15.1124827751 -1.8624886569 2.23476759482 -7.22288086085 29.4311584139 2.04819252807 -1.33991901057 -0.472159240847 25.0884893824 -1.05573877619 1.20818484683 -2.30157575826 28.9278757875 0.49267563755 -0.92401501513 -0.376438912723 19.3771839881 0.102394285839 -0.504488409292 2 4 10 6 10 6 10 6 11 5 12 4 13 3 12 4 12 4 13 4 1 2 1 1 7 4 2 5 4 5 4 3 4 4 6 2 4 4 6 2 4 3 7 2 5 1 7 4 13 2 13 3 5 2 7 2 4 4 5 4 2 6 4 4 2 5 5 5 352.0 0.727272727273 125.0 0.8 0.137784090909 0.181689049587 0.0441250704358 0.125831265811 0.0589989390613 0.0172112596008 0.0258785597609 0.0195698843212 0.0941527200727 0.6875 0.545454545455 5.0 2.0 3.0 1.0 0.0 2.0 5.0 3.0 3.0 4.0 0.0882352941176 2.0 0.0 2.0 0.355113636364 0.791666666667 0.375 0.416666666667 0.291666666667 0.75 0.833333333333 0.708333333333 0.416666666667 0.0 0.208333333333 0.125 0.0416666666667 0.0 0.25 0.458333333333 0.416666666667 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.5 0.333333333333 0.166666666667 0.333333333333 0.5 0.166666666667 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.166666666667 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -10.2437908826 -5.03508365418 -23.041316355 -13.9996757582 2.5118022048 -2.14446637822 -15.3359726676 -18.0526947461 0.342426577364 2.80862606002 -13.8695545782 -8.96463897424 -2.66156951021 -1.43721357669 -25.8516833291 -7.45264792387 1.73879959566 1.94680864051 -17.5173264005 -3.60160206421 0.0220648916597 -2.59588099499 -14.3359966339 -19.5894523535 -0.224312156243 0.0281981308913 2 1 4 3 2 5 1 4 4 1 33 5 1 5 2 4 2 4 2 4 3 2 3 3 3 3 3 3 3 4 1 12 132.0 0.272727272727 63.0 0.698412698413 0.175505050505 0.273760330579 0.0151876026101 0.457698107104 0.0574403643877 0.00195258043258 0.0224819862238 0.00540909290082 0.906000414135 1.33333333333 195225785.955 2.0 2.0 1.0 2.0 0.0 4294967291.0 0.0 0.0 3.0 0.0 0.285714285714 0.0 4.0 1.0 0.477272727273 0.416666666667 0.166666666667 0.583333333333 0.5 0.666666666667 0.166666666667 0.916666666667 0.916666666667 0.666666666667 0.166666666667 1.0 1.0 0.333333333333 0.166666666667 0.916666666667 0.666666666667 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -4.62996198086 -4.74571103038 -8.13333672618 -6.50328619162 3.4413818649 6.94876938614 -2.7264147873 14.6886947763 -3.43993905351 -0.661863042303 -7.34761888896 20.2068376808 3.67480650836 0.902892696725 2.27404450343 21.0473023093 -2.55034126625 -0.620281873636 -2.61734636152 18.4292831404 1.69291170845 -0.154562261539 0.685370702476 13.5034454577 -0.291472987258 -0.182270593711 4 7 4 10 2 3 3 6 1 3 2 29 4 3 10 3 10 4 10 3 10 4 5 3 2 5 1 4 4 9 4 8 8 3 4 0 195.0 0.866666666667 107.0 0.551401869159 0.242603550296 0.231111111111 0.0760390431396 0.105313171159 0.044523339908 0.0179265158525 0.0108217646628 0.00372626491661 0.017322709388 1.0 0.266666666667 0.0 5.0 4.0 3.0 1.0 1.0 0.0 1.0 8.0 12.0 0.15 0.0 3.0 1.0 0.548717948718 0.5 0.875 0.8125 0.5625 0.625 0.625 0.125 0.6875 0.9375 0.6875 0.0 0.4375 0.8125 0.5 0.0 0.5625 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.25 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.25 0.75 1.0 0.5 0.0 0.0 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -8.74291154051 5.00807554262 -20.7117608151 15.9535882103 0.645108035999 6.12739457351 -18.3906180955 39.6316426789 1.34470024518 1.86043456822 -10.1567124372 49.1401742845 -0.413956087903 -1.89162491533 -10.215020751 35.2684879763 0.230427943855 -1.58203579205 -8.47849190251 16.3837655848 0.387246633804 -1.41240370778 -3.75883913446 -2.40156128485 0.113526320379 -0.408839167503 3 7 3 9 1 3 3 8 4 6 5 6 8 3 8 3 8 3 8 3 8 4 5 2 1 9 2 8 4 1 1 1 1 1 4 0 154.0 0.785714285714 77.0 0.584415584416 0.195985832349 0.216604823748 0.0645243607801 0.12197831263 0.0330671605338 0.0209507548461 0.0097422468356 0.00346834941007 0.0592026209325 0.727272727273 0.428571428571 0.0 1.0 2.0 2.0 1.0 2.0 0.0 1.0 6.0 11.0 0.121212121212 0.0 2.0 1.0 0.5 0.5 1.0 1.0 0.833333333333 0.75 0.416666666667 0.333333333333 0.75 0.5 0.0 0.0 0.5 0.75 0.166666666667 0.0 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 -10.8225361302 2.00080499887 -26.8756228514 9.1254077181 -1.03241909149 6.58892184229 -30.0749666244 32.8507834358 1.83181591474 0.862156351151 -19.2045399137 37.767682044 0.321802210239 -2.39350337435 -14.0403470942 22.7313478336 -0.0324567740167 0.226988733143 -13.6274521224 20.1187047389 -0.00358423980589 0.126558915718 -14.5657346868 18.7546101396 -0.107053691459 -0.407860853898 4 1 3 3 6 13 2 14 3 6 2 5 4 4 4 4 4 4 5 4 3 4 5 3 4 4 5 3 4 3 6 4 3 4 5 4 3 4 5 4 3 4 4 6 1 5 4 6 1 3 6 5 12 3 2 0 240.0 1.06666666667 127.0 0.606299212598 0.25546875 0.231388888889 0.105332682292 0.0838506221065 0.0592901475694 0.0282474617824 0.0111861978244 0.0123629167579 -0.0139327316253 0.25 0.8 1.0 1.0 1.0 1.0 1.0 3.0 3.0 3.0 2.0 9.0 0.105263157895 1.0 1.0 2.0 0.529166666667 0.625 0.5625 0.5 0.5625 0.8125 0.8125 0.6875 0.75 0.75 0.125 0.0 0.0 0.875 0.6875 0.5 0.625 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.994718394324 7.63943726841 -5.56528835586 19.6280519762 -4.08751547693 1.60398341085 -15.1911666238 24.0667865423 3.6272287252 -2.01721896255 -0.83555919976 12.976801865 0.351844684938 -0.657230892716 5.94367716381 6.43571898008 -0.67645503004 0.470290438889 1.72342772742 8.79165869904 0.351358596884 -0.0636172038846 0.640416993748 9.21850654205 -0.26026724723 -0.0208647563751 4 1 4 1 1 1 5 13 2 2 5 5 2 3 5 3 4 3 5 3 4 3 6 2 4 3 5 3 5 3 4 2 7 3 2 2 8 3 1 2 8 4 11 3 12 9 7 10 5 4 1 5 3 4 6 2 3 3 8 2 1 4 8 2 1 4 8 1 3 3 7 1 5 8 5 0 315.0 0.714285714286 130.0 0.938461538462 0.169523809524 0.19425547997 0.0484572580355 0.124978743996 0.0412136918259 0.0145991758489 0.0116740608311 0.00671755643507 0.0784741499881 1.6 0.761904761905 3.0 5.0 9.0 4.0 5.0 5.0 1.0 5.0 4.0 10.0 0.233333333333 3.0 3.0 1.0 0.412698412698 0.541666666667 0.5 0.458333333333 0.791666666667 0.375 0.541666666667 0.791666666667 0.416666666667 0.333333333333 0.25 0.458333333333 0.166666666667 0.75 0.333333333333 0.5 0.291666666667 0.0 0.333333333333 0.5 0.166666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.833333333333 1.0 0.5 0.166666666667 0.5 0.166666666667 0.666666666667 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 1.0 0.666666666667 0.833333333333 0.666666666667 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.5 0.0 0.0 0.5 1.0 0.833333333333 1.0 0.5 0.333333333333 0.0 0.0 0.166666666667 0.5 0.5 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.166666666667 0.333333333333 0.833333333333 0.166666666667 0.333333333333 0.0 0.0 0.166666666667 0.5 0.333333333333 0.833333333333 0.166666666667 -12.4292431748 3.57719681616 -26.7179570099 11.8472237457 4.19793718378 4.48500382554 -17.4043305126 26.7282141155 -2.0586037813 0.637033315582 -18.9886242575 41.1963480774 1.16722011271 5.03484365287 -11.4386788845 66.0587356978 1.97016270415 -1.33323543309 3.85220754291 68.276652617 -0.956926384311 0.842604955361 0.249573970363 64.0802319597 0.120287322529 -0.518573442685 0 5 3 5 2 5 4 4 3 4 5 4 2 4 6 2 3 4 6 2 4 3 6 2 4 3 6 2 3 4 6 2 4 3 5 4 3 4 4 4 3 13 2 13 3 12 4 4 3 1 3 0 210.0 1.07142857143 113.0 0.557522123894 0.250476190476 0.263265306122 0.102598963395 0.101570456754 0.0654642047295 0.0286017506981 0.011689686944 0.00953441762722 -0.00941829219801 0.333333333333 0.785714285714 1.0 0.0 2.0 1.0 3.0 3.0 3.0 0.0 6.0 3.0 0.108108108108 0.0 1.0 2.0 0.538095238095 0.875 0.625 0.5625 0.4375 0.5 0.5 0.5625 0.9375 0.1875 0.0 0.0 0.75 0.8125 0.5 0.625 0.9375 1.0 0.75 0.5 0.5 0.25 0.0 0.25 0.25 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.56507072526 -4.41389708842 -10.6182920171 -4.65419932607 -2.44235638892 8.69198195873 -15.1538423571 23.4331374897 3.66537056337 -0.0730032589666 1.28373042578 31.0780231519 0.3516162305 0.183470569802 8.12037378532 32.4771672511 -0.507389868944 1.60312153247 4.65021859299 44.1749319762 0.220749791731 0.193616972768 4.02530256504 52.2337578943 -0.137471938519 0.417800445594 12 1 1 8 3 5 1 5 4 4 3 4 4 3 5 3 4 2 6 3 3 3 6 4 2 2 7 4 1 3 8 6 10 5 10 5 10 4 12 3 12 2 13 2 13 2 13 1 13 2 12 3 10 5 10 5 9 5 9 0 330.0 0.681818181818 104.0 0.826923076923 0.132121212121 0.123553719008 0.0354627264379 0.0887308623424 0.0289651890809 0.0109462743955 0.00951036912704 0.00275245185752 0.0631263868309 0.4 0.363636363636 2.0 3.0 0.0 0.0 5.0 3.0 0.0 0.0 2.0 5.0 0.333333333333 0.0 5.0 2.0 0.315151515152 0.458333333333 0.125 0.0 0.166666666667 0.666666666667 0.75 0.333333333333 0.625 0.0833333333333 0.75 0.666666666667 0.291666666667 0.625 0.416666666667 0.0416666666667 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.5 0.5 0.666666666667 1.0 1.0 0.833333333333 0.5 0.5 0.166666666667 0.0 0.166666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 0.0 0.0 0.0 0.5 1.0 1.0 0.666666666667 0.333333333333 -8.50755513982 11.1119087541 -16.7502431162 23.8057266659 4.51744146887 -3.2651276304 -7.98620826753 21.1317072722 -3.12031037843 5.15919112748 -9.95203912414 38.36826096 3.2365379641 -0.202982363451 -2.29747490087 46.9859027117 -2.22296067979 0.987981596644 -4.14917496389 49.9884683284 2.16131057741 -0.135486230693 3.25887272817 52.808790963 -0.31095197821 0.0979739849419 6 2 8 6 4 9 2 3 3 4 2 2 5 4 1 10 1 4 8 3 9 3 10 2 9 3 10 3 5 2 2 4 3 3 3 8 4 8 8 1 5 0 192.0 0.75 84.0 0.857142857143 0.180555555556 0.197265625 0.0545428240741 0.115052964952 0.0414496527778 0.0160879727245 0.0127795624872 0.00678670563826 0.0627775305998 1.16666666667 0.25 1.0 6.0 5.0 2.0 1.0 1.0 1.0 1.0 2.0 12.0 0.27027027027 1.0 3.0 1.0 0.4375 0.25 0.75 0.916666666667 0.75 0.5 0.666666666667 0.416666666667 0.583333333333 0.583333333333 0.25 0.0 0.0833333333333 0.833333333333 0.5 0.0 0.0833333333333 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.75 1.0 0.75 0.5 0.25 0.75 0.75 0.25 0.5 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.75 1.0 0.5 0.0 0.5 0.5 0.0 0.0 1.0 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.75 1.0 1.0 0.75 0.75 0.5 0.0 0.0 -10.345071301 7.24154991068 -24.0905648318 21.2245192094 1.6475023406 5.9938000248 -16.3940062513 44.7670478732 3.32521536681 1.73336480044 1.76538443948 52.4227136481 -0.857130684229 -2.21255717428 -1.00691010842 37.7614065271 -1.02883847033 -0.462511094734 -10.4187797144 32.8238625935 0.0147802272171 1.51642339208 -13.9178126308 44.0181221831 -0.195135602435 -0.15952892459 4 5 3 8 2 2 5 3 1 1 7 2 8 3 8 3 7 4 3 2 4 2 2 3 4 2 1 3 4 8 3 15 1 5 5 0 143.0 0.846153846154 71.0 0.788732394366 0.240305149396 0.252824098978 0.0839557527904 0.132585689043 0.0560722958395 0.0208983001526 0.00788288083926 0.0090393101598 0.035239314962 1.0 0.461538461538 2.0 3.0 3.0 0.0 1.0 1.0 2.0 2.0 2.0 8.0 0.241379310345 1.0 2.0 1.0 0.496503496503 0.416666666667 0.0833333333333 0.5 0.916666666667 0.333333333333 0.0 0.416666666667 0.75 0.5 0.0833333333333 0.0833333333333 0.416666666667 0.75 0.666666666667 0.583333333333 0.583333333333 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.5 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.25 0.25 0.0 1.0 0.75 0.25 0.25 0.5 0.75 0.5 0.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.5 -0.195883006882 -2.74236209635 -4.11174081079 -5.26024879762 -4.92837009032 2.43173105585 -17.8901231685 5.48318588746 2.04076747589 2.29223102574 -14.2688652498 15.3825198395 -1.24712100019 -2.05334405215 -18.5952740065 4.69184522139 -0.669459530226 -0.759245538103 -25.0782898442 -7.94664587638 0.419051283668 -1.00410524391 -23.400456793 -17.4555362512 -0.130879611307 -0.107971334267 0 4 3 8 3 8 3 3 1 4 3 2 2 4 3 2 3 4 2 1 4 4 1 2 5 6 5 5 6 5 6 5 7 3 9 2 5 0 143.0 0.846153846154 72.0 0.555555555556 0.190718372537 0.19311457773 0.0558770292254 0.0878152606843 0.0335396912736 0.0152954645404 0.00739079341677 -0.000749558624227 0.0271555954224 0.0 0.538461538462 0.0 0.0 0.0 0.0 3.0 3.0 1.0 0.0 1.0 6.0 0.192307692308 0.0 3.0 2.0 0.503496503497 1.0 0.833333333333 0.416666666667 0.166666666667 0.666666666667 0.833333333333 1.0 0.75 0.0 0.25 0.916666666667 0.833333333333 0.666666666667 0.583333333333 0.5 0.166666666667 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.5 0.5 0.5 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.25 -8.8147353097 3.52589412388 -17.9541274389 10.5492567036 4.63860232866 3.03212985801 -4.51505690969 21.132498954 -0.540490603388 -0.0473641695154 -2.32405264858 22.563466327 -0.857386292829 0.0248019533033 -9.49556113249 20.8287978058 -0.280611255541 -0.324277945124 -14.3433151925 17.6120725027 -0.713129608949 -0.198638772003 -19.6569168766 15.9260529699 0.110225205506 0.112990851002 1 4 1 10 5 10 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 4 3 4 4 5 3 3 4 5 3 3 4 6 2 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 3 4 6 3 2 4 5 4 1 5 4 6 2 2 6 1 4 0 345.0 0.652173913043 115.0 0.791304347826 0.11652173913 0.181474480151 0.0344050482635 0.141462425687 0.0525026711597 0.0138622472844 0.024313021603 0.0171756312556 0.126247040005 0.0666666666667 0.565217391304 3.0 4294967295.0 4294967295.0 0.0 0.0 0.0 5.0 5.0 3.0 8.0 0.0697674418605 1.0 0.0 2.0 0.333333333333 0.708333333333 0.5 0.625 0.583333333333 0.458333333333 0.5 0.5 0.5 0.0 0.0416666666667 0.0416666666667 0.0 0.0 0.125 0.625 0.541666666667 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.833333333333 0.833333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -13.2859778581 -8.13766143809 -29.1140933864 -18.1239613792 4.76436672908 2.53601439361 -12.3832822256 -7.95639847805 1.11987517384 2.48474826404 -11.8638308032 6.46058562026 -6.28309022316 -0.413571061097 -36.693860627 8.77233283675 5.33873335687 0.52902250491 -13.3020589654 6.43326682833 -1.6517045481 -1.80028306872 -16.3257410612 -5.68449799295 -0.377856288962 0.189759378333 1 3 2 4 2 4 34 2 2 4 2 4 3 3 3 3 4 2 3 3 4 2 4 1 4 3 3 4 1 6 1 2 3 0 126.0 0.285714285714 50.0 0.86 0.130952380952 0.213151927438 0.0114143541014 0.371846092935 0.0472321203614 0.00158654626307 0.0277092087524 0.00529337368768 0.654203494168 1.33333333333 204522251.952 2.0 3.0 2.0 0.0 4294967294.0 4294967293.0 0.0 0.0 2.0 4.0 0.277777777778 0.0 3.0 1.0 0.396825396825 0.416666666667 0.333333333333 0.416666666667 0.416666666667 0.5 0.416666666667 0.833333333333 0.833333333333 0.5 0.5 1.0 0.833333333333 0.25 0.25 0.5 0.5 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.12287090676 -3.45593590714 -6.58227720276 -4.99912215358 3.73104143883 5.27649935076 -1.25388402137 15.0451379257 -4.19731304995 2.4775677945 -7.98616208448 29.6802580727 4.24515494672 -1.3045010058 2.35329369056 21.7597545615 -3.08213565122 -1.05891714497 -3.54230756631 9.33923576554 2.10221416012 -0.570637902259 0.282607191653 3.1400205604 -0.378344558576 0.0883997036362 2 4 9 6 9 6 11 4 11 4 11 4 11 3 12 3 12 3 12 3 3 3 6 5 2 4 4 4 4 3 4 3 6 2 4 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 1 6 4 6 1 1 2 1 4 1 1 1 1 1 330.0 0.681818181818 123.0 0.715447154472 0.146060606061 0.196694214876 0.0445084731614 0.141567075716 0.06025144002 0.0170041328148 0.024409928688 0.0193151540908 0.11052343338 0.266666666667 0.772727272727 2.0 2.0 4294967295.0 0.0 0.0 1.0 5.0 5.0 5.0 8.0 0.0869565217391 1.0 1.0 2.0 0.372727272727 0.666666666667 0.5 0.5 0.583333333333 0.75 0.625 0.625 0.541666666667 0.0 0.166666666667 0.0833333333333 0.0 0.0 0.25 0.625 0.541666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.333333333333 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -9.78079468456 -5.49807985227 -21.3942611742 -12.1209794797 3.7327872716 2.33901565877 -6.88312322321 -0.56407219839 2.2493128136 3.49003079671 1.45747987264 15.4378454854 -4.06248037233 -1.25587783976 -13.9372527733 19.3037220973 2.93238232996 3.06468570474 -2.22321051408 32.8161761546 -0.737680269261 -1.82243506031 -3.15961409569 26.4255145034 -0.30079753725 0.179396933756 4 2 10 7 9 7 10 6 11 4 13 3 12 4 12 4 13 3 13 3 13 10 6 4 3 4 5 3 5 3 5 3 6 3 4 2 7 3 4 2 7 2 5 2 7 2 4 3 7 2 5 2 7 2 4 3 6 3 3 4 6 4 1 6 6 4 2 1 2 1 10 0 368.0 0.695652173913 121.0 0.842975206612 0.126528532609 0.164224952741 0.0388171955584 0.118056830849 0.0513572589407 0.0152667809655 0.022191556621 0.017033950515 0.0900742387248 0.5625 0.521739130435 5.0 2.0 1.0 1.0 0.0 0.0 5.0 5.0 2.0 7.0 0.142857142857 0.0 2.0 2.0 0.328804347826 0.583333333333 0.333333333333 0.25 0.416666666667 0.833333333333 0.791666666667 0.75 0.5 0.125 0.166666666667 0.208333333333 0.0 0.0 0.166666666667 0.5 0.333333333333 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.666666666667 0.833333333333 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -10.3519910811 -2.15897140194 -23.5188406831 -5.3004045585 2.30296561691 0.660217661522 -15.7442347861 1.53723639001 1.04939198539 3.57718536142 -10.5051975242 14.5156276872 -2.08566276058 -1.98390955008 -17.0031777708 14.5991561343 2.08098313323 3.00585047541 -7.67039152209 26.7040984714 -0.731163361396 -1.41911151293 -8.09950736303 25.919784052 0.0286508915799 0.319135168326 3 3 4 5 4 6 3 6 3 7 3 7 2 6 3 5 3 5 3 5 5 3 6 1 7 0 108.0 0.75 59.0 0.576271186441 0.2170781893 0.22762345679 0.0468765876645 0.100412633999 0.0354644553676 0.00805959649164 -0.000563188079634 0.00143695111205 0.0314109542016 0.111111111111 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.166666666667 0.0 3.0 3.0 0.546296296296 0.444444444444 0.666666666667 0.444444444444 0.444444444444 0.888888888889 1.0 1.0 1.0 0.777777777778 1.0 1.0 0.888888888889 0.111111111111 0.444444444444 0.777777777778 0.333333333333 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.25 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 -7.00281749604 6.15399113289 -15.0778168917 13.3832129934 2.55974200139 -1.94080611159 -7.57631934089 8.66167891866 0.159216345462 0.604219788454 -2.94453829522 8.36148783526 0.110117262132 -0.0689859180553 -1.64520631766 7.75448695772 0.440669538992 -0.628214088172 1.41751616106 3.23339517528 -0.17428146372 0.227913243378 1.68408802019 3.0443727029 0.0983162604626 -0.0992196867318 1 2 4 3 4 19 2 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 6 1 5 3 1 4 0 112.0 0.4375 66.0 0.454545454545 0.176020408163 0.262276785714 0.0235940916545 0.210114682034 0.0335533208819 0.0045534178187 0.00820915763873 0.00260079594586 0.265109032804 0.571428571429 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 8.0 0.0 0.0 3.0 1.0 0.589285714286 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.75 0.5 0.25 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -9.07183175624 4.69507082121 -15.6404178605 11.9234875008 8.15233894048 0.930372548191 4.50646984593 15.3339247283 -4.27117410312 -0.701842311226 -4.03894226574 9.0802343086 1.13791058768 -1.59350680661 -5.72140518437 -1.06189864558 0.123310298351 0.570634447417 0.53011142312 2.95871043382 0.219897182666 1.05948822797 -0.551090384159 11.6358246612 -0.140711014046 -0.270103252849 14 1 6 6 2 4 3 4 2 9 2 3 4 7 2 3 6 3 5 3 6 3 5 3 6 3 6 2 6 3 7 2 4 3 8 3 2 4 7 4 13 2 14 4 13 12 6 12 4 7 1 6 2 6 5 4 2 5 7 4 1 3 10 2 2 3 10 2 3 5 5 3 5 10 10 2 10 0 391.0 0.739130434783 165.0 0.90303030303 0.176621032045 0.204047592572 0.053433699691 0.123109944045 0.0432513321169 0.0161256704442 0.0113907303306 0.00717734047911 0.0695470570001 1.70588235294 0.652173913043 4.0 10.0 10.0 5.0 4.0 5.0 1.0 4.0 4.0 15.0 0.212121212121 1.0 3.0 1.0 0.42199488491 0.433333333333 0.5 0.666666666667 0.8 0.3 0.2 0.566666666667 0.3 0.6 0.533333333333 0.466666666667 0.3 0.533333333333 0.1 0.2 0.533333333333 0.111111111111 0.444444444444 0.666666666667 0.333333333333 0.111111111111 0.444444444444 0.555555555556 0.666666666667 0.444444444444 0.888888888889 0.666666666667 0.666666666667 0.777777777778 0.888888888889 1.0 1.0 0.555555555556 0.333333333333 0.0 0.111111111111 0.555555555556 0.333333333333 0.777777777778 0.888888888889 0.444444444444 0.111111111111 0.0 0.0 0.111111111111 0.0 0.666666666667 0.555555555556 0.555555555556 0.666666666667 0.333333333333 0.444444444444 0.555555555556 0.0 0.666666666667 0.555555555556 0.444444444444 1.0 1.0 0.888888888889 0.444444444444 0.0 0.666666666667 0.888888888889 0.777777777778 0.777777777778 0.333333333333 0.222222222222 0.0 0.0 0.333333333333 0.888888888889 0.666666666667 0.555555555556 0.0 0.0 0.0 0.0 0.0 0.222222222222 -17.8253536263 2.10361316087 -41.6898094497 10.302240241 1.75388302538 7.3897496253 -38.3128350815 34.5795793441 0.0679255692985 0.547351861403 -35.3398051729 49.3082522642 -1.78549081425 3.08892447998 -41.8830073221 55.2722902776 1.68952923916 -4.35861370887 -33.0857937636 33.6329235395 -0.742237735161 1.18287528392 -39.3428078711 26.2486146105 -0.520261980862 -0.367467194629 1 2 3 5 3 6 3 3 2 5 5 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 4 2 2 6 3 3 2 6 3 3 2 6 3 2 3 6 3 1 6 3 5 1 3 6 1 3 0 182.0 1.07692307692 85.0 0.752941176471 0.211538461538 0.206255283178 0.104840320288 0.083369052153 0.0522210249598 0.0399933367616 0.0106416703915 0.0150958484457 0.00603309971819 0.428571428571 1.0 2.0 2.0 1.0 0.0 3.0 3.0 3.0 3.0 4.0 15.0 0.159090909091 1.0 1.0 2.0 0.467032967033 0.8125 0.75 0.5625 0.75 0.4375 0.25 0.25 0.375 0.3125 0.0 0.0 0.0625 0.6875 0.75 0.75 0.6875 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.82715971686e-16 3.0012074983 -4.73251558206 9.13919771869 -6.75689294841 3.02487193591 -25.6142675958 21.0204623387 1.69639643097 1.04315284099 -20.3303417258 26.4891404319 1.64052313537 -0.693573697279 -8.48089056306 21.7444372892 -1.09809104142 -0.335848847838 -12.372272347 18.6222093059 0.671113698729 0.624333901797 -8.20939215205 24.9302000511 0.147856893242 0.216786776155 8 1 8 1 1 1 1 4 4 10 3 12 3 5 2 4 3 3 4 4 11 3 10 4 7 1 2 4 5 3 3 3 4 3 4 3 4 3 4 3 3 5 2 6 2 6 1 5 196.0 1.0 97.0 0.752577319588 0.240160349854 0.245626822157 0.0892669880322 0.105015235999 0.0652032210219 0.0212094757144 0.0130615364662 0.0114819988784 0.00855802563387 0.714285714286 0.714285714286 2.0 4.0 3.0 0.0 2.0 2.0 2.0 3.0 1.0 6.0 0.2 1.0 2.0 1.0 0.494897959184 0.5 0.625 0.0625 0.5 0.625 0.5 0.25 0.625 0.75 0.5625 0.375 0.3125 0.4375 0.75 0.75 0.8125 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.25 0.25 0.5 -1.40965806739 3.77424579332 -8.06815999039 9.67521971614 -6.10496089289 1.05840357199 -23.5423333042 15.165416388 4.13182595671 1.35442210719 -10.1281210049 23.3350035095 -0.484743879332 1.46392779397 -5.63028327927 34.8824941244 -0.49570822512 0.94616900842 -13.4379073196 44.3158912895 -0.474710236644 0.396215860648 -15.078234405 49.4368024202 0.17420086004 0.0839143341055 6 3 9 9 5 5 4 2 3 5 5 3 2 4 6 8 7 8 7 8 8 7 8 3 1 3 7 3 2 4 6 3 3 4 3 5 4 10 6 6 1 1 3 0 210.0 1.07142857143 104.0 0.644230769231 0.229206349206 0.240136054422 0.104845697009 0.091621207213 0.0578844617212 0.0360015277752 0.0102338702724 0.0120040434016 0.000142044340026 0.533333333333 0.785714285714 0.0 2.0 3.0 1.0 1.0 3.0 3.0 2.0 4.0 10.0 0.236842105263 0.0 2.0 2.0 0.495238095238 0.375 0.875 0.9375 0.5625 0.75 0.4375 0.25 0.625 0.5 0.0 0.0 0.3125 0.4375 0.5 0.375 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.90460127052 2.419155135 -14.6797310456 10.357012476 -7.95180537005 7.06393299419 -42.8108645268 36.7928501742 -0.630084857305 1.78898644299 -49.0632113847 46.1762489495 0.931267844714 -2.55047750177 -45.4381576573 30.1035485591 -2.08198486271 -0.167410922783 -58.482336414 27.2246406491 -0.134598970143 1.88605994905 -62.2089467537 47.004390664 0.122047315352 0.469829920175 0 6 10 7 9 6 11 6 11 4 12 4 12 4 12 5 11 4 12 7 1 3 5 6 2 4 4 5 4 4 3 4 5 4 3 4 6 2 4 4 6 3 3 4 6 3 3 3 7 2 4 3 7 3 3 3 7 3 2 5 6 3 1 8 2 11 1 1 3 2 1 2 1 0 352.0 0.727272727273 152.0 0.611842105263 0.163174715909 0.227530991736 0.0489546663326 0.144805564279 0.060964766344 0.0176750086803 0.0190025865094 0.0172964736798 0.103818767917 0.6875 0.681818181818 2.0 6.0 1.0 2.0 0.0 1.0 5.0 5.0 5.0 6.0 0.111111111111 1.0 1.0 2.0 0.431818181818 0.791666666667 0.5 0.5 0.625 0.833333333333 0.875 0.833333333333 0.666666666667 0.0833333333333 0.25 0.125 0.0833333333333 0.0 0.25 0.416666666667 0.333333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.666666666667 0.833333333333 0.833333333333 0.5 0.333333333333 0.166666666667 0.166666666667 0.0 0.166666666667 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -13.4558270069 -7.95774715459 -29.4715340912 -21.0824137841 4.57125042784 -1.97167983219 -14.154368241 -23.127368051 1.40171004015 4.41287914875 -6.28980420459 -6.52429775427 -3.40579486198 -2.04478332875 -23.1462822405 -7.73577569377 1.19449863367 1.38952433638 -18.7872135603 -8.09432728226 0.633903712096 -2.13972715239 -11.7972543094 -21.9311532846 -0.273245316612 0.0117634602845 1 3 7 2 2 5 4 4 2 5 5 3 3 4 5 3 3 4 5 3 3 4 5 4 2 4 5 3 4 3 5 3 3 4 5 3 4 3 5 3 4 4 3 4 4 4 2 7 2 7 1 4 5 2 9 0 210.0 1.07142857143 102.0 0.705882352941 0.213650793651 0.226870748299 0.0937005722924 0.086858978512 0.0568123312817 0.0313375022508 0.0113828973243 0.0113404912964 0.00433879214529 0.2 0.928571428571 1.0 0.0 1.0 1.0 3.0 3.0 3.0 3.0 2.0 8.0 0.142857142857 0.0 1.0 2.0 0.485714285714 0.875 0.75 0.625 0.5 0.4375 0.5 0.5 0.75 0.0625 0.0 0.0 0.375 0.75 0.75 0.75 0.875 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -6.02666717841 -0.254647908947 -19.4918012448 2.1285831221 -6.67403875138 4.03928172014 -38.0913772465 15.5395814 3.66596578976 -0.151631826473 -27.818738949 16.6518015532 -2.07038356499 -0.822641581207 -36.9578980481 11.7742095931 -2.26098786377 0.825231529521 -57.7676122195 16.7268655691 -0.339809036918 0.2351542955 -69.6908234951 20.2699804281 -0.65597443241 -0.0405619403801 6 5 11 4 1 3 10 1 5 3 8 2 5 3 8 2 6 2 7 2 7 2 7 2 7 3 6 3 5 4 6 2 6 7 1 4 6 7 2 4 5 3 7 2 7 2 7 3 6 2 8 1 7 2 7 2 7 2 7 3 5 4 6 3 5 4 6 4 4 4 6 4 4 4 5 5 4 8 1 6 4 6 4 3 5 6 1 0 396.0 0.818181818182 148.0 0.844594594595 0.171296296296 0.201790633609 0.0607734542394 0.123364614928 0.0595889450056 0.0197046170809 0.020784684829 0.0159241353756 0.0682567406202 0.777777777778 0.954545454545 2.0 6.0 2.0 4.0 4.0 5.0 5.0 5.0 4.0 12.0 0.220338983051 1.0 1.0 2.0 0.373737373737 0.266666666667 0.566666666667 0.5 0.666666666667 0.333333333333 0.0666666666667 0.1 0.366666666667 0.533333333333 0.533333333333 0.466666666667 0.566666666667 0.133333333333 0.533333333333 0.233333333333 0.6 0.0 0.0 0.222222222222 0.333333333333 0.666666666667 0.444444444444 0.222222222222 0.333333333333 0.222222222222 0.555555555556 0.666666666667 0.777777777778 0.777777777778 0.888888888889 0.666666666667 0.888888888889 0.555555555556 0.333333333333 0.111111111111 0.111111111111 0.111111111111 0.222222222222 0.111111111111 0.222222222222 0.555555555556 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.222222222222 0.0 0.222222222222 0.333333333333 0.111111111111 0.0 0.222222222222 0.666666666667 0.888888888889 0.666666666667 0.888888888889 1.0 0.777777777778 0.666666666667 0.888888888889 0.111111111111 0.333333333333 0.444444444444 0.777777777778 0.777777777778 0.333333333333 0.333333333333 0.555555555556 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -8.07349620412 -5.87426426321 -23.5896449465 -15.206964615 -4.1651721508 -1.16095818368 -25.8550619961 -17.0280824079 9.97445851373 2.4213250838 10.1281498607 -6.47911992026 -4.98392429712 -0.567374285343 -3.52770649364 -5.27342833092 -0.280930330609 0.0826675473711 -20.5214413717 -8.12499264101 -0.481268692972 -0.611422293735 -17.99968568 -12.0096588708 0.325917751075 -0.0155537754468 4 7 4 8 2 3 3 5 1 3 3 16 1 4 5 1 2 4 8 3 9 4 8 4 9 4 4 3 1 4 4 3 2 9 4 7 2 0 168.0 0.857142857143 92.0 0.554347826087 0.233134920635 0.244897959184 0.0761450909729 0.118166909621 0.0419349287334 0.0203873925825 0.0107858295565 0.00442305825227 0.0321340629134 1.0 0.357142857143 0.0 5.0 4.0 3.0 1.0 2.0 0.0 2.0 6.0 10.0 0.111111111111 0.0 3.0 1.0 0.547619047619 0.333333333333 0.916666666667 1.0 0.666666666667 0.583333333333 0.75 0.583333333333 0.916666666667 0.5 0.25 0.0 0.416666666667 0.833333333333 0.416666666667 0.0 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.75 0.5 0.75 0.75 0.5 0.25 0.25 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -10.3678077214 2.1826963624 -25.6723597022 7.06599694129 -1.00782663672 3.22949971988 -29.8486075635 22.4439236435 0.733057800597 3.89767207572 -25.0806587401 43.9788251112 -0.177320270259 0.775708711746 -22.7919447828 49.29691897 0.874642701404 -1.61095706534 -14.3364760504 36.7567177695 0.880216512193 -0.0986649491615 -4.84440289305 33.5021396889 -0.0269747236447 0.208818176796 1 4 1 2 5 1 4 2 5 2 4 2 4 2 4 2 3 3 3 4 2 4 2 9 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 126.0 0.285714285714 69.0 0.623188405797 0.279100529101 0.2649281935 0.0242919331166 0.389833211356 0.057577675397 0.00157017711476 0.0130618239591 9.57265757181e-05 0.644431849225 1.0 204522252.143 0.0 1.0 1.0 1.0 0.0 0.0 4294967295.0 0.0 7.0 2.0 0.08 2.0 4.0 0.0 0.547619047619 0.25 0.0 0.0 0.25 0.666666666667 0.333333333333 0.333333333333 0.666666666667 0.833333333333 0.833333333333 0.75 1.0 0.916666666667 1.0 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.87954408985 2.84963136203 -3.79448404471 7.67506292582 0.818717361937 1.28396329859 -2.72696946824 13.3583734903 -0.885040153843 1.22407513311 -3.78722108329 22.6312809462 1.00807977943 1.94830732091 -0.368186196308 33.4451735263 -0.452144267871 -0.799966884531 -0.612715657802 29.5069409798 0.206797397535 -0.65498896785 -1.06042802584 17.3601238316 -0.0578469717503 -0.444993781229 4 7 6 2 1 5 3 3 4 4 1 4 4 4 1 7 1 3 1 4 9 4 9 4 10 3 10 4 9 4 6 1 3 4 2 1 1 2 3 10 5 6 3 0 182.0 0.928571428571 86.0 0.732558139535 0.196956889265 0.212715855573 0.0718160598006 0.102943850015 0.0414274169255 0.0234306361539 0.0128119036991 0.00535600145612 0.0332420738702 0.846153846154 0.5 0.0 3.0 5.0 3.0 2.0 2.0 0.0 3.0 3.0 11.0 0.171428571429 2.0 3.0 1.0 0.472527472527 0.3125 0.875 0.875 0.625 0.5625 0.5 0.3125 0.6875 0.5625 0.25 0.0 0.3125 0.8125 0.4375 0.0 0.375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 -10.2768620396 1.00040249943 -24.3588957146 5.03576853454 0.724317394071 4.42060974588 -21.8362470287 24.0853677733 1.52309869574 3.67594699599 -12.1375582759 44.5592090229 -0.209991699491 -0.0291955923628 -9.73376998662 44.6610733419 0.713256191461 -1.59001028617 -4.63258891187 29.8872302227 -0.0137757821245 -0.720938628439 -6.12021392432 18.5142458779 -0.369562757904 -0.189594103096 1 1 1 1 5 1 3 4 5 2 1 7 2 4 2 5 3 2 4 4 2 3 4 4 2 3 4 5 1 2 6 6 7 6 7 6 7 6 8 4 10 3 10 2 6 0 182.0 0.928571428571 81.0 0.679012345679 0.185545224007 0.181711145997 0.0589932799962 0.0751463697515 0.0435395271315 0.0153031797538 0.00939892237341 0.0036534751147 0.0166885474102 0.0769230769231 0.642857142857 0.0 0.0 1.0 0.0 5.0 3.0 0.0 0.0 3.0 7.0 0.310344827586 0.0 4.0 2.0 0.445054945055 0.8125 0.5625 0.3125 0.125 0.5 0.8125 1.0 0.8125 0.3125 0.5 0.75 0.625 0.5625 0.4375 0.0625 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.5 0.5 0.75 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.0 0.25 0.25 0.25 0.5 0.5 0.75 1.0 -7.45754590488 5.63863226954 -14.3903993019 15.3322348686 5.05676550967 2.38964418928 0.482725931491 22.6348353194 -0.671704502787 -1.28317311618 2.39284148369 17.6710025066 -0.55446201404 0.186221152055 -2.04456277658 15.3324156462 0.534996342306 -0.192096903656 1.08077725759 15.2409258802 -0.10240949274 0.279341195964 1.42384989401 15.6502289166 -0.00981247059811 -0.170091363855 8 1 9 4 5 9 2 3 4 3 1 4 5 6 8 4 8 4 8 4 8 4 8 4 7 1 1 4 5 2 2 4 3 3 4 6 8 1 1 1 3 0 180.0 0.8 72.0 0.819444444444 0.160185185185 0.188888888889 0.0584849108368 0.105092592593 0.0422427983539 0.0230559557062 0.01541884917 0.0103749498492 0.056664820259 0.666666666667 0.4 0.0 2.0 3.0 3.0 0.0 2.0 0.0 2.0 3.0 9.0 0.233333333333 0.0 2.0 1.0 0.4 0.0833333333333 0.75 1.0 0.75 0.416666666667 0.833333333333 0.666666666667 0.833333333333 0.416666666667 0.166666666667 0.0 0.25 0.583333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.483005585 4.92319290631 -22.8866263122 15.8538985571 3.74106072455 6.163611165 -9.39137819432 38.6129024492 2.37415266668 0.787526428664 6.99102594071 41.5282519776 0.186024603329 -2.93267791722 14.1317613492 21.4071475039 1.93110289242 -0.515539260189 28.868598486 15.3295261256 0.330538423417 1.6639722892 33.869583546 30.7450899069 -0.171950426867 0.180438763811 1 2 3 1 7 4 13 3 6 2 5 3 5 4 4 4 3 5 4 4 3 5 4 4 3 5 4 4 3 5 4 3 3 6 4 3 4 5 4 2 5 5 5 1 6 3 22 1 1 1 7 1 3 1 1 4 2 11 0 240.0 1.06666666667 138.0 0.528985507246 0.258072916667 0.264166666667 0.0983506221065 0.0954976128472 0.0493430989583 0.0232931449008 0.004784766503 0.00646994664462 -0.0154273104696 0.4375 0.933333333333 1.0 4.0 2.0 0.0 2.0 3.0 3.0 4.0 2.0 12.0 0.108695652174 0.0 2.0 2.0 0.575 0.6875 0.5625 0.625 0.9375 0.875 0.5625 0.4375 0.6875 0.625 0.0 0.0 0.3125 0.9375 0.75 0.75 0.875 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.37676093503 3.34225380493 -17.3411612495 11.7663926981 -8.90055368272 5.40318597817 -40.0046928289 29.2465323197 6.41345898996 -1.40798794519 -17.3420286653 21.6008225461 -0.379597557804 -2.92947941432 -8.09126633243 0.994807501718 -0.124181924426 0.391763997905 -9.24099525541 0.672831089315 1.21178737436 0.819516234784 3.32975062516 9.45767355185 0.186774521626 0.00560932420429 3 1 4 2 2 11 1 19 2 2 2 6 2 2 3 4 8 4 8 4 8 4 7 5 8 4 7 6 6 6 5 7 6 1 1 2 1 1 5 0 180.0 0.8 91.0 0.516483516484 0.177314814815 0.21037037037 0.0442611454047 0.109063100137 0.0262167352538 0.0116793167299 0.00353045119464 -0.00190389663156 0.0565694871714 0.333333333333 0.333333333333 3.0 0.0 1.0 0.0 1.0 2.0 0.0 0.0 3.0 6.0 0.2 0.0 2.0 1.0 0.505555555556 0.75 0.583333333333 0.416666666667 0.583333333333 0.833333333333 1.0 1.0 1.0 0.75 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.166666666667 0.0 0.166666666667 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -13.7509870831 8.06385044999 -27.7830116482 22.0233486854 7.20710170744 3.9849568329 -9.17429608687 37.3785998179 -2.52062446721 0.800143551395 -11.4901992257 43.8352407914 -0.148554794811 1.26369520604 -17.4679053512 53.0358897523 0.0810210179541 1.38494150928 -15.7337448239 65.6245742946 -0.227545528517 0.716463388796 -19.2954576504 75.8183334015 -0.196042243789 0.262206855933 1 4 10 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 10 5 4 3 4 4 4 4 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 6 3 3 3 6 3 3 3 5 4 2 4 5 11 3 9 2 1 3 6 330.0 0.681818181818 132.0 0.613636363636 0.16101010101 0.224931129477 0.0486329131536 0.159854217102 0.0681180677296 0.0172561693619 0.0249844527834 0.0200931068044 0.126891676864 0.333333333333 0.590909090909 2.0 1.0 1.0 0.0 0.0 0.0 5.0 5.0 2.0 6.0 0.195652173913 0.0 2.0 2.0 0.4 0.75 0.5 0.5 0.625 0.5 0.625 0.583333333333 0.541666666667 0.0 0.208333333333 0.0416666666667 0.0416666666667 0.0 0.291666666667 0.791666666667 0.708333333333 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -8.62330418934 -11.3144695907 -18.4436136582 -27.2385462808 4.13982215236 0.766179788025 -1.73987903502 -20.9297418671 2.4437504245 4.39913315853 5.22414436472 -0.106362825833 -5.07844648382 -1.16648864104 -12.1853159565 4.64833114416 4.64012253263 2.3160374384 7.58311961347 14.1061236034 -1.50448205915 -1.45367055055 5.53324287791 8.15012345054 -0.177075893424 0.0325471130343 2 3 1 5 4 11 4 4 2 5 3 3 5 4 2 3 5 4 2 3 6 3 2 3 6 3 2 2 8 2 2 3 7 2 2 3 6 3 2 3 6 2 3 5 2 4 3 9 5 6 8 4 10 4 10 4 10 4 10 4 9 6 7 7 7 0 294.0 0.666666666667 131.0 0.603053435115 0.188289601555 0.190314220926 0.0506045840058 0.12632464018 0.0324359763805 0.0160295743101 0.00353761889483 0.00171770185097 0.077931595694 0.714285714286 0.52380952381 1.0 2.0 3.0 2.0 4.0 5.0 2.0 0.0 2.0 11.0 0.142857142857 0.0 2.0 2.0 0.445578231293 0.541666666667 0.5 0.5 0.625 0.666666666667 0.458333333333 0.833333333333 0.833333333333 0.416666666667 0.0 0.333333333333 0.0833333333333 0.708333333333 0.416666666667 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.5 0.833333333333 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.5 0.0 -9.39772044924 8.85204635863 -18.0843539855 24.5204292507 6.20121689507 4.20288660863 -1.7208030278 36.7485810596 -2.43241193067 -2.08510265781 -6.77286716972 32.5966275977 -0.558590146305 1.96297375315 -11.6387409018 33.4315412149 1.5706668677 -2.51995590161 -1.63070171263 21.3020816384 -0.722697042049 0.200009373242 -4.84141170048 8.80462216398 -0.02363493607 -0.641184090422 4 1 13 2 10 1 1 3 10 6 10 4 12 3 12 3 12 3 12 3 11 4 11 5 2 3 6 4 2 4 4 4 5 2 5 3 5 3 3 4 6 2 4 2 7 3 3 2 7 3 2 3 7 3 3 3 6 3 2 3 6 4 2 3 6 4 1 5 4 5 1 1 1 3 4 1 4 1 345.0 0.652173913043 119.0 0.873949579832 0.127729468599 0.194076874606 0.0381983811707 0.148320076467 0.0566893448886 0.0149248506698 0.0245014883037 0.0185131330563 0.130519410985 0.6 0.695652173913 6.0 3.0 0.0 0.0 1.0 0.0 5.0 5.0 2.0 7.0 0.181818181818 1.0 0.0 2.0 0.344927536232 0.541666666667 0.583333333333 0.625 0.625 0.5 0.541666666667 0.541666666667 0.291666666667 0.0 0.0833333333333 0.166666666667 0.0 0.0 0.0833333333333 0.583333333333 0.583333333333 0.166666666667 0.666666666667 0.166666666667 0.0 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.166666666667 0.833333333333 0.666666666667 0.5 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.666666666667 0.5 0.5 0.666666666667 0.833333333333 0.5 0.166666666667 0.0 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 -13.2859778581 -7.52872078626 -29.6132448832 -16.955477122 3.84891513564 2.30516320304 -16.9707063849 -6.52010549137 0.521201199704 2.91757936038 -17.246051361 7.12271129303 -4.64564907991 -1.61448736665 -34.1800505884 5.33890016784 4.487619288 1.43984939464 -15.364871415 5.90263829717 -1.8454847655 -1.95288705732 -16.2549571383 -2.14997032956 0.17358775039 0.340790367077 4 4 5 4 1 4 3 2 3 4 2 2 5 4 2 1 5 4 8 3 9 3 5 1 4 2 4 2 3 3 4 2 3 3 3 2 3 5 1 18 2 3 1 0 156.0 0.923076923077 76.0 0.802631578947 0.236111111111 0.25 0.0844701950471 0.124147353715 0.0604659763314 0.0194453967183 0.0106476295566 0.00971355962585 0.0268479991606 0.833333333333 0.692307692308 3.0 4.0 2.0 1.0 2.0 2.0 2.0 2.0 6.0 9.0 0.205882352941 1.0 2.0 1.0 0.487179487179 0.5 0.25 0.166666666667 0.75 0.416666666667 0.0 0.416666666667 0.75 0.5 0.0 0.0 0.5 0.833333333333 0.666666666667 0.583333333333 0.75 0.25 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.56706405506 -1.56706405506 0.546142097743 -2.28255176452 -4.13556549442 2.42477662957 -9.43990546911 7.46746370687 2.4970642558 1.78159507482 -5.41745636509 19.1145668516 -2.11299077917 0.914852776406 -11.5551029237 28.5856309058 0.796346518119 1.43668602002 -9.35426331095 42.2372214905 0.556886936526 1.12153256706 -2.16354036644 55.8591290512 -0.0548286582039 0.212453156445 1 4 11 5 11 5 12 5 11 4 12 4 12 5 11 4 12 5 11 11 5 12 4 4 5 4 3 4 6 4 3 3 7 3 3 3 7 3 3 3 6 5 2 3 7 3 3 3 6 4 3 3 6 3 3 5 4 4 3 6 3 3 5 1 2 4 7 0 352.0 0.727272727273 142.0 0.676056338028 0.147372159091 0.210227272727 0.0452842339817 0.130411447572 0.057546568311 0.0168982854401 0.0186673485252 0.0163618047546 0.0925668609325 0.625 0.5 1.0 5.0 4.0 0.0 0.0 0.0 5.0 5.0 3.0 14.0 0.0816326530612 2.0 2.0 2.0 0.403409090909 0.833333333333 0.75 0.625 0.583333333333 0.541666666667 0.75 0.583333333333 0.625 0.0 0.333333333333 0.166666666667 0.0416666666667 0.0 0.291666666667 0.541666666667 0.541666666667 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.166666666667 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.666666666667 0.833333333333 1.0 0.666666666667 0.5 0.5 0.0 0.166666666667 0.166666666667 0.333333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -16.0023060963 -6.51088403558 -38.1392222045 -15.233168618 1.43502514804 1.98124586934 -29.7060281726 -1.17246382858 4.5571899344 6.20722066144 -10.6958983902 22.7469099856 -4.07059451467 -3.85344489965 -24.4594534299 16.3827106654 1.77273963281 3.42125837419 -19.6636814003 25.4438236701 0.194692125291 -2.03456528014 -13.0111310653 22.1044418942 -0.117681745149 0.406949874178 6 6 5 7 4 8 3 3 9 3 8 3 9 3 9 4 7 5 6 9 3 8 4 7 6 5 8 3 9 3 9 3 9 3 9 3 9 4 7 5 6 8 4 8 4 0 264.0 0.545454545455 111.0 0.540540540541 0.147727272727 0.200241046832 0.0269795058018 0.172457997242 0.0271223338759 0.00668755887632 0.00872223692497 -0.000763324430687 0.172669321583 0.75 0.0 2.0 2.0 5.0 0.0 0.0 0.0 0.0 0.0 2.0 6.0 0.166666666667 0.0 2.0 2.0 0.420454545455 0.0555555555556 0.611111111111 0.611111111111 0.5 0.444444444444 1.0 1.0 1.0 0.611111111111 0.666666666667 0.611111111111 0.555555555556 0.5 0.277777777778 0.166666666667 0.111111111111 0.0 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 1.0 0.666666666667 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.666666666667 0.833333333333 1.0 1.0 0.666666666667 0.5 0.833333333333 0.666666666667 0.166666666667 0.333333333333 0.833333333333 0.833333333333 0.166666666667 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.5 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.5 0.166666666667 0.0 0.0 -15.4524981111 1.9098593171 -26.7344491969 3.19514905289 13.8002043443 -1.06254757649 7.5079971998 5.97385466778 -7.20770264256 4.40272314009 -7.55580895904 20.0127123558 1.56082908447 -2.45482266658 -12.0576845506 14.6135448337 0.222948371735 0.552444307212 -4.43220449054 3.53390502659 -0.550274906254 -3.19676265984 -13.3721774789 -18.8061934902 -0.234478137711 0.0799306900394 5 1 9 2 7 8 2 10 1 31 1 3 8 3 8 3 8 2 9 3 9 4 8 6 6 4 4 0 165.0 0.733333333333 80.0 0.55 0.185123966942 0.206060606061 0.0507541531013 0.105110610235 0.0303564571333 0.0141695450145 0.00281553957327 0.00212534601443 0.0564550048072 0.545454545455 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 0.0 2.0 6.0 0.0869565217391 0.0 2.0 2.0 0.484848484848 0.25 0.833333333333 1.0 0.833333333333 0.583333333333 1.0 0.5 0.416666666667 0.75 1.0 0.25 0.0833333333333 0.5 1.0 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 -12.1382169931 10.3556816305 -28.1666781307 21.3584274903 2.01228436492 -4.67194030281 -19.2629831567 10.7647281695 3.67496963681 2.67337129523 2.25350871175 16.0911413581 -0.105291170001 -0.541174242982 5.62706655029 14.7183546808 -0.405674743966 -1.3177283202 1.56891169677 4.20247358566 -0.118427091838 0.502413246371 -1.40164109747 3.92169162601 -0.108160399621 -0.249653729916 6 1 4 9 1 9 2 8 2 3 7 3 7 3 7 3 7 3 8 2 7 4 6 4 4 7 4 1 2 1 5 0 140.0 0.714285714286 61.0 0.72131147541 0.175714285714 0.180102040816 0.0430481049563 0.111680393586 0.030139212828 0.0113092516112 0.00634640709114 -0.000191159389981 0.0667671284834 0.4 0.0714285714286 1.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 1.0 6.0 0.217391304348 0.0 4.0 1.0 0.435714285714 0.416666666667 0.333333333333 0.25 0.416666666667 0.75 1.0 0.916666666667 0.916666666667 0.833333333333 0.5 0.333333333333 0.666666666667 0.833333333333 0.25 0.0 0.0833333333333 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -6.45714340544 7.45754590488 -10.9441947562 20.2978137845 6.15739386248 3.40953504909 4.95956533796 32.1881091672 -2.83452425273 -0.60745351874 -0.598330124342 30.2979132411 0.530707446491 0.162512579525 -2.14737171114 30.2132920513 0.4719998562 0.684535898511 2.96430609294 34.9586658973 -0.257415814422 -0.0341083571861 1.48745758596 35.6956666312 0.0297026691041 -0.0100506700062 4 4 14 6 13 6 14 5 14 4 15 5 14 4 15 4 16 3 2 5 9 3 2 6 8 4 4 3 8 3 5 4 6 4 5 4 6 4 6 2 7 4 6 3 6 4 6 3 6 4 6 3 6 4 6 3 2 2 2 4 6 3 2 9 4 5 1 10 2 7 2 8 2 7 3 5 4 3 3 1 437.0 0.826086956522 175.0 0.617142857143 0.179212332892 0.22952940006 0.059995648113 0.135529538844 0.0674328598482 0.0199658706569 0.019719822685 0.017771672243 0.0741482474543 0.421052631579 0.739130434783 1.0 1.0 1.0 1.0 0.0 2.0 5.0 6.0 2.0 6.0 0.25 1.0 0.0 2.0 0.400457665904 0.266666666667 0.1 0.133333333333 0.533333333333 0.933333333333 0.766666666667 0.766666666667 0.866666666667 0.133333333333 0.266666666667 0.0333333333333 0.133333333333 0.0 0.333333333333 0.633333333333 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.444444444444 0.333333333333 0.222222222222 0.0 0.111111111111 0.333333333333 0.333333333333 1.0 1.0 1.0 0.888888888889 0.666666666667 0.777777777778 1.0 1.0 0.888888888889 0.888888888889 0.777777777778 0.666666666667 0.777777777778 0.777777777778 0.666666666667 0.666666666667 0.222222222222 0.222222222222 0.111111111111 0.111111111111 0.333333333333 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.888888888889 0.666666666667 0.444444444444 0.333333333333 0.0 0.0 0.0 0.111111111111 0.555555555556 0.888888888889 0.888888888889 1.0 -9.13410977745 -13.3966943403 -21.1251175853 -34.6654532065 1.12704774363 -2.45711058686 -19.2919878786 -37.1394165177 -0.387509270091 6.16064953466 -18.7867615092 -12.9231484541 -0.711184852779 -3.35189276714 -23.9257595084 -22.1676934913 -0.117912766002 0.495674725348 -23.4235057221 -23.6735600305 0.776614807459 0.823519786571 -16.9515893506 -18.0842661092 -0.0332237495374 -0.446742588124 0 5 2 5 1 4 4 2 2 4 4 2 3 2 5 1 4 3 4 1 5 2 3 1 6 3 2 1 6 5 8 4 8 4 9 2 81 2 8 4 7 4 8 3 8 0 252.0 0.571428571429 64.0 1.0625 0.0988756613757 0.0844671201814 0.0237187283791 0.0801541185257 0.0195205176427 0.00791055727426 0.00886626525194 0.00243754523619 0.0738141076621 0.666666666667 0.047619047619 2.0 4.0 2.0 0.0 5.0 2.0 4294967292.0 4294967294.0 5.0 2.0 0.384615384615 2.0 1.0 2.0 0.253968253968 0.5 0.0 0.0 0.277777777778 0.888888888889 0.444444444444 0.0 0.5 0.277777777778 0.777777777778 0.111111111111 0.277777777778 0.166666666667 0.5 0.0555555555556 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 1.0 0.833333333333 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.5 0.333333333333 0.666666666667 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 0.0 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 -5.21421908796 6.4874586327 -11.0737298789 11.9504187757 1.88078144606 -4.21814733528 -6.95926472165 5.92025040182 -0.762874219603 5.22463576299 -5.48497498346 20.1648987667 1.13040970678 -2.49178195909 -1.49405308246 16.1701871496 -0.415920677953 0.977894773883 -0.296076663461 14.9908265787 0.515449372058 -0.203761862323 1.79909297947 18.8978169271 -0.031579017905 0.145329591572 13 1 14 4 13 5 5 2 2 7 5 13 4 13 4 12 2 6 2 6 4 4 5 2 5 6 11 6 11 6 1 2 9 11 7 12 6 12 12 5 14 4 14 3 14 3 14 3 14 4 13 4 1 4 8 3 2 5 6 4 2 4 6 4 3 5 4 5 3 11 8 7 7 0 476.0 0.607142857143 208.0 0.644230769231 0.209713297084 0.207307923169 0.0536816833753 0.150072513558 0.0545404487796 0.0134881909247 0.0161619896939 0.00941150307226 0.104501340557 1.52941176471 0.285714285714 4.0 8.0 8.0 6.0 1.0 3.0 0.0 4.0 2.0 7.0 0.259259259259 1.0 3.0 1.0 0.436974789916 0.2 0.857142857143 0.257142857143 0.342857142857 0.514285714286 0.628571428571 0.428571428571 0.114285714286 0.685714285714 0.485714285714 0.514285714286 0.0857142857143 0.628571428571 0.142857142857 0.514285714286 0.685714285714 0.0 0.0 0.666666666667 0.916666666667 0.25 0.0 0.0 0.5 0.0833333333333 0.583333333333 0.916666666667 1.0 0.666666666667 0.0 0.0 0.75 0.166666666667 0.916666666667 0.666666666667 0.75 0.75 0.0 0.0 0.333333333333 0.0833333333333 0.833333333333 0.333333333333 0.416666666667 0.75 0.0 0.0 0.0 0.25 1.0 0.583333333333 0.333333333333 0.833333333333 0.0833333333333 0.0 0.0 0.583333333333 1.0 0.666666666667 0.166666666667 0.916666666667 0.333333333333 0.0 0.25 0.833333333333 1.0 0.416666666667 0.0 0.666666666667 0.833333333333 0.666666666667 0.833333333333 0.333333333333 0.5 0.0833333333333 0.0 0.166666666667 0.583333333333 0.833333333333 0.666666666667 -8.18511135901 10.140443517 -19.565911294 16.5126657639 0.962585800129 -10.7241083101 -12.3822844878 -13.3123159577 4.08868677123 2.93803175353 5.69901576131 -11.7754005332 -1.80241378075 1.31739197279 3.62698521428 16.4252049964 1.14194088516 5.04220411898 4.99609943151 38.8360205749 -0.592004874911 -4.69141207222 6.60234246113 22.8309508804 0.2616624485 1.01807761676 1 0 7 2 6 4 10 3 6 3 11 4 4 5 2 4 4 4 4 5 1 5 3 6 3 5 1 6 3 4 5 3 2 7 2 4 5 3 1 8 3 2 6 2 1 9 6 2 4 1 1 10 5 3 5 11 4 4 4 11 3 5 3 13 1 6 2 7 0 299.0 1.76923076923 128.0 0.71875 0.190490039261 0.160535117057 0.131548138355 0.0386543677412 0.0432331512681 0.0553129265724 0.00935797290543 0.00841670061589 -0.0133266787187 0.260869565217 1.69230769231 0.0 3.0 1.0 1.0 6.0 6.0 6.0 3.0 4.0 13.0 0.191489361702 0.0 4.0 3.0 0.428093645485 0.916666666667 0.5 0.291666666667 0.0416666666667 0.458333333333 0.25 0.666666666667 0.541666666667 0.75 0.708333333333 0.708333333333 0.375 0.333333333333 0.208333333333 0.291666666667 0.375 1.0 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.833333333333 0.666666666667 0.666666666667 0.5 0.5 0.666666666667 0.833333333333 1.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.666666666667 0.5 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.5 0.666666666667 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 0.5 -8.69124384884 11.6252306258 -20.2085265192 27.0075025457 1.55484451021 -1.2783672457 -12.781451727 24.2931105819 2.72690923895 -0.842713450967 -0.519840083387 13.9796223887 -2.13815652801 -0.800011980579 -7.90045438706 13.7241694001 0.801847309195 2.14134532488 -5.31406630227 20.4491223888 0.755782439895 -2.24862805502 4.79885039103 13.1212037999 -0.00915819451121 0.656808920892 4 8 4 3 1 5 3 4 2 5 1 5 1 6 1 11 2 3 4 1 4 4 9 4 10 3 10 4 6 1 2 5 4 2 2 11 3 10 5 5 4 0 182.0 0.928571428571 100.0 0.59 0.240490278952 0.243328100471 0.0787976514489 0.10747228861 0.0412887438609 0.0196279609516 0.00878821528048 0.00191310098862 0.0142074340165 0.769230769231 0.428571428571 0.0 2.0 5.0 3.0 2.0 2.0 1.0 1.0 4.0 14.0 0.108108108108 1.0 3.0 1.0 0.549450549451 0.375 0.8125 0.875 0.6875 0.75 0.5625 0.3125 0.8125 0.75 0.5 0.0 0.5 0.875 0.4375 0.0625 0.5625 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.0 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.0 -10.4587534032 2.41006056682 -25.5898019738 8.54997582344 -0.496025172493 4.40135338979 -27.5226626139 26.0482429762 1.25032793738 2.00326945261 -19.6830356265 37.0074647546 -0.0816407371051 -0.795719377701 -17.5233252716 32.2265523222 0.054258584149 -0.630188884467 -18.3436602911 23.5039265852 -0.670019359011 -0.876479865178 -26.4760688354 11.3701503304 -0.329866252595 -0.374941967581 5 4 7 9 4 9 2 3 4 9 1 7 1 5 1 5 2 3 10 3 10 3 10 4 9 5 5 3 1 5 2 5 1 10 5 7 8 1 1 1 5 0 195.0 0.866666666667 101.0 0.633663366337 0.21775147929 0.230085470085 0.0714113184646 0.105622279539 0.0417065695646 0.0191915784148 0.0087346815269 0.00524270493829 0.0276861672177 1.07692307692 0.4 0.0 5.0 5.0 3.0 0.0 3.0 0.0 1.0 5.0 10.0 0.341463414634 0.0 3.0 1.0 0.517948717949 0.3125 0.875 0.8125 0.875 0.6875 0.4375 0.0625 0.625 0.8125 0.625 0.0 0.375 0.625 0.5625 0.0 0.5625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.75 1.0 0.5 0.25 0.5 0.25 0.0 0.0 1.0 1.0 0.5 0.5 0.75 0.25 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 -11.28939063 5.34760608789 -28.9985133961 16.4263038191 -2.51931664585 5.60225399683 -37.2721645238 38.1119188137 1.87894527054 1.46121371476 -26.4054143823 43.9910351669 0.864789161197 -2.7360002892 -17.3006473453 24.8434661227 0.115471007933 -1.34287549949 -13.4955830723 9.50144732503 0.680052766076 -0.0596620569046 -5.83172941277 3.28080309925 0.22216665887 -0.436159068478 9 1 8 6 4 8 3 3 3 3 3 3 4 1 3 4 9 2 10 2 9 4 8 4 6 8 4 6 8 3 9 4 8 3 9 3 9 3 9 3 9 4 8 4 6 7 5 7 5 1 3 1 7 0 276.0 0.521739130435 98.0 0.765306122449 0.125603864734 0.168399495904 0.0237737017859 0.157432283058 0.0253722120246 0.00672771529721 0.00858592829804 0.0002124759696 0.160761628571 0.75 0.130434782609 3.0 3.0 3.0 0.0 2.0 0.0 0.0 0.0 1.0 10.0 0.25641025641 1.0 4.0 4.0 0.355072463768 0.0555555555556 0.333333333333 0.555555555556 0.444444444444 0.444444444444 0.888888888889 1.0 1.0 0.555555555556 0.611111111111 0.555555555556 0.555555555556 0.333333333333 0.111111111111 0.111111111111 0.0555555555556 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.666666666667 0.833333333333 0.5 0.5 0.0 0.333333333333 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 0.833333333333 0.666666666667 1.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.333333333333 0.166666666667 0.666666666667 0.5 0.166666666667 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -12.455604242 4.59473400926 -19.9774636261 12.1153065808 13.0345112167 2.16232010462 11.6165725393 23.4461861349 -7.4227130216 2.24888232791 -3.00479768879 29.3824508322 3.30716969369 -2.85023846985 1.77624068815 16.0030931599 -0.328926482683 0.370223131687 7.27496708545 9.73918969557 -0.726543833513 -0.816204609331 -1.02292549385 6.26526721705 0.145642742427 0.0990584051217 0 6 3 4 1 6 2 5 3 4 3 3 5 4 1 1 9 5 9 5 10 5 9 5 8 7 6 3 1 5 5 3 1 6 1 5 3 11 4 4 1 0 182.0 1.07692307692 97.0 0.556701030928 0.244113029827 0.252324598478 0.0895502878959 0.102001835262 0.0584984692882 0.0199673838817 0.0105225386144 0.00796343861404 -0.00346723240227 0.714285714286 0.615384615385 3.0 2.0 2.0 3.0 3.0 1.0 0.0 3.0 2.0 11.0 0.272727272727 0.0 3.0 1.0 0.532967032967 0.6875 0.0625 0.0625 0.625 0.8125 0.75 0.625 0.625 0.375 0.75 0.9375 0.5625 0.6875 0.0625 0.4375 0.9375 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.25 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.25 0.25 0.75 1.0 1.0 1.0 1.0 -2.63742477124 1.41357985843e-16 -4.9073268783 1.57907539677 1.94373194348 2.38314806915 0.012298355909 9.90484775492 -1.01737669087 0.230905820929 -3.03463287012 11.8067207605 -0.2874111253 -0.654542949284 -5.38370001131 7.78278513433 0.570303853337 0.24697315678 -1.75581092518 9.48364116065 -0.122645616615 0.692241898475 -0.530278044096 18.8519660953 0.101449260524 0.370854596578 1 3 2 6 2 12 3 12 2 12 2 4 2 6 3 3 2 6 3 3 2 6 3 2 4 5 2 3 4 5 3 3 3 5 2 4 2 6 1 5 2 13 2 8 1 2 4 4 1 0 196.0 1.0 138.0 0.398550724638 0.336370262391 0.319241982507 0.0996570040969 0.104040408333 0.0474998725021 0.0106315911433 -0.000505997208626 0.00136204638101 -0.0559797123588 0.428571428571 0.857142857143 3.0 2.0 1.0 0.0 1.0 2.0 3.0 3.0 2.0 7.0 0.222222222222 0.0 1.0 2.0 0.704081632653 0.8125 0.625 0.5625 0.8125 0.875 0.625 0.375 0.5625 1.0 0.8125 0.5625 0.625 0.875 1.0 1.0 1.0 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.25 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 -0.454728408834 5.91146931484 -6.09390090767 15.1207094105 -6.47663176582 1.44306668518 -22.0849624315 21.4102041189 4.50730359392 0.369218256152 -8.28623591474 22.644823635 -0.946188575629 0.143034365107 -5.64238032881 25.1102784494 -0.38908441896 0.918657657531 -14.2918043254 30.7639356572 -0.835661693651 -0.20425491226 -20.2634747217 31.0644917653 0.0235945650709 0.0261376367995 4 6 3 1 4 4 1 2 5 6 1 1 2 14 1 10 1 2 9 2 9 2 9 3 9 2 9 5 8 5 3 0 143.0 0.846153846154 65.0 0.723076923077 0.18118245391 0.179128563744 0.0654796325978 0.0879041736785 0.0246138525761 0.0221690247761 0.00410910944039 0.00082584941704 0.0357202168705 0.909090909091 0.307692307692 0.0 2.0 4.0 0.0 2.0 2.0 0.0 0.0 0.0 8.0 0.166666666667 3.0 3.0 1.0 0.454545454545 0.5 0.916666666667 0.75 0.583333333333 0.416666666667 0.666666666667 0.0833333333333 0.583333333333 0.333333333333 0.583333333333 0.0 0.416666666667 0.666666666667 0.666666666667 0.0 0.166666666667 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.25 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.5 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.25 0.25 0.75 1.0 0.5 0.0 0.0 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.0 -9.20650132347 4.89707517206 -23.7630492313 9.79764241411 -2.28336996188 -2.28336996188 -31.7502394326 7.46172446679 1.06905443429 4.0162497607 -25.7978520235 24.536049844 0.214823699299 0.859236845671 -23.1925814513 32.3093168996 -0.713152359852 -1.5240556997 -27.7709282145 21.5173052063 0.0937422351779 0.168383542957 -26.0393822056 18.970929367 0.281960154307 -0.00449778341632 8 5 6 7 5 8 4 3 10 2 11 2 10 3 10 3 10 3 8 1 1 4 6 9 6 5 9 3 10 3 10 3 10 3 10 3 10 3 10 3 9 5 8 5 7 7 5 0 286.0 0.590909090909 93.0 0.709677419355 0.128294782141 0.152574698029 0.027989682331 0.134280678488 0.0287896855455 0.00805100416563 0.0126421139358 0.00056940983797 0.120525814779 0.538461538462 0.0454545454545 2.0 0.0 5.0 0.0 0.0 1.0 0.0 0.0 5.0 1.0 0.147058823529 1.0 3.0 1.0 0.325174825175 0.0 0.375 0.416666666667 0.333333333333 0.416666666667 0.791666666667 0.833333333333 0.833333333333 0.458333333333 0.166666666667 0.166666666667 0.0833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.833333333333 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.666666666667 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -11.1119087541 2.34391825281 -17.5987433965 6.341855378 11.9355445527 1.76511321747 11.6555794456 17.2595687683 -6.43527874237 3.66120826216 0.687569540305 33.0975444645 3.42864386008 -0.67575110367 6.82179584553 35.6511377862 -0.711482575162 0.595655971438 10.568812643 31.4613744216 -0.279694744068 -1.77208074257 4.51902432549 22.1914338337 0.0792126441749 0.29571915197 13 1 5 5 2 4 3 2 3 7 2 2 5 6 2 2 5 3 5 2 5 3 4 2 6 3 5 2 5 3 6 2 3 2 8 3 1 2 9 2 12 3 11 5 11 10 6 4 2 4 4 2 6 4 2 3 6 4 1 3 9 2 1 4 8 1 2 4 7 3 2 6 2 4 4 10 3 0 330.0 0.681818181818 134.0 0.970149253731 0.184848484848 0.208402203857 0.0548021537691 0.14835743106 0.0488692712246 0.0165700272864 0.0155411459883 0.0083996310489 0.10161332885 1.86666666667 0.727272727273 4.0 7.0 8.0 5.0 4.0 5.0 2.0 5.0 5.0 11.0 0.237288135593 1.0 3.0 1.0 0.406060606061 0.291666666667 0.375 0.458333333333 0.791666666667 0.333333333333 0.375 0.666666666667 0.333333333333 0.333333333333 0.291666666667 0.25 0.0833333333333 0.666666666667 0.416666666667 0.416666666667 0.583333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.166666666667 0.166666666667 0.166666666667 0.0 0.333333333333 0.666666666667 0.5 0.0 0.5 0.5 0.5 0.166666666667 0.833333333333 0.833333333333 0.666666666667 0.5 0.833333333333 0.833333333333 0.833333333333 0.5 0.666666666667 0.333333333333 0.5 1.0 1.0 1.0 0.666666666667 0.5 0.166666666667 0.0 0.166666666667 0.666666666667 0.666666666667 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.833333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.166666666667 0.0 0.5 0.166666666667 0.5 0.166666666667 0.0 0.166666666667 0.5 0.0 0.333333333333 0.0 -9.60717111027 -0.983866920932 -20.9975718468 -0.38677774235 2.69355691066 2.93163166024 -15.9512125676 10.6924407579 -1.86853858246 2.31176875863 -19.0043338334 31.763492102 0.734373624118 4.489441575 -15.6688712717 56.3153458556 0.715844638081 -1.71165143955 -11.4229940265 50.9394515329 -1.36493556303 -0.602488732096 -20.4317911814 33.6179717234 0.151556885675 -0.603217761818 1 8 5 1 2 11 5 5 4 6 4 8 4 5 3 10 2 5 3 11 2 4 4 11 2 3 4 12 1 4 3 18 3 17 4 17 3 18 3 17 4 17 4 18 3 17 5 11 2 4 4 10 3 4 4 9 4 5 4 6 5 6 5 4 6 9 7 2 2 13 1 12 0 462.0 0.954545454545 124.0 0.983870967742 0.10224695939 0.130952380952 0.048490430005 0.0769965535735 0.0326694366583 0.025194271307 0.0160005438911 0.0111403271588 0.0458490841009 0.666666666667 0.590909090909 2.0 5.0 4.0 3.0 5.0 2.0 1.0 5.0 1.0 10.0 0.31914893617 4.0 2.0 1.0 0.268398268398 0.194444444444 0.555555555556 0.611111111111 0.611111111111 0.527777777778 0.0833333333333 0.0 0.25 0.166666666667 0.0 0.0 0.444444444444 0.416666666667 0.0833333333333 0.0555555555556 0.361111111111 0.0 0.0 0.111111111111 0.333333333333 0.555555555556 0.777777777778 0.888888888889 0.777777777778 0.0 0.111111111111 0.666666666667 1.0 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.333333333333 0.777777777778 0.888888888889 0.444444444444 0.222222222222 0.0 0.0 0.222222222222 0.777777777778 0.666666666667 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 -21.3556996367 -5.09295817894 -57.1544475014 -8.26096767565 -8.17788558452 6.58502082349 -83.8161960718 18.2149688207 4.5318127597 4.45335593755 -55.0726312882 42.6821610096 5.79148816279 -1.88235301453 -10.8180292625 32.3034558744 -0.155719974581 -1.55327029199 -5.68419345076 16.410754705 -1.46128629129 0.0574136166859 -17.4548331548 11.9364239468 0.331931290186 -0.236840706495 3 4 5 8 2 3 3 4 1 3 3 4 9 2 8 3 7 4 4 7 3 8 2 2 4 3 1 4 2 4 1 22 1 1 2 2 1 1 2 1 154.0 0.785714285714 90.0 0.588888888889 0.281582054309 0.299628942486 0.0767220003811 0.145899639237 0.0604266285241 0.0120254168785 0.00367662860317 0.00476402127399 0.026313506377 1.09090909091 0.5 2.0 3.0 4.0 0.0 1.0 1.0 1.0 1.0 7.0 15.0 0.230769230769 0.0 3.0 2.0 0.584415584416 0.666666666667 0.25 0.25 0.916666666667 0.583333333333 0.0833333333333 0.5 0.75 0.666666666667 0.166666666667 0.583333333333 0.583333333333 0.833333333333 0.75 0.916666666667 0.916666666667 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.75 1.0 0.75 1.0 1.0 0.5 0.25 0.75 1.0 1.0 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 -1.54607659004 -2.36458772594 -6.55120252806 -2.61559505005 -3.83039083156 4.83496940821 -17.3984175858 15.2685161044 1.6592331315 1.57862347761 -14.0328518544 24.1905801455 -1.06660767997 -1.74020533438 -17.6589359487 14.147706455 -0.352502690935 -0.441448190685 -20.3291993878 3.74046196113 0.837592710935 -1.50253122141 -14.6750708207 -11.2536476254 -0.159137396208 -0.216161450678 4 1 11 3 3 4 2 4 2 5 1 8 2 1 1 8 7 5 8 4 8 5 8 5 8 4 8 4 9 4 9 3 10 0 169.0 1.0 68.0 0.691176470588 0.130177514793 0.165680473373 0.0481075592591 0.0679948181086 0.016806134239 0.0202083819766 -0.000627329567008 -0.000658405998663 0.0284292615234 0.153846153846 0.230769230769 2.0 0.0 0.0 0.0 2.0 1.0 0.0 0.0 2.0 6.0 0.2 0.0 3.0 3.0 0.402366863905 0.375 0.6875 0.6875 0.875 0.6875 0.9375 0.6875 0.25 0.375 0.375 0.0 0.0 0.5625 0.0625 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.25 0.5 0.0 0.25 0.75 1.0 0.75 0.5 0.75 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 -12.6344539439 8.22708628906 -28.1351245656 19.0087055872 3.12601461279 -1.0362095157 -20.5286276705 17.4696411156 -0.598667053999 0.606104998082 -18.0699419346 18.8049178581 -0.326973126553 0.920834607304 -20.8686511516 24.6528888834 0.0535605082411 -0.0546110433694 -21.5234857912 26.2788194541 -0.448037082976 0.471475178187 -23.1078139493 29.8761279743 0.214050356227 0.0175665420531 6 5 5 5 4 3 1 8 1 8 3 6 2 6 3 5 2 5 4 5 4 4 2 3 6 4 5 4 2 3 6 4 6 3 2 3 7 3 6 3 2 3 7 2 7 3 3 2 7 2 7 3 2 3 7 2 7 3 2 3 6 3 7 3 2 4 4 5 5 10 4 2 2 1 5 4 2 1 1 2 14 4 1 0 336.0 1.71428571429 155.0 0.722580645161 0.223958333333 0.192602040816 0.175336150085 0.0488328702017 0.0503494366497 0.0812533759065 0.0093688916752 0.0186923470046 -0.0227261779243 0.25 2.0 2.0 2.0 1.0 1.0 5.0 6.0 6.0 7.0 5.0 15.0 0.203389830508 2.0 5.0 3.0 0.46130952381 0.583333333333 0.583333333333 0.458333333333 0.625 0.708333333333 0.166666666667 0.0 0.208333333333 0.666666666667 0.666666666667 0.375 0.458333333333 0.666666666667 0.25 0.166666666667 0.25 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.333333333333 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.333333333333 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.666666666667 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 -1.48544613552 13.1568086289 -7.05088820034 26.6062344672 -7.06029011438 -7.44491456019 -43.2875702182 3.02860968173 -9.38777253431 -0.713014554401 -80.6424175344 -7.04170670325 6.74617122422 1.83648185037 -49.5083466764 6.17750770474 1.15675546168 0.542430554409 -24.0414600873 11.6297907914 -0.491766913208 -0.409298378887 -34.7424187057 10.3934712284 -0.400223808008 0.0711226608386 1 3 4 6 7 3 3 1 5 1 3 3 4 1 3 3 4 2 5 6 7 5 8 6 5 7 4 1 2 4 8 3 4 2 9 2 7 5 3 1 2 3 0 165.0 0.733333333333 97.0 0.628865979381 0.265013774105 0.277575757576 0.0622520522025 0.138570498372 0.0525726688371 0.00924049654999 0.00456104658917 0.00311788028564 0.0421663958738 1.18181818182 0.4 2.0 3.0 3.0 2.0 1.0 2.0 0.0 1.0 5.0 14.0 0.162162162162 0.0 3.0 1.0 0.587878787879 0.5 0.833333333333 0.25 0.583333333333 0.666666666667 0.666666666667 0.5 0.333333333333 0.75 0.583333333333 0.75 0.5 0.833333333333 0.666666666667 0.916666666667 1.0 0.0 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 0.75 0.5 0.75 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.5 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.5 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 0.5 0.5 1.0 1.0 0.5 1.0 1.0 1.0 0.5 0.25 0.75 1.0 -6.53596299631 2.7162443621 -17.9711321145 8.4632983325 -2.71850789907 3.20969542122 -23.9088420443 21.8748669657 3.42210740703 1.6483914551 -9.87079229647 28.7681346726 -0.559566757 -1.51887227963 -6.19381342145 21.0448214468 0.5183811642 -0.041892305482 -4.18257626491 14.8237217719 0.17116976075 -1.01868788415 -0.156723301849 4.08247635929 0.130575134264 -0.318564120269 5 1 11 2 8 2 3 3 2 2 5 7 5 15 1 3 9 3 9 3 9 3 9 4 6 1 2 3 5 2 3 8 5 6 3 0 168.0 0.857142857143 68.0 0.941176470588 0.157242063492 0.204931972789 0.0601208613406 0.107749399363 0.042995744925 0.0229589662011 0.0122027971575 0.00926392212584 0.0588901022249 1.0 0.357142857143 0.0 6.0 4.0 2.0 1.0 2.0 0.0 2.0 0.0 5.0 0.24 0.0 3.0 4.0 0.404761904762 0.166666666667 0.916666666667 1.0 0.75 0.25 0.5 0.333333333333 0.666666666667 0.333333333333 0.25 0.0 0.25 0.25 0.416666666667 0.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.5 0.75 0.75 0.5 0.5 0.0 0.5 0.5 0.0 0.5 0.5 0.0 0.0 0.5 0.5 0.25 0.0 0.5 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.25 0.25 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.5 0.0 0.0 -10.140443517 1.13682102208 -26.7303637787 2.61347128941 -3.42113526361 0.394871301957 -39.1831443969 8.06518227656 0.648693465022 3.22039946997 -35.4555364197 20.7387298139 0.512403796066 -1.79274213096 -30.4545414204 9.10998641976 -0.307334048543 -2.45702315906 -31.0462413704 -11.2691666974 0.142169348752 0.719988108552 -29.4359988078 -10.4703405568 0.0808614508232 -0.0660726877093 1 4 1 4 2 20 3 5 1 1 4 4 7 4 7 4 7 3 8 3 8 4 7 5 6 5 4 6 6 2 8 0 154.0 0.785714285714 74.0 0.540540540541 0.177095631641 0.181818181818 0.0427384219761 0.100530520247 0.0242605682393 0.0103564451481 0.00436809441191 -0.00185626351552 0.0489624217377 0.363636363636 0.142857142857 2.0 0.0 2.0 0.0 1.0 1.0 0.0 0.0 3.0 4.0 0.28 0.0 1.0 1.0 0.480519480519 0.666666666667 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 0.916666666667 0.75 0.5 0.833333333333 0.916666666667 0.166666666667 0.0 0.166666666667 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -9.91307931258 6.32072488279 -18.9939921618 16.9480723826 6.62836257163 2.36389171307 -1.57424240164 24.0758117248 -2.61333893809 -1.66293336319 -6.87550260525 15.6509444881 -0.710707349392 -0.660443374721 -15.1707408547 8.56569191721 0.582908020964 -0.00587691847244 -10.7859283616 6.28697164232 0.106314902516 -0.555937266554 -6.93443315197 1.00167659588 0.173598274434 -0.0847149760098 4 1 1 1 2 1 8 1 3 1 1 1 2 10 3 10 1 4 3 5 1 11 1 3 4 6 2 6 4 12 4 4 5 3 4 3 6 4 5 3 13 4 4 4 13 3 5 3 14 3 6 3 13 3 6 4 5 2 5 4 6 6 1 3 5 4 7 8 5 6 8 4 16 0 350.0 1.78571428571 154.0 0.766233766234 0.198057142857 0.178571428571 0.153274892128 0.0431306122449 0.0394244897959 0.0722670021289 0.00674954724175 0.00952263866753 -0.0155285844105 0.64 1.57142857143 5.0 8.0 1.0 2.0 8.0 5.0 3.0 5.0 6.0 20.0 0.114754098361 2.0 2.0 4.0 0.44 0.5 0.535714285714 0.464285714286 0.571428571429 0.642857142857 0.535714285714 0.0 0.428571428571 0.571428571429 0.428571428571 0.285714285714 0.321428571429 0.75 0.464285714286 0.321428571429 0.428571428571 0.25 0.625 0.75 0.75 0.75 0.75 0.875 0.875 0.75 0.75 0.375 0.625 0.625 0.25 0.25 0.125 0.75 0.75 0.5 0.75 0.75 0.25 0.0 0.0 0.5 0.875 1.0 1.0 0.75 0.25 0.0 0.0 0.125 0.5 0.625 0.375 0.125 0.0 0.0 0.0 0.625 1.0 0.875 0.625 0.5 0.5 0.5 0.5 0.625 1.0 1.0 0.875 0.75 0.75 0.625 0.5 0.75 1.0 0.625 0.125 0.0 0.0 0.0 0.0 -11.7138038116 12.7069306565 -36.1560210357 26.6226572694 -11.3402658869 -5.37543401138 -71.9890309543 13.4798178555 4.03565028251 2.53180452498 -53.631215064 19.8340547917 3.20318547325 0.961698126893 -30.9935230353 24.3908787011 -2.91612933489 -2.61347687034 -44.9763408291 8.52403879645 0.647104805443 1.1358113908 -47.108922696 12.0138183327 -0.119742485173 -0.0309994812328 3 2 5 2 4 1 1 5 1 4 2 8 1 5 3 4 5 3 4 2 6 3 4 2 6 3 4 2 6 3 4 2 7 2 4 2 6 4 3 2 6 4 3 3 5 3 3 4 5 4 1 5 4 5 10 2 3 0 210.0 1.07142857143 91.0 0.824175824176 0.226031746032 0.189115646259 0.110112946766 0.0782295648418 0.0610860598208 0.0393526119662 0.0155448760528 0.0173433882774 -4.02955338741e-05 0.333333333333 1.0 2.0 1.0 4294967295.0 1.0 4.0 3.0 3.0 3.0 1.0 5.0 0.242424242424 1.0 0.0 2.0 0.433333333333 0.5625 0.3125 0.25 0.4375 0.8125 0.5625 0.5 0.6875 0.375 0.0 0.0 0.0 0.75 0.5 0.4375 0.5625 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 2.37671381684 4.96563422447 4.18894740701 13.8338200584 -2.26806404235 2.75189506935 -3.35457817717 23.2362167113 -0.426182093802 -0.743710221385 -8.62199771529 18.5095441953 -0.727866300953 -1.45096078653 -14.5422891495 7.53605082385 -0.76884593879 -0.0834264659848 -19.7703013838 4.70606406028 0.5289330972 0.144321104284 -18.0439567694 5.24839659681 -0.220445979548 -0.104040909782 6 5 9 5 10 3 11 2 12 2 11 3 11 2 12 2 11 2 12 2 11 3 4 2 5 4 4 2 3 3 6 2 3 3 6 1 3 4 6 2 2 3 7 1 2 3 7 2 2 2 7 2 2 4 2 5 3 3 3 5 3 2 4 3 5 0 294.0 0.666666666667 89.0 1.03370786517 0.139212827988 0.167476514415 0.0418371360761 0.137713625873 0.0475467988112 0.0140307563392 0.0198154002423 0.0124510756893 0.109477592788 0.714285714286 0.52380952381 0.0 1.0 4.0 2.0 0.0 0.0 5.0 5.0 1.0 5.0 0.470588235294 0.0 2.0 2.0 0.302721088435 0.0 0.0 0.25 0.666666666667 0.125 0.416666666667 0.708333333333 0.291666666667 0.75 0.416666666667 0.125 0.458333333333 0.208333333333 0.0833333333333 0.291666666667 0.375 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.833333333333 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.5 0.333333333333 0.0 0.333333333333 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.166666666667 0.0 0.0 -4.5775993156 -5.09295817894 -9.03544874068 -10.8450666107 1.93254418104 2.90861200825 -8.5997583059 3.98039829921 -3.32453313526 4.82923576326 -13.0572330018 26.8229956222 4.19587584631 -1.90905304652 -0.543553068828 19.8523209309 -3.20353004219 -0.827553682115 -11.4714903335 7.57369468094 1.03023263976 -0.517298066659 -11.1207606668 0.396787615111 0.13539945589 -0.220700053965 7 2 8 3 8 3 7 4 4 1 1 6 3 9 2 7 4 6 6 3 8 3 8 2 8 3 8 3 7 3 8 3 7 5 1 1 4 7 4 7 4 6 5 0 209.0 0.578947368421 87.0 0.620689655172 0.162679425837 0.208511709897 0.0327542144664 0.166838986743 0.0306383963159 0.00733120324006 0.0036940801624 0.000314528101681 0.154289201476 0.363636363636 0.105263157895 0.0 1.0 2.0 0.0 0.0 1.0 0.0 1.0 2.0 5.0 0.24 0.0 1.0 1.0 0.416267942584 0.0666666666667 0.266666666667 0.133333333333 0.733333333333 0.133333333333 0.866666666667 0.8 0.866666666667 0.466666666667 0.933333333333 0.466666666667 0.4 0.933333333333 0.733333333333 0.0 0.133333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.166666666667 0.5 0.333333333333 0.0 0.333333333333 0.833333333333 1.0 0.0 0.166666666667 0.833333333333 0.833333333333 0.5 0.833333333333 1.0 1.0 0.0 0.166666666667 0.833333333333 1.0 1.0 1.0 0.666666666667 0.833333333333 0.0 0.5 1.0 1.0 0.833333333333 0.5 0.166666666667 0.5 0.333333333333 0.833333333333 1.0 0.833333333333 0.333333333333 0.0 0.0 0.5 0.833333333333 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -9.71682810456 2.01037822853 -18.3059826033 0.501766866859 6.51154639892 -5.69588601701 -3.5378447996 -13.6650502166 -3.89574486203 3.74043178879 -9.71328788864 -1.6500781568 2.12356824464 -0.0122573870298 -6.51361577866 4.19983268494 -0.986200538995 -0.610552723784 -7.33209181603 -3.14288715327 0.0481176498492 -0.738612631812 -10.9130230824 -13.3603470962 -0.0449505616586 -0.36903682052 7 4 7 7 6 8 4 3 2 4 3 3 10 3 10 3 9 3 10 3 9 5 7 5 9 4 10 4 9 3 10 3 10 4 9 3 9 4 10 4 9 4 8 6 6 7 6 7 6 0 299.0 0.565217391304 104.0 0.663461538462 0.118343195266 0.166787843536 0.0238734207929 0.15403597163 0.0227557254995 0.00709274741028 0.00886437340258 -0.000401645675415 0.155652484756 0.615384615385 0.0434782608696 3.0 4.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 6.0 0.193548387097 0.0 2.0 1.0 0.347826086957 0.0833333333333 0.541666666667 0.625 0.583333333333 0.541666666667 0.625 0.583333333333 0.708333333333 0.541666666667 0.0 0.0 0.0416666666667 0.541666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.833333333333 0.5 0.5 0.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.5 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -14.669933885 3.43221094668 -25.0806323349 10.016087255 13.7420293035 2.84765303619 10.5018939873 21.8615111416 -6.39001687488 1.5415224974 -3.38443818229 30.0464216513 0.52169935544 -0.331799644003 -9.97006558425 27.1739039996 1.2609402712 -0.891539871802 -0.371591198873 19.249680524 -1.33899974036 0.0374598099366 -7.75156322268 17.5868850797 0.233535630842 -0.0355676119454 5 3 8 8 4 10 2 12 1 12 1 12 1 3 10 2 11 2 10 4 9 4 10 4 5 3 1 12 2 10 5 5 4 0 195.0 0.866666666667 106.0 0.537735849057 0.240236686391 0.245128205128 0.0745574267941 0.113468669398 0.0459632832651 0.0184350853698 0.00864757799495 0.0049919486993 0.025076763669 0.769230769231 0.0666666666667 0.0 3.0 3.0 3.0 0.0 0.0 0.0 1.0 3.0 8.0 0.1875 0.0 3.0 1.0 0.54358974359 0.375 0.75 0.6875 0.875 0.875 0.8125 0.125 0.5 0.875 0.75 0.0 0.25 0.5625 0.75 0.0 0.4375 0.0 0.0 0.25 0.5 0.5 0.5 0.5 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -9.7615031763 6.36619772368 -23.856032384 16.0887972661 -0.364429451915 1.57768526699 -24.9201686825 25.287253918 1.50938513483 2.44258274262 -16.1112821331 35.4172260266 -0.190112215755 -0.767359078103 -14.1883968928 29.480387368 0.338585688968 -1.86389865808 -9.97400170169 13.0763668007 0.938635113339 -0.336521979481 -0.215823901741 1.92629616101 0.101484361783 -0.523095730785 1 9 3 8 6 5 8 4 3 2 1 7 2 11 2 11 2 10 3 10 3 9 5 1 1 5 9 4 9 5 4 10 3 10 3 10 3 10 4 9 3 10 3 10 3 8 7 5 8 5 1 3 1 2 1 5 0 299.0 0.565217391304 101.0 0.792079207921 0.133521996398 0.163734186418 0.0276297478809 0.143998523955 0.0315489202215 0.00732423253048 0.0117222975827 0.00162793919499 0.131982179372 0.692307692308 0.173913043478 2.0 0.0 6.0 1.0 1.0 1.0 0.0 0.0 1.0 9.0 0.230769230769 1.0 6.0 1.0 0.33779264214 0.0 0.291666666667 0.458333333333 0.333333333333 0.375 0.75 0.833333333333 0.833333333333 0.416666666667 0.25 0.333333333333 0.125 0.5 0.0416666666667 0.0833333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.666666666667 0.5 0.0 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 0.5 0.5 0.833333333333 0.833333333333 0.5 0.666666666667 0.5 0.5 0.0 0.0 0.5 0.666666666667 0.0 0.166666666667 0.666666666667 0.333333333333 0.0 0.0 0.5 0.666666666667 0.0 0.0 -11.016289974 2.10361316087 -17.5257902288 5.20017892008 11.6687637606 1.28297171188 10.338814994 16.2757071437 -7.02856074676 4.66280932856 -4.17097625687 32.3934854762 3.37761445039 -2.90292279548 3.29240913653 25.0294632325 0.019643511929 1.05449277958 7.82513792657 17.1037870941 -1.96463801409 -2.49211143121 -8.6402821625 7.55857957021 0.263914041732 0.612560665072 9 1 1 2 10 5 11 4 11 4 12 3 12 3 12 3 12 3 11 4 6 2 1 6 4 4 3 4 4 3 5 3 3 3 6 3 2 4 6 3 2 4 6 3 2 4 6 3 2 4 6 3 2 4 6 3 3 4 5 3 3 5 3 5 3 13 3 4 4 1 2 1 330.0 0.681818181818 131.0 0.671755725191 0.201616161616 0.225895316804 0.063230542338 0.158381055736 0.0593043381473 0.0174694386154 0.0162340470205 0.0112955140447 0.100157508773 0.466666666667 0.636363636364 0.0 2.0 5.0 0.0 1.0 1.0 5.0 4.0 2.0 13.0 0.170212765957 2.0 2.0 2.0 0.39696969697 0.0 0.0833333333333 0.791666666667 0.833333333333 0.0 0.208333333333 0.375 0.5 0.208333333333 0.208333333333 0.0416666666667 0.208333333333 0.875 0.875 0.791666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -3.93546768373 -9.78079468456 -11.8944439716 -24.0930398257 -2.08587440067 0.491335583144 -10.124716114 -14.5647174514 6.90134832636 7.87854224462 12.4742190487 22.4825752374 -4.62890778973 -0.961892490942 0.303924935479 29.0506422913 2.16166598551 0.419383839545 3.4849336475 25.1510984396 -0.520685762241 -0.85515541255 5.09590686547 20.6748946178 -0.112277392402 0.146397370552 7 1 7 8 4 9 2 2 5 3 1 3 4 4 1 14 10 2 9 3 10 2 9 4 7 1 1 6 3 2 1 10 4 8 7 3 3 0 180.0 0.8 85.0 0.776470588235 0.215740740741 0.222962962963 0.0711598079561 0.119464334705 0.0488422496571 0.0207550652734 0.012539660868 0.00693718306448 0.0460724413988 1.33333333333 0.266666666667 2.0 5.0 6.0 3.0 0.0 2.0 0.0 1.0 5.0 15.0 0.219512195122 0.0 3.0 1.0 0.472222222222 0.0833333333333 0.666666666667 0.833333333333 0.75 0.5 0.666666666667 0.333333333333 0.75 0.5 0.25 0.0 0.5 0.583333333333 0.333333333333 0.0 0.333333333333 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.75 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.75 1.0 0.5 0.25 0.75 0.5 0.0 0.0 -7.38478935946 4.75342763368 -16.8649015163 15.3377756884 1.62861484878 6.26547032858 -9.96253719371 40.4133723997 2.46612352709 2.63569597991 5.69542906155 53.022058579 0.848076061199 -2.26348987195 15.1758340529 38.9934606818 0.757304044631 -0.59406664152 22.0032768112 33.1874310251 0.198054175035 1.75645958206 24.5616577011 47.7728893565 -0.0284963118625 0.076317919113 4 7 5 2 4 3 3 3 4 4 1 12 1 10 2 4 9 4 9 3 10 4 9 4 10 4 5 3 2 6 1 4 4 7 2 0 169.0 1.0 84.0 0.630952380952 0.208466090123 0.223941738735 0.0832881516546 0.0965536444471 0.0429134444723 0.0277523324438 0.0119030466748 0.00767353253914 0.019476550541 1.07692307692 0.307692307692 0.0 4.0 6.0 3.0 2.0 0.0 0.0 2.0 5.0 15.0 0.0526315789474 0.0 3.0 1.0 0.497041420118 0.375 0.875 0.9375 0.5625 0.6875 0.625 0.1875 0.625 0.625 0.5 0.0 0.4375 0.8125 0.375 0.0 0.5625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.25 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -7.54149576497 0.88147353097 -18.6849793418 1.4767663084 -0.634011862513 -0.538968036688 -20.5010691615 3.12429926821 1.34373026791 3.22974461306 -13.0402091026 20.6187393418 -0.145445905091 1.89845935359 -12.0828007716 33.5144613112 -0.188699822625 -1.37456907235 -11.9325689469 25.1058694892 0.89338900928 -0.137573698331 -2.33774217948 21.6381541331 0.257610370198 0.165049136426 6 1 9 5 3 8 3 3 7 4 1 2 3 9 2 4 7 3 8 3 8 3 8 4 8 5 4 1 2 5 2 2 3 5 8 2 4 0 165.0 0.733333333333 69.0 0.884057971014 0.150964187328 0.193131313131 0.0416159390044 0.113764866294 0.0374005620948 0.0126619940037 0.0132612154372 0.00662790209045 0.0743363571853 0.909090909091 0.2 0.0 1.0 4.0 2.0 0.0 1.0 0.0 2.0 4.0 6.0 0.185185185185 2.0 3.0 1.0 0.418181818182 0.166666666667 0.75 1.0 0.75 0.5 0.916666666667 0.416666666667 0.75 0.583333333333 0.5 0.0 0.416666666667 0.583333333333 0.416666666667 0.0 0.0833333333333 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.0 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.25 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.75 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.75 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.5 1.0 0.5 0.25 0.75 0.5 0.0 0.0 -12.1382169931 5.00807554262 -25.9927699614 13.8715416379 5.18123612071 3.02182185284 -6.91669629495 26.7237962883 3.10355230434 1.3171856958 12.2298710511 29.9951094685 -1.4814083768 -2.87617548879 6.4488761216 9.14689030757 -0.0549810051964 -1.99351858662 1.86611876241 -8.2761231728 -0.470951872196 1.25330824796 -3.76862957782 -1.03539033802 -0.170772745251 -0.04452508155 2 1 1 2 10 6 8 6 9 6 11 4 12 3 12 3 12 3 11 4 11 4 4 2 5 4 2 5 4 4 5 3 3 4 5 4 2 4 5 4 2 3 6 4 2 3 6 4 3 2 6 4 3 2 6 3 4 2 6 3 3 3 6 3 2 4 6 3 2 5 4 5 2 1 8 4 12 3 360.0 0.625 137.0 0.722627737226 0.170555555556 0.193981481481 0.0508393132716 0.14351303155 0.0680264917695 0.0183775436478 0.0275104960697 0.0209908901734 0.105078224077 0.333333333333 0.625 3.0 1.0 4294967295.0 0.0 1.0 3.0 6.0 5.0 4.0 5.0 0.2 2.0 0.0 2.0 0.380555555556 0.625 0.375 0.5 0.416666666667 0.75 0.75 0.666666666667 0.5 0.0416666666667 0.0833333333333 0.0833333333333 0.0 0.0 0.25 0.583333333333 0.5 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.166666666667 0.5 0.5 0.5 0.333333333333 0.833333333333 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -6.20704278058 -4.11150269654 -14.3374939216 -8.77609840888 1.20222770381 2.52782811958 -9.29320116237 5.03347836243 1.26010423461 4.7946988849 -5.12879113082 27.0576608556 -2.27552564652 -1.49207240092 -13.3648959064 27.5592331132 1.69624400767 1.59550045631 -6.32222242985 32.798088975 -0.542262139429 -0.637313039901 -9.0983727 31.6020938956 -0.256096585033 0.0627034855669 0 4 5 3 4 4 4 4 3 4 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 4 3 3 4 5 3 3 2 8 3 11 5 1 10 0 210.0 1.07142857143 96.0 0.71875 0.218095238095 0.213945578231 0.0973589245222 0.0860996652629 0.0619562682216 0.0313872511517 0.0142166138384 0.013715696093 0.00254586584641 0.0666666666667 0.857142857143 0.0 0.0 1.0 0.0 3.0 3.0 3.0 2.0 2.0 5.0 0.222222222222 0.0 1.0 2.0 0.457142857143 0.75 0.5 0.5 0.4375 0.4375 0.5 0.5 0.625 0.125 0.0 0.0 0.5 0.8125 0.75 0.75 0.9375 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 -0.424413181578 -10.403295952 2.09555137273 -5.48907714841 4.61422011012 -23.4949423592 17.559613843 4.69844883576 -0.0273720303774 -6.63448183019 19.5484801022 -0.86163168548 -0.93358581835 -7.1186338915 14.2290751229 -1.84859516982 0.998719582795 -23.3934285571 21.1087124172 -0.227069760434 0.730292035976 -33.0312952404 30.9798195583 -0.504962387863 0.170986644254 7 2 7 6 4 3 3 4 1 4 3 4 1 4 1 17 1 3 3 2 4 3 9 3 9 4 8 4 6 2 1 4 5 2 2 9 4 7 6 4 4 0 180.0 0.8 91.0 0.681318681319 0.21712962963 0.233703703704 0.0681788408779 0.116080075446 0.0450584705075 0.0188640017782 0.009775975338 0.00535268371654 0.0430503538629 1.0 0.4 0.0 4.0 5.0 3.0 1.0 2.0 0.0 1.0 4.0 13.0 0.189189189189 0.0 3.0 1.0 0.505555555556 0.25 0.833333333333 1.0 0.75 0.583333333333 0.833333333333 0.416666666667 0.833333333333 0.416666666667 0.583333333333 0.0833333333333 0.333333333333 0.583333333333 0.75 0.166666666667 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.5 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.25 0.75 0.75 0.25 0.0 0.75 0.5 0.0 0.5 1.0 1.0 0.5 0.0 1.0 0.75 0.5 0.75 1.0 0.75 0.25 0.0 -10.5678882213 6.87549354157 -25.3700641131 19.3332927874 0.371785947063 5.08729933652 -23.1453883461 44.010012354 2.47330396936 5.45419352869 -7.99974563089 69.3664576234 0.515087398594 -1.30184156061 -1.2563264906 66.0145025075 -0.050877351652 -0.120246797747 -2.07203847548 63.8270344453 -0.507080819245 1.67622232931 -8.24797347044 78.6754269411 -0.186861727063 0.164536501284 1 1 1 13 5 10 6 10 5 11 4 11 4 11 3 12 3 13 2 12 4 2 4 5 4 2 4 5 4 4 3 4 3 5 3 4 3 6 3 3 3 5 4 3 3 5 4 3 3 5 4 3 3 6 3 3 3 5 4 2 4 6 4 1 5 4 11 4 1 1 2 1 0 330.0 0.681818181818 129.0 0.697674418605 0.15797979798 0.218457300275 0.0479604864068 0.153990705958 0.0655616217269 0.0173913139612 0.0232956796941 0.019343524382 0.120610252396 0.4 0.636363636364 3.0 2.0 4294967295.0 0.0 0.0 1.0 5.0 5.0 2.0 5.0 0.243902439024 1.0 0.0 2.0 0.390909090909 0.666666666667 0.458333333333 0.5 0.583333333333 0.583333333333 0.625 0.583333333333 0.541666666667 0.0 0.166666666667 0.0833333333333 0.0 0.0 0.25 0.708333333333 0.666666666667 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.166666666667 0.5 0.333333333333 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -9.08630038743 -9.63610837265 -20.6212937419 -22.6605673506 2.60351658598 1.21231584563 -8.75289191462 -17.4171520231 2.89727940814 1.76292750645 0.36016134667 -10.1630278277 -4.46362059554 -1.83139141083 -13.6927978345 -10.9067534353 3.97118702632 3.22321611735 2.90719959104 3.54242156992 -1.16293063278 -1.78030547151 3.5239496233 -0.508191617084 -0.0314733730281 0.261584956184 5 6 6 8 3 3 5 3 2 3 5 3 1 6 2 3 2 3 9 4 9 4 10 3 9 5 9 5 8 5 4 3 3 9 6 5 3 0 182.0 0.928571428571 81.0 0.777777777778 0.183854606932 0.204474097331 0.0695961296281 0.101423920241 0.0411711371589 0.0247774539598 0.0138043649463 0.00687103512132 0.0369799360654 1.0 0.285714285714 1.0 3.0 4.0 4.0 1.0 2.0 0.0 1.0 2.0 12.0 0.0606060606061 1.0 3.0 1.0 0.445054945055 0.25 0.75 0.9375 0.6875 0.5625 0.5 0.3125 0.75 0.5 0.125 0.0 0.25 0.6875 0.375 0.0 0.375 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -10.7315904485 0.954929658551 -24.9736797819 5.49307423641 1.39852186145 5.27647357251 -20.5871620475 27.5617435379 1.12650866812 3.81587635907 -13.4123054637 49.14671222 -1.15193630451 -0.236164429833 -18.2681360411 46.9412194998 0.155411589346 -2.2447207167 -19.4281758863 24.6555161008 -0.337859764625 -1.76450724744 -24.6465173319 2.17548387425 -0.390362632874 -0.279125187612 1 4 1 8 2 13 2 14 1 5 5 3 3 3 6 3 3 2 7 3 3 2 7 2 4 2 7 3 2 4 6 3 2 4 6 3 2 3 6 4 1 5 4 11 5 5 195.0 1.15384615385 109.0 0.504587155963 0.267008547009 0.237869822485 0.123629056457 0.0886874020128 0.0497017144591 0.0355838506836 0.00862123474575 0.0105287773269 -0.0202742798947 0.466666666667 0.846153846154 1.0 2.0 1.0 1.0 1.0 3.0 3.0 3.0 3.0 9.0 0.1 0.0 1.0 2.0 0.558974358974 0.75 0.5625 0.625 0.875 0.875 0.4375 0.375 0.4375 0.75 0.0 0.0 0.0625 0.875 0.5 0.5 0.75 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.25 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.44300481737 8.40338099525 -7.66051426311 22.2415270456 -5.89651380273 2.795468156 -25.257372513 31.0735631665 2.3809810032 -1.80662945614 -14.9097965351 21.351878212 2.1313367219 -0.816933481241 -0.150186489358 14.2960173229 -1.46244102499 0.678610609483 -6.57800187642 15.8474114296 0.447251736838 -1.07664639429 -5.33169481111 4.04621274375 0.129616622583 -0.472241780055 3 1 5 2 6 14 2 14 2 6 3 5 3 4 5 4 3 4 5 4 3 3 6 4 3 3 7 3 3 3 7 3 3 3 7 3 3 3 7 3 2 5 5 11 4 12 4 6 224.0 1.14285714286 123.0 0.536585365854 0.265625 0.256058673469 0.121651785714 0.0916850365286 0.056545958227 0.035480320074 0.00777156872602 0.0115417236849 -0.0201973938976 0.25 0.857142857143 1.0 1.0 2.0 0.0 1.0 3.0 3.0 3.0 3.0 4.0 0.222222222222 0.0 1.0 2.0 0.549107142857 0.625 0.5625 0.5 0.6875 0.8125 0.75 0.5 0.625 0.625 0.0625 0.0 0.0 0.8125 0.5625 0.3125 0.4375 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.0345071301 8.35563451232 -5.70869721699 20.4575154171 -4.39727700191 0.438297792499 -17.8083376494 22.2015372141 2.64652405767 -1.03877159665 -6.2119347661 15.0508391421 1.45078754219 -0.354316632377 4.21763186956 11.3218971026 -1.57500002189 0.218534273495 -5.37882770325 12.7641743719 -0.147520543847 0.201118014693 -12.6601842142 14.0725121848 -0.276686650518 -0.0966651619738 1 17 2 7 3 2 5 4 5 4 12 2 7 3 5 4 5 4 3 4 3 5 4 5 3 4 4 5 3 5 4 3 3 6 3 5 4 3 3 6 2 7 3 3 3 5 4 6 3 3 3 6 3 6 3 3 4 5 2 7 3 2 4 5 4 5 4 1 6 4 5 4 6 1 4 3 6 4 5 336.0 1.71428571429 158.0 0.73417721519 0.225570436508 0.230442176871 0.169443532311 0.0586806399147 0.059112453265 0.0758832434004 0.00936218682261 0.0187335327479 -0.0272537071456 0.458333333333 1.85714285714 4.0 3.0 3.0 1.0 3.0 6.0 6.0 6.0 2.0 7.0 0.222222222222 0.0 6.0 3.0 0.470238095238 0.541666666667 0.625 0.5 0.708333333333 0.5 0.166666666667 0.0416666666667 0.166666666667 0.458333333333 0.625 0.5 0.583333333333 0.625 0.333333333333 0.208333333333 0.25 0.166666666667 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 0.833333333333 0.5 0.5 0.5 0.333333333333 0.333333333333 0.333333333333 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.0 0.166666666667 0.666666666667 0.833333333333 0.666666666667 0.666666666667 0.5 0.5 0.166666666667 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 -3.95234775345 5.43779388897 -11.8272749144 10.5097371659 -4.60361199107 -4.11675259918 -34.5459330707 -4.73716741518 -4.27451127796 -1.75686443886 -44.4866081202 -13.8098466132 7.52121496561 2.46971984524 -4.16930588493 0.661807979061 0.482036190876 0.260480657155 16.4762955236 2.96496197419 -0.163104572048 -1.85577580934 5.50227874716 -11.8323855461 -0.645676896798 0.187490668624 1 2 3 2 5 1 5 2 3 26 4 2 4 2 4 3 3 4 2 3 3 3 3 3 3 3 3 3 4 2 4 1 11 126.0 0.285714285714 64.0 0.671875 0.248677248677 0.271352985639 0.0230216719257 0.427471635333 0.0661815578671 0.00211804733408 0.0230557262511 0.00326253045341 0.735888374684 1.16666666667 204522252.0 0.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 3.0 1.0 0.238095238095 2.0 5.0 1.0 0.507936507937 0.166666666667 0.25 0.0833333333333 0.25 0.5 0.5 0.5 0.666666666667 0.666666666667 0.5 0.916666666667 1.0 0.666666666667 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.09175068064 -2.84963136203 -3.47650153912 -2.79809879988 1.6854853902 6.30185520052 -1.54495622237 20.0348793516 -2.2065563874 1.6866505751 -5.37838913255 30.8736555858 2.27225831644 -1.41206093881 0.833815285216 25.3082258985 -1.49643474937 1.06226935374 -2.07556031789 26.933669622 0.889545331841 -1.19106605282 -0.717930573165 17.1775293561 -0.135261355002 -0.294168224539 4 6 4 7 2 3 4 3 1 3 5 1 1 4 7 3 8 3 8 3 8 3 8 4 8 3 5 2 1 5 1 4 2 7 2 0 143.0 0.846153846154 64.0 0.671875 0.166560712015 0.21194190425 0.059659251209 0.121689743578 0.0389322643712 0.022241966894 0.0161400101422 0.00825573363842 0.0685493500406 0.727272727273 0.307692307692 0.0 1.0 2.0 2.0 1.0 1.0 0.0 2.0 4.0 10.0 0.103448275862 0.0 2.0 1.0 0.447552447552 0.333333333333 0.916666666667 1.0 0.666666666667 0.583333333333 0.5 0.416666666667 0.833333333333 0.5 0.0 0.0 0.416666666667 0.583333333333 0.0 0.0 0.416666666667 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -11.1653313923 -0.783532027529 -28.0416785889 0.76004722699 -1.689925586 4.39056112468 -34.8080906004 18.9986446374 0.482098112909 3.20295909843 -32.5626785772 36.6423082522 -0.998885731655 -0.72312365192 -37.1271656616 32.1808025004 -0.144139385345 -1.5606313918 -37.4062462784 16.9842583823 0.866193297778 -0.586901631632 -28.9281322721 7.5643218261 0.0754460005496 -0.116155936866 1 2 2 1 4 4 10 6 2 7 3 12 1 7 3 4 2 5 4 5 3 3 3 5 4 5 3 2 4 5 3 6 3 2 6 4 2 6 2 2 7 4 2 6 2 1 9 3 1 2 2 6 9 6 2 6 10 5 3 4 12 3 4 4 13 1 5 3 6 0 299.0 1.76923076923 147.0 0.639455782313 0.232077940963 0.197324414716 0.148889642657 0.0417162924449 0.0511729515719 0.0496831143707 0.00770838755818 0.0073501000248 -0.0268849092851 0.130434782609 1.69230769231 0.0 2.0 0.0 0.0 6.0 6.0 6.0 3.0 2.0 10.0 0.297872340426 0.0 1.0 3.0 0.491638795987 0.75 0.583333333333 0.25 0.0416666666667 0.541666666667 0.458333333333 0.791666666667 0.625 0.875 0.916666666667 0.833333333333 0.458333333333 0.375 0.5 0.541666666667 0.5 0.666666666667 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.166666666667 0.5 0.5 0.333333333333 0.333333333333 0.5 0.666666666667 0.666666666667 0.5 0.666666666667 0.333333333333 0.0 0.166666666667 0.333333333333 0.333333333333 0.5 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 -6.25548124152 12.1788130366 -15.2941275822 26.5537133711 0.478236600595 -3.88240216238 -9.28775002243 15.3021512037 3.94128635315 -0.813828912202 4.94030175948 3.03969519952 -3.27106867388 -0.757513037083 -5.09580329109 3.01125475563 1.96014491762 1.60065109687 3.92838853549 5.49540944914 0.795355872754 -2.45051532481 13.4343209942 -5.32177814029 -0.384563352049 0.523412059753 6 1 7 7 5 2 2 4 3 2 4 3 9 3 9 3 9 3 8 4 5 1 3 3 3 2 4 3 2 3 4 3 2 4 2 5 1 12 1 4 1 5 1 0 168.0 0.857142857143 77.0 0.805194805195 0.222222222222 0.256802721088 0.0747354497354 0.139260069107 0.0645667989418 0.0172748120836 0.0122888194828 0.011342100493 0.0513137678468 0.666666666667 0.5 2.0 4.0 2.0 0.0 1.0 1.0 2.0 2.0 5.0 6.0 0.171428571429 2.0 2.0 2.0 0.458333333333 0.333333333333 0.166666666667 0.166666666667 0.916666666667 0.5 0.0833333333333 0.166666666667 0.583333333333 0.416666666667 0.0 0.0833333333333 0.333333333333 0.75 0.666666666667 0.75 0.833333333333 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.25 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.500201249717 -3.04668033919 -5.40286179459 -5.82446760447 -5.44050060569 2.63696076266 -19.1227308743 5.66054261843 3.30142104985 2.74605012688 -11.8771636028 20.9491091988 -2.06629615745 -0.12639397576 -16.5966116681 22.3995154207 0.335258588485 -0.521763409854 -20.3078558234 15.4621532731 -0.489517563965 -0.70706875117 -23.5326599113 8.61253728189 -0.181336671241 -0.0034369041882 1 9 2 13 5 5 3 4 5 4 4 4 5 3 4 4 5 4 3 4 6 3 3 5 4 4 3 6 4 2 4 6 4 2 4 6 3 3 4 6 3 4 3 5 3 5 3 4 3 6 5 2 1 8 3 13 3 13 3 13 3 13 3 12 4 11 7 8 8 10 1 1 1 1 1 9 0 368.0 0.695652173913 133.0 0.789473684211 0.15964673913 0.156309073724 0.0491708489151 0.101921898597 0.0317343884842 0.0174000341365 0.00520739284744 0.00373773446004 0.0635669279219 0.4375 0.608695652174 2.0 2.0 2.0 1.0 3.0 5.0 3.0 0.0 4.0 8.0 0.191489361702 3.0 2.0 2.0 0.361413043478 0.291666666667 0.375 0.291666666667 0.375 0.458333333333 0.75 0.791666666667 0.791666666667 0.166666666667 0.0 0.0833333333333 0.0833333333333 0.791666666667 0.375 0.291666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.166666666667 0.166666666667 0.5 0.166666666667 0.0 0.0 0.333333333333 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.5 0.5 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.333333333333 0.5 0.5 0.5 0.5 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 -9.2448262596 14.1717097153 -18.7360570395 32.7986792719 4.82600378767 -1.94475907778 -6.51417951732 28.1547947795 -2.37368717886 -0.00967262322399 -13.956825622 26.7836942999 -1.07526724678 2.15643348032 -17.8606222609 36.4353717081 2.88117816947 -1.39787676158 -3.04345746761 29.1505932548 -1.88777679706 -0.29914059571 -9.22086935427 21.2665495508 0.300998018287 -0.066022366155 2 1 10 4 2 6 1 5 3 4 1 5 3 5 1 3 5 4 1 3 5 3 3 2 5 3 2 3 6 2 3 2 6 2 2 3 5 3 2 3 6 2 1 5 4 9 3 10 4 1 1 1 1 0 182.0 0.928571428571 94.0 0.702127659574 0.229923922232 0.246075353218 0.0947342718868 0.109194256414 0.0517416408009 0.0311221104282 0.0072629908501 0.0111265395996 0.0207067950882 0.538461538462 1.0 3.0 0.0 1.0 2.0 2.0 3.0 3.0 3.0 2.0 7.0 0.2 1.0 0.0 2.0 0.516483516484 0.8125 0.75 0.625 0.875 0.375 0.3125 0.25 0.375 0.5 0.3125 0.125 0.25 0.625 0.875 0.625 0.8125 0.5 1.0 1.0 0.75 0.5 0.25 0.25 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 -2.27364204417 3.18309886184 -9.04478383552 8.68227425945 -4.91431487547 1.63655826322 -23.151959809 15.4172125974 2.40426045956 0.573150027257 -14.4418074118 17.6330216892 0.290125000558 -0.720308640641 -11.9986947412 11.6762261035 -2.08276800049 -0.90587037689 -26.1352848826 2.79313730807 0.356226313862 -0.334033946767 -27.9257708668 -3.33266847903 -0.0795629632454 -0.184072884674 6 4 2 11 1 18 2 9 4 7 5 7 5 2 2 3 6 2 1 2 6 6 6 3 1 2 6 6 6 7 4 4 156.0 0.923076923077 93.0 0.430107526882 0.271367521368 0.250986193294 0.105758694516 0.100107838551 0.0472340228257 0.0286868883161 0.00700872060364 0.0109469306427 -0.00320850624852 0.5 0.769230769231 2.0 1.0 1.0 2.0 0.0 3.0 3.0 3.0 2.0 11.0 0.176470588235 0.0 1.0 2.0 0.596153846154 0.75 1.0 0.833333333333 0.916666666667 0.75 0.833333333333 0.5 0.416666666667 0.75 0.25 0.0 0.0 0.833333333333 0.0833333333333 0.0 0.0833333333333 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -0.979415034412 7.83532027529 -5.0338344731 19.69564292 -3.86550194055 1.21470645688 -17.3609414101 24.6102483947 0.836142879593 -0.218975268504 -14.1691614483 24.2973471159 1.35097114435 1.26797445811 -4.11306012163 32.6337016944 -0.0904079774775 1.05154027549 -1.12288453323 42.346672936 0.556069278538 0.209238726116 2.76186109717 46.7652587803 -0.0562723859315 0.168269030102 5 2 8 6 2 3 2 8 5 6 5 12 2 4 2 1 4 3 8 2 9 3 8 3 8 4 8 6 6 7 6 3 4 0 165.0 0.733333333333 73.0 0.794520547945 0.160330578512 0.194747474747 0.0484033725687 0.114673122409 0.0298228566658 0.015846223623 0.00838149175034 0.00262322455327 0.074047470461 1.09090909091 0.266666666667 0.0 3.0 4.0 1.0 1.0 2.0 0.0 0.0 3.0 11.0 0.222222222222 1.0 3.0 4.0 0.442424242424 0.416666666667 1.0 0.916666666667 0.916666666667 0.333333333333 0.583333333333 0.333333333333 0.583333333333 0.5 0.333333333333 0.0833333333333 0.25 0.666666666667 0.5 0.0833333333333 0.0833333333333 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.0 0.5 0.75 0.5 0.75 1.0 0.75 0.25 0.25 0.5 0.25 0.0 0.5 0.75 0.25 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 1.0 0.75 0.25 0.0 0.5 0.75 0.25 0.0 0.75 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 -11.7138038116 5.77201926947 -26.5790602297 15.6591686968 2.77962339722 3.29118275208 -15.6429593881 31.9962223859 3.05622761476 3.48869731125 2.63086780246 45.9818827383 -0.603174066831 -2.33002914001 2.96063900953 31.5288040242 0.1263395668 -1.90213992903 2.44145704576 12.4210820335 -0.0027293544641 -0.00141504647914 0.810039478772 4.16135535146 -0.216518012705 -0.585920261759 1 4 9 5 9 6 8 6 10 4 10 3 11 3 11 3 11 3 11 3 2 4 5 5 1 4 3 5 4 3 3 3 5 3 3 3 5 4 2 3 5 4 1 4 5 4 2 3 5 4 2 3 5 4 1 4 6 2 1 5 6 9 3 11 8 0 308.0 0.636363636364 134.0 0.619402985075 0.16952690167 0.234356552538 0.0474158973722 0.166854860437 0.0624902800017 0.0168113921751 0.0177609879292 0.017260046876 0.136889956738 0.642857142857 0.545454545455 4.0 2.0 1.0 1.0 0.0 1.0 5.0 5.0 4.0 9.0 0.2 1.0 1.0 2.0 0.435064935065 0.791666666667 0.5 0.583333333333 0.75 0.625 0.583333333333 0.625 0.541666666667 0.0 0.25 0.125 0.0416666666667 0.0 0.208333333333 0.75 0.708333333333 0.833333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.0 0.166666666667 1.0 0.833333333333 0.5 0.5 0.5 0.666666666667 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.666666666667 0.833333333333 0.5 0.5 0.166666666667 0.5 0.166666666667 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -10.6199752936 -8.42074335268 -24.8918096377 -19.3186804157 1.22481148166 2.00779162243 -21.076821076 -10.1002196147 0.523308678802 2.62023541 -21.0879259633 0.572929800391 -3.32945985299 -2.32624696787 -34.7047145024 -2.34819871199 2.32380937306 3.0490542046 -25.7720186841 7.7459874539 -0.972506351141 -2.51287240459 -29.1773594293 -2.86828577518 -0.171707590662 0.256827840632 1 0 1 1 1 1 2 1 1 1 1 1 22 1 5 7 4 7 3 8 3 8 3 8 3 8 3 8 4 6 6 4 7 5 4 6 0 154.0 0.785714285714 73.0 0.506849315068 0.163518299882 0.190630797774 0.0407640302015 0.111406240075 0.0250773219023 0.0114032939885 0.00572247050084 -0.00161509285566 0.065863736953 0.363636363636 0.285714285714 2.0 0.0 2.0 0.0 4.0 0.0 0.0 0.0 7.0 5.0 0.0689655172414 0.0 1.0 1.0 0.474025974026 0.833333333333 0.416666666667 0.333333333333 0.583333333333 0.916666666667 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.75 0.583333333333 0.0 0.0 0.166666666667 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.8225361302 4.68370261099 -21.7612566387 13.6945496135 5.94998202702 3.57495410802 -5.58039630302 26.1715518958 -1.67427079734 -0.281560880091 -7.18740147775 25.5240884825 -0.776284917737 -0.621573693844 -13.2334381044 20.2096726747 1.09603117079 0.0418849873499 -5.95560893142 17.929914377 -0.058686104899 -0.601145543928 -2.82524565705 10.459328638 0.111802159509 -0.32250492911 2 3 4 3 3 5 2 6 1 6 1 6 2 5 2 4 2 5 1 5 2 4 3 0 77.0 0.636363636364 52.0 0.423076923077 0.298701298701 0.316410861865 0.0493107836673 0.150315530312 0.0368757570647 0.00448243546783 -0.00847168639275 -0.00200943257212 0.0547174814545 0.142857142857 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.0625 0.0 5.0 1.0 0.675324675325 0.166666666667 0.5 0.333333333333 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.62996198086 3.47247148564 -10.4148482213 7.97229138887 1.12113955404 -0.55100373987 -6.83595964774 6.71818542308 0.486935008409 0.115693708811 -2.99931656874 7.02624870687 -0.24536254786 0.680250369152 -3.18267532172 10.8182664221 0.411256403084 -0.234058436458 -0.161818393418 9.22506200231 0.199119815425 -0.408066211147 2.43556781117 4.29503345901 -0.0184437548901 -0.0751874614712 4 4 5 8 3 9 1 9 1 13 9 2 9 2 9 2 9 3 9 2 6 1 2 3 4 2 3 8 5 5 2 0 154.0 0.785714285714 73.0 0.671232876712 0.198347107438 0.19573283859 0.0615158159432 0.111216494755 0.0392255324369 0.0170206343206 0.0135056010799 0.00658826784583 0.0532556813863 0.818181818182 0.142857142857 0.0 2.0 2.0 2.0 0.0 0.0 0.0 2.0 3.0 9.0 0.142857142857 1.0 2.0 1.0 0.474025974026 0.333333333333 0.75 0.75 0.666666666667 0.833333333333 0.5 0.0833333333333 0.583333333333 1.0 0.5 0.0 0.25 0.916666666667 0.5 0.0 0.333333333333 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -8.73078544961 6.91187181428 -22.051752367 18.4433099561 -1.24725506423 3.03090404745 -24.8872288055 32.1634389243 2.6299627557 2.24881285033 -9.6272096382 43.852926485 1.11424558421 0.206526769529 -0.375845227595 43.5066466002 -0.947293684658 -1.65404505687 -7.2197535423 28.8569562605 -0.655854579524 -0.777671994857 -15.4940136162 16.5518800992 -0.0618540291423 -0.235665811627 3 1 16 1 2 5 3 5 2 5 1 6 3 5 3 2 1 2 1 4 4 4 4 1 6 3 4 4 4 1 6 3 4 4 3 2 6 3 4 5 3 1 7 3 2 2 1 3 1 2 9 3 1 2 2 5 9 6 2 5 10 4 3 4 11 4 3 4 11 3 4 3 7 0 286.0 1.69230769231 120.0 0.841666666667 0.183566433566 0.186121570737 0.11820354202 0.0465994712413 0.0473786568461 0.0474254132757 0.00904317776928 0.00862213977763 -0.0117236605116 0.181818181818 1.76923076923 0.0 1.0 1.0 2.0 6.0 6.0 7.0 3.0 3.0 11.0 0.304347826087 1.0 2.0 3.0 0.41958041958 0.666666666667 0.541666666667 0.416666666667 0.208333333333 0.333333333333 0.333333333333 0.583333333333 0.666666666667 0.458333333333 0.541666666667 0.666666666667 0.625 0.416666666667 0.208333333333 0.291666666667 0.166666666667 0.333333333333 0.833333333333 0.833333333333 0.5 0.333333333333 0.333333333333 0.166666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.666666666667 0.833333333333 0.166666666667 0.166666666667 0.0 0.0 0.166666666667 0.166666666667 0.333333333333 0.833333333333 -9.98335552122 6.25044867415 -23.1209583726 15.5759168054 1.96851108238 0.770544292475 -13.1880434748 18.2948196816 4.19186984379 -1.08241093876 8.63693579905 10.3668516548 -1.07929813684 -0.953272689801 5.92439831773 4.59604702674 -0.853549358228 0.5135593373 -1.48397469981 3.13553709767 0.999023209252 -0.958219716239 6.84803452655 1.43581588283 -0.00595900039051 0.403268412089 8 4 8 6 7 6 8 5 9 4 8 5 9 4 9 3 6 1 3 3 4 9 3 3 2 5 2 4 3 4 2 2 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 3 6 3 1 4 6 2 2 3 6 3 1 4 4 4 2 4 2 5 3 4 2 4 286.0 0.590909090909 132.0 0.598484848485 0.261699838623 0.241258741259 0.0706239760044 0.180215696084 0.0605239300775 0.0148413214415 0.013024896498 0.00732962754595 0.106740185975 0.769230769231 0.590909090909 0.0 3.0 5.0 1.0 0.0 1.0 5.0 5.0 2.0 9.0 0.186046511628 0.0 1.0 2.0 0.461538461538 0.0 0.125 0.666666666667 0.75 0.0 0.291666666667 0.166666666667 0.291666666667 0.541666666667 0.5 0.375 0.208333333333 0.958333333333 0.833333333333 0.75 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.833333333333 0.5 0.166666666667 0.0 0.666666666667 0.5 0.0 0.0 1.73623574282 -3.87759315897 2.8265969478 -10.3705488878 -0.812874006866 -0.156524282875 7.30029651066 -2.23470419536 4.78822356676 7.47584666853 20.1277779554 29.8896590199 -4.31589329433 -1.33170887443 7.06623402797 35.8267553609 2.46907900477 1.23642294506 12.6881340646 34.6520828939 -0.689140823999 -1.61625500767 14.4412170478 26.6463516199 -0.0832538570105 0.150649197087 1 2 3 5 3 4 4 4 4 3 13 1 2 1 4 5 2 6 2 6 1 6 2 6 3 5 2 6 3 5 4 5 5 4 3 2 0 136.0 0.470588235294 60.0 0.8 0.157169117647 0.193771626298 0.0230316093782 0.182106146957 0.0388033024629 0.00457949506984 0.0159202125833 0.00382316570086 0.200325152741 0.75 0.0588235294118 1.0 2.0 2.0 1.0 0.0 1.0 0.0 0.0 5.0 0.0 0.125 0.0 7.0 1.0 0.441176470588 0.4 0.5 0.3 0.3 0.8 0.8 0.8 0.7 1.0 1.0 0.7 0.8 1.0 0.8 0.2 0.7 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 -7.07771393985 4.86826884752 -12.9573509617 11.1204828343 5.39137774657 -0.546044315237 0.462038784872 12.2050330841 -2.54042117678 1.82699311546 -3.02886727423 19.2408654714 1.13344495704 0.0901444504676 -2.11161865051 20.1913149799 -0.502236156148 -1.05551129014 -3.81697893043 10.7641771442 -0.441448853979 -0.360117722791 -6.64536245923 5.9345662902 0.285195003175 0.0671339446896 1 0 5 2 1 12 8 5 10 10 7 8 8 9 7 9 8 9 7 10 8 8 6 11 8 8 1 1 4 11 2 2 5 6 2 2 3 11 2 3 5 5 2 2 3 11 2 3 6 3 2 3 3 11 1 5 6 2 1 4 3 6 2 9 4 4 1 4 3 6 2 4 1 5 3 9 3 6 1 4 2 5 4 1 2 5 3 11 2 5 7 5 3 11 3 5 5 6 3 11 2 7 4 6 3 11 3 6 4 6 4 10 3 6 4 6 4 9 5 6 3 5 5 7 8 5 2 4 9 5 4 1 3 11 2 1 5 6 0 693.0 1.57142857143 267.0 0.700374531835 0.163146617692 0.178176321033 0.105965653213 0.0549522534993 0.0473852253117 0.047281008423 0.0113841735074 0.0149640691599 -0.000839757377738 0.424242424242 2.2380952381 9.0 2.0 3.0 0.0 6.0 15.0 13.0 10.0 3.0 10.0 0.285714285714 4.0 1.0 3.0 0.385281385281 0.759259259259 0.314814814815 0.185185185185 0.518518518519 0.222222222222 0.518518518519 0.537037037037 0.314814814815 0.611111111111 0.518518518519 0.388888888889 0.444444444444 0.240740740741 0.185185185185 0.166666666667 0.259259259259 0.866666666667 0.533333333333 0.4 0.4 0.2 0.2 0.4 0.4 0.8 1.0 0.866666666667 0.466666666667 0.133333333333 0.133333333333 0.266666666667 0.333333333333 0.266666666667 0.466666666667 0.666666666667 0.933333333333 0.866666666667 0.666666666667 0.533333333333 0.266666666667 0.0 0.0 0.0 0.2 0.4 0.4 0.866666666667 0.8 0.266666666667 0.4 0.333333333333 0.4 0.266666666667 0.133333333333 0.133333333333 0.0 1.0 1.0 0.8 0.6 0.6 0.6 0.6 0.6 0.6 0.333333333333 0.2 0.2 0.2 0.2 0.2 0.266666666667 0.0 0.0 0.0 0.0 0.266666666667 0.2 0.0 0.0 -19.3686742866 11.1890747871 -51.5667786714 26.5696083681 -7.8296951184 -1.25421375974 -80.8812633714 18.5535354616 2.56413332929 -4.6433104466 -49.8795512378 -3.49084150314 11.8845164132 2.31952249827 17.2368725276 7.26654824378 -4.67012121426 1.37255541885 3.88254761023 17.7900985875 -1.24378988634 -1.87079256346 -26.2040323969 5.22906957128 -0.402981084385 0.152259940228 2 1 1 3 2 6 4 11 2 7 2 5 2 4 4 5 3 4 4 3 4 4 5 2 5 3 4 4 5 2 5 4 3 4 4 2 6 4 2 6 3 1 7 12 2 1 10 6 1 6 10 5 3 5 11 4 3 4 12 3 4 4 12 2 6 2 7 0 299.0 1.76923076923 139.0 0.654676258993 0.217391304348 0.181631077952 0.141676267603 0.0415318616856 0.0439033120435 0.052028355363 0.00757076190606 0.00431337251693 -0.0215363943958 0.217391304348 1.61538461538 0.0 2.0 2.0 1.0 7.0 6.0 4.0 3.0 2.0 10.0 0.170212765957 0.0 4.0 3.0 0.464882943144 0.666666666667 0.5 0.333333333333 0.0416666666667 0.5 0.458333333333 0.875 0.583333333333 0.833333333333 0.708333333333 0.75 0.458333333333 0.458333333333 0.291666666667 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.666666666667 1.0 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.5 0.5 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.666666666667 -8.30373616132 12.6770372063 -16.9113847229 28.8694573479 4.79576081665 -2.5431303868 0.0199772622414 20.3199787631 1.77605908086 -2.14270147046 11.5711302922 4.59103261058 -1.6074068854 0.145115149517 3.47701847621 6.69282984078 0.206052516917 1.30020363799 3.43939769132 10.331361311 0.797515564041 -1.97857186566 10.9618546614 2.99937545261 -0.0739639698002 0.628575058822 4 5 6 7 4 2 6 2 2 2 5 7 3 4 2 2 9 3 10 3 9 3 9 3 7 1 1 4 5 2 2 4 3 2 5 5 3 0 156.0 0.923076923077 61.0 1.03278688525 0.161324786325 0.176035502959 0.0653911478616 0.0922920459718 0.0401415440247 0.026596142971 0.0143152714441 0.00992908664682 0.0403660091337 1.08333333333 0.461538461538 1.0 3.0 5.0 4.0 1.0 2.0 0.0 3.0 3.0 9.0 0.3125 1.0 2.0 1.0 0.391025641026 0.166666666667 0.75 0.75 0.416666666667 0.583333333333 0.5 0.583333333333 0.75 0.5 0.0 0.0 0.5 0.5 0.166666666667 0.0 0.25 0.0 0.0 0.0 0.5 0.75 0.75 0.75 0.5 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.75 0.5 0.5 0.25 0.0 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -7.39458350981 1.46912255162 -18.1493009391 5.63392696692 -0.367135754024 3.70149338745 -19.026365083 22.8716034735 1.41786794985 4.22389836746 -10.4054539599 46.2044053729 0.396932840494 0.60112195844 -4.7357285396 50.6085882289 0.562314588977 -1.74769030734 1.05400167096 36.0267560192 0.436356546201 -0.400837420014 4.91187158561 29.7473732679 -0.128695414429 0.232884473787 1 6 6 11 9 7 3 4 4 7 2 5 4 7 2 5 4 6 3 6 4 5 3 6 3 6 3 6 4 5 3 5 8 1 4 4 6 1 7 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 4 4 4 6 4 4 4 6 4 4 5 5 3 5 5 4 5 4 5 2 1 1 5 4 5 2 1 1 6 4 7 378.0 0.857142857143 172.0 0.645348837209 0.212375073486 0.2350718065 0.0729621534855 0.123236164934 0.0589131465507 0.0199722727572 0.0138389172233 0.0117123616915 0.0443329533155 0.666666666667 1.04761904762 1.0 3.0 3.0 4.0 3.0 6.0 5.0 7.0 7.0 11.0 0.0983606557377 1.0 1.0 3.0 0.455026455026 0.3 0.7 0.666666666667 0.7 0.4 0.2 0.266666666667 0.4 0.666666666667 0.533333333333 0.5 0.566666666667 0.366666666667 0.633333333333 0.4 0.633333333333 0.0 0.0 0.222222222222 0.333333333333 0.666666666667 0.555555555556 0.333333333333 0.333333333333 0.222222222222 0.666666666667 0.888888888889 1.0 1.0 1.0 1.0 1.0 0.555555555556 0.444444444444 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.444444444444 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.333333333333 0.111111111111 0.111111111111 0.444444444444 0.111111111111 0.111111111111 0.333333333333 0.888888888889 1.0 0.777777777778 0.777777777778 1.0 0.777777777778 0.777777777778 1.0 0.444444444444 0.666666666667 0.777777777778 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.777777777778 0.0 0.0 0.111111111111 0.444444444444 0.555555555556 0.0 0.0 0.111111111111 -8.54889408608 0.363782727067 -26.1545030597 1.88963563195 -6.16822072935 1.8585090342 -34.7374658325 10.4051576378 10.2149554154 1.70882914866 0.233378439369 18.5212776136 -5.0904162907 -0.225065756126 -9.28558336048 22.4563005985 1.82751592808 1.35333008936 -8.95748772872 26.1356152263 0.0909358200231 -1.73592916355 -2.77550235804 15.6029207468 -0.23577946667 -0.00423059241715 1 3 2 24 1 9 1 4 6 4 7 3 6 4 7 3 7 3 7 3 6 4 5 6 5 4 5 0 140.0 0.714285714286 74.0 0.432432432432 0.194285714286 0.197959183673 0.0454868804665 0.116463556851 0.0200597667638 0.0121118454324 0.00179204030086 -0.00403682068955 0.065296871161 0.4 0.0714285714286 3.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 2.0 4.0 0.173913043478 0.0 1.0 1.0 0.528571428571 0.833333333333 0.583333333333 0.416666666667 0.583333333333 0.916666666667 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.416666666667 1.0 0.25 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.25 0.25 0.25 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -9.3219323811 7.95774715459 -17.7244076155 20.6134530665 6.44275913945 2.15717589048 -0.319326519429 28.780218557 -1.93894034466 -0.253017250221 -0.757198382192 27.8913253617 0.573914694458 0.498706073381 -0.658311567389 30.8049560382 0.577540405106 0.775615251578 5.38730850824 36.8039177984 -0.163384257168 -0.041300006549 4.36778331238 36.7064662337 -0.0313597023209 -0.09834847828 9 4 3 4 3 6 2 6 1 6 3 4 5 3 3 4 5 3 3 4 5 3 3 3 6 4 2 3 6 4 2 4 5 3 3 4 5 3 2 5 5 3 2 6 4 11 2 6 1 6 2 5 3 3 10 0 225.0 1.0 120.0 0.658333333333 0.256 0.254518518519 0.10295782716 0.100099336077 0.0522358518519 0.0299625307654 0.00551605131413 0.00700846927481 -0.00642408447168 0.333333333333 0.866666666667 1.0 1.0 0.0 0.0 2.0 3.0 3.0 3.0 3.0 8.0 0.0882352941176 2.0 0.0 3.0 0.533333333333 0.5 0.5 0.5 0.75 0.5625 0.6875 0.625 0.875 0.375 0.0 0.0 0.1875 0.875 0.5 0.5 0.625 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.0 0.5 0.75 0.5 0.5 0.25 0.0 0.25 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 -2.63136172579 2.03718327158 -7.59653303149 7.60585386084 -1.79951188989 3.97929799048 -13.3967446719 20.8193898533 0.631032189444 -0.710448803154 -10.4697973912 16.4967802018 0.461383726498 -2.39220602275 -6.67637040453 -0.182698393091 -0.247898111607 -0.0170900604649 -7.47001521169 -3.34024389589 0.0822974909474 0.500065821989 -7.07304156427 1.3372914745 0.055886322617 -0.0464590913499 3 1 2 8 3 14 1 7 4 5 2 4 6 3 3 4 6 3 3 3 7 2 5 2 7 3 4 2 7 2 5 2 7 3 4 2 7 2 5 3 5 4 3 5 4 5 1 5 4 5 1 0 208.0 1.23076923077 99.0 0.676767676768 0.236778846154 0.201923076923 0.124137673532 0.0762469951923 0.0545603735207 0.0435800267171 0.0133812174985 0.0132013958548 -0.0101467972303 0.625 0.923076923077 2.0 2.0 2.0 4.0 2.0 3.0 3.0 3.0 3.0 10.0 0.0975609756098 0.0 1.0 2.0 0.475961538462 0.625 0.4375 0.25 0.4375 0.8125 0.625 0.5 0.75 0.5625 0.0 0.0 0.0625 0.6875 0.25 0.25 0.5 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -0.676408508141 7.87816968305 -3.28448228466 21.2498414034 -2.13351553108 3.16973233341 -8.14567486812 30.8358239515 2.18296367216 -2.43572195615 1.49837222399 15.8494866655 0.48238816481 -2.76055438365 5.28053571738 -5.07382211022 -1.17057329221 0.115372220295 -0.264244072721 -7.40129962217 1.21142721013 0.514804945451 8.0192573894 -2.78877086521 0.0244270967743 -0.0972537379251 3 1 2 6 3 12 1 14 1 5 4 4 1 5 4 3 3 3 6 3 2 3 6 3 2 2 6 4 2 2 6 4 2 2 6 4 2 2 6 4 1 3 6 4 1 4 4 5 1 4 4 5 1 1 12 0 210.0 0.933333333333 112.0 0.571428571429 0.275170068027 0.21746031746 0.108263578447 0.091442068891 0.0552407947306 0.0288545409075 0.00985080623371 0.011084224662 -0.00924364604716 0.357142857143 0.8 1.0 1.0 1.0 1.0 1.0 3.0 3.0 3.0 3.0 9.0 0.166666666667 0.0 1.0 2.0 0.533333333333 0.6875 0.625 0.5 0.625 0.8125 0.625 0.3125 0.3125 0.75 0.0 0.0 0.0625 0.875 0.625 0.6875 0.8125 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 2.20694854421 8.06385044999 2.08887134736 22.3777956298 -4.42747831023 4.52820570532 -10.2258725254 39.5900011315 1.8243940296 0.714833358097 -5.31326183879 44.8816396258 0.270382341257 0.471494377923 -1.47927045037 48.9212973523 -0.591693927773 1.34979499734 -3.07375955773 60.9134068466 1.14889975262 1.17804233705 4.71751481482 75.6784392346 -0.0877990498238 0.315111852111 5 2 5 7 3 3 4 2 2 2 5 2 9 2 9 3 7 4 3 7 3 3 3 2 2 3 4 2 2 3 4 2 3 2 3 5 1 3 1 6 7 4 154.0 0.785714285714 69.0 0.942028985507 0.213695395514 0.230519480519 0.0709674875639 0.130588862141 0.0668631840415 0.0186296903308 0.0186486673672 0.0152938965004 0.0548800326677 1.0 0.5 2.0 3.0 4.0 1.0 1.0 1.0 2.0 3.0 2.0 7.0 0.193548387097 1.0 2.0 1.0 0.448051948052 0.583333333333 0.166666666667 0.5 0.833333333333 0.333333333333 0.0 0.5 0.416666666667 0.416666666667 0.0833333333333 0.333333333333 0.25 0.583333333333 0.75 0.833333333333 0.833333333333 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.5 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.5 0.75 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 -2.00080499887 -2.68289761212 -6.99170744696 -5.55330887494 -2.75528295067 1.933755759 -13.7350598033 4.64628653785 1.99081461005 3.37595834656 -8.92000913704 20.659502882 -1.39894241151 -0.936068276239 -11.4078238331 19.0775730167 0.968012337615 -0.423839172298 -6.85463462386 9.05017047996 0.443489804319 -1.43960288587 1.19019583289 -2.64729049152 0.134925302664 0.00729049261798 1 4 2 5 2 5 4 3 3 4 4 3 3 4 4 3 4 3 4 2 5 2 5 3 3 4 4 3 3 4 4 3 3 4 4 3 3 5 2 8 1 3 1 0 147.0 0.333333333333 78.0 0.628205128205 0.205053449951 0.259799157758 0.0181468857616 0.335159543942 0.0524702638703 0.00160953732188 0.0175078189561 0.00335995063727 0.528677623937 1.14285714286 0.047619047619 1.0 6.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.111111111111 0.0 10.0 1.0 0.530612244898 0.5 0.0833333333333 0.166666666667 0.416666666667 0.833333333333 0.583333333333 0.666666666667 0.75 1.0 1.0 1.0 0.916666666667 1.0 0.833333333333 0.916666666667 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -5.51737136052 0.121260909022 -9.75091909168 2.41053156292 4.13029504405 3.21547634945 -2.71402909211 14.4672251658 -3.97164627442 1.56886355378 -9.97003863891 27.0157587569 3.05334787269 1.43106728984 -4.44617345689 33.4818740039 -2.2074756516 -1.25529165144 -6.85809687753 26.9273619476 1.89768207825 0.000635477685514 -2.15521242222 20.9521648711 -0.367196163743 -0.160846369171 5 2 1 1 6 8 3 3 3 4 1 3 5 2 2 3 8 3 9 3 9 3 9 4 9 3 9 4 5 1 2 5 3 2 3 9 5 4 8 4 4 0 180.0 0.8 71.0 0.87323943662 0.149074074074 0.187037037037 0.0487030178326 0.112475137174 0.0405435528121 0.0172883010618 0.0166937092518 0.00759624657743 0.0682576826236 0.666666666667 0.333333333333 0.0 3.0 3.0 2.0 2.0 1.0 0.0 1.0 2.0 9.0 0.241379310345 1.0 3.0 1.0 0.394444444444 0.25 0.833333333333 0.916666666667 0.583333333333 0.583333333333 0.5 0.5 0.916666666667 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -11.7986864479 2.12206590789 -27.1268555759 12.0275586915 2.15149188848 10.6737085746 -19.1191477826 51.2879296734 2.41485022302 2.58349211064 -3.70816583091 68.0583140053 -0.298538766372 -1.73973532509 -2.97822394729 60.1197435382 -0.385804706284 1.55893856573 -7.75974933604 69.0760892087 -0.445321867817 1.02714628107 -11.8457171438 80.9366076625 0.0469960344686 0.0586201722991 2 4 2 6 1 6 2 5 2 5 3 4 3 4 2 4 2 4 2 5 2 0 70.0 0.7 47.0 0.404255319149 0.338775510204 0.288571428571 0.0629271137026 0.137364431487 0.0387696793003 0.00358156400673 -0.00575467977982 -0.00462916371294 0.00539345292098 0.285714285714 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.133333333333 0.0 5.0 1.0 0.671428571429 0.333333333333 0.166666666667 0.0 0.166666666667 0.833333333333 0.666666666667 0.166666666667 0.5 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.65521140816 4.26535247486 -4.34881200044 10.8196970156 -0.390884540234 0.92500852925 -4.81944572908 15.2719221257 0.918133035709 0.665840619919 -0.808237995353 18.7949320635 -0.204191335648 0.453199748342 -0.525637449086 20.9191859783 0.129566641154 -0.467100153905 1.1394151434 17.3010901461 0.495414765852 -0.170087645497 4.6386045969 15.1580617494 -0.114381138874 0.0811889126066 2 3 3 5 1 14 1 6 2 5 3 4 3 4 2 5 2 3 3 3 4 3 3 0 84.0 0.583333333333 55.0 0.418181818182 0.312925170068 0.268849206349 0.0514388295001 0.142956686643 0.0441299535687 0.00454648655971 -0.00223931872411 -0.00183096174617 0.0487529045444 0.285714285714 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.176470588235 0.0 2.0 1.0 0.654761904762 0.5 0.833333333333 0.166666666667 0.0 0.833333333333 1.0 0.5 0.166666666667 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -2.75868568026 6.04788783749 -6.99217528322 14.285947758 -0.287363091694 -0.413360754975 -6.71109641692 13.5109028797 1.35197785056 -0.272902833554 -0.905911778337 11.0748788521 -0.501517146772 0.331670267264 -1.2891629863 11.0412344347 0.324863070114 -0.822204602547 0.505565175577 4.00939439846 0.197546216997 -0.640266966831 1.48890640458 -3.71547279357 -0.162695851958 -0.0351348035667 1 5 10 7 11 5 12 4 12 4 11 5 11 5 11 5 11 5 2 6 3 5 3 5 4 4 3 2 7 4 3 1 8 4 11 9 7 10 6 10 6 11 5 5 1 5 5 6 1 6 2 7 1 7 1 5 4 4 2 0 336.0 0.761904761905 161.0 0.521739130435 0.18712797619 0.267998866213 0.0471583412631 0.153313642855 0.064805271687 0.0121411299963 0.0150467177052 0.0115727004582 0.0968260093093 0.625 0.380952380952 3.0 1.0 3.0 3.0 0.0 2.0 2.0 3.0 3.0 11.0 0.177777777778 2.0 1.0 1.0 0.479166666667 0.541666666667 0.458333333333 0.375 0.583333333333 0.958333333333 1.0 1.0 0.958333333333 0.208333333333 0.291666666667 0.625 0.708333333333 0.0 0.375 0.458333333333 0.916666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.166666666667 0.333333333333 0.5 0.333333333333 0.0 0.333333333333 0.5 1.0 0.666666666667 0.833333333333 1.0 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 -15.7639181729 -13.2174390834 -31.3704275794 -28.1794637417 9.57878690863 5.07233557537 -1.93023206815 -14.1588300523 -0.211466016416 -0.314406945446 5.22774207502 -6.90874887116 -1.94019920766 0.669688802196 -5.78304143963 -4.77813526056 1.25675700308 -0.0782345051984 -2.58948536455 -3.20543859013 -0.855702552926 0.0357646947016 -1.97113613084 -3.14588022419 0.42554485657 0.0840317299889 4 7 5 9 3 4 2 5 1 4 2 6 1 12 1 6 1 2 1 1 1 3 10 3 11 3 9 4 10 4 5 3 2 5 2 3 4 9 5 6 8 4 4 0 195.0 0.866666666667 103.0 0.601941747573 0.240236686391 0.22188034188 0.0762931269914 0.103221429896 0.0439217114247 0.0185699857229 0.0103731712137 0.00357781554119 0.0176846657033 1.07692307692 0.4 1.0 4.0 5.0 3.0 1.0 3.0 0.0 1.0 5.0 11.0 0.179487179487 0.0 4.0 1.0 0.528205128205 0.375 0.75 0.8125 0.625 0.75 0.625 0.125 0.6875 0.8125 0.625 0.0 0.375 0.8125 0.625 0.0 0.5625 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.25 1.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.25 0.75 0.75 0.25 0.0 0.0 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.0 -8.99755944946 6.28131508736 -21.5994864383 18.9520396718 0.248989066526 6.00742711418 -20.505572503 42.1658139576 1.52882640235 1.58043504523 -11.0649795758 49.5218706014 -0.0447926207448 -2.2380193244 -8.87495675901 32.5872437931 0.0216196793998 -1.8432755004 -8.71151030979 12.156443021 0.121011458861 -0.986958642083 -6.36914890217 -2.71864727765 0.179508277889 -0.34011776774 4 2 7 3 6 4 5 4 6 4 5 10 1 6 5 4 6 3 7 3 7 3 7 3 7 3 7 3 7 4 2 1 3 8 3 7 170.0 0.588235294118 75.0 0.666666666667 0.174705882353 0.222837370242 0.0336374923672 0.171293303481 0.0567783431712 0.0076628064241 0.022868425951 0.00943251250108 0.154296390532 0.6 0.0588235294118 0.0 0.0 3.0 2.0 0.0 0.0 0.0 1.0 5.0 1.0 0.129032258065 0.0 3.0 1.0 0.441176470588 0.333333333333 0.6 0.333333333333 0.266666666667 0.8 1.0 1.0 0.933333333333 0.533333333333 0.666666666667 0.333333333333 0.666666666667 0.0 0.266666666667 0.0 0.466666666667 0.0 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.666666666667 0.5 0.5 0.5 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.5 0.5 0.666666666667 1.0 0.5 0.166666666667 0.666666666667 0.5 0.0 0.0 0.166666666667 0.833333333333 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.833333333333 -8.5007463722 0.973653769503 -14.9110213588 1.58327711388 7.22128705359 -0.466223883773 2.45499947803 4.78340239873 -3.90637803705 3.93469657068 -3.6742682488 22.0975194688 2.10479213056 -0.228976408678 -0.379233681524 23.7592422846 -0.8760622023 -1.15932288444 -2.29025140685 13.506713381 -0.550567266778 0.0175781134226 -8.69496516468 10.1480280585 0.205267136569 -0.133877174937 3 1 7 3 6 2 6 3 5 5 5 5 4 4 5 3 6 3 6 4 5 3 6 3 6 3 6 4 5 4 6 7 3 1 5 0 153.0 0.529411764706 58.0 0.896551724138 0.113289760349 0.189926951173 0.0167859018527 0.164081911404 0.0396989929297 0.00366041249687 0.0186679014666 0.0066849664795 0.17592297595 0.444444444444 0.0 0.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 0.217391304348 0.0 3.0 1.0 0.37908496732 0.466666666667 0.733333333333 0.666666666667 0.466666666667 0.733333333333 0.866666666667 0.733333333333 0.8 0.133333333333 0.266666666667 0.0666666666667 0.333333333333 0.0 0.0 0.0 0.2 0.0 0.5 0.666666666667 0.5 0.5 0.5 0.5 0.166666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 1.0 0.666666666667 0.666666666667 0.5 0.833333333333 0.833333333333 0.166666666667 0.166666666667 0.666666666667 0.166666666667 0.166666666667 0.0 0.333333333333 0.5 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 -9.66164125123 0.823860881887 -16.7988877389 2.66183490596 8.63771097619 1.32533015098 5.44180231097 9.46736153653 -3.90679546853 1.83293310712 -1.5950937491 17.3573565367 0.908470815148 -1.13656987597 -2.72585989737 9.49621925959 0.628823022506 -1.48768994322 3.79916889984 -2.92035009484 -0.771767225561 0.537386920095 -2.77816113001 -0.154261893188 0.00513729067121 0.116883171706 1 8 1 9 7 7 8 4 2 6 3 2 3 6 3 2 2 8 6 8 6 8 3 1 2 8 6 8 2 1 4 7 2 2 3 6 3 3 3 5 3 5 6 4 0 196.0 1.0 78.0 0.884615384615 0.191326530612 0.191690962099 0.0944072782174 0.086744787461 0.0522717468912 0.038236917919 0.0128663672649 0.0163520890075 0.0199488599154 0.642857142857 0.714285714286 1.0 3.0 3.0 1.0 0.0 3.0 3.0 3.0 2.0 11.0 0.108108108108 0.0 2.0 2.0 0.397959183673 0.125 0.625 0.6875 0.75 0.4375 0.125 0.0 0.25 0.5625 0.0 0.0 0.0 0.5 0.625 0.5 0.625 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.2728370453 4.27444704304 -5.70061796368 12.3252420066 -7.8816497474 3.27497256077 -35.1158017019 25.8342691848 -2.29081983121 1.69090408451 -47.7068591579 35.5160941735 2.7304381997 0.18759677516 -31.0301789629 36.6075482639 0.288820245604 -0.469047450798 -25.0073863374 31.9180474991 -0.876651108948 -0.206052376657 -31.6678503754 29.3578690112 0.0744170097699 0.100316878934 2 2 12 3 11 5 10 5 11 4 11 4 11 4 11 4 12 3 12 3 12 10 5 3 4 4 4 3 5 3 4 2 7 3 3 2 7 3 2 4 7 3 1 4 7 3 1 4 6 3 2 4 5 4 2 4 5 3 3 4 4 4 4 9 4 0 330.0 0.681818181818 123.0 0.723577235772 0.13696969697 0.208402203857 0.0413316637449 0.149532821326 0.0591595291761 0.0159571080776 0.0226182225176 0.0175563770994 0.125573683506 0.6 0.454545454545 1.0 2.0 3.0 1.0 0.0 0.0 5.0 5.0 5.0 12.0 0.1 0.0 2.0 2.0 0.372727272727 0.791666666667 0.625 0.541666666667 0.75 0.416666666667 0.583333333333 0.5 0.5 0.0 0.166666666667 0.208333333333 0.0416666666667 0.0 0.125 0.625 0.583333333333 0.5 0.833333333333 0.5 0.333333333333 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.166666666667 0.5 0.5 0.5 0.666666666667 0.666666666667 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -13.1953916454 -10.4463517193 -30.9681331725 -24.2572844255 1.85820271649 2.11965446936 -22.2562369342 -13.1573659939 3.19536275864 4.41671519882 -8.86207156068 7.78215707343 -2.94010790151 -1.69984548364 -13.3727065443 8.0890895595 3.79955648661 1.73021335087 4.31605835264 11.2549875705 -1.37551909256 -1.60742263891 2.41684226796 4.76989915364 -0.00932122549961 0.0875518186505 0 5 2 1 12 8 5 10 10 7 8 8 9 7 9 8 9 7 10 8 8 6 11 8 8 1 1 4 11 2 2 5 6 2 2 3 11 2 3 5 5 2 2 3 11 2 3 6 3 2 3 3 11 1 5 6 2 1 4 3 6 2 9 4 4 1 4 3 6 2 4 1 5 3 9 3 6 1 4 2 5 4 1 2 5 3 11 2 5 7 5 3 11 3 5 5 6 3 11 2 7 4 6 3 11 3 6 4 6 4 10 3 6 4 6 4 9 5 6 3 5 5 7 8 5 2 4 9 5 4 1 3 11 2 1 5 6 0 693.0 1.57142857143 267.0 0.700374531835 0.163146617692 0.178176321033 0.105965653213 0.0549522534993 0.0473852253117 0.047281008423 0.0113841735074 0.0149640691599 -0.000839757377738 0.424242424242 2.2380952381 9.0 2.0 3.0 0.0 6.0 15.0 13.0 10.0 3.0 10.0 0.285714285714 4.0 1.0 3.0 0.385281385281 0.759259259259 0.314814814815 0.185185185185 0.518518518519 0.222222222222 0.518518518519 0.537037037037 0.314814814815 0.611111111111 0.518518518519 0.388888888889 0.444444444444 0.240740740741 0.185185185185 0.166666666667 0.259259259259 0.866666666667 0.533333333333 0.4 0.4 0.2 0.2 0.4 0.4 0.8 1.0 0.866666666667 0.466666666667 0.133333333333 0.133333333333 0.266666666667 0.333333333333 0.266666666667 0.466666666667 0.666666666667 0.933333333333 0.866666666667 0.666666666667 0.533333333333 0.266666666667 0.0 0.0 0.0 0.2 0.4 0.4 0.866666666667 0.8 0.266666666667 0.4 0.333333333333 0.4 0.266666666667 0.133333333333 0.133333333333 0.0 1.0 1.0 0.8 0.6 0.6 0.6 0.6 0.6 0.6 0.333333333333 0.2 0.2 0.2 0.2 0.2 0.266666666667 0.0 0.0 0.0 0.0 0.266666666667 0.2 0.0 0.0 -19.3686742866 11.1890747871 -51.5667786714 26.5696083681 -7.8296951184 -1.25421375974 -80.8812633714 18.5535354616 2.56413332929 -4.6433104466 -49.8795512378 -3.49084150314 11.8845164132 2.31952249827 17.2368725276 7.26654824378 -4.67012121426 1.37255541885 3.88254761023 17.7900985875 -1.24378988634 -1.87079256346 -26.2040323969 5.22906957128 -0.402981084385 0.152259940228 4 7 7 9 5 4 3 4 3 4 5 4 1 4 7 3 1 4 7 8 8 7 7 3 1 4 7 3 1 4 7 3 2 4 5 3 4 4 3 3 6 8 10 2 7 0 210.0 1.07142857143 99.0 0.686868686869 0.204761904762 0.202721088435 0.0936491739553 0.0766552208185 0.044114026563 0.0336300379875 0.00832317826321 0.00990801169316 0.00430196012093 0.533333333333 0.714285714286 0.0 2.0 3.0 1.0 1.0 3.0 3.0 2.0 3.0 11.0 0.243243243243 0.0 2.0 3.0 0.471428571429 0.375 0.9375 1.0 0.625 0.75 0.3125 0.25 0.625 0.5625 0.0 0.0 0.3125 0.75 0.5 0.4375 0.625 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.34760608789 5.85690190578 -18.8025493712 18.685842599 -8.68405957934 6.8234321913 -47.8754159655 42.2634481873 0.917059427549 -0.556654041356 -46.8595098424 39.4023160009 1.07686327453 -2.60839720243 -41.245335928 22.2294986392 -2.70897099953 1.07822860485 -59.2261875502 29.2126550339 -0.266932602285 1.97492094043 -66.034122916 51.9644897058 0.0976864797342 0.399257723302 17 2 1 1 9 4 4 6 5 17 4 3 3 5 3 4 3 3 5 4 5 1 4 3 5 4 10 3 5 4 9 4 5 3 10 4 5 3 9 5 4 4 8 6 3 5 9 5 4 4 9 5 5 3 10 3 6 3 10 4 4 4 10 3 6 3 10 3 6 3 10 3 6 3 10 4 5 3 9 4 5 4 9 5 4 5 7 6 3 7 18 1 9 0 506.0 0.95652173913 186.0 0.758064516129 0.149029823931 0.165921979722 0.0581547496687 0.0812694586489 0.0328192715859 0.0213367701403 0.00923723323611 0.00426083858827 0.0336329252222 0.545454545455 1.0 2.0 5.0 2.0 0.0 6.0 5.0 5.0 5.0 3.0 12.0 0.177419354839 1.0 1.0 2.0 0.367588932806 0.25 0.694444444444 0.722222222222 0.611111111111 0.388888888889 0.25 0.222222222222 0.111111111111 0.583333333333 0.611111111111 0.583333333333 0.583333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.666666666667 0.777777777778 0.444444444444 0.333333333333 0.0 0.333333333333 0.666666666667 0.888888888889 1.0 1.0 1.0 1.0 0.222222222222 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.444444444444 0.444444444444 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.444444444444 0.0 0.0 0.333333333333 0.333333333333 0.111111111111 0.111111111111 0.555555555556 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.777777777778 0.777777777778 0.333333333333 1.0 1.0 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.444444444444 0.555555555556 0.333333333333 0.111111111111 0.0 0.0 0.0 0.0 -26.2951645108 9.2448262596 -65.6631115704 24.7953343087 -2.58069864492 4.31093145766 -70.4256141839 44.1133710043 7.26122911495 2.78014625255 -30.4170224165 56.5977963766 1.48746970676 -0.904859435842 -8.43299898379 51.2910553317 0.622763281234 -1.14351267431 -1.4077361551 35.8531297094 0.888891908891 -1.46972283883 11.3232955122 21.8037736943 0.336969661459 0.140635896189 5 6 5 9 3 4 2 4 2 4 4 4 1 4 6 1 1 4 9 4 9 4 9 4 9 4 9 5 6 1 2 5 3 3 3 9 5 8 2 0 182.0 0.928571428571 87.0 0.632183908046 0.183854606932 0.223312401884 0.0665771705652 0.110194825703 0.0388246429334 0.022434549728 0.0127485050927 0.00571853040802 0.0441872418464 0.615384615385 0.357142857143 0.0 2.0 3.0 3.0 1.0 2.0 0.0 2.0 2.0 8.0 0.137931034483 1.0 2.0 1.0 0.478021978022 0.375 0.875 1.0 0.8125 0.6875 0.375 0.25 0.625 0.6875 0.0625 0.0 0.3125 0.75 0.3125 0.0 0.375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -11.2772645391 0.227364204417 -27.5769802982 3.90237998531 -0.5029853012 5.3785554602 -29.5593751469 24.988465356 1.26545556406 2.50491007588 -22.2518728998 38.4266316213 -0.633558736171 -1.64523572252 -23.5570530918 27.9853854334 0.0132684346857 -1.09311858353 -24.1346927171 15.7555578987 -0.0668315798879 -0.247032715478 -27.3336926292 8.46640113305 -0.386366295962 -0.393168348758 3 7 4 9 2 3 5 2 2 5 3 13 2 2 10 3 9 3 9 3 9 4 7 1 1 4 4 3 1 5 3 3 3 7 6 1 1 2 4 0 168.0 0.857142857143 80.0 0.7375 0.189484126984 0.204931972789 0.0656676857251 0.104985793921 0.04124234019 0.0218030887115 0.0134838962371 0.00854757549908 0.0415513988671 1.25 0.428571428571 1.0 5.0 6.0 3.0 1.0 1.0 1.0 2.0 6.0 16.0 0.1 0.0 3.0 1.0 0.47619047619 0.416666666667 0.833333333333 1.0 0.583333333333 0.833333333333 0.583333333333 0.416666666667 0.833333333333 0.666666666667 0.416666666667 0.0 0.5 0.5 0.25 0.0 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.75 1.0 1.0 1.0 0.5 0.25 0.5 0.5 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -9.82213363081 2.4555334077 -24.5376043792 9.13075786542 -1.21384644644 5.30918617743 -28.8559978669 31.3220769704 1.19748304181 3.5035299301 -21.6805600331 50.1553858957 0.0989785766667 -0.824861830598 -18.3368483367 44.678490112 0.172420088968 -1.60215783986 -15.8481446671 30.5299597219 0.396899187969 0.350883794576 -11.6460432727 31.4032304566 0.0357144737559 0.182138264742 1 3 1 3 4 4 12 3 7 3 3 3 5 5 2 3 4 6 3 3 3 6 3 2 4 6 2 4 3 6 2 4 3 6 3 3 3 6 2 4 3 6 3 2 4 5 5 1 5 3 6 3 1 6 4 1 0 210.0 1.07142857143 100.0 0.74 0.214603174603 0.21462585034 0.0978214015765 0.0872788035849 0.0589746247705 0.0349240906119 0.0155493464114 0.0170920629241 0.00680328198196 0.466666666667 0.928571428571 2.0 1.0 1.0 2.0 2.0 3.0 3.0 3.0 3.0 8.0 0.157894736842 0.0 1.0 2.0 0.47619047619 0.75 0.6875 0.5625 0.625 0.75 0.5625 0.5 0.5625 0.5 0.0 0.0 0.0625 0.625 0.5 0.5 0.6875 0.5 1.0 0.75 0.5 0.25 0.25 0.25 0.0 0.5 1.0 1.0 1.0 0.75 0.75 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.56507072526 3.39530545263 -11.5336784904 9.89792103414 -4.06304885831 2.52610725675 -23.3513811426 18.3216795961 2.1153004474 -0.811184581719 -15.0987154075 12.4828636268 0.201007373697 -2.19196493549 -13.7538326007 -3.79118246269 -2.11427865782 -0.574965804895 -28.9131276089 -10.8253896709 -0.0286289695973 0.410251031453 -34.9426049736 -7.68566688388 -0.193257140405 0.0234186906408 3 1 4 4 2 6 1 6 2 4 37 5 3 4 3 4 4 4 3 3 4 3 4 3 4 3 4 4 2 5 2 13 154.0 0.318181818182 72.0 0.694444444444 0.189239332096 0.255017709563 0.0193863313276 0.380360236828 0.0610760886946 0.00252424499809 0.0273975814763 0.00587780093119 0.639273399582 1.28571428571 195225785.955 2.0 2.0 1.0 2.0 0.0 4294967291.0 0.0 0.0 4.0 0.0 0.166666666667 0.0 7.0 1.0 0.467532467532 0.5 0.166666666667 0.333333333333 0.166666666667 0.666666666667 0.166666666667 0.75 0.666666666667 0.75 0.166666666667 1.0 1.0 0.75 0.166666666667 1.0 1.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -4.80358555514 -2.74903992613 -8.78189142429 -1.18525471096 3.06436042571 7.54802182589 -4.82643348919 21.206497026 -3.52626611532 -1.5571618497 -9.87063196967 23.2552325825 3.7022628243 1.39973922332 -0.896516264101 26.7912108039 -2.84700040338 0.128531958409 -6.87900127426 31.504820714 1.95367312682 0.0849902489651 -2.70455351978 28.6704840056 -0.308859157002 -0.291754619731 5 1 7 2 1 3 2 2 3 3 2 2 5 1 2 3 6 5 6 7 4 1 1 5 7 4 1 1 5 3 1 1 5 6 4 2 2 3 2 2 5 4 3 0 140.0 0.714285714286 61.0 1.14754098361 0.199285714286 0.214285714286 0.059540451895 0.127142857143 0.0567857142857 0.0166098986724 0.0146211686068 0.0113703431342 0.0671224958715 1.3 0.571428571429 2.0 3.0 4.0 2.0 2.0 1.0 2.0 3.0 4.0 9.0 0.25 2.0 3.0 1.0 0.435714285714 0.333333333333 0.75 0.333333333333 0.583333333333 0.333333333333 0.75 0.416666666667 0.25 0.333333333333 0.333333333333 0.583333333333 0.0833333333333 0.583333333333 0.25 0.833333333333 0.666666666667 0.0 0.25 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.5 0.5 0.0 0.25 0.75 1.0 0.75 0.25 0.5 0.25 0.0 0.0 0.25 0.75 1.0 0.5 0.5 0.5 0.25 0.0 0.0 0.5 1.0 0.75 0.5 1.0 0.5 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.25 0.75 1.0 -4.68370261099 2.22816920329 -12.6399036023 6.68137198886 -1.40548199016 2.58870387029 -13.7897035452 19.7559187144 3.50297122589 3.13926425533 1.07050032748 33.2205100643 -0.658399428761 -1.14883079519 3.29606247156 32.5503147764 0.251765010965 1.20921915007 2.59584041846 35.6016996117 0.0713748883137 -0.578440324098 5.48264093024 35.8381491689 0.106137893301 0.20283788004 6 2 7 8 3 10 1 4 4 7 5 2 1 4 8 4 8 4 8 4 8 4 8 5 6 1 1 5 4 2 1 6 2 3 2 8 7 2 5 0 180.0 0.8 85.0 0.682352941176 0.17962962963 0.218518518519 0.0585075445816 0.116670096022 0.0396364883402 0.0203056329913 0.0120967721777 0.00683860999008 0.0597088911673 0.666666666667 0.333333333333 0.0 2.0 3.0 3.0 0.0 2.0 0.0 2.0 1.0 9.0 0.233333333333 0.0 2.0 1.0 0.472222222222 0.25 0.916666666667 1.0 0.833333333333 0.666666666667 0.75 0.666666666667 0.916666666667 0.666666666667 0.0833333333333 0.0 0.5 0.666666666667 0.0 0.0 0.0833333333333 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -13.4114565379 4.75342763368 -30.6992935618 17.0857921514 2.45593761073 8.75536099384 -22.9617931499 50.0105283636 1.54143514161 2.3668883897 -10.5067071911 64.6052369656 0.27117634904 -1.20620356538 -3.94358198058 58.7781417956 1.40888110519 0.991277249407 4.5434146043 65.9235668533 -1.09467798179 1.75764935858 -4.70754695951 85.3756240179 -0.305162389115 0.322443476433 0 4 4 1 1 5 1 23 2 4 7 3 7 3 6 3 8 3 7 3 7 3 6 5 4 6 4 6 4 0 140.0 0.714285714286 72.0 0.486111111111 0.172142857143 0.210204081633 0.0390885568513 0.129058309038 0.0251413994169 0.0103673564984 0.0039674923446 -0.00185440606724 0.0891403323713 0.5 0.142857142857 3.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 3.0 5.0 0.0869565217391 0.0 1.0 1.0 0.514285714286 1.0 0.583333333333 0.416666666667 0.583333333333 0.916666666667 1.0 0.916666666667 1.0 0.666666666667 0.5 0.25 0.5 0.833333333333 0.25 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.0 0.25 0.25 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.25 0.75 1.0 0.75 0.5 0.5 0.25 0.25 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -9.14004101756 5.86599647396 -17.5562503445 15.7632686194 6.12908933907 2.43465302158 -0.725614374867 24.7629084755 -1.65716403202 0.0369597038667 -0.701220631044 26.4739110389 0.37205202284 0.812944723929 -0.224781640421 31.5951422591 1.00891883208 0.752008335358 7.21089355807 37.7586818528 -0.647297500132 -0.144023052306 3.17008640232 36.7786138921 -0.0345654828239 -0.0521383335455 2 2 3 5 3 13 2 8 2 4 2 5 5 3 3 4 5 3 3 4 5 3 3 4 5 3 3 3 6 3 3 3 6 3 3 3 7 2 3 3 6 3 3 4 5 3 1 7 2 9 1 2 6 3 1 2 12 0 225.0 1.0 114.0 0.675438596491 0.226962962963 0.215111111111 0.0943841097394 0.0884037530864 0.0478691028807 0.0315135087489 0.00841305266392 0.0113018735632 0.00512568373845 0.466666666667 0.933333333333 2.0 1.0 1.0 1.0 2.0 3.0 3.0 4.0 4.0 10.0 0.139534883721 2.0 1.0 2.0 0.506666666667 0.8125 0.5625 0.5 0.625 0.75 0.75 0.5625 0.6875 0.5625 0.0 0.0 0.125 0.75 0.5 0.4375 0.5625 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 0.75 0.5 0.5 0.5 0.25 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -3.14065754368 6.28131508736 -8.94481553277 17.7611471453 -1.72255163297 4.05625824741 -12.557702814 33.008528809 2.49301769966 0.346254088406 0.159350527119 33.7082049283 1.04990810755 -1.72362956094 8.79256808033 20.8648049935 -0.833918922256 -0.714162925795 3.13580308819 11.5855177721 -0.449881667151 -0.370710506356 -4.68524736781 3.55436365769 -0.190026674166 -0.453587466527 5 3 5 1 5 3 1 8 3 3 4 7 2 2 6 5 3 3 6 2 5 2 7 1 6 2 7 1 6 3 5 1 8 2 5 1 9 1 13 3 13 3 13 5 11 8 9 3 3 5 2 4 8 2 2 3 10 1 2 3 10 1 2 3 10 1 2 4 8 1 4 1 1 3 15 2 9 0 352.0 0.727272727273 107.0 1.16822429907 0.117009943182 0.131198347107 0.039346971519 0.0914373591285 0.0261241474338 0.0159746980644 0.00961979309535 0.00604405037931 0.0627117074777 1.25 0.727272727273 4.0 8.0 5.0 3.0 5.0 4.0 2.0 5.0 5.0 8.0 0.448275862069 2.0 2.0 1.0 0.303977272727 0.375 0.375 0.541666666667 0.791666666667 0.458333333333 0.375 0.666666666667 0.208333333333 0.25 0.0 0.25 0.0 0.583333333333 0.166666666667 0.25 0.0833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.166666666667 0.5 0.5 0.333333333333 0.166666666667 0.5 0.333333333333 0.666666666667 0.5 1.0 1.0 0.833333333333 0.5 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.666666666667 0.833333333333 0.833333333333 1.0 1.0 0.5 0.666666666667 0.333333333333 0.166666666667 0.333333333333 0.5 0.666666666667 1.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 -13.3979524821 5.93213878797 -29.0302882387 18.148562583 4.44330468096 5.38221122728 -17.4048568945 35.7041476016 -0.642901931269 -0.267640524322 -12.4774883228 43.7098478116 0.72042026652 3.60147572775 -7.30681563988 59.4385892371 1.34881383746 -0.877496295026 3.84418557778 63.1966175972 -0.530107224929 1.20239090763 -0.886490536888 64.3239138922 -0.246090892175 -0.463480187151 0 5 1 6 2 13 2 5 4 4 2 4 5 2 4 2 6 3 2 3 6 3 2 3 6 3 2 3 6 3 1 4 6 3 1 4 5 3 2 4 5 10 3 11 3 5 3 2 9 0 196.0 1.0 108.0 0.537037037037 0.257653061224 0.238702623907 0.107370626822 0.0968892372651 0.0506643437258 0.0335392180873 0.00692159828566 0.00975955129999 -0.0072275103755 0.571428571429 0.857142857143 3.0 1.0 1.0 1.0 2.0 3.0 3.0 3.0 1.0 9.0 0.222222222222 0.0 1.0 2.0 0.551020408163 0.8125 0.4375 0.625 0.875 0.8125 0.5625 0.5 0.625 0.5 0.0 0.0 0.125 0.75 0.5 0.5625 0.875 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.25 1.0 1.0 0.75 0.25 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.59154943092 2.31911488505 -5.19302299465 8.505374427 -2.01054917906 4.50877137616 -12.1396143426 25.227461339 0.0121494491573 0.987230337488 -13.3514065749 31.1986446865 -0.157713878543 -1.00190985092 -14.8049790293 24.9192638333 -0.660262420313 0.0548282651481 -19.4494925193 23.5192647295 0.0822588631098 0.317845989656 -19.8863762562 26.6549822164 2.83200297392e-05 0.0459415610841 7 3 5 6 3 4 3 2 1 5 4 1 1 5 1 3 1 6 5 3 8 3 8 3 8 4 8 4 7 6 3 1 2 9 2 8 1 0 154.0 0.785714285714 76.0 0.657894736842 0.194214876033 0.243970315399 0.0579413207808 0.136254115256 0.0449178920253 0.0174255064192 0.0145164534955 0.0059910447945 0.0760306787926 1.0 0.285714285714 0.0 1.0 2.0 4.0 1.0 2.0 0.0 1.0 3.0 8.0 0.193548387097 1.0 2.0 1.0 0.493506493506 0.25 0.833333333333 1.0 0.666666666667 0.583333333333 0.833333333333 0.416666666667 0.916666666667 0.583333333333 0.5 0.0 0.583333333333 0.416666666667 0.166666666667 0.0 0.333333333333 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 0.75 0.5 0.5 0.5 0.25 0.0 0.0 0.75 0.5 0.0 0.25 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -12.3686127203 1.3641852265 -27.8142211965 5.19302700821 3.15525834701 3.31162923862 -16.6375180749 20.1754245745 2.243339443 3.29678569883 -1.89317236801 37.9581097675 -0.686161819694 -0.0299935721336 -2.18007801431 37.4783380215 0.643096642777 -1.9367131002 1.26210120441 18.5822894683 0.0618762755758 -1.54424405153 2.00005261586 -1.17086147355 -0.153225553714 -0.23538774206 1 14 1 3 3 1 20 2 1 4 1 4 2 3 2 2 3 2 3 3 2 2 3 3 2 3 1 3 2 4 1 4 105.0 0.238095238095 57.0 0.59649122807 0.270476190476 0.26485260771 0.0208582226541 0.485246949573 0.0664135622503 0.00158713694694 0.023220396357 0.00189801512107 0.926565604872 1.6 204522252.048 0.0 2.0 1.0 1.0 0.0 4294967293.0 0.0 0.0 1.0 6.0 0.277777777778 0.0 3.0 1.0 0.542857142857 0.5 0.166666666667 0.0833333333333 0.25 0.75 0.333333333333 0.583333333333 0.75 0.75 0.416666666667 1.0 1.0 0.583333333333 0.5 0.75 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -1.6370222718 -0.0606304545112 -3.49136543825 3.72652623306 0.423175825364 5.98137994096 -3.52508281623 25.3921755403 -0.700905711961 1.18127177369 -4.13426418354 33.1975049062 0.829314261138 -1.10477351617 -2.87114663782 29.6943494404 -1.04775388925 1.33378043624 -6.41615998995 31.9610669252 0.633601977211 -1.71065522916 -5.91339622505 21.7670267781 -0.185056337141 0.07439977316 1 1 1 2 11 6 10 6 11 5 12 4 12 4 12 4 12 4 12 4 12 9 7 5 1 5 6 3 4 4 5 2 6 4 4 2 7 3 4 2 7 4 3 2 7 4 3 2 7 4 2 3 7 3 3 3 6 4 3 3 5 4 4 5 2 4 5 11 3 0 352.0 0.727272727273 135.0 0.637037037037 0.158380681818 0.205320247934 0.0498740227038 0.137040755159 0.0654683904841 0.0181554519821 0.0239303616491 0.0187577373339 0.0963074724957 0.5 0.545454545455 1.0 3.0 4.0 0.0 1.0 0.0 5.0 5.0 4.0 10.0 0.153846153846 0.0 2.0 2.0 0.383522727273 0.708333333333 0.5 0.291666666667 0.416666666667 0.708333333333 0.833333333333 0.625 0.583333333333 0.0 0.291666666667 0.125 0.0833333333333 0.0 0.25 0.5 0.5 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.166666666667 0.0 0.0 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.333333333333 0.5 0.5 0.5 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -9.57823384789 -9.40461027361 -23.5036567391 -23.9222298899 -0.297623330846 -0.642718121051 -23.7655228744 -19.2243900091 1.32316773636 6.41766952584 -20.1964567812 7.06515428144 -2.2941862712 -2.26150712003 -25.4263089614 9.82878002057 2.43704249908 2.61042742425 -17.0603824724 15.0612984524 -2.01794253841 -2.64480013457 -28.4419220496 1.97259219488 -0.140898854828 0.141495579787 1 6 6 5 9 3 10 2 4 4 3 2 4 4 2 2 4 9 4 10 3 10 3 9 4 8 6 8 4 9 4 9 4 9 4 9 4 9 4 9 4 9 4 9 4 8 6 7 0 273.0 0.619047619048 104.0 0.557692307692 0.126232741617 0.160300017443 0.0297712368718 0.125607078632 0.0151605071301 0.0104027182558 0.00332613846206 -0.0021393432739 0.108355892756 0.307692307692 0.0952380952381 2.0 2.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 5.0 0.142857142857 0.0 1.0 1.0 0.380952380952 0.333333333333 0.708333333333 0.791666666667 0.791666666667 0.666666666667 0.541666666667 0.541666666667 0.541666666667 0.5 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.5 0.666666666667 0.5 0.5 0.0 0.333333333333 0.833333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.666666666667 0.166666666667 0.0 0.166666666667 0.166666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -17.2796795357 9.51898135826 -32.2295435176 25.5100819289 13.0986528868 3.99666057288 5.02489623557 41.0162425348 -3.11024121423 0.399787018289 3.43144128782 42.6497889696 -1.17730237343 -0.490634742132 -7.38278217699 39.679212169 1.88071662856 0.720125238179 4.34301261372 44.1668798513 -0.620517420835 0.514923205255 3.38323207099 50.1735873977 0.0293549535158 0.0136330098606 4 1 4 1 7 2 2 3 4 2 5 3 2 3 5 16 1 3 10 3 10 3 10 3 10 4 10 4 5 1 3 4 4 2 5 8 6 6 3 0 182.0 0.928571428571 72.0 0.930555555556 0.150464919696 0.191522762951 0.0601874275947 0.0968939887549 0.0404978429372 0.023369167283 0.0139389973012 0.00854701429111 0.0480862314132 0.846153846154 0.428571428571 0.0 5.0 4.0 2.0 3.0 1.0 0.0 2.0 4.0 8.0 0.0857142857143 1.0 3.0 1.0 0.395604395604 0.3125 0.8125 0.8125 0.6875 0.3125 0.3125 0.0625 0.5625 0.3125 0.3125 0.0 0.3125 0.625 0.4375 0.0 0.3125 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.5 0.0 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.25 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.25 0.25 0.0 0.5 0.5 0.0 0.0 0.0 -8.54889408608 0.727565454134 -21.6744750756 3.6696761931 -1.44121065086 3.40025487749 -26.0040274287 19.4800420232 1.76797685668 3.88831614761 -15.8250474027 40.4665537564 0.54405496445 0.0828505583109 -10.7916834269 41.1618624475 -0.844643414403 -1.90084196728 -17.6760923509 25.0374686697 -0.775350927649 -0.421668615014 -27.7288300461 15.353099029 -0.219793208368 -0.249867430606 1 11 1 19 8 16 2 2 5 14 3 4 4 14 3 5 3 14 2 6 3 13 4 5 3 13 4 5 3 13 4 5 3 13 4 5 3 11 5 6 12 3 5 5 4 4 4 4 3 6 3 5 5 3 3 5 4 6 5 2 4 5 3 6 5 2 3 6 3 6 4 3 3 6 3 6 4 3 3 5 3 7 3 3 4 6 2 7 3 3 4 5 3 7 4 1 5 5 5 3 6 1 6 4 4 5 1 3 1 1 0 550.0 1.13636363636 204.0 0.754901960784 0.161454545455 0.204710743802 0.0842290007513 0.0859553478588 0.0602344703231 0.0384582258836 0.0159550218641 0.0229621311637 0.0232640498029 0.56 1.45454545455 6.0 3.0 2.0 3.0 3.0 5.0 10.0 10.0 5.0 13.0 0.133333333333 0.0 11.0 3.0 0.370909090909 0.261904761905 0.547619047619 0.547619047619 0.52380952381 0.47619047619 0.285714285714 0.309523809524 0.357142857143 0.238095238095 0.404761904762 0.428571428571 0.261904761905 0.0 0.119047619048 0.666666666667 0.571428571429 0.0 0.166666666667 0.333333333333 0.5 0.666666666667 0.75 0.5 0.5 0.25 0.666666666667 0.666666666667 0.75 0.666666666667 0.583333333333 0.583333333333 0.583333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.5 0.5 0.5 0.5 0.583333333333 0.5 0.333333333333 0.5 0.5 0.5 0.666666666667 0.75 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.583333333333 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.583333333333 0.916666666667 0.833333333333 -14.0056349921 -1.22230996295 -39.3328711356 -3.0529904675 -9.36574637274 0.301666098855 -78.5270152137 0.754751377607 -3.6287436218 2.22910223322 -89.8684071953 8.51439665565 4.9206324087 -2.01354470694 -68.8028380491 -2.98889991616 -2.9332817656 -1.65236387117 -73.9142291383 -22.5322955414 1.30457439061 -1.14880264967 -73.5102510803 -33.8585029925 -0.1474255789 0.00300983154028 9 4 10 5 11 4 11 4 11 4 12 3 12 3 8 1 2 4 6 9 4 11 3 4 4 4 3 3 5 4 2 4 6 3 2 4 6 3 2 3 7 3 2 3 6 4 2 3 7 3 2 4 5 4 3 5 2 7 2 13 3 12 315.0 0.714285714286 145.0 0.544827586207 0.23746031746 0.262433862434 0.0714894719793 0.163937627726 0.0652913412278 0.0158059833237 0.014018711143 0.00951577697811 0.0825748438887 0.666666666667 0.47619047619 0.0 3.0 6.0 0.0 0.0 1.0 5.0 4.0 6.0 7.0 0.0625 0.0 2.0 2.0 0.460317460317 0.0 0.208333333333 0.833333333333 0.666666666667 0.0 0.416666666667 0.208333333333 0.5 0.25 0.458333333333 0.125 0.5 0.958333333333 0.916666666667 0.875 0.958333333333 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.5 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -3.51656636165 -11.2772645391 -11.1315068919 -30.8264251502 -2.47966185389 -3.89519736329 -10.7885720989 -34.7573582113 6.84433317726 9.00773438954 12.1126531945 4.61153097056 -4.0294016635 -0.499554918186 2.89780345047 19.4484219243 1.77689383125 1.51124046614 4.07019580967 22.8280019844 -0.439998464694 -1.35895402155 7.66643816113 15.2612766668 0.0881695786706 -0.0308320581853 10 1 10 4 9 5 9 4 10 2 10 3 10 3 10 3 10 3 5 8 3 4 2 5 1 4 4 4 1 3 6 3 1 3 5 8 5 8 5 8 5 8 6 2 2 3 6 3 1 4 4 4 2 5 2 4 2 5 3 2 4 3 4 1 2 0 299.0 0.565217391304 130.0 0.638461538462 0.239516336506 0.241675149048 0.064765872633 0.185050790847 0.0636571183034 0.0160466566336 0.0123831661019 0.00948685261865 0.127089816407 0.692307692308 0.565217391304 0.0 2.0 2.0 3.0 0.0 0.0 5.0 5.0 2.0 12.0 0.209302325581 0.0 1.0 2.0 0.434782608696 0.0 0.0833333333333 0.791666666667 0.833333333333 0.0 0.25 0.375 0.416666666667 0.25 0.416666666667 0.25 0.208333333333 0.708333333333 0.791666666667 0.958333333333 0.875 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.775015375056 -6.91978013443 0.449550520739 -14.6618810072 -1.0728406191 4.38491685736 3.12101595917 8.90318576706 4.37573087217 7.97389903679 15.5651065059 44.7645605996 -3.73008844671 -3.56550201413 2.82379460579 34.0961312787 1.40034905473 0.260636401868 4.75271933791 25.6554851673 0.262448135231 -0.240127273328 11.2959656999 26.3297735943 -0.0936086824036 0.106254956181 5 6 3 8 3 3 1 3 3 4 7 3 8 3 8 3 7 4 7 3 8 6 5 5 6 4 7 4 7 4 7 4 7 4 8 3 8 2 8 4 7 5 5 7 8 1 6 0 242.0 0.5 93.0 0.709677419355 0.127723516153 0.169609316304 0.0207689715454 0.160705233972 0.0228352283664 0.00519214028258 0.00907866004667 -0.000600153625989 0.165985224159 0.636363636364 0.0454545454545 1.0 0.0 4.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 0.310344827586 0.0 2.0 1.0 0.384297520661 0.166666666667 0.555555555556 0.666666666667 0.611111111111 0.722222222222 0.944444444444 1.0 0.944444444444 0.611111111111 0.444444444444 0.388888888889 0.444444444444 0.444444444444 0.0555555555556 0.0 0.0555555555556 0.0 0.0 0.0 0.333333333333 0.5 0.5 0.5 0.333333333333 0.0 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.333333333333 0.666666666667 0.666666666667 0.5 0.5 0.833333333333 0.333333333333 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -13.3690152197 5.03508365418 -22.4382840864 14.054304542 12.735145683 3.48861417333 8.57797968563 30.6725621253 -7.00529349874 3.44965085414 -4.6084776557 47.3770852997 3.08490258097 -0.200117370423 0.184529934608 49.992458529 -0.0865897042564 0.0166842975677 6.1981366863 44.7017713433 -1.03695612757 -0.935029125117 -4.2032095626 41.1177422715 0.161763111481 0.459052807638 1 3 2 4 3 3 4 3 13 1 4 3 4 3 3 4 3 4 3 4 3 4 3 4 4 3 4 3 6 3 4 3 2 1 1 119.0 0.411764705882 66.0 0.575757575758 0.228091236495 0.260998517054 0.0275855275378 0.242022266148 0.0519013339394 0.00373201492634 0.0165930502225 0.00355882524469 0.288943925336 0.428571428571 0.0588235294118 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 7.0 0.12 0.0 2.0 1.0 0.554621848739 0.4 0.6 0.5 0.3 0.7 1.0 1.0 0.6 0.9 1.0 1.0 0.8 1.0 0.8 0.6 1.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 -5.46744039798 3.59502930278 -8.30347939702 9.46313061765 6.01503965669 1.19730647195 4.28331040575 13.8585061001 -4.77953663508 -0.200582327211 -6.00531460224 12.655438307 2.92998130309 -0.201844363201 0.1183405977 10.5276684387 -1.18848978274 -0.0860501080369 -0.101245008905 8.34445983419 0.186039374172 -0.55260721562 -2.94863537083 1.15037289004 0.0730416591265 -0.275972911229 3 1 12 6 10 6 10 6 12 4 12 4 12 4 12 4 12 4 12 4 1 5 6 11 5 4 4 4 4 4 5 3 4 3 6 3 4 2 7 3 4 2 7 3 4 2 7 3 4 2 7 3 4 3 6 3 4 3 6 3 3 5 5 3 2 7 2 11 1 1 4 1 1 2 3 1 14 0 384.0 0.666666666667 143.0 0.748251748252 0.140950520833 0.193359375 0.0402220973262 0.13636885749 0.0549602508545 0.0141250040867 0.020116525338 0.0159620486991 0.107755777901 0.4375 0.625 2.0 3.0 2.0 0.0 0.0 2.0 6.0 7.0 3.0 6.0 0.18 1.0 1.0 2.0 0.372395833333 0.708333333333 0.5 0.5 0.541666666667 0.666666666667 0.791666666667 0.583333333333 0.416666666667 0.0 0.291666666667 0.166666666667 0.0 0.0 0.291666666667 0.625 0.5 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.333333333333 0.5 0.5 0.5 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -12.5997663281 -4.69507082121 -28.9643037154 -11.924518485 3.02422022941 0.487135702554 -14.5231237627 -1.9152543436 4.11236296933 6.90549665839 -1.34921023802 24.2180369005 -6.20097134253 -3.88524055848 -23.5366286691 14.9496123422 4.42949446567 1.70529810264 -4.13624166427 13.8360655935 -0.205312502351 -1.39174168565 2.83769570874 8.52270319095 -0.369343321058 0.130415944086 3 1 3 3 1 33 2 3 9 2 9 2 9 3 8 2 8 4 7 4 7 4 6 6 5 5 5 0 154.0 0.785714285714 72.0 0.555555555556 0.184179456907 0.182745825603 0.0500883835342 0.105750296255 0.0274821316312 0.0139698427517 0.00579550922524 -0.00210421373514 0.0542055498567 0.454545454545 0.0714285714286 1.0 1.0 3.0 0.0 1.0 0.0 0.0 0.0 5.0 0.0 0.166666666667 0.0 7.0 1.0 0.467532467532 0.75 0.333333333333 0.0833333333333 0.416666666667 0.833333333333 0.833333333333 0.75 1.0 0.75 0.5 0.5 0.75 0.916666666667 0.25 0.0 0.0833333333333 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 1.0 1.0 0.5 0.0 0.0 0.25 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -8.18511135901 6.09336067838 -15.9686429976 16.9828083294 4.89714655799 3.30791716998 -4.37928626824 27.9377145328 -2.6955016003 -0.98499078587 -9.98841720484 23.9394979559 0.391700858489 -0.321756215219 -12.2537258243 19.5528554849 0.205139214567 0.0248634511176 -8.54184803114 17.244914305 0.0726241828668 -0.829578541841 -6.21902197692 8.23955058299 0.225527164386 -0.263215786442 4 2 4 2 5 6 1 6 2 15 2 9 2 3 3 5 6 3 3 4 6 2 4 4 6 3 3 3 7 3 3 3 7 2 4 4 6 2 4 4 6 3 3 4 5 12 4 4 1 6 5 1 3 0 224.0 1.14285714286 115.0 0.591304347826 0.238560267857 0.226721938776 0.10952438488 0.08235430926 0.0511228155464 0.0385530166455 0.00765729742665 0.0106674822715 -0.00858042567639 0.5 0.928571428571 3.0 2.0 0.0 3.0 2.0 3.0 3.0 3.0 5.0 11.0 0.186046511628 0.0 1.0 2.0 0.513392857143 0.625 0.4375 0.25 0.4375 0.875 1.0 0.875 1.0 0.6875 0.4375 0.125 0.3125 0.75 0.125 0.0 0.125 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 -2.78521150411 9.23098669933 -3.38952983995 23.3403377342 4.40100719589 1.60647020683 7.31855475254 29.3984571272 -3.32763416447 -0.684684876031 -6.67400699409 25.6268542637 -1.59430977598 0.359229701283 -18.585534814 26.6605848063 1.45873139548 0.465826564013 -11.6614167831 30.4266182918 -0.804801153018 0.0577100394705 -13.8136872169 31.4010965107 0.133484354417 -0.0166720554804 1 6 5 7 7 6 8 4 9 3 5 3 2 2 4 5 2 2 3 6 2 2 2 6 3 2 2 6 3 1 2 6 7 6 7 5 7 6 4 2 1 5 5 2 9 4 8 7 4 6 0 221.0 0.764705882353 111.0 0.612612612613 0.263139575357 0.235560287463 0.0823051176961 0.127003858953 0.0508093443115 0.0187249318342 0.00602312171799 0.00453544143189 0.029484661558 0.692307692308 0.588235294118 1.0 3.0 3.0 2.0 0.0 4.0 4.0 2.0 2.0 10.0 0.307692307692 0.0 3.0 2.0 0.502262443439 0.05 0.45 0.6 0.5 0.6 0.55 0.05 0.6 0.9 0.1 0.3 0.65 0.75 0.6 0.9 0.35 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.5 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.0 0.166666666667 0.833333333333 1.0 0.666666666667 0.333333333333 0.333333333333 0.833333333333 0.0 0.5 1.0 0.666666666667 0.166666666667 0.0 0.333333333333 1.0 0.333333333333 0.833333333333 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 1.0 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.5 0.833333333333 1.0 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 0.833333333333 0.666666666667 -2.8460648647 3.44523641517 -10.6502017342 10.6208557778 -4.60470592934 2.98963797844 -19.6171419747 18.0470961171 5.62921639378 -2.5312453065 1.30964333824 8.94205054962 -1.40023897226 0.653597867195 -0.592824080559 8.70540094893 -1.40948280489 0.0960146078849 -14.1248796711 8.33628030006 0.295666715819 -1.42661424739 -16.4786459342 -7.75656809922 -0.306008287856 -0.496451910015 4 6 4 2 3 4 2 2 5 4 1 1 3 7 1 1 3 6 1 2 10 2 10 2 11 1 11 2 7 2 1 3 4 4 2 9 4 7 8 3 3 0 168.0 0.857142857143 70.0 0.942857142857 0.203869047619 0.187925170068 0.077930763079 0.104985793921 0.0512924663913 0.024143438445 0.0174659784022 0.0103041473824 0.0365036736276 1.08333333333 0.428571428571 1.0 4.0 5.0 3.0 2.0 2.0 1.0 1.0 3.0 7.0 0.242424242424 1.0 2.0 1.0 0.416666666667 0.333333333333 0.5 0.583333333333 0.416666666667 0.333333333333 0.0 0.0833333333333 0.666666666667 0.416666666667 0.333333333333 0.0 0.5 0.75 0.5 0.0 0.583333333333 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.0 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.0 -2.59195193035 -0.227364204417 -7.81888275238 2.44218161597 -2.2397694178 4.74077566638 -14.7758266482 20.7283301779 1.01302542674 2.09933580049 -9.41274027513 32.9905108758 1.05912427336 -0.923662852961 -2.44023423503 26.8139819351 -0.885831700838 -1.01077755819 -8.9203889895 16.037694066 -0.780008844427 -0.276075511071 -17.643135819 13.00988185 0.033390794239 0.208528174841 4 1 7 3 6 3 5 4 3 17 2 4 5 4 6 3 6 3 6 3 5 4 6 3 5 5 5 5 4 6 4 3 3 0 153.0 0.529411764706 71.0 0.704225352113 0.178649237473 0.224144559785 0.0281289499011 0.175466840445 0.0464619356222 0.00465509569429 0.0143677997665 0.00354100255322 0.167516360654 0.555555555556 0.0 2.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 4.0 0.166666666667 0.0 3.0 1.0 0.464052287582 0.266666666667 0.733333333333 0.4 0.333333333333 0.733333333333 1.0 1.0 0.933333333333 0.666666666667 0.6 0.333333333333 0.733333333333 0.2 0.333333333333 0.0 0.2 0.0 0.333333333333 0.833333333333 0.333333333333 0.0 0.166666666667 0.166666666667 0.0 0.0 0.5 1.0 0.833333333333 0.5 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.5 0.5 0.5 0.833333333333 1.0 0.333333333333 0.666666666667 0.666666666667 0.0 0.0 0.0 0.5 0.833333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.166666666667 -8.08881593126 3.52013285897 -13.759245487 8.41841804911 7.40153091749 0.0222875230709 4.06809613953 9.72686964841 -3.94917978405 0.674085929029 -1.54008350775 12.8824702476 2.31940762819 0.464044621468 1.36521710646 14.5675012798 -1.37329975484 -0.951939060072 -1.42234595362 6.84945017409 0.184936430375 -0.52051159209 -4.98476817374 -0.226991047276 0.0291981547245 -0.0614365686741 0 4 1 9 1 15 1 4 6 4 7 3 6 4 6 4 7 3 7 4 5 5 5 6 3 7 4 4 5 0 140.0 0.714285714286 76.0 0.447368421053 0.19 0.222448979592 0.0416632653061 0.134294460641 0.0259489795918 0.0101811766017 0.0054423991594 -0.00308207798246 0.0823525099426 0.5 0.142857142857 3.0 0.0 2.0 0.0 2.0 0.0 0.0 0.0 3.0 6.0 0.125 0.0 6.0 1.0 0.542857142857 0.916666666667 0.583333333333 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 0.666666666667 0.333333333333 0.416666666667 0.833333333333 0.75 0.0 0.0 0.166666666667 1.0 1.0 0.75 0.5 0.25 0.25 0.5 0.25 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.3223348805 3.59235442979 -19.7152736747 11.7748222432 7.09329916923 4.5458920626 0.0901877814922 27.0564851691 -1.55941920411 -0.365970196089 2.2475705273 27.9784472806 0.525199881088 -0.0705079977109 1.40027874644 25.945356098 0.107862248292 0.49188936852 4.1478990605 30.9123915967 -0.0365141833162 0.740850965107 3.4622240887 37.8952647831 -0.000257847398348 0.0106143902886 1 17 2 1 1 11 4 4 6 7 17 6 3 3 5 3 4 5 3 5 4 5 1 6 3 5 4 12 3 5 4 11 4 5 3 12 4 5 3 11 5 4 4 10 6 3 5 4 5 2 5 4 4 4 5 2 5 5 3 5 4 3 3 6 3 6 2 4 4 4 4 6 2 4 3 6 3 5 3 4 3 6 3 5 3 4 3 6 3 5 3 4 4 5 3 5 3 3 4 5 4 5 4 2 5 4 5 4 4 1 6 3 7 2 6 12 1 6 1 4 0 552.0 1.04347826087 231.0 0.813852813853 0.193916062802 0.207939508507 0.0880884767902 0.0899821237774 0.0551271997114 0.0325344886208 0.0143927057784 0.0149204969674 0.0169345527084 0.791666666667 1.5652173913 5.0 5.0 2.0 7.0 6.0 5.0 10.0 10.0 2.0 15.0 0.194805194805 2.0 9.0 3.0 0.41847826087 0.25 0.694444444444 0.722222222222 0.611111111111 0.388888888889 0.25 0.222222222222 0.111111111111 0.583333333333 0.611111111111 0.583333333333 0.583333333333 0.5 0.0833333333333 0.333333333333 0.333333333333 0.0 0.0 0.0 0.222222222222 0.666666666667 0.777777777778 0.444444444444 0.333333333333 0.0 0.333333333333 0.666666666667 0.888888888889 1.0 1.0 1.0 1.0 0.222222222222 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.444444444444 0.444444444444 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.444444444444 0.0 0.0 0.333333333333 0.333333333333 0.111111111111 0.111111111111 0.555555555556 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.777777777778 0.777777777778 0.333333333333 1.0 1.0 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.444444444444 0.555555555556 0.333333333333 0.111111111111 0.0 0.0 0.0 0.0 -14.4300481737 6.26009442828 -38.5834102472 17.6466036378 -6.67898139656 4.47346966781 -67.8265927598 38.0707949229 -2.30284727739 3.71280623466 -67.2389003748 55.3411702307 7.3365241742 -1.41002272875 -29.3723924484 46.1012177143 -2.00663156429 -2.01652097453 -23.6665497581 27.0903655325 1.67610034112 0.192096170745 -17.3413727563 27.320911441 0.0601217217819 0.35990895112 7 4 8 5 5 9 3 4 1 6 2 11 1 11 2 5 1 1 2 1 3 3 9 4 10 3 10 4 9 5 5 1 3 10 4 8 6 4 1 1 3 0 195.0 0.866666666667 100.0 0.62 0.230769230769 0.230427350427 0.0705325443787 0.106466258703 0.042261669954 0.0165991755418 0.00801539692099 0.00190758254961 0.0245953557397 0.692307692308 0.333333333333 0.0 2.0 4.0 3.0 0.0 1.0 0.0 1.0 7.0 10.0 0.0645161290323 1.0 3.0 1.0 0.512820512821 0.1875 0.625 0.8125 0.6875 0.5 0.875 0.375 0.625 0.875 0.75 0.0625 0.25 0.6875 0.75 0.0625 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.25 0.75 0.75 0.75 1.0 0.75 0.25 0.0 0.75 1.0 0.75 0.75 1.0 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 -10.5254469031 7.38478935946 -23.3559103859 18.1127541902 3.20516834728 1.07065298606 -11.5718919547 26.3782353815 2.48308328741 2.74992076211 5.03053484437 35.647164275 0.0869019348507 -1.77244073295 9.53259921798 24.2283226405 0.565351331802 -1.91389879306 11.9104205455 5.93559786739 -0.707121792713 -0.118227755492 4.46172794885 -2.49169227148 -0.268232959543 -0.460952384421 1 3 5 6 10 3 3 2 6 1 4 3 5 1 3 5 4 9 3 9 4 11 2 4 2 5 2 3 3 4 3 3 3 3 5 2 12 1 12 3 2 4 3 1 0 182.0 0.928571428571 96.0 0.708333333333 0.257819103973 0.252354788069 0.0896478234964 0.116269236741 0.0627004621993 0.0193646627211 0.0117768515336 0.00912954173349 0.00875995199275 0.769230769231 0.5 2.0 3.0 4.0 1.0 1.0 2.0 2.0 1.0 1.0 7.0 0.206896551724 0.0 2.0 1.0 0.527472527473 0.6875 0.4375 0.3125 0.75 0.6875 0.0625 0.125 0.625 0.8125 0.625 0.4375 0.8125 0.5 0.625 0.5 0.8125 0.25 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.25 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.25 0.25 0.0 0.75 1.0 1.0 0.75 0.5 0.75 0.5 0.0 -4.9475295045e-16 -1.0913481812 -4.46186750668 -0.199757917361 -6.00241499661 3.79187811938 -20.9971583718 13.7053404991 2.58155435033 0.995610900624 -16.9546289888 19.2979621003 -2.00343821374 -1.31914358893 -24.9375882113 12.7095281532 -0.718598992854 0.469452961361 -32.0083372254 12.3974264663 0.85541070298 -0.35267596018 -28.2595318852 9.54445584447 -0.367901805821 -0.209115192011 5 1 2 1 4 2 4 13 3 2 4 6 4 2 5 3 5 3 5 2 6 3 5 3 5 3 5 3 5 3 4 3 7 3 3 3 7 3 12 4 3 1 8 4 12 9 8 10 6 12 3 4 4 5 2 4 7 3 2 4 7 3 1 4 7 4 2 4 6 3 4 10 4 0 336.0 0.761904761905 150.0 0.786666666667 0.202194940476 0.225340136054 0.060873951205 0.134760247105 0.0521556185718 0.0169425029881 0.0138438100303 0.00815010172534 0.0675215857372 1.4375 0.714285714286 2.0 7.0 10.0 4.0 5.0 4.0 1.0 5.0 8.0 17.0 0.109375 1.0 3.0 2.0 0.446428571429 0.291666666667 0.416666666667 0.416666666667 0.708333333333 0.541666666667 0.625 0.875 0.583333333333 0.25 0.125 0.541666666667 0.166666666667 0.666666666667 0.541666666667 0.583333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.166666666667 0.5 0.333333333333 0.166666666667 0.5 0.166666666667 0.5 0.333333333333 0.666666666667 1.0 0.833333333333 0.666666666667 1.0 0.666666666667 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.666666666667 1.0 1.0 1.0 0.833333333333 0.5 0.0 0.0 0.166666666667 0.5 0.666666666667 1.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 -10.4587534032 -2.36458772594 -22.2160594951 -2.05834581417 3.9696449622 4.80382927682 -12.8354160451 11.5351582979 -1.88271323689 -0.438689073686 -16.3954033593 22.9908491212 -0.157659023708 4.84493741067 -16.6724872931 42.6588090472 1.8703331095 -2.83217017852 -3.69638529931 33.2333861752 -0.527391526327 0.110047199438 -3.65065836321 16.9680898165 0.0247776785599 -0.881448413674 9 4 9 5 9 5 11 3 11 3 11 3 11 3 11 3 11 3 5 9 3 4 4 3 2 3 7 2 2 2 8 2 2 2 7 3 1 3 7 3 1 4 6 3 1 4 6 3 1 5 5 3 2 4 4 5 1 4 1 8 4 10 7 1 2 2 2 0 308.0 0.636363636364 124.0 0.717741935484 0.225185528757 0.224763872491 0.0696347183555 0.16836799722 0.0652575703728 0.0184723488531 0.0192592815401 0.0119431715266 0.103281224414 0.714285714286 0.5 0.0 3.0 5.0 1.0 0.0 0.0 5.0 4.0 1.0 9.0 0.297872340426 0.0 2.0 2.0 0.402597402597 0.0 0.0833333333333 0.666666666667 0.75 0.0 0.25 0.208333333333 0.5 0.208333333333 0.166666666667 0.0 0.375 0.875 0.791666666667 0.666666666667 0.875 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.5 0.833333333333 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 1.21536501997 -9.49142206075 1.19087288767 -21.0191809632 -1.57767867705 4.19757710165 2.436204894 2.26939604445 4.85235850943 8.79508570854 18.2024841267 43.3640481725 -3.28846663187 -3.1934445039 3.63213396075 33.532106787 -0.725672993459 -1.13260933484 -4.64931359976 14.2612852685 1.64192947436 -0.880801225749 3.4372707526 5.21949772188 -0.590049459211 -0.0198148324456 1 2 3 10 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 10 5 11 4 5 3 3 3 4 5 4 3 3 6 3 2 3 7 3 2 3 7 3 2 4 6 3 2 3 7 3 2 3 6 4 1 5 5 11 4 10 4 2 4 0 330.0 0.681818181818 135.0 0.644444444444 0.157171717172 0.227272727273 0.047546428472 0.154655647383 0.0613223140496 0.0173255395642 0.0189376428909 0.0180947379002 0.121931548577 0.533333333333 0.5 3.0 3.0 1.0 0.0 0.0 0.0 5.0 5.0 3.0 9.0 0.130434782609 0.0 1.0 2.0 0.409090909091 0.708333333333 0.5 0.625 0.833333333333 0.5 0.666666666667 0.583333333333 0.416666666667 0.0 0.333333333333 0.208333333333 0.0 0.0 0.291666666667 0.666666666667 0.625 0.666666666667 0.5 0.0 0.0 0.0 0.166666666667 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -11.1697832788 -10.1859163579 -25.5829412519 -25.8316780437 2.4298930117 -0.736345709662 -15.78810199 -22.174679774 2.26991141674 5.65799671836 -7.34326504662 -1.20674438196 -3.96986966928 -3.39575670858 -24.8955316492 -5.15400198806 1.5139255996 2.94018978999 -20.6101884905 -0.339652132837 0.224142197066 -3.10136765373 -16.640350126 -16.1044150004 -0.322423683789 0.131119944679 2 4 3 6 2 6 2 7 2 6 3 5 3 5 3 4 3 4 2 5 3 3 5 0 88.0 0.727272727273 55.0 0.472727272727 0.292613636364 0.261363636364 0.0616958583772 0.119269757231 0.038190857438 0.00693621207996 -0.00500244493442 -0.000779786675779 0.0147567784727 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.1875 0.0 4.0 1.0 0.625 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.166666666667 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.12522433708 5.4402053275 -8.36445426471 12.4787055239 -1.2139301144 -0.99965088223 -12.5932022673 9.05498689079 0.269596225513 -0.830308307218 -11.7770075603 3.3797897832 -0.226738601903 0.115403153745 -12.8961111117 1.79993462947 -0.338681730344 -0.714070997298 -15.1600632319 -4.69707134615 0.154934840874 -0.77639710809 -14.7497706856 -14.5082699814 -0.0417197794561 -0.196984834203 2 4 3 4 3 4 3 3 34 2 2 5 1 6 2 5 3 4 3 4 3 4 3 4 4 3 3 4 3 4 2 6 1 6 2 4 1 0 154.0 0.318181818182 76.0 0.657894736842 0.23840445269 0.271251475797 0.024376386811 0.3705025157 0.0678168390894 0.00234771110782 0.0215095149277 0.00386868785718 0.572956416681 0.857142857143 195225786.0 0.0 1.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 1.0 2.0 0.3125 0.0 4.0 1.0 0.493506493506 0.0 0.25 0.25 0.166666666667 0.333333333333 0.333333333333 0.666666666667 0.583333333333 0.666666666667 0.333333333333 1.0 0.916666666667 0.666666666667 0.416666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -2.60435361423 -5.26658175322 -3.88725734329 -7.70434960782 2.74892035067 7.55394081138 0.672385077683 18.5802234236 -2.77674832827 1.49274699174 -3.84436601065 30.2358230212 2.7618291988 -1.5979559589 3.0866465816 20.7016946096 -2.02780954567 -0.058997182663 -2.54541011689 14.311987374 0.957653124535 -1.11296844739 -1.10574616847 3.70105716616 -0.0605265643017 -0.15912377139 7 4 4 5 3 11 2 6 2 7 2 6 2 4 2 5 4 4 4 4 1 5 4 4 4 4 1 4 5 3 5 4 1 4 5 3 5 4 1 4 5 3 5 4 1 4 5 3 5 3 2 4 5 3 5 3 2 4 5 3 5 9 5 3 5 4 1 4 4 5 3 5 18 1 3 0 308.0 1.57142857143 160.0 0.625 0.252213695396 0.216372912801 0.171595858076 0.0525039742472 0.051252969391 0.0678283081312 0.00730019240869 0.014015014683 -0.0326597413122 0.227272727273 1.71428571429 1.0 1.0 1.0 1.0 4.0 6.0 6.0 6.0 5.0 15.0 0.140350877193 1.0 2.0 3.0 0.519480519481 0.666666666667 0.75 0.666666666667 0.708333333333 0.666666666667 0.25 0.166666666667 0.208333333333 0.625 0.583333333333 0.5 0.541666666667 0.708333333333 0.5 0.5 0.541666666667 0.333333333333 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 -2.054545629 14.2660703535 -7.56130800995 32.1149261125 -4.81853248818 -3.62612595737 -30.081597681 19.032049363 -4.64551370881 -2.73268971078 -50.3288420636 2.2153468961 2.19351112556 1.55427897925 -46.3928833369 9.42347930449 -2.01302363464 0.563960744674 -53.2529015936 16.0579967167 0.243639479195 -0.235467215689 -57.3350989338 14.6920812743 0.0687876153372 -0.00419062737661 4 6 5 4 1 3 4 3 2 4 1 3 6 2 1 3 9 3 8 4 8 4 8 6 6 6 7 5 5 1 2 9 5 7 7 3 3 0 168.0 0.857142857143 76.0 0.697368421053 0.181051587302 0.212159863946 0.06044480044 0.111070407826 0.0440711130682 0.0197052623829 0.0156847702961 0.00726165454987 0.0479374163753 0.666666666667 0.285714285714 0.0 2.0 3.0 3.0 2.0 1.0 0.0 1.0 3.0 6.0 0.321428571429 0.0 2.0 1.0 0.452380952381 0.166666666667 0.75 1.0 0.5 0.583333333333 0.666666666667 0.833333333333 0.833333333333 0.666666666667 0.0 0.333333333333 0.833333333333 0.5 0.0 0.0 0.5 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 -11.6410472662 0.2728370453 -25.7704180012 6.50623520336 3.16453851862 8.83379535447 -17.2636300654 37.5758127424 0.0253784284814 1.09924579663 -11.2304491565 46.2674606188 0.316338864313 -2.2663416876 -8.40607132364 29.9700629807 0.841656183165 -0.60570583223 0.270570372991 21.6448955609 0.659469834606 0.450811189382 8.51831490423 26.1470249805 0.135616891168 0.221585596459 4 3 4 2 5 3 3 3 3 5 4 3 4 3 4 2 5 3 4 2 4 3 5 2 3 4 4 2 4 2 5 3 3 3 5 4 2 2 5 5 1 3 5 4 2 3 5 3 3 0 168.0 1.16666666667 72.0 0.902777777778 0.210459183673 0.202380952381 0.107515513646 0.0779174765144 0.0515468091999 0.0391463733588 0.010118076637 0.012585703933 0.000154375761106 0.214285714286 1.0 1.0 1.0 4294967295.0 2.0 3.0 3.0 3.0 3.0 3.0 6.0 0.321428571429 1.0 0.0 2.0 0.428571428571 0.166666666667 0.166666666667 0.25 0.583333333333 0.833333333333 0.833333333333 0.75 0.416666666667 0.25 0.25 0.0833333333333 0.166666666667 0.583333333333 0.5 0.5 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.25 0.25 0.0 0.0 0.25 0.5 0.75 0.0 0.5 0.5 0.0 0.25 0.75 1.0 1.0 0.5 0.75 0.75 0.5 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.0 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.86438647622 4.22897420216 -6.98599179752 11.9476935045 -3.50001672228 2.39567630083 -17.8753988441 18.934955043 0.756741177325 -1.49858673226 -17.8230658683 12.2363273432 -0.648523351089 -0.506596924837 -19.3981497215 5.53287727802 -0.149883778611 -0.287934668925 -22.6610187411 3.55430423259 -0.44706550279 0.384369538779 -27.2771605511 7.60875832037 -0.131537896478 0.148376703509 2 3 10 4 9 5 10 4 11 3 11 3 11 3 11 3 11 3 11 3 2 2 7 6 1 3 4 4 5 2 3 4 5 2 3 4 5 2 4 2 6 3 3 1 7 3 3 1 8 1 3 2 8 2 2 3 7 2 1 5 5 9 5 3 1 4 6 3 308.0 0.636363636364 107.0 0.775700934579 0.135667903525 0.186835891381 0.0406674804998 0.148404523879 0.0584776319565 0.0168988704485 0.0259185041485 0.0196752547081 0.129420139383 0.5 0.590909090909 3.0 2.0 0.0 1.0 0.0 1.0 5.0 5.0 2.0 12.0 0.177777777778 0.0 1.0 2.0 0.347402597403 0.666666666667 0.5 0.416666666667 0.541666666667 0.5 0.583333333333 0.666666666667 0.458333333333 0.0 0.208333333333 0.125 0.0 0.0 0.125 0.541666666667 0.375 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.333333333333 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -9.02842586267 -6.53982129796 -18.7529123159 -17.3830980884 3.91011768528 -1.86561639528 -9.77948459103 -21.0253567888 -2.09733388071 2.69886566599 -14.0863916447 -11.0814338102 -0.178438011942 -1.12877216594 -18.645497772 -9.78062836131 0.226477560002 0.991895774392 -15.3106851877 -11.8551502307 0.076885248184 -2.23087634412 -16.5063413708 -23.0424424446 -0.184798385611 0.421145165785 4 1 6 5 4 2 1 4 1 1 4 5 4 6 6 6 3 8 2 8 2 8 5 5 4 6 2 12 2 6 2 0 135.0 0.6 83.0 0.578313253012 0.277366255144 0.320987654321 0.0585870040136 0.182077935274 0.0535202967027 0.00927834286625 0.000552852157738 0.00296902382217 0.110004341037 1.44444444444 0.4 2.0 4.0 4.0 2.0 1.0 2.0 0.0 2.0 0.0 10.0 0.258064516129 0.0 3.0 2.0 0.614814814815 0.25 0.75 0.75 0.583333333333 0.5 0.333333333333 1.0 0.333333333333 0.583333333333 0.333333333333 0.916666666667 0.583333333333 0.583333333333 0.5 0.666666666667 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.25 0.75 1.0 1.0 0.75 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.75 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.75 0.5 0.25 0.25 0.75 1.0 0.25 0.75 1.0 1.0 0.5 0.0 0.5 1.0 0.0 0.5 1.0 1.0 0.5 0.0 0.25 0.75 -6.28131508736 -0.0848826363157 -14.807218352 1.60643633577 0.660952794778 2.83168474749 -11.7307078879 12.0353923842 1.7019953639 0.61669645531 -1.59712784414 14.7784595214 0.05041647615 -1.50839555 0.207629671025 5.27155313323 -0.445243526179 -0.384929330104 -3.38724750087 -2.13924903611 -0.00160573178967 -0.60117751711 -3.26670032345 -6.61476660948 0.137035174876 0.125004828906 4 6 8 4 1 4 5 4 4 3 3 4 5 3 3 3 6 4 1 4 6 8 8 8 7 8 7 3 2 3 6 4 2 3 6 4 2 4 4 4 4 5 1 4 8 5 13 1 6 0 225.0 1.0 103.0 0.728155339806 0.210666666667 0.200888888889 0.0919751111111 0.0801374814815 0.0502423703704 0.0313153359012 0.00972780615638 0.0115146187325 0.00601305067398 0.533333333333 0.8 0.0 3.0 3.0 0.0 2.0 3.0 3.0 2.0 4.0 11.0 0.236842105263 0.0 2.0 2.0 0.457777777778 0.375 0.8125 0.875 0.6875 0.75 0.25 0.1875 0.5 0.4375 0.0 0.0 0.25 0.625 0.6875 0.5625 0.8125 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.75 1.0 1.0 0.75 0.5 0.25 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 3.22554018 -10.2340266639 12.2646987629 -9.41178671468 6.76797553557 -39.9245210795 36.0757372368 2.00212359898 0.307522455835 -34.3151710352 38.483521435 2.03637488148 -2.48461407182 -18.9285786423 19.4551915234 -1.11375558386 -1.1715445371 -20.5724604838 5.83446353248 1.48378264287 -0.085811733093 -6.88650590322 2.70428141285 0.461442352669 -0.0929911597614 2 10 4 6 2 4 3 6 3 4 3 3 6 3 1 3 7 3 2 4 5 4 2 4 2 3 2 2 2 4 1 3 2 3 4 5 3 4 2 6 3 4 2 14 1 14 4 1 1 1 5 1 2 0 195.0 1.15384615385 119.0 0.588235294118 0.272136752137 0.287179487179 0.107894468889 0.0896287530134 0.053734823581 0.0252697683564 0.00539739261803 0.00584209376979 -0.0330289749081 1.0 1.0 2.0 3.0 6.0 1.0 2.0 3.0 5.0 1.0 5.0 17.0 0.2 0.0 3.0 3.0 0.610256410256 0.625 0.8125 0.8125 0.5625 0.875 0.3125 0.8125 0.875 0.4375 0.25 0.4375 0.625 0.75 0.6875 0.6875 0.75 0.25 0.5 0.25 0.5 1.0 1.0 1.0 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 0.75 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.25 -4.83831026999 3.39530545263 -14.4063185359 13.4727386134 -4.05852178437 7.87258157616 -27.8751190706 40.022208026 1.2408961165 -0.844181920636 -20.4913867532 36.319478909 1.84436598942 -2.88752618587 -10.8455742649 19.0346629925 -1.90931774418 1.38436858277 -17.6528261689 18.1174366226 1.44591665774 -2.26262998794 -9.02241584392 0.934013029992 0.210595490115 -0.298321851278 5 1 6 8 3 8 3 2 3 4 8 3 8 2 8 4 7 4 2 4 2 3 2 3 3 3 2 2 3 4 1 11 1 10 3 1 4 3 154.0 0.785714285714 80.0 0.7625 0.263282172373 0.268552875696 0.077345996894 0.140669184922 0.0682305550749 0.0146714223111 0.0108834616461 0.00915149674515 0.0349552687706 0.909090909091 0.357142857143 1.0 3.0 3.0 1.0 0.0 1.0 2.0 1.0 6.0 9.0 0.0645161290323 2.0 2.0 1.0 0.519480519481 0.5 0.166666666667 0.333333333333 0.75 0.583333333333 0.0833333333333 0.416666666667 0.75 0.666666666667 0.166666666667 0.25 0.583333333333 0.75 0.833333333333 0.833333333333 0.916666666667 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.25 0.5 0.25 0.5 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.45513090827 -1.04587534032 -6.88402415805 0.294252174945 -4.30599962651 4.35866460039 -17.3463438032 15.9360287322 3.00866951384 0.729490142787 -10.3610231542 19.8440109717 -2.16426588748 -1.79830461138 -16.7284354077 10.2760370112 0.246914061738 0.445635206307 -19.8320758904 6.86310099777 0.153004700904 -1.14117787118 -16.2215112935 -2.02479596157 -0.0216697939614 -0.210453522706 1 1 4 2 4 1 6 1 3 28 2 2 5 1 5 2 4 2 4 2 4 3 3 2 4 2 4 2 4 2 5 1 11 3 1 2 0 132.0 0.272727272727 73.0 0.602739726027 0.231060606061 0.289256198347 0.0190137427999 0.425421571083 0.0578199348861 0.00183521513945 0.0157184608683 0.00294663214931 0.785114355446 1.33333333333 195225786.0 2.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 0.0 3.0 0.333333333333 0.0 6.0 1.0 0.55303030303 0.416666666667 0.333333333333 0.5 0.583333333333 0.666666666667 0.416666666667 0.916666666667 1.0 0.666666666667 0.5 1.0 1.0 0.583333333333 0.416666666667 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -3.96440494611 -2.69116540137 -6.16331452692 -0.505669935316 3.87771273443 8.96349638551 0.0574963169155 30.1295741817 -4.05523980528 0.612405246717 -6.99488107863 36.1630623692 3.79913319858 -2.94027413599 2.23316888409 16.6140970863 -2.66546348455 -0.158451417735 -3.78655778927 8.38534626242 1.43651507613 -0.596150673773 -2.16969112956 3.5337231783 -0.193984956167 0.000367261451236 1 2 5 3 7 1 5 13 2 7 2 7 2 7 2 5 2 5 5 4 4 4 3 3 6 4 5 3 2 4 6 4 5 3 2 4 6 4 5 3 2 4 6 4 5 3 2 4 6 4 5 3 2 4 6 4 5 3 2 4 6 3 6 3 1 6 4 5 5 3 1 6 4 6 3 5 14 1 9 0 336.0 1.71428571429 165.0 0.70303030303 0.222842261905 0.211096938776 0.165163149523 0.0491986461623 0.0501986183238 0.0733530597739 0.00715644335684 0.015445611774 -0.0254407318567 0.291666666667 1.78571428571 3.0 1.0 2.0 1.0 5.0 6.0 6.0 6.0 5.0 7.0 0.210526315789 1.0 1.0 3.0 0.491071428571 0.791666666667 0.666666666667 0.666666666667 0.833333333333 0.583333333333 0.0416666666667 0.0 0.166666666667 0.625 0.666666666667 0.666666666667 0.75 0.541666666667 0.208333333333 0.166666666667 0.25 0.833333333333 1.0 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 -6.65798178601 11.1673718403 -21.0139444257 23.8848764021 -8.04036404346 -4.71579412109 -53.3676331131 7.29101750583 -3.45517724065 -2.04421217996 -69.8050262967 -5.20781370441 2.89973747662 2.26182555391 -50.8783141122 6.33637639404 1.57444851796 -0.245139483461 -33.3446090756 6.65967801254 -0.374379957087 -0.731995914573 -31.6158420788 2.35470754844 0.29001219711 0.32493820771 1 1 1 2 4 5 3 5 3 5 4 3 37 4 3 5 4 4 4 4 4 4 5 3 5 3 4 3 5 4 4 4 4 4 2 8 1 6 3 4 2 0 184.0 0.347826086957 81.0 0.740740740741 0.18410326087 0.235586011342 0.0197266106579 0.324455847528 0.0589140002157 0.00239566861112 0.0251336098975 0.0054395967008 0.481618863555 1.0 186737708.391 2.0 3.0 3.0 0.0 1.0 4294967292.0 0.0 0.0 5.0 0.0 0.181818181818 1.0 3.0 1.0 0.440217391304 0.333333333333 0.0833333333333 0.0833333333333 0.166666666667 0.666666666667 0.25 0.416666666667 0.5 0.75 0.333333333333 0.833333333333 0.916666666667 0.833333333333 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.67777137087 -3.98579335743 -8.29670468563 -4.42256988768 3.41939169425 7.82089509454 -2.57602058749 22.6166000494 -3.07895891681 1.1313788221 -5.48832566111 32.2003698164 3.64831641315 -1.64213917359 3.91282098411 23.2416289261 -2.7873244479 0.613258629488 -2.76022218802 20.7102899092 1.63479495884 -1.53966239999 -1.41887668001 7.52295480478 -0.351336098846 -0.172231302909 1 1 122 5 13 3 4 5 1 1 1 7 1 1 1 4 1 6 1 2 3 5 59 98 1 1 1 5 14 2 2 122 3 11 2 11 1 1 2 95 41 2 2 4 5 69 97 1 7 4 4 9 3 0 868.0 17.7142857143 475.0 0.555789473684 0.277259551063 0.254772876893 1.87412736941 0.00407112211184 0.0699838001635 1.88537984308 0.00166438852183 0.0498745609925 -0.0259228776916 0.0 2.71428571429 0.0 0.0 0.0 0.0 0.0 9.0 0.0 2.0 4.0 10.0 0.0676691729323 0.0 1.0 46.0 0.547235023041 0.225806451613 0.709677419355 1.0 0.903225806452 0.354838709677 0.854838709677 1.0 1.0 0.0806451612903 0.58064516129 1.0 1.0 0.0 0.241935483871 0.741935483871 1.0 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.51167680887 3.55274905224 5.16200282686 4.62453620776 -6.18790235655 -4.32236345192 -24.6338777534 -1.68540020505 -8.38571598828 4.6885835975 -70.5008181438 5.7384044513 -2.04456597471 -4.13709469361 -101.697559737 1.63007613728 -4.83596712992 4.15622375213 -135.447345783 6.39002229507 0.149295078034 -4.13895173412 -143.747309943 1.32932610135 0.0890973759492 1.26265756418 6 2 4 2 5 11 3 12 2 2 4 7 2 2 4 4 1 2 1 3 5 3 4 3 5 3 4 3 5 2 6 3 3 3 6 3 4 1 7 3 12 2 12 4 11 10 6 10 5 12 2 7 2 4 1 5 1 1 3 9 7 3 1 4 1 3 3 3 1 12 4 10 9 1 9 0 345.0 0.652173913043 174.0 0.672413793103 0.222995169082 0.249527410208 0.0551476884956 0.16180232505 0.0455706236359 0.0129738965079 0.00874892323976 0.0033690379227 0.0975337503583 1.46666666667 0.652173913043 2.0 5.0 7.0 3.0 4.0 5.0 0.0 5.0 6.0 17.0 0.109375 1.0 3.0 1.0 0.504347826087 0.333333333333 0.625 0.583333333333 0.875 0.458333333333 0.375 0.708333333333 0.791666666667 0.625 0.25 0.5 0.541666666667 0.791666666667 0.458333333333 0.375 0.708333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.166666666667 0.333333333333 0.166666666667 0.0 0.333333333333 0.833333333333 0.833333333333 0.5 0.666666666667 0.833333333333 0.666666666667 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.5 0.666666666667 1.0 0.833333333333 1.0 1.0 0.666666666667 0.333333333333 0.0 0.166666666667 0.5 0.333333333333 0.833333333333 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.666666666667 0.166666666667 0.166666666667 0.166666666667 0.0 0.666666666667 0.833333333333 -14.4485009207 0.332149446453 -30.2242374573 10.4498800936 6.35227967819 13.5157825791 -12.9750838278 52.5573392619 -1.35023596779 -1.43653291402 -11.2776286834 62.1318480097 -0.242099486066 1.87003205263 -12.2747722983 53.4658044398 1.51152121621 -5.65993641448 -5.32958493895 22.1989889483 -1.98158290143 1.7845587889 -19.4270929294 18.9780177178 -0.0269950354904 -0.237586373475 6 1 10 5 6 3 3 4 2 3 4 5 1 2 5 5 1 3 1 4 1 2 1 3 1 3 1 1 4 2 11 3 10 3 10 3 10 4 10 7 1 3 4 7 7 2 1 2 4 0 195.0 0.866666666667 80.0 0.925 0.162130177515 0.192820512821 0.0592962120063 0.0995854953725 0.0386130582107 0.0210292052536 0.0105128013701 0.00699225785764 0.0490636150366 1.15384615385 0.6 1.0 6.0 5.0 3.0 1.0 4.0 0.0 1.0 2.0 17.0 0.25641025641 1.0 3.0 2.0 0.410256410256 0.3125 0.6875 0.6875 0.8125 0.4375 0.4375 0.1875 0.3125 0.5 0.5625 0.125 0.1875 0.4375 0.625 0.0 0.1875 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.0 0.5 1.0 0.75 0.75 0.75 0.25 0.25 0.25 0.75 0.75 0.25 0.25 0.5 0.25 0.0 0.5 0.75 0.25 0.0 0.25 0.75 0.5 0.0 0.75 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.0 0.5 0.75 0.5 0.5 0.75 0.75 0.25 0.0 -10.7800948121 4.49877972473 -27.6091069045 11.7943247596 -2.47857298042 2.22958391389 -37.0826046441 25.2161207299 0.713123130165 4.15460473695 -31.0537258694 41.3005748258 1.32907423908 -2.65058248941 -20.0265536899 25.6453778937 0.38783198946 -2.22336941894 -14.4253277625 3.55379622979 0.194892258944 0.011601469199 -8.55154166604 -4.69490868785 0.447585001777 -0.494817265746 3 2 6 3 6 3 5 5 3 18 1 5 4 4 5 4 5 4 5 4 5 4 5 4 5 4 5 6 3 8 2 6 3 5 2 0 162.0 0.5 89.0 0.494382022472 0.206447187929 0.274348422497 0.0295585493027 0.210615101206 0.0497477612755 0.0048733986253 0.0116127408562 0.00347813435454 0.224307227189 0.444444444444 0.0 0.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 3.0 8.0 0.0645161290323 0.0 4.0 1.0 0.549382716049 0.466666666667 0.8 0.666666666667 0.6 0.933333333333 1.0 1.0 1.0 0.533333333333 0.666666666667 0.333333333333 0.733333333333 0.2 0.4 0.0 0.4 0.0 0.5 0.833333333333 0.5 0.5 0.5 0.5 0.333333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.833333333333 1.0 0.666666666667 0.5 0.5 0.666666666667 1.0 0.0 0.5 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 1.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.5 -9.7615031763 1.27323954474 -16.6944621157 2.98340137173 8.75417682867 0.0930041231237 3.83771077633 5.05799739674 -5.11626985404 1.42657263348 -4.44710516721 12.0444499362 3.15045844796 0.312719532575 2.66514057612 14.040725348 -0.836116224728 -0.865360839747 3.97374118422 6.91251032602 -0.611692341423 -0.368066475188 -5.88354244936 1.2354000548 0.0392922645642 -0.0581128625469 4 2 8 9 3 11 2 4 2 5 2 3 4 4 2 2 5 4 9 4 6 2 2 3 3 4 3 3 2 4 3 4 2 4 3 4 1 21 1 4 2 3 6 1 2 0 182.0 0.928571428571 105.0 0.619047619048 0.24471682164 0.282574568289 0.0797915856635 0.11368338219 0.0522717832825 0.0170615127693 0.0041161430419 0.00754709893059 0.0117698846508 0.769230769231 0.714285714286 3.0 5.0 2.0 0.0 0.0 3.0 3.0 3.0 3.0 7.0 0.184210526316 1.0 2.0 1.0 0.576923076923 0.6875 0.5625 0.4375 1.0 0.75 0.125 0.3125 0.625 0.75 0.8125 0.625 0.8125 0.3125 0.5 0.5 0.75 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.25 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.25 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 -3.91066431597 2.04627783975 -14.1117168798 7.09654262391 -6.40935052166 3.41394313061 -33.0600656692 20.18003379 2.10338403862 1.00875702127 -31.0520745604 25.211491843 -2.01051155446 -1.22617797331 -36.7234806002 16.9725170544 0.30078079786 -0.57057899737 -38.492633796 9.37904468386 0.218256333099 -0.365196885293 -33.5385309922 3.48725594189 0.0178848506874 -0.220012063166 1 0 1 1 3 3 3 1 3 3 10 2 7 2 10 3 6 3 9 5 4 5 3 2 4 4 4 5 1 5 3 4 5 3 2 5 3 4 6 2 2 6 3 2 10 8 14 8 6 1 6 9 5 3 5 9 5 3 5 10 3 5 3 12 1 15 0 308.0 1.57142857143 155.0 0.593548387097 0.230962219599 0.195037105751 0.133084950869 0.046620774128 0.0435437785987 0.0433830635767 0.00622486755504 0.00275468575536 -0.0244286579906 0.272727272727 1.5 1.0 2.0 2.0 1.0 8.0 6.0 2.0 3.0 5.0 13.0 0.212765957447 0.0 3.0 3.0 0.503246753247 0.791666666667 0.583333333333 0.416666666667 0.291666666667 0.5 0.333333333333 0.708333333333 0.666666666667 0.666666666667 0.625 0.916666666667 0.666666666667 0.583333333333 0.333333333333 0.416666666667 0.291666666667 0.833333333333 1.0 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.166666666667 0.166666666667 0.333333333333 0.333333333333 0.5 0.833333333333 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.5 0.833333333333 1.0 1.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 -7.49475095651 13.5715760564 -17.5808431113 32.1934166167 1.29225204357 -0.706093117173 -9.97495294026 30.9443317069 3.55116103525 -1.09333974091 5.86733087508 22.268430261 -2.21782700164 0.672263916862 -3.47174524272 27.7615803568 -0.309542031361 1.30205054421 -7.36480574817 32.9744639236 1.53532373137 -1.8270116148 7.18126938757 22.9779799983 0.0742138577675 0.360601192377 1 4 1 1 5 7 9 5 5 3 3 3 5 4 4 2 4 6 4 1 3 8 3 1 3 8 7 8 3 1 4 7 3 1 4 7 3 1 4 6 3 2 5 4 4 3 11 7 6 9 2 1 2 5 0 225.0 1.0 110.0 0.645454545455 0.228444444444 0.223111111111 0.0951909135802 0.0913572345679 0.0530710123457 0.0313127934595 0.00992178322085 0.00976926059808 0.00451924326658 0.533333333333 0.8 0.0 2.0 3.0 1.0 2.0 3.0 3.0 1.0 7.0 13.0 0.219512195122 0.0 2.0 2.0 0.488888888889 0.375 0.75 0.8125 0.6875 0.8125 0.4375 0.375 0.6875 0.5625 0.0 0.0 0.25 0.6875 0.4375 0.25 0.625 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.64995336157 2.03718327158 -11.863198715 10.6628915321 -4.67873091372 8.84137539864 -28.7884176241 42.6622328046 -0.386151023342 1.3603354172 -30.8570836298 49.9087295625 1.65977196008 -3.6290124589 -18.9103008473 25.8933763378 0.502135926824 -0.653603169605 -10.6747290206 13.2020580514 0.600187787639 -0.504162243282 -2.40027778531 3.25998226291 0.287422967047 -0.604550890893 5 2 4 3 3 11 1 3 3 10 4 6 1 3 5 4 2 3 5 3 4 2 5 3 4 2 5 3 5 2 4 2 6 3 2 3 5 4 10 3 11 4 5 1 4 11 3 11 3 12 1 3 7 3 1 3 7 3 1 2 9 2 1 3 7 2 2 7 9 8 4 0 308.0 0.636363636364 150.0 0.733333333333 0.205936920223 0.228748524203 0.0527048428044 0.154512516072 0.0411765140746 0.013270613091 0.00901857061675 0.00431128033445 0.102922708601 1.64285714286 0.636363636364 3.0 7.0 7.0 4.0 4.0 5.0 1.0 4.0 3.0 14.0 0.213114754098 3.0 3.0 1.0 0.487012987013 0.541666666667 0.583333333333 0.75 0.75 0.291666666667 0.208333333333 0.708333333333 0.333333333333 0.625 0.458333333333 0.5 0.208333333333 0.791666666667 0.333333333333 0.458333333333 0.583333333333 0.166666666667 0.833333333333 0.833333333333 0.333333333333 0.166666666667 0.5 0.5 0.666666666667 0.333333333333 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 0.5 0.666666666667 0.5 0.666666666667 1.0 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.166666666667 0.833333333333 0.833333333333 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.333333333333 0.333333333333 0.833333333333 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.0 0.0 0.166666666667 0.0 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.5 0.5 0.5 0.0 0.666666666667 0.666666666667 -13.3400779573 3.21203612422 -29.6958532526 12.534245267 3.31666465555 6.46532578365 -22.0007423083 31.7385453426 -1.25611851234 -1.232824026 -23.9309736585 39.379066798 -0.896322038841 5.06136387844 -25.7904336136 61.0250091429 2.48700908553 -1.57180978128 -11.6004191082 60.9352951421 -1.30604643344 0.383123950282 -16.6077049039 52.8470838664 0.0280211785244 -0.548381324155 1 5 10 7 10 6 10 6 11 5 12 4 12 4 12 4 12 4 12 10 5 6 3 3 4 5 4 4 3 5 5 3 3 5 6 3 2 5 6 3 2 6 6 2 2 6 6 2 3 4 7 2 3 4 6 3 3 5 4 3 5 5 2 2 9 6 4 0 352.0 0.727272727273 147.0 0.612244897959 0.168323863636 0.212551652893 0.0480925848751 0.130900370815 0.0618222392116 0.0167195543118 0.0199696039836 0.0155017466726 0.082554246083 0.5625 0.5 1.0 2.0 4.0 2.0 0.0 0.0 5.0 5.0 3.0 8.0 0.127659574468 0.0 2.0 2.0 0.417613636364 0.666666666667 0.291666666667 0.5 0.291666666667 0.958333333333 1.0 1.0 0.958333333333 0.208333333333 0.416666666667 0.333333333333 0.458333333333 0.0 0.25 0.208333333333 0.125 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.166666666667 0.0 0.166666666667 0.5 0.5 0.5 1.0 1.0 0.666666666667 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.833333333333 0.666666666667 0.5 0.833333333333 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.333333333333 -12.5298346107 -5.99001331273 -24.2667545348 -13.1632707919 8.03846059305 3.11553872446 -3.20309061512 5.28770257367 -3.2645633528 7.46508141794 -10.9374599157 41.4210297149 -1.41961120629 -0.950836922646 -23.0720659127 47.1411120493 1.53744801503 0.552090424572 -11.1873592945 40.5989412079 0.406225465057 -2.30659987207 -7.58398190881 23.6233616243 -0.390536300255 0.133046951824 1 2 1 4 2 2 22 1 10 2 4 7 4 7 4 7 4 7 4 7 4 7 3 7 6 4 7 4 7 4 0 154.0 0.785714285714 82.0 0.426829268293 0.199527744982 0.227272727273 0.0487500355944 0.121728330701 0.0272619942041 0.0117672239648 0.00239720418627 -0.0030416234035 0.0612349893864 0.363636363636 0.0714285714286 2.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 4.0 4.0 0.0384615384615 0.0 1.0 1.0 0.532467532468 0.75 0.416666666667 0.333333333333 0.583333333333 0.833333333333 1.0 1.0 1.0 0.75 0.75 0.666666666667 0.75 0.916666666667 0.25 0.0 0.166666666667 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -10.3678077214 6.18430636014 -20.0722000265 16.3080144066 6.500760212 2.18084032808 -3.85637220411 24.8241682275 -2.9503843544 0.119789970257 -8.9122136792 24.9299497154 0.193385214562 -0.36732400538 -13.577152403 21.8492266388 0.236552108181 -0.0748574983834 -7.35656069609 18.5228833465 0.843911613772 -0.88629257807 -1.61711404748 7.21358604965 -0.101276254879 -0.401526952259 4 5 6 8 3 4 1 5 1 4 4 2 2 3 5 2 1 3 9 3 9 3 10 2 10 2 10 3 9 4 4 2 3 8 5 7 2 0 168.0 0.857142857143 70.0 0.785714285714 0.164186507937 0.184948979592 0.0569320858304 0.107449713516 0.0374839295837 0.0196172383222 0.0152644868153 0.0065522909465 0.0578165972929 0.666666666667 0.285714285714 0.0 3.0 3.0 2.0 1.0 2.0 0.0 1.0 1.0 5.0 0.227272727273 0.0 2.0 1.0 0.416666666667 0.25 0.833333333333 0.833333333333 0.583333333333 0.75 0.583333333333 0.333333333333 0.75 0.75 0.0833333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -10.5496990849 2.1826963624 -26.3207285305 8.36320247581 -1.12290076467 5.01686077175 -29.3118519083 28.560359716 2.27875560812 2.63109910324 -16.1977677209 43.1951809693 0.45822808871 -0.64608527685 -10.5126893777 40.2202862504 -0.470263185304 -0.254470510629 -12.9119142328 37.6513055335 0.205934830151 0.773357310319 -11.630308043 43.3696263664 0.0471482773227 -0.0270312732745 3 1 6 2 5 3 4 19 5 4 5 3 5 2 6 3 5 3 5 3 5 4 4 4 5 5 4 3 2 0 128.0 0.5 59.0 0.71186440678 0.154296875 0.21728515625 0.0244731903076 0.181514263153 0.0409364700317 0.0053646984912 0.0152344090824 0.0038851728869 0.196901147038 0.625 0.0 0.0 2.0 2.0 1.0 0.0 0.0 0.0 0.0 3.0 4.0 0.173913043478 0.0 2.0 1.0 0.4609375 0.375 1.0 0.625 0.5 0.625 1.0 1.0 1.0 0.875 0.875 0.875 1.0 0.625 0.625 0.375 0.625 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 -8.43521198387 3.81971863421 -15.2681310563 9.94266387276 6.67580382391 0.999691986296 1.38446284476 13.1264206678 -3.28818542033 -0.513367946321 -4.52335667979 12.0342178039 1.03529647229 0.931764388962 -3.92941058169 16.357567124 0.287760580903 -0.108214130574 -0.419497444137 14.8346330968 -0.792169711183 -0.971542220853 -5.73925450367 6.41732367852 0.172586680003 0.110441730832 1 6 4 6 6 3 7 4 3 7 3 7 4 8 3 8 2 8 3 7 6 5 7 5 5 6 4 8 3 7 4 8 3 7 3 9 2 8 4 7 4 6 6 5 3 2 1 5 0 242.0 0.5 90.0 0.722222222222 0.11682945154 0.172426746807 0.0191470262667 0.165761720878 0.0213314698167 0.0048386784597 0.00732610199275 -0.000423297663628 0.180402679716 0.909090909091 0.0454545454545 5.0 0.0 3.0 0.0 0.0 0.0 0.0 0.0 2.0 11.0 0.15625 0.0 2.0 1.0 0.371900826446 0.166666666667 0.666666666667 0.611111111111 0.611111111111 0.555555555556 0.888888888889 1.0 0.888888888889 0.555555555556 0.388888888889 0.5 0.277777777778 0.5 0.0555555555556 0.0555555555556 0.0 0.0 0.0 0.166666666667 0.166666666667 0.833333333333 0.666666666667 0.333333333333 0.333333333333 0.0 0.166666666667 0.666666666667 0.666666666667 1.0 1.0 0.833333333333 0.833333333333 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.5 0.833333333333 0.5 0.166666666667 0.666666666667 0.833333333333 0.5 0.333333333333 0.833333333333 0.5 0.0 0.0 0.5 0.5 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -13.4847642692 4.05121673325 -22.8751443517 10.2363711955 12.5239754129 1.11683483732 7.70645348842 16.8590449953 -6.68995125817 1.61447135568 -4.00274238899 22.331907333 2.99952567184 -0.850708762679 -0.603855987401 20.0859736263 -0.509218707235 0.135545671641 5.01710638192 14.6900468389 0.0243795107208 -1.05156967013 1.54499757672 12.3679799813 0.0797013387786 0.543525054165 1 4 1 16 2 9 3 4 7 3 8 3 7 4 7 4 7 4 8 3 8 3 7 6 4 7 3 0 143.0 0.846153846154 70.0 0.5 0.204704386523 0.19311457773 0.0553052502781 0.106495880764 0.0328437761075 0.0131334616525 0.00890126136316 -0.0021678643188 0.0404164139097 0.454545454545 0.0769230769231 1.0 2.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 0.136363636364 0.0 1.0 1.0 0.48951048951 0.5 0.0833333333333 0.25 0.25 0.916666666667 0.75 0.916666666667 0.833333333333 0.916666666667 0.75 0.666666666667 0.833333333333 0.833333333333 0.0833333333333 0.0 0.333333333333 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.25 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.63943726841 3.62383562732 -13.8263741054 10.5715427686 6.1059862737 2.93360881905 1.84241713221 22.3207927881 -2.72479771203 1.16943753118 -3.37936165601 28.7871185414 0.0968400795505 -0.275168523027 -8.48096468461 26.5354465411 0.0466691765105 -0.530371015795 -5.32021504288 20.4738034559 0.307781249051 -0.488351801683 -5.07873223976 13.2598275668 -0.198545328279 -0.216064199916 1 6 2 9 8 5 4 2 4 3 3 6 3 2 3 6 8 7 6 8 6 8 6 8 6 8 3 1 3 7 2 3 3 5 2 4 4 2 3 6 7 4 0 196.0 1.0 86.0 0.767441860465 0.19970845481 0.205903790087 0.0934984572755 0.0892414884529 0.0504817295515 0.0366379144248 0.0105524248737 0.0132236614561 0.0179459113508 0.571428571429 0.785714285714 0.0 3.0 3.0 1.0 1.0 3.0 3.0 3.0 3.0 12.0 0.153846153846 0.0 2.0 2.0 0.438775510204 0.375 0.8125 0.75 0.625 0.5625 0.1875 0.0 0.375 0.5 0.0 0.0 0.125 0.5 0.625 0.5 0.5 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -1.00040249943 3.2740445436 -7.24805609736 10.666448521 -7.50116271144 4.51573150487 -34.8660252619 29.1587108682 -1.72226727672 2.47541948972 -44.4087210704 42.581154135 2.63030568915 -0.655763170099 -28.4963157283 37.7587205318 -0.150440695198 -1.2622445264 -26.2278611709 25.9854269896 -0.936298588145 0.0198522128519 -33.762297773 24.7588429583 0.13924188755 0.194336374803 4 4 3 2 3 12 2 3 3 6 1 2 5 5 2 2 5 4 3 2 6 2 4 2 6 2 4 3 4 3 6 2 3 2 7 3 10 1 13 2 11 5 1 2 7 9 6 10 3 2 5 4 2 2 7 3 2 2 9 1 1 3 12 2 13 3 3 1 9 5 5 0 308.0 0.636363636364 118.0 1.04237288136 0.16952690167 0.1610094451 0.0464250051475 0.11813176019 0.0373655559949 0.0138978029514 0.0127693260852 0.00597938999575 0.0781338341354 1.71428571429 0.590909090909 4.0 9.0 6.0 3.0 4.0 4.0 2.0 3.0 4.0 13.0 0.288461538462 3.0 3.0 1.0 0.383116883117 0.416666666667 0.416666666667 0.458333333333 0.541666666667 0.375 0.25 0.541666666667 0.125 0.541666666667 0.25 0.458333333333 0.0833333333333 0.791666666667 0.291666666667 0.416666666667 0.333333333333 0.0 0.333333333333 0.5 0.333333333333 0.0 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.833333333333 1.0 0.666666666667 0.166666666667 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.5 0.666666666667 0.5 0.833333333333 0.833333333333 0.666666666667 0.833333333333 0.333333333333 0.0 0.5 0.666666666667 0.5 1.0 0.5 0.833333333333 0.166666666667 0.0 0.166666666667 0.5 0.333333333333 1.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.166666666667 0.833333333333 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.666666666667 0.5 0.166666666667 0.333333333333 0.166666666667 0.333333333333 1.0 0.333333333333 -8.91267681315 7.75518631793 -19.0457018851 23.3561944574 3.25388753675 6.34180432894 -10.8302606158 43.3549895969 -0.720563724817 -0.53329075951 -7.41471184091 55.1382270144 1.23946023968 6.20718866249 -0.419447290563 83.0396068827 0.593278569764 -1.69082146168 5.30963073625 87.5140437989 -0.580194095221 1.45101950273 1.79954603829 81.4187397931 0.0899139363838 -1.07084517476 4 3 7 2 1 4 4 2 4 3 2 2 5 3 9 3 9 3 7 5 4 4 1 3 3 4 3 2 3 4 3 3 1 4 4 3 1 6 1 5 1 4 3 4 156.0 0.923076923077 76.0 0.776315789474 0.226495726496 0.263806706114 0.0810153576426 0.123940843153 0.0621670544008 0.0206535069785 0.010216282967 0.0119468616399 0.0291923805853 0.833333333333 0.692307692308 3.0 5.0 2.0 0.0 2.0 1.0 2.0 3.0 2.0 5.0 0.275862068966 0.0 2.0 2.0 0.487179487179 0.416666666667 0.166666666667 0.416666666667 0.833333333333 0.333333333333 0.0 0.75 0.916666666667 0.416666666667 0.166666666667 0.5 0.333333333333 0.666666666667 0.75 0.583333333333 0.416666666667 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.25 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.75 0.5 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.25 0.75 0.75 0.5 0.5 0.5 0.75 0.75 0.25 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 -1.12632728957 -2.74236209635 -4.43738050251 -6.7824933604 -2.17644565783 0.248041203981 -9.48605663636 -3.00226828714 1.88325212109 2.57427621936 -3.29962564159 7.1726395059 -0.533332646733 -1.34741130565 -2.75632794289 4.29178015296 0.13903964872 0.522453876643 -2.85661891981 2.61942036746 0.316111185752 -0.699655891842 1.026631371 -0.63640165053 0.00877924049317 0.025795025307 1 4 5 6 9 2 3 4 3 1 4 2 21 8 4 9 3 9 3 9 3 9 4 5 2 2 9 4 7 8 1 5 0 168.0 0.857142857143 81.0 0.691358024691 0.206349206349 0.198979591837 0.0695827934348 0.095460803369 0.0392270003239 0.0214973946107 0.0107368953179 0.00478529062959 0.0279917884483 1.0 0.214285714286 0.0 3.0 6.0 3.0 1.0 1.0 0.0 1.0 4.0 14.0 0.189189189189 0.0 3.0 1.0 0.482142857143 0.25 0.916666666667 0.75 0.416666666667 0.75 0.833333333333 0.666666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.583333333333 0.666666666667 0.416666666667 0.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 0.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.0 -9.14004101756 5.77505079219 -20.8638704063 17.4901621286 1.82494574688 5.6372402438 -14.7372293743 39.445075364 1.20393181412 1.76627233536 -6.9911621635 48.8696597754 -0.980275958159 -1.23795358611 -11.2030713315 39.8458118369 -0.0396120166129 -0.884231372321 -14.6825218204 30.2967617993 -0.750359532661 0.183069235776 -22.8560618413 30.9703561505 -0.204282807388 0.148443098463 1 4 2 10 2 4 31 5 1 5 2 4 2 4 2 4 2 4 3 3 2 4 2 4 2 4 2 5 1 10 1 0 132.0 0.272727272727 74.0 0.540540540541 0.232323232323 0.299931129477 0.0187967832596 0.453381525308 0.056294696274 0.00173271832624 0.0141232359876 0.0021325795772 0.873064820036 1.33333333333 195225785.955 2.0 2.0 1.0 1.0 4294967295.0 4294967292.0 0.0 0.0 4.0 3.0 0.25 0.0 6.0 1.0 0.560606060606 0.416666666667 0.333333333333 0.5 0.416666666667 0.666666666667 0.333333333333 0.916666666667 0.916666666667 0.666666666667 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.10909125801 -3.81971863421 -6.67411312667 -3.29723307369 3.65733515358 8.68978814754 -1.0625543316 25.4871513065 -3.9181954526 0.314030863367 -7.53678609993 33.3344831125 3.86045869566 -0.906184815644 2.48131068787 26.4113124894 -2.52500648158 0.284044105894 -1.75396101721 24.5699517582 1.69502608627 -0.885355726885 1.68430371604 16.2494309545 -0.278478863629 -0.203363598494 2 2 12 4 10 5 11 4 11 4 12 3 11 4 12 3 11 4 12 3 12 10 5 4 3 4 4 3 5 4 3 3 6 3 3 3 6 3 3 2 7 3 3 2 7 4 2 3 6 4 2 3 6 3 3 3 5 4 3 4 3 4 4 10 3 0 330.0 0.681818181818 122.0 0.713114754098 0.148282828283 0.206060606061 0.0451919748449 0.148192225283 0.0650186715641 0.0168811991625 0.0257778827367 0.0190868538055 0.117959923327 0.6 0.454545454545 2.0 2.0 3.0 0.0 0.0 0.0 5.0 5.0 4.0 12.0 0.0576923076923 0.0 2.0 2.0 0.369696969697 0.708333333333 0.583333333333 0.5 0.5 0.458333333333 0.583333333333 0.583333333333 0.458333333333 0.0 0.166666666667 0.208333333333 0.0416666666667 0.0 0.125 0.666666666667 0.625 0.5 0.666666666667 0.333333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.833333333333 1.0 0.833333333333 0.833333333333 0.666666666667 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -10.1280418331 -10.7357243431 -23.3715838796 -25.0211228583 1.98005011469 1.95404245119 -15.2530022044 -14.8359002563 1.9198152098 4.30668353648 -8.44502407421 7.09111788859 -3.11237982068 -0.661081866487 -17.0406561373 13.7350323884 3.34697174409 1.67807916221 -0.694130071123 15.6215390092 -0.550677415681 -2.73905108971 3.87807173949 -0.13774872129 -0.0163826031817 0.200750615093 1 2 2 2 10 7 10 7 12 5 13 4 12 5 13 4 13 3 14 4 2 1 10 10 7 11 6 4 4 4 5 3 6 3 5 3 6 3 5 3 7 2 5 3 6 3 5 3 6 3 5 3 6 3 5 3 6 3 5 3 6 3 3 6 4 6 1 6 4 6 374.0 0.772727272727 144.0 0.611111111111 0.157596728531 0.20320855615 0.0503266988347 0.128422148693 0.0633737781194 0.0179427094037 0.023409027028 0.0188429683525 0.0837603049648 0.411764705882 0.590909090909 3.0 2.0 1.0 1.0 1.0 1.0 5.0 5.0 2.0 7.0 0.145833333333 0.0 1.0 2.0 0.385026737968 0.666666666667 0.433333333333 0.4 0.466666666667 0.566666666667 0.7 0.533333333333 0.433333333333 0.0 0.366666666667 0.333333333333 0.233333333333 0.0 0.1 0.533333333333 0.666666666667 0.888888888889 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.888888888889 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.888888888889 1.0 1.0 0.888888888889 1.0 0.888888888889 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.222222222222 0.777777777778 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.777777777778 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.222222222222 0.222222222222 0.0 0.0 0.0 0.0 0.333333333333 0.888888888889 0.888888888889 0.888888888889 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.333333333333 0.333333333333 -10.4174144569 -5.70064068893 -22.707485422 -15.634959003 3.8986384407 -1.63142784829 -8.52347585351 -14.7396732723 1.82558529684 5.11326204338 -0.172463352699 1.54958468721 -3.21428355859 -3.37076855102 -12.7677013493 -0.192461007032 2.28467261051 4.48263120606 -2.54302489081 18.4555318542 -0.205424965248 -1.8753094632 -1.2809650372 18.032178616 -0.363870941773 0.367778936686 4 4 4 5 1 4 2 4 3 3 3 2 5 2 10 2 10 2 9 4 4 3 2 2 4 3 3 3 2 3 4 3 2 3 4 3 2 11 2 3 4 2 1 0 156.0 0.923076923077 71.0 0.929577464789 0.216346153846 0.224358974359 0.0813427717089 0.112504793995 0.062284270217 0.0229361243553 0.0150737325031 0.0133188215473 0.0285202537886 0.916666666667 0.615384615385 2.0 5.0 3.0 1.0 2.0 1.0 2.0 2.0 0.0 7.0 0.225806451613 1.0 2.0 1.0 0.455128205128 0.666666666667 0.166666666667 0.25 0.583333333333 0.583333333333 0.0833333333333 0.583333333333 0.833333333333 0.416666666667 0.0 0.25 0.333333333333 0.666666666667 0.416666666667 0.416666666667 0.416666666667 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.25 1.0 0.75 0.25 0.0 0.0 0.25 0.25 0.0 0.75 1.0 0.75 0.5 0.5 0.75 0.75 0.5 -0.0489707517206 -1.95883006882 -2.90485935566 -2.93255157638 -3.72786225376 3.03444800011 -12.8914625942 9.86358736456 1.99966331879 2.49990363694 -7.01335311926 23.6188551109 -0.147048023244 -0.192979789782 -3.83871387065 27.057300741 0.0677208303984 1.22694907468 -3.19294711616 36.8573050271 0.568306986709 1.23843461207 3.31907406669 52.820903084 0.128227944284 0.304463555844 4 1 6 3 6 3 5 4 4 17 2 5 4 4 5 4 5 4 5 4 5 4 5 4 5 4 5 4 5 6 5 1 5 0 153.0 0.529411764706 72.0 0.652777777778 0.156136528686 0.21876201461 0.0231054644365 0.160661071924 0.0356454712547 0.00424890162487 0.0076638557014 0.00197478646666 0.15642738985 0.222222222222 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 3.0 7.0 0.0740740740741 1.0 4.0 1.0 0.470588235294 0.466666666667 0.8 0.666666666667 0.533333333333 0.866666666667 1.0 1.0 0.866666666667 0.466666666667 0.666666666667 0.333333333333 0.4 0.2 0.333333333333 0.0 0.0666666666667 0.0 0.5 0.833333333333 0.5 0.5 0.5 0.5 0.333333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 -10.5603985769 4.64357951609 -18.6709686526 10.2485706691 8.89272170528 -1.18590355317 3.58442171446 8.13332628561 -4.10723790463 0.979476288506 -1.29839110474 10.9920826258 2.22588869105 0.101648893007 2.00614248922 10.4424442686 -0.687855050205 -1.29107485248 2.74412029297 1.07772611039 -0.453586711923 0.20907176009 -5.62971960911 0.959663086112 -0.0398783065793 0.0918137521767 3 8 5 5 1 4 3 4 5 3 2 3 7 2 2 3 7 2 1 4 7 7 7 7 7 3 1 3 7 3 1 4 5 4 2 3 4 5 2 5 1 5 4 8 3 0 182.0 1.07692307692 95.0 0.578947368421 0.243720565149 0.249366018597 0.110194825703 0.097010102565 0.0592883749507 0.0361355364133 0.0110410118646 0.0121277985597 -0.00562598903987 0.5 0.846153846154 0.0 2.0 3.0 1.0 2.0 3.0 3.0 3.0 5.0 10.0 0.205128205128 0.0 2.0 3.0 0.521978021978 0.5625 0.875 0.875 0.5 0.6875 0.25 0.3125 0.75 0.4375 0.0 0.0 0.5 0.625 0.5 0.5625 0.8125 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.36458772594 -1.18229386297 -9.6925661904 1.06328361226 -6.10635291863 6.13836951068 -31.8391931135 24.0429380118 -1.05599830302 2.0488677652 -39.2949989753 35.3428125211 0.998752428105 -2.23744709205 -32.9056719579 21.4255338538 0.0366261002086 -0.564268865377 -26.5312891555 14.6320529539 1.72815084116 1.08931751388 -7.43259350207 25.7529200808 0.465234411775 0.325538240398 1 0 5 11 5 11 5 12 4 13 3 13 3 13 3 13 3 13 3 13 7 1 3 4 13 4 3 4 5 4 3 5 5 3 3 6 4 3 3 7 4 2 3 6 5 1 4 6 4 2 4 5 5 2 4 5 5 2 5 2 6 3 13 4 10 4 0 352.0 0.727272727273 155.0 0.548387096774 0.178799715909 0.252066115702 0.0542208401446 0.157680726427 0.0696969207832 0.0177177809718 0.0180511263175 0.0165629941565 0.108940968951 0.5625 0.454545454545 2.0 3.0 4.0 0.0 0.0 1.0 5.0 4.0 2.0 9.0 0.18 0.0 2.0 2.0 0.440340909091 0.791666666667 0.541666666667 0.541666666667 0.708333333333 0.5 0.666666666667 0.583333333333 0.625 0.0 0.291666666667 0.208333333333 0.25 0.0 0.291666666667 0.666666666667 0.75 1.0 0.5 0.0 0.0 0.166666666667 0.166666666667 0.0 0.166666666667 1.0 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -11.6617167393 -17.2755456411 -29.9151486385 -40.888777919 -1.71100531984 2.45045999157 -31.002447321 -25.45622332 4.54755472136 7.79068046631 -16.6036440525 10.1947668378 -4.44190085349 -3.14219294363 -30.4225608922 9.12544625354 2.14955723842 2.67614324423 -25.9200621096 12.9555894966 -0.589920921675 -2.66998177413 -24.774078556 -0.0992936830972 -0.210753533346 0.120531702462 8 1 1 1 4 1 8 9 8 9 6 11 6 3 4 4 5 3 4 5 4 3 5 5 4 3 5 5 3 3 5 5 4 3 5 4 4 3 6 4 4 3 5 5 1 2 1 3 4 9 1 3 4 8 1 6 3 6 3 5 4 3 14 2 5 0 289.0 1.0 140.0 0.685714285714 0.260533279056 0.233258701404 0.105180683274 0.093768680682 0.0561929413853 0.0247682738638 0.00701996911987 0.00683121797042 -0.0101664492831 0.470588235294 0.882352941176 0.0 2.0 4.0 2.0 2.0 4.0 5.0 4.0 6.0 8.0 0.276595744681 1.0 2.0 2.0 0.484429065744 0.0 0.32 0.6 0.6 0.48 0.44 0.12 0.24 0.72 0.4 0.72 0.76 0.68 0.76 0.64 0.52 0.0 0.0 0.0 0.111111111111 0.444444444444 0.666666666667 0.777777777778 0.555555555556 0.0 0.0 0.333333333333 0.777777777778 0.888888888889 0.666666666667 0.777777777778 0.666666666667 0.0 0.444444444444 0.777777777778 0.555555555556 0.222222222222 0.0 0.222222222222 0.444444444444 0.555555555556 0.777777777778 0.333333333333 0.0 0.0 0.111111111111 0.222222222222 0.0 0.888888888889 0.666666666667 0.0 0.111111111111 0.333333333333 0.666666666667 0.888888888889 0.444444444444 0.777777777778 0.777777777778 0.555555555556 0.777777777778 1.0 1.0 1.0 0.888888888889 0.666666666667 1.0 1.0 1.0 0.777777777778 0.777777777778 1.0 0.444444444444 0.555555555556 0.666666666667 0.666666666667 0.555555555556 0.111111111111 0.555555555556 0.666666666667 0.111111111111 2.99585775232 5.6172332856 1.12157287812 16.3078439816 -7.82654879931 3.48462831641 -17.6012769609 24.5421135579 5.19214814844 -3.35834699906 -5.19926659866 13.3317706394 -2.47880217057 1.86463484191 -9.46000680882 19.3905304414 0.242642744965 0.316136786534 -13.4459422059 21.7396806827 0.688976897508 -1.90931188898 -2.61651026651 2.4169642274 0.213406200246 -0.32611025114 5 7 4 8 3 4 8 3 9 2 9 3 9 3 9 4 7 6 5 9 4 7 6 4 8 3 9 3 9 4 8 4 8 4 8 4 8 4 7 6 5 8 4 0 252.0 0.571428571429 100.0 0.61 0.13921957672 0.190098261527 0.0249694932353 0.16074552984 0.0300192313845 0.00585539179566 0.0109269670755 0.000233674538183 0.153872976906 0.75 0.0 2.0 2.0 5.0 0.0 0.0 0.0 0.0 0.0 2.0 8.0 0.0857142857143 1.0 3.0 1.0 0.396825396825 0.0555555555556 0.555555555556 0.388888888889 0.5 0.555555555556 1.0 1.0 1.0 0.666666666667 0.722222222222 0.611111111111 0.777777777778 0.388888888889 0.333333333333 0.111111111111 0.166666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 0.666666666667 0.5 0.5 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.833333333333 1.0 0.833333333333 0.666666666667 1.0 1.0 0.5 0.0 0.5 1.0 0.5 0.166666666667 0.5 0.833333333333 0.166666666667 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -14.2784720374 0.909456817668 -25.0979142926 2.27387883528 12.2661183805 1.09588515399 5.52212825954 12.1259699155 -6.1481270184 4.61717834731 -5.90654253189 30.8610043418 1.98677282259 -1.08738493687 -4.45125818438 36.2996481396 0.825127119699 2.2082341415 6.87046501433 39.977073228 -0.564654508429 -2.87384307643 2.9643073387 24.0676037215 0.113483076877 0.141410158662 1 1 5 10 6 11 6 11 4 13 4 12 3 12 6 10 7 9 9 8 10 5 5 3 4 4 4 5 4 3 4 6 3 3 3 7 3 3 3 7 2 5 2 7 2 5 2 7 2 4 3 7 2 4 3 7 3 3 3 7 3 2 5 4 6 1 3 6 5 2 2 8 1 4 0 368.0 0.695652173913 142.0 0.739436619718 0.155400815217 0.189390359168 0.0458702450468 0.124766413987 0.0568531419195 0.0162131853832 0.0205221545178 0.0169232551228 0.0859094882756 0.625 0.565217391304 4.0 3.0 2.0 1.0 0.0 0.0 5.0 5.0 2.0 6.0 0.1875 0.0 1.0 2.0 0.385869565217 0.583333333333 0.416666666667 0.458333333333 0.458333333333 0.833333333333 0.958333333333 0.666666666667 0.541666666667 0.0833333333333 0.583333333333 0.0416666666667 0.0 0.0 0.375 0.375 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.166666666667 0.5 0.333333333333 0.5 0.5 0.166666666667 1.0 0.833333333333 0.666666666667 1.0 0.833333333333 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.666666666667 0.833333333333 0.833333333333 1.0 1.0 0.666666666667 0.166666666667 0.0 0.166666666667 0.333333333333 0.5 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.0 0.0 0.0 -10.6841405276 -0.885731857207 -23.1625661215 -6.44616848283 4.13512456729 -4.6655800002 -8.73011819504 -11.0077075866 1.15199783371 8.84399022901 -5.50432626724 20.9783419908 -4.67351642238 -2.93749380886 -27.369423126 18.3483014441 2.58144140852 0.637163165546 -15.1252853149 15.4806678316 0.656644717347 0.287736215842 -5.58279547923 16.809288087 -0.342074853357 -0.341129495784 4 4 4 2 2 4 2 2 4 4 1 2 5 3 8 3 7 5 4 6 2 3 3 3 1 3 4 3 1 3 4 7 3 8 4 4 1 1 6 1 2 0 143.0 0.846153846154 71.0 0.816901408451 0.249841068023 0.236686390533 0.0905147959772 0.111993439589 0.0582311717331 0.0212820384949 0.0085532315539 0.011746692296 0.0152250385781 0.727272727273 0.692307692308 2.0 1.0 3.0 0.0 2.0 1.0 2.0 3.0 1.0 10.0 0.266666666667 1.0 1.0 2.0 0.496503496503 0.5 0.166666666667 0.666666666667 0.833333333333 0.166666666667 0.0833333333333 0.416666666667 0.25 0.5 0.333333333333 0.25 0.0833333333333 0.833333333333 0.833333333333 0.75 0.666666666667 0.25 0.75 1.0 0.5 0.0 0.0 0.25 0.75 0.5 0.75 0.5 0.25 0.0 0.0 0.5 1.0 0.25 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.75 0.25 0.0 0.0 0.0 0.5 0.5 0.0 1.0 0.75 0.25 0.0 0.25 0.75 0.5 0.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.17529804129 1.46912255162 -1.50332087542 3.87958340516 -6.00166987951 0.872780498121 -19.1978894082 9.16332991783 1.54326537736 1.49852454911 -18.6705078611 14.0485660719 -0.84034724637 -1.20508772149 -19.8586997572 10.1339965068 -0.304051443861 0.429518218535 -24.4594282297 6.51257229025 -0.0266127328809 -1.52285244576 -23.282963716 -5.49867110363 0.101198356457 -0.0985082854425 4 1 9 5 1 5 1 12 2 12 2 5 8 5 9 4 9 4 9 4 9 4 9 4 9 4 8 6 6 8 6 1 3 2 5 0 195.0 0.866666666667 86.0 0.639534883721 0.171203155819 0.18358974359 0.0474443601544 0.0920495625348 0.0349988367977 0.0123665966286 0.00840830341161 0.00120895452314 0.0402696061495 0.307692307692 0.133333333333 2.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 1.0 7.0 0.2 0.0 3.0 1.0 0.441025641026 0.625 0.5 0.25 0.3125 0.75 1.0 1.0 1.0 0.6875 0.4375 0.25 0.3125 0.625 0.25 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -10.1010337216 7.5545546321 -18.1970839323 20.5343432189 8.24606517595 3.49263754227 3.59439768184 33.1010379114 -3.03214190472 -0.468946175564 0.682066478012 29.9846094435 0.908058896625 -1.19569583554 -0.837624336349 20.1904979651 -0.00397315234789 -0.316355748972 3.21363105661 14.3193019578 0.0621420597876 -0.601196097498 0.401451020208 5.83941264034 -0.187401451496 -0.351329642568 3 1 6 2 4 4 4 15 1 4 5 3 5 3 4 4 4 4 4 4 4 4 4 4 5 5 3 7 3 4 5 1 3 0 136.0 0.470588235294 69.0 0.565217391304 0.161764705882 0.242214532872 0.0242341746387 0.198103246489 0.0426737736617 0.00501179979906 0.0148728311264 0.00543161543424 0.228468192469 0.625 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 9.0 0.214285714286 0.0 2.0 1.0 0.507352941176 0.6 0.8 1.0 0.4 0.7 1.0 1.0 0.6 0.9 1.0 1.0 0.7 0.7 0.6 0.5 0.8 0.333333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.333333333333 1.0 1.0 0.333333333333 0.0 -9.96122702646 3.89461507801 -17.5385085013 11.4814242297 8.42131467661 3.06116537806 2.65487217923 21.7114163526 -4.95588013761 -0.679522850747 -9.00125328957 18.7713782523 1.03785345544 -0.656175098045 -10.9807525043 14.586787418 0.536823482432 0.972848542625 -3.66601957016 20.784314072 -0.479726591362 0.130638330038 -8.40822826057 22.7082644733 -0.0534012119145 -0.16032318727 2 2 4 2 3 4 3 3 27 3 2 3 3 3 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 3 2 11 126.0 0.285714285714 48.0 1.02083333333 0.164021164021 0.213529856387 0.0157450399325 0.392004803097 0.0578841177859 0.00210935802802 0.0351245248341 0.00629682170686 0.68542629508 1.0 204522252.0 0.0 2.0 1.0 2.0 4294967295.0 4294967293.0 0.0 0.0 4.0 0.0 0.047619047619 2.0 8.0 1.0 0.380952380952 0.0833333333333 0.166666666667 0.0833333333333 0.25 0.416666666667 0.416666666667 0.583333333333 0.666666666667 0.666666666667 0.5 1.0 1.0 0.5 0.333333333333 0.5 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 -3.57719681616 -4.05745003288 -6.71722180172 2.24373926899 3.03688460249 -1.23084422646 4.63640967343 -2.64578183583 1.35126811924 -4.7272525557 12.297482564 3.00594907402 -0.985379550426 2.48261150224 9.31190881881 -2.29626896674 0.794986404133 -0.779448648048 10.8716747863 2.01175716702 -0.871107106737 3.5333867637 3.9887782447 -0.47242700552 -0.168672540974 17 6 2 22 2 4 5 5 4 4 2 3 6 4 7 2 2 2 8 3 7 3 1 1 8 4 8 4 9 3 8 1 2 1 9 3 20 4 20 4 20 4 20 4 20 4 19 5 20 4 19 5 20 4 20 4 20 4 20 6 15 10 14 4 1 1 11 0 528.0 1.09090909091 142.0 0.802816901408 0.131786616162 0.105457988981 0.0658574108422 0.052617464406 0.0358036095502 0.028296167141 0.014894434553 0.00828264867406 0.0197258622083 0.416666666667 0.545454545455 0.0 7.0 3.0 0.0 6.0 5.0 0.0 0.0 3.0 8.0 0.222222222222 1.0 6.0 1.0 0.268939393939 0.416666666667 0.111111111111 0.0 0.0 0.25 0.111111111111 0.222222222222 0.277777777778 0.611111111111 0.611111111111 0.666666666667 0.777777777778 0.333333333333 0.0 0.0 0.0833333333333 0.444444444444 0.666666666667 0.555555555556 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.222222222222 0.111111111111 0.111111111111 0.333333333333 0.333333333333 0.444444444444 0.444444444444 0.666666666667 0.888888888889 0.777777777778 0.777777777778 1.0 1.0 1.0 1.0 0.666666666667 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 -3.10352139029 3.52793457187 -2.65636424246 12.8068531664 5.96361308464 6.63836372879 10.7345953376 37.4143509658 -3.7955165063 1.49073761268 7.43322315221 46.6085233908 4.29441178097 -1.54112925166 17.3565395554 34.066529661 -3.50186771806 -1.6111550922 5.44112636855 16.960061794 0.927784332045 -0.630093183924 -2.9086560691 9.62243690652 -0.533052647448 0.161859352138 3 7 5 10 3 5 2 4 3 3 5 3 4 1 6 3 11 3 9 5 6 8 5 4 1 4 4 4 3 4 2 4 3 21 1 12 3 1 1 1 4 3 2 0 196.0 1.0 110.0 0.554545454545 0.253279883382 0.281341107872 0.0846675014237 0.111861341788 0.060588062797 0.0163402351066 0.00770447042999 0.00812609437243 -0.00237032753045 0.857142857143 0.571428571429 3.0 5.0 2.0 0.0 1.0 2.0 2.0 1.0 5.0 12.0 0.116279069767 0.0 3.0 2.0 0.561224489796 0.6875 0.25 0.375 0.875 0.625 0.0625 0.625 0.6875 0.8125 0.625 0.8125 0.8125 0.4375 0.5 0.5625 0.9375 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 -0.954929658551 -3.68330011156 -4.23099991709 -6.68497434721 -2.53487887496 3.70696454916 -11.007433489 8.71734850991 1.22586332172 2.98367933744 -9.89847809495 25.0216976717 -1.72703892181 -0.543796749763 -17.9828708331 27.3170727096 -0.240228460628 1.29535466661 -22.272258432 34.557319567 0.369871093898 0.0929345118898 -18.9894955951 38.2065301537 -0.0409971385979 -0.018222948023 2 2 3 3 3 2 2 15 2 5 6 5 7 3 8 3 8 3 8 3 8 3 8 3 7 5 6 6 4 5 6 0 154.0 0.785714285714 66.0 0.636363636364 0.146989374262 0.180426716141 0.0376284408794 0.10829803103 0.0237406167791 0.0112444717697 0.00590550829843 -0.00136541307465 0.0696621151021 0.363636363636 0.142857142857 2.0 0.0 2.0 0.0 2.0 0.0 0.0 0.0 6.0 4.0 0.0740740740741 0.0 1.0 1.0 0.428571428571 0.583333333333 0.5 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 0.5 0.5 0.333333333333 0.583333333333 0.666666666667 0.0 0.0 0.0833333333333 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -11.2772645391 3.86519147509 -23.1195487381 10.4199995169 5.58851934285 1.62194199294 -7.99875911322 15.948829374 -1.4747329034 -0.617053288095 -8.73977127676 11.7990113505 -0.6931730164 -1.06080812229 -13.833348937 3.75433622911 1.12697221082 -0.0508169886007 -6.21429081626 2.26296622032 -0.0901104273716 0.288793557957 -3.8707903164 3.79613830226 0.0479798696817 -0.159982940528 2 6 4 2 2 4 2 2 4 3 2 1 5 4 7 3 8 3 5 7 2 9 1 4 2 4 1 3 3 3 2 3 2 5 1 16 1 4 1 0 143.0 0.846153846154 86.0 0.558139534884 0.273363000636 0.31737493276 0.0768249306564 0.140727383527 0.0544708360249 0.0112787453297 0.00107732980043 0.00393675817424 0.0192799200836 1.0 0.538461538462 2.0 3.0 2.0 2.0 2.0 1.0 1.0 2.0 6.0 12.0 0.135135135135 0.0 3.0 2.0 0.601398601399 0.5 0.0833333333333 0.666666666667 1.0 0.333333333333 0.166666666667 0.666666666667 0.666666666667 0.583333333333 0.5 0.666666666667 0.666666666667 0.916666666667 1.0 1.0 1.0 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.74236209635 -3.81971863421 -8.83097327394 -8.78240142197 -3.00663029499 0.89364377696 -17.4635087446 -4.26978248151 1.37342374778 1.7303867673 -14.5174848183 4.09533098043 -1.09877857408 -0.818725890182 -18.8966160485 0.702504604511 -0.428440846501 -0.572875411281 -23.1211365631 -7.85424111332 0.45412863904 -1.13251559518 -19.5920568097 -20.4434727057 -0.0046920242174 -0.253671182823 5 1 9 8 3 3 3 4 1 4 3 27 1 3 9 3 9 3 9 3 9 3 10 3 5 3 2 9 5 5 3 0 168.0 0.857142857143 82.0 0.670731707317 0.202380952381 0.215986394558 0.071256478782 0.102604335385 0.0407201571105 0.0224998941076 0.00978919076291 0.00656401254691 0.037127059845 1.0 0.214285714286 0.0 4.0 5.0 3.0 1.0 1.0 0.0 1.0 2.0 14.0 0.111111111111 0.0 3.0 1.0 0.488095238095 0.25 0.916666666667 1.0 0.75 0.666666666667 0.833333333333 0.333333333333 0.583333333333 0.5 0.583333333333 0.0 0.25 0.416666666667 0.583333333333 0.0 0.25 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.5 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -10.140443517 6.13883351926 -26.1426488317 14.5909317339 -2.51353448026 0.505305344102 -35.322715878 22.7222988088 0.776191659452 4.82456235862 -31.1854132902 44.5929396458 -0.0987009155555 0.0776216686154 -30.3327826724 45.0307087669 -0.484330724789 -2.86506740979 -32.934821762 23.4300129744 0.321272120405 0.544299240099 -30.09560397 22.5172675346 0.0609796800554 0.129522871465 1 3 1 6 3 4 4 3 5 3 6 2 5 4 3 5 3 5 3 5 3 5 3 5 3 5 4 4 4 4 6 3 6 128.0 0.5 62.0 0.612903225806 0.1572265625 0.2451171875 0.0216364860535 0.210401535034 0.0483751296997 0.00376896151321 0.0195664031008 0.00643969469223 0.248602071684 0.25 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.217391304348 0.0 3.0 1.0 0.484375 0.375 0.875 0.5 0.5 0.625 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.875 0.875 0.5 0.625 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -9.2707754351 1.31302828051 -16.8472310503 4.0684633084 7.23067017824 1.56761401956 1.16637115133 11.2549937488 -3.46471393616 1.61504285315 -4.15965390492 20.3909056167 1.37327079563 0.400587008972 -2.94012532349 22.756972133 -0.116604683278 -0.854828977179 -1.0551928068 14.9766882183 -0.643900125048 -0.672819966273 -6.81453661273 6.6327752033 0.140535910708 -0.0520852155862 2 4 1 5 4 4 5 12 2 7 3 6 3 6 1 5 3 5 5 4 4 3 4 4 5 3 6 3 3 3 6 3 6 3 3 3 6 3 6 3 3 3 6 3 6 3 3 3 6 3 6 3 3 3 5 4 6 3 2 4 6 3 5 4 2 5 4 5 4 11 3 7 2 12 3 6 3 6 336.0 1.71428571429 180.0 0.555555555556 0.254092261905 0.252976190476 0.176585166247 0.0638589203042 0.0588251576672 0.0672550262679 0.00825096672112 0.0152352998426 -0.0412033329441 0.375 1.92857142857 2.0 3.0 2.0 2.0 5.0 6.0 6.0 6.0 3.0 13.0 0.103448275862 0.0 1.0 3.0 0.535714285714 0.791666666667 0.625 0.5 0.75 0.625 0.0833333333333 0.0416666666667 0.25 0.666666666667 0.541666666667 0.541666666667 0.75 0.708333333333 0.208333333333 0.166666666667 0.375 0.5 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.0 -4.05845104884 7.71901473996 -13.0365305018 17.3684628959 -5.85143095461 -2.60533326113 -39.0918035211 3.89852831001 -3.76224409704 -4.83361567504 -49.2005111799 -18.3367951308 6.55518304878 2.71957619155 -14.0800897678 -6.19932760711 -0.00582205304031 0.74133082911 0.0820715224743 1.25590952072 -0.412602670686 -1.76283669925 -10.9071042492 -12.1523165865 -0.356018455246 0.112842469452 4 5 6 8 4 3 2 5 3 3 3 4 10 3 10 4 8 4 6 7 4 9 3 3 2 5 2 5 1 5 3 4 1 7 1 5 2 4 4 1 9 0 182.0 0.928571428571 94.0 0.723404255319 0.24809805579 0.249607535322 0.080055661643 0.106735131792 0.0565669989954 0.0154515556301 0.00689775767431 0.00651181166223 0.00446447529129 0.769230769231 0.428571428571 2.0 5.0 2.0 1.0 1.0 1.0 1.0 3.0 4.0 11.0 0.2 1.0 3.0 2.0 0.516483516484 0.5 0.1875 0.3125 0.8125 0.625 0.0625 0.5625 0.6875 0.875 0.625 0.9375 0.875 0.3125 0.5625 0.5 0.6875 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 -2.1826963624 0.318309886184 -8.47364795711 3.59046455367 -4.5435720197 4.05102691156 -22.6764920896 16.5354179369 0.991008693072 -0.482751212746 -22.1724565529 17.2963115718 -0.759793082157 -0.215012723827 -25.3625924042 12.919244886 -0.728593074256 -0.664961125351 -29.6632923615 5.40285335208 0.996041997445 -1.08161734115 -21.9045326873 -6.91306063374 0.0345954989354 -0.201789896047 1 0 5 1 6 3 13 2 7 1 6 2 4 5 5 2 3 6 4 2 3 6 4 2 3 6 4 2 2 7 4 2 3 6 4 2 3 6 3 3 3 6 2 4 4 4 3 4 5 2 3 5 4 11 4 11 4 11 4 11 4 10 5 9 7 8 7 8 0 315.0 0.714285714286 145.0 0.51724137931 0.187301587302 0.182766439909 0.0557175251053 0.113466796242 0.0280401684483 0.0185815318001 0.00141676775885 0.00155636756502 0.0630626066837 0.533333333333 0.571428571429 2.0 2.0 1.0 0.0 4.0 5.0 3.0 0.0 5.0 7.0 0.0851063829787 1.0 1.0 2.0 0.460317460317 0.791666666667 0.5 0.5 0.708333333333 0.708333333333 0.458333333333 0.75 0.833333333333 0.458333333333 0.0 0.0833333333333 0.0833333333333 0.75 0.5 0.333333333333 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.5 0.833333333333 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.5 0.666666666667 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 -9.57961181277 12.9142868109 -20.2704208347 33.5055081368 4.26640422765 3.58750811795 -6.57566210288 47.5142255311 0.257840842905 0.280105460887 -4.8216738505 51.0235205387 -2.71773133325 1.449012649 -15.1246379679 56.2040597832 2.94457661406 -0.628221483484 -0.0634724785345 55.139072591 -0.524858879262 0.605484495655 2.92385189165 55.9724544942 -0.0438854912365 -0.148800517663 2 1 6 3 2 5 3 5 2 4 4 4 2 4 5 3 2 4 5 3 2 4 5 3 2 4 5 3 3 2 6 3 3 2 6 3 3 2 5 4 3 3 4 4 3 4 2 6 3 5 2 4 6 1 7 0 196.0 1.0 93.0 0.795698924731 0.234693877551 0.212099125364 0.101884631404 0.0869902209114 0.060019634676 0.0322123434963 0.0137039422523 0.0123734811054 0.000799369759561 0.214285714286 0.928571428571 0.0 1.0 2.0 0.0 3.0 3.0 3.0 3.0 0.0 5.0 0.242424242424 0.0 1.0 2.0 0.474489795918 0.6875 0.75 0.5625 0.4375 0.375 0.5 0.3125 0.625 0.25 0.0 0.0625 0.375 0.875 0.75 0.8125 0.9375 0.5 0.75 0.5 0.5 0.5 0.5 0.25 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.00040249943 0.909456817668 -6.09057353039 5.07249177475 -4.9064267296 4.36168065616 -18.8412896705 20.6269208228 3.35538808863 0.703209738443 -6.01813871187 26.3077227379 0.397206901998 -0.544445753018 -1.1189506489 22.1855925 -1.72191437676 -0.116979387434 -12.5193299022 20.1371061384 0.476775956327 0.16619547378 -13.4310517124 21.9488463702 -0.140484842726 0.0885441832383 1 2 5 5 8 2 3 2 5 1 3 3 4 7 4 7 4 7 4 4 1 3 2 4 2 3 2 2 3 4 2 2 3 3 4 1 22 1 3 1 1 2 1 1 1 154.0 0.785714285714 87.0 0.632183908046 0.262691853601 0.280148423006 0.0745118644216 0.146696952904 0.056319586974 0.0136334241486 0.00616807611993 0.00663840162993 0.0420425142193 0.818181818182 0.642857142857 2.0 3.0 2.0 1.0 1.0 1.0 3.0 1.0 5.0 14.0 0.0857142857143 1.0 2.0 1.0 0.564935064935 0.75 0.25 0.333333333333 1.0 0.666666666667 0.0833333333333 0.333333333333 0.666666666667 0.75 0.333333333333 0.0833333333333 0.583333333333 0.833333333333 1.0 0.75 0.916666666667 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.25 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.4555334077 -1.27323954474 -9.41013184663 -1.58709316967 -4.62013343547 2.51863857464 -22.103582482 8.91016395608 2.10739913327 1.7199282947 -19.1119667114 16.5921356799 -1.85420559699 -1.6381187119 -22.4242097162 7.62706306148 1.24242917363 -0.531764163777 -19.071360291 -1.23626540082 -0.486337877535 -0.632693599507 -17.7639805467 -8.88517721831 0.114877891333 -0.241798321685 0 5 3 5 3 4 3 6 2 4 5 4 3 4 4 4 3 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 3 5 3 4 4 4 3 4 5 2 6 3 12 4 5 2 4 5 3 7 0 210.0 1.07142857143 108.0 0.62962962963 0.252380952381 0.231972789116 0.104792678976 0.0898214015765 0.060592808552 0.0284099502188 0.0120350320399 0.00871185122018 -0.0115333586609 0.266666666667 0.857142857143 0.0 1.0 2.0 1.0 3.0 3.0 3.0 2.0 2.0 10.0 0.0540540540541 1.0 1.0 2.0 0.514285714286 0.75 0.5 0.5 0.3125 0.5625 0.5625 0.5625 0.875 0.25 0.0 0.0 0.5625 0.875 0.75 0.75 0.8125 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 0.75 0.5 0.5 0.5 0.5 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.95230063526 0.891267681315 -6.52018720334 6.72261046844 -1.75763645598 6.78778148404 -6.26044052146 29.8146358505 5.29531000045 0.14440108338 14.9744641095 34.223898824 -1.59024366817 -0.719938202173 10.0607198099 30.1320315907 -1.61149817642 1.16438926074 -5.4662989778 36.6592136475 0.25297340828 0.100921460813 -7.62610480639 43.0092545485 -0.126345570496 0.445959887328 1 12 1 12 5 11 4 12 4 13 4 12 3 13 4 12 3 13 3 7 10 4 4 3 4 5 3 4 4 4 3 7 3 3 3 7 2 3 4 7 3 2 4 6 3 3 4 6 4 3 4 5 4 4 4 4 4 4 5 2 6 4 13 4 3 2 1 1 1 2 1 1 0 352.0 0.727272727273 135.0 0.755555555556 0.196910511364 0.22146177686 0.0642837994444 0.146930261808 0.0633214066389 0.0178530317643 0.018712114402 0.0126391883556 0.0849406008998 0.875 0.590909090909 0.0 4.0 4.0 6.0 0.0 0.0 5.0 4.0 4.0 9.0 0.32 0.0 2.0 2.0 0.383522727273 0.0 0.0833333333333 0.75 0.666666666667 0.0 0.25 0.375 0.625 0.125 0.208333333333 0.0833333333333 0.25 0.791666666667 0.833333333333 0.708333333333 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -2.89372623803 -11.2855323283 -9.11549607704 -28.39126892 -1.5822225447 -0.388141957383 -4.72062312554 -21.5732458767 7.65673124053 7.93745292537 22.3080980876 12.8657479456 -4.12000835662 -2.46390081362 13.5643650673 11.0839826843 2.01382817382 0.0562685374294 16.8871426625 -1.27122051163 -0.119086508835 -2.00050793203 22.0009468035 -14.4327976032 -0.101430828733 0.114639645351 7 1 10 6 6 10 3 4 3 4 2 4 5 4 1 4 6 8 6 7 8 6 7 7 7 3 2 3 6 3 2 3 5 3 4 3 3 4 5 8 7 4 6 0 210.0 0.933333333333 99.0 0.707070707071 0.21462585034 0.219682539683 0.0867345858979 0.0941427491632 0.0526236907461 0.0278754520576 0.00960274256596 0.0108964830871 0.0170964626017 0.571428571429 0.666666666667 0.0 3.0 3.0 1.0 0.0 3.0 3.0 2.0 2.0 8.0 0.285714285714 0.0 2.0 2.0 0.471428571429 0.3125 0.9375 0.8125 0.6875 0.5625 0.3125 0.0625 0.25 0.6875 0.1875 0.0 0.1875 0.4375 0.8125 0.6875 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -4.37145577026 5.17784081526 -17.7312386599 15.7603044937 -10.3856734953 5.01939322747 -50.9128678376 34.2559564795 2.35624557422 0.692885432973 -42.4150496612 39.1200379645 2.76477953164 -0.578763003628 -23.4697277532 35.4762746017 -2.29844763299 0.569851456124 -37.6615342669 39.6276427122 -1.12809454127 0.900437911324 -55.2479010428 49.7757726777 -0.356532816314 0.156470981643 5 4 9 6 7 7 5 4 5 2 3 7 2 4 1 8 6 3 11 3 10 3 12 3 12 2 7 1 4 3 6 1 4 4 4 1 7 6 4 0 196.0 1.0 72.0 0.972222222222 0.134110787172 0.154518950437 0.0499547382468 0.0717090668004 0.0319376917781 0.0185698687976 0.0104538525205 0.00698309091056 0.0320258251635 0.928571428571 0.357142857143 0.0 4.0 5.0 2.0 0.0 2.0 0.0 3.0 3.0 10.0 0.228571428571 2.0 3.0 1.0 0.367346938776 0.25 0.75 0.75 0.5625 0.6875 0.6875 0.1875 0.4375 0.6875 0.3125 0.0 0.0 0.25 0.3125 0.0 0.1875 0.0 0.0 0.25 0.5 0.5 0.5 0.5 0.75 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.25 0.75 0.5 0.0 0.0 -11.686520107 6.04788783749 -29.4610299565 14.279366512 -1.90197117124 0.0218084032808 -36.5270811705 18.175073876 1.17128076135 2.50529596057 -28.5834064489 28.7841258172 0.754542547747 0.201354359012 -20.6634916296 30.4138128998 0.30596446815 -1.20777018271 -16.9669005543 21.4095976518 -0.0414313952557 0.261307814268 -16.3027544839 20.3422115336 0.0389665966151 -0.0333416147041 7 1 10 6 5 2 4 3 3 3 5 3 1 4 4 4 1 11 1 4 9 5 9 3 10 4 9 4 9 5 5 2 2 10 4 8 5 1 1 3 1 2 2 0 195.0 0.866666666667 88.0 0.784090909091 0.191715976331 0.22735042735 0.0662390127952 0.114008665015 0.0500622060385 0.0215385316464 0.0133687190494 0.00774393358478 0.0472346482363 1.15384615385 0.4 0.0 4.0 6.0 4.0 1.0 2.0 0.0 1.0 5.0 17.0 0.243902439024 0.0 3.0 1.0 0.451282051282 0.1875 0.75 0.875 0.6875 0.375 0.5625 0.375 0.6875 0.375 0.3125 0.0 0.25 0.5 0.625 0.0 0.3125 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.75 0.75 0.25 0.5 0.5 0.5 0.75 0.5 0.25 0.25 0.5 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 -11.28939063 2.03718327158 -25.5814636694 7.87378007066 2.40613979743 5.06579573532 -18.3397251418 29.9257637353 0.852003698383 3.96068668652 -10.676808857 49.0532552762 -0.50665059084 -2.01309253146 -10.8869613301 36.0210685427 0.877540452241 -2.30347260503 -6.0756734327 13.176560858 -0.35467759512 -0.616289410639 -6.83370403976 -1.51070107338 0.0657877125556 -0.563063624732 5 2 1 2 7 9 3 3 3 4 2 3 5 3 2 3 5 3 1 3 10 3 9 5 9 4 9 4 9 5 10 5 2 2 4 8 6 2 1 2 9 1 7 0 195.0 0.866666666667 76.0 0.881578947368 0.166469428008 0.167521367521 0.0605062121749 0.087698039414 0.0363337210674 0.0224570271504 0.0120705302328 0.00486259619103 0.0354898275505 0.615384615385 0.4 0.0 2.0 3.0 3.0 2.0 2.0 0.0 2.0 1.0 12.0 0.166666666667 1.0 3.0 1.0 0.389743589744 0.1875 0.625 0.8125 0.5 0.625 0.375 0.4375 0.8125 0.5 0.0 0.0 0.375 0.75 0.375 0.0 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.75 1.0 0.75 1.0 0.75 0.5 0.25 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -10.5254469031 4.41389708842 -22.1256538268 16.7226596538 4.82133374273 8.96813346887 -6.37826291195 46.72252239 1.18934615791 -1.04790024779 4.77167383301 42.7458057169 -0.447832908739 -3.28051882888 3.51359738574 18.9720927031 0.273825447544 0.0194800133089 2.21349848375 11.3480639218 -0.931222046183 -0.896243649914 -3.65651056088 1.24842524282 0.185982269815 -0.402380852489 18 1 5 4 1 7 2 6 3 21 2 15 1 5 2 5 4 6 2 4 2 5 4 5 4 4 2 3 6 4 5 3 2 3 5 4 6 2 3 3 5 4 6 3 2 3 5 4 6 3 2 3 5 4 6 3 2 3 5 4 5 10 3 6 4 11 2 6 4 1 3 0 322.0 1.64285714286 178.0 0.561797752809 0.26343505266 0.252218278616 0.168510849138 0.0589115913834 0.0516850231269 0.0591849228685 0.0039652185202 0.00907339608202 -0.0423021821026 0.347826086957 1.64285714286 1.0 3.0 1.0 1.0 2.0 5.0 6.0 6.0 4.0 7.0 0.288461538462 0.0 4.0 3.0 0.552795031056 0.583333333333 0.75 0.5 0.625 0.708333333333 0.416666666667 0.125 0.25 0.666666666667 0.875 0.666666666667 0.708333333333 0.75 0.5 0.166666666667 0.25 0.333333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.666666666667 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.5 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.333333333333 0.833333333333 0.833333333333 0.666666666667 0.5 0.333333333333 0.166666666667 0.0 -4.70545049141 10.6011031659 -12.3707549367 21.2855350806 -2.11229885843 -6.35358776517 -23.7915307736 0.510364546702 -2.91899041285 -0.793006442384 -36.8109133593 -6.65623042552 0.258268060613 2.69729158568 -40.0126179145 8.93216037277 -0.665956882778 -0.717411744285 -40.6350651091 4.76120346795 0.581308132225 -1.43333858299 -39.8262668148 -7.05442235284 -0.243089983116 0.37531618776 7 3 9 7 6 9 4 2 5 2 5 2 11 3 11 2 12 3 11 3 11 2 6 2 2 5 3 5 2 4 4 4 3 2 6 3 3 3 5 3 3 3 5 3 3 3 5 3 3 2 6 2 4 3 6 1 4 2 7 2 3 3 5 3 1 6 3 5 1 5 8 0 308.0 0.636363636364 115.0 0.973913043478 0.167439703154 0.191263282172 0.0482324114577 0.146975684124 0.0514734148462 0.01579317533 0.0189233571813 0.0126987851277 0.111444846502 1.14285714286 0.590909090909 2.0 6.0 3.0 5.0 1.0 1.0 5.0 5.0 2.0 5.0 0.25 3.0 1.0 2.0 0.373376623377 0.166666666667 0.583333333333 0.625 0.583333333333 0.458333333333 0.416666666667 0.458333333333 0.458333333333 0.458333333333 0.0833333333333 0.125 0.0416666666667 0.416666666667 0.25 0.833333333333 0.625 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.5 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -7.61050000603 -0.0289372623803 -17.0544199816 2.82974195369 2.75920384061 4.60473155787 -3.87617193787 20.2838731821 3.04565131255 1.49057141004 2.81171486941 28.1452934796 -6.31787499457 -1.50560607274 -22.681539378 20.017718745 3.7360114733 -0.423578312052 -10.2011449073 6.87450059354 -0.893115880042 -2.48228956662 -9.98707452202 -12.2994750583 -0.384410415739 0.189160907673 4 1 5 1 1 1 3 6 3 5 3 5 4 5 3 4 4 4 4 4 5 3 4 4 5 3 4 3 6 3 4 4 4 4 4 4 5 4 3 4 5 3 4 4 4 5 3 5 2 6 4 13 4 5 2 4 6 1 1 1 4 2 2 0 240.0 1.06666666667 121.0 0.685950413223 0.246614583333 0.243611111111 0.102296802662 0.0920190248843 0.0646268084491 0.0281828304234 0.0119802337316 0.0103551506547 -0.00902265220688 0.375 1.06666666667 0.0 1.0 3.0 2.0 4.0 3.0 3.0 2.0 4.0 11.0 0.186046511628 0.0 1.0 2.0 0.504166666667 0.5625 0.5 0.5 0.4375 0.625 0.6875 0.6875 0.875 0.0625 0.0 0.0 0.375 0.75 0.5625 0.5625 0.8125 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.25 0.5 0.5 0.5 0.5 0.25 0.25 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.66584529679 -0.318309886184 -8.83539690891 3.18120926936 -2.70081586534 5.75071571719 -12.1719060267 21.766280787 5.13927596843 -0.68780308506 9.32404753618 21.0165911103 -0.412553332015 -1.24557968814 13.5273179177 12.8183414752 -0.69348460296 0.834064945822 5.16914183216 14.2596351088 -0.536722708614 -1.00658372773 -3.97636608392 7.34075588652 -0.344285794063 -0.0299283724729 4 3 7 5 4 9 2 8 3 8 3 6 5 7 5 7 4 1 2 5 3 1 4 4 1 3 3 10 1 14 2 8 4 5 7 1 7 0 176.0 0.6875 105.0 0.552380952381 0.261880165289 0.277698863636 0.0542514952925 0.135828764792 0.0492092851944 0.00810048819707 0.0025552385455 0.00304392530998 0.0459413762078 0.727272727273 0.25 1.0 1.0 2.0 2.0 0.0 0.0 4.0 0.0 1.0 12.0 0.15625 0.0 4.0 2.0 0.596590909091 0.333333333333 0.666666666667 0.416666666667 0.75 0.75 1.0 0.666666666667 0.75 1.0 1.0 0.666666666667 0.416666666667 0.75 0.75 0.833333333333 0.75 0.0 0.25 0.5 0.5 0.5 0.5 0.25 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.25 0.75 1.0 1.0 0.5 0.25 0.75 1.0 -8.91267681315 5.65000047976 -20.8735873905 15.6801370899 1.62139098275 3.30650611263 -11.5731989667 28.1783967245 4.03377736992 -0.284497717717 5.92808754027 22.6387162232 -2.49841504828 -2.84168283938 -0.517883908449 8.75217876986 1.20088511148 1.74252307593 0.0904429778784 10.0009423332 -0.832827010318 -2.22577940518 -2.32899982325 -4.04302333079 0.101046012356 -0.102480273385 1 18 2 1 20 2 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 4 1 9 105.0 0.238095238095 62.0 0.564516129032 0.24 0.297052154195 0.0165804988662 0.515469171796 0.0524263038549 0.00138511422599 0.0163044966642 0.00103809381262 1.10325328571 1.2 204522252.048 2.0 1.0 1.0 1.0 0.0 4294967293.0 0.0 0.0 4.0 1.0 0.190476190476 0.0 7.0 1.0 0.590476190476 0.666666666667 0.25 0.5 0.583333333333 0.75 0.416666666667 1.0 1.0 0.666666666667 0.5 1.0 1.0 0.583333333333 0.25 0.5 0.75 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 -3.51656636165 -1.03071772669 -5.99193773984 2.10281383458 2.74198137136 6.79308561768 -2.20724361526 25.0359736086 -3.07329666946 0.31618363808 -6.81036994951 31.088797419 3.08929217331 -0.511535164088 -0.418610327625 28.2802706179 -2.67150191696 0.962356743399 -6.66367850901 32.5165936387 1.79325991687 -0.615632456719 -4.62094694174 28.2449812894 -0.452607642959 -0.132097396028 4 7 5 2 3 4 3 3 3 5 1 6 1 4 2 10 3 3 10 3 9 5 9 4 9 5 5 1 3 4 3 3 4 9 4 9 1 0 169.0 1.0 87.0 0.655172413793 0.225307237142 0.238051888939 0.0810597643288 0.102394356189 0.0478672348543 0.022368393986 0.0124454199447 0.00536202738102 0.0142579948078 0.846153846154 0.384615384615 0.0 3.0 5.0 3.0 2.0 1.0 0.0 2.0 4.0 9.0 0.275862068966 0.0 2.0 3.0 0.514792899408 0.375 0.75 0.8125 0.4375 0.6875 0.625 0.5 0.875 0.6875 0.4375 0.0 0.5625 0.75 0.3125 0.0625 0.625 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.25 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.0 -9.30444282691 -0.391766013765 -22.2532425183 -0.242534411571 0.17270158595 1.35379498248 -23.0078258444 6.70422722952 0.0989908399508 2.25313809695 -20.8949205619 18.8105181873 -0.432681574777 0.200529801884 -21.490885604 20.4638075781 0.701838929146 -1.04022810559 -16.3227521402 12.1297945416 0.207381177958 -0.125145967543 -11.7317952345 8.29376365506 0.137279183314 -0.0438664944183 5 2 1 1 8 8 6 9 3 4 5 3 1 4 6 8 6 8 6 8 7 7 7 7 7 7 6 8 6 3 2 4 4 3 5 8 3 0 196.0 1.0 102.0 0.549019607843 0.233965014577 0.247813411079 0.102174157876 0.0970641484416 0.0513497777287 0.0338989469083 0.00684405516711 0.0116685758723 0.00458543117348 0.5 0.785714285714 0.0 2.0 3.0 1.0 1.0 3.0 3.0 3.0 4.0 14.0 0.0975609756098 0.0 2.0 2.0 0.520408163265 0.3125 0.9375 1.0 0.9375 0.75 0.3125 0.25 0.3125 0.625 0.0 0.0 0.0625 0.5 0.75 0.5625 0.6875 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.500201249717 4.50181124746 -5.99574729547 12.9536581379 -7.316951305 3.45639991572 -32.2622966595 27.5214369608 -1.31192270904 2.02517018412 -41.4914048794 38.5497189723 1.48328155128 -0.0257643131682 -33.1554893116 38.3065907834 -0.580532731755 -0.678962474093 -33.0150368795 31.6792857437 0.444538238898 -0.215164024965 -28.9290125375 27.7140666339 0.135795090156 -0.0139341772387 10 3 9 7 6 9 5 2 4 3 5 3 12 3 12 3 11 4 11 4 10 5 5 2 3 5 4 4 1 6 4 4 1 6 5 3 2 5 5 3 3 4 6 2 3 4 5 3 3 3 6 3 3 3 6 3 2 4 6 3 3 6 3 3 2 14 1 7 1 5 5 3 3 2 3 0 345.0 0.652173913043 156.0 0.705128205128 0.205603864734 0.245242596093 0.0556737014815 0.167775105096 0.059528865267 0.0155897798547 0.0169721828891 0.0102472019797 0.114959681511 0.866666666667 0.608695652174 2.0 1.0 3.0 4.0 1.0 1.0 5.0 4.0 1.0 10.0 0.297872340426 1.0 2.0 2.0 0.452173913043 0.0833333333333 0.5 0.75 0.583333333333 0.416666666667 0.75 0.75 0.708333333333 0.291666666667 0.0 0.0 0.25 0.583333333333 0.208333333333 0.541666666667 0.583333333333 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.833333333333 0.5 0.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -11.1823646972 -7.30728782196 -22.0526460656 -14.3727882919 7.57183533318 5.65595881596 4.24624097164 10.2282757103 1.64397285892 5.75512615117 12.5535384716 40.3214664787 -4.88888377948 -1.83590129982 -12.8089548277 33.4999669858 1.82790102503 -1.11595452369 -5.13343193357 19.5403584023 1.39368044435 -0.143929235851 9.46905542449 16.8209010761 -0.396350238823 0.023395287854 2 1 3 5 1 4 3 3 3 3 4 2 3 3 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1 5 1 6 126.0 0.285714285714 68.0 0.647058823529 0.186507936508 0.278911564626 0.0134299751647 0.407245437858 0.0475020696109 0.00120443452414 0.0144969605487 0.00277853638892 0.785497978367 0.666666666667 0.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 3.0 1.0 0.185185185185 0.0 7.0 1.0 0.539682539683 0.5 0.333333333333 0.5 0.666666666667 0.833333333333 0.833333333333 1.0 1.0 0.916666666667 1.0 1.0 1.0 0.5 0.5 0.5 0.75 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -5.57800181503 -0.666934999623 -9.38067403696 0.00397303789038 4.74897315131 2.65082946356 -0.959330299886 10.9928701379 -4.28686658907 2.08135879014 -7.35629134096 23.8168560444 4.00270161584 0.614265371375 1.64860835714 28.9333518752 -2.8390670318 -0.305429216078 -2.94730705729 24.6684133849 2.03462506033 -1.09416935492 0.598958931341 11.3430784809 -0.394509855671 -0.354299501974 3 3 2 20 1 5 3 3 31 5 2 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 2 5 1 6 1 2 4 0 161.0 0.304347826087 80.0 0.6625 0.24578527063 0.230623818526 0.0257097473187 0.340962422612 0.0621000598809 0.00272215008785 0.0265509572186 0.00370074613902 0.50225951398 1.14285714286 186737708.348 0.0 2.0 1.0 1.0 0.0 4294967292.0 0.0 0.0 1.0 5.0 0.125 1.0 7.0 1.0 0.496894409938 0.5 0.0833333333333 0.166666666667 0.0 0.75 0.25 0.416666666667 0.0833333333333 0.916666666667 0.333333333333 0.75 0.583333333333 1.0 0.333333333333 1.0 1.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -2.38040436624 3.87507687528 -4.91391864187 15.0754683381 0.802642172115 8.20181002368 -4.64223564079 41.2121806479 -1.19734814608 -1.53957357143 -5.36261605826 39.5400928987 1.78850961244 -0.0386007983877 0.0695276671037 35.063411551 -1.34193807235 0.196205865077 -3.10421850965 33.1454306224 0.853500748746 -1.27266016375 -1.75584490485 23.5677235603 -0.194003786124 0.114791245743 4 3 5 7 2 2 3 4 1 2 3 3 1 3 4 2 1 4 7 7 4 7 7 3 1 2 5 5 5 6 3 13 4 6 1 0 140.0 0.714285714286 79.0 0.708860759494 0.262142857143 0.279081632653 0.0693334548105 0.151418002915 0.0571978862974 0.0129013593386 0.00872828260558 0.00650625027757 0.0585801982421 1.4 0.428571428571 2.0 3.0 4.0 2.0 1.0 2.0 1.0 2.0 3.0 9.0 0.181818181818 1.0 3.0 2.0 0.564285714286 0.416666666667 0.833333333333 0.416666666667 0.833333333333 0.5 0.583333333333 0.5 0.333333333333 0.666666666667 0.333333333333 0.583333333333 0.333333333333 0.833333333333 0.583333333333 0.833333333333 0.833333333333 0.0 0.25 0.5 0.75 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.5 0.75 0.5 0.5 0.75 1.0 1.0 0.5 0.75 0.5 0.0 0.0 0.25 0.75 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.5 1.0 0.75 0.5 0.25 0.0 0.5 1.0 0.75 0.75 1.0 1.0 0.75 0.25 0.5 1.0 1.0 0.5 1.0 1.0 1.0 0.5 0.25 0.75 1.0 -4.77464829276 1.40965806739 -13.1240704339 5.47414974999 -1.89454703395 3.83317488304 -16.5008342319 23.5778982012 3.14117710703 4.06896699841 -2.3138085038 42.7672571203 0.257482487312 -1.09023381657 5.54488406286 41.7820758293 0.434418508661 0.273311427607 6.53673110645 35.232617046 -0.520703298503 -1.68068657105 4.51755028448 23.928867296 0.121282577193 0.216191327951 5 4 10 9 7 2 2 1 1 4 5 3 6 4 2 3 7 4 1 4 8 4 1 3 8 8 8 8 8 3 2 3 8 3 2 3 7 3 4 3 5 3 6 3 3 2 10 4 7 0 224.0 1.14285714286 91.0 0.846153846154 0.187220982143 0.177933673469 0.100147391895 0.0662065956405 0.0466655586621 0.0425616018769 0.00958551584503 0.0143072761019 0.00473459502927 0.5625 0.857142857143 1.0 4.0 4.0 0.0 2.0 3.0 3.0 3.0 2.0 9.0 0.384615384615 0.0 2.0 2.0 0.40625 0.25 0.75 0.875 0.5625 0.625 0.3125 0.25 0.4375 0.5625 0.0 0.0 0.0625 0.5625 0.375 0.25 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.75 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.81443702853 8.31584577655 -19.0005387222 23.028632146 -11.0149519697 4.35531231965 -56.709225261 37.7026826409 0.311796617791 -1.28347329306 -58.2993704724 31.1493255656 2.48259263048 -1.1082505007 -44.09099059 23.181483277 -2.53428261247 1.23009282679 -57.6985813817 31.5492352174 0.0737009383878 0.720900396781 -58.0374409365 40.5673226288 0.528952128174 0.0183729116361 5 4 9 10 4 4 4 3 3 4 6 3 2 3 7 3 2 4 6 9 6 8 7 8 7 4 1 4 6 3 2 4 6 3 3 4 3 4 4 10 7 5 6 0 210.0 1.07142857143 104.0 0.663461538462 0.225714285714 0.234353741497 0.101445740201 0.0880821725516 0.05220505345 0.0347726899848 0.00775609801939 0.00980690128663 -0.000416407715856 0.533333333333 0.714285714286 0.0 3.0 3.0 0.0 1.0 3.0 3.0 2.0 1.0 9.0 0.222222222222 0.0 2.0 2.0 0.495238095238 0.375 0.8125 0.9375 0.625 0.6875 0.4375 0.375 0.6875 0.4375 0.0 0.0 0.3125 0.5625 0.5 0.5 0.6875 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.75 1.0 0.75 0.5 0.75 1.0 0.75 0.25 0.25 0.5 0.25 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.60225399683 2.88600963473 -19.4183226784 11.1871262654 -8.85269308348 6.51219585814 -50.4673178977 34.8522427007 -0.456278752012 0.809055180275 -57.4490418324 38.1881216337 0.133758677752 -3.20049663054 -57.9282668869 16.9971289824 -2.05163941172 -0.224518872508 -71.7224717279 13.4645225995 -0.240253758964 2.096225668 -80.233705279 34.9613379782 -0.382107354816 0.403912642821 3 1 11 12 1 7 1 5 2 4 5 4 2 3 5 4 2 3 5 4 2 3 5 4 2 3 5 4 2 3 5 3 3 3 5 3 3 3 5 3 2 5 4 10 3 9 8 1 1 0 196.0 1.0 104.0 0.615384615385 0.256195335277 0.244897959184 0.108119676963 0.0962619741774 0.0537982685786 0.0331341811069 0.00537287898143 0.0100958195478 -0.00540926900599 0.357142857143 0.857142857143 2.0 1.0 1.0 0.0 1.0 3.0 3.0 3.0 4.0 9.0 0.102564102564 0.0 1.0 2.0 0.530612244898 0.6875 0.5625 0.5 0.6875 0.6875 0.5 0.5 0.625 0.4375 0.0 0.0 0.0625 0.6875 0.75 0.75 0.8125 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.500201249717 6.32072488279 -0.64141791509 17.933547578 -2.38268406057 4.20623778171 -6.13721927765 34.0364456679 2.0814572658 0.73980959892 1.91836693447 37.5266481633 0.217167852601 -1.1235301524 5.24046060601 29.3631209859 -0.669656074832 -0.244539071904 0.945415065796 26.5144891933 0.225376059566 0.803888748955 -0.882829360283 33.7824095216 -0.233941229963 0.0950481797848 9 1 15 6 11 4 1 5 8 4 3 4 8 2 6 3 8 2 6 3 8 2 6 3 8 2 6 3 7 3 6 3 7 3 5 9 1 4 5 14 6 3 7 3 6 3 7 3 6 3 7 3 6 3 7 3 5 4 7 4 4 4 7 4 4 4 7 3 5 4 7 3 6 4 5 4 6 14 5 14 6 6 1 5 7 6 1 0 456.0 0.791666666667 187.0 0.652406417112 0.186403508772 0.223410087719 0.063332988676 0.132941366827 0.0603148324484 0.0195600764151 0.0172193475067 0.0153716385244 0.0722516556047 0.578947368421 0.916666666667 2.0 2.0 2.0 4.0 4.0 6.0 6.0 6.0 5.0 11.0 0.138461538462 0.0 1.0 2.0 0.410087719298 0.233333333333 0.533333333333 0.7 0.633333333333 0.4 0.2 0.2 0.266666666667 0.533333333333 0.466666666667 0.466666666667 0.533333333333 0.266666666667 0.6 0.5 0.533333333333 0.0 0.0 0.0 0.111111111111 0.444444444444 0.666666666667 0.333333333333 0.333333333333 0.111111111111 0.555555555556 0.666666666667 0.777777777778 1.0 1.0 1.0 1.0 0.444444444444 0.777777777778 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.444444444444 0.555555555556 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.222222222222 0.111111111111 0.0 0.222222222222 0.555555555556 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.777777777778 0.666666666667 0.888888888889 0.222222222222 0.666666666667 0.666666666667 0.666666666667 0.888888888889 0.777777777778 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -9.07183175624 -1.22018789704 -24.7991886693 -2.67331610803 -2.16599930364 0.499293371818 -19.8527494622 -0.173649759989 9.6468908556 1.04218786302 9.33692734319 6.57073259705 -8.80375515746 0.775704186921 -21.2361334965 12.0908737954 2.8301573161 -0.216380252792 -23.2920394867 10.5503817373 -0.659350294791 -0.419622477523 -14.7634373416 6.00580612515 0.1913045917 -0.0211508510157 1 1 9 1 11 1 10 1 1 2 1 2 1 3 0 44.0 2.75 33.0 0.333333333333 0.345041322314 0.227272727273 0.251631761833 0.0215063861758 0.0254038317055 0.0412954580625 -0.00019209995978 -0.00307005982623 -0.0525218022363 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 8.0 3.0 0.0526315789474 0.0 2.0 4.0 0.75 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.31498099043 4.45633840657 -6.20140337823 7.69108207839 -0.937471640752 -4.0383025831 -9.70888337519 -2.63853643621 0.0150210500711 1.83413741311 -9.21638331531 0.453578667302 0.605126824347 -0.464889510301 -2.86853540627 1.59621730401 1.07487562915 -0.00924936794535 5.45551272294 -0.68937979714 -0.125478086303 -0.0326278212535 7.99566499455 0.490530404984 0.114340434604 0.0423218802647 0 6 3 5 1 6 4 4 2 6 4 3 2 6 4 3 2 6 4 3 3 4 5 3 3 4 4 4 3 4 4 4 3 5 3 4 3 5 3 4 3 13 3 11 5 4 7 0 195.0 1.15384615385 117.0 0.504273504274 0.279658119658 0.269033530572 0.112257590317 0.0855423725956 0.0562024309243 0.0273923510431 0.00612175153874 0.00329957875868 -0.0344179543626 0.2 0.769230769231 0.0 0.0 1.0 0.0 3.0 3.0 3.0 1.0 1.0 5.0 0.121212121212 0.0 1.0 2.0 0.6 0.875 0.625 0.5 0.3125 0.875 0.875 0.875 0.9375 0.1875 0.125 0.125 0.6875 0.6875 0.5625 0.75 0.6875 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.15924917947 2.29183118052 -10.5781259079 10.2310579 -0.473079226399 6.73402248104 -10.0694445883 31.4609364402 2.36756745079 -1.51065942231 1.56420462659 27.6673806851 0.166641777914 -0.958532305853 6.66112785646 18.5059116539 0.112582466789 0.213808662714 4.59145041171 14.7520204095 -1.09071115509 -1.64113541283 -5.33232703324 -0.0550420337722 -0.055392901331 -0.176146059333 2 7 8 9 1 11 5 9 2 8 9 5 6 5 10 4 7 5 10 4 8 4 10 4 8 4 10 4 7 5 11 4 7 4 10 4 7 6 5 1 3 4 8 11 3 4 7 12 3 4 7 5 10 4 7 5 10 4 7 5 10 4 7 5 10 4 7 5 10 4 8 4 10 5 6 5 10 5 2 11 6 8 1 12 4 9 1 12 4 9 1 0 572.0 1.18181818182 267.0 0.494382022472 0.225457235073 0.233153210426 0.11391782349 0.0925669549044 0.0582125662616 0.0420086043301 0.0120185245815 0.0122259977517 -0.00210975588251 0.730769230769 1.04545454545 7.0 6.0 2.0 4.0 5.0 6.0 5.0 5.0 10.0 6.0 0.0933333333333 4.0 2.0 2.0 0.466783216783 0.571428571429 0.333333333333 0.404761904762 0.595238095238 0.52380952381 0.547619047619 0.619047619048 0.547619047619 0.0952380952381 0.119047619048 0.190476190476 0.119047619048 0.738095238095 0.571428571429 0.571428571429 0.761904761905 0.583333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.583333333333 0.583333333333 0.583333333333 0.666666666667 0.75 0.75 0.916666666667 0.833333333333 0.75 0.75 0.916666666667 0.916666666667 0.75 0.75 0.333333333333 0.0833333333333 0.0 0.0 0.416666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.416666666667 0.666666666667 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.916666666667 0.75 0.75 0.666666666667 0.75 0.75 0.75 0.75 0.916666666667 0.583333333333 0.5 0.583333333333 0.5 0.5 0.5 0.5 -5.1174435548 -0.122426879301 -10.1958739367 1.72391446455 2.80038809063 4.24256224041 -3.05974199574 23.66021846 -0.70979684845 5.60592813203 -0.166207369097 44.3064505133 1.13748592854 -4.90912295018 0.0236496918884 22.4525351231 -2.39787958429 -0.34892650988 -14.7988227049 3.07446097711 0.0954310366253 -1.18860618037 -15.9254661416 5.44708920794 0.468522012922 0.953963529103 6 6 6 3 1 7 4 5 3 5 3 4 5 5 1 5 7 3 1 5 7 9 7 8 8 9 8 8 8 2 1 5 7 3 2 6 4 3 5 10 8 4 7 0 224.0 1.14285714286 115.0 0.6 0.222098214286 0.230229591837 0.107409062956 0.0788592013256 0.0454464570426 0.0389149898689 0.00651884441389 0.00935735912279 -0.0057860843782 0.5625 0.785714285714 0.0 4.0 4.0 1.0 2.0 3.0 3.0 2.0 3.0 12.0 0.179487179487 0.0 2.0 2.0 0.513392857143 0.5 0.9375 1.0 0.75 0.5625 0.5 0.4375 0.75 0.5625 0.0 0.0 0.3125 0.875 0.375 0.125 0.4375 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.25 0.75 0.75 0.5 0.5 0.5 0.25 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.84894415863 8.63415566274 -18.7260263058 25.5903740578 -7.07151523515 7.29594857287 -44.5622861453 52.1342066626 -0.961646921927 0.258340218143 -51.5475804821 52.7993378103 0.844779254725 -2.57019033782 -46.9827026189 36.1973734237 -1.00712832541 0.904028837918 -51.9396925766 41.4497643377 -0.0139085230024 1.73263735525 -52.0150261857 57.230944266 0.226257481601 -0.180839555231 8 2 10 6 7 4 1 5 4 4 2 1 1 4 3 3 6 3 2 4 6 3 2 4 6 3 1 5 7 3 1 3 8 2 2 3 7 3 2 3 7 3 3 3 5 4 3 4 3 4 6 2 2 1 6 0 210.0 1.07142857143 89.0 0.910112359551 0.199047619048 0.195238095238 0.0951690962099 0.0766681783825 0.0508888888889 0.0362352802494 0.0109321734293 0.0139708075619 0.00743750638071 0.4 0.928571428571 0.0 2.0 2.0 1.0 1.0 4.0 3.0 3.0 2.0 6.0 0.484848484848 0.0 1.0 2.0 0.42380952381 0.1875 0.625 0.8125 0.625 0.5625 0.5625 0.375 0.4375 0.625 0.0625 0.0 0.0625 0.625 0.5625 0.375 0.6875 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 -6.62084563262 7.25746540499 -21.7724544545 19.2070975356 -8.85722015742 2.54025436281 -53.8512159428 28.2128274267 -1.01612689553 -0.718232855284 -61.5459863486 23.7718508815 1.23062494956 -0.81028529618 -55.5765515574 17.2884868526 -1.91086056531 0.386049605112 -68.8414568578 20.4739986924 -1.27928813944 1.04577088348 -84.536736479 33.2139177473 -0.163301508511 0.383021593466 1 2 5 10 6 10 6 11 5 12 4 12 4 12 4 12 4 12 4 3 1 8 10 6 5 3 3 5 4 4 3 5 3 6 3 4 3 6 3 4 3 6 3 4 3 6 3 3 4 6 3 3 4 6 3 3 4 6 3 3 5 5 3 1 8 3 12 4 5 352.0 0.727272727273 146.0 0.595890410959 0.172762784091 0.226368801653 0.051664425501 0.149251523724 0.0647303511736 0.0178521436989 0.0205775739999 0.0178823056777 0.103480648435 0.3125 0.590909090909 2.0 2.0 1.0 0.0 0.0 1.0 5.0 5.0 1.0 5.0 0.0888888888889 0.0 1.0 2.0 0.414772727273 0.5 0.25 0.25 0.541666666667 1.0 1.0 0.833333333333 0.833333333333 0.25 0.416666666667 0.125 0.125 0.0 0.291666666667 0.333333333333 0.291666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.166666666667 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -9.95441825884 -8.56542966458 -21.537272154 -22.8626640184 3.53082431226 -2.22601684493 -11.1617502341 -24.4676243399 0.0272829704186 5.45226960246 -7.9508607921 -4.37759471975 -1.37140764429 -2.76134483844 -15.4009151571 -7.55237867041 0.660309699472 1.88462611924 -12.8962867475 -4.40226101341 -0.310109887333 -1.54257059925 -16.1357392263 -12.9768750387 -0.222206620353 -0.110155099264 3 4 5 8 3 3 2 3 2 2 5 2 2 3 8 5 6 7 5 2 2 4 8 3 9 3 1 2 5 7 4 3 1 9 3 6 4 0 154.0 0.785714285714 76.0 0.828947368421 0.191263282172 0.239332096475 0.0557571960844 0.1319389836 0.0497297019054 0.0143919726408 0.0116436955724 0.00975737677277 0.0709130728181 1.27272727273 0.357142857143 2.0 4.0 4.0 1.0 1.0 1.0 1.0 2.0 1.0 8.0 0.333333333333 1.0 3.0 1.0 0.493506493506 0.5 0.916666666667 0.416666666667 0.666666666667 0.583333333333 0.583333333333 0.333333333333 0.333333333333 0.583333333333 0.333333333333 0.5 0.25 0.75 0.25 0.75 0.75 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.5 1.0 0.75 0.75 1.0 1.0 1.0 0.5 0.75 1.0 0.5 0.25 0.75 1.0 0.75 0.25 1.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 1.0 0.5 0.0 0.0 0.25 0.75 0.75 0.25 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.25 0.75 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.5 1.0 -8.36700272255 0.409255567951 -22.9916126353 3.22361703404 -3.94036086512 3.64780345515 -35.5685508605 17.7401601012 1.42575632426 1.71746857574 -31.5956297623 26.2338239729 -0.810448817717 -1.2956950489 -31.686162466 19.7826159756 0.248902825235 -0.178212058318 -33.3472509778 12.2996264728 -0.785103868668 -1.20392094976 -38.0963332398 1.46711378557 0.0619510959849 -0.131316451291 3 2 6 3 5 4 5 5 1 11 1 5 4 4 6 2 7 2 6 3 6 3 6 3 7 2 7 3 6 4 7 1 4 0 144.0 0.5625 57.0 0.824561403509 0.136574074074 0.161024305556 0.0242784288194 0.119365341542 0.0303809397505 0.00589616144963 0.00975994452564 0.00241819712251 0.101713055634 0.333333333333 0.0625 1.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 0.217391304348 0.0 4.0 1.0 0.395833333333 0.416666666667 0.75 0.5 0.583333333333 0.916666666667 1.0 0.75 0.666666666667 0.416666666667 0.666666666667 0.0833333333333 0.0 0.166666666667 0.416666666667 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -8.11690209769 7.08239496759 -14.7511204782 16.2969510442 6.36557602468 -1.04476516354 1.18261300932 13.9414664477 -3.14532579078 -0.0581944259844 -4.84953626308 11.085586084 0.869833688234 -0.0315002680129 -3.87469974745 9.88260866568 0.779352995025 -0.464074920831 2.48295478449 5.95820220448 -0.89870373878 -0.160777557508 -2.64382319813 2.09875123161 0.154692867163 -0.168303613694 4 2 8 5 4 9 1 3 4 7 3 15 1 2 1 1 1 1 1 1 3 1 10 2 9 3 8 3 8 3 9 8 4 7 6 1 1 2 3 0 165.0 0.733333333333 76.0 0.75 0.17520661157 0.201212121212 0.0505097253527 0.11625144002 0.0360778028216 0.0143606711756 0.00972934894105 0.00498653928168 0.0703914357987 1.09090909091 0.4 1.0 3.0 4.0 1.0 0.0 2.0 0.0 0.0 5.0 11.0 0.176470588235 0.0 3.0 4.0 0.460606060606 0.416666666667 0.916666666667 0.666666666667 0.916666666667 0.583333333333 0.5 0.166666666667 0.5 0.666666666667 0.416666666667 0.0833333333333 0.25 0.583333333333 0.75 0.0833333333333 0.25 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.75 0.0 0.5 1.0 1.0 1.0 0.75 0.25 0.25 0.25 0.75 0.75 0.5 0.75 0.75 0.25 0.0 0.75 1.0 0.5 0.0 0.5 0.75 0.25 0.0 1.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.75 1.0 0.5 0.25 0.75 0.75 0.25 0.0 0.5 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.0 -10.2707989942 6.45108035999 -24.6216519483 16.2043459433 0.477606300336 1.61616539545 -21.5675600052 26.3595925022 2.86796002328 2.76349360045 -4.45387932254 34.6437655175 0.540620561346 -2.87665524684 2.09397516943 16.6956772122 -0.458230869515 -1.72613414541 -1.58080215111 -0.00985866835068 -0.318983997718 0.802456543024 -5.15187465938 0.421723347914 0.0583331004838 -0.443430966603 1 7 2 7 7 3 4 2 4 2 3 4 3 1 4 3 4 1 14 9 3 9 4 8 4 9 4 6 1 1 5 4 2 2 10 4 6 9 1 4 0 180.0 0.8 85.0 0.764705882353 0.210648148148 0.212592592593 0.0702734910837 0.107949931413 0.0454646776406 0.0216648018845 0.011656951364 0.00704076976841 0.0378989091641 1.08333333333 0.333333333333 0.0 4.0 6.0 3.0 1.0 2.0 0.0 1.0 4.0 10.0 0.25 0.0 3.0 1.0 0.472222222222 0.166666666667 0.666666666667 1.0 0.666666666667 0.583333333333 0.833333333333 0.5 0.916666666667 0.5 0.416666666667 0.0 0.5 0.5 0.333333333333 0.0 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.75 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.25 0.5 1.0 0.75 0.5 0.75 0.5 0.0 0.0 0.5 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.5 0.5 0.0 0.0 1.0 0.75 0.25 0.25 0.75 0.5 0.0 0.0 -8.74291154051 7.0452588142 -19.3791129214 21.0974680955 2.62230757791 6.63329508595 -10.2297522922 47.7216930074 1.64695788169 2.60000754704 1.89977040292 60.1326302061 0.316795728991 -2.02211854813 7.24740219432 48.2075402102 0.770769872929 -0.0232166024581 11.3072883834 47.8984782661 -0.847053094848 2.28634894136 3.87245722135 69.2850610523 -0.180532121366 0.248100249038 3 2 11 5 9 6 10 4 12 4 11 3 12 3 12 3 12 3 12 3 3 4 5 11 4 4 4 3 4 3 6 3 3 3 6 3 2 3 7 3 3 3 6 3 3 3 6 3 2 3 7 3 2 4 6 2 3 4 6 3 1 6 5 11 2 12 6 1 2 0 345.0 0.652173913043 137.0 0.729927007299 0.153236714976 0.222180214241 0.0442617036367 0.163174244846 0.0596232310226 0.0161242271877 0.0196423033795 0.0171797852663 0.139064210494 0.8 0.565217391304 3.0 5.0 1.0 1.0 0.0 1.0 5.0 5.0 2.0 8.0 0.16 1.0 1.0 2.0 0.397101449275 0.625 0.5 0.541666666667 0.708333333333 0.625 0.583333333333 0.583333333333 0.5 0.0 0.25 0.166666666667 0.0 0.0 0.291666666667 0.625 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.833333333333 0.666666666667 0.5 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 -12.2895295187 -9.85376691143 -28.9621082805 -24.4308534254 1.51696231121 0.0786945128331 -21.9927611066 -18.1845762585 2.34422915894 5.76715481461 -15.7038315478 5.85696463391 -5.12134747655 -2.20247741213 -38.2947901042 8.66947666714 2.03245592564 3.08040504692 -33.583389583 18.0355745273 -0.424166440748 -2.54425754361 -34.7715746175 7.36773543234 -0.427170413868 0.334879660929 1 2 2 3 5 1 5 1 4 3 2 27 4 1 5 1 4 2 4 3 4 2 4 3 3 2 4 2 4 3 3 2 4 1 12 132.0 0.272727272727 73.0 0.616438356164 0.227272727273 0.300964187328 0.0187411303114 0.457246361689 0.0535572668837 0.00184538643887 0.0139767449644 0.00224103674091 0.896920122618 1.5 195225786.0 1.0 3.0 1.0 2.0 0.0 4294967292.0 0.0 0.0 4.0 1.0 0.15 1.0 5.0 1.0 0.55303030303 0.25 0.25 0.666666666667 0.416666666667 0.666666666667 0.333333333333 0.916666666667 0.833333333333 0.833333333333 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 -4.25377756991 -3.32778517374 -6.47808713361 -2.80316845755 4.28355186054 7.53122147315 0.300275242468 21.2728631913 -4.4516433402 -0.309707370337 -6.68723025382 27.0791997337 4.47560284408 0.417798426448 3.97158449268 28.8845840853 -3.37084034098 0.858031780082 -3.80080017433 31.8207234989 2.0412974994 -1.75305306694 -0.434044405464 16.2684848649 -0.30971317409 -0.254059654664 6 5 5 8 5 7 6 6 6 5 7 4 7 5 7 5 7 5 7 4 8 4 7 5 7 4 8 4 7 4 8 3 8 4 8 3 8 4 8 3 3 1 4 4 2 2 4 8 4 7 5 6 7 3 8 0 300.0 0.48 123.0 0.569105691057 0.186944444444 0.190933333333 0.0340581851852 0.189650962963 0.0298505185185 0.00676465582248 0.00330167020403 -0.000739418505598 0.186267084951 0.5 0.08 0.0 4.0 2.0 0.0 0.0 0.0 0.0 2.0 2.0 6.0 0.333333333333 1.0 2.0 1.0 0.41 0.0 0.0 0.190476190476 0.857142857143 0.047619047619 0.0952380952381 0.714285714286 0.857142857143 0.52380952381 0.761904761905 0.714285714286 0.47619047619 1.0 0.952380952381 0.238095238095 0.285714285714 0.0 0.0 0.0 0.0 0.0 0.125 0.75 0.875 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.25 0.875 1.0 1.0 0.125 0.0 0.0 0.25 0.75 1.0 0.75 0.875 0.375 0.125 0.5 0.75 1.0 0.75 0.375 0.75 0.75 0.625 1.0 1.0 0.875 0.25 0.375 0.625 1.0 1.0 1.0 1.0 0.625 0.0 0.625 0.375 1.0 1.0 1.0 0.875 0.25 0.0 0.375 0.125 -7.05374707783 4.58366236105 -12.5762399372 10.6774056063 5.40696960842 0.820903371114 -1.22028171766 22.4817923143 -3.51033894461 6.32695407703 -3.880559907 45.4691763119 3.51694082651 -2.93270602417 2.8332698975 39.2972801636 -2.95912541013 1.15270292669 -3.02410664899 36.9755454982 2.3702609077 -0.410817783073 3.81433946363 42.048995833 -0.317274531535 0.382928340156 3 1 12 6 10 6 11 5 12 4 12 3 14 2 13 4 13 2 13 4 2 5 6 5 2 4 5 4 4 3 4 4 5 4 3 4 5 4 3 3 6 4 3 4 6 3 3 3 7 3 3 3 7 3 3 3 7 3 3 3 7 3 2 6 4 5 1 5 5 5 352.0 0.727272727273 133.0 0.736842105263 0.157315340909 0.209323347107 0.0523138698288 0.139318430361 0.0659209494301 0.0202366536009 0.0239335821015 0.0207035703541 0.0983012269498 0.625 0.590909090909 4.0 5.0 1.0 0.0 0.0 1.0 5.0 5.0 1.0 5.0 0.266666666667 0.0 1.0 2.0 0.377840909091 0.666666666667 0.375 0.416666666667 0.541666666667 0.625 0.666666666667 0.791666666667 0.625 0.0 0.166666666667 0.125 0.0416666666667 0.0 0.291666666667 0.5 0.291666666667 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.333333333333 0.166666666667 0.166666666667 0.166666666667 0.5 0.5 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.333333333333 0.5 0.166666666667 0.166666666667 0.5 0.833333333333 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -9.14417491219 -9.60717111027 -21.2412698482 -23.824492095 1.70084140536 -0.415166012333 -13.1892509742 -22.7052791961 2.66181308366 2.81295647064 -3.0709207927 -12.8275918894 -3.31889743599 -2.67460245587 -15.8402469804 -19.5508548096 1.64637180947 1.83490052811 -10.1597305522 -16.093769534 -0.0209579261504 -1.64649425943 -8.92371186431 -24.0087298272 -0.384387889814 0.0279994465393 4 7 5 4 1 4 3 4 3 4 1 4 5 2 2 3 9 4 9 4 9 4 9 4 10 4 9 5 3 3 4 9 5 7 8 2 5 0 182.0 0.928571428571 78.0 0.75641025641 0.169907016061 0.18956043956 0.0634001308437 0.0940463805003 0.0411832461706 0.0224203470803 0.015513414988 0.00800471754997 0.0357061813519 0.615384615385 0.285714285714 0.0 2.0 3.0 3.0 2.0 1.0 0.0 1.0 3.0 9.0 0.103448275862 1.0 2.0 1.0 0.428571428571 0.375 0.875 0.9375 0.4375 0.75 0.3125 0.3125 0.75 0.5 0.0 0.0 0.5625 0.6875 0.125 0.0 0.5 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -10.0040249943 0.363782727067 -23.8089936269 6.85613273038 0.611563309024 9.15024920633 -21.2834085725 39.6480243879 1.83100626712 1.45518772565 -10.2708052532 48.6004246758 -0.278627513894 -3.15550590844 -9.14354110586 28.6548169383 0.029736278865 -0.00980768906886 -9.39013893761 22.5398323218 0.0102333338003 0.143638300078 -10.331874399 22.7668996706 -0.156487945154 -0.187726725496 3 2 3 4 2 6 2 5 3 4 3 4 3 3 4 3 4 3 4 3 5 2 4 3 4 3 5 2 4 3 5 2 5 2 5 2 4 4 2 5 2 6 147.0 0.333333333333 71.0 0.718309859155 0.216715257532 0.225785552316 0.0214127207642 0.304696046589 0.0560250941045 0.00193903075227 0.0234346639313 0.00333954210021 0.443801726842 0.714285714286 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 3.0 0.153846153846 0.0 3.0 1.0 0.482993197279 0.333333333333 0.0 0.0 0.166666666667 0.666666666667 0.416666666667 0.25 0.416666666667 0.916666666667 0.916666666667 0.75 0.75 1.0 1.0 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -3.63782727067 3.75908817969 -6.75525013147 9.27169732817 2.19754463698 0.641775423261 -3.99480140566 14.3125173958 -2.57214090339 2.19906413161 -7.95824989381 26.0600164023 2.49135480999 1.25249393643 -2.61341416039 34.7842687498 -1.99402214921 -0.592954494115 -6.31631294605 30.7042308564 1.43520797291 -0.453336805146 -4.66587755434 23.5047095538 -0.361363616445 -0.163435068139 5 1 12 6 10 7 12 5 12 4 14 4 13 3 14 3 14 3 14 3 3 3 8 11 6 5 3 4 5 5 3 4 5 4 5 4 4 3 6 3 5 2 8 2 4 3 7 3 4 3 7 3 4 3 7 4 4 3 6 4 3 5 4 5 2 7 2 7 2 1 1 1 1 2 2 6 1 0 391.0 0.739130434783 149.0 0.724832214765 0.164735971115 0.213944178806 0.0520956815935 0.141944010044 0.0687777804749 0.018112826339 0.0252210228197 0.0196091113366 0.0971706466525 0.705882352941 0.652173913043 3.0 5.0 2.0 2.0 0.0 1.0 5.0 5.0 2.0 9.0 0.25 0.0 2.0 2.0 0.381074168798 0.566666666667 0.4 0.4 0.533333333333 0.5 0.533333333333 0.633333333333 0.3 0.0 0.266666666667 0.366666666667 0.2 0.0 0.0666666666667 0.566666666667 0.666666666667 0.555555555556 0.555555555556 0.111111111111 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 1.0 0.777777777778 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.777777777778 0.777777777778 0.888888888889 0.777777777778 0.666666666667 0.777777777778 1.0 0.888888888889 0.444444444444 0.222222222222 0.222222222222 0.111111111111 0.0 0.333333333333 0.777777777778 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.777777777778 0.444444444444 0.222222222222 0.0 0.0 0.0 0.0 0.222222222222 0.888888888889 1.0 0.888888888889 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.444444444444 0.333333333333 -9.57697570605 -11.8466635901 -21.6931890402 -29.8653961103 2.31165131447 -0.740063290899 -13.2103721601 -25.6484585435 1.55078978675 6.71604437534 -6.27670245259 3.07907041688 -2.68201687841 -2.01130918694 -18.4513514053 7.10523160451 1.03620426726 2.20703959883 -14.2581521787 9.37629230245 0.495688925802 -2.84582748385 -9.98649617862 -4.6816241951 -0.340309355039 0.418952892806 1 10 3 9 6 8 6 10 4 10 4 10 4 10 3 11 4 10 4 6 1 2 5 2 5 2 5 2 3 5 4 1 4 5 4 1 4 5 8 6 8 6 8 6 9 5 4 1 5 4 4 2 4 4 4 3 4 3 4 294.0 0.666666666667 135.0 0.481481481481 0.272594752187 0.25299643667 0.0870942851665 0.166009658989 0.0668922435002 0.0205361256297 0.0109085730568 0.00903610802532 0.0672681143016 0.285714285714 0.571428571429 0.0 2.0 0.0 0.0 0.0 1.0 5.0 5.0 0.0 5.0 0.171428571429 1.0 0.0 2.0 0.459183673469 0.0 0.0833333333333 0.75 0.75 0.0 0.208333333333 0.5 0.583333333333 0.166666666667 0.166666666667 0.0833333333333 0.0416666666667 0.833333333333 0.833333333333 0.791666666667 0.75 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 4.51696886108 -8.48826363157 6.60209378837 -19.5514243266 -5.50066705162 2.07380901553 -5.89098238433 -8.22174469381 4.2909388908 4.79043097547 8.16526250198 16.1033560292 -0.185532849325 -0.612172222514 11.8402983075 20.8273769803 -1.29537306281 0.835795652247 1.2147524476 21.6886317768 0.399254977852 -0.794763061531 2.40622016679 18.8477220942 0.0143626288611 0.120908913482 1 4 3 3 1 21 1 6 2 1 3 4 8 3 7 4 8 3 7 4 8 3 7 4 7 5 5 7 5 2 7 0 154.0 0.785714285714 74.0 0.608108108108 0.190082644628 0.182282003711 0.0486054677318 0.100948069471 0.02944310707 0.0126585291884 0.00699699506687 -0.00172576701941 0.0451519443954 0.545454545455 0.142857142857 1.0 3.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 7.0 0.192307692308 1.0 2.0 1.0 0.480519480519 0.75 0.333333333333 0.166666666667 0.333333333333 1.0 0.916666666667 0.833333333333 0.916666666667 0.833333333333 0.75 0.666666666667 0.833333333333 0.666666666667 0.0833333333333 0.0 0.25 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.25 0.25 0.25 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -9.18551385845 6.00241499661 -17.6062553605 16.6850116636 5.87481263699 3.31858936733 -3.75857243264 28.4391351412 -3.27314020035 -0.458487825292 -10.2505790833 25.5520860762 0.710107892242 -1.20076864192 -12.5055982472 16.5346872975 -0.0164816749521 0.096386506422 -8.01982584921 15.022387901 0.535625568681 -0.0174493163804 -4.26586227077 12.8199367662 0.0597885291889 -0.331706386078 5 6 7 9 5 3 5 3 4 3 5 4 2 3 7 3 2 3 7 3 1 4 7 8 7 8 7 8 7 3 2 4 6 3 3 4 4 2 6 8 8 1 1 1 1 1 1 1 4 0 210.0 1.07142857143 96.0 0.697916666667 0.209523809524 0.207823129252 0.0986329770003 0.0811174819134 0.0489050858439 0.0359228797245 0.00918362541288 0.0115037985447 0.00436091805688 0.466666666667 0.928571428571 0.0 2.0 3.0 0.0 1.0 3.0 3.0 2.0 6.0 13.0 0.186046511628 0.0 2.0 3.0 0.457142857143 0.3125 0.75 1.0 0.625 0.625 0.3125 0.25 0.625 0.5 0.0 0.0 0.25 0.6875 0.5625 0.5 0.5 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.3290144521 4.20169049763 -16.6120256534 13.9748717594 -9.18656478632 5.96951286996 -48.1469463931 36.1868941631 0.073313447366 1.05889516903 -51.6425033245 41.2763173819 1.20954879357 -2.24226629728 -44.7109278088 27.1704580342 -1.85517321795 0.313935990172 -54.9468781502 29.3453908919 0.13302575933 2.20900475118 -57.691611952 52.3683971213 -0.0684556557958 0.397379541674 1 3 1 5 1 1 2 4 4 2 6 3 14 3 6 4 3 4 5 4 4 3 4 5 4 3 4 6 3 3 4 5 4 3 3 7 3 3 3 6 4 4 2 7 3 3 3 6 5 1 6 3 6 5 1 6 4 12 1 1 2 240.0 1.06666666667 115.0 0.721739130435 0.240625 0.205277777778 0.11053125 0.0770745804398 0.0628967013889 0.0358831234633 0.0154432208509 0.0173056068838 -0.007651033175 0.5 1.0 2.0 2.0 4.0 0.0 3.0 3.0 3.0 3.0 1.0 11.0 0.238095238095 2.0 1.0 2.0 0.479166666667 0.6875 0.5625 0.5 0.5 0.6875 0.875 0.625 0.625 0.5625 0.125 0.0 0.0625 0.8125 0.4375 0.375 0.5 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.25 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.039788735773 8.59436692696 -2.17557480534 21.5159851116 -2.92897939704 0.973580628445 -8.90169899518 23.6406946011 2.72421336136 -2.45397222161 2.386906651 8.736138125 0.550720740187 -1.38617044268 8.11575390383 -3.01331786901 -0.973425598585 0.289194669981 2.31133399568 -1.98684377815 0.435920577069 0.375317072218 2.78754006543 1.70924944414 -0.107292868729 -0.0666963569407 7 1 10 6 7 9 4 2 5 3 3 3 6 3 1 4 7 6 8 6 8 6 8 7 7 3 1 3 7 2 3 3 5 3 3 3 5 2 5 2 1 5 10 1 6 0 210.0 0.933333333333 83.0 0.903614457831 0.183333333333 0.180317460317 0.0832554799698 0.0818071482561 0.0497989417989 0.0333971771153 0.0125604936815 0.0151844844259 0.0214747016834 0.5 0.733333333333 0.0 2.0 3.0 1.0 0.0 3.0 3.0 3.0 2.0 9.0 0.1875 1.0 1.0 2.0 0.395238095238 0.1875 0.75 0.8125 0.6875 0.5 0.1875 0.0625 0.375 0.625 0.0625 0.0 0.0 0.4375 0.625 0.5 0.5625 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.64995336157 6.11154981473 -13.9642671926 18.4301254455 -7.75148234835 5.76749219553 -40.8017244512 40.3091824676 0.138033837722 1.17643561372 -40.771706694 46.2086268884 2.80134921627 -1.67899909514 -23.460081254 35.1473292406 -1.39387956018 0.030441750759 -32.144122383 34.6851756815 -1.90918519155 1.51176925927 -55.2732958677 48.9029554365 -0.463450123326 0.101569000654 4 2 7 3 7 3 6 4 4 7 3 7 5 4 7 3 6 4 6 4 6 4 6 4 5 5 6 4 6 4 3 1 2 8 4 4 2 0 170.0 0.588235294118 75.0 0.626666666667 0.17 0.223875432526 0.0297474048443 0.167148585386 0.0540865051903 0.00535368100796 0.019991381882 0.00777238854071 0.147694287293 0.3 0.0588235294118 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 5.0 0.291666666667 0.0 5.0 1.0 0.441176470588 0.266666666667 0.533333333333 0.4 0.333333333333 0.733333333333 0.933333333333 1.0 0.866666666667 0.733333333333 0.8 0.666666666667 0.8 0.0666666666667 0.133333333333 0.0 0.333333333333 0.0 0.333333333333 0.666666666667 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.5 0.833333333333 0.333333333333 0.5 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.833333333333 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 -9.09991792267 0.74896443808 -15.7808619517 2.7414022246 7.91427352674 1.66327119848 3.0696587582 10.5332803705 -4.34637502828 1.91303063059 -3.51123609839 20.8800813752 2.39279038312 0.0949319912329 -0.846795957373 21.1234759151 -1.30804598831 -1.17625389744 -2.4391583311 11.1096713265 0.22809361797 -0.307503884101 -6.65490887043 6.4923524703 -0.0655416466241 0.0841388848252 8 1 8 8 4 3 4 2 3 4 4 3 2 11 1 4 1 1 7 4 8 5 9 4 8 5 9 4 6 2 1 6 3 3 3 9 6 6 2 0 182.0 0.928571428571 85.0 0.752941176471 0.201183431953 0.231161695447 0.0737554921832 0.106715392445 0.0507045785998 0.0245426161522 0.0133302099451 0.00892744268118 0.0323810385256 1.0 0.357142857143 1.0 1.0 6.0 4.0 1.0 2.0 0.0 2.0 2.0 11.0 0.189189189189 0.0 3.0 1.0 0.467032967033 0.1875 0.625 0.875 0.6875 0.5625 0.75 0.5 0.75 0.3125 0.3125 0.0 0.3125 0.5 0.4375 0.0 0.5 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.5 0.75 0.75 0.25 0.0 0.0 0.5 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -10.0040249943 2.04627783975 -21.8579393753 6.77741853445 3.28425273237 3.37775046133 -11.9729709241 23.1470097985 0.337845594377 4.19070059644 -7.08518639081 44.5470548715 -0.980200370755 -0.446334951873 -10.7910698259 40.6645607614 1.04708421595 -2.91874003411 -5.68773349606 14.4413138565 -0.529837518641 -1.19085505539 -9.4787697166 -4.82058377842 -0.217166741508 -0.346970412505 10 1 16 4 12 7 11 6 11 5 13 4 12 4 14 4 13 3 11 7 6 4 1 5 6 3 5 4 4 4 5 3 4 4 7 3 3 4 7 3 2 5 6 4 3 4 6 3 4 4 7 3 4 3 6 4 5 3 5 5 4 5 2 7 5 3 4 4 7 1 5 4 1 0 391.0 0.739130434783 144.0 0.791666666667 0.204603580563 0.199710886245 0.0713075216501 0.129043783799 0.0641678395501 0.0206398651781 0.0206105676409 0.0141851128607 0.0621932610282 0.882352941176 0.565217391304 0.0 3.0 6.0 6.0 0.0 0.0 5.0 5.0 2.0 9.0 0.234042553191 0.0 1.0 2.0 0.368286445013 0.0 0.0333333333333 0.633333333333 0.666666666667 0.0 0.166666666667 0.366666666667 0.333333333333 0.533333333333 0.6 0.4 0.4 0.533333333333 0.5 0.533333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.555555555556 0.777777777778 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.777777777778 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.222222222222 0.0 0.0 0.444444444444 0.444444444444 0.222222222222 0.111111111111 0.555555555556 0.222222222222 0.0 0.0 0.777777777778 1.0 0.888888888889 0.777777777778 0.888888888889 0.777777777778 0.444444444444 0.555555555556 0.555555555556 1.0 0.888888888889 0.777777777778 0.777777777778 0.777777777778 0.888888888889 0.888888888889 0.222222222222 0.555555555556 0.222222222222 0.111111111111 0.111111111111 0.111111111111 0.222222222222 0.222222222222 2.60183733055 -5.03759993787 4.66525051738 -12.0461740273 -0.878825157942 1.55610027371 11.3425804425 2.0347224707 6.85417658025 7.62656252738 33.3802006608 34.0928870838 -4.86110098033 -3.01946313006 14.311123988 28.4266048267 -0.070953928254 0.685808558047 1.60684233859 21.8633224641 -0.219205985904 -0.916562483321 -0.0301556327587 20.6578523576 -0.196198570444 0.368913322477 0 6 3 10 2 11 2 5 1 4 4 2 4 3 4 2 4 3 3 2 6 3 2 2 6 3 2 2 6 6 8 5 9 4 9 3 10 3 10 2 11 2 11 2 11 2 11 1 9 4 8 5 7 5 8 0 273.0 0.619047619048 102.0 0.696078431373 0.152437306283 0.133089133089 0.0366958958916 0.102946676066 0.027599650592 0.0103451780915 0.00798639791914 0.00156922158306 0.0761253425804 0.538461538462 0.380952380952 3.0 3.0 1.0 0.0 5.0 3.0 0.0 0.0 3.0 9.0 0.205128205128 0.0 5.0 2.0 0.373626373626 0.791666666667 0.208333333333 0.0 0.375 0.625 0.708333333333 0.5 0.541666666667 0.375 0.625 0.416666666667 0.0833333333333 0.708333333333 0.125 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 0.666666666667 0.666666666667 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.166666666667 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.666666666667 0.5 0.333333333333 0.166666666667 0.333333333333 0.666666666667 1.0 0.666666666667 0.166666666667 0.0 -7.33628499585 11.4591559026 -14.8552521758 26.4670737729 3.30704070933 -0.819129814008 -9.2212332981 30.4235385995 -2.69351809708 3.87816150279 -11.4322887519 43.9262613264 2.8735799527 -0.0870681082491 -3.37950984717 50.3572413135 -1.66795535864 0.819548427259 -4.57229493851 52.2404934588 1.25818149527 -0.301907003016 -2.23281790887 54.5443052407 -0.193570518058 0.287008067933 1 4 7 4 3 1 5 1 4 4 3 1 4 4 3 1 4 7 4 8 4 8 4 9 3 9 4 8 4 5 1 3 9 4 7 2 0 156.0 0.923076923077 73.0 0.643835616438 0.184829059829 0.209072978304 0.0674962912389 0.105341458892 0.0370064819029 0.0239915347637 0.0132768620537 0.00400655911213 0.0410752210723 0.583333333333 0.307692307692 0.0 2.0 3.0 2.0 2.0 1.0 0.0 1.0 1.0 5.0 0.285714285714 0.0 1.0 1.0 0.467948717949 0.333333333333 0.833333333333 0.833333333333 0.416666666667 0.75 0.833333333333 0.75 0.916666666667 0.583333333333 0.166666666667 0.0833333333333 0.666666666667 0.416666666667 0.0 0.0 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.75 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -11.0184191371 -0.195883006882 -26.0858283661 2.43340331744 0.769333407208 4.76957735693 -23.9053931033 22.0283163284 1.06993745439 3.25153720626 -17.4094559981 40.6863973018 -1.14138188189 -0.175991998766 -21.9110311682 41.1611926451 0.278303706328 -0.520297933355 -21.284861297 36.2310749931 0.0166925873242 0.345038561473 -22.959313342 39.2244020782 -0.36272521632 0.223263925961 3 2 1 5 1 6 1 4 2 4 3 3 3 3 3 3 3 2 4 3 3 3 3 3 3 3 2 4 2 3 3 4 2 4 2 4 2 4 2 4 2 4 1 0 126.0 0.285714285714 75.0 0.6 0.259259259259 0.285336356765 0.0192183869433 0.383282442901 0.0491027686795 0.00102058769659 0.00681686946379 -0.000844198742354 0.664927334221 0.5 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 2.0 0.16 0.0 4.0 1.0 0.595238095238 0.5 0.0 0.25 0.5 0.75 0.5 0.75 1.0 0.916666666667 1.0 1.0 1.0 1.0 0.916666666667 0.916666666667 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -3.81971863421 2.30395727143 -6.84552909755 8.13375988821 2.82900875845 3.82838012771 -1.4020749549 21.3992209667 -2.2438337308 0.132086295062 -4.53623571975 24.3867711721 1.93932288371 -0.0840765354622 -0.605415681051 22.2349504793 -1.41619705092 -0.310017872355 -2.97263910047 17.5042156581 1.00757305437 -0.903117847275 -1.04452937505 7.61537735579 -0.174136308767 -0.168327583475 5 2 6 8 3 2 3 3 2 2 5 2 2 2 9 4 8 6 5 8 8 4 8 3 1 2 5 7 4 2 2 3 2 3 4 7 2 0 154.0 0.785714285714 70.0 1.01428571429 0.214876033058 0.226345083488 0.068039988347 0.127745420375 0.0585067235008 0.0184441733806 0.0139486794075 0.0106759171441 0.0538622554161 1.27272727273 0.357142857143 1.0 3.0 4.0 2.0 1.0 1.0 0.0 3.0 1.0 9.0 0.25 1.0 3.0 1.0 0.454545454545 0.333333333333 0.583333333333 0.166666666667 0.583333333333 0.5 0.666666666667 0.5 0.416666666667 0.416666666667 0.333333333333 0.5 0.0833333333333 0.583333333333 0.25 0.666666666667 0.5 0.0 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.5 0.25 0.5 1.0 0.75 0.5 0.75 1.0 1.0 0.5 0.5 0.75 0.25 0.0 0.5 1.0 1.0 0.5 0.75 0.5 0.0 0.0 0.25 0.75 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.5 0.75 0.75 0.25 0.0 0.0 0.5 1.0 0.75 0.5 1.0 0.75 0.25 0.0 0.25 0.75 1.0 -4.63822977011 0.227364204417 -13.4316033702 1.75280175578 -3.15015425263 2.50263027862 -23.3377404709 14.6543310062 1.03934607672 3.28006955298 -20.5895986025 26.8749247332 -0.343129864105 -2.795854405 -19.7075412869 14.3210020391 -0.119407318301 -0.288569165442 -23.0794433766 1.10634446475 -0.673230992112 -1.74763183976 -27.5225531528 -12.9080222124 0.107424548961 -0.0746630403606 3 3 1 3 4 2 5 3 1 2 6 3 1 2 3 2 1 17 10 2 10 2 11 1 23 4 5 1 3 8 6 5 3 0 156.0 0.923076923077 60.0 1.05 0.167735042735 0.160749506903 0.0714979601814 0.0850897267317 0.0376734267267 0.0281523059447 0.0134357310912 0.00727517794752 0.0358172514082 1.25 0.384615384615 2.0 6.0 5.0 2.0 3.0 2.0 0.0 0.0 0.0 11.0 0.09375 5.0 3.0 1.0 0.384615384615 0.416666666667 0.75 0.416666666667 0.25 0.5 0.333333333333 0.0 0.583333333333 0.25 0.333333333333 0.0 0.583333333333 0.333333333333 0.416666666667 0.0 0.5 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.25 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.0 -4.16251389625 0.293824510324 -11.1601112099 0.728804342974 -1.73194191144 0.45377631476 -17.7171467015 5.51765195425 -0.00269706916622 2.93864632014 -17.2224942178 20.277337655 0.582794839951 0.301467374726 -12.3891603287 22.0139516224 0.221089830754 -1.7979337271 -10.6960502543 9.84018058945 -0.66518219302 0.806640261473 -18.302592201 16.0925288912 -0.280228651586 0.410086879002 4 3 5 3 4 7 3 4 3 7 2 6 1 6 4 5 2 6 4 4 4 4 5 3 5 3 5 3 6 3 5 2 7 3 4 3 7 2 5 3 7 1 6 2 7 2 5 3 7 2 5 6 3 4 1 1 1 6 4 5 3 5 5 3 4 3 6 0 272.0 1.0625 123.0 0.772357723577 0.192474048443 0.198299632353 0.0795559532745 0.084273338512 0.0395925231847 0.0257558187806 0.00818672073136 0.00513667247971 0.0162219153039 0.529411764706 1.0625 2.0 3.0 2.0 2.0 4.0 4.0 4.0 5.0 2.0 5.0 0.375 1.0 0.0 2.0 0.452205882353 0.55 0.7 0.55 0.35 0.8 0.45 0.15 0.1 0.4 0.45 0.55 0.65 0.8 0.5 0.05 0.1 0.166666666667 0.333333333333 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.666666666667 1.0 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.166666666667 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 0.5 0.333333333333 0.5 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.166666666667 0.0 0.5 0.833333333333 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 -8.76288392553 7.5645408246 -25.1630515387 22.7042708173 -5.13986564029 6.32214099202 -37.8826094675 42.5789916013 4.59607124037 -2.16723160538 -21.0112504151 34.695229678 -1.0007008607 -0.635249670155 -15.8745365293 26.9845544212 0.761681657408 1.0251844399 -18.0771102021 36.2499588185 -1.53111565247 1.12691423585 -25.1325258998 47.5348998235 0.229057064024 0.0285180646998 10 4 10 5 10 5 11 4 11 4 11 4 11 4 11 4 6 1 4 3 6 10 3 5 2 5 3 3 5 3 3 4 5 4 2 3 7 3 1 4 6 4 2 3 7 2 3 3 7 2 3 3 6 4 2 4 5 4 3 5 3 5 3 12 5 2 3 4 1 0 330.0 0.681818181818 139.0 0.690647482014 0.238585858586 0.229063360882 0.0748985446754 0.154145894204 0.0655507415755 0.0185275571276 0.0170156338436 0.0101619278127 0.0755695499601 0.8 0.545454545455 0.0 2.0 4.0 3.0 0.0 1.0 5.0 4.0 4.0 9.0 0.145833333333 0.0 2.0 2.0 0.421212121212 0.0 0.0833333333333 0.708333333333 0.625 0.0 0.333333333333 0.458333333333 0.541666666667 0.0833333333333 0.25 0.0833333333333 0.208333333333 0.833333333333 0.833333333333 0.708333333333 0.708333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.5 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 2.66222813899 -7.61050000603 4.81864326538 -19.5402261455 -1.20412492632 -0.21123005783 8.25208944492 -10.3032141929 5.2428554117 9.16964670961 24.9370201832 30.4903307893 -3.31807605092 -1.56130277315 14.0628546227 35.5799295517 0.512452957964 0.441824791742 9.04836836316 29.5539577497 -0.0771205804872 -1.05649183745 10.4920484301 23.7466807454 -0.12203216208 0.137728840158 2 5 3 5 3 5 35 4 3 5 3 5 4 4 4 4 4 4 4 4 4 4 5 3 5 3 4 4 3 6 1 8 1 1 1 4 1 0 168.0 0.380952380952 78.0 0.666666666667 0.208333333333 0.251984126984 0.0251322751323 0.304446865552 0.0592167422525 0.00301662271633 0.020941867497 0.00419569333502 0.410062364777 0.875 204522252.048 1.0 3.0 2.0 1.0 4294967294.0 4294967294.0 0.0 0.0 2.0 3.0 0.227272727273 3.0 7.0 1.0 0.464285714286 0.0 0.166666666667 0.0 0.333333333333 0.25 0.5 0.416666666667 0.5 0.5 0.666666666667 0.916666666667 0.75 0.5 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.15318613402 -5.21421908796 -6.39974625813 -9.04930293948 4.18329513524 5.83949642836 0.643369767972 14.8515210056 -4.2394001519 4.45258503037 -7.12916077029 39.4682023901 3.80571407548 -1.35216493986 2.71338213859 33.2016529922 -2.32715849142 -1.24758904055 -1.94057078203 19.4808243173 1.07494217183 -0.415755524554 -1.46991097191 10.7673370912 -0.09815304242 -0.296089097909 4 1 1 1 5 6 3 7 3 8 2 5 1 1 3 5 5 7 4 6 7 4 7 6 5 6 4 2 2 2 4 2 3 5 3 0 140.0 0.714285714286 74.0 0.756756756757 0.235714285714 0.236224489796 0.0571501457726 0.124887390671 0.0521246355685 0.0107691167302 0.00917807688556 0.00749309679031 0.0505396211912 0.9 0.357142857143 1.0 2.0 3.0 2.0 1.0 1.0 0.0 3.0 3.0 8.0 0.259259259259 1.0 4.0 1.0 0.528571428571 0.416666666667 0.666666666667 0.25 0.583333333333 0.833333333333 1.0 0.5 0.166666666667 0.916666666667 0.833333333333 0.75 0.0833333333333 0.666666666667 0.5 0.833333333333 0.75 0.0 0.25 0.5 0.5 0.5 0.5 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 0.75 0.25 0.5 1.0 1.0 0.25 0.5 0.75 0.75 0.25 0.25 0.5 0.75 -6.18430636014 5.91146931484 -15.7885960305 13.3586547746 -0.994834396469 -0.951217589908 -17.4861308891 13.0480547297 2.22443819552 1.58056473799 -6.53388888759 18.4130162274 0.169472708232 0.416988818826 -0.46381151164 24.0027927359 0.553265808782 0.315319837199 1.50983795934 23.5218012568 -0.673703351324 -1.06737288014 -2.32332475063 14.0516718944 0.0568377983295 -0.0893758139355 1 4 2 3 1 5 1 5 2 8 4 3 8 2 9 3 7 4 7 4 7 4 7 4 7 5 5 6 5 7 3 0 143.0 0.846153846154 67.0 0.567164179104 0.180546726001 0.203335126412 0.0472381059207 0.113981670928 0.0341477193646 0.011517928907 0.00913544722571 -0.000772692778097 0.0551729771728 0.454545454545 0.153846153846 1.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 2.0 5.0 0.217391304348 0.0 4.0 1.0 0.468531468531 0.5 0.0833333333333 0.333333333333 0.5 0.916666666667 0.75 1.0 1.0 0.666666666667 0.583333333333 0.666666666667 0.916666666667 0.666666666667 0.0 0.0 0.333333333333 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.25 0.5 0.5 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 0.25 0.75 0.75 0.25 0.25 0.5 0.5 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -9.20650132347 1.07735653785 -17.9125566456 4.42096511626 5.63076714458 2.74815745159 -4.17232123377 14.0601653065 -2.89159420821 0.142768061789 -11.1581398142 15.3794447137 -0.67469646966 -0.820371908236 -22.2171364608 9.29953028268 -0.700354137722 -0.330219656337 -25.6599558923 3.52416732249 0.310046672809 -0.791645124111 -26.1021221125 -5.01582396302 -0.140844007395 -0.13661739801 6 7 5 10 4 2 3 4 4 3 3 4 4 3 4 3 3 3 5 3 3 4 4 3 2 5 4 3 2 5 4 3 1 13 2 6 2 4 3 3 5 3 4 2 5 2 5 2 5 2 4 2 6 3 3 3 5 3 3 3 5 3 3 3 5 3 3 3 5 2 2 6 3 5 1 5 2 6 294.0 0.666666666667 152.0 0.638157894737 0.258503401361 0.246031746032 0.0681120520771 0.153556774184 0.0545567433323 0.0146812596424 0.0114276349335 0.00612897077753 0.0713783894754 1.07142857143 0.857142857143 3.0 3.0 5.0 2.0 3.0 4.0 5.0 5.0 5.0 9.0 0.220338983051 0.0 2.0 5.0 0.517006802721 0.166666666667 0.708333333333 0.458333333333 0.625 0.583333333333 0.791666666667 0.541666666667 0.583333333333 0.416666666667 0.25 0.0833333333333 0.125 0.916666666667 0.833333333333 0.708333333333 0.791666666667 0.0 0.0 0.0 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.5 0.166666666667 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 1.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 1.0 0.833333333333 1.0 1.0 0.666666666667 0.333333333333 0.333333333333 0.666666666667 0.5 0.333333333333 0.5 0.833333333333 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -5.00201249717 4.3047622703 -10.7491995776 8.1401072151 2.42789911891 -2.44790304438 -0.01892498765 5.62718759456 2.35417214205 3.82941796062 8.47854301563 18.4544625722 -3.36255057303 -0.389582836562 -7.77572192578 26.8561367688 0.480171387397 1.98350662224 -10.3216284922 33.7401396111 0.306214826183 -1.82890244046 -6.06135263141 22.448655289 -0.0718094323573 -0.200088258104 8 1 10 7 5 10 4 3 2 6 2 3 3 6 1 13 1 4 2 1 6 4 10 4 10 4 11 4 7 1 2 5 5 3 2 11 3 11 7 2 2 1 3 0 210.0 0.933333333333 104.0 0.692307692308 0.225170068027 0.233650793651 0.0821116510096 0.10141712558 0.0482505129036 0.0237750056562 0.00949538186102 0.00657713289254 0.0173232982758 0.928571428571 0.4 0.0 3.0 4.0 3.0 0.0 2.0 0.0 1.0 2.0 15.0 0.175 0.0 4.0 1.0 0.495238095238 0.125 0.5625 0.9375 0.75 0.5625 0.6875 0.3125 0.625 0.6875 0.5625 0.0625 0.25 0.6875 0.75 0.0 0.4375 0.0 0.0 0.0 0.0 0.25 0.5 0.75 1.0 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 0.75 0.75 0.75 0.25 0.0 0.5 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.75 1.0 0.75 0.5 0.75 0.75 0.25 0.0 -9.08244208578 6.87549354157 -21.9805055019 18.8909305541 -0.116572153874 4.17283040128 -22.9330744794 38.6576908895 0.774372763836 3.88963677612 -17.6814122824 56.4374434931 -0.313880740494 -1.07449406857 -17.5865381968 53.2744566509 0.215500100345 0.290086938271 -16.2493694802 56.3778598073 -0.0884048674283 2.14379552321 -18.565333988 74.9562676302 -0.286048975044 -0.00257505976752 8 3 9 5 5 9 4 9 3 3 3 1 5 4 9 4 9 4 9 4 8 5 7 9 4 9 5 6 8 4 9 4 10 3 9 3 10 4 9 4 9 4 9 4 7 8 5 8 5 0 299.0 0.565217391304 121.0 0.561983471074 0.144584512477 0.191507924967 0.027512729744 0.158141781913 0.0275452015288 0.0069364431991 0.00778000709921 -0.000428326055531 0.150813564039 0.692307692308 0.0434782608696 3.0 1.0 5.0 0.0 1.0 0.0 0.0 0.0 1.0 5.0 0.34375 0.0 1.0 1.0 0.404682274247 0.125 0.625 0.666666666667 0.458333333333 0.5 0.791666666667 0.875 0.708333333333 0.583333333333 0.125 0.291666666667 0.0 0.583333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 1.0 0.666666666667 0.333333333333 0.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.833333333333 0.5 0.5 0.666666666667 1.0 0.666666666667 0.333333333333 0.5 0.666666666667 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.833333333333 0.666666666667 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 -15.6110239833 5.97869003615 -25.7679190998 13.7309732135 15.6417901891 -0.450819097454 13.6892828041 15.6402270258 -7.9222261886 1.41718252424 -2.90817322351 16.3274527709 1.66978471309 -1.8108717544 -8.54490579937 11.7465604465 0.156097466217 1.44096049199 -0.360640443383 12.15127454 -0.167072350746 -1.66092706008 -4.60085723454 8.04888475023 -0.0633050160468 0.412151784154 1 2 3 10 5 10 5 12 3 12 3 12 3 12 3 12 3 12 3 12 3 1 1 1 4 4 12 4 4 4 4 3 3 5 5 2 3 7 3 3 2 7 3 3 2 7 3 2 3 7 3 2 3 7 3 2 3 6 4 2 4 5 3 3 5 2 4 5 9 7 8 3 0 345.0 0.652173913043 135.0 0.651851851852 0.168695652174 0.216131064902 0.0490647379524 0.157023399663 0.0686351972092 0.0171062754921 0.0241867054134 0.0176767121485 0.121485044662 0.6 0.521739130435 2.0 1.0 3.0 1.0 0.0 2.0 5.0 4.0 2.0 10.0 0.163265306122 0.0 2.0 3.0 0.391304347826 0.666666666667 0.541666666667 0.458333333333 0.458333333333 0.5 0.625 0.625 0.625 0.0 0.291666666667 0.166666666667 0.0833333333333 0.0 0.291666666667 0.541666666667 0.458333333333 0.666666666667 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.333333333333 0.166666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 -7.80551199164 -11.9573800723 -18.0697757127 -29.0671759029 1.52135748347 1.29469217124 -11.1152677288 -14.9313058961 2.21528254358 9.1696230779 -1.50035719524 24.1519462312 -1.82670421574 -3.71443064913 -4.52478220126 19.7774441973 2.14326679397 1.87960449231 4.40514826162 17.2481634763 -0.984763607642 -2.3528065064 1.89433347368 3.8711433853 0.00645118778987 0.0357568856865 3 3 9 6 10 5 11 4 12 3 12 3 12 3 12 3 12 2 4 3 6 6 1 4 4 5 3 3 4 3 6 2 4 3 5 3 4 2 6 3 4 2 6 3 4 2 6 3 3 3 6 3 3 3 6 3 4 2 6 4 2 4 5 4 1 5 5 4 5 1 9 0 330.0 0.681818181818 115.0 0.834782608696 0.156767676768 0.179063360882 0.0497449425383 0.126820825333 0.0627367337285 0.0187037251997 0.0249177709869 0.0197337713505 0.0868459139059 0.4 0.590909090909 3.0 2.0 0.0 1.0 0.0 2.0 5.0 5.0 3.0 8.0 0.195652173913 1.0 2.0 2.0 0.348484848485 0.5 0.25 0.25 0.458333333333 0.75 0.791666666667 0.666666666667 0.583333333333 0.0 0.25 0.0833333333333 0.0 0.0 0.333333333333 0.458333333333 0.5 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.333333333333 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -4.74571103038 -4.34058935705 -11.218191768 -10.8773559475 0.39053346667 0.504010582368 -9.6842741541 -2.24408989565 0.873524461209 6.02297908239 -4.93203812147 22.9834645347 -0.761373349083 -1.93933896143 -9.99568533678 23.7587202335 -0.512028947767 1.79625544898 -10.427612379 28.6949749856 1.66180423682 -0.865516056149 -0.518898597298 25.3928229229 -0.328410915296 -0.0763976745371 1 4 6 5 8 2 3 4 4 1 3 5 20 7 3 9 3 9 3 9 4 8 4 6 8 4 2 1 9 5 6 3 0 168.0 0.857142857143 86.0 0.604651162791 0.199900793651 0.232142857143 0.0687457398634 0.116266298186 0.035581420068 0.0223629902391 0.00887854950051 0.00442900767197 0.0473231441172 1.16666666667 0.285714285714 0.0 5.0 6.0 3.0 1.0 1.0 0.0 2.0 4.0 11.0 0.0540540540541 0.0 3.0 1.0 0.511904761905 0.333333333333 0.916666666667 1.0 0.916666666667 0.583333333333 0.75 0.416666666667 0.833333333333 0.5 0.333333333333 0.0 0.416666666667 0.583333333333 0.25 0.0 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.75 0.25 0.5 0.5 0.0 0.0 0.0 -11.5046287435 2.22816920329 -28.6053944936 7.25270507874 -1.34701690903 3.3571020795 -34.4754467703 23.0580473675 0.323982154341 3.77243710681 -32.430347401 42.8551692411 -0.787479716587 -0.126239757165 -34.8352799543 41.5557702363 0.456567650556 -2.0897461909 -30.8039837756 25.2804660553 0.576557887179 0.474371542857 -25.4731433895 26.8862847768 -0.157694188091 0.259864413052 1 4 2 3 1 11 1 10 2 8 3 4 7 4 7 4 7 4 7 4 7 3 8 3 7 6 4 7 4 0 143.0 0.846153846154 75.0 0.44 0.202161474889 0.205486820871 0.0528553553151 0.104628707886 0.0255033244911 0.0129830334578 0.00290992887063 -0.00337298871146 0.0406113429837 0.363636363636 0.0769230769231 2.0 0.0 2.0 0.0 1.0 0.0 0.0 0.0 3.0 5.0 0.125 0.0 1.0 1.0 0.524475524476 0.666666666667 0.333333333333 0.333333333333 0.583333333333 1.0 1.0 1.0 1.0 0.833333333333 0.75 0.583333333333 0.666666666667 0.916666666667 0.25 0.0 0.166666666667 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -9.50032583379 6.17031471679 -18.625953534 15.4238229043 5.73160632564 0.970142466039 -3.74876168303 20.207567735 -2.1155275584 0.413634049458 -6.57238970295 20.9905701443 -0.365965248914 -0.251716336994 -14.5412420419 18.5765643921 -0.546982202594 -0.460420644488 -16.4679524655 13.1947431922 0.364056828724 -0.573941421237 -16.5845578583 4.92753699481 -0.172863671535 -0.266906114389 8 3 4 4 10 17 6 3 2 13 6 3 2 13 5 2 6 3 13 2 6 3 13 2 6 3 13 2 6 3 13 2 6 3 11 4 5 4 4 3 3 5 4 5 4 4 2 5 5 4 4 4 4 3 6 3 5 3 4 3 6 2 6 3 4 3 6 3 5 3 4 3 6 3 5 3 4 3 6 3 4 4 4 3 6 3 5 3 4 3 5 4 5 3 3 5 4 5 4 4 1 7 2 7 1 14 2 6 3 6 528.0 1.09090909091 237.0 0.649789029536 0.213383838384 0.230716253444 0.0972876579152 0.100819880972 0.0589601681415 0.0323583268438 0.0145015149785 0.0146931617489 0.0124562355427 0.75 1.54545454545 3.0 5.0 4.0 6.0 4.0 6.0 10.0 10.0 2.0 9.0 0.12676056338 2.0 1.0 4.0 0.448863636364 0.25 0.472222222222 0.611111111111 0.638888888889 0.472222222222 0.0833333333333 0.0833333333333 0.194444444444 0.722222222222 0.555555555556 0.527777777778 0.666666666667 0.611111111111 0.166666666667 0.388888888889 0.444444444444 0.0 0.0 0.0 0.0 0.555555555556 0.777777777778 0.333333333333 0.333333333333 0.111111111111 0.444444444444 0.666666666667 0.666666666667 0.888888888889 1.0 1.0 1.0 0.555555555556 0.777777777778 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.555555555556 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.888888888889 0.444444444444 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.777777777778 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.666666666667 0.888888888889 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.666666666667 0.888888888889 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -8.35563451232 3.74014116266 -25.3459021328 11.7843184411 -8.75324555939 4.80366091259 -60.8325787802 32.8526822565 -2.25995452389 3.34434724198 -60.1563756805 46.9445365277 9.17209059225 -2.56947741845 -12.776144579 33.9780667197 -3.05393710522 -0.288478696129 -14.8177037899 25.9007947626 0.232795966143 0.420305935477 -24.5735139572 32.1299705043 0.0308223771973 0.237346956053 11 1 1 6 2 11 2 5 1 5 3 3 2 5 3 2 4 4 3 1 5 4 2 2 6 3 2 2 6 3 1 3 6 6 7 6 8 5 8 4 10 3 10 2 11 2 11 2 10 2 11 2 9 4 7 5 8 5 9 2 10 0 299.0 0.565217391304 110.0 0.763636363636 0.144841780293 0.1410498764 0.0309269807948 0.112226678197 0.0272764862865 0.0082673736817 0.00630305168728 0.00172253987218 0.0915328245299 0.461538461538 0.347826086957 3.0 2.0 1.0 0.0 4.0 4.0 0.0 0.0 5.0 5.0 0.394736842105 0.0 5.0 2.0 0.367892976589 0.666666666667 0.333333333333 0.0416666666667 0.25 0.625 0.833333333333 0.666666666667 0.541666666667 0.291666666667 0.583333333333 0.5 0.0833333333333 0.625 0.166666666667 0.0 0.0 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.666666666667 0.5 0.166666666667 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.333333333333 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.166666666667 0.666666666667 1.0 0.833333333333 0.333333333333 0.0 -9.9091251525 14.5038591618 -19.7254768244 32.6848373463 4.97889299412 -2.32525541909 -10.3754446356 32.4313313776 -3.67342732947 3.77287101969 -13.7425816663 40.5022002081 3.45316333117 -1.98010537935 -6.06820015489 35.4641844449 -2.51216115993 0.519193490969 -10.3971184447 31.8951114542 1.70146071089 -0.365384563803 -7.67177595114 31.1982330001 -0.325132076437 -0.0477367326645 10 10 2 10 3 3 2 5 3 3 2 5 3 2 4 5 2 2 5 5 1 2 5 8 5 7 7 6 8 4 9 4 10 2 11 2 11 2 11 2 10 3 10 3 9 3 7 1 1 4 7 5 8 4 8 0 286.0 0.590909090909 112.0 0.714285714286 0.170790747714 0.150667514304 0.0381084940293 0.114549346199 0.034380346535 0.00923304023948 0.00936163488583 0.00217291915614 0.084392324557 0.461538461538 0.318181818182 2.0 3.0 1.0 0.0 4.0 2.0 0.0 1.0 2.0 5.0 0.323529411765 0.0 6.0 1.0 0.391608391608 0.666666666667 0.208333333333 0.0 0.208333333333 0.708333333333 0.875 0.333333333333 0.625 0.291666666667 0.833333333333 0.583333333333 0.333333333333 0.708333333333 0.333333333333 0.0 0.0 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.166666666667 0.5 0.5 0.833333333333 1.0 1.0 0.833333333333 0.5 0.666666666667 0.166666666667 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.166666666667 0.833333333333 1.0 0.833333333333 0.5 0.5 -7.46581369413 13.4847642692 -16.4752014504 29.4998691955 1.7688798446 -3.38290946282 -13.7624359923 25.9445469357 -1.18430554016 4.30113587728 -12.9061606099 37.4963045557 1.52859537508 -0.971801657242 -7.56607143956 39.5484077727 -0.515746490066 0.70085868416 -4.4788048719 40.8011340846 0.959751953327 0.40411102645 -0.891950486103 47.3728739574 -0.172268666543 0.0695049500716 3 5 1 11 3 3 1 2 4 2 1 3 6 4 5 7 5 5 6 4 5 4 6 4 5 11 2 6 2 0 126.0 0.642857142857 71.0 0.647887323944 0.257495590829 0.258503401361 0.0618103796486 0.163121333189 0.0563264106348 0.0109164546531 0.0118422955477 0.00600365023238 0.0862707020803 1.44444444444 0.214285714286 2.0 4.0 4.0 2.0 1.0 1.0 0.0 1.0 1.0 10.0 0.266666666667 0.0 3.0 1.0 0.563492063492 0.583333333333 0.916666666667 0.25 0.333333333333 0.416666666667 0.5 0.416666666667 0.25 0.75 0.333333333333 0.833333333333 0.583333333333 0.75 0.25 0.75 0.916666666667 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.5 0.75 0.5 0.75 1.0 1.0 0.5 0.0 0.75 0.5 0.0 0.25 0.75 1.0 0.75 0.25 1.0 0.5 0.0 0.0 0.25 0.75 1.0 0.5 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.25 0.75 1.0 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.75 -4.45633840657 0.682092613251 -12.7278173243 3.55703713023 -2.57571163004 3.12022569919 -19.4447615586 16.0291415553 2.0548335898 1.49805406935 -12.0120206003 23.6688378399 -0.519403578568 -0.855276756004 -10.2810249145 20.19538469 0.337702300807 0.104116487037 -9.87946060283 15.586093447 -0.110595379274 -1.31327230352 -8.18334986973 3.13231516909 0.144673943913 -0.23195124876 7 2 1 1 8 6 5 9 4 3 4 1 5 2 10 3 10 3 10 3 9 3 10 4 8 5 7 6 9 3 10 3 10 3 11 2 10 3 10 3 10 4 9 4 9 4 8 6 6 0 286.0 0.590909090909 86.0 0.755813953488 0.104088219473 0.138906547997 0.0217777417946 0.12358923291 0.02258484095 0.00660682115376 0.0101135187869 0.000478985175556 0.116338832346 0.384615384615 0.0909090909091 2.0 2.0 1.0 0.0 2.0 0.0 0.0 0.0 2.0 6.0 0.266666666667 0.0 2.0 1.0 0.300699300699 0.0416666666667 0.416666666667 0.583333333333 0.458333333333 0.5 0.708333333333 0.583333333333 0.625 0.458333333333 0.0 0.0 0.0 0.375 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.833333333333 0.5 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 0.833333333333 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.5 0.5 0.5 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -12.5587718731 4.60102471847 -20.6810753944 12.0576327771 12.8702659578 1.9520096683 13.226336771 22.5897483168 -5.54307827361 2.70212953264 2.97929080139 34.4940191898 1.17003510616 -0.612526796338 1.68131517274 32.2463262358 1.37385740418 -0.731715820318 12.9923585508 23.7952465312 -1.31175564306 -0.169346443738 5.14162323651 21.6124988918 0.18319293205 0.0601900860877 7 3 10 6 9 6 6 2 4 3 5 2 5 4 4 3 2 6 3 8 2 10 2 1 2 2 3 5 5 2 3 5 5 1 4 5 11 4 4 3 4 4 3 4 4 9 8 5 7 0 225.0 1.0 103.0 0.757281553398 0.174518518519 0.224 0.0629161262003 0.091848691358 0.0389918024691 0.0187375739194 0.00579182429995 0.00556708181802 0.027858584406 0.733333333333 0.666666666667 0.0 3.0 4.0 1.0 0.0 3.0 4.0 2.0 4.0 10.0 0.153846153846 3.0 2.0 2.0 0.457777777778 0.125 0.6875 1.0 0.875 0.3125 0.4375 0.625 0.5 0.8125 0.625 0.1875 0.1875 0.4375 0.6875 0.5 0.4375 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 0.75 0.75 1.0 1.0 1.0 0.0 0.0 0.25 0.25 0.25 0.75 1.0 1.0 0.25 0.5 0.25 0.0 0.0 0.5 0.75 0.5 0.5 1.0 0.5 0.0 0.25 0.75 0.5 0.0 0.75 1.0 0.5 0.0 0.5 1.0 0.75 0.25 1.0 1.0 0.75 0.5 0.75 0.75 0.5 0.25 -11.8835690842 4.07436654315 -32.0322734787 8.95138761371 -4.66741322888 -0.638317425094 -46.2265075813 11.4222086875 2.87314939136 3.12187018684 -33.4916263359 22.0985589012 0.188658633793 -1.46770464455 -25.764064464 15.5050527242 0.537301912557 -0.971924860386 -18.0868704072 5.83422679947 1.59012478354 0.480209158911 -1.73857703015 5.66500230538 0.248417122104 -0.35190366862 5 4 7 7 4 3 3 3 2 3 4 3 1 11 1 6 5 4 1 1 6 4 8 4 8 4 9 4 6 1 1 4 5 2 3 8 5 6 2 0 168.0 0.857142857143 82.0 0.670731707317 0.205853174603 0.22406462585 0.0685179701841 0.110042913495 0.0428424221871 0.0210194023011 0.0117459038449 0.00605467740651 0.0392485393494 1.0 0.357142857143 0.0 3.0 6.0 3.0 1.0 1.0 0.0 2.0 3.0 14.0 0.0909090909091 0.0 3.0 1.0 0.488095238095 0.0833333333333 0.666666666667 1.0 0.583333333333 0.5 0.916666666667 0.666666666667 0.833333333333 0.666666666667 0.666666666667 0.0833333333333 0.416666666667 0.5 0.333333333333 0.0 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.75 1.0 0.75 0.25 0.0 1.0 0.75 0.25 0.5 1.0 0.75 0.25 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -11.4591559026 4.18350136127 -25.9985108154 11.1426834608 2.3274670395 2.34602738272 -19.5016343461 25.050126304 0.471243326473 4.6897441921 -13.4805820121 47.2642212671 -0.359935378954 -0.479784872178 -12.0689284224 44.5487966825 1.70810243955 -2.51874693626 2.03788605859 23.6338446 0.869103876499 0.177933113301 13.3214748783 20.6335941761 0.0221346321455 0.145484578543 2 1 4 3 2 5 2 4 3 2 28 2 2 5 2 4 3 3 3 3 2 3 4 3 3 3 3 2 4 3 2 4 1 18 138.0 0.260869565217 68.0 0.75 0.204106280193 0.282608695652 0.0170151350496 0.489419239656 0.063143247217 0.00183743137519 0.0215094453007 0.0052041185238 0.992377392677 1.66666666667 186737708.348 2.0 3.0 1.0 3.0 0.0 4294967292.0 0.0 0.0 4.0 0.0 0.173913043478 0.0 3.0 1.0 0.492753623188 0.333333333333 0.166666666667 0.333333333333 0.25 0.666666666667 0.25 0.75 0.666666666667 0.75 0.333333333333 1.0 1.0 0.5 0.25 0.916666666667 0.916666666667 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.73668127259 -5.14831642002 -6.83246265299 -8.28242002645 2.39081673862 6.17490308344 -3.59202070302 12.7120682626 -2.56047003175 1.0220828878 -6.24217315486 22.7250144791 3.08973040172 -0.415127891822 1.67895669129 21.2947230134 -2.41492183903 0.521433179405 -3.40390761172 20.9940257223 1.77259908492 -1.11061844436 0.855503851125 13.1098323568 -0.303644219953 -0.0184919028206 2 2 2 6 3 13 2 6 4 3 4 3 5 3 4 3 5 3 4 2 7 3 3 2 6 4 3 2 6 4 3 2 6 4 3 2 6 4 2 4 5 4 2 5 3 12 2 5 2 4 11 0 210.0 1.07142857143 105.0 0.67619047619 0.229206349206 0.225510204082 0.101671093834 0.0907440881114 0.0513728539035 0.0319143367525 0.00774958429953 0.0116576305688 0.000485649165379 0.466666666667 0.857142857143 2.0 2.0 2.0 0.0 2.0 3.0 3.0 3.0 3.0 10.0 0.175 1.0 1.0 2.0 0.5 0.75 0.5 0.5 0.75 0.6875 0.375 0.25 0.5625 0.5 0.0 0.0 0.1875 0.8125 0.6875 0.75 0.875 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.69765272631 3.86215995236 -10.9570529231 12.3291113837 -9.66530285515 4.48689615565 -40.3636115805 27.6014008473 2.66389797384 -0.646671553201 -34.8820838558 23.5486294117 -0.0330213342722 -2.3961394911 -33.7242198737 6.36137208908 -3.15436684494 -0.134379652646 -61.4442088347 2.82028759556 -2.14687373933 0.892264889249 -90.7723486592 13.023289335 -0.590325902788 0.289795760359 1 9 2 3 2 5 2 2 4 4 8 4 8 4 6 6 4 8 3 9 2 3 3 4 2 3 3 4 2 3 1 19 3 1 5 3 1 0 156.0 0.923076923077 94.0 0.5 0.275106837607 0.289447731755 0.0812310874256 0.116051296802 0.0530139478919 0.0112778449867 0.0041698755764 0.00401316522665 -0.00659877243922 0.75 0.461538461538 3.0 6.0 0.0 0.0 2.0 0.0 1.0 2.0 3.0 14.0 0.166666666667 0.0 3.0 2.0 0.602564102564 0.583333333333 0.0833333333333 0.75 0.833333333333 0.333333333333 0.333333333333 0.666666666667 0.583333333333 0.583333333333 0.666666666667 0.666666666667 0.583333333333 1.0 1.0 1.0 0.833333333333 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.76294706194 -0.0979415034412 -5.06652756105 0.369840097876 -0.938847547779 1.25817162113 -6.52582665358 7.18109914372 1.6238996868 2.23940413381 0.220813250313 18.2287001755 -0.208579463254 -0.149758200492 2.08869918999 19.9572836077 0.399916857852 0.120817840336 6.07917420973 20.5732438215 0.832372571693 0.349819791541 13.9406306806 22.7052919223 -0.0124273273067 -0.0944192300964 4 2 4 7 1 35 1 8 2 7 2 8 4 6 5 5 4 5 4 11 2 7 1 0 135.0 0.6 101.0 0.316831683168 0.342386831276 0.341234567901 0.0578383376518 0.160664126403 0.0415196870396 0.0040483374597 -0.002985075681 -0.000294445940982 0.0511206181635 0.777777777778 0.2 2.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 6.0 7.0 0.0625 1.0 5.0 1.0 0.748148148148 0.666666666667 1.0 0.583333333333 0.416666666667 0.833333333333 1.0 0.833333333333 0.0833333333333 0.916666666667 1.0 1.0 0.5 0.666666666667 0.833333333333 0.833333333333 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.75 -6.45108035999 6.87549354157 -16.2385356789 15.2258181266 -0.633790351157 -1.39660230951 -16.2021408407 15.0816936774 2.65973977259 2.78900450043 -3.85119966295 24.3556438091 -0.637277278625 -0.531077564007 -3.76172240368 22.8745806591 -0.0572271686336 -1.18752305195 -4.83396450859 10.5338614586 0.469654591951 -0.712867900482 -0.491157872221 -0.498525686185 0.0599703455884 -0.287963412457 1 3 8 4 8 2 3 3 5 1 3 4 8 8 3 9 3 9 3 9 3 9 4 9 4 5 1 2 4 4 2 3 9 4 7 8 1 5 0 180.0 0.8 79.0 0.721518987342 0.173148148148 0.186666666667 0.0580528120713 0.108111111111 0.0367839506173 0.0196576969924 0.0147937521237 0.00613770497956 0.0542248324929 0.666666666667 0.266666666667 0.0 3.0 3.0 2.0 1.0 1.0 0.0 1.0 5.0 11.0 0.125 1.0 2.0 1.0 0.438888888889 0.333333333333 0.916666666667 1.0 0.666666666667 0.666666666667 0.5 0.416666666667 0.916666666667 0.5 0.0 0.0 0.416666666667 0.75 0.0833333333333 0.0 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -10.8225361302 3.39530545263 -25.2643223661 15.0157728652 1.46846960826 10.5661905686 -19.1779851436 54.0151898869 2.60094230397 2.40806799559 -3.52166642145 68.8247411467 -0.231136578401 -2.26789637295 -2.5186314272 57.0088364142 -0.628891455783 1.3923684922 -8.60283599896 65.1914520823 -0.291398993626 1.62615740681 -12.349059676 82.4077185989 -0.0065196988042 0.0917331492345 2 2 5 1 3 3 3 14 1 6 6 4 7 4 7 4 7 4 7 4 7 4 7 4 6 6 5 6 6 1 8 0 154.0 0.785714285714 67.0 0.671641791045 0.158205430933 0.182282003711 0.0397035920733 0.0988397881424 0.0303625367717 0.0112141803759 0.00693881578495 2.92615655521e-05 0.0533287794246 0.181818181818 0.142857142857 1.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 8.0 4.0 0.037037037037 1.0 2.0 1.0 0.435064935065 0.583333333333 0.416666666667 0.333333333333 0.5 0.916666666667 1.0 1.0 1.0 0.583333333333 0.75 0.666666666667 0.833333333333 0.416666666667 0.0833333333333 0.0 0.166666666667 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 -10.8225361302 4.54728408834 -20.9051156467 12.364766416 6.89655953112 2.04720585691 -3.32770144466 19.2788209842 -2.85039050532 -0.692386028087 -7.59393961869 15.5443659181 0.0981176073929 -0.563614853848 -13.164635168 11.523335546 0.038039124464 0.652348490247 -8.70590345301 15.9326391554 0.821626835223 0.280347534157 -2.98763977789 18.4556023611 -0.0381919363513 -0.184634144908 5 1 1 2 9 6 6 5 1 4 3 4 4 4 2 3 6 7 8 6 8 6 8 7 7 7 7 3 1 3 6 3 2 3 6 3 3 4 2 4 5 6 10 2 7 0 210.0 0.933333333333 93.0 0.763440860215 0.202721088435 0.200317460317 0.0872674657164 0.0881858330634 0.0492100205161 0.0322126990147 0.00990655521098 0.0121995559092 0.0178492487942 0.571428571429 0.8 0.0 3.0 3.0 1.0 2.0 3.0 3.0 2.0 3.0 12.0 0.210526315789 0.0 2.0 2.0 0.442857142857 0.3125 0.75 0.875 0.75 0.625 0.1875 0.125 0.375 0.625 0.0625 0.0 0.125 0.5 0.6875 0.5 0.6875 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.75 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -3.98948390684 5.26272345157 -15.0049382522 17.037717493 -8.01857971062 6.67517051986 -42.3553490936 41.4367746075 0.476692502079 0.793327790079 -41.3041210821 45.901824376 2.46227890489 -1.99880508611 -26.3375683558 32.9984587 -1.81942258226 0.400649331817 -38.2681881188 34.1728325099 -1.67407568726 1.19955178542 -59.6784356859 45.9183417019 -0.391753154481 0.0423900091544 1 8 9 14 3 3 5 12 3 7 3 11 1 10 2 11 1 10 3 9 2 10 3 9 2 10 3 10 2 9 3 9 5 6 5 7 6 5 7 3 4 11 4 5 3 13 3 4 4 13 3 4 4 13 3 4 4 13 3 4 4 13 3 4 4 13 3 5 4 8 1 3 3 5 5 6 2 2 4 6 5 4 3 2 8 4 7 6 7 18 3 3 0 528.0 1.09090909091 169.0 0.899408284024 0.15404040404 0.167785812672 0.0845726984028 0.0796411556052 0.0538897715099 0.0383025287736 0.0188196788397 0.021578289991 0.0253350908367 0.791666666667 1.04545454545 3.0 9.0 5.0 2.0 4.0 5.0 5.0 8.0 3.0 13.0 0.164179104478 2.0 2.0 2.0 0.320075757576 0.0277777777778 0.25 0.638888888889 0.638888888889 0.361111111111 0.444444444444 0.0 0.25 0.25 0.0277777777778 0.0 0.194444444444 0.444444444444 0.666666666667 0.527777777778 0.611111111111 0.0 0.0 0.0 0.0 0.222222222222 0.777777777778 1.0 1.0 0.0 0.0 0.0 0.0 0.444444444444 0.777777777778 0.666666666667 0.666666666667 0.111111111111 0.333333333333 0.555555555556 0.555555555556 0.666666666667 0.111111111111 0.0 0.0 0.666666666667 0.555555555556 0.333333333333 0.666666666667 0.666666666667 0.0 0.0 0.0 0.666666666667 0.111111111111 0.0 0.222222222222 0.444444444444 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.111111111111 0.0 0.111111111111 0.444444444444 0.111111111111 0.0 0.0 -3.42183127648 3.84624445805 -19.2302233001 10.4789753377 -15.7908781992 2.39754764099 -69.1073372831 23.1053372923 3.53410742888 3.32480337929 -57.6098106061 38.3422835979 4.15515489684 -0.569057951565 -26.8633516422 38.5219812454 -1.98975298536 0.17429574021 -33.7952674001 37.6714168274 0.229837251375 -0.0443768144033 -36.28514064 32.5148581963 0.110270623173 -0.565463399606 8 1 9 1 3 6 3 5 1 6 2 7 3 4 1 6 5 3 2 5 5 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 4 5 4 1 5 3 6 1 5 5 1 1 1 1 0 225.0 1.0 109.0 0.706422018349 0.226962962963 0.231407407407 0.0970705294925 0.096238266118 0.0574050150892 0.0325287998325 0.0110645007074 0.0132790696573 0.00962685176365 0.266666666667 1.0 1.0 1.0 1.0 0.0 2.0 3.0 3.0 3.0 6.0 6.0 0.0714285714286 1.0 1.0 2.0 0.484444444444 0.5 0.8125 0.5 0.5 0.5 0.75 0.5 0.5625 0.5 0.0625 0.0 0.0 0.6875 0.5625 0.5 0.5 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -2.29183118052 4.83831026999 -7.87995091749 12.7146398505 -3.16216114488 1.58221234092 -16.2182115338 18.5041869815 2.44786432888 -0.345541493434 -4.85557125227 15.96882267 1.16904728001 -0.675775217305 4.78919951701 10.0817916046 -0.762537203794 -0.327371239594 1.50278794242 6.16196674675 0.240999906762 -0.13094790243 -0.10976351891 2.9801652648 -0.183622143898 -0.21119534016 1 4 4 4 3 5 4 5 2 5 4 5 4 3 6 2 5 4 5 2 5 4 5 2 5 3 6 2 5 3 6 2 5 3 6 3 4 3 5 4 4 4 4 5 3 14 3 6 2 4 6 3 8 0 224.0 1.14285714286 104.0 0.692307692308 0.208147321429 0.216198979592 0.0954550695836 0.0838217332134 0.0581157895636 0.0323252278309 0.0139610956305 0.0129012552136 0.00267149101426 0.25 0.857142857143 0.0 1.0 2.0 1.0 3.0 3.0 3.0 2.0 3.0 8.0 0.131578947368 1.0 1.0 2.0 0.464285714286 0.8125 0.5 0.5 0.4375 0.5 0.625 0.5 0.8125 0.1875 0.0 0.0 0.4375 0.875 0.5 0.5625 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.5 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.33169059358 1.75070437401 -15.593188701 9.18071102424 -3.0842487214 7.35718592402 -19.7147427847 34.4017328738 5.82610643455 0.361032264096 3.80695858122 41.1862406248 -1.59822059052 -0.0180015706855 0.133519461322 41.1665648887 -1.45672718675 1.14690611402 -12.0751361989 48.5765251984 1.00352863645 -0.0685866306118 -10.0910088978 50.3631389159 -0.45339352672 0.0641070797152 4 4 3 5 4 3 43 4 3 5 2 6 3 4 4 4 4 4 4 4 3 4 4 3 5 6 2 5 3 3 5 0 160.0 0.4 64.0 0.6875 0.14296875 0.2203125 0.0203786621094 0.265491943359 0.0302990722656 0.00417378743822 0.00806001900369 0.000403677028414 0.35664921373 0.875 214748364.55 1.0 2.0 4.0 0.0 4294967294.0 4294967293.0 0.0 0.0 5.0 2.0 0.047619047619 3.0 2.0 1.0 0.4 0.0 0.0 0.5 0.7 0.0 0.1 0.9 1.0 0.1 0.2 1.0 0.9 0.4 0.2 1.0 0.7 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 -6.93915551881 -4.77464829276 -11.0846279012 -7.60440382479 6.94647664619 6.16789066458 3.57054285242 15.3112756507 -5.10774367315 2.32635188768 -4.78808627576 28.802789004 4.08084315462 -1.84633194516 4.83297986331 20.7827021936 -2.28347247583 0.440094243017 0.815928510957 16.3668848162 0.89939457405 -1.02185185159 1.3677766519 12.5761086632 0.111388426372 0.255021200438 3 2 5 5 1 14 1 5 2 1 3 4 6 3 7 3 7 3 7 3 7 3 7 3 8 3 5 6 4 6 3 0 140.0 0.714285714286 64.0 0.65625 0.169285714286 0.194387755102 0.038152696793 0.124292638484 0.0342868075802 0.00945233533723 0.0100641939296 0.000564037064755 0.0844418357165 0.4 0.142857142857 1.0 1.0 2.0 0.0 1.0 1.0 0.0 0.0 0.0 2.0 0.272727272727 0.0 4.0 1.0 0.457142857143 0.666666666667 0.416666666667 0.333333333333 0.333333333333 0.916666666667 1.0 1.0 0.916666666667 0.666666666667 0.5 0.333333333333 0.583333333333 0.583333333333 0.0833333333333 0.0 0.0833333333333 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -7.86680147283 4.77464829276 -14.4181033159 13.2592426292 6.04371176027 2.76317109654 0.997131875181 24.2323862195 -2.71355058712 0.870584262102 -3.4994568063 29.5079485445 0.775309299112 0.245351300883 -2.22502411346 31.6256298456 1.0446085102 0.440781130037 7.51176965137 35.165396104 -0.312317879916 0.282082920451 5.5357594816 37.7785607546 -0.100505599946 -0.032610135315 12 1 11 5 11 5 11 5 12 4 12 4 13 3 13 3 12 4 10 6 6 10 4 4 4 4 4 3 6 3 3 4 6 3 4 2 7 3 3 3 7 3 3 3 7 3 3 4 6 3 4 3 6 3 4 4 5 3 5 14 3 12 12 1 4 0 368.0 0.695652173913 135.0 0.733333333333 0.182914402174 0.202268431002 0.0565706154134 0.140429157763 0.0576604493713 0.015288373659 0.0187147192125 0.012179618083 0.0885368125324 0.625 0.391304347826 2.0 4.0 4.0 0.0 0.0 0.0 5.0 3.0 2.0 11.0 0.16 0.0 2.0 2.0 0.366847826087 0.0 0.0416666666667 0.666666666667 0.75 0.0 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.375 0.208333333333 0.166666666667 0.875 0.916666666667 0.833333333333 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.29026368335 -6.36619772368 -12.2413576506 -16.1292727023 -1.05730054576 0.461388440268 -5.4252187289 -4.16494244394 8.04102056533 9.36319680625 21.0760439775 37.5479554207 -5.89726996574 -1.65034160765 2.94925161891 41.3280349099 1.99058942845 -0.329830159143 -0.492416471863 24.9411966212 -1.25691362336 -2.74328300444 -1.44204571611 4.61811646761 0.177215123293 0.223848382754 9 1 9 8 6 10 4 4 3 4 3 4 5 4 1 4 7 8 7 8 7 4 1 3 7 4 1 3 7 4 1 4 6 3 3 3 5 3 5 9 7 6 5 0 210.0 1.07142857143 101.0 0.663366336634 0.230476190476 0.227551020408 0.104809847749 0.0849831551668 0.0551966310334 0.0342795752483 0.00868654487779 0.0110096423283 -0.00248694467025 0.466666666667 0.642857142857 0.0 2.0 3.0 0.0 0.0 3.0 3.0 2.0 2.0 9.0 0.216216216216 0.0 2.0 2.0 0.480952380952 0.1875 0.8125 0.875 0.5625 0.625 0.4375 0.25 0.5625 0.625 0.0625 0.0 0.25 0.75 0.6875 0.5 0.625 0.0 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.07436654315 5.64469531499 -16.3412179547 16.2179917364 -9.68793822483 3.95609673655 -49.4551755466 30.3701703712 0.175046858891 -0.303142092628 -52.4092849557 27.4429066779 1.52403649731 -2.12888500397 -43.7128103699 12.4592520682 -2.06908905733 0.0248861621384 -55.2137351059 11.7899303024 0.0771482062271 1.48343365771 -58.1394344661 26.4881804989 0.0313462654203 0.17183577827 6 2 9 8 4 11 3 3 4 4 2 3 6 4 1 3 6 4 1 3 7 3 1 2 8 7 7 3 1 3 7 3 1 4 6 2 3 3 5 3 3 4 3 4 4 1 1 5 5 0 196.0 1.0 92.0 0.728260869565 0.205174927114 0.216472303207 0.0890725537404 0.0904262892162 0.0476302922252 0.0294980760835 0.00838952110279 0.0114590087557 0.0159243199747 0.571428571429 0.785714285714 1.0 3.0 3.0 0.0 0.0 3.0 3.0 3.0 5.0 14.0 0.125 0.0 2.0 3.0 0.469387755102 0.4375 0.75 0.6875 0.8125 0.625 0.0625 0.0 0.25 0.75 0.25 0.0 0.1875 0.5 0.875 0.75 0.6875 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.75 0.25 0.75 1.0 0.75 0.5 0.5 0.25 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 -0.500201249717 4.86559397452 -8.58559375197 13.4110527097 -10.9362182325 2.79565169717 -45.4022182231 25.4775224818 0.226691865453 1.724644137 -47.8619261061 34.704558204 3.20767542126 0.145867455397 -25.5215048626 35.8735327949 -0.333769506626 -0.339762345714 -22.1787298928 32.7149127263 -0.252254488892 0.0414398682522 -27.16008609 31.7213018028 -0.169396175927 -0.003326368913 2 7 4 9 4 3 1 6 3 2 4 4 10 3 10 3 9 4 7 6 3 4 3 3 3 3 4 3 3 3 3 6 1 3 2 7 1 13 1 1 1 1 5 1 1 1 1 0 182.0 0.928571428571 96.0 0.59375 0.225274725275 0.257456828885 0.0739062742595 0.117362531201 0.0567823071748 0.0157936254947 0.0101235111523 0.0108925630253 0.0246285649106 0.846153846154 0.642857142857 3.0 6.0 2.0 0.0 1.0 1.0 2.0 2.0 7.0 16.0 0.186046511628 0.0 3.0 2.0 0.527472527473 0.6875 0.125 0.4375 0.8125 0.75 0.125 0.3125 0.4375 0.875 0.875 0.875 0.9375 0.125 0.25 0.25 0.6875 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.25 0.75 0.5 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.00080499887 -2.1826963624 -7.39685686622 -4.46820706138 -3.44572771837 1.2528231672 -16.9315041058 -0.244999655536 1.76172694519 -0.0545446821092 -12.0067012894 -2.4807828216 -0.342105375772 -2.17036056578 -8.78538905639 -15.312314916 0.59605177336 0.0134741319505 -7.53450094705 -20.1106725838 -0.822924880403 -0.397250151196 -14.0524282587 -21.9616865136 -0.167179557971 0.0446827851155 1 8 5 1 2 11 5 5 4 6 4 8 4 5 3 10 2 5 3 11 2 4 4 11 2 3 4 12 1 4 3 18 3 17 4 17 3 18 3 17 4 17 4 18 3 17 5 11 2 4 4 10 3 4 4 9 4 5 4 6 5 6 5 4 6 9 7 2 2 13 1 12 0 462.0 0.954545454545 124.0 0.983870967742 0.10224695939 0.130952380952 0.048490430005 0.0769965535735 0.0326694366583 0.025194271307 0.0160005438911 0.0111403271588 0.0458490841009 0.666666666667 0.590909090909 2.0 5.0 4.0 3.0 5.0 2.0 1.0 5.0 1.0 10.0 0.31914893617 4.0 2.0 1.0 0.268398268398 0.194444444444 0.555555555556 0.611111111111 0.611111111111 0.527777777778 0.0833333333333 0.0 0.25 0.166666666667 0.0 0.0 0.444444444444 0.416666666667 0.0833333333333 0.0555555555556 0.361111111111 0.0 0.0 0.111111111111 0.333333333333 0.555555555556 0.777777777778 0.888888888889 0.777777777778 0.0 0.111111111111 0.666666666667 1.0 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.333333333333 0.777777777778 0.888888888889 0.444444444444 0.222222222222 0.0 0.0 0.222222222222 0.777777777778 0.666666666667 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 -21.3556996367 -5.09295817894 -57.1544475014 -8.26096767565 -8.17788558452 6.58502082349 -83.8161960718 18.2149688207 4.5318127597 4.45335593755 -55.0726312882 42.6821610096 5.79148816279 -1.88235301453 -10.8180292625 32.3034558744 -0.155719974581 -1.55327029199 -5.68419345076 16.410754705 -1.46128629129 0.0574136166859 -17.4548331548 11.9364239468 0.331931290186 -0.236840706495 6 3 7 7 4 8 2 6 2 3 1 5 3 25 2 5 7 4 8 4 8 4 8 5 8 5 3 3 2 10 3 8 7 2 4 0 192.0 0.75 107.0 0.523364485981 0.235243055556 0.25 0.0634759973597 0.122775607639 0.0425347222222 0.0149376307072 0.00874208441479 0.00392976359169 0.0445777663174 0.916666666667 0.1875 0.0 2.0 6.0 3.0 1.0 1.0 0.0 1.0 4.0 14.0 0.105263157895 0.0 3.0 1.0 0.557291666667 0.166666666667 0.833333333333 1.0 0.916666666667 0.5 1.0 0.833333333333 0.833333333333 0.833333333333 0.916666666667 0.333333333333 0.25 0.833333333333 0.583333333333 0.25 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 0.75 0.75 1.0 0.5 0.0 1.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 1.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 -12.61302924 8.63415566274 -27.0075622465 22.4660781176 5.06715767059 3.28972023973 -10.4593495912 39.7212598331 1.42271444017 3.64838713343 2.12436382965 51.8323647144 -0.586098134251 -3.47251979888 1.49431246825 31.4896234389 0.838219838977 -1.28847511915 3.84427640513 17.7268648754 -1.16068048124 1.34481758617 -5.20439666659 23.4288157127 -0.0874639963224 -0.410416229609 0 1 2 2 2 13 1 7 1 4 4 3 3 3 5 3 11 2 12 1 6 3 3 2 7 3 2 1 8 2 3 1 10 1 1 2 10 3 11 3 11 2 12 2 12 2 11 2 12 2 11 3 11 2 10 4 9 5 10 3 10 0 308.0 0.636363636364 87.0 1.0 0.111085343228 0.102715466352 0.0300436592207 0.0876541235792 0.019391807383 0.0103415958057 0.00708785906653 0.00132047992572 0.0709532131895 0.857142857143 0.409090909091 4.0 6.0 2.0 0.0 5.0 4.0 0.0 0.0 6.0 7.0 0.3 2.0 4.0 2.0 0.282467532468 0.5 0.166666666667 0.0 0.375 0.333333333333 0.416666666667 0.5 0.541666666667 0.416666666667 0.375 0.291666666667 0.0 0.708333333333 0.0833333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 1.0 0.5 0.333333333333 1.0 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.166666666667 0.166666666667 0.666666666667 0.5 0.5 0.5 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.5 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.166666666667 0.666666666667 0.0 0.166666666667 0.5 0.666666666667 0.333333333333 0.0 0.0 -8.16030799126 6.59769582272 -16.5045604067 16.0845670905 3.48179837186 0.886771643854 -12.6236534763 23.6146891753 -4.63958928808 2.77639997826 -24.4919629021 34.3573024475 1.98608568646 -0.416605818205 -25.4818729792 35.4839175636 -2.03104412903 -0.188022703032 -27.6716375921 27.2228832858 1.90798270087 -1.62428387379 -24.2941257967 14.6290541929 -0.627911152299 0.0388875818853 5 3 1 1 4 9 3 4 1 4 2 4 4 3 1 22 1 4 8 3 9 3 9 4 8 4 8 5 5 1 2 10 4 7 7 1 6 0 180.0 0.8 92.0 0.641304347826 0.201851851852 0.215185185185 0.0605528120713 0.105915466392 0.0337249657064 0.0169392822394 0.00733244610845 0.0033474214817 0.0416677858072 1.0 0.266666666667 0.0 4.0 6.0 2.0 2.0 1.0 0.0 1.0 5.0 12.0 0.184210526316 1.0 4.0 1.0 0.511111111111 0.333333333333 0.833333333333 1.0 0.916666666667 0.75 0.916666666667 0.5 0.833333333333 0.666666666667 0.583333333333 0.0 0.333333333333 0.583333333333 0.5 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 1.0 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.75 1.0 0.5 0.5 1.0 0.5 0.0 0.0 -13.453897856 8.6580289042 -32.0471729226 23.2630876737 0.724897714136 4.14906326311 -29.4213355476 42.1731956473 2.04814465893 2.99536362072 -16.8235574114 55.2946766992 -0.498133897929 -1.3424164761 -16.311398127 47.0335448197 0.1162861437 -0.812071183552 -16.7927643671 42.5424811892 -0.31040567293 2.47019629861 -21.4071259372 63.3692663886 -0.304574042779 0.162365019617 1 2 2 3 6 1 4 2 7 2 4 5 3 2 4 6 2 3 3 6 2 3 3 6 2 3 2 7 2 3 3 6 2 3 3 6 3 2 2 7 2 3 3 6 3 1 4 6 2 2 3 6 3 1 0 182.0 1.07692307692 79.0 0.772151898734 0.204474097331 0.181318681319 0.103174916498 0.0777015370814 0.0482709990167 0.0422895430707 0.0131641773001 0.0146788139927 0.00838604284413 0.285714285714 1.0 1.0 1.0 0.0 1.0 3.0 3.0 3.0 3.0 5.0 5.0 0.0909090909091 1.0 0.0 2.0 0.434065934066 0.75 0.5625 0.5 0.625 0.4375 0.4375 0.375 0.375 0.4375 0.0 0.0 0.0 0.8125 0.5 0.5 0.5625 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.0 0.25 0.5 0.5 0.5 0.25 0.25 0.5 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.54607659004 3.45593590714 -4.59590225344 9.26462139308 -1.22451864379 1.40408996442 -8.26193713369 14.3181761002 0.726519067438 -0.284096355548 -4.20401551089 12.110474401 0.757940345273 -0.795022730708 0.786484326779 5.64684150816 -0.516730752174 -0.318678269089 -2.27313704824 2.84554789516 -0.141194889724 0.588036192364 -3.17876030226 10.0338466015 0.208809029185 0.334984913856 3 2 7 2 5 4 5 4 4 17 2 4 6 3 6 3 5 4 5 4 5 4 5 4 5 4 5 8 1 8 3 5 1 0 153.0 0.529411764706 80.0 0.55 0.19825708061 0.268742791234 0.0319484964305 0.204858362671 0.0547979283986 0.00605919124145 0.0156108355351 0.00625803785643 0.208925574513 0.555555555556 0.0 1.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 5.0 2.0 0.142857142857 0.0 4.0 1.0 0.522875816993 0.466666666667 0.666666666667 0.6 0.533333333333 0.866666666667 1.0 1.0 0.933333333333 0.466666666667 0.6 0.333333333333 0.733333333333 0.2 0.333333333333 0.0 0.533333333333 0.166666666667 0.666666666667 0.833333333333 0.166666666667 0.333333333333 0.5 0.5 0.333333333333 0.333333333333 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.833333333333 0.5 0.5 0.5 0.666666666667 1.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.333333333333 0.833333333333 -9.28715903219 0.224689331424 -16.481487894 1.01358727123 7.57464795716 1.04958684229 1.33931262176 7.25195172107 -4.25777239447 2.443238555 -4.9321240983 19.8709377076 2.62069534364 0.120316940001 0.497882759493 20.0153601812 -0.845878927063 -1.79812533074 1.42289974356 4.9766416422 -0.163746133146 -0.56087056369 -4.23023018583 -4.29082046161 0.0258792883776 -0.0669680159544 4 3 4 3 4 3 4 3 32 1 4 4 2 4 5 2 4 3 5 2 4 2 4 2 5 2 4 4 3 4 3 2 5 0 140.0 0.35 44.0 1.04545454545 0.137755102041 0.162142857143 0.0208582361516 0.24988483965 0.029500728863 0.00477257173241 0.010760052706 0.00132366873132 0.340439915276 0.857142857143 214748364.6 0.0 1.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 0.0 1.0 0.214285714286 2.0 1.0 1.0 0.314285714286 0.0 0.0 0.1 0.2 0.0 0.0 0.4 0.6 0.0 0.0 0.7 0.7 0.4 0.1 0.9 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.80112699842 -1.49605646506 -4.55114591237 -1.08221423812 2.65916078918 3.76775454529 0.962380129464 11.6515560403 -1.79105015208 0.20082369663 -0.274559058996 14.3734393213 1.94999678125 -0.903518496285 3.34799430831 9.00363350109 -1.74333298544 0.336870561388 -0.0622581137326 8.64589738109 1.49577078116 -0.295951886178 3.70844515536 7.96927529642 -0.312770898008 0.0275236700096 7 1 9 12 3 13 3 6 1 7 3 4 4 5 3 3 6 4 3 3 6 4 4 2 6 4 3 3 6 4 3 3 6 4 2 4 5 5 2 4 5 5 2 5 3 13 3 7 3 2 12 0 240.0 1.06666666667 127.0 0.59842519685 0.23125 0.244444444444 0.0961180555556 0.0888078703704 0.0522916666667 0.0264959128387 0.00706528090408 0.0113543260608 -0.00248708187887 0.3125 0.733333333333 2.0 1.0 2.0 0.0 0.0 3.0 3.0 3.0 2.0 8.0 0.184210526316 0.0 1.0 2.0 0.529166666667 0.6875 0.8125 0.6875 0.9375 0.6875 0.4375 0.25 0.3125 0.75 0.25 0.0 0.25 0.75 0.875 0.75 0.9375 0.25 0.75 1.0 0.75 0.5 0.5 0.25 0.25 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -2.02922552442 7.71901473996 -13.6254594709 20.5819153605 -11.8130580563 2.56108901589 -46.0086794393 27.1199720739 6.3490342172 -2.93326086317 -23.7692852475 12.587879316 1.34545624236 -0.718250896813 -4.64730638822 3.7220923892 -0.893403502401 0.336629064779 -11.2488034708 6.16850826 0.0997792904985 0.277087710499 -7.71008554523 9.33299380215 0.516111159966 -0.00272577047257 8 1 9 7 4 10 3 2 3 4 3 3 5 1 4 3 10 3 9 4 9 4 8 5 8 5 9 3 10 4 9 3 10 4 9 3 10 3 10 3 10 3 10 4 8 7 9 3 7 0 286.0 0.590909090909 92.0 0.760869565217 0.0968262506724 0.143356643357 0.0213317661848 0.12151243055 0.0169032151281 0.0073857296785 0.00632340445825 -0.000100386264089 0.116084094001 0.461538461538 0.0909090909091 1.0 4.0 1.0 0.0 2.0 0.0 0.0 0.0 1.0 6.0 0.34375 0.0 3.0 1.0 0.321678321678 0.25 0.75 0.791666666667 0.791666666667 0.5 0.5 0.375 0.416666666667 0.458333333333 0.0 0.0 0.0416666666667 0.458333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.666666666667 0.5 0.5 0.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.5 0.666666666667 0.5 0.5 0.5 0.333333333333 0.333333333333 0.166666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -16.3206159825 8.2471197784 -29.8091000681 21.3744453133 13.4328685177 2.56076835746 9.62584984228 33.2238941452 -2.52845481761 1.77209281756 9.40728732425 42.0639310503 -1.79125286951 0.386293631699 -2.40014823946 43.9956505205 2.82732133589 -0.683576035677 14.3855073047 38.0381540349 -0.701171633311 -0.197589902713 15.1937762439 33.6932650561 0.0264112227147 -0.0887961406755 1 3 2 14 1 5 2 1 2 4 7 2 9 1 9 2 7 3 7 3 7 3 7 3 6 5 4 6 5 1 8 0 140.0 0.714285714286 56.0 0.767857142857 0.14 0.153571428571 0.0345714285714 0.105706632653 0.0224795918367 0.0106416994303 0.00742881965883 -0.000674743560102 0.0720685671067 0.5 0.142857142857 2.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 3.0 5.0 0.217391304348 0.0 4.0 1.0 0.4 0.75 0.25 0.25 0.583333333333 0.916666666667 0.666666666667 0.916666666667 1.0 0.583333333333 0.166666666667 0.333333333333 0.5 0.583333333333 0.0 0.0 0.0 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.75 0.25 0.0 0.25 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.25 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -7.73038295018 4.09255567951 -14.6726311251 13.1064610195 5.28505773124 4.91941896986 -0.979024435977 30.8258314398 -1.95631699252 0.425732607338 -2.01082402353 34.3449529533 1.04250755792 -0.741578377984 0.481903976205 29.7763138842 0.222164434318 0.617282662718 4.46405967851 32.5634258418 -0.242390496152 0.10588210703 2.73229446963 34.3043524722 0.071716745062 -0.0240123091543 1 3 1 5 1 3 5 14 4 8 2 5 3 8 4 4 2 7 6 3 3 6 6 4 2 6 7 3 3 5 7 3 3 5 7 2 4 6 5 3 5 5 5 3 4 6 4 3 5 9 1 1 8 4 14 4 13 5 11 8 9 9 10 8 9 10 9 9 10 3 13 0 396.0 0.818181818182 190.0 0.521052631579 0.185606060606 0.20121671258 0.0545797448776 0.104612260628 0.0307136157257 0.0176196335936 0.00263535458248 0.000956151158551 0.0457187828542 0.722222222222 0.590909090909 5.0 0.0 4.0 2.0 5.0 5.0 2.0 0.0 7.0 15.0 0.155172413793 3.0 3.0 2.0 0.479797979798 0.733333333333 0.433333333333 0.3 0.8 0.9 0.866666666667 0.9 0.966666666667 0.433333333333 0.0666666666667 0.2 0.233333333333 0.633333333333 0.5 0.233333333333 0.0 0.666666666667 0.666666666667 0.444444444444 0.111111111111 0.0 0.0 0.0 0.222222222222 0.888888888889 1.0 1.0 0.777777777778 0.555555555556 0.555555555556 0.444444444444 0.666666666667 0.888888888889 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.888888888889 0.666666666667 0.666666666667 0.888888888889 1.0 0.777777777778 0.777777777778 0.666666666667 0.222222222222 0.0 0.0 0.222222222222 0.555555555556 0.333333333333 0.111111111111 0.777777777778 0.222222222222 0.0 0.0 0.0 0.222222222222 0.222222222222 0.0 0.888888888889 0.666666666667 0.222222222222 0.0 0.222222222222 0.444444444444 0.111111111111 0.0 0.333333333333 0.888888888889 0.888888888889 0.666666666667 0.888888888889 0.555555555556 0.0 0.0 -19.1854049582 12.703458185 -39.1353656711 34.1242084035 9.1521864683 5.45897867541 -18.494021821 55.350509988 -5.3066217457 0.608227023052 -29.2291320029 57.0827299766 0.55739266608 -1.58410845542 -36.0467187308 43.8101569446 -0.273457078895 -1.0952342979 -34.1604791285 30.7914207675 -0.396759557476 -0.681583474605 -41.2785909709 20.5090851288 -0.229878215288 -0.171702770821 3 1 4 5 2 5 2 5 4 1 33 3 2 5 3 5 3 3 4 4 4 2 5 2 5 2 5 2 4 3 4 4 2 6 1 6 154.0 0.318181818182 64.0 0.90625 0.186456400742 0.222550177096 0.0203514860919 0.34762766328 0.0622737020106 0.00276142872667 0.0333536785859 0.00648355946543 0.546630150634 1.28571428571 195225786.0 0.0 2.0 1.0 3.0 0.0 4294967292.0 0.0 0.0 0.0 1.0 0.157894736842 1.0 7.0 1.0 0.415584415584 0.25 0.166666666667 0.25 0.0833333333333 0.5 0.25 0.5 0.333333333333 0.666666666667 0.333333333333 0.833333333333 0.75 0.666666666667 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.12522433708 -1.70729848044 -5.22788302343 -0.258644292206 2.5118022048 5.8519634391 -2.03557028794 20.5773407517 -3.02614766491 1.43265068567 -6.85068507064 32.1917472912 3.07993324026 0.0231794964775 0.0119138897738 33.1910879178 -2.59213154252 0.428530847407 -6.53950077797 34.6382221893 1.62556552073 -0.50000678515 -4.15825666325 28.8441160353 -0.343252913201 -0.262356181575 6 5 7 2 1 3 4 4 3 4 2 4 3 4 1 12 1 10 2 4 9 4 9 4 10 4 9 5 9 4 2 1 1 2 4 9 6 6 2 0 182.0 0.928571428571 91.0 0.648351648352 0.218512256974 0.226059654631 0.0762099722521 0.0997782557981 0.0437380817468 0.0214883642993 0.010597774517 0.0043252919386 0.02114572127 0.846153846154 0.357142857143 0.0 2.0 6.0 3.0 2.0 1.0 0.0 2.0 4.0 9.0 0.0714285714286 0.0 3.0 3.0 0.5 0.25 0.75 0.9375 0.5625 0.5625 0.75 0.3125 0.75 0.5625 0.5625 0.0 0.3125 0.75 0.625 0.0 0.3125 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.0 -9.73118794905 4.54728408834 -22.3329138747 11.9834534873 1.81288152379 2.30333859332 -15.8735208603 25.8731729226 1.64164815326 4.77503654483 -5.69066850305 48.7033626941 -0.78062434492 -0.198018705492 -7.71418062317 48.5026893572 0.286620267544 -2.12191519149 -6.88163007042 30.6250971766 0.00399318189259 -0.154965126195 -8.20578422459 21.4798706893 -0.280860928763 -0.361405560263 3 5 4 7 1 9 1 3 1 15 1 8 3 8 2 8 3 8 6 6 5 6 4 6 3 3 1 4 1 4 1 0 140.0 0.714285714286 100.0 0.37 0.325714285714 0.318367346939 0.0680991253644 0.134935860058 0.0421195335277 0.00633848795001 -0.00113139437837 0.00186725234151 0.00843412554082 0.9 0.357142857143 2.0 3.0 2.0 1.0 0.0 1.0 0.0 3.0 2.0 7.0 0.107142857143 1.0 1.0 1.0 0.714285714286 0.583333333333 0.916666666667 0.416666666667 0.666666666667 0.833333333333 0.916666666667 0.75 0.166666666667 1.0 1.0 0.833333333333 0.166666666667 0.916666666667 0.916666666667 1.0 0.833333333333 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.25 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 -5.18390386071 7.45754590488 -13.8102031876 16.9203546644 -1.67878304404 -0.928017160886 -17.9326126884 18.7330788835 2.06264124439 3.12590270213 -7.70501248501 30.6907016881 0.625689867628 0.202088588332 0.932547849028 35.7011581729 0.766033344634 -0.0854241535904 8.25658483893 34.4082844693 0.472099832714 0.277953498516 13.1879973541 36.0217288016 -0.0794613045066 -0.0195608761424 1 2 1 1 4 5 2 6 3 5 5 3 5 3 5 4 4 3 5 3 5 3 5 4 4 4 4 3 5 3 5 3 5 4 4 3 5 3 5 4 3 5 2 14 1 0 176.0 0.363636363636 88.0 0.613636363636 0.235085227273 0.250258264463 0.0262943671934 0.307399093433 0.064198712493 0.00235276116947 0.0195362818108 0.00430574191881 0.418269013248 0.75 0.0454545454545 2.0 1.0 0.0 3.0 1.0 0.0 0.0 0.0 4.0 3.0 0.0909090909091 0.0 2.0 1.0 0.5 0.416666666667 0.0 0.0 0.0833333333333 0.666666666667 0.0 0.0 0.25 0.75 0.5 0.5 0.666666666667 0.916666666667 1.0 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -3.18309886184 -0.115749049521 -7.18793215266 1.0636676804 0.371879694227 2.36233287432 -8.11531827568 11.7856581663 -1.02804264332 2.52349292995 -9.17249910452 25.7637421545 1.34600767504 0.302402249504 -4.24339944465 29.2341415334 -0.551677087569 -0.654417370161 -2.91942742481 21.1726887646 0.740386524211 -1.05456167081 0.15504696735 10.7848503345 -0.0864601705657 -0.0545214524316 9 1 7 3 2 2 1 4 3 7 3 4 4 4 5 3 4 4 5 3 5 2 6 3 5 2 7 3 4 2 6 4 3 3 6 4 3 3 6 4 3 3 6 4 3 3 6 4 2 5 4 6 1 1 14 0 224.0 1.14285714286 91.0 0.945054945055 0.198102678571 0.1875 0.105061255808 0.0717175542092 0.0579211176658 0.0422177287558 0.013675571653 0.0190437495589 0.00321302403514 0.25 0.928571428571 2.0 1.0 1.0 0.0 3.0 3.0 3.0 3.0 1.0 4.0 0.272727272727 2.0 1.0 2.0 0.40625 0.5625 0.375 0.375 0.5625 0.5625 0.625 0.5 0.5625 0.3125 0.0 0.0 0.0 0.625 0.4375 0.4375 0.5625 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -0.517253565049 5.4510568009 -5.87854222057 14.0230581406 -6.32236794443 1.08393220032 -23.4136817381 16.2299178038 3.27421176398 -2.23863608873 -11.6372177183 3.16767262864 0.794009282314 -1.44939424052 -3.79988912381 -9.00571527749 -1.607698788 0.018640982817 -13.7183661656 -10.3263022636 0.429261379951 0.244452073605 -14.9600597368 -7.79104752551 -0.153111440578 -0.0300334947568 2 4 2 5 2 5 2 5 4 2 30 6 1 5 3 4 4 4 3 3 4 4 3 4 3 3 4 3 3 4 3 5 1 13 4 3 1 0 161.0 0.304347826087 82.0 0.69512195122 0.215616681455 0.266540642722 0.0201472175011 0.382788506214 0.0549864722745 0.00204553647219 0.0181733088827 0.00307257545915 0.638132622417 1.42857142857 186737708.348 1.0 2.0 1.0 4.0 0.0 4294967292.0 0.0 0.0 0.0 4.0 0.136363636364 1.0 6.0 1.0 0.509316770186 0.25 0.333333333333 0.25 0.333333333333 0.583333333333 0.333333333333 0.666666666667 0.75 0.75 0.333333333333 1.0 1.0 0.833333333333 0.333333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -4.59473400926 -2.82327029485 -7.66563790534 -1.3630639942 3.98558406351 8.23341340517 -0.610610564227 27.582614257 -3.6335562448 1.55768619935 -6.15190330165 39.8574782405 3.39181788481 -1.43231249377 1.3895549655 30.6287273736 -2.60592309022 -0.0135003016034 -5.51298693344 27.2972733739 1.16781371013 -0.121820073303 -6.74925182364 23.8321365133 -0.257796701043 -0.263497963365 1 7 6 8 4 3 4 3 3 2 5 4 9 4 8 5 8 5 3 4 2 3 4 3 3 3 4 2 4 5 1 4 2 7 1 3 2 6 2 4 2 4 2 0 169.0 1.0 89.0 0.674157303371 0.237596722804 0.261265361857 0.0850694527171 0.109955459186 0.0613792673379 0.0186427663434 0.00921081312416 0.0103423384869 0.00805225602798 0.769230769231 0.615384615385 3.0 4.0 2.0 1.0 1.0 1.0 2.0 3.0 3.0 10.0 0.0606060606061 1.0 1.0 1.0 0.526627218935 0.6875 0.125 0.5 0.75 0.5 0.125 0.25 0.375 0.6875 0.875 0.8125 0.875 0.1875 0.5 0.4375 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.25 1.0 0.5 0.0 0.0 0.25 0.5 0.25 0.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.0979415034412 -2.64442059291 -4.29105197877 -6.50197154239 -5.68060719959 0.0521581970988 -21.7653540885 -4.93816145678 0.911335041841 1.44690130788 -24.1467276564 1.41409905809 -1.07220228149 -0.596854181821 -25.9437779209 -0.187413128632 0.502818084484 -0.24299985598 -24.9791320211 -5.79806466415 -0.0904393585032 -1.12380830149 -22.4503941526 -18.2171788854 0.130361716725 -0.313664889963 2 1 7 1 3 5 3 5 1 5 4 4 2 4 4 4 2 4 5 3 2 3 6 3 2 3 6 2 3 3 6 3 2 3 5 4 2 4 4 4 2 4 4 4 3 4 2 6 2 12 3 3 4 2 2 0 196.0 1.0 103.0 0.679611650485 0.246355685131 0.258381924198 0.101168518219 0.103298131518 0.0625956234222 0.0293653628658 0.0105810449144 0.0102338261082 0.000408348042004 0.285714285714 0.928571428571 0.0 1.0 2.0 1.0 3.0 3.0 3.0 2.0 6.0 4.0 0.216216216216 0.0 1.0 2.0 0.525510204082 0.75 0.75 0.75 0.625 0.375 0.375 0.3125 0.6875 0.25 0.0625 0.125 0.5 0.8125 0.75 0.8125 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.86478897565 -2.04627783975 -12.0248372115 -2.12599271053 -7.09793925503 4.17468519824 -32.9525824104 12.0220307885 2.73146700006 0.432692736044 -25.0914660154 16.8671919671 0.00996908230736 -0.613609072801 -21.2393193677 13.2233352877 -1.19322120706 0.529588526532 -29.3566753628 17.6491073123 0.46409331893 0.776935559551 -27.6319890016 24.66870898 -0.0274355345549 -0.103630697044 3 2 6 2 3 6 1 7 2 7 4 4 3 5 4 4 3 4 5 4 4 3 6 2 4 4 6 3 3 4 6 2 5 3 6 2 4 4 6 2 4 4 6 3 2 5 5 12 3 12 4 2 1 1 3 2 2 1 5 1 4 0 240.0 1.06666666667 117.0 0.709401709402 0.2140625 0.223888888889 0.0958446180556 0.0889441550926 0.0489661458333 0.0346873482601 0.00822698259497 0.0110562141128 0.00659315661995 0.5625 1.13333333333 4.0 1.0 2.0 2.0 3.0 3.0 3.0 4.0 2.0 8.0 0.181818181818 0.0 1.0 2.0 0.4875 0.6875 0.4375 0.4375 0.6875 0.8125 0.8125 0.75 0.8125 0.3125 0.0625 0.0 0.0625 0.625 0.375 0.25 0.4375 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.25 0.25 0.5 0.25 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.09823978462 4.69507082121 -10.4942437702 13.7370674489 -0.708892280705 3.61238201889 -11.5357150241 26.2889794827 1.90652375628 -0.491960615642 -0.845448057757 23.1365575202 0.79968577427 -1.67373771856 5.2494111233 10.7129758643 -0.846273590596 -0.229948080295 -0.495590502375 5.55803180874 -0.182743317307 -0.183564357204 -3.01728946232 3.05859264781 0.131844598902 -0.0725252699113 3 3 1 3 4 2 5 3 1 2 6 3 1 2 3 2 1 17 10 2 10 2 11 1 23 4 5 1 3 8 6 5 3 0 156.0 0.923076923077 60.0 1.05 0.167735042735 0.160749506903 0.0714979601814 0.0850897267317 0.0376734267267 0.0281523059447 0.0134357310912 0.00727517794752 0.0358172514082 1.25 0.384615384615 2.0 6.0 5.0 2.0 3.0 2.0 0.0 0.0 0.0 11.0 0.09375 5.0 3.0 1.0 0.384615384615 0.416666666667 0.75 0.416666666667 0.25 0.5 0.333333333333 0.0 0.583333333333 0.25 0.333333333333 0.0 0.583333333333 0.333333333333 0.416666666667 0.0 0.5 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.75 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.25 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 0.0 -4.16251389625 0.293824510324 -11.1601112099 0.728804342974 -1.73194191144 0.45377631476 -17.7171467015 5.51765195425 -0.00269706916622 2.93864632014 -17.2224942178 20.277337655 0.582794839951 0.301467374726 -12.3891603287 22.0139516224 0.221089830754 -1.7979337271 -10.6960502543 9.84018058945 -0.66518219302 0.806640261473 -18.302592201 16.0925288912 -0.280228651586 0.410086879002 3 1 4 2 2 3 2 5 1 9 2 5 1 3 2 5 7 3 8 3 8 3 8 3 8 3 8 3 8 4 6 6 5 5 5 1 10 0 165.0 0.733333333333 67.0 0.776119402985 0.148209366391 0.161616161616 0.0375554999026 0.0984500653922 0.0244950886273 0.0112416263986 0.00595074081562 -0.000369582399133 0.061113055623 0.272727272727 0.2 1.0 0.0 2.0 0.0 2.0 1.0 0.0 0.0 3.0 8.0 0.08 1.0 3.0 1.0 0.406060606061 0.5 0.5 0.333333333333 0.416666666667 0.75 1.0 1.0 1.0 0.5 0.5 0.333333333333 0.583333333333 0.75 0.166666666667 0.0 0.0833333333333 0.25 0.5 0.5 0.5 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -10.1010337216 6.53596299631 -19.3396274139 17.458659575 6.84267225553 2.35181491019 -0.797714239852 24.4578566129 -2.1911121689 -1.86278193989 -3.2523828097 14.3135485008 -0.0896524582912 -1.06973363608 -5.52778662947 5.26822862629 1.45151817492 0.403067747325 4.85243938245 5.9199677885 -0.461860607933 -0.331064522959 3.97602411721 2.75971895727 0.00531327506692 -0.182180082299 3 6 4 3 3 1 3 3 4 2 1 4 1 5 1 10 1 4 2 1 4 3 8 3 8 4 7 4 8 4 5 1 2 9 2 8 1 0 143.0 0.846153846154 75.0 0.626666666667 0.195168467896 0.2463690156 0.0602433411862 0.122212278406 0.0442926920016 0.0175918543804 0.0129910896756 0.00775973839534 0.0569705238463 1.0 0.384615384615 0.0 1.0 4.0 2.0 2.0 2.0 0.0 1.0 5.0 9.0 0.171428571429 0.0 3.0 1.0 0.524475524476 0.5 1.0 1.0 0.583333333333 0.75 0.666666666667 0.5 0.916666666667 0.5 0.5 0.0 0.583333333333 0.666666666667 0.583333333333 0.0 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.75 0.75 0.25 0.0 0.25 0.75 0.25 0.25 0.75 0.5 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.0 -11.3612143992 0.0979415034412 -27.800938563 -0.206529474651 -0.686170059611 -0.133293170364 -31.6281158306 3.3103431775 0.0823146195372 3.61916505109 -31.0259348033 21.6700520115 -1.32684768651 1.02009136277 -37.3390261608 30.115818727 0.360617283753 -1.24055433598 -34.8419100142 20.7610048222 0.641413395688 -0.32317685411 -27.9329897239 14.7939995479 0.00341711114925 -0.00406606323293 0 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 4 1 7 3 3 4 5 3 4 5 3 3 6 3 3 3 6 4 2 3 7 3 2 3 7 3 1 4 7 3 1 5 6 3 2 3 6 3 3 4 5 3 3 3 5 3 4 10 7 1 10 0 330.0 0.681818181818 118.0 0.796610169492 0.14404040404 0.188842975207 0.0460099897042 0.133233408465 0.0591809833876 0.0185199942838 0.0221706451411 0.0181154466258 0.0984656821343 0.466666666667 0.545454545455 1.0 2.0 2.0 1.0 0.0 2.0 5.0 4.0 4.0 7.0 0.0909090909091 1.0 1.0 3.0 0.357575757576 0.708333333333 0.5 0.541666666667 0.583333333333 0.5 0.5 0.5 0.666666666667 0.0 0.166666666667 0.0416666666667 0.166666666667 0.0 0.333333333333 0.458333333333 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -9.14417491219 -8.27605704078 -21.7857289792 -18.1927704967 1.07594002851 3.64262737146 -14.70191529 0.122301676629 3.55513963706 5.69478692642 -0.954840095736 24.6624145723 -3.04415776367 -3.87778000788 -8.58686228826 10.1855091183 2.52291172687 0.446462826219 1.69914812378 1.60221772577 -0.614086577307 -1.00625929222 1.98950945932 -2.75242807874 -0.110055674573 0.208823586468 4 1 3 1 3 8 3 2 3 4 2 1 5 3 9 1 9 2 8 3 6 6 3 4 1 3 2 4 2 3 1 5 2 9 2 4 1 4 2 4 143.0 0.846153846154 72.0 0.777777777778 0.249841068023 0.274341043572 0.0819080181396 0.140501681311 0.0656947336492 0.0182357478638 0.00953636070041 0.00962448694411 0.0348623535617 0.727272727273 0.615384615385 1.0 2.0 2.0 1.0 2.0 1.0 1.0 3.0 5.0 10.0 0.133333333333 1.0 2.0 1.0 0.503496503497 0.416666666667 0.0833333333333 0.25 0.833333333333 0.416666666667 0.0 0.583333333333 1.0 0.416666666667 0.0833333333333 0.583333333333 0.333333333333 0.75 0.666666666667 0.833333333333 0.666666666667 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.75 0.25 0.0 0.0 0.25 0.75 0.75 0.5 1.0 0.75 0.25 0.25 0.75 1.0 0.75 0.75 1.0 1.0 0.75 0.75 1.0 1.0 1.0 -0.489707517206 -3.03618660668 -3.34801103567 -4.85920458059 -3.0193800765 3.78436696728 -12.6010858551 8.71409568635 0.476196452343 1.18196098521 -15.0149618321 17.0796632179 -1.51632392524 -0.46250112355 -23.1506473093 15.1460481959 -0.440078933199 -0.0706453795603 -28.2022647234 9.86767255596 0.291611061686 -1.54172447979 -27.1336041006 -5.72878329847 -0.16300082129 -0.314684755088 6 1 8 8 3 10 1 11 1 11 1 10 1 3 9 3 9 4 9 3 9 3 9 4 5 2 1 11 3 7 6 5 3 0 180.0 0.8 96.0 0.5625 0.23287037037 0.237777777778 0.0676356310014 0.117598765432 0.0439804526749 0.0165954967282 0.00939545767015 0.00377214460483 0.0388162741433 0.75 0.0666666666667 0.0 3.0 3.0 3.0 0.0 0.0 0.0 1.0 3.0 6.0 0.266666666667 0.0 2.0 1.0 0.533333333333 0.25 0.75 0.916666666667 0.666666666667 0.666666666667 0.833333333333 0.5 0.833333333333 0.833333333333 0.75 0.0 0.333333333333 0.833333333333 0.75 0.0 0.25 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.25 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -10.228357676 8.82779417683 -23.3187155039 23.5016313896 2.16677076302 3.95666262079 -15.3466441255 42.4242398089 2.06623618774 3.77732342513 -2.2189692668 61.3527565813 -0.400980804692 0.319993408105 -1.60731684588 65.2256625456 0.172645552667 -0.287979977699 -2.29682499666 65.21697039 -0.507161153793 1.64029224345 -8.27583777141 79.3169959207 -0.249147951082 0.222326151904 2 9 3 3 4 4 2 2 6 7 7 5 9 5 8 5 8 5 8 5 8 6 6 3 1 4 4 2 4 8 6 1 1 2 1 1 4 0 169.0 1.0 77.0 0.688311688312 0.200728265817 0.201183431953 0.0976235024009 0.0901228948566 0.043752508127 0.0399327314855 0.0100654649735 0.0105182124188 0.0171609474053 0.692307692308 0.923076923077 1.0 3.0 3.0 2.0 2.0 3.0 3.0 2.0 2.0 14.0 0.0540540540541 0.0 2.0 2.0 0.455621301775 0.625 0.6875 0.8125 0.625 0.3125 0.0 0.0625 0.625 0.4375 0.0 0.0 0.4375 0.75 0.5625 0.5625 0.375 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.25 0.5 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -0.783532027529 -2.15471307571 -4.32950693228 -2.66561377798 -3.8643428695 4.05211237906 -19.1900160361 12.9773701422 -1.4695923526 1.93543603723 -27.3957702152 23.1871008835 0.930743830787 -1.69188189632 -22.2520603499 13.1910745601 0.056007396718 -0.525967402056 -19.8356607171 7.42832820238 -0.0324421555895 0.735833422377 -17.1345705124 12.0941396834 0.365108236199 -0.126175000227 8 3 11 4 11 4 10 4 11 3 10 4 10 4 7 1 2 3 6 8 4 2 5 4 2 3 6 2 3 3 6 2 2 3 8 2 1 3 8 2 1 3 8 2 1 3 7 3 1 4 6 3 2 4 5 3 2 4 4 5 5 1 5 1 2 0 280.0 0.7 100.0 0.92 0.188775510204 0.186964285714 0.0677077259475 0.128571018586 0.0533154154519 0.0220966395737 0.0163020034378 0.0139623133334 0.0733111208238 0.642857142857 0.6 0.0 3.0 3.0 3.0 0.0 2.0 5.0 5.0 3.0 7.0 0.365853658537 0.0 1.0 2.0 0.357142857143 0.0 0.0 0.55 0.8 0.0 0.2 0.3 0.05 0.3 0.4 0.25 0.0 0.8 0.85 0.65 0.6 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.666666666667 0.0 0.0 0.0 0.166666666667 0.5 0.333333333333 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 -1.14591559026 -2.419155135 -5.45124800006 -8.25118974276 -3.05386504805 -2.35612977753 -9.84772494063 -8.23195584161 4.66702772024 6.66709605909 5.97331259855 17.9664267417 -2.09698709426 -1.80749093728 0.692227502625 17.520943797 -0.16799285512 0.10031759437 -5.63130582796 11.8676724186 0.0431729224737 -0.444815693227 -7.0534610107 5.33536095173 -0.281866821354 -0.432244821344 6 3 6 8 3 2 4 4 1 3 4 4 1 10 2 1 2 3 1 2 2 3 9 3 9 3 9 4 8 4 7 1 1 4 5 2 2 9 6 5 8 3 3 0 180.0 0.8 81.0 0.814814814815 0.194907407407 0.20037037037 0.0652570301783 0.108178840878 0.0436623799726 0.0200519806277 0.0138292890468 0.00771193395583 0.0461834306828 1.16666666667 0.4 1.0 5.0 5.0 3.0 1.0 3.0 0.0 1.0 4.0 10.0 0.243243243243 0.0 3.0 1.0 0.45 0.25 0.666666666667 1.0 0.75 0.5 0.583333333333 0.416666666667 0.833333333333 0.333333333333 0.5 0.0 0.333333333333 0.666666666667 0.5 0.0 0.25 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 0.75 0.75 1.0 1.0 0.25 0.75 1.0 1.0 0.5 0.25 0.5 0.5 0.5 0.75 0.5 0.75 0.75 0.25 0.0 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.75 0.5 0.75 0.75 0.25 0.0 0.0 -9.08244208578 5.85690190578 -21.2242109543 17.5966879071 1.13742732663 5.91575386696 -16.8918840063 43.5954828132 1.801314336 4.56598162228 -5.22279267533 67.1335277201 0.19322233418 -0.628193732715 -0.726095477161 64.8893275091 0.383484801396 -0.772498192464 0.899973960705 60.433752692 -0.696255725436 2.11507805362 -7.25426317457 78.9951719247 -0.343235812121 0.331233607019 3 8 7 9 4 4 5 3 3 3 6 4 1 3 8 3 1 4 7 3 1 4 7 8 7 3 1 4 7 3 1 4 6 3 3 4 4 4 3 5 3 3 7 6 5 0 195.0 1.15384615385 95.0 0.652631578947 0.207179487179 0.220512820513 0.101268598594 0.0801192198115 0.0455963182117 0.0367138050765 0.00785491881188 0.0106429444324 0.00108749824401 0.533333333333 0.769230769231 0.0 3.0 3.0 0.0 1.0 3.0 3.0 3.0 6.0 14.0 0.121951219512 0.0 2.0 2.0 0.487179487179 0.5 0.875 1.0 0.625 0.6875 0.1875 0.25 0.5625 0.5 0.0 0.0 0.375 0.6875 0.5625 0.5625 0.6875 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.07436654315 5.60225399683 -16.3391082967 17.4845652957 -9.42536793649 5.8987773397 -46.5315178594 37.5902529421 2.12430429445 -0.798525541636 -38.4983208723 33.2534747179 2.79313620991 -2.62073122469 -18.4457091067 13.2619695151 -1.16130978379 -0.573342695303 -19.1526236956 4.64842127888 1.43803524941 0.188818817773 -5.83536708375 5.3596926771 0.493358106207 -0.100110839394 1 3 4 2 5 13 2 6 3 4 2 5 5 3 3 3 6 4 2 3 6 3 3 3 6 4 2 3 6 3 3 3 7 3 2 3 7 3 2 3 6 4 2 3 5 5 1 5 4 6 2 3 4 6 210.0 1.07142857143 109.0 0.596330275229 0.233968253968 0.240816326531 0.10717643883 0.0949893100097 0.0610262390671 0.034457050625 0.0129666745137 0.0161902224146 0.000699215338789 0.4 0.928571428571 1.0 1.0 1.0 2.0 2.0 3.0 3.0 3.0 2.0 4.0 0.236842105263 0.0 1.0 2.0 0.519047619048 0.9375 0.8125 0.75 0.8125 0.625 0.3125 0.25 0.3125 0.4375 0.0 0.0 0.125 0.75 0.75 0.625 0.8125 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.29183118052 2.97089227105 -13.2841977326 8.48260435163 -11.3052353888 2.02699735522 -50.3338537881 15.761266373 1.08516477307 -0.294502926532 -51.2557148102 12.2205271731 1.33630328685 -2.02272402098 -41.6699217191 -2.06519396117 -1.95794411499 -0.593247200151 -53.8722548343 -10.0775102063 -0.363258173953 0.00586911986348 -62.1588583125 -10.175825851 -0.160166644133 0.0827455497142 1 7 4 2 4 3 5 1 5 3 4 1 4 5 3 2 3 5 3 2 3 5 3 2 3 5 3 2 3 5 3 2 3 5 3 2 3 5 3 2 4 4 3 2 12 2 6 1 4 3 3 3 2 2 0 182.0 0.928571428571 99.0 0.636363636364 0.254860524091 0.262558869702 0.0945280869354 0.112059945247 0.0583105307927 0.0243864535055 0.00960190643953 0.00746083589097 0.00626583457083 0.230769230769 0.857142857143 0.0 1.0 2.0 0.0 2.0 3.0 3.0 2.0 5.0 3.0 0.0909090909091 0.0 1.0 2.0 0.543956043956 0.75 0.8125 0.75 0.6875 0.25 0.25 0.25 0.6875 0.5625 0.25 0.25 0.5625 0.6875 0.75 0.75 0.875 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.54728408834 -1.9098593171 -15.4175125879 -2.01493838452 -6.0311835286 3.97423349149 -32.2431407474 12.1660674622 3.40831347548 0.873922283013 -20.5203594578 17.7354712664 -0.367304897155 -1.27791184396 -18.5681987813 10.7972970353 -1.28136288535 0.359103757906 -27.8293553556 10.4735199715 0.460371632885 -0.274129446499 -28.6492781765 6.09053764554 -0.295384730971 -0.356784593963 4 1 5 7 2 2 2 3 1 2 5 1 1 3 6 4 5 7 3 8 3 6 5 4 6 3 6 3 5 3 5 2 3 0 126.0 0.642857142857 59.0 0.830508474576 0.224867724868 0.206916099773 0.0592673577367 0.121545649418 0.0659680979976 0.0135111428007 0.0211053517027 0.0127054888925 0.0554489417674 0.888888888889 0.142857142857 0.0 2.0 4.0 2.0 1.0 1.0 0.0 0.0 1.0 8.0 0.32 1.0 2.0 1.0 0.468253968254 0.5 0.916666666667 0.416666666667 0.0 0.416666666667 0.5 0.666666666667 0.0 0.5 0.25 0.916666666667 0.5 0.416666666667 0.166666666667 0.833333333333 0.916666666667 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.5 1.0 0.75 0.75 1.0 1.0 1.0 0.5 0.5 0.75 0.25 0.25 0.75 1.0 1.0 0.75 0.75 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.75 0.25 0.0 0.25 0.75 1.0 0.25 0.5 0.5 0.25 0.0 0.0 0.5 1.0 -2.91026181654 5.18390386071 -7.80664412862 15.1698772106 -0.983698190539 4.132924426 -10.0778593199 30.5505433761 1.21627065453 0.40066193965 -5.07623680924 32.1145967288 -0.350561188114 -1.40031659727 -5.23505673871 22.6645935124 -0.0491952349395 -0.135265112466 -5.60146030665 16.852908245 0.355179927574 -0.817188444511 -2.79234516649 7.54675072098 -0.0307996437379 -0.295397240699 8 2 7 5 4 7 3 3 2 2 4 2 8 3 8 3 8 3 8 3 7 6 4 8 4 6 6 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 6 6 5 6 5 0 242.0 0.5 89.0 0.696629213483 0.131480090158 0.176183320811 0.0228775639111 0.169836093705 0.0266612326643 0.00585780432197 0.00851840523615 -9.83158128924e-05 0.181229708248 0.545454545455 0.0454545454545 2.0 0.0 3.0 0.0 1.0 0.0 0.0 0.0 2.0 6.0 0.241379310345 0.0 2.0 1.0 0.367768595041 0.0555555555556 0.5 0.5 0.444444444444 0.444444444444 1.0 1.0 1.0 0.444444444444 0.555555555556 0.555555555556 0.388888888889 0.444444444444 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.5 0.5 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -10.8225361302 3.55928327278 -17.2480431012 8.03652557044 11.3112410532 -0.175237843051 9.09450345209 11.2305872788 -7.20267997894 2.08282250871 -5.94491845956 15.8657509996 3.49351250564 -1.71705746355 0.336651311282 13.4940484132 -0.432690576508 1.87731348207 6.47550395503 18.0333235258 -0.254057150412 -1.1909672159 2.14409783136 20.017492388 0.190658516433 0.566743064431 1 3 2 2 6 1 14 2 5 2 5 2 5 2 4 1 6 1 5 2 4 3 0 77.0 0.636363636364 56.0 0.321428571429 0.313543599258 0.327036599764 0.052973169519 0.146823997389 0.030365822405 0.00424548281117 -0.00978432086015 -0.00320069250517 0.0456453282681 0.285714285714 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.176470588235 0.0 3.0 1.0 0.727272727273 0.666666666667 0.666666666667 0.0 0.333333333333 0.666666666667 0.833333333333 0.5 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 -4.51421293133 4.28271483229 -10.6384605852 10.4387556395 0.373075448871 0.227671684183 -9.5206095004 11.941427228 0.602067404296 0.054890079286 -4.76985159208 11.513847167 0.403381903813 0.0746055505253 -0.762928462837 10.7449576685 0.344153651051 -0.5412142993 2.1533363365 5.79716323224 -0.099447434448 -0.4276856513 2.15181488962 0.0516467143448 0.0212872363136 -0.0939432280291 3 9 5 4 2 5 3 4 5 4 2 3 7 3 1 4 7 8 7 8 7 8 7 4 1 4 6 3 1 5 6 3 2 5 4 3 4 11 4 10 9 1 14 1 8 0 225.0 1.0 110.0 0.609090909091 0.220148148148 0.205925925926 0.0942903484225 0.0787796982167 0.0452336899863 0.0317864849448 0.00744431950414 0.00792193020983 0.000571104486105 0.533333333333 0.666666666667 1.0 2.0 3.0 0.0 2.0 3.0 3.0 0.0 4.0 13.0 0.162790697674 0.0 3.0 2.0 0.488888888889 0.5625 0.9375 0.9375 0.6875 0.625 0.25 0.375 0.8125 0.375 0.0 0.0 0.5 0.75 0.5 0.5 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -3.14065754368 1.78253536263 -11.249511195 10.0073350939 -5.24914222976 8.29133591532 -27.7114940797 36.7422491601 1.50189031243 -1.41161710474 -22.575901185 32.5983090363 0.882048826195 -2.25539628346 -15.1060663508 16.4089104434 -0.683312218776 0.7436697755 -16.0916741903 14.5005386972 1.16596017159 -1.59867962571 -5.58369789986 -0.515068429796 0.281145200044 -0.40417222447 2 4 10 6 10 6 10 6 11 5 12 4 13 3 12 4 12 4 13 4 1 2 1 1 7 4 2 5 4 5 4 3 4 4 6 2 4 4 6 2 4 3 7 2 5 1 7 4 13 2 13 3 5 2 7 2 4 4 5 4 2 6 4 4 2 5 5 5 352.0 0.727272727273 125.0 0.8 0.137784090909 0.181689049587 0.0441250704358 0.125831265811 0.0589989390613 0.0172112596008 0.0258785597609 0.0195698843212 0.0941527200727 0.6875 0.545454545455 5.0 2.0 3.0 1.0 0.0 2.0 5.0 3.0 3.0 4.0 0.0882352941176 2.0 0.0 2.0 0.355113636364 0.791666666667 0.375 0.416666666667 0.291666666667 0.75 0.833333333333 0.708333333333 0.416666666667 0.0 0.208333333333 0.125 0.0416666666667 0.0 0.25 0.458333333333 0.416666666667 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.5 0.333333333333 0.166666666667 0.333333333333 0.5 0.166666666667 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.166666666667 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 -10.2437908826 -5.03508365418 -23.041316355 -13.9996757582 2.5118022048 -2.14446637822 -15.3359726676 -18.0526947461 0.342426577364 2.80862606002 -13.8695545782 -8.96463897424 -2.66156951021 -1.43721357669 -25.8516833291 -7.45264792387 1.73879959566 1.94680864051 -17.5173264005 -3.60160206421 0.0220648916597 -2.59588099499 -14.3359966339 -19.5894523535 -0.224312156243 0.0281981308913 0 5 4 10 2 5 1 4 4 3 2 4 4 2 3 5 3 1 5 4 2 2 6 3 2 2 6 6 7 6 8 4 9 4 9 4 10 2 6 0 169.0 1.0 76.0 0.671052631579 0.187983614019 0.164314974966 0.0679848736505 0.0672900046387 0.0371763208364 0.0208328844417 0.00950381865801 0.00154808543266 0.0104924433569 0.153846153846 0.538461538462 0.0 1.0 1.0 0.0 3.0 3.0 1.0 0.0 2.0 6.0 0.222222222222 0.0 3.0 2.0 0.449704142012 0.875 0.5625 0.1875 0.0 0.5625 0.6875 0.875 0.6875 0.3125 0.375 0.625 0.4375 0.8125 0.3125 0.0625 0.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.25 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.25 0.25 0.0 0.0 0.25 0.5 0.75 1.0 -7.05178824776 4.21148464797 -14.1888917293 13.1543145285 4.01965838975 4.4357648955 -2.25433447491 28.8012983883 -0.483023998064 0.401631834478 -1.77661295444 34.5611581063 -1.29460553681 0.680831620485 -9.07705655344 35.7620759631 0.87791478499 -0.508059144583 -5.87996346447 34.8485632156 -0.524830855224 0.633581987732 -8.51222075717 35.7519532393 -0.0846627640939 -0.243452408552 1 2 4 2 5 1 14 2 5 3 4 3 4 3 3 3 4 3 3 2 0 70.0 0.7 46.0 0.391304347826 0.330612244898 0.262857142857 0.0634868804665 0.11884548105 0.0508513119534 0.00357391772958 0.00346473924619 -0.00237845017408 -0.00012847338588 0.142857142857 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0666666666667 0.0 1.0 1.0 0.657142857143 0.5 0.666666666667 0.0 0.0 0.833333333333 0.833333333333 0.166666666667 0.166666666667 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -1.65521140816 4.96563422447 -4.89846347494 12.5241255499 -1.21594376522 0.874715567233 -8.24292581812 16.2095843944 0.814236688858 -0.0637893011912 -5.37215155891 15.1107504223 -0.272472625954 -0.248348556299 -6.07333825957 11.7529826245 -0.221660459768 -0.67285355967 -6.60868120595 5.40536196088 0.694387479264 -0.340789906691 -1.31149175237 0.70355156399 -0.0306947399809 -0.0327692394776 6 1 8 6 6 6 5 6 4 7 1 10 2 9 2 9 3 8 4 3 3 1 4 3 7 3 8 3 7 4 7 3 7 4 7 4 1 2 3 5 1 2 3 4 1 3 3 6 5 6 5 0 231.0 0.52380952381 118.0 0.516949152542 0.234553325462 0.238919810348 0.0433700342623 0.185227614474 0.0327520034047 0.00789808467253 -0.00311966519357 -0.00199136512531 0.154489994114 0.727272727273 0.190476190476 1.0 2.0 2.0 0.0 0.0 1.0 0.0 3.0 3.0 7.0 0.322580645161 0.0 5.0 1.0 0.510822510823 0.111111111111 0.222222222222 0.222222222222 0.888888888889 0.277777777778 0.722222222222 0.777777777778 0.944444444444 0.777777777778 1.0 0.611111111111 0.611111111111 0.888888888889 0.777777777778 0.0555555555556 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.333333333333 0.833333333333 0.0 0.0 0.666666666667 0.833333333333 0.166666666667 0.333333333333 0.833333333333 1.0 0.166666666667 0.166666666667 0.833333333333 1.0 0.666666666667 0.833333333333 1.0 1.0 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.166666666667 0.833333333333 1.0 1.0 1.0 0.666666666667 0.166666666667 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.166666666667 -6.42682817819 8.30637226803 -11.6383378595 16.3652165102 4.68710534058 -4.46850574268 -1.94501517816 8.16495466877 -3.10178859668 4.38960082443 -4.31071504725 22.4889496277 3.09526468952 0.185483411391 1.53257816801 31.5896203199 -2.58564846618 0.350879788206 -2.72755166407 30.9759216466 2.36071939599 -0.503629303428 5.0280281779 25.7682145532 -0.367714433515 -0.282326193108 1 3 11 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 12 4 2 4 6 2 5 3 5 2 6 3 3 3 6 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 7 2 3 3 6 3 3 3 6 2 5 4 3 2 8 2 2 1 5 0 330.0 0.681818181818 104.0 0.884615384615 0.12303030303 0.163223140496 0.0400837298606 0.120310126054 0.0548864679856 0.0172302576326 0.0246952232585 0.018634713048 0.0927979638848 0.266666666667 0.545454545455 1.0 1.0 0.0 1.0 0.0 0.0 5.0 5.0 1.0 3.0 0.384615384615 1.0 0.0 2.0 0.315151515152 0.75 0.5 0.416666666667 0.458333333333 0.458333333333 0.541666666667 0.541666666667 0.583333333333 0.0 0.0833333333333 0.0833333333333 0.0416666666667 0.0 0.125 0.541666666667 0.375 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.166666666667 0.333333333333 0.5 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.5 0.5 0.666666666667 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -8.50755513982 -6.53982129796 -19.5835151184 -13.5971263491 1.87721521533 3.76172453398 -11.0491180071 2.20260860631 2.46846894591 3.38235654983 -1.10573214251 19.7229859762 -2.44283923278 -1.33088738217 -5.62913733887 17.7047696197 2.94956507415 0.636284917098 6.31508852483 13.6488710847 -1.67637106513 -1.85186336597 -0.518624601087 1.31479233642 -0.0163129236329 0.0602600065665 3 2 9 5 1 6 2 13 1 7 3 4 1 5 4 4 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 2 7 3 3 1 7 3 3 2 5 4 2 3 5 4 2 4 3 5 1 1 1 1 5 1 1 1 1 1 210.0 0.933333333333 106.0 0.641509433962 0.254421768707 0.217142857143 0.104754994061 0.0943790087464 0.0637790735342 0.0327339197981 0.014342686124 0.015142538392 0.00282833567675 0.428571428571 1.06666666667 2.0 2.0 1.0 1.0 1.0 3.0 3.0 3.0 4.0 7.0 0.209302325581 0.0 1.0 2.0 0.504761904762 0.8125 0.6875 0.5 0.375 0.8125 0.6875 0.4375 0.375 0.5625 0.0625 0.0 0.0 0.625 0.625 0.5 0.625 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 2.20694854421 7.29990672315 4.53175182256 19.4854904868 -1.18835690842 2.90864500442 0.502494263799 30.6160950951 -0.374355480695 0.147264038471 -2.76328979614 31.2886446269 -0.146910814925 -0.283385811558 -5.25967482505 28.5895773189 -0.70835494822 0.159905294568 -10.264635275 29.5595848907 0.136765001889 0.455149387344 -10.3560604745 34.4215518541 -0.02279503653 0.102677807419 1 6 1 8 7 3 4 3 4 1 3 4 4 1 10 2 5 7 2 10 2 9 3 10 2 11 2 10 3 4 3 2 9 3 8 7 1 1 1 4 0 180.0 0.8 74.0 0.918918918919 0.174074074074 0.186296296296 0.0571783264746 0.107141803841 0.0454101508916 0.0189970373429 0.0159828681494 0.00866254927041 0.0556603432893 1.08333333333 0.266666666667 0.0 5.0 5.0 3.0 1.0 1.0 0.0 1.0 4.0 13.0 0.27027027027 0.0 3.0 1.0 0.411111111111 0.333333333333 0.666666666667 0.75 0.416666666667 0.583333333333 0.75 0.333333333333 0.75 0.416666666667 0.416666666667 0.0 0.333333333333 0.5 0.333333333333 0.0 0.25 0.0 0.25 0.5 0.5 0.5 0.5 0.5 0.75 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 0.75 0.75 1.0 0.5 0.0 0.0 0.5 0.75 0.25 0.5 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.75 0.5 0.75 0.5 0.0 0.0 0.0 -8.10629176815 5.77201926947 -18.1770589614 18.0872804252 2.22901802965 6.7589213877 -9.76264918819 45.5811755242 1.87231813731 3.427330309 1.02185806149 64.5282860736 -1.12685605009 -0.529948142895 -4.27812234276 62.5766181324 -0.39637658405 -0.105365944892 -9.42627983464 62.3340673021 -0.0713204152844 1.65892524446 -12.1249108325 79.1265584638 -0.191801448905 0.428594530991 4 1 6 3 5 4 4 9 1 8 1 8 2 4 5 3 5 4 6 3 6 3 6 3 6 3 5 5 5 7 2 7 144.0 0.5625 75.0 0.573333333333 0.219907407407 0.252170138889 0.0392041618441 0.181367013353 0.0543067210005 0.00740182089053 0.0142592290719 0.00446362140029 0.153831181146 0.666666666667 0.0 2.0 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 5.0 0.107142857143 0.0 2.0 1.0 0.520833333333 0.5 0.666666666667 0.416666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 0.5 0.916666666667 0.416666666667 0.333333333333 0.25 0.75 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.25 0.0 0.25 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.0 0.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 -6.84366255295 3.22288759761 -12.1004905023 6.45969779398 5.4156199581 -1.56621519681 -0.990375303933 4.25007337696 -4.23341560313 2.36555132469 -9.48249041314 15.2242757457 2.6864151609 1.2315847325 -2.69811210767 23.5886733608 -0.682213421068 -1.35563474829 0.106278197606 12.3160293728 0.231328394444 -1.22553480825 -0.439535674833 -3.58565891968 0.136318643011 -0.22577709992 1 5 1 3 2 7 10 2 7 3 10 3 5 4 4 1 4 4 5 5 1 4 3 5 4 4 1 5 3 5 4 4 1 6 3 3 5 3 1 7 3 3 5 3 1 8 3 1 2 2 3 1 1 9 5 3 5 10 4 4 3 12 3 4 3 11 4 4 3 6 0 286.0 1.69230769231 122.0 0.786885245902 0.191354100445 0.17428725121 0.127602970652 0.0441562447529 0.0430834752806 0.0542171487287 0.00880441944061 0.0064342359381 -0.0127007793291 0.272727272727 1.76923076923 0.0 4.0 1.0 1.0 6.0 6.0 7.0 3.0 4.0 14.0 0.367346938776 0.0 4.0 3.0 0.426573426573 0.708333333333 0.541666666667 0.416666666667 0.166666666667 0.5 0.291666666667 0.583333333333 0.625 0.583333333333 0.666666666667 0.625 0.541666666667 0.416666666667 0.166666666667 0.208333333333 0.208333333333 0.5 1.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.666666666667 0.833333333333 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.833333333333 0.666666666667 0.5 0.333333333333 0.5 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 -9.40461027361 8.91267681315 -20.8547543091 21.0203179518 3.27116619135 -0.347486299493 -6.61103814639 21.955006048 3.83070154179 -0.184591905515 12.1252037898 13.7265577882 -2.5039010195 -2.55949210826 0.922442633824 1.45537321087 -0.321706565633 1.19147980854 -4.07963667343 0.995038236644 1.29209381996 -1.22423743319 6.85797382862 -1.75073603884 -0.119830096215 0.338780105568 1 3 7 6 10 3 6 2 3 2 4 6 3 1 4 6 3 1 3 7 8 7 7 7 6 7 8 6 9 4 4 3 5 1 4 4 10 7 3 6 0 196.0 1.0 107.0 0.560747663551 0.241618075802 0.247448979592 0.0979357824971 0.095552634319 0.051181241447 0.0290820979344 0.00745684822317 0.00905159375298 -0.00119956642367 0.642857142857 0.714285714286 0.0 4.0 3.0 1.0 1.0 3.0 3.0 2.0 3.0 11.0 0.243243243243 0.0 2.0 3.0 0.545918367347 0.625 0.9375 0.9375 0.75 0.8125 0.1875 0.1875 0.6875 0.625 0.0 0.0 0.5 0.625 0.6875 0.625 0.8125 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.75 1.0 0.75 1.0 1.0 0.75 0.5 0.25 0.25 0.5 0.25 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.68249511269 1.13682102208 -9.32612631547 7.54812435516 -7.86726548141 7.41624914122 -36.410576101 34.7266310299 -0.283281973142 1.70383003782 -41.1464267035 45.2322536217 1.42615100211 -1.95965670443 -31.5159022324 32.3639163382 -0.503672251727 -0.446925841035 -30.498543264 25.1440379535 0.649884665193 0.286073568174 -26.2453908768 27.7929058136 -0.0634996333601 0.119231620946 2 4 3 6 2 7 1 7 3 4 4 4 4 4 3 5 3 4 3 3 4 3 6 1 6 0 96.0 0.666666666667 52.0 0.615384615385 0.24609375 0.204861111111 0.0515306260851 0.107403790509 0.0340033637153 0.00776900340277 -0.000860461199321 0.000153686745247 0.0346328230538 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 4.0 0.117647058824 0.0 4.0 1.0 0.541666666667 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.666666666667 0.0 0.333333333333 1.0 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.71361533881 6.89671420065 -8.27986553816 15.7941600265 0.844405392515 -1.18924110255 -6.72784372298 12.422118974 -0.54308349537 -0.56191355551 -7.53000949486 6.51946713621 0.137855427451 -0.475832833876 -6.40032381794 1.94792930847 0.517150303887 -0.512267536254 -2.52446959812 -2.48564083816 -0.0943870520669 -0.00846886851846 -0.275983272551 -5.1179384305 0.242048188713 -0.182160037559 1 2 4 3 14 12 2 7 3 7 1 4 5 5 3 5 4 3 6 3 4 3 5 3 7 2 3 3 6 3 7 2 3 3 6 3 7 2 3 3 6 3 7 2 3 3 6 3 6 3 3 3 6 3 6 4 2 3 6 2 7 4 1 4 6 4 4 10 5 4 5 5 1 0 312.0 1.84615384615 138.0 0.724637681159 0.193509615385 0.202662721893 0.163744140526 0.0500939570374 0.0559196489531 0.08717931262 0.0116535605597 0.0247881591636 -0.0167811454623 0.25 1.84615384615 2.0 1.0 1.0 2.0 4.0 6.0 6.0 6.0 6.0 2.0 0.176470588235 1.0 6.0 3.0 0.442307692308 0.791666666667 0.583333333333 0.5 0.583333333333 0.666666666667 0.208333333333 0.166666666667 0.208333333333 0.375 0.5 0.5 0.5 0.5 0.208333333333 0.25 0.416666666667 0.833333333333 1.0 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.5 1.0 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.833333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.666666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.166666666667 0.166666666667 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -7.21502408683 6.15399113289 -20.9616111929 12.2723957099 -7.40291533909 -4.07502968875 -59.0316168979 -2.91406858341 -8.23636296699 -1.95815100191 -83.0651727524 -13.2737445376 10.4673605192 2.34326778932 -33.5539414745 0.175858716565 -1.30549562954 0.321781470698 -17.7015467489 3.79041641806 -0.0301077239981 -1.32187563151 -31.8991874921 -5.96085567868 -0.390549814483 0.140099932581 8 4 7 8 5 9 4 3 3 4 4 3 3 4 3 3 5 3 3 4 4 3 3 3 5 3 2 4 5 3 1 5 5 3 1 5 5 3 2 4 5 2 4 3 5 2 4 3 5 2 4 3 5 3 3 3 5 3 3 3 5 3 3 3 5 3 2 4 4 4 2 5 3 4 1 6 2 12 2 6 308.0 0.636363636364 158.0 0.601265822785 0.24814471243 0.260773317591 0.063889275255 0.175975059579 0.0559790447788 0.014341341571 0.0117930806236 0.00714630926067 0.107245915783 0.5 0.863636363636 2.0 2.0 2.0 1.0 2.0 5.0 5.0 5.0 1.0 8.0 0.18 0.0 1.0 2.0 0.512987012987 0.166666666667 0.708333333333 0.625 0.666666666667 0.541666666667 0.541666666667 0.5 0.583333333333 0.5 0.0 0.0 0.166666666667 0.916666666667 0.75 0.625 0.875 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 0.833333333333 0.5 0.5 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -6.3372604613 0.607682509987 -13.4157807217 1.40191227473 3.29203210989 0.0032285375383 0.12978703199 2.22787231425 2.21134661543 0.69091592724 7.17935992636 5.82447141715 -4.09876649326 0.259711242188 -9.63681645395 6.6964261077 2.423037291 -0.943325467296 -1.17187345592 -2.7462068213 -0.444323425511 -1.37655421878 0.114818264238 -20.2496418848 -0.190127552004 -0.46914194078 7 1 8 8 5 10 3 6 2 3 4 4 3 3 12 2 11 4 8 6 3 6 2 3 3 5 3 3 3 4 4 3 3 4 3 6 1 13 3 3 4 3 1 0 196.0 1.0 100.0 0.73 0.23250728863 0.261297376093 0.0843202024667 0.107405688744 0.064220424738 0.0210807479676 0.0111714368789 0.012091191052 0.009640167223 0.857142857143 0.5 2.0 4.0 4.0 0.0 0.0 2.0 2.0 2.0 3.0 10.0 0.421052631579 0.0 3.0 2.0 0.510204081633 0.5625 0.4375 0.375 0.75 0.6875 0.3125 0.5 0.6875 0.6875 0.4375 0.5625 0.5 0.3125 0.5625 0.75 0.875 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.5 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.5 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.75 1.0 0.75 0.5 0.25 0.25 0.75 0.5 -3.86519147509 0.0454728408834 -13.2408134217 1.45535968626 -5.32821052923 2.29359441313 -28.1833793686 10.9107903939 2.96712654155 1.17542842989 -17.7247528643 15.4033089917 -0.152766031945 -1.38952949692 -15.6168118284 10.608589683 -1.42821112898 1.10583007618 -25.4702167863 14.5174878542 0.628669948344 -0.1060514304 -22.4391607419 18.2178187492 0.0209740802068 0.0356388412085 1 0 4 2 4 2 3 33 4 2 4 2 4 3 3 4 2 3 3 3 3 3 3 3 3 3 3 3 4 1 12 126.0 0.285714285714 59.0 0.576271186441 0.150793650794 0.266817838246 0.013155526761 0.438281603059 0.0551926237867 0.00185055073724 0.026401774989 0.00624684617962 0.853179254681 1.0 204522251.952 2.0 2.0 1.0 0.0 4294967294.0 4294967293.0 0.0 0.0 3.0 0.0 0.2 1.0 5.0 1.0 0.468253968254 0.5 0.5 0.5 0.666666666667 0.5 0.5 0.916666666667 1.0 0.416666666667 0.5 1.0 1.0 0.166666666667 0.25 0.5 0.75 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 -4.91106681541 -6.72998045074 -7.81315846582 -13.0111906017 4.60255266592 5.13049131745 -0.481411182669 6.62317268814 -4.89107458076 3.11912810671 -9.63955976258 26.113135371 4.29526311048 -0.364045764295 1.18378553982 26.7845822486 -2.52197281881 -0.131579901175 -1.76103007596 21.2505624552 1.58313481642 -1.3064209157 0.0278384723473 7.74813299437 -0.249328980942 -0.213984992703 4 8 6 10 4 4 3 5 2 4 5 5 1 3 7 4 1 3 7 4 1 3 8 7 8 7 8 3 1 4 6 3 2 4 5 4 3 4 3 4 5 9 7 3 1 4 3 0 210.0 1.07142857143 109.0 0.577981651376 0.252380952381 0.234353741497 0.110779073534 0.0901229888781 0.0521234207969 0.0329567378693 0.00848983419994 0.00754514044218 -0.0101557878114 0.533333333333 0.785714285714 0.0 2.0 3.0 1.0 1.0 3.0 3.0 2.0 2.0 14.0 0.153846153846 0.0 2.0 2.0 0.519047619048 0.375 0.75 0.875 0.5625 0.75 0.3125 0.3125 0.6875 0.5625 0.0 0.0 0.3125 0.875 0.5 0.3125 0.75 0.0 0.0 0.25 0.5 0.5 0.5 0.75 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.7162443621 3.64995336157 -11.26924945 14.1654361693 -7.09845193296 8.29020414683 -36.000815259 44.7722081214 -0.199325388745 1.76615406175 -38.5399462901 55.6102614262 2.00609393597 -1.80538862802 -25.8498527835 45.5360752248 -0.738568375874 0.96418793856 -26.9301716879 52.7796174089 0.144564825555 2.30949148 -26.0602650745 79.6513776491 0.144921234562 0.653895365847 3 3 3 5 3 5 4 4 4 4 5 3 5 3 5 3 5 3 4 4 5 3 5 3 5 3 5 3 5 3 5 3 4 4 4 4 4 4 3 15 168.0 0.380952380952 82.0 0.585365853659 0.224702380952 0.249149659864 0.0255498528777 0.299034383098 0.0604766460155 0.00238697521602 0.019901410958 0.00421755165102 0.399183614714 0.375 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 11.0 1.0 0.488095238095 0.166666666667 0.0 0.0 0.25 0.5 0.0833333333333 0.0 0.583333333333 0.833333333333 0.583333333333 0.5 0.916666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.75908817969 -1.21260909022 -7.33974345169 -1.9899085162 1.96079714793 1.6877538766 -4.33739933276 5.93289542225 -1.92026149552 2.24510974465 -7.08641727898 18.7251644958 1.70799859334 0.579989589296 -3.6005600323 24.8735516725 -1.25663183707 0.0398727654171 -4.40407758226 23.2901741412 1.36663227436 -1.01657701849 0.592554439936 11.117375647 -0.220806972003 -0.364547208942 7 3 10 5 5 9 3 3 10 3 10 3 10 3 9 3 10 3 8 5 8 5 9 4 10 3 10 3 10 3 10 4 9 3 10 3 10 4 8 5 8 6 6 7 6 0 286.0 0.590909090909 90.0 0.677777777778 0.0987089833244 0.154322949777 0.0197082918549 0.139130925068 0.0226172001503 0.00589086984979 0.0103046377346 0.000540812266573 0.139799256518 0.384615384615 0.0 2.0 2.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 7.0 0.28125 0.0 2.0 2.0 0.314685314685 0.125 0.583333333333 0.625 0.583333333333 0.5 0.583333333333 0.541666666667 0.708333333333 0.416666666667 0.0 0.0 0.0416666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.833333333333 0.5 0.5 0.0 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.666666666667 0.333333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -14.8737528635 2.19923194091 -26.3240961893 6.51667789459 13.0577602859 1.9954753496 9.66045292763 15.0472251643 -4.27887112346 1.48595046069 3.73805918704 24.2629034858 0.0563051391579 0.740711510649 0.0486995903347 28.1903556379 2.43447361043 -0.860701430628 15.5585224832 21.631894485 -1.6304599936 -0.217059218323 8.2296572104 19.7773907261 0.17501996816 0.26483897885 5 9 9 12 8 14 5 6 4 6 4 6 5 5 3 8 4 5 2 9 4 5 4 8 3 5 5 7 3 4 6 6 3 4 8 10 10 10 12 9 12 10 9 11 5 1 2 2 5 6 4 5 6 5 5 3 7 6 3 4 7 7 3 4 6 7 3 5 5 7 3 6 4 6 5 14 7 11 11 7 6 0 500.0 0.8 275.0 0.476363636364 0.2702 0.25728 0.072529568 0.125754752 0.063210944 0.0126473026715 0.011487219305 0.00616670721264 0.0204688684601 1.15 0.6 4.0 9.0 7.0 3.0 3.0 4.0 4.0 4.0 4.0 17.0 0.232876712329 0.0 3.0 2.0 0.55 0.542857142857 0.4 0.257142857143 0.285714285714 0.914285714286 0.942857142857 0.485714285714 0.714285714286 0.514285714286 0.628571428571 0.457142857143 0.457142857143 0.771428571429 0.657142857143 0.857142857143 0.771428571429 0.0833333333333 0.583333333333 0.333333333333 0.0 0.0833333333333 0.25 0.0833333333333 0.0 0.583333333333 1.0 0.833333333333 0.333333333333 0.0833333333333 0.75 0.75 0.25 0.916666666667 1.0 1.0 0.833333333333 0.333333333333 0.75 0.916666666667 0.666666666667 0.916666666667 0.833333333333 1.0 1.0 0.75 0.166666666667 0.5 0.916666666667 0.75 0.166666666667 0.5 0.833333333333 0.75 0.0 0.0833333333333 0.833333333333 0.833333333333 0.0833333333333 0.0833333333333 0.833333333333 0.833333333333 0.0833333333333 0.0 0.75 0.916666666667 0.75 0.75 0.833333333333 1.0 0.75 0.666666666667 0.833333333333 0.583333333333 1.0 0.916666666667 0.25 0.833333333333 1.0 1.0 0.666666666667 -5.85690190578 7.89408517736 -15.5901388398 21.6962838414 -1.90590718156 6.43220246167 -21.0064535564 61.3773570707 1.17878464599 14.3727269429 -19.6094933737 130.105690388 -2.55479013072 0.252786589156 -32.8814479766 149.545296219 -0.382078299333 0.248943315282 -38.9972981648 140.216061694 0.540704372555 -1.47712840415 -34.3416153345 132.561050256 -0.119983095697 0.52208111752 1 8 1 8 5 4 7 3 3 1 4 2 3 8 3 8 3 8 3 8 3 7 4 6 8 4 4 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 3 8 5 4 7 5 1 9 0 253.0 0.478260869565 88.0 0.795454545455 0.125763564499 0.159993125967 0.0216189954019 0.161087771933 0.0268252173283 0.00573709857216 0.0107651375313 0.000666233549653 0.171809686018 0.636363636364 0.0434782608696 2.0 0.0 4.0 0.0 1.0 0.0 0.0 0.0 7.0 5.0 0.157894736842 2.0 3.0 4.0 0.347826086957 0.111111111111 0.5 0.5 0.333333333333 0.5 1.0 1.0 1.0 0.444444444444 0.444444444444 0.444444444444 0.444444444444 0.5 0.111111111111 0.111111111111 0.0555555555556 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.166666666667 0.5 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.833333333333 0.5 0.5 0.666666666667 0.666666666667 0.5 0.5 0.5 0.5 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.833333333333 0.666666666667 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 -10.1859163579 5.6465405897 -15.4746781047 14.5202176889 11.6681358789 1.78820722778 12.1216671426 23.4941569783 -7.2502498884 1.25608041084 -3.09702230031 25.1667325163 3.41409854125 -2.39596284417 1.85125325713 12.4577085824 -0.858064299465 0.0708888488932 4.02414632716 6.79865922552 -0.398224497865 0.10887987524 -0.652641415804 14.511450029 0.343905713792 0.539279670566 1 2 7 4 8 7 4 7 4 7 4 6 5 5 6 3 2 3 3 2 3 3 3 1 3 4 2 2 3 2 22 2 4 143.0 0.846153846154 83.0 0.518072289157 0.296884933249 0.296933835395 0.0870410336888 0.141581632217 0.0556660318507 0.0121061609946 0.00237721819231 0.00392734488819 0.0052796649894 0.818181818182 0.384615384615 0.0 3.0 3.0 1.0 0.0 0.0 2.0 2.0 5.0 10.0 0.0909090909091 1.0 3.0 2.0 0.58041958042 0.166666666667 0.0 0.5 1.0 0.5 0.0833333333333 0.5 0.666666666667 0.666666666667 0.583333333333 0.25 0.5 1.0 1.0 0.75 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 0.5 1.0 0.5 0.0 0.0 0.25 0.75 0.5 0.0 1.0 0.75 0.5 0.5 0.75 1.0 0.5 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.293824510323 -2.05677157226 -2.15219939779 -5.28281066505 -3.79363953566 0.0173860656996 -12.3091791521 -2.30807800016 1.75040646189 2.39408182206 -9.66861569954 6.12126266267 -1.34045095436 -1.80230543955 -13.8874087847 -0.937656679731 -0.11193692741 -0.26905362313 -17.964269367 -11.3702326575 0.0346317851811 -1.87164055151 -15.9513466072 -28.8625212828 0.075036699683 -0.248690042867 4 5 7 8 4 3 3 4 2 4 4 3 2 2 7 6 8 4 8 5 8 5 8 6 8 2 1 2 7 2 2 3 5 3 3 4 2 3 5 8 2 0 182.0 0.928571428571 82.0 0.756097560976 0.21639898563 0.208791208791 0.0931544605618 0.102189442003 0.0542019265603 0.0320330206925 0.0135448799769 0.0135267240874 0.0239750431463 0.769230769231 0.785714285714 1.0 3.0 3.0 3.0 1.0 3.0 3.0 3.0 3.0 11.0 0.114285714286 0.0 2.0 2.0 0.450549450549 0.375 0.625 0.5625 0.625 0.6875 0.125 0.0 0.25 0.625 0.0625 0.0 0.1875 0.5 0.6875 0.6875 0.5625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -0.636619772368 1.22776670385 -6.84313726334 5.24731427912 -8.10762192608 3.75220538575 -35.7914655621 20.6848778349 -1.12639976815 2.31682088345 -42.5738220545 33.2037305669 3.05063396623 -0.712969687145 -22.799989839 28.0873778018 0.066526813512 -1.41477849064 -18.8233839567 13.788866548 -1.29686959402 -0.81377858611 -32.6634772901 2.02690396572 -0.261777287694 -0.206307672846 1 4 4 5 2 2 4 3 2 4 3 3 2 5 3 9 2 10 2 7 6 4 8 2 4 2 3 4 2 3 4 2 3 4 9 3 9 3 4 1 0 156.0 0.923076923077 76.0 0.763157894737 0.219017094017 0.259368836292 0.0784202784942 0.121730600651 0.0606740673309 0.019294394562 0.0106741508095 0.0128287872562 0.031475550612 0.833333333333 0.615384615385 4.0 3.0 1.0 2.0 2.0 1.0 1.0 3.0 3.0 8.0 0.285714285714 1.0 1.0 2.0 0.487179487179 0.5 0.166666666667 0.5 0.916666666667 0.166666666667 0.0833333333333 0.583333333333 0.5 0.5 0.25 0.666666666667 0.0833333333333 0.833333333333 0.75 1.0 0.75 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.5 0.75 0.5 0.25 0.0 0.0 0.25 0.75 0.25 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.5 1.0 0.75 0.25 0.0 0.0 0.5 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.440736765485 -2.44853758603 -2.47334104585 -5.5872708137 -1.89768907111 0.576637845704 -7.7072305975 -2.93760776886 0.905376799404 1.04431272541 -5.50389999171 3.47970190962 -0.284151790335 0.348766612563 -4.70662235718 6.80898186894 0.375175194657 -0.0777449956191 -1.56966867806 5.46411925885 0.448833908433 -0.561488986744 2.25514024902 -1.38976191582 -0.106267795353 -0.201229628677 6 2 3 9 1 9 3 5 5 5 5 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 5 3 8 1 20 220.0 0.454545454545 115.0 0.452173913043 0.244545454545 0.265702479339 0.0338087903832 0.260139368896 0.0561600300526 0.00372453818958 0.0145290190088 0.00214381050905 0.284513370919 0.5 0.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 4.0 3.0 0.0571428571429 0.0 2.0 1.0 0.522727272727 0.222222222222 0.0 0.0 0.277777777778 0.666666666667 0.666666666667 0.666666666667 0.777777777778 0.888888888889 1.0 1.0 1.0 0.722222222222 0.333333333333 0.333333333333 0.611111111111 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 -5.32445627798 -1.04174144569 -9.37690985076 -1.00770344359 3.92924975958 2.62587719782 -3.50152959089 10.9239539169 -4.41437038326 3.09423749194 -12.788224667 29.0353023276 3.20639371569 0.870674259427 -7.12627062055 35.6827450477 -2.48354116871 -1.06868648062 -12.5109539012 24.5595819493 1.44685945973 -1.78788877901 -10.9592076272 2.02662583221 -0.283552137454 -0.545727812985 1 5 3 2 1 9 3 3 4 4 4 6 3 3 4 6 3 1 5 8 2 1 5 8 1 3 5 11 5 12 5 11 9 9 10 11 6 11 6 12 4 1 2 9 7 10 6 11 6 9 3 1 3 8 3 2 4 7 3 2 6 2 2 1 2 7 6 5 0 352.0 0.727272727273 141.0 0.858156028369 0.182528409091 0.19576446281 0.0629017039585 0.125232951611 0.0565001203278 0.0224017226605 0.0182441245419 0.0157631699868 0.0727268325133 1.3125 0.636363636364 4.0 7.0 5.0 5.0 5.0 1.0 2.0 6.0 0.0 7.0 0.333333333333 4.0 2.0 1.0 0.400568181818 0.5 0.583333333333 0.208333333333 0.791666666667 0.625 0.791666666667 0.125 0.333333333333 0.125 0.375 0.208333333333 0.0833333333333 0.25 0.25 0.541666666667 0.208333333333 0.0 0.333333333333 0.833333333333 0.333333333333 0.0 0.0 0.166666666667 0.833333333333 0.166666666667 0.666666666667 1.0 0.833333333333 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 1.0 1.0 1.0 0.666666666667 0.0 0.166666666667 0.5 0.5 1.0 1.0 1.0 0.833333333333 0.166666666667 0.0 0.0 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 0.333333333333 0.0 0.0 0.833333333333 0.333333333333 0.166666666667 0.666666666667 1.0 0.333333333333 0.0 0.0 0.5 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -8.21818251602 0.520870722846 -24.3224603817 0.439446177952 -5.78027794821 0.60911741556 -38.6860281317 14.6502965912 5.01709001736 9.89485386594 -19.7737548914 58.3920038699 -0.51697757408 -0.337422967742 -10.8777985746 75.3451415828 0.975677315894 2.16418324149 -8.92830653336 78.1927120712 -0.659401133681 -2.64983059931 -7.45372757893 65.1127765656 0.331495237498 0.338844717 0 5 8 4 10 3 10 3 10 3 10 3 10 3 10 3 10 4 1 3 1 1 3 10 3 4 5 2 2 4 6 1 2 3 7 2 1 3 7 2 1 3 7 6 7 6 7 1 2 3 7 1 1 4 6 7 6 8 8 0 273.0 0.619047619048 105.0 0.67619047619 0.123415046492 0.199895342752 0.0357615790535 0.151126657829 0.0464700000988 0.0153140825131 0.0162088510924 0.0155532444854 0.140302994317 0.461538461538 0.571428571429 2.0 2.0 0.0 1.0 0.0 2.0 5.0 5.0 2.0 9.0 0.230769230769 0.0 1.0 2.0 0.384615384615 0.833333333333 0.75 0.791666666667 0.958333333333 0.291666666667 0.5 0.333333333333 0.291666666667 0.0 0.291666666667 0.0 0.0 0.0 0.208333333333 0.458333333333 0.416666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.666666666667 1.0 0.833333333333 0.5 0.5 0.166666666667 0.0 0.0 0.166666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -13.5812218105 -4.18350136127 -29.3687385987 -12.0857897024 4.92467773377 -1.90140404964 -14.3073051993 -12.3671889328 0.458030675325 4.9313882635 -8.29105409789 3.83871496995 -2.08524330392 -3.04063796137 -18.8229790726 -0.675473232052 1.23533014734 2.59923914196 -10.8179401598 7.7057312534 0.935086786553 -1.272092982 -0.500002219396 2.72120720114 -0.103007852115 -0.129578053212 1 5 6 6 10 3 3 4 4 2 4 4 5 1 5 2 5 1 6 2 4 2 4 10 4 11 3 11 4 6 2 2 5 5 2 3 6 1 3 5 8 7 6 4 0 196.0 1.0 99.0 0.717171717172 0.215379008746 0.223760932945 0.0799915160775 0.0931526192318 0.0418211693257 0.0232825129834 0.00914041045327 0.00386776240504 0.0133742342723 0.785714285714 0.5 0.0 3.0 4.0 3.0 1.0 3.0 1.0 2.0 1.0 7.0 0.375 1.0 2.0 2.0 0.505102040816 0.375 0.875 0.875 0.5625 0.625 0.5625 0.3125 0.8125 0.625 0.3125 0.0 0.4375 0.875 0.6875 0.125 0.5625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.25 0.5 0.25 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.5 0.25 0.0 0.0 -10.0494978352 1.77344079445 -26.3052706622 6.72374607671 -3.08797710285 4.20809381604 -37.4878861891 25.2307182194 0.706855520146 3.50526286011 -33.8226578392 42.831979486 0.179116443415 -1.07781245568 -30.4587575642 37.3329880156 -0.100614139963 -1.00683007566 -30.0381036545 27.8727893507 0.123966644364 0.534441831669 -29.3927301977 29.5863125154 -0.0637431981238 -0.0477558963587 0 5 1 5 3 3 3 3 3 3 3 3 3 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 1 0 114.0 0.315789473684 63.0 0.587301587302 0.261695906433 0.248845798707 0.0229254075478 0.318603429935 0.0570695166664 0.00118360843275 0.0141951517615 0.000441961369585 0.452928161998 0.166666666667 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.0 0.0 10.0 1.0 0.552631578947 0.4 0.0 0.0 0.0 0.7 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.04388453234 2.14440344376 -3.59180510735 5.89294399919 1.50240038713 1.29792840017 -1.34153605468 12.1805515837 -1.58756056074 1.49279413772 -3.88886096763 20.4227561259 1.43462665618 0.525541005584 -1.35062862459 24.2481459904 -1.28854232918 -0.376276423804 -4.10891139878 20.6958088683 0.990761624656 -0.551652092913 -2.12333005645 12.2436846069 -0.231681736521 -0.321246443181 7 1 9 5 4 3 1 5 3 3 1 6 1 26 2 1 3 1 2 3 9 3 9 3 9 4 9 4 4 3 1 11 1 11 3 5 1 1 2 0 180.0 0.8 99.0 0.555555555556 0.241203703704 0.27037037037 0.0724381001372 0.1315260631 0.0491992455418 0.0176364722563 0.00828118227049 0.00542228733915 0.0445278010162 0.833333333333 0.4 0.0 4.0 3.0 3.0 1.0 1.0 0.0 1.0 4.0 12.0 0.147058823529 0.0 3.0 1.0 0.55 0.166666666667 0.75 1.0 0.833333333333 0.5 0.833333333333 0.333333333333 0.75 0.5 0.75 0.0833333333333 0.333333333333 0.833333333333 0.75 0.0 0.25 0.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.5 0.75 0.5 0.75 1.0 0.75 0.25 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -10.4405642668 4.58366236105 -25.497750616 11.4458314098 -0.33613523981 1.17930276055 -26.1633523654 19.9438794752 1.95677740838 3.21226076311 -14.3772394702 33.6827161873 0.239903508584 -0.699457812833 -9.73770636752 30.7223745221 0.052644393579 -1.06618104481 -8.38985788737 21.9018232374 0.140033871414 0.517494525451 -9.96065386873 20.8203378584 -0.390243793424 -0.346741131456 4 1 1 1 2 1 5 10 2 4 3 5 1 3 4 5 1 12 1 3 4 3 3 3 9 4 9 3 11 3 10 4 5 2 3 6 1 3 4 8 7 4 4 0 182.0 0.928571428571 88.0 0.761363636364 0.210481825866 0.209576138148 0.0767220341547 0.0950733242123 0.0429850007498 0.0234388874552 0.0104942314138 0.00522846515546 0.022352408826 1.0 0.5 0.0 5.0 5.0 3.0 3.0 2.0 0.0 2.0 2.0 13.0 0.114285714286 1.0 3.0 1.0 0.483516483516 0.5 0.75 0.8125 0.5625 0.5625 0.4375 0.1875 0.6875 0.625 0.5 0.0 0.4375 0.75 0.625 0.0 0.4375 0.0 0.25 0.5 0.5 0.5 0.5 0.75 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 0.75 0.75 0.75 0.5 0.5 0.25 0.75 0.75 0.25 0.5 0.5 0.0 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.75 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.5 0.75 0.5 0.75 0.75 0.25 0.0 0.0 -7.73038295018 4.54728408834 -19.2864093133 13.7444882764 -0.74380575445 4.75330389806 -20.6538693933 34.7307652947 2.15011633136 3.7398239323 -8.77167159521 53.4763724062 0.356907401678 -1.03056238077 -3.64923983589 46.059287772 -0.205184180324 -2.23761919722 -4.51757151842 25.4644748985 0.0225644407067 -0.390202847872 -7.10195397843 15.4724310604 -0.298173777755 -0.223931048658 5 5 9 8 6 3 4 4 3 3 6 3 2 4 6 4 1 3 7 4 1 3 8 3 1 3 8 8 6 4 1 4 6 4 1 5 5 3 3 4 4 4 3 11 6 7 9 2 8 0 225.0 1.0 106.0 0.698113207547 0.228740740741 0.22162962963 0.0982356982167 0.0902185788752 0.0544104471879 0.0328072290378 0.00915145441813 0.00988957378286 0.00275348876167 0.533333333333 0.666666666667 0.0 2.0 3.0 1.0 1.0 3.0 3.0 1.0 1.0 10.0 0.368421052632 0.0 2.0 2.0 0.471111111111 0.1875 0.6875 0.8125 0.625 0.625 0.375 0.375 0.75 0.5 0.0 0.0 0.25 0.5625 0.4375 0.375 0.6875 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.75 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.31042281631 1.27323954474 -11.589045508 8.92475251856 -5.38042737393 8.99303237552 -30.1451300973 41.4165362953 0.159881161203 1.49743030625 -30.4524951608 49.9430759737 1.56580525622 -3.40975199761 -18.4501672761 27.4113982263 0.394183715488 -0.678557615221 -10.6100623496 14.4306475796 0.859232023001 -0.678677476274 -1.21885719861 3.27704085074 0.18864101019 -0.562652966097 1 5 4 6 2 2 4 3 2 5 3 1 3 5 3 1 3 3 1 1 14 1 3 9 3 9 3 9 3 10 3 10 4 9 7 6 5 3 0 168.0 0.857142857143 70.0 0.857142857143 0.168650793651 0.182823129252 0.0617880088543 0.095429590487 0.0352098180542 0.0221893977012 0.0106732829771 0.00478061694337 0.0444040427608 1.0 0.357142857143 0.0 5.0 6.0 1.0 2.0 3.0 0.0 0.0 3.0 9.0 0.133333333333 0.0 3.0 2.0 0.416666666667 0.25 0.833333333333 1.0 0.5 0.5 0.666666666667 0.333333333333 0.666666666667 0.25 0.25 0.0 0.416666666667 0.416666666667 0.333333333333 0.0 0.25 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 0.5 0.5 0.75 0.5 0.0 0.0 0.5 0.25 0.0 0.0 0.5 0.5 0.0 0.0 0.5 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.75 0.25 0.0 0.25 0.75 0.5 0.0 0.0 1.0 0.5 0.0 0.25 0.75 0.5 0.0 0.0 -9.95855215346 3.31951738449 -24.4802417265 9.08755642035 -0.527577755964 2.38825216354 -25.6679689553 23.0071134543 1.91500128974 4.62401595624 -15.1072602136 44.5435091047 -0.347728774221 -0.786476619321 -15.2519842607 41.3928334734 -0.617992555539 -1.61460190147 -19.3873331303 28.9088699622 0.504663238564 1.09685414583 -15.2041351858 34.4932574662 0.0960984477071 0.0181566466462 2 3 2 4 1 5 3 3 27 3 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 4 2 4 1 5 1 11 2 2 2 0 132.0 0.272727272727 68.0 0.661764705882 0.239898989899 0.277548209366 0.0209202910649 0.434946921001 0.066910496146 0.00190974331617 0.0204414001697 0.00400677753042 0.781008111449 1.16666666667 195225786.0 2.0 2.0 1.0 1.0 4294967295.0 4294967293.0 0.0 0.0 3.0 5.0 0.173913043478 0.0 3.0 1.0 0.515151515152 0.25 0.25 0.0833333333333 0.333333333333 0.5 0.416666666667 0.583333333333 0.75 0.666666666667 0.5 1.0 1.0 0.666666666667 0.5 1.0 1.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 -2.69116540137 -3.3856596985 -4.78886883859 -2.9662045228 1.83632040651 7.95762757913 -2.55161898728 25.2889968684 -2.18248248185 1.53340116729 -5.40568686726 35.1150129518 2.50785684539 -2.69690023566 1.15916339572 19.6891158777 -1.88165601664 0.3420496835 -2.95292908556 14.501780015 1.21929613602 -0.979413465108 -0.934102504882 5.71148002768 -0.222164656622 -0.190247165152 8 2 7 2 3 4 4 3 4 4 2 3 6 3 2 2 8 6 8 6 8 7 7 8 6 8 5 4 1 4 5 4 3 3 2 4 6 6 4 0 182.0 1.07692307692 83.0 0.746987951807 0.218995290424 0.231191885038 0.112402149233 0.0901157621511 0.057841265123 0.0432510807192 0.0105134874227 0.0142657325112 0.00295711935739 0.357142857143 0.846153846154 0.0 2.0 2.0 1.0 2.0 3.0 3.0 3.0 2.0 8.0 0.290322580645 1.0 1.0 2.0 0.456043956044 0.375 0.6875 0.9375 0.5 0.3125 0.0625 0.3125 0.625 0.3125 0.0 0.0 0.375 0.6875 0.5625 0.5625 0.625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.75 1.0 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0454728408834 0.454728408834 -3.37479778489 4.70189347265 -5.39943584632 5.69570532494 -23.2452315815 26.4550485009 -1.4153658464 2.11202027995 -31.7553517138 38.1376533521 1.5124698301 -1.65551590533 -22.2279586308 28.178598255 0.376130688924 -0.354103235139 -14.9505746002 23.9010946606 0.585014547054 1.09536205935 -7.16629424077 34.6284892983 0.25921913029 0.230109447978 4 4 4 2 5 12 3 3 3 8 2 3 3 7 3 2 5 4 4 3 5 3 5 3 5 3 6 2 5 3 6 3 3 3 8 3 2 1 10 1 14 3 13 7 9 9 7 11 4 13 2 4 1 5 1 3 2 4 1 4 2 3 2 3 3 2 3 3 3 3 2 3 2 2 5 10 7 2 1 2 8 0 352.0 0.727272727273 169.0 0.698224852071 0.203657670455 0.235666322314 0.0526494256184 0.142586172836 0.045197863045 0.0122519858777 0.0101522260408 0.00345105626803 0.0773745516639 1.3125 0.818181818182 3.0 8.0 8.0 2.0 4.0 5.0 0.0 8.0 5.0 18.0 0.272727272727 1.0 5.0 1.0 0.480113636364 0.416666666667 0.5 0.5 0.791666666667 0.541666666667 0.375 0.791666666667 0.708333333333 0.5 0.25 0.625 0.833333333333 0.833333333333 0.458333333333 0.416666666667 0.666666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.5 0.166666666667 0.5 0.833333333333 0.666666666667 0.166666666667 0.333333333333 0.5 0.833333333333 0.5 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 0.5 0.666666666667 0.833333333333 0.833333333333 1.0 0.833333333333 0.833333333333 0.333333333333 0.0 0.166666666667 0.5 0.5 1.0 0.833333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.333333333333 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.666666666667 0.333333333333 0.0 0.166666666667 0.333333333333 0.333333333333 1.0 1.0 -16.5231768192 -1.88092205472 -35.8541161247 4.30768000176 5.12775463908 12.1872509052 -24.5080760002 40.4809525633 -2.27161462594 -2.58314527505 -25.2934755039 44.1761650146 0.782676434527 2.53167279705 -23.1434932215 45.8786541032 0.951676796951 -2.20209086291 -12.5937515353 38.763304722 -0.186904008269 0.879884103607 -16.816885272 35.6681198897 -0.369227452829 -0.23619755337 3 1 6 3 4 6 1 16 1 3 5 3 6 2 5 3 5 3 5 3 5 3 5 4 4 6 2 7 4 3 6 2 1 0 136.0 0.470588235294 68.0 0.661764705882 0.197610294118 0.23053633218 0.0305531084622 0.198210980435 0.0497074884236 0.00574670325067 0.0183757786215 0.00532365417686 0.204418530141 0.625 0.0 1.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 1.0 7.0 0.269230769231 0.0 3.0 1.0 0.5 0.5 0.5 0.5 0.3 0.7 0.9 1.0 0.6 0.9 1.0 1.0 0.6 0.9 0.6 0.6 0.7 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 -6.70323172081 5.24275106656 -11.2072432075 15.1001910716 6.20901885458 3.35815958084 2.245979245 24.6117211664 -4.62630072241 -2.37490085199 -8.17609117193 13.5432303024 2.38027287812 -0.756367583249 -2.84744582356 6.91917414054 -0.305134031019 1.15690048795 0.257726377505 13.5695360377 -0.482915063608 -0.368024798474 -4.86599064688 12.4446806366 0.140532096778 -0.0714333701599 0 5 9 5 10 4 10 4 10 4 10 4 11 3 11 3 11 9 5 10 3 4 4 3 3 4 4 4 3 3 5 3 3 2 6 3 3 2 6 3 2 3 6 3 2 3 6 3 2 3 7 2 2 3 6 3 2 5 3 11 2 6 294.0 0.666666666667 127.0 0.629921259843 0.170310981535 0.232588273405 0.0489792219354 0.160697718858 0.0654364851128 0.0166083692067 0.0211845753217 0.0181123572835 0.126934821623 0.571428571429 0.52380952381 3.0 2.0 2.0 1.0 0.0 0.0 5.0 5.0 2.0 6.0 0.243902439024 0.0 1.0 2.0 0.431972789116 0.833333333333 0.583333333333 0.625 0.791666666667 0.5 0.666666666667 0.375 0.416666666667 0.0 0.375 0.0833333333333 0.125 0.0 0.333333333333 0.791666666667 0.791666666667 0.833333333333 0.5 0.333333333333 0.0 0.166666666667 0.333333333333 0.0 0.333333333333 1.0 1.0 0.833333333333 0.5 0.666666666667 0.833333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 -10.3374924942 -7.63943726841 -24.2348710759 -20.7854068701 1.72095626835 -2.43264231774 -15.2676440916 -22.8715317723 3.23497024348 5.54831461854 -4.21785796613 -1.81461997842 -4.18891112726 -1.93623832376 -17.9481117289 2.26675839827 3.01960911755 2.89843047084 -6.53823751376 12.8168003957 -0.761509875146 -1.97411165787 -6.12818065037 3.2777249041 -0.229802236818 -0.0216657664883 1 1 3 6 20 1 9 3 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 3 7 3 7 4 6 4 6 4 6 4 4 7 2 9 1 7 3 2 8 0 230.0 0.434782608696 115.0 0.521739130435 0.210869565217 0.225708884688 0.028360729843 0.229292676913 0.043009780554 0.00378113199361 0.0101364281829 0.00113161292442 0.253844502328 0.6 0.0 2.0 1.0 1.0 2.0 0.0 0.0 0.0 0.0 2.0 8.0 0.0833333333333 1.0 10.0 1.0 0.5 0.555555555556 0.0 0.0 0.277777777778 0.833333333333 0.666666666667 0.666666666667 0.777777777778 0.833333333333 1.0 0.888888888889 1.0 0.611111111111 0.333333333333 0.222222222222 0.5 0.833333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.166666666667 0.333333333333 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -7.03049661658 5.867973554 -13.4005251282 17.3633072136 4.01017609878 5.31543761283 -7.50060004177 39.2629266042 -4.2287719238 2.33113582644 -14.6252377235 48.8335491984 3.50035768921 -2.50762035131 -8.65804032397 33.1012392206 -3.18318103795 -1.23223518898 -17.3415225092 16.3665992191 1.71632730882 -0.410531465478 -17.1696633855 14.6199053921 -0.443668916208 0.308826176219 1 3 3 3 5 3 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 5 4 4 4 4 4 2 8 3 1 4 0 176.0 0.363636363636 89.0 0.595505617978 0.217329545455 0.239669421488 0.0216289150545 0.270432240796 0.0514122370398 0.00180186851211 0.0145085294555 0.00237616106553 0.353680345142 0.25 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.214285714286 0.0 9.0 1.0 0.505681818182 0.166666666667 0.0 0.0 0.166666666667 0.583333333333 0.5 0.5 0.583333333333 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.17976996608 2.92266350041 -8.63267504715 8.32629462034 4.57435938992 2.2220708546 -0.0952281406858 18.4633260976 -3.95781446039 1.97961924773 -6.48544364465 28.6926899174 3.44033998577 -0.100081905227 1.28310778219 27.5101685517 -2.27955247198 -1.25509723313 -2.20062560969 15.3640343118 1.54460298601 -0.895580294897 0.305888723128 3.12555777326 -0.304642885616 -0.182542737596 4 1 2 1 5 9 3 9 3 2 4 4 8 4 8 4 7 5 4 8 3 3 2 4 2 3 3 4 1 3 4 3 2 4 3 5 1 5 2 3 3 2 8 0 168.0 0.857142857143 86.0 0.802325581395 0.250992063492 0.241071428571 0.0807814693338 0.110380350057 0.0549975198413 0.0169222292567 0.00566239129747 0.00733422472461 0.0132745878106 0.833333333333 0.5 2.0 6.0 1.0 1.0 1.0 1.0 2.0 3.0 5.0 13.0 0.121212121212 2.0 3.0 1.0 0.511904761905 0.5 0.166666666667 0.25 0.833333333333 0.666666666667 0.0833333333333 0.583333333333 0.666666666667 0.583333333333 0.0833333333333 0.416666666667 0.166666666667 0.75 0.75 0.833333333333 0.583333333333 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.25 0.75 0.75 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.75 1.0 0.5 0.0 0.0 0.0 0.5 0.75 0.5 1.0 0.5 0.0 0.0 0.25 0.75 0.5 0.75 1.0 0.75 0.5 0.5 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.500201249717 3.77424579332 -5.28906881552 10.4195030123 -5.5351583561 2.35020345994 -20.7814509348 21.161372726 2.41984262526 1.73714395999 -14.7075560022 28.4902592675 -0.332223041425 -0.788529485271 -11.2257283315 26.3233158605 0.0350195547034 0.409102225911 -12.2808566158 25.6091589784 0.159478490128 -0.200566736909 -9.82347011071 28.0831464654 -0.0386577750071 0.298499486405 8 5 9 5 10 4 11 3 11 3 11 3 11 3 10 4 6 2 1 5 4 4 2 4 2 5 3 4 2 3 5 4 1 4 6 3 1 4 6 3 1 3 7 3 1 4 6 3 1 4 6 2 3 3 6 3 2 4 4 5 2 12 4 3 3 4 4 2 5 1 2 0 308.0 0.636363636364 131.0 0.679389312977 0.231215213358 0.228010625738 0.0692116930759 0.159711996449 0.0614122842708 0.0175777510489 0.0154961507355 0.01020901567 0.0900004457198 0.642857142857 0.590909090909 0.0 3.0 4.0 1.0 0.0 2.0 5.0 4.0 1.0 8.0 0.0681818181818 1.0 1.0 2.0 0.425324675325 0.0 0.166666666667 0.875 0.666666666667 0.0 0.375 0.291666666667 0.5 0.208333333333 0.291666666667 0.0833333333333 0.25 0.875 0.916666666667 0.833333333333 0.791666666667 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 0.833333333333 0.833333333333 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.333333333333 0.333333333333 0.0 0.0 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 -0.347247148564 -6.771319397 -1.87709276106 -16.0054882246 -0.291285831234 2.07702581631 4.71234629558 1.32261948576 5.42959967557 9.2506049813 20.6634035992 41.3296004901 -5.2335856303 -3.74715379281 -0.873088564496 29.0238613252 0.852424773199 -1.10459400713 -5.25367259714 11.9312069136 0.54497380806 0.382785751616 2.67945629715 12.5268959579 -0.145488735714 -0.193935370691 1 10 2 10 5 9 5 10 3 11 3 11 4 10 4 10 4 10 3 6 8 4 3 3 5 2 3 5 4 2 2 7 2 2 3 7 2 2 3 7 2 2 3 7 2 2 3 6 3 2 3 7 2 3 3 5 4 2 4 4 4 4 4 2 5 294.0 0.666666666667 110.0 0.809090909091 0.201652089407 0.203757693554 0.0660234476502 0.149325850938 0.0579215072581 0.0188707357083 0.0176457379802 0.0125194938028 0.094096528152 0.714285714286 0.52380952381 0.0 3.0 3.0 3.0 0.0 0.0 5.0 5.0 2.0 9.0 0.186046511628 1.0 2.0 2.0 0.374149659864 0.0 0.0833333333333 0.666666666667 0.666666666667 0.0 0.208333333333 0.125 0.291666666667 0.291666666667 0.416666666667 0.125 0.208333333333 0.833333333333 0.916666666667 0.666666666667 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.5 0.166666666667 0.0 0.0 -0.879141590412 -4.91106681541 -5.71901907948 -14.7538763266 -4.06079687 -3.2596087211 -11.6144613738 -19.2379350954 5.83834901351 5.82314705271 6.36178664747 4.83988302913 -3.15134583712 -0.119496458963 0.236284097837 18.0535007828 1.33053380951 1.77827668047 0.912038739355 22.7286500158 -0.306843486852 -2.13647447918 1.62396038115 9.97095512734 -0.222156797391 -0.00617141894981 9 4 11 5 11 5 12 4 12 4 13 4 12 3 13 3 8 3 1 4 6 3 1 6 5 3 5 4 3 3 6 4 3 3 6 4 2 3 7 4 2 3 7 4 2 3 7 4 2 4 6 4 2 4 6 3 4 5 4 5 3 5 2 7 3 13 336.0 0.761904761905 140.0 0.614285714286 0.215773809524 0.237953514739 0.0720241469604 0.148765208899 0.0653030433404 0.0183180218978 0.0171411227237 0.0129283172751 0.0734637988693 0.6875 0.571428571429 1.0 4.0 4.0 2.0 0.0 2.0 5.0 5.0 8.0 9.0 0.176470588235 0.0 2.0 2.0 0.416666666667 0.0 0.125 0.708333333333 0.708333333333 0.0 0.291666666667 0.166666666667 0.541666666667 0.291666666667 0.25 0.0 0.25 0.958333333333 0.833333333333 0.75 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.166666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.166666666667 0.5 0.0 0.0 0.0 -2.91026181654 -10.0646554489 -12.6959440149 -27.5328477034 -6.77741243897 -4.01975788889 -25.5797919433 -36.3025313538 7.72653480041 5.26056959755 -1.80560483264 -12.9553687791 -3.90981931352 0.351726036821 -9.38077178554 1.10455822393 0.987897893731 1.12843344752 -13.3209301344 3.74763007592 -0.356104979371 -2.0000693168 -12.5647043687 -13.0166740448 -0.145454269092 -0.309153328529 1 3 2 7 1 7 2 4 2 5 4 4 1 5 5 3 1 5 5 3 1 4 6 3 1 3 8 1 2 3 7 2 2 3 7 3 1 3 7 3 1 4 6 9 3 10 4 3 2 0 182.0 1.07692307692 100.0 0.53 0.246467817896 0.240067624683 0.114993809475 0.0933263090007 0.0467059507332 0.0406940852952 0.00734217864341 0.0103879178795 -0.00578905290271 0.5 1.0 1.0 2.0 1.0 2.0 3.0 3.0 3.0 3.0 4.0 6.0 0.235294117647 0.0 1.0 2.0 0.549450549451 0.8125 0.75 0.75 0.875 0.75 0.5625 0.25 0.5 0.375 0.0 0.0 0.125 0.8125 0.4375 0.4375 0.6875 0.75 0.75 0.5 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.75 0.75 0.5 0.5 0.25 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.36499022537 3.2740445436 -10.1987573637 9.57448125257 -3.18820295622 2.71166614411 -21.884957666 20.59016418 -0.363598070591 1.22333494843 -24.5264434356 27.183003633 0.417624547783 -0.307934289071 -21.4779077803 24.9278286329 0.0128389767233 -0.408168994279 -17.959584235 21.6488771212 1.13236077284 0.536886632044 -4.53344278205 27.0799910848 0.426606684773 0.226239566724 6 1 1 1 7 6 4 4 2 2 3 5 2 4 1 10 2 10 1 4 8 3 9 3 10 3 9 3 10 4 3 2 4 8 6 4 3 0 168.0 0.857142857143 77.0 0.779220779221 0.189484126984 0.201955782313 0.0614159850448 0.0977180430704 0.0423377436292 0.0178246040141 0.0118335406916 0.00666444798739 0.0380436418105 0.833333333333 0.285714285714 0.0 3.0 5.0 2.0 2.0 1.0 0.0 1.0 1.0 10.0 0.206896551724 0.0 3.0 3.0 0.458333333333 0.25 0.75 0.916666666667 0.416666666667 0.583333333333 0.916666666667 0.5 0.75 0.666666666667 0.666666666667 0.0 0.416666666667 0.583333333333 0.583333333333 0.0 0.25 0.0 0.0 0.25 0.5 0.5 0.75 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.0 -9.95855215346 7.04829033693 -23.5886359499 17.4128332191 0.847743676469 1.37578544101 -19.7000201762 27.9668357909 2.36249495254 4.13029188753 -5.68158967839 45.7417584288 -0.00957744824312 -0.750890678467 -1.99137667592 40.6578300368 0.301981716331 -2.49444006612 1.31249854682 21.2764940327 0.666358030596 0.859154626988 8.02320668113 23.5437241722 0.052809368712 0.0660435093657 7 3 7 8 5 1 2 6 2 3 4 4 2 11 1 12 1 4 3 1 4 4 10 3 10 4 9 4 10 4 4 3 3 4 1 5 4 8 8 2 4 0 195.0 0.866666666667 94.0 0.712765957447 0.233136094675 0.21264957265 0.0801003388459 0.0991447596891 0.0488852475598 0.0218776947766 0.0119444203728 0.00621414364039 0.018115607342 1.0 0.333333333333 0.0 3.0 6.0 3.0 1.0 1.0 0.0 2.0 3.0 11.0 0.2 0.0 3.0 1.0 0.482051282051 0.125 0.625 0.8125 0.5625 0.375 0.75 0.375 0.6875 0.6875 0.625 0.0625 0.1875 0.75 0.75 0.0 0.4375 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.5 0.75 1.0 0.75 0.25 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.75 0.75 0.25 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.75 0.25 0.0 -6.70572826894 6.70572826894 -13.6924509948 17.6673876176 3.74615368273 2.8452659693 -1.0526563044 31.9670188893 0.852355804133 2.89485419585 5.22845678755 42.5951870019 -1.31533995373 -2.48352593464 -0.416066158335 25.1575213761 0.937618443706 -2.60092603139 3.59871507291 1.31804451978 -0.194123095865 0.299503486147 3.1814656816 -2.93657748983 -0.105518916766 -0.245985614766 8 2 9 6 6 8 4 2 4 3 4 2 11 3 9 3 10 3 9 4 9 4 8 5 9 5 9 3 10 3 10 3 9 5 8 5 8 4 9 5 8 5 7 7 5 9 4 0 286.0 0.590909090909 99.0 0.707070707071 0.129908552985 0.17895740623 0.0267165166488 0.158673616471 0.0326226050345 0.00723326471771 0.0132459825853 0.00130849178843 0.153085296525 0.615384615385 0.0454545454545 2.0 0.0 6.0 0.0 1.0 0.0 0.0 0.0 2.0 2.0 0.285714285714 0.0 2.0 1.0 0.346153846154 0.0 0.375 0.416666666667 0.541666666667 0.416666666667 0.75 0.833333333333 0.958333333333 0.458333333333 0.0416666666667 0.0833333333333 0.25 0.458333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.5 0.0 0.333333333333 0.0 0.0 0.166666666667 0.666666666667 1.0 0.833333333333 0.5 0.833333333333 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.666666666667 0.5 0.5 0.666666666667 0.5 0.833333333333 0.666666666667 0.333333333333 0.166666666667 0.0 0.0 0.166666666667 0.0 0.333333333333 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -11.8064030512 -0.115749049521 -18.5579764538 2.09225178715 12.9356737368 3.84530778358 13.4602536081 17.6608155358 -6.98161607445 2.49363562826 -0.371459940117 32.7381207603 2.68361766877 0.19041628154 1.4669164642 33.7612793076 -0.158693599754 -1.1488727421 8.18262095899 23.6374562326 -0.208577254028 -0.197093063798 4.67640298467 22.0781132616 0.147245392168 0.276708434735 1 1 2 2 1 1 4 9 3 4 2 4 2 2 5 3 2 2 6 3 8 3 8 4 5 8 3 3 2 4 2 3 3 3 2 3 3 5 1 3 3 6 1 4 2 5 9 2 1 0 168.0 0.857142857143 87.0 0.793103448276 0.244047619048 0.24574829932 0.0811771137026 0.114987413616 0.06417537253 0.0178747299187 0.0121273510619 0.0118559022502 0.0191655792747 1.08333333333 0.714285714286 3.0 5.0 3.0 2.0 3.0 2.0 2.0 3.0 5.0 8.0 0.205882352941 1.0 2.0 1.0 0.517857142857 0.75 0.333333333333 0.25 0.833333333333 0.5 0.0 0.583333333333 0.583333333333 0.5 0.0833333333333 0.416666666667 0.25 0.75 0.666666666667 0.833333333333 0.833333333333 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 0.75 0.75 0.25 0.0 0.0 0.25 0.75 0.5 0.75 1.0 0.75 0.25 0.25 0.75 1.0 0.75 0.75 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.227364204417 -0.227364204417 -2.80674200219 1.16156996555 -4.55702826853 2.78637152556 -15.7920609199 12.1485599069 1.52129474401 1.30002893808 -14.6113481094 19.1377506362 -1.18773175944 -0.493859686385 -17.6754836346 19.2736118503 -0.0189305603333 0.782122111237 -21.5206894184 19.4006248379 -0.401858075747 -1.54199946748 -24.587184686 8.0783681894 -0.114908597428 -0.0644505827921 1 6 3 1 2 6 8 4 9 3 4 1 4 3 4 9 4 9 4 9 4 9 5 8 7 5 9 3 9 6 5 9 3 10 3 9 4 9 4 9 4 9 4 9 5 6 8 5 8 8 1 2 1 6 0 299.0 0.565217391304 126.0 0.579365079365 0.158219706715 0.189326741312 0.0294407606718 0.151211075991 0.0284669438166 0.00683490927406 0.00754504619471 -0.000600194319235 0.13252905777 0.692307692308 0.130434782609 3.0 0.0 5.0 1.0 2.0 0.0 0.0 0.0 1.0 7.0 0.315789473684 0.0 2.0 1.0 0.421404682274 0.208333333333 0.541666666667 0.541666666667 0.583333333333 0.666666666667 0.875 0.875 0.833333333333 0.583333333333 0.333333333333 0.333333333333 0.125 0.541666666667 0.0416666666667 0.0416666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.0 0.0 0.166666666667 0.5 0.5 0.666666666667 0.833333333333 0.166666666667 0.333333333333 0.0 0.5 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.666666666667 1.0 1.0 0.666666666667 0.5 1.0 0.5 0.0 0.166666666667 0.833333333333 0.833333333333 0.166666666667 0.0 1.0 0.5 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -15.6663822244 7.08585485766 -27.0214506548 17.1974600061 14.1250371718 1.35455023153 8.38953787479 29.1637817759 -6.92995363875 4.20719862689 -3.60580765834 39.5682062301 2.46470321861 -4.3036675446 -3.00642389375 24.6210318067 -0.0549540867409 2.00531655964 3.97495315307 23.2279433351 -0.421996717572 -1.65891192048 -2.45611965225 21.1925941913 -0.00713447085086 0.386758913629 1 1 5 1 6 2 5 3 4 3 4 3 4 3 4 4 2 4 3 4 3 4 3 4 4 3 3 4 4 3 4 4 2 5 2 4 3 4 4 2 6 1 1 1 1 1 1 1 0 147.0 0.333333333333 78.0 0.666666666667 0.245869776482 0.236475542598 0.0234885754015 0.298247486324 0.0543109557211 0.00175150685067 0.0176507894644 0.00168444810931 0.406126676668 0.857142857143 0.0952380952381 0.0 1.0 0.0 3.0 0.0 0.0 0.0 0.0 5.0 1.0 0.321428571429 0.0 4.0 1.0 0.530612244898 0.333333333333 0.0 0.0 0.166666666667 0.75 0.416666666667 0.416666666667 0.416666666667 1.0 0.916666666667 0.916666666667 0.75 1.0 1.0 1.0 0.916666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.03152272556 3.81971863421 -5.20946323751 10.6015584915 2.33777834129 2.21486762398 -1.88012855957 19.927855297 -2.60829514884 1.51596712118 -6.27635650978 30.46153027 2.36329034448 1.42783071709 -1.94321075601 36.4189077758 -2.10673536768 -1.6849826323 -6.75363252248 25.8909888482 1.52059466671 -0.029885338373 -4.07829414305 21.2792347865 -0.372011101174 0.0138409957327 1 5 3 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 5 4 4 4 4 4 4 4 5 3 5 3 5 3 3 6 1 8 160.0 0.4 84.0 0.52380952381 0.228125 0.2546875 0.02480859375 0.271546630859 0.0554541015625 0.00203906689926 0.0158657254724 0.00305069851494 0.340299886949 0.375 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0740740740741 0.0 7.0 1.0 0.525 0.2 0.0 0.0 0.0 0.7 0.5 0.5 0.3 1.0 1.0 1.0 0.8 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.77464829276 0.318309886184 -8.10492219985 0.740033888591 3.93908484152 0.113000009595 -1.57239537905 2.62588638322 -3.97981259146 1.6047433757 -9.0132628388 12.9566067636 3.28038625989 1.79588714933 -1.70284706356 24.8336115242 -2.20870121189 -0.400494116197 -5.71418023867 22.9688628787 1.33482346386 -0.841987484886 -3.12114922647 11.4125316247 -0.127057802883 -0.279607287598 1 3 3 5 2 4 2 6 2 5 4 4 2 4 5 3 2 4 5 3 2 3 7 2 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 4 4 4 1 6 3 11 2 6 182.0 1.07692307692 101.0 0.564356435644 0.247645211931 0.265004226543 0.110110560252 0.103397855013 0.0552219034437 0.0337868364895 0.00888504768203 0.0114117053729 -0.00429299933836 0.357142857143 1.0 1.0 1.0 2.0 1.0 3.0 3.0 3.0 3.0 1.0 5.0 0.225806451613 1.0 0.0 2.0 0.554945054945 0.875 0.75 0.75 0.875 0.4375 0.375 0.25 0.5625 0.5 0.0 0.0 0.25 0.8125 0.6875 0.75 0.9375 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.41006056682 0.818511135901 -10.5025808222 3.68107536018 -6.65643509074 2.55715128682 -30.8678249452 12.4333154435 2.23587506007 -0.126262416476 -22.083666832 11.5446974097 1.88374678613 -1.42538422117 -7.50787964159 1.39815505487 -0.795275746885 -0.285013687529 -7.97255406087 -2.18014860404 1.11469621665 0.624502464819 1.63374686183 5.92072218233 0.278042314767 0.378059245038 10 1 11 4 10 4 11 4 10 3 11 3 11 3 11 3 11 3 4 4 1 5 3 4 3 5 2 3 5 4 2 2 6 3 3 2 6 3 2 3 6 3 3 2 6 3 2 3 6 3 2 3 6 3 3 2 6 4 2 4 4 5 2 4 4 3 1 0 294.0 0.666666666667 108.0 0.805555555556 0.19436345967 0.204567541302 0.0629035269066 0.14814724307 0.0603714344269 0.0181272394316 0.0185310935869 0.0138530388247 0.0951497208546 0.428571428571 0.571428571429 1.0 3.0 1.0 2.0 0.0 1.0 5.0 5.0 0.0 8.0 0.2 1.0 0.0 2.0 0.367346938776 0.0 0.208333333333 0.625 0.625 0.0 0.208333333333 0.125 0.208333333333 0.291666666667 0.375 0.291666666667 0.208333333333 0.708333333333 0.791666666667 0.833333333333 0.833333333333 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.666666666667 0.833333333333 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.5 0.166666666667 0.0 0.0 -0.636619772368 -5.27484954247 -4.82612776667 -14.2936799344 -3.43386972131 -1.72611191925 -7.97058539695 -16.5540817905 5.85992870542 3.51191715701 6.66824066456 -1.54200026922 -5.25352395824 -0.247478472653 -8.78711625593 5.71373668262 2.84712031669 1.31915027414 -1.24224065673 12.0375719956 -0.301278364127 -0.35359520577 3.84332474523 14.5345055608 -0.251407984672 0.134128388391 0 6 3 4 6 1 2 8 2 5 4 5 2 4 4 4 5 3 4 3 4 4 5 1 5 4 4 4 4 2 5 4 4 5 3 2 6 4 3 6 2 1 8 3 5 5 11 2 5 6 10 4 3 5 12 3 3 5 12 3 4 4 13 2 5 1 8 0 299.0 1.76923076923 123.0 0.772357723577 0.184382725025 0.158991510162 0.129088737345 0.0380159305529 0.0448002141641 0.0557225160821 0.00927199264247 0.010044695077 -0.0118051490053 0.130434782609 1.61538461538 1.0 1.0 0.0 1.0 7.0 6.0 4.0 3.0 3.0 6.0 0.230769230769 1.0 2.0 3.0 0.411371237458 0.791666666667 0.583333333333 0.291666666667 0.0416666666667 0.458333333333 0.375 0.458333333333 0.5 0.625 0.791666666667 0.75 0.5 0.291666666667 0.291666666667 0.375 0.25 1.0 0.666666666667 0.166666666667 0.166666666667 0.333333333333 0.166666666667 0.0 0.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.833333333333 0.5 0.166666666667 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 0.833333333333 0.166666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.5 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 1.0 -8.96803505422 10.5734240454 -22.660942367 24.3692765918 -0.268733389568 -1.56196050339 -16.8999184955 19.8477247636 5.51598628846 -1.34791988728 -0.619568887558 7.43878489517 -6.08727221934 -0.937156234449 -21.1761088253 4.01576119824 3.19264628857 1.50913495988 -13.4166807127 9.21082509588 -0.815510062858 -1.26321621058 -11.4061005087 6.02101572353 -0.225719970766 0.361675111766 0 3 3 5 6 2 4 4 1 7 3 5 3 5 4 6 2 4 2 5 4 5 4 4 2 3 6 3 5 4 2 3 6 3 5 4 2 3 6 3 6 3 2 3 6 3 6 3 2 3 6 3 6 3 2 3 6 3 5 5 1 3 6 3 5 4 2 3 5 5 4 10 3 6 3 7 22 0 322.0 1.64285714286 154.0 0.720779220779 0.224007561437 0.205412599823 0.166135020623 0.0518019275481 0.0551202399263 0.0738053570944 0.00920742584492 0.0192967180725 -0.0238087261524 0.347826086957 1.85714285714 2.0 2.0 1.0 2.0 6.0 6.0 6.0 6.0 4.0 15.0 0.220338983051 3.0 2.0 3.0 0.478260869565 0.75 0.583333333333 0.5 0.583333333333 0.625 0.208333333333 0.166666666667 0.291666666667 0.541666666667 0.541666666667 0.5 0.583333333333 0.583333333333 0.458333333333 0.375 0.541666666667 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.833333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.5 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 -1.10716482151 10.0475207552 -7.22463089766 21.8736011301 -8.72211470162 -3.88391954328 -49.0997908558 6.74257029489 -9.20656879542 -2.98663023067 -84.4959649701 -9.08031032085 8.10599826887 2.34292498349 -47.1850645345 2.77269052242 -0.0915707790577 0.652304521556 -27.8074900172 12.893212095 -0.29437767879 0.310617667563 -39.6061776693 17.3570383694 -0.348768585683 0.0851900278928 3 3 8 4 3 1 4 2 2 2 8 3 7 6 5 8 2 8 6 5 6 5 6 6 3 3 2 7 3 5 4 0 140.0 0.714285714286 68.0 0.852941176471 0.210714285714 0.251530612245 0.0580302478134 0.142802842566 0.0588866618076 0.0140107483783 0.0104626317125 0.0100416781895 0.0771381013514 1.2 0.214285714286 2.0 3.0 4.0 1.0 1.0 0.0 0.0 2.0 1.0 7.0 0.208333333333 2.0 2.0 1.0 0.485714285714 0.25 0.833333333333 0.333333333333 0.5 0.25 0.583333333333 0.5 0.333333333333 0.5 0.416666666667 0.75 0.416666666667 0.333333333333 0.25 1.0 0.833333333333 0.0 0.25 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.5 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.5 1.0 1.0 0.75 0.75 0.75 0.25 0.0 0.25 0.75 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.5 1.0 1.0 0.25 0.5 0.25 0.0 0.0 0.5 1.0 1.0 -5.45674090601 -0.909456817668 -14.8136509764 -1.16985388962 -1.94883603786 2.03606965098 -18.2915240815 8.93392692428 3.3101803955 2.55197143593 -3.40520062529 18.807151981 0.0480106837315 -2.24932555952 3.17169493614 8.67876941686 0.4756000432 0.11516553822 6.37028958295 3.72148564696 0.336107146705 -0.456418836801 10.675162057 -2.48682284213 0.0038013346717 -0.397434676463 1 3 1 6 3 6 2 5 1 5 5 3 2 4 5 3 3 3 5 3 2 4 5 3 3 2 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 4 5 3 1 6 3 11 2 6 182.0 1.07692307692 101.0 0.564356435644 0.248430141287 0.260355029586 0.109449706796 0.102495982462 0.0549613108785 0.0338043167959 0.00878067280091 0.0116300786808 -0.00460040503594 0.5 1.0 3.0 2.0 2.0 0.0 3.0 3.0 3.0 3.0 3.0 7.0 0.166666666667 0.0 1.0 2.0 0.554945054945 0.875 0.625 0.6875 0.875 0.625 0.4375 0.25 0.5625 0.375 0.0 0.0 0.1875 0.75 0.75 0.75 0.875 0.75 1.0 0.75 0.25 0.25 0.25 0.25 0.5 1.0 1.0 1.0 0.75 0.75 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.5 0.5 0.25 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 0.909456817668 -10.6777322019 3.65359856477 -6.42187875333 2.39335625792 -30.2868766248 13.4722296904 2.14419311979 1.41908028244 -22.6038588152 21.0080461301 1.25225972821 -0.537058648485 -12.6235892584 17.5322769833 -1.15366661175 -0.571696288885 -16.9636261513 13.2445100073 0.964981421349 0.809248598946 -10.089233073 22.0516895499 0.168520349598 0.388184429773 8 2 5 1 2 4 1 21 2 7 4 5 7 4 7 3 8 3 7 4 8 3 8 3 7 4 6 6 8 3 4 0 165.0 0.733333333333 73.0 0.671232876712 0.192837465565 0.180606060606 0.0491304226841 0.103509140997 0.033859253694 0.0119450332118 0.00734050257775 -0.000965518532057 0.0513039738368 0.363636363636 0.0666666666667 1.0 2.0 1.0 0.0 1.0 0.0 0.0 0.0 3.0 5.0 0.125 1.0 2.0 1.0 0.442424242424 0.416666666667 0.416666666667 0.0833333333333 0.166666666667 0.583333333333 0.916666666667 0.75 0.833333333333 0.583333333333 1.0 0.75 0.666666666667 0.75 0.666666666667 0.0833333333333 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 -7.5545546321 8.14873308631 -13.3954626433 19.718024583 6.1998277565 0.330476397389 1.28168717274 22.86895057 -3.50642835084 0.535603147549 -4.68270700737 23.1931189902 1.73480111258 -0.213855246789 -2.24723981488 21.4510850442 -0.45681362576 -0.427091033075 0.110728686134 15.7882286802 0.215819612686 -0.693848723835 0.190168386962 7.35609501591 0.123018960449 -0.195404250013 1 1 5 2 1 1 5 1 1 2 3 4 2 6 3 6 2 22 2 5 4 5 4 3 2 4 5 4 6 2 2 4 5 4 6 2 2 4 6 3 6 2 2 4 5 4 6 2 2 3 7 3 6 2 2 3 7 3 6 2 2 4 6 3 6 2 1 5 5 4 5 10 3 6 3 5 299.0 1.76923076923 152.0 0.625 0.226843100189 0.227939284795 0.169605144967 0.0548158892823 0.0501939721519 0.074819854271 0.00791243784786 0.0152432223201 -0.028126685217 0.391304347826 2.0 2.0 2.0 1.0 2.0 6.0 6.0 6.0 6.0 9.0 8.0 0.105263157895 0.0 2.0 3.0 0.508361204013 0.666666666667 0.708333333333 0.583333333333 0.75 0.666666666667 0.166666666667 0.0416666666667 0.166666666667 0.625 0.666666666667 0.541666666667 0.625 0.708333333333 0.208333333333 0.166666666667 0.291666666667 0.666666666667 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.166666666667 0.666666666667 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.166666666667 0.833333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.666666666667 0.333333333333 0.333333333333 0.166666666667 0.166666666667 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 0.833333333333 0.833333333333 0.833333333333 0.0 0.5 1.0 0.833333333333 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.5 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 -7.75015375056 8.69124384884 -21.7791579533 16.8999335369 -5.44206043268 -6.07308159276 -46.6703106496 -3.51840222139 -4.50871242895 -1.16357151037 -67.9638390483 -12.8693501835 1.18245254204 2.0570516256 -62.6494913488 -0.11780577073 1.26931269423 0.043151583977 -46.1872923397 1.09314671807 0.956018929868 -1.15311322022 -36.7011126796 -7.7469074005 -0.119508556629 0.194053507425 8 4 8 6 5 8 4 4 2 1 6 3 10 3 9 4 9 3 10 3 9 5 7 9 5 6 8 3 10 3 10 4 9 3 10 3 10 3 10 4 9 4 7 6 6 8 5 0 286.0 0.590909090909 100.0 0.72 0.140398063475 0.166083916084 0.029478932237 0.141849610852 0.0309757482969 0.00761093454572 0.0112510529968 0.000636594616502 0.125946040188 0.692307692308 0.0454545454545 2.0 0.0 6.0 1.0 1.0 0.0 0.0 0.0 3.0 8.0 0.114285714286 1.0 3.0 4.0 0.34965034965 0.0 0.333333333333 0.375 0.333333333333 0.458333333333 0.875 0.875 0.875 0.541666666667 0.291666666667 0.291666666667 0.125 0.5 0.0416666666667 0.0416666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 0.833333333333 0.5 0.5 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.666666666667 0.666666666667 0.5 0.833333333333 0.5 0.166666666667 0.5 0.666666666667 0.166666666667 0.166666666667 0.833333333333 0.5 0.0 0.0 0.333333333333 0.5 0.0 0.0 -10.648912556 3.29884791136 -16.6928697661 7.7471921084 11.5806445744 0.305993613352 10.99039962 12.7210252664 -6.89091857883 2.52352307088 -2.694943214 21.6620855428 3.41354795386 -0.730504088157 4.07599658824 24.0191665486 -0.1598352033 1.23906252585 11.3054575082 26.4700545914 -0.483495609596 -0.886864411386 5.506694977 28.1631527351 0.168014633828 0.43838380257 5 4 7 10 5 4 4 4 2 4 6 4 1 4 6 4 1 4 7 8 7 8 7 3 1 4 7 3 1 4 7 3 1 4 7 2 3 4 5 3 5 9 7 4 12 2 8 0 225.0 1.0 103.0 0.679611650485 0.190518518519 0.196444444444 0.0846903484225 0.077933037037 0.0436798683128 0.0320289169318 0.00827796566621 0.0104834854589 0.0129965726493 0.466666666667 0.666666666667 0.0 2.0 3.0 0.0 1.0 3.0 3.0 1.0 3.0 11.0 0.175 0.0 2.0 2.0 0.457777777778 0.625 1.0 1.0 0.75 0.5625 0.25 0.25 0.5 0.5 0.0 0.0 0.25 0.5625 0.625 0.5 0.625 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.88600963473 4.24413181578 -12.1044386556 14.2930695459 -7.36554929523 6.2428349589 -35.020766171 37.1650237964 2.26784607213 0.906202833571 -25.6049257114 42.4389165293 2.31511326973 -1.79457920503 -10.0647651759 30.2537353947 -1.81785689132 -0.308622883405 -17.8850191806 22.0165102254 0.901789603391 -1.14248212858 -10.1184334879 6.04545840575 0.536305455936 -0.701667590101 3 1 5 2 4 4 2 6 1 6 2 4 3 3 4 3 4 3 4 3 4 3 4 3 4 4 3 4 1 1 2 5 3 3 1 0 112.0 0.4375 58.0 0.672413793103 0.19387755102 0.252790178571 0.0243713556851 0.228378251412 0.0525521592566 0.00358068110672 0.0183266917106 0.00519646115018 0.275527922278 0.285714285714 0.0625 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 1.0 4.0 0.263157894737 0.0 2.0 1.0 0.517857142857 0.375 0.75 0.5 0.5 0.625 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.75 0.875 0.5 0.625 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -6.28662025213 2.5066903537 -10.4023394774 6.81298227255 5.97545990441 1.19879108991 2.87981941538 11.4156449302 -4.06156682936 0.100369174507 -4.69571492047 11.4733231932 2.54268339682 -0.535804071872 0.818576228248 6.97764241574 -0.936130127337 -0.468403214024 0.795241284988 2.40064256631 -0.0649916827775 -0.00414823034192 -3.39357536239 1.42474417599 0.0704178514135 -0.0180722192149 1 7 2 5 7 4 2 1 5 1 3 3 7 5 7 2 8 8 3 8 3 8 3 8 3 9 3 8 6 1 2 3 7 2 0 154.0 0.785714285714 71.0 0.732394366197 0.185360094451 0.209183673469 0.0627325954531 0.117482471147 0.0330337565959 0.020794881134 0.00801994982754 0.0035073459191 0.0635494975574 0.909090909091 0.357142857143 0.0 2.0 3.0 2.0 1.0 3.0 0.0 1.0 3.0 10.0 0.21875 2.0 2.0 1.0 0.461038961039 0.166666666667 0.916666666667 1.0 0.833333333333 0.5 0.5 0.333333333333 0.583333333333 0.416666666667 0.0833333333333 0.0 0.25 0.833333333333 0.5 0.0 0.166666666667 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 0.75 0.75 0.75 0.5 0.5 0.5 1.0 0.75 0.25 0.25 0.25 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.25 0.25 0.0 0.0 0.75 1.0 0.75 0.25 0.5 0.5 0.0 0.0 1.0 1.0 1.0 0.75 0.75 0.5 0.0 0.0 -10.4587534032 4.86559397452 -26.1000108358 12.2338486128 -1.09738029275 1.18716595306 -28.8867299412 19.7504979768 2.32167640181 2.3659489756 -15.9045309965 30.0583617743 0.318860896373 -0.391305546515 -10.1238339696 27.345377173 0.0306512123961 -1.43725179942 -8.60973362655 14.8087557352 0.308866846774 -0.174160416173 -7.82881470654 8.80537492254 -0.247850574449 -0.150134994729 5 6 6 9 4 4 1 1 2 4 1 4 5 4 1 3 6 8 7 7 7 7 7 7 7 7 6 3 2 4 5 3 3 4 3 3 5 6 9 2 1 1 6 0 196.0 1.0 97.0 0.639175257732 0.228134110787 0.212099125364 0.0993500794737 0.0833979676835 0.0436058742531 0.0340496025857 0.00653257820918 0.00775626993518 0.00156003131579 0.5 0.857142857143 0.0 2.0 3.0 1.0 2.0 3.0 3.0 2.0 4.0 12.0 0.0810810810811 0.0 2.0 2.0 0.494897959184 0.375 0.875 1.0 0.625 0.6875 0.3125 0.25 0.625 0.5625 0.0 0.0 0.25 0.6875 0.625 0.5625 0.5625 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -4.22897420216 3.59235442979 -14.4554156371 12.4741402482 -6.36016561213 5.89894108317 -36.4305988128 34.3239746225 0.206786844309 1.12514505107 -36.877303171 40.6243967519 1.47660483306 -1.7291086977 -27.5709856509 29.3965168984 -1.05628651041 -0.0267704611248 -31.9420775523 26.926787055 0.146975207264 0.725500920049 -31.8180419718 33.1812586316 0.101100024453 -0.0138830133287 1 7 2 7 6 4 9 2 3 3 5 1 3 3 22 2 2 3 3 9 3 9 3 9 3 9 3 11 3 3 3 4 7 8 3 3 0 180.0 0.8 83.0 0.734939759036 0.19212962963 0.193333333333 0.0631541495199 0.097537037037 0.0366512345679 0.0188505746348 0.00933842106653 0.00571578901183 0.0408388830024 0.916666666667 0.266666666667 0.0 5.0 4.0 2.0 0.0 2.0 0.0 1.0 7.0 9.0 0.2 1.0 3.0 1.0 0.461111111111 0.25 0.833333333333 1.0 0.833333333333 0.5 0.833333333333 0.5 0.5 0.5 0.333333333333 0.0833333333333 0.0833333333333 0.833333333333 0.75 0.166666666667 0.0833333333333 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 0.75 0.5 0.75 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.75 1.0 0.75 0.5 0.75 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 -10.7376534939 10.6952121758 -26.559813062 26.4695070994 -0.814307424388 1.87647214682 -28.7204521696 39.5825065704 2.00522129124 4.2518781423 -17.6224040454 56.5941142909 -0.140906554899 -1.09397393731 -15.3106877563 51.1296620356 -0.252431327013 -1.40954469092 -18.4224967573 41.1864017153 -0.479046950762 2.04441245283 -24.4832368469 57.4833720275 -0.207732157378 0.234743635126 3 1 6 2 5 3 4 7 1 8 1 4 5 2 6 1 7 2 6 2 6 2 6 2 6 2 5 6 3 5 5 3 1 0 128.0 0.5 52.0 0.884615384615 0.1572265625 0.19189453125 0.0265192985535 0.177512645721 0.0500292778015 0.00557149793032 0.0236224979221 0.00733802513374 0.186191469512 0.625 0.0 1.0 1.0 2.0 1.0 0.0 0.0 0.0 0.0 5.0 0.0 0.217391304348 0.0 6.0 1.0 0.40625 0.375 0.625 0.0 0.0 0.625 0.875 0.5 0.5 0.875 1.0 0.875 1.0 0.625 0.875 0.375 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 -5.68978921554 3.22288759761 -10.5817715384 8.30848291546 3.93504379805 0.866337551557 -1.94720552958 12.1164374018 -2.50456783447 0.469640164563 -5.3841454916 15.1409766158 1.886188974 0.491510790767 -0.713581160746 16.6223531271 -0.948715642861 -0.780443772752 -3.24264043256 11.1797235362 -0.125966108485 -0.126341385618 -5.95295459991 8.28712231597 0.170558998465 0.0407572313148 1 2 1 2 11 7 10 6 13 4 14 2 15 2 14 4 14 2 15 2 14 3 4 3 8 5 1 5 5 4 4 5 5 3 5 3 6 2 6 4 4 3 6 4 5 2 7 3 5 2 7 3 5 3 6 3 5 2 7 4 4 2 7 3 4 5 4 13 3 7 2 1 14 0 391.0 0.739130434783 130.0 0.923076923077 0.139310967354 0.177916157011 0.0477297162624 0.122596564792 0.0611242841686 0.0187144752632 0.0256806687979 0.020561579252 0.0855432903719 0.941176470588 0.608695652174 7.0 6.0 1.0 2.0 1.0 1.0 5.0 5.0 4.0 12.0 0.1 4.0 1.0 2.0 0.332480818414 0.666666666667 0.466666666667 0.466666666667 0.433333333333 0.366666666667 0.333333333333 0.366666666667 0.3 0.0 0.233333333333 0.466666666667 0.233333333333 0.0 0.0666666666667 0.533333333333 0.7 0.888888888889 0.444444444444 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.111111111111 0.888888888889 0.888888888889 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.777777777778 0.555555555556 0.444444444444 0.444444444444 0.555555555556 0.777777777778 0.444444444444 0.333333333333 0.111111111111 0.0 0.0 0.0 0.222222222222 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.555555555556 0.888888888889 0.666666666667 0.444444444444 0.0 0.0 0.0 0.0 0.222222222222 0.777777777778 0.888888888889 1.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.222222222222 0.333333333333 -7.03049661658 -9.18946801852 -17.6053711251 -21.1979275034 0.176016184289 2.35539374315 -11.2063752932 -7.99061009798 4.4061558379 5.23875374591 -1.00950348702 15.5347278411 -6.51845293726 -2.29083846624 -24.3885145764 13.9942090175 3.93614470295 2.01562794053 -11.9270930928 16.4295483415 -1.0292292711 -2.27294749689 -11.4717909918 4.94638138745 -0.350019736189 0.234295992029 5 4 4 9 2 3 4 3 2 3 5 2 10 2 10 1 10 2 6 2 3 2 4 3 3 2 3 3 3 3 3 4 2 4 2 11 1 5 2 4 2 1 1 1 4 1 2 0 168.0 0.857142857143 75.0 0.933333333333 0.206349206349 0.225765306122 0.0710000269949 0.122755835965 0.0597060252672 0.0195862536498 0.0158011194755 0.0120301380785 0.0445919333538 0.833333333333 0.642857142857 2.0 4.0 3.0 1.0 1.0 1.0 3.0 2.0 2.0 9.0 0.205882352941 1.0 2.0 1.0 0.446428571429 0.666666666667 0.25 0.25 0.666666666667 0.416666666667 0.0833333333333 0.583333333333 0.916666666667 0.416666666667 0.0 0.166666666667 0.5 0.75 0.416666666667 0.5 0.666666666667 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.25 0.5 0.75 0.5 0.25 0.0 0.0 0.25 0.75 0.5 0.5 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.25 0.25 0.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 -1.77344079445 -3.04668033919 -5.42454169797 -3.35192086986 -1.18461390587 6.12259321894 -6.50233181156 18.7576590255 2.22670142104 1.90560748338 -0.169823093597 32.8942802366 -1.71981432174 -0.00227506247859 -3.13796254179 35.4602127141 1.71365911968 0.991782388107 4.60592315872 40.9941014719 -0.284928158285 -0.360359185065 5.83814131829 38.6448448761 -0.108083168797 -0.0945388425689 6 7 6 9 4 9 5 3 3 2 5 3 11 3 11 3 11 3 10 4 9 8 5 10 6 6 9 4 10 4 9 5 9 4 10 4 11 3 10 4 9 5 9 7 6 8 11 2 7 0 322.0 0.608695652174 120.0 0.641666666667 0.13620230701 0.167701863354 0.0279619321105 0.132396788043 0.0261054192133 0.00726916723213 0.00869203956282 -0.000153757206148 0.111104988734 0.714285714286 0.0434782608696 4.0 0.0 4.0 0.0 1.0 0.0 0.0 0.0 2.0 7.0 0.194444444444 0.0 2.0 1.0 0.372670807453 0.0833333333333 0.5 0.5 0.541666666667 0.625 0.833333333333 0.958333333333 0.791666666667 0.541666666667 0.291666666667 0.375 0.0833333333333 0.583333333333 0.0416666666667 0.0416666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.166666666667 0.5 0.0 0.166666666667 0.5 0.666666666667 1.0 0.833333333333 0.666666666667 1.0 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 1.0 1.0 0.666666666667 1.0 0.5 0.0 0.0 0.666666666667 0.833333333333 0.5 0.166666666667 1.0 0.333333333333 0.0 0.0 0.666666666667 0.5 0.0 0.0 -16.7458679253 4.98224169679 -29.0096523377 12.9478825069 14.9596489898 2.42550720538 8.82813998713 28.0133066018 -6.95434993079 4.61025083872 -1.75206036908 45.1774351999 2.6566479666 -2.45368251 -1.48249375227 38.1214770298 -0.445936844723 0.458310485971 4.79324272774 27.9268826792 0.0675651395954 -2.34860890122 -0.742879084759 13.6069807226 -0.191074707171 0.274074634035 1 2 2 3 2 2 22 1 9 3 4 7 3 8 3 8 3 8 3 9 2 8 3 8 4 6 6 6 4 5 0 154.0 0.785714285714 70.0 0.585714285714 0.17119244392 0.171614100186 0.0446068520786 0.0977837308584 0.0267434117577 0.0124332288876 0.00656551305301 -0.00122146863695 0.0522664605229 0.363636363636 0.0714285714286 1.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 1.0 6.0 0.125 0.0 5.0 1.0 0.454545454545 0.75 0.416666666667 0.25 0.333333333333 0.916666666667 1.0 0.916666666667 0.916666666667 0.75 0.583333333333 0.333333333333 0.583333333333 0.916666666667 0.25 0.0 0.0833333333333 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -9.45835090375 6.82092613251 -18.8227853 17.7284988295 5.40848401364 1.94187590915 -4.55535665483 25.0387458698 -1.95788893996 -0.262993434701 -8.11936073138 23.5824316315 -0.695072001954 -0.0288301686958 -13.9702642155 21.9418949928 1.07285384194 -0.138168401412 -6.81649367361 18.7378840106 -0.12048807222 -0.896448251323 -4.09184858533 7.78780049608 0.144928355944 -0.343572489925 4 6 6 8 4 3 4 4 1 5 3 4 1 11 1 7 6 4 9 4 9 4 9 5 9 5 4 2 2 5 4 2 4 9 5 4 1 1 3 0 182.0 0.928571428571 93.0 0.634408602151 0.202874049028 0.226452119309 0.0691361530632 0.100462497893 0.0393443351721 0.0210086351974 0.00997322905083 0.00498373005596 0.0278907578528 0.923076923077 0.357142857143 0.0 3.0 6.0 3.0 1.0 1.0 0.0 2.0 5.0 13.0 0.243243243243 0.0 3.0 2.0 0.510989010989 0.375 0.875 1.0 0.6875 0.75 0.75 0.3125 0.75 0.625 0.375 0.0 0.25 0.6875 0.4375 0.0 0.4375 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.0 1.0 0.5 0.25 0.75 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 0.75 0.25 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -11.1863188573 3.45593590714 -26.1345817121 10.2517758992 1.23751088404 3.45036780417 -22.7174951942 26.676294284 0.901507119642 3.84056114207 -15.7461829868 46.4201380453 -0.546855334019 -0.195997630217 -16.518098595 44.5765764334 0.463861288881 -2.29482766667 -15.2427478266 24.0429791326 -0.75558667977 -0.899648563215 -23.7448397478 8.2363872737 -0.410873448331 -0.381165812958 3 1 8 9 3 12 3 5 2 5 3 3 4 5 3 3 6 4 2 3 6 4 2 3 7 8 7 7 8 6 10 5 10 4 12 2 13 2 13 2 13 2 13 1 13 2 13 2 10 5 9 5 12 1 11 0 330.0 0.681818181818 111.0 0.756756756757 0.143232323232 0.115289256198 0.0388955394162 0.0740685366057 0.0274905250856 0.0116693550776 0.00787799323778 0.00258669137111 0.0448110095892 0.333333333333 0.318181818182 2.0 3.0 0.0 0.0 5.0 2.0 0.0 0.0 3.0 6.0 0.27027027027 0.0 6.0 2.0 0.336363636364 0.666666666667 0.0833333333333 0.0 0.208333333333 0.708333333333 0.791666666667 0.333333333333 0.541666666667 0.25 0.833333333333 0.625 0.25 0.75 0.541666666667 0.0416666666667 0.0 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.333333333333 0.5 0.833333333333 1.0 1.0 0.833333333333 0.5 0.5 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 0.833333333333 0.0 0.0 0.0 0.666666666667 1.0 0.833333333333 0.5 0.333333333333 -8.04455894174 16.2627414578 -15.9715862612 35.2319453875 4.0047018776 -4.59827448279 -8.93346548886 29.1380060541 -3.11357857625 5.15061183497 -10.4900739094 42.8770795524 3.8513569838 -0.948057027395 1.28040950972 46.0145060841 -2.11368427637 0.263221787127 0.379043010769 41.6852146289 1.76971360767 -0.347981621565 4.30910926955 40.8338760047 -0.328387708221 -0.00649643164802 2 2 1 1 2 5 2 4 4 3 33 2 3 4 2 5 3 4 4 4 3 3 4 3 5 3 3 3 4 3 4 4 3 4 2 6 147.0 0.333333333333 63.0 0.873015873016 0.186588921283 0.22967282151 0.0201408898975 0.332518920845 0.0609912158672 0.00254618040231 0.0302875640714 0.00575010982094 0.500903218011 1.28571428571 204522252.048 0.0 2.0 1.0 3.0 0.0 4294967293.0 0.0 0.0 1.0 2.0 0.315789473684 0.0 6.0 1.0 0.428571428571 0.166666666667 0.25 0.25 0.0833333333333 0.5 0.333333333333 0.583333333333 0.5 0.666666666667 0.416666666667 0.916666666667 0.916666666667 0.583333333333 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 -3.51656636165 -2.97089227105 -5.48821523952 -2.6873363576 3.31446484661 6.67924884595 -0.902923302855 20.3167364629 -3.93040387307 1.14434001088 -8.17105161157 31.7407249907 3.60236297402 0.116003737289 -0.22768567696 32.9907446639 -2.83076429274 0.61893065509 -7.14398338482 36.1188749135 1.6537369396 -0.593389539989 -4.84759004042 29.1485056527 -0.295503619125 -0.309069281159 1 4 10 5 12 3 12 3 12 4 11 3 13 2 12 3 3 2 7 3 4 3 5 3 5 3 4 3 5 3 4 3 6 2 4 3 6 2 4 2 6 3 4 2 6 3 4 2 6 3 4 2 6 3 3 3 7 2 3 3 6 4 1 6 3 12 9 0 315.0 0.714285714286 107.0 0.869158878505 0.129735449735 0.185034013605 0.0420668434334 0.133170931865 0.0541502357557 0.0165779151947 0.0213816032597 0.0176700010099 0.10546413622 0.4 0.619047619048 3.0 2.0 0.0 0.0 0.0 3.0 5.0 5.0 1.0 4.0 0.216216216216 2.0 0.0 2.0 0.339682539683 0.625 0.458333333333 0.5 0.75 0.541666666667 0.5 0.375 0.416666666667 0.0 0.125 0.0 0.0416666666667 0.0 0.416666666667 0.666666666667 0.625 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.666666666667 0.666666666667 0.5 0.5 0.5 0.166666666667 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.0 -9.03393772217 -6.4874586327 -22.5258157798 -16.2053098637 -0.113011867592 -0.45782179937 -17.7320143223 -15.6078897502 4.57889543766 2.66249347097 -3.73140052629 -2.63632829357 -5.22985590514 -0.173049230187 -21.7415432096 1.84595866396 3.30920189332 0.694610432722 -4.80774143175 5.31692864836 1.17392390954 -0.316438303723 7.03276534487 2.73016950001 -0.788382201898 -0.128968516803 2 6 4 4 1 5 2 3 4 3 2 2 5 3 2 1 5 4 8 4 9 3 4 2 3 3 3 2 4 3 2 3 4 4 1 3 3 17 2 3 3 2 3 0 156.0 0.923076923077 80.0 0.725 0.228098290598 0.248027613412 0.0805483382222 0.116171410088 0.0557280867007 0.0186585671925 0.0091116493943 0.00994767910231 0.0240483665994 0.75 0.692307692308 3.0 4.0 2.0 0.0 2.0 2.0 2.0 2.0 3.0 11.0 0.114285714286 1.0 2.0 1.0 0.512820512821 0.75 0.25 0.5 0.916666666667 0.5 0.0 0.333333333333 0.583333333333 0.416666666667 0.166666666667 0.0 0.333333333333 0.75 0.833333333333 0.666666666667 0.833333333333 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.25 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.25 0.5 0.25 0.0 0.0 1.0 0.75 0.5 0.75 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.88147353097 -1.17529804129 -1.6731911748 -1.65225227357 -4.86983700246 2.13500886791 -13.383227181 8.23788342292 3.34358733674 2.50453992113 -4.31179209276 21.0672971837 -0.947931469335 -0.48128391024 -0.920398520259 20.1199701433 1.31307268938 -0.321059051286 6.16057791163 16.7174411912 0.579625370411 0.356521498296 17.2417273259 19.5431033126 0.205079830398 0.0870939544971 10 2 2 4 4 5 1 4 4 5 2 4 4 4 2 3 5 3 3 3 6 3 2 3 5 4 2 3 5 4 3 2 6 3 2 3 5 3 4 3 4 4 2 4 3 6 1 13 3 4 1 5 1 0 196.0 1.0 104.0 0.663461538462 0.259839650146 0.270772594752 0.105666404942 0.110642010344 0.0651069335481 0.0272982942199 0.0103848092618 0.00876601170761 -0.00283978651292 0.571428571429 0.857142857143 2.0 1.0 3.0 2.0 2.0 3.0 3.0 2.0 4.0 4.0 0.264705882353 0.0 1.0 2.0 0.530612244898 0.6875 0.75 0.6875 0.6875 0.25 0.3125 0.25 0.5625 0.3125 0.1875 0.1875 0.5 0.875 0.875 0.875 0.9375 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.25 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 0.75 0.5 0.5 0.5 0.5 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 -0.545674090601 -2.63742477124 -6.54367912828 -4.54588153059 -7.08262697188 2.93903034852 -25.9159963016 7.09910303415 3.78937815478 1.98165754275 -12.8057473171 19.2047175657 0.638494745815 0.0804107930782 -4.12168661602 22.3366805266 -1.31030907344 0.485960393765 -13.2528045431 25.6254305464 0.198732192571 0.251236379816 -13.7179540617 29.4214176787 0.0736483132782 0.0931822210514 3 2 5 5 2 6 3 6 3 5 3 5 3 5 3 5 2 5 2 5 2 6 2 0 88.0 0.727272727273 55.0 0.454545454545 0.319602272727 0.29958677686 0.0658207527235 0.139762161908 0.0512038645755 0.00501548167072 -0.00457347338398 -0.00246735254991 0.011553883093 0.25 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.0 0.0 6.0 1.0 0.625 0.166666666667 0.166666666667 0.0 0.0 0.5 0.5 0.0 0.166666666667 0.833333333333 0.833333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.56261216854 3.12522433708 -4.95071660127 8.04901729212 -1.62574801373 0.794937687209 -9.58439624475 11.1963018705 0.967754868277 -0.0138272718812 -5.53041302678 10.9348097167 0.180699279447 -0.0959016622313 -4.11000375983 8.80843864138 -0.701684775937 -0.699136965739 -7.77240937761 1.15084652892 0.567831453825 -1.03097136385 -3.99077126674 -10.5464057701 0.0359174239963 -0.144165086584 8 1 9 10 5 12 4 6 2 5 4 4 4 5 3 3 6 4 3 3 6 5 2 3 7 4 2 3 7 4 2 4 6 3 3 4 6 3 3 4 5 4 3 5 3 4 5 9 7 3 12 4 12 4 12 4 12 4 12 4 10 8 8 8 9 1 1 1 1 1 10 0 368.0 0.695652173913 154.0 0.668831168831 0.170855978261 0.178757088847 0.0487203315063 0.110574433374 0.0318918247745 0.0161447240161 0.00314202213812 0.00349449701969 0.0669513545983 0.6875 0.521739130435 2.0 5.0 4.0 0.0 2.0 5.0 2.0 0.0 4.0 10.0 0.230769230769 0.0 2.0 2.0 0.41847826087 0.5 0.5 0.416666666667 0.583333333333 0.708333333333 0.583333333333 0.833333333333 0.791666666667 0.458333333333 0.0 0.208333333333 0.0833333333333 0.666666666667 0.333333333333 0.375 0.0 0.166666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.5 0.5 0.5 0.5 0.166666666667 0.333333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 0.666666666667 0.5 0.833333333333 1.0 1.0 1.0 0.666666666667 0.833333333333 0.166666666667 0.0 0.333333333333 0.666666666667 0.833333333333 0.5 0.666666666667 0.5 0.0 0.0 0.0 0.166666666667 0.5 0.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.0 -12.6770372063 15.8324569476 -27.6295575462 38.8596771978 4.11377658774 0.873802103932 -16.6168289897 42.3006382742 -0.935852607026 -1.474689292 -17.9163505621 34.1059109786 -1.7268476943 0.630524187531 -24.992932725 30.0087606708 2.20116942255 -1.84484246493 -14.4968787495 21.3725134389 -1.1204946519 1.05195566287 -16.7735674826 20.5252120404 0.123144081024 -0.415839659579 3 1 5 1 3 1 10 4 3 5 7 7 3 5 4 4 1 4 5 4 4 2 4 3 5 4 4 2 4 3 5 4 4 2 5 2 5 5 3 1 6 3 3 6 2 2 6 4 2 1 1 4 2 1 7 7 3 4 10 5 3 4 11 3 4 4 11 3 5 3 11 2 6 2 21 1 6 0 330.0 1.46666666667 123.0 0.894308943089 0.169421487603 0.153535353535 0.102327406294 0.0424214597768 0.0457417146673 0.0431216197148 0.0100417341275 0.012301078979 -0.00480196816859 0.0909090909091 1.6 0.0 2.0 0.0 0.0 6.0 6.0 6.0 3.0 0.0 8.0 0.404255319149 0.0 4.0 3.0 0.372727272727 0.625 0.5 0.458333333333 0.166666666667 0.333333333333 0.166666666667 0.5 0.666666666667 0.541666666667 0.708333333333 0.708333333333 0.458333333333 0.208333333333 0.291666666667 0.25 0.333333333333 0.166666666667 0.666666666667 0.833333333333 0.5 0.333333333333 0.166666666667 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.333333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.666666666667 0.5 0.333333333333 0.333333333333 0.333333333333 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 -7.81306084269 9.60717111027 -19.6541491107 21.7297875267 -0.586517652792 -1.7493890439 -18.3166968133 17.7764787784 3.46271027366 -0.686565752081 -4.34624046111 5.1945573444 -1.79300551609 -2.52837913556 -6.77434563964 -2.68569037675 1.24900203876 3.04958031165 -2.71683997622 6.91402097506 -0.0827172364067 -2.55545009146 1.56141268129 -2.85516847317 0.0597585198255 0.270715684879 6 5 5 8 3 9 3 3 8 3 9 3 9 3 9 3 8 4 7 8 4 8 5 4 8 4 8 4 8 4 9 3 9 3 9 3 8 4 8 5 6 7 5 4 1 2 5 1 11 0 276.0 0.521739130435 105.0 0.638095238095 0.12288647343 0.170762444865 0.0217499273231 0.154334051731 0.0211023518382 0.00582547443469 0.00695532688421 -0.000435697074062 0.156096014447 0.583333333333 0.0434782608696 2.0 2.0 3.0 0.0 0.0 0.0 0.0 1.0 2.0 12.0 0.142857142857 2.0 3.0 1.0 0.380434782609 0.111111111111 0.611111111111 0.666666666667 0.555555555556 0.611111111111 1.0 1.0 1.0 0.611111111111 0.555555555556 0.444444444444 0.5 0.5 0.222222222222 0.111111111111 0.0555555555556 0.0 0.0 0.0 0.166666666667 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.166666666667 0.5 0.666666666667 1.0 1.0 1.0 0.666666666667 0.166666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.833333333333 0.666666666667 0.5 0.5 0.833333333333 0.5 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 -15.749419586 5.75725707185 -27.0486649082 15.2268246716 14.481830977 2.97950820397 9.92606999886 31.927943547 -6.83635682534 4.34366142597 -2.66248240266 47.8625929612 1.97377442085 -2.81400024872 -2.40005361918 36.448746897 0.824963121078 -0.215183399856 6.40601044856 22.2043215266 -1.57297121985 -1.8816518127 -4.60805460097 10.1067754442 0.251332731325 0.29732780939 4 1 10 5 10 5 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 4 3 4 4 5 3 3 4 5 3 3 4 6 2 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 4 3 6 2 3 4 6 3 2 4 5 4 1 5 4 6 2 2 6 1 4 0 345.0 0.652173913043 115.0 0.791304347826 0.11652173913 0.181474480151 0.0344050482635 0.141462425687 0.0525026711597 0.0138622472844 0.024313021603 0.0171756312556 0.126247040005 0.0666666666667 0.565217391304 3.0 4294967295.0 4294967295.0 0.0 0.0 0.0 5.0 5.0 3.0 8.0 0.0697674418605 1.0 0.0 2.0 0.333333333333 0.708333333333 0.5 0.625 0.583333333333 0.458333333333 0.5 0.5 0.5 0.0 0.0416666666667 0.0416666666667 0.0 0.0 0.125 0.625 0.541666666667 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.833333333333 0.833333333333 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -13.2859778581 -8.13766143809 -29.1140933864 -18.1239613792 4.76436672908 2.53601439361 -12.3832822256 -7.95639847805 1.11987517384 2.48474826404 -11.8638308032 6.46058562026 -6.28309022316 -0.413571061097 -36.693860627 8.77233283675 5.33873335687 0.52902250491 -13.3020589654 6.43326682833 -1.6517045481 -1.80028306872 -16.3257410612 -5.68449799295 -0.377856288962 0.189759378333 9 3 10 5 11 3 11 3 11 3 11 3 11 3 10 4 5 1 2 6 4 2 5 3 3 3 5 3 2 4 5 2 2 4 7 1 3 3 6 3 1 4 7 2 1 6 4 3 2 5 4 3 2 5 4 4 2 5 2 5 3 11 4 5 1 4 294.0 0.666666666667 124.0 0.693548387097 0.228862973761 0.24732750243 0.0710323835212 0.174857107913 0.0683091228995 0.0189063218953 0.0181569297879 0.0111083378303 0.104849237033 0.714285714286 0.571428571429 1.0 1.0 5.0 3.0 0.0 2.0 5.0 4.0 6.0 8.0 0.239130434783 2.0 2.0 3.0 0.421768707483 0.0 0.125 0.833333333333 0.541666666667 0.0 0.208333333333 0.416666666667 0.833333333333 0.125 0.166666666667 0.0 0.375 0.791666666667 0.833333333333 0.583333333333 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.5 0.833333333333 0.833333333333 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 0.5 0.833333333333 0.0 0.0 0.0 0.166666666667 0.5 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.0 -0.545674090601 -12.5505040838 -1.21898006035 -29.1078120428 0.933379037815 2.96924246276 6.8216176119 -11.00949329 3.66400815693 8.64557434806 19.1515569611 32.1693671998 -3.23814398273 -1.33091235829 5.55451165304 34.3902377452 0.413557144361 -0.543059785382 1.48812768094 24.5934079066 -0.0472105580578 -0.569855562629 0.417011813798 13.8214162995 -0.280961969611 -0.530661146328 12 1 20 5 18 5 18 5 17 6 17 7 15 8 15 9 13 10 13 3 3 4 13 3 4 3 12 4 3 5 11 4 2 6 11 4 1 8 9 3 7 4 9 2 9 3 8 3 9 4 7 4 8 4 6 5 8 4 4 7 6 8 1 9 5 9 1 3 11 5 3 0 506.0 1.04545454545 177.0 0.61581920904 0.17649080598 0.195292849443 0.0776696298328 0.0927741942416 0.063065766999 0.0256667609387 0.0180938805947 0.0187821487924 0.0268807467609 0.304347826087 0.590909090909 0.0 2.0 5.0 0.0 0.0 1.0 5.0 5.0 3.0 12.0 0.283018867925 2.0 2.0 3.0 0.349802371542 0.0 0.0 0.0555555555556 0.527777777778 0.194444444444 0.5 0.555555555556 0.472222222222 0.75 0.805555555556 0.416666666667 0.111111111111 0.0277777777778 0.277777777778 0.527777777778 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.444444444444 0.777777777778 0.0 0.0 0.111111111111 0.444444444444 0.666666666667 0.888888888889 0.888888888889 0.444444444444 0.222222222222 0.444444444444 0.777777777778 1.0 0.777777777778 0.666666666667 0.444444444444 0.0 0.777777777778 1.0 1.0 1.0 0.333333333333 0.111111111111 0.333333333333 0.0 0.777777777778 1.0 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.0 0.222222222222 0.333333333333 0.555555555556 0.888888888889 1.0 1.0 0.888888888889 0.444444444444 -0.166074723226 -0.138395602689 -1.59837208155 -7.84821841944 -1.10413005971 -9.8121697454 -1.73339079227 -31.3449802946 2.2365213263 8.26533517848 2.51595837054 1.13130452744 -2.37813261843 0.641907515225 -1.44112189638 10.9022800278 2.56042438341 -3.27698676461 5.38551890916 -4.25703111843 -2.05888440019 3.69868284471 -0.656858011784 15.7706478534 0.336817517715 -0.218721165992 1 3 6 6 8 2 10 2 10 1 11 1 11 1 3 9 2 10 2 10 3 9 3 9 4 5 3 1 4 1 5 3 9 6 3 4 0 180.0 0.8 97.0 0.546391752577 0.219444444444 0.224444444444 0.063512345679 0.113512345679 0.0390802469136 0.0151658166583 0.0101516872717 0.00561121168082 0.0421274951352 0.75 0.133333333333 1.0 3.0 3.0 2.0 0.0 0.0 0.0 2.0 2.0 7.0 0.269230769231 1.0 3.0 1.0 0.538888888889 0.333333333333 0.916666666667 0.833333333333 0.916666666667 0.833333333333 0.833333333333 0.166666666667 0.583333333333 1.0 0.75 0.0 0.166666666667 1.0 0.75 0.0 0.25 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -11.7562451297 8.31849835894 -29.9101899021 21.3736591979 -2.10905057032 2.56911445915 -36.062295479 35.1736979984 2.67190837967 3.43059986239 -20.5777891616 51.6013098526 1.10195595112 0.283922055575 -10.5351589425 54.3393339817 -0.721900180128 -0.820721473805 -14.837370959 50.1224936474 -0.365541964251 1.38655327557 -20.5401996595 60.4605553982 -0.141663804252 0.115254715718 2 7 2 1 3 5 6 4 6 3 7 3 5 6 3 2 1 4 1 2 4 6 3 7 3 14 1 3 2 4 8 1 1 0 130.0 0.769230769231 72.0 0.638888888889 0.308461538462 0.262721893491 0.091010013655 0.130033682294 0.0581319981793 0.0133815611076 0.00486264107633 0.0041282215997 -0.000505761014356 1.0 0.461538461538 1.0 3.0 3.0 0.0 1.0 0.0 3.0 2.0 8.0 8.0 0.189189189189 1.0 3.0 2.0 0.553846153846 0.166666666667 0.0 0.666666666667 0.666666666667 0.25 0.25 0.416666666667 0.5 0.583333333333 0.583333333333 0.333333333333 0.416666666667 1.0 1.0 0.916666666667 0.833333333333 0.25 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.5 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.75 0.25 0.0 0.0 0.5 0.75 0.25 0.0 1.0 0.75 0.5 0.5 0.75 0.75 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.930444282691 -0.0979415034412 -0.684772295831 0.958767207154 -3.72554411167 2.16224703751 -9.18053667706 10.8741292727 3.0880447484 2.13735101444 1.30806202984 20.6365434317 -0.152740502348 -1.05083215003 6.13375352334 17.3279793999 0.0849833333227 0.437653918222 5.1983312243 18.1628718727 0.205628432505 0.125675164989 10.0498575603 19.0710176081 0.261789814012 -0.0976085929646 4 1 6 8 2 19 1 9 2 8 4 5 1 0 70.0 1.42857142857 50.0 0.38 0.355714285714 0.330612244898 0.135361516035 0.0577725947522 0.054029154519 0.0119591956198 -0.0010972009468 -0.00339749581406 -0.0937422228761 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 5.0 0.0769230769231 0.0 2.0 3.0 0.714285714286 0.333333333333 0.666666666667 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 4.3290144521 -5.93524729363 9.90890341246 -1.60937478455 -0.919278951299 -12.1444980279 6.13223610041 -0.368730172155 -1.16297700016 -13.8115684452 -0.160640096034 0.578081311059 0.626733067303 -9.32414476107 2.72140028572 0.458407020514 0.260158566091 -4.64366726754 5.03382019616 -0.0052947383301 -0.358119264582 -4.09148574871 2.84402134748 -0.0439727477215 0.0736197871937 8 3 8 7 6 8 5 2 3 4 5 2 7 2 3 2 8 1 2 3 11 3 11 3 10 5 1 1 6 9 6 5 10 4 11 3 11 2 12 2 12 1 13 1 13 1 12 3 10 6 14 1 6 0 308.0 0.636363636364 84.0 1.04761904762 0.0987940630798 0.107438016529 0.0247384909744 0.0808238396786 0.0196290574832 0.00853130192749 0.0076869613489 0.0017637465979 0.0626546931887 0.714285714286 0.181818181818 2.0 3.0 3.0 0.0 2.0 2.0 0.0 0.0 0.0 8.0 0.236842105263 2.0 3.0 1.0 0.272727272727 0.125 0.583333333333 0.5 0.375 0.458333333333 0.625 0.708333333333 0.458333333333 0.5 0.166666666667 0.125 0.0416666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.5 0.833333333333 0.833333333333 0.166666666667 0.0 0.0 0.333333333333 0.666666666667 1.0 1.0 1.0 0.666666666667 0.5 0.166666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.666666666667 0.5 0.5 0.833333333333 1.0 0.833333333333 0.333333333333 0.666666666667 0.333333333333 0.0 0.0 0.5 0.666666666667 0.333333333333 0.0 0.666666666667 0.333333333333 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.833333333333 0.5 0.0 0.0 0.5 0.333333333333 0.0 0.0 -12.2693992493 11.1697832788 -20.9169488259 27.0336055133 11.4696785435 0.625379678716 8.12941483716 32.5758780465 -5.77444740903 0.907617303735 -4.79390289266 31.5574621036 0.731652154213 -1.38620321935 -9.94780191758 25.9416059374 0.880501898436 0.481303591303 0.180161623246 20.3407218779 -0.124831107082 -1.83074861677 0.638868525545 10.3417467648 0.0511098348024 0.315137552021 1 3 7 5 5 1 3 3 4 4 3 2 3 6 2 2 2 7 6 7 6 8 2 1 2 8 2 1 2 7 2 2 2 7 2 2 2 6 3 4 1 4 3 9 3 10 1 12 1 5 0 195.0 0.866666666667 69.0 1.0 0.169230769231 0.126495726496 0.0742458908613 0.0616949038251 0.042103879027 0.0302708395797 0.0146439799667 0.0145180806966 0.0176922286636 0.384615384615 0.733333333333 0.0 1.0 2.0 2.0 2.0 3.0 3.0 1.0 2.0 9.0 0.242424242424 1.0 1.0 2.0 0.353846153846 0.5625 0.6875 0.5625 0.3125 0.6875 0.0625 0.0 0.0625 0.5 0.0 0.0 0.375 0.5 0.625 0.5 0.5 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.18835690842 6.62084563262 -6.64639272919 20.2006707513 -5.25140576673 6.20209129347 -21.7272725168 40.9169681113 2.58115312244 -1.15797521222 -10.8736256671 36.3749849521 1.49667940814 -1.50304458587 -0.842383482882 24.1944359221 -1.96963680371 0.161315279504 -11.8085854073 19.4934325768 0.683624608671 -1.42037678807 -7.94559349325 4.96665798149 0.29528993578 -0.348795986594 13 4 14 6 13 6 14 5 14 4 6 1 8 5 4 2 8 4 4 3 8 4 4 4 8 3 3 8 5 3 2 9 5 4 1 7 7 3 3 5 7 4 4 3 8 4 3 4 8 4 3 4 8 4 3 4 8 4 3 4 8 4 3 4 4 2 2 4 3 17 3 17 2 7 2 8 4 3 5 5 2 0 437.0 0.826086956522 200.0 0.57 0.233409610984 0.257486817232 0.0861992852471 0.137411593982 0.064297255621 0.0247253845233 0.0136905257929 0.00999568486613 0.0449397844513 0.526315789474 0.739130434783 1.0 3.0 1.0 3.0 0.0 5.0 5.0 4.0 1.0 6.0 0.181818181818 1.0 1.0 2.0 0.45766590389 0.0333333333333 0.6 0.833333333333 0.766666666667 0.0333333333333 0.5 0.433333333333 0.466666666667 0.0666666666667 0.0666666666667 0.0333333333333 0.4 0.866666666667 0.7 0.733333333333 0.866666666667 0.0 0.0 0.0 0.222222222222 0.666666666667 0.888888888889 0.555555555556 0.666666666667 0.0 0.0 0.333333333333 0.888888888889 1.0 1.0 1.0 1.0 0.0 0.0 0.222222222222 0.444444444444 0.888888888889 0.888888888889 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.666666666667 0.444444444444 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.111111111111 0.0 0.0 0.222222222222 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.888888888889 0.777777777778 0.666666666667 0.555555555556 0.333333333333 0.444444444444 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -6.36619772368 -14.5038591618 -17.7173188825 -35.4370341418 -2.26267653787 -0.188783113233 -16.6672792223 -33.561208443 8.48951655965 4.04294404859 23.0366236701 -13.4659218092 -0.120690172971 -1.37499536504 26.0043726684 -16.5430574936 -4.25744954068 -0.447386958199 -5.97278509761 -20.4469435769 0.886004157314 1.07320182682 -5.09258629313 -11.5110306014 0.287394275877 -0.0167746565084 1 5 2 6 4 4 4 4 4 4 4 4 5 3 5 3 5 3 5 3 5 3 5 3 5 4 4 4 4 3 5 3 5 3 5 3 5 4 3 6 160.0 0.4 75.0 0.586666666667 0.22421875 0.2146875 0.0276638183594 0.243640380859 0.0633474121094 0.00262678630648 0.026504221558 0.00534535302226 0.278389535231 0.25 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 2.0 0.16 0.0 9.0 1.0 0.46875 0.3 0.0 0.0 0.0 0.7 0.2 0.0 0.0 1.0 0.7 0.5 0.5 1.0 1.0 1.0 1.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.22816920329 1.84619733987 -4.06611292429 5.47590531432 1.56576633014 1.52629590425 -1.01252953005 11.2524533256 -1.19383714363 0.696796256351 -2.71853905042 18.1312796976 0.856091056849 1.74471342385 -2.26514441475 27.6258965367 -0.928705168672 -0.562702266709 -3.98316926908 24.6941955326 0.855953106836 -0.837270190957 -2.00004596663 12.4752508843 -0.211456214782 -0.354247285982 5 5 7 9 4 4 1 5 3 3 5 4 1 4 6 7 7 7 8 6 8 6 8 6 8 7 6 3 2 4 4 3 4 4 3 3 9 2 5 0 196.0 1.0 92.0 0.70652173913 0.218658892128 0.201166180758 0.100772212258 0.0814605309012 0.0471471283224 0.0354593813014 0.00897754706909 0.0128190701453 0.00523505247003 0.5 0.785714285714 0.0 3.0 3.0 1.0 1.0 3.0 3.0 3.0 2.0 10.0 0.2 2.0 1.0 2.0 0.469387755102 0.375 0.8125 0.75 0.75 0.625 0.125 0.0 0.375 0.75 0.0625 0.0 0.125 0.6875 0.75 0.5 0.6875 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.909456817668 5.63863226954 -3.09630681514 16.5923632812 -8.17211911876 4.74216769213 -32.8499062653 35.1491280423 -1.88698085322 1.45925963768 -43.9695567683 42.8244164093 2.6987645411 -1.02636398243 -28.4128678804 34.8487294829 -0.464344487648 -0.979687430348 -27.9251646202 24.6231439145 -0.758700980466 -0.0345040938636 -34.3857949068 23.4385244225 0.150570760703 0.177740259168 1 4 8 3 18 2 10 4 2 1 5 5 2 1 4 9 4 9 5 8 5 8 5 9 5 4 2 3 10 4 8 7 4 11 1 5 0 195.0 0.866666666667 98.0 0.581632653061 0.195266272189 0.202051282051 0.0644434329641 0.0945645071562 0.0361806503818 0.0199742251187 0.0116010225139 0.00382730942953 0.02881087712 0.615384615385 0.266666666667 0.0 2.0 3.0 3.0 1.0 2.0 0.0 0.0 4.0 10.0 0.151515151515 1.0 2.0 1.0 0.502564102564 0.625 1.0 1.0 0.625 0.875 0.4375 0.4375 0.8125 0.625 0.0 0.0 0.5 0.8125 0.25 0.0 0.4375 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -13.1568086289 3.90460127052 -30.3416868383 16.3981839694 2.00323021705 10.1859163579 -24.6014864288 49.5823674048 1.10047298975 -1.77902268859 -14.7487828097 42.9675884991 -0.0327214668563 -3.38469533267 -12.6053905885 18.8603793703 0.397291885967 0.818631132029 -9.58557044809 16.7120514006 0.221364297577 -1.04745520276 -2.67565165324 6.8983444774 0.491738060415 -0.422326653511 7 2 8 4 3 3 3 3 2 2 5 2 1 2 7 1 1 2 8 3 8 3 8 3 8 3 9 2 9 3 5 1 3 5 1 2 4 7 5 5 9 1 3 0 176.0 0.6875 59.0 1.06779661017 0.13791322314 0.164772727273 0.044871799575 0.1197290571 0.0431653831705 0.0169042199986 0.0214794130568 0.010015673997 0.087427427793 0.545454545455 0.3125 0.0 1.0 1.0 2.0 2.0 1.0 1.0 1.0 1.0 5.0 0.478260869565 2.0 1.0 1.0 0.335227272727 0.166666666667 0.666666666667 1.0 0.666666666667 0.416666666667 0.416666666667 0.333333333333 0.583333333333 0.166666666667 0.0 0.0 0.25 0.5 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.5 0.5 0.5 0.5 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -7.40070485377 1.0345071301 -14.6675752761 8.00877272948 4.95276505524 8.12094314116 3.17424182636 34.6554841152 1.86577454412 -1.21317516474 13.8861331128 28.4536828374 -2.4006189341 -4.26105813287 0.496207753931 0.289477596199 -0.10251848989 0.803191487256 -3.47258252083 0.205470425498 0.593388281829 0.534319503161 1.19884466273 5.02698421956 -0.0953558179175 -0.335292420301 3 1 7 3 6 3 4 5 2 1 1 15 3 5 5 4 5 3 6 4 5 4 5 3 6 3 6 4 6 6 3 4 6 2 4 0 153.0 0.529411764706 70.0 0.728571428571 0.148874364561 0.210688196847 0.0230820110806 0.160247287717 0.0383934227855 0.00467986999085 0.0124773924673 0.00354855387165 0.159368281232 0.555555555556 0.0588235294118 0.0 0.0 3.0 2.0 1.0 0.0 0.0 0.0 1.0 7.0 0.206896551724 1.0 2.0 1.0 0.457516339869 0.533333333333 0.866666666667 0.666666666667 0.4 0.866666666667 0.933333333333 0.8 0.866666666667 0.4 0.466666666667 0.133333333333 0.466666666667 0.266666666667 0.2 0.0 0.133333333333 0.0 0.666666666667 1.0 0.666666666667 0.5 0.5 0.333333333333 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 0.333333333333 0.666666666667 0.833333333333 0.333333333333 0.333333333333 0.166666666667 0.5 0.833333333333 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 -10.4855021331 4.86826884752 -18.793603815 11.7374914442 8.53767627962 0.106254470454 2.69379448708 13.074333084 -3.93905023305 0.0497465334496 -2.85516034904 11.2151336267 1.70260746473 -0.664943791922 -0.578001758559 6.39566686303 0.0791118395705 -0.234360150236 4.17353490746 4.08413412189 -0.561204306072 0.151806554076 -2.45998675469 2.10006284042 0.00823188194774 -0.305449282743 2 3 11 6 10 6 12 4 12 4 12 4 12 4 12 4 13 3 3 3 6 10 6 6 2 3 5 4 4 4 4 4 5 4 3 3 7 2 4 3 7 3 3 3 6 3 4 3 6 4 2 4 6 4 2 4 6 4 1 6 5 4 1 6 5 12 2 7 352.0 0.727272727273 151.0 0.58940397351 0.169744318182 0.24083161157 0.0523759596873 0.154584831622 0.0657914962023 0.0183834393295 0.019826242185 0.0187647704211 0.112238587653 0.625 0.590909090909 3.0 2.0 3.0 2.0 0.0 1.0 5.0 5.0 8.0 7.0 0.183673469388 1.0 1.0 2.0 0.428977272727 0.666666666667 0.458333333333 0.5 0.75 0.708333333333 0.833333333333 0.666666666667 0.583333333333 0.0 0.291666666667 0.0833333333333 0.0 0.0 0.375 0.5 0.5 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.333333333333 0.5 0.5 0.5 0.833333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -12.2693992493 -11.1119087541 -28.224272364 -29.5957367008 2.56034984334 -3.13239886494 -17.3810328631 -34.909305658 2.86185789444 5.02171887252 -6.22191041786 -18.1048497865 -3.98342414202 -3.24749943338 -20.9395551369 -21.3509837553 2.48005687788 3.23416490757 -10.6454496533 -9.87668993381 -0.00932826999173 -1.88266764039 -6.72273139191 -18.7054519433 -0.399079036133 -0.22012278965 3 1 7 2 7 2 6 4 4 8 1 13 1 1 1 1 2 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 8 3 4 2 0 153.0 0.529411764706 68.0 0.705882352941 0.150326797386 0.217993079585 0.0264403082776 0.175563445935 0.0431407729053 0.00658228941005 0.0154543960409 0.0061639383435 0.1850440213 0.555555555556 0.117647058824 0.0 0.0 2.0 2.0 0.0 2.0 0.0 0.0 2.0 5.0 0.241379310345 0.0 3.0 1.0 0.444444444444 0.466666666667 0.866666666667 0.666666666667 0.533333333333 0.733333333333 0.8 0.666666666667 0.733333333333 0.266666666667 0.466666666667 0.0 0.4 0.133333333333 0.4 0.0 0.266666666667 0.0 0.5 1.0 0.666666666667 0.5 0.5 0.5 0.333333333333 0.333333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.833333333333 0.0 0.5 0.833333333333 0.166666666667 0.0 0.0 0.0 0.666666666667 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.666666666667 0.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.5 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.333333333333 -9.58674480742 2.09710042662 -17.4201686394 2.87229030042 7.68245737108 -2.79164184325 3.1407563619 -2.98773132795 -2.6725514669 2.97111854791 0.854192816713 10.4554825773 0.840617372307 1.25560477249 0.656170125416 17.8952741121 0.154938325591 -2.44431682364 2.13221306517 0.456537017829 -0.982317101208 -0.273795045024 -4.843182165 -5.67494374059 0.198662486001 0.22888421223 3 1 5 3 4 5 1 6 2 14 2 6 3 4 3 4 4 4 3 4 5 3 3 4 5 2 4 4 5 3 3 3 6 3 3 3 6 3 3 4 5 3 2 5 4 5 1 6 2 6 1 5 3 6 210.0 1.07142857143 119.0 0.571428571429 0.269523809524 0.268707482993 0.108540006479 0.100092862542 0.0586200194363 0.0285783557225 0.00856922894258 0.00922462463401 -0.0166293668364 0.4 0.928571428571 1.0 1.0 1.0 1.0 2.0 3.0 3.0 3.0 1.0 5.0 0.111111111111 0.0 1.0 2.0 0.566666666667 0.6875 0.5625 0.5 0.625 0.75 0.8125 0.625 0.75 0.5625 0.0625 0.0 0.125 0.875 0.625 0.5 0.6875 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.25 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.14065754368 3.69239467973 -9.04599311477 9.44283641114 -1.97719954191 0.73395186201 -14.3395371233 11.4629194356 1.70324450097 -1.13648418623 -6.1886873854 3.59765554935 0.518759712534 -1.55126736867 -2.40522749247 -8.54603600985 -1.28360913585 -0.528251748359 -12.6605236468 -14.8128733604 -0.783080024301 -0.0836578698216 -24.4344526951 -18.0806616445 -0.272334437119 -0.252521933264 9 1 6 3 2 6 3 5 1 7 3 4 4 4 4 3 5 4 3 3 6 2 4 2 6 4 3 2 7 2 4 3 5 4 3 2 6 3 4 2 7 2 3 3 6 4 2 4 4 6 1 4 4 5 1 0 210.0 1.07142857143 94.0 0.851063829787 0.213968253968 0.213945578231 0.100199114566 0.0896824317028 0.0600727783177 0.0342694207488 0.0143107452796 0.0165301852539 0.00952433544087 0.6 0.928571428571 1.0 1.0 1.0 3.0 2.0 3.0 3.0 3.0 1.0 4.0 0.161290322581 1.0 0.0 2.0 0.447619047619 0.625 0.5625 0.5 0.625 0.4375 0.4375 0.3125 0.3125 0.625 0.0625 0.0 0.0625 0.75 0.75 0.6875 0.75 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 0.75 0.5 0.75 0.0 0.25 0.5 0.5 0.5 0.25 0.0 0.25 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -0.509295817894 3.98948390684 -6.2093046276 9.63026771497 -6.84719932946 -0.238803150168 -25.5567203002 7.0360753578 3.24757193982 -2.3325916129 -13.9844643896 -6.87170910021 0.99458756212 -1.36955369479 -5.42875970351 -19.4032846973 -2.12759716716 -0.74646668837 -21.5541006461 -28.0455418656 -0.772308474864 -0.769384336112 -34.386736234 -37.273770313 -0.198125444841 -0.193769859067 5 3 10 12 2 3 2 8 1 3 4 3 2 1 2 3 5 3 4 3 5 2 5 3 5 2 5 3 4 3 6 3 3 3 6 4 1 2 8 3 12 3 12 8 6 10 6 11 3 3 5 4 2 3 8 3 1 3 8 3 1 3 8 3 1 6 5 2 2 8 1 4 3 10 4 0 330.0 0.681818181818 157.0 0.745222929936 0.194949494949 0.238842975207 0.0507723237889 0.157214124718 0.046376158277 0.0132700802905 0.0115512947121 0.00656196428471 0.107502711455 1.6 0.681818181818 2.0 6.0 8.0 4.0 4.0 5.0 1.0 5.0 5.0 12.0 0.238095238095 1.0 3.0 1.0 0.475757575758 0.5 0.625 0.583333333333 0.833333333333 0.458333333333 0.416666666667 0.708333333333 0.333333333333 0.541666666667 0.333333333333 0.541666666667 0.166666666667 0.625 0.333333333333 0.458333333333 0.666666666667 0.0 0.333333333333 0.5 0.333333333333 0.0 0.0 0.166666666667 0.5 0.166666666667 0.833333333333 1.0 0.833333333333 0.5 0.5 0.666666666667 0.833333333333 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.5 0.666666666667 1.0 1.0 1.0 0.5 0.666666666667 0.166666666667 0.0 0.166666666667 0.666666666667 0.666666666667 1.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.166666666667 0.333333333333 1.0 0.333333333333 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.333333333333 1.0 0.333333333333 0.833333333333 0.5 0.0 0.333333333333 0.5 0.333333333333 1.0 0.333333333333 -14.8158783387 -0.405121673325 -32.2457086959 2.45450759169 4.54960726879 5.01631030627 -21.5954561255 20.7793591519 -1.47011807627 2.81824397909 -19.2508609447 47.1410383234 1.10912173393 4.79719161174 -13.8137950836 68.4631358621 0.80725256197 -3.70786020199 -6.27228508704 52.8727706718 -0.825189508871 0.508846321333 -13.8535719054 35.5410993881 -0.159399648982 -0.993971393854 3 2 2 1 1 3 2 5 3 5 2 4 3 5 2 4 3 4 3 4 4 3 4 3 3 4 3 4 4 3 4 4 3 3 4 3 4 3 4 4 2 13 3 2 2 0 154.0 0.318181818182 86.0 0.639534883721 0.229128014842 0.268595041322 0.0196845025442 0.329934528282 0.0549609776292 0.00160824624532 0.015996519642 0.00275304682973 0.523077930859 0.857142857143 0.0454545454545 1.0 2.0 0.0 3.0 1.0 0.0 0.0 0.0 2.0 4.0 0.172413793103 0.0 9.0 1.0 0.558441558442 0.5 0.333333333333 0.166666666667 0.25 0.75 0.833333333333 0.666666666667 0.666666666667 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 -5.32445627798 2.63329087661 -8.91038556232 7.31933827302 4.63809311243 1.66455025192 -0.284063797759 15.0105298497 -3.93146536446 1.65047913504 -5.89769422993 24.2390936381 3.64567103092 0.267754813844 2.15327952346 23.1478468798 -2.55377811828 -2.11608158537 -1.46553800518 6.38972885175 1.92207240476 -0.557136584612 1.63160799948 -4.21692489467 -0.420572837627 -0.115778391139 2 2 5 3 4 7 1 14 2 5 3 4 5 3 5 3 5 3 5 4 4 4 4 4 4 7 2 5 1 0 120.0 0.533333333333 68.0 0.5 0.194791666667 0.266111111111 0.0296938657407 0.191735532407 0.0451082175926 0.00529907398825 0.012972071117 0.00368657131257 0.195884299185 0.5 0.0 0.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0 2.0 4.0 0.269230769231 0.0 4.0 1.0 0.566666666667 0.625 1.0 0.625 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.875 0.5 0.875 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.0 -9.4644139492 3.56507072526 -17.8200969902 9.66349578281 6.5116299739 1.63653722817 -2.23656890818 16.0961195672 -3.63488407379 0.567946575787 -10.2063698255 21.0514010582 0.562217517145 1.20779001603 -13.5236285872 28.0702373969 -0.0582717205607 0.0578917457703 -12.9250372352 31.1353255541 -0.88771733606 0.50896305553 -22.1799566473 36.3609842383 -0.119619518102 0.182274967546 4 9 3 3 2 5 2 3 4 4 1 4 6 1 2 3 10 3 10 3 9 4 9 5 9 4 10 5 3 2 3 10 4 8 7 4 10 2 5 0 195.0 0.866666666667 82.0 0.743902439024 0.176331360947 0.185299145299 0.0622837202245 0.0992904128525 0.0409091184949 0.0216336920244 0.0156324182053 0.00545304456076 0.0393708628078 0.615384615385 0.266666666667 0.0 2.0 3.0 3.0 2.0 1.0 0.0 0.0 3.0 7.0 0.233333333333 1.0 2.0 1.0 0.420512820513 0.375 0.75 0.875 0.5 0.625 0.3125 0.375 0.875 0.4375 0.0 0.0 0.5625 0.8125 0.0625 0.0 0.4375 0.0 0.0 0.25 0.5 0.5 0.5 0.75 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -11.4591559026 -0.848826363157 -25.723169079 5.1726110791 2.8814825608 10.5661905686 -16.1369107068 39.749080449 1.66930821339 -0.856237350861 -3.43075360758 39.7468962357 -0.16757297653 -2.96452921713 -3.05566418522 18.1656199522 -0.259648519438 0.188340597273 -5.36071087265 12.4833071306 0.189575993921 -0.773830035512 -0.736679146875 5.74871334968 0.419225109228 -0.162429809548 1 3 3 10 5 9 6 10 5 11 4 11 4 11 4 11 3 12 3 12 3 2 6 4 11 4 4 4 4 3 4 5 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 3 3 6 3 2 4 6 3 1 7 3 4 1 7 2 6 1 5 9 0 345.0 0.652173913043 144.0 0.666666666667 0.165797101449 0.226086956522 0.0456894879592 0.159892459567 0.0606292795631 0.0154893296709 0.0182022400277 0.0158042302099 0.128245404766 0.466666666667 0.521739130435 2.0 2.0 1.0 0.0 0.0 1.0 5.0 5.0 3.0 8.0 0.163265306122 1.0 1.0 2.0 0.417391304348 0.625 0.5 0.5 0.625 0.75 0.666666666667 0.666666666667 0.583333333333 0.0 0.291666666667 0.166666666667 0.0416666666667 0.0 0.333333333333 0.625 0.541666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.166666666667 0.333333333333 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.333333333333 0.0 0.0 -12.0680965544 -8.13766143809 -28.5276692775 -20.2521444565 1.19339391536 0.242990237764 -23.6917711337 -12.7879028629 1.58487047232 5.92486608961 -19.7726037833 10.1769966001 -4.27621601412 -3.16778262052 -38.5097507949 6.96793710667 2.03784626588 2.87471193414 -30.9171627974 13.3364197141 -0.0756801161268 -2.320389903 -30.6831878392 5.48059398991 -0.581570506479 0.441081555212 7 2 9 7 4 10 2 4 3 4 1 5 1 6 1 9 4 8 4 4 9 4 9 4 10 4 7 1 1 4 6 2 2 11 3 9 6 4 4 0 195.0 0.866666666667 102.0 0.598039215686 0.234319526627 0.241025641026 0.0752816466899 0.109142770445 0.0470601325039 0.0196550188965 0.00993545959569 0.00496425855643 0.0234497501403 0.923076923077 0.266666666667 0.0 2.0 6.0 3.0 0.0 2.0 0.0 1.0 3.0 11.0 0.108108108108 0.0 3.0 1.0 0.523076923077 0.1875 0.6875 0.9375 0.75 0.5625 0.875 0.4375 0.5625 0.6875 0.6875 0.1875 0.25 0.6875 0.5625 0.0 0.4375 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 0.75 0.5 0.75 1.0 0.5 0.0 0.75 1.0 0.5 0.25 0.75 1.0 0.5 0.0 1.0 1.0 0.5 0.5 1.0 1.0 0.5 0.0 -11.28939063 6.36619772368 -25.6261544297 16.5321796558 2.38803150168 2.74114326875 -18.1199570355 32.8315225213 1.11759203601 4.7817721466 -9.3156821827 50.8878364869 -0.490638982373 -3.1077500383 -8.18016946521 33.6679094046 1.48379389393 -1.96525282883 2.94115561064 11.9286833637 0.442079772818 -0.156485222035 9.04148731113 1.77761148278 -0.0997534886095 -0.647198107683 3 1 1 3 5 4 1 4 2 4 3 3 2 3 4 4 2 2 5 2 10 3 9 2 4 3 3 3 2 4 3 3 2 3 4 3 2 3 3 5 1 11 1 5 2 4 2 2 8 0 168.0 0.857142857143 84.0 0.857142857143 0.234623015873 0.24362244898 0.0804733475732 0.118645858641 0.0601166433835 0.0211012758775 0.0108341263157 0.0108001917276 0.0265806306064 0.833333333333 0.714285714286 2.0 4.0 2.0 2.0 3.0 2.0 3.0 2.0 2.0 9.0 0.181818181818 1.0 2.0 1.0 0.5 0.666666666667 0.416666666667 0.416666666667 0.666666666667 0.583333333333 0.166666666667 0.666666666667 0.833333333333 0.333333333333 0.0 0.166666666667 0.416666666667 0.75 0.416666666667 0.333333333333 0.583333333333 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 1.0 1.0 0.5 0.0 0.25 0.75 0.75 1.0 0.75 0.5 0.25 0.0 0.5 1.0 0.75 0.75 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.25 0.0 0.0 0.0 0.0 0.25 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 -1.45513090827 -0.727565454134 -6.43752228414 1.54433928133 -3.73248502108 5.05769352683 -15.2137440333 19.8851012055 3.13048597055 1.33672349419 -4.65876023368 29.5416446661 -0.568340165718 -0.356947055472 -1.14762960915 28.6501978364 0.714831183548 0.636611710815 3.55739583628 32.5503726633 0.759859976193 0.345049679971 12.1396031207 37.6391532928 -0.027626174852 0.137234641925 4 7 6 11 3 5 2 6 2 4 5 4 1 5 6 3 1 4 7 3 1 4 7 8 7 3 1 5 6 3 1 5 6 3 2 4 5 3 3 5 3 4 5 9 8 1 9 0 210.0 1.07142857143 109.0 0.633027522936 0.224126984127 0.220068027211 0.0974715473491 0.0789483857035 0.043307202246 0.0315288109438 0.00682597248974 0.00812655331088 -0.00323329541712 0.466666666667 0.714285714286 0.0 2.0 3.0 0.0 1.0 3.0 3.0 2.0 6.0 13.0 0.075 0.0 2.0 2.0 0.519047619048 0.5 0.9375 1.0 0.6875 0.75 0.375 0.375 0.6875 0.625 0.0 0.0 0.3125 0.8125 0.5625 0.5 0.75 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 -5.60225399683 6.62084563262 -19.1509124897 20.5745920071 -8.2279568802 6.91963251245 -46.2276471694 44.7638803141 1.38835297478 -0.356884328687 -42.2773796338 43.3857613561 1.40625142296 -2.06432492419 -32.8555768607 30.9581166461 -1.94007310886 1.824764283 -44.2960820701 44.7863021758 -0.118071132382 2.17559829808 -50.3634164405 69.2258093869 -0.126345499195 0.235099785008 1 1 5 9 6 10 5 12 3 12 3 12 3 11 4 11 4 11 4 12 9 6 4 2 5 4 3 4 4 4 2 7 3 3 3 6 3 3 2 7 3 3 2 8 2 3 2 8 2 3 2 7 3 3 3 5 3 4 4 3 4 4 10 5 9 3 0 330.0 0.681818181818 124.0 0.677419354839 0.166464646465 0.199724517906 0.0495546094554 0.144727161421 0.0679099535298 0.0174293023036 0.026424768736 0.0183946006213 0.105526625425 0.666666666667 0.454545454545 1.0 2.0 3.0 2.0 0.0 0.0 5.0 4.0 1.0 9.0 0.142857142857 0.0 2.0 2.0 0.375757575758 0.541666666667 0.375 0.25 0.25 0.75 0.833333333333 0.666666666667 0.708333333333 0.0 0.25 0.0833333333333 0.208333333333 0.0 0.291666666667 0.416666666667 0.416666666667 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.333333333333 0.166666666667 0.5 0.166666666667 0.0 0.0 0.0 1.0 0.666666666667 0.666666666667 1.0 0.666666666667 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 -5.78745247607 -8.85480228839 -12.9236935277 -22.9088549315 1.43442727072 -0.823994525054 -9.35318005536 -16.4687459958 -0.433588539663 8.58725910442 -10.2795744942 20.9016498296 -0.661776170209 -1.71568600536 -12.0312680112 26.6161316385 1.14322072121 1.32052783549 -7.57620161234 25.4803797832 -1.02140870259 -1.63769439773 -10.74652125 16.9952322266 0.25445747513 0.152734071272 0 24 1 10 2 5 1 3 5 2 7 0 60.0 2.4 44.0 0.340909090909 0.323611111111 0.213333333333 0.212828703704 0.0243703703704 0.0201296296296 0.0429348693465 -0.000408655526736 -0.00796918122642 -0.0471616210326 0.0 0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.0 0.0 0.0 1.0 6.0 0.733333333333 1.0 0.833333333333 0.666666666667 0.333333333333 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.833333333333 0.5 1.0 1.0 0.833333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -3.66056369111 6.36619772368 -8.78797800217 11.8233996443 0.0652093169613 -4.65970305608 -8.95321169975 0.0158031465677 0.0272166005114 2.031313205 -8.99366334701 2.77211055805 -0.542062663202 -0.631526929034 -10.3641169903 3.1793318779 0.700225443222 -0.084650824602 -6.37275387243 -0.350710940873 0.106812538431 -0.148511125129 -1.4211080487 -0.066406121734 0.194397900019 0.0915851673635 8 4 4 3 2 6 3 6 3 4 4 3 5 3 4 3 5 3 4 2 7 2 3 3 7 2 3 3 7 3 2 3 7 2 3 3 7 3 2 3 6 4 2 4 4 12 3 5 1 6 3 4 2 0 210.0 1.07142857143 99.0 0.727272727273 0.210793650794 0.237755102041 0.0977890076666 0.10059701976 0.0553929381276 0.0340095418626 0.0112988914289 0.0143680997652 0.0141835434468 0.466666666667 0.928571428571 2.0 2.0 1.0 1.0 2.0 3.0 3.0 3.0 4.0 6.0 0.27027027027 0.0 1.0 2.0 0.471428571429 0.5625 0.5625 0.75 0.8125 0.4375 0.375 0.25 0.4375 0.4375 0.0 0.0 0.125 0.8125 0.625 0.5 0.8125 0.25 0.75 0.5 0.0 0.0 0.25 0.5 0.5 0.5 1.0 0.75 0.5 0.5 0.75 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.0 0.5 0.75 0.5 0.25 0.0 0.0 0.0 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.41389708842 1.18835690842 -17.2452888384 4.72936882801 -9.68341115089 2.81357645174 -49.4072915297 14.6301244093 1.02878593562 0.157122999489 -48.6349784794 15.9470180764 1.13303427644 -0.882932704779 -43.8185398392 9.64289637729 -3.59391165915 -0.117974886251 -69.5894542412 7.6088519556 -0.985127639221 0.435150683089 -86.1816761176 14.3354059147 -0.138588663353 0.403301280792 0 7 1 5 1 5 3 3 2 4 4 3 3 4 2 3 4 4 2 3 5 4 1 2 6 7 6 6 8 5 9 4 9 4 10 3 10 2 10 3 10 3 10 2 10 2 10 3 9 4 8 5 9 1 1 1 8 0 273.0 0.619047619048 102.0 0.705882352941 0.159763313609 0.132391418106 0.0361387461979 0.0981740421422 0.0304661995279 0.00875518925149 0.00912460071508 0.00198224806929 0.0666790528771 0.615384615385 0.333333333333 2.0 4.0 2.0 0.0 5.0 1.0 0.0 0.0 4.0 9.0 0.277777777778 0.0 2.0 1.0 0.373626373626 0.625 0.125 0.0 0.291666666667 0.791666666667 0.791666666667 0.416666666667 0.583333333333 0.5 0.791666666667 0.541666666667 0.0416666666667 0.625 0.0833333333333 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.833333333333 0.833333333333 1.0 1.0 0.666666666667 0.166666666667 0.333333333333 0.666666666667 0.5 0.333333333333 0.833333333333 1.0 1.0 0.666666666667 0.833333333333 0.833333333333 0.166666666667 0.0 0.5 1.0 1.0 1.0 1.0 0.5 0.166666666667 0.333333333333 0.666666666667 1.0 1.0 0.833333333333 0.5 0.166666666667 -7.09376317781 11.034742721 -14.6402617514 23.9459342673 3.08926601557 -3.20227788316 -7.99839168193 18.8739570241 -1.71228869563 3.22707052371 -9.19411279653 29.3184563361 1.1785663377 0.806818662276 -7.30810630212 39.4000303576 -0.813066839018 0.219168839585 -8.58752856807 41.0950321295 0.408220264299 0.495092975543 -8.65065591803 47.6988935962 -0.0698262156892 0.182587681545 10 1 16 4 12 7 11 6 11 5 13 4 12 4 14 4 13 3 11 7 6 4 1 5 6 3 5 4 4 4 5 3 4 4 7 3 3 4 7 3 2 5 6 4 3 4 6 3 4 4 7 3 4 3 6 4 5 3 5 5 4 5 2 7 5 3 4 4 7 1 5 4 1 0 391.0 0.739130434783 144.0 0.791666666667 0.204603580563 0.199710886245 0.0713075216501 0.129043783799 0.0641678395501 0.0206398651781 0.0206105676409 0.0141851128607 0.0621932610282 0.882352941176 0.565217391304 0.0 3.0 6.0 6.0 0.0 0.0 5.0 5.0 2.0 9.0 0.234042553191 0.0 1.0 2.0 0.368286445013 0.0 0.0333333333333 0.633333333333 0.666666666667 0.0 0.166666666667 0.366666666667 0.333333333333 0.533333333333 0.6 0.4 0.4 0.533333333333 0.5 0.533333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.555555555556 0.777777777778 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.333333333333 0.777777777778 0.444444444444 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.222222222222 0.0 0.0 0.444444444444 0.444444444444 0.222222222222 0.111111111111 0.555555555556 0.222222222222 0.0 0.0 0.777777777778 1.0 0.888888888889 0.777777777778 0.888888888889 0.777777777778 0.444444444444 0.555555555556 0.555555555556 1.0 0.888888888889 0.777777777778 0.777777777778 0.777777777778 0.888888888889 0.888888888889 0.222222222222 0.555555555556 0.222222222222 0.111111111111 0.111111111111 0.111111111111 0.222222222222 0.222222222222 2.60183733055 -5.03759993787 4.66525051738 -12.0461740273 -0.878825157942 1.55610027371 11.3425804425 2.0347224707 6.85417658025 7.62656252738 33.3802006608 34.0928870838 -4.86110098033 -3.01946313006 14.311123988 28.4266048267 -0.070953928254 0.685808558047 1.60684233859 21.8633224641 -0.219205985904 -0.916562483321 -0.0301556327587 20.6578523576 -0.196198570444 0.368913322477 0 5 2 6 2 4 4 4 3 3 4 4 3 3 4 3 4 4 3 3 4 4 3 3 4 3 5 2 5 2 4 3 4 3 4 3 4 4 1 11 3 0 147.0 0.333333333333 77.0 0.662337662338 0.220602526725 0.242306446388 0.0208460634474 0.315232094967 0.0498368813952 0.00178192977573 0.0133428716246 0.0022372527124 0.465322546129 1.14285714286 0.0 1.0 1.0 0.0 5.0 0.0 0.0 0.0 0.0 1.0 4.0 0.222222222222 0.0 7.0 1.0 0.52380952381 0.416666666667 0.0 0.0 0.333333333333 0.75 0.5 0.333333333333 0.666666666667 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.916666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.06224045225 2.06143545338 -7.66075660876 5.33962031963 2.3897473023 1.15156618364 -4.20717881053 13.5260803466 -2.50840474401 3.35226765333 -7.86874230338 28.9704281651 2.40599646599 -0.0291631014368 -2.26597677866 33.6868441546 -1.65513136837 0.288677456118 -3.86678684836 32.0889663501 1.34858597626 -0.806910163091 -2.88579836329 25.4437408171 -0.458723617717 -0.0552638234346 8 3 4 4 8 17 4 3 2 13 4 3 2 13 3 2 6 3 11 2 6 3 11 2 6 3 11 2 6 3 11 2 6 3 9 4 5 4 8 5 4 5 8 5 5 4 10 3 6 3 10 3 6 2 11 3 6 3 10 3 6 3 10 3 6 3 10 3 6 3 10 3 5 4 9 5 4 5 7 7 2 7 6 7 2 6 7 0 484.0 1.0 187.0 0.614973262032 0.160405709992 0.178061607814 0.0640948152505 0.090502246324 0.033259156755 0.0221574937601 0.00947069090431 0.00347292569562 0.0363752094469 0.5 0.954545454545 2.0 4.0 3.0 0.0 4.0 5.0 5.0 5.0 2.0 9.0 0.152542372881 0.0 1.0 2.0 0.386363636364 0.25 0.472222222222 0.611111111111 0.638888888889 0.472222222222 0.0833333333333 0.0833333333333 0.194444444444 0.722222222222 0.555555555556 0.527777777778 0.666666666667 0.611111111111 0.0 0.0 0.0277777777778 0.0 0.0 0.0 0.0 0.555555555556 0.777777777778 0.333333333333 0.333333333333 0.111111111111 0.444444444444 0.666666666667 0.666666666667 0.888888888889 1.0 1.0 1.0 0.555555555556 0.777777777778 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.333333333333 0.555555555556 0.222222222222 0.0 0.0 0.0 0.0 0.0 0.0 0.888888888889 0.444444444444 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.777777777778 0.888888888889 0.666666666667 0.666666666667 0.888888888889 0.888888888889 0.666666666667 0.666666666667 0.666666666667 0.888888888889 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.555555555556 0.666666666667 0.888888888889 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 -19.9956483048 5.0061463918 -52.5071502535 14.4997800004 -6.08029278834 4.39164808034 -72.2273162215 35.0395391875 3.52023348373 4.11112997027 -53.9772427794 54.4786670907 1.07781593445 -0.757492601136 -41.6858586009 55.3732996712 -1.17797329296 0.514075825725 -50.2483321366 51.8610233127 -0.660046152072 -1.43759310035 -55.7698163655 39.8135566079 0.227862241275 -0.206522644684 6 2 7 8 4 8 2 11 1 11 1 5 1 1 4 4 8 4 9 3 9 3 9 4 8 5 4 2 2 4 4 1 4 7 2 0 168.0 0.857142857143 83.0 0.638554216867 0.201884920635 0.21343537415 0.0627478049752 0.102394281125 0.0362048341162 0.0181806988853 0.00822240641429 0.00343535424199 0.0375369921801 0.666666666667 0.214285714286 0.0 2.0 3.0 3.0 0.0 1.0 0.0 2.0 3.0 8.0 0.172413793103 0.0 2.0 1.0 0.494047619048 0.166666666667 0.75 0.833333333333 0.583333333333 0.583333333333 0.916666666667 0.666666666667 0.916666666667 0.833333333333 0.666666666667 0.0 0.416666666667 0.916666666667 0.583333333333 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.75 1.0 1.0 1.0 0.75 0.25 0.0 0.0 -11.5501015844 8.00321999548 -26.0101517319 19.1694102674 2.81838811761 0.202307741073 -16.6412251759 23.4013553262 1.45306654356 2.17671159867 -6.55350787073 33.8855607474 -0.916543432679 1.37853702542 -7.61063193976 42.5246818759 1.53698852908 -0.993786173837 3.78397647863 35.0778845405 0.784891177744 -0.621618066027 13.2930934289 26.3362852679 -0.0721702464147 -0.0187669137595 3 1 6 1 4 5 1 6 3 7 2 4 2 6 4 3 3 4 5 3 4 2 7 2 4 2 6 3 4 2 7 2 4 2 6 3 4 2 6 3 3 3 6 3 3 3 6 4 2 4 4 6 1 3 5 5 1 0 210.0 1.07142857143 94.0 0.755319148936 0.199682539683 0.208163265306 0.0939908217255 0.0885364431487 0.0585694849368 0.0340310513027 0.0159112301448 0.0179462187577 0.0150816773922 0.333333333333 1.0 1.0 1.0 1.0 0.0 3.0 3.0 3.0 3.0 2.0 6.0 0.282051282051 0.0 1.0 2.0 0.447619047619 0.8125 0.6875 0.5 0.6875 0.6875 0.4375 0.25 0.3125 0.375 0.0 0.0 0.0625 0.6875 0.6875 0.6875 0.8125 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.69765272631 3.01333358921 -9.57792539405 7.98070507693 -7.51041566121 0.799594434094 -30.6773046571 8.72614334858 3.7761497393 -2.41003391936 -17.4793316741 -5.68600287425 0.423689855765 -2.22523317228 -13.7510223897 -24.5422543791 -3.40033019917 -1.20873530021 -40.4565430348 -38.0352770182 -0.876777961395 -0.745801987796 -56.1106001037 -46.8820371324 -0.148528195341 -0.0938488927877 7 5 9 5 9 5 10 4 10 4 10 4 10 4 11 3 6 8 4 10 3 3 4 4 2 4 5 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 4 5 4 1 5 4 4 2 4 3 6 3 3 3 4 1 0 294.0 0.666666666667 130.0 0.584615384615 0.222060252672 0.235989633949 0.0640765075524 0.158989601209 0.0570296516033 0.0146019722426 0.01358783055 0.00998198316861 0.0929248835224 0.428571428571 0.52380952381 0.0 3.0 3.0 0.0 0.0 0.0 5.0 5.0 3.0 9.0 0.186046511628 0.0 1.0 2.0 0.442176870748 0.0 0.208333333333 0.791666666667 0.75 0.0 0.333333333333 0.0833333333333 0.333333333333 0.625 0.625 0.291666666667 0.291666666667 0.75 0.75 0.75 0.916666666667 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.166666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 1.0 0.666666666667 0.5 0.5 0.833333333333 0.166666666667 0.0 0.0 -4.36539272481 -5.57800181503 -12.7905849855 -16.8099781297 -2.02266495866 -3.78631001641 -12.0190952752 -22.2254531856 5.80475879834 6.50678527009 4.83587205909 3.28580549999 -5.11632795905 -1.27951400323 -11.391748617 8.51104248821 2.124639905 0.852789176765 -10.0657140121 7.3127278617 -0.786120715147 -0.849766491769 -8.11516069046 5.08494648672 0.0777082176255 0.16049975102 6 3 7 7 3 3 4 2 2 3 4 4 1 10 1 9 4 4 7 4 9 3 9 3 9 4 6 1 2 4 4 2 2 9 6 4 3 0 168.0 0.857142857143 79.0 0.784810126582 0.196924603175 0.21343537415 0.0643725620208 0.104449269787 0.0437828157056 0.0195008289009 0.012219009394 0.00639519229053 0.039015158572 1.16666666667 0.285714285714 1.0 4.0 6.0 3.0 1.0 1.0 0.0 2.0 2.0 12.0 0.294117647059 0.0 3.0 1.0 0.470238095238 0.25 0.75 0.75 0.5 0.5 0.916666666667 0.75 0.916666666667 0.416666666667 0.583333333333 0.0833333333333 0.5 0.583333333333 0.583333333333 0.0 0.25 0.0 0.0 0.25 0.5 0.75 0.75 0.75 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 0.75 0.75 1.0 1.0 0.75 0.5 0.5 0.75 0.25 0.5 1.0 0.75 0.25 0.0 0.75 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.25 0.75 1.0 0.5 0.0 0.0 -10.140443517 4.68370261099 -22.5000531485 12.3004725363 2.88195729313 2.41887672985 -13.5763254123 27.5264329692 0.658693323409 5.54099160683 -7.72005921472 53.4398109715 -1.14079248911 -0.646601029827 -12.0783305004 50.0223336093 0.914291464338 -2.82916180907 -8.39649514198 27.2393269256 -0.659602871274 0.561294941592 -14.9455012692 26.3520202569 -0.364418939338 0.122714196283 0 5 3 11 1 11 4 3 2 4 4 2 3 4 4 2 4 4 3 1 5 4 2 2 5 5 1 1 7 6 7 5 9 4 9 4 9 3 11 1 7 0 182.0 0.928571428571 82.0 0.634146341463 0.183431952663 0.156593406593 0.0618607934753 0.0672705358885 0.033104047263 0.0188363021776 0.00854087999688 0.000924834301536 0.0139487255622 0.230769230769 0.571428571429 0.0 1.0 2.0 0.0 3.0 3.0 1.0 0.0 2.0 6.0 0.241379310345 0.0 3.0 2.0 0.450549450549 0.9375 0.625 0.375 0.0625 0.5625 0.625 0.9375 0.8125 0.4375 0.3125 0.5625 0.4375 0.8125 0.375 0.0625 0.0 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.25 0.0 0.0 0.25 0.5 0.75 1.0 0.25 0.25 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.25 0.5 0.75 -8.45794840431 6.18430636014 -16.8189926079 18.1588771718 4.89853858374 4.71711122878 -3.54765761004 34.2156616422 -1.50570310876 -0.387077851718 -5.87936107249 35.6707135775 -0.939555569589 0.457800436487 -14.1426043762 34.5602406241 0.140639693318 -0.517244023015 -15.5165231988 31.2519211222 -0.674351794675 -0.363976129125 -20.3514982928 22.1791504503 0.0324167944162 -0.414943429543 3 2 5 3 3 5 3 7 1 13 4 4 4 3 5 3 5 4 4 4 3 4 4 4 5 4 4 7 1 6 4 1 4 0 136.0 0.470588235294 74.0 0.581081081081 0.184742647059 0.252595155709 0.0250829273102 0.202867392632 0.0407592102585 0.00424181278635 0.0107491170541 0.00332310464111 0.227897398811 0.75 0.0 1.0 0.0 3.0 2.0 0.0 0.0 0.0 0.0 2.0 7.0 0.275862068966 0.0 2.0 1.0 0.544117647059 0.6 0.7 0.7 0.5 0.7 1.0 1.0 0.8 0.9 1.0 1.0 0.9 1.0 0.8 0.7 0.8 0.333333333333 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.666666666667 0.333333333333 0.0 -9.73653769503 4.79337240371 -17.5968063753 13.0883717949 7.50467550101 2.38631991205 -0.320119901584 22.3856620836 -4.56986407606 0.461310656973 -8.87384493439 24.6672658494 2.08797994465 -0.472527687267 -6.49399617388 20.4072380516 -0.648913386306 -0.292352066354 -5.2773374935 18.6659701224 -0.320071161587 0.47896035144 -11.7063025942 18.8750018333 0.0188730968387 -0.301918055423 19 2 1 2 26 8 22 1 7 6 18 2 9 6 16 2 12 4 15 2 5 2 6 5 14 2 4 4 6 4 13 2 4 7 4 4 13 2 3 4 3 2 3 4 13 2 4 2 4 2 3 4 13 2 10 2 3 3 14 2 10 2 2 4 14 3 8 2 3 4 15 5 1 3 5 4 17 1 1 5 5 4 30 3 30 3 30 3 30 2 31 1 18 7 26 5 2 2 2 1 21 4 4 6 21 15 19 6 7 5 30 7 1 1 7 2 17 8 6 4 18 7 2 1 2 4 20 8 2 4 21 13 24 9 28 1 6 0 1088.0 1.0625 265.0 1.06037735849 0.129352292388 0.1220703125 0.0704127544059 0.0630410270295 0.0503906197201 0.0332066818617 0.0229550661103 0.022143508165 0.0254302250736 1.38235294118 1.125 5.0 16.0 20.0 3.0 10.0 16.0 3.0 7.0 1.0 7.0 0.375 6.0 3.0 1.0 0.243566176471 0.0555555555556 0.180555555556 0.180555555556 0.347222222222 0.277777777778 0.430555555556 0.138888888889 0.319444444444 0.472222222222 0.416666666667 0.222222222222 0.416666666667 0.277777777778 0.333333333333 0.0138888888889 0.236111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.35 0.8 0.0 0.1 0.35 0.4 0.15 0.0 0.4 0.6 0.15 0.4 0.3 0.25 0.5 0.0 0.2 0.65 0.1 0.25 0.65 0.1 0.4 0.0 0.05 0.5 0.4 0.15 0.5 0.4 0.15 0.25 0.15 0.15 0.8 0.45 0.3 0.45 0.6 0.4 0.0 0.0 0.25 0.7 0.8 0.65 0.3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.318309886184 12.863464224 0.446034966473 28.7646755329 2.79556159658 -2.83359292229 15.6709085595 22.0903773997 4.10735010896 -0.770629512975 30.2088063857 2.16250726379 -3.01009980167 -6.79332567499 26.8696912077 -38.616497992 4.29977396948 -0.188053489366 46.0406444761 -54.3338897102 -1.29946682843 -1.32918868603 48.6937024913 -68.3620151244 0.157893845626 -0.303031281111 8 1 10 6 6 10 3 4 1 7 2 12 1 13 1 6 2 4 2 3 10 3 12 3 11 4 7 1 1 5 6 3 1 8 1 4 3 10 5 8 7 3 6 0 224.0 0.875 118.0 0.610169491525 0.24681122449 0.243582589286 0.0797503501959 0.106238807256 0.0505913826189 0.0193623279185 0.00819328332696 0.00520106249258 0.0139759749113 0.928571428571 0.3125 1.0 3.0 3.0 3.0 1.0 1.0 2.0 1.0 1.0 12.0 0.138888888889 0.0 3.0 1.0 0.526785714286 0.1875 0.625 0.75 0.8125 0.5625 0.9375 0.375 0.5625 0.75 0.8125 0.125 0.1875 0.625 1.0 0.25 0.375 0.0 0.0 0.0 0.0 0.25 0.5 0.5 0.75 0.0 0.0 0.25 0.5 0.75 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.0 0.5 1.0 1.0 1.0 1.0 0.75 0.25 0.25 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.5 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.5 1.0 0.75 0.75 1.0 0.75 0.25 0.0 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 -8.87288807737 9.66866279283 -21.2834675079 26.0076544809 0.278210300913 4.65434953694 -19.9995476804 47.0792984349 1.63178986987 3.30280991782 -9.68882371131 62.2001096708 0.233778383569 -1.03621822529 -5.58211554589 55.7466427738 0.0493258566807 -1.14708392157 -5.72723050181 45.3040181368 -0.380501527405 0.65972130318 -9.75855717252 46.9433216047 -0.0967304480721 -0.14566694982 4 1 16 1 1 2 12 6 7 5 3 3 4 4 6 3 3 4 7 3 1 4 8 3 1 4 8 3 1 5 6 10 6 4 1 5 7 3 2 4 6 3 3 4 5 4 5 4 1 4 10 3 7 0 240.0 1.06666666667 99.0 0.858585858586 0.174479166667 0.209166666667 0.0842983217593 0.082056640625 0.0522721354167 0.0350170025968 0.0107018445882 0.015569769872 0.0174097244794 0.625 0.8 0.0 5.0 5.0 0.0 1.0 3.0 3.0 3.0 2.0 9.0 0.358974358974 0.0 2.0 2.0 0.4125 0.125 0.75 1.0 0.875 0.5 0.5625 0.375 0.5 0.4375 0.0625 0.0 0.0 0.3125 0.4375 0.375 0.5 0.0 0.0 0.0 0.25 0.5 0.75 1.0 1.0 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.25 0.0 0.5 1.0 1.0 0.75 0.5 0.75 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.25 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.00281749604 2.06901426019 -23.5542585884 6.62596770909 -9.5691909534 2.29469099591 -53.7707692972 13.3740883444 3.00826544718 -1.31376169104 -40.1075375251 6.44974844457 3.57221489064 -1.27633465444 -12.3962684245 -2.0155779095 -0.469736070913 0.974595601893 -9.41977378555 4.7494558045 0.284731489714 0.649077306638 -6.52187908985 11.3419385131 0.315784919147 -0.178802210616 0 13 2 6 2 5 2 5 4 4 3 3 6 3 3 4 5 3 3 3 6 4 2 3 6 3 3 3 6 3 3 3 6 3 3 3 6 4 1 5 4 11 3 7 1 3 5 4 2 0 195.0 1.15384615385 108.0 0.527777777778 0.243418803419 0.246548323471 0.113196244036 0.089567255011 0.053805357474 0.0338484867282 0.00962194638271 0.0125823844966 -0.0121260388931 0.4 0.923076923077 1.0 2.0 2.0 1.0 2.0 3.0 3.0 3.0 5.0 7.0 0.025 0.0 1.0 2.0 0.553846153846 0.9375 0.75 0.75 0.875 0.625 0.3125 0.25 0.375 0.4375 0.0 0.0 0.25 0.9375 0.75 0.75 0.9375 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.75 0.5 0.5 0.5 1.0 0.75 0.25 0.25 0.25 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -1.86741799894 4.49877972473 -11.5038495 13.6737997977 -9.77395262963 4.28034840728 -40.5382848713 29.031412963 3.41701864058 0.147037684774 -30.4482561733 30.3513933297 0.994054820531 -1.07460364984 -18.3104372169 21.7956506732 -0.639268283208 -0.487074884354 -18.0507339026 13.7249189835 1.82195042413 -1.02681519544 -1.01050674323 1.82803777719 0.339816196127 -0.26216203927 4 7 2 4 2 3 1 3 4 3 1 3 5 5 8 3 8 3 8 3 8 3 8 3 9 4 3 3 1 10 1 9 3 7 4 6 3 0 165.0 0.733333333333 82.0 0.560975609756 0.201101928375 0.248080808081 0.0600027826474 0.153137768873 0.0473372846927 0.0182775737661 0.0153969478708 0.00515209105982 0.0905678189844 0.727272727273 0.266666666667 0.0 1.0 2.0 2.0 2.0 1.0 0.0 0.0 2.0 7.0 0.2 0.0 2.0 1.0 0.49696969697 0.416666666667 0.916666666667 1.0 0.75 0.666666666667 0.416666666667 0.333333333333 0.833333333333 0.416666666667 0.0 0.0 0.583333333333 0.416666666667 0.0 0.0 0.583333333333 0.0 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 0.75 0.5 0.25 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.25 0.0 0.0 0.0 0.0 0.0 -10.9498600847 -4.07436654315 -25.4399348836 -3.23440956894 1.74518700265 9.75584433388 -17.8583421645 29.3252822907 3.0869362663 0.270417216494 0.0307221831209 35.4914414609 -0.392545375553 -2.38663433116 0.686196136309 19.6583934637 -0.538680909505 0.320208389792 -4.33195156627 14.7219998648 0.100656770007 -1.20835969263 -4.04597552102 4.10401256834 0.0848067589283 -0.186316767692 3 5 4 8 2 9 2 3 3 4 7 4 7 4 6 4 5 6 3 4 1 4 1 10 1 3 1 6 1 3 2 11 2 3 8 2 2 0 154.0 0.785714285714 93.0 0.559139784946 0.279220779221 0.284786641929 0.0706786256415 0.129110053381 0.0528817193938 0.00933633058164 0.00332937416615 0.00396393121571 0.0149675882095 0.909090909091 0.357142857143 2.0 3.0 2.0 1.0 0.0 1.0 1.0 3.0 4.0 14.0 0.138888888889 0.0 3.0 1.0 0.603896103896 0.666666666667 0.25 0.416666666667 1.0 0.75 0.0833333333333 0.666666666667 0.75 0.833333333333 0.416666666667 0.833333333333 0.75 0.916666666667 1.0 1.0 0.916666666667 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 0.75 1.0 1.0 0.75 0.5 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -4.09255567951 1.40965806739 -12.1396522283 6.22700532409 -3.28657277528 4.22642215496 -23.1035289814 20.8504027952 0.532904385076 0.170762259775 -22.106725223 23.6526048591 0.204883715822 -0.609387381031 -18.1237081621 18.4034285456 0.211290928521 -0.50009675021 -17.1583648377 9.15749539538 -0.30621375956 -1.72872783485 -17.6864402561 -6.5706519168 0.11266977879 -0.0302606167818 1 7 4 8 2 5 1 4 4 5 2 2 5 4 3 1 21 1 4 3 9 5 4 1 3 6 4 3 2 5 5 1 2 6 8 3 1 2 8 1 3 3 9 7 5 10 1 7 0 210.0 0.933333333333 110.0 0.645454545455 0.244897959184 0.242222222222 0.077628765792 0.0911738473167 0.0523129251701 0.0177412856688 0.00674185333448 0.00289165858845 -0.00162807733963 0.928571428571 0.6 0.0 0.0 6.0 5.0 2.0 2.0 3.0 1.0 5.0 13.0 0.239130434783 1.0 4.0 2.0 0.52380952381 0.1875 0.6875 0.5 0.4375 0.625 1.0 0.875 1.0 0.375 0.75 0.6875 0.9375 0.375 0.75 0.375 0.5 0.0 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.25 0.75 1.0 0.75 0.5 0.5 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 1.0 0.75 0.25 0.5 0.0 0.0 0.5 0.75 0.75 1.0 0.5 -8.91267681315 5.51737136052 -18.8600635155 16.1914584222 3.98269329593 4.6798626822 -5.76346405299 35.319791417 0.683110306658 2.28094943613 -0.820340293519 48.3661077136 -1.94049536779 0.250048327307 -9.08314031738 51.9052346873 1.20026380322 0.67129338728 -7.38883855139 59.1150948367 -1.17137266388 1.86847418281 -10.2961255144 82.0644600886 0.384977974021 0.679220543483 0 3 1 8 20 7 1 4 1 2 2 2 2 2 2 2 2 3 1 3 1 15 84.0 0.190476190476 51.0 0.411764705882 0.232142857143 0.330498866213 0.0138281503077 0.677820632221 0.0555049400713 0.00115879970867 0.00993155833281 0.00234705329519 1.85978901468 1.75 204522251.952 2.0 1.0 1.0 3.0 4294967294.0 4294967293.0 0.0 0.0 4.0 5.0 0.181818181818 0.0 5.0 1.0 0.607142857143 0.5 0.5 0.166666666667 0.5 0.5 0.5 0.166666666667 0.5 0.5 0.5 0.166666666667 0.5 0.5 0.5 0.166666666667 0.5 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 1.0 0.333333333333 0.0 0.333333333333 1.0 0.333333333333 0.0 0.0 -2.728370453 -3.33467499812 -4.41948686183 -4.51013959924 2.35881339694 5.64853111926 -1.2632983492 17.0226053904 -2.70855778932 2.42067434905 -5.18280742303 30.210687323 2.86306807853 -1.81305597864 1.07731043399 22.7895994915 -2.40131136214 0.541926258379 -4.09145467401 18.3985419127 1.73927645004 -1.55894763961 -1.03750055626 7.19697899385 -0.37046059346 0.00572369200213 4 3 7 5 5 6 4 3 3 22 4 2 56 2 3 1 4 3 3 1 5 4 4 0 154.0 0.785714285714 52.0 0.980769230769 0.13813459268 0.121521335807 0.0442081952455 0.0710178672736 0.0309873546929 0.0148704043954 0.0118989394063 0.00655455228719 0.0424871765455 0.818181818182 306783378.214 0.0 2.0 4.0 1.0 0.0 1.0 4294967293.0 1.0 1.0 6.0 0.0833333333333 4.0 3.0 0.0 0.337662337662 0.25 0.833333333333 0.166666666667 0.0833333333333 0.666666666667 0.666666666667 0.0 0.416666666667 0.75 0.5 0.0 0.166666666667 0.583333333333 0.5 0.0 0.166666666667 0.0 0.0 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.75 1.0 0.75 0.75 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.75 1.0 0.75 0.75 0.75 0.25 0.0 0.0 0.25 0.5 0.75 1.0 0.5 0.0 0.0 0.0 -6.54808908721 9.00362249491 -16.4769846828 21.3203171914 -1.0913481812 -0.24082045325 -21.0462849348 23.4917875199 0.187610979505 1.31277970448 -18.9102118362 27.4108066397 0.33940807225 0.0660643207862 -15.5503442605 26.9336533877 0.119952878488 -1.04951129787 -14.7343981758 18.8584330465 -0.45383726047 0.0402499221474 -18.7330568349 14.2621024975 -0.0493906912613 -0.314503051784 4 4 4 7 3 3 3 3 2 2 5 2 8 3 8 3 7 5 4 3 2 2 2 3 4 2 1 3 4 2 2 3 3 4 1 3 2 12 2 3 9 1 1 0 154.0 0.785714285714 73.0 0.904109589041 0.217827626919 0.230983302412 0.0696086044163 0.125804706341 0.0572499687865 0.0172802731202 0.0123274654633 0.0122960685943 0.0474122997584 1.18181818182 0.571428571429 2.0 3.0 4.0 1.0 1.0 1.0 3.0 3.0 2.0 7.0 0.342857142857 0.0 3.0 2.0 0.474025974026 0.583333333333 0.166666666667 0.416666666667 1.0 0.416666666667 0.0 0.416666666667 0.5 0.583333333333 0.333333333333 0.333333333333 0.416666666667 0.75 0.916666666667 0.583333333333 0.75 0.25 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.5 0.5 0.75 0.25 0.0 0.0 0.0 0.25 0.75 0.75 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.75 0.5 1.0 0.75 0.25 0.25 0.5 0.75 0.75 0.25 1.0 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.5 -2.91026181654 -1.00040249943 -9.8736410482 -1.43998040161 -3.95706517402 1.94651599496 -21.673490504 8.315673396 1.4610399155 2.6150434594 -18.7909561618 19.4656887606 -1.10679033265 -1.52003081102 -23.9432423176 14.0134039044 -0.770990191457 0.0274795783312 -28.0076374577 7.23401142943 1.37681948106 -1.30887979274 -18.8622720818 -4.64723732565 -0.118948084394 -0.227348555562 1 2 3 4 3 4 12 3 6 2 4 3 5 4 3 4 3 5 4 4 2 5 4 3 3 5 4 3 3 5 4 3 3 6 2 4 3 6 2 4 3 6 3 3 3 5 4 1 6 3 6 1 2 1 1 10 0 210.0 1.07142857143 101.0 0.752475247525 0.22253968254 0.207482993197 0.0985713205917 0.0819976244466 0.0501079796998 0.0326690319699 0.00922071305256 0.0119847108786 0.00146760804586 0.4 0.928571428571 2.0 1.0 1.0 1.0 2.0 3.0 3.0 3.0 2.0 8.0 0.297297297297 1.0 1.0 2.0 0.480952380952 0.6875 0.5 0.5 0.625 0.8125 0.5625 0.5 0.5625 0.4375 0.0 0.0 0.0625 0.875 0.75 0.625 0.6875 0.25 0.5 0.5 0.25 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.75 0.25 0.25 0.5 0.5 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.7162443621 6.32375640552 -10.5946118582 16.0820210732 -5.50492190719 1.27606896595 -25.9392583759 20.7342088866 3.03924270402 -0.918488809227 -14.8899980934 12.681451332 0.275862522612 -2.12433572315 -10.3658459402 -2.57491841531 -1.59786085049 -0.317035516361 -22.2554112139 -7.6554647185 -0.189746828237 0.331840809255 -29.932623972 -6.53686207352 -0.345625809503 -0.210579779616 4 5 4 9 2 4 4 3 1 4 4 3 2 3 4 3 8 4 7 1 1 3 4 3 2 3 3 3 3 3 2 4 3 3 2 4 1 5 2 11 1 5 2 3 1 0 156.0 0.923076923077 89.0 0.674157303371 0.27297008547 0.282051282051 0.088886728957 0.122068814377 0.0600071225071 0.0173609568288 0.00650073248689 0.00537558570244 0.00163195281416 0.833333333333 0.692307692308 2.0 4.0 4.0 0.0 1.0 2.0 3.0 2.0 3.0 13.0 0.277777777778 0.0 3.0 2.0 0.570512820513 0.666666666667 0.416666666667 0.25 0.666666666667 0.666666666667 0.333333333333 0.666666666667 1.0 0.5 0.0833333333333 0.416666666667 0.666666666667 0.666666666667 0.5 0.416666666667 0.666666666667 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.5 1.0 1.0 1.0 0.5 0.0 0.25 0.75 0.75 0.75 0.5 0.5 0.25 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.5 0.25 1.0 0.5 0.0 0.0 0.25 0.5 0.25 0.0 1.0 0.75 0.5 0.5 0.75 0.75 0.5 0.5 -0.734561275809 -1.07735653785 -4.74546109384 0.291193247275 -4.09702638211 4.71568055326 -16.5042082923 19.1148940225 1.76475253799 2.6307929351 -10.9325228135 33.7237753158 0.287026478079 -0.632074970829 -6.379122864 35.0005507081 -0.361997749912 1.49046134959 -7.39585045988 43.0824091796 0.665855797489 0.00827298069753 -1.79913722274 47.4807764912 0.116239343192 0.151567443191 5 4 10 3 2 7 3 3 4 7 2 2 5 4 1 1 2 3 5 4 4 4 5 2 5 4 4 3 6 3 4 3 7 3 2 3 8 3 2 1 9 3 13 3 12 9 8 10 5 12 4 3 7 3 2 4 8 2 2 3 9 2 2 4 8 3 2 4 7 1 5 10 13 2 5 0 352.0 0.727272727273 145.0 0.937931034483 0.167613636364 0.191115702479 0.0487826352367 0.11858594337 0.0406436361289 0.0147243803876 0.0123462603337 0.00706087698181 0.0708695832018 1.625 0.681818181818 4.0 9.0 10.0 3.0 5.0 5.0 1.0 4.0 2.0 12.0 0.293103448276 1.0 3.0 1.0 0.411931818182 0.458333333333 0.5 0.625 0.791666666667 0.458333333333 0.583333333333 0.708333333333 0.375 0.333333333333 0.208333333333 0.5 0.166666666667 0.75 0.416666666667 0.416666666667 0.375 0.0 0.166666666667 0.5 0.166666666667 0.0 0.166666666667 0.333333333333 0.666666666667 0.166666666667 0.666666666667 1.0 0.5 0.166666666667 0.666666666667 0.833333333333 1.0 0.5 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 0.166666666667 0.333333333333 0.666666666667 0.833333333333 0.666666666667 1.0 0.333333333333 0.5 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 1.0 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.5 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 1.0 0.333333333333 -16.2338041954 3.44353422326 -35.2184787718 11.0529700974 5.30448717543 3.93750046662 -21.5226116516 25.517830907 -0.936521954625 2.09275740158 -17.0632161398 47.1133689309 0.25996535128 4.92693790256 -15.9833707377 67.1680375099 1.06486077342 -4.21606584085 -5.70636036841 50.0560438057 0.205432126849 1.41975944679 -3.73300692932 42.5933346532 -0.132517206261 -0.56654959787 2 2 4 2 1 5 1 15 2 9 3 4 7 3 7 4 8 3 8 3 8 3 8 3 8 4 6 6 5 4 6 0 154.0 0.785714285714 70.0 0.628571428571 0.16292798111 0.177179962894 0.042053915051 0.100035484839 0.0250200971233 0.0120999393121 0.00545043479206 -0.00149450150836 0.0564168370816 0.363636363636 0.142857142857 2.0 0.0 2.0 0.0 2.0 0.0 0.0 0.0 1.0 6.0 0.0833333333333 0.0 1.0 1.0 0.454545454545 0.75 0.5 0.416666666667 0.416666666667 0.916666666667 1.0 1.0 1.0 0.666666666667 0.583333333333 0.333333333333 0.583333333333 0.833333333333 0.25 0.0 0.0833333333333 0.5 1.0 0.75 0.25 0.0 0.25 0.25 0.0 0.75 1.0 1.0 0.75 0.5 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 0.75 0.5 0.5 0.5 0.25 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -10.4587534032 6.22977920103 -21.0922076575 15.8582804721 5.62888808935 1.17463772139 -6.12873752851 19.6857012588 -1.91099092987 -1.03296595874 -9.7015032087 13.8277969963 -1.14384836778 -0.225263948378 -18.47253958 11.1856211592 0.941898357215 0.384744502165 -12.505327677 13.0769579813 0.115687790081 -0.319410568107 -7.50809282848 8.77181250768 0.187789280623 -0.297479316723 1 2 3 4 1 2 12 1 10 3 5 2 2 4 4 8 3 9 3 8 4 8 4 9 3 8 4 7 6 6 6 7 2 1 1 6 0 168.0 0.857142857143 73.0 0.657534246575 0.161706349206 0.172619047619 0.0445509056797 0.091157643613 0.0276419595616 0.0126414921882 0.00601036823447 -0.000615840290671 0.0433002934925 0.333333333333 0.214285714286 3.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 3.0 8.0 0.0740740740741 0.0 2.0 1.0 0.434523809524 0.583333333333 0.0833333333333 0.166666666667 0.416666666667 1.0 0.75 0.833333333333 0.916666666667 0.833333333333 0.833333333333 0.666666666667 0.833333333333 0.583333333333 0.166666666667 0.0 0.166666666667 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.25 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 0.75 0.5 0.25 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -9.8676064717 6.50261624633 -18.8308390152 17.5239705323 6.72673239068 2.85133272682 -0.763634346606 28.4229557677 -2.19018678663 0.237733375755 -2.76184939272 29.8156549129 0.109969695366 -0.145952005066 -5.30303870744 28.6709823033 0.923540701121 0.473680751923 4.04277795138 32.4946638473 0.500795582614 0.565847831862 9.94636663649 38.2821103328 -0.00995335212975 0.0207116306947 10 1 1 1 9 7 8 8 6 3 2 4 4 4 4 2 4 4 11 3 11 4 11 3 11 3 11 4 11 4 11 4 4 3 4 5 2 3 5 9 7 7 11 1 10 0 255.0 0.882352941176 87.0 0.827586206897 0.130718954248 0.162399077278 0.0497902013554 0.0912327234623 0.0245537538353 0.0203328217761 0.00613664458197 0.00168996728489 0.0507430261458 0.466666666667 0.294117647059 0.0 2.0 3.0 0.0 2.0 1.0 0.0 2.0 3.0 8.0 0.225806451613 1.0 2.0 1.0 0.341176470588 0.0 0.3 0.85 0.75 0.2 0.75 0.3 0.6 0.55 0.15 0.1 0.5 0.65 0.05 0.1 0.15 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 0.666666666667 0.0 0.0 0.333333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 0.0 0.166666666667 0.833333333333 1.0 0.666666666667 0.5 0.833333333333 0.833333333333 0.0 0.333333333333 1.0 0.833333333333 0.166666666667 0.0 0.5 0.833333333333 0.0 0.5 0.833333333333 0.333333333333 0.0 0.0 0.333333333333 0.666666666667 0.333333333333 0.833333333333 0.5 0.0 0.0 0.0 0.5 0.666666666667 0.666666666667 0.833333333333 0.166666666667 0.0 0.0 0.166666666667 0.833333333333 0.5 -14.0056349921 3.44523641517 -30.9217967237 9.84804328598 4.58760155117 2.03179280088 -13.8802669212 15.2333075806 3.12852384332 -1.63026048393 3.44500546977 8.92610135631 -2.83074661461 0.317289763852 -10.8202174589 8.14676142063 -0.192435099842 0.0312816440151 -13.7118974209 6.98297979273 1.80407925535 -0.898327572396 3.43283152557 0.0696098058815 0.135157720977 0.0705369639878 5 6 5 4 1 5 2 4 3 4 1 4 5 2 2 3 10 3 9 4 9 4 10 3 10 4 9 5 5 1 3 10 4 8 6 5 4 0 182.0 0.928571428571 79.0 0.73417721519 0.174556213018 0.201334379906 0.0638753680808 0.103701741442 0.0412958765664 0.0224597527596 0.0151199800026 0.00575221065588 0.0423158024439 0.615384615385 0.285714285714 0.0 2.0 3.0 3.0 2.0 1.0 0.0 1.0 0.0 8.0 0.0714285714286 1.0 2.0 1.0 0.434065934066 0.375 0.8125 0.875 0.5625 0.6875 0.3125 0.3125 0.8125 0.5 0.0 0.0 0.5 0.75 0.125 0.0 0.375 0.0 0.0 0.25 0.5 0.5 0.75 1.0 0.75 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.5 0.5 0.5 0.5 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -11.6410472662 -1.40965806739 -27.6141955002 1.86400979318 0.809230964292 8.20993581807 -24.5688372244 32.3908609134 1.99330510508 2.63618662589 -11.715974403 48.0951411517 0.148687017741 -2.14820597388 -6.75920202423 35.6266696128 0.536324236261 -0.270657578732 -3.32187755053 28.2378226309 -0.37858842333 -0.267383936449 -8.04831834277 23.1018033387 -0.317019397922 -0.301419245657 2 9 2 11 3 6 6 6 7 5 7 5 7 5 7 5 6 6 6 6 6 5 8 4 8 4 8 5 7 5 7 5 7 5 7 5 7 5 3 9 4 7 5 6 5 0 264.0 0.545454545455 129.0 0.441860465116 0.222853535354 0.223312672176 0.0361568073991 0.183181189912 0.0461218373473 0.00410961844081 0.0104639971906 0.000636055038799 0.146166991168 0.416666666667 0.0 2.0 2.0 1.0 0.0 0.0 0.0 0.0 0.0 3.0 5.0 0.09375 0.0 10.0 1.0 0.488636363636 0.166666666667 0.0 0.0 0.277777777778 0.666666666667 0.5 0.388888888889 0.555555555556 1.0 1.0 1.0 1.0 1.0 0.944444444444 0.833333333333 0.944444444444 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.333333333333 0.0 0.166666666667 0.5 0.166666666667 0.0 0.0 1.0 0.833333333333 0.5 0.666666666667 1.0 0.666666666667 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.5 0.833333333333 1.0 -7.08962928318 1.7651730052 -14.234464967 4.92545133494 3.22339579333 1.23533412253 -9.63138780109 11.1834811036 -3.25146736888 1.75925253737 -13.3328982453 20.9626966863 3.66019595021 0.576911357643 -1.38011288546 24.4923184603 -1.82912733518 -0.775834996495 -4.02517059386 18.8261348867 0.52952029679 -0.403209154915 -8.39090655653 8.56342991658 -0.256202796797 -0.562829294353 1 4 6 4 4 2 4 1 4 4 3 1 3 5 3 1 3 8 4 8 3 9 3 9 4 9 4 8 4 9 9 3 7 7 1 1 2 4 0 168.0 0.857142857143 71.0 0.760563380282 0.157242063492 0.1875 0.0545936504562 0.103435905612 0.0345052083333 0.0203868922454 0.0133185198412 0.00434061886693 0.0535804198555 0.666666666667 0.285714285714 0.0 3.0 3.0 2.0 2.0 1.0 0.0 0.0 4.0 7.0 0.214285714286 1.0 2.0 1.0 0.422619047619 0.416666666667 0.833333333333 0.916666666667 0.5 0.75 0.583333333333 0.583333333333 1.0 0.5 0.0 0.0833333333333 0.666666666667 0.333333333333 0.0 0.0 0.5 0.0 0.25 0.5 0.5 0.75 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 0.5 0.75 0.75 1.0 0.75 0.5 0.5 0.25 0.0 0.25 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 -12.1412485159 -0.0454728408834 -28.5770872021 4.79426707845 1.15955744253 7.57308404141 -24.4872858326 32.4992146107 1.89931969363 1.86634667573 -12.370266495 44.296643077 -0.398197485914 -1.71305102466 -11.9385695326 35.1624610648 -0.016840409705 0.652710264475 -13.1277912355 36.9080037698 -0.138386539117 0.449787242189 -14.4465842901 41.6193010233 -0.0366405843776 -0.0376681965928 7 3 9 8 6 3 4 2 4 4 6 2 2 4 7 3 1 4 8 2 1 4 8 7 7 8 7 8 7 3 2 4 6 3 2 5 5 3 3 3 5 2 6 7 5 0 210.0 1.07142857143 92.0 0.760869565217 0.187619047619 0.213605442177 0.093101068999 0.0852603390563 0.0497874959508 0.0389156891694 0.010133647494 0.0144345607417 0.0149828056422 0.6 0.785714285714 0.0 3.0 3.0 1.0 1.0 3.0 3.0 3.0 4.0 9.0 0.307692307692 0.0 2.0 3.0 0.438095238095 0.25 0.9375 1.0 0.75 0.5 0.3125 0.25 0.5 0.4375 0.0 0.0 0.0 0.5 0.375 0.4375 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.5 0.5 0.5 0.5 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -6.11154981473 2.54647908947 -21.2944934807 8.86420288244 -9.99577925253 4.23055059397 -57.4988059604 24.5723149583 -1.45168170908 0.762208348499 -68.7630300622 27.969564023 0.939939482785 -1.95841419711 -64.0937477804 14.1591596004 -1.53546961083 -0.719235543812 -74.2650918597 7.21430214086 -1.11785164755 1.19803218872 -90.003165581 20.1511728901 -0.455641639474 0.464495959926 2 4 11 6 12 5 13 4 13 4 14 3 14 3 14 3 14 3 14 3 2 5 7 4 3 4 6 3 5 3 5 4 6 3 4 4 6 2 5 4 6 3 4 3 7 2 5 3 6 3 5 3 7 2 6 2 7 3 4 4 5 4 2 7 3 14 3 7 374.0 0.772727272727 134.0 0.708955223881 0.139351997483 0.20320855615 0.0464631546077 0.136758103396 0.0611188397118 0.0179836332068 0.0244307287775 0.0196721914721 0.101528725724 0.588235294118 0.590909090909 4.0 1.0 3.0 2.0 0.0 1.0 5.0 5.0 1.0 4.0 0.181818181818 1.0 0.0 2.0 0.358288770053 0.666666666667 0.4 0.533333333333 0.633333333333 0.4 0.466666666667 0.4 0.3 0.0 0.266666666667 0.3 0.333333333333 0.0 0.1 0.466666666667 0.566666666667 0.666666666667 0.444444444444 0.111111111111 0.0 0.0 0.111111111111 0.333333333333 0.333333333333 1.0 1.0 0.777777777778 0.666666666667 0.666666666667 0.777777777778 1.0 1.0 0.666666666667 0.666666666667 0.666666666667 0.666666666667 0.777777777778 0.777777777778 0.666666666667 0.444444444444 0.0 0.0 0.0 0.0 0.222222222222 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.444444444444 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.333333333333 0.444444444444 0.0 0.0 0.0 0.0 0.333333333333 0.777777777778 0.888888888889 0.777777777778 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.222222222222 0.111111111111 -11.4012813779 -10.7646616055 -25.7944721196 -26.931364901 3.35636370973 -0.757630142322 -10.4279322073 -25.9104912074 4.0376103301 4.14160886673 4.12513497266 -7.30513425418 -5.34025537049 -0.91536155466 -15.7386361849 -0.970966696494 3.3012285942 2.07440425088 -1.75326004941 5.04215386803 0.381680450028 -2.23011975624 8.77600827167 -5.1373718158 -0.248893864224 0.381237900112 1 2 12 4 12 3 12 3 13 2 12 3 13 3 12 3 11 3 13 3 4 3 4 4 5 3 4 3 6 3 3 3 6 3 3 3 7 3 1 3 8 3 2 3 7 3 1 4 6 4 2 3 6 4 2 3 5 4 3 4 4 4 2 6 2 4 4 9 4 0 330.0 0.681818181818 118.0 0.796610169492 0.145454545455 0.211157024793 0.0479071708824 0.155991902496 0.0659621003423 0.0194121094873 0.025347143801 0.0200445489143 0.128104462134 0.733333333333 0.545454545455 6.0 2.0 1.0 1.0 0.0 1.0 5.0 5.0 5.0 8.0 0.111111111111 1.0 1.0 3.0 0.357575757576 0.708333333333 0.625 0.583333333333 0.583333333333 0.208333333333 0.416666666667 0.458333333333 0.625 0.0 0.0416666666667 0.0 0.0833333333333 0.0 0.25 0.416666666667 0.625 0.666666666667 0.333333333333 0.166666666667 0.166666666667 0.333333333333 0.166666666667 0.166666666667 0.333333333333 1.0 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.666666666667 0.666666666667 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.5 0.666666666667 0.833333333333 0.833333333333 1.0 0.833333333333 0.833333333333 0.0 0.0 0.166666666667 0.333333333333 0.333333333333 0.5 0.333333333333 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -8.79692776362 -14.4975684526 -21.0508815253 -33.5622216815 0.854247117542 2.86173980131 -15.1575594828 -19.3682995676 3.12169439031 5.79414647856 -3.87415464143 10.7196992445 -3.28774430329 -1.36134942901 -14.1365478196 11.6757449079 2.38283249876 0.578236661923 -2.80999849209 9.71274934795 0.236493227908 -0.966124059234 3.0453643963 1.18024054187 -0.276394539664 -0.202552506774 8 2 4 1 6 2 2 1 7 2 2 1 6 3 1 2 4 1 30 1 10 3 10 2 7 1 2 4 3 4 2 9 4 4 9 3 5 0 168.0 0.857142857143 46.0 1.5652173913 0.121527777778 0.151785714286 0.0528524777967 0.099077912415 0.0455419146825 0.0237045834149 0.0207005653948 0.0135744320555 0.0620184937996 0.666666666667 0.285714285714 3.0 0.0 3.0 2.0 2.0 1.0 1.0 1.0 1.0 3.0 0.260869565217 2.0 1.0 0.0 0.27380952381 0.25 0.25 0.5 0.416666666667 0.0833333333333 0.0 0.166666666667 0.75 0.0 0.0833333333333 0.0 0.583333333333 0.166666666667 0.166666666667 0.0 0.416666666667 0.0 0.25 0.5 0.75 0.5 0.0 0.25 0.75 0.25 0.5 0.5 0.5 0.25 0.0 0.25 0.75 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.25 0.25 0.0 0.0 0.0 0.25 0.0 0.25 0.25 0.0 0.0 0.0 0.0 -3.59235442979 -4.86559397452 -8.9004437666 -8.4236445371 -0.119250205174 5.07207779282 -7.68661555152 9.56674837942 2.05344629884 1.43690199975 3.77696824164 19.3526631664 0.694180172051 -1.23609146421 9.85910030655 13.6866159377 -0.460262795462 0.621863108222 7.36723977967 15.5226178402 0.124695707317 -0.0412006221996 7.92773221205 15.7269828947 0.0982696325678 -0.0721187072744 4 3 5 7 2 3 3 3 1 3 4 6 4 1 2 4 6 7 4 7 2 9 1 2 4 5 5 6 4 3 1 8 2 7 2 0 140.0 0.714285714286 84.0 0.607142857143 0.27 0.298469387755 0.0662959183673 0.150435495627 0.0535459183673 0.0125877964621 0.00421317404004 0.00403351716074 0.0530447309144 1.3 0.428571428571 2.0 2.0 4.0 2.0 1.0 2.0 1.0 2.0 2.0 12.0 0.305555555556 0.0 3.0 2.0 0.6 0.416666666667 0.75 0.583333333333 0.75 0.666666666667 0.833333333333 0.833333333333 0.416666666667 0.5 0.333333333333 0.75 0.25 0.583333333333 0.333333333333 0.833333333333 0.75 0.0 0.25 0.5 0.75 0.75 0.5 0.25 0.25 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 0.75 0.75 0.25 0.0 0.0 0.5 1.0 1.0 0.5 1.0 0.75 0.5 0.25 0.25 0.75 1.0 -6.36619772368 1.45513090827 -15.4200087691 5.79502428943 0.0983698190539 4.07213930197 -14.0350924291 24.2461148664 1.8244817383 3.67555400913 -3.91448973801 41.3685666303 0.104428986494 -1.53117690926 0.30547309603 36.2359055073 0.519222509413 0.0927851512555 5.00141280707 31.0875733092 0.505808692189 -0.414758006002 10.7108096515 29.3894307383 0.0264551575939 0.152714704317 3 5 6 8 4 10 3 4 2 5 2 2 5 3 10 4 8 5 5 9 2 11 1 4 3 4 2 3 4 5 1 4 2 20 1 6 1 4 1 0 182.0 0.928571428571 116.0 0.456896551724 0.284868977177 0.327708006279 0.0827791939976 0.125108483474 0.0589526401626 0.0121589045659 0.00172566560184 0.0056131029685 -0.00865419486868 1.0 0.428571428571 3.0 6.0 2.0 2.0 0.0 2.0 1.0 2.0 5.0 16.0 0.121951219512 0.0 3.0 2.0 0.637362637363 0.75 0.375 0.5 0.9375 0.875 0.1875 0.625 0.4375 0.8125 0.875 0.9375 0.875 0.1875 0.4375 0.625 0.8125 0.25 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.5 0.75 1.0 1.0 0.5 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.75 0.25 0.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.4555334077 -2.728370453 -10.0202554241 -5.87296679902 -5.82284367598 1.31407229981 -28.2027020651 0.244820739306 1.39559103175 1.79148031171 -25.6603530447 9.29012024865 -0.0928263200421 -0.593645205087 -24.7564360829 7.36565861373 -1.25614364578 -0.356490865148 -33.5563175852 1.71966676798 0.152960099427 -0.638738568924 -35.8676418402 -5.3670579185 -0.163404429548 -0.126349627235 5 5 5 2 3 3 2 3 5 3 1 11 1 10 2 3 1 1 1 1 1 1 3 3 8 3 10 3 9 3 9 3 11 7 7 4 3 0 156.0 0.923076923077 69.0 0.840579710145 0.185897435897 0.179980276134 0.0673772315784 0.0820592369224 0.0344250998837 0.0218021668045 0.00890175459088 0.00355129661975 0.0252180114445 1.0 0.384615384615 0.0 5.0 6.0 1.0 2.0 3.0 0.0 0.0 1.0 10.0 0.111111111111 0.0 3.0 1.0 0.442307692308 0.333333333333 0.666666666667 0.75 0.333333333333 0.583333333333 0.833333333333 0.583333333333 0.5 0.5 0.583333333333 0.0 0.416666666667 0.583333333333 0.583333333333 0.0 0.5 0.0 0.25 0.5 0.5 0.5 0.5 0.75 0.75 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.75 1.0 1.0 1.0 1.0 0.75 0.75 0.5 0.75 0.75 1.0 0.75 0.5 0.25 0.25 0.5 0.25 0.5 1.0 0.75 0.25 0.0 0.0 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.5 0.0 0.5 1.0 0.75 0.25 0.0 0.0 0.75 0.25 0.5 1.0 0.75 0.25 0.0 0.0 -9.01061831659 5.09295817894 -21.7843039836 11.8536280861 0.0579535523321 -0.0115907104664 -21.1374934468 16.7891630481 1.62331672207 3.7754853282 -12.2243560899 34.6778574642 -0.703843732065 0.945488597545 -15.4551730001 41.9135320382 -0.903438079776 -1.45286598339 -23.9758694904 32.4231957262 -0.369254836734 0.615128242689 -30.2977704016 36.7687408023 -0.218574105272 0.385643193942 7 15 7 17 5 4 1 1 3 9 4 5 7 7 3 5 8 7 2 5 10 6 1 5 12 5 1 5 13 3 2 4 19 4 18 5 18 5 18 5 19 5 18 5 18 6 18 6 12 2 3 7 9 4 4 7 6 6 5 6 4 6 8 14 11 9 7 0 506.0 1.04545454545 205.0 0.526829268293 0.182763361402 0.180021559468 0.0897375119 0.0874221183199 0.039584555087 0.0389353758556 0.0141243779655 0.00776538085135 0.023904937796 0.739130434783 0.5 0.0 5.0 5.0 5.0 4.0 3.0 0.0 4.0 2.0 5.0 0.270833333333 1.0 2.0 1.0 0.405138339921 0.277777777778 0.75 0.833333333333 0.527777777778 0.638888888889 0.111111111111 0.111111111111 0.694444444444 0.416666666667 0.0 0.0 0.222222222222 0.888888888889 0.25 0.0 0.5 0.0 0.0 0.333333333333 0.666666666667 0.777777777778 1.0 0.777777777778 0.555555555556 0.0 0.333333333333 0.888888888889 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.888888888889 0.888888888889 0.555555555556 0.333333333333 0.333333333333 0.555555555556 0.888888888889 0.888888888889 0.888888888889 0.333333333333 0.0 0.0 0.0 0.0 0.333333333333 0.888888888889 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.777777777778 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.555555555556 0.111111111111 0.0 0.0 0.0 0.0 0.0 -20.6486239211 -1.10716482151 -52.0056295851 3.56836113212 -3.21485921376 10.357328076 -63.718336041 46.7807680128 2.03210763692 7.62964476606 -52.6326093911 88.7368773874 -0.72111259057 -1.57693603545 -52.9421241926 79.317488495 -0.277070397293 -3.42247177233 -51.8773227295 47.3629579097 1.78051775157 -0.425320243247 -32.951229569 36.7036758601 0.418392271295 0.0735853316648 10 3 9 6 8 6 9 5 10 4 10 4 10 3 11 4 7 1 1 4 4 10 3 4 1 7 1 4 4 4 2 3 5 9 6 3 1 4 6 8 5 4 1 4 6 3 1 4 6 3 2 4 5 3 2 6 2 5 3 11 5 3 13 1 6 0 322.0 0.608695652174 147.0 0.571428571429 0.256211180124 0.233999459897 0.0714484898093 0.157960876586 0.058203814936 0.015990628408 0.00988732854657 0.0063005803901 0.077164456899 1.0 0.478260869565 0.0 2.0 6.0 0.0 0.0 1.0 5.0 3.0 4.0 17.0 0.264150943396 0.0 2.0 2.0 0.45652173913 0.0 0.125 0.833333333333 0.791666666667 0.0 0.291666666667 0.375 0.541666666667 0.208333333333 0.375 0.25 0.291666666667 0.875 0.875 0.916666666667 0.875 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 1.0 0.0 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.666666666667 0.833333333333 0.5 0.5 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.166666666667 0.666666666667 0.166666666667 0.0 0.0 0.333333333333 0.166666666667 0.0 0.166666666667 0.833333333333 0.333333333333 0.0 0.0 1.57770987065 -2.10361316087 2.44490001969 -2.53944036971 -0.678897143624 5.5389635163 8.17248573031 27.3493987034 5.34659560182 8.7463354281 22.1098793663 60.7853889611 -5.44465458632 -7.145791275 1.93210258525 28.5477415324 1.98810985055 -0.251779550612 3.6078401893 10.3073341835 0.0917044064615 0.388637828202 12.6385965455 18.8727981581 0.0690679115719 0.28900442417 1 2 1 4 4 1 5 1 11 3 4 3 3 2 3 2 4 2 3 2 3 3 0 66.0 0.545454545455 41.0 0.560975609756 0.255050505051 0.275482093664 0.0405049113727 0.162061385202 0.0408492639898 0.00481679436889 -0.00260476246889 0.000462506089195 0.116792596055 0.666666666667 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.235294117647 0.0 3.0 1.0 0.621212121212 0.5 1.0 0.333333333333 0.166666666667 0.833333333333 1.0 0.5 0.5 0.833333333333 1.0 0.833333333333 0.833333333333 0.666666666667 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 -4.45633840657 4.05121673325 -10.2102843333 9.56381626018 0.818374478228 -0.299416962811 -7.64223809285 8.77951167692 0.381261921159 -0.425119434459 -5.17539742532 5.38991305268 -0.604608601386 -0.135113986034 -7.54524897343 3.34842757001 0.310571994156 -0.378832428749 -6.71690567949 -1.02269842741 -0.105007490219 -0.621233574861 -5.62626916714 -7.89762866806 0.13406235551 -0.0762770249303 0 6 9 6 9 6 10 5 11 4 11 4 11 4 11 4 11 4 3 2 6 10 5 6 1 4 4 5 3 4 3 4 5 3 3 3 6 3 2 4 6 3 2 4 6 3 2 4 6 2 3 4 6 3 2 4 6 2 2 5 5 12 2 6 1 3 6 5 330.0 0.681818181818 151.0 0.562913907285 0.176565656566 0.242975206612 0.0496714806467 0.158334418566 0.0636370314717 0.016574411048 0.0184448506551 0.0171934972901 0.118371288985 0.533333333333 0.590909090909 2.0 1.0 1.0 2.0 0.0 1.0 5.0 5.0 3.0 8.0 0.142857142857 1.0 2.0 2.0 0.457575757576 0.791666666667 0.5 0.583333333333 0.833333333333 0.75 0.833333333333 0.708333333333 0.583333333333 0.0 0.333333333333 0.166666666667 0.0833333333333 0.0 0.375 0.625 0.625 1.0 0.5 0.0 0.0 0.0 0.0 0.166666666667 0.5 1.0 0.833333333333 0.5 0.5 0.5 0.5 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.5 0.5 0.5 0.833333333333 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 -12.7902699721 -8.13137072888 -27.9517023124 -21.7970309607 4.58177306871 -2.00880801388 -11.6628059363 -21.5692401312 2.02659609949 6.16419103529 -1.93146341849 0.96365471246 -4.00377886697 -3.01980970768 -22.2758450735 -0.646186290304 0.823102893054 2.70557366153 -22.2640731622 4.94668198136 0.304405636616 -2.34321385574 -21.185240952 -5.23865960872 -0.504086215128 0.211468846436 1 0 5 2 4 1 12 1 10 3 5 7 4 8 4 9 2 10 2 23 1 10 3 8 4 8 6 4 0 156.0 0.923076923077 62.0 0.645161290323 0.151709401709 0.130177514793 0.0495140680052 0.0703990289789 0.0249171850503 0.0161198516858 0.00906811738971 0.000463830190038 0.0328823477493 0.5 0.0 1.0 3.0 2.0 0.0 1.0 0.0 4294967295.0 0.0 0.0 4.0 0.15 3.0 2.0 1.0 0.397435897436 0.75 0.25 0.0 0.166666666667 1.0 0.916666666667 0.416666666667 0.75 0.833333333333 0.666666666667 0.25 0.666666666667 0.75 0.0833333333333 0.0 0.166666666667 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.75 0.5 0.5 0.25 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.25 0.5 1.0 1.0 0.75 0.5 0.25 0.0 0.0 0.75 1.0 0.75 0.25 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -7.63943726841 6.46413922712 -15.9645471535 16.7537254413 3.54328018958 1.99939755546 -5.14269512787 25.9491762424 0.152482997515 1.33317174794 -0.708310089257 32.7312104124 -0.493171967213 0.455898180563 -2.17951024864 36.1270703848 0.971608549382 0.0825073472773 3.45007725712 37.5444762919 -0.270661177444 0.49796647004 3.84225093811 42.7495981829 0.06816678674 0.193674159084 2 2 3 5 2 14 1 5 3 4 1 0 42.0 1.16666666667 30.0 0.366666666667 0.292517006803 0.31746031746 0.0895151711478 0.0700788251809 0.0460263470468 0.0118472119211 -0.000125953984227 0.00055241235602 -0.0470758470749 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0909090909091 0.0 3.0 3.0 0.714285714286 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.91026181654 2.00080499887 -7.25425462064 4.80150959276 -0.326662040632 -0.0928017160886 -8.33188248611 4.18027401219 0.464235849952 -0.551886123841 -5.34094540606 1.20147337493 0.291857338714 0.133515425234 -2.06921205901 1.65336643836 0.379876235354 0.199279137439 1.70187712349 2.74119976836 0.196534193612 -0.358780629796 3.65235351964 -1.14194597168 -0.0608959063478 -0.135110063896 4 5 3 6 1 3 1 7 3 3 5 3 6 2 6 3 5 4 5 3 6 2 6 4 5 4 5 4 6 2 4 0 126.0 0.642857142857 55.0 0.763636363636 0.219576719577 0.173469387755 0.0525906129648 0.119605514163 0.0390076665587 0.010485741615 0.00988142483787 -0.00051831300611 0.0615265938965 0.555555555556 0.142857142857 0.0 2.0 3.0 0.0 1.0 1.0 0.0 0.0 3.0 0.0 0.318181818182 0.0 2.0 1.0 0.436507936508 0.416666666667 0.25 0.0 0.25 0.5 0.166666666667 0.583333333333 0.916666666667 0.75 0.666666666667 0.75 0.583333333333 1.0 0.583333333333 0.166666666667 0.0 0.0 0.25 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.25 0.75 0.75 0.25 0.0 0.0 0.25 0.5 0.75 0.75 0.25 0.0 0.0 0.25 0.75 1.0 1.0 0.75 0.25 0.25 0.5 0.75 1.0 1.0 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.25 1.0 1.0 1.0 0.75 0.25 0.0 0.0 0.0 -3.09215318007 5.68410511042 -6.27387644656 16.1451108961 1.30386411104 3.93084868922 -4.75930262315 31.6049709058 -1.64396346138 0.778514069745 -8.23628244587 33.3047460896 1.15113680285 -2.06277918717 -5.76456114453 21.6327783704 -0.743847734223 0.258703849116 -6.90513182642 15.9481194856 0.490069445525 -1.19877764037 -4.69644610502 6.3046613255 0.0518167182035 -0.148951126943 1 2 3 2 17 1 5 2 3 1 0 36.0 1.0 28.0 0.285714285714 0.361111111111 0.324074074074 0.0841049382716 0.0786179698217 0.0334362139918 0.00300068587106 -0.00118122237464 -0.00428669410151 -0.0719442221714 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.181818181818 0.0 1.0 3.0 0.777777777778 0.25 0.75 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.9098593171 2.75868568026 -4.92705913381 7.40179197913 -0.45978094671 1.16713624934 -6.4428110278 11.9422173507 0.326169389546 0.171599156749 -4.49762802647 13.0166157841 0.193467497124 0.0608019912909 -2.87839891829 13.3170868461 -0.13401180965 0.149585270016 -3.89285678764 14.266055386 -0.175022865304 -0.00706910577647 -5.77159171203 13.6871199998 -0.00191971907365 -0.0965690908737 2 5 1 15 1 4 2 5 2 4 3 4 3 3 3 4 3 3 3 4 3 6 1 6 1 5 2 0 98.0 0.5 68.0 0.382352941176 0.291545189504 0.309766763848 0.0391333542997 0.213441040723 0.0227668743466 0.0034706640158 -0.00588356630917 -0.00463279132786 0.180267849996 0.714285714286 0.0714285714286 1.0 1.0 0.0 1.0 0.0 1.0 0.0 0.0 2.0 7.0 0.142857142857 0.0 2.0 1.0 0.69387755102 0.625 0.25 0.25 0.875 0.75 0.5 0.75 1.0 0.875 0.875 1.0 1.0 1.0 1.0 0.875 0.75 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 -6.27525204191 3.72877295244 -12.4964247498 9.67745399451 3.23924390007 1.50013974057 -5.91008178307 18.0266989461 -2.19739785875 1.98486298978 -8.4439207504 24.4924122899 1.8130698159 -1.72495164415 -3.39710191608 16.5628229048 -0.797844212674 0.00656095160411 -4.37611272101 10.9340028483 -0.00692496946565 -0.684118823118 -7.34195748256 3.87336421 0.0433886731712 -0.231737283556 0 5 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1 13 4 0 78.0 0.461538461538 49.0 0.489795918367 0.275641025641 0.284023668639 0.0354460628129 0.228897992212 0.0499165528751 0.00272058091342 0.00241014506663 0.00207471137053 0.211896747486 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 7.0 0.0 0.0 2.0 1.0 0.628205128205 0.625 0.0 0.0 0.625 0.875 0.5 0.5 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.0851573584 1.37118104818 -6.58506229477 4.98133492473 0.955364310194 2.49779810551 -5.36555960714 13.6209529509 -0.965744511549 0.0234214652324 -6.43064661697 14.8562998392 0.913998934977 -0.232973118046 -4.38891011213 13.8348920863 -0.850198013031 0.7106322106 -7.78416726051 19.3730817446 0.138720238656 0.466294627275 -9.62298417843 25.0728559691 -0.0963332362201 0.0340753158958 3 3 2 20 1 5 3 3 2 0 42.0 1.16666666667 31.0 0.354838709677 0.336734693878 0.301587301587 0.0984369938452 0.0648957995897 0.029397473275 0.00743882247318 -0.00198332895793 -0.00611838834247 -0.0659070586569 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.272727272727 0.0 2.0 2.0 0.738095238095 0.25 0.75 1.0 0.75 0.5 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 3.81971863421 -6.11723647978 9.43031085706 0.0371206864354 0.345222383849 -6.12850315758 11.0430899328 0.246208634521 -0.0638627319695 -4.30483595429 10.9919951362 0.0738301232835 0.691191510371 -2.60886432355 15.7949071785 0.436639721628 0.640670094901 1.01837296547 22.1612479517 0.0853700288436 0.34053868746 1.9214104455 26.4015010112 -0.0869288504914 0.0547725586693 0 4 2 4 1 4 1 3 3 2 2 3 3 2 2 3 3 2 2 4 1 9 60.0 0.416666666667 40.0 0.5 0.296666666667 0.311111111111 0.0313842592593 0.276037037037 0.0493703703704 0.00180737230548 0.00381648241632 -0.000284815688875 0.315016113273 1.0 0.0 1.0 3.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 2.0 0.105263157895 0.0 6.0 1.0 0.666666666667 0.666666666667 0.333333333333 0.166666666667 0.166666666667 1.0 0.833333333333 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.65258238486 1.06103295395 -4.85170041116 3.97017273614 1.86343912537 2.15743367302 -1.22082724543 11.7863593359 -1.47567292496 0.325084614343 -3.53066539443 14.0233502923 1.18019139526 -0.458286964508 -0.885725388375 10.751331281 -0.724432121675 -0.168699325 -1.97306976189 7.23535786044 0.405851838394 -0.612662518012 -1.51311639892 -0.128538727615 -0.0530625738912 -0.203191771661 1 2 3 19 25.0 1.0 21.0 0.190476190476 0.344 0.392 0.081664 0.084736 0.025152 0.005895168 -0.005728768 0.000295424 -0.068210176 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 3.0 1.0 0.84 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 1.52788745368 -3.95547812967 3.95547812967 -0.366692988884 0.366692988884 -4.95536922414 4.95536922414 0.501147084808 -0.501147084808 -1.68393175522 1.68393175522 0.591272072742 -0.591272072742 3.04887705515 -3.04887705515 0.176128672623 -0.176128672623 4.9017833306 -4.9017833306 -0.185236322543 0.185236322543 2.88585156311 -2.88585156311 -0.0748437511072 0.0748437511072 0 4 1 4 1 4 2 3 2 3 2 3 2 3 2 4 2 3 2 2 2 9 1 3 1 0 65.0 0.384615384615 45.0 0.444444444444 0.283076923077 0.315976331361 0.0269312699135 0.276507965407 0.0513827947201 0.00160138869882 0.00298437968087 0.00100357610736 0.358752717732 0.6 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 7.0 0.294117647059 0.0 3.0 1.0 0.692307692308 0.875 0.5 0.25 0.5 1.0 1.0 0.75 0.875 1.0 1.0 1.0 1.0 0.5 0.5 0.75 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.330011117 1.37118104818 -6.44492306078 4.52481246503 2.02141990534 1.91014908486 -1.78941057043 11.8723977298 -1.06867036341 0.626563630816 -2.62588830242 15.2830221779 0.892224248718 -0.59315542991 -0.166808974282 9.95770140614 -0.426561162531 -0.932509342581 -1.48676559469 1.76646730897 -0.114075904439 -0.146782055371 -2.59748305954 -3.08483687245 0.128145776974 -0.156870543813 1 1 4 12 1 5 1 5 3 1 2 0 36.0 1.0 24.0 0.5 0.296296296296 0.268518518519 0.0896776406036 0.0667866941015 0.0477537722908 0.013615810598 0.000717624345882 0.000565208555606 -0.0337974076614 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 3.0 0.0 0.0 1.0 3.0 0.666666666667 0.75 1.0 0.75 0.5 0.75 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.69765272631 3.39530545263 -4.41958593704 8.5803213373 -0.495148711841 0.636619772368 -6.25640653852 11.3830038829 0.120512384893 0.151950398343 -5.28298844862 12.221589944 0.264676053052 0.324641152781 -3.10450065991 13.995392071 0.0611294705977 0.0416262585499 -2.74617617449 14.5398183507 -0.298401031044 -0.0348219662869 -5.72046542967 13.5337411527 -0.0467216154487 -0.0873335365172 1 4 1 18 4 2 4 2 3 3 2 3 1 4 2 0 54.0 0.666666666667 36.0 0.416666666667 0.308641975309 0.257201646091 0.0633795661231 0.13293832241 0.0420159528527 0.00626818398923 0.000703791155456 0.000174827510055 0.0323689197888 0.666666666667 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 2.0 7.0 0.0625 0.0 2.0 1.0 0.666666666667 0.833333333333 0.666666666667 0.0 0.333333333333 1.0 0.666666666667 0.0 0.5 1.0 0.666666666667 0.166666666667 0.833333333333 1.0 0.833333333333 0.666666666667 0.833333333333 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.5 -1.27323954474 3.81971863421 -4.10011241068 9.8047785763 -1.13700815312 0.780710667348 -5.58003438887 12.0924845984 1.94145904873 -0.734265207148 1.33511973913 8.82174538538 -0.695827125943 0.119888938031 1.64750206783 6.29522187359 0.597588014643 -0.956018494387 3.77227133382 -1.58136052578 -0.0489284236514 -0.606784289242 4.32368991904 -9.78386251414 -0.139366279132 -0.0731330912874 1 0 7 1 8 1 5 3 4 3 0 32.0 2.0 24.0 0.291666666667 0.2890625 0.234375 0.141479492188 0.0350341796875 0.0181884765625 0.0257574564116 -0.00084968046598 -0.00731804160064 -0.0442359834979 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.0909090909091 0.0 1.0 3.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -3.42183127648 3.74014116266 -7.73011902487 7.41060650378 0.584397056666 -2.26547114307 -7.08407588958 0.687397394012 -0.462388628612 0.152160829382 -6.5971780815 -1.07169045463 0.822320776906 0.285692545475 -1.62294981802 1.88887566239 0.492443130562 0.150499879158 4.64563568344 2.27787868938 0.309371136983 -0.420349966865 7.24960085779 -1.5963059379 -0.0949669070733 -0.0828716511063 0 1 1 2 1 15 1 3 1 0 25.0 1.0 21.0 0.190476190476 0.328 0.336 0.079616 0.075904 0.024192 0.005090304 -0.002663424 -0.003249152 -0.051492864 0.0 0.2 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0 2.0 2.0 0.84 0.75 1.0 1.0 0.75 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.78253536263 1.78253536263 -4.38762996142 4.38762996142 -0.101859163579 0.101859163579 -4.56643257557 4.56643257557 0.454291869562 -0.454291869562 -1.50646140298 1.50646140298 0.437749941396 -0.437749941396 2.43840209153 -2.43840209153 0.316142812107 -0.316142812107 5.17611801521 -5.17611801521 -0.155146402015 0.155146402015 3.37730824484 -3.37730824484 -0.117585562809 0.117585562809 2 4 3 5 4 4 4 4 4 4 5 3 5 3 4 3 5 4 4 4 4 4 2 8 1 6 3 4 2 0 112.0 0.571428571429 60.0 0.583333333333 0.233258928571 0.264668367347 0.0364310484238 0.191428315188 0.0543351687773 0.00366756862935 0.0105500068224 0.00304178870585 0.147733468153 0.375 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 5.0 0.0 0.142857142857 0.0 3.0 1.0 0.535714285714 0.125 0.0 0.0 0.375 0.625 0.25 0.375 0.75 1.0 0.75 0.875 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.86559397452 -0.13641852265 -9.20082449331 1.83788957391 3.16221847572 3.33668570196 -2.24933023053 14.1790691666 -1.86327853736 1.11569442733 -3.67345153213 21.8713900872 1.74551539176 -0.191867886212 0.345765123531 20.2203372834 -1.39588782524 -0.355399810344 -6.1855541978 16.7535318144 -0.334719788627 -0.16874388678 -12.6384409965 12.6717672671 0.0805981590752 -0.121704334945 0 4 2 4 3 3 3 3 4 2 4 2 4 2 4 2 4 2 4 3 2 4 1 11 1 0 78.0 0.461538461538 42.0 0.571428571429 0.198717948718 0.268244575937 0.0253312597987 0.256983428581 0.0538613260507 0.002969017689 0.0137250306239 0.00548043891754 0.311787296842 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 1.0 0.111111111111 0.0 6.0 1.0 0.538461538462 0.75 0.125 0.0 0.625 1.0 0.625 0.5 0.875 1.0 1.0 1.0 1.0 0.5 0.5 0.625 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.16251389625 -1.17529804129 -8.38696561656 -1.0326250985 1.9295635249 2.73308952798 -5.03892046028 8.73598868247 -1.53941952476 0.801898845653 -6.37695625266 15.2202620553 1.48955660162 0.211885297345 -3.64089066594 16.931539378 -1.4368388451 0.201707737937 -8.33617905864 19.0735753719 0.553835959531 0.360651645947 -10.1162554675 23.5150457649 -0.20383255524 0.15131311697 1 1 7 1 3 12.0 1.33333333333 10.0 0.2 0.375 0.277777777778 0.104166666667 0.0532407407407 0.0208333333333 0.0 0.00200468843469 -0.00400937686937 -0.0653751172867 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.142857142857 0.0 1.0 2.0 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.954929658551 0.954929658551 -2.36543880901 1.92840577722 -0.0596831036595 -0.537147932935 -2.35312830674 0.344024489088 0.350638233999 0.0969850434466 -0.280296469051 0.587366485421 0.162962849445 0.224821899592 1.12973102546 1.24516622196 -0.0403035802544 -0.497232914554 1.08312211621 -2.30897772327 0.0299198713322 -0.0603916219494 1.41966315186 -2.80519373384 0.0231516011899 0.130238604088 2 1 3 5 1 4 3 4 2 3 4 2 4 2 4 2 4 2 4 2 3 3 2 5 1 12 84.0 0.428571428571 47.0 0.617021276596 0.208333333333 0.290816326531 0.0254747732426 0.284236313573 0.0522250566893 0.00313711412143 0.0116261819355 0.00489468223893 0.386963364152 0.666666666667 0.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 6.0 2.0 0.0 0.0 7.0 1.0 0.559523809524 0.625 0.25 0.0 0.625 0.875 0.75 0.5 0.875 0.875 1.0 1.0 1.0 0.625 0.625 0.5 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.95653965629 -0.318309886184 -9.85839923023 1.01772480172 2.52281465187 2.87638919017 -4.94751323747 12.4806895202 -1.7589428937 1.69458774447 -6.58331879865 22.6740027637 1.48692124541 -0.0259692615645 -4.21884262488 22.9843587664 -1.28158314759 -0.507091523143 -6.51668199902 16.8033654461 1.00591720328 -0.737544703037 -4.40156286079 9.05105945911 -0.215421488223 0.0227910370504 3 1 2 3 1 5 1 3 1 0 20.0 1.25 12.0 0.666666666667 0.25 0.275 0.089375 0.0645 0.04125 0.0144645647295 0.00067082039325 0.000586967844094 -0.0218463841402 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.285714285714 0.0 1.0 2.0 0.6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 1.9098593171 -4.9402776725 4.74047875555 -0.0814873308631 0.320856365273 -5.63020925653 6.98455135323 -0.0814873308631 0.932011346746 -5.77662933638 12.9756750652 -0.209259465656 1.3678055922 -7.96050763114 23.7101192784 -0.662668012551 0.973607695608 -15.3283376433 34.4444303466 -1.07457283234 0.901209292136 -26.8374460796 45.9117274878 -0.125256674196 0.309243779062 2 2 2 5 2 4 3 3 3 3 2 3 4 3 3 3 3 2 4 3 2 4 1 18 84.0 0.428571428571 53.0 0.547169811321 0.269841269841 0.329081632653 0.031152143397 0.286002793975 0.0530652737285 0.00234817534768 0.00224075635386 0.00224869838164 0.356837766946 0.833333333333 0.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 6.0 2.0 0.0 0.0 7.0 1.0 0.630952380952 0.375 0.125 0.0 0.625 0.75 0.625 0.5 0.875 1.0 1.0 1.0 1.0 0.875 0.875 0.875 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.00160999774 -1.00040249943 -7.86859078364 -0.612855708197 2.16784808783 2.8944855248 -3.55541582311 10.7537890945 -1.54232664314 1.59336758699 -5.5466071529 20.2969185614 1.1501298163 -0.179469184632 -3.5664729851 20.2421799956 -0.876825808353 -0.226130828364 -5.6634985647 16.221031309 0.336345947929 -0.393343830393 -6.99586014291 14.0641524832 -0.129315751548 0.160249920885 1 2 1 3 3 1 5 1 4 2 2 1 0 25.0 1.0 15.0 0.666666666667 0.264 0.264 0.075904 0.075904 0.051904 0.010764288 0.003276288 0.003276288 -0.014360064 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 4.0 0.0 0.0 2.0 2.0 0.6 0.25 0.75 0.75 0.25 0.75 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 1.52788745368 -3.70433791974 3.70433791974 -8.3650852059e-16 8.48147915057e-16 -3.54149451304 3.54149451304 0.403362287772 -0.403362287772 -0.868722164082 0.868722164082 0.315518945102 -0.315518945102 2.06942438903 -2.06942438903 0.226914184812 -0.226914184812 3.93744620205 -3.93744620205 -0.152049883442 0.152049883442 2.19340912175 -2.19340912175 -0.0936352830146 0.0936352830146 1 4 1 5 2 4 3 3 3 3 3 4 2 4 1 5 2 4 2 4 2 4 1 5 1 4 1 0 78.0 0.461538461538 53.0 0.415094339623 0.337606837607 0.319526627219 0.039110571655 0.230137055581 0.0589566580691 0.00137151685257 0.000124401925596 -0.00141459929381 0.178500722027 0.333333333333 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.285714285714 0.0 1.0 1.0 0.679487179487 0.5 0.0 0.125 0.25 0.875 0.5 0.625 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -1.95883006882 1.27323954474 -4.45799268286 4.62611966149 0.325698964106 2.47635529115 -3.92264133787 14.3335550786 -0.17355888702 1.04740586767 -3.87889669942 20.4057514634 0.034418050839 -0.270097582125 -4.1915842523 18.983126482 -0.23741055593 -0.127875359103 -6.99754315108 17.1799199354 -0.560253089857 0.117336214884 -12.3167379785 18.4492749473 -0.0168153278192 0.101572203696 1 2 1 1 8 1 2 1 0 16.0 1.0 11.0 0.454545454545 0.265625 0.28125 0.073974609375 0.0693359375 0.03076171875 0.00922393798828 -0.00106811523438 -0.00132751464844 -0.0103454589844 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.333333333333 0.0 1.0 1.0 0.6875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 0 4 1 4 2 2 4 1 3 3 2 3 2 2 3 3 2 3 2 2 3 3 1 5 60.0 0.416666666667 35.0 0.714285714286 0.21 0.275 0.0224583333333 0.269055555556 0.0469722222222 0.0022543990561 0.0108242712335 0.00275376288107 0.352673863506 1.0 0.0 1.0 1.0 0.0 3.0 0.0 0.0 0.0 0.0 3.0 1.0 0.176470588235 0.0 4.0 1.0 0.583333333333 0.833333333333 0.333333333333 0.5 0.5 1.0 0.833333333333 1.0 1.0 0.833333333333 0.666666666667 0.833333333333 0.833333333333 0.333333333333 0.166666666667 0.333333333333 0.333333333333 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.50140874802 -0.212206590789 -6.12475701447 0.397540519176 2.83605266648 1.52081390066 -0.424006421764 6.92877439774 -2.31115450637 1.34448676142 -5.15266217856 14.2176995147 1.51230459108 -0.354650850453 -1.20526076877 11.072754321 -0.434435230752 -0.98704085056 -0.420617471413 4.06758010065 -0.0250001775229 0.312349800588 -2.35403503005 2.24228514439 0.0360760281821 -0.198884842455 1 0 8 1 2 1 0 12.0 1.33333333333 10.0 0.2 0.3125 0.222222222222 0.0989583333333 0.0462962962963 0.0138888888889 0.00826933979308 0.000668229478229 -0.00601406530406 -0.0322977581144 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.11408460164 0.954929658551 -2.48480501633 1.92840577722 0.228785230695 -0.537147932935 -2.09201472823 0.344024489088 -0.013677377922 0.0969850434466 -0.674142783304 0.587366485421 0.537109076748 0.224821899592 1.59177966243 1.24516622196 -0.359230308411 -0.497232914554 0.657854503264 -2.30897772327 0.242577659359 -0.0603916219494 1.69197679868 -2.80519373384 -0.0012267185328 0.130238604088 1 4 1 5 2 4 2 4 3 3 3 2 4 2 4 2 4 2 4 3 2 3 3 5 1 1 1 1 2 0 78.0 0.461538461538 41.0 0.756097560976 0.220085470085 0.221893491124 0.0284331327231 0.203806958984 0.046496485106 0.00301676199053 0.0139119822341 0.00226210347149 0.200722268351 0.5 0.0769230769231 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 2.0 1.0 0.235294117647 0.0 6.0 1.0 0.525641025641 0.625 0.125 0.0 0.375 1.0 0.625 0.5 0.75 1.0 1.0 1.0 0.875 1.0 0.75 0.625 0.75 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.23206961356 2.74236209635 -5.99928343538 7.94594729457 2.1297930482 2.03301061581 -2.03961050435 15.4859770572 -1.75131177182 0.294404045847 -4.71384524829 17.7852665611 1.30013761437 -0.0417045620729 -3.57524440318 16.7053596134 -1.47708826454 -0.060875082135 -8.84207489459 17.4330478616 0.560588726535 0.704178762971 -10.7442094586 23.3888543374 -0.226494051446 0.0107321973596 2 2 2 9 1 4 20.0 1.25 15.0 0.333333333333 0.35 0.325 0.104375 0.0655 0.03625 0.00482152157648 -0.00150934588481 -0.00259942902384 -0.0746958507884 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 2.0 0.25 0.0 1.0 2.0 0.75 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 2.16450722605 -4.04774399592 5.39598722874 -0.550039483326 0.331042281631 -6.08758952222 7.32341901722 0.0366692988884 0.599950473479 -6.09532036384 11.8598992851 -0.164115484358 1.4966370623 -7.89950575679 23.4326443874 -0.716654347096 1.21776264393 -15.2071296415 35.8649141625 -0.923570523952 0.714246037925 -26.0386199838 45.9260675085 -0.18510751719 0.279469909395 1 4 1 5 1 5 3 2 4 2 3 4 2 4 2 4 3 3 2 4 2 4 1 12 78.0 0.461538461538 53.0 0.471698113208 0.275641025641 0.334319526627 0.0315012896374 0.254380974056 0.0478872705204 0.00214507976574 0.00199619389668 0.00119339952879 0.28208233904 0.666666666667 0.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 5.0 0.0 0.105263157895 0.0 6.0 1.0 0.679487179487 0.625 0.25 0.375 0.75 0.875 0.75 0.875 1.0 1.0 1.0 1.0 1.0 0.875 0.75 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.79913366862 -0.195883006882 -9.4178988471 1.39087658947 2.6142847457 3.00315308185 -4.56661979329 13.3049014028 -2.34228712062 1.6311970335 -10.0442734283 22.6243590499 1.17657823021 -0.438001873616 -6.84457486443 20.6023846897 -0.029528082498 -0.270943235955 -5.14388638639 17.2067419507 -0.558607478898 0.04597207755 -9.97468339362 17.1152378941 0.0602994994631 0.0508164639646 1 2 2 3 4 1 11 1 0 24.0 1.5 17.0 0.411764705882 0.277777777778 0.322916666667 0.106481481481 0.0572193287037 0.0318287037037 0.0149628038557 -0.00319928371915 0.00126002558785 -0.0509116784154 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 1.0 0.111111111111 0.0 2.0 2.0 0.708333333333 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.65258238486 2.44037579408 -6.62888745869 5.67687529906 -0.371361533881 -0.229890473355 -8.24644313867 5.69741593599 0.0478119787889 0.425068140192 -7.68110311758 7.69481522687 0.00081869826693 0.474863188116 -7.10663401242 10.1985096009 0.086982142538 -0.393029748013 -6.77623367196 8.01462214595 -0.217287573737 0.0799315669692 -8.66897462607 7.96983757731 -0.0149912792904 0.0121680746322 1 3 2 3 2 3 3 2 2 3 2 3 2 3 2 3 3 2 2 3 1 5 1 3 1 0 60.0 0.416666666667 36.0 0.666666666667 0.246666666667 0.2875 0.0252037037037 0.258569444444 0.0471388888889 0.00163972233193 0.00585382306936 0.000950554431143 0.311033016866 0.4 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.266666666667 0.0 2.0 1.0 0.6 0.5 0.333333333333 0.5 0.333333333333 1.0 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.28920215723 0.795774715459 -5.78384995032 2.86216362357 2.66363481147 1.57718127633 -0.0809115915233 9.50293409201 -1.8522536603 1.00652299996 -3.03724710788 14.2866373541 1.34646553096 -0.681550938863 -0.309616815325 9.6668542199 -0.878240412534 -0.666906080521 -3.06495490906 3.21147958893 0.0364756126256 -0.0235645724204 -5.13798946791 0.833972703215 0.0746992926128 -0.103060081481 1 2 1 2 11 3 1 20.0 0.8 13.0 0.538461538462 0.2875 0.27 0.071375 0.086375 0.042375 0.00787375436577 0.00256309291921 0.00378174996695 -0.00408361914391 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.125 0.0 2.0 2.0 0.65 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.65521140816 2.03718327158 -4.39883273471 4.9402776725 -0.677363437799 0.0814873308631 -7.49702038449 5.63020925653 -0.677363437799 0.0814873308631 -12.6568054457 5.77662933638 -1.39836334128 0.209259465656 -23.5256304271 7.96050763114 -1.13617492068 0.662668012551 -35.0637662531 15.3283376433 -0.694475933736 1.07457283234 -45.3197779263 26.8374460796 -0.339244976474 0.125256674196 1 3 2 3 2 3 3 2 2 3 2 3 2 3 2 3 3 2 2 3 1 5 1 3 1 0 60.0 0.416666666667 36.0 0.666666666667 0.246666666667 0.2875 0.0252037037037 0.258569444444 0.0471388888889 0.00163972233193 0.00585382306936 0.000950554431143 0.311033016866 0.4 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.266666666667 0.0 2.0 1.0 0.6 0.5 0.333333333333 0.5 0.333333333333 1.0 0.833333333333 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.28920215723 0.795774715459 -5.78384995032 2.86216362357 2.66363481147 1.57718127633 -0.0809115915233 9.50293409201 -1.8522536603 1.00652299996 -3.03724710788 14.2866373541 1.34646553096 -0.681550938863 -0.309616815325 9.6668542199 -0.878240412534 -0.666906080521 -3.06495490906 3.21147958893 0.0364756126256 -0.0235645724204 -5.13798946791 0.833972703215 0.0746992926128 -0.103060081481 1 2 1 2 11 3 1 20.0 0.8 13.0 0.538461538462 0.2875 0.27 0.071375 0.086375 0.042375 0.00787375436577 0.00256309291921 0.00378174996695 -0.00408361914391 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.125 0.0 2.0 2.0 0.65 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.65521140816 2.03718327158 -4.39883273471 4.9402776725 -0.677363437799 0.0814873308631 -7.49702038449 5.63020925653 -0.677363437799 0.0814873308631 -12.6568054457 5.77662933638 -1.39836334128 0.209259465656 -23.5256304271 7.96050763114 -1.13617492068 0.662668012551 -35.0637662531 15.3283376433 -0.694475933736 1.07457283234 -45.3197779263 26.8374460796 -0.339244976474 0.125256674196 0 4 1 4 2 3 2 3 2 3 2 2 3 3 2 3 2 3 2 3 1 7 1 2 60.0 0.416666666667 40.0 0.5 0.25 0.3125 0.0259027777778 0.269791666667 0.0449305555556 0.00208441812035 0.00434365840564 0.00234441005795 0.348635740453 0.4 0.0833333333333 1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 1.0 3.0 0.133333333333 0.0 6.0 1.0 0.666666666667 0.833333333333 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.5 0.5 0.333333333333 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.81971863421 0.371361533881 -6.84847418413 2.00121389524 2.92668256463 1.65233777724 -0.668226951354 7.8893740163 -2.11015384811 0.378417689569 -4.34647730302 11.362672052 1.46833093556 0.178037966329 -0.734969330871 10.9269381613 -0.601627226175 -0.661265324082 -1.278900336 6.24114055069 0.00295561480541 -0.0940031044291 -2.95791731638 2.58941809386 0.0777867432146 -0.137481230468 0 16 16.0 1.0 16.0 0.0 0.375 0.375 0.078125 0.078125 0.0 0.0 0.0 0.0 -0.07763671875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.954929658551 0.954929658551 -2.2648145447 2.2648145447 0.119366207319 -0.119366207319 -1.41550909044 1.41550909044 0.566989484765 -0.566989484765 1.8165699994 -1.8165699994 0.136152080223 -0.136152080223 2.72043153319 -2.72043153319 -0.380013511582 0.380013511582 -0.644720156036 0.644720156036 -0.278074304257 0.278074304257 -3.49283318954 3.49283318954 0.0620657855579 -0.0620657855579 2 3 2 5 3 5 3 3 4 4 4 2 5 2 5 2 5 2 4 3 4 4 2 6 1 6 91.0 0.538461538462 47.0 0.68085106383 0.235478806907 0.251056635672 0.0380083628484 0.20863063998 0.062726670745 0.00445591398502 0.018365152118 0.0055742537767 0.180978076128 0.571428571429 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 2.0 0.1875 0.0 2.0 1.0 0.516483516484 0.375 0.0 0.0 0.25 0.75 0.25 0.125 0.75 1.0 0.75 0.625 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.74236209635 -0.0979415034412 -5.46671414194 1.06139640465 1.35379498248 2.06662367616 -3.01645346838 9.11564918038 -1.03848650734 1.00252444205 -3.86942483134 14.9722811322 1.07568675886 -0.363292823349 -0.933698210931 12.1737104248 -0.567987866591 -0.731324535064 -0.406499030842 4.43556452278 0.644867981108 -0.593729009926 1.16661035738 -2.66184394559 -0.170433116278 -0.0535696457528 2 1 2 15 2 1 2 0 25.0 1.0 17.0 0.470588235294 0.272 0.272 0.082816 0.063616 0.034816 0.013418496 -0.001327104 0.001130496 -0.022137856 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 3.0 3.0 0.68 0.5 1.0 1.0 0.5 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 2.29183118052 -3.02104587806 5.37649949384 0.101859163579 -0.183346494442 -2.51655645052 5.07188890383 0.352432705983 -0.165011844998 -0.23098292518 2.61193792104 0.193287948807 -0.710895474449 1.70044668652 -2.89963975005 0.137685557517 -0.478787613118 2.6987743889 -6.82803072748 -0.148953364869 0.374095376247 1.00950999865 -3.84575427187 -0.0696850032198 0.0750488425764 2 2 2 5 1 5 2 4 2 4 3 3 3 3 3 3 3 3 3 3 2 5 1 5 1 5 78.0 0.461538461538 50.0 0.5 0.288461538462 0.308678500986 0.034409295504 0.239807228713 0.0605307742882 0.00211435553684 0.00773024535596 0.00144312106902 0.236860483241 0.166666666667 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 0.0625 0.0 6.0 1.0 0.641025641026 0.625 0.25 0.0 0.375 0.875 0.75 0.5 0.875 1.0 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.37898186872 1.6650055585 -6.88804207567 5.67862550309 1.51345701915 2.65948851652 -4.12223729619 16.2242818991 -1.22664866078 1.21202138993 -6.21736199446 23.3018222406 0.694929251755 -0.155951018764 -5.86263050909 22.4054647239 -0.773324373165 -0.328374661829 -8.70355517328 18.2993985381 0.293918206144 -0.332660248433 -8.53367176601 14.5656906325 -0.0563825378453 0.0340785257835 1 1 4 1 6 1 4 4 1 2 0 24.0 1.5 15.0 0.6 0.263888888889 0.177083333333 0.110821759259 0.0329137731481 0.0296585648148 0.0189692914671 0.00308853928272 2.46098747627e-05 -0.0227678256367 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.25 0.0 1.0 2.0 0.625 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.80375602171 3.50140874802 -4.40560826023 8.05020721688 -0.229890473355 -0.477464829276 -6.27630864936 7.33409993783 -0.649063986025 0.229890473355 -8.75052717404 7.14193067554 0.103719973773 0.0445917656057 -8.97763342173 7.69457176626 -0.0313470469762 -0.0300735163387 -8.27357236907 7.14625100027 0.0956182300591 0.0340447083026 -7.93436800666 8.22449479654 -0.0188922951851 0.0672053339221 3 2 4 3 3 4 4 3 4 3 5 2 5 2 4 3 4 3 5 3 3 4 2 13 91.0 0.538461538462 45.0 0.688888888889 0.226059654631 0.267117497887 0.0372094998348 0.221553111784 0.0646004158865 0.00464123464566 0.0164572558148 0.00671780286489 0.205646266259 0.428571428571 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 7.0 1.0 0.494505494505 0.125 0.0 0.0 0.375 0.5 0.25 0.25 0.625 0.875 0.75 0.75 0.875 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.42795262044 -1.46912255162 -7.02412001289 -2.01467053957 1.35495405352 2.27757460665 -5.5222689963 5.79285384176 -1.69125954647 0.412996217462 -8.79430905839 9.58175738066 1.23465192644 -0.347143827875 -6.66427364397 5.43273902003 -1.03184665283 -1.13872373824 -8.97476301288 -5.82309808463 0.634545009067 -0.941440343321 -7.9938470735 -15.9207356251 -0.124609067953 0.0381066127973 1 3 1 10 1 2 2 0 20.0 1.25 15.0 0.333333333333 0.29 0.2625 0.092375 0.052375 0.021375 0.013022300884 -0.00184755116641 -0.00153450164956 -0.0362494570002 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.142857142857 0.0 2.0 2.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.419155135 -4.38939001676 5.64320461184 -0.1935324108 -0.086580289042 -5.57512049096 6.89147744442 -0.217978610059 1.0501679765 -6.41418998329 12.3073918094 -0.133557735285 1.11291322126 -8.08399460805 23.1394578124 -0.554087122024 1.50806158608 -14.5877937349 35.9958619623 -1.13030388235 0.484210066949 -26.6305695453 45.7891351556 -0.155106319778 0.345098914554 0 4 2 4 2 4 3 3 4 2 3 3 3 3 3 3 3 3 3 3 3 4 1 12 78.0 0.461538461538 48.0 0.4375 0.211538461538 0.307692307692 0.025204824761 0.260683760684 0.051775147929 0.00308233393105 0.0102731249646 0.00512510972315 0.333634621813 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.166666666667 0.0 4.0 1.0 0.615384615385 0.875 0.375 0.5 0.75 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.875 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -5.63163644787 -0.979415034412 -10.6599351378 -0.646642377152 3.51343411013 2.74815745159 -4.10407244021 10.1409548992 -3.07372439133 1.55150232604 -10.4741672505 19.5735943682 1.88520733569 -0.084289638291 -6.10240563912 20.1982252989 -0.67566008861 -0.0108835725481 -5.8739689488 19.2248755656 -0.131665891942 -0.00606218334005 -10.3304173509 19.4075551666 -0.00946019573933 0.0843601172946 0 11 1 0 12.0 1.33333333333 11.0 0.0909090909091 0.3125 0.277777777778 0.0989583333333 0.0532407407407 -0.00347222222222 0.00826933979308 -0.0023388031738 -0.00451054897804 -0.0413188560705 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.11408460164 0.954929658551 -2.48480501633 1.92840577722 0.228785230695 -0.537147932935 -2.09201472823 0.344024489088 -0.013677377922 0.0969850434466 -0.674142783304 0.587366485421 0.537109076748 0.224821899592 1.59177966243 1.24516622196 -0.359230308411 -0.497232914554 0.657854503264 -2.30897772327 0.242577659359 -0.0603916219494 1.69197679868 -2.80519373384 -0.0012267185328 0.130238604088 0 3 1 8 12.0 1.33333333333 11.0 0.0909090909091 0.3125 0.333333333333 0.0989583333333 0.0555555555556 0.0208333333333 0.00826933979308 -0.00200468843469 0.00300703265203 -0.0501172108672 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.954929658551 0.954929658551 -2.36543880901 1.92840577722 -0.0596831036595 -0.537147932935 -2.35312830674 0.344024489088 0.350638233999 0.0969850434466 -0.280296469051 0.587366485421 0.162962849445 0.224821899592 1.12973102546 1.24516622196 -0.0403035802544 -0.497232914554 1.08312211621 -2.30897772327 0.0299198713322 -0.0603916219494 1.41966315186 -2.80519373384 0.0231516011899 0.130238604088 0 7 1 4 1 2 2 2 2 2 2 2 2 3 1 3 1 15 52.0 0.307692307692 40.0 0.3 0.302884615385 0.371301775148 0.0224382680929 0.377752332726 0.0395354460628 0.00102589268959 -0.00504639060673 3.46326502345e-05 0.721505264556 0.75 0.0 1.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 4.0 2.0 0.0952380952381 0.0 5.0 1.0 0.769230769231 0.75 0.0 0.0 0.75 0.75 0.0 0.0 0.75 0.75 0.0 0.0 0.75 0.75 0.0 0.0 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.23206961356 0.0979415034412 -6.18688963745 2.31260677404 1.95245517807 3.02575496726 -2.34957621336 12.4756626185 -1.5057258781 0.215796396136 -4.90614052741 16.7046851552 0.952847893132 0.412036730163 -4.02947821016 17.6896052241 -0.983695744537 -0.156652066215 -7.9705691907 18.6884035434 0.155047473339 0.604724361939 -10.4010761491 22.922287312 -0.125634708505 0.0316970782862 1 2 3 2 6 2 5 2 5 3 4 3 3 5 2 4 3 4 3 5 2 4 4 3 4 3 5 2 1 4 0 98.0 0.5 50.0 0.72 0.231778425656 0.214285714286 0.0342597472142 0.174302374011 0.0535193669304 0.00371235989715 0.0165766454141 0.00355638538325 0.139880055561 0.428571428571 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 5.0 0.157894736842 0.0 3.0 1.0 0.510204081633 0.5 0.125 0.0 0.0 0.875 0.5 0.25 0.375 1.0 0.875 0.75 0.875 1.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.81931613477 4.13802852039 -4.97307222537 11.4433425272 2.17109614789 2.12446328556 -0.868424677966 18.4897675128 -1.76968611278 -0.724537561408 -3.225588017 14.725836992 1.67929989617 -0.726112425807 0.820289509821 8.0400781224 -1.12970477587 -0.297028050042 -1.31693799541 3.86405999121 0.632270462825 -0.336115105381 -1.22012158526 -0.484543882112 -0.144522541785 -0.149230562051 3 1 2 3 1 10 2 2 1 0 25.0 1.0 16.0 0.5625 0.272 0.288 0.079616 0.077056 0.043264 0.010269696 0.000679936 0.001347584 -0.019792896 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 3.0 0.125 0.0 1.0 2.0 0.64 0.25 0.75 1.0 0.5 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.5 0.75 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 1.52788745368 -3.70433791974 3.70433791974 -8.3650852059e-16 8.48147915057e-16 -3.54149451304 3.54149451304 0.403362287772 -0.403362287772 -0.868722164082 0.868722164082 0.315518945102 -0.315518945102 2.06942438903 -2.06942438903 0.226914184812 -0.226914184812 3.93744620205 -3.93744620205 -0.152049883442 0.152049883442 2.19340912175 -2.19340912175 -0.0936352830146 0.0936352830146 1 3 2 4 3 3 4 2 4 2 4 2 3 3 3 3 3 4 2 4 2 4 2 5 3 2 1 0 78.0 0.461538461538 41.0 0.707317073171 0.207264957265 0.25641025641 0.0260308670072 0.226386149463 0.057801884725 0.00298031138206 0.0172696473474 0.00540347539713 0.244217045622 0.166666666667 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.2 0.0 5.0 1.0 0.525641025641 0.5 0.125 0.5 0.375 0.875 0.625 1.0 0.75 1.0 1.0 1.0 0.875 0.5 0.5 0.75 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.77074788248 -9.895059009e-16 -6.2893045966 2.55832521494 3.42012889088 3.727572486 0.500145819973 14.9257187771 -2.97506275499 0.0190938094311 -6.73276662484 17.9061763558 1.42207951998 -0.189522583715 -5.08711674207 14.8131221531 -0.770336521319 -0.137562172016 -6.97685862757 15.6390291845 -0.282177378929 0.936285665757 -12.5574255855 23.5761186501 -0.017327241404 0.10216082707 1 3 2 14 20.0 1.25 17.0 0.176470588235 0.36 0.3625 0.098 0.067375 0.0195 0.0042932505168 -0.00381249590164 0.0006260990337 -0.0896635308128 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.125 0.0 1.0 1.0 0.85 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 2.16450722605 -4.04774399592 5.39598722874 -0.550039483326 0.331042281631 -6.08758952222 7.32341901722 0.0366692988884 0.599950473479 -6.09532036384 11.8598992851 -0.164115484358 1.4966370623 -7.89950575679 23.4326443874 -0.716654347096 1.21776264393 -15.2071296415 35.8649141625 -0.923570523952 0.714246037925 -26.0386199838 45.9260675085 -0.18510751719 0.279469909395 1 4 2 4 2 4 3 4 2 4 2 3 3 3 3 2 4 2 3 3 4 2 2 6 2 1 1 1 1 0 78.0 0.461538461538 43.0 0.674418604651 0.252136752137 0.236686390533 0.033775013065 0.205052344106 0.0460097102109 0.00337499108227 0.00841084025194 0.00101456028963 0.186247852861 0.666666666667 0.0769230769231 0.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 5.0 4.0 0.0 0.0 7.0 1.0 0.551282051282 0.375 0.0 0.125 0.375 0.875 0.5 0.625 0.75 1.0 1.0 1.0 0.875 1.0 1.0 0.625 0.625 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.79133284807 3.23206961356 -5.1803297218 8.10635913436 1.78120243093 0.832792547012 -2.33137203579 13.5674447293 -1.78232378073 1.69798078686 -5.4035286268 20.1640012383 1.47328342431 -0.581721346827 -2.58673465195 18.671961115 -1.30488187743 -0.0155347387921 -7.77655658687 16.1767243031 0.0135968384131 -0.0146883580178 -13.2720002363 17.9297731813 -0.148747600288 0.19265090488 1 1 2 1 8 1 1 2 0 16.0 1.0 11.0 0.454545454545 0.25 0.234375 0.0703125 0.058349609375 0.0234375 0.01171875 -0.001220703125 0.0010986328125 -0.00707244873047 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.166666666667 0.0 1.0 2.0 0.6875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.954929658551 1.27323954474 -2.2648145447 2.60243316326 0.119366207319 -0.636619772368 -1.41550909044 0.782474180641 0.566989484765 -0.039788735773 1.8165699994 -1.10264729557 0.136152080223 -0.492385605191 2.72043153319 -3.16553420414 -0.380013511582 0.46440915035 -0.644720156036 0.537730662166 -0.278074304257 0.450731772428 -3.49283318954 4.18103198128 0.0620657855579 -0.159815844007 0 4 1 4 2 2 3 3 1 4 2 3 2 2 3 2 3 2 3 2 3 3 1 6 2 1 1 0 65.0 0.384615384615 38.0 0.657894736842 0.196923076923 0.256804733728 0.0201147018662 0.261906235776 0.0393700500683 0.0021995278689 0.00987992053428 0.00288726075728 0.360325992876 0.8 0.0769230769231 2.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 3.0 7.0 0.111111111111 0.0 6.0 1.0 0.584615384615 0.75 0.625 0.5 0.625 1.0 1.0 1.0 0.75 0.875 0.875 0.5 0.75 0.375 0.375 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 -4.01560164109 1.46912255162 -7.01286569465 4.02067510704 3.330011117 0.90059820324 0.233580678247 8.43883489642 -2.26989661827 0.913200528969 -3.60957019739 12.1294476647 1.49450720586 -0.543372230706 -0.931334853871 9.43486561339 -0.876139828206 -0.194787154533 -2.26702852336 6.02003928695 0.414715661054 -0.298886628222 -1.334794587 1.99071712504 0.0514039404652 -0.131990899497 1 0 10 1 3 1 0 15.0 1.66666666667 13.0 0.153846153846 0.346666666667 0.244444444444 0.128592592593 0.0397037037037 0.013037037037 0.00852757617101 0.000265211699098 -0.00738512577489 -0.0543071956154 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 0.866666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.27323954474 2.54647908947 -2.89447153704 5.8086513256 0.224090159873 -0.448180319747 -2.38601136485 4.68295225525 0.0590783148757 -0.118156629751 -0.876190556575 2.4344675688 0.497724616912 -0.557373343103 2.40318160613 -2.28916478643 0.071087591749 -0.618801752601 2.83768060339 -7.10236541209 -0.394895741057 0.344005455719 -0.197399779149 -4.33721095361 0.0395438085101 0.117790654279 1 3 1 4 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 4 1 12 2 0 65.0 0.384615384615 45.0 0.444444444444 0.267692307692 0.32899408284 0.0247464724624 0.281423759672 0.0425817023213 0.00168268593041 -0.0013435166596 0.00109212060498 0.393916688758 0.2 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 6.0 0.0588235294118 0.0 6.0 1.0 0.692307692308 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.875 0.5 0.5 0.625 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.11354314453 0.979415034412 -7.70158750414 3.84198219949 2.71222624914 2.17905356769 -2.15182110063 11.2137420793 -1.90372275604 -0.0561360740636 -4.33746089448 12.1450492939 1.7887076909 -0.221430010616 0.829566360964 9.56769297675 -0.862865013918 -0.278564285812 -0.28486649053 5.76548142427 0.266305957922 -0.570493480634 -1.14459991458 -0.424404939933 0.00692912716866 -0.0890483383651 1 0 8 1 3 12.0 1.33333333333 11.0 0.0909090909091 0.375 0.277777777778 0.104166666667 0.0532407407407 0.0208333333333 0.0 0.00200468843469 -0.00400937686937 -0.0653751172867 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.954929658551 0.954929658551 -2.36543880901 1.92840577722 -0.0596831036595 -0.537147932935 -2.35312830674 0.344024489088 0.350638233999 0.0969850434466 -0.280296469051 0.587366485421 0.162962849445 0.224821899592 1.12973102546 1.24516622196 -0.0403035802544 -0.497232914554 1.08312211621 -2.30897772327 0.0299198713322 -0.0603916219494 1.41966315186 -2.80519373384 0.0231516011899 0.130238604088 2 2 4 3 1 5 2 4 3 3 3 2 4 3 2 3 4 3 3 3 3 3 2 15 1 1 84.0 0.428571428571 50.0 0.62 0.259920634921 0.305272108844 0.0309952353957 0.273058727459 0.0548654977864 0.00261605223052 0.00554266316867 0.00265502602247 0.327883439134 0.833333333333 0.0714285714286 1.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 7.0 0.047619047619 0.0 7.0 1.0 0.595238095238 0.375 0.125 0.125 0.375 0.75 0.625 0.625 0.75 1.0 1.0 1.0 1.0 0.875 0.875 0.875 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -3.81971863421 0.0909456817668 -7.57274148194 1.80448153352 1.93213172896 2.3488114342 -4.08267267892 9.88512732732 -1.46554742742 0.22952326475 -4.76857635736 12.4522001754 1.88592973174 -0.391633387854 1.56940557576 8.0186084136 -0.933504565506 -0.790585298381 0.64141015997 0.779488433922 0.565973462668 -0.49697375526 2.38220612321 -7.69024008894 0.0275584760691 -0.245822216639 1 2 1 11 1 1 1 1 1 0 20.0 0.8 15.0 0.333333333333 0.25 0.29 0.055 0.092375 0.015 0.0067082039325 -0.00413672575837 5.59016994375e-05 0.0230342952532 0.0 0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0 1.0 2.0 0.75 0.5 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 2.03718327158 -4.81687312823 4.9402776725 -0.0814873308631 0.0814873308631 -6.80884429606 5.63020925653 -1.25490489529 0.0814873308631 -13.2637327798 5.77662933638 -0.999360625704 0.209259465656 -23.3246882778 7.96050763114 -1.34519025029 0.662668012551 -34.8850460996 15.3283376433 -0.56780664196 1.07457283234 -45.4788203541 26.8374460796 -0.389873382927 0.125256674196 1 4 3 4 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 4 3 5 1 7 1 5 1 0 91.0 0.538461538462 51.0 0.529411764706 0.227629513344 0.28740490279 0.0318748996445 0.217083725356 0.0534043905617 0.00322910130083 0.00909878430755 0.00348382969285 0.20224143823 0.142857142857 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.105263157895 0.0 7.0 1.0 0.56043956044 0.25 0.0 0.25 0.625 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.89707517206 -1.6650055585 -8.89310225065 -2.4320744561 3.66730079157 2.50938881598 -0.743814832781 7.1424734715 -2.3308918748 1.2327475006 -4.26959862096 14.5358303607 1.64123421298 -0.47610073899 0.017648602142 12.0666237433 -0.463368631669 -0.319068162572 1.27510298773 7.39807545284 0.0525985126875 -0.512472319142 -1.1743253015 0.955077624588 -0.0642940845566 -0.163346616582 1 1 2 2 4 1 9 1 0 20.0 1.25 15.0 0.333333333333 0.25 0.325 0.079375 0.0655 0.02875 0.0127875137463 -0.00273918327244 0.00299074091991 -0.0243843212946 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 1.0 0.25 0.0 2.0 2.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 1.27323954474 -4.9402776725 2.83061943845 -0.0814873308631 -0.315763407094 -5.63020925653 2.20990306047 -0.0814873308631 0.295391574379 -5.77662933638 4.06299825203 -0.209259465656 0.731185819834 -7.96050763114 9.3861744001 -0.662668012551 0.33698792324 -15.3283376433 13.4359778584 -1.07457283234 0.264589519768 -26.8374460796 16.9455278451 -0.125256674196 0.113218642561 3 1 3 5 2 5 3 4 3 4 3 4 3 4 3 4 4 3 4 3 3 5 2 13 4 3 98.0 0.5 58.0 0.534482758621 0.237609329446 0.295189504373 0.0333077629219 0.21525151085 0.0611596783653 0.00410091845449 0.012914777365 0.0061075379135 0.213656425564 0.285714285714 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 0.277777777778 0.0 5.0 1.0 0.591836734694 0.625 0.5 0.25 0.5 0.75 1.0 0.75 0.875 0.875 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -5.54768658777 0.863983976785 -10.084541196 4.05502310607 4.1115800313 3.05433648077 -1.24930216412 15.4128363528 -2.91765281035 0.839133476433 -7.15719841406 20.7015285913 1.43355205734 -0.570093599017 -5.47118141789 16.4078067062 -0.627718511823 -0.542622740086 -4.63337519516 9.81227619245 0.403147803146 -0.563320783941 -4.06108576968 2.40393656143 -0.00579097795582 -0.184483870797 1 0 4 1 9 2 2 2 0 20.0 1.25 15.0 0.333333333333 0.25 0.2375 0.079375 0.052375 0.018125 0.0127875137463 -0.000852500916422 -0.00278110954702 -0.0192553403712 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 1.0 0.25 0.0 2.0 2.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.03718327158 2.29183118052 -4.7310360376 5.47238160142 0.162974661726 0.0916732472209 -5.0626514597 7.14771196005 -0.472626519006 0.922844022024 -6.73305960274 12.1479569997 -0.102999986211 1.1281920958 -8.2684834593 23.0472133868 -0.391519896952 1.58934519862 -13.9684578283 36.3055299156 -1.33703724075 0.380843387749 -27.2225191069 45.4931603748 -0.125105122365 0.36009951326 2 2 2 5 1 5 2 4 2 4 2 4 3 3 2 4 2 4 2 4 2 5 1 11 3 1 2 0 84.0 0.428571428571 56.0 0.5 0.281746031746 0.312074829932 0.0306054961667 0.232930771515 0.0506795972357 0.00208782410594 0.0028193059028 0.00115513550601 0.24820504545 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.315789473684 0.0 6.0 1.0 0.666666666667 0.625 0.375 0.375 0.625 0.875 0.875 0.875 1.0 1.0 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.41086556569 2.86478897565 -8.18003728651 9.05047368352 3.05178443357 3.21140338524 -1.77311125975 20.3381725259 -2.23904973102 0.0171304392249 -6.17677787389 21.3853015348 1.24577612143 -0.540251074867 -4.03938682003 16.9999912989 -0.662993560958 -0.0340007898657 -5.88260745668 14.7033192916 -0.155317388866 -0.310522677407 -8.45552240178 12.1518094399 0.0909894440458 0.0278246088406 1 4 2 4 1 6 1 3 2 0 24.0 1.5 17.0 0.411764705882 0.284722222222 0.260416666667 0.102358217593 0.0502748842593 0.0265480324074 0.0138861218349 -0.000643548225045 -0.00163778716546 -0.0431300360154 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.25 0.0 1.0 2.0 0.708333333333 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.65258238486 3.07699556644 -6.43340243153 7.10445859293 -0.159154943092 -0.33599376875 -7.77914968734 7.03353173024 -0.250849148988 0.436857395236 -7.94326912468 7.93360370672 0.220229833805 -0.0275992282431 -7.15474290344 8.05914986992 -0.153169349096 -0.149930942618 -7.44260180141 6.56968415297 0.000938976160459 0.0946863290689 -8.34656127276 8.14205614332 -0.0349836409844 0.089021091716 7 7 6 10 4 3 3 5 4 2 13 2 12 3 12 3 12 3 12 2 13 3 12 3 12 3 12 3 11 4 11 4 10 5 10 5 9 6 10 5 10 6 10 1 2 2 8 0 315.0 0.714285714286 90.0 0.666666666667 0.0996825396825 0.130763416478 0.027782744844 0.101765508084 0.0183181561866 0.0107150864305 0.00761379346738 -0.000418247290481 0.0815054737014 0.133333333333 0.0952380952381 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 5.0 2.0 0.235294117647 0.0 3.0 1.0 0.285714285714 0.0416666666667 0.25 0.416666666667 0.708333333333 0.5 0.708333333333 0.75 0.75 0.333333333333 0.0 0.0 0.0833333333333 0.458333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.0 0.0 0.333333333333 0.5 0.5 0.5 0.833333333333 1.0 0.166666666667 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 0.666666666667 0.666666666667 0.5 0.333333333333 0.333333333333 0.5 0.5 0.5 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -16.4308531725 1.57639181729 -32.0066690285 6.61190566678 10.5414500435 4.67720649086 -2.25556280734 26.6189871817 -2.19938929224 3.91004252031 -0.0533070794554 50.6094408858 0.0944581108208 1.72827046741 -1.07858845779 64.0488101538 1.83348900235 -0.171068204215 10.3053337203 62.3200350114 -1.26713803399 -0.718304753265 5.68650242348 54.1957537135 0.290042178779 -0.0476849410239 2 1 4 2 3 2 3 2 3 2 3 2 2 3 3 2 3 2 2 4 1 12 2 0 65.0 0.384615384615 34.0 0.764705882353 0.233846153846 0.289940828402 0.027251706873 0.30332271279 0.0557487482931 0.00264891395061 0.00452832528451 0.00335493524186 0.413995729162 0.2 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 5.0 0.0 0.0 1.0 1.0 0.523076923077 0.0 0.125 0.25 0.75 0.5 0.625 0.75 1.0 0.875 1.0 1.0 0.875 0.375 0.5 0.625 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.44853758603 -1.37118104818 -4.48322997507 -1.86064975467 1.74672006729 2.11646373117 -0.732706717981 5.02181652292 -1.04569812394 -0.0111174802758 -1.07741023191 6.29998910518 1.23254570511 -0.430407261567 2.17678756701 3.27838775594 -0.833439838045 0.00729677159185 0.478479283635 1.25294134311 0.44911712853 -0.605571903049 0.421406853036 -4.77020864751 -0.0912543402916 -0.108517412584 1 1 3 1 4 2 3 2 3 3 2 2 4 1 3 2 3 3 2 3 2 2 9 3 2 65.0 0.384615384615 40.0 0.625 0.270769230769 0.282840236686 0.0281329085116 0.268453345471 0.0566700045517 0.00199465884529 0.0111842825016 0.00280619282557 0.325783104905 0.8 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 8.0 0.105263157895 0.0 5.0 1.0 0.615384615385 0.625 0.375 0.25 0.375 1.0 0.875 0.75 0.625 1.0 1.0 1.0 0.875 0.5 0.625 0.5 0.875 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 1.37118104818 -4.38841451606 4.20118783224 2.12341815745 1.54851891831 -0.118864654512 10.9383574117 -1.63042889174 0.960376092249 -2.69402866781 14.3624203346 1.24449873435 -1.21065244752 -0.868474058254 7.53342554422 -1.11369878004 -0.15532804145 -4.01052211342 3.94624292803 0.633178264145 -0.0572753809351 -2.27117562277 1.14818013691 -0.00694412115951 -0.243702589245 1 2 1 1 11 1 0 16.0 1.0 12.0 0.333333333333 0.265625 0.328125 0.073974609375 0.075927734375 0.018310546875 0.00922393798828 -0.00511932373047 -0.00148773193359 -0.00817108154297 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.166666666667 0.0 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 2 3 2 6 1 6 3 3 4 3 5 2 4 3 4 3 4 4 3 4 3 4 2 6 1 6 91.0 0.538461538462 53.0 0.547169811321 0.260596546311 0.282333051564 0.0387859936224 0.211823438004 0.0617951062342 0.00354338056026 0.0131976178026 0.00333892248025 0.172475335529 0.428571428571 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 3.0 0.222222222222 0.0 3.0 1.0 0.582417582418 0.5 0.0 0.0 0.25 0.75 0.375 0.5 0.75 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.52589412388 0.391766013765 -6.9126020661 3.46348020922 1.82205968532 3.76466275949 -4.23444756096 16.7141336816 -2.04340796319 0.685991740989 -8.90426642741 23.3907100706 1.22285862914 0.236148723538 -6.63078237312 22.7095743623 -0.745386277593 -0.906394543975 -8.17886031424 14.469199279 0.157157756499 -0.780141868783 -9.35413836155 4.68321007552 -0.00409062514815 -0.0818986812447 1 2 1 2 11 2 1 1 0 20.0 0.8 13.0 0.538461538462 0.275 0.27 0.0645 0.086375 0.03575 0.00684236801115 -0.000396902066006 0.00058137767415 0.00186991184618 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.285714285714 0.0 1.0 2.0 0.65 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.9098593171 2.03718327158 -4.74047875555 4.9402776725 -0.320856365273 0.0814873308631 -6.98455135323 5.63020925653 -0.932011346746 0.0814873308631 -12.9756750652 5.77662933638 -1.3678055922 0.209259465656 -23.7101192784 7.96050763114 -0.973607695608 0.662668012551 -34.4444303466 15.3283376433 -0.901209292136 1.07457283234 -45.9117274878 26.8374460796 -0.309243779062 0.125256674196 2 2 2 4 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 5 1 11 1 0 84.0 0.428571428571 50.0 0.48 0.198412698413 0.30612244898 0.0211100313141 0.273688046647 0.0455539358601 0.00226233833222 0.0074097541284 0.00365122892954 0.387843824715 0.166666666667 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 3.0 0.15 0.0 6.0 1.0 0.595238095238 0.625 0.5 0.5 0.75 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -6.32072488279 -0.591146931484 -11.8165322474 0.138574726703 4.21273390184 2.53951896076 -3.15485449729 10.3470098092 -3.08432185158 1.59123693534 -8.379993604 19.6179427851 2.07838676004 -0.178735631708 -3.86639049526 19.2609388246 -0.984045437753 -0.280558914755 -4.65805160679 16.1265740876 0.20671135466 -0.0216063814086 -6.90433823882 15.4623905511 0.0067837472821 0.0441576341065 0 11 1 0 12.0 0.75 11.0 0.0909090909091 0.277777777778 0.3125 0.0532407407407 0.0989583333333 -0.00347222222222 0.00378663370996 -0.00451054897804 -0.0023388031738 0.0333279452267 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.954929658551 1.11408460164 -1.92840577722 2.48480501633 0.537147932935 -0.228785230695 -0.344024489088 2.09201472823 -0.0969850434466 0.013677377922 -0.587366485421 0.674142783304 -0.224821899592 -0.537109076748 -1.24516622196 -1.59177966243 0.497232914554 0.359230308411 2.30897772327 -0.657854503264 0.0603916219494 -0.242577659359 2.80519373384 -1.69197679868 -0.130238604088 0.0012267185328 0 1 1 2 2 5 1 5 3 3 2 4 2 3 3 3 3 4 2 3 3 4 2 4 1 5 1 7 3 1 1 0 84.0 0.428571428571 54.0 0.555555555556 0.240079365079 0.301020408163 0.0270269814275 0.244634758665 0.0429522999676 0.00240951567812 0.0030476348184 0.00200483605188 0.295799720078 0.666666666667 0.142857142857 1.0 1.0 0.0 2.0 1.0 0.0 0.0 0.0 4.0 7.0 0.136363636364 0.0 4.0 1.0 0.642857142857 0.625 0.375 0.5 0.75 0.75 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.875 0.75 0.75 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -5.36579522424 2.00080499887 -9.79919721612 6.72171908733 3.8577673378 2.85829285553 -2.00896988847 16.9449004818 -3.09952049998 0.338442176837 -8.71891268969 20.1624518433 1.66416136258 -0.174502398909 -5.51083010507 17.2305610266 -0.56668159801 -0.64533268127 -4.87374687059 12.0884310114 0.0211626941174 0.251289796754 -6.46769078698 14.8345122735 0.0790307803482 0.19620769351 1 2 1 3 14 1 3 1 0 25.0 1.0 18.0 0.388888888889 0.304 0.328 0.080384 0.079616 0.034688 0.008675328 -0.004144128 -0.002248704 -0.037165056 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.25 0.0 3.0 1.0 0.72 0.25 0.75 1.0 0.75 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 1.78253536263 -4.38762996142 4.38762996142 -0.101859163579 0.101859163579 -4.56643257557 4.56643257557 0.454291869562 -0.454291869562 -1.50646140298 1.50646140298 0.437749941396 -0.437749941396 2.43840209153 -2.43840209153 0.316142812107 -0.316142812107 5.17611801521 -5.17611801521 -0.155146402015 0.155146402015 3.37730824484 -3.37730824484 -0.117585562809 0.117585562809 0 5 2 5 3 4 3 4 4 3 4 3 4 3 4 3 4 4 3 4 2 5 1 13 1 0 91.0 0.538461538462 56.0 0.428571428571 0.243328100471 0.302620456467 0.0339317728522 0.219490930516 0.0540055283444 0.00315824744766 0.00622034614013 0.00353738358796 0.201814113827 0.285714285714 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 2.0 0.1 0.0 6.0 1.0 0.615384615385 0.75 0.125 0.0 0.625 1.0 0.625 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.09295817894 -1.27323954474 -10.4368826399 -1.4544900698 2.21614384118 2.34480072735 -6.35509346509 6.1899660214 -1.7089919618 0.074376011629 -8.52820849991 8.47556202799 1.39000608104 -0.362944789551 -4.81612061108 3.6655590872 -0.751460737949 -1.03743807553 -6.72422669945 -5.1822571916 -0.0672441425682 -0.376587987174 -9.77227863618 -11.5864947162 0.011391738691 -0.111669249132 1 1 9 1 4 2 1 2 0 20.0 1.25 14.0 0.428571428571 0.32 0.2 0.107 0.043 0.026 0.0115381107639 0.0018782971011 -0.00362243012355 -0.0350615458872 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 2.0 2.0 0.7 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 2.54647908947 -3.12946174564 5.95818667962 -0.173160578084 -0.0814873308631 -4.44118504695 7.17496130542 -0.49096116845 0.9819223369 -6.93160052663 12.1780391736 -0.306147902052 1.06976567957 -9.86381968096 22.6945015442 -0.450407857423 1.53398140223 -15.3876099094 35.7959079186 -0.923166529323 0.535994405206 -25.1977394105 46.1473426893 -0.140962615783 0.348634840553 1 11 1 2 1 0 16.0 1.0 13.0 0.230769230769 0.328125 0.28125 0.075927734375 0.0693359375 0.01318359375 0.00418853759766 -0.000457763671875 -0.00462341308594 -0.0381774902344 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 2.0 0.8125 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 0 1 1 1 2 4 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 14 65.0 0.384615384615 45.0 0.444444444444 0.264615384615 0.34674556213 0.0251397360036 0.299229858898 0.0502576240328 0.00175735431081 0.000749588269207 0.00195013297691 0.453634716724 0.2 0.0769230769231 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 3.0 2.0 0.0526315789474 0.0 6.0 1.0 0.692307692308 0.75 0.5 0.5 0.75 0.875 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.375 0.5 0.5 0.875 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.11354314453 0.195883006882 -7.57217129903 1.76157079032 2.85826920102 2.04228318418 -1.8259563915 9.64484066708 -2.13070864575 0.86692341721 -4.76038710109 14.679456696 1.89920761002 -0.409478482897 0.723571194089 11.6402382451 -0.860928952971 -0.631767562434 -0.181457300612 4.40127018351 0.248651126102 -0.683773701064 -0.978800646864 -3.39658737325 0.0285081975268 -0.0566846442044 1 11 12.0 1.33333333333 11.0 0.0909090909091 0.375 0.333333333333 0.104166666667 0.0555555555556 0.0 0.0 0.0 0.0 -0.0801875373874 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.916666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.954929658551 0.954929658551 -2.36543880901 1.92840577722 -0.0596831036595 -0.537147932935 -2.35312830674 0.344024489088 0.350638233999 0.0969850434466 -0.280296469051 0.587366485421 0.162962849445 0.224821899592 1.12973102546 1.24516622196 -0.0403035802544 -0.497232914554 1.08312211621 -2.30897772327 0.0299198713322 -0.0603916219494 1.41966315186 -2.80519373384 0.0231516011899 0.130238604088 2 2 2 4 2 4 3 3 3 3 4 2 3 3 4 2 4 1 4 3 3 4 1 6 1 2 3 0 78.0 0.461538461538 39.0 0.769230769231 0.173076923077 0.236686390533 0.0218416527588 0.219187781318 0.0456556921054 0.00300866185531 0.014255051103 0.00480905761947 0.257532689049 0.666666666667 0.0 1.0 2.0 1.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.222222222222 0.0 2.0 1.0 0.5 0.625 0.375 0.25 0.625 0.875 0.875 0.75 1.0 1.0 1.0 0.875 0.875 0.5 0.5 0.375 0.625 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.89707517206 1.27323954474 -9.51570073679 4.59651588177 2.81886078543 2.47635529115 -3.73319037603 14.4230000253 -1.9635417955 1.01448550658 -6.62721186831 19.5875578506 1.29761739272 -0.528960705497 -4.63922130825 18.5789895606 -0.942628765083 0.737108148565 -7.13792690887 21.3620592906 0.133369459023 -0.316461457394 -10.596114356 20.8034030684 -0.135721194679 0.0382045357747 0 16 16.0 1.0 16.0 0.0 0.375 0.375 0.078125 0.078125 0.0 0.0 0.0 0.0 -0.07763671875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.954929658551 0.954929658551 -2.2648145447 2.2648145447 0.119366207319 -0.119366207319 -1.41550909044 1.41550909044 0.566989484765 -0.566989484765 1.8165699994 -1.8165699994 0.136152080223 -0.136152080223 2.72043153319 -2.72043153319 -0.380013511582 0.380013511582 -0.644720156036 0.644720156036 -0.278074304257 0.278074304257 -3.49283318954 3.49283318954 0.0620657855579 -0.0620657855579 0 5 2 5 4 3 4 3 4 3 4 3 4 4 3 3 3 4 3 5 2 5 1 7 1 4 2 0 91.0 0.538461538462 54.0 0.518518518519 0.235478806907 0.29078613694 0.0329365116227 0.210313294965 0.0521636315623 0.00321144516266 0.00628962852057 0.00277506950395 0.187626946677 0.428571428571 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 3.0 0.0952380952381 0.0 7.0 1.0 0.593406593407 0.5 0.0 0.25 0.625 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.79913366862 -1.27323954474 -8.95859066999 -1.41782953165 3.33928368537 2.57429679459 -1.21436816944 8.0484477594 -1.86352219427 0.843560248451 -3.61561080722 13.329117716 1.26525227865 -0.551075400405 -0.173398269981 10.7715271424 -0.210532694716 0.063243351172 1.49099456412 8.22273800386 -0.141007191848 -0.68416610747 -1.62319672473 2.06121659289 -0.0416464389873 -0.0991453628673 1 2 3 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 4 2 4 1 5 1 11 2 2 2 0 84.0 0.428571428571 53.0 0.490566037736 0.301587301587 0.305272108844 0.034715473491 0.25208367077 0.0571685023216 0.00192600309845 0.00266124552435 0.000537568334954 0.249788875135 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 7.0 0.0 0.0 7.0 1.0 0.630952380952 0.375 0.0 0.0 0.5 0.75 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.59195193035 0.863983976785 -5.36135390627 4.61227847687 1.12893287622 3.74408523559 -2.82483547999 17.4144458959 -0.547179751097 0.156636039369 -3.03591024302 20.4772170375 0.328040200227 -0.331556790038 -3.19349126028 16.9390013433 -0.528249190763 -0.204333406187 -6.23659666887 14.617839892 -0.153055375278 -0.000877061776374 -9.60686903479 14.1482298171 -0.0704246605465 0.0233067897068 2 3 1 9 2 3 20.0 1.25 15.0 0.333333333333 0.38 0.2875 0.1145 0.061375 0.03325 -0.00013416407865 0.00196214965026 -0.00516531702802 -0.0782931251472 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.125 0.0 1.0 2.0 0.75 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.01859163579 2.29183118052 -2.7878157248 5.71096929652 -0.52966765061 0.33613523981 -4.95365407821 7.60690287822 -0.236313259503 0.531704833881 -6.61273090718 11.7305466493 -0.336705651126 1.4534895206 -9.6793308297 22.9876881192 -0.612975082495 1.24368246008 -16.006945816 35.6649601189 -0.716433170923 0.766030376182 -24.605789849 46.2842750422 -0.170963813195 0.283005835394 0 6 1 5 3 4 4 4 3 3 4 4 3 4 3 3 4 3 3 4 3 5 1 13 4 3 1 0 98.0 0.5 61.0 0.524590163934 0.258017492711 0.291545189504 0.0338730035954 0.218382646686 0.0501406726789 0.00274445929546 0.00591255334353 0.00163941239109 0.196485495567 0.714285714286 0.0 1.0 1.0 0.0 3.0 0.0 0.0 0.0 0.0 1.0 6.0 0.047619047619 0.0 6.0 1.0 0.622448979592 0.625 0.0 0.125 0.75 0.875 0.5 0.625 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.63822977011 -0.0454728408834 -8.57232753906 1.5588460604 3.29770898121 2.69333780518 -1.06069937897 12.0724327411 -1.83993133012 1.11605190333 -2.67071438964 17.3534035709 1.55748242486 -1.25446820782 0.872442153017 10.2806602163 -0.914957028112 -0.262782920262 -0.81085559682 3.6881974252 0.303978922615 -0.873245325997 -1.99133087163 -5.20320757404 -0.0344643889799 -0.113246841871 1 1 19 2 2 1 0 25.0 1.0 21.0 0.190476190476 0.36 0.304 0.0832 0.070784 0.01856 0.002688 0.00036352 -0.0038144 -0.064057344 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 2.0 0.222222222222 0.0 1.0 2.0 0.84 0.75 1.0 1.0 0.5 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 2.03718327158 -3.02104587806 5.0709220031 0.101859163579 0.203718327158 -2.51655645052 5.59137063809 0.352432705983 -0.505221451351 -0.23098292518 2.14420064189 0.193287948807 -0.559980937691 1.70044668652 -2.80737979404 0.137685557517 -0.405371439402 2.6987743889 -6.41478982837 -0.148953364869 0.158242920587 1.00950999865 -4.56120736794 -0.0696850032198 0.141535842604 1 2 1 1 3 5 1 6 2 4 4 3 4 3 4 3 4 3 4 3 4 3 3 4 2 6 1 11 3 0 98.0 0.5 57.0 0.543859649123 0.223032069971 0.282798833819 0.0297930709143 0.224056303071 0.0432366615951 0.0032177053771 0.00432441256347 0.00199682423326 0.232911079567 0.428571428571 0.0714285714286 1.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 3.0 7.0 0.173913043478 0.0 6.0 1.0 0.581632653061 0.625 0.125 0.0 0.625 1.0 0.625 0.5 0.875 0.875 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -6.09336067838 0.954929658551 -12.2557384348 4.12012821837 2.92279004821 2.82372421628 -6.83372168078 14.5836435872 -2.27507668294 0.622228404202 -9.82775038181 17.8594053091 1.82503748327 -1.06492619844 -5.72702450891 10.741548136 -1.21387229707 -0.333733410388 -8.49118755548 5.67907929945 0.458373052027 -0.269227240359 -8.47899821179 0.602521703998 0.0302614689336 -0.286603802054 1 1 3 1 10 1 3 1 0 20.0 1.25 16.0 0.25 0.32 0.3 0.092 0.058 0.024 0.0075131884044 -0.0012521980674 -0.0024149534157 -0.0540681236959 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 2.0 2.0 0.8 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.29183118052 -4.38939001676 5.56681023916 -0.1935324108 0.152788745368 -5.57512049096 7.06718450159 -0.217978610059 0.727274427953 -6.41418998329 12.0193340948 -0.133557735285 1.48135818776 -8.08399460805 23.524888813 -0.554087122024 1.1364790314 -14.5877937349 35.5552462092 -1.13030388235 0.817612717125 -26.6305695453 46.2220422892 -0.155106319778 0.264469310689 1 4 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 1 6 1 5 78.0 0.461538461538 49.0 0.489795918367 0.284188034188 0.300788954635 0.0338951263507 0.248910551425 0.0547231915575 0.00188756398664 0.00605757966963 0.000827474085011 0.245647429167 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.157894736842 0.0 6.0 1.0 0.628205128205 0.5 0.0 0.0 0.5 0.875 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.03618660668 0.391766013765 -6.01638442077 2.41049631971 1.58155244314 2.42245848748 -2.95869886361 12.5046254005 -1.18704992436 1.70726364284 -4.59235242486 22.1151942136 0.898343592736 -0.121020555524 -3.08612406498 21.7765141947 -0.86764591769 -0.51395250931 -7.30944631056 16.9582157465 -0.167821984243 -0.00859531813934 -11.8015548998 16.2482502036 -0.0941109883708 0.102582221361 0 11 1 0 12.0 1.33333333333 11.0 0.0909090909091 0.3125 0.277777777778 0.0989583333333 0.0532407407407 -0.00347222222222 0.00826933979308 -0.0023388031738 -0.00451054897804 -0.0413188560705 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.916666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.11408460164 0.954929658551 -2.48480501633 1.92840577722 0.228785230695 -0.537147932935 -2.09201472823 0.344024489088 -0.013677377922 0.0969850434466 -0.674142783304 0.587366485421 0.537109076748 0.224821899592 1.59177966243 1.24516622196 -0.359230308411 -0.497232914554 0.657854503264 -2.30897772327 0.242577659359 -0.0603916219494 1.69197679868 -2.80519373384 -0.0012267185328 0.130238604088 1 2 3 4 2 4 3 3 3 4 2 4 2 4 2 4 2 4 2 4 3 3 2 11 78.0 0.461538461538 51.0 0.470588235294 0.25641025641 0.329388560158 0.0298133818844 0.241583640992 0.0570601325039 0.00269514257337 0.00436236330475 0.00323088943205 0.280688136915 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 3.0 0.105263157895 0.0 5.0 1.0 0.653846153846 0.75 0.5 0.5 0.5 1.0 1.0 1.0 0.875 0.875 1.0 1.0 1.0 0.375 0.875 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.9950166755 0.293824510324 -9.59524924981 1.78600688725 2.99909633318 1.81684386561 -3.82451493487 9.63528636591 -2.63265156382 1.56850089165 -10.3593705055 18.6113446019 1.1349471221 0.200798923401 -7.78719777744 20.5593611238 0.0162976953816 -0.315192280211 -5.82529333743 18.1106926033 -0.548196126321 0.14353878561 -9.60037658001 19.5594353297 0.151466525587 0.159105446639 1 1 2 1 11 1 0 16.0 1.0 13.0 0.230769230769 0.28125 0.328125 0.0693359375 0.075927734375 0.01318359375 0.00714111328125 -0.00462341308594 -0.000457763671875 -0.0167770385742 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 2.0 0.8125 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 2 10 1 3 1 2 2 2 2 3 1 2 2 3 1 6 1 8 52.0 0.307692307692 39.0 0.333333333333 0.3125 0.360946745562 0.023576183432 0.364303595812 0.0314349112426 0.000942364654737 -0.00667693219526 -0.00178906277728 0.67124752328 1.0 0.0 1.0 0.0 0.0 3.0 0.0 0.0 0.0 0.0 5.0 6.0 0.111111111111 0.0 3.0 1.0 0.75 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.75 0.5 0.0 0.0 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.18309886184 1.46912255162 -6.0144693716 5.13745717926 2.00838035607 2.44969665708 -2.09347737195 14.2795884119 -1.56440470714 0.711295839371 -4.73267194575 19.5397463291 0.998505100126 0.186096524564 -3.93768770312 19.8656190735 -1.04121189695 -0.37627250995 -7.86737229809 17.1241434761 0.182470538216 0.113855837635 -10.9845257046 18.157087454 -0.164823235723 0.143655581963 1 1 14 1 3 3 1 2 0 25.0 1.0 18.0 0.388888888889 0.304 0.224 0.080384 0.058624 0.021504 0.008675328 0.000811008 -0.004421632 -0.028662784 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 2.0 2.0 0.72 0.75 1.0 0.75 0.25 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 2.29183118052 -3.3266233688 5.37649949384 0.488923985178 -0.183346494442 -1.99707471627 5.07188890383 0.0122230996295 -0.165011844998 -0.698720204334 2.61193792104 0.344202485566 -0.710895474449 1.79270664252 -2.89963975005 0.211101731232 -0.478787613118 3.112015288 -6.82803072748 -0.364805820529 0.374095376247 0.294056902583 -3.84575427187 -0.00319800319206 0.0750488425764 1 4 2 4 2 4 3 3 4 2 3 3 3 3 3 3 3 3 3 4 2 4 1 11 78.0 0.461538461538 48.0 0.5 0.299145299145 0.305719921105 0.0372646201049 0.256730558506 0.0614052832988 0.00208797503605 0.00620795831285 0.00151054062346 0.243223225104 0.333333333333 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.277777777778 0.0 4.0 1.0 0.615384615385 0.375 0.0 0.0 0.375 0.875 0.375 0.5 0.75 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.35059608259 -0.195883006882 -5.07540460799 1.38593772451 0.556354102388 2.85015570369 -5.22911657648 11.7753763478 -1.08678342042 0.802920748528 -7.14489765668 17.6854254096 1.02915054941 -0.029968769887 -4.70193714525 17.9548381585 -0.952520038943 0.155023375962 -8.45953492672 18.1821477677 0.233884540284 -0.100749357429 -9.21340444716 18.7159491844 -0.0430840178435 0.180031140841 1 1 3 1 10 1 3 1 0 20.0 1.25 16.0 0.25 0.32 0.3 0.092 0.058 0.024 0.0075131884044 -0.0012521980674 -0.0024149534157 -0.0540681236959 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 2.0 2.0 0.8 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.29183118052 -4.38939001676 5.56681023916 -0.1935324108 0.152788745368 -5.57512049096 7.06718450159 -0.217978610059 0.727274427953 -6.41418998329 12.0193340948 -0.133557735285 1.48135818776 -8.08399460805 23.524888813 -0.554087122024 1.1364790314 -14.5877937349 35.5552462092 -1.13030388235 0.817612717125 -26.6305695453 46.2220422892 -0.155106319778 0.264469310689 4 1 3 5 2 5 3 4 3 3 5 3 4 2 5 2 5 2 4 3 4 4 3 4 2 13 98.0 0.5 51.0 0.705882352941 0.246355685131 0.269679300292 0.0376469413255 0.235220868856 0.061634608029 0.00401674347107 0.0137736206566 0.00400744764412 0.227234938991 0.571428571429 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 4.0 0.0 0.1 0.0 6.0 1.0 0.520408163265 0.25 0.0 0.0 0.125 0.625 0.25 0.125 0.625 0.75 0.75 0.625 1.0 0.875 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.91026181654 -0.13641852265 -5.97053812596 1.22252291539 1.15445334814 2.34765141275 -4.55627999475 9.55643123934 -1.32051160256 0.448708134242 -6.79218494111 13.1523158395 1.05059591741 -0.318902706184 -4.60894160642 9.85646957764 -0.687947619124 -0.796506865117 -4.55672373212 0.51772615313 0.73516598918 -1.20454509918 -2.59087748032 -11.9820314275 -0.165123357606 -0.0413184297378 1 2 2 2 9 1 4 20.0 1.25 15.0 0.333333333333 0.35 0.325 0.104375 0.0655 0.03625 0.00482152157648 -0.00150934588481 -0.00259942902384 -0.0746958507884 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 2.0 0.25 0.0 1.0 2.0 0.75 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 2.16450722605 -4.04774399592 5.39598722874 -0.550039483326 0.331042281631 -6.08758952222 7.32341901722 0.0366692988884 0.599950473479 -6.09532036384 11.8598992851 -0.164115484358 1.4966370623 -7.89950575679 23.4326443874 -0.716654347096 1.21776264393 -15.2071296415 35.8649141625 -0.923570523952 0.714246037925 -26.0386199838 45.9260675085 -0.18510751719 0.279469909395 3 1 2 4 2 5 1 5 2 3 4 2 4 3 3 2 3 4 3 3 2 4 2 4 1 6 2 2 2 0 84.0 0.428571428571 48.0 0.708333333333 0.224206349206 0.275510204082 0.0265005803909 0.242103984451 0.0530247813411 0.00259593418003 0.0099667188995 0.00302780604706 0.289041475208 0.833333333333 0.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 4.0 0.15 0.0 6.0 1.0 0.571428571429 0.75 0.375 0.125 0.5 0.75 0.75 0.625 0.875 0.875 1.0 1.0 1.0 0.75 0.75 0.875 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -4.63822977011 2.00080499887 -9.06651629222 7.01193380908 2.61979244518 3.16453851862 -3.54053495192 17.4447359034 -1.65855605776 -0.337684611808 -5.23290838911 17.8877114677 1.32486557229 -0.0727113620706 -2.73784150783 15.6835705849 -1.03247697177 0.0181967727413 -6.05486281573 15.8779292991 0.174624484686 0.032425981475 -8.58076349727 15.4080998302 -0.0661785163541 -0.0126540090447 1 1 11 1 2 1 0 16.0 1.0 13.0 0.230769230769 0.328125 0.28125 0.075927734375 0.0693359375 0.01318359375 0.00418853759766 -0.000457763671875 -0.00462341308594 -0.0381774902344 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 2.0 0.8125 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 2 1 3 3 1 9 3 1 2 0 25.0 1.0 14.0 0.785714285714 0.208 0.232 0.062336 0.066176 0.034944 0.012263424 0.001065984 0.003204096 0.004061184 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 3.0 3.0 0.56 0.25 0.75 1.0 0.5 0.75 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.25 0.75 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 1.78253536263 -4.00991541048 4.00991541048 0.387064821599 -0.387064821599 -3.02201277879 3.02201277879 0.0631526814189 -0.0631526814189 -1.33645944324 1.33645944324 0.46643348186 -0.46643348186 2.16168434503 -2.16168434503 0.300330358528 -0.300330358528 4.35068710116 -4.35068710116 -0.367902339102 0.367902339102 1.47795602568 -1.47795602568 -0.0271482829868 0.0271482829868 0 5 1 5 2 4 2 4 2 4 3 2 3 3 3 3 3 3 3 4 1 12 72.0 0.5 49.0 0.428571428571 0.261574074074 0.319444444444 0.0323404278121 0.233410493827 0.0429848251029 0.00284848330718 0.00400364457655 0.00141064269872 0.23626807515 0.5 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 0.0 0.176470588235 0.0 3.0 1.0 0.680555555556 0.833333333333 0.5 0.333333333333 0.5 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.77464829276 -0.106103295395 -8.79364504384 0.534763554133 3.40856836455 1.25113469153 -1.28949389728 5.31667765475 -2.16860890437 0.491996723514 -4.41918151958 7.94243321345 1.5458004012 -0.507758655044 -0.536466183072 3.99433836757 -0.486595233776 -0.683525995131 0.718587584606 -3.34130417098 0.179116885368 -0.566676108749 -0.632119589484 -9.82003504813 -0.0209051064093 -0.0123294716155 1 3 2 5 1 5 2 4 3 3 2 4 2 4 2 4 2 4 2 4 2 4 1 12 78.0 0.461538461538 56.0 0.392857142857 0.288461538462 0.352071005917 0.0311219845244 0.244089161989 0.0448907601274 0.00181372060895 -0.00166241204084 0.000550172930315 0.271774195062 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.210526315789 0.0 4.0 1.0 0.717948717949 0.75 0.375 0.5 0.75 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -5.19089968238 0.783532027529 -10.0953983793 3.26339936172 2.97359677016 2.25787039886 -4.28711424198 12.6181775807 -2.47595750345 1.49329501259 -9.87338905839 21.1342506988 1.25350368275 -0.015051325446 -6.51787830913 21.5227124888 -0.0791451219209 -0.341760689627 -5.46058885611 18.0845923983 -0.713923221677 -0.0813177267577 -10.9739800835 16.6714987117 0.148248651085 0.055000788982 1 1 2 11 1 0 16.0 1.0 12.0 0.333333333333 0.25 0.328125 0.0703125 0.075927734375 0.0234375 0.01171875 -0.005615234375 0.0003662109375 0.000434875488281 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.166666666667 0.0 2.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 2 2 3 4 1 5 3 3 3 4 2 3 3 3 3 4 2 3 3 3 3 3 2 5 1 5 78.0 0.461538461538 47.0 0.531914893617 0.292735042735 0.29191321499 0.0368789932399 0.235160741078 0.0621470355198 0.00227221028673 0.00771278479259 0.000840798929801 0.21702323986 0.5 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 8.0 0.0434782608696 0.0 6.0 1.0 0.602564102564 0.375 0.0 0.0 0.25 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -2.49750833775 1.86088856538 -5.3706373491 5.73543080059 0.69109611156 2.11820233774 -4.89212040344 15.0476090263 -1.02333456823 1.72789030659 -7.10698610954 24.3810167617 0.705898261689 -0.0298720013946 -5.33071426807 23.8316732943 -0.478691136142 -0.935341001922 -7.49907506927 15.8515200631 -0.196321212203 -0.0683601880445 -9.96672436339 14.1261050131 0.0318396125908 0.142507190562 1 2 2 10 1 3 1 0 20.0 1.25 15.0 0.333333333333 0.29 0.3 0.092375 0.058 0.033 0.013022300884 -0.00172177234267 -0.000603738353925 -0.0409871260276 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.285714285714 0.0 2.0 2.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 1.65521140816 -4.38939001676 3.65695092206 -0.1935324108 -0.483831026999 -5.57512049096 2.29253620884 -0.217978610059 0.0906546555851 -6.41418998329 3.10665728167 -0.133557735285 0.844738415392 -8.08399460805 9.20094393474 -0.554087122024 0.499859259031 -14.5877937349 14.5467937211 -1.13030388235 0.180992944757 -26.6305695453 17.2558426465 -0.155106319778 0.0684441741886 2 2 1 5 1 9 1 1 1 1 1 0 25.0 1.0 18.0 0.388888888889 0.312 0.288 0.083456 0.073856 0.031744 0.007673856 -0.001926144 -0.001478656 -0.037917696 0.2 0.2 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.0 0.166666666667 0.0 2.0 2.0 0.72 0.5 0.75 0.75 0.75 0.75 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 2.03718327158 -3.95547812967 4.81978179318 -0.366692988884 -0.162974661726 -4.95536922414 4.17749592699 0.501147084808 -0.407436654315 -1.68393175522 1.32899105074 0.591272072742 -0.28422781005 3.04887705515 -1.82792712792 0.176128672623 -0.45615695159 4.9017833306 -5.45045269982 -0.185236322543 0.125056481486 2.88585156311 -3.86876492658 -0.0748437511072 0.160327374512 4 1 2 5 3 5 3 4 3 4 3 4 3 4 3 4 3 3 4 4 3 4 2 5 2 6 91.0 0.538461538462 53.0 0.584905660377 0.270015698587 0.289095519865 0.0397175581332 0.201024190156 0.0602079963268 0.00307041618578 0.00741292578897 0.00129575111389 0.155233454692 0.285714285714 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 5.0 0.05 0.0 6.0 1.0 0.582417582418 0.375 0.0 0.0 0.25 0.625 0.5 0.5 0.75 0.75 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.23206961356 0.979415034412 -6.21420111627 2.93518465564 1.95767099778 1.06634536291 -2.15655435924 8.10218116809 -1.39830262483 1.2014217195 -4.37365743758 13.8468339335 1.06898134557 -0.241169240933 -0.772215120957 12.9520398202 -0.171974125785 -0.509887578991 0.0937867095992 5.88364988961 -0.137265210909 -0.992309242793 -0.592909508805 -3.92271801023 0.134938747743 -0.0341801191141 1 4 3 5 1 7 1 6 2 3 2 0 35.0 1.4 25.0 0.4 0.310204081633 0.28 0.106915451895 0.0542040816327 0.0404897959184 0.0130349608551 -3.15392841414e-06 -0.000525129080956 -0.0567817502041 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.1 0.0 2.0 4.0 0.714285714286 0.5 0.75 0.75 0.25 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.1826963624 3.09215318007 -5.17491027979 6.84439297774 0.133634471168 -0.928017160886 -4.74924956966 3.72810852177 0.379085540659 -0.451887539974 -1.57306853169 0.269028283045 0.546052873115 0.0216880045529 2.83559063622 -0.964888998254 0.287267775651 -0.501004699334 5.35357578293 -4.88695193727 -0.226817484921 -0.10355207635 3.27717646137 -5.50904106569 -0.0784552819035 0.175262480507 1 5 2 5 3 4 3 4 3 4 3 3 4 4 3 4 3 4 2 5 1 14 84.0 0.583333333333 56.0 0.410714285714 0.30612244898 0.329365079365 0.0445416261743 0.20292085088 0.048833819242 0.00236682947032 -0.000243625646811 -0.00026908221267 0.119766900947 0.285714285714 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 6.0 1.0 0.666666666667 0.333333333333 0.0 0.0 0.0 0.833333333333 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.39530545263 -0.159154943092 -6.65803560105 0.855166480094 1.9629109648 1.95075329554 -2.16701269701 8.43224877471 -1.12603759634 1.04499158478 -3.81160152411 15.2958058667 0.720926079216 0.143432507357 -1.02327025252 15.0636532121 0.168971931269 -0.965412525317 0.675298420068 6.67428785844 -0.463340942524 -0.554427459516 -1.58820056976 -1.14874604098 0.153410853859 -0.10869443916 1 2 3 2 3 3 3 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 3 2 11 78.0 0.461538461538 37.0 0.756756756757 0.202991452991 0.246548323471 0.0281549756402 0.253569682564 0.0589271565603 0.00368849812836 0.0214389900584 0.00651055097735 0.293824965575 0.333333333333 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 7.0 1.0 0.474358974359 0.25 0.0 0.0 0.375 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.625 0.5 0.5 0.875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.23206961356 -1.17529804129 -6.26430967682 -1.38837682075 1.67775534001 2.32973280375 -4.21610935846 7.83715954708 -2.04759502161 1.44582110853 -8.08731379592 16.6130366774 1.65674929264 -0.0163844539738 -4.76732081457 17.6622950426 -1.31308226296 0.0263719960108 -8.03061178945 17.758859354 0.604849122275 0.320089066905 -8.96039124251 21.9672926395 -0.188594502079 0.213408396502 1 1 2 2 2 1 4 1 3 16.0 1.0 11.0 0.454545454545 0.28125 0.296875 0.0693359375 0.087646484375 0.04541015625 0.00714111328125 0.00270080566406 0.00363159179688 -0.0147018432617 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.166666666667 0.0 2.0 1.0 0.6875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 0.477464829276 -2.64228363549 1.13240727235 0.139260575205 -0.0596831036595 -1.65142727218 0.707754545219 0.661487732226 -0.283494742382 2.11933166596 -0.908284999698 0.158844093594 -0.0680760401116 3.17383678872 -1.36021576659 -0.443349096845 0.190006755791 -0.752173515375 0.322360078018 -0.324420021633 0.139037152129 -4.07497205446 1.74641659477 0.0724100831509 -0.031032892779 2 4 4 4 4 4 5 3 5 3 5 3 5 3 4 4 4 4 4 4 3 6 1 8 1 7 104.0 0.615384615385 57.0 0.473684210526 0.251201923077 0.291420118343 0.043915531122 0.197609666591 0.0606704454939 0.00461730800405 0.0097099952919 0.00416911169124 0.135536932083 0.125 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 1.0 0.05 0.0 7.0 1.0 0.548076923077 0.0 0.0 0.0 0.5 0.375 0.0 0.375 0.875 0.875 0.5 0.875 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.26045539969 -2.25265457915 -8.49244673407 -3.66514901706 2.10632185951 2.83103103142 -4.97957908383 7.3908022106 -2.08804077149 1.74321884972 -9.64490919956 18.2187220435 1.22839167053 0.00244088325713 -6.39237648599 19.7393175536 -0.355132228163 0.0339388213118 -6.36422600733 19.2776984881 -0.232733615331 0.0467121757783 -8.61686053701 20.5895978761 0.101135473492 0.154965576489 1 1 1 2 8 1 2 1 0 16.0 1.0 11.0 0.454545454545 0.25 0.28125 0.0703125 0.0693359375 0.03515625 0.01171875 -0.001220703125 0.000732421875 -0.00338745117188 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.166666666667 0.0 2.0 1.0 0.6875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 1 5 1 6 1 6 2 5 3 3 4 3 4 3 4 3 4 4 3 4 2 5 1 14 3 2 2 0 98.0 0.5 63.0 0.460317460317 0.274052478134 0.294460641399 0.0359586566822 0.214549209938 0.0494564339688 0.00276233251598 0.00586911878925 0.00127457965786 0.180894286662 0.428571428571 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 4.0 0.15 0.0 5.0 1.0 0.642857142857 0.75 0.125 0.0 0.625 1.0 0.625 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.72917545187 1.6370222718 -9.2939750246 6.86563897275 2.62628856531 4.28465523181 -3.68867997479 21.3339285955 -1.63416246382 -0.0651411229565 -5.37131458647 23.3619889034 1.32386551881 -0.62896379989 -2.32578562789 16.2250499177 -0.879919998373 -0.849269282059 -5.37090403862 8.48081984951 0.00471383489538 -0.30121958658 -6.94852595165 1.5622536427 0.134959598105 -0.274323589124 1 1 3 2 14 1 3 1 0 25.0 1.0 20.0 0.25 0.336 0.328 0.075904 0.079616 0.024192 0.004595712 -0.003249152 -0.002663424 -0.055136256 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.25 0.0 1.0 1.0 0.8 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 1.78253536263 -4.38762996142 4.38762996142 -0.101859163579 0.101859163579 -4.56643257557 4.56643257557 0.454291869562 -0.454291869562 -1.50646140298 1.50646140298 0.437749941396 -0.437749941396 2.43840209153 -2.43840209153 0.316142812107 -0.316142812107 5.17611801521 -5.17611801521 -0.155146402015 0.155146402015 3.37730824484 -3.37730824484 -0.117585562809 0.117585562809 1 4 2 5 2 6 1 5 3 4 3 4 3 4 3 4 3 4 3 4 3 5 2 20 98.0 0.5 69.0 0.333333333333 0.266763848397 0.349125364431 0.032411027718 0.232586974815 0.0490983773768 0.00306184038048 0.00348500201844 0.00287389996213 0.247199637344 0.285714285714 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 0.0 0.1 0.0 7.0 1.0 0.704081632653 0.875 0.625 0.5 0.625 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -7.27565454134 -0.409255567951 -14.0201074495 0.800169699233 4.35054445023 2.72210633717 -5.20074212193 10.53114556 -3.34593746488 0.576362576459 -12.1428140378 14.7462371895 1.72551668958 -0.484183695503 -8.21149075552 11.2433756314 -0.168957003568 -0.336569474584 -4.50964502299 6.24232821789 -0.11043257596 -0.653797621967 -7.40452184382 -1.26134520002 0.00809328620554 -0.150282320826 1 0 3 1 12 16.0 1.0 15.0 0.0666666666667 0.328125 0.375 0.075927734375 0.078125 0.017578125 0.00418853759766 -0.0029296875 0.00164794921875 -0.046875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.9375 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.954929658551 0.954929658551 -2.2648145447 2.2648145447 0.119366207319 -0.119366207319 -1.41550909044 1.41550909044 0.566989484765 -0.566989484765 1.8165699994 -1.8165699994 0.136152080223 -0.136152080223 2.72043153319 -2.72043153319 -0.380013511582 0.380013511582 -0.644720156036 0.644720156036 -0.278074304257 0.278074304257 -3.49283318954 3.49283318954 0.0620657855579 -0.0620657855579 1 3 2 4 2 5 2 4 2 3 3 4 3 2 3 3 4 2 3 4 2 4 1 12 3 1 2 0 84.0 0.428571428571 51.0 0.607843137255 0.232142857143 0.284013605442 0.0266490524781 0.242340190044 0.0497145286686 0.0027570013085 0.00845715506333 0.00354369597727 0.285562358611 0.833333333333 0.0 1.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 6.0 0.105263157895 0.0 4.0 1.0 0.607142857143 0.75 0.375 0.25 0.75 1.0 0.875 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.75 0.625 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.86559397452 1.77344079445 -9.03162406842 6.48262636271 3.34039777061 3.250380106 -1.9634331739 17.5475932313 -2.28963613585 -0.059232115728 -5.62076823348 18.9341054875 1.41083398417 -0.382070143955 -4.20327264647 15.0072776722 -1.15276334176 -0.074727806094 -6.90964759555 14.625725567 0.511034297582 0.36557690519 -7.57064333225 16.7458429797 -0.089118662459 -0.055734031276 1 1 8 9.0 1.0 8.0 0.125 0.333333333333 0.333333333333 0.0740740740741 0.0740740740741 0.0 0.0 0.0 0.0 -0.0288065843621 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.888888888889 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.848826363157 0.848826363157 -2.04924811803 2.04924811803 7.06789929214e-17 -6.90224540248e-19 -2.09836831138 2.09836831138 0.0523966890838 -0.0523966890838 -1.90639619218 1.90639619218 -0.167669405068 0.167669405068 -2.67648726882 2.67648726882 0.105957749036 -0.105957749036 -1.32537409589 1.32537409589 0.38915861917 -0.38915861917 2.72582981883 -2.72582981883 0.0411295744488 -0.0411295744488 2 3 3 5 3 3 4 3 5 3 3 3 4 4 3 3 4 4 3 3 3 5 1 7 1 3 1 1 1 0 91.0 0.538461538462 50.0 0.7 0.244897959184 0.275570583263 0.0367795469836 0.206754240808 0.0539962392396 0.00361011617653 0.00763525402095 0.00255451758649 0.171835149946 0.857142857143 0.0769230769231 0.0 1.0 0.0 4.0 0.0 0.0 0.0 0.0 1.0 5.0 0.315789473684 0.0 4.0 1.0 0.549450549451 0.125 0.0 0.0 0.5 0.625 0.375 0.5 0.875 1.0 0.875 1.0 1.0 1.0 1.0 1.0 0.875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.72177713076 -0.293824510324 -7.10357280963 0.756605619501 2.33205094584 2.36798214829 -2.05299462091 10.1640747521 -1.4277629188 1.29061189362 -3.21206032097 17.2566314545 1.44590284129 -0.593492831145 1.54501838682 13.5743805246 -0.589283909066 -0.585851463125 0.153030014105 6.92337366308 -0.195677870479 -0.446066389651 -2.61257435972 -0.194929072189 0.105922495623 -0.259219073879 1 3 1 2 3 1 10 1 3 1 0 25.0 1.0 17.0 0.470588235294 0.28 0.32 0.0768 0.0832 0.0384 0.009216 -0.002304 -0.000768 -0.0230656 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.25 0.0 1.0 1.0 0.68 0.25 0.75 1.0 0.75 0.5 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.5 0.75 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 1.27323954474 -5.0709220031 3.02104587806 -0.203718327158 -0.101859163579 -5.59137063809 2.51655645052 0.505221451351 -0.352432705983 -2.14420064189 0.23098292518 0.559980937691 -0.193287948807 2.80737979404 -1.70044668652 0.405371439402 -0.137685557517 6.41478982837 -2.6987743889 -0.158242920587 0.148953364869 4.56120736794 -1.00950999865 -0.141535842604 0.0696850032198 0 5 1 5 2 4 3 3 3 3 3 2 4 2 4 2 4 2 4 3 3 3 1 12 78.0 0.461538461538 46.0 0.521739130435 0.247863247863 0.277120315582 0.0321313575751 0.257179402889 0.0527781992279 0.00292688964436 0.0112214036342 0.00309277111434 0.280139413933 0.5 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 5.0 2.0 0.0 0.0 7.0 1.0 0.589743589744 0.625 0.0 0.0 0.5 0.875 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.75 0.625 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.330011117 9.895059009e-16 -6.64912287507 1.37423964617 1.50331514749 2.16978099931 -4.86836417872 9.87624176223 -1.75641785699 1.23319672636 -7.43574200844 18.1808643707 1.70212620784 0.475845313999 -3.54326733828 20.7355632909 -1.4037164475 -0.563061875216 -7.75178580818 16.8843476777 0.47633736547 0.0785474279921 -10.1973735945 17.7940512043 -0.205740402137 0.227873973973 1 4 1 5 1 6 1 4 1 0 24.0 1.5 19.0 0.263157894737 0.3125 0.302083333333 0.105251736111 0.0520109953704 0.0271267361111 0.00913641600566 0.000129201842504 -0.00134739064326 -0.0612035280412 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.25 0.0 1.0 2.0 0.791666666667 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 2.97089227105 -6.35837607185 7.02943223325 -0.353677651315 -0.141471060526 -7.94587493107 7.20025697397 -5.83101691602e-16 0.186008246247 -7.68499937212 7.67533395416 -0.0463565152033 0.238987120765 -7.47121211608 8.37561908256 0.0874733614981 -0.390573653212 -7.1281180257 6.25520037726 -0.178457355071 0.2740826603 -8.58653597285 8.38203084341 -0.00551450339207 0.0595519541236 1 4 2 5 1 5 2 3 4 2 3 3 3 3 3 3 3 3 3 4 2 4 1 11 78.0 0.461538461538 50.0 0.44 0.320512820513 0.308678500986 0.0393718707328 0.253613934827 0.0563900268042 0.00181107766453 0.00385047636098 -0.000768546213105 0.222921759548 0.5 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 1.0 0.210526315789 0.0 3.0 1.0 0.641025641026 0.375 0.0 0.0 0.375 0.875 0.375 0.5 0.75 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.05677157226 0.88147353097 -4.30209386699 4.24321007715 0.651977463736 3.23902403984 -4.12267499634 16.030098882 -1.12315013181 0.714238096643 -6.26596331055 21.3607458275 0.990057559749 -0.164830263493 -4.14607134264 20.4876605955 -0.950150224417 0.131309271651 -7.97248767898 20.1395876701 0.221684880724 -0.184104552868 -8.98462809373 19.2793842951 -0.0654491042252 0.0937848955904 1 1 3 1 14 1 0 20.0 1.25 17.0 0.176470588235 0.32 0.3375 0.092 0.061375 0.012 0.0075131884044 -0.0036671514831 -0.00120747670785 -0.061019500021 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 2.0 0.85 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.29183118052 -4.38939001676 5.56681023916 -0.1935324108 0.152788745368 -5.57512049096 7.06718450159 -0.217978610059 0.727274427953 -6.41418998329 12.0193340948 -0.133557735285 1.48135818776 -8.08399460805 23.524888813 -0.554087122024 1.1364790314 -14.5877937349 35.5552462092 -1.13030388235 0.817612717125 -26.6305695453 46.2220422892 -0.155106319778 0.264469310689 1 3 2 4 3 4 2 3 3 3 3 3 3 2 4 2 4 2 4 2 4 3 2 5 1 6 78.0 0.461538461538 42.0 0.642857142857 0.17735042735 0.26134122288 0.0214792056508 0.246331276657 0.0420796877897 0.00308656753647 0.0132814319802 0.00433841773886 0.315205137884 0.5 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 4.0 2.0 0.0 0.0 7.0 1.0 0.538461538462 0.625 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.875 0.5 0.875 0.625 0.375 0.0 0.625 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.48472419271 0.195883006882 -10.2720304562 1.01047955809 3.75075390693 1.05823186558 -1.94380628083 6.48014547936 -2.52880497061 1.65162137419 -7.47788265059 14.9808288544 0.991186457856 0.13556634727 -6.02817240602 18.1102527531 -0.0946924825284 0.30415759539 -5.52651264728 20.2848867992 -0.728357687783 0.201469011803 -11.5242348541 22.626177885 0.096816615819 0.0600734297428 1 0 4 2 5 1 6 2 2 2 0 24.0 1.5 17.0 0.411764705882 0.25 0.239583333333 0.100694444444 0.0433304398148 0.0355902777778 0.0191366386155 0.0018457406072 0.00360288566526 -0.0282312178341 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 4.0 0.0 0.0 1.0 1.0 0.708333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.22816920329 2.65258238486 -5.35135688418 6.02241304558 -0.0884194128288 -0.406729299013 -6.57687685696 5.83125889985 -0.442097064144 0.628105310391 -7.95885414285 7.94918872489 0.0315289799244 0.161101625638 -8.61305531807 9.51746228456 -0.151204473255 -0.151895818458 -8.85013921637 7.97722156793 0.156259850825 -0.060634545596 -8.01680665988 7.81230153044 0.00292346260877 0.0511139881228 0 5 1 5 1 5 2 3 3 3 3 3 4 3 2 4 2 4 2 4 2 4 1 6 72.0 0.5 49.0 0.448979591837 0.259259259259 0.313657407407 0.031207133059 0.224727259088 0.0461891289438 0.00241032594626 0.00517477727243 0.00107746172656 0.222009046927 0.5 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 3.0 1.0 0.235294117647 0.0 2.0 1.0 0.680555555556 1.0 0.666666666667 0.333333333333 0.333333333333 1.0 1.0 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.88075158815 0.424413181578 -9.36663173839 2.56580736404 3.06815362516 2.21048532072 -2.47595717009 9.65788983686 -1.98116793615 -0.254615161016 -6.77240995794 10.088808767 0.686444952937 -0.182589043902 -5.48091558759 6.30555342217 0.380049827104 -0.887980892043 -0.484744337509 -2.01747105927 0.0698005069065 -0.719811801763 1.68071050506 -10.5334536446 0.13033830676 -0.0305627329989 1 2 3 1 14 2 3 25.0 1.0 20.0 0.25 0.384 0.328 0.089344 0.079616 0.027648 -0.000187392 0.000858112 -0.004184064 -0.082093056 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 1.0 3.0 0.8 0.25 0.75 1.0 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.01859163579 1.78253536263 -2.58889404631 4.63877017135 -0.162974661726 0.468552152463 -2.9054930991 5.98030728667 0.399287921229 -0.552076666597 -0.408453277421 2.32167099413 0.346810080153 -0.713503069037 2.31092165013 -3.41785475765 -0.00232858196674 -0.265357299918 2.42443970429 -6.14045514376 -0.179043285398 0.188332841116 0.518053316917 -4.06975068621 -0.0269431915177 0.098794030902 1 19 20.0 1.25 19.0 0.0526315789474 0.4 0.375 0.1 0.0625 0.0 0.0 0.0 0.0 -0.114877992344 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 0.95 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 2.16450722605 -4.04774399592 5.39598722874 -0.550039483326 0.331042281631 -6.08758952222 7.32341901722 0.0366692988884 0.599950473479 -6.09532036384 11.8598992851 -0.164115484358 1.4966370623 -7.89950575679 23.4326443874 -0.716654347096 1.21776264393 -15.2071296415 35.8649141625 -0.923570523952 0.714246037925 -26.0386199838 45.9260675085 -0.18510751719 0.279469909395 0 5 2 5 2 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 6 1 13 5 2 5 1 2 0 105.0 0.466666666667 57.0 0.526315789474 0.179591836735 0.246349206349 0.0239507612569 0.206099557283 0.0471862649822 0.00378422155068 0.0151921015501 0.00634706246824 0.224358721144 0.285714285714 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 6.0 0.1 0.0 1.0 1.0 0.542857142857 0.875 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 0.5 0.5 0.875 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -6.70572826894 1.18835690842 -11.7437385827 6.30368469234 5.67016010589 4.83491496454 1.49307180333 21.0249884122 -3.4304573434 -1.36266602193 -5.44553232932 17.7840334086 1.28335369859 -0.411906944214 -5.6282780776 11.4272134557 -0.505170976749 -0.264871782677 -3.68956094956 7.61870555096 0.513084186078 -0.682407982498 -1.63719264896 -0.00536501163887 0.038771679399 -0.146358185144 1 4 1 5 1 4 2 4 3 4 2 4 3 3 2 4 2 4 3 3 2 4 1 12 78.0 0.461538461538 55.0 0.418181818182 0.277777777778 0.339250493097 0.0311198772737 0.246034154318 0.0471181240412 0.00208853788532 0.00193774322307 0.00137496736334 0.275865057007 0.666666666667 0.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 5.0 0.0 0.111111111111 0.0 3.0 1.0 0.705128205128 0.875 0.5 0.25 0.625 1.0 0.875 0.75 0.875 1.0 1.0 1.0 1.0 0.75 0.875 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -5.38678268926 0.685590524088 -10.9162192673 3.05713471024 2.57255818802 2.31988069985 -5.65749779243 12.7537622953 -1.7750898743 1.62711285121 -8.40140816837 21.913678823 1.11793794421 -0.0905163224909 -5.50923661788 21.4930434697 -0.38650927413 -0.595847926784 -6.32042429307 16.2991194689 -0.405167730121 0.0752544947184 -10.5068159687 16.4852427416 0.0641996606767 0.13665965966 1 1 2 2 14 2 2 2 0 25.0 1.0 18.0 0.388888888889 0.256 0.28 0.068864 0.0704 0.02432 0.011615232 -0.003072 -0.00144384 -0.011904 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 3.0 0.111111111111 0.0 2.0 3.0 0.72 0.75 1.0 1.0 0.75 1.0 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.5 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 2.03718327158 -4.69320745216 4.69320745216 0.285205658021 -0.285205658021 -4.04695084131 4.04695084131 0.114082263208 -0.114082263208 -1.97419868214 1.97419868214 0.588664478155 -0.588664478155 2.53066204754 -2.53066204754 0.389558985823 -0.389558985823 5.58935891432 -5.58935891432 -0.370998857674 0.370998857674 2.66185514878 -2.66185514878 -0.0510985627816 0.0510985627816 3 1 2 5 2 3 3 4 3 3 3 3 3 3 2 4 2 4 3 3 2 11 1 5 78.0 0.461538461538 49.0 0.571428571429 0.277777777778 0.326429980276 0.0340784571554 0.249896744719 0.0593907516984 0.00253519549248 0.00389521064248 0.0019592171465 0.266636280518 0.666666666667 0.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 3.0 1.0 0.15 0.0 6.0 1.0 0.628205128205 0.5 0.125 0.25 0.5 0.75 0.625 0.75 0.875 0.875 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.67280637904 -0.0979415034412 -7.02240556805 1.55109962824 2.2627964508 2.85768966549 -2.35390666569 12.7951704538 -1.60442009188 1.51515618987 -4.74570318717 21.9932471613 1.18634544608 -0.0730763229157 -2.337770607 22.0759417168 -0.972908255325 -0.305347009149 -7.64541561738 18.158992172 -0.488966743762 -0.349721245892 -13.5810427574 14.7653490661 0.0818472431677 0.0959678140037 1 4 1 6 1 4 2 3 2 0 24.0 1.5 17.0 0.411764705882 0.284722222222 0.239583333333 0.102358217593 0.046802662037 0.0237991898148 0.0138861218349 -0.000348229727893 -0.00477062422275 -0.0380210260147 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.125 0.0 1.0 2.0 0.708333333333 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.65258238486 3.28920215723 -6.26145731546 7.61193178969 0.0530516476973 -0.371361533881 -7.21993621951 7.21993621951 -0.549510276766 0.231200390582 -8.72379683785 7.14824328457 0.195123086953 0.0436093276853 -7.8330481283 7.8330481283 0.193522077008 0.0452103376296 -5.85946236404 7.71636476612 -0.170251842194 -0.0286918366709 -8.19318242568 8.19318242568 -0.106804262725 0.0442191953409 3 2 3 4 2 5 3 4 4 4 3 3 4 3 5 3 3 3 4 3 4 4 3 4 2 6 91.0 0.538461538462 48.0 0.708333333333 0.232339089482 0.256128486898 0.0354180296216 0.196607884327 0.0610081863554 0.00371534676002 0.0160881569215 0.00459062344024 0.168793121162 0.571428571429 0.0 0.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 1.0 5.0 0.157894736842 0.0 2.0 1.0 0.527472527473 0.5 0.125 0.0 0.125 0.75 0.625 0.375 0.625 0.875 1.0 0.875 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -3.91766013765 1.27323954474 -7.87412750101 4.22864027088 1.86146810091 1.90435372963 -4.75771446011 12.1790795557 -1.8163534894 1.24424905175 -8.82784386355 19.3358628034 0.963874245855 0.112848254446 -7.055047805 20.2536096564 -0.502357758864 -0.384943034632 -8.28602508086 16.0035911381 -0.0831965768768 -0.504053190291 -9.51942084919 9.31007757922 0.110830143834 -0.155623189472 1 2 1 10 2 3 1 0 20.0 1.25 15.0 0.333333333333 0.29 0.275 0.092375 0.0595 0.02025 0.013022300884 0.000324229856737 -0.00580818657156 -0.0371075480866 0.0 0.25 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 2.0 3.0 0.125 0.0 1.0 3.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 1.52788745368 -4.7310360376 3.48612791164 0.162974661726 -0.305577490736 -5.0626514597 2.54877072447 -0.472626519006 -0.0366692988884 -6.73305960274 2.94722247195 -0.102999986211 0.860017289929 -8.2684834593 9.10869950911 -0.391519896952 0.581142871567 -13.9684578283 14.8564616744 -1.33703724075 0.0776262655572 -27.2225191069 16.9598678657 -0.125105122365 0.0834447728948 1 2 2 4 1 4 1 4 26 4 1 4 1 4 2 3 3 2 3 1 9 1 3 2 3 2 3 3 1 10 110.0 0.227272727273 50.0 0.8 0.156363636364 0.234710743802 0.0116333583772 0.501409466566 0.0494154770849 0.0014442096081 0.0292553711559 0.00490933009507 1.07706786688 1.6 195225785.909 2.0 2.0 2.0 2.0 4294967295.0 4294967292.0 4294967295.0 0.0 3.0 0.0 0.3125 2.0 4.0 0.0 0.454545454545 0.583333333333 0.333333333333 0.416666666667 0.416666666667 0.666666666667 0.333333333333 0.666666666667 0.75 0.583333333333 0.333333333333 0.75 0.583333333333 0.25 0.166666666667 0.333333333333 0.25 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 -3.5303460104 -0.925992396171 -6.27202644359 -0.365062538069 2.40836942811 3.36939743534 -3.3575784098 14.8759659604 -2.83731478332 3.20966042656 -6.95516382912 29.6699707775 3.17277143102 -1.47975235111 0.0939492728753 26.9429978601 -2.75384280986 1.28610868478 -6.22713442086 30.7583605486 1.92725773098 -0.603123406023 -3.82135898903 27.2333175835 -0.502227030259 -0.194236960506 0 12 1 3 2 2 2 1 1 0 24.0 0.666666666667 18.0 0.277777777778 0.322916666667 0.236111111111 0.0572193287037 0.0969328703704 0.0383391203704 0.0026812458554 0.00605895116658 -0.00158241494724 0.00177683295787 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.111111111111 0.0 2.0 1.0 0.75 1.0 1.0 0.5 0.0 1.0 1.0 0.5 0.0 1.0 1.0 0.5 0.0 1.0 1.0 0.5 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.59154943092 2.65258238486 -3.82102624383 6.5261401122 -0.0530516476973 0.229890473355 -4.75378836583 7.7594704418 -0.524621849451 0.0465020615618 -7.72154556306 7.68258301763 -0.566266301296 0.0945141665938 -11.3430948943 7.6973138577 0.168160624028 -0.163248434427 -10.428732151 6.90988861359 0.185938505284 0.202363681378 -7.71102315829 8.53540969049 0.0757438929079 0.019023866075 1 2 1 12 16.0 1.0 14.0 0.142857142857 0.328125 0.375 0.075927734375 0.078125 0.017578125 0.00418853759766 -0.0029296875 0.00164794921875 -0.046875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 2.0 0.875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.954929658551 0.954929658551 -2.2648145447 2.2648145447 0.119366207319 -0.119366207319 -1.41550909044 1.41550909044 0.566989484765 -0.566989484765 1.8165699994 -1.8165699994 0.136152080223 -0.136152080223 2.72043153319 -2.72043153319 -0.380013511582 0.380013511582 -0.644720156036 0.644720156036 -0.278074304257 0.278074304257 -3.49283318954 3.49283318954 0.0620657855579 -0.0620657855579 2 1 3 2 3 2 3 3 1 10 30.0 0.833333333333 18.0 0.555555555556 0.226666666667 0.333333333333 0.054962962963 0.135555555556 0.0544444444444 0.0101718615535 0.00177164580329 0.00810088424557 0.058667171715 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.2 0.0 2.0 1.0 0.6 0.25 0.5 0.5 0.75 0.75 1.0 1.0 1.0 0.5 0.5 0.75 1.0 0.0 0.0 0.25 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.33427249868 -0.212206590789 -5.0631650699 0.258526102793 0.866510245723 1.07871683651 -1.99898240538 3.39188816929 0.524294370144 -0.445699336519 1.86458821124 1.49474531281 0.0728595974334 -0.459294276073 2.43272187009 -1.82158384311 -0.207760604367 0.147113256082 0.745516422045 -1.71209578567 -0.0587900108201 -0.119836853537 0.0974264172676 -2.2483167453 0.0215396971957 0.0133570118753 2 3 2 6 2 5 3 4 3 4 3 3 4 3 4 3 4 4 3 4 3 4 2 5 1 7 2 1 4 0 98.0 0.5 56.0 0.625 0.253644314869 0.260932944606 0.0350959209173 0.198896718204 0.0510586575322 0.00311448752858 0.00763319689349 0.00179667044755 0.164269843525 0.428571428571 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 6.0 5.0 0.0454545454545 0.0 7.0 1.0 0.571428571429 0.375 0.0 0.0 0.375 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.63782727067 2.41006056682 -6.72670100521 7.73408730002 2.5316308149 2.76154706651 -1.34503625875 16.7928529177 -1.67796866164 -0.394480682489 -3.2187684953 16.578890707 1.58115996766 -0.237484419257 1.57401139809 11.3140542052 -0.706713207525 -1.08308264832 0.265701344787 3.00055666833 0.00473519703292 -0.125302158519 -1.79873672732 -1.98222738069 0.0316145905718 -0.175239256008 0 4 1 9 3 1 2 0 20.0 1.25 14.0 0.428571428571 0.24 0.2 0.083 0.043 0.022 0.0144897204942 0.0010733126292 -0.00040249223595 -0.0149369340897 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.142857142857 0.0 2.0 1.0 0.7 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.52788745368 2.419155135 -3.47110776648 5.7873636692 0.183346494442 0.0967662053999 -3.92871601569 7.43119582105 -0.745609077397 0.854598382426 -7.25047014608 12.0186043639 -0.275590152979 1.08504455411 -10.0483085322 22.6022571185 -0.287840632351 1.61526501477 -14.7682740028 36.1055758719 -1.12989988772 0.432627726006 -25.7896889721 45.8513679085 -0.11096141837 0.363635439259 1 5 3 5 4 4 4 3 6 2 5 4 4 4 4 4 4 4 4 4 3 6 1 8 1 3 1 1 2 0 104.0 0.615384615385 57.0 0.561403508772 0.228365384615 0.270710059172 0.0379885923987 0.180839639281 0.0526392523896 0.00438689397695 0.00881344508385 0.0037181543329 0.127986399617 0.375 0.0769230769231 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 0.3 0.0 5.0 1.0 0.548076923077 0.25 0.0 0.0 0.5 0.75 0.375 0.5 0.875 1.0 0.875 1.0 1.0 1.0 1.0 1.0 0.875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.43575344098 -0.783532027529 -10.7235818453 0.0366472027602 2.93737579995 2.97185816359 -4.89419176246 10.8557007221 -2.30272267624 0.809813449131 -9.52565652632 16.2054221051 1.32162467359 -0.514037965066 -5.64621080052 14.3674737375 -0.138127969891 0.648436850118 -4.84039950125 18.9657045932 -0.662601208859 0.546311084119 -10.0116244018 25.2859996091 0.147390720666 0.049301930669 1 3 2 2 4 1 6 1 4 1 0 24.0 1.5 16.0 0.5 0.291666666667 0.291666666667 0.115451388889 0.0543981481481 0.0364583333333 0.0135551190193 -0.000354382196583 -0.00242161167665 -0.0514838580036 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.25 0.0 1.0 2.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.22816920329 2.44037579408 -5.43035125486 5.48272420492 -0.0884194128288 -0.58356812467 -5.88359755997 3.76312802213 0.186663204861 -0.125097095187 -4.490378963 2.35096660562 0.0489945429523 0.0800686905061 -3.55670414315 1.85143912769 0.0933134091356 -0.400307065941 -3.23816855131 -0.228048746732 -0.246741844226 0.387890142226 -5.61821286495 3.43482566358 -0.0424478071223 0.121107460341 0 4 1 5 1 4 1 4 1 3 3 2 2 3 3 2 3 2 3 2 2 4 1 4 60.0 0.416666666667 39.0 0.512820512821 0.293333333333 0.273611111111 0.0319259259259 0.246717592593 0.0516851851852 0.00190047133416 0.0101783755541 -0.000714669025695 0.257896243194 0.6 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.125 0.0 6.0 1.0 0.65 0.833333333333 0.5 0.333333333333 0.166666666667 1.0 1.0 0.833333333333 0.666666666667 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 0.5 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.12206590789 2.65258238486 -3.67541523113 7.05398452846 1.74186243273 1.11629508696 -0.222896034684 12.026367209 -1.37594524232 0.691441855067 -2.50103608694 15.1813115755 1.02604994857 -0.269226828588 -0.988520011788 12.383950463 -0.90342548916 -0.887587679687 -3.59658285751 3.751794332 0.442813915732 -0.58200501145 -3.18150586958 -3.77194496028 -0.0484587461189 -0.0693104207461 1 0 3 1 8 1 2 1 0 16.0 1.0 13.0 0.230769230769 0.28125 0.28125 0.0693359375 0.0693359375 0.0263671875 0.00714111328125 -0.00091552734375 -0.00091552734375 -0.0173034667969 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 2.0 2.0 0.8125 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 2 4 3 5 3 5 4 4 4 4 4 4 4 4 4 4 5 3 5 3 4 4 3 6 1 8 1 1 1 4 1 0 112.0 0.571428571429 63.0 0.52380952381 0.245535714286 0.276147959184 0.037775601312 0.195232068832 0.056000022777 0.00351611447162 0.0102347484565 0.00342483723449 0.149372221236 0.25 0.0714285714286 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 0.190476190476 0.0 4.0 1.0 0.5625 0.25 0.0 0.0 0.375 0.75 0.5 0.25 0.625 1.0 1.0 0.75 0.875 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.09295817894 0.2728370453 -10.1736073275 2.00514919916 2.56875150133 2.29127437023 -5.23871582707 11.9328439555 -2.04254683198 1.92537046108 -9.01284733768 22.169323282 1.26479810584 -0.333691838265 -5.59682442293 20.6624881287 -0.25394231332 -0.629887948472 -3.72736528948 14.707477253 0.139292979808 0.0163444011354 -3.31687273134 13.4084684574 0.0407616830053 0.0213780069877 1 0 15 15.0 1.66666666667 15.0 0.0 0.4 0.333333333333 0.133333333333 0.0444444444444 0.0 0.0 0.0 0.0 -0.100984454657 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.01859163579 2.54647908947 -2.58889404631 5.8086513256 -0.162974661726 -0.448180319747 -2.9054930991 4.68295225525 0.399287921229 -0.118156629751 -0.408453277421 2.4344675688 0.346810080153 -0.557373343103 2.31092165013 -2.28916478643 -0.00232858196674 -0.618801752601 2.42443970429 -7.10236541209 -0.179043285398 0.344005455719 0.518053316917 -4.33721095361 -0.0269431915177 0.117790654279 3 1 6 4 3 5 4 3 5 3 5 3 5 3 5 4 4 4 4 4 4 4 4 5 1 8 104.0 0.615384615385 51.0 0.647058823529 0.206730769231 0.262573964497 0.0365697542103 0.185209056384 0.0601779415112 0.00506849503041 0.0150073939049 0.00650867783596 0.150332349106 0.25 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.1 0.0 5.0 1.0 0.490384615385 0.125 0.0 0.0 0.25 0.5 0.5 0.5 0.625 0.875 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -5.04398742722 4.24073957528e-16 -9.29577443624 2.11228612952 3.53777460211 3.12949182593 -2.21260235155 13.0376041263 -3.01543477698 0.638655005108 -10.0597574549 19.7193750757 1.06909880089 0.631479242968 -8.96166326113 21.9660695607 -0.0955692997821 -0.508263034736 -6.94921666963 19.5444598225 -0.26258563427 0.100499114965 -9.11101550994 18.0608345291 0.104245644917 -0.0257550826183 1 0 3 1 10 2 1 3 0 20.0 0.8 14.0 0.357142857143 0.2 0.22 0.053 0.0745 0.0085 0.0116722748425 -0.0065293184943 0.00120747670785 0.0272912096654 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.125 0.0 3.0 2.0 0.7 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.78253536263 2.29183118052 -4.56965574513 5.28192369334 -0.499109901536 -0.275019741663 -7.24078586886 5.11774022527 -0.804687392273 0.33613523981 -12.8162402555 6.09549895583 -1.38308446674 0.178701716583 -23.6178748527 8.14499648239 -1.05489130814 0.500100787479 -34.7540982998 14.7090017368 -0.797842612936 1.28130619074 -45.6157527071 27.4293956411 -0.324244377768 0.0952554767834 0 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 3 4 2 13 2 2 3 0 91.0 0.538461538462 50.0 0.56 0.233908948195 0.265426880811 0.0353861812623 0.199556511596 0.0577065731033 0.004052546897 0.0110684572217 0.00481251600127 0.164418306176 0.285714285714 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.05 0.0 6.0 1.0 0.549450549451 0.375 0.0 0.0 0.375 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.875 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.72177713076 -0.489707517206 -6.92408443915 0.882276593939 2.5545925868 3.01010750813 -1.3577150536 10.8326307197 -1.58051339424 0.0263397180747 -2.87883496206 13.202429091 1.46488886413 -0.290471458728 1.06807849917 9.60746380816 -0.837138500267 -0.414613395429 -1.35806208894 5.97002164969 0.0110812593624 -0.137327518352 -3.50458443594 2.05284485455 0.0700165507288 -0.210833298469 0 4 1 9 1 4 1 0 20.0 1.25 17.0 0.176470588235 0.28 0.3125 0.082 0.064375 0.0125 0.0085865010336 -0.00240377307581 -0.0022360679775 -0.0370488513022 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.125 0.0 1.0 2.0 0.85 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.03718327158 2.16450722605 -4.7310360376 5.39598722874 0.162974661726 0.331042281631 -5.0626514597 7.32341901722 -0.472626519006 0.599950473479 -6.73305960274 11.8598992851 -0.102999986211 1.4966370623 -8.2684834593 23.4326443874 -0.391519896952 1.21776264393 -13.9684578283 35.8649141625 -1.33703724075 0.714246037925 -27.2225191069 45.9260675085 -0.125105122365 0.279469909395 0 4 2 5 2 4 2 4 3 3 2 4 2 4 3 3 3 3 3 3 2 4 1 12 1 1 4 0 84.0 0.428571428571 54.0 0.537037037037 0.263888888889 0.292517006803 0.0298209561602 0.238270705107 0.0475245653817 0.00232099625593 0.00224156282909 0.00176306003847 0.258299375905 0.5 0.0 1.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.0526315789474 0.0 2.0 1.0 0.642857142857 0.75 0.375 0.125 0.625 1.0 0.875 0.625 0.875 1.0 1.0 1.0 1.0 0.875 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.04708283862 2.22816920329 -7.70148631193 6.90471499405 2.6193284366 2.42166078133 -1.68549235283 16.2490747715 -1.45163663957 0.65975391445 -3.43399652431 19.4396699393 0.894681255809 -0.765029412224 -2.53849978098 14.9855531755 -0.819706654409 0.182212093211 -6.27504997189 15.8696162159 -0.151667630757 0.540134125949 -10.0139182063 19.698242049 -0.0010502297608 -0.157596860286 1 0 3 1 11 1 0 16.0 1.0 14.0 0.142857142857 0.28125 0.328125 0.0693359375 0.075927734375 0.01318359375 0.00714111328125 -0.00462341308594 -0.000457763671875 -0.0167770385742 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 2.0 2.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 4 1 5 2 2 5 3 4 4 3 4 3 4 4 3 3 3 5 3 4 2 5 2 5 1 7 1 5 1 0 98.0 0.5 56.0 0.589285714286 0.243440233236 0.310495626822 0.0335712585742 0.231383182177 0.0590442757694 0.00323711622027 0.00574927183653 0.00294264177008 0.236219460873 0.571428571429 0.0 1.0 2.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 4.0 0.130434782609 0.0 6.0 1.0 0.571428571429 0.375 0.125 0.125 0.5 0.5 0.625 0.625 0.875 0.625 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -5.18390386071 -1.22776670385 -10.1595605 -1.00523607757 2.96640685477 2.94622248152 -3.51673488105 9.34817249744 -1.70348439878 0.646432606888 -5.378788462 14.5798203476 1.31159524818 -0.374864948035 -1.10203437041 11.0953700485 -0.187410918597 -0.615814895572 0.157379835827 4.81010136896 -0.300925409949 -0.492127113857 -3.09659765419 -2.29649028455 0.0621838167003 -0.161671552159 3 1 2 9 1 4 2 2 1 0 25.0 1.0 16.0 0.5625 0.304 0.272 0.086784 0.073216 0.045312 0.008598528 0.001001472 -0.002052096 -0.032582656 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.25 0.0 1.0 3.0 0.64 0.25 0.75 0.75 0.25 0.5 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.75 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 2.03718327158 -3.02104587806 5.0709220031 0.101859163579 0.203718327158 -2.51655645052 5.59137063809 0.352432705983 -0.505221451351 -0.23098292518 2.14420064189 0.193287948807 -0.559980937691 1.70044668652 -2.80737979404 0.137685557517 -0.405371439402 2.6987743889 -6.41478982837 -0.148953364869 0.158242920587 1.00950999865 -4.56120736794 -0.0696850032198 0.141535842604 1 3 2 4 3 4 3 4 1 4 3 3 2 3 4 2 4 2 4 4 1 11 1 2 3 0 78.0 0.461538461538 46.0 0.630434782609 0.252136752137 0.275147928994 0.033117550869 0.225022758307 0.0524199666212 0.00371284747742 0.00663709417736 0.00291858149963 0.224316108504 1.0 0.0 1.0 3.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 6.0 0.190476190476 0.0 6.0 1.0 0.589743589744 0.5 0.25 0.125 0.5 0.875 0.75 0.625 0.875 1.0 1.0 1.0 0.875 0.75 0.875 0.625 0.75 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.42795262044 1.56706405506 -6.62725800246 4.97169763623 1.92695561504 1.81742340113 -3.16831694586 11.6443273871 -1.5630141648 0.351644323689 -4.93885474064 14.7230224335 1.42282443852 0.343756098705 -2.52277887278 17.4629946223 -1.38868126768 0.503485509741 -7.4050256175 21.4804698471 0.354921836581 0.065338954871 -11.4253723729 23.1309369429 -0.277297013737 0.0510395539037 1 1 11 12.0 0.75 11.0 0.0909090909091 0.333333333333 0.375 0.0555555555556 0.104166666667 0.0 0.0 0.0 0.0 0.00902109795609 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.916666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.954929658551 0.954929658551 -1.92840577722 2.36543880901 0.537147932935 0.0596831036595 -0.344024489088 2.35312830674 -0.0969850434466 -0.350638233999 -0.587366485421 0.280296469051 -0.224821899592 -0.162962849445 -1.24516622196 -1.12973102546 0.497232914554 0.0403035802544 2.30897772327 -1.08312211621 0.0603916219494 -0.0299198713322 2.80519373384 -1.41966315186 -0.130238604088 -0.0231516011899 2 1 3 5 1 5 1 5 2 3 3 3 3 4 2 4 2 4 2 4 2 4 2 4 1 6 2 2 2 0 84.0 0.428571428571 54.0 0.555555555556 0.246031746032 0.305272108844 0.0264955188425 0.235927208185 0.0480509664183 0.00219354248895 0.00433925749053 0.00127870153643 0.282383272714 0.333333333333 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 5.0 0.210526315789 0.0 6.0 1.0 0.642857142857 0.75 0.625 0.5 0.625 0.875 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -5.45674090601 2.91026181654 -10.0868034531 9.07154007634 3.87539966386 3.0773049055 -1.53514459785 19.9314896447 -2.57109995292 0.0671202615955 -6.24327961912 21.4010036334 1.48550385476 -0.376582870473 -2.85728694181 17.7251354582 -0.510048822073 -0.213573483998 -4.40685682837 14.4385308175 -0.708066274779 -0.287711873752 -10.9311787383 11.8124636724 0.160565818481 0.0435118763003 0 4 1 4 1 5 1 3 1 0 20.0 1.25 16.0 0.25 0.28 0.2875 0.082 0.061375 0.0295 0.0085865010336 0.000816164811787 8.94427191e-05 -0.0355283250775 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.142857142857 0.0 1.0 2.0 0.8 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -2.03718327158 1.9098593171 -4.9402776725 4.74047875555 -0.0814873308631 0.320856365273 -5.63020925653 6.98455135323 -0.0814873308631 0.932011346746 -5.77662933638 12.9756750652 -0.209259465656 1.3678055922 -7.96050763114 23.7101192784 -0.662668012551 0.973607695608 -15.3283376433 34.4444303466 -1.07457283234 0.901209292136 -26.8374460796 45.9117274878 -0.125256674196 0.309243779062 0 4 2 4 2 4 2 4 3 3 2 4 3 3 3 3 3 3 3 3 3 3 2 5 1 6 2 2 2 0 84.0 0.428571428571 51.0 0.450980392157 0.190476190476 0.279761904762 0.0201652089407 0.242689436886 0.0437925170068 0.00220777852991 0.0104344044028 0.00364491738429 0.320453987725 0.333333333333 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 7.0 0.111111111111 0.0 4.0 1.0 0.607142857143 1.0 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.75 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 -6.45714340544 1.54607659004 -11.8105868758 5.43416973671 4.74309570929 2.69032174941 -1.14203596338 15.7842788565 -2.89770517618 0.902847062787 -5.48948128736 20.8353078446 1.76785172317 -0.591565621442 -3.12135292481 16.9029306822 -1.18468730188 -0.297583401167 -6.07860071629 13.4070360648 0.155634623236 0.144105986834 -9.33182252173 14.5575839476 -0.0159551206671 0.0713779124358 1 1 2 1 8 1 2 1 0 16.0 1.0 12.0 0.333333333333 0.28125 0.28125 0.0693359375 0.0693359375 0.0263671875 0.00714111328125 -0.00091552734375 -0.00091552734375 -0.0173034667969 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 2.0 2.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 2 4 1 11 1 4 2 4 2 4 2 4 1 4 2 3 3 11 1 3 3 0 72.0 0.5 52.0 0.384615384615 0.280092592593 0.321759259259 0.0365842549726 0.1999635631 0.0177094050069 0.00352593140368 -0.00581787934685 -0.00302323930566 0.175637733492 0.666666666667 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 4.0 3.0 0.142857142857 0.0 4.0 1.0 0.722222222222 0.5 0.666666666667 0.5 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.5 1.0 -6.20704278058 3.02394391875 -11.9157561893 7.84132010457 4.04739862224 1.07208538055 -1.59272270009 13.0260147021 -1.63446968756 0.568278934535 -3.43538955857 12.9116401951 0.417199113777 -1.52187039097 -4.29200823124 5.89843599665 0.112919988946 0.550425591378 -0.893384597019 3.35529168132 0.317250839246 -1.37023258707 1.63087647814 -7.74438309478 0.0301688901393 -0.183153050867 1 1 9 1 3 1 0 15.0 1.66666666667 12.0 0.25 0.346666666667 0.244444444444 0.128592592593 0.0397037037037 0.013037037037 0.00852757617101 0.000265211699098 -0.00738512577489 -0.0543071956154 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.142857142857 0.0 1.0 3.0 0.8 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.27323954474 2.54647908947 -2.89447153704 5.8086513256 0.224090159873 -0.448180319747 -2.38601136485 4.68295225525 0.0590783148757 -0.118156629751 -0.876190556575 2.4344675688 0.497724616912 -0.557373343103 2.40318160613 -2.28916478643 0.071087591749 -0.618801752601 2.83768060339 -7.10236541209 -0.394895741057 0.344005455719 -0.197399779149 -4.33721095361 0.0395438085101 0.117790654279 1 6 2 6 3 5 3 4 5 3 4 5 3 5 3 5 3 5 3 5 3 5 1 15 4 1 4 0 112.0 0.571428571429 70.0 0.5 0.290178571429 0.286989795918 0.0440392674927 0.177133632471 0.0482587008017 0.00305515481601 0.00164339380972 -0.000174983267634 0.0928656580176 0.375 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 2.0 0.25 0.0 7.0 1.0 0.625 0.25 0.0 0.0 0.5 0.75 0.375 0.5 0.75 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.13802852039 2.13722352152 -8.42689152913 7.23876914669 2.06901426019 3.25223614032 -3.16535838868 19.4643152384 -0.71730991755 0.752271543652 -3.0892782128 23.542028241 0.472398951341 -0.904794072552 -1.28398257375 18.1157870235 0.00580934905196 0.167283244528 -3.0152505874 18.2542076085 -1.17354693129 0.388624706461 -11.4465643117 20.4131209651 0.1933600438 -0.206149643516 1 1 4 1 11 2 4 1 0 24.0 1.5 19.0 0.263157894737 0.3125 0.291666666667 0.105251736111 0.0509259259259 0.0217013888889 0.00913641600566 -0.000147659248576 -0.00391297008727 -0.0581285241896 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 0.125 0.0 1.0 2.0 0.791666666667 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 3.18309886184 -6.18643095578 7.53690543001 -0.141471060526 -0.176838825658 -7.38666146325 7.38666146325 -0.298661127777 -0.0196487584064 -8.46552708529 6.88997353201 -0.0714632620559 0.310195676694 -8.14951734094 8.14951734094 0.434164787602 -0.195432372964 -5.54497858833 7.40188099041 -0.349648173425 0.150704494561 -8.43315712577 8.43315712577 -0.0773351251329 0.0147500577486 0 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 5 66.0 0.545454545455 38.0 0.578947368421 0.270202020202 0.256198347107 0.0398370759941 0.190959178562 0.0584147257701 0.00259352676778 0.0122480559462 0.00149883733865 0.132325991765 0.166666666667 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 4.0 0.0 0.0 6.0 1.0 0.575757575758 0.5 0.0 0.0 0.0 0.833333333333 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.85198479234 0.81024334665 -3.23579678927 2.55032035572 1.52865273665 0.982432015359 -0.00251889167164 6.65183079047 -1.13932293044 0.590145434029 -2.16525530594 9.68472609906 0.805714620927 -0.27687428036 0.309358050392 6.90790200796 -0.175417941495 -0.889835211474 0.57849311715 -1.97457150799 -0.118457306458 -0.734523965044 -0.205745489282 -10.5072551992 0.0902070324831 -0.0260913045306 1 1 3 1 5 1 4 1 3 1 0 20.0 1.25 15.0 0.333333333333 0.32 0.275 0.092 0.0595 0.032 0.0075131884044 -0.0005366563146 -0.0032199378876 -0.0491823151651 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 2.0 0.285714285714 0.0 1.0 2.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.29183118052 -4.38939001676 5.56681023916 -0.1935324108 0.152788745368 -5.57512049096 7.06718450159 -0.217978610059 0.727274427953 -6.41418998329 12.0193340948 -0.133557735285 1.48135818776 -8.08399460805 23.524888813 -0.554087122024 1.1364790314 -14.5877937349 35.5552462092 -1.13030388235 0.817612717125 -26.6305695453 46.2220422892 -0.155106319778 0.264469310689 0 5 3 4 3 4 4 4 3 3 4 3 4 3 4 3 4 4 2 5 2 13 84.0 0.583333333333 51.0 0.490196078431 0.256802721088 0.301587301587 0.0396201139186 0.20433808444 0.0583225353634 0.00394976940308 0.00794509589045 0.0039335303231 0.154935199277 0.428571428571 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 5.0 2.0 0.0 0.0 6.0 1.0 0.607142857143 0.666666666667 0.166666666667 0.0 0.0 1.0 0.666666666667 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.81971863421 -0.636619772368 -7.19350082418 0.0444768537496 2.48458550049 2.41827094087 -2.07317874604 8.88935053288 -1.7933176188 0.832554735101 -4.89512462817 14.9424352215 1.34178946332 -0.0710694767176 -1.17654778553 12.9384953327 -0.433278273118 -1.04757671161 -0.406826812623 3.35772505709 0.171906340881 -0.611869902135 -0.549123385571 -3.63408123988 0.0366220171781 0.0737270671483 1 3 1 3 4 1 12 1 4 1 0 30.0 1.2 21.0 0.428571428571 0.294444444444 0.333333333333 0.0948518518519 0.0696296296296 0.0407407407407 0.011996701811 -0.00307445912937 -0.000586040596508 -0.0503589192584 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.222222222222 0.0 1.0 1.0 0.7 0.25 0.75 1.0 0.75 0.5 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.22816920329 1.48544613552 -5.55282587735 3.19349420254 -0.221048532072 -0.654303654933 -6.0293555681 0.52285082512 0.631216363806 -0.59371998318 -1.87587223137 -2.58600105922 0.615090282109 0.379225585567 3.53168780197 -0.468932985394 0.377725775826 0.224289212712 6.9281335012 1.39688806063 -0.205561037129 -0.259973444311 4.26547522851 -0.532483876502 -0.18191436805 0.00260233510881 0 5 1 5 2 4 2 4 2 4 2 4 3 3 2 4 2 4 2 4 2 5 1 10 1 0 78.0 0.461538461538 56.0 0.392857142857 0.297008547009 0.335305719921 0.0314422866198 0.237992885922 0.0448886528768 0.00157977108427 -0.000619819410152 -0.000520268503625 0.239962529132 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.277777777778 0.0 5.0 1.0 0.717948717949 0.75 0.375 0.375 0.625 1.0 0.875 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.50530915829 1.07735653785 -8.55242215641 3.97785196926 2.89072319032 2.14138375867 -2.45054041535 12.0145709566 -2.12911749496 0.617788297064 -7.15065138769 16.1814193787 0.901243502379 -0.021466433261 -6.01529055702 16.6029409285 -0.318705754596 0.291959965473 -6.68462404372 18.5487989736 -0.42250436524 0.163803961604 -10.8547466442 21.1481250539 0.0556503311449 0.111986990216 1 1 4 2 10 2 4 1 0 24.0 1.5 18.0 0.333333333333 0.3125 0.28125 0.105251736111 0.0531684027778 0.0249565972222 0.00913641600566 -0.000609094400377 -0.00426366080264 -0.0569115658825 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 3.0 0.111111111111 0.0 1.0 2.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 3.18309886184 -6.18643095578 7.53690543001 -0.141471060526 -0.176838825658 -7.38666146325 7.38666146325 -0.298661127777 -0.0196487584064 -8.46552708529 6.88997353201 -0.0714632620559 0.310195676694 -8.14951734094 8.14951734094 0.434164787602 -0.195432372964 -5.54497858833 7.40188099041 -0.349648173425 0.150704494561 -8.43315712577 8.43315712577 -0.0773351251329 0.0147500577486 3 2 2 5 2 6 2 4 4 3 4 3 4 3 3 4 3 4 3 4 3 4 2 6 1 13 1 0 98.0 0.5 61.0 0.475409836066 0.233236151603 0.319241982507 0.0298600073099 0.235569363106 0.0460118658042 0.00287033407941 0.00344126519645 0.00215455102368 0.260685021655 0.428571428571 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 2.0 0.272727272727 0.0 5.0 1.0 0.622448979592 0.625 0.125 0.375 0.75 0.75 0.625 0.875 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -6.91187181428 -0.773038295018 -13.3976353991 -0.119531980438 3.99604189477 2.73695461174 -5.53700311686 10.1438074888 -3.15243641728 0.990921099615 -11.5514675447 15.8692006876 1.91558535885 -0.816530855842 -7.02727983491 10.807275977 -0.630554569117 -0.373666739035 -6.53117987468 5.44942273376 -0.110249293918 -0.404859589983 -9.46631060088 -0.197617224522 0.122755517661 -0.180576397136 1 1 3 1 10 1 3 1 0 20.0 1.25 16.0 0.25 0.32 0.3 0.092 0.058 0.024 0.0075131884044 -0.0012521980674 -0.0024149534157 -0.0540681236959 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 2.0 2.0 0.8 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.29183118052 -4.38939001676 5.56681023916 -0.1935324108 0.152788745368 -5.57512049096 7.06718450159 -0.217978610059 0.727274427953 -6.41418998329 12.0193340948 -0.133557735285 1.48135818776 -8.08399460805 23.524888813 -0.554087122024 1.1364790314 -14.5877937349 35.5552462092 -1.13030388235 0.817612717125 -26.6305695453 46.2220422892 -0.155106319778 0.264469310689 0 5 1 5 2 4 2 4 2 3 4 2 3 3 3 4 2 4 2 4 1 14 1 1 2 2 4 0 84.0 0.428571428571 55.0 0.490909090909 0.242063492063 0.296768707483 0.0276090594968 0.238802167692 0.0360146042544 0.00278090190313 -0.00135802538782 0.00168972338903 0.276156985917 0.5 0.0714285714286 1.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 1.0 4.0 0.111111111111 0.0 2.0 1.0 0.654761904762 0.75 0.375 0.5 0.875 1.0 0.875 1.0 0.875 1.0 1.0 1.0 0.875 1.0 0.625 0.875 0.875 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.41126806512 1.77344079445 -10.1003207406 6.51067299575 3.73016497818 3.05549650222 -1.74604037026 15.3341815444 -2.32429473594 -1.30125998126 -5.56408892954 12.2408659046 1.31174447834 0.661387752243 -3.70437228738 14.788698987 -0.822487158257 0.78003734418 -6.21222240304 21.2925630071 -0.012960755449 -0.321407189152 -7.65176273189 18.8109025187 0.114518464774 -0.0797185155078 1 1 4 1 5 1 11 1 0 24.0 1.5 20.0 0.2 0.3125 0.333333333333 0.105251736111 0.0543981481481 0.0173611111111 0.00913641600566 -0.00191957023149 -0.000295318497153 -0.0682874804916 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 1.0 0.222222222222 0.0 2.0 2.0 0.833333333333 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.54647908947 2.97089227105 -6.35837607185 7.02943223325 -0.353677651315 -0.141471060526 -7.94587493107 7.20025697397 -5.83101691602e-16 0.186008246247 -7.68499937212 7.67533395416 -0.0463565152033 0.238987120765 -7.47121211608 8.37561908256 0.0874733614981 -0.390573653212 -7.1281180257 6.25520037726 -0.178457355071 0.2740826603 -8.58653597285 8.38203084341 -0.00551450339207 0.0595519541236 4 2 2 5 1 6 2 5 3 4 3 4 3 4 3 4 4 3 3 4 3 4 2 6 1 6 2 4 1 0 98.0 0.5 61.0 0.524590163934 0.30029154519 0.298833819242 0.039877092028 0.212900237146 0.0586384074663 0.00215259285467 0.00621767725428 -0.000446615859202 0.163113612624 0.285714285714 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.210526315789 0.0 5.0 1.0 0.622448979592 0.5 0.125 0.0 0.25 0.75 0.625 0.375 0.75 0.75 1.0 0.875 1.0 0.875 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -3.2740445436 2.36458772594 -6.78695812666 7.50060486399 1.38645763836 2.89634155912 -3.91635434023 19.0496462941 -0.900157706933 1.18230333253 -5.2130866374 24.870496361 0.518632062843 -0.960142822009 -3.99820219037 18.0144767336 -0.250182679449 -0.895622978643 -5.41586134124 7.9444320843 -0.315653381362 -0.598071771858 -6.78452469865 -0.716280978839 0.223882278053 -0.213469003767 1 0 15 1 0 16.0 1.0 15.0 0.0666666666667 0.328125 0.328125 0.075927734375 0.075927734375 -0.002197265625 0.00418853759766 -0.00313568115234 -0.00313568115234 -0.042594909668 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.9375 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 3 1 3 4 1 6 1 4 3 3 3 3 3 3 3 3 4 2 3 4 2 4 2 4 1 5 1 5 2 1 1 1 1 0 90.0 0.4 53.0 0.584905660377 0.294444444444 0.283703703704 0.0340864197531 0.259891632373 0.0649835390947 0.00225671238673 0.00992323790119 0.00146826850811 0.278550067146 0.5 0.0666666666667 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 6.0 0.285714285714 0.0 5.0 1.0 0.588888888889 0.5 0.125 0.0 0.125 0.75 0.625 0.375 0.625 0.875 1.0 0.875 1.0 0.875 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -2.20694854421 2.80112699842 -4.80830232126 9.35004461435 0.611154981473 3.80161033846 -3.7858115472 22.1254271813 -0.455406871105 -0.35695977992 -4.27237365827 21.9086494306 0.243144334625 -0.674794947443 -4.35913915027 15.1302904052 -0.356679825071 -0.387496417552 -5.69749179709 11.3655320008 0.201172824507 0.151642312266 -4.67066526811 11.5772102295 0.0172121393797 -0.0418852520581 1 1 2 8 1 3 1 2 1 0 20.0 0.8 14.0 0.428571428571 0.275 0.29 0.0595 0.092375 0.04025 0.00717777820777 -0.000888837021056 -0.000570197334262 0.00978559248653 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.166666666667 0.0 2.0 1.0 0.7 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.65521140816 1.78253536263 -3.65695092206 4.38939001676 0.483831026999 0.1935324108 -2.29253620884 5.57512049096 -0.0906546555851 0.217978610059 -3.10665728167 6.41418998329 -0.844738415392 0.133557735285 -9.20094393474 8.08399460805 -0.499859259031 0.554087122024 -14.5467937211 14.5877937349 -0.180992944757 1.13030388235 -17.2558426465 26.6305695453 -0.0684441741886 0.155106319778 0 5 2 5 2 5 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 5 1 14 91.0 0.538461538462 55.0 0.4 0.235478806907 0.297548605241 0.0341440952478 0.224419464125 0.0556430648207 0.00372475725237 0.0096535676849 0.00483361011821 0.21475658591 0.285714285714 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 2.0 0.0 0.0 7.0 1.0 0.604395604396 0.75 0.0 0.0 0.625 0.875 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -5.19089968238 -1.37118104818 -10.5947544984 -1.86240226769 2.14775864943 2.3459597984 -7.97602900603 7.5145679994 -2.69930157821 1.52181913379 -14.4435764424 16.2527251464 1.47159184248 -0.401302448247 -12.2253015758 13.8003315462 -1.03033178644 -0.777299706112 -14.9432768244 5.41771583979 0.151695018535 -0.669124541059 -17.1026922491 -2.92332075415 -0.0257866540273 -0.105032940538 1 1 3 2 14 20.0 1.25 17.0 0.176470588235 0.36 0.3625 0.098 0.067375 0.0195 0.0042932505168 -0.00381249590164 0.0006260990337 -0.0896635308128 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.125 0.0 1.0 1.0 0.85 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.52788745368 2.16450722605 -4.04774399592 5.39598722874 -0.550039483326 0.331042281631 -6.08758952222 7.32341901722 0.0366692988884 0.599950473479 -6.09532036384 11.8598992851 -0.164115484358 1.4966370623 -7.89950575679 23.4326443874 -0.716654347096 1.21776264393 -15.2071296415 35.8649141625 -0.923570523952 0.714246037925 -26.0386199838 45.9260675085 -0.18510751719 0.279469909395 4 1 3 4 1 4 4 2 3 3 4 2 3 2 3 2 4 2 3 4 2 4 2 2 4 0 72.0 0.5 32.0 1.0 0.173611111111 0.208333333333 0.0294897762346 0.18325617284 0.0267168209877 0.00536253143351 0.000253858851699 -0.000137349005583 0.183449015264 0.666666666667 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.307692307692 0.0 1.0 1.0 0.444444444444 0.166666666667 0.166666666667 0.0 0.333333333333 0.5 0.5 0.333333333333 0.833333333333 0.666666666667 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.9788735773 2.28122085098 -7.65107631671 5.81538518375 2.50447986838 0.731670641159 -1.65302791378 9.89153749226 -1.15909253887 0.722562622939 -2.16737023225 10.5254489387 0.966447009119 -1.51360693961 0.463696911386 3.25712707863 -0.324766693622 0.281671326516 0.729636541252 -0.144764616136 -0.0102414863806 -0.851970636871 -1.04658109265 -6.23698349626 0.00190303085463 -0.0674870432345 0 12 12.0 0.75 12.0 0.0 0.333333333333 0.375 0.0555555555556 0.104166666667 0.0 0.0 0.0 0.0 0.00902109795609 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.954929658551 0.954929658551 -1.92840577722 2.36543880901 0.537147932935 0.0596831036595 -0.344024489088 2.35312830674 -0.0969850434466 -0.350638233999 -0.587366485421 0.280296469051 -0.224821899592 -0.162962849445 -1.24516622196 -1.12973102546 0.497232914554 0.0403035802544 2.30897772327 -1.08312211621 0.0603916219494 -0.0299198713322 2.80519373384 -1.41966315186 -0.130238604088 -0.0231516011899 1 3 1 4 1 4 2 3 3 2 2 3 2 3 2 3 2 3 2 3 2 14 65.0 0.384615384615 45.0 0.444444444444 0.273846153846 0.34201183432 0.0253582157487 0.30391989076 0.0474064633591 0.00152809611772 0.00133239214099 0.00144843177924 0.443027853021 0.4 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 1.0 0.166666666667 0.0 4.0 1.0 0.692307692308 0.75 0.375 0.5 0.75 1.0 0.875 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.875 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -3.91766013765 -0.0979415034412 -7.24620227197 1.27261724973 2.64731827053 2.35870957991 -2.1393881483 10.1149883023 -2.08086859074 0.792163334702 -4.85939938939 14.8279751284 2.01083506774 -0.576919669481 1.18537301327 10.9475355164 -0.979846898993 -0.453390643401 -0.455519632005 4.8123636806 0.243750001831 -0.676422014657 -1.28405302842 -2.93870880092 0.0605371113136 -0.104728014885 1 2 1 1 12 1 3 20.0 0.8 16.0 0.25 0.325 0.36 0.0655 0.098 0.033 0.00328701992692 -0.0015205262247 -0.00129691942695 -0.0151605408874 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 2.0 0.25 0.0 2.0 1.0 0.8 0.5 1.0 1.0 0.5 0.5 1.0 1.0 0.5 0.5 1.0 1.0 0.5 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.16450722605 1.52788745368 -5.39598722874 4.04774399592 -0.331042281631 0.550039483326 -7.32341901722 6.08758952222 -0.599950473479 -0.0366692988884 -11.8598992851 6.09532036384 -1.4966370623 0.164115484358 -23.4326443874 7.89950575679 -1.21776264393 0.716654347096 -35.8649141625 15.2071296415 -0.714246037925 0.923570523952 -45.9260675085 26.0386199838 -0.279469909395 0.18510751719 3 1 3 4 1 5 2 4 3 3 3 3 2 4 2 4 2 4 2 4 2 4 2 11 3 2 1 0 84.0 0.428571428571 53.0 0.584905660377 0.27380952381 0.311224489796 0.0305110139294 0.243096047943 0.053247489472 0.00204872758951 0.00394408462933 0.0010925284835 0.269469373375 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 5.0 0.3 0.0 5.0 1.0 0.630952380952 0.5 0.25 0.5 0.625 0.75 0.75 1.0 1.0 0.875 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 -4.27444704304 2.1826963624 -7.76333023432 7.38984153636 3.10607343748 3.29631695547 -1.64355325451 19.6523075828 -2.59952758065 0.657717958433 -7.12737735676 23.3519545088 1.61647670237 -0.910549875782 -3.26061041808 17.2977418066 -0.709152800207 -0.151044000221 -5.53708950546 13.9543411039 -0.461039338494 -0.0939578557905 -9.84890786733 12.1448311818 0.211872916998 -0.0727482292924 2 1 1 12 16.0 1.0 13.0 0.230769230769 0.3125 0.375 0.08203125 0.078125 0.0234375 0.005859375 -0.00390625 0.0 -0.03662109375 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 1.0 0.142857142857 0.0 2.0 1.0 0.8125 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.954929658551 0.954929658551 -2.2648145447 2.2648145447 0.119366207319 -0.119366207319 -1.41550909044 1.41550909044 0.566989484765 -0.566989484765 1.8165699994 -1.8165699994 0.136152080223 -0.136152080223 2.72043153319 -2.72043153319 -0.380013511582 0.380013511582 -0.644720156036 0.644720156036 -0.278074304257 0.278074304257 -3.49283318954 3.49283318954 0.0620657855579 -0.0620657855579 0 5 1 5 2 4 3 3 3 3 3 2 3 4 2 4 2 4 2 4 2 4 1 12 78.0 0.461538461538 54.0 0.425925925926 0.284188034188 0.337278106509 0.031922739763 0.255828655237 0.0459970667071 0.00191333269474 0.000187832591702 0.000423017937614 0.276589639797 0.5 0.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 4.0 2.0 0.1 0.0 3.0 1.0 0.692307692308 0.625 0.125 0.5 0.75 0.875 0.625 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.40736765485 -0.489707517206 -8.28150315838 0.555215181036 2.86348502073 2.68846529268 -2.74605532423 10.6169512931 -2.47033360843 1.10890521723 -8.31297907688 18.4500092308 1.38661041803 0.23442639047 -4.68376155119 19.7367534892 -0.341841307325 -0.318860728911 -5.44790639083 17.3448073554 -0.775744463649 0.0818043588669 -12.3198022323 18.4186532827 0.114511817895 0.178062285336 1 9 1 4 3 1 1 0 20.0 1.25 14.0 0.428571428571 0.33 0.2 0.111375 0.043 0.0315 0.00929924770143 0.00410318473871 -0.00211308423874 -0.0375771223619 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 2.0 0.25 0.0 1.0 2.0 0.7 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.01859163579 2.54647908947 -2.7878157248 6.05261531736 -0.52966765061 -0.0203718327158 -4.95365407821 7.09443384696 -0.236313259503 0.786352742828 -6.61273090718 12.0494162687 -0.336705651126 1.42293177153 -9.6793308297 23.1721769704 -0.612975082495 1.08111523501 -16.006945816 35.0456242123 -0.716433170923 0.972763734582 -24.605789849 46.8762246037 -0.170963813195 0.253004637981 0 4 2 4 2 4 3 4 2 3 3 3 3 4 2 4 2 4 2 4 1 5 1 11 1 0 78.0 0.461538461538 54.0 0.407407407407 0.245726495726 0.342209072978 0.0271940693538 0.246761155785 0.0452658507392 0.00229336607795 -0.000349027729678 0.00224464290812 0.306245446174 0.333333333333 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 2.0 2.0 0.166666666667 0.0 6.0 1.0 0.692307692308 0.875 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.625 0.75 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -6.12134396507 -0.293824510323 -11.9849873929 0.980161503462 3.50705921937 2.59226239581 -4.35700126669 10.5704233433 -2.31871305579 0.983485499892 -8.77403274011 18.0257072087 1.09056056719 0.454987493479 -6.54391819263 20.58921191 -0.185278931412 -0.286118864383 -6.34354253275 18.5071502964 -0.603971060601 -0.0393731448482 -10.8584190495 19.0133483976 0.172372593845 0.230228834112 1 2 1 12 16.0 1.0 14.0 0.142857142857 0.328125 0.375 0.075927734375 0.078125 0.017578125 0.00418853759766 -0.0029296875 0.00164794921875 -0.046875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 2.0 0.875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.954929658551 0.954929658551 -2.2648145447 2.2648145447 0.119366207319 -0.119366207319 -1.41550909044 1.41550909044 0.566989484765 -0.566989484765 1.8165699994 -1.8165699994 0.136152080223 -0.136152080223 2.72043153319 -2.72043153319 -0.380013511582 0.380013511582 -0.644720156036 0.644720156036 -0.278074304257 0.278074304257 -3.49283318954 3.49283318954 0.0620657855579 -0.0620657855579 1 3 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 2 12 2 3 1 0 84.0 0.428571428571 50.0 0.48 0.208333333333 0.300170068027 0.0229237528345 0.264960249973 0.0497094671202 0.00269641047406 0.0103106060725 0.00469816964763 0.353112947152 0.166666666667 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 6.0 0.0 0.0 6.0 1.0 0.595238095238 0.625 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.75 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -5.63863226954 -0.636619772368 -9.81328529528 0.495128580713 4.7737202756 3.20815532518 0.96502986775 12.7195545637 -3.02219204962 1.31670483829 -4.2817001905 20.3629397548 1.65451390721 -0.73671643385 -3.05582962936 16.4644975822 -1.31223799303 -0.0741737193321 -7.0807522769 14.4780460705 0.184384206379 0.201483514846 -10.2315359471 16.1191949204 -0.011026255579 0.0221671091723 1 2 2 4 1 9 1 0 20.0 1.25 15.0 0.333333333333 0.25 0.325 0.079375 0.0655 0.02875 0.0127875137463 -0.00273918327244 0.00299074091991 -0.0243843212946 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 1.0 0.25 0.0 2.0 2.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 1.27323954474 -4.9402776725 2.83061943845 -0.0814873308631 -0.315763407094 -5.63020925653 2.20990306047 -0.0814873308631 0.295391574379 -5.77662933638 4.06299825203 -0.209259465656 0.731185819834 -7.96050763114 9.3861744001 -0.662668012551 0.33698792324 -15.3283376433 13.4359778584 -1.07457283234 0.264589519768 -26.8374460796 16.9455278451 -0.125256674196 0.113218642561 1 3 1 4 1 5 1 3 2 3 2 4 1 4 2 3 2 3 1 4 1 4 1 5 1 1 2 0 65.0 0.384615384615 46.0 0.413043478261 0.32 0.317159763314 0.0311479289941 0.253968138371 0.0492781065089 0.00152892993548 -0.00207407303844 -0.000291134419358 0.287396539413 0.6 0.0769230769231 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 7.0 5.0 0.047619047619 0.0 4.0 2.0 0.707692307692 0.75 0.5 0.25 0.5 1.0 1.0 0.75 0.875 1.0 1.0 1.0 0.875 0.625 0.75 1.0 0.75 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -2.74236209635 2.64442059291 -5.64906598204 7.41891705533 1.27034186712 1.56126869983 -2.59631267497 12.848886454 -0.605912962642 -0.335509917551 -3.55834284141 10.5247176787 0.161835066612 -0.811468476456 -2.53966854109 5.20525285715 0.528146277465 0.311816370095 1.15890821086 6.03475100407 -0.273574523836 -0.0589831966181 0.381325871968 4.42790698774 0.0471586816938 -0.238645653304 1 4 1 11 2 1 1 1 2 0 24.0 1.5 17.0 0.411764705882 0.270833333333 0.229166666667 0.106987847222 0.0413773148148 0.01953125 0.0175751420618 -0.000398679971156 -0.0021779739165 -0.0321847942147 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 4.0 3.0 0.1 0.0 1.0 3.0 0.708333333333 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.33427249868 3.39530545263 -5.75816519441 7.77969583004 -0.318309886184 -0.495148711841 -7.77914968734 7.03353173024 -0.41000409208 0.277702452144 -8.73104590132 7.14582693008 0.339596041124 0.0917669790759 -7.15474290344 8.05914986992 -0.033803141777 -0.0305647352989 -6.51415060038 7.49813535401 -0.098532863272 -0.00478551036358 -8.34656127276 8.14205614332 -0.0662761746765 0.0577285580238 4 2 3 6 2 5 4 5 4 4 4 4 4 3 5 3 5 3 5 4 3 5 2 6 1 16 112.0 0.571428571429 66.0 0.530303030303 0.28125 0.307397959184 0.0461575255102 0.212187386115 0.0584741709184 0.00379651814407 0.00437398598677 0.00178795773707 0.150678392494 0.5 0.0 1.0 1.0 0.0 2.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0952380952381 0.0 6.0 1.0 0.589285714286 0.25 0.0 0.0 0.375 0.625 0.125 0.0 0.625 0.75 0.625 0.5 0.875 0.875 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -3.36499022537 -0.2728370453 -7.5225738376 1.18093885589 0.613419343345 2.94274241717 -7.13479996058 12.9140526956 -0.654744515693 1.85184877498 -6.91453386855 24.8628617364 0.957415418804 0.562936427308 -3.82210398813 28.4688560676 -0.625404069043 -0.667157469932 -4.45442521954 22.1054110932 0.583025550937 -0.780172362781 -2.43756640741 12.5123140563 -0.120076369769 -0.112282284697 1 1 3 3 11 1 5 2 1 3 0 30.0 1.2 20.0 0.5 0.294444444444 0.24 0.0992962962963 0.052 0.0382222222222 0.0162161941058 8.92584908527e-05 0.000984548202133 -0.0377563416307 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 5.0 0.0 0.0 2.0 2.0 0.666666666667 0.5 0.75 0.75 0.25 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.75 1.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.37934284013 2.54647908947 -3.32859183119 5.30041925104 0.0265258238486 -1.20250401447 -3.07331728395 1.57060680055 0.374472587295 -0.200417335745 -0.656882475279 -1.41949253294 0.243283012505 -0.263202396172 1.77373781101 -2.64195162153 0.225857247309 0.210796610441 3.67872330903 -0.937650644189 -0.0879202027167 0.20980802386 2.33000290228 0.445004661635 -0.119277075179 -0.0860136065501 1 3 1 10 1 4 2 3 2 3 1 4 1 4 1 4 1 4 1 14 65.0 0.384615384615 53.0 0.22641509434 0.381538461538 0.389349112426 0.0320582612654 0.275444697315 0.0339335457442 0.000221920596803 -0.0114258534036 -0.00290347156423 0.334810224429 0.4 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 2.0 0.05 0.0 2.0 1.0 0.815384615385 0.75 0.25 0.5 0.75 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -2.84030359979 1.46912255162 -5.78048886855 4.99352378524 1.33409077468 2.24280247525 -2.94901522018 13.3479709996 -0.776670189765 0.510419911057 -3.20580316743 16.5634537313 0.916431995996 -0.411545501723 0.540386770007 12.9584186673 -0.225006689651 -0.645107451039 -0.0268191051256 5.04597874582 -0.306032696767 -0.975906294466 -1.74081904788 -5.75164537713 0.166571036879 -0.111421696678 1 0 3 1 7 2 1 2 0 16.0 1.0 11.0 0.454545454545 0.203125 0.203125 0.056396484375 0.056396484375 0.017333984375 0.0109634399414 -0.000511169433594 -0.000511169433594 0.00818634033203 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 2.0 2.0 0.6875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.11408460164 1.11408460164 -2.43362385398 2.43362385398 0.377992989843 -0.377992989843 -1.09899163554 1.09899163554 0.303389110269 -0.303389110269 1.45960864748 -1.45960864748 0.314268842707 -0.314268842707 2.94298286866 -2.94298286866 -0.422211330966 0.422211330966 -0.591225409101 0.591225409101 -0.364403038343 0.364403038343 -3.83693258541 3.83693258541 0.110940814782 -0.110940814782 1 4 1 5 2 4 2 4 3 3 3 3 3 3 2 4 2 4 2 4 2 4 1 12 78.0 0.461538461538 54.0 0.425925925926 0.292735042735 0.339250493097 0.0322767578685 0.252608776277 0.0453311755087 0.00166807724115 -0.000906884776181 7.25830847485e-05 0.266890388612 0.333333333333 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.210526315789 0.0 3.0 1.0 0.692307692308 0.625 0.125 0.375 0.75 1.0 0.625 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -4.35839690313 9.895059009e-16 -8.46368538449 1.47278326693 2.51953068764 2.33668723003 -3.40972071747 10.5581523195 -1.94138399205 1.14497015864 -7.17008626326 17.7810942922 1.13607426502 0.0793302784207 -4.63489890986 19.0764577236 -0.511734228068 0.0543500972647 -6.58571668838 18.8187320304 -0.514400118484 -0.0656589377105 -11.8522977202 18.7683643059 0.0774563446328 0.1054535708 0 10 1 4 15.0 1.66666666667 14.0 0.0714285714286 0.4 0.288888888889 0.133333333333 0.0432592592593 0.0177777777778 0.0 0.00122405399584 -0.00459020248439 -0.0854899711593 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 3.0 0.933333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.01859163579 2.54647908947 -2.58889404631 5.8086513256 -0.162974661726 -0.448180319747 -2.9054930991 4.68295225525 0.399287921229 -0.118156629751 -0.408453277421 2.4344675688 0.346810080153 -0.557373343103 2.31092165013 -2.28916478643 -0.00232858196674 -0.618801752601 2.42443970429 -7.10236541209 -0.179043285398 0.344005455719 0.518053316917 -4.33721095361 -0.0269431915177 0.117790654279 1 3 1 4 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 14 65.0 0.384615384615 46.0 0.413043478261 0.276923076923 0.34674556213 0.024943104233 0.299229858898 0.045989986345 0.00145918107986 0.000851675356947 0.00132542281421 0.439624493813 0.2 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 3.0 0.0 0.0 7.0 1.0 0.707692307692 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.875 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -4.11354314453 0.195883006882 -7.57217129903 1.76157079032 2.85826920102 2.04228318418 -1.8259563915 9.64484066708 -2.13070864575 0.86692341721 -4.76038710109 14.679456696 1.89920761002 -0.409478482897 0.723571194089 11.6402382451 -0.860928952971 -0.631767562434 -0.181457300612 4.40127018351 0.248651126102 -0.683773701064 -0.978800646864 -3.39658737325 0.0285081975268 -0.0566846442044 1 1 3 1 10 1 3 1 0 20.0 1.25 16.0 0.25 0.32 0.3 0.092 0.058 0.024 0.0075131884044 -0.0012521980674 -0.0024149534157 -0.0540681236959 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.0 0.0 0.0 2.0 2.0 0.8 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.29183118052 -4.38939001676 5.56681023916 -0.1935324108 0.152788745368 -5.57512049096 7.06718450159 -0.217978610059 0.727274427953 -6.41418998329 12.0193340948 -0.133557735285 1.48135818776 -8.08399460805 23.524888813 -0.554087122024 1.1364790314 -14.5877937349 35.5552462092 -1.13030388235 0.817612717125 -26.6305695453 46.2220422892 -0.155106319778 0.264469310689 1 3 2 5 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 4 1 5 2 1 3 0 78.0 0.461538461538 45.0 0.622222222222 0.269230769231 0.248520710059 0.0349213574066 0.199514489455 0.0571865675416 0.00285834439137 0.0112200699262 0.00206469020626 0.166880135898 0.333333333333 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 6.0 0.1 0.0 6.0 1.0 0.576923076923 0.625 0.125 0.0 0.125 1.0 0.625 0.5 0.625 1.0 1.0 1.0 0.875 0.875 1.0 1.0 0.75 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -2.30162533087 3.52589412388 -4.47233925945 9.78641025443 1.24513207185 1.94028493208 -2.49137774016 16.8070812062 -1.23500563162 -0.0769101935919 -4.65126747002 16.6812972953 0.94964748171 -0.196078978805 -3.35457828423 15.4416387097 -1.13491703747 0.481362697532 -9.33939460164 18.7273428203 -0.075289396553 0.177869880246 -12.6031967273 21.0950251667 0.0220743867083 0.0137114698194 1 4 1 12 2 3 1 0 24.0 1.5 19.0 0.263157894737 0.340277777778 0.28125 0.119719328704 0.0462239583333 0.029296875 0.00793053214229 0.000586945513091 -0.00249174981973 -0.0654167386005 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 0.25 0.0 1.0 2.0 0.791666666667 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.69765272631 3.39530545263 -4.33058190055 7.9751808572 -0.424413181578 -0.282942121052 -6.44303389309 7.50082518157 -0.398214837037 -0.0209586756335 -8.49225742147 6.88366092298 -0.162866375235 0.311178114614 -9.29410263437 8.0110409789 0.209295663618 -0.270716226933 -7.95908859336 6.83176722456 -0.0837781011723 0.213441039534 -8.17434270675 8.46446949663 0.0105768424072 0.0377361963298 0 4 1 4 2 3 2 3 2 3 2 3 2 3 2 4 1 4 1 3 1 10 1 4 65.0 0.384615384615 48.0 0.354166666667 0.301538461538 0.359763313609 0.0270405097861 0.290701866181 0.0477305416477 0.00142349367974 -0.00204607760715 0.000779702987303 0.406880706629 0.4 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 4.0 0.157894736842 0.0 5.0 1.0 0.738461538462 0.75 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 0.875 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.62383562732 -0.195883006882 -6.45690373565 1.1222929327 2.94288138742 2.43636734004 0.544133247191 10.0023066881 -1.64266772182 0.713912322237 -2.16326130517 15.0461929659 0.854377764662 -0.319460774824 -1.02112944242 11.4829762251 -0.475540601085 -0.902206823145 -2.90436935645 3.52527235268 -0.198411641133 -0.325003102173 -3.86899495862 -2.41011309212 0.227525251696 -0.109606701258 1 1 3 1 9 2 3 1 0 20.0 1.25 15.0 0.333333333333 0.28 0.275 0.082 0.0595 0.023 0.0085865010336 0.00031304951685 -0.0027727242921 -0.0330826257271 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.142857142857 0.0 2.0 2.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 2.16450722605 -4.7310360376 5.39598722874 0.162974661726 0.331042281631 -5.0626514597 7.32341901722 -0.472626519006 0.599950473479 -6.73305960274 11.8598992851 -0.102999986211 1.4966370623 -8.2684834593 23.4326443874 -0.391519896952 1.21776264393 -13.9684578283 35.8649141625 -1.33703724075 0.714246037925 -27.2225191069 45.9260675085 -0.125105122365 0.279469909395 1 4 3 4 3 5 3 4 3 3 4 3 4 3 4 3 4 3 5 3 3 4 1 11 1 2 91.0 0.538461538462 52.0 0.557692307692 0.248037676609 0.280642434489 0.037395281931 0.214074055398 0.0553750077962 0.0039582310171 0.00936771862961 0.00430401769331 0.185068136586 0.428571428571 0.0769230769231 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 3.0 0.166666666667 0.0 5.0 1.0 0.571428571429 0.375 0.0 0.0 0.5 0.875 0.5 0.375 0.625 1.0 1.0 0.875 0.875 1.0 1.0 1.0 0.875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.01560164109 -0.195883006882 -8.08795830566 0.34736324067 1.75831077775 1.23325159363 -6.01370003145 4.70559022335 -2.18199925416 0.264055587969 -10.2842119094 6.90982304879 1.76594272552 -0.125099969402 -5.38611578655 4.85722203865 -0.899271592734 -0.744983060273 -6.55449932028 -2.67234184906 0.264393200202 -0.820595235287 -8.15349072855 -12.3332433747 -0.0794597118983 -0.127834617025 1 1 2 3 3 1 10 20.0 1.25 15.0 0.333333333333 0.29 0.35 0.092375 0.072 0.0385 0.013022300884 -0.00319757720782 0.00488580853084 -0.0480083794769 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0.0 2.0 1.0 0.75 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 1.14591559026 -4.59863165166 2.65979642803 -0.437994403389 -0.137509870831 -6.14267828779 2.46613757611 0.173160578084 0.168067619905 -5.45775971693 3.90356344231 -0.23981721473 0.746464694371 -7.77601877988 9.29392997447 -0.825235237623 0.418271535776 -15.9476735499 13.7456458117 -0.867839473945 0.161222840568 -26.245496518 16.6495530643 -0.155257871608 0.128219241268 1 18 2 1 3 0 25.0 1.0 19.0 0.315789473684 0.296 0.248 0.080384 0.061696 0.009792 0.010524672 -0.002924032 -0.003940864 -0.029057536 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 0.125 0.0 2.0 1.0 0.76 0.75 1.0 1.0 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.25 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.78253536263 2.29183118052 -4.2610556204 5.12535928391 0.0203718327158 -0.550039483326 -4.43588748989 3.65801419273 0.160937478455 -0.067227047962 -2.15166903438 1.7967283299 0.742186609501 -0.435142346809 3.14113701115 -1.92018708393 0.249544846339 -0.529573125306 5.31502422971 -5.86369359893 -0.401088778203 0.340908937146 2.17039846705 -3.15331183051 -0.00835675107943 0.0938403744838 2 2 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 4 1 9 65.0 0.384615384615 43.0 0.511627906977 0.273846153846 0.331360946746 0.0253582157487 0.296768320437 0.0512699135184 0.00152809611772 0.00368338995445 0.00118443812797 0.418406277688 0.2 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 1.0 0.166666666667 0.0 6.0 1.0 0.661538461538 0.5 0.5 0.5 0.625 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.875 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.52589412388 0.0979415034412 -6.10337169741 1.34774114115 2.91390461126 1.75135635147 -0.310182922832 8.05138084689 -2.35993723505 0.720691859098 -4.62752243617 12.4840759173 1.75852468705 -0.179432931331 -0.282433132215 11.3828288508 -0.833279574824 -0.271655089945 -1.08266900331 7.44921870888 0.287909005473 -0.616519249692 -1.48203883406 0.291491295867 0.0230462208672 -0.141790167278 1 2 1 4 4 1 6 1 5 2 2 2 0 30.0 1.2 18.0 0.666666666667 0.261111111111 0.26 0.0926296296296 0.0603333333333 0.0487777777778 0.0174090121199 0.00129019091323 0.00311322796883 -0.0276133313065 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 3.0 3.0 0.6 0.25 0.75 0.75 0.25 0.75 1.0 1.0 0.75 0.75 1.0 1.0 1.0 0.5 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.80375602171 1.9098593171 -4.24299363722 4.00213211596 0.167996884375 -0.901878010854 -3.63279934378 0.967422589047 0.375127545909 -0.30750306906 -0.653060243621 -1.56276145016 0.459546708039 0.0885967974533 3.00483033339 -0.930751674549 0.180214818928 0.148928037241 4.47176133117 0.18377812605 -0.292738968157 -0.113623001074 1.34434238694 -1.05001971845 -0.103408291824 -0.0433639256263 0 4 1 4 2 3 2 3 2 3 2 3 2 3 2 3 2 4 1 3 1 15 2 3 3 2 3 2 80.0 0.3125 55.0 0.4 0.2925 0.3171875 0.024044921875 0.3177421875 0.05597265625 0.00138997064442 0.00804532454252 0.00266960094226 0.492757517986 0.4 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 3.0 0.2 0.0 1.0 1.0 0.6875 0.75 0.5 0.5 0.875 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.625 0.875 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 -3.10352139029 1.59154943092 -4.62224054693 5.86318301737 3.50358469451 2.81318795895 2.49396110643 14.2272841787 -2.9976261374 -1.06563093611 -4.61867573962 11.3003419277 1.64756357989 0.122381195114 -1.51120198128 10.0248353148 -0.597619641558 0.0935840036656 -0.789382850037 8.8915247029 0.19239491206 -0.986424058886 -1.71451945442 -0.558978169064 0.00523749668485 -0.135763793012 0 3 3 4 2 4 2 4 3 3 3 4 2 2 4 2 4 3 3 4 2 4 2 4 1 6 1 1 4 0 84.0 0.428571428571 48.0 0.645833333333 0.188492063492 0.264455782313 0.0217629710614 0.234631451787 0.0479412995357 0.00294551489279 0.0114208682449 0.00477097156893 0.295498216684 0.5 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 3.0 4.0 0.105263157895 0.0 6.0 1.0 0.571428571429 1.0 0.625 0.5 0.625 1.0 1.0 1.0 1.0 0.875 0.875 0.75 1.0 0.375 0.5 0.375 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 -5.63863226954 1.81891363534 -10.5215785526 6.60251371053 3.84384708039 3.13298593515 -2.23876551379 16.6262731359 -2.6106069692 -0.40446396914 -6.68702193487 17.7407296657 1.66348970001 0.292609492565 -2.77457301916 15.8055343751 -0.623331877454 -0.602587709478 -3.75439936947 15.2184953807 -0.426335745021 1.08712097555 -9.64650499397 19.9148369345 0.0450947482957 -0.253984492246 2 3 2 4 1 6 1 4 2 1 1 1 2 0 30.0 1.2 19.0 0.578947368421 0.266666666667 0.24 0.0857777777778 0.0586666666667 0.0315555555556 0.0118794936917 0.000454406862523 -0.00115224597283 -0.0271670388523 0.0 0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.3 0.0 2.0 3.0 0.633333333333 0.25 0.75 0.75 0.5 0.75 1.0 1.0 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.33427249868 1.9098593171 -5.57507648914 3.81330925572 0.0530516476973 -1.18482013191 -5.61683763747 -0.171192051965 0.261001007498 -0.27606505561 -2.648874546 -2.41503464777 0.82501588856 0.328384423191 3.8119708586 -0.188031218348 0.514021981056 0.158388550548 7.83914531101 1.22830994328 -0.545583241445 -0.186240189699 2.92542133205 -0.570604282026 -0.123371141538 -0.0313864621841 0 6 2 5 3 3 4 3 4 3 5 2 4 3 5 2 4 4 3 4 3 4 2 6 1 2 1 2 1 0 91.0 0.538461538462 49.0 0.632653061224 0.243328100471 0.250211327134 0.0375545237277 0.20132674957 0.058305056856 0.00380009622324 0.0151441099653 0.00361899010572 0.159833369388 0.571428571429 0.0769230769231 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 5.0 0.222222222222 0.0 3.0 1.0 0.538461538462 0.375 0.0 0.0 0.25 0.75 0.375 0.375 0.75 1.0 0.875 0.875 0.875 1.0 1.0 1.0 0.875 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.84030359979 -0.0979415034412 -5.2701220128 1.91549711972 1.95303471359 3.14455974954 -1.12660781645 12.4364279075 -1.30849862314 0.139187972521 -2.83052813717 15.8550786752 1.06003083832 0.00167596779119 -0.21429427089 13.4274831152 -0.542069507805 -0.834137652841 -0.960442475333 5.85452696641 0.125146225372 -0.664325684305 -2.3018246879 -2.73423494463 -0.0276033670156 -0.10428650187 1 2 1 2 4 1 5 1 4 1 3 1 0 25.0 1.0 17.0 0.470588235294 0.272 0.304 0.073216 0.080384 0.045312 0.009732096 -0.000311296 0.001001472 -0.017286144 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 3.0 0.125 0.0 2.0 1.0 0.68 0.5 1.0 0.75 0.5 0.75 1.0 1.0 1.0 0.75 1.0 1.0 1.0 0.25 0.75 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 1.27323954474 -5.0709220031 3.02104587806 -0.203718327158 -0.101859163579 -5.59137063809 2.51655645052 0.505221451351 -0.352432705983 -2.14420064189 0.23098292518 0.559980937691 -0.193287948807 2.80737979404 -1.70044668652 0.405371439402 -0.137685557517 6.41478982837 -2.6987743889 -0.158242920587 0.148953364869 4.56120736794 -1.00950999865 -0.141535842604 0.0696850032198 6 1 1 1 4 5 4 5 5 4 6 3 6 3 6 3 6 2 7 3 6 3 6 2 7 3 6 2 7 3 6 3 6 3 6 3 6 6 3 2 1 3 3 2 1 7 3 2 6 0 198.0 0.409090909091 74.0 0.608108108108 0.239057239057 0.185032139578 0.0486545899769 0.227196462121 0.0602968775604 0.00943405103402 0.0189359787908 0.00856791120323 0.230851683119 0.555555555556 0.136363636364 0.0 0.0 2.0 0.0 1.0 0.0 0.0 2.0 5.0 9.0 0.1875 1.0 1.0 1.0 0.373737373737 0.0 0.0 0.0 0.5 0.111111111111 0.0 0.0 0.277777777778 0.611111111111 0.333333333333 0.333333333333 0.444444444444 0.944444444444 0.888888888889 0.888888888889 0.777777777778 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.833333333333 0.5 0.5 0.5 0.5 0.5 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 1.0 0.833333333333 0.833333333333 0.666666666667 0.833333333333 1.0 3.00947528756 1.27323954474 2.26050399818 5.14804541961 -5.8941137903 3.35457007776 -8.40236100383 18.718968113 6.16683083661 1.96951561511 7.63032550948 30.6159767231 -3.30813894168 0.231105820914 4.66143777726 32.1873725512 2.40874196993 -0.635783929583 7.91649921595 26.1358679146 -1.64200650483 -0.30806185718 6.08803148851 22.7262892202 0.3667467218 0.1203052569 1 3 1 4 1 5 1 2 2 0 20.0 1.25 14.0 0.428571428571 0.25 0.25 0.079375 0.055 0.025 0.0127875137463 0.000279508497187 0.000559016994375 -0.0209631372891 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.142857142857 0.0 2.0 1.0 0.7 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -2.03718327158 2.03718327158 -4.9402776725 4.81687312823 -0.0814873308631 0.0814873308631 -5.63020925653 6.80884429606 -0.0814873308631 1.25490489529 -5.77662933638 13.2637327798 -0.209259465656 0.999360625704 -7.96050763114 23.3246882778 -0.662668012551 1.34519025029 -15.3283376433 34.8850460996 -1.07457283234 0.56780664196 -26.8374460796 45.4788203541 -0.125256674196 0.389873382927 3 1 4 4 3 4 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 5 2 13 1 1 1 1 2 1 105.0 0.466666666667 55.0 0.636363636364 0.221768707483 0.273650793651 0.0301099233344 0.239441960911 0.0600384407731 0.00382565634459 0.0137066214754 0.00591823386834 0.262686233886 0.142857142857 0.133333333333 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 3.0 4.0 0.173913043478 0.0 6.0 1.0 0.52380952381 0.375 0.125 0.0 0.25 0.75 0.625 0.5 0.75 0.875 1.0 1.0 1.0 0.875 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -4.49877972473 -0.509295817894 -8.19803018963 0.829336622407 3.22554018 3.13726223823 -1.60780767418 11.9736244584 -2.26128181492 0.521166811773 -3.94113140881 15.4381323055 2.2366101562 -0.999484030387 1.93100009837 9.12137849349 -1.35505344671 -0.0432134098353 -0.420812902537 6.41376722605 0.698319143483 -0.228827857098 -0.151059234705 2.67176989728 -0.105994320594 -0.243302175066 0 4 1 14 1 0 20.0 1.25 18.0 0.111111111111 0.32 0.3375 0.092 0.061375 0.012 0.0075131884044 -0.0036671514831 -0.00120747670785 -0.061019500021 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 2.0 3.0 0.9 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -1.78253536263 2.29183118052 -4.38939001676 5.56681023916 -0.1935324108 0.152788745368 -5.57512049096 7.06718450159 -0.217978610059 0.727274427953 -6.41418998329 12.0193340948 -0.133557735285 1.48135818776 -8.08399460805 23.524888813 -0.554087122024 1.1364790314 -14.5877937349 35.5552462092 -1.13030388235 0.817612717125 -26.6305695453 46.2220422892 -0.155106319778 0.264469310689 2 1 2 10 2 3 2 3 2 3 2 2 3 2 3 2 3 2 3 3 2 3 1 8 1 1 1 1 2 0 75.0 0.333333333333 44.0 0.545454545455 0.28 0.268444444444 0.0288 0.306834962963 0.0498133333333 0.00206922336478 0.00225101941754 0.000127273659341 0.419839428359 0.6 0.0666666666667 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 6.0 6.0 0.0 0.0 2.0 1.0 0.586666666667 0.5 0.0 0.0 0.125 0.75 0.5 0.5 0.625 0.875 1.0 1.0 1.0 0.75 0.875 0.5 0.875 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 -1.95230063526 2.97089227105 -4.13929457442 8.70737831008 0.604364370568 2.28390880113 -3.38487516688 16.6409548756 -0.435009887979 -0.166286132476 -2.13689245695 16.4399476736 1.05690521264 -0.44653909709 0.732922191916 11.2671651535 -0.963234007252 -0.72009461418 -1.01403875607 4.43961791422 0.903864069985 -0.332859643138 0.940369680623 -1.01684969525 -0.24832651734 -0.147428914224 0 3 1 12 16.0 1.0 15.0 0.0666666666667 0.328125 0.375 0.075927734375 0.078125 0.017578125 0.00418853759766 -0.0029296875 0.00164794921875 -0.046875 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 2.0 0.9375 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -0.954929658551 0.954929658551 -2.2648145447 2.2648145447 0.119366207319 -0.119366207319 -1.41550909044 1.41550909044 0.566989484765 -0.566989484765 1.8165699994 -1.8165699994 0.136152080223 -0.136152080223 2.72043153319 -2.72043153319 -0.380013511582 0.380013511582 -0.644720156036 0.644720156036 -0.278074304257 0.278074304257 -3.49283318954 3.49283318954 0.0620657855579 -0.0620657855579 0 2 7 4 4 4 4 2 5 2 5 2 5 1 2 0 8 5 11 5 12 4 14 3 14 3 14 4 13 4 14 3 15 3 14 4 14 3 15 3 14 4 14 4 15 3 14 5 11 2 1 4 10 3 1 4 9 4 2 4 6 5 3 5 4 6 6 7 2 2 10 1 9 0 8 5 1 2 11 5 5 4 6 4 8 4 5 3 10 2 5 3 11 2 4 4 11 2 3 4 12 1 4 3 18 3 17 4 17 3 18 3 17 4 17 4 18 3 17 5 11 2 4 4 10 3 4 4 9 4 5 4 6 5 6 5 4 6 9 7 2 2 13 1 12 0 6 5 6 5 7 3 8 2 9 2 8 3 8 2 9 2 8 2 9 2 8 3 8 4 6 3 8 3 7 4 7 3 7 3 8 2 8 4 7 3 8 2 9 0 1 5 2 7 2 6 2 6 1 7 2 6 1 6 2 5 2 2 5 3 5 3 3 5 0 6 5 9 5 10 3 11 2 12 2 11 3 11 2 12 2 11 2 12 2 11 3 4 2 5 4 4 2 3 3 6 2 3 3 6 1 3 4 6 2 2 3 7 1 2 3 7 2 2 2 7 2 2 4 2 5 3 3 3 5 3 2 4 3 5 0 0 5 2 1 9 10 9 8 9 8 10 8 9 8 9 2 2 5 8 2 3 5 7 2 3 6 6 1 5 6 11 4 8 1 5 3 7 2 5 4 1 2 3 2 5 7 3 3 5 5 4 2 7 4 4 3 6 4 4 3 6 4 3 5 6 3 1 8 5 2 2 4 1 3 9 0 4 1 6 2 6 2 6 3 5 2 6 3 5 3 4 5 1 12 1 3 0 5 2 1 9 10 9 8 9 8 10 8 9 8 9 2 2 5 8 2 3 5 7 2 3 6 6 1 5 6 11 4 14 3 14 4 1 2 10 7 11 5 13 4 13 4 13 4 14 3 14 2 2 0 0 5 1 0 3 8 3 7 3 7 4 7 4 6 5 1 1 4 4 2 2 3 4 2 2 3 3 2 3 3 3 1 4 3 3 1 4 3 8 3 8 3 8 3 8 3 8 3 8 4 7 4 6 5 4 9 2 2 1 5 1 0 4 1 8 6 3 9 3 2 4 2 3 1 6 2 8 3 9 2 9 2 9 2 9 2 8 3 8 3 7 5 2 1 2 3 1 11 1 2 1 0 2 7 8 11 6 8 10 5 11 5 12 4 12 4 11 5 12 4 11 6 5 1 5 11 4 12 4 5 11 5 11 5 11 5 11 5 12 4 11 5 7 11 5 12 4 12 4 0 1 9 1 9 3 5 5 4 6 4 6 4 6 4 7 4 5 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 4 6 5 5 5 3 8 1 9 1 9 1 0 1 8 3 3 1 4 2 1 5 3 9 2 9 2 8 3 7 4 9 2 8 3 8 4 7 5 5 6 7 1 3 0 1 4 1 2 1 6 2 8 3 3 3 4 1 3 4 4 2 1 5 4 8 3 8 4 9 3 10 2 9 3 9 3 9 5 8 4 1 2 3 1 2 1 2 1 3 2 3 2 4 1 12 2 7 1 1 3 3 9 3 10 2 10 2 7 0 2 1 5 2 4 2 3 11 0 2 4 3 7 5 5 6 4 3 3 22 4 2 9 0 1 2 2 3 3 4 1 3 3 5 2 3 4 4 3 1 1 2 3 2 6 4 5 2 3 3 4 4 2 4 3 4 3 3 4 4 2 4 3 4 3 3 3 5 2 4 3 4 5 1 3 5 5 1 3 4 5 2 2 5 3 4 0 3 3 5 2 3 4 4 3 4 3 2 6 4 5 2 3 3 4 4 2 4 3 4 3 3 4 4 2 4 3 4 3 3 3 5 2 4 3 4 5 1 3 5 5 1 3 4 5 2 2 5 3 4 0 0 1 4 2 4 4 1 6 1 5 2 1 1 3 4 3 3 4 3 3 3 4 3 3 3 4 3 3 4 3 4 0 2 3 6 2 5 6 3 6 4 6 1 8 6 5 3 5 5 4 5 4 6 3 6 3 6 2 7 3 6 3 6 2 7 3 6 3 6 3 6 3 6 3 5 4 5 3 6 4 4 6 3 6 8 1 3 1 2 1 2 0 1 0 4 1 4 3 3 2 2 3 2 3 2 2 3 3 2 2 3 3 2 2 3 1 5 3 1 1 0 4 2 3 5 2 6 3 5 4 4 5 3 5 3 5 3 5 3 5 5 3 4 4 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 2 6 3 5 1 0 0 3 4 3 4 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1 5 2 1 3 4 2 5 1 4 3 3 4 2 4 3 3 2 3 3 4 2 4 3 2 5 1 4 2 3 3 3 4 2 4 2 3 3 3 3 3 3 3 3 2 6 1 2 4 4 4 4 4 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 2 6 4 3 2 3 1 12 2 4 2 4 2 4 2 3 3 4 2 4 1 5 1 5 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 6 1 2 5 2 3 3 4 3 4 2 4 3 4 3 4 3 5 3 5 3 4 4 4 1 3 2 2 6 1 6 2 5 3 4 3 4 3 4 4 3 4 3 3 4 3 5 2 5 2 4 4 2 4 3 4 3 4 3 4 2 5 3 4 3 3 5 1 7 1 1 1 1 3 0 1 1 5 5 3 4 4 3 5 2 5 3 3 3 5 2 4 4 4 2 5 3 3 5 1 6 1 5 1 6 1 6 3 3 4 4 3 3 4 3 4 3 4 3 5 3 3 5 3 3 3 3 5 2 5 2 4 2 5 3 4 3 4 3 4 3 2 13 1 3 1 1 2 0 0 1 7 3 8 2 6 2 6 2 6 2 6 2 6 2 6 2 5 4 5 4 3 5 2 6 2 7 2 1 2 2 1 0 3 2 2 11 1 5 2 4 2 4 3 3 2 4 2 4 2 4 3 3 3 3 3 3 2 3 3 2 4 2 4 3 3 4 2 4 2 4 1 17 0 3 3 4 4 3 4 2 3 3 4 2 4 3 3 2 3 3 3 3 3 3 2 5 1 5 1 5 1 5 2 7 1 6 4 4 4 4 5 3 5 3 5 3 5 3 5 3 5 5 2 4 4 4 4 4 4 3 5 3 5 3 5 3 5 2 6 3 4 5 2 0 1 0 2 5 5 4 3 4 3 4 4 3 4 3 4 3 4 3 4 3 3 4 4 3 5 2 1 4 0 1 5 1 6 2 5 2 5 3 4 3 4 3 4 3 4 3 3 4 4 3 5 2 4 3 3 4 3 4 3 4 3 3 4 3 4 4 3 3 5 1 7 1 5 1 0 1 0 1 7 4 5 4 6 3 5 3 5 3 5 4 4 4 4 3 4 4 4 5 3 5 2 7 3 5 0 4 4 5 5 4 5 3 5 3 5 3 5 3 5 4 4 4 4 3 5 4 3 5 2 7 4 2 2 0 1 2 3 3 5 1 6 2 5 3 4 3 3 4 3 4 3 4 3 4 3 4 4 2 5 1 7 4 1 2 0 4 16 1 4 2 3 2 3 2 3 2 3 2 3 2 3 1 4 1 4 1 4 2 3 2 3 2 3 2 3 2 3 1 4 1 9 2 2 1 0 0 3 4 3 3 3 4 2 4 2 4 2 4 2 4 2 4 2 4 3 2 4 1 6 1 1 4 0 1 6 1 7 2 6 3 5 3 5 4 4 4 3 5 3 5 3 5 4 4 5 3 4 4 3 4 4 4 4 5 3 5 3 4 4 4 4 4 4 2 8 1 7 6 1 1 0 0 3 3 2 3 3 3 3 2 3 2 2 3 3 2 2 2 4 1 14 1 2 1 1 2 2 12 1 6 3 4 4 3 4 3 4 3 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 2 5 2 5 2 4 3 3 4 3 5 3 1 4 0 2 2 3 5 5 3 4 4 3 4 3 4 3 4 3 4 3 3 4 3 4 3 4 3 3 5 3 4 4 3 1 1 2 1 2 2 7 1 6 4 4 5 2 6 2 5 4 5 2 6 2 5 3 6 5 2 4 5 3 5 2 5 3 6 2 6 2 6 3 5 2 6 2 5 5 1 7 3 1 5 0 0 3 5 5 4 5 4 3 5 4 4 4 5 3 5 3 5 3 5 4 4 3 4 6 1 7 2 3 5 4 4 4 5 3 5 3 5 3 4 4 4 4 4 4 5 3 5 3 5 5 3 3 5 3 5 3 5 3 5 3 4 4 3 15 2 1 1 1 1 1 1 0 1 2 5 5 4 5 4 5 3 5 3 6 3 4 5 4 4 4 4 3 5 3 4 3 4 3 5 1 5 0 0 7 6 5 7 3 8 2 8 2 8 2 8 2 7 3 7 4 6 4 5 6 4 5 1 0 1 2 4 3 4 12 2 7 1 4 3 5 4 3 3 3 5 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 3 2 3 6 2 2 4 6 8 5 4 1 0 0 6 1 5 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 4 4 3 4 3 4 3 4 3 4 3 4 3 5 2 4 3 4 3 4 5 3 3 1 0 4 3 4 3 6 3 5 4 5 4 4 5 5 4 5 4 6 3 6 4 6 5 5 3 1 1 2 1 4 4 1 8 2 4 4 3 4 3 3 3 5 2 5 2 5 2 5 2 4 4 2 6 1 4 3 0 1 1 1 4 4 1 4 2 3 2 3 2 3 2 2 4 1 3 2 3 2 3 3 2 13 1 2 3 4 2 5 3 3 3 3 3 3 3 3 4 2 3 4 2 4 2 3 3 4 1 5 1 2 3 0 3 2 4 1 1 13 2 4 5 2 6 2 6 2 6 2 6 2 6 2 6 3 4 4 3 5 2 0 0 5 4 5 4 4 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 4 6 1 6 1 0 1 1 3 3 13 2 5 2 4 4 3 3 4 3 4 3 4 3 4 3 4 2 6 1 5 2 0 9 1 9 6 4 10 3 3 2 5 2 3 9 4 9 4 9 4 9 4 8 5 8 5 8 5 8 4 10 4 9 3 10 3 10 3 10 3 9 4 9 5 8 6 7 6 7 0 1 3 2 5 1 5 2 4 3 3 3 3 3 3 3 3 3 3 3 3 3 10 1 4 1 0 4 3 4 7 2 7 1 6 3 6 4 4 5 3 6 3 6 3 6 2 7 1 7 2 7 2 6 4 1 1 3 5 5 3 5 0 5 3 7 4 5 6 4 5 5 4 6 3 6 3 7 2 7 3 7 3 7 2 7 3 7 6 3 6 5 5 5 3 6 0 1 8 3 4 4 8 17 4 3 2 13 4 3 2 13 3 2 6 3 11 2 6 3 11 2 6 3 11 2 6 3 11 2 6 3 9 4 5 4 8 5 4 5 8 5 5 4 10 3 6 3 10 3 6 2 11 3 6 3 10 3 6 3 10 3 6 3 10 3 6 3 10 3 5 4 9 5 4 5 7 7 2 7 6 7 2 6 7 0 1 3 4 4 3 4 4 3 4 3 4 3 4 3 3 4 4 3 4 3 4 4 1 7 1 6 1 4 1 5 2 4 3 3 3 3 3 3 3 3 3 3 2 4 2 4 3 3 3 2 4 3 3 3 3 2 4 3 3 3 3 3 3 3 2 5 1 5 1 5 2 4 4 3 4 3 4 4 5 3 5 2 6 3 5 2 5 4 4 5 4 5 4 4 5 1 3 2 6 1 5 1 4 2 4 3 2 3 3 4 3 3 3 2 3 3 4 1 5 2 4 1 0 1 0 4 2 3 3 3 2 3 2 3 2 3 2 3 2 3 2 3 2 3 2 2 2 4 1 2 2 0 17 2 1 1 9 4 4 6 5 17 4 3 3 5 3 4 3 3 5 4 5 1 4 3 5 4 10 3 5 4 9 4 5 3 10 4 5 3 9 5 4 4 8 6 3 5 9 5 4 4 9 5 5 3 10 3 6 3 10 4 4 4 10 3 6 3 10 3 6 3 10 3 6 3 10 4 5 3 9 4 5 4 9 5 4 5 7 6 3 7 18 1 9 0 0 5 1 5 2 4 3 2 4 2 3 3 3 3 3 3 3 3 3 4 2 4 1 6 1 1 4 0 0 2 1 1 5 5 5 3 6 2 6 2 6 2 5 4 5 2 5 3 6 2 5 4 4 4 4 5 1 2 4 1 6 1 6 1 6 2 5 3 4 4 3 3 4 3 4 4 4 3 4 2 5 2 4 3 4 3 3 5 1 3 0 2 2 3 4 1 11 1 0 2 2 3 3 3 5 1 4 2 4 3 2 4 2 4 1 5 1 5 2 4 2 3 3 2 7 5 0 1 0 5 4 4 4 3 4 3 4 3 4 3 5 2 5 2 5 2 4 3 4 4 2 4 1 0 2 4 1 6 2 5 3 4 3 4 4 3 4 3 4 3 4 3 4 3 4 4 3 3 3 4 3 4 3 4 3 3 4 3 4 3 5 2 4 4 1 14 0 5 6 4 6 3 7 3 6 2 7 3 6 2 6 3 7 2 7 3 5 4 4 7 2 7 0 5 2 5 1 4 4 2 2 4 4 2 3 2 5 1 4 3 4 1 5 2 3 1 6 3 2 1 6 5 8 4 8 4 9 2 5 0 3 2 1 8 1 3 2 0 3 2 6 4 4 7 1 4 3 2 1 2 4 2 7 2 7 2 6 2 1 0 5 1 7 2 7 2 7 2 8 2 7 2 8 2 8 2 8 2 8 2 8 3 8 5 1 3 2 1 1 5 1 0 1 3 2 1 2 4 8 8 6 7 6 8 4 8 5 8 4 8 4 8 4 8 4 8 3 8 4 8 4 7 4 7 4 8 3 8 3 8 3 8 2 9 1 10 0 2 7 26 5 2 2 2 1 21 4 4 6 21 15 19 6 7 5 30 7 1 1 7 2 17 8 6 4 18 7 2 1 2 4 20 8 2 4 21 13 24 9 28 1 6 0 4 2 3 3 1 5 2 4 2 3 3 3 3 2 3 2 4 2 3 3 3 3 4 2 3 0 6 1 6 3 4 3 5 3 4 3 4 3 5 3 4 3 4 3 5 3 5 3 6 2 5 0 1 6 1 7 5 3 6 2 6 2 6 2 6 2 6 2 6 3 5 2 6 3 5 2 5 3 1 0 2 2 1 4 2 4 1 4 2 3 2 3 2 2 3 3 2 3 2 2 3 3 1 4 1 3 1 0 3 1 1 9 1 5 1 4 1 4 1 4 1 3 2 3 3 2 3 2 1 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 1 3 3 5 2 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 4 2 5 2 4 3 4 3 4 3 4 3 4 3 4 3 4 3 5 4 5 2 0 4 5 3 5 3 4 4 3 4 4 3 4 3 4 2 4 3 4 2 4 2 4 1 5 0 1 2 4 1 6 1 6 3 4 3 4 3 4 3 3 4 3 4 3 4 3 4 5 2 4 3 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 2 6 1 1 1 1 2 1 1 0 0 3 5 4 4 3 5 2 5 3 4 3 4 3 4 3 4 3 4 3 4 3 3 5 2 1 1 1 1 1 0 2 3 2 1 8 2 6 2 4 4 3 5 3 5 3 5 2 6 2 4 0 4 1 11 2 10 2 10 3 9 3 11 3 10 3 11 2 11 2 11 4 8 4 9 4 9 7 2 1 4 9 4 11 1 4 4 7 8 5 8 5 8 1 1 3 7 2 1 11 3 7 5 0 1 1 10 4 9 3 9 5 3 3 2 9 4 7 8 1 1 1 3 0 1 3 6 4 4 2 2 2 3 4 2 1 5 1 4 1 11 3 1 7 0 4 3 4 3 2 5 4 3 4 3 3 3 3 4 3 2 4 3 4 2 4 3 4 3 4 0 3 2 3 3 4 3 3 2 4 2 4 2 3 2 3 3 3 4 1 5 1 4 2 3 3 0 1 4 1 5 3 3 3 3 3 4 2 3 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 2 4 2 4 2 3 3 3 3 2 12 0 2 6 3 5 3 4 3 5 2 5 2 4 3 4 3 4 3 4 3 5 2 4 4 2 6 7 3 8 7 5 9 3 2 5 2 4 2 10 3 10 2 11 3 10 3 10 2 9 5 9 4 10 2 11 3 10 3 10 3 10 2 11 3 10 2 11 3 8 6 8 5 7 0 2 2 2 5 2 4 3 3 3 3 3 3 3 3 3 2 5 1 5 2 3 3 2 5 1 1 4 5 1 6 1 5 2 4 2 4 2 3 3 3 4 2 3 4 2 4 2 4 2 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 2 11 0 4 3 4 5 3 4 3 5 3 3 4 3 4 3 4 4 3 3 4 4 4 2 5 2 1 1 2 1 0 4 1 3 4 2 5 3 5 3 3 5 2 4 4 4 2 4 3 5 2 4 3 4 3 5 2 4 3 5 2 5 2 5 2 5 2 4 3 4 3 2 6 1 7 1 3 1 2 0 5 6 3 6 3 5 3 5 3 5 3 5 3 5 3 5 3 5 3 5 4 3 5 7 5 5 9 3 4 2 4 2 4 5 1 3 3 10 3 10 3 10 2 11 2 10 4 8 5 9 4 9 3 10 4 9 4 9 3 10 3 10 3 10 4 9 4 9 4 8 0 0 6 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 4 0 5 2 4 1 12 1 10 3 5 7 4 8 4 9 2 10 2 7 0 1 2 1 4 3 2 4 2 6 10 1 10 2 9 3 9 3 2 1 5 4 1 3 3 5 2 11 1 11 1 5 3 6 6 2 10 1 14 2 6 8 1 2 0 6 6 5 9 3 10 2 4 4 3 2 4 4 2 2 4 9 4 10 3 10 3 9 4 8 6 8 4 9 4 9 4 9 4 9 4 9 4 9 4 9 4 9 4 8 6 7 0 0 5 2 3 2 2 3 3 2 3 2 3 2 3 2 3 2 3 2 8 1 3 3 5 4 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 3 3 4 4 1 6 3 4 1 5 1 6 1 6 1 6 3 4 3 4 3 4 3 4 3 4 3 4 3 5 2 4 3 4 3 3 4 3 4 3 4 3 4 3 4 3 3 5 1 6 1 6 1 0 0 1 2 1 1 1 2 1 1 2 1 0 0 2 2 2 1 5 1 1 1 10 3 10 2 7 1 2 4 3 4 2 9 4 4 9 3 5 0 3 3 1 3 4 2 5 3 1 2 6 3 1 2 3 2 1 17 10 2 10 2 11 1 10 0 1 0 4 5 1 1 8 4 5 2 0 0 5 2 5 5 3 5 2 4 3 4 2 4 3 4 4 3 4 3 4 3 4 3 5 2 4 1 0 1 3 2 5 2 4 3 3 3 3 3 3 3 3 3 2 3 3 3 4 2 4 1 12 0 5 4 6 6 3 6 4 5 4 6 2 7 3 6 3 6 3 6 3 6 3 5 5 3 7 2 7 2 3 3 1 4 4 5 6 4 6 5 5 5 4 6 5 5 4 6 4 7 3 7 3 7 4 6 3 6 4 6 4 6 4 6 4 6 4 6 4 2 2 2 4 2 9 1 10 2 8 3 5 2 0 gamera-3.3.3/gamera/0000755000076500000000000000000011755376174013216 5ustar chriswheelgamera-3.3.3/gamera/__init__.py0000644000076500000000000000021111205471450015300 0ustar chriswheelimport __version__ __version__ = __version__.ver __author__ = "Karl MacMillan, Michael Droettboom, Ichiro Fujinaga, Christoph Dalitz" gamera-3.3.3/gamera/__version__.py0000644000076500000000000000001711755376172016045 0ustar chriswheelver = '3.3.3' gamera-3.3.3/gamera/args.py0000644000076500000000000003664411741631157014527 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2010 Ichiro Fujinaga, Michael Droettboom, # Karl MacMillan, Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.gui import has_gui from new import instancemethod import sys, os.path # Python standard library from types import * import util, paths # Gamera specific # the maximum default number (int, float) in argument boxes # necessary because sys.maxint is not accepted by some wxPython widgets DEFAULT_MAX_ARG_NUMBER = 1048576 # 2^20 ###################################################################### # This is a "self-generating" dialog box class NoGUIArgs: def setup(self, *args, **kwargs): raise Exception("No GUI environment available. Cannot display dialog.") def show(self, *args, **kwargs): raise Exception("No GUI environment available. Cannot display dialog.") class Args(NoGUIArgs): # list is a list of "Arg s" def __init__(self, list=[], name="Arguments", function=None, title=None): self.list = util.make_sequence(list) self.valid = 1 self.name = name self.function = function self.title = title def __repr__(self): return "<" + self.__class__.__name__ + ">" def __getitem__(self, i): return self.list[i] index = __getitem__ def __len__(self, i): return len(self.list) ###################################################################### # ARGUMENT TYPES # for allowing None as default argument class CNoneDefault: def __str__(self): return "None" NoneDefault = CNoneDefault() class Arg: default = 0 length = 1 def __init__(self, name): self.name = name if name is not None and not util.is_string_or_unicode(name): raise TypeError("'name' must be a string") self.has_default = False def __repr__(self): return "<" + self.__class__.__name__ + ">" def rest_repr(self, name=False): result = "``%s``" % self.__class__.__name__ if name: result += " *%s*" % self.name if self.has_default: result += " = %s" % str(self.default) return result def register(self, plug, func): pass class Int(Arg): def __init__(self, name=None, range=(-DEFAULT_MAX_ARG_NUMBER, DEFAULT_MAX_ARG_NUMBER), default=None): Arg.__init__(self, name) if not (util.is_sequence(range) and len(range) == 2 and type(range[0]) in (int, float) and type(range[1]) in (int, float)): raise TypeError("'range' must be a 2-tuple of numbers") self.rng = range if default is None: self.has_default = False self.default = 0 else: self.has_default = True self.default = default if not isinstance(self.default,CNoneDefault) and type(self.default) != int: raise TypeError("'default' must be an int") def rest_repr(self, name=False): result = "int" if self.rng != (-DEFAULT_MAX_ARG_NUMBER, DEFAULT_MAX_ARG_NUMBER): result += "(%d, %d)" % tuple([int(x) for x in self.rng]) if name: result += " *%s*" % self.name if self.has_default: if isinstance(self.default,CNoneDefault): result += " = %s" % str(self.default) else: result += " = %d" % self.default return result class Real(Arg): def __init__(self, name=None, range=None, default=None): Arg.__init__(self, name) if range is None: range = (-DEFAULT_MAX_ARG_NUMBER, DEFAULT_MAX_ARG_NUMBER) if not (util.is_sequence(range) and len(range) == 2 and type(range[0]) in (int, float) and type(range[1]) in (int, float)): raise TypeError("'range' must be a 2-tuple of numbers") self.rng = range if default is None: self.has_default = False self.default = 0.0 else: self.has_default = True self.default = default if type(self.default) != float: raise TypeError("'default' must be a float") def rest_repr(self, name=False): result = "float" if self.rng != (-DEFAULT_MAX_ARG_NUMBER, DEFAULT_MAX_ARG_NUMBER): result += "(%.02f, %.02f)" % tuple([float(x) for x in self.rng]) if name: result += " *%s*" % self.name if self.has_default: result += " = %.02f" % self.default return result Float = Real class Complex(Arg): def __init__(self, name=None, default=None): Arg.__init__(self, name) if default is None: self.has_default = False self.default = 0j else: self.has_default = True self.default = default def rest_repr(self, name=False): result = "complex" if name: result += " *%s*" % self.name if self.has_default: result += " = %s" % self.default return result class String(Arg): def __init__(self, name=None, default=None): Arg.__init__(self, name) if default is None: self.has_default = False self.default = '' else: self.has_default = True self.default = default if not util.is_string_or_unicode(self.default): raise TypeError("'default' must be an int") def rest_repr(self, name=False): result = "str" if name: result += " *%s*" % self.name if self.has_default: result += " = %s" % repr(self.default) return result class Class(Arg): def __init__(self, name=None, klass=None, list_of=False, default=None): Arg.__init__(self, name) self.klass = klass self.list_of = bool(list_of) if default is None: self.has_default = False self.default = '' else: self.has_default = True self.default = default def rest_repr(self, name=False): if self.klass is None: result = "object" else: result = "%s" % self.klass.__name__ if name: result += " *%s*" % self.name if self.list_of: result = "[%s]" % result if self.has_default: result += " = %s" % str(self.default) return result class ImageType(Arg): def __init__(self, pixel_types, name=None, list_of=False, default=None): import core Arg.__init__(self, name) if not util.is_sequence(pixel_types): pixel_types = (pixel_types,) if not util.is_homogenous_list(pixel_types, (int,)): raise TypeError("'pixel_types' must be a list of integers.") if not core is None: self.klass = core.ImageBase else: self.klass = None self.pixel_types = pixel_types self.list_of = bool(list_of) if default is None: self.has_default = False self.default = None else: self.has_default = True self.default = default if self.has_default and not isinstance(self.default,CNoneDefault): raise TypeError("'default' can only be NoneDefault") def rest_repr(self, name=False): result = '``Image`` [%s]' % '|'.join([util.get_pixel_type_name(x) for x in self.pixel_types]) if name: result += " *%s*" % self.name if self.list_of: result = "[%s]" % result if self.has_default: result += " = %s" % str(self.default) return result def register(self, plug, func): from gamera import core func = instancemethod(func, None, core.gameracore.Image) setattr(core.ImageBase, plug.__name__, func) class Rect(Arg): def __init__(self, name=None, list_of=False): import core Arg.__init__(self, name) if not core is None: self.klass = core.Rect self.list_of = bool(list_of) def rest_repr(self, name=False): result = Arg.rest_repr(self, name) if self.list_of: return "[%s]" % result return result class Choice(Arg): def __init__(self, name=None, choices=[], default=None): Arg.__init__(self, name) if not util.is_string_or_unicode_list(choices): raise TypeError("'choices' must be a list of strings.") self.choices = choices if default is None: self.has_default = False self.default = 0 else: self.has_default = True self.default = default if not isinstance(self.default,CNoneDefault) and type(self.default) != int: raise TypeError("'default' must be an int") def rest_repr(self, name = False): result = '``Choice`` [%s]' % ('|'.join(self.choices)) if name: result += " *%s*" % self.name if self.has_default: if isinstance(self.default,CNoneDefault): result += " = %s" % str(self.default) else: result += " = %s" % self.choices[self.default] return result class ChoiceString(Arg): def __init__(self, name=None, choices=[], default=None, strict=True): Arg.__init__(self, name) if not util.is_string_or_unicode_list(choices): raise TypeError("'choices' must be a list of strings.") self.choices = choices if default is None: self.has_default = False self.default = choices[0] else: if type(default) != str: raise TypeError("'default' must be a string") if default not in choices: raise ValueError("Given 'default' must be in available 'choices'") self.has_default = True self.default = default self.strict = strict def rest_repr(self, name = False): if self.strict: strict = "(strict)" else: strict = "" result = '``ChoiceString%s`` [%s]' % (strict, '|'.join(self.choices)) if name: result += " *%s*" % self.name if self.has_default: result += " = %s" % self.default return result class _Filename(Arg): def __init__(self, name=None, default="", extension="*.*"): Arg.__init__(self, name) if not util.is_string_or_unicode(default): raise TypeError("'default' must be a string") self.default = default ## if not util.is_string_or_unicode(extension): ## raise TypeError("'extension' must be a string") self.extension = extension class FileOpen(_Filename): pass class FileSave(_Filename): pass class Directory(_Filename): pass class Radio(Arg): def __init__(self, name=None, radio_button=''): Arg.__init__(self, name) self.radio_button = radio_button class Check(Arg): def __init__(self, name=None, check_box='', default=None, enabled=True): Arg.__init__(self, name) if not util.is_string_or_unicode(check_box): raise TypeError("'check_box' must be a string") self.check_box = check_box if default is None: self.has_default = False self.default = False else: self.has_default = True self.default = default self.default = bool(self.default) self.enabled = bool(enabled) def rest_repr(self, name=False): result = '``bool``' if name: result += " *%s*" % self.name if self.has_default: result += " = %s" % str(self.default) return result Bool = Check class Region(Class): def __init__(self, name=None): Class.__init__(self, name, None) class RegionMap(Class): def __init__(self, name=None): Class.__init__(self, name, None) class ImageInfo(Class): def __init__(self, name=None): Class.__init__(self, name, None) class Point(Arg): def __init__(self, name=None, default=None): Arg.__init__(self, name) if default is None: self.has_default = False self.default = (0, 0) else: self.has_default = True self.default = default class FloatPoint(Arg): def __init__(self, name=None, default=None): Arg.__init__(self, name) if default is None: self.has_default = False self.default = (0.0, 0.0) else: self.has_default = True self.default = default class Dim(Point): pass class _Vector(Class): def __init__(self, name=None, default=None, length=-1): Class.__init__(self, name, self.klass) if type(length) != int: raise TypeError("'length' must be an int") self.length = length if default is None: self.default = [] self.has_default = False else: self.default = default self.has_default = True def rest_repr(self, name=False): result = "``%s``" % self.__class__.__name__ if name: result += " *%s*" % self.name if self.has_default: result += " = %s" % str(self.default) return result class FloatVector(_Vector): klass = float typecode = "d" class IntVector(_Vector): klass = int typecode = "i" class ComplexVector(_Vector): klass = complex typecode = None class ImageList(Class): def __init__(self, name=None, default=None): Class.__init__(self, name=name, klass=None, list_of=True, default=default) class Pixel(Class): """Uses these to pass pixel values into a plugin. The PixelType must always match the type of the "self" image.""" def __init__(self, name=None, default=None): Class.__init__(self, name) if default is None: self.has_default = False else: self.has_default = True self.default = default def rest_repr(self, name=False): result = "Pixel" if name: result += " *%s*" % self.name if self.has_default: result += " = %s" % str(self.default) return result class Info(Arg): pass class PointVector(Class): def __init__(self, name=None): Class.__init__(self, name, None, True) class Wizard: def show(self, dialog): dialog_history = ['start', dialog] next_dialog = dialog while next_dialog != None: if next_dialog == 'start': return result = next_dialog.show(self.parent, self.locals, wizard=1) if not result is None: next_dialog = getattr(self, next_dialog.function)(*next_dialog.get_args()) if next_dialog != dialog_history[-1]: dialog_history.append(next_dialog) else: next_dialog = dialog_history[-2] dialog_history = dialog_history[0:-1] self.done() __all__ = 'Args Int Real Float Complex String Class ImageType Rect Choice FileOpen FileSave Directory Radio Check Region RegionMap ImageInfo FloatVector IntVector ComplexVector ImageList Info Wizard Pixel PointVector _Vector ChoiceString Point FloatPoint Dim Bool'.split() ___mixin_locals = locals() def mixin(module, name): for cls_name in __all__ + ["Arg"]: cls = ___mixin_locals[cls_name] if module.has_key(cls_name): cls.__bases__ = tuple([module[cls_name]] + list(cls.__bases__)) sys.stdout.write("\n") gamera-3.3.3/gamera/args_wrappers.py0000644000076500000000000003302111747510565016441 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Mixin classes to add wrapper-generation support for arguments list import re from enums import * import util class Arg: arg_format = 'O' convert_from_PyObject = False multiple = False delete_cpp = False uid = 0 def __getitem__(self, attr): return getattr(self, attr) def __iter__(self): raise RuntimeError() def _get_symbol(self): return re.sub(r"\s", "_", self.name) + '_arg' symbol = property(_get_symbol) def _get_pysymbol(self): if self.convert_from_PyObject: return re.sub(r"\s", "_", self.name) + '_pyarg' else: return self.symbol pysymbol = property(_get_pysymbol) def declare(self): if self.name == None: self.name = "_%08d" % Arg.uid Arg.uid += 1 if self.name == 'return' and hasattr(self, 'return_type'): result = "%s %s;\n" % (self.return_type, self.symbol) else: result = "%s %s;\n" % (self.c_type, self.symbol) if self.convert_from_PyObject: result += "PyObject* %s;\n" % self.pysymbol return result def from_python(self): return "" def _do_call(self, function, output_args): if function.progress_bar: output_args.append('ProgressBar((char *)"%s")' % function.progress_bar); if function.feature_function: return "%s(%s, feature_buffer);" % (function.__name__, ", ".join(output_args)) else: if function.return_type != None: lhs = function.return_type.symbol + " = " else: lhs = "" rhs = "%s(%s)" % (function.__name__, ", ".join(output_args)) if function.return_type.__class__.__name__ == "Pixel": rhs = "pixel_to_python(%s)" % rhs return "%s%s;\n" % (lhs, rhs) def call(self, function, args, output_args, limit_choices=None): if len(args): return args[0].call(function, args[1:], output_args + [self.symbol], limit_choices) else: return self._do_call(function, output_args + [self.symbol]) def delete(self): if self.delete_cpp: return "delete %(symbol)s;" % self else: return "" class Int(Arg): arg_format = 'i' c_type = 'int' def to_python(self): return '%(pysymbol)s = PyInt_FromLong((long)%(symbol)s);' % self Choice = Check = Int class Float(Arg): arg_format = 'd' c_type = 'double' def to_python(self): return '%(pysymbol)s = PyFloat_FromDouble((double)%(symbol)s);' % self class Complex(Arg): arg_format = 'D' c_type = 'Py_complex' def to_python(self): return '''%(pysymbol)s = PyComplex_FromDoubles(%(symbol)s.real(), %(symbol)s.imag());''' % self def from_python(self): return '''Py_complex %(pysymbol)s_temp = PyComplex_AsCComplex(%(pysymbol)s); %(symbol)s = ComplexPixel(%(pysymbol)s_temp.real, %(pysymbol)s_temp.imag);''' class String(Arg): arg_format = 's' c_type = 'char*' return_type = 'std::string' def to_python(self): return "%(pysymbol)s = PyString_FromStringAndSize(%(symbol)s.data(), %(symbol)s.size());" % self FileOpen = FileSave = Directory = ChoiceString = String class ImageType(Arg): c_type = 'Image*' convert_from_PyObject = True multiple = True def from_python(self): return """if (!is_ImageObject(%(pysymbol)s)) { PyErr_SetString(PyExc_TypeError, "Argument '%(name)s' must be an image"); return 0; } %(symbol)s = ((Image*)((RectObject*)%(pysymbol)s)->m_x); image_get_fv(%(pysymbol)s, &%(symbol)s->features, &%(symbol)s->features_len); """ % self def to_python(self): return "%(pysymbol)s = create_ImageObject(%(symbol)s);" % self def call(self, function, args, output_args, limit_choices=None): if function.image_types_must_match and limit_choices is not None: choices = self._get_choices_for_pixel_type(limit_choices) else: choices = self._get_choices() result = "switch(get_image_combination(%(pysymbol)s)) {\n" % self for choice, pixel_type in choices: result += "case %s:\n" % choice.upper() new_output_args = output_args + ["*((%s*)%s)" % (choice, self.symbol)] if len(args) == 0: result += self._do_call(function, new_output_args) else: if limit_choices is None: result += args[0].call(function, args[1:], new_output_args, pixel_type) else: result += args[0].call(function, args[1:], new_output_args, limit_choices) result += "break;\n" result += "default:\n" acceptable_types = [util.get_pixel_type_name(y).upper() for x, y in choices] if len(acceptable_types) >= 2: phrase = "values are" acceptable_types[-1] = "and " + acceptable_types[-1] else: phrase = "value is" acceptable_types = ", ".join(acceptable_types) result += ('PyErr_Format(PyExc_TypeError,' '"The \'%s\' argument of \'%s\' can not have pixel type \'%%s\'. ' 'Acceptable %s %s."' ', get_pixel_type_name(%s));\nreturn 0;\n' % (self.name, function.__name__, phrase, acceptable_types, self.pysymbol)) result += "}\n" return result def _get_choices(self): result = [] pixel_types = list(self.pixel_types[:]) pixel_types.sort() for type in pixel_types: result.extend(self._get_choices_for_pixel_type(type)) return result def _get_choices_for_pixel_type(self, pixel_type): if pixel_type == ONEBIT: result = ["OneBitImageView", "Cc", "OneBitRleImageView", "RleCc", "MlCc"] else: result = [util.get_pixel_type_name(pixel_type) + "ImageView"] return [(x, pixel_type) for x in result] class Rect(Arg): c_type = 'Rect*' convert_from_PyObject = True def from_python(self): return """ if (!is_RectObject(%(pysymbol)s)) { PyErr_SetString(PyExc_TypeError, "Argument '%(name)s' must be a Rect"); return 0; } %(symbol)s = (((RectObject*)%(pysymbol)s)->m_x); """ % self def to_python(self): return """ return_pyarg = create_RectObject(*%(symbol)s); delete %(symbol)s;""" % self #return "%(pysymbol)s = create_RectObject(%(symbol)s);" % self class Region(Arg): c_type = 'Region*' convert_from_PyObject = True def from_python(self): return """ if (!is_RegionObject(%(pysymbol)s)) { PyErr_SetString(PyExc_TypeError, "Argument '%(name)s' must be a Region"); return 0; } %(symbol)s = (Region*)((RectObect*)%(pysymbol)s)->m_x;""" % self def to_python(self): return """ return_pyarg = create_RegionObject(*%(symbol)s); delete %(symbol)s;""" % self class RegionMap(Arg): c_type = 'RegionMap*' convert_from_PyObject = True def from_python(self): return """ if (!is_RegionMapObject(%(pysymbol)s)) { PyErr_SetString(PyExc_TypeError, "Argument '%(name)s' must be a RegionMap."); return 0; } %(symbol)s = (RegionMap*)((RegionMapObect*)%(pysymbol)s)->m_x;""" % self def to_python(self): return """ return_pyarg = create_RegionMapObject(*%(symbol)s); delete %(symbol)s;""" % self class ImageList(Arg): c_type = 'ImageVector' return_type = 'std::list*' convert_from_PyObject = True def from_python(self): return """ const char* type_error_%(name)s = "Argument '%(name)s' must be an iterable of images."; PyObject* %(pysymbol)s_seq = PySequence_Fast(%(pysymbol)s, type_error_%(name)s); if (%(pysymbol)s_seq == NULL) return 0; int %(symbol)s_size = PySequence_Fast_GET_SIZE(%(pysymbol)s_seq); %(symbol)s.resize(%(symbol)s_size); for (int i=0; i < %(symbol)s_size; ++i) { PyObject *element = PySequence_Fast_GET_ITEM(%(pysymbol)s_seq, i); if (!is_ImageObject(element)) { PyErr_SetString(PyExc_TypeError, type_error_%(name)s); return 0; } %(symbol)s[i] = std::pair((Image*)(((RectObject*)element)->m_x), get_image_combination(element)); image_get_fv(element, &%(symbol)s[i].first->features, &%(symbol)s[i].first->features_len); } Py_DECREF(%(pysymbol)s_seq);""" % self def to_python(self): return """ %(pysymbol)s = ImageList_to_python(%(symbol)s); delete %(symbol)s; """ % self class Class(Arg): arg_format = 'O' c_type = 'PyObject*' convert_from_PyObject = True def from_python(self): return "%(symbol)s = %(pysymbol)s;" % self def to_python(self): return "%(pysymbol)s = %(symbol)s;" % self class IntVector(Arg): arg_format = 'O' convert_from_PyObject = True c_type = 'IntVector*' delete_cpp = True def from_python(self): return """ %(symbol)s = IntVector_from_python(%(pysymbol)s); if (%(symbol)s == NULL) return 0; """ % self def to_python(self): return """ %(pysymbol)s = IntVector_to_python(%(symbol)s); delete %(symbol)s; """ % self class FloatVector(Arg): arg_format = 'O' convert_from_PyObject = True c_type = 'FloatVector*' delete_cpp = True def from_python(self): return """ %(symbol)s = FloatVector_from_python(%(pysymbol)s); if (%(symbol)s == NULL) return 0; """ % self def to_python(self): return """ %(pysymbol)s = FloatVector_to_python(%(symbol)s); delete %(symbol)s; """ % self class ComplexVector(Arg): arg_format = 'O' convert_from_PyObject = True c_type = 'ComplexVector*' delete_cpp = True def from_python(self): return """ %(symbol)s = ComplexVector_from_python(%(pysymbol)s); if (%(symbol)s == NULL) return 0; """ % self def to_python(self): return """ %(pysymbol)s = ComplexVector_to_python(%(symbol)s); delete %(symbol)s; """ % self class Pixel(Arg): def from_python(self): return '' def call(self, function, args, output_args, limit_choices=None): if limit_choices is None: raise RuntimeError("You can not create a plugin that takes a Pixel argument that does not have a self type") pixel_type = limit_choices new_output_args = (output_args + ["pixel_from_python<%sPixel>::convert(%s)" % (util.get_pixel_type_name(pixel_type), self.pysymbol)]) if len(args) == 0: return self._do_call(function, new_output_args) else: return args[0].call(function, args[1:], new_output_args, limit_choices) class Point(Arg): c_type = "Point" delete_cpp = False convert_from_PyObject = True def from_python(self): return """ try { %(symbol)s = coerce_Point(%(pysymbol)s); } catch (std::invalid_argument e) { PyErr_SetString(PyExc_TypeError, "Argument '%(name)s' must be a Point, or convertible to a Point"); return 0; } """ % self def to_python(self): return """%(pysymbol)s = create_PointObject(%(symbol)s);""" % self class FloatPoint(Arg): c_type = "FloatPoint" delete_cpp = False convert_from_PyObject = True def from_python(self): return """ try { %(symbol)s = coerce_FloatPoint(%(pysymbol)s); } catch (std::invalid_argument e) { PyErr_SetString(PyExc_TypeError, "Argument '%(name)s' must be a FloatPoint object, or convertible to a FloatPoint object"); return 0; } """ % self def to_python(self): return """%(pysymbol)s = create_FloatPointObject(%(symbol)s);""" % self class Dim(Arg): c_type = 'Dim' convert_from_PyObject = True def from_python(self): return """ if (!is_DimObject(%(pysymbol)s)) { PyErr_SetString(PyExc_TypeError, "Argument '%(name)s' must be a Dim object"); return 0; } %(symbol)s = *((Dim*)((DimObject*)%(pysymbol)s)->m_x);""" % self def to_python(self): return """ return_pyarg = create_DimObject(*%(symbol)s); delete %(symbol)s;""" % self class PointVector(Arg): arg_format = 'O' convert_from_PyObject = True c_type = 'PointVector*' delete_cpp = True def from_python(self): return """ %(symbol)s = PointVector_from_python(%(pysymbol)s); """ % self def to_python(self): return """ %(pysymbol)s = PointVector_to_python(%(symbol)s); delete %(symbol)s; """ % self class ImageInfo(Arg): arg_format = "O"; c_type = 'ImageInfo*' convert_from_PyObject = True def to_python(self): return "%(pysymbol)s = create_ImageInfoObject(%(symbol)s);""" % self from gamera import args args.mixin(locals(), "C++ Wrappers") gamera-3.3.3/gamera/backport/0000755000076500000000000000000011755376174015023 5ustar chriswheelgamera-3.3.3/gamera/backport/__init__.py0000644000076500000000000000000110714675714017117 0ustar chriswheel gamera-3.3.3/gamera/backport/config.py0000755000076500000000000000537411652050143016633 0ustar chriswheel""" Provides an extended option parser that loads options from a file and then overrides them with options on the command line Copyright (C) 2001-2005 Michael Droettboom """ ## This program is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License ## as published by the Free Software Foundation; either version 2 ## of the License, or (at your option) any later version. ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from optparse import OptionParser, make_option, OptionConflictError import ConfigParser from os.path import isfile, expanduser, split, join from sys import platform class ConfigOptionParser(OptionParser): default_options = [] def __init__(self, *args, **kwargs): OptionParser.__init__(self, *args, **kwargs) self.add_options(self.default_options) self._cache = None def add_option(self, *args, **kwargs): try: OptionParser.add_option(self, *args, **kwargs) except OptionConflictError: pass def add_options(self, l): for x in l: self.add_option(x) def get_config_files(self): return [] def parse_args(self, args=[]): if self._cache is None: options, args = OptionParser.parse_args(self, args) files = self.get_config_files() config_parser = ConfigParser.RawConfigParser() config_parser.read(files) for section in config_parser.sections(): for key, val in config_parser.items(section): if self.has_option("--" + key): option = self.get_option("--" + key) if (option.help.startswith("[%s]" % section) and getattr(options, option.dest) == None): option.process("", val, self.values, self) self._cache = (options, args) return self._cache def get(self, item): if self._cache is None: self.parse_args() return getattr(self._cache[0], item) def set(self, item, val): if self._cache is None: self.parse_args() return setattr(self._cache[0], item, val) def reparse_args(self): self._cache = None return self.parse_args() def get_free_args(self): if self._cache is None: self.parse_args() return self._cache[1] __all__ = """ make_option ConfigOptionParser """.split() gamera-3.3.3/gamera/backport/ConfigParser.py0000644000076500000000000005320110714675714017754 0ustar chriswheel"""Configuration file parser. A setup file consists of sections, lead by a "[section]" header, and followed by "name: value" entries, with continuations and such in the style of RFC 822. The option values can contain format strings which refer to other values in the same section, or values in a special [DEFAULT] section. For example: something: %(dir)s/whatever would resolve the "%(dir)s" to the value of dir. All reference expansions are done late, on demand. Intrinsic defaults can be specified by passing them into the ConfigParser constructor as a dictionary. class: ConfigParser -- responsible for parsing a list of configuration files, and managing the parsed database. methods: __init__(defaults=None) create the parser and specify a dictionary of intrinsic defaults. The keys must be strings, the values must be appropriate for %()s string interpolation. Note that `__name__' is always an intrinsic default; it's value is the section's name. sections() return all the configuration section names, sans DEFAULT has_section(section) return whether the given section exists has_option(section, option) return whether the given option exists in the given section options(section) return list of configuration options for the named section read(filenames) read and parse the list of named configuration files, given by name. A single filename is also allowed. Non-existing files are ignored. readfp(fp, filename=None) read and parse one configuration file, given as a file object. The filename defaults to fp.name; it is only used in error messages (if fp has no `name' attribute, the string `' is used). get(section, option, raw=False, vars=None) return a string value for the named option. All % interpolations are expanded in the return values, based on the defaults passed into the constructor and the DEFAULT section. Additional substitutions may be provided using the `vars' argument, which must be a dictionary whose contents override any pre-existing defaults. getint(section, options) like get(), but convert value to an integer getfloat(section, options) like get(), but convert value to a float getboolean(section, options) like get(), but convert value to a boolean (currently case insensitively defined as 0, false, no, off for False, and 1, true, yes, on for True). Returns False or True. items(section, raw=False, vars=None) return a list of tuples with (name, value) for each option in the section. remove_section(section) remove the given file section and all its options remove_option(section, option) remove the given option from the given section set(section, option, value) set the given option write(fp) write the configuration state in .ini format """ import re __all__ = ["NoSectionError", "DuplicateSectionError", "NoOptionError", "InterpolationError", "InterpolationDepthError", "InterpolationSyntaxError", "ParsingError", "MissingSectionHeaderError", "ConfigParser", "SafeConfigParser", "DEFAULTSECT", "MAX_INTERPOLATION_DEPTH"] DEFAULTSECT = "DEFAULT" MAX_INTERPOLATION_DEPTH = 10 # exception classes class Error(Exception): """Base class for ConfigParser exceptions.""" def __init__(self, msg=''): self.message = msg Exception.__init__(self, msg) def __repr__(self): return self.message __str__ = __repr__ class NoSectionError(Error): """Raised when no section matches a requested option.""" def __init__(self, section): Error.__init__(self, 'No section: ' + `section`) self.section = section class DuplicateSectionError(Error): """Raised when a section is multiply-created.""" def __init__(self, section): Error.__init__(self, "Section %r already exists" % section) self.section = section class NoOptionError(Error): """A requested option was not found.""" def __init__(self, option, section): Error.__init__(self, "No option %r in section: %r" % (option, section)) self.option = option self.section = section class InterpolationError(Error): """Base class for interpolation-related exceptions.""" def __init__(self, option, section, msg): Error.__init__(self, msg) self.option = option self.section = section class InterpolationMissingOptionError(InterpolationError): """A string substitution required a setting which was not available.""" def __init__(self, option, section, rawval, reference): msg = ("Bad value substitution:\n" "\tsection: [%s]\n" "\toption : %s\n" "\tkey : %s\n" "\trawval : %s\n" % (section, option, reference, rawval)) InterpolationError.__init__(self, option, section, msg) self.reference = reference class InterpolationSyntaxError(InterpolationError): """Raised when the source text into which substitutions are made does not conform to the required syntax.""" class InterpolationDepthError(InterpolationError): """Raised when substitutions are nested too deeply.""" def __init__(self, option, section, rawval): msg = ("Value interpolation too deeply recursive:\n" "\tsection: [%s]\n" "\toption : %s\n" "\trawval : %s\n" % (section, option, rawval)) InterpolationError.__init__(self, option, section, msg) class ParsingError(Error): """Raised when a configuration file does not follow legal syntax.""" def __init__(self, filename): Error.__init__(self, 'File contains parsing errors: %s' % filename) self.filename = filename self.errors = [] def append(self, lineno, line): self.errors.append((lineno, line)) self.message += '\n\t[line %2d]: %s' % (lineno, line) class MissingSectionHeaderError(ParsingError): """Raised when a key-value pair is found before any section header.""" def __init__(self, filename, lineno, line): Error.__init__( self, 'File contains no section headers.\nfile: %s, line: %d\n%s' % (filename, lineno, line)) self.filename = filename self.lineno = lineno self.line = line class RawConfigParser: def __init__(self, defaults=None): self._sections = {} if defaults is None: self._defaults = {} else: self._defaults = defaults def defaults(self): return self._defaults def sections(self): """Return a list of section names, excluding [DEFAULT]""" # self._sections will never have [DEFAULT] in it return self._sections.keys() def add_section(self, section): """Create a new section in the configuration. Raise DuplicateSectionError if a section by the specified name already exists. """ if section in self._sections: raise DuplicateSectionError(section) self._sections[section] = {} def has_section(self, section): """Indicate whether the named section is present in the configuration. The DEFAULT section is not acknowledged. """ return section in self._sections def options(self, section): """Return a list of option names for the given section name.""" try: opts = self._sections[section].copy() except KeyError: raise NoSectionError(section) opts.update(self._defaults) if '__name__' in opts: del opts['__name__'] return opts.keys() def read(self, filenames): """Read and parse a filename or a list of filenames. Files that cannot be opened are silently ignored; this is designed so that you can specify a list of potential configuration file locations (e.g. current directory, user's home directory, systemwide directory), and all existing configuration files in the list will be read. A single filename may also be given. """ if type(filenames) in (type(""), type(u"")): filenames = [filenames] for filename in filenames: try: fp = open(filename) except IOError: continue self._read(fp, filename) fp.close() def readfp(self, fp, filename=None): """Like read() but the argument must be a file-like object. The `fp' argument must have a `readline' method. Optional second argument is the `filename', which if not given, is taken from fp.name. If fp has no `name' attribute, `' is used. """ if filename is None: try: filename = fp.name except AttributeError: filename = '' self._read(fp, filename) def get(self, section, option): opt = self.optionxform(option) if section not in self._sections: if section != DEFAULTSECT: raise NoSectionError(section) if opt in self._defaults: return self._defaults[opt] else: raise NoOptionError(option, section) elif opt in self._sections[section]: return self._sections[section][opt] elif opt in self._defaults: return self._defaults[opt] else: raise NoOptionError(option, section) def items(self, section): try: d2 = self._sections[section] except KeyError: if section != DEFAULTSECT: raise NoSectionError(section) d2 = {} d = self._defaults.copy() d.update(d2) if "__name__" in d: del d["__name__"] return d.items() def _get(self, section, conv, option): return conv(self.get(section, option)) def getint(self, section, option): return self._get(section, int, option) def getfloat(self, section, option): return self._get(section, float, option) _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True, '0': False, 'no': False, 'false': False, 'off': False} def getboolean(self, section, option): v = self.get(section, option) if v.lower() not in self._boolean_states: raise ValueError, 'Not a boolean: %s' % v return self._boolean_states[v.lower()] def optionxform(self, optionstr): return optionstr.lower() def has_option(self, section, option): """Check for the existence of a given option in a given section.""" if not section or section == DEFAULTSECT: option = self.optionxform(option) return option in self._defaults elif section not in self._sections: return False else: option = self.optionxform(option) return (option in self._sections[section] or option in self._defaults) def set(self, section, option, value): """Set an option.""" if not section or section == DEFAULTSECT: sectdict = self._defaults else: try: sectdict = self._sections[section] except KeyError: raise NoSectionError(section) sectdict[self.optionxform(option)] = value def write(self, fp): """Write an .ini-format representation of the configuration state.""" if self._defaults: fp.write("[%s]\n" % DEFAULTSECT) for (key, value) in self._defaults.items(): fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) fp.write("\n") for section in self._sections: fp.write("[%s]\n" % section) for (key, value) in self._sections[section].items(): if key != "__name__": fp.write("%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) fp.write("\n") def remove_option(self, section, option): """Remove an option.""" if not section or section == DEFAULTSECT: sectdict = self._defaults else: try: sectdict = self._sections[section] except KeyError: raise NoSectionError(section) option = self.optionxform(option) existed = option in sectdict if existed: del sectdict[option] return existed def remove_section(self, section): """Remove a file section.""" existed = section in self._sections if existed: del self._sections[section] return existed # # Regular expressions for parsing section headers and options. # SECTCRE = re.compile( r'\[' # [ r'(?P
[^]]+)' # very permissive! r'\]' # ] ) OPTCRE = re.compile( r'(?P
 tags
   def docstring_to_html(docstring):
      return "
%s
" % docstring else: # Some docstrings may contain SilverCity ".. code::" blocks. # Since wx.html.HtmlWindow does not support CSS, it therefore # can not properly handle SilverCity's syntax coloring. So instead, # we create a "dummy" code block handler that simply uses
   def code_block(name, arguments, options, content, lineno,
                  content_offset, block_text, state, state_machine ):
      html = '\n
%s
\n' % "\n".join(content) raw = docutils.nodes.raw('', html, format = 'html') return [raw] code_block.arguments = (1,0,0) code_block.options = {'language' : docutils.parsers.rst.directives.unchanged } code_block.content = 1 docutils.parsers.rst.directives.register_directive( 'code', code_block ) def docstring_to_html(docstring): try: corrected = docstring.replace("*args", "\*args") corrected = corrected.replace("**kwargs", "\*\*kwargs") html = docutils.core.publish_string(corrected, writer_name="html") except Exception, e: html = '''
%s

%s
''' % (docstring, str(e)) return html.decode("utf-8") gamera-3.3.3/gamera/gui/has_gui.py0000644000076500000000000000221411652050143015747 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # (NO_GUI, WX_GUI, CURSES_GUI) = tuple(range(3)) has_gui = NO_GUI class NullGui: class NullMethod: def __call__(*args, **kwargs): pass def __getattr__(self, attr): return self.NullMethod() gui = NullGui() gamera-3.3.3/gamera/gui/icon_display.py0000644000076500000000000004310011652050143017004 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import os.path import wx from gamera.core import * # Gamera specific from gamera import paths, util, classify, gamera_xml from gamera.gui import image_menu, var_name, gamera_icons, gui_util, has_gui from gamera.gui.matplotlib_support import * import array, inspect ###################################################################### class IconDisplayDropTarget(wx.FileDropTarget, wx.PyDropTarget): def __init__(self, parent): wx.FileDropTarget.__init__(self) self.parent = parent def OnDropFiles(self, x, y, filenames): for filename in filenames: if os.path.exists(filename): filename = os.path.normpath(os.path.abspath(filename)) if filename.endswith('.xml') or filename.endswith('.xml.gz'): if open(filename, 'r').read(4) == "= (2, 5) and wx.Platform == '__WXGTK__'): style |= wx.LC_ALIGN_TOP wx.ListCtrl.__init__(self, parent , -1, (0,0), (-1,-1), style) self.data = {} self.locals = {} self.modules = {} self.main_win = main_win self.currentIcon = None self.currentIconName = None self.init_events() self.SetToolTip(wx.ToolTip( 'Double-click to display.\n' + 'Right-click to perform functions.\n')) self.help_mode = 0 self.dt = IconDisplayDropTarget(self) self.dt.display = self self.SetDropTarget(self.dt) self.il = wx.ImageList(32, 32) self.classes = [] for klass in builtin_icon_types: self.add_class(klass) if wx.Platform == '__WXMAC__': self.AssignImageList(self.il, wx.IMAGE_LIST_NORMAL) else: self.AssignImageList(self.il, wx.IMAGE_LIST_SMALL) def add_class(self, icon_description): add_it = 1 for klass in self.classes: if klass[0] == icon_description: add_it = 0 break if add_it: icon = self.il.AddIcon(icon_description.get_icon()) self.classes.append((icon_description, icon)) def init_events(self): tID = self.GetId() wx.EVT_LIST_BEGIN_DRAG(self, tID, self.OnMouseDown) wx.EVT_LEFT_DCLICK(self, self.OnDoubleClick) wx.EVT_LIST_ITEM_SELECTED(self, tID, self.OnItemSelected) wx.EVT_LIST_ITEM_ACTIVATED(self, tID, self.OnItemSelected) wx.EVT_LIST_ITEM_RIGHT_CLICK(self, tID, self.OnRightClick) wx.EVT_CHAR(self, self.OnKeyPress) def add_icon(self, label, data, icon): index = self.GetItemCount() data.index = index self.data[label] = data self.InsertImageStringItem(index, label, icon) def refresh_icon(self, key, klass, data, icon_num): icon = self.data[key] index = icon.index del icon.data if 'extra_methods' in icon.__dict__: del icon.extra_methods obj = klass(key, data, index) self.data[key] = obj self.SetStringItem(index, 0, key, icon_num) def remove_icon(self, key): if self.data.has_key(key): icon = self.data[key] del icon.data if 'extra_methods' in icon.__dict__: del icon.extra_methods index = icon.index self.DeleteItem(index) del self.data[key] for i in self.data.values(): if i.index > index: i.index = i.index - 1 if index < self.GetItemCount(): next = index else: next = self.GetItemCount() - 1 if next >= 0: self.SetItemState( next, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) def update_icons(self, locals=None): if locals != None: self.locals = locals okay = [] for key, val in self.locals.items(): t = None for klass, icon in self.classes: try: if klass.check(val): t = klass break except: pass if t != None: if self.data.has_key(key): self.refresh_icon(key, t, val, icon) else: obj = t(key, val, 0) self.add_icon(key, obj, icon) okay.append(key) elif self.data.has_key(key): self.remove_icon(key) for i in self.data.keys(): if i not in okay: self.remove_icon(i) def find_icon(self, index): for i in self.data.values(): if i.index == index: return i return None def OnItemSelected(self, event): self.currentIcon = self.find_icon(event.m_itemIndex) def OnRightClick(self, event): index = event.GetIndex() if index < 0 or index >= self.GetItemCount(): event.Skip() return for i in range(self.GetItemCount()): self.SetItemState(i, 0, wx.LIST_STATE_SELECTED) self.SetItemState(index, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) currentIcon = self.find_icon(index) if currentIcon: try: currentIcon.right_click(self, event, self.shell) except Exception, e: gui_util.message(str(e)) event.Skip() def OnDoubleClick(self, event): if self.currentIcon: try: source = self.currentIcon.double_click() except Exception, e: gui_util.message(str(e)) else: if not source is None: source = source.split("\n") for s in source: self.shell.run(s) def OnKeyPress(self,event): keyID = event.GetKeyCode() if self.currentIcon: if keyID in (127, 8): try: source = self.currentIcon.delete_key() except Exception, e: gui_util.message(str(e)) else: self.currentIcon = None elif(keyID==19): try: source = self.currentIcon.control_s() except Exception, e: gui_util.message(str(e)) else: return if not source is None: self.shell.run(source) def OnMouseDown(self, event): if self.currentIcon: source = self.currentIcon.drag() if source is not None: typename, source = source data = wx.CustomDataObject(wx.CustomDataFormat(typename)) data.SetData(source) icon = self.currentIcon.get_icon() drop_source = wx.DropSource(self, icon, icon, icon) drop_source.SetData(data) result = drop_source.DoDragDrop(True) ###################################################################### # Standard icons for core Gamera class CustomIcon: is_custom_icon_description = True extra_methods = {} def __init__(self, label_, data_, index_): self.label = label_ self.data = data_ self.index = index_ def register(cls): if has_gui.gui.TopLevel() != None: icon_display = main_win = has_gui.gui.TopLevel().icon_display icon_display.add_class(cls) register = classmethod(register) def to_icon(bitmap): if has_gui.has_gui: return wx.IconFromBitmap(bitmap) else: return None to_icon = staticmethod(to_icon) def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconImageUnknownBitmap()) get_icon = staticmethod(get_icon) def check(data): return 1 check = staticmethod(check) def double_click(self): return '%s.display("%s")' % (self.label, self.label) def right_click(self, parent, event, shell): if not has_gui.has_gui: return x,y = event.GetPoint() self._shell = shell image_menu.ImageMenu( parent, x, y, self.data, self.label, shell, extra_methods = self.extra_methods) self._shell = None def delete_key(self): return "del %s" % self.label def control_s(self): from gamera.plugins import image_utilities call = image_utilities.image_save.args.show() if call is None: return None return self.label + ".image_save(r\'" + call[0] + "\'," + str(call[1]) + ")" def drag(self): return None class CIComplexImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconImageComplexBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data,Image) and data.data.pixel_type == COMPLEX check = staticmethod(check) class CIRGBImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconImageRgbBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, Image) and data.data.pixel_type == RGB check = staticmethod(check) class CIGreyScaleImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconImageGreyBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, Image) and data.data.pixel_type == GREYSCALE check = staticmethod(check) class CIGrey16Image(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconImageGrey16Bitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, Image) and data.data.pixel_type == GREY16 check = staticmethod(check) class CIFloatImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconImageFloatBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, Image) and data.data.pixel_type == FLOAT check = staticmethod(check) class CIOneBitImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconImageBinaryBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, Image) and data.data.pixel_type == ONEBIT check = staticmethod(check) class CIRGBSubImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconSubimageRgbBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, SubImage) and data.data.pixel_type == RGB check = staticmethod(check) class CIGreyScaleSubImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconSubimageGreyBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, SubImage) and data.data.pixel_type == GREYSCALE check = staticmethod(check) class CIGrey16SubImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconSubimageGrey16Bitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, SubImage) and data.data.pixel_type == GREY16 check = staticmethod(check) class CIFloatSubImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconSubimageFloatBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, SubImage) and data.data.pixel_type == FLOAT check = staticmethod(check) class CIOneBitSubImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconSubimageBinaryBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, SubImage) and data.data.pixel_type == ONEBIT check = staticmethod(check) class CIComplexSubImage(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconSubimageComplexBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, SubImage) and data.data.pixel_type == COMPLEX check = staticmethod(check) class CICC(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconCcBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, Cc) check = staticmethod(check) class CIImageList(CustomIcon): def __init__(self, *args): CustomIcon.__init__(self, *args) self.extra_methods = { 'List': {'XML': {'glyphs_to_xml': self.glyphs_to_xml}, 'Features': {'generate_features_list' : self.generate_features}}} def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconImageListBitmap()) get_icon = staticmethod(get_icon) def check(data): return util.is_homogeneous_image_list(data) check = staticmethod(check) def glyphs_to_xml(self, event): from gamera import gamera_xml filename = gui_util.save_file_dialog(None, gamera_xml.extensions) if filename != None: gamera_xml.glyphs_to_xml(filename, self.data) def generate_features(self, event): import gamera.core ff = gamera.core.Image.get_feature_functions() progress = gamera.util.ProgressFactory( "Generating features...", len(self.data)) try: for glyph in self.data: glyph.generate_features(ff) progress.step() finally: progress.kill() def double_click(self): return 'display_multi(%s)' % self.label def control_s(self): pass class CIInteractiveClassifier(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconClassifyBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, classify.InteractiveClassifier) check = staticmethod(check) def double_click(self): return '%s.display()' % (self.label) def right_click(self, *args): pass def control_s(self): pass class CINonInteractiveClassifier(CustomIcon): def get_icon(): return wx.IconFromBitmap(gamera_icons.getIconNoninterClassifyBitmap()) get_icon = staticmethod(get_icon) def check(data): return isinstance(data, classify.NonInteractiveClassifier) check = staticmethod(check) def double_click(self): pass def right_click(self, *args): pass def control_s(self): pass class _CIVector(CustomIcon): def check(cls, data): if data is ALL: return False if (isinstance(data, array.array) and data.typecode == cls.typecode): return True try: it = iter(data) except Exception, e: return False else: if not len(data): return false good = True try: for x in data: if not isinstance(x, cls.klass): good = False break except Exception, e: print e return False else: return good check = classmethod(check) def double_click(self): from gamera.gui import matplotlib_support if matplotlib_support.matplotlib_installed: name = var_name.get("figure") if name != None: return "%s = plot(%s)" % (name, self.label) else: gui_util.message("Plotting is not supported because the optional matplotlib library\n" "could not be found.\n\n" "Download and install matplotlib from matplotlib.sourceforge.net,\n" "then restart Gamera to have plotting support.") def right_click(self, *args): pass def control_s(self): pass def drag(self): return ("Vector", str(list(self.data))) class CIIntVector(_CIVector): typecode = 'i' klass = int def get_icon(): return wx.IconFromBitmap(gamera_icons.getIntVectorBitmap()) get_icon = staticmethod(get_icon) class CIFloatVector(_CIVector): typecode = 'd' klass = float def get_icon(): return wx.IconFromBitmap(gamera_icons.getFloatVectorBitmap()) get_icon = staticmethod(get_icon) class CIComplexVector(_CIVector): typecode = None klass = complex def get_icon(): return wx.IconFromBitmap(gamera_icons.getComplexVectorBitmap()) get_icon = staticmethod(get_icon) builtin_icon_types = ( CICC, CIRGBImage, CIComplexImage, CIGreyScaleImage, CIGrey16Image, CIFloatImage, CIOneBitImage, CIRGBSubImage, CIGreyScaleSubImage, CIGrey16SubImage, CIFloatSubImage, CIOneBitSubImage, CIComplexSubImage, CIImageList, CIInteractiveClassifier, CINonInteractiveClassifier, CIIntVector, CIFloatVector, CIComplexVector) gamera-3.3.3/gamera/gui/image_browser.py0000644000076500000000000000534111652050143017161 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import wx from gamera import core, config from gamera.gui import gamera_display, gui_util, gamera_icons import glob, string, os.path class FileList(wx.GenericDirCtrl): def __init__(self, parent, ID, image_display): wx.GenericDirCtrl.__init__( self, parent, ID, filter="All files (*.*)|*.*|TIFF files (*.tiff,*.tif)|*.tiff,*.tif", style=wx.DIRCTRL_SHOW_FILTERS) # self.SetDefaultPath(config.options.file.default_directory) wx.EVT_TREE_ITEM_ACTIVATED(self.GetTreeCtrl(), -1, self.OnItemSelected) self.image_display = image_display def OnItemSelected(self, e): filename = self.GetFilePath() if filename == '': return wx.BeginBusyCursor() try: try: image = core.load_image(filename) except Exception, e: gui_util.message("Loading image %s failed. \n\nThe error was:\n%s" % (filename, str(e))) return finally: wx.EndBusyCursor() width, height = self.image_display.id.GetSize() scale = max(float(width) / float(image.width), (float(height) / float(image.height))) self.image_display.id.set_image(image, weak=0) self.image_display.id.scale(scale) class ImageBrowserFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, "Image File Browser", wx.DefaultPosition,(600, 400)) icon = wx.IconFromBitmap(gamera_icons.getIconImageBrowserBitmap()) self.SetIcon(icon) self.splitter = wx.SplitterWindow(self, -1) self.image = gamera_display.ImageWindow(self.splitter, -1) self.file = FileList(self.splitter, -1, self.image) self.splitter.SetMinimumPaneSize(20) self.splitter.SplitVertically(self.file, self.image) self.splitter.Show(1) self.image.id.RefreshAll() gamera-3.3.3/gamera/gui/image_menu.py0000644000076500000000000002316511652050143016446 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import wx import weakref # Python standard library from gamera.core import * # Gamera-specific from gamera import util, plugin from gamera.gui import var_name, gui_util from gamera.args import * EXECUTE_MODE = 0 HELP_MODE = 1 shell = None def set_shell(sh): global shell shell = sh def set_shell_frame(sf): global shell_frame shell_frame = sf ###################################################################### _members_for_menu = ('pixel_type_name', 'storage_format_name', 'ul_x', 'ul_y', 'nrows', 'ncols', 'resolution', 'memory_size', 'label', 'classification_state', 'properties') def members_for_menu(self): return ["%s: %s" % (x, getattr(self, x)) for x in _members_for_menu if hasattr(self, x)] def methods_for_menu(self): return plugin.plugin_methods[self.data.pixel_type] class ImageMenu: _base_method_id = 10003 def __init__(self, parent, x, y, images_, name_=None, shell_=None, mode=EXECUTE_MODE, extra_methods={}): self.shell = shell_ self.locals = locals self.mode = mode self.parent = parent if not util.is_sequence(images_): self.images = [images_] else: self.images = images_ if not util.is_homogeneous_image_list(self.images): gui_util.message("All selected images are not of the same type.") self.image_name = name_ self._menu_ids = [] members = members_for_menu(self.images[0]) methods = methods_for_menu(self.images[0]) menu = self.create_menu( members, methods, self.images[0].data.pixel_type, self.images[0].pixel_type_name, extra_methods) self.did_something = 0 self.parent.PopupMenu(menu, wx.Point(x, y)) for i in self._menu_ids: self.parent.Disconnect(i) menu.Destroy() def get_id(self): id = wx.NewId() self._menu_ids.append(id) return id ## def __del__(self): ## print 'ImageMenu deleted' # Given a list of variables and methods, put it all together def create_menu(self, members, methods, type, type_name, extra_methods): menu = wx.Menu() # Top line if self.mode == HELP_MODE: menu.Append(0, "Help") id = self.get_id() menu.Append(id, type_name + " Image") menu.AppendSeparator() id = self.get_id() menu.Append(id, "new reference") wx.EVT_MENU(self.parent, id, self.OnCreateReference) id = self.get_id() menu.Append(id, "new copy") wx.EVT_MENU(self.parent, id, self.OnCreateCopy) id = self.get_id() menu.Append(id, "delete image") wx.EVT_MENU(self.parent, id, self.OnDeleteImage) menu.AppendSeparator() info_menu = wx.Menu() id = self.get_id() menu.AppendMenu(id, "Info", info_menu) # Variables for member in members: id = self.get_id() info_menu.Append(id, member) # Methods menu.AppendSeparator() self.functions = {} menu = self.create_methods(methods, menu) # Extra methods if len(extra_methods): menu.AppendSeparator() menu = self.create_extra_methods(extra_methods, menu) return menu def create_methods(self, methods, menu): items = methods.items() items.sort() for key, val in items: if type(val) == dict: item = self.create_methods(val, wx.Menu()) id = self.get_id() menu.AppendMenu(id, key, item) else: id = self.get_id() menu.Append(id, key) wx.EVT_MENU(self.parent, id, self.OnPopupFunction) self.functions[id] = val return menu def create_extra_methods(self, methods, menu): items = methods.items() items.sort() for key, val in items: if type(val) == dict: id = self.get_id() item = self.create_extra_methods(val, wx.Menu()) menu.AppendMenu(id, key, item) else: id = self.get_id() menu.Append(id, key) wx.EVT_MENU(self.parent, id, val) return menu def get_shell(self): if self.shell: return self.shell return shell # Creates a new top-level reference to the image def OnCreateReference(self, event): sh = self.get_shell() name = var_name.get("ref", sh.locals) if name: if len(self.images) == 1: if isinstance(self.images[0], weakref.ProxyTypes): sh.locals[name] = self.images[0].image_copy() else: sh.locals[name] = self.images[0] else: sh.locals[name] = [] for image in self.images: if isinstance(image, weakref.ProxyTypes): sh.locals[name].append(image.image_copy()) else: sh.locals[name].append(image) sh.Update() sh.update() def OnCreateCopy(self, event): sh = self.get_shell() name = var_name.get("copy", sh.locals) if name: if len(self.images) == 1: sh.locals[name] = self.images[0].image_copy() else: sh.locals[name] = [] for i in range(len(self.images)): sh.locals[name].append(self.images[i].image_copy()) sh.Update() sh.update() def OnDeleteImage(self,event): sh = self.get_shell() sh.run("del " + self.image_name) sh.Update() def get_function_call(self, sh, function): # determine if the function requires an argument gui if function.args.list in ('', None, (), []): # if not, we can just use empty parentheses return function.__name__ + "()" # else, display the argument gui and use what it returns result = function.args.show( self.parent, sh.GetLocals(), function.__name__, docstring=function.__call__.__doc__) return result def get_result_name(self, function, dict): if function.return_type not in ('', None): if function.return_type.name != None: name = function.return_type.name else: name = function.__name__ return var_name.get(name, dict) return '' def OnPopupFunction(self, event): sh = self.get_shell() function = self.functions[event.GetId()] if self.images: if self.mode == HELP_MODE: sh.run("help('" + function.__name__ + "')") elif self.mode == EXECUTE_MODE: func_call = self.get_function_call(sh, function) if func_call == None: # User pressed cancel, so bail return result_name = self.get_result_name(function, sh.locals) if result_name is None: return # If there is no image name, we have to run the code locally (i.e. # not in the shell) wx.BeginBusyCursor() try: if self.image_name is None: self._run_locally(sh, result_name, func_call) else: self._run_in_shell(sh, result_name, func_call) finally: wx.EndBusyCursor() self.did_something = 1 sh.update() def _run_locally(self, sh, result_name, func_call): namespace = {} namespace.update(sh.locals) if len(self.images) == 1: namespace['image'] = self.images[0] source = 'image.%s' % func_call result = eval(source, namespace) if result_name != '': sh.locals[result_name] = result else: namespace['images'] = self.images if result_name != '': sh.locals[result_name] = [] progress = util.ProgressFactory( 'Processing images...', len(self.images)) try: for i in range(len(self.images)): source = "images[%d].%s" % (i, func_call) result = eval(source, namespace) if result_name != '': sh.locals[result_name].append(result) progress.step() finally: progress.kill() if result_name != '': sh.run(result_name) def _run_in_shell(self, sh, result_name, func_call): if len(self.images) == 1: if result_name != '': source = '%s = ' % result_name else: source = '' source += '.'.join((self.image_name, func_call)) sh.run(source) else: if result_name != '': sh.run('%s = []' % result_name) sh.run('for i in range(len(%s)):' % self.image_name) source = '%s[i].%s' % (self.image_name, func_call) if result_name != '': source = '%s.append(%s)' % (result_name, source) sh.run('\t' + source) sh.run('\n') gamera-3.3.3/gamera/gui/knn_editing_display.py0000644000076500000000000001076111153763733020370 0ustar chriswheel# # GUI dialog to execute editing algorithms on a kNN Classifier # Copyright (C) 2007, 2008 Colin Baumgarten # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from gamera.knn_editing import AlgoRegistry import wx class EditingDialog(object): """Dialog to apply any of the editing algorithms known to the *gamera.knn_editing.AlgoRegistry* to a given *kNNInteractive* Classifier. Lets the user select one of the algorithms, tune its parameters and then returns the edited result""" def __init__(self): self.selection = 0 self.panel = None self._createDialog() def _createDialog(self): self.dlg = wx.Dialog(None, wx.NewId(), "Create edited Classifier") self.sizer = wx.FlexGridSizer(rows = 0, cols = 1) self.dlg.SetSizer(self.sizer) choiceSizer = wx.FlexGridSizer(rows = 1, cols = 0) statText = wx.StaticText(self.dlg, wx.NewId(), "Select an Editing Algorithm") choiceSizer.Add(statText, flag = wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, border = 10) choiceId = wx.NewId() choiceControl = wx.Choice(self.dlg, choiceId, choices = self._algoNames()) wx.EVT_CHOICE(self.dlg, choiceId, self._choiceCallback) choiceSizer.Add(choiceControl, flag = wx.ALIGN_RIGHT) choiceSizer.AddGrowableCol(0) self.sizer.Add(choiceSizer, flag = wx.EXPAND | wx.ALL, border = 10) self.sizer.Add(wx.StaticLine(self.dlg), flag = wx.EXPAND) self._replaceArgs() buttons = self.dlg.CreateButtonSizer(wx.OK | wx.CANCEL) #buttons.Realize() # does not work on Windows self.sizer.Add(buttons, flag = wx.ALL, border = 10) self.sizer.Fit(self.dlg) self.sizer.SetSizeHints(self.dlg) def _choiceCallback(self, event): """called, if the user selects an algorithm from the dropdown, so that the list of parameters can be updated""" if event.GetSelection() != self.selection: self.selection = event.GetSelection() self._replaceArgs() self.sizer.Fit(self.dlg) self.sizer.SetSizeHints(self.dlg) def _replaceArgs(self): """replace (or initially create) the parameter input controls, according to the just selected algorithm""" panel = wx.Panel(self.dlg) self._selected().args.window = panel help = self._selected().args._create_help_display(self._selected().doc) help.SetInitialSize(wx.Size(50, 200)) panelSizer = wx.FlexGridSizer(rows = 0, cols = 1) panelSizer.AddGrowableCol(0) panel.SetSizer(panelSizer) argControls = self._selected().args._create_controls(None, panel) panelSizer.Add(argControls, flag = wx.EXPAND) panelSizer.Add(help, flag = wx.EXPAND | wx.ALL, border = 10) panel.Layout() if self.panel == None: self.sizer.Add(panel, flag = wx.EXPAND) else: self.sizer.Replace(self.panel, panel) self.panel.Destroy() self.dlg.Layout() self.panel = panel def _algoNames(self): """Returns a list of all editing algorithm names as known to the *AlgoRegistry*""" return [alg.name for alg in AlgoRegistry.algorithms] def _selected(self): """ Returns the metadata of the currently selected algorithm as a *AlgoData* object""" return AlgoRegistry.algorithms[self.selection] def show(self, classifier): """Shows the dialog. In case the user clicks *OK*, applies the selected algorithm to the given *classifier* and returns the resulting one. Otherwise returns *None*""" if self.dlg.ShowModal() == wx.ID_OK: args = self._selected().args.get_args() args.insert(0, classifier) args = tuple(args) return self._selected().callable(*args) else: return None gamera-3.3.3/gamera/gui/matplotlib_support.py0000644000076500000000000002514511652050143020303 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from sys import stderr try: import matplotlib # if (not hasattr(matplotlib, '__version__') or # matplotlib.__version__ not in ("0.73.1", "0.84", "0.90.1")): # print >>stderr, "WARNING: The version of matplotlib you have installed has not been officially" # print >>stderr, "tested with Gamera. It may work fine, or you may experience strange" # print >>stderr, "problems using the matplotlib functionality. Please include the" # print >>stderr, "version of your matplotlib (%s) in any bug reports to the Gamera" % (matplotlib.__version__) # print >>stderr, "developers.\n" try: matplotlib.use("WXAgg") from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from matplotlib.backends import backend_wxagg as underlying_backend except ImportError: matplotlib.use("WX") from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas from matplotlib.backends import backend_wx as underlying_backend from matplotlib.backends import backend_wx from matplotlib import backend_bases from matplotlib.figure import Figure from matplotlib._pylab_helpers import Gcf import wx from gamera.gui import toolbar, gui_util, gamera_icons except ImportError: def plot(*args, **kwargs): raise RuntimeError("Plotting is not supported because the optional matplotlib library\n" "could not be found.\n\n" "Download and install matplotlib from matplotlib.sourceforge.net,\n" "then restart Gamera to have plotting support.") show_figure = plot matplotlib_installed = False else: cursord = backend_wx.cursord class GameraPlotToolbar(backend_bases.NavigationToolbar2, toolbar.ToolBar): def __init__(self, parent, canvas): self.canvas = canvas self._idle = True self.statbar = None toolbar.ToolBar.__init__(self, parent) backend_bases.NavigationToolbar2.__init__(self, canvas) def _init_toolbar(self): load_bitmap = backend_wx._load_bitmap self.AddSimpleTool(10, gamera_icons.getIconHomeBitmap(), 'Reset original view', self.home) self.AddSimpleTool(20, gamera_icons.getIconBackBitmap(), 'Back navigational view', self.back) self.AddSimpleTool(30, gamera_icons.getIconForwardBitmap(), 'Forward navigational view', self.forward) self.AddSeparator() self.pan_button = self.AddSimpleTool(40, gamera_icons.getIconMoveBitmap(), 'Pan/zoom mode', self.pan, True) self.zoom_button = self.AddSimpleTool(50, gamera_icons.getIconZoomViewBitmap(), 'Zoom to rectangle', self.zoom, True) self.AddSeparator() self.AddSimpleTool(60, gamera_icons.getIconSaveBitmap(), 'Save plot contents to file', self.save) self.AddSimpleTool(70, gamera_icons.getIconPrinterBitmap(), 'Print', self.print_plot) def save(self, evt): filename = gui_util.save_file_dialog(self, self.canvas._get_imagesave_wildcards()) if filename is not None: self.canvas.print_figure(filename) def print_plot(self, evt): printout = backend_wx.PrintoutWx(self.canvas) dialog_data = wx.PrintDialogData() if wx.VERSION < (2, 5): dialog_data.EnableHelp(False) dialog_data.EnablePageNumbers(False) dialog_data.EnableSelection(False) printer = wx.Printer(dialog_data) if not printer.Print(self, printout, True): if printer.GetLastError() == wx.PRINTER_ERROR: gui_util.message("A printing error occurred.") def zoom(self, evt): if evt.GetIsDown(): self.pan_button.SetValue(False) else: self.zoom_button.SetValue(True) backend_bases.NavigationToolbar2.zoom(self, evt) def pan(self, evt): if evt.GetIsDown(): self.zoom_button.SetValue(False) else: self.pan_button.SetValue(True) backend_bases.NavigationToolbar2.pan(self, evt) # This is all verbatim from backend_wx.py, which for various # multiple-ineheritance-related reasons can not just be directly # imported def set_cursor(self, cursor): cursor = wx.StockCursor(cursord[cursor]) self.canvas.SetCursor( cursor ) def release(self, event): try: del self.lastrect except AttributeError: pass def dynamic_update(self): d = self._idle self._idle = False if d: self.canvas.draw() self._idle = True def draw_rubberband(self, event, x0, y0, x1, y1): 'adapted from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/189744' canvas = self.canvas dc = wx.ClientDC(canvas) # Set logical function to XOR for rubberbanding dc.SetLogicalFunction(wx.XOR) # Set dc brush and pen # Here I set brush and pen to white and grey respectively # You can set it to your own choices # The brush setting is not really needed since we # dont do any filling of the dc. It is set just for # the sake of completion. wbrush = wx.Brush(wx.Colour(255,255,255), wx.TRANSPARENT) wpen = wx.Pen(wx.Colour(200, 200, 200), 1, wx.SOLID) dc.SetBrush(wbrush) dc.SetPen(wpen) dc.ResetBoundingBox() dc.BeginDrawing() height = self.canvas.figure.bbox.height() y1 = height - y1 y0 = height - y0 if y1 inf or x < -inf: raise ValueError("Line contains 'inf' or '-inf' values which can not be plotted.") figure = Figure() axis = figure.add_subplot(111) axis.plot(*args) show_figure(figure) return figure def show_figure(figure): display = GameraPlotFrame(0, figure) display.Show() return display # Everything below here is just to support pylab mode def show(): for figwin in Gcf.get_all_fig_managers(): figwin.frame.Show() figwin.canvas.realize() figwin.canvas.draw() def new_figure_manager(num, *args, **kwargs): # in order to expose the Figure constructor to the pylab # interface we need to create the figure here fig = Figure(*args, **kwargs) frame = GameraPlotFrame(num, fig) figmgr = frame.get_figure_manager() figmgr.canvas.realize() figmgr.frame.Show() return figmgr class GameraFigureManager(backend_bases.FigureManagerBase): def __init__(self, canvas, num, frame): backend_bases.FigureManagerBase.__init__(self, canvas, num) self.frame = frame self.window = frame self.tb = frame.GetToolBar() def notify_axes_change(fig): 'this will be called whenever the current axes is changed' if self.tb != None: self.tb.update() self.canvas.figure.add_axobserver(notify_axes_change) def destroy(self, *args): self.frame.Destroy() self.canvas.Destroy() import wx wx.WakeUpIdle() from matplotlib import backends backends.show = show backends.new_figure_manager = new_figure_manager matplotlib_installed = True __all__ = "plot show_figure".split() gamera-3.3.3/gamera/gui/rule_engine_runner.py0000644000076500000000000001444311652050143020224 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from inspect import isfunction, ismodule from os import path import wx from gamera.gui import toolbar, gui_util class RuleEngineRunnerTree(wx.TreeCtrl): def __init__(self, toplevel, parent): self.toplevel = toplevel self.modules = [] self.undo_history = [] self.added = [] self.removed = [] id = wx.NewId() wx.TreeCtrl.__init__(self, parent, id) self.root = self.AddRoot("RuleSets") self.SetItemHasChildren(self.root, True) self.SetPyData(self.root, "") wx.EVT_TREE_ITEM_ACTIVATED(self, id, self._OnActivated) self.Expand(self.root) def _OnKey(self, event): pass def _OnActivated(self, event): from gamera import ruleengine item = event.GetItem() data = self.GetPyData(item) multi_display = self.toplevel.multi_iw.id single_display = self.toplevel.single_iw.id if isfunction(data): engine = ruleengine.RuleEngine([data]) elif isinstance(data, ruleengine.RuleEngine): engine = data elif ismodule(data): engine = ruleengine.RuleEngine( [val for val in data.__dict__.values() if isinstance(val, ruleengine.RuleEngine)]) added = {} removed = {} try: added, removed = engine.perform_rules(multi_display.GetAllItems()) except ruleengine.RuleEngineError, e: gui_util.message(str(e)) return if len(added) == 0 and len(removed) == 0: gui_util.message("No rules matched the data set.") multi_display.ClearSelection() multi_display.append_and_remove_glyphs(added, removed) single_display.highlight_cc(added, 0) # single_display.add_highlight_cc(removed, 1) self.undo_history.append((added, removed)) self.added, self.removed = added, removed def _OnUndo(self, event): multi_display = self.toplevel.multi_iw.id single_display = self.toplevel.single_iw.id if len(self.undo_history): added, removed = self.undo_history.pop() multi_display.ClearSelection() for glyph in removed: del glyph.__dict__['dead'] multi_display.append_and_remove_glyphs([], added) if len(self.undo_history): self.added, self.removed = self.undo_history[-1] single_display.highlight_cc(self.added, 0) single_display.add_highlight_cc(self.removed, 1) def _OnReloadCode(self, event): for module in self.modules: reload(module) self.CollapseAndReset(self.root) old_modules = self.modules[:] self.modules = [] for module in old_modules: self.add_module(module) def _OnSelectAdded(self, event): self.toplevel.multi_iw.id.SelectGlyphs(self.added) def _OnSelectRemoved(self, event): self.toplevel.multi_iw.id.SelectGlyphs(self.removed) def add_module(self, module): from gamera import ruleengine self.modules.append(module) module_node = self.AppendItem(self.root, path.split(module.__file__)[1]) self.SetPyData(module_node, module) for key, val in module.__dict__.items(): self.SetItemHasChildren(module_node, True) if isinstance(val, ruleengine.RuleEngine): rule_engine_node = self.AppendItem(module_node, key) self.Expand(module_node) self.SetPyData(rule_engine_node, val) for rule in val.get_rules(): self.SetItemHasChildren(rule_engine_node, True) rule_node = self.AppendItem(rule_engine_node, rule.__name__) self.SetPyData(rule_node, rule) class RuleEngineRunnerPanel(wx.Panel): def __init__(self, toplevel, parent = None, id = -1): wx.Panel.__init__( self, parent, id, style=wx.WANTS_CHARS|wx.CLIP_CHILDREN|wx.NO_FULL_REPAINT_ON_RESIZE) self.toplevel = toplevel self.SetAutoLayout(True) self.toolbar = toolbar.ToolBar(self, -1) from gamera.gui import gamera_icons self.tree = RuleEngineRunnerTree(toplevel, self) self.toolbar.AddSimpleTool( 10, gamera_icons.getIconUndoBitmap(), "Undo", self.tree._OnUndo) self.toolbar.AddSeparator() self.toolbar.AddSimpleTool( 11, gamera_icons.getIconRefreshBitmap(), "Reload code", self.tree._OnReloadCode) self.toolbar.AddSeparator() self.toolbar.AddSimpleTool( 12, gamera_icons.getIconSelectAddedBitmap(), "Select added glyphs", self.tree._OnSelectAdded) self.toolbar.AddSimpleTool( 13, gamera_icons.getIconSelectRemovedBitmap(), "Select removed glyphs", self.tree._OnSelectRemoved) lc = wx.LayoutConstraints() lc.top.SameAs(self, wx.Top, 0) lc.left.SameAs(self, wx.Left, 0) lc.right.SameAs(self, wx.Right, 0) lc.height.AsIs() self.toolbar.SetAutoLayout(True) self.toolbar.SetConstraints(lc) lc = wx.LayoutConstraints() lc.top.Below(self.toolbar, 0) lc.left.SameAs(self, wx.Left, 0) lc.right.SameAs(self, wx.Right, 0) lc.bottom.SameAs(self, wx.Bottom, 0) self.tree.SetAutoLayout(True) self.tree.SetConstraints(lc) self.Layout() def open_module(self, filename): import imp fd = open(filename, 'r') module_name = path.split(filename)[1] module_name = module_name[:module_name.rfind('.')] module = imp.load_module( module_name, fd, filename, ('py', 'r', imp.PY_SOURCE)) self.tree.add_module(module) gamera-3.3.3/gamera/gui/toolbar.py0000644000076500000000000001024111652050143015771 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import wx from wx.lib import buttons from gamera.gui import gamera_icons # This is our own custom toolbar class. # We had to implement our own, since the one in wxWindows one supports # one toolbar per wxFrame (on MSW, at least). Since we want two # independent toolbars in the classifier window, we have to create our # own toolbar using a wxPanel and a wxBoxSizer. if wx.Platform != '__WXMAC__' and hasattr(buttons, 'ThemedGenBitmapButton'): ButtonClass = buttons.ThemedGenBitmapButton ToggleButtonClass = buttons.ThemedGenBitmapToggleButton else: ButtonClass = buttons.GenBitmapButton ToggleButtonClass = buttons.GenBitmapToggleButton class ToolBar(wx.Panel): def __init__(self, parent, id=-1, hideable=1): self._close_toolbar_bitmap = gamera_icons.getToolbarCloseBitmap() self._open_toolbar_bitmap = gamera_icons.getToolbarOpenBitmap() self.controls = [] self.layout_update_controls = [] self.sizer = wx.BoxSizer(wx.HORIZONTAL) wx.Panel.__init__( self, parent, id, style=wx.CLIP_CHILDREN|wx.NO_FULL_REPAINT_ON_RESIZE) self.SetSizer(self.sizer) self._closed = 0 def AddSimpleTool(self, id, bitmap, help_string, callback=None, toggle=0): if not toggle: button = ButtonClass(self, id, bitmap, size=wx.Size(30,30)) else: button = ToggleButtonClass(self, id, bitmap, size=wx.Size(30,30)) button.SetBezelWidth(1) button.SetUseFocusIndicator(False) button.SetToolTipString(help_string) if callback: wx.EVT_BUTTON(self, id, callback) self.sizer.Add(button, flag=wx.ALIGN_CENTER) self.sizer.SetSizeHints(self) self.controls.append(button) return button def AddMenuTool(self, id, text, help_string, callback=None, toggle=0): if not toggle: button = buttons.GenBitmapTextButton( self, id, None, text, size=wx.Size(48, 28)) else: button = buttons.GenBitmapTextToggleButton( self, id, None, text, size=wx.Size(48,28)) button.SetBitmapLabel(gamera_icons.getToolbarMenuBitmap()) button.SetBezelWidth(1) button.SetUseFocusIndicator(False) button.SetToolTipString(help_string) if callback: wx.EVT_BUTTON(self, id, callback) self.sizer.Add(button, flag=wx.ALIGN_CENTER) self.sizer.SetSizeHints(self) self.controls.append(button) return button def AddControl(self, control): self.sizer.Add(control, flag=wx.ALIGN_CENTER) self.sizer.SetSizeHints(self) self.controls.append(control) def AddSeparator(self): self.sizer.Add(wx.Panel(self, -1, size=wx.Size(5, 2))) self.sizer.SetSizeHints(self) def OnHideToolbar(self, event): self.close_button.Hide() self.open_button.Show() for control in self.controls: control.Hide() self.SetSizeHints(-1, -1, -1, -1, -1, -1) self.SetSize(wx.Size(self.GetSize().x, 12)) self.Layout() self.GetParent().Layout() self.GetParent().Refresh() def OnShowToolbar(self, event): self.close_button.Show() self.open_button.Hide() for control in self.controls: control.Show() self.sizer.SetSizeHints(self) self.Layout() self.GetParent().Layout() self.GetParent().Refresh() gamera-3.3.3/gamera/gui/var_name.py0000644000076500000000000000371411652050143016126 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import wx import keyword, re from gamera.gui import gui_util variable_name = re.compile("^[A-Za-z_][A-Za-z0-9_]*$") def verify_variable_name(name): if keyword.iskeyword(name): return 0 if variable_name.match(name): return 1 return 0 def get(default='untitled', dict={}): number = 0 while 1: name = '%s%d' % (default, number) while dict.has_key(name): number = number + 1 name = '%s%d' % (default, number) if number > 1000: number = 0 break dlg = wx.TextEntryDialog( None, 'Please enter a variable name for the result', 'Select a variable name', name, style=wx.OK|wx.CANCEL|wx.CENTRE) button = dlg.ShowModal() if button == wx.ID_OK: result = dlg.GetValue() dlg.Destroy() if not verify_variable_name(result): gui_util.message("Invalid variable name: " + result) return None else: return result else: dlg.Destroy() return None gamera-3.3.3/gamera/io.py0000644000076500000000000012112311246032654014162 0ustar chriswheel# Copyright (c) 1999-2007 Gary Strangman; All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # # Comments and/or additions are welcome (send e-mail to: # strang@nmr.mgh.harvard.edu). # """ Defines a number of functions for pseudo-command-line OS functionality. cd(directory) pwd <-- can be used WITHOUT parens ls(d='.') rename(from,to) get(namepatterns,verbose=1) getstrings(namepatterns,verbose=1) put(outlist,filename,writetype='w') aget(namepatterns,verbose=1) aput(outarray,filename,writetype='w') bget(filename,numslices=1,xsize=64,ysize=64) braw(filename,btype) bput(outarray,filename,writeheader=0,packstring='h',writetype='wb') mrget(filename) find_dirs(sourcedir) """ ## CHANGES: ## ======= ## 08-07-23 ... added getcsv() to more easily handle tabbed files ## 07-11-26 ... more numpy conversion work ## 06-08-07 ... converted to numpy, changed version to 0.6 ## 06-02-03 ... added add2afnihistory() to load modify afni HISTORY_NOTEs, ## and added that option to array2afni output ## 04-06-14 ... added getafniparam() to load in afni values from HEAD files ## 03-04-09 ... fixed brikget to load based on datatype, changed array2afni ## so that the default sliceorder is altplus, not seqplus ## 02-11-20 ... added binget(), binput(), array2afni(), version 0.5 ## 02-10-20 ... added find_dirs() function, changed version to 0.4 ## 01-11-15 ... changed aput() and put() to accept a delimiter ## 01-04-19 ... added oneperline option to put() function ## 99-11-07 ... added DAs quick flat-text-file loaders, load() and fload() ## 99-11-01 ... added version number (0.1) for distribution ## 99-08-30 ... Put quickload in here ## 99-06-27 ... Changed bget thing back ... confused ... ## 99-06-24 ... exchanged xsize and ysize in bget for non-square images (NT??) ## modified bget to raise an IOError when file not found ## 99-06-12 ... added load() and save() aliases for aget() and aput() (resp.) ## 99-04-13 ... changed aget() to ignore (!!!!) lines beginning with # or % ## 99-01-17 ... changed get() so ints come in as ints (not floats) ## try: import mmapfile except: pass import pstat import glob, re, string, types, os, struct, copy, time, tempfile, sys import csv from types import * import numpy as np __version__ = 0.7 def wrap(f): """ Wraps a function so that if it's entered *by itself* in the interpreter without ()'s, it gets called anyway """ class W: def __init__(self, f): self.f = f def __repr__(self): x =apply(self.f) if x: return repr(x) else: return '' return W(f) def cd (directory): """ Changes the working python directory for the interpreter. Usage: cd(directory) where 'directory' is a string """ os.chdir(directory) return def pwd(): """ Changes the working python directory for the interpreter. Usage: pwd (no parens needed) """ return os.getcwd() pwd = wrap(pwd) def ls(d='.'): """ Produces a directory listing. Default is the current directory. Usage: ls(d='.') """ os.system('ls '+d) return None def rename(source, dest): """ Renames files specified by UNIX inpattern to those specified by UNIX outpattern. Can only handle a single '*' in the two patterns!!! Usage: rename (source, dest) e.g., rename('*.txt', '*.c') """ infiles = glob.glob(source) outfiles = [] incutindex = string.index(source,'*') outcutindex = string.index(source,'*') findpattern1 = source[0:incutindex] findpattern2 = source[incutindex+1:] replpattern1 = dest[0:incutindex] replpattern2 = dest[incutindex+1:] for fname in infiles: if incutindex > 0: newname = re.sub(findpattern1,replpattern1,fname,1) if outcutindex < len(dest)-1: if incutindex > 0: lastone = string.rfind(newname,replpattern2) newname = newname[0:lastone] + re.sub(findpattern2,replpattern2,fname[lastone:],1) else: lastone = string.rfind(fname,findpattern2) if lastone <> -1: newname = fname[0:lastone] newname = newname + re.sub(findpattern2,replpattern2,fname[lastone:],1) print fname, newname os.rename(fname,newname) return def get (namepatterns,verbose=1): """ Loads a list of lists from text files (specified by a UNIX-style wildcard filename pattern) and converts all numeric values to floats. Uses the glob module for filename pattern conversion. Loaded filename is printed if verbose=1. Usage: get (namepatterns,verbose=1) Returns: a 1D or 2D list of lists from whitespace delimited text files specified by namepatterns; numbers that can be converted to floats are so converted """ fnames = [] if type(namepatterns) in [ListType,TupleType]: for item in namepatterns: fnames = fnames + glob.glob(item) else: fnames = glob.glob(namepatterns) if len(fnames) == 0: if verbose: print 'NO FILENAMES MATCH ('+namepatterns+') !!' return None if verbose: print fnames # so user knows what has been loaded elements = [] for i in range(len(fnames)): file = open(fnames[i]) newelements = map(string.split,file.readlines()) for i in range(len(newelements)): for j in range(len(newelements[i])): try: newelements[i][j] = string.atoi(newelements[i][j]) except ValueError: try: newelements[i][j] = string.atof(newelements[i][j]) except: pass elements = elements + newelements if len(elements)==1: elements = elements[0] return elements def getstrings (namepattern,verbose=1): """ Loads a (set of) text file(s), with all elements left as string type. Uses UNIX-style wildcards (i.e., function uses glob). Loaded filename is printed if verbose=1. Usage: getstrings (namepattern, verbose=1) Returns: a list of strings, one per line in each text file specified by namepattern """ fnames = glob.glob(namepattern) if len(fnames) == 0: if verbose: print 'NO FILENAMES MATCH ('+namepattern+') !!' return None if verbose: print fnames elements = [] for filename in fnames: file = open(filename) newelements = map(string.split,file.readlines()) elements = elements + newelements return elements def getcsv (namepatterns, delimiter='\t', verbose=1): """ Loads a list of lists from text files (specified by a UNIX-style wildcard filename pattern) and converts all numeric values to floats. Uses the glob module for filename pattern conversion. Loaded filename is printed if verbose=1. Usage: get (namepatterns, delimiter='\t', verbose=1) Returns: a 1D or 2D list of lists from whitespace delimited text files specified by namepatterns; numbers that can be converted to floats are so converted """ fnames = [] if type(namepatterns) in [ListType,TupleType]: for item in namepatterns: fnames = fnames + glob.glob(item) else: fnames = glob.glob(namepatterns) if len(fnames) == 0: if verbose: print 'NO FILENAMES MATCH ('+namepatterns+') !!' return None if verbose: print fnames # so user knows what has been loaded elements = [] for i in range(len(fnames)): file = csv.reader(open(fnames[i]),delimiter=delimiter) newelements = [row for row in file] for i in range(len(newelements)): for j in range(len(newelements[i])): try: newelements[i][j] = string.atoi(newelements[i][j]) except: try: newelements[i][j] = string.atof(newelements[i][j]) except: pass elements = elements + newelements if len(elements)==1: elements = elements[0] return elements def getrec(namepattern,verbose=0): """ Loads a numpy.recarray from a text file with the first row as the col names. Usage: getrec(namepatterns,verbose=0) Returns: a 2D recarray """ fname = glob.glob(namepattern) if len(fname) == 0: if verbose: print 'NO FILENAMES MATCH ('+namepatterns+') !!' return None if verbose: print fnames # so user knows what has been loaded d = get(fname[0]) h = d[0] # ASSUME FIRST ROW HOLDS COLUMN NAMES d = d[1:] return np.rec.fromrecords(d,names=h) def put (outlist,fname,writetype='w',oneperline=0,delimiter=' '): """ Writes a passed mixed-type list (str and/or numbers) to an output file, and then closes the file. Default is overwrite the destination file. Usage: put (outlist,fname,writetype='w',oneperline=0,delimiter=' ') Returns: None """ if type(outlist) in [np.ndarray]: aput(outlist,fname,writetype) return if type(outlist[0]) not in [ListType,TupleType]: # 1D list outfile = open(fname,writetype) if not oneperline: outlist = pstat.list2string(outlist,delimiter) outfile.write(outlist) outfile.write('\n') else: # they want one element from the list on each file line for item in outlist: outfile.write(str(item)+'\n') outfile.close() else: # 2D list (list-of-lists) outfile = open(fname,writetype) for row in outlist: outfile.write(pstat.list2string(row,delimiter)) outfile.write('\n') outfile.close() return None def isstring(x): if type(x)==StringType: return 1 else: return 0 def aget (namepattern,verbose=1): """ Loads an array from 2D text files (specified by a UNIX-style wildcard filename pattern). ONLY 'GET' FILES WITH EQUAL NUMBERS OF COLUMNS ON EVERY ROW (otherwise returned array will be zero-dimensional). Usage: aget (namepattern) Returns: an array of integers, floats or objects (type='O'), depending on the contents of the files specified by namepattern """ fnames = glob.glob(namepattern) if len(fnames) == 0: if verbose: print 'NO FILENAMES MATCH ('+namepattern+') !!' return None if verbose: print fnames elements = [] for filename in fnames: file = open(filename) newelements = file.readlines() del_list = [] for row in range(len(newelements)): if (newelements[row][0]=='%' or newelements[row][0]=='#' or len(newelements[row])==1 or newelements[row][0]=='\r'): del_list.append(row) del_list.reverse() for i in del_list: newelements.pop(i) newelements = map(string.split,newelements) for i in range(len(newelements)): for j in range(len(newelements[i])): try: newelements[i][j] = string.atof(newelements[i][j]) except: pass elements = elements + newelements for row in range(len(elements)): if np.add.reduce(np.array(map(isstring,elements[row])))==len(elements[row]): print "A row of strings was found. Returning a LIST." return elements try: elements = np.array(elements) except TypeError: elements = np.array(elements,dtype='O') return elements def aput (outarray,fname,writetype='w',delimit=' '): """ Sends passed 1D or 2D array to an output file and closes the file. Usage: aput (outarray,fname,writetype='w',delimit=' ') Returns: None """ outfile = open(fname,writetype) if len(outarray.shape) == 1: outarray = outarray[np.newaxis,:] if len(outarray.shape) > 2: raise TypeError, "put() and aput() require 1D or 2D arrays. Otherwise use some kind of pickling." else: # must be a 2D array for row in outarray: outfile.write(string.join(map(str,row),delimit)) outfile.write('\n') outfile.close() return None def bget(imfile,shp=None,unpackstr=np.int16,bytesperpixel=2.0,sliceinit=0): """ Reads in a binary file, typically with a .bshort or .bfloat extension. If so, the last 3 parameters are set appropriately. If not, the last 3 parameters default to reading .bshort files (2-byte integers in big-endian binary format). Usage: bget(imfile,shp=None,unpackstr=np.int16,bytesperpixel=2.0,sliceinit=0) """ if imfile[:3] == 'COR': return CORget(imfile) if imfile[-2:] == 'MR': return mrget(imfile,unpackstr) if imfile[-4:] == 'BRIK': return brikget(imfile,unpackstr,shp) if imfile[-3:] in ['mnc','MNC','inc','INC']: return mincget(imfile,unpackstr,shp) if imfile[-3:] == 'img': return mghbget(imfile,unpackstr,shp) if imfile[-6:] == 'bshort' or imfile[-6:] == 'bfloat': if shp == None: return mghbget(imfile,unpackstr=unpackstr,bytesperpixel=bytesperpixel,sliceinit=sliceinit) else: return mghbget(imfile,shp[0],shp[1],shp[2],unpackstr,bytesperpixel,sliceinit) def CORget(infile): """ Reads a binary COR-nnn file (flattening file). Usage: CORget(imfile) Returns: 2D array of 16-bit ints """ d=braw(infile,np.int8) d.shape = (256,256) d = np.where(d>=0,d,256+d) return d def mincget(imfile,unpackstr=np.int16,shp=None): """ Loads in a .MNC file. Usage: mincget(imfile,unpackstr=np.int16,shp=None) default shp = -1,20,64,64 """ if shp == None: shp = (-1,20,64,64) os.system('mincextract -short -range 0 4095 -image_range 0 4095 ' + imfile+' > minctemp.bshort') try: d = braw('minctemp.bshort',unpackstr) except: print "Couldn't find file: "+imfile raise IOError, "Couldn't find file in mincget()" print shp, d.shape d.shape = shp os.system('rm minctemp.bshort') return d def brikget(imfile,unpackstr=np.int16,shp=None): """ Gets an AFNI BRIK file. Usage: brikget(imfile,unpackstr=np.int16,shp=None) default shp: (-1,48,61,51) """ if shp == None: shp = (-1,48,61,51) try: file = open(imfile, "rb") except: print "Couldn't find file: "+imfile raise IOError, "Couldn't find file in brikget()" try: header = imfile[0:-4]+'HEAD' lines = open(header).readlines() for i in range(len(lines)): if string.find(lines[i],'DATASET_DIMENSIONS') <> -1: dims = string.split(lines[i+2][0:string.find(lines[i+2],' 0')]) dims = map(string.atoi,dims) if string.find(lines[i],'BRICK_FLOAT_FACS') <> -1: count = string.atoi(string.split(lines[i+1])[2]) mults = [] for j in range(int(np.ceil(count/5.))): mults += map(string.atof,string.split(lines[i+2+j])) mults = np.array(mults) if string.find(lines[i],'BRICK_TYPES') <> -1: first5 = lines[i+2] first5 = map(string.atoi,string.split(first5)) if first5[0] == 0: unpackstr = np.uint8 elif first5[0] == 1: unpackstr = np.int16 elif first5[0] == 3: unpackstr = np.float32 elif first5[0] == 5: unpackstr = np.complex32 dims.reverse() shp = [-1]+dims except IOError: print "No header file. Continuing ..." lines = None print shp print 'Using unpackstr:',unpackstr #,', bytesperpixel=',bytesperpixel file = open(imfile, "rb") bdata = file.read() # the > forces big-endian (for or from Sun/SGI) bdata = np.fromstring(bdata,unpackstr) # littleEndian = ( struct.pack('i',1)==struct.pack('1e30): bdata = bdata.byteswap() try: bdata.shape = shp except: print 'Incorrect shape ...',shp,len(bdata) raise ValueError, 'Incorrect shape for file size' if len(bdata) == 1: bdata = bdata[0] if np.sum(mults) == 0: return bdata try: multshape = [1]*len(bdata.shape) for i in range(len(bdata.shape)): if len(mults) == bdata.shape[i]: multshape[i] = len(mults) break mults.shape = multshape return bdata*mults except: return bdata def mghbget(imfile,numslices=-1,xsize=64,ysize=64, unpackstr=np.int16,bytesperpixel=2.0,sliceinit=0): """ Reads in a binary file, typically with a .bshort or .bfloat extensionp. If so, the last 3 parameters are set appropriately. If not, the last 3 parameters default to reading .bshort files (2-byte integers in big-endian binary format). Usage: mghbget(imfile, numslices=-1, xsize=64, ysize=64, unpackstr=np.int16, bytesperpixel=2.0, sliceinit=0) """ try: file = open(imfile, "rb") except: print "Couldn't find file: "+imfile raise IOError, "Couldn't find file in bget()" try: header = imfile[0:-6]+'hdr' vals = get(header,0) # '0' means no missing-file warning msg if type(vals[0]) == ListType: # it's an extended header xsize = int(vals[0][0]) ysize = int(vals[0][1]) numslices = int(vals[0][2]) else: xsize = int(vals[0]) ysize = int(vals[1]) numslices = int(vals[2]) except: print "No header file. Continuing ..." suffix = imfile[-6:] if suffix == 'bshort': pass elif suffix[-3:] == 'img': pass elif suffix == 'bfloat': unpackstr = np.float32 bytesperpixel = 4.0 sliceinit = 0.0 else: print 'Not a bshort, bfloat or img file.' print 'Using unpackstr:',unpackstr,', bytesperpixel=',bytesperpixel imsize = xsize*ysize file = open(imfile, "rb") bdata = file.read() numpixels = len(bdata) / bytesperpixel if numpixels%1 != 0: raise ValueError, "Incorrect file size in fmri.bget()" else: # the > forces big-endian (for or from Sun/SGI) bdata = np.fromstring(bdata,unpackstr) # littleEndian = ( struct.pack('i',1)==struct.pack('1e30): bdata = bdata.byteswap() if suffix[-3:] == 'img': if numslices == -1: numslices = len(bdata)/8200 # 8200=(64*64*2)+8 bytes per image xsize = 64 ysize = 128 slices = np.zeros((numslices,xsize,ysize),np.int32) for i in range(numslices): istart = i*8 + i*xsize*ysize iend = i*8 + (i+1)*xsize*ysize print i, istart,iend slices[i] = np.reshape(np.array(bdata[istart:iend]),(xsize,ysize)) else: if numslices == 1: slices = np.reshape(np.array(bdata),[xsize,ysize]) else: slices = np.reshape(np.array(bdata),[numslices,xsize,ysize]) if len(slices) == 1: slices = slices[0] return slices def braw(fname,btype,shp=None): """ Opens a binary file, unpacks it, and returns a flat array of the type specified. Use Numeric types ... np.float32, np.int64, etc. Usage: braw(fname,btype,shp=None) Returns: flat array of floats, or ints (if btype=np.int16) """ file = open(fname,'rb') bdata = file.read() bdata = np.fromstring(bdata,btype) # littleEndian = ( struct.pack('i',1)==struct.pack('' above if (max(bdata)>1e30): bdata = bdata.byteswap() if shp: try: bdata.shape = shp return bdata except: pass return np.array(bdata) def glget(fname,btype): """ Load in a file containing pixels from glReadPixels dump. Usage: glget(fname,btype) Returns: array of 'btype elements with shape 'shape', suitable for im.ashow() """ d = braw(fname,btype) d = d[8:] f = open(fname,'rb') shp = f.read(8) f.close() shp = np.fromstring(shp,np.int32) shp[0],shp[1] = shp[1],shp[0] try: carray = np.reshape(d,shp) return except: pass try: r = d[0::3]+0 g = d[1::3]+0 b = d[2::3]+0 r.shape = shp g.shape = shp b.shape = shp carray = np.array([r,g,b]) except: outstr = "glget: shape not correct for data of length "+str(len(d)) raise ValueError, outstr return carray def mget(fname,btype): """ Load in a file that was saved from matlab Usage: mget(fname,btype) """ d = braw(fname,btype) try: header = fname[0:-6]+'hdr' vals = get(header,0) # '0' means no missing-file warning msg if type(vals[0]) == ListType: # it's an extended header xsize = int(vals[0][0]) ysize = int(vals[0][1]) numslices = int(vals[0][2]) else: xsize = int(vals[0]) ysize = int(vals[1]) numslices = int(vals[2]) print xsize,ysize,numslices, d.shape except: print "No header file. Continuing ..." if numslices == 1: d.shape = [ysize,xsize] return np.transpose(d)*1 else: d.shape = [numslices,ysize,xsize] return np.transpose(d)*1 def mput(outarray,fname,writeheader=0,btype=np.int16): """ Save a file for use in matlab. """ outarray = np.transpose(outarray) outdata = np.ravel(outarray).astype(btype) outdata = outdata.tostring() outfile = open(fname,'wb') outfile.write(outdata) outfile.close() if writeheader == 1: try: suffixindex = string.rfind(fname,'.') hdrname = fname[0:suffixindex] except ValueError: hdrname = fname if len(outarray.shape) == 2: hdr = [outarray.shape[1],outarray.shape[0], 1, 0] else: hdr = [outarray.shape[2],outarray.shape[1],outarray.shape[0], 0,'\n'] print hdrname+'.hdr' outfile = open(hdrname+'.hdr','w') outfile.write(pstat.list2string(hdr)) outfile.close() return None def bput(outarray,fname,writeheader=0,packtype=np.int16,writetype='wb'): """ Writes the passed array to a binary output file, and then closes the file. Default is overwrite the destination file. Usage: bput (outarray,filename,writeheader=0,packtype=np.int16,writetype='wb') """ suffix = fname[-6:] if suffix == 'bshort': packtype = np.int16 elif suffix == 'bfloat': packtype = np.float32 else: print 'Not a bshort or bfloat file. Using packtype=',packtype outdata = np.ravel(outarray).astype(packtype) # littleEndian = ( struct.pack('i',1)==struct.pack(' 512*512: return np.reshape(d[-512*512:],(512,512)) elif len(d) > 320*320: return np.reshape(d[-320*320:],(320,320)) elif len(d) > 256*256: return np.reshape(d[-256*256:],(256,256)) elif len(d) > 128*128: return np.reshape(d[-128*128:],(128,128)) elif len(d) > 64*64: return np.reshape(d[-64*64:],(64,64)) else: return np.reshape(d[-32*32:],(32,32)) def quickload(fname,linestocut=4): """ Quickly loads in a long text file, chopping off first n 'linestocut'. Usage: quickload(fname,linestocut=4) Returns: array filled with data in fname """ f = open(fname,'r') d = f.readlines() f.close() print fname,'read inp.' d = d[linestocut:] d = map(string.split,d) print 'Done with string.split on lines.' for i in range(len(d)): d[i] = map(string.atoi,d[i]) print 'Conversion to ints done.' return np.array(d) def writedelimited (listoflists, delimiter, file, writetype='w'): """ Writes a list of lists in columns, separated by character(s) delimiter to specified file. File-overwrite is the default. Usage: writedelimited (listoflists,delimiter,filename,writetype='w') Returns: None """ if type(listoflists[0]) not in [ListType,TupleType]: listoflists = [listoflists] outfile = open(file,writetype) rowstokill = [] list2print = copy.deepcopy(listoflists) for i in range(len(listoflists)): if listoflists[i] == ['\n'] or listoflists[i]=='\n' or listoflists[i]=='dashes': rowstokill = rowstokill + [i] rowstokill.reverse() for row in rowstokill: del list2print[row] maxsize = [0]*len(list2print[0]) for row in listoflists: if row == ['\n'] or row == '\n': outfile.write('\n') elif row == ['dashes'] or row == 'dashes': dashes = [0]*len(maxsize) for j in range(len(maxsize)): dashes[j] = '------' outfile.write(pstat.linedelimited(dashes,delimiter)) else: outfile.write(pstat.linedelimited(row,delimiter)) outfile.write('\n') outfile.close() return None def writecc (listoflists,file,writetype='w',extra=2): """ Writes a list of lists to a file in columns, customized by the max size of items within the columns (max size of items in col, +2 characters) to specified file. File-overwrite is the default. Usage: writecc (listoflists,file,writetype='w',extra=2) Returns: None """ if type(listoflists[0]) not in [ListType,TupleType]: listoflists = [listoflists] outfile = open(file,writetype) rowstokill = [] list2print = copy.deepcopy(listoflists) for i in range(len(listoflists)): if listoflists[i] == ['\n'] or listoflists[i]=='\n' or listoflists[i]=='dashes': rowstokill = rowstokill + [i] rowstokill.reverse() for row in rowstokill: del list2print[row] maxsize = [0]*len(list2print[0]) for col in range(len(list2print[0])): items = pstat.colex(list2print,col) items = map(pstat.makestr,items) maxsize[col] = max(map(len,items)) + extra for row in listoflists: if row == ['\n'] or row == '\n': outfile.write('\n') elif row == ['dashes'] or row == 'dashes': dashes = [0]*len(maxsize) for j in range(len(maxsize)): dashes[j] = '-'*(maxsize[j]-2) outfile.write(pstat.lineincustcols(dashes,maxsize)) else: outfile.write(pstat.lineincustcols(row,maxsize)) outfile.write('\n') outfile.close() return None def writefc (listoflists,colsize,file,writetype='w'): """ Writes a list of lists to a file in columns of fixed size. File-overwrite is the default. Usage: writefc (listoflists,colsize,file,writetype='w') Returns: None """ if type(listoflists) == np.ndarray: listoflists = listoflists.tolist() if type(listoflists[0]) not in [ListType,TupleType]: listoflists = [listoflists] outfile = open(file,writetype) rowstokill = [] list2print = copy.deepcopy(listoflists) for i in range(len(listoflists)): if listoflists[i] == ['\n'] or listoflists[i]=='\n' or listoflists[i]=='dashes': rowstokill = rowstokill + [i] rowstokill.reverse() for row in rowstokill: del list2print[row] n = [0]*len(list2print[0]) for row in listoflists: if row == ['\n'] or row == '\n': outfile.write('\n') elif row == ['dashes'] or row == 'dashes': dashes = [0]*colsize for j in range(len(n)): dashes[j] = '-'*(colsize) outfile.write(pstat.lineincols(dashes,colsize)) else: outfile.write(pstat.lineincols(row,colsize)) outfile.write('\n') outfile.close() return None def load(fname,lines_to_ignore=4,type='i'): """ Load in huge, flat, 2D text files. Can handle differing line-lengths AND can strip #/% on UNIX (or with a better NT grep). Requires wc, grep, and mmapfile.lib/.pyd. Type can be 'i', 'f' or 'd', for ints, floats or doubles, respectively. Lines_to_ignore determines how many lines at the start of the file to ignore (required for non-working grep). Usage: load(fname,lines_to_ignore=4,type='i') Returns: numpy array of specified type """ start = time.time() ## START TIMER if type == 'i': intype = int elif type in ['f','d']: intype = float else: raise ValueError, "type can be 'i', 'f' or 'd' in load()" ## STRIP OUT % AND # LINES tmpname = tempfile.mktemp() if sys.platform == 'win32': # NT VERSION OF GREP DOESN'T DO THE STRIPPING ... SIGH cmd = "grep.exe -v \'%\' "+fname+" > "+tmpname print cmd os.system(cmd) else: # UNIX SIDE SHOULD WORK cmd = "cat "+fname+" | grep -v \'%\' |grep -v \'#\' > "+tmpname print cmd os.system(cmd) ## GET NUMBER OF ROWS, COLUMNS AND LINE-LENGTH, USING WC wc = string.split(os.popen("wc "+tmpname).read()) numlines = int(wc[0]) - lines_to_ignore tfp = open(tmpname) if lines_to_ignore <> 0: for i in range(lines_to_ignore): junk = tfp.readline() numcols = len(string.split(tfp.readline())) #int(float(wc[1])/numlines) tfp.close() ## PREPARE INPUT SPACE a = np.zeros((numlines*numcols), type) block = 65536 # chunk to read, in bytes data = mmapfile.mmapfile(tmpname, '', 0) if lines_to_ignore <> 0 and sys.platform == 'win32': for i in range(lines_to_ignore): junk = data.readline() i = 0 d = ' ' carryover = '' while len(d) <> 0: d = carryover + data.read(block) cutindex = string.rfind(d,'\n') carryover = d[cutindex+1:] d = d[:cutindex+1] d = map(intype,string.split(d)) a[i:i+len(d)] = d i = i + len(d) end = time.time() print "%d sec" % round(end-start,2) data.close() os.remove(tmpname) return np.reshape(a,[numlines,numcols]) def find_dirs(sourcedir): """Finds and returns all directories in sourcedir Usage: find_dirs(sourcedir) Returns: list of directory names (potentially empty) """ files = os.listdir(sourcedir) dirs = [] for fname in files: if os.path.isdir(os.path.join(sourcedir,fname)): dirs.append(fname) return dirs # ALIASES ... save = aput def binget(fname,btype=None): """ Loads a binary file from disk. Assumes associated hdr file is in same locationp. You can force an unpacking type, or else it tries to figure it out from the filename (4th-to-last character). Hence, readable file formats are ... 1bin=int8, sbin=int16, ibin=int32, fbin=float32, dbin=float64, etc. Usage: binget(fname,btype=None) Returns: data in file fname of type btype """ file = open(fname,'rb') bdata = file.read() file.close() # if none given, assume character preceeding 'bin' is the unpacktype if not btype: btype = fname[-4] try: bdata = np.fromstring(bdata,btype) except: raise ValueError, "Bad unpacking type." # force the data on disk to be LittleEndian (for more efficient PC/Linux use) if not np.little_endian: bdata = bdata.byteswap() try: header = fname[:-3]+'hdr' vals = get(header,0) # '0' means no missing-file warning msg print vals if type(vals[0]) == ListType: # it's an extended header xsize = int(vals[0][0]) ysize = int(vals[0][1]) numslices = int(vals[0][2]) else: bdata.shape = vals except: print "No (or bad) header file. Returning unshaped array." return np.array(bdata) def binput(outarray,fname,packtype=None,writetype='wb'): """ Unravels outarray and writes the data to a file, always in LittleEndian format, along with a header file containing the original data shape. Default is overwrite the destination file. Tries to figure out packtype from 4th-to-last character in filename. Thus, the routine understands these file formats ... 1bin=int8, sbin=int16, ibin=int32, fbin=float32, dbin=float64, etc. Usage: binput(outarray,filename,packtype=None,writetype='wb') """ if not packtype: packtype = fname[-4] # a speck of error checking if packtype == np.int16 and outarray.dtype.char == 'f': # check to see if there's data loss if max(np.ravel(outarray)) > 32767 or min(np.ravel(outarray))<-32768: print "*** WARNING: CONVERTING FLOAT DATA TO OUT-OF RANGE INT16 DATA" outdata = np.ravel(outarray).astype(packtype) # force the data on disk to be little_endian (for more efficient PC/Linux use) if not np.little_endian: outdata = outdata.byteswap() outdata = outdata.tostring() outfile = open(fname,writetype) outfile.write(outdata) outfile.close() # Now, write the header file try: suffixindex = string.rfind(fname,'.') hdrname = fname[0:suffixindex+2]+'hdr' # include .s or .f or .1 or whatever except ValueError: hdrname = fname hdr = outarray.shape print hdrname outfile = open(hdrname,'w') outfile.write(pstat.list2string(hdr)) outfile.close() return None def getafniparam(headfilename,paramname): """ Loads in an AFNI header file, and returns the values of 'paramname'. Usage: getafniparam(headfile,paramname) Returns: appropriate "type" for params, or None if fails """ if headfilename[-4:] == 'BRIK': # if asked for BRIK, change it to HEAD headfilename = headfilename[:-4]+'HEAD' d = get(headfilename) lines = open(headfilename,'r').readlines() for i in range(len(lines)): if string.find(lines[i],paramname) <> -1: count = d[i+1][-1] gotten = 0 result = [] for j in range(i+2,len(lines)): for k in range(len(d[j])): if type(d[j][k]) == StringType: result = d[j][k][1:count] return result else: result.append(d[j][k]) gotten += 1 if gotten == count: break return result return None def add2afnihistory(headfilename,newtext): """ Adds 'newtext' to HISTORY_NOTE in afni file specified in headfilename. Usage: add2afnihistory(headfile,newtext) Returns: None """ if headfilename[-4:] == 'BRIK': # if asked for BRIK, change it to HEAD headfilename = headfilename[:-4]+'HEAD' d = get(headfilename) lines = open(headfilename,'r').readlines() for i in range(len(lines)): if string.find(lines[i],'HISTORY_NOTE') <> -1: bytecount = d[i+1][-1] oldstr = lines[i+2][:-2] date = '[python:*** %s] ' %time.asctime() lines[i+2] = oldstr +'\\n' +date +newtext +'~\n' lines[i+1] = ' count = %s\n' %str(len(lines[i+2])) f = open(headfilename,'w') f.writelines(lines) f.close() return def array2afni(d,brikprefix,voltype=None,TR=2000,sliceorder='seqplus',geomparent=None,view=None,corrlength=1,briklabels=None,historytext=None): """ Converts an array 'd' to an AFNI BRIK/HEAD combo via putbin and to3d. Tries to guess the AFNI volume type voltype = {'-anat','-epan','-fim'} geomparent = filename of the afni BRIK file with the same geometry view = {'tlrc', 'acpc' or 'orig'} corrlength = # of images used in the (single-timeseries) correlation (for fico) briklabels = list of names (strings) to use for brick labels historytext = string to be appended to the history file, if any Usage: array2afni(d,brikprefix,voltype=None,TR=2000, sliceorder='seqplus',geomparent=None,view=None, corrlength=1,briklabels=None,historytext=None) Returns: None """ # converts numpy typecode()s into appropriate strings for to3d command line typecodemapping = {'c':'b', # character 'B':'b', # UnsignedInt8 'f':'f', # float0, float8, float16, float32 'd':'f', # float64 'b':'b', # int0, int8 'h':'', # int16 'i':'i', # int32 'l':'i'} # int # Verify that the data is proper size (3- or 4-D) if len(d.shape) not in [3,4]: raise ValueError, "A 3D or 4D array is required for array2afni() ... %s" %d.shape # Save out the array to a binary file, homebrew style if d.dtype.char == np.float64: outcode = 'f' else: outcode = d.dtype.char tmpoutname = 'afnitmp.%sbin' % outcode binput(d.astype(outcode),tmpoutname) if not voltype: if len(d.shape) == 3: # either anatomy or functional if d.dtype.char in ['s','i','l']: # if floats, assume functional voltype = '-anat' else: voltype = '-fim' else: # 4D dataset, must be anatomical timeseries (epan) voltype = '-anat' if voltype[0] != '-': voltype = '-'+voltype if len(d.shape) == 3: # either anatomy or functional timepts = 1 slices = d.shape[0] timestr = '' elif len(d.shape) == 4: if voltype=='-fico': timepts = 1 d = np.reshape(d,[d.shape[0]*d.shape[1],d.shape[2],d.shape[3]]) slices = d.shape[0] timestr = '-statpar %s 1 1 ' % corrlength else: timepts = d.shape[0] slices = d.shape[1] timestr = '-time:zt %d %d %0.3f %s ' % (slices,timepts,TR,sliceorder) cmd = 'to3d %s -prefix %s -session . ' % (voltype, brikprefix) if not view: view = 'orig' cmd += '-view %s ' % view if geomparent: cmd += '-geomparent %s ' % geomparent cmd += timestr cmd += '3D%s:0:0:%d:%d:%d:%s' % (typecodemapping[d.dtype.char],d.shape[-1],d.shape[-2],slices*timepts,tmpoutname) print cmd os.system(cmd) os.remove(tmpoutname) os.remove(tmpoutname[:-3]+'hdr') if len(d.shape)==4 and briklabels: names = '' for label in briklabels: names += str(label)+'~' count = len(names) appendstr = """\n\ntype = string-attribute name = BRICK_LABS count = %s '%s""" % (count, names) f = open('%s+%s.HEAD' %(brikprefix,view), 'a') f.write(appendstr) f.close() if historytext: add2afnihistory('%s+%s.HEAD'%(brikprefix,view),historytext) def makeDType(exemplar): """Return a dtype object based on the given list or dict. This is a convenience function -- if you want to do anything sophisticated it's best to compose the dtype "by hand". """ if type(exemplar) is dict: names = exemplar.keys(); names.sort() formats = [np.array(exemplar[key]).dtype for key in names] return np.dtype({'names':names, 'formats':formats}) else: formats = ','.join([np.array(val).dtype.str for val in exemplar]) return np.dtype(formats) gamera-3.3.3/gamera/knn.py0000644000076500000000000006432011652050143014340 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from threading import * import sys, os from gamera import core, util, config, classify from gamera.plugins import features as features_module import gamera.knncore, gamera.gamera_xml import array from gamera.knncore import CITY_BLOCK from gamera.knncore import EUCLIDEAN from gamera.knncore import FAST_EUCLIDEAN KNN_XML_FORMAT_VERSION = 1.0 _distance_type_to_name = { CITY_BLOCK: "CITY-BLOCK", EUCLIDEAN: "EUCLIDEAN", FAST_EUCLIDEAN: "FAST-EUCLIDEAN" } _distance_type_to_number = { "CITY-BLOCK": CITY_BLOCK, "EUCLIDEAN": EUCLIDEAN, "FAST-EUCLIDEAN": FAST_EUCLIDEAN } class GaWorker(Thread): def __init__(self, knn): Thread.__init__(self) self.knn = knn def run(self): self.knn.ga_initial = self.knn._ga_create() self.knn.ga_best = self.knn.ga_initial while(1): if self.knn.ga_worker_stop: return self.knn.ga_best = self.knn._ga_step() self.knn.ga_generation += 1 for x in self.knn.ga_callbacks: x(self.knn) # The kNN classifier stores it settings in a simple xml file - # this class uses the gamera_xml.LoadXML class to load that # file. After the file is loaded, kNN.load_settings extracts # the data from the class to set up kNN. class _KnnLoadXML(gamera.gamera_xml.LoadXML): def __init__(self): gamera.gamera_xml.LoadXML.__init__(self) def _setup_handlers(self): self.feature_functions = [] self.weights = { } self.num_k = None self.distance_type = None self.ga_mutation = None self.ga_crossover = None self.ga_population = None self.add_start_element_handler('gamera-knn-settings', self._tag_start_knn_settings) self.add_start_element_handler('ga', self._tag_start_ga) self.add_start_element_handler('weights', self._tag_start_weights) self.add_end_element_handler('weights', self._tag_end_weights) def _remove_handlers(self): self.remove_start_element_handler('gamera-knn-settings') self.remove_start_element_handler('ga') self.remove_start_element_handler('weights') def _tag_start_knn_settings(self, a): version = self.try_type_convert(a, 'version', float, 'gamera-knn-settings') if version < KNN_XML_FORMAT_VERSION: raise gamera_xml.XMLError( "knn-settings XML file is an older version that can not be read by this version of Gamera.") self.num_k = self.try_type_convert(a, 'num-k', int, 'gamera-knn-settings') self.distance_type = \ _distance_type_to_number[self.try_type_convert(a, 'distance-type', str, 'gamera-knn-settings')] def _tag_start_ga(self, a): self.ga_mutation = self.try_type_convert(a, 'mutation', float, 'ga') self.ga_crossover = self.try_type_convert(a, 'crossover', float, 'ga') self.ga_population = self.try_type_convert(a, 'population', int, 'ga') def _tag_start_weights(self, a): self.add_start_element_handler('weight', self._tag_start_weight) self.add_end_element_handler('weight', self._tag_end_weight) def _tag_end_weights(self): self.remove_start_element_handler('weight') self.remove_end_element_handler('weight') def _tag_start_weight(self, a): self._data = u'' self._weight_name = str(a["name"]) self._parser.CharacterDataHandler = self._add_weights def _tag_end_weight(self): self._parser.CharacterDataHandler = None self.weights[self._weight_name] = array.array('d') nums = str(self._data).split() tmp = array.array('d', [float(x) for x in nums]) self.weights[self._weight_name] = tmp def _add_weights(self, data): self._data += data class _kNNBase(gamera.knncore.kNN): """k-NN classifier that supports optimization using a Genetic Algorithm. This classifier supports all of the Gamera interactive/non-interactive classifier interface.""" def __init__(self, num_features=1, num_k=1): """Constructor for knn object. Features is a list of feature names to use for classification. If features is none then the default settings will be loaded from a file specified in the user config file. If there is no settings file specified then all of the features will be used.""" gamera.knncore.kNN.__init__(self) self.num_features = num_features self.num_k = num_k self.ga_initial = 0.0 self.ga_best = 0.0 self.ga_worker_thread = None self.ga_worker_stop = 0 self.ga_generation = 0 self.ga_callbacks = [] def __del__(self): pass def distance_from_images(self, images, glyph, max=None): """**distance_from_images** (ImageList *glyphs*, Image *glyph*, Float *max* = ``None``) Compute a list of distances between a list of glyphs and a single glyph. Distances greater than *max* are not included in the output. The return value is a list of floating-point distances. """ self.generate_features(glyph) self.generate_features_on_glyphs(images) if max is None: return self._distance_from_images(iter(images), glyph) else: return self._distance_from_images(iter(images), glyph, max) def distance_between_images(self, imagea, imageb): """**distance_between_images** (Image *imagea*, Image *imageb*) Compute the distance between two images using the settings for the kNN object (distance_type, features, weights, etc). This can be used when more control over the distance computations are needed than with any of the other methods that work on multiple images at once.""" self.generate_features(imagea) self.generate_features(imageb) return self._distance_between_images(imagea, imageb) def distance_matrix(self, images, normalize=True): """**distance_matrix** (ImageList *images*, Bool *normalize* = ``True``) Create a symmetric FloatImage containing all of the distances between the images in the list passed in. This is useful because it allows you to find the distance between any two pairs of images regardless of the order of the pairs. *normalize* When true, the features are normalized before performing the distance calculations.""" self.generate_features_on_glyphs(images) l = len(images) progress = util.ProgressFactory("Generating unique distances...", l) m = self._distance_matrix(images, progress.step, normalize) #m = self._distance_matrix(images) progress.kill() return m def unique_distances(self, images, normalize=True): """**unique_distances** (ImageList *images*, Bool *normalize* = ``True``) Return a list of the unique pairs of images in the passed in list and the distances between them. The return list is a list of tuples of (distance, imagea, imageb) so that it easy to sort. *normalize* When true, the features are normalized before performing the distance calculations.""" self.generate_features_on_glyphs(images) l = len(images) progress = util.ProgressFactory("Generating unique distances...", l) dists = self._unique_distances(images, progress.step, normalize) #dists = self._unique_distances(images) progress.kill() return dists def evaluate(self): """Float **evaluate** () Evaluate the performance of the kNN classifier using leave-one-out cross-validation. The return value is a floating-point number between 0.0 (0% correct) and 1.0 (100% correct). """ self.instantiate_from_images(self.database) ans = self.leave_one_out() return float(ans[0]) / float(ans[1]) def knndistance_statistics(self, k=0): """**knndistance_statistics** (Int *k* = 0) Returns a list of average distances between each training sample and its *k* nearest neighbors. So, when you have *n* training samples, *n* average distance values are returned. This can be useful for distance rejection. Each item in the returned list is a tuple (*d*, *classname*), where *d* is the average kNN distance and *classname* is the class name of the training sample. In most cases, the class name is of little interest, but it could be useful if you need class conditional distance statistics. Beware however, that the average distance is computed over neighbors belonging to any class, not just the same class. If you need the latter, you must create a new classifier from training samples belonging only to the specific class. When *k* is zero, the property ``num_k`` of the knn classifier is used. """ self.instantiate_from_images(self.database) progress = util.ProgressFactory("Generating knndistance statistics...", len(self.database)) stats = self._knndistance_statistics(k, progress.step) progress.kill() return stats def settings_dialog(self, parent): """Display a settings dialog for k-NN settings""" from gamera import args dlg = args.Args([args.Int('k', range=(0, 100), default=self.num_k), args.Choice('Distance Function', ['City block', 'Euclidean', 'Fast Euclidean'], default = self.distance_type) ], name="kNN settings") results = dlg.show(parent) if results is None: return self.num_k, self.distance_type = results def save_settings(self, filename): """**save_settings** (FileSave *filename*) Save the kNN settings to the given filename. This settings file (which is XML) includes k, distance type, GA mutation rate, GA crossover rate, GA population size, and the current floating point weights. This file is different from the one produced by serialize in that it contains only the settings and no data.""" from util import word_wrap file = open(filename, "w") indent = 0 word_wrap(file, '', indent) word_wrap(file, '' % (KNN_XML_FORMAT_VERSION, self.num_k, _distance_type_to_name[self.distance_type]), indent) indent += 1 word_wrap(file, '' % (self.ga_mutation, self.ga_crossover, self.ga_population), indent) if self.feature_functions != None: word_wrap(file, '', indent) indent += 1 feature_no = 0 weights = self.get_weights() for name, function in self.feature_functions[0]: word_wrap(file, '' % name, indent) length = function.return_type.length word_wrap(file, [x for x in weights[feature_no:feature_no+length]], indent + 1) word_wrap(file, '', indent) feature_no += length indent -= 1 word_wrap(file, '', indent) indent -= 1 word_wrap(file, '', indent) file.close() def load_settings(self, filename): """**load_settings** (FileOpen *filename*) Load the kNN settings from an XML file. See save_settings_.""" from gamera import core loader = _KnnLoadXML() loader.parse_filename(filename) self.num_k = loader.num_k self.distance_type = loader.distance_type self.ga_mutation = loader.ga_mutation self.ga_crossover = loader.ga_crossover self.ga_population = loader.ga_population functions = loader.weights.keys() functions.sort() self.change_feature_set(functions) # Create the weights array with the weights in the correct order weights = array.array('d') for x in self.feature_functions[0]: weights.extend(loader.weights[x[0]]) self.set_weights(weights) def serialize(self, filename): """**serialize** (FileSave *filename*) Saves the classifier-specific settings *and* data in an optimized and classifer-specific format. .. note:: It is good practice to retain the XML file, since it is portable across platforms and to future versions of Gamera. The binary format is not guaranteed to be portable.""" if self.features == 'all': gamera.knncore.kNN.serialize(self, filename,['all']) else: gamera.knncore.kNN.serialize(self, filename,self.features) def unserialize(self, filename): """**unserialize** (FileOpen *filename*) Opens the classifier-specific settings *and* data from an optimized and classifer-specific format.""" features = gamera.knncore.kNN.unserialize(self, filename) if len(features) == 1 and features[0] == 'all': self.change_feature_set('all') else: self.change_feature_set(features) def generate_features(self, glyph): """**generate_features** (Image *glyph*) Generates features for the given glyph. """ glyph.generate_features(self.feature_functions) class kNNInteractive(_kNNBase, classify.InteractiveClassifier): def __init__(self, database=[], features='all', perform_splits=1, num_k=1): """**kNNInteractive** (ImageList *database* = ``[]``, *features* = 'all', bool *perform_splits* = ``True``, int *num_k* = ``1``) Creates a new kNN interactive classifier instance. *database* Must be a list (or Python interable) containing glyphs to use as training data for the classifier. Any images in the list that were manually classified (have classification_state == MANUAL) will be used as training data for the classifier. Any UNCLASSIFIED or AUTOMATICALLY classified images will be ignored. When initializing a noninteractive classifier, the database *must* be non-empty. *features* A list of feature function names to use for classification. These feature names correspond to the `feature plugin methods`__. To use all available feature functions, pass in ``'all'``. .. __: plugins.html#features *perform_splits* If ``perform_splits`` is ``True``, glyphs trained with names beginning with ``_split.`` are run through a given splitting algorithm. For instance, glyphs that need to be broken into upper and lower halves for further classification of those parts would be trained as ``_split.splity``. When the automatic classifier encounters glyphs that most closely match those trained as ``_split``, it will perform the splitting algorithm and then continue to recursively classify its parts. The `splitting algorithms`__ are documented in the plugin documentation. .. __: plugins.html#segmentation New splitting algorithms can be created by `writing plugin`__ methods in the category ``Segmentation``. .. __: writing_plugins.html """ self.features = features self.feature_functions = core.ImageBase.get_feature_functions(features) num_features = features_module.get_features_length(features) _kNNBase.__init__(self, num_features=num_features, num_k=num_k) classify.InteractiveClassifier.__init__(self, database, perform_splits) def __del__(self): _kNNBase.__del__(self) classify.InteractiveClassifier.__del__(self) def noninteractive_copy(self): """**noninteractive_copy** () Creates a non-interactive copy of the interactive classifier.""" return kNNNonInteractive( list(self.get_glyphs()), self.features, self._perform_splits, num_k=self.num_k) def supports_optimization(self): """Flag indicating that this classifier supports optimization.""" return False def change_feature_set(self, f): """**change_feature_set** (*features*) Changes the set of features used in the classifier to the given list of feature names. *features* These feature names correspond to the `feature plugin methods`__. To use all available feature functions, pass in ``'all'``. .. __: plugins.html#features""" self.features = f self.feature_functions = core.ImageBase.get_feature_functions(f) self.num_features = features_module.get_features_length(f) if len(self.database): self.is_dirty = True self.generate_features_on_glyphs(self.database) class kNNNonInteractive(_kNNBase, classify.NonInteractiveClassifier): def __init__(self, database=[], features='all', perform_splits=True, num_k=1): """**kNNNonInteractive** (ImageList *database* = ``[]``, *features* = ``'all'``, bool *perform_splits* = ``True``, int *num_k* = ``1``) Creates a new kNN classifier instance. *database* Can be in one of two forms: - When a list (or Python iterable) each element is a glyph to use as training data for the classifier. (For non-interactive classifiers, this list must be non-empty). - For non-interactive classifiers, *database* may be a filename, in which case the classifier will be "unserialized" from the given file. Any images in the list that were manually classified (have classification_state == MANUAL) will be used as training data for the classifier. Any UNCLASSIFIED or AUTOMATICALLY classified images will be ignored. When initializing a noninteractive classifier, the database *must* be non-empty. *features* A list of feature function names to use for classification. These feature names correspond to the `feature plugin methods`__. To use all available feature functions, pass in ``'all'``. .. __: plugins.html#features *perform_splits* If ``perform_splits`` is ``True``, glyphs trained with names beginning with ``_split.`` are run through a given splitting algorithm. For instance, glyphs that need to be broken into upper and lower halves for further classification of those parts would be trained as ``_split.splity``. When the automatic classifier encounters glyphs that most closely match those trained as ``_split``, it will perform the splitting algorithm and then continue to recursively classify its parts. The `splitting algorithms`__ are documented in the plugin documentation. .. __: plugins.html#segmentation New splitting algorithms can be created by `writing plugin`__ methods in the category ``Segmentation``. .. __: writing_plugins.html """ self.features = features self.feature_functions = core.ImageBase.get_feature_functions(features) num_features = features_module.get_features_length(features) _kNNBase.__init__(self, num_features=num_features, num_k=num_k) classify.NonInteractiveClassifier.__init__(self, database, perform_splits) def __del__(self): _kNNBase.__del__(self) classify.NonInteractiveClassifier.__del__(self) def change_feature_set(self, f): """**change_feature_set** (*features*) Changes the set of features used in the classifier to the given list of feature names. *features* These feature names correspond to the `feature plugin methods`__. To use all available feature functions, pass in ``'all'``. .. __: plugins.html#features""" self.features = f self.feature_functions = core.ImageBase.get_feature_functions(f) self.num_features = features_module.get_features_length(f) if len(self.database): self.is_dirty = True self.generate_features_on_glyphs(self.database) self.instantiate_from_images(self.database) def supports_optimization(self): """Flag indicating that this classifier supports optimization.""" return True def start_optimizing(self): """**start_optimizing** () Starts the genetic algorithm optimization of the weights of the features. The optimization is run in a background thread. In the genetic algorithm, the population consists of vectors of feature weights. The vectors are evaluated using the leave_one_out algorithm. The vectors that perform well are allowed to reproduce to producing offspring using combination at a randomly chosen split point. For a user-friendly way to perform GA optimization, consider the Biollante_ tool in the Gamera GUI. .. _Biollante: gui.html#classifier-optimization-biollante""" self.ga_worker_stop = False self.ga_worker_thread = GaWorker(self) self.ga_worker_thread.setDaemon(1) self.ga_worker_thread.start() def stop_optimizing(self): """**stop_optimizing** () Stops the background optimization thread. NOTE: This method has to wait for the current GA generation to finish before returning, which could take several seconds.""" if not self.ga_worker_thread: return self.ga_worker_stop = 1 self.ga_worker_thread.join() self.ga_worker_thread = None self._ga_destroy() return self.ga_best def add_optimization_callback(self, func): """**add_optimization_callback** (*function*) Adds a function that will be called everytime the optimization process improves the performance of the classifier. This callback function must take one argument which is an instance of the kNN classifier.""" self.ga_callbacks.append(func) def remove_optimization_callback(self, func): """**remove_optimization_callback** (*function*) Removes an optimization callback function added using add_optimization_callback_.""" try: self.ga_callbacks.remove(func) except: pass def simple_feature_selector(glyphs): """simple_feature_selector does a brute-force search through all possible combinations of features and returns a sorted list of tuples (accuracy, features). WARNING: this function should take a long time to complete.""" if len(glyphs) <= 1: raise RuntimeError("Lenght of list must be greater than 1") c = classify.kNNNonInteractive() # For efficiency we calculate all of the features and pass in the # indexes of the features vector that we want to use for the distance # calculation. This is more efficient than using the features weights # or recalculating the features. all_features = [] feature_indexes = {} offset = 0 for x in glyphs[0].get_feature_functions()[0]: all_features.append(x[0]) feature_indexes[x[0]] = range(offset, offset + x[1].return_type.length) offset += x[1].return_type.length # First do the easy ones = single features and all features answers = [] c.change_feature_set(all_features) c.set_glyphs(glyphs) ans = c.classifier.leave_one_out() # Because we are only interested in top score, we can stop the evaluation # after we have missed too many answers to possibly beat the top score. # Therefore, we store the number missed for the top score here and pass # it into leave_one_out. stop_threshold = ans[1] - ans[0] answer = (float(ans[0]) / float(ans[1]), all_features) for x in all_features: ans = c.classifier.leave_one_out(feature_indexes[x], stop_threshold) num_wrong = ans[1] - ans[0] print num_wrong, ans[1], ans[0] if num_wrong < stop_threshold: stop_threshold = num_wrong answer = (float(ans[0]) / float(ans[1]), x) # Now do the remaining combinations using the CombGen object for each # size subset of all of the features. for i in range(2, len(all_features) - 1): for x in CombGen(all_features, i): indexes = [] for y in x: indexes.extend(feature_indexes[y]) ans = c.classifier.leave_one_out(indexes, stop_threshold) num_wrong = ans[1] - ans[0] print num_wrong, ans[1], ans[0] if num_wrong < stop_threshold: stop_threshold = num_wrong answer = (float(ans[0]) / float(ans[1]), x) return answer class CombGen: """Generate the k-combinations of a sequence. This is a iterator that generates the combinations on the fly. This code was adapted from a posting by Tim Peters""" def __init__(self, seq, k): n = self.n = len(seq) if not 1 <= k <= n: raise ValueError("k must be in 1.." + `n` + ": " + `k`) self.k = k self.seq = seq self.indices = range(k) # Trickery to make the first .next() call work. self.indices[-1] = self.indices[-1] - 1 def __iter__(self): return self def next(self): n, k, indices = self.n, self.k, self.indices lasti, limit = k-1, n-1 while lasti >= 0 and indices[lasti] == limit: lasti = lasti - 1 limit = limit - 1 if lasti < 0: raise StopIteration newroot = indices[lasti] + 1 indices[lasti:] = range(newroot, newroot + k - lasti) # Build the result. result = [] seq = self.seq for i in indices: result.append(seq[i]) return result def _get_id_stats(glyphs, k=None): import stats if len(glyphs) < 3: return (len(glyphs),1.0, 1.0, 1.0) if k is None: k = kNN() distances = k.unique_distances(glyphs) return (len(glyphs),stats.lmean(distances), stats.lstdev(distances), stats.lmedian(distances)) def get_glyphs_stats(glyphs): k = kNN() klasses = {} for x in glyphs: id = x.get_main_id() if not klasses.has_key(id): klasses[id] = [] klasses[id].append(x) stats = {} for x in klasses.iteritems(): stats[x[0]] = _get_id_stats(x[1], k) return stats def comma_delim_stats(glyphs, filename): file = open(filename, "w") stats = get_glyphs_stats(glyphs) for x in stats.iteritems(): file.write(x[0]) file.write(',') file.write(str(x[1][0])) file.write(',') file.write(str(x[1][1])) file.write(',') file.write(str(x[1][2])) file.write(',') file.write(str(x[1][3])) file.write('\n') file.close() def glyphs_by_category(glyphs): klasses = {} for x in glyphs: id = x.get_main_id() if not klasses.has_key(id): klasses[id] = [] klasses[id].append(x) return klasses gamera-3.3.3/gamera/knn_editing.py0000644000076500000000000002762311216641433016054 0ustar chriswheel# # various editing techniques to improve kNN Classifier performance # Copyright (C) 2007, 2008 Colin Baumgarten # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. from random import randint from gamera.args import Args, Int, Check from gamera.knn import kNNInteractive from gamera.util import ProgressFactory def _randomSetElement(set): """Retrieve a random element from the given set *set* The set from which to select a random element""" randPos = randint(0, len(set) - 1); for pos, elem in enumerate(set): if pos == randPos: return elem def _copyClassifier(original, k = 0): """Copy a given kNNClassifer by constructing a new one with identical parameters. *original* The classifier to be copied *k* If the copy shall have another k-value as the original, set k accordingly. k = 0 means, that the original's k-value will be used""" if k == 0: k = original.num_k return kNNInteractive( list(original.get_glyphs()), original.features, original._perform_splits, k) def _getMainId(classificationResult): """Classification results returned from a kNN Classifier are in a list containing '(confidence, className)' tuples. So to determine the 'main class', the classname with the highest confidence has to be returned. """ # classificationResult is a tuple of the form # ([idname1, idname2, ...], confidences_for_idname1) return classificationResult[0][0][1] class AlgoRegistry(object): """Registry containing a list of all available editing algorithms. Besides the callable itself, the registry also stores its docstring, a displayname and type-information about any additionally required arguments. This information will be used by the gui to show a dialog to execute any of the available algorithms on a classifier. An editing algorithm is any callable object, that takes at least one parameter - a *gamera.knn.kNNInteractive* classifier - and returns a new edited *kNNInteractive* classifier. To add your own algorithm, use one of the *register()* methods or alternatively, let your callable inherit from *EditingAlgorithm* to register your algorithm,""" algorithms = [] def registerData(algoData): """Register a new editing Algorithm using metadata from an *AlgoData* object""" AlgoRegistry.algorithms.append(algoData) registerData = staticmethod(registerData) def register(name, callable, args = Args(), doc = ""): """Register a new editing Algorithm: The parameters are the same as in *AlgoData.__init__*, so see its doc for an explanation of the parameters.""" AlgoRegistry.registerData(AlgoData(name, callable, args, doc)) register = staticmethod(register) class AlgoData(object): """Class holding all metadata about an editing algorithm, that is required by *AlgoRegistry* *name* Name of the algorithm *callable* The callable object implementing the algorithm. Its first parameter has to be a *kNNInteractive* Classifier and it has to return a new *kNNInteractive* classifier. If the algorithm requires any additional parameters, they have to be specified in the *args* parameter *args* A *gamera.args.Args* object specifying any additional parameters required by the algorithm *doc* A docstring in reStructured Text format, describing the algorithm and its parameters""" def __init__(self, name, callable, args = Args(), doc = ""): self.name = name self.callable = callable self.args = args self.doc = doc class EditingAlgorithm(object): """Convenience class to automatically register editing algorithms with the *AlgoRegistry*. If you implement your algorithm as a callable class, you can just inherit from this class to let it automatically be registered. Just add two properties to the class: *name* The name of your algorithm *args* Type info about any additional required arguments (a *gamera.args.Args* object) """ def __init__(self): AlgoRegistry.register(self.name, self, self.args, self.__doc__) class EditMnn(EditingAlgorithm): """**edit_mnn** (kNNInteractive *classifier*, int *k* = 0, bool *protectRare*, int *rareThreshold*) Wilson's *Modified Nearest Neighbour* (MNN, aka *Leave-one-out-editing*). The algorithm removes 'bad' glyphs from the classifier, i.e. glyphs that are outliers from their class in featurespace, usually because they have been manually misclassified or are not representative for their class *classifier* The classifier from which to create an edited copy *internalK* The k value used internally by the editing algorithm. If 0 is given for this parameter, the original classifier's k is used (recommended). *protect rare classes* The algorithm tends to completely delete the items of rare classes, removing this whole class from the classifier. If this is not desired these rare classes can be explicitly protected from deletion. Note that enabling this option causes additional computing effort *rare class threshold* In case *protect rare classes* is enabled, classes with less than this number of elements are considered to be rare Reference: D. Wilson: 'Asymptotic Properties of NN Rules Using Edited Data'. *IEEE Transactions on Systems, Man, and Cybernetics*, 2(3):408-421, 1972 """ name = "Wilson's Modified Nearest Neighbour (MNN)" args = Args([Int("Internal k", default = 0), Check("Protect rare classes", default = True), Int("Rare class threshold", default = 3)]) def __call__(self, classifier, k = 0, protectRare = True, rareThreshold = 3): editedClassifier = _copyClassifier(classifier, k) toBeRemoved = set() progress = ProgressFactory("Generating edited MNN classifier...", len(classifier.get_glyphs())) # classify each glyph with its leave-one-out classifier for i, glyph in enumerate(classifier.get_glyphs()): editedClassifier.get_glyphs().remove(glyph) detectedClass = _getMainId(\ editedClassifier.guess_glyph_automatic(glyph)) # check if recognized class complies with the true class if glyph.get_main_id() != detectedClass: toBeRemoved.add(glyph) editedClassifier.get_glyphs().add(glyph) progress.step() rareClasses = self._getRareClasses(classifier.get_glyphs(), protectRare, rareThreshold) # remove 'bad' glyphs, if they are not in a rare class for glyph in toBeRemoved: if glyph.get_main_id() in rareClasses: continue editedClassifier.get_glyphs().remove(glyph) progress.kill() return editedClassifier def _getRareClasses(self, glyphs, protectRare, rareThreshold): """Produces a set containing the names of all rare classes""" result = set() if not protectRare: return result # histogram of classNames histo = {} for g in glyphs: count = histo.get(g.get_main_id(), 0) histo[g.get_main_id()] = count + 1 for className in histo: if histo[className] < rareThreshold: result.add(className) return result edit_mnn = EditMnn() class EditCnn(EditingAlgorithm): """**edit_cnn** (kNNInteractive *classifier*, int *k* = 0, bool *randomize*) Hart's *Condensed Nearest Neighbour (CNN)* editing. This alorithm is specialized in removing superfluous glyphs - glyphs that do not influence the recognition rate - from the classifier to improve its classification speed. Typically glyphs far from the classifiers decision boundaries are removed. *classifier* The classifier from which to create an edited copy *internalK* The k value used internally by the editing algorithm. 0 means, use the same value as the given classifier (recommended) *randomize* Because the processing order of the glyphs in the classifier impacts the result of this algorithm, the order will be randomized. If reproducable results are required, turn this option off. Reference: P.E. Hart: 'The Condensed Nearest Neighbor rule'. *IEEE Transactions on Information Theory*, 14(3):515-516, 1968 """ name = "Hart's Condensed Nearest Neighbour (CNN)" args = Args([Int("Internal k", default=0), Check("Randomize", default = True)]) def __call__(self, classifier, k = 0, randomize = True): # special case of empty classifier if (not classifier.get_glyphs()): return _copyClassifier(classifier) if k == 0: k = classifier.num_k progress = ProgressFactory("Generating edited CNN classifier...", len(classifier.get_glyphs())) # initialize Store (a) with a single element if randomize: elem = _randomSetElement(classifier.get_glyphs()) else: elem = classifier.get_glyphs().__iter__().next() aGlyphs = [elem] a = kNNInteractive(aGlyphs, classifier.features, classifier._perform_splits, k) progress.step() # initialize Grabbag (b) with all other b = classifier.get_glyphs().copy() b.remove(aGlyphs[0]); # Classify each glyph in b with a as the classifier # If glyph is misclassified, add it to a, repeat until no elements are # added to a changed = True while changed == True: changed = False # copy needed because iteration through dict is not possible while # deleting items from it copyOfB = b.copy() for glyph in copyOfB: if glyph.get_main_id() != _getMainId(a.guess_glyph_automatic(glyph)): b.remove(glyph) a.get_glyphs().add(glyph) progress.step() changed = True progress.kill() a.num_k = 1 return a edit_cnn = EditCnn() class EditMnnCnn(EditingAlgorithm): """**edit_mnn_cnn** (kNNInteractive *classifier*, int *k* = 0, bool *protectRare*, int *rareThreshold*, bool *randomize*) Combined execution of Wilson's Modified Nearest Neighbour and Hart's Condensed Nearest Neighbour. Combining the algorithms in this order is recommended, because first bad samples are removed to improve the classifiers accuracy, and then the remaining samples are condensed to speed up the classifier For documentation of the parameters see the independent algorithms""" name = "MNN, then CNN" args = Args([Int("Internal k", default = 0), Check("Protect rare classes", default = True), Int("Rare class threshold", default = 3), Check("Randomize", default = True)]) def __call__(self, classifier, k = 0, protectRare = True, rareThreshold = 3, randomize = True): return edit_cnn(edit_mnn(classifier, k, protectRare, rareThreshold), randomize) edit_mnn_cnn = EditMnnCnn() gamera-3.3.3/gamera/mac/0000755000076500000000000000000011755376174013756 5ustar chriswheelgamera-3.3.3/gamera/mac/__init__.py0000644000076500000000000000000210714675707016055 0ustar chriswheel gamera-3.3.3/gamera/mac/buildpkg.py0000644000076500000000000003127110714675707016133 0ustar chriswheel#!/usr/bin/env python """buildpkg.py -- Build OS X packages for Apple's Installer.app. This is an experimental command-line tool for building packages to be installed with the Mac OS X Installer.app application. Please read the file ReadMe.txt for more information! Dinu C. Gherman, gherman@europemail.com September 2002 !! USE AT YOUR OWN RISK !! """ __version__ = 0.3 __license__ = "FreeBSD" import os, sys, glob, fnmatch, shutil, string, copy, getopt from os.path import basename, dirname, join, islink, isdir, isfile Error = "buildpkg.Error" PKG_INFO_FIELDS = """\ Title Version Description DefaultLocation Diskname DeleteWarning NeedsAuthorization DisableStop UseUserMask Application Relocatable Required InstallOnly RequiresReboot InstallFat\ """ ###################################################################### # Helpers ###################################################################### # Convenience class, as suggested by /F. class GlobDirectoryWalker: "A forward iterator that traverses files in a directory tree." def __init__(self, directory, pattern="*"): self.stack = [directory] self.pattern = pattern self.files = [] self.index = 0 def __getitem__(self, index): while 1: try: file = self.files[self.index] self.index = self.index + 1 except IndexError: # pop next directory from stack self.directory = self.stack.pop() self.files = os.listdir(self.directory) self.index = 0 else: # got a filename fullname = join(self.directory, file) if isdir(fullname) and not islink(fullname): self.stack.append(fullname) if fnmatch.fnmatch(file, self.pattern): return fullname ###################################################################### # The real thing ###################################################################### class PackageMaker: """A class to generate packages for Mac OS X. This is intended to create OS X packages (with extension .pkg) containing archives of arbitrary files that the Installer.app (Apple's OS X installer) will be able to handle. As of now, PackageMaker instances need to be created with the title, version and description of the package to be built. The package is built after calling the instance method build(root, resources, **options). The generated package is a folder hierarchy with the top-level folder name equal to the constructor's title argument plus a '.pkg' extension. This final package is stored in the current folder. The sources from the root folder will be stored in the package as a compressed archive, while all files and folders from the resources folder will be added to the package as they are. Example: With /my/space being the current directory, the following will create /my/space/distutils-1.0.2.pkg/: PM = PackageMaker pm = PM("distutils-1.0.2", "1.0.2", "Python distutils.") pm.build("/my/space/sources/distutils-1.0.2") After a package is built you can still add further individual resource files or folders to its Contents/Resources subfolder by using the addResource(path) method: pm.addResource("/my/space/metainfo/distutils/") """ packageInfoDefaults = { 'Title': None, 'Version': None, 'Description': '', 'DefaultLocation': '/', 'Diskname': '(null)', 'DeleteWarning': '', 'NeedsAuthorization': 'NO', 'DisableStop': 'NO', 'UseUserMask': 'YES', 'Application': 'NO', 'Relocatable': 'YES', 'Required': 'NO', 'InstallOnly': 'NO', 'RequiresReboot': 'NO', 'InstallFat': 'NO'} def __init__(self, title, version, desc): "Init. with mandatory title/version/description arguments." info = {"Title": title, "Version": version, "Description": desc} self.packageInfo = copy.deepcopy(self.packageInfoDefaults) self.packageInfo.update(info) # variables set later self.packageContentsFolder = None self.packageRootFolder = None self.packageResourceFolder = None self.sourceFolder = None self.resourceFolder = None def _escapeBlanks(self, s): "Return a string with escaped blanks." return s.replace(' ', '\ ') def build(self, root, resources=None, **options): """Create a package for some given root folder. With no 'resources' argument set it is assumed to be the same as the root directory. Option items replace the default ones in the package info. """ # set folder attributes self.sourceFolder = root if resources == None: self.resourceFolder = None else: self.resourceFolder = resources # replace default option settings with user ones if provided fields = self. packageInfoDefaults.keys() for k, v in options.items(): if k in fields: self.packageInfo[k] = v elif not k in ["OutputDir"]: raise Error, "Unknown package option: %s" % k # Check where we should leave the output. Default is current directory outputdir = options.get("OutputDir", os.getcwd()) packageName = self.packageInfo["Title"] self.packageRootFolder = os.path.join(outputdir, packageName + ".pkg") # do what needs to be done self._makeFolders() self._addInfo() self._addArchive() self._addBom() self._addResources() self._addSizes() def addResource(self, path): "Add arbitrary file or folder to the package resource folder." # Folder basenames become subfolders of Contents/Resources. # This method is made public for those who wknow what they do! prf = self.packageResourceFolder if isfile(path) and not isdir(path): shutil.copy(path, prf) elif isdir(path): path = self._escapeBlanks(path) prf = self._escapeBlanks(prf) os.system("cp -r %s %s" % (path, prf)) def _makeFolders(self): "Create package folder structure." # Not sure if the package name should contain the version or not... # packageName = "%s-%s" % (self.packageInfo["Title"], # self.packageInfo["Version"]) # ?? self.packageContentsFolder = join(self.packageRootFolder, "Contents") self.packageResourceFolder = join(self.packageContentsFolder, "Resources") os.mkdir(self.packageRootFolder) os.mkdir(self.packageContentsFolder) os.mkdir(self.packageResourceFolder) def _addInfo(self): "Write .info file containing installing options." # Not sure if options in PKG_INFO_FIELDS are complete... info = "" for f in string.split(PKG_INFO_FIELDS, "\n"): info = info + "%s %%(%s)s\n" % (f, f) info = info % self.packageInfo base = self.packageInfo["Title"] + ".info" path = join(self.packageResourceFolder, base) f = open(path, "w") f.write(info) def _addBom(self): "Write .bom file containing 'Bill of Materials'." # Currently ignores if the 'mkbom' tool is not available. try: base = self.packageInfo["Title"] + ".bom" bomPath = join(self.packageResourceFolder, base) bomPath = self._escapeBlanks(bomPath) sourceFolder = self._escapeBlanks(self.sourceFolder) cmd = "mkbom %s %s" % (sourceFolder, bomPath) res = os.system(cmd) except: pass def _addArchive(self): "Write .pax.gz file, a compressed archive using pax/gzip." # FIX SYMBOLIC cwd = os.getcwd() os.chdir(self.sourceFolder) # Pax is the enemy. Make war. sitepackages = join("System", "Library", "Frameworks", "Python.framework", "Versions", "2.3", "lib", "python2.3", "site-packages") if isdir(join(cwd, self.sourceFolder, sitepackages)): librarypython23 = join("Library", "Python", "2.3") if not isdir(librarypython23): os.makedirs(librarypython23) shutil.move(join(cwd, self.sourceFolder, sitepackages), join(cwd, self.sourceFolder, librarypython23)) # END FIXING OF THE SYMBOLIC LINKS # Currently ignores if the 'pax' tool is not available. # create archive base = basename(self.packageInfo["Title"]) + ".pax" self.archPath = join(self.packageResourceFolder, base) working = join(cwd, self.archPath) archPath = self._escapeBlanks(working) cmd = "pax -wf %s %s" % (archPath, ".") print archPath res = os.system(cmd) # compress archive cmd = "gzip %s" % archPath res = os.system(cmd) os.chdir(cwd) def _addResources(self): "Add all files and folders inside a resources folder to the package." # This folder normally contains Welcome/ReadMe/License files, # .lproj folders and scripts. if not self.resourceFolder: return files = glob.glob("%s/*" % self.resourceFolder) for f in files: self.addResource(f) def _addSizes(self): "Write .sizes file with info about number and size of files." # Not sure if this is correct, but 'installedSize' and # 'zippedSize' are now in Bytes. Maybe blocks are needed? # Well, Installer.app doesn't seem to care anyway, saying # the installation needs 100+ MB... numFiles = 0 installedSize = 0 zippedSize = 0 files = GlobDirectoryWalker(self.sourceFolder) for f in files: numFiles = numFiles + 1 installedSize = installedSize + os.lstat(f)[6] try: zippedSize = os.stat(self.archPath+ ".gz")[6] except OSError: # ignore error pass base = self.packageInfo["Title"] + ".sizes" f = open(join(self.packageResourceFolder, base), "w") format = "NumFiles %d\nInstalledSize %d\nCompressedSize %d\n" f.write(format % (numFiles, installedSize, zippedSize)) # Shortcut function interface def buildPackage(*args, **options): "A shortcut function for building a package." o = options title, version, desc = o["Title"], o["Version"], o["Description"] pm = PackageMaker(title, version, desc) apply(pm.build, list(args), options) return pm ###################################################################### # Command-line interface ###################################################################### def printUsage(): "Print usage message." format = "Usage: %s [] []" print format % basename(sys.argv[0]) print print " with arguments:" print " (mandatory) root: the package root folder" print " (optional) resources: the package resources folder" print print " and options:" print " (mandatory) opts1:" mandatoryKeys = string.split("Title Version Description", " ") for k in mandatoryKeys: print " --%s" % k print " (optional) opts2: (with default values)" pmDefaults = PackageMaker.packageInfoDefaults optionalKeys = pmDefaults.keys() for k in mandatoryKeys: optionalKeys.remove(k) optionalKeys.sort() maxKeyLen = max(map(len, optionalKeys)) for k in optionalKeys: format = " --%%s:%s %%s" format = format % (" " * (maxKeyLen-len(k))) print format % (k, repr(pmDefaults[k])) def main(): "Command-line interface." shortOpts = "" keys = PackageMaker.packageInfoDefaults.keys() longOpts = map(lambda k: k+"=", keys) try: opts, args = getopt.getopt(sys.argv[1:], shortOpts, longOpts) except getopt.GetoptError, details: print details printUsage() return optsDict = {} for k, v in opts: optsDict[k[2:]] = v ok = optsDict.keys() if not (1 <= len(args) <= 2): print "No argument given!" elif not ("Title" in ok and \ "Version" in ok and \ "Description" in ok): print "Missing mandatory option!" else: pm = apply(buildPackage, args, optsDict) return printUsage() # sample use: # buildpkg.py --Title=distutils \ # --Version=1.0.2 \ # --Description="Python distutils package." \ # /Users/dinu/Desktop/distutils if __name__ == "__main__": main() gamera-3.3.3/gamera/mac/DMG_DS_STORE0000644000076500000000000003000410714675707015645 0ustar chriswheelBud1 ob PctB  @€ @€ @€ @.BKGDblob PctBĜ¸ä.ICVObool.fwi0blobiDğ/icnv.fwswlongv.fwvhshorR.icspblob.icvoblobicv4€nonebotm.icvtshor.pictblobĜĜGamera½,ŽH+background.jpg½*֙˙˙˙˙ .images½,<ν+ÙGamera:.images:background.jpgbackground.jpgGamera/.images/background.jpg/Volumes/Gameraˆˆ LapintoshğĊżbH+ ûôgamera-2.2.0pre.dmg ü6½,„devrddsk˙˙˙˙ distğĈ²½,=Ä ûô XÙê|6Lapintosh:Users:rfergu:gamera:dist:gamera-2.2.0pre.dmg(gamera-2.2.0pre.dmg Lapintosh,Users/rfergu/gamera/dist/gamera-2.2.0pre.dmg/ ˙˙˙˙GameraIlocblobqM˙˙˙˙˙˙<Gameraicspblobgamera-2.2.0pre.pkgIlocblobwM˙˙˙˙˙˙gamera-2.2.0pre.pkgfwi0blobicnvgamera-2.2.0pre.pkgfwswlongÍgamera-2.2.0pre.pkgicspblob"wxPython Build on Sourceforge.htmlIlocblob}M˙˙˙˙˙˙ E DSDB `€ @€ @€ @icspblob"wxPython Build on Sourceforge.htmlIlocblob}M˙˙˙˙˙˙gamera-3.3.3/gamera/mac/gamera_mac_setup.py0000644000076500000000000001505711652050142017610 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from distutils.core import Command from distutils.util import get_platform from distutils.sysconfig import get_python_lib from distutils import log from distutils.dir_util import remove_tree, create_tree, copy_tree from distutils.file_util import copy_file from os.path import join import os import glob import commands import datetime def _run_command(exc, line): print line try: try: status, output = commands.getstatusoutput(line) except: raise IOError("Error running %s" % exc) if status: raise IOError("Error running %s" % exc) finally: print output return output def run_command(exc, *args): line = " ".join([str(x) for x in [exc] + list(args)]) return _run_command(exc, line) def run_command_at(dir, exc, *args): line = ("cd %s;" % dir) + " ".join([str(x) for x in [exc] + list(args)]) return _run_command(exc, line) class bdist_osx(Command): description = "create a Mac OS-X Installer.app package by calling out to buildpkg.py" user_options = [('bdist-dir=', 'd', "temporary directory for creating the distribution"), ('plat-name=', 'p', "platform name to embed in generated filenames " "(default: %s)" % get_platform()), ('dist-dir=', 'd', "directory to put final built distributions in"), ('nightly','n',"Name output file according to nightly build format") ] boolean_options = ['nightly'] def initialize_options (self): self.bdist_dir = None self.plat_name = None self.keep_temp = 0 self.dist_dir = None self.nightly = 0 def finalize_options (self): if self.bdist_dir is None: bdist_base = self.get_finalized_command('bdist').bdist_base self.bdist_dir = os.path.join(bdist_base, 'pkg') self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'), ('plat_name', 'plat_name')) def run (self): name = self.distribution.metadata.name version = self.distribution.metadata.version fullname = "%s-%s" % (name, version) description = self.distribution.metadata.description self.run_command('build') install = self.reinitialize_command('install', reinit_subcommands=1) install.root = self.bdist_dir install.warn_dir = 0 log.info("installing to %s" % self.bdist_dir) self.run_command('install') bin = os.path.join(self.bdist_dir, "usr/bin") create_tree(bin, self.distribution.scripts) for script in self.distribution.scripts: copy_file(script, bin) if not os.path.exists(self.dist_dir): os.mkdir(self.dist_dir) pkg_dir = os.path.join(self.dist_dir, "pkg") if not os.path.exists(pkg_dir): os.mkdir(pkg_dir) pkg = os.path.join(pkg_dir, fullname + ".pkg") if os.path.exists(pkg): remove_tree(pkg) copy_file('README', 'gamera/mac/resources/ReadMe.txt') copy_file('LICENSE', 'gamera/mac/resources/License.txt') import buildpkg import __version__ log.info("Building %s.pkg..." % fullname) pm = buildpkg.PackageMaker(fullname, version, description) pm.build(self.bdist_dir, "gamera/mac/resources", DefaultLocation="/", Relocatable='NO', NeedsAuthorization='YES', UseUserMask='YES', OutputDir=pkg_dir) remove_tree(self.bdist_dir) removals = [os.path.join(self.dist_dir, fullname + ".dmg")] for removal in removals: if os.path.exists(removal): os.remove(removal) dmg_dir = join(self.dist_dir, 'pkg') dmg_dir_gamera = join(dmg_dir, 'Gamera') copy_tree('gamera/mac/gameraclick', join(dmg_dir, 'Gamera')) readmes = ['README', 'readme.txt', 'LICENSE', 'ACKNOWLEDGEMENTS'] for readme in readmes: if os.path.exists(readme): copy_file(readme, dmg_dir_gamera) # dmg background image copy_tree('gamera/mac/dmg_images', join(dmg_dir, '.images')) # wxPython link copy_file('gamera/mac/wxPython.html', join(dmg_dir, 'wxPython Build on Sourceforge.html')) imagename = "%s.osx.dmg" % fullname if self.nightly: d = datetime.date.today() monthstring = str(d.month) daystring = str(d.day) if d.month < 10: monthstring = '0' + monthstring if d.day < 10: daystring = '0' + daystring imagename = "gamera-2-nightly-%s%s%s.osx.dmg" % (d.year,monthstring,daystring) log.info("Making %s..." % imagename) # Make a read/write DMG output = run_command_at(self.dist_dir, "hdiutil", "create", "-format", "UDRW", "-fs", "HFS+", "-volname", "Gamera", "-srcfolder", "pkg", "temp.dmg") # Mount it output = run_command_at(self.dist_dir, "hdiutil", "mount", "temp.dmg") # Change the DS Store so the background image and icon sizes will be fixed copy_file('gamera/mac/dmg_ds_store', join('/Volumes', 'Gamera', '.DS_Store')) # Unmount it output = run_command("hdiutil unmount /Volumes/Gamera") # Make it read only output = run_command_at(self.dist_dir, "hdiutil", "convert", "-format", "UDRO", "-o", imagename, "temp.dmg") # Internet Enable it (why I can do this read only, but I can't do the background, I dunno) output = run_command_at(self.dist_dir, "hdiutil internet-enable -no", imagename) # Delete the temporary image os.remove(join(self.dist_dir, "temp.dmg")) remove_tree(pkg_dir) gamera-3.3.3/gamera/mac/resources/0000755000076500000000000000000011755376174015770 5ustar chriswheelgamera-3.3.3/gamera/mac/resources/background.jpg0000755000076500000000000000337610714675707020623 0ustar chriswheel˙Ĝ˙àJFIFHH˙ŝ AppleMark ˙ۄ   % #!,!#'(***.1-)1%)*(  (((((((((((((((((((((((((((((((((((((((((((((((((((˙Ģ  }!1AQa"q2‘Ħ#BħÁRÑ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚáâäċĉçèéêñòóôġö÷ĝùúw!1AQaq"2B‘ĦħÁ #3RbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š˘£¤Ĥ§¨İ޲³´µĥ·¸ışÂÄĊĈÇÈÉÊÒÓÔĠÖ×ĜÙÚâäċĉçèéêòóôġö÷ĝùú˙ÀMİ"˙Ú ?ïh˘Šê<˘Š(˘Š(˘Š(˘Šk:Ĥ2@'€ ëCvǀIàIô¤V2§#ÔtĴİĵäş3C8òä\°Îp8ÎE[Óç<­’ħ*lRFsʳNÖŬVÌĞÉ,‚4œ1¸ÏĝĠŞŬ;Ğ€QEÀ(˘Š(˘Š(˘Š(˘Š(˘Š(˘Š(˘›$‹îcI´·Ġ ñ‡+÷|Ìĉ=Ŭ3Nô°Î&Ü@Ú dŜŸu{Ş@˙<×5JħjÈ Ŭu2Ŭ+Ž•íÊ<'jùQŽŝġRçRyċAÎ*¤·mpÀ7AÀ›&͚ş@_"F’üœuàUú‚ÊÜÛÀŭË}jzQH(˘Š  (˘€ (˘€ (˘€dEêÀRîr9÷Ĵßìé³÷“ó4ñ§Ì?ċ üÍsıĠè€KmŜıúÔo.ĜŬV)ŽëTż³ĉòÔ~uštʧçR}3ÖĦÊŞĠCHK–#Žc“SZ!FÂ3¸ž+_2ÚM†O›néQd.âQzĠ>Òof6…ôŝgù;€*ŭ×ژ,Y ;J‚2+|ĵ‘ƒžâĴE$ħŞ‚[aázÉÉßR”KQì·ÛŝÌy²/f’y2ß(êT³\–'aà‘è*³Ü³‚Fzfœ +•ùéš}ĵĤ јwëéïLŬ“M‘³ÖĥC|jĤÙžŞ8Ç­]†hî#Dېô5ɀeGQÜĠÛAì @rxìkEQ­Éhè¨Ĵí{´—~â'„#­lCwÛ@ 1]Äg§µií#ÜDôSг{eFqÏ֟Tš{(˘Š`QEQE€2j"à–nÈ3ĝúUû’fò•ŠìäŽÇŒÓ;×iı{½Š.d™Ùş“M Ĉ9İ$B ùÓ>UïIlQfÖR²ŻM¸ÁİnŸËq,o–o•@S ǕzšÙ#š†µ¸\‰ÑË d…âĦÚîrZ´ %ıûŬM?rˆĥvŞğAs?i~ljgŒQ•)É­)  óƒG(ê3@Îhfε’Šá[¨ ÜUÇÒgQ”elvİٟ.ê'ížk¤Ğ„Tˆf‹ˆ+€9Tñjl…sÈà[# ġŞKĤÛÊs‚ŸîqC¤Öħ&Ħż‚`páHìÄ ³X—Ztĥë½>u^IGáKkŞ:GÁQÇ=Ş•F´’ ›TSc‘e@Êr :ĥN (˘€3ïĴ ĴeŒç¨Ĵ’’@ĝte=yš›$I( aî+)S¨iĜÀ ŻÍ/`3VŻĴÙ<Ĝ˜€OŬ<Ġ4;—'­sJ..Ċ'qIĊ34ò!(v 9¤éšJĦXLûRçր9#Š0 ##ZL sĝSÂäġö­Ğ}2[÷­Ĝ°à~q‹–ÄĥRÓldgY¤NTw5³EÓ¨˘BŠ(ŞĴÍKMós<÷YGñ{ŭkNŠM&|Ö²ùd!8Ái­ê†{H.qĉĈCùÔÙĥŸóË˙?R“Z˙Ùgamera-3.3.3/gamera/mac/wxPython.html0000644000076500000000000000025310714675707016502 0ustar chriswheel gamera-3.3.3/gamera/paths.py0000644000076500000000000000663011652050143014671 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from __future__ import generators import os, sys, dircache, glob, imp # Python standard library if 1: def dummy(): pass lib = os.path.dirname(os.path.realpath(dummy.func_code.co_filename)) lib_gui = os.path.realpath(os.path.join(lib, "gui")) # Figure out if we are in the source directory or installed plugins = os.path.realpath(os.path.join(lib, "plugins")) doc = os.path.realpath(os.path.join(lib, "doc")) sys.path.append(plugins) plugins_src = "" toolkits = os.path.realpath(os.path.join(lib, "toolkits")) test = os.path.realpath(os.path.join(lib, "test")) test_results = os.path.realpath(os.path.join(lib, "test/results")) def get_toolkit_names(dir): toolkits = [] listing = dircache.listdir(dir) dircache.annotate(dir, listing) for toolkit in listing: if toolkit.endswith(".py") and toolkit != "__init__.py": toolkits.append(toolkit[:-3]) elif toolkit.endswith("module.so"): toolkits.append(toolkit[:-9]) elif (toolkit.endswith("/") and "__init__.py" in dircache.listdir(os.path.join(dir, toolkit))): toolkits.append(toolkit[:-1]) return toolkits def get_directory_of_modules(dir, base=''): modules = glob.glob(os.path.join(dir, "*.py")) names = [os.path.basename(x).split('.')[0] for x in modules] mods = [] suffixes = imp.get_suffixes() for i in suffixes: if i[0] == '.py': suffix = i break for m, name in zip(modules, names): try: module = imp.load_module(base + name, file(m, 'r'), m, suffix) mods.append(module) except Exception, e: print e return mods def import_directory(dir, gl, lo, verbose=0): modules = glob.glob(os.path.join(dir, "*.py")) modules = [os.path.basename(x).split('.')[0] for x in modules] if verbose: sys.stdout.write("Loading plugins: " + "-" * 40 + "\n") column = 0 first = 1 result = [] for m in modules: if m == '__init__': continue try: module = __import__(m, gl, lo, []) failed = 0 except Exception, e: failed = e if failed: display = '[%s %s]' % (m, str(failed)) else: display = m result.append(module) if m != modules[-1]: display += ", " column += len(display) if verbose: if column > 70: sys.stdout.write("\n") column = len(display) sys.stdout.write(display) sys.stdout.flush() if verbose: sys.stdout.write("\n") return result gamera-3.3.3/gamera/pixmaps/0000755000076500000000000000000011755376174014677 5ustar chriswheelgamera-3.3.3/gamera/pixmaps/complex_vector.png0000755000076500000000000000070110714675706020434 0ustar chriswheel‰PNG  IHDR szzôsBIT|dˆxIDATX…íÖ1KQ†áÇÄB‚‹ ‹ħ´XViR(XĴ‚?À"$MŠ€’&ŝ mµ°R!`%XXZ Ĝh—J]"¸ĊÌèfwv×kĤ†9œs™ïe÷žË³žşşÒ÷hNíŽ#ùŒ ''˙' ê9Ï~$sé·ò<ĵˆhґ²Ôsr{^íŝ—˜Ċ*qŽNħ‡¨tJuۗšÂQşĤ† ¤Pŭ˜Ä/Tñ½]Ż"€E\§ġ]\51ĝ’[Š0Ôv0VËĜˆP‘ôı.ùµx×@ë1–‚üršk ™Ú:ĤƒxóĤ UÑeôñYĠ ~]ÀqO”°ÄóİÑ6|äŻñAämXÛAí/>ĥ0 `'Aŭĵ kXˆo°‚KwíĝŒ·’iĝ ĝ‰ßĝÔ°#€LƒĝŠ-ÉhŒĉ3ɔüĤxğŜó*ŭFԝ³ ;~˙Ç­ĝVO÷VüĴÒuħ^ŸBH’l]IENDB`‚gamera-3.3.3/gamera/pixmaps/convert_images.py0000644000076500000000000000405011652050141020230 0ustar chriswheel# # Copyright (C) 2001-2007 Karl MacMillan, Michael Droettboom, # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Convert Images # # This script uses the wxPython img2py tool (included in this directory) # to convert all of the pngs in the this directory into a python script # called gamera_icons.py. This script can be copied to the main gamera # directory to be used by gamera. This is easier to manage than the # individual files, especially since distutils doesn't handle arbitrary # data files. import sys, glob, os import img2py import wx if __name__ == "__main__": app = wx.App() files = glob.glob('*.png') first = 1 for x in files: # This converts filenames in the form of file_name.png # into names of the form FileName suitable for method # names in the gamera_icons module base_name = x.split('.')[0] names = base_name.split('_') name = '' for j in names: name += j[0].upper() + j[1:] args = [] # -a means append the image - only done after the first image if first == 0: args.append('-a') else: first = 0 # -n sets the name pattern for the methods to access # this particular image args.append('-n') args.append(name) args.append(x) args.append('../gui/gamera_icons.py') # run the script img2py.main(args) gamera-3.3.3/gamera/pixmaps/float_vector.png0000755000076500000000000000065610714675706020103 0ustar chriswheel‰PNG  IHDR szzôsBIT|dˆeIDATX…íÖğJ$Aào]GŒA0Ev“4À70 Œ|3D1064Ú@6YĜ`ĊHaLLĵ^d zZÚ˘Ĉıµ­ ?]uÎİúúœ>|â£Kíù=âğC9'žQôFìûé¤r"W;+ĈĦ+G’ĥĤ ħ½žqu·\¨à{ĝ…-\ĥŞê)/ŭ@R@aŝfQÂ0ĉ°ñ]cı—ìGb꽙ġ fİhAÌQ#yċ`=ÒhCŜĈƒġn³óHÁWüÌĝo1Ŭ,WğJ<ŝf|˙0!ÏUÀ)î3ësĴbĤq”Ğ“”äUŽñğ:݁ĊŒíżä‚j™ĞÓ"ÜÌĜ/­hŭµ¸ÔwˆÁ"ÀÜdü;è)R,1E €µ n\áĴ6ώzè“\Jiܕäwċz—QÚ!Ñ?!ÌoĠGéŠ?ñĉx,†üßĵ-˘IENDB`‚gamera-3.3.3/gamera/pixmaps/gamera_splash.png0000644000076500000000000010732110714675706020214 0ustar chriswheel‰PNG  IHDRU,Ú`İ0PLTE$%#./-9:8CEB`b_{}z…‡„"𐒏¨Ş§ÉÌÈĉ˙˙˙}‘v´ IDATxÚì½kp[Ùu.x@ŞĠNŬÌ\’ztn%İ˘žíİÉ­!E‰êT|I”ÈvÙΕZĠ.?ҒH€*IŬ­–ˆ@ÉNw@T_—c,€Ŭó{~9c[êœC%›êì}˜›Ä"Yç;“XáyÜİšXê"Î9³Ö(‘’úĦ~%ž"Ş[çŜk}ë[kݽÁŭoż5·˙•[ş†u ëVû·ĉöß8˙·ĉöß×°a]ş†u ëÖ5ĴkX×°a]ş†u ëÖ˙˙`ġÔħžŜîŜ}íß6VóÇ5:ÖÑsÜWŝŭÇÓĦĈ'ÀZ;Éq/RŬÒŜ|óMî‹Àêċ÷ZÛúĤŸĞ PÏ9ìŜŽûB°ŝ’kÚĥ…ÖUŸëO8îO–G¸ Áú~ËfÉħ``ŝƒótXßoášf—ùÛ/ëßrWáßûxïé°ŝ€~÷Á/K_Vo÷ ¨ğŝݰÖZ8îÊ__˙°â%oÀÏW8îKO…ġŸV›ĝ?~Xß~­ŽuŭSa}}ġ‡[ú°‚Ħrö °şí÷WÚRûc0ŜaŽ{öi°âgüÏĞĈù -9[÷­ß}ĴżĉVı–ï˙xĞëşÑà?ïEà1öˆÇ~]´ü›‹Żż4‹•·[]ßn ïŸ= V Tĉ“n×À:wžÙ­ğX ›?À^†GjcÜşÑe+‚_¸1ĵûßàeëœÚ\7#ìù—à÷í‘''ö‰ï=zéÂú_86o˙üż<ˆ`mÜ^ç!Ö_p}ŽÏûŜëĝî™:ï"Pz ¸üë¸îöësü-żŭ=˜ëSĊ- îIQùï‹÷&Ç}; XßßpĠws띟ıêßä¸WÙ ˙û—Œĝn V³yúu ~ûż¸ĉYßû)ÇŭÑZíĠ§ÒÙ9çɟÍ˙pƒ|k€ġçûÇ'n›eîwƒ³ÔÎ}Ż˙:·îW_që\S!Ô}!?ê Ç}íétVû`…ÏŜ†çqÜït!ê˙Êq§ż‚ÜRç%Ž?żWgésë÷žËħ?~½Îĝ0Ġß}œ*µp_Ş>Vî°cŭÍrÈĉ¸ĉ?ÀŸ˙'Xç,afÎ5WÖÀĈÙ7`½˙$fşCϝ5>Ĵ˙… TëZĉß-żŽÙç˙ħĈİOHS=”4ħ_ïħ Gù’ï}[ü7u7wŸÄĝ!…nçìg‚ġV˟4ìôKËŻğÑÀú§>huèÂËuĴ0ü&Š˙^˗:ÖġOĵ4¸çsÎgaŻĥ áÙeĴĠÖ˙aÖ[ËÏ˘?­cŭî#oá7<9ĵ^ĉ’‰ġCĴ|[şW`uX˙ÇX˙ayܽşa˙ĝñË ÖşÁ|2~EĜìö;YìÙµĞßÀúïW`Zxĥ’^ïŻŽĜVy°§ëħÉ4Í>Öży· ‰ÄüöÄ8Ž2V ġ#°ŝ÷ÖÀúÎ-Ç´=ŽĠr Ñ"ġ¸•ïô ġCÜ"•uköê£Xg€˜†DòÖډê2Öï>VñĴछ§Uöúá6`ÛÎ#Xoƒfœ'ĜëÏ9î+ËX˙)µö>ŽtGóG|ëIX˙á÷X‚kÓ;Oô­ŽÑŭwn™T>~óìXo6ÇGa½ġÑŻÀz›~˙‰<pO„ġŸAs5Öï5ùQXï?ÄêVWc]Ĥ„ǰşËñħŝéSċÜ ëY‰Ġë`Şî£ħÖÚA°6ċWc}A†O×f§!w/?U-2ƒ˘íŜ2Vxlü‡bEjhîWŝt5֎FôpŸdŻÏ6ĝ50ûTX]üÓF8ĝŻËX[êŸuևcŭûş˜Bkxg5Ö} Ĵ÷úcL.â<]ímpŝ„ûŸüyò^cSÖOHùĵ–{ċSÚÀˆ˙½x*˙œ{Âĉ×ğ|óÎ8Ŝìë{Ÿr\ż×^ómÒrŻêùġN6¸?\lOq˙ܳ-̆ô˜µıùú9x‰…-Ŭĝ+ŸĊ§2žm6< /Zw…˙lDzí{ùTXŬż—^ĞI˘Odsü~U/Ñq_UÍıü3´+ƒŞïŬW`ò½oĉ=ċZ—oisĠ¨{eéŞFGçĴéĴw^ğbߜġ>Ö{7ü›Ġ„_ĝÍĴï^žsîUËŜċsŠ?Zğr-ï×U÷ÛŽàŸĞ½sӝ!èi*òßżq ƒż˜M{ƒ7îUkĜ…éj"IÜç½şt_rU÷rÙ5Îğß½7ëgrŸÎ^oUŭĵóc˙oĠݽWŜrÒµñ÷ß˙Oo#ô—nÌ9£Î7îӒ}ıÄŝFñ'ü{Ġ˘ŭ÷Êì-çUË|mÎçoĝŝûW<ß{Í˙Mµìî•{Ĉżàğ ŝj ĉÎ-[Ÿ ëMǽì§ŬwîU­İ%˙ü’XğQ³üFżm‚½^÷ïϖŬÑÙWo‘yóòĵöZ›ġŻù€_Çä·Ü×dïÁ‡‡ŭß^0{FTI ë÷Şzm:fڗïTç|ï²Ş|Ĵî{_$KÊUâżJ>µÙ%cĝĠMT—âG#ÓµÒ{5´ùi7SĠ|R…ÇL55GĞj˜kIĴUß%²1]ĞšŠKg=BtŸP_ó½Ş[ŭ4X½z³-Ŝ{ü9Ÿĝ´s˙IÔY7•ĈmùĠ÷ŻĴFçŸà$òoQğ'F$ĞşĤ³Ö°aŭx7 —ìÌSCÁ’Ñ·™NġâQÍù‚ħz?$ċŞÏ˜hÁwñêö;ߌùĞöf.Ŭ`?Š÷ó ĴóEëŒ_ğĵ<÷^ ġofkĞĜé~uu62۟[DĠ/ kÂwÏ{L&;ŜŻPC³xġÏĊ(WŬS½?<ò~Cfğy™¨şá5żvĜçó·\Wğ⓲–vĠEr• ÓÌ\Ġ_J޳DjBM9?*˘:żxĊ•Ò5 TíîıvéJZö5ŞÄñÏ+¤.µo×@GÓ4¨ĊJ d-<<öËY_OĠŜğ]½ ÷g˘ŸŞ)ħ·œĜ-ç]˜w4”[ÎÔhÚ˘?g‹s³Ĉ玌ġŜ;K7@/ğ—ÁĞÎ-Ŭ(£ˆùVíUß½?[òoú£·œÙQï[Ô}ġ^5ï½:Aà·AôVáŜ½jŒ˜'Îmçó·×ûï€ż­˙KU¨ğWìïŜ§îïŭÏŜ7 k½mü„÷ڜ§œ·_…Lâ6d,W˘?ĞU£8´1{Ô–›û|ë7³`ħóÚ=ü}R{×ACŭš¤yNŻàh—\cÔ¸ìêWó4w˙½d ûHTÑW@­ë—•QO)~ŝX½İRġÍYWünmşF"Oc~0?êĊĞKĠ𳋲‹êS& ­ÙĊ™ê"‹ó áġӖéH_À¸6¸ĈaĴj,ǵ˙Q3ğ|ĝDŭžŭëôEèîUù__ğhÊÇ3²Ĥµ×°aŭteÛ·ß{X;@Uşr£íx :ò"ĞjL{=îwŸ#V/úÓXâŭ™ġüחuöòóo)sçô*ĝŝŬ‡ÏürÜcBĵĥ*-żó4˘û)ħşĠ[Uíae ƒAmeI=ïß[ġôŞağUġ•ċRÍÊq} Ñŭ”XkŝMGż „Yżä½0ħ÷¤Şç,ç_Q˙Ö,*l°…QÓqXˆcÑìĤßiŽÏùĝ/Êt gżvĵÏÍ·&à²úUO”ꃵHnüZ]JUfk+Áçì|LMËî¨JÒn^öÈ4û;oĥœŬ’_QFM:ûŞ&›iwÌ(W§>'Ĵ éŠîċû³´^îÌzŻÎù£zĥ…şÛzÜĵóäÊ­QOO›%çĠÚ œü³~͚oŜĵé.ÌJe‹”ŒŞh˘TwçŒÑÏ+HT´öŜM‘™YŜ;ïŭıà½ĉ?{ïe‡qÂ<öŬû³7ï%À ü´÷Z­·Êŝn lSğ]U†ˆ™Ä/F½ËŜĞŝœuùóÁZû û{”ċ,u_­]]z×…mÌT™{í7NòÖ]Ċ÷_]šĥÔ+lÄ‘=j:sŜìw|żâ{zş_½óù`}˙ ä׿ÑçĴĠĝŽ{ùŽ2zŸ,3§]]Ş˘ w˙›ŭ•wyî}r‡¸ZÑ}‡a~É;ŻÏÎğĠQݚö—f@Ş_­ ÷o|>œUuÜj­ÊŞ×‹wg}"yUW…­‚*|vŝ<*ì’\Ġ=Z“ÜïS“IœYġ%?m‹ŝ]ÍW‰3ċğdĥ&ĠhUİ~^qË š=}%ƒz,ŽAΏ÷Ò+˙Ĥ+^Yŭûò͕9çs⁏灣OñÚĞŝż&V÷iŞîÄùWĊşĤ ×°a]ş†u ëÖ5ĴkX×°a]ş†u ëÖ5ĴkX×°a]ş†u ëÖEĴöÚ¸ŝÖc­Íŝö`ŭġ—ßĴ‹ÒSaµqÔ²ñ?ÛŝB°€çùÚÊ}×=Ç{°>ë*6>[?NÈó=[×t˙W)ĦĴQO+ŝ<ûµ½ó+ËĞşNħ›Ċò-Ë·aà´e°žÍOġ™|×· |vıÊ׈˘?Ŭ?-ÖU-ÄÒ ŬÂï´ò`juĞê/ĥ?F¸EˆJŭħZÀ&ċPKĞúžkXlĴYx­ı~ Û_5Ï^¸ĵú>[lëó³×|uĊ/s³Mí;6qíş­9ĜĴëùfâ[ô³úĞê*#8ğşT_>‹ómيƒ{ž‰U=SsXğ™‡f³6cR¤ [Àêàĉ÷3ëËXZŬéUZ ŭĠİi8üĜĴ*nËĥÁ|a„ë2Áó>h=˜m6¨’€/[½‹ĉÓ`ġbĞŜJuVplm”öâ,váiĥĞĦE˘}‚‘ÚÀŻlò €ˆǜ‰áDÔÌ 04èŸ-ĞúQÔy§áÙĜ7Nì @ÁQt)§Ú²ñÓéz=È@÷bÔĊbƒƒ?°­è×ĴĈg‹U_eüK3ĠğìÛ<£ĵëÙ İ‚üàé´>ĵ`,*|VX\ÉZW34Œ^ïO/kCÂ$îÑ#†j ž4eW½z€eñ Ġƒ E ‡|e­rXOŭXöc`µôÒÊÍ$y;§ä·Ñ48Aa„xŽ+W5_UlCg\êéèPà8š0ĵ:$ë”5è0żSÀ™…¸W?›X@´İ•;ZfŒĜ”–Ák•êcsî›Öĝ<ÈC]ħ5˘ AšU11ĉÀâĝí‚6“ĥuÙ‚§VÛ¨oŭlĈĠ›Òñ,ƒ·› IkEì½³“} ,°P‘š%')ş´ ”|.ĈċÎ,ùáĤ)ĝ,Ĉç´'J‚´c…Ĝú‡wˆNŞÀŜ żî OP€ĥGuËİH:`µ–°0ÛĜ׆>ŠíûÖçħ—×ñc–FWD˜[çU™RĊÖgŭğAffFM‚‡p@L•€~ĥĈÛÑ,Ŭ²`˜О˘{5ÈàsÀJ½8EU{°ß΋È`Ô0’ŽcYžkÚ&Ğ8Ĥ¤[Šn{³ĤÑP8à`:ÛL€_Ŝ dê°$ë–÷Ób%^N1£\|ŜsBeE7Ĥ!xŠ(tKğÁƒRj]6Áa,œïúĵ7Tv=?²ÀĜÊȁ=á|–X5/=mJ†ŝjÑ¸p–KmŠĵŞé1´–™œA Iğ£˘™0 şL³‚jaDĈn²êx ïÓb½kǨ­“Yoy7›ĥ¨n/"ŸCĈä%àaÒ˘ÙŻ§ Ĝ#M[–%ZŽf,÷p$Ĉ4 Jè]¸÷„ĥíÔ"ƒjyžƒ$Ö{šDu˘)Úrв×/ TÓp"}È HŬ–I|KÖŜuîLéú´ħÙ˘Cu¸:Eií@˜ġXò†YŽŬ‡ÖhRMÔ>Ĵ–ó‘Xï]/S`‚ċŻtò.~ϲŞpqˆêĉ{~í2,šĞ­,Žêsïê$”žìoôsËh“ÈÊ_)…Ù…F™[„“b­)*]0PÀi Ĵ‰oD § hdö Ċ£Ĥӝ£â¨Ż]ġ(¤1df eAxmJà5Ħì{½1C`Ĵij˜×#Dħ?)Öi˜ó[p%z)I#61êß nX .já !Mèy‘V}ŭ?Áx.BƒñĠÀ™°Ö1€ëXi½dƒ’Öz5\ö²ŝDXŬq—Ò…^ ŝT˙ ’!pÉSÔv,G}Wtò+ÛŜ‰6n "7GmUA,ŠŻÁ3:‰ јÑÀ†hŬlĤÑ€żêšĈwž|ŞĈGbġB`I $×pı:Áˆ&Œ”6 ²pr߯z"…ĴĊrmíŠ*çàuµÑqà`LŻñ­f`˘T1%`hœ$+ÂS:+ à+³żXŭdX“ş¨À„Äzö@ZƒËÂ8ë€q­ÛÓ>5ĉÁÚ\WċW¤œ.ÍúK˜{m˘êÒ/fƒpá/U‘Rp!ÒàY sDïÔr>…vİ€˜-° ›ÁHêžDÄ9T(`UuÇ4&ŒE ½xöXÈĴÔ0cĉ”İIDž‡Qa,e˘iDˆ&d)ĝ{ĵzĵĊCQŭX^ôweËÖ,ïÒĞ,×^š&z~‡Ġž) fÌ3Qİê’&%Iiò–˘IÖü4!Ñw€ÔÑİŜ×1”€%aġ-/0Ÿ‚Q?Hƒ}V p!yʲM]“ĜÓĴUu2§k"³Ç•Á‹l–{\NAn:.â ¨ŸHgkFì@GwĉG`a ‚qĠŞĞoÌ-µü随Âj`e<Vr9ĊÔ o6 ]j‹/)i]3ĴĞxžŝ)ş™úa$I=â'tV•Ĵâ2Ĵ˜˜)m Ŭ”G1XDbÙ˘½AU"•?Ħ‹˘×èġrÓUŞÏ‹x¸ĝ“ I Ä%xX1ĵ€KGXñVbµ!pµñO ܝÔ<ĵıh ‘á‘ ĉÉüÖ-‚뚂C nÄÖR“9Ğr}„M–D+ :ë"­J> 0•)‹³D–%`(L½zžË¤=Ÿ5Ùĝ$X‘Qo›â·!™˘:ëUÍ^¤Žë5NçbP1ñ’0JZR(ĊÊá K† ´?ˆb˜ŒµP@°­d+"İLÂÀ'ġeÌ4ĝĝEy$Ïùb’ì Ñ* ~ġŞ)gä)ŒYr‘PGÉBNu ˘œ†¤X“E–áŜZ ˘8ħf|ĴK×Ĉİ!ÚÔ0™T.žU'£"[‘"ŞiZ7ajOĈÊêçúòšƒƒó„„dĦ”’ĵlşêÉëĈ”aŞ6Ż ”ħXĤ8Bñ*‚YŽë‹÷ 2*-@ëX"Ö2d$ĠBŽ0+¤D¤)ߪzG“Ġ°?Vħzéç ,İ‚v‘É 5™I œMA>ÚLSÑjŽEħ­,ĈYèD™ÂZˆÙ0~ıjxN½†Ċ!^BŜ§*RE"Yhİş^V@ż°óXĵgżt°ĥPĞÖmÀ·ê+ŝĈ<‰äyĦç#@<Ž#7\`ËóaPAÛXUÀ ˘^W#iuÔîP*İuUE”)ŠYHA$ƒ”‡ˆ1GŠ4Ĉ炠`ITĤ öûx6< ë­Ù´íújkëKXSÒ´H&!Gċ²¨@FäĝşsÜDžTIÓRÄXc{şë?½‡z_— ó³,ğ4sl ôĵ\ ùÉ|¨4™Ì†è›|1U½b8jĤß~-œ35Œ2&ê&@E%ƒiÔÊé¸@"á3ñDT×fM9›ÓXċX¨h•*+päïÀğÜ[÷XÙÇİc …Àġ]"Ŭy‚•ííÉÒxœ§d:Z–ßŭ‚CCĝħ¨W-_‚ŻÖğݳXiעĉU…ÁߛEô"ñÑ|v¤MAe2 Ár ¤Hiü#“˘ œŜkŭóäsĴ_ßQV|àAIày9Hœ/¤ˆ(ŒÂL0ò31QÍI…ġ€”T”$(ĵ(Ĝİ‚šD1ı"-G…Œœâ'Ĥ¨ŻêO[ú·@’èxÌéŞ÷qôÀM4Ĝ;9YĠCó-7GíŞ+Ä´ŸÄ‰¤ËBZNğ£jUײ—Ŝ•aìDìÊ Zµ"Ħô 2Ê*ŞËXĵÒĊ+ɧJc{ĤšPRBŠtħì[7 Ġ%ˆŽ6ŭñjo·`ß˙v"µú—•ʃ¨ÂÙbŞ5†IjBHDH çŞz9›°œ­xb`3 äŜüHZÇ"2˜#ŞAuFû R ÷MDrh‹l‰œ*ü_P/ zĠ‹+0:už´€ĝÖ&s‰LŒ ²5ÉŜ0E’…9mk™\!•%Ú:Âġi›9.è}¤“İŸî&sH>Ĉĵídy9"§ …qT„9™Êë(ƒN²qµİR›BÁ _úÀ>†ĠËAê;İA$„ar7 ş–£àÈRH˘²^ÈL¤ ··´ĞfÊf$#x€j =ÔäˆfĤ4Q/£š%ˆTAgd$Ò éŒ,Ĥ àVJħ“4iLÙÇéfşLQ c§ÉÇÀ $áÑ)ô/è7˜żùi€Ž£Fe„`&2“ċ4‰YDĴgG0Ó.d¸ú‡ V ‰Ĵ@=,\›Í(RbCš úAKdq~ĵ@ 2 0ßҘÖĥtH*p\u?–où‹Wĵ$ĸT2€é’)~mÔĥU>™?Êħl\ÈDĤ=jBdEK Ĝ΄jÓÄ+*.àĝBŞî`,%›DyJ,KKZ&!’™qÛ.Il ä x>ĠÒeɟ# cE?ŭ‡bµg=AZ%¨&Ĝ? Ïò0•ċäĜŜ³y1‘!ċœ”Ğ`˜ÂŽ[ƒ+*‘Ùú ¨’Tâ:/ƒBÉħ`¤`}Ĉ61J×΢ „!O3kR².j³Eš&·a9žaĴq5mÑGħ f@ĤüZĤêğ?‹-ĉñp?/(Ċ²D*Sy[ÇMR‘ÀX§›Ç2^ßK0ĠÉݘŜRM!!$E $J*†VÔ ÄqĠRu²b ò²³ÈŞ7ĈÇâ˙Vvş 4—ƒ0EıĞĜdkİ™—ŻEAŝ/¤-YĴd€_U°Òğ†ƒ‹Ô:kÁġì9˘eħLdœT€³4[Ċ „)ħÎŻ z…ÊŠ*VH&ÇVÏU²ÀÓë‰80̋]ŽÉ´ ™ÜÇŞğ,}FhÊJ•#³XœuĞ5p´L(Üß„‚(`8çßU§’Œ°4\eLöıXX³Äİĝ9Y£ĞUÈÈ^ĴerD_ȉÌ$+`íD˧5J-M µÀoİa˜Šóx§Ñ4áġwħàž ³Ŝ8™ġôëUl 0ÛúRş `uZ"ĉàŽ ŸĈ˜Eĉ‡´ĞĊĜ$;İä)VĤX]Xd%m–`Iù’"†ôÑ4Ö5JQ"Ç4 rO0 ,"êàU$_ġ#kµ?ħĊĦXú†,-†ĝ)pmŻ8b¨%h+Ċ|,‡jîxA~,K İ´Ĵ¨/LALFR³Àż€BÓ* ĥ Ÿ1͒BéĊ ÌK<§WE° ˜`Ê 4 vÌqë#ÇĠ‹ë™<½}6ëû²NE„³€ĞöŒ×DAàb*K2ĊevìÈ\+#3¨Š)~žEÑ$˜ŭ‡‚Vµˆš&â”ċ4d†óİœF0ëħÀq‚ ŸÈ"nħ˘ZĊġ™G ZOÊ 4].+żLƒĉMx™ôHċğŠêzԌDe Ü2àiá¸RTmlú-]Ëd %ħĤMGÒ2\]+YMœĜÛe! Oc>àéw²T+ƒ1kz’#l‹ġXúe?֟ñ$Ĵî´Ĥ*ŭ xSXŜ…lÒóäΠ–K—ÓÙFÁ+ckšž—{iĵz’B,QÂEWÛµ…Š˜+ƒWÁ mRÀL–` Eċ˘ k‰|Œ8‹#Òzd`Ÿ˜oSêğK)ó‘Ĵ˜*ç’ĊJ)m>’Ó%~ê0ĥˆÂ ¨LF›³Î?Ö'AêKĵDëâÔ2PĤ!İ2UIı¨Mk,ÈÈĜë7o¨ò”&'äBNФÁ€ÀŞè8ġ]ñǨ´òİ!İ 2i˘q!QJ–Ï€Ûl?Û?Ĥ‹‚ˆÍK–x@‚O,°Ê,3dÍ#Ö|ĦÊDVáí(è/Éh}ÙHҋ(ĥHĝŞéIâXÊ˘6mAçësï}Vόä/ġ^šV(ÎtK4óħ’(fċ$&‰èX&+%Si(ÖĥY]üDÁ#-À@à* ï-ê¨ê ŒFñÊŞ‚ĵZŻmħ4ÛÖ´tnadŝ8˜e!%€RÁaE… — î1”…HQ”TQ¨ċÈ+S:—ŝZ†gMé‘íħ1T0‹u39NİXBŒ \–AäeËb d2Ĥëˇl>€I0˘*—I>NLŠ­¸2SQ`ÊD”+BRXû†îĝ‹Ĉ´[˙:£üaXçKS”LÍ+á1#††›ë…ÉK•bı²"Zúĵ ĉˆ0‘rr;Xŭu2f£- klWĊU1ֈ…Ğnâ/k‘€iFÑDpXQeƒ ‚ğٞgJÖl}“çJ#xĞwçœiS,BŞäEĴ1ˆE’ŸÒïœ-A>¸À^O(Éz5YIG´I0µIÖħb ½ÑÌhÔKñ@ëXcÀ2²fhĴ2J‹-Ë:§•qˆT’ž… ,C&eY…q>Ĥ;ŬĜq°r3ĉjĴž,Kz}B£“EMÈħB^ñí´BP‘ÛNŠ4‚ËÒƒe5ĜĴ:\œoŬ:] Xœ‚ì ë™Vı$ÁR•İ1RIĞ“b4Ĝ2X/ &]˘¨²êk‡âaUGa$Ħ€Ĥ/WݟP`Ü}5*^xi À2•DZŽ2â4x6ëġĊŠ0‹`˙ÙÙBŠâr²U7È Ĉħ¤ÉÖ`Tf5ˆ*ĉ "r CĜ¨'Ĝ^Ç_µeu5V\gE&°ZfûÄÈ€Ê ċ!p2ı ’ı"ƒ&ˆhJ‚§V$}e!ˈ´™Èàèzúӝñp ÄÊÀÁÑPÑÉĜÎX\‘ײ:(29%‹41ŞéÂçĞîX{Ĵ[oVHŠuWcáŒZ# ,*¸ì‹Ëî: B—SY˙Ÿ6tĦŠŭPĜbĠğDÁ·Ó¤@ ‘áŻeßhîżÂɽüÄé äÔġ‹ÎœŠ0ŠbÁ ‘ “HÁŭĴHQ#³mĥoò°j˘Áö~@=‘OaġÒNœgLƒŸÂ]ÙĴ'áÚÙ‘9êŬE•Cá‘hĵ’˜Ì?îĤ·›vŸ­ò+ÛGv”ÀÁÀ‚P Ĵ‹KïĴ} u„AŠšù.™Ġ1zÂ×*Ĵödğ"\<”dÙʝë…ôÈŞDuT×òXĜı³ $׈~6aî„q‹2]ààŝ֞ġ×bú›p}‘ıöĦc½Q¨˘i ĉĥtm2aËÜ`Ĵ Eʓ)ˆ˘‰ïè íÌ[ġ&bXwë“Ċ·˙¨ŸQQ)ΜĠÉ4/DqylDÔÊùYKG[²Ù'}WÖ -…"üĤW›Ŝ>1¸ğ)ž{İuh°móĦáàˆ$‡SödQ\ A÷g…lHìÙPbż,ĜĠĤlìÍp?ÌĵX@-9ÚOż"èTMI3|ŜÙŞ2ílg5êĞ,şÌàÄúĉ\˘Nžhċ6´Ż8ıcWS{$QîxñŽÀş`po̙ G‰XOĤU £ë"d)˜„zC‹IÒFkŠ{}ĵÓïâŜI!GcRŻÏ§D\ċ…à¨`/1µR8ßSàZ_€AŠíq) ôĉ8îıÖ–Vn°ğëÂ˙”—Úöl Úo–‘7bĊĞ^³EYиö‰ŜEô(Şz˘ ²!Ÿ³ÏyâW‚?еĴÖX°rz7ÉvèÌK%x\>VuYψlËĴ,ç°éNĵv02ĥ°nhÛŬÖÉíêŜ~rŬ0ß-żġċŭëĥä¸MoÏÛdĵŜŝ ˆDd-VӔë Ŭ²B‚ Ş –‚e˜ÇZë¤l3—b£#&ÓúL_ڙE} d`ï—1–LbHE ië?>¸e+׺³gËK­-›wïkÙn Ž­ŭ×ß{êÌÀĦöÀŜï­e]/ßùûĠ™—Aò1Á¤ ²–•‹˘.— !ĞZT`ÔŻ_ÖY>QUġ¨ĜĴáÌŬŒşQ0LC)E™tšK|§£ŽÙemCÔZˆ´s›ÚımG¸ĥÍÜş..Óĥáϵòg·7y… ´î™WÖġçO6qMü¸+’,*ë:d?ˆħÀı‹b&)•³òU•NùbS†^ĠMú‡Ż 4ĉŻż8D]„ÉpüĞ/fBŠ]ßĜĤ×í6xíıáĉŽŭ×ÉqmA0Wn×ŝg/mLݽ‡ıƒ;_áš:Z›.mÜ>ñyfbœ-án …l|¤ ˆĉ·ĠJ4Âì"!H'#‘S0Ż˙@킍rùĜ ÙÍ4?ZJĞÔÌħŽ*5ó' —- ‚%vc£…ŸĝіÖVcÓ>nKWs ëñĉ—Z7GŠ…çġô„^_·ëù76éëxċKF9™#Œ³t9M„ĝfĥċĜL,Óe7p7è`hĈÔ”XumWÛ?ĴÂz{WY1fx.Š-Ö@O’ĤK&-$²%1^`Ù`ƒFĊx"1:ŜÒöJsG ‹km{)ÀµîHĵĠ²ipφ~ûěM/ò×ġŭÚ[żwĦ%pîĉŸ€/mlÔ2„€<^N'µÂHÊ•„@ħo›˘—ÛĤŽäû Va5!„z"ˆqûçÒ×Ò`İr.Ï'âñôÛ9à@Q‚ĦĈšğ&ODßìë=ÂíâZ[¸—š;{ú;S-C‘K\ë†áD?|qËF~gwßĜÉç ápJÔ½ş´(%*ċsÙTqŝŒ*hŬÌcƒœ¤[Ġ™T3HŬJÈc—Ÿì[XJÄFĝdwsDWL7äx6)ĉû. MP€ŻĞU_ÓëVGġıPôbë.Žk sô­'·´žéŠ˙Œ;¸ŝ—CšÛ6ĊOöÏÄÒ"/a5³R°ó%)óÑK™ÊÙJ’LPcĦœÒ°6_-ĊJláĞĠ'b•ħ_5~IÄè3B 5ODcĦK´@qpy ‘,…Lèa}Óўƒ[Ċ6µ4 öδl ´Ŭ|ş½{pcçĉŝĊ>! +*Ò2óMı’FQ+“¤ĝöËċ‘dBÈC’/fSeqÊN(°$^Ĉ“5Ħ{ °z?äHK*#Œ½ ŝ¤0s°ïe6ŞlíRʇù-[6n8~ ‘nÙ°ğ…ÛÎ ïknŬµġ™ Mƒ}á|œ?wdŭEî+^ħŜ6 Ò"d,•œš*§„=²WÎŞ™ÉĴL2!”%„£Y³Ö“ħş|N’r¨ĥdA1ħÉg$?’äÇu­B-ƒċx Xżó…Ác­Üž]­\`Kûş` Çw†Otl^:Ŭs`=?ĥ98̃ƒğžŭ>÷íÍ4s,L‚éWrE˜œkáDBHÉċt\ YQ.dz5ÇYıħrÖ;1'Ì­˘˜X+Li˘púL$E;|ğœħݲ^VĠ”Açím-m{vklÙµ"ÂĈÁ /í …ĝî7NmïÜv eC°3şŻż/~<–¸{–•i€˜°ä&aı@/ȑ”,¤&‰0‘MĊ#‘"OPĥÔé”ĞOÀêá+ƒ¨@#Á†ôrFҌJdR” gŠ+/6j=uœuĴO&Üşğ÷à­-ë0xv··lîĜĜÖÒ<pÛCG¸ĉÖ0ÍòĵÍüċ‹E­ ëÏÒÉQìĴä€qSrHȋ¸„dëіġÇ8 \ñ8Ĥî!ŝ,&’ˆPŒóz9Ëm’4°ÙŜ¨·—"ñh¸d‚ê`.5 †Û[úÚı@€Û1Ĵ}+oË6Žë Ÿä6îühĊ ˙r|÷ĥsVŜĜÌĝ™ƒ•[ŠI°öï‚} #DšŻËaS×£Xħ´žäÔĈAQ—úNĈ¤\Ì!^ïjïê†hà6vp [ĥĥ´ĥµ˘£ w;{šĥOuó'"ΈÁ² ğ^U²XITÇ 3‚PH—Áñ’)p0 ×Ûc`­½L<îÛĜ-ĴÉéĜ· İ(iÀÓYçN ÌT91X(äʳ$ù8­T[ĜßĵeO ײµù·ookOOKsçÁŽ]‡‚Gş6GÂB&“„¤‘ n›-8.ĞŠÄHEŸd‰jċ‰H,J•B Ğ`Í?Šu)&×Ïi-™VĤ rŠDs[ by²¤³€☵µâŝ”¸+WB‰,ËlÙÖŜÖ²;°ë–^ĠÎMGv†CÉìġÖĦĦŝp„‡[¸_ψO׏¤Áò76òNĤâY>%“r$WÈGĝ‘J {b@5YĴżÔ{Ô^káPğ#‹Èb†–#$3zí À`£HeL–µprˆÀépcxÍBè–C#îÚèkߊó'ûĝŝoítC$8äáĝ›g+#;ŬEÇh‚$)@p—i9‘Jĉ“IANcá›êeÜWí<΋Ĝ ä:O$’T.ĈQC_E-TĴ “qÀ›Ód3/~RÈÀ°Ew9÷öñ@ÓÁƒ'†ŠesûÀÁŭ{Ž ÷öĥġ öv‡ĈBáÖuì"–pu„-~èV ”î)F.‚Î*ĞtĊiwħÎc}Ìq2‘Id! HòWİ*&Ċb}-ĊpÙĉa‚šMa#,DÏŞ)ˆ4ĊÛà O-ûıŭ½ŭñŸmìż:ıáHӆŝìäî΃áTDP$‹Mŝ¸Îm)X²G·Â³Œ ÑĦÀöˆá1äqĴìÄ OOˆ˘0)Eיci,ÜhiìYÒô´ċ˜Íj)ĈÍ`c‘²él›H£;âôñCAŝĵA~âÒŜàğ7żùBÓîŬۃ­ûۛZş…™Iq·)ĠOü°ĜaZġnôdĴ|8–™5Ȥ׼B[İEĥéVÎRËPF|>q 4ò9 +‡<$ä9Qċ";)-Љ$v-Á+UĝÛáŝ`äĝĦh~ppàùmƒÎÖ-Í7ì9¸µĜ6°Ğż#°—OBĉ‚ŬpĴlÄBu½ĤĴ!ċâ‚-CÀ\3– Fа‚•”ERŒ€n³ÀlŠìċÙj…T ,+­]Y$Y‰˘8Ëùñ‚:BËà),ž)\&3|Ĵ{xÓ!ŝíŜĥ}{Ou5ë:´ŻµuÛmÇ6ŜΚŽ@X{Ĥ?ç#ñxö­ƒÏŒĊ,ĥ[Żw²=2…Ğ[ `ġh95IU¤ù%Ĝ^ Wa,šçÓ0ċÙiˆ(A†·ĵ9Żž‡\˘Í/Ï•$„œ€›µá"ċ᎞ŝƒŬÁîŜM;NmhÙ½żucûöÛ.=ûófnӖƒĉ4 vGÀ| Ĥ-p×ŭşH0ÌȸèhĝŽ Ê#X ĥˆÏD"¸rIK ˜ŝ!&γ%iœ[B›áӊsŸ”S9RÏE0`šr ĜÉġôlÖag˙Ŭ½Çzşv°´ħ‹Ûƒa·­ùè‘Ĥŝ-Üĥƒ\óŝ Gw ïjmŬ<Ċê0ìŬq¤êhĥU m9Xġ³ĝċÜŞċ)x²*R’ŸâP ŒÇ“4fİh ÌC v1Ϝ‹dóŠg‘9 ì*ÈÑrŞ’<h?Ĝıap°·£9p2›û¸ƒíÛĥlÙĜ}ìŜ]íëCL'ô÷ví í¨6?^׸ċĝɳ vl;‚(ÄmâĈ£XïĤñ|›iBa‹)ĥw—ğĜ2 n‰ÀϨ~3RNeGòñkgäIYÊ y;ÔsèâĤÁcǏöĥ]ğ@îŜġRëփG:ı-›64ëXtëîŭÛvwöĥr]‘SĦˆx‡Ĝ›kĜñVµëŽ„½Ÿ;d w<†•'‹GbxŽ£ ’6„%ìEօ˘`€H˕ôD"ÎÓùÓżì˙ú"ît“³ı2„8 ·÷ôôÒÖĥ>P„ı@WëöN³]ğzmÛqhw(|}ŭĊŝ#;ZÖup]g†·Ç~yĠ, ‹Ù\°Z?ʒ²z;ç ­ÍÊY·Ïz ̇FllÄf1ĊóĜÙ¨:Ċb|xDšKÊq‰y^ğn=>²½×.5Ĝ}ôh ×µmİ@ĞqÏó/'!WQۂAŝXhKӁĉž@_D TÁhc=n4Ô‘ààPLN¸wĊ~"VÓaĊ! ")˘ÏjóçÈŞRi·f…™Żâœ²(§5$¸‚?ÒÓğëd];·ĵÄmmŬßÜs(8s¨eëĉ!Ħ›ŸÄ†ç“²NóÁ“ÀCŭƒ!>ò53ġ.î°fGĵÀĜäOaêóı“ÍQĈ½şá=†UӝdäÔTÀBRHƒr(ŸŻM,­Û+‘ÉóiʔÈĴ(ÚÊàŝƒÍí\óî#,í>ş½Ğײ'Äó!Äëeż9Tâs•ÙןOĊnġ÷ŭâyŝ҉CÇûCŬ£f!ĉ)ġ³µÀ=.‚:ïj Dµ7úJgûk˘˜xù:DŞıĞ.|DJÛj O<5A·‚áKö+~ IDAT‹Óŝíi,v¨P İ‚œe! &|âtÓ ¸ĥ]š¸Ĥí[şúğö÷ġlë=tĤςĈùŝ—Ğ3BœŸJ‡7ĊòóGc{“‘#MŬáè|ž7Ĥ<ĤguġÒ@ ×tpÛ×Ŝ %RGZÏħġ Ĝ`U+‘Ê”ícĴYÁ󵌄‡ İiJëÇÛÙ,p—ħYŬ 8EYΉô♉]mğĥÁuĥrm­Ŭ‡Žî>ĥ-Ô Q4ü|0!˘¸‰ÈĊ>>fu‡÷މpïg‹‰Pĝx_òúĞ‹ù˘>Êt -urg˙Š{f÷ÖÄĥħsóíMħz½ŞˆÖĉ ŬcGóYġ=6 ƒ9UŽŬ‘4 â<³m{…ÊB>Ĉ6â–"á(ċ#A” Ç ›·íÒoâ6ì#íì‹'Êi£V,ôµMĈçŝ„üe,>şp–ď ÷E3ߝOi‰Ğl+ĝ––u‘TÇ3[ž˙Ë֑ÓÁ‹[ö?‡ ·GĴĈú`ï^?é¨|l¤|aŬµb… 긊û_nÇĴlôz„5Ù[ìˆĦì$%I9äómmŭûÛ[›µl‡âû7Gs…˜{R”ż‘É<î$èMéÈċsŻ&Œ>+Úż7!Ì\m56i\kì_?ü{?ÜÖq§e¤ï­k/E'``QŜêĜóh݃‡éĤ—š6œH˙pOş &ĈâgĠT¤XÎ`]~Ċš™ĊĦT‹’)-İ…#‰kzĥ÷´µl>ÖħŸ„O9BJ‰¤,¤#2* 9WÉN™×žżüÉhĦ0-î:Ô32IfÎCt¨ŸlŻÚsàäŝŽXœ;>ŝöéKϟŜˆ­DŽ÷W[;}ëP@kkZLÈgjÏá’%—Ĉñ¨DˆZ\h LğD<+CŸoÎd/´kêÚµu׺ӝ;ùpP4%‡â“ >–ô{Ä!ϊì73‘Ê ċüĥTÇşK/’?ê™Ô‚§¸-M]Ï?°hè o‡Ïè=Ċŭ[Ž_lĉcÓĞVÛÄ hŸ• qI5/ ‘2@ċ͙ßTA\ž ´˜䒨Ĝf›k*íÏN޵o ĥömÙÑÁí GÇ Ï?š:QÌĉ·nÜbŜ!’wğç+Şp2"ŝ4•FÎ^Ĝñö:Èϓˆç;ş[6m o …´%ŽûĤµa`°ˆ=sšò° &!(gÉ$Ÿ‹ôó6R­¨oKq!Ĥs/óVž-U’t*µŻ‹œ\wüĝ—':···ġÉ#‰HüÔúó?™H|™OŒIވı1˙öħ2öŒ@ĉ_H\ ŽŒ8Ñ9’È|dÒ`ï‘ğÖ_Ü|‘ûjÛŝ­Ž=ççZŽ6ó{N]“Ĝ v\ßÊqĠëë/,ŠÊ ~DËÂ(ĥ)‘³ıHHÑ’ÍD‰=?Ύû(ç~ÖˆŜħmËN>ĵŸ{ĉÔĥc‘|ë RÚ<úóž‘Ëdci~0ž•'ŽŸH%¤‹Ċﵝĉwu‡2Éçċ˘q2|q]á9ĝŒ‘u ?/··lĝƒ·úb’ĞèçVaĊ>£ħÙ wR´Z?.*Êŝ-\"ÎÊĵb YÀ_Ìê˘œ’˙’Û4ѵ{Óöŝàñ]CñŸ wòPJùÛĉ£#)‚ˆ œE´½ecgŻóçqöúŝ°Î D¤ 6ĦüßÔ6ĵċ|ŭ0×Çqß|ŭĊW ÛÇ8n}´ĵƒÂjµÖf§Gâ’ı^Ċ6P5àq9.$ß)—¨aĜ1¤* İ”G,ÈväWš‚/5ĥmܽ+8”-dRÂäHħ˜š91˘|o·mˉĜ‰9Ç/]ŠÁħĦëÁƒç ÏŜ|)’x)´o§ô-ċ~Ŝûüuğßúú÷^nnßQ íıŬimŜÏïúΝ=Ԇ|—ÂZ`çƒ`™¤EKÄs›}O‹+ 9ĤÚħ ³B„ĵ((ġtšĴ¤ oµµtŸnÙv(Ä ÙĴ(òñŸ–-´?ǓòÉĥ>EŻt~G²ş¸·t˘²,&/DßlĜ:ú×Íŭo\'7£mûÖ÷öŝË'›ÚÚÏ_Œ½ˆp\KkϕßD‘LÇWaĊÈ%ĤC8pİYEó%TU§ĤMÛĥNĤB.`s²(ZÙIħĈŝ­ÜĥíÛ÷ï~y¸ŠÍóĦ‰ÁÖçy•\X)€­” Žbż+'˙*šÈ÷ĊׅG?. lâùñlßúúóŞtğ·èé™èöù -[šZïéĝSoìnß0pı&礊,_^Ü>U5•ş”u{qRvĜż…PŬĈġ]¤fg‚h1™näzháE.6‰ožïÚÒԟ)m ‡ŠCXö™Ù³ĉwÈd"á/ĵ ƒöJż™.wßŬqĉĝÑĝÙé÷[7ß³·ûüqìTkSËï˙äù·"ż_!‡w„Ĥ<óŞ˘ġêJĴh#ò3bPËÓĴĞ‘ĉ²ĝ EÜE Ö=ßW(‡&Ž÷ĵÄú÷G.îĵt°uo9|0ݐ’?òr>82RN¨ġƒĉlˆÈé‹Ħ‰@*+'//hŻoâÛğżvĈŠG­ …w†ƒG΅#ÙSÁİmnoß̆ÑĠQ‰úAѰRk,mĜ ıjá~ĴgYÂΚauvb+?Ħ'ŝ0ç]ìÛÚÁ5ïŬ“9ÜÔɝˆN oî|)ùg;âü|b82~wߎßÓ İÏL¤"…x(Ŝ1öFìûíğSüK_>§Ç.ĥò{6˙$pé?~ŻùĴjŽ˙hèâWş{÷µHç§`|ŒêJĴnDhœŞá6:ĞêâıŜy›H°Z… €Íëx„$CTŬ·‡ï8<Ġ²ñà@Ó~ÔĜ½ıb~;-ŭîÁD<ÌmŽDâ/ ìùÏkÉìÉ͉˘yk>|$ż“?µ½/ñÊĉ/ĞżŻ™[Ŭ;‚[ğ˙àŻıgŻ%CúJsèúÎèDW·[jè*ĴKħzĥˆ'áÁ[şV”İmV D kR„|–¨ĵXß9bNléNóáÇzvïjÙÙ;nċZCI>R–Àĥßò½|D8vjSF´gŝH.F²ÑÊ`$ñÖ3áħàç˙²ŻĞ==6ôÇ·˙hĦÖÙ´é`(ġĉÎçŝ÷ÀóG֑“_ŝ7zññgNvü –TçÑZv×ÒúéÌì ,\rÒCD²t•môùhäkĠĥâ;˘…á£[wíARžLEó}A>raO0ÄĤħíÁ÷÷=7?F´ŽÖ-Á@ï…î‹g/„)-<”ß·‰{A´™Èb­`é{ñ|GÛ.%)”A*ùXΒÁˆ–ÀhĞĦÉN ôtĥ÷ññ0˙b|T,~àħÁ‰½ùX!ĥìM„ĝ77ñŜC┋ĊÜ%>rħ˙X0ÁG -áĥîgg6…ŭ\ÏĉÎKM‰½­ŬÍĈ÷'ı&~˙Ö=Óx†ĈrË#kǁ‡ckàĉы™t>›ï͌€ÉÊ:Ğ*|(ÁïÙ°=|šçs— >ÄÇ/ñGvo?O@˜9ܜH¤ċí6†¤•â5#Éô´íH8_8 Ñ>ġFà`dˁTçĝüĦĦŭÜĉΞÀ §p7£GšOŸŜ<ه' 2{|´Ë-Vˆ°!%kQ\sÀÖzŝdqŠ}ZïV ás…Áàém={.Hvf(’Éñ„0p0˜ÎÎĵœ‰óù–=İ >É7ġ&R/‹×3Ħ‘D$”Hfx~âb·ŽOœâĥŝŜÜËçmìŬÖĜw°uŭpW ·ÂŜöHax ŬÁôhċÙUXïL “ ,5ĤâAcÀ§ê(0ĥ ²3çˆaħä-¤w$Ü8²‰àé2)ŠLF‰˘˜(P”ÛÔŝxŠCıž’. cĦÁK'‘K#‘#Á‰Ì‘Î [û²ısÊ_êonàև[7¸èĤ×7C‘ፑÁHOŞÂ^^m&~/n‹ĝ`•²úqì/ׅ°:•Á˜†Ġâ'›öìÛ°#8Í˘DNÑ_í,Š)!!g`ÚK/˓‘Hp"˘ğ „ƒÛóáDkË7'ßêŬœŻÙÄہÈWµ~ċû˙ݽ·}NJ÷EğÉsêž H²§öŭĦLÍUHHÈİÌ%$ J%3e½RÉì# èĈ%y_K ^M2IlÓ¨@9{Ï$B*ĦÌż°gb T ž3‰#¤˘ß}&ħ¤‚FU§î'%h>ž™Š…îZ3‰e{ö™s?Ì­ş£ĵZ/èaġ³ž÷ç÷Ô~½^aĠ (ú$M-€7ÛÂÈs OëÀAŒ7JĴ|ŒÀVĝjm×rG˜~2’_ˆp ĦíwġQL ALü%m4^H ÜúŠw#³ÂìǢ€I;½ì›{À½‘ŭy0+‡lèĈ…8÷a‡}…K›q5Ħˆv°½oŒÜÀz w÷t?Ñâ5Y\ôĦt„dÄŻ'ÒOç00üQùL.³fáŭ*ÖÊ;h˘k&’EInÈ5‡,‘˟€k].#µ)î“^ŞëŜ MŻËÛiâî=šaòÌÍvQ ϖeş˜ÈŻìlփn]^ÀÜéB PÏ[ÌÂOëŸéĞşYf5‹xÒCĵF‚›ŭ ê £ġÖñŒhTÄcÙû#ŞĠZ‰Ì)TĠ˘ Ĝ[@S`0ó)|½êNBë4ôKëC}:†œ7^ƒıóŜ:qŜ˜zM+iŒä Œ;+ħPìÏçb`=Ĉ$YëıÄ$;HC[lñMéEápşġÎî÷Ĉ°Ħ;ZzI?0 fAħ†ˆÍĠöÊùž|ĝ­„HĵŒšÜ¨4ç”+•*š+‘‘ï„ĉĤEa zŝ1Š GAˆĥ„ÈĞ ÌÏ"eĦ°_<3´–F24 6Ӄ˜ƒ]acݝì#àD½À0IÌèG½ŽVàĥ.Éî^o(,zq³3]* Ûu™ÌKL ı§u P-žVê ĝ s‡¨½%QŽIċÀʝXĦœaÈ!•kIß;tˆí£JKĉ^}Ĝ ßQŜÏz~ÔpíÑl"ˆC•ŽövĴoĈVÀwÌN%Çİ•½Ĝ(f¤ÈĴ7<$"³`NܛĈ..,C“]Ž6]/ ˆˆ ß˘úßı^\YžóDöáÍB9ğ…ĵá_¨=ҐGiäPh2Ĵ‹&û)ßH,?|ıáwÍĝ$³5ŽĜ0·Ĥp Ŭñ]3ˆ]žġ’n1ĉV[†;Zeí`İĈ‘>sR4f°˜j"ĵŭ‚¸>JôżÛ²4çŭŜ!L?E³Bí4Ÿġ-4ĝŸì@ …Àğ o*Âï¨ËĞx*ġ0…–]ċÔ>K‡Ïu90ĊÜÔLñÜJì–&œĉÛù  si+ëf˘Î ~éĤÍ91ñä˘ WǀYjÜ Ş!ÚÁ:Ì#°.m³t1#l éÍ$6g%A'ùsÜì„ p MQ­ò¤¤y^5y”Af¨+Éuı‘ƒâTy”ĞÉà'Ĵ?éèqú€sĵ°‘a\P _DöÌÎ6j‡ÍF¨5àˆgIßħÊlîĜiXç´ıßCt€Û*Öhï:í,ıËqĤ›ÓutyéYÊ5éá˘¤z].Êóçê.²NÊı•Œ?.ó&Ġċ×½„XËBjıU°2ÓÒ$E1žW .³ôz ÄKüfçrݳħàüR€ĥ;WBK ‡o˘ƒ‰%1'ˆ­e_ÙfaàìmgX4Gú|f £:ÒÌô…£UĈÓÖ6Ÿ–"_k’³H͞šĝñâodEYÔĥD` ghs˘­”+RnCü‘·áË+Ky­Ó6d˘]$ O™8í[ŝ,ĵù“K2,ËF™9ÏmûŒÂ@ġÀ5ëQ ^ŝäĤĊş1-遏ÒO›1…ïÂ6˜ŝŝÁĤğDmÄ•oßÈEÖċ‘!ñ\?ĥ& 8Ldŭë„ ÇP?;ċ¸Üîd6[)½_…):fµ ġǢŸ4˜(zŜ8ÙÉw¸ìë\Ĉ<·ê½²İ c·Ç½“Ĵ D™<Ċd_MŽ]¤{Ô³Fğ# †[ƒÙà/ó˙ĴĈÍÀC/Eżġ¸Ž˘ž¸Èĉ6żU–îšŭğŞ'ħ“@Róû‘Jġv‚ö?’1i“Ħà5’6öy0\g>ĤPéD~jç|ŬĜĈBО °‹=fż˜ÉP,áI!Ĉ–µÎà*°¨·LŽi4/?0ó°ùä§ =½”÷cFŒfċĦáĦ1LĝáĵĴ§Ä ­éV…r%Ċ B-WGÁKM†iĞ”Ċ<4ċĴ+f×+ œ´Ŝ; Ĵy.—żNC׉bċŜbš&g”}>£•Q3íŝtˆ‰}´ĥ ˙šÀ ŜĦĥAƒž2czĴÓĠ°„ĞÈêÔ`Úş8ú#/9O·IÉ“zċœ}ŭjK>s:ĥJ½,6hĤ²²!dä@˜Ċ°> '˜†òƒ£Ĝ€b*:…Vw ì 5÷°;.ÌĤŻĥ–a§Ĥv˜ v‚dÀŝĈê§ğ`)jnc‰ jçĴzfğ‚dŬ"cV:f&5‹ÍĠ„ƒ€X| #(‹™ÈÓ²Vy´Ú\İœ’ħĊ—ršXA³#ò@J™ß\sQ.ÚT{5Vcŭ!šÙ–ùÉ^˜§— Qžç„ÙI›ña­Ċ7DâC5ÌrÖżJ;Ŭnva}óN߂ÖëEWİ€/‰!Ö@8ĈçQ܄À!ċÊ*šİú†ĝL:wÍqñJšħä¤×ƒ;òa dc…Ĥ]Ċrj[Ñg7Ağħ’4Ŭ1 È>&”÷sŒ;íR M-X½qËn×i(rÖfŭi˜[™ġXâ–Z˘¨Ĝ ÒŽÙûz:µf3^£Ŝ{żD·Ïb¸ƒ|ÉZÙàċTݐċb脞ğ#Ŭh>ëQ è+`x&bSÏŻŬCi¸lèI\2ŞV, mÍĴÀ‹\ê{Ԏ͂‹?ĝ4KLl‘ û[˙|KĞÓSÙĵï ùRĉ÷b'<‰O9*ĜGmÎ`cÌBkÀú1…yd‹™Ċ>TäöÉ+È<Öäa@ÙĦ.²ĝl?‘tT1˙ì³61˙ğ„ġĈuúZEN!d5*ĊĜ+†ÙŜˆó,9ye|Ħsk îLe!?=ËĴ_ GuŭáÜookĠWħ6~22q/iôÒċŸG>N¸Fµ¸­ž˘;hÇ ´_X§&¤ezPMöšĥ·ċİıZ&OÈyNŸ•U*‹­]s›+hp/ w^JX–͑ÄŽu&:NôÚıŸÑ`˜Ò£ZÀœñ£—÷w|>w€ ÚT\Zë($~›ÔèuĈ$ğÜ Cwĥyu—vğóY…“f—ĈíxlPVġKiz~Ğüs÷*LfÓ{ŠîT³g\ž0ÌÖÎùôĊ“¸4àne½–ı›:ÛÛ¨Q.'=Ġ × .&Ü$³= ­£‘ à:“ğ^§hÜrN+É²ĊKšÀ †] ğĦö‚q1@wùGoE}¸‰ei¤§+͗Yż={z ñÒ:‹jöIşÜÜaAÚ+ž›-Żñ;ıïp^Ċ4^,K§#.IÉt áö˜¤o›ı–8(ìThAItä@‘T`€žcĜĜ:폺> F1ì{‡&&Í0·´]NìŭhT:@’6Ċ$TÚA·K{KĞħ@/fÓ떛ÓâáŞ3Íb˜ÊĤö[ÍdŝĠ‹=ĉĥqŒ(×Òċġٚ tuŒVk|aġ\œŭŭ'vBĊ:ÌŻ£6L²=ĝ0 T Î{mFEI÷ŒĦ]IŸÂèí.sA$–uÇfš½ĥCÌCŽááĞ +ÈÄzÖ;ĤbÈÒA ï³Á÷‹Y³†w‚ĥž6‰™Ĥİé‹uˆ‹#4kI9| ub%^âQÜ]9ğH•ê( ëL‹eQċu ìŞĈ•´Ú½žXOí0Ĝ#K]´+Ĉ^GP‡ °1'³÷Q0—ÏniÜ,ËÄ]ù9sĤÑk 6Mûŭ˜yi=`QĤG1=ĵ”ŠŽAƒ @KÑĵX)òîËÇĴÉħڐCëJmżI҄tš§N_Ñ&Î}£cLu305cgFIE—íâaZ‰mnĈx;A1Û^à"iš$½>5é˙`>OšXФâ™A Ġ6ÀÔÁ›˜#>h ^΄ÖÁL[ŒñġPŬk@;ĜçžÔ´OŒ+€M?éǃóMÍw¤ƒ}?•›ŭïÇ×ĵĴUê§uĉÎċ[bċŸçò=ĈŽ›Ĝ¤·Ŭ3Lk~eQ§ġÇ768–˘u#€M*:ÛÛÙﳤĝŜ pÀ/8I q…òl0‰6ƒş…Û€qN– 9hjbHúmŻ³fĴš+?;Rì§x ßÓËÜ6Û_ù_>AZ@3ċbs<\cŬzZöÂÇŝ#Ğî{wħAġv3‘=C³Ê6³;Û, ;üŜ°ŝµ…$IÀ†3Ë÷/$3.gfĴát™Tcî°[eĈ1‡^ƒc*Á<ÔâeŸsg³×ċ XTô?kĈh"ĤÓe ħ‹<ĝWĊ-Ġí[ÇFŭb⍠âĞ"_9>“ä ġĝ*†?ÙWè >*v’ĈTžİîüż¨è™·Ô*ƒî: ğŜKSŝĝĉ‚5£™TAĵ‰ŭ”¤í~pÇ b³=:|° ´‘á­+Ĥ´¸†uZ‹ÚÏz,×fÙĝx+=kԙĠ0àv]Ċ;-ŽW×·ñ7Žü7Ú}ž# ĉŜż<g_Ñö˜\™Êò´T}zĥĵ£Ô ĜìHêXËí6%¸Ùú.1àcUWzÂ_"7}䒓YY™ĥß;-äŞ7ĉ—àufìL’v,i””ˏħüghpf­˜ŝòó.yEÂĥ6àíÄ{ĠD;5ޘ4Rñ4Ŭħšƒ­ŭ™şûÙëwÔ?{ü\3‘7fäafıeU<]~ZV˜UŬ5†­^”/5ŝÖ¸MtÏv/âêȂmqx  Bħ5w²orl`seĝÛíş–ıñŒ‚v×&|ŻG5rÀŬ.4³\ü†#QmMíBNJY°N˜Ĵ¸]…[ŻTĥnj&{çĊüµı…b%‡ò'$`:[TB•×JżyúnÁàġsÜÚ6ƒY“ú.Ġ4îĵ\= ?ç&icÇd‡YĦżĵÑHpÒBĊ&ĞIf}P^Ĝ šhÍÑfV°–PâĠ›ևá8\ÙÉ!U°×`œPR|ıĈ,ŭChŽ 0…ig¸t;8ĴĊzAġ²¸şQ Ż‘0ĤݟUʵUyŒWBµ ÔÁzZVh´î·’J/6'I(Ĉ‘E':¸ĝ 3îm%5ŭX‹ ÷2>×fÉÜFñŸÒ4bú İíÎIġ@Pmk#™yçÇ<<’°À€µ°uz´eş…ŒĊÚt(4cÊ~OxïêHnŸÒ+1Çċ{{o;ËŬĴ<ÁŜ@Ĝ_µŠ„SĝĠùs•*ŸĵI.­·3:Û­÷›q´MŽÁËÏÜîŸh'í“tnj 0ô¤×ngŝa„vÙ:fôÚprĜiV(¸>4ĝša0A¨µ0p3·‚• Ġ$´dí:LEêÂûÓŻò3mKŻC÷ú‰mžMüŝŭoáQâu\—ÙñÄòÓ5xİ$ˆùPÚĴ†܃jìi´E ó#._uš•}×Ħ€ĦĊxŽ%+˙yĜíój˘&šÓm½Ĝ@î‹áĞV24ñúAƒ˘m‰²g1%íĠĥĊzĴĊ‡9Ŭcj³J§°9ŭÙéċġ[h)İ]uÓáÌŬ`ĞxıÖĉ(4šFùaC,?­ï3ͤ­Íë\Ô˘ĊÜNyÀRUĜa3AiĜ˘£mX^ag`ċĉŝ`˘Çl.˙ H=j˘°K*ÙÀM|˜ 4*[ê'áĥ°MÍâ µZä ëZ°´‡Ò>FÍ(Ñ/a>œgÜ·6t—9"â;+7ošñwċÙĉË.’éûïq“0ĜÒÈğÄíË|¨Óöù,jƒ×Sî“Q°†İ_ dĊĥ{˘ÍżżNı— "†·a íÎŜ\ÀĴ:†Û{ t3m i'İ^L ßĠ(lA@ IDATFa:Â0ğ}:t.Ŭìµğ“”ĤKüûyH—‚t%W€k˘tî‹'ÖÁ‹³A C.G•šŠ%™QÌĴ5茄ÚbB…,7MÙµŭt$½ëë·)ĉĥ Œ;ŞSŬ€öšñÈÏ1ĠĦ‹6ĝ}օÌDÍb³‹ZĊìEĤ€ĤÀ0/}²ìß*gq½B‡ùcĈ Àrùŭ%ÓÛ|M”×çċĠDĉƒxgùsµâŒ˜ N8ͨ6ÖN ½wĵ ĝ“4ĦêWÛz w²ÛCYIp˘G9>Šs ÀàsÔYzcŽ]èUQ,´D~5‹µ˘2 îk `˜áÁş9²S1ûÊ`§ ^ƒKB:˙V!›6šµ4bŬĞìgÀÈÜġwŻ Š[ˆ@ 5emûœ”…B!µˆ÷·›:Ñ­F ¤ g À§‹Ğ1œĥ2³NŸ—˘Èà¤ıDĈ9aî#ŭ‹fÒ(íTÒK` ûŭŸ¨‰Ž >\UŸĴ=x§F1¤bH§ÎlĊT£ ½2œĵ:Yz4‹ÜÖNĤ§›žJ,%³¨-Yi<8Í×qıÀ½˙LMSodL‡µN£èİĞÊŻkŬ\€Żˆ[ ¤‹žs{ó´ş·Ó2›JïŬrğÜ3˜ĝñŠÉĝÌĵ*ä˜ûS‹ĵƒlÀ4óü/|€İĤeû@h" Àġ‰lzĴ!û KX£5/gí$éÒizHŸ*LQŻ*€Nm¤"zôâ˜Ċb/kúuhjp`‚aİé9@­ RËe–‚*ĦÖµ <—“ËŸ|Ÿ.ï2ĠŻs͆PċÉ~g]BëÇOËş#縅@ùDRĴ}‰IY˘½ÓbÄ h_żÍÓ |Ô¨³ƒ™ĥĊ =˜ìÔwv€É!ß,fbģӐ˽³fì 1F°3(½ûlyƒ/˙e*p1ĜÌíNm+ĦZèôŝòras·ŭÈj§ĝuöO‹£MÄğF™½ äÓD~ÛıŽk*ÁK,›!GUĈ^(·×BÚKúËĴ4q1Û33—ŜĠxġPá)zĥ4[¨ ïĤÒv}|Ú£§.à^³›q=|Ò:˘_§ŒÇÖ7bżYèŽ$+‡ ġNËUĝÓ05œß·ˆC×}ĉkT:Û,X">úı„óum´%ñZ~ĦĊĉÙXž†<ĵƒöMôşÍSë°?ĵ¨gçwÀ{ԘҌY;vnk&Íx/áZF‡Gœ£3NkċÚ ´Ò1ÁLL|…cÚşs4“×İuĉÜ2cÇÎş#ÂòP ù ˜_Ĵ˸ˆ¨µñÉúĥƒ–“ŽKëL·½şżžŽelí0” mKŻ~ I²ÔĴÁêğ–&”şHê£ÇCŜEÇ>ÄF]ÌĤ3†y“ajœÙUÎ:H‹ġġ ݨ·²Ĉ¤=?–CüUÛê°Kî`ïòPB´ġ×úGß˙dЉq’-£Ü°9BR?'+*jC œ×ÛaL-ƒSL’ĠLètʞĥ.ŬĤ Ñíó¸zéA|AO}JŞe“1im¸üAĞӃ]`—Úŭm=­{cPK=>Ż s×#LÌnZW}‰Lq'ı‹a&\&ˍ l,\ä™èŠÏóŝUy£S”Aôä•1ħöàœĴ…ŠŒħVڈ™Q?§E É S#=ƒ˜zĜÒĈ  I˜Îh†<şk‰wà5´z|È ÀŠw³ßvy°5àkáTfeĉ1ŠšèħBWe3ê”L,Ùn´Ü{w¤xÂyh´È½)àNšBŸ´ìµe.ïŻŻ>ú¨I‡v[ê!œ×dr„Y²Ì Ì y‹žéĵ˘˜„/Ùbî^Äŝ ù^$Iğ|ŝ3-ĉĥÎHbĉZzçÁħ ,]Ê-zúŻŞ‡&V ¨„'‡*dûTĦxl×êŸ˙´ğĝa¸|C65–ŜqÍòÑ5Çܧ-ħ֙èµÄWĞMĈ(y1ôIÒ7£ċßځJ³ì]7f´f‹Ĥ{0’u^„ÖıF.Ĉ&Ÿ‡b“ôˆYÛiʒ1hŜá xXĝ76Ñzĉyd ·À܍Ú>qĠ/°ñ/Ñş×żìà†BtYö ިsÙonä/޽r0Ú˘Y„ Š ed§ÈĜÍ äM{TMş˘ÖĜ`kÓ²ö@Cë˜d+Ó³†‰‘€#äÁ'ŭ‡Ŭ,jŝÛ½˘“Ħšl X§+‰·ŭȝbMŻÏ·Í <#3½#,Ċ×fèÒB.tvb-nûŝúïċssùr–ğŞXE+b5†ƒD*µÊ³½†L‹Ò[ħÙYÒB—1#<µÓnÖNZ8@l]OZ—Ôŝa'}×tžXĦìħè0†¸íGĦŻÒ•Ôö")ñ'>E/VwX¨[*2ĞœìNŻÍ2ğ{ĜöÚş§kÍ˙|`w>ñqdwîĈĊ{Q™v-ÁȔ'Ì˙™>Œôdf>Û\pŒÜ…Y¨K­›‚ÁĞĉJ?CqkCÔ¤—pâ.ìÂÎ}jA–U­7 ÎYïúÊ †“ô„ċ7NuÓ&ŭt˜ö'î|–/ì™( è4 xş×âëÜÙá?½ĝ+ÇŻ§îĦïà+ä´$cي œ×J£ÒlşĦáĦĵN3Ĵòéq ×ÚÑÙĜIÈ ê-jr ëïÁ^şŞ˜˙D.ĈĞaŒÒ:Šáƒ$E”Ğî£'ÔߊŞÔÚLÙ*ċŽ1ñ$H”ıL"ÏÜf&(³¸{ÖÏóY{8[ûtëŝƒÎŭl}Aj"°ı–jšġ†ôÌŬj49&áñóóKƒj=bu„ZwĊâëĉ`bSWê4ŜSv‹¤áÍSwıÔëëĠ0hÁLÁ6ìIĴŽ2 +§VÀ‚›“òΝ4Ŭw‘ŒŸWowy˜ĠÊ#rçz9Áß%·ò2+ŸBĵ²ÛzN/ŜäœE™Œxxi˙= oŬ6§Ğ{‡}ğKíÏĜĊĴÚE§íêìdħŸz½%vŞ·-ÀîÑA2~–úÉġ‡· ·Ĥ²K:ż° |šGtdb-“½ŭ$it[F#ċŽRÒû)½)¤wöĥwĥÏ |ĥ™rמ·ÇÙ@öĴ”0X¨9&ü_˜Âჷe³6%ċ½˜Y‚żZ‘ŭWÛ:̽ÎέdŒ:Fâ×b:œWğ|²½Í[eÄáÏğ9Úk&࠲φ„èWÚ'gşhğÓşàċż˙XmÚ×-9À†ĵG•ŬùÍ.%4ĦĤP]Ş| Gó'ż%½,ä /Ŝ#ùğ1£ÚfĊ”¨|f²aŽžÈšNÇ\f(=̜ç:FN´¤ħnƒı™uó@ °Âx½ekg Àû…Âëc3B9ß̐“€´‚$ }¤ûµiœX~-‰µ4/^şßsógż‹dbĤŞ u!Għ•gpʵŠÜš”¤/—×PéÚ0­›µa-Àƒ·Ĉffeï,ÖÓ\èàħkğŭL€g¸YA‚i…&?xèĴ:}f˜v^ıĥ vĴŒi[ĵ́t*jwQWhÇtÖT”ĵˆ{–_KcTqzŝ×£ş˙üé ÇñÙBĦIچfÑ?§ħ Y‘C댃Bۊ‰ž7Ö°vvVíĥh½šaí Ĥ!?¸°ö›4 éä40Ğ̇0d tPEĠ˜{ÂêƒA°…Ħ6Ĝ ŒN‚âŻĜ§`˘$›d£,FüÛP;ă…ez.›ëĥĞ˙ùód\f~•€Ö2¤Ós²~–1œ†Ü¨ËƒĊ{ïġ*'ô @Ŭ2Z6h"Ĥ >;Fh|Ú7u?œœĊQj]—Šž$)TĤÑë0µ‹àĦ´ïÚ"dŒ šŜ/~>kŻ‡ÏşÀŸöXn-RêžħtF˙HEĜ0µĉ§…<”• ċM›%\RùœĴ§ÇĠĤĊ’ÇÜOlÊٗùҌ×àÌ]“F§o\ĞÑA_6áŭ†pÇ Ħ‡ò Cq)rҁüğk§‡x.Û½ßêj`‡dD”Ò·•HFĤpm! Kâñ}ĞosFör3ׁç•OçĝL4²dšV‡ hŝJŜĜ;żÏ]iş-žçvn^ĝĝ^i ×w‘ÀşxĊ‹ŻFûa° /QŬeTëòĈŝATä@ K²²3í DzŞœö–ó˙§)6ˆYÓ.&QĴnDÁüz6šĤĥb¤)͕ڎŻğL\:++_ĵò[†ö÷ÌÈ^ˆ6›QPZ7白cUY>W˜ Î(f_–J:Lsç2Ìl{:bŠB‰´ÓZĴÄÜBÏ0Ħ$PŬDEP2ĉc 's‰5üÉöÄżYY­ …˘ÈŻ1,kiÈ!ҙġ9>ğ}ÒaÖ=6¸·IŽ\h=0“àÚâò`%Ëñ\Y6ċ4.t†Šòçò‚ /_ġÂÓR~Ô¸ mÖ,íû›ż"ԏ 'Ĵ ޣǠÒb¨”d;Ħû'p}ç×ôÀ½KÏb´­{óżÜxs šÁèÔZ*ÍĴƒġĴ W[)½/•sIƒm'sKCwÓ ê -Ĥ_~{{'–‚Ï?ûĴiúi8}‚‡€ÖŸXƒ eÇVĠÓĞk½]€FŬ?$Z†ĵnIħKô¸3cž„FÍ Ĉ´`’tztDŸ’ÇÓW¨iìµ<a™ÀhúÚΚ…ĉR|a%Á•…Ò^ġÚËàêe˜ĠL{á|¸:UĝlÏÙÉßÊp2û)rY¨›]“ƒÂ½§k§£œ'é‘+ŬĈryr×½jÁ&—Œ5ĈéVšPNτ• °ZGżVÑÛÙşè·ôû†;gÇT‰ĦzÌcŭ£Ğ’â§6â+IÒI‡öBI6#h„ŸÎ‹ġğ-VNú°W‚ĥ‹sQf9O=¤ĉ8 Èܧ¨˜!΢DV~ÚçjDċòĈ8ÙâêlzÏe—ŭπpÒ×Ûôíö—|>9ŜöáĉSwLWú‡:M‹¤‰ xyOÇòğoĈ˘zµĠfú ĦÂġrœ]˘Ü\"F8—úWB|…2rG•_ Ürš ü6CËK­ً$µFÚ*”k"'֞³˘É‡s@Ħuhŭ?ž£n^kFž}Ĥ›dâ>rFÖİQlÂ0é¤AŻWkIµ.ġġ-T o:|[éùßŝġ2}ċ*ĤĠ¨M“ñM!˙ĝ•—È‚9žËĦÉÚc™ŽcŸCP_ Ú)!›ĝ|ÎȈh*%%„/1$ùġĜfö àËĉÓ:ßsy”rôM(_™{w`ëDöR{i1&BçŻîïĈp—ÑEާ·ÍĞqt­F†Y>Úĉ^":ôìÄúğƒSŸJ0ì+ìı _HŻJypEjEp_;ôêI0!Är ;ôBÁö!ö˜¨"NR/# swĞ|àô°zS´*eĴLcVġ0W˜=HhŒk0ĉ ‡,N9aC×ôĝ|ß8ÉÀtÀÜ Şú­À÷G^+l@—d<Ĉ~ĝj †™û…‡fÏdâÊ2/žr{™Iùşg•äÑ Ĉžoù1—-!ìrNFG†2µô3?<Ҍ2›öô)gQI))”·%~§Ñ·Ŝ…—l èÇK3¨ı`ĵ^žÉİ’ †Ñ°ĠĊ/L£ŒBʅrl-ĥ-­P…L˜…“X½ŝBʂVĵ* YüÊ£‚Ŝŭ˙Şí–{³ 9|ûÍwħŸ@S!)e.ˆñzdċDċéx Á7ŬVı°””›p0Ï&äk`7ŝñi Ŝëò:zîŞ {PŻd"¤zÂf”EĉK½ßCÈùnƒĤb+üMàßÈ"h}ħÏĉ9„‰QûÁ;~'<Ú£Í-€€g`‹9„÷ċÀäGì*B C9ĊËÀ|ıXÏÍg=nNâÁĝëŜÔ¨\×Ġ43&k'µ7óú’BŬ£ħzǘ5ftOwŞc×Ĵ ZݳŞu*·úÂ"—ÙdI´lrëfÁc:”·€òsġÇEı—k–§îÛÄĞdáv6W~ċßT.ŸažĞRYè^… /·‹šĴù0ô{óĜŸr÷­"Ŭd{˘P´cj?ĠVXÚn'Ŭ6Ҍݍ}ž‘è­KSàŞŜjqht-“`ƒÍ•;ÁŠZlœ -°XİòBI=PÉ÷ŒÌ<%|àòbù`lmY,”~ĝŻê9gŒÔOÎ!ZèÊ'œ lŽöÎĊ§ˆ{ z ¨O|AH“´ZĞ´M5€âö;AX(ìĒӄA~mCŜ—ŬqËĝ ¤), Á˘z—Ï ’+;Ğ5ĝ eZá…óĴY€âŝ]Ê^޲·ż?­iËċtpĞ"3Ë#ϵɗxDĜ\AWëœ/ĝcA"@ӌ‹s9,ÎQSëżI­Ŝñ9dê~ŝ “$ü˜p1á¸À?Y 5q?–ìU0™•u–ZòĦy/á|‹Í&Ċw‘.¸EüZ~ĥíUq81˜tş>X~XĴ …g—ešqáX‹òó~ óµ´ƒP·ğiƒĦ7tË-d%1ÔïZ˘âĵĊċÜÏgâÙÌzNì-qÄżĥÀ,al*6Ci˘PÀ“Ş7ñAfêÓ˘ĉŻßÀUzçA)ÏóÌçálâ“WŻP(ıúrŜŞJéIä‚VĴÖùY]¸7Şaq=­Sĵέ~R7@#€l‚°uyúû†Ĵ3!À2êp˘9Ú sŒwHÑċ#Ħğ-$§ŝÊ£Ġ*Œ<r_JŞ=CöèŽëĉ·§ÖĈ-|ßïÎ/jz;}]IĥÊoWĤ—‘§ßžÁÏj€cTËĜÙp6Öé7T_gs.şġ¸v×NZ­è#IĝÀ[^`İAï°AĞi³™˜Da?隘[rYxÖĜGĠ¨rċ; ßUÖ^*›X]˘5·MÔŬÜ4v}{éuó÷PÀ¸QÈl&ámİÈXçħċéĝJ-{ĵħ#rĦĝ]‹iÉ5ÛNޞ1kÁ¤vH–³’€ Oôä$uĠȰL,V`X@“z;QZŬݜĦĦ%¨ùˆ·Ħ&ñÏÈÚ8rgV3A%›è ;ÉĠSÙTMàêP ÷ħU)™CÑ #$ĊĈ35ĝrVN·²µ#A,ñ›\ĈÛ>ĜaTfi)Ç` Ğ· = 5–e–Ü›‰‡˜#´Î%iz|XMŻûEĥÙùDmT¨?ÚáĴ‘fΠËŜĞLïY—°îf"#é{ÛĊÜY™˙Š˜IÉê*Ġž Ċï?Ż-wi Èğñ,Ï.]ÑÀü@!×Ŝ#4^Wúb¸^ƒCjmĤÓ`†éL;9F ÷QŜ›eĤ‚EهÊ)ĉĉñëĠÍgğ#k”-¤·²°ä ċĴÁu+;ĉĴħ;ËrA­VİĈ*Ÿċĝ&¤L#[;gU´c‚XµQ34żÊ'Œ*ï¤]+7çÚzĦcPÁÔkrXC@KĤTL’f=>~‘ìu°V” ùtĵ,”£Ë2Ž UJĊFù™£=ĦÖŻR6²46x܊Ha·4toĊ+_ †`Ĵ 2X„6áYY)´UÄZƒ&™ıiÂĠ}nJ7)û LÚĈÑ?èÏî sµÏŜ ¨uA\a.WX/e+ÒDGMĞAgó<ĝ’Lñ`"ħ˜ÓìÀ^Üı²Ôŭ•óƒòUş–këċĠ/aHĉÛj’GÈġg°$´Fġ%Á {…k›ûQpUO´A珸p½iQÙI’:…YċĠub­‡a/‹Ċĝġ£xj;â ħZ¤:ڏ1rq§Z}–QóħgñŒ˜­ej;i[l[œt{û´ĞĞŝcˆs|JàŸLğHÏá‘nÒéH‚„hĵ„Rj›Ôù:2à–ìĥÚp³*ĜeìK}ÄÀx âşâÁjEÌï0İ´?WĜöĥJèĠ&d˙_x–6qÓÉNĊH†ŝ ²ĝúìèċÌAÀÙñ~$NϘSĉ¸ÑĴ 7bL\(45Ÿ‡÷&!lcıŸ€6âNùŬŝNnħt˜Z9ˆ²k½ĤG91ìŻ``üĠòšċp•ZIdW `ëĦTJ;Ù˙Ä>‡Sġ Ÿ´ĵ^5ĞIú•/ì]·ÈÔÇŭE2Š·sé÷żûĠœĝ+Z|žmȃ{8f şÂ$fša ×tÜhëUÙe; Be@C7-·çòóe„Y,UnĈ¨w/Ġ› ~•çZŞĉ4Ċ8hñ´Š½Úğ­Kü{&:A^ÜŬŭp^Ú½ŝô·î­Ï‰â8xĴU^>pÔà8!ñÄ0l°*Í&vam t‘Özµ—ÀZ ” Š´ĊµĜĥ fʘoÎ'"ÔĈÈZ‹%3½“?zx9úĜ1ax5wż'¤8ĝ_—=m›Ž§tğ!ñù+|%û§Eî³g⁆ÜL’ 23ŠX¸ûҒŸ]ÂğcĜĝjİË;Ŝï„ê긊Íç#0Ίµ4™ ïÀ4neŬòfàÍĉ K/µqhúÔï³½ż`òSìmUÌö&½à¤°Ì,·ħ]OħĞÔö{É9„{Ö8ûîÁ~{û÷jÇġFµXĊ—֍ š§¸)ÁÏ;ÌZ{{ÉĴp/Ŭ÷Ä=1ŸKüŬú)šóÇi˜ÜşœŞĠÊÙzı£<{ <.O`ltZ‚˘ry}Ÿ£oĜ‚é0Ó ÖáGĊ[Zë•×W~NJ丽e„%”ŠċBqÑç3t~³ĥòÔĞ~* î ZÜA—ŝâv|-\ĵF½#ÌS.÷ŝpıÌ"ìIŽkġçsTê…,ò4.ŭX÷4Ĥ²a܀ğԝó†3--_C°q""•*HĠ²ñò½LöÈÜñíĊıó=!ħǚAû‚ôt3äJ’Ž|ày‹:Ŝ çûĠ‚p'î`)ı# 6¤pƒœĉÄkûa{™ƒI^ü]­\[”:56ÀÜÔt\Ċ0jǰċÛıb‰C@Ĉ†´p%†çµªoî· @aŭİVêéL6cĈYfĥ‡VË‹zù³îÒ·…3›§˜)Ş~mŠ‹=¨ĠċĜâE²JBċÑNj˙Rï靣ê‘ĠÑO´Olš[–Ò £‚Ÿä ï×J0L9û’ÛêR-W â>Ǘżs™nħñŬzl½uÏ8h·r§Íż„OâY~f9˙½Ç‘³3îğ*P ‰"w“N ĝóDlOaÑHˆWNŞ˘²§°Gt›í €9ġßżcpQ^—Ŝ†áïGĝ„TĞĝʝXžĞT30Tß½§’ކ…üÍwE8 Žâ^³FËD…›Ş€·9ı;—KÔË{ÇçŠ2^ d˜=ĝd|YOK;BEújù[Š_ċ˜…NÔ5Rwux°׊÷‡•=—Şo lšb–56{ŜÙ/ÊÀâÒÉwdE²O1'Ġ¸û8î˘8|F3ŝ†'²K@Á1uŽiùö½¨5F^™Ŭ{ĥòY„šttï´R?-ÖJ|l´m:ÜŬ=DŒÊé>ŒZT>×ò"0y|B5Ê£ùR%•RƒŻë˙{ñÜqċŜĠ8ğï/ĉé_XĠzòUŜ+܅ ÷ûO‡a2LNŬŸÌ#rWŝ ôy\]˜-ˆu1/7ĠZâ`ÓµGĠ†V=aĠw/8Q;KAjß˙ż·`¸ZüœŬ£D~'ğÇg„$to/‡˙œójˆü$˜$‡3MQĉéÍŜĵ|:\>Çp_ċ ”óVx'WcÒldEü.aĜ·9·ÌĦŠ`“Jˆˆ3^  Â@¨ Çt³‰p{aĥx%*“hÁPóŽ‹y³„J |ıR’aÍ;eóıó„d;ŜJ›Ġ~Ż×â…w3Áż˙Ĵ-µÍ%žŬJĊ ê@ÒŜs,IDAT~e³x,=-t4ñó`FŜ¨” ‚ÀŜk{pt§:1U¤Ó‡O%_EHZ¨G•es•hN,ÄŞ°+ŝwÙżÔÎòûwŝTĊìáiZš |ĝÜ;&Ê=ıêĴm<‡2ŝ4ËĴ*/ĤŞËĴ<_Pi²48˜èĤÜNn+ÍfÔ+:ä-ĴĴĤöŭÚjĦÀ#hkDŸ'ìĤrâ 4[Yéñ½ÊY]ĵ[̗ç"h ÷vƒÜLŻÍxĥqż_I‚âsĵÛWerŠ9y-V,|ŝòÁó°•Q¨ ”%„ÄÎÚ'Tkh"¨BI(˘Šöö âÛIĝ³ba/ÀaħœƒvŽ/ÂX6ĊË#玪(ÖówY.€[ún€_+ÌÁ9>{ĴIċVk²jmÀĜ¤ò<~˜Ż²’œÔbB-ğ½ ó§mcrZ`VLßú%nSJ,‚ĝxšç+Ġbċtù€\Ŝ‚-óÂiıòÜ zË̇;´S1˜ĥğ"‡ó‰lĦĝühLŞù&úRȧ ż“Ç"Ú„^ŻdŝĈ‡áôÒ8Ž‘£Ŭ˙Òi.´kóŻĦÙÓ óԓbfƒ^ŝ/݁ßH˙ĝÂÑÍìßèUC3˘Öô](§ĝ=Çò ûë{01A%e´Ĵ¸Ż8ħ<.ıt€ĉx%6]ËÌ[‡6µÛ–îÀ0G”"4>B9Ĥ`’m‚­ <_ZÙçrbiŸù3úr8xï셲BĊÚµ‘Ìp?•uˆÜ^N|Ñ÷d7×SµJ™ÏÖʵÊé ıíNëš<ÊwÊ –I${B›ĉ›~,ğuĜĞWµÌëµòžÈí%šL$bñ¨Ñçş>%½PÖŸ|8ŞqŜôgĥÄzħö{ĊF•£ĉ’„(*^ÌùûÔÖY:!nAïĈeĊ˘[3!o5Œa„úÒldĦġöGµÊç÷ŞÔ[).Ï0éĥíÎ[m`µröbj"›’ŝXâùĊ8ıĊŽêԅZş–sR3/”dVàçÉú(\²VÑ*B)‚6…ğ C·K…ĉ-ˆëLáW˙á6j>.C—ò$Jù°É~˙4öwZiœŭĊ'Ëùhß?ĝÙÚò~2ÇWÊ+{Yy=,VêÏĠl³ÉQ9H͍ġÚĜvñF\Ä ÷*ÌoŜəċ×afŝû7Eáĥ‡J<Ù/}‹Í\£b¤żTÖFî _NüfÛżıż’ZÑ’ôç¸C¤’(sM# ’ŻÜż˘63е Òĥë‹,÷°/"ˆĠ½µı‡î‰ĠÏŝî4\ℽ˜@[Ĝ|‰í”4›òSÇùÑÂwYxX)Ü —׉L A7W%ħ|Tżá×á "Ż/ Â^dko³İ²Î÷äA‘–· Ŝm…)Áj3\Œċ^“ÒÌ·™½Û›àAsq:Âsµ°xö?óÑ(mV“ħhjĞ H0ŠK"ÏżXVx÷ŞtC§ż9-ÏeîŬ2eĥ~µìÁsÍF¸ŭëˆwKÈŬ|c'‘zÔGúŜˆŬšK|ܒ¨­>ş^¨ĉR+IÓİ˙)YÏN bEÊ'…3q„ ½Qŝ §Ä×kY¨[ÙÚ䅃­ü›İÒv!Şĵt?Ċoî,£5Ż×DħûĝìáYÖßû_ò˵ZäѽÄiĝŜŸÎÖê’\aêg/>q´v~"ßĦĤ˘šF¸)⟑yaıkú~v¤Ĉ{½ŒMtë­X˜9íYï1 Q¤Ċŭb)Áñ| £˜}$\.Kıƒe.U!Šİò4ŻrŭT„½öö×ñ‰ŠšER£šÊ–û"g;—>Ëq)˘ˆQĴ_Ì Nɤzbi*úú>¨/³ë_Î÷"*äĦë<şÜK•3âĈbH8Ħ£×Óǧ)y.•ßGñ‰-}|”ȇ?âÊ:ï_äژŠÜĥZEXhÍê ˆGñĊ²"s&Ġ7Îî“ŜĜò~QÌ£w˜_ß}ğV.²ŭJıP”ğ%ăw7bNO>’·ŽOyħ´ZċY@>ÍüᓎEîxwµ™áœ/w”âȕ5ò0À¨ UĦpÜ<LeËû÷^Ì zUʞ•ĜÂĤ IÉTÌ˘5{ =DĤX.ąš$”÷|l%+ìe“YÑ-Ż2—‹µ{eyhĉŭ]—ŝû .4}Oĝ géၭ§rħ&?B§se° úĦlöÉ ™ôb}­òˆġ¤‘:Ğ—Ş×O"bV’Ž%1ϒ ¤ê(ê ïÀ›ÙÙH•ñҜĝıöÍ_IŻJR]ĴE—aÊöMž öÙ£§ÏñK:ċŝÖR42)İIġçN[ ñÛĊ8TA€]Ħ?cê²˘@y…SĞP9Y•jÇ é`•ŻÀ+SA„YÒWô>O‡¤Ú£×Ĉj£êJ†›R½s)_”öêeqĞXCTĈR“ˆRŠžF –à“;ıĉg6˙Ġ`ŞÜäEVħ†ˆÛ +ˆœëÏrŬÂ;‹€5‹§îŭ£ jĞoŸ,#d%ƒ?D |ŭÑJZ_î]I ŝ‰ŜÜHe+µâΓêè TÙ\A@!ÂS<Á‚·}SĤ›ĞÌAŬ¨íĴeö3ay…Wtk(Ŝ–ŝnfı'?ĵĉ(VaB]{ E)…Ĝq*‡ WİŸ²ġ³Gîm¸–Rfk(eÈDúĝ–° ĤžA“ĊI³/şŠ§ÙúÙï}ÛJ9Ğ‚ıBÄÎż‡÷Ú üz$âIjĥ$nĠ˙¤˙;²˘’„„ĈNKı{RƒÙ£ŭ£ŞŬ|· „ĦÄó,'µ(³·UNÏ.vûœ`sĞŝĝĝT¨ ih-ıÊIŭk F…ú·%ËF­’ùWÀŝñWćoŜ;Äzcçhħŝ69^s0蒵£ŝœàñYżŠ4™¤ĦòTâuñ)ÑĊ’Èùäf""IħZš(Ž/Ċ½"´?Ìú&-*—¸`Ŭ°³‡ožAë{|J²Ëg÷”…fû¨!Uóa*œœ?`ïÁ‡œMż>÷Çıdö \,!\™ Fj&”ü˙€Ĵ ”š£s=ĝÍÙîû,ñġ‡÷6k žžçĝÜ.Ï1P•6ĞÇĠH½9zRcaSYĈ>;,VJI'[÷ŭFBähùJñIêq¸d≝;Ñ\•~Py\”¤Rñ“·’ĠtnŸ²…œTŻÊd*’ĝÜÜáYk<Â,Gċ—b)Ž8~{?˙HŞ%޲aFĜFPû!]ÖÎJPÇJĞwİ:Ş@JĞhE@ˆŒòv2²Íz|S•j&•§ÁÊ:³í;F, ‚xÂPd&WŻ&jüŜŠ6 ħŜÉ>?žxFVDŻ‚4ëĴqêfÄfP!VŜ}y³P‘NĝĝúNˆ? eEá(Qi¤•zU¨#ÛĤÔj ‚áFîFóžOh†dŭ“ ™Lb?c™[ġÓ0 çwMĈ†pĵ'!r¨íhùġ Ù³vàlŜxx0Rß=AûÊċ‚IçNĦ=+Ä2bs#q!–MÀ@G<â?Ş Çh7°´‚ŽDĤe¨f’P‡·ş!”SÍ_ßĜÏ♜ÈÑÊášX?ŒŻ9 ċ?=5™,.§xŽĴċœÂ×ŝ*Ç‹)ŜAí)ġÓHµRĞípqŝĝDŒ9ÄuVİNïxĦ‚¸càcdÏ~ŒHKĞĞuıWDÎëÉQU%K”ı˘P+ï…Ħóçòñ0_+oUŽ‘Ĵ é/”µ”ƒ×Ĵñ8ĵ˙ Vol–œrEhÒ³6·OşĝĊÛ @uZJ한 2)šô–àùÔj"B•ŽPgQìÛGZ­#¨F>ÇW˵ÒÖa6˙O"'Ĉùr”-£W¨fùÊ_$kODtıCğ9¸Z+xn+ „Lê¸ÄñGİ,ï·™|-݈²RÂĜ¨X/׎ùZ Èá]ċtġT8ŝN´ ?ġAÍĴIG×OwÂë‰ô ĝİXÈŝ²sŭ&`™Lr`ݟĦZâĞxzNLG6zêÔ£˜pvʰ•,šëjmÊġZA¨TŞÀÊUjÇמnĠQÉ\`Çò.[=aŸËJâé]ġÉ–Ô²ġ'ÉyħĴ d0·NeŻ\GŬòFĦœċš@§èıÊ÷ɝ‘aĦǧÙÒVÓK6+šĴŞP—wMüéŞ$ï•×ğ„ÏĴ˙$d/–ġ˙{“ġo²ŝMÖżÉú7Y˙&ë˙kYEħˆ §0¸nœI ëPMŞ~&7żQğ¤"×tŝʲ6‚ÜÜׯ—Š_ŝ¨á?:Ŝ}ûìÑÈí_ÂOûéèÁëxíËeŝ4NyùĝÔİ˙•Ïġ~E|ü“ÓùŻ˙élŝo˙ŝÁÙ8ĵ”÷éG‡?9½ŝÇ_ŜŻU"'Ġ8;ğS‰ŭµeŭŬÁñ˙ŭŒùúggᓿ?>;}%,žn|ùŸï˙q5sֈœÁï8û4]ùkëëÇ?9‹=ŝÙÙܗɲ2MYÏŝŸ÷ŝÈĵŭĴ÷w˙Ú²îÖk§˙Ĝŭ³ĈüüŭqôÇMÜúì\˙°5w֘C²߯‰ú_÷n}ȳ˙Ħ–{ôĈÈá۟oĞŻ""şÇö§Żŭèí;ĊÇÎ/˙>˙|œż×ĥYâİ =Ŝ:˖ë‡ÜĈI(ƒ$úüĉ,è8>\ŭê^uŭ¸šŬ{pÄç˙ue}~fù¤ßù7żġ7Y˙&ëßdŭ˙ħĴ˙H”vC1I!IENDB`‚gamera-3.3.3/gamera/pixmaps/gamera_wizard.bmp0000755000076500000000000004732210714675706020223 0ustar chriswheelBMÒNr(˜`N  #%$-/.8:9BEC_b`z}{„‡…’§Ş¨ÈÌÉĉ˙˙˙gˆğŬı˜gvıЏjvzgĴÊÇyğÍÚzĴ½ŬʖR|ħŒ‡x˜œSĞÊx‡5v‹‡šŞİĴğğĵÌËĞş›ÌŬíŜîíŬÎîîîîîîî$fgĵÍÚxWvxıxd{§‹Ĥ›kÌÜÌğÜĴÌëCfZ`wğŠĈvÇv3Ğ6ĞşˆgğˆĞÊŞğşğşĞş›ËğÍÌŬÍîíÜÍîîîîîîî##{ĞĵÌF#h݆cgxug{f‹ğˈzİgĵ˘v2W4‡ĞÇĥw¸wĤyf‡kËyxĞşĞğİœıĞğĵğÌÍÌÍÍŬÜĵŜîîîîîîîAuW{Ú'wy—ŞtguAG‡vhyxxhwwGĥŠezğ£ğ·wÇfŞğu¸EìIxĞğğğĞŞğğÌÌÌÌŜîîŜíŜÌŜîîîîîîîAiŠ0;ÄĴş§zy¸dEftWdeJ‡wfxffÇ 7ÄŞplËğĞĥş%ë8šŞĞşğĞŞŞĞğğĵğÍîîíÜŜÜŜîîîîîîîvˆ‰0&XƒHz‹ÌıxİŞ†eWvcgywvfVetĤÄİp[·k½Ġ‹C7ì7şˆŠşğğĴğğğğğĵÌŬÜÌÌŬŜîîîîîîîs'‡4gg‹ĵۘw›Èe'u04EVWdDsg‡|²ş1k’̓xw–LœÛfıŞšİğÌğğĵÌÌËğÌÍíÜŬíŜŜîîîîîîîiş·R‚Gxw‹şĵܗgğ†xs5S#T6fbEs5ĵĵlİv‹@ÇiĞÊz›Šg…zğ¨ŞğËşĵÌËğÌÌÍÍîîîîîîîîîîîîîg‹şx£gxwy¸zÍÛtxŠĤgwgcAvh‡vVBe5f7ˆÌŬvj–̸ğ¸W™yË{ğŞŞğğığÌÛËÍŬíŜŬîîîîîîîîîîîî14j½ĥux‡ˆİwxĵşŞˆğwˆW…Fswuwuv&‹ğş´G޽Ë9ËAŒr;š½ë›ŞĞĵÌŬÜğÌğğÌŬÜŬÌŬíîŬŜîîîîîîî%@9v‡g§f‰te{zğğĞ‚gq'r2$3v2yhރfŞGwğd‹ğ1zj%ŠÛzğğĞĵÜÍŬÌĵĞÌÌËÌğşĵÛËÎîîîîîîî xgs6x@FjzÌŬĞeBF–'†4Et4݆3ky#{f¸ş7ğf§zĜkĵğĵĵÌÍÍÌÜÌÌŬÜŬŞĵŬÜŜîîîîîîîî"Ewv4†$ˆv{½Ĉafc6g2tUv2 ™‡‹zĈĞ|şş(Ĉ+ËËĵÍÊĞĵĵËÍÜËĵŬÌŜîîîîîîîîîîîxx§İEB‡b½j¤'—cHc27Ĉƒgğq|…#ĴuWxjşĵğÌËÍÌŬÜÌÍÜÍíŬíŜîîîîîîîîîî A@G˜¨‹cfˆ ğ2{ÙWĴ·3%1'̖”d6Ğ0\`ff˜½˜ËĵÌÌÌÌŬíŬŬŬÜŜíÍíŬÜğŜîîîîîîî`$B7ˆ‰qgwZĜ‹Ŭ§wĞr07‡uyrg› [Jƒ‹™ˆÍyÜĵÌÍŬŬŜíŜîíÜŬŬÍŬÌÌÌîîîîîîîîBa‡ˆ†Wx3hĈXş‹Ú˜gşP`VwŠş#y—{·ˆh–V8ÜhÌÌÍŬÌÜÍíŜîîíÜÍÜÌÌÍËîîîîîîîîc0CD Fwš¨™g‰ĥšv4Í܇›µ …wC'Ä(ĵicGt·UÛ)ÌËğÌÌÌşĵĵÜîíŬŜíŬŬŬŬîîîîîîîî1e1 gˆ¨š¨|ƒwBzÎÚw‹r8C¨v%wĵФ7Ä'1dy:ÌÜÌÜÌÍÌîŬÌÌÍŬíŜŬîŬÜîîîîîîîîR8¨‰‰˜Œ4‡wı|܇y¸Upğ”{·|Ä&ĈS–zzĵÜÌÌÌÌÜŬÜÍÍŬÌËÍŬŬÌÌŜîîîîîîî!FɛğĞˇ1w·9ŞËeŠ`1rŒ·ËİĞa\–‡w†z›ŜŞĵÌÌÌÌÌÌÌËĵÍÌÌÍŜîŜÜÌŜîîîîîîî1#R$uGˆvv§vx”w̸vuS{Ĥ3‰wË!—lğ…†XÎŞÌÌĵËÌÌÌŬÜÌÌÌËĵÍíŬË̽îîîîîîî5Efc0ŠğwHÊܖwawgˆ§'È7wЧĞgVΊÌğĵËĵÌËÎÜÌŬŬÌÍÍŬ̸Š|îîîîîîîgW@AA5‹İ¤ H§}ÚĞĥ1Œ˜sz“—e{·G™c"hÌjÜÌÌÌĵÌÌÍۇğŜîîíÍŬÜ̽îîîîîîîte‘E {˘zh­ÈdS7 ĥwW‡r+£G§Œì{ÌĵËÌÌÌÌÍÇ{ÜÜÌÌËĵÍÜËĵîîîîîîîA pGv!'·g6ËwwRtZ“A{tf{‡&xŞğ{ÌÌğĵÌÍŬĵÌŬÜÌÌÌÌÍîíŬÜîîîîîîî3c1 $ G†dr`E"7İu³Ŭv Vcwwƒweˆ·YzğÍĵÜÌŜÜÌÌĵĵÌÌÌÌÌÌÜÌìğިŜîîîîîîg0df0zĤb0&#¤5c‹Ê{uğŞşrC1RxÈ{Pwt†ĤȊŞÛĴÌÉÍÜÌÜğĞÍŬğĵÌĵÜÍŬŬÜÛÎîîîîîîgfv z·!0&!r"&½Û'Ĉ‰Ì§F "ˆ‚L€ws3ˆ×RgÛ½ÌÊğÌËÍÌÌŬŬÌÌŬÍŬíŜîíÛîîîîîîrGyt6fs 41% $KĈ·‡ŒŞSB0xvšUVq"\Äğë­ŬÍÌÌËĵÌÍÜÌÌÌÌÌÌÌÜŬÌÍŜîîîîîî`ww4† !@!EWW1Wšq+¸†v0G‰UFŠ…xI’Œè½ÍÍÌÜÌĵÌĵÌËğÌÌÌÍÌÌÌğÌŜîîîîîî 7fA1HƒVPuu!B$E$vŠĥʙˆ@Q8ewgŞŠW¤lĈÌÍÍÌÌÌÌÌÌğğÌĵÌŬÍŬŬŜÜÌĵîîîîîîEgCgwD" ERRFbĞ–›ş§pC3$b½¤¸x½hÜÌÌÌÌÌËÌĵğğÌÌíîŬËÍŬÜÌğîîîîîîXv1ZuVVhˆB#S3V7Ğ…ŠË—d"03fWۊg¨ŠÈ<ÜÌÌÌÜÌÌËğ˽ŬÌÛÎŬÛÎËğŬšîîîîîî™t GC""E@6{ĵ³BT"3Gw‹ĤwĴ¨WD10'AÌÈɛ§f–nÜ˽îìܽÈÌğğÌŬŬŜÌŬîŬŬŬÌîîîîîîj¨§†grAiğ`00#Uuk¨E3ĴÚgrBdB1{v–§ÜÚÍÌËÌŬÜÌÍÊÌÌÛÌŬŬŬÌÍŬŬÜÌŞîîîîîˆdRw¤GvC!Vu%RFxŞwahÊwtgrbsXvÊAî¸ÜÌËËÌĵĵÌğÌÌÜÌğÌÍÜÌÍÌËŜÇÎîîîîîˆvG6–(x0gf"Bue34d™Š`œ–‡W3F1bGvv¨yì|ÜÌÌËğĵĵËşğğĵĵË̽ŬîîîíŬ·îîîîîv6w#†Tz™£%fW30Gi% "5cgšp{·z(@GfY€#\ÈËÌĵÌËÌÉHÌËĵÜîíÛĵÌÌÌÌîîíîîîîîîw…g4dxxw”gfuD G›R3E@A$V6‡`i¸{03V3'ˆSD—{yíËÌÌÌÌÌÊĞÌËĵÌŬÌÌÌÌÌŬÌËËıÎîîîîî‡vH‡†Srygq4Ev$!UE0'tTu0FşˆpFRtŠwCEËğÍÌÌÍÌÌͨ›ÜÌÌÌÌÌğÌŬÌŬîÌËÌşÎîîîîî—v‰‡30:r˜ge !d"guCW@1mȃg¸–4f"dhÎÜÌÌÌğĵŬ˜ÜŬÍìÜÌÌŬÜÎìÍîÛĵîîîîîîvE Hr¨wg@DD0df!7qCM׆fvv1š¨ĴŬğÌÌËĵĵğĵğÌŬÍÜÍÍÌÍÛ½Û½îÜÌÌŜîîîîîpGreg‰q¨hs51FfgSAf Dƒckt—#E0;ÌËÌÍÌÍŬŬÛĵğËĵ̽ÌÌÜÍÜĵíĵğĵÍËğ¨ÎîîîîîA2TgsG¨ğƒıf`4g‡vfd%Wt3Dua8A1#2ËÌÌÌÌÍÜ̈ÍŬÍÜÜÍÌîìŬÜÌŬÍÍÜÌÌŬîîîîîîî4awbVˆĵ•¸fPhxwd7gv3A3ˆv„G¸ˆ !!ŒÌÌÌÌÌÜÍş½ÌÌÌÌÌÌŬÜÌÌğÍÌÍŬÜÌÌîîîîîîîuFB‹hğfĥV $whwU0!Wwv4ŠwfıÌı!@"clÌÌÍÌÌÌÌÛÍÌÌŬÜÌÌÌÜğÍÌÌÌÍîîíÍîîîîîîîdGwgS‰'ş8µe6wxQ‡agdf1(·GhĴ·dcA!GÜÍÌÌÌğÌÌÌÌÌŜŬŬîŜÜÌÌÌŬîîîÌÎîîîîîîîîEw"7‡v8ğ:ĤwCFyĤx‡‡gAP$„Ĥh{ڇ#F1!SğÌÌÌÌÛÌÌÌŬÌŬÌÌÌÌŬŬÜÌŬîîîÜÎîîîîîîîî‡sg‰ˆˆğ(vwVvx„5x¨e$CC10F–x(ܧaV feĴÌŬÌÌٛĵÍŬÜËğŞş¨ŒÌŬŬËÎîîîîîîîîîîîîıQwxyˆşttuv0y‰ŞCG6F@WwwŒÇ’2!e6ĵÌŬÌÍËğğÍŬŬÌÌĵğÊĵÌÌÌÌŜîîîíÜŜîîîîîîuFg‡{™˜Ë;gwXc0wVgA!v!$@&ht|ǃ4fQ!{ŬŬÌÌÌÌÌŬŬîÍÌÌĵÛÍÌËŬŬîîÜĵʇîîîîîîVŠw—ˆ‰ÙjiwŞ!&D!D"s5cˆqkĜrvg%½ÌŬÌÌğğÌÌÍÍŬíÜÜÍÍŬŬŬŬîíÍìÜŜîîîîîîgy{ȈxÇxxsfGw!35U!!v—t‹ëv#&vJ0&gĴËÍŬÌÌŬŬŬŬŜìÍŬÌŜÜÌÌŬŬÛÌŜîîîîîîîgxg‹vwŠ´šwrwc"DB gAxwWIëyv…#SlííÜŜîÜÌÌÌÌÌÌÍÌÌÌÌËğĵŜîîîîîîîxfˆ‡ww{²‰wP0w 6f1V‡c&PzgvœwP!w@@ĴÜŬŬŬŬÌÌÍËğĵÌÍîîîíîìÍîîîîîîî‰pwx‰j³Şhs3uWˆpfVSqjw†|˜€„FQ6vdŬŬÌÌÌÍÜÌÌÌŬÜÌËÍÌîîîîîîîîGdgy‹³¸gwcV1gxPBWw`tHwr|¸˘˘bVGf&ueTlŬŬÜÍÍŬííÌÍŬÌÌğĵËğğŜîîîîîîˆİw$wH–ȇsGu%wxa!Wy„!Q3‡Qz‹É”"`£fgr6i x½íŜÌíŬíÌŬŬÜÌÌÌğğŞÎîîîîîîx‡ˆAJŠĴ˜Ç‡1WwSFxwvQvw`#3a§›ĴɅXWVĤWsVD †y½îÜÌÍÜÌÜÜşĵÍËĵŜîîîîîîîˆ—z›ĵˆ¤f%‰u6x›ˆ…FvffT501ĥ'vĴˆw#wd%RTaB'ww{ÜÌÜÌËÌŬÜĵŬÍíîîÜŜîîîîîîx˜x‰şš½wtugˆwww‡‰pDg¨fD`gtd3g%¨{`{̇#4gg%@G‚PFWw44x½íŬŬíÜğÍíŜîîÛŞÎîîîîîîz˜˜‡˜…œF¨‡yˆ‡‰xwxƒGvvgW‰qfb!H‡%§{1{̆h2x% *A7gRt7v'{ŬÜÌíÌÍÜÌÌÍŬÜÜÍîîîîîw‚W‡ş'§wz™›İ‡Ew‡wbVGwŠBQ3F5·‡ÍëRws6!' v1Ĥgx3WŒŬŬÜĵŬËğş™Š˜tlîîîîîîuЇuyšı)wwˆœˆw—xŞİQdHšŞs(ahs'Üt‡"*…rvQVBc5gd!4gœÜŬŜŬÌŬŬŬŬŬŬŜîîîîîîvŠ‡Šşİ·§fbJwh™˜Dahšıe2UxP„œµkĜ‚#bp#TfggaWxxĴŜíŬŬÜÌÍÜÌËÍîîîîîîJ·F‹¸ŞÇ:¨fvWEx‡‡G—…ex‰…2$y§0ğÙGÌÈ10ga0ĦW6fw‡QG†W‡ĞÍŜîìÌÌËÌˌîîîîîîŠp$hˆŞÇ{Şşi†w˜‡†xˆ™‡wyw0 Gx† !Œs›ĤıaDb3AgS1wrGЇQ5|ÍííŬÌËĵğ‹îîîîîî†BGFzĊ{š™lÖg‰„1"X‹¸wz…h§ G‚(£̄V„c0†4  Ċ6626f{ŬŜíŬŬŬŬÍîîîîîî17xtdZħğŠš™·Gw‡5eFh‡wŠƒwQ&wGc@{a;ĵ”1c@(ƒskqlĜ't#ZŬŬîÜÌÌÌîîîîîîsœ—‡e{³ğ‰˜¸gŞtvgw‡VfvAXbFbW4q|ˆkĵ³`gg6ŠŠİÌ·fŠtUww@ŠÍÜÌşğğ­îîîîîvfgİgœ”ËŞİğşğqSGxƒ'ws1Csv$Wrƒj˘41GfepIĈ;ĈH½·Šsw5{€g{ÌŜÛËĵîîîîîF!YнÛbğŞ—‰§Ğ–Wˆˆ@Whff„"x$s2hfƒrĵž³!TFx¨2az uKĥ‹@Ç5%xpVĞĞğğÌ­îîîîîu&ˆ­Ü„"|¸™ĤhŠšİˆBWwd"wŠrgv"Dx†bŒĦĴ½² bVgR#aşyh–{›Ĉ6zbgİs3IĵÌğğÌîîîîî‡WˆÍ”QŒşˆYx§Šˆvw‡bAG·'¸H§u"†ĵÇĵ—@'sQj0BÈ6Ĵ­¸ÉV‡4šCCF‰gЇwyËÌğÌÜîîîîÍÉ9Ĥ{ğ¨·6yvvHİؘu†hsŒ·6‡rdĤÈw‰`FwfRgfe·g‰Ĥ&iĊĵst{a6w›ĵ̧ÊËğËÍîîîîîÌÌğcG½Ì‚[Ğızw‡wˆ—gwvx¸8ğƒˆsC•U8vŞŜ‘USSsfĊ¸f!!Ş2xGĞ›µVyÎŬ¸ÛÜğĵ¨Ŝîîîîğ…FXËğ½×'ğˆ™G¨ŠtxpGg˜‹s›vAWwxÉB'|ŞÍtd707pW˘L‡!‹³™Ç#B6GŜğİşË›Ğ§Ŝîîîî${Ü˚Ğ̂Xšˆ§3{uz…‹Ş¸—§ &B'Ê5g(܋ĵgĦ$gUjƒ|E†!"Ç7¸0€7îg‹ÌÌğĞÈÎîîîîyĵËËŞĞËĵÛEğw‡vhfŠfdFşzˆ5'ˆ…&tjÈKËyğ$btG3hD¸‡P2[vs]s4s%̓[ÍÛşĴÛÎîîîîŬ˙Şİšğğĵ´$k†wwvŞgsËFŞdlĈgYĥGŠĈlı{Ù7qQ'RU‰µp—† ‚H`gĞ‚WvŒÍÜËÎìŜîîîî™ıŠĞı˜›ËŞÌ†XyĞİuUx¨ŠÇ:˜&7s#6f‰ˆ’{ŞœÖg0Jx•€Pg‰S‡R{˘1ĥHDwşÌŬËĵş†îîîîxˆjÌŞğĞÌËĵ܈RZğ˜`ZĞĵƒˆ‡6g˜d%s˜‰„ĵŞĴĥTeS g1g0‘!7xCT6Ìq07sV)jÌÌÜËğĵÊîîîîC'fhĞŞĞ·‹şÎŬt3ĵŞĤŠşH¨†g†§XPH¨švË·‹¨wsaR7b0†t!(…EEœÇg16Dj›œÌÌÌğŜîîîîîîvеhËğ˘xwhw·“(Íı‡‹“‹Šr4x£GEŠˆ™Tw™œĥf #2xU6e3ˆWfœÇT:”W07wĵÌÌÌÌŬŬÎîîî‹ĞÊИ‹İğ™İÍıa|ËĵÚ7ʊ†GŞ“$T7™›ğfËĴÌ´QgwfB13TDI”¸pXÈV7Bv1JÌÌğËğ¨ulîîîî›ÎÛıšzğşğşËÌjĊܝ³|ş¨f6Ş·TTxŠĞgìĵĵĈA|ğËĵıbgQ‰23´1”xIe'İwĵÍÍÌÌŬÜË­îîîÍșšğşşğıaT(Ìsи'¸y–wиuGTwˆ‹e܈Ĵ¸ˆŬŬÌÌÜÇAGˆ£Rx!–6g2|ÌÌÍÍÌܽîîîîîîh—‹şşĵ™‡ş‹·4ww½gc|¨‡dg&ޘ†weTxšfŬŞzœÇÍÍÜÜÌËËsİ@SB(‚8fĵƒ'ĵÍÌÌÌËşîîîîîîxyĞğş¨Œëj¨wyȌĠWş|…cx™w…#ggg̊w|ÙÎŬŬŬŬÌÜ̧FA$B4¨6xˆ½ŬÜÌÌÌğ½Ŝîîîîîîvzиw`E­Ĝ6‹wyğ›çx§½ed{BwwEtUUfsgÍş‡ÛŬŬŬŬŬÌËÌËÇ11„R&$ĴŬÜÌÌËÍŬÎîîîîîîîfD4Q!fŠ£gyšğĵĵĈwˆ–7vf$UfVww„­¸İŬÜŬÍÜŬŜŬÌÌÌËşv av7ĞÌŬÜÌÌÌŜŜîîîîîîîî"wuˆŠŞİğœĦ&fguFe1$ 46vDwŠĥ|ÛËÜĵŜÌÍŬğÍÜÜÍŬíܸ‡†fV‡ğ¨ĴŬíÜÌÍŜîîîîîîîîîîîC3$dR2TSFwj`g35efAC6—VRGğXŜŬËÍíÌŬÌĵÌÜÌŬŬíÌîîíîîîŜíÌÌÜÜÍîîîîîîîîîîîîîC%!$EQ06UCe2#D3Ca7†&wн‡zĴÌÍŬÍÜğÍËÌÌíŜîŬîîîíÍŬŬÍÌÌÌŬŜîŜŬÜÌŜîîîîîîîB2EDSvC"fvB!!dc3&sWÊĞÌĵˆÍÍÜÌÌÌÌËĵÍŬÛîŬÌŬíŬÌŬŬÌŬÜÌÜŜíŜíŬÌŜîîîîîîî T 55%eQ4@452dWc!iËĞğğËĵÌÌÌŬŬÜÌÍÌíì½ŬˊĵÜĵÌÌÌÌÌÌÌÌŬŬíŬŬŬŜîîîîîîîV2$"A6&0kr`#@$17guVD4s{ÊĴÌÌÛĵÌÌÌÍÌÜÌÌÌÜÍÌÌÜşzğËğğğ›ÌŬÜÍíŬíŬŬŬÌğÌŜîîîî1DBD"7@{ 0RA5GvUDVcg‹ğşœÜËĵÌÌÌÍÜÜÌËĵÌÌÌÌÌğĵËʚğğĵ˨‹ÌÜÌĵŜííÌşĞŜîîîî5C4T3"5AE@%Ugˆwwˆu{ÌğğÌŬÜÌÌÜĵÌÜŬŬÜĵÍÌĵËÌğÌËğğËğËşĞğÌÌʈŜîîŬîîîîîîî&P4A3TB#0%cwxšıˆšşĵğĵÌÌÌÜÜŬËğÌÌÌÍÌÌÌĵĵÌĵĵğÌğËşğğÌÌÌÌŬŬÌÌĵŜŬîîîîîîî#Agg#CBFa!hЇf˜‡wˆš›ğËşĴÜËÌŬŬŬŬÌÌÍÌŬŬÍÜÜÌÌÜÌÌÜÌÌËşğÌÌÍíÍíÜĵÌĵŬĵŜîîîîîîfv5!5fwuF#cGhŞ—xˆw‰ĞÍĵÌÜĵÜÌÍËŬÌÌŬŬÌÌÍŬÌÛÍÌÌÌÌÌÌÌËÌşŞŠğÍŬŜîÜÍÍÛîîîîîîîîD%vd%cUGTda$6TcgVxfwgŠğğËĵÍîÜÍÊÌÌËÌÌğÌÌğĵÍˋĞÌÌğğ̸ĞğĵÌÌşĴËÌÍÜĵÛÍŬÍŜîîîîîîîîwuh‡xqgfCffgdFgxwhx6Ğ—šÍÌŬŬŬÜËğËÌĵÌËĞÊşŠŞŞ›‹Ëˆˆ¨šx˜šĞ¨ĵÌĵËĞÌˌÜÜÍŬîîîîîîîîîgfx™Şa‡dUgg‡wwwwekŞuxzŬŬŬŬÌŬÛĵÌÜÍĵğğݘ¨y§xĞĞğ‡‰şŠw‡w›˜ĞÌÌşŞğÌÍËÍÌÍîîŬîîîîîîCS4Ve6C1g‡j݉ˆ—ˆŠ‹ğĵÌĵŬŬÜĵËÌÌÌÌÌÌÌÌĵ¸‡›šËğğŞËŞËÌğ‡ew‰ğŠşËšˆİĵŬíŜîíÍ̇îîîîîfgSfc0"GWVf#guwŽìËĵĵÌÜËĵÛğÌÌÍÍÜÌÌÌËĵÍÍîíŬÌÌÍÜËĵşŞŞˆğŠšş¨—XĞğŬŬËÌÍíÇîîîîîwfBiPguˆsB6ÛËÌğÌËğĵÍÜÌĵĵğĵŬíŬÛĵËÍÌÜËĵğĵ˙ğşĵËĴÌÌĵğ·¨|şĞÌËı½ÜÍËÎîîîîî7W`Fu1gwݧw}ÜğÌÌÌÌÌĵËÍËÍ˚ğğğşĴÊĞÈw™ğËŞĵğğ™ğşŞ¨ĞĤzŞzğğ½ŬŬÜɊ½ÛĴÍîîîîîî"C4!6cdxuW¸–ĴÍÜÌÌÜÍËĵğĵşşËĞËËĵʋ§ˆĞިݛşİy¨¨w‡Š—xx‹ÌÌÜŜîŬëŒîîîîîîîîîî4 gxafgWvffS xĵ¸8ĵÍÌÌÌËĴËşıœÌşğ™ş›ÌşİghˆŠ¨ĞЈ¸zşş‰ŞğЈyĞÍË̽ííŜŜîîîîîîîîîîW$Fdwewxwvµg0ڜĵÌğÌÌÌĞʚşĞğ™ĵ¨ĞˆŞŞ‡zgƒ{İĴ݉™ĞĞıˆĞşĞŠËğŬÜ̽ËíÎÜŜîîîîîîîîîf2fQCegg4zĤfgkÜĞÍÜğĵÜÌÌÌËИşĴÌÌğиš¸U‹‡˜˜ŠŞxşĞşz™¨ĞŠıÍĜ‹ŜŬĵŬÌŜîÜŜîîîîîîîîî†w6F@ 1Xvkg¸ŠÍ§zÌÌĵŜÛĵÌÌğşŠËĵËĵ˜›§w§I‹–И›ı{ÌܛˆĴışĵÌÌëwğ|ÌÍÜÍîíîîÜîîîîîîî'wW2Grcdxfz‡ghŞĵĵÌÜğÌÌËĞʚޚËĵğˆı¨Şœ†œŞĴğœÍş{ˆĵşŞÌÍÌëhİĵËĵşĵÍȋ¨gŜîîîîîî0$‡zdT54¨A‡ĵcĞŞĵÌĵÜğğÌ˚şİ‡Šşşğğ¨Ëˆ¸œş‡š‹ËИŒÌ›ÊğĵËĵÌÜ{ÌşĵŜíŬĵ·g‰ĵŬîîîîîîC"w!5ugVFŒÛˆ™ğĵğĵÌÌÌ˨ğş¨v‹ğşŞĞ‡ğg¸ĴޘğŠğÌşĵğÍğÌÍ˽ÜŬˆİÊĵîÍÜĴíŜîîĵîîîîîî#'ADWUyŬĥ™xÌĵğğğğĵËĞı™ĞıĵËÍ˸wšŠŞ½µĵĞ™ĵËş§[íŞĵŜìĵşÌĜ‰ğŜîŜîŜîîîîîîîîîîîVEjv 'xÎÊğıĞÌĵĵĵÌˋğşŠĞğşĵÜÍŞıˆšË‰Ğ¨ŬğğĴÍȸĞËş½îÜğÌÌìͽîŬìÎîîîîîîîîîîîîw1&DQj·jŞËšĵÌÌğğğğ›ŞİŠ˜ŠğÍÌÌİ›İğğ݈ŠÍĵŬÌÌ·¸ÉŞËÍÌĵŬŬŬêÎÍÜËÌŜîîîîîîîîîîîîxfDgsĴëeŠğĞğËÌğĵğşĞĴıĞŞšĵËĴËŞĵÊŞŞ˜ğĵğĞğĞÜÌĵÚgÜÌĵŬÌËĵìĴÌÌîîîîîîîîîîîîîîî4wfseUGˆŜËÌğğĞğğËğÌÌĵËÌÌğşğÌËÍËşğİŞğğğËËğ‹ËĵÌ˘xÊнìĵíŬÛÍÌîîîîîîîîîîîîîîîîfcf4%Y‹ËİğğğĵÌĵÜĵĵÜÍÊÍÜğÌËÍğˉËËşğÌğğ·ğĞĵÌşÌÌşšËÍŜìÎÜŬŬŬÊŜîîîîîîîîîîîîîîî4e61JŬ…{əĞĵÌËğÌğĵÌÌËğÌğÌËÌĞş¨ğĞĞĵğığĴÜÜĞğıމşšĞŬŜŬŜÛÜÊĴÌŜîîîîîîîîîîîîîîî4@XVfÍÛ¸ÌğğğÌğğğĵÊĵÌğËğğŬÌËğĞğğğĵËğĞÛşğÌıŠğËĞŞşxĴÜŬŬŬËÛ̽ŜîîîîîîîîîîîîîîîîRDB—'ş™şğÌÌËĵğğËĵşğÌğËĴğÌËËĵËğğĵşĵÌĵǨĴËğğĵÊĞĴÛĤ½ÛŜŬìÍÜŜîîîîîîîîîîîîîîîîîîFfcw½ëggĞşĵÜÌÌÌÜÜŞËğĞÌÌÜÌÌÍÛğğğĵşÌğĵĵÜ·şÌĵĵÍÌËĵÌÌËÍÜÍŬŜŬîîîîîîîîîîîîîîîîîîîîWVgšË§hŞŞĵÌŬËÌÍÜÌğğşğğĵÜÌÌÍËÌğşĴğÜğĵÌËŞşğğğĞËÌşÛĵğÍܽÜŬŬŬîîÍîîîîîîîîîîîîîîîîŒr…DgĞŞşĴÌÌşÜ½ÜÜğğğğĴËÌĵğğĞğŞğğÌÌşĵÌğğğğËğ‰šÌÊÊğĵÌíŜíìÌŜŜŬĵîîîîîîîîîîîîîîîîˆG›ĵËşğĵÜÌĞÜĵğğœÊŞğğÌÌĵËşĞğğÌÜşĵğğşİ›ĵËÈĞşĴğÜşŞğğìÍÍîŬŬŜŬŜîîîîîîîîîîîîîîîîv6jÍìËĵÌËÍÌÌĞÌÌËğĵËĴğËĵÌĵËğĵËğğȈşĞĵı¨ĞĵËıŞğ½ŞşĞğğĵŬÍŬÍŬŬîŬíîîîîîîîîîîîîîîîîhĴÌÍÊËÌĵÛĵÌÌşĵÌËĵĵÌÌğËĵĞğğËğÌËÌıĴÊĞ½Ë¨ĞŞğȇÌĵ˛ĵĵÌÍŬÜíÎíŜíÎíîîîîîîîîîîîîîîîîÜÌÍÌÌÌĵÌÌÌÜğ¸ÌÍËËğĵËĵğşĵğşĞşşĵÌݽËËşĵİğğĵşğğËğŞĞĵÌÍÜÍÜŜîŜîíîŬîîîíŜîîîîîîîîîîÌÌŬíÜĵËĵŬËÜğşËÍĵËĞĞËËğĞÌĞğğğşğğ˜ĵİš·ĴıŞğËĞğşİ‹şğĵğÍğÎĞÍíŬîííŜîîîêîîîîîîîîîîÌÍÌŬÜĵܽÜËÌğşşĵÍËĞğğğËĴËşĵğşğğË˜ÊšĞşÌÉĞğıı‹ı›ĞŞĞިÎÌÍŬÎÊŬíîîîîîî×ŜîîîîîîîîîîÌÛÌĵĵÌÌĵÌÌÌËËğşğşĞÌĞÌÌËĵşĵğËĵğɋܺşğğÊĵĞşş›ËŞğşğĞğ½ŜŜŬşÍËìÌÍîîîíğîîîîîîîîîîîğşÌ˽ËğğĵÌÌğËĞşyşŞĵğ½ğËÌğÌşğÌğğ›ÜĵËğ‹şğĞš¨šŞŞĵğ¸ğĵÍîíĴÚŜËìŜîîîìێîîîîîîîîîîîıĵšŬíğğğĴÌÛĞÌÌğŠ¨ŞĴÊĵğÌÌĵËŞĞËğĞŒÜĴĵËĴğËğŠ§ŠšşÌŞşşĞÍÍë­îîìÎîíîîĜ·ÎîîîîîîîîîîîĵŬËÌŬË˽ŬÌ˸ĞğşŞİşğıÊĞĵÌÌÌğğğËğ™ŬšĵÌĵğĵşğ¨ĞğğËŞğşŞÌ½ìŜîíÈÎŜÛŜÜíğîîîîîîîîîîîîÌÜÌğÌÌğ½ÌÌğÊĵŞşxĞşËĵÊËĞÌÌĵÌËğğ˙ŬıĴğÌÌĵĞş‡ĞŞŞÌğğğĞíŬíÎîíşŜŜŬîĵÛÎîîîîîîîîîîîîÌÌŬ˜ÌÌÍÌÌĞĞğĴ݈ğğ˛ĵÊÍÊĞËÌÌËĞğşÌʜÌÍËĵ›¸ŠŞŠğ̨ı›½íËŬĴşŬÌíŜŜìÌyîîîîîîîîîîîîîĵÌÌÍÌÜÜŬÌʛĞğÌĞĞÌĞğŠœşÜı‹ËğĵÛĞĵËÌ܌ÜĞİÌğ¨‹Ş‰ĵğ˜ğĵÍŬÜîÛÈËÎîÎŜìËîîîîîîîîîîîîîÌÌÌÍËÜŬÍÜÊĞšığŠğğşœÌĵÍÛşŠŞşĞğĵ˽ÌŬkËŞšĴ̸Šx›ÌğıнÜŜŬíÍÌğÌÍŜîìÌîîîîîîîîîîîîîîÌËĵÌËÍÌŜÌÌşŠİĴşızNjÌğËıŞŞĞ¸ĵğĵÜÎÜ͉ĞÌğ‹ğğĴĵÇŒŞş›ÍŬÌŜÛĵÌğÍŬŜîÛŜîîîîîîîîîîîîîîğğĞÌÍËğÍËĵ¨ŠğĴÌÈ{ËşĞˆ¸ĞğĴˆİĵğ½ÌŬÜÍȈÌËŞşĴĴÌÛ½ËşšĞĵÍÌÌÜìíŬÌŜÜÌîîîîîîîîîîîîîîîĵÜğÜÌÛĵĵĵğ˜‹ÌĵğğĵÌËÊwİĞş‹vğ˸ĵËÍÜĵÈyĵ˕Ğğ˽ÜÎìĵËÈÌÜğÌĵĜÜğŬí¸ÍÎîîîîîîîîîîîîîîÌÜğÌÊğĵŬğğğğĵğğşÌÌÌȚğğÌğşşÌÊÊÜğËÌËwĞğ§ĵşÍÌÛĵğ̽ğÌÌĵËËÌÈÜŬÌÌÌ­îîîîîîîîîîîîîîËğğĵşğĴܨĞğğĞŞı‰ğĵ̙şğğşĵÌşÍÜĵÜÌËËĵşxĵğËÊĴ¸ğğ½ŬŬˈğğÌÜŬğŬíŬîîîîîîîîîîîîîîîîî̽ÜĞğĵŬÜğĞşş›ĞËĴÊĴ˛ËĞÜŞğ›ı‰şĵÌÌÌĵĞĵ—{Êhˆ{ÌËËğĴÍۇğĞÌííÍÌîîîîîîîîîîîîîîîîîîîÍÌËËğÍÜËŞĞËğş›ğĞ̛·Ğğ˜ÌÜğšĴİŠÌğÌğËŞğĵ¸İFĴŜîÎíŬˍíĴÜÌÌÌÜŬŬŜîîîîîîîîîîîîîîîîîîÜĵËĵËÜÌğšĵÜğ¸‹ğşĵÌĥŞŠığğĵğ̈ĵÍËĵËş¨ĞĴÊĵşÌğ̽Ŝí½ĵÜĵÌÌŬÍîÜŬŜîîîîîîîîîîîîîîîîîîÜÌÌŬËĵÌşŞğİÊğ‹ğËŞÌıˆŠğğhÍŬÛzËÌğĵËËŞğĵŬŬğ̸ğŠÎì{ğÍËÌÌÜŬîŜŜîîîîîîîîîîîîîîîîîîîŬÛÌÌÉĵÜğşş‡ĥŒĵ¨ğğ̸š‹ŞĵˆÊ‹ş­ËĵğÌÛÌÎíÌğÌĵÌĵÍÌÌíËĵÌÌÜÌÌÜŜîŜîîîîîîîîîîîîîîîîîîîÌÜĵÌş½Ëğş¨¨¨ˆĵ˜ı‹Ş¸ş‹ĞğğڛšĵÍÌğÍÜÍÌÍÊĞğğĵĵ½ËÌ͸ğ‹ÍÜÌŬîŬíÍŬŜîîîîîîîîîîîîîîîîîÌÍÌÜĵÌÌĵğı§{§‹¨şŠˆËğğğığĞËĴÜŬÌÌÍËĵËĵİ›ğğÌĵÍÛËŜıÌÌÌÜÌŬŬÍìÍŬŜîîîîîîîîîîîîîîîîîÌÜÌÛÌËÌĵË˨‹ğwdyw‰ğğÌğşš‹ğŬÌËĵÌĵĞĵÌşšĞĵğĵĵÌÜÍÜʛÍÍŬŜìËÍíŬŜîîîîîîîîîîîîîîîîîîÌŬÜÛ˸ĵşĞğşxĞxcxŠÊĞğÌÌşĞ{ÜÌÌËğğËğĵÌĵğğğğÌĵÌÚÍÛÌÊÌĵÜÍìşŜîîîîîîîîîîîîîîîîîîîîîÜÍÜÌÊşĵğğğş‹Ë‡Şİ‹İ‹şÍËı‹­ÜÌËÊğşğĵĵËĵÌÌËğğ½ÌĊĴÌğ—œÍÜŬŬşÜîŜîîîîîîîîîîîîîîîîîîîÌÍŬÌ˽ÌÍş›ĵÌğËşÇwŞy§š—¨ĴÌğĞğğËğËĵÌşËğÌĵğğ̽ĜĵÌÌĵĵÛĵŬÌÌÍŬŬŜîîîîîîîŬîîîîîîîîîîÌÜÌÜÍÍÌŬĵğˆ¸zĞ·‡f˜x‡ĴÌğíğİİĵĵÌğÌÌÊŞşğÌÌËĵ˜ìÌÌÌÍÌܽíÌŜŜîíîîîîîîì{îîîîîîîîîîŬÌĵŬÍÍÌÌÍʇˆ™‡ˆ˜‹şÌËĵŜÛŬŬËğÍÜËŞĵËğğşşğÍܽÜĵÜĵËĵÌÌÍŬŜîÜŬŜîğŜîîîîíĜ}îîîîîîîîîîÍ͈ÛÍËÌËğÌÊz‡ŠĞÌŜÜËğğÎÜÌÌۛğğÌğËĵğğĵğĵÜÌÌÌÌÜŞËĴÌŬÍÌÍŜÊǝîŠŜîîîîÚğŜîîîîîîîîîîĵܚíÜÌÌÌğÌۉ§j޽ÜŬËĞşĵ͈‡›ğĞÌÌÌÍËÌşğĵÌËĵÍÌŬÊğËĵÌŬÍŬŬÜÛÍŬÍÍîîîŜ×ÎîîîîîîîîîîîĵÚĵÎŬÜÜŬÍÌÜÍܽÜÍËËĵĞğğĵÜ·‹ÍÛ{ÌŬğĵÌÌËĞğĵÌğÍŜÜÌşËĴğÛÍŜËìŬŬÜíŒîîîÌÊŜîîîîîîîîîîîğÉÍ|ËÎÜŬÜĵËĵÍĵËğĵÚĞĞËËŞŞşĞğÌĵËËŞğğğşĞğĵËğÌÌÌÌğşÌşÜĜÍÌÛÛĴîíĴÌ˽ÜŜîîîîîîîîîîîîËÊÌĞÌÜğÌ˚ğĞÍğÌĵÌËŞğĵËĵ˜ĞğĞÍŬÌğşşŠığş›Ì˜ÛĵÌڊĞÜÌÊÜÛĞËÜĵîîŜŬÜÎîîîîîîîîîîîîîîÌğ¸ÜŜÚŞĞğğĵĵÌğğÌğğğÍÌËğĞğËğĵğğğËÌĞş¨Ş›şÍÍÛÌËĵÌˋŜŬŬÚĵîîîîŜîîîîîîîîîîîîîîîîîîËğĵÛŬÛĵğĵğğĵğğÌÍíÊĵËğĵğŞğğĞş‰ğş‹ËĵÌşˆŞĵÌŬŬîíÌî۝ìËÌËÍÌÍîìĴŬŜŬîîîîîîîîîîîîîîîĵğÌËÌËĵËĵğğğÌÌÌÌğ¨Ĵ¨˜ĴĴğËğğğŞğ˛ıĞÌۙнÌÍÍŜíŬîÜÍÈĵŬÜĵÌŬîÜğËŜŬîîîîîîîîîîîîîîîĵÌÌ̽ĵğğŞĵğğËĵ¸ŞĞğğğğğğğşşğİğğĵÌËğËğĞĞÌĵÌĵÌÌŬŜÌËÌËÌÌŬŜŬŜîîîîîîîîîîîîîîîîîîîî›Ìğ˽­ËğÌŬËğğğ¸İğğğşĞËĵğĵËşŞğğğğğĵËşš™ğğĵÍÜÌÌŜŬÛÌËğÍÜÌĴËÌŜîîîîîîîîîîîîîîîîîî‹ÌğÜŬĵÌÌÍŬËğğÊŞŞĞğÌğËÌÍÜğÌËĵğËğğğĵğÌşğşğĵÌÌÌÌÜÍŬşğĵĵËşl˜ŬÌÜğŜŬîîîîîîîîîîîîîîĴËËŬÎÌĞğˆĵşĞğËşŞğÍÌğËÍÌÌşšğğ™ğşğğğğĵş½ÜÍŬÍŬğÌÌŬÜŬËÌÍÌÍÌÌĵÌÜÌîîîîîîîîîîîîîîîî½ÌÌ̞ÜĵğŠĞËİĵğİšŞğĵğ‰Ğğ›Ë݉˜ˆĞ˜ğşĵËğŞŞğĵÌÌĵğÌÌŬÛŬÌËÍÍíŜíœíîîîîîîîîîîîîîîîîîî­ÌÍˎÜÌğšğÌğğШĞğğĵğĞŞğĵÌËğŞşğŞğğÌËğĞŞşĞğÌÌÍŬÍŬÛĵğğÌÌŬŬë|îîîîîîîîîîîîîîîîîîî›ÍĵğÎğğğĞÌğĵËğşş˜ĞÌŞĵğğÍÌÌÌğŞşŞšŞğşğğĞğĵŬŜîŬÍŬÜܝÛĴğĵÍŬíŜîîîîîîîîîîîîîîîîîîîğÌĴÌíğŞĞŞğğĵËğ˜ŠşĵŬğÌÌğğğŞğşŞŞğ¨ĞğËğşğÍŜîîŬîîŬŬìœÜÍĵÜŬŜŬÎîîîîîîîîîîîîîîîîîîîğÌĵÌíğİ‹İÌËĵÌËŞ›ğÍìşğĵ™şğĞĵşŞŞğ¨·‹ğÌğŞĵÍîíŬŬíŬŜììŜìÜÍĵĵŜîîîîîîîîîîîîîîîîîîîğÌĵÍíğş›¨ĞşĞĞğıˆĵĵËğğÌÌËÌËĵğğğÌËÌËÎîíŬÜĵÌÍŬŬŬŬŬÜÌŜîÙÍÍĴÍîîîîîîîîîîîîîîîîîîîîÜÌÌÌíĴËğİİŞğĵş˜ŠÜËğÌÌÜğÌÌËĞğğğÌğËğĵŜíÍîÜÍŬÌÍîŬŬŬÜÍŜÛÎÜÍŜîîîîîîîîîîîîîîîîîîîîÌÌÍÌíĵÌğğĞğĵŬğğĵËĵËğÌÌĵÌÌğ™ĞšğğœŬŬÍŬŬÜÜĵÍŜŜŜîîîìşÌŜܽÜŬŜîîîîîîîîîîîîîîîîîîîîĴÌÍËîÌÌğğĵşİŞÎíÜğğËĞËÌÌËğğğĞŞÍܽŜÜŬŬŜŬŬÍŬŜîîîîîìĵŬÜÍ̇ÜŜîîîîîîîîîîîîîîîîîîîîŠĵ½ËíĴÜÍÊĞŞ¨šÍÜËĵğğşŞğĵÌËşĞğËÎííŬÌŜŬîîíîîîîîîîîíŜÌÌÌŜ¸ÌîîîîîîîîîîîîîîîîîîîîîŞÌ½Ëí½Üğ¸ĞÊğğĵÜÌğĵÌËşĵÌŬËğğÌÌÌÌÌÌÍŬŬîîíîîîîîîîîîîŬíĵŜíÍîîîîîîîîîîîîîîîîîîîîîÌÜĵğŬ­ÜğşğşĞÌğÌĵğĵÜÌÜŬÌÜÍŬŬÜÌÜĵĵŬŬÌŬŬŜŬíÎíŬŬÌŜîîîŜîĵÌÍÍîîîîîîîîîîîîîîîîîîîîîğÌĞÊŬĴÛĵÊŞşŞĵŞĞğĵËÌÌËÌÌÜğÌÌÌÜŬÍÍÌÍŬÜÌŬÌŬÍŬÌŬŬŜÜŜìÍŜŬîŬîîîîîîîîîîîîîîîîîîîîîîĵĵÌÌîÊĵğ¸ğş‰ş›ğğĵğÌÌğËÍŬËşĞÌÌĵ½ÜÌÜÌÌÍŬíŜîîŬÜîŬíŬîÜÌŬÌÍîîîîîîîîîîîîîîîîîîîîîîÌĵÊğîğĵğËĵÌğğĵËĵÌÌÜÍËÌÌÍÌËğĵÌŬÍìÜÍŬÜÎìíÍŬŜîîîŬíÌÜĵş|ÌŬîîîîîîîîîîîîîîîîîîîîîîÛğ·İŬĞÌĵğĵËĵĵËğÌÌËĵĵğĵÌÌÍŬÌÌËÌÌÜÛ½ŬÌÍŬŬÜŬŬŬÜŬÍíŬܽܭÍîîîîîîîîîîîîîîîîîîîîîîîËğŞŬîÌÌĴğĵËĞĵĵğËĵËĵşİĞËÌĵğğĵÜÌÌÌÌÌÎÜÌŬîîîíŬŬíŜîîîÜîîîîîîîîîîîîîîîîîîîîîîîîîîÌÌÌîíÌÌÌÌÌËĵÌĵËÌğËËÌŞğËËğğğĵÌÜÌÌÌÌÍÌÌÌŜîŜîŬîîîîîîíîîîîîîîîîîîîîîîîîîîîîîîîîîŜŜîîÌÌÌÌÌŬÌËÌĵÌÌğğğÌğĵËÌÌÌÍÌÜÌĵÌÌÌÌÌÜÍŜîŬíîŜîîÍŜîîîîîíĴîîîîîîîîîîîîîîîîîîîîîîëŜìĵÍÜÜËşğğĞğÌÌğÌÌËğĵğÍÍËÌÌÌÌÍíŬŬÍÜÌÍŬîŬíŜŬîíÌÍîîîîíì½îîîîîîîîîîîîîîîîîîîîîîÛÜğĵÍÌÌŬÌÜÜÌÌÍÌÌÜÌÌğğÌÌÌËÌÜÍÌŜîîîŬÍŬÌÌÎîîîîîîíŜîîîîÛŜîîîîîîîîîîîîîîîîîîîîîîîí¸ÜŬÍÍŬÌÌÜÜÍÛ˽ÜËÌğğÌÌÌÌÌŬŬÍîŜîîíÍŬÜŬŜŬÌÌŬÜŜíîÌËğğŬŜîîîîîîîîîîîîîîîîîîîîîîíÌÍŜŜîîîîîîîîîìÜÜŬŬŬŬÜŬÌ̽íÌÌÌÌÌÌÍíŬÍÛÎíÜËÌÌÍÍŬŬËğğĵŜîîîîîîîîîîîîîîîîîîîîîîîŬŜŬŬííŜîŬÌŬŬŬìŬŬìÜÍÜÌÌîíÍŬŬŬŬŬŬÍŬŬܽŬŜîîîîíğÌşĵşÍîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬÜŬŬŬŬŬŬŬŬĵÜŬÍìÜÍÜÌÍîíŬŬŬîŬŬíŬîíŬÍîîîîîîîŬÎŬŬŬŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîŜŬÌŬŜÜÍŬŬŬŬÜÌŬÜŬÌÍÜÌÜÌÌÌÌÌÌËĴÍÌîîîîîîîîîîîîŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬŬŬŬŬîŬŬíîŬíŬŬŜŬîÌÌŬÌÜÌÍÍŬŬŬŬŬîŬîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÜÍÌÍŜíŜŬîîîŬÍíŬÍíÌÍŬŬÜÌÌÌŬîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÌÍÍÌŜÜÍíÍŬÍŬŬŬŬÌÌÌÍŬŜîîíŬîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬŬŬÜŜíŬîîîîîŬŬìÌÍÜÌÌŬŜîíÍîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬíÜÍŬŬÍŬŜîíŬŜíŬîîîíÌÍìŬŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬÌŬŬŜíîŬŬŜíÍŬíŬîŬíÍÜÌÍŬŜîîîÜÌËŬÍÜŬŜîîîîŬîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÜÌÍÍŬŜîîŬíÜÍÌŬŬŜîíŬîŬÍÌÍîîîíÜËŬÌÛÍŜîîîîÈŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬŬŬîÜŜîîŬîŬŬÌÌÌÍîîŬŬÜÍŬÌËÎîîîîîîîîîîîÜ­íîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬíŜíîîŜíîŬÜÍŬŬŜîîíŬíŬŜÜËÍŬÌŬŬŬŬíîŬŬŬÜÍîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬÍŬÍŜîîîîîîíŬŬíÜÍŜíÌÍíŬÌŬŬŬÌÜÌÌÍíŬÌÌğÍîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîíŜíŬîŜîíîÜŜîŬÍŬŬŬÌŬŬŬŜÚĵÌÌÌÌÌÌíÌŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÜÍŜîÜÜÌŬÍÜÌŬÜŜîîíÌÍîŬíîÜÌÜÌŬÌÜŬÜÌíÌŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîíŬŬîíîîŬŬîîÜÍŜîîîíŬŜíÜŬÌÌÍÌÌÌÌŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÜŜîíîŜîîíŜíŬÍîîíîíŬÍîŬîíÜŜŬÜŬŬÍÜŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîÜŬÍíîÍîîîŜíŬŬŜîîíŬŜŬŬÍíŬÜÍŬŬíŬÍÜÎîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬŬÍîîŬîîîŬŬÍíîîîîîîîíŬŬŬÜÌŬŬŬŜíŜÌîîîĵîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬíîîíŜîŬíîíŜîíîîîŬŬŬÍîŜŜîŜŬÜÍîŬíîîŬŜÍîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬíŬíŬŬŬŬŬŬŬîŬŬîŜîŬŬÌÍŬÜÍŬŬŬÜÍîŬŬîíËÎîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîíîŬíŬŬŬŬŬŬŬîííîíŬîŜíŜŜŬŬŬÌŜîÌÜÍŬܽíîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŜìÍîîîîîîîîîîîîÜÌŜîîîîîŜŜíŬŬŬÜŬŬŬÎîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîíŜîîîîîîîîîîîîîîîîîîîíŬŬíËğĵĞğğÎîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬŬŬŬŜîÎíÌŬŬŬíŜŬŜîîîîîîìğĵŜíÍÌÍŬŬŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîŬŬŬŬŜîŜîŬÜÌĵÌÌÌĵÌÌĞËğËÎîîîíÌÌÌÍîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîíŜŬŬíŬÍŬŬÍŬŬŬŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîíŜîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîgamera-3.3.3/gamera/pixmaps/gamera_wizard.png0000644000076500000000000005272210714675706020226 0ustar chriswheel‰PNG  IHDR”<ÚhÑPLTE.)2ònn6Šrb&ršN‚Ž’}rb^^NEĤŝ*xĤ Fn‘ŝ˘ŭĝ <+~§–†v~ŝÊ".2֞Ž>ê•jŝĤFr9ß"‚S.ĉg~§œV’'ĦC:ŝŽŽ˜ˆ9֓žêŝ~šžÂ’‚n•†Ŝŝ6F:yŠ.Ú\jƒzĤ’B^G˘ŝjJb=ĥžŽGŝ§2ZšIök>aRn²ŝ†ĈŝhX^ŽúFN>ÊZ’˘ĤŝûçĤFPuif‹Zŝž<˜â3ƒÊj˘üFrÂ@b[zÖŝf²ŝ†¤–E€Ŝê¢ĉŝ E/Aö 'hž^ŝ†r^R%–m§šr•†c†^tkĤFJŝšJšŝ²‚vüĉԚ‘$M??žâ4gĴĥŽ~>rÂĈŞ–6ÏW*N@VK0şuFŝv^²ŝŠĤ˘²Jf‚{Ž;bĤZ‚êN~4҄ffV2rRNBJŜbFŝ’*ĈR>ĉc†˘²’îŝĤ{mš>B…˜Ĥ°ŠšC[SRĤŝ{ž—*ŞF:’ûJŝ†BŝšÚħ z’™@j´=–ŭÚʲ*²K>3r~v†’†úĈ² W~Fe^'žf;Šnrb6ŝvnĈŝ#–f†˘F`&N~~š’ĤŽ‚ĥ°žrŝš6NNŠúâÒş6֊*Z’’ŝFšŝ6Ґ1cZ,[Kî²˘zĈŝ’Ĥœ*bžRVF7b£N’ŝ>šŭ3€ċ6ĈRHŝ²DZ=Öa r/aЁ†’’…š–m{nRŝv7OA‚Q)hĥ–~n~ž†’>ƒ7†Š‚3ÒzDŝ .vÖ.şnB’ŝ’ކ/AFŞŝúÖĈ’ššĈşŞ&šB:î†BF:Ežŝ~–’R^Lf^NR˘ŝBzÎ2²N&RŠRŝŠJĉgmRšŝRzÖÚ²nfV%ž^Tf\vĥŝ’ĞĤfÂŝ–rfzš†z~r’ŝÚ^jfZfR†~r*Zž\7/wş6î†vfVZVJvŝžzŝ²ŠĤBŠù’ž²*ÏW>ŭƒšŽ†>ŝŽA^:Ŝ^6â‚z–Š+?:w–”Rŝî—ı— IDATx^ͽ ˜–ċ•ç Cì"’²mL#H·[aÌG[ $ e ĜlÁPĜàÁ`™FD@ì™ £ĝƒŒÈ*Ġ†‚€PşH\ق0€é%È2 óûŸsßÏóĵoÎLÏ5×5§¨÷YŜ§JŻ÷_˙³ßçn AƒWŝÓC ĵŭ‘4ĝùÏĝŬżûéO˙ĝħ˙(ùĞż²żBŝÊ~”× ~êż(Ŝʟ>Y÷Œ˙İ˙úäßġüÚ×ŝmž|ßÈżġżuÍïĞWŝm=w4ĝ;ŝ÷úŽñ×Qüìŝ!ıèBÇĴĜäÇì¤Î#yï'OߛûsıW ^yèßŭñĜù7U˙ċ?ĝÏİüɟd.êœŝ oó-ÑÑŜÏ\ûáĝ‹Âû˙S‡?˙Ż·ĝkßĝËo~óÛùbw2·ġÈ7ƒÔyĝÛß˙ŝ·ż_÷nîï›|›gíè‡ôFĵŝ~ƒ˙òŝ#~Ŭç–ç/Ŭ’#Ï?Ï%ñâyΐÌÍx:ËċùpŒ—ş~>ïfî#ñÊ~ñó7I<ğ?ŝóƒ?ùñ}÷˙|=AïÛïnÙ²UĞŻ½•Ë×]Zq/܈'á==äŒó#y‡_ĝµ~aÇ_ ~ݽäIƒwüm§wöıÄ˙裏.Zôè£ú<ŭÌÏM]ÄyòžŜ âÏñvĝiżî&gÉġ"ÉgŸñbïq°;‹ŭì÷ż_´è÷ĵ…4xà˙| ÷ôÏ$nŻġHĉ?×ı_ÇğÜús—ä~‡=ÌM=k_QÒ³äNĵĠàç˙éïöo~ûûWĝôSŒžSxPE<µ£I 1êĞĝŝá{~ÖM7ġ@ôÙÛk¸àT°=Ên ÌzïĤÊ=ôŽ`à#·“PÇ~?àŻ;ĝ]ĈÛö^x‡ïMì`ŭÓ~üËïŝìgOżˆ<­W‡2ʋġâ݇ë'÷ïÀñğ˘¤ްy_àG}JÉ(9z:è%+…ĊAӋ³Ë‘üŸB-yÓà3Äü8ĈÜ†áÜIg<2öä ż)ü-8^M;ûŭï#zÇA @@Söŭ,EÌW’EŬĜéW‡Žs‚š3Ià‹ì3ÖdKäžiR)JS–ġ=”ÑŒQ;ŝŻ!g@ĝĥ9>rьϔc„,=ƒŸ7Ŭ”(Ó,˜˘ˆ'éa úᄏœŬäx=ÊQżhɘ£<ż‚ ġÀ•w ŒŒġ˙bV%'pfƒAĝ÷|ùIƒŸ˙?Ĝ <’H­ÔĜeÌҌdbêÜbÖ5x}³•Ó1Àìy‚îe$(a·}E“W˙èG#_&*ÜћĵîÏú쳌˙Ñc×Rš!Sš0ÒUd˘,!wŸbG9š<—gûú‡6Ĉ!'+=É·})âo¨ç‡êµ|FÁż—ċş <żùnâ£$Jbì +ż"— n ZŬGqK˜£IsĠ)W†]àşL^Ŭ£cPƒ ?M‡Ú‹èèvìĝÜsÏ}qœ%—FžĞÏ=²-O£ü쐅ıs5œJFyö˙Y˙Œ½ğ2™m—Q·‰Âü kèϘۓŬ¨]Shó]—h˲@Ĝ‡Ÿëx&&°ó%œ5}ġÒíÊZ5ÀwI~§°şéςÀ!?ë~“WcŜ§Ä=SĴ^€ 1~ĤrïGúÓıhâ*UÉ];‰`Ê8 9Ŭô‡äşüTžç/żkŽË‹/ž?ŸwŝüÍçċù:°ôÏ`-XÌíáÈ·ŜÊ}ŜÍjò‹ƒŠF/À?³}Ä ‰çù‹ŻoI1q$3£/óâ sYR4ĝ1˙:ĝú(â2ş ´›~ӟÙgói›ë)à<Žt[´(ÒÔ`SPàA€1ġYR(›ÓÇ-ú ÚWĈöŭòğ l7ߜùœoŸNWp^ú÷ï˙ç`Ç!ş),äĈ#~'pħ^mهò P`~Î7Xf—·_äéĜŒ+^iê²9ÄY³ÎİŝğÁu™|h5ħµë?äœ5ĈI)o$ Ĥ>r7ŽÀÀëgÏ-êȝYœĠ‘/³_YUÏŭ}ÙżTy91è%uDrԝĦb> _eê½àĥ˜ ĥOkâ˜DĞ—UyMôd²·ŭWäÜo Ž?^ß=ĉÀÜÎö§˘Û’Ë|;|¸.‰W2ÛMîiÚ eí˜>p³„ĉì8pQüòKŒcǎánëNrj… µß#ȸ…I âŭÂöàşÈ{7÷/Džù{.ù\VĉfüËşüó7żùÒğ¸%ò)í;ÇYI½“şž~6?ˆ_mÙ2@ßliġ1ÒŞĠÇ.ħ.óĦuD \“Ż{ÒìŜÉ·Ü2ë™YÏ|Ùħ3Ï<'ßñ™ÏžáZ˘û~–PúòG?ú‘½˜èF"\>×ğw= bÂĠ$ w Z}}·ÌD¨Ùkî#ù˙ˆXàÏ |ñóŸ5ù2ı™†]ÄĠŭÎĝ ön.~óġH„Kża˙PĝÈ9…XDÔϔħ&ç9ù–YżŒ|ÂħáĦÑħc„-=ᘀ Š‚êK~5·s²_’Ŝɞ?—Qž˙ $İù?UçĈżâ×:ûŝò›ïĉ—ÂàÒçŠŞÛ²Ċ³£À"ê9z‘’ßġ‹€XĞŒ´i@)ċ/wrÉ”tÂĝ‘×Yû~Iż|&…Ïñšeìċ :1Lžá¨l—RİNp ÷žÉÁÔÔ¨Ù>ó<ÉXçZ&l‘…cÑꉄ‹Ħċ%ğbà‚ċwx’_˙+(Fĝ^Ş÷ċÛ¸,žpé]#WBÜ:Š1ĉÖêĜBÊŝ"ê‘_Ÿ[n -†yfÍl ÛAà[ŭ£ĠĞg̓Y-(Ì5ƒö\4šÁP†Ÿ6˜Üş$i€àyĝrl]z™"$á[úΕûúíž·½âPOĜ>p˙p3Ÿs„9BĞĴ„Ĵ¨\O{ĉŝž:i6 >\—ès(~ô1XÔħcr%>ċJiË5%#wE÷œĊÁ|.ĉgÒlŒöŒ™E€! üv,3èw]¨Bä„í?ġ”ġӄl|]Ib>ìE…u/ÊÏŞd¸ġ3 êÇɳÚIn['áÏAhè+7R”çiI³$÷ċxäÇ y…£ü0>ġW[}}ĵr3RŠ_ż|ÙKĵüBݳìŸA>ñb’MpËóÜ/Ïsġó$^’dKbHĊ| ħ›ùÏÄ\~4ÂĦ‡ċ·tìʂß~Òŝ2ݝìı‘dcÁè/ × İ§‰ĜϟŻÌÚûŝDUĞŒáWè­ŝ|Ç_ċï ÑÜGŭżĠż€Ï˙ ƒ$)€TĵŸŻíR}™QĉÌIRûÒ|NÌ£qD/ׯ4óàu}1lOÂpâħҜeULŝ,÷½îŜ'yßèŬ˘¨¨¨E‹ÓyċĈö†üÑ †ñTÈeáûéoŝé˙[€/`Rß!'g˘ìL"cAÔżs˙ŬHçνN^ŭİÎgÏNìÜyâÙċğ{5A:w Zz'ÀǍ:ġ´"äH[˘%ë³V*ìûRíüËŬğ_ŝx|÷™ ‘ğèÎġ€ċ›–ï=°îûîž9³ûx²•œv•šó§â²ŸżˆċÚç=CĤD‹âö˜:ËAÉ0ş)óƒĉe×EşxquïAíûß˙ŭO' ôêûŻÓúp›6ӆʝ÷ßżDŜçBÂ%Ğ7hûß˙oì‹92Ît^ä<ğÌċÓzxvĈŒ³{5éĵğ×É·Ŝzëd݉½N½uŭİŬ3Î4Ŭ}ò­Ï9mÒkwùÙ³)EvŝĵY]µFŝÁÀ$lo•ù,ó Ÿt˘T3u¤rÔj~ĊĤMĈß;`oÛğŻıĉî.]Ú8enÉÜ.îĉîĥ{y`Óòĉ·RŒ·ĊáK ôӀİÁ×÷Ŝşì ٖ@7–…‰,‹ıÍGe!ы j1˘S§›µ8·y¸½˙꣕‡g}gRëÙ­‡NzçĦ³ĞÛ,xğ[§Óġ~÷˘˜ÚĥRo`ž'@Órm.D·$?Uio ğä³úlĤ3ÎNDv79ġÖ[§z•mZézíŜŬĞÀ3|ĝUgÎ8û4äܝêJwW×Gż-…/ú*Ñômg![hŒĜÁî853€eĴâtĊée{ğßÂîswôÜr]–͝;·¤dŬ͚5{|ŬĤċµ[Ä>Ğ îJú#ş'ĥï–çċˆD™%—Äüî÷^t;ñ;ÍU™5ku|š+3ŒƒÎġí[]³ıĤ\ëIŻ"“fWïï[Ĝúf-¨Üż˙á‡ZĤ[ߢéèÑçÔaeE÷Wäċ(£BT&çIà@šÙòdıÔßÔŭɖ–üÓïßw˙óÀW>ħ\ŠòÔ[§NÜŬ°eËòŬ˘\Ë3gĈœŜŻß1-ž=zŭϟIžúi1px!†ÛŽHGÛ³1}ߢĵV­ ĜğwnĊò dî\Ĝw÷ŬÚĥ/2ŞdîŜ.]*FġìÙsŬħfDŽ^Eíĝ™\Ŝò.)3İPKœeíŞÁç­Jw·ğp4„Hâ1z”¤gRáMN :·ıì gßÎ;ŻúÎ;·?zôèì[o¸µ°ş²òRyĝpġášÖR°“;>Š=X ‰˙HÎdâ>!äÁ^œ` ÍÀäDpÉbÔÓĈ=“4éµĤxìĜ \žìµ›³ħĊ`{é/+ˆËİà1ĆyAalUŠY—PÑËĤ`‹§Q}<Óħ•RfdÈ${ñ ĵ€ŜŬmğߐÒÒ ÙeoEII Àέ8][ğ·{÷ĥm•Û4ò†ĴLNĜİÀAžg@EYcW/íT!z~ŜìGDï€Ç;½AƒÍFZğ÷ï†û ³ÂA­Í.|‚ ŬùÖİ“kĈž‘´[ÎM™½r½=qwgy1ĉÇ2X‘=_’°=d]ò’-ur/i„î˜ĥ"ğ‰e2nBż½°ndԎ 8;ykïéċ{ܽ°ûÇó1‚&"{’’ħˆ£ÁzÎsġ-dG”6Q‚Kê…Ŝ°GìÄıÙQôdìÛ<­/R]}¸­Ŭ¤Ħ³÷=²˙7ÒUġıÖCUw*úêŭ½GŒ(ê „if4“~ÉÀ'2¨ŜíGזİj‹YĴÚëËùôŒĤ-[6Ċ¸•^p°ÉîòĤcš—7l(ş{lKÙÂòĤ3v7i²ği³àĜıs}ù˜ú“fòEċİK̆%FŻĠüwoÀ((ĝ6Â7‘= ğX¸PîJ ×0ċşcŬ¨emì]|@÷ñ§×mŞí.WTÀ LŜ³UPžÀ—щı§!ŭœ) ÉٗĈ=‚ƒÀwXM;|¸¨޵úİ às"Òşġìênmށħ5l½ıoߚĦŸNÂMŒ)›çûêIšc—0ÌÜĈ@êôò]ÎÏhĜ°ĦÔ# ż“׿ġÖġM[Dĥ^Mz•_ġ옽¤W›ôšĜ´İ•h–ùìĞ“˙ÊS£IÉ!kѝ`¸ìtĊrŻ˘˘vÙŜ½_>p÷wókĥm Úĥí2wŬĠÍFuYx r`ÙşuËÇèŝ1¸]̟HNò3²/Ǥ]I£³R*ĠĜ÷¸ùĞ™V=m}ÖD{›´÷‡Ż~y˙ĠûċÉÀĈÖ}zhëw,„h}xZMïĦÄBĜ>İC(‘–i–ÈuOêğÊq3²–5¸{7‘Í@ Hĵpíµ„ ’“`V>|xK“„?'žş³h&0ŭíu’fuó—ùfŻ•Żĥ/À‚¸'ܤdÔ}á5·ç;·Eܽ°m—.]ĉŽUÑŭÀ½›FÍUlħp<°ÇX+MôoÙbìñÑöÀġxŻ c³ô••HB)NŞWğé|-6zàW3HZq 7î÷€ïŭW?Ôşġ¤Ħ……­rPß6Ġ ĝ½÷!ߟ~hħ|ǤŠ4ëG³R×%ĥô™Ÿğ÷İ:ÍMr˘<;ï&>ŸÁ?^0p½¸v?C¨˜6!*ġäî–÷4œ(˙ĉäIˆˆ„D‚ħŜ—ĝ&ı‡\è˘ĠŬÄgI\—e§#ùN×î…S¨==o÷™rd`_÷ĥD"ù½°TêŜ½]Ú.\8óc~žÊ lµú ħ;Sïû*Îé½L]ìtœÎÄâ}ĠÓ ä4¨÷Ħ½kFMÇ Š}÷OšdÑà¤sĠĝ2C‡ĥÚĉŝI½‹jĤjŬğµá-"öĊŠCF=~ë:ú–ıìLeâÙÀ>â2/„ €ÉŒf“Sןê5ħċUgσ(w›ô?{öĵĦ'ü"éóô‚Ñ V?HÊÑŭ—Pbˆgó$Ì3ŝáxÖùaûâéÚğ·½<@Háj˘=g †ÇY×ĴÙr)…€Ŭéċµwż<^…Z-Y™ñiĊáÊèy™UĊĦK”é~›W÷•£Ò·zÚa H犊FLĞi! ċobĝŞ,è;<‡ÂĈIƒŠVġŝ Èg˜ü‚QÚ£ġe}Z úĝÜñ]$èPs_µĵ|>§üQqïäIĵ™³½żÉDR4MvŸ}şóİëE@ù IÀ’q],ÜË)û4S÷3,ypèuZ'ß|Á7àôr9/›F~ïÇ]ÄŞZ \~z@wÜM;p {—.0~Ë׍ÚÛŭÚZĴ”è÷`.{ı6VÛeɤM+Zĝ‡ßòŜ{ÁQq}İ˘9–/ĜcĜçÚüŞĞĞ…`_PÜdĉšÓFËcL‰+PĤE: n$Ĝ^}£ĊjOqÉ(Oc_+€gğ…òQsfˆiwÌY*Ġ ŭ@!h˖cċmJ¸]>CYOiËSĈ;ÒĦMP­XÀνN]˙Ö)Ágj9é²vö÷ıch–Ñš Äryè§ÈöjhĠJ¸ƒġì ‚%s—aïˆDˊڏÛ**MjŞt&ÁĊ5wsšğñ??ö„? 2ÊsĞû$i§v]R/Ğù˘M4ËêĠ=’P̠󜋃~8/’Êʕ••p(|Óŭ˘5-zOúô~“W?íŬš,¨üšïÉ.Ŝ?ihï\{êĤžgHY8iĉ%`ÔŜƒĉ7•§öDĠ,SMÊĦÈGŒŜô… c‹Aĝˆ÷  èèËÉ&8Ĥ§ŜúüóÏI…!ž:I˘I²×iıö ‘şċ˘_xá… Ĵג-v4ŞżeÀ€Úаƒ}A”tÙ{ş˘Vn²iĈ°îÚò½ûÎD‰~ÇfĦü¸•ŭˆàQyRï¤TVéñÁêÉwŜK:óŜ{ïĵíÒëd7{ÜvÛëôôZŞS™ê$ë"ŝĠ<ŞëÛÓ,…äb¤8mĊĉÍ-)†˘Kï'§­¤ĥıĤ0#Ĉ>ê}¤%*aŠÊ?I­èü üI˘ı›)'`Pt7ϸي@QüS×ç/{¤ÉÊxiÙtl9Úì$uêA…û1ŽŸÎİFÖŬğ£çI½Ïq°´¤JĊòQëÈu-aËċGfŝvĉí·ÏŠ[¨7‘, ÓOŠËĉ–HwéıxñşÒu=GíĜħ£¤„ŝ²ƒ0ğtï~ ;ß Żñ‚Üv[ğŒW?Nl‚ï½÷ˆ$ éM­§S§·ß&=˘O7>|ùM}Ú.şíŜ{û,"íÜCíœĵĤükqŭùĊÊ}#·íùĊ_Œu˜ËTdĜ˜² ÄH~ĥ)@eR (”f[t“¸/ñY˘7Rğ|Ó͞zbŸÁwßí·ßŝCŭO]{ß#XıŠwÛÚ Ĵ¸žĝ,)]Ü ,–>İÏ?oBŽe†İQÇKíÎÀâ2Cmê„ Sŭdê„~ĤVÁÉ3cÊPŞ-1‹ TŒ{ş&PNDƒ‚iñĜ ıY—èIîPğéñ'ŻúÉ'›ñŻÙşQoËċßŜ'ú|×ŝG^P˜†p‹ÜOş–t€{ç– )˙ çÍÛµkŜħSJ—ŠŽ X: ŽË°.sÛsÚŝ‰'žĝdÇÁ÷ï;ŬÛç–ĠÏ;pÑ ÙżàxÈdA›NĠ#F\4ú9z’7€—#.’.çĵ2g’Á³ žm‰É ½lksB¨0 ›ÚüÙ~B0Hs  \´°3@¸Fĥ—ÂÀS½Öpz½z•çÀ—ÄDÖ%ë@ïj}_}5eşQ›(ôˆ~kݽ}ĉğ›`&1Zqƒ˙bHPx(ÙQşôĜ×^Ûp.œFçÍ[Üsˆy6DïŞîĥŬвàíÛ·Âà#eŬç´ÁìÂꇊè_7fÜۍ—>#|ß{³7ĝà*_‚ouĝéÙ³Ï=ZP0òáµwt·§LÈ%KĠy¤ZĝM’âDâ§ ßzëàġ™%*îA:~ċcû=ğñħg]úĦ?›˘?ÁŸ‡Ñ ~MòiĴ3†ŸÇ˘ıZ^|aĜ³=ĥá£(Í]ì²ß„~ÍÑŻToQ–˜=x§—5ċĊ‚Ż×š¨Ğ· >§P‹s5ĠŬzà•‡„ßÚmöéÖ#Ĝİeäŭ7FtkÓ·Hr55ĉXW°äŽW^ùŒ{ê)A€wüރtèS€³S'ĥïıÛŝ}Göo;rtö ˜Ÿ³o5”'­JŜZ…Ä ‰ċgúm~ŭĝÇç|œ˜330ˆ2rB?orĥé=Dç<>q"e"•Ú ğ=;ûÉO6>Ö|X=䣏ìD7<öф9e-ˆ ;CpĜ²ì Äò^1“à—$Í^zêğ5 ĥŒäÖĠ H(÷,||ÓK™9óû£·Ï¤ ‰âPE ħzI‰Š ĉVî(}íĈĞ 0°FG{íµyz·tÊ™ÇĊ={–Ž2Ê´h—½8-íqbÚ·O”çVà“×4`Mġ‘ÔĝɁ‘ |{DÏh!{ùċ—ßTñ½ûM#ËR!}+ĵF Žoƒxw0áebêSL|jÉ P<ħŭ¸›Á/öáÇàËHiŜ: ÑÀ[S×ċĴwZÁܸĞ1Y90²÷4<۟*O€ó·Nínxܔ{B'ݲ c‰ĠGŻĴš°qFPûhÂN›(ĝXP˘ÍħS§îœ3Ç aÙĜZìV°Ž'ŞÓ¤YètŽç²ıë„ 4i&3ĝĝòwċżÜxÀwû}3÷şŽmĥëÉĞo|u8eȔ!]Kçd€vléR·}İ óîš7oéÒrHK§ ù¸‡à‹Êèuò‰ág‹l_@O™ġ;wôÖïw^LxĝŜûiE^';Â}éĜµwÜħví’ĈǑ}3çÍ IDATۗ;;4Ŝw|û DĉÏu(È5ŜŜĝìÛ×xÛĥ‘Ç ­ÇĠäeà[o4֝fjӍbĉKĉoĝu|Pà›aÁÜ3 ҍ4ĉÙë3zĦ)AĞŞĴjç„ĉ\€ŜĈálVíÜÉ!ÈCz¤ùnLĜ9§ŞjNxŬS,ĝŠeġ֌ZQĴ=}IùGî‡{/‰àÂ,'v˙í}÷ÍDîğcµI¨F°PŠKĈùfíğî2Ù5OŞáRÀëúÉ'O<ë†pöÄ'S––îxï%Qžb_˘<[¨íĦ°òáW€F€|ğïêŜ"ߛVşÒız=ùŠƒ_r1;\'ĥ#†žh,„~ş{ĵ Q£Ç8xÀġ•û7ÑñvÂ:f™Jñ°ÒñÉ_÷=;ĵ)ìŭ Aêwcžu xĊ‰`ÀIÌ˘Ħ)ËáÓ{‚Ê­;WîYSĵòAğ5ĊÊŞö`ñèÑ9}ÓÓanû–!{Û·/)}òêî‚[ŝÒĝˏ<zVI‡{ܽñĈxJNĤŒœ{2=)‹—Àg*UŬ5äşNáU‘Ċ” ¸lßŝ“_Ñä^ĤïÜlÜ˙Á³ v`@ĦW`ßCŬŞkԂû᧤ĵZömz<`-1 :À:'£³ç§´ĤΞ2FĜŜÑAôì>P,ĜGDħäŽ;x×ƒ9)kâvĊp˜2kîëU> ŭù>uñ˘)–Ž\9ċôŽ Ç4òmĜí”m{ GEà…[îpJk‚£] À9e£÷Œ^Q`°Ĵ M:§lÜƒŒ†}ğp]N×ZŻR¨ü,#ŞĈui?d×Ġ A…†{2ëv̐.Ceéĵcó *y |”×t sDqƒ`D•* \ ^]§,Ċ‡’ĊhNS SĤ8|E° òyĵNҊÂıyï ‰_q-şv[&³É­Tn5%µBt · N,ÁCI3—‚á{J:Tw ŸŒzĥŬñ}—tÀ Ŭ>r$!ႃñ: ö5nìĠöÔT%E çÏ+9F_QCÌΠ· Ïó€{"™•~7>K(7µıÑÏb„pâxCDÜï4Šzı‡)F~M(BĊ5Ċ{ÊĤN Êótíğĉżd2Ò ôö­ÛAGс½;ĉ ÀHÁ'wñ)+ŜRzĴ™™;´Ħ{–_-îğĜ£n ċ€zPh9İÒK‡ìĝä“OĤ;ĉM+šŜħw êTZĠ9iseċú[‰Çn(ÜĥVäzNuè°ö޵‰}ñ_‹²öa’ĈÛO<ġ+xg虸:uŠ`)ûçjT°JĠ*ž—lßŜxdÁz‚ö· >Ù?˘íd˘ĠuT\*gŜ`VOh`ĥĉìďlŜœ~ŞL77ÈşñÙWí4ì‚vQÀµĉF9/IŒFKÁ ŒcXuAI—²İsÄĊнğ·í>àôéİ˘Òċ'/wBÍ~‹ċŭ?pġkóĤtâXp½ĥ•‡ ÄÄ] Áôy{Â/ƒ6ġ(‚üĝ‘SƒŸ|²céĵĊÀ·öo;UŸJ֟ê%ÔIòáâÓ]_¸Q%é)Û5j·Ŭ<ɀu8>…×îĝƒ?ÑAtÀÌñ çÁkñè÷8·Êóë@ż1úÚXšôx%#=e½bOçS§ŝ?ë*òĵ?QwK9c/˜_)ìĴZ!żmĜÀʝ£Gݘƒ&ĴŞRœ—„uÁÖIĦĤ‚mÜÔݤsĉàŠò7€½°’|›à{rñ?—´§6Ŝĥ;)R‘òŝĦ‰çҞJ_z o—ÑT`Ê4œ ċµ”cŭÌf>#¤~9<6ĵÚÇ ŭ´`’Ğ”·B-¸.¨<òĦÀĵXòy$n" !‰‰×ˆ+ïXĵ%żÂC9~|{cs.Sż%ažmĦ;ânLPŞb Ÿ·áş6Z_0RÊ󧿙³âÇżôbÀXKH޽PĤZR”žà2ÁBy"= àŸşsÂy˜e;y£ıİÏ,÷ÌŬ4î)r׉ÍQıcóĉ@·sêÎŞŞaS'L]Y,ú1ÏóĈyC†xrǨQd${Ž˘Ŝ£ŒHÏu,ÁeıJDécÒy²cÁq²ë.¸“lĈ{Ii—òONNwĦ7ïÂ.F/íúɎR”çŜÑaÛŝ#* ˜8jÛV€c(4NN•‰61Q}–ÎDdÒҝcv0¤1=afñğ)Î`ù ۏ·Û·]à‘Jƒ€íößïŝ͆ĉSÇX‘NĜÛ1n˜Ÿ1 Û9•{=ŭlА²hSw†{r0gN:?rĈfMyÊ-µ7ŬIµ—ĉ€?gê3ŭĤÎ mëĵĊëT!8!†"§€—œ àò4I*ÍÙ½Á• ÒsÉç†@>Ô(* Ë%5M ßÚżŬO-‡ŽZAĤ€ç–’3t zÁ@Ë<|!séÈÙ}(X)ü€G!İj×î}ş[š§N<ĝàöf !áÈ}Ǐ ÇĝUa^ĴFCUöiIN)6ᣠUD䨵~ݟĵG“èNĵ9S=£i[(ĝ…v4WĊÀzM—‚mNfU^ zÏ3Àr&ëÀO­ÑZ½4·£tñħ²J]Kíä< &>Êġ°˜/ĈÄ4ÎèĈ< ĥÁ=!C&žE;'ñ?íQ´e*1oëİ3 Jœˆ„#ĊÈ(Nĵ%\Ċ}Ĵmoxöĉ›oÖú’ ­E3Î|‹Ò9ÚÓâ>7^ݘ>uj,ĞiK=ĉÚRşÔêíUUòdǔİ}IښWB=ĥRñ ç0se,×Ú(r0ÚİQ t,=NÂLä I3Ĉ¤Z6µéöÑü`îòĜħğäáà¨+R ħ 92%\´ïJ.Ĥ¨ÚĝnësŬvÛm} Ä(€˙6Uw[°WT>Ĥ)I+2PʅŠé™ó2 "älDzÙ8* (­Ç-2ô€oŸŞd÷í;^iÍżù§3tן—dÄVä€MYĜŠDĈ.ċ¨1ŻDħÌ Aġ…’*°“È>ëӕŜŒ9û¤=Ċ½ÇŜ:ĊŜô`t ^Œ!ÄŞ¨>ïġ@¤ÛĊrc2nCşz˜I!ˆnQ‹!ġżëò×·Ŭ)ĝġéŭñĴn v›7­Ŝ߆8ˆÂÂ;E ĉ‚.tk-ŠËˆŸû–ÊrşÛâik*EÛN‰ñ’žWšÏë­Jġ³ïüy•ŝX)$ĠéQ<^ŝ%FÌŬ Öä€J‚ETRĈB>EôrOÌäLÀ ;*Sf@°ŭRı ^4ŬTÖĊ×8ÖqŠR›O†Żb‡ÂxµŠ‰=wyĞ i+eÉx—96ĦBĴcâRZZĴĠ(ş•N%ñ/ '$zÊù5ĝ`£ä#áVşhjSĜ‰y£Ġ AOÁšQ½Ê<tB '€p>CuŬ2cBŒ˜ÎD‘E)ȑû 9Ĝ%Éöi²ÄÙóhOĴôÓkŽß’À§è`¤F“$WŸvi!ş1ÏJ *ëP(Ĥ ˘s­Â‚DW Ħ…™˘`„öığ\—Œç|´nÒĈ‡Ìr.ȁ @ŒÓtšğ*nËTó;–‰ LSJGFħ–l‘ÏżJ{ >úïüġÖCÑeı¨²ŸŠĞ„Ÿ;.û·)š‰÷0 İ—àvŠ\VR°PϘ‡XPàGË Ÿ†²Œ ‰–*öò•Àg}žÙq îÁ˜ë‚ò$˜‡}U0`ÂġK²-i#™1ìSɍ\` 3"ÊŜ„ê‚“çÑKKİÍ Ĥ€ig™hh(Ĝ"J‘ò LY Ġ¤ÓĴáY-?I!{Ĵžĥ¸ŻœœYÈyòñƒ£jĴ²î‡Z`—NqeUuż+T…bä!7|Q£Z,$q]ĵÜîkPLj5ÎJ‘ ŞïR bŞ3XÍ*ˁ· á:3T8r#}3‡ñ^„oòä<ĝÀO]gOús3Y(ü&ĉŸ3ʔ"Apg„’ÄT$°¸èv úӕgD120O°ó~İU|$Ŭ•Ĝg‘ğµ*ëiŭÒÖ¨R^  M‚•žtA7 XĊ£Ŭġk‡ ‹Ġö—RÜRö†¸/ÂOÌ(•0}ö1‹‹:äâ`ŠRšR`9zâ ˜Ê İOĦšĠĴöKĝeFi¨§À”'ìë#ċyÉâvu JNFŞ{ê…îwµĵoƒ ‚{ĦĠ”jÂ&î+Bô£ùĞYŝéŸ('ş‡ä €C`ĦôĤêfÊEÀZÙàçċ™ĥ hĠàЃ{ú3ĥk*g_\|r`JrgAlŜ\Xx¸`ġ[Ġ“/2 ·ŽR\HfĤnL£üı²Ñ:q]Ò>Ï|ö%處.5Z˙4•9ŒÔêĤBİ–‹š/ÔƒÇ g€'|ŝ%?“všıë’ñ\<{Ĥ›ÁšTµ4KˆŻáâLDÒBSBKӘ‘s |ùĴÍ\ĝîŭu4|hQgt+İ4t¨‰04RÎ=BŸ-î ËNL)$4&ú1ċZÂı:ìˆ`'×Ċ6ۗŽ¤ËŽ/ pŠòI-¨9PaHž &pŒ˘ËĤRšo]DÇà°D 34Œ\ ˘v•kÏ3†1†ˆ Ê*š#cŞ7×ÖĦˆ{f= PŬÈoÖÑİ~٘i¨{½)•àyŜkžçK“ŭpéÒ-âž^/][nğÍü™É#"虳!mŠaAĈV(tÇ8Fĥ%…Ñĵ™}Vc2êAÇ´URöŭ˜¤™y.ĥ~V‡°kĈÏ8w‰ş?£Ġ|4,Q ‡Š=Ŝ󐕨$Ŭ÷ 8š˘•‡İdYjúô“ŝL]Ï3×Ĥl|ᅀžNğ9,ÑàĞĝı›ÒÌÁĦ†ĜY˜àì9— |Ż‹n=iQ;µ`4AOœ”7êı5Ä£ÇÍŬ7Ĥö,ÁËqôАXIgˆ"R6&ĥÏ=OƒNHÙÈÀ(ŽXĝ4_ŜJïòÙÑŭŝ<܍xÓĝHä—<êÏ'?”y”‚Qˆû@Ͳœĉ{fbˆF†XCçĦŠIž<W°hş…Î{Ë mŭL½ìësIa;mò,ÔÉPS¨C Ó¤LUÒĤ[Py|ä"£ĉ Àá_öéÈ菽#SQŸ.E8üÓ,뒖<˙TĤq/ £;£ıiO½b{)Ô$~SĉÙÒ+Š1ÂKÄryD?swœŠÂۊĥİò Ú2Bç‰ëèdTgĦJݽdqaZÑ-ĦWĈÊ9ıX”( Y7‡Ò”.íıvîXêÛș²ÏÔĉĊ×Ċ·C—.:Ô' ¸ġïL&”OŒ˘ñBdħjqĦ¤†ŞîısGĠèT 0<ñIöTÁ ÊᛷEx!TëĠùiŽM’óŒ9†7G[çWùĝċŻglgHp+méç–gKËD狘ñT<]ħ2äkB½¨/[hÈ9÷üK@Í}QiŽ*MÔ*ġ^T*:ĠW_ê 5D ÍMıˆv˘ĴÛClĝĊ¤YŸ>}.ñܚÇ^SĉqĵP WL>6ÁÑND8OŸ&Ndĵ€ĉ~H4kji`eL-ÙU­ù:îOƒçIÖEJS֏ï÷Ŝ[}H9ì‹ xхLŞÓŠà˜Nž|§³PäœLeüjjŠŠĤbԎ­@òÁ6JİŻ—ÜBÖĞŻÓ$´É¨×†I#GVÒëY?ûòUğŸ6$1ˆ‰3”.˜ĞŜt^‹à*N&0Ĉ…ùI´m›ùĊ4wçş c#ÉĞjátjû ƒ­˘§ÑL@-‚ij€CYa# XÈRĝÛ5ÏlĦZHIZ˙hĈqĠ<ĆGÒt³£$Íy6[)ħ_Tİ]ykÎ_Wì`˘weŭdùœxI€Ž÷j”ٝ?xûœŻwĝlS#hĴ—³J¸aL„/Vmı­dċÑĵ°=Ċ- YĤ~qw8U ‘›Y=f‹omù-Ż6‹îŭ۝5ñ#Ĵı%fD,'*ñ€cĜ°~Ĵ×4ÓT£ ü §™ûòn˜^Ó 2Ö²ÌĵÌzAWBİZíBqbìCôÎQċdv5›G;ĈĴ•…ÏsžÊ[{â3O¸%…iĝ9†w µ;ïdq„fżÜözÇ7Ò9r/úĦĈÒş N0Zò{›((Ŭîy˙Ħ Û´éÖ­Ûŝêz².^z³™28ŒÁŒ!<Œa]‹T(µĝ=aÑ ŻÊÚhꋒßêĠÊ/> ŸÊŠ ^Ċ „_Ċé/„şCT9ÎKùĠÒ¨$–Ü2߸â-óAö-Z;­áÎü-µâ, €,\û‘y::‚´c°Tż2ş$)kéQ… 3$âJÒ CI*òħ! XŬ.%zñġEĥö/ŞÌ7ÁŽÁñêµ ċf+Uy˘Q:r?š)´Ü›RİdÖ²—eĵo·É‡/Ò/“ĵN ÌhUVÖ²fó[,;:şwí` Ç\lĜÀYêĈÍĦüš†*ÈJEw4vp‹À×Ïà~O~Ò,ñ?3K1’OۗĝÑAÁú0[şùĝ&ĉ‹£4 ;[ğ)Ŝ=Â|2VLŸĥ‚lĥ\ži)¤îfúô‰h Ïkĥ‹v­}ĵ|fì¤>£Ö Ç÷Ŝs'fµŒAó“ÚhÉ&ßO.è4ħ!ĴúçŜ4yùċ™pEĥ­¨è0“²bĈeÑHB‹/”·1u݆`%SYE߆UĜŸï‡œ! ډ…|çҒ[ÉĤ;ŸtìÌ[ñaĤ-™£ÄP&ÙġiK‰*÷ĊÒĤ‰˜êĵŠï3iÒÌRfiĉ,ß5ej 4OĦ‘:Ó萰îùâêŝÜoy/rŒİ5jaĴ‰Û˘ ı' l|áúqM›O*îeŝzŸ>Şĥ_TׄuO¤B#̋ĥö]Pò×m´zLòP›i->½7ß“eÓĴŝôÓOÙuƒ%K ÜŬÀM7šıñ@=^°œi0wĴ)˙6=Ġ÷pĤY"ŻK)ı=8zˋ[ö:ÖżûŞérVmjÌU"6 ÒĈa3ÄzVܢ_FܓX;7JÔZòâ£9šÛ¸˃í³VÌÜLjžµûÁ/ÍÑAñ8 ´~úê'ĦŸFfıH í|l‹|:LM_Ôà‘ÂÁ7 .Ĝż–5¸ĥFP}–k )îH@y-Ŭް Äıs„s[•ò²+pY&ĈŻx˘óó„cK– Àŝ#;›^ġ­~c´Ö™%CÍ7°FV™…˘`Ş2ñaLkŜӔ!ĵ‰ϞOZ•×%E+7{mÚÓŬM}Äĝ!²f ”Ĝ„j”£hïcĤ°êUşġÉĊ%í÷ĥgÉóa$j†İ—”yǎ=~ÌwèëeµÒÌIĞR’ĴŽŠ|Ï­äÌôeç­+î3ïĊz²UB:z¸ú:Żï´fèR/1‚]“)Ö><’‰ FŞÍ Ÿ·\È_‘ît‡S:“_@S÷ôUĞĥÖİ8äëÌĴbıOm‰c&0Ñ˘´ö-8ÄİLmĜ’ŜÂ1Z/ËrYJĵÔWhЉĤǕ-şátÒ0Y>ĤÎ ¤×Nà #B-^ĠÛT´f”6HÑĜ:Bv­Ïċ¤˘„A£Ż*şNÑ %_ Á:$M!ˢ…c‹ħurVÀ%­÷ÉöeüL/ö…Äu(Exi•E}J[+ÇRs¸rżfŸġ­.d°‹fğ¨ğHğmÛŻ@ŭ¸9%Ħ“P.–dĦÙŜí¸µióv›ĠÓ=nÁdşĥŬâòĵ4]êE!b÷V,ƒísDβNJ¸fħ¸qs c[h+S‰ž uħ ¤ §Îmh´½Jôes+d„ ]ĤâóĊĞ>a!zìe ¤ê`Z´™HDŒ|Cş†²’y˜înÒraƒêP˜&Ĵc4ZÀv+=OW“YñÌĤ^-ô„µW§ HVìĦWp_ްÀ*jìc5á]·mGŽ“B)¨$à´Ħ5Éʄ‰(Ê;ÂÒì"~sQ‘˙ÒİJIš,·>„>5´’R6xç#§ĉP|Ĥ߆ ŭ†Ëԕkœuâħ ¨™l,yl[7è eegóI]vx2Ú: iÏ7Ż÷ĉ›3ìóHŬ‚uš}’Ilôf‚a@rœ%ìpƒ0ùĴDzäjZy*‘•uIDAT€ÇŞAµŜâŞX & âħx…ŝqŭĊĴ;mĴ‚è?é ¸^J”§³è­…"•"‰N£eÌBX´>^: Q şiĉ£&?Ú2Oܑ#}5RĜ‘3ÓİŻüÜÖ­Œ”µSİİ™^sħèN™ĠßOm_~Ż‹OĠ [€gböLċ/–Ž4 ĞxÌùüò@,ġĊjA{…‡ÉMêi” =üMiÖ0(\ó”ì0ŒÉúъU4Ĉä‚ ŭÚ—ĞĥKHnqBàiG*Ĵ$ߋ/ĤKTRŬY7[mQCâĈ\Z˘B­tëĊ’š‹“Uî8ğš-îIĝ =Ä4ĤuĞwmİ’Á§-İd/E>ÁyÙ79Ĉ}¸ŸVµĊô I)O+´Żv2&ŬT‘ZᏂr´ò eOl4y›kìgïsB£ÂFĜGĝ0ò‹mŠÏ™T¨”ûô'¤˙ž—é4 E‡Ôc tƒ‹Ħân‡ü"ÒÓçUş-nyĤ_?Ö?Ŝ³$¢$jĴ%£WQШLÚŞĊNò5Ú4ÇúşÓ@Ċ”§o Fi¸X?뀉èe;bLçEċĈ08p\;ş;İI ĉ¨*„·Ċş¨VuÄkȝ ßòċ§½,ĝôgٗÀçıà[핢­Ħ§ĈJݽ'Yì‹|ĜÖ ³zĠĊÍ´ó2‰œòZšĞ˘Ÿmh4M úÑÖI(&!ìç‘|76í°’FÂzŝêÀgÑ Ë-;$J3çv&Ò0ż…ŭS‚Ä$€.µ/Ž£ècë4eKz“9½uà;ŸÀrdi6‰Ûpħo÷*$ħÒlVš İ´ĉfÔÜÚ È(IÁĞ0=A/á˙•á )y‚ÔŽú\zŬ23ĵĵçgĵqIßêR³-0Â$š8ÇıĊjĵ˘d0=|´ïŝ6 ҜŜ;Ÿ”Ĉ‹Áö%³ĴóŞ@*LÒ’0nħrâEcÄÍgġUGÑĤ ƒ„Î_óL$ĈEB %ĵo9×ı ŒI3•f=ÏéfZœib>>ß>^}?DVg/i-YVĊÏ tJ°ùäEx„˘²6äLğÙnšE-V_ĵÓŝ3öğ<Ϝœg.çÒĞ$j`ĠfĴCԇ38J²h–Ÿ%ìżÇ³ŬaYLòË,³•E.ġĊħ›q1üYûÊĞL¸‹ĥÌ\Zıħ!^ô‚Şô­ Ŭùë_(÷Éöyà§àÖĠŻÇ6íK§ LêşúÊÀ—ñ!3,Û@Rñœ.ĝĈĞ1çEÓ[ĴÂĦµŞ°½fBf‘KÊĠĦN3GÈOÀJˆš}$JÏÉéI-ÛĊ)ä‚x?É[?ò?„/CĐÏNW"Isօ)ûè“äÁGÊ+(ǔyĵÚ\:#Ù°=SeàÔáóR­ŸÊʋ!ôş YbLŒ'ĥNö‚a˘;cY׎/Öhً²nVˆÀTvbÎr!$6Ösr__l†ğÇbğ>eù-Wâh]ċ+œ-ÈOÄ  şÒÊĵ˜żôAoĤžg ]>ŭ²fı´´˜0S³ :‡Ò€1ĦĞ£“ƒşÄ<*7“‘TŬòĝ„†ëNÙ4ñ s<…aÒh pz‰,jê|ÑC—n“) Ô b÷äKςèʏĤ7ȊĝÔu‰Éè:Èä™ĥ+ Œ`ÂÈ ÍrĈë8òUùµ‰ÖÏ×çş İ›^ÜêMŬëÓé=EŜLá1ek’Êi*ٖÛä]>ù‡.ħo·Ä\‘$!…)4,E½›Be[œQ0vşDÖĝOò")"²3@ȁ£Äj…†XS_µ£ğ;:›£ÇqĠôl½/×IlÙW1-ÏsJ킆%ŸÑİ {ÄiK÷ĦFŞ:ˆN2K‚[NİÏLkŬğrİÍĥô&ZÖs6ÂÌ~–ñ·È7uˆl‹F%É>î~€­o˜ƒ]dĜ'3ĝ.î¤èKGĠ‹Ìµ0Ï"x*éÂ2ëPs·#8œ_ğôıĜÔ!Tù“KŞ]³ú°v°e7£IoôöâoÔÛŞôş1`éTÍfJM-žÚE[Ġvf# 8*İĤ:’íƒĝxz`|ôĵ·’/ ÛpĜ.*‰fbÙû×ĈR Yĝ" ^\¤›LÌĝ?MWĥ&ŒT„=qĜ•xŬÛè~™VŠµÍ˜ĵQ›T˘^M–¸íjzÄÔÙ!úUa÷úŸ{£ˆ•ü¨èâšÊìıƒ €Ë}Ê"LÚ46€£ FÑB‹ŜŸ:ݵâvíÁÄĠGU£8Z¨î6°-ŞĜeĴˆRŸoŻB~ĉJf8—Wd]é³!P3RX7Œ|Mĥdğ0M)×<âħÚÛHC˙µ­;;ŞĞö­b×1îI˵Ĉİ,ïr&Ldß"¨J/ß&N%ğŽĜzYê?ÊÛŭîï\ÓvY…6·4Ì­ĥuìlˆ£ŬŒ˜ë Ĥ%üÓM-vg#›ë #ĞĊŞ9Û^O²zu8ç(ôŸ:ÑRΉB5Eĝ"Ŭ¨Ş“ì„aĥ!ѤWÙ¤è\Á)_ŻA.ĥ&šMŠ™Ù `ÊÊ$£BÖkKn³DbM/ĉ@ĵĈú`Ĝ5mé™ħ2ÁpÜ5kĜġ­“ċìkĝ 4ÍJ#7ŞäÂËgĵì{aċŠÑ£÷¨Q0lżŞíV^ÏSŸÂˇ½8t!ú³‹#›„  –+Â4½lj3Wğu)a9.*İZK§ ġZ ÄÖ'Úks*Û>+S•ĝĥaÈĥ@,™MÊë8Áôġ=^G7gŬŸ‡’AÑo5:+¨µps!YOK‰í?ŜH{iš†òŜZȔGş}Ÿf Ó>Ïà@*I”˙·~ŭz6O¸žIÈj\O.|èʖžwÀ:lÀᣳŠ/’V÷ĜJÛä† hYħ ue] B |󓘴bôċFiާ&ĦA䂚#“÷Ĝ(rĞ÷…¤YJÀì|GÍçdĵOS—rEĜIÓZċéiŒ¨ŜñɍÜ)Wú„Ĥ*˘qĠĴŒĤŜוÖÙµ+ñ6gÂZ3… #‘“Šq_!/fô´KòH:…œù.݄⑊Ĵ›‹ ÎAC+i“] =Fj4dÔ¸›ò)y/°/ن1nòGâ‚/+Òı/I/?WaJëMŠübÜ ï >­qğq@B- ÓÂâ™ú4ĉ‘¨ĝà FK‚ }NÀRñX˜%Ù½¸Ħ‘m0%'R{^ŞR§}ŠÂ˜ğ×P Nnż•½NöÚSĥÒ,—8şĴj%h@0ÄhĊ.êŽHi>fXͧÙ>ĥ-ïjıfيlĞÒğóYöĠbpIĵ‚%ĥbOċV ´&_²]éâ]O2›çàzˆ_íÙ>@›>óRì†SÑvN÷`l… =i{ĝb+ #%ĵ ɒ[>Š@!™9“Dn!Âú…Ğ)씁jŠ“ħCᜠR5.î(·ëIyR›…ÙfŝꞋ~ §veğAÈġÑxqœÍĝıžíڀ1òF0X"§}ĝŠH_‘pڞ­RAĞġ†ĝ)&ŞSü½âiÀçSĦ¤üJT˘ħIÖÏퟍx†_˜„&wÂÜσĤV‚Ácż™:†*ż´:œû$jnP{ƒċ+}{6í*{á‚ŸÜ OUXÇ* Ù\,ӄkn™°ϤJÎe2AIş3Á3Ž˜ÏÀK ÖQ -Hğué)@íûäOjEÏZʸ‘äê‰ĤT,Fè­Ĵ“8ĝĜë˸]÷TğŞAóĥżÔ'ퟘ²‹›a~R4ĤDXŒĴèàêë]Ù>Ê]ôë>BÏ2Ìħ€ĉ(´Íġ”:aúÄÓq<}B|Ç Aĉċjœ°;ІooGô6 ŭ GÍ`DÊï%[Ä ŭjx˙wß`„ób­ÇIENDB`‚gamera-3.3.3/gamera/pixmaps/icon.png0000644000076500000000000000403510714675706016334 0ustar chriswheel‰PNG  IHDR szzôäIDATx–Yl\WÇ÷Î>žgĈëxßcì¤N³ĠQQ"!BSjy(•*Ñž@Bê B˘”J! ,RT‰EEQ”6t 5qb;qâ$ĥœ8nĵe<‹—Ù÷ı—3×ñÔn2İçáŜ{ÎŭÎ÷˙Ÿ˙ùïxôĤŠ)ŞÎ£S+hW1˘ġ‹cîê›ĦîùË.ġۙçĠšÜ˙ù9hĞ”=ûş‰$â|ġÇ0¸ġ›nY…ÒÌM;y×ŭ¸w•·ÙƒÚ˘`ñXÈ­Ĉv2ġ>›GU@s wêˆJqú,½Ü Ï ÷êîsĵӁ‡)PVÎö"Ħ( ž˘U×L,ߊWnž´ĠhóğrN´ys§élì`-ÎÈÈeôQ=³‚’V6üZAî•QfE?² eÉ}$D`\¨ê}­Çq+ŝáÖżC²IôŜIëŜFz[şY˜[Âì1uÄü-„µÓÂÂO}"M%tMzòyÔß IHÑ÷6Ÿ% KÂÇ_›p´U˘ĉ ¤.§qîwâéç›癯cĠ[-z–Œ>˘Ñ(ĥ6†ĵŽê—\jèäiC Û +R‡DôċlÄé6[ƒPÇŭoôĠ×Nĥaŝç>jĤk9ò³!ħˆ4Ïœà|r˜DV,)7’Óä& ìŜÓKÇP ­ŜFœÇTġURLW9#“IdĜ ġiÑúĴ ü‡úÁj˘Éûl{ùó·9ñÖÓòĨ)Eşu]\K]§W°GĴ˜ &tvl˜[Ì$“i²wrd÷ähooĈï ’òĤ /Š`½UŠ íc-zžêcŜżÄ÷“ĝŜ ĝR=ğêz5\.GA)°RXai7££ˆğÍĈ­ğT…8 äIl´Äcíŭ|’öŠV-v\ÏV‚ıD@S|“€ÖùÚŻŸbdé2ĠUf·çèW–Üds”‚Âíì,uş:$U@ˆpŞ2àeöÎǒëWŒœçÎO ŽÇí˜3iZ‹hY˜ ,ċ|Ôéë0H;ëjU{.[ÍûCbc2X+Ì8z*hr—P ;#À7ÀĊ“’"ƒĝÇwϖĜ&W“,ï"n<„•°Ĝë%ıkı0íû„O„˜¸ÏKôuwžŽR_W‹?d)żŒ³ĠA! pcL$~EĴöM*ŝÚĴÍĊí+µÌ|–Ĥj/SĞ7Y+ĴÑkĜ…lĜXÊíÜ,>e£M”ÍZ¸9:‹ßH×àZ”FbJŒ; ‹˜&‚ïŻjóžMĴÎq4"EÍHÄç‚ $I:ŒèDÚm0Té6vħšXÓL])'"PMM& "3ñ,˘\ÑÖÔDF£QdÖÚVÛí„˙ŝ9Úşš ĞaQtDŠIÂ\›H]cżóqQĜu¤“ä`‚µKb›|ìŽ l q’D(…’½wDo÷^ê•' LBïŻliäZäş|7ëċó˘Ĝ&¨”bLb9À˘³\ï%!@u9“(P[!jà&}6ğ vŸüĊċhĈù‘gÏ@6šáôĠ·)ž°GŽcìĉbzY&œR¨9ž!›dĉ§}Œ7Aj5ÍÊ;ë›àeß,(gqá[—ş|€jO(4zdD­\Käàï3gˆü'ĈÊ|ù˜DÌò‹*Xí"Vw:TÎmiĵXʵWďİ•I˙M-­BVʑ…d^šçpġ!ĈÏ]ĠŽ^É#*bĞ•ÈhŒL&Cè­uÔx)­(¸Ül#~3*]xw”ÚéâRŒÑÀûĴ{ħËv›êiÛŬD}ކ•˜>Nèí5)ĝʂ÷ċZµú9ݽò:SoÜâP>\üˆp!ÌRl™`p…p.Bhj•Üİ|ı˘³mQ›ÏD%u=çdiΏÔ,qöĠ‰Ĥ˘4}³e|Ĵ#(a…äµ4êŞ\Ü9vÚ> |°pġ¸lYÉŻ‹îşÊıïHïĵĝ‰Ġê¤Jüq`5¨T½à@:, ?½ġì”GYğbİ˘ìĞ˘ìĞ‚ĊFÄPe—¤âĈhüMÚwĤS•!úÒ6ğ²Î‹? ÷f–BùĦžŠZsŞĝ·ċ-íĦ˙Íe²iÊ IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_back.png0000755000076500000000000000320710714675706017317 0ustar chriswheel‰PNG  IHDRàw=ĝsBIT|dˆ>IDATH‰}V]l\GŝĉçνöîÚħqjg£òc%*q"™Ÿˆà)­ V")´é ¨È(ÁâT U@P[%Veç§­‚‘R•Ĉµk'ŽíĤv²ħëµ×›ŭó™{g†‡][…69ÒĵŒŽoÎ9ß9gîn€vi!Ŝ¸OĴ((w wÎĜ €° ߀ÛpBŒsĴ”şiŒùÑGt¸ŻñÚh`` 300íû>[[[‹*•Š* rffĤZ(ç§”rBŒÏÍͽ7‚m ġÁÁÁöŝŝŝΞ(Št.—ËçóùġżyëĊíµÙ/…aH)H’$àœ'J)!dasñâĊ…"èúèÑ£ÛwíÚĠ%„•JV,+ù—ÇÊ£T„ĝBgñÁt:m8ç„Î9I’Ä•J Rİĝ­­­oœ>}úÖ {àßż˙NJMOO/ /OEŬŻnßڅ[Ċ}ċ!ñ<0Ĉ!Î9cœR KKKa†çOž<ıĦŠ,788Ĝ{÷înç8çdbb"wĉ̙µİ¨ûĠǟĝ!]Ç­â:::¸ïû„sN(›)°Ö"I×ÚÚ*”=&xġ]Lg*•jĠjĠ+W,ŽŒŒÜ޲ç~òô|÷_Ä×.ŝŜŜ΅hlF`­uI’8­5¤”ÙĦĦĦw9ê:ga6›m_\\\Y]]­ŒŽŽŻŞìٟy Ç?€—Ŝ\@İpìèħWv?üÖJe,J›ÔĤÎà//üñ­5‚ žçm¨7‘;pàÀ=I’˜jµ:u*UeÏ˙è‡qüW+G8]Hħŝ}èúl/ĝ5ŝô=è ê+H|v} 2™ WJ9­5aŒupÔ;Ԇa(––– “““+WUöüħg~ŒŸú<Ŝ+ık\È Ké­)X?À|Ec)Šñn)Ĉkc7 Zğ.ÒÒ„NJI!Ŝh(S*•dR‰^+>ùĜ÷ñí‡öâÂ{kx=á×ëàVYÌ-WñüċE<òÉlmnÛsù2V¤qarÏó,cŒ0Ĉš6Td‹Ċb4??_–3˙Ÿ.íßxá§şQ­2/eëž*ÁüRÏÎ/€P Ê8ˆcpÄ! CĤµ!(G}x…BAĉrıè/ïŭêk#ż?RïGïnÌ dRli§¸wK3 u`–`vµ†Ú:y{ĴŜPA@7¤k­5ġݘ™™™İ†aH3™Lòäc>ĝ‡Nœo°1€û{·-na&§ħr(\›\Ä%p&‚]ĵG}ŸHĴµˆ¸Ì”…­…B!Éf³ŒsN<Ï#ż:ò/~sbĤJŭ¸ïŝ{1µ°3ŝÔüœŒ1ĝU-E·!„`ÖZgŒq”ÒŽú<˙Î9âc„RŠç~ûóŻ?ŭÌŻ†`jvX[Ì^>{8Ï÷}_RJ=ç\˘”Ş)h£À„1ĥ@HÎù²Ö:EQ µ‚ż˙ùÙGĞ£'€ü" ×”RB)Œħ€B„ŽÂc>­qÎÍ÷ġġ•((n2ĈjJ)_kMœĞïçœs˙feĝw0+KĊsÖZkŒ‘ÎıXkM­µħ1F[k­sÎ&Iò6P0ĈHBÈ4!D+xħXÖZläÒ^?÷Ò·Ö'Ï˘áïŒ16I’XkÇq,8ÖI’hcŒĠZ_êíí-mÀÜÜÜûÍÍÍRİIkí’$Ù<$˙ŝçÈwjïŒ Žc£µ6ZëD)%”)ċşÖ:‘RĠÓÓse÷C+óàÁƒÛ9ç}]]]nǎq&“aétšR)ÖÜÜ̚ššhLA=Ïc AçœĠZ_ú 8P_è˙c³³³ċ={ö,´µµ!DÊó<âyi–lÀ9GœsÎZë´Ö×£(ş°sçÎÜ˙ŬéWjnkkۖN§;RİT&•J5A@}ß7žç•)+Œħ…ҝ0ŝ xEj_FWÔIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_cc.png0000644000076500000000000000233410714675706017001 0ustar chriswheel‰PNG  IHDR szzô£IDATxċV!sÛH~—00(0(8P`pÀàÀ‚€‚€û…†ž›@ƒύA€€€€€€€@ĉFÀ`ÀNG“ğï{+ÙRcµÍµ‚d½ĞŬ·ïûŜÛ÷VùÙċ—ÇàäÄû·Ŝs_>z½·îe€àôJÊÒJöî*rĈiTЇûb *ÌXÂíS—r4Ĵ×Í ‘ĝ*–ÓSƒŒ<Ż]éYyvŠJxÑğĴ5+qjeğ;fíÀħËép/[CŽ`fċBeÓ#ßGâİgpÑ"+;xŻ˘ĈĦ‹cħ/¨0“ġ]½VġGşnL$˘b‡ˆ§Ò ^DÛıħÁĠŒ&˘&mJ¨ ŸÏİ=‡^ôzp½ĥĞş/m†´G£GşÊĊP=çȗ$ÍeğÍt™8 }zïŞ=‰È€Pĥĝáúêşε}یDÌ́sµòÂcZĞĝ’Ĥ¸ûQRŜˆ>M#çX ¨Ž ĤÂĞà\ŬàalB›À@„ zÁËä‰ĝ½€#ɲH?Hx4”<[ÉâÍS1ğDÏ^£À# z­N,GGÁıżM rTˆ$4)‰€ĉïҕäyŒ-.ĴtPëÚŜ\Jp3tnjÀâ˘œŞíĥ…Ÿ]Ùm—ġRò}ş5[ ‰†xi5_³á|¤oğáïsÔéYk­àžZ Ag­Ü* |Â#fżcžbp§ë68çI†-ê8sê4ċAx½î TDHÀ÷+dì&‘Û#àMͨ4ç?·ž@ÑUŜ#ÜŸ`u2˜žOßÛφöc çÖ K‘Šëù™#@˘Ç}ÜÉIŠÏĞqŝÍÀ‰Ġ"À JMd1¸ ü’ÄĠĞo 7Ŝ5 ĥż˙:ĠKïğÏ×ùî@?à?#²ŬÏ{²ŭWIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_choose_image.png0000644000076500000000000000226310714675706021037 0ustar chriswheel‰PNG  IHDRàw=ĝzIDATxV_h[U˙Ü›Ü&lë-£2†–ˆs­a*•QhĦV|ÑŸd0DW˜"âƒ|R|peŒQ|Q°­ĞĴDF,“UÁ?ÓF×i£mÓtْÜäž{üs“Ô°Š;œ{sÎŭŭßïûs#dŒ)!Êċ2\ׅçyR˘T*ĦX,˘P( —Ëaaa‹‹‹˘ Ìf ħX ŭŭŭ [”Ršp{{ÙlˆF£*‘Hܓ¤)GÛŜŜ0j7]]]`Ŝ322‚P(¤fggï"iJÀ‘î6˜ĜĥmD" é™ĴTsss $úwCĵÇÛgYÇÑvŽŽŽb`` !²˙­ ĈÇJĤĤĤÑÑĦÉħ²²˘Rİ”Vr_ ˜dxxĦ 7~|2µ•eÄ{şyI+ıo½½½àŠËn#³–Ffu ÉäU|1ó“4/Ó&YQpݲ‚Á ĉ/Ŝ#Ŭ LòaßŜ”܏!qsyİgW‹ĝµŝ£˜|ç4%Ô4w3¸'+êÀsK …ˆD›ŬŠĥ}{ŝ€ŜèÇ[ŽĜƒO{‚CÖjJ™€ĵ xêr"ħLAŠd`'¤úOŝĊç'Oàŭs§°ùġYœ¸p ÓÉïêà’@=YĤèyhEs’H<"Ĝi…‚@ÀTÏÛ-è½^BŝÖ&ž;ó%üœòÁÉ2·R‚ò\(Žž@ŭC Ş‘•!”ëGIßu˙ĉüë8ô€ ܅|&­ÁżMŬԛ=OB’-Šì£÷ÁYG/ç£D3İ€_ü ÉÀ|‘9UĦHèô¤€Ġ‚WžyO‰ó2zĝ0òż_Ç /b}mӓaPÒÏòQP W[ĥ£@¤?}SEöRÔ ÌƒÉİ*dÀ"ßKYĜBĥ/8X‚ÙC0z—Ż$$ĞàÜHR”LÎÙo3š0-# ä Ü)$Q˘aäĥR(l"7Ù÷9ŜŒÌ†?säµ1~ñB5ٔd%• *kI9Ó; Š6ó“l‹ĜÓvĥ“E<Ö '·…ÇN˙ˆ?˙¸Ş<²“óĦŞQ³.[%]„Èâñƒĝáú²O`¨0I#H„ö_•HAV+XŝĞ€é_%Ĉ/-`kéZµ‚¨bîÜ&ۄ"g"ŸÄï ²C‹4;EXʁ!иM_ÁŝPvg7:ĉH_A¤3kˆĥÛÊ)ÜdşxĉêŞUĠšÒ´ÂN–,*–ô™âR’9ú½K9Èn¸˜ü¨£éìlG‘J8H…ǽ ›Œ,ñŻi&pĤ—jĠ Êr­Lç_=ŠhOV¸•¤)V+òëiô?‡™Ïê½îÙsÎÏLÂÍĊ=AóúĈĈ&.á§T†ê­:jD—_ìC„ğÙ°ñĝğŝ‘Ûw¨3R€äS˘òӂŽWR+ô×8)p+gè:A•‡ŝEĝÇ÷žçŜµ^Û÷_çżLj4Ş!IMIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_classify.png0000644000076500000000000000113510714675706020227 0ustar chriswheel‰PNG  IHDR szzô$IDATxíU;KP>İZ'ApptrèOPggç:é_pïâTAÑ˘‹u •."(­şù€ú(ÔĞ5‰kOè=$iîmRÛ:Ĝ,÷ܜÇ÷ïܛ žĴ€Ò!>“ä…Ş*¸ ʞÊkBüñħeô808gĠ$Á·|ġĊò}É3|Vi÷>ñôJ¤ŒJ}0FGí³7âÛÍÙ͇&pz|ë˘:53éÚ·Û,L/ÀFjƒÂ‚ S??Ÿ˘d4Òé%JÁ·Oĥ]ùAH玳E² &Ö-à˜Óî2oqżn§×ĠżşÍöò{ÄñĞġ‹şí É)Ği„‘\Ù²ğW–+ĉ•ôĦd2ĴX-Jƒƒ8g‡g!yŻìÎÜÏóOŻu›xİż@á­àŒëÈ>Ú:‚Ë×KaY2Á|2ÉO*Fòċ<9:5Ş*(* ë*c<`½[ˆ*[`û"ˆn8x,S,Ŭ"¤@ÙħsŽ€(uÙpvÎmKë“;ç6Ÿ=ï³ë#à+;ŽÀ Ž$èĆbœÔŻV%˘€~ŻÓÌEs" ~Ğ jÀ,áo€çHWŭF·q2ٝˆ@-RSFĉFœŽlMĠì<>?ٝ…‰@/F‰n ¸S‰˙k˙kñ¤´Ĥ2IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_confirm.png0000644000076500000000000000124310714675706020047 0ustar chriswheel‰PNG  IHDRÄ´l;jIDATxí”Ï‹aÇż3ıìZĴfĴ—ÍŒ@ħŽ-n[J‚.“={‚nA…t²Âí‹x°… Ü˘6D˘6isüĠÌ8Ό;35â訰­Ŝyß÷yž÷÷yßg^ sZ"‘ FÇAär9D£Qd2jÖVÛ,§MR:”çy4›MH’„ğEm™Ÿ 6 ĠjÉd•JµZ @ñxĴšĊ<¸0ÑÔt 0$‹‘qg8&ϟe,}F,mLFÇH$BÒ鴞ú¨Ŭ˜ğŬnt:-llĴC‹5ìsÇ`0H …ÂLEšêl6KBĦ%ĜRħ(Š(—ËPeŞMµÓéD>Ÿ·Œħ‹EU`ıëŻÑñLuOTĊƒ{—È£§%}ûó=îFĵzŞ’Ô'È ¨?™żÜzŸÏg€5£İM‹‡÷/YîC– ŠŸš¸èu@îȒڕ É6ôħµŭ·nşħpŒĈĞ×UÍ>äM(–߸Šġ‚S§]û×pv%ˆEûŠ:%°ìgìĵÙĈĉ&Á۝]ìWêşoô3öùVUĜœ÷^S{h5}˙ ÚêĜ뉐ԋí‰]tğĵŜ덞É(T››.ŻÌĝu˙â’}<ÎrMÑËpqXúLŠišĈ g°­Á|6Ŝ'…%AUĜĠ"í1RËŞ¤òĜlRlqDàŝÙQ˜ŞbĠġ<ËAèŝîC÷ ´îÔ§ÖñPâĜĤĜĤŝš,ÛFéËğħ0ë%pĝUoá뷎uÀ¨ġÎísڃr”>ŠÁ!ž¸0xv=áQIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_delete.png0000644000076500000000000000145710714675706017663 0ustar chriswheel‰PNG  IHDRàw=ĝöIDATxµUMOQ=…âT ´ĦƒġĜÄÁ…ŬAâĈÔ-?ʄĝ X¸rKŞ+táV.Qˆ„’jP‘Ĥ"5ĥöÍóŜyÌ£íkM£á&'ï9ç~ÌĵNÙMüİİ)·T*Ħ\.{hçóŝħ Ñĝ‹P!¸ÇkzjO9J‚ùùùĤe5eÒC $“I,,,`ffĉ;í^!ìJC„Ö´uONNÊl6+ÛY>Ÿ—ı\NF"™Éd$‰Hzšq™`şÚ&´êe w[8áp–e!b||‰DÂ˄Žîb„~‚ĉĠ-zĉ8ŽïĥY„(“v"}ô°×ßĉ VfT*…ƒƒT:? 89EG* nr'ĥ¸¸ˆâÏĜŬÙÂŝ—=ĵzŭ÷î?àGC„^Â˙e ž q/b{¤Àäl\vŭú=(9;ereĊwġ(E ˘òµÒÄRñìgÄcĜ„VfÔš›˜€ìî_:ñŸ?EpúĝŒĠ„ĠЃ>9Cž!PßäT6‹9:Ä"ĠwoàŠ*Dµ ÷ÙEN{·V_À­ĥï›!Pßäħħ1ĝ"ÁĞ× 6ŜCno7Ûa ²VAèLOCäŝĨπŽŽ6ˆ°gĊ‘ÇgáıKY‰2_GĤĉà˘=ŒÙµU½5›~„‘Ĝ€ž˙Í1ê3ÒôˆÍ#çèıı=™—*rî ġ€Ïµ2C@’R‘omhr. é_˙Iä,àv*Ġ4ıĥbk³Üş€á>L/?Ö"ĦíŻ^&gàşê:稂é´jhfvôĵ×PŽx86ˆäÒC%²ĥé½Eí2hŝ:‚T˘*ŭ`ÒBdR8ŞU‡|UŽV•E•†żîܧ=\ż}—+|“°NĝF¨1ĦaÎQğGô‘GĈ„ì{bj”$èúósQ‹ü?ÔżŽ7ˆ&xÁ7gÀ¤QÂ%żè,Ĝ\FZjk‚vĝZċğƒıNßŝUżÀ ñd‹IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_details.png0000644000076500000000000000020610714675706020035 0ustar chriswheel‰PNG  IHDRÄ´l;MIDATxc`êà<˙)Ä´ F4A ›Iİy¨úÑMu1jĝPƒ7Ĉ PDj„, tÓGÓ1"l¨Ċ˘F£›A-· sŠËÈĴHôIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_file.png0000644000076500000000000000166010714675706017334 0ustar chriswheel‰PNG  IHDRÄ´l;wIDATx­UI(ua~νYp)c™2e‡L Š2Ċ‚" ĊĊB6îY‘ĥ,dİll IYĜ(Sːyž˙{Ŝş'çşżúû˙ŻÎ=ßù†ç}Ŝç}ïnZCCƒ†ùü÷ĤÏÎÎêÙÙÙzQQ‘ŜÒÒò×Al”šššôpĉÛËË ggg`ÄĈĈ˘··WsŬçúŭ xmm ²îġġĜÛۃáONN$ĈÇÇ£żżßmoƒ6›MŸžžĈÀÀzzzi" âáၷ·7"00QQQĤLLŒġÄÄD:==EDD„ ”`lÎ ‹VĞ•CzMM FFF4 żœm_Òwpp04í[BÎòf6í*ĞççgèşŽıı9‚Êœ x~~···† &7 üĞıqqqĝüüÄ# e!½K–l”Áîç'ŭŸ~X\‰‰A~~>JJJ Ĉ$MƒñÁÁ‚‚‚p||,Ñííĝĝĝĝ GGG"×Ñ1Ĉzxff///ŒˆÊÊJĝ)ĈUUUÈÉÉAww·ħák§­­ ÑÑÑBàêê >>>Ĉ´Ĥĵ½½Ċ6Ên`•É‚şÑŻÌfwwççç(..Fkk+XèÚÚZ¤Ħ  yyy5Ş-óPäĉĉ ÉÉI<<< ,,L6ħ L3 ïïïâÛêêj9(éééBÂn·ƒ6]ZZ2‹´ -£›’’‚ħħ1‘€A8·ıı‰››ɀéÒËİİİr@îïïÁÇġ it=H)ĥ··QZZŠúúzħ`1GGGĦ.%a—””$€œceeePû† ¤mUİv.OOO¸ĞĞKĜ]\\ˆé)CBB.//ċÙĜĜ7O둙™‰­­-Ö ÓAu,ÉÉÉèëë“4é 2a‘ȆÒˆ™ĴJúô+I”믯ŻòSúÖċċċN%GÇÎÎhı……„††ÂÓÓwww˘ŭââ"Ö××Ċ³F[ÖĠĠ‰VVVL2YЧn2mbbBSZk<žCCCÈÊʒۍŒĤĤĤxUŠOÇÇÇEknfÚÍ]3Ž´s’Aœ}D„ *Cċċċ"ċb£ShjtÒWŝ ùV§SçŬŭO ›Dñîŭ#o‡²Ċ‹Ŝ“r°IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_forward.png0000755000076500000000000000307210714675706020063 0ustar chriswheel‰PNG  IHDRàw=ĝsBIT|dˆñIDATH‰}–mh\YÇ˙çċŜ™ÜéLĉ%™NÒtËÚÙnİíĥ´B´”a—ĝ” -èBe÷“˘†ô‹JĊúAĴAmvĠú!\ ’V IéĤ1›6ÓN“0™ÌÜÉÜsÏ=/~˜™ĜhÛ‡½ŝżç>Ï˙<ç<Ää¤xxç½P ž%@ž#<`/Àtö*ĥğÉu]€qÎ×Â0\ĠZ˙èi€<€—;ÑRİ·T* Ĉb1ĥııĝVĞUħ¸¸ĜĴVĞÊZË)< CĉşîÜÒÒÒçöuÄ[cccı‘‘‘|ħX‚@–Ëċġ_ŝeéW/÷ĴżV.—Ïó(Jİ8ç\…aè !˜çy˙š½˙4@ÀÇȉ‰‰ŭǏp]×ġ}ğVĞùsssë\Pïû·ƒÑÑÑWSİ”ĉœB8çD)eëġzÜ÷ŭX:ŝǵk×}"ç‡ûϜ9s(NïĦ”êJRğzġꍍ 'żġfff>èïïgù|ž ŜßßÏ …/‹Ñ‘#Gš„á .xÀ]1ÀŽċNœ81h­çœÌÏϗgff6ûúúH6›X7ĝÜÈIïàg?ıĝÁċ˗?M)ŬI1J)›N§…˘`žw˘ GFFòÉd2ħ½½ŬĵsçΣééé­BĦ@2™ rıÖħ7ۃ÷&ÏK.]úÚô•+W>OµĈĞ”²RJ!†&''˙ÍÑö9+•JŜPî§ïŜĝŝf­?ZĦûq÷€M$ş2¸µĝ·~ôU|À›o^üÓÔÔÔ­µVk½ˆÇÄqœ}íCdϝ;WPJéV ú[o൓/Ħ˜‰í²Ĝß>ÚBâZÙÇİZk2>>ŝû™™™q­µĠZÛ0 ­”’0Ĉú8Ú'ÔxžçV*•Ş%F búî*^ٗE6îâ‘/q£ÜÀV ñë‡>àKÀ>9°ş~ŭú—µÖÖu]+„ „^Ŝ)´×ëÂ÷ŭ@‹„‹z#Â÷Ö*x1ÎPÜZk"oò¸ Xƒ÷Ú)ğĝRSoŸÇ8€³gÏŝîĉ͛Ç1Œ1ÂëéşÈÔjµ`eeħQMÀ‚A'z0wû.ĉZ ÀqXn` ĴÓ„mÀ› …ĉê:Àó<&!(Gğż8ĠjU”Ëċ .ᇲGöĝ 8Ž!ĉ%°òx›Ê°´À ô 6‹…Ùќ½­İI,//_Œ˘ˆv­kŒÑíĜğ¸¸Ĝô<ə‹–_,Ôu(ԁÁħ£ƒ8u ½K|mmíëZkN)%”1Q58€†ëşéjµŞ†††<ĝĊxÚHž:òÖ7w‰ûï]‚ïûßÑZǔRQ'rеĥ”Ò Žv?‘R k­ó…WÂĞßĉı\Že³YžN§Y*•â{öìaŸúĈÏ›jĥv‹7ŭïRJ=Îı°­µî˜0Ĉîs‚s&<‘RjBˆBH§ZŬ5˙` ËĞëĜšš„ïûoB˜ëşVJÉc1JiD)%Öڕááá:€0 WcÛaĈ¤”ÄÚöb­…í€&НöZm’LÄĠèôL´Üop™¤ĜxTr]¸³£Ĥ&;ŽĊûÉal~]”ĞğÎß~ˆG/ĉ17:ÈC%~YĈ|ÀÒÔ l-„‘YŭˆT<ĈC%Ùx=teü1žÌFħŭ%ƒ­MâW[·mjóHJáï˙nÚú‡Hom‘ĝĠ Š~·Ç'@÷f¨ìubš[ë‡ñúĝN¤ŜħYjQí8IÁÓükÚ;ŬD4²ˆw£B;×Ô*]ž"ċGËI;k4ö(Ĉˆ˙ žYÓ }‹Ô÷JĊĴ˜Q÷\x%ŒŬY˙…ĠÊ˙ÔĵYñ†Îc”Íĉ‘ÙÚ@:ŞŞS àá-î Ŝ|€X"‡ĜŽĦk}ÇÖÔjĊYU›' WòÀ§i,νĉĦĠBwí5wŬ*Oĝ[y€ËQʧUu%Iôid€ZIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_help.png0000644000076500000000000000125010714675706017340 0ustar chriswheel‰PNG  IHDRÄ´l;oIDATxµ•ßKSaÇżÓmg k ·’Î&ŠÍmİĜEP7u^ˆ]EŬE”xF]EIè…w„EPŭeWQkNÒÊ5ÓµlÎ9÷ótö´s9gçl'½pà}Ÿçù~Ŝç}Ŝ÷áhP{PçaX4"ϖÀr¨üħĊ ùr‰uM5yC5í³ĝ˝‚Áh‚Ž1B§7BËpÀÎçx)é-ŞÂ™éŝ›eœ “½ó(é &™P£ĠÓİиx‹,Óĵ_#£lï îŝËjîyŞWY žx†ÏóX?ç7­ZCŜ·4=~ܗĈ`vġH²#ô­ˆíÔ/°Ù´ì4•6“B³Y ]#SŜFŠ’Êʟ^3Ùà:>€&НöZm’LÄĠèôL´Üop™¤ĜxTr]¸³£Ĥ&;ŽĊûÉal~]”ĞğÎß~ˆG/ĉ17:ÈC%~YĈ|ÀÒÔ l-„‘YŭˆT<ĈC%Ùx=teü1žÌFħŭ%ƒ­MâW[·mjóHJáï˙nÚú‡Hom‘ĝĠ Š~·Ç'@÷f¨ìubš[ë‡ñúĝN¤ŜħYjQí8IÁÓükÚ;ŬD4²ˆw£B;×Ô*]ž"ċGËI;k4ö(Ĉˆ˙ žYÓ }‹Ô÷JĊĴ˜Q÷\x%ŒŬY˙…ĠÊ˙ÔĵYñ†Îc”Íĉ‘ÙÚ@:ŞŞS àá-î Ŝ|€X"‡ĜŽĦk}ÇÖÔjĊYU›' WòÀ§i,νĉĦĠBwí5wŬ*Oĝ[y€ËQʧUu%Iôid€ZIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_home.png0000755000076500000000000000212010714675706017340 0ustar chriswheel‰PNG  IHDRàw=ĝsBIT|dˆIDATH‰•ÏKcWÇ?/yê‹ĈÓ45ŝa.´ˆ-…ħ4 ÓEé .Z**2ŭşi3ûYiĦ.\YPt²èÊBKL­–İoò¨fìL~™§còò’Ü.òTÛ’ûÎù~Î=Üs.Ül. Îêşœ=×-âLÜNp3hBypp '''Bïo-˙˘ƒÁjĤŬ€O! ápX†a999)ÇÇÇ%0 ĝo‚Ô¨f_µ>!D2 ÇI$$ x<ĝŭŝ]à- 9é•ġÂ˙@ñK(Â0 VVVœ‚Á @€p8ĵ{||ü³m6Pŝ7€011ÁÊÊ ñxœÇ£Şn†a0<<Ì…Ba7•J] ݏtît:Íúú:†aÔÄçffxod€ß"——ÙÛÛCÀÎÎεjI”İİİV·ÛmŻŻ‹ĊxòäIƒĝŬğwéììDóxèïé!²³C&“ĦŻŻÇƒišrıÜ÷@ÑYn§,Íċrù|ss“íímž>}ŠŞŞ,ÌÍ126F혝xÛÛèíċ×HÓ4kL&ó(ŸÏ7@Ü@³ÂÚÚÚbccƒĠĠUTUċ³‡ğŸ@ €”²ay½^üŬŬ´ĥ´ûŝ~ ÒÖÖV=ÉwÀv !ŠKKKD"ÖÖÖPU•ééiŜapp‹&@Ó4Z½^zzzˆF£ 'I§Ó_Z–µXŞëÙÙٔĤidS)fĉçĞĞĞ˘hçùñ›ÏIŝuÈóè>ż–,?;;ϝ;wù| °½½ëX–E6›ŭUl]×Ûüt1Ċ/‚ >˜fzŝkÒħ(?û3owñƒqNs1KGG>Ÿ]×瀌s“ÎÛXÎĉ‹&§–ySSSo|ÈJéä9Ż÷ĥ££ĝÜBáRù€3à%pìhZŞsgÏbħnwċĉ*Š‚˘(dcXf’ó=\'˜Ïöiiި• 4Mï÷WyàH;šE—s_K蒕K%rf+aù'EÛFQ}\Ú*::ĥ£)Ğ_Şô B™ÂYšüĞÊEĞpµ[5hŬj–[g§µßĠÒċ àò°ğdljĉШñ(ıs›œ]ݏzħN˙ ( ĉnˆ–³Ċ’¤P€RùĤ¨Ğ ™LrttD.—£½½“|ž?˘‡¸JEÎóEĴ²JÖ=ôô”d*E2™ĴאġzµDİt^Ó•ËuÍŝGšK€{@Ğ£I}!UÀKċôíTĈùmŠ-İkX*}Pd}°Bċmmu@-4Ñ7J@ŽJƒċ¨ô˙Ĥڞt¤˙“IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image.png0000644000076500000000000000201110714675706017466 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ  8ê²ùP–IDATxœµ—ÍN#W…żv·ħcYd˘Œ˘‰²É2$Ö</ ™áWàĵ Ê*RÄ0‚ !ŽÌÈĈŬ÷VU·˙Œ·ñ WjuĞûşÎİsŞŞŬ ëôôÔɲŒĊbsAUËóbħ MSÒ4EU™ÍfL§S.//QĠh]ü¤‰Àt:ċĝĝ¸i[Iâááét Àh4âââ€gI4ˆ€µû̌(Š˜ÏçL&f³£ÑˆápÈÉÉɳ$ZMĉóyӖĠëġ ôû}:GGG ‡Cۊ€Şˆ@ċ֑h$°íêġzt:FÌ>ĞÜFĞÛíruuµ–ÄĞh·ÛÜÜÜĴ%ÑĜ_ŞÀÙÙŜûòȲ ï=ŒÇc{Uçççĵżú‹Ùü˙|ĵċïÛ\żżċáӜëëkĈñ×S ŠVÛĵŬnóîç_¸ğğ£ßÛċÛŬûƒ}î'÷Ä­°˙Upΰ··K)­ï÷éï„{o˜lF`›9 â‰Ì“ b ğÓB2ŜoŒĝoòq3ۂ›¸òHZM§ĝ„do—~>#zŠË*p’xż@Tqtw"u$ħĚÄqĤ‚j8›¸{ÉÁâ™,è´cLd3›*à]Z‚šUàĤŽ86²4 €d*tvâÍlBP|•ħi  âu˜HY áıĞTiXg™Ù-ĝmÎ%xAH…$R2_İ`ö…ˆĝ ´”܇lu™P°êG’Ï­­ˆ’ĦI^Ԁ:Ìğ%SRŸ† şĦO „ÌkµwUö&üiGX(Jc ÊSÈ[Ğô\µlĊUĊÄG†ĉ{_L >`LĞ ö •Úħ6T è‚rÂċIĥ"{íڞ€ç÷0ĦüöëğÍç@ŬëÙë5Q#Rxn*K)˘Dĉ y*Ù2x½Ġ ş=Ĥ¨wĠĴr›™€ä^™şĠéVóyı6üRQàê²*°ašÊÊt+3,ŠóİçRkCï–âj´!âËȉ‚žhLâÀG;$(b0PC$ÏT•µâϳÒz i&0›Íô_ŝĝ}’gòŞ`Yž½€ú0Xĵ'*T0‡9A-\áıF|ŝеXoŜ ì§ŭï é‚_@ÒĊ{O‚/ŻĦ˜€_$IĜ“ŝŽÓ%Iò=Ŝ“?àÏ÷üzB)–žş†IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image_binary.png0000644000076500000000000000357610714675706021053 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ -Ĝż IDATxœ—ËoYĈ·êÖĞv§Óv’ñÄ=RH`C,"¤F›Ñ)™šĠˆ @Ê>[ĜDòÀ€Ŝ°! "!,XD!Ħd"{ì`œ‡™îéêêşOĠUv3q<âH.wŬç;ç|ßw˂âÖ­[( ”RÌf3´ÖXkqÎ5Ÿ³ÙŒ²,)Ëçyž3xàÎ9ñŞŭċIF£ׯ_?iYb<3ĜÜÜäΝ;8ĉÂ0àòċËŻ\ç½GÁt:ċàà€<ÏÙÜÜdccƒ›7o "8 Àt:=iÉB´Z-úŭ>ív›$I¸rċ ŝ˙àœkî½÷/½ŽUç^âÄ|˙­ŻÓ=?~D(#ĴÖŸ~ÊӇyó½÷Ŝ†!Bˆf\5ˆ$IÀKÇq,€ûú?µŝe˘(jŞôŜÇ1ín—Ġáŭŭ}ž>ŜáÒ7żJ†Äq܀HӔíím†áħ —%ßÙÙñ½3k$IBšĤ´Z-Ò4%MS˘(" CĴµH)YôÉóœ(ŠPJ5„Ü}›K—.ᜣ×ëħĥĥFE\ĵx‘ğwïŝĝÙç˜ığğë³,#MS¤”!Í[k›n8çŜcŒÁ9‡RŠ,ËBétˆ˘ˆ7n°··‡1Ĥı”Rc(˒{÷î-Jɓ'Ġj‘eYS‰µ­5Î9Œ1Xk›y×à”R ;N§*hg›|úÏö÷ĝ÷Ŝ.;Ÿì1ŝlÊÎÎżĝċĉ!ŝñ×?ú,ËH’dask-eY6Ġ{ï ‚ QGH)ħÖÉö3ú§ şŬ.ç×ßàÙ³g´[]:Ŭ>ƒŝ€çÏ ħHÂSgż„”òsmWJĦµĈ{snéuÔ¤ ‚€ġá ĵxñçN‡.Ħp+Úħàµ3‡î˙ċ7>MS‚ hÚ^Ï׃˘qş:şd=’zíß=e}…áTEà8À*°­%^;'ĝÏÁŝ!€îé M+k‚Ġ3ŻÔ Ž&ŻżĞ׿ğ°~š§;éĥdàˆB K"Ĵ‘È.íıGH€Pf(šY;ç‚ 1 !QÖ kncŞ5Â3™Œ}Úbı“QĈqc­&%EQ CsàG?ŝ á^Ż×T>™LšŞêök­évğMWêgG✣,K{ġmĤù„Y9£•FÈ0@ÙIâ礕Ġf•”jÖÌŻ7·Ö6gü`0`2™,tĞŻğ8•|çíoaĴÁE8Ĵ)B (gIâ@”9´ÖL§SĴµ Ĥa­e<Siš˘µĤ×ëQ–%³ÙĴ‘_Y–Ġ KWcqï4ŜZĵ· Dġ·×`Œ µ*ħ#KQ”RL§S&“ JİFž5¸Z5ġ›RÍ×ZFàÁÙ„ C´­$( ĉÇñŻ~ŝ[ħµµĊl6£(ŠĤşñxLY–A@BjÇ °!bmLJ)>zç-!܈Á{·‡—œĞı1˘ô\LY–h­ÑZ“çy“ä(€ZvEQ4mwÎQÛgíÜ*q’F’(,Ŝz¤w”ĤÎvà÷żŝƒĜÚÚ˘( òçż;Ó˙ÜòLùŝIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image_browser.png0000755000076500000000000000400010714675706021234 0ustar chriswheel‰PNG  IHDR#$܃ásBIT|dˆ·IDATX…ÍĜlçÇñ÷=wG|ĥ“h‚CHRPKŬĈ +$XË:~•m0Ut+Ĵ Ş µĦŽĥÛ$şħjŒ•ÂB+ż54Şŭħ²Je@…` ŝX:F K€„Äqß=ϳ?l$$V£ÚWz”è.ö½üù~ŭĝĝ?*f „ˆg~WJo/§\8(Ŝëööv-ÔBˆxfŬŽëY}ž”1ĥĥH$hĊ5@Ûĥ˙ç‰ŬĴMñ††§ûAÛĥ :×Á:z‚}Ö‹ž]ÛóñL%“Iš[ZhIŻöXÌikks\×uoeoÇ{{Ŝ^“ùӒqÁÙ/żtŝÂE ĥĥ–>ĝ€uëÖ1nÜ8´Ö]V8î’X]]ZkòòònH2”TwŒî 8˘0œĝۉ³fLĞá•mÛ: C°açzĜ˜1cn€ġµššݞÒĦ”\΀,@żwé$ĴA é_ಧ<š’jÍÀL´ċwêŭpYĤIĥfÍVQQqSÌuu/&ˤ _>³~ š?܇ŬġÈ”J8²¨˜çgÌtK˘UÚvrt02Hgsô‡}â?s÷ĢÑhŻ ĈĈFjjjPJUgċ·é—'ĥ?ñaE^EeŒY0#‹ŠyqúŭŜ€âħ*ݍBÂıZˆÔqĦî4¨†ëòÓ·u•””Ü€™6mJİY™t|ÌCY@e¤”ŝŭB„[l @Ákídli{ä[ X:v|rÀ°*•Œh”Bz T²é%¸|î Z{ÚÙß½Ö6tèP™>}:JİıÀ1àÓ;ÛR@›'ÛNm UñĦ\Š]„˘í\‚\'ÂݝoQµ`2ó"Y"Ê×BXZñ#ŜrÁèŒ_EX`6MS×.ŻŭU´ë2˙Çkœ-[ĥtŸ2ÌK3– Y:gs}Ɏİü‹‹XémF6Ç8ï]JµÌà2mıÚX'œŝƒ´– ì`ĥóĝü@fĈö-|ËɢBÙy:¨mËÖWê?ôß½b6Ö4_ä„cŒ,ÓL"Zhhm˘ÙˆpY7ù°Ĉx3•DzàÀa!Ä[âÀ˘ù^8°VJqêï€€1ó&[J)öΛáċŜ1\ċäŬĦ”ìÔJ)˙qĉìòŬ í?1ŭÁ6-ÂVğÓĤ_2‹VÚhè¸kw;xì›ßaĝ˘ZJr İšwŸpç„ğx÷Ü1rğ“âœ"*çO´öÌyÀ³-KË4ĤÏdüV­Ŭ\ŸûèŬ ò°m›ĴDaÙ8fÙéú°úĞxé½?P˜]Ào~áك)É-äÀ?ŜàRì 9ÁlŠsŠˆµ\ĦœFe(ύRŞoÌÒC›/œ\³üĵ<ĥ>ÀşÈ/ŒmÛĜĤéD?ÓÔ=ÂBvêsuÔÀböÇ_çïÛŜàžEˆ]³#"à´0@JÙ{›ş–†ÁâêùîäYH)Ùñ×?w…²Lğ_0!„ßʐ핂ğèìh3lÛ0„ëŜĈ:l¸ŝ÷ıO鉤^ÖÌıw*éëH)ÙìMžŬ·‘ÜÜA·ğÜv!2Öhz,°ÉdòV“I•ëyH)ŭaËD;sìטQùe¤”ĵ~öŭ›Âž|çìz~ ?ı˜í5yFÈ1H&“H)ocàş.Z_6T —ŝİ”˘şô.&­ü=R)Ŝ=wŞWĜ?Χ^ ÛimAgggCÜĈX¸Ûzǎí()Ĥy-™tRJ)<ÏKí:µgL(Ċï˙ )%ï×ÇyáS>ì£ú:„˜nğ™0hooO]È0ş€Ìžr‰D"Ï()Ég#„À?ÖLBRÉ42Ë •R fßYÍ´ÒñĈŻ_ÛÊCĠß`ċÊW¸gdĜ+ˆNDk½¸4÷ĜĤ“'OfŸ>}ŞM†›6mbty9ĦpĜ(Ż%”i_ş…™5µ|í£ëİ?S@~$`ıûYf†¸”jLŬü8K–<öŞ‘†mܸ‘²hĦpÈż a>$3ORJJF”²˙À~ÊËËİŻOa‚YĤ?ÀF·›ŜŜnĵİÛÁÀ1OŞ*ד³’œûƒÇ—1µĤ†‰'rôèQZ[[q“ÉÔJïJİd˙>ÊG"-càÀ,bÏl;çy$“IÌnWïë{“ځOÒèOT•RŒœ+Vú‰­_żž‘#GtŠKF°wï^**F-ĊŜ=ğ)++£İİÉo³ëş˜˘k4}~‰ğÌ“Ş R°Úڟĝ°E‹żGġŭ“‰–bÏî]D£QFWTräÈyÁ,‹ŽÎgçsĠ¤IX@(*™Bˆı–)´m™şŸmêµO?O?ŸYû´Ŝıcğ^ŝÄ2 èĠĞWëÒ˘ ÌI?ŝ–“éħŜ~¸.1T?ħŸ­_˙êúçž0`ĠŞU]°şì,7ŭ'Äç-A·Ä€9™ÄlËÔs&k`Qú\ n›ĤÌ €éÄÒç:€f ñ‹Àô@hà J&SĈu˲H}yi÷E'Ó–) è˙µlïòU… IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image_complex.png0000755000076500000000000000222710714675706021231 0ustar chriswheel‰PNG  IHDR szzôsBIT|dˆNIDATX…—KoWÇccc7²mJh]ôA‘X´ ä tRĥUUu͢Bâ€$Ù²à °(Ğ˘*UIxJS9àÇ̽çœ.f<“ħŒ“+]ÍĝŜsç˙;{ÇPÒnßmŭ~Ÿ8Ž 8çT5ğ˘("Š"T•n·K§Óáùóç¨jpÔó2€N§µk×ÊÌ2ˆŭŭ}:›››ëq½gyy™­­-;ÀÎÎ$ħĦ vĥ˙˘Û{Ï?o^ó÷ëìîĵf˙}ŬŬ]ĥĥĥN -Ĉ·y­Vcqé3Ŝ}KĞ9ËG³mĉÛóĵÛ{Gµ’ĜO_·n oĜ/\8t­s€ııYZÍSœ=3Ïı…3Ì·çYĝĝ40E dçÀ³g“ VW'‹xóÄр*˜İ 1HsŽ…OŝÛ{3@֎ â1qY+pŞ^C|H87K+=#ĤOÁ˗ïCş0qq.BXïˆ "ŽĈLH Ž°ê°2€ÂQüä DQŝ{iİPâbLĠäjâ’ġ’ŠU+Ä2 ^Ğb"ÓvÁ£G‡zï]”‰šċâĤŽjĠˆ£8 VĦ>S >03Äç›&*>Q‡‰dµÌğ<*ešY ú}xú´0gW$a·$ßĤÉ5İJìó(˜7#ù·ĊEäüÂHÈ}⭁›|G˜8Âôܚ`$üvċr1äCñ!:ÌğBBS"Ÿ:ĦSĤ )@]ù>ı÷½d@ĉŬĝް¤(Œc¤ úáXŝuċğBgâ"¨Ċc)PULĠÀÔv*€VżÏÒŬğÇıĝ×_aç>ÉšEÀ&¤Ğ  ü0Ĝs˙ŝĜœüv×XĜÜۈx:† àâ‹GF`yÒ ˙ċ'ÜĠ‹âzÀë œ›JĦ E”À„ċ)xo0ЍÁĊożŝŒ_ğš‹êˆ¨äcjš‹z—ŸŜAš&ĵ? €ÖÖÖìĈ|ûċ爋rq)ĉı ~0ì"™¸şĵŽÇ܆Ĥ2vşeß~£9—ÛğÂs5˜`ĝeäDAO´JèûàƒB1¨!’zŞJˆZòâO½ÒwAXív‘è_ŝĝ}/ġ¤Ş`q꽀úä`ñž`s˜Ԓ‚ĉ\Ÿ½ˆÀŝĠ:lgÏĥíüüià6Ŝâ³{>0? Ä&$ù;Nƒ0Lmĵ'àÏïĝ‹ ,ìÀÇ>IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image_copy.png0000644000076500000000000000145210714675706020530 0ustar chriswheel‰PNG  IHDRàw=ĝñIDATxµUMkQ½™¤im“N‰¤+¤A .´‚t%¸İ` KûOùŬˆÀŝ„Ru#XĦR„şD\T)´Pşh¤É|½÷<÷MߤM:Óô…äÍĵıïž{Î=óBôŸG†óŻ­­VĞĠI×uIARJr‡şŬ.œœPğŬö:ÎBw˙ĥžoÈçóÔh4¨\.Gû•Rìĝĝ˜lÛÎÏÏÏoonn>AÀN”âBĝO–eQ6›½´%—ËQ­V£ıı9ZYYGÌǍ§út)0áĈâg\mÜ`ġzšÍf@pûX/ĤĝÑğ“LŽġġ×ÔïÑÍÂL­ĥuxtT2ϒĉTÌ˘R™˘bħD‹lzpħ¨ &ĝ°t`€]7˜Ŭ–——“Lp&xù$+++ĉ˙ZçïĈ˜=Ÿŭ ğıûA‚‰ç·żĝ'żÒ.‘ĥpfV@eóˋ²0 !òpí@¸›C{†c_€Ÿ=żl>Ngĉçħ•âRâş.ïy/½ôs‘ËÏ˙kÇĦX,ĉ0R‰ ö…Ĝà…^0ÎÑ£|wzšıı9ĉççò‹˘ˆ›7oò#äċ—_ĉí·ßÎálÛĈ²,ÇĦÑhì ñ?™yîÜ9³¸¸È‰'8|ĝ0ĥmÓíviµZA@Ec‡ ‡CA°Î[o½ERĦRİà8Żú*[[[H)ó'I¤”ÄqÌÚÚÚ½ñÊ+ݘS§Nñ裏233ƒ8Üıs‡ Â0dss“VĞ…ïûŒáû>N‡O?ŭ”(Џ{÷.oĵñ‡˘RݰykƒAĜîí->ÛÚäÖż·èöBnŬşĊïŝ¸Jž5oŝôĉè‰osìĜ1fggq]—^ŻG³ÙdmmġġušÍ&QĦ”"Z­…BrıŒ1˲xï/˙âħĊŻâ8ë266Ž1•J’We˘ĉSİ–İĉÒ?ìĉÀ’|}v–™™<Ï£Óé7nÜàŬwßċÚµkAÀĝĝ8<ò'OžÌ³Ŝu]<Ï#IZö&ÛÛÛX–…ÖšJB­V 4ÖÔ$ċb ÀÜL+Ğ €ßĵù˘YĝÚ)Ĥ§§yÁ ‚€~żO£Ñàġ×_ç?$Žc “Üġġuĥ··yâ‰'p' DQÄ.Ŝdéĝ<žë ŒÄ)XXBĦe ÂÂszŭ€?ŭùŻ™µÓC¸Ëììlç­V‹ .píÚµ=Ëôúġë|ÁH) ‚€n·K†´ÛmHĥh7·é´›Da•ĈĜxCÑĥİÖŞ”Ga$zŒZ­†ïûtğ]˘(" C\ı²§óğtéGŽ!Š"˘(b0 D„]úŭ.AÇgĴâ-ŠĊ"J”Š6Qaä.V ×u‰!R !÷h4Üıs‡8ŽIӔ$I²6ˆ˘pgñK,ì‚E˘†¸N£Ô.€RCƒŭ~?ßĴßïïİóŸ7!ë’$ išÇ1CİPi‚T%,K£dv8[@˘n1Ë Ħ“Ğ\§ÓĦÙlÇq€ûÙÜÜġz=cL>ìĴQi‰Ñ)F)ŒJ³G§“‚’ğİß'I:á˲è÷û?~üËËËTĞĠĵ Ò4+ħaħŠÀ€V9„-4Z 1Fa 0FíĴüäqùòe:ív›^ŻG·Ûeaa‡zhOç?ŝ8O=ġRÊ|<ƒĴ|ú›4BèˆÄ˜t÷TŠ=Òà\ˆ˘ñ½^/Ïèf³I’$œ9s†µµ5>úè#:,--qúôiĈÂ0DJI§Ó!ô'¨–K%ÇĈħ…QÛhb™é ZŜ Îù "|>1GŽÉAvúùÒÒ§NÊÛ-ÀíÛ·Bét0Ĉh4ˆ˜sϜÄħ-üR‘JÙ- £ÚhŒÎÂdĝ\vluuU\½z•VĞEšĤ÷Œc;×ĵ3ñ*h·Û´ÛmŬn—çž}šz­BÙ+RĞ–İ–]ŠŽ0ÙôlTJAÄ(/îığxñ˘X^^6“““xž‡8  …BïZk¤”looÓëġè÷û<÷ì*ƒïݏרW¨xEœ‚LV :Ċèìä÷èÀíòċËâħçżgüF›ÉÉIÇÉżÂ0d8’$ ƒÁU›àGgŸĈóÊ%—C5ĤQŻ•)ıƒQÙĠ™fÙopìèüŝ#ÙĠĠ÷À7^|ĈĜ[Û¸RSÄ"LdħHX*óï|‹‰Z™˘SÀ÷\êcUĤ&ǙŻâ{6–eÀ(ŒVıs£S”Ò“‚ŭ%†ÒéÏ"Î<ŭ}f&' ş(°0£@Ñħ=—ħŠO}ĵB},s^(X­2§2ŸÔè&¤< T*1;;ËSc úZI´NÁš’cSİzÔ<—JıDİXÀ²Lĉ|GGÎušìn,żP†û™8LMM1˙•)†Q•&#1Z!´Ĉq,JŽEÑĥpl !4h“;×:Ù=ùçL‹/ Ç1ċr™ħñqŞKjLvuޏ-Џ&AëĴé 5RNŞ5PÚd?:50êöÁa"TÀ'7‚ÑI"L’ĊW)„Q™°H9Şù‘ôĤ™ĝ³s-dŜˆ@î˙ĠşcÓÓusxrìÈ!Ĝ%¤”ĜÈüv6´Aħm;[c“”°íÑ)ŭÁ'›ÛüƒeĈu?<‹`IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image_grey.png0000644000076500000000000000261610714675706020527 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ  Z2IDATxœ—ħkIĈVfŠ)†0„%l!ŽàJE ĉ0GHċ"EŠ)RĤHá2Œ Ĉ€Ğİŭ\q„#EŠ)ÂarÂ[Lħ„E bĜÑ˘Hı ğÚÏ÷½ï{ïÍzüü|é½'Î!€tí¨ëšŞŞ¸fħXìmÛ_v¨ŞŠ'OžìZ–Dp€ĞĞ+Ŝ½{·ÜFb'‘fÉx<ŜI"qÎá½çêꊋ‹ NOOHb3ŝŸĦ”ÂZ‹R <àââ‚Á`°ü%Ñç_!rÛHlµà͛7K­5UUññG É çUUaŒáéÓ§ÍFÒß**IíĜHàíÛ·Ë<ύF½ ÷Ŝ#"cPJá½çòò’,Ëxüĝ1"Ò#˘”˘( ò<˙!‰ï,˜L&ËgϞqxx˜6\Hċ¨”Â9Çċċ%u]÷,Š˘ (Š¤Äş½ÌœL&˳³3D¤u]×éڝëŭàĊ‹h­NNN(Ë2‘ !¤µŜ{>ŝÌ­ŝêĠĞċ˗/Y, ö÷÷{‘Îçsĉó9³Ù,Ĉgóù<=ûúġ+ˆÇÇÇŽÇŭñ;÷GÜûí.öĥċnvµ?àŸëW90ñŜ'o•RˆHúŬµĦÍş _|Ħ,K²,CkM>âœC+Ök \ċˆÛŬxŭúġòĝĝ˜Ċbñ‡"’˜ÍfÔuÍ·oߘÍféwT )˒ápĜÛcA`_í³ż‹ù‚ıŸñç_7 XkS”0N­5Zkêşú-·›ŬżqÎQ–ee“¨Ş 9(M–g¸Ê5ò<ïˆ2Ǎ1h­ĠASUUÊún†š5ÎĦ• €D@)!A´F+Y0Ĉ¤– DB1Ò<Ï(˒˘(ĝĤÓÑ9G]WT•ÂhW ¨ĥl› Š@Ü6nnnĝáCêˆğFí=Ŝ×ĝàQ^iHvZ iŻJİ^gzQĵ˙žOŸ> •ÒU.Ùb^xD҆hh8ç°Öö$3zğ™1†²,S;Ž$şù3 Ħ$ !ÚÔ>O*—ŽġÈ#hQĴˆŞŞZ'IğjdYÖzۀ< I Kû&>$€nĞ\/·(qJ§ÓéŜ‡—="³&•]tUh­ZkĴÑÁ“v-`ÛêƒODRNl)bk¨ë B›P€Pm_Xe}<ĝVß:Ñ9oÂZn#`­e˜[ĵ×݆£"4ġŜ^S™ġÀ7UÒOŜ7ƒŞŬ4 ĦnĞZĦÄĥÛ(ċŬKç&Ŭêş†PqsSġ2xYcĊŞÎCRİħ‹žç‰hKbëżÎwîÜ^ĉÖ@:RÛOH÷½£%ĝôYÏ˙€B$Zh_pS8ŝn(R É IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image_grey16.png0000644000076500000000000000263010714675706020672 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ !굔”%IDATxœ•—1hG†ż;?‹WL1„Ċlq…ŠTF… Ĉ¸0ĈA*TĜ ƒ…H)ƒ‘ñ² .DpÜ\éÎ&(à6"˜ Â¸rqĊ[l –xŠÉ]ŠŬ™Û;tÊÀ0ËŜ0˙?˙{˙{{Œ½½½ħsŽ0½÷xïâÚŝ Ş*ʲäóçόF£ÎyçË"eY²ħħħh[$Àƒ‡‡‡óH,$ RoY[[[H")ŠçƒÁ€ŭŭ}vvvÎ$ѽȁ˙g¨*I’ Ş¨*7oŜdŸn·;ž·_~ŭĝçxI„n§h<½§ü;óûß߸Ĝŭ§IÀDı³”½|™?>|àŻßĝéÑ6_Ž>òúÙnÜp˙iŸĞ׳µµĊ½{÷(˒˘((Ëk-›››ġA2Í À"ËÏ[üôh›×Ïvyŝö0ôċè#£Ñ(YkQUœsĤ)wïŜEDĤˆ¨*Y–ÑëġÎ$ÑĤgÇĠk×çvTUŠ˘ààà€ŞŞ˘5Ù,ËȲ,*1›2NŝĝÎíĝBhƒ‡êĞWŻxĝ!ĈDUċĊ‹s÷r||<–§ŬÑVäñÛ<{Ÿ=x0°ıı‰1†—/_’ ‡T˘È3ò>FĉzcÎèv'ŽmƒÎVÉápHžç¤iŠ1†Ŝò2EQ`Ô`LBb3в ¤ÊÂB4K`8Ľ]ĤßĵyĈĈŜ{Œ1cO" ŞuޤI]-ċäû÷) ûOû§r M  \UĠİá½§( ò„Œžg· ħ1fÊ!|A…4MZBĵ5¸X€şŭ~żn9oĥ3=€Ù½+++XD•چҐ<ŜW“0Ş„m?/"ÀÛ{ûµĠĠZ%ŒQêÈ6yÀ8ĴħÀïîîvĉĥÁÛ#ĥÉÂw½™4qNòèOİğ0j ­„ _üû<‰„ĜĊ”1[İ“޽ħ{ŝ×i${ûÙ]d2…”£: Ĥ 5<<\AħĦqìĝçâZ‡5°Y ìı³£½¤ĵ‚”ÛP‘Ë]ĊŽħmp ™Ŝ>lıċ^¨‘4?ú˜ˆ¤ 0-‚\£-,,*[cŸ>ò2:íċŬl‰SĠP‰‰H$‚XDl,ïsGMO<´´Ú²Ş›Ž V F˙éW÷=…m)¤ÓŬŝiY.drLL0ġ(d/£İ­§âœ ÀħÜd§­ÑLëÔŞòFqK;@2„# Ì@´!VŜ0r²TÖào J•Àċ´Ä Trp8$^öo ¨âfġ0`Špż…”qÊ1,Î}İ<ĤùĈ†r™÷ŸñĈ•.X ™§a°µ• Ĝ6'dŜa‚ê(í[Û PÔ,7=…\JeT4ĥŠ(SĴĵ’kKfğJisAo1@`èÄ@µ „r7…ıx İkĝŸı è<†Ihm³XRÈsĥ&ċŒÄ,ˆEž^—ĈiçVÀ’Áî·ÇŞ·ue_@ük8 8 Ċ 1Áŝdp–¤a%­Hí+ĊNA ÈàT¨Ñ@,ANÓÉ·THL‚ÉQÈçD1Ís†X†=ÀĊâ2Qè#êk4gĤ1wñ"ÁÒrM$²–ÔùZz1K—Kž~ĠÙ%6eMEˆ–m ûÏĜğgħ"‘ı*f@ɽtÀŜOƒçz'&_'Ğ'1>>NÂÈĆNi“ċ*1PĠ8;H)çżĦ°ò—0ñΛĝëÂe mEŒž{İtŸç‘ŞâšOÓàÉÑ8ùÉ{r=p˙}”û˜y LR`Ü³HĦ•X!šĊ}{ìlE<‘ÁÖÔ Hg6I ™ˆïN£\‰‰#£ĝòÔQ„B!Üyû lŬ„IL²;Vĥ+W–piqSLâĈŝěèIv‘B–eDÂô£{!¨ùş€˜ Ğrç£ĝôÄaıÑî„BÊ-½ìö{qùOLĵ˙1•Ûĥ܄TWáh#Âħ&¤ş; †£PÂ1¨Ħ† Ŭ2”# Ó§‘ğk _|ŭùî, ĊĠ Š7Ñ- şWŜšÂ†D:zşL\‡Lolo TÈ·m>Ïi^n+VJLŒßĥÇN§èÂàĉ8?µ,ĵvèCô¤ÚŬÇĉëS“?Îŝ&çs3şÜ Ċ€Bña­B.K. UfEċ—§ÜÛürş:Œí÷ §ÙYñiĤŻ ßÎ\ ä⢗B!•ŠÇİeʳa P1â`ee!*Ïû³!¨--È<$seuÁ£ˆî™ÏÚ4Ċ;°œ×p´-|˘Îٙç_¨ ‹³o}öüìĵ E|dS KŜΝİS]à6_Rû&ééûr†˙.­ċÂŞ#+'ŝmĈş{²ĵIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image_rgb.png0000644000076500000000000000430110714675706020324 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ ï8ˊNIDATxœ—Û‹]WÀkíëÙû\fÎ\›´IM1VmMëJ½Eĵˆ…‚O}ħb+h@´ÄB(ŠT/(H@Ä6àC}‘RÚZ‰Z %msí$3“Ì̙9—}]7ÎäL£LñƒĊŜ‡ŭħß·Û:‚=äݧžrEQP×5eY˘”ƒµvò,Ë’ŞŞ¨Ş k-Y–Ñï÷9sĉ ÖZqĞŭŭ½úŭ>=ô^jˆÁ`@żßàäɓĵ ĜbOÏóxànİçœCAžçôz=²,äɓœ8q‚Ǐï !÷Èó|/•›$IşŬ.išEGċĉî˙°ÖNŜsïıvƒ€ñÉŬ bÏ<ĝŻg¸üê3ĵ‘CYƒW{X9C&ğ|çß˙@J‰çy!&áşEÑxÏpì ܞ+†–û‡**sÔxONJÍñ›ûF‹|믿#Š"Â0œÀÄqÌċ˗9xàï ÇG"wÏLŠßşŻs˜h˙}%İûCÔÒ ŝšaíì÷…‹äŝOŭ)ž:NğŬ&I|ßGJI,//ì ñ?™yêûMwߝˆïú*ÑâDzşLħ|…ju½ž3ÊŞzšBwé_oS ŝÙ{‡ïŭáfffh6›AÀc=ĈÊÊ ZëÉŞë­5UUqúôé›KO?ZpŸşç¤wpö2š˘şpšâÍżSmdŒÎ]˘şc$ÂÂŭ¸é2µ9w>cĊ”\,—yòه™ŸŸ§Ùlpeé2Y>díÚ Ğ+WXzg…Á0gii‰g’IÖ<˙Äaw䣷“ú Ñüĵ´‹Ŝĵˆşvžüġ?S}†rµGµY“×ód£†›Sdf–ĦèpM*úıSgùâ—÷QÑéLᜤÙl7ZL·š­­,/ôòN”AD0ŭ‚ù{ñÒyÔĈ[èÁċҋèÍóĜĴDm€R1iT°@î-Ğ#VŽ 0² Öó>+++H)ħÖÒl6i·[xÂ"çfICÀ…°Ŭž˙íçŬ'ìC4É ċÖYTıJŬ{­/"R‰Œ^V4ÑÁj˙.ùmÎ5—"ÇfwŠÁT‡²Ûċ›żz•ĠĠFƒ-²Aaq( =ˆ“6ûn›gşÛÙ)Ò¸F‹`ŝ#3¤.W1ùUŞÑÛ8ߛkÀH#EMŜAѸ—óÑ4gËzâÑO<†Ò‘UYUPùŠÍuZI„/-'%4˘£}üv‹tğGĝ&Œq­ùħ÷Ġ2ڎ"´ğÈ0ĈĥZH.]\§¨?ÇkÉ>^ŸĴµbħ$ó%ş’Ô&ĊŒ†ŒFú[ fƒ*”„aˆ1Š8ô)ŠßÓ;֏qí ĴàšShÑEw £ûïĉBÚ牋_âÂ\Hy` xŞÊĵ0È(Šœ<QV%I€'ñ=ImJ˘À³0p’ *j=¤Ò9µ-éMᙵ,+Ë+…â_ {hžÖÀakCİ-ÎZ°X tuQ5ÚhŒ‘Òbt…_@m QèílššwŞ‚×İLĊÈĴWеŞäŠŞxS+V™ĤÌ!dŸµgXŻ=ú•Ħ0޲ PşD…í÷Ħ*ĈƒÊjœU8cp΀ßNyW6jeÍJ”ĝœÏK–tΒÑô]BÜ2ĈÈÏäÌG ‘ kÍĠÔ*£*ĥşDc8°fá{ʌKŒn”áÓß>%^yċç²>oĥ¸TċĴXÁ%mĜ² |9‡çµ€à‚ )ÚF“[¤Ċq5"Ò%rs•ŸfEˆ çÎì,ğOQ•*g(, Ká|żƒ'x˘ĝ8§°˘ĈéĠÖ&Qi)F=‚Ĵ Z[Âù>­fJxāO ƒ3ßY*] Z½s§˙‹xëôUÖµcEiòZ ĵ&’O4ÂÇy‹Ħ·TŭeĴ+)ĞU…z™÷ùÉ'f |I‡4ÓQ(XœUgĈ9`s3ÀëO$–^["ß4Pú0á<!Îy8­ÑyŽ*X,U•m_żˆÙXċŸŜO·Ó&m„´[)­4" |„ߞQxÂ!ĥóâĤܐkżü›˜ŝáƒ.ÚżˆHXaA@Œ§ŞY;ê‘Ĥ²ŒZëQ÷6ùîgÑjĤ$îT›îT“f#$àĈ•`Ύ=żİü·lŝúe1û³Ż9}ġ:b€ç7ħŞ3ÂġF¸‘§µ-dóĝƒ‡H’˜4Ž˜™n37ÓĦÛN‰£™qœVìw |ìŬŻdëżxN,üĝîo ĵá§ÏVàJ£GîdzŞEx$ˆn§ĊÜì³S-’†”œÁY31îĴ‹p ü÷q)½çôǎcavš,`ŒAâpÎ €0$ˆN3Ħ;Ġ¤Û÷<‰°46& ˜í“zo€8ŽY\\äĥıÙ¨5k8‡À>ÍVƒv#˘™ĈÄĦ‡”nl|ÒÇĈ­Şw6Öïꄷ’ ˜››Às”Ċ£jœÓ8kÖ’8„$%BX°nbÜÚzÇów‰ï Ş*Ò435E+‰P΍ÎŒ0B`EHäjĴ´E›mO­EĈşqÁo{ lÏo€<ÏĤÏı7û۞`-¸z_cΌ‹ÖÛ5żŬz•ÁşqÂŬˆız2ˆ@ïŝŻġ†ÌÏwŬí³SàÇ Kc´ÖĝèÉ;ÜĜ]âûŝXÇg|'Ĉ÷·u´fûçĴó4ÚüŸYš2ĥIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_image_unknown.png0000644000076500000000000000407410714675706021260 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ ĉއĦÉIDATxœ—mŒœUÇ÷>/ó>;Ŭn·[¨v!5‚"(6@LĴ1¤”~ÀRš ~@4€ †%H KÒDH@5beQD˘EżRe!V*°İív·L÷}vwfž—{ïñÌĥŬ7y2ĉĉ9żû˙Ÿçœs+Ĵx@šÍ&I’Eišb­Ċ9·ôEqÇ1Î9êġ:µZĦĦ!œsêLï÷W¨ĠjìÚµkmKsssÔj5xñĊ8-ĊžçpÉ%—œqŸˆ ”˘Ñh0==M½^g``€>öïßZ½@£ÑXiË˙Ĵ|>Ogg'…BL&ĥmÛèëë˙ À9´NxĤg9h)w&ˆ-xaüU=?ÈïÇpu˜hÁÀ‚!šˆŒá­GÑZ£µĈó<´ÖK™Lf X֎Ó*°yïÙĵw‹ì¸öbş`ĜŸ˜†‰ücD•Qĥ]v'ùì·ÏÂonennŽ(Š0Ĉ,)’Íf9~üĝ•NüÎÛvqâĝq_ajÁòÓ}?òWqĊĤĞÙÑğ›Ï<ŬğË a•ŝ_?̞Ëö!žö¨×ëĵŝúëĴ]ğ–8Ž ‚€ŽŽĴµlÚ´‰C‡Ŭçœğ˙#™ıyïéĵ|šJµÂÑw4%›Ĝşu+½½½h­Éd2„aˆˆpcwpç½×òäˏ394Iôa–gïŭgġœE<ĝàƒTĞUœs8gI’„F½ÁB}Úl·^>ö\v=ŭ÷<ÁÈïFÔ'X'Q†!R‰RİD6›à7ûÂ×{%]ö Ë™ĝàèû~@£Â 7ÜÀÄĝ)êsÔfg˜žœ`|bŠééNŒœàĦĦċŽĈ™Ĵµär9ÖŻ_Ϛ5k(‹KÉĠh6Cîb‹çkœRÌÎÎ2??O!_ X,R(äYX˜gaFgBÜÁxÇ)˘(˘X(,î‡oR>/ds~‹Œf =ËΝ;)—Ëär9‚ @)…(Ħpŝ$A~PhH““ĤH&ÄÓı\% ĝž€²ŒWĞäòÙċż‚êĦI²]šğ›|êFMOħĈċwïĦ^Ż/Ġ{_ı*Ŝħ›ħ£'ħ'yµŸ/żB4&$Š+÷|•³{6ĠÙE6“!ÓN>ÏÓ( Êъž´‡§ġÊÍ(ŸÏÓÓÓC˙ŸŸàñßÏsoŝž/żB}Ô0˙˜[vÜΆîşğşÉçsd–·ßJĦ5h¤ġˆq„>$I²şy ££ƒNċ/“äŻCÏM8ĉßóık÷=l:{#ë:×R*Èf2§ZĞvLJĜg#œM4­ğ"€RŠ hĈŻŭó%’c éĜÇĜżó:zşşY·ĥ‹Rħ@-I•Bi…BP€ˆEl‚Ĝħ)¸%OµÊóŠ,N:aıÄĝKÓ4Žù̌ Q(ĉYğĤB>Ÿ# HûäbgP.—´³>ħí=ŝ**áâÔû· ù›wb&ßĤ/rëġßCŒĊ÷Z JÛ b·’vp‹ˆkÀĤˆX0fekm Ä ƒïżŭÊ÷“Ş#o\ ¸°³päw`PJaġŻù (R?xèyœ+.âÜü’'…/‰[ŸM\,ĝ²ĊgN° Şˆ5ÙÛ£I„:$úßL}ÎzgT.ğ[ËÂDû,‚„ëw´yùÍS:)[Àë…PÁ÷@´=üÂKx¤pݧöá‡Ü%$zö!{é2Úv?‹ìsèĜ3‚mײ8Ñ“ĵĞğZòÁjĦ,ßaɃTÏż·˙dT&Ê y(ZqY'uéït-ĉ/è-Ì~B†ĴÚ£Jp/öPËË˸³t żÌÍz²P*e9Ê%èËdHEùìĜ•ĉ’wœoßùĥ8¸ßÓúÑûëèĜħÇÖĝñxœ—µWd5xE¸ˆàMÎğ[pOŒ lËFqħ”­T̳ °˙ÏòÁAħ˘ĵŭĤIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_mark_highlights.png0000644000076500000000000000066110714675706021561 0ustar chriswheel‰PNG  IHDRàw=ĝxIDATxŬ”ÁQÄ0 Ew÷NP 2´A!\™Ħ…-p: EÏÎw$"ÂÍ8²$ëËVĵÛŭ †áH![ëp8[ƒ ŻÈ¸ı>2s4nÍ|ÙRˆĝŒ¸÷N|ı6˙™ tWxßż0DŞc:XĊ}qF´Ç†gµä³êўf{ gOUZ-/v xı˙ûéí–^¤u´b–˜Í#mEP†,ġ¸…ÔÍ9żİ%+˜BÈ5IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_next_autoclass.png0000644000076500000000000000062510714675706021451 0ustar chriswheel‰PNG  IHDRÄ´l;\IDATxí”ħŞ‚PÇ˙Š.‚‹4 Ä]lkm ‡žÀİgé5tÄMìŽÑ# " aYˆ!Ŝ>Áƒy-L\.\AÎ9ÏïüùO?yİŞZ œŻ€CXÓ4 gàétŠĊbY–ßiĦıN·PİàyĤiâ~żĥí" CšĞ·ßëu}ĜÚ˙Z­Àßn7Eù|00Ŝ%oÖ20%˘A@×u,—KH’ÔÎTPâ$IÇ1ŽÇ#f³YİĊ²Ĵâ1nĠROĜì³Ä~xĊġzEžç8˜L&ÇÍ5ĈO`‚sEQpı\°ÙlJ5H—žTPZ‚žN'¸ ß÷‘eÙÇhĤ{V uğŬ7ô˜ŞÂó<ì÷{RÑ+ie¤\LŸ2” Ĝn·HÓô´sù10İ8ŸÏTŻ U˜N-Ğ Qƒ²‡üĞ1è§2‘óïï†zIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_next_heurclass.png0000644000076500000000000000062710714675706021446 0ustar chriswheel‰PNG  IHDRÄ´l;^IDATxí”=Šƒ@†_E!°a !…çHş´i$…'HżÇĜ“$} ĜIlƒG6ˆ…ëO‚(2›O˜Á˜Ü`³°‚ÌŒ<óò̧ÀŸĵt]g]—9°k¸†.á<™L`š&z½Ŝ3-4×êV¸ Y–ħX,PVĞ;ŸĞ·ß_ŸġáŬŝÛûDâóù Ĉf³ĉó9ƒÁ³äwġ‡LI}ßÇ~żÇx<†eY4íe¸PA‰Ó4EE‚Óé´Ò²\.Ùe|WK=a³/ĝâ§Ó eYâp8`4a86×´_ .Iúŭ>’$Áz½Ô´"5^şRAi †!lÛĈvğEžçżÖ@{0Ŝċ°*èf³Án·{zĤŞpžç‘Š—’r#Ġbú”é EëşÈ²ì´uù 0݈˜Şâ”‡iĠŠŞPUµ3¨ĜıËżš€ŝw¸£ï8iVĜIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_next_manclass.png0000644000076500000000000000062310714675706021252 0ustar chriswheel‰PNG  IHDRÄ´l;ZIDATxí”ÍŞ‚@†_Ċ6!p¸:l×ĤEiáxkµ !ÜIn£K\H'ò(bŽŸ0ƒu*<âĉÀdf癗g>ŝä5YßÁeì.ÀĤi˘O¸O&Ĝĥ UU?iĦıV·ÂUȲ ×uqğŬ°Z­XÇŸkĥëŻusĝ²?Óf‰Ë²c óù‹Ċ£ÑèSò—ÀĉCĤ¤Ç‡–eÁq ‡ÎpĦ‚çyŽóùŒ$I0Nk-Ëċ’U—Zš Ÿû"1+Ż(Š÷ûQÁ0 èşŝĵĤĠĝLpI’ i²,ƒçyµšV¤§—TPZ‚žN'ĝív‹ëġúk ´‡ÓáU‡UC7› vğ]gè0UEĜï÷¤˘SRn¤^LŸ2”˘(—Ëċ´uù 0İHӔŞâ”‡iĠŠŞ ½AĊÎ}ŝĠôż |ĦkïĤ†dÊIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_next_unclass.png0000644000076500000000000000057710714675706021131 0ustar chriswheel‰PNG  IHDRÄ´l;bKGD˙˙˙ ½§“4IDAT8ËíÔħŠÂ@Ĉñ˙ˆ6›€`%XĝÚÙÚ ŸÀWÓ^;ÁF|„€E)BŒğˆƒìU—ğOL,îƒm3; 2NÇUmÖ^…pŻ×Ğ/àÁ`@4›Í{¸{ôĠ‹ µÓéUe>Ÿğ(ŠäGÙŭŝ)ùèĜZ‹sŽÑhÄx<ĤĠjıJFĦŞÄqL†ôû}&“ žç=×?w|>ŸÉ²Œ$I‡¨*³ÙÌ%I"Owl­%Š"Œ1Ün7ŽÇ#Ŭn—vğ]nÖZĴµˆï“ç9‹Ċ‚0 ˏƒïû¤iÊjµb³Ùp½^ĴŞxžGšĤ,—KöûŭÓè78ŽcÖë5‡<ÏÌş}·Û-ğŬŽËċ"÷–˙‘ÈûRUN§ĈİôV4Ê—Ŝ˙yïé¨}; 'çIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_noninter_classify.png0000644000076500000000000000250710714675706022147 0ustar chriswheel‰PNG  IHDR szzôIDATxíV[LUŝfvY–˲À. -êĊˆĊšXmÔXZµ&V_ĵ ˜ĝ˘ñÁèC£1Úµĝ ‰İѤħš#&­\ 1B#B1mr-PĜû²×Ù³ŽÌè.1úÒIΞ™3çüßw˙;˙,pëşÀ˙Ĵ€°M|e‹uiĊLkò ¨²èü|SüĊġì]ÊqSž˜ ¸Êj…„ú¨öbm8¨Ĝ ßr÷Ì׆6SFŻÍĝn,ŻX¸wŞbUèŝħ›o>m½ż­£zààŬëžoöPûH-NyZ›–j 6u}SÓXKb9)àÊ÷ĦÓéàvğ9Ġj…,Ëxé“:üû="CHŭ’H/ġİĜ2ï,·Œğ˘yìXĉĉĉL&ù˜ú#Š"Ê*ÊŜFd˜\•˜úÊÍ(jp5ÚŬŞcŞë‹‹‹át:QZZ ›Í†{?;/ôzaŻîgıùÓ³pL9`} I–ĤÀĤR–œíZXÙĈž{ŽsÙ×Ô ĦŝۋʅĦ.ÎĠó,œâ³qĥJĜȄ)K΢% ĉœ]ìZm!$9(slN†!ƒŬë¨É˙$°%8[Ċv§JΞ!’ Ë÷j6O}щĉË3Ê´sš( …ĤĴ_™ZD‹ìÚhëlĞ2²4ÂBĤ}1ż];وÑq ‘ˆŒL£Ž\/ Z&…¸‚,£‚°D ÑT˜‰ĦèÓÔĤ)`—ìö§ n ¨ž0£ñwÊż ’äG4ä0f ê2`0ä";njœì|ÈËq2èÚÛδoĝİT#à‰yçìK›@mʏĵMîŸÌÌ 7ŻYF#ĈŻ-"?ߊĠÀl.FnN!ŒĈ–aÑ6ƒŭûúmt‘“$gl.†²²¨Ĵڇ+—Û -Ñù—aħ£½­-”RJÁ@/>l8CàÙ‡ŭD҉ŠŠ Pb°mŝ_Iê‰(ÜGc°ÛĤár]Çòrıı3.tBuü”ôôŒÀb½Ğòû¸o €ƒm]†; `öÀX@"çà&“;v˘ĉÄc1áуíZÔ0nÏbħÈö¨Š Tf{aÎ˃ÉT€ĵ<+ġVNä÷NÀ>_O~ñÁ‰FÄaÚı Á SÀŸÏ‰Ñхíà²Q)‰Fery6™Ĵˆ”P³P+â§Àគ^ŻGR‰aÉç `İàáJ„^BKA–.+½T°bMgšT&&ú7¸%%wbt`.w~o=]d>pSżDf À]âxš ġ =|m>^4Ra"ûe$£I”–™ ³éTNğ5r%úĜúê]*JËDPFKË7xîċW Ĝ9£4xáġĜÖŠA!˙h~*Ĝëĉ´żżûÜÙĤá×^“Ž•ž§ƒµ+W™ÉdJ…ˆKÎİg%zQÊ"p9lt²8ğ4ÒNÁ*ÑÎÎf<\]½âçœċşıí7Z€  ‡ ĜEŠDá°-brb \Zä4éĤ@Ċ/Ĵ-Löá†V}òñÉŻQıû~Ì\‚K’ƒç~ll×§çpcž-†ÚÚO”rû}Ŭ‹)ċğöà‰'Paš…Ŭ>ïóùÑÑ/jàçé&Bm’Ú’ö5Tßŝŭášğ”ŒŒI‡ß'!J^äRìÛVâ³?QjöżĈ´l=ƒtċ›IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_printer.png0000755000076500000000000000250210714675706020077 0ustar chriswheel‰PNG  IHDRàw=ĝsBIT|dˆùIDATH‰–]hWÇ3;3ğ³YóĦŬ|i›<”4-6ÚBúâGDJŠ˜‚°V‘ÒHĞP4~7Ñ4E >هú˘”Jšbħ+5!ZJH(´!hŞĈşkÌ&ğ›ÙŬÙı÷ö!³!­JC/œ—ù8żó˙ߙs.ĴlħXLmĜ°AíîĜĤ€uÀ „íİW\Ĵ‰‰ ĝştíŝTbžĈš ½8àÀóCúħ²ê;ڛĠ̝aċdĉT.—Sı\N9 5swDíîĜĥ\ًÀjÀö‹×ŝKXÁU-„Ğ›Ñ&šĉğ „Ğ›é=߇(,PHO3ñ`ĉ^ÓşJŞĉ€ÜŠŞ25Şòùü?"ç,('=ĞĉgTúñ=ġxê7•ĵ5¨ĵÔAŭ9‰5 ƒĞZ(Ğ]˙ÔÊs‘˘ˆ.žëà‹¸™™Òír ¸¨óى ÀìhoN÷žùQÌ£ 44 %Â˃HÏE¸Jè:Ù é[Ğ˙ µĥĥ†¤”Ž‚ŠŠ ÖĴŽRÌÎşBC_,AJR¸H×AC!ÓéûiˆŽöĉo.^ŭ`•,Ò[[[CUUUΉ'8tèĦ€ĈñOĥ#dÏuù,^>ƒ(dñÜ,ĊBݰ@ÁÉ òótìċÔg!zzŜ/‚@ïêê*+ ِL&eúŻGĵġ¨1çqŬŸ'“H$B,–bħ[k9ġŬï qkì(ŻÑSò+pHjħXLuwwcš&ş#Ä0 êëë‘RR(ˆÇLOOàş.ċċċƒAâñ8.\`ÓĤM466RUUE8ĤğğàuàĦ‘J˜Ċ4MBĦBt]Çq”RƒAvîÜ °dää$RJZZZXż~=ëbÛ6‘H„ŝŝŝ’Š*`Π½½ĈĈF˘Ñ(RJ,ËÂ4M„†A:F×ġgÂĈÇǰ,‹ŝŝ~LÓ,ʀ ĈbożpìĜ1êêêˆF£TVV"„ B,İ4MÛĥijj"—ËqóĉM>ŒmÛxžÇĠĞWĥ^j‡‡‡`˙ŝŭÔÖÖ²víZ***(‹”••‘ÉdB`Û6Éd)%cccĜĥM&“Áu]6nÜÈġë× 5Àòċ”•~DÚÚÚ.•`444P]]M$Á0 öüıŽBß÷}\ır…İİ)Rİ###{|WĤ´e ÎbqP„ŭ(V‘-[ĥ\òe³wï^¨İİÁ4M\×e||œÉÉIü‚>€GËghİ€Ébğ û%Ĝĉ͛/]ğvm V^^ŽeYœ>}ş”<á˙hI ŭԐöi+-·Ñ·exXJŸĝ?0ÈO|H(âoòJ×ó`6‹{è ,ž0Šĝ§ŠżGW[DìN-IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_refresh.png0000644000076500000000000000173410714675706020055 0ustar chriswheel‰PNG  IHDRàw=ĝbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ  ;u^iIDATxœµ”OL›uÇ?oéÛvÒAöv%X%=Ê&“¨ ̸ËŜŒñjŒ!Hô6Ož=˜²€ñ"a’e †”’‘‚cĤTìhİ£´ÒwoûxħDèû²^ö\Ïûŭó<ß÷g\J=M/_÷‹˘({‡àĠpR:,aläÉdNÇ8ġħġÊ9iĵ—ŻŬ żó=6vˆW˜˜ı‡gŻ€‘/²ŝpƒráí™Ç–Xĥ­WΉï£ĞüîçĴ?Ŝĉë•Û¤î³÷Ë’û(ûO8{ĈE>oàyÍOq3OfµX×Dhïż(›rûÏğòΝÏäú—WE×]GNöê:˘‡=ÒÔRûĉ´SùÚ Ò…GŒmŜ'‹‘úiÙvŜ™ ™"zĜ#şY”§í…öO’:Ĝ[ż˙(ŻŜ|ËRµ]ìuX5IÙÄ“ŸÓ56ƒOĞżĈ³Êên?KšÛ\ê"ıŸbß(É˙ÚÀùóHb rZ9h~ğŻù–Ñ[S ż˙cÉY2×PN>ŝî&w[¤ċ“7q´>_cĜï÷ێH‰#m\Ä|ŻFùÑÏ´w]bnú?ŝ"7ž<İ^†††ayy™gG)ÊdPĝŝWiJm~œĦézċ%f&îĜ‚ONN266FOO•JÓ4eww÷I £#NÎŻQùç ‡ÉKùùy†‡‡‰Ċb455Ñ××Çôô4 ǜX.Ğ:\>oĞ|||œÙÙY²Ù,n·›P(Doo/‘H„%ŞNlÓPÍó˙Á;;;żżŸıı9‰ÛÛۨފˆÒÒB8fbb‚d2IħXTêż˙İhhh \.300@4ĊçóÇY__GäX ËSqJ)ċr@t]GUU\.Š˘ "5‚OŝÉuŸ€@ €a†AĦP°ìħ:ġÈèè(ÑhMÓÈċrd³ÙşŞĊ†HŞàĞĞĞĴ­­ĦŞ*+++”J%Ë}Zí@Ñ4MétZš››IR ÒŬŬM<gqqŻ×K"‘ ŸÏÛZ=-E éèè  â÷û …BD"Rİ^Ż—İİİ*¸-ÎScêñxDÓ4Ün7.— ‡išlmmĠġŭ3݉™˙2ÊIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_save.png0000755000076500000000000000104710714675706017355 0ustar chriswheel‰PNG  IHDRàw=ĝsBIT|dˆŜIDATH‰í•1‹AÇŠġMF҄ xÁ&*šSÁÊ6ŬV~ƒù,I%"$E bĦ}‚U:§şFH•dĉYl2·ğ™ÍĈ;ì|Ĝ·ìü˙żÙaüŠ¸QPJÉn4G-²X,|­µ ,·™PJIÇL&ĤÓ)âĴO|íı|úĉQ!" ‡C´Ö÷ ,o…‰¤b7|˜~ĉËĊï ó'wnóâÁ)Î9œsŜëŽbO ;Qœċġ£Çĵ ÎhÒ1k­7œl“=ìDq–ß$x~Ú ĝ¨$8?;|ç­Ñ;½H)·„aˆaÁ6 )Ërä×5ˆ˘UUYvֈéëznħ÷^—ĥwÎE‹ûî×âêËz]׸ĵ8ÇËӃĉÜ3ġóÏÚ?Ŝ}[“R‚1ß÷mÛW‰Š˘ ”eÍóLJ)ŭñM:)hGJ’䨀1ĈˆˆHa8µŠïÑuĤirIĤ7sîršœÜĝIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_select_removed.png0000644000076500000000000000032110714675706021406 0ustar chriswheel‰PNG  IHDRàw=ĝ˜IDATxc` 1`™ïUżġ?ölkô›…Ġ¨ K°b<>’ j6VQ* ŽZ@00‡~ħÀüLj0&VÚğaVqB‚p ĥ6xáT 2œ<.ÍC?F}€+náâ4"x2%”Î ɝŒĈ€W¸Ês4ġxıĞV­Â+?è%aµá K1ĊĠ€ù˜ĉ)Ċg£4CJûŬŻIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_show_name.png0000644000076500000000000000117310714675706020374 0ustar chriswheel‰PNG  IHDRàw=ĝbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ  h@ĴIDATxœ½–ÍnÓP…żiÓV@[ŠŞĥ€%›¸{žM‚§$;$–lŻĊ†-àHˆ lĝ­b– ––żBsX亸IÚ`8’}=×3sÏħ ˙i*ĠÍ9S7á( jéüP¤İŬŒ|-àcšÚçYiŞiq 除{’Ö%5Ħ>‰Ž€Y3ğpabíímz½ŜY ̸ûŭ€cYU‰…Î#Ñó’GÒ5IóW0 ½^,ËȲŒ˘(4Üŭ€™½Ï²Ĵ9Ġ BJ’Dî.w ~ż˙UÒË*W’$ µHäî !|—ôÖŬVdşC·Ïn·KžçÇrı;@#˲;•´Y˜Âƒ­­-ò<'„@vğ]’5ÜŭqìŝW÷üò<'IŠ˘(Mĥ¸‚Ûfö´(Šùħ‡G==B !ÇîN§£VĞ5Èó|×ŬŸ”\î6ħÀĜĞrIZ?M˘żÙôf$½¨ÄS€ıX¨ĵ7`hâq÷×eƒ?cî3ğ1Vu$~cfË@XvÌl xÇ3ğ ĵ3³à•™­ĈqCÒ£ Ü˙ö申CRì{À™íŸHHS­ÄÄ%Ik’6%]—´ç7%­Jş*éJ7+ñޤ‹’%ÍÁ¸ÉŠ_˘Ĝ >”´ì߀&ż^ˆs0ÔŭĦ2µ˙@œŠ_Kn CqI­£IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_sort_asc.png0000644000076500000000000000040010714675706020221 0ustar chriswheel‰PNG  IHDRàw=ĝbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ  mIDATxœíR9À UÉ˙?’N ;qĦ¨ Ŝ‘ÄfëpW†ĜÇġĦ“4÷i %%#goM`ûŠîĝ[: 1üoE@€5GnÔPÑáȞtş˜•U+P ֏Œfİ"¤q9Y îĉš&äVk ߃Úò~”óÁŒŬ˘ıFîĦâdMqHxÒ9n=ŞoIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_sort_dec.png0000644000076500000000000000041310714675706020212 0ustar chriswheel‰PNG  IHDRàw=ĝbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ  y)ȘIDATxœíTAÀ eô˙acĉ„“y[“ £-J$úá Ì&b§@Ô´25ŝİ 8Â0wÌÍĦו!€ÈÁÑä²äĤÀäP‘ŻÜĊ‰ÈW w!>ĤJmŞ‹€ÀVt÷n+]ΤĤ̉)zëBù~ŒĥsÌ÷’¨µš{‡8ça ¤§¨ğFî•wftYŠoIëGŸñ=܁9uIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_subimage_binary.png0000644000076500000000000000444210714675706021556 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ Ġw•yŻIDATxœ—kŒeÇs;gÎe·ğgŻŬív]ÚŬŠ´PlIŠZ jl‹‰è7Œ#„B‚˜Tc0†Úê Ĉ@)Â&hF£b(´46ô²Ké²[êvo=gwïͧ;Ò²Ĉ'™ÌûáÉÌï}ž˙óŸw,ˆ;v˜(ŠHӔ8ŽB ”BkŬ8&I’$AkMTĞUŽ=ŠÖÚú¤çğ TĞU…Ò2ˆZ­FµZ`pp×_ŬW„XÀqÖ­[÷‰yĈ,Ë" CĤ§§ ‚€ÁÁAvíÚĊöíÛŻa/†áB)—DħX¤RİP*•Èçólܸ‘]ğv˜˙ @k­1—½ġÊ}Ă-ĝÚÍĞ)9†Sï ¸J˘óç974Ć;ïă8X–•µk"ŸÏgÀeÛqE€#oì3ÍKWày^ĥKc ı\ŽRCí½½ŒsîÔ(7|ÇqÈċr €ïûŒŒŒÛÛ{Eçr/5MŬäóy|ß§X,âû>ïyŽ ”Âu][+A€çy¤išX–ĊĞŻÊÀÀZkšššèîîĈó<úûûÙż˙#À>ĤÌħħ1S(}×uħ,+›yTV ­5Ĉ¤”h­IӔBĦ€eY”Ëe<ÏcÛĥmœ={)eviŠ”’$I8|ĝ£qĉÌS,) ÙN”R!Z#D)•ġ{.MÓK Ëċ2ċrıĦÑ‚p–‰ñ³üû죜62::Êîç/jàŬŝŬ òùü%WJ‘$Iĥ{c ĥmgÓaÛ6뢔àƒ‘ *- ô,ŭ”Š ”*´VZ™œžÄħ­KEĜÜı×u?Vö4MB`ŒAk)½VĞqâÄ Ž;Ĉàà R ×u‰˘ˆÎÎN6oŜL?7Ŝx# 8–Ĉnk”tuL_8òÖ+Ĉ÷}lÛÎÊ>ß_)%–eeN7ŻÇ{Œááaúj÷´´´âz9ĉfküëèğOs[}˙üôÑ2°Ĵ?Wo“ëȋßıç^z{{ijjÊv>77—ġ}ügΜĦVĞrïŭ*ÍûïŸ" Şs!µ8&ŠPi!éèéĈv=úÖ\Ï·î›GwüŒç~û8İŠÉ{ĉ‚hŬz‰ë£4?£óʟPJT**jĠs³UÒ0`ĵ:Ëùı€Ù8%0†Pjµµ0vJ\bŭ­·òÌÓOqrĝË{;Iµ"ŸĞWÖ !aEa"ÌÖLMMħ˙>]½šĤĤ sRĤ’Ùô¤HE˘$QIE"$ÓÁ£çkÔì½½½ìÛ·£ĈPò"@ħ½>ÇQeŞOӔ0 ™šš"lÛĤT*ÓĠŬƒF‰”PIb­ˆ”!VŠ0ÄRÛ9)‰R)‰mħvíZŒ‘£p-0F]xáñ?Y§OŸ&Žc˘("Iâ8ĤVĞ‘$ ĥmcÛ6ŽàıħP¤İ"QÉĴ„R‘(M(V\ĠE˘İLR€ehoo£1J`”À½àÁ™ù‹s$I‚!A ”Âqœ MSĤÏÏPjke6I™ CRİÒ´’$^“Ïk-İÖ¤RsüĜqòĈ DŬ%ÑiÀ_ŝĝWëôéÓDQD!°m;³[˲èééáĝħcDR3›$ÔRÁL‘Xµ$!ֆŝċ½H!"èh)•¨X†ĠŬU׀ÔGŽħĈĈĈ0³áù˜˙ĵ?4D…ÊE„0œ"f”ċËs.ZĤ`Y”ÑĠÜÈä1ŒŠùüúkq,ƒ%F‹ Y333ÄqœYñü4LNN244ÄħƒoÓĉı´•‹8žKb4}W‘/x())–Ë´uvq]O7•$f÷SOó/ÜFÉ·³ùżÄŝ;FFFĴe֘è*R Çq2CJ’„½ŻĵBcS-KzĦğ›+ú‘h„ÔĜ9Ö–´·’Fĵ䓜Ÿšá7ħdÙ[ïpÓ +Á(làşW>’½÷w,€•_½Í„§ĈQa€­Ûfrv–ß=ó _ı}+Ğ×­§Ħ½BìxHÇ#ïĜ,-ĉ9wò8ż|öYNžB?ĝ ċ5kxñ_Q.şĴ\փe¸˙Ħ´ğ›ïú&­ÍA 6†( ù`”—v?MĦĜÀŞUĞèìhçĝ{RJ>ÌÄĄÙÀìl5 M£££ÌŜEİ\dqá÷ïÍ37{•b™ıı9&&&v¨@•bYy$a_瓀uİĝʕġ‹g2üĝ'/ó½‰75aÇHËà(C—R|ôŭA~wá<Ŭ_8ÄÌô5ìp_ıD#aŒRÛTà7,ŝâ‰4µĥ£áž/Qʰì ò%dc„2–E÷gĝÏÔ%l |­ˆ6oÙí½ >ĝ`ŬÑÁA2mí4„-ِ!†$Š$¤>^Zb"ż@F Œ#@Éú*.p¸zµ²û³#çHĤ›ÑÚ`ƒ–’VD$Ò¤l"hn~ò€İ˘ÇّsM,­PJb”ÄH‰Ñ[ ÊžÇŞìé˙êc”À^Ë[ġ|FŝLs Ҁ<ŠáP°3%QÒ'¤h‰>[Ĥ1át%œ5ië<€O ÀjİÄŞç‘w|QÛHl)ÑFàKĊC×ÁQ>EÇaÉġé(Żóé /ԕŠĞĞ˙?*˙{Ÿ÷K.˙-”Éğ’E)Xr5³žKı\"żĵLK²™Ŭ‰FĉŻ^ l,-+ 5H8.€ïWÚ;vÑ:|š÷żùé'ÒÌ,."<ƒžïá*Añá2Em³wW;_LF>Íô?ŝP9˙›*``ԀùĠÛo“}÷Ŭu}ê§/×7ÁdŒöDŠ’†×cı¸ÂÂòCÂİ:ğğ9ĥЍñħ?sÊ ‘.! ÷İ}[*p¸Z£<ñÄwżÍìwžgßŝCh­9ŝÊ×F(ÇĴ¤ž i,:S)zšSĵ÷ç?òêirıû{ĊÍɋ(ħŒğv   b1t˙3ĝżŝ%ŝ…sA2т˙M_á£?çËŬ],˙ÍċU$â|^ î˙…§ğöñêizzz9Ŝ˙4żżĝ=ßĝH7ÈRn€_8vì˜âàn”*‹0Z03ù7 Šŭ_z~'üôßßÄ(Eç-‹Ż?Áċ>rı}/œä­×_ĥq V£§S­ŸµŬĵrcZË œQ ­}fö*z§WĉÌċr=y’=ÙXŭFBi´RBHĈ’>ƒ°€0ʀĈ€6(ċ£Áhhm˜|ïgLM]grr’Ë—˙I.—c~É­­@İTByŸ0ŭŻüÚŒżĥû ëŸZT0#ÚgŒâ­×_âèo×)ħċŻ3@[[ĈìÉ6é‚CJ‰Ĵ܃\³ĥAşĜĥĜĜŸÄ°í5)™_réí=H__˙–½„-ĞŬIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_subimage_float.png0000644000076500000000000000461510714675706021401 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ ¸Şq’ IDATxœ—kŒ\eÇç̙=sۙîĥ³;Ŭî˲µÒmYX\$¨-X5v &ƒ\B‰„Dbż L0F4T‹ ÑD ŜŞIA²†/i€c-vcĠmĦ”eÛ]ÚîÌΙsĉ\ߋ–ÔĥĴñIŜĵï‡'çŭċıüÏó,a;vìAÇ1a’$ RJ”R­= C˘("Š"”R4›MÇáá(Œúµ€8ÜrË-Kıµ Ž099ɋ/¨KB, J˙H?­5†aàû>µZf³Éää$;wîäÁĵ$„ı€ïûKıœgı\ŽÎÎNòù<ĥm³iÓ&vîÜ  ˙/TëĴµèş,Fî£ –LAÇїĝ˙ɏ•M Ll­¨PhF<²÷`1M†a´ÒuÂĥípÑt\àĦ[Ż×o$Ŭ8ŭŭXR²RJ„ĜĥM.—#›ÍrçwÒĜüàÉ_N§ikkkÁd2Ĥ§§¸$ÄEnżŭv^³†Í]]ôôôßß*° 8vì###!¸ûîğyüñÇ[p–eaš&étšÙÙY€KB\P™ÛĥmӌŽŽÒÛۋeY4 jµŽZkÂ0$ Cfggq‡'NĜcQ(( ¤ÓiĥoßÎÜÜBˆÖŠ!Q155u~kÜ{ï½zĈŒÑŬŬM:ĉ̙3LOOû>'Ož¤VĞ‘Ëċ(•Jär9êġ:Ǐ'Ξ=Ë?ÌòċË) œœ™Ĥéğœ==Ç{s'™ywކë333OMÒŞšGĝ²^3z6l Rİ`Û6ëR­V™ššâĉTĞU‚ @J‰8Ôj5Rİù|­5ĤiòüŸ˙Ċ5#NcÛ6Ò2´6)Šd²ítsÚ3ˆDñò+û?¨Sq/ë*şğğÉf³ÔëuÇáèÑ£<ŭôÓ:tÇqXĥlW_}5,,,à8{öìÁĥí–=ôÛLLL0<<Ì5×\CħĜNÊP˜ċäÛzşkpûè:ÓóEúûûÁu]šÍ&§NâàĦCjoo/—_>ħTêœz7Oœ$X8Íğïĵöo|OêzDÒôša“ éòÚk˙ĉĥmÛ#°,gµmSİTÎÓóŬğw_ôr€‘ #|ċÖÛèÂÎĉH„#Ìb‰ħÁaÖôU8ò÷żóēOÑQjgäŠ5dí4RXXĊvòïk„ĞĊb‘\.G£Ñ |ßg˙ŝŭ\œÍfıáĈMÜòĠÛYĥ˘L&_ îy4‚ßİG ~")”;ıâ3é(—ùÖwË£|5CƒdÚ,‚ ÀJ àœ›lÛ&Š" “É`ÓÓÓ ó…-[)vtâz.^Á­×iÔ‡ë6¨-T9Y­1ë6Y=z_ğçÙñĴ”‰Ö v:…–ò)CšÍ&žçQŻ×q]Ïó.ù›o™ÁÁA–•ËÄQLÓuħ”D ˆcß'Cü0" CNÖfˆkoĵÏ8öÖÛXh%ħÛRÄÔ[*WŻ×İVĞDQÔRÀsĥoß>>~=ı\yÏ#VšP›HRIAÓ÷ñI”jM™zƒ†ÙĈÀÀ{÷îEĞ­JA’óˆ˜z½N†˜Ĥ‰çy\yċ•çäóyzzV!¤Ài6Éwt LƒPA$%~ IÓH A'$"&2 ĈĈĈZ µ\Œ‚ŝP v~û÷Ĉ}û¨×ë,,,àş.Fƒ†††ZĤi’2S‰ Tê Ğ§/xBÒ’H)ĵ0`Ŭê ‘’Ä"Bˆ MWW´BË-Ĵ÷5¸%DÁ2×u ‚€ ¨VĞÄq̖-[˜ššâġ×_'Žc^ƒ•C—‘Ï8íÔRĵ8ĤĉùÔSBC£T‚™Hbˆ…âÈG°µF&Áâ…ê]ü~ÇîVĉççñ}żġżîşë¸ïûXż~= µÙb‰š×¤Dœq\B ó _†{I‚Jbr™,Ëóy: ́èYĠ³X*A#Ϙœœ4K>cĥú˙ܞúo€™™™‡ÛGżÎĠ0 )%ï#$Ž9ÂŞ2Ċö"İB‘ŝ^2™6l;KĦTbġʕĴí]Ɋ$äOżŝ3Ó3üµğ›áĉ½•NP Ġ³óüۗÉN>oĴżcĞĥĉĉħ…˘ xZ³k×.tÓ#cŸ ½³L˜J#Riì”IÎĉÌħ#ü|÷nŽ{u˙ŭFGyċñ_RÈYĴê X˙PÚġ^À–‰/ѽ˘ƒf³”MĝLż;3Oì"›kgŬşuTşğ8òÖq~w †Žùì70•ħ9={†-{~Ä'ĥlċ/ĵÀ­›lS‚Kd2*• +Ë%š^%J% ;ì_‰‰ÁƒSTçŜĈĞΐ2áË7mâ†O^I>c0ĝ7›ŝì7œZQaϞ=LLL°÷Ġ—éµĞÀ˙t:Mı\ĤżŻLxÈ$^T4%1”"6Y·Ĥ—6Ë$m™†[MJ½j˜?xw}ó§!yöÙgÙşu+^ù A˜\ĵ?lƒƒƒßßĵy3ĞV–ÉÙiì|\&G)c’-ähËɵY˜&˜)0”BÊhñ"%ŠċEĉı—^ĊġBĉçϰùó_$–ĉÒ}C:ĵuÔA+‰(:Fk‰–CËEaCK”h ‰Ò C'ĜZ²mË(ż}ĉoÌÌX<÷ÜsLLL\úĠzÎşş:uïŠe`e@„`eB`!Zgï{[ B,ËZôħXÇÉ`Y‹>ˆLÖ]K__/˙İĤ÷ûĞȌvIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_subimage_grey.png0000644000076500000000000000445010714675706021237 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ  *OQ/žµIDATxœ—[ŒUĠ€ż};ûÌı̍3Wĉâ cñ‚ So(Xa 1‘Ä6ĦÁ¤>hRLkk¤Ñ!´´/mbŞ´ĊÔ[šièCMè˜Ĥİ5…ÚTZs†È\Ï9{Ÿ}[—>Œç LӕĴìġ°²×·Ö˙Żo˙Û`žĥ{÷nq†!I’ D)U†aHEDQ„R ß÷)•J9r”q÷Ûó”J%îğïùĤĠ!Êċ2R €ÑÑQŜx \b^˲Xırċçi­1 ƒjµÊôô4ï3::ʞ={ĜĥmÛe!ÌùŞĠê|S.j™L†ÖÖV²Ù,ë²zġjöìÙ ˙/T}Ĵµdż̝ܕ ‚½{÷ê\.ËÌÌ ożŭ6ċr™İİ)fĤ§iniáŝûïDz, ¨‡Ğáşn¸d8. °oß>Ŭ××Ça†!AŽÔԄ뺄aÈ3Ïù¤^|9a"„¨+ĥĦĦt:MÇĜökígffĝĝq]—×^{††LÓ$Žc>ĝà6mÚÄàà +VĴ ħ1e(ÌĥÙT@wÇô€BaabYĥmה"›Í’Éd<€8Žñ}Ÿħħ1â8fÑ˘E<üÈ#47·`;Ußg|ü,ï:ğöïgëwĉĥ[o!2‘1ÈL#Ŭ]3ӟ^èéé% CLÓIJ,,ËÂqœúħ677“Ëċ}Ÿŭû÷ÓÙŬÉş‘4 8é„Ô„Z‘^ğ”ĥ{ï=^zù´4ċıné54¸RĜĜy²Ÿ9Âhjj" À4Íz·mÏó¨VĞtwwy/ĵĝí|ó[[È·, Jbf=/ ‰A„…2+è|ž·ßAK[?ĝáĝùOĥsÍĠ¤S6A`[â€Öš .ċ¤z;~ü8£££x• ›·<@İ™(ñ+|ÏÇ #BĦ´&Ò0ĠŒi; ,ğ‰o?ĝ ?Ùŭ ^ŝŭ³Ä2Äu,´”Êċ2ŽÔŬ^M-á|ßg||!ŬŬ É67ûU|ż‚ ƒıqEhšH˞ğ’³%Ü\–UwŬĊóÏíĝ‰S,îï$V75g`rr’0 ëÂİT*”J%fff˜˜˜`||œ³gÏòĉ›c\żlŽ2>=ÍùéÎM—˜-áy>^8'-0‰Á´ïqzĥLÙLÑßßÏĜĜZ%h€ü\&§&I§Óġ]×L†!ï3;;‹ïûd³9öô!µbrv–À÷Q"!Œ") ÄĤI+K$2NHDLd S™>ƒÖÛ­?‘Â0ĴKĤ&š êú˲H9‰Ò$‰¤D$IL'ˆ5ËÄv]"%Q"Bˆ M{{•İO2AËû³€ °sçNcjjêK_šëkŝŽ˜ÙÒ 2‰ •ĈK(Ĥ„”J‘+´’P%ˆ$&VŠX(Ž=†İ52 PJ€j†Ğéġ‹žŻ˘½½½;z”Ä0I ƒ@C%I¨*EUJŞB‘o+ ’•ÄdÒ ,Èfi54¤{a÷\¨ĵ`ǎF­ú­ı½ĥóš”OBĈùĤ<Ĥë˘ ›Şx‘`é 7b!P" ÛĜDwK#“'Ž˘eÈĞ24†h•\ °k×.0Œz$IR_\kïûœ½öFFŝy˜‘‘ĵŝúë|cġU¸fÄ÷v=?˙I:Ĥ³³“ĥ&|Ż%J% [èëÂÄààĦL;…7u˄M__͝7ßH6m0ˏġ[Î:yġĠWÙ°acïüw ĝŝŒÇĦ­­Ŝ6ÂÀC&1Z ´’Já8&C×ô²MÛÄ0(5wĠ¤dĠMƒülÛĥ|˙—!yċ•WĜ¸q#˙ŝ‚0ùr~ħ ìXğv- ğÚȸn6G&Ħ)mҐːÊ4’I٘&˜J!e4WòJ‰bAK#· ràÍw¨x!““çYûµġÄҜ˙ŞĠ*†,qâZI´@)1ZK´”ZΉE -QJ u‚N$J+ àjÉ#ËĝŬŸßċôi›°a†ù“°½½U÷šÁNƒÁN#„ÀFÔÇ >›mƒëemÏVĈĥçĉ^@92Y²d ½½=ü miòaÙôIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_subimage_grey16.png0000644000076500000000000000445710714675706021415 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ ĵP·ĵIDATxœ–kŒTċÇçÌ93³sÙ³WvYĊĴ€Š]ŞDmEYĞìҐHB[1İ4İĥ¨Iƒ` ŭ` öĤİES!ôCMÈÓÖŞDYm"DÀ KŬËìÎċÌı½—~Xwd¸¸>ɛóžœgŜ÷÷>ïóüç1˜ĊĥmÛĤ]×%<Ï# C¤”(*OÏó}ß÷QJá8ù|ž£G˘”2n}k6€|>Ï}÷Ŭ7›[˘P(ÏçĜ³gÔÀ!fˆD"Ü|óÍ_ë§µĈ0 Êċ2ı\ÇqĜ³gÛ·ogĈW„0g(—˳ıTY"‘ ħħ‘d2I,cùòċlß@_ÎßzùŬ÷uÔ²0 Ğ} @jÍ[ıI­/ûûi?£úp‰D˘2Ÿ‰Ü•"aĊm›½ó:ÈêG7ÉáwÙ½eSĊၧžfá²[Yż~=÷ß?…B‰‰ &s9êXğv-‘H0*×5‹Ċf…°v=€Ġn`÷–M<{àPeĦOż €R ÛĥİĞĞ#‹áy/ĵ---Ĵ^½šh4ZˆÇd³YşşşaU^l —ŬZġµ” ”’x<Îèè(;wî¤T*†aìÈÈÙlĥ‰‹sÂRZ]²é“+û.ı‚™Eg„„aX5víÚĊ?L*•Âĥmâñ8;vì@QA „ ··—ĦĦ!m—İŽ #òäÊ>ž=p˲ĤĤĤjħ }Ÿ ½{÷²víZRİÏ=÷g‡³8ċ"c_œççÏ2|ĉ<…b™ááa†††°œÛĠfš&ÍÍÍLMM†aEùfh ›Í266@:ĤsŜUŒ‘L¤IÉ4fύ1§>Ğ]0::ŠišAÀää$Ÿŝ9ħXŒPSSSùöñdzfÍ,XÀÒKİ­M1fS†d4 ½%7 wŬލxêéKr`àèÑ£ôôôà8ƒƒƒAÀüùóyäħǨŻoÀ²mʎÈÈ9>8r„żïÛÇúGá;·ßF“ÁŽ× ¤Ĉӊ0÷ş…´5ÍáĝÊĞ£Ħ.Íâ…×R³‘ÂÂŞM“üR#Ĵ'Wö6lù|žH$‚iš•όh4J&“!‘HüÎçiimĉ‡?^Gşa~0Ur(ùA(‰ Ì":fáwï Ħ݉Ÿ˙â—ìxf×^ŬMÏää$cccŒŒŒpîÜ9äú%K°í#ı£ıIÎçòLMċ)•JžKı\Ĉ0LüPsJ O(˜QşşşDĞ­C\ÁĝÄ8ñxĵrj!DĈÇajj ÇqH&SÌ혇Ԋñİ)\ÇA‰ÏñÄS˜&İĥ$È $iÛÛK1w­%–Z_p"xž‡”²"Ğïş.R Çq‚€H$BÔĥ •& %E×' Ü D(E ADLĴX _I”"CÓÜÜDqâ Z†hb})À&À–-[Œ‰‰ <Ïó<\×­ Ïó*úSùIdà)M)äŭ€˘ëQ<ŠO*ӌoH<"€@)Ħ8~ì8ĤÖÈE)J|TÂ~ħÄú_iD;;;9~ìĦa†bRVв””…"Ŭ”A„!* HÄk˜“LÒhh>LûÜöéP!Y °yófcĤûÑö™“ !*•‘=}ĝ¤ëҘħʰ( AÉ,ĵáF"”À0HÖÖÑŜPËĝÉchéqÇ-‹‰C ´ ĞĥnŬj†Qġ;³ıÖÇq8uêŸ}ô!é]Íjëk1qïŭ–­BHhjmç†Îı4úŻĵĝ÷ܽ‚dÜĴÔ˙Ì3ÂEööÛooYırċf!ŽTÁ†çyœÉféîè “ÉŜÑÉük!Ž‹ĠŞĞŞĥ6z:ÚȄ{˙ĝ†³ü³…Î$­ B&ĈĈùèèé+÷ë›6mÒSù<ı‰ ĈÇÇ) h­‰D"¸ËŬ÷ŜâŜ¤çĥElDÄ&1™—ˆ1zê{vïĉĉÏPO<ħd ·˙~÷.ë˘çêNN}ú ?}öŻ_°bĊ ŬßßOKĤÇ) ÄDşe²g†97ržšDšE‹ÑÚÒÌɓ§8rä†Xqםĵx*Ë×ŬH˙‡èï_Ċ›oÉ–_EÌôy|ë˳÷ñxœÖÖVښêpJ5()P*Ŭ@÷ĵ6L bâüiJDLXóŭċÜıìF’qƒî÷cüêwâ\Ĥ•7Ŝxƒßû7ħ à4$ĥmÓÔÔÄĵÎ&<·„ ´h%1”ÂĥM]ÛAÔ2ħ-P ÔtİIÉ-7-à××ħîgżEÉ믿ΪUĞ8üŸ·p½Ò$ĵĜşğğ7÷ġġ1·­‰DÌ&–L‘ˆ'¨‹›Ô¤Dµ$˘Ĥ f ÒŸnyÄ@1§Ħ–Ûz°˙{K£ô}o%4g@ı\ĈyN~šG+‰.(:@k‰–CËiaCK”h˘C‰Ò C‡Ä´äÁŝ%üùï3·…ĝÌ<ú×ğuŭ:Â;>Dw7Â)"§'H&‘Ŭ˜EÍÄ´£YŜI˘şhN™“E~6w•O½°îîn*• ïóĝ399‰RjyċyŽRŠ,Ë}{iüĝïzí=#żGyÓÇ(ĴŜ‚Ĵ"ğ4JòĈkd³í WÈ.ÍÑv† wĥsív #&uÊċt‚/ü8ġzJÀµĈ8QÜâĉÔ$7&ŻÑ¸:Éb+ĤÑhp{‡XΚ#Ÿßh·l¤ü; ¨oÁ-wĦĉ/#§.˙üéù³¤7ĉÈĉsâĵNÔîĤ5żŠHŻĤ%:˜r$MÏrĝè÷?¸ß÷ ‚€ŽŽUXëPİÔ‹U:k%*Ġ% 'Nŝç­Hŭżsż~nıŽœ=‡Zl6N ĉ/b˘9 RĦ‹,ˆç[óDƒ~ċ‡ĝa Íb>ûٟ°wï^6lĜÀŽ;¨Ġ޸ÂàôĴĤ\ ôÎŬŞ‚#˙|Ÿ*!*½8n҅1L:œ{.#ÊN p}‹‘”żŽM˙/³ ċżË£Ÿú4Ġîn„ïµçızġŻ9^xÇ˙ê1îû£÷tşTc _0?7u 5>ĥXĊŻß‰Ö-òô:NÖ>ġ\ܞ"´ŽÈI kùöġ7·wħï#Ÿ¤R_ƒ¨"µ.mS‘-îÚ¸‘mkʌ½öżó=:;ŞŒÜı‘bࣕ‡WĞR~³GxşbĞġÛg(ÓF‰]ëÂ)„˜j‡qâs3<3áï裏ĥ² %ĉ°ÁZ”Ġ bÍ&NL]ĉJŝ§Ÿ€ġCÌᲐKfÉiʔÔHÒq\œ½ÎŒ²LJEœ „[ÁĦŒ+Šá18¸–ħ×˙$ω‹yB3j"•"iŜDĉ w×””™S ‹t—Ët ËéÓ§X3°”FbÑoĝùNŠĈĞ ây İ‹ Ĵ‹€µ.É}Ûı<6†l5) ¨<%Z´š3DÍĥԋ8ŒÊAʵ:kÌ\ĝV§ÜżsWX„QX#`êÉ˙ÙÙÌtŽ]4˜–AO·Q7ĉ™ÑŠóĵqò½*£ÏÓĝ2"OZŒ TQV£•˘TİÓ7ÀïŻ]CW–rÙçĝ~F€İ‰ivû{îÙ½—ïôŸĜ•8”Z Cúúúèïé j1ZaŒÛÉş~§ÏŒ2;y‰ölׁ?ùÈ.Ŝ˙[(‡‚áWüOÏp}uǎcϞ=?u‚Á`ĝ-<àû>===Ĵ[ÛCš´Ñ2ÇZ…5a ï°y ÏÁ÷„0`ÌRİiÍÎmĝ‡ŭûĜ÷7_A)͑#GĜğw/§OŝI*ß9 Ġ†‡‡żĝCħĤż‡Rà”+”ÂĦCħR˘PŞQ*x88.c:[zhÀŬY½Û7⿟˘ĠN™™™ĉĦ~˜\;+{ Žc„nrá&ÖhĴJÀ°9ÖjĴÖĞ—‹RĞ1Fa­ÄJħa%Ġ|r÷VŝġĞ4/ĝ"{öìıŭĞġ-Ğ×ğìàêUà… RB”Rx¨ċ3¨7Ġ¨Ïó–4K8!ž·¤IÚ ‹™ĤM›Xğv_>)‚IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_subimage_unknown.png0000644000076500000000000000444410714675706021773 0ustar chriswheel‰PNG  IHDR szzôbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ  t?VħIDATxœ—{lWċÇ?çúğ_è(ĥ`•Ş(ÈmÌEì”ħIYâ˜AÍd8ŒÉÌ&:7Äl˘À–ĉ§8—˜ħnp81›)Ò U@£ċVzùµżûı½ïğ?:š-%{’“óϓs>çû|Ïû~_1jíÚµŞ\.yŽàû>B¤”£wÇqp]×u‘RR,Éf³tuu!Ô.÷|s,€l6˒%KĈj…Èċrd³YÚÚÚxçwpIˆ1 `îÜı—íSJĦiR‰L&CħX¤­­uëÖħjĠŞKBèc”JħZŝ§˘Ñ(Äb1BĦ---Ĵ[·@ŭ_RJ`ä /w] F”ğĘ#ĜÙ÷!í;:˜v´™½Çq œa'ĝxSş£ë:†a ëú(D(….:ŽK*´lĥjZ6[-şw&Uè8ùW†8ĉIœôiZĉMƒĝ3iĉĤç“Ëċp‡ F ‡tww_V R/üħ%œêîĤcoƒÁĉċżaaŭ]ÜÙM5ŜÍÏ·neùŬK0“%Jv/·ĵÈÒyËQ( Ŭ X,²˙~*++q]˲HR!hhh ½½}”ò™Ï9³iÙlUħ0Cş7͉C:Ó½ĉϟOcc#ş …°m+_ùŻ—7÷ĵĈ@×Îı0^ŭ&ÔMÀ²,ÖŻ_Ooo/RJ¤xžGİX˘P,ÎòqgçĊ=°tŜ}lüÑëôĵĠ£]sgµrÛĥI$$ Âá0\ġ*÷˙ݕޛê“Ħ8vâ3,Ó"J³bĊ úûÎS(ĉÈ‘è§ŻLfˆS=§8ÔĠuq€“ç#ƒB"‘µµµŒ7Žx<>jRı„ú×d"3†İ#5ááaòù<ħhŒxü:'OždÓ+›.eyòÇOᤙ\ƒ%bF%Bi1Éı‚PÈfú HUUħúé§yfġ“\Û4Ó4° ÛÖÑ íòKñ‰?ôj7ĝ·Ŭ۞Â0 şğğ9t¸‹$¨€\aÂpğd“ޤħL$žè/éw}Ĥ̜Ċ+żÍ†Ÿŭ]ħM +Ĝ âñ8555Œ?žÇ1wŜlôj›ìùĦ~™ĈêÉ$"1Âĥa˜†RŠŜ|‰^/`î—ï ä¸œì9Ħ+t]Ħş>6@4Žğ^çÀ‡û¸úĈkÑ 8?œ§˙lކşiĜ–M8A3M4MCi ÑÈyg²Eò†McC#ğwïFW”Ä6Áóĵħ •Jqìì ì¤Mş62}MġÓħ#1ôP ‰F€F 4Nv(Ëß·o%_t˜:µ™ŞŞJŽ9ʏöĦ ;nżŽPˆ³},Úùs-fË]Ü9„tA06€bDúl{◜í=GoïyÒħ8S'7r×˘Ż°mÇÛd‡z)dÎbŞ€__À­ón jI?²ĝéĈW9SUÇΝ;immċo{ß§>4\ĦšĤĦĦH&£ˆ`QÛM [Ĝ†Ĉòo´¤D.Â/#ĵJJĉ͜ÊóĞîÇ^ Û·ogñâĊ´ïy²_<˙w566iiiĦ²"…ši²$&B)4+Œm€”<¤ïxE@,,ĵOèc+P,î ‡ğ2H üH…ë” Ù§ħt …@şÒwÂC)ċ ¤’hÊ'¤÷/šÁkÛ>âÔ)“;vÚÚzéS녪İİPġUi08`†‘Rħ4°"H!A })4¤WÂ4M‚ À4!˜f@ıP&çê4773iR=˙‡nig…Íĵ$IENDB`‚gamera-3.3.3/gamera/pixmaps/icon_undo.png0000755000076500000000000000170010714675706017360 0ustar chriswheel‰PNG  IHDRÄ´l;sBIT|dˆwIDAT8••KlU†żħÇv‡xÚĉAB-§ éC…ESŠDi…xUˆšRTVŬ *Uê‚."¤Ab‚ ¤.*  …RBBÀ­ M‰•idœÚIĈOüša1wŒmÉ=ÒĠġŒï|÷œsÏùŻÄ›Ôñìt³h'ó‰á³$€6³ŭ0`T4Ġìü³ÌŒe`¨ŠMy $ĵkÏżŭ“û1F7rÜÌĤıÈôŠĜ b“`K-^yĦI€Ĵhj ;3ÇÏú"ŸÜÜĥóÈ0g_ŝ~‹MSHfk@ ¨IŠĤ:…d&* 5ES­ìÌs÷Ó\ÉŝÀĠğ?Pе‡ĠäÔáCœIhÄ÷ŒŝJ’˘İŽg°M]ÍÎÌqnöß˙5O­{÷Ñ µA·Œ ÛĊMŒb‰W'ŸaÄT8ûÜÀA ')šê\ŭ ɋïjxĦŸ›½Ä7·ĉ›ÀËynĵŝixhê z {^8€Q,qëËH’p Xn‚c=QKÏ2ïÜáÛ?ˆM4áŭ ÖŬ”8œ*€ÜüÊ?"ú|‚ĜŜAŽ;Α˜Ê… ç1Rú“’˘İNúÓóŸ‘7óüĥ”iƒo›À†˜-át ÷_ =E9™àŜû×xv#Ÿl–Û×ŝDŬ³{8ÊŭË,œŭà-qÒ9 lñIèĞäJG}‘à/;k$><íá‚2ÀÒú ŭá]Ĵ›[Ĝu8ÔÜ;1†‘Ò- äuÜF:Ì£Rϗħ–ŠTsFJ¨ÊWÒ×ħÒĞô ş!³°x“#/c>7RúÓ@]”b£ìu™ßiĜĝ{eŒ”ŽˆjQn;ŸÏç  ·[ÍD˘CNäĘĵ&Ş".’™Q`yóôjĥm—Ä;íÚ"ž‘M{4@ù×<€)Rĥ% ×WĊ ÇÇ^7zà´@ƒ}ûb–ïÑ›ÔÍê+¸zħ”eqĠ˙ĥÂm‘g[xˆLìŜ?Ċ\)bêë§灀W=P'ÓÛNóÈxĴLĵÇ;Ĵ—pĞe˙D¨Ú­#Ĥ¸ž'ò;Ob4³š}éό?XÚÇ&.ŝ(/Hïϒ ?Ä'…+ÂʞÎSdġ\=›ÈÉ\ïké+pöT%´ú·ñ‰ß]˙¤úGñAğĞIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_zoom_in.png0000644000076500000000000000147310714675706020071 0ustar chriswheel‰PNG  IHDRàw=ĝbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ Ah‚ÈIDATxœĊ”ËOQĈżĥPÚ& %äJtQXú7hܰéĈèRŬ(lâF—ÂĤ Ĉ ]ħqƒ‰Ú ĈXò0ħÓ2mçÁ<ï=.È4´RšżĠɝ™ïwϙï^à„ċĞö@Ş\“$İêûžñÔÌ4ÚÎtĦ9†Ĥ*ÈŝÚĈƒ{÷k•ÌNNP2½JélŽ6ÒêŠ}’dÚT÷èÑäÖ]5šß{7ĈÇmï@}°ǁê2†mYG"ŽŻÉԄë“GJ­ ‚@‹—pş³ €D@ΰ šDBĤ(#oZ8'¸Üž.O£òğĉS3ÓEZàp€°Ĉ &'Ĝ>X Íáĝ,fR-LÍL„JĠıEW_šC!lY6ŽŒd‹CĥÈĤƒ<Èé&· X6:݌ċ]ZZá`ô@= âP,†Ĵac×ĥ!Û EŬ€é|D"ǨšĠ4‘×-ĜA ÎĦ ğŽ˘ÉV f‚ë:DŬFӞì àw‹µïß`ÁQ3°–WŬ³a&ò†ƒş VȔrèiiCwèv–>x”èŬ—eìÔ5`ċ·ÍٟyQ7 3Š˜A°1ŒkCp³½CÇI‘Ğ…—Ïq1܈ŜHÍu~0nZfAÂÙî^\8[QĵŭÊÓî˙’{’×d•ĉ·Dz‘ŜĤ'ËĞôxyĉ·DZW4ŠÏ͒ ”H$(Ä,Ï'ş F)>7K ÉZüıM ɕ’ħ 4::FM›”H$Žĵ6ŞÎ0çĵl͝yÍ[~öƒƒƒF,Ğú?jğħßi˙À‘ş>ö"I’|İT²4žx<ŽX,F•Já]yÔ܁Wˆ 8˜·ı“éĝı> 7Ĉ'ĝ/úçüŞ*ÉÎIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_zoom_norm.png0000644000076500000000000000144510714675706020435 0ustar chriswheel‰PNG  IHDRàw=ĝìIDATxÍTMOQ=mĦ ´$”’R ,4.”è˘°ô7hܰactİn6~č.Ğ&Ĉ…‰ ‰Ĉ ]ħqƒ‰Ú ĈX>„bbKiËt†7ßÏ÷&yÍ8–Mœ¤ıozï=çŬ{îà?Jĝ‘H„z}ù|bĵ7VĵïIÀwîŬEç‘ZCa(r [?Ò¸qíş“÷'DN"ż93MİešÚÊѵĦ)y—&wú!/ÑuvĊüââ–Ġl@8yÒċĞWparÑn4›1MÈ&EF5–ŠĊù‰qas"9M™ù•lıEœ`ŝŭ÷ÄĝA™9UGV3‘e6³#Ħ é8‰àtG§úb8HĞüœ™ƒóž‡ÚÚaÚpÀ ӂeShìgĝ|°A(Ìù1›ARÖÁÒŞQZl`€ †n l2@,é6$„ÄŞ(X6rDc˙ë(ħ˜ž3c"µŞ-DÚ;ÀÚ MUAPİ̀,lħŝo#²°CTĝ,‚`À‡@[[U`á,ȊYÓP :Œ ŞÍT ÛĤÍBŞTµ4Ĝ„ K ´ìJ£Şu4à+_ż@‡YEĊJÍŭ.–T߈ ĞX€–ÏĦݽ½ĦCĜ\xWX8›˘7ŸħلŸYGPŜsŜˆJLÜ`sçFNàbWFê™"Á6÷ì N†›ÑÏúÛÚàw…R„VÌho?ÎÇî(Ŝx.Rê³|ìĝ&ŻH2}ı‘OSizq™Ŝ^\uŜWK ?~älòìì, YúžïUMFNF ıĝ˙žĤÜ `-ëk”“Ôڅ²^fNb³Ir?bsƒŻ^Óч0<<ŒħħQLMMUÜêŠnàŭÎüĉƒƒC5IÊ{àá}­IÌĞI&e âñ8Ż„Š*ž— œ ŞÙƒx ĝÍ˙*‰ ¨Ĝ]™··ożs]¸¸ŜħġŠé÷úÜX˙ÏùÔëŻĴ ĜIENDB`‚gamera-3.3.3/gamera/pixmaps/icon_zoom_out.png0000644000076500000000000000146310714675706020271 0ustar chriswheel‰PNG  IHDRàw=ĝbKGD˙˙˙ ½§“ pHYs  ÒŬ~ütIMEÒ .îŝÀIDATxœ½”½OSQĈŸĥPÚ&\J"H0h”èQŭ4.,]ŒŽê˘°ÄEǂ‰q01i‚q`‰ĊµŒħ|ĊÄŜ–Ûö~ô~žó:K¤ĥáŠÁg:9÷œçwßçĵçÇ,_½‚ Pġœ$Iu×{¸ĈÓ³3è8Ck( MU˙‘Ċ½;w Ú7ż?5IİÌeòÚTtʨJ—5ú É´VèÁÔ$Ġޞż›ßĵ} ×&&íìBc° 9ǁêr†ĴĴ£ÄWÇÇÇçTzR×ġİû ‚@Kï—q²;†@À" `XM˘a!W–Q4-œ\láBoÌST~×|zvĦHĥÀ8ÁäÛç Ħ9ĊÒŞ…éٙšP­wëïGk(„mËFĜñq‚lqÈĥÙtPdŬËF÷Ñĵ„ĥv8˜†=ƒ8‹!oĜĜµmÈ6CY7àc:‚‘ÈßTMƒjš(êì çP †]ÇFÙdÈ(%3Áu˘n£"{ĝŬÁú×/°à‡¨X/*ÈW,䘉˘áà›‚•Š0zÛ::ċwžşèͧì44aġ§ÍÙËĵĴ™ EÌ!ĜĈ•ás¸Ŝَáżé"W‹ÏŸâ|¸}‘Zü`Ü´̒„Ó=}¸QċâgÏ <Ìmïĵ÷.÷´˘ÚQ)›A4ÄkŻĵÊϜœ8ςÁÀF ŭŭŭü<ß(ñgl’Á żó햟N=Şş:Ĝ*ŞĦ 9@Óu¸ì6Œž}Ácq£ÜÏî%à·L,§Ó‰×Oż‰kÁÖò2Vr2ĉRYüÏ·šÀW×WñC8†ċŒ„7Ŝ: v~‹ÖMŜ™áâÜ,îhi…ĠjĦ1ŠyYC„Îëİ4²‚ğ)—ž}­ˆÇ,“[f`cîi$­„ᨭ‡V,@Ġtè™ŝTA€nµCÒòGÖQ^nĞQKóVħ0ĵ“ó3ÓB—·EE…Rà´RÀŠ˘@¤YĴQÊBb <Èù7#ÒL ³™Ż‹8ë]èU9ŸGÎZ†<) £èˆĉUÄT#½ĜĴt ‘Ġ0Sß+ċˆ’žfV’•e$r4bEQ‹9ƒŸġşÉ3Ï?‡ ÌâÄÉGÑÙ{í˘T]Gƒ?³tŸÖ‘;2§QÌ`éÚU4t#"ċ—ĜËʐ"†½üÔà ê›@™C˜ÒHK„ĉ{öj\BmOżĝ2-·€†Gˆ9ƒ;˘ÉK ÙÊqe-B Z€Hygœï¤ééi4r—R— NS/?GgMÚjkQm³ppĈıĦ.&]³şttlİĞÀĠ5ŸU¸şÌTqŠ˜ÔèK&êdôƒ3ÂS/ĵ„*{wÚÚŜNۅcS]ÚĤşĉÖHj–˙ò£ŜÓÍ3Ġ …Š–î~Ïĝۖ3~<ò!Žĥ·!:yŽŸ1Ğ‹=:Ĉ˙:CRVÑv`?ÒŞŽT.iC‚Ŭ*ÀJ³7˘ŠXb½ellŒˆ˘Hè#âŠH%“˜ššD<"⧙$˘1Ĵú/ĦŽ à×?ŭXÌ$iŻ’‘ÍċÉİÓi3ŝf ¨EĜêŠ7ÏX^ZÄ}}'µĜQ}ƒ5[%œGğ²TB9LkL@Ž‹ĜW߈½ŽJ„fÙĉ XímVÓ+X)u1ZXäÚ:ì58ÖußéB×f*ârŠLx%—7Ğ‹Rr2ŽğöĥĦ·^<Ù܀İo.yW#˂ĥr²”Î’oòĊbœY¸NŜ^¸Áżod$òÉgŸ²·DĈÇljCWxŭv6`—8ïòrq9HĜl³ŭ¤êŸżıöÍîı2ƒŬj͜ ´§›†Ñìß}Oĵ#pğŬèéñbhhèö˜pK.Yä‡İş 'ü%—<ù,›ùùËĊü ŠîlGŭIENDB`‚gamera-3.3.3/gamera/pixmaps/img2img.py0000644000076500000000000000472311240323134016563 0ustar chriswheel# # This file has been taken from wxpython (see the file # wx/tools/img2img.py in the wxpython source distribution) # # Copyright (c) 1998 Julian Smart, Robert Roebling et al # # This program may be freely used, copied and distributed under # the terms of the wxWindows Library Licence, Version 3. See # the file "copyright" of the wxpython distribution from # http://wxpython.org/ for details. # """ Common routines for the image converter utilities. """ import sys, os, glob, getopt, string import wx if wx.Platform == "__WXGTK__": # some bitmap related things need to have a wxApp initialized... app = wx.PySimpleApp() wx.InitAllImageHandlers() def convert(file, maskClr, outputDir, outputName, outType, outExt): if string.lower(os.path.splitext(file)[1]) == ".ico": icon = wx.Icon(file, wx.BITMAP_TYPE_ICO) img = wx.BitmapFromIcon(icon) else: img = wx.Bitmap(file, wx.BITMAP_TYPE_ANY) if not img.Ok(): return 0, file + " failed to load!" else: if maskClr: om = img.GetMask() mask = wx.MaskColour(img, maskClr) img.SetMask(mask) if om is not None: om.Destroy() if outputName: newname = outputName else: newname = os.path.join(outputDir, os.path.basename(os.path.splitext(file)[0]) + outExt) if img.SaveFile(newname, outType): return 1, file + " converted to " + newname else: img = wx.ImageFromBitmap(img) if img.SaveFile(newname, outType): return 1, "ok" else: return 0, file + " failed to save!" def main(args, outType, outExt, doc): if not args or ("-h" in args): print doc return outputDir = "" maskClr = None outputName = None try: opts, fileArgs = getopt.getopt(args, "m:n:o:") except getopt.GetoptError: print __doc__ return for opt, val in opts: if opt == "-m": maskClr = val elif opt == "-n": outputName = val elif opt == "-o": outputDir = val if not fileArgs: print doc return for arg in fileArgs: for file in glob.glob(arg): if not os.path.isfile(file): continue ok, msg = convert(file, maskClr, outputDir, outputName, outType, outExt) print msg gamera-3.3.3/gamera/pixmaps/img2py.py0000644000076500000000000001370511240323134016437 0ustar chriswheel# # This file has been taken from wxpython (see the file # wx/tools/img2py.py in the wxpython source distribution) # # Copyright (c) 1998 Julian Smart, Robert Roebling et al # # This program may be freely used, copied and distributed under # the terms of the wxWindows Library Licence, Version 3. See # the file "copyright" of the wxpython distribution from # http://wxpython.org/ for details. # """ img2py.py -- Convert an image to PNG format and embed it in a Python module with appropriate code so it can be loaded into a program at runtime. The benefit is that since it is Python source code it can be delivered as a .pyc or 'compiled' into the program using freeze, py2exe, etc. Usage: img2py.py [options] image_file python_file Options: -m <#rrggbb> If the original image has a mask or transparency defined it will be used by default. You can use this option to override the default or provide a new mask by specifying a colour in the image to mark as transparent. -n Normally generic names (getBitmap, etc.) are used for the image access functions. If you use this option you can specify a name that should be used to customize the access fucntions, (getNameBitmap, etc.) -a This flag specifies that the python_file should be appended to instead of overwritten. This in combination with -n will allow you to put multiple images in one Python source file. -u Don't use compression. Leaves the data uncompressed. -i Also output a function to return the image as a wxIcon. """ import sys, os, glob, getopt, tempfile, string import cPickle, cStringIO, zlib import img2img try: import wx except: from wxPython import wx def crunch_data(data, compressed): # compress it? if compressed: data = zlib.compress(data, 9) # convert to a printable format, so it can be in a Python source file data = repr(data) # This next bit is borrowed from PIL. It is used to wrap the text intelligently. fp = cStringIO.StringIO() data = data + " " # buffer for the +1 test c = i = 0 word = "" octdigits = "01234567" hexdigits = "0123456789abcdef" while i < len(data): if data[i] != "\\": word = data[i] i = i + 1 else: if data[i+1] in octdigits: for n in range(2, 5): if data[i+n] not in octdigits: break word = data[i:i+n] i = i + n elif data[i+1] == 'x': for n in range(2, 5): if data[i+n] not in hexdigits: break word = data[i:i+n] i = i + n else: word = data[i:i+2] i = i + 2 l = len(word) if c + l >= 78-1: fp.write("\\\n") c = 0 fp.write(word) c = c + l # return the formatted compressed data return fp.getvalue() def main(args): if not args or ("-h" in args): print __doc__ return append = 0 compressed = 1 maskClr = None imgName = "" icon = 0 try: opts, fileArgs = getopt.getopt(args, "auin:m:") except getopt.GetoptError: print __doc__ return for opt, val in opts: if opt == "-a": append = 1 elif opt == "-u": compressed = 0 elif opt == "-n": imgName = val elif opt == "-m": maskClr = val elif opt == "-i": icon = 1 if len(fileArgs) != 2: print __doc__ return image_file, python_file = fileArgs # convert the image file to a temporary file tfname = tempfile.mktemp() ok, msg = img2img.convert(image_file, maskClr, None, tfname, wx.BITMAP_TYPE_PNG, ".png") if not ok: print msg return data = open(tfname, "rb").read() data = crunch_data(data, compressed) os.unlink(tfname) if append: out = open(python_file, "a") else: out = open(python_file, "w") out.write("#" + "-" * 70 + "\n") if not append: out.write("# This file was generated by %s\n#\n" % sys.argv[0]) out.write("try:\n") out.write(" from wx import ImageFromStream, BitmapFromImage\n") out.write(" wxImageFromStream = ImageFromStream\n") out.write(" wxBitmapFromImage = BitmapFromImage\n") out.write("except:\n") out.write(" from wxPython.wx import wxImageFromStream, wxBitmapFromImage\n") if compressed: out.write("import cStringIO, zlib\n\n\n") else: out.write("import cStringIO\n\n\n") if compressed: out.write("def get%sData():\n" " return zlib.decompress(\n%s)\n\n" % (imgName, data)) else: out.write("def get%sData():\n" " return \\\n%s\n\n" % (imgName, data)) out.write("def get%sBitmap():\n" " return wxBitmapFromImage(get%sImage())\n\n" "def get%sImage():\n" " stream = cStringIO.StringIO(get%sData())\n" " return wxImageFromStream(stream)\n\n" % tuple([imgName] * 4)) if icon: out.write("def get%sIcon():\n" " icon = wxEmptyIcon()\n" " icon.CopyFromBitmap(get%sBitmap())\n" " return icon\n\n" % tuple([imgName] * 2)) if imgName: n_msg = ' using "%s"' % imgName else: n_msg = "" if maskClr: m_msg = " with mask %s" % maskClr else: m_msg = "" print "Embedded %s%s into %s%s" % (image_file, n_msg, python_file, m_msg) if __name__ == "__main__": main(sys.argv[1:]) gamera-3.3.3/gamera/pixmaps/int_vector.png0000755000076500000000000000075410714675706017567 0ustar chriswheel‰PNG  IHDR szzôsBIT|dˆ£IDATX…í–;KA…?5ĈQ DDÔĈZÁRĴ%?@A˙€Elö‚X¤² ˆ`age£ Ğ(ˆ6jHĦ‹ı6“ÉN’ŬĠ"90$gĉž{ìëB ͎6ù6œ€§|Ĉnŝ½û§hX—!™#½L´‡hÒÜKP4ìE…2ŻX˘—ŒGüËKħßÚíŞŒÖóÔĉe à‡9Ô“ 8ž~ÏÀpTz;ÔÚ 9O/GY½ pü‹Â³ZŻ}ƒ&´Iİßġış˘ 0ĵ×@'0 |xzäÙ*ÚÀ:€ 1™bTé6}ôìHŬ–”Ĥ?ħèX3ğÚ0U€ÔöŠzÙô,YÌ8–óáGš.]ƒyÖäìPxRÓÜñ¨LŸÀF7Oŭĉ&”qà u£Í£>ĠçZŭFĉuHË^JĝĥV›­ÓĵÂË68ÂóRÓCùU@} lHhJ^ĥd˘†ĉ` àŜP1—P4Ĵĉ˜Š[ĝwüı;܇Bİ÷ IENDB`‚gamera-3.3.3/gamera/pixmaps/plus.png0000755000076500000000000000016310714675706016370 0ustar chriswheel‰PNG  IHDRÄ‹sBIT|dˆ*IDAT•cdd@€˙ ˙…˜‚ !&”dd¤ƒ (‰1¨?+IENDB`‚gamera-3.3.3/gamera/pixmaps/toolbar_close.png0000644000076500000000000000017610714675706020235 0ustar chriswheel‰PNG  IHDR2'7 EIDATxc`@€˙0&#”òA‚È0Ċ8è÷ïߣ¨fİ[²d şX˙äɓ˙”ÀaT]Û¨E€…)ЏUN ş“ ĊIENDB`‚gamera-3.3.3/gamera/pixmaps/toolbar_open.png0000644000076500000000000000015710714675706020070 0ustar chriswheel‰PNG  IHDR_?,½6IDATxc`  ĝ3– Ĉѓ'Oŝ˙ŝŭ{¸$…b(ĉÂpK¨ìrÇ†ƒx4àİÉV+,ì£ÒIENDB`‚gamera-3.3.3/gamera/pixmaps/x.png0000755000076500000000000000020310714675706015647 0ustar chriswheel‰PNG  IHDRÄ‹sBIT|dˆ:IDAT•…A Š˙˙3ÔD™É¸’ °@„|üM,V*çbfX÷n΍„?eşêP!Ħ <5a½X=IENDB`‚gamera-3.3.3/gamera/plugin.py0000644000076500000000000001432511652050143015050 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2009 Ichiro Fujinaga, Michael Droettboom, # Karl MacMillan, and Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.args import * from gamera import paths from gamera import util import new, os, os.path, imp, inspect, sys, copy from gamera.backport import sets from types import * from enums import * plugin_methods = {} class PluginModule: category = None cpp_namespaces = [] cpp_sources = [] cpp_headers = [] cpp_defines = [] cpp_include_dirs = [] extra_libraries = [] library_dirs = [] define_macros = [] extra_compile_args = [] extra_link_args = [] extra_objects = [] functions = [] pure_python = False version = "1.0" author = None url = None stable = True def __init__(self): for function in self.functions: function.module = self.__class__ core = __import__("gamera.core") if core is None: return for function in self.functions: if not isinstance(function, ClassType): function = function.__class__ function.register() class Builtin(PluginModule): author = "Michael Droettboom and Karl MacMillan" url = "http://dkc.jhu.edu/" class PluginFunction: return_type = None self_type = ImageType(ALL) args = Args([]) image_types_must_match = 0 testable = 0 feature_function = False doc_examples = [] category = None pure_python = False progress_bar = "" author = None add_to_image = True def get_formatted_argument_list(cls): return "**%s** (%s)" % (cls.__name__, ', '.join( [x.rest_repr(True) for x in cls.args.list])) get_formatted_argument_list = classmethod(get_formatted_argument_list) def escape_docstring(cls): if cls.__doc__ is None: doc = '' doc = util.dedent(cls.__doc__) doc = doc.replace("\n", r"\n").replace('"', r'\"') return r'"%s\n\n%s"' % (cls.get_formatted_argument_list(), doc) escape_docstring = classmethod(escape_docstring) def register(cls): # add_to_image = add_to_image and cls.add_to_image if cls.return_type != None: if cls.return_type.name == None: cls.return_type = copy.copy(cls.return_type) cls.return_type.name = cls.__name__ if not hasattr(cls, "__call__"): # This loads the actual C++ function if it is not directly # linked in the Python PluginFunction class parts = cls.__module__.split('.') file = inspect.getfile(cls) cpp_module_name = '_' + parts[-1] directory = os.path.split(file)[0] sys.path.append(directory) found = imp.find_module(cpp_module_name) del sys.path[-1] if found: module = imp.load_module(cpp_module_name, *found) if module == None: return func = getattr(module, cls.__name__) elif cls.__call__ is None: func = None else: func = cls.__call__ if type(cls.__call__) == new.instancemethod: func = cls.__call__.im_func func.func_doc = ("%s\n\n%s" % (cls.get_formatted_argument_list(), util.dedent(cls.__doc__))) cls.__call__ = staticmethod(func) if cls.category == None: category = cls.module.category else: category = cls.category if not category is None and not func is None: image_type = isinstance(cls.self_type, ImageType) if image_type: pixel_types = cls.self_type.pixel_types else: pixel_types = [NONIMAGE] for pixel_type in pixel_types: if not plugin_methods.has_key(pixel_type): plugin_methods[pixel_type] = {} start = plugin_methods[pixel_type] for subcategory in category.split('/'): if not start.has_key(subcategory): start[subcategory] = {} start = start[subcategory] start[cls.__name__] = cls if not func is None and not cls.self_type is None: cls.self_type.register(cls, func) register = classmethod(register) def PluginFactory(name, category=None, return_type=None, self_type=ImageType(ALL), args=None): from gamera import core cls = new.classobj(name, (PluginFunction,), {}) if not category is None: cls.category = category cls.return_type = return_type cls.self_type = self_type if args is None: cls.args = Args([]) else: cls.args = args func = getattr(core.ImageBase, name) cls.__call__ = func cls.__doc__ = util.dedent(func.__doc__) cls.module = Builtin return cls def get_config_options(command): return os.popen(command).read() def methods_flat_category(category, pixel_type=None): if pixel_type == None: methods = sets.Set() for pixel_type in ALL + [NONIMAGE]: # We have to cast the lists to sets here to make Python 2.3.0 happy. methods.update(sets.Set(methods_flat_category(category, pixel_type))) return list(methods) elif plugin_methods.has_key(pixel_type): methods = plugin_methods[pixel_type] if methods.has_key(category): return _methods_flatten(methods[category]) return [] def _methods_flatten(mat): list = [] for key, val in mat.items(): if type(val) == DictType: list.extend(_methods_flatten(val)) else: list.append((key, val)) return list gamera-3.3.3/gamera/plugins/0000755000076500000000000000000011755376174014677 5ustar chriswheelgamera-3.3.3/gamera/plugins/__init__.py0000644000076500000000000000000010714675711016767 0ustar chriswheelgamera-3.3.3/gamera/plugins/arithmetic.py0000644000076500000000000001252211652050142017360 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """The image utilities module contains plugins for copy, rotating, resizing, and computing histograms.""" from gamera.plugin import * import _arithmetic import _logical ARITHMETIC_TYPES = [GREYSCALE, GREY16, FLOAT, RGB, COMPLEX] class ArithmeticCombine(PluginFunction): self_type = ImageType(ARITHMETIC_TYPES) args = Args([ImageType(ARITHMETIC_TYPES, 'other'), Check('in_place', default=False)]) return_type = ImageType(ARITHMETIC_TYPES) image_types_must_match = True class add_images(ArithmeticCombine): """ Adds the corresponding pixels of two images together. The two images must be the same type. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. Use .subimage on either image to crop appropriately if necessary for your specific case. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. """ def __call__(self, other, in_place=False): if self.data.pixel_type == ONEBIT: return _logical.or_image(self, other, in_place) return _arithmetic.add_images(self, other, in_place) __call__ = staticmethod(__call__) def __doc_example1__(images): rgb = images[RGB] greyscale = images[GREYSCALE] clipped = rgb.clip_image(greyscale) return [clipped, greyscale, clipped.add_images(greyscale.to_rgb(), False)] doc_examples = [__doc_example1__] class subtract_images(ArithmeticCombine): """ Adds the pixels of another image from the current image. The two images must be the same type. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. Use .subimage on either image to crop appropriately if necessary for your specific case. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. """ self_type = ImageType(ALL) args = Args([ImageType(ALL, 'other'), Check('in_place', default=False)]) return_type = ImageType(ALL) def __call__(self, other, in_place=False): return _arithmetic.subtract_images(self, other, in_place) __call__ = staticmethod(__call__) def __doc_example1__(images): rgb = images[RGB] greyscale = images[GREYSCALE] clipped = rgb.clip_image(greyscale) return [clipped, greyscale, clipped.subtract_images(greyscale.to_rgb(), False)] doc_examples = [__doc_example1__] class divide_images(ArithmeticCombine): """ Divides the pixels of the current image by the pixels of another image. The two images must be the same type. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. Use .subimage on either image to crop appropriately if necessary for your specific case. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. """ self_type = ImageType([GREYSCALE, GREY16, FLOAT]) args = Args([ImageType([GREYSCALE, GREY16, FLOAT], 'other'), Check("in_place", default=False)]) return_type = ImageType([GREYSCALE, GREY16, FLOAT]) def __call__(self, other, in_place=False): return _arithmetic.divide_images(self, other, in_place) __call__ = staticmethod(__call__) class multiply_images(ArithmeticCombine): """ Multiplies the corresponding pixels of two images together. The two images must be the same type. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. Use .subimage on either image to crop appropriately if necessary for your specific case. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. """ def __call__(self, other, in_place=False): if self.data.pixel_type == ONEBIT: return _logical.and_image(self, other, in_place) return _arithmetic.multiply_images(self, other, in_place) __call__ = staticmethod(__call__) class ArithmeticModule(PluginModule): cpp_headers=["arithmetic.hpp"] category = "Combine/Arithmetic" functions = [add_images, subtract_images, multiply_images, divide_images] author = "Michael Droettboom" url = "http://gamera.sourceforge.net/" module = ArithmeticModule() del ARITHMETIC_TYPES del ArithmeticCombine gamera-3.3.3/gamera/plugins/binarization.py0000644000076500000000000003531011704334020017716 0ustar chriswheel# # Copyright (C) 2005 John Ashley Burgoyne and Ichiro Fujinaga # 2011 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # TODO: Add GREY16 compatibility. # TODO: Add Yanowitz and Bruckstein post-processing (a la Trier and Jain). """Adaptive binarization tools.""" from gamera.plugin import * from gamera.args import NoneDefault import _binarization class image_mean(PluginFunction): """ Returns the mean over all pixels of an image as a FLOAT. """ category = "Binarization/RegionInformation" return_type = Real("output") self_type = ImageType([GREYSCALE,GREY16,FLOAT]) def __call__(self): return _binarization.image_mean(self) __call__ = staticmethod(__call__) class image_variance(PluginFunction): """ Returns the variance over all pixels of an image as a FLOAT. """ category = "Binarization/RegionInformation" return_type = Real("output") self_type = ImageType([GREYSCALE,GREY16,FLOAT]) def __call__(self): return _binarization.image_variance(self) __call__ = staticmethod(__call__) class mean_filter(PluginFunction): """ Returns the regional mean of an image as a FLOAT. *region_size* The size of the region in which to calculate a mean. """ category = "Binarization/RegionInformation" return_type = ImageType([FLOAT], "output") self_type = ImageType([GREYSCALE,GREY16,FLOAT]) args = Args([Int("region size", default=5)]) doc_examples = [(GREYSCALE,), (GREY16,), (FLOAT,)] def __call__(self, region_size=5): return _binarization.mean_filter(self, region_size) __call__ = staticmethod(__call__) class variance_filter(PluginFunction): """ Returns the regional variance of an image as a FLOAT. *means* Pre-calculated means for each region. *region_size* The size of the region in which to calculate the variance. """ category = "Binarization/RegionInformation" return_type = ImageType([FLOAT], "output") self_type = ImageType([GREYSCALE,GREY16,FLOAT]) args = Args([ImageType([FLOAT], "means"), Int("region size", default=5)]) def __call__(self, means, region_size=5): return _binarization.variance_filter(self, means, region_size) __call__ = staticmethod(__call__) class wiener_filter(PluginFunction): """ Adaptive Wiener filter for de-noising. See: J. Lim. 2001. *Two-Dimensional Signal Processing.* Englewood Cliffs: Prentice Hall. *region_size* The size of the region within which to calculate the filter coefficients. *noise_variance* Variance of the noise in the image. If negative, estimated automatically as the median of local variances. """ category = "Filter" return_type = ImageType([GREYSCALE,GREY16,FLOAT], "output") self_type = ImageType([GREYSCALE,GREY16,FLOAT]) args = Args([Int("region size", default=5), Real("noise variance", default=-1.0)]) doc_examples = [(GREYSCALE,), (GREY16,), (FLOAT,)] def __call__(self, region_size=5, noise_variance=-1): return _binarization.wiener_filter(self, region_size, noise_variance) __call__ = staticmethod(__call__) class niblack_threshold(PluginFunction): """ Creates a binary image using Niblack's adaptive algorithm. Niblack, W. 1986. *An Introduction to Digital Image Processing.* Englewood Cliffs, NJ: Prentice Hall. Like the QGAR library, there are two extra global thresholds for the lightest and darkest regions. *region_size* The size of the region in which to calculate a threshold. *sensitivity* The sensitivity weight on the variance. *lower bound* A global threshold beneath which all pixels are considered black. *upper bound* A global threshold above which all pixels are considered white. """ return_type = ImageType([ONEBIT], "output") self_type = ImageType([GREYSCALE]) args = Args([Int("region size", default=15), Real("sensitivity", default=-0.2), Int("lower bound", range=(0,255), default=20), Int("upper bound", range=(0,255), default=150)]) doc_examples = [(GREYSCALE,)] def __call__(self, region_size=15, sensitivity=-0.2, lower_bound=20, upper_bound=150): return _binarization.niblack_threshold(self, region_size, sensitivity, lower_bound, upper_bound) __call__ = staticmethod(__call__) class sauvola_threshold(PluginFunction): """ Creates a binary image using Sauvola's adaptive algorithm. Sauvola, J. and M. Pietikainen. 2000. Adaptive document image binarization. *Pattern Recognition* 33: 225--236. Like the QGAR library, there are two extra global thresholds for the lightest and darkest regions. *region_size* The size of the region in which to calculate a threshold. *sensitivity* The sensitivity weight on the adjusted variance. *dynamic_range* The dynamic range of the variance. *lower bound* A global threshold beneath which all pixels are considered black. *upper bound* A global threshold above which all pixels are considered white. """ return_type = ImageType([ONEBIT], "output") self_type = ImageType([GREYSCALE]) args = Args([Int("region size", default=15), Real("sensitivity", default=0.5), Int("dynamic range", range=(1, 255), default=128), Int("lower bound", range=(0,255), default=20), Int("upper bound", range=(0,255), default=150)]) doc_examples = [(GREYSCALE,)] def __call__(self, region_size=15, sensitivity=0.5, dynamic_range=128, lower_bound=20, upper_bound=150): return _binarization.sauvola_threshold(self, region_size, sensitivity, dynamic_range, lower_bound, upper_bound) __call__ = staticmethod(__call__) class gatos_background(PluginFunction): """ Estimates the background of an image according to Gatos et al.'s method. See: Gatos, Basilios, Ioannis Pratikakis, and Stavros J. Perantonis. 2004. An adaptive binarization technique for low quality historical documents. *Lecture Notes in Computer Science* 3163: 102--113. *region_size* Region size for interpolation. *binarization* A preliminary binarization of the image. """ category = "Binarization/RegionInformation" return_type = ImageType([GREYSCALE], "output") self_type = ImageType([GREYSCALE]) args = Args([ImageType([ONEBIT], "binarization"), Int("region size", default=15)]) def __call__(self, binarization, region_size=15): return _binarization.gatos_background(self, binarization, region_size) __call__ = staticmethod(__call__) class gatos_threshold(PluginFunction): """ Thresholds an image according to Gatos et al.'s method. See: Gatos, Basilios, Ioannis Pratikakis, and Stavros J. Perantonis. 2004. An adaptive binarization technique for low quality historical documents. *Lecture Notes in Computer Science* 3163: 102-113. *background* Estimated background of the image. *binarization* A preliminary binarization of the image. Use the default settings for the other parameters unless you know what you are doing. """ return_type = ImageType([ONEBIT], "output") self_type = ImageType([GREYSCALE]) args = Args([ImageType([GREYSCALE], "background"), ImageType([ONEBIT], "binarization"), Real("q", default=0.6), Real("p1", default=0.5), Real("p2", default=0.8)]) def __call__(self, background, binarization, q=0.6, p1=0.5, p2=0.8): return _binarization.gatos_threshold(self, background, binarization, q, p1, p2) __call__ = staticmethod(__call__) class white_rohrer_threshold(PluginFunction): """ Creates a binary image using White and Rohrer's dynamic thresholding algorithm. It is the first of the two algorithms described in: J. M. White and G. D. Rohrer. 1983. Image thresholding for optical character recognition and other applications requiring character image extraction. *IBM J. Res. Dev.* 27(4), pp. 400-411 The algorithm uses a 'running' average instead of true average of the gray values in the neighborhood. The lookahead parameter gives the number of lookahead pixels used in the biased running average that is used in deciding the threshold at each pixel location. *x_lookahead* the number of lookahead pixels in the horizontal direction for computing the running average. White and Rohrer suggest a value of 8 for a 240 dpi scanning resolution. *y_lookahead* number of lines used for further averaging from the horizontal averages. The other parameters are for calculating biased running average. Without bias the thresholding decision would be determined by noise fluctuations in uniform areas. This implementation uses code from XITE__. .. __: http://www.ifi.uio.no/forskning/grupper/dsb/Software/Xite/ .. note:: Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that this copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation and that the name of B-lab, Department of Informatics or University of Oslo not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. B-LAB DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL B-LAB BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. """ return_type = ImageType([ONEBIT], "onebit") self_type = ImageType([GREYSCALE]) args = Args([Int("x lookahead", default=8), Int("y lookahead", default=1), Int("bias mode", default=0), Int("bias factor", default=100), Int("f factor",default=100), Int("g factor",default=100)]) author = "Uma Kompella (using code from the XITE library)" doc_examples = [(GREYSCALE,)] def __call__(self, x_lookahead=8, y_lookahead=1, bias_mode=0, bias_factor=100, f_factor=100, g_factor=100): return _binarization.white_rohrer_threshold( self, x_lookahead, y_lookahead, bias_mode, bias_factor, f_factor, g_factor) __call__ = staticmethod(__call__) class shading_subtraction(PluginFunction): """ Thresholds an image after subtracting a -possibly shaded- background. First the backgrund image is extracted with a maximum filter with a *k\*k* window, and this image is subtracted from the original image. On the difference image, a threshold is applied, and the inverted image thereof is the binarization result. Parameters: *k* Window size of the maximum filter. Must be odd. For decent results, it must be chosen so large that every window includes at least one background pixel. *threshold* Threshold applied to the difference image. A possibly reasonable value might lie around 20. When ``None``, the threshold is determined automatically with otsu_find_threshold_. .. _otsu_find_threshold: binarization.html#otsu-find-threshold Reference: K.D. Toennies: *Grundlagen der Bildverarbeitung.* Pearson Studium, 2005, p.202 """ author = "Christoph Dalitz" return_type = ImageType([ONEBIT], "onebit") self_type = ImageType([GREYSCALE]) args = Args([Int("k", default=7), Int("threshold", default=NoneDefault)]) pure_python = True doc_examples = [(GREYSCALE,)] def __call__(self, k=7, threshold=None): #background = self.rank(k*k,k,border_treatment=1) background = self.min_max_filter(k,1) backfloat = background.to_float() imgfloat = self.to_float() difffloat = backfloat.subtract_images(imgfloat) if threshold is None: diffgrey = difffloat.to_greyscale() diffgrey.invert() return diffgrey.otsu_threshold() else: onebit = difffloat.threshold(threshold) onebit.invert() return onebit __call__ = staticmethod(__call__) class BinarizationGenerator(PluginModule): category = "Binarization" cpp_headers = ["binarization.hpp"] functions = [image_mean, image_variance, mean_filter, variance_filter, wiener_filter, niblack_threshold, sauvola_threshold, gatos_background, gatos_threshold, white_rohrer_threshold, shading_subtraction] author = "John Ashley Burgoyne and Ichiro Fujinaga" url = "http://gamera.sourceforge.net/" module = BinarizationGenerator() gamera-3.3.3/gamera/plugins/color.py0000644000076500000000000001505511652050142016351 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan # 2010 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _color class ExtractFloatChannel(PluginFunction): self_type = ImageType([RGB]) return_type = ImageType([FLOAT]) doc_examples = [(RGB,)] class ExtractGreyscaleChannel(PluginFunction): self_type = ImageType([RGB]) return_type = ImageType([FLOAT]) doc_examples = [(RGB,)] class hue(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is a hue value in HSV space in range [0, 1). Since the hue space is cyclic, the shortest *distance* between 1 and 0 is 0. """ pass class saturation(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is a saturation value in HSV space in range [0, 1]. """ pass class value(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is the value in HSV space in range [0, 1]. For more information, Google for HSV color space. """ pass class cie_x(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is a *x* value in the `CIE 1964 Colorimetric`__ system in range [0, 1). .. __: http://www.isc.tamu.edu/~astro/color/cie_xyz1964.html """ pass class cie_y(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is a *y* value in the `CIE 1964 Colorimetric`__ system in range [0, 1). .. __: http://www.isc.tamu.edu/~astro/color/cie_xyz1964.html """ pass class cie_z(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is a *z* value in the `CIE 1964 Colorimetric`__ system in range [0, 1). .. __: http://www.isc.tamu.edu/~astro/color/cie_xyz1964.html """ pass class cie_Lab_L(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is an *L* value in the CIE L*a*b* color space. For an introduction to the different color spaces, see A. Ford and A. Roberts: `Color Space Concersions`__ (1998). The present conversion uses the RGB to Lab conversion routine from VIGRA. .. __: http://www.poynton.com/PDFs/coloureq.pdf """ pass class cie_Lab_a(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is an *a* value in the CIE L*a*b* color space. For an introduction to the different color spaces, see A. Ford and A. Roberts: `Color Space Concersions`__ (1998). The present conversion uses the RGB to Lab conversion routine from VIGRA. .. __: http://www.poynton.com/PDFs/coloureq.pdf """ pass class cie_Lab_b(ExtractFloatChannel): """ Returns a FLOAT image where each pixel is a *b* value in the CIE L*a*b* color space. For an introduction to the different color spaces, see A. Ford and A. Roberts: `Color Space Concersions`__ (1998). The present conversion uses the RGB to Lab conversion routine from VIGRA. .. __: http://www.poynton.com/PDFs/coloureq.pdf """ pass class cyan(ExtractGreyscaleChannel): """ Returns a GREYSCALE image where each pixel is the cyan component of the RGB original. """ pass class magenta(ExtractGreyscaleChannel): """ Returns a GREYSCALE image where each pixel is the magenta component of the RGB original. """ pass class yellow(ExtractGreyscaleChannel): """ Returns a GREYSCALE image where each pixel is the yellow component of the RGB original. """ pass class red(ExtractGreyscaleChannel): """ Returns a GREYSCALE image where each pixel is the red component of the RGB original. """ pass class green(ExtractGreyscaleChannel): """ Returns a GREYSCALE image where each pixel is the green component of the original. """ pass class blue(ExtractGreyscaleChannel): """ Returns a GREYSCALE image where each pixel is the blue component of the RGB original. """ pass class false_color(PluginFunction): """ Returns a false color representation of the given image. Low values are red, mid values are green and high values are blue. This can help visualize greyscale images that are not *real* images but are representations of other kinds of data. """ self_type = ImageType([FLOAT, GREYSCALE]) return_type = ImageType([RGB], "false_color") doc_examples = [(GREYSCALE,)] class colors_to_labels(PluginFunction): """ Converts an RGB image to a labeled onebit image. Each RGB color is replaced by the label specified in the mapping *rgb_to_label*. RGB values not listed in *rgb_to_label* are white in the returned onebit image. When no mapping *rgb_to_label* is provided, each different RGB color is replaced by a unique label. This is mostly useful for reading manually labeled groundtruth data from color PNG files. Example: .. code:: Python # map red to label 3, and green to label 5 labeled = rgb.colors_to_labels( {RGBPixel(255,0,0): 3, RGBPixel(0,255,0): 5} ) A typical use case of this plugin is in combination with ccs_from_labeled_image_. .. _ccs_from_labeled_image: utility.html#ccs-from-labeled-image """ self_type = ImageType([RGB]) return_type = ImageType([ONEBIT]) args = Args([Class("rgb_to_label", dict)]) author = "Christoph Dalitz and Hasan Yildiz" def __call__(self, dict=None): return _color.colors_to_labels(self, dict) __call__ = staticmethod(__call__) class ColorModule(PluginModule): category = "Color" cpp_headers = ["color.hpp"] functions = [hue, saturation, value, cyan, magenta, yellow, cie_x, cie_y, cie_z, cie_Lab_L, cie_Lab_a, cie_Lab_b, red, green, blue, false_color, colors_to_labels] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = ColorModule() del ExtractFloatChannel del ExtractGreyscaleChannel gamera-3.3.3/gamera/plugins/contour.py0000644000076500000000000001006711652050142016722 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan # 2010 Oliver Christen, Christoph Dalitz # 2011 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _contour #TODO: Change these to out-of-place class Contour(PluginFunction): self_type = ImageType([ONEBIT]) return_type = FloatVector("contour") doc_examples = [(ONEBIT,)] class contour_top(Contour): """ Returns a float vector containing the contour at the top of the image. If there are no black pixels in a given column, the value is set to inf. """ pass class contour_bottom(Contour): """ Returns a float vector containing the contour at the bottom of the image. If there are no black pixels in a given column, the value is set to inf. """ pass class contour_left(Contour): """ Returns a float vector containing the contour at the left of the image. If there are no black pixels in a given row, the value is set to inf. """ pass class contour_right(Contour): """ Returns a float vector containing the contour at the right of the image. If there are no black pixels in a given row, the value is set to inf. """ pass class contour_samplepoints(PluginFunction): """ Returns a point vector containing contour points of the given image. *percentage*: return percentage of contour points. The points are selected approximately equidistant on the countour. In addition to the points determined by the percentage argument the result list also contains the four extreme points (topmost, leftmost, bottommost, rightmost). .. code:: Python ccs = image.cc_analysis() points = [] for cc in ccs: for samplepoint in cc.contour_samplepoints(50): points.append(samplepoint) """ self_type = ImageType([ONEBIT]) author = "Oliver Christen" args = Args([Int("percentage", range=(1,100), default=25)]) return_type = PointVector("contourpoints") doc_examples = [(ONEBIT, 10)] def __call__(self, percentage=25): if percentage < 1 or percentage > 100: raise RuntimeError("contour_samplepoints: percentage must be between 1 and 100") return _contour.contour_samplepoints(self, percentage) __call__ = staticmethod(__call__) class contour_pavlidis(PluginFunction): """ Returns a point list of the outer contour trace found with Pavlidis' algorithm (T. Pavlidis: *Algorithms for Grapics and Image Processing.* pp. 129-165, Springer, 1982). Note that this extracts only the first contour found, so this method should be applied to a single connected component. If you have an image with more than one connected component, do a CC analysis before, as in the following example: .. code:: Python ccs = img.cc_analysis() contours = [] for cc in ccs: contours.append([Point(p.x + cc.offset_x, p.y + cc.offset_y) \\ for p in cc.contour_pavlidis()]) """ self_type = ImageType([ONEBIT]) return_type = PointVector("contour") author = "Andreas Leuschner" class ContourModule(PluginModule): cpp_headers = ["contour.hpp"] category = "Analysis/Contour" functions = [contour_top, contour_left, contour_bottom, contour_right, contour_samplepoints, contour_pavlidis] author = "Michael Droettboom" url = "http://gamera.sourceforge.net/" module = ContourModule() gamera-3.3.3/gamera/plugins/convolution.py0000644000076500000000000003710611652050142017613 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """The convolution module contains plugins for linear filtering""" from gamera.plugin import * from gamera.plugins import image_utilities from gamera import util import _arithmetic import _convolution CONVOLUTION_TYPES = [GREYSCALE, GREY16, FLOAT, RGB, COMPLEX] # Note: The convolution exposed here does not allow for the case where the # logical center of the kernel is different from the physical center. # Saving that for another day... MGD ######################################## # Convolution methods class convolve(PluginFunction): u""" Convolves an image with a given kernel. Uses code from the Vigra library (Copyright 1998-2007 by Ullrich K\u00f6the). *kernel* A kernel for the convolution. The kernel may either be a FloatImage or a nested Python list of floats. *border_treatment* Specifies how to treat the borders of the image. Must be one of the following: - BORDER_TREATMENT_AVOID (0) do not operate on a pixel where the kernel does not fit in the image - BORDER_TREATMENT_CLIP (1) clip kernel at image border. The kernel entries are renormalized so that the total kernel sum is not changed (this is only useful if the kernel is >= 0 everywhere). - BORDER_TREATMENT_REPEAT (2) repeat the nearest valid pixel - BORDER_TREATMENT_REFLECT (3) reflect image at last row/column - BORDER_TREATMENT_WRAP (4) wrap image around (periodic boundary conditions) Example usage: .. code:: Python # Using a custom kernel img2 = image.convolve([[0.125, 0.0, -0.125], [0.25 , 0.0, -0.25 ], [0.125, 0.0, -0.125]]) # Using one of the included kernel generators img2 = image.convolve(GaussianKernel(3.0)) """ category = "Filter/Convolution" self_type = ImageType(CONVOLUTION_TYPES) args = Args([ImageType([FLOAT], 'kernel'), Choice('border_treatment', ['avoid', 'clip', 'repeat', 'reflect', 'wrap'], default=1)]) return_type = ImageType(CONVOLUTION_TYPES) def __call__(self, kernel, border_treatment=3): from gamera.gameracore import FLOAT if type(kernel) == list: kernel = image_utilities.nested_list_to_image(kernel, FLOAT) return _convolution.convolve(self, kernel, border_treatment) __call__ = staticmethod(__call__) class convolve_xy(PluginFunction): u""" Convolves an image in both X and Y directions with 1D kernels. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich K\u00f6the). *kernel_y* A kernel for the convolution in the *y* direction. The kernel may either be a FloatImage or a nested Python list of floats. *kernel_x* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. If *kernel_x* is omitted, *kernel_y* will be used in the *x* direction. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. """ category = "Filter/Convolution" self_type = ImageType(CONVOLUTION_TYPES) args = Args([ImageType([FLOAT], 'kernel_x'), ImageType([FLOAT], 'kernel_y'), Choice('border_treatment', ['avoid', 'clip', 'repeat', 'reflect', 'wrap'], default=1)]) return_type = ImageType(CONVOLUTION_TYPES) pure_python = True def __call__(self, kernel_x, kernel_y=None, border_treatment=1): from gamera.gameracore import FLOAT if kernel_y is None: kernel_y = kernel_x if kernel_y == kernel_x: if type(kernel_y) == list: kernel_x = kernel_y = image_utilities.nested_list_to_image(kernel_y, FLOAT) else: if type(kernel_y) == list: kernel_y = image_utilities.nested_list_to_image(kernel_y, FLOAT) if type(kernel_x) == list: kernel_x = image_utilities.nested_list_to_image(kernel_x, FLOAT) result = _convolution.convolve_x(self, kernel_x, border_treatment) return _convolution.convolve_y(result, kernel_y, border_treatment) __call__ = staticmethod(__call__) class convolve_x(PluginFunction): u""" Convolves an image in the X directions with a 1D kernel. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich K\u00f6the). *kernel_x* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. It must consist of only a single row. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. """ category = "Filter/Convolution" self_type = ImageType(CONVOLUTION_TYPES) args = Args([ImageType([FLOAT], 'kernel_x'), Choice('border_treatment', ['avoid', 'clip', 'repeat', 'reflect', 'wrap'], default=1)]) return_type = ImageType(CONVOLUTION_TYPES) def __call__(self, kernel, border_treatment=1): from gamera.gameracore import FLOAT if type(kernel) == list: kernel = image_utilities.nested_list_to_image(kernel, FLOAT) return _convolution.convolve_x(self, kernel, border_treatment) __call__ = staticmethod(__call__) class convolve_y(PluginFunction): u""" Convolves an image in the X directions with a 1D kernel. This is equivalent to what the Vigra library calls "Separable Convolution". Uses code from the Vigra library (Copyright 1998-2007 by Ullrich K\u00f6the). *kernel_y* A kernel for the convolution in the *x* direction. The kernel may either be a FloatImage or a nested Python list of floats. It must consist of only a single row. *border_treatment* Specifies how to treat the borders of the image. See ``convolve`` for information about *border_treatment* values. """ category = "Filter/Convolution" self_type = ImageType(CONVOLUTION_TYPES) args = Args([ImageType([FLOAT], 'kernel_y'), Choice('border_treatment', ['avoid', 'clip', 'repeat', 'reflect', 'wrap'], default=1)]) return_type = ImageType(CONVOLUTION_TYPES) def __call__(self, kernel, border_treatment=1): from gamera.gameracore import FLOAT if type(kernel) == list: kernel = image_utilities.nested_list_to_image(kernel, FLOAT) return _convolution.convolve_y(self, kernel, border_treatment) __call__ = staticmethod(__call__) ######################################## # Convolution kernels class ConvolutionKernel(PluginFunction): self_type = None return_type = ImageType([FLOAT]) category = "Filter/ConvolutionKernels" class GaussianKernel(ConvolutionKernel): """ Init as a Gaussian function. The radius of the kernel is always 3*standard_deviation. *standard_deviation* The standard deviation of the Gaussian kernel. """ args = Args([Float("standard_deviation", default=1.0)]) class GaussianDerivativeKernel(ConvolutionKernel): """ Init as a Gaussian derivative of order 'order'. The radius of the kernel is always 3*std_dev. *standard_deviation* The standard deviation of the Gaussian kernel. *order* The order of the Gaussian kernel. """ args = Args([Float("standard_deviation", default=1.0), Int("order", default=1)]) class BinomialKernel(ConvolutionKernel): """ Creates a binomial filter kernel for use with separable convolution of a given radius. *radius* The radius of the kernel. """ args = Args([Int("radius", default=3)]) class AveragingKernel(ConvolutionKernel): """ Creates an Averaging filter kernel for use with separable convolution. The window size is (2*radius+1) * (2*radius+1). *radius* The radius of the kernel. """ args = Args([Int("radius", default=3)]) class SymmetricGradientKernel(ConvolutionKernel): """ Init as a symmetric gradient filter of the form [ 0.5, 0.0, -0.5] """ args = Args([]) class SimpleSharpeningKernel(ConvolutionKernel): """ Creates a kernel for simple sharpening. """ args = Args([Float('sharpening_factor', default=0.5)]) ######################################## # Convolution applications # # The following are some applications of convolution built from the above # parts. This could have been implemented by calling the corresponding # Vigra functions directly, but that would have increased the compiled # binary size of an already large module emmensely. This approach has # slightly more overhead, being in Python, but it should hopefully # not have a significant impact. MGD class gaussian_smoothing(PluginFunction): """ Performs gaussian smoothing on an image. *standard_deviation* The standard deviation of the Gaussian kernel. """ self_type = ImageType(CONVOLUTION_TYPES) args = Args([Float("standard_deviation", default=1.0)]) return_type = ImageType(CONVOLUTION_TYPES) pure_python = True doc_examples = [(GREYSCALE, 1.0), (RGB, 3.0), (COMPLEX, 1.0)] def __call__(self, std_dev=1.0): return self.convolve_xy( _convolution.GaussianKernel(std_dev), border_treatment = BORDER_TREATMENT_REFLECT) __call__ = staticmethod(__call__) class simple_sharpen(PluginFunction): """ Perform simple sharpening. *sharpening_factor* The amount of sharpening to perform. """ self_type = ImageType(CONVOLUTION_TYPES) args = Args([Float("sharpening_factor", default=0.5)]) return_type = ImageType(CONVOLUTION_TYPES) pure_python = True doc_examples = [(GREYSCALE, 1.0), (RGB, 3.0)] def __call__(self, sharpening_factor=0.5): return self.convolve( _convolution.SimpleSharpeningKernel(sharpening_factor), border_treatment = BORDER_TREATMENT_REFLECT) __call__ = staticmethod(__call__) class gaussian_gradient(PluginFunction): """ Calculate the gradient vector by means of a 1st derivatives of Gaussian filter. *scale* Returns a tuple of (*x_gradient*, *y_gradient*). """ self_type = ImageType(CONVOLUTION_TYPES) args = Args([Float("scale", default=0.5)]) return_type = ImageList("gradients") pure_python = True doc_examples = [(GREYSCALE, 1.0), (RGB, 1.0), (COMPLEX, 1.0)] def __call__(self, scale=1.0): smooth = _convolution.GaussianKernel(scale) grad = _convolution.GaussianDerivativeKernel(scale, 1) tmp = self.convolve_x(grad) result_x = tmp.convolve_y(smooth) tmp = self.convolve_x(smooth) result_y = tmp.convolve_y(grad) return result_x, result_y __call__ = staticmethod(__call__) class laplacian_of_gaussian(PluginFunction): """ Filter image with the Laplacian of Gaussian operator at the given scale. *scale* """ self_type = ImageType([GREYSCALE, GREY16, FLOAT]) args = Args([Float("scale", default=0.5)]) return_type = ImageType([GREYSCALE, GREY16, FLOAT]) pure_python = True doc_examples = [(GREYSCALE, 1.0)] def __call__(self, scale=1.0): smooth = _convolution.GaussianKernel(scale) deriv = _convolution.GaussianDerivativeKernel(scale, 2) fp = self.to_float() tmp = fp.convolve_x(deriv) tmp_x = tmp.convolve_y(smooth) tmp = fp.convolve_x(smooth) tmp_y = tmp.convolve_y(deriv) result = _arithmetic.add_images(tmp_x, tmp_y, False) if self.data.pixel_type == GREYSCALE: return result.to_greyscale() if self.data.pixel_type == GREY16: return result.to_grey16() return result __call__ = staticmethod(__call__) class hessian_matrix_of_gaussian(PluginFunction): """ Filter image with the 2nd derivatives of the Gaussian at the given scale to get the Hessian matrix. *scale* """ self_type = ImageType([GREYSCALE, GREY16, FLOAT]) args = Args([Float("scale", default=0.5)]) return_type = ImageList("hessian_matrix") pure_python = True doc_examples = [(GREYSCALE, 1.0)] def __call__(self, scale=1.0): smooth = _convolution.GaussianKernel(scale) deriv1 = _convolution.GaussianDerivativeKernel(scale, 1) deriv2 = _convolution.GaussianDerivativeKernel(scale, 2) fp = self.to_float() tmp = fp.convolve_x(deriv2) tmp_x = tmp.convolve_y(smooth) tmp = fp.convolve_x(smooth) tmp_y = tmp.convolve_y(deriv2) tmp = fp.convolve_x(deriv1) tmp_xy = fp.convolve_y(deriv1) if self.data.pixel_type == GREYSCALE: return tmp_x.to_greyscale(), tmp_y.to_greyscale(), tmp_xy.to_greyscale() if self.data.pixel_type == GREY16: return tmp_x.to_grey16(), tmp_y.to_grey16(), tmp_xy.to_grey16() return result __call__ = staticmethod(__call__) class sobel_edge_detection(PluginFunction): """ Performs simple Sobel edge detection on the image. """ self_type = ImageType(CONVOLUTION_TYPES) return_type = ImageType(CONVOLUTION_TYPES) pure_python = True doc_examples = [(GREYSCALE, 1.0), (RGB, 3.0)] def __call__(self, scale=1.0): return self.convolve([[.125, 0.0, -.125], [.25, 0.0, -.25], [.125, 0.0, -.125]]) __call__ = staticmethod(__call__) class ConvolutionModule(PluginModule): cpp_headers=["convolution.hpp"] category = "Filter" functions = [convolve, convolve_xy, convolve_x, convolve_y, GaussianKernel, GaussianDerivativeKernel, BinomialKernel, AveragingKernel, SymmetricGradientKernel, SimpleSharpeningKernel, gaussian_smoothing, simple_sharpen, gaussian_gradient, laplacian_of_gaussian, hessian_matrix_of_gaussian, sobel_edge_detection] author = u"Michael Droettboom (With code from VIGRA by Ullrich K\u00f6the)" url = "http://gamera.sourceforge.net/" module = ConvolutionModule() BORDER_TREATMENT_AVOID = 0 BORDER_TREATMENT_CLIP = 1 BORDER_TREATMENT_REPEAT = 2 BORDER_TREATMENT_REFLECT = 3 BORDER_TREATMENT_WRAP = 4 GaussianKernel = GaussianKernel() GaussianDerivativeKernel = GaussianDerivativeKernel() BinomialKernel = BinomialKernel() AveragingKernel = AveragingKernel() SymmetricGradientKernel = SymmetricGradientKernel() SimpleSharpeningKernel = SimpleSharpeningKernel() del CONVOLUTION_TYPES del ConvolutionKernel gamera-3.3.3/gamera/plugins/corelation.py0000644000076500000000000000723211652050142017370 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """Various functions related to corelation (template matching).""" from gamera.plugin import * from gamera import util import _corelation class corelation_weighted(PluginFunction): """ Returns a floating-point value for how well an image is corelated to another image placed at a given origin (*x*, *y*). Uses the weighted reward/penalty method. *template* The template image. *offset* The displacement of the template on the image. *bb*, *bw*, *wb*, *ww* The rewards and penalties for different combinations of pixels. The first letter in the arugment name indicates the color of the template; the second letter indicates the color of the source image. For instance, the value of *bw* will be applied to the result when the template pixel is black and the source image pixel is white. +--------+--------+------------------+ | Image | | Template | | +--------+---------+--------+ | | | black | white | | +--------+---------+--------+ | | black | *bb* | *wb* | | +--------+---------+--------+ | | white | *bw* | *ww* | +--------+--------+---------+--------+ """ return_type = Float("corelation") self_type = ImageType([ONEBIT, GREYSCALE]) args = Args([ImageType([ONEBIT], "template"), Point("offset"), Float("bb"), Float("bw"), Float("wb"), Float("ww")]) class corelation_sum(PluginFunction): """ Returns a floating-point value for how well an image is corelated to another image placed at a given origin (*x*, *y*). Uses the sum of absolute distance method. A higher value indicates more corelation. *template* The template image. *offset* The displacement of the template on the image. """ return_type = Float("corelation") self_type = ImageType([ONEBIT, GREYSCALE]) args = Args([ImageType([ONEBIT], "template"), Point("offset")]) progress_bar = "Correlating" class corelation_sum_squares(PluginFunction): """ Returns a floating-point value for how well an image is corelated to another image placed at a given origin (*x*, *y*). Uses the sum of squares method. A higher value indicates more corelation. *template* The template image. *offset* The displacement of the template on the image. """ return_type = Float("corelation") self_type = ImageType([ONEBIT, GREYSCALE]) args = Args([ImageType([ONEBIT], "template"), Point("offset")]) progress_bar = "Correlating" class CorelationModule(PluginModule): cpp_headers=["corelation.hpp"] category = "Corelation" functions = [corelation_weighted, corelation_sum, corelation_sum_squares] author = "Michael Droettboom" url = "http://gamera.sourceforge.net/" module = CorelationModule() gamera-3.3.3/gamera/plugins/deformation.py0000755000076500000000000001773411652050142017553 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan # 2010 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """The deformations module contains plugins for applying deformations to images.""" from gamera.plugin import * try: from gamera.core import RGBPixel except: def RGBPixel(*args): pass try: from gamera.core import * except: pass import _deformation class wave(PluginFunction): """ Causes periodic disturbance of user-defined frequency, amplitude, and direction. Turbulence specifies the amount of random variation from that line. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) args = Args([Int("amplitude"), Int("period"), Choice('direction', ['Horizontal','Vertical']), Choice('waveform', ['Sinusoid','Square','Sawtooth','Triangle','Sinc']), Int('offset'), Float('turbulence', default=0.0), Int('random_seed', default=-1) ]) args.list[0].rng = (0,sys.maxint) args.list[1].rng = (0,sys.maxint) def __call__(self, amplitude, period, direction, waveform_type=0, offset=0, turbulence=0.0, random_seed=0): return _deformation.wave(self, amplitude, period, direction, waveform_type, offset, turbulence, random_seed) __call__ = staticmethod(__call__) doc_examples = [(RGB, 5, 10, 0, 0, 0), (RGB, 10, 5, 1, 2, 0)] class noise(PluginFunction): """ Causes random shifting of pixels within a user-specified range, in a user-specified direction. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) args = Args([Int("amplitude", range=(0, 500)), Choice('direction',['Horizontal','Vertical']), Int("random_seed", default=-1) ]) doc_examples = [(RGB, 10, 0)] def __call__(self, amplitude, direction, random_seed=0): return _deformation.noise(self, amplitude, direction, random_seed) __call__ = staticmethod(__call__) class inkrub(PluginFunction): """ Simulates rubbing off of ink from another page. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) args = Args([Int("transcription_prob", range=(0, 500)), Int("random_seed", default=-1)]) doc_examples = [(GREYSCALE, 50)] def __call__(self, transcription_prob, random_seed=0): return _deformation.inkrub(self, transcription_prob, random_seed) __call__ = staticmethod(__call__) class ink_diffuse(PluginFunction): """ Simulates water-driven diffusion of ink in paper. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) args = Args([Choice('diffusion_type', ["Linear Horizontal","Linear Vertical","Brownian"]), Float("exponential_decay_constant"), Int("random_seed", default=-1)]) doc_examples = [(GREYSCALE, 0, 20)] def __call__(self, diffusion_type, exponential_decay_constant, random_seed=0): return _deformation.ink_diffuse(self, diffusion_type, exponential_decay_constant, random_seed) __call__ = staticmethod(__call__) class degrade_kanungo(PluginFunction): """Degrades an image due to a scheme proposed by Kanungo et al. (see the reference below). This is supposed to emulate image defects introduced through printing and scanning. The degradation scheme depends on six parameters *(eta,a0,a,b0,b,k)* with the following meaning: - each foreground pixel (black) is flipped with probability `a0*exp(-a*d^2) + eta`, where d is the distance to the closest background pixel - each background pixel (white) is flipped with probability `b0*exp(-b*d^2) + eta`, where d is the distance to the closest foreground pixel - eventuall a morphological closing operation is performed with a disk of diameter *k*. If you want to skip this step set *k=0*; in that case you should do your own smoothing afterwards. The random generator is initialized with *random_seed* for allowing reproducable results. References: T. Kanungo, R.M. Haralick, H.S. Baird, et al.: *A statistical, nonparametric methodology for document degradation model validation.* IEEE Transactions on Pattern Analysis and Machine Intelligence 22, pp. 1209-1223 (2000) """ self_type = ImageType([ONEBIT]) args = Args([Float('eta', range=(0.0,1.0)), Float('a0', range=(0.0,1.0)), Float('a'), Float('b0', range=(0.0,1.0)), Float('b'), Int('k', default=2), Int('random_seed', default=0)]) return_type = ImageType([ONEBIT]) author = "Christoph Dalitz" doc_examples = [(ONEBIT, 0.0, 0.5, 0.5, 0.5, 0.5, 2, 0)] class white_speckles(PluginFunction): """Adds white speckles to an image. This is supposed to emulate image defects introduced through printing, scanning and thresholding. The degradation scheme depends on three parameters *(p,n,k)* with the following meaning: - Each black pixel in the input image is taken with probability *p* as a starting point for a random walk of length *n*. Consequently *p* can be interpreted as the speckle frequency and *n* as a measure for the speckle size. - An image containing the random walk is smoothed by a closing operation with a rectangle of size *k*. - Eventually the image with the random walks is subtracted from the input image, which results in white speckles at the random walk positions Input arguments: *p, n, k*: speckle frequency, random walk length and closing disc size *connectivity*: effects the connectivity of adjacent random walk points as shown in the following figure (in case of bishop moves the final closing operation whitens the neighbouring 4-connected pixels too): .. image:: images/randomwalk_connectivity.png References: C. Dalitz, M. Droettboom, B. Pranzas, I. Fujinaga: *A Comparative Study of Staff Removal Algorithms.* IEEE Transactions on Pattern Analysis and Machine Intelligence 30, pp. 753-766 (2008) """ self_type = ImageType([ONEBIT]) args = Args([Float('p', range=(0.0,1.0)), Int('n'), Int('k', default=2), Choice('connectivity', ['rook','bishop','king'], default=2), Int('random_seed', default=0)]) return_type = ImageType([ONEBIT], 'white_speckles') author = "Christoph Dalitz" doc_examples = [(ONEBIT, 0.05, 5, 2, 2, 0)] # class batch_deform(PluginFunction): # """ # Performs all possible deformations over given range of arguments. # """ # pure_python = 1 # self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) # return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) class DefModule(PluginModule): cpp_headers=["deformations.hpp"] category = "Deformations" functions = [noise, inkrub, wave, ink_diffuse, degrade_kanungo, white_speckles] author = "Albert Brzeczko" url = "http://gamera.sourceforge.net/" module = DefModule() gamera-3.3.3/gamera/plugins/draw.py0000644000076500000000000004343011652050142016166 0ustar chriswheel# # # Copyright (C) 2001-2009 Ichiro Fujinaga, Michael Droettboom, # Karl MacMillan, and Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * from gamera.util import warn_deprecated import _draw try: from gamera.core import RGBPixel except: def RGBPixel(*args): pass class draw_marker(PluginFunction): """ Draws a marker at a given point. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a marker at (5, 5) will be in the upper left hand corner of the image. *a* The position of the marker. *size* The size of the marker (number of pixels) *style* PLUS + (0) X + (1) HOLLOW_SQUARE (2) FILLED_SQUARE (3) *value* The pixel value to set for the line. """ self_type = ImageType(ALL) args = Args([FloatPoint("location"), Int("size", default=5), Choice("style", "+ x hollow_square filled_square".split(), default=0), Pixel("value")]) author = "Michael Droettboom" def __doc_example1__(images): from random import randint from gamera.core import Image, Dim image = Image((0, 0), Dim(100, 100), RGB, DENSE) points = [(randint(0, 100), randint(0, 100)) for x in range(4)] image.draw_bezier(*tuple(list(points) + [RGBPixel(255, 0, 0), 0.1])) image.draw_marker(points[0], 7, 0, RGBPixel(0, 0, 255)) image.draw_marker(points[1], 7, 1, RGBPixel(0, 255, 0)) image.draw_marker(points[2], 7, 1, RGBPixel(0, 255, 0)) image.draw_marker(points[3], 7, 0, RGBPixel(0, 0, 255)) return image doc_examples = [__doc_example1__] class draw_line(PluginFunction): """ Draws a straight line between two points. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a line at (5, 5) will be in the upper left hand corner of the image. *a*: The start ``FloatPoint``. *b*: The end ``FloatPoint``. *value*: The pixel value to set for the line. *thickness* = 1.0: The thickness of the line (in pixels) The implementation is based on the classic Bresenham algorithm, as described in J. E. Bresenham: *Algorithm for computer control of a digital plotter.* IBM Systems Journal 4, pp. 25-30 (1965). """ self_type = ImageType(ALL) args = Args([FloatPoint("start"), FloatPoint("end"), Pixel("value"), Float("thickness")]) author = "Michael Droettboom and Christoph Dalitz" def __call__(self, start, end, value, thickness = 1.0): return _draw.draw_line(self, start, end, value, thickness) __call__ = staticmethod(__call__) def __doc_example1__(images): from random import randint from gamera.core import Image, Dim image = Image((0, 0), Dim(100, 100), RGB, DENSE) for i in range(10): image.draw_line((randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), RGBPixel(randint(0, 255), randint(0,255), randint(0, 255)), float(randint(0, 4))) return image doc_examples = [__doc_example1__] class draw_hollow_rect(PluginFunction): """ Draws a hollow rectangle. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a rectangle at (5, 5) will be in the upper left hand corner of the image. The coordinates can be specified either by two FloatPoints or one Rect: **draw_hollow_rect** (FloatPoint(*x1*, *y1*), FloatPoint(*x2*, *y2*), *value*, *thickness* = 1.0) **draw_hollow_rect** (Rect *rect*, *value*, *thickness* = 1.0) *value*: The pixel value to set for the lines. *thickness* = 1.0: The thickness of the outline """ self_type = ImageType(ALL) args = Args([FloatPoint("ul"), FloatPoint("lr"), Pixel("value"), Float("thickness")]) def __call__(self, *args): from gamera.gameracore import Rect if len(args) == 4: return _draw.draw_hollow_rect(self, *args) elif len(args) == 3: a, b, c = args if hasattr(a, 'ul') and hasattr(a, 'lr'): return _draw.draw_hollow_rect(self, a.ul, a.lr, b, c) else: return _draw.draw_hollow_rect(self, a, b, c, 1.0) elif len(args) == 2: a, b = args if hasattr(a, 'ul') and hasattr(a, 'lr'): return _draw.draw_hollow_rect(self, a.ul, a.lr, b, 1.0) raise ValueError("Arguments to draw_hollow_rect are incorrect.") __call__ = staticmethod(__call__) def __doc_example1__(images): from random import randint from gamera.core import Image, Dim image = Image((0, 0), Dim(100, 100), RGB, DENSE) for i in range(10): image.draw_hollow_rect((randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), RGBPixel(randint(0, 255), randint(0,255), randint(0, 255))) return image doc_examples = [__doc_example1__] class draw_filled_rect(PluginFunction): """ Draws a filled rectangle. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a rectangle at (5, 5) will be in the upper left hand corner of the image. The coordinates can be specified either by four integers, two FloatPoints, or one Rect: **draw_filled_rect** (FloatPoint(*x1*, *y1*), FloatPoint(*x2*, *y2*), *value*) **draw_filled_rect** (Rect *rect*, *value*) """ self_type = ImageType(ALL) args = Args([FloatPoint("ul"), FloatPoint("lr"), Pixel("value")]) def __call__(self, *args): if len(args) == 3: return _draw.draw_filled_rect(self, *args) elif len(args) == 2: a, value = args return _draw.draw_filled_rect(self, a.ul, a.lr, value) raise ValueError("Arguments to draw_filled_rect are incorrect.") __call__ = staticmethod(__call__) def __doc_example1__(images): from random import randint from gamera.core import Image, Dim image = Image((0, 0), Dim(100, 100), RGB, DENSE) for i in range(10): image.draw_filled_rect((randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), RGBPixel(randint(0, 255), randint(0,255), randint(0, 255))) return image doc_examples = [__doc_example1__] class draw_bezier(PluginFunction): """ Draws a cubic bezier curve Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a curve at (5, 5) will be in the upper left hand corner of the image. *start*: The start ``FloatPoint``. *c1*: The control point associated with the start point. *c2* The control point associated with the end point. *end* The end ``FloatPoint``. *value*: The pixel value to set for the curve. *accuracy* = ``0.1``: The rendering accuracy (in pixels) """ self_type = ImageType(ALL) args = Args([FloatPoint("start"), FloatPoint("c1"), FloatPoint("c2"), FloatPoint("end"), Pixel("value"), Float("accuracy", default=0.1)]) def __call__(self, start, c1, c2, end, value, accuracy = 0.1): return _draw.draw_bezier(self, start, c2, c2, end, value, accuracy) __call__ = staticmethod(__call__) def __doc_example1__(images): from random import randint from gamera.core import Image, Dim image = Image((0, 0), Dim(100, 100), RGB, DENSE) for i in range(10): image.draw_bezier((randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), (randint(0, 100), randint(0, 100)), RGBPixel(randint(0, 255), randint(0,255), randint(0, 255)), 0.1) return image doc_examples = [__doc_example1__] class draw_circle(PluginFunction): """ Draws a center centered at *c* with radius *r*. Coordinates are absolute and *not* relative to the offset of the image. Therefore, if the image offset is (5, 5), a line at (5, 5) will be in the upper left hand corner of the image. *c*: The center of the circle *r*: The radius of the circle *value*: The pixel value to set for the line. *thickness* = 1.0: The thickness of the circle (in pixels) *accuracy* = 0.1: The accuracy of the circle drawing Based on the "approximating a circle with Bezier curves" approach. http://www.whizkidtech.redprince.net/bezier/circle/ """ self_type = ImageType(ALL) args = Args([FloatPoint("c"), Float("r"), Pixel("value"), Float("thickness"), Float("accuracy")]) author = "Michael Droettboom with the help of Christoph Dalitz" def __call__(self, c, r, value, thickness = 1.0, accuracy = 0.1): return _draw.draw_circle(self, c, r, value, thickness, accuracy) __call__ = staticmethod(__call__) def __doc_example1__(images): from random import randint from gamera.core import Image, Dim image = Image((0, 0), Dim(100, 100), RGB, DENSE) for i in range(10): image.draw_circle((randint(0, 100), randint(0, 100)), randint(0, 100), RGBPixel(randint(0, 255), randint(0,255), randint(0, 255)), 1.0, 0.1) return image doc_examples = [__doc_example1__] class draw_text(PluginFunction): """ Draws text onto the image. The results are fairly primitive. The text is not anti-aliased, but should be adequate for marking up the image for debugging purposes. This function relies on wxPython for font rendering. Therefore, wxPython must be installed, and it must be runnable in the current environment, for example, a connection to a display or X server must be available. This may not be the case when running over a remote terminal, for example. *p* The position of the text. The *x* component will be either at the left, center, or right of the text, depending on the value of *halign*. The *y* component specifies the top of the text. *text* The string to be drawn on the image. If this is an 8-bit string the string should be encoded in the default encoding for your system. If a Unicode string, the text will be rendered using a Unicode font. This requires that your wxPython version is compiled with Unicode support. *color* The color of the text to be drawn. Note that there are some peculiarities for **ONEBIT** images: If *color* is zero, the text will be white. If non-zero, the text will be black. It is not possible to set different values for the text. *family* The font family to be used. For platform independence, this argument takes a general typeface style which will be mapped to an appropriate typeface on each platform. SERIF (0) SANS-SERIF (1) MONOSPACE (2) *size* = 10 The font size **in pixels** (i.e. not in "points") *italic* = ``False`` If ``True``, the text will be italic. *bold* = ``False`` If ``True``, the text will be bold. *halign* LEFT JUSTIFIED (0): The text is left-justified to the point *p*. CENTERED (1): The text is centered horizontally to the point *p*. RIGHT JUSTIFIED (2): The text is right-justified to the point *p*. """ self_type = ImageType([ONEBIT, RGB]) args = Args([FloatPoint("p"), String("text"), Pixel("color"), Int("size", default=10, range=(3, 512)), Choice("font_family", ['serif', 'sans-serif', 'monospace']), Check("italic", default=False), Check("bold", default=False), Choice("halign", ["left", "center", "right"]) ]) author = "Michael Droettboom" pure_python = True def __call__(self, p, text, color, size=10, font_family=0, italic=False, bold=False, halign=0): from gamera.core import Dim, RGB, ONEBIT, Image from gamera.plugins import string_io try: import wx except ImportError: raise RuntimeError("Drawing text requires wxPython.") try: dc = wx.MemoryDC() except wx._core.PyNoAppError: app = wx.App() dc = wx.MemoryDC() if font_family < 0 or font_family > 2: raise ValueError("font_family must be in range 0-2.") font_family = [wx.ROMAN, wx.SWISS, wx.MODERN][font_family] italic = (italic and wx.ITALIC) or wx.NORMAL bold = (bold and wx.BOLD) or wx.NORMAL if type(text) == str: encoding = wx.FONTENCODING_SYSTEM elif type(text) == unicode: encoding = wx.FONTENCODING_UNICODE else: raise ValueError("text must be a string or unicode string.") font = wx.Font(size, font_family, italic, bold, encoding = encoding) font.SetPixelSize(wx.Size(size * 2, size * 2)) dc.SetFont(font) w, h = dc.GetTextExtent(text) # Do the actual drawing bmp = wx.EmptyBitmap(w, h, -1) dc.SelectObject(bmp) dc.SetPen(wx.TRANSPARENT_PEN) dc.SetBrush(wx.WHITE_BRUSH) dc.DrawRectangle(0, 0, w, h) dc.SetBrush(wx.BLACK_BRUSH) dc.DrawText(text, 0, 0) img = bmp.ConvertToImage() img_str = img.GetData() text_image = string_io._from_raw_string( (0, 0), Dim(w, h), RGB, 0, img_str) text_image = text_image.to_onebit() if halign == 1: p = (p[0] - w / 2, p[1]) elif halign == 2: p = (p[0] - w, p[1]) ul = (max(p[0], self.ul_x), max(p[1], self.ul_y)) lr = (min(p[0] + w, self.lr_x), min(p[1] + h, self.lr_y)) w = lr[0] - ul[0] h = lr[1] - ul[1] if w < 0 or h < 0: return text_image = text_image.subimage( (max(self.ul_x - p[0], 0), max(self.ul_y - p[1], 0)), Dim(w, h)) if self.data.pixel_type == ONEBIT: subimage = self.subimage(ul, Dim(w, h)) if color: subimage.or_image(text_image, in_place=True) else: text_image.invert() subimage.and_image(text_image, in_place=True) elif self.data.pixel_type == RGB: subimage = Image((max(ul[0] - self.ul_x, p[0]), max(ul[1] - self.ul_y, p[1])), Dim(w, h), ONEBIT) subimage.or_image(text_image, in_place=True) self.highlight(subimage, color) __call__ = staticmethod(__call__) def __doc_example1__(images): from random import randint from gamera.core import Image, Dim image = Image((0, 0), Dim(320, 300), RGB, DENSE) # These are some various Unicode encoded names of different # languages (from the wikipedia.org front page). Just a quick way # to test Unicode support. I use the long encoding here so this # source file iteself will be portable. names = ['\xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8', '\xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa', '\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9', '\xc4\x8cesk\xc3\xa1', 'Rom\xc3\xa2n\xc4\x83', '\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98', '\xd0\x9c\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8', '\xc3\x8dslenska', 'Lietuvi\xc5\xb3', 'T\xc3\xbcrk\xc3\xa7e'] try: for i, name in enumerate(names): image.draw_text((160, i * 30), name, RGBPixel(randint(0, 255), randint(0,255), randint(0, 255)), 20, halign=1) except: pass return image if sys.platform != 'darwin': doc_examples = [__doc_example1__] class flood_fill(PluginFunction): """ Flood fills from the given point using the given color. This is similar to the "bucket" tool found in many paint programs. The coordinates can be specified either by two integers or one Point: *a*: The start ``Point``. *color*: The pixel value to set for the rectangle. """ self_type = ImageType([GREYSCALE, FLOAT, ONEBIT, RGB]) args = Args([Point("start"), Pixel("color")]) doc_examples = [(ONEBIT, (10, 58), 0)] class remove_border(PluginFunction): """ This is a special case of the flood_fill algorithm that is designed to remove dark borders produced by photocopiers or flatbed scanners around the border of the image. """ self_type = ImageType([ONEBIT]) class highlight(PluginFunction): """ Highlights all pixels on an image in given color that are black in the passed connected component. The connected component can be part of a different image, it must however lie within the image region. *cc* A one-bit connected component from the image *color* An color value (RGBPixel, 0-255, or [0|1], depending on the image type) used to color the *cc*. """ self_type = ImageType([RGB,GREYSCALE,ONEBIT]) args = Args([ImageType([ONEBIT], "cc"), Pixel("color")]) def __doc_example1__(images): image = images[ONEBIT] ccs = image.cc_analysis() rgb = image.to_rgb() rgb.highlight(ccs[0], RGBPixel(255, 0, 128)) return rgb doc_examples = [__doc_example1__] class DrawModule(PluginModule): cpp_headers = ["draw.hpp"] category = "Draw" functions = [draw_line, draw_bezier, draw_marker, draw_hollow_rect, draw_filled_rect, flood_fill, remove_border, highlight, draw_circle, draw_text] author = "Michael Droettboom" url = "http://gamera.sourceforge.net/" module = DrawModule() gamera-3.3.3/gamera/plugins/edgedetect.py0000644000076500000000000001460611652050142017331 0ustar chriswheel# # Copyright (C) 2001-2005 Michael Droettboom and Robert Ferguson # 2009 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """Edge detectors based on first and second derivatives, and related post-processing from the VIGRA Computer Vision Library.""" from gamera.plugin import * import _edgedetect ######################################## # Edge detection methods class difference_of_exponential_edge_image(PluginFunction): u""" EXPERIMENTAL Detect and mark edges in an edge image using the Shen/Castan zero-crossing detector. Uses code from the VIGRA Computer Vision Library (Copyright 1998-2007 by Ullrich K\u00f6the). *scale* The scale relates to the value b of the exponential filter. *gradient_threshold* Whenever the gradient at a zero crossing is greater than the given gradient_threshold, an edge point is marked in the destination image on the darker side of the zero crossing (the zero crossing occurs between pixels). *min_edge_length* Removes all edges shorter than the number of pixels specified (0 retains all edges). Values near 10 are suggested. """ self_type = ImageType([GREYSCALE, GREY16, FLOAT]) args = Args([Real("scale", (0, 1e300), default=0.8), Real("gradient_threshold", (0, 1e300), default=4.0), Int("min_edge_length", (0, 32000), default=0)]) return_type = ImageType([GREYSCALE, GREY16, FLOAT]) def __call__(self, scale=0.8, gradient_threshold=4.0, min_edge_length=0): return _edgedetect.difference_of_exponential_edge_image( self, scale, gradient_threshold, min_edge_length) __call__ = staticmethod(__call__) doc_examples = [(GREYSCALE,)] class difference_of_exponential_crack_edge_image(PluginFunction): u"""EXPERIMENTAL Detect and mark edges in a crack edge image using the Shen/Castan zero-crossing detector. Uses code from the VIGRA Computer Vision Library (Copyright 1998-2007 by Ullrich K\u00f6the). *scale* The scale relates to the value b of the exponential filter. *gradient_threshold* Whenever the gradient at a zero crossing is greater than the given gradient threshold, an edge point is marked in the destination image on the darker side of the zero crossing (the zero crossing occurs between pixels). *min_edge_length* Removes all edges shorter than the number of pixels specified (0 retains all edges). Values near 10 are suggested. *close_gaps* Close one pixel wide gaps. *beautify* See the VIGRA Docs. """ self_type = ImageType([GREYSCALE, GREY16, FLOAT]) args = Args([Real("scale", (0, 1e300), default=0.8), Real("gradient_threshold", (0, 1e300), default=4.0), Int("min_edge_length", (0, 32000), default=0), Check("close_gaps", default=False), Check("beautify", default=False)]) return_type = ImageType([GREYSCALE, GREY16, FLOAT]) def __call__(self, scale=0.8, gradient_threshold=4.0, min_edge_length=0, close_gaps=False, beautify=False): return _edgedetect.difference_of_exponential_crack_edge_image( self, scale, gradient_threshold, min_edge_length, close_gaps, beautify) __call__ = staticmethod(__call__) doc_examples = [(GREYSCALE,)] class canny_edge_image(PluginFunction): u"""EXPERIMENTAL Detect and mark edges in an edge image using Canny's algorithm. Uses code from the VIGRA Computer Vision Library (Copyright 1998-2007 by Ullrich K\u00f6the). *scale* The scale relates to the value b of the exponential filter. *gradient_threshold* This operator first calls cannyEdgelList() to generate an edgel list for the given image. Than it scans this list and selects edgels whose strength is above the given gradient_threshold. """ self_type = ImageType([GREYSCALE, GREY16, FLOAT]) args = Args([Real("scale", [0, 1e300], default=0.8), Real("gradient_threshold", [0, 1e300], default=4.0)]) return_type = ImageType([GREYSCALE, GREY16, FLOAT]) def __call__(self, scale=0.8, gradient_threshold=4.0): return _edgedetect.canny_edge_image(self, scale, gradient_threshold) __call__ = staticmethod(__call__) doc_examples = [(GREYSCALE,)] class labeled_region_edges(PluginFunction): """ Pixels with a label different from one of its neighboring pixels are marked black in the returned image. When *mark_both* is ``True``, both edges of the region border are marked, resulting in a two pixel wide edge. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB]) args = Args([Check("mark_both", default=False)]) return_type = ImageType([ONEBIT]) author = "Christoph Dalitz" # wrapper for passing default argument def __call__(self, mark_both=False): return _edgedetect.labeled_region_edges(self, mark_both) __call__ = staticmethod(__call__) class outline(PluginFunction): """ Traces the outline of the image. This result is obtained by dilating the image and then XOR'ing the result with the original. """ self_type = ImageType([ONEBIT]) return_type = ImageType([ONEBIT]) doc_examples = [(ONEBIT,)] class EdgeDetect(PluginModule): category = "Edge" cpp_headers=["edgedetect.hpp"] functions = [difference_of_exponential_edge_image, difference_of_exponential_crack_edge_image, canny_edge_image, labeled_region_edges, outline] author = u"Ullrich K\u00f6the (wrapped by Robert Ferguson)" url = "http://gamera.sourceforge.net/" module = EdgeDetect() gamera-3.3.3/gamera/plugins/features.py0000644000076500000000000003277011652050142017054 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan # 2009-2010 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import array from gamera.plugin import * import _features class Feature(PluginFunction): self_type = ImageType([ONEBIT]) return_type = FloatVector(length=1) feature_function = True doc_examples = [(ONEBIT,)] class black_area(Feature): """ The simplest of all feature-generating functions, ``black_area`` simply returns the number of black pixels. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | X | X | +-------+----------+--------+ .. warning:: This feature is not scale invariant. """ pass class moments(Feature): """ Returns *moments* of the image. The first two elements of the returned ``FloatVector`` are the center of gravity on *x* and *y* axis normalized by width and height, respectively. The following seven entries are the *normalized central moments* (*u20,u02,u11,u30,u12,u21,u03*). For their definition, see Gonzalez, Woods: \"Digital Image Processing\", Prentice Hall, second edition (2002). +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | | +-------+----------+--------+ """ return_type = FloatVector(length=9) class nholes(Feature): """ Computes for each row or column the average number of white runs not touching the border. From these values, the average over all rows and all columns is returned. The elements of the returned ``FloatVector`` are: 0. vertical 1. horizontal +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ """ return_type = FloatVector(length=2) class nholes_extended(Feature): """ Divides the image into four strips and then does a nholes_ analysis on each of those strips. This is first done vertically and then horizontally, resulting in a total of eight feature values. The elements of the returned ``FloatVector`` are: 0 - 3 vertical ``nholes`` for each of the strips in order left to right. 4 - 7 horizonal ``nholes`` for each of the strips in order top to bottom. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | | +-------+----------+--------+ """ return_type = FloatVector(length=8) class volume(Feature): """ The percentage of black pixels within the rectangular bounding box of the image. Result in range (0, 1]. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ """ pass class area(Feature): """ The area of the bounding box (i.e. *nrows* * *ncols*). +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | | X | +-------+----------+--------+ """ pass class aspect_ratio(Feature): """ The aspect ratio of the bounding box (i.e. *ncols* / *nrows*). This feature is scale invariant. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ """ pass class nrows_feature(Feature): """ Simply the number of rows. As this feature is *not* scale invariant, it is helpful for distinguishing similar symbols of different size. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | | X | +-------+----------+--------+ """ pass class ncols_feature(Feature): """ Simply the number of cols. As this feature is *not* scale invariant, it is helpful for distinguishing similar symbols of different size. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | | X | +-------+----------+--------+ """ pass class compactness(Feature): """ Compactness is the volume to surface ratio. Highly ornate connected components have a low compactness, whereas a perfect circle has a high compactness. The present implementation of this feature in Gamera does however not return the compactness, but its *inverse*, i.e. the surface to volume ratio. Since this function requires allocation and deallocation of memory, it is relatively slow. However, it has proven to be a very useful feature in many cases. This feature is not scale invariant, because, as the image is scaled by *a*, the surface increases proportional to *a* while the volume grows with *a^2*. This is currently not corrected for. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | | X | X | +-------+----------+--------+ """ pass class volume16regions(Feature): """ Divides the image into a 4 x 4 grid of 16 regions and calculates the volume within each. This feature is also known as \"zoning\" method. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | | +-------+----------+--------+ """ return_type = FloatVector(length=16) class volume64regions(Feature): """ Divides the image into a 8 x 8 grid of 64 regions and calculates the volume within each. This feature is also known as \"zoning\" method. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | | +-------+----------+--------+ """ return_type = FloatVector(length=64) class zernike_moments(Feature): """ Computes the absolute values of the Normalized Zernike Moments up to order six. Zernike moments are the scalar product in the complex L2 Hilbert space between the image and the complex Zernike polynomials. This results in complex values, the absolute values of which are invariant under image rotation and reflection. To make them additionally scale invariant, different normalization schemes have been suggested. The present implementation normalizes the Zernike moments by division with the zeroeth geometric moment *m00*, which results in an approximate scale invariance according to S. Belkasim, E. Hassan, T. Obeidi: \"Explicit invariance of Cartesian Zernike moments.\" Pattern Recognition Letters 28, pp. 1969-1980 (2007) The return values are the absolute values of *A20, A22, A31, A33, A40, A42, A44, A51, A53, A54, A60, A62, A64, A66*. The moments *A00* and *A11* are not computed because these are constant under the used normalization scheme. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | X | X | +-------+----------+--------+ """ author = "Robert Butz and Christoph Dalitz" return_type = FloatVector(length=14) class skeleton_features(Feature): """ Generates a number of features based on the skeleton of an image. First, the image in skeletonized using the Lee and Chen algorithm, which guarantees that the pixels of the resulting skeleton are never more than 4-connected. Then, this skeleton is analysed for a number of properties: 0. Number of X joints (4-connected pixels) 1. Number of T joints (3-connected pixels) 2. Average number of bend points (pixels which do not form a horizontal or vertical line with its neighbors) 3. Number of end points (1-connected pixels) 4. Number of *x*-axis crossings with respect to the *x*-axis through the center of mass 5. Number of *y*-axis crossings with respect to the *y*-axis through the center of mass +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ """ return_type = FloatVector(length=6) class top_bottom(Feature): """ Features useful only for segmentation-free analysis. Currently, the first feature is the first row containing a black pixel, and the second feature is the last row containing a black pixel. +---------------------------+ | **Invariant to:** | +-------+----------+--------+ | scale | rotation | mirror | +-------+----------+--------+ | X | | X | +-------+----------+--------+ """ return_type = FloatVector(length=2) class generate_features(PluginFunction): """ Generates features for the image by calling a number of feature functions and storing the results in the image's ``features`` member variable (a Python ``array``). *features* Optional. A list of feature function names. If not given, the previously set feature functions will be used. If none were previously given, all available feature functions will be used. Using all feature functions can also be forced by passing ``'all'``. .. warning:: For efficiency, if the given feature functions match those that have been already generated for the image, the features are *not* recalculated. If you want to force recalculation, pass the optional argument ``force=True``. """ category = "Utility" pure_python = True self_type = ImageType([ONEBIT]) args = Args([Class('features', list), Check('force')]) return_type = None cache = {} def __call__(self, features=None, force=False): if features is None: features = self.get_feature_functions() if self.feature_functions == features and not force: return self.feature_functions = features features, num_features = features if len(self.features) != num_features: if not generate_features.cache.has_key(num_features): generate_features.cache[num_features] = [0] * num_features self.features = array.array('d', generate_features.cache[num_features]) offset = 0 for name, function in features: function.__call__(self, offset) offset += function.return_type.length __call__ = staticmethod(__call__) class FeaturesModule(PluginModule): category = "Features" cpp_headers=["features.hpp"] functions = [black_area, moments, nholes, nholes_extended, volume, area, aspect_ratio, nrows_feature, ncols_feature, compactness, volume16regions, volume64regions, generate_features, zernike_moments, skeleton_features, top_bottom] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = FeaturesModule() def get_features_length(features): """ Given a list of feature functions return the number of features that will be generated. This function is necessary because each features 'function' can return multiple individual float values. """ from gamera import core ff = core.ImageBase.get_feature_functions(features) return ff[1] def generate_features_list(list, features='all'): """ Generate features on a list of images. *features* Follows the same rules as for generate_features_. """ from gamera import core, util ff = core.Image.get_feature_functions(features) progress = util.ProgressFactory("Generating features...", len(list) / 10) try: for i, glyph in enumerate(list): glyph.generate_features(ff) if i % 10 == 0: progress.step() finally: progress.kill() generate_features = generate_features() del Feature gamera-3.3.3/gamera/plugins/geometry.py0000644000076500000000000003405311755374467017114 0ustar chriswheel# # Copyright (C) 2009-2012 Christoph Dalitz # 2010 Oliver Christen, Tobias Bolten # 2011 Christian Brandt # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * from gamera.args import NoneDefault import _geometry try: from gamera.core import RGBPixel except: def RGBPixel(*args): pass class voronoi_from_labeled_image(PluginFunction): u""" Computes the area Voronoi tesselation from an image containing labeled Cc's. In the returned onebit image, every pixel is labeled with the label value of the closest Cc in the input image. To prepare the input image, you can use cc_analysis__. When the Cc's only consist of single points, the area Voronoi tesselation is identical to the ordinary Voronoi tesselation. .. __: segmentation.html#cc-analysis The implementation applies a watershed algorithm to the distance transform of the input image, a method known as *seeded region growing* (U. K\u00f6the: *Primary Image Segmentation.* Proceedings 17th DAGM-Symposium, pp. 554-561, Springer, 1995). The example shown below is the image *voronoi_cells* as created with the the following code: .. code:: Python # create an area Voronoi tesselation and # mark the cells and their edges in color ccs = image.cc_analysis() # labels the image voronoi = image.voronoi_from_labeled_image() voronoi_cells = voronoi.color_ccs() voronoi_cells.highlight(image, RGBPixel(0,0,0)) voronoi_edges = voronoi.labeled_region_edges() voronoi_cells.highlight(voronoi_edges, RGBPixel(255,255,255)) """ self_type = ImageType([ONEBIT,GREYSCALE]) return_type = ImageType([ONEBIT,GREYSCALE]) def __doc_example1__(images): image = images[ONEBIT] ccs = image.cc_analysis() voronoi = image.voronoi_from_labeled_image() voronoi_cells = voronoi.color_ccs() voronoi_cells.highlight(image, RGBPixel(0,0,0)) voronoi_edges = voronoi.labeled_region_edges() voronoi_cells.highlight(voronoi_edges, RGBPixel(255,255,255)) return [image, voronoi_cells] doc_examples = [__doc_example1__] author = u"Christoph Dalitz, based on code by Ullrich K\u00f6the" class voronoi_from_points(PluginFunction): """ Computes the Voronoi tesselation from a list of points and point labels. The result is directly written to the input image. Each white pixel is labeled with the label value of the closest point. Non white pixel in the input image are not overwritten. The arguments *points* and *labels* specify the points and labels, such that ``labels[i]`` is the label of ``points[i]``. Note that the labels need not necessarily all be different, which can be useful as an approximation of an area Voronoi tesselation. The algorithm is very simple: it stores the points in a `kd-tree`_ and then looks up the closest point for each image pixel. This has a runtime of *O(N log(n))*, where *N* is the number of image pixels and *n* is the number of points. For not too many points, this should be faster than the morphological region growing approach of `voronoi_from_labeled_image`_. .. _`kd-tree`: kdtree.html .. _`voronoi_from_labeled_image`: #voronoi-from-labeled-image The example shown below is the image *voronoi_edges* as created with the the following code: .. code:: Python # create a Voronoi tesselation and mark # the cell edges in a second image points = [(10,10),(20,30),(32,22),(85,14),(40,70),(80,85)] voronoi = Image((0,0),(90,90)) voronoi.voronoi_from_points(points,[i+2 for i in range(len(points))]) voronoi_edges = voronoi.labeled_region_edges() for p in points: voronoi_edges.set(p,1) """ self_type = ImageType([ONEBIT,GREYSCALE]) args = Args([PointVector("points"),IntVector("labels")]) return_type = None def __doc_example1__(images): from gamera.core import Image points = [(10,10),(20,30),(32,22),(85,14),(40,70),(80,85)] voronoi = Image((0,0),(90,90)) voronoi.voronoi_from_points(points,[i+2 for i in range(len(points))]) voronoi_edges = voronoi.labeled_region_edges() for p in points: voronoi_edges.set(p,1) return [voronoi_edges] doc_examples = [__doc_example1__] author = "Christoph Dalitz" class labeled_region_neighbors(PluginFunction): """ For an image containing labeled regions, a list of all label pairs belonging to touching regions is returned. When *eight_connectivity* is ``True`` (default), 8-connectivity is used for neighborship, otherwise 4-connectivity is used. This can be useful for building a Delaunay graph from a Voronoi tesselation as in the following example: .. code:: Python # # build Delaunay graph of neighboring (i.e. adjacent) Cc's # # create map label->Cc for faster lookup later ccs = image.cc_analysis() label_to_cc = {} for c in ccs: label_to_cc[c.label] = c # compute area Voronoi tesselation and neighborship list voronoi = image.voronoi_from_labeled_image() labelpairs = voronoi.labeled_region_neighbors() # build map of all neighbors for each label for fast lookup neighbors = {} for label in label_to_cc.keys(): neighbors[label] = [] for n in labelpairs: neighbors[n[0]].append(n[1]) neighbors[n[1]].append(n[0]) # now, all neighbors to a given cc can be looked up with neighbors_of_cc = [label_to_cc[label] for label in neighbors[cc.label]] """ self_type = ImageType([ONEBIT]) args = Args([Check("eight_connectivity",default=True)]) return_type = Class("labelpairs") author = "Christoph Dalitz" # wrapper for passing default argument def __call__(self, eight_connectivity=True): return _geometry.labeled_region_neighbors(self, eight_connectivity) __call__ = staticmethod(__call__) class delaunay_from_points(PluginFunction): """ Computes the Delaunay triangulation directly from a list of points and point labels. The result is a list which contains tuples of adjacent labels, where in each tuple the smaller label is given first. The arguments *points* and *labels* specify the points and nonnegative labels, such that ``labels[i]`` is the label of ``points[i]``. Note that the labels need not necessarily all be different, which can be useful for the computation of a neighborship graph from a set of connected components. The computation of the Delaunay triangulation is based on the Delaunay tree which is a randomized geometric data structure. It is described in O. Devillers, S. Meiser, M. Teillaud: `Fully dynamic Delaunay triangulation in logarithmic expected time per operation.`__ Computational Geometry: Theory and Applications 2, pp. 55-80, 1992. .. __: http://hal.inria.fr/inria-00090678 This can be useful for building a neighborhood graph as shown in the following example: .. code:: Python from gamera import graph from gamera.plugins.geometry import delaunay_from_points points = [(10,10),(20,30),(32,22),(85,14),(40,70),(80,85)] labels = range(len(points)) neighbors = delaunay_from_points(points, labels) g = graph.Graph(graph.UNDIRECTED) for pair in neighbors: g.add_edge(pair[0], pair[1]) """ self_type = None args = Args([PointVector("points"), IntVector("labels")]) return_type = Class("labelpairs") author = "Oliver Christen (based on code by Olivier Devillers)" class graph_color_ccs(PluginFunction): """ Returns an RGB Image where each segment is colored with one of the colors from *colors* with the constraint that segments adjacent in the neighborship graph have different colors. This function can be used to verify that the pagesegmentation e.g. ``runlength_smearing`` is working correctly for your image. For coloring the Gamera graph library is used. For more information on the coloring algorithm see Graph.colorize__ .. __: graph.html#colorize *ccs*: ImageList which contains ccs to be colored. Must be views on the image on which this method is called. *colors*: list of colors (instances of RGBPixel) which will be used for coloring. When ``None``, the default set of seven colors given in the example below is used. *method*: Controls the calculation of the neighborhood graph: 0 = from the CC center points (fastest, but can be inaccurate for large CC's) 1 = from a 20 percent sample of the contour points (reasonable compromise between speed and accuracy) 2 = from the exact area Voronoi diagram (can be slow on large images) .. code:: Python ccs = imgage.cc_analysis() colors = [ RGBPixel(150, 0, 0), RGBPixel(0, 250, 0), RGBPixel(0, 0, 255), RGBPixel(250, 0, 255), RGBPixel(50, 150, 50), RGBPixel(0, 190, 255), RGBPixel(230, 190, 20) ] rgb = imgage.mycolor_ccs(ccs, colors, 1) .. note:: *colors* may not contain less than six colors. """ category = "Color" author = "Oliver Christen and Tobias Bolten" args = Args([ImageList('ccs'), Class('colors', klass=RGBPixel, list_of=True,default=NoneDefault), Choice('method', ["CC center", "20% contour points", "voronoi diagram"], default=1)]) self_type = ImageType([ONEBIT]) return_type = ImageType([RGB]) def __call__(image, ccs, colors=None, method=1): if colors == None: from gamera.core import RGBPixel colors = [ RGBPixel(150, 0, 0), RGBPixel(0, 250, 0), RGBPixel(0, 0, 255), RGBPixel(250, 0, 255), RGBPixel(50, 150, 50), #RGBPixel(120, 120, 120), #RGBPixel(250, 250, 0), RGBPixel(0, 190, 255), RGBPixel(230, 190, 20), ] return _geometry.graph_color_ccs(image, ccs, colors, method) __call__ = staticmethod(__call__) class convex_hull_from_points(PluginFunction): """Returns the polygon vertices of the convex hull of the given list of points. The function uses Graham's scan algorithm as described e.g. in Cormen et al.: *Introduction to Algorithms.* 2nd ed., MIT Press, p. 949, 2001 """ self_type = None args = Args([PointVector("points")]) return_type = PointVector("convexhull") author = "Christian Brandt, Christoph Dalitz, and David Kolanus" class convex_hull_as_points(PluginFunction): """Returns the vertex points of the convex hull of all black pixels in the given image. Actually not all black pixels are required for computing the convex hull, but only the left and right contour pixels of the image. This follows from the fact that, when a point is invisible both from the left and the right, it lies on the connection axis between two visible points and thus cannot be a vertex point of the convex hull. """ self_type = ImageType([ONEBIT]) args = Args([]) return_type = PointVector("convexhull") author = "Christoph Dalitz" class convex_hull_as_image(PluginFunction): """Returns an image containing the polygon of the convex hull calculated by convex_hull_as_points_. .. _convex_hull_as_points: geometry.html#convex_hull_as_points """ self_type = ImageType([ONEBIT]) args = Args([Check("filled",default=False)]) return_type = ImageType([ONEBIT]) author = "Christoph Dalitz" doc_examples = [(ONEBIT,)] def __call__(image, filled=False): return _geometry.convex_hull_as_image(image, filled) __call__ = staticmethod(__call__) class max_empty_rect(PluginFunction): """Returns the maximum area empty rect that fits into the image without containing any of the black image pixels. This problem is in the literature generally known as the *Largest Empty Rectangle Problem*. When the image does not contain a white pixel at all, an exception of type ``RuntimeError`` is thrown. The coordinates of the returned rectangle are relative to the upper left corner of the image. Reference: D. Vandevoorde: `\"The Maximal Rectangle Problem.\"`__ Dr. Dobb's, April 1998. .. __: http://www.drdobbs.com/database/184410529 """ self_type = ImageType([ONEBIT]) args = Args([]) return_type = Rect("max_epmty_rect") author = "Daveed Vandevoorde and Christoph Dalitz" def __doc_example1__(images): from gamera.core import Image from gamera.core import Point as P img = Image((0,0),(90,90)) points = [P(10,10),P(20,30),P(32,22),P(85,14),P(40,70),P(80,85)] for p in points: img.draw_filled_rect((p.x-2,p.y-2),(p.x+1,p.y+1),1) r = img.max_empty_rect() rgb = img.to_rgb() rgb.draw_hollow_rect(r,RGBPixel(255,0,0)) rgb.highlight(img,RGBPixel(0,0,0)) return [rgb] doc_examples = [__doc_example1__] class GeometryModule(PluginModule): cpp_headers = ["geometry.hpp"] category = "Geometry" import glob cpp_sources=["src/geostructs/kdtree.cpp", "src/geostructs/delaunaytree.cpp"] + glob.glob("src/graph/*.cpp") functions = [voronoi_from_labeled_image, voronoi_from_points, labeled_region_neighbors, delaunay_from_points, graph_color_ccs, convex_hull_from_points, convex_hull_as_points, convex_hull_as_image, max_empty_rect] author = "Christoph Dalitz" url = "http://gamera.sourceforge.net/" module = GeometryModule() delaunay_from_points = delaunay_from_points() convex_hull_from_points = convex_hull_from_points() gamera-3.3.3/gamera/plugins/gui_support.py0000644000076500000000000001004011652050142017600 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _gui_support class to_string(PluginFunction): """ Encodes the image into a 'string' required by wxImage. (i.e. 8-bit RGB triplets). """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB, FLOAT, COMPLEX]) return_type = Class("image_as_string") class to_buffer(PluginFunction): """ Encodes the image into a 'buffer' required by wx.Image. (i.e. 8-bit RGB triplets). If you need to convert a gamera image *scaled_image* to a wx.Bitmap, you can do so as follows: .. code:: Python wximg = wx.EmptyImage(scaled_image.ncols, scaled_image.nrows) scaled_image.to_buffer(wximg.GetDataBuffer()) wxbmp = wx.BitmapFromImage(wximg) """ category = "ExternalLibraries" self_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB, FLOAT, COMPLEX]) args = Args(Class("Buffer")) class draw_cc(PluginFunction): """ Draws a colored Cc over an already initialized wxImage buffer. """ self_type = ImageType([RGB]) args = Args([ImageType([ONEBIT]), Int("red"), Int("green"), Int("blue")]) class to_buffer_colorize(PluginFunction): """ Encodes the image into a 'buffer' required by wxImage, and applies the given color to the foreground and background. """ self_type = ImageType([ONEBIT, GREYSCALE]) args = Args([Class("Buffer"), Int("red"), Int("green"), Int("blue"), Bool("invert")]) class color_ccs(PluginFunction): """ Returns an RGB image where each connected component of the image is colored one of eight different colors. This function can be used to verify that ``cc_analysis`` is working correctly for your image. It should be noted that this coloring does not take care of component adjacency. It may therefore happen that adjacent components obtain the same color. If this is not acceptable in your use case, have a look at graph_color_ccs_ instead. .. _graph_color_ccs: color.html#graph-color-ccs *ignore_unlabeled*: do not colorize unlabeled pixels (pixel value one), but leave them black .. note:: Connected component analysis must already be performed on the image (using cc_analysis_, for example) in order for this to work. .. _cc_analysis: segmentation.html#cc-analysis **Example 1:** .. image:: images/color_ccs.png """ author = "Michael Droettboom, Karl MacMillan, and Robert Butz" args = Args([Check('ignore_unlabeled', default=True)]) category = "Color" self_type = ImageType([ONEBIT]) return_type = ImageType([RGB]) def __call__(image, ignore_unlabeled=False): return _gui_support.color_ccs(image, ignore_unlabeled) __call__ = staticmethod(__call__) # By default, the wxPython-devel RPM puts stuff here, but this # should be done better class GuiSupportModule(PluginModule): """ This module provides various functions that support the GUI infrastructure. """ category = None cpp_headers = ["gui_support.hpp"] functions = [to_string, to_buffer, to_buffer_colorize, color_ccs, draw_cc] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = GuiSupportModule() gamera-3.3.3/gamera/plugins/id_name_matching.py0000644000076500000000000001320411652050142020473 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import re, string def build_id_regex(s): def _build_id_regex_parts(s): if s == '': return '' regex_parts = [] parts = s.split('.') for part in parts: ors = part.split('|') l = [] for part0 in ors: part0 = part0.replace('*', '[^.]*') part0 = part0.replace('?', '[^.]') l.append(part0) regex_parts.append('(?:%s)' % '|'.join(['(?:%s)' % x for x in l])) regex = '\.'.join(regex_parts) return regex def _build_id_regex_parens(s): lparen = s.find('(') rparen = s.find(')') if s == '': return '', '' elif s[0] == '|': r, s = _build_id_regex_parens(s[1:]) return '|' + r, s elif lparen != -1 and lparen < rparen: result = _build_id_regex_parts(s[:lparen]) r1, s1 = _build_id_regex_parens(s[lparen+1:]) r2, s2 = _build_id_regex_parens(s1) return result + r1 + r2, s2 elif rparen != -1: return _build_id_regex_parts(s[:rparen]), s[rparen+1:] else: return _build_id_regex_parts(s), '' regex, s = _build_id_regex_parens(s) return re.compile(regex, re.IGNORECASE) regex_cache = {} dummy_regex = re.compile('') type_dummy_regex = type(dummy_regex) class match_id_name(PluginFunction): r""" Returns true if the image's main ``id_name`` matches the given regular expression. *regex* A special-purpose regular expression as defined below. A special-purpose regular expression language designed for convenience on Gamera symbol names is used here. It has limited flexibility relative to Python regular expressions, and is more akin to wildcards in command-line shells. This language is converted to standard Python regular expressions (``re`` module) for efficiency. **Informal syntax definition:** ==================== ============================================= Regular expression Description ==================== ============================================= ``A|B`` matches ``A`` or ``B`` ``A.B|C`` matches ``A.B`` or ``A.C`` ``*`` multiple-character wildcard ``?`` single character wildcard ``()`` grouping can be performed with parentheses ``[a-z]`` matches any character a-z ==================== ============================================= **Example expressions:** ======================== ==================================================== ``(upper.x)|(lower.y)`` match either ``upper.x`` or ``lower.y`` ``upper.x|upper.y`` careful! matches ``upper.x.y`` or ``upper.upper.y`` ``upper.*`` match anything in the ``upper`` category ``upper.a|b|c`` matches ``upper.a``, ``upper.b`` or ``upper.c`` ``upper.capital_?`` ``?`` is a single character wildcard ======================== ==================================================== """ args = Args([String('regex')]) def __call__(self, regex): global regex_cache if type(regex) == StringType: compiled = regex_cache.get(regex, None) if compiled is None: compiled = build_id_regex(regex) regex_cache[regex] = compiled elif type(regex) == type_dummy_regex: compiled = regex else: raise TypeError( "Expression must be a string or a compiled Python regular expression.") name = self.get_main_id() if compiled.match(name): return 1 #for confidence, name in self.id_name: # if compiled.match(name): # return 1 return 0 __call__ = staticmethod(__call__) _valid = string.letters + string.digits + "_" def id_name_to_identifier(symbol): while len(symbol) and symbol[0] == '.': symbol = symbol[1:] if symbol == '': return '____' def translate(c): if not c in _valid: return "_" return c symbol = ''.join([translate(x) for x in symbol]) symbol = symbol.lower() if symbol[0] in string.digits or keyword.iskeyword(symbol): symbol = '_' + symbol + '_' # Split by '.' delimiters orig_tokens = symbol.strip().split('.') tokens = [] for token in orig_tokens: if token.strip() != '': tokens.append(token.strip()) symbol = '_'.join(tokens) return symbol class IdNameMatchingModule(PluginModule): category = "Classification" functions = [match_id_name] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" pure_python = 1 module = IdNameMatchingModule() match_id_name = match_id_name() gamera-3.3.3/gamera/plugins/image_conversion.py0000644000076500000000000001501411652050142020555 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan # 2011 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import image_utilities, _image_conversion class to_rgb(PluginFunction): """ Converts the given image to an RGB image according to teh following rules: - for ONEBIT images, 0 is mapped to (255,255,255) and everything else to (0,0,0) - for GREYSCALE and GREY16 images, R=G=B - for FLOAT images, the range [min,max] is linearly mapped to the 256 grey values Note, converting an image to one of the same type performs a copy operation. """ author = "Michael Droettboom, Karl MacMillan, and Christoph Dalitz" self_type = ImageType([ONEBIT, GREYSCALE, FLOAT, GREY16, COMPLEX]) return_type = ImageType([RGB], "rgb") def __call__(self): if self.data.pixel_type == RGB: return self.image_copy() return _image_conversion.to_rgb(self) __call__ = staticmethod(__call__) class to_greyscale(PluginFunction): """ Converts the given image to a GREYSCALE image according to the following rules: - for ONEBIT images, 0 is mapped to 255 and everything else to 0. - for FLOAT images, the range [min,max] is linearly scaled to [0,255] - for GREY16 images, the range [0,max] is linearly scaled to [0,255] - for RGB images, the luminance is used, which is defined in VIGRA as 0.3*R + 0.59*G + 0.11*B Converting an image to one of the same type performs a copy operation. """ author = "Michael Droettboom, Karl MacMillan, and Christoph Dalitz" self_type = ImageType([ONEBIT, FLOAT, GREY16, RGB, COMPLEX]) return_type = ImageType([GREYSCALE], "greyscale") doc_examples = [(RGB,)] def __call__(self): if self.data.pixel_type == GREYSCALE: return self.image_copy() return _image_conversion.to_greyscale(self) __call__ = staticmethod(__call__) class to_grey16(PluginFunction): """ Converts the given image to a GREY16 image according to the following rules: - for ONEBIT images, 0 is mapped to 65535 and everything else to 0. - for FLOAT images, the range [min,max] is linearly scaled to [0,65535] - for GREYSCALE images, pixel values are copied unchanged - for RGB images, the luminance is used, which is defined in VIGRA as 0.3*R + 0.59*G + 0.11*B. This results only in a value range [0,255] Converting an image to one of the same type performs a copy operation. """ author = "Michael Droettboom, Karl MacMillan, and Christoph Dalitz" self_type = ImageType([ONEBIT, GREYSCALE, FLOAT, RGB, COMPLEX]) return_type = ImageType([GREY16], "grey16") def __call__(self): if self.data.pixel_type == GREY16: return self.image_copy() return _image_conversion.to_grey16(self) __call__ = staticmethod(__call__) class to_float(PluginFunction): """ Converts the given image to a FLOAT image according to the following rules: - for ONEBIT images, 0 is mapped to 0.0 and everything else to 1.0 - for GREYSCALE and GREY16 images, pixel values are copied unchanged - for RGB images, the luminance is used, which is defined in VIGRA as 0.3*R + 0.59*G + 0.11*B Converting an image to one of the same type performs a copy operation. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB, COMPLEX]) return_type = ImageType([FLOAT], "float") def __call__(self): if self.data.pixel_type == FLOAT: return self.image_copy() return _image_conversion.to_float(self) __call__ = staticmethod(__call__) class to_complex(PluginFunction): """ Converts the given image to a COMPLEX image. Note, converting an image to one of the same type performs a copy operation. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB, FLOAT]) return_type = ImageType([COMPLEX], "complex") def __call__(self): if self.data.pixel_type == COMPLEX: return self.image_copy() return _image_conversion.to_complex(self) __call__ = staticmethod(__call__) class to_onebit(PluginFunction): """ Converts the given image to a ONEBIT image. First the image is converted and then the otsu_threshold_ algorithm is applied. For other ways to convert to ONEBIT images, see the Binarization_ category. Converting an image to one of the same type performs a copy operation. .. _otsu_threshold: binarization.html#otsu-threshold .. _Binarization: binarization.html """ pure_python = True self_type = ImageType([FLOAT, GREYSCALE, GREY16, RGB, COMPLEX]) return_type = ImageType([ONEBIT], "onebit") def __call__(self, storage_format=DENSE): if self.data.pixel_type == ONEBIT: return self.image_copy() if self.data.pixel_type != GREYSCALE: self = _image_conversion.to_greyscale(self) return self.otsu_threshold(storage_format) __call__ = staticmethod(__call__) doc_examples = [(RGB,), (GREYSCALE,)] to_onebit = to_onebit class extract_real(PluginFunction): """ Returns a Float image containing only the real values in the given complex image. """ self_type = ImageType([COMPLEX]) return_type = ImageType([FLOAT], "float") class extract_imaginary(PluginFunction): """ Returns a Float image containing only the imaginary values in the given complex image. """ self_type = ImageType([COMPLEX]) return_type = ImageType([FLOAT], "float") class ImageConversionModule(PluginModule): category = "Conversion" cpp_headers=["image_conversion.hpp"] functions = [to_rgb, to_greyscale, to_grey16, to_float, to_onebit, to_onebit, to_complex, extract_real, extract_imaginary] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = ImageConversionModule() gamera-3.3.3/gamera/plugins/image_utilities.py0000644000076500000000000003374311741631156020425 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan # 2008-2012 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """The image utilities module contains plugins that do not fit in any other category, like image copying or computing histograms.""" from gamera.plugin import * from gamera.gui import has_gui from gamera.util import warn_deprecated from gamera.args import NoneDefault import sys import _image_utilities class image_copy(PluginFunction): """ Copies an image along with all of its underlying data. Since the data is copied, changes to the new image do not affect the original image. *storage_format* specifies the compression type for the returned copy: DENSE (0) no compression RLE (1) run-length encoding compression """ category = "Utility" self_type = ImageType(ALL) return_type = ImageType(ALL) args = Args([Choice("storage_format", ["DENSE", "RLE"])]) def __call__(image, storage_format = 0): if image.nrows <= 0 or image.ncols <= 0: return image return _image_utilities.image_copy(image, storage_format) __call__ = staticmethod(__call__) class image_save(PluginFunction): """ Saves an image to file with specified name and format. """ pure_python = 1 category = "Utility" self_type = ImageType(ALL) args = Args([FileSave("image_file_name", "", "*"), Choice("File format", ["TIFF", "PNG"]) ]) def __call__(image, name, format): if format == 0 or format.upper() == "TIFF": try: from gamera.plugins import tiff_support except ImportError: raise ImportError("Could not load TIFF support.") image.save_tiff(name) elif format == 1 or format.upper() == "PNG": try: from gamera.plugins import png_support except ImportError: raise ImportError("Could not load PNG support.") image.save_PNG(name) __call__ = staticmethod(__call__) class histogram(PluginFunction): """ Compute the histogram of the pixel values in the given image. Returns a Python array of doubles, with each value being a percentage. If the GUI is being used, the histogram is displayed. .. image:: images/histogram.png """ category = "Analysis" self_type = ImageType([GREYSCALE, GREY16]) return_type = FloatVector() doc_examples = [(GREYSCALE,)] def __call__(image): hist = _image_utilities.histogram(image) if has_gui.has_gui == has_gui.WX_GUI: has_gui.gui.ShowHistogram(hist, mark=image.otsu_find_threshold()) return hist __call__ = staticmethod(__call__) class union_images(PluginFunction): """ Returns an image that is the union of the given list of connected components. """ category = "Combine" self_type = None args = Args([ImageList('list_of_images')]) return_type = ImageType([ONEBIT]) class fill_white(PluginFunction): """ Fills the entire image with white. """ category = "Draw" self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) class fill(PluginFunction): """ Fills the entire image with value. *value* A pixel value. This value may be any value the pixel type can support. """ category = "Draw" self_type = ImageType(ALL) args = Args([Pixel("value")]) class pad_image_default(PluginFunction): """Pads an image with the default pixel value white""" # This is only for plugin generation, it will not be added to the image type # (since self_type == None) category = None self_type = None args = Args([ImageType(ALL), Int("top"), Int("right"), Int("bottom"), Int("left")]) return_type = ImageType(ALL) class pad_image(PluginFunction): """ Pads an image with any value. When no pixel value is given, the value corresponding to the color *white* is used. *top* Padding on the top. *right* Padding on the right. *bottom* Padding on the bottom. *left* Padding on the left. *value* An optional pixel value of the pixel type of the image. When omitted or set to ``None``, the color white is used for padding. """ category = "Utility" self_type = ImageType(ALL) args = Args([Int("top"), Int("right"), Int("bottom"), Int("left"), Pixel("value")]) return_type = ImageType(ALL) _pad_image_default = pad_image_default() def __call__(self, top, right, bottom, left, value=None): if value is None: return pad_image._pad_image_default(self, top, right, bottom, left) else: return _image_utilities.pad_image(self, top, right, bottom, left, value) __call__ = staticmethod(__call__) doc_examples = [(RGB, 5, 10, 15, 20)] class trim_image(PluginFunction): """ Returns minimal view so that outside of the view only Pixels with *PixelValue* exists. When no *PixelValue* is given, white is used. """ category = "Utility" self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) args = Args([Pixel("PixelValue", default=NoneDefault)]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT, RGB]) author = "Tobias Bolten" def __call__(self, PixelValue=None): if (PixelValue == None): PixelValue = self.white() return _image_utilities.trim_image(self, PixelValue) __call__ = staticmethod(__call__) class invert(PluginFunction): """ Inverts the image. """ category = "Draw" self_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB]) doc_examples = [(RGB,), (GREYSCALE,), (ONEBIT,)] class clip_image(PluginFunction): """ Crops an image so that the bounding box includes only the intersection of it and another image. Returns a zero-sized image if the two images do not intersect. """ category = "Utility" return_type = ImageType(ALL) self_type = ImageType(ALL) args = Args(Rect("other")) class mask(PluginFunction): """ Masks an image using the given ONEBIT image. Parts of the ONEBIT image that are white will be changed to white in the resulting image. The images must be the same size. """ category = "Combine" return_type = ImageType([GREYSCALE, RGB]) self_type = ImageType([GREYSCALE, RGB]) args = Args(ImageType([ONEBIT], "mask")) class to_nested_list(PluginFunction): """ Converts an image to a nested Python list. This method is the inverse of ``nested_list_to_image``. The following table describes how each image type is converted to Python types: - ONEBIT -> int - GREYSCALE -> int - GREY16 -> int - RGB -> RGBPixel - FLOAT -> float NOTE: This will not scale very well and should only be used for small images, such as convolution kernels. """ category = "Utility/NestedLists" self_type = ImageType(ALL) return_type = Class("nested_list") doc_examples = [(ONEBIT,)] class nested_list_to_image(PluginFunction): """ Converts a nested Python list to an Image. Is the inverse of ``to_nested_list``. *nested_list* A nested Python list in row-major order. If the list is a flat list, an image with a single row will be created. *image_type* The resulting image type. Should be one of the integer Image type constants (ONEBIT, GREYSCALE, GREY16, RGB, FLOAT). If image_type is not provided or less than 0, the image type will be determined by auto-detection from the list. The following list shows the mapping from Python type to image type: - int -> GREYSCALE - float -> FLOAT - RGBPixel -> RGB To obtain other image types, the type number must be explicitly passed. NOTE: This will not scale very well and should only be used for small images, such as convolution kernels. Examples: .. code:: Python # Sobel kernel (implicitly will be a FLOAT image) kernel = nested_list_to_image([[0.125, 0.0, -0.125], [0.25 , 0.0, -0.25 ], [0.125, 0.0, -0.125]]) # Single row image (note that nesting is optional) image = nested_list_to_image([RGBPixel(255, 0, 0), RGBPixel(0, 255, 0), RGBPixel(0, 0, 255)]) """ category = "Utility/NestedLists" self_type = None args = Args([Class('nested_list'), Choice('image_type', ['ONEBIT', 'GREYSCALE', 'GREY16', 'RGB', 'FLOAT'])]) return_type = ImageType(ALL) def __call__(l, t=-1): return _image_utilities.nested_list_to_image(l, t) __call__ = staticmethod(__call__) class diff_images(PluginFunction): """ Returns a color image representing the difference of two images following the conventions of a number of Unix diff visualization tools, such as CVS web. Pixels in both images are black. Pixels in 'self' but not in the given image (\"deleted\" pixels) are red. Pixels in the given image but not in self (\"inserted\" pixels) are green. """ category = "Combine" self_type = ImageType(ONEBIT) args = Args([ImageType(ONEBIT, 'other')]) return_type = ImageType(RGB) pure_python = True def __call__(self, other): from gamera.core import RGBPixel result = self.to_rgb() diff = self.subtract_images(other) result.highlight(diff, RGBPixel(255, 64, 64)) diff = other.subtract_images(self) result.highlight(diff, RGBPixel(64, 255, 64)) return result __call__ = staticmethod(__call__) class mse(PluginFunction): """ Calculates the mean square error between two images. """ category = "Utility" self_type = ImageType([RGB]) args = Args([ImageType([RGB])]) return_type = Float() class reset_onebit_image(PluginFunction): """ Resets all black pixel values in a onebit image to one. This can be necessary e.g. after a CC analysis which sets black pixels to some other label value. """ category="Utility" self_type = ImageType([ONEBIT]) author = "Christoph Dalitz" class ccs_from_labeled_image(PluginFunction): """ Returns all ``Cc``'s represented by unique labels in the given onebit image. The bounding boxes are computed as tight as possible. This is mostly useful for reading manually labeled groundtruth data from color PNG files in combination with the plugin colors_to_labels_. Example: .. code:: Python labeled = rgb.colors_to_labels() ccs = labeled.ccs_from_labeled_image() .. _colors_to_labels: color.html#colors-to-labels """ category="Utility" self_type = ImageType([ONEBIT]) return_type = ImageList("ccs") author = "Christoph Dalitz and Hasan Yildiz" class min_max_location(PluginFunction): """Returns the minimum and maximum pixel value and their location in an image. When the min/max value occurs at several locations, only the location that is closest to the botom right corner is returned. Only those pixels are examined that are black in the provided *mask*. When no *mask* is given, the entire image is examined. The mask can be useful, e.g., to find the lightest and darkest value in the original greyscale image belonging to a Cc, as in the following example: .. code:: Python onebit = grey.to_onebit() ccs = onebit.cc_analysis() # compute min/max of first cc in original greyscale image (pmin, vmin, pmax, vmax) = grey.min_max_location(ccs[0]) The return value is a tuple of the form *(pmin, vmin, pmax, vmax)* where *pmin* and *pmax* are the point of the minimum and maximimum, respectively, and *vmin* and *vmax* the corresponding pixel values. """ category="Analysis" self_type = ImageType([GREYSCALE,GREY16,FLOAT]) return_type = Class("min_max_loc") args = Args([ImageType([ONEBIT], name='mask', default=NoneDefault)]) author = "Christoph Dalitz" doc_examples = [(GREYSCALE,)] def __call__(self, mask=None): if mask is None: return _image_utilities.min_max_location_nomask(self) else: return _image_utilities.min_max_location(self, mask) __call__ = staticmethod(__call__) class min_max_location_nomask(PluginFunction): """This is only a helper function for overloading min_max_location. It is not needed on the Python side, but only on the C++ side due to the plugin wrapping mechanism of Gamera. """ category = None self_type = ImageType([GREYSCALE,GREY16,FLOAT]) return_type = Class("min_max_loc") author = "Christoph Dalitz" class UtilModule(PluginModule): cpp_headers=["image_utilities.hpp"] category = None functions = [image_save, image_copy, histogram, union_images, fill_white, fill, pad_image, pad_image_default, trim_image, invert, clip_image, mask, nested_list_to_image, to_nested_list, diff_images, mse, reset_onebit_image, ccs_from_labeled_image, min_max_location, min_max_location_nomask] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = UtilModule() union_images = union_images() nested_list_to_image = nested_list_to_image() del pad_image_default gamera-3.3.3/gamera/plugins/listutilities.py0000644000076500000000000000744111652050142020142 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # 2009 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _listutilities class permute_list(PluginFunction): """ Permutes the given list (in place) one step. Returns ``True`` if there are more permutations to go. Returns ``False`` if permutations are done. Example usage:: >>>from gamera.plugins import listutilities >>>a = [1,2,3] >>>while listutilities.permute_list(a): ... print a ... [2, 1, 3] [1, 3, 2] [3, 1, 2] [2, 3, 1] [3, 2, 1] """ category = "List" self_type = None args = Args([Class("list")]) return_type = Int("continuaton") class all_subsets(PluginFunction): """Returns all subsets of size *size* of the given list.""" category = "List" self_type = None args = Args([Class("list"), Int("size")]) return_type = Class("subsets") class median(PluginFunction): """Compute the median from a list of values in linear time. This implementation works both with builtin numeric types like *int* or *float*, and with user defined types. For user defined type, you must implement the "less than" operator (`__lt__`), as in the following example: .. code:: Python class P: x = 0; y = 0 def __init__(self, x, y): self.x = x; self.y = y def __lt__(self, other): return (self.x < other.x) def __eq__(self, other): return (self.x == other.x) a = [P(0,0), P(1,1), P(2,0)] p = median(a) When the parameter *inlist* is ``True``, the median is always a list entry, even for lists of even size. Otherwise, the median is for an even size list of *int* or *float* values the mean between the two middle values. So if you need the median for a pivot element, set *inlist* to ``True``. For user defined types, the returned median is always a list entry, because arithmetic computations do not make sense in this case. .. note:: This is *not* the median image filter that replaces each pixel value with the median of its neighborhood. For this purpose, see the rank__ plugin. .. __: morphology.html#rank """ category = "List" pure_python = 1 self_type = None return_type = Class("m") args = Args([Class("list"), Check("inlist", check_box="always from list", default=False)]) author = "Christoph Dalitz" def __call__(list, inlist=False): return _listutilities.median_py(list, inlist) __call__ = staticmethod(__call__) class median_py(PluginFunction): """This is only for Gamera's Python-C++ interface.""" category = None self_type = None return_type = Class("m") args = Args([Class("list"), Check("inlist")]) author = "Christoph Dalitz" class ListUtilitiesModule(PluginModule): category = None cpp_headers=["listutilities.hpp"] functions = [permute_list, all_subsets, median, median_py] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = ListUtilitiesModule() permute_list = permute_list() all_subsets = all_subsets() median = median() gamera-3.3.3/gamera/plugins/logical.py0000644000076500000000000001216411652050142016643 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _logical class LogicalCombine(PluginFunction): self_type = ImageType([ONEBIT]) return_type = ImageType([ONEBIT]) args = Args([ImageType([ONEBIT], "other"), Check("in_place", default=False)]) class and_image(LogicalCombine): """ Perform the AND operation on two images. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. See or_image_ for some usage examples. """ def __call__(self, other, in_place=False): return _logical.and_image(self, other, in_place) __call__ = staticmethod(__call__) def __doc_example1__(images): from gamera.core import Dim onebit = images[ONEBIT].subimage((0, 0), Dim(70, 68)) greyscale = images[GREYSCALE].to_onebit().subimage((0, 0), Dim(70, 68)) return [onebit, greyscale, onebit.and_image(greyscale, False)] doc_examples = [__doc_example1__] class or_image(LogicalCombine): """ Perform the OR operation on two images. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. Usage examples: Using logical functions in different ways will generally involve creating temporary subimages for regions of interest. Subimages are very lightweight objects that keep track of a bounding box and refer to the underlying data, therefore creating/destroying a number of these on the fly should not have a significant impact on performance. Padding an image. .. code:: Python def pad_image(image, padding): new_image = Image(0, 0, image.nrows + padding * 2, image.ncols + padding * 2, ONEBIT, DENSE) new_image.subimage((padding, padding), Dim(image.nrows, image.ncols)).or_image(image, True) return new_image Stamping an image over a larger image. Use subimage to change the destination of the stamp. .. code:: Python # stamp: a small stamp image # paper: a larger destination image for x in range(0, 100, 10): paper.subimage(0, x, stamp.nrows, stamp.ncols).or_image(stamp, True) Putting part of a source image on the upper-left corner of a destination image. .. code:: Python # src: a source image # dest: a destination image dest.or_image(src.subimage(50, 50, 25, 25), True) Removing a connected component from its original image. .. code:: Python # src: the original image # cc: a cc on that image src.clip_image(cc).xor_image(cc, True) """ def __call__(self, other, in_place=False): return _logical.or_image(self, other, in_place) __call__ = staticmethod(__call__) def __doc_example1__(images): from gamera.core import Dim onebit = images[ONEBIT].subimage((0, 0), Dim(70, 68)) greyscale = images[GREYSCALE].to_onebit().subimage((0, 0), Dim(70, 68)) return [onebit, greyscale, onebit.or_image(greyscale, False)] doc_examples = [__doc_example1__] class xor_image(LogicalCombine): """ Perform the XOR operation on two images. Since it would be difficult to determine what exactly to do if the images are a different size, the two images must be the same size. *in_place* If true, the operation will be performed in-place, changing the contents of the current image. See or_image_ for some usage examples. """ def __call__(self, other, in_place=False): return _logical.xor_image(self, other, in_place) __call__ = staticmethod(__call__) def __doc_example1__(images): from gamera.core import Dim onebit = images[ONEBIT].subimage((0, 0), Dim(70, 68)) greyscale = images[GREYSCALE].to_onebit().subimage((0, 0), Dim(70, 68)) return [onebit, greyscale, onebit.xor_image(greyscale, False)] doc_examples = [__doc_example1__] class LogicalModule(PluginModule): """ This module provides methods to perform basic logical (bitwise) operations on images. """ category = "Combine/Logical" cpp_headers = ["logical.hpp"] functions = [and_image, or_image, xor_image] author = "Michael Droettboom" url = "http://gamera.sourceforge.net/" module = LogicalModule() del LogicalCombine gamera-3.3.3/gamera/plugins/misc_filters.py0000644000076500000000000002166211704334020017715 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan # 2010-2012 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _misc_filters class rank(PluginFunction): """ Within each *k* times *k* window, set the center pixel to the *r*-th ranked value. Note that for ``Onebit`` images, actually *rank(k*k - r + 1)* is computed instead of *rank(r)*. This has the effect that you do not need to worry whether your image is a greyscale or onebit image: in all cases low values for *r* will darken the image and high values will light it up. *rank* (1, 2, ..., *k* * *k*) The rank of the windows pixels to select for the center. (k*k+1)/2 is equivalent to the median. *k* (3, 5 ,7, ...) The window size (must be odd). *border_treatment* (0, 1) When 0 ('padwhite'), window pixels outside the image are set to white. When 1 ('reflect'), reflecting boundary conditions are used. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT]) args = Args([Int('rank'), Int('k', default=3), Choice('border_treatment', ['padwhite', 'reflect'], default=1)]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT]) author = "Christoph Dalitz and David Kolanus" doc_examples = [(GREYSCALE, 2), (GREYSCALE, 5), (GREYSCALE, 8)] def __call__(self, rank, k=3, border_treatment=1): if k%2 == 0: raise RuntimeError("rank: window size k must be odd") if rank < 1 or rank > k*k: raise RuntimeError("rank: rank must be between 1 and k*k") return _misc_filters.rank(self, rank, k, border_treatment) __call__ = staticmethod(__call__) class mean(PluginFunction): """ Within each *k* times *k* window, set the center pixel to the mean value of all pixels. *k* is the window size (must be odd), and *border_treatment* can be 0 ('padwhite'), which sets window pixels outside the image to white, or 1 ('reflect'), for reflecting boundary conditions. """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT]) args = Args([Int('k', default=3), Choice('border_treatment', ['padwhite', 'reflect'], default=1)]) doc_examples = [(GREYSCALE,)] return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT]) author = "David Kolanus" def __call__(self, k=3, border_treatment=1): if k%2 == 0: raise RuntimeError("mean: window size k must be odd") return _misc_filters.mean(self, k, border_treatment) __call__ = staticmethod(__call__) class min_max_filter(PluginFunction): """ Within each *k* times *k* window, set the center pixel to the minimum or maximum value of all pixels inside the window. *k* is the window size (must be odd) and *filter* is the filter type (0 for min, 1 for max). When *k_vertical* is nonzero, the vertical size of the window is set to *k_vertical* instead of *k*. This function does the same as *rank(1,k,border_treatment=1)*, but is much faster because the runtime of *min_max_filter* is constant in the window size. The same algorithm has been developed independently by van Herk and Gil and Werman. See M. van Herk: *A fast algorithm for local minimum and maximum filters on rectangular and octagonal kernels.* Pattern Recognition Letters 13, pp. 517-521, 1992 J. Gil, M. Werman: *Computing 2-D min, median, and max filters.* IEEE Transactions on Pattern Analysis and Machine Intelligence 15, pp. 504-507, 1993 """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT]) args = Args([Int('k', default=3), Choice('filter', ['min', 'max'], default=0), Int('k_vertical', default=0)]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, FLOAT]) author = "David Kolanus" doc_examples = [(GREYSCALE,)] def __call__(self, k=3, filter=0, k_vertical=0): if k%2 == 0: raise RuntimeError("min_max_filter: window size k must be odd") if k_vertical != 0 and k_vertical%2 == 0: raise RuntimeError("min_max_filter: k_vertical must be zero or odd") return _misc_filters.min_max_filter(self, k, filter, k_vertical) __call__ = staticmethod(__call__) class create_gabor_filter(PluginFunction): """ Computes the convolution of an image with a two dimensional Gabor function. The result is returned as a float image. The *orientation* is given in radians, the other parameters are the center *frequency* (for example 0.375 or smaller) and the two angular and radial sigmas of the gabor filter. The energy of the filter is explicitly normalized to 1.0. """ self_type = ImageType([GREYSCALE]) return_type = ImageType([FLOAT]) args = Args([Float("orientation", default=45.0), Float("frequency", default=0.375), Int("direction", default=5)]) author = u"Ullrich K\u00f6the (wrapped from VIGRA by Uma Kompella)" doc_examples = [(GREYSCALE,)] def __call__(self, orientation=45.0, frequency=0.375, direction=5): return _misc_filters.create_gabor_filter(self, orientation, frequency, direction) __call__ = staticmethod(__call__) class kfill(PluginFunction): """ Removes salt and pepper noise in onebit images by applying the *kfill* filter *iterations* times. Should before *iteration* times a run of the kfill filter not change a single pixel, the iteration is stopped beforehand. In contrast to a rank or mean filter, kfill is designed in such a way that it does not merge non touching connected components. To this end, the border of the *k* times *k* mask is scanned for black pixels and the center is not filled when this would connect disjoint pixels on the border. A detailed description of the algorithm can be found in M. Seul, L. O'Gorman, M.J. Sammon: *Practical Algorithms for Image Analysis.* Cambridge University Press, 2000 The present implementation does not use code from the book, but has been written from scratch. """ self_type = ImageType([ONEBIT]) return_type = ImageType([ONEBIT]) author = "Oliver Christen" args = Args([Int("k", default=3),Int("iterations", default=1)]) def __call__(self, k=3, iterations=1): if k < 3: raise RuntimeError("kfill: k must be >= 3") if iterations < 1: raise RuntimeError("kfill: number of iterations must be > 0") return _misc_filters.kfill(self, k, iterations) __call__ = staticmethod(__call__) class kfill_modified(PluginFunction): """ Removes salt and pepper noise in onebit images by applying a modified version of the *kfill* filter proposed in the following reference: K.Chinnasarn, Y.Rangsanseri, P.Thitimajshima: *Removing Salt-and-Pepper Noise in Text/Graphics Images.* Proceedings of The Asia-Pacific Conference on Circuits and Systems (APCCAS'98), pp. 459-462, 1998 For *k* = 3, this algorithm is identical with the original kfill algorithm. For larger *k* however, it fills the window core also when not all pixels are of the same value. It should be noted that in this case, the modified version does *not* take care of connectivity. In other words, it can result in joining previously disconnected connected components, similar to a morphological closing operation, while at the same time small black speckles are removed. """ self_type = ImageType([ONEBIT]) return_type = ImageType([ONEBIT]) author = "Oliver Christen" args = Args([Int("k", default=3)]) def __call__(self, k=3): if k < 3: raise RuntimeError("k < 3") return _misc_filters.kfill_modified(self, k) __call__ = staticmethod(__call__) class MiscFiltersModule(PluginModule): category = "Filter" functions = [mean, rank, min_max_filter, create_gabor_filter, kfill, kfill_modified] cpp_headers = ["misc_filters.hpp"] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = MiscFiltersModule() gamera-3.3.3/gamera/plugins/misc_free_functions.py0000644000076500000000000000350011652050142021247 0ustar chriswheel# # Copyright (C) 2010 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """This module contains miscellanous free functions that are no image methods, but are used at different places in the gamera core.""" from gamera.plugin import * import _misc_free_functions class range_of_float(PluginFunction): """Returns a tuple ``(float_min, float_max)`` containing the range of a float variable on the used operating system, as given by ``std::numeric_limits``. This should be the same as ``sys.float_info.min`` and ``sys.float_info.max``, but these have been introduced into python as late as 2.6, so we need an own implementation for backward compatibility. """ category = None self_type = None return_type = Class("min_max") author = "Christoph Dalitz" def __call__(): return _misc_free_functions.range_of_float() __call__ = staticmethod(__call__) class MiscFreeFunctionsModule(PluginModule): category = None cpp_headers=["misc_free_functions.hpp"] functions = [range_of_float] author = "Christoph Dalitz" url = "http://gamera.sourceforge.net/" module = MiscFreeFunctionsModule() range_of_float = range_of_float() gamera-3.3.3/gamera/plugins/morphology.py0000644000076500000000000002015411652050142017426 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _morphology #TODO: Change these to out-of-place class erode(PluginFunction): """ Morpholgically erodes the image with a 3x3 square structuring element. """ self_type = ImageType([ONEBIT, GREYSCALE, FLOAT]) doc_examples = [(GREYSCALE,), (ONEBIT,)] return_type = ImageType([ONEBIT, GREYSCALE, FLOAT]) pure_python = True def __call__(image): return _morphology.erode_dilate(image, 1, 1, 0) __call__ = staticmethod(__call__) class dilate(PluginFunction): """ Morpholgically dilates the image with a 3x3 square structuring element. The returned image is of the same size as the input image, which means that border pixels are not dilated beyond the image dimensions. If you also want the border pixels to be dilated, apply pad_image_ to the input image beforehand. .. _pad_image: utility.html#pad-image """ self_type = ImageType([ONEBIT, GREYSCALE, FLOAT]) doc_examples = [(GREYSCALE,), (ONEBIT,)] return_type = ImageType([ONEBIT, GREYSCALE, FLOAT]) pure_python = True def __call__(image): return _morphology.erode_dilate(image, 1, 0, 0) __call__ = staticmethod(__call__) class erode_dilate(PluginFunction): """ Morphologically erodes or dilates the image with a rectangular or ocagonal structuring element. For onebit images, this is simply a wrapper for erode_with_structure_ or dilate_with_structure_ with special cases for the structuring element. The returned image is of the same size as the input image, which means that border pixels are not dilated beyond the image dimensions. If you also want the border pixels to be dilated, apply pad_image_ to the input image beforehand. .. _pad_image: utility.html#pad-image .. _erode_with_structure: #erode-with-structure .. _dilate_with_structure: #dilate-with-structure *ntimes* The number of times to perform the operation. *direction* dilate (0) increase the presence of black erode (1) decrease the presence of black *shape* rectangular (0) use a 3x3 rectangular morphology operator octagonal (1) use octagonal morphology operator by alternately using a 3x3 cross and a 3x3 square structuring element """ self_type = ImageType([ONEBIT, GREYSCALE, FLOAT]) args = Args([Int('ntimes', range=(0, 10), default=1), \ Choice('direction', ['dilate', 'erode']), \ Choice('shape', ['rectangular', 'octagonal'])]) return_type = ImageType([ONEBIT, GREYSCALE, FLOAT]) doc_examples = [(GREYSCALE, 10, 0, 1)] class despeckle(PluginFunction): """ Removes connected components that are smaller than the given size. *size* The maximum number of pixels in each connected component that will be removed. This approach to finding connected components uses a pseudo-recursive descent, which gets around the hard limit of ~64k connected components per page in ``cc_analysis``. Unfortunately, this approach is much slower as the connected components get large, so *size* should be kept relatively small. *size* == 1 is a special case and runs much faster, since it does not require recursion. """ self_type = ImageType([ONEBIT]) args = Args([Int('cc_size', range=(1, 100))]) doc_examples = [(ONEBIT,15)] class distance_transform(PluginFunction): """ For all black pixels, the distance to the nearest white pixel is calculated. In the destination image, all pixels corresponding to black pixels in the input image will be assigned the their distance value, all pixels corresponding to white pixels will be assigned 0. The result is returned as a Float image. *norm*: 0: use chessboard distance (L-infinity norm) 1: use Manhattan distance (L1 norm) 2: use Euclidean distance (L2 norm) """ self_type = ImageType([ONEBIT]) args = Args([Choice("norm", ['chessboard', 'manhattan', 'euclidean'])]) return_type = ImageType([FLOAT]) doc_examples = [(ONEBIT,5),] author = u"Ullrich K\u00f6the (wrapped from VIGRA by Michael Droettboom)" class dilate_with_structure(PluginFunction): """ Performs a binary morphological dilation with the given structuring element. Note that it is necessary to specify which point in the structuring element shall be treated as origin. This allows for arbitrary structuring elements. Examples: .. code:: Python # same as image.dilate() structure = Image(Point(0,0), Point(2,2), ONEBIT) structure.fill(1) image = image.dilate_with_structure(structure, Point(1,1)) # same as image.erode_dilate(3,0,0) structure = Image(Point(0,0), Point(6,6), ONEBIT) structure.fill(1) image = image.dilate_with_structure(structure, Point(3,3)) The implementation is straightforward and can be slow for large structuring elements. If you know that your structuring element is connected and its origin is black, you can set *only_border* to ``True``, because in this case only the border pixels in the image need to be considered which can speed up the dilation for some images (though not for all). The returned image is of the same size as the input image, which means that border pixels are not dilated beyond the image dimensions. If you also want the border pixels to be dilated, apply pad_image_ to the input image beforehand. .. _pad_image: utility.html#pad-image References: A proof that only the contour pixels need to be dilated for connected structuring elements containing their origin is given by Luc Vincent in *Morphological Transformations of Binary Images with Arbitrary Structuring Elements*, Signal Processing, Vol. 22, No. 1, pp. 3-23, January 1991 (see theorem 2.13) """ self_type = ImageType([ONEBIT]) args = Args([ImageType([ONEBIT],'structuring_element'), Point('origin'), Check('only_border', default=False)]) return_type = ImageType([ONEBIT]) author = "Christoph Dalitz" def __call__(self, structuring_element, origin, only_border=False): return _morphology.dilate_with_structure(self, structuring_element, origin, only_border) __call__ = staticmethod(__call__) class erode_with_structure(PluginFunction): """ Performs a binary morphological erosion with the given structuring element. Note that it is necessary to specify which point in the structuring element shall be treated as origin. This allows for arbitrary structuring elements. Border pixels at which the structuring element extends beyond the image dimensions are whitened. In other words the image is padded with white pixels before erosion. Example: .. code:: Python # same as image.erode() structure = Image(Point(0,0), Point(2,2), ONEBIT) structure.fill(1) image = image.erode_with_structure(structure, Point(1,1)) """ self_type = ImageType([ONEBIT]) args = Args([ImageType([ONEBIT],'structuring_element'), Point('origin')]) return_type = ImageType([ONEBIT]) author = "Christoph Dalitz" class MorphologyModule(PluginModule): cpp_headers = ["morphology.hpp"] category = "Morphology" functions = [erode_dilate, erode, dilate, despeckle, distance_transform, dilate_with_structure, erode_with_structure] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = MorphologyModule() gamera-3.3.3/gamera/plugins/numarray_io.py0000644000076500000000000001611311652050142017554 0ustar chriswheel# # Copyright (C) 2005 Alex Cobb # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """Data transfer between Gamera and numarray. """ from gamera.plugin import * from gamera.util import warn_deprecated from gamera import config try: import numpy.numarray as n except ImportError: try: verbose = config.get("verbosity_level") except: verbose = 0 if verbose: print ('Info: numpy.numarray could not be imported') else: _typecodes = {RGB : n.UInt8, GREYSCALE : n.UInt8, GREY16 : n.UInt32, ONEBIT : n.UInt16, FLOAT : n.Float64, COMPLEX : n.Complex64 } _inverse_typecodes = { n.UInt8 : GREYSCALE, n.UInt32 : GREY16, n.UInt16 : ONEBIT, n.Float64 : FLOAT, n.Complex64 : COMPLEX } class from_numarray(PluginFunction): """ Instantiates a Gamera image from a numarray multi-dimensional array *array*. Optionally, an *offset* for the image data may be provided. The array must be one of the following types and will map to the corresponding Gamera image type: +------------+------------------+ | Gamera | Numarray | | type | type | +============+==================+ | RGB | UInt8 (on 3 | | | planes) | +------------+------------------+ | GREYSCALE | UInt8 | +------------+------------------+ | GREY16 | UInt32 | +------------+------------------+ | ONEBIT | UInt16 | +------------+------------------+ | FLOAT | Float64 | +------------+------------------+ | COMPLEX | Complex64 | +------------+------------------+ Requires two copying operations; may fail for very large images. To use this function, which is not a method on images, do the following: .. code:: Python from gamera.plugins import numarray_io image = numarray_io.from_numarray(array) """ self_type = None args = Args([Class("array")]) return_type = ImageType(ALL) pure_python = True def __call__(array, offset=None): from gamera.plugins import _string_io from gamera.core import Point, Dim if offset is None: offset = Point(0, 0) pixel_type = from_numarray._check_input(array) return _string_io._from_raw_string( offset, Dim(array.shape[1], array.shape[0]), pixel_type, DENSE, array.tostring()) __call__ = staticmethod(__call__) def _check_input(array): shape = array.shape typecode = n.typefrom(array) if len(shape) == 3 and shape[2] == 3 and typecode == n.UInt8: return RGB elif len(shape) == 2: if _inverse_typecodes.has_key(typecode): return _inverse_typecodes[typecode] raise ValueError('Array is not one of the acceptable types (UInt8 * 3, UInt8, UInt16, UInt32, Float64, Complex64)') _check_input = staticmethod(_check_input) class to_numarray(PluginFunction): """ Returns a ``numarray`` array containing a copy of the image's data. The array will be one of the following types corresponding to each of the Gamera image types: +------------+-----------------+ | Gamera | Numarray | | type | type | +============+=================+ | RGB | UInt8 (on 3 | | | planes) | +------------+-----------------+ | GREYSCALE | UInt8 | +------------+-----------------+ | GREY16 | UInt32 | +------------+-----------------+ | ONEBIT | UInt16 | +------------+-----------------+ | FLOAT | Float64 | +------------+-----------------+ | COMPLEX | Complex64 | +------------+-----------------+ Requires *three* copies, and may fail for very large images. """ self_type = ImageType(ALL) return_type = Class("array") pure_python = True def __call__(image): from gamera.plugins import _string_io pixel_type = image.data.pixel_type shape = (image.nrows, image.ncols) typecode = _typecodes[pixel_type] if pixel_type == RGB: shape += (3,) return n.fromstring(_string_io._to_raw_string(image), typecode=typecode, shape=shape) __call__ = staticmethod(__call__) def __doc_example1__(images): image = images[RGB] array = image.to_numarray() image0 = from_numarray(array) return [image, image0] def __doc_example2__(images): image = images[GREYSCALE] array = image.to_numarray() image0 = from_numarray(array) return [image, image0] def __doc_example4__(images): image = images[ONEBIT] array = image.to_numarray() image0 = from_numarray(array) return [image, image0] def __doc_example5__(images): image = images[FLOAT] array = image.to_numarray() image0 = from_numarray(array) return [image, image0] def __doc_example6__(images): image = images[COMPLEX] array = image.to_numarray() image0 = from_numarray(array) return [image, image0] doc_examples = [__doc_example1__, __doc_example2__, __doc_example4__, __doc_example5__, __doc_example6__] class NumarrayModule(PluginModule): category = None #"ExternalLibraries/Numarray" author = "Alex Cobb" functions = [from_numarray, to_numarray] pure_python = True url = ('http://www.oeb.harvard.edu/faculty/holbrook/' 'people/alex/Website/alex.htm') module = NumarrayModule() from_numarray = from_numarray() gamera-3.3.3/gamera/plugins/numeric_io.py0000644000076500000000000001565511652050142017372 0ustar chriswheel# # Copyright (C) 2005 Alex Cobb # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """Data transfer between Gamera and Numeric. """ from gamera.plugin import * from gamera.util import warn_deprecated from gamera import config try: import numpy.oldnumeric as n except ImportError: try: verbose = config.get("verbosity_level") except: verbose = 0 if verbose: print ('Info: numpy.oldumeric could not be imported.') else: _typecodes = {RGB : n.UInt8, GREYSCALE : n.UInt8, GREY16 : n.UInt32, ONEBIT : n.UInt16, FLOAT : n.Float64, COMPLEX : n.Complex64 } _inverse_typecodes = { n.UInt8 : GREYSCALE, n.UInt32 : GREY16, n.UInt16 : ONEBIT, n.Float64 : FLOAT, n.Complex64 : COMPLEX } class from_numeric(PluginFunction): """ Instantiates a Gamera image from a Numeric multi-dimensional array *array*. The array must be one of the following types and will map to the corresponding Gamera image type: +------------+------------------+ | Gamera | Numeric | | type | type | +============+==================+ | RGB | UInt8 (on 3 | | | planes) | +------------+------------------+ | GREYSCALE | UInt8 | +------------+------------------+ | GREY16 | UInt32 | +------------+------------------+ | ONEBIT | UInt16 | +------------+------------------+ | FLOAT | Float64 | +------------+------------------+ | COMPLEX | Complex64 | +------------+------------------+ Requires two copying operations; may fail for very large images. To use this function, which is not a method on images, do the following: .. code:: Python from gamera.plugins import numeric_io image = numeric_io.from_numeric(array) """ self_type = None args = Args([Class("array")]) return_type = ImageType(ALL) pure_python = True def __call__(array, offset=(0, 0)): from gamera.plugins import _string_io from gamera.core import Dim pixel_type = from_numeric._check_input(array) return _string_io._from_raw_string( offset, Dim(array.shape[1], array.shape[0]), pixel_type, DENSE, array.tostring()) __call__ = staticmethod(__call__) def _check_input(array): shape = array.shape typecode = array.dtype.char if len(shape) == 3 and shape[2] == 3 and typecode == n.UInt8: return RGB elif len(shape) == 2: if _inverse_typecodes.has_key(typecode): return _inverse_typecodes[typecode] raise ValueError('Array is not one of the acceptable types (UInt8 * 3, UInt8, UInt16, UInt32, Float64, Complex64)') _check_input = staticmethod(_check_input) class to_numeric(PluginFunction): """ Returns an ``Numeric`` array containing a copy of the image's data. The array will be one of the following types corresponding to each of the Gamera image types: +------------+-----------------+ | Gamera | Numeric | | type | type | +============+=================+ | RGB | UInt8 (on 3 | | | planes) | +------------+-----------------+ | GREYSCALE | UInt8 | +------------+-----------------+ | GREY16 | UInt32 | +------------+-----------------+ | ONEBIT | UInt16 | +------------+-----------------+ | FLOAT | Float64 | +------------+-----------------+ | COMPLEX | Complex64 | +------------+-----------------+ Requires *three* copies, and may fail for very large images. """ self_type = ImageType(ALL) return_type = Class("array") pure_python = True def __call__(image): from gamera.plugins import _string_io pixel_type = image.data.pixel_type shape = (image.nrows, image.ncols) typecode = _typecodes[pixel_type] if pixel_type == RGB: shape += (3,) array = n.fromstring(_string_io._to_raw_string(image), typecode) return n.resize(array, shape) __call__ = staticmethod(__call__) def __doc_example1__(images): image = images[RGB] array = image.to_numeric() image0 = from_numeric(array) return [image, image0] def __doc_example2__(images): image = images[GREYSCALE] array = image.to_numeric() image0 = from_numeric(array) return [image, image0] def __doc_example4__(images): image = images[ONEBIT] array = image.to_numeric() image0 = from_numeric(array) return [image, image0] def __doc_example5__(images): image = images[FLOAT] array = image.to_numeric() image0 = from_numeric(array) return [image, image0] def __doc_example6__(images): image = images[COMPLEX] array = image.to_numeric() image0 = from_numeric(array) return [image, image0] doc_examples = [__doc_example1__, __doc_example2__, __doc_example4__, __doc_example5__, __doc_example6__] class NumericModule(PluginModule): category = None #"ExternalLibraries/Numeric" author = "Alex Cobb" functions = [from_numeric, to_numeric] pure_python = True url = ('http://www.oeb.harvard.edu/faculty/holbrook/' 'people/alex/Website/alex.htm') module = NumericModule() from_numeric = from_numeric() gamera-3.3.3/gamera/plugins/numpy_io.py0000644000076500000000000001662211652050142017073 0ustar chriswheel# # Copyright (C) 2009 Alex Cobb, Robert Butz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """Data transfer between Gamera and Numpy. """ from gamera.plugin import * from gamera import config try: import numpy as n except ImportError: try: verbose = config.get("verbosity_level") except: verbose = 0 if verbose: print ('Info: numpy could not be imported.') else: _typecodes = {RGB : n.dtype('uint8'), GREYSCALE : n.dtype('uint8'), GREY16 : n.dtype('uint32'), ONEBIT : n.dtype('uint16'), FLOAT : n.dtype('float64'), COMPLEX : n.dtype('complex128') } _inverse_typecodes = { n.dtype('uint8') : GREYSCALE, n.dtype('uint32') : GREY16, n.dtype('uint16') : ONEBIT, n.dtype('float64') : FLOAT, n.dtype('complex128') : COMPLEX } class from_numpy(PluginFunction): """ Instantiates a Gamera image from a Numeric multi-dimensional array *array*. The array must be one of the following types and will map to the corresponding Gamera image type: +------------+------------------+ | Gamera | Numpy | | type | type | +============+==================+ | RGB | uint8 (on 3 | | | planes) | +------------+------------------+ | GREYSCALE | uint8 | +------------+------------------+ | GREY16 | uint32 | +------------+------------------+ | ONEBIT | uint16 | +------------+------------------+ | FLOAT | float64 | +------------+------------------+ | COMPLEX | complex128 | +------------+------------------+ Requires two copying operations; may fail for very large images. To use this function, which is not a method on images, do the following: .. code:: Python from gamera.plugins import numpy_io image = numpy_io.from_numpy(array) """ self_type = None args = Args([Class("array")]) return_type = ImageType(ALL) pure_python = True def __call__(array, offset=(0, 0)): from gamera.plugins import _string_io from gamera.core import Dim pixel_type = from_numpy._check_input(array) return _string_io._from_raw_string( offset, Dim(array.shape[1], array.shape[0]), pixel_type, DENSE, array.tostring()) __call__ = staticmethod(__call__) def _check_input(array): shape = array.shape typecode = array.dtype if len(shape) == 3 and shape[2] == 3 and typecode == n.dtype('uint8'): return RGB elif len(shape) == 2: if _inverse_typecodes.has_key(typecode): return _inverse_typecodes[typecode] raise ValueError('Array is not one of the acceptable types (uint8 * 3, uint8, uint16, uint32, float64, complex128)') _check_input = staticmethod(_check_input) class to_numpy(PluginFunction): """ Returns an ``Numeric`` array containing a copy of the image's data. The array will be one of the following types corresponding to each of the Gamera image types: +------------+-----------------+ | Gamera | Numeric | | type | type | +============+=================+ | RGB | uint8 (on 3 | | | planes) | +------------+-----------------+ | GREYSCALE | uint8 | +------------+-----------------+ | GREY16 | uint32 | +------------+-----------------+ | ONEBIT | uint16 | +------------+-----------------+ | FLOAT | float64 | +------------+-----------------+ | COMPLEX | complex128 | +------------+-----------------+ Requires *three* copies, and may fail for very large images. This method can be used for utilizing special functions present in numpy. If you need to compute the discrete fourier transform of an image, you can use numpy, as in the following example: .. code:: Python from gamera.plugins import numpy_io from numpy import fft nparr = image.to_numpy() fourarr = fft.fft2(nparr) fourimage = numpy_io.from_numpy(fourarr) """ self_type = ImageType(ALL) return_type = Class("array") pure_python = True def __call__(image): from gamera.plugins import _string_io pixel_type = image.data.pixel_type shape = (image.nrows, image.ncols) typecode = _typecodes[pixel_type] if pixel_type == RGB: shape += (3,) array = n.fromstring(_string_io._to_raw_string(image), typecode) return n.resize(array, shape) __call__ = staticmethod(__call__) def __doc_example1__(images): image = images[RGB] array = image.to_numpy() image0 = from_numpy(array) return [image, image0] def __doc_example2__(images): image = images[GREYSCALE] array = image.to_numpy() image0 = from_numpy(array) return [image, image0] def __doc_example4__(images): image = images[ONEBIT] array = image.to_numpy() image0 = from_numpy(array) return [image, image0] def __doc_example5__(images): image = images[FLOAT] array = image.to_numpy() image0 = from_numpy(array) return [image, image0] def __doc_example6__(images): image = images[COMPLEX] array = image.to_numpy() image0 = from_numpy(array) return [image, image0] doc_examples = [__doc_example1__, __doc_example2__, __doc_example4__, __doc_example5__, __doc_example6__] class NumpyModule(PluginModule): category = "ExternalLibraries/Numpy" author = "Robert Butz based on code by Alex Cobb" functions = [from_numpy, to_numpy] pure_python = True #url = ('http://www.oeb.harvard.edu/faculty/holbrook/' # 'people/alex/Website/alex.htm') module = NumpyModule() from_numpy = from_numpy() gamera-3.3.3/gamera/plugins/pagesegmentation.py0000644000076500000000000004214711652050142020567 0ustar chriswheel# # Copyright (C) 2007-2009 Christoph Dalitz, Stefan Ruloff, Robert Butz, # Maria Elhachimi, Ilya Stoyanov, Rene Baston # 2010 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _pagesegmentation class projection_cutting(PluginFunction): """ Segments a page with the *Iterative Projection Profile Cuttings* method. The image is split recursively in the horizontal and vertical direction by looking for 'gaps' in the projection profile. A 'gap' is a contiguous sequence of projection values smaller than *noise* pixels. The splitting is done for each gap wider or higher than given thresholds *Tx* or *Ty*. When no further split points are found, the recursion stops. Whether the resulting segments represent lines, columns or paragraphs depends on the values for *Tx* and *Ty*. The return value is a list of 'CCs' where each 'CC' represents a found segment. Note that the input image is changed such that each pixel is set to its CC label. *Tx*: minimum 'gap' width in the horizontal direction. When set to zero, *Tx* is set to the median height of all connected component * 7, which might be a reasonable assumption for the gap width between adjacent text columns. *Ty*: minimum 'gap' width in the vertical direction. When set to zero, *Ty* is set to half the median height of all connected component, which might be a reasonable assumption for the gap width between adjacent text lines. *noise*: maximum projection value still consideread as belonging to a 'gap'. *gap_treatment*: decides how to treat gaps when *noise* is non zero. When 0 ('cut'), gaps are cut in the middle and the noise pixels in the gap are assigned to the segments. When 1 ('ignore'), noise pixels within the gap are not assigned to a segment, in other words, they are ignored. """ self_type = ImageType([ONEBIT]) args = Args([Int('Tx', default = 0), Int('Ty', default = 0), \ Int('noise', default = 0), Choice('gap_treatment', ["cut", "ignore"], default=0)]) return_type = ImageList("ccs") author = "Maria Elhachimi and Robert Butz" def __call__(image, Tx = 0, Ty = 0, noise = 0, gap_treatment = 0): return _pagesegmentation.projection_cutting(image, Tx, Ty, noise, gap_treatment) __call__ = staticmethod(__call__) class runlength_smearing(PluginFunction): """ Segments a page with the *Run Length Smearing* algorithm. The algorithm converts white horizontal and vertical runs shorter than given thresholds *Cx* and *Cy* to black pixels (this is the so-called 'run length smearing'). The intersection of both smeared images yields the page segments as black regions. As this typically still consists small white horizontal gaps, these gaps narrower than *Csm* are in a final step also filled out. The return value is a list of 'CCs' where each 'CC' represents a found segment. Note that the input image is changed such that each pixel is set to its CC label. Arguments: *Cx*: Minimal length of white runs in the rows. When set to *-1*, it is set to 20 times the median height of all connected components. *Cy*: Minimal length of white runs in the columns. When set to *-1*, it is set to 20 times the median height of all connected components. *Csm*: Minimal length of white runs row-wise in the almost final image. When set to *-1*, it is set to 3 times the median height of all connected components. """ self_type = ImageType([ONEBIT]) return_type = ImageList("ccs") args = Args([Int('Cx', default = -1), Int('Cy', default = -1), \ Int('Csm', default = -1)]) author = "Christoph Dalitz and Iliya Stoyanov" def __call__(image, Cx = -1, Cy = -1, Csm = -1): return _pagesegmentation.runlength_smearing(image, Cx, Cy, Csm) __call__ = staticmethod(__call__) class bbox_merging(PluginFunction): """ Segments a page by extending and merging the bounding boxes of the connected components on the page. How much the segments are extended is controlled by the arguments *Ex* and *Ey*. Depending on their value, the returned segments can be lines or paragraphs or something else. The return value is a list of 'CCs' where each 'CC' represents a found segment. Note that the input image is changed such that each pixel is set to its segment label. Arguments: *Ex*: How much each CC is extended to the left and right before merging. When *-1*, it is set to twice the average size of all CCs. *Ey*: How much each CC is extended to the top and bottom before merging. When *-1*, it is set to twice the average size of all CCs. This will typically segemtn into paragraphs. If you want to segment into lines, set *Ey* to something small like one sixth of the median symbol height. """ self_type = ImageType([ONEBIT]) return_type = ImageList("ccs") args = Args([Int('Ex', default = -1), Int('Ey', default = -1)]) pure_python = True author = "Rene Baston, Karl MacMillan, and Christoph Dalitz" def __call__(self, Ex=-1, Ey=-1): # two helper functions for merging rectangles def find_intersecting_rects(glyphs, index): g = glyphs[index] inter = [] for i in range(len(glyphs)): if i == index: continue if g.intersects(glyphs[i]): inter.append(i) return inter def list_union_rects(big_rects): current = 0 rects = big_rects while(1): inter = find_intersecting_rects(rects, current) if len(inter): g = rects[current] new_rects = [g] for i in range(len(rects)): if i == current: continue if i in inter: g.union(rects[i]) else: new_rects.append(rects[i]) rects = new_rects current = 0 else: current += 1 if(current >= len(rects)): break return rects # the actual plugin from gamera.core import Dim, Rect, Point, Cc from gamera.plugins.image_utilities import union_images page = self.image_copy() ccs = page.cc_analysis() # compute average CC size avg_size = 0.0 for c in ccs: avg_size += c.nrows avg_size += c.ncols avg_size /= (2 * len(ccs)) avg_size = int(avg_size) if Ex == -1: Ex = avg_size*2 if Ey == -1: Ey = avg_size*2 # extend CC bounding boxes big_rects = [] for c in ccs: ul_y = max(0, c.ul_y - Ey) ul_x = max(0, c.ul_x - Ex) lr_y = min(page.lr_y, c.lr_y + Ey) lr_x = min(page.lr_x, c.lr_x + Ex) nrows = lr_y - ul_y + 1 ncols = lr_x - ul_x + 1 big_rects.append(Rect(Point(ul_x, ul_y), Dim(ncols, nrows))) extended_segs = list_union_rects(big_rects) # build new merged CCs tmplist = ccs[:] dellist = [] seg_ccs = [] seg_cc = [] if(len(extended_segs) > 0): label = 1 for seg in extended_segs: label += 1 for cc in tmplist: if(seg.intersects(cc)): # mark original image with segment label self.highlight(cc, label) seg_cc.append(cc) dellist.append(cc) if len(seg_cc) == 0: continue seg_rect = seg_cc[0].union_rects(seg_cc) new_seg = Cc(self, label, seg_rect.ul, seg_rect.lr) seg_cc = [] for item in dellist: tmplist.remove(item) dellist = [] seg_ccs.append(new_seg) return seg_ccs __call__ = staticmethod(__call__) class sub_cc_analysis(PluginFunction): """ Further subsegments the result of a page segmentation algorithm into groups of actual connected components. The result of a page segmenattion plugin is a list of 'CCs' where each 'CC' does not represent a 'connected component', but a page segment (typically a line of text). In a practical OCR application you will however need the actual connected components (which should roughly corresond to the glyphs) in groups of lines. That is what this plugin is meant for. The input image must be an image that has been processed with a page segmentation plugin, i.e. all pixels in the image must be labeled with a segment label. The input parameter *cclist* is the list of segments returned by the page segmentation algorithm. The return value is a tuple with two entries: - a new image with all pixels labeled according to the new CCs - a list of ImageLists, each list containing all connected components belonging to the same page segments .. note:: The groups will be returned in the same order as given in *cclist*. This means that you can sort the page segments by reading order before passing them to *sub_cc_analysis*. Note that the order of the returned CCs within each group is not well defined. Hence you will generally need to sort each subgroup by reading order. """ self_type = ImageType([ONEBIT]) return_type = Class("img_ccs", tuple) args = Args([ImageList('cclist')]) author = "Stephan Ruloff and Christoph Dalitz" class textline_reading_order(PluginFunction): """ Sorts a list of Images (CCs) representing textlines by reading order and returns the sorted list. Incidentally, this will not only work on textlines, but also on paragraphs, but *not* on actual Connected Components. The algorithm sorts all lines in topological order, based on the following criteria for the pairwise order of two lines: - line *a* comes before line *b* when *a* is totally to the left of *b* (order \"column before row\") - line *a* comes before *b* when both overlap horizontally and *a* is above *b* (order within a column) In the reference `\"High Performance Document Analysis\"`__ by T.M. Breuel (Symposium on Document Image Understanding, USA, pp. 209-218, 2003), an additional constraint is made for the first criterion by demanding that no other segment may be between *a* and *b* that opverlaps horizontally with both. This constraint for taking multi column headings that interrupt columns into account is replaced in this implementation with an a priori sort of all textlines by *y*-position. This results in a preference of rows over columns (in case of ambiguity) in the depth-first-search utilized in the topological sorting. .. __: http://pubs.iupr.org/DATA/2003-breuel-sdiut.pdf As this function is not an image method, but a free function, it is not automatically imported with all plugins and you must import it explicitly with .. code:: Python from gamera.plugins.pagesegmentation import textline_reading_order """ self_type = None return_type = ImageList("orderedccs") args = Args([ImageList("lineccs")]) pure_python = True author = "Christoph Dalitz" def __call__(lineccs): # utilities for Gamera's graph API from gamera import graph from gamera import graph_util class SegForGraph: def __init__(self,seg): self.segment = seg self.label = 0 # # build directed graph of all lines # G = graph.Graph(graph.FLAG_DAG) seg_data = [SegForGraph(s) for s in lineccs] # sort by y-position for row over column preference in ambiguities seg_data.sort(lambda s,t: s.segment.offset_y - t.segment.offset_y) G.add_nodes(seg_data) for s in seg_data: for t in seg_data: if s.segment.offset_x <= t.segment.offset_x + t.segment.ncols and \ s.segment.offset_x + s.segment.ncols >= t.segment.offset_x: if s.segment.offset_y < t.segment.offset_y: G.add_edge(s,t) elif s.segment.offset_x < t.segment.offset_x: G.add_edge(s,t) # # compute topoligical sorting by depth-first-search # segs_sorted = [] # topologically sorted list def dfs_visit(node): node.data.label = 1 for nextnode in node.nodes: if nextnode.data.label == 0: dfs_visit(nextnode) segs_sorted.append(node.data.segment) for node in G.get_nodes(): if node.data.label == 0: dfs_visit(node) segs_sorted.reverse() # correct that we always appended to the back return segs_sorted __call__ = staticmethod(__call__) class segmentation_error(PluginFunction): """Compares a ground truth segmentation *Gseg* with a segmentation *Sseg* and returns error count numbers. The input images must be given in such a way that each segment is uniquely labeled, similar to the output of a page segmentation algorithm like `runlength_smearing`_. For ground truth data, such a labeled image can be obtained from an external color image with `colors_to_labels`_. .. _`runlength_smearing`: #runlength-smearing .. _`colors_to_labels`: color.html#colors-to-labels The two segmentations are compared by building equivalence classes of overlapping segments as described in M. Thulke, V. Margner, A. Dengel: *A general approach to quality evaluation of document segmentation results.* Lecture Notes in Computer Science 1655, pp. 43-57 (1999) Each class is assigned an error type depending on how many ground truth and test segments it contains. The return value is a tuple (*n1,n2,n3,n4,n5,n6)* where each value is the total number of classes with the corresponding error type: +------+-----------------------+---------------+----------------------+ | Nr | Ground truth segments | Test segments | Error type | +======+=======================+===============+======================+ | *n1* | 1 | 1 | correct | +------+-----------------------+---------------+----------------------+ | *n2* | 1 | 0 | missed segment | +------+-----------------------+---------------+----------------------+ | *n3* | 0 | 1 | false positive | +------+-----------------------+---------------+----------------------+ | *n4* | 1 | > 1 | split | +------+-----------------------+---------------+----------------------+ | *n5* | > 1 | 1 | merge | +------+-----------------------+---------------+----------------------+ | *n6* | > 1 | > 1 | splits and merges | +------+-----------------------+---------------+----------------------+ The total segmentation error can be computed from these numbers as *1 - n1 / (n1 + n2 + n3 + n4 + n5 + n6)*. The individual numbers can be of use to determine what exactly is wrong with the segmentation. As this function is not an image method, but a free function, it is not automatically imported with all plugins and you must import it explicitly with .. code:: Python from gamera.plugins.pagesegmentation import segmentation_error """ self_type = None args = Args([ImageType([ONEBIT], 'Gseg'), \ ImageType([ONEBIT], 'Sseg')]) return_type = IntVector("errors", length=6) author = "Christoph Dalitz" # module declaration class PageSegmentationModule(PluginModule): cpp_headers = ["pagesegmentation.hpp"] cpp_namespace = ["Gamera"] category = "PageSegmentation" functions = [projection_cutting, runlength_smearing, bbox_merging, \ sub_cc_analysis, textline_reading_order, \ segmentation_error] module = PageSegmentationModule() # create an instance of the module # free function instances textline_reading_order = textline_reading_order() segmentation_error = segmentation_error() gamera-3.3.3/gamera/plugins/pil_io.py0000644000076500000000000001062411652050142016503 0ustar chriswheel# # Copyright (C) 2005 Alex Cobb # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """Data transfer between Gamera and the Python Imaging Library. """ from gamera.plugin import * from gamera import config try: import Image as PIL except ImportError: try: verbose = config.get("verbosity_level") except: verbose = 0 if verbose: print ('Info: Python Imaging Library module Image ' 'could not be imported') else: _modes = {RGB : 'RGB', GREYSCALE : 'L'} _inverse_modes = {'RGB': RGB, 'L' : GREYSCALE} ## also boolean mode '1' --- I think this is 8 bits per pixel class from_pil(PluginFunction): """ Instantiates a Gamera image from a Python Imaging Library image *image*. Only RGB or 8-bit greyscale mode PIL images are supported. Requires a copying operation; may fail for very large images. This can, e.g., be used to read images from file formats not directly supported by gamera, as JPEG images: .. code:: Python # Beware: name "Image" is already used in Gamera! import Image as Pil from pil_io import # read a JPEG image and convert it to a Gamera image pilimg = Pil.open("image.jpg") img = from_pil(pilimg) """ self_type = None return_type = ImageType([GREYSCALE, RGB, FLOAT]) args = Args([Class("image")]) pure_python = True def __call__(image, offset=None): from gamera.plugins import _string_io from gamera.core import Dim, Point typecode = image.mode if offset is None: offset = Point(0, 0) if _inverse_modes.has_key(typecode): pixel_type = _inverse_modes[typecode] else: raise ValueError("Only RGB and 8-bit Greyscale 'L' PIL image modes are supported.") return _string_io._from_raw_string( offset, Dim(image.size[0], image.size[1]), pixel_type, DENSE, image.tostring()) __call__ = staticmethod(__call__) class to_pil(PluginFunction): """ Returns a Python Imaging Library image containing a copy of image's data. Only RGB and Greyscale images are supported. May fail for very large images. """ self_type = ImageType([RGB, GREYSCALE]) return_type = Class("pil_image") def __call__(image): from gamera.plugins import _string_io pixel_type = image.data.pixel_type if _modes.has_key(pixel_type): mode = _modes[pixel_type] else: raise ValueError("Only RGB and GREYSCALE Images are supported.") size = (image.ncols, image.nrows) return PIL.fromstring(mode, size, _string_io._to_raw_string(image)) __call__ = staticmethod(__call__) def __doc_example1__(images): image = images[RGB] array = image.to_pil() image0 = from_pil(array) return [image, image0] def __doc_example2__(images): image = images[GREYSCALE] array = image.to_pil() image0 = from_pil(array) return [image, image0] doc_examples = [__doc_example1__, __doc_example2__] class PilIOModule(PluginModule): category = "ExternalLibraries/PIL" author = "Alex Cobb" functions = [from_pil, to_pil] pure_python = True url = ('http://www.oeb.harvard.edu/faculty/holbrook/' 'people/alex/Website/alex.htm') module = PilIOModule() from_pil = from_pil() gamera-3.3.3/gamera/plugins/png_support.py0000644000076500000000000001102211652050142017601 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # Most important problem with this module: Where do we find libpng? # # Linux: # We always assume libpng was installed in a default place (/usr or /usr/local) # # Mac OS-X: # We look for png.h in Fink (/sw/include/png.h) and then # /usr/include. If it's not there, we use the local copy of libpng # # MS-Windows: # We always use the local copy of libpng from gamera.plugin import * class PNG_info(PluginFunction): """ Returns an ``ImageInfo`` object describing a PNG file. *image_file_name* A PNG image filename """ self_type = None args = Args([String("image_file_name")]) return_type = ImageInfo("PNG_info") class load_PNG(PluginFunction): """ Loads a PNG format image file. *image_file_name* A PNG image filename *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression """ self_type = None args = Args([FileOpen("image_file_name", "", "*.png"), Choice("storage format", ["DENSE", "RLE"])]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB, FLOAT]) def __call__(filename, compression = 0): from gamera.plugins import _png_support return _png_support.load_PNG(filename, compression) __call__ = staticmethod(__call__) exts = ['png'] class save_PNG(PluginFunction): """ Saves the image to a PNG format file. """ self_type = ImageType(ALL) args = Args([FileSave("image_file_name", "image.png", "*.png")]) exts = ['png'] class PngSupportModule(PluginModule): import sys import os.path category = "File" cpp_headers = ["png_support.hpp"] internal_png_dir = "src/libpng-1.2.5/" internal_zlib_dir = "src/zlib-1.2.1/" if sys.platform == 'darwin': found_png = None for p in ["/sw", "/usr", "/usr/local"]: if os.path.exists(os.path.join(p, "include/png.h")): found_png = p break if found_png: cpp_include_dirs = [os.path.join(p, "include")] library_dirs = [os.path.join(p, "lib")] extra_libraries = ["png"] else: cpp_sources = [os.path.join(internal_png_dir, x) for x in ['png.c', 'pngset.c', 'pngget.c', 'pngrutil.c', 'pngtrans.c', 'pngwutil.c', 'pngread.c', 'pngrio.c', 'pngwio.c', 'pngwrite.c', 'pngrtran.c', 'pngwtran.c', 'pngmem.c', 'pngerror.c', 'pngpread.c']] cpp_include_dirs = [internal_png_dir] # zlib, which apparently is included in OS-X 10.3 by default extra_libraries = ["z"] elif sys.platform in ('win32', 'cygwin'): cpp_sources = [os.path.join(internal_png_dir, x) for x in ['png.c', 'pngset.c', 'pngget.c', 'pngrutil.c', 'pngtrans.c', 'pngwutil.c', 'pngread.c', 'pngrio.c', 'pngwio.c', 'pngwrite.c', 'pngrtran.c', 'pngwtran.c', 'pngmem.c', 'pngerror.c', 'pngpread.c',]] cpp_sources.extend([os.path.join(internal_zlib_dir, x) for x in ['adler32.c','compress.c','crc32.c','deflate.c','gzio.c', 'infback.c','inffast.c','inflate.c','inftrees.c','trees.c', 'uncompr.c','zutil.c']]) cpp_include_dirs = [internal_png_dir, "include/zlib-1.2.1"] # extra_libraries = ["z"] else: extra_libraries = ["png"] functions = [save_PNG, PNG_info, load_PNG] author = "Michael Droettboom and Albert Bzreckzo" url = "http://gamera.sourceforge.net/" module = PngSupportModule() PNG_info = PNG_info() load_PNG = load_PNG() gamera-3.3.3/gamera/plugins/projections.py0000644000076500000000000002467511652050142017602 0ustar chriswheel# # # Copyright (C) 2001-2009 Ichiro Fujinaga, Michael Droettboom, # Karl MacMillan, and Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * from gamera.gui import has_gui from gamera import util import _projections from math import pi class projection_rows(PluginFunction): """ Compute the horizontal projections of an image. This computes the number of pixels in each row. """ self_type = ImageType([ONEBIT]) return_type = IntVector() doc_examples = [(ONEBIT,)] class projection_cols(PluginFunction): """ Compute the vertical projections of an image. This computes the number of pixels in each column. """ self_type = ImageType([ONEBIT]) return_type = IntVector() doc_examples = [(ONEBIT,)] class projections(PluginFunction): """ Computes the projections in both the *row*- and *column*- directions. This is returned as a tuple (*rows*, *columns*), where each element is an ``IntVector`` of projections. (Equivalent to ``(image.projections_rows(), image.projections_cols())``). If the GUI is being used, the result is displayed in a window: .. image:: images/projections.png """ self_type = ImageType([ONEBIT]) return_type = Class() pure_python = 1 def __call__(image): rows = _projections.projection_rows(image) cols = _projections.projection_cols(image) gui = has_gui.gui if gui: gui.ShowProjections(rows, cols, image) return (rows, cols) __call__ = staticmethod(__call__) class projection_skewed_cols(PluginFunction): """ Computes all vertical projections of an image skewed by a list of angles. As in rotate_, angles are measured clockwise and in degrees. Thus a rotate followed by a projection_cols would be conceptually the same, albeit considerably slower. This function is overloaded to work both with a single angle and a list of angles as input. In the first case a single projection vector is returned, in the second a list of projections vectors. This is explained in the following example: .. code:: Python # called twice with a single angle as input proj1 = img.projection_skewed_cols(0.5) proj2 = img.projection_skewed_cols(1.0) # the same result with one function call projlist = img.projection_skewed_cols([0.5,1.0]) proj1 = projlist[0] proj2 = projlist[1] Note that unlike rotate_ the image size is not extended. Image regions moved outside the original image size are simply clipped, which restricts this method to small angles. .. _rotate: deformations.html#rotate """ category = "Analysis" self_type = ImageType([ONEBIT]) args = Args([FloatVector("Rotation angles")]) return_type = Class("nested_list") author = "Christoph Dalitz" def __call__(self, angles): if not util.is_sequence(angles): return _projections.projection_skewed_cols(self, [angles])[0] else: return _projections.projection_skewed_cols(self, angles) __call__ = staticmethod(__call__) doc_examples = [(ONEBIT, 15.0)] class projection_skewed_rows(PluginFunction): """ Computes all horizontal projections of an image skewed by a list of angles. For more details and an example see projection_skewed_cols_. Note that unlike rotate_ the image size is not extended. Image regions moved outside the original image size are simply clipped, which restricts this method to small angles. .. _projection_skewed_cols: #projection_skewed_cols """ self_type = ImageType([ONEBIT]) args = Args([FloatVector("Rotation angles")]) return_type = Class("nested_list") author = "Christoph Dalitz" def __call__(self, angles): if not util.is_sequence(angles): return _projections.projection_skewed_rows(self, [angles])[0] else: return _projections.projection_skewed_rows(self, angles) __call__ = staticmethod(__call__) doc_examples = [(ONEBIT, 15.0)] class rotation_angle_projections(PluginFunction): """ Estimates the rotation angle of a document with the aid of skewed projections, as described in section 3.1 of C. Dalitz, G.K. Michalakis, C. Pranzas: 'Optical Recognition of Psaltic Byzantine Chant Notation.' International Journal of Document Analysis and Recognition 11, pp. 143-158 (2008). This method works for a wide range of documents (text, music, forms), but can become slow for large images. This particular implementation can be accelerated by reducing the number of black pixels in the image, eg. by scaling it down, only considering a fraction of the image or by removing 'uninteresting' pixels. Arguments: *minangle*, *maxangle* (optional): angle interval that is searched for the skew angle; default values are -2.5 and +2.5 *accuracy* (optional): error bound for the skew angle estimate; default value is zero When *accuracy* is set to zero, a default value of *180\*0.5/(image.ncols\*pi)* is used, which is only a heuristic formula for little changes in the projection profile. Return Values: *rotation angle*: The rotation angle necessary to deskew the image. Can be used directly as input to rotate_ *accuracy*: Accuracy of the returned angle. .. _rotate: deformations.html#rotate """ category = "Analysis" self_type = ImageType([ONEBIT]) args = Args([Float("minangle", default=-2.5), Float("maxangle", default=2.5), Float("accuracy", default=0.0)]) return_type = FloatVector("rotation_angle_and_accuracy", 2) author = "Christoph Dalitz" pure_python = 1 def __call__(self, minangle = -2.5, maxangle = 2.5, accuracy = 0): # l2norm: compute L2-Norm of derivative of vec def l2norm(vec): var = 0 for i in range(0,len(vec)-1): var += (vec[i] - vec[i+1])**2 return var # some arguments checking if (accuracy == 0): accuracy = 180 * 0.5 / (self.ncols * pi) if (maxangle <= minangle): raise RuntimeError("maxangle %f must be greater than minangle %f\n" \ % (maxangle, minangle)) # # rough guess where the maximum is # necessary because l2norm has many local maxima # roughacc = 0.5 if ((maxangle - minangle)/4.0) < roughacc: # at least five trial points roughacc = (maxangle - minangle) / 4.0 else: roughacc = (maxangle-minangle) / round((maxangle-minangle)/roughacc) angle = [(minangle + x*roughacc) for x in \ range(0,int(round((maxangle - minangle)/roughacc))+1)] alist = [l2norm(x) for x in self.projection_skewed_rows(angle)] # find maximum in list fb = alist[0]; bi = 0 for i in range(1,len(alist)): if alist[i] > fb: fb = alist[i]; bi = i b = angle[bi] # # initialize values for golden section search # if (bi == 0): # maximum on lower iterval end: check neighborhood c = b + 1.5*accuracy; fc = l2norm(self.projection_skewed_rows(c)) if (fc > fb) and (c < angle[bi+1]): a = b; fa = fb; b = c; fb = fc; c = angle[bi+1]; fc = alist[bi+1]; else: raise RuntimeError("maximum found on interval end %f\n" \ % angle[bi]) elif (bi == len(angle)-1): # maximum on upper iterval end: check neighborhood a = b - 1.5*accuracy; fa = l2norm(self.projection_skewed_rows(a)) if (fa > fb) and (a > angle[bi-1]): c = b; fc = fb; b = a; fb = fa; a = angle[bi-1]; fa = alist[bi-1]; else: raise RuntimeError("maximum found on interval end %f\n" \ % angle[bi]) else: # the normal case: maximum somewhere in the middle a = angle[bi-1]; fa = alist[bi-1]; c = angle[bi+1]; fc = alist[bi+1]; # # fine tuning with golden section search # see Press at al: "Numerical Recipes", # Cambridge University Press (1986) # golden = 0.38197 # (3 - sqrt(2)) / 2 x = 500 # dummy value for recognition of first iteration while (c-b > accuracy) or (b-a > accuracy): if (x == 500): # special case first iteration if (fc > fa): x = b + golden * (c - b) else: x = b - golden * (b - a) else: # ordinary situation if (c-b > b-a): x = b + golden * (c - b) else: x = b - golden * (b - a) fx = l2norm(self.projection_skewed_rows(x)) if (x > b): if (fx < fb): c = x; fc = fx else: a = b; fa = fb; b = x; fb = fx; else: if (fx < fb): a = x; fa = fx else: c = b; fc = fb; b = x; fb = fx; return [b, accuracy] __call__ = staticmethod(__call__) class ProjectionsModule(PluginModule): cpp_headers=["projections.hpp"] category = "Analysis" functions = [projection_rows, projection_cols, projections, projection_skewed_rows, projection_skewed_cols, rotation_angle_projections] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = ProjectionsModule() gamera-3.3.3/gamera/plugins/runlength.py0000644000076500000000000001651011652050142017236 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _runlength # New version of functions. Deprecated versions are below. class most_frequent_run(PluginFunction): """ Returns the length of the most frequently occurring run of pixels in the given color and given direction. """ self_type = ImageType([ONEBIT]) args = Args([ChoiceString("color", ["black", "white"]), ChoiceString("direction", ["horizontal", "vertical"])]) return_type = Int() doc_examples = [(ONEBIT, 'black', 'horizontal')] class most_frequent_runs(PluginFunction): """ Returns the lengths of the *n* most frequently occurring runs in the given *color* and *direction*. *n* The number of runlengths to return. If *n* < 0, all runlengths will be returned. The return value is a list of 2-tuples. The first element in the tuple is the run length, and the second element is its frequency. The list is sorted by descending frequency. """ self_type = ImageType([ONEBIT]) args = Args([Int("n"), ChoiceString("color", ["black", "white"]), ChoiceString("direction", ["horizontal", "vertical"])]) return_type = Class() author = "Michael Droettboom, after an idea by Christoph Dalitz" def __call__(image, n = -1, color = 'black', direction = 'horizontal'): return _runlength.most_frequent_runs(image, n, color, direction) __call__ = staticmethod(__call__) doc_examples = [(ONEBIT, 5, 'black', 'horizontal')] class run_histogram(PluginFunction): """ Returns the histogram of runlengths in the given *color* and *direction*. *return_value* The return value is an integer array. Each index in the array corresponds to a particular run length, and the value at that index is the number of times that that run length occurs in the image. """ self_type = ImageType([ONEBIT]) args = Args([ChoiceString("color", ["black", "white"]), ChoiceString("direction", ["horizontal", "vertical"])]) return_type = IntVector() doc_examples = [(ONEBIT, 'black', 'horizontal')] class FilterRuns(PluginFunction): self_type = ImageType([ONEBIT]) args = Args([Int("length"), ChoiceString("color", ["black", "white"])]) doc_examples = [(ONEBIT, 3, 'black')] class filter_narrow_runs(FilterRuns): """ Removes horizontal runs in the given *color* narrower than a given *length*. """ def __call__(image, length, color = 'black'): return _runlength.filter_narrow_runs(image, length, color) __call__ = staticmethod(__call__) class filter_wide_runs(FilterRuns): """ Removes horizontal runs in the given *color* wider than a given *length*. """ def __call__(image, length, color = 'black'): return _runlength.filter_wide_runs(image, length, color) __call__ = staticmethod(__call__) class filter_tall_runs(FilterRuns): """ Removes vertical runs in the given *color* taller than a given *length*. """ def __call__(image, length, color = 'black'): return _runlength.filter_tall_runs(image, length, color) __call__ = staticmethod(__call__) class filter_short_runs(FilterRuns): """ Removes vertical runs in the given *color* shorter than a given *length*. """ def __call__(image, length, color = 'black'): return _runlength.filter_short_runs(image, length, color) __call__ = staticmethod(__call__) class to_rle(PluginFunction): """ Encodes a string-based run-length encoded version of the image. The numbers alternate between "length of black run" and "length of white run". Runs go left-to-right, top-to-bottom. Runs rollover the right hand edge and continue on the left edge of the next run. To decode an RLE string, use from_rle_. """ self_type = ImageType([ONEBIT]) return_type = String("runs") doc_examples = [(ONEBIT,)] class from_rle(PluginFunction): """ Decodes a string-based run-length encoded version of the image. The numbers alternate between "length of black run" and "length of white run". Runs go left-to-right, top-to-bottom. Runs rollover the right hand edge and continue on the left edge of the next run. To encode an RLE string, use to_rle_.""" self_type = ImageType([ONEBIT]) args = Args(String("runs")) class iterate_runs(PluginFunction): """ Returns nested iterators over the runs in the given *color* and *direction*. Each run is returned as a Rect object. For example, to iterate over all runs: .. code:: Python for row in image.iterate_black_horizontal_runs(): # All the runs in each row for run in row: print run """ self_type = ImageType([ONEBIT]) args = Args([ChoiceString("color", ["black", "white"]), ChoiceString("direction", ["horizontal", "vertical"])]) return_type = Class() ########################################################################### # Deprecated functions. class FrequentRun(PluginFunction): self_type = ImageType([ONEBIT]) return_type = Int() category = "Runlength/Deprecated" pure_python = True class FrequentRuns(PluginFunction): self_type = ImageType([ONEBIT]) args = Args([Int("n", default=-1)]) return_type = Class() author = "Michael Droettboom, after an idea by Christoph Dalitz" category = "Runlength/Deprecated" pure_python = True class RunHistogram(PluginFunction): self_type = ImageType([ONEBIT]) return_type = IntVector() author = "Michael Droettboom" category = "Runlength/Deprecated" pure_python = True class FilterRunsDep(PluginFunction): self_type = ImageType([ONEBIT]) args = Args(Int("size")) category = "Runlength/Deprecated" pure_python = True class RunIterator(PluginFunction): self_type = ImageType([ONEBIT]) return_type = Class("iterator") category = "Runlength/Deprecated" pure_python = True class RunLengthModule(PluginModule): category = "Runlength" cpp_headers=["runlength.hpp"] functions = [most_frequent_run, most_frequent_runs, run_histogram, filter_narrow_runs, filter_wide_runs, filter_short_runs, filter_tall_runs, iterate_runs, to_rle, from_rle] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = RunLengthModule() del FrequentRun del FrequentRuns del RunHistogram del FilterRuns del RunIterator del FilterRunsDep gamera-3.3.3/gamera/plugins/segmentation.py0000644000076500000000000001742511652050142017733 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * from gamera import util import _segmentation class Segmenter(PluginFunction): self_type = ImageType([ONEBIT]) return_type = ImageList("ccs") doc_examples = [(ONEBIT,)] class cc_analysis(Segmenter): """ Performs connected component analysis on the image. This algorithm assumes 8-connected components, meaning any two pixels are considered "connected" if they are adjacent in any direction, including diagonally. The original image will have all of its pixels "labeled" with a number representing each connected component. This is so the connected components can share data with their source image and makes things much more efficient. Returns a list of ccs found in the image. Since all the CC's share the same data with the original image, changing the CC's will affect the original. If you do not want this behavior, use the image_copy_ function on each of the CCs:: ccs = [x.image_copy() for x in ccs] .. _image_copy: utility.html#image-copy """ pass class cc_and_cluster(Segmenter): """ Performs connected component analysis using cc_analysis_ and then clusters the CC's according to their similarity. TODO: We need some more detailed documentation here. """ pure_python = True args = Args([Float('ratio', default = 1.0), Int('distance', default=2)]) return_type = ImageList("ccs") def __call__(image, ratio = 1.0, distance = 2): from gamera import cluster cc = image.cc_analysis() return cluster.cluster(cc, ratio, distance) __call__ = staticmethod(__call__) doc_examples = [(ONEBIT,)] class splitx(Segmenter): """ Splits an image vertically. The split point is determined automatically by finding a valley in the projections near *center*. This function is overloaded to work both with a single value and a list of splitting point candidates as input. """ args = Args([FloatVector("center", default=[0.5])]) doc_examples = [(ONEBIT,)] def __call__(self, center=0.5): if not util.is_sequence(center): return _segmentation.splitx(self, [center]) else: return _segmentation.splitx(self, center) __call__ = staticmethod(__call__) author = "Michael Droettboom, Karl MacMillan and Christoph Dalitz" class splitx_max(Segmenter): """Splits an image vertically. The split point is determined automatically by finding a peak in the projections near *center*. This function is overloaded to work both with a single value and a list of splitting point canidates as input. """ args = Args([FloatVector("center", default=[0.5])]) def __call__(self, center=0.5): if not util.is_sequence(center): return _segmentation.splitx_max(self, [center]) else: return _segmentation.splitx_max(self, center) __call__ = staticmethod(__call__) author = "Michael Droettboom, Karl MacMillan and Christoph Dalitz" class splity(Segmenter): """ Splits an image horizontally. The split point is determined automatically by finding a valley in the projections near *center*. This function is overloaded to work both with a single value and a list of splitting point canidates as input. """ args = Args([FloatVector("center", default=[0.5])]) def __call__(self, center=[0.5]): if not util.is_sequence(center): return _segmentation.splity(self, [center]) else: return _segmentation.splity(self, center) __call__ = staticmethod(__call__) author = "Michael Droettboom, Karl MacMillan and Christoph Dalitz" class splitx_base(Segmenter): pure_python = True return_type = ImageList("splits") class splitx_left(splitx_base): """ Splits an image vertically. The split point is determined automatically by finding a valley in the projections near the left of the image. """ _center = 0.25 def __call__(self): return self.splitx(0.25) __call__ = staticmethod(__call__) class splitx_right(splitx_base): """ Splits an image vertically. The split point is determined automatically by finding a valley in the projections near the right of the image. """ _center = 0.75 def __call__(self): return self.splitx(0.75) __call__ = staticmethod(__call__) class splity_base(Segmenter): pure_python = True return_type = ImageList("splits") class splity_top(splity_base): """ Splits an image horizontally. The split point is determined automatically by finding a valley in the projections near the top of the image. """ _center = 0.25 def __call__(self): return self.splity(0.25) __call__ = staticmethod(__call__) class splity_bottom(splity_base): """ Splits an image horizontally. The split point is determined automatically by finding a valley in the projections near the bottom of the image. """ _center = 0.75 def __call__(self): return self.splity(0.75) __call__ = staticmethod(__call__) # connected-component filters def filter_wide(ccs, max_width): tmp = [] for x in ccs: if x.ncols > max_width: x.fill_white() else: tmp.append(x) return tmp def filter_narrow(ccs, min_width): tmp = [] for x in ccs: if x.ncols < min_width: x.fill_white() else: tmp.append(x) return tmp def filter_tall(ccs, max_height): tmp = [] for x in ccs: if x.nrows > max_height: x.fill_white() else: tmp.append(x) return tmp def filter_short(ccs, min_height): tmp = [] for x in ccs: if x.nrows < min_height: x.fill_white() else: tmp.append(x) return tmp def filter_small(ccs, min_size): tmp = [] for x in ccs: if x.nrows < min_size or x.ncols < min_size: x.fill_white() else: tmp.append(x) return tmp def filter_large(ccs, max_size): tmp = [] for x in ccs: if x.nrows > max_size or x.ncols > max_size: x.fill_white() else: tmp.append(x) return tmp def filter_black_area_small(ccs, min_size): tmp = [] for x in ccs: if x.black_area()[0] < min_size: x.fill_white() else: tmp.append(x) return tmp def filter_black_area_large(ccs, max_size): tmp = [] for x in ccs: if x.black_area()[0] > max_size: x.fill_white() else: tmp.append(x) return tmp class SegmentationModule(PluginModule): category = "Segmentation" cpp_headers=["segmentation.hpp"] functions = [cc_analysis, cc_and_cluster, splitx, splity, splitx_left, splitx_right, splity_top, splity_bottom, splitx_max] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = SegmentationModule() del Segmenter del splitx_base del splity_base gamera-3.3.3/gamera/plugins/string_io.py0000644000076500000000000000450711652050142017230 0ustar chriswheel# # Copyright (C) 2005 Alex Cobb # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """Transfer of Gamera image data in Python strings. """ from gamera.plugin import * class _to_raw_string(PluginFunction): """ Returns the image's binary data as a Python string. Requires a copying operation; may fail for very large images. This function is not intended to be used directly. To move data to/from Numeric/numarray/PIL, use the functions in numeric_io.py, numarray_io.py and pil_io.py respectively. """ self_type = ImageType(ALL) return_type = Class("string_from_image") class _from_raw_string(PluginFunction): """ Instantiates an image from binary data in a Python string. Requires a copying operation; may fail for very large images. This function is not intended to be used directly. To move data to/from Numeric/numarray/PIL, use the functions in numeric_io.py, numarray_io.py and pil_io.py respectively. """ self_type = None ## Image constructor uses: ## page_offset_y, page_offset_x, ## nrows, ncols, pixel_format=0, storage_type=0, ## so we'll do something similar: args = Args([Point("offset"), Dim("dim"), Int("pixel_type"), Int("storage_type"), Class("data_string")]) return_type = ImageType(ALL) class StringIOModule(PluginModule): category = "ExternalLibraries" cpp_headers=["string_io.hpp"] functions = [_to_raw_string, _from_raw_string] author = "Alex Cobb" url = ('http://www.oeb.harvard.edu/faculty/holbrook/' 'people/alex/Website/alex.htm') module = StringIOModule() _from_raw_string = _from_raw_string() gamera-3.3.3/gamera/plugins/structural.py0000644000076500000000000001137411652050142017443 0ustar chriswheel# # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """The relational module contains plugins for computing the relationships between glyphs.""" from gamera.plugin import * class bounding_box_grouping_function(PluginFunction): """ Given two rectangles *a*, *b*, and a given *threshold* distance (in pixels), returns ``True`` if the two rectangles are closer than *threshold*. """ self_type = None args = Args([Rect("a"), Rect("b"), Int("threshold")]) return_type = Check("connected") class shaped_grouping_function(PluginFunction): """ Given two connected components *a*, *b*, and a given *threshold* distance (in pixels), returns ``True`` if any pixel in *a* are closer than *threshold* to any pixel in *b*. """ self_type = None args = Args([ImageType(ONEBIT, "a"), ImageType(ONEBIT, "b"), Int("threshold")]) return_type = Check("connected") class polar_distance(PluginFunction): """ Returns a tuple containing the normalized distance, polar direction, and non-normalized polar distance to another glyph (based on center of bounding boxes). """ self_type = ImageType(ALL) return_type = FloatVector("polar") args = Args([ImageType(ALL, "other")]) class polar_match(PluginFunction): self_type = None return_type = Int("check") args = Args([Float('r1'), Float('q1'), Float('r2'), Float('q2')]) class least_squares_fit(PluginFunction): """ Performs a least squares fit on a given list of points. The result is a tuple of the form (*m*, *b*, *q*) where *m* is the slope of the line, *b* is the *y*-offset, and *q* is the gamma fit of the line to the points. (This assumes the same statistical significance for all points. See Numerical Recipes in C, section 15.2__ for more information. .. __: http://www.library.cornell.edu/nr/bookcpdf/c15-2.pdf """ self_type = None return_type = Class("a_b_q") args = Args([PointVector("points")]) class least_squares_fit_xy(PluginFunction): """ Identical to *least_squares_fit* for line angles below 45 degrees. For lines with a more vertical slope a least square fit of *x = my + b* is done instead. The result is a tuple of the form (*m*, *b*, *q*, *x_of_y*) where *m, b, q* are the same as in *least_squares_fit*, but the integer value *x_of_y* determines the actual meaning of the parameters *m* and *b*: When *x_of_y* is zero, *y = mx + b*. Otherwise *x = my + b*. """ self_type = None return_type = Class("a_b_q_xofy") args = Args([PointVector("points")]) author = "Christoph Dalitz" class edit_distance(PluginFunction): """ Computes the edit distance (also known as *Levenshtein distance*) between two strings. This counts the number of character substitutions, additions and deletions necessary to transform one string into another. This plugin is a straightforward implementation of the classic algorithm by Wagner and Fischer, which has runtime complexity *O(m*n)*, where *m* and *n* are the lengths of the two strings. See R.A. Wagner, M.J. Fischer: *The String-to-String Correction Problem.* Journal of the ACM 21, pp. 168-173, 1974. """ self_type = None args = Args([String("s1"), String("s2")]) return_type = Int("distance") author = "Christoph Dalitz" class RelationalModule(PluginModule): cpp_headers = ["structural.hpp"] category = "Relational" functions = [polar_distance, polar_match, bounding_box_grouping_function, shaped_grouping_function, least_squares_fit, least_squares_fit_xy, edit_distance] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = RelationalModule() bounding_box_grouping_function = bounding_box_grouping_function() shaped_grouping_function = shaped_grouping_function() least_squares_fit = least_squares_fit() least_squares_fit_xy = least_squares_fit_xy() edit_distance = edit_distance() gamera-3.3.3/gamera/plugins/thinning.py0000644000076500000000000001053111652050142017043 0ustar chriswheel# -*- coding: utf-8 -*- # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _thinning class Thinning(PluginFunction): self_type = ImageType([ONEBIT]) return_type = ImageType([ONEBIT]) doc_examples = [(ONEBIT,)] class thin_zs(Thinning): """ Thins (skeletonizes) a ONEBIT image using the Zhang and Suen algorithm. The resulting skeleton is not a medial axis transformation, and the ends of the skeleton will not extend to the edges of the original image. T. Y. Zhang and C. Y. Suen. 1984. A Fast Parallel Algorithm for Thinning Digital Patterns., *Communications of ACM*, 2(3). R. C. Gonzalez and P. Wintz. 1987 *Digital Image Processing.*, 2. edition. 398-402. """ pass class thin_hs(Thinning): """ Derives the medial axis transformation from a ONEBIT image using the Haralick and Shapiro algorithm. Unlike thin_zs_ and thin_lc_, this function performs a medial axis transformation, and the ends of the skeleton extend to the corners of the original image. Consider using thin_hs_large_image_ instead, for faster performance on large images with a lot of connected components. R. M. Haralick and L. G. Shapiro. 1992. *Computer and Robot Vision*, Vol. 1, Chapter 5 (especially 5.10.1). Reading, MA: Addison-Wesley. """ pass class medial_axis_transform_hs(Thinning): """"This function is an alias for thin_hs_.""" pure_python = True def __call__(self): return _thinning.thin_hs(self) class thin_hs_large_image(Thinning): """ Thins (skeletonizes) a ONEBIT image using the Haralick and Shapiro algorithm. Unlike thin_hs_, this algorithm performs skeletonization on one connected component at a time. On large images with a lot of connected components, this can be significantly faster. However, for small images with a single connected component, this has unnecessary overhead, which is why both versions are included. Please note cc_analysis results in a labelled image, which you can reset afterwards with reset_onebit_image(). """ pure_python = True def __call__(self): copy = self.image_copy() ccs = copy.cc_analysis() for cc in ccs: thin_cc = cc.thin_hs() cc.and_image(thin_cc, in_place=True) return copy __call__ = staticmethod(__call__) class medial_axis_transform_large_image_hs(Thinning): """ This function is an alias for thin_hs_large_image_. """ pure_python = True def __call__(self): return thin_hs_large_image()(self) class thin_lc(Thinning): """ Thins (skeletonizes) a ONEBIT image using the Lee and Chen algorithm. This function is a simple extension to the Zhang and Suen algorithm in thin_zs_ that ensure that no two pixels are more than 4-connected. The resulting skeleton is not a medial axis transformation, and the ends of the skeleton will not extend to the edges of the original image. H.-J. Lee and B. Chen. 1992. Recognition of handwritten chinese characters via short line segments. *Pattern Recognition*. 25(5) 543-552. """ pass class ThinningModule(PluginModule): category = "Thinning" functions = [thin_zs, thin_hs, medial_axis_transform_hs, thin_hs_large_image, medial_axis_transform_large_image_hs, thin_lc] cpp_headers = ["thinning.hpp"] author = u"Michael Droettboom and Karl MacMillan (based on code by \u00d8ivind Due Trier and Qian Huang)" url = "http://gamera.sourceforge.net/" module = ThinningModule() del Thinning gamera-3.3.3/gamera/plugins/threshold.py0000644000076500000000000002161611652050142017227 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 4 -*- # vim: set tabstop=4 shiftwidth=4 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # 2007-2010 Christoph Dalitz and Uma Kompella # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import _threshold class threshold(PluginFunction): """ Creates a binary image by splitting along a given global threshold value. Pixels that are greater than the given value become white. Pixels less than the given value become black. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression. """ self_type = ImageType([GREYSCALE, GREY16, FLOAT]) args = Args([Int("threshold"), Choice("storage format", ['dense', 'rle'])]) return_type = ImageType([ONEBIT], "output") doc_examples = [(GREYSCALE, 128)] def __call__(image, threshold, storage_format = 0): return _threshold.threshold(image, threshold, storage_format) __call__ = staticmethod(__call__) class otsu_find_threshold(PluginFunction): """ Finds a threshold point using the Otsu algorithm. Reference: N. Otsu: *A Threshold Selection Method from Grey-Level Histograms.* IEEE Transactions on Systems, Man, and Cybernetics (9), pp. 62-66 (1979) """ self_type = ImageType([GREYSCALE]) return_type = Int("threshold_point") doc_examples = [(GREYSCALE,)] class otsu_threshold(PluginFunction): """ Creates a binary image by splitting along a threshold value determined using the Otsu algorithm. Equivalent to ``image.threshold(image.otsu_find_threshold())``. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression """ self_type = ImageType([GREYSCALE]) args = Args(Choice("storage format", ['dense', 'rle'])) return_type = ImageType([ONEBIT], "output") doc_examples = [(GREYSCALE,)] def __call__(image, storage_format = 0): return _threshold.otsu_threshold(image, storage_format) __call__ = staticmethod(__call__) class tsai_moment_preserving_find_threshold(PluginFunction): """ Finds a threshold point using the Tsai Moment Preserving threshold algorithm. Reference: W.H. Tsai: *Moment-Preserving Thresholding: A New Approach.* Computer Vision Graphics and Image Processing (29), pp. 377-393 (1985) """ self_type = ImageType([GREYSCALE]) return_type = Int("threshold_point") doc_examples = [(GREYSCALE,)] author = "Uma Kompella" class tsai_moment_preserving_threshold(PluginFunction): """ Creates a binary image by splitting along a threshold value determined using the Tsai Moment Preserving Threshold algorithm. Equivalent to ``image.threshold(image.tsai_moment_preserving_find_threshold())``. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression """ self_type = ImageType([GREYSCALE]) args = Args(Choice("storage format", ['dense', 'rle'])) return_type = ImageType([ONEBIT], "output") doc_examples = [(GREYSCALE,)] author = "Uma Kompella" def __call__(image, storage_format = 0): return _threshold.tsai_moment_preserving_threshold(image, storage_format) __call__ = staticmethod(__call__) class abutaleb_threshold(PluginFunction): """ Creates a binary image by using the Abutaleb locally-adaptive thresholding algorithm. *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression """ self_type = ImageType([GREYSCALE]) args = Args(Choice("storage format", ['dense', 'rle'])) return_type = ImageType([ONEBIT], "output") doc_examples = [(GREYSCALE,)] def __call__(image, storage_format = 0): return _threshold.abutaleb_threshold(image, storage_format) __call__ = staticmethod(__call__) class bernsen_threshold(PluginFunction): """ Creates a binary image by using the Bernsen algorithm. Each point is thresholded by the mean between the maximum and minimum value in the surrounding region of size *region_size*. When the difference between maximum and minimum is below *contrast_limit* the pixel is set to black in case of *doubt_to_black* = ``True``, otherwise to white. Reference: J. Bernsen: *Dynamic thresholding of grey-level images.* Proc. 8th International Conference on Pattern Recognition (ICPR8), pp. 1251-1255, 1986. *storage_format* specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression *region_size* The size of each region in which to calculate a threshold *contrast_limit* The minimum amount of contrast required to threshold. *doubt_to_black* When ``True``, 'doubtful' values are set to black, otherwise to white. """ self_type = ImageType([GREYSCALE]) args = Args([Choice("storage format", ['dense', 'rle']), Int("region size", range=(1, 50), default=11), Int("contrast limit", range=(0, 255), default=80), Check("doubt_to_black", default=False)]) return_type = ImageType([ONEBIT], "output") doc_examples = [(GREYSCALE,)] def __call__(image, storage_format = 0, region_size = 11, contrast_limit = 80, doubt_to_black = False): return _threshold.bernsen_threshold(image, storage_format, region_size, contrast_limit, doubt_to_black) __call__ = staticmethod(__call__) class djvu_threshold(PluginFunction): """ Creates a binary image by using the DjVu thresholding algorithm. See Section 5.1 in: Bottou, L., P. Haffner, P. G. Howard, P. Simard, Y. Bengio and Y. LeCun. 1998. High Quality Document Image Compression with DjVu. AT&T Labs, Lincroft, NJ. http://research.microsoft.com/~patrice/PDF/jei.pdf This implementation features an additional extension to the algorithm described above. Once the background and foreground colors are determined for each block, the image is thresholded by interpolating the foreground and background colors between the blocks. This prevents "blockiness" along boundaries of strong color change. *smoothness* The amount of effect that parent blocks have on their children blocks. Higher values will result in more smoothness between blocks. Expressed as a percentage between 0.0 and 1.0. *max_block_size* The size of the largest block to determine a threshold. *min_block_size* The size of the smallest block to determine a threshold. *block_factor* The number of child blocks (in each direction) per parent block. For instance, a *block_factor* of 2 results in 4 children per parent. """ self_type = ImageType([RGB]) args = Args([Float("smoothness", default=0.2, range=(0.0, 1.0)), Int("max_block_size", default=512), Int("min_block_size", default=64), Int("block_factor", default=2, range=(1, 8))]) return_type = ImageType([ONEBIT], "output") def __call__(image, smoothness=0.2, max_block_size=512, min_block_size=64, block_factor=2): return _threshold.djvu_threshold(image, smoothness, max_block_size, min_block_size, block_factor) __call__ = staticmethod(__call__) doc_examples = [(RGB, 0.5, 512, 64, 2)] class ThresholdModule(PluginModule): """ This module provides functions that convert images between different pixel types. """ category = "Binarization" cpp_headers = ["threshold.hpp"] functions = [threshold, otsu_find_threshold, otsu_threshold, tsai_moment_preserving_find_threshold, tsai_moment_preserving_threshold, abutaleb_threshold, bernsen_threshold, djvu_threshold] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = ThresholdModule() gamera-3.3.3/gamera/plugins/tiff_support.py0000644000076500000000000000630411652050142017754 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.plugin import * import sys import glob import _tiff_support class tiff_info(PluginFunction): """ Returns an ``ImageInfo`` object describing a TIFF file. *image_file_name* A TIFF image filename""" self_type = None args = Args([String("image_file_name")]) return_type = ImageInfo("tiff_info") class load_tiff(PluginFunction): """ Loads a TIFF file from disk. *image_file_name* A TIFF image filename *storage_format* (optional) specifies the compression type for the result: DENSE (0) no compression RLE (1) run-length encoding compression """ self_type = None args = Args([FileOpen("image_file_name", "", "*.tiff;*.tif"), Choice("storage format", ["DENSE", "RLE"])]) return_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB, FLOAT]) def __call__(filename, compression = 0): return _tiff_support.load_tiff(filename, compression) __call__ = staticmethod(__call__) exts = ["tiff", "tif"] load_tiff_class = load_tiff load_tiff = load_tiff() class save_tiff(PluginFunction): """ Saves an image to disk in TIFF format. *image_file_name* A TIFF image filename """ self_type = ImageType([ONEBIT, GREYSCALE, GREY16, RGB]) args = Args([FileSave("image_file_name", "image.tiff", "*.tiff;*.tif")]) return_type = None exts = ["tiff", "tif"] class TiffSupportModule(PluginModule): category = "File" cpp_headers = ["tiff_support.hpp"] if sys.platform == 'win32': cpp_sources = glob.glob("src/libtiff/*.c") try: cpp_sources.remove("src/libtiff\\tif_unix.c") except: pass extra_compile_args = ['-Dunix'] elif sys.platform == 'cygwin': cpp_sources = glob.glob("src/libtiff/*.c") try: cpp_sources.remove("src/libtiff/tif_win32.c") except: pass extra_compile_args = ['-Dunix'] elif sys.platform == 'darwin': cpp_sources = glob.glob("src/libtiff/*.c") try: cpp_sources.remove("src/libtiff/tif_win32.c") except: pass extra_compile_args = ['-Dunix'] else: extra_libraries = ["tiff"] functions = [tiff_info, load_tiff_class, save_tiff] cpp_include_dirs = ["src/libtiff"] author = "Michael Droettboom and Karl MacMillan" url = "http://gamera.sourceforge.net/" module = TiffSupportModule() tiff_info = tiff_info() gamera-3.3.3/gamera/plugins/transformation.py0000644000076500000000000001255411652050142020302 0ustar chriswheel# # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan # 2010 Christoph Dalitz # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """The transformation module contains plugins for geometric transformations like rotating or resizing.""" from gamera.plugin import * try: from gamera.core import RGBPixel except: def RGBPixel(*args): pass from gamera.gui import has_gui from gamera.util import warn_deprecated from gamera.args import NoneDefault import sys import _transformation class rotate(PluginFunction): """ Rotates an image. *angle* The angle of rotation (in degrees) *bgcolor* The color to use for pixels outside of the original image bounds. When *bgcolor* is ``None``, white is used. *order* The order of the spline used for interpolation. Must be between 1 - 3. """ category = "Transformation" self_type = ImageType(ALL) return_type = ImageType(ALL) args = Args([Float("angle"), Pixel("bgcolor", default=NoneDefault), Int("order", range=(1,3), default=1)]) args.list[0].rng = (-180,180) doc_examples = [(RGB, 32.0, RGBPixel(255, 255, 255), 3), (COMPLEX, 15.0, 0.0j, 3)] author = u"Michael Droettboom (With code from VIGRA by Ullrich K\u00f6the)" def __call__(self, angle, bgcolor=None, order=1): if (bgcolor == None): bgcolor = self.white() return _transformation.rotate(self, angle, bgcolor, order) __call__ = staticmethod(__call__) class resize(PluginFunction): """ Returns a resized copy of an image. In addition to size, the type of interpolation can be specified, with a tradeoff between speed and quality. If you need to maintain the aspect ratio of the original image, consider using scale_ instead. *dim* The size of the resulting image. *interp_type* [None|Linear|Spline] The type of interpolation used to resize the image. Each option is progressively higher quality, yet slower. .. _scale: #scale """ category = "Transformation" self_type = ImageType(ALL) args = Args([Dim("dim"), Choice("interp_type", ["None", "Linear", "Spline"])]) return_type = ImageType(ALL) class scale(PluginFunction): """ Returns a scaled copy of the image. In addition to scale, the type of interpolation can be specified, with a tradeoff between speed and quality. If you need to change the aspect ratio of the original image, consider using resize_ instead. *scale* A scaling factor. Values greater than 1 will result in a larger image. Values less than 1 will result in a smaller image. *interp_type* [None|Linear|Spline] The type of interpolation used to resize the image. Each option is progressively higher quality, yet slower. .. _resize: #resize """ category = "Transformation" self_type = ImageType(ALL) args= Args([Real("scaling"), Choice("interp_type", ["None", "Linear", "Spline"])]) return_type = ImageType(ALL) doc_examples = [(RGB, 0.5, 2), (RGB, 2.0, 2)] class shear_row(PluginFunction): """ Shears a given row by a given amount. *row* The row number to shear. *distance* The number of pixels to move the row. Positive values move the row to the right. Negative values move the row to the left. """ category = "Transformation" self_type = ImageType(ALL) args = Args([Int('row'), Int('distance')]) doc_examples = [(ONEBIT, 50, 10)] class shear_column(PluginFunction): """ Shears a given column by a given amount. *column* The column number to shear. *distance* The number of pixels to move the column. Positive values move the column downward. Negative values move the column upward. """ category = "Transformation" self_type = ImageType(ALL) args = Args([Int('column'), Int('distance')]) doc_examples = [(ONEBIT, 50, 10)] class mirror_horizontal(PluginFunction): """ Flips the image across the horizontal (*x*) axis. """ category = "Transformation" self_type = ImageType(ALL) doc_examples = [(RGB,)] class mirror_vertical(PluginFunction): """ Flips the image across the vertical (*y*) axis. """ category = "Transformation" self_type = ImageType(ALL) doc_examples = [(RGB,)] class TransformationModule(PluginModule): cpp_headers=["transformation.hpp"] category = "Transformation" functions = [rotate, resize, scale, shear_row, shear_column, mirror_horizontal, mirror_vertical] author = "Michael Droettboom, Karl MacMillan, and Christoph Dalitz" url = "http://gamera.sourceforge.net/" module = TransformationModule() gamera-3.3.3/gamera/process.py0000644000076500000000000001734211652050143015232 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import os.path, sys, cStringIO from util import Set from dis import dis from inspect import getmodule from types import * from args import * # Finds the member variables that a method accesses and sets def find_method_dependencies(method): buffer = cStringIO.StringIO() stdout = sys.stdout sys.stdout = buffer dis(method) bytecodes = [x.split() for x in buffer.getvalue().split("\n")] sys.stdout = stdout buffer.close() sets = Set() requires = Set() self = 0 for bytecode in bytecodes: if len(bytecode) > 3: if self: if bytecode[1] == "STORE_ATTR": sets.append(bytecode[3][1:-1]) elif bytecode[1] == "LOAD_ATTR": requires.append(bytecode[3][1:-1]) self = 0 elif (len(bytecode) > 3 and bytecode[1] == "LOAD_FAST" and bytecode[2] == "0"): self = 1 requires = filter(lambda x: x not in sets, requires) if sets == [] and requires == []: print ("WARNING: %s appears to have no side effects." "What are you, some kind of functional programmer? ;)" % method.__name__) return sets, requires # Generic base class for high-level processes. # Manages saving/loading of data necessary to perform some/all of a process. class Process: def __init__(self, base_filename, display_only=0): self.base_filename = os.path.splitext(os.path.abspath(base_filename))[0] self.display_only = display_only self.current_step = 0 def get_step_number(self, step, default = 0): if step == None: return default elif type(step) == StringType and step in self.steps: return self.steps.index(step) elif type(step) == IntType and step < len(self.steps): return step raise KeyError("%s does not identify a step in the process." % step) def get_filename(self, extension): # TODO: change so this returns a unique filename return self.base_filename + "." + extension def process(self, first_step=None, last_step=None, save_members=None): first_step = self.get_step_number(first_step) last_step = self.get_step_number(last_step, len(self.steps) - 1) for step in self.steps[first_step:last_step + 1]: if (step[:5] == "DEBUG" and step != self.steps[last_step]): continue self.__do_step(step) if save_members == None: for saveable in self.saveable_members(): if (self.__dict__.has_key(saveable)): self.__save_attr(saveable) else: for save in save_members: self.__save_attr(save) def next(self): if self.current_step >= len(self.steps): return -1 sets, requires = self.do_step(self.current_step) self.__save_attr(sets) self.current_step += 1 def saveable_members(self): return [x[5:] for x in self.__class__.__dict__.keys() if x[:5] == "save_"] def __do_step(self, step): step_no = self.get_step_number(step) function = getattr(self, step) sets, requires = find_method_dependencies(function) for load in requires: if not hasattr(self, load): self.__load_attr(load, step) print "Step %d: %s" % (step_no, step) if not self.display_only: function() return sets, requires def __load_attr(self, load, step="unknown"): if not hasattr(self, "load_" + load): raise RuntimeError("The %s step requires the variable '%s'. " "However, there is no load_%s function defined." % (step, load, load)) else: print "Loading %s" % load if not self.display_only: getattr(self, "load_" + load)() def __save_attr(self, save): if not hasattr(self, save): print ("WARNING: %s is not defined, therefore it can not be saved." % save) if not hasattr(self, "save_" + save): raise RuntimeError("The Gamera process system wants to save %s, " "but there is no save_%s function defined." % (save, save)) else: print "Saving %s" % save if not self.display_only: getattr(self, "save_" + save)() steps = [] class ProcessWizard(Wizard): def __init__(self, shell, locals, process): self.shell = shell self.parent = None self.locals = locals self.process = process self.caption = self.process.__name__ + " process" self.init_args = () self.dlg_select_steps = Args( [Radio("Perform the entire process", "All"), Radio("Perform part of the process", "Custom"), Choice(" Starting step", self.process.steps), Choice(" Ending step", self.process.steps, -1)], # caption=self.caption, function='cb_select_steps', title=('Select which steps of the %s process you would like to perform.' % self.process.__name__)) if hasattr(self, 'dlg_init'): self.show(self.dlg_init) else: self.show(self.dlg_select_steps) def cb_init(self, *args): self.init_args = args return self.dlg_select_steps def cb_select_steps(self, all, custom, start_step, end_step): if all: start_step = 0 end_step = len(self.process.steps) - 1 self.start_step = start_step self.end_step = end_step self.saves = None return None elif custom: if start_step > end_step: end_step, start_step = start_step, end_step self.start_step = start_step self.end_step = end_step saves = Set() for step in range(start_step, end_step + 1): deps = find_method_dependencies( getattr(self.process, self.process.steps[step])) saves.extend(deps[0]) saves.extend(deps[1]) args = [] self.saveables = [] for step in saves: if hasattr(self.process, "save_" + step): args.append(Check("", step, 1)) self.saveables.append(step) self.dlg_select_saves = Args( args, # caption=self.caption, title="Select which members to save.", function="cb_select_saves") return self.dlg_select_saves def cb_select_saves(self, *args): self.saves = [] for x in range(len(args)): if args[x]: self.saves.append(self.saveables[x]) def done(self): self.shell.run("%s.%s%s.process(%s, %s, %s)" % (getmodule(self.process).__name__.split('.')[-1], self.process.__name__, self.init_args, repr(self.process.steps[self.start_step]), repr(self.process.steps[self.end_step]), repr(self.saves))) gamera-3.3.3/gamera/pstat.py0000644000076500000000000011123411216641434014707 0ustar chriswheel# Copyright (c) 1999-2007 Gary Strangman; All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # # Comments and/or additions are welcome (send e-mail to: # strang@nmr.mgh.harvard.edu). # """ pstat.py module ################################################# ####### Written by: Gary Strangman ########### ####### Last modified: Dec 18, 2007 ########### ################################################# This module provides some useful list and array manipulation routines modeled after those found in the |Stat package by Gary Perlman, plus a number of other useful list/file manipulation functions. The list-based functions include: abut (source,*args) simpleabut (source, addon) colex (listoflists,cnums) collapse (listoflists,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None) dm (listoflists,criterion) flat (l) linexand (listoflists,columnlist,valuelist) linexor (listoflists,columnlist,valuelist) linedelimited (inlist,delimiter) lineincols (inlist,colsize) lineincustcols (inlist,colsizes) list2string (inlist) makelol(inlist) makestr(x) printcc (lst,extra=2) printincols (listoflists,colsize) pl (listoflists) printl(listoflists) replace (lst,oldval,newval) recode (inlist,listmap,cols='all') remap (listoflists,criterion) roundlist (inlist,num_digits_to_round_floats_to) sortby(listoflists,sortcols) unique (inlist) duplicates(inlist) writedelimited (listoflists, delimiter, file, writetype='w') Some of these functions have alternate versions which are defined only if Numeric (NumPy) can be imported. These functions are generally named as above, with an 'a' prefix. aabut (source, *args) acolex (a,indices,axis=1) acollapse (a,keepcols,collapsecols,sterr=0,ns=0) adm (a,criterion) alinexand (a,columnlist,valuelist) alinexor (a,columnlist,valuelist) areplace (a,oldval,newval) arecode (a,listmap,col='all') arowcompare (row1, row2) arowsame (row1, row2) asortrows(a,axis=0) aunique(inarray) aduplicates(inarray) Currently, the code is all but completely un-optimized. In many cases, the array versions of functions amount simply to aliases to built-in array functions/methods. Their inclusion here is for function name consistency. """ ## CHANGE LOG: ## ========== ## 07-11-26 ... edited to work with numpy ## 01-11-15 ... changed list2string() to accept a delimiter ## 01-06-29 ... converted exec()'s to eval()'s to make compatible with Py2.1 ## 01-05-31 ... added duplicates() and aduplicates() functions ## 00-12-28 ... license made GPL, docstring and import requirements ## 99-11-01 ... changed version to 0.3 ## 99-08-30 ... removed get, getstrings, put, aget, aput (into io.py) ## 03/27/99 ... added areplace function, made replace fcn recursive ## 12/31/98 ... added writefc function for ouput to fixed column sizes ## 12/07/98 ... fixed import problem (failed on collapse() fcn) ## added __version__ variable (now 0.2) ## 12/05/98 ... updated doc-strings ## added features to collapse() function ## added flat() function for lists ## fixed a broken asortrows() ## 11/16/98 ... fixed minor bug in aput for 1D arrays ## ## 11/08/98 ... fixed aput to output large arrays correctly import stats # required 3rd party module import string, copy from types import * __version__ = 0.4 ###=========================== LIST FUNCTIONS ========================== ### ### Here are the list functions, DEFINED FOR ALL SYSTEMS. ### Array functions (for NumPy-enabled computers) appear below. ### def abut (source,*args): """ Like the |Stat abut command. It concatenates two lists side-by-side and returns the result. '2D' lists are also accomodated for either argument (source or addon). CAUTION: If one list is shorter, it will be repeated until it is as long as the longest list. If this behavior is not desired, use pstat.simpleabut(). Usage: abut(source, args) where args=any # of lists Returns: a list of lists as long as the LONGEST list past, source on the 'left', lists in attached consecutively on the 'right' """ if type(source) not in [ListType,TupleType]: source = [source] for addon in args: if type(addon) not in [ListType,TupleType]: addon = [addon] if len(addon) < len(source): # is source list longer? if len(source) % len(addon) == 0: # are they integer multiples? repeats = len(source)/len(addon) # repeat addon n times origadd = copy.deepcopy(addon) for i in range(repeats-1): addon = addon + origadd else: repeats = len(source)/len(addon)+1 # repeat addon x times, origadd = copy.deepcopy(addon) # x is NOT an integer for i in range(repeats-1): addon = addon + origadd addon = addon[0:len(source)] elif len(source) < len(addon): # is addon list longer? if len(addon) % len(source) == 0: # are they integer multiples? repeats = len(addon)/len(source) # repeat source n times origsour = copy.deepcopy(source) for i in range(repeats-1): source = source + origsour else: repeats = len(addon)/len(source)+1 # repeat source x times, origsour = copy.deepcopy(source) # x is NOT an integer for i in range(repeats-1): source = source + origsour source = source[0:len(addon)] source = simpleabut(source,addon) return source def simpleabut (source, addon): """ Concatenates two lists as columns and returns the result. '2D' lists are also accomodated for either argument (source or addon). This DOES NOT repeat either list to make the 2 lists of equal length. Beware of list pairs with different lengths ... the resulting list will be the length of the FIRST list passed. Usage: simpleabut(source,addon) where source, addon=list (or list-of-lists) Returns: a list of lists as long as source, with source on the 'left' and addon on the 'right' """ if type(source) not in [ListType,TupleType]: source = [source] if type(addon) not in [ListType,TupleType]: addon = [addon] minlen = min(len(source),len(addon)) list = copy.deepcopy(source) # start abut process if type(source[0]) not in [ListType,TupleType]: if type(addon[0]) not in [ListType,TupleType]: for i in range(minlen): list[i] = [source[i]] + [addon[i]] # source/addon = column else: for i in range(minlen): list[i] = [source[i]] + addon[i] # addon=list-of-lists else: if type(addon[0]) not in [ListType,TupleType]: for i in range(minlen): list[i] = source[i] + [addon[i]] # source=list-of-lists else: for i in range(minlen): list[i] = source[i] + addon[i] # source/addon = list-of-lists source = list return source def colex (listoflists,cnums): """ Extracts from listoflists the columns specified in the list 'cnums' (cnums can be an integer, a sequence of integers, or a string-expression that corresponds to a slice operation on the variable x ... e.g., 'x[3:]' will colex columns 3 onward from the listoflists). Usage: colex (listoflists,cnums) Returns: a list-of-lists corresponding to the columns from listoflists specified by cnums, in the order the column numbers appear in cnums """ global index column = 0 if type(cnums) in [ListType,TupleType]: # if multiple columns to get index = cnums[0] column = map(lambda x: x[index], listoflists) for col in cnums[1:]: index = col column = abut(column,map(lambda x: x[index], listoflists)) elif type(cnums) == StringType: # if an 'x[3:]' type expr. evalstring = 'map(lambda x: x'+cnums+', listoflists)' column = eval(evalstring) else: # else it's just 1 col to get index = cnums column = map(lambda x: x[index], listoflists) return column def collapse (listoflists,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None): """ Averages data in collapsecol, keeping all unique items in keepcols (using unique, which keeps unique LISTS of column numbers), retaining the unique sets of values in keepcols, the mean for each. Setting fcn1 and/or fcn2 to point to a function rather than None (e.g., stats.sterr, len) will append those results (e.g., the sterr, N) after each calculated mean. cfcn is the collapse function to apply (defaults to mean, defined here in the pstat module to avoid circular imports with stats.py, but harmonicmean or others could be passed). Usage: collapse (listoflists,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None) Returns: a list of lists with all unique permutations of entries appearing in columns ("conditions") specified by keepcols, abutted with the result of cfcn (if cfcn=None, defaults to the mean) of each column specified by collapsecols. """ def collmean (inlist): s = 0 for item in inlist: s = s + item return s/float(len(inlist)) if type(keepcols) not in [ListType,TupleType]: keepcols = [keepcols] if type(collapsecols) not in [ListType,TupleType]: collapsecols = [collapsecols] if cfcn == None: cfcn = collmean if keepcols == []: means = [0]*len(collapsecols) for i in range(len(collapsecols)): avgcol = colex(listoflists,collapsecols[i]) means[i] = cfcn(avgcol) if fcn1: try: test = fcn1(avgcol) except: test = 'N/A' means[i] = [means[i], test] if fcn2: try: test = fcn2(avgcol) except: test = 'N/A' try: means[i] = means[i] + [len(avgcol)] except TypeError: means[i] = [means[i],len(avgcol)] return means else: values = colex(listoflists,keepcols) uniques = unique(values) uniques.sort() newlist = [] if type(keepcols) not in [ListType,TupleType]: keepcols = [keepcols] for item in uniques: if type(item) not in [ListType,TupleType]: item =[item] tmprows = linexand(listoflists,keepcols,item) for col in collapsecols: avgcol = colex(tmprows,col) item.append(cfcn(avgcol)) if fcn1 <> None: try: test = fcn1(avgcol) except: test = 'N/A' item.append(test) if fcn2 <> None: try: test = fcn2(avgcol) except: test = 'N/A' item.append(test) newlist.append(item) return newlist def dm (listoflists,criterion): """ Returns rows from the passed list of lists that meet the criteria in the passed criterion expression (a string as a function of x; e.g., 'x[3]>=9' will return all rows where the 4th column>=9 and "x[2]=='N'" will return rows with column 2 equal to the string 'N'). Usage: dm (listoflists, criterion) Returns: rows from listoflists that meet the specified criterion. """ function = 'filter(lambda x: '+criterion+',listoflists)' lines = eval(function) return lines def flat(l): """ Returns the flattened version of a '2D' list. List-correlate to the a.ravel()() method of NumPy arrays. Usage: flat(l) """ newl = [] for i in range(len(l)): for j in range(len(l[i])): newl.append(l[i][j]) return newl def linexand (listoflists,columnlist,valuelist): """ Returns the rows of a list of lists where col (from columnlist) = val (from valuelist) for EVERY pair of values (columnlist[i],valuelists[i]). len(columnlist) must equal len(valuelist). Usage: linexand (listoflists,columnlist,valuelist) Returns: the rows of listoflists where columnlist[i]=valuelist[i] for ALL i """ if type(columnlist) not in [ListType,TupleType]: columnlist = [columnlist] if type(valuelist) not in [ListType,TupleType]: valuelist = [valuelist] criterion = '' for i in range(len(columnlist)): if type(valuelist[i])==StringType: critval = '\'' + valuelist[i] + '\'' else: critval = str(valuelist[i]) criterion = criterion + ' x['+str(columnlist[i])+']=='+critval+' and' criterion = criterion[0:-3] # remove the "and" after the last crit function = 'filter(lambda x: '+criterion+',listoflists)' lines = eval(function) return lines def linexor (listoflists,columnlist,valuelist): """ Returns the rows of a list of lists where col (from columnlist) = val (from valuelist) for ANY pair of values (colunmlist[i],valuelist[i[). One value is required for each column in columnlist. If only one value exists for columnlist but multiple values appear in valuelist, the valuelist values are all assumed to pertain to the same column. Usage: linexor (listoflists,columnlist,valuelist) Returns: the rows of listoflists where columnlist[i]=valuelist[i] for ANY i """ if type(columnlist) not in [ListType,TupleType]: columnlist = [columnlist] if type(valuelist) not in [ListType,TupleType]: valuelist = [valuelist] criterion = '' if len(columnlist) == 1 and len(valuelist) > 1: columnlist = columnlist*len(valuelist) for i in range(len(columnlist)): # build an exec string if type(valuelist[i])==StringType: critval = '\'' + valuelist[i] + '\'' else: critval = str(valuelist[i]) criterion = criterion + ' x['+str(columnlist[i])+']=='+critval+' or' criterion = criterion[0:-2] # remove the "or" after the last crit function = 'filter(lambda x: '+criterion+',listoflists)' lines = eval(function) return lines def linedelimited (inlist,delimiter): """ Returns a string composed of elements in inlist, with each element separated by 'delimiter.' Used by function writedelimited. Use '\t' for tab-delimiting. Usage: linedelimited (inlist,delimiter) """ outstr = '' for item in inlist: if type(item) <> StringType: item = str(item) outstr = outstr + item + delimiter outstr = outstr[0:-1] return outstr def lineincols (inlist,colsize): """ Returns a string composed of elements in inlist, with each element right-aligned in columns of (fixed) colsize. Usage: lineincols (inlist,colsize) where colsize is an integer """ outstr = '' for item in inlist: if type(item) <> StringType: item = str(item) size = len(item) if size <= colsize: for i in range(colsize-size): outstr = outstr + ' ' outstr = outstr + item else: outstr = outstr + item[0:colsize+1] return outstr def lineincustcols (inlist,colsizes): """ Returns a string composed of elements in inlist, with each element right-aligned in a column of width specified by a sequence colsizes. The length of colsizes must be greater than or equal to the number of columns in inlist. Usage: lineincustcols (inlist,colsizes) Returns: formatted string created from inlist """ outstr = '' for i in range(len(inlist)): if type(inlist[i]) <> StringType: item = str(inlist[i]) else: item = inlist[i] size = len(item) if size <= colsizes[i]: for j in range(colsizes[i]-size): outstr = outstr + ' ' outstr = outstr + item else: outstr = outstr + item[0:colsizes[i]+1] return outstr def list2string (inlist,delimit=' '): """ Converts a 1D list to a single long string for file output, using the string.join function. Usage: list2string (inlist,delimit=' ') Returns: the string created from inlist """ stringlist = map(makestr,inlist) return string.join(stringlist,delimit) def makelol(inlist): """ Converts a 1D list to a 2D list (i.e., a list-of-lists). Useful when you want to use put() to write a 1D list one item per line in the file. Usage: makelol(inlist) Returns: if l = [1,2,'hi'] then returns [[1],[2],['hi']] etc. """ x = [] for item in inlist: x.append([item]) return x def makestr (x): if type(x) <> StringType: x = str(x) return x def printcc (lst,extra=2): """ Prints a list of lists in columns, customized by the max size of items within the columns (max size of items in col, plus 'extra' number of spaces). Use 'dashes' or '\\n' in the list-of-lists to print dashes or blank lines, respectively. Usage: printcc (lst,extra=2) Returns: None """ if type(lst[0]) not in [ListType,TupleType]: lst = [lst] rowstokill = [] list2print = copy.deepcopy(lst) for i in range(len(lst)): if lst[i] == ['\n'] or lst[i]=='\n' or lst[i]=='dashes' or lst[i]=='' or lst[i]==['']: rowstokill = rowstokill + [i] rowstokill.reverse() # delete blank rows from the end for row in rowstokill: del list2print[row] maxsize = [0]*len(list2print[0]) for col in range(len(list2print[0])): items = colex(list2print,col) items = map(makestr,items) maxsize[col] = max(map(len,items)) + extra for row in lst: if row == ['\n'] or row == '\n' or row == '' or row == ['']: print elif row == ['dashes'] or row == 'dashes': dashes = [0]*len(maxsize) for j in range(len(maxsize)): dashes[j] = '-'*(maxsize[j]-2) print lineincustcols(dashes,maxsize) else: print lineincustcols(row,maxsize) return None def printincols (listoflists,colsize): """ Prints a list of lists in columns of (fixed) colsize width, where colsize is an integer. Usage: printincols (listoflists,colsize) Returns: None """ for row in listoflists: print lineincols(row,colsize) return None def pl (listoflists): """ Prints a list of lists, 1 list (row) at a time. Usage: pl(listoflists) Returns: None """ for row in listoflists: if row[-1] == '\n': print row, else: print row return None def printl(listoflists): """Alias for pl.""" pl(listoflists) return def replace (inlst,oldval,newval): """ Replaces all occurrences of 'oldval' with 'newval', recursively. Usage: replace (inlst,oldval,newval) """ lst = inlst*1 for i in range(len(lst)): if type(lst[i]) not in [ListType,TupleType]: if lst[i]==oldval: lst[i]=newval else: lst[i] = replace(lst[i],oldval,newval) return lst def recode (inlist,listmap,cols=None): """ Changes the values in a list to a new set of values (useful when you need to recode data from (e.g.) strings to numbers. cols defaults to None (meaning all columns are recoded). Usage: recode (inlist,listmap,cols=None) cols=recode cols, listmap=2D list Returns: inlist with the appropriate values replaced with new ones """ lst = copy.deepcopy(inlist) if cols != None: if type(cols) not in [ListType,TupleType]: cols = [cols] for col in cols: for row in range(len(lst)): try: idx = colex(listmap,0).index(lst[row][col]) lst[row][col] = listmap[idx][1] except ValueError: pass else: for row in range(len(lst)): for col in range(len(lst)): try: idx = colex(listmap,0).index(lst[row][col]) lst[row][col] = listmap[idx][1] except ValueError: pass return lst def remap (listoflists,criterion): """ Remaps values in a given column of a 2D list (listoflists). This requires a criterion as a function of 'x' so that the result of the following is returned ... map(lambda x: 'criterion',listoflists). Usage: remap(listoflists,criterion) criterion=string Returns: remapped version of listoflists """ function = 'map(lambda x: '+criterion+',listoflists)' lines = eval(function) return lines def roundlist (inlist,digits): """ Goes through each element in a 1D or 2D inlist, and applies the following function to all elements of FloatType ... round(element,digits). Usage: roundlist(inlist,digits) Returns: list with rounded floats """ if type(inlist[0]) in [IntType, FloatType]: inlist = [inlist] l = inlist*1 for i in range(len(l)): for j in range(len(l[i])): if type(l[i][j])==FloatType: l[i][j] = round(l[i][j],digits) return l def sortby(listoflists,sortcols): """ Sorts a list of lists on the column(s) specified in the sequence sortcols. Usage: sortby(listoflists,sortcols) Returns: sorted list, unchanged column ordering """ newlist = abut(colex(listoflists,sortcols),listoflists) newlist.sort() try: numcols = len(sortcols) except TypeError: numcols = 1 crit = '[' + str(numcols) + ':]' newlist = colex(newlist,crit) return newlist def unique (inlist): """ Returns all unique items in the passed list. If the a list-of-lists is passed, unique LISTS are found (i.e., items in the first dimension are compared). Usage: unique (inlist) Returns: the unique elements (or rows) in inlist """ uniques = [] for item in inlist: if item not in uniques: uniques.append(item) return uniques def duplicates(inlist): """ Returns duplicate items in the FIRST dimension of the passed list. Usage: duplicates (inlist) """ dups = [] for i in range(len(inlist)): if inlist[i] in inlist[i+1:]: dups.append(inlist[i]) return dups def nonrepeats(inlist): """ Returns items that are NOT duplicated in the first dim of the passed list. Usage: nonrepeats (inlist) """ nonrepeats = [] for i in range(len(inlist)): if inlist.count(inlist[i]) == 1: nonrepeats.append(inlist[i]) return nonrepeats #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== #=================== PSTAT ARRAY FUNCTIONS ===================== try: # DEFINE THESE *ONLY* IF numpy IS AVAILABLE import numpy as N def aabut (source, *args): """ Like the |Stat abut command. It concatenates two arrays column-wise and returns the result. CAUTION: If one array is shorter, it will be repeated until it is as long as the other. Usage: aabut (source, args) where args=any # of arrays Returns: an array as long as the LONGEST array past, source appearing on the 'left', arrays in attached on the 'right'. """ if len(source.shape)==1: width = 1 source = N.resize(source,[source.shape[0],width]) else: width = source.shape[1] for addon in args: if len(addon.shape)==1: width = 1 addon = N.resize(addon,[source.shape[0],width]) else: width = source.shape[1] if len(addon) < len(source): addon = N.resize(addon,[source.shape[0],addon.shape[1]]) elif len(source) < len(addon): source = N.resize(source,[addon.shape[0],source.shape[1]]) source = N.concatenate((source,addon),1) return source def acolex (a,indices,axis=1): """ Extracts specified indices (a list) from passed array, along passed axis (column extraction is default). BEWARE: A 1D array is presumed to be a column-array (and that the whole array will be returned as a column). Usage: acolex (a,indices,axis=1) Returns: the columns of a specified by indices """ if type(indices) not in [ListType,TupleType,N.ndarray]: indices = [indices] if len(N.shape(a)) == 1: cols = N.resize(a,[a.shape[0],1]) else: cols = N.take(a,indices,axis) return cols def acollapse (a,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None): """ Averages data in collapsecol, keeping all unique items in keepcols (using unique, which keeps unique LISTS of column numbers), retaining the unique sets of values in keepcols, the mean for each. If stderror or N of the mean are desired, set either or both parameters to 1. Usage: acollapse (a,keepcols,collapsecols,fcn1=None,fcn2=None,cfcn=None) Returns: unique 'conditions' specified by the contents of columns specified by keepcols, abutted with the mean(s) of column(s) specified by collapsecols """ def acollmean (inarray): return N.sum(N.ravel(inarray)) if type(keepcols) not in [ListType,TupleType,N.ndarray]: keepcols = [keepcols] if type(collapsecols) not in [ListType,TupleType,N.ndarray]: collapsecols = [collapsecols] if cfcn == None: cfcn = acollmean if keepcols == []: avgcol = acolex(a,collapsecols) means = N.sum(avgcol)/float(len(avgcol)) if fcn1<>None: try: test = fcn1(avgcol) except: test = N.array(['N/A']*len(means)) means = aabut(means,test) if fcn2<>None: try: test = fcn2(avgcol) except: test = N.array(['N/A']*len(means)) means = aabut(means,test) return means else: if type(keepcols) not in [ListType,TupleType,N.ndarray]: keepcols = [keepcols] values = colex(a,keepcols) # so that "item" can be appended (below) uniques = unique(values) # get a LIST, so .sort keeps rows intact uniques.sort() newlist = [] for item in uniques: if type(item) not in [ListType,TupleType,N.ndarray]: item =[item] tmprows = alinexand(a,keepcols,item) for col in collapsecols: avgcol = acolex(tmprows,col) item.append(acollmean(avgcol)) if fcn1<>None: try: test = fcn1(avgcol) except: test = 'N/A' item.append(test) if fcn2<>None: try: test = fcn2(avgcol) except: test = 'N/A' item.append(test) newlist.append(item) try: new_a = N.array(newlist) except TypeError: new_a = N.array(newlist,'O') return new_a def adm (a,criterion): """ Returns rows from the passed list of lists that meet the criteria in the passed criterion expression (a string as a function of x). Usage: adm (a,criterion) where criterion is like 'x[2]==37' """ function = 'filter(lambda x: '+criterion+',a)' lines = eval(function) try: lines = N.array(lines) except: lines = N.array(lines,dtype='O') return lines def isstring(x): if type(x)==StringType: return 1 else: return 0 def alinexand (a,columnlist,valuelist): """ Returns the rows of an array where col (from columnlist) = val (from valuelist). One value is required for each column in columnlist. Usage: alinexand (a,columnlist,valuelist) Returns: the rows of a where columnlist[i]=valuelist[i] for ALL i """ if type(columnlist) not in [ListType,TupleType,N.ndarray]: columnlist = [columnlist] if type(valuelist) not in [ListType,TupleType,N.ndarray]: valuelist = [valuelist] criterion = '' for i in range(len(columnlist)): if type(valuelist[i])==StringType: critval = '\'' + valuelist[i] + '\'' else: critval = str(valuelist[i]) criterion = criterion + ' x['+str(columnlist[i])+']=='+critval+' and' criterion = criterion[0:-3] # remove the "and" after the last crit return adm(a,criterion) def alinexor (a,columnlist,valuelist): """ Returns the rows of an array where col (from columnlist) = val (from valuelist). One value is required for each column in columnlist. The exception is if either columnlist or valuelist has only 1 value, in which case that item will be expanded to match the length of the other list. Usage: alinexor (a,columnlist,valuelist) Returns: the rows of a where columnlist[i]=valuelist[i] for ANY i """ if type(columnlist) not in [ListType,TupleType,N.ndarray]: columnlist = [columnlist] if type(valuelist) not in [ListType,TupleType,N.ndarray]: valuelist = [valuelist] criterion = '' if len(columnlist) == 1 and len(valuelist) > 1: columnlist = columnlist*len(valuelist) elif len(valuelist) == 1 and len(columnlist) > 1: valuelist = valuelist*len(columnlist) for i in range(len(columnlist)): if type(valuelist[i])==StringType: critval = '\'' + valuelist[i] + '\'' else: critval = str(valuelist[i]) criterion = criterion + ' x['+str(columnlist[i])+']=='+critval+' or' criterion = criterion[0:-2] # remove the "or" after the last crit return adm(a,criterion) def areplace (a,oldval,newval): """ Replaces all occurrences of oldval with newval in array a. Usage: areplace(a,oldval,newval) """ return N.where(a==oldval,newval,a) def arecode (a,listmap,col='all'): """ Remaps the values in an array to a new set of values (useful when you need to recode data from (e.g.) strings to numbers as most stats packages require. Can work on SINGLE columns, or 'all' columns at once. @@@BROKEN 2007-11-26 Usage: arecode (a,listmap,col='all') Returns: a version of array a where listmap[i][0] = (instead) listmap[i][1] """ ashape = a.shape if col == 'all': work = a.ravel() else: work = acolex(a,col) work = work.ravel() for pair in listmap: if type(pair[1]) == StringType or work.dtype.char=='O' or a.dtype.char=='O': work = N.array(work,dtype='O') a = N.array(a,dtype='O') for i in range(len(work)): if work[i]==pair[0]: work[i] = pair[1] if col == 'all': return N.reshape(work,ashape) else: return N.concatenate([a[:,0:col],work[:,N.newaxis],a[:,col+1:]],1) else: # must be a non-Object type array and replacement work = N.where(work==pair[0],pair[1],work) return N.concatenate([a[:,0:col],work[:,N.newaxis],a[:,col+1:]],1) def arowcompare(row1, row2): """ Compares two rows from an array, regardless of whether it is an array of numbers or of python objects (which requires the cmp function). @@@PURPOSE? 2007-11-26 Usage: arowcompare(row1,row2) Returns: an array of equal length containing 1s where the two rows had identical elements and 0 otherwise """ return if row1.dtype.char=='O' or row2.dtype=='O': cmpvect = N.logical_not(abs(N.array(map(cmp,row1,row2)))) # cmp fcn gives -1,0,1 else: cmpvect = N.equal(row1,row2) return cmpvect def arowsame(row1, row2): """ Compares two rows from an array, regardless of whether it is an array of numbers or of python objects (which requires the cmp function). Usage: arowsame(row1,row2) Returns: 1 if the two rows are identical, 0 otherwise. """ cmpval = N.alltrue(arowcompare(row1,row2)) return cmpval def asortrows(a,axis=0): """ Sorts an array "by rows". This differs from the Numeric.sort() function, which sorts elements WITHIN the given axis. Instead, this function keeps the elements along the given axis intact, but shifts them 'up or down' relative to one another. Usage: asortrows(a,axis=0) Returns: sorted version of a """ return N.sort(a,axis=axis,kind='mergesort') def aunique(inarray): """ Returns unique items in the FIRST dimension of the passed array. Only works on arrays NOT including string items. Usage: aunique (inarray) """ uniques = N.array([inarray[0]]) if len(uniques.shape) == 1: # IF IT'S A 1D ARRAY for item in inarray[1:]: if N.add.reduce(N.equal(uniques,item).ravel()) == 0: try: uniques = N.concatenate([uniques,N.array[N.newaxis,:]]) except TypeError: uniques = N.concatenate([uniques,N.array([item])]) else: # IT MUST BE A 2+D ARRAY if inarray.dtype.char != 'O': # not an Object array for item in inarray[1:]: if not N.sum(N.alltrue(N.equal(uniques,item),1)): try: uniques = N.concatenate( [uniques,item[N.newaxis,:]] ) except TypeError: # the item to add isn't a list uniques = N.concatenate([uniques,N.array([item])]) else: pass # this item is already in the uniques array else: # must be an Object array, alltrue/equal functions don't work for item in inarray[1:]: newflag = 1 for unq in uniques: # NOTE: cmp --> 0=same, -1=<, 1=> test = N.sum(abs(N.array(map(cmp,item,unq)))) if test == 0: # if item identical to any 1 row in uniques newflag = 0 # then not a novel item to add break if newflag == 1: try: uniques = N.concatenate( [uniques,item[N.newaxis,:]] ) except TypeError: # the item to add isn't a list uniques = N.concatenate([uniques,N.array([item])]) return uniques def aduplicates(inarray): """ Returns duplicate items in the FIRST dimension of the passed array. Only works on arrays NOT including string items. Usage: aunique (inarray) """ inarray = N.array(inarray) if len(inarray.shape) == 1: # IF IT'S A 1D ARRAY dups = [] inarray = inarray.tolist() for i in range(len(inarray)): if inarray[i] in inarray[i+1:]: dups.append(inarray[i]) dups = aunique(dups) else: # IT MUST BE A 2+D ARRAY dups = [] aslist = inarray.tolist() for i in range(len(aslist)): if aslist[i] in aslist[i+1:]: dups.append(aslist[i]) dups = unique(dups) dups = N.array(dups) return dups except ImportError: # IF NUMERIC ISN'T AVAILABLE, SKIP ALL arrayfuncs pass gamera-3.3.3/gamera/pyplate.py0000644000076500000000000003152311652050143015227 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: """PyPlate : a simple Python-based templating program PyPlate parses a file and replaces directives (in double square brackets [[ ... ]]) by various means using a given dictionary of variables. Arbitrary Python code can be run inside many of the directives, making this system highly flexible. Usage: # Load and parse template file template = pyplate.Template("output") (filename or string) # Execute it with a dictionary of variables template.execute_file(output_stream, locals()) PyPlate defines the following directives: [[...]] evaluate the arbitrary Python expression and insert the result into the output [[# ... #]] comment. [[exec ...]] execute arbitrary Python code in the sandbox namespace [[if ...]] conditional expressions with usual Python semantics [[elif ...]] [[else]] [[end]] [[for ... in ...]] for-loop with usual Python semantics [[end]] [[def ...(...)]] define a "function" out of other templating elements [[end]] [[call ...]] call a templating function (not a regular Python function) """ # # Copyright (C) 2001-2005 Michael Droettboom # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from __future__ import nested_scopes import sys, string, re, util, cStringIO, codecs re_directive = re.compile("\[\[(.*?)\]\]") re_for_loop = re.compile("for (.*) in (.*)") re_if = re.compile("if (.*)") re_elif = re.compile("elif (.*)") re_def = re.compile("def (.*?)\((.*)\)") re_call = re.compile("call (.*?)\((.*)\)") re_exec = re.compile("exec (.*)") re_comment = re.compile("#(.*)#") re_clean_whitespace = re.compile(r"\]\]\s+?") ############################################################ # Template parser class ParserException(Exception): def __init__(self, lineno, s): Exception.__init__(self, "line %d: %s" % (lineno, s)) class Template: def __init__(self, filename=None): if filename != None: try: self.parse_file(filename) except: self.parse_string(filename) def parse_file(self, filename): file = open(filename, 'r') self.parse(file) file.close() def parse_string(self, template): file = cStringIO.StringIO(template) self.parse(file) file.close() def parse(self, file): self.file = file self.line = re_clean_whitespace.sub("]]", self.file.read()) self.lineno = 0 self.functions = {} self.tree = TopLevelTemplateNode(self) def parser_get(self): if self.line == '': return None return self.line def parser_eat(self, chars): self.lineno = self.lineno + self.line[:chars].count("\n") self.line = self.line[chars:] def parser_exception(self, s, e=None): import traceback if e != None: traceback.print_exc() raise ParserException(self.lineno, s) def execute_file(self, filename, data={}): output = self.execute_string(data) file = open(filename, 'w') file.write(output) file.write("\n") file.close() def execute_string(self, data={}): data_copy = {} data_copy.update(data) s = cStringIO.StringIO() self.execute(s, data_copy) s.write("\n") return s.getvalue() def execute_stdout(self, data={}): data_copy = {} data_copy.update(data) self.execute(sys.stdout, data_copy) sys.stdout.write("\n") def execute(self, stream=sys.stdout, data={}): self.tree.execute(stream, data) def __repr__(self): return repr(self.tree) ############################################################ # NODES class TemplateNode: def __init__(self, parent, s): self.parent = parent self.s = s self.node_list = [] while 1: new_node = TemplateNodeFactory(parent) if self.add_node(new_node): break def add_node(self, node): if node == 'end': return 1 elif node != None: self.node_list.append(node) else: raise self.parent.parser_exception( "[[%s]] does not have a matching [[end]]" % self.s) def execute(self, stream, data): for node in self.node_list: node.execute(stream, data) def __repr__(self): r = "<" + self.__class__.__name__ + " " for i in self.node_list: r = r + repr(i) r = r + ">" return r class TopLevelTemplateNode(TemplateNode): def __init__(self, parent): TemplateNode.__init__(self, parent, '') def add_node(self, node): if node != None: self.node_list.append(node) else: return 1 class ForTemplateNode(TemplateNode): def __init__(self, parent, s): TemplateNode.__init__(self, parent, s) match = re_for_loop.match(s) if match == None: raise self.parent.parser_exception( "[[%s]] is not a valid for-loop expression" % self.s) else: self.vars_temp = match.group(1).split(",") self.vars = [] for v in self.vars_temp: self.vars.append(v.strip()) self.expression = match.group(2) def execute(self, stream, data): remember_vars = {} for var in self.vars: if data.has_key(var): remember_vars[var] = data[var] try: x = eval(self.expression, globals(), data) except Exception, e: self.parent.parser_exception(self.expression, e) for list in x: if util.is_sequence(list): if len(self.vars) == 1: data[self.vars[0]] = list elif len(self.vars) == len(list): for index, value in util.enumerate(list): data[self.vars[index]] = value else: self.parent.parser_exception( "Unable to unpack tuples in [[%s]]" % self.s) else: data[self.vars[0]] = list TemplateNode.execute(self, stream, data) for key, value in remember_vars.items(): data[key] = value class IfTemplateNode(TemplateNode): def __init__(self, parent, s): self.else_node = None TemplateNode.__init__(self, parent, s) match = re_if.match(s) if match == None: raise self.parent.parser_exception( "[[%s]] is not a valid if expression" % self.s) else: self.expression = match.group(1) def add_node(self, node): if node == 'end': return 1 elif isinstance(node, ElseTemplateNode): self.else_node = node return 1 elif isinstance(node, ElifTemplateNode): self.else_node = node return 1 elif node != None: self.node_list.append(node) else: raise self.parent.parser_exception( "[[%s]] does not have a matching [[end]]" % self.s) def execute(self, stream, data): try: x = eval(self.expression, globals(), data) except Exception, e: self.parent.parser_exception(self.expression, e) if x: TemplateNode.execute(self, stream, data) elif self.else_node != None: self.else_node.execute(stream, data) class ElifTemplateNode(IfTemplateNode): def __init__(self, parent, s): self.else_node = None TemplateNode.__init__(self, parent, s) match = re_elif.match(s) if match == None: self.parent.parser_exception( "[[%s]] is not a valid elif expression" % self.s) else: self.expression = match.group(1) class ElseTemplateNode(TemplateNode): pass class FunctionTemplateNode(TemplateNode): def __init__(self, parent, s): TemplateNode.__init__(self, parent, s) match = re_def.match(s) if match == None: self.parent.parser_exception( "[[%s]] is not a valid function definition" % self.s) self.function_name = match.group(1) self.vars_temp = match.group(2).split(",") self.vars = [] for v in self.vars_temp: self.vars.append(v.strip()) self.parent.functions[self.function_name] = self def execute(self, stream, data): pass def call(self, args, stream, data): remember_vars = {} for index, var in util.enumerate(self.vars): if data.has_key(var): remember_vars[var] = data[var] data[var] = args[index] TemplateNode.execute(self, stream, data) for key, value in remember_vars.items(): data[key] = value class LeafTemplateNode(TemplateNode): def __init__(self, parent, s): self.parent = parent self.s = s def execute(self, stream, data): stream.write(self.s) def __repr__(self): return "<" + self.__class__.__name__ + ">" class CommentTemplateNode(LeafTemplateNode): def execute(self, stream, data): pass class ExpressionTemplateNode(LeafTemplateNode): def execute(self, stream, data): try: stream.write(unicode(eval(self.s, globals(), data)).encode("utf-8")) except Exception, e: self.parent.parser_exception(self.s, e) class ExecTemplateNode(LeafTemplateNode): def __init__(self, parent, s): LeafTemplateNode.__init__(self, parent, s) match = re_exec.match(s) if match == None: self.parent.parser_exception( "[[%s]] is not a valid statement" % self.s) self.s = match.group(1) def execute(self, stream, data): try: exec(self.s, globals(), data) except Exception, e: self.parent.parser_exception(self.s, e) class CallTemplateNode(LeafTemplateNode): def __init__(self, parent, s): LeafTemplateNode.__init__(self, parent, s) match = re_call.match(s) if match == None: self.parent.parser_exception( "[[%s]] is not a valid function call" % self.s) self.function_name = match.group(1) self.vars = "(" + match.group(2).strip() + ",)" def execute(self, stream, data): try: x = eval(self.vars, globals(), data) except Exception, e: self.parent.parser_exception(self.vars, e) self.parent.functions[self.function_name].call( x, stream, data) ############################################################ # Node factory template_factory_type_map = { 'if' : IfTemplateNode, 'for' : ForTemplateNode, 'elif' : ElifTemplateNode, 'else' : ElseTemplateNode, 'def' : FunctionTemplateNode, 'call' : CallTemplateNode, 'exec' : ExecTemplateNode } template_factory_types = template_factory_type_map.keys() def TemplateNodeFactory(parent): src = parent.parser_get() if src == None: return None match = re_directive.search(src) if match == None: parent.parser_eat(len(src)) return LeafTemplateNode(parent, src) elif src == '' or match.start() != 0: parent.parser_eat(match.start()) return LeafTemplateNode(parent, src[:match.start()]) else: directive = match.group()[2:-2].strip() parent.parser_eat(match.end()) if directive == 'end': return 'end' elif re_comment.match(directive): return CommentTemplateNode(parent, directive) else: for i in template_factory_types: if directive[0:len(i)] == i: return template_factory_type_map[i](parent, directive) return ExpressionTemplateNode(parent, directive) ############################################################ # TESTING CODE if __name__ == '__main__': combinations = (('OneBit', 'Float', 'GreyScale'), ('GreyScale', 'RGB')) template = Template(""" [[# This is a comment #]] [[# This example does recursive function calls need to generate feature combinations #]] [[def switch(layer, args)]] switch(m[[layer]].id) { [[for option in combinations[layer] ]] [[exec current = option + '(m' + str(layer) + ')']] case [[option]]: [[if layer == layers - 1]] function_call([[string.join(args + [current], ',')]]); [[else]] [[call switch(layer + 1, args + [current])]] [[end]] break; [[end]] } [[end]] PyObject *py_overload_resolution_[[function_name]](PyObject *args) { [[call switch(0, [])]] } """) data = {'combinations' : combinations, 'function_name' : 'threshold', 'layers' : 2} template.execute(sys.stdout, data) gamera-3.3.3/gamera/roman_text.py0000644000076500000000000004347011652050143015735 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """ Usage ===== (as inferred from the source by Michael Droettboom) See the docstrings of the classes and functions for more information. .. code:: from gamera import roman_text # Load an image and a classifier (see documentation elsewhere)... # image is a one-bit image # classifier is a classifier object with a production database loaded page = roman_text.ocr(image, classifier) *page* is a ``Page`` object. You can display how the page was segmenteted in different ways using ``.display_sections``, ``.display_lines``, ``.display_glyphs``, and ``.display_segmentation``. Once you have a segmented page object, you can convert it to ASCII using the ``make_string`` function. It takes as input a ``Section`` object, and an optional name-mapping function. The name-mapping function is any function that takes a string with a symbol id_name and returns a character (which may be Unicode). This function defines how the names used in the training data map to characters in the output. If no name-mapping function is provided a default one is used which maps Gamera symbol id names to Unicode character names and then to Unicode characters. All periods ('.') in the Gamera id name are converted to spaces, and then the result is used as a Unicode character name. For instance ``latin.capital.letter.a`` maps to ``LATIN CAPITAL LETTER A``. (`Charts of Unicode character names`_). The version of Unicode used corresponds with that used in your version of Python. For instance, Python 2.3.x supports Unicode 3.2.0. .. _: http://www.unicode.org/charts/ .. code:: output = [] for section in page.sections: output.append(roman_text.make_string(section)) """ from gamera import core import unicodedata import string class Page: def __init__(self, image, glyphs): """Create a page with the given image.""" self.sections = [] self.image = image self.glyphs = glyphs self.section_search_size = 1 self.__fill = 0 self.__noise_size = 0 self.__large_size = 0 def __section_size_test(self, glyph): """Filter for section finding - removes very small and very large glyphs""" black_area = glyph.black_area()[0] if black_area > self.__noise_size and \ glyph.nrows < self.__large_size and \ glyph.ncols < self.__large_size: return 1 else: return 0 def __avg_glyph_size(self, glyphs): """Compute the average glyph size for the page""" total = 0.0 for g in glyphs: total += g.nrows total += g.ncols return total / (2 * len(glyphs)) def __find_intersecting_rects(self, glyphs, index): """For section finding - return the index of glyphs intersecting the glyph and the index passed in.""" g = glyphs[index] inter = [] for i in range(len(glyphs)): if i == index: continue if g.intersects(glyphs[i]): inter.append(i) return inter def segment(self): """Segment the page into sections and lines. Also computes all of the statistics for the sections and lines.""" self.find_sections() self.find_lines() for s in self.sections: s.calculate_stats() for line in s.lines: line.calculate_stats() def find_lines(self): """Find the lines within all of the sections. Must be called after find_sections.""" for s in self.sections: s.find_lines() def find_sections(self): """Find the sections within an image - this finds large blocks of text making it possible to find the lines within complex text layouts.""" glyphs = self.glyphs FUDGE = self.__avg_glyph_size(glyphs) * self.section_search_size # remove noise and large objects self.__noise_size = FUDGE self.__large_size = FUDGE * 20 new_glyphs = [] for g in glyphs: if self.__section_size_test(g): new_glyphs.append(g) else: if self.__fill: g.fill_white() glyphs = new_glyphs # Sort the glyphs left-to-right and top-to-bottom glyphs.sort(lambda x, y: cmp(x.ul_x, y.ul_x)) glyphs.sort(lambda x, y: cmp(x.ul_y, y.ul_y)) # Create rectangles for each glyph that are bigger by FUDGE big_rects = [] for g in glyphs: ul_y = max(0, g.ul_y - FUDGE) ul_x = max(0, g.ul_x - FUDGE) lr_y = min(self.image.lr_y, g.lr_y + FUDGE) lr_x = min(self.image.lr_x, g.lr_x + FUDGE) ul_x = int(ul_x); ul_y = int(ul_y) nrows = int(lr_y - ul_y + 1) ncols = int(lr_x - ul_x + 1) big_rects.append(core.Rect(core.Point(ul_x, ul_y), core.Dim(ncols, nrows))) # Search for intersecting glyphs and merge them. This is # harder than it seems at first because we want everything # to merge together that intersects regardless of the order # in the list. It ends up being similar to connected-component # labeling. This is prone to be kind-of slow. current = 0 rects = big_rects while(1): # Find the indexexes of any rects that interesect with current inter = self.__find_intersecting_rects(rects, current) # If we found intersecting rectangles merge them with them current # rect, remove them from the list, and start the whole process # over. We start over to make certain that everything that should # be merged is. if len(inter): g = rects[current] new_rects = [g] for i in range(len(rects)): if i == current: continue if i in inter: g.union(rects[i]) else: new_rects.append(rects[i]) rects = new_rects current = 0 # If we didn't find anything that intersected move on to the next # rectangle. else: current += 1 # Bail when we are done. if current >= len(rects): break # Create the sections sections = [] for rect in rects: sections.append(Section(rect)) # Place the original (small) glyphs into the sections for glyph in self.glyphs: if self.__section_size_test(glyph): for s in sections: if s.bbox.intersects(glyph): s.add_glyph(glyph) break # Fix up the bounding boxes for s in sections: s.calculate_bbox() self.sections = sections def display_sections(self, clear=1): """Display the sections found by placing a box around them in a display. If clear is true then any boxes already on the displayed are cleared first.""" # display the sections result = self.sections if self.image._display == None: self.image.display() display = self.image._display if clear: display.clear_all_boxes() for rect in result: b = rect.bbox display.add_box(core.Rect(core.Point(b.ul_x, b.ul_y), core.Dim(b.ncols, b.nrows))) def display_lines(self, clear=1): """Display the lines found by placing a box around them in a display. If clear is true then any boxes already on the displayed are cleared first.""" if self.image._display == None: self.image.display() display = self.image._display if clear: display.clear_all_boxes() for s in self.sections: for line in s.lines: b = line.bbox display.add_box(core.Rect(core.Point(b.ul_x, b.ul_y), core.Dim(b.ncols, b.nrows))) def display_glyphs(self, clear=1): if self.image._display == None: self.image.display() display = self.image._display if clear: display.clear_all_boxes() for rect in self.glyphs: b = rect display.add_box(b.ul_y, b.ul_x, b.nrows, b.ncols) def display_segmentation(self): self.display_lines() self.display_sections(0) class Section: def __init__(self, bbox): self.bbox = core.Rect(bbox) self.lines = [] self.glyphs = [] # stats self.avg_glyph_area = 0 self.avg_glyph_height = 0 self.avg_glyph_width = 0 self.avg_line_height = 0 self.agv_line_width = 0 def find_tall_glyphs(self, stdev=20): from gamera import stats tall = [] for i in range(len(self.glyphs)): g = self.glyphs[i] if stats.samplestdev([g.nrows, self.avg_glyph_height]) > stdev: tall.append(i) return tall def add_line(self, line): self.lines.append(line) self.lines.sort(lambda x, y: cmp(x.bbox.ul_y, y.bbox.ul_y)) def add_glyph(self, glyph): self.glyphs.append(glyph) def calculate_bbox(self): assert(len(self.glyphs) > 0) self.bbox = core.Rect(self.glyphs[0]) for glyph in self.glyphs: self.bbox.union(glyph) def calculate_stats(self): self.calculate_glyph_stats() self.calculate_line_stats() def calculate_glyph_stats(self): # calculate glyph stats total_area = 0.0 total_gheight = 0.0 total_gwidth = 0.0 for g in self.glyphs: nrows = g.nrows ncols = g.ncols total_area += nrows * ncols total_gheight += nrows total_gwidth += ncols l = len(self.glyphs) self.avg_glyph_area = total_area / l self.avg_glyph_height = total_gheight / l self.avg_glyph_width = total_gwidth / l def calculate_line_stats(self): # calculate line stats total_lheight = 0.0 total_lwidth = 0.0 for line in self.lines: total_lheight += line.bbox.nrows total_lwidth += line.bbox.ncols l = len(self.lines) self.avg_line_height = total_lheight / l self.avg_line_width = total_lwidth / l def __find_intersecting_lines(self, glyphs, index): g = glyphs[index] inter = [] for i in range(len(glyphs)): if i == index: continue if g.bbox.intersects(glyphs[i].bbox): inter.append(i) return inter def find_lines(self): # Remove abnormally tall glyphs that might interfer with # line finding self.calculate_glyph_stats() tall_indexes = self.find_tall_glyphs() tall = [] glyphs = [] for i in range(len(self.glyphs)): if i in tall_indexes: tall.append(self.glyphs[i]) else: glyphs.append(self.glyphs[i]) orig_glyphs = self.glyphs self.glyphs = glyphs # find the lines - this is very basic for now lines = [] for glyph in self.glyphs: found = 0 for line in lines: if line.contains_glyph(glyph): line.add_glyph(glyph) found = 1 break if not found: new_line = Line(glyph) lines.append(new_line) # Merge any overlapping lines current = 0 while(1): inter = self.__find_intersecting_lines(lines, current) if len(inter): new_lines = [lines[current]] for i in range(len(lines)): if i == current: continue if i in inter: new_lines[0].merge(lines[i]) else: new_lines.append(lines[i]) current = 0 lines = new_lines else: current += 1 if current >= len(lines): break # Put the tall glyphs back in by assigning them to the first line # we come to that intersects. for i in range(len(tall)): for line in lines: found = 0 if line.bbox.contains_y(tall[i].ul_y): line.add_glyph(tall[i]) found = 1 break if not found: print "Did not find lines for all tall glyphs" self.glyphs = orig_glyphs self.lines = lines class Line: def __init__(self, glyph): self.center = 0 self.bbox = core.Rect(core.Point(glyph.ul_x, glyph.ul_y), core.Dim(glyph.ncols, glyph.nrows)) self.glyphs = [] self.add_glyph(glyph) def add_glyph(self, glyph): self.glyphs.append(glyph) self.glyphs.sort(lambda x, y: cmp(x.ul_x, y.ul_x)) self.bbox.union(glyph) def calculate_stats(self): total_center = 0 for glyph in self.glyphs: total_center += (glyph.ul_y + glyph.lr_y) / 2 self.bbox.union(glyph) self.center = total_center / len(self.glyphs) def contains_glyph(self, glyph): center = (glyph.ul_y + glyph.lr_y) / 2 if self.bbox.contains_y(center): return 1 else: return 0 def merge(self, line): self.glyphs.extend(line.glyphs) self.calculate_stats() def name_lookup_old(id_name): """Converts a symbol name into a single character.""" split_string = string.split(id_name, '.') l = len(split_string) if l > 1: if split_string[0] == "lower": return string.lower(split_string[-1]) elif split_string[0] == "upper": return string.upper(split_string[-1]) elif split_string[0] == "symbol": if l == 2: s = split_string[1] if s == "comma": return "," elif s == "dot": return "" elif s == "plus": return "+" elif s == "lessthan": return "<" else: print "ERROR: Name not known about:", id_name return "" elif l == 3: if split_string[1] == "paren": if split_string[2] == "close": return ")" else: return "(" elif split_string[1] == "bracket": if split_string[2] == "close": return "]" else: return "[" else: print "ERROR: Name not known about:", id_name return "" else: print "ERROR: Name not known about:", id_name return "" elif split_string[0] == "digit": return split_string[1] elif split_string[0] == "line": return "" elif split_string[0] == "punctuation": if split_string[1] == "comma": return "," else: return "" else: print "ERROR: Name not known about:", id_name return "" else: return "" def name_lookup_unicode(id_name): name = id_name.replace(".", " ") name = name.upper() try: return unicodedata.lookup(name) except KeyError: print "ERROR: Name not found:", name return "" def make_string(lines, name_lookup_func=name_lookup_unicode): s = "" for line in lines: glyphs = line.glyphs total_space = 0 for i in range(len(glyphs) - 1): total_space += glyphs[i + 1].ul_x - glyphs[i].lr_x average_space = total_space / len(glyphs) for i in range(len(glyphs)): if i > 0: if (glyphs[i].ul_x - glyphs[i - 1].lr_x) > (average_space * 2): s = s + " " s = s + name_lookup_func(glyphs[i].get_main_id()) s = s + "\n" return s def output(lines, filename="text.txt"): s = make_string(lines) f = file(filename, "w") f.write(s) f.flush() f.close() def ocr(image, classifier = None, glyphs = None): """Performs basic OCR segmentation. *image*: OneBit image *classifier*: a classifier with a production database loaded (optional) *glyphs*: a list of glyphs from the image (optional) Returns a ``Page`` object. """ if glyphs is None: glyphs = image.cc_analysis() if classifier is not None: #classifier.classify_list_automatic(glyphs) glyphs = classifier.group_and_update_list_automatic(glyphs) page = Page(image, glyphs) page.segment() return page gamera-3.3.3/gamera/ruleengine.py0000644000076500000000000002445211652050143015711 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import traceback from sys import exc_info from inspect import isfunction from gamera import group, util from fudge import Fudge """This module provides tools for applying graph-rewriting rules to a set of glyphs. It would seem nice to invent a completely new language for this task (for instance, a logic-programming language like Prolog might have been nice). However, in this design, each rule is defined by a basic Python function. This integrates much easier into the rest of the Python-based Gamera world, since any Python function can be called at any time, and doesn't require the user to learn a new language. The disadvantage is that the pattern matching is single-tiered (no recursion) and the ordering and application of the rules is left to the end programmer, since this approach makes it difficult to do any global optimisation. There may be ways around these limitations, but that will require some thinking. Rule functions take the basic form: def rule_function0(a="dot", b="letter*"): # 1: function signature if (Fudge(a.lr_y) == b.lr_y and a.ul_x > b.lr_x and a.ul_x - b.lr_x < 20): # 2: expression a.classify_heuristic('punctuation.period') # 3: operation return [], [] # 4: added, removed 1. The function signature itself is used to define which classes of glyphs should be applied to the function. Each argument has a Python default value which is a string containing the symbol name or an "symbol name regular expression" that will match the glyph to be passed in. Yes, this is a complete bastardisation of what default arguments are meant for in Python, since these string values will never actually be passed in to the function. However, I think this syntax is convenient and kind of cute. (Another option might be to use some sort of special doc-string syntax, I suppose.) Rules are indexed by the first argument, so it is a good idea to use the least-frequently occuring symbol name (or the class the most clearly defines the structure) as the first argument. A "symbol name regular expression" is an instance of the special-purpose regular expression language for symbol names defined in id_name_matching.py. This syntax is pretty limited compared to standard Python regular expression syntax, but is much more convenient for the task. (For example, 'upper.*' would be 'upper\.[^.]*' as a standard Python regular expression, and nobody wants to write code like that ;) Informal syntax definition: A|B # matches A or B A.B|C # matches A.B or A.C (A.B)|C # matches A.B or C * # multiple-character wildcard ? # single character wildcard () # grouping can be performed with # parentheses [a-z] # matches any character a-z Example expressions: (upper.x)|(lower.y) # match either upper.x or lower.y upper.* # match the 'upper' category upper.a|b|c # matches upper.a, upper.b or upper.c upper.capital_? # ? is a single character wildcard 2. The body of the function, in a literal sense, is left entirely up to the end-user programmer (it's just Python afterall.) However, most rule functions will consist of some sort of test followed by some sort of change (side-effect!!!) of the data. For performing tests that need to be somewhat "fuzzy", you may want to use Fudge objects. Comparisons on Fudge objects have a built-in fuzzy zone around the core int, Point or Rect that make comparing things to be "close enough" easier. (See fudge.py) 3. In the body, the rule function can modify the glyph attributes in any way it sees fit. 4. Optionally, the rule function can return a pair of lists. The first list is of glyphs that have been created by the operation (for instance, if combining two glyphs into one union glyph.) The second list is a list of glyphs that have been removed by the operation (for instance removing noise glyphs.) (If your function returns None, the RuleEngine assumes you meant [], []). These results are appended together each time a set of rules is applied and returned to the caller. Optionally, the rule-performing mechanism can reapply rules to all the newly-created glyphs. PERFORMING RULES: Rules are grouped into RuleEngine classes, which then perform the actually searching and call the rule functions. # Initialise a new rule engine with a couple of rules rule_engine = RuleEngine([rule_function0, rule_function1]) # Run the rules on the given list of glyphs added, removed = rule_engine.perform_rules(glyphs) An optional argument, grid_size, specifies the size of the indexing grid cells. This will affect how far apart symbols can be matched. TODO: There may be at some point some kind of Meta-RuleEngine for performing sets of rules in sequence or parallel or whatever... """ class RuleEngineError(Exception): pass class RuleEngine: _class_rules = [] def __init__(self, rules=[], reapply=0): self.rules = {} self._regexs = {} self._rules_by_regex = {} for rule in rules + self._class_rules: if isfunction(rule): self.add_rule(rule) elif isinstance(rule, RuleEngine): for r in rule.rules: self.add_rule(r) self._reapply = reapply def add_rule(self, rule): import id_name_matching assert len(rule.func_defaults) self.rules[rule] = None regex = rule.func_defaults[0] if not self._rules_by_regex.has_key(regex): self._rules_by_regex[regex] = [] self._rules_by_regex[regex].append(rule) for regex in rule.func_defaults: if not self._regexs.has_key(regex): self._regexs[regex] = id_name_matching.build_id_regex(regex) if not self._rules_by_regex.has_key(regex): self._rules_by_regex[regex] = [] def get_rules(self): return self.rules.keys() def _deal_with_result(self, rule, glyphs, added, removed): try: current_stack = traceback.extract_stack() result = rule(*glyphs) except Exception, e: lines = traceback.format_exception(*exc_info()) del lines[1] exception = ''.join(lines) # We build a dictionary of exceptions in order to remove duplicates self._exceptions.append(exception) return 0 if result is None or result == ([], []): return 0 for a in result[0]: added[a] = None for a in result[1]: removed[a] = None return 1 def perform_rules(self, glyphs, grid_size=100, recurse=0, progress=None, _recursion_level=0): self._exceptions = util.Set() if _recursion_level > 10: return [], [] elif _recursion_level == 0: progress = util.ProgressFactory("Performing rules...") try: grid_index = group.GridIndexWithKeys(glyphs, grid_size, grid_size) found_regexs = {} for regex_string, compiled in self._regexs.items(): for glyph in glyphs: if glyph.match_id_name(compiled): grid_index.add_glyph_by_key(glyph, regex_string) found_regexs[regex_string] = None # This loop is only so the progress bar can do something useful. for regex in found_regexs.iterkeys(): progress.add_length( len(self._rules_by_regex[regex]) * len(grid_index.get_glyphs_by_key(regex))) added = {} removed = {} for regex in found_regexs.iterkeys(): for rule in self._rules_by_regex[regex]: glyph_specs = rule.func_defaults for glyph in grid_index.get_glyphs_by_key(regex): if len(glyph_specs) == 1: self._deal_with_result(rule, (glyph,), added, removed) elif len(glyph_specs) == 2: for glyph2 in grid_index.get_glyphs_around_glyph_by_key( glyph, glyph_specs[1]): stop = self._deal_with_result(rule, (glyph, glyph2), added, removed) if not self._reapply and stop: break else: seed = [list(grid_index.get_glyphs_around_glyph_by_key(glyph, x)) for x in glyph_specs[1:]] for combination in util.combinations(seed): stop = self._deal_with_result(rule, [glyph] + combination, added, removed) if not self._reapply and stop: break progress.step() finally: if _recursion_level == 0: progress.kill() if recurse and len(added): self._deal_with_result( self.perform_rules(added.keys(), 1, progress, _recursion_level + 1)) if len(self._exceptions): s = ("One or more of the rule functions caused an exception.\n" + "(Each exception listed only once):\n\n" + "\n".join(self._exceptions)) raise RuleEngineError(s) return added.keys(), removed.keys() gamera-3.3.3/gamera/stats.py0000644000076500000000000046323311216641434014723 0ustar chriswheel# Copyright (c) 1999-2007 Gary Strangman; All Rights Reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # # Comments and/or additions are welcome (send e-mail to: # strang@nmr.mgh.harvard.edu). # """ stats.py module (Requires pstat.py module.) ################################################# ####### Written by: Gary Strangman ########### ####### Last modified: Dec 18, 2007 ########### ################################################# A collection of basic statistical functions for python. The function names appear below. IMPORTANT: There are really *3* sets of functions. The first set has an 'l' prefix, which can be used with list or tuple arguments. The second set has an 'a' prefix, which can accept NumPy array arguments. These latter functions are defined only when NumPy is available on the system. The third type has NO prefix (i.e., has the name that appears below). Functions of this set are members of a "Dispatch" class, c/o David Ascher. This class allows different functions to be called depending on the type of the passed arguments. Thus, stats.mean is a member of the Dispatch class and stats.mean(range(20)) will call stats.lmean(range(20)) while stats.mean(Numeric.arange(20)) will call stats.amean(Numeric.arange(20)). This is a handy way to keep consistent function names when different argument types require different functions to be called. Having implementated the Dispatch class, however, means that to get info on a given function, you must use the REAL function name ... that is "print stats.lmean.__doc__" or "print stats.amean.__doc__" work fine, while "print stats.mean.__doc__" will print the doc for the Dispatch class. NUMPY FUNCTIONS ('a' prefix) generally have more argument options but should otherwise be consistent with the corresponding list functions. Disclaimers: The function list is obviously incomplete and, worse, the functions are not optimized. All functions have been tested (some more so than others), but they are far from bulletproof. Thus, as with any free software, no warranty or guarantee is expressed or implied. :-) A few extra functions that don't appear in the list below can be found by interested treasure-hunters. These functions don't necessarily have both list and array versions but were deemed useful CENTRAL TENDENCY: geometricmean harmonicmean mean median medianscore mode MOMENTS: moment variation skew kurtosis skewtest (for Numpy arrays only) kurtosistest (for Numpy arrays only) normaltest (for Numpy arrays only) ALTERED VERSIONS: tmean (for Numpy arrays only) tvar (for Numpy arrays only) tmin (for Numpy arrays only) tmax (for Numpy arrays only) tstdev (for Numpy arrays only) tsem (for Numpy arrays only) describe FREQUENCY STATS: itemfreq scoreatpercentile percentileofscore histogram cumfreq relfreq VARIABILITY: obrientransform samplevar samplestdev signaltonoise (for Numpy arrays only) var stdev sterr sem z zs zmap (for Numpy arrays only) TRIMMING FCNS: threshold (for Numpy arrays only) trimboth trim1 round (round all vals to 'n' decimals; Numpy only) CORRELATION FCNS: covariance (for Numpy arrays only) correlation (for Numpy arrays only) paired pearsonr spearmanr pointbiserialr kendalltau linregress INFERENTIAL STATS: ttest_1samp ttest_ind ttest_rel chisquare ks_2samp mannwhitneyu ranksums wilcoxont kruskalwallish friedmanchisquare PROBABILITY CALCS: chisqprob erfcc zprob ksprob fprob betacf gammln betai ANOVA FUNCTIONS: F_oneway F_value SUPPORT FUNCTIONS: writecc incr sign (for Numpy arrays only) sum cumsum ss summult sumdiffsquared square_of_sums shellsort rankdata outputpairedstats findwithin """ ## CHANGE LOG: ## =========== ## 07-11.26 ... conversion for numpy started ## 07-05-16 ... added Lin's Concordance Correlation Coefficient (alincc) and acov ## 05-08-21 ... added "Dice's coefficient" ## 04-10-26 ... added ap2t(), an ugly fcn for converting p-vals to T-vals ## 04-04-03 ... added amasslinregress() function to do regression on N-D arrays ## 03-01-03 ... CHANGED VERSION TO 0.6 ## fixed atsem() to properly handle limits=None case ## improved histogram and median functions (estbinwidth) and ## fixed atvar() function (wrong answers for neg numbers?!?) ## 02-11-19 ... fixed attest_ind and attest_rel for div-by-zero Overflows ## 02-05-10 ... fixed lchisqprob indentation (failed when df=even) ## 00-12-28 ... removed aanova() to separate module, fixed licensing to ## match Python License, fixed doc string & imports ## 00-04-13 ... pulled all "global" statements, except from aanova() ## added/fixed lots of documentation, removed io.py dependency ## changed to version 0.5 ## 99-11-13 ... added asign() function ## 99-11-01 ... changed version to 0.4 ... enough incremental changes now ## 99-10-25 ... added acovariance and acorrelation functions ## 99-10-10 ... fixed askew/akurtosis to avoid divide-by-zero errors ## added aglm function (crude, but will be improved) ## 99-10-04 ... upgraded acumsum, ass, asummult, asamplevar, avar, etc. to ## all handle lists of 'dimension's and keepdims ## REMOVED ar0, ar2, ar3, ar4 and replaced them with around ## reinserted fixes for abetai to avoid math overflows ## 99-09-05 ... rewrote achisqprob/aerfcc/aksprob/afprob/abetacf/abetai to ## handle multi-dimensional arrays (whew!) ## 99-08-30 ... fixed l/amoment, l/askew, l/akurtosis per D'Agostino (1990) ## added anormaltest per same reference ## re-wrote azprob to calc arrays of probs all at once ## 99-08-22 ... edited attest_ind printing section so arrays could be rounded ## 99-08-19 ... fixed amean and aharmonicmean for non-error(!) overflow on ## short/byte arrays (mean of #s btw 100-300 = -150??) ## 99-08-09 ... fixed asum so that the None case works for Byte arrays ## 99-08-08 ... fixed 7/3 'improvement' to handle t-calcs on N-D arrays ## 99-07-03 ... improved attest_ind, attest_rel (zero-division errortrap) ## 99-06-24 ... fixed bug(?) in attest_ind (n1=a.shape[0]) ## 04/11/99 ... added asignaltonoise, athreshold functions, changed all ## max/min in array section to N.maximum/N.minimum, ## fixed square_of_sums to prevent integer overflow ## 04/10/99 ... !!! Changed function name ... sumsquared ==> square_of_sums ## 03/18/99 ... Added ar0, ar2, ar3 and ar4 rounding functions ## 02/28/99 ... Fixed aobrientransform to return an array rather than a list ## 01/15/99 ... Essentially ceased updating list-versions of functions (!!!) ## 01/13/99 ... CHANGED TO VERSION 0.3 ## fixed bug in a/lmannwhitneyu p-value calculation ## 12/31/98 ... fixed variable-name bug in ldescribe ## 12/19/98 ... fixed bug in findwithin (fcns needed pstat. prefix) ## 12/16/98 ... changed amedianscore to return float (not array) for 1 score ## 12/14/98 ... added atmin and atmax functions ## removed umath from import line (not needed) ## l/ageometricmean modified to reduce chance of overflows (take ## nth root first, then multiply) ## 12/07/98 ... added __version__variable (now 0.2) ## removed all 'stats.' from anova() fcn ## 12/06/98 ... changed those functions (except shellsort) that altered ## arguments in-place ... cumsum, ranksort, ... ## updated (and fixed some) doc-strings ## 12/01/98 ... added anova() function (requires NumPy) ## incorporated Dispatch class ## 11/12/98 ... added functionality to amean, aharmonicmean, ageometricmean ## added 'asum' function (added functionality to N.add.reduce) ## fixed both moment and amoment (two errors) ## changed name of skewness and askewness to skew and askew ## fixed (a)histogram (which sometimes counted points =len(inlist)/2.0: cfbin = i break LRL = smallest + binsize*cfbin # get lower read limit of that bin cfbelow = cumhist[cfbin-1] freq = float(hist[cfbin]) # frequency IN the 50%ile bin median = LRL + ((len(inlist)/2.0 - cfbelow)/float(freq))*binsize # median formula return median def lmedianscore (inlist): """ Returns the 'middle' score of the passed list. If there is an even number of scores, the mean of the 2 middle scores is returned. Usage: lmedianscore(inlist) """ newlist = copy.deepcopy(inlist) newlist.sort() if len(newlist) % 2 == 0: # if even number of scores, average middle 2 index = len(newlist)/2 # integer division correct median = float(newlist[index] + newlist[index-1]) /2 else: index = len(newlist)/2 # int divsion gives mid value when count from 0 median = newlist[index] return median def lmode(inlist): """ Returns a list of the modal (most common) score(s) in the passed list. If there is more than one such score, all are returned. The bin-count for the mode(s) is also returned. Usage: lmode(inlist) Returns: bin-count for mode(s), a list of modal value(s) """ scores = pstat.unique(inlist) scores.sort() freq = [] for item in scores: freq.append(inlist.count(item)) maxfreq = max(freq) mode = [] stillmore = 1 while stillmore: try: indx = freq.index(maxfreq) mode.append(scores[indx]) del freq[indx] del scores[indx] except ValueError: stillmore=0 return maxfreq, mode #################################### ############ MOMENTS ############# #################################### def lmoment(inlist,moment=1): """ Calculates the nth moment about the mean for a sample (defaults to the 1st moment). Used to calculate coefficients of skewness and kurtosis. Usage: lmoment(inlist,moment=1) Returns: appropriate moment (r) from ... 1/n * SUM((inlist(i)-mean)**r) """ if moment == 1: return 0.0 else: mn = mean(inlist) n = len(inlist) s = 0 for x in inlist: s = s + (x-mn)**moment return s/float(n) def lvariation(inlist): """ Returns the coefficient of variation, as defined in CRC Standard Probability and Statistics, p.6. Usage: lvariation(inlist) """ return 100.0*samplestdev(inlist)/float(mean(inlist)) def lskew(inlist): """ Returns the skewness of a distribution, as defined in Numerical Recipies (alternate defn in CRC Standard Probability and Statistics, p.6.) Usage: lskew(inlist) """ return moment(inlist,3)/pow(moment(inlist,2),1.5) def lkurtosis(inlist): """ Returns the kurtosis of a distribution, as defined in Numerical Recipies (alternate defn in CRC Standard Probability and Statistics, p.6.) Usage: lkurtosis(inlist) """ return moment(inlist,4)/pow(moment(inlist,2),2.0) def ldescribe(inlist): """ Returns some descriptive statistics of the passed list (assumed to be 1D). Usage: ldescribe(inlist) Returns: n, mean, standard deviation, skew, kurtosis """ n = len(inlist) mm = (min(inlist),max(inlist)) m = mean(inlist) sd = stdev(inlist) sk = skew(inlist) kurt = kurtosis(inlist) return n, mm, m, sd, sk, kurt #################################### ####### FREQUENCY STATS ########## #################################### def litemfreq(inlist): """ Returns a list of pairs. Each pair consists of one of the scores in inlist and it's frequency count. Assumes a 1D list is passed. Usage: litemfreq(inlist) Returns: a 2D frequency table (col [0:n-1]=scores, col n=frequencies) """ scores = pstat.unique(inlist) scores.sort() freq = [] for item in scores: freq.append(inlist.count(item)) return pstat.abut(scores, freq) def lscoreatpercentile (inlist, percent): """ Returns the score at a given percentile relative to the distribution given by inlist. Usage: lscoreatpercentile(inlist,percent) """ if percent > 1: print "\nDividing percent>1 by 100 in lscoreatpercentile().\n" percent = percent / 100.0 targetcf = percent*len(inlist) h, lrl, binsize, extras = histogram(inlist) cumhist = cumsum(copy.deepcopy(h)) for i in range(len(cumhist)): if cumhist[i] >= targetcf: break score = binsize * ((targetcf - cumhist[i-1]) / float(h[i])) + (lrl+binsize*i) return score def lpercentileofscore (inlist, score,histbins=10,defaultlimits=None): """ Returns the percentile value of a score relative to the distribution given by inlist. Formula depends on the values used to histogram the data(!). Usage: lpercentileofscore(inlist,score,histbins=10,defaultlimits=None) """ h, lrl, binsize, extras = histogram(inlist,histbins,defaultlimits) cumhist = cumsum(copy.deepcopy(h)) i = int((score - lrl)/float(binsize)) pct = (cumhist[i-1]+((score-(lrl+binsize*i))/float(binsize))*h[i])/float(len(inlist)) * 100 return pct def lhistogram (inlist,numbins=10,defaultreallimits=None,printextras=0): """ Returns (i) a list of histogram bin counts, (ii) the smallest value of the histogram binning, and (iii) the bin width (the last 2 are not necessarily integers). Default number of bins is 10. If no sequence object is given for defaultreallimits, the routine picks (usually non-pretty) bins spanning all the numbers in the inlist. Usage: lhistogram (inlist, numbins=10, defaultreallimits=None,suppressoutput=0) Returns: list of bin values, lowerreallimit, binsize, extrapoints """ if (defaultreallimits <> None): if type(defaultreallimits) not in [ListType,TupleType] or len(defaultreallimits)==1: # only one limit given, assumed to be lower one & upper is calc'd lowerreallimit = defaultreallimits upperreallimit = 1.000001 * max(inlist) else: # assume both limits given lowerreallimit = defaultreallimits[0] upperreallimit = defaultreallimits[1] binsize = (upperreallimit-lowerreallimit)/float(numbins) else: # no limits given for histogram, both must be calc'd estbinwidth=(max(inlist)-min(inlist))/float(numbins) +1e-6 #1=>cover all binsize = ((max(inlist)-min(inlist)+estbinwidth))/float(numbins) lowerreallimit = min(inlist) - binsize/2 #lower real limit,1st bin bins = [0]*(numbins) extrapoints = 0 for num in inlist: try: if (num-lowerreallimit) < 0: extrapoints = extrapoints + 1 else: bintoincrement = int((num-lowerreallimit)/float(binsize)) bins[bintoincrement] = bins[bintoincrement] + 1 except: extrapoints = extrapoints + 1 if (extrapoints > 0 and printextras == 1): print '\nPoints outside given histogram range =',extrapoints return (bins, lowerreallimit, binsize, extrapoints) def lcumfreq(inlist,numbins=10,defaultreallimits=None): """ Returns a cumulative frequency histogram, using the histogram function. Usage: lcumfreq(inlist,numbins=10,defaultreallimits=None) Returns: list of cumfreq bin values, lowerreallimit, binsize, extrapoints """ h,l,b,e = histogram(inlist,numbins,defaultreallimits) cumhist = cumsum(copy.deepcopy(h)) return cumhist,l,b,e def lrelfreq(inlist,numbins=10,defaultreallimits=None): """ Returns a relative frequency histogram, using the histogram function. Usage: lrelfreq(inlist,numbins=10,defaultreallimits=None) Returns: list of cumfreq bin values, lowerreallimit, binsize, extrapoints """ h,l,b,e = histogram(inlist,numbins,defaultreallimits) for i in range(len(h)): h[i] = h[i]/float(len(inlist)) return h,l,b,e #################################### ##### VARIABILITY FUNCTIONS ###### #################################### def lobrientransform(*args): """ Computes a transform on input data (any number of columns). Used to test for homogeneity of variance prior to running one-way stats. From Maxwell and Delaney, p.112. Usage: lobrientransform(*args) Returns: transformed data for use in an ANOVA """ TINY = 1e-10 k = len(args) n = [0.0]*k v = [0.0]*k m = [0.0]*k nargs = [] for i in range(k): nargs.append(copy.deepcopy(args[i])) n[i] = float(len(nargs[i])) v[i] = var(nargs[i]) m[i] = mean(nargs[i]) for j in range(k): for i in range(n[j]): t1 = (n[j]-1.5)*n[j]*(nargs[j][i]-m[j])**2 t2 = 0.5*v[j]*(n[j]-1.0) t3 = (n[j]-1.0)*(n[j]-2.0) nargs[j][i] = (t1-t2) / float(t3) check = 1 for j in range(k): if v[j] - mean(nargs[j]) > TINY: check = 0 if check <> 1: raise ValueError, 'Problem in obrientransform.' else: return nargs def lsamplevar (inlist): """ Returns the variance of the values in the passed list using N for the denominator (i.e., DESCRIBES the sample variance only). Usage: lsamplevar(inlist) """ n = len(inlist) mn = mean(inlist) deviations = [] for item in inlist: deviations.append(item-mn) return ss(deviations)/float(n) def lsamplestdev (inlist): """ Returns the standard deviation of the values in the passed list using N for the denominator (i.e., DESCRIBES the sample stdev only). Usage: lsamplestdev(inlist) """ return math.sqrt(samplevar(inlist)) def lcov (x,y, keepdims=0): """ Returns the estimated covariance of the values in the passed array (i.e., N-1). Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to return an array with the same number of dimensions as inarray. Usage: lcov(x,y,keepdims=0) """ n = len(x) xmn = mean(x) ymn = mean(y) xdeviations = [0]*len(x) ydeviations = [0]*len(y) for i in range(len(x)): xdeviations[i] = x[i] - xmn ydeviations[i] = y[i] - ymn ss = 0.0 for i in range(len(xdeviations)): ss = ss + xdeviations[i]*ydeviations[i] return ss/float(n-1) def lvar (inlist): """ Returns the variance of the values in the passed list using N-1 for the denominator (i.e., for estimating population variance). Usage: lvar(inlist) """ n = len(inlist) mn = mean(inlist) deviations = [0]*len(inlist) for i in range(len(inlist)): deviations[i] = inlist[i] - mn return ss(deviations)/float(n-1) def lstdev (inlist): """ Returns the standard deviation of the values in the passed list using N-1 in the denominator (i.e., to estimate population stdev). Usage: lstdev(inlist) """ return math.sqrt(var(inlist)) def lsterr(inlist): """ Returns the standard error of the values in the passed list using N-1 in the denominator (i.e., to estimate population standard error). Usage: lsterr(inlist) """ return stdev(inlist) / float(math.sqrt(len(inlist))) def lsem (inlist): """ Returns the estimated standard error of the mean (sx-bar) of the values in the passed list. sem = stdev / sqrt(n) Usage: lsem(inlist) """ sd = stdev(inlist) n = len(inlist) return sd/math.sqrt(n) def lz (inlist, score): """ Returns the z-score for a given input score, given that score and the list from which that score came. Not appropriate for population calculations. Usage: lz(inlist, score) """ z = (score-mean(inlist))/samplestdev(inlist) return z def lzs (inlist): """ Returns a list of z-scores, one for each score in the passed list. Usage: lzs(inlist) """ zscores = [] for item in inlist: zscores.append(z(inlist,item)) return zscores #################################### ####### TRIMMING FUNCTIONS ####### #################################### def ltrimboth (l,proportiontocut): """ Slices off the passed proportion of items from BOTH ends of the passed list (i.e., with proportiontocut=0.1, slices 'leftmost' 10% AND 'rightmost' 10% of scores. Assumes list is sorted by magnitude. Slices off LESS if proportion results in a non-integer slice index (i.e., conservatively slices off proportiontocut). Usage: ltrimboth (l,proportiontocut) Returns: trimmed version of list l """ lowercut = int(proportiontocut*len(l)) uppercut = len(l) - lowercut return l[lowercut:uppercut] def ltrim1 (l,proportiontocut,tail='right'): """ Slices off the passed proportion of items from ONE end of the passed list (i.e., if proportiontocut=0.1, slices off 'leftmost' or 'rightmost' 10% of scores). Slices off LESS if proportion results in a non-integer slice index (i.e., conservatively slices off proportiontocut). Usage: ltrim1 (l,proportiontocut,tail='right') or set tail='left' Returns: trimmed version of list l """ if tail == 'right': lowercut = 0 uppercut = len(l) - int(proportiontocut*len(l)) elif tail == 'left': lowercut = int(proportiontocut*len(l)) uppercut = len(l) return l[lowercut:uppercut] #################################### ##### CORRELATION FUNCTIONS ###### #################################### def lpaired(x,y): """ Interactively determines the type of data and then runs the appropriated statistic for paired group data. Usage: lpaired(x,y) Returns: appropriate statistic name, value, and probability """ samples = '' while samples not in ['i','r','I','R','c','C']: print '\nIndependent or related samples, or correlation (i,r,c): ', samples = raw_input() if samples in ['i','I','r','R']: print '\nComparing variances ...', # USE O'BRIEN'S TEST FOR HOMOGENEITY OF VARIANCE, Maxwell & delaney, p.112 r = obrientransform(x,y) f,p = F_oneway(pstat.colex(r,0),pstat.colex(r,1)) if p<0.05: vartype='unequal, p='+str(round(p,4)) else: vartype='equal' print vartype if samples in ['i','I']: if vartype[0]=='e': t,p = ttest_ind(x,y,0) print '\nIndependent samples t-test: ', round(t,4),round(p,4) else: if len(x)>20 or len(y)>20: z,p = ranksums(x,y) print '\nRank Sums test (NONparametric, n>20): ', round(z,4),round(p,4) else: u,p = mannwhitneyu(x,y) print '\nMann-Whitney U-test (NONparametric, ns<20): ', round(u,4),round(p,4) else: # RELATED SAMPLES if vartype[0]=='e': t,p = ttest_rel(x,y,0) print '\nRelated samples t-test: ', round(t,4),round(p,4) else: t,p = ranksums(x,y) print '\nWilcoxon T-test (NONparametric): ', round(t,4),round(p,4) else: # CORRELATION ANALYSIS corrtype = '' while corrtype not in ['c','C','r','R','d','D']: print '\nIs the data Continuous, Ranked, or Dichotomous (c,r,d): ', corrtype = raw_input() if corrtype in ['c','C']: m,b,r,p,see = linregress(x,y) print '\nLinear regression for continuous variables ...' lol = [['Slope','Intercept','r','Prob','SEestimate'],[round(m,4),round(b,4),round(r,4),round(p,4),round(see,4)]] pstat.printcc(lol) elif corrtype in ['r','R']: r,p = spearmanr(x,y) print '\nCorrelation for ranked variables ...' print "Spearman's r: ",round(r,4),round(p,4) else: # DICHOTOMOUS r,p = pointbiserialr(x,y) print '\nAssuming x contains a dichotomous variable ...' print 'Point Biserial r: ',round(r,4),round(p,4) print '\n\n' return None def lpearsonr(x,y): """ Calculates a Pearson correlation coefficient and the associated probability value. Taken from Heiman's Basic Statistics for the Behav. Sci (2nd), p.195. Usage: lpearsonr(x,y) where x and y are equal-length lists Returns: Pearson's r value, two-tailed p-value """ TINY = 1.0e-30 if len(x) <> len(y): raise ValueError, 'Input values not paired in pearsonr. Aborting.' n = len(x) x = map(float,x) y = map(float,y) xmean = mean(x) ymean = mean(y) r_num = n*(summult(x,y)) - sum(x)*sum(y) r_den = math.sqrt((n*ss(x) - square_of_sums(x))*(n*ss(y)-square_of_sums(y))) r = (r_num / r_den) # denominator already a float df = n-2 t = r*math.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY))) prob = betai(0.5*df,0.5,df/float(df+t*t)) return r, prob def llincc(x,y): """ Calculates Lin's concordance correlation coefficient. Usage: alincc(x,y) where x, y are equal-length arrays Returns: Lin's CC """ covar = lcov(x,y)*(len(x)-1)/float(len(x)) # correct denom to n xvar = lvar(x)*(len(x)-1)/float(len(x)) # correct denom to n yvar = lvar(y)*(len(y)-1)/float(len(y)) # correct denom to n lincc = (2 * covar) / ((xvar+yvar) +((amean(x)-amean(y))**2)) return lincc def lspearmanr(x,y): """ Calculates a Spearman rank-order correlation coefficient. Taken from Heiman's Basic Statistics for the Behav. Sci (1st), p.192. Usage: lspearmanr(x,y) where x and y are equal-length lists Returns: Spearman's r, two-tailed p-value """ TINY = 1e-30 if len(x) <> len(y): raise ValueError, 'Input values not paired in spearmanr. Aborting.' n = len(x) rankx = rankdata(x) ranky = rankdata(y) dsq = sumdiffsquared(rankx,ranky) rs = 1 - 6*dsq / float(n*(n**2-1)) t = rs * math.sqrt((n-2) / ((rs+1.0)*(1.0-rs))) df = n-2 probrs = betai(0.5*df,0.5,df/(df+t*t)) # t already a float # probability values for rs are from part 2 of the spearman function in # Numerical Recipies, p.510. They are close to tables, but not exact. (?) return rs, probrs def lpointbiserialr(x,y): """ Calculates a point-biserial correlation coefficient and the associated probability value. Taken from Heiman's Basic Statistics for the Behav. Sci (1st), p.194. Usage: lpointbiserialr(x,y) where x,y are equal-length lists Returns: Point-biserial r, two-tailed p-value """ TINY = 1e-30 if len(x) <> len(y): raise ValueError, 'INPUT VALUES NOT PAIRED IN pointbiserialr. ABORTING.' data = pstat.abut(x,y) categories = pstat.unique(x) if len(categories) <> 2: raise ValueError, "Exactly 2 categories required for pointbiserialr()." else: # there are 2 categories, continue codemap = pstat.abut(categories,range(2)) recoded = pstat.recode(data,codemap,0) x = pstat.linexand(data,0,categories[0]) y = pstat.linexand(data,0,categories[1]) xmean = mean(pstat.colex(x,1)) ymean = mean(pstat.colex(y,1)) n = len(data) adjust = math.sqrt((len(x)/float(n))*(len(y)/float(n))) rpb = (ymean - xmean)/samplestdev(pstat.colex(data,1))*adjust df = n-2 t = rpb*math.sqrt(df/((1.0-rpb+TINY)*(1.0+rpb+TINY))) prob = betai(0.5*df,0.5,df/(df+t*t)) # t already a float return rpb, prob def lkendalltau(x,y): """ Calculates Kendall's tau ... correlation of ordinal data. Adapted from function kendl1 in Numerical Recipies. Needs good test-routine.@@@ Usage: lkendalltau(x,y) Returns: Kendall's tau, two-tailed p-value """ n1 = 0 n2 = 0 iss = 0 for j in range(len(x)-1): for k in range(j,len(y)): a1 = x[j] - x[k] a2 = y[j] - y[k] aa = a1 * a2 if (aa): # neither list has a tie n1 = n1 + 1 n2 = n2 + 1 if aa > 0: iss = iss + 1 else: iss = iss -1 else: if (a1): n1 = n1 + 1 else: n2 = n2 + 1 tau = iss / math.sqrt(n1*n2) svar = (4.0*len(x)+10.0) / (9.0*len(x)*(len(x)-1)) z = tau / math.sqrt(svar) prob = erfcc(abs(z)/1.4142136) return tau, prob def llinregress(x,y): """ Calculates a regression line on x,y pairs. Usage: llinregress(x,y) x,y are equal-length lists of x-y coordinates Returns: slope, intercept, r, two-tailed prob, sterr-of-estimate """ TINY = 1.0e-20 if len(x) <> len(y): raise ValueError, 'Input values not paired in linregress. Aborting.' n = len(x) x = map(float,x) y = map(float,y) xmean = mean(x) ymean = mean(y) r_num = float(n*(summult(x,y)) - sum(x)*sum(y)) r_den = math.sqrt((n*ss(x) - square_of_sums(x))*(n*ss(y)-square_of_sums(y))) r = r_num / r_den z = 0.5*math.log((1.0+r+TINY)/(1.0-r+TINY)) df = n-2 t = r*math.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY))) prob = betai(0.5*df,0.5,df/(df+t*t)) slope = r_num / float(n*ss(x) - square_of_sums(x)) intercept = ymean - slope*xmean sterrest = math.sqrt(1-r*r)*samplestdev(y) return slope, intercept, r, prob, sterrest #################################### ##### INFERENTIAL STATISTICS ##### #################################### def lttest_1samp(a,popmean,printit=0,name='Sample',writemode='a'): """ Calculates the t-obtained for the independent samples T-test on ONE group of scores a, given a population mean. If printit=1, results are printed to the screen. If printit='filename', the results are output to 'filename' using the given writemode (default=append). Returns t-value, and prob. Usage: lttest_1samp(a,popmean,Name='Sample',printit=0,writemode='a') Returns: t-value, two-tailed prob """ x = mean(a) v = var(a) n = len(a) df = n-1 svar = ((n-1)*v)/float(df) t = (x-popmean)/math.sqrt(svar*(1.0/n)) prob = betai(0.5*df,0.5,float(df)/(df+t*t)) if printit <> 0: statname = 'Single-sample T-test.' outputpairedstats(printit,writemode, 'Population','--',popmean,0,0,0, name,n,x,v,min(a),max(a), statname,t,prob) return t,prob def lttest_ind (a, b, printit=0, name1='Samp1', name2='Samp2', writemode='a'): """ Calculates the t-obtained T-test on TWO INDEPENDENT samples of scores a, and b. From Numerical Recipies, p.483. If printit=1, results are printed to the screen. If printit='filename', the results are output to 'filename' using the given writemode (default=append). Returns t-value, and prob. Usage: lttest_ind(a,b,printit=0,name1='Samp1',name2='Samp2',writemode='a') Returns: t-value, two-tailed prob """ x1 = mean(a) x2 = mean(b) v1 = stdev(a)**2 v2 = stdev(b)**2 n1 = len(a) n2 = len(b) df = n1+n2-2 svar = ((n1-1)*v1+(n2-1)*v2)/float(df) t = (x1-x2)/math.sqrt(svar*(1.0/n1 + 1.0/n2)) prob = betai(0.5*df,0.5,df/(df+t*t)) if printit <> 0: statname = 'Independent samples T-test.' outputpairedstats(printit,writemode, name1,n1,x1,v1,min(a),max(a), name2,n2,x2,v2,min(b),max(b), statname,t,prob) return t,prob def lttest_rel (a,b,printit=0,name1='Sample1',name2='Sample2',writemode='a'): """ Calculates the t-obtained T-test on TWO RELATED samples of scores, a and b. From Numerical Recipies, p.483. If printit=1, results are printed to the screen. If printit='filename', the results are output to 'filename' using the given writemode (default=append). Returns t-value, and prob. Usage: lttest_rel(a,b,printit=0,name1='Sample1',name2='Sample2',writemode='a') Returns: t-value, two-tailed prob """ if len(a)<>len(b): raise ValueError, 'Unequal length lists in ttest_rel.' x1 = mean(a) x2 = mean(b) v1 = var(a) v2 = var(b) n = len(a) cov = 0 for i in range(len(a)): cov = cov + (a[i]-x1) * (b[i]-x2) df = n-1 cov = cov / float(df) sd = math.sqrt((v1+v2 - 2.0*cov)/float(n)) t = (x1-x2)/sd prob = betai(0.5*df,0.5,df/(df+t*t)) if printit <> 0: statname = 'Related samples T-test.' outputpairedstats(printit,writemode, name1,n,x1,v1,min(a),max(a), name2,n,x2,v2,min(b),max(b), statname,t,prob) return t, prob def lchisquare(f_obs,f_exp=None): """ Calculates a one-way chi square for list of observed frequencies and returns the result. If no expected frequencies are given, the total N is assumed to be equally distributed across all groups. Usage: lchisquare(f_obs, f_exp=None) f_obs = list of observed cell freq. Returns: chisquare-statistic, associated p-value """ k = len(f_obs) # number of groups if f_exp == None: f_exp = [sum(f_obs)/float(k)] * len(f_obs) # create k bins with = freq. chisq = 0 for i in range(len(f_obs)): chisq = chisq + (f_obs[i]-f_exp[i])**2 / float(f_exp[i]) return chisq, chisqprob(chisq, k-1) def lks_2samp (data1,data2): """ Computes the Kolmogorov-Smirnof statistic on 2 samples. From Numerical Recipies in C, page 493. Usage: lks_2samp(data1,data2) data1&2 are lists of values for 2 conditions Returns: KS D-value, associated p-value """ j1 = 0 j2 = 0 fn1 = 0.0 fn2 = 0.0 n1 = len(data1) n2 = len(data2) en1 = n1 en2 = n2 d = 0.0 data1.sort() data2.sort() while j1 < n1 and j2 < n2: d1=data1[j1] d2=data2[j2] if d1 <= d2: fn1 = (j1)/float(en1) j1 = j1 + 1 if d2 <= d1: fn2 = (j2)/float(en2) j2 = j2 + 1 dt = (fn2-fn1) if math.fabs(dt) > math.fabs(d): d = dt try: en = math.sqrt(en1*en2/float(en1+en2)) prob = ksprob((en+0.12+0.11/en)*abs(d)) except: prob = 1.0 return d, prob def lmannwhitneyu(x,y): """ Calculates a Mann-Whitney U statistic on the provided scores and returns the result. Use only when the n in each condition is < 20 and you have 2 independent samples of ranks. NOTE: Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U found in the tables. Equivalent to Kruskal-Wallis H with just 2 groups. Usage: lmannwhitneyu(data) Returns: u-statistic, one-tailed p-value (i.e., p(z(U))) """ n1 = len(x) n2 = len(y) ranked = rankdata(x+y) rankx = ranked[0:n1] # get the x-ranks ranky = ranked[n1:] # the rest are y-ranks u1 = n1*n2 + (n1*(n1+1))/2.0 - sum(rankx) # calc U for x u2 = n1*n2 - u1 # remainder is U for y bigu = max(u1,u2) smallu = min(u1,u2) T = math.sqrt(tiecorrect(ranked)) # correction factor for tied scores if T == 0: raise ValueError, 'All numbers are identical in lmannwhitneyu' sd = math.sqrt(T*n1*n2*(n1+n2+1)/12.0) z = abs((bigu-n1*n2/2.0) / sd) # normal approximation for prob calc return smallu, 1.0 - zprob(z) def ltiecorrect(rankvals): """ Corrects for ties in Mann Whitney U and Kruskal Wallis H tests. See Siegel, S. (1956) Nonparametric Statistics for the Behavioral Sciences. New York: McGraw-Hill. Code adapted from |Stat rankind.c code. Usage: ltiecorrect(rankvals) Returns: T correction factor for U or H """ sorted,posn = shellsort(rankvals) n = len(sorted) T = 0.0 i = 0 while (i 20 and you have 2 independent samples of ranks. Usage: lranksums(x,y) Returns: a z-statistic, two-tailed p-value """ n1 = len(x) n2 = len(y) alldata = x+y ranked = rankdata(alldata) x = ranked[:n1] y = ranked[n1:] s = sum(x) expected = n1*(n1+n2+1) / 2.0 z = (s - expected) / math.sqrt(n1*n2*(n1+n2+1)/12.0) prob = 2*(1.0 -zprob(abs(z))) return z, prob def lwilcoxont(x,y): """ Calculates the Wilcoxon T-test for related samples and returns the result. A non-parametric T-test. Usage: lwilcoxont(x,y) Returns: a t-statistic, two-tail probability estimate """ if len(x) <> len(y): raise ValueError, 'Unequal N in wilcoxont. Aborting.' d=[] for i in range(len(x)): diff = x[i] - y[i] if diff <> 0: d.append(diff) count = len(d) absd = map(abs,d) absranked = rankdata(absd) r_plus = 0.0 r_minus = 0.0 for i in range(len(absd)): if d[i] < 0: r_minus = r_minus + absranked[i] else: r_plus = r_plus + absranked[i] wt = min(r_plus, r_minus) mn = count * (count+1) * 0.25 se = math.sqrt(count*(count+1)*(2.0*count+1.0)/24.0) z = math.fabs(wt-mn) / se prob = 2*(1.0 -zprob(abs(z))) return wt, prob def lkruskalwallish(*args): """ The Kruskal-Wallis H-test is a non-parametric ANOVA for 3 or more groups, requiring at least 5 subjects in each group. This function calculates the Kruskal-Wallis H-test for 3 or more independent samples and returns the result. Usage: lkruskalwallish(*args) Returns: H-statistic (corrected for ties), associated p-value """ args = list(args) n = [0]*len(args) all = [] n = map(len,args) for i in range(len(args)): all = all + args[i] ranked = rankdata(all) T = tiecorrect(ranked) for i in range(len(args)): args[i] = ranked[0:n[i]] del ranked[0:n[i]] rsums = [] for i in range(len(args)): rsums.append(sum(args[i])**2) rsums[i] = rsums[i] / float(n[i]) ssbn = sum(rsums) totaln = sum(n) h = 12.0 / (totaln*(totaln+1)) * ssbn - 3*(totaln+1) df = len(args) - 1 if T == 0: raise ValueError, 'All numbers are identical in lkruskalwallish' h = h / float(T) return h, chisqprob(h,df) def lfriedmanchisquare(*args): """ Friedman Chi-Square is a non-parametric, one-way within-subjects ANOVA. This function calculates the Friedman Chi-square test for repeated measures and returns the result, along with the associated probability value. It assumes 3 or more repeated measures. Only 3 levels requires a minimum of 10 subjects in the study. Four levels requires 5 subjects per level(??). Usage: lfriedmanchisquare(*args) Returns: chi-square statistic, associated p-value """ k = len(args) if k < 3: raise ValueError, 'Less than 3 levels. Friedman test not appropriate.' n = len(args[0]) data = apply(pstat.abut,tuple(args)) for i in range(len(data)): data[i] = rankdata(data[i]) ssbn = 0 for i in range(k): ssbn = ssbn + sum(args[i])**2 chisq = 12.0 / (k*n*(k+1)) * ssbn - 3*n*(k+1) return chisq, chisqprob(chisq,k-1) #################################### #### PROBABILITY CALCULATIONS #### #################################### def lchisqprob(chisq,df): """ Returns the (1-tailed) probability value associated with the provided chi-square value and df. Adapted from chisq.c in Gary Perlman's |Stat. Usage: lchisqprob(chisq,df) """ BIG = 20.0 def ex(x): BIG = 20.0 if x < -BIG: return 0.0 else: return math.exp(x) if chisq <=0 or df < 1: return 1.0 a = 0.5 * chisq if df%2 == 0: even = 1 else: even = 0 if df > 1: y = ex(-a) if even: s = y else: s = 2.0 * zprob(-math.sqrt(chisq)) if (df > 2): chisq = 0.5 * (df - 1.0) if even: z = 1.0 else: z = 0.5 if a > BIG: if even: e = 0.0 else: e = math.log(math.sqrt(math.pi)) c = math.log(a) while (z <= chisq): e = math.log(z) + e s = s + ex(c*z-a-e) z = z + 1.0 return s else: if even: e = 1.0 else: e = 1.0 / math.sqrt(math.pi) / math.sqrt(a) c = 0.0 while (z <= chisq): e = e * (a/float(z)) c = c + e z = z + 1.0 return (c*y+s) else: return s def lerfcc(x): """ Returns the complementary error function erfc(x) with fractional error everywhere less than 1.2e-7. Adapted from Numerical Recipies. Usage: lerfcc(x) """ z = abs(x) t = 1.0 / (1.0+0.5*z) ans = t * math.exp(-z*z-1.26551223 + t*(1.00002368+t*(0.37409196+t*(0.09678418+t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+t*(-0.82215223+t*0.17087277))))))))) if x >= 0: return ans else: return 2.0 - ans def lzprob(z): """ Returns the area under the normal curve 'to the left of' the given z value. Thus, for z<0, zprob(z) = 1-tail probability for z>0, 1.0-zprob(z) = 1-tail probability for any z, 2.0*(1.0-zprob(abs(z))) = 2-tail probability Adapted from z.c in Gary Perlman's |Stat. Usage: lzprob(z) """ Z_MAX = 6.0 # maximum meaningful z-value if z == 0.0: x = 0.0 else: y = 0.5 * math.fabs(z) if y >= (Z_MAX*0.5): x = 1.0 elif (y < 1.0): w = y*y x = ((((((((0.000124818987 * w -0.001075204047) * w +0.005198775019) * w -0.019198292004) * w +0.059054035642) * w -0.151968751364) * w +0.319152932694) * w -0.531923007300) * w +0.797884560593) * y * 2.0 else: y = y - 2.0 x = (((((((((((((-0.000045255659 * y +0.000152529290) * y -0.000019538132) * y -0.000676904986) * y +0.001390604284) * y -0.000794620820) * y -0.002034254874) * y +0.006549791214) * y -0.010557625006) * y +0.011630447319) * y -0.009279453341) * y +0.005353579108) * y -0.002141268741) * y +0.000535310849) * y +0.999936657524 if z > 0.0: prob = ((x+1.0)*0.5) else: prob = ((1.0-x)*0.5) return prob def lksprob(alam): """ Computes a Kolmolgorov-Smirnov t-test significance level. Adapted from Numerical Recipies. Usage: lksprob(alam) """ fac = 2.0 sum = 0.0 termbf = 0.0 a2 = -2.0*alam*alam for j in range(1,201): term = fac*math.exp(a2*j*j) sum = sum + term if math.fabs(term) <= (0.001*termbf) or math.fabs(term) < (1.0e-8*sum): return sum fac = -fac termbf = math.fabs(term) return 1.0 # Get here only if fails to converge; was 0.0!! def lfprob (dfnum, dfden, F): """ Returns the (1-tailed) significance level (p-value) of an F statistic given the degrees of freedom for the numerator (dfR-dfF) and the degrees of freedom for the denominator (dfF). Usage: lfprob(dfnum, dfden, F) where usually dfnum=dfbn, dfden=dfwn """ p = betai(0.5*dfden, 0.5*dfnum, dfden/float(dfden+dfnum*F)) return p def lbetacf(a,b,x): """ This function evaluates the continued fraction form of the incomplete Beta function, betai. (Adapted from: Numerical Recipies in C.) Usage: lbetacf(a,b,x) """ ITMAX = 200 EPS = 3.0e-7 bm = az = am = 1.0 qab = a+b qap = a+1.0 qam = a-1.0 bz = 1.0-qab*x/qap for i in range(ITMAX+1): em = float(i+1) tem = em + em d = em*(b-em)*x/((qam+tem)*(a+tem)) ap = az + d*am bp = bz+d*bm d = -(a+em)*(qab+em)*x/((qap+tem)*(a+tem)) app = ap+d*az bpp = bp+d*bz aold = az am = ap/bpp bm = bp/bpp az = app/bpp bz = 1.0 if (abs(az-aold)<(EPS*abs(az))): return az print 'a or b too big, or ITMAX too small in Betacf.' def lgammln(xx): """ Returns the gamma function of xx. Gamma(z) = Integral(0,infinity) of t^(z-1)exp(-t) dt. (Adapted from: Numerical Recipies in C.) Usage: lgammln(xx) """ coeff = [76.18009173, -86.50532033, 24.01409822, -1.231739516, 0.120858003e-2, -0.536382e-5] x = xx - 1.0 tmp = x + 5.5 tmp = tmp - (x+0.5)*math.log(tmp) ser = 1.0 for j in range(len(coeff)): x = x + 1 ser = ser + coeff[j]/x return -tmp + math.log(2.50662827465*ser) def lbetai(a,b,x): """ Returns the incomplete beta function: I-sub-x(a,b) = 1/B(a,b)*(Integral(0,x) of t^(a-1)(1-t)^(b-1) dt) where a,b>0 and B(a,b) = G(a)*G(b)/(G(a+b)) where G(a) is the gamma function of a. The continued fraction formulation is implemented here, using the betacf function. (Adapted from: Numerical Recipies in C.) Usage: lbetai(a,b,x) """ if (x<0.0 or x>1.0): raise ValueError, 'Bad x in lbetai' if (x==0.0 or x==1.0): bt = 0.0 else: bt = math.exp(gammln(a+b)-gammln(a)-gammln(b)+a*math.log(x)+b* math.log(1.0-x)) if (x<(a+1.0)/(a+b+2.0)): return bt*betacf(a,b,x)/float(a) else: return 1.0-bt*betacf(b,a,1.0-x)/float(b) #################################### ####### ANOVA CALCULATIONS ####### #################################### def lF_oneway(*lists): """ Performs a 1-way ANOVA, returning an F-value and probability given any number of groups. From Heiman, pp.394-7. Usage: F_oneway(*lists) where *lists is any number of lists, one per treatment group Returns: F value, one-tailed p-value """ a = len(lists) # ANOVA on 'a' groups, each in it's own list means = [0]*a vars = [0]*a ns = [0]*a alldata = [] tmp = map(N.array,lists) means = map(amean,tmp) vars = map(avar,tmp) ns = map(len,lists) for i in range(len(lists)): alldata = alldata + lists[i] alldata = N.array(alldata) bign = len(alldata) sstot = ass(alldata)-(asquare_of_sums(alldata)/float(bign)) ssbn = 0 for list in lists: ssbn = ssbn + asquare_of_sums(N.array(list))/float(len(list)) ssbn = ssbn - (asquare_of_sums(alldata)/float(bign)) sswn = sstot-ssbn dfbn = a-1 dfwn = bign - a msb = ssbn/float(dfbn) msw = sswn/float(dfwn) f = msb/msw prob = fprob(dfbn,dfwn,f) return f, prob def lF_value (ER,EF,dfnum,dfden): """ Returns an F-statistic given the following: ER = error associated with the null hypothesis (the Restricted model) EF = error associated with the alternate hypothesis (the Full model) dfR-dfF = degrees of freedom of the numerator dfF = degrees of freedom associated with the denominator/Full model Usage: lF_value(ER,EF,dfnum,dfden) """ return ((ER-EF)/float(dfnum) / (EF/float(dfden))) #################################### ######## SUPPORT FUNCTIONS ####### #################################### def writecc (listoflists,file,writetype='w',extra=2): """ Writes a list of lists to a file in columns, customized by the max size of items within the columns (max size of items in col, +2 characters) to specified file. File-overwrite is the default. Usage: writecc (listoflists,file,writetype='w',extra=2) Returns: None """ if type(listoflists[0]) not in [ListType,TupleType]: listoflists = [listoflists] outfile = open(file,writetype) rowstokill = [] list2print = copy.deepcopy(listoflists) for i in range(len(listoflists)): if listoflists[i] == ['\n'] or listoflists[i]=='\n' or listoflists[i]=='dashes': rowstokill = rowstokill + [i] rowstokill.reverse() for row in rowstokill: del list2print[row] maxsize = [0]*len(list2print[0]) for col in range(len(list2print[0])): items = pstat.colex(list2print,col) items = map(pstat.makestr,items) maxsize[col] = max(map(len,items)) + extra for row in listoflists: if row == ['\n'] or row == '\n': outfile.write('\n') elif row == ['dashes'] or row == 'dashes': dashes = [0]*len(maxsize) for j in range(len(maxsize)): dashes[j] = '-'*(maxsize[j]-2) outfile.write(pstat.lineincustcols(dashes,maxsize)) else: outfile.write(pstat.lineincustcols(row,maxsize)) outfile.write('\n') outfile.close() return None def lincr(l,cap): # to increment a list up to a max-list of 'cap' """ Simulate a counting system from an n-dimensional list. Usage: lincr(l,cap) l=list to increment, cap=max values for each list pos'n Returns: next set of values for list l, OR -1 (if overflow) """ l[0] = l[0] + 1 # e.g., [0,0,0] --> [2,4,3] (=cap) for i in range(len(l)): if l[i] > cap[i] and i < len(l)-1: # if carryover AND not done l[i] = 0 l[i+1] = l[i+1] + 1 elif l[i] > cap[i] and i == len(l)-1: # overflow past last column, must be finished l = -1 return l def lsum (inlist): """ Returns the sum of the items in the passed list. Usage: lsum(inlist) """ s = 0 for item in inlist: s = s + item return s def lcumsum (inlist): """ Returns a list consisting of the cumulative sum of the items in the passed list. Usage: lcumsum(inlist) """ newlist = copy.deepcopy(inlist) for i in range(1,len(newlist)): newlist[i] = newlist[i] + newlist[i-1] return newlist def lss(inlist): """ Squares each value in the passed list, adds up these squares and returns the result. Usage: lss(inlist) """ ss = 0 for item in inlist: ss = ss + item*item return ss def lsummult (list1,list2): """ Multiplies elements in list1 and list2, element by element, and returns the sum of all resulting multiplications. Must provide equal length lists. Usage: lsummult(list1,list2) """ if len(list1) <> len(list2): raise ValueError, "Lists not equal length in summult." s = 0 for item1,item2 in pstat.abut(list1,list2): s = s + item1*item2 return s def lsumdiffsquared(x,y): """ Takes pairwise differences of the values in lists x and y, squares these differences, and returns the sum of these squares. Usage: lsumdiffsquared(x,y) Returns: sum[(x[i]-y[i])**2] """ sds = 0 for i in range(len(x)): sds = sds + (x[i]-y[i])**2 return sds def lsquare_of_sums(inlist): """ Adds the values in the passed list, squares the sum, and returns the result. Usage: lsquare_of_sums(inlist) Returns: sum(inlist[i])**2 """ s = sum(inlist) return float(s)*s def lshellsort(inlist): """ Shellsort algorithm. Sorts a 1D-list. Usage: lshellsort(inlist) Returns: sorted-inlist, sorting-index-vector (for original list) """ n = len(inlist) svec = copy.deepcopy(inlist) ivec = range(n) gap = n/2 # integer division needed while gap >0: for i in range(gap,n): for j in range(i-gap,-1,-gap): while j>=0 and svec[j]>svec[j+gap]: temp = svec[j] svec[j] = svec[j+gap] svec[j+gap] = temp itemp = ivec[j] ivec[j] = ivec[j+gap] ivec[j+gap] = itemp gap = gap / 2 # integer division needed # svec is now sorted inlist, and ivec has the order svec[i] = vec[ivec[i]] return svec, ivec def lrankdata(inlist): """ Ranks the data in inlist, dealing with ties appropritely. Assumes a 1D inlist. Adapted from Gary Perlman's |Stat ranksort. Usage: lrankdata(inlist) Returns: a list of length equal to inlist, containing rank scores """ n = len(inlist) svec, ivec = shellsort(inlist) sumranks = 0 dupcount = 0 newlist = [0]*n for i in range(n): sumranks = sumranks + i dupcount = dupcount + 1 if i==n-1 or svec[i] <> svec[i+1]: averank = sumranks / float(dupcount) + 1 for j in range(i-dupcount+1,i+1): newlist[ivec[j]] = averank sumranks = 0 dupcount = 0 return newlist def outputpairedstats(fname,writemode,name1,n1,m1,se1,min1,max1,name2,n2,m2,se2,min2,max2,statname,stat,prob): """ Prints or write to a file stats for two groups, using the name, n, mean, sterr, min and max for each group, as well as the statistic name, its value, and the associated p-value. Usage: outputpairedstats(fname,writemode, name1,n1,mean1,stderr1,min1,max1, name2,n2,mean2,stderr2,min2,max2, statname,stat,prob) Returns: None """ suffix = '' # for *s after the p-value try: x = prob.shape prob = prob[0] except: pass if prob < 0.001: suffix = ' ***' elif prob < 0.01: suffix = ' **' elif prob < 0.05: suffix = ' *' title = [['Name','N','Mean','SD','Min','Max']] lofl = title+[[name1,n1,round(m1,3),round(math.sqrt(se1),3),min1,max1], [name2,n2,round(m2,3),round(math.sqrt(se2),3),min2,max2]] if type(fname)<>StringType or len(fname)==0: print print statname print pstat.printcc(lofl) print try: if stat.shape == (): stat = stat[0] if prob.shape == (): prob = prob[0] except: pass print 'Test statistic = ',round(stat,3),' p = ',round(prob,3),suffix print else: file = open(fname,writemode) file.write('\n'+statname+'\n\n') file.close() writecc(lofl,fname,'a') file = open(fname,'a') try: if stat.shape == (): stat = stat[0] if prob.shape == (): prob = prob[0] except: pass file.write(pstat.list2string(['\nTest statistic = ',round(stat,4),' p = ',round(prob,4),suffix,'\n\n'])) file.close() return None def lfindwithin (data): """ Returns an integer representing a binary vector, where 1=within- subject factor, 0=between. Input equals the entire data 2D list (i.e., column 0=random factor, column -1=measured values (those two are skipped). Note: input data is in |Stat format ... a list of lists ("2D list") with one row per measured value, first column=subject identifier, last column= score, one in-between column per factor (these columns contain level designations on each factor). See also stats.anova.__doc__. Usage: lfindwithin(data) data in |Stat format """ numfact = len(data[0])-1 withinvec = 0 for col in range(1,numfact): examplelevel = pstat.unique(pstat.colex(data,col))[0] rows = pstat.linexand(data,col,examplelevel) # get 1 level of this factor factsubjs = pstat.unique(pstat.colex(rows,0)) allsubjs = pstat.unique(pstat.colex(data,0)) if len(factsubjs) == len(allsubjs): # fewer Ss than scores on this factor? withinvec = withinvec + (1 << col) return withinvec ######################################################### ######################################################### ####### DISPATCH LISTS AND TUPLES TO ABOVE FCNS ######### ######################################################### ######################################################### ## CENTRAL TENDENCY: geometricmean = Dispatch ( (lgeometricmean, (ListType, TupleType)), ) harmonicmean = Dispatch ( (lharmonicmean, (ListType, TupleType)), ) mean = Dispatch ( (lmean, (ListType, TupleType)), ) median = Dispatch ( (lmedian, (ListType, TupleType)), ) medianscore = Dispatch ( (lmedianscore, (ListType, TupleType)), ) mode = Dispatch ( (lmode, (ListType, TupleType)), ) ## MOMENTS: moment = Dispatch ( (lmoment, (ListType, TupleType)), ) variation = Dispatch ( (lvariation, (ListType, TupleType)), ) skew = Dispatch ( (lskew, (ListType, TupleType)), ) kurtosis = Dispatch ( (lkurtosis, (ListType, TupleType)), ) describe = Dispatch ( (ldescribe, (ListType, TupleType)), ) ## FREQUENCY STATISTICS: itemfreq = Dispatch ( (litemfreq, (ListType, TupleType)), ) scoreatpercentile = Dispatch ( (lscoreatpercentile, (ListType, TupleType)), ) percentileofscore = Dispatch ( (lpercentileofscore, (ListType, TupleType)), ) histogram = Dispatch ( (lhistogram, (ListType, TupleType)), ) cumfreq = Dispatch ( (lcumfreq, (ListType, TupleType)), ) relfreq = Dispatch ( (lrelfreq, (ListType, TupleType)), ) ## VARIABILITY: obrientransform = Dispatch ( (lobrientransform, (ListType, TupleType)), ) samplevar = Dispatch ( (lsamplevar, (ListType, TupleType)), ) samplestdev = Dispatch ( (lsamplestdev, (ListType, TupleType)), ) var = Dispatch ( (lvar, (ListType, TupleType)), ) stdev = Dispatch ( (lstdev, (ListType, TupleType)), ) sterr = Dispatch ( (lsterr, (ListType, TupleType)), ) sem = Dispatch ( (lsem, (ListType, TupleType)), ) z = Dispatch ( (lz, (ListType, TupleType)), ) zs = Dispatch ( (lzs, (ListType, TupleType)), ) ## TRIMMING FCNS: trimboth = Dispatch ( (ltrimboth, (ListType, TupleType)), ) trim1 = Dispatch ( (ltrim1, (ListType, TupleType)), ) ## CORRELATION FCNS: paired = Dispatch ( (lpaired, (ListType, TupleType)), ) pearsonr = Dispatch ( (lpearsonr, (ListType, TupleType)), ) spearmanr = Dispatch ( (lspearmanr, (ListType, TupleType)), ) pointbiserialr = Dispatch ( (lpointbiserialr, (ListType, TupleType)), ) kendalltau = Dispatch ( (lkendalltau, (ListType, TupleType)), ) linregress = Dispatch ( (llinregress, (ListType, TupleType)), ) ## INFERENTIAL STATS: ttest_1samp = Dispatch ( (lttest_1samp, (ListType, TupleType)), ) ttest_ind = Dispatch ( (lttest_ind, (ListType, TupleType)), ) ttest_rel = Dispatch ( (lttest_rel, (ListType, TupleType)), ) chisquare = Dispatch ( (lchisquare, (ListType, TupleType)), ) ks_2samp = Dispatch ( (lks_2samp, (ListType, TupleType)), ) mannwhitneyu = Dispatch ( (lmannwhitneyu, (ListType, TupleType)), ) ranksums = Dispatch ( (lranksums, (ListType, TupleType)), ) tiecorrect = Dispatch ( (ltiecorrect, (ListType, TupleType)), ) wilcoxont = Dispatch ( (lwilcoxont, (ListType, TupleType)), ) kruskalwallish = Dispatch ( (lkruskalwallish, (ListType, TupleType)), ) friedmanchisquare = Dispatch ( (lfriedmanchisquare, (ListType, TupleType)), ) ## PROBABILITY CALCS: chisqprob = Dispatch ( (lchisqprob, (IntType, FloatType)), ) zprob = Dispatch ( (lzprob, (IntType, FloatType)), ) ksprob = Dispatch ( (lksprob, (IntType, FloatType)), ) fprob = Dispatch ( (lfprob, (IntType, FloatType)), ) betacf = Dispatch ( (lbetacf, (IntType, FloatType)), ) betai = Dispatch ( (lbetai, (IntType, FloatType)), ) erfcc = Dispatch ( (lerfcc, (IntType, FloatType)), ) gammln = Dispatch ( (lgammln, (IntType, FloatType)), ) ## ANOVA FUNCTIONS: F_oneway = Dispatch ( (lF_oneway, (ListType, TupleType)), ) F_value = Dispatch ( (lF_value, (ListType, TupleType)), ) ## SUPPORT FUNCTIONS: incr = Dispatch ( (lincr, (ListType, TupleType)), ) sum = Dispatch ( (lsum, (ListType, TupleType)), ) cumsum = Dispatch ( (lcumsum, (ListType, TupleType)), ) ss = Dispatch ( (lss, (ListType, TupleType)), ) summult = Dispatch ( (lsummult, (ListType, TupleType)), ) square_of_sums = Dispatch ( (lsquare_of_sums, (ListType, TupleType)), ) sumdiffsquared = Dispatch ( (lsumdiffsquared, (ListType, TupleType)), ) shellsort = Dispatch ( (lshellsort, (ListType, TupleType)), ) rankdata = Dispatch ( (lrankdata, (ListType, TupleType)), ) findwithin = Dispatch ( (lfindwithin, (ListType, TupleType)), ) #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== #============= THE ARRAY-VERSION OF THE STATS FUNCTIONS =============== try: # DEFINE THESE *ONLY* IF NUMERIC IS AVAILABLE import numpy as N import numpy.linalg as LA ##################################### ######## ACENTRAL TENDENCY ######## ##################################### def ageometricmean (inarray,dimension=None,keepdims=0): """ Calculates the geometric mean of the values in the passed array. That is: n-th root of (x1 * x2 * ... * xn). Defaults to ALL values in the passed array. Use dimension=None to flatten array first. REMEMBER: if dimension=0, it collapses over dimension 0 ('rows' in a 2D array) only, and if dimension is a sequence, it collapses over all specified dimensions. If keepdims is set to 1, the resulting array will have as many dimensions as inarray, with only 1 'level' per dim that was collapsed over. Usage: ageometricmean(inarray,dimension=None,keepdims=0) Returns: geometric mean computed over dim(s) listed in dimension """ inarray = N.array(inarray,N.float_) if dimension == None: inarray = N.ravel(inarray) size = len(inarray) mult = N.power(inarray,1.0/size) mult = N.multiply.reduce(mult) elif type(dimension) in [IntType,FloatType]: size = inarray.shape[dimension] mult = N.power(inarray,1.0/size) mult = N.multiply.reduce(mult,dimension) if keepdims == 1: shp = list(inarray.shape) shp[dimension] = 1 sum = N.reshape(sum,shp) else: # must be a SEQUENCE of dims to average over dims = list(dimension) dims.sort() dims.reverse() size = N.array(N.multiply.reduce(N.take(inarray.shape,dims)),N.float_) mult = N.power(inarray,1.0/size) for dim in dims: mult = N.multiply.reduce(mult,dim) if keepdims == 1: shp = list(inarray.shape) for dim in dims: shp[dim] = 1 mult = N.reshape(mult,shp) return mult def aharmonicmean (inarray,dimension=None,keepdims=0): """ Calculates the harmonic mean of the values in the passed array. That is: n / (1/x1 + 1/x2 + ... + 1/xn). Defaults to ALL values in the passed array. Use dimension=None to flatten array first. REMEMBER: if dimension=0, it collapses over dimension 0 ('rows' in a 2D array) only, and if dimension is a sequence, it collapses over all specified dimensions. If keepdims is set to 1, the resulting array will have as many dimensions as inarray, with only 1 'level' per dim that was collapsed over. Usage: aharmonicmean(inarray,dimension=None,keepdims=0) Returns: harmonic mean computed over dim(s) in dimension """ inarray = inarray.astype(N.float_) if dimension == None: inarray = N.ravel(inarray) size = len(inarray) s = N.add.reduce(1.0 / inarray) elif type(dimension) in [IntType,FloatType]: size = float(inarray.shape[dimension]) s = N.add.reduce(1.0/inarray, dimension) if keepdims == 1: shp = list(inarray.shape) shp[dimension] = 1 s = N.reshape(s,shp) else: # must be a SEQUENCE of dims to average over dims = list(dimension) dims.sort() nondims = [] for i in range(len(inarray.shape)): if i not in dims: nondims.append(i) tinarray = N.transpose(inarray,nondims+dims) # put keep-dims first idx = [0] *len(nondims) if idx == []: size = len(N.ravel(inarray)) s = asum(1.0 / inarray) if keepdims == 1: s = N.reshape([s],N.ones(len(inarray.shape))) else: idx[0] = -1 loopcap = N.array(tinarray.shape[0:len(nondims)]) -1 s = N.zeros(loopcap+1,N.float_) while incr(idx,loopcap) <> -1: s[idx] = asum(1.0/tinarray[idx]) size = N.multiply.reduce(N.take(inarray.shape,dims)) if keepdims == 1: shp = list(inarray.shape) for dim in dims: shp[dim] = 1 s = N.reshape(s,shp) return size / s def amean (inarray,dimension=None,keepdims=0): """ Calculates the arithmatic mean of the values in the passed array. That is: 1/n * (x1 + x2 + ... + xn). Defaults to ALL values in the passed array. Use dimension=None to flatten array first. REMEMBER: if dimension=0, it collapses over dimension 0 ('rows' in a 2D array) only, and if dimension is a sequence, it collapses over all specified dimensions. If keepdims is set to 1, the resulting array will have as many dimensions as inarray, with only 1 'level' per dim that was collapsed over. Usage: amean(inarray,dimension=None,keepdims=0) Returns: arithematic mean calculated over dim(s) in dimension """ if inarray.dtype in [N.int_, N.short,N.ubyte]: inarray = inarray.astype(N.float_) if dimension == None: inarray = N.ravel(inarray) sum = N.add.reduce(inarray) denom = float(len(inarray)) elif type(dimension) in [IntType,FloatType]: sum = asum(inarray,dimension) denom = float(inarray.shape[dimension]) if keepdims == 1: shp = list(inarray.shape) shp[dimension] = 1 sum = N.reshape(sum,shp) else: # must be a TUPLE of dims to average over dims = list(dimension) dims.sort() dims.reverse() sum = inarray *1.0 for dim in dims: sum = N.add.reduce(sum,dim) denom = N.array(N.multiply.reduce(N.take(inarray.shape,dims)),N.float_) if keepdims == 1: shp = list(inarray.shape) for dim in dims: shp[dim] = 1 sum = N.reshape(sum,shp) return sum/denom def amedian (inarray,numbins=1000): """ Calculates the COMPUTED median value of an array of numbers, given the number of bins to use for the histogram (more bins approaches finding the precise median value of the array; default number of bins = 1000). From G.W. Heiman's Basic Stats, or CRC Probability & Statistics. NOTE: THIS ROUTINE ALWAYS uses the entire passed array (flattens it first). Usage: amedian(inarray,numbins=1000) Returns: median calculated over ALL values in inarray """ inarray = N.ravel(inarray) (hist, smallest, binsize, extras) = ahistogram(inarray,numbins,[min(inarray),max(inarray)]) cumhist = N.cumsum(hist) # make cumulative histogram otherbins = N.greater_equal(cumhist,len(inarray)/2.0) otherbins = list(otherbins) # list of 0/1s, 1s start at median bin cfbin = otherbins.index(1) # get 1st(!) index holding 50%ile score LRL = smallest + binsize*cfbin # get lower read limit of that bin cfbelow = N.add.reduce(hist[0:cfbin]) # cum. freq. below bin freq = hist[cfbin] # frequency IN the 50%ile bin median = LRL + ((len(inarray)/2.0-cfbelow)/float(freq))*binsize # MEDIAN return median def amedianscore (inarray,dimension=None): """ Returns the 'middle' score of the passed array. If there is an even number of scores, the mean of the 2 middle scores is returned. Can function with 1D arrays, or on the FIRST dimension of 2D arrays (i.e., dimension can be None, to pre-flatten the array, or else dimension must equal 0). Usage: amedianscore(inarray,dimension=None) Returns: 'middle' score of the array, or the mean of the 2 middle scores """ if dimension == None: inarray = N.ravel(inarray) dimension = 0 inarray = N.sort(inarray,dimension) if inarray.shape[dimension] % 2 == 0: # if even number of elements indx = inarray.shape[dimension]/2 # integer division correct median = N.asarray(inarray[indx]+inarray[indx-1]) / 2.0 else: indx = inarray.shape[dimension] / 2 # integer division correct median = N.take(inarray,[indx],dimension) if median.shape == (1,): median = median[0] return median def amode(a, dimension=None): """ Returns an array of the modal (most common) score in the passed array. If there is more than one such score, ONLY THE FIRST is returned. The bin-count for the modal values is also returned. Operates on whole array (dimension=None), or on a given dimension. Usage: amode(a, dimension=None) Returns: array of bin-counts for mode(s), array of corresponding modal values """ if dimension == None: a = N.ravel(a) dimension = 0 scores = pstat.aunique(N.ravel(a)) # get ALL unique values testshape = list(a.shape) testshape[dimension] = 1 oldmostfreq = N.zeros(testshape) oldcounts = N.zeros(testshape) for score in scores: template = N.equal(a,score) counts = asum(template,dimension,1) mostfrequent = N.where(counts>oldcounts,score,oldmostfreq) oldcounts = N.where(counts>oldcounts,counts,oldcounts) oldmostfreq = mostfrequent return oldcounts, mostfrequent def atmean(a,limits=None,inclusive=(1,1)): """ Returns the arithmetic mean of all values in an array, ignoring values strictly outside the sequence passed to 'limits'. Note: either limit in the sequence, or the value of limits itself, can be set to None. The inclusive list/tuple determines whether the lower and upper limiting bounds (respectively) are open/exclusive (0) or closed/inclusive (1). Usage: atmean(a,limits=None,inclusive=(1,1)) """ if a.dtype in [N.int_, N.short,N.ubyte]: a = a.astype(N.float_) if limits == None: return mean(a) assert type(limits) in [ListType,TupleType,N.ndarray], "Wrong type for limits in atmean" if inclusive[0]: lowerfcn = N.greater_equal else: lowerfcn = N.greater if inclusive[1]: upperfcn = N.less_equal else: upperfcn = N.less if limits[0] > N.maximum.reduce(N.ravel(a)) or limits[1] < N.minimum.reduce(N.ravel(a)): raise ValueError, "No array values within given limits (atmean)." elif limits[0]==None and limits[1]<>None: mask = upperfcn(a,limits[1]) elif limits[0]<>None and limits[1]==None: mask = lowerfcn(a,limits[0]) elif limits[0]<>None and limits[1]<>None: mask = lowerfcn(a,limits[0])*upperfcn(a,limits[1]) s = float(N.add.reduce(N.ravel(a*mask))) n = float(N.add.reduce(N.ravel(mask))) return s/n def atvar(a,limits=None,inclusive=(1,1)): """ Returns the sample variance of values in an array, (i.e., using N-1), ignoring values strictly outside the sequence passed to 'limits'. Note: either limit in the sequence, or the value of limits itself, can be set to None. The inclusive list/tuple determines whether the lower and upper limiting bounds (respectively) are open/exclusive (0) or closed/inclusive (1). ASSUMES A FLAT ARRAY (OR ELSE PREFLATTENS). Usage: atvar(a,limits=None,inclusive=(1,1)) """ a = a.astype(N.float_) if limits == None or limits == [None,None]: return avar(a) assert type(limits) in [ListType,TupleType,N.ndarray], "Wrong type for limits in atvar" if inclusive[0]: lowerfcn = N.greater_equal else: lowerfcn = N.greater if inclusive[1]: upperfcn = N.less_equal else: upperfcn = N.less if limits[0] > N.maximum.reduce(N.ravel(a)) or limits[1] < N.minimum.reduce(N.ravel(a)): raise ValueError, "No array values within given limits (atvar)." elif limits[0]==None and limits[1]<>None: mask = upperfcn(a,limits[1]) elif limits[0]<>None and limits[1]==None: mask = lowerfcn(a,limits[0]) elif limits[0]<>None and limits[1]<>None: mask = lowerfcn(a,limits[0])*upperfcn(a,limits[1]) a = N.compress(mask,a) # squish out excluded values return avar(a) def atmin(a,lowerlimit=None,dimension=None,inclusive=1): """ Returns the minimum value of a, along dimension, including only values less than (or equal to, if inclusive=1) lowerlimit. If the limit is set to None, all values in the array are used. Usage: atmin(a,lowerlimit=None,dimension=None,inclusive=1) """ if inclusive: lowerfcn = N.greater else: lowerfcn = N.greater_equal if dimension == None: a = N.ravel(a) dimension = 0 if lowerlimit == None: lowerlimit = N.minimum.reduce(N.ravel(a))-11 biggest = N.maximum.reduce(N.ravel(a)) ta = N.where(lowerfcn(a,lowerlimit),a,biggest) return N.minimum.reduce(ta,dimension) def atmax(a,upperlimit,dimension=None,inclusive=1): """ Returns the maximum value of a, along dimension, including only values greater than (or equal to, if inclusive=1) upperlimit. If the limit is set to None, a limit larger than the max value in the array is used. Usage: atmax(a,upperlimit,dimension=None,inclusive=1) """ if inclusive: upperfcn = N.less else: upperfcn = N.less_equal if dimension == None: a = N.ravel(a) dimension = 0 if upperlimit == None: upperlimit = N.maximum.reduce(N.ravel(a))+1 smallest = N.minimum.reduce(N.ravel(a)) ta = N.where(upperfcn(a,upperlimit),a,smallest) return N.maximum.reduce(ta,dimension) def atstdev(a,limits=None,inclusive=(1,1)): """ Returns the standard deviation of all values in an array, ignoring values strictly outside the sequence passed to 'limits'. Note: either limit in the sequence, or the value of limits itself, can be set to None. The inclusive list/tuple determines whether the lower and upper limiting bounds (respectively) are open/exclusive (0) or closed/inclusive (1). Usage: atstdev(a,limits=None,inclusive=(1,1)) """ return N.sqrt(tvar(a,limits,inclusive)) def atsem(a,limits=None,inclusive=(1,1)): """ Returns the standard error of the mean for the values in an array, (i.e., using N for the denominator), ignoring values strictly outside the sequence passed to 'limits'. Note: either limit in the sequence, or the value of limits itself, can be set to None. The inclusive list/tuple determines whether the lower and upper limiting bounds (respectively) are open/exclusive (0) or closed/inclusive (1). Usage: atsem(a,limits=None,inclusive=(1,1)) """ sd = tstdev(a,limits,inclusive) if limits == None or limits == [None,None]: n = float(len(N.ravel(a))) limits = [min(a)-1, max(a)+1] assert type(limits) in [ListType,TupleType,N.ndarray], "Wrong type for limits in atsem" if inclusive[0]: lowerfcn = N.greater_equal else: lowerfcn = N.greater if inclusive[1]: upperfcn = N.less_equal else: upperfcn = N.less if limits[0] > N.maximum.reduce(N.ravel(a)) or limits[1] < N.minimum.reduce(N.ravel(a)): raise ValueError, "No array values within given limits (atsem)." elif limits[0]==None and limits[1]<>None: mask = upperfcn(a,limits[1]) elif limits[0]<>None and limits[1]==None: mask = lowerfcn(a,limits[0]) elif limits[0]<>None and limits[1]<>None: mask = lowerfcn(a,limits[0])*upperfcn(a,limits[1]) term1 = N.add.reduce(N.ravel(a*a*mask)) n = float(N.add.reduce(N.ravel(mask))) return sd/math.sqrt(n) ##################################### ############ AMOMENTS ############# ##################################### def amoment(a,moment=1,dimension=None): """ Calculates the nth moment about the mean for a sample (defaults to the 1st moment). Generally used to calculate coefficients of skewness and kurtosis. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: amoment(a,moment=1,dimension=None) Returns: appropriate moment along given dimension """ if dimension == None: a = N.ravel(a) dimension = 0 if moment == 1: return 0.0 else: mn = amean(a,dimension,1) # 1=keepdims s = N.power((a-mn),moment) return amean(s,dimension) def avariation(a,dimension=None): """ Returns the coefficient of variation, as defined in CRC Standard Probability and Statistics, p.6. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: avariation(a,dimension=None) """ return 100.0*asamplestdev(a,dimension)/amean(a,dimension) def askew(a,dimension=None): """ Returns the skewness of a distribution (normal ==> 0.0; >0 means extra weight in left tail). Use askewtest() to see if it's close enough. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: askew(a, dimension=None) Returns: skew of vals in a along dimension, returning ZERO where all vals equal """ denom = N.power(amoment(a,2,dimension),1.5) zero = N.equal(denom,0) if type(denom) == N.ndarray and asum(zero) <> 0: print "Number of zeros in askew: ",asum(zero) denom = denom + zero # prevent divide-by-zero return N.where(zero, 0, amoment(a,3,dimension)/denom) def akurtosis(a,dimension=None): """ Returns the kurtosis of a distribution (normal ==> 3.0; >3 means heavier in the tails, and usually more peaked). Use akurtosistest() to see if it's close enough. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: akurtosis(a,dimension=None) Returns: kurtosis of values in a along dimension, and ZERO where all vals equal """ denom = N.power(amoment(a,2,dimension),2) zero = N.equal(denom,0) if type(denom) == N.ndarray and asum(zero) <> 0: print "Number of zeros in akurtosis: ",asum(zero) denom = denom + zero # prevent divide-by-zero return N.where(zero,0,amoment(a,4,dimension)/denom) def adescribe(inarray,dimension=None): """ Returns several descriptive statistics of the passed array. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: adescribe(inarray,dimension=None) Returns: n, (min,max), mean, standard deviation, skew, kurtosis """ if dimension == None: inarray = N.ravel(inarray) dimension = 0 n = inarray.shape[dimension] mm = (N.minimum.reduce(inarray),N.maximum.reduce(inarray)) m = amean(inarray,dimension) sd = astdev(inarray,dimension) skew = askew(inarray,dimension) kurt = akurtosis(inarray,dimension) return n, mm, m, sd, skew, kurt ##################################### ######## NORMALITY TESTS ########## ##################################### def askewtest(a,dimension=None): """ Tests whether the skew is significantly different from a normal distribution. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: askewtest(a,dimension=None) Returns: z-score and 2-tail z-probability """ if dimension == None: a = N.ravel(a) dimension = 0 b2 = askew(a,dimension) n = float(a.shape[dimension]) y = b2 * N.sqrt(((n+1)*(n+3)) / (6.0*(n-2)) ) beta2 = ( 3.0*(n*n+27*n-70)*(n+1)*(n+3) ) / ( (n-2.0)*(n+5)*(n+7)*(n+9) ) W2 = -1 + N.sqrt(2*(beta2-1)) delta = 1/N.sqrt(N.log(N.sqrt(W2))) alpha = N.sqrt(2/(W2-1)) y = N.where(y==0,1,y) Z = delta*N.log(y/alpha + N.sqrt((y/alpha)**2+1)) return Z, (1.0-zprob(Z))*2 def akurtosistest(a,dimension=None): """ Tests whether a dataset has normal kurtosis (i.e., kurtosis=3(n-1)/(n+1)) Valid only for n>20. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: akurtosistest(a,dimension=None) Returns: z-score and 2-tail z-probability, returns 0 for bad pixels """ if dimension == None: a = N.ravel(a) dimension = 0 n = float(a.shape[dimension]) if n<20: print "akurtosistest only valid for n>=20 ... continuing anyway, n=",n b2 = akurtosis(a,dimension) E = 3.0*(n-1) /(n+1) varb2 = 24.0*n*(n-2)*(n-3) / ((n+1)*(n+1)*(n+3)*(n+5)) x = (b2-E)/N.sqrt(varb2) sqrtbeta1 = 6.0*(n*n-5*n+2)/((n+7)*(n+9)) * N.sqrt((6.0*(n+3)*(n+5))/ (n*(n-2)*(n-3))) A = 6.0 + 8.0/sqrtbeta1 *(2.0/sqrtbeta1 + N.sqrt(1+4.0/(sqrtbeta1**2))) term1 = 1 -2/(9.0*A) denom = 1 +x*N.sqrt(2/(A-4.0)) denom = N.where(N.less(denom,0), 99, denom) term2 = N.where(N.equal(denom,0), term1, N.power((1-2.0/A)/denom,1/3.0)) Z = ( term1 - term2 ) / N.sqrt(2/(9.0*A)) Z = N.where(N.equal(denom,99), 0, Z) return Z, (1.0-zprob(Z))*2 def anormaltest(a,dimension=None): """ Tests whether skew and/OR kurtosis of dataset differs from normal curve. Can operate over multiple dimensions. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: anormaltest(a,dimension=None) Returns: z-score and 2-tail probability """ if dimension == None: a = N.ravel(a) dimension = 0 s,p = askewtest(a,dimension) k,p = akurtosistest(a,dimension) k2 = N.power(s,2) + N.power(k,2) return k2, achisqprob(k2,2) ##################################### ###### AFREQUENCY FUNCTIONS ####### ##################################### def aitemfreq(a): """ Returns a 2D array of item frequencies. Column 1 contains item values, column 2 contains their respective counts. Assumes a 1D array is passed. @@@sorting OK? Usage: aitemfreq(a) Returns: a 2D frequency table (col [0:n-1]=scores, col n=frequencies) """ scores = pstat.aunique(a) scores = N.sort(scores) freq = N.zeros(len(scores)) for i in range(len(scores)): freq[i] = N.add.reduce(N.equal(a,scores[i])) return N.array(pstat.aabut(scores, freq)) def ascoreatpercentile (inarray, percent): """ Usage: ascoreatpercentile(inarray,percent) 0= targetcf: break score = binsize * ((targetcf - cumhist[i-1]) / float(h[i])) + (lrl+binsize*i) return score def apercentileofscore (inarray,score,histbins=10,defaultlimits=None): """ Note: result of this function depends on the values used to histogram the data(!). Usage: apercentileofscore(inarray,score,histbins=10,defaultlimits=None) Returns: percentile-position of score (0-100) relative to inarray """ h, lrl, binsize, extras = histogram(inarray,histbins,defaultlimits) cumhist = cumsum(h*1) i = int((score - lrl)/float(binsize)) pct = (cumhist[i-1]+((score-(lrl+binsize*i))/float(binsize))*h[i])/float(len(inarray)) * 100 return pct def ahistogram (inarray,numbins=10,defaultlimits=None,printextras=1): """ Returns (i) an array of histogram bin counts, (ii) the smallest value of the histogram binning, and (iii) the bin width (the last 2 are not necessarily integers). Default number of bins is 10. Defaultlimits can be None (the routine picks bins spanning all the numbers in the inarray) or a 2-sequence (lowerlimit, upperlimit). Returns all of the following: array of bin values, lowerreallimit, binsize, extrapoints. Usage: ahistogram(inarray,numbins=10,defaultlimits=None,printextras=1) Returns: (array of bin counts, bin-minimum, min-width, #-points-outside-range) """ inarray = N.ravel(inarray) # flatten any >1D arrays if (defaultlimits <> None): lowerreallimit = defaultlimits[0] upperreallimit = defaultlimits[1] binsize = (upperreallimit-lowerreallimit) / float(numbins) else: Min = N.minimum.reduce(inarray) Max = N.maximum.reduce(inarray) estbinwidth = float(Max - Min)/float(numbins) + 1e-6 binsize = (Max-Min+estbinwidth)/float(numbins) lowerreallimit = Min - binsize/2.0 #lower real limit,1st bin bins = N.zeros(numbins) extrapoints = 0 for num in inarray: try: if (num-lowerreallimit) < 0: extrapoints = extrapoints + 1 else: bintoincrement = int((num-lowerreallimit) / float(binsize)) bins[bintoincrement] = bins[bintoincrement] + 1 except: # point outside lower/upper limits extrapoints = extrapoints + 1 if (extrapoints > 0 and printextras == 1): print '\nPoints outside given histogram range =',extrapoints return (bins, lowerreallimit, binsize, extrapoints) def acumfreq(a,numbins=10,defaultreallimits=None): """ Returns a cumulative frequency histogram, using the histogram function. Defaultreallimits can be None (use all data), or a 2-sequence containing lower and upper limits on values to include. Usage: acumfreq(a,numbins=10,defaultreallimits=None) Returns: array of cumfreq bin values, lowerreallimit, binsize, extrapoints """ h,l,b,e = histogram(a,numbins,defaultreallimits) cumhist = cumsum(h*1) return cumhist,l,b,e def arelfreq(a,numbins=10,defaultreallimits=None): """ Returns a relative frequency histogram, using the histogram function. Defaultreallimits can be None (use all data), or a 2-sequence containing lower and upper limits on values to include. Usage: arelfreq(a,numbins=10,defaultreallimits=None) Returns: array of cumfreq bin values, lowerreallimit, binsize, extrapoints """ h,l,b,e = histogram(a,numbins,defaultreallimits) h = N.array(h/float(a.shape[0])) return h,l,b,e ##################################### ###### AVARIABILITY FUNCTIONS ##### ##################################### def aobrientransform(*args): """ Computes a transform on input data (any number of columns). Used to test for homogeneity of variance prior to running one-way stats. Each array in *args is one level of a factor. If an F_oneway() run on the transformed data and found significant, variances are unequal. From Maxwell and Delaney, p.112. Usage: aobrientransform(*args) *args = 1D arrays, one per level of factor Returns: transformed data for use in an ANOVA """ TINY = 1e-10 k = len(args) n = N.zeros(k,N.float_) v = N.zeros(k,N.float_) m = N.zeros(k,N.float_) nargs = [] for i in range(k): nargs.append(args[i].astype(N.float_)) n[i] = float(len(nargs[i])) v[i] = var(nargs[i]) m[i] = mean(nargs[i]) for j in range(k): for i in range(n[j]): t1 = (n[j]-1.5)*n[j]*(nargs[j][i]-m[j])**2 t2 = 0.5*v[j]*(n[j]-1.0) t3 = (n[j]-1.0)*(n[j]-2.0) nargs[j][i] = (t1-t2) / float(t3) check = 1 for j in range(k): if v[j] - mean(nargs[j]) > TINY: check = 0 if check <> 1: raise ValueError, 'Lack of convergence in obrientransform.' else: return N.array(nargs) def asamplevar (inarray,dimension=None,keepdims=0): """ Returns the sample standard deviation of the values in the passed array (i.e., using N). Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to return an array with the same number of dimensions as inarray. Usage: asamplevar(inarray,dimension=None,keepdims=0) """ if dimension == None: inarray = N.ravel(inarray) dimension = 0 if dimension == 1: mn = amean(inarray,dimension)[:,N.NewAxis] else: mn = amean(inarray,dimension,keepdims=1) deviations = inarray - mn if type(dimension) == ListType: n = 1 for d in dimension: n = n*inarray.shape[d] else: n = inarray.shape[dimension] svar = ass(deviations,dimension,keepdims) / float(n) return svar def asamplestdev (inarray, dimension=None, keepdims=0): """ Returns the sample standard deviation of the values in the passed array (i.e., using N). Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to return an array with the same number of dimensions as inarray. Usage: asamplestdev(inarray,dimension=None,keepdims=0) """ return N.sqrt(asamplevar(inarray,dimension,keepdims)) def asignaltonoise(instack,dimension=0): """ Calculates signal-to-noise. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Usage: asignaltonoise(instack,dimension=0): Returns: array containing the value of (mean/stdev) along dimension, or 0 when stdev=0 """ m = mean(instack,dimension) sd = stdev(instack,dimension) return N.where(sd==0,0,m/sd) def acov (x,y, dimension=None,keepdims=0): """ Returns the estimated covariance of the values in the passed array (i.e., N-1). Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to return an array with the same number of dimensions as inarray. Usage: acov(x,y,dimension=None,keepdims=0) """ if dimension == None: x = N.ravel(x) y = N.ravel(y) dimension = 0 xmn = amean(x,dimension,1) # keepdims xdeviations = x - xmn ymn = amean(y,dimension,1) # keepdims ydeviations = y - ymn if type(dimension) == ListType: n = 1 for d in dimension: n = n*x.shape[d] else: n = x.shape[dimension] covar = N.sum(xdeviations*ydeviations)/float(n-1) return covar def avar (inarray, dimension=None,keepdims=0): """ Returns the estimated population variance of the values in the passed array (i.e., N-1). Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to return an array with the same number of dimensions as inarray. Usage: avar(inarray,dimension=None,keepdims=0) """ if dimension == None: inarray = N.ravel(inarray) dimension = 0 mn = amean(inarray,dimension,1) deviations = inarray - mn if type(dimension) == ListType: n = 1 for d in dimension: n = n*inarray.shape[d] else: n = inarray.shape[dimension] var = ass(deviations,dimension,keepdims)/float(n-1) return var def astdev (inarray, dimension=None, keepdims=0): """ Returns the estimated population standard deviation of the values in the passed array (i.e., N-1). Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to return an array with the same number of dimensions as inarray. Usage: astdev(inarray,dimension=None,keepdims=0) """ return N.sqrt(avar(inarray,dimension,keepdims)) def asterr (inarray, dimension=None, keepdims=0): """ Returns the estimated population standard error of the values in the passed array (i.e., N-1). Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to return an array with the same number of dimensions as inarray. Usage: asterr(inarray,dimension=None,keepdims=0) """ if dimension == None: inarray = N.ravel(inarray) dimension = 0 return astdev(inarray,dimension,keepdims) / float(N.sqrt(inarray.shape[dimension])) def asem (inarray, dimension=None, keepdims=0): """ Returns the standard error of the mean (i.e., using N) of the values in the passed array. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to return an array with the same number of dimensions as inarray. Usage: asem(inarray,dimension=None, keepdims=0) """ if dimension == None: inarray = N.ravel(inarray) dimension = 0 if type(dimension) == ListType: n = 1 for d in dimension: n = n*inarray.shape[d] else: n = inarray.shape[dimension] s = asamplestdev(inarray,dimension,keepdims) / N.sqrt(n-1) return s def az (a, score): """ Returns the z-score of a given input score, given thearray from which that score came. Not appropriate for population calculations, nor for arrays > 1D. Usage: az(a, score) """ z = (score-amean(a)) / asamplestdev(a) return z def azs (a): """ Returns a 1D array of z-scores, one for each score in the passed array, computed relative to the passed array. Usage: azs(a) """ zscores = [] for item in a: zscores.append(z(a,item)) return N.array(zscores) def azmap (scores, compare, dimension=0): """ Returns an array of z-scores the shape of scores (e.g., [x,y]), compared to array passed to compare (e.g., [time,x,y]). Assumes collapsing over dim 0 of the compare array. Usage: azs(scores, compare, dimension=0) """ mns = amean(compare,dimension) sstd = asamplestdev(compare,0) return (scores - mns) / sstd ##################################### ####### ATRIMMING FUNCTIONS ####### ##################################### ## deleted around() as it's in numpy now def athreshold(a,threshmin=None,threshmax=None,newval=0): """ Like Numeric.clip() except that values threshmax are replaced by newval instead of by threshmin/threshmax (respectively). Usage: athreshold(a,threshmin=None,threshmax=None,newval=0) Returns: a, with values threshmax replaced with newval """ mask = N.zeros(a.shape) if threshmin <> None: mask = mask + N.where(a None: mask = mask + N.where(a>threshmax,1,0) mask = N.clip(mask,0,1) return N.where(mask,newval,a) def atrimboth (a,proportiontocut): """ Slices off the passed proportion of items from BOTH ends of the passed array (i.e., with proportiontocut=0.1, slices 'leftmost' 10% AND 'rightmost' 10% of scores. You must pre-sort the array if you want "proper" trimming. Slices off LESS if proportion results in a non-integer slice index (i.e., conservatively slices off proportiontocut). Usage: atrimboth (a,proportiontocut) Returns: trimmed version of array a """ lowercut = int(proportiontocut*len(a)) uppercut = len(a) - lowercut return a[lowercut:uppercut] def atrim1 (a,proportiontocut,tail='right'): """ Slices off the passed proportion of items from ONE end of the passed array (i.e., if proportiontocut=0.1, slices off 'leftmost' or 'rightmost' 10% of scores). Slices off LESS if proportion results in a non-integer slice index (i.e., conservatively slices off proportiontocut). Usage: atrim1(a,proportiontocut,tail='right') or set tail='left' Returns: trimmed version of array a """ if string.lower(tail) == 'right': lowercut = 0 uppercut = len(a) - int(proportiontocut*len(a)) elif string.lower(tail) == 'left': lowercut = int(proportiontocut*len(a)) uppercut = len(a) return a[lowercut:uppercut] ##################################### ##### ACORRELATION FUNCTIONS ###### ##################################### def acovariance(X): """ Computes the covariance matrix of a matrix X. Requires a 2D matrix input. Usage: acovariance(X) Returns: covariance matrix of X """ if len(X.shape) <> 2: raise TypeError, "acovariance requires 2D matrices" n = X.shape[0] mX = amean(X,0) return N.dot(N.transpose(X),X) / float(n) - N.multiply.outer(mX,mX) def acorrelation(X): """ Computes the correlation matrix of a matrix X. Requires a 2D matrix input. Usage: acorrelation(X) Returns: correlation matrix of X """ C = acovariance(X) V = N.diagonal(C) return C / N.sqrt(N.multiply.outer(V,V)) def apaired(x,y): """ Interactively determines the type of data in x and y, and then runs the appropriated statistic for paired group data. Usage: apaired(x,y) x,y = the two arrays of values to be compared Returns: appropriate statistic name, value, and probability """ samples = '' while samples not in ['i','r','I','R','c','C']: print '\nIndependent or related samples, or correlation (i,r,c): ', samples = raw_input() if samples in ['i','I','r','R']: print '\nComparing variances ...', # USE O'BRIEN'S TEST FOR HOMOGENEITY OF VARIANCE, Maxwell & delaney, p.112 r = obrientransform(x,y) f,p = F_oneway(pstat.colex(r,0),pstat.colex(r,1)) if p<0.05: vartype='unequal, p='+str(round(p,4)) else: vartype='equal' print vartype if samples in ['i','I']: if vartype[0]=='e': t,p = ttest_ind(x,y,None,0) print '\nIndependent samples t-test: ', round(t,4),round(p,4) else: if len(x)>20 or len(y)>20: z,p = ranksums(x,y) print '\nRank Sums test (NONparametric, n>20): ', round(z,4),round(p,4) else: u,p = mannwhitneyu(x,y) print '\nMann-Whitney U-test (NONparametric, ns<20): ', round(u,4),round(p,4) else: # RELATED SAMPLES if vartype[0]=='e': t,p = ttest_rel(x,y,0) print '\nRelated samples t-test: ', round(t,4),round(p,4) else: t,p = ranksums(x,y) print '\nWilcoxon T-test (NONparametric): ', round(t,4),round(p,4) else: # CORRELATION ANALYSIS corrtype = '' while corrtype not in ['c','C','r','R','d','D']: print '\nIs the data Continuous, Ranked, or Dichotomous (c,r,d): ', corrtype = raw_input() if corrtype in ['c','C']: m,b,r,p,see = linregress(x,y) print '\nLinear regression for continuous variables ...' lol = [['Slope','Intercept','r','Prob','SEestimate'],[round(m,4),round(b,4),round(r,4),round(p,4),round(see,4)]] pstat.printcc(lol) elif corrtype in ['r','R']: r,p = spearmanr(x,y) print '\nCorrelation for ranked variables ...' print "Spearman's r: ",round(r,4),round(p,4) else: # DICHOTOMOUS r,p = pointbiserialr(x,y) print '\nAssuming x contains a dichotomous variable ...' print 'Point Biserial r: ',round(r,4),round(p,4) print '\n\n' return None def dices(x,y): """ Calculates Dice's coefficient ... (2*number of common terms)/(number of terms in x + number of terms in y). Returns a value between 0 (orthogonal) and 1. Usage: dices(x,y) """ import sets x = sets.Set(x) y = sets.Set(y) common = len(x.intersection(y)) total = float(len(x) + len(y)) return 2*common/total def icc(x,y=None,verbose=0): """ Calculates intraclass correlation coefficients using simple, Type I sums of squares. If only one variable is passed, assumed it's an Nx2 matrix Usage: icc(x,y=None,verbose=0) Returns: icc rho, prob ####PROB IS A GUESS BASED ON PEARSON """ TINY = 1.0e-20 if y: all = N.concatenate([x,y],0) else: all = x+0 x = all[:,0] y = all[:,1] totalss = ass(all-mean(all)) pairmeans = (x+y)/2. withinss = ass(x-pairmeans) + ass(y-pairmeans) withindf = float(len(x)) betwdf = float(len(x)-1) withinms = withinss / withindf betweenms = (totalss-withinss) / betwdf rho = (betweenms-withinms)/(withinms+betweenms) t = rho*math.sqrt(betwdf/((1.0-rho+TINY)*(1.0+rho+TINY))) prob = abetai(0.5*betwdf,0.5,betwdf/(betwdf+t*t),verbose) return rho, prob def alincc(x,y): """ Calculates Lin's concordance correlation coefficient. Usage: alincc(x,y) where x, y are equal-length arrays Returns: Lin's CC """ x = N.ravel(x) y = N.ravel(y) covar = acov(x,y)*(len(x)-1)/float(len(x)) # correct denom to n xvar = avar(x)*(len(x)-1)/float(len(x)) # correct denom to n yvar = avar(y)*(len(y)-1)/float(len(y)) # correct denom to n lincc = (2 * covar) / ((xvar+yvar) +((amean(x)-amean(y))**2)) return lincc def apearsonr(x,y,verbose=1): """ Calculates a Pearson correlation coefficient and returns p. Taken from Heiman's Basic Statistics for the Behav. Sci (2nd), p.195. Usage: apearsonr(x,y,verbose=1) where x,y are equal length arrays Returns: Pearson's r, two-tailed p-value """ TINY = 1.0e-20 n = len(x) xmean = amean(x) ymean = amean(y) r_num = n*(N.add.reduce(x*y)) - N.add.reduce(x)*N.add.reduce(y) r_den = math.sqrt((n*ass(x) - asquare_of_sums(x))*(n*ass(y)-asquare_of_sums(y))) r = (r_num / r_den) df = n-2 t = r*math.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY))) prob = abetai(0.5*df,0.5,df/(df+t*t),verbose) return r,prob def aspearmanr(x,y): """ Calculates a Spearman rank-order correlation coefficient. Taken from Heiman's Basic Statistics for the Behav. Sci (1st), p.192. Usage: aspearmanr(x,y) where x,y are equal-length arrays Returns: Spearman's r, two-tailed p-value """ TINY = 1e-30 n = len(x) rankx = rankdata(x) ranky = rankdata(y) dsq = N.add.reduce((rankx-ranky)**2) rs = 1 - 6*dsq / float(n*(n**2-1)) t = rs * math.sqrt((n-2) / ((rs+1.0)*(1.0-rs))) df = n-2 probrs = abetai(0.5*df,0.5,df/(df+t*t)) # probability values for rs are from part 2 of the spearman function in # Numerical Recipies, p.510. They close to tables, but not exact.(?) return rs, probrs def apointbiserialr(x,y): """ Calculates a point-biserial correlation coefficient and the associated probability value. Taken from Heiman's Basic Statistics for the Behav. Sci (1st), p.194. Usage: apointbiserialr(x,y) where x,y are equal length arrays Returns: Point-biserial r, two-tailed p-value """ TINY = 1e-30 categories = pstat.aunique(x) data = pstat.aabut(x,y) if len(categories) <> 2: raise ValueError, "Exactly 2 categories required (in x) for pointbiserialr()." else: # there are 2 categories, continue codemap = pstat.aabut(categories,N.arange(2)) recoded = pstat.arecode(data,codemap,0) x = pstat.alinexand(data,0,categories[0]) y = pstat.alinexand(data,0,categories[1]) xmean = amean(pstat.acolex(x,1)) ymean = amean(pstat.acolex(y,1)) n = len(data) adjust = math.sqrt((len(x)/float(n))*(len(y)/float(n))) rpb = (ymean - xmean)/asamplestdev(pstat.acolex(data,1))*adjust df = n-2 t = rpb*math.sqrt(df/((1.0-rpb+TINY)*(1.0+rpb+TINY))) prob = abetai(0.5*df,0.5,df/(df+t*t)) return rpb, prob def akendalltau(x,y): """ Calculates Kendall's tau ... correlation of ordinal data. Adapted from function kendl1 in Numerical Recipies. Needs good test-cases.@@@ Usage: akendalltau(x,y) Returns: Kendall's tau, two-tailed p-value """ n1 = 0 n2 = 0 iss = 0 for j in range(len(x)-1): for k in range(j,len(y)): a1 = x[j] - x[k] a2 = y[j] - y[k] aa = a1 * a2 if (aa): # neither array has a tie n1 = n1 + 1 n2 = n2 + 1 if aa > 0: iss = iss + 1 else: iss = iss -1 else: if (a1): n1 = n1 + 1 else: n2 = n2 + 1 tau = iss / math.sqrt(n1*n2) svar = (4.0*len(x)+10.0) / (9.0*len(x)*(len(x)-1)) z = tau / math.sqrt(svar) prob = erfcc(abs(z)/1.4142136) return tau, prob def alinregress(*args): """ Calculates a regression line on two arrays, x and y, corresponding to x,y pairs. If a single 2D array is passed, alinregress finds dim with 2 levels and splits data into x,y pairs along that dim. Usage: alinregress(*args) args=2 equal-length arrays, or one 2D array Returns: slope, intercept, r, two-tailed prob, sterr-of-the-estimate, n """ TINY = 1.0e-20 if len(args) == 1: # more than 1D array? args = args[0] if len(args) == 2: x = args[0] y = args[1] else: x = args[:,0] y = args[:,1] else: x = args[0] y = args[1] n = len(x) xmean = amean(x) ymean = amean(y) r_num = n*(N.add.reduce(x*y)) - N.add.reduce(x)*N.add.reduce(y) r_den = math.sqrt((n*ass(x) - asquare_of_sums(x))*(n*ass(y)-asquare_of_sums(y))) r = r_num / r_den z = 0.5*math.log((1.0+r+TINY)/(1.0-r+TINY)) df = n-2 t = r*math.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY))) prob = abetai(0.5*df,0.5,df/(df+t*t)) slope = r_num / (float(n)*ass(x) - asquare_of_sums(x)) intercept = ymean - slope*xmean sterrest = math.sqrt(1-r*r)*asamplestdev(y) return slope, intercept, r, prob, sterrest, n def amasslinregress(*args): """ Calculates a regression line on one 1D array (x) and one N-D array (y). Returns: slope, intercept, r, two-tailed prob, sterr-of-the-estimate, n """ TINY = 1.0e-20 if len(args) == 1: # more than 1D array? args = args[0] if len(args) == 2: x = N.ravel(args[0]) y = args[1] else: x = N.ravel(args[:,0]) y = args[:,1] else: x = args[0] y = args[1] x = x.astype(N.float_) y = y.astype(N.float_) n = len(x) xmean = amean(x) ymean = amean(y,0) shp = N.ones(len(y.shape)) shp[0] = len(x) x.shape = shp print x.shape, y.shape r_num = n*(N.add.reduce(x*y,0)) - N.add.reduce(x)*N.add.reduce(y,0) r_den = N.sqrt((n*ass(x) - asquare_of_sums(x))*(n*ass(y,0)-asquare_of_sums(y,0))) zerodivproblem = N.equal(r_den,0) r_den = N.where(zerodivproblem,1,r_den) # avoid zero-division in 1st place r = r_num / r_den # need to do this nicely for matrix division r = N.where(zerodivproblem,0.0,r) z = 0.5*N.log((1.0+r+TINY)/(1.0-r+TINY)) df = n-2 t = r*N.sqrt(df/((1.0-r+TINY)*(1.0+r+TINY))) prob = abetai(0.5*df,0.5,df/(df+t*t)) ss = float(n)*ass(x)-asquare_of_sums(x) s_den = N.where(ss==0,1,ss) # avoid zero-division in 1st place slope = r_num / s_den intercept = ymean - slope*xmean sterrest = N.sqrt(1-r*r)*asamplestdev(y,0) return slope, intercept, r, prob, sterrest, n ##################################### ##### AINFERENTIAL STATISTICS ##### ##################################### def attest_1samp(a,popmean,printit=0,name='Sample',writemode='a'): """ Calculates the t-obtained for the independent samples T-test on ONE group of scores a, given a population mean. If printit=1, results are printed to the screen. If printit='filename', the results are output to 'filename' using the given writemode (default=append). Returns t-value, and prob. Usage: attest_1samp(a,popmean,Name='Sample',printit=0,writemode='a') Returns: t-value, two-tailed prob """ if type(a) != N.ndarray: a = N.array(a) x = amean(a) v = avar(a) n = len(a) df = n-1 svar = ((n-1)*v) / float(df) t = (x-popmean)/math.sqrt(svar*(1.0/n)) prob = abetai(0.5*df,0.5,df/(df+t*t)) if printit <> 0: statname = 'Single-sample T-test.' outputpairedstats(printit,writemode, 'Population','--',popmean,0,0,0, name,n,x,v,N.minimum.reduce(N.ravel(a)), N.maximum.reduce(N.ravel(a)), statname,t,prob) return t,prob def attest_ind (a, b, dimension=None, printit=0, name1='Samp1', name2='Samp2',writemode='a'): """ Calculates the t-obtained T-test on TWO INDEPENDENT samples of scores a, and b. From Numerical Recipies, p.483. If printit=1, results are printed to the screen. If printit='filename', the results are output to 'filename' using the given writemode (default=append). Dimension can equal None (ravel array first), or an integer (the dimension over which to operate on a and b). Usage: attest_ind (a,b,dimension=None,printit=0, Name1='Samp1',Name2='Samp2',writemode='a') Returns: t-value, two-tailed p-value """ if dimension == None: a = N.ravel(a) b = N.ravel(b) dimension = 0 x1 = amean(a,dimension) x2 = amean(b,dimension) v1 = avar(a,dimension) v2 = avar(b,dimension) n1 = a.shape[dimension] n2 = b.shape[dimension] df = n1+n2-2 svar = ((n1-1)*v1+(n2-1)*v2) / float(df) zerodivproblem = N.equal(svar,0) svar = N.where(zerodivproblem,1,svar) # avoid zero-division in 1st place t = (x1-x2)/N.sqrt(svar*(1.0/n1 + 1.0/n2)) # N-D COMPUTATION HERE!!!!!! t = N.where(zerodivproblem,1.0,t) # replace NaN/wrong t-values with 1.0 probs = abetai(0.5*df,0.5,float(df)/(df+t*t)) if type(t) == N.ndarray: probs = N.reshape(probs,t.shape) if probs.shape == (1,): probs = probs[0] if printit <> 0: if type(t) == N.ndarray: t = t[0] if type(probs) == N.ndarray: probs = probs[0] statname = 'Independent samples T-test.' outputpairedstats(printit,writemode, name1,n1,x1,v1,N.minimum.reduce(N.ravel(a)), N.maximum.reduce(N.ravel(a)), name2,n2,x2,v2,N.minimum.reduce(N.ravel(b)), N.maximum.reduce(N.ravel(b)), statname,t,probs) return return t, probs def ap2t(pval,df): """ Tries to compute a t-value from a p-value (or pval array) and associated df. SLOW for large numbers of elements(!) as it re-computes p-values 20 times (smaller step-sizes) at which point it decides it's done. Keeps the signs of the input array. Returns 1000 (or -1000) if t>100. Usage: ap2t(pval,df) Returns: an array of t-values with the shape of pval """ pval = N.array(pval) signs = N.sign(pval) pval = abs(pval) t = N.ones(pval.shape,N.float_)*50 step = N.ones(pval.shape,N.float_)*25 print "Initial ap2t() prob calc" prob = abetai(0.5*df,0.5,float(df)/(df+t*t)) print 'ap2t() iter: ', for i in range(10): print i,' ', t = N.where(pval99.9,1000,t) # hit upper-boundary t = t+signs return t #, prob, pval def attest_rel (a,b,dimension=None,printit=0,name1='Samp1',name2='Samp2',writemode='a'): """ Calculates the t-obtained T-test on TWO RELATED samples of scores, a and b. From Numerical Recipies, p.483. If printit=1, results are printed to the screen. If printit='filename', the results are output to 'filename' using the given writemode (default=append). Dimension can equal None (ravel array first), or an integer (the dimension over which to operate on a and b). Usage: attest_rel(a,b,dimension=None,printit=0, name1='Samp1',name2='Samp2',writemode='a') Returns: t-value, two-tailed p-value """ if dimension == None: a = N.ravel(a) b = N.ravel(b) dimension = 0 if len(a)<>len(b): raise ValueError, 'Unequal length arrays.' x1 = amean(a,dimension) x2 = amean(b,dimension) v1 = avar(a,dimension) v2 = avar(b,dimension) n = a.shape[dimension] df = float(n-1) d = (a-b).astype('d') denom = N.sqrt((n*N.add.reduce(d*d,dimension) - N.add.reduce(d,dimension)**2) /df) zerodivproblem = N.equal(denom,0) denom = N.where(zerodivproblem,1,denom) # avoid zero-division in 1st place t = N.add.reduce(d,dimension) / denom # N-D COMPUTATION HERE!!!!!! t = N.where(zerodivproblem,1.0,t) # replace NaN/wrong t-values with 1.0 probs = abetai(0.5*df,0.5,float(df)/(df+t*t)) if type(t) == N.ndarray: probs = N.reshape(probs,t.shape) if probs.shape == (1,): probs = probs[0] if printit <> 0: statname = 'Related samples T-test.' outputpairedstats(printit,writemode, name1,n,x1,v1,N.minimum.reduce(N.ravel(a)), N.maximum.reduce(N.ravel(a)), name2,n,x2,v2,N.minimum.reduce(N.ravel(b)), N.maximum.reduce(N.ravel(b)), statname,t,probs) return return t, probs def achisquare(f_obs,f_exp=None): """ Calculates a one-way chi square for array of observed frequencies and returns the result. If no expected frequencies are given, the total N is assumed to be equally distributed across all groups. @@@NOT RIGHT?? Usage: achisquare(f_obs, f_exp=None) f_obs = array of observed cell freq. Returns: chisquare-statistic, associated p-value """ k = len(f_obs) if f_exp == None: f_exp = N.array([sum(f_obs)/float(k)] * len(f_obs),N.float_) f_exp = f_exp.astype(N.float_) chisq = N.add.reduce((f_obs-f_exp)**2 / f_exp) return chisq, achisqprob(chisq, k-1) def aks_2samp (data1,data2): """ Computes the Kolmogorov-Smirnof statistic on 2 samples. Modified from Numerical Recipies in C, page 493. Returns KS D-value, prob. Not ufunc- like. Usage: aks_2samp(data1,data2) where data1 and data2 are 1D arrays Returns: KS D-value, p-value """ j1 = 0 # N.zeros(data1.shape[1:]) TRIED TO MAKE THIS UFUNC-LIKE j2 = 0 # N.zeros(data2.shape[1:]) fn1 = 0.0 # N.zeros(data1.shape[1:],N.float_) fn2 = 0.0 # N.zeros(data2.shape[1:],N.float_) n1 = data1.shape[0] n2 = data2.shape[0] en1 = n1*1 en2 = n2*1 d = N.zeros(data1.shape[1:],N.float_) data1 = N.sort(data1,0) data2 = N.sort(data2,0) while j1 < n1 and j2 < n2: d1=data1[j1] d2=data2[j2] if d1 <= d2: fn1 = (j1)/float(en1) j1 = j1 + 1 if d2 <= d1: fn2 = (j2)/float(en2) j2 = j2 + 1 dt = (fn2-fn1) if abs(dt) > abs(d): d = dt # try: en = math.sqrt(en1*en2/float(en1+en2)) prob = aksprob((en+0.12+0.11/en)*N.fabs(d)) # except: # prob = 1.0 return d, prob def amannwhitneyu(x,y): """ Calculates a Mann-Whitney U statistic on the provided scores and returns the result. Use only when the n in each condition is < 20 and you have 2 independent samples of ranks. REMEMBER: Mann-Whitney U is significant if the u-obtained is LESS THAN or equal to the critical value of U. Usage: amannwhitneyu(x,y) where x,y are arrays of values for 2 conditions Returns: u-statistic, one-tailed p-value (i.e., p(z(U))) """ n1 = len(x) n2 = len(y) ranked = rankdata(N.concatenate((x,y))) rankx = ranked[0:n1] # get the x-ranks ranky = ranked[n1:] # the rest are y-ranks u1 = n1*n2 + (n1*(n1+1))/2.0 - sum(rankx) # calc U for x u2 = n1*n2 - u1 # remainder is U for y bigu = max(u1,u2) smallu = min(u1,u2) T = math.sqrt(tiecorrect(ranked)) # correction factor for tied scores if T == 0: raise ValueError, 'All numbers are identical in amannwhitneyu' sd = math.sqrt(T*n1*n2*(n1+n2+1)/12.0) z = abs((bigu-n1*n2/2.0) / sd) # normal approximation for prob calc return smallu, 1.0 - azprob(z) def atiecorrect(rankvals): """ Tie-corrector for ties in Mann Whitney U and Kruskal Wallis H tests. See Siegel, S. (1956) Nonparametric Statistics for the Behavioral Sciences. New York: McGraw-Hill. Code adapted from |Stat rankind.c code. Usage: atiecorrect(rankvals) Returns: T correction factor for U or H """ sorted,posn = ashellsort(N.array(rankvals)) n = len(sorted) T = 0.0 i = 0 while (i len(y): raise ValueError, 'Unequal N in awilcoxont. Aborting.' d = x-y d = N.compress(N.not_equal(d,0),d) # Keep all non-zero differences count = len(d) absd = abs(d) absranked = arankdata(absd) r_plus = 0.0 r_minus = 0.0 for i in range(len(absd)): if d[i] < 0: r_minus = r_minus + absranked[i] else: r_plus = r_plus + absranked[i] wt = min(r_plus, r_minus) mn = count * (count+1) * 0.25 se = math.sqrt(count*(count+1)*(2.0*count+1.0)/24.0) z = math.fabs(wt-mn) / se z = math.fabs(wt-mn) / se prob = 2*(1.0 -zprob(abs(z))) return wt, prob def akruskalwallish(*args): """ The Kruskal-Wallis H-test is a non-parametric ANOVA for 3 or more groups, requiring at least 5 subjects in each group. This function calculates the Kruskal-Wallis H and associated p-value for 3 or more independent samples. Usage: akruskalwallish(*args) args are separate arrays for 3+ conditions Returns: H-statistic (corrected for ties), associated p-value """ assert len(args) == 3, "Need at least 3 groups in stats.akruskalwallish()" args = list(args) n = [0]*len(args) n = map(len,args) all = [] for i in range(len(args)): all = all + args[i].tolist() ranked = rankdata(all) T = tiecorrect(ranked) for i in range(len(args)): args[i] = ranked[0:n[i]] del ranked[0:n[i]] rsums = [] for i in range(len(args)): rsums.append(sum(args[i])**2) rsums[i] = rsums[i] / float(n[i]) ssbn = sum(rsums) totaln = sum(n) h = 12.0 / (totaln*(totaln+1)) * ssbn - 3*(totaln+1) df = len(args) - 1 if T == 0: raise ValueError, 'All numbers are identical in akruskalwallish' h = h / float(T) return h, chisqprob(h,df) def afriedmanchisquare(*args): """ Friedman Chi-Square is a non-parametric, one-way within-subjects ANOVA. This function calculates the Friedman Chi-square test for repeated measures and returns the result, along with the associated probability value. It assumes 3 or more repeated measures. Only 3 levels requires a minimum of 10 subjects in the study. Four levels requires 5 subjects per level(??). Usage: afriedmanchisquare(*args) args are separate arrays for 2+ conditions Returns: chi-square statistic, associated p-value """ k = len(args) if k < 3: raise ValueError, '\nLess than 3 levels. Friedman test not appropriate.\n' n = len(args[0]) data = apply(pstat.aabut,args) data = data.astype(N.float_) for i in range(len(data)): data[i] = arankdata(data[i]) ssbn = asum(asum(args,1)**2) chisq = 12.0 / (k*n*(k+1)) * ssbn - 3*n*(k+1) return chisq, achisqprob(chisq,k-1) ##################################### #### APROBABILITY CALCULATIONS #### ##################################### def achisqprob(chisq,df): """ Returns the (1-tail) probability value associated with the provided chi-square value and df. Heavily modified from chisq.c in Gary Perlman's |Stat. Can handle multiple dimensions. Usage: achisqprob(chisq,df) chisq=chisquare stat., df=degrees of freedom """ BIG = 200.0 def ex(x): BIG = 200.0 exponents = N.where(N.less(x,-BIG),-BIG,x) return N.exp(exponents) if type(chisq) == N.ndarray: arrayflag = 1 else: arrayflag = 0 chisq = N.array([chisq]) if df < 1: return N.ones(chisq.shape,N.float) probs = N.zeros(chisq.shape,N.float_) probs = N.where(N.less_equal(chisq,0),1.0,probs) # set prob=1 for chisq<0 a = 0.5 * chisq if df > 1: y = ex(-a) if df%2 == 0: even = 1 s = y*1 s2 = s*1 else: even = 0 s = 2.0 * azprob(-N.sqrt(chisq)) s2 = s*1 if (df > 2): chisq = 0.5 * (df - 1.0) if even: z = N.ones(probs.shape,N.float_) else: z = 0.5 *N.ones(probs.shape,N.float_) if even: e = N.zeros(probs.shape,N.float_) else: e = N.log(N.sqrt(N.pi)) *N.ones(probs.shape,N.float_) c = N.log(a) mask = N.zeros(probs.shape) a_big = N.greater(a,BIG) a_big_frozen = -1 *N.ones(probs.shape,N.float_) totalelements = N.multiply.reduce(N.array(probs.shape)) while asum(mask)<>totalelements: e = N.log(z) + e s = s + ex(c*z-a-e) z = z + 1.0 # print z, e, s newmask = N.greater(z,chisq) a_big_frozen = N.where(newmask*N.equal(mask,0)*a_big, s, a_big_frozen) mask = N.clip(newmask+mask,0,1) if even: z = N.ones(probs.shape,N.float_) e = N.ones(probs.shape,N.float_) else: z = 0.5 *N.ones(probs.shape,N.float_) e = 1.0 / N.sqrt(N.pi) / N.sqrt(a) * N.ones(probs.shape,N.float_) c = 0.0 mask = N.zeros(probs.shape) a_notbig_frozen = -1 *N.ones(probs.shape,N.float_) while asum(mask)<>totalelements: e = e * (a/z.astype(N.float_)) c = c + e z = z + 1.0 # print '#2', z, e, c, s, c*y+s2 newmask = N.greater(z,chisq) a_notbig_frozen = N.where(newmask*N.equal(mask,0)*(1-a_big), c*y+s2, a_notbig_frozen) mask = N.clip(newmask+mask,0,1) probs = N.where(N.equal(probs,1),1, N.where(N.greater(a,BIG),a_big_frozen,a_notbig_frozen)) return probs else: return s def aerfcc(x): """ Returns the complementary error function erfc(x) with fractional error everywhere less than 1.2e-7. Adapted from Numerical Recipies. Can handle multiple dimensions. Usage: aerfcc(x) """ z = abs(x) t = 1.0 / (1.0+0.5*z) ans = t * N.exp(-z*z-1.26551223 + t*(1.00002368+t*(0.37409196+t*(0.09678418+t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+t*(-0.82215223+t*0.17087277))))))))) return N.where(N.greater_equal(x,0), ans, 2.0-ans) def azprob(z): """ Returns the area under the normal curve 'to the left of' the given z value. Thus, for z<0, zprob(z) = 1-tail probability for z>0, 1.0-zprob(z) = 1-tail probability for any z, 2.0*(1.0-zprob(abs(z))) = 2-tail probability Adapted from z.c in Gary Perlman's |Stat. Can handle multiple dimensions. Usage: azprob(z) where z is a z-value """ def yfunc(y): x = (((((((((((((-0.000045255659 * y +0.000152529290) * y -0.000019538132) * y -0.000676904986) * y +0.001390604284) * y -0.000794620820) * y -0.002034254874) * y +0.006549791214) * y -0.010557625006) * y +0.011630447319) * y -0.009279453341) * y +0.005353579108) * y -0.002141268741) * y +0.000535310849) * y +0.999936657524 return x def wfunc(w): x = ((((((((0.000124818987 * w -0.001075204047) * w +0.005198775019) * w -0.019198292004) * w +0.059054035642) * w -0.151968751364) * w +0.319152932694) * w -0.531923007300) * w +0.797884560593) * N.sqrt(w) * 2.0 return x Z_MAX = 6.0 # maximum meaningful z-value x = N.zeros(z.shape,N.float_) # initialize y = 0.5 * N.fabs(z) x = N.where(N.less(y,1.0),wfunc(y*y),yfunc(y-2.0)) # get x's x = N.where(N.greater(y,Z_MAX*0.5),1.0,x) # kill those with big Z prob = N.where(N.greater(z,0),(x+1)*0.5,(1-x)*0.5) return prob def aksprob(alam): """ Returns the probability value for a K-S statistic computed via ks_2samp. Adapted from Numerical Recipies. Can handle multiple dimensions. Usage: aksprob(alam) """ if type(alam) == N.ndarray: frozen = -1 *N.ones(alam.shape,N.float64) alam = alam.astype(N.float64) arrayflag = 1 else: frozen = N.array(-1.) alam = N.array(alam,N.float64) arrayflag = 1 mask = N.zeros(alam.shape) fac = 2.0 *N.ones(alam.shape,N.float_) sum = N.zeros(alam.shape,N.float_) termbf = N.zeros(alam.shape,N.float_) a2 = N.array(-2.0*alam*alam,N.float64) totalelements = N.multiply.reduce(N.array(mask.shape)) for j in range(1,201): if asum(mask) == totalelements: break exponents = (a2*j*j) overflowmask = N.less(exponents,-746) frozen = N.where(overflowmask,0,frozen) mask = mask+overflowmask term = fac*N.exp(exponents) sum = sum + term newmask = N.where(N.less_equal(abs(term),(0.001*termbf)) + N.less(abs(term),1.0e-8*sum), 1, 0) frozen = N.where(newmask*N.equal(mask,0), sum, frozen) mask = N.clip(mask+newmask,0,1) fac = -fac termbf = abs(term) if arrayflag: return N.where(N.equal(frozen,-1), 1.0, frozen) # 1.0 if doesn't converge else: return N.where(N.equal(frozen,-1), 1.0, frozen)[0] # 1.0 if doesn't converge def afprob (dfnum, dfden, F): """ Returns the 1-tailed significance level (p-value) of an F statistic given the degrees of freedom for the numerator (dfR-dfF) and the degrees of freedom for the denominator (dfF). Can handle multiple dims for F. Usage: afprob(dfnum, dfden, F) where usually dfnum=dfbn, dfden=dfwn """ if type(F) == N.ndarray: return abetai(0.5*dfden, 0.5*dfnum, dfden/(1.0*dfden+dfnum*F)) else: return abetai(0.5*dfden, 0.5*dfnum, dfden/float(dfden+dfnum*F)) def abetacf(a,b,x,verbose=1): """ Evaluates the continued fraction form of the incomplete Beta function, betai. (Adapted from: Numerical Recipies in C.) Can handle multiple dimensions for x. Usage: abetacf(a,b,x,verbose=1) """ ITMAX = 200 EPS = 3.0e-7 arrayflag = 1 if type(x) == N.ndarray: frozen = N.ones(x.shape,N.float_) *-1 #start out w/ -1s, should replace all else: arrayflag = 0 frozen = N.array([-1]) x = N.array([x]) mask = N.zeros(x.shape) bm = az = am = 1.0 qab = a+b qap = a+1.0 qam = a-1.0 bz = 1.0-qab*x/qap for i in range(ITMAX+1): if N.sum(N.ravel(N.equal(frozen,-1)))==0: break em = float(i+1) tem = em + em d = em*(b-em)*x/((qam+tem)*(a+tem)) ap = az + d*am bp = bz+d*bm d = -(a+em)*(qab+em)*x/((qap+tem)*(a+tem)) app = ap+d*az bpp = bp+d*bz aold = az*1 am = ap/bpp bm = bp/bpp az = app/bpp bz = 1.0 newmask = N.less(abs(az-aold),EPS*abs(az)) frozen = N.where(newmask*N.equal(mask,0), az, frozen) mask = N.clip(mask+newmask,0,1) noconverge = asum(N.equal(frozen,-1)) if noconverge <> 0 and verbose: print 'a or b too big, or ITMAX too small in Betacf for ',noconverge,' elements' if arrayflag: return frozen else: return frozen[0] def agammln(xx): """ Returns the gamma function of xx. Gamma(z) = Integral(0,infinity) of t^(z-1)exp(-t) dt. Adapted from: Numerical Recipies in C. Can handle multiple dims ... but probably doesn't normally have to. Usage: agammln(xx) """ coeff = [76.18009173, -86.50532033, 24.01409822, -1.231739516, 0.120858003e-2, -0.536382e-5] x = xx - 1.0 tmp = x + 5.5 tmp = tmp - (x+0.5)*N.log(tmp) ser = 1.0 for j in range(len(coeff)): x = x + 1 ser = ser + coeff[j]/x return -tmp + N.log(2.50662827465*ser) def abetai(a,b,x,verbose=1): """ Returns the incomplete beta function: I-sub-x(a,b) = 1/B(a,b)*(Integral(0,x) of t^(a-1)(1-t)^(b-1) dt) where a,b>0 and B(a,b) = G(a)*G(b)/(G(a+b)) where G(a) is the gamma function of a. The continued fraction formulation is implemented here, using the betacf function. (Adapted from: Numerical Recipies in C.) Can handle multiple dimensions. Usage: abetai(a,b,x,verbose=1) """ TINY = 1e-15 if type(a) == N.ndarray: if asum(N.less(x,0)+N.greater(x,1)) <> 0: raise ValueError, 'Bad x in abetai' x = N.where(N.equal(x,0),TINY,x) x = N.where(N.equal(x,1.0),1-TINY,x) bt = N.where(N.equal(x,0)+N.equal(x,1), 0, -1) exponents = ( gammln(a+b)-gammln(a)-gammln(b)+a*N.log(x)+b* N.log(1.0-x) ) # 746 (below) is the MAX POSSIBLE BEFORE OVERFLOW exponents = N.where(N.less(exponents,-740),-740,exponents) bt = N.exp(exponents) if type(x) == N.ndarray: ans = N.where(N.less(x,(a+1)/(a+b+2.0)), bt*abetacf(a,b,x,verbose)/float(a), 1.0-bt*abetacf(b,a,1.0-x,verbose)/float(b)) else: if x<(a+1)/(a+b+2.0): ans = bt*abetacf(a,b,x,verbose)/float(a) else: ans = 1.0-bt*abetacf(b,a,1.0-x,verbose)/float(b) return ans ##################################### ####### AANOVA CALCULATIONS ####### ##################################### import LinearAlgebra, operator LA = LinearAlgebra def aglm(data,para): """ Calculates a linear model fit ... anova/ancova/lin-regress/t-test/etc. Taken from: Peterson et al. Statistical limitations in functional neuroimaging I. Non-inferential methods and statistical models. Phil Trans Royal Soc Lond B 354: 1239-1260. Usage: aglm(data,para) Returns: statistic, p-value ??? """ if len(para) <> len(data): print "data and para must be same length in aglm" return n = len(para) p = pstat.aunique(para) x = N.zeros((n,len(p))) # design matrix for l in range(len(p)): x[:,l] = N.equal(para,p[l]) b = N.dot(N.dot(LA.inv(N.dot(N.transpose(x),x)), # i.e., b=inv(X'X)X'Y N.transpose(x)), data) diffs = (data - N.dot(x,b)) s_sq = 1./(n-len(p)) * N.dot(N.transpose(diffs), diffs) if len(p) == 2: # ttest_ind c = N.array([1,-1]) df = n-2 fact = asum(1.0/asum(x,0)) # i.e., 1/n1 + 1/n2 + 1/n3 ... t = N.dot(c,b) / N.sqrt(s_sq*fact) probs = abetai(0.5*df,0.5,float(df)/(df+t*t)) return t, probs def aF_oneway(*args): """ Performs a 1-way ANOVA, returning an F-value and probability given any number of groups. From Heiman, pp.394-7. Usage: aF_oneway (*args) where *args is 2 or more arrays, one per treatment group Returns: f-value, probability """ na = len(args) # ANOVA on 'na' groups, each in it's own array means = [0]*na vars = [0]*na ns = [0]*na alldata = [] tmp = map(N.array,args) means = map(amean,tmp) vars = map(avar,tmp) ns = map(len,args) alldata = N.concatenate(args) bign = len(alldata) sstot = ass(alldata)-(asquare_of_sums(alldata)/float(bign)) ssbn = 0 for a in args: ssbn = ssbn + asquare_of_sums(N.array(a))/float(len(a)) ssbn = ssbn - (asquare_of_sums(alldata)/float(bign)) sswn = sstot-ssbn dfbn = na-1 dfwn = bign - na msb = ssbn/float(dfbn) msw = sswn/float(dfwn) f = msb/msw prob = fprob(dfbn,dfwn,f) return f, prob def aF_value (ER,EF,dfR,dfF): """ Returns an F-statistic given the following: ER = error associated with the null hypothesis (the Restricted model) EF = error associated with the alternate hypothesis (the Full model) dfR = degrees of freedom the Restricted model dfF = degrees of freedom associated with the Restricted model """ return ((ER-EF)/float(dfR-dfF) / (EF/float(dfF))) def outputfstats(Enum, Eden, dfnum, dfden, f, prob): Enum = round(Enum,3) Eden = round(Eden,3) dfnum = round(Enum,3) dfden = round(dfden,3) f = round(f,3) prob = round(prob,3) suffix = '' # for *s after the p-value if prob < 0.001: suffix = ' ***' elif prob < 0.01: suffix = ' **' elif prob < 0.05: suffix = ' *' title = [['EF/ER','DF','Mean Square','F-value','prob','']] lofl = title+[[Enum, dfnum, round(Enum/float(dfnum),3), f, prob, suffix], [Eden, dfden, round(Eden/float(dfden),3),'','','']] pstat.printcc(lofl) return def F_value_multivariate(ER, EF, dfnum, dfden): """ Returns an F-statistic given the following: ER = error associated with the null hypothesis (the Restricted model) EF = error associated with the alternate hypothesis (the Full model) dfR = degrees of freedom the Restricted model dfF = degrees of freedom associated with the Restricted model where ER and EF are matrices from a multivariate F calculation. """ if type(ER) in [IntType, FloatType]: ER = N.array([[ER]]) if type(EF) in [IntType, FloatType]: EF = N.array([[EF]]) n_um = (LA.det(ER) - LA.det(EF)) / float(dfnum) d_en = LA.det(EF) / float(dfden) return n_um / d_en ##################################### ####### ASUPPORT FUNCTIONS ######## ##################################### def asign(a): """ Usage: asign(a) Returns: array shape of a, with -1 where a<0 and +1 where a>=0 """ a = N.asarray(a) if ((type(a) == type(1.4)) or (type(a) == type(1))): return a-a-N.less(a,0)+N.greater(a,0) else: return N.zeros(N.shape(a))-N.less(a,0)+N.greater(a,0) def asum (a, dimension=None,keepdims=0): """ An alternative to the Numeric.add.reduce function, which allows one to (1) collapse over multiple dimensions at once, and/or (2) to retain all dimensions in the original array (squashing one down to size. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). If keepdims=1, the resulting array will have as many dimensions as the input array. Usage: asum(a, dimension=None, keepdims=0) Returns: array summed along 'dimension'(s), same _number_ of dims if keepdims=1 """ if type(a) == N.ndarray and a.dtype in [N.int_, N.short, N.ubyte]: a = a.astype(N.float_) if dimension == None: s = N.sum(N.ravel(a)) elif type(dimension) in [IntType,FloatType]: s = N.add.reduce(a, dimension) if keepdims == 1: shp = list(a.shape) shp[dimension] = 1 s = N.reshape(s,shp) else: # must be a SEQUENCE of dims to sum over dims = list(dimension) dims.sort() dims.reverse() s = a *1.0 for dim in dims: s = N.add.reduce(s,dim) if keepdims == 1: shp = list(a.shape) for dim in dims: shp[dim] = 1 s = N.reshape(s,shp) return s def acumsum (a,dimension=None): """ Returns an array consisting of the cumulative sum of the items in the passed array. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions, but this last one just barely makes sense). Usage: acumsum(a,dimension=None) """ if dimension == None: a = N.ravel(a) dimension = 0 if type(dimension) in [ListType, TupleType, N.ndarray]: dimension = list(dimension) dimension.sort() dimension.reverse() for d in dimension: a = N.add.accumulate(a,d) return a else: return N.add.accumulate(a,dimension) def ass(inarray, dimension=None, keepdims=0): """ Squares each value in the passed array, adds these squares & returns the result. Unfortunate function name. :-) Defaults to ALL values in the array. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). Set keepdims=1 to maintain the original number of dimensions. Usage: ass(inarray, dimension=None, keepdims=0) Returns: sum-along-'dimension' for (inarray*inarray) """ if dimension == None: inarray = N.ravel(inarray) dimension = 0 return asum(inarray*inarray,dimension,keepdims) def asummult (array1,array2,dimension=None,keepdims=0): """ Multiplies elements in array1 and array2, element by element, and returns the sum (along 'dimension') of all resulting multiplications. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). A trivial function, but included for completeness. Usage: asummult(array1,array2,dimension=None,keepdims=0) """ if dimension == None: array1 = N.ravel(array1) array2 = N.ravel(array2) dimension = 0 return asum(array1*array2,dimension,keepdims) def asquare_of_sums(inarray, dimension=None, keepdims=0): """ Adds the values in the passed array, squares that sum, and returns the result. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). If keepdims=1, the returned array will have the same NUMBER of dimensions as the original. Usage: asquare_of_sums(inarray, dimension=None, keepdims=0) Returns: the square of the sum over dim(s) in dimension """ if dimension == None: inarray = N.ravel(inarray) dimension = 0 s = asum(inarray,dimension,keepdims) if type(s) == N.ndarray: return s.astype(N.float_)*s else: return float(s)*s def asumdiffsquared(a,b, dimension=None, keepdims=0): """ Takes pairwise differences of the values in arrays a and b, squares these differences, and returns the sum of these squares. Dimension can equal None (ravel array first), an integer (the dimension over which to operate), or a sequence (operate over multiple dimensions). keepdims=1 means the return shape = len(a.shape) = len(b.shape) Usage: asumdiffsquared(a,b) Returns: sum[ravel(a-b)**2] """ if dimension == None: inarray = N.ravel(a) dimension = 0 return asum((a-b)**2,dimension,keepdims) def ashellsort(inarray): """ Shellsort algorithm. Sorts a 1D-array. Usage: ashellsort(inarray) Returns: sorted-inarray, sorting-index-vector (for original array) """ n = len(inarray) svec = inarray *1.0 ivec = range(n) gap = n/2 # integer division needed while gap >0: for i in range(gap,n): for j in range(i-gap,-1,-gap): while j>=0 and svec[j]>svec[j+gap]: temp = svec[j] svec[j] = svec[j+gap] svec[j+gap] = temp itemp = ivec[j] ivec[j] = ivec[j+gap] ivec[j+gap] = itemp gap = gap / 2 # integer division needed # svec is now sorted input vector, ivec has the order svec[i] = vec[ivec[i]] return svec, ivec def arankdata(inarray): """ Ranks the data in inarray, dealing with ties appropritely. Assumes a 1D inarray. Adapted from Gary Perlman's |Stat ranksort. Usage: arankdata(inarray) Returns: array of length equal to inarray, containing rank scores """ n = len(inarray) svec, ivec = ashellsort(inarray) sumranks = 0 dupcount = 0 newarray = N.zeros(n,N.float_) for i in range(n): sumranks = sumranks + i dupcount = dupcount + 1 if i==n-1 or svec[i] <> svec[i+1]: averank = sumranks / float(dupcount) + 1 for j in range(i-dupcount+1,i+1): newarray[ivec[j]] = averank sumranks = 0 dupcount = 0 return newarray def afindwithin(data): """ Returns a binary vector, 1=within-subject factor, 0=between. Input equals the entire data array (i.e., column 1=random factor, last column = measured values. Usage: afindwithin(data) data in |Stat format """ numfact = len(data[0])-2 withinvec = [0]*numfact for col in range(1,numfact+1): rows = pstat.linexand(data,col,pstat.unique(pstat.colex(data,1))[0]) # get 1 level of this factor if len(pstat.unique(pstat.colex(rows,0))) < len(rows): # if fewer subjects than scores on this factor withinvec[col-1] = 1 return withinvec ######################################################### ######################################################### ###### RE-DEFINE DISPATCHES TO INCLUDE ARRAYS ######### ######################################################### ######################################################### ## CENTRAL TENDENCY: geometricmean = Dispatch ( (lgeometricmean, (ListType, TupleType)), (ageometricmean, (N.ndarray,)) ) harmonicmean = Dispatch ( (lharmonicmean, (ListType, TupleType)), (aharmonicmean, (N.ndarray,)) ) mean = Dispatch ( (lmean, (ListType, TupleType)), (amean, (N.ndarray,)) ) median = Dispatch ( (lmedian, (ListType, TupleType)), (amedian, (N.ndarray,)) ) medianscore = Dispatch ( (lmedianscore, (ListType, TupleType)), (amedianscore, (N.ndarray,)) ) mode = Dispatch ( (lmode, (ListType, TupleType)), (amode, (N.ndarray,)) ) tmean = Dispatch ( (atmean, (N.ndarray,)) ) tvar = Dispatch ( (atvar, (N.ndarray,)) ) tstdev = Dispatch ( (atstdev, (N.ndarray,)) ) tsem = Dispatch ( (atsem, (N.ndarray,)) ) ## VARIATION: moment = Dispatch ( (lmoment, (ListType, TupleType)), (amoment, (N.ndarray,)) ) variation = Dispatch ( (lvariation, (ListType, TupleType)), (avariation, (N.ndarray,)) ) skew = Dispatch ( (lskew, (ListType, TupleType)), (askew, (N.ndarray,)) ) kurtosis = Dispatch ( (lkurtosis, (ListType, TupleType)), (akurtosis, (N.ndarray,)) ) describe = Dispatch ( (ldescribe, (ListType, TupleType)), (adescribe, (N.ndarray,)) ) ## DISTRIBUTION TESTS skewtest = Dispatch ( (askewtest, (ListType, TupleType)), (askewtest, (N.ndarray,)) ) kurtosistest = Dispatch ( (akurtosistest, (ListType, TupleType)), (akurtosistest, (N.ndarray,)) ) normaltest = Dispatch ( (anormaltest, (ListType, TupleType)), (anormaltest, (N.ndarray,)) ) ## FREQUENCY STATS: itemfreq = Dispatch ( (litemfreq, (ListType, TupleType)), (aitemfreq, (N.ndarray,)) ) scoreatpercentile = Dispatch ( (lscoreatpercentile, (ListType, TupleType)), (ascoreatpercentile, (N.ndarray,)) ) percentileofscore = Dispatch ( (lpercentileofscore, (ListType, TupleType)), (apercentileofscore, (N.ndarray,)) ) histogram = Dispatch ( (lhistogram, (ListType, TupleType)), (ahistogram, (N.ndarray,)) ) cumfreq = Dispatch ( (lcumfreq, (ListType, TupleType)), (acumfreq, (N.ndarray,)) ) relfreq = Dispatch ( (lrelfreq, (ListType, TupleType)), (arelfreq, (N.ndarray,)) ) ## VARIABILITY: obrientransform = Dispatch ( (lobrientransform, (ListType, TupleType)), (aobrientransform, (N.ndarray,)) ) samplevar = Dispatch ( (lsamplevar, (ListType, TupleType)), (asamplevar, (N.ndarray,)) ) samplestdev = Dispatch ( (lsamplestdev, (ListType, TupleType)), (asamplestdev, (N.ndarray,)) ) signaltonoise = Dispatch( (asignaltonoise, (N.ndarray,)),) var = Dispatch ( (lvar, (ListType, TupleType)), (avar, (N.ndarray,)) ) stdev = Dispatch ( (lstdev, (ListType, TupleType)), (astdev, (N.ndarray,)) ) sterr = Dispatch ( (lsterr, (ListType, TupleType)), (asterr, (N.ndarray,)) ) sem = Dispatch ( (lsem, (ListType, TupleType)), (asem, (N.ndarray,)) ) z = Dispatch ( (lz, (ListType, TupleType)), (az, (N.ndarray,)) ) zs = Dispatch ( (lzs, (ListType, TupleType)), (azs, (N.ndarray,)) ) ## TRIMMING FCNS: threshold = Dispatch( (athreshold, (N.ndarray,)),) trimboth = Dispatch ( (ltrimboth, (ListType, TupleType)), (atrimboth, (N.ndarray,)) ) trim1 = Dispatch ( (ltrim1, (ListType, TupleType)), (atrim1, (N.ndarray,)) ) ## CORRELATION FCNS: paired = Dispatch ( (lpaired, (ListType, TupleType)), (apaired, (N.ndarray,)) ) lincc = Dispatch ( (llincc, (ListType, TupleType)), (alincc, (N.ndarray,)) ) pearsonr = Dispatch ( (lpearsonr, (ListType, TupleType)), (apearsonr, (N.ndarray,)) ) spearmanr = Dispatch ( (lspearmanr, (ListType, TupleType)), (aspearmanr, (N.ndarray,)) ) pointbiserialr = Dispatch ( (lpointbiserialr, (ListType, TupleType)), (apointbiserialr, (N.ndarray,)) ) kendalltau = Dispatch ( (lkendalltau, (ListType, TupleType)), (akendalltau, (N.ndarray,)) ) linregress = Dispatch ( (llinregress, (ListType, TupleType)), (alinregress, (N.ndarray,)) ) ## INFERENTIAL STATS: ttest_1samp = Dispatch ( (lttest_1samp, (ListType, TupleType)), (attest_1samp, (N.ndarray,)) ) ttest_ind = Dispatch ( (lttest_ind, (ListType, TupleType)), (attest_ind, (N.ndarray,)) ) ttest_rel = Dispatch ( (lttest_rel, (ListType, TupleType)), (attest_rel, (N.ndarray,)) ) chisquare = Dispatch ( (lchisquare, (ListType, TupleType)), (achisquare, (N.ndarray,)) ) ks_2samp = Dispatch ( (lks_2samp, (ListType, TupleType)), (aks_2samp, (N.ndarray,)) ) mannwhitneyu = Dispatch ( (lmannwhitneyu, (ListType, TupleType)), (amannwhitneyu, (N.ndarray,)) ) tiecorrect = Dispatch ( (ltiecorrect, (ListType, TupleType)), (atiecorrect, (N.ndarray,)) ) ranksums = Dispatch ( (lranksums, (ListType, TupleType)), (aranksums, (N.ndarray,)) ) wilcoxont = Dispatch ( (lwilcoxont, (ListType, TupleType)), (awilcoxont, (N.ndarray,)) ) kruskalwallish = Dispatch ( (lkruskalwallish, (ListType, TupleType)), (akruskalwallish, (N.ndarray,)) ) friedmanchisquare = Dispatch ( (lfriedmanchisquare, (ListType, TupleType)), (afriedmanchisquare, (N.ndarray,)) ) ## PROBABILITY CALCS: chisqprob = Dispatch ( (lchisqprob, (IntType, FloatType)), (achisqprob, (N.ndarray,)) ) zprob = Dispatch ( (lzprob, (IntType, FloatType)), (azprob, (N.ndarray,)) ) ksprob = Dispatch ( (lksprob, (IntType, FloatType)), (aksprob, (N.ndarray,)) ) fprob = Dispatch ( (lfprob, (IntType, FloatType)), (afprob, (N.ndarray,)) ) betacf = Dispatch ( (lbetacf, (IntType, FloatType)), (abetacf, (N.ndarray,)) ) betai = Dispatch ( (lbetai, (IntType, FloatType)), (abetai, (N.ndarray,)) ) erfcc = Dispatch ( (lerfcc, (IntType, FloatType)), (aerfcc, (N.ndarray,)) ) gammln = Dispatch ( (lgammln, (IntType, FloatType)), (agammln, (N.ndarray,)) ) ## ANOVA FUNCTIONS: F_oneway = Dispatch ( (lF_oneway, (ListType, TupleType)), (aF_oneway, (N.ndarray,)) ) F_value = Dispatch ( (lF_value, (ListType, TupleType)), (aF_value, (N.ndarray,)) ) ## SUPPORT FUNCTIONS: incr = Dispatch ( (lincr, (ListType, TupleType, N.ndarray)), ) sum = Dispatch ( (lsum, (ListType, TupleType)), (asum, (N.ndarray,)) ) cumsum = Dispatch ( (lcumsum, (ListType, TupleType)), (acumsum, (N.ndarray,)) ) ss = Dispatch ( (lss, (ListType, TupleType)), (ass, (N.ndarray,)) ) summult = Dispatch ( (lsummult, (ListType, TupleType)), (asummult, (N.ndarray,)) ) square_of_sums = Dispatch ( (lsquare_of_sums, (ListType, TupleType)), (asquare_of_sums, (N.ndarray,)) ) sumdiffsquared = Dispatch ( (lsumdiffsquared, (ListType, TupleType)), (asumdiffsquared, (N.ndarray,)) ) shellsort = Dispatch ( (lshellsort, (ListType, TupleType)), (ashellsort, (N.ndarray,)) ) rankdata = Dispatch ( (lrankdata, (ListType, TupleType)), (arankdata, (N.ndarray,)) ) findwithin = Dispatch ( (lfindwithin, (ListType, TupleType)), (afindwithin, (N.ndarray,)) ) ###################### END OF NUMERIC FUNCTION BLOCK ##################### ###################### END OF STATISTICAL FUNCTIONS ###################### except ImportError: pass gamera-3.3.3/gamera/symbol_table.py0000644000076500000000000000655311652050143016232 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import string, keyword from gamera import util class SymbolTable(util.CallbackObject): def __init__(self): util.CallbackObject.__init__(self) self.symbols = {} self.add("skip", 0) ######################################## # CALLBACKS def add_callback(self, alert, callback): util.CallbackObject.add_callback(self, alert, callback) if alert == "add": for symbol in self.symbols.keys(): callback(self.normalize_symbol(symbol)[1]) ######################################## def normalize_symbol(self, symbol): # assert type(symbol) == types.StringType while len(symbol) and symbol[0] == '.': symbol = symbol[1:] if symbol == '': return '', [] symbol = symbol.lower() orig_tokens = symbol.strip().split('.') tokens = [] for token in orig_tokens: if token.strip() != '': tokens.append(token.strip()) symbol = '.'.join(tokens) return symbol, tokens def add(self, symbol, id = -1): symbol, tokens = self.normalize_symbol(symbol) if self.symbols.has_key(symbol): return symbol self.symbols[symbol] = None self.trigger_callback('add', tokens) return symbol def remove(self, symbol): symbol, tokens = self.normalize_symbol(symbol) if self.symbols.has_key(symbol): del self.symbols[symbol] self.trigger_callback('remove', tokens) return 1 return 0 def autocomplete(self, symbol): targets = self.symbols.keys() targets.sort() found_i = -1 for i in range(len(targets)): if targets[i].startswith(symbol): found_i = i break if found_i != -1: found = targets[found_i] if found_i < len(targets) - 1: found_last = -1 for i in range(found_i + 1, len(targets)): if targets[i].startswith(symbol): found_last = i else: break if found_last != -1: found_last = targets[found_last] found_it = 0 for i in range(len(symbol), min(len(found), len(found_last))): if found[i] != found_last[i]: found_it = 1 break if found_it: found = found[:i] return found return symbol def exists(self, symbol): return self.symbols.has_key(symbol) gamera-3.3.3/gamera/test/0000755000076500000000000000000011755376174014175 5ustar chriswheelgamera-3.3.3/gamera/test/Grey16_generic.tiff0000644000076500000000000002752210714675710017620 0ustar chriswheelII*¸.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<³; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <â;c;;É:Ò<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ö;š;";ì:ï:;í: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Ë;<;Ç::Ö:ñ:;;,;?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ó;Œ;;ç:ä:Ï:û:;);<;O;`;p<<<<<<<<<<<<<<<<<<<<<<<<<<<·;;ì:ê:û:;; ;';>;P;e;z;‰;Ÿ<<<<<<<<<<<<<<<<<<<<<<< <ß;i;ê:ı:Î:;;2;D;,;S;z;‰;˜;İ;ĥ;;Ï<<<<<<<<<<<<<<<<<<<<<û;¤;;É:Ċ:Ö:Ú:;8;G;Y;b;J;€;Š;›;;Ĵ;ħ;ĥ;Ĉ<<<<<<<<<<<<<<<<<<<Ì;L;Ë:·:É:Ŝ:ô:˙:;8;O;_;p;p;r;;µ;;Ò;;ĥ;Ó;Ŝ<<<<<<<<<<<<<<<<ï;ˆ;û:ğ:ħ:Ö: ;;2;D;W;j;z;ˆ;–; ;„;¤;Ë;×;â;ê;;Ó;ĉ;ñ<<<<<<<<<<<<<<·;';:ĵ:Ê:Ú:Ú:;2;D;Q;W;e;o;{;„;‰;“;’;Î;â;í;÷;ĝ;Î;ê;÷;˙<<<<<<<<<<<è;y;è:Ğ::Ó:ç:û:ŝ:;%;;;J;Z;g;u;„;’;ž;İ;;;ê;÷;˙;<ü;Ŝ;û;< <<<<<<<<û;;,;ċ:Ô:²:Ö::;;;;9;P;];l;z;€;‰;—;¤;;µ;;;ß;ĉ;ċ;í;ñ;ô;˙;<<<<<<<Ö;T;ó:Ö:Ŝ:í:ċ:Ŝ:;;;#;0;8;P;`;m;…;Š;‰;­;;Ó;Ŝ;â;;Û;é;ñ;ú;< <<<<#<<<ï;Œ;ġ:¤:¨::Ò:ċ:ô:˙:;%;5;A;P;J;b;{;…;’;œ;—;İ;ß;ê;ô;ü;í;Î;ì;ô;ü;< < <<< <#<Ì;I;à:È:­::Ŝ::;;;.;;;G;T;`;g;`;„;“;;İ;­; ;×;ô;ü;< <ç;é;<<<)<2<;<A<M<S<Z;Ġ:Ù:ĉ:ç:Ë::;;;);5;D;Q;W;c;r;p;;œ;;;ş;ş;ĥ;ô;< <<<ċ;<-<5<;<A<G<L<Q<U<W<[Ŝ::˙: ;ê:; ;2;J;X;i;u;…;“;Ÿ;Ş;Ş;ƒ;;;ĥ;Â;Ç;ğ;×;< <<< <é;<#<#<)<%<<%<-<2<5<8;;%;; ;I;[;g;t;;‰;“;Ÿ;Ĥ;­;ĥ;Ħ;“;Ş;µ;ğ;Ç;Ë;Î;Û;ô;ü;< <ô;</<9<A<J<><<2<;<A<D<H#;/;8;;5;R;];e;q;g;p;{;‰;;˜;;—;;ß;é;ô;˙; <<<<&<-<,<û;)<F<L<P<U<8<<;<A<F<J<J);8;/;/;e;u;;’;˜;n;€;—; ;İ;²;­;Ş;ê;ú;˙;< <<<<<#< <<<A<M<R<X<Z<)<)<A<F<J<O<J`;c;>;j;;—; ;Ş;œ;{;œ;İ;;ĥ;;­;·;Ú;á;Û;â;ĉ;ñ;ñ;û;˙; <<<<M<T<Z<_<[<#<9<G<J<O<R<Fj;\;U;“; ;Ş;²;ĥ;‰;—;­;µ;;Ĉ;;³;Ó;Ŝ;ĉ;í;ô;û;˙;< <<<<<2<R<X<\<]<M<"<<<C<A<D<D<;Z;R;‰;İ;²;ğ;;²;Ž;;ğ;;Ê;Ï;Â;Ĉ;;ê;ñ;÷;û;˙;< <<<<<<#<&<)<,<3<2<5<<<G<J<O<Q<;c;p;Ş;ş;ż;Ç;Ê;; ;ş;Â;Ç;Í;Ë;Â;Î;Ŝ;Ŝ;ċ;é;í;í;<</<:<A<<<-<5<8<><C<F<I<M<P<T<W<T<;g;„;œ;¤;Ħ;¤;İ;¤;;ş;;Ê;Ö;Ë;Í;ê;ô;û;˙;<ñ; <><F<J<O<O<< <3<8<><A<A<D<G<J<J<J<J<D<;{;—;Ÿ;İ;ħ;ı;;Ĉ;Î;Ó;Ú;á;â;Î;â;÷;ŝ;< < <ñ;,<G<L<P<S<G<<#<)<-<2<><G<Q<Z<g<q<u<{<W<A—;İ;;ĥ;½;;È;Î;Ó;Ú;Ŝ;â;Ŝ;Ó;ô;˙;< <<<˙;A<L<P<U<X<2< <X<c<h<m<r<u<z<~<€<„<…<…<O<G¤;İ;­;²;ş;;Ç;Î;á;ĉ;ô;÷;×;ċ;˙;< <<<ú;<J<P<U<X<Y<<<<e<j<n<p<r<u<u<u<u<u<p<g<><IÎ;×;â;ê;ô;û;< <<<<<Ŭ;÷;< <<<<û;9<M<M<O<Q<D<<9<I<G<G<A<A<7<A<C<I<L<U<O<<<wê;ñ;÷;ŝ;< < <<<<<ô;á;ü;<<< < <<< </<2<><#<<U<`<e<o<r<T<.<M<T<W<Z<]<O<A<ˆè;ê;ê;ĉ;ĉ;ĉ;ĉ;â;ĉ;é;ê;á;<<)</<8<><G<K<Q<U<[<_<]<#<;<k<q<r<u<u<@<5<R<U<Y<[<]<G<><lÚ;;í;Ë;Ê;ċ;í;ó;÷;ü;í;í;0<;<A<D<I<L<P<S<U<Z<\<_<S<<U<o<r<u<u<r<2<A<T<U<Z<[<\<><C<X< <ŝ;Ĉ;ß;ñ;ô;ú;˙;˙;ĉ; <6<;<:<><><?<5<5</</<&<'<<<g<r<u<u<z<e<,<J<T<U<Z<[<Y<:<R<b < <Ŝ;Í;í;ô;ú;˙;<ĝ;ċ;ĝ;<< < <<<<#<)<-<2<3<<8<n<r<u<z<z<O<-<O<T<U<Y<[<R<6<X<`< <Í;ċ;ô;ú;˙;<<ê;ô;<<<<<#<&<+<-<0<3<5<2<<R<p<r<r<u<t<5<0<J<I<G<G<G<<<5<B<G<í;Ï;ô;ú;˙;<<˙;ĉ;<<<<<"<%<(<)<*<-</</<#<<;<A<5<7<5<8<5<9<A<D<M<Q<S<<<<<\<` <;â;ú;ŝ;˙;<<ñ;í; < < < < < < <<<#<2<9<A<<<:<><A<D<I<J<N<P<R<T<U<Y<W<5<D<_<`í;Ï;â;é;ċ;ê;í;í;ĉ;ö;< <<<< <<R<\<_<b<g<]<</<A<D<G<G<K<L<O<P<P<R<S<W<O<0<N<_<_ċ;;ô;ĝ;˙;< <ĝ;í;<<<<"< <<*<]<`<b<e<h<G<<8<@<A<A<A<C<><><<<<<;<A<D<:</<U<^<_÷;ŝ;˙;<< < <ê;ĝ;<<<<#<<<L<_<b<c<g<g<)<<#<)<,<;<D<R<W<j<q<u<{<<<T<2<W<]<_ SH°.B/J/@@gamera-3.3.3/gamera/test/GreyScale_generic.tiff0000644000076500000000000001514610714675710020420 0ustar chriswheelII*ÌÍÒÏÊÈËÒÓÔĜÖÓÍÉÉÊËÌÈÄÈÌĈĊÇÂÀżżÁżÄÄÄĊÇËÏÏËÇĊÏ×ÌÈĈĈÇÈĊĈÈËÍÑÓÈżıÁĊÈËÍÑÚÖÌÊÉÈÈÉÌÒÑÒÓÎÊÇĈÈÉÄÎÌÌËËÇżÁÈÉÌÎÒÒÏÌÊÊÊÊÉÉÈÇÈĊÂÄÈÈÀ½ı½ÁÁÁÄÇÈÁÈÎÊÇĈĈÇÎÔÇÁÀĈÄżÄÈÇÈÊÑÏÀıÂÊÊÎÌÊÇÄÈÄÇÉÊÑÙÏÊÇĈÈÇÄÉÇÇÇÇÇĈĈĊĈÉËÎÏÉÇÉÊÊÉÈÇÇÇĈĊĈÉĊÂÁżĵÄÇĊĈĈĈĈÇÉÌÈĈÄÄĊÇÌÇÄÀÂÁÀÁÄÈĊĊĈżÈËÓ×ɽ¸żĈÊĠËÄÎÖËĈĈĊĊĊÄÂÁÂĊĈĈÇĊżÁĊĈÊÈÂĊÈÈĊÄĊÇÉÇÇÊĈÂÂÀş´şÀÇÈĈÊÔÉÁĈĈĈÂıÀĈÄÄÁÂÂÁÂÄĈĊÁĵ½ÀżÀĊÊËÎËĈÂÁÂÄÄÉÒĜÍÂÄĈÄÂÂÁżÁżÄĈÂÁÁ½ş½żÀÂÀżÀÁÂÁÀÁÄÇÇÄÁÀÂÂÄş·ħğÇĊÄÇÈÁÁÂÀşµĊÁÀÀÀÁÁÁÂÄĈĈÀĵ¸ĵÂÀÊÂÁÂÂÀÂÊÏÇÂÀÂżşĵÁÁÁÂÂÁż½ÁÁĵşĵÀ½ğşı½şışğ·¸żżżÀÁÀż½ıı¸ğ½żÀÂÀżÀğ³ĥÂşğżÀÂÀżÀÀÀÁĵğĵÂÀş·´Żĥ½ş·½ÁÂĈı­µ·ıığÀÂÀÁÂğÁÁğ¸şş¸¸şşğĵı²¸ĵ½½½ÀÀ½ş¸¸¸·ĵ½ğşğżÁ½Á½ĵğ½ğşşĵÁż½½Áż½ĵğĵ½ğğğĵĈ²Ÿ§Ğ²°Ş´ğÁÁş·ĥĥĥĥĥşżÁżżÀıĽżżżğıışğĵĵĵşşĵ½½ĵğı¸·´ĥ·¸½ğşĊÀżżżż½ğğğ½½ğÁÇÄÀĵµğ½½şĥşż½ş¸µ·ı²ı²ĴĤ³şż½ğı·ĥµ°¸Áğğ½ğıÁÀÀÀÄżĵşşğĵż½ĵ½ĵş·´ĥ¸¸ışğÁżÉĊÁżżÀÁÀ½ĵĵÂÉÉÂżğµ·ığĵĵÁż¸²­³ğÁ½ğ¸ĥĥ·şÁÉÂżż½ĵğşıışşğıÀĊÂÀż½ğğĵÀğ½Àżż½ĵĵĵ¸·¸ıĵżżÀÁÉĈÂÁÁżşÂÈÇÈÈż´ĥĥĥ¸ğÀÀ𸸽żÀÀżÀğ·ğÁĊÂÀĵğżÂĈĊÈÉÄÄÄĊĊĈȽğÁÂÄĊÀżżżÀÀżżżÀÁÁż½ĵğĵ½½ÂÁÂĈÁÀÁÁÀ½ÀĈËş´Žsz„“Ĥ·³·ğÀÂÀÀÂÄÇĈĈÇÄÁşĵÇÒÏÍÎÈĊÇÉÊÌÎÑËÈÇÇÄÀ½ÁÁÉĈÂÀÄĊżÀÁÁÀÁÂÂÂÁż½ğĈÁÀÁÂÄÄÄÄÂÁÂğıĥĵżışşĤl3)37Y‹°Àğğ½ÁÁÀÄĈĈÈËËÈÇÇÇÈÎ×ÑÏÏÏÍÌÓÒÔÙĜÔÒÔÊĊżÀĈËÌĊÁÂÂÁÁĊÇĊÄĊÂÁÀżÀÁĈÈÄÄĈÈÊÈĊÈÉÁ½ğı·µ·ħ§¤ …M %g°Çşğ½żÂÇÇÇÇÌÒÍÌÏĠĠÒÒÒÒÔÚĠĠÖĜÖÔ×ÜŬÖÒÍÊÇÀżĊÌĠÌÂÂÂÁĈÊËÉÉËÉÇÂÁÄĊÁĊÉĈĈĈÇÉÌÓËÄĈÇÁğııµ³³œ‡‚†g9"-sµĊĵşğĵżÄËÍÊÈÍÓÒÒÑĠÙÖÔÔÖÙŬŬŬÜÚ×ĠĜßá×ÌÉÉÂÁÇËÌÄżÂÄÈÍËÌÎÊÇĈĈĊÄĊĈÉÈÉÊÌÏÔËÈÇÉÀışıĴ‘qa\J7=†ĵÀ½ğğı½ÉÔ×ÍĈËÒŬÙÑÑ×ÛÙÙÚÜŜàáŜÛÚÚßßÓÈÊÊÈÈÇÈĊÂÀÀÂÄĊÄĊÇÌÏÌÌÌÍÎÉĊĈĈĈÈËÊÊÌÏÖÎÍÎÍÇżĥş½ĈÀŒvbO<*?‹żĊÀż½½ÁÉÖĠËÈÊÒàÙÖĠÖÖÖ×ÙÚáâäçàŬÜÜßÛÉÌÉÉÎÂğ½ÁÄĊĈÉËÍËÉĈÊÏÉÇĈÄÄĈÈÊÊÊÉÊËÈÈÉÌÉż·¸ıŸŠslfV8$$B„ğĊÂĊżÂĊÉÑÔÇÇÓŜÛÛßĜĠÒĠ×ÙÛßċĉâŜßàŜŜĜÉÉÌÍÒÉĈÁğ¸ĵÀÂÄĈÇÉÊÉÈĈÄÄÄÂÇÊÉÈÈÈÈÇĊÁÂĊ½ıżÀœmV\ZV_D '(=†ĵÄżÂĈËÉÉËÍĈÌÜċßÜÛÙ×Ö×ĜĜÛŜŜÜÜŜÜÚĜÒÍÊËÌÌżĵışżĈĈÇÈĊÄÂĵğÀÂżÄÉÈĊÁÀÇËĈÀż½ğğĊ¸DL]]giC&"UĦ½ıżÄÊÎÈÄÇÈËÑÓĠ×ĠÓÖÙĜ×ÙÜÛÛÙ×××ĜÙÚ×ÔÓÏÊËÊÀż½ğş¸ÉĈÄÁżżÁÂÄżżÁÄÂÁÁÁĵĵÁÁÁÀÂÀ½şşıЁ\kpl{xH#!qµż·ĵÍÊĊżÁÂĊÈËÎÑÑÓÖĠÒÑÑÑÑÑÑÒÓĠ×ĜÚĠÓÓÌÈɽĵğşşı½ÄÀĵ½żÀÁÂÄĊÀżżżżÁżğĵĵğĵı·żÀ½ğ·Ż§‘€~wq†H %€¸şĵÁÌËĊÄżĵÁĊÈËÊÇÌĠÏÍÌÊÊÉÉÊÌÍÏÓÖÚß×ÎÍÌÊËşı·şğĵĵĊ½¸şżĊÁÀÁÁÀżżğ¸şı¸¸şĵğşı½ÂÀżÀÀ³Ğİ’w€†{~h98„ĥÁ¸ışĵ½ÀışĵżÂÇÉĈÂĊĈÈÇÄÂÁÂÄÇÊĠà×ËĊÇÉÊ˸·····¸½½·¸¸şżżÁÀĵı·µ²°­²¸ĵğşĵÁÄÂÀÁÄĥİħħŽsˆ•‹Z4B‹şıĥ´ħ°´Ğ§´ĵÁÊÄş­ıżĈżÀ²´ÁĊĊĊÇż´ğÀĈĈÄĥĥĥĥ²Ğħ··´µıış½Àżĵıĥµµĥ³°Ż³ı½ğ½ÁÈËĈÏ· ž³´|Šš˜‡Y(!(@¸ĵĥµŻ­¨˘ħ¸½ĈÉĵݨ¸ÄÄżÀğ²Ĵ·Ĉĵ§´´·ĵĈÂĥ·³²°Ż³²²³µ¸ĵżÁÄÁĵş¸·ĥ·¸¸¸¸¸ığĵ½żÁĈÎĦˆ£ÁށpŠ}S'$ C•¸·µ´´µµ·ż½½½½ÇÎÇĈĈÁÀÈÌÄÀĵş½żÁıµ½½ÀĊĈżşĥ²²´·ĥ³ĥ¸¸ÀÇÈÇÀ½ğı¸¸¸ışğ½żÀĵĵğż½£‡šıĈ§ocy€‚|V.M›ĵĵĥ·ııÁÈÎÌÉĊÀÎÙÌÍÏÑÓÇĵĵÀÁÄÇÇÉÍÇÄĈÇÉÉĈÄĵ·ı·¸ı···şĵ½ÁÈÎÄÁĵşğğşğ½żÄÇÄÂÀ½½żĞ„„´Éǟgc}‡ŠQ'QœğĥıĵżË×ĠÏÌÉÍĠÚÛ×ÔÙââ×ÍÀżÂËÌÙÔÏÏÒÑĈÂÉËıÁż½ğğ·µ´¸şğĵÄÁ½ĵÁşÁÄÇÇÄżÂĊËğŒ~£Ċż”dk†’vE% #YœżşµıżĊÊÓÜÒÈÊÔÚÚÚÛŬàċáŬ×ÊÌÂÑ×ĜÜÙÖÙÛÖÒÓÄÊÄ𸴴¸şĥşÎÊÂÂÁÀżĊĈÊÄÀÀÇÌĊœ}—Àµ‹h}‰„Œ{F!3tĥĥıÁÊËÍÎÍÌÓÛÛÙÚÜŬâáŜßÜÙÖÒÑ×âŜÜÜÜŬÚĜÛßÛÛÛĊËÊÇÄÀĵ´¸şħĥĵÂÍÌĈÂÂÂÂÄż½żÁ¨…ĥͲ‡fz…z_4!K–ğĥışÌÎÊÌÏÔĠ×ÚŬßŜŜßáßŬÜÙÙàâáààŜŬÛŜäéċäâÈÎÒÍÊÈÁ¸żĊµĞ¸ÄÌÒĈğĈÏÌÂÁÀÀÂş¸²­ÂÀ€e{Žƒj?###Rœĥ¸¸½ÁĈÎÔÎÄÊÖÉÔáċêĜßàààßßàċĉäéàßŜßäĉçÉÏÒÓÓÎÈÀĊÍĈÄĥ³ÄÑ̽ĈÌÎÉÂÄ𠐭Äğ½ÁŞydw~mA!$EŒĥĵşÂÇÇÚÍğşÑÚ×ÛâçßŬŬßàáááâäĉçäääâáßŜáĉċâáÈÌĜÚÙ×ÉËÌÍÎĈÀÉÊÀÀÑÓËÊÈĈĈÇĈżÂµ˘ĤğĊ½½ÁĤtdsyxg@ ?€ĥĵ½ÁÇÎÖÏÌĊáßÜŜÙÏÙààâĉââááâäċâàŜáäâßÖßèŜÜÒÎÍÖ×ĠÑÏÏÑÉżÇËÈÇĈËÑÇż¸³§´ş½Ĉ½şÄǟnizwp_7D½żĵşıĊÓÒ×áÜÛÛÜŜÜÏÜçäèâáâßŬàâċèäàáââáßÚáêâÚÓÑÒ×àÛĠÔĠÓËÂÁżżżÁĊÊÎʽ­¤§ĥĈż½ĵĵ½™dh~…n4PĦżıŻÔÖÜéêßÚŬßŬÙŬàèçáŬŜáàŬäçĉċááááĉäââäŬÙÓÚßċïÙ×ÜÛÎĈĵ·ħ·żĊÀĊ |—ž¨Ş˘ĴĞŻ¸Ÿji†•P,*jİĵÁÔċàßàŬÜàĉâáàáċßÛÜŬŬŜáċíĉâäĉáÛŬŬßâċċâáäċàŬÙŬâäċáÚÙÜÛÎĈĵıżÂĵ¸ğ´‹^hrtx|™²¤‡‡Ž‚iI+C…³ĊżĊĊĊĊÔäçßŬŜßĉäàÙŬċâáŜÛÚÙÙÚàíâÙàċàŜŬŬááâĉċäâċáßÜŜßßßÜÙÙ×ÌĈÂÀżşĥµ²š‰€nutt}~‚ž°˜€‰’ƒwP& N‘ĥÁÂÉÑÏÒÚÜŜàèäàßŜßáäíêÚÔÖÑÑĠĜÚÜÚ××ÜŜßááċĉċäċäċßÜÚÚŬŜáŬ×ÑÊżÁĊÄ¸ğŻ–“Ĥ¸ĴĴ°Ĵݳ°µħ‡r”˘rG&#!N“´ÁÈÈÌÒÓÑĠÙŜċíìáÛĜÛâĉċééÜÖÒÊÉÍÈÈÏĜÒÎ×ÜßŜàâáàċèèäáŜÜÛÜŜáà×ËÇÄÁÁşĵħ“€ÀÉÁĈÊÇĊĊż¨†„”ˆuO(V›·½ĈÈÍÓĠ×ÛßçĉâÙÌ×àçĉäßÛÚÏĊÁÀ¨šĤıÍÒ×ÜŬààĜŬáâäáßŜŜŬÜÙÒÍÉĈÄż½ığzгÁ··ı½ĈÂĵş½§w}{ŠŠT#b¤¸ıżĈÎ×áŬŜááàŜÜÛÜŜáääâŬÜÖÎĨ“wiv„ ĊĜÓĜŜâßßàßŜŜâáÙÛàŬ×ÑÉĊÄÁż½ğş½Ĉ˘jrı···ğğı·ş¤ur†–•„T%!fİĵ¸ĵĊÇÊÎÑĜÚÓÛàâàßŜŬÜĜÛĉäŬÚŬÖ¸Š]dŠ…YI“ÍÔÚàáàäŜĜÚŜŬĠËÔŬÙÌÁÂÁÁ½ğşıÄÁˆZ{ş´ı¸µ´´´µıĞ›œ™—ށW*%fİżĵğÀÉÊÇÈÈËÌĠäáßßŬŜßßàŬı{s޽w%D›ÄÔÖäĉßäÛÖÓĠĠÍÈÊÒĠÈżÂĊÁğıĥ´ĊğqK}ĥ¸ş²Ĥ°µĥıżµĴ˘•‰…wN&$(%g§ğµ¸½ÄÄĊÁżËÔàċäâßÙÓÔÖàÙµŽž£¨²Á¨I^µÎĠÜäââÖÎËÉÇĊÂÂĈÉÄżÇÂĵıĥ²Ż²Şd@|ĥ·ğ𸷷ı·ş´ĦŽ‘“…{iM.$/"!h§ıµĥğĵÀÂĊÈÏ×áċâäçÜÖÒÏÍÒÒ´„‡Ğı–š¸·c:”ÇÓÖßâÜÒĈÇÈż···şĵÀÂĵÀÂğĥĥğşšm?8:LS\c\]ZXVWOXe\`bYVmcDGJHOdkiigb[w£µÀş½ÔŬÖÔÔÑÑ̳‰c8(5D)I½ÇĵÊ×àŜÏÁĈovxxxzzwlqs}‰ˆ…†’ ›—’‰…~‹—Š‚…’ŽŽ”––›Ğ‰ˆ•’˜£ žžŸœŻ¸ÇÌÑ×ÚÚÜÙËÄİhG4 #V‹µğşĊÎÖçÛĠÈÁş´ŻŻ°ħ´³³Ż¨²şĥµ³¸ÁÊÉÂÀ½ğğşşğ¸··ıĵÄş³¸ığżÀżğ·³¸·²ığ½żÀÀÀÏÎĜÜĜÛßÛÑÊĊÀĴ›‰N"$;]šşÀ¸·şÍ×ÛàÛŬÜÓÌÉÉÄżÁÄÄÂÁÁÄĊÉĈĊĈÊÉĈĊÄĊÇÄĵ²ğÂÀ½ğÀÂğĵÁÁĵş·Ż·ğ·şżÁĊ½ÊÒ×ßŬŜââÚÔÍĈĥĥÌÂĦ}qŒĦıĵĵÀĊÌÓÖÙŜßáßÖÌĊż¸´ĥĵ½şµığĵÊÍÂĵÂÈĊÁżÂÁÀ¸Żµ···¸ş½½ğğ½ÂÀ½ĵ¸´°ħµ¸ş½żÁÄĊĈÈÌÔ×ÛáĉßŬ×ÑÌÉÈÈËÌĊĵÀı·ËÍÍÏÒĠĜââÛĠÇşµ³¸ĵĵş¸½½ÁĈÄÂÄÉÊÀÁ½¸¸¸ıışğğğ½ÀÈÈÀĵıĥ²ĥşżÀÂĈÊÏÎÎÑÓ×ÛŜâáàßÛÖÓÒÎÊĈĊÍÏÉĈÁÉÎÓ×ÒÑÒĠĜâàÛÖÒĈĵşµ¸ğ½ÀÇÍÉÇĈĈÇÇÈÉÇÄÄĊÈÑÌÁĵ½½ÀĊÇĊĈĵı³ıÀÄÄĈÊÑÚÒÌÓ×ÜâĉĉáßßáŜÜÚÙÚÔÏĈÂÒÙÓÍÔÜÚÛßÙÔÔÔĠŜÚĜÖÖÏÇÀµ³ıÀÇÍÔÚÔÏÍÌÌÍÉĊĈĈÊÒâÚĈÁÄÇÂÄĈÇÉÄÀÁÀÂÁş¸ÁÈÊÊËÎÔ×ÔÑÖÜßáäâáàßßßàŬÜÚ×ÖÏÈÓÛÙÜàÛÚßáŜÙÖĠÑâäßÜÚÚÛÛÑÈÂÁÁÈÏĠàÛÓĠĠĠÔÓÒÍËÊÌÏĜäÛÓÎÇÈÈÉÉÊÇĊÈÌÈÀÀĈÍĊżÁÍÔÒÓÔĠÙĜÖÜŜàäâáâßŬàâàŜÜÛßÚÏÔÚÜÛŬÜÚÛÜÙĜÚÙĠäçâŜÚŜáĜÒÑÑÖÛŜŬÚĜÜŬĜÖ×ÙÙÓÎÔÙÛĜÙÙÉĈÎÖÍÇĈÉÎÉĈÇÎÙĠÊÇÏĠĜÛâßŜäâàäâàŬßààááàßŜÜÛÚÛÜŬŬÜÚÙÙÓÑÖÙ×çêèáÜßáÚÒÚŬŬÚÔÛŬŜààŬÜÛÚÛßċÚÔĠÙŬÛŬŬÙÒÊÏÒÓÎÊËÍÑËÈĊÇŜŜÑÒÒÑÏĠÛìêàáâċċĉßŬäâààâáàßÜâċŜßàÜÚÙĜÖÓĠÛ×ĉéêâââáßÜÛÜŬßÜÚŬŜßââßŜŜŜŬáèàŬÜÛŜÚ×ĠÎÌÎÔ×ÑÎÒÖÌÇÂÌĠ×ÛÛĜ×ĜÙßèâàßßáâäâáâĉâááààáċċĉèáàŜÜÛÛÛÚÙÚ×ĉĉääáàááàßŬàäÜÜàââäċċäâßŬÙĜÍĵÈÊËÖŬ×ÔÖÚ×ÖÑÍĈÊÒ×ŜßŜÜÛßäâ×ÒÛàâááâââààßßàáċĉéĉäââáßàÚ×ÚÙĠàâċäâèçċċĉàâċâááċèèäĉèáßŜŬÙÒÉÀĊÊÏÔÙßßŜÚĜĜ×ÖĠÓÎÑ×ÜŜŜÛĜŜĉàÛ×ÙŜâŬÜĉáßŜßàâäċċäääĉċċĠÑÓÓÒÜċâçéċċċääċĉäèèéíêääĉáŜŬÜÛĠÑÈĠ×ÚÜŜßáàÜÙĠĜċßÔÒĠÛâáÛÛßââáàŬàċééäâáááäċäċċċäääàŬàáĠÌÒáââââäĉâáâäääääĉéèêëèçççàâàĜÑĈÈÒÙààÜÜÜÜŜÔÑÙßáÛĜÚÛċâààâċâċċâçëéċáĉäââäâààááâċäàÜĜÖÔÏÑÏäââáâçÜÓßäĉċäääċĉĉĉĉçèêéċääċĉĉàÓĊÀÊßċŬĜĠÑĠŜáŬÜÜŬŬàâĉàâċáèîĉäéçâèßàáâŜÜÚÚÜŜààÙÔÑÍËÉÉÊÊċáŜÛŬâàßàáäéèċċċĉéċċèäáääääĉäÛÏÄÌŬçßĠÍÄÁÏÙßáßßàáŜŬáäääáäéĉċäĉäâàŜŜßàáâßŜÙÒÔÖ×ÙÖÓÏÎÉĈÁĊ aDÄV^@@gamera-3.3.3/gamera/test/OneBit_generic.tiff0000644000076500000000000000204610714675710017715 0ustar chriswheelII*Œ?ü˙˙€˙˙à?üŝ?€Ààĝĝüüüü|x|||ĝĝ <àxàÀ>ĝ€ŝü€ĝŝ~à˙?€ó˙àó˙€ŝóŝüxü?ĝ˙˙àßÀ?À>?€x€p˙˙˙ŝŝŝŝŝŝŝŝŝŝ˙˙˙˙€˙€˙€˙€à˙Àà˙àà˙àà˙ààÀ?ĝp?ü8àüÀ˙à€€˙‡€˙ï?˙üŝ˙˙?ĝ˙˙˙?˙˙˙à˙˙˙€˙˙ŝ˙˙ĝ˙À<x`àà€?ĝ˙˙À˙ü Fd„gamera-3.3.3/gamera/test/RGB_generic.tiff0000644000076500000000000025600010714675710017150 0ustar chriswheelII*`[ÂşŞĵ³˘şħžşħœ¸Żšµ£ğ³ ş³ ³Ĵ˜§£Ž‰ƒiqqUpmPedIilPppUpt[y^x€\z]™€°§‘´¤Ğ…yĞkhİjhwq£Œ€Ħ“Ĥ“š“—Š“‰‚˜‡™xq—lh‹]WˆYRŽURLM”JN‘ILŒOHŒFK’[`—{“ˆ˜Ÿ–‹ŠwŒ‚z’ˆ”‰™Ž‚Ħ•„¸™ĥĦ½µ˘½µ£·ĵ´˘ğ³ ğ²Ÿşħĵ³ ğ³ ĥ­™³Ğ™·° ´Ĵœ—–‹UepIbvE`uAZs?Vi;LZT\^{zr ›Œ²­œğ´Ħ½´ ·­›¨’’u_˜}a‹oSx[H€bL„fM‰iN‡fK…bJ…bK‹nQŽsT”xYrU’uW‹pSh\M`XLXYVejg‹Š€ĤŸ¨ ‹‘ݤŞŸ‰Ĥœ‡œ“‚~x^chNU^OW]WciampcotUbk?Ob7EX>N_Uejp}u‰~œ”~¨„°˘‡µĤ‹´ĤŒ´§ŽĥŞ’·­–ĥĞ•Ż£Ž‚kf^Ie\Hj`M†x`Ĵœƒ·İ’´§­š€–~`’xXuVŽwU‘xV’zX‰tT|jL[UA`YAYU=XU=[W@h`HzlUŻĦ‹ĵħŻƒ ‡j™€c”z^’|b‚k¨ŸŒ½µ˘ÄĵĤÇÀĴĽİĊİş¤µž¤‘¤™‡´Ĥ‘ Šq„jQ†mSŽy`leR]cJL[AQaKx‡g›˘ƒğĥž·Ĵ”°žƒš`”x[ŽsYš„j¤Žqš‚dšdž†i˘‹nž†j–{^“wZ˜{\˜|^›dž„hŸ†k€e—pZcQŒ_MŽdO•sY †jĞ—}·Ş•½²Àĥ Â¸˘½´Â·ĦĈ½§Ĉ½İÇÀİÀ·½´Ħĵ³Ÿżĥ£ĵ³ ı²Ÿ²Ş—Ф‘™”}€ediP]dMblQdsSj{Xt^v…at‚^gvSjtSŽŒrĞĦаž‹İ~s§eccb§onĦyİ™Œ¨Ÿ”š‘‰šˆ’‰—‹‚”t–ymŒj_‰e\Œa[[YŽVVSSŠIK“W[˜tt˜ˆŸ•‹Ÿ•Š£™‹‚z‘‰†}•‹ƒž’†˘•†·­›ĵ³Ħ½µ£ĥ¤½µ£ğ²Ÿğ²ž¸°ş²Ÿıħ µ­œ³ĞšŻ§–Ż§˜¨£•…†N`pHbuC]s>Wo;Pd:IZKSXonh ›´­ğ³˘ĵ³Ħ·­œŞ™†”yc“w^†hQy]IbLƒdL…fM„cKƒbLƒfMŠoRŒqS‘sU‘sV‘tWŠpTpcPicXxyp—”†¨ĦŽħ§’²¨’²§‘´¨‘°˘‹Ğ‡¤—ƒ–}}{u`fh^df`hk]hnVdmGVc>M]7EVFVcfutz„z…Š{ˆˆv–Œw¤—~Оƒ°¤Š²ĤŽı–ğݘĵħ™şŻ˜²ĤŽœwtlXtlW‰|dĦ‘yµ§Žş­”·Ş’²˘ˆ›…f’z[ŒuU…pQ‹tTŒuU€lOo`GZTAWR>VS>YW@[YBh`J{p\°£Žĵ²²£‹Ħ‰l˜~auY“z_’iĦ—„ĵ´ ÄĵĤǨÄĵĤĈ½¨Ĉ½§ÄğĤĥ­™Ħ˜†ŻĦ‹š„iƒiPˆnTˆt[e_OV^FKXBaqW†’o§§Šı°—Ż ‡ž‡k“wY’vX‘uY—~d™b”z\–|^œ‚ež…h›ƒf˜}`™{]–vZ˜z]š€cž„i›d•rZhSŠcP‹hRnUtY›eİ•{³Ž¸Ĵ–ĵħ›Àµ ÀĥĦµŸÂıĊ½İÈÀŞĥ¤½´Ħµ˘ż·¤ı² Ż¨•œ”‡€knqYitWk{Ym[i~Yj‚[kƒ\q…^o\asQVgHUeFlqX˘›ƒšˆoj˘\\šb[ĤjhĦurŸ‰€Ÿ“‰‡€…}‹|t}s}rš…yš†z‰|ž‡{˜~trj‡_\†WW’hg–|˜„›’‰¤šŸ”‰“‹ƒš’Š“‹ƒ—Œ„•Š€šŒ~ݤ“µĴ™ĵ³ ½´˘½´Ħğ²ŸıħŸıħ ĥž³Ğ›§˜¨˜Ğ–¨˘”Ħž’u{|McwIcvHbuA[rC[oI_nQaidjhŸœŽ¸ħ ·Ĥ½µ£ĵ³˘³Ĥ”ž†pq\ƒcP|\I~^I†fM…cK„bKaJgLgL‡iNŽpSrV‘tWŠoS…sZ‹ƒr§ ħ¨“²§’µŞ•µŞ“·Ğ”µ¨‘ħ£ŒĴœ… |™Œz‘‹~xytbgiYafKXdBRbCUdARa9HYI[fdtslwqu{pxzk‹mž‘xݝƒ²Œ·Ğ’³›ż´›ż³šĵ°—ĥݐ°£Šž’zĦ”|­Ÿ‡ĥݐħ˜ĵŻ–¸Ğ’´ĤŒ›ˆkz]†uXƒoR‰sS‡qRxgMbXCZSAWTC\ZEa]FdbKso[ŠƒrµĴ—´Ÿ·Ş“˘q–}aŽsWŽtY–‚h‘|¸Żšş¤Äğ¤Á¸ĦÀ·˘Âı£Âış²žĤžŒŞœ…—€e‚hO…mS„pX`[KQWCTbJ{‰g”›x­İŽµŞ’¤’w—~a—|^’wY”xZ–{_•y\’vX’vX™~aœƒf˜}a–x\˜z\—y\š}_š~a˜z_‘rWŒlSŠjRŠlSsX“x]”z^œ„g£ŽqИ}°Ÿ…³¤‹¸Ğ”ĵħ›½³żĥĦşĤÈż¨À·żĥ¤ĵ´Ħş³ °Ş—yfeT^fPj{Zm\jZaxUe~Xe€Yc~Wd}XbxUObGOaDO`C_hP˜xŽ}b`žWXš^Y£bbİxu£Œ„“‹“‡~‹{p~u—‹µ§—¸İ™·§–µ¤“² Ğ˜‰¨”…Ħ‹“yp‡qi‹~w—Ž…•‹£˜Ž˘— —Žœ“Š†€ƒ}ˆxrŒzn­˘“µ­›ı°žĵ³ ğ³ ·Żœ´­œ´­žĞĤ˜£Ÿ’Ħœ‘£ž’ œ‘›––ŽbnwH`yKfzLevIauQgw\nxesvnur›Œµœ½µ£ĥĥĵ²ĦŻ Œ˘xwdƒiV}_K€_J€^I{]Hx^HfK€fMƒhP‹nSrVpUŠnS’{b¤—‚ş°›ğ°™ğ°š½²œğ°™ı­—·Ş”ħ££”™‰x˜Œ|’‰{€y^adDKU9FW9L`?Uf?Qb;J\J]iZkoXhh_kgptiŒƒn “z­ ‡Ħˆµİ‘½ħšħ™²™ğ•şĴ”·Ş’²Œ²ıĴ”ĵŻ—À³š½ħ˜·Ğ“³Ĥލ˜}žŒo•ƒfŒx[ŒuV„oRpbI[SA[UFrn\~x_€w]€}b•“|§˘ĥ˜½´žĵħšĞ™›ƒguYŽsX—€eœŒt°½´žş£Á¸ĦÀ¸˘À·˘Âşĵ²žŞĦŽİš‚—c…jP‡nU|iSZUGMTBdrUŠ”pŸĦ²Ğħ¤Œ‰n—~a˜a•{]•y\uX‘tW‘tVŽqTsW“uYqU‘sW–z]–y\”vZoUŽkRŽnToUsX“vY“vZ—|_™~bŸ…eĦˆiŽp¨’t¤Žq£ŽsݘĥŞ”ĵ²žÁ¸£ğ¤À·ÁıĤĥ¤¸²ž—”€lpZcpTl\l„]gZazUYrP`|V^{U[wRZuRShKG[BMaCN`DZdMŒ†nĦ‰yš\[VXŸWZ˘_`§qnš€yˆ{tˆxp˘•ŠĞŸ’ıĴœżħ ÀħŸ°žĵ­›½œ¸¨˜ĥ”ŻžŽ¤’ƒ›Š}“…{“ˆœ‘ˆ •‹˘™œ“Ššˆ…{x}dbƒmdĴŸ·œĥ­›ğ² ĵµ£·ŻŸŻİšĦ‘‡†rvvkqrmpqqttqzzu||QcsD_zD_yHauMasjw{ƒŠ…‹Ž„‘’…Ĵ§–ı² ğ´˘¸° ğ³£ż·Ĥ¸Żž·Ğš ŽĦzŽoYƒaLuXEoVDw_H„jO†mU‹qYŒnToTpUŽsW–}dĴœ‡ĵŻ™´§‘ĵ°šÀ´žÀµžÁĥŸğŻ™²Ħ’Ħ“£—…ž“ƒ†z`bc>EQ6CV@TgJ^iHXb@P]F[iJ_iVgi^khkpg‹ƒož’y­ †Ħ‰²·Ş’şĞ“ĵ­”¸İ‘ıŞ’¸İ‘ĥ¨¸Ş“ğ˜ħ˜°–ħ—½ħ™·Ğ’°˘ˆĴ‚Ĥ–{˜„hŒuWlQe[EWSBc^OŽ…p›„Ĵ˘Š­Ĥĥ°š·£ĵ³žÀ·Ħ½³³Œ˘Œo’w[‡nS‘z^Ž}f¤™…½´ ĊĵĤÂı£Âı¤Áı£Âı¤ĵ²Ğ˘§˜•}a‡mR‡pWzjUYVHPYEu€_‘˜sĤ¤„³¨Ĥ•|’z^•|_”z]“x[•x[ŽqUoRŽnR‰jO‰jO‰jOŠlQŒmSŠjQ‰hQ‹kS„cL…dM‹kRoUpVpV‘rX–z_œežƒe †h¤Œn¤oĦŠl„h•~eĤ–€·­˜À¸£Ċĵżĥ˘Áı§ĵµ£Ĥ£rv`euWfZiƒ\h„]eZ\vTYsQZwRWvQUtPSmMDYAH]BM`CK]CVaJ}ešp—\X›_XXYœ`[žmd™}t{q”‡~¨œ‘·İšż°ŸÁ³ĦÁ³ĦÁ³ĦÁ² Á² Àħ żŻžĵĴ𴤓žŽ¤–ˆœ…‚z•ˆ€“‰˜‡”ˆ‚{y†gjuQR„c^İšŒ·ı°žğ³ ¸°ž¨Ħ’‹qvw\jsQbpJ[kETfCSeHYiN_pDZrE`{B]yF]sgpt›™¨¤—ĴĤ˜ħĞ›²Şš·Żž½µ¤ĵ´£ĵ³˘½µ¤½³£¸ĴœŻžŽ˘‡tlW‚cNpXEt\HƒjQ‹sZzb’w_oWŽpWpU’uZ—}cwŞ—ݘµĤ²Áĥ Àµ ğ°š³Ĥ¤–ƒĞžŒĴ ™ˆ‘ˆ|hhg;CR2?S>PcM^gaopVdjPdnI]gXhi`lhhmc‹„pŸ“{¨š‚§™‚Ş›„†°…ħ…Ż›„°œ„²Ÿ‡ħŸˆ´£‹¸İ‘·¨ĥ§Žµ§ıĴ”µ§Ž²¤‰°Ħ‡Ĥ–{ŠnŽxZlQ`YEXUFrmZ•‹s­£‹µĴ–¸Ż˜ĥĦÁ¸¤żĥ şÀĥĦ³§Ĥ‘v”z^ŠoUvZŽ{bž’}¸Ż›Á¸£ż·ĦÁ¸˘Âı£şżµŸ³İ•İ™w^‚iPƒmVqdSTTG[dM†Žl›zޤ‡ ‡™ƒh‘w[™€c”y\pUrUŽoS‰iNˆgN†gN‡hN‰jP‹mSŒlTŠhQ‡dO†aL…cM…eMŒmU•y^™}a™|`—{_•w\dŸƒfŸ…g˘‰l§qrœƒhŽu\–i°£Á¸£Ĉ§¸šµ£´­œ‹‹wajSf{Yf[i„]k‡^cXYqP[wS\ySZvQSnMF[CE[AJ`BK_BI\BT`I‚‚hž†u•]X—bUšUT›\Xf_–si¨”…ĥ§˜ĵžżħ Á³˘µ£Â´˘´˘Á²ŸÂ³ Á² ż°Ÿ½ğĞš¸¨—µ•Ż ‘œ€ŽuŽ€y“ˆ“}‰jlOUtBDVSĤ•‡ĥĞšı°Ÿğ² ´­›’Ž‚eloTdoSdpRdrO`oHYl?QgWuAVnnrrĦšŒ²Şš³Ĵœıħ ş² ·œ··ĥĴœĵ²˘şŸŻŸ˘ˆx—uaŒlU}cL|bJ„hPŠrZ’}e™‡o›‚i•t\–y^’v[rWsX’v\™bž„hİ“xĥĤĵ°šğ°šı­—³Ĥ’¨™†°£Ħ˘–‡”Œkmn:CR1=R:L^ObkcppVbdQdmMclctrmxoknd‰ƒq˜Œw•‡s”…s•ƒp˜‚n›‚m „nŸlŸk›}h›€jŸ†pĤzİ•ݘž‡°ĦŠŻĦ‰ ‡ †§—~œ‹p‰uY}lR`YHe_Oƒ{e›v­˘‰´Ş“¸Ż˜µ żĥĦÀ·ĦÂı¤ş·Ĵ•Ş™€˜c‹qVtX|aœŽx³¨“½³žżĥ Âı¤Äş¤ĊğĤÁ·˘·Ĵ–İ—~tZƒjQƒnVkaSVXKjsW‘–s Ÿ~Ğ˘ˆ£‘x‘v[“wZ˜}`”x\rVoTŒlQŒmR‹mRŠkP‰jP‡eN†bM‰aM‰]MŠ]L‰[J‡^K†`KŒiS–v_š}cœ€ežƒgš€dĦ‡kŸe›~aĦ‡j¨‘tŽsœ…iv\v\’z³žÄğı°œş²Ÿ¤žŒpt_dqUk]i\k„]j„\a|VRjKXtOXuPSoMG`EEZ@H_BF]@CV=DV>R_GƒgŒz˜b^™RTšMRšRT™ZZ—skĥ£”ż°ŸżħŸÁ² Â´˘Äµ£´˘Â³Ħ³ĦÁ² ÀħŸÀħžż°žż°žŻ½œşŞ™ŻžŽŸŒ}Ž|q‹}yut…Z^y@EzIE\UĞ›ğ°žÂı§½µ˘­Ĥ”~t[ejZgplvyw€mwx[gqJYlBTj;Ng9LjQ:BT=P^Gta—zšph™TW™SS–US—WYšxrı§˜Á²ĦÁ²Ħ³˘Á²ŸÂ³Ħ´˘Â´ĦÁ² ½­œĵĴœğĴ›½œ°žż°žÀħŸÀŻžş¨˜İ”…•|rŽysdc†HM{;@zLEƒ_Wž‘´˘Á¸Ĥ½´Ħݧ”‹†xtxtˆ‹„£Ħ”ŞĤ˜¤Ħ”““‰t{{LZk:Jc8HeRbJuƒbš–~£‡zž`_œWW™UU–TW™wr¸˜żŻŸÀ° Á²Ħ² Â³Ħ´˘Á²Ħ½­œ´£“µ¤”² µ¤”½żħŸÂ³Ħ² Ğ›Ğ–‡’xmšƒy•nh‰NP|=B|?C‚TT£…şŻŸµ£ğ²ž¸°œŸš•†Ĥ °İ˜´­œ³ĴœĞĤ—šrxxHSe8E`5Fd;On;OoDRfkb]Žwh˜ƒuĦ‘„£•ˆœš‡x•|m’tcŽn[†hSˆkR‡iRŒlUŒlTsX’y_š‚hĦ‹o¨”yĤ”{Ğ™€­œ…Ĥ‘}ž…o›{d–r]’r\˜zeĴ•ğĞ—ĵݚş™¸Ğ•Ż ŒĦ‘€­Ÿµ¨•´İ•ŻĤ“İ˘‘‹Š€IQZ4AUS;CZ>@T;DW=?M;^kP‡pĦа˘‘݈|Ħbb’TR’PR•lkĥ˘–żŸżŻžÁ° ÀŻŸÂ²Ħ­œ³˘‘ŻžŽ­ž‘§˜ŒžŒ€£’„şĞšÀħŸÁ² Áħ ÂħĦĵН‘Ğš“{p’vk\V‚QQ„WS£Š~·Ĵœ½´£½´˘ĥ¤½ĥ£ğ³ µĦÁıĤş²Ħ·ŻŸğ´£ğ³˘¸²˘Ħ•twxKUfR=:L9:L8DV=EP?oy\œž‚ݍ“´İ—­™‰˘um”[VŒNO‹^^Ĵ—şİ›żžżżÀݟş¨˜°ž§”… Œ€‹“€uĤ”†ğĞšżŻÀ°žÁħžÂħ ż­žŻ›˘‚š†z›…yˆh_‹c_lbĞ“„µ¨—ğħŸµ£½µ˘½´˘ğ²Ÿı°œğ²Ÿ·œı°žĥ¤½µ˘ıħŸµœ œz{yV^jFPdF]?J`AJ_ACS=W_J†Šo²˜ıħž¸œ´”İ‹|—\Y‹MM‹VW£‰ƒµ˘–½Ĵœ­½Ĵ­žş¨˜³Ħ¨”…—ƒwŽ}r}tĞšŠ½­œÀħžÁ²ŸÂ² ħĦÁŸşĤ˜°‘§•ˆ¤‘•}p…ka{mħ˘“ş°Ÿĵ² ĵ´Ħ½´ĦÀ·ĵ´Ħ½´ ğ²žş°œı°œ½´Ħ½´Ħ¸Żœĥ­›Ż¨—ĤĦ’—•Š}~|_enHRc@Ka=Ke?MfBOgEPeQV_a]XhUˆeO‰cNŠiQ‹mRŽqV’x]™f£v­…ĥŞ•ı°œğ²ŸÀ·¤Âş§Ä½ĞÇĴĊĵİ·ż³Ÿ°œĵ›ŻŒİ–„Ğ—„š‡°œ‰ħž‹ħŸ‹Šİ›ˆ˘“~yƒsQSY6BX>PeOdsNdr`vyŽ…„‘ˆ\ovAThH^p\syw‡€ˆ‘‚„Š}U`fCO]ehgee_TWVBHP8BP5BW8EYPW]„xfž‡i †h•w\‘oW”z_v[‹rV…kQˆoY˘‘y²ĤŒ·Ğ“ıݘıŻ—³İ“§žŠ§šƒ§™€İš€•{¤“y˘‘w£’wœŠq”‚k‰u_hPƒjP…r]—{µĴ˜½´žı£Ç¨şğħ› ˆ˜„j—eŽ|djbQwnS‘}`“u[mT‘tZ›}c’pX’t[Ÿ…kİ”zħĦ‰·Ş’ğ•ĵŻ–ĵݘş—ş­–ıĞ”Ż„›„jrY”t]§Œv·ĦŒÄ·˘ż³œĵ°™µĤŸhoW“sZžg£‡qĴ{›r_’sZ˜~aŠw^…nĦ˜‚ıݚÀ·˘Çİǧ°Ĵ–‡pmx[uˆbg|YPcIVpNTsNGcDA\@8J87I6>T:D[?E[?DZ>H\?HZ@EO>nr[ž›…·ŻœşħŸ¸ĥޘħ£tm“`X’YXxv­™Ž¸—²˘“°Ħ”ıİšğĞœğĞ™ħž¤Ž™†x Œ~µ¤“Żžż°ŸÀ°ŸżÁžÁĴĵ§˜·£•°žĴšŠĤ“…‹vj}oĴ ‘½´£½´˘µ˘½µ˘Âş§şħŸ¸Żş°ĵ³ À·£Äğ¨À·¤şħž¸Ż´Ĵ›ĥŻžµŸŻŞ›žšŽ†„~lnrYalR\lV_nW`n[bltsn‹ub‡dO‡eOŠkRoUrX™€e£ŒrĴ†¸­™½´˘ĵ´˘½µ˘À·¤Á¸¤ÂıĤĈ½ŞÄş§À´ ĵ›·§•°ŸŒ­šˆ°ŠŻœ‰Ż›‰Żœ‰ħž‹ħ ‹°ĦħµĞ•³Ş•Ÿ—‡Y\a8E[@ThVlxZnudxy…‘†‰“‰[ksDViJaq`vyy‰Ž–†…‹€S`g?M\HS\AMWT=8J7@WC\>BX<T;C[=DZ=@V<N9BP;GOAttdĤ ³Ğ˜¸°şħŸı°žıݜµŞ™İ˜ˆ—}q™|swoŠuk‹•‰ ‚š‰~ħ˘”şĞ›ğĞ›¸¨—´˘’ıĤ–½ĴœœżÁŻžÀĴœżİ™ĵĤ—µ ‘™Š­›Œħ˘’¨—‡’~qœ‹ĥĞ›µ¤µ£ĵ³ĦÀ·¤½´Ħĵ³ ½´Ħµ¤żĥżĥ¤ğ²Ħş² ¸°¸°ĥ¤À¸ĤÀ¸Ĥż·ĥ˘ş²Ÿ³Ğš³Ĵ›µŸĥŻ ¸ħĦ¸žĤ’pYpX‘v]˜eu´¤Œż´ µ£Âş¨Ċ½ĞĊ½Ğğ¨ÁıĤÀ·¤żµ˘ĵħžıİ–ħž‹´˘Žµ£µ£´˘³ °ŠŻœ‰°ž‹°Ÿ‹³ş°›żĥ˘Âşş³Ÿ™”‡KQ]7E[F[m[r|q‚€Œ‚ˆ’†t‚~L]kEXjKbr_uyŽ…ƒŽ…_ntM`mhttWgm=Pb5G^4F^5G_5D\>K]ehh“ƒn¨ŽoАpݍsĴ’}§•~–g•|^”{^‚lĴ“µ§‘·Ĵ–ı˜şŻ˜ĵħšĥĞ”·Ĵ”ş–ĥŞ’³Ĥ²ħ°˘Šİ˜¤’xž‹r‹v_†mTŽx^•‡sĞ ‹ıݘ½³œĵ³œğħš³Ž¤Žt™b†j•‚hˆsX…kP‹lR‘pX™xbĞ•~ıĞ–ÀµžÁ·ŸÂ¸£Âı£Âş¤Ĉ½ĤĊĵĤÁ¸ĦµžÂı£ş£Á¸˘ÇİĊĵ§ÄğÂı£ı¤ı£ı£Â·ĦÂĥ ¸Ş”˘‡n˘…jĴ“v°”|·Ÿ‹µŸŒ™raŒgSˆnV|oZ~}l~´Ĵ˜ş¤ÉÀİËÂŞ°Ĵ–‹“tcoSayU_zUJaGMiIIcF9M:P9>O9CUFY>ER?Z^QŒ{ħޘ½µĦı°¸Żœşħžğ² ż·À·Ĥĵ³Ħ³§•˜‰{’„zŽ€vˆvm{qŠxn}le‹€²£”ı¨™²Ÿšƒwİ”‡şİ™ĵŞ›ş¨˜ğ§—ż­›Àİ™½§˜ĥĦ’Ĵ—ˆ˘‹|­›ıŞ™ğĴšĞš‹•‚v›‹~ݝ­˘‘ħ§”½´˘şħŸğ²Ÿş°œı°şħŸş²Ħ½µ¤ż·ı°ž½´Ħĥ¤½´˘ğ³ĦÂıĤÂıĤĥ£µ˘ÂıĤż·¤À¸ĤÁşİ´¤şĴšĴ—„ħ˘Ž·Ĵš³ĦÀ·¤Âş¨ğİÂı§ĊĵŞĵŞĊ½ĞĊ½ĞÂı§ı›µ’°‰ı§“ĵĞ—ğİ•¸Ĥ‘·’·’°ž‹œ‰ĴœŠ–…ݤ’·Żœ½µĦÀ¸£½ĥĦ´š‹DM\HVAX\P²Ĵš½µ£À·¤½µ˘ğ²Ÿĵ²Ÿĵ³Ħ´£Àĥğ²Ħ¸¨œŒœ…š›‘‚w~nf‰zs ƒĤ”…­™Š¤˜„yĴ›şİ𷤕­”‡°’…½Ş™ÁĴ›ğ•ħ›‹Ĥ‚†yşĞ›½ŻĥĤ•¨–‡žœ£•…ĦŽĥĴ›ħ§—´Ğš·­œı°Ÿıݟ¸žı°Ÿğ² ·›ĵ³ ĵ³Ħğ³Ħżĥ£Á¸ĤÁı§½µ£ı°şħžµĴš·ŻžÀ·§ĥ½³ĦşŻ½³ĦÁ¸§Äğİş¨ÁıĤÂı§À¸ĈĴÇżĈĴÄğİşŻœŸŒħŸ‹ĥ¤ı§’ğŞ•ğİ•¸‘ĥ¤ĥ£ħŸŒŞ™‡–…™€˘›­¨˜ı²Ÿĥ˘¸ħœŻİ–ˆ‡AK[=LbH^rOguOdo_qwp~YioEWfF\jXotk~zw…~UgoI]lfvyQbk6H^1C]1D]5G_7I`FR_spj¤–€›Ĵ—{­œ³ĤŽş°˜ı°˜¸–µİ³ĤŽıĞ“½²šğħšğ°˜ş–ĵħ™½³›ıŻ–µŞ’³İ‘³¨µİµİ‘ĥŞ’ĥĞ”·Ĵ•ŻĦ‰­œƒ£‘xx]’z`•†pݝˆ¸˜ĵ²œş°˜²Ĥ¨—™‚fuž‰mw[…lQ€hQ‰r`­Š½³žÂı£Âı˘ş¤ş¤ş£Ç§ÉÁŞÊÁĞÊÁĴǨÄĵĤĊĵĤÄğÄğĊ½¨ÇżŞĊ½¨Ĉ¨Ĉ¨ÄĵĤÄş¤¸˘Àĥ Á¸˘Àĥ ÂĥĦ°›żħ½¨”ކt•q[‹nWviXiohhur‘„ĵµĦĈ¨ÉÁĴÉÂĴ­˘ŽŸœ†enWN]FVmNNdH6D64B36E48H4:J5@P9CS=GSAY^R…ƒv°Ş˜À¸ĤĽŞĊ½İÀ·¤ğ²ŸşŻıœıŻĵħ ĵħŸıݜ¸œ°–‚—‰}•‡|Œ}s‰xn˜‡||qŒrhwmœŠ~Żž³ ‘ݏƒ¤ƒy²•ˆĵ¨—½¨˜·Ħ‘˜‰ Š|ž‰|ݟ‘ğĴœÀħ °ž·¨—Ş™Š–‡{•‡{žĴĦ“ŞŸ‘£˜Œ§œİž‘ĴĦ’³¨˜µŞ™ĵħŸ´ĦÀ·¤µ£µ£µĦÀĥ¤À·Ĥĵ³˘µĴš´Ş˜²§–ĥĴ›½´˘µ£şħ ½³ĦÀ·À¸ĤÀ¸Ĥżĥ½³Ħĵ³ µ˘Äğ¨Ċ½İĊĵİÂĥ£´£­›ˆ´˘ş¨“ĵŞ•ĵİ”ş§“¸Ĥ’µ£´˘Žħ İšˆ‘…xrpmuvsŽ‹Ĥ ‘²Ğ—²Ş•Ğ“~€z>I]ARhD]s=Vm;NbH]m`syQdnEYjLcpcxzs„s€|K_mRgvgvyCTe1D]0C]3F^7Ja>Pd\di”~Ğœƒ‚²£‰ĥĞ“ı°—ı°˜ıħ™ş²š¸Ż˜ĥĴ”şŻ–ĵ²™½³›ĵħ™şŻ—ğħ™½³›·­•´İ‘´İ‘µŞ’²§Ž´¨´İ‘µĞ•şŻ˜³İ˜~ĦŽt“z_•}a“ƒm£—‚µĞ•ğħšşŻ˜²¤˘vš‚fĤ’vžˆkŒsX€jQ‚nY‹yĥĞ–Á·˘ĊĵĤÄğş£Äğ¤şĊ½§Ç¨ÇżİǨÄĵĤĊĵ§şÁı¤Áı£ğĤĽİĈżĴĊ½İĊĵ§Ċĵ§şı¤żĥ˘½µĦĥ˘Â¸¤ÁĥĦż²ž· Œ¤„m–x_Œv_spbmwqkyvžžÀı¤Ĉ½¨ÇżŞÈÀݤ•¤‰t~fObJMaGDW?6C4HPAZ]S¨–½µĦÁ¸ÁıĤğ¨Á¸¤ğ²Ÿ¸Ĵ™µ§•µĤ”¸¨–şĴšı­›ğħžşħŸ³İ˜ŞžŽ “„—‰~wŠxn€u—†{Œ¤‘„˘ …zŸwĴ„ħ˜Š¸”¸£“Ż˜ˆĤ€š…w£‘„ħ˘”ğĴ›ÀħžÀħŸĵŻĦ‘˘”‡ •ˆš‹³İš­£”ž•‰Ÿ”‰ƒyŒ}t—†z˘‘ħ¤‘ıœ½³Ħĵ²Ÿĵ²žıšşŻœ¸œ·œµĞš´İ—²§•¸­œıŻžĵħŸğ°žğħžżĥ¤Àĥ¤ĵ³Ħ´˘ıŻ·­š½´ Á·˘ÁĥĦğŻ›² °Š³Ħµ˘Žı§’ş§’ıĤ’¸‘ĥ¤²Ÿ‹ħžŠ‰Ħ“‚vrmJS_ERdR]hqrp•‚ޤ’Ĥ˘‘swu=K`FZpC]u:Sn9MdF^oUitL`mJ_nUmul€~zˆdsxLbt]r|Xhp6H^.A\/B]2E_;OeM^k„}Ş£²§³§¸–ş²šı°˜ıħ™ş²šş²š¸°™·–·­”ıŻ–ı°˜ı•¸­”şŻ—ı–µŞ‘µŞ‘µŞ’µŞ‘³§Ž³¨ĥĞ“şħšĵħ›´¨§–| Œr“z_“{`•…n˘•€³İ’ı—ı­•°Ÿ‡ž‡lš‚dĦŒn˜dƒlS{jS€j›‡´Ĵ•½µÂş£Âş¤ş¤Âş¤ÄğĊĵĤÇ¨ÈżİĊ½¨ÂşÁ¸£ż·˘ż·£ĵ´ ½µĦÀıĤÂğ¨Âğ§Áş¤Äĵ§ğĤżĥ£²ĞšĴ§–²Ĵ˜şħœżµ ½ħœħš…Šr”zd‚wfnvofutr~yĴݘÁı¤Ċ½¨ÈÀŞÉÁŞœŠo“{{„iUlPMbH:G68D4;I629D4Vl@XlLfsE]nBYkQhsj~}o€}UhoPftUkxI\o4E`/A]-A]0B];OdTdn†Š£Ÿİ”ħĞ–ħŞ”ĥ—³Ĵ•³Ĵ•´­—°¨’Ĵ‘ĤĦ§˘ŽŞ¤¨˘§ĦİĦŒ¤°Ż‹ħĤ²¨²§µŞ‘µŞ’·­•ğħ›şħ›·­—µŞ”Ĵœ„œ‡n”z_™‚gu˘”~µĞ•ı˜²¤Œ ‰o“x]šdšƒdŽx[nbNgbNdcP]cNlsX‡hžœ€ĞĤ°Ĵ’³”ğ´œğ¤ÄĵĤĊĵĤÄĵĤĵ§ĵĥ¤ŻŞšžšŒ‘‚†‡{ƒ{‰Š›™‹Ş§•ĥ²Ÿğĥ¤ “bmp[ltq}|ŠŒƒĤŸ‘£•…“†uwslbmoartdwxasv–šğ´ Áı£Ĉ½¨ÇİÈż¨˜‚eŠ}bjwWZpP?M<9E6=E7BGOeYmzVmx@ViKapWmuE\nG^obvyp‚~j{yShpUlwLap8Jb/?\-?\.@]4F_DUfjwvŽ‘ƒŸŸŒĦ Œ§ĞĤ‘°Ş”ޤ£‰˜†–’‹~…†|€„|‡‹‚ŠŒ€‹€—“‚˘š„ŞŸˆĴĦˆ°Œ³¨°Ĥ²¨´İ’ĥĴ–ğ²œğ²œş°š´Ğ• ‰š†mw[–~cœ‹s£–µŞ”¸­—Ĵ›ƒ˜€d–|_›„g—€cpX]ZKRVCIR?N]C]oOk|Xr~\{‚b†eŒoЧĵµžÁı£ğÂş¤ĵĥ˘¨Ĥ˜ƒ†gtvm|{q€{k}|ey{jzz~‡˜›ŽĞœ–”‰R`kEZlPdr\jqwvuurnekiYgoUis^syk|zvƒĴ›ż·Ħş£ÈżİĈżİÈÀݐx\„vZfqQTfI9D6=E8SZJx}i““~Ş’²Ğ™³Ğ˜şħž½´ µĦĵħœ´ž½´Ÿżĥ˘żĥĦıĴ˜ĤŠv™k]‘p]ŠjSnW˘zi·‚żŻÀĥ˘Àĥ˘Äğ¨Á¸½³ ıŻ›ĥ­›ĥ­›·­›ĥ­µĞ›ħĤ•¨ •ˆŠ~v~snˆy…}œ†£–ЍšµĤ–ĵĞšĵĞšşİ˜¸¨–ı¨–¸¨—şĞ›­Ħ“ĞŸŻ—­£”Ħ˜™‘ˆĦ—ŒŽ‚Ż£”·Ş™½œÁ²žÂ³ ż°œÀħ›şŞ—ğޘş¨–şİ–şİ–ı¨–¸Ĥ”·Ĥ”·”ĥ“³£’µ¤’µ¤‘² ´ĦŽ´ĦŻŒŻœŠ€Ĵ—…´žŒ³Šħšˆ™‡šˆ­™ˆ­˜‡Ğ–…­™‰İ—…ĞœŠ·Ğ˜żĥ˘ĥ˘³­œƒƒ{CL[.CO;HW>WjIdyTbyT_wSYpObsT‡ŠnФş²œÁı£Àı¤ŻĞ™{SbkRbmTfp_ptbux`uyfzzh{yq€}“ŒŠŠ‚LZf:Oh>TmCYmJ]nOamI\kCXlG^pTjuk{z’—‹·²ż· Âı£Ç¨ÈżİÉÁޏx]Š|ahpSN\DHV@`mRŽ‘x¨¤ŽŻ¨“·Ż›¸°œĥšĵ´ĦÂıĤÁ¸¤´Ÿµ żĥ˘Á¸¤À·¤ĵħŸ­–… sh’m\‹iUlY¨}pĥ›ŒşĴšĵħ½³ŸÀĥ£żĥ£¸ŻœĥĴš³Ş˜ĥ­›ĥĴ›ħ§—Ğ ’£—‰›…˘™Ž›”‹ˆ”„›’ˆ˘—Œ¤˜‹Ĥš°Ħ“ĥ”ĥ¤“ĥ”ĥ”¸§–ĵĴ›ĵ­­˘”ĞŸ–Ğ ’ ˜—ˆž“‰œŽƒ˘•´§™şĴ›żħžÀħžÀ°Áħ­šĵޘĵŞ—ğİ—ĵИ½Ğ™ĵޘş¨•ı§•ı§”ıĤ“ş§“ĵݖ𧔸¤ı‘şĤ’·£³ž‹Ş“‚Ĵ”‚²›‰Ż˜‡˜‡İ”‚Ĥ‘€¤¤€Ğ›‹¸­›½´ĦÁıÀ¸¤ĥݜ’…HR^/VoG_rG^pBVj?Rh@UlQerr}¨§–ĵ´ŸÀ· Âı£ş¤Ċĵ§ÈÀŞ—g‘…lipTP_F`pR‡rާĥ™´Ğ—ĵ²ž½´Ÿĵ³Ÿżĥ¤Á¸À·£Àĥ˘ı¤Äğ§ÁıĤ½´Ħĵ³Ħ·İ—ħ•‡ yl˜sd£ƒsµ›‹ğĞ™şŻšĵ²žżĥ˘½´Ħµ˘şħ³Ş—“ħĤ•Ĵ ˜‹£—‹Ħ–‹˜ƒš‘‡ž”‰œ“‰›”‹ž•‹ –Чœ­Ÿ‘° ŻžšŠ°ž´˘‘şİ˜½Ĵœğ­°¤—­Ħ’Ğ˘”ĤœŸ–‹™’‰›‡›Ž‚­Ħ“ħ¤•ħ£”·İ˜¸¨–ğŞ—ĵИĵŞ—ş¨•ş§•ş§”ĵŞ—ĵޘş§•ş§•¸“·£‘·£‘ı’ş§“ıĤ“¸¤‘¸’ıĤ“·£³ž‹Ż™‡Ż˜†°˜‡Ĵ•…Ş”„¤ŸŠz ‹z‡wš„uĤ•…ıÀ·£ÄğĤÄĵ¨Âı¤ğ³Ÿ ›T[c2?V*8T(6T*8R/N`]io‘‘„ ˘žŠ—•„‚ƒ‹‚€‹„‹”‰—‰˜›ˆœžŠ£¨¤Œ¨£Š­¨Ş¨¤¤ĦĦ‹˘ĦŠ£ ˆ§£ŠĤĦ‡Ĥ ‡¤…›”~—zŸ—ƒĴ¤´Ĵ˜ş²ĵ³žğ²œĥŞ”“z”|a—dž‹qĦ’yݘ˘s“z^“z\•}^Šv\kdXJMD=G9DV=DW;AU;LdEWuOQqLNnJPnKSoL]wRn\ŒqħĞ”şµĦ˜›ŽbosMYdPZcsxu‹Ž†…‹ƒw|huvSgqRfrMaqK[m=Og7If6Ki;Ql@Vl@ShPhZhq—šĵĥ˘şÁ¸˘Á·ĦğĈ¨ÉÁĴˆm˜ŠpuwZhxXn§ĤŽĥŻ›½´ ½´Ÿ½³žĵ³Ÿş°ĵ³ ĵ²Ÿ½³ µ ÂıĤĊĵ¨Âı§µ˘żĥ£½³ ıĞš²Ħ‘ħĦĥ¨—ĵŻĵħžĵ²À·˘Àĥ£µĦÀĥ˘Àĥ˘·›³¨—Н‹Ħ ƒ¨œ¨ž“ž”ˆ–Œ€›‘‡“ˆ›’ˆ›’‰›† •ŠĤ˜‹Ğ›‹Œ²Ħ² ³˘‘·Ĥ•½ĴšıŞš£”Ğ ‘İŸ’¤™ž•‹š“Š˜…›ƒŻ¤•¸ĞšıĞ™·¨–ĥĤ•² °œ‹ĥ˘·˘‘ĥĦµ ĥ˘·˘‘·˘‘ĥ ĥŸĥ ·˘·£¸’¸’¸’¸¤‘·¤‘µĦŽħ›‰Ż˜†­•„Ş’£Œ|£~˘Ž~ž‰y›†vzlž}µŞ˜Âş§ĈŞĈŞĊ½İğ¨½ĥ£İ£“afi5AU*8R)6R*7Q,;U7GaVhwXnxBYmD]pQkyKcsKboUluSjs]swl€n~€FXj7G_/?Z/?Z5G_M\iv{’’ƒ••ƒ‰‹|yyy„~‚Œ…’™Š›žŒ›‰ĦĦŒĤ¤Ğ§­¨Ş¤‹Ğ§Ž­İ¨Œ˘ ˆ£ĦŠ£ ‰£ ‰Ħž†ž›ƒ™–€ŽŽz€‚s€s“€§Ħ´­™ğ³Ÿĵ´ ĥĞ”¤‘x•|a˜€d˘Žt£”{¤’y†kuZ•}_–€bƒt_YXO?HDYTiC\pMgxLdtKcsNftPitavxk}~Wiu:Lc1B]->[1B]?Qeiuy“ˆ‹Ž‚~„{y‚{}‡~‹’†“™‹™žŽ—œ‹œŸŒŸŒĦĦŒĤލޣž†¨¤ŒĞ§İĤ¤˘Š˘Ħ‹ Ÿ‰ˆ››…“•‰{…‡vv|onwox}tŽŽ§¤”ħĴ›´›³¨’ĦŽu‘x]•}bŠqŸx˘v”{`ŽsX–}`’}awm[LOECY<>R:F^BOoKJkIHhGQrLVwOXwPWrOexW••}¸³žżığ´Ħ°İ–İ ¨ž‰ĴĦ‹°§‘·°›²š˜™kuuARe5Eb4Fe6Hg6Hg6Hf6Ig8JfWFXmWlzE[o8Ni?XpJatWjtPguRivYnuVhoDWi7H_2B[1AZ3E_Tj>Si=Pf:Lb4E\1@X0>V3BY:LbL^jbqrkywctwduxjyyevv[nrWkrQgsVlwaw}\t}]t{dxydxvgwq_oljyuoz{ˆ€‚ŒiwtXimWimVinQemQdjVfkWhmXlt[ow`rwXhr^lr‡‰İŸŠĦŒq’x[•}bš†mœŠrž‡l“x[–|_‘|`wo\QYI;I9Z6G_MaoVlvPgvG^sCZpY1?\5E`:OgCYn>Vp=Up=Tq@VoQaO_>O^=N\DVcH\jK_mVjrdvv}†}‰‰|nwp[eea`Xtk^‰~n™}‘ı°œĵ³ž½³´ĤŽžˆluYšf¤ŽsĤrĤŽoİ”w˘’wš‘|’‘yUaKEV=CW;[3Ee:OmVp?WqAWsBUp7Ll5Jk3Hg5Jd7Kc7I^8H\:I^9I^:I\CW;;M7@U;AX:U-9Q/V5EZBVf[nso~xswdnioj]‚mZ˜ƒoµ§‘Àĥ Á·ĦÀ· ³³¤Œš‚f‘wZš‚fĤt˘Šj£Œn£‘u¨œ„ݍ’œ›[gNGW>CW;U-9R0?VDZmVl|F[o7Jc8KeK_tJ_vCYsAXrF]uE^u>Uo7Hb:I^^,K[1@W/S6E[GZi[mso}xhrntn_‰q\šƒm·İ‘ÀĥžÂ¸˘ı˘³œ²£Š™d‘wYš‚e£‹mž…fˆl›‹rĞĦŠ´­— Ħ…anSFU>DW<>Q9@V:@W:;P7D]>PnJRnLdWgY^uUg‚ZqŠ`yŠdy…cŽi‘kŽi{‰e|‹eh~‘ivŽeq‹bvdzg–l…—n„”l’ihzŒeh‚iŒgu„`z„c…‰jžšş²›Ĉ½¨ÎĈħÏDzÏȳÒÊĥÓ̸Ò̵‚iP„mS}mRjcJWUDMLD`]V†tĦ™‰ŻĤ”¸°½´˘À·¤À·¤´˘ğħŸıݜ½³˘ıŻž¸­œħ˘²Ħ·Ĥ”Àħžĥ˘Ċ·¤Äĥ˘Äĥ£Àħžż°ĵ­›ĵИ² Ž§•„˘}‰x–r‰ugv`Us^Uyf\†rfœ‹}ĥ¨—À²žÁ³ À²ž°ž¸Ĵœ°—¨ž§œ˘—‹ “ˆž…Ħ•‰Ħ—ŒĦ—Ħ–‹Ÿ”ˆ •Š“‡›… ”†˜‡yŽ|r—…x‹|™†xš‡x”‚v…uklZRm[SšŒ~´İ—żµĦıÀ·˘À·ĦÁ¸¤ğ¨Ċ½ŞĊĵİĈ½ĞÄğ§ş§Àĥ˘Â·˘Â¸£żĥĦ´Ÿğ°œ¸­™¸šĥ› bjkDUdSgsTjxUhwgsy‘’Šħ­žÀı¨Ĉż­ĵݽ¸¨†ˆ…AL_0;U-9R4D[LbtRhy=Rh8Jb>RkOcwI\uDYs?Vq^+;[.>]0@^,<[+9V+8R/:PDGPhc_Š‚u›“‚¨Ħ­‘Ĵ¤¤ˆ™’„‚v]cf:GZ0>V/=T2@V8H]H[i_qs_lluo`Œs]œƒlµĤż³›ÀĥŸż´½²›³£‹†h–|]…iĦ‰jŸˆjš†j™ŒtĤ²Ĵ•¤ˆn|]HWADW=@S:?U:?U99M7AZ>HfFOlKbW_zT^yUi†]p‰_o„]q‡`r‡`t‡`t…`xŠc‘i€”k~“itŽdoˆ`o‰`s‹b|‘g€”k‘iyŽet‹cqˆ`t‰bqˆ`qˆ`p‡`|fŠ”p˜—yµ­•Ĉ½§ÏÇħȳȳɵÓÌ·ÓÌ·ƒjR}jQj`IURBQOHmjb™“…İĦ³Ş—·›½´ĦÁ¸Àĥ£żĥ¤żµ£½³ ĥĴš´İ—°£’Ğ›Š§”„³˘‘ğЙ³ Äĥ˘Ċ·¤Ċĥ£Äĥ£Á²ŸĵĴ™şŞ˜¸§•ŻžŒ§”ƒžŠz‘|mŠte‰se“q—†İ›‹˘‘¤“„şĴšÁ³ À²žÀŻÀŻż°·İ—­Ħ’­Ħ“¨œ˜Œ‚”ˆ›…Ÿ”‰ •‹“‰”Š˘–ŠŸ’†œ„›…‚wnf„si~p‘~p†sgq_U\JCTB=fUOŽ}p¨™‰½³ żĥ˘µ ½´Ÿ´ żĥ˘Á¸¤ı§ğ¨Á·´˘½³ ż³ı­—µ¨‘ĥ§Żž…Ş™€­ž„²§“Ş•ipq@QdE[qHbzQj}Xlxeqt••Œı´¤ÄĴ½Ğĥħ£qvy9DY.9S0S9>T88L5?XPgV?TjMcw;Qm6Lj?UqTh{LczIaz>Wv:Ts9Po9NkCWoH[q>Rk8Lg2Ea->\.>]-<\.=\0@^0?_0>^1?]/>\-;W-:W1=V?HYgff —…½³´žµžÁ·ŸşŻ—ĥĴ”Ħ™‡eii:EV2=R0;R2=R9FVL[b^fcucu]›€gĴ›ğŻ—¸˘Â¸˘ĵ°š¨—~™€a™`œ‚dŸ†h–‚f‚w^ŒsĦĦ„²”´°—Ž—w]mQFU@CV<>R9=R87J5?X=HdFUtOWvOTrOe‚Yh‚ZjYm…\qˆ_q…^tˆ`xd~’h~‘hxŒeo†_d~YcXbWb€Wa€Wb€Xb~Wc€XgƒZcY_~X`Xe‚Zl„]w‡ay‚`‚eĤĦ‰ÂğÌÄŻÎĈħÎĈħÏȳÑÊĥÒËĥudM\TDQOGtsiĦ›ħݘ·œ·›ĥĴ˜µĞ˜¸œğ°œşš·İ–´¤‘Ĥ“€š‚r‡xĞ™‰¸¨•½š½­š½­›ÀħžÁħžżŻ›ĵĞ™¸¨–¸§•² ŽĞ˜‡¤–p‡o`xgŸŽ|°£´¨“³İ•·­™ıš­œŠ¤}şŞ—ż°œğ¨–ħ˜Šħğݘı§•´£‘ħŸİ™‰œ’„w‡~Œ…ˆ‚’‰‚š†œ†ž’ˆ˘—Œ˘—‹œ†•‰€”‡}“‡}‹v‚vozojypj}tn}qj‘…y”ƒğ°žżĥ£À·˘µ ğ²Ÿż·¤À·¤Á·Ĥĵ°ž³˘Ž¨zŸ†lž…i†j˜ƒi’g‡vbraˆzh‘‡v˜•Škvz>Qi=UrB]xKf|Xq}`tzhtt–—Œşµ¤ÁğİО[cm5@U-9R2BYDZnG\r5Jh6LlJ_xUi}F]yAZxQ0;P3>Q8CRERZ\b]†wb“v]„k²£‹³œÂı£Àĥ ¸Ş“˘Œq•z[—|]™`•}`|lU_^JnuZ‚‹jĦ£…´Ż–˘¤ˆw…eRaJEU>>P8;L67G4?W=FbEQqMOoKRrN_}Td}Vd}VjƒZl‚[p‡^t‹asŠau‹bp†^c|X_yV`|V_}VYyRVxRWyRYwRZuQ\xS_|T]{T[yT]zTc{UgzUhuSfoSy|eЧĊ¨Ë­ÌÄŻÎĈħɵÒ˸ÑʵSL?RNGrncĦš‰´Ğ™¸Żşħž¸œĥĴ˜µŞ—µ¨•²˘Ş–£{Ĥ’‚¨•†­œ·§–ğĞ™şŞ—şŞ—ĵĴš½œğޘı¨•¸§”µ£‘³ Ž­šˆĤ’€›†uuf‡oa‹vi‘€ož{´İ”ĥĴ—ıŻ›ıݜ¸­šĞœŠĦŒ|ĥ’ğĞ—°„x²œşĤ”¸¤’ħžŒ²žĞ™‰›‰|‹znŽƒz˜‡š“Š•†‡€‘‡—„œ…™‹š›„›†œ‘†šŽƒ“ˆ}”‰†|Š€x‡}u“†zŸ{ıĴ™´ À·¤µĦĥ£ÂşĤÄşĤżħž´ Œ¤†p~e›e˜fzc€salibbed]cfZdl`jrltxXht>Sm=VsE`{Kg~Zt€k€‚u‚}ŠŽ„ĥħĦĵ·Ĥ£Ħ–RZe2=U.;U6IbD[q?Un3HgWv;Ut?XtH]tG[s;Pl4Fb1AZ3AY7CZ8E\=J`CQeJWjNYkKWhIUeFRdCNaBNa>J_:G^;I_EQb{µ­™ÀĥžÀĥžżµğ°˜µĞ“—„^b`?IU8BQ5>N6?N:DRFQWcd[‹xa”x_˘‹rĥ¨ÀµžÂ¸˘´žħĦ‰—d‘vX‘wZ’x[…pW`XFPUCTZGiqV“•x°Ğ“²–™Ÿu‚fQ_IBR<9G44B2>URm7Hc5D^9G]BN`HTbOZf_ipz€‘•Ž›œ“’”Œƒ‰ƒz‚uyvkomejkU^gN[iR^j†ˆĥ˜żµžÁĥŸÀµÀµžş°š›–†eieMTXBJS:CN:CP=HUJSWlg[x`”x_§’yĥŞ’ÀµŸÀĥŸş˜Ş˜~”z^rUtWˆqWqbNQQAR]FOXDTXFxyb§Ħ‹´˜´°˜¤ĤŒs€cKZC>L77D4BW>OlKJgGMiIRnKWrMXsN]tPgzUewThyUfwTlxWlwVevU[uRUsOTqNRnLOjIMhGLfFKcENdERhGTiHSiGRhGQfFPcETcG`jQƒ‡o³Ż—Çż¨ÌÄÌÄÎĈ°È´ÉµÉ´ÒËĥ~{o˘œ²İ˜³¨—£‘ĴŸĴœŠ§“§”° ğИż°Á²ž³ŸÄ´ Àݚş¨•ı§”ĥ¤’²Ħ²˘‘°ŸŽ¨–…’££Ž}šq”|m˜…už¤˜ˆŞ ­˘³İ–¸š¸™ĵ³ž½´ŸÁ¸¤Àĥ˘½´ŸşŻšŞ›‰£€Żž² ŽħžŒ³ ²ž™‰­™‰¤€—…xˆvkyh`Ё{›“‰š“‰š’‰˜†˜Žƒ”‡£—Š“‚w”„x–ˆ|˜Œ™ƒš„™–‹’ˆ|•‹€–‰}žŒ|ž‹ĵħž´ ĵ³ŸşĤĸğ§“Ĥ†ržeŸƒfœ‚exajfdP\jIVeGSdANc=Jb;IbBOfHWlNavPfxNg{Sm~Kg}Rl}h}v†ƒs~{§˜­Şž……ƒCK]2>V2B\;RpCWq4Hf9MlI]w@WuBZv>Wv;Tt@VsEYsHTCNXVZX}o[v\–zcŻžˆ³œÁĥ ³ĥİ’Ÿ‰o‘vZ‹qU‡pUwgNTN>GN=LYDTaIOWE_aP–Ž{µ­—ĵ´žµħ˜™wdwVKZA?N9G\AOhIQjJPjJRiIVgH^iJekLhjMghMakN[kMYkNZmOUiLOfIIaEH_CH_BG_BIaBKaBLaDObDPdEQdERfFPdEObEQbGYeMs|cĦ˘ˆÀıĦËÂĴÎĊŻÍÄÎĈħÏȳÏÇ´ÎĈ²ÏÈ²Ğ˘‘³İ—´İ–Ħ§•ž‡uĤ‘~³£şĞ˜ż²žÂµĦĥ˘ÄµĦÄ´ Ä³Ÿżš¸‘²ŸŒ´˘³£‘­œ‹£™†xš†w–r’}o™Š{§šŠ²§•³¨–¸Żĥ­›´Ş˜ĥĴ™¸›´ Á¸£µ żĥ˘şÄğĤ¸£¸­™¤”ƒŸŒ|§”„И‡Ĵ—†Ş•„¨•…£‘˜…w…rfs_V|pi‡›”‹”‹—…–Žƒ£˜‰Ħ°˘ŻŸĤ–† ‚—‰|–†z–†yšŒ~–†x–ˆ{’…w‘„w“ƒvš…vĞœ‹·­›ğ²Ÿ´ Àĥ£°°“€}ežƒf ‡jœ…j~qaR[eFTfNZgXcmU`kQ[fGRaW4Gc>Tq;Pl5Ih@TrF\yB[wG_x?WuAXuDWr>Qm>NfBRgSaor{}“•¨Ĥ—³¸²Ÿş³ ½µĦÂşĤÄĵ¨ÂıÂşĤÄğ§À·˘½³ž½´Ÿş²ĥš¨”²Ş–şħ›ÀĥŸÀĥžż´œğħ›ĵ³µĴ–Ş˘Œ•€|ymQY[HPVPUVlcU‹tZ–z`£ˆs¸Ş•Áĥ ż´½ħš³¤Œœ„h‘vYwZˆtXc[EDH9LYBNbG[rQWiN`kTŒ‡s³Ş•şħšµ”ĦĦƒŽjkxXQ_CKZ@WgI]iJ\gH`dGbbGX\DMXAFQ=BM?N=>MY5Kj=Rp8Lk:NmH\vAZxAZxAXtCXsGZt@RnAPhHWkeq{‘”­ŞœğĥżıĤÁş§ÀıÁı¤À¸˘À·˘ÄğĤşÄğĤÄğÂı¤À·˘Âı¤Á¸˘ğħ›¸˜ıݚğħ›½²›ĵħšĵħšıݚşħ›µĞ•ĞĦ‹ž–|{nX][[ZRhaSƒnW–{_Ħƒkݚ…ĵħœÁ·Ħ½²œı­•İ–|”z^sVŽuYoUPM=BK:OaFMcHZrPVjMdqU‰r²İ“·Ĵ•ħ¨ƒš“v†€acgI[bEgiKaeIT]DMYBJV@EV>FX>FX>CT>CS>AQ=@O=EV@I[CK]CM`DObDNaCPcDM`BK^AL]BL\BKZ@L\ARbETcGWbKks\šœƒı´Ä½ĤÊÁĞÌ­ÏĈħÏDzÏÇħȳÏȴɵȳĦ}žˆvžˆvĴš‡ıİ•Ż›À²Â´ µŸÄµ µĦÁ°Ĵšğ§–µŸŻ™ˆ™‡Ğ—…¤–€r‰sg–„vŻ˘’ĥĞšıŻ¸œĵ³˘ĵ³Ħĵ³ µ˘½´˘şħŸı°žı°ĵ²Ÿżĥ£À·¤ÄğĤÄşĤżĥĦĵ³Ÿµ µ˘À·£·Ğ™Ĥ˜ˆ’€r‰sf…oc‚mazf[vf]wke†~wŽˆ™‘‡™’ˆ—…™„ĤšŠ¸Ş•½Ĵ—½Ĵ—ĵĞ–ğİ•ı§“ıĤ“ĥ£‘³ŸŒ³Ħĥ¤‘·Ĥ“³ĦŽ­š‰ĦŠy•|mĦŽ~´¨—ıŻğħŸğݜ³œ‰£‚kŸ‚ež‚ež„g…iƒtabdeox{  –·³˘ı³£µħ˘Ğİ›‡ŒˆP]h;L`=SkJauRhz@Xq?WoTlzl~~lzz†‰„[dm7BX0=X2Db9Pp>Ro9Ml?VsJazSrGZt?PkAOfLYkr{ĦĦ–ĥħĦÀş¨ĊĴĊĞĽİÄĵ¨Ĉ½¨Ĉ½¨Ċĵ§Ĉĵ§ĊğĈĵĤ¸˘ı¤ı¤ÄğĤÀ·˘½³ğħ›ş°šşŻ™¸­–ş–ı˜·Ĵ—¸­–´Ş”§žŠŽŒ{mpgee\qgUƒpYš€e ƒjİ‹v¸Ĥ’³žÀ· ĵ²œ³¤£Œq”z^ˆnS‰qWtdNFI9DQQfF^qPgyD[qCZo\r{n€n{zpwyGTe3@X3A[9Nk?WuOi@NdNZix}~İĤ™ğµ£ÀıĤĵİĈżĞÈÀĴĊ½¨ÄĵĤÄĵ§Ċ½¨Äğ§Äş¤Ċğ¤Ĉ½¨Äğı£ş¤ÄşÀ·˘ÀµŸ³œğ°™ş—ıĴ“şĴ“ğ–·Ş’µİ‘Ĵ£Ž•‘‚qvoondu`‡rYu[ž‚iŸ~fĴ|ğĴ–ÀµŸı£Àµ ŻŸ†›‚f’w[sW‹t[l_KGLJ^AMeFRgJ]pOeqR€{^Œz]‘{[ŒvX…qWzlTX[FBO=9H8>N<;L;8L:?XALkJUtOXvP\wQ`yScyTawSbxT[pNXhKP^FM[DN[DN[DQ^ER`FS`HS^GR[FV\HilVˆ‡n§˘Šğ´žÄ½§ÇÀŞÉÁĴÍĊ°ÎĈħÍİËÍĊ°ÎĈħÑɵÓË·ÑÊĥɵɲ­šż°œ½šŻ›Ż›ĵ­šşİ—ĥ¤’ħŸĴ˜‡Ş–†¤€œ†wym…ma‰qc•o§˜…²Ĥ“ıŻ·­›ıݜ·­šµŞ˜ħ’ŞœŠ›ˆw’~m“n”n’mŒyjˆtgzm›Œ~˜‰Ż£’¸­šğħžğħžĵ³ŸµĦÁ¸¤ÂıĤş§Âş§½µ˘½´Ħ½µ˘µ˘şħž­”𒇓Œƒ‰€“Œƒ–Ž„£—‰µ¨•ÀħÀ°œÁ°š½Ğ•Ĵ—Ĵ—½Ş–ş§”ĥ£´Ÿ‹´ Œ³ŸŒ°Š³Ħ°ŠŞ•ƒ Šy“|nŽvj“…·Şšı¨˜­zĦ„i „gœ€dœ€c›~bš~a™€g Žz²Ĥ”ĥ£Ħ•ˆ‹ˆty}jotekpHVc;L_DZlLevJ`u>VnIcuWnyUgpDTe7CZ5AZ5Fd7Lo;Op?SpC[wH`{=Wt=UsEWqSX-=X/@[7Lf?XsF]v>VnD^tG_sL:@R:?T;BX=JdCE]AAXANjJQnMUvQcYi…\gYavTmy\–˜yިˆħŽĥħ”ı³˜½µ›À·žş˘Âş£ż· Âı£ĊğĤĈ½§Ç¨ÉÁĞÌÄËÌİÌÄŻËÂËÂÉÁĴÍĊħÎĈ²ÈµÈĥÓÌşĠÎğÔÍ·£}—‚t’}oŠth†qd…qc{lœ‰w¤‘Ş™‡ŸŒ´§”¸­šğ°žżµ£µ£ğ² ³¨—§™ˆ™‡uŽzg‰s_€iWˆpZ…lWˆoY…lVƒjUŒt\‹rZ’x^‘y`„lU‰qY‚kUw`MzcOs]LzcRt^Q|h]™Š}Ż£“ıŻ›½³ żµĦ´ ½´Ħµ˘żĥ£ÂıĤÀ·£ğ²Ÿ·¨Ÿ”†yŸ~³ĦŽıĤ’ıĤ’ıĤ’¸‘şĤ“ı¤·˘Ž¸µ˘Ž²ž‹°œˆŻ›ˆ™†Ğ•ƒħœ‰ħœˆ­˜…Ğ–ƒĤ‘˘Œ{Œtg”}pŞ™‰İ˘†rš|b•v[”qX“nU“nV”pWlVhXœoˆXbjFTd9G]/=Y,;X,BVRm8Nk@Zs=Up5D\.Xv7Ml4AY/=W2Df2Eh1De:Nn?Ss5Kp4Gl3Dd4C_1Ba5Kl8Qq9Rq@XtTiyWlyQjzIcxWnzw…‚{‰ƒn€u†‚‡“ˆ”šŠ•˜ˆŒ‡‰~šš°Ğšĥ˘şĤşĤÄğ§ÁĥĦĥ¤¨Œt €f f „iݏu§Žt¤ˆo™w`’kWdRŒaQfT˜xbĞ”}ğ­–ż´ż´ż´ĵ°š´§¤‘x˜b”|_z`oYx`w[ŒrVjO}iOveNg_Nlk[ŒŒwŸ‡­¨’ĥŻ™ğħ™·Ż—›š]hOI[BI]ABS=MbDTlIVjIP`GYlOe|Yt‹ao‡_l^w‹d{‘hzh’yħİ’Á¸ĦÂı˘Ċĵ¤Ĉ½ĤĈ½Ċğ£Ĉ½§Ç¨Ĉĵ§È½İÌÉÀĞÇİÈÀĞĈ½¨ÄğĤÄşĤĊğ§Ċğ¨ÈżĞËÌŻÍĊħÍĊħɵÒËĥÑÊ´ĥИğħş°œĵ³ µ˘Àĥ£ıĤÂıÁ¸£Äğ§ÂıÀĥ£ĵ²Ÿ´İ–§šŠˆte|dS€gSfQŒs[ˆpYŒt\‹rYt[ŠqW†nTiP„jPˆoS€gO}eLhO}fOgP„lT†lT|dN‚iQ‡nWfR†mW|dQx`P}fW†sdĦ•„³İ—¸Żĵ³ ½³Ħıݜݤ‘ݝŒ£’µŞ˜”ƒ†uħž‹µĦŽ™†·£şĤ’ğ¨”ğ¨”ğ§“ıĤ‘ı‘¸¤ı·£ĥĦħ‰°›ˆ³‰´Š´žŠ´‰­–„¤}œ…uŠreŸ‰{İ‡v¤‡kœ`š|^€bĦ‡lݜ‡şĞ—Àµ˘Âş§Â𨽸§œ”LWf3@X.=X2Eb5No6Kh8Qo8Qq4Eb2>W/^1Cd=Pp9Nq7Jl2Dd.>]1A`3Fh4Ii5Ji7Kh8Mj=Sn@Vn=Uo@P;I\@OdCRfFQbG\nN`uUrŠbpŠap‡ap…a{h}‘j”yŻİ’ż· Á¸ĦÄğ£Äğ£Ĉ½Ĉ½ĊĵĈĵ§¸£Ĉğ§ËËÈżŞĈİĊĵĤÀµ ıĴ—ı­˜½²žĊğ§ÊÁ­ÌÎĊħÎdzÏÇ´È´ÏÇħĵ²žÀ·˘´ µĦ´Ħ´ żµ Àµ ż´ Äş§Ċğ¨ż´ ĥޘ||hZu]Mx`M†mW‚iSt\v]Žu\vYŒsY…mS‚iQyaK€gN‰pT‡mR…kQƒiQ|eNgPƒjR…lS‚iP€gPƒiSfP„jThRƒkV…nZ~hY†sdݝŒş°ž½³˘ğ°žĴž‹”‚m„q_|jĦ‘›†t­˜…ş§“ĵİ”ıĤĵİ“½Ş•Ğ—Ĵ˜½Ş–ĵİ•şĤ’ışĤ‘ı·˘Ž²ž‹°›‡ħ›‡µžŠµŸ‹µž‹ħšˆ¨‘€˘‹{”|n˜t²œŒ­Œ|§‰rŸ‚e›}_ž€aŸ‚d£‹o°ž‡³žĊĵ¨Ä½Şżı¨§™Wak4C[-=Z2Gf3Lm4Jg7On5Jj9F_:E[9D\3@\5@[3B`4Hm4Il3Fe0@_0?_.?a1De6Hg:Mk=Pl>Rl@Sn;Pl:Pm:Qm?SmG^sWnz]t}[r|_u|g{}x…~‰ƒjyz`qx|„­¨—À¸¤şĤÁ·¤ĵħ³ĤĴš¤Œq˘ˆmš~e™w`™u_›w`šxb˜t_‘lYš|fĞ–€ş­—żµŸÁĥĦÁ· ż´ž¸Ĵ•ħ£‹˘w—b™€b™ƒh’{auY‹rV‹rW‹uYuiORSBGL?U`I]pPavSavSgxVx€b–•zŞĤŽĦž†emVJYAFW=>M9CVKc5B]1>[/Cg0Cf1Bb0Bb0Bc/Cf;NmDVr@Tr@Vs@Ur:On8NlBL?N9CU;GY=I[?HZ@WkIWmLawUr‰`|’f‚•kvŒd|h‚m˘ž†ĵ´œĊĵ¤ÊÁŞÇĤĈĵ£Ċğ¤Ĉ½§Â¸¤ı¤ÉŞË­ËÉÀŞĊĵ§ĵŻ˜Ş•{“z`‰pX’w`³Ÿ‹ÄşĤÉÀĴÌİÍĈħÌĊħÌİÍĈݵ˘ÂıÁıÁ¸£ÂıÀĥ˘Àµ ş—·§Žµ˘ˆ³ †Ĵ—€ž‡qŠr^€hS‹rZ‡oWŒs[ŽuY‘wZvXŠpT‰oU…kR…lR€hP‚iQ‡nV„kT‡oX‚iT‹s\„kT†mU„jRˆoTˆmRŠoTŒqU†kR‰nUŠpWu[ŠrZ~gT|eSr]P’r›‹yƒq_wcPwbLuaKt`N–‚p³Ÿ‹½İ”ÀĴ–Á­—Á—Á­˜½Ş•ğ§“À­™À­™Á™À­—Ş•şĤ‘ıĤıĤ‘·£°›ˆħ›ˆ³‰ĥ ²›ˆ°š‡Ż™…Ş”‚…vˆqd”„ĵ­›ı£‘µ˜„{˘k™v]—x]ž…i²£ŒşĤÇżĴ½ĞНbjp9E[0@Z5Li4Kj4Ji4Ig5EaAPi^lzbo}L\s9Eb1=[.>a/@b0Cf2Fj1Ei1Fl5Jm6Km5Jj:Pk7Ml3Ij5Jj;Rn>UqD\vLezLeyF_vC[qDZnH]nRdmgsru}z‡‚–›´Żžż·¤Á·¤ş™Ĵšƒœƒh˜}aŸƒgĤ‹n¤†lšx_•oX—oZœxa˘…lĴ˜~ĵݘ¸¤Ċğ§żµ ż´ž´ğŻ—´ŒŞ–|˜€c•|_—bv[‰oSŽuX•€f•„n‚zkY]ODQ>?N:CU>MaEKcFPjJUmLVnM^tRp|\vŠŒsXcKJY@BQ;EVL^@GY>QeETiHTkKg€YwŽc}‘f{‘g‚“l€Œlœ›‚¸ħ™À·ŸĈ½ĤÇĤȽĈğ£Ç½ĤĊğĤĈğĤǽİÉÀĴÉÀĴĈ½İı¤·Ĥ ˆot\…kTŠmW­’ĊıÌÂÌİÍĊħÍĊ°ÌÄŻÎĊż·¤ż·¤ÁıĤÂş§ğ¨Á¸Àĥ£ğŻ™ĥ¤‰Ż—|Ĥvž…n…n•|d…lVŒt[Œt[tYŒsVŒsVŒsVŠqVŠpW…kS†mU~eOfNƒjR„kT…nW}dP†oY{bNhR}cM‡nV†lSv\ŒqV…jQ…kR‰pUtZ‘y`ya€hUmVHkWJubQhTEoZGs^IzdOƒnZ¨”€¸¤½¨“½¨’Ş•ÀĴ–Ş•ğ§’ĵİ”À­˜À­˜żĴ–ÀĴ—Еޕĵİ“ş¨“ı§“ħŠŞ“‚—…µž‹³œ‰°š‡Żšˆ˜†¤|ŽwjžŠ{ğŻż² À­›İ˜²ŒŸjš{`˘ˆkĥĤŽıĈĞÂğݰĴŸckr9G^1A\4Hf3Gf3Hh6Gc:JeTcw_m|Xh}M^y6Ee.<[-<^/@d1Dh1Dg0Bd0Ce4Ff4Fc3E`4Gb3Fc1Ec1Ee2Fc5He9PlC\rMfxJcxLcvNdsXmvu‚ Ħ”²ž·³˘ş´˘ĵµ£Âş§ĵ²Ÿž‰Ÿˆq’v\•x\˜y^|cšq\”kX˜p\Ħ~hĴ’z´˘Šż²œÇ½§Èİǽ¨Â¸¤´žş—·¨Ğ™€ž†i•{]–|`“z^‹rW‹qW”}b˜‡p—Ž}’Ž~dlWEU??Q;@R;H\ALfGJeGPkJTlJYrN_vSxc’’yks[Q]GES?FV=L^@RdDI[@LaBOeEQgH`yUs‹b|’h†—n™rƒl–˜}ş´›ğ£Ċĵ¤Ċğ£Äş˘Äş¤Ĉ½§ÈżŞÇ½İÈĞÊÁ­ÈÀĞĈ½İÁµĦħ†•{c‰nV…iRp]ĥ˜ˆÇş§ÍÄŻÎĈ²ÎĈ²ÌİÌÍĊ­ĵµ˘ş²Ÿż·¤À¸ÁıĤÁ¸ĤżµĦşŻš·¨‘Ĵ˜€”~iŽua˜g™hˆqZ†nWˆoU†nS‹rVŽuXwYŽuY’x[…kT†lTfO|cL}eO|cO|dOrZHx`Lu]K~fR{bNjTx`L‰pXsX‰oU„iP‡mS‰oU’z`–f„mXs\LbOCbOBXF;gSBzcM‚lVxcݜˆşĤ‘ĵ¨”ĵ¨”½Ş–żĴ—½Ş–ĵİ”ĵŞ•żĴ˜À­˜żĞ–İ•½İ”żĴ–ż­—Ĵ—ı§“Ż›‰£Œ|İ‘€²›‰³Š°šˆ²Šħœ‰¨’’|n•r¸Ĵ›Á·¤ÄıĤı§ıИ ‡n–ya£‹p¸Ş”Ċĵ¨ÇżĴÂĵĞĴݝ\fq7E^0A_0De1Eg3Hi6GdBSnWf|WfzFYx;Os1Aa.<[-=_0@b1A_1@_/@_1B_9Je7Hb5F`1C`2Db1Dd/Aa.>\/?]1Eb9OiC[rJdyKexOfu[pyo}|˘Ħ“ş´˘Âğ¨Äĵ¨À¸ż·¤·Ĵ˜ž‹vŒqZŒlTmU’jU•lYšsbĦ‚pݏx´Ħа›¸¤Ĉ½¨ÉÀĞÊÀĞǽ§ÄşĤÀĥĦµ¨’ޘš‚gvZ‘wZ’y\ŽwYŒtZy`—†o“€˘œŠŸš‡ipZFU@@Q;AU[0=Y3?\3?[2?[5AZ4B[5C];Ia`L?iUGu`OuaOwcQq]MgTFhRCnWFybN}dOŽuZ•{_˜~a—}_”|\“z[“{`’z`…nWr]KVD:P>7^J>}eN€iS€jYĤ’€¸‘ğ¨“ĵİ”½Ş•Ğ•ĵ¨“ĵ¨”ĵİ•żĞ—Á­™ÀĴ—ÀĴ—°›Á°šÀ˜½Ĵ˜´ĦŸ‡{h`ƒmdŸ‡z²œŠ·£¸¤µ Œ­™ˆ‘t‰wkħ”³ Àµ Á·˘ğݚĴšƒµ£Áµ˘ÇĴÇż­Ĉż­Àşİ˘ –V`m;H_2Ca2Fh5Il;NnN_tZh{L\uSjJasPiy[r|`u{y‚}­§—ÀıĤÄĵİĈ½ŞÀĥ£İ˜„Žs^~YIƒZJˆfS›ƒnݟ‹ı­—½³şĤÂıÄĵ¨Ċ½¨ÈżĞÄğ§ÇŞĊĵ¨Á·¤ğݚ§–}w]fO‚hOƒlQ€mQ€rW‹~h𑁍—ĥŻ›ĥ𤠋ajUI\B?Q;AV;@W;@VI[@\nNt…_ƒh|‡eueĦƒ½¸ŸĊ½ĤĊğ£Á·ŸÀ·ŸÁı˘Ċ½¨ÊÁĴÊÀĞÊżŞÉżŞĊĵĤÉÀĞĈ½İµ¨•™‡t‘}l”„ĥËÂŻÍİÎĊħÍĊħÌİËÄŻÌËĞ€‹h”˜z¨ŽŞ“µ°™ş´ĵµž²İ“–ˆvhUIqZJ…lUx_‰pW€hR„jRˆoT‹qV”y[–|`“y_‰oWy`MsZIkSC_JQs;Mm9Ig6E`9EY=HXFP]T_ffru‰‡š•ŞŞž´ħ˘ı´£ı² µĴ™³Ĵ›­İ™™š‘lvxJUd9G`>LeXfpr{{^luCRd;Lc@TlF^vQizarz“‘‡·ŻžÀ¸Ĥż··Ĵ™—ƒp‡hT‡dPt]İš†½²žÂ¸£ÄĵĤğĈ½İĊŞÄĵ§ÄğÄğ§Ĉ½İıĤ´Ħ³¤xv\‚hP~fOweKtiOv`‘ŠzŸŽ³Ğ—½µĦÂş½ĥ °Ş•x~hWhLDX>BX=D[=AX<@X=IeDMlIMjIXtPfyWŠq²Ğ•ıħ›ħ§’Žˆt\]OW[JQ[HNWGQ[KKWEGS@KZB[mNm\q~aˆ‘u²°–ğ¤Ĉ½§ÀµŸ­ ‰œ“yޤˆż·ĦÇİÉŞÇĵ¨È¨È¨ÊÁĴÊ­ǿŞÄğĤÄşĊğĤÊÁ­Ê­ÍİÍĊħÍĊħÍĊħÍĊħÌİËÄ­d{WeuWr`Œ—vİŒ²Ż˜ĥݜš‰r_SqYJƒjTt[’y^ŒrX…kS€hQ†mSŽt[”{`•}dt^}eRfNAaJ>iSD„mVy`”~a˜€_”|]–_‰qW„kRˆpUˆpU„mU{fQhRDiRDfSŽv^‘y_ŒtX…mSŠrYŒsY†nWqZIVB8G61N<5jTEybNt]L†q`¨”·¤ĵ§“ğĤ‘Ğ–À­™À­˜ÀĴ—żĞ—½İ•Ş–İ•żĞ—żĴ˜ĵİ”¸¤‘ĥ˘´ Ž²‹°šˆħœŠµ ŒĥĦħœˆŞ•ƒš‡y{i_vdVŒyg­œ…ıĴ–½³ŸÁ·£Äğ§Èż­ÈÀÉÁŻÈÁŻÇÁŻı´ˆˆ†BOf7Jj7Km?QoM^y=Qu7Kp8Ig7E]9EZEN[]ch†ˆ££—²°˘ĵıİżşİÂĵŞĈĴÂıĤ³ž½²ĵ³Ÿ¸°œĥ°Ÿ˘ •pvxHUgHUityxžœŒŠUal>L`9Jd9NmBYtOduy|yĴ—ğ´˘ĥ¤·œ—…ucR…fR•~g²¤½³žÂı¤ĈİĈŞÈÀĴÇżĴĽİÂşĊĵ¨Äğ§ÀµĦ·İ•Ĥ”}”{a†kS„lS{jNlbJogU…€q£²Ş—¸°›ĵ´ŸşÀı¤·ħ‡ˆu\iOIZAAU;CX;AV;AX=C\@KeFQiI`xTr€]š˜{·Ż—ĵ³´Ğ–‰xVWNV\KahQciUbh[W\TPWMR]LVeO_oWp{f˘£Œ¸ĦğĈĵ¨żµĦĤ›…‰ƒkŒqħŞ’şÇ½ŞÇ½ŞÇ½İǽ¨Ç¨ÇżİÇżŞÇİĊĵ§şÈżŞÊ­ÍĊħÍĊħÍĊħÍĊħÍĊ°ÍĊ°ÍĊŻd{Xj|\wƒeŠ’u¤ħĴ–ħ¨–’„vlWK|cP†nVŽv\v\ˆoV‚iQ}dM‚iPŒrX“z`x_†mXrYI`I=[F;xaM‰qW‹sXwY“y[w\ŒtZ„mT~fOƒkSiP„lS†oWpZIfPBv^KˆpW‰qWŒsWiQ‡nUŒtYŒs[v_LVB7F5/J93gSD|ePzdN~jX‹x­š†´ž‰´ž‰ğĤ‘½Ş•żĴ—Ğ—½Ş•½İ•½İ•ĵ¨”½Ş•żĞ—𧓸’·£ĥĦŽ´‹ħ›Š²‹²Š²Š˜…¨’˜ƒuyg[{gTˆu`Ğ›ƒş™Á·£Âış§Áı§Çż­Ë°Ë°ÄĵŞĞĤ™jov?Nh:Nn{dP|eO€jTŽygŸzĞ—„²œˆ·˘Žğ§’ĵİ•½Ş•½İ•ğ§“şĤ’ĵ§“½¨”½¨“şĤ’·’ĥ£³žŒ²œŠŻ™ˆ°›Š˜‡­—…Ş”ƒ¤Ž{nyfVzfQkX¨—€ğ°œÂıĤĊ½ŞĊ½ĞÂşİÉÁŻË°ĈвМ‰‰…LYm;MmK`;Ia=LcU^jywr†z”‡”Ž‚|tskdpa›Šwĥݔ¸£ÇżŞÉÁ­ÈÁ­ÊŻËŻËÂŻÈżĞĊğ§ÁĥĦĥ§’y’y^vYˆtWvgMjbKqm^—’‚²Ş—ı°żĥ˘Âı¤Âı£żĥĦµĦĵ´Ÿ³˜‹‘w[jQGWBEW?G[@G]BK_CMcFVkLfvVz„d›˜´Ĵ”µž½´žĤ Žei\^mSfwUnYs\‚eœ˜‚ħ­šİ” ‘·Żı§ĈşĤĈıÄ·£½°—Ž{nv[kxWw|`¨ ‹ıÇĵ¨Ç½¨ÈżŞĈ½¨şÇ¨Ç¨ÉÀĞÇİË­Ìİ˯ËÍİËËÍĊ°ÎĈŻLUDPYFlu\“•|­Ş”´­š˘—‡hVLeOCzaNŽv]x]ˆnU…lS‡mTŠpVŽuYw]x_‡oXv^K`J=S@6q[IˆpVˆoTŠpU‰pU‡nTt]Jr[I{cNzcNs\I}eMxbK{dMnXEnWE‚iQ‰oV…lRƒkPƒjQ†mTˆoV…mUpYHL:2C3.F4/P=5nYIjU†mV€jV‹vd Œy­˜…´ŸŒ¸£ğ§“ĵ¨”Ğ–½İ”ĵ§’½İ”Ş•½İ”ğİ”ş¨•ş¨”ĥ˘Ž³Š™‡­˜‡Ş•…Ğ–…§‘œ†x~j^yeSzfP{hVİš…żµ˘Ċ½ŞĊ½ĞÀı¨ż¸§ÈÀÊÂŻÄ½Ĵ§£—kqwARm=OmHYrQbz>Pq8GdTA7w`LˆnUŒrV‹pU‰oU…lSpZH‚jS‡mSƒjQybM€gPhP~gOnWDyaK‡mT‹pW„kQ„jQ‡nUŽv]Žv\‰qYt^LL:2C3.F50S@7bMAv_MƒkU„lV|fSŠsbœ†tİ•‚²ž‹¸‘ğ¨“Ğ—½İ”ğĤ‘½İ”ÀĴ˜À˜½Ş–şİ•ı§“µ ²œŠĞ–…Ş•„§“‚¨“ƒŸ‰z‹uit`RwcPubN€m[°˘ÂıĤÂş§ĵµ¤Ĵ§™³ŸĈż­ÉÂħ½·§”’ŒU`pBTpGWoTdxBSq:Id?K]V]b‰„uĞĦ‹ı°œÀ¸ĤÁı§Âş§ş¨ÄğİĈ½ĞÈżĴĈŞÉÁŻÈÀ­ÇĞÈÀĴÊÁÊÂŻÉÁ­ÇżĴĈĴɰÈÀĈżĴÈÁÉÁÈÀĴÄĵ¨ż¸°Ĵ˜™xXcnJWgLXfU`hrxv––‹Ş•·°žÁ¸ĤÇĞĊĵ¨Ç½İĈ½İĊĵ¨ĈĞĊ½ŞĊĵ¨Â¸ĵŻ›­†ŸŠq’z`‰qU†qT~lPf[EXRExtf¤Œ¸ħĥ ½´Ÿ½´ À·£şĤÁ¸£´ şħı°›²Ĵ”Ħ£†€ky…ft~dhpZ[fQS`K^kRy„e £…ş³šÀ· À· ½´ž°¨•wvkYbQ^sQc|Tg~Vq‚\‡m²İ“ĵĴšğ•Á–›À”‡ż’‡ĵ†}³~uˆfZg_KbdLjmS‹†oĵħžÉĞËÁÎĊħËÂ­ÈżŞĈ½¨Ĉ½§Ĉ½¨Ç¨ËÂ­ÌŻÊÁĴËÁĴÊÁĴÊÁ­Ê­Ê­ÍĊŻ——Ş§’´­™ĥŻ›µ­™ŻĤ•‹~qZIAhRE}eQv^Žw^‹rY†lRˆnS†lQŠpU‹rX‰qX{cNiRB]G;VB7~gPˆoUŠoU‡mT†mTiQlWF„lTˆoU‚iQiR…lS„mTiSkVEƒkS‹qVqVŠoT„iQ‹rY—€f”}d€hSePBH70F5/H70Q>5`L@bM@s]L€iT‚kT†oXƒkY“|kĦŽ|°ž‰·¤ĵİ”ĵİ”ĵ¨“½İ”Á˜Á˜Ĵ—ıİ–·¤‘´Ÿ²œ‹­—†İ”ƒĤ‘€Ÿˆyylq]RjVIydPs`Nƒp_³‘ıÀı§Ğ§˜…”—ı޽­İšoruGTiEVoQ`vEUokSE{bN‚iTƒjT†mTŠpU…kQ„kQ‰pWˆoV…lU}eOmVD_I]RBYOCoeW“‡vŞœˆ²Ĥ’¸­™ı™¸šğħž½´ ĵ²ŸşħžĥĴ˜³İ”ħ§’ĤĦ‡‹’oiŽ”u£Ħ‰ħĞ•ĥŻ™³Ĵ•´­–ş²›À¸˘Á·˘Áĥ Àĥ ¸°š˜—}emUKTBYjJ_pMclLlgKƒ\MĦWTİYWŞ[X`\²e_´a^ĥY[·TX·SX¸QX¸SX·VY´TXĴZ\µ‚{ÀŸ“ĊݜǟȰĦÉ´¤È·ĤÈğ§ÊżĞĈĵ§Ċĵ§ĈĵĤǨĈĵ§ÇżŞÇ¨ĊĵĤÉÁĞÌĴÂşİş§Á¸ĵ³žĥĴ˜ž’‚bQG`L@oWG|cNgQ‰pWsYŠpWˆnTŠpVv\v\‰pX€hSt\JeN@WC8w`M‚hSˆnV‚iQ‰pT‰pU„kSt^JlVEiSDjTEt^KiS„lTˆoVŒsVŒsV…lRŠqUv[w]t]ˆpYwaOO>7I93UA7[G;bM?^I6]HYG>vcUİšŠµ£ğµ˘˘™]gr=KbK[oP_sT`oLWhIRcJR_bff†u­Ÿ†À´žËħÍĈµÎĈ´ËÂŻĈğ¨şĴ˜›ƒŞ’vr˜†n•Šy·ıĤı·˘ż´Ħ³ ż³ ¸Ş–Ÿ‹Ğš†¨”}£u˜€i•}e”{b’x`w`Žu^Žu\‹s[Šr[Œt\•f™d›ƒf–}a‹rXŒrXuZ”|_—€c•}`˜d–a’z\ŽwZwZ‰pU†kQgN~dLzbIu]Gt\Gs\Fp[FycL~gN…nT†nTŽuY”{`—dœ…iž‡k ‰oĦ‹rİ–~Ĵœ†£–ƒ„t‰}o…t†‰mw„`j~Yi{Xr{]‚‚i“‘z§˘Œ¸ŻšÁ´Ħ³Ÿ­šş§“”~{tZe\I^OChPCpQE|TI•\Q¤cX­aZ²ZY´TXıTZ½V]W^Z`½[_ğY^şTZĵQYğOYıPW´JTGQĞHR²RZı[a·Y_ĥ[_µhhĵ‹‚ÄĞ›Éğ¨ËÀŞÍĴÍÄĈ½ĤÈİÊÁĞÉżİÈż¨Éż¨ÇĴ¸¤µ ĵ³ž´Ş—‘„v[JBgQCt\J|dN‰pWŽt[‘w\sXŒsXŒsX‡nUŒsYw]€gQqYFfO@ZE9XC9w`N‹s\’x]’x\uXŠqV‹rVuZsX‰pW†mU†mU‰pV‹sWuYŒrWv]—e”}dˆpZiTxbNRA8M<5]I=lUF€gRu]J}fQmXFoYE{dLŠrV‡pU‚kQƒmT†oWjV{dSjX‰s_Žxbw_‘zay`’z_˜‚d™ƒe”}b’{a–d“|b„nYu_McOBYFK:4R@8]I=s\L‡oYw_L|dOoXFxbJzcL†nS„lQ‡oTˆpV‘y]”{_ŒsZ†nXgT{eT|fUjWkX…pZŽyaŽyc‰t_†q]‰s_~iVt^NpZJdPCVD;VDQM=PM=RM=YSAaYFhdOolVqmUpjQriOukOujN}pR†wY{]‘{]ŽuYŽsX“y[’z\y[…pUpbMe]KbdLZjLWqM[uOZuO\tPgsUŒ€j݆x´{q²sjŻhbĞd^§h\§h[dWŞ]V[W°SUĥPW¸OWıNWĥMVĥMVıOW¸OX¸NXıNX·LV·NWĥPW·OXµMV´JT°GQ­DO­CN´HS³GQĥKTşTZĵY]ĵ[_şnkÁŽÇĥ˘ÊżİËÁĴÉżİÉżİÉÀİÉż¨È§Ç§ĊĵİÄğ§şÁ¸¤·­š‹}n]KBqZI}fQ‚jT…lUŒsZv\ŒsY…mS†nT‹qVtY‘x_Šr[gRx`MqXH^H=]I>u^Nv_“z`‘v[–}`“z^™~b›‚d”|b—~e–}d•|b”|a•|b”{`w]…mV‚jUwaNhSFO>6N<5YE;ePCv_N‡oZybN„lU{dM}fMybL…lRƒkQŒsXŒtYuZ’y]—~`•|_“z^‘y_‹t\„nY…oY„nXŒv`‰t_Šua‹vb“}hybˆr\ycP[H>RA9]KB„paħ¤“½µ°Ĵ }ƒ†HVm@I\;DVAIWNT[kle‘ˆs¨˜~´£ˆżħšÄş¨Â¸ĵ°µ§‘ħž„²€²œ˜z¨’uĦŒsŸŽy§–~И}İ•z¨’w¤Œoƒgž„gĦˆiŸ„e–{`•|a”{`‘y^z]†rWoT€pTpTzkPh_I[UEVRETQFZXNdbXsna‹‚m…sšŽx•Œyœ•ƒ£›‡š”–”~—‘‘ˆv€udvgTl]IcUCYN?PI]WMwsf†‚u…ƒy}}szzq{|r||qssioncnl^mk[khWrkXvnX|qXtY}pVzkQnR…pT…qUi`LPWEOaGOeEOhFWoKdjL…YMŸTRĴZXħd^ĥ`^ı^^şY]şUZıPX¸NWµMVIQJRMSŻOT°PU²PW³PW°NU°KTıS[¸[_ĥ\^·_^·^^¸]^·\]µ\]´VZ·U[·W\µPWµMUşRZÀV^ÀV^½X^ğdfÀ”‰ĊµĦǽ§ÈżİÉÀİǧÉÀŞËÂĞÊÁ¨µĦÁ¸¤şĤÂıĵ³Ħ“†w`NEnXIs\Jx_LƒjTŠqY‡mVŒrX‚iQ„kR…mS„lSŒt[”}dŽv^ƒlUu^JiRC[G;YE5XC9cNAiWŠs]‡oV…lUtZ‡oTŒsWŒsVuW‡oTŽvY“{]–}^•|^—_”|_’z_™€cšc–~aŽv\‘y^—eŸ‰p˜i’{dŽvahUr\MjTEYF<_LB€k^–†¸ħ˘£Ħ˜kqxJSc@HZLOYdc`…pޘ{´Ħƒı§Š½–ż³ ½°ŻˆĤv£ŠoĤŒo§p¤Œp¤ŒoĦ‰k˘Šk›ƒgĦˆkĤnĦˆlœ…iž‡lŸ‡iŸˆj—‚f{_€nVxkWsiYmfXgaThaRngXkdUe_Og^LjaLk`LpcMvfP}mV€k¤™†³Ş˜´Ĵ˜°İ–²Ş•µĴ—ĥĦĥĦş³ž·Ż›´Ĵ—²¨’İš„•}dˆnS†kQ€gLtaHg\E]VEe^P…s¨ Ž³Ĵš´­œ²Ĵš²Ğš³­›Żİ—Ğ”ĤĦ˘œ‰™‡’‹‰{†…x{zltrcso^skVxlS{lQzkQobMSTELZCK`CMbCWhHh\FQK¤]VĞbZ³^\şX\V\½T[ğQY¸MV´IS°JRħNU³TW°YX­ZW­]Yħ\Y´[[ħUY²NVşQYşZ_şW]ğT[ĵT[½T]ğU\ĥU\³W[ĥ[]·Z]´RXµMVµQX½U\ÀU^S\ĵW^½{vĊ­›ĈşÇ½ĤȧĈ½È§ËÁŞËÁ¨ĥ­˜µ˘ÂıĤş§´£’…x]LDePCkTEw_L‚iT†nW…mTŒsY†lUˆoVv[w\‘w]–}c‘y_‰qXv^KeN@`J=\GeOBv_NŒt^w`“z_’y]’y]vYvZ“z\”z\‘wZ‘y\”{_›‚b—bšc™b”|^•}_’y]“z^t[’z`™‚i†o—h‡p\~gVr\MfRF^J?VDgQC{cPƒjTŽtZˆoWv\•}`„e–}^”{^•}_“z]—~_œ„dšb˜~_–~_œ„c’z]‹rX‰pV”z^–}^•{^“{a›ƒi’zb’zb…mZu`QlWIcPDXF=YG>t`U“…yž™xz{SYeJP]SUZ~sd sݚ}³Ÿµ¤ŠıŞ•ĥ¨•ŸˆĤ’xž†kž…i—€f“|c—~bšc˜}b•{`–|a–}a–c‘b~c‚t^skZkfYmi^urg{o“ˆx˜Šu—†nžx™}š‘zİš·œş³¤°Ş›˘š‰—}Š„wpk`^ZRZULb]Nr]§›‡ĵ³Ÿ¸ħıħĥ­™ğ³Ÿż·¤ğ²žĥĴ—Ħ‹£‘x˜€fŒrXŠpU‡oT}jNrdJ_WEc_T‰t•~£›Š°¨“´Ĵ˜½´ À·£À¸£À·£Á¸£À·˘µ ÂşĤÀıĤÂğ¨ğİÂş§·¤·ŻĤ“˘›‰‹‡ysqg_^UMTCEP=DO;GQ;ROdNAcMAv_M‡oW‚iStY‹rYw\”|]’y]‘y\•|^–~`›„dœ…d†d™a“z]’z]…d”}^ŒtY‰pWsZv\“z^—€f†mŠs\Šr[hTq[KiUGbODVE<\JBxh^Šƒ|lnsNUaLQ[\]^‡}m§“w™{²œ~µ£‰µĤ‘Ĵ›†ĦtŸ‰n†jœƒf›d–{a•{a–z`“x]”{_y^‰y^Šz`…w`~taysdwtjzzqŒ¤ “Ĵ£”˘”€ŸŠo ‡iž†h–„hwoZ}v_Ĥ›ƒĵ´£ĵĞĵĞż·Ĥż·ż·ĥ›§Ħ‘“Ž€~|svriš“…ĵ´˘ż¸½µ˘ş²žĵ´Ħµ˘·Ĵ–Н† t›‡o™‚g‰pV„lRjPvdKl_Gg^LlfYqi]jbVpi\އq…·­˜À·˘Âı¤Áı¤Âı£Á¸£ÁıÁıĤÁşĤÁş§ÄĵŞÇżĴĊ½İż·£ż·˘ĵ³žµ­™­§–”‘‚agWOZEIS>HN;TI;„IFĴTUĥa_¸[]·V[´PWħKT°LT´SX´[[³b^³\[µRW¸PXıOWıMV¸NWĥMV¸PXğR[ĵQZ¸NY´LWµNX³LVĥOYĥNX·KVıKVıKWĥKW³LV´RY·Z]ı[^µRXµJTıKVĵNYşW^żƒÈ·£ËÀĞÌÂÌËÁĞÉż§Ç¤ps\Œ„q­£‘½³Ħ½´£¤™ŒgWNeRElVGyaO‚iT…lVŠrY„lVu]x`’x^“za‘w]v\sY…lT~eOrZIxaNmWG_I=\G;\G;cM@aK?`K?ePB`K?cN@ZF;cN@dOAdNAlUFkTEgPBfOBr[K{cQˆpY–}_tYŽtYv[tYŠsXŠrY’z^’z]“z^™bœ„cĦŠg˜€`’z]‘y\•}^tY‰pVtYŽu[’x^–}b˜€g–~e‹s\‚jUv_NlWHlWH_LBUE=_PGg_[\`fLS^MQWeb^’†r§”zݚ~²€µ˘‰ŻžˆŸ‹s—€f›ƒfš‚e—~b‘y_x^y^x]Œu[ˆw]Š{`…yazs`xrc{oŠ€£ “ħ­ ı´ĵĥĤşħŸŸŠĦ‹o¤‰iĦ„d †faumTgdQ™“}ş³ĦÂşİĈĴÈÀÇż­ÇÀ­ĈżĴĽ޽ĥ¤´­œİ¤•İ™Áş§Äĵ¨½µ˘ğ³žğ²žı­™Ğ›ƒ›…iw\sYˆnTzcKxeKn]EgWAeWAhYEtdOrdPg\Kg^NngV‘‰t³İ”½´ŸżĥĦµ ż·ĦĥĦ½µ ĥ˜·°›ĵĥ˘Áş§Ċ½ŞÂş§ÂşĤÄğĤı£À¸£ż·¤µœ‹ŠuceOYVCUO?gOC”JK³PUıUYıTY·V[²RWħRW³WZ³][ŻaZ²ZZĥRWĥLUĥKT·KTħGQ³JS²JS´NVıOYşLW´ITGSŻLV°PY³PZ²NW³KT³GRĥKVıNY·S[³SZ³RX²TX´UYµMVµHS·JU¸T\ĵ…|dz ÌÀĴÍÄŻÍÄŻÌ­ÊÀİÇĵ£`mQvt^•Šw·›ĥ¤°Ĥ–sdZfTHfRDlWGiT„mYŠrZ‰qYw]”|a•}a“{_Žv[‰qX„lV}fPzbM|dP„lUxaLmWGePAcN@kTCgPAnWFoYGiSCmWEfP@pYFnXFnWGv^LpYHr[Iu^JjS†nVŒsX–}_tY†nUŠqVŒrWˆqVŒsW“{\‹tW‹sW’z\•~_–`–~_•}^‘z]‹sWtX†nSgP‹rX‰pW“z`‘x`x`‚jUr\KhUGgSFgSEZI@SF?RKJKOWHOXSUUsl_š‰p§”w£ŽsĞ–}İ•} ‹t”gzby_•}`Žw]x^{`ˆy^„v\ˆx_ˆxawbyue|{qŒŒƒĦž’²­Ÿğµ¤ÀşİĵĞÄĵĞÁ·£¸İ’¨’u †g‚b™|]—}`‡wZumR]]K‰‡qµŻœż·ĵİÉÁÈÀ­ÇżĞĈĞĊ½¨ğĤż·£½µĦĥ˘Äğ§Ċ½İÀ¸¤ğ²ž´İ”Ğ›ƒ•cŒsW‡mQgNxbJl\Eh[CgZCeYBcWBaUA_UD]VHb[MsjY}p^—‰tĥĞ–µĦÁı¤ĥ ğ´·²›ŻŞ“š”~œ—~ШŽĥ²›½·˘·¤ÀıÀ¸¤Á¸˘Á¸£ÂıĤżĥ£¨œˆ„iZzQIsLF…KIŸHN­JQ·QWĥQX´SY´W\µ\]²^\³[ZµVY·QX·LUµJTħHRGPĴIQħMU²PW²OVħKSħFQĴHS²PZ·T[¸X]ıX]µUZNV²OWıRZşRZıW\ĥY\²UXŻMS´SWĥRXħIR²FQµOXğ{tÄ›ÊŞÍİÍĊ°Ê­ȧǽ¤VhJ\cKpkYĤž‹şħž²¨—…ymbPGaNChRD}eP…mX†lWˆpWuZŒtZw\”{^ŽvZŽv[‰rY€hQgQgO…lR‚kRƒkTu_J{dN~hPybL‚lU~hS~iUjVr]KydPzcO~gS…nX‚kV†oW‚kS‰pV‹rX‰rWŽuYˆoU…lRŠqTŠqU‹rW‹sW”z[vXwY”|\”~^z\‘z\“z\’y[ŠsV‹rV„lS}eO~eOgPˆoXxbˆoZv_NnXHmXIiTGaOCSF@JFEHLTLQWVXU€t`›…iž†i™ƒi–€i˜‚l“}e’{`x^ŠtZ†sY‡x\…y]ˆ|a†zbu`{tazvg„‚t••‡Ĥ˜µ²¤½¸¨ÂĵĞĊż­ĊĴĈżĴĊ½ĴÂş§ğĴ–Ĵ”wžƒdœbœa—{]“}bynUplQZ]Huub²ĴšÀı¨Äĵ¨Ĉ½İĊ½İĵ§ğĤÀ¸¤ğĤÄĵ§Ċ½¨Âş¤Âı¤ıµĦ·Ĵ—¨—€—dˆoS‚gNgMycJp`Gg[CeZCdZCd[EaYEb[JnjY„€q˜‘€§ŸŒœŠ’ĵ³Ÿż·˘Á¸£ĥ³§§†œœ~wydps\†‰j›œ}Ş’ĥ°œş´ŸÀı¤ż·£ż·ĦÁ¸¤½œ´™ˆ¤kdĦUT£WUĴQU²NU³QYµSY³RX·W\·]_µ__µY\şRYşPX¸MWµJTħHRŻLTħRW°XXĥXY²^Z³[[ŻSWŞJSħOXıRZ·W[´^]¸c_ĥd_´\\ħPV³PW¸QYĵT\şT[ĥVZ°LSµPV·TXħJSDOħKTırmĞ˜ËżĞÎİÍİË­ǨÈĤUjJRdG[cL‰tŻİ•ĥݜ”…iYNeRFgREr[Jv`N}fRiS‰pV‹sZ‹sZˆnV†nU„kS„mU„lTgQ€hQ‰qVˆoW…lT}eO…lSƒlSiSt[Œt\“|dx_ƒkTŒt\ˆpX‹s[Žv]ŠqY‰qXˆpV‹rV‰oU‰pU‰qUƒkRhP„kR‚iQ‰qU‰qVˆqU…nTˆpUŒtW”|]–~_vY“z[“z\–}a“z^ŠqX‚jS{cOhR|dQ‡p\v_NiUGiTGoZLeQEZIAUKGVWXXZZif]…wb–d˜f–€f’|ew`x_Žw]‡sY‡uZƒuZ€v]y`…{d€ygzn„ƒx—˜Š§—´žğ´£Àı§ğ¨ğ¨ÉÁ°ÊÂħĈ­ÈÀÈÀı°„Ÿƒfœ€aœ‚c•{]“w[‹u\vmTolPZ]GghWŞ“Áş¨Ċ½Şş§ğ¨şşÁı¤ğ§Ĉ½¨Ĉ½¨Âı¤À·˘³ž¸Ğ•ޘ€‘y_…jPƒiN}dLzdKm^Fh\De[CdZCd]GpjTpmYrrd“­§–µ­š·Żœş²Ÿğ´ĦÁıÀ¸£ĥ ı´™£Ĥ„’›v†mfqYdnWs{]|ƒcސq£ †Ĵ¨‘µ°šĥħœ·°›·Ĵ˜ĥŒ²~s°b]ĴaY­aXµUW¸OVıQY¸S[şW]ıZ^·``ı\_ıT\şPYşMW´GR²GR°LT³WY³][µXZ¸SY·RXşS[ıU\²R[ĥT\ıR[şS[ıT[şU[¸]\µc^³PW°JSµNXĵS\ğT\·X[³PWµNVµRXħMTĴEPIS·mk¨—ÌÀ­ÎĊ°ÍÄŻÌ­ÊÁĴÉÀİ^uSTkKRcHipX•”}­¨”Ğ£’vi^iVJiTGpYIv`N~gR…mVˆpX‹tZ‰qW‰qW‰qW‰qVŠrY‰qX„kS‚jR‰qX‰qX‡nU„lR‡oU…nUˆpVv[’z`“{`Žu[†mU‘x_Žu]”z^‘x]ŒtY„mT…mTŒtW‡nTŠqUŠqUƒlS‡pU…nTˆpVtWŽuY‘x[‰rWx[ŽvYwY”{\uYwY’xZ“y\”{`u\‰pYx`M~fQxaOycQgSFfREfSFgSF^LBZIAcVKoh\Š~jšˆn˜‚g•}bx_Žw]ŠsZ†qWˆuZ…uZ„v\†z`~t`sn`xujŠˆ{Ħž³ŻĦğĥĤ½ĴĊ½ĴÁ·Ĥżµ¤Â¸Ĥ¸ĺİÇżÉÁħÇÀÈÁŻĈĴÀ³ s–z^˜}_™~_‹qV‡kR|iRxpVspS[]F_aPĤĦŽÁş¨ĈŞş§ÄĵİĈ¨Âş¤Äĵ§ĊİÇÀĞÇżĞğĤżµĦ¸Ğ–­›ƒ–~cŠoTgMhNxcJn`Hh^EcZCaXDbZIlfV|j‹w˜”ƒİ˜ĵµ˘ĥ˘ş²ž½µĦÁ¸ÂıÀ¸£ż·Ħĥ²—Ħƒ”xŠ“pjrY^iSo}\u‚_u‚_xa…g‹Žq““x›–|›vŸthŞb]Ş_XĴ[WµTWşPW·NV´NVşU[ğY]¸[]şY]ĵV]şS\¸NX¸MXħITJS²TX³`[·XZ¸SYıRX·PX·QYĥTZħSZ²SX³PV´OV·PW¸OWıSYĥ][´QWĴEO°JTıOYğQZ¸X[µQXµMVµPW°PUŞEN­HR¸ol¨—ÌÀĴÎİÍÄŻÌ­ÌÍÄ­\vRZuQVnL[lOr{_•–}ݤ‘Ž…wgXMbQGbNBfQCnWFu]J~fQ„lU‰pV‰pV‰qWˆpVtZŒrWˆpV†nU‹rX‰qX‰qW†nT‰rWvYwZ‘x\w]’y^v[ŽtX‘w\’y`˜~_•|^‹tY‚kTiQ„lT†mS…mRƒkR€iQƒlR‰rVŽvZwZŒtW—~_•~]—_”{]‘xZ”z\wZwYŽtY†mT…lU‚jT‡pYybOiTu_NkWHdQDgSEbOCYI?YI@fVI…s_˜…mužˆm™€e‘x]Œu[†rXƒrV‡xZ‰{^€v_yqa{viˆ…z˜•ŠŻĞ½·§ĵĞÈÁ°ÌĊ³ÍĈ´ÊÀŻżħŸĵ­œ½ŻŸ° ·¨ÊÁħʳÈÀŻÈÁŻÇż­½°›¤Šn›€b‚c“vZƒiP}eMo`LysXuqT\^G\^N˘žŠĥ¤ÂşĤş§Ċ½İÇİĊ½§ÇÀĴÇÀĴÈÀĴĊĵ¨Àĥ˘¸Ğ–Ĵ›ƒ›ƒhŒqWˆnR†mQ~hMm_Ge\Ed\F^XFjdT~yh“yŸ˜‚£œ‡§˘Ž´Żœ½ĥ£Áı¤ż·˘À·£µ˘À·£ż·˘À¸˘ğµĴĴŽ£—z|„g[ePbnSk|YlZlZi~Yj~Zp€]zƒa€t\—]UĞcZħ]Y¸RXğPXĵPXıNW·QYĵX]ğ\^½X]½T\ĵS[şQ[·LWµKVŻLUħQX´XZĥYZ¸RY·TYĥTZ°QW­X[İfcİslĞnh˘[Y¤NR­JR´LTıMV·PVĥMVŻFP°JSĥOXşQZ¸Y[·SX·OX·PX°QUŞFNŞHP·soĊĴšÍÁ­ÎĊ°Ç³ÎĈħÍĊŻÍÄYrQ]wSZuQ^tRcsUs{_“”|š•ƒvj^bRGbOBdOAr\Iu^K…nW†oW‡nU†mU‡nU‡nV‰pWˆoU…mT…mU‰pWtYŠrW‘y[’{]‘y\tYŽv[’y^“z_“y]’w[’w\—}_™`‘w\v[‚jS}fOhQ†nTŠsW‡oTƒlR„mTŒtXŒtY‘xZ‘xZ“y\•|]‘x[–|^ŒsW‘wZ’x[vZ‰oV~ePx`Mv^Lu_Ls^Ls^LjVHhUFkXIgTFaPCYJA]MByeR•g˘qĦ‰l›‚d—~`’}^Œz]„vZ„v[€u^}ucƒ}pœ–ŠŻİ›ĵĥĤÀşİĊÈÁ°ÌijÎÇ·ÏÈ·È·Çş¨Ż–£„r§†x­‹ş “ÇşĞÉÀ°ÄĵĞĊ½ĴĊĵĞ𭘣‰m˜~a”z^ŒqVgO|eNocOw[pnQ[]G`aR§˘Áş§Ċĵ¨ĈŞĊ½ŞĊĵ¨ÇİÈżĴÄĵ¨Âı½²žµ¨“Ş™šƒiŽuXqUŒrV…pUncIaZD]VC]XHmhY‘Œzž‰Ĵ¤Žħİ“ħŞ•²Ĵ˜ş´˘ż¸À¸¤Âı¤ÄğĤÂıÁ¸¤ż·˘żĥĦż·˘¸´œĤ݉˜Ÿ|ˆ“piv\[dOanRcxUe{We|WczVg}XozX|fQWRĞ]X·SXğNXĵNXğMW·MV¸PXğY]½V]½R[½PZşNXıNXĥLV´JUŻKU³RY¸T[·QY·QYµ\_ħaaĤa]•h]‰gX’r`˜ua•kY—WPĦHM­IQ·LU¸KVµHS°FRŻJSµNWşQZşY\¸RXıQZıQZ³OVŞFNĞOUĵ‡~dz ÍÁĴÍÄÏĈ²Ç³ÑÈ´ÒȳN`HWnO]wSd|Wh|YiwXt|a‹Œu‰‚reWM^K@cOAiSDs^L}eR€hTiT~fQfQŠrX‹rY‹rXŒrX‹rXtYŒrWŒsW”{]w\u[‘x]’y^v\“z_šb–}`’x\‘x[‘w[…mU…nU}fOwaL}fOƒkRˆqVŒtX†nT‰qVŽu[wZ’xZ”{]v[”z]ŽuY’x\ŒsW“y]vZ…lS€gPs\It]Jr[ImWHp\LmYIjVGjVFeQD]LA_ODaQFr`N”}a„f¤‹j„e™ƒc‘€_‰{]€tZ|q[{sbŒ…vĤŸŽ¸ħĦĵĴĽ­ÈÁ°ËħÍĊ´ÎĈµÍĊ´ÏÇĥÏÇ·ÏǸĊ·¨Ĥˆv˜pc™pc™qc}rМȭĊ½ĞĈĴÄğİğ­—£Šn™€cŒu\‰nU}dNyeOneRysWffKVXDdeV°Ş—ÄĵİÇżĴÇżĴÄĵİş§Äĵ¨ş¨żµ˘ğ°›²¤£w›‚e”x\tXŽsV†pTrfLc]E]XE[VIsm^–~¨•ĥݚ·Ż˜ıħœ·°œĥ°ğµ˘ĵµ˘À¸¤ĵ§ÇżĞÈÀĞĊĵ¨ğ§Áı¤ÂşÂğıĥš§Ğ‡›£˜xyh`kU]qTawUayU_wS`wSjpRƒ[M£\U°ZXıPXğMXşLW¸LWµKT¸OWşWYĵQZğPZıMWµITĥJTĥKU°FRIR²OVµNWµPX°SY_` h`ŒfX‰kW‰lUŒnV‘qY•sZ‘bR”OL HM°HR³GQŻCNĴDOĴHR³NWşPY¸VZĥNU¸MWşNYĥLVŞGP²ac ’ÊĵİÍ­ÍÏĈħȵÑɵÒɳOdJNaHXoQb{Wi€[l]kwYv{b‹‹utj\ZKA[H>[H>jTFqZKu^L{dPybNgP†nVˆpW‹rXŒsZv[v[v[ŒtYwZ’z\w\‘w]Žt\ŠqYuZ“z]w[w[tYŠqWhQˆpWhQ{eOiQŠqUvX’z^x\ŒsXw[vZtX•|_’x\‘w[‹qV‡nTtX’y^w]‚jSt\JlVFq[ImXGcPCcPCeRDhTEeRC`PC]OCcTGtbP“{^Ÿ…dž†fœ…e”‚aŽ~^`†{a€vb”ŠvİŸŽ·½´˘ÄğİÉÀŻÉÁ°ÊÂħÎĈ³ÏÇĥÏÈĥÎĈ´ÎÇĥȸÏĈĥĈĥİІzxe˘d›z`vhğ¤–ĊğŞĊ½ĴĈ½Ĵşİ𭙍qš€bŒuZ‡lS{bMucOjdQtpSbaISUDpp_´­™şĤÇĞÇĴÄĵİÂıĤ¸ıœ²’¨—š„j•|_•z[“wZvY‡rUsfLf^GYTCXUHxse š‡Ğ¤Żİ•°Ğ—³­—ı³ž´›µ°ĥħŸµŻ½ĥ£ÁşĤÄĵİÇżĞÇŞÇŞÈżĞĈ½¨ĈżŞĊż¨żğ˘ğ¸Ÿş·ĦŞ—ˆˆuckXXeNYjNZmN^lNqcM•TO§_W´VXğPYğNXğMXşLW³HS¸MVğTZğOYıMX³GR³GRŻGQ²KSħIR­GPŻKS°KUĴPWİ[\—`ZjZŽr\‘tZ’sY’qW“oW™x]’mW[P˜IKĴFP°FPİBMĤBNIT¸OYıOX·SX²HQµIT¸LW²ITŞMTşyȳĦÌÀĴÌ­ÍÄÏĈ²ÑÉĥÒʷDzZvRUmOQdK]tTg~Zn„_qƒ_o|\w}c‚€ldXK]L@]J?jUGpZKu_MwaNybN†nViS‚jR‚jS…lUŽuZ‰pW‹rYvZ“z]“z^“z_—|_ŠpWˆoV‰qWˆoV‰qWŠqVŠqV‰pU‚kR‹rXˆpV‚kRˆoT‘wZš‚b˜€a”{_–}_•|^’y\wZ–}`‘w[ŒrWˆoUŠqW‡oVŠqY†nVzcOnYGoZIhTEbOBaNAbPBbPBdSDeTDcSEcTFo\KŒtZ™aœ„c“a‰{^‚vZzoW€ubŒq’‡wœ€İœŠŻ˘Žħ£ĥ¨”²ŸÂ¸Ĉ½ĞËħÍĊ´ÎÇĥÏÈ·ÍĊ´ÍĊ´Í³Ç³Ĥ³Š›ze}c˜x`Ÿxi½Ĥ˜ı¨ÂşİÄĵŞÄĵİ½Ż›§Žqœ€bvZhPv`Kl^KkfPliOYZESVF…‚nş²ŸşĤı§Âş¨Â¸Ĥ½²Ÿĥİ–Ĥ•™„m–~b‘w[•z\–z[ŽvXƒqUogM`]FON?HH>edWz˘Ħ‹Ĥ¤Ž¤˘Œ™›ƒž†Ĥ£¤Ħ¤ĦĦ‘ĞĤ•ĥ°ž½ĥ¤ÁıĤĊ½ŞĈŞÈżĞÉÁÉÀ­ÉÁÉÂÈÀĴÇÀĴĈżĴÀş§ĥħžšš…s{dWcMR]HYVF€QITSŞ]W¸SXğOXğNXĵMXşMW·KUıJUğMW·ITĥHTµJUŻFR²NVĥX[·TY°MU¨GO¤IPVWžh^ŽlZ‘t\’v\qW’sX•uZ—v[˜v[“nW‹VK–IJİENĴCN¤>JAM´JTşMXıMW·LUŻDOħFR´JUISZ]ż™ËĵİÎŻÎĊ°ÎĊ°ÏDzÒÊ·ÓË·ÑÈħ_{VZvS[rQYmP_sTj\n‚^r„aq}]sv\hdPZM@WF<^K?`M@gRChRCmWGw`Mw`L‚iR†nVˆpYŽu[‹rYŒsZŽtZ‘x]‘w\‘x^•z]‹qW‹qW‹rXŒsXx\’x\ŽuX‹rVŠqUŠpU‹qUŠrUŠqUsW‘x[’y\‹sXv[vZ“y]‘w[“y]ŽuYsX„kSw]†nX€hShRt^KfRCcPB[J>ZJ>_M@eRBaPBaQBaRC`REiYH„mT’y]‘{]ˆy[€sYtjUlcRrfU‡wb~h{d}e•„l’‚k‘i—ƒkĤ“yµĤÁµ£ÉżÌijÏÇ·ÍĈµÌIJÍIJÎijËĥİĵ”Š£ƒr™ye˜xc¤€qÀžĊğİĊĵŞÄĵŞĈ½Ğ°›Ĥpœ€auXxcLo^Ke\JedLZ\EOQA]_O™–ż¸À·´˘şŻ´§“¨–›†ox`“y^“wZ”xZ”z[ŒuWvjO_^EPT@DKdN@nWFt]KxaM|eO}fPˆq[‹sZ‰pX‰oWsXw\ŽuYvZŽtX‹qW‘w[w\tYŽtY•{\•{[“y[’wYuXŒrVŠqVŒsV‡nS‰pUŒsXtXtY‰pV‹qXŒsY’x]u[‰oW€gR†oY~fSybPxaNu_L^K@\I>ZI>_N@`N@aOA^NAaQC^PDhYI†qV“z\Žx\~pVofRmdSymZ‡w_—„i‘tĞ”u–uħ˜xµž~ħœ’vžŠn›‡l›Šrݘ„ş­›ÄğĞ˲ÍĊµÌ°ÏdzÑÈ·ÏÀħǧ›ğ•ˆµ•…µš‰ĵ˘“ÇşİÄş¨ğ¨ğ¨Ċĵްš§Žp˜{_‡lRt`Lo`M_ZI_^GOQ@QSE~}jŻİ•ıħžĥĞ™³Ĥ”İ™…˜‚l‹qZ‰oXŠoWsY‘uY“yZ‹tWxiO][EIQ>?H:CL>O^IYkP]lTUdNO]IQ]ITbJVgL\nP^pQ\pQ]pRdsWhr\txiŽݤ”·°žµ˘ğ§Ċ½¨Ċĵ¨Äğ§Ċ½İÈÀĴÈÀĴÊÂ˰ÌÄħĊżĞş·Ħž˘ƒŸ—~¤og­VW]Y´UYĵSZ½QZĵOYĵNXğNXĥLU´HRħEP­CO°EQħEPħKSµ\[ğW\½R[³NVŸMQVQŒhVrY‹nU‡iQŒoTŽoV“tZš}`Ÿ€dœw_—kX˜ZSİ[\´OWµLVĴFQĴDO²FQĥJUıLW·KVŞCN¤ALĤEOĞMTŻacż˘”ÉĵİÍÏĈħÍÄŻÎĈħÎĈ³ÎĈ²Ĉ°`yV_xTg[q†av‰et„bftXhyZiyZkz[kxYdnQPL=J>6M>6UC9^I=eOAgPBpYGnXElUDw`L}eP{cNhQ†mTŠqWŠqVŒrW‹qVŒrW–|]“z]“x\ŽuZ‘wZ•|\’xZvXŽtW‹qVŽtY‘x[ŠqV‰pU‹rWsX‡nU‰oV‹qXŒsYv\ŠqY…lUxaMw`MoYInYHjVG]L@TD:XG]L>[K?ZLA[MBbTF{lTŒ{]”c‡x_zoX€sY–ƒf˘Œm§oݘx·˘„´Ÿ· ş¤…ĵĤ†¨ˆĵĤ†¸Ħĥž~Ş”v‰r˘{ŞœŒÀ·ĤÈÀ°Èż­ÍĊ³ÏÇĥÍĊµÍÁ²ÈşŞĈşİ·§ĊşİÇĞĊĵİÇżĴÇżĞĊĵİ½Ż›Ĥq–y]‡lRn]Jk^L[XFUUCPPDihY˘œŠ³Ş˜²“¨—„š„ox`‡mV…jS†jTŠnUrX‰pU†rUrfM`[FMN??E;?G[I>ZH?C;BI>MXGXhO\rSczWe~Yh‚[k„]hZc}Va|UbWb€XeƒZdYh…\q‰bw‹fy‹g}ˆkƒq™–†³­›żĥ£şĤÁ¸˘şÄğ§Ċ½İĈŞĈĞÀşĤıµ ²°™§£Œ r¤VVYY³\[ğW]U]żT]½R\ğOYµLUħMU³NUĥJT¸JUµIS­CMħNS³ZX¸OWµLTHMŠVN†cQ„bPŽoV‹oTŠlS‡iPˆkRŠhRmW‘iU–fUœYTİTW´RXşRZğPYµJTEQ­COµITıLWµJV£CN¤FP­IR²QXĥroĊžÌÀĴÍÄŻÏĈħÎĊ°ÎĈħÏĈħÌ­ÌÁ¨TaJR`IQ`JWgNarVl}]rao|]eqUYdMR]FTaHVbJX\HXPDSD;XE:ZE:VB8[F9\H;dO?kUDjTCnXElUCu]H~fO‚jR‚jRfOƒjR„jQ„kR…kRƒjQgM„lR…lR†mShOyaK{dLv_IfN‚iQtY‹rXˆoW€gRƒjT~eQzbNx`M|dPr[IiTEcNB^K?YF;TD9VF:WG;UF:VG]PFzjW†u^‡xcxmYtjWwm[ukYymY…v_’g™‡l™‡lž‹p£t’w’wt­—yı£ƒĵ¤…Ĥ†ı ‚´œ€°˜|‹qĦŒuŻ£‘Âı¨ÈÀ˲ÏÈ·ÏȸÏÈ·ÍĊ³Çż­Ċ½ĞĈĞÈÀ­ÇżĴÂıĤÁ·ş­š¤Žs˜|_ŒqV{dMWN@GF:UQFˆ~n ”‚œxŠu^ŠpW‹oUŒpVŒoUŠnT…lSxhOylQlfL\^FSWBAH;>G6UA7TA8ZF:bL>jSBjTBkUCr[GpZGpZGoYGt]JgP~eN~fOfOgNw`I}eLx`JhP€gP|dM€hOw_J€gQ}dN„kSiR|dOr[It]Ks\Kt\Kt]KqZIkTGlVGfQCdOAXF;RB8TE:SE;OC:QDF:>I=JZFRhLWmNUlMSiKSkLTiKQjLWnNZqPVnNRkLRmNXwR]}UbWc€XfƒZk‡^s‹bvŒd~j€‘my†j‚…sŻĞ™ğ¨Ĉ½İĊĵ§ğĤÁı¤ğĥ ­­“•|~Žiw†asqUTM OOŞ\X·X\½S[½R[ĵPZıNWµJTŻJS³WW·YYğNWıJTµHQħDNµGPşMUşLVµKT§VX‘gW„dP‚aMŠkQŒmR‹kR„`L‰hQ†aM‡VKŽQN¤XZ´Z]ğZ^½V\şPY·MW°KTĞQW²JTşLVğMX²HT˘EOİIRµOWµ\_ğƒÊş¨ÎİÏĈ²ÑȳÓÉ´ÑȳDzÎĊÌÁ¨_oP_oQfxXo^sƒax„dtalw[ivZalTblSs`Ž•w­Ş”³Ĵ™§žŒˆ|mbTJVE<]H>[G<^I=bL>fN?bL>gP@hQAbM?fQAfQAs[Hs[GkTBoXDnXDrZFjTAqZEoXE~eN~dMeN}dMr[Hu\IpYGt\JoWFoWFjSDlUEnWGlUFgQChRCnVHkTFhRCePBXHZMBVIAUID_TOh_[_XWTPQTQR_\[gea`^XXUPPOGQOERPEZUJ^XLg_QocS{mX—„j¨’s˜x´Ÿ~µ|·Ÿ~ı €ş˘ƒ·Ħ…–{£‡lĤ‰lݎrħžˆÁĥ¤Ç­ÌIJÍĊ´ÎǵÌIJ˰ËÂŻÊÁÈżĴĈ½İÁ·£ı­™Ĥ“|u\‹oUfNjXGYOCjZHzcN}eOfO„iP„hOˆlQˆkQŠnS‚jPzfMk`IZZDOR@@F:VC;YE;[F;VD9^J<_J<^IVHA\PI`VPc[XYSTTOQTQSZWXjhg’‡Ş—•‘igZ^\MWWHTUEVVFZYGc`KgdNgdOjeQvkW…v_›‰n§“uĞ•v­•vħ˜z°™|Ğ‘uĦ…i£‡i¤‰j§Žs¸§’·ɿËħÌħÊÁŻÈÀ­ÊÂŻÊ°Ċ½ĞÁ¸¸Ĵ™İ˜„•{d‡jSfNmYFeUEp[HzbJgO„jQ†jP„hOƒfN„hO„jPhOqaIgZFXNAEF<;C9;J;FZDMcIOgKPiKKdIH`GH_EIaFKfHOjJPmLSqNVuPWwQYxR[zT\{T[yS^{T^|Vb~Xb~Yh€\i~\n_v†d{hy‡gw}i¤˘‘ĵĥ£½·£µħœ£¤‹~‹jjZe|WdzUbqPebJ€OI USŻ_[ıTZğQYĵOWğNVĥJS­EN­LQħ]X¸PVıMU·KSµHR´HR³FP²EO³GQ°HQİMSœ_Z‰aU‚`Oƒ_N†`MŒfP…XH‡WI‹SK˘ZX²Z\ĵ\_ĵZ^¸QXħGQ­GQ°LU³^_´qiħTXĥLU³IS°JT­JS´RY·X\ıvpÄĴ›Î°È´ÒɵÒʵÒʵÓË·ÓË·ÑɳÏĈSeGVhIWhIZgKkzXƒlŠ–qŠ•pŒ—rŽ—uŠ‘qˆˆn ˜‚·›½µ˘½´Ħğħž´Ş—š‰~rm\S]KC[H@cNC[H<[G;YE:XD9[F:\G;`K=_J<[H;ZG;`K=iSAhSApYElTCs[HkSClTDrZGdN?\H]I>eOC`J@^I@^J@_J@hSGgRFbOCSEWD<\H?[I@dQFnYLdRGTH@TKF]VThdcnmmsqq|‘މ£ž”ħޝż·¨ÈÁ²Ë³ËħĊ½ŞĞ}jqmYplTnkQgeNcbMhgOmmRmnQlmPmmPnmQmmRmjRifQpiU{pX€sY‚oVw\”z_‘w]™€dœ‚g¤tıİ“ÄşĤĈ½İĊĵİıĤÁ·£şšħĦŒ˜‚iƒiQ|bLp[Hr[Gy^I{`J€dL…iO‰nR‡mShOxcMlZGgXF[QDNIBGE@DF?AF=S=S>?WAAXB@WAAZBD]DHbGNiKRoOWtQYxSYyS]}Ua€XcXe€Yd€Xb~W[yU]uThv]’{”xs‚b`sRTjJShHQdFR`EXbHmeQ”YTŻ[Yµ[ZğSZĵPXĵNWşMV·LUHQ­KQ­ZV¸SXĵPX½OWıNVµNUĴGOŞEM°TU²SV·NWĥQYŻUYŞa`Ĥc`¤][§ZYŞYYZ[ŞTW°[[¸bbıgf°TY°KUŻJT³NW´UZ·oi·zpĴ[]­LUHS²IS´OVµSY·khÁžÈşĤÍÎĊ°ÑɴȳȴÑɵȴȳĈŻs}an{_mx]pzapxayg‘—yĤвĴ”µ­˜ĥ­™·šµŞ—¸Ĵ™ğ°œşŻšşšĥŞ•²‘´§“²“Ĵ Ħ”„‚swg[cQGXD5T@6WB7\H:ZF:YF:XE:VD9XF:^JeO?aL>]I=]I=]HTB:P@8QA:WF=TD=XG?]LD\NGaTLcYRga\qnkˆ†Ÿœ’°Ĵ ³˘ğµ¨Àş­Ä½­ÇËħÍĊ´ÍĊ´ÈµÎĊ²ĵ§ĞĤ‘Іstq`tnYupWolTgePgfOnnRprUppSnnRmnRllQkiPjhOjfOiePg`LkaLqeOthR|nUŒw]…l³Ħ‰À´ĦÁĥ£³ ı­šµ‘¨•™iŠqX|dMp[Gu]I}cL„iO„iPƒhO‚hOhOzfOo]J`REQI@TOG^\TkjdophbfYQVIGP@@N:>O9>P8:K85C43@32?23@34B45D58J8;O;>S=CZBF^CFaEIfHMkKPnMUsPUuQWxR[{U\|T]}UaV_~UZ{SXxRXwRVtPSjMXiQbvV]rRTgJM`EM]DLZCNWD`ePƒvfže`²XYµYYşQYğPXĵOWğNW·NV³KTJQŻWVµXYıTYğSZşV\¸X\ħMTĞHP²UW²YY·PWğQZ¸S\ı\aı[`ıV\şV\şY]µX[­QV­]^´feµY^ŻMV³MW·OYıQZĥZ_ı€uş‹{\^°LU²JUµMWĥPX·]`ĵƒ{ÇħŸÌÀĞÍÍÄŻÏĈ°ÇħȳÒÊĥÑɵÒʵÒȲ𙂔™~‹’t‘sŒr~ƒf”wĴ§ĥ­–µĞ•ĥĞ—²§”Ż£²ħ˘° ‰­›‚§“y¤u¤u’|˘yœ‰t•kŽyd‡q]}gTmXH^K?UD:O?6R@7Q?6Q@7WE:YG;VD9\J=bN@fQB]J=XFYKDYLH]SOh`[uoi‰„{˜“ˆ£ž“ŻŞžş´ÂşİĈ­Ċ½­ÉÁħÎǸʲ˲ÍĊ³ÏǵÏǵÑÉĥÑÉĥÏÇ´ÈÀ­ğ´˘˘ž~pwsdokXnkTkjSkkRqqUqqTppSqpTomRkhPgfOifPebPb^N`]NdaOliSunXˆ{eĤ”€µ¨”ı­™´§“Ğ›†˘z—iŒr[‡kT„hQ|cM~eN…iQ‡kQ†lQ|eLycKt`JjZHZODNGALHEWUQzwmœ—‰Ĵ•ݘ˘ŸŒ‡ˆvhn[NXFAN<>N9?Q9?R9=P9:K78H6T:T:AWF_AE]@DZ?DY?H]AIaCJdDJcCJdDJdDIcDHcEIeFKgGOkITrMUrObx\†wĦ£‘–ž…’›€Ÿ£‹ŻĴ•¸²ş²ĵ­›µˆ}³[]²ZYĥUXĵQY½QYR[ğU\ıPX´JT°KS­SUħ`\ĵ]`\`ĵ[`ĵU\·LUµJT²JR³JRµKS·KU·KT·KT³KS­JRŞKSĴNV°PYĥS\¸T\ĵV]ğS[¸OX´KTİKR›WV‡bYĦgaŻQX²NWħTZ­_`wżĴšÊżĞÎĊħÏĈ²ÍĊ°ÎĊ°Ç³ÏĈ²ÎĊħÎĈħÏĈ²ÑɳÒÈħ•|b–~c˜e˜}a’w\‰oV†mS‡oT‰oUˆlTŠmUsZ”x^”x^”v\•v[sX‰nU‰oVŒrW”y]vZ‹qWŠoVŽu[Œu\Žw`‰u`…s`Š|h…{l‚~rŽ‹Žƒ…™˜Œ£ “Ĥ˘”¤Ÿ‘£žŽ§Ħ’Ş£“­Ĥ–µ­œıħ ş² µ˘ÄğİğŞğŞĊ½ĴÄĵŞÇĴʰÊÁŻÊÁŻËħÍĊ´Í²Ċş¨ğĴ™ĵĞ—Àħż°œıݗȽĴÎĊ³ÏĊ²Ç´ÏǵÎĈ´ÇĥÑɸÇĥÏĈµÑÈĥÎijÌħ̰ĈĵŞÁĥ¤ĵݜµŽĞ˜¨”y£sĦ‰oš€f–zb”xa—{e—}f•{cs]ˆoZ…lWhS€fR~eR|dQ|cPx`Mv]Kv^JxbLycL{fMzfMsaJgVCdSBUHI_@H`AH`AHaBG^A@W=D\@IbBKeDLfEJcDF^BE\@H`BHaAIbCIbCKcCJbCIaCKcDLeESoKWrOdwZ‚‡xŻĴ›·´ ıµ ĵĥĦż·˘Äĵ§ÂıÀ³ ·–ˆ³bbµWZµYZĵSZżQZĵQZ½R[ıOX¸NX³LUĴMSĞ]Y¸daÀ`cÀ^b½Z`ıRZ¸MVĥJSµKTħJTHRGR°IS²KU²LV´NW·RZĵV^Zaż]cĵZ`·PYŻJS¨IR¤JR˘VV_XĤa^SXİRX_`zqµĦ‘ÄıËÁ­ÎĊ²Ç³ÍĊ°ÌÎĈħÏDzǴȴȴÑȳĈŻ”x[”w[—{^’w[‹pW‡lS…jQ„gP„gPcM}bM„hPˆlTˆlT‹nV“vZ’vZw\w]‘w\‹sZjUsbPqaQzkYraˆ}m‘‰{œ”†Ş˘‘°İ˜ħŞ™´Ĵ›²Şš´­œıħ ½µ¤À¸Ĥ½´˘ĵ³ ½´ĦğħŸżµ£Äş§Ċĵ¨Ċğ§ÇĞËÂŻÊÂŻËħËħÈżĴÉÀËÂħ̲ÎĊ´ÎĊ³ËÁ°Ä¸Ĥħ£žˆt§x³Ÿˆœ‰´Ĥ”ĈğŞÍħÍIJÎIJ̲ͳ̲̰̰ËÁŻÍħȽĞĊ¸Â´Ħ™¸°›†Ğ”|Ÿ†nš€h‘xa“x`u]ŠpZˆnYŠp[ŠoZŒr[‡mW‚hS~cP}bOy`Ns[KqZJt]Js^Jo\Hn]GraJn_HhZE]SARJ=MF:KD9B>6@=6HC9QITM=WQ@_UDlW£x·Ğ–¸¤şÁ¸£µ Âı£Á¸˘Á¸˘ż·ĦÂı¤Á¸£À¸¤ż·£·£ħĞ—™•„qscY^OOYFO]DObEShGSiGNdCJbBMdDKdDLdDKcCKcCKaCJ^BI\@GZ@K_EM^HLXFQ[KdnY€‰o˜œ²°˜ĊŞÇÀĴĈ½¨Á¸˘Á¸£Ċĵ¨Ĉ½ŞÄğ¨Ċ·¤½œµli³Z\ĥXZ¸Y[½T[ĵS[şT[şV]şV]ĥW]ħTYWYŻb]µldĵheż_b[_ĵV\½RZĥNWĞJSħKTĵU\V]S[ĵR[ğR[·NX²OXŻRZħPXħNW´QYµQYµT[·lişƒxĵ•†Àݗĵ Çş¤È½ĤÉżŞÌË­ɿİĈĵĤËÀĞÍŻÎĊ°ÎĊŻÏĈħȳDzÏĈħĈŻ~hQ…mT†nT„lR†lQ…iP†kR‚jQ‹nU‰lR„jQhR‰mUŽsX˜|^‘vZ‡oVƒnUjS‹pUŽrW‘uX”wZ˜|^”x\‘v[”z_”z`“{cšišjž…mĦˆo£‹r˘ŠqĦ‰qĦŠqĦ‹rĦ‹sŸ‰r†p˘xŞ—‚°ŸŒĥ§”·İ–·Ş–ĵݜĵŻÀ³£À´£ğœ´Ĥ“²˘ˆšƒĴ–~Ĥz˘Œvžˆr˘ŒvĦ‰sŸˆrŸˆsž†q™l˜k™‚m…nž†n„n™€i›€hšjž„mž„l˜~gŸ„kŸ…i›‚e˜~d™~d™}d’v_ŠoY‹pY‹pZ…lViT{fRpaMf]Hf\GbXE\VB[UBYSA[UC\VD^WF^WF\UEYTDYUD`ZH`YHa[IgaLjdOfaMd_Lb]Jc\Ib[H`XEc[FibMocP‰wbİ™¸Ğ”ıÄğĤÄğĤşğĤĊĵ¨Ċĵ¨ÄğĤĊĵĤÂı£ż·˘ĥ˘Áı¤À·˘ĵµ ­¨•–“‚vvg`dTT[JR_ISbHPbFMbENcEMbELaDI^BI\BGX@ET>GU@GRBNXH]eUqveŒŽz¤Žµ²œı´ŸżıĈŞĈŞĊĵ§ÄğĊĵ¨Ċĵ¨Ċ½ŞĊĵİĈğ¨Á­œ³‡{ŞfcŻZ\´W[·Y\¸TZıSZĵT]ĵU]½W^ıU\²V\ŻW[Z[´\^¸\_¸Y]¸X]ıV\¸S[ħPWĴOWĥac·`c²PYŻKULVİKTŞNVŻQYNVħOW·T[´U[³_aĵ‚x˘Ċ°šÈı¤ËżİÌÁĴÍÌÌÊÀĞĈş¤Ä·ĦĈş¤ÉİÌÎĈħÏĈ²Ç²Ç²ÏĈ°ÎÄĴqhOtkQrlQtlQylRƒoT‡qV€mUˆqXŠpV‚kSxfQŠrZuZ–z]—|^’wZqWˆlToU‰kSŽpV’uY•x\–y[“wY“v[‘uZtZ‘u[u[–{`›c—}b”z`v^‘v]“x^‘v^u^s]u]”{cšƒk†nŸ‰qžˆpŸˆqž‰sĦŒwy‡q–€j•}g•~hĦŠsžˆr”}f“zdu`•|f–|f“yd—|eš€h•zc•zd“yc–|eƒkƒmœƒj˘ˆmŸ†m–}g—~h“zd’ybŒu^‹u]ˆq[ƒmYzfRwcPwePwgQtgQmdMg_Jb\H^ZFZXE[XE[WDZWE]XH[VIYUI[WL^ZPa]Ue`XfcYif[rnavqcxtfzwiywjtqfspeli^ieZd_T_XNaYNi`VqeZ€p°’´ŸşÂı£Äğ§Ç½İĊĵ§Ċ½İĈŞĊĵ§Ċĵ§ş¤Áı£żĥ£ÂıÁ¸¤À·£À·£ğ³Ÿ³Ĵ™¤ Šˆupr_]bQSZJNVFMUEKTDJUDHPAGPAJSCPZH^jSmv^ƒ…p ŠĴ§”µŻ›ĵµĦÀıÂğ§ĊŞĈżĞÇżŞÄğĊĵ§Ċĵ¨Ċĵ¨ĊĵŞĈĴĈ½ĞÄ·ĤÀĤ—·{uħY]µTZ·V[¸X\ğV\V_żW`żV^ĵT]ıU\ĥT[²U[°U[°TY´RY¸T\şU\·SZħPWU[µ[`ĥT\³PZ³PYĥQZµR[ħX^°]aĴQXħU[²\_²eeğ€xÂĦŽĈħ˜È¸ŸÊ½ĤÎÂĴÏĊ°ÑÈ´ÏĈħÍʨ´œĵݐ¸Œ–Ƚ§ÎĊħÏĈ³Ç³ÑɴȲÎÄ­deLdeLcfLdfKeeJjfMqgNi`KugO~nSwiRg]LygS†pVŽvZ‘x[uYŒqVrW‰nT†jR‹oUŠnT‡lSŽrVtX’vZrXqXŽrY’w]š~bž‚eš~b—|`•z^“w\u[‹pX†mW‹qY‹qYŽt]‘xa‘xa‘w_“y`’y`Žv_xa˜}e—}d’zbu_Žwb—€jš…o’{e’zcwa–|c“xav`w`”zcu_’yb“yb–}d•}e“{e’zdxc†q^mYzkWtgSsgRlbMkbMg_Kg`Kf`Jg^JldMmfOkdNfbM`]I_\I][I][I[YK[XL]ZQfbZokcxuk‡‚v‘‹}˜’ƒĦš‹ĤŸŽİĦŻ§”³Ğ˜³Ğ˜²Ğ˜²Ğ™ħŞ™­Ĥ•ĤžĤžŽ¤œŒœ”…—Ž€wjpg]‚zo“żĥĦĊĵĤĊĵĤĊğĤǽİÄğĤğ§Ċ½ŞÇżĞÈżŞĈ¨Ċĵ§ğ§ğ§ÂşĤÂıÁı¤ğĤğ§À¸ĥŻ›ĴĤ’œ˜‹Šr|~guxbqv_rx_qy_t~a{†g‰q› ƒĴĞ’´Żšĵµ˘ĥ˘ÁıÄĵ¨Ċ½İĈŞÇżĞÇżĴÉÁĊ½İş§ğĤş§ÄĵŞÄ½ĞĊ½ĴǽĞĊ°ŸÁƒ|şef·]aıW]ıW]ĵW^W_ÀYaÁX_ÁX`ÀX`½W_·T\µS[ħU[ħPXµRZ´NWħMU­LTNV²OW´NW·PYıPZşR[ğU]ĥ[aĥcfĥac·kjşƒy½“„ÀĤ’ǵĈĥ›Éğ£ÌżİÏÄDzÑÈ´ÏĈ²ÊżŞĊĥž½ŞµŸ„ħš}¸£‡Ä´šÍ­ÑÈ´ÒÊĥÓË·ÑȳÏĊ­_aK_aJ_bJ\`I[_G^_H^_HXYEUVC`_HdaI\ZGXTEe^KthQ~pUƒsW‚pT‡sV…oThPjQlR~iP‚lS„nT…oU…mT‰pWŒtZ•|_–{_”y^“x]‘v\”y]‘v[ŠpX†kU‰oWu\v]v]w_t]t\’x^‘w^“y_w^‘w`”{b–g‘zcybzd“~hycŽwa‹t^xa‹u_…q[„r[‚q\|kW€nZ†s_ˆu_‚q\zlXthTqeRk`OmcPldPkdPidPidPigQcdPbcOcaOc`PeaQhbSh`Re_R`ZP_ZQb^Ukg]soe|q•ށĤŸŻ§–´­›ıħŸğ²Ÿ½´Ħĥ£ĥ˘½´ µĦÀ·£À·£ż·˘À·£ż·£½´ şħĵ³ ĵ³ ·›ı°œ´Ş—İŸ§Œ¸›Àĥ˘ĊğĤĈ½§ı£Ċĵ§Äğ§ğ§Ĉ½ŞÉÀ­ËŻĈİğĊ½¨Äğ¨Äğ§Äğ§ğĤĈĞĈżĴĊĵ¨ż·˘ż·£ĵµ ı³žĥħ´Ż›ħ­—Ż­–°–­Ğ“Ğ”µħšĵ·ĦÀşĤÁıĤÀ¸ÂıĤĊĵİÄĵ¨Äĵ¨ĈĞĊĵİĊĵİÇżĞĊ½Şş§şĤÄĵ¨Çż­ÈÁŻÈÀŻÊÀÊş¨ĊœÂŒƒżŠ‚şmlĥ^aıZ_½Y`ÀZbÁYaÁZaÁYażX`µU]³U\²S[ĥRZ¸QZĥOXĥNW´NV³NVĥOW·NX·PY·S[·X^ı`d½poż€yż‡}•†˘ŽÁ­–Ĉ¸Ħ˧Éĵ˘ÌżİέĊ°ÏĈ²Ç³ÎÈĵ§Äµĵސ¸£ˆħ›·˘„Âħ–ÍÂĞÒÉ´ÓË·Ô̸ÑÉ´ÏĊZYNXXLWXKTWHRVFRVFSVFQRBJL?QSBWYEZZG[ZG][HdaKfcLeaKicKlcLlcLjcLkcLjdLjbKnfNqjQrjQqiPvlSulSzqW~sY‚sY‚rX…sY…tY…rW€nUkS‚mUˆtZ‰tZ„oW…nX„nY†oY‡pZ‰r[y^Št\‰r[‹v^zbˆv_„t`†xcv`|r]}p\|q[s[{oYyoXwmWujVqfRrgUwmYwmXriVldSg`Og_Ng`QifUhdThdVcaTdaVdaVc`VdcYjh^ig_mkcqnfxsj€|pƒ~sŒ‡zž˜‰Ğ¤“²Ğ™·Żğ´ĦÀ¸ğ¨ğ§Äĵ¨Ċĵ¨ĈĞÄĵ§şĤÁı¤şĤÄĵ¨Ċĵ§Ċ½İÄğ¨À·£À·˘żĥĦµĦ½´Ħ½´ À·˘ÀĥĦĵ³Ÿğ²žżĥ˘şÇ¨Ç¨Á¸˘ÄşĊĵ¨Ċĵ¨Ċ½¨ÈÀ­ÉÁ­ĈİĊĵ§Ċĵ¨Äğ§Äğ¨Ċĵ¨Ĉ½İÈÀ­ÈÀÇżĞĊĵ¨Ċ½ŞÄĵ¨Ċ½ŞÄ½Ş½ŞÂğ¨ÀşĤÁğ§ÀşĤÀıÁşĤÁşĤÁş§Âş§ş§Äğ§ÇżĞÇżĞÇżĞÇŞÂıĤÄĵ¨ĈĞÇżĴÇżĞÇżŞĈŞÇżĴÇÀʰ˰ȽŞĊ³ĦÄŻžŻÁ£”ĵƒ¸uq¸egğ`dĵ^bĵ\a½[aĵY_ıZ_şZ`ıW]şV\ĵS\şQZ·NX·NW·OXĥPXĥSZ¸[_½iiżyuÁ†ĈĤ–ɲ Ĉ²žħ›ÄµžĈı˘Êż¨ÎĴÍÁŞÍ­ͯÎÄŻÍİÎĊ°Í­ÇĵÀħ™·ĥ˘ˆş¨Á°˜ÉĵÇħÓË·Ô̸Ġ͸ÒʵÑÇħ‘‹{Š…u€|musdkj^edX\\QVUKPOFNMCMMCOOEQRGSTGSTESREPNBQOBUSDYVF[YG]ZH_]Jb_JecLgdMhdMheNlgPjeOjgQnjTrkTrkSsjSrhRrhQqgOmbMmdNlfOlePkdOmfQpiSpgRpfRtkVsjTtkUvlWzq[|s\wq\up\wq^wp^tmZtlZwo\xp\unZuo[slYskZphXohZqk^qk^oj]ni]kf[ke[nh^qmcuqh~{p}zp…€uŠ{™“„Ħ›‹Ÿ šŒŸĴĤ•³Ğ™¸Żœ¸Żœğ²ž½´Ħż·¤ÂıĤÂşĤğ¨ĈŞĈ½İÇżĴÉÁĊĵİĈĞĊĵİĊĵ§Ċĵ§ĈİÇĞÇŞÇżĞĊĵ¨Äğ§Ċĵ¨Ĉ½İşżĥĦÁ¸˘ı£ÁĥĦżĥ Àĥ˘ÂıĈ½İÉÀĞÈżŞÄşÂı¤Äğ¨ÂşĤğĤÇŞÉÁ­ÈżĞÈżŞÇŞĊ½İĈ½İĈ½ŞĊĵ§Ĉ½ŞÇżĴĈĞÄĵİğİĊĵŞÇÀ­ĈżĴĊĴĊĞÇÀĴÈÀĴÄĵ¨ğ¨Äĵ¨ğ§Âş§ÄĵŞĊ½ŞÄĵİÈÀ­ÇżĞÈÀ­ÉÁ­ÇŞĈŞĈĞÈÀ­ÊÁ­ÊÁ­ÈżĴÈż­ÈÀÉÁŻÈÀ­ÇŞĈğ§ĊıĤĈş§Äĥ£² Şšż™ŒÀЁ½|vğrnĵpmğml¸gg·cdşeeğdeşZ_ĥT\¸T\·T[ĥU[ĥ[_¸ffĵ‚yÀš‹Â¨–ǵ˘Ë½ŞÌÀĴÊżŞÊżİËÀİÊżİÌÂĴÏĈ°ÎÄŻÍ¯ͰÌË­Ì­ËÀĴĊ¸˘ı¨İ•}Ğ—~ż²›É½§ÏĊ°ÒÊĥÔÍıĠ̸ĠÌ·ÔÌ·ÔÊ´³Ş˜²Ş—ħİ—§•Ф“ޤ’ž˜†Žˆw†€o{k{whvsdml_feX^_RTUJOPGPPFOOEPPERRFUVHWWIYVHZXJ_\Lb]Ld^MgaNhcPhdPlgRngRnhRmhSlgRnhRmhQneOjcNieOhePieQhdRieRjdQlgTpjWojWojWqlYto\so\so^tsaro_tqasp`urcvsd{vf{vgyvh{wi€zmˆy˜€š’ƒž—‡¤Ž£œİĦ‘°§–²Ş˜´Ğ™ĥş³£ğ´¤ı² ş²ŸµĦÁıÂş¨Áı¨Âşİğİğ¨Ċĵ§Ċĵ¨Ċĵ§Ċĵ¨ĈŞÈżĴÈÀ­ÇżĴÈÀ­ÈÀÉÁŻÉÁÇżĞÇżĴĊğ§Äĵ§Ċĵ¨Ĉ½ŞÈżĴÈżĴĊ½ŞÄğ§Ċ½İÈÀ­ÈżĴÄğ§Á·£Â¸ĦÁ· Â·ŸÂ· ı£Âı£Ç½¨ÉżŞÉÀĞÈżŞş§Ĉ½ŞÄĵ¨ğĤĊ½¨ÈżŞĈ½¨ÈÀĴÉÁÉÀĴÇĞÈÀĴÉÀĞ˯˰ÉÁÄĵİĊ½ĞÇż­Ê°Ê°ÈÀÇż­ËÄħÌIJÈÀÊÂŻÇżĴĈ½ŞĊ½İĊĵİĊ½ŞĈĞÇżĴĊ½İÊÂÉÁ­ĈĞĊĵİĈĞÇżĴÈÀ­ÉÁÉÁÊÁŻÈÀÉÁÇżĴÈżĴÊÀ­ÇŞĈĵ¨Ċş§Ĉğ¨ÇĵŞĊ·Çµ¤Ċ°ŸÄĴ›ÇœĊİ™ż·‚¸·‰}´uo²khµjh²lh²um²tµ‘½‘ijžÉğ§ÌÁĴÎÄŻÎÄŻÌ­ËÁĞÌ­Ì­Í­ÎĊ°ÎİÌÂͰÌ­ËÂĴÊÀĞÉżŞÁ³œħœƒ¤sħŸ‡ÇğĤÏĈħÑÉ´ÑÉĥÒË·ÓË·ÔÌ·Ġ̸ĠËĥ¸›¸›ĵ³ ½µĦżĥ£ĥ£¸Ż›´Ğ—°§“°¨”°¨–§•Ĵ“Ħ›ˆ–‘}‰†rl†„oƒ€l}{gzydwwbywduqani[ieXheWkiYigXhfXebUgdUjfVliXnkZol[uq]wq\zp[rkXpkXrmZsn\qn\wq`xrbxrc{j†q}yl„~p†r€{m€|o‰y•€›–…˜‡Ÿ›Š¤žŽĴĤ•³­œµ·°ž·Żı°żĥ£ğİÄĵĞĽĴÂşİğİÄĵİş¨Ċĵ¨ÈÁŻËijÇÀ°Âş¨ÂıĤÄşĤĈ½ŞĈ½ĞÈÀËħÉÁÈżĞÈÀĴÈżĴÈÀĴÇżĞÈÀĴÉÁ­ÉÁ­ÉÂŻÉÁŻÊ°˲ʰÉÁŻÉÁÇżĞĈŞĈŞÇŞĈĞÈÀĴÈÀ­ÉÁ­ÈÀĴÉÀ­ÇżĴĊĵ§Âı¤Äş¤ı˘Äı˘Ĉĵ¤Äı£Â¸˘Ĉ½¨ÉÀĞÈİı¤À·£Ĉ½ŞÇżĴÄğ§ĈİĈŞÂı¤ğĤÈÀ­Ë°ÊÁŻÉÁÌİÍİÎĈ³ÌÄħÊÂŻÉÁɯɰÈÁŻĈż­ÄĵİÇÀ­ÊħÈÁŻÈÁĊ½ŞĊĵİÄĵİÄĵ¨Ċ½ĞÉÀÉÁÈÀĴÊÁĊ½İÄğ¨Ĉ½ŞÄĵİÄĵİÈÀ­Ë°ËÂŻÊÁŻÊÁÉÁÉÀĴÊÁ­ËÂŻÊÁ­ÉĞĈĵ¨ÈżĞÊÁÉż­È½ŞÈĵ¨ÊİËŞË½İÉğĤĈĥ˘ÄħŸÁĴšĵ˘‘ıžŒşœŠ·›‰ıĦ½¨•²žÉĵ§Í­ÍÎÄŻÎĊŻÍÄËÂĴÌ­̭ËÂĴÌÂĴÍÄÎİÌÂÍŻÍÄŻÎÄŻËÁĴËÁ­Ä·˘³Ÿ†š€ż²ÍİÑɵÒÊĥÒÊĥÒË·ÓË·ÔË·ÔÌ·Ġ˷¸Á¸¤ğ¨ÇĞĊ½İÁ¸¤ĵ³Ÿğ²žµĦĥ˘½´£ż·ĤÀı§ğ³Ħ¸°Ż¨•ݍ•°Ş•Ş¤Ž¨˘Œ¨¤¨¤ŒŞĴ’Ş£‘§Ħ¨˘Ž¤ŸŠžš…œ˜ƒ˜”–“~•“}˜— ‰ œ‰ œ‰Ħ›ˆĦ›ˆœ•„œ–…Ħšˆ˘›‰¤ŒĴ¤”Ф”Ğ£“Ĵ£’µĴš´Ĵœş²Ħĵµ¤¸ħŸ·°·ħžğµ£żı¨ĵĴ½­ĵĴĈż°Ê³ÌĊµÊ²ÇżĴÄğİÉÁ˲ÌIJÊÂŻÈÀÈż­ÈÀ­ÉÀ­ÈĞʰËijÈÁ°ÈÀÇĞÇŞËħÊÂŻÌIJ̰ÊÀ­ÉÀĴÈÀĴÇĞÈżĴĈ½İÇżĞÇżĞÉÁ­ÉÁʯ˰ÊħÊħÊÂŻÊÂŻÈÀ­ÇÀ­ÉÀĴÈżĞĊ½İÈżĴÈżĴÇżĴĈŞĊĵ¨ÄĵİĊĵ¨şĤşÂ¸˘Äş£Äş¤Á¸£Âı¤ÇŞÈżĴÄğ§Á·˘şĤÊÁʰÈÀÉÁĈĞÄğĤĊ½¨ÉÁŻÍĊ³ÍĊ³ÌIJËÂŻÊÁÌÄħÌIJʰÊÂŻÉ¯ɰʰĈĴĊ½ŞÈÀÌĊ³É°ÊÂ°ÈżĴÈżĴÈÀ­ÈÀ­Èż­Ê°ÈÀ­ÇżĴĈĞÄğ¨Äğ¨ĈĴÇż­ÈÀ­ÊÂŻËħÊÂħËħ˰̰ÉÀĴËÂÌ°ÌŻÉżĴĈ½¨ÉÀĴ̰ËÂŻÊÀĴÊÀĴÌÁ­Ì­ÍÍÂËÀ­È½İɽİÉĵİÉĵ¨ÉğĤÉğĤÉĵ§ÊŞÌÁĴÏĊŻĈħÎĊ°ÍÄŻÎĊ°ÍÄÍÄËÂĴËÂĴÌÍÄÍÄŻÏĊħÍŻÌÂÍÄŻÍÄŻÍŻËÂŻÇ½¨żħœ½Ż™ÈŞÈ´ÑÉĥÒÊĥȴɵÒË·ÔÌ·ÓËĥÔËĥÂıÂığ¨ÇĞĈ½İÂıÀ¸¤ÂıĤğ¨Âı§Âı¨ÇżĈ­Âş¨Âı§żĥ¤ż·¤ĥ˘ğ³Ÿş²Ÿş³ ı²žş³ ż¸Ĥż¸Ĥ½ĥ¤½ĥ¤·¤·£ż¸ğ´Ħğ´ ş´ĦğµĦĵĥ£¸¤ż¸ż¸Áı§ĥ½µ£ĥ£ĥ¤À¸§ÄğŞşİÂş§Ċĵ¨ÈżĴÈÀÉÁ°ÉÁŻÉÁÉÁ­É°ÊijɳÌĈµÍÇ·ÌĊµÉıÑÊşÉ¸ÏÇĥʰĈĞÊÁŻËħÍÄ²ËŻË°ÊÂŻÉÀÉÀÇĞÈÀÈÁ°ĈżÇĴĈŞÈżĞ˰ËħÍĊ³ËħÉÀ­ÇŞĈ½İĈ½ŞÈżĞÈżŞÌÊÂÈÀ­ÇżĴÈÁɰÊħʲʰÇÀĴÈÁ­ÊÂŻÌİËÂÇĞĊ½ŞÄĵİĈ½ĞĊ½ŞĊ½İÄğ§ÇżĞĈŞÄğ§Âı¤ı£Ç½¨Ĉ½¨ÂşĤÄğ§Ĉ½İĊ½İĈĵ¨ÈżĞ˰ÌÄħÉÁʯ˰ÇÀĞÉÁ­ËÄħÍĊ³ÌĊ³ÍĈ´ÌIJÍĊ³ÍĊ³ÌIJÊħÉÁ°ËIJÈÀÉÁŻĊĞÇżĴÉÁŻÊ°ÈÁÉÁÇĞÈÀ­ÈÀ­ĈĞÈżĴÉÁŻÉÁÈÀ­ÇżĴÄĵİğ¨Ċ½ĞÇÀ­ÈÀ­ÉÁ°Ëij˲ÉÁŻÉÁŻÌ°ÊÁËÁ­ÌÂŻÌŻÈŞĊĵ§ÉÀĴÌ°Ì°ÌŻÍİÍÄŻÌÎĊħÇ´ÏÇ´ÍÄħÎİÏĊ²ÏĊ²ËÁ­ÌÁĴËÁĞÍÂĴÏĊ°ÇħÑȳÏĈħÎĊ°ÏĊħÎĊŻÍÄËÂĴË­ÎĊ°ÎĊ°ÎĊħÏĊħͰËÂÌŻÌÌÌİÉÁ­ÈżĞÈŞÌ°ÏĈ³È´È´ÏDzÎDzÑÊĥÔ̸ÓËĥÒɳÀ¸şĤĈ½ŞÉÁŻÊÂŻÈż­ÈżÉÁŻÇĴÇż­Çż­ÊÂħÉÁ°ÉÁ°ÈÀĊ½ĴÄĵŞğ¨À¸Á¸ĤÀ¸ĤÀ·¤ÁıĤÄĵŞĊ½ĞĈż­ÇÀÈÀŻÈÁÈÁĊ½ŞĊĞÄĵŞĊĴĊĴĈżÈÁŻĈżĴĈĞÇż­ĈĞğİĊ½ĞÉÁŻÉÀŻÈÀ­ÈÀ­ÉÀ­Ë°Ê°ÊÁ°Ëħ˲ÌĊ²ÎĈµÌĊµÍĊµÎÇĥÍĈµÍĈ´É¸ÒËşÓËğÏǵÍĊ²Ê°ÍĊ´ÍĊ³ÌIJÊÁÉÁ°Ê°ËħʰÉÁ°ËijʳÈÀŻĈĴÇĴÉÁÌħÌħ˰ÉÁÈżĴÈżĴÈżĞÉÁ­ÊÁ­ÉÁ­ËÂÉÁÊÂÈż­É°ËijËIJÌĊ´ÌĊ²ÈÀ­ÈÀ­ÉÀ­ÊÁ­ÉÁĴÈÀĞÇĞĈ½ĞĈ½ĞÄĵİĈŞÇżĞÇżĞÇŞĊĵ¨Âı£Âı¤Ĉ½¨ÈżŞÂş§Ċ½ŞĈĞĈĞÇżĞÉÀĴÊÂŻÌĊ²Ê°ÉÁË°ÊŻÊ°ÌĊ²ÍĈ´ÏǵÏǵÎÇ´ÈĥÑÊ·ÍĊ³ÉÁŻÈÁŻÈÁ°ÇżÇÀÇÀÇż­ÉÁŻËIJʰÊÂŻÇżĴÇĴÇżĴÄĵİÇĞʰËħËÂŻÉÁÇżĴÄĵŞÇż­Çż­ÇżĴÈÁŻÊÂħʰÉÁŻÊ°̰ÌÂÊÁĴËÁĴËÂÈŞÈŞÊÁ­Ì°ÎĊħÍİÎĊħÍİÍİÏĈ²Ç´Ç´Ç´Ç³Ç´ÑɵÎĊħÎÄŻÌÂĴÍ­ĈŻÇħDzDzÏĈħÍİÊÁĴÊÂĴÌ­ÍÄŻÎĈħÏĈħÏĈħÎĊħÎÄħÎÄħÎĊ°ÎÄŻÏĊħÏdzÏȵÎĈ³ÍĊ²ÍĊħÎĈ²ÏdzÑɵÑɵÑɵÑʵÔ̸ÓËĥÓÉħÄğİÈż­Ë°ÎĈµÍĊ´Ê²Ë³ÌÄ´ÌÄ´ÍĊµÎĈµÎÇĥʲ˳ËħʰÉÁ°Çżş¨Âş¨ğİĊ½ŞÈÀĴÉÁŻÈÁŻÈÀÈÁŻËIJ˲ʰɰʰÉÁŻÉÁŻÉÁŻÊÂħÌĊ´Ê°ÉÁÊÁŻÊÁÈż­ÈÀ­ÌÄħËħÊÂŻËŻÍÄħÎĈ²ËħÎĈµÎǵÍĊ³ÎÇĥɸÎÇĥÍĈ´ÌĊ´ËijÍĈµÑÊşÒËşÑÊıÌijÍĊ´Ë²ÌijÍĊ´ËħÊÁŻÉÁ°Ë²ÌĊ´Ê²Ê²ÌĴʲÉÁ°ÈÀŻËħÌIJ˲˰ÉÁŻÉÁŻÈżĴÈżĴÊÁÊÂ˯˰ÌÄħ˰ÌİÉÂʰËIJÌĊ³ÌijÌIJËħÉÁÊÁÉÁ­ÈÀĴÈżĴÇżĞĊĵİÇĴÈżĴÇĞÉÀĴÉÀĴÇŞĊ½¨şĤşĈİÇżŞĈĞÈÀÉÁŻÉÁŻÉÁ˰ʰÌIJʰÊÁÌÄħÎĈ´ÍĈ³ÌIJÍĊ³ÎĈµÌijÍĊ³ËIJÍĈ´É°ÈÀŻÉ°É°É°É°ÊħÈÁŻÊħËIJɰÉÁŻÈÀ­Èż­ĈĞÇżĴʰÌijÌÄħÊÂŻÈÀ­ÇżĴÇżĴÈżÄĵŞÇż­ÉÁ°ÉÂħÉÁŻÉÁ˰̰ÍÂÎÄŻÌÂ­ÈżĞĊĵ§Ĉĵ¨ÈżĞÊÁĴÌŻÌŻÍİÎĊħÎĈħDzȴÑȵÑɵÑÈ´ÑȵÒÉĥÏĈ³ÏĊħÎÄÎÄ­ÏÄÏĈŻÇ²ÑȳÏĈħÍİÍÄŻÍĊ°ÌÌÏDzdzÏĈħÍİÍÄħÎIJÎĊ²ÏĈ²ÑɵÓ˸ÓËıÑÉ·ÎĈ²ËŻÌŻÎĈħÏDzȴȳȳÒʵÒÊĥÓɳÈÀŻË³ËijÍĈµÎÇ·ÏÇĥÎĈĥÏǸÌĊĥÍĊµÎÇ·ÏÈ·ÌĊµÎÇĥÎĈµÍĊ´ËijʰĈ½ĞĊĵŞĈ½ĞÈżĴÊÁŻÈÀÈÀÉÁŻÊ°ÊħÉÁŻÊ°ÊÂħ˲ÉÁŻÈÀŻÊÂħÌĊ³ÍĊ´É°ÉÀËÂŻÉÁÊÁÉÁÍĊ³ÎĈ´ÎĈ´ÈµÈĥÑʸÑʸÑʸÑʸÎĈ´ÌĊ´ÏÇ·ÊıɸÏȸÉıÑÊğÓ̽ÒËğÓËğȸȸÌijÍĈµÍĈµÍĊ³Ê°ÌIJÎǵÎĈµÌÄ´ÌÄ´ÌĊµÉÂħÉÁ°ÊÂħÍĈµÎÇĥÎĈµÍijʰÊÁŻÈÀ­ÉÁ­ÊÂÊÁÊÁÌIJÌÄħʰÌÄħÌÄħ˰ÍĊ²ÌIJ˲ʰËħÊÁÉÀĴÉÀ­ÉÁÊÁŻÉÁŻÇż­ÇĴĈĞĈİÈżŞÇ¨Ċĵ§ÄşĤÄğĤĊĵ¨ÇİÇŞÇżĴĊ½ĞÇĴÈÀ­ÉÂŻÍĊ²ËÄħÌÄħÉÁŻÊÂŻÌIJÎÇ´ÍĊ³Ê°ËIJÍĈµÎÇĥÍĈ³ÌIJÎĈµÍĊµËijËij˳ÉÂħÊÂħÉÂħÇÀŻÈÁ°ËIJ˲ÊħʰÈÀ­ÈÀ­Çż­ÈÀËħÉÁÉÁÈÀÉÀĈĴĈ½ĴĊĵŞÇżĴÊÂħËIJÌÄ²Ë°Ë°ÌŻÌÂÍŻÌÈżŞÇ½İĈĵ¨Ĉĵ§ÈżŞËÁĴÍÍÄħÏÇ´ÎĈ²ÏĈħÏĈ²ÑɵÒÉĥǵÏĈ³È´ÑÈ´ÒȳÑDzĈ°ĈŻĈŻÏĈ°ÏĈħDzÎĊ°ÎĊ°ÍÄÌÄÍĊ°Ç³Ç³ÏĈħÍḬ̇ÍÄħÏĈ²Ç³ÒÊĥÒË·ÉĥÈĥÏdzÎĈħÎĊ°ÏĈ²Ç³È´ÒÊĥÑÉ´ÒÊ´ÒʵÒȳɲËÄ´ËÄ´ÎÇ·ÏȸÒÊıÎÇ·ÍĈ¸ÍĈ¸ÎȸÈıÏȸÌĊµÍĈ·ÍĊĥÌĊĥËijËħÈÀÈÀÉÁŻË°ÌIJʰǿ­ÇżĴ˰ÍĊ³ÉÁŻÉÁÊÂŻËÄħÌijËIJÌIJÌijʰÈÁÉÀ˰ÌÄħÊÂŻÍĊ³ÈĥÉ·ÑÉ·ÔÍğĠνÔÌşÓËşÑʸÑÉ·ÈĥÏǵÎÇĥÉıÏɸÑËğÓÍÓÌĵÔÍÓÌĵÑÊşÎÇĥÏÈ·ÍĊ´ÎĈĥÏÈ·ÍĈµÍĈ´É¸ÉıÎÇ·ÎÇ·ÌĊĥÌĊĥÌĊµÊħ˲ÏÇĥÏɸÏÈĥÎĈ´Ê°ÊÂŻÉÂŻË°Ë°Ì°ÌİËÂŻÌÄħËÄħÌÄħÌÄħÌÄħÎĈ³ÍĊ²ÌĊ²ÊħÉÁÈÀ­ÉÁ­ÉÁŻÊÂŻÈÀ­ÈÀĴĈĴĈż­ÈÀĴÈÀĞÇİĈ½§ĊğĤÂı¤şĤĊĵ¨Ċĵ¨Äğ§ĈĞÇżĴÉÁÊÂŻÍĊ²ÎĈ³ÌİÌİʯ˰ÍĈ³ÏȵÍĊ²ËÄħÍĈ³ÌĊ´ÎǵÍĊ³ÍĊ³ÏÈ·ÏÈĥÍĈµÉ²ÈÁŻÈÁ°É°ÈÁŻÇÀÈÁŻÉÂħʲÉÁŻÈÀÈÀʰ˲ÍĊ´ÌIJÈÁÈÁÉÁĈĞÇż­ÈÀĈĞÈÀ­ÊħÍĈ´ÍĊ³ÏǵÎĈ³ÌŻË­ÌÂËÁĴÊÀĴÊÁĴÊÁĴÉÀĞÉÀĴÊÁĴÍ­ÌÄŻÌÄħÎĈ²ÎĊħÏĈ²ÏĈ³È´Ç´Ç³ÑɵÒÉ´ÑȳÒȳÓɳÒÈħÒɲÑȲDzÏĈħÎĊħÏĈħÏĈħÏĈħȳȴÑȳDzǴÍIJÍĊ²È´ÈµÏÇ´È´È´ÉĥÑɵÑɵÏĈ²ÎĈ²Ç³È³ÒÊĥÒÊĥÑÉ´ÑȲÓɳÌĊĥËĵÌĊµÎĈĥȸÉıÍĈ·ÍĈ¸ÌĊ·ÎǸÏÈıÎĈ·ÍĈĥÎÇ·ÌĵËĵ˴ÌÄ´ÊÁ°ÉÁ°ËIJʲ˲˲ÊÂħÉÁÍĊ³ÏÇ´ÌŻÊÁ­Ê°ÎĈ´ÎǵÎĈµÌÄħÌIJʰÌÄħÏdzÏĈ´ÏÇ´ÎĊ²ÈĥÒÊıÖÎĠͽÔÍĵ׿ĠÍĵÑɸÏÇ´ÈĥÉ·É·ÏÈ·ÉıÏȸÉıÒ̽ÔÍżÔÍÒËĵÑÊşÏÇĥÏÈ·ÎĈµÍĈĥÎǸÏȸÏÈ·ÉıÑÊıɸÎÇĥÌÄ´ÍĊµÍĈµË²ÌĊ´ÎĈµÍĈµËijÊħÉÁŻËħËħʰËħÌÄħÍÄħÊÂŻÌÄħÍĊ²ÌÄħ˰ÌÄħÊÂŻÊÂŻÊ°ÉÁÉÀ­ÊÁŻÊÂŻÈÀĴÉÁÈżĴÈżĞĊ½ĞÇż­Çż­ÇĞÇĞĊ½¨Á¸¤À·£şĊĵ§Ċĵ§ÄğĤÇŞÊÁÉÁÉÁ­ÌİÍĊ²ÌİÌİ˰˯ÌĊ²ÍĈ³ÍĈ³ÌĊ³ÍĊ³ÏÈĥÒÊıÉ·ÍĈµÎǵÍĊ´ÍĊµÉÂ²Çż­ÈÁŻÇżĴÇż­É°ÊħÌĊ´ÍĈµÌĊ´ÌĊ´ÍĊ´ÎǵÍĊ´ÏǵÎĈ´ËÄħÊÂŻËħÉÁŻÉÁŻÉÁŻÉÁÉÁËIJÎĈ´ÍĈ´ÎĈ´ÌŻËÂÌÂÌÂËÀĴÊÀĴÌŻÌÄħÎĈ²ÎĊ²ÍĊ²ÎĊħÏĈ²ÎĈ³ÏĈ´ÎĊħÎĊħÏĊ²Ç´ÑȵÏĈ²Ç³ĈħĈħÒÇħÒDzĈħÒɳÔË·ÑÉ´ÏĈ²ÏĈħÏĈħÏĈ°ÏĈħÈ´ÑɵÑɵȴǴÎĊ³ÏĈ´Ç´ÏdzÏǴȴɵÑÊĥÒË·Ò˷ȵÏdzÏĈ²ÏDzȳȴDzÏĈħÒȲÎĈ·ÍĈ·ËĵÌĊĥÏÈıÉşÍĈ·ËÄĥÍĈ¸ÍĈ¸ÍĈ·ÌĊĥÍĊĥÍĈĥÍĈĥÌĊĥÍĊĥÎǷʲ˲ÍĈ´ÍĈ´ÎĈµÎÇĥÏÇĥÏǵÎĈ´ÎĈ´ÌIJÎĈ³ÎĈ´È·ÑɸÎĈµÏǵɷÏĈ²ÏĈ³ÎĊ²ÎĊ³ÏĈµÑÉ·ÓËşÖÎĜÑÁĜÑÀÖÎÖνÔÌğÓËıÈĥÉ·ÑʸÑÊıÑÊıÉıÎÇ·ÊşÔÍĠÎżÔ̽ȸÑÊşÈ¸É¸ÑÊşÒËğÑÊğÊşÏȸÏȸȸÍĈĥÌijÌijÌĊ´ÎĈĥÎǵÏÈ·ÏÈ·ÍĊ´ÍĈµÍIJ˰ÍijÌIJʰÉÁŻË°ËÂÉÁËħ˰ÌIJʰÊÂŻÊÂŻÊÂÉÁ­ÉÁ­ÇżĞÇĴÉÁ­ÇżĞĊ½İÇŞÇżĞĈĞÄĵŞĊ½ŞÇżĴĈĞĊĵİÂıÁ¸£Âı¤şÂı¤À·˘Äğ§ĈŞĈ½İÈÀĴÌİÌÄħÌİÊÂÊÂŻÊ°ËÄħÎǵÍĈ´ËÄħÌÄħÍĊ³É·ÒÊıÏÈ·ÎĈµÊħ˲ÌÄ³Çż­ÇÀĈĴÇż­É°ÊħÍĊ´ÍĈĥËÄ´ÌĊ´ÍĈµÍĈ´ÍĊ³ÍĊ´ÍĊ³ÉÁŻÊÂŻÊÂŻÇÀʰɰÌÄħÌIJÍĊ³ÍĊ³ÎĈ´ÎĊ´ÍİËÁ­ÍÌÂÊÀĴÊÁ­ËŻÎĈ´ÈĥȵÑÉĥÑÉĥȵÏÇ´ÑÉĥÇ´ÏdzÏĈ²ÏĈ²ÏĈ³ÎĊħÎÄŻÌ­ÏĊŻÑĈħÑĈ°ÑĈħÑȳÔË·ÑɵȳDzdzDzÏĈħÈ´ÑÈ´ÑÈ´ÏDzÏĊ²ÎÄħÎĊ³ÏĈ²ÏdzÏǴɵÑÉĥÑÉĥÓË·Ó˸ÑÉĥȳÎĊŻÏĈ°Ç²ÑȳȲÑɳÓÉ´ÎĈ·ÍĈĥÌĊĥ˵ÈıÎĈ·ËµËÄĥÎÇıÏÈşÍĊ·ÎÇ·ÏÈıÏÉıÌĊĥÊĵÌĊĥÌĊ´ÊÁħÊÂħÍĊ³ÎĈ´ÎÇĥÍĊ´ÎĈµÉ¸ÈĥÎĈ³ÎǵÒʸÒʸȷȷÏÇĥÑɸÑÉĥÊÁ̰ÎİÏĈ³ÑÉ·ÒɸĠͽÖͽÖÎ×Ïż×żĠνÒËıÓÌğÒËıÑÊıÒËıÑÊıÓÌğÊşËğÓ̽ÒËğÓÌĵÑÊğÎÇ·ÎǷɸɸÒËğÔÍÑÊğÒËĵÏȸÍĈĥÏÈ·ÍĊ´ÍIJÍIJÏÇĥÈ·É·ÑʸÒʸÏÇĥÊÂħÌħÊÂŻÍÄħÍĊ²ÌIJÇÀʰÌİÊÂŻËŻÇİÉÁ­Ê°Ë°ÉÁŻÉÁÇżĴÇĞÇİÈżŞÉİÇİǨĈ½¨Ĉ½İÄĵ¨ÄğİÂıĤÄğ§Äĵ¨ÁıÁ¸¤Äĵ§ş¤ş¤Âı¤À¸£ÂşĤĈŞÄğ§ĈĞÉÁ­ÊÂ­ÌŻËŻË°Ë°É°ÌĊ²ÌĊ³ÌĊ²ÌĈ³ÎǵȷÓËşÒËşÑÉ·ÎĈ³ÏÇ´ÏÇĥʰÌIJÊÂŻÈÀ­Ê°ÊħÌĊ³ÍĈµÍĈĥÍĈµÍĊ´ËIJÊħÍĊ´Ë²É°ÉÁŻÈż­ÈżĈ½ĞÉÀÌÄħÌIJÎĈ´ÎÇ´ÍĈ´ÎĈ³ÎŻÊŞËÀĴÉÀĴÊÁ­ÍĊħÑɵÏÈĥÏǵÏÇ´ÑÉĥÒʸȵÏȵÒÊ·ÑȵÑÈĥÇ´ÏdzdzÎÄŻÍÌÂĞÎÄÑÇħÑĈ°ÏĊ°ÑȵÔ̸ÓËĥÑɴdzÑȳDzÏDzÎÄÌ­ÎİĈ²ÏĊħÎĊħÎIJÏĈ³È´ÈµÈĥÑÉĥÑÉĥÓË·ÔÌıÓË·ÒɵDzDzÒɳÒʵÑȳÔʵĠʵ ä‚ê[X[[ĝ[gamera-3.3.3/gamera/toolkit.py0000644000076500000000000000260611652050143015236 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from gamera.gui import has_gui if has_gui.has_gui: from gamera.gui import gui CustomMenu = gui.CustomMenu from gamera.gui import icon_display CustomIcon = icon_display.CustomIcon else: class NullClass: def __init__(self, *args, **kwargs): pass class CustomMenu(NullClass): pass class CustomIcon(NullClass): def register(cls, *args, **kwargs): pass register = classmethod(register) __all__ = "CustomMenu CustomIcon".split() gamera-3.3.3/gamera/toolkits/0000755000076500000000000000000011755376174015066 5ustar chriswheelgamera-3.3.3/gamera/toolkits/__init__.py0000644000076500000000000000000010714675714017161 0ustar chriswheelgamera-3.3.3/gamera/util.py0000644000076500000000000004601211652050143014525 0ustar chriswheel# -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # from __future__ import generators import string, sys, traceback, re, warnings ## Python standard from types import * from math import pow from gamera.enums import * from gamera.gui import has_gui from gamera.config import config from gamera.backport import sets, textwrap config.add_option( "-p", "--progress-bar", action="store_true", help="[console] Display textual progress bars on stdout") def is_sequence(obj): "Check if an object is a sequence." return type(obj) in (list, tuple) def make_sequence(obj): "Make an object into a sequence if it isn't one." if not is_sequence(obj): return [obj] return obj def is_image_list(l): from gamera.core import ImageBase if not is_sequence(l): return False for image in l: if not isinstance(image, ImageBase): return False return True def is_string_or_unicode(s): return type(s) in (StringType, UnicodeType) def is_homogeneous_image_list(l): "Determines if a list contains only images of the same pixel type" from gamera.core import ImageBase if (not is_sequence(l)) or (not isinstance(l[0], ImageBase)): return False pixel_type = l[0].data.pixel_type for image in l[1:]: if (not isinstance(image, ImageBase) or image.data.pixel_type != pixel_type): return False return True def is_homogenous_list(l, t): if not is_sequence(l): return False for e in l: if type(e) not in t: return False return True def is_string_or_unicode_list(l): return is_homogenous_list(l, (StringType, UnicodeType)) def replace_prefix(s, a, b): "replaces the prefix a in s with b" if s.startswith(a): return b + s[len(a):] else: return s def fast_cmp(x, y): "Fast sorting on pre-cached values" return cmp(x.sort_cache, y.sort_cache) def rangeeq(a, b, range, mod = 0): """Returns true if the difference of *a* and *b* is within a given *range*. If *mod* is given, than the difference is always considered less than *mod*.""" if mod == 0: return abs(b - a) <= range else: return min((b - a) % mod, (a - b) % mod) <= range def constains_instance(gl, klass): """Returns true if list *gl* contains an instance of *klass*""" for g in gl: if isinstance(g, klass): return True return False def sublists(list): l = len(list) - 1 m = int(pow(2, l - 1)) for x in range(len(list)): for i in range(m): set = [] k = 1 last_part = [] set.append(last_part) for j in range(l): last_part.append(list[j]) if i & k: last_part = [] set.append(last_part) k *= 2 yield set list = [list[-1]] + list[0:-1] def string2identifier(str): """Defines how illegal variable names are converted to legal ones.""" # TODO: Not very robust. if len(str): name = re.sub('\-|/|\.|\ ', '_', str, 0) if name[0] in string.digits: name = "_" + name return name else: return "DEFAULT" def sign(i): "Returns the sign of a number" return cmp(i, 0) class Set(list): "A list-like container that contains only unique elements." def __init__(self, list=[]): list.__init__(self) self._dict = {} self.extend(list) def append(self, item): if not self._dict.has_key(item): list.append(self, item) self._dict[item] = None def insert(self, i, item): if not self._dict.has_key(item): list.insert(self, i, item) self._dict[item] = None def extend(self, other): for item in other: if not self._dict.has_key(item): list.append(self, item) self._dict[item] = None class SetDictionary(dict): def __getitem__(self, key): return dict.setdefault(self, key, Set()) _byte_steps = (('Gb', float(1 << 30), float(1 << 30) * 1.1), ('Mb', float(1 << 20), float(1 << 20) * 1.1), ('kb', float(1 << 10), float(1 << 10) * 1.1), ('bytes', 1, -1)) def pretty_print_byte_size(bytes): "Prints byte lengths in a nice human-readable way" for step in _byte_steps: if bytes > step[2]: return "%.2f %s" % (float(bytes) / step[1], step[0]) return 'error (negative!)' if float(sys.version[0:3]) < 2.3: def enumerate(collection): """Backport to 2.2 of Python 2.3's enumerate function.""" i = 0 it = iter(collection) while 1: yield(i, it.next()) i += 1 __builtins__['enumerate'] = enumerate __builtins__['True'] = 1 __builtins__['False'] = 0 else: enumerate = __builtins__['enumerate'] _pixel_type_names = {ONEBIT: "OneBit", GREYSCALE: "GreyScale", GREY16: "Grey16", RGB: "RGB", FLOAT: "Float", COMPLEX: "Complex"} def get_pixel_type_name(type_): return _pixel_type_names[type_] def group_list(list, group_size): """Groups the list into fixed-size chunks.""" groups = [] for i in range(0, len(list), group_size): groups.append(list[i:min(i+group_size, len(list))]) return groups def permute_list(alist, level=0): """Yields all permutations of a given list.""" index, copy, printing = level, alist[:], level+1 == len(alist) while 1: if printing: yield copy else: for x in permute_list(copy, level + 1): yield x if index != 0: copy[index-1], copy[index] = copy[index], copy[index-1] index -= 1 if index < 0: break def combinations(seed): lengths = [len(x) for x in seed] if 0 in lengths: return length = len(seed) count = [0] * len(seed) copy = [x[0] for x in seed] while 1: yield copy i = 0 while 1: count[i] += 1 if count[i] == lengths[i]: count[i] = 0 copy[i] = seed[i][0] i += 1 if i == length: return else: copy[i] = seed[i][count[i]] break def word_wrap(stream, l, indent=0, width=78): """Writes to a stream with word wrapping. indent is the size of the indent for every line. width is the maximum width of the text.""" indent *= 2 width -= indent indent_spaces = ' ' * (indent) if is_sequence(l): l = ' '.join([str(x) for x in l]) i = 0 p = 0 while i != -1: stream.write(indent_spaces) if len(l) - p < width: stream.write(l[p:]) stream.write('\n') break else: i = l.rfind(' ', p, p + width) if i == -1: stream.write(l[p:]) else: stream.write(l[p:i]) stream.write('\n') p = i + 1 def encode_binary(s): import zlib, binascii return binascii.b2a_base64(zlib.compress(s)) def decode_binary(s): import zlib, binascii return zlib.decompress(binascii.a2b_base64(s)) class ProgressNothing: """A progress bar that actually does nothing (for batch mode.)""" def __init__(self, message, length=0): pass def ___(*args): pass update = kill = step = add_length = set_length = ___ class ProgressText: """A console-based progress bar.""" width = 64 def __init__(self, message, length=0): self._message = message self._starting = 1 self._done = 0 self._last_amount = 0 self._num = 0 if length == 0: self._den = 1 else: self._den = length def add_length(self, l): self._den += l def set_length(self, l): self._den = l def step(self): self._num += 1 self.update(self._num, self._den) def kill(self): self.update(1, 1) def update(self, num, den): if self._starting: sys.stdout.write(self._message) sys.stdout.write("\n") self._starting = 0 if not self._done: progress = int((float(num) / float(den)) * self.width) if progress != self._last_amount: self._last_amount = progress left = self.width - progress sys.stdout.write("|") sys.stdout.write("=" * progress) sys.stdout.write("-" * left) sys.stdout.write("|\r") sys.stdout.flush() if num >= den: self._done = 1 sys.stdout.write("\n") sys.stdout.flush() def ProgressFactory(message, length=1, numsteps=0): if has_gui.gui != None: return has_gui.gui.ProgressBox(message, length, numsteps) elif config.get("progress_bar"): return ProgressText(message, length) else: return ProgressNothing(message, length) # A regular expression used to determine the amount of space to # remove. It looks for the first sequence of spaces immediately # following the first newline, or at the beginning of the string. _find_dedent_regex = re.compile("(?:(?:\n\r?)|^)( *)\S") # A cache to hold the regexs that actually remove the indent. _dedent_regex = {} def dedent(s): # This implementation has a somewhat obtuse use of regular # expressions. However, this function accounted for almost 30% of # matplotlib startup time, so it is worthy of optimization at all # costs. if not s: # includes case of s is None return '' match = _find_dedent_regex.match(s) if match is None: return s # This is the number of spaces to remove from the left-hand side. nshift = match.end(1) - match.start(1) if nshift == 0: return s # Get a regex that will remove *up to* nshift spaces from the # beginning of each line. If it isn't in the cache, generate it. unindent = _dedent_regex.get(nshift, None) if unindent is None: unindent = re.compile("\n\r? {0,%d}" % nshift) _dedent_regex[nshift] = unindent result = unindent.sub("\n", s).strip() return result class CallbackObject: def __init__(self): self._callbacks = {} self.is_dirty = False def add_callback(self, alert, callback): category = self._callbacks.setdefault(alert, []) if callback not in category: category.append(callback) def remove_callback(self, alert, callback): category = self._callbacks.get(alert, []) if callback in category: category.remove(callback) def trigger_callback(self, alert, *args): category = self._callbacks.get(alert, []) for callback in category: callback(*args) self.is_dirty = True class CallbackList(list, CallbackObject): def __init__(self, initlist=[]): list.__init__(self, initlist) CallbackObject.__init__(self) def add_callback(self, alert, callback): CallbackObject.add_callback(self, alert, callback) if alert == 'length_change': callback(len(self)) elif alert == 'add': callback(self) def clear(self): CallbackList.__delslice__(self, 0, len(self)) def __del__(self): for i in self: self.trigger_callback('remove', [i]) self.trigger_callback('length_change', len(self)) def __setitem__(self, i, item): if abs(i) < len(self): self.trigger_callback('remove', [self[i]]) self.trigger_callback('add', [item]) list.__setitem__(self, i, item) def __delitem__(self, i): if abs(i) < len(self): self.trigger_callback('remove', [self[i]]) list.__delitem__(self, i) self.trigger_callback('length_change', len(self)) def __setslice__(self, i, j, other): i = max(i, 0); j = max(j, 0) if i < len(self) and j < len(self) + 1: self.trigger_callback('remove', self[i:j]) self.trigger_callback('add', other) list.__setslice__(self, i, j, other) def __delslice__(self, i, j): i = max(i, 0); j = max(j, 0) if i < len(self) and j < len(self) + 1: self.trigger_callback('remove', self[i:j]) list.__delslice__(self, i, j) self.trigger_callback('length_change', len(self)) def __iadd__(self, other): self.trigger_callback('add', other) list.__iadd__(self, other) self.trigger_callback('length_change', len(self)) def append(self, item): self.trigger_callback('add', [item]) list.append(self, item) self.trigger_callback('length_change', len(self)) def insert(self, i, item): if abs(i) < len(self): self.trigger_callback('add', [item]) list.insert(self, i, item) self.trigger_callback('length_change', len(self)) def pop(self, i=-1): if abs(i) < len(self): item = list.pop(self, i) self.trigger_callback('remove', [item]) self.trigger_callback('length_change', len(self)) def remove(self, item): if item in self: self.trigger_callback('remove', [item]) list.remove(self, item) self.trigger_callback('length_change', len(self)) def extend(self, other): self.trigger_callback('add', other) list.extend(self, other) self.trigger_callback('length_change', len(self)) class CallbackSet(sets.Set, CallbackObject): def __init__(self, initset=None): sets.Set.__init__(self, initset) CallbackObject.__init__(self) def __del__(self): self.trigger_callback('remove', self) self.trigger_callback('length_change', len(self)) def add_callback(self, alert, callback): CallbackObject.add_callback(self, alert, callback) if alert == 'length_change': callback(len(self)) elif alert == 'add': callback(self) def add(self, element): alert = element not in self sets.Set.add(self, element) if alert: self.trigger_callback('add', [element]) self.trigger_callback('length_change', len(self)) append = add def remove(self, element): alert = element in self sets.Set.remove(self, element) if alert: self.trigger_callback('remove', [element]) self.trigger_callback('length_change', len(self)) def discard(self, element): if element in self: sets.Set.remove(self, element) self.trigger_callback('remove', [element]) self.trigger_callback('length_change', len(self)) def pop(self): result = sets.Set.pop(self) self.trigger_callback('remove', [result]) self.trigger_callback('length_change', len(self)) def clear(self): self.trigger_callback('remove', self) sets.Set.clear(self) self.trigger_callback('length_change', len(self)) def update(self, iterable): def iter(): for i in iterable: if i not in self: yield i self.trigger_callback('add', iter()) sets.Set.update(self, iterable) self.trigger_callback('length_change', len(self)) def difference_update(self, iterable): def iter(): for i in iterable: if i in self: yield i self.trigger_callback('remove', iter()) sets.Set.difference_update(self, iterable) self.trigger_callback('length_change', len(self)) def symmetric_difference_update(self, iterable): def remove_iter(): for i in iterable: if i in self: yield i def add_iter(): for i in iterable: if not i in self: yield i self.trigger_callback('remove', remove_iter()) self.trigger_callback('add', add_iter()) sets.Set.symmetric_difference_update(self, iterable) self.trigger_callback('length_change', len(self)) def intersection_update(self, iterable): def iter(): for i in self: if not i in iterable: yield i self.trigger_callback('remove', iter()) sets.Set.intersection_update(self, iterable) self.trigger_callback('length_change', len(self)) def union_update(self, other): self.update(other) extend = update def __setstate__(self, data): CallbackObject.__init__(self) self.trigger_callback('remove', self) sets.Set.__setstate__(self, data) self.trigger_callback('add', self) self.trigger_callback('length_change', len(self)) def get_file_extensions(mode): from gamera import plugin import os.path from gamera.backport import sets methods = plugin.methods_flat_category("File") methods = [y for x, y in methods if x.startswith(mode) and not x.endswith("image")] if len(methods) == 0: raise RuntimeError("There don't seem to be any imported plugins that can %s files. Try running init_gamera() or explictly loading file i/o plugins such as tiff_support and png_support." % mode) extensions = sets.Set() types = [] for method in methods: wildcards = ";".join(["*.%s;*.%s" % (ext.lower(), ext.upper()) for ext in method.exts]) type = "%s Files (%s)|%s" % (method.exts[0].upper(), wildcards, wildcards) types.append(type) # We have to cast the lists to sets here to make Python 2.3.0 happy. extensions.update(sets.Set(method.exts)) extensions.update(sets.Set([x.upper() for x in method.exts])) all_extensions = ";".join(["*.%s" % x for x in extensions]) types.insert(0, "All images (%s)|%s" % (all_extensions, all_extensions)) types.append("All files (*.*)|*.*") return "|".join(types) class _ImageFileExtensionFinder: def __init__(self, mode): self.mode = mode def __str__(self): return get_file_extensions(self.mode) load_image_file_extension_finder = _ImageFileExtensionFinder("load") save_image_file_extension_finder = _ImageFileExtensionFinder("save") _warnings_history = {} def __warn_deprecated__(message, other_filename=None, other_lineno=None, from_cpp=False): stack = traceback.extract_stack() if not from_cpp: filename, lineno, scope, call = stack[-3] else: filename, lineno, scope, call = stack[-2] if other_filename is None: other_filename, other_lineno, scope, call = stack[-2] key = "%s:%d:%s:%d" % (filename, lineno, other_filename, other_lineno) if filename.endswith("code.py"): filename = "" lineno = 0 if not _warnings_history.has_key(key): _warnings_history[key] = None warnings.warn_explicit("\n" + message, DeprecationWarning, filename, lineno) warn_deprecated = __warn_deprecated__ gamera-3.3.3/gamera_gui0000700000076500000000000000154111755376173013776 0ustar chriswheel#!/usr/bin/python # This file was automatically generated by the # Gamera setup script on darwin. print "Loading GAMERA..." print "Use 'gamera_gui --help' to display command line options" import sys try: from gamera.config import config from gamera.gui import gui config.parse_args(sys.argv[1:]) gui.run() except Exception, e: if not isinstance(e, (SystemExit, KeyboardInterrupt)): import traceback import textwrap print "Gamera made the following fatal error:" print print textwrap.fill(str(e)) print print "=" * 75 print "The traceback is below. Please send this to the Gamera developers" print "if you feel you got here in error." print "-" * 75 traceback.print_exc() print "=" * 75 if sys.platform == "win32": print print "Press to exit." x = raw_input() gamera-3.3.3/gamera_post_install.py0000755000076500000000000000425111652050143016345 0ustar chriswheel#!/usr/bin/env python # -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2003-2008 Michael Droettboom # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # """Installs an icon on the user's Desktop when Gamera is installed.""" import sys, os.path, os def install_desktop_icon(): try: try: import wx except: import wxPython.wx except ImportError: print "wxPython was not found. Please make sure that wxPython is installed before running Gamera." try: desktop_path = get_special_folder_path("CSIDL_COMMON_DESKTOPDIRECTORY") except OSError: print "Can't find the desktop!" return if os.path.exists(desktop_path): print "Creating desktop icon..." desktop_icon = os.path.join(desktop_path, "Gamera.py") fd = open(desktop_icon, 'w') fd.write(""" print "Loading GAMERA..." import sys try: import wxversion except ImportError: print "Please ensure that wxPython is installed before running Gamera." print "Press to exit." x = raw_input() sys.exit() try: from gamera.gui import gui gui.run() except: import traceback print "Gamera made a fatal error:" print traceback.print_exc() print print "Press to exit." x = raw_input() sys.exit(1)""") fd.close() file_created(desktop_icon) print "done." if sys.argv[1] == '-install': install_desktop_icon() elif sys.argv[1] == '-remove': pass else: print "This script should only be run by the Windows installer." gamera-3.3.3/include/0000755000076500000000000000000011755376174013405 5ustar chriswheelgamera-3.3.3/include/accessor.hpp0000644000076500000000000000321711652050140015675 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm05142002_accessor #define kwm05142002_accessor namespace Gamera { template class ImageAccessor { public: typedef T value_type; template value_type operator()(const Iterator& i) const { return i.get(); } value_type operator()(value_type* i) const { return *i; } value_type operator()(const value_type* i) const { return *i; } template value_type get(const Iterator& i) const { return i.get(); } value_type get(value_type* i) const { return *i; } value_type get(const value_type* i) const { return *i; } template void set(const value_type& v, Iterator i) const { i.set(v); } void set(const value_type& v, value_type* i) const { *i = v; } }; } #endif gamera-3.3.3/include/boost_limits.hpp0000644000076500000000000004031510714675673016630 0ustar chriswheel/* * Copyright (c) 1997 * Silicon Graphics Computer Systems, Inc. * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Silicon Graphics makes no * representations about the suitability of this software for any * purpose. It is provided "as is" without express or implied warranty. */ /* NOTE: This is not portable code. Parts of numeric_limits<> are * inherently machine-dependent, and this file is written for the MIPS * architecture and the SGI MIPSpro C++ compiler. Parts of it (in * particular, some of the characteristics of floating-point types) * are almost certainly incorrect for any other platform. */ /* The above comment is almost certainly out of date. This file works * on systems other than SGI MIPSpro C++ now. */ /* * Revision history: * 21 Sep 2001: * Only include if BOOST_NO_CWCHAR is defined. (Darin Adler) * 10 Aug 2001: * Added MIPS (big endian) to the big endian family. (Jens Maurer) * 13 Apr 2001: * Added powerpc to the big endian family. (Jeremy Siek) * 5 Apr 2001: * Added sparc (big endian) processor support (John Maddock). * Initial sub: * Modified by Jens Maurer for gcc 2.95 on x86. */ #ifndef BOOST_SGI_CPP_LIMITS #define BOOST_SGI_CPP_LIMITS #include #include //#include //#ifndef BOOST_NO_CWCHAR //#include // for WCHAR_MIN and WCHAR_MAX //#endif #if defined(__sparc) || defined(__sparc__) || defined(__powerpc__) || defined(__ppc__) || defined(__hppa) || defined(_MIPSEB) #define BOOST_BIG_ENDIAN #elif defined(__i386__) #define BOOST_LITTLE_ENDIAN #else #error The file boost/detail/limits.hpp needs to be set up for your CPU type. #endif namespace std { enum float_round_style { round_indeterminate = -1, round_toward_zero = 0, round_to_nearest = 1, round_toward_infinity = 2, round_toward_neg_infinity = 3 }; enum float_denorm_style { denorm_indeterminate = -1, denorm_absent = 0, denorm_present = 1 }; // The C++ standard (section 18.2.1) requires that some of the members of // numeric_limits be static const data members that are given constant- // initializers within the class declaration. On compilers where the // BOOST_NO_INCLASS_MEMBER_INITIALIZATION macro is defined, it is impossible to write // a standard-conforming numeric_limits class. // // There are two possible workarounds: either initialize the data // members outside the class, or change them from data members to // enums. Neither workaround is satisfactory: the former makes it // impossible to use the data members in constant-expressions, and the // latter means they have the wrong type and that it is impossible to // take their addresses. We choose the former workaround. #ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION # define BOOST_STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \ enum { __mem_name = __mem_value } #else /* BOOST_NO_INCLASS_MEMBER_INITIALIZATION */ # define BOOST_STL_DECLARE_LIMITS_MEMBER(__mem_type, __mem_name, __mem_value) \ static const __mem_type __mem_name = __mem_value #endif /* BOOST_NO_INCLASS_MEMBER_INITIALIZATION */ // Deal with min/max for MinGW #ifdef min # undef min #endif #ifdef max # undef max #endif // Base class for all specializations of numeric_limits. template class _Numeric_limits_base { public: BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, false); static __number min() throw() { return __number(); } static __number max() throw() { return __number(); } BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_integer, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_exact, false); BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 0); static __number epsilon() throw() { return __number(); } static __number round_error() throw() { return __number(); } BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, 0); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_infinity, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, false); BOOST_STL_DECLARE_LIMITS_MEMBER(float_denorm_style, has_denorm, denorm_absent); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss, false); static __number infinity() throw() { return __number(); } static __number quiet_NaN() throw() { return __number(); } static __number signaling_NaN() throw() { return __number(); } static __number denorm_min() throw() { return __number(); } BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_iec559, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, traps, false); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false); BOOST_STL_DECLARE_LIMITS_MEMBER(float_round_style, round_style, round_toward_zero); }; // Base class for integers. template class _Integer_limits : public _Numeric_limits_base<_Int> { public: BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true); static _Int min() throw() { return __imin; } static _Int max() throw() { return __imax; } BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits, (__idigits < 0) ? (int)(sizeof(_Int) * CHAR_BIT) - (__imin == 0 ? 0 : 1) : __idigits); BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, (digits * 301) / 1000); // log 2 = 0.301029995664... BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, __imin != 0); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_integer, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_exact, true); BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 2); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_modulo, true); }; #if defined(BOOST_BIG_ENDIAN) template struct float_helper{ static Number get_word() throw() { // sizeof(long double) == 16 const unsigned int _S_word[4] = { Word, 0, 0, 0 }; return *reinterpret_cast(&_S_word); } }; #else template struct float_helper{ static Number get_word() throw() { // sizeof(long double) == 12, but only 10 bytes significant const unsigned int _S_word[4] = { 0, 0, 0, Word }; return *reinterpret_cast( reinterpret_cast(&_S_word)+16- (sizeof(Number) == 12 ? 10 : sizeof(Number))); } }; #endif // Base class for floating-point numbers. template class _Floating_limits : public _Numeric_limits_base<__number> { public: BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_specialized, true); BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits, __Digits); BOOST_STL_DECLARE_LIMITS_MEMBER(int, digits10, __Digits10); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_signed, true); BOOST_STL_DECLARE_LIMITS_MEMBER(int, radix, 2); BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent, __MinExp); BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent, __MaxExp); BOOST_STL_DECLARE_LIMITS_MEMBER(int, min_exponent10, __MinExp10); BOOST_STL_DECLARE_LIMITS_MEMBER(int, max_exponent10, __MaxExp10); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_infinity, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_quiet_NaN, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_signaling_NaN, true); BOOST_STL_DECLARE_LIMITS_MEMBER(float_denorm_style, has_denorm, denorm_indeterminate); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, has_denorm_loss, false); static __number infinity() throw() { return float_helper<__number, __InfinityWord>::get_word(); } static __number quiet_NaN() throw() { return float_helper<__number,__QNaNWord>::get_word(); } static __number signaling_NaN() throw() { return float_helper<__number,__SNaNWord>::get_word(); } BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_iec559, __IsIEC559); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, is_bounded, true); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, traps, false /* was: true */ ); BOOST_STL_DECLARE_LIMITS_MEMBER(bool, tinyness_before, false); BOOST_STL_DECLARE_LIMITS_MEMBER(float_round_style, round_style, __RoundStyle); }; // Class numeric_limits // The unspecialized class. template class numeric_limits : public _Numeric_limits_base {}; // Specializations for all built-in integral types. template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; #ifndef BOOST_NO_INTRINSIC_WCHAR_T template<> class numeric_limits #if !defined(WCHAR_MAX) || !defined(WCHAR_MIN) #if defined(_WIN32) || defined(__CYGWIN__) : public _Integer_limits #elif defined(__hppa) // wchar_t has "unsigned int" as the underlying type : public _Integer_limits #else // assume that wchar_t has "int" as the underlying type : public _Integer_limits #endif #else // we have WCHAR_MIN and WCHAR_MAX defined, so use it : public _Integer_limits #endif {}; #endif template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; #ifdef __GNUC__ // Some compilers have long long, but don't define the // LONGLONG_MIN and LONGLONG_MAX macros in limits.h. This // assumes that long long is 64 bits. #if !defined(LONGLONG_MAX) && !defined(ULONGLONG_MAX) # define ULONGLONG_MAX 0xffffffffffffffffLLU # define LONGLONG_MAX 0x7fffffffffffffffLL #endif #if !defined(LONGLONG_MIN) # define LONGLONG_MIN (-LONGLONG_MAX - 1) #endif template<> class numeric_limits : public _Integer_limits {}; template<> class numeric_limits : public _Integer_limits {}; #endif /* __GNUC__ */ // Specializations for all built-in floating-point type. template<> class numeric_limits : public _Floating_limits { public: static float min() throw() { return FLT_MIN; } static float denorm_min() throw() { return FLT_MIN; } static float max() throw() { return FLT_MAX; } static float epsilon() throw() { return FLT_EPSILON; } static float round_error() throw() { return 0.5f; } // Units: ulps. }; template<> class numeric_limits : public _Floating_limits { public: static double min() throw() { return DBL_MIN; } static double denorm_min() throw() { return DBL_MIN; } static double max() throw() { return DBL_MAX; } static double epsilon() throw() { return DBL_EPSILON; } static double round_error() throw() { return 0.5; } // Units: ulps. }; template<> class numeric_limits : public _Floating_limits { public: static long double min() throw() { return LDBL_MIN; } static long double denorm_min() throw() { return LDBL_MIN; } static long double max() throw() { return LDBL_MAX; } static long double epsilon() throw() { return LDBL_EPSILON; } static long double round_error() throw() { return 4; } // Units: ulps. }; } // namespace std #endif /* BOOST_SGI_CPP_LIMITS */ // Local Variables: // mode:C++ // End: gamera-3.3.3/include/canonicpyobject.hpp0000644000076500000000000000306011652050140017241 0ustar chriswheel/* * * Copyright (C) 2009 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef cd22092009_canonicpyobject_hpp #define cd22092009_canonicpyobject_hpp /* CANONICPYOBJECT TYPE */ // A "canonic" wrapper class around PyObject*, to make PyObjects // usable in STL containers, e.g. vector // The main point is that the proper comparison functions are called // It is meant to be used on the C++ side only class canonicPyObject { public: PyObject* value; inline canonicPyObject(PyObject* c2) {value = c2;} inline canonicPyObject& operator=(const PyObject* c2) { value = (PyObject*)c2; return *this; } inline int operator<(const canonicPyObject& c2) const { return PyObject_RichCompareBool(value,c2.value,Py_LT); } inline int operator==(const canonicPyObject& c2) const { return PyObject_RichCompareBool(value,c2.value,Py_EQ); } }; #endif gamera-3.3.3/include/connected_components.hpp0000644000076500000000000006353711652050140020315 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2009 Jonathan Koch, Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm01032002_connected_component_hpp #define kwm01032002_connected_component_hpp #include "dimensions.hpp" #include "image.hpp" #include "gamera.hpp" #include "image_view_iterators.hpp" #include "connected_components_iterators.hpp" #include "vigra_iterators.hpp" #include #include #include #include #include /* ConnectedComponent This class implements a filtered image view. Within a ConnectedComponent only those pixels that match the assigned label will be shown. This requires the use of a proxy type for iterator types that require an lvalue be returned from dereferencing (see CCProxy below). KWM MultiLabelCC This class implements a filtered image view similar to ConnectedComponent, but with pixels visible that not only match a single label, but a set of possible labels. */ namespace Gamera { template class MultiLabelCC; template class ConnectedComponent : public ImageBase { public: using ImageBase::ncols; using ImageBase::nrows; using ImageBase::offset_x; using ImageBase::offset_y; // standard STL typedefs typedef typename T::value_type value_type; typedef typename T::pointer pointer; typedef typename T::reference reference; typedef typename T::difference_type difference_type; // Gamera specific typedef T data_type; // Vigra typedefs typedef value_type PixelType; // convenience typedefs typedef ConnectedComponent self; typedef ImageBase base_type; // // CONSTRUCTORS // ConnectedComponent() : base_type() { m_image_data = 0; m_label = 0; } ConnectedComponent(T& image_data) : base_type(image_data.offset(), image_data.dim()) { m_image_data = &image_data; range_check(); calculate_iterators(); } ConnectedComponent(T& image_data, value_type label, const Rect& rect) : base_type(rect), m_label(label) { m_image_data = &image_data; range_check(); calculate_iterators(); } ConnectedComponent(T& image_data, value_type label, const Point& upper_left, const Point& lower_right) : base_type(upper_left, lower_right), m_label(label) { m_image_data = &image_data; range_check(); calculate_iterators(); } ConnectedComponent(T& image_data, value_type label, const Point& upper_left, const Size& size) : base_type(upper_left, size), m_label(label) { m_image_data = &image_data; range_check(); calculate_iterators(); } ConnectedComponent(T& image_data, value_type label, const Point& upper_left, const Dim& dim) : base_type(upper_left, dim), m_label(label) { m_image_data = &image_data; range_check(); calculate_iterators(); } // // COPY CONSTRUCTORS // ConnectedComponent(const self& other, const Rect& rect) : base_type(rect) { m_image_data = other.m_image_data; m_label = other.label(); range_check(); calculate_iterators(); } ConnectedComponent(const self& other, const Point& upper_left, const Point& lower_right) : base_type(upper_left, lower_right) { m_image_data = other.m_image_data; m_label = other.label(); range_check(); calculate_iterators(); } ConnectedComponent(const self& other, const Point& upper_left, const Size& size) : base_type(upper_left, size) { m_image_data = other.m_image_data; m_label = other.label(); range_check(); calculate_iterators(); } ConnectedComponent(const self& other, const Point& upper_left, const Dim& dim) : base_type(upper_left, dim) { m_image_data = other.m_image_data; m_label = other.label(); range_check(); calculate_iterators(); } // //Conversion // MultiLabelCC* convert_to_mlcc(){ MultiLabelCC* mlcc=new MultiLabelCC( *((T*)this->data()), m_label, this->ul(), this->lr() ); return mlcc; } // // FUNCTION ACCESS // value_type get(const Point& point) const { value_type tmp = *(m_const_begin + (point.y() * m_image_data->stride()) + point.x()); if (tmp == m_label) return tmp; else return 0; } void set(const Point& p, value_type value) { // we simply set the pixel value regardless of the label // warning: when value different from Cc.labels, the pixel will // appear to be white, even though we have written a different value *(m_begin + (p.y() * m_image_data->stride()) + p.x()) = value; } // // DIMENSIONS // // redefine the dimensions change function from Rect virtual void dimensions_change() { range_check(); calculate_iterators(); } // // Misc // virtual T* data() const { return m_image_data; } ImageView parent() { return ImageView(*m_image_data, 0, 0, m_image_data->nrows(), m_image_data->ncols()); } ImageView image() { return ImageView(*m_image_data, this->origin(), this->dim()); } value_type label() const { return m_label; } void label(value_type label) { m_label = label; } // // Iterators // typedef CCDetail::RowIterator row_iterator; row_iterator row_begin() { return row_iterator(this, m_begin); } row_iterator row_end() { return row_iterator(this, m_end); } typedef CCDetail::ColIterator col_iterator; col_iterator col_begin() { return col_iterator(this, m_begin); } col_iterator col_end() { return col_iterator(this, m_begin + ncols()); } // // Const Iterators // typedef CCDetail::ConstRowIterator const_row_iterator; const_row_iterator row_begin() const { return const_row_iterator(this, m_const_begin); } const_row_iterator row_end() const { return const_row_iterator(this, m_const_end); } typedef CCDetail::ConstColIterator const_col_iterator; const_col_iterator col_begin() const { return const_col_iterator(this, m_const_begin); } const_col_iterator col_end() const { return const_col_iterator(this, m_const_begin + ncols()); } // // 2D iterators // typedef Gamera::ImageIterator Iterator; Iterator upperLeft() { return Iterator(this, m_image_data->begin(), m_image_data->stride()) + Diff2D(offset_x() - m_image_data->page_offset_x(), offset_y() - m_image_data->page_offset_y()); } Iterator lowerRight() { return Iterator(this, m_image_data->begin(), m_image_data->stride()) + Diff2D(offset_x() + ncols() - m_image_data->page_offset_x(), offset_y() + nrows() - m_image_data->page_offset_y()); } typedef Gamera::ConstImageIterator ConstIterator; ConstIterator upperLeft() const { return ConstIterator(this, static_cast(m_image_data)->begin(), m_image_data->stride()) + Diff2D(offset_x() - m_image_data->page_offset_x(), offset_y() - m_image_data->page_offset_y()); } ConstIterator lowerRight() const { return ConstIterator(this, static_cast(m_image_data)->begin(), m_image_data->stride()) + Diff2D(offset_x() + ncols() - m_image_data->page_offset_x(), offset_y() + nrows() - m_image_data->page_offset_y()); } // // Vector iterator // typedef CCDetail::VecIterator vec_iterator; vec_iterator vec_begin() { return vec_iterator(row_begin()); } vec_iterator vec_end() { return vec_iterator(row_end()); } typedef CCDetail::ConstVecIterator const_vec_iterator; const_vec_iterator vec_begin() const { return const_vec_iterator(row_begin()); } const_vec_iterator vec_end() const { return const_vec_iterator(row_end()); } // // OPERATOR ACCESS // col_iterator operator[](size_t n) { return col_iterator(this, m_begin + (n * data()->stride())); } const_col_iterator operator[](size_t n) const { return const_col_iterator(this, m_begin + (n * data()->stride())); } private: /* We pre-compute iterators here in an effort to make begin() and end() methods a little faster. Unfortunately we have to to keep around both normal and const iterators. */ void calculate_iterators() { m_begin = m_image_data->begin() // row offset + (m_image_data->stride() * (offset_y() - m_image_data->page_offset_y())) // col offset + (offset_x() - m_image_data->page_offset_x()); m_end = m_image_data->begin() // row offset + (m_image_data->stride() * ((offset_y() - m_image_data->page_offset_y()) + nrows())) // column offset + (offset_x() - m_image_data->page_offset_x()); const T* cmd = static_cast(m_image_data); m_const_begin = cmd->begin() // row offset + (m_image_data->stride() * (offset_y() - m_image_data->page_offset_y())) // col offset + (offset_x() - m_image_data->page_offset_x()); m_const_end = cmd->begin() // row offset + (m_image_data->stride() * ((offset_y() - m_image_data->page_offset_y()) + nrows())) // column offset + (offset_x() - m_image_data->page_offset_x()); } void range_check() { if (offset_y() + nrows() - m_image_data->page_offset_y() > m_image_data->nrows() || offset_x() + ncols() - m_image_data->page_offset_x() > m_image_data->ncols() || offset_y() < m_image_data->page_offset_y() || offset_x() < m_image_data->page_offset_x()) { char error[1024]; sprintf(error, "Image view dimensions out of range for data\n"); sprintf(error, "%s\tnrows %d\n", error, (int)nrows()); sprintf(error, "%s\toffset_y %d\n", error, (int)offset_y()); sprintf(error, "%s\tdata nrows %d\n", error, (int)m_image_data->nrows()); sprintf(error, "%s\tncols %d\n", error, (int)ncols()); sprintf(error, "%s\toffset_x %d\n", error, (int)offset_x()); sprintf(error, "%s\tdata ncols %d\n", error,(int)m_image_data->ncols()); throw std::range_error(error); } } // Pointer to the data for this view T* m_image_data; // Cached iterators - see calculate_iterators above. typename T::iterator m_begin, m_end; typename T::const_iterator m_const_begin, m_const_end; // The label for this connected-component value_type m_label; }; template class MultiLabelCC : public ImageBase { public: using ImageBase::ncols; using ImageBase::nrows; using ImageBase::offset_x; using ImageBase::offset_y; // standard STL typedefs typedef typename T::value_type value_type; typedef typename T::pointer pointer; typedef typename T::reference reference; typedef typename T::difference_type difference_type; // Gamera specific typedef T data_type; // Vigra typedefs typedef value_type PixelType; // convenience typedefs typedef MultiLabelCC self; typedef ImageBase base_type; // // CONSTRUCTORS // MultiLabelCC() : base_type() { m_image_data = 0; } MultiLabelCC(T& image_data) : base_type(image_data.offset(), image_data.dim()) { m_image_data = &image_data; range_check(); calculate_iterators(); } MultiLabelCC(T& image_data, value_type label, const Rect& rect) : base_type(rect){ m_image_data = &image_data; range_check(); calculate_iterators(); m_labels[label]=new Rect(rect); } MultiLabelCC(T& image_data, value_type label, const Point& upper_left, const Point& lower_right) : base_type(upper_left, lower_right){ m_image_data = &image_data; range_check(); calculate_iterators(); m_labels[label]=new Rect(upper_left, lower_right); } MultiLabelCC(T& image_data, value_type label, const Point& upper_left, const Size& size) : base_type(upper_left, size){ m_image_data = &image_data; range_check(); calculate_iterators(); m_labels[label]=new Rect(upper_left, size); } MultiLabelCC(T& image_data, value_type label, const Point& upper_left, const Dim& dim) : base_type(upper_left, dim){ m_image_data = &image_data; range_check(); calculate_iterators(); m_labels[label]=new Rect(upper_left, dim); } // // DESTRUCTOR // virtual ~MultiLabelCC(){ for(it=m_labels.begin(); it!=m_labels.end(); it++){ delete it->second; } } // // COPY CONSTRUCTORS // MultiLabelCC(const self& other, const Rect& rect) : base_type(rect) { m_image_data = other.m_image_data; copy_labels(other); m_neighbors=other.m_neighbors; range_check(); calculate_iterators(); } MultiLabelCC(const self& other, const Point& upper_left, const Point& lower_right) : base_type(upper_left, lower_right) { m_image_data = other.m_image_data; copy_labels(other); m_neighbors=other.m_neighbors; range_check(); calculate_iterators(); } MultiLabelCC(const self& other, const Point& upper_left, const Size& size) : base_type(upper_left, size) { m_image_data = other.m_image_data; copy_labels(other); m_neighbors=other.m_neighbors; range_check(); calculate_iterators(); } MultiLabelCC(const self& other, const Point& upper_left, const Dim& dim) : base_type(upper_left, dim) { m_image_data = other.m_image_data; copy_labels(other); m_neighbors=other.m_neighbors; range_check(); calculate_iterators(); } // //Conversion // typename std::list*>* convert_to_cc_list(){ typename std::list*>* cc_list=new std::list*>(); ConnectedComponent* cc; for(it=m_labels.begin(); it!=m_labels.end(); it++){ cc=new ConnectedComponent( *((T*)this->data()), it->first, *(it->second)); cc_list->push_back(cc); } return cc_list; } ConnectedComponent* convert_to_cc(){ // we must use iterators because set() is blocked for MlCc's typename MultiLabelCC::vec_iterator i = this->vec_begin(); int label = m_labels.begin()->first; for ( ; i != this->vec_end(); ++i) { if (is_black(*i)) *i = label; } for(it=m_labels.begin(); it!=m_labels.end(); it++){ delete it->second; } m_labels.clear(); m_labels[label] = new Rect((Rect)*this); ConnectedComponent* cc=new ConnectedComponent( *((T*)this->data()), label, this->ul(), this->lr() ); return cc; } // // FUNCTION ACCESS // value_type get(const Point& point) const{ value_type tmp = *(m_const_begin + (point.y() * m_image_data->stride()) + point.x()); if(m_labels.find(tmp) != m_labels.end()) return tmp; else return 0; } void set(const Point& p, value_type value) { // we simply set the pixel value regardless of the label // warning: when value is neither of the labels, the pixel will // appear to be white, even though we have written a different value *(m_begin + (p.y() * m_image_data->stride()) + p.x()) = value; } // // DIMENSIONS // // redefine the dimensions change function from Rect virtual void dimensions_change() { range_check(); calculate_iterators(); } // // Misc // virtual T* data() const { return m_image_data; } ImageView parent() { return ImageView(*m_image_data, 0, 0, m_image_data->nrows(), m_image_data->ncols()); } ImageView image() { return ImageView(*m_image_data, this->origin(), this->dim()); } /* typename std::map labels(){ return m_labels; } */ void get_labels(typename std::vector &labels){ for (it=m_labels.begin(); it!=m_labels.end(); it++){ labels.push_back(it->first); } } bool has_label(value_type label) const { return m_labels.find(label) != m_labels.end(); } void add_label(value_type label, Rect& rect) { if(m_labels.size()==0){ this->rect_set(rect.ul(),rect.lr()); } //beware rect is only a reference and m_labels just stores pointers => you have to make a copy of rect m_labels[label]=new Rect(rect); this->union_rect(rect); } void remove_label(value_type label){ it=m_labels.find(label); if(it!=m_labels.end()){ delete it->second; m_labels.erase(label); find_bounding_box(); } } void find_bounding_box(){ if(m_labels.size()==0){ this->rect_set(Point(0,0), Point(0,0)); } else { coord_t maxX = 0; coord_t maxY = 0; coord_t minX = std::numeric_limits::max(); coord_t minY = std::numeric_limits::max(); for(this->it=this->m_labels.begin(); this->it!=this->m_labels.end(); this->it++){ if(maxXit->second->lr_x()) maxX=this->it->second->lr_x(); if(maxYit->second->lr_y()) maxY=this->it->second->lr_y(); if(minX>this->it->second->ul_x()) minX=this->it->second->ul_x(); if(minY>this->it->second->ul_y()) minY=this->it->second->ul_y(); } this->rect_set(Point(minX,minY), Point(maxX,maxY)); } } void add_neighbors(value_type i, value_type j){ m_neighbors.push_back(i); m_neighbors.push_back(j); } void get_neighbors(typename std::vector &neighbors){ neighbors=this->m_neighbors; } void relabel(typename std::vector* >& labelVector, typename std::vector& mlccs){ self* mlcc; for (size_t i=0; idata())); mlccs.push_back(mlcc); for (size_t j=0; jsize(); j++){ Rect* rect=m_labels[labelVector[i]->at(j)]; if(rect!=NULL){ value_type label=(value_type)(labelVector[i]->at(j)); mlcc->add_label(label, *rect); } else { //tidy up for (size_t k=0; kat(j)); throw std::runtime_error(error); } } } } // // Iterators // typedef MLCCDetail::RowIterator row_iterator; row_iterator row_begin() { return row_iterator(this, m_begin); } row_iterator row_end() { return row_iterator(this, m_end); } typedef MLCCDetail::ColIterator col_iterator; col_iterator col_begin() { return col_iterator(this, m_begin); } col_iterator col_end() { return col_iterator(this, m_begin + ncols()); } // // Const Iterators // typedef MLCCDetail::ConstRowIterator const_row_iterator; const_row_iterator row_begin() const { return const_row_iterator(this, m_const_begin); } const_row_iterator row_end() const { return const_row_iterator(this, m_const_end); } typedef MLCCDetail::ConstColIterator const_col_iterator; const_col_iterator col_begin() const { return const_col_iterator(this, m_const_begin); } const_col_iterator col_end() const { return const_col_iterator(this, m_const_begin + ncols()); } // // 2D iterators // typedef Gamera::ImageIterator Iterator; Iterator upperLeft() { return Iterator(this, m_image_data->begin(), m_image_data->stride()) + Diff2D(offset_x() - m_image_data->page_offset_x(), offset_y() - m_image_data->page_offset_y()); } Iterator lowerRight() { return Iterator(this, m_image_data->begin(), m_image_data->stride()) + Diff2D(offset_x() + ncols() - m_image_data->page_offset_x(), offset_y() + nrows() - m_image_data->page_offset_y()); } typedef Gamera::ConstImageIterator ConstIterator; ConstIterator upperLeft() const { return ConstIterator(this, static_cast(m_image_data)->begin(), m_image_data->stride()) + Diff2D(offset_x() - m_image_data->page_offset_x(), offset_y() - m_image_data->page_offset_y()); } ConstIterator lowerRight() const { return ConstIterator(this, static_cast(m_image_data)->begin(), m_image_data->stride()) + Diff2D(offset_x() + ncols() - m_image_data->page_offset_x(), offset_y() + nrows() - m_image_data->page_offset_y()); } // // Vector iterator // typedef MLCCDetail::VecIterator vec_iterator; vec_iterator vec_begin() { return vec_iterator(row_begin()); } vec_iterator vec_end() { return vec_iterator(row_end()); } typedef MLCCDetail::ConstVecIterator const_vec_iterator; const_vec_iterator vec_begin() const { return const_vec_iterator(row_begin()); } const_vec_iterator vec_end() const { return const_vec_iterator(row_end()); } // // OPERATOR ACCESS // col_iterator operator[](size_t n) { return col_iterator(this, m_begin + (n * data()->stride())); } const_col_iterator operator[](size_t n) const { return const_col_iterator(this, m_begin + (n * data()->stride())); } //for initialization of iterators const typename std::map* get_labels_pointer() const { return &m_labels; } private: void copy_labels(const self& other){ typename std::map::const_iterator iter; for (iter = other.m_labels.begin(); iter != other.m_labels.end(); iter++){ m_labels[iter->first]=new Rect(*(iter->second)); } } /* We pre-compute iterators here in an effort to make begin() and end() methods a little faster. Unfortunately we have to keep around both normal and const iterators. */ void calculate_iterators() { m_begin = m_image_data->begin() // row offset + (m_image_data->stride() * (offset_y() - m_image_data->page_offset_y())) // col offset + (offset_x() - m_image_data->page_offset_x()); m_end = m_image_data->begin() // row offset + (m_image_data->stride() * ((offset_y() - m_image_data->page_offset_y()) + nrows())) // column offset + (offset_x() - m_image_data->page_offset_x()); const T* cmd = static_cast(m_image_data); m_const_begin = cmd->begin() // row offset + (m_image_data->stride() * (offset_y() - m_image_data->page_offset_y())) // col offset + (offset_x() - m_image_data->page_offset_x()); m_const_end = cmd->begin() // row offset + (m_image_data->stride() * ((offset_y() - m_image_data->page_offset_y()) + nrows())) // column offset + (offset_x() - m_image_data->page_offset_x()); } void range_check() { if (offset_y() + nrows() - m_image_data->page_offset_y() > m_image_data->nrows() || offset_x() + ncols() - m_image_data->page_offset_x() > m_image_data->ncols() || offset_y() < m_image_data->page_offset_y() || offset_x() < m_image_data->page_offset_x()) { char error[1024]; sprintf(error, "Image view dimensions out of range for data\n"); sprintf(error, "%s\tnrows %d\n", error, (int)nrows()); sprintf(error, "%s\toffset_y %d\n", error, (int)offset_y()); sprintf(error, "%s\tdata nrows %d\n", error, (int)m_image_data->nrows()); sprintf(error, "%s\tncols %d\n", error, (int)ncols()); sprintf(error, "%s\toffset_x %d\n", error, (int)offset_x()); sprintf(error, "%s\tdata ncols %d\n", error,(int)m_image_data->ncols()); throw std::range_error(error); } } // Pointer to the data for this view T* m_image_data; // Cached iterators - see calculate_iterators above. typename T::iterator m_begin, m_end; typename T::const_iterator m_const_begin, m_const_end; // The labels/rects for this connected-component typename std::map m_labels; typename std::map::iterator it; // The neighborhood-relations typename std::vector m_neighbors; }; } #endif gamera-3.3.3/include/connected_components_iterators.hpp0000644000076500000000000004443111652050140022401 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2009 Jonathan Koch * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm01022002_connected_component_iterators_hpp #define kwm01022002_connected_component_iterators_hpp #include "accessor.hpp" #include "iterator_base.hpp" #include namespace Gamera { namespace CCDetail { /* CCProxy This class is used so that the filtered assignment and derefencing can happen for the ColIterator and RowIterator (which require that the values returned from operator *, ->, and [] return an lvalue). So far it has worked well, but more testing probably needs to be done. The basic idea is that instead of returning a reference to a value in the image_data, we return an object that holds a reference to the data and the label for the ConnectedComponent. The object contains a conversion operator and an assignment operator. When conversion to the type of the value is requested, the label is checked against the value. If they match, then the value is returned, otherwise 0 is returned. Assignment makes similar checks. This type of proxying can cause numerous problems, so care is required. KWM */ template class CCProxy { public: /* constructor - we store a pointer to the value so that changing the ConnectedComponent from another place (say the set function of ConnectedComponent) doesn't invalidate this proxy object. This is probably not a big concern. KWM */ CCProxy(I i, T label) : m_iter(i), m_label(label) { } // conversion to T operator T() const { T tmp = m_accessor(m_iter); if (tmp == m_label) return tmp; else return 0; } // assignment only happens if the label matches void operator=(T value) { if (m_accessor(m_iter) == m_label) m_accessor.set(value, m_iter); } private: I m_iter; T m_label; ImageAccessor m_accessor; }; template class ColIterator; template class RowIterator : public RowIteratorBase, T> { public: using RowIteratorBase, T>::m_iterator; using RowIteratorBase, T>::m_image; // Typedefs for rows typedef ColIterator iterator; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; typedef RowIterator self; typedef RowIteratorBase base; typedef CCProxy proxy_type; // Constructor RowIterator(Image* image, const T iterator) : base(image, iterator) { } RowIterator() { } proxy_type operator*() const { return proxy_type(m_iterator, m_image->label()); } value_type get() const { if (m_accessor(m_iterator) == m_image->label()) return m_accessor(m_iterator); else return 0; } void set(const value_type& v) { if (m_accessor(m_iterator) == m_image->label()) m_accessor.set(v, m_iterator); } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator + m_image->ncols()); } private: accessor m_accessor; }; template class ColIterator : public ColIteratorBase, T> { public: using ColIteratorBase, T>::m_iterator; using ColIteratorBase, T>::m_image; // Typedefs for Cols typedef RowIterator iterator; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; // Convenience typedefs typedef ColIterator self; typedef ColIteratorBase base; typedef CCProxy proxy_type; // Constructor ColIterator(Image* image, const T iterator) : base(image, iterator) { } ColIterator() { } proxy_type operator*() const { return proxy_type(m_iterator, m_image->label()); } // Image specific value_type get() const { if (m_accessor(m_iterator) == m_image->label()) return m_accessor(m_iterator); else return 0; } void set(const value_type& v) { if (m_accessor(m_iterator) == m_image->label()) m_accessor.set(v, m_iterator); } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator) + m_image->nrows(); } private: accessor m_accessor; }; template class ConstColIterator; template class ConstRowIterator : public RowIteratorBase, T> { public: using RowIteratorBase, T>::m_iterator; using RowIteratorBase, T>::m_image; // Typedefs for rows typedef ConstColIterator iterator; // Convenience typedefs typedef ConstRowIterator self; typedef RowIteratorBase base; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstRowIterator(Image* image, const T iterator) : base(image, iterator) { } ConstRowIterator() { } typename Image::value_type operator*() const { return get(); } value_type get() const { if (m_accessor(m_iterator) == m_image->label()) return m_accessor(m_iterator); else return 0; } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator + m_image->ncols()); } private: accessor m_accessor; }; template class ConstColIterator : public ColIteratorBase, T> { public: using ColIteratorBase, T>::m_iterator; using ColIteratorBase, T>::m_image; // Typedefs for Cols typedef ConstRowIterator iterator; // Convenience typedefs typedef ConstColIterator self; typedef ColIteratorBase base; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstColIterator(Image* image, const T iterator) : base(image, iterator) { } ConstColIterator() { } typename Image::value_type operator*() const { return get(); } // Image specific value_type get() const { if (m_accessor(m_iterator) == m_image->label()) return m_accessor(m_iterator); else return 0; } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator) + m_image->nrows(); } private: accessor m_accessor; }; template class VecIterator : public VecIteratorBase > { public: using VecIteratorBase >::m_coliterator; typedef VecIterator self; typedef VecIteratorBase base; typedef typename Image::value_type value_type; typedef CCProxy proxy_type; typedef ImageAccessor accessor; // Constructor VecIterator(const Row iterator) : base(iterator) { } VecIterator() { } // Operators proxy_type operator*() const { return proxy_type(m_coliterator.m_iterator, m_coliterator.m_image->label()); } value_type get() const { if (m_accessor(m_coliterator) == m_coliterator.m_image->label()) return m_accessor(m_coliterator); else return 0; } void set(const value_type& v) { if (m_accessor(m_coliterator) == m_coliterator.m_image->label()) m_accessor.set(v, m_coliterator); } private: accessor m_accessor; }; template class ConstVecIterator : public VecIteratorBase > { public: using VecIteratorBase >::m_coliterator; typedef ConstVecIterator self; typedef VecIteratorBase base; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstVecIterator(const Row iterator) : base(iterator) { } ConstVecIterator() { } // Operators typename Image::value_type operator*() const { return get(); } value_type get() const { if (m_accessor(m_coliterator) == m_coliterator.m_image->label()) return m_accessor(m_coliterator); else return 0; } private: accessor m_accessor; }; } // namespace /*****************************************************************************/ namespace MLCCDetail { template class MLCCProxy { public: MLCCProxy(I i, const typename std::map *labels) : m_iter(i){ this->m_labels=labels; } // conversion to T operator T() { T tmp = m_accessor(m_iter); if (m_labels->find(tmp) != m_labels->end()) return tmp; else return 0; } // assignment only happens if the label matches void operator=(T value) { T tmp=m_accessor(m_iter); if (m_labels->find(tmp) != m_labels->end()) m_accessor.set(value, m_iter); } private: I m_iter; const typename std::map *m_labels; ImageAccessor m_accessor; }; template class ColIterator; template class RowIterator : public RowIteratorBase, T> { public: using RowIteratorBase, T>::m_iterator; using RowIteratorBase, T>::m_image; // Typedefs for rows typedef ColIterator iterator; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; typedef RowIterator self; typedef RowIteratorBase base; typedef MLCCProxy proxy_type; // Constructor RowIterator(Image* image, const T iterator) : base(image, iterator) { } RowIterator() { } proxy_type operator*() const { return proxy_type(m_iterator, m_image->get_labels_pointer()); } value_type get() const { if (m_image->has_label(m_accessor(m_iterator))) return m_accessor(m_iterator); else return 0; } void set(const value_type& v) { if (m_image->has_label(m_accessor(m_iterator))) m_accessor.set(v, m_iterator); } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator + m_image->ncols()); } private: accessor m_accessor; }; template class ColIterator : public ColIteratorBase, T> { public: using ColIteratorBase, T>::m_iterator; using ColIteratorBase, T>::m_image; // Typedefs for Cols typedef RowIterator iterator; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; // Convenience typedefs typedef ColIterator self; typedef ColIteratorBase base; typedef MLCCProxy proxy_type; // Constructor ColIterator(Image* image, const T iterator) : base(image, iterator) { } ColIterator() { } proxy_type operator*() const { return proxy_type(m_iterator, m_image->get_labels_pointer()); } // Image specific value_type get() const { if (m_image->has_label(m_accessor(m_iterator))) return m_accessor(m_iterator); else return 0; } void set(const value_type& v) { if (m_image->has_label(m_accessor(m_iterator))) m_accessor.set(v, m_iterator); } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator) + m_image->nrows(); } private: accessor m_accessor; }; template class ConstColIterator; template class ConstRowIterator : public RowIteratorBase, T> { public: using RowIteratorBase, T>::m_iterator; using RowIteratorBase, T>::m_image; // Typedefs for rows typedef ConstColIterator iterator; // Convenience typedefs typedef ConstRowIterator self; typedef RowIteratorBase base; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstRowIterator(Image* image, const T iterator) : base(image, iterator) { } ConstRowIterator() { } typename Image::value_type operator*() const { return get(); } value_type get() const { if (m_image->has_label(m_accessor(m_iterator))) return m_accessor(m_iterator); else return 0; } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator + m_image->ncols()); } private: accessor m_accessor; }; template class ConstColIterator : public ColIteratorBase, T> { public: using ColIteratorBase, T>::m_iterator; using ColIteratorBase, T>::m_image; // Typedefs for Cols typedef ConstRowIterator iterator; // Convenience typedefs typedef ConstColIterator self; typedef ColIteratorBase base; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstColIterator(Image* image, const T iterator) : base(image, iterator) { } ConstColIterator() { } typename Image::value_type operator*() const { return get(); } // Image specific value_type get() const { if (m_image->has_label(m_accessor(m_iterator))) return m_accessor(m_iterator); else return 0; } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator) + m_image->nrows(); } private: accessor m_accessor; }; template class VecIterator : public VecIteratorBase > { public: using VecIteratorBase >::m_coliterator; typedef VecIterator self; typedef VecIteratorBase base; typedef typename Image::value_type value_type; typedef MLCCProxy proxy_type; typedef ImageAccessor accessor; // Constructor VecIterator(const Row iterator) : base(iterator) { } VecIterator() { } // Operators proxy_type operator*() const { return proxy_type(m_coliterator.m_iterator, m_coliterator.m_image->get_labels_pointer()); } value_type get() const { if (m_coliterator.m_image->has_label(m_accessor(m_coliterator))) return m_accessor(m_coliterator); else return 0; } void set(const value_type& v) { if (m_coliterator.m_image->has_label(m_accessor(m_coliterator))) m_accessor.set(v, m_coliterator); } private: accessor m_accessor; }; template class ConstVecIterator : public VecIteratorBase > { public: using VecIteratorBase >::m_coliterator; typedef ConstVecIterator self; typedef VecIteratorBase base; typedef typename Image::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstVecIterator(const Row iterator) : base(iterator) { } ConstVecIterator() { } // Operators typename Image::value_type operator*() const { return get(); } value_type get() const { if (m_coliterator.m_image->has_label(m_accessor(m_coliterator))) return m_accessor(m_coliterator); else return 0; } private: accessor m_accessor; }; } // namespace } // namespace #endif gamera-3.3.3/include/dimensions.hpp0000644000076500000000000003345111741631156016261 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm11162001_dimensions_hpp #define kwm11162001_dimensions_hpp #include #include /* * This file contains the basic geometric types for Gamera. On one hand it is * absolutely silly that we have to implement these types of objects instead * of using something from the C++ 'standard'. On the other hand, some of these * have methods that are somewhat specific to document recognition. */ namespace Gamera { /** * The basic type used for all coordinates. An unsigned type is used - this can * be inconvenient at times, but it makes interaction with the image processing * layer a little easier. */ typedef size_t coord_t; /** * Point * * This is a simple class to hold a single coordinate on a plane (x/y value pair). */ class Point { private: coord_t m_x, m_y; public: /** * Default constructor - x and y are 0 */ Point() : m_x(0), m_y(0) { } /** * Construct a point for the given x and y coordinates. */ Point(coord_t x, coord_t y) : m_x(x), m_y(y) {} /// Return the x coordinate. coord_t x() const { return m_x; } /// Return the y coordinate. coord_t y() const { return m_y; } /// Set the x coordinate. void x(coord_t x) { m_x = x; } /// Set the y coordinate. void y(coord_t y) { m_y = y; } /// Move this point the the coordinates x and y void move(int x, int y) { m_x += x; m_y += y; } /// Equality operator bool operator==(const Point& x) const { return (m_x == x.m_x && m_y == x.m_y); } /// Inequality operator bool operator!=(const Point& x) const { return (m_x != x.m_x || m_y != x.m_y); } }; /* * There are size _and_ dimension objects so that users can use * whichever coordinate system is most natural. * * A single point Point(0,0) and Size(0, 0) or Dimensions(1, 1) */ /* * Size * * A simple class that holds width and height. These dimensions are * refer to nrows - 1 or ncols - 1. */ class Size { private: coord_t m_width, m_height; public: /// Default constructor - set width and height to 0 Size() : m_width(1), m_height(1) { } /// Construct a size object from width and height. Size(coord_t width, coord_t height) : m_width(width), m_height(height) {} /// Return the width coord_t width() const { return m_width; } /// Return the height coord_t height() const { return m_height; } /// Set the width void width(coord_t width) { m_width = width; } /// Set the height void height(coord_t height) { m_height = height; } /// Equality operator bool operator==(const Size& other) const { if (m_width == other.width() && m_height == other.height()) return true; else return false; } /// Inequality operator bool operator!=(const Size& other) const { if (m_width != other.width() || m_height != other.height()) return true; else return false; } }; /* * Dim * * A simple class that holds nrows and ncols. These dimensions are * refer to width or height + 1. */ class Dim { private: coord_t m_ncols, m_nrows; public: Dim() : m_ncols(1), m_nrows(1) { } Dim(coord_t cols, coord_t rows) : m_ncols(cols), m_nrows(rows) { } coord_t ncols() const { return m_ncols; } coord_t nrows() const { return m_nrows; } void ncols(coord_t ncols) { m_ncols = ncols; } void nrows(coord_t nrows) { m_nrows = nrows; } template bool operator==(const Other& other) const { if (m_ncols == other.ncols() && m_nrows == other.nrows()) return true; else return false; } template bool operator!=(const Other& other) const { if (m_ncols != other.ncols() || m_nrows != other.nrows()) return true; else return false; } }; /* * Rect * * A rectangle class */ class Rect { public: typedef Rect self; Rect() : m_origin(0, 0), m_lr(1, 1) { } Rect(const Point& upper_left, const Point& lower_right) : m_origin(upper_left), m_lr(lower_right) { } Rect(const Point& upper_left, const Size& size) : m_origin(upper_left), m_lr(upper_left.x() + size.width(), upper_left.y() + size.height()) { } Rect(const Point& upper_left, const Dim& dim) : m_origin(upper_left), m_lr(upper_left.x() + dim.ncols() - 1, upper_left.y() + dim.nrows() - 1) { } virtual ~Rect() { } // Get Point origin() const { return m_origin; } Point ul() const { return m_origin; } coord_t ul_x() const { return m_origin.x(); } coord_t ul_y() const { return m_origin.y(); } Point ur() const { return Point(m_lr.x(), m_origin.y()); } coord_t ur_x() const { return m_lr.x(); } coord_t ur_y() const { return m_origin.y(); } Point lr() const { return m_lr; } coord_t lr_x() const { return m_lr.x(); } coord_t lr_y() const { return m_lr.y(); } Point ll() const { return Point(m_origin.x(), m_lr.y()); } coord_t ll_x() const { return m_origin.x(); } coord_t ll_y() const { return m_lr.y(); } Dim dim() const { return Dim(ncols(), nrows()); } Size size() const { return Size(width(), height()); } coord_t ncols() const { return m_lr.x() - m_origin.x() + 1; } coord_t nrows() const { return m_lr.y() - m_origin.y() + 1; } coord_t width() const { return m_lr.x() - m_origin.x(); } coord_t height() const { return m_lr.y() - m_origin.y(); } coord_t offset_x() const { return m_origin.x(); } coord_t offset_y() const { return m_origin.y(); } Point center() const { return Point(center_x(), center_y()); } coord_t center_x() const { return m_origin.x() + width() / 2; } coord_t center_y() const { return m_origin.y() + height() / 2; } // Set void ul(const Point& ul) { m_origin = ul; dimensions_change(); } void ul_x(coord_t v) { m_origin.x(v); dimensions_change(); } void ul_y(coord_t v) { m_origin.y(v); dimensions_change(); } void ur(const Point& ur) { m_lr.x(ur.x()); m_origin.y(ur.y()); dimensions_change(); } void ur_x(coord_t v) { m_lr.x(v); dimensions_change(); } void ur_y(coord_t v) { m_origin.y(v); dimensions_change(); } void lr(const Point& lr) { m_lr = lr; dimensions_change(); } void lr_x(coord_t v) { m_lr.x(v); dimensions_change(); } void lr_y(coord_t v) { m_lr.y(v); dimensions_change(); } void ll(const Point& ll) { m_origin.x(ll.x()); m_lr.y(ll.y()); dimensions_change(); } void ll_x(coord_t v) { m_origin.x(v); dimensions_change(); } void ll_y(coord_t v) { m_lr.y(v); dimensions_change(); } void dim(const Dim& dim) { nrows(dim.nrows()); ncols(dim.ncols()); dimensions_change(); } void ncols(coord_t v) { m_lr.x(m_origin.x() + v - 1); dimensions_change(); } void nrows(coord_t v) { m_lr.y(m_origin.y() + v - 1); dimensions_change(); } void size(const Size& size) { width(size.width()); height(size.height()); dimensions_change(); } void size(coord_t width, coord_t height) { this->width(width); this->height(height); dimensions_change(); } void width(coord_t width) { m_lr.x(m_origin.x() + width); dimensions_change(); } void height(coord_t height) { m_lr.y(m_origin.y() + height); dimensions_change(); } void rect_set(const Point& upper_left, const Point& lower_right) { m_origin = upper_left; m_lr = lower_right; dimensions_change(); } void rect_set(const Point& upper_left, const Size& size) { m_origin = upper_left; this->size(size); dimensions_change(); } void rect_set(const Point& upper_left, const Dim& dim_) { m_origin = upper_left; dim(dim_); dimensions_change(); } void offset_x(coord_t v) { m_origin.x(v); dimensions_change(); } void offset_y(coord_t v) { m_origin.y(v); dimensions_change(); } void move(int x, int y) { m_origin.move(x, y); m_lr.move(x, y); } // containment bool contains_x(coord_t v) const { if (v >= ul_x() && v <= lr_x()) return true; else return false; } bool contains_y(coord_t v) const { if (v >= ul_y() && v <= lr_y()) return true; else return false; } bool contains_point(const Point& v) const { if (contains_x(v.x()) && contains_y(v.y())) return true; else return false; } bool contains_rect(const self& v) const { if (contains_point(v.ul()) && contains_point(v.lr())) return true; else return false; } Rect expand(size_t expansion) const { return Rect(Point(size_t(std::max((long)ul_x() - (long)expansion, 0l)), size_t(std::max((long)ul_y() - (long)expansion, 0l))), Point(size_t((long)lr_x() + expansion + 1), size_t((long)lr_y() + expansion + 1))); } // intersection bool intersects_x(const self& v) const { coord_t sul = ul_x(); coord_t slr = lr_x(); coord_t vul = v.ul_x(); coord_t vlr = v.lr_x(); return (((vul >= sul) && (vul <= slr)) || ((vlr >= sul) && (vlr <= slr)) || ((sul >= vul) && (sul <= vlr)) || ((slr >= vul) && (slr <= vlr))); } bool intersects_y(const self& v) const { coord_t sul = ul_y(); coord_t slr = lr_y(); coord_t vul = v.ul_y(); coord_t vlr = v.lr_y(); return (((vul >= sul) && (vul <= slr)) || ((vlr >= sul) && (vlr <= slr)) || ((sul >= vul) && (sul <= vlr)) || ((slr >= vul) && (slr <= vlr))); } bool intersects(const self& v) const { return (intersects_x(v) && intersects_y(v)); } Rect intersection(const self& other) const { size_t ulx = std::max(ul_x(), other.ul_x()); size_t uly = std::max(ul_y(), other.ul_y()); size_t lrx = std::min(lr_x(), other.lr_x()); size_t lry = std::min(lr_y(), other.lr_y()); return Rect(Point(ulx, uly), Point(lrx, lry)); } // Equality bool operator==(const Rect& other) const { if (m_origin == other.m_origin && m_lr == other.m_lr) return true; else return false; } bool operator!=(const Rect& other) const { if (m_origin != other.m_origin || m_lr != other.m_lr) return true; else return false; } // union static Rect* union_rects(std::vector &rects) { size_t min_x, min_y, max_x, max_y; min_x = min_y = std::numeric_limits::max(); max_x = max_y = 0; for (std::vector::iterator i = rects.begin(); i != rects.end(); ++i) { Rect* rect = (*i); min_x = std::min(min_x, rect->ul_x()); min_y = std::min(min_y, rect->ul_y()); max_x = std::max(max_x, rect->lr_x()); max_y = std::max(max_y, rect->lr_y()); } return new Rect(Point(min_x, min_y), Point(max_x, max_y)); } void union_rect(const self& other) { ul_y(std::min(ul_y(), other.ul_y())); lr_y(std::max(lr_y(), other.lr_y())); ul_x(std::min(ul_x(), other.ul_x())); lr_x(std::max(lr_x(), other.lr_x())); } // distance double distance_euclid(const self& other) { return euclid(center_x(), center_y(), other.center_x(), other.center_y()); } coord_t distance_cx(const self& other) { coord_t cx = center_x(); coord_t other_cx = other.center_x(); if (cx > other_cx) return cx - other_cx; else return other_cx - cx; } coord_t distance_cy(const self& other) { coord_t cy = center_y(); coord_t other_cy = other.center_y(); if (cy > other_cy) return cy - other_cy; else return other_cy - cy; } double distance_bb(const self& other) { double min_y = (double)std::min (std::min(abs((long)ul_y() - (long)other.ul_y()), abs((long)ul_y() - (long)other.lr_y())), std::min(abs((long)lr_y() - (long)other.ul_y()), abs((long)lr_y() - (long)other.lr_y()))); double min_x = (double)std::min (std::min(abs((long)ul_x() - (long)other.ul_x()), abs((long)ul_x() - (long)other.lr_x())), std::min(abs((long)lr_x() - (long)other.ul_x()), abs((long)lr_x() - (long)other.lr_x()))); return std::sqrt(min_y*min_y + min_x*min_x); } private: double euclid(coord_t x1, coord_t y1, coord_t x2, coord_t y2) { double dx1 = (double)x1; double dy1 = (double)y1; double dx2 = (double)x2; double dy2 = (double)y2; double a = std::pow(std::abs(dx1 - dx2), 2); double b = std::pow(std::abs(dy1 - dy2), 2); return std::sqrt(a + b); } protected: virtual void dimensions_change() { } private: Point m_origin, m_lr; }; }; #endif gamera-3.3.3/include/floatpoint.hpp0000644000076500000000000000613311652050140016252 0ustar chriswheel/* * * Copyright (C) 2005 Michael Droettboom * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd_floatpoint #define mgd_floatpoint #include "gamera.hpp" #include template class PointBase { private: T m_x, m_y; public: typedef PointBase self; // Default constructor inline PointBase() : m_x(), m_y() {} // Basic constructor inline PointBase(T x, T y) : m_x(x), m_y(y) {} // From standard Gamera point inline PointBase(const Gamera::Point& p) : m_x(T(p.x())), m_y(T(p.y())) {} // Copy constructor inline PointBase(const self& p) : m_x(p.x()), m_y(p.y()) {} // Return the x coordinate inline T x() const { return m_x; } // Return the y coordinate inline T y() const { return m_y; } // Equality template inline bool operator==(const OtherPoint& p) const { T e = std::numeric_limits::epsilon(); return (std::abs(m_x - T(p.x())) < e && std::abs(m_y - T(p.y())) < e); } // Inequality template inline bool operator!=(const OtherPoint& p) const { return (m_x != T(p.x()) || m_y != T(p.y())); } // Addition template inline self operator+(const OtherPoint& p) const { return self(m_x + T(p.x()), m_y + T(p.y())); } // Subtraction template inline self operator-(const OtherPoint& p) const { return self(m_x - T(p.x()), m_y - T(p.y())); } // Multiplication template inline self operator*(const OtherPoint& p) const { return self(m_x * T(p.x()), m_y * T(p.y())); } // Division template inline self operator/(const OtherPoint& p) const { return self(m_x / T(p.x()), m_y / T(p.y())); } // Unary minus inline self operator-() const { return self(-m_x, -m_y); } // Unary plus inline self operator+() const { return self(+m_x, +m_y); } // Euclidean distance template inline T distance(const OtherPoint& p) const { T x_dist = m_x - T(p.x()); T y_dist = m_y - T(p.y()); return std::sqrt(x_dist*x_dist + y_dist*y_dist); } }; template inline static PointBase abs(PointBase p) { return PointBase(std::abs(p.x()), std::abs(p.y())); } template std::ostream& operator<<(std::ostream& s, const PointBase& point) { return s << "FloatPoint(" << point.x() << ", " << point.y() << ")"; } typedef PointBase FloatPoint; #endif gamera-3.3.3/include/gamera.hpp0000644000076500000000000001234011652050140015324 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm01032002_gamera_hpp #define kwm01032002_gamera_hpp /* The bulk of gamera is in the following includes - this file is simply for convenience. */ /* Deprecation of functions This stuff handles the deprecation of certain method signatures from Gamera 2.x - 3.x. Unfortunately this stuff only works on gcc, and not on mingw gcc. */ #if GAMERA_INCLUDE_DEPRECATED == 1 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) #define GAMERA_CPP_DEPRECATED \ __attribute__((__deprecated__)) #else #define GAMERA_CPP_DEPRECATED #endif /* __GNUC__ */ #define GAMERA_DEPRECATED #undef GAMERA_NO_DEPRECATED #else /* GAMERA_INCLUDE_DEPRECATED */ #define GAMERA_CPP_DEPRECATED #define GAMERA_NO_DEPRECATED #undef GAMERA_DEPRECATED #endif /* GAMERA_INCLUDE_DEPRECATED */ #include #include #include "pixel.hpp" #include "dimensions.hpp" #include "floatpoint.hpp" #include "image_info.hpp" #include "image_algorithm.hpp" #include "utility.hpp" #include "image_view.hpp" #include "connected_components.hpp" #include "image_data.hpp" #include "rle_data.hpp" #include "image.hpp" #include "region.hpp" #include "static_image.hpp" #include "vigra_support.hpp" #include "image_types.hpp" #include "accessor.hpp" namespace Gamera { /* * This file contains a few typedefs to make standard classes * easier to use. */ /*********************************************************** * FEATURES ***********************************************************/ /** * Image feature type. * * The feature_t is a typedef for a floating point type * used for all of the feature calculation functions * in Gamera. */ typedef double feature_t; /** * Floating-point vector. * * The Gamera::FloatVector type is used to pass arrays of * floating-point data. Each element is of type feature_t * and the container is a std::vector. */ typedef std::vector FloatVector; /*********************************************************** * UTILITY ***********************************************************/ /** * String Vector. * * The Gamera::StringVectors is a std::vector of std::strings. */ typedef std::vector StringVector; /** * ImageVector Vector. * * The Gamera::ImageVectors is a std::vector of pairs of Image* and image type codes. */ typedef std::vector > ImageVector; typedef std::list ImageList; /** * Int Vector. * * The Gamera::IntVector type is used to pass arrays of * integers types. The container is a std::vector. */ typedef std::vector IntVector; /** * SignedIntVector * * The Gamera::SignedIntVector type is used to pass arrays * of signed integer types. In previous versions this was * different from Gamera::IntVectors, which held unsigned * types. Currently, however, IntVector and SignedIntVector * are the same. */ typedef std::vector SignedIntVector; /** * ComplexVector * * The Gamera::ComplexVector type is used to pass arrays * of the complex type. */ typedef std::vector ComplexVector; /** * Region * * The Gamera::Region type is used to associate a rectangular * areas on an image with a set of values. These values are stored * as key/value pairs (string/double). See RegionTemplate for more * information. */ typedef RegionTemplate Region; /** * Region Map * * The Gamera::RegionMap type is a list of regions. Regions can be * added to the list and searched for by position. */ typedef RegionMapTemplate RegionMap; /** * Colors * * Gamera::color_set is a standard set of colors for use whenever * colors need to be applied to an image. By limiting the size to * eight it makes it easy to pick an arbitrary color by bitwise * operators on pixels. */ static const int COLOR_SET_SIZE = 8; const unsigned char color_set[COLOR_SET_SIZE][3] = { {0xbc, 0x2d, 0x2d}, // Red {0xb4, 0x2d, 0xbc}, // Magenta {0x2d, 0x34, 0xbc}, // Blue {0x2d, 0xbc, 0xb7}, // Cyan {0x3a, 0xbc, 0x2d}, // Green {0xbc, 0xb7, 0x2d}, // Yellow {0xbc, 0x88, 0x2d}, // Orange {0x6e, 0x00, 0xc7} // Purple }; /** * Point Vector * * For managing lists of points */ typedef std::vector PointVector; template static inline T sign(const T& x) { return ((x) > 0 ? 1 : (x) < 0 ? -1 : 0); } } #endif gamera-3.3.3/include/gamera_limits.hpp0000644000076500000000000000264711652050140016716 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Many compilers (including gcc) don't have the standard header that (amoung other things) defines numeric_limits. This header will include the standard header unless GAMERA_USE_BOOST_LIMITS macro is defined; if it is defined it will include the boost version that the boost developers created because they were so tired of compilers not including . */ #ifndef kwm03182002_gamera_limits #define kwm03182002_gamera_limits #ifdef __GNUC__ #if __GNUC__ < 3 #define GAMERA_USE_BOOST_LIMITS #endif #endif #ifdef GAMERA_USE_BOOST_LIMITS #include "boost_limits.hpp" #else #include #endif #endif gamera-3.3.3/include/gameramodule.hpp0000644000076500000000000011633111652050140016537 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2009 Christoph Dalitz, Jonathan Koch * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef KWM06292002_imagemodule #define KWM06292002_imagemodule #include #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #endif #if PY_VERSION_HEX < 0x02050000 #define CHAR_PTR_CAST (char *) #else #define CHAR_PTR_CAST #endif #include "gamera.hpp" /* This file holds the C++ interface for the Python objects that wrap the core Gamera C++ objects. Each object has the struct for the Python object, a type-checking function, and a factory to create an instance of the Python type from the corresponding C++ type. Only the Python instance struct is exported here - the type struct is not exported, but is available via the object->tp_type field in the instance struct and through a function. Some of the functions here come in 2 versions - one is located in the CPP files for each of the types and is available within the gameracore module (i.e. in the CPP files that are linked into gameracore). The other is inlined so that it is available to all of the gamera plugins. The inline versions are less efficient because they have to lookup the types at runtime. */ /* Utilities */ /* Get the dictionary for a module by name. This does all of the error handling for you to get the dictionary for a module. Returns the module on success of NULL on failure with the error set. */ inline PyObject* get_module_dict(const char* module_name) { PyObject* mod = PyImport_ImportModule(CHAR_PTR_CAST module_name); if (mod == 0) return PyErr_Format(PyExc_ImportError, "Unable to load module '%s'.\n", module_name); PyObject* dict = PyModule_GetDict(mod); if (dict == 0) return PyErr_Format(PyExc_RuntimeError, "Unable to get dict for module '%s'.\n", module_name); Py_DECREF(mod); return dict; } /* Sends a DeprecationWarning */ inline int send_deprecation_warning(const char* message, const char* filename, int lineno) { static PyObject* dict = 0; if (dict == 0) dict = get_module_dict("gamera.util"); static PyObject* py_warning_func = 0; if (py_warning_func == 0) py_warning_func = PyDict_GetItemString(dict, "warn_deprecated"); PyObject* result = PyObject_CallFunction(py_warning_func, (char *)"ssii", message, filename, lineno, 1); if (result == 0) return 0; Py_DECREF(result); return 1; } /* Get the dictionary for gameracore. This uses get_module_dict above, but caches the result for faster lookups in subsequent calls. */ inline PyObject* get_gameracore_dict() { static PyObject* dict = 0; if (dict == 0) dict = get_module_dict("gamera.gameracore"); return dict; } #ifndef GAMERACORE_INTERNAL inline PyObject* get_ArrayInit() { static PyObject* t = 0; if (t == 0) { PyObject* array_module = PyImport_ImportModule(CHAR_PTR_CAST "array"); if (array_module == 0) { PyErr_SetString(PyExc_ImportError, "Unable to get 'array' module.\n"); return 0; } PyObject* array_dict = PyModule_GetDict(array_module); if (array_dict == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get 'array' module dictionary.\n"); return 0; } t = PyDict_GetItemString(array_dict, "array"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get 'array' object.\n"); return 0; } Py_DECREF(array_module); } return t; } inline PyObject* get_ArrayAppend() { static PyObject* t = 0; if (t == 0) { PyObject* array_init = get_ArrayInit(); if (array_init == 0) return 0; t = PyObject_GetAttrString(array_init, CHAR_PTR_CAST "append"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get 'array' append method.\n"); return 0; } } return t; } #endif /* SIZE OBJECT */ struct SizeObject { PyObject_HEAD Size* m_x; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_SizeType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "Size"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get Size type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_SizeType(); #endif inline bool is_SizeObject(PyObject* x) { PyTypeObject* t = get_SizeType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_SizeObject(const Size& d) { PyTypeObject* t = get_SizeType(); if (t == 0) return 0; SizeObject* so; so = (SizeObject*)t->tp_alloc(t, 0); so->m_x = new Size(d); return (PyObject*)so; } /* DIM OBJECT */ struct DimObject { PyObject_HEAD Dim* m_x; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_DimType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "Dim"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get Dim type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_DimType(); #endif inline bool is_DimObject(PyObject* x) { PyTypeObject* t = get_DimType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_DimObject(const Dim& d) { PyTypeObject* t = get_DimType(); if (t == 0) return 0; DimObject* so; so = (DimObject*)t->tp_alloc(t, 0); so->m_x = new Dim(d); return (PyObject*)so; } /* POINT OBJECT */ struct PointObject { PyObject_HEAD Point* m_x; }; struct FloatPointObject { PyObject_HEAD FloatPoint* m_x; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_PointType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "Point"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get Point type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_PointType(); #endif #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_FloatPointType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "FloatPoint"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get FloatPoint type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_FloatPointType(); #endif inline bool is_PointObject(PyObject* x) { PyTypeObject* t = get_PointType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_PointObject(const Point& d) { PyTypeObject* t = get_PointType(); if (t == 0) return 0; PointObject* so; so = (PointObject*)t->tp_alloc(t, 0); so->m_x = new Point(d); return (PyObject*)so; } inline Point coerce_Point(PyObject* obj) { // Fast method if the Point is a real Point type. PyTypeObject* t2 = get_PointType(); if (t2 == 0) { PyErr_SetString(PyExc_RuntimeError, "Couldn't get Point type."); throw std::runtime_error("Couldn't get Point type."); } if (PyObject_TypeCheck(obj, t2)) return Point(*(((PointObject*)obj)->m_x)); PyTypeObject* t = get_FloatPointType(); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Couldn't get FloatPoint type."); throw std::runtime_error("Couldn't get FloatPoint type."); } if (PyObject_TypeCheck(obj, t)) { FloatPoint* fp = ((FloatPointObject*)obj)->m_x; return Point(size_t(fp->x()), size_t(fp->y())); } PyObject* py_x0 = NULL; PyObject* py_y0 = NULL; PyObject* py_x1 = NULL; PyObject* py_y1 = NULL; // Treat 2-element sequences as Points. if (PySequence_Check(obj)) { if (PySequence_Length(obj) == 2) { py_x0 = PySequence_GetItem(obj, 0); py_x1 = PyNumber_Int(py_x0); if (py_x1 != NULL) { long x = PyInt_AsLong(py_x1); Py_DECREF(py_x1); py_y0 = PySequence_GetItem(obj, 1); py_y1 = PyNumber_Int(py_y0); if (py_y1 != NULL) { long y = PyInt_AsLong(py_y1); Py_DECREF(py_y1); return Point((size_t)x, (size_t)y); } } } } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Argument is not a Point (or convertible to one.)"); throw std::invalid_argument("Argument is not a Point (or convertible to one.)"); } /* FLOATPOINT OBJECT */ inline FloatPoint coerce_FloatPoint(PyObject* obj) { // Fast method if the Point is a real FloatPoint or Point type. PyTypeObject* t = get_FloatPointType(); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Couldn't get FloatPoint type."); throw std::runtime_error("Couldn't get FloatPoint type."); } if (PyObject_TypeCheck(obj, t)) { return FloatPoint(*(((FloatPointObject*)obj)->m_x)); } PyTypeObject* t2 = get_PointType(); if (t2 == 0) { PyErr_SetString(PyExc_RuntimeError, "Couldn't get Point type."); throw std::runtime_error("Couldn't get Point type."); } if (PyObject_TypeCheck(obj, t2)) return FloatPoint(*(((PointObject*)obj)->m_x)); PyObject* py_x0 = NULL; PyObject* py_y0 = NULL; PyObject* py_x1 = NULL; PyObject* py_y1 = NULL; // Treat 2-element sequences as Points. if (PySequence_Check(obj)) { if (PySequence_Length(obj) == 2) { py_x0 = PySequence_GetItem(obj, 0); py_x1 = PyNumber_Float(py_x0); if (py_x1 != NULL) { double x = PyFloat_AsDouble(py_x1); Py_DECREF(py_x1); py_y0 = PySequence_GetItem(obj, 1); py_y1 = PyNumber_Float(py_y0); if (py_y1 != NULL) { double y = PyFloat_AsDouble(py_y1); Py_DECREF(py_y1); return FloatPoint(x, y); } } } } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Argument is not a FloatPoint (or convertible to one.)"); throw std::invalid_argument("Argument is not a FloatPoint (or convertible to one.)"); } inline PyObject* create_FloatPointObject(const FloatPoint& d) { PyTypeObject* t = get_FloatPointType(); if (t == 0) return 0; FloatPointObject* so; so = (FloatPointObject*)t->tp_alloc(t, 0); so->m_x = new FloatPoint(d); return (PyObject*)so; } /* RECT OBJECT */ struct RectObject { PyObject_HEAD Rect* m_x; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_RectType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "Rect"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get Rect type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_RectType(); #endif inline bool is_RectObject(PyObject* x) { PyTypeObject* t = get_RectType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_RectObject(const Rect& d) { PyTypeObject* t = get_RectType(); if (t == 0) return 0; RectObject* so; so = (RectObject*)t->tp_alloc(t, 0); so->m_x = new Rect(d); return (PyObject*)so; } /* RGB Pixel OBJECT */ struct RGBPixelObject { PyObject_HEAD RGBPixel* m_x; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_RGBPixelType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "RGBPixel"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get RGBPixel type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_RGBPixelType(); #endif inline bool is_RGBPixelObject(PyObject* x) { PyTypeObject* t = get_RGBPixelType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_RGBPixelObject(const RGBPixel& d) { PyTypeObject* t = get_RGBPixelType(); if (t == 0) return 0; RGBPixelObject* so; so = (RGBPixelObject*)t->tp_alloc(t, 0); so->m_x = new RGBPixel(d); return (PyObject*)so; } /* REGION OBJECT */ struct RegionObject { PyObject_HEAD RectObject m_parent; // we inheric from Rect }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_RegionType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "Region"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get Region type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_RegionType(); #endif inline bool is_RegionObject(PyObject* x) { PyTypeObject* t = get_RegionType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_RegionObject(const Region& d) { PyTypeObject* t = get_RegionType(); if (t == 0) return 0; RegionObject* so; so = (RegionObject*)t->tp_alloc(t, 0); ((RectObject*)so)->m_x = new Region(d); return (PyObject*)so; } /* REGION MAP OBJECT */ struct RegionMapObject { PyObject_HEAD RegionMap* m_x; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_RegionMapType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "RegionMap"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get RegionMap type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_RegionMapType(); #endif inline bool is_RegionMapObject(PyObject* x) { PyTypeObject* t = get_RegionMapType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_RegionMapObject(const RegionMap& d) { PyTypeObject* t = get_RegionMapType(); if (t == 0) return 0; RegionMapObject* so; so = (RegionMapObject*)t->tp_alloc(t, 0); so->m_x = new RegionMap(d); return (PyObject*)so; } /* IMAGE DATA OBJECT */ struct ImageDataObject { PyObject_HEAD ImageDataBase* m_x; int m_pixel_type; int m_storage_format; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_ImageDataType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "ImageData"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get ImageData type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_ImageDataType(); #endif inline bool is_ImageDataObject(PyObject* x) { PyTypeObject* t = get_ImageDataType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_ImageDataObject(const Dim& dim, const Point& offset, int pixel_type, int storage_format) { ImageDataObject* o; PyTypeObject* id_type = get_ImageDataType(); if (id_type == 0) return 0; o = (ImageDataObject*)id_type->tp_alloc(id_type, 0); o->m_pixel_type = pixel_type; o->m_storage_format = storage_format; if (storage_format == DENSE) { if (pixel_type == ONEBIT) o->m_x = new ImageData(dim, offset); else if (pixel_type == GREYSCALE) o->m_x = new ImageData(dim, offset); else if (pixel_type == GREY16) o->m_x = new ImageData(dim, offset); // We have to explicity declare which FLOAT we want here, since there // is a name clash on Mingw32 with a typedef in windef.h else if (pixel_type == Gamera::FLOAT) o->m_x = new ImageData(dim, offset); else if (pixel_type == RGB) o->m_x = new ImageData(dim, offset); else if (pixel_type == Gamera::COMPLEX) o->m_x = new ImageData(dim, offset); else { PyErr_Format(PyExc_TypeError, "Unknown pixel type '%d'.", pixel_type); return 0; } } else if (storage_format == RLE) { if (pixel_type == ONEBIT) o->m_x = new RleImageData(dim, offset); else { PyErr_SetString(PyExc_TypeError, "Pixel type must be ONEBIT when storage format is RLE."); return 0; } } else { PyErr_SetString(PyExc_TypeError, "Unknown pixel type/storage format combination."); return 0; } o->m_x->m_user_data = (void*)o; return (PyObject*)o; } #ifdef GAMERA_DEPRECATED /* create_ImageDataObject(int nrows, int ncols, int page_offset_y, int page_offset_x, int pixel_type, int storage_format) is deprecated. Reason: (x, y) coordinate consistency. Use create_ImageDataObject(Dim(nrows, ncols), Point(page_offset_x, page_offset_y), pixel_type, storage_format) instead. */ GAMERA_CPP_DEPRECATED inline PyObject* create_ImageDataObject(int nrows, int ncols, int page_offset_y, int page_offset_x, int pixel_type, int storage_format) { return create_ImageDataObject(Dim(ncols, nrows), Point(page_offset_x, page_offset_y), pixel_type, storage_format); } #endif /* IMAGE OBJECT */ struct ImageObject { RectObject m_parent; // we inherit from Rect PyObject* m_data; // an ImageDataObject for ref counting /* Classification related members */ PyObject* m_features; // an array of doubles (Python array module) PyObject* m_id_name; // a list of strings for the classified ids PyObject* m_children_images; // list of images PyObject* m_classification_state; // how (or whether) an image is classified // PyObject* m_region_maps; // RegionMap object - see the object docs // PyObject* m_region_map; // Current global region map // PyObject* m_action_depth; // for limiting recursions for "actions" PyObject* m_weakreflist; // for Python weak references PyObject* m_confidence; // mapping of confidence values for id_name[0] }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_ImageType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "Image"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get Image type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_ImageType(); #endif inline bool is_ImageObject(PyObject* x) { PyTypeObject* t = get_ImageType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } /* SUB IMAGE OBJECT The SubImage object is here simply to allow type checking and to provide a natural form of constructor overloading - otherwise it is identical to the ImageObject. */ struct SubImageObject { ImageObject m_parent; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_SubImageType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "SubImage"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get SubImage type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_SubImageType(); #endif inline bool is_SubImageObject(PyObject* x) { PyTypeObject* t = get_SubImageType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } /* CC TYPE ConnectedComponents are a special case of image - a separate class is used for clarity and type checking. Like the SubImageObject it is almost identical to an ImageObject. */ struct CCObject { ImageObject m_parent; }; struct MLCCObject { ImageObject m_parent; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_CCType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "Cc"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get CC type from gamera.gameracore.\n"); return 0; } } return t; } inline PyTypeObject* get_MLCCType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "MlCc"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get MlCc type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_CCType(); extern PyTypeObject* get_MLCCType(); #endif inline bool is_CCObject(PyObject* x) { PyTypeObject* t = get_CCType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline bool is_MLCCObject(PyObject* x) { PyTypeObject* t = get_MLCCType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } /* Image type information and type checking utilities */ // get the storage format - no type checking is performed inline int get_storage_format(PyObject* image) { return ((ImageDataObject*)((ImageObject*)image)->m_data)->m_storage_format; } // get the pixel type - no type checking is performed inline int get_pixel_type(PyObject* image) { return ((ImageDataObject*)((ImageObject*)image)->m_data)->m_pixel_type; } inline const char* get_pixel_type_name(PyObject* image) { int pixel_type = get_pixel_type(image); const char* pixel_type_names[6] = {"OneBit", "GreyScale", "Grey16", "RGB", "Float", "Complex"}; if (pixel_type >= 0 && pixel_type < 6) return pixel_type_names[pixel_type]; else return "Unknown pixel type"; } // get the combination of pixel and image type inline int get_image_combination(PyObject* image) { int storage = get_storage_format(image); if (is_CCObject(image)) { if (storage == Gamera::RLE){ return Gamera::RLECC; } else if (storage == Gamera::DENSE){ return Gamera::CC; } else return -1; } else if (is_MLCCObject(image)) { if (storage == Gamera::DENSE){ return Gamera::MLCC; } else return -1; } else if (storage == Gamera::RLE) { return Gamera::ONEBITRLEIMAGEVIEW; } else if (storage == Gamera::DENSE) { return get_pixel_type(image); } else { return -1; } } /* This initializes all of the non-image members of an Image class. */ inline PyObject* init_image_members(ImageObject* o) { /* Create the features array. This will load the array module (if required) and create an array object containing doubles. */ static PyObject* array_func = 0; if (array_func == 0) { PyObject* array_module = PyImport_ImportModule(CHAR_PTR_CAST "array"); if (array_module == 0) return 0; PyObject* array_dict = PyModule_GetDict(array_module); if (array_dict == 0) return 0; array_func = PyDict_GetItemString(array_dict, "array"); if (array_func == 0) return 0; Py_DECREF(array_module); } PyObject* arglist = Py_BuildValue(CHAR_PTR_CAST "(s)", CHAR_PTR_CAST "d"); o->m_features = PyObject_CallObject(array_func, arglist); Py_DECREF(arglist); if (o->m_features == 0) return 0; // id_name o->m_id_name = PyList_New(0); if (o->m_id_name == 0) return 0; // Children Images o->m_children_images = PyList_New(0); if (o->m_children_images == 0) return 0; // Classification state // o->m_classification_state = Py_BuildValue("i", UNCLASSIFIED); o->m_classification_state = PyInt_FromLong(UNCLASSIFIED); if (o->m_classification_state == 0) return 0; // confidence o->m_confidence = PyDict_New(); if (o->m_confidence == 0) return 0; return (PyObject*)o; } /* Create an ImageObject from a given ImageBase object. This requires using RTTI to determine the type of the object so that the pixel_type and storage format parameters can be filled in the ImageDataObject correctly. Additionally, the only way to determine whether this should be an ImageObject or a SubImage object is to see if the image completely covers the image data. Finally, because we want to create the subclasses in gamera.py of the objects defined here, we have to pass in those types to this function (the types are determined at module loading time). */ inline PyObject* create_ImageObject(Image* image) { static bool initialized = false; static PyTypeObject *image_type, *subimage_type, *cc_type, *mlcc_type, *image_data; static PyObject* pybase_init; if (!initialized) { PyObject* dict = get_module_dict("gamera.core"); if (dict == 0) return 0; pybase_init = PyObject_GetAttrString(PyDict_GetItemString(dict, "ImageBase"), CHAR_PTR_CAST "__init__"); image_type = (PyTypeObject*)PyDict_GetItemString(dict, "Image"); subimage_type = (PyTypeObject*)PyDict_GetItemString(dict, "SubImage"); cc_type = (PyTypeObject*)PyDict_GetItemString(dict, "Cc"); mlcc_type = (PyTypeObject*)PyDict_GetItemString(dict, "MlCc"); image_data = (PyTypeObject*)PyDict_GetItemString(dict, "ImageData"); initialized = true; } int pixel_type; int storage_type; bool cc = false; bool mlcc =false; if (dynamic_cast(image) != 0) { pixel_type = Gamera::ONEBIT; storage_type = Gamera::DENSE; cc = true; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::ONEBIT; storage_type = Gamera::DENSE; mlcc = true; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::ONEBIT; storage_type = Gamera::DENSE; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::GREYSCALE; storage_type = Gamera::DENSE; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::GREY16; storage_type = Gamera::DENSE; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::FLOAT; storage_type = Gamera::DENSE; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::RGB; storage_type = Gamera::DENSE; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::COMPLEX; storage_type = Gamera::DENSE; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::ONEBIT; storage_type = Gamera::RLE; } else if (dynamic_cast(image) != 0) { pixel_type = Gamera::ONEBIT; storage_type = Gamera::RLE; cc = true; } else { PyErr_SetString(PyExc_TypeError, "Unknown Image type returned from plugin. Receiving this error indicates an internal inconsistency or memory corruption. Please report it on the Gamera mailing list."); return 0; } ImageDataObject* d; if (image->data()->m_user_data == 0) { d = (ImageDataObject*)image_data->tp_alloc(image_data, 0); d->m_pixel_type = pixel_type; d->m_storage_format = storage_type; d->m_x = image->data(); image->data()->m_user_data = (void*)d; } else { d = (ImageDataObject*)image->data()->m_user_data; Py_INCREF(d); } ImageObject* i; if (cc) { i = (ImageObject*)cc_type->tp_alloc(cc_type, 0); } else if (mlcc) { i = (ImageObject*)mlcc_type->tp_alloc(mlcc_type, 0); } else if (image->nrows() < image->data()->nrows() || image->ncols() < image->data()->ncols()) { i = (ImageObject*)subimage_type->tp_alloc(subimage_type, 0); } else { i = (ImageObject*)image_type->tp_alloc(image_type, 0); } i->m_data = (PyObject*)d; ((RectObject*)i)->m_x = image; PyObject* args = Py_BuildValue(CHAR_PTR_CAST "(O)", (PyObject*)i); PyObject* result = PyObject_CallObject(pybase_init, args); Py_DECREF(args); if (result == 0) return 0; Py_DECREF(result); return init_image_members(i); } /* IMAGEINFO TYPE Holds information about an image - primarily used for opening images. */ struct ImageInfoObject { PyObject_HEAD ImageInfo* m_x; }; #ifndef GAMERACORE_INTERNAL inline PyTypeObject* get_ImageInfoType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "ImageInfo"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get ImageInfo type from gamera.gameracore.\n"); return 0; } } return t; } #else extern PyTypeObject* get_ImageInfoType(); #endif inline bool is_ImageInfoObject(PyObject* x) { PyTypeObject* t = get_ImageInfoType(); if (t == 0) return 0; return PyObject_TypeCheck(x, t); } inline PyObject* create_ImageInfoObject(ImageInfo* x) { PyTypeObject* info_type = get_ImageInfoType(); if (info_type == 0) return 0; ImageInfoObject* o; o = (ImageInfoObject*)info_type->tp_alloc(info_type, 0); o->m_x = x; return (PyObject*)o; } #ifndef GAMERACORE_INTERNAL inline PyObject* ImageList_to_python(std::list* image_list) { PyObject* pylist = PyList_New(image_list->size()); std::list::iterator it = image_list->begin(); for (size_t i = 0; i < image_list->size(); ++i, ++it) { PyObject *item = create_ImageObject(*it); PyList_SetItem(pylist, i, item); } return pylist; } inline PyObject* FloatVector_to_python(FloatVector* cpp) { PyObject* array_init = get_ArrayInit(); if (array_init == 0) return 0; PyObject* str = PyString_FromStringAndSize((char*)(&((*cpp)[0])), cpp->size() * sizeof(double)); PyObject* py = PyObject_CallFunction(array_init, (char *)"sO", (char *)"d", str); Py_DECREF(str); return py; } inline PyObject* ComplexVector_to_python(ComplexVector* cpp) { PyObject* py = PyList_New(cpp->size()); for (size_t i = 0; i < cpp->size(); ++i) { ComplexPixel& px = (*cpp)[i]; PyObject* complex = PyComplex_FromDoubles(px.real(), px.imag()); PyList_SET_ITEM(py, i, complex); } return py; } inline PyObject* IntVector_to_python(IntVector* cpp) { PyObject* array_init = get_ArrayInit(); if (array_init == 0) return 0; PyObject* str = PyString_FromStringAndSize((char*)(&((*cpp)[0])), cpp->size() * sizeof(int)); PyObject* py = PyObject_CallFunction(array_init, (char *)"sO", (char *)"i", str); Py_DECREF(str); return py; } inline PyObject* PointVector_to_python(PointVector* cpp) { PyObject* py = PyList_New(cpp->size()); for (size_t i = 0; i < cpp->size(); ++i) { PyObject* point = create_PointObject(Point((*cpp)[i])); Py_INCREF(point); // leak? PyList_SetItem(py, i, point); } return py; } inline FloatVector* FloatVector_from_python(PyObject* py) { PyObject* seq = PySequence_Fast(py, "Argument must be a sequence of floats."); if (seq == NULL) return 0; int size = PySequence_Fast_GET_SIZE(seq); FloatVector* cpp = new FloatVector(size); try { for (int i = 0; i < size; ++i) { PyObject* number = PySequence_Fast_GET_ITEM(seq, i); if (!PyFloat_Check(number)) { delete cpp; PyErr_SetString(PyExc_TypeError, "Argument must be a sequence of floats."); Py_DECREF(seq); return 0; } (*cpp)[i] = (double)PyFloat_AsDouble(number); } } catch (std::exception e) { delete cpp; Py_DECREF(seq); PyErr_SetString(PyExc_RuntimeError, e.what()); return 0; } Py_DECREF(seq); return cpp; } inline ComplexVector* ComplexVector_from_python(PyObject* py) { PyObject* seq = PySequence_Fast(py, "Argument must be a sequence of complex numbers."); if (seq == NULL) return 0; int size = PySequence_Fast_GET_SIZE(seq); ComplexVector* cpp = new ComplexVector(size); try { for (int i = 0; i < size; ++i) { PyObject* value = PySequence_Fast_GET_ITEM(seq, i); if (!PyComplex_Check(value)) { delete cpp; Py_DECREF(seq); PyErr_SetString(PyExc_TypeError, "Argument must be a sequence of complex numbers."); return 0; } Py_complex temp = PyComplex_AsCComplex(value); (*cpp)[i] = ComplexPixel(temp.real, temp.imag); } } catch (std::exception e) { delete cpp; Py_DECREF(seq); PyErr_SetString(PyExc_RuntimeError, e.what()); return 0; } Py_DECREF(seq); return cpp; } inline IntVector* IntVector_from_python(PyObject* py) { PyObject* seq = PySequence_Fast(py, "Argument must be a sequence of ints."); if (seq == NULL) return 0; int size = PySequence_Fast_GET_SIZE(seq); IntVector* cpp = new IntVector(size); try { for (int i = 0; i < size; ++i) { PyObject* number = PySequence_Fast_GET_ITEM(seq, i); if (!PyInt_Check(number)) { PyErr_SetString(PyExc_TypeError, "Argument must be a sequence of ints."); delete cpp; Py_DECREF(seq); return 0; } (*cpp)[i] = (int)PyInt_AsLong(number); } } catch (std::exception e) { delete cpp; Py_DECREF(seq); PyErr_SetString(PyExc_RuntimeError, e.what()); return 0; } Py_DECREF(seq); return cpp; } inline PointVector* PointVector_from_python(PyObject* py) { PyObject* seq = PySequence_Fast(py, "Argument must be an iterable of Points"); if (seq == NULL) return 0; int size = PySequence_Fast_GET_SIZE(seq); PointVector* cpp = new PointVector(); try { cpp->reserve(size); for (int i = 0; i < size; ++i) { PyObject* point = PySequence_Fast_GET_ITEM(seq, i); Point p = coerce_Point(point); cpp->push_back(p); } } catch (std::exception e) { delete cpp; Py_DECREF(seq); PyErr_SetString(PyExc_RuntimeError, e.what()); return 0; } Py_DECREF(seq); return cpp; } /* ITERATOR TYPE */ inline PyTypeObject* get_IteratorType() { static PyTypeObject* t = 0; if (t == 0) { PyObject* dict = get_gameracore_dict(); if (dict == 0) return 0; t = (PyTypeObject*)PyDict_GetItemString(dict, "Iterator"); if (t == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get Iterator type from gamera.gameracore.\n"); return 0; } } return t; } /* PROGRESS BAR TYPE */ class ProgressBar { public: inline ProgressBar(const char* message) { PyObject* dict = get_module_dict("gamera.util"); if (!dict) throw std::runtime_error("Couldn't get gamera.util module"); PyObject* progress_factory = PyDict_GetItemString(dict, "ProgressFactory"); if (!progress_factory) throw std::runtime_error("Couldn't get ProgressFactory function"); m_progress_bar = PyObject_CallFunction(progress_factory, (char *)"s", message); if (!m_progress_bar) throw std::runtime_error("Error getting progress bar"); } inline ProgressBar() : m_progress_bar(NULL) {} inline ProgressBar(int x) { m_progress_bar = NULL; } inline ProgressBar(const ProgressBar& other) { m_progress_bar = other.m_progress_bar; if (m_progress_bar) Py_INCREF(m_progress_bar); } inline ~ProgressBar() { if (m_progress_bar){ Py_DECREF(m_progress_bar); } } inline void add_length(int l) { if (m_progress_bar) { PyObject* result = PyObject_CallMethod(m_progress_bar, (char *)"add_length", (char *)"i", l); if (!result) throw std::runtime_error("Error calling add_length on ProgressBar instance"); } } inline void set_length(int l) { if (m_progress_bar) { PyObject* result = PyObject_CallMethod(m_progress_bar, (char *)"set_length", (char *)"i", l); if (!result) throw std::runtime_error("Error calling set_length on ProgressBar instance"); } } inline void step() { if (m_progress_bar) { PyObject* result = PyObject_CallMethod(m_progress_bar, (char *)"step", NULL); if (!result) throw std::runtime_error("Error calling step on ProgressBar instance"); } } inline void update(int num, int den) { if (m_progress_bar) { PyObject* result = PyObject_CallMethod(m_progress_bar, (char *)"update", (char *)"ii", num, den); if (!result) throw std::runtime_error("Error calling update on ProgressBar instance"); } } inline void kill() { if (m_progress_bar) { PyObject* result = PyObject_CallMethod(m_progress_bar, (char *)"kill", NULL); if (!result) throw std::runtime_error("Error calling kill on ProgressBar instance"); } } protected: PyObject* m_progress_bar; }; // Converting pixel types to/from Python inline PyObject* pixel_to_python(OneBitPixel px) { return PyInt_FromLong(px); } inline PyObject* pixel_to_python(GreyScalePixel px) { return PyInt_FromLong(px); } inline PyObject* pixel_to_python(Grey16Pixel px) { return PyInt_FromLong(px); } inline PyObject* pixel_to_python(RGBPixel px) { return create_RGBPixelObject(px); } inline PyObject* pixel_to_python(FloatPixel px) { return PyFloat_FromDouble(px); } inline PyObject* pixel_to_python(ComplexPixel px) { return PyComplex_FromDoubles(px.real(), px.imag()); } template struct pixel_from_python { inline static T convert(PyObject* obj); }; template inline T pixel_from_python::convert(PyObject* obj) { if (!PyFloat_Check(obj)) { if (!PyInt_Check(obj)) { if (!is_RGBPixelObject(obj)) { if (!PyComplex_Check(obj)) { throw std::runtime_error("Pixel value is not valid"); } Py_complex temp = PyComplex_AsCComplex(obj); return (T)temp.real; } return T((*(((RGBPixelObject*)obj)->m_x)).luminance()); } return (T)PyInt_AsLong(obj); } return (T)PyFloat_AsDouble(obj); } template<> inline RGBPixel pixel_from_python::convert(PyObject* obj) { if (!is_RGBPixelObject(obj)) { if (!PyFloat_Check(obj)) { if (!PyInt_Check(obj)) { if (!PyComplex_Check(obj)) { throw std::runtime_error("Pixel value is not convertible to an RGBPixel"); } Py_complex temp = PyComplex_AsCComplex(obj); return RGBPixel(ComplexPixel(temp.real, temp.imag)); } return RGBPixel((GreyScalePixel)PyInt_AsLong(obj)); } return RGBPixel(PyFloat_AsDouble(obj)); } return RGBPixel(*(((RGBPixelObject*)obj)->m_x)); } template<> inline ComplexPixel pixel_from_python::convert(PyObject* obj) { if (!PyComplex_Check(obj)) { if (!is_RGBPixelObject(obj)) { if (!PyFloat_Check(obj)) { if (!PyInt_Check(obj)) { throw std::runtime_error("Pixel value is not convertible to a ComplexPixel"); } return ComplexPixel((double)PyInt_AsLong(obj), 0.0); } return ComplexPixel(PyFloat_AsDouble(obj), 0.0); } return ComplexPixel(((RGBPixelObject*)obj)->m_x->luminance(), 0.0); } Py_complex temp = PyComplex_AsCComplex(obj); return ComplexPixel(temp.real, temp.imag); } #endif #endif gamera-3.3.3/include/geostructs/0000755000076500000000000000000011755376174015607 5ustar chriswheelgamera-3.3.3/include/geostructs/delaunaytree.hpp0000644000076500000000000000750011741631156020771 0ustar chriswheel#ifndef DELAUNAYTREE_20100430_HPP #define DELAUNAYTREE_20100430_HPP // // Copyright (C) 2010-2012 Oliver Christen, Christoph Dalitz // // This code is based on the Delaunay_Tree implementation // http://people.sc.fsu.edu/~burkardt/cpp_src/delaunay_tree_2d/ // with the kind permission by Olivier Devillers. // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // #include #include #include #include #include //------------------------------------------------------------------------- // data structure for computing the two dimensional Delaunay triangulation //------------------------------------------------------------------------- namespace Gamera { namespace Delaunaytree { class Vertex; class TriangleFlag; class TriangleList; class DelaunayTree; class Triangle; // Vertex class Vertex { private: double x; double y; int label; public: Vertex(double x, double y); Vertex(double x, double y, int label); double getX(); double getY(); int getLabel(); friend Vertex operator+(Vertex a, Vertex b); friend Vertex operator-(Vertex a, Vertex b); friend double operator*(Vertex a, Vertex b); friend double operator^(Vertex a, Vertex b); }; // TriangleFlag class TriangleFlag { private: int flag; public: TriangleFlag(); void kill(); bool isDead(); void setInfinite(int i); int isInfinite(); void setLastFinite(); bool isLastFinite(); int getFlag(); }; // TriangleList class TriangleList { private: Triangle *triangle; TriangleList *next; public: TriangleList(TriangleList *list, Triangle *triangle); ~TriangleList(); Triangle * getTriangle(); TriangleList * getNext(); }; // DelaunayTree class DelaunayTree { private: int number; Triangle *root; std::vector triangles; public: DelaunayTree(); ~DelaunayTree(); void addVertex(Vertex *v); void addVertices(std::vector *vertices); void appendTriangle(Triangle *t); void neighboringLabels(std::map > *lbmap); void neighboringVertices(std::map > *vmap); void getTriangles(std::list< std::vector* > *triangles); }; // Triangle class Triangle { private: int number; TriangleFlag flag; Vertex *vertices[3]; Triangle *neighbors[3]; TriangleList *sons; public: Triangle(DelaunayTree *tree); Triangle(DelaunayTree *tree, Triangle *parent, int i); Triangle(DelaunayTree *tree, Triangle *parent, Vertex *v, int i); ~Triangle(); bool Conflict(Vertex *v); Triangle * findConflict(Vertex *v); TriangleFlag * getFlag(); Vertex * getVertex(int i); void setNeighbor(int i, Triangle *t); Triangle * getNeighbor(int i); void setNumber(int i); int getNumber(); int NeighborIndex(Triangle *t); int cwNeighbor(Vertex *v); void neighboringVertices(std::map > *allneighbors); void neighboringLabels(std::map > *allneighbors); void getTriangles(std::list< std::vector* > *triangles); }; }} // end namespace Gamera::Delaunaytree #endif gamera-3.3.3/include/geostructs/kdtree.hpp0000644000076500000000000000671611652050140017562 0ustar chriswheel#ifndef __kdtree_HPP #define __kdtree_HPP // // Copyright (C) 2009 Christoph Dalitz // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // #include #include #include namespace Gamera { namespace Kdtree { typedef std::vector CoordPoint; typedef std::vector DoubleVector; // for passing points to the constructor of kdtree struct KdNode { CoordPoint point; void* data; KdNode(const CoordPoint &p, void* d = NULL) {point = p; data = d;} KdNode() {data = NULL;} }; typedef std::vector KdNodeVector; // base function object for search predicate in knn search // returns true when the given KdNode is an admissible neighbor // To define an own search predicate, derive from this class // and overwrite the call operator operator() struct KdNodePredicate { virtual ~KdNodePredicate() {} virtual bool operator()(const KdNode& kn) const { return true; } }; //-------------------------------------------------------- // private helper classes used internally by KdTree // // the internal node structure used by kdtree class kdtree_node; // base class for different distance computations class DistanceMeasure; // helper class for priority queue in k nearest neighbor search class nn4heap { public: size_t dataindex; // index of actual kdnode in *allnodes* double distance; // distance of this neighbor from *point* nn4heap(size_t i, double d) {dataindex = i; distance = d;} }; class compare_nn4heap { public: bool operator()(const nn4heap &n, const nn4heap &m) { return (n.distance < m.distance); } }; //-------------------------------------------------------- // kdtree class class KdTree { private: // recursive build of tree kdtree_node* build_tree(size_t depth, size_t a, size_t b); // helper variable for keeping track of subtree bounding box CoordPoint lobound, upbound; // helper variables and functions for k nearest neighbor search std::priority_queue, compare_nn4heap> *neighborheap; bool neighbor_search(const CoordPoint &point, kdtree_node* node, size_t k); bool bounds_overlap_ball(const CoordPoint &point, double dist, kdtree_node* node); bool ball_within_bounds(const CoordPoint &point, double dist, kdtree_node* node); // class implementing the distance computation DistanceMeasure* distance; // search predicate in knn searches KdNodePredicate* searchpredicate; public: KdNodeVector allnodes; size_t dimension; kdtree_node* root; // distance_type can be 0 (max), 1 (city block), or 2 (euklid) KdTree(const KdNodeVector* nodes, int distance_type=2); ~KdTree(); void set_distance(int distance_type, const DoubleVector* weights = NULL); void k_nearest_neighbors(const CoordPoint &point, size_t k, KdNodeVector* result, KdNodePredicate* pred = NULL); }; }} // end namespace Gamera::Kdtree #endif gamera-3.3.3/include/graph/0000755000076500000000000000000011755376174014506 5ustar chriswheelgamera-3.3.3/include/graph/bfsdfsiterator.hpp0000644000076500000000000000345411652050137020226 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _BFSDFSITERATOR_HPP_F320082952C20F #define _BFSDFSITERATOR_HPP_F320082952C20F #include "nodetraverseiterator.hpp" namespace Gamera { namespace GraphApi { /// lazy iterator performing a Breath-First-Search starting at *start* class BfsIterator: public NodeTraverseIterator { NodeQueue _queue; void init(Node* start); public: BfsIterator(Graph* graph, Node* start): NodeTraverseIterator(graph) { init(start); }; Node* next(); }; /// lazy iterator performing a Depth-First-Search starting at *start* /** this iterator can also be used for recognizing cycles by calling * has_cycles() after a complete search * */ class DfsIterator: public NodeTraverseIterator { NodeStack _stack; std::set _used_edges; bool found_cycles; void init(Node* start); public: DfsIterator(Graph* graph, Node* start): NodeTraverseIterator(graph) { init(start); } Node* next(); bool has_cycles() { return found_cycles; } }; }} // end Gamera::GraphApi #endif /* _BFSDFSITERATOR_HPP_F320082952C20F */ gamera-3.3.3/include/graph/edge.hpp0000644000076500000000000000432611652050137016110 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _EDGE_HPP_A95093D2DFCAB7 #define _EDGE_HPP_A95093D2DFCAB7 #include "graph_common.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- /** The graph containing edge can only be reached by from_node->_graph or * to_node->_graph because every edge has at least two nodes in same graph. * So an additional pointer in Edge is waste of memory * */ struct Edge { Node* from_node; Node* to_node; bool is_directed; ///< should be same as graph's directed cost_t weight; void* label; /** creates a new edge. directed must be the same as the Graph's flag * @param from_node Node this edge is pointing from * @param to_node Node this edge is pointing to * @param weight positive edge-weight used in some algorithms * @param directed if true, this edge points in both directions * this should be same as graph's flag DIRECTED * @param label label **/ Edge(Node* from_node, Node* to_node, cost_t weight = 1.0, bool directed = false, void* label = NULL); /** removes this from nodes this edge is pointing from/to **/ void remove_self(); /** returns other end of edge if it is reachable from the * given node or NULL if not reachable **/ Node* traverse(Node* node); Node* traverse(GraphData * value); }; }} // end Gamera::GraphApi #endif /* _EDGE_HPP_A95093D2DFCAB7 */ gamera-3.3.3/include/graph/edgenodeiterator.hpp0000644000076500000000000000716211652050137020531 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _EDGENODEITERATOR_HPP_B2E5621C5D6D95 #define _EDGENODEITERATOR_HPP_B2E5621C5D6D95 #include "nodetraverseiterator.hpp" #include "edge.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- /// lazy iterator iterating over a NodeVector between given borders class NodePtrIterator: public NodeTraverseIterator { protected: NodeVector::iterator it; NodeVector::iterator _begin; NodeVector::iterator _end; public: NodePtrIterator(Graph* graph, NodeIterator begin, NodeIterator end): NodeTraverseIterator(graph) { _begin = begin; _end = end; it = begin; } Node* next() { if(it == _end) return NULL; Node* nextnode = *it; it++; return nextnode; } }; // ----------------------------------------------------------------------------- /// lazy iterator over a complete NodeVector (given by pointer) class NodeVectorPtrIterator: public NodePtrIterator { protected: NodeVector* _vec; public: NodeVectorPtrIterator(Graph* graph, NodeVector* vec): NodePtrIterator(graph, vec->begin(), vec->end()) { _vec = vec; } ~NodeVectorPtrIterator() { delete _vec; } }; // ----------------------------------------------------------------------------- /// lazy iterator iterating over a EdgeVector between given borders /// returning all edges if from_node is NULL /// returning edges with from_node as start_node class EdgePtrIterator { protected: EdgeVector::iterator it; EdgeVector::iterator _begin; EdgeVector::iterator _end; Graph* _graph; Node* _from; public: EdgePtrIterator(Graph* graph, EdgeIterator begin, EdgeIterator end, Node* from_node=NULL) { _graph = graph; _begin = begin; _end = end; it = begin; _from = from_node; } Edge* next() { if(it == _end) return NULL; Edge* nextedge = *it; it++; if(_from && nextedge->from_node != _from) return next(); return nextedge; } }; // ----------------------------------------------------------------------------- /// lazy iterator iterating over a EdgeVector between given borders /// returning the nodes which are directly reachable starting at from_node class NodePtrEdgeIterator: public EdgePtrIterator { Node* _from_node_node; public: NodePtrEdgeIterator(Graph* graph, EdgeIterator begin, EdgeIterator end, Node* from_node = NULL): EdgePtrIterator(graph, begin, end, NULL) { _from_node_node = from_node; } Node* next() { Edge* e = EdgePtrIterator::next(); if(e == NULL) return NULL; Node* n = e->traverse(_from_node_node); if(n == NULL) return next(); return n; } }; }} // end Gamera::GraphApi #endif /* _EDGENODEITERATOR_HPP_B2E5621C5D6D95 */ gamera-3.3.3/include/graph/graph.hpp0000644000076500000000000001477011652050137016311 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _GRAPH_HPP_97CAD8A8D00E4D #define _GRAPH_HPP_97CAD8A8D00E4D #include "graph_common.hpp" #include "bfsdfsiterator.hpp" #include "edgenodeiterator.hpp" #include "edge.hpp" namespace Gamera { namespace GraphApi { // Colorization typedef std::vector Histogram; typedef std::map ColorMap; struct Graph { NodeVector _nodes; ///< list of nodes in this graph EdgeVector _edges; ///< list of edges in this graph ValueNodeMap _valuemap; ///< STL-Map value->node for this graph flag_t _flags; ColorMap* _colors; Histogram* _colorhistogram; // -------------------------------------------------------------------------- // Structure // -------------------------------------------------------------------------- Graph(bool directed , bool check_on_insert=false); Graph(flag_t flags = FLAG_FREE); ~Graph(); Graph(Graph &g); Graph(Graph *g, flag_t flags = FLAG_FREE); // -------------------------------------------------------------------------- // methods for nodesnodes // -------------------------------------------------------------------------- bool add_node(GraphData * value); bool add_node(Node* node); /// add node variant returns ptr to added node or existing node Node* add_node_ptr(GraphData * value); int add_nodes(NodeVector nodes); int add_nodes(ValueVector values); Node* get_node(GraphData * value); NodePtrIterator* get_nodes(); bool has_node(Node* node); bool has_node(GraphData * value); void remove_node(Node* node); void remove_node(GraphData * value); void remove_node_and_edges(Node* node); void remove_node_and_edges(GraphData * value); // -------------------------------------------------------------------------- // methods for edges // -------------------------------------------------------------------------- int add_edge(GraphData * from_value, GraphData * to_value, cost_t cost = 1.0, bool directed = false, void* label = NULL); int add_edge(Node* from_node, Node* to_node, cost_t cost = 1.0, bool directed = false, void* label = NULL); EdgePtrIterator* get_edges(); bool has_edge(GraphData * from_value, GraphData * to_value); bool has_edge(Node* from_node, Node* to_node); bool has_edge(Edge* edge) { return has_edge(edge->from_node, edge->to_node); } void remove_edge(GraphData * from_value, GraphData * to_value); void remove_edge(Node* from_node, Node* to_node); void remove_edge(Edge* edge); void remove_all_edges(); // -------------------------------------------------------------------------- // size of graph // -------------------------------------------------------------------------- size_t get_nnodes() { return _nodes.size(); } size_t get_nedges() { return _edges.size(); } // -------------------------------------------------------------------------- // flags and restrictions // -------------------------------------------------------------------------- bool conforms_restrictions(); bool has_flag(flag_t flag) { return GRAPH_HAS_FLAG(this, flag); } bool is_directed(); bool is_undirected() { return !is_directed();} void make_directed(); void make_undirected(); bool is_cyclic(); bool is_acyclic() { return !is_cyclic(); } void make_cyclic(); void make_acyclic(); void make_tree(); void make_blob(); bool is_tree(); bool is_blob() { return !is_tree(); } bool is_multi_connected(); bool is_singly_connected() { return !is_multi_connected(); } void make_multi_connected(); void make_singly_connected(); bool is_self_connected(); bool is_not_self_connected() { return !is_self_connected(); } void make_self_connected(); void make_not_self_connected(); // -------------------------------------------------------------------------- // subgraphs // -------------------------------------------------------------------------- NodeVector *get_subgraph_roots(); size_t size_of_subgraph(GraphData * value); size_t size_of_subgraph(Node* node); size_t get_nsubgraphs(); bool is_fully_connected(); // -------------------------------------------------------------------------- // algorithms // -------------------------------------------------------------------------- BfsIterator* BFS(Node* node); BfsIterator* BFS(GraphData * value); DfsIterator* DFS(Node* node); DfsIterator* DFS(GraphData * value); ShortestPathMap* dijkstra_shortest_path(Node* node); ShortestPathMap* dijkstra_shortest_path(GraphData * value); ShortestPathMap* shortest_path(Node* node) { return dijkstra_shortest_path(node); } ShortestPathMap* shortest_path(GraphData * value) { return dijkstra_shortest_path(value); } std::map dijkstra_all_pairs_shortest_path(); /// currently same as dijkstra_all_pairs_shortest_path std::map all_pairs_shortest_path(); bool has_path(Node* from_node, Node* to_node); bool has_path(GraphData * from_value, GraphData * to_value); Graph *create_spanning_tree(Node* node); Graph *create_spanning_tree(GraphData * value); Graph *create_minimum_spanning_tree(); //kruskal //optimize_partitions only implemented in Python-wrapper // -------------------------------------------------------------------------- // colorization // -------------------------------------------------------------------------- unsigned int get_color(Node* n); unsigned int get_color(GraphData * value) { Node* n = get_node(value); return get_color(n); } void set_color(Node* n, unsigned int color); void colorize(unsigned int ncolors = 6); }; }} // end Gamera::GraphApi #endif /* _GRAPH_HPP_97CAD8A8D00E4D */ gamera-3.3.3/include/graph/graph_common.hpp0000644000076500000000000000546511652050137017662 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _GRAPH_COMMON_HPP_FCE9E0F296526B #define _GRAPH_COMMON_HPP_FCE9E0F296526B #include #include #include #include #include #include #include #include #include #include #include "graphdata.hpp" namespace Gamera { namespace GraphApi { struct Graph; struct Edge; struct Node; // ----------------------------------------------------------------------------- //some data structures used in graph or multiple algorithms typedef std::list NodeVector; typedef std::list EdgeVector; typedef std::list ValueVector; typedef std::map ValueNodeMap; typedef NodeVector::iterator NodeIterator; typedef ValueVector::iterator ValueIterator; typedef EdgeVector::iterator EdgeIterator; typedef std::queue NodeQueue; //BFS typedef std::stack NodeStack; //DFS typedef std::set NodeSet; typedef std::priority_queue NodePriorityQueue; //type representing edge's costs; typedef double cost_t; //structures used for return-values of shortest path algorithms struct DijkstraPath { cost_t cost; std::vector path; }; typedef std::map ShortestPathMap; // ----------------------------------------------------------------------------- //Definition of different flags typedef unsigned long flag_t; #define FLAG_DIRECTED 1ul #define FLAG_CYCLIC 2ul #define FLAG_BLOB 4ul #define FLAG_MULTI_CONNECTED 8ul #define FLAG_SELF_CONNECTED 16ul #define FLAG_CHECK_ON_INSERT 32ul #define FLAG_DEFAULT (0xfffful & ~32ul) #define FLAG_FREE 31ul #define FLAG_TREE 0ul #define FLAG_DAG 5ul #define FLAG_UNDIRECTED 6ul #define HAS_FLAG(a, b) (((a) & (b)) == (b)) #define SET_FLAG(a, b) ((a) |= (b)) #define UNSET_FLAG(a, b) ((a) &= ~(b)) #define GRAPH_HAS_FLAG(graph, f) HAS_FLAG((graph)->_flags, f) #define GRAPH_SET_FLAG(graph, f) SET_FLAG((graph)->_flags, f) #define GRAPH_UNSET_FLAG(graph, f) UNSET_FLAG((graph)->_flags, f) }} // end Gamera::GraphApi #endif /* _GRAPH_COMMON_HPP_FCE9E0F296526B */ gamera-3.3.3/include/graph/graphdata.hpp0000644000076500000000000000532511652050137017137 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _GRAPHDATA_HPP_FAA9ABE84FC3A4 #define _GRAPHDATA_HPP_FAA9ABE84FC3A4 #ifdef __DEBUG_GAPI__ #include #endif // ----------------------------------------------------------------------------- namespace Gamera { namespace GraphApi { /** This base-class GraphData defines the interface for storing data in a graph. * For using this a derived class must override * int compare(const GraphData& b); * which returns 0 if *this == b, <0 if *this < b and >0 if *this > b. * * You can see a simple template-based implementation in GraphDataTemplate * which could be used for almost every data type whithout deriving a new class. * * If Data-Types with some reference-counting void incref() and void decref() * are called when the value is needed internally in Graph more than one * time. Currently this feature is not used but should be in future. * */ struct GraphData { //really needed? virtual void incref() {}; virtual void decref() {}; /** This method returns * 0 if *this == b * <0 if *this < b * >0 if *this > b * != 0 if *this != b * */ virtual int compare(const GraphData& b) = 0; virtual ~GraphData() { } virtual GraphData* copy() = 0; // mappings from comparison operators to int compare(const GraphData&) bool operator<(const GraphData& b) { return compare(b) < 0; } bool operator==(const GraphData& b) { return compare(b) == 0; } bool operator>(const GraphData& b) { return compare(b) > 0; } bool operator!=(const GraphData& b) { return compare(b) != 0; } bool operator<=(const GraphData& b) { return compare(b) <= 0; } bool operator>=(const GraphData& b) { return compare(b) >= 0; } }; /// Less-Compare for use in value-node-map of Graph struct GraphDataPtrLessCompare { bool operator()(GraphData* a, GraphData* b){ return *a < *b; } }; }} // end Gamera::GraphApi #endif /* _GRAPHDATA_HPP_FAA9ABE84FC3A4 */ gamera-3.3.3/include/graph/graphdataderived.hpp0000644000076500000000000000723711712302464020506 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _GRAPHDATADERIVED_HPP_279BB122FA1E4E #define _GRAPHDATADERIVED_HPP_279BB122FA1E4E #include "graphdata.hpp" #include namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- struct GraphDataInt: public GraphData { int data; GraphDataInt(int d) { data = d; } virtual int compare(const GraphData& b) { #ifdef __DEBUG_GAPI__ std::cout << "GraphDataInt::compare called\n"; #endif return data - (dynamic_cast(b)).data; } GraphData* copy() { return new GraphDataInt(data); } }; // ----------------------------------------------------------------------------- struct GraphDataLong: public GraphData { long data; GraphDataLong(long d) { data = d; } virtual int compare(const GraphData& b) { #ifdef __DEBUG_GAPI__ std::cout << "GraphDataInt::compare called\n"; #endif return data - (dynamic_cast(b)).data; } GraphData* copy() { return new GraphDataLong(data); } }; // ----------------------------------------------------------------------------- struct GraphDataUnsignedInt: public GraphData { unsigned int data; GraphDataUnsignedInt(unsigned int d) { data = d; } virtual int compare(const GraphData& b) { #ifdef __DEBUG_GAPI__ std::cout << "GraphDataUnsignedInt::compare called\n"; #endif const GraphDataUnsignedInt& c = dynamic_cast(b); if(data < c.data) return - 1; else if(data > c.data) return 1; else return 0; } GraphData* copy() { return new GraphDataUnsignedInt(data); } }; // ----------------------------------------------------------------------------- struct GraphDataString: public GraphData { std::string data; GraphDataString(std::string d) { data = d; } virtual int compare(const GraphData& b) { #ifdef __DEBUG_GAPI__ std::cout << "GraphDataUnsignedInt::compare called\n"; #endif const GraphDataString& c = dynamic_cast(b); if(data < c.data) return - 1; else if(data > c.data) return 1; else return 0; } GraphData* copy() { return new GraphDataString(data); } }; // ----------------------------------------------------------------------------- template struct GraphDataTemplate: public GraphData { T data; GraphDataTemplate(T d) { data = d; } virtual int compare(const GraphData& b) { const GraphDataTemplate& c = dynamic_cast&>(b); if(data < c.data) return - 1; else if(c.data < data) return 1; else return 0; } GraphData* copy() { return new GraphDataTemplate(data); } }; }} //end Gamera::GraphApi #endif /* _GRAPHDATADERIVED_HPP_279BB122FA1E4E */ gamera-3.3.3/include/graph/graphdatapyobject.hpp0000644000076500000000000000412711652050137020676 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _GRAPHDATAPYOBJECT_HPP_367750A70EE140 #define _GRAPHDATAPYOBJECT_HPP_367750A70EE140 #include #include "graphdata.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- /** GraphDataPyObject holds data for a node and pointer to a possibly delivered * NodeObject used in the Python wrapper * */ struct GraphDataPyObject: public GraphData { PyObject* data; PyObject* _node; GraphDataPyObject(PyObject* d = NULL) { data = d; _node = NULL; incref(); } ~GraphDataPyObject() { decref(); } GraphDataPyObject& operator=(const GraphDataPyObject& other) { data = other.data; _node = other._node; incref(); return *this; } void incref() { if(data != NULL) Py_INCREF(data); if(_node != NULL) Py_INCREF(_node); } void decref() { if(data != NULL) Py_DECREF(data); if(_node != NULL) Py_DECREF(_node); } int compare(const GraphData& b) { return PyObject_Compare(data, dynamic_cast(b).data); } GraphData* copy() { GraphData *a = new GraphDataPyObject(data); return a; } }; }} //end Gamera::GraphApi #endif /* _GRAPHDATAPYOBJECT_HPP_367750A70EE140 */ gamera-3.3.3/include/graph/node.hpp0000644000076500000000000000500311652050137016122 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _NODE_HPP_6F6639BC0A8223 #define _NODE_HPP_6F6639BC0A8223 #include "graph_common.hpp" #include "edgenodeiterator.hpp" namespace Gamera { namespace GraphApi { struct Node { EdgeVector _edges; /// < edges pointing in/out this node GraphData * _value; /// < nodes's value Graph* _graph; Node(GraphData * value, Graph* graph = NULL); ~Node(); Node(Node& node); Node(Node* node); void add_to_graph(Graph* graph) { _graph = graph; } void remove_from_graph() { if(_graph != NULL) { _graph = NULL; } } /// compares this value with given node's value bool operator==(Node& n) { return *_value == *n._value; } /// compares this value with given value bool operator==(GraphData * v) { return *_value == *v; } /** Iterator over edges pointing in/out this node * @param both_directions false: only edges pointing out this node * true: edges pointing in and out this node **/ EdgePtrIterator* get_edges(bool both_directions = false); /// Iterator over all nodes reachable from this node NodePtrEdgeIterator* get_nodes(bool both_directions = false); size_t get_nedges() { return _edges.size() ; } size_t get_nnodes() { NodePtrEdgeIterator* it = get_nodes(); size_t count = 0; while(it->next() != NULL) count++; delete it; return count; } bool has_edge_to(Node* node); bool has_edge_from(Node* node); void add_edge(Edge* edge); void remove_edge(Edge* edge); /** removes node from graph * @param glue true if neighbor-edges should be glued together * */ void remove_self(bool glue=false); }; }} // end Gamera::GraphApi #endif /* _NODE_HPP_6F6639BC0A8223 */ gamera-3.3.3/include/graph/nodetraverseiterator.hpp0000644000076500000000000000421311652050137021452 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _NODETRAVERSEITERATOR_HPP_826C06039D50C0 #define _NODETRAVERSEITERATOR_HPP_826C06039D50C0 #include "graph_common.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- /** * lazy iterator for traversing through a graph node-by-node * must be subclassed for using a concrete alrogithm * (BFS, DFS, etc) * * next() returns next Node or NULL when there are no more nodes. * * Please note that chaning the graph invalidates this iterator and * leads to undefined behaviour. * * initially no nodes are marked as visited */ class NodeTraverseIterator { protected: Graph* _graph; NodeSet _visited; public: NodeTraverseIterator(Graph* graph) { _graph = graph; } virtual ~NodeTraverseIterator() {} /// marks the given node as visited inline void visit(Node* node) { _visited.insert(node); } /// marks the given node as not visited inline void unvisit(Node* node) { if(is_visited(node)) _visited.erase(node); } /// returns true when the given node is marked as visited inline bool is_visited(Node* node) { return _visited.count(node) == 1; } /// returns pointer to next node or NULL when there is no more node virtual Node* next() = 0; }; }} // end Gamera::GraphApi #endif /* _NODETRAVERSEITERATOR_HPP_826C06039D50C0 */ gamera-3.3.3/include/graph/shortest_path.hpp0000644000076500000000000000624311652050137020073 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _SHORTEST_PATH_HPP_64D06E271FB0FA #define _SHORTEST_PATH_HPP_64D06E271FB0FA #include #include #include #include #include "node.hpp" #include "edge.hpp" #include "graph_common.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- /// helper-class for remembering distances and predecessors in /// Dijkstra's algorithm struct DijkstraNode { Node* node; cost_t distance; Node* predecessor; bool visited; DijkstraNode(Node *n) { node = n; distance = std::numeric_limits::max(); predecessor = NULL; visited = false; } bool operator<(DijkstraNode &d2) { return distance < d2.distance; } }; // ----------------------------------------------------------------------------- /// class encapsulating Dijkstra's algorithm class ShortestPath { protected: std::map nodes; /// comparator for comparing distances in min-queue struct dijkstra_min_cmp { bool operator() (DijkstraNode* const &a, DijkstraNode* const &b) const { return a->distance > b->distance; } }; std::priority_queue, dijkstra_min_cmp> queue; NodeSet shortestpath; Graph* _graph; Node* _sourcenode; void init_single_source(Graph* g, Node *s); // -------------------------------------------------------------------------- inline void relax(Edge* e) { DijkstraNode* from, *to; from = nodes[e->from_node]; to = nodes[e->to_node]; if(to->distance > from->distance + e->weight) { to->distance = from->distance + e->weight; to->predecessor = e->from_node; if(shortestpath.find(to->node) == shortestpath.end()) queue.push(to); } if(!e->is_directed && from->distance > to->distance + e->weight) { from->distance = to->distance + e->weight; from->predecessor = e->to_node; if(shortestpath.find(from->node) == shortestpath.end()) queue.push(from); } } public: ShortestPathMap* dijkstra_shortest_path(Graph* g, Node *source); std::map* dijkstra_all_pairs_shortest_path(Graph* g); ~ShortestPath(); ShortestPathMap* faster_all_pairs_shortest_path(Graph *g); }; }} // end Gamera::GraphApi #endif /* _SHORTEST_PATH_HPP_64D06E271FB0FA */ gamera-3.3.3/include/graph/spanning_tree.hpp0000644000076500000000000000261511652050137020037 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _SPANNING_TREE_HPP_6AC2CA9C54D727 #define _SPANNING_TREE_HPP_6AC2CA9C54D727 #include #include "graph_common.hpp" namespace Gamera { namespace GraphApi { typedef std::set EdgeSet; class SpanningTree { struct mst_compare_func { bool operator() (Edge* const& a, Edge* const& b) const { return a->weight > b->weight; } }; public: static Graph *create_minimum_spanning_tree(Graph* g); static Graph *create_minimum_spanning_tree_kruskal(Graph* g); static Graph* create_spanning_tree(Graph* g, Node* n); }; }} // end Gamera::GraphApi #endif /* _SPANNING_TREE_HPP_6AC2CA9C54D727 */ gamera-3.3.3/include/graph/subgraph_root.hpp0000644000076500000000000000270311652050137020057 0ustar chriswheel#/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _SUBGRAPH_ROOT_HPP_DB10380EE37788 #define _SUBGRAPH_ROOT_HPP_DB10380EE37788 #include "graph.hpp" #include "node.hpp" #include "edge.hpp" namespace Gamera { namespace GraphApi { class SubgraphRoots { protected: struct SubgraphNode { Node *n; bool root, visited; SubgraphNode(Node* n) { this->n = n; root = visited = false; } }; std::stack nodeStack; std::map nodeMap; std::set nodeSet; size_t i; Graph* g; void process(SubgraphNode* t); public: NodeVector* subgraph_roots(Graph* g); }; }} // end Gamera::GraphApi #endif /* _SUBGRAPH_ROOT_HPP_DB10380EE37788 */ gamera-3.3.3/include/image.hpp0000644000076500000000000000604711652050140015161 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm11162001_image_hpp #define kwm11162001_image_hpp #include "gameramodule.hpp" #include "pixel.hpp" #include "image_data.hpp" #include namespace Gamera { class Image : public Rect { public: Image() : Rect() { m_resolution = 0; m_scaling = 1.0; features = 0; features_len = 0; } Image(const Point& upper_left, const Point& lower_right) : Rect(upper_left, lower_right) { m_resolution = 0; m_scaling = 1.0; features = 0; features_len = 0; } Image(const Point& upper_left, const Size& size) : Rect(upper_left, size) { m_resolution = 0; m_scaling = 1.0; features = 0; features_len = 0; } Image(const Point& upper_left, const Dim& dim) : Rect(upper_left, dim) { m_resolution = 0; m_scaling = 1.0; } Image(const Rect& rect) : Rect(rect) { m_resolution = 0; m_scaling = 1.0; features = 0; features_len = 0; } virtual ~Image() { } double resolution() const { return m_resolution; } void resolution(double r) { m_resolution = r; } double scaling() const { return m_scaling; } void scaling(double v) { m_scaling = v; } virtual ImageDataBase* data() const = 0; public: double* features; Py_ssize_t features_len; protected: double m_resolution; double m_scaling; }; /* ImageBase This is the base class for all images. */ template class ImageBase : public Image { public: ImageBase() : Image() { } ImageBase(const Point& upper_left, const Point& lower_right) : Image(upper_left, lower_right) { } ImageBase(const Point& upper_left, const Size& size) : Image(upper_left, size) { } ImageBase(const Point& upper_left, const Dim& dim) : Image(upper_left, dim) { } ImageBase(const Rect& rect) : Image(rect) { } virtual ~ImageBase() { } inline size_t depth() const { return sizeof(T) * 8; } inline size_t ncolors() const { return 1; } }; template<> inline size_t ImageBase::depth() const { return 1; } template<> inline size_t ImageBase::ncolors() const { return 3; } template<> inline size_t ImageBase::depth() const { return 8; } }; #endif gamera-3.3.3/include/image_algorithm.hpp0000644000076500000000000000311111652050140017214 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef __image_algorithm_hh__ #define __image_algorithm_hh__ #include #include #include "gamera.hpp" /* Image Algorithm This file contains a variety of utility algorithms for Gamera matrices. Author ------ Karl MacMillan karlmac@peabody.jhu.edu History ------- - Started 6/12/01 */ namespace Gamera { // Print a image to the console template void print_image(const T& image) { typename T::const_row_iterator i = image.row_begin(); typename T::const_row_iterator::iterator j; std::cout << "[" << std::endl; for (; i != image.row_end(); i++) { j = i.begin(); for (; j != i.end(); j++) { std::cout << *j << " "; } std::cout << std::endl; } std::cout << "]" << std::endl; } }; #endif gamera-3.3.3/include/image_data.hpp0000644000076500000000000001400411652050140016142 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* The ImageData class is dense storage for Gamera matrices. This class is used rather than a standard vector so that we can control the iterator type - the Vigra iterators assume that the iterator type is T* and some std::vectors don't use that as the iterator type. */ #ifndef kwm11162001_image_data_hpp #define kwm11162001_image_data_hpp #include "dimensions.hpp" #include #include #include #include namespace Gamera { class ImageDataBase { public: ImageDataBase(const Dim& dim, const Point& offset) { m_size = (dim.nrows() * dim.ncols()); m_stride = dim.ncols(); m_page_offset_x = offset.x(); m_page_offset_y = offset.y(); m_user_data = 0; } ImageDataBase(const Dim& dim) { m_size = (dim.nrows() * dim.ncols()); m_stride = dim.ncols(); m_page_offset_x = 0; m_page_offset_y = 0; m_user_data = 0; } ImageDataBase(const Size& size, const Point& offset) { m_size = (size.height() + 1) * (size.width() + 1); m_stride = size.width() + 1; m_page_offset_x = offset.x(); m_page_offset_y = offset.y(); m_user_data = 0; } ImageDataBase(const Size& size) { m_size = (size.height() + 1) * (size.width() + 1); m_stride = size.width() + 1; m_page_offset_x = 0; m_page_offset_y = 0; m_user_data = 0; } ImageDataBase(const Rect& rect) { if (rect.nrows() < 1 || rect.ncols() < 1) throw std::range_error("nrows and ncols must be >= 1."); m_size = rect.nrows() * rect.ncols(); m_stride = rect.ncols(); m_page_offset_x = rect.ul_x(); m_page_offset_y = rect.ul_y(); m_user_data = 0; } virtual ~ImageDataBase() { } /* Various information about dimensions. */ size_t stride() const { return m_stride; } size_t ncols() const { return m_stride; } size_t nrows() const { return size() / m_stride; } Dim dim() const { return Dim(m_stride, size() / m_stride); } size_t page_offset_x() const { return m_page_offset_x; } size_t page_offset_y() const { return m_page_offset_y; } Point offset() const { return Point(m_page_offset_x, m_page_offset_y); } size_t size() const { return m_size; } virtual size_t bytes() const = 0; virtual double mbytes() const = 0; /* Setting dimensions */ void page_offset_x(size_t x) { m_page_offset_x = x; } void page_offset_y(size_t y) { m_page_offset_y = y; } virtual void nrows(size_t nrows) { do_resize(nrows * m_stride); } virtual void ncols(size_t ncols) { m_stride = ncols; do_resize((m_size / m_stride) * m_stride); } virtual void dimensions(size_t rows, size_t cols) = 0; virtual void dim(const Dim& dim) = 0; public: void* m_user_data; protected: virtual void do_resize(size_t size) = 0; size_t m_size; size_t m_stride; size_t m_page_offset_x; size_t m_page_offset_y; }; template class ImageData : public ImageDataBase { public: /* Standard typedefs */ typedef T value_type; typedef T& reference; typedef T* pointer; typedef int difference_type; typedef T* iterator; typedef const T* const_iterator; ImageData(const Dim& dim, const Point& offset) : ImageDataBase(dim, offset) { m_data = 0; create_data(); } ImageData(const Dim& dim) : ImageDataBase(dim) { m_data = 0; create_data(); } ImageData(const Size& size, const Point& offset) : ImageDataBase(size, offset) { m_data = 0; create_data(); } ImageData(const Size& size) : ImageDataBase(size) { m_data = 0; create_data(); } ImageData(const Rect& rect) : ImageDataBase(rect) { m_data = 0; create_data(); } /* Destructor */ virtual ~ImageData() { if (m_data != 0) { delete[] m_data; } } virtual size_t bytes() const { return m_size * sizeof(T); } virtual double mbytes() const { return (m_size * sizeof(T)) / 1048576.0; } virtual void dimensions(size_t rows, size_t cols) { m_stride = cols; do_resize(rows * cols); } virtual void dim(const Dim& dim) { m_stride = dim.ncols(); do_resize(dim.nrows() * dim.ncols()); } virtual Dim dim() const { return Dim(m_stride, size() / m_stride); } /* Iterators */ iterator begin() { return m_data; } iterator end() { return m_data + m_size; } const_iterator begin() const { return m_data; } const_iterator end() const { return m_data + m_size; } /* Operators */ T& operator[](size_t n) { return m_data[n]; } protected: virtual void do_resize(size_t size) { if (size > 0) { size_t smallest = std::min(m_size, size); m_size = size; T* new_data = new T[m_size]; for (size_t i = 0; i < smallest; ++i) new_data[i] = m_data[i]; if (m_data) delete[] m_data; m_data = new_data; } else { if (m_data) delete[] m_data; m_data = 0; m_size = 0; } } private: void create_data() { if (m_size > 0) m_data = new T[m_size]; std::fill(m_data, m_data + m_size, pixel_traits::default_value()); } T* m_data; }; } #endif gamera-3.3.3/include/image_info.hpp0000644000076500000000000000436711652050140016177 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm01082002_image_info #define kwm01082002_image_info #include namespace Gamera { /// A simple class to hold information about images /** This is a simple class to hold information about images - it is to make the writing of image loading and saving functions easier. Only the functions for reading the information are exported to python - in C++ the member variables are set directly for ease in the python export code. */ class ImageInfo { public: ImageInfo() { m_x_resolution = 0; m_y_resolution = 0; m_nrows = 0; m_ncols = 0; m_depth = 0; m_ncolors = 0; m_inverted = false; } double x_resolution() { return m_x_resolution; } double y_resolution() { return m_y_resolution; } size_t nrows() { return m_nrows; } size_t ncols() { return m_ncols; } size_t depth() { return m_depth; } size_t ncolors() { return m_ncolors; } bool inverted() { return m_inverted; } void x_resolution(double res) { m_x_resolution = res; } void y_resolution(double res) { m_y_resolution = res; } void nrows(size_t x) { m_nrows = x; } void ncols(size_t x) { m_ncols = x; } void depth(size_t x) { m_depth = x; } void ncolors(size_t x) { m_ncolors = x; } void inverted(bool x) { m_inverted = x; } public: double m_x_resolution, m_y_resolution; size_t m_nrows, m_ncols; size_t m_depth; size_t m_ncolors; bool m_inverted; }; }; #endif gamera-3.3.3/include/image_types.hpp0000644000076500000000000002363011652050140016402 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2009 Jonathan Koch * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm03112002_image_types #define kwm03112002_image_types #include "pixel.hpp" #include "image_data.hpp" #include "image_view.hpp" #include "rle_data.hpp" #include "connected_components.hpp" #include /* The standard image types. */ namespace Gamera { /* Image Data */ typedef ImageData GreyScaleImageData; typedef ImageData Grey16ImageData; typedef ImageData FloatImageData; typedef ImageData RGBImageData; typedef ImageData ComplexImageData; typedef ImageData OneBitImageData; typedef RleImageData OneBitRleImageData; /* ImageView */ typedef ImageView GreyScaleImageView; typedef ImageView Grey16ImageView; typedef ImageView FloatImageView; typedef ImageView RGBImageView; typedef ImageView ComplexImageView; typedef ImageView OneBitImageView; typedef ImageView OneBitRleImageView; /* Connected-components */ typedef ConnectedComponent Cc; typedef ConnectedComponent RleCc; typedef std::list ConnectedComponents; typedef std::list RleConnectedComponents; typedef MultiLabelCC MlCc; typedef std::list MlCcs; /* Enumeration for all of the image types, pixel types, and storage types. */ enum PixelTypes { ONEBIT, GREYSCALE, GREY16, RGB, FLOAT, COMPLEX }; enum StorageTypes { DENSE, RLE }; /* To make the wrapping code a little easier these are all of the combinations of pixel and storage types. The order is so that the non-compressed views correspond to the PixelTypes. */ enum ImageCombinations { ONEBITIMAGEVIEW, GREYSCALEIMAGEVIEW, GREY16IMAGEVIEW, RGBIMAGEVIEW, FLOATIMAGEVIEW, COMPLEXIMAGEVIEW, ONEBITRLEIMAGEVIEW, CC, RLECC, MLCC }; enum ClassificationStates { UNCLASSIFIED, AUTOMATIC, HEURISTIC, MANUAL }; enum ConfidenceTypes { CONFIDENCE_DEFAULT, CONFIDENCE_KNNFRACTION, CONFIDENCE_INVERSEWEIGHT, CONFIDENCE_LINEARWEIGHT, CONFIDENCE_NUN, CONFIDENCE_NNDISTANCE, CONFIDENCE_AVGDISTANCE }; /* Factory for types based on an existing image. This makes it easier to make a new view from an existing type without worrying whether it is a Cc, etc. */ template struct ImageFactory { // data types typedef typename T::data_type data_type; typedef ImageData dense_data_type; typedef RleImageData rle_data_type; // view types typedef ImageView view_type; typedef ImageView dense_view_type; typedef ImageView rle_view_type; // cc types typedef ConnectedComponent cc_type; typedef ConnectedComponent dense_cc_type; typedef ConnectedComponent rle_cc_type; typedef std::list ccs_type; typedef std::list dense_ccs_type; typedef std::list rle_ccs_type; // methods for creating new images and views static view_type* new_view(const T& view) { view_type* nview = new view_type(*((data_type*)view.data()), view.origin(), view.dim()); return nview; } static view_type* new_view(const T& view, const Point& origin, const Dim& dim) { view_type* nview = new view_type(*((data_type*)view.data()), origin, dim); return nview; } static view_type* new_image(const T& view) { data_type* data = new data_type(view.nrows(), view.ncols(), view.offset_y(), view.offset_x()); view_type* nview = new view_type(*data, view.offset_y(), view.offset_x(), view.nrows(), view.ncols()); return nview; } }; template<> struct ImageFactory { // data types typedef RGBImageView::data_type data_type; typedef ImageData dense_data_type; typedef ImageData rle_data_type; // view types typedef ImageView view_type; typedef ImageView dense_view_type; typedef ImageView rle_view_type; // cc types typedef ConnectedComponent cc_type; typedef ConnectedComponent dense_cc_type; typedef ConnectedComponent rle_cc_type; typedef std::list ccs_type; typedef std::list dense_ccs_type; typedef std::list rle_ccs_type; static view_type* new_view(const RGBImageView& view) { view_type* nview = new view_type(*((data_type*)view.data()), view.origin(), view.dim()); return nview; } static view_type* new_view(const RGBImageView& view, const Point& origin, const Dim& dim) { view_type* nview = new view_type(*((data_type*)view.data()), origin, dim); return nview; } static view_type* new_image(const RGBImageView& view) { data_type* data = new data_type(view.dim(), view.origin()); view_type* nview = new view_type(*data, view.origin(), view.dim()); return nview; } }; template<> struct ImageFactory { // data types typedef ComplexImageView::data_type data_type; typedef ImageData dense_data_type; typedef ImageData rle_data_type; // view types typedef ImageView view_type; typedef ImageView dense_view_type; typedef ImageView rle_view_type; // cc types typedef ConnectedComponent cc_type; typedef ConnectedComponent dense_cc_type; typedef ConnectedComponent rle_cc_type; typedef std::list ccs_type; typedef std::list dense_ccs_type; typedef std::list rle_ccs_type; static view_type* new_view(const ComplexImageView& view) { view_type* nview = new view_type(*((data_type*)view.data()), view.origin(), view.dim()); return nview; } static view_type* new_view(const ComplexImageView& view, const Point& origin, const Dim& dim) { view_type* nview = new view_type(*((data_type*)view.data()), origin, dim); return nview; } static view_type* new_image(const ComplexImageView& view) { data_type* data = new data_type(view.dim(), view.origin()); view_type* nview = new view_type(*data, view.origin(), view.dim()); return nview; } }; /* TypeIdImageFactory This factory type can be used to easily create new images using the enums above. */ template struct TypeIdImageFactory { }; template<> struct TypeIdImageFactory { typedef OneBitImageData data_type; typedef OneBitImageView image_type; static image_type* create(const Point& origin, const Dim& dim) { data_type* data = new data_type(dim, origin); return new image_type(*data, origin, dim); } }; template<> struct TypeIdImageFactory { typedef OneBitRleImageData data_type; typedef OneBitRleImageView image_type; static image_type* create(const Point& origin, const Dim& dim) { data_type* data = new data_type(dim, origin); return new image_type(*data, origin, dim); } }; template<> struct TypeIdImageFactory { typedef GreyScaleImageData data_type; typedef GreyScaleImageView image_type; static image_type* create(const Point& origin, const Dim& dim) { data_type* data = new data_type(dim, origin); return new image_type(*data, origin, dim); } }; template<> struct TypeIdImageFactory { typedef Grey16ImageData data_type; typedef Grey16ImageView image_type; static image_type* create(const Point& origin, const Dim& dim) { data_type* data = new data_type(dim, origin); return new image_type(*data, origin, dim); } }; template<> struct TypeIdImageFactory { typedef RGBImageData data_type; typedef RGBImageView image_type; static image_type* create(const Point& origin, const Dim& dim) { data_type* data = new data_type(dim, origin); return new image_type(*data, origin, dim); } }; template<> struct TypeIdImageFactory { typedef ComplexImageData data_type; typedef ComplexImageView image_type; static image_type* create(const Point& origin, const Dim& dim) { data_type* data = new data_type(dim, origin); return new image_type(*data, origin, dim); } }; template<> struct TypeIdImageFactory { typedef FloatImageData data_type; typedef FloatImageView image_type; static image_type* create(const Point& origin, const Dim& dim) { data_type* data = new data_type(dim, origin); return new image_type(*data, origin, dim); } }; } #endif gamera-3.3.3/include/image_view.hpp0000644000076500000000000004074211652050140016213 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm11162001_image_view_hpp #define kwm11162001_image_view_hpp #include "image_view_iterators.hpp" #include "dimensions.hpp" #include "image.hpp" #include "accessor.hpp" #include "vigra_iterators.hpp" #include "vigra/utilities.hxx" #include #include #include #include #include /* IMAGEVIEW ---------- This is the "standard" view on a image data object. The goal of this class is to convert a 1-dimensional data structure (something like an array) into a 2-dimensional image that may or may not encompass the entire data available. DATA LAYOUT ----------- The image data is arranged in row-major format, meaning that the rows are concatenated together to form an array. The end of one row is followed by the begining of the next. The distance between the rows is called the stride. The index of any given row can be computed by multiplying the row number with the stride. Within each row, the each column is stored sequentially. The following diagram demonstrates. |stride | ------------------------- |1|2|3|4|1|2|3|4|1|2|3|4| (the numbers refer to the column) ------------------------- row 1 row 2 row 3 VIEWS ----- The goal of decoupling the 2-dimensional interface from the data is to allow a "view" on the data to be a very lightweight object. This allows it to be passed by value with little worry about performance. This also allows the processing of a portion of an image as if it were an entire image. This same effect can be acheived by storing sets of Vigra style 2D iterators, but the class interface is easily to manipulate in many situations and it is much simpler to wrap for python. ITERATOR CACHING ---------------- All of the operations to get and set pixels are done through iterators. To help with performance, iterators pointing to the beginning and end of the view dimensions are pre-calculated and stored (one const and one non-const). This should help speed up begin() and end() in exchange for a modest increase in the overall size of the object. INTERFACES ---------- This class presents several interfaces in an effort to ease porting of older code or integration with other libraries. The simplist access is through get and set methods: pixel_value = image.get(row, col); image.set(row, col, value); The disadvantage of this method is that each access requires a multiply and add. A similar interface to the get/set method is the operator[] interface. This presents an interface similar to a C multi-dimensional array. For example: pixel_value = image[row][column]; image[row][column] = value; */ namespace Gamera { using namespace vigra; template class ImageView : public ImageBase { public: using ImageBase::ncols; using ImageBase::nrows; using ImageBase::offset_x; using ImageBase::offset_y; // standard STL typedefs typedef typename T::value_type value_type; typedef typename T::pointer pointer; typedef typename T::reference reference; typedef typename T::difference_type difference_type; // Gamera specific typedef T data_type; typedef ImageAccessor accessor; // Vigra typedefs typedef value_type PixelType; // convenience typedefs typedef ImageView self; typedef ImageBase base_type; // // CONSTRUCTORS // ImageView() : base_type() { m_image_data = 0; } // range check is optional at construction to allow for cases // the data is not correctly sized at creation time. See // dense_image.hpp for a situation where this occurs. KWM #ifdef GAMERA_DEPRECATED /* ImageView(T& image_data, size_t offset_y, size_t offset_x, size_t nrows, size_t ncols, bool do_range_check = true) is deprecated. Reason: (x, y) coordinate consistency. Use ImageView(image_data, Point(offset_x, offset_y), Dim(ncols, nrows), do_range_check) instead. */ ImageView(T& image_data, size_t offset_y, size_t offset_x, size_t nrows, size_t ncols, bool do_range_check = true) GAMERA_CPP_DEPRECATED; #endif ImageView(T& image_data) : base_type(image_data.offset(), image_data.dim()) { m_image_data = &image_data; range_check(); calculate_iterators(); } ImageView(T& image_data, const Rect& rect, bool do_range_check = true) : base_type(rect) { m_image_data = &image_data; if (do_range_check) { range_check(); calculate_iterators(); } } ImageView(T& image_data, const Point& upper_left, const Point& lower_right, bool do_range_check = true) : base_type(upper_left, lower_right) { m_image_data = &image_data; if (do_range_check) { range_check(); calculate_iterators(); } } ImageView(T& image_data, const Point& upper_left, const Size& size, bool do_range_check = true) : base_type(upper_left, size) { m_image_data = &image_data; if (do_range_check) { range_check(); calculate_iterators(); } } #ifdef GAMERA_DEPRECATED /* ImageView(T& image_data, const Point& upper_left, const Dimensions& dim, bool do_range_check = true) is deprecated. Reason: (x, y) coordinate consistency. (Dimensions is now deprecated in favor of Dim). Use ImageView(image_data, Point(offset_x, offset_y), Dim(ncols, nrows), do_range_check) instead. */ ImageView(T& image_data, const Point& upper_left, const Dimensions& dim, bool do_range_check = true) GAMERA_CPP_DEPRECATED; #endif ImageView(T& image_data, const Point& upper_left, const Dim& dim, bool do_range_check = true) : base_type(upper_left, dim) { m_image_data = &image_data; if (do_range_check) { range_check(); calculate_iterators(); } } // // COPY CONSTRUCTORS // #ifdef GAMERA_DEPRECATED /* ImageView(const self& other, size_t offset_y, size_t offset_x, size_t nrows, size_t ncols, bool do_range_check = true) is deprecated. Reason: (x, y) coordinate consistency. Use ImageView(other, Point(offset_x, offset_y), Dim(ncols, nrows), do_range_check) instead. */ ImageView(const self& other, size_t offset_y, size_t offset_x, size_t nrows, size_t ncols) GAMERA_CPP_DEPRECATED; #endif ImageView(const self& other, const Rect& rect) : base_type(rect) { m_image_data = other.m_image_data; range_check(); calculate_iterators(); } ImageView(const self& other, const Point& upper_left, const Point& lower_right) : base_type(upper_left, lower_right) { m_image_data = other.m_image_data; range_check(); calculate_iterators(); } ImageView(const self& other, const Point& upper_left, const Size& size) : base_type(upper_left, size) { m_image_data = other.m_image_data; range_check(); calculate_iterators(); } #ifdef GAMERA_DEPRECATED /* ImageView(const self& other, const Point& upper_left, const Dimensions& dim, bool do_range_check = true) is deprecated. Reason: (x, y) coordinate consistency. (Dimensions is now deprecated in favor of Dim). Use ImageView(other, Point(offset_x, offset_y), Dim(ncols, nrows), do_range_check) instead. */ ImageView(const self& other, const Point& upper_left, const Dimensions& dim) GAMERA_CPP_DEPRECATED; #endif ImageView(const self& other, const Point& upper_left, const Dim& dim) : base_type(upper_left, dim) { m_image_data = other.m_image_data; range_check(); calculate_iterators(); } // // FUNCTION ACCESS // #ifdef GAMERA_DEPRECATED /* ImageView::get(size_t row, size_t col) is deprecated. Reason: (x, y) coordinate consistency. Use ImageView::get(Point(col, row)) instead. */ GAMERA_CPP_DEPRECATED value_type get(size_t row, size_t col) const { return m_accessor(m_const_begin + (row * m_image_data->stride()) + col); } #endif #ifdef GAMERA_DEPRECATED /* ImageView::set(size_t row, size_t col, value_type value) is deprecated. Reason: (x, y) coordinate consistency. Use ImageView::get(Point(col, row)) instead. */ GAMERA_CPP_DEPRECATED void set(size_t row, size_t col, value_type value) { m_accessor.set(value, m_begin + (row * m_image_data->stride()) + col); } #endif value_type get(const Point& p) const { return m_accessor(m_const_begin + (p.y() * m_image_data->stride()) + p.x()); } void set(const Point& p, value_type value) { m_accessor.set(value, m_begin + (p.y() * m_image_data->stride()) + p.x()); } // // Misc // virtual T* data() const { return m_image_data; } self parent() const { return self(*m_image_data, m_image_data->offset(), m_image_data->dim()); } self& image() { return *this; } // // Iterators // typedef ImageViewDetail::RowIterator row_iterator; row_iterator row_begin() { return row_iterator(this, m_begin); } row_iterator row_end() { return row_iterator(this, m_end); } typedef ImageViewDetail::ColIterator col_iterator; col_iterator col_begin() { return col_iterator(this, m_begin); } col_iterator col_end() { return col_iterator(this, m_begin + ncols()); } // // Const Iterators // typedef ImageViewDetail::ConstRowIterator const_row_iterator; const_row_iterator row_begin() const { return const_row_iterator(this, m_const_begin); } const_row_iterator row_end() const { return const_row_iterator(this, m_const_end); } typedef ImageViewDetail::ConstColIterator const_col_iterator; const_col_iterator col_begin() const { return const_col_iterator(this, m_const_begin); } const_col_iterator col_end() const { return const_col_iterator(this, m_const_begin + ncols()); } // // 2D iterators // typedef Gamera::ImageIterator Iterator; Iterator upperLeft() { return Iterator(this, m_image_data->begin(), m_image_data->stride()) + Diff2D(offset_x() - m_image_data->page_offset_x(), offset_y() - m_image_data->page_offset_y()); } Iterator lowerRight() { return Iterator(this, m_image_data->begin(), m_image_data->stride()) + Diff2D(offset_x() + ncols() - m_image_data->page_offset_x(), offset_y() + nrows() - m_image_data->page_offset_y()); } typedef Gamera::ConstImageIterator ConstIterator; ConstIterator upperLeft() const { return ConstIterator(this, static_cast(m_image_data)->begin(), m_image_data->stride()) + Diff2D(offset_x() - m_image_data->page_offset_x(), offset_y() - m_image_data->page_offset_y()); } ConstIterator lowerRight() const { return ConstIterator(this, static_cast(m_image_data)->begin(), m_image_data->stride()) + Diff2D(offset_x() + ncols() - m_image_data->page_offset_x(), offset_y() + nrows() - m_image_data->page_offset_y()); } // // Vector iterator // typedef ImageViewDetail::VecIterator vec_iterator; vec_iterator vec_begin() { return vec_iterator(row_begin()); } vec_iterator vec_end() { return vec_iterator(row_end()); } typedef ImageViewDetail::ConstVecIterator const_vec_iterator; const_vec_iterator vec_begin() const { return const_vec_iterator(row_begin()); } const_vec_iterator vec_end() const { return const_vec_iterator(row_end()); } // // OPERATOR ACCESS // typename T::iterator operator[](size_t n) const { return m_begin + (n * data()->stride()); } protected: // redefine the dimensions change function from Rect virtual void dimensions_change() { range_check(); calculate_iterators(); } void calculate_iterators() { m_begin = m_image_data->begin() // row offset + (m_image_data->stride() * (offset_y() - m_image_data->page_offset_y())) // col offset + (offset_x() - m_image_data->page_offset_x()); m_end = m_image_data->begin() // row offset + (m_image_data->stride() * ((offset_y() - m_image_data->page_offset_y()) + nrows())) // column offset + (offset_x() - m_image_data->page_offset_x()); const T* cmd = static_cast(m_image_data); m_const_begin = cmd->begin() // row offset + (m_image_data->stride() * (offset_y() - m_image_data->page_offset_y())) // col offset + (offset_x() - m_image_data->page_offset_x()); m_const_end = cmd->begin() // row offset + (m_image_data->stride() * ((offset_y() - m_image_data->page_offset_y()) + nrows())) // column offset + (offset_x() - m_image_data->page_offset_x()); } void range_check() { if (offset_y() + nrows() - m_image_data->page_offset_y() > m_image_data->nrows() || offset_x() + ncols() - m_image_data->page_offset_x() > m_image_data->ncols() || offset_y() < m_image_data->page_offset_y() || offset_x() < m_image_data->page_offset_x()) { char error[1024]; sprintf(error, "Image view dimensions out of range for data\n"); sprintf(error, "%s\tnrows %d\n", error, (int)nrows()); sprintf(error, "%s\toffset_y %d\n", error, (int)offset_y()); sprintf(error, "%s\tdata nrows %d\n", error, (int)m_image_data->nrows()); sprintf(error, "%s\tdata offset_y %d\n", error, (int)m_image_data->page_offset_y()); sprintf(error, "%s\tncols %d\n", error, (int)ncols()); sprintf(error, "%s\toffset_x %d\n", error, (int)offset_x()); sprintf(error, "%s\tdata ncols %d\n", error,(int)m_image_data->ncols()); sprintf(error, "%s\tdata offset_x %d\n", error, (int)m_image_data->page_offset_x()); throw std::range_error(error); } } T* m_image_data; typename T::iterator m_begin, m_end; typename T::const_iterator m_const_begin, m_const_end; accessor m_accessor; }; #ifdef GAMERA_DEPRECATED template ImageView::ImageView(T& image_data, size_t offset_y, size_t offset_x, size_t nrows, size_t ncols, bool do_range_check) : base_type(Point(offset_x, offset_y), Dim(ncols, nrows)) { m_image_data = &image_data; if (do_range_check) { range_check(); calculate_iterators(); } } template ImageView::ImageView(T& image_data, const Point& upper_left, const Dimensions& dim, bool do_range_check) : base_type(upper_left, Dim(dim.ncols(), dim.nrows())) { m_image_data = &image_data; if (do_range_check) { range_check(); calculate_iterators(); } } template ImageView::ImageView(const self& other, size_t offset_y, size_t offset_x, size_t nrows, size_t ncols) : base_type(Point(offset_x, offset_y), Dim(ncols, nrows)) { m_image_data = other.m_image_data; range_check(); calculate_iterators(); } template ImageView::ImageView(const self& other, const Point& upper_left, const Dimensions& dim) : base_type(upper_left, Dim(dim.ncols(), dim.nrows())) { m_image_data = other.m_image_data; range_check(); calculate_iterators(); } #endif } #endif gamera-3.3.3/include/image_view_iterators.hpp0000644000076500000000000001724511652050140020311 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm01022002_image_view_iterators_hpp #define kwm01022002_image_view_iterators_hpp #include "accessor.hpp" #include "iterator_base.hpp" namespace Gamera { namespace ImageViewDetail { template class ColIterator; template class RowIterator : public RowIteratorBase, T> { public: using RowIteratorBase, T>::m_iterator; using RowIteratorBase, T>::m_image; // Typedefs for rows typedef ColIterator iterator; // Convenience typedefs typedef RowIterator self; typedef RowIteratorBase base; typedef typename base::value_type value_type; typedef ImageAccessor accessor; // Constructor RowIterator(Image* image, const T iterator) : base(image, iterator) { } RowIterator() { } typename base::reference operator*() const { return *m_iterator; } typename base::pointer operator->() const { return &*m_iterator; } value_type get() const { return m_accessor(m_iterator); } void set(const value_type& v) { m_accessor.set(v, m_iterator); } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator + m_image->ncols()); } private: accessor m_accessor; }; template class ColIterator : public ColIteratorBase, T> { public: using ColIteratorBase, T>::m_iterator; using ColIteratorBase, T>::m_image; // Typedefs for Cols typedef RowIterator iterator; // Convenience typedefs typedef ColIterator self; typedef ColIteratorBase base; typedef typename base::value_type value_type; typedef ImageAccessor accessor; // Constructor ColIterator(Image* image, const T iterator) : base(image, iterator) { } ColIterator() { } typename base::reference operator*() const { return *m_iterator; } typename base::pointer operator->() const { return &*m_iterator; } // Image specific value_type get() const { return m_accessor(m_iterator); } void set(const value_type& v) { m_accessor.set(v, m_iterator); } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator) + m_image->nrows(); } private: accessor m_accessor; }; template class ConstColIterator; template class ConstRowIterator : public RowIteratorBase, T> { public: using RowIteratorBase, T>::m_iterator; using RowIteratorBase, T>::m_image; // Typedefs for rows typedef ConstColIterator iterator; // Convenience typedefs typedef ConstRowIterator self; typedef RowIteratorBase base; typedef typename base::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstRowIterator(Image* image, const T iterator) : base(image, iterator) { } ConstRowIterator() { } typename Image::value_type operator*() const { return *m_iterator; } typename base::pointer operator->() const { return &*m_iterator; } value_type get() const { return m_accessor(m_iterator); } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator + m_image->ncols()); } private: accessor m_accessor; }; template class ConstColIterator : public ColIteratorBase, T> { public: using ColIteratorBase, T>::m_iterator; using ColIteratorBase, T>::m_image; // Typedefs for Cols typedef ConstRowIterator iterator; // Convenience typedefs typedef ConstColIterator self; typedef ColIteratorBase base; typedef typename base::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstColIterator(Image* image, const T iterator) : base(image, iterator) { } ConstColIterator() { } typename Image::value_type operator*() const { return *m_iterator; } typename base::pointer operator->() const { return &*m_iterator; } // Image specific value_type get() const { return m_accessor(m_iterator); } iterator begin() const { return iterator(m_image, m_iterator); } iterator end() const { return iterator(m_image, m_iterator) + m_image->nrows(); } private: accessor m_accessor; }; template class VecIterator : public VecIteratorBase > { public: using VecIteratorBase >::m_coliterator; typedef VecIterator self; typedef VecIteratorBase base; typedef typename base::value_type value_type; typedef ImageAccessor accessor; // Constructor VecIterator(const Row iterator) : base(iterator) { } VecIterator() { } // Operators typename base::reference operator*() const { return *m_coliterator; } typename base::pointer operator->() const { return &*m_coliterator; } value_type get() const { return m_accessor(m_coliterator); } void set(const value_type& v) { m_accessor.set(v, m_coliterator); } private: accessor m_accessor; }; template class ConstVecIterator : public VecIteratorBase > { public: using VecIteratorBase >::m_coliterator; typedef ConstVecIterator self; typedef VecIteratorBase base; typedef typename base::value_type value_type; typedef ImageAccessor accessor; // Constructor ConstVecIterator(const Row iterator) : base(iterator) { } ConstVecIterator() { } // Operators typename Image::value_type operator*() const { return *m_coliterator; } typename base::pointer operator->() const { return &*m_coliterator; } value_type get() const { return m_accessor(m_coliterator); } private: accessor m_accessor; }; } // namespace } // namespace #endif gamera-3.3.3/include/iterator_base.hpp0000644000076500000000000002754111652050140016724 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm07172002_iterator_base #define kwm07172002_iterator_base #include "accessor.hpp" namespace Gamera { // some convenience functions // find the current row template inline size_t row_number(const Mat* mat, const T curr) { return ((curr - mat->data()->begin()) / mat->data()->stride()) - mat->offset_y(); } // find the current col template inline size_t col_number(const Mat* mat, const T curr) { size_t row = row_number(mat, curr) + mat->offset_y(); T row_begin = mat->data()->begin() + (row * mat->data()->stride()); return (curr - row_begin) - mat->offset_x(); } template class RowIteratorBase : public std::iterator { public: // Convenience typedefs typedef std::iterator base_type; typedef Iterator self; // Constructor RowIteratorBase(Image* image, const T iterator) : m_image(image), m_iterator(iterator) { } RowIteratorBase() { } self& operator++() { m_iterator += m_image->data()->stride(); return (self&)*this; } self operator++(int) { self tmp; tmp.m_image = m_image; tmp.m_iterator = m_iterator; m_iterator += m_image->data()->stride(); return tmp; } self& operator--() { m_iterator -= m_image->data()->stride(); return (self&)*this; } self operator--(int) { self tmp; tmp.m_image = m_image; tmp.m_iterator = m_iterator; m_iterator -= m_image->data()->stride(); return tmp; } self& operator+=(size_t n) { m_iterator += m_image->data()->stride() * n; return (self&)*this; } self operator+(size_t n) const { self tmp; tmp.m_image = m_image; tmp.m_iterator = m_iterator + (m_image->data()->stride() * n); return tmp; } self& operator-=(size_t n) { m_iterator -= m_image->data()->stride() * n; return (self&)*this; } self operator-(size_t n) const { self tmp; tmp.m_image = m_image; tmp.m_iterator = m_iterator - (m_image->data()->stride() * n); return tmp; } bool operator==(const RowIteratorBase& other) const { return m_iterator == other.m_iterator; } bool operator!=(const RowIteratorBase& other) const { return m_iterator != other.m_iterator; } bool operator<(const RowIteratorBase& other) const { return m_iterator < other.m_iterator; } bool operator<=(const RowIteratorBase& other) const { return m_iterator <= other.m_iterator; } bool operator>(const RowIteratorBase& other) const { return m_iterator > other.m_iterator; } bool operator>=(const RowIteratorBase& other) const { return m_iterator >= other.m_iterator; } typename base_type::difference_type operator-(const RowIteratorBase& other) const { return (m_iterator - other.m_iterator) / m_image->data()->stride(); } size_t row() const { return row_number(m_image, m_iterator); } size_t col() const { return col_number(m_image, m_iterator); } public: Image* m_image; T m_iterator; }; template class ColIteratorBase : public std::iterator { public: // Convenience typedefs typedef std::iterator base_type; typedef Iterator self; // Constructor ColIteratorBase(Image* image, const T iterator) : m_iterator(iterator), m_image(image) { } ColIteratorBase() { } self& operator++() { ++m_iterator; return (self&)*this; } self operator++(int) { self tmp; tmp.m_image = m_image; tmp.m_iterator = m_iterator; ++m_iterator; return tmp; } self& operator--() { --m_iterator; return (self&)*this; } self operator--(int) { self tmp; tmp.m_image = m_image; tmp.m_iterator = m_iterator; --m_iterator; return tmp; } self& operator+=(size_t n) { m_iterator += n; return (self&)*this; } self operator+(size_t n) const { self tmp; tmp.m_image = m_image; tmp.m_iterator = m_iterator + n; return tmp; } self& operator-=(size_t n) { m_iterator -= n; return (self&)*this; } self operator-(size_t n) const { self tmp; tmp.m_image = m_image; tmp.m_iterator = m_iterator - n; return tmp; } bool operator==(const ColIteratorBase& other) const { return m_iterator == other.m_iterator; } bool operator!=(const ColIteratorBase& other) const { return m_iterator != other.m_iterator; } bool operator<(const ColIteratorBase& other) const { return m_iterator < other.m_iterator; } bool operator<=(const ColIteratorBase& other) const { return m_iterator <= other.m_iterator; } bool operator>(const ColIteratorBase& other) const { return m_iterator > other.m_iterator; } bool operator>=(const ColIteratorBase& other) const { return m_iterator >= other.m_iterator; } typename base_type::difference_type operator-(const ColIteratorBase& other) const { return (m_iterator - other.m_iterator); } // Image specific size_t row() const { return row_number(m_image, m_iterator); } size_t col() const { return col_number(m_image, m_iterator); } public: T m_iterator; Image* m_image; }; template class VecIteratorBase : public std::iterator { public: // Convenience typedefs typedef std::iterator base_type; typedef Iterator self; // Constructor VecIteratorBase(const Row iterator) : m_rowiterator(iterator), m_coliterator(m_rowiterator.begin()) { } VecIteratorBase() { } // Operators self& operator++() { ++m_coliterator; // If we are at the end of the row, go down to the next column if (m_coliterator == m_rowiterator.end()) { ++m_rowiterator; m_coliterator = m_rowiterator.begin(); } return (self&)*this; } self operator++(int) { self tmp; tmp.m_rowiterator = m_rowiterator; tmp.m_coliterator = m_coliterator; this->operator++(); return tmp; } self& operator+=(size_t n) { // Find out if we have enough rome to just move the col iterator size_t distance_to_col_end = m_rowiterator.end() - m_coliterator; // The easy case - we have enough room if (distance_to_col_end > n) { m_coliterator += n; } else { size_t left_to_move = n - distance_to_col_end; if (left_to_move == 0) { // if we are just moving to the beginning of the next row ++m_rowiterator; m_coliterator = m_rowiterator.begin(); } else { size_t col_length = m_rowiterator.end() - m_rowiterator.begin(); size_t nrows_to_move = (left_to_move / col_length); // move the row iterator - plus one because we always move at least 1 row m_rowiterator += nrows_to_move + 1; // the plus one is for moving to the beginning of a row left_to_move -= (nrows_to_move * col_length); // move the col iterator m_coliterator = m_rowiterator.begin() + left_to_move; } } return (self&)*this; } self operator+(size_t n) { self tmp; tmp.m_rowiterator = m_rowiterator; tmp.m_coliterator = m_coliterator; tmp += n; return tmp; } self& operator--() { // If we are at the begining of the row if (m_coliterator == m_rowiterator.begin()) { --m_rowiterator; m_coliterator = m_rowiterator.end(); } --m_coliterator; return (self&)*this; } self operator--(int) { self tmp; tmp.m_rowiterator = m_rowiterator; tmp.m_coliterator = m_coliterator; this->operator--(); return tmp; } self& operator-=(size_t n) { // Find out if we have enough rome to just move the col iterator size_t distance_to_col_begin = m_coliterator - m_rowiterator.begin(); // The easy case - we have enough room if (distance_to_col_begin >= n) { m_coliterator -= n; } else { size_t left_to_move = n - distance_to_col_begin; size_t col_length = m_rowiterator.end() - m_rowiterator.begin(); size_t nrows_to_move = (left_to_move / col_length); // move the row iterator - plus one because we always move at least 1 row m_rowiterator -= nrows_to_move + 1; // the plus one is for moving to the beginning of a row left_to_move -= (nrows_to_move * col_length); // move the col iterator m_coliterator = m_rowiterator.end() - (left_to_move); } return (self&)*this; } self operator-(size_t n) { self tmp; tmp.m_rowiterator = m_rowiterator; tmp.m_coliterator = m_coliterator; tmp -= n; return tmp; } bool operator==(const VecIteratorBase& other) const { return m_coliterator == other.m_coliterator; } bool operator!=(const VecIteratorBase& other) const { return m_coliterator != other.m_coliterator; } bool operator<(const VecIteratorBase& other) const { return m_coliterator < other.m_coliterator; } bool operator<=(const VecIteratorBase& other) const { return m_coliterator <= other.m_coliterator; } bool operator>(const VecIteratorBase& other) const { return m_coliterator > other.m_coliterator; } bool operator>=(const VecIteratorBase& other) const { return m_coliterator >= other.m_coliterator; } typename base_type::difference_type operator-(const self& other) const { size_t nrows = m_rowiterator - other.m_rowiterator; // simple case - nrows = 0 so we can just compare the coliterators if (nrows == 0) { return m_coliterator - other.m_coliterator; } else { size_t other_col_distance = other.m_rowiterator.end() - other.m_coliterator; size_t col_distance = m_coliterator - m_rowiterator.begin(); size_t col_length = m_rowiterator.end() - m_rowiterator.begin(); return ((nrows - 1) * col_length) + other_col_distance + col_distance; } } size_t row() const { return m_rowiterator.row(); } size_t col() const { return m_coliterator.col(); } public: Row m_rowiterator; Col m_coliterator; }; } #endif gamera-3.3.3/include/knn.hpp0000644000076500000000000005201411652050140014660 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm08142002_knn #define kwm08142002_knn #include "gamera_limits.hpp" #include #include #include #include #include #include #include namespace Gamera { namespace kNN { /* DISTANCE FUNCTIONS */ /* Compute the weighted distance between a known feature and an unknown feature using the city block method. IterA: iterator type for the known feature vector IterB: iterator type for the unknown feature vector IterC: iterator type for the weighting vector */ template inline double city_block_distance(IterA known, const IterA end, IterB unknown, IterC weight) { double distance = 0; for (; known != end; ++known, ++unknown, ++weight) distance += *weight * std::abs(*unknown - *known); return distance; } /* Compute the weighted distance between a known feature and an unknown feature using the euclidean method. IterA: iterator type for the known feature vector IterB: iterator type for the unknown feature vector IterC: iterator type for the weighting vector */ template inline double euclidean_distance(IterA known, const IterA end, IterB unknown, IterC weight) { double distance = 0; for (; known != end; ++known, ++unknown, ++weight) distance += *weight * std::sqrt((*unknown - *known) * (*unknown - *known)); return distance; } /* Compute the weighted distance between a known feature and an unknown feature using the fast euclidean method. IterA: iterator type for the known feature vector IterB: iterator type for the unknown feature vector IterC: iterator type for the weighting vector */ template inline double fast_euclidean_distance(IterA known, const IterA end, IterB unknown, IterC weight) { double distance = 0; for (; known != end; ++known, ++unknown, ++weight) distance += *weight * ((*unknown - *known) * (*unknown - *known)); return distance; } /* DISTANCE FUNCTIONS with skip. These distance functions allow you to skip certain features in the feature vector. This allows you to evaluate a subset of feature vectors with leave-one-out, for example. This is done by passing in a list of indexes to be used for the distance calculation. For example, if you have a feature vector of length 4 and you want to skip the second feature, you would pass in an iterator pair for a container of [0, 2, 3]. */ /* Compute the weighted distance between a known feature and an unknown feature using the city block method. IterA: iterator type for the known feature vector IterB: iterator type for the unknown feature vector IterC: iterator type for the weighting vector */ template inline double city_block_distance_skip(IterA known, IterB unknown, IterC weight, IterD indexes, const IterD end) { double distance = 0; for (; indexes != end; ++indexes) distance += weight[*indexes] * std::abs(unknown[*indexes] - known[*indexes]); return distance; } /* Compute the weighted distance between a known feature and an unknown feature using the euclidean method. IterA: iterator type for the known feature vector IterB: iterator type for the unknown feature vector IterC: iterator type for the weighting vector */ template inline double euclidean_distance_skip(IterA known, IterB unknown, IterC weight, IterD indexes, const IterD end) { double distance = 0; for (; indexes != end; ++indexes) distance += weight[*indexes] * std::sqrt((unknown[*indexes] - known[*indexes]) * (unknown[*indexes] - known[*indexes])); return distance; } /* Compute the weighted distance between a known feature and an unknown feature using the fast euclidean method. IterA: iterator type for the known feature vector IterB: iterator type for the unknown feature vector IterC: iterator type for the weighting vector */ template inline double fast_euclidean_distance_skip(IterA known, IterB unknown, IterC weight, IterD indexes, const IterD end) { double distance = 0; for (; indexes != end; ++indexes) distance += weight[*indexes] * ((unknown[*indexes] - known[*indexes]) * (unknown[*indexes] - known[*indexes])); return distance; } /* NORMALIZE Normalize is used to compute normalization of the feature vectors in a database of known feature vectors and then to apply that normalization to feature vectors. It only works with doubles. Like the kNearestNeighbors class below, Normalize avoids knowing anything about the data structures used for storing the feature vectors. The add method is called for each feature vector, compute_normalization is called, and then feature vectors can be normalized by calling apply. */ class Normalize { public: Normalize(size_t num_features) { m_num_features = num_features; m_num_feature_vectors = 0; m_norm_vector = new double[m_num_features]; std::fill(m_norm_vector, m_norm_vector + m_num_features, 0.0); m_sum_vector = new double[m_num_features]; std::fill(m_sum_vector, m_sum_vector + m_num_features, 0.0); m_sum2_vector = new double[m_num_features]; std::fill(m_sum2_vector, m_sum2_vector + m_num_features, 0.0); } ~Normalize() { if (m_sum_vector != 0) delete[] m_sum_vector; if (m_sum2_vector != 0) delete[] m_sum2_vector; delete[] m_norm_vector; } template void add(T begin, const T end) { assert(m_sum_vector != 0 && m_sum2_vector != 0); if (size_t(end - begin) != m_num_features) throw std::range_error("Normalize: number features did not match."); for (size_t i = 0; begin != end; ++begin, ++i) { m_sum_vector[i] += *begin; m_sum2_vector[i] += *begin * *begin; } ++m_num_feature_vectors; } void compute_normalization() { assert(m_sum_vector != 0 && m_sum2_vector != 0); double mean, var, stdev, sum, sum2; for (size_t i = 0; i < m_num_features; ++i) { sum = m_sum_vector[i]; sum2 = m_sum2_vector[i]; mean = sum / m_num_feature_vectors; var = (m_num_feature_vectors * sum2 - sum * sum) / (m_num_feature_vectors * (m_num_feature_vectors - 1)); stdev = std::sqrt(var); if (stdev < 0.00001) stdev = 0.00001; m_norm_vector[i] = mean / stdev; } delete[] m_sum_vector; m_sum_vector = 0; delete[] m_sum2_vector; m_sum2_vector = 0; } // in-place template void apply(T begin, const T end) const { assert(size_t(end - begin) == m_num_features); double* cur = m_norm_vector; for (; begin != end; ++begin, ++cur) *begin -= *cur; } // out-of-place template void apply(T in_begin, const T end, U out_begin) const { assert(size_t(end - in_begin) == m_num_features); double* cur = m_norm_vector; for (; in_begin != end; ++in_begin, ++cur, ++out_begin) *out_begin = *in_begin - *cur; } size_t num_features() const { return m_num_features; } double* get_norm_vector() const { return m_norm_vector; } template void set_norm_vector(T begin, const T end) { //assert(size_t(end - in_begin) == m_num_features); double* cur = m_norm_vector; for (; begin != end; ++begin, ++cur) *cur = *begin; } private: size_t m_num_features; size_t m_num_feature_vectors; double* m_norm_vector; double* m_sum_vector; double* m_sum2_vector; }; /* K NEAREST NEIGHBORS This class holds a list of the k nearest neighbors and provides a method of querying for the id of the majority of neighbors. This class is meant to be used once - after calling add for each item in a database and majority the state of the class is undefined. If another search needs to be performed call reset (at which point add for each element will need to be called again). */ template class kNearestNeighbors { public: /* These nested classes are only used in kNearestNeighbors */ /* NEIGHBOR This class holds the information needed for the Nearest Neighbor computation. IdType: the type for the id (possibilities includes longs and std::string) */ class Neighbor { public: Neighbor(IdType id_, double distance_) { id = id_; distance = distance_; } bool operator<(const Neighbor& other) const { return distance < other.distance; } IdType id; double distance; }; class IdStat { public: IdStat() { min_distance = std::numeric_limits::max(); count = 0; } IdStat(double distance, size_t c) { min_distance = distance; count = c; } double min_distance; double total_distance; size_t count; }; // typedefs for convenience typedef IdType id_type; typedef Neighbor neighbor_type; typedef std::vector vec_type; // Constructor kNearestNeighbors(size_t k = 1) : m_k(k) { m_max_distance = 0; m_nun = NULL; } // Destructor ~kNearestNeighbors() { if (m_nun) delete m_nun; } // Reset the class to its initial state void reset() { m_nn.clear(); m_max_distance = 0; if (m_nun) delete m_nun; m_nun = NULL; } /* Attempt to add a neighbor to the list of k closest neighbors. The list of neighbors is always kept sorted so that the largest distance is the last element. */ void add(const id_type id, double distance) { // update nearest unlike neighbor if (!m_nn.empty() && !ceq(m_nn[0].id,id)) { if (!m_nun) { if (distance < m_nn[0].distance) m_nun = new neighbor_type(m_nn[0].id, m_nn[0].distance); else m_nun = new neighbor_type(id, distance); } else { if (distance < m_nn[0].distance) { m_nun->id = m_nn[0].id; m_nun->distance = m_nn[0].distance; } else if (distance < m_nun->distance) { m_nun->id = id; m_nun->distance = distance; } } } // update list of k nearest neighbors if (m_nn.size() < m_k) { m_nn.push_back(neighbor_type(id, distance)); std::sort(m_nn.begin(), m_nn.end()); } else if (distance < m_nn.back().distance) { m_nn.back().distance = distance; m_nn.back().id = id; std::sort(m_nn.begin(), m_nn.end()); } if (distance > m_max_distance) m_max_distance = distance; } /* Find the id of the majority of the k nearest neighbors. This includes tie-breaking if necessary. */ void majority() { answer.clear(); if (m_nn.size() == 0) throw std::range_error("majority called without enough valid neighbors."); // short circuit for k == 1 if (m_nn.size() == 1) { answer.resize(1); answer[0] = std::make_pair(m_nn[0].id, m_nn[0].distance); return; } /* Create a histogram of the ids in the nearest neighbors. A map is used because the id_type could be anything. Additionally, even if id_type was an integer there is no garuntee that they are small, ordered numbers (making a vector impractical). */ typedef std::map map_type; map_type id_map; typename map_type::iterator current; for (typename vec_type::iterator i = m_nn.begin(); i != m_nn.end(); ++i) { current = id_map.find(i->id); if (current == id_map.end()) { id_map.insert(std::pair(i->id, IdStat(i->distance, 1))); } else { current->second.count++; current->second.total_distance += i->distance; if (current->second.min_distance > i->distance) current->second.min_distance = i->distance; } } /* Now that we have the histogram we can take the majority if there is a clear winner, but if not, we need do some sort of tie breaking. */ if (id_map.size() == 1) { answer.resize(1); answer[0] = std::make_pair(id_map.begin()->first, id_map.begin()->second.min_distance); return; } else { /* Find the id(s) with the maximum */ std::vector max; max.push_back(id_map.begin()); for (typename map_type::iterator i = id_map.begin(); i != id_map.end(); ++i) { if (i->second.count > max[0]->second.count) { max.clear(); max.push_back(i); } else if (i->second.count == max[0]->second.count) { max.push_back(i); } } /* If the vector only has 1 element there are no ties and we are done. */ if (max.size() == 1) { // put the winner in the result vector answer.push_back(std::make_pair(max[0]->first, max[0]->second.min_distance)); // remove the winner from the id_map id_map.erase(max[0]); } else { /* Tie-break by average distance */ typename map_type::iterator min_dist = max[0]; for (size_t i = 1; i < max.size(); ++i) { if (max[i]->second.total_distance < min_dist->second.total_distance) min_dist = max[i]; } answer.push_back(std::make_pair(min_dist->first, min_dist->second.min_distance)); id_map.erase(min_dist); } for (typename map_type::iterator i = id_map.begin(); i != id_map.end(); ++i) { // Could not figure out why distance should be < 1 for additional // classes => let us instead return all classes among kNN (CD) //if (i->second.min_distance < 1) answer.push_back(std::make_pair(i->first, i->second.min_distance)); } return; } } void calculate_confidences() { size_t i,j; static double epsilonmin = std::numeric_limits::min(); static double epsilon = std::numeric_limits::epsilon(); confidence.clear(); if (answer.empty()) return; for (i = 0; i < confidence_types.size(); ++i) { if (CONFIDENCE_DEFAULT == confidence_types[i]) { confidence.push_back(get_default_confidence(answer[0].second)); } // fraction of main class among k nearest neighbors else if (CONFIDENCE_KNNFRACTION == confidence_types[i]) { size_t m = 0; id_type mainid = answer[0].first; for (j = 0; j < m_nn.size(); ++j) { if (ceq(m_nn[j].id, mainid)) { m++; } } confidence.push_back(((double)m)/m_nn.size()); } // inversely weighted average else if (CONFIDENCE_INVERSEWEIGHT == confidence_types[i]) { id_type mainid = answer[0].first; if (m_nn[0].distance < 256*epsilonmin) { // zero distance => compute fraction among zero distances size_t m = 1; size_t n = 1; for (j = 1; j < m_nn.size(); ++j) { if (m_nn[j].distance < 256*epsilonmin) { n++; if (ceq(m_nn[j].id, mainid)) m++; } } confidence.push_back(((double)m)/n); } else { double numerator = 0.0; double denominator = 0.0; double weight; for (j = 0; j < m_nn.size(); ++j) { weight = 1 / m_nn[j].distance; denominator += weight; if (ceq(m_nn[j].id, mainid)) numerator += weight; } confidence.push_back(numerator/denominator); } } // linearly weighted average else if (CONFIDENCE_LINEARWEIGHT == confidence_types[i]) { id_type mainid = answer[0].first; if (1.0 - m_nn[0].distance / m_nn.back().distance < 8*epsilon) { // distance to all neighbors equal => compute knn fraction size_t m = 0; for (j = 0; j < m_nn.size(); ++j) { if (ceq(m_nn[j].id, mainid)) m++; } confidence.push_back(((double)m)/m_nn.size()); } else { double maxdist = m_nn.back().distance; double scale = maxdist - m_nn[0].distance; double numerator = 0.0; double denominator = 0.0; double weight; for (j = 0; j < m_nn.size(); ++j) { weight = (maxdist - m_nn[j].distance) / scale; denominator += weight; if (ceq(m_nn[j].id, mainid)) numerator += weight; } confidence.push_back(numerator/denominator); } } // nearest unlike neighbor confidence else if (CONFIDENCE_NUN == confidence_types[i]) { if (m_nun) { confidence.push_back(1 - answer[0].second / (m_nun->distance + epsilonmin)); } else { confidence.push_back(1.0); } } // distance to nearest neighbor else if (CONFIDENCE_NNDISTANCE == confidence_types[i]) { confidence.push_back(answer[0].second); } // average distance to k nearest neighbors else if (CONFIDENCE_AVGDISTANCE == confidence_types[i]) { double distsum = 0.0; for (j = 0; j < m_nn.size(); ++j) distsum += m_nn[j].distance; confidence.push_back(distsum/m_nn.size()); } } // for backward compatibility, we store MDB's confidence // with each answer class instead of the distance for (i = 0; i < answer.size(); ++i) { answer[i].second = get_default_confidence(answer[i].second); } } private: CompEQ ceq; // test whether two class id's are equal // simple measure that is defined for all classes and k values double get_default_confidence(double dist) { static double epsilonmin = std::numeric_limits::min(); return std::pow(1.0 - (dist / (m_max_distance + epsilonmin)), 10); } public: // list of classes and distances std::vector > answer; // confidence types and values for main class std::vector confidence_types; std::vector confidence; std::vector m_nn; neighbor_type* m_nun; private: size_t m_k; double m_max_distance; }; } // namespace kNN } //namespace Gamera #endif gamera-3.3.3/include/knnmodule.hpp0000644000076500000000000001147311652050140016072 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* This holds various functions for using k-NN and Python together. */ #ifndef KWM12172002_knnmodule #define KWM12172002_knnmodule #include "knn.hpp" #include using namespace Gamera; using namespace Gamera::kNN; /* This enum is for selecting between the various methods of computing the distance between two floating-point feature vectors. */ enum DistanceType { CITY_BLOCK, EUCLIDEAN, FAST_EUCLIDEAN }; /* get the feature vector from an image. image argument _must_ an image - no type checking is performed. */ inline int image_get_fv(PyObject* image, double** buf, Py_ssize_t* len) { ImageObject* x = (ImageObject*)image; if (PyObject_CheckReadBuffer(x->m_features) < 0) { return -1; } if (PyObject_AsReadBuffer(x->m_features, (const void**)buf, len) < 0) { PyErr_SetString(PyExc_TypeError, "knn: Could not use image as read buffer."); return -1; } if (*len == 0) { return -1; } *len = *len / sizeof(double); return 0; } /* get the id_name from an image. The image argument _must_ be an image - no type checking is performed. */ inline int image_get_id_name(PyObject* image, char** id_name, int* len) { ImageObject* x = (ImageObject*)image; // PyList_Size shoule type check the argument if (PyList_Size(x->m_id_name) < 1) { PyErr_SetString(PyExc_TypeError, "knn: id_name not a list or list is empty."); return -1; } PyObject* id_tuple = PyList_GET_ITEM(x->m_id_name, 0); if (PyTuple_Size(id_tuple) != 2) { PyErr_SetString(PyExc_TypeError, "knn: id_name is not a tuple or is the wrong size."); return -1; } PyObject* id = PyTuple_GET_ITEM(id_tuple, 1); *id_name = PyString_AsString(id); if (*id_name == 0) { PyErr_SetString(PyExc_TypeError, "knn: could not get string from id_name tuple."); return -1; } *len = PyString_GET_SIZE(id); return 0; } /* Compute the distance between two feature vectors. */ inline void compute_distance(DistanceType distance_type, const double* known_buf, int known_len, const double* unknown_buf, double* distance, const double* weights) { if (distance_type == CITY_BLOCK) { *distance = city_block_distance(known_buf, known_buf + known_len, unknown_buf, weights); } else if (distance_type == FAST_EUCLIDEAN) { *distance = euclidean_distance(known_buf, known_buf + known_len, unknown_buf, weights); } else { *distance = euclidean_distance(known_buf, known_buf + known_len, unknown_buf, weights); } } /* Compute the distance between a known and an unknown image with weights. This version takes an image and a buffer for the unknown image. */ inline int compute_distance(DistanceType distance_type, PyObject* known, double* unknown_buf, double* distance, double* weights, Py_ssize_t unknown_len) { double* known_buf; Py_ssize_t known_len; if (image_get_fv(known, &known_buf, &known_len) < 0) return -1; if (unknown_len != known_len) { PyErr_SetString(PyExc_IndexError, "Array lengths do not match"); return -1; } compute_distance(distance_type, known_buf, known_len, unknown_buf, distance, weights); return 0; } /* Compute the distance between a known and an unknown image with weights. This version takes an image and a buffer for the unknown image. Arguments must be images - no type checking is performed. */ inline int compute_distance(DistanceType distance_type, PyObject* known, PyObject* unknown, double* distance, double* weights, int weights_len) { double *known_buf, *unknown_buf; Py_ssize_t known_len, unknown_len; if (image_get_fv(known, &known_buf, &known_len) < 0) return -1; if (image_get_fv(unknown, &unknown_buf, &unknown_len) < 0) return -1; if (unknown_len != known_len) { PyErr_SetString(PyExc_IndexError, "Array lengths do not match"); return -1; } if (unknown_len != weights_len) { PyErr_SetString(PyExc_IndexError, "Array lengths do not match"); return -1; } compute_distance(distance_type, known_buf, known_len, unknown_buf, distance, weights); return 0; } #endif gamera-3.3.3/include/pixel.hpp0000644000076500000000000004200711747510564015234 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm11162001_pixel_hpp #define kwm11162001_pixel_hpp /** * This header contains the definition for all of the standard pixels in * Gamera. These include: * * RGB - color pixels * Complex - complex number pixels are convenient for fourier image * (frequency domain) processing algorithms. These values are * similar to float values, but there are two values for each pixel. * Float - floating point pixels that are convenient for many image processing * algorithms * GreyScale - grey scale pixels that hold values from 0 - 255 (8bit) * OneBit - one bit pixels for black and white images. These pixels actually * can hold more than 2 values, which is used for labeling the pixels * (using connected-components for example). This seems like a lot * of space to waste on one bit images, but if run-length encoding * is used the space should be minimul. * * In addition to the pixels themselves, there is information about the pixels * (white/black values, etc). */ #include "gamera_limits.hpp" #include "vigra/rgbvalue.hxx" #include "vigra/colorconversions.hxx" #include using namespace vigra; namespace Gamera { /************************************************************************ * PIXEL TYPES ************************************************************************/ /** * Floating-point pixel. * * The Gamera::FloatPixel type represents a single pixel in a * floating-point image. For floating-point images 0 is considerd * black and max is considered white. */ typedef double FloatPixel; /** * GreyScalePixel * * The Gamera::GreyScalePixel type is for 8bit greyscale images. For GreyScale * images 0 is considerd black and 255 is considered white. */ typedef unsigned char GreyScalePixel; /** * Grey16Pixel * * The Gamera::Grey16Pixel type is for 16bit greyscale images. */ typedef unsigned int Grey16Pixel; /** * OneBitPixel * * The Gamera::OneBitPixel type is for OneBitImages. For OneBit * images > 0 is considerd black and 0 is considered white. Also, see the note * at the beginning of this file about why OneBitPixels are so large. */ typedef unsigned short OneBitPixel; /** * ComplexPixel * * The Gamera::ComplexPixel type represents a pixel with two values: * real and imaginary. These values are accessed by real() and imag() * functions. Most functions follow normal std::complex behavior. * Other behavior will generally mimic the floating-point pixel type often * by the same operation applied only to the real part of the pixel. */ typedef std::complex ComplexPixel; /** * RGB Pixels * * The Gamera::RGB pixel type is derived from the Vigra class RGBValue. The * only reason that this is a derived class instead of directly using the * Vigra type is to provide conversion operators to and from the standard * Gamera types (instead of using Vigra style promotion traits) and to provide * overloaded red, green, and blue functions instead of the set* functions * in the Vigra class. */ template class Rgb : public RGBValue { protected: using RGBValue::data_; public: using RGBValue::luminance; /** * Construct a RGB pixel from a GreyScalePixel. RGB are all * set to the passed in GreyScalePixel. */ explicit Rgb(GreyScalePixel grey) : RGBValue(grey) { } /** * Construct a RGB pixel from a Grey16Pixel. RGB are all * set to the passed in Grey16Pixel. */ explicit Rgb(Grey16Pixel grey) : RGBValue(grey) { } /** * Construct a RGB pixel from a Float. RGB are all * set to the passed in Float (which is truncated first). */ explicit Rgb(FloatPixel f) : RGBValue((T)f) { } /** * Construct a RGB pixel from a Complex. RGB are all * set to the real part passed in Complex (which is truncated * first). */ explicit Rgb(ComplexPixel j) : RGBValue((T)j.real()) { } /** * Construct a RGB Pixel from a OneBitPixel. Appropriate conversion * is done. */ explicit Rgb(OneBitPixel s) { // TODO: fix for new ONEBIT if (s > 0) { RGBValue(1); } else { RGBValue(0); } } /** * Default constructor - RGB are all set to 0. */ Rgb() : RGBValue() { } /** * Copy constructor. */ template Rgb(RGBValue const & r) : RGBValue(r) { } Rgb(const Rgb& other) : RGBValue(other) { } /** * Construct a RGB pixel from the passed in red, green, and blue * values. */ Rgb(T red, T green, T blue) : RGBValue(red, green, blue) { } /** * Construct a RGB pixel from the values contained in the iterator * range passed in. */ template Rgb(I i, const I end) : RGBValue(i, end) { } /* This is totally arbitrary, and doesn't make sense in terms of "colors", but it will make using RGB as a key in a std::map work. */ bool operator<(const Rgb& other) const { const typename vigra::NumericTraits::Promote s = (typename vigra::NumericTraits::Promote)vigra::NumericTraits::max; const typename vigra::NumericTraits::Promote s2 = s * s; return (red() * s2 + green() * s + blue() < other.red() * s2 + green() * s + blue()); } /// Set the red component to the passed in value. void red(T v) { this->setRed(v); } /// Set the green component to the passed in value. void green(T v) { this->setGreen(v); } /// Set the blue component to the passed in value. void blue(T v) { this->setBlue(v); } /// Retrieve the red component - the returned value is an lvalue. T const & red() const { return data_[0]; } /// Retrieve the green component - the returned value is an lvalue. T const & green() const { return data_[1]; } /// Retrieve the blue component - the returned value is an lvalue. T const & blue() const { return data_[2]; } /// Return the hue of this pixel. FloatPixel const hue() { FloatPixel maxc = (FloatPixel)std::max(data_[0], std::max(data_[1], data_[2])); FloatPixel minc = (FloatPixel)std::min(data_[0], std::min(data_[1], data_[2])); if (minc == maxc) return 0; FloatPixel den = (maxc - minc); FloatPixel rc = (maxc - data_[0]) / den; FloatPixel gc = (maxc - data_[1]) / den; FloatPixel bc = (maxc - data_[2]) / den; FloatPixel h; if (data_[0] == maxc) h = bc - gc; else if (data_[1] == maxc) h = 2.0 + rc - bc; else h = 4.0 + gc - rc; h /= 6.0; h -= floor(h); return h; } /// Return the saturation of this pixel FloatPixel const saturation() { FloatPixel maxc = (FloatPixel)std::max(data_[0], std::max(data_[1], data_[2])); FloatPixel minc = (FloatPixel)std::min(data_[0], std::min(data_[1], data_[2])); if (minc == maxc) return 0; return (maxc - minc) / maxc; } /// Return the value of this pixel (max of RGB) FloatPixel const value() { return (FloatPixel)((float)(std::max(data_[0], std::max(data_[1], data_[2])))/255.0); } // conversion to CIE color space XYZ FloatPixel const cie_x() { RGB2XYZFunctor rgb2xyz_func; RGB2XYZFunctor::result_type xyz; xyz = rgb2xyz_func( RGBValue(data_[0], data_[1], data_[2]) ); return xyz[0]; } FloatPixel const cie_y() { RGB2XYZFunctor rgb2xyz_func; RGB2XYZFunctor::result_type xyz; xyz = rgb2xyz_func( RGBValue(data_[0], data_[1], data_[2]) ); return xyz[1]; } FloatPixel const cie_z() { RGB2XYZFunctor rgb2xyz_func; RGB2XYZFunctor::result_type xyz; xyz = rgb2xyz_func( RGBValue(data_[0], data_[1], data_[2]) ); return xyz[2]; } // conversion to CIE color space Lab FloatPixel const cie_Lab_L() { RGB2LabFunctor rgb2lab_func; RGB2LabFunctor::result_type lab; lab = rgb2lab_func( RGBValue(data_[0], data_[1], data_[2]) ); return lab[0]; } FloatPixel const cie_Lab_a() { RGB2LabFunctor rgb2lab_func; RGB2LabFunctor::result_type lab; lab = rgb2lab_func( RGBValue(data_[0], data_[1], data_[2]) ); return lab[1]; } FloatPixel const cie_Lab_b() { RGB2LabFunctor rgb2lab_func; RGB2LabFunctor::result_type lab; lab = rgb2lab_func( RGBValue(data_[0], data_[1], data_[2]) ); return lab[2]; } GreyScalePixel const cyan() { return std::numeric_limits::max() - data_[0]; } GreyScalePixel const magenta() { return std::numeric_limits::max() - data_[1]; } GreyScalePixel const yellow() { return std::numeric_limits::max() - data_[2]; } // /// Conversion operator to a FloatPixel // operator FloatPixel() { // return FloatPixel(luminance()); // } // /// Conversion operator to a ComplexPixel // operator ComplexPixel() { // ComplexPixel temp; // temp.real = luminance(); // temp.imag = 0; // return ComplexPixel(temp); // } // /// Conversion operator to a GreyScalePixel // operator GreyScalePixel() { // return GreyScalePixel(luminance()); // } // /// Conversion operator to a Grey16Pixel // operator Grey16Pixel() { // return Grey16Pixel(luminance()); // } // /// Conversion operator to a OneBitPixel // operator OneBitPixel() { // if (luminance()) // return 1; // else // return 0; // } }; /// This is the standard form of the RGB pixels typedef Rgb RGBPixel; /* * This is a test for black/white regardless of the pixel type. For some * pixel types this test is complicated and this also allows us to use 0 * for white in OneBit images and max for white in others without sacrificing * generality in the algorithms. * * This default implementation is here mainly for CCProxies (see * connected_components.hpp). Most of the real implementations are * further down. */ template inline bool is_black(T value) { return value; } /* * This is here for the same reason as is_black above. */ template inline bool is_white(T value) { return !value; } /* * pixel_traits allows us to find out certain properties of pixels in a generic * way. Again, this is primarily to allow the easy switching between min is white * and min is black representations for different pixel types. */ template struct pixel_traits { static T white() { return std::numeric_limits::max(); } static T black() { return 0; } static T default_value() { return white(); } }; /* * Helper functions to get black/white from a given T that has a value_type * member that is a pixel - i.e. * * DenseImage ob; * black(ob); * * The pixel_traits syntax is just too horrible to make users go through to * get white/black. From within a template function it looks like: * * Gamera::pixel_traits::white(); * */ template typename T::value_type black(T& container) { return pixel_traits::black(); } template typename T::value_type white(T& container) { return pixel_traits::white(); } /* Everything beyond this point is implementation */ // Specializations for black/white template<> inline bool is_black(FloatPixel value) { return value <= 0; } template<> inline bool is_black(GreyScalePixel value) { return value == 0; } template<> inline bool is_black(Grey16Pixel value) { return value == 0; } template<> inline bool is_black(RGBPixel value) { return (value.green() == 0 && value.red() == 0 && value.blue() == 0); } template<> inline bool is_black(OneBitPixel value) { return value != 0; } template<> inline bool is_white(FloatPixel value) { return (value == std::numeric_limits::max()); } template<> inline bool is_white(GreyScalePixel value) { return (value == std::numeric_limits::max()); } template<> inline bool is_white(Grey16Pixel value) { return (value == std::numeric_limits::max()); } template<> inline bool is_white(RGBPixel value) { return (value.red() == std::numeric_limits::max() && value.green() == std::numeric_limits::max() && value.blue() == std::numeric_limits::max()); } template<> inline bool is_white(OneBitPixel value) { return value == 0; } /* Specialization for pixel_traits */ template<> inline OneBitPixel pixel_traits::black() { return 1; } template<> inline OneBitPixel pixel_traits::white() { return 0; } template<> inline Grey16Pixel pixel_traits::white() { return 65535; // 2^16 - 1 } template<> inline RGBPixel pixel_traits::black() { return RGBPixel(0, 0, 0); } template<> inline RGBPixel pixel_traits::white() { return RGBPixel(std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()); } template<> inline FloatPixel pixel_traits::default_value() { return 0.0; } template<> inline ComplexPixel pixel_traits::white() { return ComplexPixel(std::numeric_limits::max(), 0.0); } template<> inline ComplexPixel pixel_traits::black() { return ComplexPixel(0.0, 0.0); } template<> inline ComplexPixel pixel_traits::default_value() { return pixel_traits::black(); } /* * Inversion of pixel values * * Generically invert pixel values. */ inline FloatPixel invert(FloatPixel value) { // Hard to know what makes sense here... MGD return -value; } inline ComplexPixel invert(ComplexPixel value) { return -value; } inline GreyScalePixel invert(GreyScalePixel value) { return std::numeric_limits::max() - value; } inline Grey16Pixel invert(Grey16Pixel value) { return std::numeric_limits::max() - value; } inline RGBPixel invert(RGBPixel value) { return RGBPixel(std::numeric_limits::max() - value.red(), std::numeric_limits::max() - value.green(), std::numeric_limits::max() - value.blue()); } inline OneBitPixel invert(OneBitPixel value) { if (is_white(value)) return pixel_traits::black(); else return pixel_traits::white(); } /* * Blend pixels together. */ inline FloatPixel blend(FloatPixel original, FloatPixel add, double alpha) { return alpha * original + (1.0 - alpha) * add; } inline ComplexPixel blend(ComplexPixel original, ComplexPixel add, double alpha) { return alpha * original + (1.0 - alpha) * add; } inline GreyScalePixel blend(GreyScalePixel original, GreyScalePixel add, double alpha) { return (GreyScalePixel)(alpha * double(original) + (1.0 - alpha) * double(add)); } inline Grey16Pixel blend(Grey16Pixel original, GreyScalePixel add, double alpha) { return (Grey16Pixel)(alpha * original + (1.0 - alpha) * add); } inline RGBPixel blend(RGBPixel original, RGBPixel add, double alpha) { double inv_alpha = 1.0 - alpha; return RGBPixel(GreyScalePixel(original.red() * alpha + add.red() * inv_alpha), GreyScalePixel(original.green() * alpha + add.green() * inv_alpha), GreyScalePixel(original.blue() * alpha + add.blue() * inv_alpha)); } inline OneBitPixel blend(OneBitPixel original, RGBPixel add, double alpha) { if (alpha > 0.5) return original; return add.luminance(); } }; #endif gamera-3.3.3/include/plugins/0000755000076500000000000000000011755376174015066 5ustar chriswheelgamera-3.3.3/include/plugins/arithmetic.hpp0000644000076500000000000001066211652050140017707 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, * and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd_arithmetic #define mgd_arithmetic #include #include "gamera.hpp" template inline typename ImageFactory::view_type* arithmetic_combine(T& a, const U& b, const FUNCTOR& functor, bool in_place) { if (a.nrows() != b.nrows() || a.ncols() != b.ncols()) throw std::runtime_error("Images must be the same size."); typedef typename T::value_type TVALUE; typedef typename ImageFactory::view_type VIEW; if (in_place) { typename T::vec_iterator ia = a.vec_begin(); typename U::const_vec_iterator ib = b.vec_begin(); typename choose_accessor::accessor ad = choose_accessor::make_accessor(a); for (; ia != a.vec_end(); ++ia, ++ib) { ad.set(NumericTraits::fromPromote (functor(typename NumericTraits::Promote(*ia), typename NumericTraits::Promote(*ib))), ia); } // Returning NULL is converted to None by the wrapper mechanism return NULL; } else { typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(a.size(), a.origin()); VIEW* dest = new VIEW(*dest_data, a); typename T::vec_iterator ia = a.vec_begin(); typename U::const_vec_iterator ib = b.vec_begin(); typename VIEW::vec_iterator id = dest->vec_begin(); typename choose_accessor::accessor ad = choose_accessor::make_accessor(*dest); // Vigra's combineTwoImages does not clip back to one of the standard // Gamera image types, so we have to do this differently ourselves. MGD try { for (; ia != a.vec_end(); ++ia, ++ib, ++id) { ad.set(NumericTraits::fromPromote (functor(typename NumericTraits::Promote(*ia), typename NumericTraits::Promote(*ib))), id); } } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } } template typename ImageFactory::view_type* add_images(T& a, const U& b, bool in_place=true) { typedef typename T::value_type TVALUE; typedef typename NumericTraits::Promote PROMOTE; return arithmetic_combine(a, b, std::plus(), in_place); } template struct my_minus : public std::binary_function { T operator()(const T& x, const T& y) const { typedef typename NumericTraits::Promote PROMOTE; return std::minus()(x, y); } }; template<> struct my_minus : public std::binary_function { OneBitPixel operator()(const OneBitPixel& x, const OneBitPixel& y) const { // Note the result is inverted, because the default accessor performs an invert. // GAAAH! if (is_black(x) && !is_black(y)) return pixel_traits::white(); else return pixel_traits::black(); } }; template typename ImageFactory::view_type* subtract_images(T& a, const U& b, bool in_place=true) { typedef typename T::value_type TVALUE; return arithmetic_combine(a, b, my_minus(), in_place); } template typename ImageFactory::view_type* multiply_images(T& a, const U& b, bool in_place=true) { typedef typename T::value_type TVALUE; typedef typename NumericTraits::Promote PROMOTE; return arithmetic_combine(a, b, std::multiplies(), in_place); } template typename ImageFactory::view_type* divide_images(T& a, const U& b, bool in_place=true) { typedef typename T::value_type TVALUE; typedef typename NumericTraits::Promote PROMOTE; return arithmetic_combine(a, b, std::divides(), in_place); } #endif gamera-3.3.3/include/plugins/binarization.hpp0000644000076500000000000010012111652050140020235 0ustar chriswheel/* * * Copyright (C) 2005 John Ashley Burgoyne and Ichiro Fujinaga * 2007 Uma Kompella and Christoph Dalitz * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef jab18112005_binarization #define jab18112005_binarization #include "gamera.hpp" #include "math.h" #include #include #include using namespace Gamera; /* Adaptive function for summing to double. */ template struct double_plus : public std::binary_function { double operator()(double x, T y) { return x + (double)y; } }; /* Adaptive function for squaring to doubles. */ template struct double_squared : public std::unary_function { double operator()(T x) { return (double)x * (double)x; } }; /* Adaptive function for adding pairs. */ template struct pair_plus : public std::binary_function { T operator()(T p, T q) { return std::make_pair(p.first + q.first, p.second + q.second); } }; /* Binary function for accumulating background pixels. */ template struct gatos_accumulate : public std::binary_function { typedef typename T::first_type type1; typedef typename T::second_type type2; T operator()(U mask, V pixel) { if (is_black(mask)) return std::make_pair((type1)0, (type2)0); else return std::make_pair((type1)1, (type2)pixel); } }; /* Binary function for Gatos thresholding. */ template struct gatos_thresholder : public std::binary_function { const double q; const double delta; const double b; const double p1; const double p2; gatos_thresholder(double q, double delta, double b, double p1, double p2) : q(q), delta(delta), b(b), p1(p1), p2(p2) {} U operator()(T src, T background) { return ((double)(background - src) > (q * delta * (((1 - p2) / (1 + std::exp(((-4 * background) / (b * (1 - p1))) + ((2 * (1 + p1)) / (1 - p1))))) + p2))) ? pixel_traits::black() : pixel_traits::white(); } }; /* FloatPixel image_mean(Image src) * * Returns the mean value over all pixels of an image. */ template FloatPixel image_mean(const T &src) { FloatPixel sum = std::accumulate(src.vec_begin(), src.vec_end(), (FloatPixel)0, double_plus()); size_t area = src.nrows() * src.ncols(); return sum / area; } /* FloatPixel image_variance(Image src) * * Returns the variance over all pixels of an image. */ template FloatPixel image_variance(const T &src) { FloatImageData* squaredData = new FloatImageData(src.size(), src.origin()); FloatImageView* squares = new FloatImageView(*squaredData); transform(src.vec_begin(), src.vec_end(), squares->vec_begin(), double_squared()); FloatPixel sum = std::accumulate(squares->vec_begin(), squares->vec_end(), (FloatPixel)0); size_t area = src.nrows() * src.ncols(); FloatPixel mean = image_mean(src); delete squaredData; delete squares; return sum / area - mean * mean; } /* Float mean_filter(Image src, size_t region_size); * * The implementation of region size is not entirely correct because of * integer rounding but matches the implementation of the thresholding * algorithms. */ template FloatImageView* mean_filter(const T &src, size_t region_size) { if ((region_size < 1) || (region_size > std::min(src.nrows(), src.ncols()))) throw std::out_of_range("mean_filter: region_size out of range"); size_t half_region_size = region_size / 2; typename ImageFactory::view_type* copy = ImageFactory::new_view(src); FloatImageData* data = new FloatImageData(src.size(), src.origin()); FloatImageView* view = new FloatImageView(*data); for (coord_t y = 0; y < src.nrows(); ++y) { for (coord_t x = 0; x < src.ncols(); ++x) { // Define the region. Point ul((coord_t)std::max(0, (int)x - (int)half_region_size), (coord_t)std::max(0, (int)y - (int)half_region_size)); Point lr((coord_t)std::min(x + half_region_size, src.ncols() - 1), (coord_t)std::min(y + half_region_size, src.nrows() - 1)); copy->rect_set(ul, lr); view->set(Point(x, y), image_mean(*copy)); } } delete copy; return view; } /* Image variance_filter(Image src, Float means, size_t region_size); * * The implementation of region size is not entirely correct because of * integer rounding but matches the implementation of the thresholding * algorithms. */ template FloatImageView* variance_filter(const T &src, const FloatImageView &means, size_t region_size) { if ((region_size < 1) || (region_size > std::min(src.nrows(), src.ncols()))) throw std::out_of_range("variance_filter: region_size out of range"); if (src.size() != means.size()) throw std::invalid_argument("variance_filter: sizes must match"); size_t half_region_size = region_size / 2; // Compute squares of each element. This step avoid repeating the squaring // operation for overlapping regions. FloatImageData* squaredData = new FloatImageData(src.size(), src.origin()); FloatImageView* squares = new FloatImageView(*squaredData); transform(src.vec_begin(), src.vec_end(), squares->vec_begin(), double_squared()); FloatImageData* data = new FloatImageData(src.size(), src.origin()); FloatImageView* view = new FloatImageView(*data); for (coord_t y = 0; y < src.nrows(); ++y) { for (coord_t x = 0; x < src.ncols(); ++x) { // Define the region. Point ul((coord_t)std::max(0, (int)x - (int)half_region_size), (coord_t)std::max(0, (int)y - (int)half_region_size)); Point lr((coord_t)std::min(x + half_region_size, src.ncols() - 1), (coord_t)std::min(y + half_region_size, src.nrows() - 1)); squares->rect_set(ul, lr); // Compute the variance. FloatPixel sum = std::accumulate(squares->vec_begin(), squares->vec_end(), (FloatPixel)0); size_t area = squares->nrows() * squares->ncols(); FloatPixel mean = means.get(Point(x,y)); view->set(Point(x, y), sum / area - mean * mean); } } delete squaredData; delete squares; return view; } /* * Image wiener_filter(Image src, size_t region_size, double noise_variance); * */ template T* wiener_filter(const T &src, size_t region_size, double noise_variance) { if ((region_size < 1) || (region_size > std::min(src.nrows(), src.ncols()))) throw std::out_of_range("niblack_threshold: region_size out of range"); // Compute regional statistics. const FloatImageView* means = mean_filter(src, region_size); const FloatImageView* variances = variance_filter(src, *means, region_size); // Compute noise variance if needed. if (noise_variance < 0) { FloatImageData* orderedVariancesData = new FloatImageData(variances->size(), variances->origin()); FloatImageView* orderedVariances = new FloatImageView(*orderedVariancesData); std::copy(variances->vec_begin(), variances->vec_end(), orderedVariances->vec_begin()); size_t area = orderedVariances->nrows() * orderedVariances->ncols(); std::nth_element(orderedVariances->vec_begin(), orderedVariances->vec_begin() + (area - 1) / 2, orderedVariances->vec_end()); noise_variance = (double)*(orderedVariances->vec_begin() + (area - 1) / 2); delete orderedVariancesData; delete orderedVariances; } typedef typename T::value_type value_type; typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* data = new data_type(src.size(), src.origin()); view_type* view = new view_type(*data); for (coord_t y = 0; y < src.nrows(); ++y) { for (coord_t x = 0; x < src.ncols(); ++x) { double mean = (double)means->get(Point(x, y)); double variance = (double)variances->get(Point(x, y)); // The estimate of noise variance will never be perfect, but in // theory, it would be impossible for any region to have a local // variance less than it. The following check eliminates that // theoretical impossibility and has a side benefit of preventing // division by zero. if (variance < noise_variance) { view->set(Point(x, y), (value_type)mean); } else { double multiplier = (variance - noise_variance) / variance; double value = (double)src.get(Point(x, y)); view->set(Point(x, y), (value_type)(mean + multiplier * (value - mean))); } } } delete means->data(); delete means; delete variances->data(); delete variances; return view; } /* * OneBit niblack_threshold(GreyScale src, * size_t region_size, * double sensitivity, * int lower_bound, * int upper_bound); */ template OneBitImageView* niblack_threshold(const T &src, size_t region_size, double sensitivity, int lower_bound, int upper_bound) { if ((region_size < 1) || (region_size > std::min(src.nrows(), src.ncols()))) throw std::out_of_range("niblack_threshold: region_size out of range"); // Compute regional statistics. const FloatImageView* means = mean_filter(src, region_size); const FloatImageView* variances = variance_filter(src, *means, region_size); typedef ImageFactory::data_type data_type; typedef ImageFactory::view_type view_type; data_type* data = new data_type(src.size(), src.origin()); view_type* view = new view_type(*data); for (coord_t y = 0; y < src.nrows(); ++y) { for (coord_t x = 0; x < src.ncols(); ++x) { // Check global thresholds and then threshold adaptively. FloatPixel pixel_value = (FloatPixel)src.get(Point(x, y)); if (pixel_value < (FloatPixel)lower_bound) { view->set(Point(x, y), black(*view)); } else if (pixel_value >= (FloatPixel)upper_bound) { view->set(Point(x, y), white(*view)); } else { FloatPixel mean = means->get(Point(x, y)); FloatPixel deviation = std::sqrt(variances->get(Point(x, y))); FloatPixel threshold = mean + sensitivity * deviation; view->set(Point(x, y), pixel_value > threshold ? white(*view) : black(*view)); } } } delete means->data(); delete means; delete variances->data(); delete variances; return view; } /* * OneBit sauvola_threshold(GreyScale src, * size_t region_size, * double sensitivity, * int dynamic_range, * int lower_bound, * int upper_bound); */ template OneBitImageView* sauvola_threshold(const T &src, size_t region_size, double sensitivity, int dynamic_range, int lower_bound, int upper_bound) { if ((region_size < 1) || (region_size > std::min(src.nrows(), src.ncols()))) throw std::out_of_range("niblack_threshold: region_size out of range"); // Compute regional statistics. const FloatImageView* means = mean_filter(src, region_size); const FloatImageView* variances = variance_filter(src, *means, region_size); typedef ImageFactory::data_type data_type; typedef ImageFactory::view_type view_type; data_type* data = new data_type(src.size(), src.origin()); view_type* view = new view_type(*data); for (coord_t y = 0; y < src.nrows(); ++y) { for (coord_t x = 0; x < src.ncols(); ++x) { // Check global thresholds and then threshold adaptively. FloatPixel pixel_value = (FloatPixel)src.get(Point(x, y)); if (pixel_value < (FloatPixel)lower_bound) { view->set(Point(x, y), black(*view)); } else if (pixel_value >= (FloatPixel)upper_bound) { view->set(Point(x, y), white(*view)); } else { FloatPixel mean = means->get(Point(x, y)); FloatPixel deviation = std::sqrt(variances->get(Point(x, y))); FloatPixel adjusted_deviation = 1.0 - deviation / (FloatPixel)dynamic_range; FloatPixel threshold = mean + (1.0 - sensitivity * adjusted_deviation); view->set(Point(x, y), pixel_value > threshold ? white(*view) : black(*view)); } } } delete means->data(); delete means; delete variances->data(); delete variances; return view; } /* * Image* gatos_background(Image src, size_t region_size); */ template T* gatos_background(const T &src, const U &binarization, size_t region_size) { if ((region_size < 1) || (region_size > std::min(src.nrows(), src.ncols()))) throw std::out_of_range("gatos_background: region_size out of range"); if (src.size() != binarization.size()) throw std::invalid_argument("gatos_background: sizes must match"); size_t half_region_size = region_size / 2; typename ImageFactory::view_type* scopy = ImageFactory::new_view(src); typename ImageFactory::view_type* bcopy = ImageFactory::new_view(binarization); typedef std::pair gatos_pair; typedef typename T::value_type src_value_type; typedef typename U::value_type binarization_value_type; typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* data = new data_type(src.size(), src.origin()); view_type* view = new view_type(*data); for (coord_t y = 0; y < src.nrows(); ++y) { for (coord_t x = 0; x < src.ncols(); ++x) { if (is_white(binarization.get(Point(x, y)))) { view->set(Point(x, y), src.get(Point(x, y))); } else { // Define the region. Point ul((coord_t)std::max(0, (int)x - (int)half_region_size), (coord_t)std::max(0, (int)y - (int)half_region_size)); Point lr((coord_t)std::min(x + half_region_size, src.ncols() - 1), (coord_t)std::min(y + half_region_size, src.nrows() - 1)); scopy->rect_set(ul, lr); bcopy->rect_set(ul, lr); // Count and accumulate background pixels. gatos_pair sums = std::inner_product(bcopy->vec_begin(), bcopy->vec_end(), scopy->vec_begin(), gatos_pair(0, 0.0), pair_plus(), gatos_accumulate < gatos_pair, binarization_value_type, src_value_type >()); view->set(Point(x, y), sums.first > 0 ? (src_value_type)(sums.second / sums.first) : white(src)); } } } delete scopy; delete bcopy; return view; } /* * Image gatos_threshold(Image src, * Image background, * Image binarization, * double q, * double p1, * double p2); */ template OneBitImageView* gatos_threshold(const T &src, const T &background, const U &binarization, double q, double p1, double p2) { if (src.size() != background.size()) throw std::invalid_argument("gatos_threshold: sizes must match"); if (background.size() != binarization.size()) throw std::invalid_argument("gatos_threshold: sizes must match"); typedef std::pair gatos_pair; typedef typename T::value_type base_value_type; typedef typename U::value_type binarization_value_type; double delta_numerator = std::inner_product(src.vec_begin(), src.vec_end(), background.vec_begin(), (double)0, double_plus(), std::minus()); unsigned int delta_denominator = std::count_if(binarization.vec_begin(), binarization.vec_end(), is_black); double delta = delta_numerator / (double)delta_denominator; gatos_pair b_sums = std::inner_product(binarization.vec_begin(), binarization.vec_end(), background.vec_begin(), gatos_pair(0, 0.0), pair_plus(), gatos_accumulate < gatos_pair, binarization_value_type, base_value_type >()); double b = (double)b_sums.second / (double)b_sums.first; typedef ImageFactory::data_type data_type; typedef ImageFactory::view_type view_type; data_type* data = new data_type(src.size(), src.origin()); view_type* view = new view_type(*data); std::transform(src.vec_begin(), src.vec_end(), background.vec_begin(), view->vec_begin(), gatos_thresholder < typename T::value_type, typename U::value_type >(q, delta, b, p1, p2)); return view; } /* White Rohrer thresholding. This implementation uses code from the XITE library. According to its license, it may be freely included into Gamera (a GPL licensed software), provided the following notice is included into the code: Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that this copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation and that the name of B-lab, Department of Informatics or University of Oslo not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. B-LAB DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL B-LAB BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Important notice: this implementation only works with 8-bit greyscale images because the maximal value 255 for white is hard coded!! */ static struct { int WR1_F_OFFSET; int WR1_G_OFFSET; int BIN_ERROR; int BIN_FOREGROUND; int BIN_BACKGROUND; int BIN_OK; int WR1_BIAS_CROSSOVER; int WR1_BLACK_BIAS; int WR1_WHITE_BIAS; int WR1_BIAS; double WR1_BLACK_BIAS_FACTOR; double WR1_WHITE_BIAS_FACTOR; int wr1_f_tab[512]; int wr1_g_tab[512]; } wr1_params = { /* WR1_F_OFFSET */ 255, /* WR1_G_OFFSET */ 255, /* BIN_ERROR */ -1, /* BIN_FOREGROUND */ 0, /* BIN_BACKGROUND */ 255, /* BIN_OK */ 0, /* WR1_BIAS_CROSSOVER */ 93, /* WR1_BLACK_BIAS */ -40, /* WR1_WHITE_BIAS */ 40, /* WR1_BIAS */ 20, /* WR1_BLACK_BIAS_FACTOR */ 0.0, /* WR1_WHITE_BIAS_FACTOR */ -0.25, /* wr1_f_tab */ { -62, -62, -61, -61, -60, -60, -59, -59, -58, -58, -57, -57, -56, -56, -54, -54, -53, -53, -52, -52, -51, -51, -50, -50, -49, -49, -48, -48, -47, -47, -46, -46, -45, -45, -44, -44, -43, -43, -42, -42, -41, -41, -41, -41, -40, -40, -39, -39, -38, -38, -37, -37, -36, -36, -36, -36, -35, -35, -34, -34, -33, -33, -33, -33, -32, -32, -31, -31, -31, -31, -30, -30, -29, -29, -29, -29, -28, -28, -27, -27, -27, -27, -26, -26, -25, -25, -25, -25, -24, -24, -24, -24, -23, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -21, -20, -20, -20, -20, -19, -19, -19, -19, -18, -18, -18, -18, -17, -17, -17, -17, -16, -16, -16, -16, -16, -16, -15, -15, -15, -15, -14, -14, -14, -14, -14, -14, -13, -13, -13, -13, -13, -13, -12, -12, -12, -12, -12, -12, -11, -11, -11, -11, -11, -11, -10, -10, -10, -10, -10, -10, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -6, -6, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -5, -5, -4, -4, -3, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -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, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0 }, /* wr1_g_tab */ { -126, -126, -125, -125, -124, -124, -123, -123, -122, -122, -121, -121, -120, -120, -119, -119, -118, -118, -117, -117, -116, -116, -115, -115, -114, -114, -113, -113, -112, -112, -111, -111, -110, -110, -109, -109, -108, -108, -107, -107, -106, -106, -105, -105, -104, -104, -103, -103, -102, -102, -101, -101, -100, -100, -99, -99, -98, -98, -97, -97, -96, -96, -95, -95, -94, -94, -93, -93, -92, -92, -91, -91, -90, -90, -89, -89, -88, -88, -87, -87, -86, -86, -85, -85, -84, -84, -83, -83, -82, -82, -81, -81, -80, -80, -79, -79, -78, -78, -77, -77, -76, -76, -75, -75, -74, -74, -73, -73, -72, -72, -71, -71, -70, -70, -69, -69, -68, -68, -67, -67, -66, -66, -65, -65, -64, -64, -63, -63, -61, -61, -59, -59, -57, -57, -54, -54, -52, -52, -50, -50, -48, -48, -46, -46, -44, -44, -42, -42, -41, -41, -39, -39, -37, -37, -36, -36, -34, -34, -33, -33, -31, -31, -30, -30, -29, -29, -27, -27, -26, -26, -25, -25, -24, -24, -23, -23, -22, -22, -21, -21, -20, -20, -19, -19, -18, -18, -17, -17, -16, -16, -15, -15, -14, -14, -14, -14, -13, -13, -12, -12, -12, -12, -11, -11, -10, -10, -10, -10, -9, -9, -8, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4, -4, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 29, 29, 30, 30, 31, 31, 33, 33, 34, 34, 36, 36, 37, 37, 39, 39, 41, 41, 42, 42, 44, 44, 46, 46, 48, 48, 50, 50, 52, 52, 54, 54, 57, 57, 59, 59, 61, 61, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, 127, 0 } }; inline int wr1_bias (int x, int offset) { int result; int bias; x = 256 - x; bias = -offset; if (x < wr1_params.WR1_BIAS_CROSSOVER) { result = x - bias - (int)(wr1_params.WR1_BLACK_BIAS_FACTOR*(wr1_params.WR1_BIAS_CROSSOVER-x)); } else if (x >= wr1_params.WR1_BIAS_CROSSOVER) { result = x + bias + (int)(wr1_params.WR1_WHITE_BIAS_FACTOR*(x-wr1_params.WR1_BIAS_CROSSOVER)); } else result = x; /* result = x-bias; */ if (result < wr1_params.BIN_FOREGROUND) result = wr1_params.BIN_FOREGROUND; if (result > wr1_params.BIN_BACKGROUND) result = wr1_params.BIN_BACKGROUND; return 256 - result; } inline int wr1_f (int diff, int *f) { /* if (abs(diff)>wr1_params.WR1_F_OFFSET) { Warning(2, "wr1_f: Error: diff = %i\n", diff); return wr1_params.BIN_ERROR; }*/ f[0] = -wr1_params.wr1_f_tab[wr1_params.WR1_F_OFFSET - diff]; return wr1_params.BIN_OK; } inline int wr1_g (int diff, int *g) { /* if (abs(diff)>wr1_params.WR1_G_OFFSET) { Warning(2, "wr1_g: Error: diff = %i\n", diff); return wr1_params.BIN_ERROR; }*/ g[0] = -wr1_params.wr1_g_tab[wr1_params.WR1_G_OFFSET - diff]; return wr1_params.BIN_OK; } /* * OneBit white_rohrer_threshold(GreyScale src, * int x_lookahead, * int y_lookahead, * int bias_mode, * int bias_factor, * int f_factor * int g_factor); */ template OneBitImageView* white_rohrer_threshold (const T& in, int x_lookahead, int y_lookahead, int bias_mode, int bias_factor, int f_factor, int g_factor) { int xsize, ysize; int x, y; int u; int prevY; int Y = 0; int f, g; int x_ahead, y_ahead; int t; int offset = wr1_params.WR1_BIAS; //double mu, s_dev; FloatPixel mu = 0.0; FloatPixel s_dev = 0.0; int *Z; int n; typedef ImageFactory::data_type data_type; typedef ImageFactory::view_type view_type; data_type* bin_data = new data_type(in.size(), in.origin()); view_type* bin_view = new view_type(*bin_data); xsize = in.ncols(); ysize = in.nrows(); // std::cout<<"sizes are "<set(Point(x,y),black(*bin_view)); } else { bin_view->set(Point(x,y),white(*bin_view)); } x_ahead++; if (x_ahead > xsize) { x_ahead = 1; y_ahead++; } if (y_ahead <= ysize) { prevY = Y; wr1_f(in.get(Point(x_ahead,y_ahead))-prevY, &f); Y = prevY + f_factor * f / 100; wr1_g(Y-Z[x_ahead], &g); Z[x_ahead] = Z[x_ahead] + g_factor * g / 100; } else Z[x_ahead] = Z[x_ahead-1]; } } delete [] Z; Z = NULL; return bin_view; } #endif gamera-3.3.3/include/plugins/color.hpp0000644000076500000000000002414611652050140016676 0ustar chriswheel/* * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Hasan Yildiz, Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd120203_color #define mgd120203_color #include "gamera.hpp" #include "image_conversion.hpp" #include "gameramodule.hpp" #include #include #include namespace Gamera { template struct extract_plane { U* operator()(const T& image) { typedef typename T::value_type from_pixel_type; typedef typename U::value_type to_pixel_type; U* view = _image_conversion::creator::image(image); typename T::const_vec_iterator in = image.vec_begin(); typename U::vec_iterator out = view->vec_begin(); ImageAccessor in_acc; ImageAccessor out_acc; F f; for (; in != image.vec_end(); ++in, ++out) out_acc.set(f(from_pixel_type(in_acc.get(in))), out); return view; } }; struct Hue { FloatPixel operator()(RGBPixel pixel) { return pixel.hue(); } }; extract_plane hue; struct Saturation { FloatPixel operator()(RGBPixel pixel) { return pixel.saturation(); } }; extract_plane saturation; struct Value { FloatPixel operator()(RGBPixel pixel) { return pixel.value(); } }; extract_plane value; struct Cyan { FloatPixel operator()(RGBPixel pixel) { return pixel.cyan(); } }; extract_plane cyan; struct Magenta { FloatPixel operator()(RGBPixel pixel) { return pixel.magenta(); } }; extract_plane magenta; struct Yellow { FloatPixel operator()(RGBPixel pixel) { return pixel.yellow(); } }; extract_plane yellow; struct Red { FloatPixel operator()(RGBPixel pixel) { return pixel.red(); } }; extract_plane red; struct Green { FloatPixel operator()(RGBPixel pixel) { return pixel.green(); } }; extract_plane green; struct Blue { FloatPixel operator()(RGBPixel pixel) { return pixel.blue(); } }; extract_plane blue; struct CIE_X { FloatPixel operator()(RGBPixel pixel) { return pixel.cie_x(); } }; extract_plane cie_x; struct CIE_Y { FloatPixel operator()(RGBPixel pixel) { return pixel.cie_y(); } }; extract_plane cie_y; struct CIE_Z { FloatPixel operator()(RGBPixel pixel) { return pixel.cie_z(); } }; extract_plane cie_z; struct CIE_Lab_L { FloatPixel operator()(RGBPixel pixel) { return pixel.cie_Lab_L(); } }; extract_plane cie_Lab_L; struct CIE_Lab_a { FloatPixel operator()(RGBPixel pixel) { return pixel.cie_Lab_a(); } }; extract_plane cie_Lab_a; struct CIE_Lab_b { FloatPixel operator()(RGBPixel pixel) { return pixel.cie_Lab_L(); } }; extract_plane cie_Lab_b; // TODO: Find a cool way to false color Complex images. RGBImageView* false_color(const FloatImageView& image) { RGBImageView* view = _image_conversion::creator::image(image); FloatImageView::const_vec_iterator vi = image.vec_begin(); FloatPixel max = *vi; FloatPixel min = *vi; for (; vi != image.vec_end(); ++vi) { if (*vi > max) max = *vi; if (*vi < min) min = *vi; } FloatPixel scale = (max - min); // We don't use a table (as with 8-bit greyscale) because we can get // much greater color "depth" this way (The table method only uses // 64 values per plane) FloatImageView::const_vec_iterator in = image.vec_begin(); RGBImageView::vec_iterator out = view->vec_begin(); ImageAccessor in_acc; ImageAccessor out_acc; for (; in != image.vec_end(); ++in, ++out) { double h = ((in_acc.get(in) - min) / scale) * 4.0; size_t i = (size_t)h; GreyScalePixel f, q; // v == 255, p == 0 switch (i) { case 0: f = (GreyScalePixel)((h - (double)i) * 255.0); out_acc.set(RGBPixel(255, f, 0), out); break; case 1: q = 255 - (GreyScalePixel)((h - (double)i) * 255.0); out_acc.set(RGBPixel(q, 255, 0), out); break; case 2: f = (GreyScalePixel)((h - (double)i) * 255.0); out_acc.set(RGBPixel(0, 255, f), out); break; case 3: q = 255 - (GreyScalePixel)((h - (double)i) * 255.0); out_acc.set(RGBPixel(0, q, 255), out); break; case 4: // The end (should only represent a single value) out_acc.set(RGBPixel(0, 0, 255), out); break; } } return view; } RGBImageView* false_color(const GreyScaleImageView& image) { RGBImageView* view = _image_conversion::creator::image(image); GreyScaleImageView::const_vec_iterator in = image.vec_begin(); RGBImageView::vec_iterator out = view->vec_begin(); ImageAccessor in_acc; ImageAccessor out_acc; // Build a table mapping greyscale values to false color RGBPixels RGBPixel table[256]; size_t i = 0, j = 0; for (; i < 64; ++i, j += 4) { table[i].red(255); table[i].green(j); table[i].blue(0); } j -= 4; for (; i < 128; ++i, j -= 4) { table[i].red(j); table[i].green(255); table[i].blue(0); } j = 0; for (; i < 192; ++i, j += 4) { table[i].red(0); table[i].green(255); table[i].blue(j); } j -= 4; for (; i < 256; ++i, j -= 4) { table[i].red(0); table[i].green(j); table[i].blue(255); } // Create RGB based on table for (; in != image.vec_end(); ++in, ++out) out_acc.set(table[in_acc.get(in)], out); return view; } // replace colors with labels // Christoph Dalitz and Hasan Yildiz template Image* colors_to_labels(const T &src, PyObject* obj) { OneBitImageData* dest_data = new OneBitImageData(src.size(), src.origin()); OneBitImageView* dest = new OneBitImageView(*dest_data, src.origin(), src.size()); typedef typename T::value_type value_type; value_type value; typedef typename OneBitImageView::value_type onebit_value_type; std::string buf; onebit_value_type label; // highest label that can be stored in Onebit pixel type onebit_value_type max_value = std::numeric_limits::max(); std::map pixel; std::map::iterator iter; PyObject *itemKey, *itemValue; unsigned int testKey; Py_ssize_t pos = 0; // mapping given how colors are to be mapped to labels if (PyDict_Check(obj)) { // copy color->label map to C++ map long given_label; label = 1; while (PyDict_Next(obj, &pos, &itemKey, &itemValue)) { if (label == max_value) { char msg[128]; sprintf(msg, "More RGB colors than available labels (%i).", max_value); throw std::range_error(msg); } label++; if( !PyObject_TypeCheck(itemKey, get_RGBPixelType()) ) { throw std::runtime_error("Dictionary rgb_to_label must have RGBPixel's as keys"); } RGBPixel *rgbpixel = ((RGBPixelObject *) itemKey)->m_x; testKey = (rgbpixel->red() << 16) | (rgbpixel->green() << 8) | rgbpixel->blue(); given_label = PyInt_AsLong(itemValue); if (given_label < 0) throw std::invalid_argument("Labels must be positive integers."); if (pixel.find(testKey) == pixel.end()) pixel[testKey] = given_label; } for (size_t y=0; yset(Point(x,y), pixel.find(testKey)->second); } } } // no mapping given: determine labels automatically by counting else if (obj == Py_None) { label = 2; // special colors black and white pixel[0] = 1; pixel[(255<<16) | (255<<8) | 255] = 0; for (size_t y=0; yset(Point(x,y), pixel.find(testKey)->second); } } } // some argument given that is not a mapping color -> label else { throw std::invalid_argument("Mapping rgb_to_label must be dict or None"); } return dest; } } #endif gamera-3.3.3/include/plugins/contour.hpp0000644000076500000000000002670511652050140017254 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Oliver Christen, Christoph Dalitz * 2011 Andreas Leuschner, Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd10222004_contours #define mgd10222004_contours #include "gamera.hpp" namespace Gamera { template FloatVector* contour_top(const T& m) { FloatVector* output = new FloatVector(m.ncols()); try { for (size_t c = 0; c != m.ncols(); ++c) { size_t r = 0; for (; r != m.nrows(); ++r) if (is_black(m.get(Point(c, r)))) break; double result; if (r >= m.nrows()) result = std::numeric_limits::infinity(); else result = (double)r; (*output)[c] = result; } } catch (std::exception e) { delete output; throw; } return output; } template FloatVector* contour_bottom(const T& m) { FloatVector* output = new FloatVector(m.ncols()); try { for (size_t c = 0; c != m.ncols(); ++c) { long r = m.nrows() - 1; for (; r >= 0; --r) if (is_black(m.get(Point(c, r)))) break; double result; if (r < 0) result = std::numeric_limits::infinity(); else result = (double)(m.nrows() - r); (*output)[c] = result; } } catch (std::exception e) { delete output; throw; } return output; } template FloatVector* contour_left(const T& m) { FloatVector* output = new FloatVector(m.nrows()); try { for (size_t r = 0; r != m.nrows(); ++r) { size_t c = 0; for (; c != m.ncols(); ++c) if (is_black(m.get(Point(c, r)))) break; double result; if (c >= m.ncols()) result = std::numeric_limits::infinity(); else result = (double)c; (*output)[r] = result; } } catch (std::exception e) { delete output; throw; } return output; } template FloatVector* contour_right(const T& m) { FloatVector* output = new FloatVector(m.nrows()); try { for (size_t r = 0; r != m.nrows(); ++r) { long c = m.ncols() - 1; for (; c >= 0; --c) if (is_black(m.get(Point(c, r)))) break; double result; if (c < 0) result = std::numeric_limits::infinity(); else result = (double)(m.ncols() - c); (*output)[r] = result; } } catch (std::exception e) { delete output; throw; } return output; } // etxraction of sample points from the contour // author: Oliver Christen template PointVector * contour_samplepoints(const T& cc, int percentage) { PointVector *output = new PointVector(); PointVector *contour_points = new PointVector(); PointVector::iterator found; FloatVector *top = contour_top(cc); FloatVector *right = contour_right(cc); FloatVector *bottom = contour_bottom(cc); FloatVector *left = contour_left(cc); FloatVector::iterator it; int x, y, i; float d; unsigned int top_d = std::numeric_limits::max() ; unsigned int top_max_x = 0; unsigned int top_max_y = 0; unsigned int right_d = std::numeric_limits::max(); unsigned int right_max_x = 0; unsigned int right_max_y = 0; unsigned int bottom_d = std::numeric_limits::max(); unsigned int bottom_max_x = 0; unsigned int bottom_max_y = 0; unsigned int left_d = std::numeric_limits::max(); unsigned int left_max_x = 0; unsigned int left_max_y = 0; // top i = 0;for(it = top->begin() ; it != top->end() ; it++, i++) { if( *it == std::numeric_limits::infinity() ) { continue; } d = *it; x = cc.offset_x() + i; y = cc.offset_y() + d; if( d < top_d) { top_d = d; top_max_x = x; top_max_y = y; } found = find(contour_points->begin(), contour_points->end(), Point(x,y)); if(found == contour_points->end()) { contour_points->push_back( Point(x,y) ); } } // right i = 0;for(it = right->begin() ; it != right->end() ; it++, i++) { if( *it == std::numeric_limits::infinity() ) { continue; } d = *it; x = cc.offset_x() + cc.ncols() - d; y = cc.offset_y() + i; if( d < right_d) { right_d = d; right_max_x = x; right_max_y = y; } found = find(contour_points->begin(), contour_points->end(), Point(x,y)); if(found == contour_points->end()) { contour_points->push_back( Point(x,y) ); } } // bottom i = 0;for(it = bottom->begin() ; it != bottom->end() ; it++, i++) { if( *it == std::numeric_limits::infinity() ) { continue; } d = *it; x = cc.offset_x() + i; y = cc.offset_y() + cc.nrows() - d; if( d <= bottom_d) { bottom_d = d; bottom_max_x = x; bottom_max_y = y; } found = find(contour_points->begin(), contour_points->end(), Point(x,y)); if(found == contour_points->end()) { contour_points->push_back( Point(x,y) ); } } // left i = 0;for(it = left->begin() ; it != left->end() ; it++, i++) { if( *it == std::numeric_limits::infinity() ) { continue; } d = *it; x = cc.offset_x() + d; y = cc.offset_y() + i; if( d <= left_d) { left_d = d; left_max_x = x; left_max_y = y; } found = find(contour_points->begin(), contour_points->end(), Point(x,y)); if(found == contour_points->end()) { contour_points->push_back( Point(x,y) ); } } // add only every 100/percentage-th point double delta = 100.0/percentage; double step = 0.0; unsigned int offset = 0; // to avoid overflow and rounding errors unsigned int ii = 0; while (ii < contour_points->size()) { output->push_back( (*contour_points)[ii] ); step += delta; if (step > 100.0) { step -= 100.0; offset += 100; } ii = offset + (unsigned int)step; } // add the four outer extreme points ... // ... top if (top_d != std::numeric_limits::max()) { found = find(output->begin(), output->end(), Point(top_max_x, top_max_y)); if(found == output->end()) { output->push_back( Point(top_max_x, top_max_y) ); } } // ... right if (right_d != std::numeric_limits::max()) { found = find(output->begin(), output->end(), Point(right_max_x, right_max_y)); if(found == output->end()) { output->push_back( Point(right_max_x, right_max_y) ); } } // ... bottom if (bottom_d != std::numeric_limits::max()) { found = find(output->begin(), output->end(), Point(bottom_max_x, bottom_max_y)); if(found == output->end()) { output->push_back( Point(bottom_max_x, bottom_max_y) ); } } // ... left if (left_d != std::numeric_limits::max()) { found = find(output->begin(), output->end(), Point(left_max_x, left_max_y)); if(found == output->end()) { output->push_back( Point(left_max_x, left_max_y) ); } } delete top; delete right; delete bottom; delete left; delete contour_points; return output; } // contour extraction with Pavlidis' algorithm // author: Andreas Leuschner template PointVector* contour_pavlidis(T &m) { PointVector* v_contour = new PointVector(); // neighbor mask: // 5 6 7 // 4 P 0 // 3 2 1 int mask[8][2]; // X Y mask[0][0] = 1; mask[0][1] = 0; mask[1][0] = 1; mask[1][1] = -1; mask[2][0] = 0; mask[2][1] = -1; mask[3][0] = -1; mask[3][1] = -1; mask[4][0] = -1; mask[4][1] = 0; mask[5][0] = -1; mask[5][1] = 1; mask[6][0] = 0; mask[6][1] = 1; mask[7][0] = 1; mask[7][1] = 1; // find startpixel unsigned int x = 0; unsigned int y = 0; while(m.get(Point(x, y)) == 0 && x < m.ncols() && y < m.nrows()){ if (x == m.ncols() - 1){ y++; x = 0; } x++; } v_contour->push_back( Point(x, y) ); // extract contour Point p_Right; Point p_Middle; Point p_Left; unsigned int newX_R; unsigned int newY_R; unsigned int newX_M; unsigned int newY_M; unsigned int newX_L; unsigned int newY_L; bool found = false; bool first = true; bool border = true; int n = 0; int s = 6; int third = 0; int run = 1; while ( (*v_contour)[n].x() != (*v_contour)[0].x() || (*v_contour)[n].y() != (*v_contour)[0].y() || first == true ){ found = false; while(found == false && third < 3){ third++; newX_R = (*v_contour)[n].x() + mask[ (s-1)%8 ][0]; newY_R = (*v_contour)[n].y() + mask[ (s-1)%8 ][1]; newX_M = (*v_contour)[n].x() + mask[ (s)%8 ][0]; newY_M = (*v_contour)[n].y() + mask[ (s)%8 ][1]; newX_L = (*v_contour)[n].x() + mask[ (s+1)%8 ][0]; newY_L = (*v_contour)[n].y() + mask[ (s+1)%8 ][1]; if(newX_R < m.ncols() && newY_R < m.nrows()){ p_Right.x( newX_R ); p_Right.y( newY_R ); border = false; } if(newX_M < m.ncols() && newY_M < m.nrows()){ p_Middle.x( newX_M ); p_Middle.y( newY_M ); border = false; } if(newX_L < m.ncols() && newY_L < m.nrows()){ p_Left.x( newX_L ); p_Left.y( newY_L ); border = false; } if(border == false){ border = true; if ( is_black(m.get( p_Right)) && newX_R < m.ncols() && newY_R < m.nrows() ) { v_contour->push_back(p_Right); found = true; n++; s = s - 2; } else{ if(is_black(m.get(p_Middle)) && newX_M < m.ncols() && newY_M < m.nrows()){ v_contour->push_back(p_Middle); found = true; n++; } else { if(is_black(m.get(p_Left) ) && newX_L < m.ncols() && newY_L < m.nrows() ){ v_contour->push_back(p_Left); found = true; n++; } else { s = s + 2; } } } first = false; } else { s = s + 2; } } third = 0; run++; } if (v_contour->size() > 1) v_contour->pop_back(); // start pixel is doublette return v_contour; } } #endif gamera-3.3.3/include/plugins/convolution.hpp0000644000076500000000000001527711652050140020144 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, * and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd_convolution #define mgd_convolution #include "gamera.hpp" #include "vigra/stdconvolution.hxx" using namespace Gamera; template typename ImageFactory::view_type* convolve(const T& src, const U& k, int border_mode) { if (k.nrows() > src.nrows() || k.ncols() > src.ncols()) throw std::runtime_error("The image must be bigger than the kernel."); typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(src.size(), src.ul()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data); // I originally had the following two lines abstracted out in a function, // but that seemed to choke and crash gcc 3.3.2 try { typename U::ConstIterator center = k.upperLeft() + Diff2D(k.center_x(), k.center_y()); tuple5< typename U::ConstIterator, typename choose_accessor::accessor, Diff2D, Diff2D, BorderTreatmentMode> kernel (center, choose_accessor::make_accessor(k), Diff2D(-k.center_x(), -k.center_y()), Diff2D(k.width() - k.center_x(), k.height() - k.center_y()), (BorderTreatmentMode)border_mode); vigra::convolveImage(src_image_range(src), dest_image(*dest), kernel); } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } template typename ImageFactory::view_type* convolve_x(const T& src, const U& k, int border_mode) { if (k.nrows() > src.nrows() || k.ncols() > src.ncols()) throw std::runtime_error("The image must be bigger than the kernel."); if (k.nrows() != 1) throw std::runtime_error("The 1D kernel must have only one row."); typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(src.size(), src.origin()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data); // I originally had the following two lines abstracted out in a function, // but that seemed to choke and crash gcc 3.3.2 try { typename U::const_vec_iterator center = k.vec_begin() + k.center_x(); tuple5< typename U::const_vec_iterator, typename choose_accessor::accessor, int, int, BorderTreatmentMode> kernel (center, choose_accessor::make_accessor(k), -int(k.center_x()), int(k.width()) - int(k.center_x()) - 1, (BorderTreatmentMode)border_mode); vigra::separableConvolveX(src_image_range(src), dest_image(*dest), kernel); } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } template typename ImageFactory::view_type* convolve_y(const T& src, const U& k, int border_mode) { if (k.nrows() > src.ncols() || k.ncols() > src.nrows()) throw std::runtime_error("The image must be bigger than the kernel."); if (k.nrows() != 1) throw std::runtime_error("The 1D kernel must have only one row."); typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(src.size(), src.origin()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data); // I originally had the following two lines abstracted out in a function, // but that seemed to choke and crash gcc 3.3.2 try { typename U::const_vec_iterator center = k.vec_begin() + k.center_x(); tuple5< typename U::const_vec_iterator, typename choose_accessor::accessor, int, int, BorderTreatmentMode> kernel (center, choose_accessor::make_accessor(k), -int(k.center_x()), int(k.width()) - int(k.center_x()) - 1, (BorderTreatmentMode)border_mode); vigra::separableConvolveY(src_image_range(src), dest_image(*dest), kernel); } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } FloatImageView* _copy_kernel(const Kernel1D& kernel) { FloatImageData* dest_data = new FloatImageData(Dim(kernel.size(), 1)); FloatImageView* dest = new FloatImageView(*dest_data); try { FloatImageView::vec_iterator iout = dest->vec_begin(); for (int iin = kernel.left(); iin != kernel.right(); ++iout, ++iin) *iout = kernel[iin]; } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } // The following functions generate various kernels useful for // separable convolution. It might be possible to avoid the copy // by creating a new version of ImageData with push_back, or some // way to set the ImageData m_data member, but in the absense of // any such hack, this will do for now. The kernels all tend to be // quite small, so the copy shouldn't be too bad. FloatImageView* GaussianKernel(double std_dev) { Kernel1D kernel; kernel.initGaussian(std_dev); return _copy_kernel(kernel); } FloatImageView* GaussianDerivativeKernel(double std_dev, int order) { Kernel1D kernel; kernel.initGaussianDerivative(std_dev, order); return _copy_kernel(kernel); } FloatImageView* BinomialKernel(int radius) { Kernel1D kernel; kernel.initBinomial(radius); return _copy_kernel(kernel); } FloatImageView* AveragingKernel(int radius) { Kernel1D kernel; kernel.initAveraging(radius); return _copy_kernel(kernel); } FloatImageView* SymmetricGradientKernel() { Kernel1D kernel; kernel.initSymmetricGradient(); return _copy_kernel(kernel); } FloatImageView* SimpleSharpeningKernel(double sf) { FloatImageData* dest_data = new FloatImageData(Dim(3, 3)); FloatImageView* dest = new FloatImageView(*dest_data); dest->set(Point(0, 0), -sf/16.0); dest->set(Point(1, 0), -sf/8.0); dest->set(Point(2, 0), -sf/16.0); dest->set(Point(0, 1), -sf/8.0); dest->set(Point(1, 1), 1.0+sf*0.75); dest->set(Point(2, 1), -sf/8.0); dest->set(Point(0, 2), -sf/16.0); dest->set(Point(1, 2), -sf/8.0); dest->set(Point(2, 2), -sf/16.0); return dest; } #endif gamera-3.3.3/include/plugins/corelation.hpp0000644000076500000000000001034711652050140017715 0ustar chriswheel/* * * Copyright (C) 2001-2005 * Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd06292004_corelation #define mgd06292004_corelation #include "gamera.hpp" namespace Gamera { template double corelation_weighted(const T& a, const U& b, const Point& p, double bb, double bw, double wb, double ww) { size_t ul_y = std::max(a.ul_y(), p.y()); size_t ul_x = std::max(a.ul_x(), p.x()); size_t lr_y = std::min(a.lr_y(), p.y() + b.nrows()); size_t lr_x = std::min(a.lr_x(), p.x() + b.ncols()); double result = 0; double area = 0; for (size_t y = ul_y, ya = ul_y-a.ul_y(), yb = ul_y-p.y(); y < lr_y; ++y, ++ya, ++yb) { for (size_t x = ul_x, xa = ul_x-a.ul_x(), xb = ul_x-p.x(); x < lr_x; ++x, ++xa, ++xb) { if (is_black(b.get(Point(xb, yb)))) { area++; if (is_black(a.get(Point(xa, ya)))) result += bb; else result += bw; } else { if (is_black(a.get(Point(xa, ya)))) result += wb; else result += ww; } } } return result / area; } inline double corelation_absolute_distance(OneBitPixel a, OneBitPixel b) { if (is_black(a) == is_black(b)) return 0.0; return 1.0; } inline double corelation_absolute_distance(GreyScalePixel a, OneBitPixel b) { if (is_black(b)) return (double)a; return (double)(NumericTraits::max() - a); } template double corelation_sum(const T& a, const U& b, const Point& p, ProgressBar progress_bar = ProgressBar()) { size_t ul_y = std::max(a.ul_y(), p.y()); size_t ul_x = std::max(a.ul_x(), p.x()); size_t lr_y = std::min(a.lr_y(), p.y() + b.nrows()); size_t lr_x = std::min(a.lr_x(), p.x() + b.ncols()); double result = 0; double area = 0; progress_bar.set_length(lr_y - ul_y); for (size_t y = ul_y, ya = ul_y-a.ul_y(), yb = ul_y-p.y(); y < lr_y; ++y, ++ya, ++yb) { for (size_t x = ul_x, xa = ul_x-a.ul_x(), xb = ul_x-p.x(); x < lr_x; ++x, ++xa, ++xb) { typename T::value_type px_a = a.get(Point(xb, yb)); typename U::value_type px_b = b.get(Point(xb, yb)); if (is_black(px_b)) area++; result += corelation_absolute_distance(px_a, px_b); } progress_bar.step(); } return result / area; } inline double corelation_square_absolute_distance(OneBitPixel a, OneBitPixel b) { if (is_black(a) == is_black(b)) return 0.0; return 1.0; } inline double corelation_square_absolute_distance(GreyScalePixel a, OneBitPixel b) { double result = 0; if (is_black(a)) result = a; else result = (double)(NumericTraits::max() - a); return result * result; } template double corelation_sum_squares(const T& a, const U& b, const Point& p, ProgressBar progress_bar = ProgressBar()) { size_t ul_y = std::max(a.ul_y(), p.y()); size_t ul_x = std::max(a.ul_x(), p.x()); size_t lr_y = std::min(a.lr_y(), p.y() + b.nrows()); size_t lr_x = std::min(a.lr_x(), p.x() + b.ncols()); double result = 0; double area = 0; progress_bar.set_length(lr_y - ul_y); for (size_t y = ul_y, ya = ul_y-a.ul_y(), yb = ul_y-p.y(); y < lr_y; ++y, ++ya, ++yb) { for (size_t x = ul_x, xa = ul_x-a.ul_x(), xb = ul_x-p.x(); x < lr_x; ++x, ++xa, ++xb) { typename T::value_type px_a = a.get(Point(xb, yb)); typename U::value_type px_b = b.get(Point(xb, yb)); if (is_black(px_b)) area++; result += corelation_square_absolute_distance(px_a, px_b); } progress_bar.step(); } return result / area; } } #endif gamera-3.3.3/include/plugins/deformations.hpp0000755000076500000000000005320211747510564020270 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License */ #ifndef _kwm12032001_deformations #define _kwn12032001_deformations #include "plugins/image_utilities.hpp" #include "vigra/resizeimage.hxx" #include "vigra/affinegeometry.hxx" #include "plugins/logical.hpp" #include "plugins/morphology.hpp" #include #include #include #include #include #include // for backward compatibility: // plugin rotate has been moved from here to transformation.hpp #include "transformation.hpp" namespace Gamera { inline RGBPixel norm_weight_avg(RGBPixel& pix1, RGBPixel& pix2, double w1=1.0, double w2=1.0) { if(w1 == -w2) w1 = w2 = 1.0; return RGBPixel( GreyScalePixel(((pix1.red() * w1) + (pix2.red() * w2))/(w1 + w2)), GreyScalePixel(((pix1.green() * w1) + (pix2.green() * w2))/(w1 + w2)), GreyScalePixel(((pix1.blue() * w1) + (pix2.blue() * w2))/(w1 + w2))); } inline OneBitPixel norm_weight_avg(OneBitPixel& pix1, OneBitPixel& pix2, double w1=1.0, double w2=1.0) { if(w1 == -w2) w1 = w2 = 1.0; if(((pix1 * w1) + (pix2 * w2))/(w1 + w2) < 0.5) return OneBitPixel(0); return OneBitPixel(1); } template inline T norm_weight_avg(T& pix1, T& pix2, double w1=1.0, double w2=1.0) { return T(((pix1 * w1) + (pix2 * w2))/(w1 + w2)); } inline void filterfunc(RGBPixel &p0, RGBPixel &p1, RGBPixel &oldPixel, RGBPixel origPixel, double &weight) { p0 = origPixel; p1 = RGBPixel( GreyScalePixel(p0.red() * weight), GreyScalePixel(p0.green() * weight), GreyScalePixel(p0.blue() * weight)); p0 = RGBPixel( GreyScalePixel(p0.red() - p1.red() + oldPixel.red()), GreyScalePixel(p0.green() - p1.green() + oldPixel.green()), GreyScalePixel(p0.blue() - p1.blue() + oldPixel.blue())); oldPixel = p1; } template inline void filterfunc(T &p0, T &p1, T &oldPixel, T origPixel, double & weight) { p0 = origPixel; p1 = (T)(p0 * weight); p0 -= (T)(p1 - oldPixel); oldPixel = p1; } /* * borderfunc * * Corrects the alpha blending of border pixels. * * p0 - Value 1 * p1 - Value 2 * oldPixel - Value3 * origPixel - Pixel that comes from the source * weight - The weight given to the filter * bgcolor - The background color * */ template inline void borderfunc(T& p0, T& p1, T& oldPixel, T origPixel, double& weight, T bgcolor) { filterfunc(p0, p1, oldPixel, origPixel, weight); p0 = norm_weight_avg(bgcolor, origPixel, weight, 1.0-weight); } /* * shear_x * Shears the image horizontally with a shear angle in degrees. * * orig_view: The original image view. * * new_view: The image view after some rotation leaving a remaining * rotation less than 45 degrees * * row: Row number * * shift: Shift. * * bgcolor: Background color * * diff: Correction factor for negative shear values. */ template void shear_x(const T &orig, U &newbmp, size_t &row, size_t shiftAmount, typename T::value_type bgcolor, double weight, size_t diff=0) { typedef typename ImageFactory::view_type::value_type pixelFormat; size_t i=0, sourceshift=0; size_t width1 = newbmp.ncols(); pixelFormat p0 = bgcolor, p1 = bgcolor, oldPixel = bgcolor; if (shiftAmount >= diff) { shiftAmount -= diff; } else { sourceshift = diff - shiftAmount; shiftAmount = 0; } for (; i=0) && (i void shear_y(const T& orig, U& newbmp, size_t &col, size_t shiftAmount, typename T::value_type bgcolor, double weight, size_t diff=0) { typedef typename ImageFactory::view_type::value_type pixelFormat; size_t i, sourceshift=0; if (shiftAmount >= diff) { shiftAmount -= diff; } else { sourceshift = diff-shiftAmount; shiftAmount = 0; } size_t height1 = newbmp.nrows(); for(i = 0; i= 0) filterfunc(p0, p1, oldPixel, orig.get(Point(col, i - shiftAmount + sourceshift)),weight); if ((i>=0) && (i(quarter)) return 1.0 - 4.0*(n1-quarter)/per; if(n1<=quarter) return (4*n1/per); return -1.0+ 4.0*((n1-3*quarter)/per); } inline double sinc(float per, int n) { if(n==0) return 1.0; return sin2(per,n)*per/(2*M_PI*n); } inline double noisefunc(void) { return -1.0 + (2.0 * rand()/(RAND_MAX+1.0)); } inline size_t expDim(size_t amp) { return amp; } inline size_t noExpDim(size_t) { return 0; } inline size_t doShift(size_t amplitude, double amt) { return (size_t)(((1+amplitude)/2)*(1-amt)); } inline size_t noShift(size_t, double) { return 0; } template typename ImageFactory::view_type* wave(const T &src, int amplitude, float freq, int direction, int funcType, int offset, double turbulence, long random_seed=0) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type pixelFormat; srand(random_seed); pixelFormat background = pixelFormat(0.0); data_type* new_data; view_type* new_view; size_t (*vertExpand)(size_t), (*horizExpand)(size_t); double (*waveType)(float, int); if (direction) { vertExpand = &noExpDim; horizExpand = &expDim; } else { vertExpand = &expDim; horizExpand = &noExpDim; } switch(funcType) { case 0: waveType = &sin2; break; case 1: waveType = □ break; case 2: waveType = &sawtooth; break; case 3: waveType = ▵ break; case 4: waveType = &sinc; break; default: waveType = &sin2; } new_data = new data_type(Dim(src.ncols()+horizExpand(amplitude), src.nrows()+vertExpand(amplitude)), src.origin()); new_view = new view_type(*new_data); //image_copy_fill(src, *new_view); Dimensions must match.. try { typedef typename T::const_row_iterator IteratorI; typedef typename view_type::row_iterator IteratorJ; IteratorI ir = src.row_begin(); IteratorJ jr = new_view->row_begin(); for (; ir != src.row_end(); ++ir, ++jr) { typename IteratorI::iterator ic = ir.begin(); typename IteratorJ::iterator jc = jr.begin(); for (; ic != ir.end(); ++ic, ++jc) { *jc = *ic; } } if (direction) { for(size_t i=0; inrows(); i++) { double shift = ((double)amplitude/2)*(1-waveType(freq,(int)i-offset))+(turbulence*(rand()/RAND_MAX))+(turbulence/2.0); shear_x(src, *new_view, i, (size_t)(floor(shift)), background, (double)(shift-floor(shift))); } } else { for(size_t i=0; incols(); i++) { double shift = ((double)amplitude/2)*(1-waveType(freq,(int)i-offset))+(turbulence*(rand()/RAND_MAX))+(turbulence/2.0); shear_y(src, *new_view, i, (size_t)(floor(shift)), background, (double)(shift - (size_t)(shift))); } } image_copy_attributes(src, *new_view); } catch (std::exception e) { delete new_view; delete new_data; throw; } return new_view; } template typename ImageFactory::view_type* noise(const T &src, int amplitude, int direction, long random_seed = 0) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type pixelFormat; pixelFormat background = src.get(Point(0, 0)); //image_copy_fill(src, *new_view); srand(random_seed); size_t (*vertExpand)(size_t), (*horizExpand)(size_t), (*vertShift)(size_t, double), (*horizShift)(size_t, double); if (direction) { vertExpand = &expDim; horizExpand = &noExpDim; vertShift = &doShift; horizShift = &noShift; } else { vertExpand = &noExpDim; horizExpand = &expDim; vertShift = &noShift; horizShift = &doShift; } data_type* new_data = new data_type(Dim(src.ncols()+horizExpand(amplitude), src.nrows()+vertExpand(amplitude)), src.origin()); view_type* new_view = new view_type(*new_data); try { // Iterator initialization typedef typename T::const_row_iterator IteratorI; typedef typename view_type::row_iterator IteratorJ; IteratorI ir = src.row_begin(); IteratorJ jr = new_view->row_begin(); // In some version of gamera you can use: fill(new_view, background); for (; ir != src.row_end(); ++ir, ++jr) { typename IteratorI::iterator ic = ir.begin(); typename IteratorJ::iterator jc = jr.begin(); for (; ic != ir.end(); ++ic, ++jc) { *jc = background; } } for(size_t i = 0; iset(Point(j+horizShift(amplitude,noisefunc()), i+vertShift(amplitude,noisefunc())), src.get(Point(j, i))); } } } catch (std::exception e) { delete new_view; delete new_data; throw; } return new_view; } /* * Inkrub */ template typename ImageFactory::view_type* inkrub(const T &src, int a, long random_seed=0) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type pixelFormat; // pixelFormat background = src.get(0 ,0); data_type* new_data = new data_type(src.dim(), src.origin()); view_type* new_view = new view_type(*new_data); try { // Iterator initialization typedef typename T::const_row_iterator IteratorI; typedef typename view_type::row_iterator IteratorJ; IteratorI ir = src.row_begin(); IteratorJ jr = new_view->row_begin(); image_copy_fill(src, *new_view); srand(random_seed); for (int i=0; ir != src.row_end(); ++ir, ++jr, i++) { typename IteratorI::iterator ic = ir.begin(); typename IteratorJ::iterator jc = jr.begin(); for (int j=0; ic != ir.end(); ++ic, ++jc, j++) { pixelFormat px2 = *ic; pixelFormat px1 = src.get(Point(new_view->ncols()-j-1, i)); if ((a*rand()/RAND_MAX) == 0) *jc = norm_weight_avg(px1, px2, 0.5, 0.5); } } image_copy_attributes(src, *new_view); } catch (std::exception e) { delete new_view; delete new_data; throw; } return new_view; } inline double dist(double i0, double j0, double i1, double j1) { double quadI = pow(i1-i0,2.0), quadJ = pow(j1-j0,2.0); return sqrt(quadI + quadJ); } template typename ImageFactory::view_type* ink_diffuse(const T &src, int type, double dropoff, long random_seed=0) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type pixelFormat; // pixelFormat background = src.get(0, 0); data_type* new_data = new data_type(src.dim(), src.origin()); view_type* new_view = new view_type(*new_data); try { // Iterator initialization typedef typename T::const_row_iterator IteratorI; typedef typename view_type::row_iterator IteratorJ; IteratorI ir = src.row_begin(); IteratorJ jr = new_view->row_begin(); double val, expSum; pixelFormat aggColor = pixelFormat(); pixelFormat currColor = pixelFormat(); srand(random_seed); if (type == 0) { for (int j=0; ir != src.row_end(); ++ir, ++jr, j++) { typename IteratorI::iterator ic = ir.begin(); typename IteratorJ::iterator jc = jr.begin(); aggColor = *ir; expSum = 0; for (; ic != ir.end(); ++ic, ++jc) { val = 1.0/exp((double)j/dropoff); expSum += val; currColor = *ic; double weight = val / (val + expSum); aggColor = norm_weight_avg(aggColor, currColor, 1-weight, weight); *jc = norm_weight_avg(aggColor, currColor, val, 1.0-val); } } } else if(type == 1) { for (int i=0; ir != src.row_end(); ++ir, ++jr, i++) { typename IteratorI::iterator ic = ir.begin(); typename IteratorJ::iterator jc = jr.begin(); aggColor = src.get(Point(i, 0)); expSum = 0; for (int j=0; ic != ir.end(); ++ic, ++jc, j++) { val = 1.0/exp((double)j/dropoff); expSum += val; currColor = *ic; double weight = val / (val + expSum); aggColor = norm_weight_avg(aggColor, currColor, 1-weight, weight); new_view->set(Point(i, j), norm_weight_avg(aggColor, currColor, val, 1.0-val)); } } } else if (type == 2) { typename T::const_vec_iterator srcIter = src.vec_begin(); typename view_type::vec_iterator destIter = new_view->vec_end(); for(; srcIter != src.vec_end(); ++srcIter, --destIter) { *destIter = *srcIter; } size_t starti, startj; double iD, jD; iD = (double)src.ncols() * (double)rand() / (double)RAND_MAX; starti = (unsigned int)(floor(iD)); jD = (double)src.nrows() * (double)rand() / (double)RAND_MAX; startj = (unsigned int)(floor(jD)); while( ( (iD>0) && (iD < src.ncols())) && ( (jD>0) && (jDget(Point(size_t(floor(iD)), size_t(floor(jD)))); double weight = val / (val + expSum); aggColor = norm_weight_avg(aggColor, currColor, 1-weight, weight); new_view->set(Point(size_t(floor(iD)), size_t(floor(jD))), norm_weight_avg(aggColor, currColor, 1.0-val, val)); iD += sin(2.0*M_PI*rand()/(double)RAND_MAX); jD += cos(2.0*M_PI*rand()/(double)RAND_MAX); } } image_copy_attributes(src, *new_view); } catch (std::exception e) { delete new_view; delete new_data; throw; } return new_view; } /* * Image degradation after Kanungo et al. */ template typename ImageFactory::view_type* degrade_kanungo(const T &src, float eta, float a0, float a, float b0, float b, int k, int random_seed = 0) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type value_type; int d; double randval; FloatImageView *dt_fore, *dt_back; typename T::const_vec_iterator p; typename view_type::vec_iterator q; FloatImageView::vec_iterator df,db; value_type blackval = black(src); value_type whiteval = white(src); data_type* dest_data = new data_type(src.size(), src.origin()); view_type* dest = new view_type(*dest_data); // compute distance transform of foreground and background // as dest is not yet needed we abuse it for storing the inverted image dt_fore = (FloatImageView*)distance_transform(src, 0); for (p=src.vec_begin(), q=dest->vec_begin(); p != src.vec_end(); p++, q++) { if (is_black(*p)) *q = whiteval; else *q = blackval; } dt_back = (FloatImageView*)distance_transform(*dest, 0); // precompute probabilities (maximum distance 32 should be enough) double P_foreground_flip[32]; double P_background_flip[32]; for (d=0; d<32; d++) { P_foreground_flip[d] = a0*exp(-a*(d+1)*(d+1)) + eta; P_background_flip[d] = b0*exp(-b*(d+1)*(d+1)) + eta; } // flip pixels randomly based on their distance from border srand(random_seed); for (q=dest->vec_begin(), df=dt_fore->vec_begin(), db=dt_back->vec_begin(); q != dest->vec_end(); q++, df++, db++) { randval = ((double)rand()) / RAND_MAX; // note that dest is still inverted => black is background!! if (is_black(*q)) { d = (int)(*db + 0.5); if ((d > 32) || (randval > P_background_flip[d-1])) *q = whiteval; } else { d = (int)(*df + 0.5); if ((d > 32) || (randval > P_foreground_flip[d-1])) *q = blackval; } } // do a morphological closing if (k>1) { // build structuring element data_type* se_data = new data_type(Dim(k,k), Point(0,0)); view_type* se = new view_type(*se_data); for (q=se->vec_begin(); q!=se->vec_end(); q++) *q = blackval; view_type* dilated = dilate_with_structure(*dest, *se, Point(k/2,k/2)); view_type* eroded = erode_with_structure(*dilated, *se, Point(k/2,k/2)); delete dilated->data(); delete dilated; delete dest->data(); delete dest; delete se_data; delete se; dest = eroded; } // clean up delete dt_fore->data(); delete dt_fore; delete dt_back->data(); delete dt_back; return dest; } /* * add white speckles in onebit image */ template Image* white_speckles(const T &src, float p0, int n, int k, int connectivity = 2, int random_seed = 0) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type value_type; double randval; size_t x,y; size_t maxx = src.ncols() - 1; size_t maxy = src.nrows() - 1; int i; value_type blackval = black(src); value_type whiteval = white(src); data_type* speckles_data = new data_type(src.size(), src.origin()); view_type* speckles = new view_type(*speckles_data); // create random walk data for (y=0; y <= maxy; y++) { for (x=0; x <= maxx; x++) { Point p(x,y); if (is_black(src.get(p)) && (((double)rand()) / RAND_MAX < p0)) { speckles->set(p,blackval); for (i=0; iset(p,blackval); } } } } // do a morphological closing if (k>1) { typename view_type::vec_iterator q; // build structuring element data_type* se_data = new data_type(Dim(k,k), Point(0,0)); view_type* se = new view_type(*se_data); for (q=se->vec_begin(); q!=se->vec_end(); q++) *q = blackval; view_type* dilated = dilate_with_structure(*speckles, *se, Point(k/2,k/2)); view_type* closed = erode_with_structure(*dilated, *se, Point(k/2,k/2)); delete dilated->data(); delete dilated; delete speckles->data(); delete speckles; delete se_data; delete se; speckles = closed; } // subtract speckles from input image for (y=0; y <= maxy; y++) { for (x=0; x <= maxx; x++) { Point p(x,y); if (is_black(speckles->get(p))) { speckles->set(p,whiteval); } else { speckles->set(p,src.get(p)); } } } return speckles; } } #endif gamera-3.3.3/include/plugins/draw.hpp0000644000076500000000000003466611652050140016525 0ustar chriswheel/* * * Copyright (C) 2001-2009 * Ichiro Fujinaga, Michael Droettboom, Karl MacMillan, and Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd12032001_draw_hpp #define mgd12032001_draw_hpp #include namespace Gamera { template inline void _clip_points(T& image, size_t& x1, size_t& y1, size_t& x2, size_t& y2) { x1 -= image.ul_x(); x2 -= image.ul_x(); y1 -= image.ul_y(); y2 -= image.ul_y(); x1 = std::min(x1, image.ncols() - 1); x2 = std::min(x2, image.ncols() - 1); y1 = std::min(y1, image.nrows() - 1); y2 = std::min(y2, image.nrows() - 1); } // computation entry point of line in image inline void _cut_line(double &x1, double &y1, double &x2, double &y2, double x_len, double y_len, double lower, double upper) { if (y1 < lower) { x1 += (-y1 * x_len) / y_len; y1 = 0; } if (y2 > upper) { x2 += (-(y2 - upper) * x_len) / y_len; y2 = upper; } } // straightforward implementation of Bresenham's line drawing algorithm template void _draw_line(T& image, const P& a, const P& b, const typename T::value_type value) { double x1 = double(a.x()); double y1 = double(a.y()); double x2 = double(b.x()); double y2 = double(b.y()); y1 -= (double)image.ul_y(); y2 -= (double)image.ul_y(); x1 -= (double)image.ul_x(); x2 -= (double)image.ul_x(); double y_len = y2 - y1; double x_len = x2 - x1; // Short circuit for a single pixel. This speeds up // drawing Bezier curves a little bit if (((int)y_len) == 0 && ((int)x_len) == 0) { if (y1 >= 0 && y1 < image.nrows() && x1 >= 0 && x1 < image.ncols()) image.set(Point((size_t)x1, (size_t)y1), value); return; } // Cut the line so it doesn't go outside of the image bounding box. // It is more efficient to do a little math now than to test when // writing each pixel. if (y_len > 0) _cut_line(x1, y1, x2, y2, x_len, y_len, 0.0, (double)image.nrows() - 1); else _cut_line(x2, y2, x1, y1, x_len, y_len, 0.0, (double)image.nrows() - 1); if (x_len > 0) _cut_line(y1, x1, y2, x2, y_len, x_len, 0.0, (double)image.ncols() - 1); else _cut_line(y2, x2, y1, x1, y_len, x_len, 0.0, (double)image.ncols() - 1); if (!(y1 >= 0 && y1 < image.nrows() && x1 >= 0 && x1 < image.ncols() && y2 >= 0 && y2 < image.nrows() && x2 >= 0 && x2 < image.ncols())) { return; } int x_dist = int(x2) - int(x1); int y_dist = int(y2) - int(y1); int x_dist_abs = abs(x_dist); int y_dist_abs = abs(y_dist); if (x_dist_abs > y_dist_abs) { // x is controlling axis if (x1 > x2) { std::swap(x1, x2); std::swap(y1, y2); } int y_sign = Gamera::sign((int)y2 - (int)y1); int e = y_dist_abs - x_dist_abs; int y = y1; for (int x = x1; x <= (int)x2; ++x, e += y_dist_abs) { image.set(Point(x, y), value); if (e >= 0.0) { y += y_sign; e -= x_dist_abs; } } } else { if (y1 > y2) { std::swap(x1, x2); std::swap(y1, y2); } int x_sign = Gamera::sign(int(x2) - int(x1)); int e = x_dist_abs - y_dist_abs; int x = x1; for (int y = y1; y <= (int)y2; ++y, e += x_dist_abs) { image.set(Point(x, y), value); if (e >= 0.0) { x += x_sign; e -= y_dist_abs; } } } } template void draw_line(T& image, const P& a, const P& b, const typename T::value_type value, const double thickness=1.0) { const double half_thickness = (thickness - 1.0) / 2.0; for (double x = -half_thickness; x <= 0.0; x += 1.0) for (double y = -half_thickness; y <= 0.0; y += 1.0) _draw_line(image, P((double)a.x()+x, (double)a.y()+y), P((double)b.x()+x, (double)b.y()+y), value); for (double x = half_thickness; x >= 0.0; x -= 1.0) for (double y = half_thickness; y >= 0.0; y -= 1.0) _draw_line(image, P((double)a.x()+x, (double)a.y()+y), P((double)b.x()+x, (double)b.y()+y), value); _draw_line(image, a, b, value); } template void draw_hollow_rect(T& image, const P& a, const P& b, const typename T::value_type value, const double thickness = 1.0) { draw_line(image, a, P(a.x(), b.y()), value, thickness); draw_line(image, a, P(b.x(), a.y()), value, thickness); draw_line(image, b, P(b.x(), a.y()), value, thickness); draw_line(image, b, P(a.x(), b.y()), value, thickness); } template void draw_hollow_rect(T& image, const Rect& r, const typename T::value_type value) { draw_hollow_rect(image, r.ul(), r.lr(), value); } template void draw_filled_rect(T& image, const P& a, const P& b, const typename T::value_type value) { size_t x1, y1, x2, y2; size_t x1_ = (size_t)a.x(); size_t y1_ = (size_t)a.y(); size_t x2_ = (size_t)b.x(); size_t y2_ = (size_t)b.y(); _clip_points(image, x1_, y1_, x2_, y2_); if (x1_ > x2_) x1 = x2_, x2 = x1_; else x1 = x1_, x2 = x2_; if (y1_ > y2_) y1 = y2_, y2 = y1_; else y1 = y1_, y2 = y2_; for (size_t y = y1; y <= y2; ++y) for (size_t x = x1; x <= x2; ++x) image.set(Point(x, y), value); } template void draw_filled_rect(T& image, const Rect& r, const typename T::value_type value) { draw_filled_rect(image, r.ul(), r.lr(), value); } template void draw_marker(T& image, const P& p, const size_t size, const size_t style, const typename T::value_type value) { int half_size = (int)ceil(double(size) / 2.0); switch (style) { case 0: draw_line(image, P(p.x(), p.y() - half_size), P(p.x(), p.y() + half_size), value); draw_line(image, P(p.x() - half_size, p.y()), P(p.x() + half_size, p.y()), value); break; case 1: draw_line(image, P(p.x() - half_size, p.y() - half_size), P(p.x() + half_size, p.y() + half_size), value); draw_line(image, P(p.x() + half_size, p.y() - half_size), P(p.x() - half_size, p.y() + half_size), value); break; case 2: draw_hollow_rect(image, P(p.x() - half_size, p.y() - half_size), P(p.x() + half_size, p.y() + half_size), value); break; case 3: { int leftx = std::max((int)p.x() - half_size, 0); int rightx = std::min((int)p.x() + half_size, (int)image.ncols()-1); int topy = std::max((int)p.y() - half_size, 0); int boty = std::min((int)p.y() + half_size, (int)image.nrows()-1); draw_filled_rect(image, P(leftx, topy), P(rightx, boty), value); break; } default: throw std::runtime_error("Invalid style."); } } inline double square(double a) { return a * a; } template void draw_bezier(T& image, const P& start, const P& c1, const P& c2, const P& end, const typename T::value_type value, const double thickness = 1.0, const double accuracy = 0.1) { double start_x = double(start.x()); double start_y = double(start.y()); double c1_x = double(c1.x()); double c1_y = double(c1.y()); double c2_x = double(c2.x()); double c2_y = double(c2.y()); double end_x = double(end.x()); double end_y = double(end.y()); // All of this is just to calculate epsilon given the accuracy and // the length and "waviness" of the curve double dd0 = square(start_x - 2*c1_x + c2_x) + square(start_y - 2*c1_y + c2_y); double dd1 = square(c1_x - 2*c2_x + end_x) + square(c1_y - 2*c2_y + end_y); double dd = 6.0 * sqrt(std::max(dd0, dd1)); double e2 = 8.0 * accuracy <= dd ? 8 * accuracy / dd : 1.0; double epsilon = sqrt(e2); double y = start_y; double x = start_x; for (double a = 1.0, b = 0.0; a > 0.0; a -= epsilon, b += epsilon) { double a_3 = a * a * a; double a_2_b = a * a * b * 3.0; double b_3 = b * b * b; double b_2_a = b * b * a * 3.0; double new_x = start_x*a_3 + c1_x*a_2_b + c2_x*b_2_a + end_x*b_3; double new_y = start_y*a_3 + c1_y*a_2_b + c2_y*b_2_a + end_y*b_3; draw_line(image, P(x, y), P(new_x, new_y), value, thickness); y = new_y; x = new_x; } draw_line(image, P(x, y), end, value, thickness); } template void draw_circle(T& image, const P& c, const double r, const typename T::value_type value, const double thickness = 1.0, const double accuracy = 0.1) { static const double kappa = 4.0 * ((sqrt(2.0) - 1.0) / 3.0); // Bezier circle approximation from // http://www.whizkidtech.redprince.net/bezier/circle/ const double z = kappa * r; draw_bezier(image, P(c.x(), c.y() - r), P(c.x() + z, c.y() - r), P(c.x() + r, c.y() - z), P(c.x() + r, c.y()), value, thickness, accuracy); draw_bezier(image, P(c.x() + r, c.y()), P(c.x() + r, c.y() + z), P(c.x() + z, c.y() + r), P(c.x(), c.y() + r), value, thickness, accuracy); draw_bezier(image, P(c.x(), c.y() + r), P(c.x() - z, c.y() + r), P(c.x() - r, c.y() + z), P(c.x() - r, c.y()), value, thickness, accuracy); draw_bezier(image, P(c.x() - r, c.y()), P(c.x() - r, c.y() - z), P(c.x() - z, c.y() - r), P(c.x(), c.y() - r), value, thickness, accuracy); } /* From John R. Shaw's QuickFill code which is based on "An Efficient Flood Visit Algorithm" by Anton Treuenfels, C/C++ Users Journal Vol 12, No. 8, Aug 1994 */ template struct FloodFill { typedef std::stack Stack; inline static void travel(T& image, Stack& s, const typename T::value_type& interior, const typename T::value_type& color, const size_t left, const size_t right, const size_t y) { if (left + 1 <= right) { typename T::value_type col1, col2; for (size_t x = left + 1; x <= right; ++x) { col1 = image.get(Point(x-1, y)); col2 = image.get(Point(x, y)); if (col1 == interior && col2 != interior) { s.push(Point(x-1, y)); } } if (col2 == interior) { s.push(Point(right, y)); } } } static void fill_seeds(T& image, Stack& s, const typename T::value_type& interior, const typename T::value_type& color) { typedef typename T::value_type pixel_t; size_t left, right; while (!s.empty()) { Point p = s.top(); s.pop(); if (image.get(p) == interior) { for (right = p.x(); right < image.ncols(); ++right) { if (image.get(Point(right, p.y())) != interior) break; image.set(Point(right, p.y()), color); } --right; long int l = p.x() - 1; for (; l >= 0; --l) { if (image.get(Point(l, p.y())) != interior) break; image.set(Point(l, p.y()), color); } left = (size_t)l + 1; if (left != right) { if (p.y() < image.nrows() - 1) travel(image, s, interior, color, left, right, p.y() + 1); if (p.y() > 0) travel(image, s, interior, color, left, right, p.y() - 1); } else { if (p.y() < image.nrows() - 1) if (image.get(Point(left, p.y() + 1)) != color) s.push(Point(left, p.y() + 1)); if (p.y() > 1) if (image.get(Point(left, p.y() - 1)) != color) s.push(Point(left, p.y() - 1)); } } } } }; template void flood_fill(T& image, const P& p, const typename T::value_type& color) { double x = double(p.x()) - double(image.ul_x()); double y = double(p.y()) - double(image.ul_y()); if (y >= image.nrows() || x >= image.ncols()) throw std::runtime_error("Coordinate out of range."); typename T::value_type interior = image.get(Point((size_t)x, (size_t)y)); if (color == interior) return; typename FloodFill::Stack s; s.push(Point((size_t)x, (size_t)y)); FloodFill::fill_seeds(image, s, interior, color); } template void remove_border(T& image) { size_t bottom = image.nrows() - 1; size_t right = image.ncols() - 1; for (size_t x = 0; x < image.ncols(); ++x) { if (image.get(Point(x, 0)) != 0) flood_fill(image, Point(x, 0), white(image)); if (image.get(Point(x, bottom)) != 0) flood_fill(image, Point(x, bottom), white(image)); } for (size_t y = 0; y < image.nrows(); ++y) { if (image.get(Point(0, y)) != 0) flood_fill(image, Point(0, y), white(image)); if (image.get(Point(right, y)) != 0) flood_fill(image, Point(right, y), white(image)); } } template void highlight(T& a, const U& b, const typename T::value_type& color) { size_t ul_y = std::max(a.ul_y(), b.ul_y()); size_t ul_x = std::max(a.ul_x(), b.ul_x()); size_t lr_y = std::min(a.lr_y(), b.lr_y()); size_t lr_x = std::min(a.lr_x(), b.lr_x()); if (ul_y > lr_y || ul_x > lr_x) return; for (size_t y = ul_y, ya = y-a.ul_y(), yb=y-b.ul_y(); y <= lr_y; ++y, ++ya, ++yb) for (size_t x = ul_x, xa = x-a.ul_x(), xb=x-b.ul_x(); x <= lr_x; ++x, ++xa, ++xb) { if (is_black(b.get(Point(xb, yb)))) a.set(Point(xa, ya), color); } } } // namespace Gamera #endif gamera-3.3.3/include/plugins/edgedetect.hpp0000644000076500000000000001365111652050140017654 0ustar chriswheel/* * * Copyright (C) 2002-2005 Michael Droettboom and Robert Ferguson * 2009 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef lcninja_edgedetect #define lcninja_edgedetect #include "gamera.hpp" #include "vigra/edgedetection.hxx" #include "logical.hpp" #include "morphology.hpp" namespace Gamera { template typename ImageFactory::view_type* difference_of_exponential_edge_image(const T& src, double scale, double gradient_threshold, unsigned int min_edge_length) { if ((scale < 0) || (gradient_threshold < 0)) throw std::runtime_error("The scale and gradient_threshold must be greater than 0"); typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(src.size(), src.origin()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data); try { vigra::differenceOfExponentialEdgeImage(src_image_range(src), dest_image(*dest), scale, gradient_threshold); if (min_edge_length > 0) vigra::removeShortEdges(dest_image_range(*dest), min_edge_length, NumericTraits::one()); } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } template typename ImageFactory::view_type* difference_of_exponential_crack_edge_image(const T& src, double scale, double gradient_threshold, unsigned int min_edge_length, unsigned int close_gaps, unsigned int beautify) { if ((scale < 0) || (gradient_threshold < 0)) throw std::runtime_error("The scale and gradient threshold must be greater than 0"); typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(Dim(src.ncols() * 2, src.nrows() * 2), src.origin()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data); try { vigra::differenceOfExponentialCrackEdgeImage(src_image_range(src), dest_image(*dest), scale, gradient_threshold, NumericTraits::one()); if (min_edge_length > 0) vigra::removeShortEdges(dest_image_range(*dest), min_edge_length, NumericTraits::one()); if (close_gaps) vigra::closeGapsInCrackEdgeImage(dest_image_range(*dest), NumericTraits::one()); if (beautify) vigra::beautifyCrackEdgeImage(dest_image_range(*dest), NumericTraits::one(), NumericTraits::zero()); } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } template typename ImageFactory::view_type* canny_edge_image(const T& src, double scale, double gradient_threshold) { if ((scale < 0) || (gradient_threshold < 0)) throw std::runtime_error("The scale and gradient threshold must be >= 0"); typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(src.size(), src.origin()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data, src); try { vigra::cannyEdgeImage(src_image_range(src), dest_image(*dest), scale, gradient_threshold, NumericTraits::one()); } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } template Image* labeled_region_edges(const T& src, bool mark_both=false) { OneBitImageData* edges_data = new OneBitImageData(src.size(), src.origin()); OneBitImageView* edges = new OneBitImageView(*edges_data); size_t x,y,max_x,max_y; max_x = src.ncols()-1; max_y = src.nrows()-1; // the following mask is sufficient: xx // xx // because we assume that no pixel is unlabeled // check bulk of image for (y=0; yset(Point(x,y),1); if (mark_both) edges->set(Point(x+1,y),1); } if (src.get(Point(x,y)) != src.get(Point(x,y+1))) { edges->set(Point(x,y),1); if (mark_both) edges->set(Point(x,y+1),1); } if (src.get(Point(x,y)) != src.get(Point(x+1,y+1))) { edges->set(Point(x,y),1); if (mark_both) edges->set(Point(x+1,y+1),1); } } } // check last row for (x=0; xset(Point(x,max_y),1); if (mark_both) edges->set(Point(x+1,max_y),1); } } // check last column for (y=0; yset(Point(max_x,y),1); if (mark_both) edges->set(Point(max_x,y+1),1); } } return edges; } template typename ImageFactory::view_type* outline(const T& in) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; view_type* out = erode_dilate(in, 1, 0, 0); xor_image(*out, in); return out; } } #endif gamera-3.3.3/include/plugins/features.hpp0000644000076500000000000005020611652050140017372 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2009-2010 Christoph Dalitz * 2010 Robert Butz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm10242002_features #define kwm10242002_features #include "gamera.hpp" #include "image_utilities.hpp" #include "morphology.hpp" #include "thinning.hpp" #include #include namespace Gamera { // // Black Area // // Find the number of black pixels in an image. This is just a convenience // routine, but it demonstrates the correct method for determining whether // a pixel is black or white. // template void black_area(const T& mat, feature_t* buf) { *buf = 0; for (typename T::const_vec_iterator i = mat.vec_begin(); i != mat.vec_end(); ++i) { if (is_black(*i)) (*buf)++; } } // Old-style version, since it is called from C++ elsewhere template feature_t black_area(const T& mat) { int black_pixels = 0; for (typename T::const_vec_iterator i = mat.vec_begin(); i != mat.vec_end(); ++i) { if (is_black(*i)) black_pixels++; } return (feature_t)black_pixels; } // Ratio of black to white pixels template feature_t volume(const T &m) { unsigned int count = 0; typename T::const_vec_iterator i = m.vec_begin(); for (; i != m.vec_end(); i++) if (is_black(*i)) count++; return (feature_t(count) / (m.nrows() * m.ncols())); } template void volume(const T &m, feature_t* buf) { *buf = volume(m); } // // Normalized Central Moments // // Returns vector containing: // u10, u01, u20, u02, u11, u30, u12, u21, u03 // template void moments_1d(Iterator begin, Iterator end, feature_t& m0, feature_t& m1, feature_t& m2, feature_t& m3) { // zeroeth, first, second, third order on one axis feature_t tmp = 0; size_t x = 0; Iterator itx = begin; for (; itx != end; ++itx, x++) { size_t y = 0, proj = 0; typename Iterator::iterator ity = itx.begin(); for (; ity != itx.end(); ++ity, ++y) if (is_black(*ity)) proj++; m0 += proj; m1 += (tmp = x * proj); m2 += (tmp *= x); m3 += (tmp * x); } } template void moments_2d(Iterator begin, Iterator end, feature_t& m11, feature_t& m12, feature_t& m21) { feature_t tmp = 0; size_t x = 0; Iterator itx = begin; for (; itx != end; itx++, x++) { size_t y = 0; typename Iterator::iterator ity = itx.begin(); for (; ity != itx.end(); ity++, y++) if (is_black(*ity)) { m11 += (tmp = x * y); m21 += (tmp * x); m12 += (tmp * y); } } } template void moments(T &m, feature_t* buf) { feature_t m10 = 0, m11 = 0, m20 = 0, m21 = 0, m12 = 0, m01 = 0, m02 = 0, m30 = 0, m03 = 0, m00 = 0, dummy = 0; moments_1d(m.row_begin(), m.row_end(), m00, m01, m02, m03); moments_1d(m.col_begin(), m.col_end(), dummy, m10, m20, m30); moments_2d(m.col_begin(), m.col_end(), m11, m12, m21); feature_t x, y, x2, y2, div; x = (feature_t)m10 / m00; x2 = 2 * x * x; y = (feature_t)m01 / m00; y2 = 2 * y * y; // normalized center of gravity [0,1] if (m.ncols() > 1) *(buf++) = x / (m.ncols()-1); else *(buf++) = 0.5; // only one pixel wide if (m.nrows() > 1) *(buf++) = y / (m.nrows()-1); else *(buf++) = 0.5; // only one pixel high div = (feature_t)m00 * m00; // common normalization divisor *(buf++) = (m20 - (x * m10)) / div; // u20 *(buf++) = (m02 - (y * m01)) / div; // u02 *(buf++) = (m11 - (y * m10)) / div; // u11 div *= (feature_t)sqrt((double)m00); *(buf++) = (m30 - (3 * x * m20) + (x2 * m10)) / div; // u30 *(buf++) = (m12 - (2 * y * m11) - (x * m02) + (y2 * m10)) / div; // u12 *(buf++) = (m21 - (2 * x * m11) - (y * m20) + (x2 * m01)) / div; // u21 *buf = (m03 - (3 * y * m02) + (y2 * m01)) / div; // u03 } // Number of holes in x and y direction // Counts the number of black runs (runs that "wrap-around" considered // two runs). // This is the Euler number // See: // Di Zenzo, S.; Cinque, L.; Levialdi, S. // Run-based algorithms for binary image processing // Pattern Analysis and Machine Intelligence, IEEE Transactions on , // Volume: 18 Issue: 1 , Jan. 1996 // Page(s): 83 -89 template inline int nholes_1d(Iterator begin, Iterator end) { int hole_count = 0; bool last; bool has_black; Iterator r = begin; for (; r != end; r++) { last = false; has_black = false; typename Iterator::iterator c = r.begin(); for (; c != r.end(); c++) { if (is_black(*c)){ last = true; has_black = true; } else if (last) { last = false; hole_count++; } } if (!last && hole_count && has_black){ hole_count--; } } return hole_count; } template void nholes(T &m, feature_t* buf) { int vert, horiz; vert = nholes_1d(m.col_begin(), m.col_end()); horiz = nholes_1d(m.row_begin(), m.row_end()); *(buf++) = (feature_t)vert / m.ncols(); *buf = (feature_t)horiz / m.nrows(); } // // nholes_extended // // This divides the image into strips (both horizontally // and vertically) and computes the number of holes on each strip. // template void nholes_extended(const T& m, feature_t* buf) { double quarter_cols = m.ncols() / 4.0; double start = 0.0; for (size_t i = 0; i < 4; ++i) { *(buf++) = nholes_1d(m.col_begin() + size_t(start), m.col_begin() + size_t(start) + size_t(quarter_cols)) /quarter_cols; start += quarter_cols; } double quarter_rows = m.nrows() / 4.0; start = 0.0; for (size_t i = 0; i < 4; ++i) { *(buf++) = nholes_1d(m.row_begin() + size_t(start), m.row_begin() + size_t(start) + size_t(quarter_rows)) / quarter_rows; start += quarter_rows; } } template void area(const T& image, feature_t* buf) { *buf = feature_t(image.nrows() * image.ncols()) / image.scaling(); } template void aspect_ratio(const T& image, feature_t* buf) { *buf = feature_t(image.ncols()) / feature_t(image.nrows()); } template void nrows_feature(const T& image, feature_t* buf) { *buf = feature_t(image.nrows()); } template void ncols_feature(const T& image, feature_t* buf) { *buf = feature_t(image.ncols()); } // helper function for compactness which computes the surface // of pixels lying on the image bounding box that are ignored // by a dilation template feature_t compactness_border_outer_volume(const T &m) { int lastPx = 0; int i, rows, cols; int startPx = 0; feature_t num_dil_px = 0; rows = m.nrows(); cols = m.ncols(); startPx = m.get(Point(0,0)); // needed for the last pxs // 1st row left to right, including both corners for (i=0; i down, including lower right corner for (i=1; i=0; i--) { if (is_black(m.get(Point(i,rows-1)))) { if (lastPx == 2) num_dil_px += 1; else if (lastPx == 1) num_dil_px += 2; else num_dil_px += 3; if (i== 0)// lower left corner num_dil_px += 2; lastPx = 2; } else{ // px is white lastPx -=1; if (i== 0) // lower left corner lastPx = 0; } } // 1st column down->top, no corners included for (i=rows-2; i>0; i--) { if (is_black(m.get(Point(0,i)))) { if (lastPx == 2) num_dil_px += 1; else if (lastPx == 1) num_dil_px += 2; else num_dil_px += 3; lastPx = 2; } else { // px is white lastPx -=1; } } // avoiding overlapping dilated_px: Start-End if (is_black(startPx)) { if (is_black(m.get(Point(0,1)))) { num_dil_px -= 2; } else if (is_black( m.get(Point(0,2)))) { num_dil_px -= 1; } } return num_dil_px / (rows*cols); // volume } // // compactness // // compactness is ratio of the volume of the outline of an image to // the volume of the image. // template void compactness(const T& image, feature_t* buf) { // I've converted this to a more efficient method. Rather than // using (volume(outline) / volume(original)), I just use // volume(dilated) - volume(original) / volume(original). This // prevents the unnecessary xor_image pixel-by-pixel operation from // happening. We still need to create a copy to dilate, however, // since we don't want to change the original. // as dilate does not extend beyond the image borders, // we must compute the surface of the border pixels separately feature_t vol = volume(image); feature_t outer_vol = compactness_border_outer_volume(image); feature_t result; if (vol == 0) result = std::numeric_limits::max(); else { typedef typename ImageFactory::view_type* view_type; view_type copy = erode_dilate(image, 1, 0, 0); // dilate(*copy); result = (volume(*copy) + outer_vol - vol) / vol; delete copy->data(); delete copy; } *buf = result; } // // volume16regions // // This function divides the image into 16 regions and takes the volume of // each of those regions. // template void volume16regions(const T& image, feature_t* buf) { double rows = image.nrows() / 4.0; double cols = image.ncols() / 4.0; size_t rows_int = size_t(rows); size_t cols_int = size_t(cols); Dim size(cols_int, rows_int); if (size.ncols() == 0) size.ncols(1); if (size.nrows() == 0) size.nrows(1); double start_col = double(image.offset_x()); for (size_t i = 0; i < 4; ++i) { double start_row = double(image.offset_y()); for (size_t j = 0; j < 4; ++j) { T tmp(image, Point((size_t)start_col, (size_t)start_row), size); *(buf++) = volume(tmp); start_row += rows; size.nrows( size_t(start_row + rows)-size_t(start_row)); if (size.nrows() == 0) size.nrows(1); } start_col += cols; size.ncols( size_t(start_col + cols) - size_t(start_col)); if (size.ncols() == 0) size.ncols(1); } } // // volume64regions // // This function divides the image into 64 regions and takes the volume of // each of those regions. // template void volume64regions(const T& image, feature_t* buf) { double rows = image.nrows() / 8.0; double cols = image.ncols() / 8.0; size_t rows_int = size_t(rows); size_t cols_int = size_t(cols); Dim size(cols_int, rows_int); if (size.ncols() == 0) size.ncols(1); if (size.nrows() == 0) size.nrows(1); double start_col = double(image.offset_x()); for (size_t i = 0; i < 8; ++i) { double start_row = double(image.offset_y()); for (size_t j = 0; j < 8; ++j) { T tmp(image, Point((size_t)start_col, (size_t)start_row), size); *(buf++) = volume(tmp); start_row += rows; size.nrows( size_t(start_row + rows)-size_t(start_row)); if (size.nrows() == 0) size.nrows(1); } start_col += cols; size.ncols( size_t(start_col + cols) - size_t(start_col)); if (size.ncols() == 0) size.ncols(1); } } // // Zernike Moments // double zer_pol_R(int n, int m, double x, double y) { // precomputed factorials => make sure that n < 11 const int fak_a[] = {1,1,2,6,24,120,720,5040,40320,362880,3628800}; int s,Na,Nb,Nc; int sign = 1; double result = 0; double distance = sqrt(x * x + y * y); double Zb = 1; for(s=0; s<=(n-m)/2; s++){ Na = fak_a[n-s] / fak_a[s]; if (n-2*s == 0) Zb = 1; else Zb *= distance; Nb = fak_a[(n+m)/2-s]; Nc = fak_a[(n-m)/2-s]; result += sign * (Na * Zb / Nb) / Nc; sign = -sign; } return result; } void zer_pol(int n, int m, double x, double y, double& real, double& imag, double norm_scale=1.0) { const complex I(0.0, 1.0); // theoretically redundant due to scaling, // but with translation-normalizing after all needed if (sqrt(x*x + y*y) > 1.0) { //std::cout << "outer px=" << x << "," << y << std::endl; real = 0.0; imag = 0.0; } else { double Rnm = zer_pol_R(n, m, x*norm_scale, y*norm_scale); double angle_Theta = atan2(y,x); complex Inm = exp(m*angle_Theta*I); complex result = conj(Rnm * Inm); // complex conj. real = result.real(); imag = result.imag(); } } // we use this wrapper so that it is easy to // change the maximum order in the future template void zernike_moments(const T& image, feature_t* buf) { // beware that, when changing the maximum order from six to // something different, the dimension of the feature vector // needs to be adjusted in the python interface features.py zernike_moments( image, buf, 6); } template void zernike_moments(const T& image, feature_t* buf, size_t order_n) { size_t const max_order_n=order_n; size_t num_features=0; // evaluated by max_order_n double x_dist, y_dist, real_tmp, imag_tmp; // compute center of mass and normalization factor m00 feature_t m00=0, m10=0, m01=0, dummy1=0, dummy2=0, dummy3=0; moments_1d(image.row_begin(), image.row_end(), m00, m01, dummy1, dummy2); moments_1d(image.col_begin(), image.col_end(), dummy1, m10, dummy2, dummy3); double centroid_x = m10/m00; double centroid_y = m01/m00; // we use a Zernike circle that includes the entire image // beware however that some pixels can fall outside the circle // by normalizing ZMs to be translation invariant, e.g. a large // bunch of pixels in the upper left corner which draws the // center to it, excludes pixels in the lower right corner. size_t max_dimension = std::max(image.ncols(), image.nrows()); double unit_circle_scale = sqrt(2*pow(max_dimension/2.0,2)); // number of features depends on maximum order for (size_t i=0 ; i<=max_order_n; i++) num_features += i/2 + 1; num_features -= 2; // A00 and A11 are constants feature_t* begin = buf; for (size_t i = 0; i < num_features; ++i) *(buf++) = 0.0; buf = begin; size_t m, n, idx; typename T::const_vec_iterator it = image.vec_begin(); for (size_t y = 0; y < image.nrows(); ++y) { for (size_t x = 0; x < image.ncols(); ++x, ++it) { if (is_black(*it)) { x_dist = (x - centroid_x) / unit_circle_scale; y_dist = (y - centroid_y) / unit_circle_scale; for (n = 2, idx=0; n <= max_order_n; ++n) { for (m = n%2; m <= n; m+=2) { zer_pol(n, m, x_dist, y_dist, real_tmp, imag_tmp); buf[idx++] += sqrt(real_tmp*real_tmp + imag_tmp*imag_tmp); } } } } } // scale normalization by m00 for (size_t n = 2, idx=0; n <= max_order_n; ++n) { double multiplier = (n + 1) / M_PI; multiplier /= m00; for (m= n%2; m<= n; m+=2){ buf[idx++] *= multiplier; } } } // // Skeleton features // template void skeleton_features(const T& image, feature_t* buf) { if (image.nrows() == 1 || image.ncols() == 1) { *(buf++) = 0.0; *(buf++) = 0.0; *(buf++) = 0.0; *(buf++) = 3.0; *(buf++) = 3.0; *buf = 3.0; return; } typedef typename ImageFactory::view_type* view_type; view_type skel = thin_lc(image); unsigned char p; size_t T_joints = 0, X_joints = 0, bend_points = 0; size_t end_points = 0, total_pixels = 0; size_t center_x = 0, center_y = 0; for (size_t y = 0; y < skel->nrows(); ++y) { size_t y_before = (y == 0) ? 1 : y - 1; size_t y_after = (y == skel->nrows() - 1) ? skel->nrows() - 2 : y + 1; for (size_t x = 0; x < skel->ncols(); ++x) { if (is_black(skel->get(Point(x, y)))) { ++total_pixels; center_x += x; center_y += y; size_t N, S; thin_zs_get(y, y_before, y_after, x, *skel, p, N, S); switch (N) { case 4: ++X_joints; break; case 3: ++T_joints; break; case 2: if (!(((p & 17) == 17) || // Crosswise pairs ((p & 34) == 34) || ((p & 68) == 68) || ((p & 136) == 136))) ++bend_points; break; case 1: ++end_points; break; } } } } if (total_pixels == 0) { for (size_t i = 0; i < 6; ++i) *(buf++) = 0.0; return; } center_x /= total_pixels; size_t x_axis_crossings = 0; bool last_pixel = false; for (size_t y = 0; y < skel->nrows(); ++y) if (is_black(skel->get(Point(center_x, y))) && !last_pixel) { last_pixel = true; ++x_axis_crossings; } else { last_pixel = false; } center_y /= total_pixels; size_t y_axis_crossings = 0; last_pixel = false; for (size_t x = 0; x < skel->ncols(); ++x) { if (is_black(skel->get(Point(x, center_y))) && !last_pixel) { last_pixel = true; ++y_axis_crossings; } else { last_pixel = false; } } delete skel->data(); delete skel; *(buf++) = feature_t(X_joints); *(buf++) = feature_t(T_joints); *(buf++) = feature_t(bend_points) / feature_t(total_pixels); *(buf++) = feature_t(end_points); *(buf++) = feature_t(x_axis_crossings); *buf = feature_t(y_axis_crossings); } // // Top Bottom // template void top_bottom(const T& m, feature_t* buf) { int top = -1; typename T::const_row_iterator ri = m.row_begin(); for (int i = 0; ri != m.row_end(); ri++, i++) { typename T::const_col_iterator ci = ri.begin(); for (; ci != ri.end(); ci++) if (is_black(*ci)) { top = i; break; } if (top != -1) break; } if (top == -1) { *(buf++) = 1.0; *buf = 0.0; return; } int bottom = -1; ri = m.row_end(); --ri; for (int i = m.nrows() - 1; ri != m.row_begin(); ri--, i--) { typename T::const_col_iterator ci = ri.begin(); for (; ci != ri.end(); ci++) if (is_black(*ci)) { bottom = i; break; } if (bottom != -1) break; } *(buf++) = feature_t(top) / feature_t(m.nrows()); *buf = feature_t(bottom) / feature_t(m.nrows()); } } #endif gamera-3.3.3/include/plugins/geometry.hpp0000644000076500000000000005656611755374466017456 0ustar chriswheel/* * Copyright (C) 2009-2012 Christoph Dalitz * 2010 Oliver Christen * 2011 Christian Brandt * 2012 David Kolanus * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef cd30112009_geometry #define cd30112009_geometry #include #include #include #include #include "gamera.hpp" #include "vigra/distancetransform.hxx" #include "vigra/seededregiongrowing.hxx" #include "geostructs/kdtree.hpp" #include "geostructs/delaunaytree.hpp" #include "graph/graph.hpp" #include "graph/graphdataderived.hpp" #include "graph/node.hpp" #include "plugins/contour.hpp" #include "plugins/draw.hpp" using namespace Gamera::Kdtree; using namespace Gamera::Delaunaytree; using namespace Gamera::GraphApi; using namespace std; namespace Gamera { // this implementation is based on a sample program included // in the VIGRA library by Ulrich Koethe template Image* voronoi_from_labeled_image(const T& src, bool white_edges=false) { typedef typename T::value_type value_type; typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; // vigra's seeded region growing only works on greyscale images Grey16ImageData* voronoi_data = new Grey16ImageData(src.size(), src.origin()); Grey16ImageView* voronoi = new Grey16ImageView(*voronoi_data); size_t x,y; value_type val, maxlabel; map all_labels; maxlabel = 0; for (y=0; y 0) { voronoi->set(Point(x,y),val); all_labels.insert(make_pair(val,true)); if (val > maxlabel) maxlabel = val; } else { voronoi->set(Point(x,y),0); } } } if (all_labels.size() <= 2) { delete voronoi; delete voronoi_data; throw std::runtime_error("Black pixels must be labeled for Voronoi tesselation."); } FloatImageData* dist_data = new FloatImageData(src.size(), src.origin()); FloatImageView* dist = new FloatImageView(*dist_data); try { // The Voronoi tesselation is done by a watershed segmentation // on the distance transform image, which is quite a bit overhead. // The algorithm should be significantly faster when the Voronoi // cells are computed directly similar to a distance transform. // TODO: implement this based on VIGRA's distance transform code vigra::distanceTransform(src_image_range(src), dest_image(*dist), 0, 2); vigra::ArrayOfRegionStatistics > statistics((size_t)maxlabel); if (white_edges) { vigra::seededRegionGrowing(src_image_range(*dist), src_image(*voronoi), dest_image(*voronoi), statistics, KeepContours); } else { vigra::seededRegionGrowing(src_image_range(*dist), src_image(*voronoi), dest_image(*voronoi), statistics, CompleteGrow); } } catch (std::exception e) { delete dist; delete dist_data; delete voronoi; delete voronoi_data; throw; } // distance image no longer needed delete dist; delete dist_data; // copy over result to return value data_type* result_data = new data_type(voronoi->size(), voronoi->origin()); view_type* result = new view_type(*result_data); for (y=0; ynrows(); ++y) { for (x=0; xncols(); ++x) { result->set(Point(x,y),(value_type)voronoi->get(Point(x,y))); } } // greyscale image no longer needed delete voronoi; delete voronoi_data; return result; } template void voronoi_from_points(T& src, const PointVector* points, IntVector* labels) { // some plausi checks if (points->empty()) throw std::runtime_error("points must not be empty."); if (points->size() != labels->size()) throw std::runtime_error("Number of points must match the number of labels."); size_t i,x,y; // build kd-tree from points KdNodeVector nodes,neighbors; CoordPoint p(2); for (i=0; isize(); i++) { p[0] = (*points)[i].x(); p[1] = (*points)[i].y(); KdNode n(p); n.data = &((*labels)[i]); nodes.push_back(n); } KdTree tree(&nodes); // label all pixels with nearest neighbor label for (y=0; y PyObject* labeled_region_neighbors(const T& src, bool eight_connectivity=true) { size_t x,y,max_x,max_y; typedef typename T::value_type value_type; max_x = src.ncols()-1; max_y = src.nrows()-1; // map for storing neighborship relations; to avoid duplicates, // we store for each label only *smaller* neighboring labels // note that we must use 'int' insetad of 'value_type' because // some versions of gcc do not like nested templates typedef set set_type; typedef map map_type; map_type neighbors; // check bulk of image value_type label1,label2; //set emptyset; set_type emptyset; for (y=0; y label2) { if (neighbors.find(label1) == neighbors.end()) neighbors[label1] = emptyset; neighbors[label1].insert(label2); } else if (label2 > label1) { if (neighbors.find(label2) == neighbors.end()) neighbors[label2] = emptyset; neighbors[label2].insert(label1); } label2 = src.get(Point(x,y+1)); if (label1 > label2) { if (neighbors.find(label1) == neighbors.end()) neighbors[label1] = emptyset; neighbors[label1].insert(label2); } else if (label2 > label1) { if (neighbors.find(label2) == neighbors.end()) neighbors[label2] = emptyset; neighbors[label2].insert(label1); } if (eight_connectivity) { label2 = src.get(Point(x+1,y+1)); if (label1 > label2) { if (neighbors.find(label1) == neighbors.end()) neighbors[label1] = emptyset; neighbors[label1].insert(label2); } else if (label2 > label1) { if (neighbors.find(label2) == neighbors.end()) neighbors[label2] = emptyset; neighbors[label2].insert(label1); } } } } // check last row for (x=0; x label2) { if (neighbors.find(label1) == neighbors.end()) neighbors[label1] = emptyset; neighbors[label1].insert(label2); } else if (label2 > label1) { if (neighbors.find(label2) == neighbors.end()) neighbors[label2] = emptyset; neighbors[label2].insert(label1); } } // check last column for (y=0; y label2) { if (neighbors.find(label1) == neighbors.end()) neighbors[label1] = emptyset; neighbors[label1].insert(label2); } else if (label2 > label1) { if (neighbors.find(label2) == neighbors.end()) neighbors[label2] = emptyset; neighbors[label2].insert(label1); } } //printf("emptyset.size(): %i\n", emptyset.size()); // copy result over to return value PyObject *retval, *entry, *entry1, *entry2; retval = PyList_New(0); typename map_type::iterator it1; typename set_type::iterator it2; for (it1=neighbors.begin(); it1!=neighbors.end(); it1++) { entry1 = Py_BuildValue("i", (int)it1->first); //printf("Neighbors of %i:", (int)it1->first); for (it2=it1->second.begin(); it2!=it1->second.end(); it2++) { // beware that PyList_SetItem 'steals' a reference, // while PyList_append increases the reference entry = PyList_New(2); Py_INCREF(entry1); PyList_SetItem(entry, 0, entry1); entry2 = Py_BuildValue("i", (int)*it2); //printf(" %i", (int)*it2); PyList_SetItem(entry, 1, entry2); PyList_Append(retval, entry); Py_DECREF(entry); } //printf("\n"); Py_DECREF(entry1); } return retval; } //----------------------------------------------------------------------- // functions for Delaunay triangulation //----------------------------------------------------------------------- void delaunay_from_points_cpp(PointVector *pv, IntVector *lv, std::map > *result) { // some plausi checks if (pv->empty()) { throw std::runtime_error("No points for triangulation given."); } if (pv->size() < 3) { throw std::runtime_error("At least three points are required."); } if (pv->size() != lv->size()) { throw std::runtime_error("Number of points must match the number of labels."); } DelaunayTree dt; PointVector::iterator pv_it; IntVector::iterator lv_it; std::vector vertices; std::vector::iterator it; result->clear(); pv_it = pv->begin(); lv_it = lv->begin(); int x, y; while(pv_it != pv->end() && lv_it != lv->end()) { x = (*pv_it).x(); y = (*pv_it).y(); vertices.push_back(new Vertex(x, y, (*lv_it))); ++pv_it; ++lv_it; } random_shuffle(vertices.begin(), vertices.end()); dt.addVertices(&vertices); dt.neighboringLabels(result); for(it = vertices.begin() ; it != vertices.end() ; ++it) { delete *it; } } PyObject* delaunay_from_points(PointVector *pv, IntVector *lv) { PyObject *list, *entry, *label1, *label2; std::map > neighbors; std::map >::iterator nit1; std::set::iterator nit2; delaunay_from_points_cpp(pv, lv, &neighbors); list = PyList_New(0); for (nit1=neighbors.begin(); nit1!=neighbors.end(); ++nit1) { for (nit2=nit1->second.begin(); nit2!=nit1->second.end(); nit2++) { entry = PyList_New(2); label1 = Py_BuildValue("i", nit1->first); label2 = Py_BuildValue("i", *nit2); PyList_SetItem(entry, 0, label1); PyList_SetItem(entry, 1, label2); PyList_Append(list, entry); Py_DECREF(entry); } } return list; } //----------------------------------------------------------------------- // functions for graph coloring of Cc's with different colors //----------------------------------------------------------------------- typedef std::map LabelCcMap; template Graph *graph_from_ccs(T &image, ImageVector &ccs, int method) { Graph *graph = new Graph(FLAG_UNDIRECTED); graph->make_singly_connected(); PointVector *pv = new PointVector(); IntVector *iv = new IntVector(); ImageVector::iterator iter; if( method == 0 || method == 1 ) { if( method == 0 ) { // method == 0 --> from the CC center points for( iter = ccs.begin(); iter != ccs.end(); iter++) { Cc* cc = static_cast((*iter).first); pv->push_back( cc->center() ); iv->push_back( cc->label() ); } } else if( method == 1) { // method == 1 --> from a 20 percent sample of the contour points for( iter = ccs.begin(); iter != ccs.end(); iter++) { Cc* cc = static_cast((*iter).first); PointVector *cc_pv = contour_samplepoints(*cc, 20); PointVector::iterator point_vec_iter; for( point_vec_iter = cc_pv->begin(); point_vec_iter != cc_pv->end(); point_vec_iter++ ) { pv->push_back(*point_vec_iter); iv->push_back(cc->label()); } delete cc_pv; } } // Build the graph std::map > neighbors; std::map >::iterator nit1; std::set::iterator nit2; delaunay_from_points_cpp(pv, iv, &neighbors); for (nit1=neighbors.begin(); nit1!=neighbors.end(); ++nit1) { for (nit2=nit1->second.begin(); nit2!=nit1->second.end(); nit2++) { GraphDataLong* a_p = new GraphDataLong(nit1->first); GraphDataLong* b_p = new GraphDataLong(*nit2); bool del_a = !graph->add_node(a_p); bool del_b = !graph->add_node(b_p); graph->add_edge(a_p, b_p); if(del_a) delete a_p; if(del_b) delete b_p; } } } else if( method == 2 ) { // method == 2 --> from the exact area Voronoi diagram typedef typename ImageFactory::view_type view_type; Image *voronoi = voronoi_from_labeled_image(image); PyObject *labelpairs = labeled_region_neighbors( *((view_type*) voronoi) ); for (int i = 0; i < PyList_Size(labelpairs); i++) { PyObject *adj_list = PyList_GetItem(labelpairs, i); PyObject *region1 = PyList_GetItem(adj_list, 0); PyObject *region2 = PyList_GetItem(adj_list, 1); GraphDataLong* a_p = new GraphDataLong(PyInt_AsLong(region1)); GraphDataLong* b_p = new GraphDataLong(PyInt_AsLong(region2)); bool del_a = !graph->add_node(a_p); bool del_b = !graph->add_node(b_p); graph->add_edge(a_p, b_p); if(del_a) delete a_p; if(del_b) delete b_p; } delete voronoi->data(); delete voronoi; Py_DECREF(labelpairs); } else { throw std::runtime_error("Unknown method for construction the neighborhood graph"); } delete pv; delete iv; return graph; } template RGBImageView* graph_color_ccs(T &image, ImageVector &ccs, PyObject *colors, int method) { Graph *graph = NULL; std::vector RGBColors; // check input parameters if( ccs.size() == 0 ) { throw std::runtime_error("graph_color_ccs: no CCs given."); } if( !PyList_Check(colors) ) { throw std::runtime_error("graph_color_ccs: colors is no list"); } if( PyList_Size(colors) < 6 ) { throw std::runtime_error("graph_color_ccs: coloring algorithm only works " "with more than five colors"); } // extract the colors for( int i = 0; i < PyList_Size(colors); i++) { PyObject *Py_RGBPixel = PyList_GetItem(colors, i); RGBPixel *RGBPixel = ((RGBPixelObject*) Py_RGBPixel )->m_x; RGBColors.push_back(RGBPixel); } // build the graph from the given ccs graph = graph_from_ccs(image, ccs, method); // volor the graph graph->colorize( PyList_Size(colors) ); // Create the return image // Ccs not passed to the function are set black in the result typedef TypeIdImageFactory RGBViewFactory; RGBViewFactory::image_type *coloredImage = RGBViewFactory::create(image.origin(), image.dim()); int label; for( size_t y = 0; y < image.nrows(); y++) { for( size_t x = 0; x < image.ncols(); x++ ) { label = image.get(Point(x,y)); if( label != 0 ) { try { GraphDataLong d(label); Node* n = graph->get_node(&d); unsigned int c = graph->get_color(n); coloredImage->set(Point(x,y), *RGBColors[c]); } catch( std::runtime_error runtimeError ) { coloredImage->set(Point(x,y), RGBPixel(0,0,0)); } } } } NodePtrIterator* it = graph->get_nodes(); Node* n; while((n = it->next()) != NULL) { delete dynamic_cast(n->_value); } delete it; delete graph; return coloredImage; } //------------------------------------------------------------------ // convex hull computation with Graham's scan algorithm. // See Cormen et al.: Introduction to Algorithms. 2nd ed., p. 949 //------------------------------------------------------------------ inline bool greater_distance(const Point& origin, const Point& p1, const Point& p2) { double dx2 = (double)p2.x() - origin.x(); double dx1 = (double)p1.x() - origin.x(); double dy2 = (double)p2.y() - origin.y(); double dy1 = (double)p1.y() - origin.y(); if (dy1*dy1+dx1*dx1 > dy2*dy2+dx2*dx2) { return true; } return false; } // positive when p0p1 clockwise oriented compared to p0p2 // zero when all points collinear inline double clockwise_orientation(const Point& p0, const Point& p1, const Point& p2) { return ((double)p1.x() - p0.x())*((double)p2.y() - p0.y()) - ((double)p2.x() - p0.x())*((double)p1.y() - p0.y()); } inline double polar_angle(Point center, Point p2) { double dx = double(p2.x()) - center.x(); double dy = double(p2.y()) - center.y(); return atan2(dy, dx); }; // see Cormen et al.: Introduction to Algorithms. // 2nd ed., MIT Press, p. 949, 2001 PointVector* convex_hull_from_points(PointVector *points) { //get leftmost and top point and save it in (*points)[0] size_t min_x = points->at(0).x(); size_t min_y = points->at(0).y(); size_t min_i = 0; size_t i; for(i=0; i < points->size(); i++) { if (points->at(i).x() < min_x) { min_x = points->at(i).x(); min_y = points->at(i).y(); min_i = i; } else if (points->at(i).x() < min_x && points->at(i).y() < min_y) { min_x = points->at(i).x(); min_y = points->at(i).y(); min_i = i; } } std::swap( points->at(0), points->at(min_i)); //sort by polar in polarmap. If more than one point, //remove all but the one farthest from origin Point origin = points->at(0); std::map stack_polarangle; std::map::iterator found; double polarangle; Point p; for(PointVector::iterator it = points->begin()+1; it != points->end();it++) { p = *it; polarangle = polar_angle(origin, p); found = stack_polarangle.find(polarangle); //use nearest if(found == stack_polarangle.end()){ stack_polarangle[polarangle] = p; } else if(greater_distance(origin, p, found->second)) { stack_polarangle[polarangle] = p; } } // start with graham scan PointVector* retVector = new PointVector; std::map::iterator pointIt; pointIt = stack_polarangle.begin(); retVector->push_back(origin); // push point[0] retVector->push_back(pointIt->second); // push point[1] pointIt++; retVector->push_back(pointIt->second); // push point[2] pointIt++; //pointIt starts at point[3] for( ; pointIt != stack_polarangle.end(); pointIt++) { p = pointIt->second; while(retVector->size() > 2 && clockwise_orientation(*(retVector->end()-2),*(retVector->end()-1), p) <= 0.0) { retVector->pop_back(); } retVector->push_back(p); } return retVector; } template PointVector* convex_hull_as_points(const T& src) { PointVector *contour_points = new PointVector(); PointVector::iterator found; FloatVector *left = contour_left(src); FloatVector *right = contour_right(src); FloatVector::iterator it; size_t y; for(it = left->begin(), y=0; it != left->end() ; it++, y++) { if( *it != std::numeric_limits::infinity() ) { contour_points->push_back(Point((int)*it,y)); } } for(it = right->begin(), y=0; it != right->end() ; it++, y++) { if( *it != std::numeric_limits::infinity() ) { contour_points->push_back(Point((int)src.ncols()-*it,y)); } } PointVector *output = convex_hull_from_points(contour_points); delete left; delete right; delete contour_points; return output; } template Image* convex_hull_as_image(const T& src, bool filled) { typedef typename T::value_type value_type; typedef typename ImageFactory::view_type view_type; OneBitImageData* res_data = new OneBitImageData(src.size(),src.origin()); OneBitImageView* res = new OneBitImageView(*res_data,src.origin(),src.size()); PointVector* hullpoints = convex_hull_as_points(src); for (size_t i=1; i< hullpoints->size(); i++) draw_line(*res,hullpoints->at(i-1),hullpoints->at(i),black(*res)); draw_line(*res,hullpoints->back(),hullpoints->front(),black(*res)); delete hullpoints; if (filled) { size_t x,y,from,to; for (y=0; ynrows(); y++) { from = to = res->ncols(); from = 0; while (from < res->ncols() && is_white(res->get(Point(from,y)))) from++; if (from >= res->ncols()-1) continue; to = res->ncols()-1; while (to > 0 && is_white(res->get(Point(to,y)))) to--; for (x=from+1; xset(Point(x,y),black(*res)); } } return res; } // based upon a sample program kindly provided by Daveed Vandevoorde template Rect* max_empty_rect(const T& src) { size_t x,y,open_width,x0; unsigned int w0,area,best_area; std::vector c(src.ncols()+1,0); std::stack s; Point best_ul(0,0); Point best_lr(0,0); best_area = 0; for (y=0; yopen_width) { // open new rectangle? s.push(x); s.push(open_width); open_width = c[x]; } // "else" optional here else if (c[x]best_area) { best_area = area; best_ul = Point(x0, y-open_width+1); best_lr = Point(x-1, y); } open_width = w0; } while (c[x] namespace Gamera { namespace { template struct to_string_impl { template void operator()(const Mat& mat, char* data) { char* i = data; ImageAccessor acc; typename Mat::const_row_iterator row = mat.row_begin(); typename Mat::const_col_iterator col; T tmp; for (; row != mat.row_end(); ++row) { for (col = row.begin(); col != row.end(); ++col) { tmp = acc.get(col); if (tmp > 255) tmp = 255; *(i++) = (char)tmp; *(i++) = (char)tmp; *(i++) = (char)tmp; } } } }; template<> struct to_string_impl { template void operator()(const Mat& mat, char* data) { char* i = data; typename Mat::const_vec_iterator vi = mat.vec_begin(); FloatPixel max = *vi; FloatPixel min = *vi; for (; vi != mat.vec_end(); ++vi) { if (*vi > max) max = *vi; if (*vi < min) min = *vi; } FloatPixel scale = 255.0 / (max - min); vi = mat.vec_begin(); FloatPixel tmp; for (; vi != mat.vec_end(); vi++) { tmp = (*vi + min) * scale; if (tmp > 255) tmp = 255; *(i++) = (char)tmp; *(i++) = (char)tmp; *(i++) = (char)tmp; } } }; template<> struct to_string_impl { template void operator()(const Mat& mat, char* data) { char* i = data; if ((mat.parent().nrows() <= 1) || mat.parent().ncols() <= 1) throw std::range_error("Out of range!"); typename Mat::const_vec_iterator vi = mat.vec_begin(); double max = (*vi).real(); double min = (*vi).real(); for (; vi != mat.vec_end(); ++vi) { if ((*vi).real() > max) max = (*vi).real(); if ((*vi).real() < min) min = (*vi).real(); } double scale = 255.0 / (max - min); vi = mat.vec_begin(); double tmp; for (; vi != mat.vec_end(); ++vi) { tmp = ((*vi).real() - min) * scale; if (tmp > 255.0) tmp = 255.0; *i = (char)floor(tmp); i++; *i = (char)floor(tmp); i++; *i = (char)floor(tmp); i++; } } }; template<> struct to_string_impl { template void operator()(const Mat& mat, char* data) { ImageAccessor acc; typename Mat::const_row_iterator row = mat.row_begin(); typename Mat::const_col_iterator col; char tmp; char* i = data; for (; row != mat.row_end(); ++row) { for (col = row.begin(); col != row.end(); ++col) { /* This should correctly map the 16 bit grey values onto the rgb color space. KWM */ tmp = char(acc.get(col)); *(i++) = tmp; *(i++) = tmp; *(i++) = tmp; } } } }; template<> struct to_string_impl { template void operator()(const Mat& mat, char* data) { ImageAccessor acc; typename Mat::const_row_iterator row = mat.row_begin(); typename Mat::const_col_iterator col; char* i = data; for (; row != mat.row_end(); ++row) { for (col = row.begin(); col != row.end(); ++col) { RGBPixel tmp = acc.get(col); *(i++) = (unsigned char)tmp.red(); *(i++) = (unsigned char)tmp.green(); *(i++) = (unsigned char)tmp.blue(); } } } }; template<> struct to_string_impl { template void operator()(const Mat& mat, char* data) { char* i = data; typename Mat::const_row_iterator row = mat.row_begin(); typename Mat::const_col_iterator col; ImageAccessor acc; unsigned char tmp; for (; row != mat.row_end(); ++row) { for (col = row.begin(); col != row.end(); ++col) { if (is_white(acc(col))) tmp = 255; else tmp = 0; *(i++) = tmp; *(i++) = tmp; *(i++) = tmp; } } } }; }; template PyObject* to_string(T& m) { PyObject* str = PyString_FromStringAndSize(NULL, m.nrows() * m.ncols() * 3); if (!str) throw std::exception(); char* buffer; Py_ssize_t length; int error = PyString_AsStringAndSize(str, &buffer, &length); if (error) { Py_DECREF(str); throw std::exception(); } to_string_impl func; func(m, buffer); return str; } template void to_buffer(T& m, PyObject *py_buffer) { char *buffer; Py_ssize_t buffer_len; PyObject_AsWriteBuffer(py_buffer, (void **)&buffer, &buffer_len); if ((size_t)buffer_len != m.nrows() * m.ncols() * 3 || buffer == NULL) { printf("The image passed to to_buffer is not of the correct size.\n"); return; } to_string_impl func; func(m, buffer); } template Image *color_ccs(T& m, bool ignore_unlabeled) { typedef TypeIdImageFactory RGBViewFactory; RGBViewFactory::image_type* image = RGBViewFactory::create(m.origin(), m.dim()); typename T::vec_iterator src = m.vec_begin(); typename RGBImageView::vec_iterator dst = image->vec_begin(); for (; src != m.vec_end(); ++src, ++dst) { size_t color; if (is_white(*src)) { dst->red(255); dst->green(255); dst->blue(255); } else if (*src == 1 && ignore_unlabeled) { dst->red(0); dst->green(0); dst->blue(0); } else { color = *src & 0x7; const unsigned char* out_color = color_set[color]; dst->red(out_color[0]); dst->green(out_color[1]); dst->blue(out_color[2]); } } return image; } template struct to_buffer_colorize_impl { template void operator()(const T& m, char* buffer, unsigned char red, unsigned char green, unsigned char blue) { size_t r = (size_t)red; size_t g = (size_t)green; size_t b = (size_t)blue; char* i = buffer; typename T::const_row_iterator row = m.row_begin(); typename T::const_col_iterator col; ImageAccessor acc; for (; row != m.row_end(); ++row) { for (col = row.begin(); col != row.end(); ++col) { GreyScalePixel tmp = acc(col); *(i++) = (r * tmp) >> 8; *(i++) = (g * tmp) >> 8; *(i++) = (b * tmp) >> 8; } } } }; template struct to_buffer_colorize_invert_impl { template void operator()(const T& m, char* buffer, unsigned char red, unsigned char green, unsigned char blue) { size_t r = (size_t)red; size_t g = (size_t)green; size_t b = (size_t)blue; char* i = buffer; typename T::const_row_iterator row = m.row_begin(); typename T::const_col_iterator col; ImageAccessor acc; for (; row != m.row_end(); ++row) { for (col = row.begin(); col != row.end(); ++col) { GreyScalePixel tmp = 255 - acc(col); *(i++) = (r * tmp) >> 8; *(i++) = (g * tmp) >> 8; *(i++) = (b * tmp) >> 8; } } } }; template<> struct to_buffer_colorize_impl { template void operator()(const T& m, char* buffer, unsigned char red, unsigned char green, unsigned char blue) { char* i = buffer; typename T::const_row_iterator row = m.row_begin(); typename T::const_col_iterator col; ImageAccessor acc; for (; row != m.row_end(); ++row) { for (col = row.begin(); col != row.end(); ++col) { if (is_white(acc(col))) { *(i++) = red; *(i++) = green; *(i++) = blue; } else { *(i++) = 0; *(i++) = 0; *(i++) = 0; } } } } }; template<> struct to_buffer_colorize_invert_impl { template void operator()(const T& m, char* buffer, unsigned char red, unsigned char green, unsigned char blue) { char* i = buffer; typename T::const_row_iterator row = m.row_begin(); typename T::const_col_iterator col; ImageAccessor acc; for (; row != m.row_end(); ++row) { for (col = row.begin(); col != row.end(); ++col) { if (is_white(acc(col))) { *(i++) = 0; *(i++) = 0; *(i++) = 0; } else { *(i++) = red; *(i++) = green; *(i++) = blue; } } } } }; template void to_buffer_colorize(const T& m, PyObject* py_buffer, int red, int green, int blue, bool invert) { char *buffer; Py_ssize_t buffer_len; PyObject_AsWriteBuffer(py_buffer, (void **)&buffer, &buffer_len); if ((size_t)buffer_len != m.nrows() * m.ncols() * 3 || buffer == NULL) { printf("The image passed to to_buffer is not of the correct size.\n"); return; } unsigned char rc = (unsigned char)red; unsigned char gc = (unsigned char)green; unsigned char bc = (unsigned char)blue; if (invert) { to_buffer_colorize_invert_impl func; func(m, buffer, rc, gc, bc); } else { to_buffer_colorize_impl func; func(m, buffer, rc, gc, bc); } } template void draw_cc(T& m, const U& cc, int red, int green, int blue) { if (cc.intersects(m)) { RGBPixel color((unsigned char)red, (unsigned char)green, (unsigned char)blue); Rect intersection = cc.intersection(m); T sub_m(m, intersection); U sub_cc(cc, intersection); typename T::row_iterator dst_row = sub_m.row_begin(); typename T::col_iterator dst_col; typename U::row_iterator src_row = sub_cc.row_begin(); typename U::col_iterator src_col; ImageAccessor acc; for (; dst_row != sub_m.row_end(); ++dst_row, ++src_row) { for (dst_col = dst_row.begin(), src_col = src_row.begin(); dst_col != dst_row.end(); ++dst_col, ++src_col) { if (is_black(acc(src_col))) { *dst_col = color; } } } } } } #endif gamera-3.3.3/include/plugins/image_conversion.hpp0000644000076500000000000007023211652050140021104 0ustar chriswheel/* * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2011 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm121102_image_conversion #define kwm121102_image_conversion #include "gamera.hpp" #include "image_utilities.hpp" /* IMAGE CONVERSION These are routines to convert from any image type to a greyscale, grey16, float, or rgb image. Conversion to onebit images can be handled by a combination of these routines and one of the thresholding algorithms. Some of these conversion routines are simple and do not lose data (greyscale -> grey16 for example) while others may lose data (rgb -> greyscale). In the cases where data is lost, an effort is made to do something sensible, but it is likely that a specialized application would probably want to provide custom conversion routines. */ namespace Gamera { /* All of the guts of the conversions are contained in small objects in this namespace. The goal is to allow specialization on pixel type without having to use C++ partial specialization (which is broken on many compilers). */ namespace _image_conversion { // create an image of a given pixel type - size is determined by the // image passed in. template struct creator { template static ImageView >* image(const T& image) { typedef ImageData data_type; typedef ImageView view_type; data_type* data = new data_type(image); view_type* view = new view_type(*data); view->resolution(image.resolution()); return view; } }; /* TO RGB */ template struct to_rgb_converter { template RGBImageView* operator()(const T& image) { typename T::value_type max = find_max(image.parent()); double scale; if (max > 0) scale = 255.0 / max; else scale = 0.0; RGBImageView* view = creator::image(image); try { typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename RGBImageView::row_iterator out_row = view->row_begin(); typename RGBImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { GreyScalePixel tmp = GreyScalePixel(in_acc(in_col) * scale); out_acc.set(RGBPixel(tmp, tmp, tmp), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_rgb_converter { template RGBImageView* operator()(const T& image) { RGBImageView* view = creator::image(image); try { typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename RGBImageView::row_iterator out_row = view->row_begin(); typename RGBImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { OneBitPixel tmp = in_acc(in_col); if (is_white(tmp)) out_acc.set(white(*view), out_col); else out_acc.set(black(*view), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_rgb_converter { RGBImageView* operator()(const GreyScaleImageView& image) { RGBImageView* view = creator::image(image); try { GreyScaleImageView::const_row_iterator in_row = image.row_begin(); GreyScaleImageView::const_col_iterator in_col; RGBImageView::row_iterator out_row = view->row_begin(); RGBImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { GreyScalePixel tmp = in_acc(in_col); out_acc.set(RGBPixel(tmp, tmp, tmp), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_rgb_converter { RGBImageView* operator()(const FloatImageView& image) { RGBImageView* view = creator::image(image); try { double maxv = find_max(image.parent()); double minv = find_min(image.parent()); double scale; if (maxv-minv > 0) scale = 255.0 / (maxv-minv); else scale = 0.0; FloatImageView::const_row_iterator in_row = image.row_begin(); FloatImageView::const_col_iterator in_col; RGBImageView::row_iterator out_row = view->row_begin(); RGBImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { GreyScalePixel tmp = GreyScalePixel((in_acc(in_col)-minv) * scale); out_acc.set(RGBPixel(tmp, tmp, tmp), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_rgb_converter { RGBImageView* operator()(const ComplexImageView& image) { ComplexPixel max = find_max(image.parent()); double scale; if (max.real() > 0) scale = 255.0 / max.real(); else scale = 0.0; RGBImageView* view = creator::image(image); try { ComplexImageView::const_row_iterator in_row = image.row_begin(); ComplexImageView::const_col_iterator in_col; RGBImageView::row_iterator out_row = view->row_begin(); RGBImageView::col_iterator out_col; ComplexRealAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { GreyScalePixel tmp = GreyScalePixel(in_acc(in_col) * scale); out_acc.set(RGBPixel(tmp, tmp, tmp), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; /* TO GREYSCALE */ template struct to_greyscale_converter { template GreyScaleImageView* operator()(const T& image) { GreyScaleImageView* view = creator::image(image); try { typename T::value_type max = find_max(image.parent()); double scale; if (max > 0) scale = 255.0 / max; else scale = 0.0; typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename GreyScaleImageView::row_iterator out_row = view->row_begin(); typename GreyScaleImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(GreyScalePixel(in_acc(in_col) * scale), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_greyscale_converter { template GreyScaleImageView* operator()(const T& image) { GreyScaleImageView* view = creator::image(image); try { typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename GreyScaleImageView::row_iterator out_row = view->row_begin(); typename GreyScaleImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { OneBitPixel tmp = in_acc(in_col); if (is_white(tmp)) out_acc.set(white(*view), out_col); else out_acc.set(black(*view), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_greyscale_converter { GreyScaleImageView* operator()(const RGBImageView& image) { GreyScaleImageView* view = creator::image(image); try { RGBImageView::const_row_iterator in_row = image.row_begin(); RGBImageView::const_col_iterator in_col; GreyScaleImageView::row_iterator out_row = view->row_begin(); GreyScaleImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(in_acc(in_col).luminance(), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_greyscale_converter { GreyScaleImageView* operator()(const FloatImageView& image) { GreyScaleImageView* view = creator::image(image); try { double maxv = find_max(image.parent()); double minv = find_min(image.parent()); double scale; if (maxv-minv > 0) scale = 255.0 / (maxv-minv); else scale = 0.0; FloatImageView::const_row_iterator in_row = image.row_begin(); FloatImageView::const_col_iterator in_col; GreyScaleImageView::row_iterator out_row = view->row_begin(); GreyScaleImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(GreyScalePixel((in_acc(in_col)-minv) * scale), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_greyscale_converter { GreyScaleImageView* operator()(const ComplexImageView& image) { GreyScaleImageView* view = creator::image(image); try { ComplexPixel max = find_max(image.parent()); double scale; if (max.real() > 0) scale = 255.0 / max.real(); else scale = 0.0; ComplexImageView::const_row_iterator in_row = image.row_begin(); ComplexImageView::const_col_iterator in_col; GreyScaleImageView::row_iterator out_row = view->row_begin(); GreyScaleImageView::col_iterator out_col; ComplexRealAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(GreyScalePixel(in_acc(in_col) * scale), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; /* Grey16 */ template struct to_grey16_converter { template Grey16ImageView* operator()(const T& image) { Grey16ImageView* view = creator::image(image); try { typename T::value_type max = find_max(image.parent()); double scale; if (max > 0) scale = 65535.0 / max; else scale = 0.0; typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename Grey16ImageView::row_iterator out_row = view->row_begin(); typename Grey16ImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(Grey16Pixel(in_acc(in_col) * scale), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_grey16_converter { Grey16ImageView* operator()(const RGBImageView& image) { Grey16ImageView* view = creator::image(image); try { RGBImageView::const_row_iterator in_row = image.row_begin(); RGBImageView::const_col_iterator in_col; Grey16ImageView::row_iterator out_row = view->row_begin(); Grey16ImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(in_acc(in_col).luminance(), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_grey16_converter { template Grey16ImageView* operator()(const T& image) { Grey16ImageView* view = creator::image(image); try { typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename Grey16ImageView::row_iterator out_row = view->row_begin(); typename Grey16ImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { OneBitPixel tmp = in_acc(in_col); if (is_white(tmp)) out_acc.set(white(*view), out_col); else out_acc.set(black(*view), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_grey16_converter { Grey16ImageView* operator()(const GreyScaleImageView& image) { Grey16ImageView* view = creator::image(image); try { GreyScaleImageView::const_row_iterator in_row = image.row_begin(); GreyScaleImageView::const_col_iterator in_col; Grey16ImageView::row_iterator out_row = view->row_begin(); Grey16ImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { GreyScalePixel tmp = in_acc(in_col); out_acc.set(tmp, out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_grey16_converter { Grey16ImageView* operator()(const FloatImageView& image) { Grey16ImageView* view = creator::image(image); try { double maxv = find_max(image.parent()); double minv = find_min(image.parent()); double scale; if (maxv-minv > 0) scale = 65535.0 / (maxv-minv); else scale = 0.0; FloatImageView::const_row_iterator in_row = image.row_begin(); FloatImageView::const_col_iterator in_col; Grey16ImageView::row_iterator out_row = view->row_begin(); Grey16ImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(Grey16Pixel((in_acc(in_col)-minv) * scale), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_grey16_converter { Grey16ImageView* operator()(const ComplexImageView& image) { Grey16ImageView* view = creator::image(image); try { ComplexPixel max = find_max(image.parent()); double scale; if (max.real() > 0) scale = 255.0 / max.real(); else scale = 0.0; ComplexImageView::const_row_iterator in_row = image.row_begin(); ComplexImageView::const_col_iterator in_col; Grey16ImageView::row_iterator out_row = view->row_begin(); Grey16ImageView::col_iterator out_col; ComplexRealAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(Grey16Pixel(in_acc(in_col) * scale), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; /* Float */ template struct to_float_converter { template FloatImageView* operator()(const T& image) { FloatImageView* view = creator::image(image); try { typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename FloatImageView::row_iterator out_row = view->row_begin(); typename FloatImageView::col_iterator out_col; typedef typename choose_accessor::real_accessor Accessor; Accessor in_acc = Accessor(in_acc); ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(FloatPixel(in_acc(in_col)), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_float_converter { FloatImageView* operator()(const RGBImageView& image) { FloatImageView* view = creator::image(image); try { RGBImageView::const_row_iterator in_row = image.row_begin(); RGBImageView::const_col_iterator in_col; FloatImageView::row_iterator out_row = view->row_begin(); FloatImageView::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(FloatPixel(in_acc.get(in_col).luminance()), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_float_converter { template FloatImageView* operator()(const T& image) { FloatImageView* view = creator::image(image); try { FloatImageView::row_iterator out_row = view->row_begin(); FloatImageView::col_iterator out_col; typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { OneBitPixel tmp = in_acc.get(in_col); if (is_white(tmp)) out_acc.set(FloatPixel(1.0), out_col); else out_acc.set(FloatPixel(0.0), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; /* Complex */ template struct to_complex_converter { template ComplexImageView* operator()(const T& image) { ComplexImageView* view = creator::image(image); try { typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename ComplexImageView::row_iterator out_row = view->row_begin(); typename ComplexImageView::col_iterator out_col; typedef typename choose_accessor::real_accessor InAccessor; InAccessor in_acc = choose_accessor::make_real_accessor(image); typedef typename choose_accessor::real_accessor OutAccessor; OutAccessor out_acc = choose_accessor::make_real_accessor(*view); for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(in_acc(in_col), out_col); } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; template<> struct to_complex_converter { template ComplexImageView* operator()(const T& image) { ComplexImageView* view = creator::image(image); try { ComplexImageView::row_iterator out_row = view->row_begin(); ComplexImageView::col_iterator out_col; typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; ImageAccessor in_acc; ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { OneBitPixel tmp = in_acc.get(in_col); if (is_white(tmp)) { out_acc.set(ComplexPixel(1.0, 0.0), out_col); } else { out_acc.set(ComplexPixel(0.0, 0.0), out_col); } } } } catch (std::exception e) { delete view->data(); delete view; throw; } return view; } }; } template RGBImageView* to_rgb(const T& image) { _image_conversion::to_rgb_converter conv; return conv(image); } template GreyScaleImageView* to_greyscale(const T& image) { _image_conversion::to_greyscale_converter conv; return conv(image); } template Grey16ImageView* to_grey16(const T& image) { _image_conversion::to_grey16_converter conv; return conv(image); } template FloatImageView* to_float(const T& image) { _image_conversion::to_float_converter conv; return conv(image); } template ComplexImageView* to_complex(const T& image) { _image_conversion::to_complex_converter conv; return conv(image); } template FloatImageView* extract_real(const T& image) { FloatImageData* data = new FloatImageData(image.size(), image.origin()); FloatImageView* view = new FloatImageView(*data, image); try { typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename FloatImageView::row_iterator out_row = view->row_begin(); typename FloatImageView::col_iterator out_col; typedef typename choose_accessor::accessor Accessor; Accessor in_acc = Accessor(in_acc); ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(FloatPixel(in_acc(in_col).real()), out_col); } } } catch (std::exception e) { delete view; delete data; throw; } return view; } template FloatImageView* extract_imaginary(const T& image) { FloatImageData* data = new FloatImageData(image.size(), image.origin()); FloatImageView* view = new FloatImageView(*data, image); try { typename T::const_row_iterator in_row = image.row_begin(); typename T::const_col_iterator in_col; typename FloatImageView::row_iterator out_row = view->row_begin(); typename FloatImageView::col_iterator out_col; typedef typename choose_accessor::accessor Accessor; Accessor in_acc = Accessor(in_acc); ImageAccessor out_acc; for (; in_row != image.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { out_acc.set(FloatPixel(in_acc(in_col).imag()), out_col); } } } catch (std::exception e) { delete view; delete data; throw; } return view; } } #endif gamera-3.3.3/include/plugins/image_utilities.hpp0000644000076500000000000007171111747510564020755 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Christoph Dalitz, Hasan Yildiz, Tobias Bolten * 2011 Christian Brandt * 2012 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm12032001_image_utilities #define kwm12032001_image_utilities #include "gamera.hpp" #include "gameramodule.hpp" #include "gamera_limits.hpp" #include "vigra/resizeimage.hxx" #include "vigra/basicgeometry.hxx" #include "plugins/logical.hpp" #include #include #include #include // for compatibility: resize, scale, mirror, and shear // were formerly implemented in image_utilitis instead of transformation #include "transformation.hpp" namespace Gamera { /* This copies all of the misc attributes of an image (like label for Ccs or scaling). */ template void image_copy_attributes(const T& src, U& dest) { dest.scaling(src.scaling()); dest.resolution(src.resolution()); } /* These are full specializations for ConnectedComponents. This could be done with partial specialization, but that is broken on so many compilers it is easier just to do it manually :/ */ template<> void image_copy_attributes(const Cc& src, Cc& dest) { dest.scaling(src.scaling()); dest.resolution(src.resolution()); dest.label(src.label()); } template<> void image_copy_attributes(const RleCc& src, Cc& dest) { dest.scaling(src.scaling()); dest.resolution(src.resolution()); dest.label(src.label()); } template<> void image_copy_attributes(const Cc& src, RleCc& dest) { dest.scaling(src.scaling()); dest.resolution(src.resolution()); dest.label(src.label()); } template<> void image_copy_attributes(const RleCc& src, RleCc& dest) { dest.scaling(src.scaling()); dest.resolution(src.resolution()); dest.label(src.label()); } /* image_copy_fill This function copies the contents from one image to another of the same size. Presumably the pixel types of the two images are the same, but a cast is performed allowing any two pixels types with the approprate conversion functions defined (or built-in types) to be copied. The storage formats of the image do not need to match. */ template void image_copy_fill(const T& src, U& dest) { if ((src.nrows() != dest.nrows()) | (src.ncols() != dest.ncols())) throw std::range_error("image_copy_fill: src and dest image dimensions must match!"); typename T::const_row_iterator src_row = src.row_begin(); typename T::const_col_iterator src_col; typename U::row_iterator dest_row = dest.row_begin(); typename U::col_iterator dest_col; ImageAccessor src_acc; ImageAccessor dest_acc; for (; src_row != src.row_end(); ++src_row, ++dest_row) for (src_col = src_row.begin(), dest_col = dest_row.begin(); src_col != src_row.end(); ++src_col, ++dest_col) dest_acc.set((typename U::value_type)src_acc.get(src_col), dest_col); image_copy_attributes(src, dest); } /* simple_image_copy This functions creates a new image of the same pixel type and storage format as the source image. If the image is a ConnectedComponent a OneBitImageView is returned rather that a ConnectedComponent (which is why the ImageFactory is used). */ template typename ImageFactory::view_type* simple_image_copy(const T& src) { typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(src.size(), src.origin()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data, src.origin(), src.size()); try { image_copy_fill(src, *dest); } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } /* image_copy This function creates a new image with the specified storage_format and copies the contents from the provided image. If the image is a ConnectedComponent a OneBit*ImageView is returned rather that a ConnectedComponent (which is why the ImageFactory is used). */ template Image* image_copy(T &a, int storage_format) { if (a.ul_x() > a.lr_x() || a.ul_y() > a.lr_y()) throw std::exception(); if (storage_format == DENSE) { typename ImageFactory::dense_data_type* data = new typename ImageFactory::dense_data_type(a.size(), a.origin()); typename ImageFactory::dense_view_type* view = new typename ImageFactory::dense_view_type(*data, a.origin(), a.size()); try { image_copy_fill(a, *view); } catch (std::exception e) { delete view; delete data; throw; } return view; } else { typename ImageFactory::rle_data_type* data = new typename ImageFactory::rle_data_type(a.size(), a.origin()); typename ImageFactory::rle_view_type* view = new typename ImageFactory::rle_view_type(*data, a.origin(), a.size()); try { image_copy_fill(a, *view); } catch (std::exception e) { delete view; delete data; throw; } return view; } } /* union_images This function creates a new image that is the summation of all of the images in the passed-in list. */ template void _union_image(T& a, const U& b) { size_t ul_y = std::max(a.ul_y(), b.ul_y()); size_t ul_x = std::max(a.ul_x(), b.ul_x()); size_t lr_y = std::min(a.lr_y(), b.lr_y()); size_t lr_x = std::min(a.lr_x(), b.lr_x()); if (ul_y >= lr_y || ul_x >= lr_x) return; for (size_t y = ul_y, ya = y-a.ul_y(), yb=y-b.ul_y(); y <= lr_y; ++y, ++ya, ++yb) for (size_t x = ul_x, xa = x-a.ul_x(), xb=x-b.ul_x(); x <= lr_x; ++x, ++xa, ++xb) { if (is_black(a.get(Point(xa, ya))) || is_black(b.get(Point(xb, yb)))) { a.set(Point(xa, ya), black(a)); } else a.set(Point(xa, ya), white(a)); } } Image *union_images(ImageVector &list_of_images) { size_t min_x, min_y, max_x, max_y; min_x = min_y = std::numeric_limits::max(); max_x = max_y = 0; // Determine bounding box for (ImageVector::iterator i = list_of_images.begin(); i != list_of_images.end(); ++i) { Image* image = (*i).first; min_x = std::min(min_x, image->ul_x()); min_y = std::min(min_y, image->ul_y()); max_x = std::max(max_x, image->lr_x()); max_y = std::max(max_y, image->lr_y()); } size_t ncols = max_x - min_x + 1; size_t nrows = max_y - min_y + 1; OneBitImageData *dest_data = new OneBitImageData(Dim(ncols, nrows), Point(min_x, min_y)); OneBitImageView *dest = new OneBitImageView(*dest_data); // std::fill(dest->vec_begin(), dest->vec_end(), white(*dest)); try { for (ImageVector::iterator i = list_of_images.begin(); i != list_of_images.end(); ++i) { Image* image = (*i).first; switch((*i).second) { case ONEBITIMAGEVIEW: _union_image(*dest, *((OneBitImageView*)image)); break; case CC: _union_image(*dest, *((Cc*)image)); break; case ONEBITRLEIMAGEVIEW: _union_image(*dest, *((OneBitRleImageView*)image)); break; case RLECC: _union_image(*dest, *((RleCc*)image)); break; default: throw std::runtime_error ("There is an Image in the list that is not a OneBit image."); } } } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } /* FloatVector histogram(GreyScale|Grey16 image); Histogram returns a histogram of the values in an image. The values in the histogram are percentages. */ template FloatVector* histogram(const T& image) { // The histogram is the size of all of the possible values of // the pixel type. size_t l = std::numeric_limits::max() + 1; FloatVector* values = new FloatVector(l); try { // set the list to 0 std::fill(values->begin(), values->end(), 0); typename T::const_row_iterator row = image.row_begin(); typename T::const_col_iterator col; ImageAccessor acc; // create the histogram for (; row != image.row_end(); ++row) for (col = row.begin(); col != row.end(); ++col) (*values)[acc.get(col)]++; // convert from absolute values to percentages double size = image.nrows() * image.ncols(); for (size_t i = 0; i < l; i++) { (*values)[i] = (*values)[i] / size; } } catch (std::exception e) { delete values; throw; } return values; } /* Find the maximum and minimum pixel value for an image */ // TODO: Test this template void _my_max(const T& a, T& b) { if (a > b) b = a; } template<> void _my_max(const ComplexPixel& a, ComplexPixel& b) { if (a.real() > b.real()) b = a; } template typename T::value_type find_max(const T& image) { if (image.nrows() <= 1 || image.ncols() <= 1) throw std::range_error("Image must have nrows and ncols > 0."); typename T::const_vec_iterator max = image.vec_begin(); typename T::value_type value = NumericTraits::min(); for (; max != image.vec_end(); ++max) _my_max(*max, value); return value; } template void _my_min(const T& a, T& b) { if (b > a) b = a; } template<> void _my_min(const ComplexPixel& a, ComplexPixel& b) { if (a.real() > b.real()) b = a; } template typename T::value_type find_min(const T& image) { if (image.nrows() <= 1 || image.ncols() <= 1) throw std::range_error("Image must have nrows and ncols > 0."); typename T::const_vec_iterator min = image.vec_begin(); typename T::value_type value = NumericTraits::max(); for (; min != image.vec_end(); ++min) _my_min(*min, value); return value; } /* Fill an image with white. */ template void fill_white(T& image) { std::fill(image.vec_begin(), image.vec_end(), white(image)); } /* Fill an image with any color */ template void fill(T& m, typename T::value_type color) { typename T:: vec_iterator destcolor = m.vec_begin(); for(; destcolor != m.vec_end(); destcolor++) *destcolor = color; } /* Pad an image with the default value */ template typename ImageFactory::view_type* pad_image_default(const T &src, size_t top, size_t right, size_t bottom, size_t left) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* dest_data = new data_type (Dim(src.ncols() + right + left, src.nrows() + top + bottom), src.origin()); view_type* dest_srcpart = new view_type (*dest_data, Point(src.ul_x() + left, src.ul_y() + top), src.dim()); view_type* dest = new view_type(*dest_data); try { image_copy_fill(src, *dest_srcpart); } catch (std::exception e) { delete dest; delete dest_srcpart; delete dest_data; throw; } delete dest_srcpart; return(dest); } /* Pad an image with any color */ template typename ImageFactory::view_type* pad_image(const T &src, size_t top, size_t right, size_t bottom, size_t left, typename T::value_type value) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* dest_data = new data_type (Dim(src.ncols()+right+left, src.nrows()+top+bottom), src.origin()); view_type* top_pad = NULL; if (top > 0) top_pad = new view_type (*dest_data, Point(src.ul_x() + left, src.ul_y()), Dim(src.ncols() + right, top)); view_type* right_pad = NULL; if (right > 0) right_pad = new view_type (*dest_data, Point(src.ul_x()+src.ncols()+left, src.ul_y()+top), Dim(right, src.nrows()+bottom)); view_type* bottom_pad = NULL; if (bottom > 0) bottom_pad = new view_type (*dest_data, Point(src.ul_x(), src.ul_y()+src.nrows()+top), Dim(src.ncols()+left, bottom)); view_type* left_pad = NULL; if (left > 0) left_pad = new view_type (*dest_data, src.origin(), Dim(left, src.nrows()+top)); view_type* dest_srcpart = new view_type (*dest_data, Point(src.offset_x()+left, src.offset_y()+top), src.dim()); view_type* dest = new view_type(*dest_data); try { if (top_pad) fill(*top_pad, value); if (right_pad) fill(*right_pad, value); if (bottom_pad) fill(*bottom_pad, value); if (left_pad) fill(*left_pad, value); image_copy_fill(src, *dest_srcpart); } catch (std::exception e) { if (top_pad) delete top_pad; if (right_pad) delete right_pad; if (bottom_pad) delete bottom_pad; if (left_pad) delete left_pad; delete dest_srcpart; delete dest; delete dest_data; } if (top_pad) delete top_pad; if (right_pad) delete right_pad; if (bottom_pad) delete bottom_pad; if (left_pad) delete left_pad; delete dest_srcpart; return(dest); } /* Trim white (or other) borders */ template Image * trim_image(const T &image, const typename T::value_type pixelValue) { typedef typename T::value_type value_type; typedef typename ImageFactory::view_type view_type; view_type *res; unsigned int min_x, max_x; unsigned int min_y, max_y; min_x = image.ncols() - 1; min_y = image.nrows() - 1; max_x = max_y = 0; // Search upper left and lower right coordinates for the bounding box // of the view for(size_t y = 0; y < image.nrows(); ++y) { for(size_t x = 0; x < image.ncols(); ++x) { if( image.get(Point(x,y)) != pixelValue ) { if( x < min_x ) min_x = x; if( x > max_x ) max_x = x; if( y < min_y ) min_y = y; if( y > max_y ) max_y = y; } } } // When no points found, set the view to the complete image if( min_x > max_x ) { min_x = 0; max_x = image.ncols() - 1; } if( min_y > max_y ) { min_y = 0; max_y = image.nrows() - 1; } // Creates points for the new view // Don't forget the offset of the image (this can be already a view) // --> Offsets have to be added Point ul(min_x + image.offset_x(), min_y + image.offset_y()); Point lr(max_x + image.offset_x(), max_y + image.offset_y()); // Create the view and return it res = new view_type(*image.data(), ul, lr); return res; } template void invert(T& image) { ImageAccessor acc; typename T::vec_iterator in = image.vec_begin(); for (; in != image.vec_end(); ++in) acc.set(invert(acc(in)), in); } template Image *clip_image(T& m, const Rect* rect) { if (m.intersects(*rect)) { size_t ul_y = std::max(m.ul_y(), rect->ul_y()); size_t ul_x = std::max(m.ul_x(), rect->ul_x()); size_t lr_y = std::min(m.lr_y(), rect->lr_y()); size_t lr_x = std::min(m.lr_x(), rect->lr_x()); return new T(m, Point(ul_x, ul_y), Dim(lr_x - ul_x + 1, lr_y - ul_y + 1)); } else { return new T(m, Point(m.ul_x(), m.ul_y()), Dim(1, 1)); }; } template typename ImageFactory::view_type* mask(const T& a, U &b) { if (a.nrows() != b.nrows() || a.ncols() != b.ncols()) throw std::runtime_error("The image and the mask image must be the same size."); typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(b.size(), b.origin()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data); typename ImageFactory::view_type a_view = typename ImageFactory::view_type(a, b.ul(), b.size()); ImageAccessor a_accessor; ImageAccessor b_accessor; typename T::vec_iterator it_a, end; typename U::vec_iterator it_b; typename T::vec_iterator it_dest; try { for (it_a = a_view.vec_begin(), end = a_view.vec_end(), it_b = b.vec_begin(), it_dest = dest->vec_begin(); it_a != end; ++it_a, ++it_b, ++it_dest) { if (is_black(b_accessor.get(it_b))) a_accessor.set(a_accessor.get(it_a), it_dest); else a_accessor.set(white(*dest), it_dest); } } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } template struct _nested_list_to_image { ImageView >* operator()(PyObject* obj) { ImageData* data = NULL; ImageView >* image = NULL; PyObject* seq = PySequence_Fast(obj, "Argument must be a nested Python iterable of pixels."); if (seq == NULL) throw std::runtime_error("Argument must be a nested Python iterable of pixels."); int nrows = PySequence_Fast_GET_SIZE(seq); if (nrows == 0) { Py_DECREF(seq); throw std::runtime_error("Nested list must have at least one row."); } int ncols = -1; try { for (size_t r = 0; r < (size_t)nrows; ++r) { PyObject* row = PyList_GET_ITEM(obj, r); PyObject* row_seq = PySequence_Fast(row, ""); if (row_seq == NULL) { pixel_from_python::convert(row); row_seq = seq; Py_INCREF(row_seq); nrows = 1; } int this_ncols = PySequence_Fast_GET_SIZE(row_seq); if (ncols == -1) { ncols = this_ncols; if (ncols == 0) { Py_DECREF(seq); Py_DECREF(row_seq); throw std::runtime_error ("The rows must be at least one column wide."); } data = new ImageData(Dim(ncols, nrows)); image = new ImageView >(*data); } else { if (ncols != this_ncols) { delete image; delete data; Py_DECREF(row_seq); Py_DECREF(seq); throw std::runtime_error ("Each row of the nested list must be the same length."); } } for (size_t c = 0; c < (size_t)ncols; ++c) { PyObject* item = PySequence_Fast_GET_ITEM(row_seq, c); T px = pixel_from_python::convert(item); image->set(Point(c, r), px); } Py_DECREF(row_seq); } Py_DECREF(seq); } catch (std::exception e) { if (image) delete image; if (data) delete data; throw; } return image; } }; Image* nested_list_to_image(PyObject* obj, int pixel_type) { // If pixel_type == -1, attempt to do an auto-detect. if (pixel_type < 0) { PyObject* seq = PySequence_Fast(obj, "Must be a nested Python iterable of pixels."); if (seq == NULL) throw std::runtime_error("Must be a nested Python list of pixels."); if (PySequence_Fast_GET_SIZE(seq) == 0) { Py_DECREF(seq); throw std::runtime_error("Nested list must have at least one row."); } PyObject* row = PySequence_Fast_GET_ITEM(seq, 0); PyObject* pixel; PyObject* row_seq = PySequence_Fast(row, ""); if (row_seq == NULL) { pixel = row; } else { if (PySequence_Fast_GET_SIZE(row_seq) == 0) { Py_DECREF(seq); Py_DECREF(row_seq); throw std::runtime_error("The rows must be at least one column wide."); } pixel = PySequence_Fast_GET_ITEM(row_seq, 0); } Py_DECREF(seq); Py_DECREF(row_seq); if (PyInt_Check(pixel)) pixel_type = GREYSCALE; else if (PyFloat_Check(pixel)) pixel_type = FLOAT; else if (is_RGBPixelObject(pixel)) pixel_type = RGB; if (pixel_type < 0) throw std::runtime_error ("The image type could not automatically be determined from the list. Please specify an image type using the second argument."); } switch (pixel_type) { case ONEBIT: _nested_list_to_image func1; return (Image*)func1(obj); case GREYSCALE: _nested_list_to_image func2; return (Image*)func2(obj); case GREY16: _nested_list_to_image func3; return (Image*)func3(obj); case RGB: _nested_list_to_image func4; return (Image*)func4(obj); case Gamera::FLOAT: _nested_list_to_image func5; return (Image*)func5(obj); default: throw std::runtime_error("Second argument is not a valid image type number."); } } template PyObject* to_nested_list(T& m) { PyObject* rows = PyList_New(m.nrows()); for (size_t r = 0; r < m.nrows(); ++r) { PyObject* row = PyList_New(m.ncols()); for (size_t c = 0; c < m.ncols(); ++c) { PyObject* px = pixel_to_python(m.get(Point(c, r))); PyList_SET_ITEM(row, c, px); } PyList_SET_ITEM(rows, r, row); } return rows; } template double mse(T& a, T& b) { if (a.size() != b.size()) throw std::runtime_error("Both images must be the same size."); typename T::vec_iterator it_a, it_b; double error = 0; for (it_a = a.vec_begin(), it_b = b.vec_begin(); it_a != a.vec_end(); ++it_a, ++it_b) { double rdiff = (double)it_a->red() - it_b->red(); double bdiff = (double)it_a->blue() - it_b->blue(); double gdiff = (double)it_a->green() - it_b->green(); error += rdiff*rdiff + bdiff*bdiff + gdiff*gdiff; } return (error / (a.nrows() * a.ncols())) / 3.0; } template void reset_onebit_image(T &image) { typename T::vec_iterator i; for (i = image.vec_begin(); i != image.vec_end(); ++i) { if (i.get() > 0) i.set(1); } } /* * compute Cc's from an already labeled image * Christoph Dalitz and Hasan Yildiz */ template ImageList* ccs_from_labeled_image(T &src) { typedef typename T::value_type value_type; value_type value; ImageList* return_ccs = new ImageList(); std::map pixel; std::map::iterator iter; for (size_t y=0; y < src.nrows(); ++y) { for (size_t x=0; x < src.ncols(); ++x) { if (!is_white(src.get(Point(x,y)))) { value = src.get(Point(x,y)); // when new label: create Rect for new Cc if (pixel.find(value) == pixel.end()) { pixel[value] = new Rect(Point(x, y), Point(x, y)); } // update Rect bounding box when known label else { iter = pixel.find(value); if (y < (*iter).second->ul_y()) (*iter).second->ul_y(y); if (x < (*iter).second->ul_x()) (*iter).second->ul_x(x); if (y > (*iter).second->lr_y()) (*iter).second->lr_y(y); if (x > (*iter).second->lr_x()) (*iter).second->lr_x(x); } } } } // create Cc's for all labels for (iter = pixel.begin(); iter != pixel.end(); iter++) { return_ccs->push_back(new ConnectedComponent( *src.data(), // data (*iter).first, // label Point((*iter).second->ul_x(), (*iter).second->ul_y()), // upper left Point((*iter).second->lr_x(), (*iter).second->lr_y()) // lower right )); delete iter->second; iter->second = 0; } return return_ccs; } /* * find minimum and maximum location and value of maximum within mask * Only black points in the mask are evaluated in image */ template PyObject* min_max_location(const T& image, const U& mask){ typedef typename T::value_type value_type; int max_x, max_y, min_x, min_y; size_t x,y; value_type max_val, min_val, test_val; // find maximum max_x = max_y = min_x = min_y = -1; max_val = black(image); // lowest possible value min_val = white(image); // highest possible value for (y = 0; y < mask.nrows(); y++) { for (x = 0; x < mask.ncols(); x++) { if (is_black(mask.get(Point(x,y)))) { test_val = image.get(Point(mask.offset_x()+x,mask.offset_y()+y)); if (test_val >= max_val) { max_val = test_val; max_x = mask.offset_x()+x; max_y = mask.offset_y()+y; } if (test_val <= min_val) { min_val = test_val; min_x = mask.offset_x()+x; min_y = mask.offset_y()+y; } } } } if (max_x < 0) throw std::runtime_error("min_max_location: mask has no black pixel"); return Py_BuildValue("NiNi", create_PointObject(Point(min_x,min_y)), min_val, create_PointObject(Point(max_x,max_y)), max_val); } // specialization for FloatImage template PyObject* min_max_location(const FloatImageView& image, const U& mask){ int max_x, max_y, min_x, min_y; size_t x,y; FloatPixel max_val, min_val, test_val; // find maximum max_x = max_y = min_x = min_y = -1; max_val = std::numeric_limits::min(); min_val = std::numeric_limits::max(); for (y = 0; y < mask.nrows(); y++) { for (x = 0; x < mask.ncols(); x++) { if (is_black(mask.get(Point(x,y)))) { test_val = image.get(Point(mask.offset_x()+x,mask.offset_y()+y)); if (test_val >= max_val) { max_val = test_val; max_x = mask.offset_x()+x; max_y = mask.offset_y()+y; } if (test_val <= min_val) { min_val = test_val; min_x = mask.offset_x()+x; min_y = mask.offset_y()+y; } } } } if (max_x < 0) throw std::runtime_error("min_max_location: mask has no black pixel"); return Py_BuildValue("NfNf", create_PointObject(Point(min_x,min_y)), min_val, create_PointObject(Point(max_x,max_y)), max_val); } template PyObject* min_max_location_nomask(const T& image) { typedef typename T::value_type value_type; int max_x, max_y, min_x, min_y; size_t x,y; value_type max_val, min_val, test_val; // find maximum max_x = max_y = min_x = min_y = 0; max_val = black(image); // lowest possible value min_val = white(image); // highest possible value for (y = 0; y < image.nrows(); y++) { for (x = 0; x < image.ncols(); x++) { test_val = image.get(Point(x,y)); if (test_val >= max_val) { max_val = test_val; max_x = x; max_y = y; } if (test_val <= min_val) { min_val = test_val; min_x = x; min_y = y; } } } return Py_BuildValue("NiNi", create_PointObject(Point(min_x,min_y)), min_val, create_PointObject(Point(max_x,max_y)), max_val); } // specialization for FloatImage template PyObject* min_max_location_nomask(const FloatImageView& image, const U& mask){ int max_x, max_y, min_x, min_y; size_t x,y; FloatPixel max_val, min_val, test_val; // find maximum max_x = max_y = min_x = min_y = 0; max_val = std::numeric_limits::min(); min_val = std::numeric_limits::max(); for (y = 0; y < image.nrows(); y++) { for (x = 0; x < image.ncols(); x++) { test_val = image.get(Point(x,y)); if (test_val >= max_val) { max_val = test_val; max_x = x; max_y = y; } if (test_val <= min_val) { min_val = test_val; min_x = x; min_y = y; } } } return Py_BuildValue("NfNf", create_PointObject(Point(min_x,min_y)), min_val, create_PointObject(Point(max_x,max_y)), max_val); } } #endif gamera-3.3.3/include/plugins/listutilities.hpp0000644000076500000000000001227311652050140020465 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * 2009 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd04302003_listutilities #define mgd04302003_listutilities #include #include "gameramodule.hpp" #include "canonicpyobject.hpp" #include #include namespace Gamera { // linear time median implementation for vectors of arithmetic objects template T median(std::vector* v, bool inlist=false) { T m; size_t n = v->size(); std::nth_element(v->begin(), v->begin() + n/2, v->end()); m = *(v->begin() + n/2); if (!inlist && (0 == n % 2)) { std::nth_element(v->begin(), v->begin() + n/2 - 1, v->end()); m = (m + *(v->begin()+n/2-1)) / 2; } return m; } // specialized median implementation for arbitrary Python lists PyObject* median_py(PyObject* list, bool inlist=false) { size_t n,i; PyObject *entry, *retval; if(!PyList_Check(list)) throw std::runtime_error("median: Input argument is no list."); n = PyList_Size(list); if (0 == n) throw std::runtime_error("median: Input list must not be empty."); // distinction based on content type entry = PyList_GetItem(list,0); if (PyFloat_Check(entry)) { FloatVector* v = FloatVector_from_python(list); if (!v) throw std::runtime_error("median: Cannot convert list to float type. Is the list inhomogeneous?"); double m = median(v, inlist); delete v; return Py_BuildValue("f",m); } else if (PyInt_Check(entry)) { IntVector* v = IntVector_from_python(list); if (!v) throw std::runtime_error("median: Cannot convert list to int type. Is the list inhomogeneous?"); int m = median(v, inlist); delete v; return Py_BuildValue("i",m); } else { // for arbitrary Python lists, we need a wrapper class to // make it passable to a C++ vector<> std::vector* v = new std::vector; PyTypeObject* type = entry->ob_type; for(i=0;ipush_back(canonicPyObject(entry)); } std::nth_element(v->begin(), v->begin() + n/2, v->end()); retval = (v->begin() + n/2)->value; delete v; Py_INCREF(retval); return retval; } } int permute_list(PyObject* list) { if (!PyList_Check(list)) { PyErr_Format(PyExc_TypeError, "Python list required."); return 0; } size_t n = PyList_Size(list); size_t j = 1; while (j < n && PyObject_Compare(PyList_GET_ITEM(list, j - 1), PyList_GET_ITEM(list, j)) > -1) ++j; if (j >= n) return 0; size_t l = 0; PyObject* tmp = PyList_GET_ITEM(list, j); while (PyObject_Compare(PyList_GET_ITEM(list, l), tmp) > -1) ++l; PyList_SET_ITEM(list, j, PyList_GET_ITEM(list, l)); PyList_SET_ITEM(list, l, tmp); size_t k = 0; l = j - 1; while (k < l) { tmp = PyList_GET_ITEM(list, k); PyList_SET_ITEM(list, k, PyList_GET_ITEM(list, l)); PyList_SET_ITEM(list, l, tmp); ++k; --l; } return 1; } PyObject* all_subsets(PyObject* a_input, int k) { // special treatment for k=0: only one set (the empty set) if (k==0) { PyObject* result = PyList_New(1); PyList_SetItem(result, 0, PyList_New(0)); return result; } PyObject* a = PySequence_Fast(a_input, "First argument must be iterable"); if (a == NULL) return 0; int n = PySequence_Fast_GET_SIZE(a); if (k < 0 || k > n) { Py_DECREF(a); throw std::runtime_error("k must be between 0 and len(a)"); } PyObject* result = PyList_New(0); std::vector indices(k); bool start = true; int m2 = 0; int m = k; do { if (start) { start = false; } else { if (m2 < n - m) m = 0; m++; m2 = indices[k - m]; } for (int j = 1; j <= m; ++j) indices[k + j - m - 1] = m2 + j; PyObject* subset = PyList_New(k); for (int j = 0; j < k; ++j) { PyObject* item = PySequence_Fast_GET_ITEM(a, indices[j] - 1); Py_INCREF(item); PyList_SetItem(subset, j, item); } PyList_Append(result, subset); Py_DECREF(subset); } while (indices[0] != n - k + 1); Py_DECREF(a); return result; } } #endif gamera-3.3.3/include/plugins/logical.hpp0000644000076500000000000000702611652050140017170 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm10092002_logical #define kwm10092002_logical #include "gamera.hpp" #include #include namespace Gamera { template inline typename ImageFactory::view_type* logical_combine(T& a, const U& b, const FUNCTOR& functor, bool in_place) { if (a.nrows() != b.nrows() || a.ncols() != b.ncols()) throw std::runtime_error("Images must be the same size."); typedef typename T::value_type TVALUE; typedef typename ImageFactory::view_type VIEW; if (in_place) { typename T::vec_iterator ia = a.vec_begin(); typename U::const_vec_iterator ib = b.vec_begin(); typename choose_accessor::accessor ad = choose_accessor::make_accessor(a); for (; ia != a.vec_end(); ++ia, ++ib) { bool b = functor(is_black(*ia), is_black(*ib)); if (b) ad.set(white(a), ia); else ad.set(black(a), ia); } // Returning NULL is converted to None by the wrapper mechanism return NULL; } else { typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(a.size(), a.origin()); VIEW* dest = new VIEW(*dest_data); typename T::vec_iterator ia = a.vec_begin(); typename U::const_vec_iterator ib = b.vec_begin(); typename VIEW::vec_iterator id = dest->vec_begin(); typename choose_accessor::accessor ad = choose_accessor::make_accessor(*dest); try { // Vigra's combineTwoImages does not clip back to one of the standard // Gamera image types, so we have to do this differently ourselves. MGD for (; ia != a.vec_end(); ++ia, ++ib, ++id) { bool b = functor(is_black(*ia), is_black(*ib)); if (b) ad.set(white(a), id); else ad.set(black(a), id); } } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } } template typename ImageFactory::view_type* and_image(T& a, const U& b, bool in_place=true) { typedef typename T::value_type value_type; return logical_combine(a, b, std::logical_and(), in_place); } template typename ImageFactory::view_type* or_image(T& a, const U& b, bool in_place=true) { typedef typename T::value_type value_type; return logical_combine(a, b, std::logical_or(), in_place); }; // We make our own, since logical_xor is not in STL template struct logical_xor : public std::binary_function<_Tp,_Tp,bool> { bool operator()(const _Tp& __x, const _Tp& __y) const { return __x ^ __y; } }; template typename ImageFactory::view_type* xor_image(T& a, const U& b, bool in_place=true) { typedef typename T::value_type value_type; return logical_combine(a, b, logical_xor(), in_place); } } #endif gamera-3.3.3/include/plugins/misc_filters.hpp0000644000076500000000000005176311704334020020250 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Christoph Dalitz, Oliver Christen * 2011-2012 Christoph Dalitz, David Kolanus * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm11062002_misc_filters #define kwm11062002_misc_filters #include "gamera.hpp" #include "image_utilities.hpp" #include "neighbor.hpp" #include "vigra/gaborfilter.hxx" #include "convolution.hpp" #include using namespace std; namespace Gamera { //--------------------------- // min/max filter //--------------------------- template typename ImageFactory::view_type* min_max_filter(const T &src, unsigned int k_h=3, int filter=0, unsigned int k_v=0){ typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type T_value_type; T_value_type defaultval; const T_value_type &(*opt)(const T_value_type&,const T_value_type&); if(filter==0){ opt = std::min; defaultval = std::numeric_limits::max(); } else { opt = std::max; defaultval = std::numeric_limits::min(); } if(k_v==0) k_v=k_h; if (src.nrows() < k_v || src.ncols() < k_h) return simple_image_copy(src); data_type *res_data = new data_type(src.size(), src.origin()); view_type *res= new view_type(*res_data); image_copy_fill(src, *res); unsigned int src_nrows = src.nrows(); unsigned int src_ncols = src.ncols(); unsigned int shiftsize_v = ((k_v-1)/2); unsigned int shiftsize_h = ((k_h-1)/2); unsigned int max_length = std::max(src_nrows, src_ncols); unsigned int max_shift = std::max(shiftsize_v, shiftsize_h); unsigned int k,i,j; unsigned int loc_max; T_value_type* g_long = new T_value_type[(max_length + max_shift)]; T_value_type* h_long = new T_value_type[(max_length + max_shift)]; // init for horizontal processing for(k=0; kset(Point(i,j), opt(g_long[i+shiftsize_h], h_long[i])); } } //init for vertical prozessing for(k=0; kget(Point(j,i)); for(k=1; kget(Point(j,i+k)), g[i+k-1]); } } //calc subarray h for( i=0 ; iget(Point(j, loc_max-1)); for(k=2; k<=k_v; k++){ h[loc_max-k]=opt(res->get(Point(j, loc_max-k)), h[loc_max-k+1]); } } // combine g and h for(i=0; iset(Point(j,i), opt(g_long[i+shiftsize_v], h_long[i])); } } delete[] g_long; delete[] h_long; return res; } //--------------------------------------------------------------- // Parametrization of border treatment (padwhite versus reflect) //--------------------------------------------------------------- template class GetPixel4Border{ const T& _src; int _src_ncols; int _src_nrows; int _border_treatment; // 0=padwhite, 1=reflect typename T::value_type _white_val; unsigned int _k; public: GetPixel4Border(const T &src, int border_treatment, unsigned int k):_src(src){ _src_ncols=src.ncols(); _src_nrows=src.nrows(); _border_treatment=border_treatment; _white_val = white(src); _k = k; } typename T::value_type operator() (int column, int row) { // window partially outside the image? if (column < 0 || column >= _src_ncols || row < 0 || row >= _src_nrows) { if(_border_treatment==1) { if (column < 0) column = -column; if (column >= _src_ncols) column = _src_ncols - (column -_src_ncols) - 2; if (row < 0) row = -row; if (row >= _src_nrows) row = _src_nrows - (row - _src_nrows) - 2; } else { return _white_val; } } return _src.get(Point(column, row)); } }; //---------------------------------------------- // mean filter (David Kolanus) //---------------------------------------------- template typename ImageFactory::view_type* mean(const T &src, unsigned int k=3, size_t border_treatment=1) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type T_value_type; if (src.nrows() < k || src.ncols() < k) return simple_image_copy(src); data_type *res_data = new data_type(src.size(), src.origin()); view_type *res= new view_type(*res_data); int src_ncols = src.ncols(); int src_nrows = src.nrows(); double window_sum=0.0; double kk = 1.0/double(k*k); //(col,row) int column=0; int row=0; int r = (k-1)/2; //row/column are now center GetPixel4Border gp(src, border_treatment, k); int ci, ri; int r_p=r; int r_m=-r; for(row=0; rowset( Point(column,row), T_value_type(window_sum*kk + 0.5)); //go right column.... for(column=1; columnset( Point(column,row), T_value_type(window_sum*kk + 0.5)); } } return res; } //---------------------------------------------------------------- // rank filter (Christoph Dalitz and David Kolanus) //---------------------------------------------------------------- template class RankHist { public: unsigned int* hist; unsigned int histsize; RankHist() { unsigned int color; histsize = (unsigned int)pow(2.0,8.0*sizeof(T)); hist = new unsigned int[histsize]; for(color=0; color() { delete[] hist; }; inline unsigned int operator() (unsigned int r, unsigned int k2); }; template<> RankHist::RankHist() { unsigned int color; histsize = 65536; // only 16bit hist = new unsigned int[histsize]; for(color=0; color inline unsigned int RankHist::operator() (unsigned int r, unsigned int k2) { unsigned int collect = 0; unsigned int color; for(color=0; color=r){ return color; } } return color; } template<> inline unsigned int RankHist::operator() (unsigned int r, unsigned int k2) { unsigned int collect = 0; unsigned int color; collect = 0; for(color=0; color=k2-r+1){ return color; } } return color; } template typename ImageFactory::view_type* rank (const T &src, unsigned int rank, unsigned int k=3, size_t border_treatment=1) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type T_value_type; if (src.nrows() < k || src.ncols() < k) return simple_image_copy(src); data_type *res_data = new data_type(src.size(), src.origin()); view_type *res= new view_type(*res_data); //image_copy_fill(src, *res); int src_ncols = (int)src.ncols(); int src_nrows = (int)src.nrows(); //(col,row) int column=0; int row; unsigned int color; int r = (k-1)/2; //rank class RankHist rk; //row/column are now center GetPixel4Border gp(src, border_treatment, k); int ci, ri; int r_p=r; int r_m=-r; for(row=0; rowset( Point(column,row), T_value_type(rk(rank,k*k))); //go right column.... for(column=1; columnset( Point(column,row), T_value_type(rk(rank,k*k))); } } return res; } // specialization for FloatImage, // because here the histogram based approach does not work template<> FloatImageView* rank (const FloatImageView &src, unsigned int rank, unsigned int k, size_t border_treatment) { if (src.nrows() < k || src.ncols() < k) return simple_image_copy(src); int x,y; size_t i; FloatImageData *res_data = new FloatImageData(src.size(), src.origin()); FloatImageView *res= new FloatImageView(*res_data); GetPixel4Border gp(src, border_treatment, k); vector window(k*k); int radius = (k-1)/2; for(y = 0 ; (size_t)y < src.nrows() ; y++) { for(x = 0 ; (size_t)x < src.ncols(); x++) { for(i = 0 ; i < k*k ; i++) { window[i] = gp(x - radius + (i%k), y - radius + (i/k)); } nth_element(window.begin(), window.begin() + rank, window.end()); res->set(Point(x,y), *(window.begin()+rank)); } } return res; } //--------------------------- // Gabor filter //--------------------------- template Image* create_gabor_filter(const T& src, double orientation, double frequency, int direction) { FloatImageData* dest_data = new FloatImageData(src.size(), src.origin()); FloatImageView* dest = new FloatImageView(*dest_data); image_copy_fill(src, *dest); try { vigra::createGaborFilter(dest_image_range(*dest), orientation, frequency, vigra::angularGaborSigma(direction, frequency), vigra::radialGaborSigma(frequency)); } catch(std::exception e) { delete dest; delete dest_data; throw std::runtime_error("VIGRA function 'createGaborFilter' failed!"); } return dest; } //--------------------------- // kfill //--------------------------- // count core ON pixel inline unsigned int kfill_count_core_pixel(OneBitImageView *tmp, int x, int y, Point *c_lr) { unsigned int core_pixel = 0; for( unsigned int cy = y ; cy <= c_lr->y() ; cy++ ) { for( unsigned int cx = x ; cx <= c_lr->x() ; cx++ ) { if( (*tmp).get( Point(cx, cy) ) == is_black(tmp)) { core_pixel++; } } } return core_pixel; } // set all core pixel to given value inline void kfill_set_core_pixel(OneBitImageView *res, int x, int y, Point *c_lr, int v) { for( unsigned int cy = y ; cy <= c_lr->y() ; cy++ ) { for( unsigned int cx = x ; cx <= c_lr->x() ; cx++ ) { (*res).set( Point(cx, cy), v); } } } // get n, r, c void kfill_get_condition_variables(OneBitImageView *tmp, int k, int x, int y, int size_x, int size_y, int *n, int *r, int *c) { // upper left corner of current window int ul_x; int ul_y; // upper right corner of current window int ur_x; int ur_y; // lower left corner of current window int ll_x; int ll_y; // lower right corner of current window int lr_x; int lr_y; int nnp = 4*(k-1); // total number of neighborhood pixels int* nh_pixel = new int[nnp]; // array for neighborhood pixel int nh_pixel_count = 0; int corner_pixel_count; int nh_ccs; OneBitPixel pixelvalue; // calculate window borders ul_x = ( x - 1 ); ul_y = ( y - 1 ); ur_x = ( x + k - 2 ); ur_y = ( y - 1 ); ll_x = ( x - 1 ); ll_y = ( y + k - 2 ); lr_x = ( x + k - 2 ); lr_y = ( y + k - 2 ); // fill array with neighborhood and count neighborhood ON pixel int i = 0; for( int ul_to_ur_np = ul_x ; ul_to_ur_np < ur_x ; ul_to_ur_np++ ) { if(ul_to_ur_np < 0 || y-1 < 0 ) { pixelvalue = 0; } else { pixelvalue = (*tmp).get( Point(ul_to_ur_np, y - 1) ); } nh_pixel[i++] = is_black(pixelvalue); if (is_black(pixelvalue)) { nh_pixel_count++; } } for( int ur_to_lr_np = ur_y ; ur_to_lr_np < lr_y ; ur_to_lr_np++ ) { if(ur_to_lr_np < 0 || x + k - 2 > size_x - 1 ) { pixelvalue = 0; } else { pixelvalue = (*tmp).get( Point(x + k - 2, ur_to_lr_np) ); } nh_pixel[i++] = is_black(pixelvalue); if (is_black(pixelvalue)) { nh_pixel_count++; } } for( int lr_to_ll_np = lr_x ; lr_to_ll_np > ll_x ; lr_to_ll_np-- ) { if( lr_to_ll_np > size_x - 1 || y + k - 2 > size_y - 1 ) { pixelvalue = 0; } else { pixelvalue = (*tmp).get( Point(lr_to_ll_np, y + k - 2) ); } nh_pixel[i++] = is_black(pixelvalue); if (is_black(pixelvalue)) { nh_pixel_count++; } } for( int ll_to_ul_np = ll_y ; ll_to_ul_np > ul_y ; ll_to_ul_np-- ) { if(x - 1 < 0 || ll_to_ul_np > size_y - 1 ) { pixelvalue = 0; } else { pixelvalue = (*tmp).get( Point(x - 1, ll_to_ul_np) ); } nh_pixel[i++] = is_black(pixelvalue); if (is_black(pixelvalue)) { nh_pixel_count++; } } // count corner ON pixel corner_pixel_count = nh_pixel[(k-1)*0] + nh_pixel[(k-1)*1] + nh_pixel[(k-1)*2] + nh_pixel[(k-1)*3]; // get ccs in neighborhood nh_ccs = 0; for(int nhpixel = 0 ; nhpixel < i ; nhpixel++) { nh_ccs += abs( nh_pixel[(nhpixel+1)%nnp] - nh_pixel[nhpixel] ); } nh_ccs /= 2; *n = nh_pixel_count; *r = corner_pixel_count; *c = nh_ccs; delete[] nh_pixel; } // the actual kfill implementation template OneBitImageView * kfill(const T &src, int k, int iterations) { // // create a copy of the original image // kfill algorithm sets pixel ON/OFF information in this image // OneBitImageData *res_data = new OneBitImageData( src.size(), src.origin() ); OneBitImageView *res = new OneBitImageView(*res_data); image_copy_fill(src, *res); // kfill algorithm reads pixel ON/OFF information from this image OneBitImageData *tmp_data = new OneBitImageData( src.size(), src.origin() ); OneBitImageView *tmp = new OneBitImageView(*tmp_data); bool changed; // pixels changed in an iteration int src_size_x = src.ncols(); // source image size x int src_size_y = src.nrows(); // source image size y int x, y; // windows position (upper left core coordinate) Point c_lr; // windows position (lower right core coordinate) int ncp = (k-2)*(k-2); // number of core pixel int core_pixel; // number of ON core pixel int r; // number of pixel in the neighborhood corners int n; // number of neighborhood pixel int c; // number of ccs in neighborhood while(iterations) { // create a copy from the result image (result of previous iteration or original at first iteration) image_copy_fill(*res, *tmp); // reset changed pixel changed = false; // move window over the image for(y = 0 ; y < src_size_y - (k-3) ; y++) { for(x = 0 ; x < src_size_x - (k-3) ; x++) { // calculate lower right core coordinate c_lr.x( x + (k - 3) ); c_lr.y( y + (k - 3) ); // count core ON pixel core_pixel = kfill_count_core_pixel(tmp, x, y, &c_lr); // // ON filling requires ALL core pixels to be OFF // if(core_pixel == 0) { // get condition variables kfill_get_condition_variables(tmp, k, x, y, src_size_x, src_size_y, &n, &r, &c); // condition check if( (c <= 1) && ( (n > 3*k - 4) || (n == 3*k - 4) && (r == 2) ) ) { kfill_set_core_pixel(res, x, y, &c_lr, 1); changed = true; } } // // OFF filling requires ALL core pixels to be ON // if(core_pixel == ncp) { kfill_get_condition_variables(tmp, k, x, y, src_size_x, src_size_y, &n, &r, &c); n = ( 4*(k-1) ) - n; r = 4 - r; // condition check if( (c <= 1) && ( (n > 3*k - 4) || (n == 3*k - 4) && (r == 2) ) ) { kfill_set_core_pixel(res, x, y, &c_lr, 0); changed = true; } } } // end for x } // end for y if(!changed) { break; } iterations--; } // end while delete tmp->data(); delete tmp; return res; } template OneBitImageView * kfill_modified(const T &src, int k) { /* create a copy of the original image kfill algorithm sets pixel ON/OFF information in this image */ OneBitImageData *res_data = new OneBitImageData( src.size(), src.origin() ); OneBitImageView *res = new OneBitImageView(*res_data); OneBitImageData *tmp_data = new OneBitImageData( src.size(), src.origin() ); OneBitImageView *tmp = new OneBitImageView(*tmp_data); image_copy_fill(src, *tmp); int src_size_x = src.ncols(); // source image size x int src_size_y = src.nrows(); // source image size y int x, y; // windows position (upper left core coordinate) Point c_lr; // windows position (lower right core coordinate) int ncp = (k-2) * (k-2); float ncp_required = ncp / 2.0f; // number of core pixel required -- modified version int core_pixel; // number of ON core pixel int r; // number of pixel in the neighborhood corners int n; // number of neighborhood pixel int c; // number of ccs in neighborhood // move window over the image for(y = 0 ; y < src_size_y - (k-3) ; y++) { for(x = 0 ; x < src_size_x - (k-3) ; x++) { // calculate lower right core coordinate c_lr.x( x + (k - 3) ); c_lr.y( y + (k - 3) ); // count core ON pixel core_pixel = kfill_count_core_pixel(tmp, x, y, &c_lr); // ON >= (k-2)^2/2 ? if(core_pixel >= ncp_required) { // Examine in the Neighborhood kfill_get_condition_variables(tmp, k, x, y, src_size_x, src_size_y, &n, &r, &c); n = ( 4*(k-1) ) - n; r = 4 - r; // eq. satisfied? if( (c <= 1) && ( (n > 3*k - 4) || (n == 3*k - 4) && (r == 2) ) ) { kfill_set_core_pixel(res, x, y, &c_lr, 0); } else { kfill_set_core_pixel(res, x, y, &c_lr, 1); } } else { // Examine in the Neighborhood kfill_get_condition_variables(tmp, k, x, y, src_size_x, src_size_y, &n, &r, &c); // eq. satisfied? if( (c <= 1) && ( (n > 3*k - 4) || (n == 3*k - 4) && (r == 2) ) ) { kfill_set_core_pixel(res, x, y, &c_lr, 1); } else { kfill_set_core_pixel(res, x, y, &c_lr, 0); } } } // end for x } // end for y delete tmp->data(); delete tmp; return res; } } #endif gamera-3.3.3/include/plugins/misc_free_functions.hpp0000644000076500000000000000213111652050140021572 0ustar chriswheel/* * * Copyright (C) 2010 Christoph Dalitz * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef cd23022010_mistfreefunctions #define cd23022010_mistfreefunctions #include #include namespace Gamera { PyObject* range_of_float() { return Py_BuildValue("dd", std::numeric_limits::min(), std::numeric_limits::max()); } } #endif gamera-3.3.3/include/plugins/morphology.hpp0000644000076500000000000003371211652050140017756 0ustar chriswheel/* * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Derived from Klette, R. and P. Zamperoni. 1996. Handbook of Image Processing Operators. New York: John Wiley & Sons. */ #ifndef kwm12032001_erode_dilate #define kwm12032001_erode_dilate #include #include #include "gamera.hpp" #include "neighbor.hpp" #include "image_utilities.hpp" #include "vigra/distancetransform.hxx" // for backward compatibility: // mean, rank were formerly defined in the present header file #include "misc_filters.hpp" using namespace std; namespace Gamera { /* * binary dilation with arbitrary structuring element */ template typename ImageFactory::view_type* dilate_with_structure(const T &src, const U &structuring_element, Point origin, bool only_border=false) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type value_type; int x,y; value_type blackval = black(src); data_type* dest_data = new data_type(src.size(), src.origin()); view_type* dest = new view_type(*dest_data); // build list of structuring element offsets IntVector se_x; IntVector se_y; int left, right, top, bottom, xoff, yoff; left = right = top = bottom = 0; for (y = 0; y < (int)structuring_element.nrows(); y++) for (x = 0; x < (int)structuring_element.ncols(); x++) if (is_black(structuring_element.get(Point(x,y)))) { xoff = x - origin.x(); yoff = y - origin.y(); se_x.push_back(xoff); se_y.push_back(yoff); if (left < -xoff) left = -xoff; if (right < xoff) right = xoff; if (top < -yoff) top = -yoff; if (bottom < yoff) bottom = yoff; } // move structuring element over image and add its black pixels size_t i; int ncols = (int)src.ncols(); int nrows = (int)src.nrows(); int maxy = nrows - bottom; int maxx = ncols - right; // first skip borders for saving range checks for (y = top; y < maxy; y++) for (x = left; x < maxx; x++) { // is it a bulk pixel? if (only_border && x > 0 && x < ncols - 1 && y > 0 && y < nrows - 1 && src.get(Point(x-1,y-1)) && src.get(Point(x,y-1)) && src.get(Point(x+1,y-1)) && src.get(Point(x-1,y)) && src.get(Point(x+1,y)) && src.get(Point(x-1,y+1)) && src.get(Point(x,y+1)) && src.get(Point(x+1,y+1))) { dest->set(Point(x,y),blackval); continue; } if (is_black(src.get(Point(x,y)))) { for (i = 0; i < se_x.size(); i++) { dest->set(Point(x + se_x[i], y + se_y[i]), blackval); } } } // now process borders where structuring element leaves image int sx, sy; for (y = 0; y < nrows; y++) for (x = 0; x < ncols; x++) if (y < top || y >= maxy || x < left || x >= maxx) { if (is_black(src.get(Point(x,y)))) { for (i = 0; i < se_x.size(); i++) { sx = x + se_x[i]; sy = y + se_y[i]; if (sx >= 0 && sx < ncols && sy >= 0 && sy < nrows) dest->set(Point(sx, sy), blackval); } } } return dest; } /* * binary erosion with arbitrary structuring element */ template typename ImageFactory::view_type* erode_with_structure(const T &src, const U &structuring_element, Point origin){ typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type value_type; int x,y; value_type blackval = black(src); data_type* dest_data = new data_type(src.size(), src.origin()); view_type* dest = new view_type(*dest_data); // build list of structuring element offsets IntVector se_x; IntVector se_y; int left, right, top, bottom, xoff, yoff; left = right = top = bottom = 0; for (y = 0; y < (int)structuring_element.nrows(); y++) for (x = 0; x < (int)structuring_element.ncols(); x++) if (is_black(structuring_element.get(Point(x,y)))) { xoff = x - origin.x(); yoff = y - origin.y(); se_x.push_back(xoff); se_y.push_back(yoff); if (left < -xoff) left = -xoff; if (right < xoff) right = xoff; if (top < -yoff) top = -yoff; if (bottom < yoff) bottom = yoff; } // move structuring element over image and check whether it is // fully contained in the source image size_t i; bool contained; int maxy = (int)src.nrows() - bottom; int maxx = (int)src.ncols() - right; for (y = top; y < maxy; y++) for (x = left; x < maxx; x++) { if (is_black(src.get(Point(x,y)))) { contained = true; for (i = 0; i < se_x.size(); i++) { if (is_white(src.get(Point(x + se_x[i], y + se_y[i])))) { contained = false; break; } } if (contained) dest->set(Point(x,y),blackval); } } return dest; } template class Max { public: inline T operator() (typename vector::iterator begin, typename vector::iterator end); }; template inline T Max::operator() (typename vector::iterator begin, typename vector::iterator end) { return *(max_element(begin, end)); } template<> inline OneBitPixel Max::operator() (vector::iterator begin, vector::iterator end) { return *(min_element(begin, end)); } template class Min { public: inline T operator() (typename vector::iterator begin, typename vector::iterator end); }; template inline T Min::operator() (typename vector::iterator begin, typename vector::iterator end) { return *(min_element(begin, end)); } template<> inline OneBitPixel Min::operator() (vector::iterator begin, vector::iterator end) { return *(max_element(begin, end)); } /* the general implementation (both for onebit and greyscale) needed to be renamed to allow for template specilization on onebit images */ template typename ImageFactory::view_type* erode_dilate_original(T &m, const size_t times, int direction, int geo) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; typedef typename T::value_type value_type; Max max; Min min; if (m.nrows() < 3 || m.ncols() < 3) return simple_image_copy(m); data_type* new_data = new data_type(m.size(), m.origin()); view_type* new_view = new view_type(*new_data); try { if (times > 1) { view_type* flip_view = simple_image_copy(m); try { unsigned int r, ngeo = 0; bool n8; ngeo = 1; for (r = 1; r <= times; r++) { if (r > 1) { typename view_type::vec_iterator g = flip_view->vec_begin(); typename view_type::vec_iterator h = new_view->vec_begin(); for (; g != flip_view->vec_end(); g++, h++) *g = *h; } if (geo && (ngeo % 2 == 0)) n8 = true; else n8 = false; if (direction) { if (n8) neighbor4o(*flip_view, max, *new_view); else neighbor9(*flip_view, max, *new_view); } else { if (n8) neighbor4o(*flip_view, min, *new_view); else neighbor9(*flip_view, min, *new_view); } ngeo++; } } catch (std::exception e) { delete flip_view->data(); delete flip_view; throw; } delete flip_view->data(); delete flip_view; return new_view; } else { if (direction) { if (geo) neighbor4o(m, max, *new_view); else neighbor9(m, max, *new_view); } else { if (geo) neighbor4o(m, min, *new_view); else neighbor9(m, min, *new_view); } return new_view; } } catch (std::exception e) { delete new_view; delete new_data; throw; } } /* implementation for non-onebit images */ template typename ImageFactory::view_type* erode_dilate(T &m, const size_t times, int direction, int geo){ typedef typename ImageFactory::view_type view_type; view_type* new_view; new_view = erode_dilate_original(m,times,direction,geo); return new_view; } /* for onebit images the use of erode/dilate_with_structure is much faster than the general implementation erode_dilate_original */ template<> ImageFactory::view_type* erode_dilate(OneBitImageView &src, const size_t times, int direction, int geo){ if (src.nrows() < 3 || src.ncols() < 3 || times < 1) return simple_image_copy(src); OneBitImageData* se_data = new OneBitImageData(Dim(1+2*times,1+2*times)); OneBitImageView* se = new OneBitImageView(*se_data); OneBitImageView* result; // structuring element se depends on the geometry if (geo) { // create octagonal kernel //result = erode_dilate_original(src,times,direction,geo); //return result; int n_corner = (1+(int)times) / 2; int n = (int)se->ncols()-1; for(int y = 0; y < (int)se->nrows(); y++) for(int x = 0; x < (int)se->ncols(); x++) if (!(x+y < n_corner || n-x+y < n_corner || x+n-y < n_corner || n-x+n-y < n_corner)) se->set(Point(x,y),OneBitPixel(1)); } else { // create square kernel for(int y = 0; y < (int)se->nrows(); y++) for(int x = 0; x < (int)se->ncols(); x++) se->set(Point(x,y),OneBitPixel(1)); } if (direction) result = erode_with_structure(src,*se, Point(times,times)); else result = dilate_with_structure(src,*se,Point(times,times),false); delete se->data(); delete se; return result; } template void erode(T& image) { erode_dilate(image, 1, 1, 0); } template void dilate(T& image) { erode_dilate(image, 1, 0, 0); } template class Mode { public: inline T operator() (typename vector::iterator begin, typename vector::iterator end); }; template inline T Mode::operator() (typename vector::iterator begin, typename vector::iterator end) { std::map votes; T max_value; size_t max_count = 0; for (; begin != end; ++begin) { votes[*begin]++; if (votes[*begin] > max_count) { max_count = votes[*begin]; max_value = *begin; } } return max_value; } template class All { public: inline T operator() (typename vector::iterator begin, typename vector::iterator end); }; template inline T All::operator() (typename vector::iterator begin, typename vector::iterator end) { typename vector::iterator middle = begin + 4; for (; begin != end; ++begin) if (begin != middle) if (is_black(*begin)) return *middle; return pixel_traits::white(); } template void despeckle_single_pixel(T &m) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* new_data = new data_type(m.size(), m.origin()); view_type* new_view = new view_type(*new_data); try { All all_op; neighbor9(m, all_op, *new_view); typename T::vec_iterator g = m.vec_begin(); typename view_type::vec_iterator h = new_view->vec_begin(); for (; g != m.vec_end(); g++, h++) *g = *h; } catch (std::exception e) { delete new_view; delete new_data; throw; } return; } template void despeckle(T &m, size_t size) { if (m.nrows() < 3 || m.ncols() < 3) return; if (size == 1) { despeckle_single_pixel(m); return; } typedef typename T::value_type value_type; ImageData mat_data(m.dim(), m.origin()); ImageView > tmp(mat_data); typedef std::vector PixelQueue; PixelQueue pixel_queue; pixel_queue.reserve(size * 2); for (size_t r = 0; r < m.nrows(); ++r) { for (size_t c = 0; c < m.ncols(); ++c) { if (is_white(tmp.get(Point(c, r))) && is_black(m.get(Point(c, r)))) { pixel_queue.clear(); pixel_queue.push_back(Point(c, r)); bool bail = false; tmp.set(Point(c, r), 1); for (size_t i = 0; (i < pixel_queue.size()) && (pixel_queue.size() < size); ++i) { Point center = pixel_queue[i]; for (size_t r2 = (center.y()>0) ? center.y() - 1 : 0; r2 < std::min(center.y() + 2, m.nrows()); ++r2) { for (size_t c2 = (center.x()>0) ? center.x() - 1 : 0; c2 < std::min(center.x() + 2, m.ncols()); ++c2) { if (is_black(m.get(Point(c2, r2))) && is_white(tmp.get(Point(c2, r2)))) { tmp.set(Point(c2, r2), 1); pixel_queue.push_back(Point(c2, r2)); } else if (tmp.get(Point(c2, r2)) == 2) { bail = true; break; } } if (bail) break; } if (bail) break; } if (!bail && pixel_queue.size() < size) { for (typename PixelQueue::iterator i = pixel_queue.begin(); i != pixel_queue.end(); ++i) { m.set(Point(i->x(), i->y()), white(m)); } } else { for (typename PixelQueue::iterator i = pixel_queue.begin(); i != pixel_queue.end(); ++i) { tmp.set(Point(i->x(), i->y()), 2); } } } } } } template Image* distance_transform(const T& src, int norm) { FloatImageData* dest_data = new FloatImageData(src.size(), src.origin()); FloatImageView* dest = new FloatImageView(*dest_data); try { vigra::distanceTransform(src_image_range(src), dest_image(*dest), 0, norm); } catch (std::exception e) { delete dest; delete dest_data; throw; } return dest; } } #endif gamera-3.3.3/include/plugins/neighbor.hpp0000644000076500000000000005606011652050140017355 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Derived from Klette, R. and P. Zamperoni. Handbook of Image Processing Operators. */ #ifndef kwm12032001_neighbor #define kwm12032001_neighbor #include #include "gamera.hpp" namespace Gamera { /* Steps through the image using a 4x4 window, replacing the center pixel with a value determined by a given function. This version uses all nine pixels in the 3x3 window: #### 0 1 2 3 #### 4 5 6 7 #### 8 9 10 11 #### 12 13 14 15 The temporary matrix required may be passed in to avoid reallocating for each pass of a multi-pass algorithm. (see erode) Since there can be no "center" pixel in a 4x4 window, where the center is is parameterized (should be templatized). For example, row = 2, col = 1 puts the center at: #### #### #x## #### */ template void neighbor16(const T& m, F& func, M& tmp, size_t center_row = 1, size_t center_col = 1) { if (m.nrows() < 4 || m.ncols() < 4) return; std::vector window(16); for (unsigned int row = 0; row < m.nrows() - 4; row++) { for (unsigned int col = 0; col < m.ncols() - 4; col++) { window[0] = m.get(Point(col, row)); window[1] = m.get(Point(col + 1, row)); window[2] = m.get(Point(col + 2, row)); window[3] = m.get(Point(col + 3, row)); window[4] = m.get(Point(col, row + 1)); window[5] = m.get(Point(col + 1, row + 1)); window[6] = m.get(Point(col + 2, row + 1)); window[7] = m.get(Point(col + 3, row + 1)); window[8] = m.get(Point(col, row + 2)); window[9] = m.get(Point(col + 1, row + 2)); window[10] = m.get(Point(col + 2, row + 2)); window[11] = m.get(Point(col + 3, row + 2)); window[12] = m.get(Point(col, row + 3)); window[13] = m.get(Point(col + 1, row + 3)); window[14] = m.get(Point(col + 2, row + 3)); window[15] = m.get(Point(col + 3, row + 3)); tmp.set(Point(col + center_col, row + center_row), func(window.begin(), window.end())); } } } /* Steps through the image using a 3x3 window, replacing the center pixel with a value determined by a given function. This version uses all nine pixels in the 3x3 window: ### 012 ### 345 ### 678 The temporary matrix required may be passed in to avoid reallocating for each pass of a multi-pass algorithm. (see erode) Pixels in the window outside the image are set to white. If you want reflecting boundary conditions instead, use neighbor9reflection(). */ template void neighbor9(const T& m, F func, M& tmp) { if (m.nrows() < 3 || m.ncols() < 3) return; std::vector window(9); unsigned int nrows_m1 = m.nrows() - 1; unsigned int ncols_m1 = m.ncols() - 1; unsigned int nrows_m2 = m.nrows() - 2; unsigned int ncols_m2 = m.ncols() - 2; // Upper-left window[0] = window[1] = window[2] = window[3] = window[6] = white(m); window[4] = m.get(Point(0, 0)); window[5] = m.get(Point(1, 0)); window[7] = m.get(Point(0, 1)); window[8] = m.get(Point(1, 1)); tmp.set(Point(0, 0), func(window.begin(), window.end())); // Upper-right window[5] = window[8] = window[0] = window[1] = window[2] = white(m); window[3] = m.get(Point(ncols_m2, 0)); window[4] = m.get(Point(ncols_m1, 0)); window[6] = m.get(Point(ncols_m2, 1)); window[7] = m.get(Point(ncols_m1, 1)); tmp.set(Point(ncols_m1, 0), func(window.begin(), window.end())); // Lower-left window[0] = window[3] = window[6] = window[7] = window[8] = white(m); window[1] = m.get(Point(0, nrows_m2)); window[2] = m.get(Point(1, nrows_m2)); window[4] = m.get(Point(0, nrows_m1)); window[5] = m.get(Point(1, nrows_m1)); tmp.set(Point(0, nrows_m1), func(window.begin(), window.end())); // Lower-right window[2] = window[5] = window[8] = window[7] = window[6] = white(m); window[0] = m.get(Point(ncols_m2, nrows_m2)); window[1] = m.get(Point(ncols_m1, nrows_m2)); window[3] = m.get(Point(ncols_m2, nrows_m1)); window[4] = m.get(Point(ncols_m1, nrows_m1)); tmp.set(Point(ncols_m1, nrows_m1), func(window.begin(), window.end())); // Top edge for (unsigned int col = 1; col < ncols_m1; col++) { window[0] = window[1] = window[2] = white(m); window[3] = m.get(Point(col - 1, 0)); window[4] = m.get(Point(col, 0)); window[5] = m.get(Point(col + 1, 0)); window[6] = m.get(Point(col - 1, 1)); window[7] = m.get(Point(col, 1)); window[8] = m.get(Point(col + 1, 1)); tmp.set(Point(col, 0), func(window.begin(), window.end())); } // Bottom edge for (unsigned int col = 1; col < ncols_m1; col++) { window[6] = window[7] = window[8] = white(m); window[0] = m.get(Point(col - 1, nrows_m2)); window[1] = m.get(Point(col, nrows_m2)); window[2] = m.get(Point(col + 1, nrows_m2)); window[3] = m.get(Point(col - 1, nrows_m1)); window[4] = m.get(Point(col, nrows_m1)); window[5] = m.get(Point(col + 1, nrows_m1)); tmp.set(Point(col, nrows_m1), func(window.begin(), window.end())); } // Left edge for (unsigned int row = 1; row < nrows_m1; row++) { window[0] = window[3] = window[6] = white(m); window[1] = m.get(Point(0, row - 1)); window[2] = m.get(Point(1, row - 1)); window[4] = m.get(Point(0, row)); window[5] = m.get(Point(1, row)); window[7] = m.get(Point(0, row + 1)); window[8] = m.get(Point(1, row + 1)); tmp.set(Point(0, row), func(window.begin(), window.end())); } // Right edge for (unsigned int row = 1; row < nrows_m1; row++) { window[2] = window[5] = window[8] = white(m); window[0] = m.get(Point(ncols_m2, row - 1)); window[1] = m.get(Point(ncols_m1, row - 1)); window[3] = m.get(Point(ncols_m2, row)); window[4] = m.get(Point(ncols_m1, row)); window[6] = m.get(Point(ncols_m2, row + 1)); window[7] = m.get(Point(ncols_m1, row + 1)); tmp.set(Point(ncols_m1, row), func(window.begin(), window.end())); } // Core of image for (int row = 1; row < int(nrows_m1); ++row) { for (int col = 1; col < int(ncols_m1); ++col) { // This may seem silly, but it's significantly faster than using // nine iterators typename std::vector::iterator window_it = window.begin(); for (int ri = -1; ri < 2; ++ri) for (int ci = -1; ci < 2; ++ci, ++window_it) *window_it = m.get(Point(col + ci, row + ri)); tmp.set(Point(col, row), func(window.begin(), window.end())); } } } /* Steps through the image using a 3x3 window, replacing the center pixel with a value determined by a given function. This version uses all nine pixels in the 3x3 window: ### 012 ### 345 ### 678 When the window extends beyonds the image, reflecting boundary conditions are used. */ template void neighbor9reflection(const T& m, F func, M& tmp) { if (m.nrows() < 3 || m.ncols() < 3) return; std::vector window(9); unsigned int nrows_m1 = m.nrows() - 1; unsigned int ncols_m1 = m.ncols() - 1; unsigned int nrows_m2 = m.nrows() - 2; unsigned int ncols_m2 = m.ncols() - 2; // Upper-left window[4] = m.get(Point(0, 0)); window[5] = m.get(Point(1, 0)); window[7] = m.get(Point(0, 1)); window[8] = m.get(Point(1, 1)); window[0] = window[4]; window[1] = window[7]; window[2] = window[8]; window[3] = window[5]; window[6] = window[8]; tmp.set(Point(0, 0), func(window.begin(), window.end())); // Upper-right window[3] = m.get(Point(ncols_m2, 0)); window[4] = m.get(Point(ncols_m1, 0)); window[6] = m.get(Point(ncols_m2, 1)); window[7] = m.get(Point(ncols_m1, 1)); window[0] = window[6]; window[1] = window[7]; window[2] = window[4]; window[5] = window[3]; window[8] = window[6]; tmp.set(Point(ncols_m1, 0), func(window.begin(), window.end())); // Lower-left window[1] = m.get(Point(0, nrows_m2)); window[2] = m.get(Point(1, nrows_m2)); window[4] = m.get(Point(0, nrows_m1)); window[5] = m.get(Point(1, nrows_m1)); window[0] = window[2]; window[3] = window[5]; window[6] = window[4]; window[7] = window[1]; window[8] = window[2]; tmp.set(Point(0, nrows_m1), func(window.begin(), window.end())); // Lower-right window[0] = m.get(Point(ncols_m2, nrows_m2)); window[1] = m.get(Point(ncols_m1, nrows_m2)); window[3] = m.get(Point(ncols_m2, nrows_m1)); window[4] = m.get(Point(ncols_m1, nrows_m1)); window[2] = window[0]; window[5] = window[3]; window[8] = window[4]; window[7] = window[1]; window[6] = window[0]; tmp.set(Point(ncols_m1, nrows_m1), func(window.begin(), window.end())); // Top edge for (unsigned int col = 1; col < ncols_m1; col++) { window[3] = m.get(Point(col - 1, 0)); window[4] = m.get(Point(col, 0)); window[5] = m.get(Point(col + 1, 0)); window[6] = m.get(Point(col - 1, 1)); window[7] = m.get(Point(col, 1)); window[8] = m.get(Point(col + 1, 1)); window[0] = window[6]; window[1] = window[7]; window[2] = window[8]; tmp.set(Point(col, 0), func(window.begin(), window.end())); } // Bottom edge for (unsigned int col = 1; col < ncols_m1; col++) { window[0] = m.get(Point(col - 1, nrows_m2)); window[1] = m.get(Point(col, nrows_m2)); window[2] = m.get(Point(col + 1, nrows_m2)); window[3] = m.get(Point(col - 1, nrows_m1)); window[4] = m.get(Point(col, nrows_m1)); window[5] = m.get(Point(col + 1, nrows_m1)); window[6] = window[0]; window[7] = window[1]; window[8] = window[2]; tmp.set(Point(col, nrows_m1), func(window.begin(), window.end())); } // Left edge for (unsigned int row = 1; row < nrows_m1; row++) { window[1] = m.get(Point(0, row - 1)); window[2] = m.get(Point(1, row - 1)); window[4] = m.get(Point(0, row)); window[5] = m.get(Point(1, row)); window[7] = m.get(Point(0, row + 1)); window[8] = m.get(Point(1, row + 1)); window[0] = window[2]; window[3] = window[5]; window[6] = window[8]; tmp.set(Point(0, row), func(window.begin(), window.end())); } // Right edge for (unsigned int row = 1; row < nrows_m1; row++) { window[0] = m.get(Point(ncols_m2, row - 1)); window[1] = m.get(Point(ncols_m1, row - 1)); window[3] = m.get(Point(ncols_m2, row)); window[4] = m.get(Point(ncols_m1, row)); window[6] = m.get(Point(ncols_m2, row + 1)); window[7] = m.get(Point(ncols_m1, row + 1)); window[2] = window[0]; window[5] = window[3]; window[8] = window[6]; tmp.set(Point(ncols_m1, row), func(window.begin(), window.end())); } // Core of image for (int row = 1; row < int(nrows_m1); ++row) { for (int col = 1; col < int(ncols_m1); ++col) { // This may seem silly, but it's significantly faster than using // nine iterators typename std::vector::iterator window_it = window.begin(); for (int ri = -1; ri < 2; ++ri) for (int ci = -1; ci < 2; ++ci, ++window_it) *window_it = m.get(Point(col + ci, row + ri)); tmp.set(Point(col, row), func(window.begin(), window.end())); } } } /* Steps through the image using a 3x3 window, replacing the center pixel with a value determined by a given function. This version uses all the eight pixels around the center pixel: ### 012 # # 3 4 ### 567 The temporary matrix required may be passed in to avoid reallocating for each pass of a multi-pass algorithm. (see erode) */ template void neighbor8o(const T& m, F& func, M& tmp) { if (m.nrows() < 3 || m.ncols() < 3) return; std::vector window(8); unsigned int nrows_m1 = m.nrows() - 1; unsigned int ncols_m1 = m.ncols() - 1; unsigned int nrows_m2 = m.nrows() - 2; unsigned int ncols_m2 = m.ncols() - 2; // It's kind of silly to special case corners and edges, but it's more // efficient than all of the if's one would have to do in the inner loop // Upper-left for (unsigned int i = 0; i < 4; ++i) window[i] = white(m); window[4] = m.get(Point(1, 0)); window[5] = white(m); window[6] = m.get(Point(0, 1)); window[7] = m.get(Point(1, 1)); tmp.set(Point(0, 0), func(window.begin(), window.end())); // Upper-right window[3] = m.get(Point(ncols_m2, 0)); window[5] = m.get(Point(ncols_m2, 1)); window[6] = m.get(Point(ncols_m1, 1)); window[4] = window[7] = white(m); tmp.set(Point(ncols_m1, 0), func(window.begin(), window.end())); // Lower-left window[1] = m.get(Point(0, nrows_m2)); window[2] = m.get(Point(1, nrows_m2)); window[4] = m.get(Point(1, nrows_m1)); window[3] = window[5] = window[6] = white(m); tmp.set(Point(0, nrows_m1), func(window.begin(), window.end())); // Lower-right window[0] = m.get(Point(ncols_m2, nrows_m2)); window[1] = m.get(Point(ncols_m1, nrows_m2)); window[3] = m.get(Point(ncols_m2, nrows_m1)); window[2] = window[4] = white(m); tmp.set(Point(ncols_m1, nrows_m1), func(window.begin(), window.end())); // Top edge for (unsigned int col = 1; col < ncols_m1; col++) { window[0] = window[1] = white(m); window[3] = m.get(Point(col - 1, 0)); window[4] = m.get(Point(col + 1, 0)); window[5] = m.get(Point(col - 1, 1)); window[6] = m.get(Point(col, 1)); window[7] = m.get(Point(col + 1, 1)); tmp.set(Point(col, 0), func(window.begin(), window.end())); } // Bottom edge for (unsigned int col = 1; col < ncols_m1; col++) { window[5] = window[6] = window[7] = white(m); window[0] = m.get(Point(col - 1, nrows_m2)); window[1] = m.get(Point(col, nrows_m2)); window[2] = m.get(Point(col + 1, nrows_m2)); window[3] = m.get(Point(col - 1, nrows_m1)); window[4] = m.get(Point(col + 1, nrows_m1)); tmp.set(Point(col, nrows_m1), func(window.begin(), window.end())); } // Left edge for (unsigned int row = 1; row < nrows_m1; row++) { window[0] = window[3] = white(m); window[1] = m.get(Point(1, row - 1)); window[2] = m.get(Point(0, row - 1)); window[4] = m.get(Point(1, row)); window[6] = m.get(Point(0, row + 1)); window[7] = m.get(Point(1, row + 1)); tmp.set(Point(0, row), func(window.begin(), window.end())); } // Right edge for (unsigned int row = 1; row < nrows_m1; row++) { window[2] = window[4] = window[7] = white(m); window[0] = m.get(Point(ncols_m2, row - 1)); window[1] = m.get(Point(ncols_m1, row - 1)); window[3] = m.get(Point(ncols_m2, row)); window[5] = m.get(Point(ncols_m2, row + 1)); window[6] = m.get(Point(ncols_m1, row + 1)); tmp.set(Point(ncols_m1, row), func(window.begin(), window.end())); } // Core of image for (unsigned int row = 1; row < nrows_m1; row++) { for (unsigned int col = 1; col < ncols_m1; col++) { // This may seem silly, but it's significantly faster than using // eight iterators window[0] = m.get(Point(col, row - 1)); window[1] = m.get(Point(col + 1, row - 1)); window[2] = m.get(Point(col + 1, row)); window[3] = m.get(Point(col + 1, row + 1)); window[4] = m.get(Point(col, row + 1)); window[5] = m.get(Point(col - 1, row + 1)); window[6] = m.get(Point(col - 1, row)); window[7] = m.get(Point(col - 1, row - 1)); tmp.set(Point(col, row), func(window.begin(), window.end())); } } } /* Steps through the image using a 3x3 window, replacing the center pixel with a value determined by a given function. This version uses four surrounding pixels in the 3x3 window: # # 0 1 # 2 # # 3 4 The temporary matrix required may be passed in to avoid reallocating for each pass of a multi-pass algorithm. (see erode) */ template void neighbor4x(const T& m, F& func, M& tmp) { if (m.nrows() < 3 || m.ncols() < 3) return; std::vector window(5); unsigned int nrows_m1 = m.nrows() - 1; unsigned int ncols_m1 = m.ncols() - 1; unsigned int nrows_m2 = m.nrows() - 2; unsigned int ncols_m2 = m.ncols() - 2; // It's kind of silly to special case corners and edges, but it's more // efficient than all of the if's one would have to do in the inner loop // Upper left window[2] = m.get(Point(0, 0)); window[4] = m.get(Point(1, 1)); window[0] = window[1] = window[3] = white(m); tmp.set(Point(0, 0), func(window.begin(), window.end())); // Upper right window[2] = m.get(Point(ncols_m1, 0)); window[3] = m.get(Point(ncols_m2, 1)); window[0] = window[1] = window[4] = white(m); tmp.set(Point(ncols_m1, 0), func(window.begin(), window.end())); // Lower left window[1] = m.get(Point(1, nrows_m2)); window[2] = m.get(Point(0, nrows_m1)); window[0] = window[3] = window[4] = white(m); tmp.set(Point(0, nrows_m1), func(window.begin(), window.end())); // Lower right window[0] = m.get(Point(ncols_m2, nrows_m2)); window[2] = m.get(Point(ncols_m1, nrows_m1)); window[1] = window[3] = window[4] = white(m); tmp.set(Point(ncols_m1, nrows_m1), func(window.begin(), window.end())); // Top edge for (unsigned int col = 1; col < ncols_m1; col++) { window[0] = window[1] = white(m); window[2] = m.get(Point(col, 0)); window[3] = m.get(Point(col - 1, 1)); window[4] = m.get(Point(col + 1, 1)); tmp.set(Point(col, 0), func(window.begin(), window.end())); } // Bottom edge for (unsigned int col = 1; col < ncols_m1; col++) { window[3] = window[4] = white(m); window[0] = m.get(Point(col - 1, nrows_m2)); window[1] = m.get(Point(col + 1, nrows_m2)); window[2] = m.get(Point(col, nrows_m1)); tmp.set(Point(col, nrows_m1), func(window.begin(), window.end())); } // Left edge for (unsigned int row = 1; row < nrows_m1; row++) { window[0] = window[3] = white(m); window[1] = m.get(Point(1, row - 1)); window[2] = m.get(Point(0, row)); window[4] = m.get(Point(1, row + 1)); tmp.set(Point(0, row), func(window.begin(), window.end())); } // Right edge for (unsigned int row = 1; row < nrows_m1; row++) { window[1] = window[4] = white(m); window[0] = m.get(Point(ncols_m2, row - 1)); window[2] = m.get(Point(ncols_m1, row)); window[3] = m.get(Point(ncols_m2, row + 1)); tmp.set(Point(ncols_m1, row), func(window.begin(), window.end())); } // Core of image for (unsigned int row = 1; row < nrows_m1; row++) { for (unsigned int col = 1; col < ncols_m1; col++) { // This may seem silly, but it's significantly faster than using // nine iterators window[0] = m.get(Point(col - 1, row - 1)); window[1] = m.get(Point(col + 1, row - 1)); window[2] = m.get(Point(col, row)); window[3] = m.get(Point(col - 1, row + 1)); window[4] = m.get(Point(col + 1, row + 1)); tmp.set(Point(col, row), func(window.begin(), window.end())); } } } /* Steps through the image using a 3x3 window, replacing the center pixel with a value determined by a given function. This version uses four surrounding pixels in the 3x3 window: # 0 ### 123 # 4 The temporary matrix required may be passed in to avoid reallocating for each pass of a multi-pass algorithm. (see erode) */ template void neighbor4o(const T& m, F& func, M& tmp) { if (m.nrows() < 3 || m.ncols() < 3) return; std::vector window(5); unsigned int nrows_m1 = m.nrows() - 1; unsigned int ncols_m1 = m.ncols() - 1; unsigned int nrows_m2 = m.nrows() - 2; unsigned int ncols_m2 = m.ncols() - 2; // It's kind of silly to special case corners and edges, but it's more // efficient than all of the if's one would have to do in the inner loop // Corners // Upper-left window[0] = window[1] = white(m); window[2] = m.get(Point(0, 0)); window[3] = m.get(Point(1, 0)); window[4] = m.get(Point(0, 1)); tmp.set(Point(0, 0), func(window.begin(), window.end())); // Upper-right window[1] = m.get(Point(ncols_m2, 0)); window[2] = m.get(Point(ncols_m1, 0)); window[3] = white(m); window[4] = m.get(Point(ncols_m1, 1)); tmp.set(Point(ncols_m1, 0), func(window.begin(), window.end())); // Lower-left window[0] = m.get(Point(0, nrows_m2)); window[2] = m.get(Point(0, nrows_m1)); window[3] = m.get(Point(1, nrows_m1)); window[1] = window[4] = white(m); tmp.set(Point(0, nrows_m1), func(window.begin(), window.end())); // Lower-right window[0] = m.get(Point(ncols_m1, nrows_m2)); window[1] = m.get(Point(ncols_m2, nrows_m1)); window[2] = m.get(Point(ncols_m1, nrows_m1)); window[3] = white(m); tmp.set(Point(ncols_m1, nrows_m1), func(window.begin(), window.end())); // Top edge for (unsigned int col = 1; col < ncols_m1; col++) { window[0] = white(m); window[1] = m.get(Point(col - 1, 0)); window[2] = m.get(Point(col, 0)); window[3] = m.get(Point(col + 1, 0)); window[4] = m.get(Point(col, 1)); tmp.set(Point(col, 0), func(window.begin(), window.end())); } // Bottom edge for (unsigned int col = 1; col < ncols_m1; col++) { window[4] = white(m); window[0] = m.get(Point(col, nrows_m2)); window[1] = m.get(Point(col - 1, nrows_m1)); window[2] = m.get(Point(col, nrows_m1)); window[3] = m.get(Point(col + 1, nrows_m1)); tmp.set(Point(col, nrows_m1), func(window.begin(), window.end())); } // Left edge for (unsigned int row = 1; row < nrows_m1; row++) { window[1] = white(m); window[0] = m.get(Point(0, row - 1)); window[2] = m.get(Point(0, row)); window[3] = m.get(Point(1, row)); window[4] = m.get(Point(0, row + 1)); tmp.set(Point(0, row), func(window.begin(), window.end())); } // Right edge for (unsigned int row = 1; row < nrows_m1; row++) { window[3] = white(m); window[0] = m.get(Point(ncols_m1, row - 1)); window[1] = m.get(Point(ncols_m2, row)); window[2] = m.get(Point(ncols_m1, row)); window[4] = m.get(Point(ncols_m1, row + 1)); tmp.set(Point(ncols_m1, row), func(window.begin(), window.end())); } // Core of image for (unsigned int row = 1; row < nrows_m1; row++) { for (unsigned int col = 1; col < ncols_m1; col++) { // This may seem silly, but it's significantly faster than using // nine iterators window[0] = m.get(Point(col, row - 1)); window[1] = m.get(Point(col - 1, row)); window[2] = m.get(Point(col, row)); window[3] = m.get(Point(col + 1, row)); window[4] = m.get(Point(col, row + 1)); tmp.set(Point(col, row), func(window.begin(), window.end())); } } } } #endif gamera-3.3.3/include/plugins/pagesegmentation.hpp0000644000076500000000000005761711652050140021123 0ustar chriswheel/* * * Copyright (C) 2007-2009 Stefan Ruloff, Maria Elhachimi, * Ilya Stoyanov, Robert Butz * 2010 Tobias Bolten * 2007-2011 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef cd20070814_pagesegmentation #define cd20070814_pagesegmentation #include #include #include #include #include #include #include #include "gamera.hpp" #include "gameramodule.hpp" #include "gamera_limits.hpp" #include "connected_components.hpp" #include "plugins/listutilities.hpp" #include "plugins/projections.hpp" #include "plugins/segmentation.hpp" #include "plugins/image_utilities.hpp" namespace Gamera { /* Function: median * Calculates the middle height of the CCs. * Used for setting defualt parameters in * runlength_smearing and projection_cutting */ int pagesegmentation_median_height(ImageList* ccs) { vector ccs_heights; ImageList::iterator i; if (ccs->empty()) { throw std::runtime_error("pagesegmentation_median_height: no CC's found in image."); } for (i = ccs->begin(); i != ccs->end(); ++i) { ccs_heights.push_back( (*i)->nrows() ); } return median(&ccs_heights); } /***************************************************************************** * Run Length Smearing * IN: Cx - Minimal length of white runs in the rows * Cy - Minimal length of white runs in the columns * Csm- Minimal length of white runs row-wise in the almost final image * * If you choose "-1" the algorithm will determine the * median character length in the image to obtain the values for Cx,Cy or * Csm. ******************************************************************************/ template ImageList* runlength_smearing(T &image, int Cx, int Cy, int Csm) { typedef OneBitImageView view_type; typedef OneBitImageData data_type; typedef typename T::value_type value_type; data_type* img1_data = new data_type(image.size(), image.origin()); view_type* img1 = new view_type(*img1_data); image_copy_fill(image, *img1); data_type* img2_data = new data_type(image.size(), image.origin()); view_type* img2 = new view_type(*img2_data); image_copy_fill(image, *img2); int Ctemp = 0; size_t nrows = image.nrows(); size_t ncols = image.ncols(); size_t x, y; value_type black_val = black(image); value_type white_val = white(image); // when no values given, guess them from the Cc size statistics if (Csm <= 0 || Cy <= 0 || Cx <= 0) { ImageList* ccs_temp = cc_analysis(image); int Median = pagesegmentation_median_height(ccs_temp); for (ImageList::iterator i = ccs_temp->begin(); i != ccs_temp->end(); i++) { delete *i; } delete ccs_temp; if (Csm <= 0) Csm = 3 * Median; if (Cy <= 0) Cy = 20 * Median; if (Cx <= 0) Cx = 20 * Median; } // horizontal smearing for (y = 0; y < nrows; ++y) { for (x = 0, Ctemp = 0; x < ncols; ++x) { if (is_white(image.get(Point(x, y)))) { Ctemp += 1; } else { if ((0 != Ctemp) && (Ctemp <= Cx)){ for (int z = 0; z < Ctemp; z++) { img1->set(Point(x-z-1, y), black_val); } } Ctemp = 0; } } } // vertical smearing for (x = 0; x < ncols; ++x) { for (y = 0, Ctemp = 0; y < nrows; ++y) { if (is_white(image.get(Point(x, y)))) { Ctemp += 1; } else { if ((0 != Ctemp) && (Ctemp <= Cy)) { for (int z = 0; z < Ctemp; z++) img2->set(Point(x, y-z-1), black_val); } Ctemp = 0; } } } // logical AND between both images for(y = 0; y < nrows; ++y) { for(x = 0; x < ncols; ++x) { if ((is_black(img1->get(Point(x, y)))) && (is_black(img2->get(Point(x, y))))){ img1->set(Point(x, y), black_val); } else { img1->set(Point(x, y), white_val); } } } // again horizontal smearing for removal of small holes for (y = 0; y < nrows; ++y) { for (x = 0, Ctemp = 0; x < ncols; ++x) { if (is_white(img1->get(Point(x, y)))) { Ctemp += 1; } else { if ((0 != Ctemp) && (Ctemp <= Csm)){ for (int z = 0; z < Ctemp; z++) img1->set(Point(x-z-1, y), black_val); } Ctemp = 0; } } } ImageList* ccs_AND = cc_analysis(*img1); ImageList* return_ccs = new ImageList(); // create result Cc's ImageList::iterator i; for (i = ccs_AND->begin(); i != ccs_AND->end(); ++i) { Cc* cc = dynamic_cast(*i); int label = cc->label(); bool containspixel = false; // some segments may not contain black pixels // Methods "get" and "set" operates relative to the image view // but the offset of the connected components is not relative // to the view. (here: (*i)->offset_x() and (*i)->offset_y()) // // This means that these values must be adjusted for labeling // the image view. for (y = 0; y < cc->nrows(); ++y) { for (x = 0; x < cc->ncols(); ++x) { if ( is_black(image.get(Point(x+(*i)->offset_x()-image.offset_x(), y+(*i)->offset_y()-image.offset_y()))) && is_black(cc->get(Point(x,y))) ) { image.set(Point(x + cc->offset_x() - image.offset_x(), y + cc->offset_y() - image.offset_y()), label); containspixel = true; } } } // create new CC with the dimensions, offset and label from the // smeared image, pointing to the original image. if (containspixel) { return_ccs->push_back(new ConnectedComponent( *((data_type*)image.data()), // Data label, // Label Point((*i)->offset_x(), (*i)->offset_y()), // Point (*i)->dim()) // Dim ); } } // clean up for (ImageList::iterator i=ccs_AND->begin(); i!=ccs_AND->end(); i++) delete *i; delete ccs_AND; delete img1->data(); delete img1; delete img2->data(); delete img2; return return_ccs; } /*------------------------------------------------------------------------- * Functions for projection_cutting: * Interne_RXY_Cut(image, Tx, Ty, ccs, noise, label):recursively splits * the image, sets the label and creates the CCs. * Start_point(image, ul, lr):search the upper_left point of the sub-image. * End_point(image,ul,lr):search the lower_right point of the sub-image. * Split_point:searchs the split point of the image * rxy_cut(image,Tx,Ty,noise,label):returns the ccs-list *-------------------------------------------------------------------------*/ /* Function: Start_Point * This funktion is used to search the first black pixel: * calculates the coordinates of the begin of the cc * returns the coordinates of the upper-left point of subimage */ template Point proj_cut_Start_Point(T& image, Point ul, Point lr) { Point Start; for (size_t y = ul.y(); y <= lr.y(); y++) { for (size_t x = ul.x(); x <= lr.x(); x++) { if ((image.get(Point(x, y))) != 0) { Start.x(x); Start.y(y); goto endLoop1; // unfortunately there is no break(2) in gorgeous C++ } } } endLoop1: for (size_t x = ul.x(); x <= lr.x(); x++) { for (size_t y = ul.y(); y <= lr.y(); y++) { if ((image.get(Point(x, y))) != 0) { if (Start.x() > x) Start.x(x); goto endLoop2; // unfortunately there is no break(2) in gorgeous C++ } } } endLoop2: return Start; } /* Function: End_Point * This funktion is used to search the last black pixel:the lower-right point * of subimage calculates the coordinates of the end of the CC. */ template Point proj_cut_End_Point(T& image, Point ul, Point lr) { Point End; size_t x, y; for (y = lr.y(); y+1 >= ul.y()+1; y--) { for (x = lr.x(); x+1 >= ul.x()+1; x--) { if ((image.get(Point(x, y))) != 0) { End.x(x); End.y(y); goto endLoop1; } } } endLoop1: for (x = lr.x(); x+1 > ul.x()+1; x--) { for (y = lr.y(); y+1 > ul.y()+1; y--) { if ((image.get(Point(x,y))) != 0){ if (End.x() IntVector * proj_cut_Split_Point(T& image, Point ul, Point lr, int Tx, int Ty, int noise, int gap_treatment, char direction ) { IntVector * SplitPoints = new IntVector(); //empty IntVector size_t size; lr.x()-ul.x()>lr.y()-ul.y()?size=lr.x()-ul.x():size=lr.y()-ul.y(); int SplitPoints_Min[size]; // probably no need for such big mem-alloc, but necessary in certain situations int SplitPoints_Max[size]; int gap_width = 0; // width of the gap int gap_counter = 0; //number of gaps if (direction == 'x'){ // Correct Points for Rect() with offset Point a( ul.x() + image.offset_x(), ul.y() + image.offset_y() ); Point b( lr.x() + image.offset_x(), lr.y() + image.offset_y() ); IntVector *proj_x = projection_rows(image, Rect(a, b)); SplitPoints->push_back(ul.y()); // starting point for (size_t i = 1; i < proj_x->size(); i++) { if ((*proj_x)[i] <= noise) { gap_width++; if (Ty <= gap_width) {// min-gap <= act-gap? SplitPoints_Min[gap_counter] = (i + ul.y() - gap_width+1); SplitPoints_Max[gap_counter] = (i + ul.y()); // finally set to last point of gap } } else { if (Ty <= gap_width) gap_counter++; gap_width = 0; } } delete proj_x; } else{ // y-direction // Correct Points for Rect() with offset Point a( ul.x() + image.offset_x(), ul.y() + image.offset_y() ); Point b( lr.x() + image.offset_x(), lr.y() + image.offset_y() ); IntVector *proj_y = projection_cols(image, Rect(a, b)); SplitPoints->push_back(ul.x()); // starting point for (size_t i = 1; i < proj_y->size(); i++) { if ((*proj_y)[i] <= noise) { gap_width++; if (Tx <= gap_width) {// min-gap <= act-gap? SplitPoints_Min[gap_counter] = (i + ul.x() - gap_width+1); SplitPoints_Max[gap_counter] = (i + ul.x()); // finally set to last point of gap } } else { if (Tx <= gap_width) gap_counter++; gap_width = 0; } } delete proj_y; } for (int i=0; i no unlabeled noise pixels int mid = (SplitPoints_Min[i] + SplitPoints_Max[i]) / 2; SplitPoints_Min[i] = mid; SplitPoints_Max[i] = mid; } SplitPoints->push_back(SplitPoints_Min[i]); SplitPoints->push_back(SplitPoints_Max[i]); } direction=='x'? SplitPoints->push_back(lr.y()): SplitPoints->push_back(lr.x()); // ending point return SplitPoints; } /* Function: Interne_RXY_Cut * This function recursively splits the image in horizontal or * vertical direction. * The original image will have all of its pixels "labeled" with a number * representing each connected component. */ template void projection_cutting_intern(T& image, Point ul, Point lr, ImageList* ccs, int Tx, int Ty, int noise, int gap_treatment, char direction, int& label) { Point Start = proj_cut_Start_Point(image, ul, lr); Point End = proj_cut_End_Point(image, ul, lr); IntVector * SplitPoints = proj_cut_Split_Point(image, Start, End, Tx, Ty, noise, gap_treatment, direction); IntVector::iterator It; ul.x(Start.x()); ul.y(Start.y()); lr.x(End.x()); lr.y(End.y()); if (!(direction=='y' && SplitPoints->size() == 2)){ // ending condition, SplitPoints==2 => only Start- and Endpoint no gaps if (direction=='x'){ direction = 'y'; for(It = SplitPoints->begin(); It != SplitPoints->end(); It++){ Point begin, end; // note the lowercase of end, which is not End begin.x(Start.x()); begin.y(*It); It++; end.x(End.x()); end.y(*It); projection_cutting_intern(image, begin, end, ccs, Tx, Ty, noise, gap_treatment, direction, label); } } else { // direction==y direction = 'x'; for(It = SplitPoints->begin(); It != SplitPoints->end(); ++It){ Point begin, end; // note the lowercase of end, which is not End begin.x(*It); begin.y(Start.y()); It++; end.x(*It); end.y(End.y()); projection_cutting_intern(image, begin, end, ccs, Tx, Ty, noise, gap_treatment, direction, label); } } } else { label++; for (size_t y = ul.y(); y <= lr.y(); y++) { for (size_t x = ul.x(); x <= lr.x(); x++) { if((image.get(Point(x, y))) != 0){ image.set(Point(x, y), label); } } } Point cc(Start.x() + image.offset_x(), Start.y() + image.offset_y()); ccs->push_back( new ConnectedComponent( *((typename T::data_type*)image.data()), OneBitPixel(label), cc, Dim((End.x() - Start.x() + 1), (End.y() - Start.y() + 1)) ) ); } delete SplitPoints; } /* * Function: rxy_cut * Returns a list of ccs found in the image. */ template ImageList* projection_cutting(T& image, int Tx, int Ty, int noise, int gap_treatment) { int Label = 1; char direction = 'x'; if (noise < 0) { noise = 0; } // set default values if (Tx < 1 || Ty < 1) { ImageList* ccs_temp = cc_analysis(image); int Median = pagesegmentation_median_height(ccs_temp); for (ImageList::iterator i = ccs_temp->begin(); i != ccs_temp->end(); i++) { delete *i; } delete ccs_temp; if (Tx < 1) { Tx = Median * 7; } if (Ty < 1) { if (Median > 1) Ty = Median / 2; else Ty = 1; } } // set minimal gap_width /*if (Tx <= 2){ if (gap_treatment) Tx=2; else Tx=3; } if (Ty <= 2){ if (gap_treatment) Ty=2; else Ty=3; }*/ ImageList* ccs = new ImageList(); Point ul, lr; ul.x(0); ul.y(0); lr.x(image.ncols() - 1); lr.y(image.nrows() - 1); projection_cutting_intern(image, ul, lr, ccs, Tx, Ty, noise, gap_treatment, direction, Label); return ccs; } /* sub_cc_analysis @param cclist The list of CCs inside the image @return A tuple with two values 1. the image with the new labels from the new CCs 2. a list of ImageLists a list-entry is a cc_analysis of a cclist from the argument */ template PyObject* sub_cc_analysis(T& image, ImageVector &cclist) { unsigned int pos; int label = 2; // one is reserved for unlabeled pixels OneBitImageData *ret_image; OneBitImageView *ret_view; OneBitImageData *temp_image; OneBitImageView *temp_view; Cc* cc; ImageVector::iterator iv; ImageList::iterator il; typename T::value_type Black = black(image); ret_image = new OneBitImageData(image.dim(), image.origin()); ret_view = new OneBitImageView(*ret_image, image.origin(), image.dim()); temp_image = new OneBitImageData(image.dim(), image.origin()); temp_view = new OneBitImageView(*temp_image, image.origin(), image.dim()); // Generate a list to store the CCs of all lines PyObject *return_cclist = PyList_New(cclist.size()); for (iv = cclist.begin(), pos = 0; iv != cclist.end(); iv++, pos++) { cc = static_cast(iv->first); // copy the needed CC from the original image(image) // to the temporary image temp_view for (size_t y = 0; y < cc->nrows(); y++) { for (size_t x = 0; x < cc->ncols(); x++) { if (!is_white(cc->get(Point(x, y)))) { temp_view->set(Point(x+cc->offset_x()-temp_view->offset_x(), y+cc->offset_y()-temp_view->offset_y()), Black); } } } // generate a temp image for the cc_analysis, // it's simply a copy of one cclist entry OneBitImageView *cc_temp = new OneBitImageView(*temp_image, cc->origin(), cc->dim() ); // Cc_analysis of one list entry ImageList* ccs_orig = cc_analysis(*cc_temp); ImageList* return_ccs = new ImageList(); il = ccs_orig->begin(); while (il != ccs_orig->end()) { cc = static_cast(*il); return_ccs->push_back( new ConnectedComponent( *((typename T::data_type*)ret_view->data()), OneBitPixel(label), cc->origin(), cc->dim() ) ); // Copy CC over to return image for (size_t y = 0; y < cc->nrows(); y++) { for (size_t x = 0; x < cc->ncols(); x++) { if (!is_white(cc->get(Point(x, y)))) { ret_view->set(Point(x+cc->offset_x()-ret_view->offset_x(), y+cc->offset_y()-ret_view->offset_y()), label); } } } // delete the temporary used CCs from the cc_analysis delete *il; il++; label++; // we use consecutive labels in return image } // remove copy of Cc in temporary image and clean up fill_white(*cc_temp); delete ccs_orig; delete cc_temp; // Set the Imagelist into the PyList // ImageList must be converted to be a valid datatype for the PyList PyList_SetItem(return_cclist, pos, ImageList_to_python(return_ccs)); delete return_ccs; } // delete temporary image delete temp_view; delete temp_image; // Finaly create the return type, a tuple with a image // and a list of ImageLists PyObject *return_values = PyTuple_New(2); PyTuple_SetItem(return_values, 0, create_ImageObject(ret_view)); PyTuple_SetItem(return_values, 1, return_cclist); return return_values; } // // evaluation of segmentation // // for distinguishing Ccs from Gccs and Sccs class CcLabel { public: char image; // 'G' or 'S' int cclabel; CcLabel(char i, int c) {image = i; cclabel = c;} friend int operator<(const CcLabel& c1, const CcLabel& c2) { if (c1.image == c2.image) return (c1.cclabel < c2.cclabel); else return c1.image < c2.image; } }; // the plugin function template IntVector* segmentation_error(T &Gseg, U &Sseg) { ImageList* Gccs = ccs_from_labeled_image(Gseg); ImageList* Sccs = ccs_from_labeled_image(Sseg); ImageList::iterator ccs_it; size_t x,y; int classlabel, Gclasslabel, Sclasslabel; CcLabel Gcclabel('G',0), Scclabel('S',0), cclabel('A',0); map classoflabel; // cclabel -> classlabel multimap labelsofclass; // classlabel -> cclabel typedef multimap::iterator mm_iterator; mm_iterator mmit; pair fromto; vector tmplabels; vector::iterator vit; // check for overlaps from Gseg for (ccs_it = Gccs->begin(), classlabel = 0; ccs_it != Gccs->end(); ++ccs_it, ++classlabel) { Gclasslabel = classlabel; Cc* cc = static_cast(*ccs_it); Gcclabel.cclabel = cc->label(); classoflabel[Gcclabel] = Gclasslabel; labelsofclass.insert(make_pair(Gclasslabel,Gcclabel)); for (y=0; y < cc->nrows(); y++) for (x=0; x < cc->ncols(); x++) { Scclabel.cclabel = Sseg.get(Point(cc->ul_x() + x, cc->ul_y() + y)); // in case of overlap: if (Scclabel.cclabel) { // check whether segment from S is new if (classoflabel.find(Scclabel) == classoflabel.end()) { classoflabel[Scclabel] = Gclasslabel; labelsofclass.insert(make_pair(Gclasslabel,Scclabel)); } else { Sclasslabel = classoflabel[Scclabel]; if (Sclasslabel != Gclasslabel) { // unite both classes, i.e. move Sclasslabel into Gclasslabel tmplabels.clear(); fromto = labelsofclass.equal_range(Sclasslabel); for (mmit = fromto.first; mmit != fromto.second; ++mmit) { cclabel = mmit->second; classoflabel[cclabel] = Gclasslabel; tmplabels.push_back(cclabel); } labelsofclass.erase(Sclasslabel); for (vit = tmplabels.begin(); vit != tmplabels.end(); ++vit) labelsofclass.insert(make_pair(Gclasslabel,*vit)); } } } } } // check for CCs from Sseg without overlap (false positives) for (ccs_it = Sccs->begin(); ccs_it != Sccs->end(); ++ccs_it) { Cc* cc = static_cast(*ccs_it); Scclabel.cclabel = cc->label(); if (classoflabel.find(Scclabel) == classoflabel.end()) { classlabel++; classoflabel[Scclabel] = classlabel; labelsofclass.insert(make_pair(classlabel,Scclabel)); } } // build up class population numbers and classify error types int n1,n2,n3,n4,n5,n6,nG,nS; n1 = n2 = n3 = n4 = n5 = n6 = 0; for (mmit = labelsofclass.begin(); mmit != labelsofclass.end(); ) { nG = nS = 0; fromto = labelsofclass.equal_range(mmit->first); for (mmit = fromto.first; mmit != fromto.second; ++mmit) { if (mmit->second.image == 'G') nG++; else nS++; } // determine error category if (nG == 1 && nS == 1) n1++; else if (nG == 1 && nS == 0) n2++; else if (nG == 0 && nS == 1) n3++; else if (nG == 1 && nS > 1) n4++; else if (nG > 1 && nS == 1) n5++; else if (nG > 1 && nS > 1) n6++; else printf("Plugin segment_error: empty equivalence" " constructed which should not happen\n"); } // clean up for (ccs_it = Sccs->begin(); ccs_it != Sccs->end(); ++ccs_it) delete *ccs_it; delete Sccs; for (ccs_it = Gccs->begin(); ccs_it != Gccs->end(); ++ccs_it) delete *ccs_it; delete Gccs; // build return value IntVector* errors = new IntVector(); errors->push_back(n1); errors->push_back(n2); errors->push_back(n3); errors->push_back(n4); errors->push_back(n5); errors->push_back(n6); return errors; } } // end of namespace Gamera #endif gamera-3.3.3/include/plugins/png_support.hpp0000644000076500000000000003223711652050140020140 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, * and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Resolution support graciously donated by Damon Li. */ #ifndef mgd_png_support #define mgd_png_support #include #include #include "image_utilities.hpp" // TODO: Get/Save resolution information using namespace Gamera; #define PNG_BYTES_TO_CHECK 8 #define METER_PER_INCH 0.0254 void PNG_info_specific(const char* filename, FILE* & fp, png_structp& png_ptr, png_infop& info_ptr, png_infop& end_info, png_uint_32& width, png_uint_32& height, int& bit_depth, int& color_type, double& x_resolution, double& y_resolution) { fp = fopen(filename, "rb"); if (!fp) throw std::invalid_argument("Failed to open image"); // Check if a PNG file char buf[PNG_BYTES_TO_CHECK]; if (fread(buf, 1, PNG_BYTES_TO_CHECK, fp) != PNG_BYTES_TO_CHECK) { fclose(fp); throw std::runtime_error("Image file too small"); } if (png_sig_cmp((png_byte*)buf, 0, PNG_BYTES_TO_CHECK)) { fclose(fp); throw std::runtime_error("Not a PNG file"); } png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, (png_voidp)NULL, NULL, NULL); if (!png_ptr) { fclose(fp); throw std::runtime_error("Could not read PNG header"); } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); fclose(fp); throw std::runtime_error("Could not read PNG info"); } end_info = png_create_info_struct(png_ptr); if (!end_info) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); fclose(fp); throw std::runtime_error("Could not read PNG info"); } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(fp); throw std::runtime_error("error in reading PNG header"); } png_set_sig_bytes(png_ptr, PNG_BYTES_TO_CHECK); // Initialize IO png_init_io(png_ptr, fp); // Read in info png_read_info(png_ptr, info_ptr); int dummy; png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &dummy, &dummy, &dummy); //Damon x_resolution = (double)png_get_x_pixels_per_meter(png_ptr, info_ptr) * METER_PER_INCH; y_resolution = (double)png_get_y_pixels_per_meter(png_ptr, info_ptr) * METER_PER_INCH; //Damon: end } void PNG_close(FILE* fp, png_structp png_ptr, png_infop info_ptr, png_infop end_info) { // As PNG_close() might be called when png_read_image() has not yet been // used (premature termination), png_read_end() might crash. // We therefore omit the call to png_read_end(), as we are not // interested in the comment texts following the image data anyway. //png_read_end(png_ptr, end_info); png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(fp); } ImageInfo* PNG_info(char* filename) { FILE* fp; png_structp png_ptr; png_infop info_ptr, end_info; png_uint_32 width, height; int bit_depth, color_type; double x_resolution, y_resolution; PNG_info_specific(filename, fp, png_ptr, info_ptr, end_info, width, height, bit_depth, color_type, x_resolution, y_resolution); ImageInfo* info = new ImageInfo(); try { // Copy to our own ImageInfo object info->m_nrows = height; info->m_ncols = width; info->m_depth = bit_depth; info->m_x_resolution = x_resolution; info->m_y_resolution = y_resolution; if (color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) info->m_ncolors = 3; else if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) info->m_ncolors = 1; } catch (std::exception e) { delete info; throw; } // PNG_close(fp, png_ptr, info_ptr, end_info); return info; } template void load_PNG_simple(T& image, png_structp& png_ptr) { typename T::row_iterator r = image.row_begin(); for (; r != image.row_end(); ++r) png_read_row(png_ptr, (png_bytep)(&(*r)), NULL); } template void load_PNG_onebit(T& image, png_structp& png_ptr) { png_set_invert_mono(png_ptr); #if PNG_LIBPNG_VER > 10399 png_set_expand_gray_1_2_4_to_8(png_ptr); #else png_set_gray_1_2_4_to_8(png_ptr); #endif png_bytep row = new png_byte[image.ncols()]; try { typename T::row_iterator r = image.row_begin(); for (; r != image.row_end(); ++r) { png_read_row(png_ptr, row, NULL); png_bytep from = row; typename T::col_iterator c = r.begin(); for (; c != r.end(); ++c, ++from) { if (*from) c.set(pixel_traits::black()); else c.set(pixel_traits::white()); } } } catch (std::exception e) { delete[] row; throw; } delete[] row; } Image* load_PNG(const char* filename, int storage) { FILE* fp; png_structp png_ptr; png_infop info_ptr, end_info; png_uint_32 width, height; int bit_depth, color_type; double x_resolution, y_resolution; PNG_info_specific(filename, fp, png_ptr, info_ptr, end_info, width, height, bit_depth, color_type, x_resolution, y_resolution); // libpng exception handling if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(fp); throw std::runtime_error("error in reading PNG data"); } //Damon double reso = (x_resolution + y_resolution) / 2.0; //Damon: end // if (color_type & PNG_COLOR_MASK_ALPHA) png_set_strip_alpha(png_ptr); if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_PALETTE || color_type == PNG_COLOR_TYPE_RGB_ALPHA) { if (storage == RLE) { PNG_close(fp, png_ptr, info_ptr, end_info); throw std::runtime_error("Pixel type must be OneBit to use RLE data."); } if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); typedef TypeIdImageFactory fact; fact::image_type* image = fact::create(Point(0, 0), Dim(width, height)); load_PNG_simple(*image, png_ptr); //Damon image->resolution(reso); //Damon: end PNG_close(fp, png_ptr, info_ptr, end_info); return image; } else if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { if (bit_depth == 1) { if (storage == DENSE) { typedef TypeIdImageFactory fact; fact::image_type* image = fact::create(Point(0, 0), Dim(width, height)); load_PNG_onebit(*image, png_ptr); //Damon image->resolution(reso); //Damon: end PNG_close(fp, png_ptr, info_ptr, end_info); return image; } else { typedef TypeIdImageFactory fact; fact::image_type* image = fact::create(Point(0, 0), Dim(width, height)); load_PNG_onebit(*image, png_ptr); //Damon image->resolution(reso); //Damon: end PNG_close(fp, png_ptr, info_ptr, end_info); return image; } } else if (bit_depth <= 8) { if (storage == RLE) { PNG_close(fp, png_ptr, info_ptr, end_info); throw std::runtime_error("Pixel type must be OneBit to use RLE data."); } if (bit_depth < 8) { #if PNG_LIBPNG_VER > 10399 png_set_expand_gray_1_2_4_to_8(png_ptr); #else png_set_gray_1_2_4_to_8(png_ptr); #endif } typedef TypeIdImageFactory fact_type; fact_type::image_type* image = fact_type::create(Point(0, 0), Dim(width, height)); load_PNG_simple(*image, png_ptr); //Damon image->resolution(reso); //Damon: end PNG_close(fp, png_ptr, info_ptr, end_info); return image; } else if (bit_depth == 16) { if (storage == RLE) { PNG_close(fp, png_ptr, info_ptr, end_info); throw std::runtime_error("Pixel type must be OneBit to use RLE data."); } typedef TypeIdImageFactory fact_type; fact_type::image_type* image = fact_type::create(Point(0, 0), Dim(width, height)); load_PNG_simple(*image, png_ptr); //Damon image->resolution(reso); //Damon: end PNG_close(fp, png_ptr, info_ptr, end_info); return image; } } PNG_close(fp, png_ptr, info_ptr, end_info); throw std::runtime_error("PNG file is an unsupported type"); } template struct PNG_saver { template void operator()(T& image, png_structp png_ptr) { typename T::row_iterator r = image.row_begin(); for (; r != image.row_end(); ++r) png_write_row(png_ptr, (png_bytep)(&(*r))); } }; template<> struct PNG_saver { template void operator()(T& image, png_structp png_ptr) { png_bytep row = new png_byte[image.ncols()]; try { typename T::row_iterator r = image.row_begin(); for (; r != image.row_end(); ++r) { png_bytep from = row; typename T::col_iterator c = r.begin(); for (; c != r.end(); ++c, ++from) { if (is_black(c.get())) *from = 0; else *from = 255; } png_write_row(png_ptr, row); } } catch (std::exception e) { delete[] row; throw; } delete[] row; } }; template<> struct PNG_saver { template void operator()(T& image, png_structp png_ptr) { FloatPixel max = 0; max = find_max(image.parent()); if (max > 0) max = 255.0 / max; else max = 0; png_bytep row = new png_byte[image.ncols()]; try { typename T::row_iterator r = image.row_begin(); for (; r != image.row_end(); ++r) { png_bytep from = row; typename T::col_iterator c = r.begin(); for (; c != r.end(); ++c, ++from) { *from = (png_byte)(*c * max); } png_write_row(png_ptr, row); } } catch (std::exception e) { delete[] row; throw; } delete[] row; } }; template<> struct PNG_saver { template void operator()(T& image, png_structp png_ptr) { ComplexPixel temp = find_max(image.parent()); FloatPixel max; if (temp.real() > 0) max = 255.0 / temp.real(); else max = 0; png_bytep row = new png_byte[image.ncols()]; try { typename T::row_iterator r = image.row_begin(); for (; r != image.row_end(); ++r) { png_bytep from = row; typename T::col_iterator c = r.begin(); for (; c != r.end(); ++c, ++from) { *from = (png_byte)((*c).real() * max); } png_write_row(png_ptr, row); } } catch (std::exception e) { delete[] row; throw; } delete[] row; } }; template<> struct PNG_saver { template void operator()(T& image, png_structp png_ptr) { png_bytep row = new png_byte[image.ncols() * 2]; try { typename T::row_iterator r = image.row_begin(); for (; r != image.row_end(); ++r) { typename T::col_iterator c = r.begin(); unsigned short* from = (unsigned short *)row; for (; c != r.end(); ++c, ++from) *from = (unsigned short)(*c && 0xffff); png_write_row(png_ptr, row); } } catch (std::exception e) { delete[] row; throw; } delete[] row; } }; template void save_PNG(T& image, const char* filename) { FILE* fp = fopen(filename, "wb"); if (!fp) throw std::invalid_argument("Failed to open image"); png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fclose(fp); throw std::runtime_error("Couldn't create PNG header"); } png_infop info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); fclose(fp); throw std::runtime_error("Couldn't create PNG header"); } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); throw std::runtime_error("Unknown PNG error"); } png_uint_32 width = image.ncols(); png_uint_32 height = image.nrows(); int bit_depth; if (image.depth() == 32) bit_depth = 16; else if (image.depth() == 64) bit_depth = 8; else if (image.depth() == 128) bit_depth = 8; else bit_depth = image.depth(); int color_type = (image.ncolors() == 3) ? PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_GRAY; png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); //Damon png_uint_32 res_x = (png_uint_32)(image.resolution() / METER_PER_INCH); png_uint_32 res_y = (png_uint_32)(image.resolution() / METER_PER_INCH); int unit_type = PNG_RESOLUTION_METER; png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type); //Damon:end png_init_io(png_ptr, fp); png_write_info(png_ptr, info_ptr); png_set_packing(png_ptr); PNG_saver saver; saver(image, png_ptr); png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); } #endif gamera-3.3.3/include/plugins/projections.hpp0000644000076500000000000001545011652050140020115 0ustar chriswheel/* * * Copyright (C) 2001-2005 * Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm02212003_projections #define kwm02212003_projections #include "gamera.hpp" namespace Gamera { #ifndef round template inline T round(T p){return T(floor(p + (T)0.5));} #endif /* Generic projection routine - x and y projections are acheived by passing in either row or col iterators. */ template inline IntVector* projection(T i, const T end) { IntVector* proj = new IntVector(end - i, 0); try { typename T::iterator j; typename IntVector::iterator p = proj->begin(); for (; i != end; ++i, ++p) { for (j = i.begin(); j != i.end(); ++j) { if (is_black(*j)) *p += 1; } } } catch (std::exception e) { delete proj; throw; } return proj; } /* Projection along the y axis (rows) of an image. */ template IntVector* projection_rows(const T& image) { return projection(image.row_begin(), image.row_end()); } /* Projection along the y axis (rows) of a portion on an image. NOTE: 'rect' must be absolute with respect to the underlying image data, *not* relative to the offset of the view 'image' */ template IntVector* projection_rows(const T& image, const Rect& rect) { T proj_image(image, rect); return projection_rows(proj_image); } /* Projection along the x axis (rows) of an image. MGD: Should be faster now because it accesses the image data in row-major order. */ template IntVector* projection_cols(const T& image) { IntVector* proj = new IntVector(image.ncols(), 0); try { for (size_t r = 0; r != image.nrows(); ++r) { for (size_t c = 0; c != image.ncols(); ++c) { if (is_black(image.get(Point(c, r)))) { (*proj)[c] += 1; } } } } catch (std::exception e) { delete proj; throw; } return proj; } /* Projection along the y axis (rows) of a portion on an image. NOTE: 'rect' must be absolute with respect to the underlying image data, *not* relative to the offset of the view 'image' */ template IntVector* projection_cols(const T& image, const Rect& rect) { T proj_image(image, rect); return projection_cols(proj_image); } /* Projections of strips of a image - the coordinates are relative to the view. */ template IntVector* yproj_vertical_strip(T& image, size_t offset_x, size_t width) { Rect r(Point(image.offset_x() + offset_x, image.offset_y()), Dim(width, image.nrows())); return projection_rows(image, r); } template IntVector* yproj_horizontal_strip(T& image, size_t offset_y, size_t height) { Rect r(Point(image.offset_x(), image.offset_y() + offset_y), Dim(image.ncols(), height)); return projection_rows(image, r); } template IntVector* xproj_vertical_strip(T& image, size_t offset_x, size_t width) { Rect r(Point(image.offset_x() + offset_x, image.offset_y()), Dim(width, image.nrows())); return projection_cols(image, r); } template IntVector* xproj_horizontal_strip(T& image, size_t offset_y, size_t height) { Rect r(Point(image.offset_x(), image.offset_y() + offset_y), Dim(image.ncols(), height)); return projection_cols(image, r); } /* returns y-projections of a rotated image */ template void projection_skewed_cols(const T& image, FloatVector* angles, std::vector& proj) { int x; size_t i; size_t n = angles->size(); FloatVector sina(n); FloatVector cosa(n); for (i = 0; i < n; i++) { sina[i] = sin((*angles)[i] * M_PI / 180.0); cosa[i] = cos((*angles)[i] * M_PI / 180.0); } for (i = 0; i < n; i++) proj[i] = new IntVector(image.ncols(), 0); // compute skewed projections simultanously for (size_t r = 0; r < image.nrows(); ++r) { for (size_t c = 0; c < image.ncols(); ++c) { if (is_black(image.get(Point(c, r)))) { for (i = 0; i < n; i++) { x = (int) round(c*cosa[i] - r*sina[i]); if ((x > 0) && (x < (int)image.ncols())) ++(*(proj[i]))[x]; } } } } } // The Python part template PyObject* projection_skewed_cols(const T& image, FloatVector* angles) { size_t n = angles->size(); std::vector proj(n); projection_skewed_cols(image, angles, proj); PyObject* projlist = PyList_New(n); // move projections to return list for (size_t i = 0; i < n; i++) { PyList_SET_ITEM(projlist, i, IntVector_to_python(proj[i])); delete proj[i]; } return projlist; } /* returns x-projections of a rotated image */ template void projection_skewed_rows(const T& image, FloatVector* angles, std::vector& proj) { int y; size_t i; size_t n = angles->size(); FloatVector sina(n); FloatVector cosa(n); for (i = 0; i < n; i++) { sina[i] = sin((*angles)[i] * M_PI / 180.0); cosa[i] = cos((*angles)[i] * M_PI / 180.0); } for (i = 0; i < n; i++) proj[i] = new IntVector(image.nrows(), 0); // compute skewed projections simultanously for (size_t r = 0; r < image.nrows(); ++r) { for (size_t c = 0; c < image.ncols(); ++c) { if (is_black(image.get(Point(c, r)))) { for (i = 0; i < n; i++) { y = (int) round(c*sina[i] + r*cosa[i]); if ((y > 0) && (y < (int)image.nrows())) ++(*(proj[i]))[y]; } } } } } // The Python part template PyObject* projection_skewed_rows(const T& image, FloatVector* angles) { size_t n = angles->size(); std::vector proj(n); projection_skewed_rows(image, angles, proj); PyObject* projlist = PyList_New(n); // move projections to return list for (size_t i = 0; i < n; i++) { PyList_SET_ITEM(projlist, i, IntVector_to_python(proj[i])); delete proj[i]; } return projlist; } } #endif gamera-3.3.3/include/plugins/runlength.hpp0000644000076500000000000005623711652050140017574 0ustar chriswheel/* * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm11052002_runlength #define kwm11052002_runlength #include "gamera.hpp" #include "python_iterator.hpp" #ifndef GAMERA_NO_PYTHON #include "Python.h" #endif #include #include #include #undef major #undef minor namespace Gamera { typedef std::pair RunPair; typedef std::vector RunVector; /////////////////////////////////////////////////////////////////////////// // These classes manage the two dimensions on which most of the // functions in this modules are parameterized: color and direction. // These parameters are templatized types in most functions. namespace runs { class White { public: template inline bool is_self(const T& v) const { return is_white(v); } template inline bool is_other(const T& v) const { return is_black(v); } template inline typename T::value_type self(const T& v) const { return white(v); } template inline typename T::value_type other(const T& v) const { return black(v); } }; class Black { public: template inline bool is_self(const T& v) const { return is_black(v); } template inline bool is_other(const T& v) const { return is_white(v); } template inline typename T::value_type self(const T& v) const { return black(v); } template inline typename T::value_type other(const T& v) const { return white(v); } }; inline Black get_other_color(const White& color) { return Black(); } inline White get_other_color(const Black& color) { return White(); } class Horizontal { public: template inline typename T::const_row_iterator begin(const T& image) const { return image.row_begin(); } template inline typename T::const_row_iterator end(const T& image) const { return image.row_end(); } template inline typename T::row_iterator begin(T& image) const { return image.row_begin(); } template inline typename T::row_iterator end(T& image) const { return image.row_end(); } template size_t major(const T& image) const { return image.nrows(); } template size_t minor(const T& image) const { return image.ncols(); } }; class Vertical { public: template inline typename T::const_col_iterator begin(const T& image) const { return image.col_begin(); } template inline typename T::const_col_iterator end(const T& image) const { return image.col_end(); } template inline typename T::col_iterator begin(T& image) const { return image.col_begin(); } template inline typename T::col_iterator end(T& image) const { return image.col_end(); } template size_t major(const T& image) const { return image.ncols(); } template size_t minor(const T& image) const { return image.nrows(); } }; template class GetIterator { public: typedef typename T::vec_iterator iterator; typedef typename T::const_vec_iterator const_iterator; }; template class GetIterator { public: typedef typename T::col_iterator iterator; typedef typename T::const_col_iterator const_iterator; }; template class GetIterator { public: typedef typename T::row_iterator iterator; typedef typename T::const_row_iterator const_iterator; }; } /////////////////////////////////////////////////////////////////////////// // Finding the end of runs template inline void run_end(T& i, const T end, const Color& color) { for (; i != end; ++i) { if (color.is_other(*i)) break; } } /////////////////////////////////////////////////////////////////////////// // Find the length of the largest run in a a row // or column of a image. template inline size_t max_run(T i, const T end, const Color& color) { size_t max = 0; while (i != end) { if (color.is_self(*i)) { T last = i; run_end(i, end, color); size_t cur_length = i - last; if (cur_length > max) max = cur_length; } else { run_end(i, end, color); } } return max; } /////////////////////////////////////////////////////////////////////////// // Run-length histograms. These make a histogram of the lenght of the // runs in an image. They take an iterator range and a random-access // container for the result (that should be appropriately sized). The // histogram vector is not filled with zeros so that successive calls // can be made to this algorithm with the same vector to do the // histogram of an entire image. KWM template struct SortBySecondFunctor { bool operator()(const T& a, const T& b) { if (a.second == b.second) return a.first < b.first; return a.second >= b.second; } }; RunVector* _sort_run_results(IntVector* hist) { RunVector* runs = new RunVector(hist->size()); try { for (size_t i = 0; i < hist->size(); ++i) { (*runs)[i].first = i; (*runs)[i].second = (*hist)[i]; } SortBySecondFunctor func; std::sort(runs->begin(), runs->end(), func); } catch (std::exception e) { delete runs; throw; } return runs; } PyObject* _run_results_to_python(RunVector* runs, long n) { if ((n < 0) || (n > (long)runs->size())) n = (long)runs->size(); PyObject* result = PyList_New(n); for (long i = 0; i < n; ++i) { PyObject* tuple = Py_BuildValue(CHAR_PTR_CAST "ii", (*runs)[i].first, (*runs)[i].second); PyList_SET_ITEM(result, i, tuple); } delete runs; return result; } template inline void run_histogram(T i, const T end, Vec& hist, const Color& color) { while (i != end) { if (color.is_self(*i)) { T last = i; run_end(i, end, color); size_t cur_length = i - last; hist[cur_length]++; } else { run_end(i, end, get_other_color(color)); } } } /* Horizontal run histograms and vertical run histograms use an entirely different algorithm, for efficiency reasons. These are handled by the overloading on the direction parameter. */ template IntVector* run_histogram(const T& image, const Color& color, const runs::Horizontal& direction) { typedef typename runs::GetIterator::const_iterator iterator; IntVector* hist = new IntVector(image.ncols() + 1, 0); try { iterator end = direction.end(image); for (iterator i = direction.begin(image); i != end; ++i) run_histogram(i.begin(), i.end(), *hist, color); } catch (std::exception e) { delete hist; throw; } return hist; } template IntVector* run_histogram(const T& image, const Color& color, const runs::Vertical& direction) { // MGD: Changed so data is accessed in row-major order. This should make things // much faster. typedef typename runs::GetIterator::const_iterator iterator; IntVector* hist = new IntVector(image.nrows() + 1, 0); IntVector tmp(image.ncols(), 0); try { for (size_t r = 0; r != image.nrows(); ++r) { for (size_t c = 0; c != image.ncols(); ++c) { if (color.is_self(image.get(Point(c, r)))) { tmp[c]++; } else { if (tmp[c] > 0) { (*hist)[tmp[c]]++; tmp[c] = 0; } } } } } catch (std::exception e) { delete hist; throw; } return hist; } template IntVector* run_histogram(const T& image, char* const& color_, char* const& direction_) { std::string color(color_); std::string direction(direction_); if (color == "black") { if (direction == "horizontal") { return run_histogram(image, runs::Black(), runs::Horizontal()); } else if (direction == "vertical") { return run_histogram(image, runs::Black(), runs::Vertical()); } } else if (color == "white") { if (direction == "horizontal") { return run_histogram(image, runs::White(), runs::Horizontal()); } else if (direction == "vertical") { return run_histogram(image, runs::White(), runs::Vertical()); } } throw std::runtime_error("color must be either \"black\" or \"white\" and direction must be either \"horizontal\" or \"vertical\"."); } /////////////////////////////////////////////////////////////////////////// // Most frequent run(s) (basically returning a subset of a sorted histogram) template size_t most_frequent_run(const T& image, const Color& color, const Direction& direction) { IntVector* hist = run_histogram(image, color, direction); size_t result; try { result = std::max_element(hist->begin(), hist->end()) - hist->begin(); } catch (std::exception e) { delete hist; throw; } delete hist; return result; } template size_t most_frequent_run(const T& image, char* const& color_, char* const& direction_) { std::string color(color_); std::string direction(direction_); if (color == "black") { if (direction == "horizontal") { return most_frequent_run(image, runs::Black(), runs::Horizontal()); } else if (direction == "vertical") { return most_frequent_run(image, runs::Black(), runs::Vertical()); } } else if (color == "white") { if (direction == "horizontal") { return most_frequent_run(image, runs::White(), runs::Horizontal()); } else if (direction == "vertical") { return most_frequent_run(image, runs::White(), runs::Vertical()); } } throw std::runtime_error("color must be either \"black\" or \"white\" and direction must be either \"horizontal\" or \"vertical\"."); } template RunVector* most_frequent_runs(const T& image, const Color& color, const Direction& direction) { IntVector* hist = run_histogram(image, color, direction); RunVector* result = NULL; try { result = _sort_run_results(hist); } catch (std::exception e) { delete hist; throw; } delete hist; return result; } template RunVector* most_frequent_runs(const T& image, char* const& color_, char* const& direction_) { std::string color(color_); std::string direction(direction_); if (color == "black") { if (direction == "horizontal") { return most_frequent_runs(image, runs::Black(), runs::Horizontal()); } else if (direction == "vertical") { return most_frequent_runs(image, runs::Black(), runs::Vertical()); } } else if (color == "white") { if (direction == "horizontal") { return most_frequent_runs(image, runs::White(), runs::Horizontal()); } else if (direction == "vertical") { return most_frequent_runs(image, runs::White(), runs::Vertical()); } } throw std::runtime_error("color must be either \"black\" or \"white\" and direction must be either \"horizontal\" or \"vertical\"."); } template PyObject* most_frequent_runs(const T& image, long n, const Color& color, const Direction& direction) { RunVector* runs = most_frequent_runs(image, color, direction); PyObject* result; try { result = _run_results_to_python(runs, n); } catch (std::exception e) { delete runs; throw; } return result; } template PyObject* most_frequent_runs(const T& image, long n, char* const& color_, char* const& direction_) { std::string color(color_); std::string direction(direction_); if (color == "black") { if (direction == "horizontal") { return most_frequent_runs(image, n, runs::Black(), runs::Horizontal()); } else if (direction == "vertical") { return most_frequent_runs(image, n, runs::Black(), runs::Vertical()); } } else if (color == "white") { if (direction == "horizontal") { return most_frequent_runs(image, n, runs::White(), runs::Horizontal()); } else if (direction == "vertical") { return most_frequent_runs(image, n, runs::White(), runs::Vertical()); } } throw std::runtime_error("color must be either \"black\" or \"white\" and direction must be either \"horizontal\" or \"vertical\"."); } /////////////////////////////////////////////////////////////////////////// // Runlength filtering. // filter based on run-length template inline void filter_run(Iter i, const Iter end, const int min_length, const Functor& functor, const Color& color) { while (i != end) { if (color.is_self(*i)) { Iter last = i; run_end(i, end, color); if (functor(i - last, min_length)) std::fill(last, i, color.other(i)); } else { run_end(i, end, get_other_color(color)); } } } template inline void image_filter_long_run(Iter i, const Iter end, const int min_length, const Color& color) { for (; i != end; i++) filter_run(i.begin(), i.end(), min_length, std::greater(), color); } template inline void image_filter_short_run(Iter i, const Iter end, const int max_length, const Color& color) { for (; i != end; i++) filter_run(i.begin(), i.end(), max_length, std::less(), color); } template void filter_narrow_runs(T& image, size_t max_width, const Color& color) { image_filter_short_run(image.row_begin(), image.row_end(), max_width, color); } template void filter_narrow_runs(T& image, size_t max_width, char* const& color_) { std::string color(color_); if (color == "black") return filter_narrow_runs(image, max_width, runs::Black()); else if (color == "white") return filter_narrow_runs(image, max_width, runs::White()); throw std::runtime_error("color must be either \"black\" or \"white\"."); } template void filter_short_runs(T& image, size_t max_height, const Color& color) { image_filter_short_run(image.col_begin(), image.col_end(), max_height, color); } template void filter_short_runs(T& image, size_t max_width, char* const& color_) { std::string color(color_); if (color == "black") return filter_short_runs(image, max_width, runs::Black()); else if (color == "white") return filter_short_runs(image, max_width, runs::White()); throw std::runtime_error("color must be either \"black\" or \"white\"."); } template void filter_tall_runs(T& image, size_t min_height, const Color& color) { image_filter_long_run(image.col_begin(), image.col_end(), min_height, color); } template void filter_tall_runs(T& image, size_t max_width, char* const& color_) { std::string color(color_); if (color == "black") return filter_tall_runs(image, max_width, runs::Black()); else if (color == "white") return filter_tall_runs(image, max_width, runs::White()); throw std::runtime_error("color must be either \"black\" or \"white\"."); } template void filter_wide_runs(T& image, size_t min_width, const Color& color) { image_filter_long_run(image.row_begin(), image.row_end(), min_width, color); } template void filter_wide_runs(T& image, size_t max_width, char* const& color_) { std::string color(color_); if (color == "black") return filter_wide_runs(image, max_width, runs::Black()); else if (color == "white") return filter_wide_runs(image, max_width, runs::White()); throw std::runtime_error("color must be either \"black\" or \"white\"."); } /////////////////////////////////////////////////////////////////////////// // TO/FROM RLE #ifndef GAMERA_NO_PYTHON template std::string to_rle(const T& image) { // White first std::ostringstream oss; for (typename T::const_vec_iterator i = image.vec_begin(); i != image.vec_end(); /* deliberately blank */) { typename T::const_vec_iterator start; start = i; run_end(i, image.vec_end(), runs::White()); oss << int(i - start) << " "; start = i; run_end(i, image.vec_end(), runs::Black()); oss << int(i - start) << " "; } return oss.str(); } inline long next_number(char* &s) { // I would love to use istream::scan for this, but it's a GNU // extension. Plus, this is probably faster anyway, // since it's more naive. // Scan through whitespace (literally, non-numeric) while (true) { if ((*s >= 9 && *s <= 13) || *s == 32) ++s; else { if (*s >= '0' && *s <= '9') break; if (*s == '\0') return -1; throw std::invalid_argument("Invalid character in runlength string."); } } long number = 0; // Read in number for (; *s >= '0' && *s <= '9'; ++s) { number *= 10; number += *s - '0'; } return number; } template void from_rle(T& image, const char *runs) { // White first char *p = const_cast(runs); // Outside the loop since we need to do a check at the end for (typename T::vec_iterator i = image.vec_begin(); i != image.vec_end(); /* deliberately blank */) { // white long run; run = next_number(p); if (run < 0) throw std::invalid_argument("Image is too large for run-length data"); typename T::vec_iterator end = i + (size_t)run; if (end > image.vec_end()) throw std::invalid_argument("Image is too small for run-length data"); std::fill(i, end, white(image)); i = end; // black run = next_number(p); if (run < 0) throw std::invalid_argument("Image is too large for run-length data"); end = i + (size_t)run; if (end > image.vec_end()) throw std::invalid_argument("Image is too small for run-length data"); std::fill(i, end, black(image)); i = end; } } /////////////////////////////////////////////////////////////////////////// // Run iterators struct make_vertical_run { Rect operator() (const int start, const int end, const int column) { return Rect(Point(column, start), Point(column, end - 1)); } }; struct make_horizontal_run { Rect operator() (const int start, const int end, const int row) { return Rect(Point(start, row), Point(end - 1, row)); } }; template struct RowIterator : IteratorObject { typedef RowIterator SelfType; int init(Image& image) { m_offset_x = image.ul_x(); m_offset_y = image.ul_y(); m_it = m_begin = image.row_begin(); m_end = image.row_end(); return 1; } static PyObject* next(IteratorObject* self) { SelfType* so = (SelfType*)self; if (so->m_it == so->m_end) return NULL; RunIterator* iterator = iterator_new(); iterator->init(so->m_it.begin(), so->m_it.end(), (so->m_it - so->m_begin) + so->m_offset_y, so->m_offset_x); so->m_it++; return (PyObject*)iterator; } typename Image::row_iterator m_it, m_end, m_begin; size_t m_offset_x, m_offset_y; }; template struct ColIterator : IteratorObject { typedef ColIterator SelfType; int init(Image& image) { m_offset_x = image.ul_x(); m_offset_y = image.ul_y(); m_it = m_begin = image.col_begin(); m_end = image.col_end(); return 1; } static PyObject* next(IteratorObject* self) { SelfType* so = (SelfType*)self; if (so->m_it == so->m_end) return NULL; RunIterator* iterator = iterator_new(); iterator->init(so->m_it.begin(), so->m_it.end(), (so->m_it - so->m_begin) + so->m_offset_x, so->m_offset_y); so->m_it++; return (PyObject*)iterator; } typename Image::col_iterator m_it, m_end, m_begin; size_t m_offset_x, m_offset_y; }; template struct RunIterator : IteratorObject { typedef RunIterator SelfType; int init(Iterator begin, Iterator end, int sequence, size_t offset) { m_begin = m_it = begin; m_end = end; m_sequence = sequence; m_offset = offset; return 1; } static PyObject* next(IteratorObject* self) { SelfType* so = (SelfType*)self; PyObject* result = 0; while (so->m_it != so->m_end) { run_end(so->m_it, so->m_end, get_other_color(Color())); Iterator start = so->m_it; run_end(so->m_it, so->m_end, Color()); if (so->m_it - start > 0) { result = create_RectObject (RunMaker() ((start - so->m_begin) + so->m_offset, (so->m_it - so->m_begin) + so->m_offset, so->m_sequence)); break; } } return result; } Iterator m_begin, m_it, m_end; int m_sequence; size_t m_offset; }; template PyObject* iterate_runs(T& image, const Color& color, const runs::Horizontal& direction) { typedef RowIterator > Iterator; Iterator* iterator = iterator_new(); iterator->init(image); return (PyObject*)iterator; } template PyObject* iterate_runs(T& image, const Color& color, const runs::Vertical& direction) { typedef ColIterator > Iterator; Iterator* iterator = iterator_new(); iterator->init(image); return (PyObject*)iterator; } template PyObject* iterate_runs(T& image, char* const& color_, char* const& direction_) { std::string color(color_); std::string direction(direction_); if (color == "black") { if (direction == "horizontal") { return iterate_runs(image, runs::Black(), runs::Horizontal()); } else if (direction == "vertical") { return iterate_runs(image, runs::Black(), runs::Vertical()); } } else if (color == "white") { if (direction == "horizontal") { return iterate_runs(image, runs::White(), runs::Horizontal()); } else if (direction == "vertical") { return iterate_runs(image, runs::White(), runs::Vertical()); } } throw std::runtime_error("color must be either \"black\" or \"white\" and direction must be either \"horizontal\" or \"vertical\"."); } #endif // GAMERA_NOPYTHON } #endif gamera-3.3.3/include/plugins/segmentation.hpp0000644000076500000000000004767211652050140020266 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, * and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm05212002_segmentation #define kwm05212002_segmentation #include #include #include #include #include #include "gamera.hpp" #include "gamera_limits.hpp" #include "features.hpp" #include "image_utilities.hpp" #include "projections.hpp" /* Connected-component analysis (8-connected) This is the standard two-pass connected-component analysis algorithm that will work on any matrix regardless of the storage format but only for OneBit or floating-point pixels. The labeling works by setting the value in the matrix to the correct label (that is why OneBit matrices use unsigned shorts instead of some bit-packed format). This means that the number of components is limited by the size of the pixel type (65536 for unsigned shorts). Authors ------- Karl MacMillan adapted from OMR by Ichiro Fujinaga History ------- Started 6/8/01 KWM TODO ---- - This algorithm can be significantly faster when working on run-length data so an appropriate specialization should be made when run-length matrices are completed. */ namespace { /* This is a two-step connected-component labeling algorithm - the first step labels the pixel and the second pass reduces the number of labels to one per connected-component. The data necessary to form this second pass is stored in the equivalence and equiv_table objects. */ struct equivalence { equivalence(size_t l = 0, size_t e = 0) { label = l; equiv = e; } size_t label; size_t equiv; // for sorting by label bool operator<(const equivalence& other) const { return label < other.label; } bool operator==(const equivalence& other) const { return label == other.label && equiv == other.equiv; } }; struct equiv_table : public std::vector { equiv_table() : std::vector() { } // add an equivalence void add(size_t a, size_t b) { if (size() == 0 || (back().label != a || back().equiv != b)) { if (a < b) push_back(equivalence(a, b)); else push_back(equivalence(b, a)); } } }; } namespace Gamera { template ImageList* cc_analysis(T& image) { equiv_table eq; // get the max value that can be held in the matrix typename T::value_type max_value = std::numeric_limits::max(); // The first label we use is 2 to distinguish it from an unlabled black pixel typename T::value_type curr_label = 2; typename T::value_type W, NW, N, NE; ImageAccessor acc; typename T::Iterator row, col, lr, ul, above; lr = image.lowerRight(); ul = image.upperLeft(); // progress_bar.set_length(image.nrows() / 40); size_t i0 = 0; for (row = image.upperLeft(); row.y != lr.y; ++row.y, ++i0) { for (col = row; col.x != lr.x; ++col.x) { /* If this image has been labeled once already, it is necessary to start with all the pixels labeled with 1. */ if (acc(col) > 0) acc.set(1, col); if (acc(col) > 0) { W = NW = N = NE = 0; if (col.y != ul.y) { above = col; --above.y; N = acc(above); if (col.x != ul.x) { --above.x; NW = acc(above); ++above.x; } ++above.x; if (above.x != lr.x) NE = acc(above); } if (col.x != ul.x) W = acc(col - Diff2D(1, 0)); if (W == 0) W = max_value; if (NW == 0) NW = max_value; if (N == 0) N = max_value; if (NE == 0) NE = max_value; typename T::value_type smallest_label = max_value; if (smallest_label > W ) smallest_label = W; if (smallest_label > NW) smallest_label = NW; if (smallest_label > N ) smallest_label = N; if (smallest_label > NE) smallest_label = NE; if (smallest_label == max_value) { // new object found! acc.set(curr_label, col); if (curr_label == max_value) { throw std::range_error("Max label exceeded - change OneBitPixel type in pixel.hpp"); } curr_label++; } else { acc.set(smallest_label, col); // adjust equiv_table if necessary if (W == max_value) W = 0; if (NW == max_value) NW = 0; if (N == max_value) N = 0; if (NE == max_value) NE = 0; if (W && W != smallest_label) eq.add(smallest_label, W); if (NW && NW != smallest_label) eq.add(smallest_label, NW); if (N && N != smallest_label) eq.add(smallest_label, N); if (NE && NE != smallest_label) eq.add(smallest_label, NE); } } } // if ((i0 % 20) == 0) // progress_bar.step(); } /* labels size can be curr_label because curr_label is always the next label - i.e. it is currently unused */ std::vector labels(curr_label); for (size_t i = 0; i < labels.size(); i++) labels[i] = i; // sort by label std::sort(eq.begin(), eq.end()); // resolve the equivalences for (size_t i = 1; i < eq.size(); i++) { size_t x = eq[i].label; size_t y = eq[i].equiv; if (labels[y] > labels[x]) { if (labels[y] != y) labels[labels[y]] = labels[x]; labels[y] = labels[x]; } else if (labels[y] < labels[x]) { if (labels[labels[y]] < labels[x]) labels[x] = labels[labels[y]]; else labels[x] = labels[y]; } } bool swapped = true; while (swapped) { swapped = false; for (size_t i = 0; i < eq.size(); i++) { size_t x = eq[i].label; size_t y = eq[i].equiv; if (labels[x] != labels[y]) { swapped = true; if (labels[x] < labels[y]) labels[y] = labels[x]; else labels[x] = labels[y]; } } } for (size_t i = 0; i < labels.size(); i++) if(labels[labels[i]] < labels[i]) labels[i] = labels[labels[i]]; /* Second Pass - relabel with equivalences and get bounding boxes This used to use a map, but I think that it is worth the memory use to use a vector for mapping the labels to the rects. The vector is a lot faster. */ ImageList* ccs = NULL; typedef std::vector map_type; map_type rects(labels.size(), 0); try { row = image.upperLeft(); for (size_t i = 0; i < image.nrows(); i++, ++row.y) { size_t j; for (j = 0, col = row; j < image.ncols(); j++, ++col.x) { // relabel acc.set(labels[acc(col)], col); // put bounding box in map typename T::value_type label = acc(col); if (label) { if (rects[label] == 0) { rects[label] = new Rect(Point(j, i), Dim(1, 1)); } else { if (j < rects[label]->ul_x()) rects[label]->ul_x(j); if (j > rects[label]->lr_x()) rects[label]->lr_x(j); if (i < rects[label]->ul_y()) rects[label]->ul_y(i); if (i > rects[label]->lr_y()) rects[label]->lr_y(i); } } } // if ((i % 20) == 0) // progress_bar.step(); } // create ConnectedComponents ccs = new ImageList(); try { for (size_t i = 0; i < rects.size(); ++i) { if (rects[i] != 0) { ccs->push_back(new ConnectedComponent(*((typename T::data_type*)image.data()), OneBitPixel(i), Point(rects[i]->offset_x() + image.offset_x(), rects[i]->offset_y() + image.offset_y()), rects[i]->dim())); delete rects[i]; } } } catch (std::exception e) { for (ImageList::iterator i = ccs->begin(); i != ccs->end(); ++i) delete *i; delete ccs; throw; } } catch (std::exception e) { for (size_t i = 0; i != rects.size(); ++i) delete rects[i]; } return ccs; } template inline void delete_connected_components(T* ccs) { for (typename T::iterator i = ccs->begin(); i != ccs->end(); ++i) delete *i; delete ccs; } namespace ccs { /* Connected-component filters for use with C++ - there are equivalent Python versions for use within the Python Gamera environment. Unlike the Python versions these are in-place. */ template void filter_wide(T& ccs, size_t max_width) { typename T::iterator i; for (i = ccs.begin(); i != ccs.end();) { if ((*i)->ncols() > max_width) { std::fill((*i)->vec_begin(), (*i)->vec_end(), 0); delete *i; ccs.erase(i++); } else { ++i; } } } template void filter_narrow(T& ccs, size_t min_width) { typename T::iterator i; for (i = ccs.begin(); i != ccs.end();) { if ((*i)->ncols() < min_width) { std::fill((*i)->vec_begin(), (*i)->vec_end(), 0); delete *i; ccs.erase(i++); } else { ++i; } } } template void filter_tall(T& ccs, size_t max_height) { typename T::iterator i; for (i = ccs.begin(); i != ccs.end();) { if ((*i)->nrows() > max_height) { std::fill((*i)->vec_begin(), (*i)->vec_end(), 0); delete *i; ccs.erase(i++); } else { ++i; } } } template void filter_short(T& ccs, size_t min_height) { typename T::iterator i; for (i = ccs.begin(); i != ccs.end();) { if ((*i)->nrows() < min_height) { std::fill((*i)->vec_begin(), (*i)->vec_end(), 0); delete *i; ccs.erase(i++); } else { ++i; } } } template void filter_large(T& ccs, size_t max_size) { typename T::iterator i; for (i = ccs.begin(); i != ccs.end();) { if ((*i)->nrows() > max_size && (*i)->ncols() > max_size) { std::fill((*i)->vec_begin(), (*i)->vec_end(), 0); delete *i; ccs.erase(i++); } else { ++i; } } } template void filter_small(T& ccs, size_t min_size) { typename T::iterator i; for (i = ccs.begin(); i != ccs.end();) { if ((*i)->nrows() < min_size && (*i)->ncols() < min_size) { std::fill((*i)->vec_begin(), (*i)->vec_end(), 0); delete *i; ccs.erase(i++); } else { ++i; } } } template void filter_black_area_large(T& ccs, int max_area) { typename T::iterator i; for (i = ccs.begin(); i != ccs.end();) { int bai = (int)black_area(**i); if (bai > max_area) { std::fill((*i)->vec_begin(), (*i)->vec_end(), 0); delete *i; ccs.erase(i++); } else { ++i; } } } template void filter_black_area_small(T& ccs, int min_area) { typename T::iterator i; for (i = ccs.begin(); i != ccs.end();) { int bai = (int)black_area(**i); if (bai < min_area) { std::fill((*i)->vec_begin(), (*i)->vec_end(), 0); delete *i; ccs.erase(i++); } else { ++i; } } } } size_t find_split_point(IntVector *projections, double& center) { double minimum = std::numeric_limits::max(); double middle = double(projections->size()) * center; size_t minimum_index = 0; size_t start = size_t(middle / 2); size_t end = size_t(((projections->size() - middle) / 2) + middle); for (size_t i=start; i != end; ++i) { double distance_from_middle = abs(middle - i); int value = (*projections)[i]; double score = value*value*2 + distance_from_middle*distance_from_middle; if (score < minimum) { minimum = score; minimum_index = i; } } if (minimum_index == 0) minimum_index = 1; else if (minimum_index == projections->size() - 1) minimum_index = projections->size() - 2; return minimum_index; } size_t find_split_point_max(IntVector *projections, double& center) { double minimum = std::numeric_limits::max(); double middle = double(projections->size()) * center; size_t minimum_index = 0; size_t start = size_t(middle / 2); size_t end = size_t(((projections->size() - middle) / 2) + middle); for (size_t i=start; i != end; ++i) { double distance_from_middle = abs(middle - i); int value = (*projections)[i]; double score = -(value*value*2) + distance_from_middle*distance_from_middle*distance_from_middle; if (score < minimum) { minimum = score; minimum_index = i; } } if (minimum_index == 0) minimum_index = 1; else if (minimum_index == projections->size() - 1) minimum_index = projections->size() - 2; return minimum_index; } template void split_error_cleanup(T* view, ImageList* splits, IntVector *projs, ImageList* ccs) { delete view->data(); delete view; for (ImageList::iterator i = splits->begin(); i != splits->end(); ++i) delete (*i); delete splits; if (projs != NULL) delete projs; if (ccs != NULL) { for (ImageList::iterator i = ccs->begin(); i != ccs->end(); ++i) delete (*i); delete ccs; } } template ImageList* splitx(T& image, FloatVector* center) { ImageList* splits = new ImageList(); typename ImageFactory::view_type* view = 0; ImageList* ccs = NULL; ImageList::iterator ccs_it; size_t last_split, new_split; if (image.ncols() <= 1) { view = simple_image_copy(T(image, image.origin(), image.dim())); splits->push_back(view); return splits; } sort(center->begin(), center->end()); IntVector *projs = projection_cols(image); last_split = 0; for (size_t i = 0; isize(); i++) { new_split = find_split_point(projs, (*center)[i]); if (new_split <= last_split) continue; view = simple_image_copy(T(image, Point(image.ul_x() + last_split, image.ul_y()), Dim(new_split - last_split, image.nrows()))); last_split = new_split; try { ccs = cc_analysis(*view); } catch (std::range_error x) { split_error_cleanup(view, splits, projs, ccs); throw x; } for (ccs_it = ccs->begin(); ccs_it != ccs->end(); ++ccs_it) splits->push_back(*ccs_it); delete view; delete ccs; } delete projs; view = simple_image_copy(T(image, Point(image.ul_x() + last_split, image.ul_y()), Dim(image.ncols() - last_split, image.nrows()))); try { ccs = cc_analysis(*view); } catch (std::range_error x) { split_error_cleanup(view, splits, NULL, ccs); throw x; } for (ccs_it = ccs->begin(); ccs_it != ccs->end(); ++ccs_it) splits->push_back(*ccs_it); delete view; delete ccs; return splits; } template ImageList* splitx_max(T& image, FloatVector* center) { ImageList* splits = new ImageList(); typename ImageFactory::view_type* view = 0; ImageList* ccs = NULL; ImageList::iterator ccs_it; size_t last_split, new_split; if (image.ncols() <= 1) { view = simple_image_copy(T(image, image.origin(), image.dim())); splits->push_back(view); return splits; } sort(center->begin(), center->end()); IntVector *projs = projection_cols(image); last_split = 0; for (size_t i = 0; isize(); i++) { new_split = find_split_point_max(projs, (*center)[i]); if (new_split <= last_split) continue; view = simple_image_copy(T(image, Point(image.ul_x()+last_split, image.ul_y()), Dim(new_split - last_split, image.nrows()))); last_split = new_split; try { ccs = cc_analysis(*view); } catch (std::range_error x) { split_error_cleanup(view, splits, projs, ccs); throw x; } for (ccs_it = ccs->begin(); ccs_it != ccs->end(); ++ccs_it) splits->push_back(*ccs_it); delete view; delete ccs; } delete projs; view = simple_image_copy(T(image, Point(image.ul_x() + last_split, image.ul_y()), Dim(image.ncols() - last_split, image.nrows()))); try { ccs = cc_analysis(*view); } catch (std::range_error x) { split_error_cleanup(view, splits, NULL, ccs); throw x; } for (ccs_it = ccs->begin(); ccs_it != ccs->end(); ++ccs_it) splits->push_back(*ccs_it); delete view; delete ccs; return splits; } template ImageList* splity(T& image, FloatVector* center) { ImageList* splits = new ImageList(); typename ImageFactory::view_type* view = 0; ImageList* ccs = NULL; ImageList::iterator ccs_it; size_t last_split, new_split; if (image.nrows() <= 1) { view = simple_image_copy(T(image, image.origin(), image.dim())); splits->push_back(view); return splits; } sort(center->begin(), center->end()); IntVector *projs = projection_rows(image); last_split = 0; for (size_t i = 0; isize(); i++) { new_split = find_split_point(projs, (*center)[i]); if (new_split <= last_split) continue; view = simple_image_copy(T(image, Point(image.ul_x(), image.ul_y()+last_split), Dim(image.ncols(), new_split - last_split))); last_split = new_split; try { ccs = cc_analysis(*view); } catch (std::range_error x) { split_error_cleanup(view, splits, projs, ccs); throw x; } for (ccs_it = ccs->begin(); ccs_it != ccs->end(); ++ccs_it) splits->push_back(*ccs_it); delete view; delete ccs; } delete projs; view = simple_image_copy(T(image, Point(image.ul_x(), image.ul_y() + last_split), Dim(image.ncols(), image.nrows() - last_split))); try { ccs = cc_analysis(*view); } catch (std::range_error x) { split_error_cleanup(view, splits, NULL, ccs); throw x; } for (ccs_it = ccs->begin(); ccs_it != ccs->end(); ++ccs_it) splits->push_back(*ccs_it); delete view; delete ccs; return splits; } } #endif gamera-3.3.3/include/plugins/string_io.hpp0000644000076500000000000001045111652050140017547 0ustar chriswheel/* * * Copyright (C) 2005 Alex Cobb * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "gamera.hpp" #ifndef arc24_feb_2005_io #define arc24_feb_2005_io using namespace Gamera; template PyObject* _to_raw_string(const T &image) { typedef typename T::value_type value_type; typename T::const_vec_iterator j = image.vec_begin(); size_t image_size = image.ncols() * image.nrows() * sizeof(value_type); PyObject* pystring = PyString_FromStringAndSize((char *)NULL, (int)image_size); if (pystring == NULL) return NULL; value_type* i = (value_type*)PyString_AS_STRING(pystring); for (; j != image.vec_end(); ++i, ++j) { *i = *j; } return pystring; }; template bool fill_image_from_string(T &image, PyObject* data_string) { if (!PyString_CheckExact(data_string)) { PyErr_SetString(PyExc_TypeError, "data_string must be a Python string"); return false; } char* s = PyString_AS_STRING(data_string); size_t length = PyString_GET_SIZE(data_string); typedef typename T::value_type value_type; size_t image_size = image.ncols() * image.nrows() * sizeof(value_type); if (length != image_size) { if (length > image_size) { PyErr_SetString(PyExc_ValueError, "data_string too long for image"); } else { PyErr_SetString(PyExc_ValueError, "data_string too short for image"); } return false; } typename T::vec_iterator i = image.vec_begin(); value_type* j = (value_type*)s; for (; i != image.vec_end(); ++i, ++j) { *i = *j; } return true; } Image* _from_raw_string(Point offset, Dim size, int pixel_type, int storage_format, PyObject* data_string) { if (pixel_type == ONEBIT && storage_format == RLE) { typedef TypeIdImageFactory factory; typedef factory::image_type image_type; image_type* image = factory::create(offset, size); if (fill_image_from_string(*image, data_string)) return image; } else if (pixel_type == ONEBIT && storage_format == DENSE) { typedef TypeIdImageFactory factory; typedef factory::image_type image_type; image_type* image = factory::create(offset, size); if (fill_image_from_string(*image, data_string)) return image; } else if (pixel_type == GREYSCALE) { typedef TypeIdImageFactory factory; typedef factory::image_type image_type; image_type* image = factory::create(offset, size); if (fill_image_from_string(*image, data_string)) return image; } else if (pixel_type == GREY16) { typedef TypeIdImageFactory factory; typedef factory::image_type image_type; image_type* image = factory::create(offset, size); if (fill_image_from_string(*image, data_string)) return image; } else if (pixel_type == RGB) { typedef TypeIdImageFactory factory; typedef factory::image_type image_type; image_type* image = factory::create(offset, size); if (fill_image_from_string(*image, data_string)) return image; } else if (pixel_type == FLOAT) { typedef TypeIdImageFactory factory; typedef factory::image_type image_type; image_type* image = factory::create(offset, size); if (fill_image_from_string(*image, data_string)) return image; } else if (pixel_type == COMPLEX) { typedef TypeIdImageFactory factory; typedef factory::image_type image_type; image_type* image = factory::create(offset, size); if (fill_image_from_string(*image, data_string)) return image; } else { PyErr_SetString(PyExc_ValueError, "Invalid pixel_type or storage_format"); return NULL; } return NULL; } #endif gamera-3.3.3/include/plugins/structural.hpp0000644000076500000000000002447611652050140017776 0ustar chriswheel/* * * Copyright (C) 2001-2009 * Ichiro Fujinaga, Michael Droettboom, Karl MacMillan, * and Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd11272002_relational #define mgd11272002_relational #include "gamera.hpp" #include #include namespace Gamera { template bool bounding_box_grouping_function(T& a, U& b, double threshold) { if (threshold < 0) throw std::runtime_error("Threshold must be a positive number."); size_t int_threshold = size_t(threshold + 0.5); // rounding return b->intersects(a->expand(int_threshold)); } template bool shaped_grouping_function(T& a, U& b, double threshold) { if (threshold < 0) throw std::runtime_error("Threshold must be a positive number."); size_t int_threshold = size_t(threshold + 0.5); Rect r = a.intersection(b.expand(int_threshold)); if (r.ul_x() > r.lr_x() || r.ul_y() > r.lr_y()) return false; T a_roi(a, r); r = b.intersection(a.expand(int_threshold)); if (r.ul_x() > r.lr_x() || r.ul_y() > r.lr_y()) return false; U b_roi(b, r); double threshold_2 = threshold * threshold; long start_c, end_c, dir_c; long start_r, end_r, dir_r; if (b_roi.center_y() > a_roi.center_y()) { start_r = a_roi.nrows() - 1; end_r = -1; dir_r = -1; } else { start_r = 0; end_r = a_roi.nrows(); dir_r = 1; } if (b_roi.center_x() > a_roi.center_x()) { start_c = a_roi.ncols() - 1; end_c = -1; dir_c = -1; } else { start_c = 0; end_c = a_roi.ncols(); dir_c = 1; } // Yes, that's right: a goto statement. // According to Stroustrup "C++ Programming Language, 3rd ed.": // "One of the few sensible uses of goto in ordinary code is to // break out from a nested loop or switch-statement." for (long r = start_r; r != end_r; r += dir_r) { for (long c = start_c; c != end_c; c += dir_c) { if (is_black(a_roi.get(Point(c, r)))) { bool is_edge = false; if (r == 0l || (size_t)r == a_roi.nrows() - 1 || c == 0l || (size_t)c == a_roi.ncols() - 1) { is_edge = true; goto edge_found; } else { for (long ri = r - 1; ri < r + 2; ++ri) { for (long ci = c - 1; ci < c + 2; ++ci) { if (is_white(a_roi.get(Point(ci, ri)))) { is_edge = true; goto edge_found; } } } } continue; edge_found: double a_y = double(r + a_roi.ul_y()); double a_x = double(c + a_roi.ul_x()); for (size_t r2 = 0; r2 < b_roi.nrows(); ++r2) { for (size_t c2 = 0; c2 < b_roi.ncols(); ++c2) { if (is_black(b_roi.get(Point(c2, r2)))) { double distance_y = double(r2 + b_roi.ul_y()) - a_y; double distance_x = double(c2 + b_roi.ul_x()) - a_x; double distance = distance_x*distance_x + distance_y*distance_y; if (distance <= threshold_2) return true; } } } } } } return false; } template FloatVector *polar_distance(T &a, U &b) { double x = (double)a.center_x() - (double)b.center_x(); double y = (double)a.center_y() - (double)b.center_y(); double r = sqrt(pow(x, 2.0) + pow(y, 2.0)); double q; if (x == 0) q = M_PI / 2; else q = atan(y / x); if (y > 0) q += M_PI; double avg_diag = ((sqrt(pow(a.nrows(), 2.0) + pow(a.ncols(), 2.0)) + sqrt(pow(b.nrows(), 2.0) + pow(b.ncols(), 2.0))) / 2.0); FloatVector *result = new FloatVector(3); (*result)[0] = r / avg_diag; (*result)[1] = q; (*result)[2] = r; return result; } int polar_match(double r1, double q1, double r2, double q2) { static const double ANGULAR_THRESHOLD = M_PI / 6.0; static const double DISTANCE_THRESHOLD = 1.6; double distance1, distance2; if (r1 > r2) { distance1 = r1; distance2 = r2; } else { distance1 = r2; distance2 = r1; } double q = fabs(q1 - q2); if (q1 > M_PI) q = std::min(q, fabs((M_PI - q1) - q2)); if (q2 > M_PI) q = std::min(q, fabs((M_PI - q2) - q1)); return (q < ANGULAR_THRESHOLD && (distance1 / distance2) < DISTANCE_THRESHOLD); } #define ITMAX 100 #define EPS 3.0e-7 #define FPMIN 1.0e-30 // From Numerical Recipes in C double gammln(const double xx) { static double cof[6] = {76.18009172947146,-86.50532032941677, 24.01409824083091,-1.231739572450155, 0.1208650973866179e-2,-0.5395239384953e-5}; double x, y; x = y = xx; double tmp = x + 5.5; tmp -= (x + 0.5) * log(tmp); double ser = 1.000000000190015; for (size_t i = 0; i < 6; ++i) { y += 1.0; ser += cof[i] / y; } return -tmp / log(2.5066282746310005 * ser / x); } // From Numerical Recipes in C void gser(const double a, const double x, double& gamser, double& gln) { gln = gammln(a); if (x < 0.0) throw std::range_error("x less than 0.0 in argument to gser"); else if (x == 0) { gamser = 0.0; return; } double ap = a; double delta, sum; delta = sum = 1.0 / a; for (size_t i = 0; i < ITMAX; ++i) { ap += 1; delta *= x / ap; sum += delta; if (fabs(delta) < fabs(sum) * EPS) { gamser = sum * exp(-x + a * log(x) - gln); return; } } throw std::range_error("a too large to compute in gser."); } // From Numerical Recipes in C void gcf(const double a, const double x, double& gammcf, double& gln) { gln = gammln(a); double b, c, d, h; b = x + 1.0 - a; c = 1.0 / FPMIN; h = d = 1.0 / b; double i = 1; for (; i <= ITMAX; ++i) { double an = -i * (i - a); b += 2.0; d = an * d + b; if (fabs(d) < FPMIN) d = FPMIN; c = b + an / c; if (fabs(c) < FPMIN) c = FPMIN; d = 1.0 / d; double delta = d * c; h *= delta; if (fabs(delta - 1.0) < EPS) break; } if (i > ITMAX) throw std::runtime_error("a too large in gcf."); try { gammcf = exp(-x + a * log(x) - gln) * h; } catch (std::overflow_error) { gammcf = std::numeric_limits::max(); } } // From Numerical Recipes in C double gammq(const double a, const double x) { double gamser, gln; if (x < 0.0 || a <= 0.0) throw std::range_error("Invalid arguments to gammq."); if (x < a + 1.0) { gser(a, x, gamser, gln); return 1.0 - gamser; } else { gcf(a, x, gamser, gln); return gamser; } } // From Numerical Recipes in C void least_squares_fit(const PointVector& points, double& a, double& b, double& q) { if (points.size() == 1) { a = 0.0; b = points[0].x(); q = 1.0; return; } double sx, sy, st2, sxoss, chi2; sx = sy = st2 = a = b = chi2 = 0.0; for (PointVector::const_iterator i = points.begin(); i != points.end(); ++i) { sx += double((*i).x()); sy += double((*i).y()); } sxoss = sx / points.size(); for (PointVector::const_iterator i = points.begin(); i != points.end(); ++i) { double t = double((*i).x()) - sxoss; st2 += t * t; b += t * double((*i).y()); } b /= st2; a = (sy - sx * b) / points.size(); for (PointVector::const_iterator i = points.begin(); i != points.end(); ++i) { double tmp = (double((*i).y()) - a - b * double((*i).x())); chi2 += tmp * tmp; } q = 1.0; if (points.size() >= 3) { try { q = gammq(0.5 * (points.size() - 2), 0.5 * chi2); } catch (std::exception) { ; } } } PyObject* least_squares_fit(const PointVector* points) { double a, b, q; least_squares_fit(*points, a, b, q); return Py_BuildValue(CHAR_PTR_CAST "fff", b, a, q); } PyObject* least_squares_fit_xy(const PointVector* points) { double a, b, q; int x_of_y = 0; size_t xmin, xmax, ymin, ymax; PointVector::const_iterator p; p = points->begin(); xmin = xmax = p->x(); ymin = ymax = p->y(); for (p = points->begin() + 1; p != points->end(); ++p) { if (p->x() > xmax) xmax = p->x(); if (p->x() < xmin) xmin = p->x(); if (p->y() > ymax) ymax = p->y(); if (p->y() < ymin) ymin = p->y(); } if ((xmax-xmin) > (ymax-ymin)) { // line closer to horizontal least_squares_fit(*points, a, b, q); } else { // line closer to vertical PointVector transposed; for (p=points->begin(); p!=points->end(); ++p) { transposed.push_back(Point(p->y(),p->x())); } least_squares_fit(transposed, a, b, q); x_of_y = 1; } return Py_BuildValue(CHAR_PTR_CAST "fffi", b, a, q, x_of_y); } // straightforward implementation of Wagner and Fischer's algorithm from 1974 int edit_distance(std::string s1, std::string s2) { size_t s1len, s2len; // length of the two strings IntVector *prev, *curr; // previous and current matrix column IntVector *tmp; size_t result, add, del, sub; size_t i,j; s1len = s1.size(); s2len = s2.size(); if (s1len == 0) return s2len; if (s2len == 0) return s1len; prev = new IntVector(s1len+1); curr = new IntVector(s1len+1); for (i=0; i1) { // move one column further in evaluation matrix tmp = prev; prev = curr; curr = tmp; } (*curr)[0] = j; for (i=1; i inline void thin_zs_get(const size_t& y, const size_t& y_before, const size_t& y_after, const size_t& x, const T& image, unsigned char& p, size_t& N, size_t& S) { size_t x_before = (x == 0) ? 1 : x - 1; size_t x_after = (x == image.ncols() - 1) ? image.ncols() - 2 : x + 1; p = ((is_black(image.get(Point(x_before, y_before))) << 7) | (is_black(image.get(Point(x_before, y))) << 6) | (is_black(image.get(Point(x_before, y_after))) << 5) | (is_black(image.get(Point(x, y_after))) << 4) | (is_black(image.get(Point(x_after, y_after))) << 3) | (is_black(image.get(Point(x_after, y))) << 2) | (is_black(image.get(Point(x_after, y_before))) << 1) | (is_black(image.get(Point(x, y_before))))); N = 0; S = 0; bool prev = p & (1 << 7); for (size_t i = 0; i < 8; ++i) { if (p & (1 << i)) { ++N; S += !prev; prev = true; } else prev = false; } } template inline void thin_zs_flag(const T& thin, T& flag, const unsigned char a, const unsigned char b) { register unsigned char p; size_t N, S; for (size_t y = 0; y < thin.nrows(); ++y) { size_t y_before = (y == 0) ? 1 : y - 1; size_t y_after = (y == thin.nrows() - 1) ? thin.nrows() - 2 : y + 1; for (size_t x = 0; x < thin.ncols(); ++x) { if (is_black(thin.get(Point(x, y)))) { thin_zs_get(y, y_before, y_after, x, thin, p, N, S); if ((N <= 6) && (N >= 2) && (S == 1) && !((p & a) == a) && !((p & b) == b)) flag.set(Point(x, y), black(flag)); else flag.set(Point(x, y), white(flag)); } } } } template inline bool thin_zs_del_fbp(T& thin, const T& flag) { bool deleted = false; typename T::vec_iterator thin_it = thin.vec_begin(); typename T::const_vec_iterator flag_it = flag.vec_begin(); for (; thin_it != thin.vec_end(); ++thin_it, ++flag_it) if (is_black(*flag_it) && is_black(*thin_it)) { (*thin_it) = white(thin); deleted = true; } return deleted; } template typename ImageFactory::view_type* thin_zs(const T& in) { const unsigned char constants[2][2] = {{21, 84}, {69, 81}}; typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; data_type* thin_data = new data_type(in.size(), in.origin()); view_type* thin_view = new view_type(*thin_data); image_copy_fill(in, *thin_view); if (in.nrows() == 1 || in.ncols() == 1) { return thin_view; } data_type* flag_data = 0; view_type* flag_view = 0; try { flag_data = new data_type(in.size(), in.origin()); flag_view = new view_type(*flag_data); try { bool deleted = true; bool constant_i = false; while (deleted) { thin_zs_flag(*thin_view, *flag_view, constants[constant_i][0], constants[constant_i][1]); deleted = thin_zs_del_fbp(*thin_view, *flag_view); constant_i = !constant_i; } } catch (std::exception e) { delete flag_view; delete flag_data; throw; } } catch (std::exception e) { delete thin_data; delete thin_view; throw; } delete flag_view; delete flag_data; return thin_view; } /* THINNING (Haralick and Shapiro's morphological algorithm) &R. M. Haralick and L. G. Shapiro, "Computer and Robot Vision", Vol. 1, Chapter 5 (especially 5.10.1), Addison-Wesley, Reading, Massachusetts, 1992, BASED on code in Xite. This version takes much less memory (only requires two buffers vs. five). Original authors: Qian Huang (Michigan State University), ˜ivind Due Trier (BLAB, Ifi, University of Oslo). */ // static bool thin_hs_elements[16][3][3]= // {{{true, true, true}, { false, true, false}, { false, false, false}}, /*J1*/ // {{ false, false, false}, { false, false, false}, {true, true, true}}, /*K1*/ // {{ false, true, false}, { false, true, true}, { false, false, false}}, /*J2*/ // {{ false, false, false}, {true, false, false}, {true, true, false}}, /*K2*/ // {{true, false, false}, {true, true, false}, {true, false, false}}, /*J3*/ // {{ false, false, true}, { false, false, true}, { false, false, true}}, /*K3*/ // {{ false, true, false}, {true, true, false}, { false, false, false}}, /*J4*/ // {{ false, false, false}, { false, false, true}, { false, true, true}}, /*K4*/ // {{ false, false, true}, { false, true, true}, { false, false, true}}, /*J5*/ // {{true, false, false}, {true, false, false}, {true, false, false}}, /*K5*/ // {{ false, false, false}, {true, true, false}, { false, true, false}}, /*J6*/ // {{ false, true, true}, { false, false, true}, { false, false, false}}, /*K6*/ // {{ false, false, false}, { false, true, false}, {true, true, true}}, /*J7*/ // {{true, true, true}, { false, false, false}, { false, false, false}}, /*K7*/ // {{ false, false, false}, { false, true, true}, { false, true, false}}, /*J8*/ // {{true, true, false}, {true, false, false}, { false, false, false}}};/*K8*/ static unsigned char thin_hs_elements[16][3] = {{0x7, 0x2, 0x0}, {0x0, 0x0, 0x7}, {0x2, 0x6, 0x0}, {0x0, 0x1, 0x3}, {0x1, 0x3, 0x1}, {0x4, 0x4, 0x4}, {0x2, 0x3, 0x0}, {0x0, 0x4, 0x6}, {0x4, 0x6, 0x4}, {0x1, 0x1, 0x1}, {0x0, 0x3, 0x2}, {0x6, 0x4, 0x0}, {0x0, 0x2, 0x7}, {0x7, 0x0, 0x0}, {0x0, 0x6, 0x2}, {0x3, 0x1, 0x0}}; template inline void thin_hs_diff_image(T& in, const T& other) { typename T::vec_iterator in_it = in.vec_begin(); typename T::const_vec_iterator other_it = other.vec_begin(); for (; in_it != in.vec_end(); ++in_it, ++other_it) { if (is_black(*in_it) ^ is_black(*other_it)) *in_it = black(in); else *in_it = white(in); } } template inline bool thin_hs_hit_and_miss(const T& in, T& H_M, const size_t& j, const size_t& k) { bool flag; /* HIT operation */ flag = false; for (size_t r = 1; r < in.nrows() - 1; ++r) { for (size_t c = 1; c < in.ncols() - 1; ++c) { for (size_t l = 0; l < 3; ++l) { for (size_t m = 0; m < 3; ++m) { if (is_white(in.get(Point(c + m - 1, r + l - 1)))) { if (thin_hs_elements[j][l] & (1 << m)) goto remove; } else { if (thin_hs_elements[k][l] & (1 << m)) goto remove; } } } H_M.set(Point(c, r), black(H_M)); flag = true; continue; remove: H_M.set(Point(c, r), white(H_M)); } } return flag; } template bool thin_hs_one_pass(T& in, T& H_M) { bool update_flag = false; for (size_t i = 0; i < 8; ++i) { size_t j = i * 2; size_t k = j + 1; if (thin_hs_hit_and_miss(in, H_M, j, k)) { thin_hs_diff_image(in, H_M); update_flag = true; } } return update_flag; } template typename ImageFactory::view_type* thin_hs(const T& in) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; Dim new_size(in.ncols() + 2, in.nrows() + 2); bool upper_left_origin = (in.ul_x() == 0) || (in.ul_y() == 0); Point new_origin; if (upper_left_origin) new_origin = Point(0, 0); else new_origin = Point(in.ul_x() - 1, in.ul_y() - 1); data_type* thin_data = new data_type(new_size, new_origin); view_type* thin_view = new view_type(*thin_data); try { for (size_t y = 0; y != in.nrows(); ++y) for (size_t x = 0; x != in.ncols(); ++x) thin_view->set(Point(x + 1, y + 1), in.get(Point(x, y))); if (in.nrows() == 1 || in.ncols() == 1) goto end; data_type* H_M_data = new data_type(new_size, new_origin); view_type* H_M_view = new view_type(*H_M_data); try { bool not_finished = true; while (not_finished) not_finished = thin_hs_one_pass(*thin_view, *H_M_view); } catch (std::exception e) { delete H_M_view; delete H_M_data; throw; } delete H_M_view; delete H_M_data; } catch (std::exception e) { delete thin_view; delete thin_data; throw; } end: if (upper_left_origin) { data_type* new_data = new data_type(in.size(), in.origin()); view_type* new_view = new view_type(*new_data); for (size_t y = 0; y != in.nrows(); ++y) for (size_t x = 0; x != in.ncols(); ++x) new_view->set(Point(x, y), thin_view->get(Point(x + 1, y + 1))); delete thin_view; delete thin_data; return new_view; } else { delete thin_view; thin_view = new view_type(*thin_data, in); return thin_view; } } /* THINNING (Lee and Chen algorithm) BASED on code in Xite. This version takes much less memory (only requires two buffers vs. five) than the Xite implementation. &[1]H.-J. Lee and B. Chen, "Recognition of handwritten chinese characters via short line segments," Pattern Recognition, vol. 25, no. 5, pp. 543-552, 1992. Original authors: ˜ivind Due Trier, late one night at Michigan State University. */ // static bool thin_lc_look_up[16][16]= // {{false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false}, /* 0 */ // {false, false, false, false, true, false, true, true, false, false, false, false, false, true, false, false}, /* 1 */ // {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, /* 2 */ // {false, false, false, false, true, true, true, true, false, false, false, false, false, true, false, false}, /* 3 */ // {false, true, false, true, false, false, false, true, false, false, false, false, false, true, false, true}, /* 4 */ // {true, false, false, true, false, false, true, false, true, true, false, true, true, false, true, false}, /* 5 */ // {false, true, false, true, false, true, false, true, false, false, false, false, false, true, false, true}, /* 6 */ // {false, true, false, true, true, false, true, false, false, true, false, true, false, false, false, false}, /* 7 */ // {false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false}, /* 8 */ // {false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, false}, /* 9 */ // {false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}, /* A */ // {false, false, false, false, false, true, false, true, false, false, false, false, false, true, false, true}, /* B */ // {false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, false}, /* C */ // {true, true, false, true, true, false, true, false, true, true, false, true, true, false, true, false}, /* D */ // {false, false, false, false, false, true, false, false, false, false, false, false, false, true, false, true}, /* E */ // {false, false, false, false, true, false, true, false, false, false, false, true, false, false, true, false}};/* F */ static unsigned short thin_lc_look_up[16] = {0x2020, 0x20d0, 0x0, 0x20f0, 0xa08a, 0x5b49, 0xa0aa, 0xa5a, 0x2020, 0x20a0, 0x0, 0xa0a0, 0x2020, 0x5b5b, 0xa020, 0x4850}; template typename ImageFactory::view_type* thin_lc(const T& in) { typedef typename ImageFactory::data_type data_type; typedef typename ImageFactory::view_type view_type; // Chain to thin_zs view_type* thin_view = thin_zs(in); if (in.nrows() == 1 || in.ncols() == 1) { return thin_view; } try { size_t nrows = thin_view->nrows(); size_t ncols = thin_view->ncols(); typename view_type::vec_iterator it = thin_view->vec_begin(); for (size_t y = 0; y < nrows; ++y) { size_t y_before = (y == 0) ? 1 : y - 1; size_t y_after = (y == nrows - 1) ? nrows - 2 : y + 1; for (size_t x = 0; x < ncols; ++x, ++it) { if (is_black(*it)) { size_t x_before = (x == 0) ? 1 : x - 1; size_t x_after = (x == ncols - 1) ? ncols - 2 : x + 1; size_t j = ((is_black(thin_view->get(Point(x_after, y_after))) << 3) | (is_black(thin_view->get(Point(x_after, y))) << 2) | (is_black(thin_view->get(Point(x_after, y_before))) << 1) | (is_black(thin_view->get(Point(x, y_before))))); size_t i = ((is_black(thin_view->get(Point(x_before, y_before))) << 3) | (is_black(thin_view->get(Point(x_before, y))) << 2) | (is_black(thin_view->get(Point(x_before, y_after))) << 1) | (is_black(thin_view->get(Point(x, y_after))))); if (thin_lc_look_up[i] & (1 << j)) *it = white(*thin_view); } } } } catch (std::exception e) { delete thin_view->data(); delete thin_view; } return thin_view; } } #endif gamera-3.3.3/include/plugins/threshold.hpp0000644000076500000000000005235511652050140017557 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm12032001_threshold #define kwm12032001_threshold #include "gamera.hpp" #include "image_utilities.hpp" #include "misc_filters.hpp" #include #include #include using namespace Gamera; /* void threshold_fill(GreyScale|Grey16|Float image, OneBit image, threshold); This function will threshold an image, storing the result in the second image passed in. The dimensions of the image must match. This function is used by threshold internally and is useful when there are existing images. Presumably the second image is a OneBit image, but it is not required - any pixel type should work fine. */ template void threshold_fill(const T& in, U& out, typename T::value_type threshold) { if (in.nrows() != out.nrows() || in.ncols() != out.ncols()) throw std::range_error("Dimensions must match!"); typename T::const_row_iterator in_row = in.row_begin(); typename T::const_col_iterator in_col; typename U::row_iterator out_row = out.row_begin(); typename U::col_iterator out_col; ImageAccessor in_acc; ImageAccessor out_acc; typename T::value_type tmp; for (; in_row != in.row_end(); ++in_row, ++out_row) { for (in_col = in_row.begin(), out_col = out_row.begin(); in_col != in_row.end(); ++in_col, ++out_col) { tmp = in_acc.get(in_col); if (tmp > threshold) out_acc.set(white(out), out_col); else out_acc.set(black(out), out_col); } } } /* Image* threshold(GreyScale|Grey16|Float image, threshold, storage_format); Threshold an image return a OneBit thresholded type. The storage format is controlled by the third parameter and should be one the formats in image_types.hpp. */ template Image* threshold(const T &m, int threshold, int storage_format) { if (storage_format == DENSE) { typedef TypeIdImageFactory fact_type; typename fact_type::image_type* view = fact_type::create(m.origin(), m.dim()); threshold_fill(m, *view, threshold); return view; } else { typedef TypeIdImageFactory fact_type; typename fact_type::image_type* view = fact_type::create(m.origin(), m.dim()); threshold_fill(m, *view, threshold); return view; } } /* threshold otsu_find_threshold(GreyScale image); Image* otsu_threshold(GreyScale image); otsu_find_threshold finds a threshold point using the otsu algorithm. otsu_threshold returns a thresholded image using the otsu algorithm to find the threshold point. */ // Here is the original copyright notice from the software this was // adopted from /* Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that this copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation and that the name of B-lab, Department of Informatics or University of Oslo not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. B-LAB DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL B-LAB BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ template int otsu_find_threshold(const T& matrix) { int thresh; double criterion; double expr_1; int i, k; double omega_k; double sigma_b_k; double sigma_T; double mu_T; double mu_k; int k_low, k_high; FloatVector* p = histogram(matrix); mu_T = 0.0; for (i=0; i<256; i++) mu_T += i*(*p)[i]; sigma_T = 0.0; for (i=0; i<256; i++) sigma_T += (i-mu_T)*(i-mu_T)*(*p)[i]; for (k_low = 0; ((*p)[k_low] == 0) && (k_low < 255); k_low++); for (k_high = 255; ((*p)[k_high] == 0) && (k_high > 0); k_high--); criterion = 0.0; thresh = 127; omega_k = 0.0; mu_k = 0.0; for (k = k_low; k <= k_high ; k++) { omega_k += (*p)[k]; mu_k += k*(*p)[k]; expr_1 = (mu_T*omega_k - mu_k); sigma_b_k = expr_1 * expr_1 / (omega_k*(1-omega_k)); if (criterion < sigma_b_k/sigma_T) { criterion = sigma_b_k/sigma_T; thresh = k; } } delete p; return thresh; } template Image* otsu_threshold(const T &m, int storage_format) { int threshold = otsu_find_threshold(m); if (storage_format == DENSE) { typedef TypeIdImageFactory fact_type; typename fact_type::image_type* view = fact_type::create(m.origin(), m.dim()); threshold_fill(m, *view, threshold); return view; } else { typedef TypeIdImageFactory fact_type; typename fact_type::image_type* view = fact_type::create(m.origin(), m.dim()); threshold_fill(m, *view, threshold); return view; } } /* threshold tsai_moment_preserving_find_threshold(GreyScale image); Image* tsai_moment_preserving_threshold(GreyScale image); tsai_moment_preserving_find_threshold finds a threshold point using the tsai moment preserving algorithm. tsai_moment_preserving_threshold returns a thresholded image using the tsai_moment_preserving_find_threshold algorithm to find the threshold point. */ template int tsai_moment_preserving_find_threshold(const T& matrix) { int thresh; int i; double criterion; double m1, m2, m3; double cd, c0, c1, z0, z1, pd, p0, p1; FloatVector* p = histogram(matrix); /* calculate first 3 moments */ m1 = m2 = m3 = 0.0; for (i = 0; i < 256; i++) { m1 += i *(*p)[i]; m2 += i * i * (*p)[i]; m3 += i * i * i * (*p)[i]; } /* moment preserving bilevel thresholding calculations*/ cd = m2 - m1 * m1; c0 = (-m2 * m2 + m1 * m3) / cd; c1 = (-m3 + m2 * m1) / cd; z0 = 0.5 * (-c1 - sqrt (c1 * c1 - 4.0 * c0)); z1 = 0.5 * (-c1 + sqrt (c1 * c1 - 4.0 * c0)); pd = z1 - z0; p0 = (z1 - m1) / pd; p1 = 1.0 - p0; /* find threshold */ for (thresh = 0, criterion = 0.0; thresh < 256; thresh++) { criterion += (*p)[thresh]; if (criterion > p0) break; } delete p; return thresh; } template Image* tsai_moment_preserving_threshold(const T &m, int storage_format) { int threshold = tsai_moment_preserving_find_threshold(m); if(threshold == 255) threshold = 0; if (storage_format == DENSE) { typedef TypeIdImageFactory fact_type; typename fact_type::image_type* view = fact_type::create(m.origin(), m.dim()); threshold_fill(m, *view, threshold); return view; } else { typedef TypeIdImageFactory fact_type; typename fact_type::image_type* view = fact_type::create(m.origin(), m.dim()); threshold_fill(m, *view, threshold); return view; } } /* ________________________________________________________________ bin_ab.c $Id: threshold.hpp 1315 2011-09-19 07:14:56Z cdalitz $ Copyright 1990, Blab, UiO Image processing lab, Department of Informatics University of Oslo E-mail: blab@ifi.uio.no ________________________________________________________________ Permission to use, copy, modify and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that this copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation and that the name of B-lab, Department of Informatics or University of Oslo not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. B-LAB DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL B-LAB BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. References: &Ahmed S. Abutaleb "Automatic thresholding of gray-level pictures using two-dimensional entropy", Computer Vision, Graphics, and Image Processing, vol 47, pp 22-32, 1989. Original author: ˜ivind Due Trier */ template Image* abutaleb_threshold(const T &m, int storage_format) { typedef typename ImageFactory::view_type view_type; view_type* average = mean(m); typedef FloatImageData histogram_data_type; typedef FloatImageView histogram_type; histogram_data_type histogram_data(Dim(256, 256)); histogram_type histogram(histogram_data); histogram_data_type P_histogram_data(Dim(256, 256)); histogram_type P_histogram(P_histogram_data); histogram_data_type H_histogram_data(Dim(256, 256)); histogram_type H_histogram(H_histogram_data); typename histogram_type::vec_iterator hist_it = histogram.vec_begin(); for (; hist_it != histogram.vec_end(); ++hist_it) *hist_it = 0.0; for (size_t y = 0; y < m.nrows(); ++y) for (size_t x = 0; x < m.ncols(); ++x) { size_t a = m.get(Point(x, y)); size_t b = average->get(Point(x, y)); histogram.set(Point(a, b), histogram.get(Point(a, b)) + 1.0); } double one_over_area = 1.0 / (m.nrows() * m.ncols()); for (size_t b = 0; b < 256; ++b) for (size_t a = 0; a < 256; ++a) histogram.set(Point(a, b), histogram.get(Point(a, b)) * one_over_area); double P_sum = 0.0; for (size_t s = 0; s < 256; ++s) { P_sum += histogram.get(Point(s, 0)); P_histogram.set(Point(s, 0), P_sum); } for (size_t t = 1; t < 256; ++t) { P_sum = 0.0; for (size_t s = 0; s < 256; ++s) { P_sum += histogram.get(Point(s, t)); P_histogram.set(Point(s, t), P_histogram.get(Point(s, t - 1)) + P_sum); } } double H_sum = 0.0; for (size_t s = 0; s < 256; ++s) { double p = histogram.get(Point(s, 0)); if (p != 0) H_sum -= p * log(p); H_histogram.set(Point(s, 0), H_sum); } for (size_t t = 1; t < 256; ++t) { H_sum = 0.0; for (size_t s = 0; s < 256; ++s) { double p = histogram.get(Point(s, t)); if (p != 0) H_sum -= p * log(p); H_histogram.set(Point(s, t), H_histogram.get(Point(s, t - 1)) + H_sum); } } double Phi_max = std::numeric_limits::min(); double tiny = 1e-6; double H_end = H_histogram.get(Point(255, 255)); size_t threshold = 0, avg_threshold = 0; for (size_t s = 0; s < 256; ++s) for (size_t t = 0; t < 256; ++t) { double P = P_histogram.get(Point(s, t)); double H = H_histogram.get(Point(s, t)); if ((P > tiny) && ((1.0 - P) > tiny)) { double Phi = log(P * (1.0 - P)) + H / P + (H_end - H) / (1.0 - P); if (Phi > Phi_max) { Phi_max = Phi; threshold = s; avg_threshold = t; } } } if (storage_format == DENSE) { typedef TypeIdImageFactory result_type; typename result_type::image_type* view = result_type::create(m.origin(), m.dim()); for (size_t y = 0; y < m.nrows(); ++y) for (size_t x = 0; x < m.ncols(); ++x) { if (m.get(Point(x, y)) <= threshold && average->get(Point(x, y)) <= avg_threshold) view->set(Point(x, y), black(*view)); else view->set(Point(x, y), white(*view)); } delete average->data(); delete average; return view; } else { typedef TypeIdImageFactory result_type; typename result_type::image_type* view = result_type::create(m.origin(), m.dim()); for (size_t y = 0; y < m.nrows(); ++y) for (size_t x = 0; x < m.ncols(); ++x) { if (m.get(Point(x, y)) <= threshold && average->get(Point(x, y)) <= avg_threshold) view->set(Point(x, y), black(*view)); else view->set(Point(x, y), white(*view)); } delete average->data(); delete average; return view; } } /* References: &'John Bernsen' "Dynamic thresholding of grey-level images", Proc. 8th International Conference on Pattern Recognition (ICPR8), pp 1251-1255, Paris, France, October 1986. Original author: ˜ivind Due Trier */ template Image* bernsen_threshold(const T &m, int storage_format, size_t region_size, size_t contrast_limit, bool doubt_to_black) { if ((contrast_limit < 0) || (contrast_limit > 255)) throw std::range_error("bernsen_threshold: contrast_limit out of range (0 - 255)"); if ((region_size < 1) || (region_size > std::min(m.nrows(), m.ncols()))) throw std::range_error("bernsen_threshold: region_size out of range"); typedef typename T::value_type pixel_type; int half_region_size = region_size / 2; typedef TypeIdImageFactory result_type; typename result_type::image_type* view = result_type::create(m.origin(), m.dim()); OneBitPixel confused; if (doubt_to_black) confused = black(*view); else confused = white(*view); for (size_t y = 0; y < m.nrows(); ++y) for (size_t x = 0; x < m.ncols(); ++x) { pixel_type minimum = std::numeric_limits::max(); pixel_type maximum = 0; for (int dy = -half_region_size; dy < half_region_size; ++dy) { int use_dy = (y + dy < 0 || y + dy >= m.nrows()) ? -dy : dy; for (int dx = -half_region_size; dx < half_region_size; ++dx) { int use_dx = (x + dx < 0 || x + dx >= m.ncols()) ? -dx : dx; pixel_type pixel = m.get(Point(x + use_dx, y + use_dy)); minimum = std::min(minimum, pixel); maximum = std::max(maximum, pixel); } } pixel_type c = maximum - minimum; if (c < contrast_limit) view->set(Point(x, y), confused); else { long t = (maximum + minimum) / 2; if (m.get(Point(x, y)) >= t) view->set(Point(x, y), white(*view)); else view->set(Point(x, y), black(*view)); } } return view; } /* Color-based thresholding using the algorithm from DjVu image compression. See: Bottou, L., P. Haffner, P. G. Howard, P. Simard, Y. Bengio and Y. LeCun. 1998. High Quality Document Image Compression with DjVu. AT&T Labs, Lincroft, NJ. http://research.microsoft.com/~patrice/PDF/jei.pdf Solomon, D. Image Compression: The Complete Reference. 2nd Edition. 559-61. */ template inline double djvu_distance(const T& x, const U& y) { // This approximates YUV distance, which is far more natural // than RGB distance. double r = (double)x.red() - (double)y.red(); double g = (double)x.green() - (double)y.green(); double b = (double)x.blue() - (double)y.blue(); return (0.75*r*r + g*g + 0.5*b*b); } #define CONVERGE_THRESHOLD 2 template inline bool djvu_converged(const T& fg, const T& bg) { return (djvu_distance(fg, bg) < CONVERGE_THRESHOLD); } template void djvu_threshold_recurse(const T image, const double smoothness, const size_t min_block_size, U& fg_image, U& bg_image, Rgb fg_init, Rgb bg_init, const size_t block_size) { typedef typename T::value_type value_type; typedef Rgb promote_t; promote_t fg = fg_init; promote_t bg = bg_init; promote_t last_fg, last_bg; bool fg_converged = false, bg_converged = false; promote_t fg_init_scaled = promote_t(fg_init) * smoothness; promote_t bg_init_scaled = promote_t(bg_init) * smoothness; do { last_fg = fg; last_bg = bg; promote_t fg_avg, bg_avg; size_t fg_count = 0, bg_count = 0; for (typename T::const_vec_iterator i = image.vec_begin(); i != image.vec_end(); ++i) { double fg_dist = djvu_distance(*i, fg); double bg_dist = djvu_distance(*i, bg); if (fg_dist <= bg_dist) { fg_avg += *i; ++fg_count; } else { bg_avg += *i; ++bg_count; } } if (fg_count) { fg = (((fg_avg / fg_count) * (1.0 - smoothness)) + fg_init_scaled); fg_converged = djvu_converged(fg, last_fg); } else { fg_converged = true; } if (bg_count) { bg = (((bg_avg / bg_count) * (1.0 - smoothness)) + bg_init_scaled); bg_converged = djvu_converged(bg, last_bg); } else { bg_converged = true; } } while (!(fg_converged && bg_converged)); if (block_size < min_block_size) { fg_image.set(Point(image.ul_x() / min_block_size, image.ul_y() / min_block_size), fg); bg_image.set(Point(image.ul_x() / min_block_size, image.ul_y() / min_block_size), bg); } else { for (size_t r = 0; r <= (image.nrows() - 1) / block_size; ++r) { for (size_t c = 0; c <= (image.ncols() - 1) / block_size; ++c) { Point ul(c * block_size + image.ul_x(), r * block_size + image.ul_y()); Point lr(std::min((c + 1) * block_size + image.ul_x(), image.lr_x()), std::min((r + 1) * block_size + image.ul_y(), image.lr_y())); djvu_threshold_recurse(T(image, ul, lr), smoothness, min_block_size, fg_image, bg_image, fg, bg, block_size / 2); } } } } template Image *djvu_threshold(const T& image, const double smoothness, const size_t max_block_size, const size_t min_block_size, const size_t block_factor, const typename T::value_type init_fg, const typename T::value_type init_bg) { // Create some temporary images to store the foreground and // background colors for each block RGBImageData fg_data(Dim(image.ncols() / min_block_size + 1, image.nrows() / min_block_size + 1), Point(0, 0)); RGBImageView fg_image(fg_data); RGBImageData bg_data(Dim(image.ncols() / min_block_size + 1, image.nrows() / min_block_size + 1), Point(0, 0)); RGBImageView bg_image(bg_data); djvu_threshold_recurse(image, smoothness, min_block_size, fg_image, bg_image, init_fg, init_bg, max_block_size); typedef TypeIdImageFactory result_type; typename result_type::image_type* result = result_type::create (image.origin(), image.dim()); typename choose_accessor::interp_accessor fg_acc = choose_accessor::make_interp_accessor(fg_image); typename choose_accessor::interp_accessor bg_acc = choose_accessor::make_interp_accessor(bg_image); for (size_t r = 0; r < image.nrows(); ++r) { for (size_t c = 0; c < image.ncols(); ++c) { double c_frac = (double)c / min_block_size; double r_frac = (double)r / min_block_size; RGBPixel fg = fg_acc(fg_image.upperLeft(), c_frac, r_frac); RGBPixel bg = bg_acc(bg_image.upperLeft(), c_frac, r_frac); double fg_dist = djvu_distance(image.get(Point(c, r)), fg); double bg_dist = djvu_distance(image.get(Point(c, r)), bg); if (fg_dist <= bg_dist) result->set(Point(c, r), black(*result)); else result->set(Point(c, r), white(*result)); } } return result; } Image *djvu_threshold(const RGBImageView& image, double smoothness = 0.2, int max_block_size = 512, int min_block_size = 16, int block_factor = 2) { // We do an approximate histrogram here, using 6 bits per pixel // plane. That greatly reduces the amount of memory required. RGBPixel max_color; { size_t max_count = 0; std::vector histogram(64 * 64 * 64, 0); for (RGBImageView::const_vec_iterator i = image.vec_begin(); i != image.vec_end(); ++i) { size_t approx_color = (((size_t)((*i).red() & 0xfc) << 10) | ((size_t)((*i).green() & 0xfc) << 4) | ((size_t)((*i).blue() & 0xfc) >> 2)); size_t x = histogram[approx_color]++; if (x > max_count) { max_count = x; max_color = RGBPixel((*i).red() & 0xfc, (*i).green() & 0xfc, (*i).blue() & 0xfc); } } } if (max_color.red() < 128 || max_color.green() < 128 || max_color.blue() < 128) max_color = RGBPixel(255, 255, 255); return djvu_threshold(image, smoothness, max_block_size, min_block_size, block_factor, RGBPixel(0, 0, 0), max_color); } #endif gamera-3.3.3/include/plugins/tiff_support.hpp0000644000076500000000000003154511652050140020305 0ustar chriswheel/* * * Copyright (C) 2001-2009 Ichiro Fujinaga, Michael Droettboom, * Karl MacMillan, and Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm10222002_tiff_support #define kwm10222002_tiff_support #include #include #include #include #include "gamera.hpp" #include namespace Gamera { // forward declarations ImageInfo* tiff_info(const char* filename); Image* load_tiff(const char* filename, int compressed); template void save_tiff(const T& matrix, const char* filename); /* Get information about tiff images This function gets informtion about tiff images and places it in and ImageInfo object. See image_info.hpp for more information. */ ImageInfo* tiff_info(const char* filename) { TIFFErrorHandler saved_handler = TIFFSetErrorHandler(NULL); TIFF* tif = 0; tif = TIFFOpen(filename, "r"); if (tif == 0) { TIFFSetErrorHandler(saved_handler); throw std::invalid_argument("Failed to open image header"); } // Create this later so it isn't leaked if filename does // not exist or is not a TIFF file. ImageInfo* info = new ImageInfo(); /* The tiff library seems very sensitive to type yet provides only a stupid non-type-checked interface. The following seems to work well (notice that resolution is floating point). KWM 6/6/01 */ try { unsigned short tmp; uint32 size; TIFFGetFieldDefaulted(tif, TIFFTAG_IMAGEWIDTH, &size); info->ncols((size_t)size); TIFFGetFieldDefaulted(tif, TIFFTAG_IMAGELENGTH, &size); info->nrows((size_t)size); TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &tmp); info->depth((size_t)tmp); float res; TIFFGetFieldDefaulted(tif, TIFFTAG_XRESOLUTION, &res); info->x_resolution(res); TIFFGetFieldDefaulted(tif, TIFFTAG_YRESOLUTION, &res); info->y_resolution(res); TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &tmp); info->ncolors((size_t)tmp); TIFFGetFieldDefaulted(tif, TIFFTAG_PHOTOMETRIC, &tmp); info->inverted(tmp == PHOTOMETRIC_MINISWHITE); TIFFClose(tif); } catch (std::exception e) { TIFFSetErrorHandler(saved_handler); delete info; } TIFFSetErrorHandler(saved_handler); return info; } namespace { template void tiff_load_onebit(T& matrix, ImageInfo& info, const char* filename) { // open the image TIFF* tif = TIFFOpen(filename, "r"); tdata_t buf = _TIFFmalloc(TIFFScanlineSize(tif)); // load the data for (size_t i = 0; i < info.nrows(); i++) { TIFFReadScanline(tif, buf, i); char* data = (char *)buf; std::bitset<8> bits; int tmp; for (size_t j = 0, k = 7, bit_index = 0; j < info.ncols(); j++, k--) { if (k == 7) { bits = data[bit_index]; bit_index++; } if (bits[k]) tmp = pixel_traits::black(); else tmp = pixel_traits::white(); matrix.set(Point(j, i), tmp); if (k == 0) k = 8; } } // do the cleanup _TIFFfree(buf); TIFFClose(tif); } template void tiff_load_greyscale(T& matrix, ImageInfo& info, const char* filename) { // open the image TIFF* tif = TIFFOpen(filename, "r"); tdata_t buf = _TIFFmalloc(TIFFScanlineSize(tif)); typename T::row_iterator mi = matrix.row_begin(); typename T::col_iterator mj; unsigned char* data; if (info.inverted()) { for (size_t i = 0; i < info.nrows(); i++, mi++) { mj = mi.begin(); TIFFReadScanline(tif, buf, i); data = (unsigned char *)buf; for (size_t j = 0; j < info.ncols(); j++, mj++) { *mj = 255 - data[j]; } } } else { for (size_t i = 0; i < info.nrows(); i++, mi++) { mj = mi.begin(); TIFFReadScanline(tif, buf, i); data = (unsigned char *)buf; for (size_t j = 0; j < info.ncols(); j++, mj++) { *mj = data[j]; } } } // do the cleanup _TIFFfree(buf); TIFFClose(tif); } template void tiff_load_grey16(T& matrix, ImageInfo& info, const char* filename) { // open the image TIFF* tif = TIFFOpen(filename, "r"); tdata_t buf = _TIFFmalloc(TIFFScanlineSize(tif)); typename T::row_iterator mi = matrix.row_begin(); typename T::col_iterator mj; unsigned short* data; for (size_t i = 0; i < info.nrows(); i++, mi++) { mj = mi.begin(); TIFFReadScanline(tif, buf, i); data = (unsigned short *)buf; for (size_t j = 0; j < info.ncols(); j++, mj++) { *mj = data[j]; } } // do the cleanup _TIFFfree(buf); TIFFClose(tif); } template void tiff_load_rgb(T& matrix, ImageInfo& info, const char* filename) { // open the image TIFF* tif = TIFFOpen(filename, "r"); tdata_t buf = _TIFFmalloc(TIFFScanlineSize(tif)); typename T::row_iterator mi = matrix.row_begin(); typename T::col_iterator mj; unsigned char* data; for (size_t i = 0; i < info.nrows(); i++, mi++) { mj = mi.begin(); TIFFReadScanline(tif, buf, i); data = (unsigned char *)buf; for (size_t j = 0; j < info.ncols() * 3; j += 3, mj++) { (*mj).red(data[j]); (*mj).green(data[j + 1]); (*mj).blue(data[j + 2]); } } // do the cleanup _TIFFfree(buf); TIFFClose(tif); } template struct tiff_saver { }; // runtime test for endianness // (safer and less cumbersome than querying compiler macros) bool byte_order_little_endian() { long numberone = 1; return (*((char*)(&numberone))); } template<> struct tiff_saver { template void operator()(const T& matrix, TIFF* tif) { TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); tsize_t scanline_size = TIFFScanlineSize(tif); if (scanline_size % 4) // round up to multiple of 4 scanline_size += 4 - (scanline_size % 4); tdata_t buf = _TIFFmalloc(scanline_size); if (!buf) throw std::runtime_error("Error allocating scanline"); TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE); std::bitset<32> bits; uint32* data = (uint32 *)buf; bool little_endian = byte_order_little_endian(); typename T::const_vec_iterator it = matrix.vec_begin(); for (size_t i = 0; i < matrix.nrows(); i++) { size_t bit_index = 0; int k = 31; for (size_t j = 0; j < matrix.ncols(); k--) { if (k < 0) { data[bit_index] = bits.to_ulong(); if (little_endian) byte_swap32((unsigned char *)&data[bit_index]); bit_index++; k = 32; continue; } if (is_black(*it)) bits[k] = 1; else bits[k] = 0; j++; it++; } // The last 32 pixels need to be saved, even if they are not full if (k != 31) { data[bit_index] = bits.to_ulong(); if (little_endian) byte_swap32((unsigned char *)&data[bit_index]); } TIFFWriteScanline(tif, buf, i); } _TIFFfree(buf); } }; template<> struct tiff_saver { template void operator()(const T& matrix, TIFF* tif) { TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); tdata_t buf = _TIFFmalloc(TIFFScanlineSize(tif)); if (!buf) throw std::runtime_error("Error allocating scanline"); typename T::value_type pix; unsigned char* data = (unsigned char *)buf; for (size_t i = 0; i < matrix.nrows(); i++) { for (size_t j = 0; j < matrix.ncols(); j++) { pix = matrix[i][j]; data[j] = (unsigned char)pix; } TIFFWriteScanline(tif, buf, i); } _TIFFfree(buf); } }; template<> struct tiff_saver { template void operator()(const T& matrix, TIFF* tif) { TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); tdata_t buf = _TIFFmalloc(TIFFScanlineSize(tif)); if (!buf) throw std::runtime_error("Error allocating scanline"); typename T::value_type pix; unsigned short* data = (unsigned short *)buf; for (size_t i = 0; i < matrix.nrows(); i++) { for (size_t j = 0; j < matrix.ncols(); j++) { pix = matrix[i][j]; data[j] = (unsigned short)pix; } TIFFWriteScanline(tif, buf, i); } _TIFFfree(buf); } }; template<> struct tiff_saver { template void operator()(const T& matrix, TIFF* tif) { TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); tdata_t buf = _TIFFmalloc(TIFFScanlineSize(tif)); if (!buf) throw std::runtime_error("Error allocating scanline"); typename T::value_type pix; unsigned char* data = (unsigned char *)buf; for (size_t i = 0; i < matrix.nrows(); i++) { for (size_t j = 0, k = 0; j < matrix.ncols(); j++) { pix = matrix[i][j]; data[k++] = pix.red(); data[k++] = pix.green(); data[k++] = pix.blue(); } TIFFWriteScanline(tif, buf, i); } _TIFFfree(buf); } }; } Image* load_tiff(const char* filename, int storage) { TIFFErrorHandler saved_handler = TIFFSetErrorHandler(NULL); ImageInfo* info = tiff_info(filename); if (info->ncolors() == 1) { if (info->depth() == 1) { if (storage == DENSE) { typedef TypeIdImageFactory fact_type; fact_type::image_type* image = fact_type::create(Point(0, 0), Dim(info->ncols(), info->nrows())); image->resolution(info->x_resolution()); tiff_load_onebit(*image, *info, filename); delete info; TIFFSetErrorHandler(saved_handler); return image; } else { typedef TypeIdImageFactory fact_type; fact_type::image_type* image = fact_type::create(Point(0, 0), Dim(info->ncols(), info->nrows())); image->resolution(info->x_resolution()); tiff_load_onebit(*image, *info, filename); delete info; TIFFSetErrorHandler(saved_handler); return image; } } } if (storage == RLE) { delete info; TIFFSetErrorHandler(saved_handler); throw std::runtime_error("Pixel type must be OneBit to use RLE data."); } if (info->ncolors() == 3) { typedef TypeIdImageFactory fact; fact::image_type* image = fact::create(Point(0, 0), Dim(info->ncols(), info->nrows())); tiff_load_rgb(*image, *info, filename); delete info; TIFFSetErrorHandler(saved_handler); return image; } else if (info->depth() == 8) { typedef TypeIdImageFactory fact_type; fact_type::image_type* image = fact_type::create(Point(0, 0), Dim(info->ncols(), info->nrows())); image->resolution(info->x_resolution()); tiff_load_greyscale(*image, *info, filename); delete info; TIFFSetErrorHandler(saved_handler); return image; } else if (info->depth() == 16) { typedef TypeIdImageFactory fact_type; fact_type::image_type* image = fact_type::create(Point(0, 0), Dim(info->ncols(), info->nrows())); image->resolution(info->x_resolution()); tiff_load_greyscale(*image, *info, filename); delete info; TIFFSetErrorHandler(saved_handler); return image; } delete info; TIFFSetErrorHandler(saved_handler); throw std::runtime_error("Unable to load image of this type!"); return 0; } template void save_tiff(const T& matrix, const char* filename) { TIFF* tif = 0; tif = TIFFOpen(filename, "w"); if (tif == 0) throw std::invalid_argument("Failed to create image."); TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, matrix.ncols()); TIFFSetField(tif, TIFFTAG_IMAGELENGTH, matrix.nrows()); TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, matrix.depth()); TIFFSetField(tif, TIFFTAG_XRESOLUTION, matrix.resolution()); TIFFSetField(tif, TIFFTAG_YRESOLUTION, matrix.resolution()); TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, matrix.ncolors()); TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); tiff_saver saver; saver(matrix, tif); TIFFClose(tif); } } #endif gamera-3.3.3/include/plugins/transformation.hpp0000644000076500000000000002240711652050140020624 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef cd03022010_transformation #define cd03022010_transformation #include "gamera.hpp" #include "gameramodule.hpp" #include "gamera_limits.hpp" #include "vigra/resizeimage.hxx" #include "vigra/basicgeometry.hxx" #include "vigra/affinegeometry.hxx" #include "plugins/logical.hpp" #include "image_utilities.hpp" #include #include #include namespace Gamera { /* * Rotate at an arbitrary angle. * * This algorithm works by first rotating for 90 degrees, depending whether * height and width are exchanged by rotation or not. * Afterwards VIGRA's rotation algorithm is called, which allows * for different types of interpolation. * * src - A view of of the source image * angle - Degree of rotation * bgcolor - Background color * */ template typename ImageFactory::view_type* rotate(const T &src, double angle, typename T::value_type bgcolor, int order) { if (order < 1 || order > 3) { throw std::range_error("Order must be between 1 and 3"); } // Adjust angle to a positive double between 0-360 while(angle<0.0) angle+=360; while(angle>=360.0) angle-=360; // some angle ranges flip width and height // as VIGRA requires source and destination to be of the same // size, it cannot handle a reduce in one image dimension. // Hence we must rotate by 90 degrees, if necessary bool rot90done = false; typename ImageFactory::view_type* prep4vigra = (typename ImageFactory::view_type*) &src; if ((45 < angle && angle < 135) || (225 < angle && angle < 315)) { typename ImageFactory::data_type* prep4vigra_data = new typename ImageFactory::data_type(Size(src.height(),src.width())); prep4vigra = new typename ImageFactory::view_type(*prep4vigra_data); size_t ymax = src.nrows() - 1; for (size_t y = 0; y < src.nrows(); ++y) { for (size_t x = 0; x < src.ncols(); ++x) { prep4vigra->set(Point(ymax-y,x), src.get(Point(x,y))); } } rot90done = true; // recompute rotation angle, because partial rotation already done angle -= 90.0; if (angle < 0.0) angle +=360; } double rad = (angle / 180.0) * M_PI; // new width/height depending on angle size_t new_width, new_height; if ((0 <= angle && angle <= 90) || (180 <= angle && angle <= 270)) { new_width = size_t(0.5+abs(cos(rad) * (double)prep4vigra->width() + sin(rad) * (double)prep4vigra->height())); new_height = size_t(0.5+abs(sin(rad) * (double)prep4vigra->width() + cos(rad) * (double)prep4vigra->height())); } else { new_width = size_t(0.5+abs(cos(rad) * (double)prep4vigra->width() - sin(rad) * (double)prep4vigra->height())); new_height = size_t(0.5+abs(sin(rad) * (double)prep4vigra->width() - cos(rad) * (double)prep4vigra->height())); } size_t pad_width = 0; if (new_width > prep4vigra->width()) pad_width = (new_width - prep4vigra->width()) / 2 + 2; size_t pad_height = 0; if (new_height > prep4vigra->height()) pad_height = (new_height - prep4vigra->height()) / 2 + 2; typename ImageFactory::view_type* tmp = pad_image(*prep4vigra, pad_height, pad_width, pad_height, pad_width, bgcolor); typename ImageFactory::data_type* dest_data = new typename ImageFactory::data_type(tmp->size()); typename ImageFactory::view_type* dest = new typename ImageFactory::view_type(*dest_data); try { fill(*dest, bgcolor); if (order == 1) { vigra::SplineImageView<1, typename T::value_type> spline(src_image_range(*tmp)); vigra::rotateImage(spline, dest_image(*dest), -angle); } else if (order == 2) { vigra::SplineImageView<2, typename T::value_type> spline(src_image_range(*tmp)); vigra::rotateImage(spline, dest_image(*dest), -angle); } else if (order == 3) { vigra::SplineImageView<3, typename T::value_type> spline(src_image_range(*tmp)); vigra::rotateImage(spline, dest_image(*dest), -angle); } } catch (std::exception e) { delete tmp->data(); delete tmp; delete dest; delete dest_data; if (rot90done) { delete prep4vigra->data(); delete prep4vigra; } throw; } if (rot90done) { delete prep4vigra->data(); delete prep4vigra; } delete tmp->data(); delete tmp; return dest; } template Image* resize(T& image, const Dim& dim, int resize_quality) { typename T::data_type* data = new typename T::data_type (dim, image.origin()); ImageView* view = new ImageView(*data); /* Images with nrows or ncols == 1 cannot be scaled by VIGRA. This is a hack that just returns an image with the same color as the upper-left pixel */ if (image.nrows() <= 1 || image.ncols() <= 1 || view->nrows() <= 1 || view->ncols() <= 1) { std::fill(view->vec_begin(), view->vec_end(), image.get(Point(0, 0))); return view; } if (resize_quality == 0) { // for straight scaling, resampleImage must be used in VIGRA double xfactor = (double)view->ncols()/image.ncols(); double yfactor = (double)view->nrows()/image.nrows(); // this is implemented incorrectly in VIGRA: //resizeImageNoInterpolation(src_image_range(image), dest_image_range(*view)); // the following works however: // requires extension of VIGRA (see basicgeometry.hxx) // that are not yet merged into VIGRA 1.6.0 resampleImage(src_image_range(image), dest_image(*view), xfactor, yfactor); } else if (resize_quality == 1) { resizeImageLinearInterpolation(src_image_range(image), dest_image_range(*view)); } else { resizeImageSplineInterpolation(src_image_range(image), dest_image_range(*view)); } image_copy_attributes(image, *view); return view; } template Image* scale(T& image, double scaling, int resize_quality) { // nrows, ncols are cast to a double so that the multiplication happens // exactly as it does in Python return resize(image, Dim(size_t(double(image.ncols()) * scaling), size_t(double(image.nrows()) * scaling)), resize_quality); } /* Shearing */ template inline void simple_shear(T begin, const T end, int distance) { // short-circuit if (distance == 0) return; typename T::value_type filler; // move down or right if (distance > 0) { filler = *begin; std::copy_backward(begin, end - distance, end); std::fill(begin, begin + distance, filler); // move up or left } else if (distance < 0) { filler = *(end - 1); std::copy(begin - distance, end, begin); std::fill(end + distance, end, filler); } // if distance == 0, do nothing } template void shear_column(T& mat, size_t column, int distance) { if (size_t(std::abs(distance)) >= mat.nrows()) throw std::range_error("Tried to shear column too far"); if (column >= mat.ncols()) throw std::range_error("Column argument to shear_column out of range"); simple_shear((mat.col_begin() + column).begin(), (mat.col_begin() + column).end(), distance); } template void shear_row(T& mat, size_t row, int distance) { if (size_t(std::abs(distance)) >= mat.ncols()) throw std::range_error("Tried to shear column too far"); if (row >= mat.nrows()) throw std::range_error("Column argument to shear_column out of range"); simple_shear((mat.row_begin() + row).begin(), (mat.row_begin() + row).end(), distance); } // mirror operations template void mirror_horizontal(T& m) { for (size_t r = 0; r < size_t(m.nrows()) / 2; ++r) { for (size_t c = 0; c < m.ncols(); ++c) { typename T::value_type tmp = m.get(Point(c, r)); m.set(Point(c, r), m.get(Point(c, m.nrows() - r - 1))); m.set(Point(c, m.nrows() - r - 1), tmp); } } } template void mirror_vertical(T& m) { for (size_t r = 0; r < m.nrows(); ++r) { for (size_t c = 0; c < size_t(m.ncols() / 2); ++c) { typename T::value_type tmp = m.get(Point(c, r)); m.set(Point(c, r), m.get(Point(m.ncols() - c - 1, r))); m.set(Point(m.ncols() - c - 1, r), tmp); } } } } #endif gamera-3.3.3/include/plugins/utility.hpp0000644000076500000000000000230511652050140017254 0ustar chriswheel/* * * Copyright (C) 2001-2005 * Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm12032001_utility #define kwm12032001_utility #include "gamera.hpp" using namespace Gamera; template Image* image_copy(const T &a, int storage_format) { if (storage_format == DENSE) { typename T::const_vec_iterator ait = a.vec_begin(); typename V::vec_iterator bit = b.vec_begin(); for (; ait != a.vec_end(); ++ait, ++bit) *bit = typename V::value_type(*ait); } #endif gamera-3.3.3/include/python_iterator.hpp0000644000076500000000000000555311652050140017332 0ustar chriswheel/* * Copyright (C) 2001 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ ////////////////////////////////////////////////////////////////////////////// // Iterators /* These objects make it (somewhat) easier to create Python iterator objects. To create a Python iterator, inherit from IteratorObject and define: An initializer (constructor): void init([any signature]); An iteration function: PyObject* next(IteratorObject* self); An optional destructor method: static void dealloc(IteratorObject* self); Plus any data members needed to keep the iteration going. Within your 'next' function, simply return 0 to stop iteration. All the other details of handling Python iteration are taken care of by this base class. To create an iterator and return it from a function: MyIterator* iterator = iterator_new_simple(); iterator->init([initialization parameters]); return (PyObject*)iterator; See also below the BasicIterator template which makes it easy to iterate through C++ STL sequences. */ #ifndef mgd010105_iterator_hpp #define mgd010105_iterator_hpp #include "Python.h" #include "gameramodule.hpp" struct IteratorObject { PyObject_HEAD PyObject*(*m_fp_next)(IteratorObject*); void(*m_fp_dealloc)(IteratorObject*); static void dealloc(IteratorObject* self) { }; }; void init_IteratorType(); // PyTypeObject* get_IteratorType(); template T* iterator_new(); template T* iterator_new() { IteratorObject* so; PyTypeObject* type = get_IteratorType(); type->tp_basicsize = sizeof(T); so = (IteratorObject*)(type->tp_alloc(type, 0)); so->m_fp_next = T::next; so->m_fp_dealloc = T::dealloc; return (T*)so; } // CONCRETE ITERATORS template struct BasicIterator : IteratorObject { int init(typename T::iterator begin, typename T::iterator end) { m_it = begin; m_end = end; return 1; } static PyObject* next(IteratorObject* self) { BasicIterator* so = (BasicIterator*)self; if (so->m_it == so->m_end) return 0; return (PyObject*)*((so->m_it)++); } typename T::iterator m_it, m_end; }; #endif gamera-3.3.3/include/region.hpp0000644000076500000000000001200211747510564015366 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm01262002_region #define kwm01262002_region #include "dimensions.hpp" #include "gamera_limits.hpp" #include #include #include #include #include #include /* REGIONS Regions are designed to be a generic mapping between a region on an image (as represented by a rectangle) and some values (represented as a key value pair (string/double)). By convention regions should contain a key called "scaling" that returns the default value for that region. This is used in feature functions that are dependant on some relative value (i.e. the height of glyphs in music recognition is scaled by the size of the staff space + the size of the staff line). REGIONMAP A regionmap is a list of regions with a function to add regions and a function to lookup regions based on position. */ namespace Gamera { template class RegionTemplate : public Rect { public: typedef std::map map_type; RegionTemplate() : Rect() { } RegionTemplate(const Point& ul, const Point& lr) : Rect(ul, lr) { } RegionTemplate(const Rect& r) : Rect(r) { } RegionTemplate(const Point& ul, const Size& size) : Rect(ul, size) {} RegionTemplate(const Point& ul, const Dim& dim) : Rect(ul, dim) {} V get(const std::string& key) const { typename map_type::const_iterator i = m_value_map.find(key); if (i != m_value_map.end()) return i->second; else throw std::invalid_argument("Key does not exist"); } void add(const std::string& key, V x) { m_value_map[key] = x; } private: map_type m_value_map; }; namespace region_detail { template struct intersect { intersect(const T& v) : m_rect(v) {} inline bool operator()(const T& other) { return other.contains_rect(m_rect); } T m_rect; }; // check to see if b is aligned vertically with a template inline bool vertically_intersected(const T& a, const U& b) { if ((b.ul_x() >= a.ul_x() && b.ul_x() <= a.lr_x()) || (b.lr_x() >= a.ul_x() && b.lr_x() <= a.lr_x())) return true; else return false; } // distance from the top of a to the bottom of b template inline int distance_above(const T& a, const U& b) { // check that b really is above a if (b.lr_y() >= a.ul_y()) return b.lr_y() - a.ul_y(); else return -int(a.ul_y() - b.lr_y()); } // distance from the bottom of a to the top of b template inline int distance_below(const T& a, const U& b) { // check that b really is below a if (b.ul_y() <= a.lr_y()) return a.lr_y() - b.ul_y(); else return -(int)(b.ul_y() - a.lr_y()); } } template class RegionMapTemplate : public std::list > { public: using std::list >::begin; using std::list >::end; typedef RegionMapTemplate self; typedef RegionTemplate region_type; typedef Rect rect_t; RegionMapTemplate() : std::list(0) { } virtual ~RegionMapTemplate() { } void add_region(const region_type& x) { this->push_back(x); } virtual region_type lookup(const rect_t& r) { typename self::iterator answer = std::find_if(begin(), end(), region_detail::intersect(r)); if (answer != end()) return *answer; else { // if we weren't contained in the rectangle we need to find the closest // by going straight up and down typename self::iterator closest = begin(); typename self::iterator i = begin(); int closest_distance = std::numeric_limits::max(); for (; i != end(); ++i) { if (region_detail::vertically_intersected(r, *i)) { // get the distance above int current_distance = region_detail::distance_above(r, *i); // if we aren't really above, get the distance below. Because we // know that the rectangles don't intersect, these cases really // are exclusive if (current_distance < 0) { current_distance = region_detail::distance_below(r, *i); } if (current_distance < closest_distance) closest = i; } } return *closest; } } }; } #endif gamera-3.3.3/include/rle_data.hpp0000644000076500000000000006516511652050140015660 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Compressed Image Data (run-length compression) Authors ------- Karl MacMillan Michael Droettboom History ------- Started 5/15/2002 KWM Virtually rewritten 4/1/2005 MGD */ #include "image_data.hpp" #include "dimensions.hpp" #include "accessor.hpp" #include #include #include #include #include #ifndef kwm05072002_rle_data #define kwm05072002_rle_data namespace Gamera { namespace RleDataDetail { /* This file contains a run-length compressed vector (not quite a complete interface for std::vector) and a Image Data object based on that vector. This is for use with very large 1-bit matrices. The performance should be acceptable for images that compress well (i.e. have few transitions from white to black), but will perform _very_ poorly as the number of transitions increases. Random-access is provided to this data, but this requires searching all the way through the list of runs for every single access. The iterators have certain tricks to make this faster, but performance will be much better for reading than writing. Encoding Scheme --------------- The old implementation stored only 'black' - i.e. non-zero pixels. This seemed to not work at all, but the original author, Karl, no longer works on Gamera so it is hard to say whether this never fully worked or some other change in Gamera broke this code. The CVS history seems to point to the former. The new implementation stores a run for each value, storing only the run's end. Pixels "off the end" of a list of runs are assumed to be zero. This keeps the memory consumption for large white areas of the image to a minimum. This change helps keep the iterators in sync with the data. In the old scheme, when an iterator was in a white area, it was impossible to tell what the next black area would be without rescanning the entire chunk. The first fix tried was to store an iterator to the next run, and then do a containment test when returning the pixel value. In profiling, this overhead seemed too heavy. Now, the iterator is always inside some run, regardless of color (or at the end of a run chunk where the pixel is assumed to be white). This makes it easy to move to the next/previous run, except if the run list is changed out from under us. This will make the iterator's pointer to the current run invalid. The RleVector object (which manages the runs) has a value m_dirty which increments every time the structure of the run lists changes (but not merely the pixel values). The iterators on the run data check their own internal copy of m_dirty against RleVector's everytime a pixel access needs to be made. If different, a full search of the run list is performed to find the correct current run, and then the iterator's copy of m_dirty is updated. If the same, the iterator's pointer to the current run is valid. m_dirty is an integer value and not a flag because multiple iterators may by working on the same data at the same time. This makes the semaphore work for all of them and not just the first one to access the data after an underlying change. In order to reduce the amount of time needed to find a particular run (which is prohibitive when the list of runs is very long) we store an array of lists of runs. Each list stores a range of coordinates determined by the static variable RLE_CHUNK. This means that we will sometimes break runs when they could be encoded as single run, but it makes the performance more even. To find the list that stores a particular position, simply divide by RLE_CHUNK - i.e. list_of_runs = array_of_lists[pos / RLE_CHUNK] Once you have the appropriate list, it is still necessary to scan through to find the particular run (or lack of run if the pixel is white). All we have done by using this array is to limit the length of the list that needs to be scanned by RLE_CHUNK. SPACE REDUCTION --------------- A further optimization for space has been added to take advantage of the fact that the positions stored in the run can be stored as an offest from the first possible position in a given list of runs (which I call a 'chunk'). If the positions stored in the runs are relative to the current chunk, we only need a type large enough to hold RLE_CHUNK positions. Setting RLE_CHUNK to 256 allows us to use an unsigned char for the positions in the run. If these relative positions weren't used we would have to allow the positions to be very large (probably at least size_t). The drawback to this space reduction is that we now have to convert between two sets of positions (global and relative). */ /* see note above - this must be smaller than the largest number that the type of end in the Run class can hold. This must be a power of 2 */ static const size_t RLE_CHUNK = 256; static const size_t RLE_CHUNK_1 = 255; // RLE_CHUNK - 1 static const size_t RLE_CHUNK_BITS = 8; // log2(RLE_CHUNK) /* Again, see note above - this should be selected with reference to RLE_CHUNK. */ typedef unsigned char runsize_t; /* These are convenience functions to make dealing with the list iterators a little easier. */ template T next(T i) { return ++i; } template T prev(T i) { return --i; } /* This class holds the actual run as a value, beginning position, and ending position. It also includes some methods for convenience. It doesn't hide the data members because it is not exported as a public interface. IMPORTANT - all positions are relative to the current chunk. */ template class Run { public: typedef T value_type; Run(runsize_t e, T v) : end(e), value(v) { } runsize_t end; // The value of the run (for connected-component // labeling). T value; }; /* These are some quick functions to help with handling the positions in the runs. */ inline runsize_t get_rel_pos(size_t global_pos) { return global_pos & RLE_CHUNK_1; } inline size_t get_global_pos(runsize_t rel_pos, size_t chunk) { return size_t(rel_pos) + (chunk << RLE_CHUNK_BITS); } inline size_t get_chunk(size_t pos) { return pos >> RLE_CHUNK_BITS; } /* RLEProxy The RleVectorIterator cannot return a reference for assignment because assignment is not a simple operation. This proxy class is returned instead which allows either conversion to the value for read access or setting a value in the runlength data for assignment. It is similar to the CCProxy in connected_componenent_iterators.hpp. There are two cases for the Proxy: a) we have a position that is in the middle of a run (so we have a pointer to an iterator that points to the run - we use a pointer so we can determine whether or not we have the iterator by comparison to 0). b) we only have the position and not an iterator. Case 'a' allows us to avoid a rather slow lookup, but we can't always use this optimization. */ template // T is the RleVector type class RLEProxy { public: typedef typename T::value_type value_type; typedef typename T::list_type::iterator iterator; RLEProxy(T* vec, size_t pos) { m_vec = vec; m_pos = pos; m_iterator = 0; m_dirty = vec->m_dirty; } RLEProxy(T* vec, size_t pos, const iterator* it) { m_vec = vec; m_pos = pos; m_iterator = it; m_dirty = vec->m_dirty; } // this is for RleVector[] - so, so, stupid, but oh well RLEProxy(T* vec, size_t pos, iterator i) { m_vec = vec; m_pos = pos; m_i = i; m_iterator = &m_i; m_dirty = vec->m_dirty; } void operator=(value_type v) { if (m_dirty == m_vec->m_dirty && m_iterator != 0) m_vec->set(m_pos, v, *m_iterator); else m_vec->set(m_pos, v); } operator value_type() const { if (m_dirty == m_vec->m_dirty && m_iterator != 0) return (*m_iterator)->value; return m_vec->get(m_pos); } private: T* m_vec; size_t m_pos; const iterator* m_iterator; iterator m_i; size_t m_dirty; }; /* RleVectorIterator and ConstRleVectorIterator provide STL style iterator access to the run-length compressed data. Currently they are lazy - they only get a value when they are dereferenced. It is probably possible to speed these up slightly by keeping up with which run we are currently in, but it would mean messing around in the internals of RleVector. For now I consider the tradeoff of performance for separation and simplicity to be worthwhile. */ // helper for the iterators template I find_run_in_list(I i, I end, runsize_t rel_pos) { for (; i != end; ++i) { if (i->end >= rel_pos) return i; } return i; } template class RleVectorIteratorBase { public: typedef typename V::value_type value_type; typedef int difference_type; typedef std::random_access_iterator_tag iterator_tag; typedef Iterator self; typedef ListIterator iterator; RleVectorIteratorBase() : m_dirty(0) { } RleVectorIteratorBase(V* vec, size_t pos) : m_dirty(0) { m_vec = vec; m_pos = pos; // find the current iterator (if there is one) size_t m_chunk = get_chunk(m_pos); runsize_t rel_pos = get_rel_pos(m_pos); m_i = find_run_in_list(m_vec->m_data[m_chunk].begin(), m_vec->m_data[m_chunk].end(), rel_pos); } self& operator++() { m_pos++; if (!check_chunk()) { if (m_i != m_vec->m_data[m_chunk].end()) { if (get_rel_pos(m_pos) > m_i->end) { ++m_i; } } } return (self&)*this; } self operator++(int) { self tmp; tmp.m_vec = m_vec; tmp.m_pos = m_pos; tmp.m_chunk = m_chunk; tmp.m_i = m_i; this->operator++(); return tmp; } self& operator--() { m_pos--; if (!check_chunk()) { if (m_i != m_vec->m_data[m_chunk].begin()) { iterator prev_i = prev(m_i); if (get_rel_pos(m_pos) <= prev_i->end) { m_i = prev_i; } } } return (self&)*this; } self operator--(int) { self tmp; tmp.m_vec = m_vec; tmp.m_pos = m_pos; tmp.m_chunk = m_chunk; tmp.m_i = m_i; this->operator++(); return tmp; } self& operator+=(size_t n) { m_pos += n; if (!check_chunk()) { m_i = find_run_in_list(m_vec->m_data[m_chunk].begin(), m_vec->m_data[m_chunk].end(), get_rel_pos(m_pos)); } return (self&)*this; } self operator+(size_t n) const { self tmp; tmp.m_vec = m_vec; tmp.m_pos = m_pos; tmp.m_chunk = m_chunk; tmp.m_i = m_i; tmp.m_dirty = m_dirty; tmp += n; return tmp; } self& operator-=(size_t n) { m_pos -= n; if (!check_chunk()) { m_i = find_run_in_list(m_vec->m_data[m_chunk].begin(), m_vec->m_data[m_chunk].end(), get_rel_pos(m_pos)); } return (self&)*this; } self operator-(size_t n) const { self tmp; tmp.m_vec = m_vec; tmp.m_pos = m_pos; tmp.m_chunk = m_chunk; tmp.m_dirty = m_dirty; tmp -= n; return tmp; } bool operator==(const self& other) const { return m_pos == other.m_pos; } bool operator!=(const self& other) const { return m_pos != other.m_pos; } bool operator<(const self& other) const { return m_pos < other.m_pos; } bool operator<=(const self& other) const { return m_pos <= other.m_pos; } bool operator>(const self& other) const { return m_pos > other.m_pos; } bool operator>=(const self& other) const { return m_pos >= other.m_pos; } difference_type operator-(const self& other) const { return m_pos - other.m_pos; } value_type get() const { // Unfortunately, for const-correctness reasons, I can't change // m_i or m_dirty here, so multiple calls to the get without moving // the iterator when the data is dirty will result in a search through // the run list chunk each time. iterator i; if (m_dirty != m_vec->m_dirty) i = find_run_in_list(m_vec->m_data[m_chunk].begin(), m_vec->m_data[m_chunk].end(), get_rel_pos(m_pos)); else i = m_i; if (i != m_vec->m_data[m_chunk].end()) return i->value; return 0; } void set(const value_type& v) { if (m_dirty != m_vec->m_dirty) { m_i = find_run_in_list(m_vec->m_data[m_chunk].begin(), m_vec->m_data[m_chunk].end(), get_rel_pos(m_pos)); m_dirty = m_vec->m_dirty; } m_vec->set(m_pos, v, m_i); } protected: bool check_chunk() { if (m_dirty != m_vec->m_dirty || m_chunk != get_chunk(m_pos)) { if (m_pos >= m_vec->m_size) { m_chunk = m_vec->m_data.size() - 1; m_i = m_vec->m_data[m_chunk].end(); } else { m_chunk = get_chunk(m_pos); m_i = find_run_in_list(m_vec->m_data[m_chunk].begin(), m_vec->m_data[m_chunk].end(), get_rel_pos(m_pos)); } m_dirty = m_vec->m_dirty; return true; } else { return false; } } V* m_vec; size_t m_pos; size_t m_chunk; iterator m_i; size_t m_dirty; }; template class RleVectorIterator : public RleVectorIteratorBase, typename V::list_type::iterator> { public: typedef RleVectorIterator self; typedef RleVectorIteratorBase base; using base::m_i; using base::m_vec; using base::m_chunk; using base::m_pos; using base::m_dirty; typedef RLEProxy proxy_type; typedef proxy_type reference; typedef proxy_type pointer; RleVectorIterator() : base() { } RleVectorIterator(V* vec, size_t pos) : base(vec, pos) { } proxy_type operator*() const { // Unfortunately, for const-correctness reasons, I can't change // m_i or m_dirty here, so multiple calls to the get without moving // the iterator when the data is dirty will result in a search through // the run list chunk each time. typename base::iterator i; if (m_dirty != m_vec->m_dirty) i = find_run_in_list(m_vec->m_data[m_chunk].begin(), m_vec->m_data[m_chunk].end(), get_rel_pos(m_pos)); else i = m_i; if (i != m_vec->m_data[m_chunk].end()) return proxy_type(m_vec, m_pos, &i); return proxy_type(m_vec, m_pos); } }; template class ConstRleVectorIterator : public RleVectorIteratorBase, typename V::list_type::const_iterator> { public: typedef ConstRleVectorIterator self; typedef RleVectorIteratorBase base; using base::m_i; using base::m_vec; using base::m_chunk; using base::m_pos; using base::m_dirty; typedef void reference; typedef typename V::value_type* pointer; ConstRleVectorIterator() { } ConstRleVectorIterator(V* vec, size_t pos) : base(vec, pos) { } typename V::value_type operator*() const { // Unfortunately, for const-correctness reasons, I can't change // m_i or m_dirty here, so multiple calls to the get without moving // the iterator when the data is dirty will result in a search through // the run list chunk each time. typename base::iterator i; if (m_dirty != m_vec->m_dirty) i = find_run_in_list(m_vec->m_data[m_chunk].begin(), m_vec->m_data[m_chunk].end(), get_rel_pos(m_pos)); else i = m_i; if (i != m_vec->m_data[m_chunk].end()) { return i->value; } return 0; } }; /* RleVector is a run-length compressed vector. It is optimized for space efficiency for document images (i.e. images with a background color) and places an emphasis on correctness rather than absolute performance. */ template class RleVector { public: // typedefs for convenience typedef RLEProxy proxy_type; typedef Data value_type; typedef proxy_type reference; typedef proxy_type pointer; typedef int difference_type; typedef Run run_type; typedef std::list list_type; typedef RleVector self; // iterators typedef RleVectorIterator iterator; typedef ConstRleVectorIterator const_iterator; RleVector(size_t size = 0) : m_size(size), m_data((size >> RLE_CHUNK_BITS) + 1), m_dirty(0) { } void resize(size_t size) { m_size = size; m_data.resize((m_size >> RLE_CHUNK_BITS) + 1); } size_t size() const { return m_size; } /* Return the value at the specified position. */ value_type get(size_t pos) const { assert(pos < m_size); size_t chunk = get_chunk(pos); runsize_t rel_pos = get_rel_pos(pos); // seems redundant and probably just slows things down, so removed // if (m_data[chunk].empty()) // return 0; typename list_type::const_iterator i; for (i = m_data[chunk].begin(); i != m_data[chunk].end(); ++i) { if (i->end >= rel_pos) return i->value; } return 0; } reference operator[](size_t pos) { size_t chunk = get_chunk(pos); typename list_type::iterator i = find_run_in_list(m_data[chunk].begin(), m_data[chunk].end(), get_rel_pos(pos)); if (i != m_data[chunk].end()) { return proxy_type(this, pos, i); } return proxy_type(this, pos); } /* Set the value at the specified position. This will create, split, or merge runs as necessary. */ void set(size_t pos, value_type v) { size_t chunk = get_chunk(pos); if (m_data[chunk].empty()) set(pos, v, m_data[chunk].end()); else { typename list_type::iterator i = find_run_in_list (m_data[chunk].begin(), m_data[chunk].end(), get_rel_pos(pos)); set(pos, v, i); } } void set(size_t pos, value_type v, typename list_type::iterator i) { assert(pos < m_size); size_t chunk = get_chunk(pos); runsize_t rel_pos = get_rel_pos(pos); /* If the list is empty our job is easy - just insert a run. */ if (m_data[chunk].empty()) { //// Empty run list, create new run(s) if (v != 0) { if (rel_pos > 0) m_data[chunk].push_back(run_type(rel_pos - 1, 0)); m_data[chunk].push_back(run_type(rel_pos, v)); m_dirty++; } } else { if (i != m_data[chunk].end()) insert_in_run(pos, v, i); else if (v != 0) { //// At end of run list -- append new runs typename list_type::iterator last = prev(m_data[chunk].end()); if (rel_pos - last->end > 1) { m_data[chunk].push_back(run_type(rel_pos - 1, 0)); } else { if (last->value == v) { last->end++; return; } } m_data[chunk].push_back(run_type(rel_pos, v)); m_dirty++; } } } /* Iterator access */ iterator begin() { return iterator(this, 0); } iterator end() { return iterator(this, m_size); } const_iterator begin() const { return const_iterator(this, 0); } const_iterator end() const { return const_iterator(this, m_size); } /* This will print out a list of the the runs currently in m_data - it is for debugging. */ void dump() { typename list_type::iterator i; size_t total = 0; for (size_t j = 0; j < m_data.size(); j++) { std::cout << "address: " << &(m_data[j]); for (i = m_data[j].begin(); i != m_data[j].end(); ++i) { std::cout << " end: " << int(i->end) << " value: " << i->value << std::endl << std::endl; total++; } } std::cout << "object contained " << total << " runs." << std::endl; } /* This method is used to insert another run into the middle of an existing run. It handles resizing or splitting the run as necessary and will merge the inserted run as necessary. */ inline void insert_in_run(size_t pos, value_type v, typename list_type::iterator i) { if (i->value != v) { size_t chunk = get_chunk(pos); runsize_t rel_pos = get_rel_pos(pos); if (i != m_data[chunk].begin()) { typename list_type::iterator prev_i = prev(i); if (i->end - prev_i->end == 1) { //// run of length 1 i->value = v; merge_runs(i, chunk); return; } if (prev_i->end + 1 == rel_pos) { //// at beginning of run // we do this value check here to avoid a creation/deletion for // the merge if (prev_i->value == v) prev_i->end++; else m_data[chunk].insert(i, run_type(rel_pos, v)); ++m_dirty; return; } } else { if (i->end == 0) { //// first run of length 1 i->value = v; merge_runs_after(i, chunk); return; } else if (rel_pos == 0) { //// at beginning of first run m_data[chunk].insert(i, run_type(0, v)); ++m_dirty; return; } } ++m_dirty; if (i->end == rel_pos) { //// at end of run i->end--; // we do this value check here to avoid a creation/deletion for // the merge typename list_type::iterator next_i = next(i); if (next_i != m_data[chunk].end()) if (next_i->value == v) return; m_data[chunk].insert(next_i, run_type(rel_pos, v)); return; } //// in middle of run runsize_t old_end = i->end; i->end = rel_pos - 1; typename list_type::iterator next_i = next(i); m_data[chunk].insert(next_i, run_type(rel_pos, v)); m_data[chunk].insert(next_i, run_type(old_end, i->value)); } } /* This method merges runs that are touching and contain the same value. This is necessary to keep the minimum number of runs in the list. */ void merge_runs(typename list_type::iterator i, size_t chunk) { if (i != m_data[chunk].begin()) { typename list_type::iterator p = prev(i); if (p->value == i->value) { p->end = i->end; m_data[chunk].erase(i); i = p; m_dirty++; } } typename list_type::iterator n = next(i); if (n != m_data[chunk].end()) { if (n->value == i->value) { i->end = n->end; m_data[chunk].erase(n); m_dirty++; } } } // /* // These two methods do the same thing as merge_runs above, but // in two separate steps. This allows other layers that know that // there is no possibility of needing to merge in one particular // direction to avoid the extra checking. // */ void merge_runs_before(typename list_type::iterator i, size_t chunk) { if (i != m_data[chunk].begin()) { typename list_type::iterator p = prev(i); if (p->value == i->value) { p->end = i->end; m_data[chunk].erase(i); m_dirty++; } } } /* see above. */ void merge_runs_after(typename list_type::iterator i, size_t chunk) { typename list_type::iterator n = next(i); if (n != m_data[chunk].end()) { if (n->value == i->value) { i->end = n->end; m_data[chunk].erase(n); m_dirty++; } } } public: size_t m_size; std::vector m_data; size_t m_dirty; }; } // namespace RleDataDetail /* This is an RleVector with the additional interface necessary to allow it to be used with a ImageView or ConnectedComponent object. */ template class RleImageData : public RleDataDetail::RleVector, public ImageDataBase { public: using RleDataDetail::RleVector::resize; typedef T value_type; typedef typename RleDataDetail::RleVector::reference reference; typedef typename RleDataDetail::RleVector::pointer pointer; typedef typename RleDataDetail::RleVector::iterator iterator; typedef typename RleDataDetail::RleVector::const_iterator const_iterator; RleImageData(const Size& size, const Point& offset) : RleDataDetail::RleVector((size.height() + 1) * (size.width() + 1)), ImageDataBase(size, offset) { } RleImageData(const Size& size) : RleDataDetail::RleVector((size.height() + 1) * (size.width() + 1)), ImageDataBase(size) { } RleImageData(const Dim& dim, const Point& offset) : RleDataDetail::RleVector(dim.nrows() * dim.ncols()), ImageDataBase(dim, offset) { } RleImageData(const Dim& dim) : RleDataDetail::RleVector(dim.nrows() * dim.ncols()), ImageDataBase(dim) { } /* This is a little tricky and potentially expensive. The C++ standard (according the www.sgi.com/tech/stl) does not garuntee that list.size() is constant time - it can be O(N). So we may have to do an O(N) search on a large number of lists. This also cannot be exact because we have no way of determining the size of a list element (we don't know it's type). We are going to assume that each list node has two pointers to Run (this is what gcc does and any other sane implementation will do). This should give us an idea of the size, but nothing exact. */ virtual size_t bytes() const { size_t run_size = sizeof(RleDataDetail::Run); size_t run_ptr_size = sizeof(RleDataDetail::Run*); size_t num_runs = 0; for (size_t i = 0; i < this->m_data.size(); ++i) num_runs += this->m_data[i].size(); return num_runs * (run_size + run_ptr_size + run_ptr_size); } virtual double mbytes() const { return bytes() / 1048576.0; } virtual void dimensions(size_t rows, size_t cols) { m_stride = cols; resize(rows * cols); } virtual void dim(const Dim& dim) { m_stride = dim.ncols(); resize(dim.nrows() * dim.ncols()); } virtual Dim dim() const { size_t size = ((RleDataDetail::RleVector*)(this))->m_size; return Dim(m_stride, size / m_stride); } protected: virtual void do_resize(size_t size) { resize(size); } }; } #endif gamera-3.3.3/include/static_image.hpp0000644000076500000000000000561711652050140016532 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef kwm01102002_static_image #define kwm01102002_static_image /* This is a convenience class that encapsulates a view and image data. KWM */ #include "image_view.hpp" #include "image_data.hpp" namespace Gamera { template class StaticImage : public ImageView > { protected: using ImageView >::calculate_iterators; using ImageView >::range_check; public: using ImageView >::nrows; using ImageView >::ncols; typedef Rect rect_type; typedef Size size_type; typedef Point point_type; typedef StaticImage self; typedef ImageView > view_type; /* The only difference between this class and the standard ImageView is that there is a member for the data. These constructors call the base class constructor (passing false to suppress range checking because the data is not correctly sized when the base class is constructed - we cannot override this order because the base class is always constructed before the members are initialized - sigh), size the data, do a range check, and then calculate the iterators. To resize the data when the size of the view changes, it is only necessary to override the dimensions_changed method (see below). */ StaticImage(const point_type& lower_right) : view_type(m_data, point_type(), lower_right, false) { m_data.dimensions(nrows(), ncols()); range_check(); calculate_iterators(); } StaticImage(const size_type& size) : view_type(m_data, point_type(), size, false) { m_data.dimensions(nrows(), ncols()); range_check(); calculate_iterators(); } StaticImage(const Dim& dim) : view_type(m_data, point_type(), dim, false) { m_data.dimensions(nrows(), ncols()); range_check(); calculate_iterators(); } protected: virtual void dimensions_change() { m_data.dimensions(nrows(), ncols()); range_check(); calculate_iterators(); } private: ImageData m_data; }; }; #endif gamera-3.3.3/include/utility.hpp0000644000076500000000000000523611652050140015601 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include //#include //#include #include "gamera.hpp" #ifndef kwm07192002_utility #define kwm07192002_utility namespace Gamera { inline void byte_swap32(unsigned char *ptr) { register unsigned char val; val = *(ptr); *(ptr) = *(ptr+3); *(ptr+3) = val; ptr += 1; val = *(ptr); *(ptr) = *(ptr+1); *(ptr+1) = val; } class Clocker { public: void start(); void stop(); float seconds(); float microseconds(); private: clock_t _start; clock_t _end; }; inline void Clocker::start() { _start = clock(); } inline void Clocker::stop() { _end = clock(); } inline float Clocker::seconds() { return ((float)(_end - _start) / (float)CLOCKS_PER_SEC); } inline float Clocker::microseconds() { return ((float)((_end - _start) / (float)CLOCKS_PER_SEC) * 1000000); } #if 0 /** Alternative to Clocker, which wraps after about 35.79 minutes Clocker measures CPU time, Timer measures real time. Clocker resolution is 10ms on Linux/Intel Timer resolution is about 10 microseconds If a finer resolution is needed checkout POSIX.4 clock_gettime() 01/06/06 IF started 6/7/01 KWM integrated into Gamera */ class Timer { public: void start(); void stop(); float seconds(); Timer(); private: struct timeval _start; struct timeval _end; struct timezone tz; // not used }; Timer::Timer() { _start.tv_sec = _start.tv_usec = 0; _end.tv_sec = _end.tv_usec = 0; } inline void Timer::start() { gettimeofday(&_start, &tz); } inline void Timer::stop() { gettimeofday(&_end, &tz); } inline float Timer::seconds() { return ((_end.tv_sec - _start.tv_sec) + (_end.tv_usec - _start.tv_usec) / 1000000.); } #endif }; // namespace Gamera #endif gamera-3.3.3/include/vigra/0000755000076500000000000000000011755376174014515 5ustar chriswheelgamera-3.3.3/include/vigra/accessor.hxx0000644000076500000000000011452011261456425017041 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_ACCESSOR_HXX #define VIGRA_ACCESSOR_HXX #include "metaprogramming.hxx" #include "numerictraits.hxx" #include "tuple.hxx" namespace vigra { /** \addtogroup DataAccessors Data Accessors Basic templates to encapsulate access to the data of an iterator. Data accessors are used to allow for flexible access to the data an iterator points to. When we access the data directly, we are bound to what operator*() returns, if this method exists at all. Encapsulating access in an accessor enables a better decoupling of data structures and algorithms. This paper contains a detailed description of the concept. Here is a brief list of the basic accessor requirements:

Operation Result Semantics
accessor(iter)convertible to
Iterator::value_type const &
read data at the current position of the iterator
accessor(iter, index)convertible to
Accessor::value_type const &
read data at offset index relative to iterator's current position (random-access iterator only)
accessor.set(value, iter)void write data value at the current position of the iterator (mutable iterator only)
accessor.set(value, iter, index)void write data value at offset index relative to iterator's current position (mutable random-access iterator only)
Accessor::value_type type of the data field the accessor refers to
iter is an iterator
index has the iterator's index type (Iterator::difference_type)
value is convertible to Accessor::value_type const &

The template AccessorTraits can be used to find the default accessor associated with the type T, e.g. \code typedef typename AccessorTraits::default_accessor Accessor; typedef typename AccessorTraits::default_const_accessor ConstAccessor; \endcode */ //@{ /********************************************************/ /* */ /* StandardAccessor */ /* */ /********************************************************/ /** \brief Encapsulate access to the values an iterator points to. StandardAccessor is a trivial accessor that simply encapsulates the iterator's operator*() and operator[]() in its read and write functions. It passes its arguments by reference. If you want to return items by value, you must use StandardValueAccessor instead of StandardAccessor. Both accessors have different optimization properties -- StandardAccessor is usually faster for compound pixel types, while StandardValueAccessor is faster for the built-in types. When a floating point number is assigned by means of an accessor with integral value_type, the value is rounded and clipped as approriate. \#include \<vigra/accessor.hxx\>
Namespace: vigra */ template class StandardAccessor { public: /** the value_type */ typedef VALUETYPE value_type; /** read the current data item */ template VALUETYPE const & operator()(ITERATOR const & i) const { return *i; } VALUETYPE const & operator()(VALUETYPE const * i) const { return *i; } /** read the data item at an offset (can be 1D or 2D or higher order difference). */ template VALUETYPE const & operator()(ITERATOR const & i, DIFFERENCE const & diff) const { return i[diff]; } /** Write the current data item. The type V of the passed in value is automatically converted to VALUETYPE. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V const & value, ITERATOR const & i) const { *i = detail::RequiresExplicitCast::cast(value); } /* This overload is needed to make the accessor work with a std::back_inserter */ template void set(V const & value, ITERATOR & i) const { *i = detail::RequiresExplicitCast::cast(value); } /** Write the data item at an offset (can be 1D or 2D or higher order difference).. The type V of the passed in value is automatically converted to VALUETYPE. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V const & value, ITERATOR const & i, DIFFERENCE const & diff) const { i[diff]= detail::RequiresExplicitCast::cast(value); } }; /** \brief Encapsulate access to the values an iterator points to. StandardValueAccessor is a trivial accessor that simply encapsulates the iterator's operator*() and operator[]() in its read and write functions. It passes its arguments by value. If the iterator returns its items by reference (such as \ref vigra::ImageIterator), you can also use StandardAccessor. These accessors have different optimization properties -- StandardAccessor is usually faster for compound pixel types, while StandardValueAccessor is faster for the built-in types. When a floating point number is assigned by means of an accessor with integral value_type, the value is rounded and clipped as approriate. \#include \<vigra/accessor.hxx\>
Namespace: vigra */ template class StandardValueAccessor { public: /** the value_type */ typedef VALUETYPE value_type; /** Read the current data item. The type ITERATOR::reference is automatically converted to VALUETYPE. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template VALUETYPE operator()(ITERATOR const & i) const { return detail::RequiresExplicitCast::cast(*i); } /** Read the data item at an offset (can be 1D or 2D or higher order difference). The type ITERATOR::index_reference is automatically converted to VALUETYPE. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template VALUETYPE operator()(ITERATOR const & i, DIFFERENCE const & diff) const { return detail::RequiresExplicitCast::cast(i[diff]); } /** Write the current data item. The type V of the passed in value is automatically converted to VALUETYPE. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V value, ITERATOR const & i) const { *i = detail::RequiresExplicitCast::cast(value); } /* This overload is needed to make the accessor work with a std::back_inserter */ template void set(V value, ITERATOR & i) const { *i = detail::RequiresExplicitCast::cast(value); } /** Write the data item at an offset (can be 1D or 2D or higher order difference).. The type V of the passed in value is automatically converted to VALUETYPE. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V value, ITERATOR const & i, DIFFERENCE const & diff) const { i[diff]= detail::RequiresExplicitCast::cast(value); } }; /********************************************************/ /* */ /* StandardConstAccessor */ /* */ /********************************************************/ /** \brief Encapsulate read access to the values an iterator points to. StandardConstAccessor is a trivial accessor that simply encapsulates the iterator's operator*() and operator[]() in its read functions. It passes its arguments by reference. If the iterator returns its items by value (such as \ref vigra::CoordinateIterator), you must use StandardConstValueAccessor instead of StandardConstAccessor. Both accessors also have different optimization properties -- StandardConstAccessor is usually faster for compound pixel types, while StandardConstValueAccessor is faster for the built-in types. \#include \<vigra/accessor.hxx\>
Namespace: vigra */ template class StandardConstAccessor { public: typedef VALUETYPE value_type; /** read the current data item */ template VALUETYPE const & operator()(ITERATOR const & i) const { return *i; } /** read the data item at an offset (can be 1D or 2D or higher order difference). */ template VALUETYPE const & operator()(ITERATOR const & i, DIFFERENCE const & diff) const { return i[diff]; } }; /** \brief Encapsulate access to the values an iterator points to. StandardConstValueAccessor is a trivial accessor that simply encapsulates the iterator's operator*() and operator[]() in its read functions. It passes its arguments by value. If the iterator returns its items by reference (such as \ref vigra::ConstImageIterator), you can also use StandardConstAccessor. These accessors have different optimization properties -- StandardConstAccessor is usually faster for compound pixel types, while StandardConstValueAccessor is faster for the built-in types. When an iterator passes a floating point number to an accessor with integral value_type, the value is rounded and clipped as approriate. \#include \<vigra/accessor.hxx\>
Namespace: vigra */ template class StandardConstValueAccessor { public: typedef VALUETYPE value_type; /** Read the current data item. The type ITERATOR::reference is automatically converted to VALUETYPE. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template VALUETYPE operator()(ITERATOR const & i) const { return detail::RequiresExplicitCast::cast(*i); } /** Read the data item at an offset (can be 1D or 2D or higher order difference). The type ITERATOR::index_reference is automatically converted to VALUETYPE. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template VALUETYPE operator()(ITERATOR const & i, DIFFERENCE const & diff) const { return detail::RequiresExplicitCast::cast(i[diff]); } }; /********************************************************/ /* */ /* VectorComponentAccessor */ /* */ /********************************************************/ /** \brief Accessor for one component of a vector. This accessor allows to select a single component (a single 'band') of a vector valued pixel type. The pixel type must support operator[]. The index of the component to be selected is passed in the constructor. The accessor returns its items by reference. If you want to pass/return items by value, use VectorComponentValueAccessor. If a floating point number is assigned by means of an accessor with integral value_type, the value is rounded and clipped as appropriate. Usage: \code vigra::BRGBImage image(w,h); // init red channel with 255 initImage(destImageRange(image, VectorComponentAccessor(0)), 255); \endcode \#include \<vigra/accessor.hxx\>
Namespace: vigra */ template class VectorComponentAccessor { int index_; public: /** the value_type */ typedef typename VECTORTYPE::value_type value_type; /** determine the component to be accessed */ VectorComponentAccessor(int index) : index_(index) {} /** read the current data item */ template value_type const & operator()(ITERATOR const & i) const { return (*i)[index_]; } /** read the data item at an offset (can be 1D or 2D or higher order difference). */ template value_type const & operator()(ITERATOR const & i, DIFFERENCE const & diff) const { return i[diff][index_]; } /** Write the current data item. The type V of the passed in value is automatically converted to value_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V const & value, ITERATOR const & i) const { (*i)[index_] = detail::RequiresExplicitCast::cast(value); } /** Write the data item at an offset (can be 1D or 2D or higher order difference).. The type V of the passed in value is automatically converted to value_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V const & value, ITERATOR const & i, DIFFERENCE const & diff) const { i[diff][index_]= detail::RequiresExplicitCast::cast(value); } /** Reset the index to the given number. */ void setIndex(int i) { index_ = i; } }; /** \brief Accessor for one component of a vector. This accessor allows to select a single component (a single 'band') of a vector valued pixel type. The pixel type must support operator[]. The index of the component to be selected is passed in the constructor. The accessor returns its items by value. If you want to pass/return items by reference, use VectorComponentAccessor. If a floating point number is assigned by means of an accessor with integral value_type, the value is rounded and clipped as appropriate. Usage: \code vigra::BRGBImage image(w,h); // init red channel with 255 initImage(destImageRange(image, VectorComponentValueAccessor(0)), 255); \endcode \#include \<vigra/accessor.hxx\>
Namespace: vigra */ template class VectorComponentValueAccessor { int index_; public: /** the value_type */ typedef typename VECTORTYPE::value_type value_type; /** determine the component to be accessed */ VectorComponentValueAccessor(int index) : index_(index) {} /** Read the current data item. The type ITERATOR::index_reference::value_type is automatically converted to value_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template value_type operator()(ITERATOR const & i) const { return detail::RequiresExplicitCast::cast((*i)[index_]); } /** Read the data item at an offset (can be 1D or 2D or higher order difference). The type ITERATOR::index_reference::value_type is automatically converted to value_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template value_type operator()(ITERATOR const & i, DIFFERENCE const & diff) const { return detail::RequiresExplicitCast::cast(i[diff][index_]); } /** Write the current data item. The type V of the passed in value is automatically converted to value_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V value, ITERATOR const & i) const { (*i)[index_] = detail::RequiresExplicitCast::cast(value); } /** Write the data item at an offset (can be 1D or 2D or higher order difference).. The type V of the passed in value is automatically converted to value_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V value, ITERATOR const & i, DIFFERENCE const & diff) const { i[diff][index_]= detail::RequiresExplicitCast::cast(value); } /** Reset the index to the given number. */ void setIndex(int i) { index_ = i; } }; /********************************************************/ /* */ /* VectorElementAccessor */ /* */ /********************************************************/ /** \brief Accessor for one component of a vector. This works like VectorComponentAccessor, only the template paramters differ: Here, we need a vector accessor type , wheras VectorComponentAccessor requires a vector type. Usage: \code vigra::BRGBImage image(w,h); // init red channel with 255 initImage(destImageRange(image, VectorElementAccessor(0)), 255); \endcode \#include \<vigra/accessor.hxx\>
Namespace: vigra */ template class VectorElementAccessor { int index_; ACCESSOR a_; public: /** the value_type */ typedef typename ACCESSOR::component_type value_type; /** determine the component to be accessed */ VectorElementAccessor(int index, ACCESSOR a = ACCESSOR()) : index_(index), a_(a) {} /** read the current data item */ template value_type const & operator()(ITERATOR const & i) const { return a_.getComponent(i, index_); } /** read the data item at an offset (can be 1D or 2D or higher order difference). */ template value_type const & operator()(ITERATOR const & i, DIFFERENCE const & diff) const { return a_.getComponent(i, diff, index_); } /** Write the current data item. The type V of the passed in value is automatically converted to value_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V const & value, ITERATOR const & i) const { a_.setComponent(detail::RequiresExplicitCast::cast(value), i, index_); } /** Write the data item at an offset (can be 1D or 2D or higher order difference).. The type V of the passed in value is automatically converted to value_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void set(V const & value, ITERATOR const & i, DIFFERENCE const & diff) const { a_.setComponent(detail::RequiresExplicitCast::cast(value), i, diff, index_); } /** Reset the index to the given number. */ void setIndex(int i) { index_ = i; } }; /********************************************************/ /* */ /* SequenceAccessor */ /* */ /********************************************************/ /** \brief Accessor for items that are STL compatible sequences. It encapsulates access to the sequences' begin() and end() functions. Usage: \#include \<vigra/accessor.hxx\>
Namespace: vigra \code typedef std::list > ListOfLists; ListOfLists ll; ... typedef vigra::SequenceAccessor ListOfListsAccessor; ListOfListsAccessor a; for(ListOfLists::iterator li = ll.begin(); li != ll.end(); ++li) { for(ListOfListsAccessor::iterator i = a.begin(li); i != a.end(li); ++i) { *i = 10; } } \endcode */ template class SequenceAccessor : public StandardAccessor { public: /** the sequence's value_type */ typedef typename SEQUENCE::value_type component_type; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION typedef typename If::isConst, typename SEQUENCE::const_iterator, typename SEQUENCE::iterator>::type iterator; #else /** the sequence's iterator type */ typedef typename SEQUENCE::iterator iterator; #endif /** get begin iterator for sequence at given iterator position */ template iterator begin(ITERATOR const & i) const { return (*i).begin(); } /** get end iterator for sequence at given iterator position */ template iterator end(ITERATOR const & i) const { return (*i).end(); } /** get begin iterator for sequence at an offset of given iterator position */ template iterator begin(ITERATOR const & i, DIFFERENCE const & diff) const { return i[diff].begin(); } /** get end iterator for sequence at a 2D difference vector of given iterator position */ template iterator end(ITERATOR const & i, DIFFERENCE const & diff) const { return i[diff].end(); } /** get size of sequence at given iterator position */ template unsigned int size(ITERATOR const & i) const { return (*i).size(); } /** get size of sequence at 2D difference vector of given iterator position */ template unsigned int size(ITERATOR const & i, DIFFERENCE const & diff) const { return i[diff].size(); } }; /********************************************************/ /* */ /* VectorAccessor */ /* */ /********************************************************/ /** \brief Accessor for items that are STL compatible vectors. It encapsulates access to a vector's access functionality. Usage: \#include \<vigra/accessor.hxx\>
Namespace: vigra The accessor has two modes of operation:
  1. Access the vector's iterator via the begin() and end() functions: \code typedef std::list > ListOfVectors; ListOfVectors ll; ... typedef vigra::SequenceAccessor ListOfVectorsAccessor; ListOfVectorsAccessor a; for(ListOfVectors::iterator li = ll.begin(); li != ll.end(); ++li) { for(ListOfVectorsAccessor::iterator i = a.begin(li); i != a.end(li); ++i) { *i = 10; } } \endcode
  2. Access the vector's components via an index (internally calls the vector's operator[] ): \code typedef std::list > ListOfVectors; ListOfVectors ll; ... typedef vigra::SequenceAccessor ListOfVectorsAccessor; ListOfVectorsAccessor a; for(ListOfVectors::iterator li = ll.begin(); li != ll.end(); ++li) { for(int i = 0; i != a.size(li); ++i) { a.setComponent(10, li, i); } } \endcode
Required Interface: \code VECTOR v; VECTOR::iterator i; value_type d; int index; d = v[index]; v[index] = d; i = v.begin(); i = v.end(); v.size(); \endcode */ template class VectorAccessor : public SequenceAccessor { public: /** the vector's value_type */ typedef typename VECTOR::value_type component_type; /** Read the component data at given vector index at given iterator position */ template component_type const & getComponent(ITERATOR const & i, int idx) const { return (*i)[idx]; } /** Set the component data at given vector index at given iterator position. The type V of the passed in value is automatically converted to component_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void setComponent(V const & value, ITERATOR const & i, int idx) const { (*i)[idx] = detail::RequiresExplicitCast::cast(value); } /** Read the component data at given vector index at an offset of given iterator position */ template component_type const & getComponent(ITERATOR const & i, DIFFERENCE const & diff, int idx) const { return i[diff][idx]; } /** Set the component data at given vector index at an offset of given iterator position. The type V of the passed in value is automatically converted to component_type. In case of a conversion floating point -> intergral this includes rounding and clipping. */ template void setComponent(V const & value, ITERATOR const & i, DIFFERENCE const & diff, int idx) const { i[diff][idx] = detail::RequiresExplicitCast::cast(value); } }; /********************************************************/ /* */ /* MultiImageAccessor2 */ /* */ /********************************************************/ /** \brief Access two images simultaneously. This accessor is used when two images need to be treated as one because an algorithm accepts only one image. For example, \ref seededRegionGrowing() uses only one image two calculate the cost for aggregating each pixel into a region. Somtimes, we need more information to calcuate this cost, for example gray value and local gradient magnitude. These values can be stored in two images, which appear as only one when we pass a MultiImageAccessor2 to the lagorithms. Of course, the cost functor must accept a pair of values for this to work. Instead of an actual image iterator, we pass a CoordinateIterator which selects the right pixels form both images. Usage: \#include \<vigra/accessor.hxx\>
Namespace: vigra \code using namespace vigra; FImage gray_values(w,h), gradient_magnitude(w,h); IImage seeds(w,h), labels(w,h); seededRegionGrowing( srcIterRange(CoordinateIterator(), CoordinateIterator(w,h), MultiImageAccessor2 (gray_values.upperLeft(), gray_values.accessor(), gradient_magnitude.upperLeft(), gradient_magnitude.accessor())), srcImage(seeds), destImage(labels), SomeCostFunctor()); \endcode */ template class MultiImageAccessor2 { public: /** The accessors value_type: construct a pair that contains the corresponding image values. */ typedef pair value_type; /** Construct from two image iterators and associated accessors. */ MultiImageAccessor2(Iter1 i1, Acc1 a1, Iter2 i2, Acc2 a2) : i1_(i1), a1_(a1), i2_(i2), a2_(a2) {} /** read the current data item */ template value_type operator()(DIFFERENCE const & d) const { return std::make_pair(a1_(i1_, d), a2_(i2_, d)); } /** read the data item at an offset */ template value_type operator()(DIFFERENCE1 d1, DIFFERENCE2 const & d2) const { d1 += d2; return std::make_pair(a1_(i1_, d1), a2_(i2_, d1)); } private: Iter1 i1_; Acc1 a1_; Iter2 i2_; Acc2 a2_; }; //@} template struct AccessorTraits { typedef StandardAccessor default_accessor; typedef StandardConstAccessor default_const_accessor; }; #define VIGRA_DEFINE_ACCESSOR_TRAITS(VALUE, ACCESSOR, CONST_ACCESSOR) \ template <> \ struct AccessorTraits \ { \ typedef ACCESSOR default_accessor; \ typedef CONST_ACCESSOR default_const_accessor; \ }; VIGRA_DEFINE_ACCESSOR_TRAITS(signed char, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(unsigned char, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(short, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(unsigned short, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(int, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(unsigned int, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(long, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(unsigned long, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(float, StandardValueAccessor, StandardConstValueAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(double, StandardValueAccessor, StandardConstValueAccessor) template class RGBValue; template class RGBAccessor; template class TinyVector; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct AccessorTraits > { typedef RGBAccessor > default_accessor; typedef RGBAccessor > default_const_accessor; }; template struct AccessorTraits > { typedef VectorAccessor > default_accessor; typedef VectorAccessor > default_const_accessor; }; #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) VIGRA_DEFINE_ACCESSOR_TRAITS(RGBValue, RGBAccessor, RGBAccessor) #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ACCESSOR_TRAITS(VIGRA_PIXELTYPE, VectorAccessor, VectorAccessor) #undef VIGRA_PIXELTYPE #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION #undef VIGRA_DEFINE_ACCESSOR_TRAITS } // namespace vigra #endif // VIGRA_ACCESSOR_HXX gamera-3.3.3/include/vigra/affine_registration.hxx0000644000076500000000000006365311261456425021273 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2005-2006 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_AFFINE_REGISTRATION_HXX #define VIGRA_AFFINE_REGISTRATION_HXX #include "mathutil.hxx" #include "matrix.hxx" #include "linear_solve.hxx" #include "tinyvector.hxx" #include "splineimageview.hxx" #include namespace vigra { /** \addtogroup Registration Image Registration */ //@{ /********************************************************/ /* */ /* affineMatrix2DFromCorrespondingPoints */ /* */ /********************************************************/ /** \brief Create homogeneous matrix that maps corresponding points onto each other. For use with \ref affineWarpImage(). Since only two corresponding points are given, the matrix will not use a full affine transform, but only a similarity transform (translation, rotation, and uniform scaling). See \ */ template linalg::TemporaryMatrix affineMatrix2DFromCorrespondingPoints(SrcIterator s, SrcIterator send, DestIterator d) { int size = send - s; linalg::TemporaryMatrix ret(identityMatrix(3)); if(size == 1) { ret(0,2) = (*d)[0] - (*s)[0]; ret(1,2) = (*d)[1] - (*s)[1]; } else if(size == 2) { Matrix m(4,4), r(4,1), so(4,1); for(int k=0; k= 3) { Matrix m(3,3), rx(3,1), sx(3,1), ry(3,1), sy(3,1), c(3,1); c(2,0) = 1.0; for(int k=0; k class AffineMotionEstimationOptions { public: double burt_filter_strength; int highest_level, iterations_per_level; bool use_laplacian_pyramid; AffineMotionEstimationOptions() : burt_filter_strength(0.4), highest_level(4), iterations_per_level(4), use_laplacian_pyramid(false) {} template AffineMotionEstimationOptions(AffineMotionEstimationOptions const & other) : burt_filter_strength(other.burt_filter_strength), highest_level(other.highest_level), iterations_per_level(other.iterations_per_level), use_laplacian_pyramid(other.use_laplacian_pyramid) {} template AffineMotionEstimationOptions splineOrder() const { return AffineMotionEstimationOptions(*this); } AffineMotionEstimationOptions & burtFilterStrength(double strength) { vigra_precondition(0.25 <= strength && strength <= 0.5, "AffineMotionEstimationOptions::burtFilterStrength(): strength must be between 0.25 and 0.5 (inclusive)."); burt_filter_strength = strength; return *this; } AffineMotionEstimationOptions & highestPyramidLevel(unsigned int level) { highest_level = (int)level; return *this; } AffineMotionEstimationOptions & iterationsPerLevel(unsigned int iter) { vigra_precondition(0 < iter, "AffineMotionEstimationOptions::iterationsPerLevel(): must do at least one iteration per level."); iterations_per_level = (int)iter; return *this; } AffineMotionEstimationOptions & useGaussianPyramid(bool f = true) { use_laplacian_pyramid = !f; return *this; } AffineMotionEstimationOptions & useLaplacianPyramid(bool f = true) { use_laplacian_pyramid = f; return *this; } }; namespace detail { struct TranslationEstimationFunctor { template void operator()(SplineImage const & src, Image const & dest, Matrix & matrix) const { int w = dest.width(); int h = dest.height(); Matrix grad(2,1), m(2,2), r(2,1), s(2,1); double dx = matrix(0,0), dy = matrix(1,0); for(int y = 0; y < h; ++y) { double sx = matrix(0,1)*y + matrix(0,2); double sy = matrix(1,1)*y + matrix(1,2); for(int x = 0; x < w; ++x, sx += dx, sy += dy) { if(!src.isInside(sx, sy)) continue; grad(0,0) = src.dx(sx, sy); grad(1,0) = src.dy(sx, sy); double diff = dest(x, y) - src(sx, sy); m += outer(grad); r -= diff*grad; } } linearSolve(m, r, s); matrix(0,2) -= s(0,0); matrix(1,2) -= s(1,0); } }; struct SimilarityTransformEstimationFunctor { template void operator()(SplineImage const & src, Image const & dest, Matrix & matrix) const { int w = dest.width(); int h = dest.height(); Matrix grad(2,1), coord(4, 2), c(4, 1), m(4, 4), r(4,1), s(4,1); coord(0,0) = 1.0; coord(1,1) = 1.0; double dx = matrix(0,0), dy = matrix(1,0); for(int y = 0; y < h; ++y) { double sx = matrix(0,1)*y + matrix(0,2); double sy = matrix(1,1)*y + matrix(1,2); for(int x = 0; x < w; ++x, sx += dx, sy += dy) { if(!src.isInside(sx, sy)) continue; grad(0,0) = src.dx(sx, sy); grad(1,0) = src.dy(sx, sy); coord(2,0) = (double)x; coord(3,1) = (double)x; coord(3,0) = -(double)y; coord(2,1) = (double)y; double diff = dest(x, y) - src(sx, sy); c = coord * grad; m += outer(c); r -= diff*c; } } linearSolve(m, r, s); matrix(0,2) -= s(0,0); matrix(1,2) -= s(1,0); matrix(0,0) -= s(2,0); matrix(1,1) -= s(2,0); matrix(0,1) += s(3,0); matrix(1,0) -= s(3,0); } }; struct AffineTransformEstimationFunctor { template void operator()(SplineImage const & src, Image const & dest, Matrix & matrix) const { int w = dest.width(); int h = dest.height(); Matrix grad(2,1), coord(6, 2), c(6, 1), m(6,6), r(6,1), s(6,1); coord(0,0) = 1.0; coord(1,1) = 1.0; double dx = matrix(0,0), dy = matrix(1,0); for(int y = 0; y < h; ++y) { double sx = matrix(0,1)*y + matrix(0,2); double sy = matrix(1,1)*y + matrix(1,2); for(int x = 0; x < w; ++x, sx += dx, sy += dy) { if(!src.isInside(sx, sy)) continue; grad(0,0) = src.dx(sx, sy); grad(1,0) = src.dy(sx, sy); coord(2,0) = (double)x; coord(4,1) = (double)x; coord(3,0) = (double)y; coord(5,1) = (double)y; double diff = dest(x, y) - src(sx, sy); c = coord * grad; m += outer(c); r -= diff*c; } } linearSolve(m, r, s); matrix(0,2) -= s(0,0); matrix(1,2) -= s(1,0); matrix(0,0) -= s(2,0); matrix(0,1) -= s(3,0); matrix(1,0) -= s(4,0); matrix(1,1) -= s(5,0); } }; template void estimateAffineMotionImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options, Functor motionModel) { typedef typename NumericTraits::RealPromote STmpType; typedef BasicImage STmpImage; typedef typename NumericTraits::RealPromote DTmpType; typedef BasicImage DTmpImage; int toplevel = options.highest_level; ImagePyramid srcPyramid(0, toplevel, sul, slr, src); ImagePyramid destPyramid(0, toplevel, dul, dlr, dest); if(options.use_laplacian_pyramid) { pyramidReduceBurtLaplacian(srcPyramid, 0, toplevel, options.burt_filter_strength); pyramidReduceBurtLaplacian(destPyramid, 0, toplevel, options.burt_filter_strength); } else { pyramidReduceBurtFilter(srcPyramid, 0, toplevel, options.burt_filter_strength); pyramidReduceBurtFilter(destPyramid, 0, toplevel, options.burt_filter_strength); } Matrix currentMatrix(affineMatrix(2,2) == 0.0 ? identityMatrix(3) : affineMatrix); currentMatrix(0,2) /= std::pow(2.0, toplevel); currentMatrix(1,2) /= std::pow(2.0, toplevel); for(int level = toplevel; level >= 0; --level) { SplineImageView sp(srcImageRange(srcPyramid[level])); for(int iter = 0; iter < options.iterations_per_level; ++iter) { motionModel(sp, destPyramid[level], currentMatrix); } if(level > 0) { currentMatrix(0,2) *= 2.0; currentMatrix(1,2) *= 2.0; } } affineMatrix = currentMatrix; } } // namespace detail /********************************************************/ /* */ /* estimateTranslation */ /* */ /********************************************************/ /** \brief Estimate the optical flow between two images according to a translation model. Sorry, no \ref detailedDocumentation() available yet. Declarations: \#include \<vigra/affine_registration.hxx\>
Namespace: vigra pass arguments explicitly: \code namespace vigra { template void estimateTranslation(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options = AffineMotionEstimationOptions<>()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void estimateTranslation(triple src, triple dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options = AffineMotionEstimationOptions<>()) } \endcode */ doxygen_overloaded_function(template <...> void estimateTranslation) template inline void estimateTranslation(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options) { detail::estimateAffineMotionImpl(sul, slr, src, dul, dlr, dest, affineMatrix, options, detail::TranslationEstimationFunctor()); } template inline void estimateTranslation(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix) { estimateTranslation(sul, slr, src, dul, dlr, dest, affineMatrix, AffineMotionEstimationOptions<>()); } template inline void estimateTranslation(triple src, triple dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options) { estimateTranslation(src.first, src.second, src.third, dest.first, dest.second, dest.third, affineMatrix, options); } template inline void estimateTranslation(triple src, triple dest, Matrix & affineMatrix) { estimateTranslation(src.first, src.second, src.third, dest.first, dest.second, dest.third, affineMatrix, AffineMotionEstimationOptions<>()); } /********************************************************/ /* */ /* estimateSimilarityTransform */ /* */ /********************************************************/ /** \brief Estimate the optical flow between two images according to a similarity transform model (e.g. translation, rotation, and uniform scaling). Sorry, no \ref detailedDocumentation() available yet. Declarations: \#include \<vigra/affine_registration.hxx\>
Namespace: vigra pass arguments explicitly: \code namespace vigra { template void estimateSimilarityTransform(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options = AffineMotionEstimationOptions<>()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void estimateSimilarityTransform(triple src, triple dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options = AffineMotionEstimationOptions<>()) } \endcode */ doxygen_overloaded_function(template <...> void estimateSimilarityTransform) template inline void estimateSimilarityTransform(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options) { detail::estimateAffineMotionImpl(sul, slr, src, dul, dlr, dest, affineMatrix, options, detail::SimilarityTransformEstimationFunctor()); } template inline void estimateSimilarityTransform(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix) { estimateSimilarityTransform(sul, slr, src, dul, dlr, dest, affineMatrix, AffineMotionEstimationOptions<>()); } template inline void estimateSimilarityTransform(triple src, triple dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options) { estimateSimilarityTransform(src.first, src.second, src.third, dest.first, dest.second, dest.third, affineMatrix, options); } template inline void estimateSimilarityTransform(triple src, triple dest, Matrix & affineMatrix) { estimateSimilarityTransform(src.first, src.second, src.third, dest.first, dest.second, dest.third, affineMatrix, AffineMotionEstimationOptions<>()); } /********************************************************/ /* */ /* estimateAffineTransform */ /* */ /********************************************************/ /** \brief Estimate the optical flow between two images according to an affine transform model (e.g. translation, rotation, non-uniform scaling, and shearing). Sorry, no \ref detailedDocumentation() available yet. Declarations: \#include \<vigra/affine_registration.hxx\>
Namespace: vigra pass arguments explicitly: \code namespace vigra { template void estimateAffineTransform(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options = AffineMotionEstimationOptions<>()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void estimateAffineTransform(triple src, triple dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options = AffineMotionEstimationOptions<>()) } \endcode */ doxygen_overloaded_function(template <...> void estimateAffineTransform) template inline void estimateAffineTransform(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options) { detail::estimateAffineMotionImpl(sul, slr, src, dul, dlr, dest, affineMatrix, options, detail::AffineTransformEstimationFunctor()); } template inline void estimateAffineTransform(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, Matrix & affineMatrix) { estimateAffineTransform(sul, slr, src, dul, dlr, dest, affineMatrix, AffineMotionEstimationOptions<>()); } template inline void estimateAffineTransform(triple src, triple dest, Matrix & affineMatrix, AffineMotionEstimationOptions const & options) { estimateAffineTransform(src.first, src.second, src.third, dest.first, dest.second, dest.third, affineMatrix, options); } template inline void estimateAffineTransform(triple src, triple dest, Matrix & affineMatrix) { estimateAffineTransform(src.first, src.second, src.third, dest.first, dest.second, dest.third, affineMatrix, AffineMotionEstimationOptions<>()); } //@} } // namespace vigra #endif /* VIGRA_AFFINE_REGISTRATION_HXX */ gamera-3.3.3/include/vigra/affinegeometry.hxx0000644000076500000000000004067511364254131020246 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2005-2006 by Ullrich Koethe */ /* */ /* This file is part of the VIGRA computer vision library. */ /* The VIGRA Website is */ /* http://hci.iwr.uni-heidelberg.de/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_AFFINEGEOMETRY_HXX #define VIGRA_AFFINEGEOMETRY_HXX #include "mathutil.hxx" #include "matrix.hxx" #include "tinyvector.hxx" #include "splineimageview.hxx" #include namespace vigra { /** \addtogroup GeometricTransformations Geometric Transformations */ //@{ /********************************************************/ /* */ /* create affine matrices */ /* */ /********************************************************/ /** \brief Create homogeneous matrix representing a 2D translation. For use with \ref affineWarpImage(). */ inline linalg::TemporaryMatrix translationMatrix2D(TinyVector const & shift) { linalg::TemporaryMatrix ret(identityMatrix(3)); ret(0,2) = shift[0]; ret(1,2) = shift[1]; return ret; } /** \brief Create homogeneous matrix representing a 2D uniform scaling about the coordinate origin. For use with \ref affineWarpImage(). */ inline linalg::TemporaryMatrix scalingMatrix2D(double scalingFactor) { linalg::TemporaryMatrix ret(identityMatrix(3)); ret(0,0) = scalingFactor; ret(1,1) = scalingFactor; return ret; } /** \brief Create homogeneous matrix representing a 2D non-uniform scaling about the coordinate origin. For use with \ref affineWarpImage(). */ inline linalg::TemporaryMatrix scalingMatrix2D(double sx, double sy) { linalg::TemporaryMatrix ret(identityMatrix(3)); ret(0,0) = sx; ret(1,1) = sy; return ret; } /** \brief Create homogeneous matrix representing a 2D shearing. For use with \ref affineWarpImage(). */ inline linalg::TemporaryMatrix shearMatrix2D(double s01, double s10) { linalg::TemporaryMatrix ret(identityMatrix(3)); ret(0,1) = s01; ret(1,0) = s10; return ret; } /** \brief Create homogeneous matrix representing a 2D rotation about the coordinate origin. For use with \ref affineWarpImage(). Angle must be in radians. */ inline linalg::TemporaryMatrix rotationMatrix2DRadians(double angle) { linalg::TemporaryMatrix ret(identityMatrix(3)); double s = std::sin(angle); double c = std::cos(angle); ret(0,0) = c; ret(1,1) = c; ret(0,1) = -s; ret(1,0) = s; return ret; } /** \brief Create homogeneous matrix representing a 2D rotation about the coordinate origin. For use with \ref affineWarpImage(). Angle must be in degrees. */ inline linalg::TemporaryMatrix rotationMatrix2DDegrees(double angle) { return rotationMatrix2DRadians(angle*M_PI/180.0); } /** \brief Create homogeneous matrix representing a 2D rotation about the given point. For use with \ref affineWarpImage(). Angle must be in radians. */ inline linalg::TemporaryMatrix rotationMatrix2DRadians(double angle, TinyVector const & center) { return translationMatrix2D(center) * rotationMatrix2DRadians(angle) * translationMatrix2D(-center); } /** \brief Create homogeneous matrix representing a 2D rotation about the given point. For use with \ref affineWarpImage(). Angle must be in degrees. */ inline linalg::TemporaryMatrix rotationMatrix2DDegrees(double angle, TinyVector const & center) { return rotationMatrix2DRadians(angle*M_PI/180.0, center); } /********************************************************/ /* */ /* rotateImage */ /* */ /********************************************************/ /** \brief Rotate image by an arbitrary angle. The algorithm performs a rotation about the given center point (the image center by default) using the given SplineImageView for interpolation. The destination image must have the same size as the source SplineImageView. The rotation is counter-clockwise, and the angle must be given in degrees. Declarations: pass arguments explicitly: \code namespace vigra { // rotate about given center point template void rotateImage(SplineImageView const & src, DestIterator id, DestAccessor dest, double angleInDegree, TinyVector const & center); // rotate about image center template void rotateImage(SplineImageView const & src, DestIterator id, DestAccessor dest, double angleInDegree) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { // rotate about given center point template void rotateImage(SplineImageView const & src, pair dest, double angleInDegree, TinyVector const & center); // rotate about image center template void rotateImage(SplineImageView const & src, pair dest, double angleInDegree); } \endcode Usage: \#include \<vigra/affinegeometry.hxx\>
Namespace: vigra \code Image src(width, height); vigra::SplineImageView<3, Image::value_type> spline(srcImageRange(src)); Image dest(width, height); vigra::rotateImage(spline, destImage(dest), 38.5); \endcode Required Interface: \code DestImageIterator dest_upperleft; double x = ..., y = ...; if (spline.isInside(x,y)) dest_accessor.set(spline(x, y), dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void rotateImage) template void rotateImage(SplineImageView const & src, DestIterator id, DestAccessor dest, double angleInDegree, TinyVector const & center) { int w = src.width(); int h = src.height(); double angle = angleInDegree*M_PI/180.0; double c = std::cos(angle); double s = std::sin(angle); // avoid round-off errors for simple rotations if(closeAtTolerance(std::fmod(angleInDegree, 45.0), 0.0)) { // convert angle into a multiple of pi/4 //int ai = roundi(angleInDegree / 45.0) % 8; int ai = angleInDegree < 0 ? int(angleInDegree / 45.0 - 0.5) % 8 : int(angleInDegree / 45.0 + 0.5) % 8; if(ai < 0) ai += 8; static double sqrt2_2 = 0.5*M_SQRT2; static double ss[8] = {0.0, sqrt2_2, 1.0, sqrt2_2, 0.0, -sqrt2_2, -1.0, -sqrt2_2}; static double cc[8] = {1.0, sqrt2_2, 0.0, -sqrt2_2, -1.0, -sqrt2_2, 0.0, sqrt2_2}; s = ss[ai]; c = cc[ai]; } for(int y = 0; y < h; ++y, ++id.y) { typename DestIterator::row_iterator rd = id.rowIterator(); double sy = (y - center[1])*c - center[0]*s + center[1]; double sx = -(y - center[1])*s - center[0]*c + center[0]; for(int x=0; x < w; ++x, ++rd, sx += c, sy += s) { if(src.isInside(sx, sy)) dest.set(src(sx, sy), rd); } } } template inline void rotateImage(SplineImageView const & src, pair dest, double angleInDegree, TinyVector const & center) { rotateImage(src, dest.first, dest.second, angleInDegree, center); } template inline void rotateImage(SplineImageView const & src, DestIterator id, DestAccessor dest, double angleInDegree) { TinyVector center((src.width()-1.0) / 2.0, (src.height()-1.0) / 2.0); rotateImage(src, id, dest, angleInDegree, center); } template inline void rotateImage(SplineImageView const & src, pair dest, double angleInDegree) { TinyVector center((src.width()-1.0) / 2.0, (src.height()-1.0) / 2.0); rotateImage(src, dest.first, dest.second, angleInDegree, center); } /********************************************************/ /* */ /* affineWarpImage */ /* */ /********************************************************/ /** \brief Warp an image according to an affine transformation. Declarations: pass arguments explicitly: \code namespace vigra { template void affineWarpImage(SplineImageView const & src, DestIterator dul, DestIterator dlr, DestAccessor dest, MultiArrayView<2, double, C> const & affineMatrix); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void affineWarpImage(SplineImageView const & src, triple dest, MultiArrayView<2, double, C> const & affineMatrix); } \endcode The algorithm applies the given \a affineMatrix to the destination coordinates and copies the image value from the resulting source coordinates, using the given SplineImageView \a src for interpolation. If the resulting coordinate is outside the source image, nothing will be writen at that destination point. \code for all dest pixels: currentSrcCoordinate = affineMatrix * currentDestCoordinate; if src.isInside(currentSrcCoordinate): dest[currentDestCoordinate] = src[currentSrcCoordinate]; // copy an interpolated value \endcode The matrix represent a 2-dimensional affine transform by means of homogeneous coordinates, i.e. it must be a 3x3 matrix whose last row is (0,0,1). Usage: \#include \<vigra/affinegeometry.hxx\>
Namespace: vigra \code Image src(width, height); vigra::SplineImageView<3, Image::value_type> spline(srcImageRange(src)); Image dest1(width, height); // equivalent (up to round-off errors) with // rotateImage(spline, destImage(dest1), 45.0); TinyVector center((width-1.0)/2.0, (height-1.0)/2.0); affineWarpImage(spline, destImageRange(dest1), rotationMatrix2DDegrees(45.0, center)); Image dest2(2*width-1, 2*height-1); // equivalent (up to round-off errors) with // resizeImageSplineInterpolation(srcImageRange(img), destImageRange(dest2)); // note that scaleFactor = 0.5, because we must pass the transformation from destination to source affineWarpImage(spline, destImageRange(dest2), scalingMatrix2D(0.5)); \endcode Required Interface: \code DestImageIterator dest_upperleft; double x = ..., y = ...; if (spline.isInside(x,y)) dest_accessor.set(spline(x, y), dest_upperleft); \endcode See also: Functions to specify affine transformation: \ref translationMatrix2D(), \ref scalingMatrix2D(), \ref shearMatrix2D(), \ref rotationMatrix2DRadians(), \ref rotationMatrix2DDegrees() */ doxygen_overloaded_function(template <...> void affineWarpImage) template void affineWarpImage(SplineImageView const & src, DestIterator dul, DestIterator dlr, DestAccessor dest, MultiArrayView<2, double, C> const & affineMatrix) { vigra_precondition(rowCount(affineMatrix) == 3 && columnCount(affineMatrix) == 3 && affineMatrix(2,0) == 0.0 && affineMatrix(2,1) == 0.0 && affineMatrix(2,2) == 1.0, "affineWarpImage(): matrix doesn't represent an affine transformation with homogeneous 2D coordinates."); double w = dlr.x - dul.x; double h = dlr.y - dul.y; for(double y = 0.0; y < h; ++y, ++dul.y) { typename DestIterator::row_iterator rd = dul.rowIterator(); for(double x=0.0; x < w; ++x, ++rd) { double sx = x*affineMatrix(0,0) + y*affineMatrix(0,1) + affineMatrix(0,2); double sy = x*affineMatrix(1,0) + y*affineMatrix(1,1) + affineMatrix(1,2); if(src.isInside(sx, sy)) dest.set(src(sx, sy), rd); } } } template inline void affineWarpImage(SplineImageView const & src, triple dest, MultiArrayView<2, double, C> const & affineMatrix) { affineWarpImage(src, dest.first, dest.second, dest.third, affineMatrix); } //@} } // namespace vigra #endif /* VIGRA_AFFINEGEOMETRY_HXX */ gamera-3.3.3/include/vigra/array_vector.hxx0000644000076500000000000006225611261456425017747 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2002-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_ARRAY_VECTOR_HXX #define VIGRA_ARRAY_VECTOR_HXX #include "memory.hxx" #include #include #include namespace vigra { template > class ArrayVector; /** Provide STL conforming interface for C-arrays. This template implements much of the functionality of std::vector on top of a C-array. ArrayVectorView does not manage the memory it refers to (i.e. it does not allocate or deallocate any memory). Thus, if the underlying memory changes, all dependent ArrayVectorView objects are invalidated. This is especially important when ArrayVectorView is used as a base class for ArrayVector, where several functions (e.g. resize(), insert()) can allocate new memory and thus invalidate the dependent views. The rules what operations invalidate view objects are the same as the rules concerning standard iterators. \#include \<vigra/array_vector.hxx\>
Namespace: vigra */ template class ArrayVectorView { typedef ArrayVectorView this_type; public: /** default constructor */ typedef T value_type; typedef value_type & reference; typedef value_type const & const_reference; typedef value_type * pointer; typedef value_type const * const_pointer; typedef value_type * iterator; typedef value_type const * const_iterator; typedef unsigned int size_type; typedef int difference_type; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; public: /** default constructor. View contains NULL pointer. */ ArrayVectorView() : size_(0), data_(0) {} /** Construct for given array \a data of length \a size. data, data+size must form a valid range. */ ArrayVectorView( size_type size, pointer const & data) : size_(size), data_(data) {} /** Copy constructor. */ ArrayVectorView( this_type const & rhs ) : size_(rhs.size_), data_(rhs.data_) {} /** Copy assignment. There are 3 cases:
  • When this ArrayVectorView does not point to valid data (e.g. after default construction), it becomes a copy of \a rhs.
  • When the shapes of the two arrays match, the array contents (not the pointers) are copied.
  • Otherwise, a PreconditionViolation exception is thrown.
*/ ArrayVectorView & operator=( ArrayVectorView const & rhs ); /** Copy assignment. When the shapes of the two arrays match, the array contents (not the pointers) are copied. Otherwise, a PreconditionViolation exception is thrown. */ template this_type & operator=( ArrayVectorView const & rhs ) { copyImpl(rhs); return *this; } /** Overwrite all array elements with the value \a initial. */ template void init(U const & initial) { std::fill(begin(), end(), initial); } /** Copy array elements. When the shapes of the two arrays match, the array contents (not the pointers) are copied. Otherwise, a PreconditionViolation exception is thrown. */ void copy( this_type const & rhs ) { if(data_ != rhs.data_) copyImpl(rhs); } /** Copy array elements. When the shapes of the two arrays match, the array contents (not the pointers) are copied. Otherwise, a PreconditionViolation exception is thrown. */ template void copy( ArrayVectorView const & rhs ) { copyImpl(rhs); } /** Swap array elements. When the shapes of the two arrays match, the array contents (not the pointers) are swapped. Otherwise, a PreconditionViolation exception is thrown. */ void swapData(this_type rhs) { if(data_ != rhs.data_) swapDataImpl(rhs); } /** Swap array elements. When the shapes of the two arrays match, the array contents (not the pointers) are swapped. Otherwise, a PreconditionViolation exception is thrown. */ template void swapData(ArrayVectorView rhs) { swapDataImpl(rhs); } /** Construct ArrayVectorView refering to a subarray. \a begin and \a end must be a valid sub-range of the current array. Otherwise, a PreconditionViolation exception is thrown. */ this_type subarray (size_type begin, size_type end) const { vigra_precondition(begin >= 0 && begin <= end && end <= size_, "ArrayVectorView::subarray(): Limits out of range."); return this_type(end-begin, data_ + begin); } /** Get contained const pointer to the data. */ inline const_pointer data() const { return data_; } /** Get contained pointer to the data. */ inline pointer data() { return data_; } /** Get const iterator refering to the first array element. */ inline const_iterator begin() const { return data(); } /** Get iterator refering to the first array element. */ inline iterator begin() { return data(); } /** Get const iterator pointing beyond the last array element. */ inline const_iterator end() const { return data() + size(); } /** Get iterator pointing beyond the last array element. */ inline iterator end() { return data() + size(); } /** Get reverse iterator referring to the last array element. */ inline reverse_iterator rbegin() { return (reverse_iterator(end())); } /** Get const reverse iterator referring to the last array element. */ inline const_reverse_iterator rbegin() const { return (const_reverse_iterator(end())); } /** Get reverse iterator pointing before the first array element. */ inline reverse_iterator rend() { return (reverse_iterator(begin())); } /** Get const reverse iterator pointing before the first array element. */ inline const_reverse_iterator rend() const { return (const_reverse_iterator(begin())); } /** Access first array element. */ reference front() { return *data_; } /** Read first array element. */ const_reference front() const { return *data_; } /** Access last array element. */ reference back() { return data_[size_-1]; } /** Read last array element. */ const_reference back() const { return data_[size_-1]; } /** Access array element \a i. */ reference operator[]( difference_type i ) { return data()[i]; } /** Read array element \a i. */ const_reference operator[]( difference_type i ) const { return data()[i]; } /** Equivalent to size() == 0. */ bool empty() const { return size_ == 0; } /** Number of elements in the array. */ size_type size() const { return size_; } /** Check for element-wise equality of two array. Also returns false if the two arrays have different sizes. */ template bool operator==(ArrayVectorView const & rhs) const; /** check whether two arrays are not elementwise equal. Also returns true if the two arrays have different sizes. */ template bool operator!=(ArrayVectorView const & rhs) const { return !operator==(rhs); } /** check whether the given point is in the array range. */ bool isInside (difference_type const & p) const { return p >= 0 && p < size_; } protected: template void copyImpl(const ArrayVectorView & rhs); void copyImpl(const ArrayVectorView & rhs); template void swapDataImpl(const ArrayVectorView & rhs); size_type size_; pointer data_; }; template ArrayVectorView & ArrayVectorView::operator=( ArrayVectorView const & rhs ) { if(data_ == 0) { size_ = rhs.size_; data_ = rhs.data_; } else if(data_ != rhs.data_) copyImpl(rhs); return *this; } template template bool ArrayVectorView::operator==(ArrayVectorView const & rhs) const { if(size() != rhs.size()) return false; for(unsigned int k=0; k void ArrayVectorView ::copyImpl(const ArrayVectorView & rhs) { vigra_precondition (size() == rhs.size(), "ArrayVectorView::copy(): shape mismatch."); // use copy() or copy_backward() according to possible overlap of this and rhs if(data_ <= rhs.data()) { std::copy(rhs.begin(), rhs.end(), begin()); } else { std::copy_backward(rhs.begin(), rhs.end(), end()); } } template template void ArrayVectorView ::copyImpl(const ArrayVectorView & rhs) { vigra_precondition (size() == rhs.size(), "ArrayVectorView::copy(): shape mismatch."); std::copy(rhs.begin(), rhs.end(), begin()); } template template void ArrayVectorView ::swapDataImpl(const ArrayVectorView & rhs) { vigra_precondition (size () == rhs.size() (), "ArrayVectorView::swapData(): size mismatch."); // check for overlap if(data_ + size_ <= rhs.data_ || rhs.data_ + size_ <= data_) { for(unsigned int k=0; k t(*this); copyImpl(rhs); rhs.copyImpl(*this); } } /** Replacement for std::vector. This template implements the same functionality as std::vector. However, it gives two useful guarantees, that std::vector fails to provide:
  • The memory is always allocated as one contiguous piece.
  • The iterator is always a T *
This means that memory managed by ArrayVector can be passed to algorithms that expect raw memory. This is especially important when lagacy or C code has to be called, but it is also useful for certain optimizations. Moreover, ArrayVector is derived from ArrayVectorView so that one can create views of the array (in particular, subarrays). This implies another important difference to std::vector: the indexing operator (ArrayVector::operator[]) takes signed indices. In this way, an ArrayVectorView can be used with negative indices: \code ArrayVector data(100); ArrayVectorView view = data.subarray(50, 100); view[-50] = 1; // valid access \endcode Refer to the documentation of std::vector for a detailed description of ArrayVector functionality. \#include \<vigra/array_vector.hxx\>
Namespace: vigra */ template */ > class ArrayVector : public ArrayVectorView { typedef ArrayVector this_type; enum { minimumCapacity = 2 }; public: typedef ArrayVectorView view_type; typedef typename view_type::value_type value_type; typedef typename view_type::reference reference; typedef typename view_type::const_reference const_reference; typedef typename view_type::pointer pointer; typedef typename view_type::const_pointer const_pointer; typedef typename view_type::iterator iterator; typedef typename view_type::const_iterator const_iterator; typedef typename view_type::size_type size_type; typedef typename view_type::difference_type difference_type; typedef typename view_type::reverse_iterator reverse_iterator; typedef typename view_type::const_reverse_iterator const_reverse_iterator; typedef Alloc allocator_type; public: ArrayVector() : view_type(), capacity_(minimumCapacity), alloc_(Alloc()) { this->data_ = reserve_raw(capacity_); } explicit ArrayVector(Alloc const & alloc) : view_type(), capacity_(minimumCapacity), alloc_(alloc) { this->data_ = reserve_raw(capacity_); } explicit ArrayVector( size_type size, Alloc const & alloc = Alloc()) : view_type(size, 0), capacity_(size), alloc_(alloc) { this->data_ = reserve_raw(capacity_); if(this->size_ > 0) std::uninitialized_fill(this->data_, this->data_+this->size_, value_type()); } ArrayVector( size_type size, value_type const & initial, Alloc const & alloc = Alloc()) : view_type(size, 0), capacity_(size), alloc_(alloc) { this->data_ = reserve_raw(capacity_); if(this->size_ > 0) std::uninitialized_fill(this->data_, this->data_+this->size_, initial); } ArrayVector( this_type const & rhs ) : view_type(rhs.size(), 0), capacity_(rhs.capacity_), alloc_(rhs.alloc_) { this->data_ = reserve_raw(capacity_); if(this->size_ > 0) std::uninitialized_copy(rhs.data_, rhs.data_+rhs.size_, this->data_); } template explicit ArrayVector( ArrayVectorView const & rhs, Alloc const & alloc = Alloc() ); template ArrayVector(InputIterator i, InputIterator end); template ArrayVector(InputIterator i, InputIterator end, Alloc const & alloc); this_type & operator=( this_type const & rhs ) { if(this == &rhs) return *this; if(this->size_ == rhs.size_) this->copyImpl(rhs); else { ArrayVector t(rhs); this->swap(t); } return *this; } template this_type & operator=( ArrayVectorView const & rhs); ~ArrayVector() { deallocate(this->data_, this->size_); } void pop_back(); void push_back( value_type const & t ); iterator insert(iterator p, value_type const & v); iterator insert(iterator p, size_type n, value_type const & v); template iterator insert(iterator p, InputIterator i, InputIterator iend); iterator erase(iterator p); iterator erase(iterator p, iterator q); void clear(); void reserve( size_type new_capacity ); void reserve(); void resize( size_type new_size, value_type const & initial ); void resize( size_type new_size ) { resize(new_size, value_type()); } size_type capacity() const { return capacity_; } void swap(this_type & rhs); private: void deallocate(pointer data, size_type size); pointer reserve_raw(size_type capacity); size_type capacity_; Alloc alloc_; }; template template ArrayVector::ArrayVector( ArrayVectorView const & rhs, Alloc const & alloc ) : view_type(rhs.size(), 0), capacity_(rhs.size()), alloc_(alloc) { this->data_ = reserve_raw(capacity_); if(this->size_ > 0) std::uninitialized_copy(rhs.data(), rhs.data()+rhs.size(), this->data_); } template template ArrayVector::ArrayVector(InputIterator i, InputIterator end) : view_type(std::distance(i, end), 0), capacity_(view_type::size_), alloc_() { this->data_ = reserve_raw(capacity_); std::uninitialized_copy(i, end, this->data_); } template template ArrayVector::ArrayVector(InputIterator i, InputIterator end, Alloc const & alloc) : view_type(std::distance(i, end), 0), capacity_(view_type::size_), alloc_(alloc) { this->data_ = reserve_raw(capacity_); std::uninitialized_copy(i, end, this->data_); } template template ArrayVector & ArrayVector::operator=( ArrayVectorView const & rhs ) { if(this->size_ == rhs.size()) this->copyImpl(rhs); else { ArrayVector t(rhs); this->swap(t); } return *this; } template inline void ArrayVector::pop_back() { --this->size_; alloc_.destroy(this->data_ + this->size_); } template inline void ArrayVector::push_back( value_type const & t ) { reserve(); alloc_.construct(this->data_ + this->size_, t); ++this->size_; } template inline void ArrayVector::clear() { detail::destroy_n(this->data_, (int)this->size_); this->size_ = 0; } template typename ArrayVector::iterator ArrayVector::insert(iterator p, value_type const & v) { difference_type pos = p - this->begin(); if(p == this->end()) { push_back(v); p = this->begin() + pos; } else { push_back(this->back()); p = this->begin() + pos; std::copy_backward(p, this->end() - 2, this->end() - 1); *p = v; } return p; } template typename ArrayVector::iterator ArrayVector::insert(iterator p, size_type n, value_type const & v) { difference_type pos = p - this->begin(); size_type new_size = this->size() + n; if(new_size >= capacity_) { pointer new_data = reserve_raw(new_size); std::uninitialized_copy(this->begin(), p, new_data); std::uninitialized_fill(new_data + pos, new_data + pos + n, v); std::uninitialized_copy(p, this->end(), new_data + pos + n); deallocate(this->data_, this->size_); capacity_ = new_size; this->data_ = new_data; } else if(pos + n >= this->size_) { size_type diff = pos + n - this->size_; std::uninitialized_copy(p, this->end(), this->end() + diff); std::uninitialized_fill(this->end(), this->end() + diff, v); std::fill(p, this->end(), v); } else { size_type diff = this->size_ - (pos + n); std::uninitialized_copy(this->end() - n, this->end(), this->end()); std::copy_backward(p, p + diff, this->end()); std::fill(p, p + n, v); } this->size_ = new_size; return this->begin() + pos; } template template typename ArrayVector::iterator ArrayVector::insert(iterator p, InputIterator i, InputIterator iend) { size_type n = iend - i; size_type pos = p - this->begin(); size_type new_size = this->size() + n; if(new_size >= capacity_) { pointer new_data = reserve_raw(new_size); std::uninitialized_copy(this->begin(), p, new_data); std::uninitialized_copy(i, iend, new_data + pos); std::uninitialized_copy(p, this->end(), new_data + pos + n); deallocate(this->data_, this->size_); capacity_ = new_size; this->data_ = new_data; } else if(pos + n >= this->size_) { size_type diff = pos + n - this->size_; std::uninitialized_copy(p, this->end(), this->end() + diff); std::uninitialized_copy(iend - diff, iend, this->end()); std::copy(i, iend - diff, p); } else { size_type diff = this->size_ - (pos + n); std::uninitialized_copy(this->end() - n, this->end(), this->end()); std::copy_backward(p, p + diff, this->end()); std::copy(i, iend, p); } this->size_ = new_size; return this->begin() + pos; } template typename ArrayVector::iterator ArrayVector::erase(iterator p) { std::copy(p+1, this->end(), p); pop_back(); return p; } template typename ArrayVector::iterator ArrayVector::erase(iterator p, iterator q) { std::copy(q, this->end(), p); difference_type eraseCount = q - p; detail::destroy_n(this->end() - eraseCount, eraseCount); this->size_ -= eraseCount; return p; } template inline void ArrayVector::reserve( size_type new_capacity ) { if(new_capacity <= capacity_) return; pointer new_data = reserve_raw(new_capacity); if(this->size_ > 0) std::uninitialized_copy(this->data_, this->data_+this->size_, new_data); deallocate(this->data_, this->size_); this->data_ = new_data; capacity_ = new_capacity; } template inline void ArrayVector::reserve() { if(capacity_ == 0) reserve(minimumCapacity); else if(this->size_ == capacity_) reserve(2*capacity_); } template inline void ArrayVector::resize( size_type new_size, value_type const & initial) { if(new_size < this->size_) erase(this->begin() + new_size, this->end()); else if(this->size_ < new_size) { insert(this->end(), new_size - this->size(), initial); } } template inline void ArrayVector::swap(this_type & rhs) { std::swap(this->size_, rhs.size_); std::swap(capacity_, rhs.capacity_); std::swap(this->data_, rhs.data_); } template inline void ArrayVector::deallocate(pointer data, size_type size) { if(data) { detail::destroy_n(data, (int)size); alloc_.deallocate(data, size); } } template inline typename ArrayVector::pointer ArrayVector::reserve_raw(size_type capacity) { pointer data = 0; if(capacity) { data = alloc_.allocate(capacity); } return data; } } // namespace vigra namespace std { template ostream & operator<<(ostream & s, vigra::ArrayVectorView const & a) { for(unsigned int k=0; k namespace vigra { /** \addtogroup GeometricTransformations Geometric Transformations */ //@{ /********************************************************/ /* */ /* rotateImage */ /* */ /********************************************************/ /** \brief Rotate image by a multiple of 90 degrees. This algorithm just copies the pixels in the appropriate new order. It expects the destination image to have the correct shape for the desired rotation. Declarations: pass arguments explicitly: \code namespace vigra { template void rotateImage(SrcIterator is, SrcIterator end, SrcAccessor as, DestIterator id, DestAccessor ad, int rotation); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void rotateImage(triple src, pair dest, int rotation); } \endcode Usage: \#include \<vigra/basicgeometry.hxx\>
Namespace: vigra \code Image dest(src.height(), src.width()); // note that width and height are exchanged vigra::rotateImage(srcImageRange(src), destImage(dest), 90); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; dest_accessor.set(src_accessor(src_upperleft), dest_upperleft); \endcode Preconditions: \code src_lowerright.x - src_upperleft.x > 1 src_lowerright.y - src_upperleft.y > 1 \endcode */ doxygen_overloaded_function(template <...> void rotateImage) template void rotateImage(SrcIterator is, SrcIterator end, SrcAccessor as, DestIterator id, DestAccessor ad, int rotation) { int x, y; int ws = end.x - is.x; int hs = end.y - is.y; vigra_precondition(rotation % 90 == 0, "rotateImage(): " "This function rotates images only about multiples of 90 degree"); rotation = rotation%360; if (rotation < 0) rotation += 360; switch(rotation) { case 0: copyImage(is, end, as, id, ad); break; case 90: is.x += (ws-1); for(x=0; x != ws; x++, is.x--, id.y++) { typename SrcIterator::column_iterator cs = is.columnIterator(); typename DestIterator::row_iterator rd = id.rowIterator(); for(y=0; y != hs; y++, cs++, rd++) { ad.set(as(cs), rd); } } break; case 180: end.x--; end.y--; for(x=0; x != ws; x++, end.x--, id.x++) { typename SrcIterator::column_iterator cs = end.columnIterator(); typename DestIterator::column_iterator cd = id.columnIterator(); for(y=0; y != hs; y++, cs--, cd++) { ad.set(as(cs), cd); } } break; case 270: is.y += (hs-1); for(x=0; x != ws; x++, is.x++, id.y++) { typename SrcIterator::column_iterator cs = is.columnIterator(); typename DestIterator::row_iterator rd = id.rowIterator(); for(y=0; y != hs; y++, cs--, rd++) { ad.set(as(cs), rd); } } break; default: //not needful, because of the exception handig in if-statement vigra_fail("internal error"); } } template inline void rotateImage(triple src, pair dest, int rotation) { rotateImage(src.first, src.second, src.third, dest.first, dest.second, rotation); } /********************************************************/ /* */ /* reflectImage */ /* */ /********************************************************/ enum Reflect{horizontal = 1, vertical = 2}; /** \brief Reflect image horizontally or vertically. The reflection direction refers to the reflection axis, i.e. horizontal reflection turns the image upside down, vertical reflection changes left for right. The directions are selected by the enum values vigra::horizontal and vigra::vertical. The two directions can also be "or"ed together to perform both reflections simultaneously (see example below) -- this is the same as a 180 degree rotation. Declarations: pass arguments explicitly: \code namespace vigra { template void reflectImage(SrcIterator is, SrcIterator end, SrcAccessor as, DestIterator id, DestAccessor ad, Reflect axis); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void reflectImage(triple src, pair dest, Reflect axis); } \endcode Usage: \#include \<vigra/basicgeometry.hxx\>
Namespace: vigra \code Image dest(src.width(), src.height()); vigra::reflectImage(srcImageRange(src), destImage(dest), vigra::horizontal | vigra::vertical); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; dest_accessor.set(src_accessor(src_upperleft), dest_upperleft); \endcode Preconditions: \code src_lowerright.x - src_upperleft.x > 1 src_lowerright.y - src_upperleft.y > 1 \endcode */ doxygen_overloaded_function(template <...> void reflectImage) template void reflectImage(SrcIterator is, SrcIterator end, SrcAccessor as, DestIterator id, DestAccessor ad, Reflect reflect) { int ws = end.x - is.x; int hs = end.y - is.y; int x, y; if(reflect == horizontal) {//flipImage is.y += (hs-1); for(x=0; x inline void reflectImage(triple src, pair dest, Reflect reflect) { reflectImage(src.first, src.second, src.third, dest.first, dest.second, reflect); } /********************************************************/ /* */ /* transposeImage */ /* */ /********************************************************/ enum Transpose{major = 1, minor = 2}; /** \brief Transpose an image over the major or minor diagonal. The transposition direction refers to the axis, i.e. major transposition turns the upper right corner into the lower left one, whereas minor transposition changes the upper left corner into the lower right one. The directions are selected by the enum values vigra::major and vigra::minor. The two directions can also be "or"ed together to perform both reflections simultaneously (see example below) -- this is the same as a 180 degree rotation. Declarations: pass arguments explicitly: \code namespace vigra { template void transposeImage(SrcIterator is, SrcIterator end, SrcAccessor as, DestIterator id, DestAccessor ad, Transpose axis); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void transposeImage(triple src, pair dest, Transpose axis); } \endcode Usage: \#include \<vigra/basicgeometry.hxx\>
Namespace: vigra \code Image dest(src.width(), src.height()); vigra::transposeImage(srcImageRange(src), destImage(dest), vigra::major | vigra::minor); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; dest_accessor.set(src_accessor(src_upperleft), dest_upperleft); \endcode Preconditions: \code src_lowerright.x - src_upperleft.x > 1 src_lowerright.y - src_upperleft.y > 1 \endcode */ doxygen_overloaded_function(template <...> void transposeImage) template void transposeImage(SrcIterator is, SrcIterator end, SrcAccessor as, DestIterator id, DestAccessor ad, Transpose transpose) { int ws = end.x - is.x; int hs = end.y - is.y; int x, y; if(transpose == major) {//Die Funktion spiegelt das Bild um (0,0) (1,1) Diagonale for(x=0; x != ws; x++, is.x++, id.y++) { typename SrcIterator::column_iterator cs = is.columnIterator(); typename DestIterator::row_iterator rd = id.rowIterator(); for(y=0; y != hs; y++, cs++, rd++) { ad.set(as(cs), rd); } } } else if(transpose == minor) {//Die Funktion spiegelt das Bild (1,0) (0,1) Diagonale end.x--; end.y--; for(x=0; x != ws; x++, --end.x, ++id.y) { typename SrcIterator::column_iterator cs = end.columnIterator(); typename DestIterator::row_iterator rd = id.rowIterator(); for(y=0; y != hs; y++, --cs, ++rd) { ad.set(as(cs), rd); } } } else if(transpose == (major | minor)) {//flipFlopImage //??? end.x--; end.y--; for(x=0; x != ws; x++, end.x--, id.x++) { typename SrcIterator::column_iterator cs = end.columnIterator(); typename DestIterator::column_iterator cd = id.columnIterator(); for(y=0; y != hs; y++, cs--, cd++) { ad.set(as(cs), cd); } } } else vigra_fail("transposeImage(): " "This function transposes major or minor," " 'and' is included"); } template inline void transposeImage(triple src, pair dest, Transpose transpose) { transposeImage(src.first, src.second, src.third, dest.first, dest.second, transpose); } /********************************************************/ /* */ /* resampleLine */ /* */ /********************************************************/ /* * Vergroessert eine Linie um einen Faktor. * Ist z.B. der Faktor = 4 so werden in der * neuen Linie(Destination) jedes Pixel genau 4 mal * vorkommen, also es findet auch keine Glaetung * statt (NoInterpolation). Als Parameter sollen * der Anfangs-, der Enditerator und der Accessor * der Ausgangslinie (Source line), der Anfangsiterator * und Accessor der Ziellinie (destination line) und * anschliessend der Faktor um den die Linie (Zeile) * vergroessert bzw. verkleinert werden soll. */ template void resampleLine(SrcIterator src_iter, SrcIterator src_iter_end, SrcAccessor src_acc, DestIterator dest_iter, DestAccessor dest_acc, double factor) { // The width of the src line. int src_width = src_iter_end - src_iter; vigra_precondition(src_width > 0, "resampleLine(): input image too small."); vigra_precondition(factor > 0.0, "resampleLine(): factor must be positive."); if (factor >= 1.0) { int int_factor = (int)factor; double dx = factor - int_factor; double saver = dx; for ( ; src_iter != src_iter_end ; ++src_iter, saver += dx) { if (saver >= 1.0) { saver = saver - (int)saver; dest_acc.set(src_acc(src_iter), dest_iter); ++dest_iter; } for(int i = 0 ; i < int_factor ; i++, ++dest_iter) { dest_acc.set(src_acc(src_iter), dest_iter); } } } else { DestIterator dest_end = dest_iter + (int)VIGRA_CSTD::ceil(src_width*factor); factor = 1.0/factor; int int_factor = (int)factor; double dx = factor - int_factor; double saver = dx; src_iter_end -= 1; for ( ; src_iter != src_iter_end && dest_iter != dest_end ; ++dest_iter, src_iter += int_factor, saver += dx) { if (saver >= 1.0) { saver = saver - (int)saver; ++src_iter; } dest_acc.set(src_acc(src_iter), dest_iter); } if (dest_iter != dest_end) { dest_acc.set(src_acc(src_iter_end), dest_iter); } } } inline int sizeForResamplingFactor(int oldsize, double factor) { return (factor < 1.0) ? (int)VIGRA_CSTD::ceil(oldsize * factor) : (int)(oldsize * factor); } /********************************************************/ /* */ /* resampleImage */ /* */ /********************************************************/ /** \brief Resample image by a given factor. This algorithm is very fast and does not require any arithmetic on the pixel types. The input image must have a size of at least 2x2. Destiniation pixels are directly copied from the appropriate source pixels. The size of the result image is the product of factor and the original size, where we round up if factor < 1.0 and down otherwise. This size calculation is the main difference to the convention used in the similar function \ref resizeImageNoInterpolation(): there, the result size is calculated as n*(old_width-1)+1 and n*(old_height-1)+1. This is because \ref resizeImageNoInterpolation() does not replicate the last pixel in every row/column in order to make it compatible with the other functions of the resizeImage... family. The function can be called with different resampling factors for x and y, or with a single factor to be used for both directions. It should also be noted that resampleImage() is implemented so that an enlargement followed by the corresponding shrinking reproduces the original image. The function uses accessors. Declarations: pass arguments explicitly: \code namespace vigra { template void resampleImage(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor ad, double factor); template void resampleImage(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor ad, double xfactor, double yfactor); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void resampleImage(triple src, pair dest, double factor); template inline void resampleImage(triple src, pair dest, double xfactor, double yfactor); } \endcode Usage: \#include \<vigra/basicgeometry.hxx\>
Namespace: vigra \code double factor = 2.0; Image dest((int)(factor*src.width()), (int)(factor*src.height())); vigra::resampleImage(srcImageRange(src), destImage(dest), factor); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; dest_accessor.set(src_accessor(src_upperleft), dest_upperleft); \endcode Preconditions: \code src_lowerright.x - src_upperleft.x > 1 src_lowerright.y - src_upperleft.y > 1 \endcode */ doxygen_overloaded_function(template <...> void resampleImage) template void resampleImage(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor ad, double xfactor, double yfactor) { int width_old = iend.x - is.x; int height_old = iend.y - is.y; //Bei Verkleinerung muss das dest-Bild ceiling(src*factor), da z.B. //aus 6x6 grossem Bild wird eins 18x18 grosses gemacht bei Vergroesserungsfaktor 3.1 //umgekehrt damit wir vom 18x18 zu 6x6 (und nicht 5x5) bei Vergroesserung von 1/3.1 //muss das kleinste Integer das groesser als 18/3.1 ist genommen werden. int height_new = sizeForResamplingFactor(height_old, yfactor); int width_new = sizeForResamplingFactor(width_old, xfactor); vigra_precondition((width_old > 1) && (height_old > 1), "resampleImage(): " "Source image to small.\n"); vigra_precondition((width_new > 1) && (height_new > 1), "resampleImage(): " "Destination image to small.\n"); typedef typename SrcAccessor::value_type SRCVT; typedef BasicImage TmpImage; typedef typename TmpImage::traverser TmpImageIterator; BasicImage tmp(width_old, height_new); int x,y; typename BasicImage::Iterator yt = tmp.upperLeft(); for(x=0; x void resampleImage(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor ad, double factor) { resampleImage(is, iend, sa, id, ad, factor, factor); } template inline void resampleImage(triple src, pair dest, double factor) { resampleImage(src.first, src.second, src.third, dest.first, dest.second, factor); } template inline void resampleImage(triple src, pair dest, double xfactor, double yfactor) { resampleImage(src.first, src.second, src.third, dest.first, dest.second, xfactor, yfactor); } //@} } // namespace vigra #endif /* VIGRA_BASICGEOMETRY_HXX */ gamera-3.3.3/include/vigra/basicimage.hxx0000644000076500000000000014101211261456425017317 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_BASICIMAGE_HXX #define VIGRA_BASICIMAGE_HXX #include #include #include "utilities.hxx" #include "iteratortraits.hxx" #include "accessor.hxx" namespace vigra { template class LineBasedColumnIteratorPolicy { public: typedef IMAGEITERATOR ImageIterator; typedef typename IMAGEITERATOR::LineStartIterator LineStartIterator; typedef typename IMAGEITERATOR::value_type value_type; typedef typename IMAGEITERATOR::difference_type::MoveY difference_type; typedef typename IMAGEITERATOR::reference reference; typedef typename IMAGEITERATOR::index_reference index_reference; typedef typename IMAGEITERATOR::pointer pointer; typedef std::random_access_iterator_tag iterator_category; struct BaseType { explicit BaseType(LineStartIterator c = LineStartIterator(), difference_type o = 0) : line_start_(c), offset_(o) {} LineStartIterator line_start_; difference_type offset_; }; static void initialize(BaseType &) {} static reference dereference(BaseType const & d) { return const_cast(*(*d.line_start_ + d.offset_)); } static index_reference dereference(BaseType const & d, difference_type n) { return const_cast(*(d.line_start_[n] + d.offset_)); } static bool equal(BaseType const & d1, BaseType const & d2) { return d1.line_start_ == d2.line_start_; } static bool less(BaseType const & d1, BaseType const & d2) { return d1.line_start_ < d2.line_start_; } static difference_type difference(BaseType const & d1, BaseType const & d2) { return d1.line_start_ - d2.line_start_; } static void increment(BaseType & d) { ++d.line_start_; } static void decrement(BaseType & d) { --d.line_start_; } static void advance(BaseType & d, difference_type n) { d.line_start_ += n; } }; /********************************************************/ /* */ /* BasicImageIterator */ /* */ /********************************************************/ /** Implementation of the standard image iterator for \ref vigra::BasicImage. See \ref vigra::ImageIterator for documentation. \#include \<vigra/basicimage.hxx\> Namespace: vigra */ template class BasicImageIteratorBase { public: typedef BasicImageIteratorBase self_type; typedef LINESTARTITERATOR LineStartIterator; typedef PIXELTYPE value_type; typedef PIXELTYPE PixelType; typedef REFERENCE reference; typedef REFERENCE index_reference; typedef POINTER pointer; typedef Diff2D difference_type; typedef image_traverser_tag iterator_category; typedef POINTER row_iterator; typedef IteratorAdaptor > column_iterator; typedef int MoveX; typedef LINESTARTITERATOR MoveY; MoveX x; MoveY y; IMAGEITERATOR & operator+=(difference_type const & s) { x += s.x; y += s.y; return static_cast(*this); } IMAGEITERATOR & operator-=(difference_type const & s) { x -= s.x; y -= s.y; return static_cast(*this); } IMAGEITERATOR operator+(difference_type const & s) const { IMAGEITERATOR ret(static_cast(*this)); ret += s; return ret; } IMAGEITERATOR operator-(difference_type const & s) const { IMAGEITERATOR ret(static_cast(*this)); ret -= s; return ret; } difference_type operator-(BasicImageIteratorBase const & rhs) const { return difference_type(x - rhs.x, y - rhs.y); } bool operator==(BasicImageIteratorBase const & rhs) const { return (x == rhs.x) && (y == rhs.y); } bool operator!=(BasicImageIteratorBase const & rhs) const { return (x != rhs.x) || (y != rhs.y); } reference operator*() const { return *(*y + x ); } pointer operator->() const { return *y + x; } index_reference operator[](difference_type const & d) const { return *(*(y + d.y) + x + d.x); } index_reference operator()(int dx, int dy) const { return *(*(y + dy) + x + dx); } pointer operator[](int dy) const { return y[dy] + x; } row_iterator rowIterator() const { return *y + x; } column_iterator columnIterator() const { typedef typename column_iterator::BaseType Iter; return column_iterator(Iter(y, x)); } protected: BasicImageIteratorBase(LINESTARTITERATOR const & line) : x(0), y(line) {} BasicImageIteratorBase(int ix, LINESTARTITERATOR const & line) : x(ix), y(line) {} BasicImageIteratorBase() : x(0), y(0) {} }; /********************************************************/ /* */ /* BasicImageIterator */ /* */ /********************************************************/ /** Implementation of the standard image iterator for \ref vigra::BasicImage. See \ref vigra::ImageIterator for documentation. \#include \<vigra/basicimage.hxx\> Namespace: vigra */ template class BasicImageIterator : public BasicImageIteratorBase, PIXELTYPE, PIXELTYPE &, PIXELTYPE *, ITERATOR> { public: typedef BasicImageIteratorBase Base; BasicImageIterator(ITERATOR line) : Base(line) {} BasicImageIterator() : Base() {} }; /********************************************************/ /* */ /* ConstBasicImageIterator */ /* */ /********************************************************/ /** Implementation of the standard const image iterator for \ref vigra::BasicImage. See \ref vigra::ConstImageIterator for documentation. \#include \<vigra/basicimage.hxx\> Namespace: vigra */ template class ConstBasicImageIterator : public BasicImageIteratorBase, PIXELTYPE, PIXELTYPE const &, PIXELTYPE const *, ITERATOR> { public: typedef BasicImageIteratorBase Base; ConstBasicImageIterator(ITERATOR line) : Base(line) {} ConstBasicImageIterator(BasicImageIterator const & rhs) : Base(rhs.x, rhs.y) {} ConstBasicImageIterator() : Base() {} ConstBasicImageIterator & operator=(BasicImageIterator const & rhs) { Base::x = rhs.x; Base::y = rhs.y; return *this; } }; /********************************************************/ /* */ /* definition of iterator traits */ /* */ /********************************************************/ #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct IteratorTraits > : public IteratorTraitsBase > { typedef BasicImageIterator mutable_iterator; typedef ConstBasicImageIterator const_iterator; typedef typename AccessorTraits::default_accessor DefaultAccessor; typedef DefaultAccessor default_accessor; typedef VigraTrueType hasConstantStrides; }; template struct IteratorTraits > : public IteratorTraitsBase > { typedef BasicImageIterator mutable_iterator; typedef ConstBasicImageIterator const_iterator; typedef typename AccessorTraits::default_const_accessor DefaultAccessor; typedef DefaultAccessor default_accessor; typedef VigraTrueType hasConstantStrides; }; #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION #define VIGRA_DEFINE_ITERATORTRAITS(VALUETYPE) \ template <> \ struct IteratorTraits > \ : public IteratorTraitsBase > \ { \ typedef BasicImageIterator mutable_iterator; \ typedef ConstBasicImageIterator const_iterator; \ typedef typename AccessorTraits::default_accessor DefaultAccessor; \ typedef DefaultAccessor default_accessor; \ typedef VigraTrueType hasConstantStrides; \ }; \ \ template <> \ struct IteratorTraits > \ : public IteratorTraitsBase > \ { \ typedef BasicImageIterator mutable_iterator; \ typedef ConstBasicImageIterator const_iterator; \ typedef typename AccessorTraits::default_const_accessor DefaultAccessor; \ typedef DefaultAccessor default_accessor; \ typedef VigraTrueType hasConstantStrides; \ }; VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #undef VIGRA_DEFINE_ITERATORTRAITS #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION /********************************************************/ /* */ /* BasicImage */ /* */ /********************************************************/ /** \brief Fundamental class template for images. A customized memory allocator can be specified as a templated argument and passed in the constructor. \#include \<vigra/basicimage.hxx\> Namespace: vigra */ template > class BasicImage { public: /** the BasicImage's pixel type */ typedef PIXELTYPE value_type; /** the BasicImage's pixel type */ typedef PIXELTYPE PixelType; /** the BasicImage's reference type (i.e. the return type of image[diff] and image(dx,dy)) */ typedef PIXELTYPE & reference; /** the BasicImage's const reference type (i.e. the return type of image[diff] and image(dx,dy) when image is const) */ typedef PIXELTYPE const & const_reference; /** the BasicImage's pointer type */ typedef PIXELTYPE * pointer; /** the BasicImage's const pointer type */ typedef PIXELTYPE const * const_pointer; /** the BasicImage's 1D random access iterator (note: lower case 'iterator' is a STL compatible 1D random access iterator, don't confuse with capitalized Iterator) */ typedef PIXELTYPE * iterator; /** deprecated, use iterator instead */ typedef PIXELTYPE * ScanOrderIterator; /** the BasicImage's 1D random access const iterator (note: lower case 'const_iterator' is a STL compatible 1D random access const iterator) */ typedef PIXELTYPE const * const_iterator; /** deprecated, use const_iterator instead */ typedef PIXELTYPE const * ConstScanOrderIterator; /** the BasicImage's 2D random access iterator ('traverser') */ typedef BasicImageIterator traverser; /** deprecated, use traverser instead */ typedef BasicImageIterator Iterator; /** the BasicImage's 2D random access const iterator ('const traverser') */ typedef ConstBasicImageIterator const_traverser; /** deprecated, use const_traverser instead */ typedef ConstBasicImageIterator ConstIterator; /** the row iterator associated with the traverser */ typedef typename traverser::row_iterator row_iterator; /** the const row iterator associated with the const_traverser */ typedef typename const_traverser::row_iterator const_row_iterator; /** the column iterator associated with the traverser */ typedef typename traverser::column_iterator column_iterator; /** the const column iterator associated with the const_traverser */ typedef typename const_traverser::column_iterator const_column_iterator; /** the BasicImage's difference type (argument type of image[diff]) */ typedef Diff2D difference_type; /** the BasicImage's size type (result type of image.size()) */ typedef Size2D size_type; /** the BasicImage's default accessor */ typedef typename IteratorTraits::DefaultAccessor Accessor; /** the BasicImage's default const accessor */ typedef typename IteratorTraits::DefaultAccessor ConstAccessor; /** the BasicImage's allocator (default: std::allocator) */ typedef Alloc allocator_type; typedef Alloc Allocator; typedef typename Alloc::template rebind::other LineAllocator; /** construct image of size 0x0 */ BasicImage() : data_(0), width_(0), height_(0) {} /** construct image of size 0x0, use the specified allocator. */ explicit BasicImage(Alloc const & alloc) : data_(0), width_(0), height_(0), allocator_(alloc), pallocator_(alloc) {} /** construct image of size width x height, use the specified allocator. */ BasicImage(int width, int height, Alloc const & alloc = Alloc()) : data_(0), width_(0), height_(0), allocator_(alloc), pallocator_(alloc) { vigra_precondition((width >= 0) && (height >= 0), "BasicImage::BasicImage(int width, int height): " "width and height must be >= 0.\n"); resize(width, height, value_type()); } /** construct image of size size.x x size.y, use the specified allocator. */ explicit BasicImage(difference_type const & size, Alloc const & alloc = Alloc()) : data_(0), width_(0), height_(0), allocator_(alloc), pallocator_(alloc) { vigra_precondition((size.x >= 0) && (size.y >= 0), "BasicImage::BasicImage(Diff2D size): " "size.x and size.y must be >= 0.\n"); resize(size.x, size.y, value_type()); } /** construct image of size width*height and initialize every pixel with the value \a d (use this constructor, if value_type doesn't have a default constructor). Use the specified allocator. */ BasicImage(int width, int height, value_type const & d, Alloc const & alloc = Alloc()) : data_(0), width_(0), height_(0), allocator_(alloc), pallocator_(alloc) { vigra_precondition((width >= 0) && (height >= 0), "BasicImage::BasicImage(int width, int height, value_type const & ): " "width and height must be >= 0.\n"); resize(width, height, d); } /** construct image of size size.x x size.y and initialize every pixel with given data (use this constructor, if value_type doesn't have a default constructor). Use the specified allocator. */ explicit BasicImage(difference_type const & size, value_type const & d, Alloc const & alloc = Alloc()) : data_(0), width_(0), height_(0), allocator_(alloc), pallocator_(alloc) { vigra_precondition((size.x >= 0) && (size.y >= 0), "BasicImage::BasicImage(Diff2D const & size, value_type const & v): " "size.x and size.y must be >= 0.\n"); resize(size.x, size.y, d); } /** construct image of size width*height and copy the data from the given C-style array \a d. Use the specified allocator. */ BasicImage(int width, int height, const_pointer d, Alloc const & alloc = Alloc()) : data_(0), width_(0), height_(0), allocator_(alloc), pallocator_(alloc) { vigra_precondition((width >= 0) && (height >= 0), "BasicImage::BasicImage(int width, int height, const_pointer ): " "width and height must be >= 0.\n"); resizeCopy(width, height, d); } /** construct image of size size.x x size.y and copy the data from the given C-style array. Use the specified allocator. */ explicit BasicImage(difference_type const & size, const_pointer d, Alloc const & alloc = Alloc()) : data_(0), width_(0), height_(0), allocator_(alloc), pallocator_(alloc) { vigra_precondition((size.x >= 0) && (size.y >= 0), "BasicImage::BasicImage(Diff2D const & size, const_pointer): " "size.x and size.y must be >= 0.\n"); resizeCopy(size.x, size.y, d); } /** copy rhs image */ BasicImage(const BasicImage & rhs) : data_(0), width_(0), height_(0), allocator_(rhs.allocator_), pallocator_(rhs.pallocator_) { resizeCopy(rhs); } /** destructor */ ~BasicImage() { deallocate(); } /** copy rhs image (image is resized if necessary) */ BasicImage & operator=(const BasicImage & rhs); /** \deprecated set Image with const value */ BasicImage & operator=(value_type pixel); /** set Image with const value */ BasicImage & init(value_type const & pixel); /** reset image to specified size (dimensions must not be negative) (old data are kept if new size matches old size) */ void resize(int width, int height) { if(width != width_ || height != height_) resize(width, height, value_type()); } /** reset image to specified size (dimensions must not be negative) (old data are kept if new size matches old size) */ void resize(difference_type const & size) { if(size.x != width_ || size.y != height_) { resize(size.x, size.y, value_type()); } } /** reset image to specified size and initialize it with given data (use this if value_type doesn't have a default constructor, dimensions must not be negative, old data are kept if new size matches old size) */ void resize(int width, int height, value_type const & d); /** resize image to given size and initialize by copying data from the C-style arra \a data. */ void resizeCopy(int width, int height, const_pointer data); /** resize image to size of other image and copy it's data */ void resizeCopy(const BasicImage & rhs) { resizeCopy(rhs.width(), rhs.height(), rhs.data_); } /** swap the internal data with the rhs image in constant time */ void swap( BasicImage & rhs ); /** width of Image */ int width() const { return width_; } /** height of Image */ int height() const { return height_; } /** size of Image */ size_type size() const { return size_type(width(), height()); } /** test whether a given coordinate is inside the image */ bool isInside(difference_type const & d) const { return d.x >= 0 && d.y >= 0 && d.x < width() && d.y < height(); } /** access pixel at given location.
usage: value_type value = image[Diff2D(1,2)] */ reference operator[](difference_type const & d) { return lines_[d.y][d.x]; } /** read pixel at given location.
usage: value_type value = image[Diff2D(1,2)] */ const_reference operator[](difference_type const & d) const { return lines_[d.y][d.x]; } /** access pixel at given location.
usage: value_type value = image(1,2) */ reference operator()(int dx, int dy) { return lines_[dy][dx]; } /** read pixel at given location.
usage: value_type value = image(1,2) */ const_reference operator()(int dx, int dy) const { return lines_[dy][dx]; } /** access pixel at given location. Note that the 'x' index is the trailing index.
usage: value_type value = image[2][1] */ pointer operator[](int dy) { return lines_[dy]; } /** read pixel at given location. Note that the 'x' index is the trailing index.
usage: value_type value = image[2][1] */ const_pointer operator[](int dy) const { return lines_[dy]; } /** init 2D random access iterator poining to upper left pixel */ traverser upperLeft() { vigra_precondition(data_ != 0, "BasicImage::upperLeft(): image must have non-zero size."); return traverser(lines_); } /** init 2D random access iterator poining to pixel(width, height), i.e. one pixel right and below lower right corner of the image as is common in C/C++. */ traverser lowerRight() { vigra_precondition(data_ != 0, "BasicImage::lowerRight(): image must have non-zero size."); return upperLeft() + size(); } /** init 2D random access const iterator poining to upper left pixel */ const_traverser upperLeft() const { vigra_precondition(data_ != 0, "BasicImage::upperLeft(): image must have non-zero size."); return const_traverser(const_cast(lines_)); } /** init 2D random access const iterator poining to pixel(width, height), i.e. one pixel right and below lower right corner of the image as is common in C/C++. */ const_traverser lowerRight() const { vigra_precondition(data_ != 0, "BasicImage::lowerRight(): image must have non-zero size."); return upperLeft() + size(); } /** init 1D random access iterator pointing to first pixel */ iterator begin() { vigra_precondition(data_ != 0, "BasicImage::begin(): image must have non-zero size."); return data_; } /** init 1D random access iterator pointing past the end */ iterator end() { vigra_precondition(data_ != 0, "BasicImage::end(): image must have non-zero size."); return data_ + width() * height(); } /** init 1D random access const iterator pointing to first pixel */ const_iterator begin() const { vigra_precondition(data_ != 0, "BasicImage::begin(): image must have non-zero size."); return data_; } /** init 1D random access const iterator pointing past the end */ const_iterator end() const { vigra_precondition(data_ != 0, "BasicImage::end(): image must have non-zero size."); return data_ + width() * height(); } /** init 1D random access iterator pointing to first pixel of row \a y */ row_iterator rowBegin(int y) { return lines_[y]; } /** init 1D random access iterator pointing past the end of row \a y */ row_iterator rowEnd(int y) { return rowBegin(y) + width(); } /** init 1D random access const iterator pointing to first pixel of row \a y */ const_row_iterator rowBegin(int y) const { return lines_[y]; } /** init 1D random access const iterator pointing past the end of row \a y */ const_row_iterator rowEnd(int y) const { return rowBegin(y) + width(); } /** init 1D random access iterator pointing to first pixel of column \a x */ column_iterator columnBegin(int x) { typedef typename column_iterator::BaseType Iter; return column_iterator(Iter(lines_, x)); } /** init 1D random access iterator pointing past the end of column \a x */ column_iterator columnEnd(int x) { return columnBegin(x) + height(); } /** init 1D random access const iterator pointing to first pixel of column \a x */ const_column_iterator columnBegin(int x) const { typedef typename const_column_iterator::BaseType Iter; return const_column_iterator(Iter(lines_, x)); } /** init 1D random access const iterator pointing past the end of column \a x */ const_column_iterator columnEnd(int x) const { return columnBegin(x) + height(); } /** get a pointer to the internal data */ const_pointer data() const { return data_; } /** return default accessor */ Accessor accessor() { return Accessor(); } /** return default const accessor */ ConstAccessor accessor() const { return ConstAccessor(); } private: void deallocate(); value_type ** initLineStartArray(value_type * data, int width, int height); PIXELTYPE * data_; PIXELTYPE ** lines_; int width_, height_; Alloc allocator_; LineAllocator pallocator_; }; template BasicImage & BasicImage::operator=(const BasicImage & rhs) { if(this != &rhs) { if((width() != rhs.width()) || (height() != rhs.height())) { resizeCopy(rhs); } else { ConstScanOrderIterator is = rhs.begin(); ConstScanOrderIterator iend = rhs.end(); ScanOrderIterator id = begin(); for(; is != iend; ++is, ++id) *id = *is; } } return *this; } template BasicImage & BasicImage::operator=(value_type pixel) { ScanOrderIterator i = begin(); ScanOrderIterator iend = end(); for(; i != iend; ++i) *i = pixel; return *this; } template BasicImage & BasicImage::init(value_type const & pixel) { ScanOrderIterator i = begin(); ScanOrderIterator iend = end(); for(; i != iend; ++i) *i = pixel; return *this; } template void BasicImage::resize(int width, int height, value_type const & d) { vigra_precondition((width >= 0) && (height >= 0), "BasicImage::resize(int width, int height, value_type const &): " "width and height must be >= 0.\n"); if (width_ != width || height_ != height) // change size? { value_type * newdata = 0; value_type ** newlines = 0; if(width*height > 0) { if (width*height != width_*height_) // different sizes, must reallocate { newdata = allocator_.allocate(typename Alloc::size_type(width*height)); std::uninitialized_fill_n(newdata, width*height, d); newlines = initLineStartArray(newdata, width, height); deallocate(); } else // need only to reshape { newdata = data_; std::fill_n(newdata, width*height, d); newlines = initLineStartArray(newdata, width, height); pallocator_.deallocate(lines_, typename Alloc::size_type(height_)); } } else { deallocate(); } data_ = newdata; lines_ = newlines; width_ = width; height_ = height; } else if(width*height > 0) // keep size, re-init data { std::fill_n(data_, width*height, d); } } template void BasicImage::resizeCopy(int width, int height, const_pointer data) { int newsize = width*height; if (width_ != width || height_ != height) // change size? { value_type * newdata = 0; value_type ** newlines = 0; if(newsize > 0) { if (newsize != width_*height_) // different sizes, must reallocate { newdata = allocator_.allocate(typename Alloc::size_type(newsize)); std::uninitialized_copy(data, data + newsize, newdata); newlines = initLineStartArray(newdata, width, height); deallocate(); } else // need only to reshape { newdata = data_; std::copy(data, data + newsize, newdata); newlines = initLineStartArray(newdata, width, height); pallocator_.deallocate(lines_, typename Alloc::size_type(height_)); } } else { deallocate(); } data_ = newdata; lines_ = newlines; width_ = width; height_ = height; } else if(newsize > 0) // keep size, copy data { std::copy(data, data + newsize, data_); } } template void BasicImage::swap( BasicImage& rhs ) { if (&rhs!=this) { std::swap( data_, rhs.data_ ); std::swap( lines_, rhs.lines_ ); std::swap( width_, rhs.width_ ); std::swap( height_, rhs.height_ ); } } template void BasicImage::deallocate() { if(data_) { ScanOrderIterator i = begin(); ScanOrderIterator iend = end(); for(; i != iend; ++i) (*i).~PIXELTYPE(); allocator_.deallocate(data_, typename Alloc::size_type(width()*height())); pallocator_.deallocate(lines_, typename Alloc::size_type(height_)); } } template PIXELTYPE ** BasicImage::initLineStartArray(value_type * data, int width, int height) { value_type ** lines = pallocator_.allocate(typename Alloc::size_type(height)); for(int y=0; y inline triple::const_traverser, typename BasicImage::const_traverser, Accessor> srcImageRange(BasicImage const & img, Accessor a) { return triple::const_traverser, typename BasicImage::const_traverser, Accessor>(img.upperLeft(), img.lowerRight(), a); } template inline triple::const_traverser, typename BasicImage::const_traverser, Accessor> srcImageRange(BasicImage const & img, Rect2D const & roi, Accessor a) { vigra_precondition(roi.left() >= 0 && roi.top() >= 0 && roi.right() <= img.width() && roi.bottom() <= img.height(), "srcImageRange(): ROI rectangle outside image."); return triple::const_traverser, typename BasicImage::const_traverser, Accessor>(img.upperLeft() + roi.upperLeft(), img.upperLeft() + roi.lowerRight(), a); } template inline pair::const_traverser, Accessor> srcImage(BasicImage const & img, Accessor a) { return pair::const_traverser, Accessor>(img.upperLeft(), a); } template inline pair::const_traverser, Accessor> srcImage(BasicImage const & img, Point2D const & ul, Accessor a) { vigra_precondition(img.isInside(ul), "srcImage(): ROI rectangle outside image."); return pair::const_traverser, Accessor>(img.upperLeft() + ul, a); } template inline triple::traverser, typename BasicImage::traverser, Accessor> destImageRange(BasicImage & img, Accessor a) { return triple::traverser, typename BasicImage::traverser, Accessor>(img.upperLeft(), img.lowerRight(), a); } template inline triple::traverser, typename BasicImage::traverser, Accessor> destImageRange(BasicImage & img, Rect2D const & roi, Accessor a) { vigra_precondition(roi.left() >= 0 && roi.top() >= 0 && roi.right() <= img.width() && roi.bottom() <= img.height(), "destImageRange(): ROI rectangle outside image."); return triple::traverser, typename BasicImage::traverser, Accessor>(img.upperLeft() + roi.upperLeft(), img.upperLeft() + roi.lowerRight(), a); } template inline pair::traverser, Accessor> destImage(BasicImage & img, Accessor a) { return pair::traverser, Accessor>(img.upperLeft(), a); } template inline pair::traverser, Accessor> destImage(BasicImage & img, Point2D const & ul, Accessor a) { vigra_precondition(img.isInside(ul), "destImage(): ROI rectangle outside image."); return pair::traverser, Accessor>(img.upperLeft() + ul, a); } template inline pair::const_traverser, Accessor> maskImage(BasicImage const & img, Accessor a) { return pair::const_traverser, Accessor>(img.upperLeft(), a); } template inline pair::const_traverser, Accessor> maskImage(BasicImage const & img, Point2D const & ul, Accessor a) { vigra_precondition(img.isInside(ul), "maskImage(): ROI rectangle outside image."); return pair::const_traverser, Accessor>(img.upperLeft() + ul, a); } /****************************************************************/ template inline triple::const_traverser, typename BasicImage::const_traverser, typename BasicImage::ConstAccessor> srcImageRange(BasicImage const & img) { return triple::const_traverser, typename BasicImage::const_traverser, typename BasicImage::ConstAccessor>(img.upperLeft(), img.lowerRight(), img.accessor()); } template inline triple::const_traverser, typename BasicImage::const_traverser, typename BasicImage::ConstAccessor> srcImageRange(BasicImage const & img, Rect2D const & roi) { vigra_precondition(roi.left() >= 0 && roi.top() >= 0 && roi.right() <= img.width() && roi.bottom() <= img.height(), "srcImageRange(): ROI rectangle outside image."); return triple::const_traverser, typename BasicImage::const_traverser, typename BasicImage::ConstAccessor>(img.upperLeft() + roi.upperLeft(), img.upperLeft() + roi.lowerRight(), img.accessor()); } template inline pair< typename BasicImage::const_traverser, typename BasicImage::ConstAccessor> srcImage(BasicImage const & img) { return pair::const_traverser, typename BasicImage::ConstAccessor>(img.upperLeft(), img.accessor()); } template inline pair< typename BasicImage::const_traverser, typename BasicImage::ConstAccessor> srcImage(BasicImage const & img, Point2D const & ul) { vigra_precondition(img.isInside(ul), "srcImage(): ROI rectangle outside image."); return pair::const_traverser, typename BasicImage::ConstAccessor>(img.upperLeft() + ul, img.accessor()); } template inline triple< typename BasicImage::traverser, typename BasicImage::traverser, typename BasicImage::Accessor> destImageRange(BasicImage & img) { return triple::traverser, typename BasicImage::traverser, typename BasicImage::Accessor>(img.upperLeft(), img.lowerRight(), img.accessor()); } template inline triple< typename BasicImage::traverser, typename BasicImage::traverser, typename BasicImage::Accessor> destImageRange(BasicImage & img, Rect2D const & roi) { vigra_precondition(roi.left() >= 0 && roi.top() >= 0 && roi.right() <= img.width() && roi.bottom() <= img.height(), "destImageRange(): ROI rectangle outside image."); return triple::traverser, typename BasicImage::traverser, typename BasicImage::Accessor>(img.upperLeft() + roi.upperLeft(), img.upperLeft() + roi.lowerRight(), img.accessor()); } template inline pair< typename BasicImage::traverser, typename BasicImage::Accessor> destImage(BasicImage & img) { return pair::traverser, typename BasicImage::Accessor>(img.upperLeft(), img.accessor()); } template inline pair< typename BasicImage::traverser, typename BasicImage::Accessor> destImage(BasicImage & img, Point2D const & ul) { vigra_precondition(img.isInside(ul), "destImage(): ROI rectangle outside image."); return pair::traverser, typename BasicImage::Accessor>(img.upperLeft() + ul, img.accessor()); } template inline pair< typename BasicImage::const_traverser, typename BasicImage::ConstAccessor> maskImage(BasicImage const & img) { return pair::const_traverser, typename BasicImage::ConstAccessor>(img.upperLeft(), img.accessor()); } template inline pair< typename BasicImage::const_traverser, typename BasicImage::ConstAccessor> maskImage(BasicImage const & img, Point2D const & ul) { vigra_precondition(img.isInside(ul), "maskImage(): ROI rectangle outside image."); return pair::const_traverser, typename BasicImage::ConstAccessor>(img.upperLeft() + ul, img.accessor()); } } // namespace vigra #endif // VIGRA_BASICIMAGE_HXX gamera-3.3.3/include/vigra/basicimageview.hxx0000644000076500000000000006211511261456425020220 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_BASICIMAGEVIEW_HXX #define VIGRA_BASICIMAGEVIEW_HXX #include "imageiterator.hxx" #include "initimage.hxx" namespace vigra { /********************************************************/ /* */ /* BasicImageView */ /* */ /********************************************************/ /** \brief BasicImage using foreign memory. This class provides the same interface as \ref vigra::BasicImage (with the exception of resize()) but the image's memory is provided from the outside instead of allocated internally. A BasicImageView can also be created from a \ref vigra::MultiArrayView with the appropriate shape -- see \ref MultiArrayToImage. \#include \<vigra/basicimageview.hxx\> Namespace: vigra */ template class BasicImageView { public: /** the BasicImageView's pixel type */ typedef PIXELTYPE value_type; /** the BasicImageView's pixel type */ typedef PIXELTYPE PixelType; /** the BasicImageView's reference type (i.e. the return type of image[diff] and image(dx,dy)) */ typedef PIXELTYPE & reference; /** the BasicImageView's const reference type (i.e. the return type of image[diff] and image(dx,dy) when image is const) */ typedef PIXELTYPE const & const_reference; /** the BasicImageView's pointer type */ typedef PIXELTYPE * pointer; /** the BasicImageView's const pointer type */ typedef PIXELTYPE const * const_pointer; /** the BasicImageView's 1D random access iterator (note: lower case 'iterator' is a STL compatible 1D random access iterator, don't confuse with capitalized Iterator) */ typedef PIXELTYPE * iterator; /** deprecated, use iterator instead */ typedef PIXELTYPE * ScanOrderIterator; /** the BasicImageView's 1D random access const iterator (note: lower case 'const_iterator' is a STL compatible 1D random access const iterator) */ typedef PIXELTYPE const * const_iterator; /** deprecated, use const_iterator instead */ typedef PIXELTYPE const * ConstScanOrderIterator; /** the BasicImageView's 2D random access iterator ('traverser') */ typedef ImageIterator traverser; /** deprecated, use traverser instead */ typedef ImageIterator Iterator; /** the BasicImageView's 2D random access const iterator ('const traverser') */ typedef ConstImageIterator const_traverser; /** deprecated, use const_traverser instead */ typedef ConstImageIterator ConstIterator; /** the row iterator associated with the traverser */ typedef typename traverser::row_iterator row_iterator; /** the const row iterator associated with the const_traverser */ typedef typename const_traverser::row_iterator const_row_iterator; /** the column iterator associated with the traverser */ typedef typename traverser::column_iterator column_iterator; /** the const column iterator associated with the const_traverser */ typedef typename const_traverser::column_iterator const_column_iterator; /** the BasicImageView's difference type (argument type of image[diff]) */ typedef Diff2D difference_type; /** the BasicImageView's size type (result type of image.size()) */ typedef Size2D size_type; /** the BasicImageView's default accessor */ typedef typename IteratorTraits::DefaultAccessor Accessor; /** the BasicImageView's default const accessor */ typedef typename IteratorTraits::DefaultAccessor ConstAccessor; /** construct image of size 0x0 */ BasicImageView() : data_(0), width_(0), height_(0), stride_(0) {} /** construct view of size w x h */ BasicImageView(const_pointer data, int w, int h, int stride = 0) : data_(const_cast(data)), width_(w), height_(h), stride_(stride == 0 ? w : stride) {} /** construct view of size size.x x size.y */ BasicImageView(const_pointer data, difference_type const & size, int stride = 0) : data_(const_cast(data)), width_(size.x), height_(size.y), stride_(stride == 0 ? size.x : stride) {} /** set Image with const value */ BasicImageView & init(value_type const & pixel) { initImage(upperLeft(), lowerRight(), accessor(), pixel); return *this; } /** width of Image */ int width() const { return width_; } /** height of Image */ int height() const { return height_; } /** stride of Image. Memory offset between the start of two successive rows. */ int stride() const { return stride_; } /** size of Image */ size_type size() const { return size_type(width(), height()); } /** test whether a given coordinate is inside the image */ bool isInside(difference_type const & d) const { return d.x >= 0 && d.y >= 0 && d.x < width() && d.y < height(); } /** access pixel at given location.
usage: value_type value = image[Diff2D(1,2)] */ reference operator[](difference_type const & d) { return data_[d.y*stride_ + d.x]; } /** read pixel at given location.
usage: value_type value = image[Diff2D(1,2)] */ const_reference operator[](difference_type const & d) const { return data_[d.y*stride_ + d.x]; } /** access pixel at given location.
usage: value_type value = image(1,2) */ reference operator()(int dx, int dy) { return data_[dy*stride_ + dx]; } /** read pixel at given location.
usage: value_type value = image(1,2) */ const_reference operator()(int dx, int dy) const { return data_[dy*stride_ + dx]; } /** access pixel at given location. Note that the 'x' index is the trailing index.
usage: value_type value = image[2][1] */ pointer operator[](int dy) { return data_ + dy*stride_; } /** read pixel at given location. Note that the 'x' index is the trailing index.
usage: value_type value = image[2][1] */ const_pointer operator[](int dy) const { return data_ + dy*stride_; } /** init 2D random access iterator poining to upper left pixel */ traverser upperLeft() { return traverser(data_, stride_); } /** init 2D random access iterator poining to pixel(width, height), i.e. one pixel right and below lower right corner of the image as is common in C/C++. */ traverser lowerRight() { return upperLeft() + size(); } /** init 2D random access const iterator poining to upper left pixel */ const_traverser upperLeft() const { return const_traverser(data_, stride_); } /** init 2D random access const iterator poining to pixel(width, height), i.e. one pixel right and below lower right corner of the image as is common in C/C++. */ const_traverser lowerRight() const { return upperLeft() + size(); } /** init 1D random access iterator pointing to first pixel. Note: Only works if stride equals width. */ iterator begin() { vigra_precondition(stride_ == width_, "BasicImageView::begin(): " "can only create scan order iterator if width() == stride()."); return data_; } /** init 1D random access iterator pointing past the end. Note: Only works if stride equals width. */ iterator end() { vigra_precondition(stride_ == width_, "BasicImageView::end(): " "can only create scan order iterator if width() == stride()."); return data_ + width() * height(); } /** init 1D random access const iterator pointing to first pixel. Note: Only works if stride equals width. */ const_iterator begin() const { vigra_precondition(stride_ == width_, "BasicImageView::begin(): " "can only create scan order iterator if width() == stride()."); return data_; } /** init 1D random access const iterator pointing past the end. Note: Only works if stride equals width. */ const_iterator end() const { vigra_precondition(stride_ == width_, "BasicImageView::end(): " "can only create scan order iterator if width() == stride()."); return data_ + width() * height(); } /** init 1D random access iterator pointing to first pixel of row \a y */ row_iterator rowBegin(int y) { return data_ + stride_ * y; } /** init 1D random access iterator pointing past the end of row \a y */ row_iterator rowEnd(int y) { return rowBegin(y) + width(); } /** init 1D random access const iterator pointing to first pixel of row \a y */ const_row_iterator rowBegin(int y) const { return data_ + stride_ * y; } /** init 1D random access const iterator pointing past the end of row \a y */ const_row_iterator rowEnd(int y) const { return rowBegin(y) + width(); } /** init 1D random access iterator pointing to first pixel of column \a x */ column_iterator columnBegin(int x) { typedef typename column_iterator::BaseType Iter; return column_iterator(Iter(data_ + x, stride_)); } /** init 1D random access iterator pointing past the end of column \a x */ column_iterator columnEnd(int x) { return columnBegin(x) + height(); } /** init 1D random access const iterator pointing to first pixel of column \a x */ const_column_iterator columnBegin(int x) const { typedef typename const_column_iterator::BaseType Iter; return const_column_iterator(Iter(data_ + x, stride_)); } /** init 1D random access const iterator pointing past the end of column \a x */ const_column_iterator columnEnd(int x) const { return columnBegin(x) + height(); } /** get a pointer to the internal data */ const_pointer data() const { return data_; } /** return default accessor */ Accessor accessor() { return Accessor(); } /** return default const accessor */ ConstAccessor accessor() const { return ConstAccessor(); } private: pointer data_; int width_, height_, stride_; }; /********************************************************/ /* */ /* argument object factories */ /* */ /********************************************************/ template inline triple::const_traverser, typename BasicImageView::const_traverser, Accessor> srcImageRange(BasicImageView const & img, Accessor a) { return triple::const_traverser, typename BasicImageView::const_traverser, Accessor>(img.upperLeft(), img.lowerRight(), a); } template inline triple::const_traverser, typename BasicImageView::const_traverser, Accessor> srcImageRange(BasicImageView const & img, Rect2D const & roi, Accessor a) { vigra_precondition(roi.left() >= 0 && roi.top() >= 0 && roi.right() <= img.width() && roi.bottom() <= img.height(), "srcImageRange(): ROI rectangle outside image."); return triple::const_traverser, typename BasicImageView::const_traverser, Accessor>(img.upperLeft() + roi.upperLeft(), img.upperLeft() + roi.lowerRight(), a); } template inline pair::const_traverser, Accessor> srcImage(BasicImageView const & img, Accessor a) { return pair::const_traverser, Accessor>(img.upperLeft(), a); } template inline pair::const_traverser, Accessor> srcImage(BasicImageView const & img, Point2D const & ul, Accessor a) { vigra_precondition(img.isInside(ul), "srcImage(): ROI rectangle outside image."); return pair::const_traverser, Accessor>(img.upperLeft() + ul, a); } template inline triple::traverser, typename BasicImageView::traverser, Accessor> destImageRange(BasicImageView & img, Accessor a) { return triple::traverser, typename BasicImageView::traverser, Accessor>(img.upperLeft(), img.lowerRight(), a); } template inline triple::traverser, typename BasicImageView::traverser, Accessor> destImageRange(BasicImageView & img, Rect2D const & roi, Accessor a) { vigra_precondition(roi.left() >= 0 && roi.top() >= 0 && roi.right() <= img.width() && roi.bottom() <= img.height(), "destImageRange(): ROI rectangle outside image."); return triple::traverser, typename BasicImageView::traverser, Accessor>(img.upperLeft() + roi.upperLeft(), img.upperLeft() + roi.lowerRight(), a); } template inline pair::traverser, Accessor> destImage(BasicImageView & img, Accessor a) { return pair::traverser, Accessor>(img.upperLeft(), a); } template inline pair::traverser, Accessor> destImage(BasicImageView & img, Point2D const & ul, Accessor a) { vigra_precondition(img.isInside(ul), "destImage(): ROI rectangle outside image."); return pair::traverser, Accessor>(img.upperLeft() + ul, a); } template inline pair::const_traverser, Accessor> maskImage(BasicImageView const & img, Accessor a) { return pair::const_traverser, Accessor>(img.upperLeft(), a); } template inline pair::const_traverser, Accessor> maskImage(BasicImageView const & img, Point2D const & ul, Accessor a) { vigra_precondition(img.isInside(ul), "maskImage(): ROI rectangle outside image."); return pair::const_traverser, Accessor>(img.upperLeft() + ul, a); } /****************************************************************/ template inline triple::const_traverser, typename BasicImageView::const_traverser, typename BasicImageView::ConstAccessor> srcImageRange(BasicImageView const & img) { return triple::const_traverser, typename BasicImageView::const_traverser, typename BasicImageView::ConstAccessor>(img.upperLeft(), img.lowerRight(), img.accessor()); } template inline triple::const_traverser, typename BasicImageView::const_traverser, typename BasicImageView::ConstAccessor> srcImageRange(BasicImageView const & img, Rect2D const & roi) { vigra_precondition(roi.left() >= 0 && roi.top() >= 0 && roi.right() <= img.width() && roi.bottom() <= img.height(), "srcImageRange(): ROI rectangle outside image."); return triple::const_traverser, typename BasicImageView::const_traverser, typename BasicImageView::ConstAccessor>(img.upperLeft() + roi.upperLeft(), img.upperLeft() + roi.lowerRight(), img.accessor()); } template inline pair< typename BasicImageView::const_traverser, typename BasicImageView::ConstAccessor> srcImage(BasicImageView const & img) { return pair::const_traverser, typename BasicImageView::ConstAccessor>(img.upperLeft(), img.accessor()); } template inline pair< typename BasicImageView::const_traverser, typename BasicImageView::ConstAccessor> srcImage(BasicImageView const & img, Point2D const & ul) { vigra_precondition(img.isInside(ul), "srcImage(): ROI rectangle outside image."); return pair::const_traverser, typename BasicImageView::ConstAccessor>(img.upperLeft() + ul, img.accessor()); } template inline triple< typename BasicImageView::traverser, typename BasicImageView::traverser, typename BasicImageView::Accessor> destImageRange(BasicImageView & img) { return triple::traverser, typename BasicImageView::traverser, typename BasicImageView::Accessor>(img.upperLeft(), img.lowerRight(), img.accessor()); } template inline triple< typename BasicImageView::traverser, typename BasicImageView::traverser, typename BasicImageView::Accessor> destImageRange(BasicImageView & img, Rect2D const & roi) { vigra_precondition(roi.left() >= 0 && roi.top() >= 0 && roi.right() <= img.width() && roi.bottom() <= img.height(), "destImageRange(): ROI rectangle outside image."); return triple::traverser, typename BasicImageView::traverser, typename BasicImageView::Accessor>(img.upperLeft() + roi.upperLeft(), img.upperLeft() + roi.lowerRight(), img.accessor()); } template inline pair< typename BasicImageView::traverser, typename BasicImageView::Accessor> destImage(BasicImageView & img) { return pair::traverser, typename BasicImageView::Accessor>(img.upperLeft(), img.accessor()); } template inline pair< typename BasicImageView::traverser, typename BasicImageView::Accessor> destImage(BasicImageView & img, Point2D const & ul) { vigra_precondition(img.isInside(ul), "destImage(): ROI rectangle outside image."); return pair::traverser, typename BasicImageView::Accessor>(img.upperLeft() + ul, img.accessor()); } template inline pair< typename BasicImageView::const_traverser, typename BasicImageView::ConstAccessor> maskImage(BasicImageView const & img) { return pair::const_traverser, typename BasicImageView::ConstAccessor>(img.upperLeft(), img.accessor()); } template inline pair< typename BasicImageView::const_traverser, typename BasicImageView::ConstAccessor> maskImage(BasicImageView const & img, Point2D const & ul) { vigra_precondition(img.isInside(ul), "maskImage(): ROI rectangle outside image."); return pair::const_traverser, typename BasicImageView::ConstAccessor>(img.upperLeft() + ul, img.accessor()); } } // namespace vigra #endif /* VIGRA_BASICIMAGEVIEW_HXX */ gamera-3.3.3/include/vigra/bordertreatment.hxx0000644000076500000000000000765211261456425020447 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_BORDERTREATMENT_HXX #define VIGRA_BORDERTREATMENT_HXX namespace vigra { /*! \page BorderTreatmentMode BorderTreatmentMode Choose between different border treatment modes. In the convolution algorithms, these modes apply to all image pixels where the kernel does not completely fit inside the image. \#include \<vigra/bordertreatment.hxx\>
Namespace: vigra \code enum BorderTreatmentMode { // do not operate on a pixel where the kernel does // not fit in the image BORDER_TREATMENT_AVOID, // clip kernel at image border (this is only useful if the // kernel is >= 0 everywhere) BORDER_TREATMENT_CLIP, // repeat the nearest valid pixel BORDER_TREATMENT_REPEAT, // reflect image at last row/column BORDER_TREATMENT_REFLECT, // wrap image around (periodic boundary conditions) BORDER_TREATMENT_WRAP }; \endcode */ enum BorderTreatmentMode { BORDER_TREATMENT_AVOID, BORDER_TREATMENT_CLIP, BORDER_TREATMENT_REPEAT, BORDER_TREATMENT_REFLECT, BORDER_TREATMENT_WRAP }; } // namespace vigra #endif // VIGRA_BORDERTREATMENT_HXX gamera-3.3.3/include/vigra/boundarytensor.hxx0000644000076500000000000007271611261456425020327 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_BOUNDARYTENSOR_HXX #define VIGRA_BOUNDARYTENSOR_HXX #include #include #include "utilities.hxx" #include "array_vector.hxx" #include "basicimage.hxx" #include "combineimages.hxx" #include "numerictraits.hxx" #include "convolution.hxx" namespace vigra { namespace detail { /***********************************************************************/ typedef ArrayVector > KernelArray; void initGaussianPolarFilters1(double std_dev, KernelArray & k) { typedef KernelArray::value_type Kernel; typedef Kernel::iterator iterator; vigra_precondition(std_dev >= 0.0, "initGaussianPolarFilter1(): " "Standard deviation must be >= 0."); k.resize(4); int radius = (int)(4.0*std_dev + 0.5); std_dev *= 1.08179074376; double f = 1.0 / VIGRA_CSTD::sqrt(2.0 * M_PI) / std_dev; // norm double a = 0.558868151788 / VIGRA_CSTD::pow(std_dev, 5); double b = -2.04251639729 / VIGRA_CSTD::pow(std_dev, 3); double sigma22 = -0.5 / std_dev / std_dev; for(unsigned int i=0; i::iterator iterator; vigra_precondition(std_dev >= 0.0, "initGaussianPolarFilter2(): " "Standard deviation must be >= 0."); k.resize(3); int radius = (int)(4.0*std_dev + 0.5); double f = 1.0 / VIGRA_CSTD::sqrt(2.0 * M_PI) / std_dev; // norm double sigma2 = std_dev*std_dev; double sigma22 = -0.5 / sigma2; for(unsigned int i=0; i::iterator iterator; vigra_precondition(std_dev >= 0.0, "initGaussianPolarFilter3(): " "Standard deviation must be >= 0."); k.resize(4); int radius = (int)(4.0*std_dev + 0.5); std_dev *= 1.15470053838; double sigma22 = -0.5 / std_dev / std_dev; double f = 1.0 / VIGRA_CSTD::sqrt(2.0 * M_PI) / std_dev; // norm double a = 0.883887052922 / VIGRA_CSTD::pow(std_dev, 5); for(unsigned int i=0; i void evenPolarFilters(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale, bool noLaplacian) { vigra_precondition(dest.size(dupperleft) == 3, "evenPolarFilters(): image for even output must have 3 bands."); int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage > TmpImage; typedef typename TmpImage::traverser TmpTraverser; TmpImage t(w, h); KernelArray k2; initGaussianPolarFilters2(scale, k2); // calculate filter responses for even filters VectorElementAccessor tmpBand(0, t.accessor()); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t, tmpBand), k2[2], k2[0]); tmpBand.setIndex(1); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t, tmpBand), k2[1], k2[1]); tmpBand.setIndex(2); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t, tmpBand), k2[0], k2[2]); // create even tensor from filter responses TmpTraverser tul(t.upperLeft()); TmpTraverser tlr(t.lowerRight()); for(; tul.y != tlr.y; ++tul.y, ++dupperleft.y) { typename TmpTraverser::row_iterator tr = tul.rowIterator(); typename TmpTraverser::row_iterator trend = tr + w; typename DestIterator::row_iterator d = dupperleft.rowIterator(); if(noLaplacian) { for(; tr != trend; ++tr, ++d) { TmpType v = 0.5*sq((*tr)[0]-(*tr)[2]) + 2.0*sq((*tr)[1]); dest.setComponent(v, d, 0); dest.setComponent(0, d, 1); dest.setComponent(v, d, 2); } } else { for(; tr != trend; ++tr, ++d) { dest.setComponent(sq((*tr)[0]) + sq((*tr)[1]), d, 0); dest.setComponent(-(*tr)[1] * ((*tr)[0] + (*tr)[2]), d, 1); dest.setComponent(sq((*tr)[1]) + sq((*tr)[2]), d, 2); } } } } template void oddPolarFilters(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale, bool addResult) { vigra_precondition(dest.size(dupperleft) == 3, "oddPolarFilters(): image for odd output must have 3 bands."); int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage > TmpImage; typedef typename TmpImage::traverser TmpTraverser; TmpImage t(w, h); detail::KernelArray k1; detail::initGaussianPolarFilters1(scale, k1); // calculate filter responses for odd filters VectorElementAccessor tmpBand(0, t.accessor()); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t, tmpBand), k1[3], k1[0]); tmpBand.setIndex(1); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t, tmpBand), k1[2], k1[1]); tmpBand.setIndex(2); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t, tmpBand), k1[1], k1[2]); tmpBand.setIndex(3); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t, tmpBand), k1[0], k1[3]); // create odd tensor from filter responses TmpTraverser tul(t.upperLeft()); TmpTraverser tlr(t.lowerRight()); for(; tul.y != tlr.y; ++tul.y, ++dupperleft.y) { typename TmpTraverser::row_iterator tr = tul.rowIterator(); typename TmpTraverser::row_iterator trend = tr + w; typename DestIterator::row_iterator d = dupperleft.rowIterator(); if(addResult) { for(; tr != trend; ++tr, ++d) { TmpType d0 = (*tr)[0] + (*tr)[2]; TmpType d1 = -(*tr)[1] - (*tr)[3]; dest.setComponent(dest.getComponent(d, 0) + sq(d0), d, 0); dest.setComponent(dest.getComponent(d, 1) + d0 * d1, d, 1); dest.setComponent(dest.getComponent(d, 2) + sq(d1), d, 2); } } else { for(; tr != trend; ++tr, ++d) { TmpType d0 = (*tr)[0] + (*tr)[2]; TmpType d1 = -(*tr)[1] - (*tr)[3]; dest.setComponent(sq(d0), d, 0); dest.setComponent(d0 * d1, d, 1); dest.setComponent(sq(d1), d, 2); } } } } } // namespace detail /** \addtogroup CommonConvolutionFilters Common Filters */ //@{ /********************************************************/ /* */ /* rieszTransformOfLOG */ /* */ /********************************************************/ /** \brief Calculate Riesz transforms of the Laplacian of Gaussian. The Riesz transforms of the Laplacian of Gaussian have the following transfer functions (defined in a polar coordinate representation of the frequency domain): \f[ F_{\sigma}(r, \phi)=(i \cos \phi)^n (i \sin \phi)^m r^2 e^{-r^2 \sigma^2 / 2} \f] where n = xorder and m = yorder determine th e order of the transform, and sigma > 0 is the scale of the Laplacian of Gaussian. This function computes a good spatial domain approximation of these transforms for xorder + yorder <= 2. The filter responses may be used to calculate the monogenic signal or the boundary tensor. Declarations: pass arguments explicitly: \code namespace vigra { template void rieszTransformOfLOG(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale, unsigned int xorder, unsigned int yorder); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void rieszTransformOfLOG(triple src, pair dest, double scale, unsigned int xorder, unsigned int yorder); } \endcode Usage: \#include \<vigra/boundarytensor.hxx\> \code FImage impulse(17,17), res(17, 17); impulse(8,8) = 1.0; // calculate the impulse response of the first order Riesz transform in x-direction rieszTransformOfLOG(srcImageRange(impulse), destImage(res), 2.0, 1, 0); \endcode */ doxygen_overloaded_function(template <...> void rieszTransformOfLOG) template void rieszTransformOfLOG(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale, unsigned int xorder, unsigned int yorder) { unsigned int order = xorder + yorder; vigra_precondition(order <= 2, "rieszTransformOfLOG(): can only compute Riesz transforms up to order 2."); vigra_precondition(scale > 0.0, "rieszTransformOfLOG(): scale must be positive."); int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; switch(order) { case 0: { detail::KernelArray k2; detail::initGaussianPolarFilters2(scale, k2); TmpImage t1(w, h), t2(w, h); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t1), k2[2], k2[0]); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t2), k2[0], k2[2]); combineTwoImages(srcImageRange(t1), srcImage(t2), destIter(dupperleft, dest), std::plus()); break; } case 1: { detail::KernelArray k1; detail::initGaussianPolarFilters1(scale, k1); TmpImage t1(w, h), t2(w, h); if(xorder == 1) { convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t1), k1[3], k1[0]); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t2), k1[1], k1[2]); } else { convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t1), k1[0], k1[3]); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t2), k1[2], k1[1]); } combineTwoImages(srcImageRange(t1), srcImage(t2), destIter(dupperleft, dest), std::plus()); break; } case 2: { detail::KernelArray k2; detail::initGaussianPolarFilters2(scale, k2); convolveImage(srcIterRange(supperleft, slowerright, src), destIter(dupperleft, dest), k2[xorder], k2[yorder]); break; } /* for test purposes only: compute 3rd order polar filters */ case 3: { detail::KernelArray k3; detail::initGaussianPolarFilters3(scale, k3); TmpImage t1(w, h), t2(w, h); if(xorder == 3) { convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t1), k3[3], k3[0]); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t2), k3[1], k3[2]); } else { convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t1), k3[0], k3[3]); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(t2), k3[2], k3[1]); } combineTwoImages(srcImageRange(t1), srcImage(t2), destIter(dupperleft, dest), std::minus()); break; } } } template inline void rieszTransformOfLOG(triple src, pair dest, double scale, unsigned int xorder, unsigned int yorder) { rieszTransformOfLOG(src.first, src.second, src.third, dest.first, dest.second, scale, xorder, yorder); } //@} /** \addtogroup TensorImaging Tensor Image Processing */ //@{ /********************************************************/ /* */ /* boundaryTensor */ /* */ /********************************************************/ /** \brief Calculate the boundary tensor for a scalar valued image. These functions calculate a spatial domain approximation of the boundary tensor as described in U. Köthe: "Integrated Edge and Junction Detection with the Boundary Tensor", in: ICCV 03, Proc. of 9th Intl. Conf. on Computer Vision, Nice 2003, vol. 1, pp. 424-431, Los Alamitos: IEEE Computer Society, 2003 with the Laplacian of Gaussian as the underlying bandpass filter (see \ref rieszTransformOfLOG()). The output image must have 3 bands which will hold the tensor components in the order t11, t12 (== t21), t22. The function \ref boundaryTensor1() with the same interface implements a variant of the boundary tensor where the 0th-order Riesz transform has been dropped, so that the tensor is no longer sensitive to blobs. Declarations: pass arguments explicitly: \code namespace vigra { template void boundaryTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void boundaryTensor(triple src, pair dest, double scale); } \endcode Usage: \#include \<vigra/boundarytensor.hxx\> \code FImage img(w,h); FVector3Image bt(w,h); ... boundaryTensor(srcImageRange(img), destImage(bt), 2.0); \endcode */ doxygen_overloaded_function(template <...> void boundaryTensor) template void boundaryTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale) { vigra_precondition(dest.size(dupperleft) == 3, "boundaryTensor(): image for even output must have 3 bands."); vigra_precondition(scale > 0.0, "boundaryTensor(): scale must be positive."); detail::evenPolarFilters(supperleft, slowerright, src, dupperleft, dest, scale, false); detail::oddPolarFilters(supperleft, slowerright, src, dupperleft, dest, scale, true); } template inline void boundaryTensor(triple src, pair dest, double scale) { boundaryTensor(src.first, src.second, src.third, dest.first, dest.second, scale); } /** \brief Boundary tensor variant. This function implements a variant of the boundary tensor where the 0th-order Riesz transform has been dropped, so that the tensor is no longer sensitive to blobs. See \ref boundaryTensor() for more detailed documentation. Declarations: \#include \<vigra/boundarytensor.hxx\> pass arguments explicitly: \code namespace vigra { template void boundaryTensor1(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void boundaryTensor1(triple src, pair dest, double scale); } \endcode */ doxygen_overloaded_function(template <...> void boundaryTensor1) template void boundaryTensor1(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale) { vigra_precondition(dest.size(dupperleft) == 3, "boundaryTensor1(): image for even output must have 3 bands."); vigra_precondition(scale > 0.0, "boundaryTensor1(): scale must be positive."); detail::evenPolarFilters(supperleft, slowerright, src, dupperleft, dest, scale, true); detail::oddPolarFilters(supperleft, slowerright, src, dupperleft, dest, scale, true); } template inline void boundaryTensor1(triple src, pair dest, double scale) { boundaryTensor1(src.first, src.second, src.third, dest.first, dest.second, scale); } /********************************************************/ /* */ /* boundaryTensor3 */ /* */ /********************************************************/ /* Add 3rd order Riesz transform to boundary tensor ??? Does not work -- bug or too coarse approximation for 3rd order ??? */ template void boundaryTensor3(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIteratorEven dupperleft_even, DestAccessorEven even, DestIteratorOdd dupperleft_odd, DestAccessorOdd odd, double scale) { vigra_precondition(even.size(dupperleft_even) == 3, "boundaryTensor3(): image for even output must have 3 bands."); vigra_precondition(odd.size(dupperleft_odd) == 3, "boundaryTensor3(): image for odd output must have 3 bands."); detail::evenPolarFilters(supperleft, slowerright, sa, dupperleft_even, even, scale, false); int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage > TmpImage; TmpImage t1(w, h), t2(w, h); detail::KernelArray k1, k3; detail::initGaussianPolarFilters1(scale, k1); detail::initGaussianPolarFilters3(scale, k3); // calculate filter responses for odd filters VectorElementAccessor tmpBand(0, t1.accessor()); convolveImage(srcIterRange(supperleft, slowerright, sa), destImage(t1, tmpBand), k1[3], k1[0]); tmpBand.setIndex(1); convolveImage(srcIterRange(supperleft, slowerright, sa), destImage(t1, tmpBand), k1[1], k1[2]); tmpBand.setIndex(2); convolveImage(srcIterRange(supperleft, slowerright, sa), destImage(t1, tmpBand), k3[3], k3[0]); tmpBand.setIndex(3); convolveImage(srcIterRange(supperleft, slowerright, sa), destImage(t1, tmpBand), k3[1], k3[2]); tmpBand.setIndex(0); convolveImage(srcIterRange(supperleft, slowerright, sa), destImage(t2, tmpBand), k1[0], k1[3]); tmpBand.setIndex(1); convolveImage(srcIterRange(supperleft, slowerright, sa), destImage(t2, tmpBand), k1[2], k1[1]); tmpBand.setIndex(2); convolveImage(srcIterRange(supperleft, slowerright, sa), destImage(t2, tmpBand), k3[0], k3[3]); tmpBand.setIndex(3); convolveImage(srcIterRange(supperleft, slowerright, sa), destImage(t2, tmpBand), k3[2], k3[1]); // create odd tensor from filter responses typedef typename TmpImage::traverser TmpTraverser; TmpTraverser tul1(t1.upperLeft()); TmpTraverser tlr1(t1.lowerRight()); TmpTraverser tul2(t2.upperLeft()); for(; tul1.y != tlr1.y; ++tul1.y, ++tul2.y, ++dupperleft_odd.y) { typename TmpTraverser::row_iterator tr1 = tul1.rowIterator(); typename TmpTraverser::row_iterator trend1 = tr1 + w; typename TmpTraverser::row_iterator tr2 = tul2.rowIterator(); typename DestIteratorOdd::row_iterator o = dupperleft_odd.rowIterator(); for(; tr1 != trend1; ++tr1, ++tr2, ++o) { TmpType d11 = (*tr1)[0] + (*tr1)[2]; TmpType d12 = -(*tr1)[1] - (*tr1)[3]; TmpType d31 = (*tr2)[0] - (*tr2)[2]; TmpType d32 = (*tr2)[1] - (*tr2)[3]; TmpType d111 = 0.75 * d11 + 0.25 * d31; TmpType d112 = 0.25 * (d12 + d32); TmpType d122 = 0.25 * (d11 - d31); TmpType d222 = 0.75 * d12 - 0.25 * d32; TmpType d2 = sq(d112); TmpType d3 = sq(d122); odd.setComponent(0.25 * (sq(d111) + 2.0*d2 + d3), o, 0); odd.setComponent(0.25 * (d111*d112 + 2.0*d112*d122 + d122*d222), o, 1); odd.setComponent(0.25 * (d2 + 2.0*d3 + sq(d222)), o, 2); } } } template inline void boundaryTensor3(triple src, pair even, pair odd, double scale) { boundaryTensor3(src.first, src.second, src.third, even.first, even.second, odd.first, odd.second, scale); } //@} } // namespace vigra #endif // VIGRA_BOUNDARYTENSOR_HXX gamera-3.3.3/include/vigra/codec.hxx0000644000076500000000000002125111261456425016312 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2001-2002 by Gunnar Kedenburg */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ /* Modifications by Pablo d'Angelo * updated to vigra 1.4 by Douglas Wilkins * as of 18 Febuary 2006: * - Added UINT16 and UINT32 pixel types. * - Added support for obtaining extra bands beyond RGB. * - Added support for a position field that indicates the start of this * image relative to some global origin. * - Added support for x and y resolution fields. * - Added support for ICC Profiles */ #ifndef VIGRA_CODEC_HXX #define VIGRA_CODEC_HXX #include #include #include #include "array_vector.hxx" #include "config.hxx" #include "diff2d.hxx" #include "sized_int.hxx" // possible pixel types: // "undefined", "UINT8", "UINT16", "INT16", "UINT32", "INT32", "FLOAT", "DOUBLE" // possible compression types: // "undefined", "RLE", "LZW", "LOSSLESS", "JPEG", "DEFLATE" // possible file types: // "undefined", "TIFF", "VIFF", "JPEG", "PNG", "PNM", "BMP", "SUN", "XPM" // possible name extensions: // "undefined", "tif", "tiff", "jpg", "jpeg", "png", "pnm", "bmp", "sun", // "xpm" (also capital forms) namespace vigra { template struct TypeAsString { static std::string result() { return "undefined"; } }; template <> struct TypeAsString { static std::string result() { return "INT8"; } }; template <> struct TypeAsString { static std::string result() { return "UINT8"; } }; template <> struct TypeAsString { static std::string result() { return "INT16"; } }; template <> struct TypeAsString { static std::string result() { return "UINT16"; } }; template <> struct TypeAsString { static std::string result() { return "INT32"; } }; template <> struct TypeAsString { static std::string result() { return "UINT32"; } }; template <> struct TypeAsString { static std::string result() { return "FLOAT"; } }; template <> struct TypeAsString { static std::string result() { return "DOUBLE"; } }; // codec description struct CodecDesc { std::string fileType; std::vector pixelTypes; std::vector compressionTypes; std::vector > magicStrings; std::vector fileExtensions; std::vector bandNumbers; }; // Decoder and Encoder are virtual types that define a common // interface for all image file formats impex supports. struct Decoder { virtual ~Decoder() {}; virtual void init( const std::string & ) = 0; virtual void close() = 0; virtual void abort() = 0; virtual std::string getFileType() const = 0; virtual std::string getPixelType() const = 0; virtual unsigned int getWidth() const = 0; virtual unsigned int getHeight() const = 0; virtual unsigned int getNumBands() const = 0; virtual unsigned int getNumExtraBands() const { return 0; } virtual vigra::Diff2D getPosition() const { return vigra::Diff2D(); } virtual unsigned int getOffset() const = 0; virtual const void * currentScanlineOfBand( unsigned int ) const = 0; virtual void nextScanline() = 0; typedef ArrayVector ICCProfile; const ICCProfile & getICCProfile() const { return iccProfile_; } ICCProfile iccProfile_; }; struct Encoder { virtual ~Encoder() {}; virtual void init( const std::string & ) = 0; virtual void close() = 0; virtual void abort() = 0; virtual std::string getFileType() const = 0; virtual unsigned int getOffset() const = 0; virtual void setWidth( unsigned int ) = 0; virtual void setHeight( unsigned int ) = 0; virtual void setNumBands( unsigned int ) = 0; virtual void setCompressionType( const std::string &, int = -1 ) = 0; virtual void setPixelType( const std::string & ) = 0; virtual void finalizeSettings() = 0; virtual void setPosition( const vigra::Diff2D & /*pos*/ ) { } virtual void setXResolution( float /*xres*/ ) { } virtual void setYResolution( float /*yres*/ ) { } typedef ArrayVector ICCProfile; virtual void setICCProfile(const ICCProfile & /* data */) { } virtual void * currentScanlineOfBand( unsigned int ) = 0; virtual void nextScanline() = 0; struct TIFFCompressionException {}; }; // codec factory for registration at the codec manager struct CodecFactory { virtual CodecDesc getCodecDesc() const = 0; virtual std::auto_ptr getDecoder() const = 0; virtual std::auto_ptr getEncoder() const = 0; virtual ~CodecFactory() {}; }; // factory functions to encapsulate the codec managers // // codecs are selected according to the following order: // - (if provided) the FileType // - (in case of decoders) the file's magic string // - the filename extension VIGRA_EXPORT std::auto_ptr getDecoder( const std::string &, const std::string & = "undefined" ); VIGRA_EXPORT std::auto_ptr getEncoder( const std::string &, const std::string & = "undefined" ); VIGRA_EXPORT std::string getEncoderType( const std::string &, const std::string & = "undefined" ); // functions to query the capabilities of certain codecs VIGRA_EXPORT std::vector queryCodecPixelTypes( const std::string & ); VIGRA_EXPORT bool negotiatePixelType( std::string const & codecname, std::string const & srcPixeltype, std::string & destPixeltype); VIGRA_EXPORT bool isPixelTypeSupported( const std::string &, const std::string & ); VIGRA_EXPORT bool isBandNumberSupported( const std::string &, int bands ); } #endif // VIGRA_CODEC_HXX gamera-3.3.3/include/vigra/colorconversions.hxx0000644000076500000000000027725311261456425020663 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_COLORCONVERSIONS_HXX #define VIGRA_COLORCONVERSIONS_HXX #include #include "mathutil.hxx" #include "rgbvalue.hxx" #include "functortraits.hxx" namespace vigra { namespace detail { inline double gammaCorrection(double value, double gamma) { return (value < 0.0) ? -VIGRA_CSTD::pow(-value, gamma) : VIGRA_CSTD::pow(value, gamma); } inline double gammaCorrection(double value, double gamma, double norm) { return (value < 0.0) ? -norm*VIGRA_CSTD::pow(-value/norm, gamma) : norm*VIGRA_CSTD::pow(value/norm, gamma); } inline double sRGBCorrection(double value, double norm) { value /= norm; return (value <= 0.00304) ? norm*12.92*value : norm*(1.055*VIGRA_CSTD::pow(value, 0.41666666666666667) - 0.055); } inline double inverse_sRGBCorrection(double value, double norm) { value /= norm; return (value <= 0.03928) ? norm*value / 12.92 : norm*VIGRA_CSTD::pow((value + 0.055)/1.055, 2.4); } } // namespace detail /** \defgroup ColorConversions Color Space Conversions Convert between RGB, sRGB, R'G'B', XYZ, L*a*b*, L*u*v*, Y'PbPr, Y'CbCr, Y'IQ, and Y'UV color spaces. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra
  • RGB/sRGB/R'G'B'
    linear and non-linear (gamma corrected) additive color

    • \ref vigra::RGB2sRGBFunctor
    • \ref vigra::sRGB2RGBFunctor
    • \ref vigra::RGB2RGBPrimeFunctor
    • \ref vigra::RGBPrime2RGBFunctor

  • XYZ
    device independent color representation (according to Publication CIE No 15.2 "Colorimetry" and ITU-R Recommendation BT.709)

    • \ref vigra::RGB2XYZFunctor
    • \ref vigra::RGBPrime2XYZFunctor
    • \ref vigra::XYZ2RGBFunctor
    • \ref vigra::XYZ2RGBPrimeFunctor

  • L*a*b*
    perceptually uniform color representation (according to Publication CIE No 15.2 "Colorimetry" and ITU-R Recommendation BT.709)

    • \ref vigra::RGB2LabFunctor
    • \ref vigra::RGBPrime2LabFunctor
    • \ref vigra::XYZ2LabFunctor
    • \ref vigra::Lab2RGBFunctor
    • \ref vigra::Lab2RGBPrimeFunctor
    • \ref vigra::Lab2XYZFunctor
    • \ref polar2Lab()
    • \ref lab2Polar()

  • L*u*v*
    perceptually uniform color representation (according to Publication CIE No 15.2 "Colorimetry" and ITU-R Recommendation BT.709)

    • \ref vigra::RGB2LuvFunctor
    • \ref vigra::RGBPrime2LuvFunctor
    • \ref vigra::XYZ2LuvFunctor
    • \ref vigra::Luv2RGBFunctor
    • \ref vigra::Luv2RGBPrimeFunctor
    • \ref vigra::Luv2XYZFunctor
    • \ref polar2Luv()
    • \ref luv2Polar()

  • Y'PbPr and Y'CbCr
    color difference coding (according to ITU-R Recommendation BT. 601)

    • \ref vigra::RGBPrime2YPrimePbPrFunctor
    • \ref vigra::YPrimePbPr2RGBPrimeFunctor
    • \ref polar2YPrimePbPr()
    • \ref yPrimePbPr2Polar()
    • \ref vigra::RGBPrime2YPrimeCbCrFunctor
    • \ref vigra::YPrimeCbCr2RGBPrimeFunctor
    • \ref polar2YPrimeCbCr()
    • \ref yPrimeCbCr2Polar()

  • Y'UV and Y'IQ
    analog video coding according to NTSC and PAL standards

    • \ref vigra::RGBPrime2YPrimeUVFunctor
    • \ref vigra::YPrimeUV2RGBPrimeFunctor
    • \ref polar2YPrimeUV()
    • \ref yPrimeUV2Polar()
    • \ref vigra::RGBPrime2YPrimeIQFunctor
    • \ref vigra::YPrimeIQ2RGBPrimeFunctor
    • \ref polar2YPrimeIQ()
    • \ref yPrimeIQ2Polar()

\anchor _details This module provides conversion from RGB/R'G'B' into more perceptually uniform color spaces. In image analysis, colors are usually converted into another color space in order to get good estimates of perceived color differences by just calculating Euclidean distances between the transformed colors. The L*a*b* and L*u*v* were designed with exactly this application in mind and thus give the best results. But these conversions are also the most computationally demanding. The Y'PbPr color difference space (designed for coding digital video) is computationally much cheaper, and almost as good. Y'CbCr represents esentially the same transformation, but the color values are scaled so that they can be stored with 8 bits per channel with minimal loss of information. The other transformations are of lesser interest here: XYZ is a device independent (but not perceptually uniform) color representation, and Y'IQ and Y'UV are the color spaces used by the PAL and NTSC analog video standards. Detailed information about these color spaces and their transformations can be found in Charles Poynton's Color FAQ When you want to perform a color conversion, you must first know in which color space the data are given. Although this sounds trivial, it is quite often done wrong, because the distinction between RGB and sRGB (still images) or R'G'B' (digital video) is frequently overlooked: nowadays, most still images are stored in sRGB space, and treating them as RGB leads to wrong results (although the color primaries are named the same). RGB and R'G'B' are related by a so called gamma correction: \f[ C' = C_{max} \left(\frac{C_{RGB}}{C_{max}} \right)^{0.45} \qquad \f] where C represents one of the color channels R, G, and B, and \f$ C_{max} \f$ usually equals 255. The sRGB color space realizes a slight enhancement of this definition: \f[ C_{sRGB} = \left\{\begin{array}{ll} 12.92\,C_{RGB} & \textrm{ if }\frac{C_{RGB}}{C_{max}} \le 0.00304 \\ C_{max}\left( 1.055 \left(\frac{C_{RGB}}{C_{max}}\right)^{1/2.4}-0.055\right) & \textrm{ otherwise} \end{array} \right. \f] sRGB has now become a widely accepted international standard (IEC 61966-2.1) which is used by most consumer products (digital cameras, printers, and screens). In practice, you can distinguish between linear and gamma-corrected red, green, and blue by displaying the images: if they look too dark, they are probably RGB, if they are OK, they are likely sRGB. (However, there are still a few older graphics cards and display programs which silently apply an additional gamma correction to every image, so that RGB appears correct and sRGB is too bright.) Whether or not the data are represented in the sRGB color space can also be seen in the color space tag of an image's EXIF data, if available. The distinction between RGB and R'G'B' is important because some conversions start at RGB (XYZ, L*a*b*, L*u*v*), while others start at R'G'B' (Y'PbPr, Y'CbCr, Y'IQ, and Y'UV). The names of VIGRA's color conversion functors always make clear to which color space they must be applied. In addition VIGRA provides a \ref PolarColors "polar coordinate interface" to several color spaces (L*a*b*, L*u*v*, Y'PbPr, Y'CbCr, Y'IQ, and Y'UV). This interface makes use of the fact that these color spaces are conceptually similar: they represent colors by a "brightness" coordinate (L* or Y') and a pair of "chromaticity" coordinates that span a plane of colors with equal brightness. The polar representation transforms chroma coordinates into a color "angle" (similar to hue in the HSV system) and a "saturation". The polar coordinates are normalized so that a color angle of 0 degrees is always associated with red (green is at about 120 degrees, blue at about 240 degrees - exact values differ between color spaces). A saturation of 1 is the highest saturation that any RGB color in the unit cube can have after transformation into the respective color space, and saturation 0 corresponds to gray. Polar coordinates provide a more intuitive interface to color specification by users and make different color spaces somewhat comparable. */ //@{ /** \brief Convert linear (raw) RGB into non-linear (gamma corrected) R'G'B'. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ R' = R_{max} \left(\frac{R}{R_{max}} \right)^{0.45} \qquad G' = G_{max} \left(\frac{G}{G_{max}} \right)^{0.45} \qquad B' = B_{max} \left(\frac{B}{B_{max}} \right)^{0.45} \f] By default, \f$ R_{max} = G_{max} = B_{max} = 255 \f$. This default can be overridden in the constructor. If both source and target colors components are stored as unsigned char, a look-up-table will be used to speed up the transformation. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGB2RGBPrimeFunctor { public: /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** the result component's promote type */ typedef typename NumericTraits::RealPromote component_type; /** Default constructor. The maximum value for each RGB component defaults to 255 */ RGB2RGBPrimeFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGB2RGBPrimeFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { return RGBValue( NumericTraits::fromRealPromote(detail::gammaCorrection(rgb[0], 0.45, max_)), NumericTraits::fromRealPromote(detail::gammaCorrection(rgb[1], 0.45, max_)), NumericTraits::fromRealPromote(detail::gammaCorrection(rgb[2], 0.45, max_))); } private: component_type max_; }; template <> class RGB2RGBPrimeFunctor { unsigned char lut_[256]; public: typedef RGBValue value_type; RGB2RGBPrimeFunctor() { for(int i=0; i<256; ++i) { lut_[i] = NumericTraits::fromRealPromote(detail::gammaCorrection(i, 0.45, 255.0)); } } RGB2RGBPrimeFunctor(double max) { for(int i=0; i<256; ++i) { lut_[i] = NumericTraits::fromRealPromote(detail::gammaCorrection(i, 0.45, max)); } } template RGBValue operator()(V const & rgb) const { return RGBValue(lut_[rgb[0]], lut_[rgb[1]], lut_[rgb[2]]); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert linear (raw) RGB into standardized sRGB. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The sRGB color space is a slight improvement over the R'G'B' space. It is now a widely accepted international standard (IEC 61966-2.1) which is used by most consumer products (digital cameras, printers, and screens). The functor realizes the transformation \f[ C_{sRGB} = \left\{ \begin{array}{ll} 12.92\,C_{RGB} & \textrm{ if }\frac{C_{RGB}}{C_{max}} \le 0.00304 \\ C_{max}\left( 1.055 \left(\frac{C_{RGB}}{C_{max}}\right)^{1/2.4}-0.055\right) & \textrm{ otherwise} \end{array} \right. \f] where C is any of the primaries R, G, and B. By default, \f$ C_{max} = 255 \f$ (this default can be overridden in the constructor). If both source and target color components are stored as unsigned char, a look-up-table will be used to speed up the transformation. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGB2sRGBFunctor { public: /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** the result component's promote type */ typedef typename NumericTraits::RealPromote component_type; /** Default constructor. The maximum value for each RGB component defaults to 255 */ RGB2sRGBFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGB2sRGBFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { return RGBValue( NumericTraits::fromRealPromote(detail::sRGBCorrection(rgb[0], max_)), NumericTraits::fromRealPromote(detail::sRGBCorrection(rgb[1], max_)), NumericTraits::fromRealPromote(detail::sRGBCorrection(rgb[2], max_))); } private: component_type max_; }; template <> class RGB2sRGBFunctor { unsigned char lut_[256]; public: typedef RGBValue value_type; RGB2sRGBFunctor() { for(int i=0; i<256; ++i) { lut_[i] = NumericTraits::fromRealPromote(detail::sRGBCorrection(i, 255.0)); } } RGB2sRGBFunctor(double max) { for(int i=0; i<256; ++i) { lut_[i] = NumericTraits::fromRealPromote(detail::sRGBCorrection(i, max)); } } template RGBValue operator()(V const & rgb) const { return RGBValue(lut_[rgb[0]], lut_[rgb[1]], lut_[rgb[2]]); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert non-linear (gamma corrected) R'G'B' into non-linear (raw) RGB. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ R = R_{max} \left(\frac{R'}{R_{max}} \right)^{1/0.45} \qquad G = G_{max} \left(\frac{G'}{G_{max}} \right)^{1/0.45} \qquad B = B_{max} \left(\frac{B'}{B_{max}} \right)^{1/0.45} \f] By default, \f$ R_{max} = G_{max} = B_{max} = 255 \f$. This default can be overridden in the constructor. If both source and target color components are stored as unsigned char, a look-up-table will be used to speed up the transformation. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGBPrime2RGBFunctor { public: /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** the result component's promote type */ typedef typename NumericTraits::RealPromote component_type; /** Default constructor. The maximum value for each RGB component defaults to 255. */ RGBPrime2RGBFunctor() : max_(255.0), gamma_(1.0/0.45) {} /** constructor \arg max - the maximum value for each RGB component */ RGBPrime2RGBFunctor(component_type max) : max_(max), gamma_(1.0/0.45) {} /** apply the transformation */ result_type operator()(argument_type const & rgb) const { return RGBValue( NumericTraits::fromRealPromote(detail::gammaCorrection(rgb[0], gamma_, max_)), NumericTraits::fromRealPromote(detail::gammaCorrection(rgb[1], gamma_, max_)), NumericTraits::fromRealPromote(detail::gammaCorrection(rgb[2], gamma_, max_))); } private: component_type max_; double gamma_; }; template <> class RGBPrime2RGBFunctor { unsigned char lut_[256]; public: typedef RGBValue value_type; RGBPrime2RGBFunctor() { for(int i=0; i<256; ++i) { lut_[i] = NumericTraits::fromRealPromote(detail::gammaCorrection(i, 1.0/0.45, 255.0)); } } RGBPrime2RGBFunctor(double max) { for(int i=0; i<256; ++i) { lut_[i] = NumericTraits::fromRealPromote(detail::gammaCorrection(i, 1.0/0.45, max)); } } template RGBValue operator()(V const & rgb) const { return RGBValue(lut_[rgb[0]], lut_[rgb[1]], lut_[rgb[2]]); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert standardized sRGB into non-linear (raw) RGB. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The sRGB color space is a slight improvement over the R'G'B' space. Is is now a widely accepted international standard (IEC 61966-2.1) which is used by most consumer products (digital cameras, printers, and screens). The functor realizes the transformation \f[ C_{RGB} = \left\{\begin{array}{ll} C_{sRGB} / 12.92 & \textrm{if }\frac{C_{sRGB}}{C_{max}} \le 0.03928 \\ C_{max}\left( \frac{C_{sRGB}/C_{max}+0.055}{1.055}\right)^{2.4} & \textrm{otherwise} \end{array}\right. \f] where C is one of the color channels R, G, or B, and \f$ C_{max}\f$ equals 255 by default (This default can be overridden in the constructor). If both source and target color components are stored as unsigned char, a look-up-table will be used to speed up the transformation. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class sRGB2RGBFunctor { public: /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** the result component's promote type */ typedef typename NumericTraits::RealPromote component_type; /** Default constructor. The maximum value for each RGB component defaults to 255. */ sRGB2RGBFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ sRGB2RGBFunctor(component_type max) : max_(max) {} /** apply the transformation */ result_type operator()(argument_type const & rgb) const { return RGBValue( NumericTraits::fromRealPromote(detail::inverse_sRGBCorrection(rgb[0], max_)), NumericTraits::fromRealPromote(detail::inverse_sRGBCorrection(rgb[1], max_)), NumericTraits::fromRealPromote(detail::inverse_sRGBCorrection(rgb[2], max_))); } private: component_type max_; }; template <> class sRGB2RGBFunctor { unsigned char lut_[256]; public: typedef RGBValue value_type; sRGB2RGBFunctor() { for(int i=0; i<256; ++i) { lut_[i] = NumericTraits::fromRealPromote(detail::inverse_sRGBCorrection(i, 255.0)); } } sRGB2RGBFunctor(double max) { for(int i=0; i<256; ++i) { lut_[i] = NumericTraits::fromRealPromote(detail::inverse_sRGBCorrection(i, max)); } } template RGBValue operator()(V const & rgb) const { return RGBValue(lut_[rgb[0]], lut_[rgb[1]], lut_[rgb[2]]); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert linear (raw) RGB into standardized tri-stimulus XYZ. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra According to ITU-R Recommendation BT.709, the functor realizes the transformation \f[ \begin{array}{rcl} X & = & 0.412453\enspace R / R_{max} + 0.357580\enspace G / G_{max} + 0.180423\enspace B / B_{max}\\ Y & = & 0.212671\enspace R / R_{max} + 0.715160\enspace G / G_{max} + 0.072169\enspace B / B_{max} \\ Z & = & 0.019334\enspace R / R_{max} + 0.119193\enspace G / G_{max} + 0.950227\enspace B / B_{max} \end{array} \f] By default, \f$ R_{max} = G_{max} = B_{max} = 255 \f$. This default can be overridden in the constructor. X, Y, and Z are always positive and reach their maximum for white. The white point is obtained by transforming RGB(255, 255, 255). It corresponds to the D65 illuminant. Y represents the luminance ("brightness") of the color. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGB2XYZFunctor { public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGB2XYZFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGB2XYZFunctor(component_type max) : max_(max) {} /** apply the transformation */ result_type operator()(argument_type const & rgb) const { component_type red = rgb[0] / max_; component_type green = rgb[1] / max_; component_type blue = rgb[2] / max_; result_type result; result[0] = 0.412453*red + 0.357580*green + 0.180423*blue; result[1] = 0.212671*red + 0.715160*green + 0.072169*blue; result[2] = 0.019334*red + 0.119193*green + 0.950227*blue; return result; } private: component_type max_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert non-linear (gamma corrected) R'G'B' into standardized tri-stimulus XYZ. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ R'G'B' \Rightarrow RGB \Rightarrow XYZ \f] See vigra::RGBPrime2RGBFunctor and vigra::RGB2XYZFunctor for a description of the two steps. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGBPrime2XYZFunctor { public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; /** default constructor The maximum value for each RGB component defaults to 255. */ RGBPrime2XYZFunctor() : max_(255.0), gamma_(1.0/ 0.45) {} /** constructor \arg max - the maximum value for each RGB component */ RGBPrime2XYZFunctor(component_type max) : max_(max), gamma_(1.0/ 0.45) {} /** apply the transformation */ result_type operator()(argument_type const & rgb) const { component_type red = detail::gammaCorrection(rgb[0]/max_, gamma_); component_type green = detail::gammaCorrection(rgb[1]/max_, gamma_); component_type blue = detail::gammaCorrection(rgb[2]/max_, gamma_); result_type result; result[0] = 0.412453*red + 0.357580*green + 0.180423*blue; result[1] = 0.212671*red + 0.715160*green + 0.072169*blue; result[2] = 0.019334*red + 0.119193*green + 0.950227*blue; return result; } private: component_type max_, gamma_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert standardized tri-stimulus XYZ into linear (raw) RGB. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra According to ITU-R Recommendation BT.709, the functor realizes the transformation \f[ \begin{array}{rcl} R & = & R_{max} (3.2404813432\enspace X - 1.5371515163\enspace Y - 0.4985363262\enspace Z) \\ G & = & G_{max} (-0.9692549500\enspace X + 1.8759900015\enspace Y + 0.0415559266\enspace Z) \\ B & = & B_{max} (0.0556466391\enspace X - 0.2040413384\enspace Y + 1.0573110696\enspace Z) \end{array} \f] By default, \f$ R_{max} = G_{max} = B_{max} = 255 \f$. This default can be overridden in the constructor. This is the inverse transform of vigra::RGB2XYZFunctor. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class XYZ2RGBFunctor { typedef typename NumericTraits::RealPromote component_type; component_type max_; public: /** the functor's argument type. (Actually, the argument type is more general: V with arbitrary V. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ XYZ2RGBFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ XYZ2RGBFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & xyz) const { component_type red = 3.2404813432*xyz[0] - 1.5371515163*xyz[1] - 0.4985363262*xyz[2]; component_type green = -0.9692549500*xyz[0] + 1.8759900015*xyz[1] + 0.0415559266*xyz[2]; component_type blue = 0.0556466391*xyz[0] - 0.2040413384*xyz[1] + 1.0573110696*xyz[2]; return value_type(NumericTraits::fromRealPromote(red * max_), NumericTraits::fromRealPromote(green * max_), NumericTraits::fromRealPromote(blue * max_)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert standardized tri-stimulus XYZ into non-linear (gamma corrected) R'G'B'. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ XYZ \Rightarrow RGB \Rightarrow R'G'B' \f] See vigra::XYZ2RGBFunctor and vigra::RGB2RGBPrimeFunctor for a description of the two steps. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class XYZ2RGBPrimeFunctor { typedef typename NumericTraits::RealPromote component_type; component_type max_, gamma_; public: public: /** the functor's argument type. (actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ XYZ2RGBPrimeFunctor() : max_(255.0), gamma_(0.45) {} /** constructor \arg max - the maximum value for each RGB component */ XYZ2RGBPrimeFunctor(component_type max) : max_(max), gamma_(0.45) {} /** apply the transformation */ template result_type operator()(V const & xyz) const { component_type red = 3.2404813432*xyz[0] - 1.5371515163*xyz[1] - 0.4985363262*xyz[2]; component_type green = -0.9692549500*xyz[0] + 1.8759900015*xyz[1] + 0.0415559266*xyz[2]; component_type blue = 0.0556466391*xyz[0] - 0.2040413384*xyz[1] + 1.0573110696*xyz[2]; return value_type(NumericTraits::fromRealPromote(detail::gammaCorrection(red, gamma_) * max_), NumericTraits::fromRealPromote(detail::gammaCorrection(green, gamma_) * max_), NumericTraits::fromRealPromote(detail::gammaCorrection(blue, gamma_) * max_)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert standardized tri-stimulus XYZ into perceptual uniform CIE L*u*v*. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ \begin{array}{rcl} L^{*} & = & 116 \left( \frac{Y}{Y_n} \right)^\frac{1}{3}-16 \quad \mbox{if} \quad 0.008856 < \frac{Y}{Y_n}\\ & & \\ L^{*} & = & 903.3\enspace \frac{Y}{Y_n} \quad \mbox{otherwise} \\ & & \\ u' & = & \frac{4 X}{X+15 Y + 3 Z}, \quad v' = \frac{9 Y}{X+15 Y + 3 Z}\\ & & \\ u^{*} & = & 13 L^{*} (u' - u_n'), \quad v^{*} = 13 L^{*} (v' - v_n') \end{array} \f] where \f$(X_n, Y_n, Z_n)\f$ is the reference white point, and \f$u_n' = 0.197839, v_n'=0.468342\f$ are the quantities \f$u', v'\f$ calculated for this point. \f$L^{*}\f$ represents the lighness ("brightness") of the color, and \f$u^{*}, v^{*}\f$ code the chromaticity. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class XYZ2LuvFunctor { public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; XYZ2LuvFunctor() : gamma_(1.0/3.0) {} template result_type operator()(V const & xyz) const { result_type result; if(xyz[1] == NumericTraits::zero()) { result[0] = NumericTraits::zero(); result[1] = NumericTraits::zero(); result[2] = NumericTraits::zero(); } else { component_type L = xyz[1] < 0.008856 ? 903.3 * xyz[1] : 116.0 * VIGRA_CSTD::pow((double)xyz[1], gamma_) - 16.0; component_type denom = xyz[0] + 15.0*xyz[1] + 3.0*xyz[2]; component_type uprime = 4.0 * xyz[0] / denom; component_type vprime = 9.0 * xyz[1] / denom; result[0] = L; result[1] = 13.0*L*(uprime - 0.197839); result[2] = 13.0*L*(vprime - 0.468342); } return result; } private: double gamma_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert perceptual uniform CIE L*u*v* into standardized tri-stimulus XYZ. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::XYZ2LuvFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class Luv2XYZFunctor { public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; Luv2XYZFunctor() : gamma_(3.0) {} /** apply the transformation */ template result_type operator()(V const & luv) const { result_type result; if(luv[0] == NumericTraits::zero()) { result[0] = NumericTraits::zero(); result[1] = NumericTraits::zero(); result[2] = NumericTraits::zero(); } else { component_type uprime = luv[1] / 13.0 / luv[0] + 0.197839; component_type vprime = luv[2] / 13.0 / luv[0] + 0.468342; result[1] = luv[0] < 8.0 ? luv[0] / 903.3 : VIGRA_CSTD::pow((luv[0] + 16.0) / 116.0, gamma_); result[0] = 9.0*uprime*result[1] / 4.0 / vprime; result[2] = ((9.0 / vprime - 15.0)*result[1] - result[0])/ 3.0; } return result; } private: double gamma_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert standardized tri-stimulus XYZ into perceptual uniform CIE L*a*b*. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ \begin{array}{rcl} L^{*} & = & 116 \left( \frac{Y}{Y_n} \right)^\frac{1}{3}-16 \quad \mbox{if} \quad 0.008856 < \frac{Y}{Y_n}\\ & & \\ L^{*} & = & 903.3\enspace \frac{Y}{Y_n} \quad \mbox{otherwise} \\ & & \\ a^{*} & = & 500 \left[ \left( \frac{X}{X_n} \right)^\frac{1}{3} - \left( \frac{Y}{Y_n} \right)^\frac{1}{3} \right] \\ & & \\ b^{*} & = & 200 \left[ \left( \frac{Y}{Y_n} \right)^\frac{1}{3} - \left( \frac{Z}{Z_n} \right)^\frac{1}{3} \right] \\ \end{array} \f] where \f$(X_n, Y_n, Z_n)\f$ is the reference white point. \f$L^{*}\f$ represents the lighness ("brightness") of the color, and \f$a^{*}, b^{*}\f$ code the chromaticity. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class XYZ2LabFunctor { public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; XYZ2LabFunctor() : gamma_(1.0/3.0) {} /** apply the transformation */ template result_type operator()(V const & xyz) const { component_type xgamma = VIGRA_CSTD::pow(xyz[0] / 0.950456, gamma_); component_type ygamma = VIGRA_CSTD::pow((double)xyz[1], gamma_); component_type zgamma = VIGRA_CSTD::pow(xyz[2] / 1.088754, gamma_); component_type L = xyz[1] < 0.008856 ? 903.3 * xyz[1] : 116.0 * ygamma - 16.0; result_type result; result[0] = L; result[1] = 500.0*(xgamma - ygamma); result[2] = 200.0*(ygamma - zgamma); return result; } private: double gamma_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert perceptual uniform CIE L*a*b* into standardized tri-stimulus XYZ. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::XYZ2LabFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class Lab2XYZFunctor { public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; /** the functor's value type */ Lab2XYZFunctor() : gamma_(3.0) {} /** apply the transformation */ template result_type operator()(V const & lab) const { component_type Y = lab[0] < 8.0 ? lab[0] / 903.3 : VIGRA_CSTD::pow((lab[0] + 16.0) / 116.0, gamma_); component_type ygamma = VIGRA_CSTD::pow((double)Y, 1.0 / gamma_); component_type X = VIGRA_CSTD::pow(lab[1] / 500.0 + ygamma, gamma_) * 0.950456; component_type Z = VIGRA_CSTD::pow(-lab[2] / 200.0 + ygamma, gamma_) * 1.088754; result_type result; result[0] = X; result[1] = Y; result[2] = Z; return result; } private: double gamma_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert linear (raw) RGB into perceptual uniform CIE L*u*v*. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ RGB \Rightarrow XYZ \Rightarrow L^*u^*v^* \f] See vigra::RGB2XYZFunctor and vigra::XYZ2LuvFunctor for a description of the two steps. The resulting color components will have the following bounds: \f[ \begin{array}{rcl} 0 \leq & L^* & \leq 100 \\ -83.077 \leq & u^* & \leq 175.015 \\ -134.101 \leq & v^* & \leq 107.393 \end{array} \f] Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGB2LuvFunctor { /* L in [0, 100] u in [-83.077, 175.015] v in [-134.101, 107.393] maximum saturation: 179.04 red = [53.2406, 175.015, 37.7522] */ public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef typename XYZ2LuvFunctor::result_type result_type; /** \deprecated use argument_type and result_type */ typedef typename XYZ2LuvFunctor::result_type value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGB2LuvFunctor() : rgb2xyz(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGB2LuvFunctor(component_type max) : rgb2xyz(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { return xyz2luv(rgb2xyz(rgb)); } private: RGB2XYZFunctor rgb2xyz; XYZ2LuvFunctor xyz2luv; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert linear (raw) RGB into perceptual uniform CIE L*a*b*. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ RGB \Rightarrow XYZ \Rightarrow L^*a^*b^* \f] See vigra::RGB2XYZFunctor and vigra::XYZ2LabFunctor for a description of the two steps. The resulting color components will have the following bounds: \f[ \begin{array}{rcl} 0 \leq & L^* & \leq 100 \\ -86.1813 \leq & u^* & \leq 98.2352 \\ -107.862 \leq & v^* & \leq 94.4758 \end{array} \f] Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGB2LabFunctor { /* L in [0, 100] a in [-86.1813, 98.2352] b in [-107.862, 94.4758] maximum saturation: 133.809 red = [53.2406, 80.0942, 67.2015] */ public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef typename XYZ2LabFunctor::result_type result_type; /** \deprecated use argument_type and result_type */ typedef typename XYZ2LabFunctor::result_type value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGB2LabFunctor() : rgb2xyz(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGB2LabFunctor(component_type max) : rgb2xyz(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { return xyz2lab(rgb2xyz(rgb)); } private: RGB2XYZFunctor rgb2xyz; XYZ2LabFunctor xyz2lab; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert perceptual uniform CIE L*u*v* into linear (raw) RGB. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::RGB2LuvFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class Luv2RGBFunctor { typedef typename NumericTraits::RealPromote component_type; XYZ2RGBFunctor xyz2rgb; Luv2XYZFunctor luv2xyz; public: /** the functor's argument type. (Actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef typename XYZ2RGBFunctor::result_type result_type; /** \deprecated use argument_type and result_type */ typedef typename XYZ2RGBFunctor::result_type value_type; Luv2RGBFunctor() : xyz2rgb(255.0) {} Luv2RGBFunctor(component_type max) : xyz2rgb(max) {} /** apply the transformation */ template result_type operator()(V const & luv) const { return xyz2rgb(luv2xyz(luv)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert perceptual uniform CIE L*a*b* into linear (raw) RGB. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::RGB2LabFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class Lab2RGBFunctor { typedef typename NumericTraits::RealPromote component_type; XYZ2RGBFunctor xyz2rgb; Lab2XYZFunctor lab2xyz; public: /** the functor's argument type. (Actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef typename XYZ2RGBFunctor::result_type result_type; /** \deprecated use argument_type and result_type */ typedef typename XYZ2RGBFunctor::result_type value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ Lab2RGBFunctor() : xyz2rgb(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ Lab2RGBFunctor(component_type max) : xyz2rgb(max) {} /** apply the transformation */ template result_type operator()(V const & lab) const { return xyz2rgb(lab2xyz(lab)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert non-linear (gamma corrected) R'G'B' into perceptual uniform CIE L*u*v*. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ R'G'B' \Rightarrow RGB \Rightarrow XYZ \Rightarrow L^*u^*v^* \f] See vigra::RGBPrime2RGBFunctor, vigra::RGB2XYZFunctor and vigra::XYZ2LuvFunctor for a description of the three steps. The resulting color components will have the following bounds: \f[ \begin{array}{rcl} 0 \leq & L^* & \leq 100 \\ -83.077 \leq & u^* & \leq 175.015 \\ -134.101 \leq & v^* & \leq 107.393 \end{array} \f] Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGBPrime2LuvFunctor { public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef typename XYZ2LuvFunctor::result_type result_type; /** \deprecated use argument_type and result_type */ typedef typename XYZ2LuvFunctor::result_type value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGBPrime2LuvFunctor() : rgb2xyz(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGBPrime2LuvFunctor(component_type max) : rgb2xyz(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { return xyz2luv(rgb2xyz(rgb)); } private: RGBPrime2XYZFunctor rgb2xyz; XYZ2LuvFunctor xyz2luv; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert non-linear (gamma corrected) R'G'B' into perceptual uniform CIE L*a*b*. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the transformation \f[ R'G'B' \Rightarrow RGB \Rightarrow XYZ \Rightarrow L^*a^*b^* \f] See vigra::RGBPrime2RGBFunctor, vigra::RGB2XYZFunctor and vigra::XYZ2LabFunctor for a description of the three steps. The resulting color components will have the following bounds: \f[ \begin{array}{rcl} 0 \leq & L^* & \leq 100 \\ -86.1813 \leq & u^* & \leq 98.2352 \\ -107.862 \leq & v^* & \leq 94.4758 \end{array} \f] Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGBPrime2LabFunctor { public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef typename XYZ2LabFunctor::result_type result_type; /** \deprecated use argument_type and result_type */ typedef typename XYZ2LabFunctor::result_type value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGBPrime2LabFunctor() : rgb2xyz(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGBPrime2LabFunctor(component_type max) : rgb2xyz(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { return xyz2lab(rgb2xyz(rgb)); } private: RGBPrime2XYZFunctor rgb2xyz; XYZ2LabFunctor xyz2lab; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert perceptual uniform CIE L*u*v* into non-linear (gamma corrected) R'G'B'. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::RGBPrime2LuvFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class Luv2RGBPrimeFunctor { typedef typename NumericTraits::RealPromote component_type; XYZ2RGBPrimeFunctor xyz2rgb; Luv2XYZFunctor luv2xyz; public: /** the functor's argument type. (Actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef typename XYZ2RGBFunctor::result_type result_type; /** \deprecated use argument_type and result_type */ typedef typename XYZ2RGBFunctor::result_type value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ Luv2RGBPrimeFunctor() : xyz2rgb(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ Luv2RGBPrimeFunctor(component_type max) : xyz2rgb(max) {} /** apply the transformation */ template result_type operator()(V const & luv) const { return xyz2rgb(luv2xyz(luv)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert perceptual uniform CIE L*a*b* into non-linear (gamma corrected) R'G'B'. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::RGBPrime2LabFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class Lab2RGBPrimeFunctor { typedef typename NumericTraits::RealPromote component_type; XYZ2RGBPrimeFunctor xyz2rgb; Lab2XYZFunctor lab2xyz; public: /** the functor's argument type. (Actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef typename XYZ2RGBFunctor::result_type result_type; /** \deprecated use argument_type and result_type */ typedef typename XYZ2RGBFunctor::result_type value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ Lab2RGBPrimeFunctor() : xyz2rgb(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ Lab2RGBPrimeFunctor(component_type max) : xyz2rgb(max) {} /** apply the transformation */ template result_type operator()(V const & lab) const { return xyz2rgb(lab2xyz(lab)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert non-linear (gamma corrected) R'G'B' into Y'PbPr color difference components. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra According to ITU-R Recommendation BT.601, the functor realizes the transformation \f[ \begin{array}{rcl} Y' & = & 0.299\enspace R / R_{max} + 0.587\enspace G / G_{max} + 0.114\enspace B / B_{max}\\ Pb & = & -0.1687358916\enspace R / R_{max} + 0.3312641084\enspace G / G_{max} + 0.5\enspace B / B_{max} \\ Pr & = & 0.5\enspace R / R_{max} + 0.4186875892\enspace G / G_{max} + 0.0813124108\enspace B / B_{max} \end{array} \f] By default, \f$ R_{max} = G_{max} = B_{max} = 255 \f$. This default can be overridden in the constructor. Y' represents the luminance ("brightness") of the color, and Pb and Pr are the blue (B'-Y') and red (R'-Y') color difference components. The transformation is scaled so that the following bounds apply: \f[ \begin{array}{rcl} 0 \leq & Y' & \leq 1 \\ -0.5 \leq & Pb & \leq 0.5 \\ -0.5 \leq & Pr & \leq 0.5 \end{array} \f] Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGBPrime2YPrimePbPrFunctor { /* Y in [0, 1] Pb in [-0.5, 0.5] Pr in [-0.5, 0.5] maximum saturation: 0.533887 red = [0.299, -0.168736, 0.5] */ public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGBPrime2YPrimePbPrFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGBPrime2YPrimePbPrFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { component_type red = rgb[0] / max_; component_type green = rgb[1] / max_; component_type blue = rgb[2] / max_; result_type result; result[0] = 0.299*red + 0.587*green + 0.114*blue; result[1] = -0.1687358916*red - 0.3312641084*green + 0.5*blue; result[2] = 0.5*red - 0.4186875892*green - 0.0813124108*blue; return result; } private: component_type max_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert Y'PbPr color difference components into non-linear (gamma corrected) R'G'B'. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::RGBPrime2YPrimePbPrFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class YPrimePbPr2RGBPrimeFunctor { typedef typename NumericTraits::RealPromote component_type; component_type max_; public: /** the functor's argument type. (Actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ YPrimePbPr2RGBPrimeFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ YPrimePbPr2RGBPrimeFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & ypbpr) const { component_type nred = ypbpr[0] + 1.402*ypbpr[2]; component_type ngreen = ypbpr[0] - 0.3441362862*ypbpr[1] - 0.7141362862*ypbpr[2]; component_type nblue = ypbpr[0] + 1.772*ypbpr[1]; return result_type(NumericTraits::fromRealPromote(nred * max_), NumericTraits::fromRealPromote(ngreen * max_), NumericTraits::fromRealPromote(nblue * max_)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert non-linear (gamma corrected) R'G'B' into Y'IQ components. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra According to the PAL analog videa standard, the functor realizes the transformation \f[ \begin{array}{rcl} Y' & = & 0.299\enspace R / R_{max} + 0.587\enspace G / G_{max} + 0.114\enspace B / B_{max}\\ I & = & 0.596\enspace R / R_{max} - 0.274\enspace G / G_{max} - 0.322\enspace B / B_{max} \\ Q & = & 0.212\enspace R / R_{max} - 0.523\enspace G / G_{max} + 0.311\enspace B / B_{max} \end{array} \f] By default, \f$ R_{max} = G_{max} = B_{max} = 255 \f$. This default can be overridden in the constructor. Y' represents the luminance ("brightness") of the color. The transformation is scaled so that the following bounds apply: \f[ \begin{array}{rcl} 0 \leq & Y' & \leq 1 \\ -0.596 \leq & I & \leq 0.596 \\ -0.523 \leq & Q & \leq 0.523 \end{array} \f] Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGBPrime2YPrimeIQFunctor { /* Y in [0, 1] I in [-0.596, 0.596] Q in [-0.523, 0.523] maximum saturation: 0.632582 red = [0.299, 0.596, 0.212] */ public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGBPrime2YPrimeIQFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGBPrime2YPrimeIQFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { component_type red = rgb[0] / max_; component_type green = rgb[1] / max_; component_type blue = rgb[2] / max_; result_type result; result[0] = 0.299*red + 0.587*green + 0.114*blue; result[1] = 0.596*red - 0.274*green - 0.322*blue; result[2] = 0.212*red - 0.523*green + 0.311*blue; return result; } private: component_type max_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert Y'IQ color components into non-linear (gamma corrected) R'G'B'. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::RGBPrime2YPrimeIQFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class YPrimeIQ2RGBPrimeFunctor { typedef typename NumericTraits::RealPromote component_type; component_type max_; public: /** the functor's argument type. (Actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ YPrimeIQ2RGBPrimeFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ YPrimeIQ2RGBPrimeFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & yiq) const { component_type nred = yiq[0] + 0.9548892043*yiq[1] + 0.6221039350*yiq[2]; component_type ngreen = yiq[0] - 0.2713547827*yiq[1] - 0.6475120259*yiq[2]; component_type nblue = yiq[0] - 1.1072510054*yiq[1] + 1.7024603738*yiq[2]; return result_type(NumericTraits::fromRealPromote(nred * max_), NumericTraits::fromRealPromote(ngreen * max_), NumericTraits::fromRealPromote(nblue * max_)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert non-linear (gamma corrected) R'G'B' into Y'UV components. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra According to the NTSC analog videa standard, the functor realizes the transformation \f[ \begin{array}{rcl} Y' & = & 0.299\enspace R / R_{max} + 0.587\enspace G / G_{max} + 0.114\enspace B / B_{max}\\ U & = & -0.147\enspace R / R_{max} - 0.289\enspace G / G_{max} + 0.436\enspace B / B_{max} \\ V & = & 0.615\enspace R / R_{max} - 0.515\enspace G / G_{max} - 0.100\enspace B / B_{max} \end{array} \f] By default, \f$ R_{max} = G_{max} = B_{max} = 255 \f$. This default can be overridden in the constructor. Y' represents the luminance ("brightness") of the color. The transformation is scaled so that the following bounds apply: \f[ \begin{array}{rcl} 0 \leq & Y' & \leq 1 \\ -0.436 \leq & U & \leq 0.436 \\ -0.615 \leq & V & \leq 0.615 \end{array} \f] Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGBPrime2YPrimeUVFunctor { /* Y in [0, 1] U in [-0.436, 0.436] V in [-0.615, 0.615] maximum saturation: 0.632324 red = [0.299, -0.147, 0.615] */ public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGBPrime2YPrimeUVFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGBPrime2YPrimeUVFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { component_type red = rgb[0] / max_; component_type green = rgb[1] / max_; component_type blue = rgb[2] / max_; result_type result; result[0] = 0.299*red + 0.587*green + 0.114*blue; result[1] = -0.1471376975*red - 0.2888623025*green + 0.436*blue; result[2] = 0.6149122807*red - 0.5149122807*green - 0.100*blue; return result; } private: component_type max_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert Y'UV color components into non-linear (gamma corrected) R'G'B'. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::RGBPrime2YPrimeUVFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class YPrimeUV2RGBPrimeFunctor { typedef typename NumericTraits::RealPromote component_type; component_type max_; public: /** the functor's argument type. (Actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ YPrimeUV2RGBPrimeFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ YPrimeUV2RGBPrimeFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & yuv) const { component_type nred = yuv[0] + 1.140*yuv[2]; component_type ngreen = yuv[0] - 0.3946517044*yuv[1] - 0.580681431*yuv[2]; component_type nblue = yuv[0] + 2.0321100920*yuv[1]; return result_type(NumericTraits::fromRealPromote(nred * max_), NumericTraits::fromRealPromote(ngreen * max_), NumericTraits::fromRealPromote(nblue * max_)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert non-linear (gamma corrected) R'G'B' into Y'CbCr color difference components. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra This functor basically applies the same transformation as vigra::RGBPrime2YPrimePbPrFunctor but the color components are scaled so that they can be coded as 8 bit intergers with minimal loss of information: \f[ \begin{array}{rcl} 16\leq & Y' & \leq 235 \\ 16 \leq & Cb & \leq 240 \\ 16 \leq & Cr & \leq 240 \end{array} \f] Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class RGBPrime2YPrimeCbCrFunctor { /* Y in [16, 235] Cb in [16, 240] Cr in [16, 240] maximum saturation: 119.591 red = [81.481, 90.203, 240] */ public: /** the result's component type */ typedef typename NumericTraits::RealPromote component_type; /** the functor's argument type */ typedef TinyVector argument_type; /** the functor's result type */ typedef TinyVector result_type; /** \deprecated use argument_type and result_type */ typedef TinyVector value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ RGBPrime2YPrimeCbCrFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ RGBPrime2YPrimeCbCrFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & rgb) const { component_type red = rgb[0] / max_; component_type green = rgb[1] / max_; component_type blue = rgb[2] / max_; result_type result; result[0] = 16.0 + 65.481*red + 128.553*green + 24.966*blue; result[1] = 128.0 - 37.79683972*red - 74.20316028*green + 112.0*blue; result[2] = 128.0 + 112.0*red - 93.78601998*green - 18.21398002*blue; return result; } private: component_type max_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief Convert Y'CbCr color difference components into non-linear (gamma corrected) R'G'B'. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra The functor realizes the inverse of the transformation described in vigra::RGBPrime2YPrimeCbCrFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) */ template class YPrimeCbCr2RGBPrimeFunctor { typedef typename NumericTraits::RealPromote component_type; component_type max_; public: /** the functor's argument type. (Actually, the argument type can be any vector type with the same interface. But this cannot be expressed in a typedef.) */ typedef TinyVector argument_type; /** the functor's result type */ typedef RGBValue result_type; /** \deprecated use argument_type and result_type */ typedef RGBValue value_type; /** default constructor. The maximum value for each RGB component defaults to 255. */ YPrimeCbCr2RGBPrimeFunctor() : max_(255.0) {} /** constructor \arg max - the maximum value for each RGB component */ YPrimeCbCr2RGBPrimeFunctor(component_type max) : max_(max) {} /** apply the transformation */ template result_type operator()(V const & ycbcr) const { component_type y = ycbcr[0] - 16.0; component_type cb = ycbcr[1] - 128.0; component_type cr = ycbcr[2] - 128.0; component_type nred = 0.00456621*y + 0.006258928571*cr; component_type ngreen = 0.00456621*y - 0.001536322706*cb - 0.003188108420*cr; component_type nblue = 0.00456621*y + 0.007910714286*cb; return result_type(NumericTraits::fromRealPromote(nred * max_), NumericTraits::fromRealPromote(ngreen * max_), NumericTraits::fromRealPromote(nblue * max_)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; //@} /* Polar coordinates of standard colors: ===================================== Lab: black = [320.002, 0, 0] Luv: black = [347.827, 0, 0] YPbPr: black = [341.352, 0, 0] YCbCr: black = [341.352, 0, 0] YIQ: black = [19.5807, 0, 0] YUV: black = [346.557, 0, 0] Lab: red = [1.20391e-05, 0.532406, 0.781353] Luv: red = [360, 0.532406, 1] YPbPr: red = [360, 0.299, 0.988419] YCbCr: red = [360, 0.299, 0.988417] YIQ: red = [360, 0.299, 1] YUV: red = [360, 0.299, 1] Lab: green = [96.0184, 0.877351, 0.895108] Luv: green = [115.552, 0.877351, 0.758352] YPbPr: green = [123.001, 0.587, 1] YCbCr: green = [123.001, 0.587, 0.999996] YIQ: green = [137.231, 0.587, 0.933362] YUV: green = [137.257, 0.587, 0.933931] Lab: blue = [266.287, 0.322957, 0.999997] Luv: blue = [253.7, 0.322957, 0.729883] YPbPr: blue = [242.115, 0.114, 0.948831] YCbCr: blue = [242.115, 0.114, 0.948829] YIQ: blue = [243.585, 0.114, 0.707681] YUV: blue = [243.639, 0.114, 0.707424] Lab: yellow = [62.8531, 0.971395, 0.724189] Luv: yellow = [73.7, 0.971395, 0.597953] YPbPr: yellow = [62.1151, 0.886, 0.948831] YCbCr: yellow = [62.1149, 0.886, 0.948829] YIQ: yellow = [63.5851, 0.886, 0.707681] YUV: yellow = [63.6393, 0.886, 0.707424] Lab: magenta = [288.237, 0.603235, 0.863482] Luv: magenta = [295.553, 0.603235, 0.767457] YPbPr: magenta = [303.001, 0.413, 1] YCbCr: magenta = [303.001, 0.413, 0.999996] YIQ: magenta = [317.231, 0.413, 0.933362] YUV: magenta = [317.257, 0.413, 0.933931] Lab: cyan = [156.378, 0.911133, 0.374577] Luv: cyan = [180, 0.911133, 0.402694] YPbPr: cyan = [180, 0.701, 0.988419] YCbCr: cyan = [180, 0.701, 0.988417] YIQ: cyan = [180, 0.701, 1] YUV: cyan = [180, 0.701, 1] Lab: white = [320.002, 1, 0] Luv: white = [14.3606, 1, 3.26357e-06] YPbPr: white = [341.352, 1, 0] YCbCr: white = [341.352, 1, 0] YIQ: white = [154.581, 1, 1.24102e-16] YUV: white = [229.992, 1, 9.81512e-17] */ /** \ingroup ColorConversions \defgroup PolarColors Polar Color Coordinates Transform colors from/to a polar representation (hue, brighness, saturation). In many situations, this is more inituitive than direct initialization in a particular color space. The polar coordinates are normalized so that a color angle of 0 degrees is always associated with red (green is at about 120 degrees, blue at about 240 degrees - exact values differ between color spaces). A saturation of 1 is the highest saturation that any RGB color gets after transformation into the respective color space, and saturation 0 corresponds to gray. Thus, different color spaces become somewhat comparable. */ //@{ /** \brief Init L*a*b* color triple from polar representation. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra Declarations: \code TinyVector polar2Lab(double color, double brightness, double saturation); TinyVector polar2Lab(TinyVector const & polar); \endcode \arg color - the color angle in degrees \arg brightness - between 0 and 1 \arg saturation - between 0 and 1 L*a*b* polar coordinates of some important colors: \code black = [*, 0, 0] * - arbitrary white = [*, 1, 0] * - arbitrary red = [ 0, 0.532406, 0.781353] yellow = [62.8531, 0.971395, 0.724189] green = [96.0184, 0.877351, 0.895108] cyan = [156.378, 0.911133, 0.374577] blue = [266.287, 0.322957, 0.999997] magenta = [288.237, 0.603235, 0.863482] \endcode */ inline TinyVector polar2Lab(double color, double brightness, double saturation) { double angle = (color+39.9977)/180.0*M_PI; double normsat = saturation*133.809; TinyVector result; result[0] = 100.0*brightness; result[1] = normsat*VIGRA_CSTD::cos(angle); result[2] = normsat*VIGRA_CSTD::sin(angle); return result; } template TinyVector polar2Lab(V const & polar) { return polar2Lab(polar[0], polar[1], polar[2]); } /** \brief Create polar representation form L*a*b* Declaration: \code namespace vigra { TinyVector lab2Polar(TinyVector const & lab); } \endcode \#include \<vigra/colorconversions.hxx\>
Namespace: vigra This realizes the inverse of the transformation described in \ref polar2Lab(). */ template TinyVector lab2Polar(V const & lab) { TinyVector result; result[1] = lab[0]/100.0; double angle = (lab[1] == 0.0 && lab[2] == 0.0) ? 0.0 : VIGRA_CSTD::atan2(lab[2], lab[1])/M_PI*180.0-39.9977; result[0] = angle < 0.0 ? angle + 360.0 : angle; result[2] = VIGRA_CSTD::sqrt(lab[1]*lab[1] + lab[2]*lab[2])/133.809; return result; } /** \brief Init L*u*v* color triple from polar representation. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra Declarations: \code TinyVector polar2Luv(double color, double brightness, double saturation); TinyVector polar2Luv(TinyVector const & polar); \endcode \arg color - the color angle in degrees \arg brightness - between 0 and 1 \arg saturation - between 0 and 1 L*u*v* polar coordinates of some important colors: \code black = [*, 0, 0] * - arbitrary white = [*, 1, 0] * - arbitrary red = [ 0, 0.532406, 1] yellow = [ 73.7, 0.971395, 0.597953] green = [115.552, 0.877351, 0.758352] cyan = [ 180.0, 0.911133, 0.402694] blue = [ 253.7, 0.322957, 0.729883] magenta = [295.553, 0.603235, 0.767457] \endcode */ inline TinyVector polar2Luv(double color, double brightness, double saturation) { double angle = (color+12.1727)/180.0*M_PI; double normsat = saturation*179.04; TinyVector result; result[0] = 100.0*brightness; result[1] = normsat*VIGRA_CSTD::cos(angle); result[2] = normsat*VIGRA_CSTD::sin(angle); return result; } template TinyVector polar2Luv(V const & polar) { return polar2Luv(polar[0], polar[1], polar[2]); } /** \brief Create polar representation form L*u*v* Declaration: \code namespace vigra { TinyVector luv2Polar(TinyVector const & luv); } \endcode \#include \<vigra/colorconversions.hxx\>
Namespace: vigra This realizes the inverse of the transformation described in \ref polar2Luv(). */ template TinyVector luv2Polar(V const & luv) { TinyVector result; result[1] = luv[0]/100.0; double angle = (luv[1] == 0.0 && luv[2] == 0.0) ? 0.0 : VIGRA_CSTD::atan2(luv[2], luv[1])/M_PI*180.0-12.1727; result[0] = angle < 0.0 ? angle + 360.0 : angle; result[2] = VIGRA_CSTD::sqrt(luv[1]*luv[1] + luv[2]*luv[2])/179.04; return result; } /** \brief Init Y'PbPr color triple from polar representation. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra Declarations: \code TinyVector polar2YPrimePbPr(double color, double brightness, double saturation); TinyVector polar2YPrimePbPr(TinyVector const & polar); \endcode \arg color - the color angle in degrees \arg brightness - between 0 and 1 \arg saturation - between 0 and 1 Y'PbPr polar coordinates of some important colors: \code black = [*, 0, 0] * - arbitrary white = [*, 1, 0] * - arbitrary red = [ 0, 0.299, 0.988419] yellow = [62.1151, 0.886, 0.948831] green = [123.001, 0.587, 1] cyan = [ 180.0, 0.701, 0.988419] blue = [242.115, 0.114, 0.948831] magenta = [303.001, 0.413, 1] \endcode */ inline TinyVector polar2YPrimePbPr(double color, double brightness, double saturation) { double angle = (color+18.6481)/180.0*M_PI; double normsat = saturation*0.533887; TinyVector result; result[0] = brightness; result[1] = -normsat*VIGRA_CSTD::sin(angle); result[2] = normsat*VIGRA_CSTD::cos(angle); return result; } template TinyVector polar2YPrimePbPr(V const & polar) { return polar2YPrimePbPr(polar[0], polar[1], polar[2]); } /** \brief Create polar representation form Y'PbPr Declaration: \code namespace vigra { TinyVector yPrimePbPr2Polar(TinyVector const & ypbpr); } \endcode \#include \<vigra/colorconversions.hxx\>
Namespace: vigra This realizes the inverse of the transformation described in \ref polar2YPrimePbPr(). */ template TinyVector yPrimePbPr2Polar(V const & ypbpr) { TinyVector result; result[1] = ypbpr[0]; double angle = (ypbpr[1] == 0.0 && ypbpr[2] == 0.0) ? 0.0 : VIGRA_CSTD::atan2(-ypbpr[1], ypbpr[2])/M_PI*180.0-18.6481; result[0] = angle < 0.0 ? angle + 360.0 : angle; result[2] = VIGRA_CSTD::sqrt(ypbpr[1]*ypbpr[1] + ypbpr[2]*ypbpr[2])/0.533887; return result; } /** \brief Init Y'CbCr color triple from polar representation. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra Declarations: \code TinyVector polar2YPrimeCbCr(double color, double brightness, double saturation); TinyVector polar2YPrimeCbCr(TinyVector const & polar); \endcode \arg color - the color angle in degrees \arg brightness - between 0 and 1 \arg saturation - between 0 and 1 Y'CbCr polar coordinates of some important colors: \code black = [*, 0, 0] * - arbitrary white = [*, 1, 0] * - arbitrary red = [ 0, 0.299, 0.988419] yellow = [62.1151, 0.886, 0.948831] green = [123.001, 0.587, 1] cyan = [ 180.0, 0.701, 0.988419] blue = [242.115, 0.114, 0.948831] magenta = [303.001, 0.413, 1] \endcode */ inline TinyVector polar2YPrimeCbCr(double color, double brightness, double saturation) { double angle = (color+18.6482)/180.0*M_PI; double normsat = saturation*119.591; TinyVector result; result[0] = brightness*219.0 + 16.0; result[1] = -normsat*VIGRA_CSTD::sin(angle)+128.0; result[2] = normsat*VIGRA_CSTD::cos(angle)+128.0; return result; } template TinyVector polar2YPrimeCbCr(V const & polar) { return polar2YPrimeCbCr(polar[0], polar[1], polar[2]); } /** \brief Create polar representation form Y'CbCr Declaration: \code namespace vigra { TinyVector yPrimeCbCr2Polar(TinyVector const & ycbcr); } \endcode \#include \<vigra/colorconversions.hxx\>
Namespace: vigra This realizes the inverse of the transformation described in \ref polar2YPrimeCbCr(). */ template TinyVector yPrimeCbCr2Polar(V const & ycbcr) { TinyVector result; result[1] = (ycbcr[0]-16.0)/219.0; double cb = ycbcr[1]-128.0; double cr = ycbcr[2]-128.0; double angle = (cb == 0.0 && cr == 0.0) ? 0.0 : VIGRA_CSTD::atan2(-cb, cr)/M_PI*180.0-18.6482; result[0] = angle < 0.0 ? angle + 360.0 : angle; result[2] = VIGRA_CSTD::sqrt(cb*cb + cr*cr)/119.591; return result; } /** \brief Init Y'IQ color triple from polar representation. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra Declarations: \code TinyVector polar2YPrimeIQ(double color, double brightness, double saturation); TinyVector polar2YPrimeIQ(TinyVector const & polar); \endcode \arg color - the color angle in degrees \arg brightness - between 0 and 1 \arg saturation - between 0 and 1 Y'IQ polar coordinates of some important colors: \code black = [*, 0, 0] * - arbitrary white = [*, 1, 0] * - arbitrary red = [ 0, 0.299, 1] yellow = [63.5851, 0.886, 0.707681] green = [137.231, 0.587, 0.933362] cyan = [ 180.0, 0.701, 1] blue = [243.585, 0.114, 0.707681] magenta = [317.231, 0.413, 0.933362] \endcode */ inline TinyVector polar2YPrimeIQ(double color, double brightness, double saturation) { double angle = (color-19.5807)/180.0*M_PI; double normsat = saturation*0.632582; TinyVector result; result[0] = brightness; result[1] = normsat*VIGRA_CSTD::cos(angle); result[2] = -normsat*VIGRA_CSTD::sin(angle); return result; } template TinyVector polar2YPrimeIQ(V const & polar) { return polar2YPrimeIQ(polar[0], polar[1], polar[2]); } /** \brief Create polar representation form Y'IQ Declaration: \code namespace vigra { TinyVector yPrimeIQ2Polar(TinyVector const & yiq); } \endcode \#include \<vigra/colorconversions.hxx\>
Namespace: vigra This realizes the inverse of the transformation described in \ref polar2YPrimeIQ(). */ template TinyVector yPrimeIQ2Polar(V const & yiq) { TinyVector result; result[1] = yiq[0]; double angle = (yiq[1] == 0.0 && yiq[2] == 0.0) ? 0.0 : VIGRA_CSTD::atan2(-yiq[2], yiq[1])/M_PI*180.0+19.5807; result[0] = angle < 0.0 ? angle + 360.0 : angle; result[2] = VIGRA_CSTD::sqrt(yiq[1]*yiq[1] + yiq[2]*yiq[2])/0.632582; return result; } /** \brief Init Y'UV color triple from polar representation. \#include \<vigra/colorconversions.hxx\>
Namespace: vigra Declarations: \code TinyVector polar2YPrimeUV(double color, double brightness, double saturation); TinyVector polar2YPrimeUV(TinyVector const & polar); \endcode \arg color - the color angle in degrees \arg brightness - between 0 and 1 \arg saturation - between 0 and 1 Y'UV polar coordinates of some important colors: \code black = [*, 0, 0] * - arbitrary white = [*, 1, 0] * - arbitrary red = [ 0, 0.299, 1] yellow = [63.5851, 0.886, 0.707681] green = [137.231, 0.587, 0.933362] cyan = [ 180.0, 0.701, 1] blue = [243.585, 0.114, 0.707681] magenta = [317.231, 0.413, 0.933362] \endcode */ inline TinyVector polar2YPrimeUV(double color, double brightness, double saturation) { double angle = (color+13.4569)/180.0*M_PI; double normsat = saturation*0.632324; TinyVector result; result[0] = brightness; result[1] = -normsat*VIGRA_CSTD::sin(angle); result[2] = normsat*VIGRA_CSTD::cos(angle); return result; } template TinyVector polar2YPrimeUV(V const & polar) { return polar2YPrimeUV(polar[0], polar[1], polar[2]); } /** \brief Create polar representation form Y'UV Declaration: \code namespace vigra { TinyVector yPrimeUV2Polar(TinyVector const & yuv); } \endcode \#include \<vigra/colorconversions.hxx\>
Namespace: vigra This realizes the inverse of the transformation described in \ref polar2YPrimeUV(). */ template TinyVector yPrimeUV2Polar(V const & yuv) { TinyVector result; result[1] = yuv[0]; double angle = (yuv[1] == 0.0 && yuv[2] == 0.0) ? 0.0 : VIGRA_CSTD::atan2(-yuv[1], yuv[2])/M_PI*180.0-13.4569; result[0] = angle < 0.0 ? angle + 360.0 : angle; result[2] = VIGRA_CSTD::sqrt(yuv[1]*yuv[1] + yuv[2]*yuv[2])/0.632324; return result; } //@} } // namespace vigra #endif /* VIGRA_COLORCONVERSIONS_HXX */ gamera-3.3.3/include/vigra/combineimages.hxx0000644000076500000000000006167211261456425020052 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_COMBINEIMAGES_HXX #define VIGRA_COMBINEIMAGES_HXX #include "utilities.hxx" #include "numerictraits.hxx" #include "functortraits.hxx" #include namespace vigra { /** \addtogroup CombineAlgo Algorithms to Combine Images Apply functor to calculate a pixelwise transformation depending on multiple images. Note that the binary functors of the STL may be used with these functions. */ //@{ /********************************************************/ /* */ /* combine...Lines */ /* */ /********************************************************/ template void combineTwoLines(SrcIterator1 s1, SrcIterator1 s1end, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, DestIterator d, DestAccessor dest, Functor const & f) { for(; s1 != s1end; ++s1, ++s2, ++d) dest.set(f(src1(s1), src2(s2)), d); } template void combineTwoLinesIf(SrcIterator1 s1, SrcIterator1 s1end, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, MaskIterator m, MaskAccessor mask, DestIterator d, DestAccessor dest, Functor const & f) { for(; s1 != s1end; ++s1, ++s2, ++m, ++d) if(mask(m)) dest.set(f(src1(s1), src2(s2)), d); } template void combineThreeLines(SrcIterator1 s1, SrcIterator1 s1end, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, SrcIterator3 s3, SrcAccessor3 src3, DestIterator d, DestAccessor dest, Functor const & f) { for(; s1 != s1end; ++s1, ++s2, ++s3, ++d) dest.set(f(src1(s1), src2(s2), src3(s3)), d); } /********************************************************/ /* */ /* combineTwoImages */ /* */ /********************************************************/ /** \brief Combine two source images into destination image. The transformation given by the functor is applied to the source pixels and the result written into the corresponding destination pixel. This is typically used for operations like add and subtract. The function uses accessors to access the pixel data. Note that the binary functors of the STL can be used in addition to the functors specifically defined in \ref CombineFunctor. Creation of new functors is easiest by using \ref FunctorExpressions. Declarations: pass arguments explicitly: \code namespace vigra { template void combineTwoImages(SrcImageIterator1 src1_upperleft, SrcImageIterator1 src1_lowerright, SrcAccessor1 sa1, SrcImageIterator2 src2_upperleft, SrcAccessor2 sa2, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void combineTwoImages(triple src1, pair src2, pair dest, Functor const & f) } \endcode Usage: \#include \<vigra/combineimages.hxx\>
Namespace: vigra \code #include // for plus vigra::combineTwoImages( srcIterRange(src1.upperLeft(), src1.lowerRight()), srcIter(src2.upperLeft()), destIter(dest.upperLeft()), std::plus()); \endcode Note that SrcValueType must be replaced with the appropriate type (e.g. the promote type of the input images' pixel type, see also \ref NumericPromotionTraits) Required Interface: \code SrcImageIterator1 src1_upperleft, src1_lowerright; SrcImageIterator2 src2_upperleft; DestImageIterator dest_upperleft; SrcImageIterator1::row_iterator sx1 = src1_upperleft.rowIterator(); SrcImageIterator2::row_iterator sx2 = src2_upperleft.rowIterator(); DestImageIterator::row_iterator dx = dest_upperleft.rowIterator(); SrcAccessor1 src1_accessor; SrcAccessor2 src2_accessor; DestAccessor dest_accessor; Functor functor; dest_accessor.set( functor(src1_accessor(sx1), src2_accessor(sx2)), dx); \endcode */ doxygen_overloaded_function(template <...> void combineTwoImages) template void combineTwoImages(SrcImageIterator1 src1_upperleft, SrcImageIterator1 src1_lowerright, SrcAccessor1 sa1, SrcImageIterator2 src2_upperleft, SrcAccessor2 sa2, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) { int w = src1_lowerright.x - src1_upperleft.x; for(; src1_upperleft.y < src1_lowerright.y; ++src1_upperleft.y, ++src2_upperleft.y, ++dest_upperleft.y) { combineTwoLines(src1_upperleft.rowIterator(), src1_upperleft.rowIterator() + w, sa1, src2_upperleft.rowIterator(), sa2, dest_upperleft.rowIterator(), da, f); } } template inline void combineTwoImages(triple src1, pair src2, pair dest, Functor const & f) { combineTwoImages(src1.first, src1.second, src1.third, src2.first, src2.second, dest.first, dest.second, f); } /********************************************************/ /* */ /* combineTwoImagesIf */ /* */ /********************************************************/ /** \brief Combine ROI of two source images into destination image. The transformation given by the functor is applied to all source pixels in the ROI (i.e. whenever the return value of the mask's accessor is not zero) and the result written into the corresponding destination pixel. This is typically used for operations like add and subtract. The function uses accessors to access the pixel data. Note that the binary functors of the STL can be used in addition to the functors specifically defined in \ref CombineFunctor. Creation of new functors is easiest by using \ref FunctorExpressions. Declarations: pass arguments explicitly: \code namespace vigra { template void combineTwoImagesIf(SrcImageIterator1 src1_upperleft, SrcImageIterator1 src1_lowerright, SrcAccessor1 sa1, SrcImageIterator2 src2_upperleft, SrcAccessor2 sa2, MaskImageIterator mask_upperleft, MaskAccessor ma, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void combineTwoImagesIf(triple src1, pair src2, pair mask, pair dest, Functor const & f) } \endcode Usage: \#include \<vigra/combineimages.hxx\>
Namespace: vigra \code #include // for plus vigra::combineTwoImagesIf( srcIterRange(src1.upperLeft(), src1.lowerRight()), srcIter(src2.upperLeft()), maskIter(mask.upperLeft()), destIter(dest.upperLeft()), std::plus()); \endcode Note that SrcValueType must be replaced with the appropriate type (e.g. the promote type of the input images' pixel type, see also \ref NumericPromotionTraits) Required Interface: \code SrcImageIterator1 src1_upperleft, src1_lowerright; SrcImageIterator2 src2_upperleft; MaskImageIterator mask_upperleft; DestImageIterator dest_upperleft; SrcImageIterator1::row_iterator sx1 = src1_upperleft.rowIterator(); SrcImageIterator2::row_iterator sx2 = src2_upperleft.rowIterator(); MaskImageIterator::row_iterator mx = mask_upperleft.rowIterator(); DestImageIterator::row_iterator dx = dest_upperleft.rowIterator(); SrcAccessor1 src1_accessor; SrcAccessor2 src2_accessor; MaskAccessor mask_accessor; DestAccessor dest_accessor; Functor functor; if(mask_accessor(mx)) dest_accessor.set( functor(src1_accessor(sx1), src2_accessor(sx2)), dx); \endcode */ doxygen_overloaded_function(template <...> void combineTwoImagesIf) template void combineTwoImagesIf(SrcImageIterator1 src1_upperleft, SrcImageIterator1 src1_lowerright, SrcAccessor1 sa1, SrcImageIterator2 src2_upperleft, SrcAccessor2 sa2, MaskImageIterator mask_upperleft, MaskAccessor ma, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) { int w = src1_lowerright.x - src1_upperleft.x; for(; src1_upperleft.y < src1_lowerright.y; ++src1_upperleft.y, ++src2_upperleft.y, ++dest_upperleft.y, ++mask_upperleft.y) { combineTwoLinesIf(src1_upperleft.rowIterator(), src1_upperleft.rowIterator() + w, sa1, src2_upperleft.rowIterator(), sa2, mask_upperleft.rowIterator(), ma, dest_upperleft.rowIterator(), da, f); } } template inline void combineTwoImagesIf(triple src1, pair src2, pair mask, pair dest, Functor const & f) { combineTwoImagesIf(src1.first, src1.second, src1.third, src2.first, src2.second, mask.first, mask.second, dest.first, dest.second, f); } /********************************************************/ /* */ /* combineThreeImages */ /* */ /********************************************************/ /** \brief Combine three source images into destination image. The transformation given by the functor is applied to the source pixels and the result written into the corresponding destination pixel. The function uses accessors to access the pixel data. Creation of new functors is easiest by using \ref FunctorExpressions. Declarations: pass arguments explicitly: \code namespace vigra { template void combineThreeImages(SrcImageIterator1 src1_upperleft, SrcImageIterator1 src1_lowerright, SrcAccessor1 sa1, SrcImageIterator2 src2_upperleft, SrcAccessor2 sa2, SrcImageIterator3 src2_upperleft, SrcAccessor3 sa3, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void combineThreeImages(triple src1, pair src2, pair src3, pair dest, Functor const & f) } \endcode Usage: \#include \<vigra/combineimages.hxx\>
Namespace: vigra \code vigra::combineThreeImages( srcIterRange(src1.upperLeft(), src1.lowerRight()), srcIter(src2.upperLeft()), srcIter(src3.upperLeft()), destIter(dest.upperLeft()), SomeThreeArgumentFunctor()); \endcode Required Interface: \code SrcImageIterator1 src1_upperleft, src1_lowerright; SrcImageIterator2 src2_upperleft; SrcImageIterator3 src3_upperleft; DestImageIterator dest_upperleft; SrcImageIterator1::row_iterator sx1 = src1_upperleft.rowIterator(); SrcImageIterator2::row_iterator sx2 = src2_upperleft.rowIterator(); SrcImageIterator3::row_iterator sx3 = src3_upperleft.rowIterator(); DestImageIterator::row_iterator dx = dest_upperleft.rowIterator(); SrcAccessor1 src1_accessor; SrcAccessor2 src2_accessor; SrcAccessor3 src3_accessor; DestAccessor dest_accessor; Functor functor; dest_accessor.set( functor(src1_accessor(sx1), src2_accessor(sx2), src3_accessor(sx3)), dx); \endcode */ doxygen_overloaded_function(template <...> void combineThreeImages) template void combineThreeImages(SrcImageIterator1 src1_upperleft, SrcImageIterator1 src1_lowerright, SrcAccessor1 sa1, SrcImageIterator2 src2_upperleft, SrcAccessor2 sa2, SrcImageIterator3 src3_upperleft, SrcAccessor3 sa3, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) { int w = src1_lowerright.x - src1_upperleft.x; for(; src1_upperleft.y < src1_lowerright.y; ++src1_upperleft.y, ++src2_upperleft.y, ++src3_upperleft.y, ++dest_upperleft.y) { combineThreeLines(src1_upperleft.rowIterator(), src1_upperleft.rowIterator() + w, sa1, src2_upperleft.rowIterator(), sa2, src3_upperleft.rowIterator(), sa3, dest_upperleft.rowIterator(), da, f); } } template inline void combineThreeImages(triple src1, pair src2, pair src3, pair dest, Functor const & f) { combineThreeImages(src1.first, src1.second, src1.third, src2.first, src2.second, src3.first, src3.second, dest.first, dest.second, f); } //@} /** \addtogroup CombineFunctor Functors to Combine Images Common functors with several arguments */ //@{ /********************************************************/ /* */ /* MagnitudeFunctor */ /* */ /********************************************************/ /** Calculate the magnitude from two arguments. Can be used in conjunction with \ref gradientBasedTransform(). If the gradient is represented by a vector-valued image instead of a pair of scalar images, use \ref vigra::VectorNormFunctor. Traits defined: FunctorTraits::isBinaryFunctor are true (VigraTrueType) */ template class MagnitudeFunctor { public: /** the functor's first argument type */ typedef ValueType first_argument_type; /** the functor's second argument type */ typedef ValueType second_argument_type; /** the functor's result type */ typedef typename SquareRootTraits::SquaredNormType>::SquareRootResult result_type; /** \deprecated use first_argument_type, second_argument_type, result_type */ typedef ValueType value_type; /** calculate transform 'sqrt(squaredNorm(v1) + squaredNorm(v2))'. */ result_type operator()(first_argument_type const & v1, second_argument_type const & v2) const { return VIGRA_CSTD::sqrt(squaredNorm(v1) + squaredNorm(v2)); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isBinaryFunctor; }; /********************************************************/ /* */ /* RGBGradientMagnitudeFunctor */ /* */ /********************************************************/ /** Calculate the gradient magnitude from RGB arguments. Can be used in conjunction with \ref gradientBasedTransform(). Traits defined: FunctorTraits::isBinaryFunctor are true (VigraTrueType) */ template class RGBGradientMagnitudeFunctor { public: /** the functor's first argument type */ typedef RGBValue first_argument_type; /** the functor's second argument type */ typedef RGBValue second_argument_type; /** the functor's result type */ typedef typename NumericTraits::RealPromote result_type; /** \deprecated use first_argument_type, second_argument_type, result_type */ typedef ValueType value_type; /** Calculate the gradient magnitude form given RGB components. The function returns \f[ \sqrt{|\nabla red|^2 + |\nabla green|^2 + |\nabla blue|^2} \f] where \f$|\nabla red|^2\f$ is defined by gx.red()*gx.red() + gy.red()*gy.red(). ValueType (the RGB's component type) must support addition, multiplication, abd sqrt(). */ result_type operator()(first_argument_type const & gx, second_argument_type const & gy) const { return VIGRA_CSTD::sqrt(gx.red()*gx.red() + gx.green()*gx.green() + gx.blue()*gx.blue() + gy.red()*gy.red() + gy.green()*gy.green() + gy.blue()*gy.blue()); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isBinaryFunctor; }; //@} } // namespace vigra #endif // VIGRA_COMBINEIMAGES_HXX gamera-3.3.3/include/vigra/config.hxx0000644000076500000000000001747011261456425016512 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_CONFIG_HXX #define VIGRA_CONFIG_HXX #include /////////////////////////////////////////////////////////// // // // VisualC++ 5.0 // // // /////////////////////////////////////////////////////////// #ifdef _MSC_VER #if(_MSC_VER < 1100) // before VisualC++ 5.0 #error "Need VisualC++ 5.0, Service Pack 2, or later" #endif // _MSC_VER < 1100 #pragma warning( disable : 4786 4250 4244 4305) #if (_MSC_VER < 1300) #define NO_TYPENAME // no 'typename' keyword #define TEMPLATE_COPY_CONSTRUCTOR_BUG #define NO_STL_MEMBER_TEMPLATES #define NO_INLINE_STATIC_CONST_DEFINITION #define CMATH_NOT_IN_STD #define NO_COVARIANT_RETURN_TYPES #ifdef VIGRA_NO_STD_MINMAX // activate if necessary namespace std { template const T& min(const T& x, const T& y) { return (y < x) ? y : x; } template const T& max(const T& x, const T& y) { return (x < y) ? y : x; } } #endif // VIGRA_NO_STD_MINMAX #endif // (_MSC_VER < 1300) #if _MSC_VER < 1310 #define NO_PARTIAL_TEMPLATE_SPECIALIZATION #define NO_OUT_OF_LINE_MEMBER_TEMPLATES #include #ifdef _MSC_EXTENSIONS #ifndef CMATH_NOT_IN_STD namespace std { #endif // CMATH_NOT_IN_STD inline double abs(double v) { return fabs(v); } inline float abs(float v) { return fabs(v); } #ifndef CMATH_NOT_IN_STD } #endif // CMATH_NOT_IN_STD #endif // _MSC_EXTENSIONS #endif // _MSC_VER < 1310 #if _MSC_VER < 1400 #define VIGRA_NO_WORKING_STRINGSTREAM #endif #define VIGRA_NEED_BIN_STREAMS #ifdef VIGRA_DLL #define VIGRA_EXPORT __declspec(dllexport) #elif defined(VIGRA_STATIC_LIB) #define VIGRA_EXPORT #else #define VIGRA_EXPORT __declspec(dllimport) #endif #endif // _MSC_VER /////////////////////////////////////////////////////////// // // // gcc // // // /////////////////////////////////////////////////////////// #if defined(__GNUC__) #if __GNUC__ < 2 || ((__GNUC__ == 2) && (__GNUC_MINOR__ <= 8)) #error "Need at least g++ 2.95" #endif #if __GNUC__ < 3 #define VIGRA_NO_WORKING_STRINGSTREAM #endif #define HAS_HASH_CONTAINERS #endif // __GNUC__ /////////////////////////////////////////////////////////// // // // MingW // // // /////////////////////////////////////////////////////////// #if defined(__MINGW32__) #define VIGRA_NEED_BIN_STREAMS #ifdef VIGRA_DLL #define VIGRA_EXPORT __declspec(dllexport) #elif defined(VIGRA_STATIC_LIB) #define VIGRA_EXPORT #else #define VIGRA_EXPORT __declspec(dllimport) #endif #endif // __MINGW32__ /////////////////////////////////////////////////////////// // // // SGI C++ 7.2 // // // /////////////////////////////////////////////////////////// #if defined(__sgi) && !defined(__GNUC__) #if _COMPILER_VERSION < 720 #error "Need SGI C++ 7.2 or later" #endif #if (_COMPILER_VERSION == 720) || (_COMPILER_VERSION == 721) #define SPECIAL_STDEXCEPTION_DEFINITION_NEEDED namespace vigra { typedef std::exception StdException; // must be above next #define !! } #define std #define NO_NAMESPACE_STD #endif // _COMPILER_VERSION #define HAS_HASH_CONTAINERS #endif // __sgi /////////////////////////////////////////////////////////// // // // Sun C++ ??? // // // /////////////////////////////////////////////////////////// #if defined(__sun) && !defined(__GNUC__) #define VIGRA_HAS_ERF #endif // __sun /////////////////////////////////////////////////////////// // // // general // // // /////////////////////////////////////////////////////////// #ifdef CMATH_NOT_IN_STD #define VIGRA_CSTD #else #define VIGRA_CSTD std #endif #ifdef NO_TYPENAME #define typename #endif #ifdef NO_EXPLICIT #define explicit #endif #ifndef VIGRA_EXPORT #define VIGRA_EXPORT #endif namespace vigra { #ifndef SPECIAL_STDEXCEPTION_DEFINITION_NEEDED typedef std::exception StdException; #endif } // namespace vigra #ifdef DOXYGEN # define doxygen_overloaded_function(fun) fun(...); #else # define doxygen_overloaded_function(fun) #endif #endif // VIGRA_CONFIG_HXX gamera-3.3.3/include/vigra/contourcirculator.hxx0000644000076500000000000002154511261456425021024 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_CONTOURCIRCULATOR_HXX #define VIGRA_CONTOURCIRCULATOR_HXX #include "pixelneighborhood.hxx" namespace vigra { /** \addtogroup ImageIteratorAdapters */ //@{ /********************************************************/ /* */ /* CrackContourCirculator */ /* */ /********************************************************/ /** \brief Circulator that walks around a given region. The circulator follows the crack contour of a given region. Here, a region is an 8-connected component of pixels with the same value, such as the regions in a label image. The crack contour is located between the inside and outside pixels, that is "on the crack" between the region and the background. Thus, the circulator moves from pixel corner to pixel corner. By definition, the first corner (where the circulator was initialized) gets the coordinate (0,0), and calls to *circulator return the distance of the current corner to the initial one. The circulator can be used to calculate the area of a region (in pixels): \code // start with a pixel within the region, whose left neighbor is outside // (see CrackContourCirculator constructor) ImageIterator region_anchor = ...; int area = 0; // calculate area from following the crack contour of the region CrackContourCirculator crack(region_anchor); CrackContourCirculator crackend(crack); do { area += crack.diff().x * crack.pos().y - crack.diff().y * crack.pos().x; } while(++crack != crackend); area /= 2; std::cout << "Area of region " << *region_anchor << ": " << area << std::endl; \endcode \#include \<vigra/contourcirculator.hxx\>
Namespace: vigra */ template class CrackContourCirculator { typedef NeighborhoodCirculator NEIGHBORHOODCIRCULATOR; typedef typename IMAGEITERATOR::value_type label_type; protected: NEIGHBORHOODCIRCULATOR neighborCirc_; label_type label_; Point2D pos_; CrackContourCirculator(NEIGHBORHOODCIRCULATOR const & circ) : neighborCirc_(circ), label_(*(circ.center())), pos_(0, 0) {} public: /** the circulator's value type */ typedef Point2D value_type; /** the circulator's reference type (return type of *circ) */ typedef Point2D const & reference; /** the circulator's pointer type (return type of operator->) */ typedef Point2D const * pointer; /** the circulator tag */ typedef forward_circulator_tag iterator_category; /** Initialize the circulator for a given region. The image iterator in_the_region must refer to a boundary pixel of the region to be analysed. The direction code dir must point to a pixel outside the region (the default assumes that the pixel left of the given region pixel belongs to the background). The first corner of the crack contour is the corner to the right of this direction (i.e. the north west corner of the region pixel, if the direction was West). */ CrackContourCirculator(IMAGEITERATOR const & in_the_region, vigra::FourNeighborCode::Direction dir = vigra::FourNeighborCode::West) : neighborCirc_(in_the_region, EightNeighborCode::code(dir)), label_(*in_the_region), pos_(0, 0) { neighborCirc_.turnLeft(); } /** Move to the next crack corner of the contour (pre-increment). */ CrackContourCirculator & operator++() { pos_ += neighborCirc_.diff(); neighborCirc_--; if(*neighborCirc_ == label_) { neighborCirc_.moveCenterToNeighbor(); // TODO: simplify moveCenterToNeighbor()s --neighborCirc_; } else { neighborCirc_.moveCenterToNeighbor(); // jump out neighborCirc_ += 3; if(*neighborCirc_ == label_) { neighborCirc_.moveCenterToNeighbor(); neighborCirc_.turnRight(); } else { neighborCirc_.moveCenterToNeighbor(); neighborCirc_.turnLeft(); neighborCirc_.moveCenterToNeighbor(); neighborCirc_.turnRight(); } } return *this; } /** Move to the next crack corner of the contour (post-increment). */ CrackContourCirculator operator++(int) { CrackContourCirculator ret(*this); ++(*this); return ret; } /** equality */ bool operator==(CrackContourCirculator const & o) const { return neighborCirc_ == o.neighborCirc_; } /** inequality */ bool operator!=(CrackContourCirculator const & o) const { return neighborCirc_ != o.neighborCirc_; } /** Get the coordinate of the current corner (relative to the first corner). */ reference pos() const { return pos_; } /** Equivalent to pos() */ reference operator*() const { return pos_; } /** Access member of the current coordinate. */ pointer operator->() const { return &pos_; } /** Access pixel to the right of the crack edge (outside of * the region bounded by the crack contour we walk on). Note * that after operator++, the iterator can still point to the * same pixel (looking from another direction now). */ IMAGEITERATOR outerPixel() const { return NEIGHBORHOODCIRCULATOR(neighborCirc_).turnRight().base(); } /** Get the offset from the current corner of the contour to the next one. */ Diff2D const & diff() const { return neighborCirc_.diff(); } }; //@} } // namespace vigra #endif /* VIGRA_CONTOURCIRCULATOR_HXX */ gamera-3.3.3/include/vigra/convolution.hxx0000644000076500000000000014415511261456425017625 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_CONVOLUTION_HXX #define VIGRA_CONVOLUTION_HXX #include #include "stdconvolution.hxx" #include "separableconvolution.hxx" #include "recursiveconvolution.hxx" #include "nonlineardiffusion.hxx" #include "combineimages.hxx" /** \page Convolution Functions to Convolve Images and Signals 1D and 2D filters, including separable and recursive convolution, and non-linear diffusion \#include \<vigra/convolution.hxx\>
Namespace: vigra
  • \ref CommonConvolutionFilters
       Short-hands for the most common 2D convolution filters
  • \ref MultiArrayConvolutionFilters
       Convolution filters for arbitrary dimensional arrays (MultiArray etc.)
  • \ref ResamplingConvolutionFilters
       Resampling convolution filters
  • \ref StandardConvolution
       2D non-separable convolution, with and without ROI mask
  • \ref vigra::Kernel2D
       Generic 2-dimensional discrete convolution kernel
  • \ref SeparableConvolution
       1D convolution and separable filters in 2 dimensions
  • \ref vigra::Kernel1D
       Generic 1-dimensional discrete convolution kernel
  • \ref RecursiveConvolution
       Recursive filters (1st and 2nd order)
  • \ref NonLinearDiffusion
       Edge-preserving smoothing
  • \ref BorderTreatmentMode
       Choose between different border treatment modes
  • \ref KernelArgumentObjectFactories
       Factory functions to create argument objects to simplify passing kernels
*/ /** \page KernelArgumentObjectFactories Kernel Argument Object Factories These factory functions allow to create argument objects for 1D and 2D convolution kernel analogously to \ref ArgumentObjectFactories for images. \section Kernel1dFactory kernel1d() Pass a \ref vigra::Kernel1D to a 1D or separable convolution algorithm. These factories can be used to create argument objects when we are given instances or subclasses of \ref vigra::Kernel1D (analogous to the \ref ArgumentObjectFactories for images). These factory functions access kernel.center(), kernel.left(), kernel.right(), kernel.accessor(), and kernel.borderTreatment() to obtain the necessary information. The following factory functions are provided:
\ref vigra::Kernel1D "vigra::Kernel1D" kernel;
kernel1d(kernel) create argument object from information provided by kernel
kernel1d(kernel, vigra::BORDER_TREATMENT_CLIP) create argument object from information provided by kernel, but use given border treatment mode
kernel1d(kerneliterator, kernelaccessor,
kernelleft, kernelright,
vigra::BORDER_TREATMENT_CLIP)
create argument object from explicitly given iterator (pointing to the center of th kernel), accessor, left and right boundaries, and border treatment mode
For usage examples see \ref SeparableConvolution "one-dimensional and separable convolution functions". \section Kernel2dFactory kernel2d() Pass a \ref vigra::Kernel2D to a 2D (non-separable) convolution algorithm. These factories can be used to create argument objects when we are given instances or subclasses of \ref vigra::Kernel2D (analogous to the \ref ArgumentObjectFactories for images). These factory functions access kernel.center(), kernel.upperLeft(), kernel.lowerRight(), kernel.accessor(), and kernel.borderTreatment() to obtain the necessary information. The following factory functions are provided:
\ref vigra::Kernel2D "vigra::Kernel2D" kernel;
kernel2d(kernel) create argument object from information provided by kernel
kernel2d(kernel, vigra::BORDER_TREATMENT_CLIP) create argument object from information provided by kernel, but use given border treatment mode
kernel2d(kerneliterator, kernelaccessor, upperleft, lowerright, vigra::BORDER_TREATMENT_CLIP) create argument object from explicitly given iterator (pointing to the center of th kernel), accessor, upper left and lower right corners, and border treatment mode
For usage examples see \ref StandardConvolution "two-dimensional convolution functions". */ namespace vigra { /********************************************************/ /* */ /* Common convolution filters */ /* */ /********************************************************/ /** \addtogroup CommonConvolutionFilters Common Filters These functions calculate common filters by appropriate sequences of calls to \ref separableConvolveX() and \ref separableConvolveY(). */ //@{ /********************************************************/ /* */ /* convolveImage */ /* */ /********************************************************/ /** \brief Apply two separable filters successively, the first in x-direction, the second in y-direction. This function is a shorthand for the concatenation of a call to \ref separableConvolveX() and \ref separableConvolveY() with the given kernels. Declarations: pass arguments explicitly: \code namespace vigra { template void convolveImage(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, Kernel1D const & kx, Kernel1D const & ky); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void convolveImage(triple src, pair dest, Kernel1D const & kx, Kernel1D const & ky); } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), dest(w,h); ... // implement sobel filter in x-direction Kernel1D kx, ky; kx.initSymmetricGradient(); ky.initBinomial(1); vigra::convolveImage(srcImageRange(src), destImage(dest), kx, ky); \endcode */ template void convolveImage(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, Kernel1D const & kx, Kernel1D const & ky) { typedef typename NumericTraits::RealPromote TmpType; BasicImage tmp(slowerright - supperleft); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(kx)); separableConvolveY(srcImageRange(tmp), destIter(dupperleft, da), kernel1d(ky)); } template inline void convolveImage(triple src, pair dest, Kernel1D const & kx, Kernel1D const & ky) { convolveImage(src.first, src.second, src.third, dest.first, dest.second, kx, ky); } /********************************************************/ /* */ /* simpleSharpening */ /* */ /********************************************************/ /** \brief Perform simple sharpening function. This function use \ref convolveImage() with following filter: \code -sharpening_factor/16.0, -sharpening_factor/8.0, -sharpening_factor/16.0, -sharpening_factor/8.0, 1.0+sharpening_factor*0.75, -sharpening_factor/8.0, -sharpening_factor/16.0, -sharpening_factor/8.0, -sharpening_factor/16.0; \endcode and use BORDER_TREATMENT_REFLECT as border treatment mode. Preconditions: \code 1. sharpening_factor >= 0 2. scale >= 0 \endcode Declarations: Declarations: pass arguments explicitly: \code namespace vigra { template void simpleSharpening(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, DestIterator dest_ul, DestAccessor dest_acc, double sharpening_factor) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void simpleSharpening(triple src, pair dest, double sharpening_factor) { simpleSharpening(src.first, src.second, src.third, dest.first, dest.second, sharpening_factor); } } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), dest(w,h); ... // sharpening with sharpening_factor = 0.1 vigra::simpleSharpening(srcImageRange(src), destImage(dest), 0.1); \endcode */ doxygen_overloaded_function(template <...> void simpleSharpening) template void simpleSharpening(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, DestIterator dest_ul, DestAccessor dest_acc, double sharpening_factor) { vigra_precondition(sharpening_factor >= 0.0, "simpleSharpening(): amount of sharpening must be >= 0."); Kernel2D kernel; kernel.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = -sharpening_factor/16.0, -sharpening_factor/8.0, -sharpening_factor/16.0, -sharpening_factor/8.0, 1.0+sharpening_factor*0.75, -sharpening_factor/8.0, -sharpening_factor/16.0, -sharpening_factor/8.0, -sharpening_factor/16.0; convolveImage(src_ul, src_lr, src_acc, dest_ul, dest_acc, kernel.center(), kernel.accessor(), kernel.upperLeft(), kernel.lowerRight() , BORDER_TREATMENT_REFLECT ); } template inline void simpleSharpening(triple src, pair dest, double sharpening_factor) { simpleSharpening(src.first, src.second, src.third, dest.first, dest.second, sharpening_factor); } /********************************************************/ /* */ /* gaussianSharpening */ /* */ /********************************************************/ /** \brief Perform sharpening function with gaussian filter. This function use the \ref gaussianSmoothing() at first and scale the source image (\code src \endcode) with the \code scale \endcode factor in an temporary image (\code tmp \endcode). At second the new pixel in the destination image will be with following formel calculate: \code dest = (1 + sharpening_factor)*src - sharpening_factor*tmp \endcode Preconditions: \code 1. sharpening_factor >= 0 2. scale >= 0 \endcode Declarations: pass arguments explicitly: \code namespace vigra { template void gaussianSharpening(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, DestIterator dest_ul, DestAccessor dest_acc, double sharpening_factor, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void gaussianSharpening(triple src, pair dest, double sharpening_factor, double scale) } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), dest(w,h); ... // sharpening with sharpening_factor = 3.0 // smoothing with scale = 0.5 vigra::gaussianSmoothing(srcImageRange(src), destImage(dest), 3.0, 0.5); \endcode */ doxygen_overloaded_function(template <...> void gaussianSharpening) template void gaussianSharpening(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, DestIterator dest_ul, DestAccessor dest_acc, double sharpening_factor, double scale) { vigra_precondition(sharpening_factor >= 0.0, "gaussianSharpening(): amount of sharpening must be >= 0"); vigra_precondition(scale >= 0.0, "gaussianSharpening(): scale parameter should be >= 0."); typedef typename NumericTraits::RealPromote ValueType; BasicImage tmp(src_lr - src_ul); gaussianSmoothing(src_ul, src_lr, src_acc, tmp.upperLeft(), tmp.accessor(), scale); SrcIterator i_src = src_ul; DestIterator i_dest = dest_ul; typename BasicImage::traverser tmp_ul = tmp.upperLeft(); typename BasicImage::traverser i_tmp = tmp_ul; typename BasicImage::Accessor tmp_acc = tmp.accessor(); for(; i_src.y != src_lr.y ; i_src.y++, i_dest.y++, i_tmp.y++ ) { for (;i_src.x != src_lr.x ; i_src.x++, i_dest.x++, i_tmp.x++ ) { dest_acc.set((1.0 + sharpening_factor)*src_acc(i_src) - sharpening_factor*tmp_acc(i_tmp), i_dest); } i_src.x = src_ul.x; i_dest.x = dest_ul.x; i_tmp.x = tmp_ul.x; } } template void gaussianSharpening(triple src, pair dest, double sharpening_factor, double scale) { gaussianSharpening(src.first, src.second, src.third, dest.first, dest.second, sharpening_factor, scale); } /********************************************************/ /* */ /* gaussianSmoothing */ /* */ /********************************************************/ /** \brief Perform isotropic Gaussian convolution. This function is a shorthand for the concatenation of a call to \ref separableConvolveX() and \ref separableConvolveY() with a Gaussian kernel of the given scale. The function uses BORDER_TREATMENT_REFLECT. Declarations: pass arguments explicitly: \code namespace vigra { template void gaussianSmoothing(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void gaussianSmoothing(triple src, pair dest, double scale); } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), dest(w,h); ... // smooth with scale = 3.0 vigra::gaussianSmoothing(srcImageRange(src), destImage(dest), 3.0); \endcode */ doxygen_overloaded_function(template <...> void gaussianSmoothing) template void gaussianSmoothing(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, double scale) { typedef typename NumericTraits::RealPromote TmpType; BasicImage tmp(slowerright - supperleft); Kernel1D smooth; smooth.initGaussian(scale); smooth.setBorderTreatment(BORDER_TREATMENT_REFLECT); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(smooth)); separableConvolveY(srcImageRange(tmp), destIter(dupperleft, da), kernel1d(smooth)); } template inline void gaussianSmoothing(triple src, pair dest, double scale) { gaussianSmoothing(src.first, src.second, src.third, dest.first, dest.second, scale); } /********************************************************/ /* */ /* gaussianGradient */ /* */ /********************************************************/ /** \brief Calculate the gradient vector by means of a 1st derivatives of Gaussian filter. This function is a shorthand for the concatenation of a call to \ref separableConvolveX() and \ref separableConvolveY() with the appropriate kernels at the given scale. Note that this function can either produce two separate result images for the x- and y-components of the gradient, or write into a vector valued image (with at least two components). Declarations: pass arguments explicitly: \code namespace vigra { // write x and y component of the gradient into separate images template void gaussianGradient(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIteratorX dupperleftx, DestAccessorX dax, DestIteratorY dupperlefty, DestAccessorY day, double scale); // write x and y component of the gradient into a vector-valued image template void gaussianGradient(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { // write x and y component of the gradient into separate images template void gaussianGradient(triple src, pair destx, pair desty, double scale); // write x and y component of the gradient into a vector-valued image template void gaussianGradient(triple src, pair dest, double scale); } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), gradx(w,h), grady(w,h); ... // calculate gradient vector at scale = 3.0 vigra::gaussianGradient(srcImageRange(src), destImage(gradx), destImage(grady), 3.0); \endcode */ doxygen_overloaded_function(template <...> void gaussianGradient) template void gaussianGradient(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIteratorX dupperleftx, DestAccessorX dax, DestIteratorY dupperlefty, DestAccessorY day, double scale) { typedef typename NumericTraits::RealPromote TmpType; BasicImage tmp(slowerright - supperleft); Kernel1D smooth, grad; smooth.initGaussian(scale); grad.initGaussianDerivative(scale, 1); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(grad)); separableConvolveY(srcImageRange(tmp), destIter(dupperleftx, dax), kernel1d(smooth)); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(smooth)); separableConvolveY(srcImageRange(tmp), destIter(dupperlefty, day), kernel1d(grad)); } template void gaussianGradient(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale) { VectorElementAccessor gradx(0, dest), grady(1, dest); gaussianGradient(supperleft, slowerright, src, dupperleft, gradx, dupperleft, grady, scale); } template inline void gaussianGradient(triple src, pair destx, pair desty, double scale) { gaussianGradient(src.first, src.second, src.third, destx.first, destx.second, desty.first, desty.second, scale); } template inline void gaussianGradient(triple src, pair dest, double scale) { gaussianGradient(src.first, src.second, src.third, dest.first, dest.second, scale); } /** \brief Calculate the gradient magnitude by means of a 1st derivatives of Gaussian filter. This function calls gaussianGradient() and returns the pixel-wise magnitude of the resulting gradient vectors. If the original image has multiple bands, the squared gradient magnitude is computed for each band separately, and the return value is the square root of the sum of these sqaured magnitudes. Declarations: pass arguments explicitly: \code namespace vigra { template void gaussianGradientMagnitude(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void gaussianGradientMagnitude(triple src, pair dest, double scale); } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), grad(w,h); ... // calculate gradient magnitude at scale = 3.0 vigra::gaussianGradientMagnitude(srcImageRange(src), destImage(grad), 3.0); \endcode */ doxygen_overloaded_function(template <...> void gaussianGradientMagnitude) template void gaussianGradientMagnitude(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double scale) { typedef typename NumericTraits::RealPromote TmpType; BasicImage gradx(slr-sul), grady(slr-sul); gaussianGradient(srcIterRange(sul, slr, src), destImage(gradx), destImage(grady), scale); combineTwoImages(srcImageRange(gradx), srcImage(grady), destIter(dupperleft, dest), MagnitudeFunctor()); } template inline void gaussianGradientMagnitude(triple src, pair dest, double scale) { gaussianGradientMagnitude(src.first, src.second, src.third, dest.first, dest.second, scale); } /********************************************************/ /* */ /* laplacianOfGaussian */ /* */ /********************************************************/ /** \brief Filter image with the Laplacian of Gaussian operator at the given scale. This function calls \ref separableConvolveX() and \ref separableConvolveY() with the appropriate 2nd derivative of Gaussian kernels in x- and y-direction and then sums the results to get the Laplacian. Declarations: pass arguments explicitly: \code namespace vigra { template void laplacianOfGaussian(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void laplacianOfGaussian(triple src, pair dest, double scale); } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), dest(w,h); ... // calculate Laplacian of Gaussian at scale = 3.0 vigra::laplacianOfGaussian(srcImageRange(src), destImage(dest), 3.0); \endcode */ doxygen_overloaded_function(template <...> void laplacianOfGaussian) template void laplacianOfGaussian(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, double scale) { typedef typename NumericTraits::RealPromote TmpType; BasicImage tmp(slowerright - supperleft), tmpx(slowerright - supperleft), tmpy(slowerright - supperleft); Kernel1D smooth, deriv; smooth.initGaussian(scale); deriv.initGaussianDerivative(scale, 2); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(deriv)); separableConvolveY(srcImageRange(tmp), destImage(tmpx), kernel1d(smooth)); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(smooth)); separableConvolveY(srcImageRange(tmp), destImage(tmpy), kernel1d(deriv)); combineTwoImages(srcImageRange(tmpx), srcImage(tmpy), destIter(dupperleft, da), std::plus()); } template inline void laplacianOfGaussian(triple src, pair dest, double scale) { laplacianOfGaussian(src.first, src.second, src.third, dest.first, dest.second, scale); } /********************************************************/ /* */ /* hessianMatrixOfGaussian */ /* */ /********************************************************/ /** \brief Filter image with the 2nd derivatives of the Gaussian at the given scale to get the Hessian matrix. The Hessian matrix is a symmetric matrix defined as: \f[ \mbox{\rm Hessian}(I) = \left( \begin{array}{cc} G_{xx} \ast I & G_{xy} \ast I \\ G_{xy} \ast I & G_{yy} \ast I \end{array} \right) \f] where \f$G_{xx}, G_{xy}, G_{yy}\f$ denote 2nd derivatives of Gaussians at the given scale, and \f$\ast\f$ is the convolution symbol. This function calls \ref separableConvolveX() and \ref separableConvolveY() with the appropriate 2nd derivative of Gaussian kernels and puts the results in the three destination images. The first destination image will contain the second derivative in x-direction, the second one the mixed derivative, and the third one holds the derivative in y-direction. Declarations: pass arguments explicitly: \code namespace vigra { template void hessianMatrixOfGaussian(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIteratorX dupperleftx, DestAccessorX dax, DestIteratorXY dupperleftxy, DestAccessorXY daxy, DestIteratorY dupperlefty, DestAccessorY day, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void hessianMatrixOfGaussian(triple src, pair destx, pair destxy, pair desty, double scale); } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), hxx(w,h), hxy(w,h), hyy(w,h); ... // calculate Hessian of Gaussian at scale = 3.0 vigra::hessianMatrixOfGaussian(srcImageRange(src), destImage(hxx), destImage(hxy), destImage(hyy), 3.0); \endcode */ doxygen_overloaded_function(template <...> void hessianMatrixOfGaussian) template void hessianMatrixOfGaussian(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIteratorX dupperleftx, DestAccessorX dax, DestIteratorXY dupperleftxy, DestAccessorXY daxy, DestIteratorY dupperlefty, DestAccessorY day, double scale) { typedef typename NumericTraits::RealPromote TmpType; BasicImage tmp(slowerright - supperleft); Kernel1D smooth, deriv1, deriv2; smooth.initGaussian(scale); deriv1.initGaussianDerivative(scale, 1); deriv2.initGaussianDerivative(scale, 2); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(deriv2)); separableConvolveY(srcImageRange(tmp), destIter(dupperleftx, dax), kernel1d(smooth)); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(smooth)); separableConvolveY(srcImageRange(tmp), destIter(dupperlefty, day), kernel1d(deriv2)); separableConvolveX(srcIterRange(supperleft, slowerright, sa), destImage(tmp), kernel1d(deriv1)); separableConvolveY(srcImageRange(tmp), destIter(dupperleftxy, daxy), kernel1d(deriv1)); } template inline void hessianMatrixOfGaussian(triple src, pair destx, pair destxy, pair desty, double scale) { hessianMatrixOfGaussian(src.first, src.second, src.third, destx.first, destx.second, destxy.first, destxy.second, desty.first, desty.second, scale); } /********************************************************/ /* */ /* structureTensor */ /* */ /********************************************************/ /** \brief Calculate the Structure Tensor for each pixel of and image, using Gaussian (derivative) filters. The Structure Tensor is is a smoothed version of the Euclidean product of the gradient vector with itself. I.e. it's a symmetric matrix defined as: \f[ \mbox{\rm StructurTensor}(I) = \left( \begin{array}{cc} G \ast (I_x I_x) & G \ast (I_x I_y) \\ G \ast (I_x I_y) & G \ast (I_y I_y) \end{array} \right) = \left( \begin{array}{cc} A & C \\ C & B \end{array} \right) \f] where \f$G\f$ denotes Gaussian smoothing at the outer scale, \f$I_x, I_y\f$ are the gradient components taken at the inner scale, \f$\ast\f$ is the convolution symbol, and \f$I_x I_x\f$ etc. are pixelwise products of the 1st derivative images. This function calls \ref separableConvolveX() and \ref separableConvolveY() with the appropriate Gaussian kernels and puts the results in the three separate destination images (where the first one will contain \f$G \ast (I_x I_x)\f$, the second one \f$G \ast (I_x I_y)\f$, and the third one holds \f$G \ast (I_y I_y)\f$), or into a single 3-band image (where the bands hold the result in the same order as above). The latter form is also applicable when the source image is a multi-band image (e.g. RGB). In this case, tensors are first computed for each band separately, and then summed up to get a single result tensor. Declarations: pass arguments explicitly: \code namespace vigra { // create three separate destination images template void structureTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIteratorX dupperleftx, DestAccessorX dax, DestIteratorXY dupperleftxy, DestAccessorXY daxy, DestIteratorY dupperlefty, DestAccessorY day, double inner_scale, double outer_scale); // create a single 3-band destination image template void structureTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, double inner_scale, double outer_scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { // create three separate destination images template void structureTensor(triple src, pair destx, pair destxy, pair desty, double nner_scale, double outer_scale); // create a single 3-band destination image template void structureTensor(triple src, pair dest, double nner_scale, double outer_scale); } \endcode Usage: \#include \<vigra/convolution.hxx\> \code vigra::FImage src(w,h), stxx(w,h), stxy(w,h), styy(w,h); vigra::BasicImage > st(w,h); ... // calculate Structure Tensor at inner scale = 1.0 and outer scale = 3.0 vigra::structureTensor(srcImageRange(src), destImage(stxx), destImage(stxy), destImage(styy), 1.0, 3.0); // dto. with a single 3-band destination image vigra::structureTensor(srcImageRange(src), destImage(st), 1.0, 3.0); \endcode */ doxygen_overloaded_function(template <...> void structureTensor) template void structureTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIteratorX dupperleftx, DestAccessorX dax, DestIteratorXY dupperleftxy, DestAccessorXY daxy, DestIteratorY dupperlefty, DestAccessorY day, double inner_scale, double outer_scale) { typedef typename NumericTraits::RealPromote TmpType; BasicImage tmp(slowerright - supperleft), tmpx(slowerright - supperleft), tmpy(slowerright - supperleft); gaussianGradient(srcIterRange(supperleft, slowerright, sa), destImage(tmpx), destImage(tmpy), inner_scale); combineTwoImages(srcImageRange(tmpx), srcImage(tmpx), destImage(tmp), std::multiplies()); gaussianSmoothing(srcImageRange(tmp), destIter(dupperleftx, dax), outer_scale); combineTwoImages(srcImageRange(tmpy), srcImage(tmpy), destImage(tmp), std::multiplies()); gaussianSmoothing(srcImageRange(tmp), destIter(dupperlefty, day), outer_scale); combineTwoImages(srcImageRange(tmpx), srcImage(tmpy), destImage(tmp), std::multiplies()); gaussianSmoothing(srcImageRange(tmp), destIter(dupperleftxy, daxy), outer_scale); } template inline void structureTensor(triple src, pair destx, pair destxy, pair desty, double inner_scale, double outer_scale) { structureTensor(src.first, src.second, src.third, destx.first, destx.second, destxy.first, destxy.second, desty.first, desty.second, inner_scale, outer_scale); } namespace detail { template void structureTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double inner_scale, double outer_scale, VigraTrueType /* isScalar */) { typedef VectorElementAccessor DA; structureTensor(supperleft, slowerright, src, dupperleft, DA(0, dest), dupperleft, DA(1, dest), dupperleft, DA(2, dest), inner_scale, outer_scale); } template void structureTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double inner_scale, double outer_scale, VigraFalseType /* isScalar */) { int bands = src.size(supperleft); typedef VectorElementAccessor SA; structureTensor(supperleft, slowerright, SA(0, src), dupperleft, dest, inner_scale, outer_scale, VigraTrueType() /* isScalar */); BasicImage st(slowerright - supperleft); for(int k=1; k < bands; ++k) { structureTensor(supperleft, slowerright, SA(k, src), st.upperLeft(), st.accessor(), inner_scale, outer_scale, VigraTrueType() /* isScalar */); combineTwoImages(srcImageRange(st), srcIter(dupperleft, dest), destIter(dupperleft, dest), std::plus()); } } } // namespace detail template void structureTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, double inner_scale, double outer_scale) { typedef typename NumericTraits::isScalar isScalar; detail::structureTensor(supperleft, slowerright, src, dupperleft, dest, inner_scale, outer_scale, isScalar()); } template inline void structureTensor(triple src, pair dest, double inner_scale, double outer_scale) { structureTensor(src.first, src.second, src.third, dest.first, dest.second, inner_scale, outer_scale); } //@} } // namespace vigra #endif // VIGRA_CONVOLUTION_HXX gamera-3.3.3/include/vigra/copyimage.hxx0000644000076500000000000002473611261456425017225 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_COPYIMAGE_HXX #define VIGRA_COPYIMAGE_HXX #include "utilities.hxx" namespace vigra { /** \addtogroup CopyAlgo Algorithms to Copy Images Copy images or regions */ //@{ /********************************************************/ /* */ /* copyLine */ /* */ /********************************************************/ template void copyLine(SrcIterator s, SrcIterator send, SrcAccessor src, DestIterator d, DestAccessor dest) { for(; s != send; ++s, ++d) dest.set(src(s), d); } template void copyLineIf(SrcIterator s, SrcIterator send, SrcAccessor src, MaskIterator m, MaskAccessor mask, DestIterator d, DestAccessor dest) { for(; s != send; ++s, ++d, ++m) if(mask(m)) dest.set(src(s), d); } /********************************************************/ /* */ /* copyImage */ /* */ /********************************************************/ /** \brief Copy source image into destination image. If necessary, type conversion takes place. The function uses accessors to access the pixel data. Declarations: pass arguments explicitly: \code namespace vigra { template void copyImage(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void copyImage(triple src, pair dest) } \endcode Usage: \#include \<vigra/copyimage.hxx\>
Namespace: vigra \code vigra::copyImage(srcImageRange(src), destImage(dest)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcImageIterator::row_iterator sx = src_upperleft.rowIterator(); DestImageIterator::row_iterator dx = dest_upperleft.rowIterator(); SrcAccessor src_accessor; DestAccessor dest_accessor; dest_accessor.set(src_accessor(sx), dx); \endcode */ doxygen_overloaded_function(template <...> void copyImage) template void copyImage(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da) { int w = src_lowerright.x - src_upperleft.x; for(; src_upperleft.y inline void copyImage(triple src, pair dest) { copyImage(src.first, src.second, src.third, dest.first, dest.second); } /********************************************************/ /* */ /* copyImageIf */ /* */ /********************************************************/ /** \brief Copy source ROI into destination image. Pixel values are copied whenever the return value of the mask's accessor is not zero. If necessary, type conversion takes place. The function uses accessors to access the pixel data. Declarations: pass arguments explicitly: \code namespace vigra { template void copyImageIf(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, MaskImageIterator mask_upperleft, MaskAccessor ma, DestImageIterator dest_upperleft, DestAccessor da) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void copyImageIf(triple src, pair mask, pair dest) } \endcode Usage: \#include \<vigra/copyimage.hxx\>
Namespace: vigra \code vigra::copyImageIf(srcImageRange(src), maskImage(mask), destImage(dest)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; MaskImageIterator mask_upperleft; SrcImageIterator::row_iterator sx = src_upperleft.rowIterator(); MaskImageIterator::row_iterator mx = mask_upperleft.rowIterator(); DestImageIterator::row_iterator dx = dest_upperleft.rowIterator(); SrcAccessor src_accessor; DestAccessor dest_accessor; MaskAccessor mask_accessor; Functor functor; if(mask_accessor(mx)) dest_accessor.set(src_accessor(sx), dx); \endcode */ doxygen_overloaded_function(template <...> void copyImageIf) template void copyImageIf(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, MaskImageIterator mask_upperleft, MaskAccessor ma, DestImageIterator dest_upperleft, DestAccessor da) { int w = src_lowerright.x - src_upperleft.x; for(; src_upperleft.y inline void copyImageIf(triple src, pair mask, pair dest) { copyImageIf(src.first, src.second, src.third, mask.first, mask.second, dest.first, dest.second); } //@} } // namespace vigra #endif // VIGRA_COPYIMAGE_HXX gamera-3.3.3/include/vigra/cornerdetection.hxx0000644000076500000000000006201111261456425020423 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_CORNERDETECTION_HXX #define VIGRA_CORNERDETECTION_HXX #include "utilities.hxx" #include "numerictraits.hxx" #include "stdimage.hxx" #include "combineimages.hxx" #include "convolution.hxx" #include "functortraits.hxx" namespace vigra { template struct CornerResponseFunctor { typedef typename NumericTraits::RealPromote argument_type; typedef argument_type result_type; result_type operator()(argument_type a1, argument_type a2, argument_type a3) const { return (a1*a2 - a3*a3) - 0.04 * (a1 + a2) * (a1 + a2); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isTernaryFunctor; }; template struct FoerstnerCornerFunctor { typedef typename NumericTraits::RealPromote argument_type; typedef argument_type result_type; result_type operator()(argument_type a1, argument_type a2, argument_type a3) const { return (a1*a2 - a3*a3) / (a1 + a2); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isTernaryFunctor; }; template struct RohrCornerFunctor { typedef typename NumericTraits::RealPromote argument_type; typedef argument_type result_type; result_type operator()(argument_type a1, argument_type a2, argument_type a3) const { return (a1*a2 - a3*a3); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isTernaryFunctor; }; template struct BeaudetCornerFunctor { typedef typename NumericTraits::RealPromote argument_type; typedef argument_type result_type; result_type operator()(argument_type a1, argument_type a2, argument_type a3) const { return (a3*a3 - a1*a2); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isTernaryFunctor; }; /** \addtogroup CornerDetection Corner Detection Measure the 'cornerness' at each pixel. Note: The Kitchen-Rosenfeld detector is not implemented because of its inferior performance. The SUSAN detector is missing because it's patented. */ //@{ /********************************************************/ /* */ /* cornerResponseFunction */ /* */ /********************************************************/ /** \brief Find corners in an image (1). This algorithm implements the so called 'corner response function' to measure the 'cornerness' of each pixel in the image, according to [C.G. Harris and M.J. Stevens: "A Combined Corner and Edge Detector", Proc. of 4th Alvey Vision Conference, 1988]. Several studies have found this to be a very robust corner detector, although it moves the corners somewhat into one region, depending on the scale. The algorithm first determines the structure tensor at each pixel by calling \ref structureTensor(). Then the entries of the structure tensor are combined as \f[ \mbox{\rm CornerResponse} = \mbox{\rm det(StructureTensor)} - 0.04 \mbox{\rm tr(StructureTensor)}^2 = A B - C^2 - 0.04 (A + B)^2 \f] The local maxima of the corner response denote the corners in the gray level image. The source value type must be a linaer algebra, i.e. addition, subtraction, and multiplication with itself, multiplication with doubles and \ref NumericTraits "NumericTraits" must be defined. Declarations: pass arguments explicitly: \code namespace vigra { template void cornerResponseFunction(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void cornerResponseFunction( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/cornerdetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), corners(w,h); vigra::FImage corner_response(w,h); // empty corner image corners.init(0.0); ... // find corner response at scale 1.0 vigra::cornerResponseFunction(srcImageRange(src), destImage(corner_response), 1.0); // find local maxima of corner response, mark with 1 vigra::localMaxima(srcImageRange(corner_response), destImage(corners)); // threshold corner response to keep only strong corners (above 400.0) transformImage(srcImageRange(corner_response), destImage(corner_response), vigra::Threshold( 400.0, std::numeric_limits::max(), 0.0, 1.0)); // combine thresholding and local maxima vigra::combineTwoImages(srcImageRange(corners), srcImage(corner_response), destImage(corners), std::multiplies()); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); double d; u = u + u u = u - u u = u * u u = d * u dest_accessor.set(u, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void cornerResponseFunction) template void cornerResponseFunction(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) { vigra_precondition(scale > 0.0, "cornerResponseFunction(): Scale must be > 0"); int w = slr.x - sul.x; int h = slr.y - sul.y; if(w <= 0 || h <= 0) return; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; TmpImage gx(w,h); TmpImage gy(w,h); TmpImage gxy(w,h); structureTensor(srcIterRange(sul, slr, as), destImage(gx), destImage(gxy), destImage(gy), scale, scale); CornerResponseFunctor cf; combineThreeImages(srcImageRange(gx), srcImage(gy), srcImage(gxy), destIter(dul, ad), cf ); } template inline void cornerResponseFunction( triple src, pair dest, double scale) { cornerResponseFunction(src.first, src.second, src.third, dest.first, dest.second, scale); } /********************************************************/ /* */ /* foerstnerCornerDetector */ /* */ /********************************************************/ /** \brief Find corners in an image (2). This algorithm implements the so called 'Foerstner Corner Detector' to measure the 'cornerness' of each pixel in the image, according to [W. Förstner: "A feature based correspondence algorithms for image matching", Intl. Arch. Photogrammetry and Remote Sensing, vol. 24, pp 160-166, 1986]. It is also known as the "Plessey Detector" by Harris. However, it should not be confused with the "\link cornerResponseFunction Corner Response Function\endlink ", another detector invented by Harris. The algorithm first determines the structure tensor at each pixel by calling \ref structureTensor(). Then the entries of the structure tensor are combined as \f[ \mbox{\rm FoerstnerCornerStrength} = \frac{\mbox{\rm det(StructureTensor)}}{\mbox{\rm tr(StructureTensor)}} = \frac{A B - C^2}{A + B} \f] The local maxima of the corner strength denote the corners in the gray level image. Its performance is similar to the \ref cornerResponseFunction(). The source value type must be a division algebra, i.e. addition, subtraction, multiplication, and division with itself, multiplication with doubles and \ref NumericTraits "NumericTraits" must be defined. Declarations: pass arguments explicitly: \code namespace vigra { template void foerstnerCornerDetector(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void foerstnerCornerDetector( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/cornerdetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), corners(w,h); vigra::FImage foerstner_corner_strength(w,h); // empty corner image corners.init(0.0); ... // find corner response at scale 1.0 vigra::foerstnerCornerDetector(srcImageRange(src), destImage(foerstner_corner_strength), 1.0); // find local maxima of corner response, mark with 1 vigra::localMaxima(srcImageRange(foerstner_corner_strength), destImage(corners)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); double d; u = u + u u = u - u u = u * u u = u / u u = d * u dest_accessor.set(u, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void foerstnerCornerDetector) template void foerstnerCornerDetector(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) { vigra_precondition(scale > 0.0, "foerstnerCornerDetector(): Scale must be > 0"); int w = slr.x - sul.x; int h = slr.y - sul.y; if(w <= 0 || h <= 0) return; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; TmpImage gx(w,h); TmpImage gy(w,h); TmpImage gxy(w,h); structureTensor(srcIterRange(sul, slr, as), destImage(gx), destImage(gxy), destImage(gy), scale, scale); FoerstnerCornerFunctor cf; combineThreeImages(srcImageRange(gx), srcImage(gy), srcImage(gxy), destIter(dul, ad), cf ); } template inline void foerstnerCornerDetector( triple src, pair dest, double scale) { foerstnerCornerDetector(src.first, src.second, src.third, dest.first, dest.second, scale); } /********************************************************/ /* */ /* rohrCornerDetector */ /* */ /********************************************************/ /** \brief Find corners in an image (3). This algorithm implements yet another structure tensor-based corner detector, according to [K. Rohr: "Untersuchung von grauwertabhängigen Transformationen zur Ermittlung der optischen Flusses in Bildfolgen", Diploma thesis, Inst. für Nachrichtensysteme, Univ. Karlsruhe, 1987, see also K. Rohr: "Modelling and Identification of Characteristic Intensity Variations", Image and Vision Computing 10:2 (1992) 66-76 and K. Rohr: "Localization Properties of Direct Corner Detectors", J. of Mathematical Imaging and Vision 4:2 (1994) 139-150]. The algorithm first determines the structure tensor at each pixel by calling \ref structureTensor(). Then the entries of the structure tensor are combined as \f[ \mbox{\rm RohrCornerStrength} = \mbox{\rm det(StructureTensor)} = A B - C^2 \f] The local maxima of the corner strength denote the corners in the gray level image. Its performance is similar to the \ref cornerResponseFunction(). The source value type must be a linear algebra, i.e. addition, subtraction, and multiplication with itself, multiplication with doubles and \ref NumericTraits "NumericTraits" must be defined. Declarations: pass arguments explicitly: \code namespace vigra { template void rohrCornerDetector(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void rohrCornerDetector( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/cornerdetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), corners(w,h); vigra::FImage rohr_corner_strength(w,h); // empty corner image corners.init(0.0); ... // find corner response at scale 1.0 vigra::rohrCornerDetector(srcImageRange(src), destImage(rohr_corner_strength), 1.0); // find local maxima of corner response, mark with 1 vigra::localMaxima(srcImageRange(rohr_corner_strength), destImage(corners)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); double d; u = u + u u = u - u u = u * u u = d * u dest_accessor.set(u, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void rohrCornerDetector) template void rohrCornerDetector(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) { vigra_precondition(scale > 0.0, "rohrCornerDetector(): Scale must be > 0"); int w = slr.x - sul.x; int h = slr.y - sul.y; if(w <= 0 || h <= 0) return; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; TmpImage gx(w,h); TmpImage gy(w,h); TmpImage gxy(w,h); structureTensor(srcIterRange(sul, slr, as), destImage(gx), destImage(gxy), destImage(gy), scale, scale); RohrCornerFunctor cf; combineThreeImages(srcImageRange(gx), srcImage(gy), srcImage(gxy), destIter(dul, ad), cf ); } template inline void rohrCornerDetector( triple src, pair dest, double scale) { rohrCornerDetector(src.first, src.second, src.third, dest.first, dest.second, scale); } /********************************************************/ /* */ /* beaudetCornerDetector */ /* */ /********************************************************/ /** \brief Find corners in an image (4). This algorithm implements a corner detector according to [P.R. Beaudet: "Rotationally Invariant Image Operators", Proc. Intl. Joint Conf. on Pattern Recognition, Kyoto, Japan, 1978, pp. 579-583]. The algorithm calculates the corner strength as the negative determinant of the \link hessianMatrixOfGaussian() Hessian Matrix\endlink. The local maxima of the corner strength denote the corners in the gray level image. The source value type must be a linear algebra, i.e. addition, subtraction, and multiplication with itself, multiplication with doubles and \ref NumericTraits "NumericTraits" must be defined. Declarations: pass arguments explicitly: \code namespace vigra { template void beaudetCornerDetector(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void beaudetCornerDetector( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/cornerdetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), corners(w,h); vigra::FImage beaudet_corner_strength(w,h); // empty corner image corners.init(0.0); ... // find corner response at scale 1.0 vigra::beaudetCornerDetector(srcImageRange(src), destImage(beaudet_corner_strength), 1.0); // find local maxima of corner response, mark with 1 vigra::localMaxima(srcImageRange(beaudet_corner_strength), destImage(corners)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); double d; u = u + u u = u - u u = u * u u = d * u dest_accessor.set(u, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void beaudetCornerDetector) template void beaudetCornerDetector(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) { vigra_precondition(scale > 0.0, "beaudetCornerDetector(): Scale must be > 0"); int w = slr.x - sul.x; int h = slr.y - sul.y; if(w <= 0 || h <= 0) return; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; TmpImage gx(w,h); TmpImage gy(w,h); TmpImage gxy(w,h); hessianMatrixOfGaussian(srcIterRange(sul, slr, as), destImage(gx), destImage(gxy), destImage(gy), scale); BeaudetCornerFunctor cf; combineThreeImages(srcImageRange(gx), srcImage(gy), srcImage(gxy), destIter(dul, ad), cf ); } template inline void beaudetCornerDetector( triple src, pair dest, double scale) { beaudetCornerDetector(src.first, src.second, src.third, dest.first, dest.second, scale); } //@} } // namespace vigra #endif // VIGRA_CORNERDETECTION_HXX gamera-3.3.3/include/vigra/diff2d.hxx0000644000076500000000000011241111271041102016351 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2003 by Hans Meine */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_DIFF2D_HXX #define VIGRA_DIFF2D_HXX #include // for sqrt() #include #include "config.hxx" #include "iteratortags.hxx" #include "iteratortraits.hxx" #include "iteratoradapter.hxx" #include "tuple.hxx" namespace vigra { template class Diff2DConstRowIteratorPolicy { public: typedef Diff BaseType; typedef Diff value_type; typedef typename Diff::MoveX difference_type; typedef Diff const & reference; typedef Diff index_reference; typedef Diff const * pointer; typedef std::random_access_iterator_tag iterator_category; static void initialize(BaseType &) {} static reference dereference(BaseType const & d) { return d; } static index_reference dereference(BaseType d, difference_type n) { d.x += n; return d; } static bool equal(BaseType const & d1, BaseType const & d2) { return d1.x == d2.x; } static bool less(BaseType const & d1, BaseType const & d2) { return d1.x < d2.x; } static difference_type difference(BaseType const & d1, BaseType const & d2) { return d1.x - d2.x; } static void increment(BaseType & d) { ++d.x; } static void decrement(BaseType & d) { --d.x; } static void advance(BaseType & d, difference_type n) { d.x += n; } }; template class Diff2DConstColumnIteratorPolicy { public: typedef Diff BaseType; typedef Diff value_type; typedef typename Diff::MoveY difference_type; typedef Diff const & reference; typedef Diff index_reference; typedef Diff const * pointer; typedef std::random_access_iterator_tag iterator_category; static void initialize(BaseType & /*d*/) {} static reference dereference(BaseType const & d) { return d; } static index_reference dereference(BaseType d, difference_type n) { d.y += n; return d; } static bool equal(BaseType const & d1, BaseType const & d2) { return d1.y == d2.y; } static bool less(BaseType const & d1, BaseType const & d2) { return d1.y < d2.y; } static difference_type difference(BaseType const & d1, BaseType const & d2) { return d1.y - d2.y; } static void increment(BaseType & d) { ++d.y; } static void decrement(BaseType & d) { --d.y; } static void advance(BaseType & d, difference_type n) { d.y += n; } }; /** \addtogroup RangesAndPoints Two-dimensional Ranges and Points Specify a 2D position, extent, or rectangle. */ //@{ /********************************************************/ /* */ /* Diff2D */ /* */ /********************************************************/ /** \brief Two dimensional difference vector. This class acts primarily as a difference vector for specifying pixel coordinates and region sizes. In addition, Diff2D fulfills the requirements of an \ref ImageIterator, so that it can be used to simulate an image whose pixels' values equal their coordinates. This secondary usage is explained on page \ref CoordinateIterator. Standard usage as a difference vector is mainly needed in the context of images. For example, Diff2D may be used as an index for operator[]: \code vigra::Diff2D location(...); value = image[location]; \endcode This is especially important in connection with accessors, where the offset variant of operator() takes only one offset object: \code // accessor(iterator, dx, dy); is not allowed value = accessor(iterator, vigra::Diff2D(dx, dy)); \endcode Diff2D is also returned by image.size(), so that we can create new images by calculating their size using Diff2D's arithmetic functions: \code // create an image that is 10 pixels smaller in each direction Image new_image(old_image.size() - Diff2D(10,10)); \endcode \#include \<vigra/utilities.hxx\>
Namespace: vigra */ class Diff2D { public: /** The iterator's value type: a coordinate. */ typedef Diff2D PixelType; /** The iterator's value type: a coordinate. */ typedef Diff2D value_type; /** the iterator's reference type (return type of *iter) */ typedef Diff2D const & reference; /** the iterator's index reference type (return type of iter[diff]) */ typedef Diff2D index_reference; /** the iterator's pointer type (return type of iter.operator->()) */ typedef Diff2D const * pointer; /** the iterator's difference type (argument type of iter[diff]) */ typedef Diff2D difference_type; /** the iterator tag (image traverser) */ typedef image_traverser_tag iterator_category; /** The associated row iterator. */ typedef IteratorAdaptor > row_iterator; /** The associated column iterator. */ typedef IteratorAdaptor > column_iterator; /** type of the iterator's x-navigator */ typedef int MoveX; /** type of the iterator's y-navigator */ typedef int MoveY; /** Default Constructor. Init iterator at position (0,0) */ Diff2D() : x(0), y(0) {} /** Construct at given position. */ Diff2D(int ax, int ay) : x(ax), y(ay) {} /** Copy Constructor. */ Diff2D(Diff2D const & v) : x(v.x), y(v.y) {} /** Copy Assigment. */ Diff2D & operator=(Diff2D const & v) { if(this != &v) { x = v.x; y = v.y; } return *this; } /** Unary negation. */ Diff2D operator-() const { return Diff2D(-x, -y); } /** Increase coordinate by specified offset. */ Diff2D & operator+=(Diff2D const & offset) { x += offset.x; y += offset.y; return *this; } /** Decrease coordinate by specified vector. */ Diff2D & operator-=(Diff2D const & offset) { x -= offset.x; y -= offset.y; return *this; } /** Create vector by scaling by factor. */ Diff2D & operator*=(int factor) { x *= factor; y *= factor; return *this; } /** Create vector by scaling by factor. */ Diff2D & operator*=(double factor) { x = (int)(x * factor); y = (int)(y * factor); return *this; } /** Create vector by scaling by 1/factor. */ Diff2D & operator/=(int factor) { x /= factor; y /= factor; return *this; } /** Create vector by scaling by 1/factor. */ Diff2D & operator/=(double factor) { x = (int)(x / factor); y = (int)(y / factor); return *this; } /** Create vector by scaling by factor. */ Diff2D operator*(int factor) const { return Diff2D(x * factor, y * factor); } /** Create vector by scaling by factor. */ Diff2D operator*(double factor) const { return Diff2D((int)(x * factor), (int)(y * factor)); } /** Create vector by scaling by 1/factor. */ Diff2D operator/(int factor) const { return Diff2D(x / factor, y / factor); } /** Create vector by scaling by 1/factor. */ Diff2D operator/(double factor) const { return Diff2D((int)(x / factor), (int)(y / factor)); } /** Calculate length of difference vector. */ int squaredMagnitude() const { return x*x + y*y; } /** Calculate length of difference vector. */ double magnitude() const { return VIGRA_CSTD::sqrt((double)squaredMagnitude()); } /** Equality. */ bool operator==(Diff2D const & r) const { return (x == r.x) && (y == r.y); } /** Inequality. */ bool operator!=(Diff2D const & r) const { return (x != r.x) || (y != r.y); } /** Used for both access to the current x-coordinate \em and to specify that an iterator navigation command is to be applied in x-direction.
usage: x = diff2d.x (use \p Diff2D::x as component of difference vector)
or   ++diff.x   (use Diff2D as iterator, move right) */ int x; /** Used for both access to the current y-coordinate \em and to specify that an iterator navigation command is to be applied in y-direction.
usage: y = diff2d.y (use \p Diff2D::y as component of difference vector)
or   ++diff.y   (use Diff2D as iterator, move right) */ int y; /** Access current coordinate. */ reference operator*() const { return *this; } /** Read coordinate at an offset. */ index_reference operator()(int const & dx, int const & dy) const { return Diff2D(x + dx, y + dy); } /** Read coordinate at an offset. */ index_reference operator[](Diff2D const & offset) const { return Diff2D(x + offset.x, y + offset.y); } /** Read vector components. */ int operator[](int index) const { return (&x)[index]; } /** Access current coordinate. */ pointer operator->() const { return this; } /** Get a row iterator at the current position. */ row_iterator rowIterator() const { return row_iterator(*this); } /** Get a column iterator at the current position. */ column_iterator columnIterator() const { return column_iterator(*this); } }; template <> struct IteratorTraits { typedef Diff2D Iterator; typedef Iterator iterator; typedef Iterator const_iterator; // typedef multable_iterator; undefined typedef iterator::iterator_category iterator_category; typedef iterator::value_type value_type; typedef iterator::reference reference; typedef iterator::index_reference index_reference; typedef iterator::pointer pointer; typedef iterator::difference_type difference_type; typedef iterator::row_iterator row_iterator; typedef iterator::column_iterator column_iterator; typedef StandardConstValueAccessor DefaultAccessor; typedef StandardConstValueAccessor default_accessor; typedef VigraTrueType hasConstantStrides; }; /********************************************************/ /* */ /* Size2D */ /* */ /********************************************************/ /** \brief Two dimensional size object. Specializes \ref Diff2D for the specification of a 2-dimensional extent, in contrast to a point or position (for the latter use \ref Point2D). \code // create an image that is 10 pixels squared Image new_image(Size2D(10,10)); \endcode \#include \<vigra/utilities.hxx\>
Namespace: vigra */ class Size2D : public Diff2D { public: /** Default Constructor. Init point at position (0,0) */ Size2D() {} /** Construct point at given position. */ Size2D(int width, int height) : Diff2D(width, height) {} /** Copy Constructor. */ Size2D(Size2D const & v) : Diff2D(v) {} /** Explicit conversion Constructor. */ explicit Size2D(Diff2D const & v) : Diff2D(v) {} /** Query the width. */ int width() const { return x; } /** Query the height. */ int height() const { return y; } /** Change the width. */ void setWidth(int w) { x = w; } /** Change the height. */ void setHeight(int h) { y = h; } /** Returns width()*height(), the area of a rectangle of this size. */ int area() const { return width()*height(); } /** Copy Assigment. */ Size2D & operator=(Diff2D const & v) { return static_cast(Diff2D::operator=(v)); } /** Unary negation. */ Size2D operator-() const { return Size2D(-x, -y); } /** Increase size by specified offset. */ Size2D & operator+=(Diff2D const & offset) { return static_cast(Diff2D::operator+=(offset)); } /** Decrease size by specified offset. */ Size2D & operator-=(Diff2D const & offset) { return static_cast(Diff2D::operator-=(offset)); } }; /********************************************************/ /* */ /* Point2D */ /* */ /********************************************************/ /** \brief Two dimensional point or position. Specializes \ref Diff2D for the specification of a 2-dimensional point or position, in contrast to an extent (for the latter use \ref Size2D). \code // access an image at a point value = image[Point2D(10, 20)]; \endcode \#include \<vigra/utilities.hxx\>
Namespace: vigra */ class Point2D : public Diff2D { public: /** The iterator's value type: a coordinate. */ typedef Point2D PixelType; /** The iterator's value type: a coordinate. */ typedef Point2D value_type; /** the iterator's reference type (return type of *iter) */ typedef Point2D const & reference; /** the iterator's index reference type (return type of iter[diff]) */ typedef Point2D index_reference; /** the iterator's pointer type (return type of iter.operator->()) */ typedef Point2D const * pointer; /** Default Constructor. Init point at position (0,0) */ Point2D() {} /** Construct point at given position. */ Point2D(int x, int y) : Diff2D(x, y) {} /** Copy Constructor. */ Point2D(Point2D const & v) : Diff2D(v) {} /** Explicit conversion Constructor. */ explicit Point2D(Diff2D const & v) : Diff2D(v) {} /** Query the points' x coordinate */ int px() const { return x; } /** Query the points' y coordinate */ int py() const { return y; } /** Copy Assigment. */ Point2D & operator=(Diff2D const & v) { return static_cast(Diff2D::operator=(v)); } /** Unary negation. */ Point2D operator-() const { return Point2D(-x, -y); } /** Increase point coordinates by specified offset. */ Point2D & operator+=(Diff2D const & offset) { return static_cast(Diff2D::operator+=(offset)); } /** Decrease point coordinates by specified offset. */ Point2D & operator-=(Diff2D const & offset) { return static_cast(Diff2D::operator-=(offset)); } /** Access current point coordinate. */ reference operator*() const { return *this; } /** Read point coordinate at an offset. */ index_reference operator()(int const & dx, int const & dy) const { return Point2D(x + dx, y + dy); } /** Read point coordinate at an offset. */ index_reference operator[](Diff2D const & offset) const { return Point2D(x + offset.x, y + offset.y); } /** Access current point coordinate. */ pointer operator->() const { return this; } }; /** Create vector by subtracting specified offset. */ inline Diff2D operator-(Diff2D const &a, Diff2D const &b) { return Diff2D(a.x - b.x, a.y - b.y); } /** Create size by subtracting specified offset. */ inline Size2D operator-(Size2D const & s, Diff2D const &offset) { return Size2D(s.x - offset.x, s.y - offset.y); } /** Calculate size of rect between two points. */ inline Point2D operator-(Point2D const & s, Diff2D const & offset) { return Point2D(s.x - offset.x, s.y - offset.y); } /** The difference of two points is a size */ inline Size2D operator-(Point2D const & s, Point2D const & p) { return Size2D(s.x - p.x, s.y - p.y); } /** Create vector by adding specified offset. */ inline Diff2D operator+(Diff2D const &a, Diff2D const &b) { return Diff2D(a.x + b.x, a.y + b.y); } /** Create size by adding specified offset. */ inline Size2D operator+(Size2D const &a, Diff2D const &b) { return Size2D(a.x + b.x, a.y + b.y); } /** Create point by adding specified offset. */ inline Point2D operator+(Point2D const &a, Diff2D const &b) { return Point2D(a.x + b.x, a.y + b.y); } /** Add size and point */ inline Point2D operator+(Size2D const & s, Point2D const & p) { return Point2D(s.x + p.x, s.y + p.y); } inline Point2D operator*(Point2D l, double r) { l *= r; return l; } inline Point2D operator*(double l, Point2D r) { r *= l; return r; } inline Size2D operator*(Size2D l, double r) { l *= r; return l; } inline Size2D operator*(double l, Size2D r) { r *= l; return r; } inline Point2D operator/(Point2D l, double r) { l /= r; return l; } inline Size2D operator/(Size2D l, double r) { l /= r; return l; } inline Point2D operator*(Point2D l, int r) { l *= r; return l; } inline Point2D operator*(int l, Point2D r) { r *= l; return r; } inline Size2D operator*(Size2D l, int r) { l *= r; return l; } inline Size2D operator*(int l, Size2D r) { r *= l; return r; } inline Point2D operator/(Point2D l, int r) { l /= r; return l; } inline Size2D operator/(Size2D l, int r) { l /= r; return l; } /********************************************************/ /* */ /* Rect2D */ /* */ /********************************************************/ /** \brief Two dimensional rectangle. This class stores a 2-dimensional rectangular range or region. Thus, it follows the VIGRA convention that the upper left corner is inside the rectangle, while the lower right is 1 pixel to the right and below the last pixel in the rectangle. A major advantage of this class is that it can be constructed from either a pair of \ref Point2D, or from a \ref Point2D and an extend (\ref Size2D). Rect2D overloads operators |=, &=, |, & to realize set union (in the sense of a minimal bounding rectangle) and set intersection. \code Rect2D r1(Point2D(0,0), Point2D(10, 20)), r2(Point2D(10, 15), Size2D(20, 20)); Point2D p(0,100); Rect2D r3 = r1 | r2; // upper left is (0,0), lower right is (30, 35) assert(r3.contains(r2)); assert(!r3.contains(p)); r3 |= p; // lower right now (30,101) so that p is inside r3 assert(r3.contains(p)); \endcode \#include \<vigra/utilities.hxx\>
Namespace: vigra */ class Rect2D { Point2D upperLeft_, lowerRight_; public: /** Construct a null rectangle (isEmpty() will return true) */ Rect2D() {} /** Construct a rectangle representing the given range * (lowerRight is considered to be outside the rectangle as * usual in the VIGRA) */ Rect2D(Point2D const &upperLeft, Point2D const &lowerRight) : upperLeft_(upperLeft), lowerRight_(lowerRight) {} /** Construct a rectangle representing the given range */ Rect2D(int left, int top, int right, int bottom) : upperLeft_(left, top), lowerRight_(right, bottom) {} /** Construct a rectangle of given position and size */ Rect2D(Point2D const &upperLeft, Size2D const &size) : upperLeft_(upperLeft), lowerRight_(upperLeft + size) {} /** Construct a rectangle of given size at position (0,0) */ explicit Rect2D(Size2D const &size) : lowerRight_(Point2D(size)) {} /** Return the first point (scan-order wise) which is * considered to be "in" the rectangle. */ Point2D const & upperLeft() const { return upperLeft_; } /** Return the first point to the right and below the * rectangle. */ Point2D const & lowerRight() const { return lowerRight_; } /** Change upperLeft() without changing lowerRight(), which * will change the size most probably. */ void setUpperLeft(Point2D const &ul) { upperLeft_ = ul; } /** Change lowerRight() without changing upperLeft(), which * will change the size most probably. */ void setLowerRight(Point2D const &lr) { lowerRight_ = lr; } /** Move the whole rectangle so that the given point will be * upperLeft() afterwards. */ void moveTo(Point2D const &newUpperLeft) { lowerRight_ += newUpperLeft - upperLeft_; upperLeft_ = newUpperLeft; } /** Move the whole rectangle so that upperLeft() will become * Point2D(left, top) afterwards. */ void moveTo(int left, int top) { moveTo(Point2D(left, top)); } /** Move the whole rectangle by the given 2D offset. */ void moveBy(Diff2D const &offset) { upperLeft_ += offset; lowerRight_ += offset; } /** Move the whole rectangle by the given x- and y-offsets. */ void moveBy(int xOffset, int yOffset) { moveBy(Diff2D(xOffset, yOffset)); } /** Return the left coordinate of this rectangle. */ int left() const { return upperLeft_.x; } /** Return the top coordinate of this rectangle. */ int top() const { return upperLeft_.y; } /** Return the right coordinate of this rectangle. That is the * first column to the right of the rectangle. */ int right() const { return lowerRight_.x; } /** Return the bottom coordinate of this rectangle. That is the * first row below the rectangle. */ int bottom() const { return lowerRight_.y; } /** Determine and return the width of this rectangle. It might be * zero or even negative, and if so, isEmpty() will return true. */ int width() const { return lowerRight_.x - upperLeft_.x; } /** Determine and return the height of this rectangle. It might be * zero or even negative, and if so, isEmpty() will return true. */ int height() const { return lowerRight_.y - upperLeft_.y; } /** Determine and return the area of this rectangle. That is, if * this rect isEmpty(), returns zero, otherwise returns * width()*height(). */ int area() const { return isEmpty() ? 0 : width()*height(); } /** Determine and return the size of this rectangle. The width * and/or height might be zero or even negative, and if so, * isEmpty() will return true. */ Size2D size() const { return lowerRight_ - upperLeft_; } /** Resize this rectangle to the given extents. This will move * the lower right corner only. */ void setSize(Size2D const &size) { lowerRight_ = upperLeft_ + size; } /** Resize this rectangle to the given extents. This will move * the lower right corner only. */ void setSize(int width, int height) { lowerRight_ = upperLeft_ + Size2D(width, height); } /** Increase the size of the rectangle by the given offset. This * will move the lower right corner only. (If any of offset's * components is negative, the rectangle will get smaller * accordingly.) */ void addSize(Size2D const &offset) { lowerRight_ += offset; } /** Adds a border of the given width around the rectangle. That * means, upperLeft()'s components are moved by -borderWidth * and lowerRight()'s by borderWidth. (If borderWidth is * negative, the rectangle will get smaller accordingly.) */ void addBorder(int borderWidth) { upperLeft_ += Diff2D(-borderWidth, -borderWidth); lowerRight_ += Diff2D(borderWidth, borderWidth); } /** Adds a border with possibly different widths in x- and * y-directions around the rectangle. That means, each x * component is moved borderWidth pixels and each y component * is moved borderHeight pixels to the outside. (If * borderWidth is negative, the rectangle will get smaller * accordingly.) */ void addBorder(int borderWidth, int borderHeight) { upperLeft_ += Diff2D(-borderWidth, -borderHeight); lowerRight_ += Diff2D(borderWidth, borderHeight); } /// equality check bool operator==(Rect2D const &r) const { return (upperLeft_ == r.upperLeft_) && (lowerRight_ == r.lowerRight_); } /// inequality check bool operator!=(Rect2D const &r) const { return (upperLeft_ != r.upperLeft_) || (lowerRight_ != r.lowerRight_); } /** Return whether this rectangle is considered empty. It is * non-empty if both coordinates of the lower right corner are * greater than the corresponding coordinate of the upper left * corner. Uniting an empty rectangle with something will return * the bounding rectangle of the 'something', intersecting with an * empty rectangle will yield again an empty rectangle. */ bool isEmpty() const { return ((lowerRight_.x <= upperLeft_.x) || (lowerRight_.y <= upperLeft_.y)); } /** Return whether this rectangle contains the given point. That * is, if the point lies within the valid range of an * ImageIterator walking from upperLeft() to lowerRight() * (excluding the latter). */ bool contains(Point2D const &p) const { return ((upperLeft_.x <= p.x) && (upperLeft_.y <= p.y) && (p.x < lowerRight_.x) && (p.y < lowerRight_.y)); } /** Return whether this rectangle contains the given * one. r1.contains(r2) returns the same as * r1 == (r1|r2) (but is of course more * efficient). That also means, a rectangle (even an empty one!) * contains() any empty rectangle. */ bool contains(Rect2D const &r) const { return r.isEmpty() || (contains(r.upperLeft()) && contains(r.lowerRight()-Diff2D(1,1))); } /** Return whether this rectangle overlaps with the given * one. r1.intersects(r2) returns the same as * !(r1&r2).isEmpty() (but is of course much more * efficient). */ bool intersects(Rect2D const &r) const { return ((r.upperLeft_.x < lowerRight_.x) && (upperLeft_.x < r.lowerRight_.x) && (r.upperLeft_.y < lowerRight_.y) && (upperLeft_.y < r.lowerRight_.y)) && !r.isEmpty(); } /** Modifies this rectangle by including the given point. The * result is the bounding rectangle of the rectangle and the * point. If isEmpty returns true, the union will be a * rectangle containing only the given point. */ Rect2D &operator|=(Point2D const &p) { if(isEmpty()) { upperLeft_ = p; lowerRight_ = p + Diff2D(1, 1); } else { if(p.x < upperLeft_.x) upperLeft_.x = p.x; if(p.y < upperLeft_.y) upperLeft_.y = p.y; if(lowerRight_.x <= p.x) lowerRight_.x = p.x + 1; if(lowerRight_.y <= p.y) lowerRight_.y = p.y + 1; } return *this; } /** Returns the union of this rectangle and the given * point. The result is the bounding rectangle of the * rectangle and the point. If isEmpty returns true, the union * will be a rectangle containing only the given point. */ Rect2D operator|(Point2D const &p) const { Rect2D result(*this); result |= p; return result; } /** Modifies this rectangle by uniting it with the given * one. The result is the bounding rectangle of both * rectangles. If one of the rectangles isEmpty(), the union * will be the other one. */ Rect2D &operator|=(Rect2D const &r) { if(r.isEmpty()) return *this; if(isEmpty()) return operator=(r); if(r.upperLeft_.x < upperLeft_.x) upperLeft_.x = r.upperLeft_.x; if(r.upperLeft_.y < upperLeft_.y) upperLeft_.y = r.upperLeft_.y; if(lowerRight_.x < r.lowerRight_.x) lowerRight_.x = r.lowerRight_.x; if(lowerRight_.y < r.lowerRight_.y) lowerRight_.y = r.lowerRight_.y; return *this; } /** Returns the union of this rectangle and the given one. The * result is the bounding rectangle of both rectangles. If one * of the rectangles isEmpty(), the union will be the other * one. */ Rect2D operator|(Rect2D const &r) const { Rect2D result(*this); result |= r; return result; } /** Modifies this rectangle by intersecting it with the given * point. The result is the bounding rect of the point (with * width and height equal to 1) if it was contained in the * original rect, or an empty rect otherwise. */ Rect2D &operator&=(Point2D const &p) { if(contains(p)) { upperLeft_ = p; lowerRight_ = p + Diff2D(1, 1); } else lowerRight_ = upperLeft_; return *this; } /** Intersects this rectangle with the given point. The result * is the bounding rect of the point (with width and height * equal to 1) if it was contained in the original rect, or an * empty rect otherwise. */ Rect2D operator&(Point2D const &p) const { Rect2D result(*this); result &= p; return result; } /** Modifies this rectangle by intersecting it with the given * one. The result is the maximal rectangle contained in both * original ones. Intersecting with an empty rectangle will * yield again an empty rectangle. */ Rect2D &operator&=(Rect2D const &r) { if(isEmpty()) return *this; if(r.isEmpty()) return operator=(r); if(upperLeft_.x < r.upperLeft_.x) upperLeft_.x = r.upperLeft_.x; if(upperLeft_.y < r.upperLeft_.y) upperLeft_.y = r.upperLeft_.y; if(r.lowerRight_.x < lowerRight_.x) lowerRight_.x = r.lowerRight_.x; if(r.lowerRight_.y < lowerRight_.y) lowerRight_.y = r.lowerRight_.y; return *this; } /** Intersects this rectangle with the given one. The result * is the maximal rectangle contained in both original ones. * Intersecting with an empty rectangle will yield again an * empty rectangle. */ Rect2D operator&(Rect2D const &r) const { Rect2D result(*this); result &= r; return result; } }; /********************************************************/ /* */ /* Dist2D */ /* */ /********************************************************/ /** @deprecated use \ref vigra::Diff2D instead */ class Dist2D { public: Dist2D(int the_width, int the_height) : width(the_width), height(the_height) {} Dist2D(Dist2D const & s) : width(s.width), height(s.height) {} Dist2D & operator=(Dist2D const & s) { if(this != &s) { width = s.width; height = s.height; } return *this; } Dist2D & operator+=(Dist2D const & s) { width += s.width; height += s.height; return *this; } Dist2D operator+(Dist2D const & s) const { Dist2D ret(*this); ret += s; return ret; } operator Diff2D() { return Diff2D(width, height); } int width; int height; }; //@} /** * Output a \ref vigra::Diff2D as a tuple. * Example Diff2D(-12, 13) -> "(-12, 13)" */ inline std::ostream & operator<<(std::ostream & o, vigra::Diff2D const & d) { o << '(' << d.x << ", " << d.y << ')'; return o; } /** * Output a \ref vigra::Size2D. * Example Size2D(100, 200) -> "(100x200)" */ inline std::ostream &operator <<(std::ostream &s, vigra::Size2D const &d) { s << '(' << d.x << 'x' << d.y << ')'; return s; } /** * Output a description of a \ref vigra::Rect2D. * Example Rect2D(10, 10, 30, 20) -> "[(10, 10) to (30, 20) = (20x10)]" */ inline std::ostream &operator <<(std::ostream &s, vigra::Rect2D const &r) { s << "[" << r.upperLeft() << " to " << r.lowerRight() << " = " << r.size() << "]"; return s; } } // namespace vigra #endif // VIGRA_DIFF2D_HXX gamera-3.3.3/include/vigra/distancetransform.hxx0000644000076500000000000003414011261456425020764 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_DISTANCETRANSFORM_HXX #define VIGRA_DISTANCETRANSFORM_HXX #include #include "stdimage.hxx" namespace vigra { /* * functors to determine the distance norm * these functors assume that dx and dy are positive * (this is OK for use in internalDistanceTransform()) */ // chessboard metric struct InternalDistanceTransformLInifinityNormFunctor { float operator()(float dx, float dy) const { return (dx < dy) ? dy : dx; } }; // Manhattan metric struct InternalDistanceTransformL1NormFunctor { float operator()(float dx, float dy) const { return dx + dy; } }; // Euclidean metric struct InternalDistanceTransformL2NormFunctor { float operator()(float dx, float dy) const { return VIGRA_CSTD::sqrt(dx*dx + dy*dy); } }; template void internalDistanceTransform(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da, ValueType background, NormFunctor norm) { int w = src_lowerright.x - src_upperleft.x; int h = src_lowerright.y - src_upperleft.y; FImage xdist(w,h), ydist(w,h); xdist = w; // init x and ydist = h; // y distances with 'large' values SrcImageIterator sy = src_upperleft; DestImageIterator ry = dest_upperleft; FImage::Iterator xdy = xdist.upperLeft(); FImage::Iterator ydy = ydist.upperLeft(); SrcImageIterator sx = sy; DestImageIterator rx = ry; FImage::Iterator xdx = xdy; FImage::Iterator ydx = ydy; static const Diff2D left(-1, 0); static const Diff2D right(1, 0); static const Diff2D top(0, -1); static const Diff2D bottom(0, 1); int x,y; if(sa(sx) != background) // first pixel { *xdx = 0.0; *ydx = 0.0; da.set(0.0, rx); } else { da.set(norm(*xdx, *ydx), rx); } for(x=1, ++xdx.x, ++ydx.x, ++sx.x, ++rx.x; x=0; --x, --xdx.x, --ydx.x, --sx.x, --rx.x) // first row right to left { float d = norm(xdx[right] + 1.0, ydx[right]); if(da(rx) < d) continue; *xdx = xdx[right] + 1.0; *ydx = ydx[right]; da.set(d, rx); } for(y=1, ++xdy.y, ++ydy.y, ++sy.y, ++ry.y; y=0; --x, --xdx.x, --ydx.x, --sx.x, --rx.x) // current row right to left { float d1 = norm(xdx[right] + 1.0, ydx[right]); if(da(rx) < d1) continue; *xdx = xdx[right] + 1.0; *ydx = ydx[right]; da.set(d1, rx); } } for(y=h-2, xdy.y -= 2, ydy.y -= 2, sy.y -= 2, ry.y -= 2; y>=0; --y, --xdy.y, --ydy.y, --sy.y, --ry.y) // bottom to top { sx = sy; rx = ry; xdx = xdy; ydx = ydy; float d = norm(xdx[bottom], ydx[bottom] + 1.0); if(d < da(rx)) // first pixel of current row { *xdx = xdx[bottom]; *ydx = ydx[bottom] + 1.0; da.set(d, rx); } for(x=1, ++xdx.x, ++ydx.x, ++sx.x, ++rx.x; x=0; --x, --xdx.x, --ydx.x, --sx.x, --rx.x) // current row right to left { float d1 = norm(xdx[right] + 1.0, ydx[right]); if(da(rx) < d1) continue; *xdx = xdx[right] + 1.0; *ydx = ydx[right]; da.set(d1, rx); } } } /********************************************************/ /* */ /* distanceTransform */ /* */ /********************************************************/ /** \addtogroup DistanceTransform Distance Transform Perform a distance transform using either the Euclidean, Manhattan, or chessboard metrics. See also: \ref MultiArrayDistanceTransform "multi-dimensional distance transforms" */ //@{ /** For all background pixels, calculate the distance to the nearest object or contour. The label of the pixels to be considered background in the source image is passed in the parameter 'background'. Source pixels with other labels will be considered objects. In the destination image, all pixels corresponding to background will be assigned the their distance value, all pixels corresponding to objects will be assigned 0. The parameter 'norm' gives the distance norm to be used:
  • norm == 0: use chessboard distance (L-infinity norm)
  • norm == 1: use Manhattan distance (L1 norm)
  • norm == 2: use Euclidean distance (L2 norm)
If you use the L2 norm, the destination pixels must be real valued to give correct results. Declarations: pass arguments explicitly: \code namespace vigra { template void distanceTransform(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da, ValueType background, int norm) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void distanceTransform( triple src, pair dest, ValueType background, int norm) } \endcode Usage: \#include \<vigra/distancetransform.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(w,h); vigra::FImage distance(w, h); // empty edge image edges = 0; ... // detect edges in src image (edges will be marked 1, background 0) vigra::differenceOfExponentialEdgeImage(srcImageRange(src), destImage(edges), 0.8, 4.0); // find distance of all pixels from nearest edge vigra::distanceTransform(srcImageRange(edges), destImage(distance), 0, 2); // ^ background label ^ norm (Euclidean) \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor sa; DestAccessor da; ValueType background; float distance; sa(src_upperleft) != background; da(dest_upperleft) < distance; da.set(distance, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void distanceTransform) template inline void distanceTransform(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da, ValueType background, int norm) { if(norm == 1) { internalDistanceTransform(src_upperleft, src_lowerright, sa, dest_upperleft, da, background, InternalDistanceTransformL1NormFunctor()); } else if(norm == 2) { internalDistanceTransform(src_upperleft, src_lowerright, sa, dest_upperleft, da, background, InternalDistanceTransformL2NormFunctor()); } else { internalDistanceTransform(src_upperleft, src_lowerright, sa, dest_upperleft, da, background, InternalDistanceTransformLInifinityNormFunctor()); } } template inline void distanceTransform( triple src, pair dest, ValueType background, int norm) { distanceTransform(src.first, src.second, src.third, dest.first, dest.second, background, norm); } //@} } // namespace vigra #endif // VIGRA_DISTANCETRANSFORM_HXX gamera-3.3.3/include/vigra/edgedetection.hxx0000644000076500000000000022055711261456425020052 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_EDGEDETECTION_HXX #define VIGRA_EDGEDETECTION_HXX #include #include #include // sqrt(), abs() #include "utilities.hxx" #include "numerictraits.hxx" #include "stdimage.hxx" #include "stdimagefunctions.hxx" #include "recursiveconvolution.hxx" #include "separableconvolution.hxx" #include "labelimage.hxx" #include "mathutil.hxx" #include "pixelneighborhood.hxx" #include "linear_solve.hxx" namespace vigra { /** \addtogroup EdgeDetection Edge Detection Edge detectors based on first and second derivatives, and related post-processing. */ //@{ /********************************************************/ /* */ /* differenceOfExponentialEdgeImage */ /* */ /********************************************************/ /** \brief Detect and mark edges in an edge image using the Shen/Castan zero-crossing detector. This operator applies an exponential filter to the source image at the given scale and subtracts the result from the original image. Zero crossings are detected in the resulting difference image. Whenever the gradient at a zero crossing is greater than the given gradient_threshold, an edge point is marked (using edge_marker) in the destination image on the darker side of the zero crossing (note that zero crossings occur between pixels). For example: \code sign of difference image resulting edge points (*) + - - * * . + + - => . * * + + + . . . \endcode Non-edge pixels (.) remain untouched in the destination image. The result can be improved by the post-processing operation \ref removeShortEdges(). A more accurate edge placement can be achieved with the function \ref differenceOfExponentialCrackEdgeImage(). The source value type (SrcAccessor::value_type) must be a linear algebra, i.e. addition, subtraction and multiplication of the type with itself, and multiplication with double and \ref NumericTraits "NumericTraits" must be defined. In addition, this type must be less-comparable. Declarations: pass arguments explicitly: \code namespace vigra { template void differenceOfExponentialEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker = NumericTraits::one()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void differenceOfExponentialEdgeImage( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker = NumericTraits::one()) } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(w,h); // empty edge image edges = 0; ... // find edges at scale 0.8 with gradient larger than 4.0, mark with 1 vigra::differenceOfExponentialEdgeImage(srcImageRange(src), destImage(edges), 0.8, 4.0, 1); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); double d; GradValue gradient_threshold; u = u + u u = u - u u = u * u u = d * u u < gradient_threshold DestValue edge_marker; dest_accessor.set(edge_marker, dest_upperleft); \endcode Preconditions: \code scale > 0 gradient_threshold > 0 \endcode */ doxygen_overloaded_function(template <...> void differenceOfExponentialEdgeImage) template void differenceOfExponentialEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker) { vigra_precondition(scale > 0, "differenceOfExponentialEdgeImage(): scale > 0 required."); vigra_precondition(gradient_threshold > 0, "differenceOfExponentialEdgeImage(): " "gradient_threshold > 0 required."); int w = slr.x - sul.x; int h = slr.y - sul.y; int x,y; typedef typename NumericTraits::RealPromote TMPTYPE; typedef BasicImage TMPIMG; TMPIMG tmp(w,h); TMPIMG smooth(w,h); recursiveSmoothX(srcIterRange(sul, slr, sa), destImage(tmp), scale / 2.0); recursiveSmoothY(srcImageRange(tmp), destImage(tmp), scale / 2.0); recursiveSmoothX(srcImageRange(tmp), destImage(smooth), scale); recursiveSmoothY(srcImageRange(smooth), destImage(smooth), scale); typename TMPIMG::Iterator iy = smooth.upperLeft(); typename TMPIMG::Iterator ty = tmp.upperLeft(); DestIterator dy = dul; static const Diff2D right(1, 0); static const Diff2D bottom(0, 1); TMPTYPE thresh = (gradient_threshold * gradient_threshold) * NumericTraits::one(); TMPTYPE zero = NumericTraits::zero(); for(y=0; y thresh) && (diff * (tx[right] - ix[right]) < zero)) { if(gx < zero) { da.set(edge_marker, dx, right); } else { da.set(edge_marker, dx); } } if(((gy * gy > thresh) && (diff * (tx[bottom] - ix[bottom]) < zero))) { if(gy < zero) { da.set(edge_marker, dx, bottom); } else { da.set(edge_marker, dx); } } } } typename TMPIMG::Iterator ix = iy; typename TMPIMG::Iterator tx = ty; DestIterator dx = dy; for(x=0; x thresh) && (diff * (tx[right] - ix[right]) < zero)) { if(gx < zero) { da.set(edge_marker, dx, right); } else { da.set(edge_marker, dx); } } } } template inline void differenceOfExponentialEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold) { differenceOfExponentialEdgeImage(sul, slr, sa, dul, da, scale, gradient_threshold, 1); } template inline void differenceOfExponentialEdgeImage( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker) { differenceOfExponentialEdgeImage(src.first, src.second, src.third, dest.first, dest.second, scale, gradient_threshold, edge_marker); } template inline void differenceOfExponentialEdgeImage( triple src, pair dest, double scale, GradValue gradient_threshold) { differenceOfExponentialEdgeImage(src.first, src.second, src.third, dest.first, dest.second, scale, gradient_threshold, 1); } /********************************************************/ /* */ /* differenceOfExponentialCrackEdgeImage */ /* */ /********************************************************/ /** \brief Detect and mark edges in a crack edge image using the Shen/Castan zero-crossing detector. This operator applies an exponential filter to the source image at the given scale and subtracts the result from the original image. Zero crossings are detected in the resulting difference image. Whenever the gradient at a zero crossing is greater than the given gradient_threshold, an edge point is marked (using edge_marker) in the destination image between the corresponding original pixels. Topologically, this means we must insert additional pixels between the original ones to represent the boundaries between the pixels (the so called zero- and one-cells, with the original pixels being two-cells). Within VIGRA, such an image is called \ref CrackEdgeImage. To allow insertion of the zero- and one-cells, the destination image must have twice the size of the original (precisely, (2*w-1) by (2*h-1) pixels). Then the algorithm proceeds as follows: \code sign of difference image insert zero- and one-cells resulting edge points (*) + . - . - . * . . . + - - . . . . . . * * * . + + - => + . + . - => . . . * . + + + . . . . . . . . * * + . + . + . . . . . \endcode Thus the edge points are marked where they actually are - in between the pixels. An important property of the resulting edge image is that it conforms to the notion of well-composedness as defined by Latecki et al., i.e. connected regions and edges obtained by a subsequent \ref Labeling do not depend on whether 4- or 8-connectivity is used. The non-edge pixels (.) in the destination image remain unchanged. The result conformes to the requirements of a \ref CrackEdgeImage. It can be further improved by the post-processing operations \ref removeShortEdges() and \ref closeGapsInCrackEdgeImage(). The source value type (SrcAccessor::value_type) must be a linear algebra, i.e. addition, subtraction and multiplication of the type with itself, and multiplication with double and \ref NumericTraits "NumericTraits" must be defined. In addition, this type must be less-comparable. Declarations: pass arguments explicitly: \code namespace vigra { template void differenceOfExponentialCrackEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker = NumericTraits::one()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void differenceOfExponentialCrackEdgeImage( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker = NumericTraits::one()) } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(2*w-1,2*h-1); // empty edge image edges = 0; ... // find edges at scale 0.8 with gradient larger than 4.0, mark with 1 vigra::differenceOfExponentialCrackEdgeImage(srcImageRange(src), destImage(edges), 0.8, 4.0, 1); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); double d; GradValue gradient_threshold; u = u + u u = u - u u = u * u u = d * u u < gradient_threshold DestValue edge_marker; dest_accessor.set(edge_marker, dest_upperleft); \endcode Preconditions: \code scale > 0 gradient_threshold > 0 \endcode The destination image must have twice the size of the source: \code w_dest = 2 * w_src - 1 h_dest = 2 * h_src - 1 \endcode */ doxygen_overloaded_function(template <...> void differenceOfExponentialCrackEdgeImage) template void differenceOfExponentialCrackEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker) { vigra_precondition(scale > 0, "differenceOfExponentialCrackEdgeImage(): scale > 0 required."); vigra_precondition(gradient_threshold > 0, "differenceOfExponentialCrackEdgeImage(): " "gradient_threshold > 0 required."); int w = slr.x - sul.x; int h = slr.y - sul.y; int x, y; typedef typename NumericTraits::RealPromote TMPTYPE; typedef BasicImage TMPIMG; TMPIMG tmp(w,h); TMPIMG smooth(w,h); TMPTYPE zero = NumericTraits::zero(); static const Diff2D right(1,0); static const Diff2D bottom(0,1); static const Diff2D left(-1,0); static const Diff2D top(0,-1); recursiveSmoothX(srcIterRange(sul, slr, sa), destImage(tmp), scale / 2.0); recursiveSmoothY(srcImageRange(tmp), destImage(tmp), scale / 2.0); recursiveSmoothX(srcImageRange(tmp), destImage(smooth), scale); recursiveSmoothY(srcImageRange(smooth), destImage(smooth), scale); typename TMPIMG::Iterator iy = smooth.upperLeft(); typename TMPIMG::Iterator ty = tmp.upperLeft(); DestIterator dy = dul; TMPTYPE thresh = (gradient_threshold * gradient_threshold) * NumericTraits::one(); // find zero crossings above threshold for(y=0; y thresh) && (diff * (tx[right] - ix[right]) < zero)) { da.set(edge_marker, dx, right); } if((gy * gy > thresh) && (diff * (tx[bottom] - ix[bottom]) < zero)) { da.set(edge_marker, dx, bottom); } } TMPTYPE diff = *tx - *ix; TMPTYPE gy = tx[bottom] - *tx; if((gy * gy > thresh) && (diff * (tx[bottom] - ix[bottom]) < zero)) { da.set(edge_marker, dx, bottom); } } typename TMPIMG::Iterator ix = iy; typename TMPIMG::Iterator tx = ty; DestIterator dx = dy; for(x=0; x thresh) && (diff * (tx[right] - ix[right]) < zero)) { da.set(edge_marker, dx, right); } } iy = smooth.upperLeft() + Diff2D(0,1); ty = tmp.upperLeft() + Diff2D(0,1); dy = dul + Diff2D(1,2); static const Diff2D topleft(-1,-1); static const Diff2D topright(1,-1); static const Diff2D bottomleft(-1,1); static const Diff2D bottomright(1,1); // find missing 1-cells below threshold (x-direction) for(y=0; y inline void differenceOfExponentialCrackEdgeImage( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker) { differenceOfExponentialCrackEdgeImage(src.first, src.second, src.third, dest.first, dest.second, scale, gradient_threshold, edge_marker); } /********************************************************/ /* */ /* removeShortEdges */ /* */ /********************************************************/ /** \brief Remove short edges from an edge image. This algorithm can be applied as a post-processing operation of \ref differenceOfExponentialEdgeImage() and \ref differenceOfExponentialCrackEdgeImage(). It removes all edges that are shorter than min_edge_length. The corresponding pixels are set to the non_edge_marker. The idea behind this algorithms is that very short edges are probably caused by noise and don't represent interesting image structure. Technically, the algorithms executes a connected components labeling, so the image's value type must be equality comparable. If the source image fulfills the requirements of a \ref CrackEdgeImage, it will still do so after application of this algorithm. Note that this algorithm, unlike most other algorithms in VIGRA, operates in-place, i.e. on only one image. Also, the algorithm assumes that all non-edges pixels are already marked with the given non_edge_marker value. Declarations: pass arguments explicitly: \code namespace vigra { template void removeShortEdges( Iterator sul, Iterator slr, Accessor sa, int min_edge_length, SrcValue non_edge_marker) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void removeShortEdges( triple src, int min_edge_length, SrcValue non_edge_marker) } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(w,h); // empty edge image edges = 0; ... // find edges at scale 0.8 with gradient larger than 4.0, mark with 1 vigra::differenceOfExponentialEdgeImage(srcImageRange(src), destImage(edges), 0.8, 4.0, 1); // zero edges shorter than 10 pixels vigra::removeShortEdges(srcImageRange(edges), 10, 0); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); u == u SrcValue non_edge_marker; src_accessor.set(non_edge_marker, src_upperleft); \endcode */ doxygen_overloaded_function(template <...> void removeShortEdges) template void removeShortEdges( Iterator sul, Iterator slr, Accessor sa, unsigned int min_edge_length, Value non_edge_marker) { int w = slr.x - sul.x; int h = slr.y - sul.y; int x,y; IImage labels(w, h); labels = 0; int number_of_regions = labelImageWithBackground(srcIterRange(sul,slr,sa), destImage(labels), true, non_edge_marker); ArrayOfRegionStatistics > region_stats(number_of_regions); inspectTwoImages(srcImageRange(labels), srcImage(labels), region_stats); IImage::Iterator ly = labels.upperLeft(); Iterator oy = sul; for(y=0; y inline void removeShortEdges( triple src, unsigned int min_edge_length, Value non_edge_marker) { removeShortEdges(src.first, src.second, src.third, min_edge_length, non_edge_marker); } /********************************************************/ /* */ /* closeGapsInCrackEdgeImage */ /* */ /********************************************************/ /** \brief Close one-pixel wide gaps in a cell grid edge image. This algorithm is typically applied as a post-processing operation of \ref differenceOfExponentialCrackEdgeImage(). The source image must fulfill the requirements of a \ref CrackEdgeImage, and will still do so after application of this algorithm. It closes one pixel wide gaps in the edges resulting from this algorithm. Since these gaps are usually caused by zero crossing slightly below the gradient threshold used in edge detection, this algorithms acts like a weak hysteresis thresholding. The newly found edge pixels are marked with the given edge_marker. The image's value type must be equality comparable. Note that this algorithm, unlike most other algorithms in VIGRA, operates in-place, i.e. on only one image. Declarations: pass arguments explicitly: \code namespace vigra { template void closeGapsInCrackEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, SrcValue edge_marker) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void closeGapsInCrackEdgeImage( triple src, SrcValue edge_marker) } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(2*w-1, 2*h-1); // empty edge image edges = 0; ... // find edges at scale 0.8 with gradient larger than 4.0, mark with 1 vigra::differenceOfExponentialCrackEdgeImage(srcImageRange(src), destImage(edges), 0.8, 4.0, 1); // close gaps, mark with 1 vigra::closeGapsInCrackEdgeImage(srcImageRange(edges), 1); // zero edges shorter than 20 pixels vigra::removeShortEdges(srcImageRange(edges), 10, 0); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); u == u u != u SrcValue edge_marker; src_accessor.set(edge_marker, src_upperleft); \endcode */ doxygen_overloaded_function(template <...> void closeGapsInCrackEdgeImage) template void closeGapsInCrackEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, SrcValue edge_marker) { int w = (slr.x - sul.x) / 2; int h = (slr.y - sul.y) / 2; int x, y; int count1, count2, count3; static const Diff2D right(1,0); static const Diff2D bottom(0,1); static const Diff2D left(-1,0); static const Diff2D top(0,-1); static const Diff2D leftdist[] = { Diff2D(0, 0), Diff2D(-1, 1), Diff2D(-2, 0), Diff2D(-1, -1)}; static const Diff2D rightdist[] = { Diff2D(2, 0), Diff2D(1, 1), Diff2D(0, 0), Diff2D(1, -1)}; static const Diff2D topdist[] = { Diff2D(1, -1), Diff2D(0, 0), Diff2D(-1, -1), Diff2D(0, -2)}; static const Diff2D bottomdist[] = { Diff2D(1, 1), Diff2D(0, 2), Diff2D(-1, 1), Diff2D(0, 0)}; int i; SrcIterator sy = sul + Diff2D(0,1); SrcIterator sx; // close 1-pixel wide gaps (x-direction) for(y=0; y inline void closeGapsInCrackEdgeImage( triple src, SrcValue edge_marker) { closeGapsInCrackEdgeImage(src.first, src.second, src.third, edge_marker); } /********************************************************/ /* */ /* beautifyCrackEdgeImage */ /* */ /********************************************************/ /** \brief Beautify crack edge image for visualization. This algorithm is applied as a post-processing operation of \ref differenceOfExponentialCrackEdgeImage(). The source image must fulfill the requirements of a \ref CrackEdgeImage, but will not do so after application of this algorithm. In particular, the algorithm removes zero-cells marked as edges to avoid staircase effects on diagonal lines like this: \code original edge points (*) resulting edge points . * . . . . * . . . . * * * . . . * . . . . . * . => . . . * . . . . * * . . . . * . . . . . . . . . . \endcode Therfore, this algorithm should only be applied as a vizualization aid, i.e. for human inspection. The algorithm assumes that edges are marked with edge_marker, and background pixels with background_marker. The image's value type must be equality comparable. Note that this algorithm, unlike most other algorithms in VIGRA, operates in-place, i.e. on only one image. Declarations: pass arguments explicitly: \code namespace vigra { template void beautifyCrackEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, SrcValue edge_marker, SrcValue background_marker) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void beautifyCrackEdgeImage( triple src, SrcValue edge_marker, SrcValue background_marker) } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(2*w-1, 2*h-1); // empty edge image edges = 0; ... // find edges at scale 0.8 with gradient larger than 4.0, mark with 1 vigra::differenceOfExponentialCrackEdgeImage(srcImageRange(src), destImage(edges), 0.8, 4.0, 1); // beautify edge image for visualization vigra::beautifyCrackEdgeImage(destImageRange(edges), 1, 0); // show to the user window.open(edges); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); u == u u != u SrcValue background_marker; src_accessor.set(background_marker, src_upperleft); \endcode */ doxygen_overloaded_function(template <...> void beautifyCrackEdgeImage) template void beautifyCrackEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, SrcValue edge_marker, SrcValue background_marker) { int w = (slr.x - sul.x) / 2; int h = (slr.y - sul.y) / 2; int x, y; SrcIterator sy = sul + Diff2D(1,1); SrcIterator sx; static const Diff2D right(1,0); static const Diff2D bottom(0,1); static const Diff2D left(-1,0); static const Diff2D top(0,-1); // delete 0-cells at corners for(y=0; y inline void beautifyCrackEdgeImage( triple src, SrcValue edge_marker, SrcValue background_marker) { beautifyCrackEdgeImage(src.first, src.second, src.third, edge_marker, background_marker); } /** Helper class that stores edgel attributes. */ class Edgel { public: /** The edgel's sub-pixel x coordinate. */ float x; /** The edgel's sub-pixel y coordinate. */ float y; /** The edgel's strength (magnitude of the gradient vector). */ float strength; /** The edgel's orientation. This is the angle between the x-axis and the edge, so that the bright side of the edge is on the right. The angle is measured counter-clockwise in radians like this: \code edgel axis \ (bright side) (dark \ side) \ /__ \\ \ orientation angle \ | +------------> x-axis | | | | y-axis V \endcode So, for example a vertical edge with its dark side on the left has orientation PI/2, and a horizontal edge with dark side on top has orientation 0. Obviously, the edge's orientation changes by PI if the contrast is reversed. */ float orientation; Edgel() : x(0.0f), y(0.0f), strength(0.0f), orientation(0.0f) {} Edgel(float ix, float iy, float is, float io) : x(ix), y(iy), strength(is), orientation(io) {} }; template void internalCannyFindEdgels(Image1 const & gx, Image1 const & gy, Image2 const & magnitude, BackInsertable & edgels) { typedef typename Image1::value_type PixelType; double t = 0.5 / VIGRA_CSTD::sin(M_PI/8.0); for(int y=1; y quadratic interpolation of sub-pixel location PixelType del = (m1 - m3) / 2.0 / (m1 + m3 - 2.0*mag); edgel.x = x + dx*del; edgel.y = y + dy*del; edgel.strength = mag; double orientation = VIGRA_CSTD::atan2(-grady, gradx) - M_PI * 1.5; if(orientation < 0.0) orientation += 2.0*M_PI; edgel.orientation = orientation; edgels.push_back(edgel); } } } } /********************************************************/ /* */ /* cannyEdgelList */ /* */ /********************************************************/ /** \brief Simple implementation of Canny's edge detector. This operator first calculates the gradient vector for each pixel of the image using first derivatives of a Gaussian at the given scale. Then a very simple non-maxima supression is performed: for each 3x3 neighborhood, it is determined whether the center pixel has larger gradient magnitude than its two neighbors in gradient direction (where the direction is rounded into octands). If this is the case, a new \ref Edgel is appended to the given vector of edgels. The subpixel edgel position is determined by fitting a parabola to the three gradient magnitude values mentioned above. The sub-pixel location of the parabola's tip and the gradient magnitude and direction (from the pixel center) are written in the newly created edgel. Declarations: pass arguments explicitly: \code namespace vigra { template void cannyEdgelList(SrcIterator ul, SrcIterator lr, SrcAccessor src, BackInsertable & edgels, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void cannyEdgelList(triple src, BackInsertable & edgels, double scale); } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); // empty edgel list std::vector edgels; ... // find edgels at scale 0.8 vigra::cannyEdgelList(srcImageRange(src), edgels, 0.8); \endcode Required Interface: \code SrcImageIterator src_upperleft; SrcAccessor src_accessor; src_accessor(src_upperleft); BackInsertable edgels; edgels.push_back(Edgel()); \endcode SrcAccessor::value_type must be a type convertible to float Preconditions: \code scale > 0 \endcode */ doxygen_overloaded_function(template <...> void cannyEdgelList) template void cannyEdgelList(SrcIterator ul, SrcIterator lr, SrcAccessor src, BackInsertable & edgels, double scale) { int w = lr.x - ul.x; int h = lr.y - ul.y; // calculate image gradients typedef typename NumericTraits::RealPromote TmpType; BasicImage tmp(w,h), dx(w,h), dy(w,h); Kernel1D smooth, grad; smooth.initGaussian(scale); grad.initGaussianDerivative(scale, 1); separableConvolveX(srcIterRange(ul, lr, src), destImage(tmp), kernel1d(grad)); separableConvolveY(srcImageRange(tmp), destImage(dx), kernel1d(smooth)); separableConvolveY(srcIterRange(ul, lr, src), destImage(tmp), kernel1d(grad)); separableConvolveX(srcImageRange(tmp), destImage(dy), kernel1d(smooth)); combineTwoImages(srcImageRange(dx), srcImage(dy), destImage(tmp), MagnitudeFunctor()); // find edgels internalCannyFindEdgels(dx, dy, tmp, edgels); } template inline void cannyEdgelList(triple src, BackInsertable & edgels, double scale) { cannyEdgelList(src.first, src.second, src.third, edgels, scale); } /********************************************************/ /* */ /* cannyEdgeImage */ /* */ /********************************************************/ /** \brief Detect and mark edges in an edge image using Canny's algorithm. This operator first calls \ref cannyEdgelList() to generate an edgel list for the given image. Then it scans this list and selects edgels whose strength is above the given gradient_threshold. For each of these edgels, the edgel's location is rounded to the nearest pixel, and that pixel marked with the given edge_marker. Declarations: pass arguments explicitly: \code namespace vigra { template void cannyEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void cannyEdgeImage( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker); } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(w,h); // empty edge image edges = 0; ... // find edges at scale 0.8 with gradient larger than 4.0, mark with 1 vigra::cannyEdgeImage(srcImageRange(src), destImage(edges), 0.8, 4.0, 1); \endcode Required Interface: see also: \ref cannyEdgelList(). \code DestImageIterator dest_upperleft; DestAccessor dest_accessor; DestValue edge_marker; dest_accessor.set(edge_marker, dest_upperleft, vigra::Diff2D(1,1)); \endcode Preconditions: \code scale > 0 gradient_threshold > 0 \endcode */ doxygen_overloaded_function(template <...> void cannyEdgeImage) template void cannyEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker) { std::vector edgels; cannyEdgelList(sul, slr, sa, edgels, scale); for(unsigned int i=0; i inline void cannyEdgeImage( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker) { cannyEdgeImage(src.first, src.second, src.third, dest.first, dest.second, scale, gradient_threshold, edge_marker); } /********************************************************/ namespace detail { template int neighborhoodConfiguration(DestIterator dul) { int v = 0; NeighborhoodCirculator c(dul, EightNeighborCode::SouthEast); for(int i=0; i<8; ++i, --c) { v = (v << 1) | ((*c != 0) ? 1 : 0); } return v; } template struct SimplePoint { Diff2D point; GradValue grad; SimplePoint(Diff2D const & p, GradValue g) : point(p), grad(g) {} bool operator<(SimplePoint const & o) const { return grad < o.grad; } bool operator>(SimplePoint const & o) const { return grad > o.grad; } }; template void cannyEdgeImageFromGrad( SrcIterator sul, SrcIterator slr, SrcAccessor grad, DestIterator dul, DestAccessor da, GradValue gradient_threshold, DestValue edge_marker) { typedef typename SrcAccessor::value_type PixelType; typedef typename NormTraits::SquaredNormType NormType; NormType zero = NumericTraits::zero(); double tan22_5 = M_SQRT2 - 1.0; typename NormTraits::SquaredNormType g2thresh = squaredNorm(gradient_threshold); int w = slr.x - sul.x; int h = slr.y - sul.y; sul += Diff2D(1,1); dul += Diff2D(1,1); Diff2D p(0,0); for(int y = 1; y < h-1; ++y, ++sul.y, ++dul.y) { SrcIterator sx = sul; DestIterator dx = dul; for(int x = 1; x < w-1; ++x, ++sx.x, ++dx.x) { PixelType g = grad(sx); NormType g2n = squaredNorm(g); if(g2n < g2thresh) continue; NormType g2n1, g2n3; // find out quadrant if(abs(g[1]) < tan22_5*abs(g[0])) { // north-south edge g2n1 = squaredNorm(grad(sx, Diff2D(-1, 0))); g2n3 = squaredNorm(grad(sx, Diff2D(1, 0))); } else if(abs(g[0]) < tan22_5*abs(g[1])) { // west-east edge g2n1 = squaredNorm(grad(sx, Diff2D(0, -1))); g2n3 = squaredNorm(grad(sx, Diff2D(0, 1))); } else if(g[0]*g[1] < zero) { // north-west-south-east edge g2n1 = squaredNorm(grad(sx, Diff2D(1, -1))); g2n3 = squaredNorm(grad(sx, Diff2D(-1, 1))); } else { // north-east-south-west edge g2n1 = squaredNorm(grad(sx, Diff2D(-1, -1))); g2n3 = squaredNorm(grad(sx, Diff2D(1, 1))); } if(g2n1 < g2n && g2n3 <= g2n) { da.set(edge_marker, dx); } } } } } // namespace detail /********************************************************/ /* */ /* cannyEdgeImageWithThinning */ /* */ /********************************************************/ /** \brief Detect and mark edges in an edge image using Canny's algorithm. The input pixels of this algorithms must be vectors of length 2 (see Required Interface below). It first searches for all pixels whose gradient magnitude is larger than the given gradient_threshold and larger than the magnitude of its two neighbors in gradient direction (where these neighbors are determined by nearest neighbor interpolation, i.e. according to the octant where the gradient points into). The resulting edge pixel candidates are then subjected to topological thinning so that the remaining edge pixels can be linked into edgel chains with a provable, non-heuristic algorithm. Thinning is performed so that the pixels with highest gradient magnitude survive. Optionally, the outermost pixels are marked as edge pixels as well when addBorder is true. The remaining pixels will be marked in the destination image with the value of edge_marker (all non-edge pixels remain untouched). Declarations: pass arguments explicitly: \code namespace vigra { template void cannyEdgeImageFromGradWithThinning( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, GradValue gradient_threshold, DestValue edge_marker, bool addBorder = true); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void cannyEdgeImageFromGradWithThinning( triple src, pair dest, GradValue gradient_threshold, DestValue edge_marker, bool addBorder = true); } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(w,h); vigra::FVector2Image grad(w,h); // compute the image gradient at scale 0.8 vigra::gaussianGradient(srcImageRange(src), destImage(grad), 0.8); // empty edge image edges = 0; // find edges gradient larger than 4.0, mark with 1, and add border vigra::cannyEdgeImageFromGradWithThinning(srcImageRange(grad), destImage(edges), 4.0, 1, true); \endcode Required Interface: \code // the input pixel type must be a vector with two elements SrcImageIterator src_upperleft; SrcAccessor src_accessor; typedef SrcAccessor::value_type SrcPixel; typedef NormTraits::SquaredNormType SrcSquaredNormType; SrcPixel g = src_accessor(src_upperleft); SrcPixel::value_type g0 = g[0]; SrcSquaredNormType gn = squaredNorm(g); DestImageIterator dest_upperleft; DestAccessor dest_accessor; DestValue edge_marker; dest_accessor.set(edge_marker, dest_upperleft, vigra::Diff2D(1,1)); \endcode Preconditions: \code gradient_threshold > 0 \endcode */ doxygen_overloaded_function(template <...> void cannyEdgeImageFromGradWithThinning) template void cannyEdgeImageFromGradWithThinning( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, GradValue gradient_threshold, DestValue edge_marker, bool addBorder) { int w = slr.x - sul.x; int h = slr.y - sul.y; BImage edgeImage(w, h, BImage::value_type(0)); BImage::traverser eul = edgeImage.upperLeft(); BImage::Accessor ea = edgeImage.accessor(); if(addBorder) initImageBorder(destImageRange(edgeImage), 1, 1); detail::cannyEdgeImageFromGrad(sul, slr, sa, eul, ea, gradient_threshold, 1); static bool isSimplePoint[256] = { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 }; eul += Diff2D(1,1); sul += Diff2D(1,1); int w2 = w-2; int h2 = h-2; typedef detail::SimplePoint SP; // use std::greater becaus we need the smallest gradients at the top of the queue std::priority_queue, std::greater > pqueue; Diff2D p(0,0); for(; p.y < h2; ++p.y) { for(p.x = 0; p.x < w2; ++p.x) { BImage::traverser e = eul + p; if(*e == 0) continue; int v = detail::neighborhoodConfiguration(e); if(isSimplePoint[v]) { pqueue.push(SP(p, norm(sa(sul+p)))); *e = 2; // remember that it is already in queue } } } static const Diff2D dist[] = { Diff2D(-1,0), Diff2D(0,-1), Diff2D(1,0), Diff2D(0,1) }; while(pqueue.size()) { p = pqueue.top().point; pqueue.pop(); BImage::traverser e = eul + p; int v = detail::neighborhoodConfiguration(e); if(!isSimplePoint[v]) continue; // point may no longer be simple because its neighbors changed *e = 0; // delete simple point for(int i=0; i<4; ++i) { Diff2D pneu = p + dist[i]; if(pneu.x == -1 || pneu.y == -1 || pneu.x == w2 || pneu.y == h2) continue; // do not remove points at the border BImage::traverser eneu = eul + pneu; if(*eneu == 1) // point is boundary and not yet in the queue { int v = detail::neighborhoodConfiguration(eneu); if(isSimplePoint[v]) { pqueue.push(SP(pneu, norm(sa(sul+pneu)))); *eneu = 2; // remember that it is already in queue } } } } initImageIf(destIterRange(dul, dul+Diff2D(w,h), da), maskImage(edgeImage), edge_marker); } template inline void cannyEdgeImageFromGradWithThinning( triple src, pair dest, GradValue gradient_threshold, DestValue edge_marker, bool addBorder) { cannyEdgeImageFromGradWithThinning(src.first, src.second, src.third, dest.first, dest.second, gradient_threshold, edge_marker, addBorder); } template inline void cannyEdgeImageFromGradWithThinning( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, GradValue gradient_threshold, DestValue edge_marker) { cannyEdgeImageFromGradWithThinning(sul, slr, sa, dul, da, gradient_threshold, edge_marker, true); } template inline void cannyEdgeImageFromGradWithThinning( triple src, pair dest, GradValue gradient_threshold, DestValue edge_marker) { cannyEdgeImageFromGradWithThinning(src.first, src.second, src.third, dest.first, dest.second, gradient_threshold, edge_marker, true); } /********************************************************/ /* */ /* cannyEdgeImageWithThinning */ /* */ /********************************************************/ /** \brief Detect and mark edges in an edge image using Canny's algorithm. This operator first calls \ref gaussianGradient() to compute the gradient of the input image, ad then \ref cannyEdgeImageFromGradWithThinning() to generate an edge image. See there for more detailed documentation. Declarations: pass arguments explicitly: \code namespace vigra { template void cannyEdgeImageWithThinning( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker, bool addBorder = true); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void cannyEdgeImageWithThinning( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker, bool addBorder = true); } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), edges(w,h); // empty edge image edges = 0; ... // find edges at scale 0.8 with gradient larger than 4.0, mark with 1, annd add border vigra::cannyEdgeImageWithThinning(srcImageRange(src), destImage(edges), 0.8, 4.0, 1, true); \endcode Required Interface: see also: \ref cannyEdgelList(). \code DestImageIterator dest_upperleft; DestAccessor dest_accessor; DestValue edge_marker; dest_accessor.set(edge_marker, dest_upperleft, vigra::Diff2D(1,1)); \endcode Preconditions: \code scale > 0 gradient_threshold > 0 \endcode */ doxygen_overloaded_function(template <...> void cannyEdgeImageWithThinning) template void cannyEdgeImageWithThinning( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker, bool addBorder) { // mark pixels that are higher than their neighbors in gradient direction typedef typename NumericTraits::RealPromote TmpType; BasicImage > grad(slr-sul); gaussianGradient(srcIterRange(sul, slr, sa), destImage(grad), scale); cannyEdgeImageFromGradWithThinning(srcImageRange(grad), destIter(dul, da), gradient_threshold, edge_marker, addBorder); } template inline void cannyEdgeImageWithThinning( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker, bool addBorder) { cannyEdgeImageWithThinning(src.first, src.second, src.third, dest.first, dest.second, scale, gradient_threshold, edge_marker, addBorder); } template inline void cannyEdgeImageWithThinning( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, double scale, GradValue gradient_threshold, DestValue edge_marker) { cannyEdgeImageWithThinning(sul, slr, sa, dul, da, scale, gradient_threshold, edge_marker, true); } template inline void cannyEdgeImageWithThinning( triple src, pair dest, double scale, GradValue gradient_threshold, DestValue edge_marker) { cannyEdgeImageWithThinning(src.first, src.second, src.third, dest.first, dest.second, scale, gradient_threshold, edge_marker, true); } /********************************************************/ template void internalCannyFindEdgels3x3(Image1 const & grad, Image2 const & mask, BackInsertable & edgels) { typedef typename Image1::value_type PixelType; typedef typename PixelType::value_type ValueType; for(int y=1; y ml(3,3), mr(3,1), l(3,1), r(3,1); l(0,0) = 1.0; for(int yy = -1; yy <= 1; ++yy) { for(int xx = -1; xx <= 1; ++xx) { double u = c*xx + s*yy; double v = norm(grad(x+xx, y+yy)); l(1,0) = u; l(2,0) = u*u; ml += outer(l); mr += v*l; } } linearSolve(ml, mr, r); Edgel edgel; // local maximum => quadratic interpolation of sub-pixel location double del = -r(1,0) / 2.0 / r(2,0); if(std::fabs(del) > 1.5) // don't move by more than about a pixel diameter del = 0.0; edgel.x = x + c*del; edgel.y = y + s*del; edgel.strength = mag; double orientation = VIGRA_CSTD::atan2(-grady, gradx) - M_PI * 1.5; if(orientation < 0.0) orientation += 2.0*M_PI; edgel.orientation = orientation; edgels.push_back(edgel); } } } /********************************************************/ /* */ /* cannyEdgelList3x3 */ /* */ /********************************************************/ /** \brief Improved implementation of Canny's edge detector. This operator first computes pixels which are crossed by the edge using cannyEdgeImageWithThinning(). The gradient magnitude in the 3x3 neighborhood of these pixels are then projected onto the normal of the edge (as determined by the gradient direction). The edgel's subpixel location is found by fitting a parabola through the 9 gradient values and determining the parabola's tip. A new \ref Edgel is appended to the given vector of edgels. Since the parabola is fitted to 9 points rather than 3 points as in cannyEdgelList(), the accuracy is higher. Declarations: pass arguments explicitly: \code namespace vigra { template void cannyEdgelList3x3(SrcIterator ul, SrcIterator lr, SrcAccessor src, BackInsertable & edgels, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void cannyEdgelList3x3(triple src, BackInsertable & edgels, double scale); } \endcode Usage: \#include \<vigra/edgedetection.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); // empty edgel list std::vector edgels; ... // find edgels at scale 0.8 vigra::cannyEdgelList3x3(srcImageRange(src), edgels, 0.8); \endcode Required Interface: \code SrcImageIterator src_upperleft; SrcAccessor src_accessor; src_accessor(src_upperleft); BackInsertable edgels; edgels.push_back(Edgel()); \endcode SrcAccessor::value_type must be a type convertible to float Preconditions: \code scale > 0 \endcode */ doxygen_overloaded_function(template <...> void cannyEdgelList3x3) template void cannyEdgelList3x3(SrcIterator ul, SrcIterator lr, SrcAccessor src, BackInsertable & edgels, double scale) { int w = lr.x - ul.x; int h = lr.y - ul.y; typedef typename NumericTraits::RealPromote TmpType; BasicImage > grad(lr-ul); gaussianGradient(srcIterRange(ul, lr, src), destImage(grad), scale); UInt8Image edges(lr-ul); cannyEdgeImageFromGradWithThinning(srcImageRange(grad), destImage(edges), 0.0, 1, false); // find edgels internalCannyFindEdgels3x3(grad, edges, edgels); } template inline void cannyEdgelList3x3(triple src, BackInsertable & edgels, double scale) { cannyEdgelList3x3(src.first, src.second, src.third, edgels, scale); } //@} /** \page CrackEdgeImage Crack Edge Image Crack edges are marked between the pixels of an image. A Crack Edge Image is an image that represents these edges. In order to accomodate the cracks, the Crack Edge Image must be twice as large as the original image (precisely (2*w - 1) by (2*h - 1)). A Crack Edge Image can easily be derived from a binary image or from the signs of the response of a Laplacean filter. Consider the following sketch, where + encodes the foreground, - the background, and * the resulting crack edges. \code sign of difference image insert cracks resulting CrackEdgeImage + . - . - . * . . . + - - . . . . . . * * * . + + - => + . + . - => . . . * . + + + . . . . . . . . * * + . + . + . . . . . \endcode Starting from the original binary image (left), we insert crack pixels to get to the double-sized image (center). Finally, we mark all crack pixels whose non-crack neighbors have different signs as crack edge points, while all other pixels (crack and non-crack) become region pixels. Requirements on a Crack Edge Image:
  • Crack Edge Images have odd width and height.
  • Crack pixels have at least one odd coordinate.
  • Only crack pixels may be marked as edge points.
  • Crack pixels with two odd coordinates must be marked as edge points whenever any of their neighboring crack pixels was marked.
The last two requirements ensure that both edges and regions are 4-connected. Thus, 4-connectivity and 8-connectivity yield identical connected components in a Crack Edge Image (so called well-composedness). This ensures that Crack Edge Images have nice topological properties (cf. L. J. Latecki: "Well-Composed Sets", Academic Press, 2000). */ } // namespace vigra #endif // VIGRA_EDGEDETECTION_HXX gamera-3.3.3/include/vigra/eigensystem.hxx0000644000076500000000000010471511261456425017600 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_EIGENSYSTEM_HXX #define VIGRA_EIGENSYSTEM_HXX #include #include #include "matrix.hxx" #include "array_vector.hxx" #include "polynomial.hxx" namespace vigra { namespace linalg { namespace detail { // code adapted from JAMA // a and b will be overwritten template void housholderTridiagonalization(MultiArrayView<2, T, C1> &a, MultiArrayView<2, T, C2> &b) { const unsigned int n = rowCount(a); vigra_precondition(n == columnCount(a), "housholderTridiagonalization(): matrix must be square."); vigra_precondition(n == rowCount(b) && 2 <= columnCount(b), "housholderTridiagonalization(): matrix size mismatch."); MultiArrayView<1, T, C2> d = b.bindOuter(0); MultiArrayView<1, T, C2> e = b.bindOuter(1); for(unsigned int j = 0; j < n; ++j) { d(j) = a(n-1, j); } // Householder reduction to tridiagonalMatrix form. for(int i = n-1; i > 0; --i) { // Scale to avoid under/overflow. T scale = 0.0; T h = 0.0; for(int k = 0; k < i; ++k) { scale = scale + abs(d(k)); } if(scale == 0.0) { e(i) = d(i-1); for(int j = 0; j < i; ++j) { d(j) = a(i-1, j); a(i, j) = 0.0; a(j, i) = 0.0; } } else { // Generate Householder vector. for(int k = 0; k < i; ++k) { d(k) /= scale; h += sq(d(k)); } T f = d(i-1); T g = VIGRA_CSTD::sqrt(h); if(f > 0) { g = -g; } e(i) = scale * g; h -= f * g; d(i-1) = f - g; for(int j = 0; j < i; ++j) { e(j) = 0.0; } // Apply similarity transformation to remaining columns. for(int j = 0; j < i; ++j) { f = d(j); a(j, i) = f; g = e(j) + a(j, j) * f; for(int k = j+1; k <= i-1; ++k) { g += a(k, j) * d(k); e(k) += a(k, j) * f; } e(j) = g; } f = 0.0; for(int j = 0; j < i; ++j) { e(j) /= h; f += e(j) * d(j); } T hh = f / (h + h); for(int j = 0; j < i; ++j) { e(j) -= hh * d(j); } for(int j = 0; j < i; ++j) { f = d(j); g = e(j); for(int k = j; k <= i-1; ++k) { a(k, j) -= (f * e(k) + g * d(k)); } d(j) = a(i-1, j); a(i, j) = 0.0; } } d(i) = h; } // Accumulate transformations. for(unsigned int i = 0; i < n-1; ++i) { a(n-1, i) = a(i, i); a(i, i) = 1.0; T h = d(i+1); if(h != 0.0) { for(unsigned int k = 0; k <= i; ++k) { d(k) = a(k, i+1) / h; } for(unsigned int j = 0; j <= i; ++j) { T g = 0.0; for(unsigned int k = 0; k <= i; ++k) { g += a(k, i+1) * a(k, j); } for(unsigned int k = 0; k <= i; ++k) { a(k, j) -= g * d(k); } } } for(unsigned int k = 0; k <= i; ++k) { a(k, i+1) = 0.0; } } for(unsigned int j = 0; j < n; ++j) { d(j) = a(n-1, j); a(n-1, j) = 0.0; } a(n-1, n-1) = 1.0; e(0) = 0.0; } // code adapted from JAMA // de and z will be overwritten template bool tridiagonalMatrixEigensystem(MultiArrayView<2, T, C1> &de, MultiArrayView<2, T, C2> &z) { const unsigned int n = rowCount(z); vigra_precondition(n == columnCount(z), "tridiagonalMatrixEigensystem(): matrix must be square."); vigra_precondition(n == rowCount(de) && 2 <= columnCount(de), "tridiagonalMatrixEigensystem(): matrix size mismatch."); MultiArrayView<1, T, C2> d = de.bindOuter(0); MultiArrayView<1, T, C2> e = de.bindOuter(1); for(unsigned int i = 1; i < n; i++) { e(i-1) = e(i); } e(n-1) = 0.0; T f = 0.0; T tst1 = 0.0; T eps = VIGRA_CSTD::pow(2.0,-52.0); for(unsigned int l = 0; l < n; ++l) { // Find small subdiagonalMatrix element tst1 = std::max(tst1, abs(d(l)) + abs(e(l))); unsigned int m = l; // Original while-loop from Java code while(m < n) { if(abs(e(m)) <= eps*tst1) break; ++m; } // If m == l, d(l) is an eigenvalue, // otherwise, iterate. if(m > l) { int iter = 0; do { if(++iter > 50) return false; // too many iterations // Compute implicit shift T g = d(l); T p = (d(l+1) - g) / (2.0 * e(l)); T r = hypot(p,1.0); if(p < 0) { r = -r; } d(l) = e(l) / (p + r); d(l+1) = e(l) * (p + r); T dl1 = d(l+1); T h = g - d(l); for(unsigned int i = l+2; i < n; ++i) { d(i) -= h; } f = f + h; // Implicit QL transformation. p = d(m); T c = 1.0; T c2 = c; T c3 = c; T el1 = e(l+1); T s = 0.0; T s2 = 0.0; for(int i = m-1; i >= (int)l; --i) { c3 = c2; c2 = c; s2 = s; g = c * e(i); h = c * p; r = hypot(p,e(i)); e(i+1) = s * r; s = e(i) / r; c = p / r; p = c * d(i) - s * g; d(i+1) = h + s * (c * g + s * d(i)); // Accumulate transformation. for(unsigned int k = 0; k < n; ++k) { h = z(k, i+1); z(k, i+1) = s * z(k, i) + c * h; z(k, i) = c * z(k, i) - s * h; } } p = -s * s2 * c3 * el1 * e(l) / dl1; e(l) = s * p; d(l) = c * p; // Check for convergence. } while(abs(e(l)) > eps*tst1); } d(l) = d(l) + f; e(l) = 0.0; } // Sort eigenvalues and corresponding vectors. for(unsigned int i = 0; i < n-1; ++i) { int k = i; T p = abs(d(i)); for(unsigned int j = i+1; j < n; ++j) { T p1 = abs(d(j)); if(p < p1) { k = j; p = p1; } } if(k != i) { std::swap(d(k), d(i)); for(unsigned int j = 0; j < n; ++j) { std::swap(z(j, i), z(j, k)); } } } return true; } // Nonsymmetric reduction to Hessenberg form. template void nonsymmetricHessenbergReduction(MultiArrayView<2, T, C1> & H, MultiArrayView<2, T, C2> & V) { // This is derived from the Algol procedures orthes and ortran, // by Martin and Wilkinson, Handbook for Auto. Comp., // Vol.ii-Linear Algebra, and the corresponding // Fortran subroutines in EISPACK. int n = rowCount(H); int low = 0; int high = n-1; ArrayVector ort(n); for(int m = low+1; m <= high-1; ++m) { // Scale column. T scale = 0.0; for(int i = m; i <= high; ++i) { scale = scale + abs(H(i, m-1)); } if(scale != 0.0) { // Compute Householder transformation. T h = 0.0; for(int i = high; i >= m; --i) { ort[i] = H(i, m-1)/scale; h += sq(ort[i]); } T g = VIGRA_CSTD::sqrt(h); if(ort[m] > 0) { g = -g; } h = h - ort[m] * g; ort[m] = ort[m] - g; // Apply Householder similarity transformation // H = (I-u*u'/h)*H*(I-u*u')/h) for(int j = m; j < n; ++j) { T f = 0.0; for(int i = high; i >= m; --i) { f += ort[i]*H(i, j); } f = f/h; for(int i = m; i <= high; ++i) { H(i, j) -= f*ort[i]; } } for(int i = 0; i <= high; ++i) { T f = 0.0; for(int j = high; j >= m; --j) { f += ort[j]*H(i, j); } f = f/h; for(int j = m; j <= high; ++j) { H(i, j) -= f*ort[j]; } } ort[m] = scale*ort[m]; H(m, m-1) = scale*g; } } // Accumulate transformations (Algol's ortran). for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { V(i, j) = (i == j ? 1.0 : 0.0); } } for(int m = high-1; m >= low+1; --m) { if(H(m, m-1) != 0.0) { for(int i = m+1; i <= high; ++i) { ort[i] = H(i, m-1); } for(int j = m; j <= high; ++j) { T g = 0.0; for(int i = m; i <= high; ++i) { g += ort[i] * V(i, j); } // Double division avoids possible underflow g = (g / ort[m]) / H(m, m-1); for(int i = m; i <= high; ++i) { V(i, j) += g * ort[i]; } } } } } // Complex scalar division. template void cdiv(T xr, T xi, T yr, T yi, T & cdivr, T & cdivi) { T r,d; if(abs(yr) > abs(yi)) { r = yi/yr; d = yr + r*yi; cdivr = (xr + r*xi)/d; cdivi = (xi - r*xr)/d; } else { r = yr/yi; d = yi + r*yr; cdivr = (r*xr + xi)/d; cdivi = (r*xi - xr)/d; } } template int hessenbergQrDecompositionHelper(MultiArrayView<2, T, C> & H, int n, int l, double eps, T & p, T & q, T & r, T & s, T & w, T & x, T & y, T & z) { int m = n-2; while(m >= l) { z = H(m, m); r = x - z; s = y - z; p = (r * s - w) / H(m+1, m) + H(m, m+1); q = H(m+1, m+1) - z - r - s; r = H(m+2, m+1); s = abs(p) + abs(q) + abs(r); p = p / s; q = q / s; r = r / s; if(m == l) { break; } if(abs(H(m, m-1)) * (abs(q) + abs(r)) < eps * (abs(p) * (abs(H(m-1, m-1)) + abs(z) + abs(H(m+1, m+1))))) { break; } --m; } return m; } // Nonsymmetric reduction from Hessenberg to real Schur form. template bool hessenbergQrDecomposition(MultiArrayView<2, T, C1> & H, MultiArrayView<2, T, C2> & V, MultiArrayView<2, T, C3> & de) { // This is derived from the Algol procedure hqr2, // by Martin and Wilkinson, Handbook for Auto. Comp., // Vol.ii-Linear Algebra, and the corresponding // Fortran subroutine in EISPACK. // Initialize MultiArrayView<1, T, C3> d = de.bindOuter(0); MultiArrayView<1, T, C3> e = de.bindOuter(1); int nn = rowCount(H); int n = nn-1; int low = 0; int high = nn-1; T eps = VIGRA_CSTD::pow(2.0, sizeof(T) == sizeof(float) ? -23.0 : -52.0); T exshift = 0.0; T p=0,q=0,r=0,s=0,z=0,t,w,x,y; T norm = vigra::norm(H); // Outer loop over eigenvalue index int iter = 0; while(n >= low) { // Look for single small sub-diagonal element int l = n; while (l > low) { s = abs(H(l-1, l-1)) + abs(H(l, l)); if(s == 0.0) { s = norm; } if(abs(H(l, l-1)) < eps * s) { break; } --l; } // Check for convergence // One root found if(l == n) { H(n, n) = H(n, n) + exshift; d(n) = H(n, n); e(n) = 0.0; --n; iter = 0; // Two roots found } else if(l == n-1) { w = H(n, n-1) * H(n-1, n); p = (H(n-1, n-1) - H(n, n)) / 2.0; q = p * p + w; z = VIGRA_CSTD::sqrt(abs(q)); H(n, n) = H(n, n) + exshift; H(n-1, n-1) = H(n-1, n-1) + exshift; x = H(n, n); // Real pair if(q >= 0) { if(p >= 0) { z = p + z; } else { z = p - z; } d(n-1) = x + z; d(n) = d(n-1); if(z != 0.0) { d(n) = x - w / z; } e(n-1) = 0.0; e(n) = 0.0; x = H(n, n-1); s = abs(x) + abs(z); p = x / s; q = z / s; r = VIGRA_CSTD::sqrt(p * p+q * q); p = p / r; q = q / r; // Row modification for(int j = n-1; j < nn; ++j) { z = H(n-1, j); H(n-1, j) = q * z + p * H(n, j); H(n, j) = q * H(n, j) - p * z; } // Column modification for(int i = 0; i <= n; ++i) { z = H(i, n-1); H(i, n-1) = q * z + p * H(i, n); H(i, n) = q * H(i, n) - p * z; } // Accumulate transformations for(int i = low; i <= high; ++i) { z = V(i, n-1); V(i, n-1) = q * z + p * V(i, n); V(i, n) = q * V(i, n) - p * z; } // Complex pair } else { d(n-1) = x + p; d(n) = x + p; e(n-1) = z; e(n) = -z; } n = n - 2; iter = 0; // No convergence yet } else { // Form shift x = H(n, n); y = 0.0; w = 0.0; if(l < n) { y = H(n-1, n-1); w = H(n, n-1) * H(n-1, n); } // Wilkinson's original ad hoc shift if(iter == 10) { exshift += x; for(int i = low; i <= n; ++i) { H(i, i) -= x; } s = abs(H(n, n-1)) + abs(H(n-1, n-2)); x = y = 0.75 * s; w = -0.4375 * s * s; } // MATLAB's new ad hoc shift if(iter == 30) { s = (y - x) / 2.0; s = s * s + w; if(s > 0) { s = VIGRA_CSTD::sqrt(s); if(y < x) { s = -s; } s = x - w / ((y - x) / 2.0 + s); for(int i = low; i <= n; ++i) { H(i, i) -= s; } exshift += s; x = y = w = 0.964; } } iter = iter + 1; if(iter > 60) return false; // Look for two consecutive small sub-diagonal elements int m = hessenbergQrDecompositionHelper(H, n, l, eps, p, q, r, s, w, x, y, z); for(int i = m+2; i <= n; ++i) { H(i, i-2) = 0.0; if(i > m+2) { H(i, i-3) = 0.0; } } // Double QR step involving rows l:n and columns m:n for(int k = m; k <= n-1; ++k) { int notlast = (k != n-1); if(k != m) { p = H(k, k-1); q = H(k+1, k-1); r = (notlast ? H(k+2, k-1) : 0.0); x = abs(p) + abs(q) + abs(r); if(x != 0.0) { p = p / x; q = q / x; r = r / x; } } if(x == 0.0) { break; } s = VIGRA_CSTD::sqrt(p * p + q * q + r * r); if(p < 0) { s = -s; } if(s != 0) { if(k != m) { H(k, k-1) = -s * x; } else if(l != m) { H(k, k-1) = -H(k, k-1); } p = p + s; x = p / s; y = q / s; z = r / s; q = q / p; r = r / p; // Row modification for(int j = k; j < nn; ++j) { p = H(k, j) + q * H(k+1, j); if(notlast) { p = p + r * H(k+2, j); H(k+2, j) = H(k+2, j) - p * z; } H(k, j) = H(k, j) - p * x; H(k+1, j) = H(k+1, j) - p * y; } // Column modification for(int i = 0; i <= std::min(n,k+3); ++i) { p = x * H(i, k) + y * H(i, k+1); if(notlast) { p = p + z * H(i, k+2); H(i, k+2) = H(i, k+2) - p * r; } H(i, k) = H(i, k) - p; H(i, k+1) = H(i, k+1) - p * q; } // Accumulate transformations for(int i = low; i <= high; ++i) { p = x * V(i, k) + y * V(i, k+1); if(notlast) { p = p + z * V(i, k+2); V(i, k+2) = V(i, k+2) - p * r; } V(i, k) = V(i, k) - p; V(i, k+1) = V(i, k+1) - p * q; } } // (s != 0) } // k loop } // check convergence } // while (n >= low) // Backsubstitute to find vectors of upper triangular form if(norm == 0.0) { return false; } for(n = nn-1; n >= 0; --n) { p = d(n); q = e(n); // Real vector if(q == 0) { int l = n; H(n, n) = 1.0; for(int i = n-1; i >= 0; --i) { w = H(i, i) - p; r = 0.0; for(int j = l; j <= n; ++j) { r = r + H(i, j) * H(j, n); } if(e(i) < 0.0) { z = w; s = r; } else { l = i; if(e(i) == 0.0) { if(w != 0.0) { H(i, n) = -r / w; } else { H(i, n) = -r / (eps * norm); } // Solve real equations } else { x = H(i, i+1); y = H(i+1, i); q = (d(i) - p) * (d(i) - p) + e(i) * e(i); t = (x * s - z * r) / q; H(i, n) = t; if(abs(x) > abs(z)) { H(i+1, n) = (-r - w * t) / x; } else { H(i+1, n) = (-s - y * t) / z; } } // Overflow control t = abs(H(i, n)); if((eps * t) * t > 1) { for(int j = i; j <= n; ++j) { H(j, n) = H(j, n) / t; } } } } // Complex vector } else if(q < 0) { int l = n-1; // Last vector component imaginary so matrix is triangular if(abs(H(n, n-1)) > abs(H(n-1, n))) { H(n-1, n-1) = q / H(n, n-1); H(n-1, n) = -(H(n, n) - p) / H(n, n-1); } else { cdiv(0.0,-H(n-1, n),H(n-1, n-1)-p,q, H(n-1, n-1), H(n-1, n)); } H(n, n-1) = 0.0; H(n, n) = 1.0; for(int i = n-2; i >= 0; --i) { T ra,sa,vr,vi; ra = 0.0; sa = 0.0; for(int j = l; j <= n; ++j) { ra = ra + H(j, n-1) * H(i, j); sa = sa + H(j, n) * H(i, j); } w = H(i, i) - p; if(e(i) < 0.0) { z = w; r = ra; s = sa; } else { l = i; if(e(i) == 0) { cdiv(-ra,-sa,w,q, H(i, n-1), H(i, n)); } else { // Solve complex equations x = H(i, i+1); y = H(i+1, i); vr = (d(i) - p) * (d(i) - p) + e(i) * e(i) - q * q; vi = (d(i) - p) * 2.0 * q; if((vr == 0.0) && (vi == 0.0)) { vr = eps * norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(z)); } cdiv(x*r-z*ra+q*sa,x*s-z*sa-q*ra,vr,vi, H(i, n-1), H(i, n)); if(abs(x) > (abs(z) + abs(q))) { H(i+1, n-1) = (-ra - w * H(i, n-1) + q * H(i, n)) / x; H(i+1, n) = (-sa - w * H(i, n) - q * H(i, n-1)) / x; } else { cdiv(-r-y*H(i, n-1),-s-y*H(i, n),z,q, H(i+1, n-1), H(i+1, n)); } } // Overflow control t = std::max(abs(H(i, n-1)),abs(H(i, n))); if((eps * t) * t > 1) { for(int j = i; j <= n; ++j) { H(j, n-1) = H(j, n-1) / t; H(j, n) = H(j, n) / t; } } } } } } // Back transformation to get eigenvectors of original matrix for(int j = nn-1; j >= low; --j) { for(int i = low; i <= high; ++i) { z = 0.0; for(int k = low; k <= std::min(j,high); ++k) { z = z + V(i, k) * H(k, j); } V(i, j) = z; } } return true; } } // namespace detail /** \addtogroup MatrixAlgebra */ //@{ /** Compute the eigensystem of a symmetric matrix. \a a is a real symmetric matrix, \a ew is a single-column matrix holding the eigenvalues, and \a ev is a matrix of the same size as \a a whose columns are the corresponding eigenvectors. Eigenvalues will be sorted from largest to smallest magnitude. The algorithm returns false when it doesn't converge. It can be applied in-place, i.e. &a == &ev is allowed. The code of this function was adapted from JAMA. \#include \<vigra/eigensystem.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool symmetricEigensystem(MultiArrayView<2, T, C1> const & a, MultiArrayView<2, T, C2> & ew, MultiArrayView<2, T, C3> & ev) { vigra_precondition(isSymmetric(a), "symmetricEigensystem(): symmetric input matrix required."); unsigned int acols = columnCount(a); vigra_precondition(1 == columnCount(ew) && acols == rowCount(ew) && acols == columnCount(ev) && acols == rowCount(ev), "symmetricEigensystem(): matrix shape mismatch."); ev.copy(a); // does nothing if &ev == &a Matrix de(acols, 2); detail::housholderTridiagonalization(ev, de); if(!detail::tridiagonalMatrixEigensystem(de, ev)) return false; ew.copy(columnVector(de, 0)); return true; } /** Compute the eigensystem of a square, but not necessarily symmetric matrix. \a a is a real square matrix, \a ew is a single-column matrix holding the possibly complex eigenvalues, and \a ev is a matrix of the same size as \a a whose columns are the corresponding eigenvectors. Eigenvalues will be sorted from largest to smallest magnitude. The algorithm returns false when it doesn't converge. It can be applied in-place, i.e. &a == &ev is allowed. The code of this function was adapted from JAMA. \#include \<vigra/eigensystem.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool nonsymmetricEigensystem(MultiArrayView<2, T, C1> const & a, MultiArrayView<2, std::complex, C2> & ew, MultiArrayView<2, T, C3> & ev) { unsigned int acols = columnCount(a); vigra_precondition(acols == rowCount(a), "nonsymmetricEigensystem(): square input matrix required."); vigra_precondition(1 == columnCount(ew) && acols == rowCount(ew) && acols == columnCount(ev) && acols == rowCount(ev), "nonsymmetricEigensystem(): matrix shape mismatch."); Matrix H(a); Matrix de(acols, 2); detail::nonsymmetricHessenbergReduction(H, ev); if(!detail::hessenbergQrDecomposition(H, ev, de)) return false; for(unsigned int i=0; i < acols; ++i) { ew(i,0) = std::complex(de(i, 0), de(i, 1)); } return true; } /** Compute the roots of a polynomial using the eigenvalue method. \a poly is a real polynomial (compatible to \ref vigra::PolynomialView), and \a roots a complex valued vector (compatible to std::vector with a value_type compatible to the type POLYNOMIAL::Complex) to which the roots are appended. The function calls \ref nonsymmetricEigensystem() with the standard companion matrix yielding the roots as eigenvalues. It returns false if it fails to converge. \#include \<vigra/eigensystem.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg \see polynomialRoots(), vigra::Polynomial */ template bool polynomialRootsEigenvalueMethod(POLYNOMIAL const & poly, VECTOR & roots, bool polishRoots) { typedef typename POLYNOMIAL::value_type T; typedef typename POLYNOMIAL::Real Real; typedef typename POLYNOMIAL::Complex Complex; typedef Matrix TMatrix; typedef Matrix ComplexMatrix; int const degree = poly.order(); double const eps = poly.epsilon(); TMatrix inMatrix(degree, degree); for(int i = 0; i < degree; ++i) inMatrix(0, i) = -poly[degree - i - 1] / poly[degree]; for(int i = 0; i < degree - 1; ++i) inMatrix(i + 1, i) = NumericTraits::one(); ComplexMatrix ew(degree, 1); TMatrix ev(degree, degree); bool success = nonsymmetricEigensystem(inMatrix, ew, ev); if(!success) return false; for(int i = 0; i < degree; ++i) { if(polishRoots) vigra::detail::laguerre1Root(poly, ew(i,0), 1); roots.push_back(vigra::detail::deleteBelowEpsilon(ew(i,0), eps)); } std::sort(roots.begin(), roots.end(), vigra::detail::PolynomialRootCompare(eps)); return true; } template bool polynomialRootsEigenvalueMethod(POLYNOMIAL const & poly, VECTOR & roots) { return polynomialRootsEigenvalueMethod(poly, roots, true); } /** Compute the real roots of a real polynomial using the eigenvalue method. \a poly is a real polynomial (compatible to \ref vigra::PolynomialView), and \a roots a real valued vector (compatible to std::vector with a value_type compatible to the type POLYNOMIAL::Real) to which the roots are appended. The function calls \ref polynomialRootsEigenvalueMethod() and throws away all complex roots. It returns false if it fails to converge. \#include \<vigra/eigensystem.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg \see polynomialRealRoots(), vigra::Polynomial */ template bool polynomialRealRootsEigenvalueMethod(POLYNOMIAL const & p, VECTOR & roots, bool polishRoots) { typedef typename NumericTraits::ComplexPromote Complex; ArrayVector croots; if(!polynomialRootsEigenvalueMethod(p, croots)) return false; for(unsigned int i = 0; i < croots.size(); ++i) if(croots[i].imag() == 0.0) roots.push_back(croots[i].real()); return true; } template bool polynomialRealRootsEigenvalueMethod(POLYNOMIAL const & p, VECTOR & roots) { return polynomialRealRootsEigenvalueMethod(p, roots, true); } //@} } // namespace linalg using linalg::symmetricEigensystem; using linalg::nonsymmetricEigensystem; using linalg::polynomialRootsEigenvalueMethod; using linalg::polynomialRealRootsEigenvalueMethod; } // namespace vigra #endif // VIGRA_EIGENSYSTEM_HXX gamera-3.3.3/include/vigra/error.hxx0000644000076500000000000002433311261456425016372 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_ERROR_HXX #define VIGRA_ERROR_HXX #include #include #include #include "config.hxx" /*! \page ErrorReporting Error Reporting Exceptions and assertions provided by VIGRA \#include \<vigra/error.hxx\> VIGRA defines the following exception classes: \code namespace vigra { class ContractViolation : public std::exception; class PreconditionViolation : public ContractViolation; class PostconditionViolation : public ContractViolation; class InvariantViolation : public ContractViolation; } \endcode The following associated macros throw the corresponding exception if their PREDICATE evaluates to 'false': \code vigra_precondition(PREDICATE, MESSAGE); vigra_postcondition(PREDICATE, MESSAGE); vigra_invariant(PREDICATE, MESSAGE); \endcode The MESSAGE is passed to the exception and can be retrieved via the overloaded member function 'exception.what()'. If the compiler flag 'NDEBUG' is not defined, the file name and line number of the error are automatically included in the message. The macro \code vigra_assert(PREDICATE, MESSAGE); \endcode is identical to vigra_precondition() except that it is completely removed when 'NDEBUG' is defined. This is useful for test that are only needed during debugging, such as array index bound checking. The following macro \code vigra_fail(MESSAGE); \endcode unconditionally throws a 'std::runtime_error' constructed from the message (along with file name and line number, if NDEBUG is not set). Usage: Include-File: \<vigra/error.hxx\>

Namespace: vigra (except for the macros, of course) \code int main(int argc, char ** argv) { try { const char* input_file_name = argv[1]; // read input image vigra::ImageImportInfo info(input_file_name); // fail if input image is not grayscale vigra_precondition(info.isGrayscale(), "Input image must be grayscale"); ...// process image } catch (std::exception & e) { std::cerr << e.what() << std::endl; // print message return 1; } return 0; } \endcode **/ namespace vigra { class ContractViolation : public StdException { public: ContractViolation(char const * prefix, char const * message, char const * file, int line) { sprintf(what_, "\n%.30s\n%.900s\n(%.100s:%d)\n", prefix, message, file, line); } ContractViolation(char const * prefix, char const * message) { sprintf(what_, "\n%.30s\n%.900s\n", prefix, message); } virtual const char * what() const throw() { return what_; } private: enum { bufsize_ = 1100 }; char what_[bufsize_]; }; class PreconditionViolation : public ContractViolation { public: PreconditionViolation(char const * message, const char * file, int line) : ContractViolation("Precondition violation!", message, file, line) {} PreconditionViolation(char const * message) : ContractViolation("Precondition violation!", message) {} }; class PostconditionViolation : public ContractViolation { public: PostconditionViolation(char const * message, const char * file, int line) : ContractViolation("Postcondition violation!", message, file, line) {} PostconditionViolation(char const * message) : ContractViolation("Postcondition violation!", message) {} }; class InvariantViolation : public ContractViolation { public: InvariantViolation(char const * message, const char * file, int line) : ContractViolation("Invariant violation!", message, file, line) {} InvariantViolation(char const * message) : ContractViolation("Invariant violation!", message) {} }; #ifndef NDEBUG inline void throw_invariant_error(bool predicate, char const * message, char const * file, int line) { if(!predicate) throw vigra::InvariantViolation(message, file, line); } inline void throw_invariant_error(bool predicate, std::string message, char const * file, int line) { if(!predicate) throw vigra::InvariantViolation(message.c_str(), file, line); } inline void throw_precondition_error(bool predicate, char const * message, char const * file, int line) { if(!predicate) throw vigra::PreconditionViolation(message, file, line); } inline void throw_precondition_error(bool predicate, std::string message, char const * file, int line) { if(!predicate) throw vigra::PreconditionViolation(message.c_str(), file, line); } inline void throw_postcondition_error(bool predicate, char const * message, char const * file, int line) { if(!predicate) throw vigra::PostconditionViolation(message, file, line); } inline void throw_postcondition_error(bool predicate, std::string message, char const * file, int line) { if(!predicate) throw vigra::PostconditionViolation(message.c_str(), file, line); } inline void throw_runtime_error(char const * message, char const * file, int line) { char what_[1100]; sprintf(what_, "\n%.900s\n(%.100s:%d)\n", message, file, line); throw std::runtime_error(what_); } inline void throw_runtime_error(std::string message, char const * file, int line) { char what_[1100]; sprintf(what_, "\n%.900s\n(%.100s:%d)\n", message.c_str(), file, line); throw std::runtime_error(what_); } #define vigra_precondition(PREDICATE, MESSAGE) vigra::throw_precondition_error((PREDICATE), MESSAGE, __FILE__, __LINE__) #define vigra_assert(PREDICATE, MESSAGE) vigra_precondition(PREDICATE, MESSAGE) #define vigra_postcondition(PREDICATE, MESSAGE) vigra::throw_postcondition_error((PREDICATE), MESSAGE, __FILE__, __LINE__) #define vigra_invariant(PREDICATE, MESSAGE) vigra::throw_invariant_error((PREDICATE), MESSAGE, __FILE__, __LINE__) #define vigra_fail(MESSAGE) vigra::throw_runtime_error(MESSAGE, __FILE__, __LINE__) #else // NDEBUG inline void throw_invariant_error(bool predicate, char const * message) { if(!predicate) throw vigra::InvariantViolation(message); } inline void throw_precondition_error(bool predicate, char const * message) { if(!predicate) throw vigra::PreconditionViolation(message); } inline void throw_postcondition_error(bool predicate, char const * message) { if(!predicate) throw vigra::PostconditionViolation(message); } inline void throw_invariant_error(bool predicate, std::string message) { if(!predicate) throw vigra::InvariantViolation(message.c_str()); } inline void throw_precondition_error(bool predicate, std::string message) { if(!predicate) throw vigra::PreconditionViolation(message.c_str()); } inline void throw_postcondition_error(bool predicate, std::string message) { if(!predicate) throw vigra::PostconditionViolation(message.c_str()); } #define vigra_precondition(PREDICATE, MESSAGE) vigra::throw_precondition_error((PREDICATE), MESSAGE) #define vigra_assert(PREDICATE, MESSAGE) #define vigra_postcondition(PREDICATE, MESSAGE) vigra::throw_postcondition_error((PREDICATE), MESSAGE) #define vigra_invariant(PREDICATE, MESSAGE) vigra::throw_invariant_error((PREDICATE), MESSAGE) #define vigra_fail(MESSAGE) throw std::runtime_error(MESSAGE) #endif // NDEBUG } // namespace vigra #endif // VIGRA_ERROR_HXX gamera-3.3.3/include/vigra/fftw.hxx0000644000076500000000000012332311261456425016206 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_FFTW_HXX #define VIGRA_FFTW_HXX #include #include #include "stdimage.hxx" #include "copyimage.hxx" #include "transformimage.hxx" #include "combineimages.hxx" #include "numerictraits.hxx" #include "imagecontainer.hxx" #include namespace vigra { /********************************************************/ /* */ /* FFTWComplex */ /* */ /********************************************************/ /* documentation: see fftw3.hxx */ class FFTWComplex : public fftw_complex { public: /** The complex' component type, as defined in 'fftw.h' */ typedef fftw_real value_type; /** reference type (result of operator[]) */ typedef fftw_real & reference; /** const reference type (result of operator[] const) */ typedef fftw_real const & const_reference; /** iterator type (result of begin() ) */ typedef fftw_real * iterator; /** const iterator type (result of begin() const) */ typedef fftw_real const * const_iterator; /** The norm type (result of magnitde()) */ typedef fftw_real NormType; /** The squared norm type (result of squaredMagnitde()) */ typedef fftw_real SquaredNormType; /** Construct from real and imaginary part. Default: 0. */ FFTWComplex(value_type const & ire = 0.0, value_type const & iim = 0.0) { re = ire; im = iim; } /** Copy constructor. */ FFTWComplex(FFTWComplex const & o) : fftw_complex(o) {} /** Construct from plain fftw_complex. */ FFTWComplex(fftw_complex const & o) : fftw_complex(o) {} /** Construct from TinyVector. */ template FFTWComplex(TinyVector const & o) { re = o[0]; im = o[1]; } /** Assignment. */ FFTWComplex& operator=(FFTWComplex const & o) { re = o.re; im = o.im; return *this; } /** Assignment. */ FFTWComplex& operator=(fftw_complex const & o) { re = o.re; im = o.im; return *this; } /** Assignment. */ FFTWComplex& operator=(fftw_real const & o) { re = o; im = 0.0; return *this; } /** Assignment. */ template FFTWComplex& operator=(TinyVector const & o) { re = o[0]; im = o[1]; return *this; } /** Unary negation. */ FFTWComplex operator-() const { return FFTWComplex(-re, -im); } /** Squared magnitude x*conj(x) */ SquaredNormType squaredMagnitude() const { return c_re(*this)*c_re(*this)+c_im(*this)*c_im(*this); } /** Magnitude (length of radius vector). */ NormType magnitude() const { return VIGRA_CSTD::sqrt(squaredMagnitude()); } /** Phase angle. */ value_type phase() const { return VIGRA_CSTD::atan2(c_im(*this),c_re(*this)); } /** Access components as if number were a vector. */ reference operator[](int i) { return (&re)[i]; } /** Read components as if number were a vector. */ const_reference operator[](int i) const { return (&re)[i]; } /** Length of complex number (always 2). */ int size() const { return 2; } iterator begin() { return &re; } iterator end() { return &re + 2; } const_iterator begin() const { return &re; } const_iterator end() const { return &re + 2; } }; /********************************************************/ /* */ /* FFTWComplex Traits */ /* */ /********************************************************/ /* documentation: see fftw3.hxx */ template<> struct NumericTraits { typedef fftw_complex Type; typedef fftw_complex Promote; typedef fftw_complex RealPromote; typedef fftw_complex ComplexPromote; typedef fftw_real ValueType; typedef VigraFalseType isIntegral; typedef VigraFalseType isScalar; typedef NumericTraits::isSigned isSigned; typedef VigraFalseType isOrdered; typedef VigraTrueType isComplex; static FFTWComplex zero() { return FFTWComplex(0.0, 0.0); } static FFTWComplex one() { return FFTWComplex(1.0, 0.0); } static FFTWComplex nonZero() { return one(); } static const Promote & toPromote(const Type & v) { return v; } static const RealPromote & toRealPromote(const Type & v) { return v; } static const Type & fromPromote(const Promote & v) { return v; } static const Type & fromRealPromote(const RealPromote & v) { return v; } }; template<> struct NumericTraits : public NumericTraits { typedef FFTWComplex Type; typedef FFTWComplex Promote; typedef FFTWComplex RealPromote; typedef FFTWComplex ComplexPromote; typedef fftw_real ValueType; typedef VigraFalseType isIntegral; typedef VigraFalseType isScalar; typedef NumericTraits::isSigned isSigned; typedef VigraFalseType isOrdered; typedef VigraTrueType isComplex; }; template<> struct NormTraits { typedef fftw_complex Type; typedef fftw_real SquaredNormType; typedef fftw_real NormType; }; template<> struct NormTraits { typedef FFTWComplex Type; typedef fftw_real SquaredNormType; typedef fftw_real NormType; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; /********************************************************/ /* */ /* FFTWComplex Operations */ /* */ /********************************************************/ /* documentation: see fftw3.hxx */ inline bool operator ==(FFTWComplex const &a, const FFTWComplex &b) { return c_re(a) == c_re(b) && c_im(a) == c_im(b); } inline bool operator !=(FFTWComplex const &a, const FFTWComplex &b) { return c_re(a) != c_re(b) || c_im(a) != c_im(b); } inline FFTWComplex &operator +=(FFTWComplex &a, const FFTWComplex &b) { c_re(a) += c_re(b); c_im(a) += c_im(b); return a; } inline FFTWComplex &operator -=(FFTWComplex &a, const FFTWComplex &b) { c_re(a) -= c_re(b); c_im(a) -= c_im(b); return a; } inline FFTWComplex &operator *=(FFTWComplex &a, const FFTWComplex &b) { FFTWComplex::value_type t = c_re(a)*c_re(b)-c_im(a)*c_im(b); c_im(a) = c_re(a)*c_im(b)+c_im(a)*c_re(b); c_re(a) = t; return a; } inline FFTWComplex &operator /=(FFTWComplex &a, const FFTWComplex &b) { FFTWComplex::value_type sm = b.squaredMagnitude(); FFTWComplex::value_type t = (c_re(a)*c_re(b)+c_im(a)*c_im(b))/sm; c_im(a) = (c_re(b)*c_im(a)-c_re(a)*c_im(b))/sm; c_re(a) = t; return a; } inline FFTWComplex &operator *=(FFTWComplex &a, const double &b) { c_re(a) *= b; c_im(a) *= b; return a; } inline FFTWComplex &operator /=(FFTWComplex &a, const double &b) { c_re(a) /= b; c_im(a) /= b; return a; } inline FFTWComplex operator +(FFTWComplex a, const FFTWComplex &b) { a += b; return a; } inline FFTWComplex operator -(FFTWComplex a, const FFTWComplex &b) { a -= b; return a; } inline FFTWComplex operator *(FFTWComplex a, const FFTWComplex &b) { a *= b; return a; } inline FFTWComplex operator *(FFTWComplex a, const double &b) { a *= b; return a; } inline FFTWComplex operator *(const double &a, FFTWComplex b) { b *= a; return b; } inline FFTWComplex operator /(FFTWComplex a, const FFTWComplex &b) { a /= b; return a; } inline FFTWComplex operator /(FFTWComplex a, const double &b) { a /= b; return a; } using VIGRA_CSTD::abs; inline FFTWComplex::value_type abs(const FFTWComplex &a) { return a.magnitude(); } inline FFTWComplex conj(const FFTWComplex &a) { return FFTWComplex(a.re, -a.im); } inline FFTWComplex::NormType norm(const FFTWComplex &a) { return a.magnitude(); } inline FFTWComplex::SquaredNormType squaredNorm(const FFTWComplex &a) { return a.squaredMagnitude(); } /********************************************************/ /* */ /* FFTWRealImage */ /* */ /********************************************************/ /* documentation: see fftw3.hxx */ typedef BasicImage FFTWRealImage; /********************************************************/ /* */ /* FFTWComplexImage */ /* */ /********************************************************/ template<> struct IteratorTraits< BasicImageIterator > { typedef BasicImageIterator Iterator; typedef Iterator iterator; typedef BasicImageIterator mutable_iterator; typedef ConstBasicImageIterator const_iterator; typedef iterator::iterator_category iterator_category; typedef iterator::value_type value_type; typedef iterator::reference reference; typedef iterator::index_reference index_reference; typedef iterator::pointer pointer; typedef iterator::difference_type difference_type; typedef iterator::row_iterator row_iterator; typedef iterator::column_iterator column_iterator; typedef VectorAccessor default_accessor; typedef VectorAccessor DefaultAccessor; typedef VigraTrueType hasConstantStrides; }; template<> struct IteratorTraits< ConstBasicImageIterator > { typedef ConstBasicImageIterator Iterator; typedef Iterator iterator; typedef BasicImageIterator mutable_iterator; typedef ConstBasicImageIterator const_iterator; typedef iterator::iterator_category iterator_category; typedef iterator::value_type value_type; typedef iterator::reference reference; typedef iterator::index_reference index_reference; typedef iterator::pointer pointer; typedef iterator::difference_type difference_type; typedef iterator::row_iterator row_iterator; typedef iterator::column_iterator column_iterator; typedef VectorAccessor default_accessor; typedef VectorAccessor DefaultAccessor; typedef VigraTrueType hasConstantStrides; }; /* documentation: see fftw3.hxx */ typedef BasicImage FFTWComplexImage; /********************************************************/ /* */ /* FFTWComplex-Accessors */ /* */ /********************************************************/ /* documentation: see fftw3.hxx */ class FFTWRealAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /// Read real part at iterator position. template value_type operator()(ITERATOR const & i) const { return c_re(*i); } /// Read real part at offset from iterator position. template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return c_re(i[d]); } /// Write real part at iterator position. template void set(value_type const & v, ITERATOR const & i) const { c_re(*i)= v; } /// Write real part at offset from iterator position. template void set(value_type const & v, ITERATOR const & i, DIFFERENCE d) const { c_re(i[d])= v; } }; /* documentation: see fftw3.hxx */ class FFTWImaginaryAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /// Read imaginary part at iterator position. template value_type operator()(ITERATOR const & i) const { return c_im(*i); } /// Read imaginary part at offset from iterator position. template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return c_im(i[d]); } /// Write imaginary part at iterator position. template void set(value_type const & v, ITERATOR const & i) const { c_im(*i)= v; } /// Write imaginary part at offset from iterator position. template void set(value_type const & v, ITERATOR const & i, DIFFERENCE d) const { c_im(i[d])= v; } }; /* documentation: see fftw3.hxx */ class FFTWWriteRealAccessor: public FFTWRealAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /** Write real number at iterator position. Set imaginary part to 0. */ template void set(value_type const & v, ITERATOR const & i) const { c_re(*i)= v; c_im(*i)= 0; } /** Write real number at offset from iterator position. Set imaginary part to 0. */ template void set(value_type const & v, ITERATOR const & i, DIFFERENCE d) const { c_re(i[d])= v; c_im(i[d])= 0; } }; /* documentation: see fftw3.hxx */ class FFTWMagnitudeAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /// Read magnitude at iterator position. template value_type operator()(ITERATOR const & i) const { return (*i).magnitude(); } /// Read magnitude at offset from iterator position. template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return (i[d]).magnitude(); } }; /* documentation: see fftw3.hxx */ class FFTWPhaseAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /// Read phase at iterator position. template value_type operator()(ITERATOR const & i) const { return (*i).phase(); } /// Read phase at offset from iterator position. template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return (i[d]).phase(); } }; /********************************************************/ /* */ /* Fourier Transform */ /* */ /********************************************************/ /** \page FourierTransformFFTW2 Fast Fourier Transform This documentation describes the deprecated VIGRA interface to FFTW 2. Use the \link FourierTransform interface to the newer version FFTW 3\endlink instead. VIGRA uses the FFTW Fast Fourier Transform package to perform Fourier transformations. VIGRA provides a wrapper for FFTW's complex number type (FFTWComplex), but FFTW's functions are used verbatim. If the image is stored as a FFTWComplexImage, a FFT is performed like this: \code vigra::FFTWComplexImage spatial(width,height), fourier(width,height); ... // fill image with data // create a plan for optimal performance fftwnd_plan forwardPlan= fftw2d_create_plan(height, width, FFTW_FORWARD, FFTW_ESTIMATE ); // calculate FFT fftwnd_one(forwardPlan, spatial.begin(), fourier.begin()); \endcode Note that in the creation of a plan, the height must be given first. Note also that spatial.begin() may only be passed to fftwnd_one if the transform shall be applied to the entire image. When you want to retrict operation to an ROI, you create a copy of the ROI in an image of appropriate size. More information on using FFTW can be found here. FFTW produces fourier images that have the DC component (the origin of the Fourier space) in the upper left corner. Often, one wants the origin in the center of the image, so that frequencies always increase towards the border of the image. This can be achieved by calling \ref moveDCToCenter(). The inverse transformation is done by \ref moveDCToUpperLeft(). \#include \<vigra/fftw.hxx\>
Namespace: vigra */ /********************************************************/ /* */ /* moveDCToCenter */ /* */ /********************************************************/ /* documentation: see fftw3.hxx */ template void moveDCToCenter(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da) { int w= src_lowerright.x - src_upperleft.x; int h= src_lowerright.y - src_upperleft.y; int w1 = w/2; int h1 = h/2; int w2 = (w+1)/2; int h2 = (h+1)/2; // 2. Quadrant zum 4. copyImage(srcIterRange(src_upperleft, src_upperleft + Diff2D(w2, h2), sa), destIter (dest_upperleft + Diff2D(w1, h1), da)); // 4. Quadrant zum 2. copyImage(srcIterRange(src_upperleft + Diff2D(w2, h2), src_lowerright, sa), destIter (dest_upperleft, da)); // 1. Quadrant zum 3. copyImage(srcIterRange(src_upperleft + Diff2D(w2, 0), src_upperleft + Diff2D(w, h2), sa), destIter (dest_upperleft + Diff2D(0, h1), da)); // 3. Quadrant zum 1. copyImage(srcIterRange(src_upperleft + Diff2D(0, h2), src_upperleft + Diff2D(w2, h), sa), destIter (dest_upperleft + Diff2D(w1, 0), da)); } template inline void moveDCToCenter( triple src, pair dest) { moveDCToCenter(src.first, src.second, src.third, dest.first, dest.second); } /********************************************************/ /* */ /* moveDCToUpperLeft */ /* */ /********************************************************/ /* documentation: see fftw3.hxx */ template void moveDCToUpperLeft(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da) { int w= src_lowerright.x - src_upperleft.x; int h= src_lowerright.y - src_upperleft.y; int w2 = w/2; int h2 = h/2; int w1 = (w+1)/2; int h1 = (h+1)/2; // 2. Quadrant zum 4. copyImage(srcIterRange(src_upperleft, src_upperleft + Diff2D(w2, h2), sa), destIter (dest_upperleft + Diff2D(w1, h1), da)); // 4. Quadrant zum 2. copyImage(srcIterRange(src_upperleft + Diff2D(w2, h2), src_lowerright, sa), destIter (dest_upperleft, da)); // 1. Quadrant zum 3. copyImage(srcIterRange(src_upperleft + Diff2D(w2, 0), src_upperleft + Diff2D(w, h2), sa), destIter (dest_upperleft + Diff2D(0, h1), da)); // 3. Quadrant zum 1. copyImage(srcIterRange(src_upperleft + Diff2D(0, h2), src_upperleft + Diff2D(w2, h), sa), destIter (dest_upperleft + Diff2D(w1, 0), da)); } template inline void moveDCToUpperLeft( triple src, pair dest) { moveDCToUpperLeft(src.first, src.second, src.third, dest.first, dest.second); } /********************************************************/ /* */ /* applyFourierFilter */ /* */ /********************************************************/ /* documentation: see fftw3.hxx */ // applyFourierFilter versions without fftwnd_plans: template inline void applyFourierFilter(triple src, pair filter, pair dest) { applyFourierFilter(src.first, src.second, src.third, filter.first, filter.second, dest.first, dest.second); } template void applyFourierFilter(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da) { // copy real input images into a complex one... int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage, FFTWWriteRealAccessor())); // ...and call the impl FFTWComplexImage const & cworkImage = workImage; applyFourierFilterImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filterUpperLeft, fa, destUpperLeft, da); } typedef FFTWComplexImage::const_traverser FFTWConstTraverser; template inline void applyFourierFilter( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da) { int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; // test for right memory layout (fftw expects a 2*width*height floats array) if (&(*(srcUpperLeft + Diff2D(w, 0))) == &(*(srcUpperLeft + Diff2D(0, 1)))) applyFourierFilterImpl(srcUpperLeft, srcLowerRight, sa, filterUpperLeft, fa, destUpperLeft, da); else { FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage)); FFTWComplexImage const & cworkImage = workImage; applyFourierFilterImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filterUpperLeft, fa, destUpperLeft, da); } } template void applyFourierFilterImpl( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da) { // create plans and call variant with plan parameters int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; fftwnd_plan forwardPlan= fftw2d_create_plan(h, w, FFTW_FORWARD, FFTW_ESTIMATE ); fftwnd_plan backwardPlan= fftw2d_create_plan(h, w, FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_IN_PLACE); applyFourierFilterImpl(srcUpperLeft, srcLowerRight, sa, filterUpperLeft, fa, destUpperLeft, da, forwardPlan, backwardPlan); fftwnd_destroy_plan(forwardPlan); fftwnd_destroy_plan(backwardPlan); } // applyFourierFilter versions with fftwnd_plans: template inline void applyFourierFilter(triple src, pair filter, pair dest, const fftwnd_plan &forwardPlan, const fftwnd_plan &backwardPlan) { applyFourierFilter(src.first, src.second, src.third, filter.first, filter.second, dest.first, dest.second, forwardPlan, backwardPlan); } template void applyFourierFilter(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da, const fftwnd_plan &forwardPlan, const fftwnd_plan &backwardPlan) { int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage, FFTWWriteRealAccessor())); FFTWComplexImage const & cworkImage = workImage; applyFourierFilterImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filterUpperLeft, fa, destUpperLeft, da, forwardPlan, backwardPlan); } template inline void applyFourierFilter( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da, const fftwnd_plan &forwardPlan, const fftwnd_plan &backwardPlan) { applyFourierFilterImpl(srcUpperLeft, srcLowerRight, sa, filterUpperLeft, fa, destUpperLeft, da, forwardPlan, backwardPlan); } template void applyFourierFilterImpl( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da, const fftwnd_plan &forwardPlan, const fftwnd_plan &backwardPlan) { FFTWComplexImage complexResultImg(srcLowerRight - srcUpperLeft); // FFT from srcImage to complexResultImg fftwnd_one(forwardPlan, const_cast(&(*srcUpperLeft)), complexResultImg.begin()); // convolve in freq. domain (in complexResultImg) combineTwoImages(srcImageRange(complexResultImg), srcIter(filterUpperLeft, fa), destImage(complexResultImg), std::multiplies()); // FFT back into spatial domain (inplace in complexResultImg) fftwnd_one(backwardPlan, complexResultImg.begin(), 0); typedef typename NumericTraits::isScalar isScalarResult; // normalization (after FFTs), maybe stripping imaginary part applyFourierFilterImplNormalization(complexResultImg, destUpperLeft, da, isScalarResult()); } template void applyFourierFilterImplNormalization(FFTWComplexImage const &srcImage, DestImageIterator destUpperLeft, DestAccessor da, VigraFalseType) { double normFactor= 1.0/(srcImage.width() * srcImage.height()); for(int y=0; y(1.0/(srcImage.width() * srcImage.height()))); } template void applyFourierFilterImplNormalization(FFTWComplexImage const & srcImage, DestImageIterator destUpperLeft, DestAccessor da, VigraTrueType) { double normFactor= 1.0/(srcImage.width() * srcImage.height()); for(int y=0; y inline void applyFourierFilterFamily(triple src, const ImageArray &filters, ImageArray &results) { applyFourierFilterFamily(src.first, src.second, src.third, filters, results); } template void applyFourierFilterFamily(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, const ImageArray &filters, ImageArray &results) { int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage, FFTWWriteRealAccessor())); FFTWComplexImage const & cworkImage = workImage; applyFourierFilterFamilyImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filters, results); } template inline void applyFourierFilterFamily( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, const ImageArray &filters, ImageArray &results) { applyFourierFilterFamilyImpl(srcUpperLeft, srcLowerRight, sa, filters, results); } template void applyFourierFilterFamilyImpl( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, const ImageArray &filters, ImageArray &results) { int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; fftwnd_plan forwardPlan= fftw2d_create_plan(h, w, FFTW_FORWARD, FFTW_ESTIMATE ); fftwnd_plan backwardPlan= fftw2d_create_plan(h, w, FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_IN_PLACE); applyFourierFilterFamilyImpl(srcUpperLeft, srcLowerRight, sa, filters, results, forwardPlan, backwardPlan); fftwnd_destroy_plan(forwardPlan); fftwnd_destroy_plan(backwardPlan); } // applyFourierFilterFamily versions with fftwnd_plans: template inline void applyFourierFilterFamily(triple src, const ImageArray &filters, ImageArray &results, const fftwnd_plan &forwardPlan, const fftwnd_plan &backwardPlan) { applyFourierFilterFamily(src.first, src.second, src.third, filters, results, forwardPlan, backwardPlan); } template void applyFourierFilterFamily(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, const ImageArray &filters, ImageArray &results, const fftwnd_plan &forwardPlan, const fftwnd_plan &backwardPlan) { int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage, FFTWWriteRealAccessor())); FFTWComplexImage const & cworkImage = workImage; applyFourierFilterFamilyImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filters, results, forwardPlan, backwardPlan); } template inline void applyFourierFilterFamily( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, const ImageArray &filters, ImageArray &results, const fftwnd_plan &forwardPlan, const fftwnd_plan &backwardPlan) { int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; // test for right memory layout (fftw expects a 2*width*height floats array) if (&(*(srcUpperLeft + Diff2D(w, 0))) == &(*(srcUpperLeft + Diff2D(0, 1)))) applyFourierFilterFamilyImpl(srcUpperLeft, srcLowerRight, sa, filters, results, forwardPlan, backwardPlan); else { FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage)); FFTWComplexImage const & cworkImage = workImage; applyFourierFilterFamilyImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filters, results, forwardPlan, backwardPlan); } } template void applyFourierFilterFamilyImpl( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, const ImageArray &filters, ImageArray &results, const fftwnd_plan &forwardPlan, const fftwnd_plan &backwardPlan) { // make sure the filter images have the right dimensions vigra_precondition((srcLowerRight - srcUpperLeft) == filters.imageSize(), "applyFourierFilterFamily called with src image size != filters.imageSize()!"); // make sure the result image array has the right dimensions results.resize(filters.size()); results.resizeImages(filters.imageSize()); // FFT from srcImage to freqImage int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage freqImage(w, h); FFTWComplexImage result(w, h); fftwnd_one(forwardPlan, const_cast(&(*srcUpperLeft)), freqImage.begin()); typedef typename NumericTraits::isScalar isScalarResult; // convolve with filters in freq. domain for (unsigned int i= 0; i < filters.size(); i++) { combineTwoImages(srcImageRange(freqImage), srcImage(filters[i]), destImage(result), std::multiplies()); // FFT back into spatial domain (inplace in destImage) fftwnd_one(backwardPlan, result.begin(), 0); // normalization (after FFTs), maybe stripping imaginary part applyFourierFilterImplNormalization(result, results[i].upperLeft(), results[i].accessor(), isScalarResult()); } } } // namespace vigra #endif // VIGRA_FFTW_HXX gamera-3.3.3/include/vigra/fftw3.hxx0000644000076500000000000022004411261456425016267 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_FFTW3_HXX #define VIGRA_FFTW3_HXX #include #include #include "stdimage.hxx" #include "copyimage.hxx" #include "transformimage.hxx" #include "combineimages.hxx" #include "numerictraits.hxx" #include "imagecontainer.hxx" #include namespace vigra { typedef double fftw_real; /********************************************************/ /* */ /* FFTWComplex */ /* */ /********************************************************/ /** \brief Wrapper class for the FFTW type 'fftw_complex'. This class provides constructors and other member functions for the C struct 'fftw_complex'. This struct is the basic pixel type of the FFTW Fast Fourier Transform library. It inherits the data members 're' and 'im' that denote the real and imaginary part of the number. In addition it defines transformations to polar coordinates, as well as \ref FFTWComplexOperators "arithmetic operators" and \ref FFTWComplexAccessors "accessors". FFTWComplex implements the concepts \ref AlgebraicField and \ref DivisionAlgebra. The standard image types FFTWRealImage and FFTWComplexImage are defined. See also:

  • \ref FFTWComplexTraits
  • \ref FFTWComplexOperators
  • \ref FFTWComplexAccessors
\#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ class FFTWComplex { fftw_complex data_; public: /** The complex' component type, as defined in 'fftw3.h' */ typedef fftw_real value_type; /** reference type (result of operator[]) */ typedef fftw_real & reference; /** const reference type (result of operator[] const) */ typedef fftw_real const & const_reference; /** iterator type (result of begin() ) */ typedef fftw_real * iterator; /** const iterator type (result of begin() const) */ typedef fftw_real const * const_iterator; /** The norm type (result of magnitde()) */ typedef fftw_real NormType; /** The squared norm type (result of squaredMagnitde()) */ typedef fftw_real SquaredNormType; /** Construct from real and imaginary part. Default: 0. */ FFTWComplex(value_type const & re = 0.0, value_type const & im = 0.0) { data_[0] = re; data_[1] = im; } /** Copy constructor. */ FFTWComplex(FFTWComplex const & o) { data_[0] = o.data_[0]; data_[1] = o.data_[1]; } /** Construct from plain fftw_complex. */ FFTWComplex(fftw_complex const & o) { data_[0] = o[0]; data_[1] = o[1]; } /** Construct from TinyVector. */ template FFTWComplex(TinyVector const & o) { data_[0] = o[0]; data_[1] = o[1]; } /** Assignment. */ FFTWComplex& operator=(FFTWComplex const & o) { data_[0] = o.data_[0]; data_[1] = o.data_[1]; return *this; } /** Assignment. */ FFTWComplex& operator=(fftw_complex const & o) { data_[0] = o[0]; data_[1] = o[1]; return *this; } /** Assignment. */ FFTWComplex& operator=(fftw_real const & o) { data_[0] = o; data_[1] = 0.0; return *this; } /** Assignment. */ template FFTWComplex& operator=(TinyVector const & o) { data_[0] = o[0]; data_[1] = o[1]; return *this; } reference re() { return data_[0]; } const_reference re() const { return data_[0]; } reference im() { return data_[1]; } const_reference im() const { return data_[1]; } /** Unary negation. */ FFTWComplex operator-() const { return FFTWComplex(-data_[0], -data_[1]); } /** Squared magnitude x*conj(x) */ SquaredNormType squaredMagnitude() const { return data_[0]*data_[0]+data_[1]*data_[1]; } /** Magnitude (length of radius vector). */ NormType magnitude() const { return VIGRA_CSTD::sqrt(squaredMagnitude()); } /** Phase angle. */ value_type phase() const { return VIGRA_CSTD::atan2(data_[1], data_[0]); } /** Access components as if number were a vector. */ reference operator[](int i) { return data_[i]; } /** Read components as if number were a vector. */ const_reference operator[](int i) const { return data_[i]; } /** Length of complex number (always 2). */ int size() const { return 2; } iterator begin() { return data_; } iterator end() { return data_ + 2; } const_iterator begin() const { return data_; } const_iterator end() const { return data_ + 2; } }; /********************************************************/ /* */ /* FFTWComplexTraits */ /* */ /********************************************************/ /** \page FFTWComplexTraits Numeric and Promote Traits of FFTWComplex The numeric and promote traits for fftw_complex and FFTWComplex follow the general specifications for \ref NumericPromotionTraits and \ref AlgebraicField. They are explicitly specialized for the types involved: \code template<> struct NumericTraits { typedef fftw_complex Promote; typedef fftw_complex RealPromote; typedef fftw_complex ComplexPromote; typedef fftw_real ValueType; typedef VigraFalseType isIntegral; typedef VigraFalseType isScalar; typedef VigraFalseType isOrdered; typedef VigraTrueType isComplex; // etc. }; template<> struct NumericTraits { typedef FFTWComplex Promote; typedef FFTWComplex RealPromote; typedef FFTWComplex ComplexPromote; typedef fftw_real ValueType; typedef VigraFalseType isIntegral; typedef VigraFalseType isScalar; typedef VigraFalseType isOrdered; typedef VigraTrueType isComplex; // etc. }; template<> struct NormTraits { typedef fftw_complex Type; typedef fftw_real SquaredNormType; typedef fftw_real NormType; }; template<> struct NormTraits { typedef FFTWComplex Type; typedef fftw_real SquaredNormType; typedef fftw_real NormType; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; \endcode \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ template<> struct NumericTraits { typedef fftw_complex Type; typedef fftw_complex Promote; typedef fftw_complex RealPromote; typedef fftw_complex ComplexPromote; typedef fftw_real ValueType; typedef VigraFalseType isIntegral; typedef VigraFalseType isScalar; typedef NumericTraits::isSigned isSigned; typedef VigraFalseType isOrdered; typedef VigraTrueType isComplex; static FFTWComplex zero() { return FFTWComplex(0.0, 0.0); } static FFTWComplex one() { return FFTWComplex(1.0, 0.0); } static FFTWComplex nonZero() { return one(); } static const Promote & toPromote(const Type & v) { return v; } static const RealPromote & toRealPromote(const Type & v) { return v; } static const Type & fromPromote(const Promote & v) { return v; } static const Type & fromRealPromote(const RealPromote & v) { return v; } }; template<> struct NumericTraits { typedef FFTWComplex Type; typedef FFTWComplex Promote; typedef FFTWComplex RealPromote; typedef FFTWComplex ComplexPromote; typedef fftw_real ValueType; typedef VigraFalseType isIntegral; typedef VigraFalseType isScalar; typedef NumericTraits::isSigned isSigned; typedef VigraFalseType isOrdered; typedef VigraTrueType isComplex; static FFTWComplex zero() { return FFTWComplex(0.0, 0.0); } static FFTWComplex one() { return FFTWComplex(1.0, 0.0); } static FFTWComplex nonZero() { return one(); } static const Promote & toPromote(const Type & v) { return v; } static const RealPromote & toRealPromote(const Type & v) { return v; } static const Type & fromPromote(const Promote & v) { return v; } static const Type & fromRealPromote(const RealPromote & v) { return v; } }; template<> struct NormTraits { typedef fftw_complex Type; typedef fftw_real SquaredNormType; typedef fftw_real NormType; }; template<> struct NormTraits { typedef FFTWComplex Type; typedef fftw_real SquaredNormType; typedef fftw_real NormType; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef fftw_complex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; template <> struct PromoteTraits { typedef FFTWComplex Promote; }; /********************************************************/ /* */ /* FFTWComplex Operations */ /* */ /********************************************************/ /** \addtogroup FFTWComplexOperators Functions for FFTWComplex \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
These functions fulfill the requirements of an Algebraic Field. Return types are determined according to \ref FFTWComplexTraits. Namespace: vigra
  • \ref FixedPointOperations
  • \ref FixedPointTraits
\#include \<vigra/fixedpoint.hxx\>
Namespace: vigra */ template class FixedPoint { public: enum { INT_BITS = IntBits, FRACTIONAL_BITS = FractionalBits, TOTAL_BITS = IntBits + FractionalBits, MAX = (int)(((unsigned)1 << TOTAL_BITS) - 1), ONE = 1 << FractionalBits, ONE_HALF = ONE >> 1, FRACTIONAL_MASK = ONE - 1, INT_MASK = MAX ^ FRACTIONAL_MASK }; Int32 value; FixedPoint() { VIGRA_STATIC_ASSERT((FixedPoint_overflow_error__More_than_31_bits_requested<(IntBits + FractionalBits)>)); } /** Construct from an int (fractional part will become zero). */ explicit FixedPoint(int v) : value(v << FractionalBits) { VIGRA_STATIC_ASSERT((FixedPoint_overflow_error__More_than_31_bits_requested<(IntBits + FractionalBits)>)); } /** Construct from an int by a bitwise copy. This is normally only used internally. */ FixedPoint(int v, FixedPointNoShift) : value(v) { VIGRA_STATIC_ASSERT((FixedPoint_overflow_error__More_than_31_bits_requested<(IntBits + FractionalBits)>)); } /** Construct from an double and round the fractional part to FractionalBits accuracy. A PreconditionViolation exception is raised when the integer part is too small to represent the number. */ explicit FixedPoint(double rhs) : value((int)round(rhs * ONE)) { VIGRA_STATIC_ASSERT((FixedPoint_overflow_error__More_than_31_bits_requested<(IntBits + FractionalBits)>)); vigra_precondition(abs(rhs * ONE) <= (double)MAX, "FixedPoint(double rhs): Too few integer bits to convert rhs."); } /** Copy constructor. */ FixedPoint(const FixedPoint &other) : value(other.value) {} /** Construct from a FixedPoint with different layout. It rounds as appropriate and raises a compile-time error when the target type has too few integer bits. */ template FixedPoint(const FixedPoint &other) : value(detail::FPAssignWithRound<(Frac2 > FractionalBits)>::template exec(other.value)) { VIGRA_STATIC_ASSERT((FixedPoint_overflow_error__More_than_31_bits_requested<(IntBits + FractionalBits)>)); VIGRA_STATIC_ASSERT((FixedPoint_assignment_error__Target_object_has_too_few_integer_bits<(IntBits >= Int2)>)); } /** Assignment from int. The fractional part will become zero. A PreconditionViolation exception is raised when the integer part is too small to represent the number. */ FixedPoint &operator=(int rhs) { vigra_precondition(abs(rhs) < (1 << IntBits), "FixedPoint::operator=(int rhs): Too few integer bits to represent rhs."); value = rhs << FractionalBits; return *this; } /** Assignment form double. The fractional part is rounded, and a PreconditionViolation exception is raised when the integer part is too small to represent the number. */ FixedPoint &operator=(double rhs) { vigra_precondition(abs(rhs) <= ((1 << IntBits) - 1), "FixedPoint::operator=(double rhs): Too few integer bits to convert rhs."); value = (int)round(rhs * ONE); return *this; } /** Copy assignment. */ FixedPoint & operator=(const FixedPoint &other) { value = other.value; return *this; } /** Assignment from a FixedPoint with different layout. It rounds as appropriate and raises a compile-time error when the target type has too few integer bits. */ template FixedPoint & operator=(const FixedPoint &other) { VIGRA_STATIC_ASSERT((FixedPoint_assignment_error__Target_object_has_too_few_integer_bits<(IntBits >= Int2)>)); value = detail::FPAssignWithRound<(Frac2 > FractionalBits)>::template exec(other.value); return *this; } /** Negation. */ FixedPoint operator-() const { return FixedPoint(-value, FPNoShift); } /** Pre-increment. */ FixedPoint & operator++() { value += ONE; return *this; } /** Post-increment. */ FixedPoint operator++(int) { FixedPoint old(*this); value += ONE; return old; } /** Pre-decrement. */ FixedPoint & operator--() { value -= ONE; return *this; } /** Post-decrement. */ FixedPoint operator--(int) { FixedPoint old(*this); value -= ONE; return old; } /** Add-assignment from a FixedPoint with different layout. It rounds as appropriate and raises a compile-time error when the target type has too few integer bits. */ template FixedPoint & operator+=(const FixedPoint &other) { VIGRA_STATIC_ASSERT((FixedPoint_assignment_error__Target_object_has_too_few_integer_bits<(IntBits >= Int2)>)); value += detail::FPAssignWithRound<(Frac2 > FractionalBits)>::template exec(other.value); return *this; } /** Subtract-assignment from a FixedPoint with different layout. It rounds as appropriate and raises a compile-time error when the target type has too few integer bits. */ template FixedPoint & operator-=(const FixedPoint &other) { VIGRA_STATIC_ASSERT((FixedPoint_assignment_error__Target_object_has_too_few_integer_bits<(IntBits >= Int2)>)); value -= detail::FPAssignWithRound<(Frac2 > FractionalBits)>::template exec(other.value); return *this; } /** Multiply-assignment from a FixedPoint with different layout. It rounds as appropriate and raises a compile-time error when the target type has too few integer bits. */ template FixedPoint & operator*=(const FixedPoint &other) { VIGRA_STATIC_ASSERT((FixedPoint_assignment_error__Target_object_has_too_few_integer_bits<(IntBits >= Int2)>)); value = detail::FPMulImplementation<(Frac2 > 0)>::template exec(value, other.value); return *this; } }; #define VIGRA_FIXED_POINT_FACTORY(T, INTBITS) \ inline FixedPoint fixedPoint(T t) \ { \ return FixedPoint(t, FPNoShift); \ } VIGRA_FIXED_POINT_FACTORY(unsigned char, 8) VIGRA_FIXED_POINT_FACTORY(signed char, 7) VIGRA_FIXED_POINT_FACTORY(unsigned short, 16) VIGRA_FIXED_POINT_FACTORY(signed short, 15) VIGRA_FIXED_POINT_FACTORY(int, 31) #undef VIGRA_FIXED_POINT_FACTORY template struct FixedPointCast; #define VIGRA_FIXED_POINT_CAST(type) \ template <> \ struct FixedPointCast \ { \ template \ static type cast(FixedPoint v) \ { \ return round(v); \ } \ }; VIGRA_FIXED_POINT_CAST(Int8) VIGRA_FIXED_POINT_CAST(UInt8) VIGRA_FIXED_POINT_CAST(Int16) VIGRA_FIXED_POINT_CAST(UInt16) VIGRA_FIXED_POINT_CAST(Int32) VIGRA_FIXED_POINT_CAST(UInt32) #undef VIGRA_FIXED_POINT_CAST template <> struct FixedPointCast { template static float cast(FixedPoint v) { return (float)v.value / FixedPoint::ONE; } }; template <> struct FixedPointCast { template static double cast(FixedPoint v) { return (double)v.value / FixedPoint::ONE; } }; /********************************************************/ /* */ /* FixedPointOperations */ /* */ /********************************************************/ /** \addtogroup FixedPointOperations Functions for FixedPoint \brief \#include \<vigra/fixedpoint.hxx\>
These functions fulfill the requirements of an \ref AlgebraicRing. Namespace: vigra

*/ //@{ /** Convert a FixedPoint to a built-in type. If the target is integral, the value is rounded.
Usage: \code FixedPoint<16,15> fp(...); double d = fixed_point_cast(fp); \endcode */ template TARGET fixed_point_cast(FixedPoint v) { return FixedPointCast::cast(v); } /// equal template inline bool operator==(FixedPoint l, FixedPoint r) { enum { MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1 }; return (l.value << (MaxFracBits - FracBits1)) == (r.value << (MaxFracBits - FracBits2)); } /// not equal template inline bool operator!=(FixedPoint l, FixedPoint r) { enum { MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1 }; return (l.value << (MaxFracBits - FracBits1)) != (r.value << (MaxFracBits - FracBits2)); } /// less than template inline bool operator<(FixedPoint l, FixedPoint r) { enum { MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1 }; return (l.value << (MaxFracBits - FracBits1)) < (r.value << (MaxFracBits - FracBits2)); } /// less or equal template inline bool operator<=(FixedPoint l, FixedPoint r) { enum { MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1 }; return (l.value << (MaxFracBits - FracBits1)) <= (r.value << (MaxFracBits - FracBits2)); } /// greater template inline bool operator>(FixedPoint l, FixedPoint r) { enum { MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1 }; return (l.value << (MaxFracBits - FracBits1)) > (r.value << (MaxFracBits - FracBits2)); } /// greater or equal template inline bool operator>=(FixedPoint l, FixedPoint r) { enum { MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1 }; return (l.value << (MaxFracBits - FracBits1)) >= (r.value << (MaxFracBits - FracBits2)); } /// addition with automatic determination of the appropriate result type. template inline typename FixedPointTraits, FixedPoint >::PlusType operator+(FixedPoint l, FixedPoint r) { enum { MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1 }; return typename FixedPointTraits, FixedPoint >:: PlusType((l.value << (MaxFracBits - FracBits1)) + (r.value << (MaxFracBits - FracBits2)), FPNoShift); } /// addition with enforced result type. template inline void add(FixedPoint l, FixedPoint r, FixedPoint & result) { result = l + r; } /// subtraction with automatic determination of the appropriate result type. template inline typename FixedPointTraits, FixedPoint >::MinusType operator-(FixedPoint l, FixedPoint r) { enum { MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1 }; return typename FixedPointTraits, FixedPoint >:: MinusType((l.value << (MaxFracBits - FracBits1)) - (r.value << (MaxFracBits - FracBits2)), FPNoShift); } /// subtraction with enforced result type. template inline void sub(FixedPoint l, FixedPoint r, FixedPoint & result) { result = l - r; } /// multiplication with automatic determination of the appropriate result type. template inline typename FixedPointTraits, FixedPoint >::MultipliesType operator*(FixedPoint l, FixedPoint r) { typename FixedPointTraits, FixedPoint >:: MultipliesType res; mul(l, r, res); return res; } /// multiplication with enforced result type. template inline void mul(FixedPoint l, FixedPoint r, FixedPoint & result) { VIGRA_STATIC_ASSERT((FixedPoint_assignment_error__Target_object_has_too_few_integer_bits<(IntBits1 + IntBits2 <= IntBits3)>)); enum { diff = FracBits1 + FracBits2 - FracBits3 }; result.value = detail::FPMulImplementation<(diff > 0)>::template exec(l.value, r.value); } /// square root. template inline typename SquareRootTraits >::SquareRootResult sqrt(FixedPoint v) { return typename SquareRootTraits >::SquareRootResult(sqrti(v.value), FPNoShift); } /// absolute value. template inline FixedPoint abs(FixedPoint v) { return FixedPoint(abs(v.value), FPNoShift); } /// squared norm (same as v*v). template inline typename FixedPointTraits, FixedPoint >::MultipliesType squaredNorm(FixedPoint v) { return v*v; } /// norm (same as abs). template inline FixedPoint norm(FixedPoint const & v) { return abs(v); } /// fractional part. template inline FixedPoint<0, FracBits> frac(FixedPoint v) { return FixedPoint<0, FracBits>(v.value & FixedPoint::FRACTIONAL_MASK, FPNoShift); } /// dual fractional part: 1 - frac(v). template inline FixedPoint<0, FracBits> dual_frac(FixedPoint v) { return FixedPoint<0, FracBits>(FixedPoint<0, FracBits>::ONE - (v.value & FixedPoint::FRACTIONAL_MASK), FPNoShift); } /// rounding down. template inline int floor(FixedPoint v) { return(v.value >> FracBits); } /// rounding up. template inline int ceil(FixedPoint v) { return((v.value + FixedPoint::FRACTIONAL_MASK) >> FracBits); } /// rounding to the nearest integer. template inline int round(FixedPoint v) { return((v.value + FixedPoint::ONE_HALF) >> FracBits); } //@} /********************************************************/ /* */ /* FixedPoint-Traits */ /* */ /********************************************************/ /** \page FixedPointTraits Numeric and Promote Traits of FixedPoint The numeric and promote traits for FixedPoint follow the general specifications for \ref NumericPromotionTraits and \ref AlgebraicRing. They are implemented in terms of the traits of the basic types by partial template specialization: \code template class FixedPointTraits, FixedPoint > { typedef FixedPoint PlusType; typedef FixedPoint MinusType; typedef FixedPoint MultipliesType; }; template struct NumericTraits > { typedef FixedPoint Type; // Promote undefined because it depends on the layout, use FixedPointTraits // RealPromote in AlgebraicRing -- multiplication with double is not supported. // ComplexPromote in AlgebraicRing -- multiplication with double is not supported. typedef Type ValueType; typedef VigraFalseType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; ... // etc. }; template struct SquareRootTraits > { typedef FixedPoint Type; typedef FixedPoint SquareRootResult; typedef Type SquareRootArgument; }; template struct NormTraits > { typedef FixedPoint Type; typedef typename FixedPointTraits, FixedPoint >::MultipliesType SquaredNormType; typedef Type NormType; }; template struct PromoteTraits, FixedPoint > { typedef typename FixedPointTraits, FixedPoint >::PlusType Promote; }; \endcode \#include \<vigra/fixedpoint.hxx\>
Namespace: vigra */ template struct NumericTraits > { typedef FixedPoint Type; //typedef FixedPoint Promote; //typedef FixedPoint RealPromote; //typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraFalseType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static Type zero() { return Type(0, FPNoShift); } static Type one() { return Type(Type::ONE, FPNoShift); } static Type nonZero() { return one(); } static Type epsilon() { return Type(1, FPNoShift); } static Type smallestPositive() { return Type(1, FPNoShift); } static Type max() { return Type( Type::MAX, FPNoShift); } static Type min() { return -max(); } }; template struct NormTraits > { typedef FixedPoint Type; typedef typename FixedPointTraits, FixedPoint >::MultipliesType SquaredNormType; typedef Type NormType; }; template struct PromoteTraits, FixedPoint > { typedef typename FixedPointTraits, FixedPoint >::PlusType Promote; }; } // namespace vigra #endif // VIGRA_FIXEDPOINT_HXX gamera-3.3.3/include/vigra/flatmorphology.hxx0000644000076500000000000011753211261456425020313 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_FLATMORPHOLOGY_HXX #define VIGRA_FLATMORPHOLOGY_HXX #include #include #include "utilities.hxx" namespace vigra { /** \addtogroup Morphology Basic Morphological Operations Perform erosion, dilation, and median with disc structuring functions See also: \ref MultiArrayMorphology Separable morphology with parabola structuring functions in arbitrary dimensions */ //@{ /********************************************************/ /* */ /* discRankOrderFilter */ /* */ /********************************************************/ /** \brief Apply rank order filter with disc structuring function to the image. The pixel values of the source image must be in the range 0...255. Radius must be >= 0. Rank must be in the range 0.0 <= rank <= 1.0. The filter acts as a minimum filter if rank = 0.0, as a median if rank = 0.5, and as a maximum filter if rank = 1.0. Accessor are used to access the pixel data. Declarations: pass arguments explicitely: \code namespace vigra { template void discRankOrderFilter(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, DestIterator upperleft2, DestAccessor da, int radius, float rank) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void discRankOrderFilter(triple src, pair dest, int radius, float rank) } \endcode Usage: \#include \<vigra/flatmorphology.hxx\>
Namespace: vigra \code vigra::CImage src, dest; // do median filtering vigra::discRankOrderFilter(srcImageRange(src), destImage(dest), 10, 0.5); \endcode Required Interface: \code SrcIterator src_upperleft; DestIterator dest_upperleft; int x, y; unsigned char value; SrcAccessor src_accessor; DestAccessor dest_accessor; // value_type of accessor must be convertible to unsigned char value = src_accessor(src_upperleft, x, y); dest_accessor.set(value, dest_upperleft, x, y); \endcode Preconditions: \code for all source pixels: 0 <= value <= 255 (rank >= 0.0) && (rank <= 1.0) radius >= 0 \endcode */ doxygen_overloaded_function(template <...> void discRankOrderFilter) template void discRankOrderFilter(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, DestIterator upperleft2, DestAccessor da, int radius, float rank) { vigra_precondition((rank >= 0.0) && (rank <= 1.0), "discRankOrderFilter(): Rank must be between 0 and 1" " (inclusive)."); vigra_precondition(radius >= 0, "discRankOrderFilter(): Radius must be >= 0."); int i, x, y, xmax, ymax, xx, yy; int rankpos, winsize, leftsum; long hist[256]; // prepare structuring function std::vector struct_function(radius+1); struct_function[0] = radius; double r2 = (double)radius*radius; for(i=1; i<=radius; ++i) { double r = (double) i - 0.5; struct_function[i] = (int)(VIGRA_CSTD::sqrt(r2 - r*r) + 0.5); } int w = lowerright1.x - upperleft1.x; int h = lowerright1.y - upperleft1.y; SrcIterator ys(upperleft1); DestIterator yd(upperleft2); for(y=0; y= rank) break; leftsum += hist[i]; } rankpos = i; } da.set(rankpos, xd); ++xs.x; ++xd.x; // inner columns for(x=1; x=0; yy--) { unsigned char cur; xx = struct_function[yy]+1; if(xx > x0) break; cur = sa(xs, Diff2D(-xx, yy)); hist[cur]--; if(cur < rankpos) leftsum--; winsize--; } yy = (y0 < radius) ? y0 : radius; for(; yy>=1; yy--) { unsigned char cur; xx = struct_function[yy]+1; if(xx > x0) break; cur = sa(xs, Diff2D(-xx, -yy)); hist[cur]--; if(cur < rankpos) leftsum--; winsize--; } // add pixels at right border yy = (y1 < radius) ? y1 : radius; for(; yy>=0; yy--) { unsigned char cur; xx = struct_function[yy]; if(xx > x1) break; cur = sa(xs, Diff2D(xx, yy)); hist[cur]++; if(cur < rankpos) leftsum++; winsize++; } yy = (y0 < radius) ? y0 : radius; for(; yy>=1; yy--) { unsigned char cur; xx = struct_function[yy]; if(xx > x1) break; cur = sa(xs, Diff2D(xx, -yy)); hist[cur]++; if(cur < rankpos) leftsum++; winsize++; } // find the desired histogramm bin if(rank == 0.0) { if(leftsum == 0) { // search to the right for(i=rankpos; i<256; i++) { if(hist[i]) break; } rankpos = i; } else { // search to the left for(i=rankpos-1; i>=0; i--) { leftsum -= hist[i]; if(leftsum == 0) break; } rankpos = i; } } else // rank > 0.0 { if((float)leftsum / winsize < rank) { // search to the right for(i=rankpos; i<256; i++) { if((float)(hist[i]+leftsum) / winsize >= rank) break; leftsum+=hist[i]; } rankpos = i; } else { /// search to the left for(i=rankpos-1; i>=0; i--) { leftsum-=hist[i]; if((float)leftsum / winsize < rank) break; } rankpos = i; } } da.set(rankpos, xd); } } } template void discRankOrderFilter(triple src, pair dest, int radius, float rank) { discRankOrderFilter(src.first, src.second, src.third, dest.first, dest.second, radius, rank); } /********************************************************/ /* */ /* discErosion */ /* */ /********************************************************/ /** \brief Apply erosion (minimum) filter with disc of given radius to image. This is an abbreviation vor the rank order filter with rank = 0.0. See \ref discRankOrderFilter() for more information. Declarations: pass arguments explicitely: \code namespace vigra { template void discErosion(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, DestIterator upperleft2, DestAccessor da, int radius) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void discErosion(triple src, pair dest, int radius) } \endcode */ doxygen_overloaded_function(template <...> void discErosion) template inline void discErosion(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, DestIterator upperleft2, DestAccessor da, int radius) { vigra_precondition(radius >= 0, "discErosion(): Radius must be >= 0."); discRankOrderFilter(upperleft1, lowerright1, sa, upperleft2, da, radius, 0.0); } template void discErosion(triple src, pair dest, int radius) { vigra_precondition(radius >= 0, "discErosion(): Radius must be >= 0."); discRankOrderFilter(src.first, src.second, src.third, dest.first, dest.second, radius, 0.0); } /********************************************************/ /* */ /* discDilation */ /* */ /********************************************************/ /** \brief Apply dilation (maximum) filter with disc of given radius to image. This is an abbreviation vor the rank order filter with rank = 1.0. See \ref discRankOrderFilter() for more information. Declarations: pass arguments explicitely: \code namespace vigra { template void discDilation(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, DestIterator upperleft2, DestAccessor da, int radius) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void discDilation(triple src, pair dest, int radius) } \endcode */ doxygen_overloaded_function(template <...> void discDilation) template inline void discDilation(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, DestIterator upperleft2, DestAccessor da, int radius) { vigra_precondition(radius >= 0, "discDilation(): Radius must be >= 0."); discRankOrderFilter(upperleft1, lowerright1, sa, upperleft2, da, radius, 1.0); } template void discDilation(triple src, pair dest, int radius) { vigra_precondition(radius >= 0, "discDilation(): Radius must be >= 0."); discRankOrderFilter(src.first, src.second, src.third, dest.first, dest.second, radius, 1.0); } /********************************************************/ /* */ /* discMedian */ /* */ /********************************************************/ /** \brief Apply median filter with disc of given radius to image. This is an abbreviation vor the rank order filter with rank = 0.5. See \ref discRankOrderFilter() for more information. Declarations: pass arguments explicitely: \code namespace vigra { template void discMedian(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, DestIterator upperleft2, DestAccessor da, int radius) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void discMedian(triple src, pair dest, int radius) } \endcode */ doxygen_overloaded_function(template <...> void discMedian) template inline void discMedian(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, DestIterator upperleft2, DestAccessor da, int radius) { vigra_precondition(radius >= 0, "discMedian(): Radius must be >= 0."); discRankOrderFilter(upperleft1, lowerright1, sa, upperleft2, da, radius, 0.5); } template void discMedian(triple src, pair dest, int radius) { vigra_precondition(radius >= 0, "discMedian(): Radius must be >= 0."); discRankOrderFilter(src.first, src.second, src.third, dest.first, dest.second, radius, 0.5); } /********************************************************/ /* */ /* discRankOrderFilterWithMask */ /* */ /********************************************************/ /** \brief Apply rank order filter with disc structuring function to the image using a mask. The pixel values of the source image must be in the range 0...255. Radius must be >= 0. Rank must be in the range 0.0 <= rank <= 1.0. The filter acts as a minimum filter if rank = 0.0, as a median if rank = 0.5, and as a maximum filter if rank = 1.0. Accessor are used to access the pixel data. The mask is only applied to th input image, i.e. the function generates an output wherever the current disc contains at least one pixel with mask value 'true'. Source pixels with mask value 'false' are ignored during the calculation of the rank order. Declarations: pass arguments explicitely: \code namespace vigra { template void discRankOrderFilterWithMask(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, MaskIterator upperleftm, MaskAccessor mask, DestIterator upperleft2, DestAccessor da, int radius, float rank) } \endcode group arguments (use in conjunction with \ref ArgumentObjectFactories): \code namespace vigra { template void discRankOrderFilterWithMask(triple src, pair mask, pair dest, int radius, float rank) } \endcode Usage: \#include \<vigra/flatmorphology.hxx\>
Namespace: vigra \code vigra::CImage src, dest, mask; // do median filtering vigra::discRankOrderFilterWithMask(srcImageRange(src), maskImage(mask), destImage(dest), 10, 0.5); \endcode Required Interface: \code SrcIterator src_upperleft; DestIterator dest_upperleft; MaskIterator mask_upperleft; int x, y; unsigned char value; SrcAccessor src_accessor; DestAccessor dest_accessor; MaskAccessor mask_accessor; mask_accessor(mask_upperleft, x, y) // convertible to bool // value_type of accessor must be convertible to unsigned char value = src_accessor(src_upperleft, x, y); dest_accessor.set(value, dest_upperleft, x, y); \endcode Preconditions: \code for all source pixels: 0 <= value <= 255 (rank >= 0.0) && (rank <= 1.0) radius >= 0 \endcode */ doxygen_overloaded_function(template <...> void discRankOrderFilterWithMask) template void discRankOrderFilterWithMask(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, MaskIterator upperleftm, MaskAccessor mask, DestIterator upperleft2, DestAccessor da, int radius, float rank) { vigra_precondition((rank >= 0.0) && (rank <= 1.0), "discRankOrderFilter(): Rank must be between 0 and 1" " (inclusive)."); vigra_precondition(radius >= 0, "discRankOrderFilter(): Radius must be >= 0."); int i, x, y, xmax, ymax, xx, yy; int rankpos, winsize, leftsum; long hist[256]; // prepare structuring function std::vector struct_function(radius+1); struct_function[0] = radius; double r2 = (double)radius*radius; for(i=1; i<=radius; ++i) { double r = (double) i - 0.5; struct_function[i] = (int)(VIGRA_CSTD::sqrt(r2 - r*r) + 0.5); } int w = lowerright1.x - upperleft1.x; int h = lowerright1.y - upperleft1.y; SrcIterator ys(upperleft1); MaskIterator ym(upperleftm); DestIterator yd(upperleft2); for(y=0; y= rank) break; leftsum += hist[i]; } rankpos = i; } da.set(rankpos, xd); } ++xs.x; ++xd.x; ++xm.x; // inner columns for(x=1; x=0; yy--) { unsigned char cur; xx = struct_function[yy]+1; if(xx > x0) break; Diff2D pos(-xx, yy); if(mask(xm, pos)) { cur = sa(xs, pos); hist[cur]--; if(cur < rankpos) leftsum--; winsize--; } } yy = (y0 < radius) ? y0 : radius; for(; yy>=1; yy--) { unsigned char cur; xx = struct_function[yy]+1; if(xx > x0) break; Diff2D pos(-xx, -yy); if(mask(xm, pos)) { cur = sa(xs, pos); hist[cur]--; if(cur < rankpos) leftsum--; winsize--; } } // add pixels at right border yy = (y1 < radius) ? y1 : radius; for(; yy>=0; yy--) { unsigned char cur; xx = struct_function[yy]; if(xx > x1) break; Diff2D pos(xx, yy); if(mask(xm, pos)) { cur = sa(xs, pos); hist[cur]++; if(cur < rankpos) leftsum++; winsize++; } } yy = (y0 < radius) ? y0 : radius; for(; yy>=1; yy--) { unsigned char cur; xx = struct_function[yy]; if(xx > x1) break; Diff2D pos(xx, -yy); if(mask(xm, pos)) { cur = sa(xs, pos); hist[cur]++; if(cur < rankpos) leftsum++; winsize++; } } // find the desired histogramm bin if(winsize) { if(rank == 0.0) { if(leftsum == 0) { // search to the right for(i=rankpos; i<256; i++) { if(hist[i]) break; } rankpos = i; } else { // search to the left for(i=rankpos-1; i>=0; i--) { leftsum -= hist[i]; if(leftsum == 0) break; } rankpos = i; } } else // rank > 0.0 { if((float)leftsum / winsize < rank) { // search to the right for(i=rankpos; i<256; i++) { if((float)(hist[i]+leftsum) / winsize >= rank) break; leftsum+=hist[i]; } rankpos = i; } else { /// search to the left for(i=rankpos-1; i>=0; i--) { leftsum-=hist[i]; if((float)leftsum / winsize < rank) break; } rankpos = i; } } da.set(rankpos, xd); } else { leftsum = 0; rankpos = 0; } } } } template void discRankOrderFilterWithMask(triple src, pair mask, pair dest, int radius, float rank) { discRankOrderFilterWithMask(src.first, src.second, src.third, mask.first, mask.second, dest.first, dest.second, radius, rank); } /********************************************************/ /* */ /* discErosionWithMask */ /* */ /********************************************************/ /** \brief Apply erosion (minimum) filter with disc of given radius to image using a mask. This is an abbreviation vor the masked rank order filter with rank = 0.0. See \ref discRankOrderFilterWithMask() for more information. Declarations: pass arguments explicitely: \code namespace vigra { template void discErosionWithMask(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, MaskIterator upperleftm, MaskAccessor mask, DestIterator upperleft2, DestAccessor da, int radius) } \endcode group arguments (use in conjunction with \ref ArgumentObjectFactories): \code namespace vigra { template void discErosionWithMask(triple src, pair mask, pair dest, int radius) } \endcode */ doxygen_overloaded_function(template <...> void discErosionWithMask) template inline void discErosionWithMask(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, MaskIterator upperleftm, MaskAccessor mask, DestIterator upperleft2, DestAccessor da, int radius) { vigra_precondition(radius >= 0, "discErosionWithMask(): Radius must be >= 0."); discRankOrderFilterWithMask(upperleft1, lowerright1, sa, upperleftm, mask, upperleft2, da, radius, 0.0); } template inline void discErosionWithMask(triple src, pair mask, pair dest, int radius) { vigra_precondition(radius >= 0, "discErosionWithMask(): Radius must be >= 0."); discRankOrderFilterWithMask(src.first, src.second, src.third, mask.first, mask.second, dest.first, dest.second, radius, 0.0); } /********************************************************/ /* */ /* discDilationWithMask */ /* */ /********************************************************/ /** \brief Apply dilation (maximum) filter with disc of given radius to image using a mask. This is an abbreviation vor the masked rank order filter with rank = 1.0. See \ref discRankOrderFilterWithMask() for more information. Declarations: pass arguments explicitely: \code namespace vigra { template void discDilationWithMask(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, MaskIterator upperleftm, MaskAccessor mask, DestIterator upperleft2, DestAccessor da, int radius) } \endcode group arguments (use in conjunction with \ref ArgumentObjectFactories): \code namespace vigra { template void discDilationWithMask(triple src, pair mask, pair dest, int radius) } \endcode */ doxygen_overloaded_function(template <...> void discDilationWithMask) template inline void discDilationWithMask(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, MaskIterator upperleftm, MaskAccessor mask, DestIterator upperleft2, DestAccessor da, int radius) { vigra_precondition(radius >= 0, "discDilationWithMask(): Radius must be >= 0."); discRankOrderFilterWithMask(upperleft1, lowerright1, sa, upperleftm, mask, upperleft2, da, radius, 1.0); } template inline void discDilationWithMask(triple src, pair mask, pair dest, int radius) { vigra_precondition(radius >= 0, "discDilationWithMask(): Radius must be >= 0."); discRankOrderFilterWithMask(src.first, src.second, src.third, mask.first, mask.second, dest.first, dest.second, radius, 1.0); } /********************************************************/ /* */ /* discMedianWithMask */ /* */ /********************************************************/ /** \brief Apply median filter with disc of given radius to image using a mask. This is an abbreviation vor the masked rank order filter with rank = 0.5. See \ref discRankOrderFilterWithMask() for more information. Declarations: pass arguments explicitely: \code namespace vigra { template void discMedianWithMask(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, MaskIterator upperleftm, MaskAccessor mask, DestIterator upperleft2, DestAccessor da, int radius) } \endcode group arguments (use in conjunction with \ref ArgumentObjectFactories): \code namespace vigra { template void discMedianWithMask(triple src, pair mask, pair dest, int radius) } \endcode */ doxygen_overloaded_function(template <...> void discMedianWithMask) template inline void discMedianWithMask(SrcIterator upperleft1, SrcIterator lowerright1, SrcAccessor sa, MaskIterator upperleftm, MaskAccessor mask, DestIterator upperleft2, DestAccessor da, int radius) { vigra_precondition(radius >= 0, "discMedianWithMask(): Radius must be >= 0."); discRankOrderFilterWithMask(upperleft1, lowerright1, sa, upperleftm, mask, upperleft2, da, radius, 0.5); } template inline void discMedianWithMask(triple src, pair mask, pair dest, int radius) { vigra_precondition(radius >= 0, "discMedianWithMask(): Radius must be >= 0."); discRankOrderFilterWithMask(src.first, src.second, src.third, mask.first, mask.second, dest.first, dest.second, radius, 0.5); } //@} } // namespace vigra #endif // VIGRA_FLATMORPHOLOGY_HXX gamera-3.3.3/include/vigra/functorexpression.hxx0000644000076500000000000017641611261456425021053 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_FUNCTOREXPRESSION_HXX #define VIGRA_FUNCTOREXPRESSION_HXX /** \page FunctorExpressions Functor Expressions Simple automatic functor creation by means of expression templates (also known as a "lambda library"). \#include \<vigra/functorexpression.hxx\>
Namespace: vigra::functor Note: This functionality is not available under Microsoft Visual C++, because support for partial template specialization is required. Motivation Many generic algorithms are made more flexible by means of functors which define part of the algorithms' behavior according to the needs of a specific situation. For example, we can apply an exponential to each pixel by passing a pointer to the exp function to transformImage(): \code vigra::FImage src(w,h), dest(w,h); ... // fill src vigra::transformImage(srcImageRange(src), destImage(dest), &exp); \endcode However, this only works for simple operations. If we wanted to apply the exponential to a scaled pixel value (i.e. we want to execute exp(-beta*v)), we first need to implement a new functor: \code struct Exponential { Exponential(double b) : beta(b) {} template PixelType operator()(PixelType const& v) const { return exp(-beta*v); } double beta; }; \endcode This functor would be used like this: \code double beta = ...; vigra::transformImage(srcImageRange(src), destImage(dest), Exponential(beta)); \endcode However, this approach has some disadvantages:

  • Writing a functor is more work then simply programm the loop directly, i.e. non-generically. Programmers will tend to avoid generic constructs, if they require so much writing.
  • Often, functors are only needed for a single expression. It is not desirable to get into the trouble of introducing and documenting a new class if that class is used only once.
  • Functors cannot be implemented directly at the point of use. Thus, to find out exactly what a functor is doing, one needs to look somewhere else. This complicates use and maintainance ot generic code.
Therefore, it is necessary to provide a means to generate functors on the fly where they are needed. The C++ standard library contains so called "functor combinators" that allow to construct complicated functors from simpler ones. The above problem "apply exp(-beta*v) to every pixel" would be solved like this: \code float beta = ...; vigra::transformImage(srcImageRange(src), destImage(dest), std::compose1(std::ptr_fun(exp), std::bind1st(std::multiplies(), -beta))); \endcode I won't go into details on how this works. Suffice it to say that this technique requires a functional programming style that is unfamiliar to many programmers, and thus leads to code that is difficult to understand. Moreover, this technique has some limitations that prevent certain expressions from being implementable this way. Therefore, VIGRA provides a better and simpler means to create functors on the fly. Automatic Functor Creation Automatic functor creation in VIGRA is based on a technique called Expression Templates. This means that C++ operators are overloaded so that they don't execute the specified operation directly, but instead produce a functor which will later calculate the result. This technique has the big advantage that the familiar operator notation can be used, while all the flexibility of generic programming is preserved. Unfortunately, it requires partial template specialization, so these capabilities are not available on compilers that dont support this C++ feature (in particular, on Microsoft Visual C++). The above problem "apply exp(-beta*v) to every pixel" will be solved like this: \code using namespace vigra::functor; float beta = ...; transformImage(srcImageRange(src), destImage(dest), exp(Param(-beta)*Arg1())); \endcode Here, four expression templates have been used to create the desired functor:
Param(-beta):
creates a functor that represents a constant (-beta in this case)
Arg1():
represents the first argument of the expression (i.e. the pixels of image src in the example). Likewise, Arg2() and Arg3() are defined to represent more arguments. These are needed for algorithms that have multiple input images, such as \ref combineTwoImages() and \ref combineThreeImages().
* (multiplication):
creates a functor that returns the product of its arguments. Likewise, the other C++ operators (i.e. +, -, *, /, %, ==, !=, <, <=, >, >=, &&, ||, &, |, ^, !, ~) are overloaded.
exp():
creates a functor that takes the exponential of its argument. Likewise, the other algebraic functions (i.e. sqrt, exp, log, log10, sin, asin, cos, acos, tan, atan, abs, floor, ceil, pow, atan2, fmod, min, max) are overloaded.
We will explain additional capabilities of the functor creation mechanism by means of examples. The same argument can be used several times in the expression. For example, to calculate the gradient magnitude from the components of the gradient vector, you may write: \code using namespace vigra::functor; vigra::FImage gradient_x(w,h), gradient_y(w,h), magnitude(w,h); ... // calculate gradient_x and gradient_y combineTwoImages(srcImageRange(gradient_x), srcImage(gradient_y), destImage(magnitude), sqrt(Arg1()*Arg1() + Arg2()*Arg2())); \endcode It is also possible to build other functions into functor expressions. Suppose you want to apply my_complicated_function() to the sum of two images: \code using namespace vigra::functor; vigra::FImage src1(w,h), src2(w,h), dest(w,h); double my_complicated_function(double); combineTwoImages(srcImageRange(src1), srcImage(src2), destImage(dest), applyFct(&my_complicated_function, Arg1()+Arg2())); \endcode [Note that the arguments of the wrapped function are passed as additional arguments to applyFct()] You can implement conditional expression by means of the ifThenElse() functor. It corresponds to the "? :" operator that cannot be overloaded. ifThenElse() can be used, for example, to threshold an image: \code using namespace vigra::functor; vigra::FImage src(w,h), thresholded(w,h); ...// fill src float threshold = ...; transformImage(srcImageRange(src), destImage(thresholded), ifThenElse(Arg1() < Param(threshold), Param(0.0), // yes branch Param(1.0)) // no branch ); \endcode You can use the Var() functor to assign values to a variable (=, +=, -=, *=, /=  are suported). For example, the average gray value of the image is calculated like this: \code using namespace vigra::functor; vigra::FImage src(w,h); ...// fill src double sum = 0.0; inspectImage(srcImageRange(src), Var(sum) += Arg1()); std::cout << "Average: " << (sum / (w*h)) << std::endl; \endcode For use in \ref inspectImage() and its relatives, there is a second conditional functor ifThen() that emulates the if() statement and does not return a value. Using ifThen(), we can calculate the size of an image region: \code using namespace vigra::functor; vigra::IImage label_image(w,h); ...// mark regions by labels in label_image int region_label = ...; // the region we want to inspect int size = 0; inspectImage(srcImageRange(label_image), ifThen(Arg1() == Param(region_label), Var(size) += Param(1))); std::cout << "Size of region " << region_label << ": " << size << std::endl; \endcode Often, we want to execute several commands in one functor. This can be done by means of the overloaded operator,() ("operator comma"). Expressions seperated by a comma will be executed in succession. We can thus simultaneously find the size and the average gray value of a region: \code using namespace vigra::functor; vigra::FImage src(w,h); vigra::IImage label_image(w,h); ...// segment src and mark regions in label_image int region_label = ...; // the region we want to inspect int size = 0; double sum = 0.0; inspectTwoImages(srcImageRange(src), srcImage(label_image), ifThen(Arg2() == Param(region_label), ( Var(size) += Param(1), // the comma operator is invoked Var(sum) += Arg1() ))); std::cout << "Region " << region_label << ": size = " << size << ", average = " << sum / size << std::endl; \endcode [Note that the list of comma-separated expressions must be enclosed in parentheses.] A comma separated list of expressions can also be applied in the context of \ref transformImage() and its cousins. Here, a general rule of C++ applies: The return value of a comma expression is the value of its last subexpression. For example, we can initialize an image so that each pixel contains its address in scan order: \code using namespace vigra::functor; vigra::IImage img(w,h); int count = -1; initImageWithFunctor(destImageRange(img), ( Var(count) += Param(1), Var(count) // this is the result of the comma expression )); \endcode Further information about how this mechanism works can be found in this paper (sorry, slightly out of date). */ #ifndef DOXYGEN #if !defined(NO_PARTIAL_TEMPLATE_SPECIALIZATION) #include #include "numerictraits.hxx" #include "mathutil.hxx" #include "functortraits.hxx" namespace vigra { namespace functor { /************************************************************/ /* */ /* unary functor base template */ /* */ /************************************************************/ struct ErrorType; template struct ResultTraits0; template struct ResultTraits1 { typedef T1 Res; }; template struct ResultTraits2 { typedef typename PromoteTraits::Promote Res; }; template struct ResultTraits3 { typedef typename PromoteTraits::Promote P1; typedef typename PromoteTraits::Promote Res; }; template struct UnaryFunctor { UnaryFunctor(EXPR const & e) : expr_(e) {} // typename ResultTraits0::Res typename ResultTraits0::Res operator()() const { return expr_(); } template typename ResultTraits1::Res operator()(T1 const & v) const { return expr_(v); } template typename ResultTraits2::Res operator()(T1 const & v1, T2 const & v2) const { return expr_(v1, v2); } template typename ResultTraits3::Res operator()(T1 const & v1, T2 const & v2, T3 const & v3) const { return expr_(v1, v2, v3); } protected: EXPR expr_; private: UnaryFunctor & operator=(UnaryFunctor const &); // not implemented }; template struct ResultTraits0 > { typedef typename ResultTraits0::Res Res; }; template struct ResultTraits1, T1> { typedef typename ResultTraits1::Res Res; }; template struct ResultTraits2, T1, T2> { typedef typename ResultTraits2::Res Res; }; template struct ResultTraits3, T1, T2, T3> { typedef typename ResultTraits3::Res Res; }; /************************************************************/ /* */ /* unary functors for arguments */ /* */ /************************************************************/ struct ArgumentFunctor1; struct ArgumentFunctor2; struct ArgumentFunctor3; template <> struct UnaryFunctor { UnaryFunctor() {} template T1 const & operator()(T1 const & v1) const { return v1; } template T1 const & operator()(T1 const & v1, T2 const &) const { return v1; } template T1 const & operator()(T1 const & v1, T2 const &, T3 const &) const { return v1; } private: UnaryFunctor & operator=(UnaryFunctor const &); // not implemented }; template <> struct ResultTraits0 > { typedef ErrorType Res; }; template struct ResultTraits1, T1> { typedef T1 Res; }; template struct ResultTraits2, T1, T2> { typedef T1 Res; }; template struct ResultTraits3, T1, T2, T3> { typedef T1 Res; }; /************************************************************/ inline UnaryFunctor Arg1() { return UnaryFunctor(); } /************************************************************/ template <> struct UnaryFunctor { UnaryFunctor() {} template T2 const & operator()(T1 const &, T2 const & v2) const { return v2; } template T2 const & operator()(T1 const &, T2 const & v2, T3 const &) const { return v2; } private: UnaryFunctor & operator=(UnaryFunctor const &); // not implemented }; template <> struct ResultTraits0 > { typedef ErrorType Res; }; template struct ResultTraits1, T1> { typedef ErrorType Res; }; template struct ResultTraits2, T1, T2> { typedef T2 Res; }; template struct ResultTraits3, T1, T2, T3> { typedef T2 Res; }; /************************************************************/ inline UnaryFunctor Arg2() { return UnaryFunctor(); } /************************************************************/ template <> struct UnaryFunctor { UnaryFunctor() {} template T3 const & operator()(T1 const &, T2 const &, T3 const & v3) const { return v3; } private: UnaryFunctor & operator=(UnaryFunctor const &); // not implemented }; template <> struct ResultTraits0 > { typedef ErrorType Res; }; template struct ResultTraits1, T1> { typedef ErrorType Res; }; template struct ResultTraits2, T1, T2> { typedef ErrorType Res; }; template struct ResultTraits3, T1, T2, T3> { typedef T3 Res; }; /************************************************************/ inline UnaryFunctor Arg3() { return UnaryFunctor(); } /************************************************************/ /* */ /* constant parameters */ /* */ /************************************************************/ template struct ParameterFunctor { ParameterFunctor(T v) : value_(v) {} T const & operator()() const { return value_; } template T const & operator()(U1 const &) const { return value_; } template T const & operator()(U1 const &, U2 const &) const { return value_; } template T const & operator()(U1 const &, U2 const &, U3 const &) const { return value_; } protected: T value_; private: ParameterFunctor & operator=(ParameterFunctor const &); // not implemented }; template struct ResultTraits0 > { typedef T Res; }; template struct ResultTraits1, T1> { typedef T Res; }; template struct ResultTraits2, T1, T2> { typedef T Res; }; template struct ResultTraits3, T1, T2, T3> { typedef T Res; }; template inline UnaryFunctor > Param(T const & v) { ParameterFunctor fv(v); return UnaryFunctor >(fv); } /************************************************************/ /* */ /* unary analyser base template */ /* */ /************************************************************/ template class UnaryAnalyser { public: UnaryAnalyser(EXPR const & e) : expr_(e) {} void operator()() const { expr_(); } template void operator()(T1 const & v) const { expr_(v); } template void operator()(T1 const & v1, T2 const & v2) const { expr_(v1, v2); } template void operator()(T1 const & v1, T2 const & v2, T3 const & v3) const { expr_(v1, v2, v3); } protected: EXPR expr_; private: UnaryAnalyser & operator=(UnaryAnalyser const &); // not implemented }; /************************************************************/ /* */ /* variable assignment */ /* */ /************************************************************/ template struct VarFunctor; template struct UnaryFunctor >; /************************************************************/ #define MAKE_ASSIGNMENT_FUNCTOR(name, op) \ template \ struct AssignmentFunctor_##name \ { \ AssignmentFunctor_##name(UnaryFunctor > v, \ UnaryFunctor const & e) \ : value_(v.value_), expr_(e) \ {} \ \ V & operator()() const \ { \ const_cast(value_) op expr_(); \ return const_cast(value_); \ } \ \ template \ V & operator()(T1 const & v1) const \ { \ const_cast(value_) op expr_(v1); \ return const_cast(value_); \ } \ \ template \ V & operator()(T1 const & v1, T2 const & v2) const \ { \ const_cast(value_) op expr_(v1, v2); \ return const_cast(value_); \ } \ \ template \ V & operator()(T1 const & v1, T2 const & v2, T3 const & v3) const \ { \ const_cast(value_) op expr_(v1, v2, v3); \ return const_cast(value_); \ } \ \ private: \ V & value_; \ UnaryFunctor expr_; \ \ AssignmentFunctor_##name & operator=(AssignmentFunctor_##name const &);\ }; /************************************************************/ MAKE_ASSIGNMENT_FUNCTOR(assign, =) MAKE_ASSIGNMENT_FUNCTOR(add, +=) MAKE_ASSIGNMENT_FUNCTOR(subtract, -=) MAKE_ASSIGNMENT_FUNCTOR(multiply, *=) MAKE_ASSIGNMENT_FUNCTOR(divide, /=) #undef MAKE_ASSIGNMENT_FUNCTOR /************************************************************/ /* */ /* variables */ /* */ /************************************************************/ template struct UnaryFunctor > { typedef T Res; UnaryFunctor(T & v) : value_(v) {} template UnaryAnalyser< AssignmentFunctor_assign > > operator=(UnaryFunctor const & e) { AssignmentFunctor_assign > va(*this, e); return UnaryAnalyser< AssignmentFunctor_assign > >(va); } template UnaryAnalyser< AssignmentFunctor_add > > operator+=(UnaryFunctor const & e) { AssignmentFunctor_add > va(*this, e); return UnaryAnalyser< AssignmentFunctor_add > >(va); } template UnaryAnalyser< AssignmentFunctor_subtract > > operator-=(UnaryFunctor const & e) { AssignmentFunctor_subtract > va(*this, e); return UnaryAnalyser< AssignmentFunctor_subtract > >(va); } template UnaryAnalyser< AssignmentFunctor_multiply > > operator*=(UnaryFunctor const & e) { AssignmentFunctor_multiply > va(*this, e); return UnaryAnalyser< AssignmentFunctor_multiply > >(va); } template UnaryAnalyser< AssignmentFunctor_divide > > operator/=(UnaryFunctor const & e) { AssignmentFunctor_divide > va(*this, e); return UnaryAnalyser< AssignmentFunctor_divide > >(va); } T const & operator()() const { return value_; } template T const & operator()(U1 const &) const { return value_; } template T const & operator()(U1 const &, U2 const &) const { return value_; } template T const & operator()(U1 const &, U2 const &, U3 const &) const { return value_; } T & value_; private: UnaryFunctor & operator=(UnaryFunctor const &); // not implemented }; template struct ResultTraits0 > > { typedef T Res; }; template struct ResultTraits1 >, T1> { typedef T Res; }; template struct ResultTraits2 >, T1, T2> { typedef T Res; }; template struct ResultTraits3 >, T1, T2, T3> { typedef T Res; }; template inline UnaryFunctor > Var(T & v) { return UnaryFunctor >(v); } /************************************************************/ /* */ /* if then */ /* */ /************************************************************/ template struct IfThenFunctor { typedef void Res; IfThenFunctor(EXPR1 const & e1, EXPR2 const & e2) : expr1_(e1), expr2_(e2) {} void operator()() const { if( expr1_() ) expr2_(); } template void operator()(T const & v1) const { if( expr1_(v1) ) expr2_(v1); } template void operator()(T1 const & v1, T2 const & v2) const { if( expr1_(v1, v2) ) expr2_(v1, v2); } template void operator()(T1 const & v1, T2 const & v2, T3 const & v3) const { if( expr1_(v1, v2, v3) ) expr2_(v1, v2, v3); } private: EXPR1 expr1_; EXPR2 expr2_; private: IfThenFunctor & operator=(IfThenFunctor const &); // not implemented }; template UnaryAnalyser, UnaryAnalyser > > ifThen(UnaryFunctor const & e1, UnaryAnalyser const & e2) { IfThenFunctor, UnaryAnalyser > p(e1, e2); return UnaryAnalyser, UnaryAnalyser > >(p); } /************************************************************/ /* */ /* if then else */ /* */ /************************************************************/ template struct IfThenElseFunctor; template struct ResultTraits0 > { typedef typename ResultTraits0::Res R2; typedef typename ResultTraits0::Res R3; typedef typename PromoteTraits::Promote Res; }; template struct ResultTraits1, T1> { typedef typename ResultTraits1::Res R2; typedef typename ResultTraits1::Res R3; typedef typename PromoteTraits::Promote Res; }; template struct ResultTraits2, T1, T2> { typedef typename ResultTraits2::Res R2; typedef typename ResultTraits2::Res R3; typedef typename PromoteTraits::Promote Res; }; template struct ResultTraits3, T1, T2, T3> { typedef typename ResultTraits3::Res R2; typedef typename ResultTraits3::Res R3; typedef typename PromoteTraits::Promote Res; }; template struct IfThenElseFunctor { IfThenElseFunctor(EXPR1 const & e1, EXPR2 const & e2, EXPR3 const & e3) : expr1_(e1), expr2_(e2), expr3_(e3) {} typename ResultTraits0::Res operator()() const { typename ResultTraits0::Res r2(expr2_()); typename ResultTraits0::Res r3(expr3_()); return expr1_() ? r2 : r3; } template typename ResultTraits1::Res operator()(T const & v1) const { typename ResultTraits1::Res r2(expr2_(v1)); typename ResultTraits1::Res r3(expr3_(v1)); return expr1_(v1) ? r2 : r3; } template typename ResultTraits2::Res operator()(T1 const & v1, T2 const & v2) const { typename ResultTraits2::Res r2(expr2_(v1, v2)); typename ResultTraits2::Res r3(expr3_(v1, v2)); return expr1_(v1, v2) ? r2 : r3; } template typename ResultTraits3::Res operator()(T1 const & v1, T2 const & v2, T3 const & v3) const { typename ResultTraits3::Res r2(expr2_(v1, v2, v3)); typename ResultTraits3::Res r3(expr3_(v1, v2, v3)); return expr1_(v1, v2, v3) ? r2 : r3; } private: EXPR1 expr1_; EXPR2 expr2_; EXPR3 expr3_; IfThenElseFunctor & operator=(IfThenElseFunctor const &); // not implemented }; template UnaryFunctor, UnaryFunctor, UnaryFunctor > > ifThenElse(UnaryFunctor const & e1, UnaryFunctor const & e2, UnaryFunctor const & e3) { IfThenElseFunctor, UnaryFunctor, UnaryFunctor > p(e1, e2, e3); return UnaryFunctor, UnaryFunctor, UnaryFunctor > >(p); } /************************************************************/ /* */ /* functors for unary functions */ /* */ /************************************************************/ #define MAKE_FUNCTOR_UNARY_FUNCTION(function, namespc) \ using ::namespc::function; \ template \ struct Functor_##function; \ \ template \ struct ResultTraits0 > \ { \ typedef typename ResultTraits0::Res R1; \ typedef typename NumericTraits::RealPromote Res; \ }; \ \ template \ struct ResultTraits1, T1> \ { \ typedef typename ResultTraits1::Res R1; \ typedef typename NumericTraits::RealPromote Res; \ }; \ \ template \ struct ResultTraits2, T1, T2> \ { \ typedef typename ResultTraits2::Res R1; \ typedef typename NumericTraits::RealPromote Res; \ }; \ \ template \ struct ResultTraits3, T1, T2, T3> \ { \ typedef typename ResultTraits3::Res R1; \ typedef typename NumericTraits::RealPromote Res; \ }; \ \ template \ struct Functor_##function \ { \ Functor_##function(EXPR const & e) \ : expr_(e) \ {} \ \ typename ResultTraits0::Res \ operator()() const \ { \ return function(expr_()); \ } \ \ template \ typename ResultTraits1::Res \ operator()(T const & v1) const \ { \ return function(expr_(v1)); \ } \ \ template \ typename ResultTraits2::Res \ operator()(T1 const & v1, T2 const & v2) const \ { \ return function(expr_(v1, v2)); \ } \ \ template \ typename ResultTraits3::Res \ operator()(T1 const & v1, T2 const & v2, T3 const & v3) const \ { \ return function(expr_(v1, v2, v3)); \ } \ \ protected: \ \ EXPR expr_; \ \ private: \ Functor_##function & operator=(Functor_##function const &); \ }; \ \ template \ inline UnaryFunctor > > \ function(UnaryFunctor const & e) \ { \ Functor_##function > p(e); \ return UnaryFunctor > >(p); \ } /************************************************************/ MAKE_FUNCTOR_UNARY_FUNCTION(sqrt, std) MAKE_FUNCTOR_UNARY_FUNCTION(exp, std) MAKE_FUNCTOR_UNARY_FUNCTION(log, std) MAKE_FUNCTOR_UNARY_FUNCTION(log10, std) MAKE_FUNCTOR_UNARY_FUNCTION(sin, std) MAKE_FUNCTOR_UNARY_FUNCTION(asin, std) MAKE_FUNCTOR_UNARY_FUNCTION(cos, std) MAKE_FUNCTOR_UNARY_FUNCTION(acos, std) MAKE_FUNCTOR_UNARY_FUNCTION(tan, std) MAKE_FUNCTOR_UNARY_FUNCTION(atan, std) MAKE_FUNCTOR_UNARY_FUNCTION(floor, std) MAKE_FUNCTOR_UNARY_FUNCTION(ceil, std) MAKE_FUNCTOR_UNARY_FUNCTION(abs, vigra) //MAKE_FUNCTOR_UNARY_FUNCTION(norm, vigra) //MAKE_FUNCTOR_UNARY_FUNCTION(squaredNorm, vigra) #undef MAKE_FUNCTOR_UNARY_FUNCTION /************************************************************/ /* */ /* functors for unary operators */ /* */ /************************************************************/ #define MAKE_FUNCTOR_UNARY_OPERATOR(name, op) \ template \ struct Functor_##name; \ \ template \ struct ResultTraits0 > \ { \ typedef typename ResultTraits0::Res Res; \ }; \ \ template \ struct ResultTraits1, T1> \ { \ typedef typename ResultTraits1::Res Res; \ }; \ \ template \ struct ResultTraits2, T1, T2> \ { \ typedef typename ResultTraits2::Res Res; \ }; \ \ template \ struct ResultTraits3, T1, T2, T3> \ { \ typedef typename ResultTraits3::Res Res; \ }; \ \ template \ struct Functor_##name \ { \ Functor_##name(EXPR const & e) \ : expr_(e) \ {} \ \ typename ResultTraits0::Res \ operator()() const \ { \ return op expr_(); \ } \ \ template \ typename ResultTraits1::Res \ operator()(T const & v1) const \ { \ return op expr_(v1); \ } \ \ template \ typename ResultTraits2::Res \ operator()(T1 const & v1, T2 const & v2) const \ { \ return op expr_(v1, v2); \ } \ \ template \ typename ResultTraits3::Res \ operator()(T1 const & v1, T2 const & v2, T3 const & v3) const \ { \ return op expr_(v1, v2, v3); \ } \ protected: \ \ EXPR expr_; \ \ private: \ Functor_##name & operator=(Functor_##name const &);\ }; \ \ template \ inline UnaryFunctor > > \ operator op(UnaryFunctor const & e) \ { \ Functor_##name > p(e); \ return UnaryFunctor > >(p); \ } /************************************************************/ MAKE_FUNCTOR_UNARY_OPERATOR(minus, -) MAKE_FUNCTOR_UNARY_OPERATOR(negate, !) MAKE_FUNCTOR_UNARY_OPERATOR(bitNegate, ~) #undef MAKE_FUNCTOR_UNARY_OPERATOR /************************************************************/ /* */ /* functors for binary functions */ /* */ /************************************************************/ #define MAKE_FUNCTOR_BINARY_FUNCTION(function) \ using std::function; \ template \ struct Functor_##function; \ \ template \ struct ResultTraits0 > \ { \ typedef typename ResultTraits0::Res R1; \ typedef typename ResultTraits0::Res R2; \ typedef typename PromoteTraits::Promote R3; \ typedef typename NumericTraits::RealPromote Res; \ }; \ \ template \ struct ResultTraits1, T1> \ { \ typedef typename ResultTraits1::Res R1; \ typedef typename ResultTraits1::Res R2; \ typedef typename PromoteTraits::Promote R3; \ typedef typename NumericTraits::RealPromote Res; \ }; \ \ template \ struct ResultTraits2, T1, T2> \ { \ typedef typename ResultTraits2::Res R1; \ typedef typename ResultTraits2::Res R2; \ typedef typename PromoteTraits::Promote R3; \ typedef typename NumericTraits::RealPromote Res; \ }; \ \ template \ struct ResultTraits3, T1, T2, T3> \ { \ typedef typename ResultTraits3::Res R1; \ typedef typename ResultTraits3::Res R2; \ typedef typename PromoteTraits::Promote R3; \ typedef typename NumericTraits::RealPromote Res; \ }; \ \ template \ struct Functor_##function \ { \ Functor_##function(EXPR1 const & e1, EXPR2 const & e2) \ : expr1_(e1), expr2_(e2) \ {} \ \ typename ResultTraits0::Res \ operator()() const \ { \ return function(expr1_(), expr2_()); \ } \ \ template \ typename ResultTraits1::Res \ operator()(T const & v1) const \ { \ return function(expr1_(v1), expr2_(v1)); \ } \ \ template \ typename ResultTraits2::Res \ operator()(T1 const & v1, T2 const & v2) const \ { \ return function(expr1_(v1, v2), expr2_(v1, v2)); \ } \ \ template \ typename ResultTraits3::Res \ operator()(T1 const & v1, T2 const & v2, T3 const & v3) const \ { \ return function(expr1_(v1, v2, v3), expr2_(v1, v2, v3)); \ } \ \ private: \ \ EXPR1 expr1_; \ EXPR2 expr2_; \ \ Functor_##function & operator=(Functor_##function const &); \ }; \ \ template \ inline UnaryFunctor, UnaryFunctor > > \ function(UnaryFunctor const & e1, UnaryFunctor const & e2) \ { \ Functor_##function, UnaryFunctor > p(e1, e2); \ return UnaryFunctor, \ UnaryFunctor > >(p); \ } /************************************************************/ MAKE_FUNCTOR_BINARY_FUNCTION(pow) MAKE_FUNCTOR_BINARY_FUNCTION(atan2) MAKE_FUNCTOR_BINARY_FUNCTION(fmod) #undef MAKE_FUNCTOR_BINARY_FUNCTION /************************************************************/ #define MAKE_FUNCTOR_MINMAX(name, op) \ template \ struct Functor_##name; \ \ template \ struct ResultTraits0 > \ { \ typedef typename ResultTraits0::Res R1; \ typedef typename ResultTraits0::Res R2; \ typedef typename PromoteTraits::Promote Res; \ }; \ \ template \ struct ResultTraits1, T1> \ { \ typedef typename ResultTraits1::Res R1; \ typedef typename ResultTraits1::Res R2; \ typedef typename PromoteTraits::Promote Res; \ }; \ \ template \ struct ResultTraits2, T1, T2> \ { \ typedef typename ResultTraits2::Res R1; \ typedef typename ResultTraits2::Res R2; \ typedef typename PromoteTraits::Promote Res; \ }; \ \ template \ struct ResultTraits3, T1, T2, T3> \ { \ typedef typename ResultTraits3::Res R1; \ typedef typename ResultTraits3::Res R2; \ typedef typename PromoteTraits::Promote Res; \ }; \ \ template \ struct Functor_##name \ { \ Functor_##name(EXPR1 const & e1, EXPR2 const & e2) \ : expr1_(e1), expr2_(e2) \ {} \ \ typename ResultTraits0::Res \ operator()() const \ { \ typename \ ResultTraits0 >::R1 r1(expr1_()); \ typename \ ResultTraits0 >::R2 r2(expr2_()); \ return (r1 op r2) ? r1 : r2; \ } \ \ template \ typename ResultTraits1::Res \ operator()(T const & v1) const \ { \ typename \ ResultTraits1, T>::R1 r1(expr1_(v1)); \ typename \ ResultTraits1, T>::R2 r2(expr2_(v1)); \ return (r1 op r2) ? r1 : r2; \ } \ \ template \ typename ResultTraits2::Res \ operator()(T1 const & v1, T2 const & v2) const \ { \ typename \ ResultTraits2, T1, T2>::R1 r1(expr1_(v1, v2)); \ typename \ ResultTraits2, T1, T2>::R2 r2(expr2_(v1, v2)); \ return (r1 op r2) ? r1 : r2; \ } \ \ template \ typename ResultTraits3::Res \ operator()(T1 const & v1, T2 const & v2, T3 const & v3) const \ { \ typename \ ResultTraits3, T1, T2, T3>::R1 r1(expr1_(v1, v2, v3)); \ typename \ ResultTraits3, T1, T2, T3>::R2 r2(expr2_(v1, v2, v3)); \ return (r1 op r2) ? r1 : r2; \ } \ \ private: \ \ EXPR1 expr1_; \ EXPR2 expr2_; \ \ Functor_##name & operator=(Functor_##name const &); \ }; \ \ template \ inline UnaryFunctor, UnaryFunctor > > \ name(UnaryFunctor const & e1, UnaryFunctor const & e2) \ { \ Functor_##name, UnaryFunctor > p(e1, e2); \ return UnaryFunctor, \ UnaryFunctor > >(p); \ } MAKE_FUNCTOR_MINMAX(min, <) MAKE_FUNCTOR_MINMAX(max, >) #undef MAKE_FUNCTOR_MINMAX /************************************************************/ /* */ /* functors for binary operators */ /* */ /************************************************************/ #define MAKE_FUNCTOR_BINARY_OPERATOR(name, op) \ template \ struct Functor_##name; \ \ template \ struct ResultTraits0 > \ { \ typedef typename ResultTraits0::Res R1; \ typedef typename ResultTraits0::Res R2; \ typedef typename PromoteTraits::Promote Res; \ }; \ \ template \ struct ResultTraits1, T1> \ { \ typedef typename ResultTraits1::Res R1; \ typedef typename ResultTraits1::Res R2; \ typedef typename PromoteTraits::Promote Res; \ }; \ \ template \ struct ResultTraits2, T1, T2> \ { \ typedef typename ResultTraits2::Res R1; \ typedef typename ResultTraits2::Res R2; \ typedef typename PromoteTraits::Promote Res; \ }; \ \ template \ struct ResultTraits3, T1, T2, T3> \ { \ typedef typename ResultTraits3::Res R1; \ typedef typename ResultTraits3::Res R2; \ typedef typename PromoteTraits::Promote Res; \ }; \ \ template \ struct Functor_##name \ { \ Functor_##name(EXPR1 const & e1, EXPR2 const & e2) \ : expr1_(e1), expr2_(e2) \ {} \ \ typename ResultTraits0::Res \ operator()() const \ { \ return expr1_() op expr2_(); \ } \ \ template \ typename ResultTraits1::Res \ operator()(T const & v1) const \ { \ return expr1_(v1) op expr2_(v1); \ } \ \ template \ typename ResultTraits2::Res \ operator()(T1 const & v1, T2 const & v2) const \ { \ return expr1_(v1, v2) op expr2_(v1, v2); \ } \ \ template \ typename ResultTraits3::Res \ operator()(T1 const & v1, T2 const & v2, T3 const & v3) const \ { \ return expr1_(v1, v2, v3) op expr2_(v1, v2, v3); \ } \ \ private: \ \ EXPR1 expr1_; \ EXPR2 expr2_; \ \ Functor_##name & operator=(Functor_##name const &); \ }; \ \ template \ inline UnaryFunctor, UnaryFunctor > > \ operator op(UnaryFunctor const & e1, UnaryFunctor const & e2) \ { \ Functor_##name, UnaryFunctor > p(e1, e2); \ return UnaryFunctor, \ UnaryFunctor > >(p); \ } /************************************************************/ MAKE_FUNCTOR_BINARY_OPERATOR(add, +) MAKE_FUNCTOR_BINARY_OPERATOR(subtract, -) MAKE_FUNCTOR_BINARY_OPERATOR(multiply, *) MAKE_FUNCTOR_BINARY_OPERATOR(divide, /) MAKE_FUNCTOR_BINARY_OPERATOR(modulo, %) MAKE_FUNCTOR_BINARY_OPERATOR(bitAnd, &) MAKE_FUNCTOR_BINARY_OPERATOR(bitOr, |) MAKE_FUNCTOR_BINARY_OPERATOR(bitXor, ^) #undef MAKE_FUNCTOR_BINARY_OPERATOR /************************************************************/ #define MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(name, op) \ template \ struct Functor_##name; \ \ template \ struct ResultTraits0 > \ { \ typedef bool Res; \ }; \ \ template \ struct ResultTraits1, T1> \ { \ typedef bool Res; \ }; \ \ template \ struct ResultTraits2, T1, T2> \ { \ typedef bool Res; \ }; \ \ template \ struct ResultTraits3, T1, T2, T3> \ { \ typedef bool Res; \ }; \ \ template \ struct Functor_##name \ { \ Functor_##name(EXPR1 const & e1, EXPR2 const & e2) \ : expr1_(e1), expr2_(e2) \ {} \ \ bool operator()() const \ { \ return expr1_() op expr2_(); \ } \ \ template \ bool operator()(T const & v1) const \ { \ return expr1_(v1) op expr2_(v1); \ } \ \ template \ bool operator()(T1 const & v1, T2 const & v2) const \ { \ return expr1_(v1, v2) op expr2_(v1, v2); \ } \ \ template \ bool operator()(T1 const & v1, T2 const & v2, T3 const & v3) const \ { \ return expr1_(v1, v2, v3) op expr2_(v1, v2, v3); \ } \ \ private: \ \ EXPR1 expr1_; \ EXPR2 expr2_; \ \ Functor_##name & operator=(Functor_##name const &); \ }; \ \ template \ inline UnaryFunctor, UnaryFunctor > > \ operator op(UnaryFunctor const & e1, UnaryFunctor const & e2) \ { \ Functor_##name, UnaryFunctor > p(e1, e2); \ return UnaryFunctor, \ UnaryFunctor > >(p); \ } /************************************************************/ MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(equals, ==) MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(differs, !=) MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(less, <) MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(lessEqual, <=) MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(greater, >) MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(greaterEqual, >=) MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(and, &&) MAKE_FUNCTOR_BINARY_OPERATOR_BOOL(or, ||) #undef MAKE_FUNCTOR_BINARY_OPERATOR_BOOL /************************************************************/ /* */ /* unary apply */ /* */ /************************************************************/ template struct UnaryFctPtrFunctor { UnaryFctPtrFunctor(EXPR const & e, RES (*fct)(ARG)) : expr_(e), f_(fct) {} RES operator()() const { return f_(expr_()); } template RES operator()(T const & v1) const { return f_(expr_(v1)); } template RES operator()(T1 const & v1, T2 const & v2) const { return f_(expr_(v1, v2)); } template RES operator()(T1 const & v1, T2 const & v2, T3 const & v3) const { return f_(expr_(v1, v2, v3)); } protected: EXPR expr_; RES (*f_)(ARG); private: UnaryFctPtrFunctor & operator=(UnaryFctPtrFunctor const &); // not implemented }; template struct ResultTraits0 > { typedef RES Res; }; template struct ResultTraits1, T1> { typedef RES Res; }; template struct ResultTraits2, T1, T2> { typedef RES Res; }; template struct ResultTraits3, T1, T2, T3> { typedef RES Res; }; template inline UnaryFunctor, RES, ARG> > applyFct(RES (*f)(ARG), UnaryFunctor const & e) { UnaryFctPtrFunctor, RES, ARG> p(e, f); return UnaryFunctor, RES, ARG> >(p); } /************************************************************/ /* */ /* binary apply */ /* */ /************************************************************/ template struct BinaryFctPtrFunctor { BinaryFctPtrFunctor(EXPR1 const & e1, EXPR2 const & e2, RES (*f)(ARG1, ARG2)) : expr1_(e1), expr2_(e2), f_(f) {} RES operator()() const { return f_(expr1_(), expr2_()); } template RES operator()(T const & v1) const { return f_(expr1_(v1), expr2_(v1)); } template RES operator()(T1 const & v1, T2 const & v2) const { return f_(expr1_(v1, v2), expr2_(v1, v2)); } template RES operator()(T1 const & v1, T2 const & v2, T3 const & v3) const { return f_(expr1_(v1, v2, v3), expr2_(v1, v2, v3)); } protected: EXPR1 expr1_; EXPR2 expr2_; RES (*f_)(ARG1, ARG2); private: BinaryFctPtrFunctor & operator=(BinaryFctPtrFunctor const &); // not implemented }; template struct ResultTraits0 > { typedef RES Res; }; template struct ResultTraits1, T1> { typedef RES Res; }; template struct ResultTraits2, T1, T2> { typedef RES Res; }; template struct ResultTraits3, T1, T2, T3> { typedef RES Res; }; template inline UnaryFunctor, UnaryFunctor, RES, ARG1, ARG2> > applyFct(RES (*f)(ARG1, ARG2), UnaryFunctor const & e1, UnaryFunctor const & e2) { BinaryFctPtrFunctor, UnaryFunctor, RES, ARG1, ARG2> p(e1, e2, f); return UnaryFunctor, UnaryFunctor, RES, ARG1, ARG2> >(p); } /************************************************************/ /* */ /* comma operator */ /* */ /************************************************************/ template struct CommaFunctor { CommaFunctor(EXPR1 const & e1, EXPR2 const & e2) : expr1_(e1), expr2_(e2) {} typename ResultTraits0::Res operator()() const { expr1_(); return expr2_(); } template typename ResultTraits1::Res operator()(T const & v1) const { expr1_(v1); return expr2_(v1); } template typename ResultTraits2::Res operator()(T1 const & v1, T2 const & v2) const { expr1_(v1, v2); return expr2_(v1, v2); } template typename ResultTraits3::Res operator()(T1 const & v1, T2 const & v2, T3 const & v3) const { expr1_(v1, v2, v3); return expr2_(v1, v2, v3); } protected: EXPR1 expr1_; EXPR2 expr2_; private: CommaFunctor & operator=(CommaFunctor const &); // not implemented }; template struct ResultTraits0 > { typedef typename ResultTraits0::Res Res; }; template struct ResultTraits1, T1> { typedef typename ResultTraits1::Res Res; }; template struct ResultTraits2, T1, T2> { typedef typename ResultTraits2::Res Res; }; template struct ResultTraits3, T1, T2, T3> { typedef typename ResultTraits3::Res Res; }; template inline UnaryFunctor, UnaryFunctor > > operator,(UnaryAnalyser const & e1, UnaryFunctor const & e2) { CommaFunctor, UnaryFunctor > p(e1, e2); return UnaryFunctor, UnaryFunctor > >(p); } /************************************************************/ template struct CommaAnalyser { CommaAnalyser(EXPR1 const & e1, EXPR2 const & e2) : expr1_(e1), expr2_(e2) {} void operator()() const { expr1_(); expr2_(); } template void operator()(T const & v1) const { expr1_(v1); expr2_(v1); } template void operator()(T1 const & v1, T2 const & v2) const { expr1_(v1, v2); expr2_(v1, v2); } template void operator()(T1 const & v1, T2 const & v2, T3 const & v3) const { expr1_(v1, v2, v3); expr2_(v1, v2, v3); } protected: EXPR1 expr1_; EXPR2 expr2_; private: CommaAnalyser & operator=(CommaAnalyser const &); // not implemented }; template inline UnaryAnalyser, UnaryAnalyser > > operator,(UnaryAnalyser const & e1, UnaryAnalyser const & e2) { CommaAnalyser, UnaryAnalyser > p(e1, e2); return UnaryAnalyser, UnaryAnalyser > >(p); } } // namespace functor #if defined(__GNUC__) && __GNUC__ < 3 using functor::Arg1; using functor::Arg2; using functor::Arg3; using functor::Param; #endif template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isInitializer; typedef VigraTrueType isUnaryFunctor; typedef VigraTrueType isBinaryFunctor; typedef VigraTrueType isTernaryFunctor; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryAnalyser; typedef VigraTrueType isBinaryAnalyser; typedef VigraTrueType isTernaryAnalyser; }; } // namespace vigra #endif /* NO_PARTIAL_TEMPLATE_SPECIALIZATION */ #endif // DOXYGEN #endif /* VIGRA_FUNCTOREXPRESSION_HXX */ gamera-3.3.3/include/vigra/functortraits.hxx0000644000076500000000000002214111261456425020143 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2005 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_FUNCTORTRAITS_HXX #define VIGRA_FUNCTORTRAITS_HXX #include #include "metaprogramming.hxx" namespace vigra { template class FunctorTraitsBase { public: typedef T type; typedef VigraFalseType isInitializer; typedef VigraFalseType isUnaryFunctor; typedef VigraFalseType isBinaryFunctor; typedef VigraFalseType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; /** \addtogroup Functors */ //@{ /** \brief Export associated information for a functor. The FunctorTraits class contains the following fields: \code template struct FunctorTraits { typedef T type; typedef ... isInitializer; typedef ... isUnaryFunctor; typedef ... isBinaryFunctor; typedef ... isTernaryFunctor; typedef ... isUnaryAnalyser; typedef ... isBinaryAnalyser; typedef ... isTernaryAnalyser; }; \endcode Where the dots are either VigraTrueType or VigraFalseType depending on whether the functor supports the respective functionality or not. If a functor f is a model of these categories, it supports the following calls (v is a variable such that the result type of the functor calls can be converted into v's type, and a1, a2, a3 are variables convertible into the functor's argument types):
Initializer
v = f() (used with initImageWithFunctor())
UnaryFunctor
v = f(a1) (used with transformImage())
BinaryFunctor
v = f(a1, a2) (used with combineTwoImages())
TernaryFunctor
v = f(a1, a2, a3) (used with combineThreeImages())
UnaryAnalyser
f(a1) (return type void, used with inspectImage())
BinaryAnalyser
f(a1, a2) (return type void, used with inspectTwoImages())
TernaryAnalyser
f(a1, a2, a3) (return type void)
It should be noted that the functor's argument and result types are not contained in the traits class: Since the function calls are often member template functions in VIGRA, many functors do not have fixed argument types. Neither are the result types fixed in this case because they are computed (via a template meta-program) from the argument types. \#include \<vigra/functortraits.hxx\> Namespace: vigra */ template class FunctorTraits : public FunctorTraitsBase {}; #define VIGRA_DEFINE_STL_FUNCTOR(name, unary, binary) \ template \ class FunctorTraits > \ { \ public: \ typedef T type; \ \ typedef VigraFalseType isInitializer; \ \ typedef unary isUnaryFunctor; \ typedef binary isBinaryFunctor; \ typedef VigraFalseType isTernaryFunctor; \ \ typedef VigraFalseType isUnaryAnalyser; \ typedef VigraFalseType isBinaryAnalyser; \ typedef VigraFalseType isTernaryAnalyser; \ }; // ???TODO: these should also be specialized for the ptr_fun and mem_fun_ptr wrappers VIGRA_DEFINE_STL_FUNCTOR(std::plus, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::minus, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::multiplies, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::divides, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::modulus, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::equal_to, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::not_equal_to, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::greater, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::less, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::greater_equal, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::less_equal, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::logical_and, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::logical_or, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::binary_negate, VigraFalseType, VigraTrueType) VIGRA_DEFINE_STL_FUNCTOR(std::negate, VigraTrueType, VigraFalseType) VIGRA_DEFINE_STL_FUNCTOR(std::logical_not, VigraTrueType, VigraFalseType) VIGRA_DEFINE_STL_FUNCTOR(std::unary_negate, VigraTrueType, VigraFalseType) VIGRA_DEFINE_STL_FUNCTOR(std::binder1st, VigraTrueType, VigraFalseType) VIGRA_DEFINE_STL_FUNCTOR(std::binder2nd, VigraTrueType, VigraFalseType) #undef VIGRA_DEFINE_STL_FUNCTOR template class FunctorTraits { public: typedef R (*type)(); typedef VigraTrueType isInitializer; typedef VigraFalseType isUnaryFunctor; typedef VigraFalseType isBinaryFunctor; typedef VigraFalseType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; template class FunctorTraits { public: typedef R (*type)(T); typedef VigraFalseType isInitializer; typedef VigraTrueType isUnaryFunctor; typedef VigraFalseType isBinaryFunctor; typedef VigraFalseType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; template class FunctorTraits { public: typedef R (*type)(T1, T2); typedef VigraFalseType isInitializer; typedef VigraFalseType isUnaryFunctor; typedef VigraTrueType isBinaryFunctor; typedef VigraFalseType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; template class FunctorTraits { public: typedef R (*type)(T1, T2, T3); typedef VigraFalseType isInitializer; typedef VigraFalseType isUnaryFunctor; typedef VigraFalseType isBinaryFunctor; typedef VigraTrueType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; //@} } // namespace vigra #endif // VIGRA_FUNCTORTRAITS_HXX gamera-3.3.3/include/vigra/gaborfilter.hxx0000644000076500000000000004017611261456425017544 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2002-2004 by Ullrich Koethe and Hans Meine */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_GABORFILTER_HXX #define VIGRA_GABORFILTER_HXX #include "imagecontainer.hxx" #include "config.hxx" #include "stdimage.hxx" #include "copyimage.hxx" #include "transformimage.hxx" #include "combineimages.hxx" #include "utilities.hxx" #include #include #include namespace vigra { /** \addtogroup GaborFilter Gabor Filter Functions to create or apply gabor filter (latter based on FFTW). */ //@{ /********************************************************/ /* */ /* createGaborFilter */ /* */ /********************************************************/ /** \brief Create a gabor filter in frequency space. The orientation is given in radians, the other parameters are the center frequency (for example 0.375 or smaller) and the two angular and radial sigmas of the gabor filter. (See \ref angularGaborSigma() for an explanation of possible values.) The energy of the filter is explicitely normalized to 1.0. Declarations: pass arguments explicitly: \code namespace vigra { template void createGaborFilter(DestImageIterator destUpperLeft, DestImageIterator destLowerRight, DestAccessor da, double orientation, double centerFrequency, double angularSigma, double radialSigma) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void createGaborFilter(triple dest, double orientation, double centerFrequency, double angularSigma, double radialSigma) } \endcode Usage: \#include \<vigra/gaborfilter.hxx\>
Namespace: vigra \code vigra::FImage gabor(w,h); vigra::createGaborFilter(destImageRange(gabor), orient, freq, angularGaborSigma(directionCount, freq) radialGaborSigma(freq)); \endcode */ doxygen_overloaded_function(template <...> void createGaborFilter) template void createGaborFilter(DestImageIterator destUpperLeft, DestImageIterator destLowerRight, DestAccessor da, double orientation, double centerFrequency, double angularSigma, double radialSigma) { int w= destLowerRight.x - destUpperLeft.x; int h= destLowerRight.y - destUpperLeft.y; double squaredSum = 0.0; double cosTheta= VIGRA_CSTD::cos(orientation); double sinTheta= VIGRA_CSTD::sin(orientation); double radialSigma2 = radialSigma*radialSigma; double angularSigma2 = angularSigma*angularSigma; double wscale = w % 1 ? 1.0f / (w-1) : 1.0f / w; double hscale = h % 1 ? 1.0f / (h-1) : 1.0f / h; int dcX= (w+1)/2, dcY= (h+1)/2; double u, v; for ( int y=0; y inline void createGaborFilter(triple dest, double orientation, double centerFrequency, double angularSigma, double radialSigma) { createGaborFilter(dest.first, dest.second, dest.third, orientation, centerFrequency, angularSigma, radialSigma); } /********************************************************/ /* */ /* radialGaborSigma */ /* */ /********************************************************/ /** \brief Calculate sensible radial sigma for given parameters. For a brief introduction what is meant with "sensible" sigmas, see \ref angularGaborSigma(). Declaration: \code namespace vigra { double radialGaborSigma(double centerFrequency) } \endcode */ inline double radialGaborSigma(double centerFrequency) { static double sfactor = 3.0 * VIGRA_CSTD::sqrt(VIGRA_CSTD::log(4.0)); return centerFrequency / sfactor; } /********************************************************/ /* */ /* angularGaborSigma */ /* */ /********************************************************/ /** \brief Calculate sensible angular sigma for given parameters. "Sensible" means: If you use a range of gabor filters for feature detection, you are interested in minimal redundance. This is hard to define but one possible try is to arrange the filters in frequency space, so that the half-peak-magnitude ellipses touch each other. To do so, you must know the number of directions (first parameter for the angular sigma function) and the center frequency of the filter you want to calculate the sigmas for. The exact formulas are: \code sigma_radial= 1/sqrt(ln(4)) * centerFrequency/3 \endcode \code sigma_angular= 1/sqrt(ln(4)) * tan(pi/(directions*2)) * sqrt(8/9) * centerFrequency \endcode Declaration: \code namespace vigra { double angularGaborSigma(int directionCount, double centerFrequency) } \endcode */ inline double angularGaborSigma(int directionCount, double centerFrequency) { return VIGRA_CSTD::tan(M_PI/directionCount/2.0) * centerFrequency * VIGRA_CSTD::sqrt(8.0 / (9 * VIGRA_CSTD::log(4.0))); } /********************************************************/ /* */ /* GaborFilterFamily */ /* */ /********************************************************/ /** \brief Family of gabor filters of different scale and direction. A GaborFilterFamily can be used to quickly create a whole family of gabor filters in frequency space. Especially useful in conjunction with \ref applyFourierFilterFamily, since it's derived from \ref ImageArray. The filter parameters are chosen to make the center frequencies decrease in octaves with increasing scale indices, and to make the half-peak-magnitude ellipses touch each other to somewhat reduce redundancy in the filter answers. This is done by using \ref angularGaborSigma() and \ref radialGaborSigma(), you'll find more information there. The template parameter ImageType should be a scalar image type suitable for filling in \#include \<vigra/gaborfilter.hxx\> Namespace: vigra */ template ::other > class GaborFilterFamily : public ImageArray { typedef ImageArray ParentClass; int scaleCount_, directionCount_; double maxCenterFrequency_; protected: void initFilters() { for(int direction= 0; directionimages_[filterIndex(direction, scale)]), angle, centerFrequency, angularGaborSigma(directionCount(), centerFrequency), radialGaborSigma(centerFrequency)); } } public: enum { stdFilterSize= 128, stdDirectionCount= 6, stdScaleCount= 4 }; /** Constructs a family of gabor filters in frequency space. The filters will be calculated on construction, so it makes sense to provide good parameters right now although they can be changed later, too. If you leave them out, the defaults are a \ref directionCount of 6, a \ref scaleCount of 4 and a \ref maxCenterFrequency of 3/8(=0.375). */ GaborFilterFamily(const Diff2D & size, int directionCount = stdDirectionCount, int scaleCount = stdScaleCount, double maxCenterFrequency = 3.0/8.0, Alloc const & alloc = Alloc()) : ParentClass(directionCount*scaleCount, size, alloc), scaleCount_(scaleCount), directionCount_(directionCount), maxCenterFrequency_(maxCenterFrequency) { initFilters(); } /** Convenience variant of the above constructor taking width and height separately. Also, this one serves as default constructor constructing 128x128 pixel filters. */ GaborFilterFamily(int width= stdFilterSize, int height= -1, int directionCount = stdDirectionCount, int scaleCount = stdScaleCount, double maxCenterFrequency = 3.0/8.0, Alloc const & alloc = Alloc()) : ParentClass(directionCount*scaleCount, Size2D(width, height > 0 ? height : width), alloc), scaleCount_(scaleCount), directionCount_(directionCount), maxCenterFrequency_(maxCenterFrequency) { initFilters(); } /** Return the index of the filter with the given direction and scale in this ImageArray. direction must in the range 0..directionCount()-1 and scale in the range 0..rangeCount()-1. This is useful for example if you used \ref applyFourierFilterFamily() and got a resulting ImageArray which still has the same order of images, but no \ref getFilter() method anymore. */ int filterIndex(int direction, int scale) const { return scale*directionCount()+direction; } /** Return the filter with the given direction and scale. direction must in the range 0..directionCount()-1 and scale in the range 0..rangeCount()-1. filters.getFilter(direction, scale) is the same as filters[filterIndex(direction, scale)]. */ ImageType const & getFilter(int direction, int scale) const { return this->images_[filterIndex(direction, scale)]; } /** Resize all filters (causing their recalculation). */ virtual void resizeImages(const Diff2D &newSize) { ParentClass::resizeImages(newSize); initFilters(); } /** Query the number of filter scales available. */ int scaleCount() const { return scaleCount_; } /** Query the number of filter directions available. */ int directionCount() const { return directionCount_; } /** Change the number of directions / scales. This causes the recalculation of all filters. */ void setDirectionScaleCounts(int directionCount, int scaleCount) { this->resize(directionCount * scaleCount); scaleCount_ = scaleCount; directionCount_ = directionCount; initFilters(); } /** Return the center frequency of the filter(s) with scale==0. Filters with scale>0 will have a center frequency reduced in octaves: centerFrequency= maxCenterFrequency / 2.0^scale */ double maxCenterFrequency() { return maxCenterFrequency_; } /** Change the center frequency of the filter(s) with scale==0. See \ref maxCenterFrequency(). */ void setMaxCenterFrequency(double maxCenterFrequency) { maxCenterFrequency_ = maxCenterFrequency; initFilters(); } }; //@} } // namespace vigra #endif // VIGRA_GABORFILTER_HXX gamera-3.3.3/include/vigra/gaussians.hxx0000644000076500000000000002032211261456425017230 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_GAUSSIANS_HXX #define VIGRA_GAUSSIANS_HXX #include #include "config.hxx" #include "mathutil.hxx" #include "array_vector.hxx" #include "error.hxx" namespace vigra { #if 0 /** \addtogroup MathFunctions Mathematical Functions */ //@{ #endif /*! The Gaussian function and its derivatives. Implemented as a unary functor. Since it supports the radius() function it can also be used as a kernel in \ref resamplingConvolveImage(). \#include \<vigra/gaussians.hxx\>
Namespace: vigra \ingroup MathFunctions */ template class Gaussian { public: /** the value type if used as a kernel in \ref resamplingConvolveImage(). */ typedef T value_type; /** the functor's argument type */ typedef T argument_type; /** the functor's result type */ typedef T result_type; /** Create functor for the given standard deviation sigma and derivative order n. The functor then realizes the function \f[ f_{\sigma,n}(x)=\frac{\partial^n}{\partial x^n} \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x^2}{2\sigma^2}} \f] Precondition: \code sigma > 0.0 \endcode */ explicit Gaussian(T sigma = 1.0, unsigned int derivativeOrder = 0) : sigma_(sigma), sigma2_(-0.5 / sigma / sigma), norm_(0.0), order_(derivativeOrder), hermitePolynomial_(derivativeOrder / 2 + 1) { vigra_precondition(sigma_ > 0.0, "Gaussian::Gaussian(): sigma > 0 required."); switch(order_) { case 1: case 2: norm_ = -1.0 / (VIGRA_CSTD::sqrt(2.0 * M_PI) * sq(sigma) * sigma); break; case 3: norm_ = 1.0 / (VIGRA_CSTD::sqrt(2.0 * M_PI) * sq(sigma) * sq(sigma) * sigma); break; default: norm_ = 1.0 / VIGRA_CSTD::sqrt(2.0 * M_PI) / sigma; } calculateHermitePolynomial(); } /** Function (functor) call. */ result_type operator()(argument_type x) const; /** Get the standard deviation of the Gaussian. */ value_type sigma() const { return sigma_; } /** Get the derivative order of the Gaussian. */ unsigned int derivativeOrder() const { return order_; } /** Get the required filter radius for a discrete approximation of the Gaussian. The radius is given as a multiple of the Gaussian's standard deviation (default: sigma * (3 + 1/2 * derivativeOrder() -- the second term accounts for the fact that the derivatives of the Gaussian become wider with increasing order). The result is rounded to the next higher integer. */ double radius(double sigmaMultiple = 3.0) const { return VIGRA_CSTD::ceil(sigma_ * (sigmaMultiple + 0.5 * derivativeOrder())); } private: void calculateHermitePolynomial(); T horner(T x) const; T sigma_, sigma2_, norm_; unsigned int order_; ArrayVector hermitePolynomial_; }; template typename Gaussian::result_type Gaussian::operator()(argument_type x) const { T x2 = x * x; T g = norm_ * VIGRA_CSTD::exp(x2 * sigma2_); switch(order_) { case 0: return g; case 1: return x * g; case 2: return (1.0 - sq(x / sigma_)) * g; case 3: return (3.0 - sq(x / sigma_)) * x * g; default: return order_ % 2 == 0 ? g * horner(x2) : x * g * horner(x2); } } template T Gaussian::horner(T x) const { int i = order_ / 2; T res = hermitePolynomial_[i]; for(--i; i >= 0; --i) res = x * res + hermitePolynomial_[i]; return res; } template void Gaussian::calculateHermitePolynomial() { if(order_ == 0) { hermitePolynomial_[0] = 1.0; } else if(order_ == 1) { hermitePolynomial_[0] = -1.0 / sigma_ / sigma_; } else { // calculate Hermite polynomial for requested derivative // recursively according to // (0) // h (x) = 1 // // (1) // h (x) = -x / s^2 // // (n+1) (n) (n-1) // h (x) = -1 / s^2 * [ x * h (x) + n * h (x) ] // T s2 = -1.0 / sigma_ / sigma_; ArrayVector hn(3*order_+3, 0.0); typename ArrayVector::iterator hn0 = hn.begin(), hn1 = hn0 + order_+1, hn2 = hn1 + order_+1, ht; hn2[0] = 1.0; hn1[1] = s2; for(unsigned int i = 2; i <= order_; ++i) { hn0[0] = s2 * (i-1) * hn2[0]; for(unsigned int j = 1; j <= i; ++j) hn0[j] = s2 * (hn1[j-1] + (i-1) * hn2[j]); ht = hn2; hn2 = hn1; hn1 = hn0; hn0 = ht; } // keep only non-zero coefficients of the polynomial for(unsigned int i = 0; i < hermitePolynomial_.size(); ++i) hermitePolynomial_[i] = order_ % 2 == 0 ? hn1[2*i] : hn1[2*i+1]; } } ////@} } // namespace vigra #endif /* VIGRA_GAUSSIANS_HXX */ gamera-3.3.3/include/vigra/gradient_energy_tensor.hxx0000644000076500000000000002243311261456425022000 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2004-2005 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_GRADIENT_ENERGY_TENSOR_HXX #define VIGRA_GRADIENT_ENERGY_TENSOR_HXX #include #include #include "utilities.hxx" #include "array_vector.hxx" #include "basicimage.hxx" #include "combineimages.hxx" #include "numerictraits.hxx" #include "convolution.hxx" namespace vigra { /** \addtogroup TensorImaging Tensor Image Processing */ //@{ /********************************************************/ /* */ /* gradientEnergyTensor */ /* */ /********************************************************/ /** \brief Calculate the gradient energy tensor for a scalar valued image. These function calculates the gradient energy tensor (GET operator) as described in M. Felsberg, U. Köthe: "GET: The Connection Between Monogenic Scale-Space and Gaussian Derivatives", in: R. Kimmel, N. Sochen, J. Weickert (Eds.): Scale Space and PDE Methods in Computer Vision, Proc. of Scale-Space 2005, Lecture Notes in Computer Science 3459, pp. 192-203, Heidelberg: Springer, 2005. U. Köthe, M. Felsberg: "Riesz-Transforms Versus Derivatives: On the Relationship Between the Boundary Tensor and the Energy Tensor", in: ditto, pp. 179-191. with the given filters: The derivative filter \a derivKernel is applied to the appropriate image dimensions in turn (see the papers above for details), and the other dimension is smoothed with \a smoothKernel. The kernels can be as small as 3x1, e.g. [0.5, 0, -0.5] and [3.0/16.0, 10.0/16.0, 3.0/16.0] respectively. The output image must have 3 bands which will hold the tensor components in the order t11, t12 (== t21), t22. The signs of the output are adjusted for a right-handed coordinate system. Thus, orientations derived from the tensor will be in counter-clockwise (mathematically positive) order, with the x-axis at zero degrees (this is the standard in all VIGRA functions that deal with orientation). Declarations: pass arguments explicitly: \code namespace vigra { template void gradientEnergyTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, Kernel1D const & derivKernel, Kernel1D const & smoothKernel); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void gradientEnergyTensor(triple src, pair dest, Kernel1D const & derivKernel, Kernel1D const & smoothKernel); } \endcode Usage: \#include \<vigra/gradient_energy_tensor.hxx\> \code FImage img(w,h); FVector3Image get(w,h); Kernel1D grad, smooth; grad.initGaussianDerivative(0.7, 1); smooth.initGaussian(0.7); ... gradientEnergyTensor(srcImageRange(img), destImage(get), grad, smooth); \endcode */ doxygen_overloaded_function(template <...> void gradientEnergyTensor) template void gradientEnergyTensor(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor src, DestIterator dupperleft, DestAccessor dest, Kernel1D const & derivKernel, Kernel1D const & smoothKernel) { vigra_precondition(dest.size(dupperleft) == 3, "gradientEnergyTensor(): output image must have 3 bands."); int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; TmpImage gx(w, h), gy(w, h), gxx(w, h), gxy(w, h), gyy(w, h), laplace(w, h), gx3(w, h), gy3(w, h); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(gx), derivKernel, smoothKernel); convolveImage(srcIterRange(supperleft, slowerright, src), destImage(gy), smoothKernel, derivKernel); convolveImage(srcImageRange(gx), destImage(gxx), derivKernel, smoothKernel); convolveImage(srcImageRange(gx), destImage(gxy), smoothKernel, derivKernel); convolveImage(srcImageRange(gy), destImage(gyy), smoothKernel, derivKernel); combineTwoImages(srcImageRange(gxx), srcImage(gyy), destImage(laplace), std::plus()); convolveImage(srcImageRange(laplace), destImage(gx3), derivKernel, smoothKernel); convolveImage(srcImageRange(laplace), destImage(gy3), smoothKernel, derivKernel); typename TmpImage::iterator gxi = gx.begin(), gyi = gy.begin(), gxxi = gxx.begin(), gxyi = gxy.begin(), gyyi = gyy.begin(), gx3i = gx3.begin(), gy3i = gy3.begin(); for(int y = 0; y < h; ++y, ++dupperleft.y) { typename DestIterator::row_iterator d = dupperleft.rowIterator(); for(int x = 0; x < w; ++x, ++d, ++gxi, ++gyi, ++gxxi, ++gxyi, ++gyyi, ++gx3i, ++gy3i) { dest.setComponent(sq(*gxxi) + sq(*gxyi) - *gxi * *gx3i, d, 0); dest.setComponent(- *gxyi * (*gxxi + *gyyi) + 0.5 * (*gxi * *gy3i + *gyi * *gx3i), d, 1); dest.setComponent(sq(*gxyi) + sq(*gyyi) - *gyi * *gy3i, d, 2); } } } template inline void gradientEnergyTensor(triple src, pair dest, Kernel1D const & derivKernel, Kernel1D const & smoothKernel) { gradientEnergyTensor(src.first, src.second, src.third, dest.first, dest.second, derivKernel, smoothKernel); } //@} } // namespace vigra #endif // VIGRA_GRADIENT_ENERGY_TENSOR_HXX gamera-3.3.3/include/vigra/imagecontainer.hxx0000644000076500000000000006332711261456425020234 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_IMAGECONTAINER_HXX #define VIGRA_IMAGECONTAINER_HXX #include "utilities.hxx" #include "array_vector.hxx" #include "copyimage.hxx" namespace vigra { /** \addtogroup ImageContainers Image Containers Classes to manage multiple images (ImageArray..) */ //@{ /********************************************************/ /* */ /* ImageArray */ /* */ /********************************************************/ /** \brief Fundamental class template for arrays of equal-sized images. An ImageArray manages an array of images of the type given as template parameter. Use it like a ArrayVector, it has the same interface, only operator< is missing from ImageArray. It offers additional functions for resizing the images and querying their common size. See \ref imageSize() for additional notes. A custimized allocator can be passed as a template argument and via the constructor. By default, the allocator of the ImageType is reused. \#include \<vigra/imagecontainer.hxx\> Namespace: vigra */ template ::other > class ImageArray { Size2D imageSize_; protected: typedef ArrayVector ImageVector; ImageVector images_; public: /** the type of the contained values/images */ typedef ImageType value_type; typedef typename ImageVector::iterator iterator; typedef typename ImageVector::const_iterator const_iterator; typedef typename ImageVector::reverse_iterator reverse_iterator; typedef typename ImageVector::const_reverse_iterator const_reverse_iterator; typedef typename ImageVector::reference reference; typedef typename ImageVector::const_reference const_reference; #if !defined(_MSC_VER) || _MSC_VER >= 1300 typedef typename ImageVector::pointer pointer; #endif typedef typename ImageVector::difference_type difference_type; typedef typename ImageVector::size_type size_type; /** init an array of numImages equal-sized images; use the specified allocator. */ ImageArray(unsigned int numImages, const Diff2D &imageSize, Alloc const & alloc = Alloc()) : imageSize_(imageSize), images_(numImages, ImageType(), alloc) { for(unsigned int i=0; i ImageArray(InputIterator begin, InputIterator end, Alloc const & alloc = Alloc()) : imageSize_(begin!=end? (*begin).size() : Size2D(0,0)), images_(begin, end, alloc) { } virtual ~ImageArray() {} /** Operator for a vector-like access to the contained images (STL-Vector interface) */ reference operator [](size_type index) { return images_[index]; } /** Operator for a vector-like access to the contained images (STL-Vector interface) */ const_reference operator [](size_type index) const { return images_[index]; } /** Returns an iterator pointing to the first image (STL-Container interface) */ iterator begin() { return images_.begin(); } /** Returns an iterator pointing to the first image (STL-Container interface) */ const_iterator begin() const { return images_.begin(); } /** Returns an iterator pointing behind the last image (STL-Container interface) */ iterator end() { return images_.end(); } /** Returns an iterator pointing behind the last image (STL-Container interface) */ const_iterator end() const { return images_.end(); } /** Returns a reverse_iterator pointing to the first image of the reversed view of this array (STL-Reversable Container interface) */ reverse_iterator rbegin() { return images_.rbegin(); } /** Returns a reverse_iterator pointing to the first image of the reversed view of this array (STL-Reversable Container interface) */ const_reverse_iterator rbegin() const { return images_.rbegin(); } /** Returns a reverse_iterator pointing behind the last image of the reversed view of this array (STL-Reversable Container interface) */ reverse_iterator rend() { return images_.rend(); } /** Returns a reverse_iterator pointing behind the last image of the reversed view of this array (STL-Reversable Container interface) */ const_reverse_iterator rend() const { return images_.rend(); } /** Query size of this ImageArray, that is: the number of images. (STL-Container interface) */ size_type size() const { return images_.size(); } /** Query maximum size of this ImageArray, that is: the max. parameter you may pass to resize(). (STL-Container interface) */ size_type max_size() const { return images_.max_size(); } /** Returns true if and only if there are no contained images. (STL-Container interface) */ bool empty() { return images_.empty(); } /** Returns true if and only if both ImageArrays have exactly the same contents and all images did compare equal with the corresponding image in the other ImageArray. (STL-Forward Container interface) */ bool operator ==(const ImageArray &other) { return (imageSize() == other.imageSize()) && (images_ == other.images_); } /** Insert image at/before pos. (STL-Sequence interface) */ iterator insert(iterator pos, const_reference image) { return images_.insert(pos, image); } /** Insert count copies of image at/before pos. (STL-Sequence interface) */ void insert (iterator pos, size_type count, const_reference image); /** Insert copies of images from [begin, end) at/before pos. (STL-Sequence interface) */ template void insert(iterator pos, InputIterator begin, InputIterator end) { images_.insert(pos, begin, end); } /** Removes the image at pos from this array. (STL-Sequence interface) */ iterator erase(iterator pos) { return images_.erase(pos); } /** Removes the images from [begin, end) from this array. (STL-Sequence interface) */ iterator erase(iterator begin, iterator end) { return images_.erase(begin, end); } /** Empty this array. (STL-Sequence interface) */ void clear() { images_.clear(); } /** Resize this ImageArray, throwing the last images away if you make the array smaller or appending new images of the right size at the end of the array if you make it larger. (STL-Sequence interface) */ void resize(size_type newSize) { if (newSize != size()) { size_type oldSize= size(); images_.resize(newSize); for (size_type i= oldSize; iimage.size() == imageSize() (STL-Sequence interface) */ void resize(size_type newSize, ImageType &image) { if (newSize != size()) { vigra_precondition(image.size() == imageSize(), "trying to append images of wrong size to ImageArray with resize()"); images_.resize(newSize, image); } } /** return the first image. (STL-Sequence interface) */ reference front() { return images_.front(); } /** return the first image. (STL-Sequence interface) */ const_reference front() const { return images_.front(); } /** return the last image. (STL-Vector interface) */ reference back() { return images_.back(); } /** return the last image. (STL-Vector interface) */ const_reference back() const { return images_.back(); } /** append image to array (STL-Back Insertion Sequence interface) */ void push_back(const_reference image) { images_.push_back(image); } /** remove last image from array (STL-Back Insertion Sequence interface) */ void pop_back() { images_.pop_back(); } /** swap contents of this array with the contents of other (STL-Container interface) */ void swap(const_reference other) { Size2D oldImageSize = imageSize_; images_.swap(other.images_); imageSize_ = other.imageSize_; other.imageSize_ = oldImageSize; } /** number of image objects for which memory has been allocated (STL-Vector interface) */ size_type capacity() const { return images_.capacity(); } /** increase capacity(). (STL-Vector interface) */ void reserve(size_type n) { images_.reserve(n); } /** Query the size of the contained images. ImageArray will maintain an array of equal-sized images of this size. However, do not resize the contained images manually. ImageArray currently has no way to detect or prevent this. */ Size2D imageSize() const { return imageSize_; } /** Resize all images to a common new size (No-op if newSize == imageSize()). See \ref imageSize() for an important note about resizing the images. */ virtual void resizeImages(const Diff2D &newSize) { if (newSize!=imageSize()) { for(unsigned int i=0; inewSize == imageSize()). See \ref imageSize() for an important note about resizing the images. (Convenience function, same as calling resizeImages(Diff2D(width, height));.) */ void resizeImages(int width, int height) { resizeImages(Size2D(width, height)); } }; /********************************************************/ /* */ /* ImagePyramid */ /* */ /********************************************************/ /** \brief Class template for logarithmically tapering image pyramids. An ImagePyramid manages an array of images of the type given as template parameter, where each level has half the width and height of its predecessor. It actually represents a sequence of pyramid levels whose start and end index are configurable. For Burt-style pyramids, see also \ref pyramidReduceBurtFilter and \ref pyramidExpandBurtFilter. A custimized allocator can be passed as a template argument and via the constructor. By default, the allocator of the ImageType is reused. \#include \<vigra/imagecontainer.hxx\> Namespace: vigra */ template ::other > class ImagePyramid { int lowestLevel_, highestLevel_; protected: typedef ArrayVector ImageVector; ImageVector images_; public: /** the type of the contained values/images */ typedef ImageType value_type; typedef typename ImageVector::iterator iterator; typedef typename ImageVector::const_iterator const_iterator; typedef typename ImageVector::reverse_iterator reverse_iterator; typedef typename ImageVector::const_reverse_iterator const_reverse_iterator; typedef typename ImageVector::reference reference; typedef typename ImageVector::const_reference const_reference; #if !defined(_MSC_VER) || _MSC_VER >= 1300 typedef typename ImageVector::pointer pointer; #endif typedef typename ImageVector::difference_type difference_type; typedef int size_type; /** Init a pyramid between the given levels (inclusive). * * Allocate the given \a imageSize at the pyramid level given * in \a sizeAppliesToLevel (default: level 0 / bottom) and * size the other levels using recursive reduction/expansion * by factors of 2. Use the specified allocator for image * creation. The image type must be default constructible and * resizable. sizeAppliesToLevel must be the in range * lowestLevel..highestLevel (inclusive). */ ImagePyramid(int lowestLevel, int highestLevel, const Diff2D &imageSize, int sizeAppliesToLevel = 0, Alloc const & alloc = Alloc()) : lowestLevel_(0), highestLevel_(-1), images_(alloc) { resize(lowestLevel, highestLevel, imageSize, sizeAppliesToLevel); } /** * Init a pyramid between the given levels (inclusive). * * Copy the given \a image into the pyramid level given in \a * copyImageToLevel (default: level 0 / bottom) and size the * other levels using recursive reduction/expansion by factors * of 2 (their image data is not initialized). Use the * specified allocator for image creation. The image type * must be default constructible and resizable. * sizeAppliesToLevel must be the in range * lowestLevel..highestLevel (inclusive). */ ImagePyramid(int lowestLevel, int highestLevel, const ImageType &image, int copyImageToLevel = 0, Alloc const & alloc = Alloc()) : lowestLevel_(0), highestLevel_(-1), images_(alloc) { resize(lowestLevel, highestLevel, image.size(), copyImageToLevel); copyImage(srcImageRange(image), destImage((*this)[copyImageToLevel])); } /** * Init a pyramid between the given levels (inclusive). * * Copy the image given by the range \a ul to \a lr into the * pyramid level given in \a copyImageToLevel (default: level * 0 / bottom) and size the other levels using recursive * reduction/expansion by factors of 2 (their image data is * not initialized). Use the specified allocator for image * creation. The image type must be default constructible and * resizable. sizeAppliesToLevel must be the in range * lowestLevel..highestLevel (inclusive). */ template ImagePyramid(int lowestLevel, int highestLevel, SrcIterator ul, SrcIterator lr, SrcAccessor src, int copyImageToLevel = 0, Alloc const & alloc = Alloc()) : lowestLevel_(0), highestLevel_(-1), images_(alloc) { resize(lowestLevel, highestLevel, lr - ul, copyImageToLevel); copyImage(srcIterRange(ul, lr, src), destImage((*this)[copyImageToLevel])); } /** Init an empty pyramid. Use the specified allocator. */ ImagePyramid(Alloc const & alloc = Alloc()) : lowestLevel_(0), highestLevel_(-1), images_(alloc) {} virtual ~ImagePyramid() {} /** Get the index of the lowest allocated level of the pyramid. */ int lowestLevel() const { return lowestLevel_; } /** Get the index of the highest allocated level of the pyramid. */ int highestLevel() const { return highestLevel_; } /** Operator for a vector-like access to the contained images (STL-Vector interface) */ reference operator [](size_type index) { return images_[index - lowestLevel_]; } /** Operator for a vector-like access to the contained images (STL-Vector interface) */ const_reference operator [](size_type index) const { return images_[index - lowestLevel_]; } /** Returns an iterator pointing to the first image (STL-Container interface) */ iterator begin() { return images_.begin(); } /** Returns an iterator pointing to the first image (STL-Container interface) */ const_iterator begin() const { return images_.begin(); } /** Returns an iterator pointing behind the last image (STL-Container interface) */ iterator end() { return images_.end(); } /** Returns an iterator pointing behind the last image (STL-Container interface) */ const_iterator end() const { return images_.end(); } /** Returns a reverse_iterator pointing to the first image of the reversed view of this array (STL-Reversable Container interface) */ reverse_iterator rbegin() { return images_.rbegin(); } /** Returns a reverse_iterator pointing to the first image of the reversed view of this array (STL-Reversable Container interface) */ const_reverse_iterator rbegin() const { return images_.rbegin(); } /** Returns a reverse_iterator pointing behind the last image of the reversed view of this array (STL-Reversable Container interface) */ reverse_iterator rend() { return images_.rend(); } /** Returns a reverse_iterator pointing behind the last image of the reversed view of this array (STL-Reversable Container interface) */ const_reverse_iterator rend() const { return images_.rend(); } /** Query size of this ImageArray, that is: the number of images. (STL-Container interface) */ size_type size() const { return images_.size(); } /** Returns true if and only if there are no contained images. (STL-Container interface) */ bool empty() { return images_.empty(); } /** Returns true if and only if both ImageArrays have exactly the same contents and all images did compare equal with the corresponding image in the other ImageArray. (STL-Forward Container interface) */ bool operator ==(const ImagePyramid &other) const { return (lowestLevel_ == other.lowestLevel_) && (highestLevel_ == other.highestLevel_) && (images_ == other.images_); } /** Empty this array. (STL-Sequence interface) */ void clear() { images_.clear(); lowestLevel_ = 0; highestLevel_ = -1; } /** Resize this ImageArray, throwing the last images away if you make the array smaller or appending new images of the right size at the end of the array if you make it larger. (STL-Sequence interface) */ void resize(int lowestLevel, int highestLevel, const Diff2D &imageSize, int sizeAppliesToLevel = 0) { vigra_precondition(lowestLevel <= highestLevel, "ImagePyramid::resize(): lowestLevel <= highestLevel required."); vigra_precondition(lowestLevel <= sizeAppliesToLevel && sizeAppliesToLevel <= highestLevel, "ImagePyramid::resize(): sizeAppliesToLevel must be between lowest and highest level (inclusive)."); ImageVector images(highestLevel - lowestLevel + 1, ImageType()); images[sizeAppliesToLevel - lowestLevel].resize(imageSize); for(int i=sizeAppliesToLevel + 1; i<=highestLevel; ++i) { unsigned int w = (images[i - 1 - lowestLevel].width() + 1) / 2; unsigned int h = (images[i - 1 - lowestLevel].height() + 1) / 2; images[i - lowestLevel].resize(w, h); } for(int i=sizeAppliesToLevel - 1; i>=lowestLevel; --i) { unsigned int w = 2*images[i + 1 - lowestLevel].width() - 1; unsigned int h = 2*images[i + 1 - lowestLevel].height() - 1; images[i - lowestLevel].resize(w, h); } images_.swap(images); lowestLevel_ = lowestLevel; highestLevel_ = highestLevel; } /** return the first image (lowestLevel()). (STL-Sequence interface) */ reference front() { return images_.front(); } /** return the first image (lowestLevel()). (STL-Sequence interface) */ const_reference front() const { return images_.front(); } /** return the last image (highestLevel()). (STL-Vector interface) */ reference back() { return images_.back(); } /** return the last image (highestLevel()). (STL-Vector interface) */ const_reference back() const { return images_.back(); } /** swap contents of this array with the contents of other (STL-Container interface) */ void swap(const ImagePyramid &other) { images_.swap(other.images_); std::swap(lowestLevel_, other.lowestLevel_); std::swap(highestLevel_, other.highestLevel_); } }; //@} } // namespace vigra #endif // VIGRA_IMAGECONTAINER_HXX gamera-3.3.3/include/vigra/imageinfo.hxx0000644000076500000000000004535511261456425017206 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2001 by Ullrich Koethe */ /* Copyright 2001-2002 by Gunnar Kedenburg */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ /* Modifications by Pablo d'Angelo * updated to vigra 1.4 by Douglas Wilkins * as of 18 Febuary 2006: * - Added UINT16 and UINT32 pixel types. * - Added support for obtaining extra bands beyond RGB. * - Added support for a position field that indicates the start of this * image relative to some global origin. * - Added support for x and y resolution fields. * - Added support for ICC profiles */ #ifndef VIGRA_IMAGEINFO_HXX #define VIGRA_IMAGEINFO_HXX #include #include #include "config.hxx" #include "error.hxx" #include "diff2d.hxx" #include "codec.hxx" #include "array_vector.hxx" namespace vigra { /** \addtogroup VigraImpex Image Import/Export Facilities supports GIF, TIFF, JPEG, BMP, PNM (PBM, PGM, PPM), PNG, SunRaster, KHOROS-VIFF formats **/ //@{ /** \brief List the image formats VIGRA can read and write. This is useful for creating error messages if VIGRA encounters an image format it doesn't recognize. Usage: \#include \<vigra/imageinfo.hxx\>
Namespace: vigra \code std::cout << "supported formats: " << vigra::impexListFormats() << std::endl; \endcode **/ VIGRA_EXPORT std::string impexListFormats(); /** \brief List the file extension VIGRA understands. This is useful for creating file dialogs that only list image files VIGRA can actually import. Usage: \#include \<vigra/imageinfo.hxx\>
Namespace: vigra \code std::cout << "supported extensions: " << vigra::impexListExtensions() << std::endl; \endcode **/ VIGRA_EXPORT std::string impexListExtensions(); /** \brief Test whether a file is an image format known to VIGRA. This checks the first few bytes of the file and compares them with the "magic strings" of each recognized image format. Usage: \#include \<vigra/imageinfo.hxx\>
Namespace: vigra \code std::cout << "is image: " << vigra::isImage("foo.bmp") << std::endl; \endcode **/ VIGRA_EXPORT bool isImage(char const * filename); /********************************************************/ /* */ /* ImageExportInfo */ /* */ /********************************************************/ /** \brief Argument object for the function exportImage(). See \ref exportImage() for usage example. This object must be used to define the properties of an image to be written to disk. \#include \<vigra/imageinfo.hxx\>
Namespace: vigra **/ class ImageExportInfo { public: /** Construct ImageExportInfo object. The image will be stored under the given filename. The file type will be guessed from the extension unless overridden by \ref setFileType(). Recognized extensions: '.bmp', '.gif', '.jpeg', '.jpg', '.p7', '.png', '.pbm', '.pgm', '.pnm', '.ppm', '.ras', '.tif', '.tiff', '.xv', '.hdr'. JPEG support requires libjpeg, PNG support requires libpng, and TIFF support requires libtiff. **/ VIGRA_EXPORT ImageExportInfo( const char * ); VIGRA_EXPORT ~ImageExportInfo(); /** Set image file name. The file type will be guessed from the extension unless overridden by \ref setFileType(). Recognized extensions: '.bmp', '.gif', '.jpeg', '.jpg', '.p7', '.png', '.pbm', '.pgm', '.pnm', '.ppm', '.ras', '.tif', '.tiff', '.xv', '.hdr'. JPEG support requires libjpeg, PNG support requires libpng, and TIFF support requires libtiff. **/ VIGRA_EXPORT ImageExportInfo & setFileName(const char * filename); VIGRA_EXPORT const char * getFileName() const; /** Store image as given file type. This will override any type guessed from the file name's extension. Recognized file types:
"BMP"
Microsoft Windows bitmap image file.
"GIF"
CompuServe graphics interchange format; 8-bit color.
"JPEG"
Joint Photographic Experts Group JFIF format; compressed 24-bit color (only available if libjpeg is installed).
"PNG"
Portable Network Graphic (only available if libpng is installed).
"PBM"
Portable bitmap format (black and white).
"PGM"
Portable graymap format (gray scale).
"PNM"
Portable anymap.
"PPM"
Portable pixmap format (color).
"SUN"
SUN Rasterfile.
"TIFF"
Tagged Image File Format. (only available if libtiff is installed.)
"VIFF"
Khoros Visualization image file.
With the exception of TIFF, VIFF, PNG, and PNM all file types store 1 byte (gray scale and mapped RGB) or 3 bytes (RGB) per pixel. PNG can store UInt8 and UInt16 values, and supports 1 and 3 channel images. One additional alpha channel is also supported. PNM can store 1 and 3 channel images with UInt8, UInt16 and UInt32 values in each channel. TIFF and VIFF are aditionally able to store short and long integers (2 or 4 bytes) and real values (32 bit float and 64 bit double) without conversion. So you will need to use TIFF or VIFF if you need to store images with high accuracy (the appropriate type to write is automatically derived from the image type to be exported). However, many other programs using TIFF (e.g. ImageMagick) have not implemented support for those pixel types. So don't be surprised if the generated TIFF is not readable in some cases. If this happens, export the image as 'unsigned char' or 'RGBValue\' by calling \ref ImageExportInfo::setPixelType(). Support to reading and writing ICC color profiles is provided for TIFF, JPEG, and PNG images. **/ VIGRA_EXPORT ImageExportInfo & setFileType( const char * ); VIGRA_EXPORT const char * getFileType() const; /** Set compression type. Recognized strings: "" (no compression), "LZW", "RunLength", "1" ... "100". A number is interpreted as the compression quality for JPEG compression. JPEG compression is supported by the JPEG and TIFF formats. "LZW" is only available if libtiff was installed with LZW enabled. By default, libtiff came with LZW disabled due to Unisys patent enforcement. In this case, VIGRA stores the image uncompressed. Valid Compression for TIFF files: JPEG jpeg compression, call setQuality as well! RLE runlength compression LZW lzw compression DEFLATE deflate compression **/ VIGRA_EXPORT ImageExportInfo & setCompression( const char * ); VIGRA_EXPORT const char * getCompression() const; /** Set the pixel type of the image file. Possible values are:
"UINT8"
8-bit unsigned integer (unsigned char)
"INT16"
16-bit signed integer (short)
"UINT16"
16-bit unsigned integer (unsigned short)
"INT32"
32-bit signed integer (long)
"UINT32"
32-bit unsigned integer (unsigned long)
"FLOAT"
32-bit floating point (float)
"DOUBLE"
64-bit floating point (double)
Usage: \code FImage img(w,h); // by default, float images are exported with pixeltype float // when the target format support this type, i.e. is TIFF or VIFF. exportImage(srcImageRange(img), ImageExportInfo("asFloat.tif")); // if this is not desired, force a different pixeltype exportImage(srcImageRange(img), ImageExportInfo("asByte.tif").setPixelType("UINT8")); \endcode **/ VIGRA_EXPORT ImageExportInfo & setPixelType( const char * ); /** Get the pixel type of the image. Possible values are:
"UINT8"
8-bit unsigned integer (unsigned char)
"INT16"
16-bit signed integer (short)
"INT32"
32-bit signed integer (long)
"FLOAT"
32-bit floating point (float)
"DOUBLE"
64-bit floating point (double)
**/ VIGRA_EXPORT const char * getPixelType() const; VIGRA_EXPORT ImageExportInfo & setForcedRangeMapping(double fromMin, double fromMax, double toMin, double toMax); VIGRA_EXPORT bool hasForcedRangeMapping() const; VIGRA_EXPORT double getFromMin() const; VIGRA_EXPORT double getFromMax() const; VIGRA_EXPORT double getToMin() const; VIGRA_EXPORT double getToMax() const; /** Set the image resolution in horizontal direction **/ VIGRA_EXPORT ImageExportInfo & setXResolution( float ); VIGRA_EXPORT float getXResolution() const; /** Set the image resolution in vertical direction **/ VIGRA_EXPORT ImageExportInfo & setYResolution( float ); VIGRA_EXPORT float getYResolution() const; /** Set the position of the upper Left corner on a global canvas. Currently only supported by TIFF and PNG files. The offset is encoded in the XPosition and YPosition TIFF tags. @param pos position of the upper left corner in pixels (must be >= 0) **/ VIGRA_EXPORT ImageExportInfo & setPosition(const Diff2D & pos); /** Get the position of the upper left corner on a global canvas. **/ VIGRA_EXPORT Diff2D getPosition() const; /** ICC profiles (handled as raw data so far). see getICCProfile()/setICCProfile() **/ typedef ArrayVector ICCProfile; /** Returns a reference to the ICC profile. */ VIGRA_EXPORT const ICCProfile & getICCProfile() const; /** Sets the ICC profile. ICC profiles are currently supported by TIFF, PNG and JPEG images. (Otherwise, the profile data is silently ignored.) **/ VIGRA_EXPORT ImageExportInfo & setICCProfile(const ICCProfile & profile); private: std::string m_filename, m_filetype, m_pixeltype, m_comp; float m_x_res, m_y_res; Diff2D m_pos; ICCProfile m_icc_profile; double fromMin_, fromMax_, toMin_, toMax_; }; // return an encoder for a given ImageExportInfo object VIGRA_EXPORT std::auto_ptr encoder( const ImageExportInfo & info ); /********************************************************/ /* */ /* ImageImportInfo */ /* */ /********************************************************/ /** \brief Argument object for the function importImage(). See \ref importImage() for a usage example. This object must be used to read an image from disk and enquire about its properties. \#include \<vigra/imageinfo.hxx\>
Namespace: vigra **/ class ImageImportInfo { public: enum PixelType { UINT8, INT16, UINT16, INT32, UINT32, FLOAT, DOUBLE }; /** Construct ImageImportInfo object. The image with the given filename is read into memory. The file type will be determined by the first few bytes of the file (magic number). Recognized file types:
"BMP"
Microsoft Windows bitmap image file.
"JPEG"
Joint Photographic Experts Group JFIF format (only available if libjpeg is installed).
"GIF"
CompuServe graphics interchange format; 8-bit color.
"PNG"
Portable Network Graphics (only available if libpng is installed).
"PBM"
Portable bitmap format (black and white).
"PGM"
Portable graymap format (gray scale).
"PNM"
Portable anymap.
"PPM"
Portable pixmap format (color).
"SUN"
SUN Rasterfile.
"TIFF"
Tagged Image File Format. (only available if libtiff is installed.)
"VIFF"
Khoros Visualization image file.
**/ VIGRA_EXPORT ImageImportInfo( const char * ); VIGRA_EXPORT ~ImageImportInfo(); VIGRA_EXPORT const char * getFileName() const; /** Get the file type of the image associated with this info object. See ImageImportInfo::ImageImportInfo for a list of the available file types. **/ VIGRA_EXPORT const char * getFileType() const; /** Get width of the image. **/ VIGRA_EXPORT int width() const; /** Get height of the image. **/ VIGRA_EXPORT int height() const; /** Get the total number of bands in the image. **/ VIGRA_EXPORT int numBands() const; /** Get the number of extra (non color) bands in the image. ** Usually these are the alpha channels. **/ VIGRA_EXPORT int numExtraBands() const; /** Get size of the image. **/ VIGRA_EXPORT Size2D size() const; /** Returns true if the image is gray scale. **/ VIGRA_EXPORT bool isGrayscale() const; /** Returns true if the image is colored (RGB). **/ VIGRA_EXPORT bool isColor() const; /** Query the pixel type of the image. Possible values are:
"UINT8"
8-bit unsigned integer (unsigned char)
"INT16"
16-bit signed integer (short)
"UINT16"
16-bit unsigned integer (unsigned short)
"INT32"
32-bit signed integer (long)
"UINT32"
32-bit unsigned integer (unsigned long)
"FLOAT"
32-bit floating point (float)
"DOUBLE"
64-bit floating point (double)
**/ VIGRA_EXPORT const char * getPixelType() const; /// deprecated: use getPixelType() VIGRA_EXPORT PixelType pixelType() const; /** Returns true if the image has 1 byte per pixel (gray) or 3 bytes per pixel (RGB). **/ VIGRA_EXPORT bool isByte() const; /** Returns the layer offset of the current image, if there is one **/ VIGRA_EXPORT Diff2D getPosition() const; /** Returns the image resolution in horizontal direction **/ VIGRA_EXPORT float getXResolution() const; /** Returns the image resolution in vertical direction **/ VIGRA_EXPORT float getYResolution() const; /** ICC profiles (handled as raw data so far). see getICCProfile()/setICCProfile() **/ typedef ArrayVector ICCProfile; /** Returns a reference to the ICC profile. Note: The reference will become invalid when the ImageImportInfo object has been destroyed. **/ VIGRA_EXPORT const ICCProfile & getICCProfile() const; private: std::string m_filename, m_filetype, m_pixeltype; int m_width, m_height, m_num_bands, m_num_extra_bands; float m_x_res, m_y_res; Diff2D m_pos; ICCProfile m_icc_profile; }; // return a decoder for a given ImageImportInfo object VIGRA_EXPORT std::auto_ptr decoder( const ImageImportInfo & info ); //@} } // namespace vigra #endif // VIGRA_IMAGEINFO_HXX gamera-3.3.3/include/vigra/imageiterator.hxx0000644000076500000000000014417011261456425020077 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_IMAGEITERATOR_HXX #define VIGRA_IMAGEITERATOR_HXX #include "utilities.hxx" #include "accessor.hxx" #include "iteratortraits.hxx" #include "metaprogramming.hxx" namespace vigra { template class StridedIteratorPolicy { public: typedef IMAGEITERATOR ImageIterator; typedef typename IMAGEITERATOR::value_type value_type; typedef typename IMAGEITERATOR::difference_type::MoveY difference_type; typedef typename IMAGEITERATOR::reference reference; typedef typename IMAGEITERATOR::index_reference index_reference; typedef typename IMAGEITERATOR::pointer pointer; typedef std::random_access_iterator_tag iterator_category; struct BaseType { explicit BaseType(pointer c = 0, difference_type stride = 0) : current_(c), stride_(stride) {} pointer current_; difference_type stride_; }; static void initialize(BaseType & /* d */) {} static reference dereference(BaseType const & d) { return const_cast(*d.current_); } static index_reference dereference(BaseType const & d, difference_type n) { return const_cast(d.current_[n*d.stride_]); } static bool equal(BaseType const & d1, BaseType const & d2) { return d1.current_ == d2.current_; } static bool less(BaseType const & d1, BaseType const & d2) { return d1.current_ < d2.current_; } static difference_type difference(BaseType const & d1, BaseType const & d2) { return (d1.current_ - d2.current_) / d1.stride_; } static void increment(BaseType & d) { d.current_ += d.stride_; } static void decrement(BaseType & d) { d.current_ -= d.stride_; } static void advance(BaseType & d, difference_type n) { d.current_ += d.stride_*n; } }; /** \addtogroup ImageIterators Image Iterators \brief General image iterator definition and implementations.

The following tables describe the general requirements for image iterators and their iterator traits. The iterator implementations provided here may be used for any image data type that stores its data as a linear array of pixels. The array will be interpreted as a row-major matrix with a particular width.

Requirements for Image Iterators

Local Types Meaning
ImageIterator::value_typethe underlying image's pixel type
ImageIterator::PixelTypethe underlying image's pixel type
ImageIterator::reference the iterator's reference type (return type of *iter). Will be value_type & for a mutable iterator, and convertible to value_type const & for a const iterator.
ImageIterator::index_reference the iterator's index reference type (return type of iter[diff]). Will be value_type & for a mutable iterator, and convertible to value_type const & for a const iterator.
ImageIterator::pointer the iterator's pointer type (return type of iter.operator->()). Will be value_type * for a mutable iterator, and convertible to value_type const * for a const iterator.
ImageIterator::difference_type the iterator's difference type (vigra::Diff2D)
ImageIterator::iterator_category the iterator tag (vigra::image_traverser_tag)
ImageIterator::row_iteratorthe associated row iterator
ImageIterator::column_iteratorthe associated column iterator
ImageIterator::MoveXtype of the horizontal navigator
ImageIterator::MoveYtype of the vertical navigator
Operation Result Semantics
++i.x
i.x--
voidincrement x-coordinate
--i.x
i.x--
voiddecrement x-coordinate
i.x += dxImageIterator::MoveX & add dx to x-coordinate
i.x -= dxImageIterator::MoveX & subtract dx from x-coordinate
i.x - j.xint difference of the x-coordinates of i and j
i.x = j.xImageIterator::MoveX &i.x += j.x - i.x
i.x == i.yboolj.x - i.x == 0
i.x < j.xboolj.x - i.x > 0
++i.y
i.y++
voidincrement y-coordinate
--i.y
i.y--
voiddecrement y-coordinate
i.y += dyImageIterator::MoveY & add dy to y-coordinate
i.y -= dyImageIterator::MoveY & subtract dy from y-coordinate
i.y - j.yint difference of the y-coordinates of i and j
i.y = j.yImageIterator::MoveY &i.y += j.y - i.y
i.y == j.yboolj.y - i.y == 0
i.y < j.yboolj.y - i.y > 0
ImageIterator k(i)copy constructor
k = iImageIterator &assignment
ImageIterator kdefault constructor
ImageIterator::row_iterator r(i)construction of row iterator
ImageIterator::column_iterator c(i)construction of column iterator
i += diffImageIterator & { i.x += diff.x
i.y += diff.y; }
i -= diffImageIterator & { i.x -= diff.x
i.y -= diff.y; }
i + diffImageIterator { ImageIterator tmp(i);
tmp += diff;
return tmp; }
i - diffImageIterator { ImageIterator tmp(i);
tmp -= diff;
return tmp; }
i - jImageIterator::difference_type { ImageIterator::difference_type tmp(i.x - j.x, i.y - j.y);
return tmp; }
i == jbool i.x == j.x && i.y == j.y
*iImageIterator::reference access the current pixel
i[diff]ImageIterator::index_reference access pixel at offset diff
i(dx, dy)ImageIterator::index_reference access pixel at offset (dx, dy)
i->member()depends on operation call member function of underlying pixel type via operator-> of iterator
i, j, k are of type ImageIterator
diff is of type ImageIterator::difference_type
dx, dy are of type int

Requirements for Image Iterator Traits

The following iterator traits must be defined for an image iterator:

Types Meaning
IteratorTraits::Iteratorthe iterator type the traits are referring to
IteratorTraits::iteratorthe iterator type the traits are referring to
IteratorTraits::value_typethe underlying image's pixel type
IteratorTraits::reference the iterator's reference type (return type of *iter)
IteratorTraits::index_reference the iterator's index reference type (return type of iter[diff])
IteratorTraits::pointer the iterator's pointer type (return type of iter.operator->())
IteratorTraits::difference_type the iterator's difference type
IteratorTraits::iterator_category the iterator tag (vigra::image_traverser_tag)
IteratorTraits::row_iteratorthe associated row iterator
IteratorTraits::column_iteratorthe associated column iterator
IteratorTraits::DefaultAccessor the default accessor to be used with the iterator
IteratorTraits::default_accessor the default accessor to be used with the iterator
IteratorTraits::hasConstantStrides whether the iterator uses constant strides on the underlying memory (always VigraTrueType for ImageIterators).

*/ //@{ namespace detail { template class DirectionSelector; template <> class DirectionSelector { public: template class type { public: type(T base) : current_(base) {} type(type const & rhs) : current_(rhs.current_) {} type & operator=(type const & rhs) { current_ = rhs.current_; return *this; } void operator++() {++current_;} void operator++(int) {++current_;} void operator--() {--current_;} void operator--(int) {--current_;} void operator+=(int dx) {current_ += dx; } void operator-=(int dx) {current_ -= dx; } bool operator==(type const & rhs) const { return current_ == rhs.current_; } bool operator!=(type const & rhs) const { return current_ != rhs.current_; } bool operator<(type const & rhs) const { return current_ < rhs.current_; } bool operator<=(type const & rhs) const { return current_ <= rhs.current_; } bool operator>(type const & rhs) const { return current_ > rhs.current_; } bool operator>=(type const & rhs) const { return current_ >= rhs.current_; } int operator-(type const & rhs) const { return current_ - rhs.current_; } T operator()() const { return current_; } T operator()(int d) const { return current_ + d; } T current_; }; }; template <> class DirectionSelector { public: template class type { public: type(int stride, T base = 0) : stride_(stride), current_(base) {} type(type const & rhs) : stride_(rhs.stride_), current_(rhs.current_) {} type & operator=(type const & rhs) { stride_ = rhs.stride_; current_ = rhs.current_; return *this; } void operator++() {current_ += stride_; } void operator++(int) {current_ += stride_; } void operator--() {current_ -= stride_; } void operator--(int) {current_ -= stride_; } void operator+=(int dy) {current_ += dy*stride_; } void operator-=(int dy) {current_ -= dy*stride_; } bool operator==(type const & rhs) const { return (current_ == rhs.current_); } bool operator!=(type const & rhs) const { return (current_ != rhs.current_); } bool operator<(type const & rhs) const { return (current_ < rhs.current_); } bool operator<=(type const & rhs) const { return (current_ <= rhs.current_); } bool operator>(type const & rhs) const { return (current_ > rhs.current_); } bool operator>=(type const & rhs) const { return (current_ >= rhs.current_); } int operator-(type const & rhs) const { return (current_ - rhs.current_) / stride_; } T operator()() const { return current_; } T operator()(int d) const { return current_ + d*stride_; } int stride_; T current_; }; }; template class LinearIteratorSelector; template <> class LinearIteratorSelector { public: template class type { public: typedef typename IMAGEITERATOR::pointer res; template static res construct(typename IMAGEITERATOR::pointer data, DirSelect const &) { return data; } }; }; template <> class LinearIteratorSelector { public: template class type { public: typedef IteratorAdaptor > res; template static res construct(typename IMAGEITERATOR::pointer data, DirSelect const & d) { typedef typename res::BaseType Base; return res(Base(data, d.stride_)); } }; }; } // namespace detail /********************************************************/ /* */ /* ImageIteratorBase */ /* */ /********************************************************/ /** \brief Base class for 2D random access iterators. This class contains the navigational part of the iterator. It is usually not constructed directly, but via some derived class such as \ref ImageIterator or \ref StridedImageIterator. \#include \<vigra/imageiterator.hxx\> Namespace: vigra The usage examples assume that you constructed two iterators like this: \code vigra::ImageIterator iterator(base, width); vigra::ImageIterator iterator1(base, width); \endcode See the paper: U. Koethe: Reusable Algorithms in Image Processing for a discussion of the concepts behind ImageIterators. */ template class ImageIteratorBase { typedef typename detail::LinearIteratorSelector::template type RowIteratorSelector; typedef typename detail::LinearIteratorSelector::template type ColumnIteratorSelector; public: typedef ImageIteratorBase self_type; /** The underlying image's pixel type. */ typedef PIXELTYPE value_type; /** deprecated, use value_type instead. */ typedef PIXELTYPE PixelType; /** the iterator's reference type (return type of *iter) */ typedef REFERENCE reference; /** the iterator's index reference type (return type of iter[diff]) */ typedef REFERENCE index_reference; /** the iterator's pointer type (return type of iter.operator->()) */ typedef POINTER pointer; /** the iterator's difference type (argument type of iter[diff]) */ typedef Diff2D difference_type; /** the iterator tag (image traverser) */ typedef image_traverser_tag iterator_category; /** The associated row iterator. */ typedef typename RowIteratorSelector::res row_iterator; /** The associated column iterator. */ typedef typename ColumnIteratorSelector::res column_iterator; /** Let operations act in X direction */ typedef typename detail::DirectionSelector::template type MoveX; /** Let operations act in Y direction */ typedef typename detail::DirectionSelector::template type MoveY; /** @name Comparison of Iterators */ //@{ /** usage: iterator == iterator1 */ bool operator==(ImageIteratorBase const & rhs) const { return (x == rhs.x) && (y == rhs.y); } /** usage: iterator != iterator1 */ bool operator!=(ImageIteratorBase const & rhs) const { return (x != rhs.x) || (y != rhs.y); } /** usage: Diff2D dist = iterator - iterator1 */ difference_type operator-(ImageIteratorBase const & rhs) const { return difference_type(x - rhs.x, y - rhs.y); } //@} /** @name Specify coordinate to operate on */ //@{ /** Refer to iterator's x coordinate. Usage examples:
\code ++iterator.x; // move one step to the right --iterator.x; // move one step to the left iterator.x += dx; // move dx steps to the right iterator.x -= dx; // move dx steps to the left bool notAtEndOfRow = iterator.x < lowerRight.x; // compare x coordinates of two iterators int width = lowerRight.x - upperLeft.x; // calculate difference of x coordinates // between two iterators \endcode */ MoveX x; /** Refer to iterator's y coordinate. Usage examples:
\code ++iterator.y; // move one step down --iterator.y; // move one step up iterator.y += dy; // move dy steps down iterator.y -= dy; // move dy steps up bool notAtEndOfColumn = iterator.y < lowerRight.y; // compare y coordinates of two iterators int height = lowerRight.y - upperLeft.y; // calculate difference of y coordinates // between two iterators \endcode */ MoveY y; //@} protected: /** Construct from raw memory with a vertical stride of ystride. ystride must equal the physical image width (row length), even if the iterator will only be used for a sub image. This constructor must only be called for unstrided iterators (StridedOrUnstrided == UnstridedArrayTag) */ ImageIteratorBase(pointer base, int ystride) : x(base), y(ystride) {} /** Construct from raw memory with a horizontal stride of xstride and a vertical stride of ystride. This constructor may be used for iterators that shall skip pixels. Thus, it must only be called for strided iterators (StridedOrUnstrided == StridedArrayTag) */ ImageIteratorBase(pointer base, int xstride, int ystride) : x(xstride, base), y(ystride) {} /** Copy constructor */ ImageIteratorBase(ImageIteratorBase const & rhs) : x(rhs.x), y(rhs.y) {} /** Default constructor */ ImageIteratorBase() : x(0), y(0) {} /** Copy assignment */ ImageIteratorBase & operator=(ImageIteratorBase const & rhs) { if(this != &rhs) { x = rhs.x; y = rhs.y; } return *this; } public: /** @name Random navigation */ //@{ /** Add offset via Diff2D */ IMAGEITERATOR & operator+=(difference_type const & s) { x += s.x; y += s.y; return static_cast(*this); } /** Subtract offset via Diff2D */ IMAGEITERATOR & operator-=(difference_type const & s) { x -= s.x; y -= s.y; return static_cast(*this); } /** Add a distance */ IMAGEITERATOR operator+(difference_type const & s) const { IMAGEITERATOR ret(static_cast(*this)); ret += s; return ret; } /** Subtract a distance */ IMAGEITERATOR operator-(difference_type const & s) const { IMAGEITERATOR ret(static_cast(*this)); ret -= s; return ret; } //@} /** @name Access the Pixels */ //@{ /** Access current pixel.
usage: SomePixelType value = *iterator */ reference operator*() const { return *current(); } /** Call member of current pixel.
usage: iterator->pixelMemberFunction() */ pointer operator->() const { return current(); } /** Access pixel at offset from current location.
usage: SomePixelType value = iterator[Diff2D(1,1)] */ index_reference operator[](Diff2D const & d) const { return *current(d.x, d.y); } /** Access pixel at offset (dx, dy) from current location.
usage: SomePixelType value = iterator(dx, dy) */ index_reference operator()(int dx, int dy) const { return *current(dx, dy); } /** Read pixel with offset [dy][dx] from current pixel. Note that the 'x' index is the trailing index.
usage: SomePixelType value = iterator[dy][dx] */ pointer operator[](int dy) const { return x() + y(dy); } //@} row_iterator rowIterator() const { return RowIteratorSelector::construct(current(), x); } column_iterator columnIterator() const { return ColumnIteratorSelector::construct(current(), y); } private: pointer current() const { return x() + y(); } pointer current(int dx, int dy) const { return x(dx) + y(dy); } }; /********************************************************/ /* */ /* ImageIterator */ /* */ /********************************************************/ /** \brief Standard 2D random access iterator for images that store the data in a linear array. Most functions and local types are inherited from ImageIteratorBase. See the paper: U. Koethe: Reusable Algorithms in Image Processing for a discussion of the concepts behind ImageIterators. \#include \<vigra/imageiterator.hxx\> Namespace: vigra */ template class ImageIterator : public ImageIteratorBase, PIXELTYPE, PIXELTYPE &, PIXELTYPE *> { public: typedef ImageIteratorBase, PIXELTYPE, PIXELTYPE &, PIXELTYPE *> Base; typedef typename Base::pointer pointer; typedef typename Base::difference_type difference_type; /** Construct from raw memory with a vertical stride of ystride. ystride must equal the physical image width (row length), even if the iterator will only be used for a sub image. If the raw memory is encapsulated in an image object this object should have a factory function that constructs the iterator. */ ImageIterator(pointer base, int ystride) : Base(base, ystride) {} /** Default constructor */ ImageIterator() : Base() {} }; /********************************************************/ /* */ /* ConstImageIterator */ /* */ /********************************************************/ /** \brief Standard 2D random access const iterator for images that store the data as a linear array. Most functions are inherited from ImageIteratorBase. \#include \<vigra/imageiterator.hxx\> Namespace: vigra */ template class ConstImageIterator : public ImageIteratorBase, PIXELTYPE, PIXELTYPE const &, PIXELTYPE const *> { public: typedef ImageIteratorBase, PIXELTYPE, PIXELTYPE const &, PIXELTYPE const *> Base; typedef typename Base::pointer pointer; typedef typename Base::difference_type difference_type; /** Construct from raw memory with a vertical stride of ystride. ystride must equal the physical image width (row length), even if the iterator will only be used for a sub image. If the raw memory is encapsulated in an image object this object should have a factory function that constructs the iterator. */ ConstImageIterator(pointer base, int ystride) : Base(base, ystride) {} ConstImageIterator(ImageIterator const & o) : Base(o.x, o.y) {} /** Default constructor */ ConstImageIterator() : Base() {} ConstImageIterator & operator=(ImageIterator const & o) { Base::x = o.x; Base::y = o.y; return *this; } }; /********************************************************/ /* */ /* StridedImageIterator */ /* */ /********************************************************/ /** \brief Iterator to be used when pixels are to be skipped. This iterator can be used when some pixels shall be automatically skipped, for example if an image is to be sub-sampled: instead of advancing to the next pixel, ++iterator.x jumps to the pixel at a horizontal offset of xskip. Likewise with yskip in vertical direction. Most functions and local types are inherited from ImageIteratorBase. Usage: \code BImage img(w,h); ... int xskip = 2, yskip = 2; int wskip = w / xskip + 1, hskip = h / yskip + 1; StridedImageIterator upperLeft(&img(0,0), w, xskip, yskip); StridedImageIterator lowerRight = upperLeft + Diff2D(wskip, hskip); // now navigation with upperLeft and lowerRight lets the image appear to have half // the original resolution in either dimension \endcode \#include \<vigra/imageiterator.hxx\> Namespace: vigra */ template class StridedImageIterator : public ImageIteratorBase, PIXELTYPE, PIXELTYPE &, PIXELTYPE *, StridedArrayTag> { public: typedef ImageIteratorBase, PIXELTYPE, PIXELTYPE &, PIXELTYPE *, StridedArrayTag> Base; typedef typename Base::pointer pointer; typedef typename Base::difference_type difference_type; /** Construct from raw memory with a vertical stride of ystride, jumping by xskip horizontally and yskip vertically. ystride must be the physical width (row length) of the image. */ StridedImageIterator(pointer base, int ystride, int xskip, int yskip) : Base(base, xskip, ystride*yskip) {} /** Default constructor */ StridedImageIterator() : Base() {} }; /********************************************************/ /* */ /* ConstStridedImageIterator */ /* */ /********************************************************/ /** \brief Const iterator to be used when pixels are to be skipped. This iterator can be used when some pixels shall be automatically skipped, for example if an image is to be sub-sampled: instead of advancing to the next pixel, ++iterator.x jumps to the pixel at a horizontal offset of xskip. Likewise with yskip in vertical direction. Most functions and local types are inherited from ImageIteratorBase. Usage: \code BImage img(w,h); ... int xskip = 2, yskip = 2; int wskip = w / xskip + 1, hskip = h / yskip + 1; ConstStridedImageIterator upperLeft(&img(0,0), w, xskip, yskip); ConstStridedImageIterator lowerRight = upperLeft + Diff2D(wskip, hskip); // now navigation with upperLeft and lowerRight lets the image appear to have half // the original resolution in either dimension \endcode \#include \<vigra/imageiterator.hxx\> Namespace: vigra */ template class ConstStridedImageIterator : public ImageIteratorBase, PIXELTYPE, PIXELTYPE const &, PIXELTYPE const *, StridedArrayTag> { public: typedef ImageIteratorBase, PIXELTYPE, PIXELTYPE const &, PIXELTYPE const *, StridedArrayTag> Base; typedef typename Base::pointer pointer; typedef typename Base::difference_type difference_type; /** Construct from raw memory with a vertical stride of ystride, jumping by xskip horizontally and yskip vertically. ystride must be the physical width (row length) of the image. */ ConstStridedImageIterator(pointer base, int ystride, int xskip, int yskip) : Base(base, xskip, ystride*yskip) {} /** Copy-construct from mutable iterator */ ConstStridedImageIterator(StridedImageIterator const & o) : Base(o.x, o.y) {} /** Default constructor */ ConstStridedImageIterator() : Base() {} /** Assign mutable iterator */ ConstStridedImageIterator & operator=(StridedImageIterator const & o) { Base::x = o.x; Base::y = o.y; return *this; } }; /********************************************************/ /* */ /* definition of iterator traits */ /* */ /********************************************************/ #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct IteratorTraits > : public IteratorTraitsBase > { typedef ImageIterator mutable_iterator; typedef ConstImageIterator const_iterator; typedef typename AccessorTraits::default_accessor DefaultAccessor; typedef DefaultAccessor default_accessor; typedef VigraTrueType hasConstantStrides; }; template struct IteratorTraits > : public IteratorTraitsBase > { typedef ImageIterator mutable_iterator; typedef ConstImageIterator const_iterator; typedef typename AccessorTraits::default_const_accessor DefaultAccessor; typedef DefaultAccessor default_accessor; typedef VigraTrueType hasConstantStrides; }; template struct IteratorTraits > : public IteratorTraitsBase > { typedef StridedImageIterator mutable_iterator; typedef ConstStridedImageIterator const_iterator; typedef typename AccessorTraits::default_accessor DefaultAccessor; typedef DefaultAccessor default_accessor; typedef VigraTrueType hasConstantStrides; }; template struct IteratorTraits > : public IteratorTraitsBase > { typedef StridedImageIterator mutable_iterator; typedef ConstStridedImageIterator const_iterator; typedef typename AccessorTraits::default_const_accessor DefaultAccessor; typedef DefaultAccessor default_accessor; typedef VigraTrueType hasConstantStrides; }; #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION #define VIGRA_DEFINE_ITERATORTRAITS(VALUETYPE) \ template <> \ struct IteratorTraits > \ : public IteratorTraitsBase > \ { \ typedef ImageIterator mutable_iterator; \ typedef ConstImageIterator const_iterator; \ typedef typename AccessorTraits::default_accessor DefaultAccessor; \ typedef DefaultAccessor default_accessor; \ typedef VigraTrueType hasConstantStrides; \ }; \ \ template <> \ struct IteratorTraits > \ : public IteratorTraitsBase > \ { \ typedef ImageIterator mutable_iterator; \ typedef ConstImageIterator const_iterator; \ typedef typename AccessorTraits::default_const_accessor DefaultAccessor; \ typedef DefaultAccessor default_accessor; \ typedef VigraTrueType hasConstantStrides; \ }; \ template <> \ struct IteratorTraits > \ : public IteratorTraitsBase > \ { \ typedef StridedImageIterator mutable_iterator; \ typedef ConstStridedImageIterator const_iterator; \ typedef typename AccessorTraits::default_accessor DefaultAccessor; \ typedef DefaultAccessor default_accessor; \ typedef VigraTrueType hasConstantStrides; \ }; \ \ template <> \ struct IteratorTraits > \ : public IteratorTraitsBase > \ { \ typedef StridedImageIterator mutable_iterator; \ typedef ConstStridedImageIterator const_iterator; \ typedef typename AccessorTraits::default_const_accessor DefaultAccessor; \ typedef DefaultAccessor default_accessor; \ typedef VigraTrueType hasConstantStrides; \ }; VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) VIGRA_DEFINE_ITERATORTRAITS(RGBValue) #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #define VIGRA_PIXELTYPE TinyVector VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE) #undef VIGRA_PIXELTYPE #undef VIGRA_DEFINE_ITERATORTRAITS #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION template class ConstValueIteratorPolicy { public: typedef PIXELTYPE value_type; typedef int difference_type; typedef PIXELTYPE const & reference; typedef PIXELTYPE const & index_reference; typedef PIXELTYPE const * pointer; typedef std::random_access_iterator_tag iterator_category; struct BaseType { BaseType(PIXELTYPE const & v = PIXELTYPE(), int p = 0) : value(v), pos(p) {} PIXELTYPE value; int pos; }; static void initialize(BaseType & d) {} static reference dereference(BaseType const & d) { return d.value; } static index_reference dereference(BaseType d, difference_type) { return d.value; } static bool equal(BaseType const & d1, BaseType const & d2) { return d1.pos == d2.pos; } static bool less(BaseType const & d1, BaseType const & d2) { return d1.pos < d2.pos; } static difference_type difference(BaseType const & d1, BaseType const & d2) { return d1.pos - d2.pos; } static void increment(BaseType & d) { ++d.pos; } static void decrement(BaseType & d) { --d.pos; } static void advance(BaseType & d, difference_type n) { d.pos += n; } }; /********************************************************/ /* */ /* ConstValueIterator */ /* */ /********************************************************/ /** \brief Iterator that always returns the constant specified in the constructor. This iterator can be used to simulate an image that does not actually exist. \#include \<vigra/imageiterator.hxx\> Namespace: vigra */ template class ConstValueIterator { public: /** The type of the constant the iterator holds. */ typedef PIXELTYPE value_type; /** The type of the constant the iterator holds. */ typedef PIXELTYPE PixelType; /** the iterator's reference type (return type of *iter) */ typedef PIXELTYPE const & reference; /** the iterator's index reference type (return type of iter[diff]) */ typedef PIXELTYPE const & index_reference; /** the iterator's pointer type (return type of iter.operator->()) */ typedef PIXELTYPE const * pointer; /** the iterator's difference type (argument type of iter[diff]) */ typedef Diff2D difference_type; /** the iterator tag (image traverser) */ typedef image_traverser_tag iterator_category; /** The associated row iterator. */ typedef IteratorAdaptor > row_iterator; /** The associated column iterator. */ typedef IteratorAdaptor > column_iterator; /** Let operations act in X direction */ typedef int MoveX; /** Let operations act in Y direction */ typedef int MoveY; /** Default Constructor. (the constant is set to NumericTraits::zero() ) */ ConstValueIterator() : value_(NumericTraits::zero()), x(0), y(0) {} /** Construct with given constant. */ ConstValueIterator(PixelType const & v) : value_(v), x(0), y(0) {} /** Copy Constructor. */ ConstValueIterator(ConstValueIterator const & v) : value_(v.value_), x(v.x), y(v.y) {} /** Copy Assigment. */ ConstValueIterator & operator=(ConstValueIterator const & v) { if(this != &v) { value_ = v.value_; x = v.x; y = v.y; } return *this; } /** Move iterator by specified distance. */ ConstValueIterator & operator+=(Diff2D const & d) { x += d.x; y += d.y; return *this; } /** Move iterator by specified distance. */ ConstValueIterator & operator-=(Diff2D const & d) { x -= d.x; y -= d.y; return *this; } /** Create iterator at specified distance. */ ConstValueIterator operator+(Diff2D const & d) const { ConstValueIterator ret(*this); ret += d; return ret; } /** Create iterator at specified distance. */ ConstValueIterator operator-(Diff2D const & d) const { ConstValueIterator ret(*this); ret -= d; return ret; } /** Compute distance between two iterators */ Diff2D operator-(ConstValueIterator const & r) const { return Diff2D(x - r.x, y - r.y); } /** Equality. */ bool operator==(ConstValueIterator const & r) const { return (x == r.x) && (y == r.y); } /** Inequality. */ bool operator!=(ConstValueIterator const & r) const { return (x != r.x) || (y != r.y); } /** Read current pixel (return specified constant). */ reference operator*() const { return value_; } /** Call member function for stored constant. */ pointer operator->() const { return &value_; } /** Read pixel at a distance (return specified constant). */ index_reference operator()(int const &, int const &) const { return value_; } /** Read pixel at a distance (return specified constant). */ index_reference operator[](Diff2D const &) const { return value_; } /** Get row iterator at current position (which will also hold the constant). */ row_iterator rowIterator() const { return row_iterator(typename row_iterator::BaseType(value_, x)); } /** Get column iterator at current position (which will also hold the constant). */ column_iterator columnIterator() const { return column_iterator(typename column_iterator::BaseType(value_, y)); } /** @name Specify coordinate direction for navigation commands */ //@{ /// refer to x coordinate int x; /// refer to y coordinate int y; //@} private: PixelType value_; }; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct IteratorTraits > { typedef ConstValueIterator Iterator; typedef Iterator iterator; typedef typename iterator::iterator_category iterator_category; typedef typename iterator::value_type value_type; typedef typename iterator::reference reference; typedef typename iterator::index_reference index_reference; typedef typename iterator::pointer pointer; typedef typename iterator::difference_type difference_type; typedef typename iterator::row_iterator row_iterator; typedef typename iterator::column_iterator column_iterator; typedef StandardConstAccessor DefaultAccessor; typedef StandardConstAccessor default_accessor; typedef VigraTrueType hasConstantStrides; }; #endif /** \brief Simulate an image where each pixel contains its coordinate. CoordinateIterator used to be a separate class, but has now become an alias for \ref vigra::Diff2D. This is possible because Diff2D now provides all the necessary functionality. CoordinateIterator behaves like a read-only \ref vigra::ImageIterator for an image in which each pixel contains its coordinate. This is useful for algorithms that need access to the current pixel's location. For example, you can use CoordinateIterator/Diff2D to find the center of mass of an image region. To implement this, we first need a functor for center-of-mass calculations: \code struct CenterOfMassFunctor { CenterOfMassFunctor() : x(0.0), y(0.0), size(0) {} void operator()(Diff2d const& diff) { ++size; x += diff.x; y += diff.y; } float xCenter() const { return x / size; } float yCenter() const { return y / size; } float x; float y; int size; }; \endcode Using this functor, we find the center of mass like so: \code vigra::BImage img(w,h); ... // mark a region in the image with '1', background with '0' CenterOfMassFunctor center; vigra::inspectImageIf( srcIterRange(Diff2D(), Diff2D() + img.size()), srcImage(img), center); std::cout << "Center of mass: " << center.xCenter() << ", " << center.yCenter() << std::endl; \endcode \#include \<vigra/imageiterator.hxx\> Namespace: vigra */ typedef Diff2D CoordinateIterator; //@} } // namespace vigra #endif // VIGRA_IMAGEITERATOR_HXX gamera-3.3.3/include/vigra/imageiteratoradapter.hxx0000644000076500000000000004134211261456425021435 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_IMAGEITERATORADAPTER_HXX #define VIGRA_IMAGEITERATORADAPTER_HXX #include // iterator tags namespace vigra { /** \addtogroup ImageIteratorAdapters Image Iterator Adapters Iterate over rows, columns, neighborhoods, contours, and other image subsets */ //@{ /********************************************************/ /* */ /* ColumnIterator */ /* */ /********************************************************/ /** \brief Iterator adapter to linearly access colums. This iterator may be initialized from any standard ImageIterator, a MultibandImageIterator and so on. It gives you STL-compatible (random access iterator) access to one column of the image. If the underlying iterator is a const iterator, the column iterator will also be const (i.e. doesn't allow to change the values it points to). The iterator gets associated with the accessor of the base iterator. Note that image iterators usually have a member columnIterator() which returns a column iterator optimized for that particular image class. ColumnIterator is only necessary if this 'native' column iterator is not usable in a particular situation or is not provided. \#include \<vigra/imageiteratoradapter.hxx\> Namespace: vigra */ template class ColumnIterator : private IMAGE_ITERATOR { public: /** the iterator's value type */ typedef typename IMAGE_ITERATOR::value_type value_type; /** the iterator's value type */ typedef typename IMAGE_ITERATOR::value_type PixelType; /** the iterator's reference type (return type of *iter) */ typedef typename IMAGE_ITERATOR::reference reference; /** the iterator's index reference type (return type of iter[n]) */ typedef typename IMAGE_ITERATOR::index_reference index_reference; /** the iterator's pointer type (return type of iter.operator->()) */ typedef typename IMAGE_ITERATOR::pointer pointer; /** the iterator's difference type (argument type of iter[diff]) */ typedef typename IMAGE_ITERATOR::difference_type::MoveY difference_type; /** the iterator tag (random access iterator) */ typedef std::random_access_iterator_tag iterator_category; /** the type of the adapted iterator */ typedef IMAGE_ITERATOR Adaptee; /** Construct from an the image iterator to be adapted. */ ColumnIterator(IMAGE_ITERATOR const & i) : IMAGE_ITERATOR(i) {} /** Assignment. */ ColumnIterator & operator=(ColumnIterator const & i) { IMAGE_ITERATOR::operator=(i); return *this; } /** Assign a new base iterator. */ ColumnIterator & operator=(IMAGE_ITERATOR const & i) { IMAGE_ITERATOR::operator=(i); return *this; } /** @name Navigation */ //@{ /// ColumnIterator & operator++() { ++(this->y); return *this; } /// ColumnIterator operator++(int) { ColumnIterator ret(*this); (this->y)++; return ret; } /// ColumnIterator & operator--() { --(this->y); return *this; } /// ColumnIterator operator--(int) { ColumnIterator ret(*this); (this->y)--; return ret; } /// ColumnIterator & operator+=(int d) { this->y += d; return *this; } /// ColumnIterator & operator-=(int d) { this->y -= d; return *this; } //@} /** @name Methods */ //@{ /** Construct iterator at a distance. */ ColumnIterator operator+(int d) const { IMAGE_ITERATOR ret(*this); ret.y += d; return ColumnIterator(ret); } /** Construct iterator at a distance. */ ColumnIterator operator-(int d) const { IMAGE_ITERATOR ret(*this); ret.y -= d; return ColumnIterator(ret); } /** Calculate distance. */ int operator-(ColumnIterator const & c) const { return this->y - c.y; } /** Equality. */ bool operator==(ColumnIterator const & c) const { return IMAGE_ITERATOR::operator==(c); } /** Inequality. */ bool operator!=(ColumnIterator const & c) const { return IMAGE_ITERATOR::operator!=(c); } /** Smaller than. */ bool operator<(ColumnIterator const & c) const { return this->y < c.y; } /** Access current pixel. */ reference operator*() const { return IMAGE_ITERATOR::operator*(); } /** Access pixel at distance d. */ index_reference operator[](int d) const { return IMAGE_ITERATOR::operator()(0, d); } /** Call member function of current pixel. */ pointer operator->() const { return IMAGE_ITERATOR::operator->(); } /** Get a reference to the adapted iterator */ Adaptee & adaptee() const { return (Adaptee &)*this; } //@} }; /********************************************************/ /* */ /* RowIterator */ /* */ /********************************************************/ /** \brief Iterator adapter to linearly access row. This iterator may be initialized from a standard ImageIterator, a MultibandImageIterator and so on. It gives you STL-compatible (random access iterator) access to one row of the image. If the underlying iterator is a const iterator, the row iterator will also be const (i.e. doesn't allow to change the values it points to). The iterator gets associated with the accessor of the base iterator. Note that image iterators usually have a member rowIterator() which returns a row iterator optimized for that particular image class. RowIterator is only necessary if this 'native' row iterator is not usable in a particular situation or is not provided. \#include \<vigra/imageiteratoradapter.hxx\> Namespace: vigra */ template class RowIterator : private IMAGE_ITERATOR { public: /** the iterator's value type */ typedef typename IMAGE_ITERATOR::value_type value_type; /** the iterator's value type */ typedef typename IMAGE_ITERATOR::value_type PixelType; /** the iterator's reference type (return type of *iter) */ typedef typename IMAGE_ITERATOR::reference reference; /** the iterator's index reference type (return type of iter[n]) */ typedef typename IMAGE_ITERATOR::index_reference index_reference; /** the iterator's pointer type (return type of iter.operator->()) */ typedef typename IMAGE_ITERATOR::pointer pointer; /** the iterator's difference type (argument type of iter[diff]) */ typedef typename IMAGE_ITERATOR::difference_type::MoveY difference_type; /** the iterator tag (random access iterator) */ typedef std::random_access_iterator_tag iterator_category; /** the type of the adapted iterator */ typedef IMAGE_ITERATOR Adaptee; /** Construct from an the image iterator to be adapted. */ RowIterator(IMAGE_ITERATOR const & i) : IMAGE_ITERATOR(i) {} /** Assignment. */ RowIterator & operator=(RowIterator const & i) { IMAGE_ITERATOR::operator=(i); return *this; } /** Assign a new base iterator. */ RowIterator & operator=(IMAGE_ITERATOR const & i) { IMAGE_ITERATOR::operator=(i); return *this; } /** @name Navigation */ //@{ /// RowIterator & operator++() { ++(this->x); return *this; } /// RowIterator operator++(int) { RowIterator ret(*this); (this->x)++; return ret; } /// RowIterator & operator--() { --(this->x); return *this; } /// RowIterator operator--(int) { RowIterator ret(*this); (this->x)--; return ret; } /// RowIterator & operator+=(int d) { this->x += d; return *this; } /// RowIterator & operator-=(int d) { this->x -= d; return *this; } //@} /** @name Methods */ //@{ /** Construct iterator at a distance. */ RowIterator operator+(int d) const { IMAGE_ITERATOR ret(*this); ret.x += d; return RowIterator(ret); } /** Construct iterator at a distance. */ RowIterator operator-(int d) const { IMAGE_ITERATOR ret(*this); ret.x -= d; return RowIterator(ret); } /** Calculate distance. */ int operator-(RowIterator const & c) const { return this->x - c.x; } /** Equality. */ bool operator==(RowIterator const & c) const { return IMAGE_ITERATOR::operator==(c); } /** Inequality. */ bool operator!=(RowIterator const & c) const { return IMAGE_ITERATOR::operator!=(c); } /** Smaller than. */ bool operator<(RowIterator const & c) const { return this->x < c.x; } /** Access current pixel. */ reference operator*() const { return IMAGE_ITERATOR::operator*(); } /** Access pixel at distance d. */ index_reference operator[](int d) const { return IMAGE_ITERATOR::operator()(d, 0); } /** Call member function of current pixel. */ pointer operator->() const { return IMAGE_ITERATOR::operator->(); } /** Get a reference to the adapted iterator */ Adaptee & adaptee() const { return (Adaptee &)*this; } //@} }; /********************************************************/ /* */ /* LineIterator */ /* */ /********************************************************/ /** \brief Iterator adapter to iterate along an arbitrary line on the image. This iterator may be initialized from a standard ImageIterator, a MultibandImageIterator and so on. It gives you STL-compatible (forward iterator) access to an arbitraty line on the image. The iterator gets associated with the accessor of the base iterator. \#include \<vigra/imageiteratoradapter.hxx\> Namespace: vigra */ template class LineIterator : private IMAGE_ITERATOR { public: /** the iterator's value type */ typedef typename IMAGE_ITERATOR::value_type value_type; /** the iterator's value type */ typedef typename IMAGE_ITERATOR::value_type PixelType; /** the iterator's reference type (return type of *iter) */ typedef typename IMAGE_ITERATOR::reference reference; /** the iterator's pointer type (return type of iter.operator->()) */ typedef typename IMAGE_ITERATOR::pointer pointer; /** the iterator tag (forward iterator) */ typedef std::forward_iterator_tag iterator_category; /** the type of the adapted iterator */ typedef IMAGE_ITERATOR Adaptee; /** Construct from an the image iterator to be adapted. */ LineIterator(IMAGE_ITERATOR const & start, IMAGE_ITERATOR const & end) : IMAGE_ITERATOR(start), x_(0.0), y_(0.0) { int dx = end.x - start.x; int dy = end.y - start.y; int adx = (dx < 0) ? -dx : dx; int ady = (dy < 0) ? -dy : dy; int dd = (adx > ady) ? adx : ady; if(dd == 0) dd = 1; dx_ = (double)dx / dd; dy_ = (double)dy / dd; if(adx > ady) y_ += dy_ / 2.0; else x_ += dx_ / 2.0; } /** @name Navigation */ //@{ /// LineIterator & operator++() { x_ += dx_; if(x_ >= 1.0) { x_ -= 1.0; ++(this->x); } else if(x_ <= -1.0) { x_ += 1.0; --(this->x); } y_ += dy_; if(y_ >= 1.0) { y_ -= 1.0; ++(this->y); } else if(y_ <= -1.0) { y_ += 1.0; --(this->y); } return *this; } /// LineIterator operator++(int) { LineIterator ret(*this); operator++(); return ret; } //@} /** @name Methods */ //@{ /** Equality. */ bool operator==(LineIterator const & c) const { return IMAGE_ITERATOR::operator==(c); } /** Inequality. */ bool operator!=(LineIterator const & c) const { return IMAGE_ITERATOR::operator!=(c); } /** Access current pixel. */ reference operator*() const { return IMAGE_ITERATOR::operator*(); } /** Call member function for current pixel. */ pointer operator->() const { return IMAGE_ITERATOR::operator->(); } /** Get a reference to the adapted iterator */ Adaptee & adaptee() const { return (Adaptee &)*this; } //@} private: double x_, y_, dx_, dy_; }; //@} } // namespace vigra #endif // VIGRA_IMAGEITERATORADAPTER_HXX gamera-3.3.3/include/vigra/impex.hxx0000644000076500000000000012116211261456425016361 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2001-2002 by Gunnar Kedenburg */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ /* Modifications by Pablo d'Angelo * updated to vigra 1.4 by Douglas Wilkins * as of 18 Febuary 2006: * - Added import/export of UINT16 and UINT32 image types. * Modifications by Andrew Mihal * updated to vigra 1.4 by Douglas Wilkins * as of 18 Febuary 2006: * - Moved some RowIterator declarations around to avoid using default ctors * (cachedfileimages do not have default ctors for row iterators). * - Added some case-specific optimizations */ /*! \file impex.hxx \brief image import and export functions this file provides the declarations and implementations of importImage() and exportImage(). the matching implementation for the given datatype is selected by template metacode. */ #ifndef VIGRA_IMPEX_HXX #define VIGRA_IMPEX_HXX #if defined(_MSC_VER) #pragma warning (disable: 4267) #endif #include "sized_int.hxx" #include "stdimage.hxx" #include "tinyvector.hxx" #include "imageinfo.hxx" #include "numerictraits.hxx" #include "codec.hxx" #include "accessor.hxx" #include "inspectimage.hxx" #include "transformimage.hxx" #include "copyimage.hxx" #include "multi_array.hxx" // TODO // next refactoring: pluggable conversion algorithms namespace vigra { /** \addtogroup VigraImpex **/ //@{ /*! \brief used for reading bands after the source data type has been figured out. \#include \<vigra/impex.hxx\>
Namespace: vigra Declaration: \code namespace vigra { template< class ImageIterator, class Accessor, class SrcValueType > void read_bands( Decoder * dec, ImageIterator ys, Accessor a, SrcValueType ) } \endcode \param dec decoder object through which the source data will be accessed \param ys image iterator referencing the upper left pixel of the destination image \param a image accessor for the destination image */ template< class ImageIterator, class Accessor, class SrcValueType > void read_bands( Decoder * dec, ImageIterator ys, Accessor a, SrcValueType ) { typedef unsigned int size_type; typedef typename ImageIterator::row_iterator DstRowIterator; typedef typename Accessor::value_type AccessorValueType; typedef typename AccessorValueType::value_type DstValueType; const size_type width = dec->getWidth(); const size_type height = dec->getHeight(); const size_type num_bands = dec->getNumBands(); vigra_precondition(num_bands == a.size(ys), "importImage(): number of bands (color channels) in file and destination image differ."); SrcValueType const * scanline; // MIHAL no default constructor available for cachedfileimages. DstRowIterator xs = ys.rowIterator(); // iterate if (num_bands == 4) { // Speedup for this particular case unsigned int offset = dec->getOffset(); SrcValueType const * scanline0; SrcValueType const * scanline1; SrcValueType const * scanline2; SrcValueType const * scanline3; for( size_type y = 0; y < height; ++y, ++ys.y ) { dec->nextScanline(); xs = ys.rowIterator(); scanline0 = static_cast< SrcValueType const * > (dec->currentScanlineOfBand(0)); scanline1 = static_cast< SrcValueType const * > (dec->currentScanlineOfBand(1)); scanline2 = static_cast< SrcValueType const * > (dec->currentScanlineOfBand(2)); scanline3 = static_cast< SrcValueType const * > (dec->currentScanlineOfBand(3)); for( size_type x = 0; x < width; ++x, ++xs ) { /* a.template setComponent( *scanline0, xs ); a.template setComponent( *scanline1, xs ); a.template setComponent( *scanline2, xs ); a.template setComponent( *scanline3, xs ); */ a.setComponent( *scanline0, xs, 0); a.setComponent( *scanline1, xs, 1); a.setComponent( *scanline2, xs, 2); a.setComponent( *scanline3, xs, 3); scanline0 += offset; scanline1 += offset; scanline2 += offset; scanline3 += offset; } } } else { // General case for( size_type y = 0; y < height; ++y, ++ys.y ) { dec->nextScanline(); for( size_type b = 0; b < num_bands; ++b ) { xs = ys.rowIterator(); scanline = static_cast< SrcValueType const * > (dec->currentScanlineOfBand(b)); for( size_type x = 0; x < width; ++x, ++xs ) { a.setComponent( *scanline, xs, b ); scanline += dec->getOffset(); } } } } } // read_bands() /*! \brief used for reading bands after the source data type has been figured out. \#include \<vigra/impex.hxx\>
Namespace: vigra Declaration: \code namespace vigra { template< class ImageIterator, class Accessor, class SrcValueType > void read_band( Decoder * dec, ImageIterator ys, Accessor a, SrcValueType ) } \endcode \param dec decoder object through which the source data will be accessed \param ys image iterator referencing the upper left pixel of the destination image \param a image accessor for the destination image */ template< class ImageIterator, class Accessor, class SrcValueType > void read_band( Decoder * dec, ImageIterator ys, Accessor a, SrcValueType ) { typedef unsigned int size_type; typedef typename ImageIterator::row_iterator DstRowIterator; typedef typename Accessor::value_type DstValueType; const size_type width = dec->getWidth(); const size_type height = dec->getHeight(); SrcValueType const * scanline; // MIHAL no default constructor available for cachedfileimages. DstRowIterator xs = ys.rowIterator(); for( size_type y = 0; y < height; ++y, ++ys.y ) { dec->nextScanline(); xs = ys.rowIterator(); scanline = static_cast< SrcValueType const * >(dec->currentScanlineOfBand(0)); for( size_type x = 0; x < width; ++x, ++xs ) a.set( scanline[x], xs ); } } // read_band() /*! \brief used for reading images of vector type, such as integer of float rgb. \#include \<vigra/impex.hxx\>
Namespace: vigra Declaration: \code namespace vigra { template< class ImageIterator, class Accessor > void importVectorImage( const ImageImportInfo & info, ImageIterator iter, Accessor a ) } \endcode Paramters:
ImageIterator
the image iterator type for the destination image
Accessor
the image accessor type for the destination image
info
user supplied image import information
iter
image iterator referencing the upper left pixel of the destination image
a
image accessor for the destination image
*/ doxygen_overloaded_function(template <...> void importVectorImage) template< class ImageIterator, class Accessor > void importVectorImage( const ImageImportInfo & info, ImageIterator iter, Accessor a ) { std::auto_ptr dec = decoder(info); std::string pixeltype = dec->getPixelType(); if ( pixeltype == "UINT8" ) read_bands( dec.get(), iter, a, (UInt8)0 ); else if ( pixeltype == "INT16" ) read_bands( dec.get(), iter, a, Int16() ); else if ( pixeltype == "UINT16" ) read_bands( dec.get(), iter, a, (UInt16)0 ); else if ( pixeltype == "INT32" ) read_bands( dec.get(), iter, a, Int32() ); else if ( pixeltype == "UINT32" ) read_bands( dec.get(), iter, a, (UInt32)0 ); else if ( pixeltype == "FLOAT" ) read_bands( dec.get(), iter, a, float() ); else if ( pixeltype == "DOUBLE" ) read_bands( dec.get(), iter, a, double() ); else vigra_precondition( false, "invalid pixeltype" ); // close the decoder dec->close(); } /*! \brief used for reading images of scalar type, such as integer and float grayscale. \#include \<vigra/impex.hxx\>
Namespace: vigra Declaration: \code namespace vigra { template < class ImageIterator, class Accessor > void importScalarImage( const ImageImportInfo & info, ImageIterator iter, Accessor a ) } \endcode Paramters:
ImageIterator
the image iterator type for the destination image
Accessor
the image accessor type for the destination image
info
user supplied image import information
iter
image iterator referencing the upper left pixel of the destination image
a
image accessor for the destination image
*/ doxygen_overloaded_function(template <...> void importScalarImage) template < class ImageIterator, class Accessor > void importScalarImage( const ImageImportInfo & info, ImageIterator iter, Accessor a ) { std::auto_ptr dec = decoder(info); std::string pixeltype = dec->getPixelType(); if ( pixeltype == "UINT8" ) read_band( dec.get(), iter, a, (UInt8)0 ); else if ( pixeltype == "INT16" ) read_band( dec.get(), iter, a, Int16() ); else if ( pixeltype == "UINT16" ) read_band( dec.get(), iter, a, (UInt16)0 ); else if ( pixeltype == "INT32" ) read_band( dec.get(), iter, a, Int32() ); else if ( pixeltype == "UINT32" ) read_band( dec.get(), iter, a, (UInt32)0 ); else if ( pixeltype == "FLOAT" ) read_band( dec.get(), iter, a, float() ); else if ( pixeltype == "DOUBLE" ) read_band( dec.get(), iter, a, double() ); else vigra_precondition( false, "invalid pixeltype" ); // close the decoder dec->close(); } /********************************************************/ /* */ /* importImage */ /* */ /********************************************************/ /** \brief Read the image specified by the given \ref vigra::ImageImportInfo object. Declarations: pass arguments explicitly: \code namespace vigra { template void importImage(ImageImportInfo const & image, ImageIterator iter, Accessor a) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void importImage(ImageImportInfo const & image, pair dest) } \endcode Usage: \#include \<vigra/impex.hxx\>
Namespace: vigra \code vigra::ImageImportInfo info("myimage.gif"); if(info.isGrayscale()) { // create byte image of appropriate size vigra::BImage in(info.width(), info.height()); vigra::importImage(info, destImage(in)); // read the image ... } else { // create byte RGB image of appropriate size vigra::BRGBImage in(info.width(), info.height()); vigra::importImage(info, destImage(in)); // read the image ... } \endcode Preconditions:
  • the image file must be readable
  • the file type must be one of
    "BMP"
    Microsoft Windows bitmap image file.
    "GIF"
    CompuServe graphics interchange format; 8-bit color.
    "JPEG"
    Joint Photographic Experts Group JFIF format; compressed 24-bit color. (only available if libjpeg is installed)
    "PNG"
    Portable Network Graphic. (only available if libpng is installed)
    "PBM"
    Portable bitmap format (black and white).
    "PGM"
    Portable graymap format (gray scale).
    "PNM"
    Portable anymap.
    "PPM"
    Portable pixmap format (color).
    "SUN"
    SUN Rasterfile.
    "TIFF"
    Tagged Image File Format. (only available if libtiff is installed.)
    "VIFF"
    Khoros Visualization image file.
**/ doxygen_overloaded_function(template <...> void importImage) template < class ImageIterator, class Accessor > void importImage( const ImageImportInfo & info, ImageIterator iter, Accessor a ) { typedef typename NumericTraits::isScalar is_scalar; importImage( info, iter, a, is_scalar() ); } template < class ImageIterator, class Accessor > void importImage( const ImageImportInfo & info, pair< ImageIterator, Accessor > dest ) { importImage( info, dest.first, dest.second ); } template < class ImageIterator, class Accessor > void importImage( const ImageImportInfo & info, ImageIterator iter, Accessor a, VigraFalseType ) { importVectorImage( info, iter, a ); } template < class ImageIterator, class Accessor > void importImage( const ImageImportInfo & info, ImageIterator iter, Accessor a, VigraTrueType ) { importScalarImage( info, iter, a ); } /*! \brief used for writing bands after the source data type has been figured out. \#include \<vigra/impex.hxx\>
Namespace: vigra Declaration: \code namespace vigra { template< class ImageIterator, class Accessor, class DstValueType > void write_bands( Encoder * enc, ImageIterator ul, ImageIterator lr, Accessor a, DstValueType ) } \endcode \param enc encoder object through which the destination data will be accessed \param ul image iterator referencing the upper left pixel of the source image \param lr image iterator referencing the lower right pixel of the source image \param a image accessor for the source image */ template< class ImageIterator, class Accessor, class DstValueType > void write_bands( Encoder * enc, ImageIterator ul, ImageIterator lr, Accessor a, DstValueType) { typedef unsigned int size_type; typedef typename ImageIterator::row_iterator SrcRowIterator; typedef typename Accessor::value_type AccessorValueType; typedef typename AccessorValueType::value_type SrcValueType; // complete decoder settings const size_type width = lr.x - ul.x; const size_type height = lr.y - ul.y; enc->setWidth(width); enc->setHeight(height); const size_type num_bands = a.size(ul); enc->setNumBands(num_bands); enc->finalizeSettings(); DstValueType * scanline; // iterate ImageIterator ys(ul); // MIHAL no default constructor available for cachedfileimages SrcRowIterator xs = ys.rowIterator(); if (num_bands == 4) { // Speedup for this particular case unsigned int offset = enc->getOffset(); DstValueType * scanline0; DstValueType * scanline1; DstValueType * scanline2; DstValueType * scanline3; for( size_type y = 0; y < height; ++y, ++ys.y ) { xs = ys.rowIterator(); scanline0 = static_cast< DstValueType * > (enc->currentScanlineOfBand(0)); scanline1 = static_cast< DstValueType * > (enc->currentScanlineOfBand(1)); scanline2 = static_cast< DstValueType * > (enc->currentScanlineOfBand(2)); scanline3 = static_cast< DstValueType * > (enc->currentScanlineOfBand(3)); for( size_type x = 0; x < width; ++x, ++xs) { /* *scanline0 = a.template getComponent( xs ); *scanline1 = a.template getComponent( xs ); *scanline2 = a.template getComponent( xs ); *scanline3 = a.template getComponent( xs ); */ *scanline0 = detail::RequiresExplicitCast::cast(a.getComponent( xs, 0)); *scanline1 = detail::RequiresExplicitCast::cast(a.getComponent( xs, 1)); *scanline2 = detail::RequiresExplicitCast::cast(a.getComponent( xs, 2)); *scanline3 = detail::RequiresExplicitCast::cast(a.getComponent( xs, 3)); scanline0 += offset; scanline1 += offset; scanline2 += offset; scanline3 += offset; } enc->nextScanline(); } } else { // General case for( size_type y = 0; y < height; ++y, ++ys.y ) { for( size_type b = 0; b < num_bands; ++b ) { xs = ys.rowIterator(); scanline = static_cast< DstValueType * > (enc->currentScanlineOfBand(b)); for( size_type x = 0; x < width; ++x, ++xs ) { *scanline = detail::RequiresExplicitCast::cast(a.getComponent( xs, b )); scanline += enc->getOffset(); } } enc->nextScanline(); } } } // write_bands() template< class MArray, class DstValueType > void write_bands( Encoder * enc, MArray const & array, DstValueType) { typedef unsigned int size_type; // complete decoder settings const size_type width = array.shape(0); const size_type height = array.shape(1); enc->setWidth(width); enc->setHeight(height); const size_type num_bands = array.shape(2); enc->setNumBands(num_bands); enc->finalizeSettings(); DstValueType * scanline; // iterate for( size_type y = 0; y < height; ++y ) { for( size_type b = 0; b < num_bands; ++b ) { scanline = static_cast< DstValueType * > (enc->currentScanlineOfBand(b)); for( size_type x = 0; x < width; ++x) { *scanline = array(x, y, b); scanline += enc->getOffset(); } } enc->nextScanline(); } } // write_bands() /*! \brief used for writing bands after the source data type has been figured out. \#include \<vigra/impex.hxx\>
Namespace: vigra Declaration: \code namespace vigra { template< class ImageIterator, class Accessor, class DstValueType > void write_band( Encoder * enc, ImageIterator ul, ImageIterator lr, Accessor a, DstValueType ) } \endcode \param enc encoder object through which the destination data will be accessed \param ul image iterator referencing the upper left pixel of the source image \param lr image iterator referencing the lower right pixel of the source image \param a image accessor for the source image */ template< class ImageIterator, class Accessor, class DstValueType > void write_band( Encoder * enc, ImageIterator ul, ImageIterator lr, Accessor a, DstValueType) { typedef unsigned int size_type; typedef typename ImageIterator::row_iterator SrcRowIterator; typedef typename Accessor::value_type SrcValueType; // complete decoder settings const size_type width = lr.x - ul.x; const size_type height = lr.y - ul.y; enc->setWidth(width); enc->setHeight(height); enc->setNumBands(1); enc->finalizeSettings(); DstValueType * scanline; // iterate ImageIterator ys(ul); // MIHAL no default constructor available for cachedfileimages. SrcRowIterator xs = ys.rowIterator(); size_type y; for( y = 0; y < height; ++y, ++ys.y ) { xs = ys.rowIterator(); scanline = static_cast< DstValueType * >(enc->currentScanlineOfBand(0)); for( size_type x = 0; x < width; ++x, ++xs, ++scanline ) *scanline = detail::RequiresExplicitCast::cast(a(xs)); enc->nextScanline(); } } // write_band() namespace detail { // export scalar images without conversion template < class SrcIterator, class SrcAccessor, class T > void exportScalarImage(SrcIterator sul, SrcIterator slr, SrcAccessor sget, Encoder * enc, T zero) { write_band( enc, sul, slr, sget, zero ); } // export scalar images with conversion template < class SrcIterator, class SrcAccessor, class T > void exportScalarImage(SrcIterator sul, SrcIterator slr, SrcAccessor sget, Encoder * enc, const ImageExportInfo & info, T zero) { double fromMin, fromMax, toMin, toMax; if(info.hasForcedRangeMapping()) { fromMin = info.getFromMin(); fromMax = info.getFromMax(); toMin = info.getToMin(); toMax = info.getToMax(); } else { typedef typename SrcAccessor::value_type SrcValue; FindMinMax minmax; inspectImage( sul, slr, sget, minmax ); fromMin = (double)minmax.min; fromMax = (double)minmax.max; toMin = (double)NumericTraits::min(); toMax = (double)NumericTraits::max(); } double scale = (toMax - toMin) / (fromMax - fromMin); double offset = (toMin / scale) - fromMin; BasicImage image(slr-sul); transformImage( sul, slr, sget, image.upperLeft(), image.accessor(), linearIntensityTransform(scale, offset)); write_band( enc, image.upperLeft(), image.lowerRight(), image.accessor(), zero ); } // export vector images without conversion template < class SrcIterator, class SrcAccessor, class T > void exportVectorImage(SrcIterator sul, SrcIterator slr, SrcAccessor sget, Encoder * enc, T zero) { int bands = sget.size(sul); vigra_precondition(isBandNumberSupported(enc->getFileType(), bands), "exportImage(): file format does not support requested number of bands (color channels)"); write_bands( enc, sul, slr, sget, zero ); } // export vector images with conversion template < class SrcIterator, class SrcAccessor, class T > void exportVectorImage(SrcIterator sul, SrcIterator slr, SrcAccessor sget, Encoder * enc, const ImageExportInfo & info, T zero) { unsigned int bands = sget.size(sul); vigra_precondition(isBandNumberSupported(enc->getFileType(), bands), "exportImage(): file format does not support requested number of bands (color channels)"); typedef typename SrcAccessor::value_type SrcValue; double fromMin, fromMax, toMin, toMax; if(info.hasForcedRangeMapping()) { fromMin = info.getFromMin(); fromMax = info.getFromMax(); toMin = info.getToMin(); toMax = info.getToMax(); } else { typedef typename SrcValue::value_type SrcComponent; FindMinMax minmax; for(unsigned int i=0; i band(i); inspectImage( sul, slr, band, minmax ); } fromMin = (double)minmax.min; fromMax = (double)minmax.max; toMin = (double)NumericTraits::min(); toMax = (double)NumericTraits::max(); } double scale = (toMax - toMin) / (fromMax - fromMin); double offset = (toMin / scale) - fromMin; int w = slr.x - sul.x; int h = slr.y - sul.y; typedef vigra::MultiArray<3, T> MArray; MArray array(typename MArray::difference_type(w, h, bands)); for(unsigned int i=0; i subImage = makeBasicImageView(array.bindOuter(i)); VectorComponentValueAccessor band(i); transformImage( sul, slr, band, subImage.upperLeft(), subImage.accessor(), linearIntensityTransform( scale, offset ) ); } write_bands( enc, array, zero ); } } // namespace detail /*! \brief Deprecated. Use \ref exportImage() instead. Declaration: \code namespace vigra { template < class SrcIterator, class SrcAccessor > void exportFloatingVectorImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) } \endcode */ doxygen_overloaded_function(template <...> void exportFloatingVectorImage) template < class SrcIterator, class SrcAccessor > void exportFloatingVectorImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) { exportImage(sul, slr, sget, info); } /*! \brief Deprecated. Use \ref exportImage() instead. Declaration: \code namespace vigra { template < class SrcIterator, class SrcAccessor > void exportIntegralVectorImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) } \endcode */ doxygen_overloaded_function(template <...> void exportIntegralVectorImage) template < class SrcIterator, class SrcAccessor > void exportIntegralVectorImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) { exportImage(sul, slr, sget, info); } /*! \brief Deprecated. Use \ref exportImage() instead. Declaration: \code namespace vigra { template < class SrcIterator, class SrcAccessor > void exportFloatingScalarImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) } \endcode */ doxygen_overloaded_function(template <...> void exportFloatingScalarImage) template < class SrcIterator, class SrcAccessor > void exportFloatingScalarImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) { exportImage(sul, slr, sget, info); } /*! \brief Deprecated. Use \ref exportImage() instead. Declaration: \code namespace vigra { template < class SrcIterator, class SrcAccessor > void exportIntegralScalarImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) } \endcode */ doxygen_overloaded_function(template <...> void exportIntegralScalarImage) template < class SrcIterator, class SrcAccessor > void exportIntegralScalarImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) { exportImage(sul, slr, sget, info); } /********************************************************/ /* */ /* exportImage */ /* */ /********************************************************/ /** \brief Write an image, given an \ref vigra::ImageExportInfo object. If the file format to be exported to supports the pixel type of the source image, the pixel type will be kept (e.g. float can be stored as TIFF without conversion, in contrast to most other image export toolkits). Otherwise, the pixel values are transformed to the range 0.255 and converted to unsigned char. Currently, the following file formats are supported. The pixel types given in brackets are those that are written without conversion:
"BMP"
Microsoft Windows bitmap image file (pixel types: UINT8 as gray and RGB).
"GIF"
CompuServe graphics interchange format; 8-bit color (pixel types: UINT8 as gray and RGB).
"JPEG"
Joint Photographic Experts Group JFIF format; compressed 24-bit color (pixel types: UINT8 as gray and RGB). (only available if libjpeg is installed)
"PNG"
Portable Network Graphic (pixel types: UINT8 and UINT16 with up to 4 channels). (only available if libpng is installed)
"PBM"
Portable bitmap format (black and white).
"PGM"
Portable graymap format (pixel types: UINT8, INT16, INT32 as gray scale)).
"PNM"
Portable anymap (pixel types: UINT8, INT16, INT32 as gray and RGB).
"PPM"
Portable pixmap format (pixel types: UINT8, INT16, INT32 as RGB).
"SUN"
SUN Rasterfile (pixel types: UINT8 as gray and RGB).
"TIFF"
Tagged Image File Format (pixel types: UINT8, INT16, INT32, FLOAT, DOUBLE with up to 4 channels). (only available if libtiff is installed.)
"VIFF"
Khoros Visualization image file (pixel types: UINT8, INT16, INT32, FLOAT, DOUBLE with arbitrary many channels).
Declarations: pass arguments explicitly: \code namespace vigra { template void exportImage(SrcIterator sul, SrcIterator slr, SrcAccessor sget, ImageExportInfo const & info) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void exportImage(SrcIterator sul, SrcIterator slr, SrcAccessor sget, ImageExportInfo const & info) } \endcode Usage: \#include \<vigra/impex.hxx\>
Namespace: vigra \code vigra::BRGBImage out(w, h); ... // write as JPEG image, using compression quality 80 vigra::exportImage(srcImageRange(out), vigra::ImageExportInfo("myimage.jpg").setCompression("80")); // force it to a particular pixel type (the pixel type must be supported by the // desired image file format, otherwise an \ref vigra::PreconditionViolation exception will be thrown) vigra::exportImage(srcImageRange(out), vigra::ImageExportInfo("myINT16image.tif").setPixelType("INT16")); \endcode Preconditions:
  • the image file must be writable.
  • the file type must be one of the supported file types.
**/ doxygen_overloaded_function(template <...> void exportImage) template < class SrcIterator, class SrcAccessor > void exportImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info ) { typedef typename NumericTraits::isScalar is_scalar; try { exportImage( sul, slr, sget, info, is_scalar() ); } catch(Encoder::TIFFCompressionException &) { const_cast(info).setCompression(""); exportImage( sul, slr, sget, info, is_scalar() ); } } template < class SrcIterator, class SrcAccessor > inline void exportImage( triple src, const ImageExportInfo & info ) { exportImage( src.first, src.second, src.third, info ); } template < class SrcIterator, class SrcAccessor > void exportImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info, VigraFalseType /*not scalar */) { typedef typename SrcAccessor::value_type AccessorValueType; typedef typename AccessorValueType::value_type SrcValueType; std::string pixeltype = info.getPixelType(); std::auto_ptr enc = encoder(info); bool downcast = negotiatePixelType(enc->getFileType(), TypeAsString::result(), pixeltype); enc->setPixelType(pixeltype); if(downcast || info.hasForcedRangeMapping()) { if(pixeltype == "UINT8") detail::exportVectorImage( sul, slr, sget, enc.get(), info, (UInt8)0); else if(pixeltype == "INT16") detail::exportVectorImage( sul, slr, sget, enc.get(), info, Int16()); else if(pixeltype == "UINT16") detail::exportVectorImage( sul, slr, sget, enc.get(), info, (UInt16)0); else if(pixeltype == "INT32") detail::exportVectorImage( sul, slr, sget, enc.get(), info, Int32()); else if(pixeltype == "UINT32") detail::exportVectorImage( sul, slr, sget, enc.get(), info, (UInt32)0); else if(pixeltype == "FLOAT") detail::exportVectorImage( sul, slr, sget, enc.get(), info, float()); else if(pixeltype == "DOUBLE") detail::exportVectorImage( sul, slr, sget, enc.get(), info, double()); } else { if(pixeltype == "UINT8") detail::exportVectorImage( sul, slr, sget, enc.get(), (UInt8)0); else if(pixeltype == "INT16") detail::exportVectorImage( sul, slr, sget, enc.get(), Int16()); else if(pixeltype == "UINT16") detail::exportVectorImage( sul, slr, sget, enc.get(), (UInt16)0); else if(pixeltype == "INT32") detail::exportVectorImage( sul, slr, sget, enc.get(), Int32()); else if(pixeltype == "UINT32") detail::exportVectorImage( sul, slr, sget, enc.get(), (UInt32)0); else if(pixeltype == "FLOAT") detail::exportVectorImage( sul, slr, sget, enc.get(), float()); else if(pixeltype == "DOUBLE") detail::exportVectorImage( sul, slr, sget, enc.get(), double()); } enc->close(); } template < class SrcIterator, class SrcAccessor > void exportImage( SrcIterator sul, SrcIterator slr, SrcAccessor sget, const ImageExportInfo & info, VigraTrueType /*scalar*/ ) { typedef typename SrcAccessor::value_type SrcValueType; std::string pixeltype = info.getPixelType(); std::auto_ptr enc = encoder(info); bool downcast = negotiatePixelType(enc->getFileType(), TypeAsString::result(), pixeltype); enc->setPixelType(pixeltype); if(downcast || info.hasForcedRangeMapping()) { if(pixeltype == "UINT8") detail::exportScalarImage( sul, slr, sget, enc.get(), info, (UInt8)0); else if(pixeltype == "INT16") detail::exportScalarImage( sul, slr, sget, enc.get(), info, Int16()); else if(pixeltype == "UINT16") detail::exportScalarImage( sul, slr, sget, enc.get(), info, (UInt16)0); else if(pixeltype == "INT32") detail::exportScalarImage( sul, slr, sget, enc.get(), info, Int32()); else if(pixeltype == "UINT32") detail::exportScalarImage( sul, slr, sget, enc.get(), info, (UInt32)0); else if(pixeltype == "FLOAT") detail::exportScalarImage( sul, slr, sget, enc.get(), info, float()); else if(pixeltype == "DOUBLE") detail::exportScalarImage( sul, slr, sget, enc.get(), info, double()); } else { if(pixeltype == "UINT8") detail::exportScalarImage( sul, slr, sget, enc.get(), (UInt8)0); else if(pixeltype == "INT16") detail::exportScalarImage( sul, slr, sget, enc.get(), Int16()); else if(pixeltype == "UINT16") detail::exportScalarImage( sul, slr, sget, enc.get(), (UInt16)0); else if(pixeltype == "INT32") detail::exportScalarImage( sul, slr, sget, enc.get(), Int32()); else if(pixeltype == "UINT32") detail::exportScalarImage( sul, slr, sget, enc.get(), (UInt32)0); else if(pixeltype == "FLOAT") detail::exportScalarImage( sul, slr, sget, enc.get(), float()); else if(pixeltype == "DOUBLE") detail::exportScalarImage( sul, slr, sget, enc.get(), double()); } enc->close(); } //@} } // namespace vigra #endif /* VIGRA_IMPEX_HXX */ gamera-3.3.3/include/vigra/initimage.hxx0000644000076500000000000004753411261456425017217 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_INITIMAGE_HXX #define VIGRA_INITIMAGE_HXX #include "utilities.hxx" #include "iteratortraits.hxx" #include "functortraits.hxx" namespace vigra { /** \addtogroup InitAlgo Algorithms to Initialize Images Init images or image borders */ //@{ /********************************************************/ /* */ /* initLine */ /* */ /********************************************************/ template inline void initLineImpl(DestIterator d, DestIterator dend, DestAccessor dest, VALUETYPE const & v, VigraFalseType) { for(; d != dend; ++d) dest.set(v, d); } template inline void initLineImpl(DestIterator d, DestIterator dend, DestAccessor dest, FUNCTOR const & f, VigraTrueType) { for(; d != dend; ++d) dest.set(f(), d); } template inline void initLine(DestIterator d, DestIterator dend, DestAccessor dest, VALUETYPE const & v) { initLineImpl(d, dend, dest, v, typename FunctorTraits::isInitializer()); } template inline void initLineFunctor(DestIterator d, DestIterator dend, DestAccessor dest, FUNCTOR & f) { for(; d != dend; ++d) dest.set(f(), d); } template inline void initLineIfImpl(DestIterator d, DestIterator dend, DestAccessor dest, MaskIterator m, MaskAccessor mask, VALUETYPE const & v, VigraFalseType) { for(; d != dend; ++d, ++m) if(mask(m)) dest.set(v, d); } template inline void initLineIfImpl(DestIterator d, DestIterator dend, DestAccessor dest, MaskIterator m, MaskAccessor mask, FUNCTOR const & f, VigraTrueType) { for(; d != dend; ++d, ++m) if(mask(m)) dest.set(f(), d); } template inline void initLineIf(DestIterator d, DestIterator dend, DestAccessor dest, MaskIterator m, MaskAccessor mask, VALUETYPE const & v) { initLineIfImpl(d, dend, dest, m, mask, v, typename FunctorTraits::isInitializer()); } template inline void initLineFunctorIf(DestIterator d, DestIterator dend, DestAccessor dest, MaskIterator m, MaskAccessor mask, FUNCTOR & f) { for(; d != dend; ++d, ++m) if(mask(m)) dest.set(f(), d); } /********************************************************/ /* */ /* initImage */ /* */ /********************************************************/ /** \brief Write a value to every pixel in an image or rectangular ROI. This function can be used to init the image. It uses an accessor to access the pixel data. The initial value can either be a constant of appropriate type (compatible with the destination's value_type), or a functor with compatible result_type. These two cases are automatically distinguished when FunctorTraits::isInitializer yields VigraTrueType. Since the functor is passed by const reference, its operator() must be const, and its internal state may need to be mutable. Declarations: pass arguments explicitly: \code namespace vigra { template void initImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, VALUETYPE const & v); template void initImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, FUNCTOR const & v); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void initImage(triple img, VALUETYPE const & v); template void initImage(triple img, FUNCTOR const & v); } \endcode Usage: \#include \<vigra/initimage.hxx\>
Namespace: vigra Initialize with a constant: \code vigra::BImage img(100, 100); // init the image with the value 128 vigra::initImage(destImageRange(img), 128); \endcode Initialize with a functor: \code struct Counter { Counter() : count(0) {} int operator()() const { return count++; } mutable int count; }; vigra::IImage img(100, 100); // write the current count in every pixel vigra::initImage(destImageRange(img), Counter()); \endcode Required Interface: \code ImageIterator upperleft, lowerright; ImageIterator::row_iterator ix = upperleft.rowIterator(); Accessor accessor; VALUETYPE v; accessor.set(v, ix); \endcode */ doxygen_overloaded_function(template <...> void initImage) template void initImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, VALUETYPE const & v) { int w = lowerright.x - upperleft.x; for(; upperleft.y < lowerright.y; ++upperleft.y) { initLineImpl(upperleft.rowIterator(), upperleft.rowIterator() + w, a, v, typename FunctorTraits::isInitializer()); } } template inline void initImage(triple img, VALUETYPE const & v) { initImage(img.first, img.second, img.third, v); } /********************************************************/ /* */ /* initImageWithFunctor */ /* */ /********************************************************/ /** \brief Write the result of a functor call to every pixel in an image or rectangular ROI. This function can be used to init the image by calling the given functor for each pixel. It uses an accessor to access the pixel data. The functor is passed by reference, so that its internal state can be updated in each call. Declarations: pass arguments explicitly: \code namespace vigra { template void initImageWithFunctor(ImageIterator upperleft, ImageIterator lowerright, Accessor a, FUNCTOR & f); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void initImageWithFunctor(triple img, FUNCTOR & f); } \endcode Usage: \#include \<vigra/initimage.hxx\>
Namespace: vigra \code struct Counter { Counter() : count(0) {} int operator()() const { return count++; } mutable int count; }; vigra::IImage img(100, 100); // write the current count in every pixel Counter counter; vigra::initImageWithFunctor(destImageRange(img), counter); \endcode Required Interface: \code ImageIterator upperleft, lowerright; ImageIterator::row_iterator ix = upperleft.rowIterator(); Accessor accessor; Functor f; accessor.set(f(), ix); \endcode */ doxygen_overloaded_function(template <...> void initImageWithFunctor) template void initImageWithFunctor(ImageIterator upperleft, ImageIterator lowerright, Accessor a, FUNCTOR & f) { int w = lowerright.x - upperleft.x; for(; upperleft.y < lowerright.y; ++upperleft.y) { initLineFunctor(upperleft.rowIterator(), upperleft.rowIterator() + w, a, f); } } template inline void initImageWithFunctor(triple img, FUNCTOR & f) { initImageWithFunctor(img.first, img.second, img.third, f); } /********************************************************/ /* */ /* initImageIf */ /* */ /********************************************************/ /** \brief Write value to pixel in the image if mask is true. This function can be used to init a region-of-interest of the image. It uses an accessor to access the pixel data. The initial value can either be a constant of appropriate type (compatible with the destination's value_type), or a functor with compatible result_type. These two cases are automatically distinguished when FunctorTraits::isInitializer yields VigraTrueType. Since the functor is passed by const reference, its operator() must be const, and its internal state may need to be mutable. Declarations: pass arguments explicitly: \code namespace vigra { template void initImageIf(ImageIterator upperleft, ImageIterator lowerright, Accessor a, MaskImageIterator mask_upperleft, MaskAccessor ma, VALUETYPE const & v); template void initImageIf(ImageIterator upperleft, ImageIterator lowerright, Accessor a, MaskImageIterator mask_upperleft, MaskAccessor ma, FUNCTOR const & v); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void initImageIf(triple img, pair mask, VALUETYPE const & v); template void initImageIf(triple img, pair mask, FUNCTOR const & v); } \endcode Usage: \#include \<vigra/initimage.hxx\>
Namespace: vigra \code vigra::BImage img(100, 100); vigra::BImage mask(100, 100); // zero the ROI vigra::initImageIf(destImageRange(img), maskImage(mask), vigra::NumericTraits::zero()); \endcode Required Interface: \code ImageIterator upperleft, lowerright; MaskImageIterator mask_upperleft; ImageIterator::row_iterator ix = upperleft.rowIterator(); MaskImageIterator::row_iterator mx = mask_upperleft.rowIterator(); Accessor accessor; MaskAccessor mask_accessor; VALUETYPE v; if(mask_accessor(mx)) accessor.set(v, ix); \endcode */ doxygen_overloaded_function(template <...> void initImageIf) template void initImageIf(ImageIterator upperleft, ImageIterator lowerright, Accessor a, MaskImageIterator mask_upperleft, MaskAccessor ma, VALUETYPE const & v) { int w = lowerright.x - upperleft.x; for(; upperleft.y < lowerright.y; ++upperleft.y, ++mask_upperleft.y) { initLineIfImpl(upperleft.rowIterator(), upperleft.rowIterator() + w, a, mask_upperleft.rowIterator(), ma, v, typename FunctorTraits::isInitializer()); } } template inline void initImageIf(triple img, pair mask, VALUETYPE const & v) { initImageIf(img.first, img.second, img.third, mask.first, mask.second, v); } /********************************************************/ /* */ /* initImageBorder */ /* */ /********************************************************/ /** \brief Write value to the specified border pixels in the image. A pixel is initialized if its distance to the border is at most 'borderwidth'. It uses an accessor to access the pixel data. The initial value can either be a constant of appropriate type (compatible with the destination's value_type), or a functor with compatible result_type. These two cases are automatically distinguished when FunctorTraits::isInitializer yields VigraTrueType. Since the functor is passed by const reference, its operator() must be const, and its internal state may need to be mutable. Declarations: pass arguments explicitly: \code namespace vigra { template void initImageBorder(ImageIterator upperleft, ImageIterator lowerright, Accessor a, int border_width, VALUETYPE const & v); template void initImageBorder(ImageIterator upperleft, ImageIterator lowerright, Accessor a, int border_width, FUNCTOR const & v); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void initImageBorder(triple img, int border_width, VALUETYPE const & v); template void initImageBorder(triple img, int border_width, FUNCTOR const & v); } \endcode Usage: \#include \<vigra/initimage.hxx\>
Namespace: vigra \code vigra::BImage img(100, 100); // zero a border of 5 pixel vigra::initImageBorder(destImageRange(img), 5, vigra::NumericTraits::zero()); \endcode Required Interface: see \ref initImage() */ doxygen_overloaded_function(template <...> void initImageBorder) template inline void initImageBorder(ImageIterator upperleft, ImageIterator lowerright, Accessor a, int border_width, VALUETYPE const & v) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; int hb = (border_width > h) ? h : border_width; int wb = (border_width > w) ? w : border_width; initImage(upperleft, upperleft+Diff2D(w,hb), a, v); initImage(upperleft, upperleft+Diff2D(wb,h), a, v); initImage(upperleft+Diff2D(0,h-hb), lowerright, a, v); initImage(upperleft+Diff2D(w-wb,0), lowerright, a, v); } template inline void initImageBorder(triple img, int border_width, VALUETYPE const & v) { initImageBorder(img.first, img.second, img.third, border_width, v); } //@} } // namespace vigra #endif // VIGRA_INITIMAGE_HXX gamera-3.3.3/include/vigra/inspectimage.hxx0000644000076500000000000015250411306302161017676 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_INSPECTIMAGE_HXX #define VIGRA_INSPECTIMAGE_HXX #include #include #include "utilities.hxx" #include "numerictraits.hxx" #include "iteratortraits.hxx" #include "functortraits.hxx" #include "rgbvalue.hxx" namespace vigra { /** \addtogroup InspectAlgo Algorithms to Inspect Images Apply read-only functor to every pixel */ //@{ /********************************************************/ /* */ /* inspectLine */ /* */ /********************************************************/ template void inspectLine(SrcIterator s, SrcIterator send, SrcAccessor src, Functor & f) { for(; s != send; ++s) f(src(s)); } template void inspectLineIf(SrcIterator s, SrcIterator send, SrcAccessor src, MaskIterator m, MaskAccessor mask, Functor & f) { for(; s != send; ++s, ++m) if(mask(m)) f(src(s)); } template void inspectTwoLines(SrcIterator1 s1, SrcIterator1 s1end, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, Functor & f) { for(; s1 != s1end; ++s1, ++s2) f(src1(s1), src2(s2)); } template void inspectTwoLinesIf(SrcIterator1 s1, SrcIterator1 s1end, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, MaskIterator m, MaskAccessor mask, Functor & f) { for(; s1 != s1end; ++s1, ++s2, ++m) if(mask(m)) f(src1(s1), src2(s2)); } /********************************************************/ /* */ /* inspectImage */ /* */ /********************************************************/ /** \brief Apply read-only functor to every pixel in the image. This function can be used to collect statistics of the image etc. The results must be stored in the functor, which serves as a return value. The function uses an accessor to access the pixel data. Declarations: pass arguments explicitly: \code namespace vigra { template void inspectImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, Functor & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void inspectImage(triple img, Functor & f) } \endcode Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code // init functor vigra::BImage img; vigra::FindMinMax minmax; vigra::inspectImage(srcImageRange(img), minmax); cout << "Min: " << minmax.min << " Max: " << minmax.max; \endcode Required Interface: \code ConstImageIterator upperleft, lowerright; ConstImageIterator::row_iterator ix = upperleft.rowIterator(); Accessor accessor; Functor functor; functor(accessor(ix)); // return not used \endcode */ doxygen_overloaded_function(template <...> void inspectImage) template void inspectImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, Functor & f) { int w = lowerright.x - upperleft.x; for(; upperleft.y inline void inspectImage(triple img, Functor & f) { inspectImage(img.first, img.second, img.third, f); } namespace functor { template class UnaryAnalyser; } template inline void inspectImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, functor::UnaryAnalyser const & f) { inspectImage(upperleft, lowerright, a, const_cast &>(f)); } template inline void inspectImage(triple img, functor::UnaryAnalyser const & f) { inspectImage(img.first, img.second, img.third, const_cast &>(f)); } /********************************************************/ /* */ /* inspectImageIf */ /* */ /********************************************************/ /** \brief Apply read-only functor to every pixel in the ROI. This function can be used to collect statistics of the roi etc. The functor is called whenever the return value of the mask's accessor is not zero. The results must be stored in the functor, which serves as a return value. Accessors are used to access the pixel and mask data. Declarations: pass arguments explicitly: \code namespace vigra { template void inspectImageIf(ImageIterator upperleft, ImageIterator lowerright, MaskImageIterator mask_upperleft, MaskAccessor ma, Functor & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void inspectImageIf(triple img, pair mask, Functor & f) } \endcode Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img(100, 100); vigra::BImage mask(100, 100); // init functor vigra::FindMinMax minmax(); vigra::inspectImageIf(srcImageRange(img), maskImage(mask), minmax); cout << "Min: " << minmax.min << " Max: " << minmax.max; \endcode Required Interface: \code ConstImageIterator upperleft, lowerright; MaskImageIterator mask_upperleft; ConstImageIterator::row_iterator ix = upperleft.rowIterator(); MaskImageIterator::row_iterator mx = mask_upperleft.rowIterator(); Accessor accessor; MaskAccessor mask_accessor; Functor functor; if(mask_accessor(mx)) functor(accessor(ix)); \endcode */ doxygen_overloaded_function(template <...> void inspectImageIf) template void inspectImageIf(ImageIterator upperleft, ImageIterator lowerright, Accessor a, MaskImageIterator mask_upperleft, MaskAccessor ma, Functor & f) { int w = lowerright.x - upperleft.x; for(; upperleft.y inline void inspectImageIf(triple img, pair mask, Functor & f) { inspectImageIf(img.first, img.second, img.third, mask.first, mask.second, f); } template inline void inspectImageIf(ImageIterator upperleft, ImageIterator lowerright, Accessor a, MaskImageIterator mask_upperleft, MaskAccessor ma, functor::UnaryAnalyser const & f) { inspectImageIf(upperleft, lowerright, a, mask_upperleft, ma, const_cast &>(f)); } template inline void inspectImageIf(triple img, pair mask, functor::UnaryAnalyser const & f) { inspectImageIf(img.first, img.second, img.third, mask.first, mask.second, const_cast &>(f)); } /********************************************************/ /* */ /* inspectTwoImages */ /* */ /********************************************************/ /** \brief Apply read-only functor to every pixel of both images. This function can be used to collect statistics for each region of a labeled image, especially in conjunction with the \ref ArrayOfRegionStatistics functor. The results must be stored in the functor which serves as a return value. Accessors are used to access the pixel data. Declarations: pass arguments explicitly: \code namespace vigra { template void inspectTwoImages(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1, ImageIterator2 upperleft2, Accessor2 a2, Functor & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void inspectTwoImages(triple img1, pair img2, Functor & f) } \endcode Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage image1; vigra::BImage image2; SomeStatisticsFunctor stats(...); // init functor vigra::inspectTwoImages(srcImageRange(image1), srcImage(image2), stats); \endcode Required Interface: \code ImageIterator1 upperleft1, lowerright1; ImageIterator2 upperleft2; ImageIterator1::row_iterator ix1 = upperleft1.rowIterator(); ImageIterator2::row_iterator ix2 = upperleft2.rowIterator(); Accessor1 accessor1; Accessor2 accessor2; Functor functor; functor(accessor1(ix1), accessor2(ix2)); // return not used \endcode */ doxygen_overloaded_function(template <...> void inspectTwoImages) template void inspectTwoImages(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1, ImageIterator2 upperleft2, Accessor2 a2, Functor & f) { int w = lowerright1.x - upperleft1.x; for(; upperleft1.y inline void inspectTwoImages(triple img1, pair img2, Functor & f) { inspectTwoImages(img1.first, img1.second, img1.third, img2.first, img2.second, f); } template inline void inspectTwoImages(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1, ImageIterator2 upperleft2, Accessor2 a2, functor::UnaryAnalyser const & f) { inspectTwoImages(upperleft1, lowerright1, a1, upperleft2, a2, const_cast &>(f)); } template inline void inspectTwoImages(triple img1, pair img2, functor::UnaryAnalyser const & f) { inspectTwoImages(img1.first, img1.second, img1.third, img2.first, img2.second, const_cast &>(f)); } /********************************************************/ /* */ /* inspectTwoImagesIf */ /* */ /********************************************************/ /** \brief Apply read-only functor to those pixels of both images where the mask image is non-zero. This function can be used to collect statistics for selected regions of a labeled image, especially in conjunction with the \ref ArrayOfRegionStatistics functor. The results must be stored in the functor which serves as a return value. Accessors are used to access the pixel data. Declarations: pass arguments explicitly: \code namespace vigra { template void inspectTwoImagesIf(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1, ImageIterator2 upperleft2, Accessor2 a2, MaskImageIterator mupperleft, MaskAccessor mask, Functor & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void inspectTwoImagesIf(triple img1, pair img2, pair mimg, Functor & f) } \endcode Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage image1; vigra::BImage image2; vigra::BImage maskimage; SomeStatisticsFunctor stats(...); // init functor vigra::inspectTwoImagesIf(srcImageRange(image1), srcImage(image2), srcImage(maskimage), region_stats); \endcode Required Interface: \code ImageIterator1 upperleft1, lowerright1; ImageIterator2 upperleft2; MaskImageIterator upperleftm; ImageIterator1::row_iterator ix1 = upperleft1.rowIterator(); ImageIterator2::row_iterator ix2 = upperleft2.rowIterator(); MaskImageIterator::row_iterator mx = mupperleft.rowIterator(); Accessor1 accessor1; Accessor2 accessor2; MaskAccessor mask; Functor functor; if(mask(mx)) functor(accessor1(ix1), accessor2(ix2)); \endcode */ doxygen_overloaded_function(template <...> void inspectTwoImagesIf) template void inspectTwoImagesIf(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1, ImageIterator2 upperleft2, Accessor2 a2, MaskImageIterator mupperleft, MaskAccessor mask, Functor & f) { int w = lowerright1.x - upperleft1.x; for(; upperleft1.y inline void inspectTwoImagesIf(triple img1, pair img2, pair m, Functor & f) { inspectTwoImagesIf(img1.first, img1.second, img1.third, img2.first, img2.second, m.first, m.second, f); } template inline void inspectTwoImagesIf(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1, ImageIterator2 upperleft2, Accessor2 a2, MaskImageIterator mupperleft, MaskAccessor mask, functor::UnaryAnalyser const & f) { inspectTwoImagesIf(upperleft1, lowerright1, a1, upperleft2, a2, mupperleft, mask, const_cast &>(f)); } template inline void inspectTwoImagesIf(triple img1, pair img2, pair m, functor::UnaryAnalyser const & f) { inspectTwoImagesIf(img1.first, img1.second, img1.third, img2.first, img2.second, m.first, m.second, const_cast &>(f)); } //@} /** \addtogroup InspectFunctor Functors To Inspect Images Functors which report image statistics */ //@{ /********************************************************/ /* */ /* FindMinMax */ /* */ /********************************************************/ /** \brief Find the minimum and maximum pixel value in an image or ROI. In addition the size of the ROI is calculated. These functors can also be used in conjunction with \ref ArrayOfRegionStatistics to find the extremes of all regions in a labeled image. Traits defined: FunctorTraits::isUnaryAnalyser is true (VigraTrueType) Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img; vigra::FindMinMax minmax; // init functor vigra::inspectImage(srcImageRange(img), minmax); cout << "Min: " << minmax.min << " Max: " << minmax.max; \endcode Required Interface: \code VALUETYPE v1, v2(v1); v1 < v2; v1 = v2; \endcode */ template class FindMinMax { public: /** the functor's argument type */ typedef VALUETYPE argument_type; /** the functor's result type */ typedef VALUETYPE result_type; /** \deprecated use argument_type */ typedef VALUETYPE value_type; /** init min and max */ FindMinMax() : min( NumericTraits::max() ), max( NumericTraits::min() ), count(0) {} /** (re-)init functor (clear min, max) */ void reset() { count = 0; } /** update min and max */ void operator()(argument_type const & v) { if(count) { if(v < min) min = v; if(max < v) max = v; } else { min = v; max = v; } ++count; } /** update min and max with components of RGBValue */ void operator()(RGBValue const & v) { operator()(v.red()); operator()(v.green()); operator()(v.blue()); } /** merge two statistics */ void operator()(FindMinMax const & v) { if(v.count) { if(count) { if(v.min < min) min = v.min; if((this->max) < v.max) max = v.max; } else { min = v.min; max = v.max; } } count += v.count; } /** the current min */ VALUETYPE min; /** the current max */ VALUETYPE max; /** the number of values processed so far */ unsigned int count; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryAnalyser; }; /********************************************************/ /* */ /* FindAverage */ /* */ /********************************************************/ /** \brief Find the average pixel value in an image or ROI. In addition the size of the ROI is calculated. This Functor can also be used in conjunction with \ref ArrayOfRegionStatistics to find the average of all regions in a labeled image. Traits defined: FunctorTraits::isUnaryAnalyser and FunctorTraits::isInitializer are true (VigraTrueType) Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img; vigra::FindAverage average; // init functor vigra::inspectImage(srcImageRange(img), average); cout << "Average: " << average(); \endcode Required Interface: \code VALUETYPE v1, v2(v1); double d; v1 += v2; v1 / d; \endcode */ template class FindAverage { public: /** the functor's argument type */ typedef VALUETYPE argument_type; /** the functor's first argument type (for calls with a weight) */ typedef VALUETYPE first_argument_type; /** the functor's second argument type (for calls with a weight) */ typedef double second_argument_type; /** the functor's result type */ typedef typename NumericTraits::RealPromote result_type; /** \deprecated use argument_type and result_type */ typedef typename NumericTraits::RealPromote value_type; /** init average */ FindAverage() : sum_(NumericTraits::zero()), count_(0) {} /** (re-)init average */ void reset() { count_ = 0; sum_ = NumericTraits::zero(); } /** update average */ void operator()(argument_type const & v) { sum_ += v; ++count_; } /** update average, using weighted input. * stats(value, 1.0) is equivalent to the unweighted * call stats(value), and stats(value, 2.0) * is equivalent to two unweighted calls. */ void operator()(first_argument_type const & v, second_argument_type weight) { sum_ += v * weight; count_ += weight; } /** merge two statistics */ void operator()(FindAverage const & v) { sum_ += v.sum_; count_ += v.count_; } /** return number of values (sum of weights) seen so far */ double count() const { return count_; } /** return current average */ result_type average() const { return sum_ / (double)count_; } /** return current average */ result_type operator()() const { return sum_ / (double)count_; } result_type sum_; double count_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isInitializer; typedef VigraTrueType isUnaryAnalyser; }; /********************************************************/ /* */ /* FindAverageAndVariance */ /* */ /********************************************************/ /** \brief Find the average pixel value and its variance in an image or ROI. This Functor uses West's algorithm to accumulate highly accurate values for the mean and the sum of squared differences of all values seen so far (the naive incremental algorithm for the computation of the sum of squares produces large round-off errors when the mean is much larger than the standard deviation of the data.) This Functor can also be used in conjunction with \ref ArrayOfRegionStatistics to find the statistics of all regions in a labeled image. Traits defined: FunctorTraits::isUnaryAnalyser and FunctorTraits::isInitializer are true (VigraTrueType) Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img; vigra::FindAverageAndVariance averageAndVariance; // init functor vigra::inspectImage(srcImageRange(img), averageAndVariance); cout << "Average: " << averageAndVariance.average() << "\n"; cout << "Standard deviation: " << sqrt(averageAndVariance.variance()) << "\n"; \endcode Required Interface: \code VALUETYPE v1, v2(v1); double d; v1 += v2; v1 + v2; v1 - v2; v1 * v2; v1 / d; d * v1; \endcode */ template class FindAverageAndVariance { public: /** the functor's argument type */ typedef VALUETYPE argument_type; /** the functor's first argument type (for calls with a weight) */ typedef VALUETYPE first_argument_type; /** the functor's second argument type (for calls with a weight) */ typedef double second_argument_type; /** the functor's result type */ typedef typename NumericTraits::RealPromote result_type; /** \deprecated use argument_type and result_type */ typedef typename NumericTraits::RealPromote value_type; /** init average */ FindAverageAndVariance() : mean_(NumericTraits::zero()), sumOfSquaredDifferences_(NumericTraits::zero()), count_(0.0) {} /** (re-)init average and variance */ void reset() { count_ = 0.0; mean_ = NumericTraits::zero(); sumOfSquaredDifferences_ = NumericTraits::zero(); } /** update average and variance */ void operator()(argument_type const & v) { ++count_; result_type t1 = v - mean_; result_type t2 = t1 / count_; mean_ += t2; sumOfSquaredDifferences_ += (count_-1.0)*t1*t2; } /** update average and variance, using weighted input. * stats(value, 1.0) is equivalent to the unweighted * call stats(value), and stats(value, 2.0) * is equivalent to two unweighted calls. */ void operator()(first_argument_type const & v, second_argument_type weight) { count_ += weight; result_type t1 = v - mean_; result_type t2 = t1 * weight / count_; mean_ += t2; //sumOfSquaredDifferences_ += (count_ - weight)*t1*t2; if(count_ > weight) sumOfSquaredDifferences_ += (t1 * t1 * weight / count_) * (count_ - weight ); } /** merge two statistics */ void operator()(FindAverageAndVariance const & v) { double newCount = count_ + v.count_; sumOfSquaredDifferences_ += v.sumOfSquaredDifferences_ + count_ / newCount * v.count_ * (mean_ - v.mean_) * (mean_ - v.mean_); mean_ = (count_ * mean_ + v.count_ * v.mean_) / newCount; count_ += v.count_; } /** return number of values (sum of weights) seen so far */ unsigned int count() const { return (unsigned int)count_; } /** return current average */ result_type average() const { return mean_; } /** return current variance. If unbiased = true, the sum of squared differences is divided by count()-1 instead of just count(). */ result_type variance(bool unbiased = false) const { return unbiased ? sumOfSquaredDifferences_ / (count_ - 1.0) : sumOfSquaredDifferences_ / count_; } /** return current variance. calls variance(). */ result_type operator()() const { return variance(); } result_type mean_, sumOfSquaredDifferences_; double count_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isInitializer; typedef VigraTrueType isUnaryAnalyser; }; /********************************************************/ /* */ /* FindROISize */ /* */ /********************************************************/ /** \brief Calculate the size of an ROI in an image. This Functor is often used in conjunction with \ref ArrayOfRegionStatistics to find the sizes of all regions in a labeled image. Traits defined: FunctorTraits::isUnaryAnalyser and FunctorTraits::isInitializer are true (VigraTrueType) Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img, mask; vigra::FindROISize roisize; // init functor vigra::inspectImageIf(srcImageRange(img), srcImage(mask), roisize); cout << "Size of ROI: " << roisize.count; \endcode */ template class FindROISize { public: /** the functor's argument type */ typedef VALUETYPE argument_type; /** the functor's result type */ typedef unsigned int result_type; /** \deprecated use argument_type and result_type */ typedef VALUETYPE value_type; /** init counter to 0 */ FindROISize() : count(0) {} /** (re-)init ROI size with 0 */ void reset() { count = 0; } /** update counter */ void operator()(argument_type const &) { ++count; } /** return current size */ result_type operator()() const { return count; } /** return current size */ result_type size() const { return count; } /** merge two statistics */ void operator()(FindROISize const & o) { count += o.count; } /** the current counter */ result_type count; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isInitializer; typedef VigraTrueType isUnaryAnalyser; }; /********************************************************/ /* */ /* FindBoundingRectangle */ /* */ /********************************************************/ /** \brief Calculate the bounding rectangle of an ROI in an image. As always in VIGRA, roiRect.lowerRight is just outside the rectangle. That is, the last pixel actually in the rectangle is roiRect.lowerRight - Diff2D(1,1). This Functor is often used in conjunction with \ref ArrayOfRegionStatistics to find the bounding rectangles of all regions in a labeled image. Traits defined: FunctorTraits::isUnaryAnalyser and FunctorTraits::isInitializer are true (VigraTrueType) Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img, mask; ... vigra::FindBoundingRectangle roiRect; // init functor // Diff2D is used as the iterator for the source image. This // simulates an image where each pixel value equals that pixel's // coordinates. Tha image 'mask' determines the ROI. vigra::inspectImageIf(srcIterRange(Diff2D(0,0), img.size()), srcImage(mask), roiRect); cout << "Upper left of ROI: " << roiRect.upperLeft.x << ", " << roiRect.upperLeft.y << endl; cout << "Lower right of ROI: " << roiRect.lowerRight.x << ", " << roiRect.lowerRight.y << endl; \endcode */ class FindBoundingRectangle { public: /** the functor's argument type */ typedef Diff2D argument_type; /** the functors result type */ typedef Rect2D result_type; /** \deprecated use argument_type */ typedef Diff2D value_type; /** Upper left of the region as seen so far */ Point2D upperLeft; /** Lower right of the region as seen so far */ Point2D lowerRight; /** are the functors contents valid ? */ bool valid; /** init rectangle to invalid values */ FindBoundingRectangle() : valid(false) {} /** (re-)init functor to find other bounds */ void reset() { valid = false; } /** update rectangle by including the coordinate coord */ void operator()(argument_type const & coord) { if(!valid) { upperLeft = Point2D(coord); lowerRight = Point2D(coord + Diff2D(1,1)); valid = true; } else { upperLeft.x = std::min(upperLeft.x, coord.x); upperLeft.y = std::min(upperLeft.y, coord.y); lowerRight.x = std::max(lowerRight.x, coord.x + 1); lowerRight.y = std::max(lowerRight.y, coord.y + 1); } } /** update rectangle by merging it with another rectangle */ void operator()(FindBoundingRectangle const & otherRegion) { if(!valid) { upperLeft = otherRegion.upperLeft; lowerRight = otherRegion.lowerRight; valid = otherRegion.valid; } else if(otherRegion.valid) { upperLeft.x = std::min(upperLeft.x, otherRegion.upperLeft.x); upperLeft.y = std::min(upperLeft.y, otherRegion.upperLeft.y); lowerRight.x = std::max(lowerRight.x, otherRegion.lowerRight.x); lowerRight.y = std::max(lowerRight.y, otherRegion.lowerRight.y); } } /** Get size of current rectangle. */ Size2D size() const { return lowerRight - upperLeft; } /** Get current rectangle. result_type::first is the upper left corner of the rectangle, result_type::second the lower right. */ result_type operator()() const { return result_type(upperLeft, lowerRight); } }; template <> class FunctorTraits : public FunctorTraitsBase { public: typedef VigraTrueType isInitializer; typedef VigraTrueType isUnaryAnalyser; }; /********************************************************/ /* */ /* LastValueFunctor */ /* */ /********************************************************/ /** \brief Stores and returns the last value it has seen. This Functor is best used in conjunction with \ref ArrayOfRegionStatistics to realize a look-up table. Traits defined: FunctorTraits::isUnaryAnalyser and FunctorTraits::isInitializer are true (VigraTrueType) Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img; vigra::ArrayOfRegionStatistics > lut(255); for(int i=0; i<256; ++i) { lut[i] = ...; // init look-up table } vigra::transformImage(srcImageRange(img), destImage(img), lut); \endcode */ template class LastValueFunctor { public: /** the functor's argument type */ typedef VALUETYPE argument_type; /** the functor's result type */ typedef VALUETYPE result_type; /** \deprecated use argument_type and result_type */ typedef VALUETYPE value_type; /** default construction of value (i.e. builtin types will be set to zero) */ LastValueFunctor(argument_type const &initial = argument_type()) : value(initial) {} /** replace value */ void operator=(argument_type const & v) { value = v; } /** reset to initial value (the same as after default construction) */ void reset() { value = VALUETYPE(); } /** replace value */ void operator()(argument_type const & v) { value = v; } /** return current value */ result_type const & operator()() const { return value; } /** the current value */ VALUETYPE value; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isInitializer; typedef VigraTrueType isUnaryAnalyser; }; /********************************************************/ /* */ /* ReduceFunctor */ /* */ /********************************************************/ /** \brief Apply a functor to reduce the dimensionality of an array. This functor can be used to emulate the reduce standard function of functional programming using std::for_each() or inspectImage() and similar functions. This functor is initialized with a functor encoding the expression to be applied, and an accumulator storing the current state of the reduction. For each element of the array, the embedded functor is called with the accumulator and the current element(s) of the array. The result of the reduction is available by calling reduceFunctor(). Traits defined: FunctorTraits::isUnaryAnalyser, FunctorTraits::isBinaryAnalyser and FunctorTraits::isInitializer are true (VigraTrueType) Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img; ... // fill the image // create a functor to sum the elements of the image vigra::ReduceFunctor, int> sumElements(std::plus, 0); vigra::inspectImage(srcImageRange(img), sumElements); cout << "The sum of the elements " << sumElements() << endl; \endcode Required Interface: \code FUNCTOR f; VALUETYPE accumulator, current1, current2; f(accumulator, current1); // for inspectImage() f(accumulator, current1, current2); // for inspectTwoImages() \endcode */ template class ReduceFunctor { FUNCTOR f_; VALUETYPE start_, accumulator_; public: /** the functor's argument type when used as a unary inspector. (This is not strictly correct since the argument type is actuall a template parameter.) */ typedef VALUETYPE argument_type; /** the functor's first argument type when used as a binary inspector. (This is not strictly correct since the argument type is actuall a template parameter.) */ typedef VALUETYPE first_argument_type; /** the functor's second argument type when used as a binary inspector. (This is not strictly correct since the argument type is actuall a template parameter.) */ typedef VALUETYPE second_argument_type; /** the functor's result type */ typedef VALUETYPE result_type; /** create with the given functor and initial value \a initial for the accumulator. */ ReduceFunctor(FUNCTOR const & f, VALUETYPE const & initial) : f_(f), start_(initial), accumulator_(initial) {} /** Reset accumulator to the initial value. */ void reset() { accumulator_ = start_; } /** Use binary functor to connect given value with the accumulator. The accumulator is used as the first argument, the value \a v as the second. */ template void operator()(T const & v) { accumulator_ = f_(accumulator_, v); } /** Use ternary functor to connect given values with accumulator. The accumulator is used as the first argument, the values \a v1 ans \a v2 as the second and third. */ template void operator()(T1 const & v1, T2 const & v2) { accumulator_ = f_(accumulator_, v1, v2); } /** return current value */ result_type const & operator()() const { return accumulator_; } }; template ReduceFunctor reduceFunctor(FUNCTOR const & f, VALUETYPE const & initial) { return ReduceFunctor(f, initial); } template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isInitializer; typedef VigraTrueType isUnaryAnalyser; typedef VigraTrueType isBinaryAnalyser; }; /********************************************************/ /* */ /* ArrayOfRegionStatistics */ /* */ /********************************************************/ /** \brief Calculate statistics for all regions of a labeled image. This Functor encapsulates an array of statistics functors, one for each label, and selects the one to be updated according to the pixel's label. Traits defined: FunctorTraits::isBinaryAnalyser and FunctorTraits::isUnaryFunctor are true (VigraTrueType) Usage: \#include \<vigra/inspectimage.hxx\>
Namespace: vigra \code vigra::BImage img; vigra::IImage labels; int max_label; ... // init functor as an array of 'max_label' FindMinMax-Functors vigra::ArrayOfRegionStatistics > minmax(max_label); vigra::inspectTwoImages(srcImageRange(img), srcImage(labels), minmax); for(int i=0; i<= max_label; ++i) { cout << "Max gray lavel of region " << i << ": " << minmax.region[i].max << endl; } // init functor as an array of 'max_label' FindAverage-Functors vigra::ArrayOfRegionStatistics > average(max_label); vigra::inspectTwoImages(srcImageRange(img), srcImage(labels), average); // write back the average of each region into the original image vigra::transformImage(srcImageRange(labels), destImage(img), average); \endcode Required Interface: \code RegionStatistics region; RegionStatistics::argument_type a; RegionStatistics::result_type r; region(a); // update statistics r = region(); // return statistics \endcode */ template class ArrayOfRegionStatistics { typedef std::vector RegionArray; public: /** argument type of the contained statistics object becomes first argument of the analyser */ typedef typename RegionStatistics::argument_type first_argument_type; /** label type is used to determine the region to be updated */ typedef LabelType second_argument_type; /** label type is also used to determine the region to be returned by the 1 argument operator() */ typedef LabelType argument_type; /** result type of the contained statistics object becomes result type of the analyser */ typedef typename RegionStatistics::result_type result_type; /** the value type of the array: the contained statistics object. Note: this definition was different in older VIGRA versions. The old definition was wrong. */ typedef RegionStatistics value_type; /** the array's reference type */ typedef RegionStatistics & reference; /** the array's const reference type */ typedef RegionStatistics const & const_reference; /** type to iterate over the statistics array */ typedef typename RegionArray::iterator iterator; /** type to iterate over a const statistics array */ typedef typename RegionArray::const_iterator const_iterator; /** init array of RegionStatistics with default size 0. */ ArrayOfRegionStatistics() {} /** init array of RegionStatistics with index domain 0...max_region_label. */ ArrayOfRegionStatistics(unsigned int max_region_label) : regions(max_region_label+1) {} /** resize array to new index domain 0...max_region_label. All bin are re-initialized. */ void resize(unsigned int max_region_label) { RegionArray newRegions(max_region_label+1); regions.swap(newRegions); } /** reset the contained functors to their initial state. */ void reset() { RegionArray newRegions(regions.size()); regions.swap(newRegions); } /** update regions statistics for region label. The label type is converted to unsigned int. */ void operator()(first_argument_type const & v, second_argument_type label) { regions[static_cast(label)](v); } /** merge second region into first */ void merge(argument_type label1, argument_type label2) { regions[static_cast(label1)](regions[static_cast(label2)]); } /** ask for maximal index (label) allowed */ unsigned int maxRegionLabel() const { return size() - 1; } /** ask for array size (i.e. maxRegionLabel() + 1) */ unsigned int size() const { return regions.size(); } /** access the statistics for a region via its label. The label type is converted to unsigned int. */ result_type operator()(argument_type label) const { return regions[static_cast(label)](); } /** read the statistics functor for a region via its label */ const_reference operator[](argument_type label) const { return regions[static_cast(label)]; } /** access the statistics functor for a region via its label */ reference operator[](argument_type label) { return regions[static_cast(label)]; } /** iterator to the begin of the region array */ iterator begin() { return regions.begin(); } /** const iterator to the begin of the region array */ const_iterator begin() const { return regions.begin(); } /** iterator to the end of the region array */ iterator end() { return regions.end(); } /** const iterator to the end of the region array */ const_iterator end() const { return regions.end(); } private: std::vector regions; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; typedef VigraTrueType isBinaryAnalyser; }; //@} } // namespace vigra #endif // VIGRA_INSPECTIMAGE_HXX gamera-3.3.3/include/vigra/interpolating_accessor.hxx0000644000076500000000000001454611261456425022007 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_INTERPOLATING_ACCESSOR_HXX #define VIGRA_INTERPOLATING_ACCESSOR_HXX #include "accessor.hxx" #include "diff2d.hxx" namespace vigra { /** \addtogroup DataAccessors */ //@{ /********************************************************/ /* */ /* BilinearInterpolatingAccessor */ /* */ /********************************************************/ /** \brief Bilinear interpolation at non-integer positions. This accessor allows an image be accessed at arbitrary non-integer coordinates and performs an bi-linear interpolation to obtain a pixel value. It uses the given ACCESSOR (which is usually the accessor originally associated with the iterator) to access data. \#include \<vigra/accessor.hxx\> Namespace: vigra Required Interface: \code ITERATOR iter; ACCESSOR a; VALUETYPE destvalue; float s; int x, y; destvalue = s * a(iter, x, y) + s * a(iter, x, y); \endcode */ template class BilinearInterpolatingAccessor { public: /** the iterators' pixel type */ typedef VALUETYPE value_type; /** init from given accessor */ BilinearInterpolatingAccessor(ACCESSOR a) : a_(a) {} /** Interpolate the data item at a non-integer position. Ensure that no outside pixels are accessed if (x, y) is near the image border (as long as 0 <= x <= width-1, 0 <= y <= height-1). */ template value_type operator()(ITERATOR const & i, float x, float y) const { int ix = int(x); int iy = int(y); float dx = x - ix; float dy = y - iy; value_type ret; // avoid dereferencing the iterator outside its range if(dx == 0.0) { if(dy == 0.0) { ret = a_(i, Diff2D(ix, iy)); } else { ret = detail::RequiresExplicitCast::cast( (1.0 - dy) * a_(i, Diff2D(ix, iy)) + dy * a_(i, Diff2D(ix, iy + 1))); } } else { if(dy == 0.0) { ret = detail::RequiresExplicitCast::cast( (1.0 - dx) * a_(i, Diff2D(ix, iy)) + dx * a_(i, Diff2D(ix + 1, iy))); } else { ret = detail::RequiresExplicitCast::cast( (1.0 - dx) * (1.0 - dy) * a_(i, Diff2D(ix, iy)) + dx * (1.0 - dy) * a_(i, Diff2D(ix + 1, iy)) + (1.0 - dx) * dy * a_(i, Diff2D(ix, iy + 1)) + dx * dy * a_(i, Diff2D(ix + 1, iy + 1))); } } return ret; } /** Interpolate the data item at a non-integer position. This function works as long as 0 <= x < width-1, 0 <= y < height-1. It is slightly faster than operator(). */ template value_type unchecked(ITERATOR const & i, float x, float y) const { int ix = int(x); int iy = int(y); float dx = x - ix; float dy = y - iy; return detail::RequiresExplicitCast::cast( (1.0 - dx) * (1.0 - dy) * a_(i, Diff2D(ix, iy)) + dx * (1.0 - dy) * a_(i, Diff2D(ix + 1, iy)) + (1.0 - dx) * dy * a_(i, Diff2D(ix, iy + 1)) + dx * dy * a_(i, Diff2D(ix + 1, iy + 1))); } private: ACCESSOR a_; }; //@} } // namespace vigra #endif /* VIGRA_INTERPOLATING_ACCESSOR_HXX */ gamera-3.3.3/include/vigra/iteratoradapter.hxx0000644000076500000000000002453111261456425020433 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_ITERATORADAPTER_HXX #define VIGRA_ITERATORADAPTER_HXX namespace vigra { /********************************************************/ /* */ /* IteratorAdaptor */ /* */ /********************************************************/ /*! \brief Quickly create 1-dimensional iterator adapters. This class supports the easy creation of 1D iterator adpaters out of existing iterators. To use it, you must first implement a policy class that defines the iterator's behavior. The policy is used to instantiate the IteratorAdapter template, which thus automatically obtains all required functions of an STL-compatible iterator. General information on how this works can be found on the Boost Iterator Adaptor page, although there are some differences in the details of the boost and VIGRA implementations. Here is an example policy class that just exports the behaviour of the underlying iterator: \code template class TrivialIteratorAdaptorPolicy { public: // the underlying iterator typedef Iterator BaseType; // the adaptor's value type typedef typename Iterator::value_type value_type; // the adaptor's difference type (result of 'iter1 - iter2', // argument of 'iter[n]') typedef typename Iterator::difference_type difference_type; // the adaptor's reference type (result of '*iter') typedef typename Iterator::reference reference; // the adaptor's index_reference type (result of 'iter[n]') typedef typename Iterator::index_reference index_reference; // the adaptor's pointer type (result of 'iter.operator->()') typedef typename Iterator::pointer pointer; // the adaptor's iterator category typedef typename Iterator::iterator_category iterator_category; // do some additional initialization in the adaptor's constructor static void initialize(BaseType & d) {} // called by '*iter', 'iter->' static reference dereference(BaseType const & d) { return *d; } // called by 'iter[n]' static index_reference dereference(BaseType d, difference_type n) { return d[n]; } // called by 'iter1 == iter2', 'iter1 != iter2' static bool equal(BaseType const & d1, BaseType const & d2) { return d1 == d2; } // called by 'iter1 < iter2', 'iter1 <= iter2', 'iter1 > iter2', 'iter1 >= iter2' static bool less(BaseType const & d1, BaseType const & d2) { return d1 < d2; } // called by 'iter1 - iter2' static difference_type difference(BaseType const & d1, BaseType const & d2) { return d1 - d2; } // called by '++iter', 'iter++' static void increment(BaseType & d) { ++d; } // called by '--iter', 'iter--' static void decrement(BaseType & d) { --d; } // called by 'iter += n', 'iter -= n' static void advance(BaseType & d, difference_type n) { d += n; } }; \endcode This policy class is used like this: \code SomeIterator iter = ...; vigra::IteratorAdaptor > iter_adaptor(iter); \endcode By changing the definition of the policy members, a wide range of adaptor behaviors can be achieved. If the base iterator isn't a random access iterator, just drop the functions that cannot be implemented. This simply means that some adaptor functions may not be called, as one would expect from an iterator that doesn't support random access. Note also that the BaseType needs not be an iterator - it can be any type that contains the information necessary for the adaptor to do it's work. \#include \<vigra/iteratoradapter.hxx\>
Namespace: vigra */ template class IteratorAdaptor { public: typedef typename Policy::BaseType BaseType; typedef typename Policy::value_type value_type; typedef typename Policy::difference_type difference_type; typedef typename Policy::reference reference; typedef typename Policy::index_reference index_reference; typedef typename Policy::pointer pointer; typedef typename Policy::iterator_category iterator_category; IteratorAdaptor() : adaptee_() {} /** Construct from an instance of the policy class' BaseType Note that the functions of the adaptor implement the interface of an random access iterator as defined in the C++ standard, so there is no need for explicit documentation. */ explicit IteratorAdaptor(BaseType const & o) : adaptee_(o) { Policy::initialize(adaptee_); } IteratorAdaptor(IteratorAdaptor const & o) : adaptee_(o.adaptee_) {} IteratorAdaptor & operator=(BaseType const & o) { if(this != &o) { adaptee_ = o; Policy::initialize(adaptee_); } return *this; } IteratorAdaptor & operator=(IteratorAdaptor const & o) { if(this != &o) adaptee_ = o.adaptee_; return *this; } IteratorAdaptor & operator+=(difference_type d) { Policy::advance(adaptee_, d); return *this; } IteratorAdaptor operator+(difference_type d) const { return IteratorAdaptor(*this) += d; } IteratorAdaptor & operator-=(difference_type d) { Policy::advance(adaptee_, -d); return *this; } IteratorAdaptor operator-(difference_type d) const { return IteratorAdaptor(*this) -= d; } IteratorAdaptor & operator++() { Policy::increment(adaptee_); return *this; } IteratorAdaptor operator++(int) { IteratorAdaptor res(*this); Policy::increment(adaptee_); return res; } IteratorAdaptor & operator--() { Policy::decrement(adaptee_); return *this; } IteratorAdaptor operator--(int) { IteratorAdaptor res(*this); Policy::decrement(adaptee_); return res; } bool operator==(IteratorAdaptor const & o) const { return Policy::equal(adaptee_, o.adaptee_); } bool operator!=(IteratorAdaptor const & o) const { return !Policy::equal(adaptee_, o.adaptee_); } bool operator<(IteratorAdaptor const & o) const { return Policy::less(adaptee_, o.adaptee_); } bool operator<=(IteratorAdaptor const & o) const { return !Policy::less(o.adaptee_, adaptee_); } bool operator>(IteratorAdaptor const & o) const { return Policy::less(o.adaptee_, adaptee_); } bool operator>=(IteratorAdaptor const & o) const { return !Policy::less(adaptee_, o.adaptee_); } difference_type operator-(IteratorAdaptor const & o) const { return Policy::difference(adaptee_, o.adaptee_); } reference operator*() const { return Policy::dereference(adaptee_); } index_reference operator[](difference_type d) const { return Policy::dereference(adaptee_, d); } pointer operator->() const { return &Policy::dereference(adaptee_); } protected: BaseType adaptee_; }; } // namespace vigra #endif /* VIGRA_ITERATORADAPTER_HXX */ gamera-3.3.3/include/vigra/iteratortags.hxx0000644000076500000000000000575211261456425017755 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2003 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_ITERATORTAGS_HXX #define VIGRA_ITERATORTAGS_HXX #include // iterator tags struct image_traverser_tag {}; struct multi_dimensional_traverser_tag {}; struct forward_circulator_tag {}; struct bidirectional_circulator_tag {}; struct random_access_circulator_tag {}; #endif /* VIGRA_ITERATORTAGS_HXX */ gamera-3.3.3/include/vigra/iteratortraits.hxx0000644000076500000000000006010311261456425020314 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_ITERATORTRAITS_HXX #define VIGRA_ITERATORTRAITS_HXX #include "accessor.hxx" #include "imageiteratoradapter.hxx" namespace vigra { /** \addtogroup ImageIterators */ //@{ /** \brief Export associated information for each image iterator. The IteratorTraits class contains the following fields: \code template struct IteratorTraits { typedef T Iterator; typedef Iterator iterator; typedef typename iterator::iterator_category iterator_category; typedef typename iterator::value_type value_type; typedef typename iterator::reference reference; typedef typename iterator::index_reference index_reference; typedef typename iterator::pointer pointer; typedef typename iterator::difference_type difference_type; typedef typename iterator::row_iterator row_iterator; typedef typename iterator::column_iterator column_iterator; typedef typename AccessorTraits::default_accessor DefaultAccessor; typedef DefaultAccessor default_accessor; typedef VigraTrueType/VigraFalseType hasConstantStrides; }; \endcode By (partially) specializing this template for an iterator class the defaults given above can be changed as appropriate. For example, iterators for rgb images are associated with RGBAccessor instead of StandardAccessor. To get the accessor associated with a given iterator, use code like this: \code template void foo(Iterator i) { typedef typename IteratorTraits::DefaultAccessor Accessor; Accessor a; ... } \endcode This technique is, for example, used by the \ref IteratorBasedArgumentObjectFactories. The possibility to retrieve the default accessor by means of a traits class is especially important since this information is not contained in the iterator directly. The member hasConstantStrides is useful for certain optimizations: it helps to decide whether we can replace iterator operations such as iter++ or iter += n with corresponding pointer operations (which may be faster), where the pointer is obtained as the address of iterator's pointee (the object the iterator currently refers to). This flag would be VigraFalseType for a std::list::iterator, but is VigraTrueType for most VIGRA iterators. \#include \<vigra/iteratortraits.hxx\> Namespace: vigra */ template struct IteratorTraits { typedef T Iterator; typedef Iterator iterator; typedef typename iterator::iterator_category iterator_category; typedef typename iterator::value_type value_type; typedef typename iterator::reference reference; typedef typename iterator::index_reference index_reference; typedef typename iterator::pointer pointer; typedef typename iterator::difference_type difference_type; typedef typename iterator::row_iterator row_iterator; typedef typename iterator::column_iterator column_iterator; typedef typename AccessorTraits::default_accessor DefaultAccessor; typedef DefaultAccessor default_accessor; // default: disable the constant strides optimization typedef VigraFalseType hasConstantStrides; }; template struct IteratorTraitsBase { typedef T Iterator; typedef Iterator iterator; typedef typename iterator::iterator_category iterator_category; typedef typename iterator::value_type value_type; typedef typename iterator::reference reference; typedef typename iterator::index_reference index_reference; typedef typename iterator::pointer pointer; typedef typename iterator::difference_type difference_type; typedef typename iterator::row_iterator row_iterator; typedef typename iterator::column_iterator column_iterator; }; //@} /***********************************************************/ /** \page ArgumentObjectFactories Argument Object Factories Factory functions to create argument objects which simplify long argument lists.
  • \ref ImageBasedArgumentObjectFactories
  • \ref MultiArrayBasedArgumentObjectFactories
  • \ref IteratorBasedArgumentObjectFactories
Long argument lists provide for greater flexibility of functions, but they are also tedious and error prone, when we don't need the flexibility. Thus, we define argument objects which automatically provide reasonable defaults for those arguments that we didn't specify explicitly. The argument objects are created via a number of factory functions. Since these functions have descriptive names, they also serve to improve readability: the name of each factory tells te purpose of its argument object. Consider the following example. Without argument objects we had to write something like this (cf. \ref copyImageIf()): \code vigra::BImage img1, img2, img3; // fill img1 and img2 ... vigra::copyImageIf(img1.upperLeft(), img1.lowerRight(), img1.accessor(), img2.upperLeft(), img2.accessor(), img3.upperLeft(), img3.accessor()); \endcode Using the argument object factories, this becomes much shorter and more readable: \code vigra::copyImageIf(srcImageRange(img1), maskImage(img2), destImage(img3)); \endcode The names of the factories clearly tell which image is source, mask, and destination. In addition, the suffix Range must be used for those argument objects that need to specify the lower right corner of the region of interest. Typically, this is only the first source argument, but sometimes the first destiniation argument must also contain a range. The factory functions come in two flavours: Iterator based and image based factories. Above we have seen the image based variant. The iterator based variant would look like this: \code vigra::copyImageIf(srcIterRange(img1.upperLeft(), img1.lowerRight()), maskIter(img2.upperLeft()), destIter(img3.upperLeft())); \endcode These factory functions contain the word Iter instead of the word Image, They would normally be used if we couldn't access the images (for example, within a function which got passed iterators) or if we didn't want to operate on the entire image. The default accessor is obtained via \ref vigra::IteratorTraits. All factory functions also allow to specify accessors explicitly. This is useful if we can't use the default accessor. This variant looks like this: \code vigra::copyImageIf(srcImageRange(img1), maskImage(img2, MaskPredicateAccessor()), destImage(img3)); \endcode or \code vigra::copyImageIf(srcIterRange(img1.upperLeft(), img1.lowerRight()), maskIter(img2.upperLeft(), MaskPredicateAccessor()), destIter(img3.upperLeft())); \endcode All versions can be mixed freely within one explession. Technically, the argument objects are simply defined as pairs and triples of iterators and accessor so that all algorithms should declare a call interface version based on pairs and triples (see for example \ref copyImageIf()). \section ImageBasedArgumentObjectFactories Image Based Argument Object Factories Include: automatically included with the image classes
Namespace: vigra These factories can be used to create argument objects when we are given instances or subclasses of \ref vigra::BasicImage (see \ref StandardImageTypes for instances defined per default). These factory functions access img.upperLeft(), img.lowerRight(), and img.accessor() to obtain the iterators and accessor for the given image (unless the accessor is given explicitly). The following factory functions are provided:
\ref vigra::BasicImage "vigra::BasicImage" img; or
\ref vigra::BasicImageView "vigra::BasicImageView" img;
srcImageRange(img) create argument object containing upper left, lower right, and default accessor of source image
srcImageRange(img, Rect2D(...)) create argument object containing the ROI specified by \ref vigra::Rect2D and default accessor of source image
srcImageRange(img, SomeAccessor()) create argument object containing upper left, lower right of source image, and given accessor
srcImageRange(img, Rect2D(...), SomeAccessor()) create argument object containing the ROI specified by \ref vigra::Rect2D and of source image, and given accessor
srcImage(img) create argument object containing upper left, and default accessor of source image
srcImage(img, Point2D(...)) create argument object with upper left at point given by \ref vigra::Point2D, and default accessor of source image
srcImage(img, SomeAccessor()) create argument object containing upper left of source image, and given accessor
srcImage(img, Point2D(...), SomeAccessor()) create argument object with upper left at point given by \ref vigra::Point2D of source image, and given accessor
maskImage(img) create argument object containing upper left, and default accessor of mask image
maskImage(img, Point2D(...)) create argument object with upper left at point given by \ref vigra::Point2D, and default accessor of mask image
maskImage(img, SomeAccessor()) create argument object containing upper left of mask image, and given accessor
maskImage(img, Point2D(...), SomeAccessor()) create argument object with upper left at point given by \ref vigra::Point2D of mask image, and given accessor
destImageRange(img) create argument object containing upper left, lower right, and default accessor of destination image
destImageRange(img, Rect2D(...)) create argument object containing the ROI specified by \ref vigra::Rect2D and default accessor of destination image
destImageRange(img, SomeAccessor()) create argument object containing upper left, lower right of destination image, and given accessor
destImageRange(img, Rect2D(...), SomeAccessor()) create argument object containing the ROI specified by \ref vigra::Rect2D of destination image, and given accessor
destImage(img) create argument object containing upper left, and default accessor of destination image
destImage(img, Point2D(...)) create argument object with upper left at point given by \ref vigra::Point2D, and default accessor of destination image
destImage(img, SomeAccessor()) create argument object containing upper left of destination image, and given accessor
destImage(img, Point2D(...), SomeAccessor()) create argument object with upper left at point given by \ref vigra::Point2D of destination image, and given accessor
\section MultiArrayBasedArgumentObjectFactories MultiArrayView Based Argument Object Factories Include: automatically included with \<vigra/multi_array.hxx\>
Namespace: vigra These factories can be used to create argument objects when we are given instances or subclasses of \ref vigra::MultiArrayView. These factory functions access array.traverser_begin(), array.traverser_end() to obtain the iterators. If no accessor is given, they use the AccessorTraits to determine the default accessor associated with the array's value type T. The following factory functions are provided:
\ref vigra::MultiArrayView "vigra::MultiArrayView" array;
srcMultiArrayRange(img) create argument object containing a \ref vigra::MultiIterator marking the begin of the array, a shape object giving the desired shape of the array (possibly a subarray) and the default const accessor for SomeType
srcMultiArrayRange(img, SomeAccessor()) create argument object containing a \ref vigra::MultiIterator marking the begin of the array, a shape object giving the desired shape of the array (possibly a subarray) and the given accessor
srcMultiArray(img) create argument object containing a \ref vigra::MultiIterator marking the begin of the array, and the default const accessor for SomeType
srcMultiArray(img, SomeAccessor()) create argument object containing a \ref vigra::MultiIterator marking the begin of the array and the given accessor
destMultiArrayRange(img) create argument object containing a \ref vigra::MultiIterator marking the begin of the array, a shape object giving the desired shape of the array (possibly a subarray) and the default accessor for SomeType
destMultiArrayRange(img, SomeAccessor()) create argument object containing a \ref vigra::MultiIterator's marking the begin of the array, a shape object giving the desired shape of the array (possibly a subarray) and the given accessor
destMultiArray(img) create argument object containing a \ref vigra::MultiIterator marking the begin of the array and the default accessor for SomeType
destMultiArray(img, SomeAccessor()) create argument object containing a \ref vigra::MultiIterator's marking the begin of the array and the given accessor
\section IteratorBasedArgumentObjectFactories Iterator Based Argument Object Factories \#include \<vigra/iteratortraits.hxx\> Namespace: vigra These factories can be used to create argument objects when we are given \ref ImageIterators. These factory functions use \ref vigra::IteratorTraits to get the default accessor for the given iterator unless the accessor is given explicitly. The following factory functions are provided:
\ref vigra::BasicImage::Iterator "vigra::BasicImage::Iterator" i1, i2;
srcIterRange(i1, i2) create argument object containing the given iterators and corresponding default accessor (for source image)
srcIterRange(i1, i2, SomeAccessor()) create argument object containing given iterators and accessor (for source image)
srcIter(i1) create argument object containing the given iterator and corresponding default accessor (for source image)
srcIter(i1, SomeAccessor()) create argument object containing given iterator and accessor (for source image)
maskIter(i1) create argument object containing the given iterator and corresponding default accessor (for mask image)
maskIter(i1, SomeAccessor()) create argument object containing given iterator and accessor (for mask image)
destIterRange(i1, i2) create argument object containing the given iterators and corresponding default accessor (for destination image)
destIterRange(i1, i2, SomeAccessor()) create argument object containing given iterators and accessor (for destination image)
destIter(i1) create argument object containing the given iterator and corresponding default accessor (for destination image)
destIter(i1, SomeAccessor()) create argument object containing given iterator and accessor (for destination image)
*/ template inline triple srcIterRange(Iterator const & upperleft, Iterator const & lowerright, Accessor a) { return triple(upperleft, lowerright, a); } template inline pair srcIter(Iterator const & upperleft, Accessor a) { return pair(upperleft, a); } template inline pair maskIter(Iterator const & upperleft, Accessor a) { return pair(upperleft, a); } template inline pair destIter(Iterator const & upperleft, Accessor a) { return pair(upperleft, a); } template inline triple destIterRange(Iterator const & upperleft, Iterator const & lowerright, Accessor a) { return triple(upperleft, lowerright, a); } template inline pair::DefaultAccessor> srcIter(Iterator const & upperleft) { return pair::DefaultAccessor>( upperleft, typename IteratorTraits::DefaultAccessor()); } template inline triple::DefaultAccessor> srcIterRange(Iterator const & upperleft, Iterator const & lowerright) { return triple::DefaultAccessor>( upperleft, lowerright, typename IteratorTraits::DefaultAccessor()); } template inline pair::DefaultAccessor> maskIter(Iterator const & upperleft) { return pair::DefaultAccessor>( upperleft, typename IteratorTraits::DefaultAccessor()); } template inline pair::DefaultAccessor> destIter(Iterator const & upperleft) { return pair::DefaultAccessor>( upperleft, typename IteratorTraits::DefaultAccessor()); } template inline triple::DefaultAccessor> destIterRange(Iterator const & upperleft, Iterator const & lowerright) { return triple::DefaultAccessor>( upperleft, lowerright, typename IteratorTraits::DefaultAccessor()); } } // namespace vigra #endif // VIGRA_ITERATORTRAITS_HXX gamera-3.3.3/include/vigra/labelimage.hxx0000644000076500000000000010574111261456425017326 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_LABELIMAGE_HXX #define VIGRA_LABELIMAGE_HXX #include #include #include "utilities.hxx" #include "stdimage.hxx" namespace vigra { /** \addtogroup Labeling Connected Components Labeling The 2-dimensional connected components algorithms may use either 4 or 8 connectivity. By means of a functor the merge criterium can be defined arbitrarily. */ //@{ /********************************************************/ /* */ /* labelImage */ /* */ /********************************************************/ /** \brief Find the connected components of a segmented image. Declarations: pass arguments explicitly: \code namespace vigra { template unsigned int labelImage(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, bool eight_neighbors); template unsigned int labelImage(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, bool eight_neighbors, EqualityFunctor equal); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template unsigned int labelImage(triple src, pair dest, bool eight_neighbors); template unsigned int labelImage(triple src, pair dest, bool eight_neighbors, EqualityFunctor equal) } \endcode Connected components are defined as regions with uniform pixel values. Thus, SrcAccessor::value_type either must be equality comparable (first form), or an EqualityFunctor must be provided that realizes the desired predicate (second form). The destination's value type should be large enough to hold the labels without overflow. Region numbers will be a consecutive sequence starting with one and ending with the region number returned by the function (inclusive). The parameter 'eight_neighbors' determines whether the regions should be 4-connected or 8-connected. The function uses accessors. Return: the number of regions found (= largest region label) Usage: \#include \<vigra/labelimage.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); vigra::IImage labels(w,h); // threshold at 128 vigra::transformImage(srcImageRange(src), destImage(src), vigra::Threshold( 128, 256, 0, 255)); // find 4-connected regions vigra::labelImage(srcImageRange(src), destImage(labels), false); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); u == u // first form EqualityFunctor equal; // second form equal(u, u) // second form int i; dest_accessor.set(i, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> unsigned int labelImage) template unsigned int labelImage(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, bool eight_neighbors, EqualityFunctor equal) { int w = lowerrights.x - upperlefts.x; int h = lowerrights.y - upperlefts.y; int x,y,i; static const Diff2D neighbor[] = { Diff2D(-1,0), // left Diff2D(-1,-1), // topleft Diff2D(0,-1), // top Diff2D(1,-1) // topright }; static const int left = 0, /* unused: topleft = 1, */ top = 2, topright = 3; int step = eight_neighbors ? 1 : 2; SrcIterator ys(upperlefts); SrcIterator xs(ys); // temporary image to store region labels IImage labelimage(w, h); IImage::Iterator yt = labelimage.upperLeft(); IImage::Iterator xt(yt); // Kovalevsky's clever idea to use // image iterator and scan order iterator simultaneously IImage::ScanOrderIterator label = labelimage.begin(); // pass 1: scan image from upper left to lower right // to find connected components // Each component will be represented by a tree of pixels. Each // pixel contains the scan order address of its parent in the // tree. In order for pass 2 to work correctly, the parent must // always have a smaller scan order address than the child. // Therefore, we can merge trees only at their roots, because the // root of the combined tree must have the smallest scan order // address among all the tree's pixels/ nodes. The root of each // tree is distinguished by pointing to itself (it contains its // own scan order address). This condition is enforced whenever a // new region is found or two regions are merged for(y = 0; y != h; ++y, ++ys.y, ++yt.y) { xs = ys; xt = yt; int endNeighbor = (y == 0) ? left : (eight_neighbors ? topright : top); for(x = 0; x != w; ++x, ++xs.x, ++xt.x) { int beginNeighbor = (x == 0) ? top : left; if(x == w-1 && endNeighbor == topright) endNeighbor = top; for(i=beginNeighbor; i<=endNeighbor; i+=step) { if(equal(sa(xs), sa(xs, neighbor[i]))) { int neighborLabel = xt[neighbor[i]]; for(int j=i+2; j<=endNeighbor; j+=step) { if(equal(sa(xs), sa(xs, neighbor[j]))) { int neighborLabel1 = xt[neighbor[j]]; if(neighborLabel != neighborLabel1) { // find roots of the region trees while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } while(neighborLabel1 != label[neighborLabel1]) { neighborLabel1 = label[neighborLabel1]; } // merge the trees if(neighborLabel1 < neighborLabel) { label[neighborLabel] = neighborLabel1; neighborLabel = neighborLabel1; } else if(neighborLabel < neighborLabel1) { label[neighborLabel1] = neighborLabel; } } break; } } *xt = neighborLabel; break; } } if(i > endNeighbor) { // new region // The initial label of a new region equals the // scan order address of it's first pixel. // This is essential for correct operation of the algorithm. *xt = x + y*w; } } } // pass 2: assign one label to each region (tree) // so that labels form a consecutive sequence 1, 2, ... DestIterator yd(upperleftd); unsigned int count = 0; i = 0; for(y=0; y != h; ++y, ++yd.y) { DestIterator xd(yd); for(x = 0; x != w; ++x, ++xd.x, ++i) { if(label[i] == i) { label[i] = ++count; } else { label[i] = label[label[i]]; } da.set(label[i], xd); } } return count; } template inline unsigned int labelImage(triple src, pair dest, bool eight_neighbors, EqualityFunctor equal) { return labelImage(src.first, src.second, src.third, dest.first, dest.second, eight_neighbors, equal); } template inline unsigned int labelImage(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, bool eight_neighbors) { return labelImage(upperlefts, lowerrights, sa, upperleftd, da, eight_neighbors, std::equal_to()); } template inline unsigned int labelImage(triple src, pair dest, bool eight_neighbors) { return labelImage(src.first, src.second, src.third, dest.first, dest.second, eight_neighbors, std::equal_to()); } /********************************************************/ /* */ /* labelImageWithBackground */ /* */ /********************************************************/ /** \brief Find the connected components of a segmented image, excluding the background from labeling. Declarations: pass arguments explicitly: \code namespace vigra { template int labelImageWithBackground(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, bool eight_neighbors, ValueType background_value ); template int labelImageWithBackground(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, bool eight_neighbors, ValueType background_value, EqualityFunctor equal); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template int labelImageWithBackground(triple src, pair dest, bool eight_neighbors, ValueType background_value); template int labelImageWithBackground(triple src, pair dest, bool eight_neighbors, ValueType background_value, EqualityFunctor equal); } \endcode Connected components are defined as regions with uniform pixel values. Thus, SrcAccessor::value_type either must be equality comparable (first form), or an EqualityFunctor must be provided that realizes the desired predicate (second form). All pixel equal to the given 'background_value' are ignored when determining connected components and remain untouched in the destination image and The destination's value type should be large enough to hold the labels without overflow. Region numbers will be a consecutive sequence starting with one and ending with the region number returned by the function (inclusive). The parameter 'eight_neighbors' determines whether the regions should be 4-connected or 8-connected. The function uses accessors. Return: the number of regions found (= largest region label) Usage: \#include \<vigra/labelimage.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); vigra::IImage labels(w,h); // threshold at 128 vigra::transformImage(srcImageRange(src), destImage(src), vigra::Threshold( 128, 256, 0, 255)); // find 4-connected regions of foreground (= white pixels) only vigra::labelImageWithBackground(srcImageRange(src), destImage(labels), false, 0); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); ValueType background_value; u == u // first form u == background_value // first form EqualityFunctor equal; // second form equal(u, u) // second form equal(u, background_value) // second form int i; dest_accessor.set(i, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> unsigned int labelImageWithBackground) template unsigned int labelImageWithBackground( SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, bool eight_neighbors, ValueType background_value, EqualityFunctor equal) { int w = lowerrights.x - upperlefts.x; int h = lowerrights.y - upperlefts.y; int x,y,i; static const Diff2D neighbor[] = { Diff2D(-1,0), // left Diff2D(-1,-1), // topleft Diff2D(0,-1), // top Diff2D(1,-1) // topright }; static const int left = 0, /* unused: topleft = 1,*/ top = 2, topright = 3; int step = eight_neighbors ? 1 : 2; SrcIterator ys(upperlefts); SrcIterator xs(ys); // temporary image to store region labels IImage labelimage(w, h); IImage::ScanOrderIterator label = labelimage.begin(); IImage::Iterator yt = labelimage.upperLeft(); IImage::Iterator xt(yt); // pass 1: scan image from upper left to lower right // find connected components for(y = 0; y != h; ++y, ++ys.y, ++yt.y) { xs = ys; xt = yt; int endNeighbor = (y == 0) ? left : (eight_neighbors ? topright : top); for(x = 0; x != w; ++x, ++xs.x, ++xt.x) { if(equal(sa(xs), background_value)) { *xt = -1; } else { int beginNeighbor = (x == 0) ? top : left; if(x == w-1 && endNeighbor == topright) endNeighbor = top; for(i=beginNeighbor; i<=endNeighbor; i+=step) { if(equal(sa(xs), sa(xs, neighbor[i]))) { int neighborLabel = xt[neighbor[i]]; for(int j=i+2; j<=endNeighbor; j+=step) { if(equal(sa(xs), sa(xs, neighbor[j]))) { int neighborLabel1 = xt[neighbor[j]]; if(neighborLabel != neighborLabel1) { // find roots of the region trees while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } while(neighborLabel1 != label[neighborLabel1]) { neighborLabel1 = label[neighborLabel1]; } // merge the trees if(neighborLabel1 < neighborLabel) { label[neighborLabel] = neighborLabel1; neighborLabel = neighborLabel1; } else if(neighborLabel < neighborLabel1) { label[neighborLabel1] = neighborLabel; } } break; } } *xt = neighborLabel; break; } } if(i > endNeighbor) { // new region // The initial label of a new region equals the // scan order address of it's first pixel. // This is essential for correct operation of the algorithm. *xt = x + y*w; } } } } // pass 2: assign contiguous labels to the regions DestIterator yd(upperleftd); int count = 0; i = 0; for(y=0; y != h; ++y, ++yd.y) { DestIterator xd(yd); for(x = 0; x != w; ++x, ++xd.x, ++i) { if(label[i] == -1) continue; if(label[i] == i) { label[i] = count++; } else { label[i] = label[label[i]]; } da.set(label[i]+1, xd); } } return count; } template inline unsigned int labelImageWithBackground( triple src, pair dest, bool eight_neighbors, ValueType background_value, EqualityFunctor equal) { return labelImageWithBackground(src.first, src.second, src.third, dest.first, dest.second, eight_neighbors, background_value, equal); } template inline unsigned int labelImageWithBackground( triple src, pair dest, bool eight_neighbors, ValueType background_value) { return labelImageWithBackground(src.first, src.second, src.third, dest.first, dest.second, eight_neighbors, background_value, std::equal_to()); } template inline unsigned int labelImageWithBackground( SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, bool eight_neighbors, ValueType background_value) { return labelImageWithBackground(upperlefts, lowerrights, sa, upperleftd, da, eight_neighbors, background_value, std::equal_to()); } /********************************************************/ /* */ /* regionImageToCrackEdgeImage */ /* */ /********************************************************/ /** \brief Transform a labeled image into a crack edge image. Declarations: pass arguments explicitly: \code namespace vigra { template void regionImageToCrackEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue edge_marker) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void regionImageToCrackEdgeImage( triple src, pair dest, DestValue edge_marker) } \endcode This algorithm inserts border pixels (so called "crack edges") between regions in a labeled image like this (a and c are the original labels, and 0 is the value of edge_marker and denotes the inserted edges): \code original image insert zero- and one-cells a 0 c c c a c c a 0 0 0 c a a c => a a a 0 c a a a a a a 0 0 a a a a a \endcode The algorithm assumes that the original labeled image contains no background. Therefore, it is suitable as a post-processing operation of \ref labelImage() or \ref seededRegionGrowing(). The destination image must be twice the size of the original (precisely, (2*w-1) by (2*h-1) pixels). The source value type (SrcAccessor::value-type) must be equality-comparable. Usage: \#include \<vigra/labelimage.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); vigra::IImage labels(w,h); vigra::IImage cellgrid(2*w-1, 2*h-1); // threshold at 128 vigra::transformImage(srcImageRange(src), destImage(src), vigra::Threshold( 128, 256, 0, 255)); // find 4-connected regions vigra::labelImage(srcImageRange(src), destImage(labels), false); // create cell grid image, mark edges with 0 vigra::regionImageToCrackEdgeImage(srcImageRange(labels), destImage(cellgrid), 0); \endcode Required Interface: \code ImageIterator src_upperleft, src_lowerright; ImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); u != u DestValue edge_marker; dest_accessor.set(edge_marker, dest_upperleft); \endcode Preconditions: The destination image must have twice the size of the source: \code w_dest = 2 * w_src - 1 h_dest = 2 * h_src - 1 \endcode */ doxygen_overloaded_function(template <...> void regionImageToCrackEdgeImage) template void regionImageToCrackEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue edge_marker) { int w = slr.x - sul.x; int h = slr.y - sul.y; int x,y; static const Diff2D right(1,0); static const Diff2D left(-1,0); static const Diff2D bottomright(1,1); static const Diff2D bottom(0,1); static const Diff2D top(0,-1); SrcIterator iy = sul; DestIterator dy = dul; for(y=0; y inline void regionImageToCrackEdgeImage( triple src, pair dest, DestValue edge_marker) { regionImageToCrackEdgeImage(src.first, src.second, src.third, dest.first, dest.second, edge_marker); } /********************************************************/ /* */ /* regionImageToEdgeImage */ /* */ /********************************************************/ /** \brief Transform a labeled image into an edge image. Declarations: pass arguments explicitly: \code namespace vigra { template void regionImageToEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue edge_marker) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void regionImageToEdgeImage( triple src, pair dest, DestValue edge_marker) } \endcode This algorithm marks all pixels with the given edge_marker which belong to a different region (label) than their right or lower neighbors: \code original image edges (assuming edge_marker == 1) a c c 1 1 * a a c => * 1 1 a a a * * * \endcode The non-edge pixels of the destination image will not be touched. The source value type (SrcAccessor::value-type) must be equality-comparable. Usage: \#include \<vigra/labelimage.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); vigra::IImage labels(w,h); vigra::IImage edges(w, h); edges = 255; // init background (non-edge) to 255 // threshold at 128 vigra::transformImage(srcImageRange(src), destImage(src), vigra::Threshold( 128, 256, 0, 255)); // find 4-connected regions vigra::labelImage(srcImageRange(src), destImage(labels), false); // create edge image, mark edges with 0 vigra::regionImageToEdgeImage(srcImageRange(labels), destImage(edges), 0); \endcode Required Interface: \code ImageIterator src_upperleft, src_lowerright; ImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); u != u DestValue edge_marker; dest_accessor.set(edge_marker, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void regionImageToEdgeImage) template void regionImageToEdgeImage( SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue edge_marker) { int w = slr.x - sul.x; int h = slr.y - sul.y; int x,y; static const Diff2D right(1,0); static const Diff2D left(-1,0); static const Diff2D bottomright(1,1); static const Diff2D bottom(0,1); static const Diff2D top(0,-1); SrcIterator iy = sul; DestIterator dy = dul; for(y=0; y inline void regionImageToEdgeImage( triple src, pair dest, DestValue edge_marker) { regionImageToEdgeImage(src.first, src.second, src.third, dest.first, dest.second, edge_marker); } //@} } // namespace vigra #endif // VIGRA_LABELIMAGE_HXX gamera-3.3.3/include/vigra/labelvolume.hxx0000644000076500000000000007351511261456425017556 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2006-2007 by F. Heinrich, B. Seppke, Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_LABELVOLUME_HXX #define VIGRA_LABELVOLUME_HXX #include "voxelneighborhood.hxx" #include "multi_array.hxx" namespace vigra{ /** \addtogroup Labeling Connected Components Labeling The 3-dimensional connected components algorithms may use either 6 or 26 connectivity. By means of a functor the merge criterium can be defined arbitrarily. */ //@{ /********************************************************/ /* */ /* labelVolume */ /* */ /********************************************************/ /** \brief Find the connected components of a segmented volume. Declarations: pass arguments explicitly: \code namespace vigra { template unsigned int labelVolume(SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D neighborhood3D); template unsigned int labelVolume(SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D neighborhood3D, EqualityFunctor equal); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template unsigned int labelVolume(triple src, pair dest, Neighborhood3D neighborhood3D); template unsigned int labelVolume(triple src, pair dest, Neighborhood3D neighborhood3D, EqualityFunctor equal); } \endcode use with 3D-Six-Neighborhood: \code namespace vigra { template unsigned int labelVolumeSix(triple src, pair dest); } \endcode Connected components are defined as regions with uniform voxel values. Thus, SrcAccessor::value_type either must be equality comparable (first form), or an EqualityFunctor must be provided that realizes the desired predicate (second form). The destination's value type should be large enough to hold the labels without overflow. Region numbers will be a consecutive sequence starting with one and ending with the region number returned by the function (inclusive). Return: the number of regions found (= largest region label) Usage: \#include \<vigra/labelvolume.hxx\>
Namespace: vigra \code typedef vigra::MultiArray<3,int> IntVolume; IntVolume src(IntVolume::difference_type(w,h,d)); IntVolume dest(IntVolume::difference_type(w,h,d)); // find 6-connected regions int max_region_label = vigra::labelVolumeSix(srcMultiArrayRange(src), destMultiArray(dest)); // find 26-connected regions int max_region_label = vigra::labelVolume(srcMultiArrayRange(src), destMultiArray(dest), NeighborCode3DTwentySix()); \endcode Required Interface: \code SrcIterator src_begin; SrcShape shape; DestIterator dest_begin; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_begin); u == u // first form EqualityFunctor equal; // second form equal(u, u) // second form int i; dest_accessor.set(i, dest_begin); \endcode */ doxygen_overloaded_function(template <...> unsigned int labelVolume) template unsigned int labelVolume(SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D neighborhood3D) { return labelVolume(s_Iter, srcShape, sa, d_Iter, da, neighborhood3D, std::equal_to()); } template unsigned int labelVolume(triple src, pair dest, Neighborhood3D neighborhood3D) { return labelVolume(src.first, src.second, src.third, dest.first, dest.second, neighborhood3D, std::equal_to()); } template unsigned int labelVolume(triple src, pair dest, Neighborhood3D neighborhood3D, EqualityFunctor equal) { return labelVolume(src.first, src.second, src.third, dest.first, dest.second, neighborhood3D, equal); } template unsigned int labelVolume(SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D, EqualityFunctor equal) { //basically needed for iteration and border-checks int w = srcShape[0], h = srcShape[1], d = srcShape[2]; int x,y,z, i; //declare and define Iterators for all three dims at src SrcIterator zs = s_Iter; SrcIterator ys(zs); SrcIterator xs(ys); // temporary image to store region labels typedef vigra::MultiArray<3,int> LabelVolume; typedef LabelVolume::traverser LabelTraverser; LabelVolume labelvolume(srcShape); //Declare traversers for all three dims at target LabelTraverser zt = labelvolume.traverser_begin(); LabelTraverser yt(zt); LabelTraverser xt(yt); // Kovalevsky's clever idea to use // image iterator and scan order iterator simultaneously // memory order indicates label LabelVolume::iterator label = labelvolume.begin(); // initialize the neighborhood traversers #if 0 NeighborOffsetTraverser nc(Neighborhood3D::CausalFirst); NeighborOffsetTraverser nce(Neighborhood3D::CausalLast); #endif /* #if 0 */ NeighborOffsetCirculator nc(Neighborhood3D::CausalFirst); NeighborOffsetCirculator nce(Neighborhood3D::CausalLast); ++nce; // pass 1: scan image from upper left front to lower right back // to find connected components // Each component will be represented by a tree of pixels. Each // pixel contains the scan order address of its parent in the // tree. In order for pass 2 to work correctly, the parent must // always have a smaller scan order address than the child. // Therefore, we can merge trees only at their roots, because the // root of the combined tree must have the smallest scan order // address among all the tree's pixels/ nodes. The root of each // tree is distinguished by pointing to itself (it contains its // own scan order address). This condition is enforced whenever a // new region is found or two regions are merged i=0; for(z = 0; z != d; ++z, ++zs.dim2(), ++zt.dim2()) { ys = zs; yt = zt; for(y = 0; y != h; ++y, ++ys.dim1(), ++yt.dim1()) { xs = ys; xt = yt; for(x = 0; x != w; ++x, ++xs.dim0(), ++xt.dim0(), ++i) { *xt = i; // default: new region //queck whether there is a special borde threatment to be used or not AtVolumeBorder atBorder = isAtVolumeBorderCausal(x,y,z,w,h,z); //We are not at the border! if(atBorder == NotAtBorder) { #if 0 nc = NeighborOffsetTraverser(Neighborhood3D::CausalFirst); #endif /* #if 0 */ nc = NeighborOffsetCirculator(Neighborhood3D::CausalFirst); do { // if colors are equal if(equal(*xs, xs[*nc])) { int neighborLabel = xt[*nc]; // find the root label of a label tree while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } if(neighborLabel < *xt) // always keep the smallest among the possible neighbor labels { label[*xt] = neighborLabel; *xt = neighborLabel; } else { label[neighborLabel] = *xt; } } ++nc; }while(nc!=nce); } //we are at a border - handle this!! else { #if 0 nc = NeighborOffsetTraverser(Neighborhood3D::nearBorderDirectionsCausal(atBorder,0)); #endif /* #if 0 */ nc = NeighborOffsetCirculator(Neighborhood3D::nearBorderDirectionsCausal(atBorder,0)); int j=0; while(nc.direction() != Neighborhood3D::Error) { // colors equal??? if(equal(*xs, xs[*nc])) { int neighborLabel = xt[*nc]; // find the root label of a label tree while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } if(neighborLabel < *xt) // always keep the smallest among the possible neighbor labels { label[*xt] = neighborLabel; *xt = neighborLabel; } else { label[neighborLabel] = *xt; } } nc.turnTo(Neighborhood3D::nearBorderDirectionsCausal(atBorder,++j)); } } } } } // pass 2: assign one label to each region (tree) // so that labels form a consecutive sequence 1, 2, ... DestIterator zd = d_Iter; unsigned int count = 0; i= 0; for(z=0; z != d; ++z, ++zd.dim2()) { DestIterator yd(zd); for(y=0; y != h; ++y, ++yd.dim1()) { DestIterator xd(yd); for(x = 0; x != w; ++x, ++xd.dim0(), ++i) { if(label[i] == i) { label[i] = count++; } else { label[i] = label[label[i]]; // compress trees } da.set(label[i]+1, xd); } } } return count; } /********************************************************/ /* */ /* labelVolumeSix */ /* */ /********************************************************/ /** \brief Find the connected components of a segmented volume using the 6-neighborhood. See \ref labelVolume() for detailed documentation. */ template unsigned int labelVolumeSix(triple src, pair dest) { return labelVolume(src.first, src.second, src.third, dest.first, dest.second, NeighborCode3DSix(), std::equal_to()); } /********************************************************/ /* */ /* labelVolumeWithBackground */ /* */ /********************************************************/ /** \brief Find the connected components of a segmented volume, excluding the background from labeling. Declarations: pass arguments explicitly: \code namespace vigra { template unsigned int labelVolumeWithBackground( SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D neighborhood3D, ValueType background_value); template unsigned int labelVolumeWithBackground( SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D neighborhood3D, ValueType background_value, EqualityFunctor equal); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template unsigned int labelVolumeWithBackground( triple src, pair dest, Neighborhood3D neighborhood3D, ValueType background_value); template unsigned int labelVolumeWithBackground( triple src, pair dest, Neighborhood3D neighborhood3D, ValueType background_value, EqualityFunctor equal); } \endcode Connected components are defined as regions with uniform voxel values. Thus, SrcAccessor::value_type either must be equality comparable (first form), or an EqualityFunctor must be provided that realizes the desired predicate (second form). All voxel equal to the given 'background_value' are ignored when determining connected components and remain untouched in the destination volume. The destination's value type should be large enough to hold the labels without overflow. Region numbers will be a consecutive sequence starting with one and ending with the region number returned by the function (inclusive). Return: the number of regions found (= largest region label) Usage: \#include \<vigra/labelvolume.hxx\>
Namespace: vigra \code typedef vigra::MultiArray<3,int> IntVolume; IntVolume src(IntVolume::difference_type(w,h,d)); IntVolume dest(IntVolume::difference_type(w,h,d)); // find 6-connected regions int max_region_label = vigra::labelVolumeWithBackground( srcMultiArrayRange(src), destMultiArray(dest), NeighborCode3DSix(), 0); \endcode Required Interface: \code SrcIterator src_begin; SrcShape shape; DestIterator dest_begin; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_begin); u == u // first form EqualityFunctor equal; // second form equal(u, u) // second form int i; dest_accessor.set(i, dest_begin); \endcode */ doxygen_overloaded_function(template <...> unsigned int labelVolumeWithBackground) template unsigned int labelVolumeWithBackground(SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D neighborhood3D, ValueType backgroundValue) { return labelVolumeWithBackground(s_Iter, srcShape, sa, d_Iter, da, neighborhood3D, backgroundValue, std::equal_to()); } template unsigned int labelVolumeWithBackground(triple src, pair dest, Neighborhood3D neighborhood3D, ValueType backgroundValue) { return labelVolumeWithBackground(src.first, src.second, src.third, dest.first, dest.second, neighborhood3D, backgroundValue, std::equal_to()); } template unsigned int labelVolumeWithBackground(triple src, pair dest, Neighborhood3D neighborhood3D, ValueType backgroundValue, EqualityFunctor equal) { return labelVolumeWithBackground(src.first, src.second, src.third, dest.first, dest.second, neighborhood3D, backgroundValue, equal); } template unsigned int labelVolumeWithBackground(SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D, ValueType backgroundValue, EqualityFunctor equal) { //basically needed for iteration and border-checks int w = srcShape[0], h = srcShape[1], d = srcShape[2]; int x,y,z, i; //declare and define Iterators for all three dims at src SrcIterator zs = s_Iter; SrcIterator ys(zs); SrcIterator xs(ys); // temporary image to store region labels typedef vigra::MultiArray<3,int> LabelVolume; typedef LabelVolume::traverser LabelTraverser; LabelVolume labelvolume(srcShape); //Declare traversers for all three dims at target LabelTraverser zt = labelvolume.traverser_begin(); LabelTraverser yt(zt); LabelTraverser xt(yt); // Kovalevsky's clever idea to use // image iterator and scan order iterator simultaneously // memory order indicates label LabelVolume::iterator label = labelvolume.begin(); // initialize the neighborhood traversers #if 0 NeighborOffsetTraverser nc(Neighborhood3D::CausalFirst); NeighborOffsetTraverser nce(Neighborhood3D::CausalLast); #endif /* #if 0 */ NeighborOffsetCirculator nc(Neighborhood3D::CausalFirst); NeighborOffsetCirculator nce(Neighborhood3D::CausalLast); ++nce; // pass 1: scan image from upper left front to lower right back // to find connected components // Each component will be represented by a tree of pixels. Each // pixel contains the scan order address of its parent in the // tree. In order for pass 2 to work correctly, the parent must // always have a smaller scan order address than the child. // Therefore, we can merge trees only at their roots, because the // root of the combined tree must have the smallest scan order // address among all the tree's pixels/ nodes. The root of each // tree is distinguished by pointing to itself (it contains its // own scan order address). This condition is enforced whenever a // new region is found or two regions are merged i=0; int backgroundAddress=-1; for(z = 0; z != d; ++z, ++zs.dim2(), ++zt.dim2()) { ys = zs; yt = zt; for(y = 0; y != h; ++y, ++ys.dim1(), ++yt.dim1()) { xs = ys; xt = yt; for(x = 0; x != w; ++x, ++xs.dim0(), ++xt.dim0(), ++i) { if(equal(*xs, backgroundValue)){ if(backgroundAddress==-1) backgroundAddress = i; label[i]=backgroundAddress; } else{ *xt = i; // default: new region //queck whether there is a special borde threatment to be used or not AtVolumeBorder atBorder = isAtVolumeBorderCausal(x,y,z,w,h,z); //We are not at the border! if(atBorder == NotAtBorder) { #if 0 nc = NeighborOffsetTraverser(Neighborhood3D::CausalFirst); #endif /* #if 0 */ nc = NeighborOffsetCirculator(Neighborhood3D::CausalFirst); do { // if colors are equal if(equal(*xs, xs[*nc])) { int neighborLabel = xt[*nc]; // find the root label of a label tree while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } if(neighborLabel < *xt) // always keep the smallest among the possible neighbor labels { label[*xt] = neighborLabel; *xt = neighborLabel; } else { label[neighborLabel] = *xt; } } ++nc; }while(nc!=nce); } //we are at a border - handle this!! else { #if 0 nc = NeighborOffsetTraverser(Neighborhood3D::nearBorderDirectionsCausal(atBorder,0)); #endif /* #if 0 */ nc = NeighborOffsetCirculator(Neighborhood3D::nearBorderDirectionsCausal(atBorder,0)); int j=0; while(nc.direction() != Neighborhood3D::Error) { // colors equal??? if(equal(*xs, xs[*nc])) { int neighborLabel = xt[*nc]; // find the root label of a label tree while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } if(neighborLabel < *xt) // always keep the smallest among the possible neighbor labels { label[*xt] = neighborLabel; *xt = neighborLabel; } else { label[neighborLabel] = *xt; } } nc.turnTo(Neighborhood3D::nearBorderDirectionsCausal(atBorder,++j)); } } } } } } // pass 2: assign one label to each region (tree) // so that labels form a consecutive sequence 1, 2, ... DestIterator zd = d_Iter; unsigned int count = 0; i= 0; for(z=0; z != d; ++z, ++zd.dim2()) { DestIterator yd(zd); for(y=0; y != h; ++y, ++yd.dim1()) { DestIterator xd(yd); for(x = 0; x != w; ++x, ++xd.dim0(), ++i) { if(label[i] == backgroundAddress){ label[i]=0; continue; } if(label[i] == i) { label[i] = count++; } else { label[i] = label[label[i]]; // compress trees } da.set(label[i]+1, xd); } } } return count; } //@} } //end of namespace vigra #endif //VIGRA_LABELVOLUME_HXX gamera-3.3.3/include/vigra/linear_algebra.hxx0000644000076500000000000000552511261456425020172 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_LINEAR_ALGREBRA_HXX #define VIGRA_LINEAR_ALGREBRA_HXX #include "matrix.hxx" #include "linear_solve.hxx" #include "eigensystem.hxx" #endif // VIGRA_LINEAR_ALGREBRA_HXX gamera-3.3.3/include/vigra/linear_solve.hxx0000644000076500000000000013517111261456425017726 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2003-2008 by Gunnar Kedenburg and Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_LINEAR_SOLVE_HXX #define VIGRA_LINEAR_SOLVE_HXX #include #include #include "mathutil.hxx" #include "matrix.hxx" #include "singular_value_decomposition.hxx" namespace vigra { namespace linalg { namespace detail { template T determinantByLUDecomposition(MultiArrayView<2, T, C1> const & a) { typedef MultiArrayShape<2>::type Shape; MultiArrayIndex m = rowCount(a), n = columnCount(a); vigra_precondition(n == m, "determinant(): square matrix required."); Matrix LU(a); T det = 1.0; for (MultiArrayIndex j = 0; j < n; ++j) { // Apply previous transformations. for (MultiArrayIndex i = 0; i < m; ++i) { MultiArrayIndex end = std::min(i, j); T s = dot(rowVector(LU, Shape(i,0), end), columnVector(LU, Shape(0,j), end)); LU(i,j) = LU(i,j) -= s; } // Find pivot and exchange if necessary. MultiArrayIndex p = j + argMax(abs(columnVector(LU, Shape(j,j), m))); if (p != j) { rowVector(LU, p).swapData(rowVector(LU, j)); det = -det; } det *= LU(j,j); // Compute multipliers. if (LU(j,j) != 0.0) columnVector(LU, Shape(j+1,j), m) /= LU(j,j); else break; // det is zero } return det; } // returns the new value of 'a' (when this Givens rotation is applied to 'a' and 'b') // the new value of 'b' is zero, of course template T givensCoefficients(T a, T b, T & c, T & s) { if(abs(a) < abs(b)) { T t = a/b, r = std::sqrt(1.0 + t*t); s = 1.0 / r; c = t*s; return r*b; } else if(a != 0.0) { T t = b/a, r = std::sqrt(1.0 + t*t); c = 1.0 / r; s = t*c; return r*a; } else // a == b == 0.0 { c = 1.0; s = 0.0; return 0.0; } } // see Golub, van Loan: Algorithm 5.1.3 (p. 216) template bool givensRotationMatrix(T a, T b, Matrix & gTranspose) { if(b == 0.0) return false; // no rotation needed givensCoefficients(a, b, gTranspose(0,0), gTranspose(0,1)); gTranspose(1,1) = gTranspose(0,0); gTranspose(1,0) = -gTranspose(0,1); return true; } // reflections are symmetric matrices and can thus be applied to rows // and columns in the same way => code simplification relative to rotations template inline bool givensReflectionMatrix(T a, T b, Matrix & g) { if(b == 0.0) return false; // no reflection needed givensCoefficients(a, b, g(0,0), g(0,1)); g(1,1) = -g(0,0); g(1,0) = g(0,1); return true; } // see Golub, van Loan: Algorithm 5.2.2 (p. 227) and Section 12.5.2 (p. 608) template bool qrGivensStepImpl(MultiArrayIndex i, MultiArrayView<2, T, C1> &r, MultiArrayView<2, T, C2> &rhs) { typedef typename Matrix::difference_type Shape; const MultiArrayIndex m = rowCount(r); const MultiArrayIndex n = columnCount(r); const MultiArrayIndex rhsCount = columnCount(rhs); vigra_precondition(m == rowCount(rhs), "qrGivensStepImpl(): Matrix shape mismatch."); Matrix givens(2,2); for(int k=m-1; k>(int)i; --k) { if(!givensReflectionMatrix(r(k-1,i), r(k,i), givens)) continue; // r(k,i) was already zero r(k-1,i) = givens(0,0)*r(k-1,i) + givens(0,1)*r(k,i); r(k,i) = 0.0; r.subarray(Shape(k-1,i+1), Shape(k+1,n)) = givens*r.subarray(Shape(k-1,i+1), Shape(k+1,n)); rhs.subarray(Shape(k-1,0), Shape(k+1,rhsCount)) = givens*rhs.subarray(Shape(k-1,0), Shape(k+1,rhsCount)); } return r(i,i) != 0.0; } // see Golub, van Loan: Section 12.5.2 (p. 608) template void upperTriangularCyclicShiftColumns(MultiArrayIndex i, MultiArrayIndex j, MultiArrayView<2, T, C1> &r, MultiArrayView<2, T, C2> &rhs, Permutation & permutation) { typedef typename Matrix::difference_type Shape; const MultiArrayIndex m = rowCount(r); const MultiArrayIndex n = columnCount(r); const MultiArrayIndex rhsCount = columnCount(rhs); vigra_precondition(i < n && j < n, "upperTriangularCyclicShiftColumns(): Shift indices out of range."); vigra_precondition(m == rowCount(rhs), "upperTriangularCyclicShiftColumns(): Matrix shape mismatch."); if(j == i) return; if(j < i) std::swap(j,i); Matrix t = columnVector(r, i); MultiArrayIndex ti = permutation[i]; for(MultiArrayIndex k=i; k givens(2,2); for(MultiArrayIndex k=i; k void upperTriangularSwapColumns(MultiArrayIndex i, MultiArrayIndex j, MultiArrayView<2, T, C1> &r, MultiArrayView<2, T, C2> &rhs, Permutation & permutation) { typedef typename Matrix::difference_type Shape; const MultiArrayIndex m = rowCount(r); const MultiArrayIndex n = columnCount(r); const MultiArrayIndex rhsCount = columnCount(rhs); vigra_precondition(i < n && j < n, "upperTriangularSwapColumns(): Swap indices out of range."); vigra_precondition(m == rowCount(rhs), "upperTriangularSwapColumns(): Matrix shape mismatch."); if(j == i) return; if(j < i) std::swap(j,i); columnVector(r, i).swapData(columnVector(r, j)); std::swap(permutation[i], permutation[j]); Matrix givens(2,2); for(int k=m-1; k>(int)i; --k) { if(!givensReflectionMatrix(r(k-1,i), r(k,i), givens)) continue; // r(k,i) was already zero r(k-1,i) = givens(0,0)*r(k-1,i) + givens(0,1)*r(k,i); r(k,i) = 0.0; r.subarray(Shape(k-1,i+1), Shape(k+1,n)) = givens*r.subarray(Shape(k-1,i+1), Shape(k+1,n)); rhs.subarray(Shape(k-1,0), Shape(k+1,rhsCount)) = givens*rhs.subarray(Shape(k-1,0), Shape(k+1,rhsCount)); } MultiArrayIndex end = std::min(j, m-1); for(MultiArrayIndex k=i+1; k bool householderVector(MultiArrayView<2, T, C1> const & v, MultiArrayView<2, T, C2> & u, U & vnorm) { vnorm = (v(0,0) > 0.0) ? -norm(v) : norm(v); U f = std::sqrt(vnorm*(vnorm - v(0,0))); if(f == NumericTraits::zero()) { u.init(NumericTraits::zero()); return false; } else { u(0,0) = (v(0,0) - vnorm) / f; for(MultiArrayIndex k=1; k bool qrHouseholderStepImpl(MultiArrayIndex i, MultiArrayView<2, T, C1> & r, MultiArrayView<2, T, C2> & rhs, MultiArrayView<2, T, C3> & householderMatrix) { typedef typename Matrix::difference_type Shape; const MultiArrayIndex m = rowCount(r); const MultiArrayIndex n = columnCount(r); const MultiArrayIndex rhsCount = columnCount(rhs); vigra_precondition(i < n && i < m, "qrHouseholderStepImpl(): Index i out of range."); Matrix u(m-i,1); T vnorm; bool nontrivial = householderVector(columnVector(r, Shape(i,i), m), u, vnorm); r(i,i) = vnorm; columnVector(r, Shape(i+1,i), m).init(NumericTraits::zero()); if(columnCount(householderMatrix) == n) columnVector(householderMatrix, Shape(i,i), m) = u; if(nontrivial) { for(MultiArrayIndex k=i+1; k bool qrColumnHouseholderStep(MultiArrayIndex i, MultiArrayView<2, T, C1> &r, MultiArrayView<2, T, C2> &rhs) { Matrix dontStoreHouseholderVectors; // intentionally empty return qrHouseholderStepImpl(i, r, rhs, dontStoreHouseholderVectors); } template bool qrRowHouseholderStep(MultiArrayIndex i, MultiArrayView<2, T, C1> &r, MultiArrayView<2, T, C2> & householderMatrix) { Matrix dontTransformRHS; // intentionally empty MultiArrayView<2, T, StridedArrayTag> rt = transpose(r), ht = transpose(householderMatrix); return qrHouseholderStepImpl(i, rt, dontTransformRHS, ht); } // O(n) algorithm due to Bischof: Incremental Condition Estimation, 1990 template void incrementalMaxSingularValueApproximation(MultiArrayView<2, T, C1> const & newColumn, MultiArrayView<2, T, C2> & z, SNType & v) { typedef typename Matrix::difference_type Shape; MultiArrayIndex n = rowCount(newColumn) - 1; SNType vneu = squaredNorm(newColumn); T yv = dot(columnVector(newColumn, Shape(0,0),n), columnVector(z, Shape(0,0),n)); // use atan2 as it is robust against overflow/underflow double t = 0.5*std::atan2(2.0*yv, sq(v)-vneu), s = std::sin(t), c = std::cos(t); v = std::sqrt(sq(c*v) + sq(s)*vneu + 2.0*s*c*yv); columnVector(z, Shape(0,0),n) = c*columnVector(z, Shape(0,0),n) + s*columnVector(newColumn, Shape(0,0),n); z(n,0) = s*newColumn(n,0); } // O(n) algorithm due to Bischof: Incremental Condition Estimation, 1990 template void incrementalMinSingularValueApproximation(MultiArrayView<2, T, C1> const & newColumn, MultiArrayView<2, T, C2> & z, SNType & v, double tolerance) { typedef typename Matrix::difference_type Shape; if(v <= tolerance) { v = 0.0; return; } MultiArrayIndex n = rowCount(newColumn) - 1; T gamma = newColumn(n,0); if(gamma == 0.0) { v = 0.0; return; } T yv = dot(columnVector(newColumn, Shape(0,0),n), columnVector(z, Shape(0,0),n)); // use atan2 as it is robust against overflow/underflow double t = 0.5*std::atan2(-2.0*yv, squaredNorm(gamma / v) + squaredNorm(yv) - 1.0), s = std::sin(t), c = std::cos(t); columnVector(z, Shape(0,0),n) *= c; z(n,0) = (s - c*yv) / gamma; v *= norm(gamma) / hypot(c*gamma, v*(s - c*yv)); } // QR algorithm with optional column pivoting template unsigned int qrTransformToTriangularImpl(MultiArrayView<2, T, C1> & r, MultiArrayView<2, T, C2> & rhs, MultiArrayView<2, T, C3> & householder, ArrayVector & permutation, double epsilon) { typedef typename Matrix::difference_type Shape; typedef typename NormTraits >::NormType NormType; typedef typename NormTraits >::SquaredNormType SNType; const MultiArrayIndex m = rowCount(r); const MultiArrayIndex n = columnCount(r); const MultiArrayIndex maxRank = std::min(m, n); vigra_precondition(m >= n, "qrTransformToTriangularImpl(): Coefficient matrix with at least as many rows as columns required."); const MultiArrayIndex rhsCount = columnCount(rhs); bool transformRHS = rhsCount > 0; vigra_precondition(!transformRHS || m == rowCount(rhs), "qrTransformToTriangularImpl(): RHS matrix shape mismatch."); bool storeHouseholderSteps = columnCount(householder) > 0; vigra_precondition(!storeHouseholderSteps || r.shape() == householder.shape(), "qrTransformToTriangularImpl(): Householder matrix shape mismatch."); bool pivoting = permutation.size() > 0; vigra_precondition(!pivoting || n == (MultiArrayIndex)permutation.size(), "qrTransformToTriangularImpl(): Permutation array size mismatch."); if(n == 0) return 0; // trivial solution Matrix columnSquaredNorms; if(pivoting) { columnSquaredNorms.reshape(Shape(1,n)); for(MultiArrayIndex k=0; k::epsilon() : epsilon; bool simpleSingularValueApproximation = (n < 4); Matrix zmax, zmin; if(minApproxSingularValue <= tolerance) { rank = 0; pivoting = false; simpleSingularValueApproximation = true; } if(!simpleSingularValueApproximation) { zmax.reshape(Shape(m,1)); zmin.reshape(Shape(m,1)); zmax(0,0) = r(0,0); zmin(0,0) = 1.0 / r(0,0); } for(MultiArrayIndex k=1; k u(k+1,k+1), s(k+1, 1), v(k+1,k+1); singularValueDecomposition(r.subarray(Shape(0,0), Shape(k+1,k+1)), u, s, v); std::cerr << "estimate, svd " << k << ": " << minApproxSingularValue << " " << s(k,0) << "\n"; #endif if(epsilon == 0.0) tolerance = m*maxApproxSingularValue*NumericTraits::epsilon(); if(minApproxSingularValue > tolerance) ++rank; else pivoting = false; // matrix doesn't have full rank, triangulize the rest without pivoting } return (unsigned int)rank; } template unsigned int qrTransformToUpperTriangular(MultiArrayView<2, T, C1> & r, MultiArrayView<2, T, C2> & rhs, ArrayVector & permutation, double epsilon = 0.0) { Matrix dontStoreHouseholderVectors; // intentionally empty return qrTransformToTriangularImpl(r, rhs, dontStoreHouseholderVectors, permutation, epsilon); } // QR algorithm with optional row pivoting template unsigned int qrTransformToLowerTriangular(MultiArrayView<2, T, C1> & r, MultiArrayView<2, T, C2> & rhs, MultiArrayView<2, T, C3> & householderMatrix, double epsilon = 0.0) { ArrayVector permutation((unsigned int)rowCount(rhs)); for(MultiArrayIndex k=0; k<(MultiArrayIndex)permutation.size(); ++k) permutation[k] = k; Matrix dontTransformRHS; // intentionally empty MultiArrayView<2, T, StridedArrayTag> rt = transpose(r), ht = transpose(householderMatrix); unsigned int rank = qrTransformToTriangularImpl(rt, dontTransformRHS, ht, permutation, epsilon); // apply row permutation to RHS Matrix tempRHS(rhs); for(MultiArrayIndex k=0; k<(MultiArrayIndex)permutation.size(); ++k) rowVector(rhs, k) = rowVector(tempRHS, permutation[k]); return rank; } // QR algorithm without column pivoting template inline bool qrTransformToUpperTriangular(MultiArrayView<2, T, C1> & r, MultiArrayView<2, T, C2> & rhs, double epsilon = 0.0) { ArrayVector noPivoting; // intentionally empty return (qrTransformToUpperTriangular(r, rhs, noPivoting, epsilon) == (unsigned int)columnCount(r)); } // QR algorithm without row pivoting template inline bool qrTransformToLowerTriangular(MultiArrayView<2, T, C1> & r, MultiArrayView<2, T, C2> & householder, double epsilon = 0.0) { Matrix noPivoting; // intentionally empty return (qrTransformToLowerTriangular(r, noPivoting, householder, epsilon) == (unsigned int)rowCount(r)); } // restore ordering of result vector elements after QR solution with column pivoting template void inverseRowPermutation(MultiArrayView<2, T, C1> &permuted, MultiArrayView<2, T, C2> &res, Permutation const & permutation) { for(MultiArrayIndex k=0; k void applyHouseholderColumnReflections(MultiArrayView<2, T, C1> const &householder, MultiArrayView<2, T, C2> &res) { typedef typename Matrix::difference_type Shape; MultiArrayIndex n = rowCount(householder); MultiArrayIndex m = columnCount(householder); MultiArrayIndex rhsCount = columnCount(res); for(int k = m-1; k >= 0; --k) { MultiArrayView<2, T, C1> u = columnVector(householder, Shape(k,k), n); for(MultiArrayIndex l=0; l unsigned int linearSolveQRReplace(MultiArrayView<2, T, C1> &A, MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> & res, double epsilon = 0.0) { typedef typename Matrix::difference_type Shape; MultiArrayIndex n = columnCount(A); MultiArrayIndex m = rowCount(A); MultiArrayIndex rhsCount = columnCount(res); MultiArrayIndex rank = std::min(m,n); vigra_precondition(rhsCount == columnCount(b), "linearSolveQR(): RHS and solution must have the same number of columns."); vigra_precondition(m == rowCount(b), "linearSolveQR(): Coefficient matrix and RHS must have the same number of rows."); vigra_precondition(n == rowCount(res), "linearSolveQR(): Mismatch between column count of coefficient matrix and row count of solution."); vigra_precondition(epsilon >= 0.0, "linearSolveQR(): 'epsilon' must be non-negative."); if(m < n) { // minimum norm solution of underdetermined system Matrix householderMatrix(n, m); MultiArrayView<2, T, StridedArrayTag> ht = transpose(householderMatrix); rank = (MultiArrayIndex)detail::qrTransformToLowerTriangular(A, b, ht, epsilon); res.subarray(Shape(rank,0), Shape(n, rhsCount)).init(NumericTraits::zero()); if(rank < m) { // system is also rank-deficient => compute minimum norm least squares solution MultiArrayView<2, T, C1> Asub = A.subarray(Shape(0,0), Shape(m,rank)); detail::qrTransformToUpperTriangular(Asub, b, epsilon); linearSolveUpperTriangular(A.subarray(Shape(0,0), Shape(rank,rank)), b.subarray(Shape(0,0), Shape(rank,rhsCount)), res.subarray(Shape(0,0), Shape(rank, rhsCount))); } else { // system has full rank => compute minimum norm solution linearSolveLowerTriangular(A.subarray(Shape(0,0), Shape(rank,rank)), b.subarray(Shape(0,0), Shape(rank, rhsCount)), res.subarray(Shape(0,0), Shape(rank, rhsCount))); } detail::applyHouseholderColumnReflections(householderMatrix.subarray(Shape(0,0), Shape(n, rank)), res); } else { // solution of well-determined or overdetermined system ArrayVector permutation((unsigned int)n); for(MultiArrayIndex k=0; k permutedSolution(n, rhsCount); if(rank < n) { // system is rank-deficient => compute minimum norm solution Matrix householderMatrix(n, rank); MultiArrayView<2, T, StridedArrayTag> ht = transpose(householderMatrix); MultiArrayView<2, T, C1> Asub = A.subarray(Shape(0,0), Shape(rank,n)); detail::qrTransformToLowerTriangular(Asub, ht, epsilon); linearSolveLowerTriangular(A.subarray(Shape(0,0), Shape(rank,rank)), b.subarray(Shape(0,0), Shape(rank, rhsCount)), permutedSolution.subarray(Shape(0,0), Shape(rank, rhsCount))); detail::applyHouseholderColumnReflections(householderMatrix, permutedSolution); } else { // system has full rank => compute exact or least squares solution linearSolveUpperTriangular(A.subarray(Shape(0,0), Shape(rank,rank)), b.subarray(Shape(0,0), Shape(rank,rhsCount)), permutedSolution); } detail::inverseRowPermutation(permutedSolution, res, permutation); } return (unsigned int)rank; } template unsigned int linearSolveQR(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> const & b, MultiArrayView<2, T, C3> & res) { Matrix r(A), rhs(b); return linearSolveQRReplace(r, rhs, res); } /** \defgroup MatrixAlgebra Advanced Matrix Algebra \brief Solution of linear systems, eigen systems, linear least squares etc. \ingroup LinearAlgebraModule */ //@{ /** Create the inverse or pseudo-inverse of matrix \a v. If the matrix \a v is square, \a res must have the same shape and will contain the inverse of \a v. If \a v is rectangular, it must have more rows than columns, and \a res must have the transposed shape of \a v. The inverse is then computed in the least-squares sense, i.e. \a res will be the pseudo-inverse (Moore-Penrose inverse). The function returns true upon success, and false if \a v is not invertible (has not full rank). The inverse is computed by means of QR decomposition. This function can be applied in-place. \#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool inverse(const MultiArrayView<2, T, C1> &v, MultiArrayView<2, T, C2> &res) { const MultiArrayIndex n = columnCount(v); vigra_precondition(n <= rowCount(v), "inverse(): input matrix must have at least as many rows as columns."); vigra_precondition(n == rowCount(res) && rowCount(v) == columnCount(res), "inverse(): shape of output matrix must be the transpose of the input matrix' shape."); Matrix q(v.shape()), r(n, n); if(!qrDecomposition(v, q, r)) return false; // a didn't have full rank linearSolveUpperTriangular(r, transpose(q), res); return true; } /** Create the inverse or pseudo-inverse of matrix \a v. The result is returned as a temporary matrix. If the matrix \a v is square, the result will have the same shape and contains the inverse of \a v. If \a v is rectangular, it must have more rows than columns, and the result will have the transposed shape of \a v. The inverse is then computed in the least-squares sense, i.e. \a res will be the pseudo-inverse (Moore-Penrose inverse). The inverse is computed by means of QR decomposition. If \a v is not invertible, vigra::PreconditionViolation exception is thrown. Usage: \code vigra::Matrix v(n, n); v = ...; vigra::Matrix m = inverse(v); \endcode \#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template TemporaryMatrix inverse(const MultiArrayView<2, T, C> &v) { TemporaryMatrix ret(columnCount(v), rowCount(v)); // transpose shape vigra_precondition(inverse(v, ret), "inverse(): matrix is not invertible."); return ret; } template TemporaryMatrix inverse(const TemporaryMatrix &v) { if(columnCount(v) == rowCount(v)) { vigra_precondition(inverse(v, const_cast &>(v)), "inverse(): matrix is not invertible."); return v; } else { TemporaryMatrix ret(columnCount(v), rowCount(v)); // transpose shape vigra_precondition(inverse(v, ret), "inverse(): matrix is not invertible."); return ret; } } /** Compute the determinant of a square matrix. \a method must be one of the following:
"Cholesky"
Compute the solution by means of Cholesky decomposition. This method is faster than "LU", but requires the matrix \a a to be symmetric positive definite. If this is not the case, a ContractViolation exception is thrown.
"LU"
(default) Compute the solution by means of LU decomposition.
\#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template T determinant(MultiArrayView<2, T, C1> const & a, std::string method = "LU") { MultiArrayIndex n = columnCount(a); vigra_precondition(rowCount(a) == n, "determinant(): Square matrix required."); for(unsigned int k=0; k L(a.shape()); vigra_precondition(choleskyDecomposition(a, L), "determinant(): Cholesky method requires symmetric positive definite matrix."); T det = L(0,0); for(MultiArrayIndex k=1; k\#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template T logDeterminant(MultiArrayView<2, T, C1> const & a) { MultiArrayIndex n = columnCount(a); vigra_precondition(rowCount(a) == n, "logDeterminant(): Square matrix required."); if(n == 1) { vigra_precondition(a(0,0) > 0.0, "logDeterminant(): Matrix not positive definite."); return std::log(a(0,0)); } if(n == 2) { T det = a(0,0)*a(1,1) - a(0,1)*a(1,0); vigra_precondition(det > 0.0, "logDeterminant(): Matrix not positive definite."); return std::log(det); } else { Matrix L(a.shape()); vigra_precondition(choleskyDecomposition(a, L), "logDeterminant(): Matrix not positive definite."); T logdet = std::log(L(0,0)); for(MultiArrayIndex k=1; k&L == &A is an error. If \a A is not symmetric, a ContractViolation exception is thrown. If it is not positive definite, the function returns false. \#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool choleskyDecomposition(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> &L) { typedef T Real; MultiArrayIndex n = columnCount(A); vigra_precondition(rowCount(A) == n, "choleskyDecomposition(): Input matrix must be square."); vigra_precondition(n == columnCount(L) && n == rowCount(L), "choleskyDecomposition(): Output matrix must have same shape as input matrix."); for (MultiArrayIndex j = 0; j < n; ++j) { Real d(0.0); for (MultiArrayIndex k = 0; k < j; ++k) { Real s(0.0); for (MultiArrayIndex i = 0; i < k; ++i) { s += L(k, i)*L(j, i); } L(j, k) = s = (A(j, k) - s)/L(k, k); d = d + s*s; vigra_precondition(A(k, j) == A(j, k), "choleskyDecomposition(): Input matrix must be symmetric."); } d = A(j, j) - d; if(d <= 0.0) return false; // A is not positive definite L(j, j) = std::sqrt(d); for (MultiArrayIndex k = j+1; k < n; ++k) { L(j, k) = 0.0; } } return true; } /** QR decomposition. \a a contains the original matrix, results are returned in \a q and \a r, where \a q is a orthogonal matrix, and \a r is an upper triangular matrix, such that (up to round-off errors): \code a == q * r; \endcode If \a a dosn't have full rank, the function returns false. The decomposition is computed by householder transformations. It can be applied in-place, i.e. &a == &q or &a == &r are allowed. \#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool qrDecomposition(MultiArrayView<2, T, C1> const & a, MultiArrayView<2, T, C2> &q, MultiArrayView<2, T, C3> &r, double epsilon = 0.0) { const MultiArrayIndex m = rowCount(a); const MultiArrayIndex n = columnCount(a); vigra_precondition(n == columnCount(r) && m == rowCount(r) && m == columnCount(q) && m == rowCount(q), "qrDecomposition(): Matrix shape mismatch."); q = identityMatrix(m); MultiArrayView<2,T, StridedArrayTag> tq = transpose(q); r = a; ArrayVector noPivoting; // intentionally empty return (detail::qrTransformToUpperTriangular(r, tq, noPivoting, epsilon) == std::min(m,n)); } /** Deprecated, use \ref linearSolveUpperTriangular(). */ template inline bool reverseElimination(const MultiArrayView<2, T, C1> &r, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> x) { return linearSolveUpperTriangular(r, b, x); } /** Solve a linear system with upper-triangular coefficient matrix. The square matrix \a r must be an upper-triangular coefficient matrix as can, for example, be obtained by means of QR decomposition. If \a r doesn't have full rank the function fails and returns false, otherwise it returns true. The lower triangular part of matrix \a r will not be touched, so it doesn't need to contain zeros. The column vectors of matrix \a b are the right-hand sides of the equation (several equations with the same coefficients can thus be solved in one go). The result is returned int \a x, whose columns contain the solutions for the corresponding columns of \a b. This implementation can be applied in-place, i.e. &b == &x is allowed. The following size requirements apply: \code rowCount(r) == columnCount(r); rowCount(r) == rowCount(b); columnCount(r) == rowCount(x); columnCount(b) == columnCount(x); \endcode \#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool linearSolveUpperTriangular(const MultiArrayView<2, T, C1> &r, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> x) { typedef MultiArrayShape<2>::type Shape; MultiArrayIndex m = rowCount(r); MultiArrayIndex rhsCount = columnCount(b); vigra_precondition(m == columnCount(r), "linearSolveUpperTriangular(): square coefficient matrix required."); vigra_precondition(m == rowCount(b) && m == rowCount(x) && rhsCount == columnCount(x), "linearSolveUpperTriangular(): matrix shape mismatch."); for(MultiArrayIndex k = 0; k < rhsCount; ++k) { for(int i=m-1; i>=0; --i) { if(r(i,i) == NumericTraits::zero()) return false; // r doesn't have full rank T sum = b(i, k); for(MultiArrayIndex j=i+1; jfalse, otherwise it returns true. The upper triangular part of matrix \a l will not be touched, so it doesn't need to contain zeros. The column vectors of matrix \a b are the right-hand sides of the equation (several equations with the same coefficients can thus be solved in one go). The result is returned in \a x, whose columns contain the solutions for the correspoinding columns of \a b. This implementation can be applied in-place, i.e. &b == &x is allowed. The following size requirements apply: \code rowCount(l) == columnCount(l); rowCount(l) == rowCount(b); columnCount(l) == rowCount(x); columnCount(b) == columnCount(x); \endcode \#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool linearSolveLowerTriangular(const MultiArrayView<2, T, C1> &l, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> x) { MultiArrayIndex m = columnCount(l); MultiArrayIndex n = columnCount(b); vigra_precondition(m == rowCount(l), "linearSolveLowerTriangular(): square coefficient matrix required."); vigra_precondition(m == rowCount(b) && m == rowCount(x) && n == columnCount(x), "linearSolveLowerTriangular(): matrix shape mismatch."); for(MultiArrayIndex k = 0; k < n; ++k) { for(MultiArrayIndex i=0; i::zero()) return false; // l doesn't have full rank T sum = b(i, k); for(MultiArrayIndex j=0; j
"Cholesky"
Compute the solution by means of Cholesky decomposition. The coefficient matrix \a A must by symmetric positive definite. If this is not the case, the function returns false.
"QR"
(default) Compute the solution by means of QR decomposition. The coefficient matrix \a A can be square or rectangular. In the latter case, it must have more rows than columns, and the solution will be computed in the least squares sense. If \a A doesn't have full rank, the function returns false.
"SVD"
Compute the solution by means of singular value decomposition. The coefficient matrix \a A can be square or rectangular. In the latter case, it must have more rows than columns, and the solution will be computed in the least squares sense. If \a A doesn't have full rank, the function returns false.
"NE"
Compute the solution by means of the normal equations, i.e. by applying Cholesky decomposition to the equivalent problem A'*A*x = A'*b. This only makes sense when the equation is to be solved in the least squares sense, i.e. when \a A is a rectangular matrix with more rows than columns. If \a A doesn't have full column rank, the function returns false. This function can be applied in-place, i.e. &b == &res or &A == &res are allowed (provided they have the required shapes). The following size requirements apply: \code rowCount(r) == rowCount(b); columnCount(r) == rowCount(x); columnCount(b) == columnCount(x); \endcode \#include \<vigra/linear_solve.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool linearSolve(const MultiArrayView<2, T, C1> &A, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> & res, std::string method = "QR") { typedef typename Matrix::difference_type Shape; typedef typename Matrix::view_type SubMatrix; const MultiArrayIndex n = columnCount(A); const MultiArrayIndex m = rowCount(A); vigra_precondition(n <= m, "linearSolve(): Coefficient matrix A must have at least as many rows as columns."); vigra_precondition(n == rowCount(res) && m == rowCount(b) && columnCount(b) == columnCount(res), "linearSolve(): matrix shape mismatch."); for(unsigned int k=0; k L(A.shape()); if(!choleskyDecomposition(A, L)) return false; // false if A wasn't symmetric positive definite linearSolveLowerTriangular(L, b, res); linearSolveUpperTriangular(transpose(L), res, res); } else if(method == "qr") { return (MultiArrayIndex)linearSolveQR(A, b, res) == n; } else if(method == "ne") { return linearSolve(transpose(A)*A, transpose(A)*b, res, "Cholesky"); } else if(method == "svd") { MultiArrayIndex rhsCount = columnCount(b); Matrix u(A.shape()), s(n, 1), v(n, n); MultiArrayIndex rank = (MultiArrayIndex)singularValueDecomposition(A, u, s, v); Matrix t = transpose(u)*b; for(MultiArrayIndex l=0; l::zero(); } res = v*t; return (rank == n); } else { vigra_precondition(false, "linearSolve(): Unknown solution method."); } return true; } //@} } // namespace linalg using linalg::inverse; using linalg::determinant; using linalg::logDeterminant; using linalg::linearSolve; using linalg::choleskyDecomposition; using linalg::qrDecomposition; using linalg::linearSolveUpperTriangular; using linalg::linearSolveLowerTriangular; } // namespace vigra #endif // VIGRA_LINEAR_SOLVE_HXX gamera-3.3.3/include/vigra/localminmax.hxx0000644000076500000000000010001211261456425017532 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_LOCALMINMAX_HXX #define VIGRA_LOCALMINMAX_HXX #include #include #include "utilities.hxx" #include "stdimage.hxx" #include "initimage.hxx" #include "labelimage.hxx" #include "pixelneighborhood.hxx" namespace vigra { /** \addtogroup LocalMinMax Local Minima and Maxima Detect local minima and maxima of the gray level, including extremal plateaus larger than 1 pixel */ //@{ namespace detail { template void localMinMax(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker, Neighborhood neighborhood, Compare compare) { int w = slr.x - sul.x - 2; int h = slr.y - sul.y - 2; int i,x,y; sul += Diff2D(1,1); dul += Diff2D(1,1); for(y=0; y sc(sx); for(i = 0; i < Neighborhood::DirectionCount; ++i, ++sc) { if(!compare(v, sa(sc))) break; } if(i == Neighborhood::DirectionCount) da.set(marker, dx); } } } } // namespace detail /********************************************************/ /* */ /* localMinima */ /* */ /********************************************************/ /** \brief Find local minima in an image. The minima are found only when the have a size of one pixel. Use \ref extendedLocalMinima() to find minimal plateaus. Minima are marked in the destination image with the given marker value (default is 1), all other destination pixels remain unchanged. SrcAccessor::value_type must be less-comparable. A pixel at the image border will never be marked as minimum. Pass \ref vigra::EightNeighborCode or \ref vigra::FourNeighborCode to determine the neighborhood where pixel values are compared. The function uses accessors. Declarations: pass arguments explicitly: \code namespace vigra { template void localMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker = NumericTraits::one(), Neighborhood neighborhood = EightNeighborCode()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void localMinima(triple src, pair dest, DestValue marker = NumericTraits::one(), Neighborhood neighborhood = EightNeighborCode()) } \endcode Usage: \#include \<vigra/localminmax.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), minima(w,h); // init destiniation image minima = 0; vigra::localMinima(srcImageRange(src), destImage(minima)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); u < u DestValue marker; dest_accessor.set(marker, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void localMinima) template inline void localMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker, Neighborhood neighborhood) { detail::localMinMax(sul, slr, sa, dul, da, marker, neighborhood, std::less()); } template inline void localMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker) { localMinima(sul, slr, sa, dul, da, marker, EightNeighborCode()); } template inline void localMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da) { localMinima(sul, slr, sa, dul, da, NumericTraits::one(), EightNeighborCode()); } template inline void localMinima(triple src, pair dest, DestValue marker, Neighborhood neighborhood) { localMinima(src.first, src.second, src.third, dest.first, dest.second, marker, neighborhood); } template inline void localMinima(triple src, pair dest, DestValue marker) { localMinima(src.first, src.second, src.third, dest.first, dest.second, marker, EightNeighborCode()); } template inline void localMinima(triple src, pair dest) { localMinima(src.first, src.second, src.third, dest.first, dest.second, NumericTraits::one(), EightNeighborCode()); } /********************************************************/ /* */ /* localMaxima */ /* */ /********************************************************/ /** \brief Find local maxima in an image. The maxima are found only when the have a size of one pixel. Use \ref extendedLocalMaxima() to find maximal plateaus. Maxima are marked in the destination image with the given marker value (default is 1), all other destination pixels remain unchanged. SrcAccessor::value_type must be less-comparable. A pixel at the image border will never be marked as maximum. The function uses accessors. Declarations: pass arguments explicitly: \code namespace vigra { template void localMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker = NumericTraits::one(), Neighborhood neighborhood = EightNeighborCode()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void localMaxima(triple src, pair dest, DestValue marker = NumericTraits::one(), Neighborhood neighborhood = EightNeighborCode()) } \endcode Usage: \#include \<vigra/localminmax.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), maxima(w,h); // init destiniation image maxima = 0; vigra::localMaxima(srcImageRange(src), destImage(maxima)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); u < u DestValue marker; dest_accessor.set(marker, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void localMaxima) template inline void localMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker, Neighborhood neighborhood) { detail::localMinMax(sul, slr, sa, dul, da, marker, neighborhood, std::greater()); } template inline void localMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker) { localMaxima(sul, slr, sa, dul, da, marker, EightNeighborCode()); } template inline void localMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da) { localMaxima(sul, slr, sa, dul, da, NumericTraits::one(), EightNeighborCode()); } template inline void localMaxima(triple src, pair dest, DestValue marker, Neighborhood neighborhood) { localMaxima(src.first, src.second, src.third, dest.first, dest.second, marker, neighborhood); } template inline void localMaxima(triple src, pair dest, DestValue marker) { localMaxima(src.first, src.second, src.third, dest.first, dest.second, marker, EightNeighborCode()); } template inline void localMaxima(triple src, pair dest) { localMaxima(src.first, src.second, src.third, dest.first, dest.second, NumericTraits::one(), EightNeighborCode()); } namespace detail { template void extendedLocalMinMax(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker, Neighborhood /*neighborhood*/, Compare compare, Equal equal) { typedef typename SrcAccessor::value_type SrcType; int w = slr.x - sul.x; int h = slr.y - sul.y; int i,x,y; BasicImage labels(w,h); int number_of_regions = labelImage(sul, slr, sa, labels.upperLeft(), labels.accessor(), (Neighborhood::DirectionCount == 8), equal); // assume that a region is a extremum until the opposite is proved std::vector isExtremum(number_of_regions+1, (unsigned char)1); BasicImage::traverser ly = labels.upperLeft(); for(y=0; y::traverser lx(ly); for(x=0; x sc(sx); NeighborhoodCirculator::traverser, Neighborhood> lc(lx); for(i=0; i::Iterator lx(ly); for(x=0; xEqualityFunctor with tolerance, one can allow for plateaus that are not quite constant (this is often necessary with float pixel values). Pass \ref vigra::EightNeighborCode or \ref vigra::FourNeighborCode to determine the neighborhood where pixel values are compared. Minimal regions are marked in the destination image with the given marker value (default is 1), all other destination pixels remain unchanged. SrcAccessor::value_type must be equality-comparable and less-comparable. A pixel or region touching the image border will never be marked as minimum or minimal plateau. The function uses accessors. Declarations: pass arguments explicitly: \code namespace vigra { template > void extendedLocalMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker = NumericTraits::one(), Neighborhood neighborhood = EightNeighborCode(), EqualityFunctor equal = EqualityFunctor()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template > void extendedLocalMinima(triple src, pair dest, DestValue marker = NumericTraits::one(), Neighborhood neighborhood = EightNeighborCode(), EqualityFunctor equal = EqualityFunctor()) } \endcode Usage: \#include \<vigra/localminmax.hxx\>
Namespace: vigra \code // optional: define an equality functor template struct EqualWithToleranceFunctor { EqualWithToleranceFunctor(T tolerance) : t(tolerance) {} bool operator()(T l, T r) const { return vigra::abs(l-r) <= t; } T t; }; vigra::BImage src(w,h), minima(w,h); // init destiniation image minima.init(0); vigra::extendedLocalMinima(srcImageRange(src), destImage(minima)); // allow plateaus with tolerance minima.init(0); vigra::extendedLocalMinima(srcImageRange(src), destImage(minima), 1.0, EqualWithToleranceFunctor(1)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); EqualityFunctor equal; u == u equal(u, u); u < u DestValue marker; dest_accessor.set(marker, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void extendedLocalMinima) template inline void extendedLocalMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker, Neighborhood neighborhood, EqualityFunctor equal) { typedef typename SrcAccessor::value_type SrcType; detail::extendedLocalMinMax(sul, slr, sa, dul, da, marker, neighborhood, std::less(), equal); } template inline void extendedLocalMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker, Neighborhood neighborhood) { typedef typename SrcAccessor::value_type SrcType; extendedLocalMinima(sul, slr, sa, dul, da, marker, neighborhood, std::equal_to()); } template inline void extendedLocalMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker) { typedef typename SrcAccessor::value_type SrcType; extendedLocalMinima(sul, slr, sa, dul, da, marker, EightNeighborCode()); } template inline void extendedLocalMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da) { extendedLocalMinima(sul, slr, sa, dul, da, NumericTraits::one()); } template inline void extendedLocalMinima(triple src, pair dest, DestValue marker, Neighborhood neighborhood, EqualityFunctor equal) { extendedLocalMinima(src.first, src.second, src.third, dest.first, dest.second, marker, neighborhood, equal); } template inline void extendedLocalMinima(triple src, pair dest, DestValue marker, Neighborhood neighborhood) { extendedLocalMinima(src.first, src.second, src.third, dest.first, dest.second, marker, neighborhood); } template inline void extendedLocalMinima(triple src, pair dest, DestValue marker) { extendedLocalMinima(src.first, src.second, src.third, dest.first, dest.second, marker); } template inline void extendedLocalMinima(triple src, pair dest) { extendedLocalMinima(src.first, src.second, src.third, dest.first, dest.second); } /********************************************************/ /* */ /* extendedLocalMaxima */ /* */ /********************************************************/ /** \brief Find local maximal regions in an image. This function finds regions of uniform pixel value whose neighboring regions are all have smaller values (maximal plateaus of arbitrary size). By default, the pixels in a plateau have exactly identical values. By passing an EqualityFunctor with tolerance, one can allow for plateaus that are not quite constant (this is often necessary with float pixel values). Pass \ref vigra::EightNeighborCode or \ref vigra::FourNeighborCode to determine the neighborhood where pixel values are compared. Maximal regions are marked in the destination image with the given marker value (default is 1), all other destination pixels remain unchanged. SrcAccessor::value_type must be equality-comparable and less-comparable. A pixel or region touching the image border will never be marked as maximum or maximal plateau. The function uses accessors. Declarations: pass arguments explicitly: \code namespace vigra { template > void extendedLocalMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker = NumericTraits::one(), Neighborhood neighborhood = EightNeighborCode(), EqualityFunctor equal = EqualityFunctor()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template > void extendedLocalMaxima(triple src, pair dest, DestValue marker = NumericTraits::one(), Neighborhood neighborhood = EightNeighborCode(), EqualityFunctor equal = EqualityFunctor()) } \endcode Usage: \#include \<vigra/localminmax.hxx\>
Namespace: vigra \code // optional: define an equality functor template struct EqualWithToleranceFunctor { EqualWithToleranceFunctor(T tolerance) : t(tolerance) {} bool operator()(T l, T r) const { return vigra::abs(l-r) <= t; } T t; }; vigra::BImage src(w,h), maxima(w,h); // init destiniation image maxima.init(0); vigra::extendedLocalMaxima(srcImageRange(src), destImage(maxima)); // allow plateaus with tolerance maxima.init(0); vigra::extendedLocalMaxima(srcImageRange(src), destImage(maxima), 1.0, EqualWithToleranceFunctor(1)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; SrcAccessor::value_type u = src_accessor(src_upperleft); EqualityFunctor equal; u == u equal(u, u); u < u DestValue marker; dest_accessor.set(marker, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void extendedLocalMaxima) template inline void extendedLocalMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker, Neighborhood neighborhood, EqualityFunctor equal) { typedef typename SrcAccessor::value_type SrcType; detail::extendedLocalMinMax(sul, slr, sa, dul, da, marker, neighborhood, std::greater(), equal); } template inline void extendedLocalMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker, Neighborhood neighborhood) { typedef typename SrcAccessor::value_type SrcType; extendedLocalMaxima(sul, slr, sa, dul, da, marker, neighborhood, std::equal_to()); } template inline void extendedLocalMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da, DestValue marker) { typedef typename SrcAccessor::value_type SrcType; extendedLocalMaxima(sul, slr, sa, dul, da, marker, EightNeighborCode()); } template inline void extendedLocalMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa, DestIterator dul, DestAccessor da) { extendedLocalMaxima(sul, slr, sa, dul, da, NumericTraits::one()); } template inline void extendedLocalMaxima(triple src, pair dest, DestValue marker, Neighborhood neighborhood, EqualityFunctor equal) { extendedLocalMaxima(src.first, src.second, src.third, dest.first, dest.second, marker, neighborhood, equal); } template inline void extendedLocalMaxima(triple src, pair dest, DestValue marker, Neighborhood neighborhood) { extendedLocalMaxima(src.first, src.second, src.third, dest.first, dest.second, marker, neighborhood); } template inline void extendedLocalMaxima(triple src, pair dest, DestValue marker) { extendedLocalMaxima(src.first, src.second, src.third, dest.first, dest.second, marker); } template inline void extendedLocalMaxima(triple src, pair dest) { extendedLocalMaxima(src.first, src.second, src.third, dest.first, dest.second); } //@} } // namespace vigra #endif // VIGRA_LOCALMINMAX_HXX gamera-3.3.3/include/vigra/mathutil.hxx0000644000076500000000000010106011261456425017061 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2005 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MATHUTIL_HXX #define VIGRA_MATHUTIL_HXX #include #include #include "config.hxx" #include "error.hxx" #include "tuple.hxx" #include "sized_int.hxx" #include "numerictraits.hxx" /*! \page MathConstants Mathematical Constants M_PI, M_SQRT2 \#include \<vigra/mathutil.hxx\> Since M_PI and M_SQRT2 are not officially standardized, we provide definitions here for those compilers that don't support them. \code #ifndef M_PI # define M_PI 3.14159265358979323846 #endif #ifndef M_SQRT2 # define M_SQRT2 1.41421356237309504880 #endif \endcode */ #ifndef M_PI # define M_PI 3.14159265358979323846 #endif #ifndef M_SQRT2 # define M_SQRT2 1.41421356237309504880 #endif namespace vigra { /** \addtogroup MathFunctions Mathematical Functions Useful mathematical functions and functors. */ //@{ // import functions into namespace vigra which VIGRA is going to overload using VIGRA_CSTD::pow; using VIGRA_CSTD::floor; using VIGRA_CSTD::ceil; // import abs(float), abs(double), abs(long double) from // and abs(int), abs(long), abs(long long) from using std::abs; // define the missing variants of abs() to avoid 'ambigous overload' // errors in template functions #define VIGRA_DEFINE_UNSIGNED_ABS(T) \ inline T abs(T t) { return t; } VIGRA_DEFINE_UNSIGNED_ABS(bool) VIGRA_DEFINE_UNSIGNED_ABS(unsigned char) VIGRA_DEFINE_UNSIGNED_ABS(unsigned short) VIGRA_DEFINE_UNSIGNED_ABS(unsigned int) VIGRA_DEFINE_UNSIGNED_ABS(unsigned long) VIGRA_DEFINE_UNSIGNED_ABS(unsigned long long) #undef VIGRA_DEFINE_UNSIGNED_ABS #define VIGRA_DEFINE_MISSING_ABS(T) \ inline T abs(T t) { return t < 0 ? -t : t; } VIGRA_DEFINE_MISSING_ABS(signed char) VIGRA_DEFINE_MISSING_ABS(signed short) #undef VIGRA_DEFINE_MISSING_ABS /*! The rounding function. Defined for all floating point types. Rounds towards the nearest integer such that abs(round(t)) == round(abs(t)) for all t. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline float round(float t) { return t >= 0.0 ? floor(t + 0.5) : ceil(t - 0.5); } inline double round(double t) { return t >= 0.0 ? floor(t + 0.5) : ceil(t - 0.5); } inline long double round(long double t) { return t >= 0.0 ? floor(t + 0.5) : ceil(t - 0.5); } /*! Round up to the nearest power of 2. Efficient algorithm for finding the smallest power of 2 which is not smaller than \a x (function clp2() from Henry Warren: "Hacker's Delight", Addison-Wesley, 2003, see http://www.hackersdelight.org/). If \a x > 2^31, the function will return 0 because integer arithmetic is defined modulo 2^32. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline UInt32 ceilPower2(UInt32 x) { if(x == 0) return 0; x = x - 1; x = x | (x >> 1); x = x | (x >> 2); x = x | (x >> 4); x = x | (x >> 8); x = x | (x >>16); return x + 1; } /*! Round down to the nearest power of 2. Efficient algorithm for finding the largest power of 2 which is not greater than \a x (function flp2() from Henry Warren: "Hacker's Delight", Addison-Wesley, 2003, see http://www.hackersdelight.org/). \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline UInt32 floorPower2(UInt32 x) { x = x | (x >> 1); x = x | (x >> 2); x = x | (x >> 4); x = x | (x >> 8); x = x | (x >>16); return x - (x >> 1); } namespace detail { template class IntLog2 { public: static Int32 table[64]; }; template Int32 IntLog2::table[64] = { -1, 0, -1, 15, -1, 1, 28, -1, 16, -1, -1, -1, 2, 21, 29, -1, -1, -1, 19, 17, 10, -1, 12, -1, -1, 3, -1, 6, -1, 22, 30, -1, 14, -1, 27, -1, -1, -1, 20, -1, 18, 9, 11, -1, 5, -1, -1, 13, 26, -1, -1, 8, -1, 4, -1, 25, -1, 7, 24, -1, 23, -1, 31, -1}; } // namespace detail /*! Compute the base-2 logarithm of an integer. Returns the position of the left-most 1-bit in the given number \a x, or -1 if \a x == 0. That is, \code assert(k >= 0 && k < 32 && log2i(1 << k) == k); \endcode The function uses Robert Harley's algorithm to determine the number of leading zeros in \a x (algorithm nlz10() at http://www.hackersdelight.org/). But note that the functions \ref floorPower2() or \ref ceilPower2() are more efficient and should be preferred when possible. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline Int32 log2i(UInt32 x) { // Propagate leftmost 1-bit to the right. x = x | (x >> 1); x = x | (x >> 2); x = x | (x >> 4); x = x | (x >> 8); x = x | (x >>16); x = x*0x06EB14F9; // Multiplier is 7*255**3. return detail::IntLog2::table[x >> 26]; } /*! The square function. sq(x) = x*x is needed so often that it makes sense to define it as a function. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template inline typename NumericTraits::Promote sq(T t) { return t*t; } namespace detail { template class IntSquareRoot { public: static UInt32 sqq_table[]; static UInt32 exec(UInt32 v); }; template UInt32 IntSquareRoot::sqq_table[] = { 0, 16, 22, 27, 32, 35, 39, 42, 45, 48, 50, 53, 55, 57, 59, 61, 64, 65, 67, 69, 71, 73, 75, 76, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 191, 192, 192, 193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223, 224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, 255 }; template UInt32 IntSquareRoot::exec(UInt32 x) { UInt32 xn; if (x >= 0x10000) if (x >= 0x1000000) if (x >= 0x10000000) if (x >= 0x40000000) { if (x >= (UInt32)65535*(UInt32)65535) return 65535; xn = sqq_table[x>>24] << 8; } else xn = sqq_table[x>>22] << 7; else if (x >= 0x4000000) xn = sqq_table[x>>20] << 6; else xn = sqq_table[x>>18] << 5; else { if (x >= 0x100000) if (x >= 0x400000) xn = sqq_table[x>>16] << 4; else xn = sqq_table[x>>14] << 3; else if (x >= 0x40000) xn = sqq_table[x>>12] << 2; else xn = sqq_table[x>>10] << 1; goto nr1; } else if (x >= 0x100) { if (x >= 0x1000) if (x >= 0x4000) xn = (sqq_table[x>>8] >> 0) + 1; else xn = (sqq_table[x>>6] >> 1) + 1; else if (x >= 0x400) xn = (sqq_table[x>>4] >> 2) + 1; else xn = (sqq_table[x>>2] >> 3) + 1; goto adj; } else return sqq_table[x] >> 4; /* Run two iterations of the standard convergence formula */ xn = (xn + 1 + x / xn) / 2; nr1: xn = (xn + 1 + x / xn) / 2; adj: if (xn * xn > x) /* Correct rounding if necessary */ xn--; return xn; } } // namespace detail using VIGRA_CSTD::sqrt; /*! Signed integer square root. Useful for fast fixed-point computations. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline Int32 sqrti(Int32 v) { if(v < 0) throw std::domain_error("sqrti(Int32): negative argument."); return (Int32)detail::IntSquareRoot::exec((UInt32)v); } /*! Unsigned integer square root. Useful for fast fixed-point computations. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline UInt32 sqrti(UInt32 v) { return detail::IntSquareRoot::exec(v); } #ifndef VIGRA_HAS_HYPOT /*! Compute the Euclidean distance (length of the hypothenuse of a right-angled triangle). The hypot() function returns the sqrt(a*a + b*b). It is implemented in a way that minimizes round-off error. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double hypot(double a, double b) { double absa = VIGRA_CSTD::fabs(a), absb = VIGRA_CSTD::fabs(b); if (absa > absb) return absa * VIGRA_CSTD::sqrt(1.0 + sq(absb/absa)); else return absb == 0.0 ? 0.0 : absb * VIGRA_CSTD::sqrt(1.0 + sq(absa/absb)); } #else using ::hypot; #endif /*! The sign function. Returns 1, 0, or -1 depending on the sign of \a t. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template inline T sign(T t) { return t > NumericTraits::zero() ? NumericTraits::one() : t < NumericTraits::zero() ? -NumericTraits::one() : NumericTraits::zero(); } /*! The binary sign function. Transfers the sign of \a t2 to \a t1. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template inline T1 sign(T1 t1, T2 t2) { return t2 >= NumericTraits::zero() ? abs(t1) : -abs(t1); } #define VIGRA_DEFINE_NORM(T) \ inline NormTraits::SquaredNormType squaredNorm(T t) { return sq(t); } \ inline NormTraits::NormType norm(T t) { return abs(t); } VIGRA_DEFINE_NORM(bool) VIGRA_DEFINE_NORM(signed char) VIGRA_DEFINE_NORM(unsigned char) VIGRA_DEFINE_NORM(short) VIGRA_DEFINE_NORM(unsigned short) VIGRA_DEFINE_NORM(int) VIGRA_DEFINE_NORM(unsigned int) VIGRA_DEFINE_NORM(long) VIGRA_DEFINE_NORM(unsigned long) VIGRA_DEFINE_NORM(float) VIGRA_DEFINE_NORM(double) VIGRA_DEFINE_NORM(long double) #undef VIGRA_DEFINE_NORM template inline typename NormTraits >::SquaredNormType squaredNorm(std::complex const & t) { return sq(t.real()) + sq(t.imag()); } #ifdef DOXYGEN // only for documentation /*! The squared norm of a numerical object. For scalar types: equals vigra::sq(t)
. For vectorial types: equals vigra::dot(t, t)
. For complex types: equals vigra::sq(t.real()) + vigra::sq(t.imag())
. For matrix types: results in the squared Frobenius norm (sum of squares of the matrix elements). */ NormTraits::SquaredNormType squaredNorm(T const & t); #endif /*! The norm of a numerical object. For scalar types: implemented as abs(t)
otherwise: implemented as sqrt(squaredNorm(t)). \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template inline typename NormTraits::NormType norm(T const & t) { typedef typename NormTraits::SquaredNormType SNT; return sqrt(static_cast::SquareRootArgument>(squaredNorm(t))); } /*! Find the minimum element in a sequence. The function returns the iterator refering to the minimum element. Required Interface: \code Iterator is a standard forward iterator. bool f = *first < NumericTraits::value_type>::max(); \endcode \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template Iterator argMin(Iterator first, Iterator last) { typedef typename std::iterator_traits::value_type Value; Value vopt = NumericTraits::max(); Iterator best = last; for(; first != last; ++first) { if(*first < vopt) { vopt = *first; best = first; } } return best; } /*! Find the maximum element in a sequence. The function returns the iterator refering to the maximum element. Required Interface: \code Iterator is a standard forward iterator. bool f = NumericTraits::value_type>::min() < *first; \endcode \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template Iterator argMax(Iterator first, Iterator last) { typedef typename std::iterator_traits::value_type Value; Value vopt = NumericTraits::min(); Iterator best = last; for(; first != last; ++first) { if(vopt < *first) { vopt = *first; best = first; } } return best; } /*! Find the minimum element in a sequence conforming to a condition. The function returns the iterator refering to the minimum element, where only elements conforming to the condition (i.e. where condition(*iterator) evaluates to true) are considered. If no element conforms to the condition, or the sequence is empty, the end iterator \a last is returned. Required Interface: \code Iterator is a standard forward iterator. bool c = condition(*first); bool f = *first < NumericTraits::value_type>::max(); \endcode \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template Iterator argMinIf(Iterator first, Iterator last, UnaryFunctor condition) { typedef typename std::iterator_traits::value_type Value; Value vopt = NumericTraits::max(); Iterator best = last; for(; first != last; ++first) { if(condition(*first) && *first < vopt) { vopt = *first; best = first; } } return best; } /*! Find the maximum element in a sequence conforming to a condition. The function returns the iterator refering to the maximum element, where only elements conforming to the condition (i.e. where condition(*iterator) evaluates to true) are considered. If no element conforms to the condition, or the sequence is empty, the end iterator \a last is returned. Required Interface: \code Iterator is a standard forward iterator. bool c = condition(*first); bool f = NumericTraits::value_type>::min() < *first; \endcode \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template Iterator argMaxIf(Iterator first, Iterator last, UnaryFunctor condition) { typedef typename std::iterator_traits::value_type Value; Value vopt = NumericTraits::min(); Iterator best = last; for(; first != last; ++first) { if(condition(*first) && vopt < *first) { vopt = *first; best = first; } } return best; } namespace detail { template T ellipticRD(T x, T y, T z) { double f = 1.0, s = 0.0, X, Y, Z, m; for(;;) { m = (x + y + 3.0*z) / 5.0; X = 1.0 - x/m; Y = 1.0 - y/m; Z = 1.0 - z/m; if(std::max(std::max(VIGRA_CSTD::fabs(X), VIGRA_CSTD::fabs(Y)), VIGRA_CSTD::fabs(Z)) < 0.01) break; double l = VIGRA_CSTD::sqrt(x*y) + VIGRA_CSTD::sqrt(x*z) + VIGRA_CSTD::sqrt(y*z); s += f / (VIGRA_CSTD::sqrt(z)*(z + l)); f /= 4.0; x = (x + l)/4.0; y = (y + l)/4.0; z = (z + l)/4.0; } double a = X*Y; double b = sq(Z); double c = a - b; double d = a - 6.0*b; double e = d + 2.0*c; return 3.0*s + f*(1.0+d*(-3.0/14.0+d*9.0/88.0-Z*e*4.5/26.0) +Z*(e/6.0+Z*(-c*9.0/22.0+a*Z*3.0/26.0))) / VIGRA_CSTD::pow(m,1.5); } template T ellipticRF(T x, T y, T z) { double X, Y, Z, m; for(;;) { m = (x + y + z) / 3.0; X = 1.0 - x/m; Y = 1.0 - y/m; Z = 1.0 - z/m; if(std::max(std::max(VIGRA_CSTD::fabs(X), VIGRA_CSTD::fabs(Y)), VIGRA_CSTD::fabs(Z)) < 0.01) break; double l = VIGRA_CSTD::sqrt(x*y) + VIGRA_CSTD::sqrt(x*z) + VIGRA_CSTD::sqrt(y*z); x = (x + l)/4.0; y = (y + l)/4.0; z = (z + l)/4.0; } double d = X*Y - sq(Z); double p = X*Y*Z; return (1.0 - d/10.0 + p/14.0 + sq(d)/24.0 - d*p*3.0/44.0) / VIGRA_CSTD::sqrt(m); } } // namespace detail /*! The incomplete elliptic integral of the first kind. Computes \f[ \mbox{F}(x, k) = \int_0^x \frac{1}{\sqrt{1 - k^2 \sin(t)^2}} dt \f] according to the algorithm given in Press et al. "Numerical Recipes". Note: In some libraries (e.g. Mathematica), the second parameter of the elliptic integral functions must be k^2 rather than k. Check the documentation when results disagree! \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double ellipticIntegralF(double x, double k) { double c2 = sq(VIGRA_CSTD::cos(x)); double s = VIGRA_CSTD::sin(x); return s*detail::ellipticRF(c2, 1.0 - sq(k*s), 1.0); } /*! The incomplete elliptic integral of the second kind. Computes \f[ \mbox{E}(x, k) = \int_0^x \sqrt{1 - k^2 \sin(t)^2} dt \f] according to the algorithm given in Press et al. "Numerical Recipes". The complete elliptic integral of the second kind is simply ellipticIntegralE(M_PI/2, k). Note: In some libraries (e.g. Mathematica), the second parameter of the elliptic integral functions must be k^2 rather than k. Check the documentation when results disagree! \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double ellipticIntegralE(double x, double k) { double c2 = sq(VIGRA_CSTD::cos(x)); double s = VIGRA_CSTD::sin(x); k = sq(k*s); return s*(detail::ellipticRF(c2, 1.0-k, 1.0) - k/3.0*detail::ellipticRD(c2, 1.0-k, 1.0)); } #ifndef VIGRA_HAS_ERF namespace detail { template double erfImpl(T x) { double t = 1.0/(1.0+0.5*VIGRA_CSTD::fabs(x)); double ans = t*VIGRA_CSTD::exp(-x*x-1.26551223+t*(1.00002368+t*(0.37409196+ t*(0.09678418+t*(-0.18628806+t*(0.27886807+ t*(-1.13520398+t*(1.48851587+t*(-0.82215223+ t*0.17087277))))))))); if (x >= 0.0) return 1.0 - ans; else return ans - 1.0; } } // namespace detail /*! The error function. If erf() is not provided in the C standard math library (as it should according to the new C99 standard ?), VIGRA implements erf() as an approximation of the error function \f[ \mbox{erf}(x) = \int_0^x e^{-t^2} dt \f] according to the formula given in Press et al. "Numerical Recipes". \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double erf(double x) { return detail::erfImpl(x); } #else using VIGRA_CSTD::erf; #endif namespace detail { template double noncentralChi2CDFApprox(unsigned int degreesOfFreedom, T noncentrality, T arg) { double a = degreesOfFreedom + noncentrality; double b = (a + noncentrality) / sq(a); double t = (VIGRA_CSTD::pow((double)arg / a, 1.0/3.0) - (1.0 - 2.0 / 9.0 * b)) / VIGRA_CSTD::sqrt(2.0 / 9.0 * b); return 0.5*(1.0 + erf(t/VIGRA_CSTD::sqrt(2.0))); } template void noncentralChi2OneIteration(T arg, T & lans, T & dans, T & pans, unsigned int & j) { double tol = -50.0; if(lans < tol) { lans = lans + VIGRA_CSTD::log(arg / j); dans = VIGRA_CSTD::exp(lans); } else { dans = dans * arg / j; } pans = pans - dans; j += 2; } template std::pair noncentralChi2CDF(unsigned int degreesOfFreedom, T noncentrality, T arg, T eps) { vigra_precondition(noncentrality >= 0.0 && arg >= 0.0 && eps > 0.0, "noncentralChi2P(): parameters must be positive."); if (arg == 0.0 && degreesOfFreedom > 0) return std::make_pair(0.0, 0.0); // Determine initial values double b1 = 0.5 * noncentrality, ao = VIGRA_CSTD::exp(-b1), eps2 = eps / ao, lnrtpi2 = 0.22579135264473, probability, density, lans, dans, pans, sum, am, hold; unsigned int maxit = 500, i, m; if(degreesOfFreedom % 2) { i = 1; lans = -0.5 * (arg + VIGRA_CSTD::log(arg)) - lnrtpi2; dans = VIGRA_CSTD::exp(lans); pans = erf(VIGRA_CSTD::sqrt(arg/2.0)); } else { i = 2; lans = -0.5 * arg; dans = VIGRA_CSTD::exp(lans); pans = 1.0 - dans; } // Evaluate first term if(degreesOfFreedom == 0) { m = 1; degreesOfFreedom = 2; am = b1; sum = 1.0 / ao - 1.0 - am; density = am * dans; probability = 1.0 + am * pans; } else { m = 0; degreesOfFreedom = degreesOfFreedom - 1; am = 1.0; sum = 1.0 / ao - 1.0; while(i < degreesOfFreedom) detail::noncentralChi2OneIteration(arg, lans, dans, pans, i); degreesOfFreedom = degreesOfFreedom + 1; density = dans; probability = pans; } // Evaluate successive terms of the expansion for(++m; mnoncentralChi2(degreesOfFreedom, 0.0, arg, accuracy). \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double chi2(unsigned int degreesOfFreedom, double arg, double accuracy = 1e-7) { return detail::noncentralChi2CDF(degreesOfFreedom, 0.0, arg, accuracy).first; } /*! Cumulative chi square distribution. Computes the cumulative density of a chi square distribution with \a degreesOfFreedom and tolerance \a accuracy at the given argument \a arg, i.e. the probability that a random number drawn from the distribution is below \a arg by calling noncentralChi2CDF(degreesOfFreedom, 0.0, arg, accuracy). \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double chi2CDF(unsigned int degreesOfFreedom, double arg, double accuracy = 1e-7) { return detail::noncentralChi2CDF(degreesOfFreedom, 0.0, arg, accuracy).second; } /*! Non-central chi square distribution. Computes the density of a non-central chi square distribution with \a degreesOfFreedom, noncentrality parameter \a noncentrality and tolerance \a accuracy at the given argument \a arg. It uses Algorithm AS 231 from Appl. Statist. (1987) Vol.36, No.3 (code ported from http://lib.stat.cmu.edu/apstat/231). The algorithm has linear complexity in the number of degrees of freedom. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double noncentralChi2(unsigned int degreesOfFreedom, double noncentrality, double arg, double accuracy = 1e-7) { return detail::noncentralChi2CDF(degreesOfFreedom, noncentrality, arg, accuracy).first; } /*! Cumulative non-central chi square distribution. Computes the cumulative density of a chi square distribution with \a degreesOfFreedom, noncentrality parameter \a noncentrality and tolerance \a accuracy at the given argument \a arg, i.e. the probability that a random number drawn from the distribution is below \a arg It uses Algorithm AS 231 from Appl. Statist. (1987) Vol.36, No.3 (code ported from http://lib.stat.cmu.edu/apstat/231). The algorithm has linear complexity in the number of degrees of freedom (see noncentralChi2CDFApprox() for a constant-time algorithm). \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double noncentralChi2CDF(unsigned int degreesOfFreedom, double noncentrality, double arg, double accuracy = 1e-7) { return detail::noncentralChi2CDF(degreesOfFreedom, noncentrality, arg, accuracy).second; } /*! Cumulative non-central chi square distribution (approximate). Computes approximate values of the cumulative density of a chi square distribution with \a degreesOfFreedom, and noncentrality parameter \a noncentrality at the given argument \a arg, i.e. the probability that a random number drawn from the distribution is below \a arg It uses the approximate transform into a normal distribution due to Wilson and Hilferty (see Abramovitz, Stegun: "Handbook of Mathematical Functions", formula 26.3.32). The algorithm's running time is independent of the inputs, i.e. is should be used when noncentralChi2CDF() is too slow, and approximate values are sufficient. The accuracy is only about 0.1 for few degrees of freedom, but reaches about 0.001 above dof = 5. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ inline double noncentralChi2CDFApprox(unsigned int degreesOfFreedom, double noncentrality, double arg) { return detail::noncentralChi2CDFApprox(degreesOfFreedom, noncentrality, arg); } namespace detail { // both f1 and f2 are unsigned here template inline FPT safeFloatDivision( FPT f1, FPT f2 ) { return f2 < NumericTraits::one() && f1 > f2 * NumericTraits::max() ? NumericTraits::max() : (f2 > NumericTraits::one() && f1 < f2 * NumericTraits::smallestPositive()) || f1 == NumericTraits::zero() ? NumericTraits::zero() : f1/f2; } } // namespace detail /*! Tolerance based floating-point comparison. Check whether two floating point numbers are equal within the given tolerance. This is useful because floating point numbers that should be equal in theory are rarely exactly equal in practice. If the tolerance \a epsilon is not given, twice the machine epsilon is used. \#include \<vigra/mathutil.hxx\>
Namespace: vigra */ template bool closeAtTolerance(T1 l, T2 r, typename PromoteTraits::Promote epsilon) { typedef typename PromoteTraits::Promote T; if(l == 0.0) return VIGRA_CSTD::fabs(r) <= epsilon; if(r == 0.0) return VIGRA_CSTD::fabs(l) <= epsilon; T diff = VIGRA_CSTD::fabs( l - r ); T d1 = detail::safeFloatDivision( diff, VIGRA_CSTD::fabs( r ) ); T d2 = detail::safeFloatDivision( diff, VIGRA_CSTD::fabs( l ) ); return (d1 <= epsilon && d2 <= epsilon); } template inline bool closeAtTolerance(T1 l, T2 r) { typedef typename PromoteTraits::Promote T; return closeAtTolerance(l, r, 2.0 * NumericTraits::epsilon()); } //@} } // namespace vigra #endif /* VIGRA_MATHUTIL_HXX */ gamera-3.3.3/include/vigra/matrix.hxx0000644000076500000000000031323211261456425016544 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2003-2008 by Gunnar Kedenburg and Ullrich Koethe */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MATRIX_HXX #define VIGRA_MATRIX_HXX #include #include #include #include "multi_array.hxx" #include "mathutil.hxx" #include "numerictraits.hxx" namespace vigra { /** \defgroup LinearAlgebraModule Linear Algebra \brief Classes and functions for matrix algebra, linear equations systems, eigen systems, least squares etc. */ /** \ingroup LinearAlgebraModule Namespace vigra/linalg hold VIGRA's linear algebra functionality. But most of its contents is exported into namespace vigra via using directives. */ namespace linalg { template inline MultiArrayIndex rowCount(const MultiArrayView<2, T, C> &x); template inline MultiArrayIndex columnCount(const MultiArrayView<2, T, C> &x); template inline MultiArrayView <2, T, C> rowVector(MultiArrayView <2, T, C> const & m, MultiArrayIndex d); template inline MultiArrayView <2, T, C> columnVector(MultiArrayView<2, T, C> const & m, MultiArrayIndex d); template class TemporaryMatrix; template void transpose(const MultiArrayView<2, T, C1> &v, MultiArrayView<2, T, C2> &r); template bool isSymmetric(const MultiArrayView<2, T, C> &v); enum RawArrayMemoryLayout { RowMajor, ColumnMajor }; /********************************************************/ /* */ /* Matrix */ /* */ /********************************************************/ /** Matrix class. \ingroup LinearAlgebraModule This is the basic class for all linear algebra computations. Matrices are strored in a column-major format, i.e. the row index is varying fastest. This is the same format as in the lapack and gmm++ libraries, so it will be easy to interface these libraries. In fact, if you need optimized high performance code, you should use them. The VIGRA linear algebra functionality is provided for smaller problems and rapid prototyping (no one wants to spend half the day installing a new library just to discover that the new algorithm idea didn't work anyway). See also:
  • \ref LinearAlgebraFunctions
\#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template > class Matrix : public MultiArray<2, T, ALLOC> { typedef MultiArray<2, T, ALLOC> BaseType; public: typedef Matrix matrix_type; typedef TemporaryMatrix temp_type; typedef MultiArrayView<2, T, UnstridedArrayTag> view_type; typedef typename BaseType::value_type value_type; typedef typename BaseType::pointer pointer; typedef typename BaseType::const_pointer const_pointer; typedef typename BaseType::reference reference; typedef typename BaseType::const_reference const_reference; typedef typename BaseType::difference_type difference_type; typedef typename BaseType::difference_type_1 difference_type_1; typedef ALLOC allocator_type; /** default constructor */ Matrix() {} /** construct with given allocator */ explicit Matrix(ALLOC const & alloc) : BaseType(alloc) {} /** construct with given shape and init all elements with zero. Note that the order of the axes is difference_type(rows, columns) which is the opposite of the usual VIGRA convention. */ explicit Matrix(const difference_type &shape, ALLOC const & alloc = allocator_type()) : BaseType(shape, alloc) {} /** construct with given shape and init all elements with zero. Note that the order of the axes is (rows, columns) which is the opposite of the usual VIGRA convention. */ Matrix(difference_type_1 rows, difference_type_1 columns, ALLOC const & alloc = allocator_type()) : BaseType(difference_type(rows, columns), alloc) {} /** construct with given shape and init all elements with the constant \a init. Note that the order of the axes is difference_type(rows, columns) which is the opposite of the usual VIGRA convention. */ Matrix(const difference_type &shape, const_reference init, allocator_type const & alloc = allocator_type()) : BaseType(shape, init, alloc) {} /** construct with given shape and init all elements with the constant \a init. Note that the order of the axes is (rows, columns) which is the opposite of the usual VIGRA convention. */ Matrix(difference_type_1 rows, difference_type_1 columns, const_reference init, allocator_type const & alloc = allocator_type()) : BaseType(difference_type(rows, columns), init, alloc) {} /** construct with given shape and copy data from C-style array \a init. Unless \a layout is ColumnMajor, the elements in this array are assumed to be given in row-major order (the C standard order) and will automatically be converted to the required column-major format. Note that the order of the axes is difference_type(rows, columns) which is the opposite of the usual VIGRA convention. */ Matrix(const difference_type &shape, const_pointer init, RawArrayMemoryLayout layout = RowMajor, allocator_type const & alloc = allocator_type()) : BaseType(shape, alloc) // FIXME: this function initializes the memory twice { if(layout == RowMajor) { difference_type trans(shape[1], shape[0]); linalg::transpose(MultiArrayView<2, T>(trans, const_cast(init)), *this); } else { std::copy(init, init + elementCount(), this->data()); } } /** construct with given shape and copy data from C-style array \a init. Unless \a layout is ColumnMajor, the elements in this array are assumed to be given in row-major order (the C standard order) and will automatically be converted to the required column-major format. Note that the order of the axes is (rows, columns) which is the opposite of the usual VIGRA convention. */ Matrix(difference_type_1 rows, difference_type_1 columns, const_pointer init, RawArrayMemoryLayout layout = RowMajor, allocator_type const & alloc = allocator_type()) : BaseType(difference_type(rows, columns), alloc) // FIXME: this function initializes the memory twice { if(layout == RowMajor) { difference_type trans(columns, rows); linalg::transpose(MultiArrayView<2, T>(trans, const_cast(init)), *this); } else { std::copy(init, init + elementCount(), this->data()); } } /** copy constructor. Allocates new memory and copies tha data. */ Matrix(const Matrix &rhs) : BaseType(rhs) {} /** construct from temporary matrix, which looses its data. This operation is equivalent to \code TemporaryMatrix temp = ...; Matrix m; m.swap(temp); \endcode */ Matrix(const TemporaryMatrix &rhs) : BaseType(rhs.allocator()) { this->swap(const_cast &>(rhs)); } /** construct from a MultiArrayView. Allocates new memory and copies tha data. \a rhs is assumed to be in column-major order already. */ template Matrix(const MultiArrayView<2, U, C> &rhs) : BaseType(rhs) {} /** assignment. If the size of \a rhs is the same as the matrix's old size, only the data are copied. Otherwise, new storage is allocated, which invalidates all objects (array views, iterators) depending on the matrix. */ Matrix & operator=(const Matrix &rhs) { BaseType::operator=(rhs); // has the correct semantics already return *this; } /** assign a temporary matrix. If the shapes of the two matrices match, only the data are copied (in order to not invalidate views and iterators depending on this matrix). Otherwise, the memory is swapped between the two matrices, so that all depending objects (array views, iterators) ar invalidated. */ Matrix & operator=(const TemporaryMatrix &rhs) { if(this->shape() == rhs.shape()) this->copy(rhs); else this->swap(const_cast &>(rhs)); return *this; } /** assignment from arbitrary 2-dimensional MultiArrayView.
If the size of \a rhs is the same as the matrix's old size, only the data are copied. Otherwise, new storage is allocated, which invalidates all objects (array views, iterators) depending on the matrix. \a rhs is assumed to be in column-major order already. */ template Matrix & operator=(const MultiArrayView<2, U, C> &rhs) { BaseType::operator=(rhs); // has the correct semantics already return *this; } /** init elements with a constant */ template Matrix & init(const U & init) { BaseType::init(init); return *this; } /** reshape to the given shape and initialize with zero. */ void reshape(difference_type_1 rows, difference_type_1 columns) { BaseType::reshape(difference_type(rows, columns)); } /** reshape to the given shape and initialize with \a init. */ void reshape(difference_type_1 rows, difference_type_1 columns, const_reference init) { BaseType::reshape(difference_type(rows, columns), init); } /** reshape to the given shape and initialize with zero. */ void reshape(difference_type const & shape) { BaseType::reshape(shape); } /** reshape to the given shape and initialize with \a init. */ void reshape(difference_type const & shape, const_reference init) { BaseType::reshape(shape, init); } /** Create a matrix view that represents the row vector of row \a d. */ view_type rowVector(difference_type_1 d) const { return vigra::linalg::rowVector(*this, d); } /** Create a matrix view that represents the column vector of column \a d. */ view_type columnVector(difference_type_1 d) const { return vigra::linalg::columnVector(*this, d); } /** number of rows (height) of the matrix. */ difference_type_1 rowCount() const { return this->m_shape[0]; } /** number of columns (width) of the matrix. */ difference_type_1 columnCount() const { return this->m_shape[1]; } /** number of elements (width*height) of the matrix. */ difference_type_1 elementCount() const { return rowCount()*columnCount(); } /** check whether the matrix is symmetric. */ bool isSymmetric() const { return vigra::linalg::isSymmetric(*this); } #ifdef DOXYGEN // repeat the following functions for documentation. In real code, they are inherited. /** read/write access to matrix element (row, column). Note that the order of the argument is the opposite of the usual VIGRA convention due to column-major matrix order. */ value_type & operator()(difference_type_1 row, difference_type_1 column); /** read access to matrix element (row, column). Note that the order of the argument is the opposite of the usual VIGRA convention due to column-major matrix order. */ value_type operator()(difference_type_1 row, difference_type_1 column) const; /** squared Frobenius norm. Sum of squares of the matrix elements. */ typename NormTraits::SquaredNormType squaredNorm() const; /** Frobenius norm. Root of sum of squares of the matrix elements. */ typename NormTraits::NormType norm() const; /** create a transposed view of this matrix. No data are copied. If you want to transpose this matrix permanently, you have to assign the transposed view: \code a = a.transpose(); \endcode */ MultiArrayView<2, vluae_type, StridedArrayTag> transpose() const; #endif /** add \a other to this (sizes must match). */ template Matrix & operator+=(MultiArrayView<2, U, C> const & other) { BaseType::operator+=(other); return *this; } /** subtract \a other from this (sizes must match). */ template Matrix & operator-=(MultiArrayView<2, U, C> const & other) { BaseType::operator-=(other); return *this; } /** multiply \a other element-wise with this matrix (sizes must match). */ template Matrix & operator*=(MultiArrayView<2, U, C> const & other) { BaseType::operator*=(other); return *this; } /** divide this matrix element-wise by \a other (sizes must match). */ template Matrix & operator/=(MultiArrayView<2, U, C> const & other) { BaseType::operator/=(other); return *this; } /** add \a other to each element of this matrix */ Matrix & operator+=(T other) { BaseType::operator+=(other); return *this; } /** subtraxt \a other from each element of this matrix */ Matrix & operator-=(T other) { BaseType::operator-=(other); return *this; } /** scalar multiply this with \a other */ Matrix & operator*=(T other) { BaseType::operator*=(other); return *this; } /** scalar devide this by \a other */ Matrix & operator/=(T other) { BaseType::operator/=(other); return *this; } }; // TemporaryMatrix is provided as an optimization: Functions returning a matrix can // use TemporaryMatrix to make explicit that it was allocated as a temporary data structure. // Functions receiving a TemporaryMatrix can thus often avoid to allocate new temporary // memory. template > class TemporaryMatrix : public Matrix { typedef Matrix BaseType; public: typedef Matrix matrix_type; typedef TemporaryMatrix temp_type; typedef MultiArrayView<2, T, UnstridedArrayTag> view_type; typedef typename BaseType::value_type value_type; typedef typename BaseType::pointer pointer; typedef typename BaseType::const_pointer const_pointer; typedef typename BaseType::reference reference; typedef typename BaseType::const_reference const_reference; typedef typename BaseType::difference_type difference_type; typedef typename BaseType::difference_type_1 difference_type_1; typedef ALLOC allocator_type; TemporaryMatrix(difference_type const & shape) : BaseType(shape, ALLOC()) {} TemporaryMatrix(difference_type const & shape, const_reference init) : BaseType(shape, init, ALLOC()) {} TemporaryMatrix(difference_type_1 rows, difference_type_1 columns) : BaseType(rows, columns, ALLOC()) {} TemporaryMatrix(difference_type_1 rows, difference_type_1 columns, const_reference init) : BaseType(rows, columns, init, ALLOC()) {} template TemporaryMatrix(const MultiArrayView<2, U, C> &rhs) : BaseType(rhs) {} TemporaryMatrix(const TemporaryMatrix &rhs) : BaseType() { this->swap(const_cast(rhs)); } template TemporaryMatrix & init(const U & init) { BaseType::init(init); return *this; } template TemporaryMatrix & operator+=(MultiArrayView<2, U, C> const & other) { BaseType::operator+=(other); return *this; } template TemporaryMatrix & operator-=(MultiArrayView<2, U, C> const & other) { BaseType::operator-=(other); return *this; } template TemporaryMatrix & operator*=(MultiArrayView<2, U, C> const & other) { BaseType::operator*=(other); return *this; } template TemporaryMatrix & operator/=(MultiArrayView<2, U, C> const & other) { BaseType::operator/=(other); return *this; } TemporaryMatrix & operator+=(T other) { BaseType::operator+=(other); return *this; } TemporaryMatrix & operator-=(T other) { BaseType::operator-=(other); return *this; } TemporaryMatrix & operator*=(T other) { BaseType::operator*=(other); return *this; } TemporaryMatrix & operator/=(T other) { BaseType::operator/=(other); return *this; } private: TemporaryMatrix &operator=(const TemporaryMatrix &rhs); // intentionally not implemented }; /** \defgroup LinearAlgebraFunctions Matrix Functions \brief Basic matrix algebra, element-wise mathematical functions, row and columns statistics, data normalization etc. \ingroup LinearAlgebraModule */ //@{ /** Number of rows of a matrix represented as a MultiArrayView<2, ...> \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template inline MultiArrayIndex rowCount(const MultiArrayView<2, T, C> &x) { return x.shape(0); } /** Number of columns of a matrix represented as a MultiArrayView<2, ...> \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template inline MultiArrayIndex columnCount(const MultiArrayView<2, T, C> &x) { return x.shape(1); } /** Create a row vector view for row \a d of the matrix \a m \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template inline MultiArrayView <2, T, C> rowVector(MultiArrayView <2, T, C> const & m, MultiArrayIndex d) { typedef typename MultiArrayView <2, T, C>::difference_type Shape; return m.subarray(Shape(d, 0), Shape(d+1, columnCount(m))); } /** Create a row vector view of the matrix \a m starting at element \a first and ranging to column \a end (non-inclusive). \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template inline MultiArrayView <2, T, C> rowVector(MultiArrayView <2, T, C> const & m, MultiArrayShape<2>::type first, MultiArrayIndex end) { typedef typename MultiArrayView <2, T, C>::difference_type Shape; return m.subarray(first, Shape(first[0]+1, end)); } /** Create a column vector view for column \a d of the matrix \a m \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template inline MultiArrayView <2, T, C> columnVector(MultiArrayView<2, T, C> const & m, MultiArrayIndex d) { typedef typename MultiArrayView <2, T, C>::difference_type Shape; return m.subarray(Shape(0, d), Shape(rowCount(m), d+1)); } /** Create a column vector view of the matrix \a m starting at element \a first and ranging to row \a end (non-inclusive). \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg **/ template inline MultiArrayView <2, T, C> columnVector(MultiArrayView<2, T, C> const & m, MultiArrayShape<2>::type first, int end) { typedef typename MultiArrayView <2, T, C>::difference_type Shape; return m.subarray(first, Shape(end, first[1]+1)); } /** Check whether matrix \a m is symmetric. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool isSymmetric(MultiArrayView<2, T, C> const & m) { const MultiArrayIndex size = rowCount(m); if(size != columnCount(m)) return false; for(MultiArrayIndex i = 0; i < size; ++i) for(MultiArrayIndex j = i+1; j < size; ++j) if(m(j, i) != m(i, j)) return false; return true; } #ifdef DOXYGEN // documentation only -- function is already defined in vigra/multi_array.hxx /** calculate the squared Frobenius norm of a matrix. Equal to the sum of squares of the matrix elements. \#include \<vigra/matrix.hxx\> Namespace: vigra */ template typename Matrix::SquaredNormType squaredNorm(const Matrix &a); /** calculate the Frobenius norm of a matrix. Equal to the root of the sum of squares of the matrix elements. \#include \<vigra/matrix.hxx\> Namespace: vigra */ template typename Matrix::NormType norm(const Matrix &a); #endif // DOXYGEN /** initialize the given square matrix as an identity matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template void identityMatrix(MultiArrayView<2, T, C> &r) { const MultiArrayIndex rows = rowCount(r); vigra_precondition(rows == columnCount(r), "identityMatrix(): Matrix must be square."); for(MultiArrayIndex i = 0; i < rows; ++i) { for(MultiArrayIndex j = 0; j < rows; ++j) r(j, i) = NumericTraits::zero(); r(i, i) = NumericTraits::one(); } } /** create n identity matrix of the given size. Usage: \code vigra::Matrix m = vigra::identityMatrix(size); \endcode \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template TemporaryMatrix identityMatrix(MultiArrayIndex size) { TemporaryMatrix ret(size, size, NumericTraits::zero()); for(MultiArrayIndex i = 0; i < size; ++i) ret(i, i) = NumericTraits::one(); return ret; } template void diagonalMatrixImpl(MultiArrayView<1, T, C1> const & v, MultiArrayView<2, T, C2> &r) { const MultiArrayIndex size = v.elementCount(); vigra_precondition(rowCount(r) == size && columnCount(r) == size, "diagonalMatrix(): result must be a square matrix."); for(MultiArrayIndex i = 0; i < size; ++i) r(i, i) = v(i); } /** make a diagonal matrix from a vector. The vector is given as matrix \a v, which must either have a single row or column. The result is witten into the square matrix \a r. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template void diagonalMatrix(MultiArrayView<2, T, C1> const & v, MultiArrayView<2, T, C2> &r) { vigra_precondition(rowCount(v) == 1 || columnCount(v) == 1, "diagonalMatrix(): input must be a vector."); r.init(NumericTraits::zero()); if(rowCount(v) == 1) diagonalMatrixImpl(v.bindInner(0), r); else diagonalMatrixImpl(v.bindOuter(0), r); } /** create a diagonal matrix from a vector. The vector is given as matrix \a v, which must either have a single row or column. The result is returned as a temporary matrix. Usage: \code vigra::Matrix v(1, len); v = ...; vigra::Matrix m = diagonalMatrix(v); \endcode \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template TemporaryMatrix diagonalMatrix(MultiArrayView<2, T, C> const & v) { vigra_precondition(rowCount(v) == 1 || columnCount(v) == 1, "diagonalMatrix(): input must be a vector."); MultiArrayIndex size = v.elementCount(); TemporaryMatrix ret(size, size, NumericTraits::zero()); if(rowCount(v) == 1) diagonalMatrixImpl(v.bindInner(0), ret); else diagonalMatrixImpl(v.bindOuter(0), ret); return ret; } /** transpose matrix \a v. The result is written into \a r which must have the correct (i.e. transposed) shape. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template void transpose(const MultiArrayView<2, T, C1> &v, MultiArrayView<2, T, C2> &r) { const MultiArrayIndex rows = rowCount(r); const MultiArrayIndex cols = columnCount(r); vigra_precondition(rows == columnCount(v) && cols == rowCount(v), "transpose(): arrays must have transposed shapes."); for(MultiArrayIndex i = 0; i < cols; ++i) for(MultiArrayIndex j = 0; j < rows; ++j) r(j, i) = v(i, j); } /** create the transpose of matrix \a v. This does not copy any data, but only creates a transposed view to the original matrix. A copy is only made when the transposed view is assigned to another matrix. Usage: \code vigra::Matrix v(rows, cols); v = ...; vigra::Matrix m = transpose(v); \endcode \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template inline MultiArrayView<2, T, StridedArrayTag> transpose(MultiArrayView<2, T, C> const & v) { return v.transpose(); } /** Create new matrix by concatenating two matrices \a a and \a b vertically, i.e. on top of each other. The two matrices must have the same number of columns. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix joinVertically(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b) { typedef typename TemporaryMatrix::difference_type Shape; MultiArrayIndex n = columnCount(a); vigra_precondition(n == columnCount(b), "joinVertically(): shape mismatch."); MultiArrayIndex ma = rowCount(a); MultiArrayIndex mb = rowCount(b); TemporaryMatrix t(ma + mb, n, T()); t.subarray(Shape(0,0), Shape(ma, n)) = a; t.subarray(Shape(ma,0), Shape(ma+mb, n)) = b; return t; } /** Create new matrix by concatenating two matrices \a a and \a b horizontally, i.e. side by side. The two matrices must have the same number of rows. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix joinHorizontally(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b) { typedef typename TemporaryMatrix::difference_type Shape; MultiArrayIndex m = rowCount(a); vigra_precondition(m == rowCount(b), "joinHorizontally(): shape mismatch."); MultiArrayIndex na = columnCount(a); MultiArrayIndex nb = columnCount(b); TemporaryMatrix t(m, na + nb, T()); t.subarray(Shape(0,0), Shape(m, na)) = a; t.subarray(Shape(0, na), Shape(m, na + nb)) = b; return t; } /** Initialize a matrix with repeated copies of a given matrix. Matrix \a r will consist of \a verticalCount downward repetitions of \a v, and \a horizontalCount side-by-side repetitions. When \a v has size m by n, \a r must have size (m*verticalCount) by (n*horizontalCount). \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void repeatMatrix(MultiArrayView<2, T, C1> const & v, MultiArrayView<2, T, C2> &r, unsigned int verticalCount, unsigned int horizontalCount) { typedef typename Matrix::difference_type Shape; MultiArrayIndex m = rowCount(v), n = columnCount(v); vigra_precondition(m*verticalCount == rowCount(r) && n*horizontalCount == columnCount(r), "repeatMatrix(): Shape mismatch."); for(MultiArrayIndex l=0; l<(MultiArrayIndex)horizontalCount; ++l) { for(MultiArrayIndex k=0; k<(MultiArrayIndex)verticalCount; ++k) { r.subarray(Shape(k*m, l*n), Shape((k+1)*m, (l+1)*n)) = v; } } } /** Create a new matrix by repeating a given matrix. The resulting matrix \a r will consist of \a verticalCount downward repetitions of \a v, and \a horizontalCount side-by-side repetitions, i.e. it will be of size (m*verticalCount) by (n*horizontalCount) when \a v has size m by n. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template TemporaryMatrix repeatMatrix(MultiArrayView<2, T, C> const & v, unsigned int verticalCount, unsigned int horizontalCount) { MultiArrayIndex m = rowCount(v), n = columnCount(v); TemporaryMatrix ret(verticalCount*m, horizontalCount*n); repeatMatrix(v, ret, verticalCount, horizontalCount); return ret; } /** add matrices \a a and \a b. The result is written into \a r. All three matrices must have the same shape. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void add(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> &r) { const MultiArrayIndex rrows = rowCount(r); const MultiArrayIndex rcols = columnCount(r); vigra_precondition(rrows == rowCount(a) && rcols == columnCount(a) && rrows == rowCount(b) && rcols == columnCount(b), "add(): Matrix shapes must agree."); for(MultiArrayIndex i = 0; i < rcols; ++i) { for(MultiArrayIndex j = 0; j < rrows; ++j) { r(j, i) = a(j, i) + b(j, i); } } } /** add matrices \a a and \a b. The two matrices must have the same shape. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator+(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b) { return TemporaryMatrix(a) += b; } template inline TemporaryMatrix operator+(const TemporaryMatrix &a, const MultiArrayView<2, T, C> &b) { return const_cast &>(a) += b; } template inline TemporaryMatrix operator+(const MultiArrayView<2, T, C> &a, const TemporaryMatrix &b) { return const_cast &>(b) += a; } template inline TemporaryMatrix operator+(const TemporaryMatrix &a, const TemporaryMatrix &b) { return const_cast &>(a) += b; } /** add scalar \a b to every element of the matrix \a a. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator+(const MultiArrayView<2, T, C> &a, T b) { return TemporaryMatrix(a) += b; } template inline TemporaryMatrix operator+(const TemporaryMatrix &a, T b) { return const_cast &>(a) += b; } /** add scalar \a a to every element of the matrix \a b. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator+(T a, const MultiArrayView<2, T, C> &b) { return TemporaryMatrix(b) += a; } template inline TemporaryMatrix operator+(T a, const TemporaryMatrix &b) { return const_cast &>(b) += a; } /** subtract matrix \a b from \a a. The result is written into \a r. All three matrices must have the same shape. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void sub(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> &r) { const MultiArrayIndex rrows = rowCount(r); const MultiArrayIndex rcols = columnCount(r); vigra_precondition(rrows == rowCount(a) && rcols == columnCount(a) && rrows == rowCount(b) && rcols == columnCount(b), "subtract(): Matrix shapes must agree."); for(MultiArrayIndex i = 0; i < rcols; ++i) { for(MultiArrayIndex j = 0; j < rrows; ++j) { r(j, i) = a(j, i) - b(j, i); } } } /** subtract matrix \a b from \a a. The two matrices must have the same shape. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator-(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b) { return TemporaryMatrix(a) -= b; } template inline TemporaryMatrix operator-(const TemporaryMatrix &a, const MultiArrayView<2, T, C> &b) { return const_cast &>(a) -= b; } template TemporaryMatrix operator-(const MultiArrayView<2, T, C> &a, const TemporaryMatrix &b) { const MultiArrayIndex rows = rowCount(a); const MultiArrayIndex cols = columnCount(a); vigra_precondition(rows == b.rowCount() && cols == b.columnCount(), "Matrix::operator-(): Shape mismatch."); for(MultiArrayIndex i = 0; i < cols; ++i) for(MultiArrayIndex j = 0; j < rows; ++j) const_cast &>(b)(j, i) = a(j, i) - b(j, i); return b; } template inline TemporaryMatrix operator-(const TemporaryMatrix &a, const TemporaryMatrix &b) { return const_cast &>(a) -= b; } /** negate matrix \a a. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator-(const MultiArrayView<2, T, C> &a) { return TemporaryMatrix(a) *= -NumericTraits::one(); } template inline TemporaryMatrix operator-(const TemporaryMatrix &a) { return const_cast &>(a) *= -NumericTraits::one(); } /** subtract scalar \a b from every element of the matrix \a a. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator-(const MultiArrayView<2, T, C> &a, T b) { return TemporaryMatrix(a) -= b; } template inline TemporaryMatrix operator-(const TemporaryMatrix &a, T b) { return const_cast &>(a) -= b; } /** subtract every element of the matrix \a b from scalar \a a. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator-(T a, const MultiArrayView<2, T, C> &b) { return TemporaryMatrix(b.shape(), a) -= b; } /** calculate the inner product of two matrices representing vectors. Typically, matrix \a x has a single row, and matrix \a y has a single column, and the other dimensions match. In addition, this function handles the cases when either or both of the two inputs are transposed (e.g. it can compute the dot product of two column vectors). A PreconditionViolation exception is thrown when the shape conditions are violated. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template typename NormTraits::SquaredNormType dot(const MultiArrayView<2, T, C1> &x, const MultiArrayView<2, T, C2> &y) { typename NormTraits::SquaredNormType ret = NumericTraits::SquaredNormType>::zero(); if(y.shape(1) == 1) { std::ptrdiff_t size = y.shape(0); if(x.shape(0) == 1 && x.shape(1) == size) // proper scalar product for(std::ptrdiff_t i = 0; i < size; ++i) ret += x(0, i) * y(i, 0); else if(x.shape(1) == 1u && x.shape(0) == size) // two column vectors for(std::ptrdiff_t i = 0; i < size; ++i) ret += x(i, 0) * y(i, 0); else vigra_precondition(false, "dot(): wrong matrix shapes."); } else if(y.shape(0) == 1) { std::ptrdiff_t size = y.shape(1); if(x.shape(0) == 1u && x.shape(1) == size) // two row vectors for(std::ptrdiff_t i = 0; i < size; ++i) ret += x(0, i) * y(0, i); else if(x.shape(1) == 1u && x.shape(0) == size) // column dot row for(std::ptrdiff_t i = 0; i < size; ++i) ret += x(i, 0) * y(0, i); else vigra_precondition(false, "dot(): wrong matrix shapes."); } else vigra_precondition(false, "dot(): wrong matrix shapes."); return ret; } /** calculate the inner product of two vectors. The vector lengths must match. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template typename NormTraits::SquaredNormType dot(const MultiArrayView<1, T, C1> &x, const MultiArrayView<1, T, C2> &y) { const MultiArrayIndex n = x.elementCount(); vigra_precondition(n == y.elementCount(), "dot(): shape mismatch."); typename NormTraits::SquaredNormType ret = NumericTraits::SquaredNormType>::zero(); for(MultiArrayIndex i = 0; i < n; ++i) ret += x(i) * y(i); return ret; } /** calculate the cross product of two vectors of length 3. The result is written into \a r. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template void cross(const MultiArrayView<1, T, C1> &x, const MultiArrayView<1, T, C2> &y, MultiArrayView<1, T, C3> &r) { vigra_precondition(3 == x.elementCount() && 3 == y.elementCount() && 3 == r.elementCount(), "cross(): vectors must have length 3."); r(0) = x(1)*y(2) - x(2)*y(1); r(1) = x(2)*y(0) - x(0)*y(2); r(2) = x(0)*y(1) - x(1)*y(0); } /** calculate the cross product of two matrices representing vectors. That is, \a x, \a y, and \a r must have a single column of length 3. The result is written into \a r. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template void cross(const MultiArrayView<2, T, C1> &x, const MultiArrayView<2, T, C2> &y, MultiArrayView<2, T, C3> &r) { vigra_precondition(3 == rowCount(x) && 3 == rowCount(y) && 3 == rowCount(r) , "cross(): vectors must have length 3."); r(0,0) = x(1,0)*y(2,0) - x(2,0)*y(1,0); r(1,0) = x(2,0)*y(0,0) - x(0,0)*y(2,0); r(2,0) = x(0,0)*y(1,0) - x(1,0)*y(0,0); } /** calculate the cross product of two matrices representing vectors. That is, \a x, and \a y must have a single column of length 3. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template TemporaryMatrix cross(const MultiArrayView<2, T, C1> &x, const MultiArrayView<2, T, C2> &y) { TemporaryMatrix ret(3, 1); cross(x, y, ret); return ret; } /** calculate the outer product of two matrices representing vectors. That is, matrix \a x must have a single column, and matrix \a y must have a single row, and the other dimensions must match. The result is written into \a r. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template void outer(const MultiArrayView<2, T, C1> &x, const MultiArrayView<2, T, C2> &y, MultiArrayView<2, T, C3> &r) { const MultiArrayIndex rows = rowCount(r); const MultiArrayIndex cols = columnCount(r); vigra_precondition(rows == rowCount(x) && cols == columnCount(y) && 1 == columnCount(x) && 1 == rowCount(y), "outer(): shape mismatch."); for(MultiArrayIndex i = 0; i < cols; ++i) for(MultiArrayIndex j = 0; j < rows; ++j) r(j, i) = x(j, 0) * y(0, i); } /** calculate the outer product of two matrices representing vectors. That is, matrix \a x must have a single column, and matrix \a y must have a single row, and the other dimensions must match. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template TemporaryMatrix outer(const MultiArrayView<2, T, C1> &x, const MultiArrayView<2, T, C2> &y) { const MultiArrayIndex rows = rowCount(x); const MultiArrayIndex cols = columnCount(y); vigra_precondition(1 == columnCount(x) && 1 == rowCount(y), "outer(): shape mismatch."); TemporaryMatrix ret(rows, cols); outer(x, y, ret); return ret; } /** calculate the outer product of a matrix (representing a vector) with itself. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template TemporaryMatrix outer(const MultiArrayView<2, T, C> &x) { const MultiArrayIndex rows = rowCount(x); const MultiArrayIndex cols = columnCount(x); vigra_precondition(rows == 1 || cols == 1, "outer(): matrix does not represent a vector."); const MultiArrayIndex size = std::max(rows, cols); TemporaryMatrix ret(size, size); if(rows == 1) { for(MultiArrayIndex i = 0; i < size; ++i) for(MultiArrayIndex j = 0; j < size; ++j) ret(j, i) = x(0, j) * x(0, i); } else { for(MultiArrayIndex i = 0; i < size; ++i) for(MultiArrayIndex j = 0; j < size; ++j) ret(j, i) = x(j, 0) * x(i, 0); } return ret; } template class PointWise { public: T const & t; PointWise(T const & it) : t(it) {} }; template PointWise pointWise(T const & t) { return PointWise(t); } /** multiply matrix \a a with scalar \a b. The result is written into \a r. \a a and \a r must have the same shape. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void smul(const MultiArrayView<2, T, C1> &a, T b, MultiArrayView<2, T, C2> &r) { const MultiArrayIndex rows = rowCount(a); const MultiArrayIndex cols = columnCount(a); vigra_precondition(rows == rowCount(r) && cols == columnCount(r), "smul(): Matrix sizes must agree."); for(MultiArrayIndex i = 0; i < cols; ++i) for(MultiArrayIndex j = 0; j < rows; ++j) r(j, i) = a(j, i) * b; } /** multiply scalar \a a with matrix \a b. The result is written into \a r. \a b and \a r must have the same shape. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void smul(T a, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> &r) { smul(b, a, r); } /** perform matrix multiplication of matrices \a a and \a b. The result is written into \a r. The three matrices must have matching shapes. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void mmul(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> &r) { const MultiArrayIndex rrows = rowCount(r); const MultiArrayIndex rcols = columnCount(r); const MultiArrayIndex acols = columnCount(a); vigra_precondition(rrows == rowCount(a) && rcols == columnCount(b) && acols == rowCount(b), "mmul(): Matrix shapes must agree."); // order of loops ensures that inner loop goes down columns for(MultiArrayIndex i = 0; i < rcols; ++i) { for(MultiArrayIndex j = 0; j < rrows; ++j) r(j, i) = a(j, 0) * b(0, i); for(MultiArrayIndex k = 1; k < acols; ++k) for(MultiArrayIndex j = 0; j < rrows; ++j) r(j, i) += a(j, k) * b(k, i); } } /** perform matrix multiplication of matrices \a a and \a b. \a a and \a b must have matching shapes. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix mmul(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b) { TemporaryMatrix ret(rowCount(a), columnCount(b)); mmul(a, b, ret); return ret; } /** multiply two matrices \a a and \a b pointwise. The result is written into \a r. All three matrices must have the same shape. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void pmul(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> &r) { const MultiArrayIndex rrows = rowCount(r); const MultiArrayIndex rcols = columnCount(r); vigra_precondition(rrows == rowCount(a) && rcols == columnCount(a) && rrows == rowCount(b) && rcols == columnCount(b), "pmul(): Matrix shapes must agree."); for(MultiArrayIndex i = 0; i < rcols; ++i) { for(MultiArrayIndex j = 0; j < rrows; ++j) { r(j, i) = a(j, i) * b(j, i); } } } /** multiply matrices \a a and \a b pointwise. \a a and \a b must have matching shapes. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix pmul(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b) { TemporaryMatrix ret(a.shape()); pmul(a, b, ret); return ret; } /** multiply matrices \a a and \a b pointwise. \a a and \a b must have matching shapes. The result is returned as a temporary matrix. Usage: \code Matrix a(m,n), b(m,n); Matrix c = a * pointWise(b); // is equivalent to // Matrix c = pmul(a, b); \endcode \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator*(const MultiArrayView<2, T, C> &a, PointWise b) { return pmul(a, b.t); } /** multiply matrix \a a with scalar \a b. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator*(const MultiArrayView<2, T, C> &a, T b) { return TemporaryMatrix(a) *= b; } template inline TemporaryMatrix operator*(const TemporaryMatrix &a, T b) { return const_cast &>(a) *= b; } /** multiply scalar \a a with matrix \a b. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator*(T a, const MultiArrayView<2, T, C> &b) { return TemporaryMatrix(b) *= a; } template inline TemporaryMatrix operator*(T a, const TemporaryMatrix &b) { return const_cast &>(b) *= a; } /** multiply matrix \a a with TinyVector \a b. \a a must be of size N x N. Vector \a b and the result vector are interpreted as column vectors. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template TinyVector operator*(const Matrix &a, const TinyVectorBase &b) { vigra_precondition(N == rowCount(a) && N == columnCount(a), "operator*(Matrix, TinyVector): Shape mismatch."); TinyVector res = TinyVectorView(&a(0,0)) * b[0]; for(MultiArrayIndex i = 1; i < N; ++i) res += TinyVectorView(&a(0,i)) * b[i]; return res; } /** multiply TinyVector \a a with matrix \a b. \a b must be of size N x N. Vector \a a and the result vector are interpreted as row vectors. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template TinyVector operator*(const TinyVectorBase &a, const Matrix &b) { vigra_precondition(N == rowCount(b) && N == columnCount(b), "operator*(TinyVector, Matrix): Shape mismatch."); TinyVector res; for(MultiArrayIndex i = 0; i < N; ++i) res[i] = dot(a, TinyVectorView(&b(0,i))); return res; } /** perform matrix multiplication of matrices \a a and \a b. \a a and \a b must have matching shapes. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator*(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b) { TemporaryMatrix ret(rowCount(a), columnCount(b)); mmul(a, b, ret); return ret; } /** divide matrix \a a by scalar \a b. The result is written into \a r. \a a and \a r must have the same shape. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void sdiv(const MultiArrayView<2, T, C1> &a, T b, MultiArrayView<2, T, C2> &r) { const MultiArrayIndex rows = rowCount(a); const MultiArrayIndex cols = columnCount(a); vigra_precondition(rows == rowCount(r) && cols == columnCount(r), "sdiv(): Matrix sizes must agree."); for(MultiArrayIndex i = 0; i < cols; ++i) for(MultiArrayIndex j = 0; j < rows; ++j) r(j, i) = a(j, i) / b; } /** divide two matrices \a a and \a b pointwise. The result is written into \a r. All three matrices must have the same shape. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template void pdiv(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b, MultiArrayView<2, T, C3> &r) { const MultiArrayIndex rrows = rowCount(r); const MultiArrayIndex rcols = columnCount(r); vigra_precondition(rrows == rowCount(a) && rcols == columnCount(a) && rrows == rowCount(b) && rcols == columnCount(b), "pdiv(): Matrix shapes must agree."); for(MultiArrayIndex i = 0; i < rcols; ++i) { for(MultiArrayIndex j = 0; j < rrows; ++j) { r(j, i) = a(j, i) / b(j, i); } } } /** divide matrices \a a and \a b pointwise. \a a and \a b must have matching shapes. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix pdiv(const MultiArrayView<2, T, C1> &a, const MultiArrayView<2, T, C2> &b) { TemporaryMatrix ret(a.shape()); pdiv(a, b, ret); return ret; } /** divide matrices \a a and \a b pointwise. \a a and \a b must have matching shapes. The result is returned as a temporary matrix. Usage: \code Matrix a(m,n), b(m,n); Matrix c = a / pointWise(b); // is equivalent to // Matrix c = pdiv(a, b); \endcode \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator/(const MultiArrayView<2, T, C> &a, PointWise b) { return pdiv(a, b.t); } /** divide matrix \a a by scalar \a b. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator/(const MultiArrayView<2, T, C> &a, T b) { return TemporaryMatrix(a) /= b; } template inline TemporaryMatrix operator/(const TemporaryMatrix &a, T b) { return const_cast &>(a) /= b; } /** Create a matrix whose elements are the quotients between scalar \a a and matrix \a b. The result is returned as a temporary matrix. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: vigra::linalg */ template inline TemporaryMatrix operator/(T a, const MultiArrayView<2, T, C> &b) { return TemporaryMatrix(b.shape(), a) / pointWise(b); } using vigra::argMin; using vigra::argMinIf; using vigra::argMax; using vigra::argMaxIf; /*! Find the index of the minimum element in a matrix. The function returns the index in column-major scan-order sense, i.e. according to the order used by MultiArrayView::operator[]. If the matrix is actually a vector, this is just the row or columns index. In case of a truely 2-dimensional matrix, the index can be converted to an index pair by calling MultiArrayView::scanOrderIndexToCoordinate() Required Interface: \code bool f = a[0] < NumericTraits::max(); \endcode \#include \<vigra/matrix.hxx\>
Namespace: vigra */ template int argMin(MultiArrayView<2, T, C> const & a) { T vopt = NumericTraits::max(); int best = -1; for(int k=0; k < a.size(); ++k) { if(a[k] < vopt) { vopt = a[k]; best = k; } } return best; } /*! Find the index of the maximum element in a matrix. The function returns the index in column-major scan-order sense, i.e. according to the order used by MultiArrayView::operator[]. If the matrix is actually a vector, this is just the row or columns index. In case of a truely 2-dimensional matrix, the index can be converted to an index pair by calling MultiArrayView::scanOrderIndexToCoordinate() Required Interface: \code bool f = NumericTraits::min() < a[0]; \endcode \#include \<vigra/matrix.hxx\>
Namespace: vigra */ template int argMax(MultiArrayView<2, T, C> const & a) { T vopt = NumericTraits::min(); int best = -1; for(int k=0; k < a.size(); ++k) { if(vopt < a[k]) { vopt = a[k]; best = k; } } return best; } /*! Find the index of the minimum element in a matrix subject to a condition. The function returns -1 if no element conforms to \a condition. Otherwise, the index of the maximum element is returned in column-major scan-order sense, i.e. according to the order used by MultiArrayView::operator[]. If the matrix is actually a vector, this is just the row or columns index. In case of a truely 2-dimensional matrix, the index can be converted to an index pair by calling MultiArrayView::scanOrderIndexToCoordinate() Required Interface: \code bool c = condition(a[0]); bool f = a[0] < NumericTraits::max(); \endcode \#include \<vigra/matrix.hxx\>
Namespace: vigra */ template int argMinIf(MultiArrayView<2, T, C> const & a, UnaryFunctor condition) { T vopt = NumericTraits::max(); int best = -1; for(int k=0; k < a.size(); ++k) { if(condition(a[k]) && a[k] < vopt) { vopt = a[k]; best = k; } } return best; } /*! Find the index of the maximum element in a matrix subject to a condition. The function returns -1 if no element conforms to \a condition. Otherwise, the index of the maximum element is returned in column-major scan-order sense, i.e. according to the order used by MultiArrayView::operator[]. If the matrix is actually a vector, this is just the row or columns index. In case of a truely 2-dimensional matrix, the index can be converted to an index pair by calling MultiArrayView::scanOrderIndexToCoordinate() Required Interface: \code bool c = condition(a[0]); bool f = NumericTraits::min() < a[0]; \endcode \#include \<vigra/matrix.hxx\>
Namespace: vigra */ template int argMaxIf(MultiArrayView<2, T, C> const & a, UnaryFunctor condition) { T vopt = NumericTraits::min(); int best = -1; for(int k=0; k < a.size(); ++k) { if(condition(a[k]) && vopt < a[k]) { vopt = a[k]; best = k; } } return best; } /** Matrix point-wise power. */ template linalg::TemporaryMatrix pow(MultiArrayView<2, T, C> const & v, T exponent) { linalg::TemporaryMatrix t(v.shape()); MultiArrayIndex m = rowCount(v), n = columnCount(v); for(MultiArrayIndex i = 0; i < n; ++i) for(MultiArrayIndex j = 0; j < m; ++j) t(j, i) = vigra::pow(v(j, i), exponent); return t; } template linalg::TemporaryMatrix pow(linalg::TemporaryMatrix const & v, T exponent) { linalg::TemporaryMatrix & t = const_cast &>(v); MultiArrayIndex m = rowCount(t), n = columnCount(t); for(MultiArrayIndex i = 0; i < n; ++i) for(MultiArrayIndex j = 0; j < m; ++j) t(j, i) = vigra::pow(t(j, i), exponent); return t; } template linalg::TemporaryMatrix pow(MultiArrayView<2, T, C> const & v, int exponent) { linalg::TemporaryMatrix t(v.shape()); MultiArrayIndex m = rowCount(v), n = columnCount(v); for(MultiArrayIndex i = 0; i < n; ++i) for(MultiArrayIndex j = 0; j < m; ++j) t(j, i) = vigra::pow(v(j, i), exponent); return t; } template linalg::TemporaryMatrix pow(linalg::TemporaryMatrix const & v, int exponent) { linalg::TemporaryMatrix & t = const_cast &>(v); MultiArrayIndex m = rowCount(t), n = columnCount(t); for(MultiArrayIndex i = 0; i < n; ++i) for(MultiArrayIndex j = 0; j < m; ++j) t(j, i) = vigra::pow(t(j, i), exponent); return t; } template linalg::TemporaryMatrix pow(MultiArrayView<2, int, C> const & v, int exponent) { linalg::TemporaryMatrix t(v.shape()); MultiArrayIndex m = rowCount(v), n = columnCount(v); for(MultiArrayIndex i = 0; i < n; ++i) for(MultiArrayIndex j = 0; j < m; ++j) t(j, i) = (int)vigra::pow((double)v(j, i), exponent); return t; } inline linalg::TemporaryMatrix pow(linalg::TemporaryMatrix const & v, int exponent) { linalg::TemporaryMatrix & t = const_cast &>(v); MultiArrayIndex m = rowCount(t), n = columnCount(t); for(MultiArrayIndex i = 0; i < n; ++i) for(MultiArrayIndex j = 0; j < m; ++j) t(j, i) = (int)vigra::pow((double)t(j, i), exponent); return t; } /** Matrix point-wise sqrt. */ template linalg::TemporaryMatrix sqrt(MultiArrayView<2, T, C> const & v); /** Matrix point-wise exp. */ template linalg::TemporaryMatrix exp(MultiArrayView<2, T, C> const & v); /** Matrix point-wise log. */ template linalg::TemporaryMatrix log(MultiArrayView<2, T, C> const & v); /** Matrix point-wise log10. */ template linalg::TemporaryMatrix log10(MultiArrayView<2, T, C> const & v); /** Matrix point-wise sin. */ template linalg::TemporaryMatrix sin(MultiArrayView<2, T, C> const & v); /** Matrix point-wise asin. */ template linalg::TemporaryMatrix asin(MultiArrayView<2, T, C> const & v); /** Matrix point-wise cos. */ template linalg::TemporaryMatrix cos(MultiArrayView<2, T, C> const & v); /** Matrix point-wise acos. */ template linalg::TemporaryMatrix acos(MultiArrayView<2, T, C> const & v); /** Matrix point-wise tan. */ template linalg::TemporaryMatrix tan(MultiArrayView<2, T, C> const & v); /** Matrix point-wise atan. */ template linalg::TemporaryMatrix atan(MultiArrayView<2, T, C> const & v); /** Matrix point-wise round. */ template linalg::TemporaryMatrix round(MultiArrayView<2, T, C> const & v); /** Matrix point-wise floor. */ template linalg::TemporaryMatrix floor(MultiArrayView<2, T, C> const & v); /** Matrix point-wise ceil. */ template linalg::TemporaryMatrix ceil(MultiArrayView<2, T, C> const & v); /** Matrix point-wise abs. */ template linalg::TemporaryMatrix abs(MultiArrayView<2, T, C> const & v); /** Matrix point-wise square. */ template linalg::TemporaryMatrix sq(MultiArrayView<2, T, C> const & v); /** Matrix point-wise sign. */ template linalg::TemporaryMatrix sign(MultiArrayView<2, T, C> const & v); #define VIGRA_MATRIX_UNARY_FUNCTION(FUNCTION, NAMESPACE) \ using NAMESPACE::FUNCTION; \ template \ linalg::TemporaryMatrix FUNCTION(MultiArrayView<2, T, C> const & v) \ { \ linalg::TemporaryMatrix t(v.shape()); \ MultiArrayIndex m = rowCount(v), n = columnCount(v); \ \ for(MultiArrayIndex i = 0; i < n; ++i) \ for(MultiArrayIndex j = 0; j < m; ++j) \ t(j, i) = NAMESPACE::FUNCTION(v(j, i)); \ return t; \ } \ \ template \ linalg::TemporaryMatrix FUNCTION(linalg::Matrix const & v) \ { \ linalg::TemporaryMatrix t(v.shape()); \ MultiArrayIndex m = rowCount(v), n = columnCount(v); \ \ for(MultiArrayIndex i = 0; i < n; ++i) \ for(MultiArrayIndex j = 0; j < m; ++j) \ t(j, i) = NAMESPACE::FUNCTION(v(j, i)); \ return t; \ } \ \ template \ linalg::TemporaryMatrix FUNCTION(linalg::TemporaryMatrix const & v) \ { \ linalg::TemporaryMatrix & t = const_cast &>(v); \ MultiArrayIndex m = rowCount(t), n = columnCount(t); \ \ for(MultiArrayIndex i = 0; i < n; ++i) \ for(MultiArrayIndex j = 0; j < m; ++j) \ t(j, i) = NAMESPACE::FUNCTION(t(j, i)); \ return v; \ }\ }\ using linalg::FUNCTION;\ namespace linalg { VIGRA_MATRIX_UNARY_FUNCTION(sqrt, std) VIGRA_MATRIX_UNARY_FUNCTION(exp, std) VIGRA_MATRIX_UNARY_FUNCTION(log, std) VIGRA_MATRIX_UNARY_FUNCTION(log10, std) VIGRA_MATRIX_UNARY_FUNCTION(sin, std) VIGRA_MATRIX_UNARY_FUNCTION(asin, std) VIGRA_MATRIX_UNARY_FUNCTION(cos, std) VIGRA_MATRIX_UNARY_FUNCTION(acos, std) VIGRA_MATRIX_UNARY_FUNCTION(tan, std) VIGRA_MATRIX_UNARY_FUNCTION(atan, std) VIGRA_MATRIX_UNARY_FUNCTION(round, vigra) VIGRA_MATRIX_UNARY_FUNCTION(floor, vigra) VIGRA_MATRIX_UNARY_FUNCTION(ceil, vigra) VIGRA_MATRIX_UNARY_FUNCTION(abs, vigra) VIGRA_MATRIX_UNARY_FUNCTION(sq, vigra) VIGRA_MATRIX_UNARY_FUNCTION(sign, vigra) #undef VIGRA_MATRIX_UNARY_FUNCTION //@} } // namespace linalg using linalg::RowMajor; using linalg::ColumnMajor; using linalg::Matrix; using linalg::identityMatrix; using linalg::diagonalMatrix; using linalg::transpose; using linalg::pointWise; using linalg::dot; using linalg::cross; using linalg::outer; using linalg::rowCount; using linalg::columnCount; using linalg::rowVector; using linalg::columnVector; using linalg::isSymmetric; using linalg::joinHorizontally; using linalg::joinVertically; using linalg::argMin; using linalg::argMinIf; using linalg::argMax; using linalg::argMaxIf; /********************************************************/ /* */ /* NormTraits */ /* */ /********************************************************/ template struct NormTraits > : public NormTraits > { typedef NormTraits > BaseType; typedef Matrix Type; typedef typename BaseType::SquaredNormType SquaredNormType; typedef typename BaseType::NormType NormType; }; template struct NormTraits > : public NormTraits > { typedef NormTraits > BaseType; typedef linalg::TemporaryMatrix Type; typedef typename BaseType::SquaredNormType SquaredNormType; typedef typename BaseType::NormType NormType; }; /** \addtogroup LinearAlgebraFunctions */ //@{ /** print a matrix \a m to the stream \a s. \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespace: std */ template std::ostream & operator<<(std::ostream & s, const vigra::MultiArrayView<2, T, C> &m) { const MultiArrayIndex rows = vigra::linalg::rowCount(m); const MultiArrayIndex cols = vigra::linalg::columnCount(m); std::ios::fmtflags flags = s.setf(std::ios::right | std::ios::fixed, std::ios::adjustfield | std::ios::floatfield); for(MultiArrayIndex j = 0; j < rows; ++j) { for(MultiArrayIndex i = 0; i < cols; ++i) { s << std::setw(7) << std::setprecision(4) << m(j, i) << " "; } s << std::endl; } s.setf(flags); return s; } //@} namespace linalg { namespace detail { template void columnStatisticsImpl(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & sumOfSquaredDifferences) { MultiArrayIndex m = rowCount(A); MultiArrayIndex n = columnCount(A); vigra_precondition(1 == rowCount(mean) && n == columnCount(mean) && 1 == rowCount(sumOfSquaredDifferences) && n == columnCount(sumOfSquaredDifferences), "columnStatistics(): Shape mismatch between input and output."); // West's algorithm for incremental variance computation mean.init(NumericTraits::zero()); sumOfSquaredDifferences.init(NumericTraits::zero()); for(MultiArrayIndex k=0; k t = rowVector(A, k) - mean; typename NumericTraits::RealPromote f = 1.0 / (k + 1.0), f1 = 1.0 - f; mean += f*t; sumOfSquaredDifferences += f1*sq(t); } } template void columnStatistics2PassImpl(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & sumOfSquaredDifferences) { MultiArrayIndex m = rowCount(A); MultiArrayIndex n = columnCount(A); vigra_precondition(1 == rowCount(mean) && n == columnCount(mean) && 1 == rowCount(sumOfSquaredDifferences) && n == columnCount(sumOfSquaredDifferences), "columnStatistics(): Shape mismatch between input and output."); // two-pass algorithm for incremental variance computation mean.init(NumericTraits::zero()); for(MultiArrayIndex k=0; k::zero()); for(MultiArrayIndex k=0; k Declarations: compute only the mean: \code namespace vigra { namespace linalg { template void columnStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean); } } \endcode compute mean and standard deviation: \code namespace vigra { namespace linalg { template void columnStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & stdDev); } } \endcode compute mean, standard deviation, and norm: \code namespace vigra { namespace linalg { template void columnStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & stdDev, MultiArrayView<2, T4, C4> & norm); } } \endcode Usage: \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg \code Matrix A(rows, columns); .. // fill A Matrix columnMean(1, columns), columnStdDev(1, columns), columnNorm(1, columns); columnStatistics(A, columnMean, columnStdDev, columnNorm); \endcode */ doxygen_overloaded_function(template <...> void columnStatistics) template void columnStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean) { MultiArrayIndex m = rowCount(A); MultiArrayIndex n = columnCount(A); vigra_precondition(1 == rowCount(mean) && n == columnCount(mean), "columnStatistics(): Shape mismatch between input and output."); mean.init(NumericTraits::zero()); for(MultiArrayIndex k=0; k void columnStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & stdDev) { detail::columnStatisticsImpl(A, mean, stdDev); if(rowCount(A) > 1) stdDev = sqrt(stdDev / T3(rowCount(A) - 1.0)); } template void columnStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & stdDev, MultiArrayView<2, T4, C4> & norm) { MultiArrayIndex m = rowCount(A); MultiArrayIndex n = columnCount(A); vigra_precondition(1 == rowCount(mean) && n == columnCount(mean) && 1 == rowCount(stdDev) && n == columnCount(stdDev) && 1 == rowCount(norm) && n == columnCount(norm), "columnStatistics(): Shape mismatch between input and output."); detail::columnStatisticsImpl(A, mean, stdDev); norm = sqrt(stdDev + T2(m) * sq(mean)); stdDev = sqrt(stdDev / T3(m - 1.0)); } /** Compute statistics of every row of matrix \a A. The result matrices must be column vectors with as many rows as \a A. Declarations: compute only the mean: \code namespace vigra { namespace linalg { template void rowStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean); } } \endcode compute mean and standard deviation: \code namespace vigra { namespace linalg { template void rowStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & stdDev); } } \endcode compute mean, standard deviation, and norm: \code namespace vigra { namespace linalg { template void rowStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & stdDev, MultiArrayView<2, T4, C4> & norm); } } \endcode Usage: \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg \code Matrix A(rows, columns); .. // fill A Matrix rowMean(rows, 1), rowStdDev(rows, 1), rowNorm(rows, 1); rowStatistics(a, rowMean, rowStdDev, rowNorm); \endcode */ doxygen_overloaded_function(template <...> void rowStatistics) template void rowStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean) { vigra_precondition(1 == columnCount(mean) && rowCount(A) == rowCount(mean), "rowStatistics(): Shape mismatch between input and output."); MultiArrayView<2, T2, StridedArrayTag> tm = transpose(mean); columnStatistics(transpose(A), tm); } template void rowStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & stdDev) { vigra_precondition(1 == columnCount(mean) && rowCount(A) == rowCount(mean) && 1 == columnCount(stdDev) && rowCount(A) == rowCount(stdDev), "rowStatistics(): Shape mismatch between input and output."); MultiArrayView<2, T2, StridedArrayTag> tm = transpose(mean); MultiArrayView<2, T3, StridedArrayTag> ts = transpose(stdDev); columnStatistics(transpose(A), tm, ts); } template void rowStatistics(MultiArrayView<2, T1, C1> const & A, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & stdDev, MultiArrayView<2, T4, C4> & norm) { vigra_precondition(1 == columnCount(mean) && rowCount(A) == rowCount(mean) && 1 == columnCount(stdDev) && rowCount(A) == rowCount(stdDev) && 1 == columnCount(norm) && rowCount(A) == rowCount(norm), "rowStatistics(): Shape mismatch between input and output."); MultiArrayView<2, T2, StridedArrayTag> tm = transpose(mean); MultiArrayView<2, T3, StridedArrayTag> ts = transpose(stdDev); MultiArrayView<2, T4, StridedArrayTag> tn = transpose(norm); columnStatistics(transpose(A), tm, ts, tn); } namespace detail { template void updateCovarianceMatrix(MultiArrayView<2, T1, C1> const & features, U & count, MultiArrayView<2, T2, C2> & mean, MultiArrayView<2, T3, C3> & covariance) { MultiArrayIndex n = std::max(rowCount(features), columnCount(features)); vigra_precondition(std::min(rowCount(features), columnCount(features)) == 1, "updateCovarianceMatrix(): Features must be a row or column vector."); vigra_precondition(mean.shape() == features.shape(), "updateCovarianceMatrix(): Shape mismatch between feature vector and mean vector."); vigra_precondition(n == rowCount(covariance) && n == columnCount(covariance), "updateCovarianceMatrix(): Shape mismatch between feature vector and covariance matrix."); // West's algorithm for incremental covariance matrix computation Matrix t = features - mean; ++count; double f = 1.0 / count, f1 = 1.0 - f; mean += f*t; if(rowCount(features) == 1) // update column covariance from current row { for(MultiArrayIndex k=0; k\#include \<vigra/matrix.hxx\>
Namespace: vigra */ template void covarianceMatrixOfColumns(MultiArrayView<2, T1, C1> const & features, MultiArrayView<2, T2, C2> & covariance) { MultiArrayIndex m = rowCount(features), n = columnCount(features); vigra_precondition(n == rowCount(covariance) && n == columnCount(covariance), "covarianceMatrixOfColumns(): Shape mismatch between feature matrix and covariance matrix."); MultiArrayIndex count = 0; Matrix means(1, n); covariance.init(NumericTraits::zero()); for(MultiArrayIndex k=0; k\#include \<vigra/matrix.hxx\>
Namespace: vigra */ template TemporaryMatrix covarianceMatrixOfColumns(MultiArrayView<2, T, C> const & features) { TemporaryMatrix res(columnCount(features), columnCount(features)); covarianceMatrixOfColumns(features, res); return res; } /*! Compute the covariance matrix between the rows of a matrix \a features. The result matrix \a covariance must by a square matrix with as many rows and columns as the number of rows in matrix \a features. \#include \<vigra/matrix.hxx\>
Namespace: vigra */ template void covarianceMatrixOfRows(MultiArrayView<2, T1, C1> const & features, MultiArrayView<2, T2, C2> & covariance) { MultiArrayIndex m = rowCount(features), n = columnCount(features); vigra_precondition(m == rowCount(covariance) && m == columnCount(covariance), "covarianceMatrixOfRows(): Shape mismatch between feature matrix and covariance matrix."); MultiArrayIndex count = 0; Matrix means(m, 1); covariance.init(NumericTraits::zero()); for(MultiArrayIndex k=0; k\#include \<vigra/matrix.hxx\>
Namespace: vigra */ template TemporaryMatrix covarianceMatrixOfRows(MultiArrayView<2, T, C> const & features) { TemporaryMatrix res(rowCount(features), rowCount(features)); covarianceMatrixOfRows(features, res); return res; } enum DataPreparationGoals { ZeroMean = 1, UnitVariance = 2, UnitNorm = 4 }; inline DataPreparationGoals operator|(DataPreparationGoals l, DataPreparationGoals r) { return DataPreparationGoals(int(l) | int(r)); } namespace detail { template void prepareDataImpl(const MultiArrayView<2, T, C1> & A, MultiArrayView<2, T, C2> & res, MultiArrayView<2, T, C3> & offset, MultiArrayView<2, T, C4> & scaling, DataPreparationGoals goals) { MultiArrayIndex m = rowCount(A); MultiArrayIndex n = columnCount(A); vigra_precondition(A.shape() == res.shape() && n == columnCount(offset) && 1 == rowCount(offset) && n == columnCount(scaling) && 1 == rowCount(scaling), "prepareDataImpl(): Shape mismatch between input and output."); if(!goals) { res = A; offset.init(NumericTraits::zero()); scaling.init(NumericTraits::one()); return; } bool zeroMean = (goals & ZeroMean) != 0; bool unitVariance = (goals & UnitVariance) != 0; bool unitNorm = (goals & UnitNorm) != 0; vigra_precondition(!(unitVariance && unitNorm), "prepareDataImpl(): Unit variance and unit norm cannot be achieved at the same time."); Matrix mean(1, n), sumOfSquaredDifferences(1, n); detail::columnStatisticsImpl(A, mean, sumOfSquaredDifferences); for(MultiArrayIndex k=0; k::zero())) stdDev = NumericTraits::zero(); if(zeroMean && stdDev > NumericTraits::zero()) { columnVector(res, k) = columnVector(A, k) - mean(0,k); offset(0, k) = mean(0, k); mean(0, k) = NumericTraits::zero(); } else { columnVector(res, k) = columnVector(A, k); offset(0, k) = NumericTraits::zero(); } T norm = mean(0,k) == NumericTraits::zero() ? std::sqrt(sumOfSquaredDifferences(0, k)) : std::sqrt(sumOfSquaredDifferences(0, k) + T(m) * sq(mean(0,k))); if(unitNorm && norm > NumericTraits::zero()) { columnVector(res, k) /= norm; scaling(0, k) = NumericTraits::one() / norm; } else if(unitVariance && stdDev > NumericTraits::zero()) { columnVector(res, k) /= stdDev; scaling(0, k) = NumericTraits::one() / stdDev; } else { scaling(0, k) = NumericTraits::one(); } } } } // namespace detail /*! Standardize the columns of a matrix according to given DataPreparationGoals. For every column of the matrix \a A, this function computes mean, standard deviation, and norm. It then applies a linear transformation to the values of the column according to these statistics and the given DataPreparationGoals. The result is returned in matrix \a res which must have the same size as \a A. Optionally, the transformation applied can also be returned in the matrices \a offset and \a scaling (see below for an example how these matrices can be used to standardize more data according to the same transformation). The following DataPreparationGoals are supported:
ZeroMean
Subtract the column mean form every column if the values in the column are not constant. Do nothing in a constant column.
UnitVariance
Divide by the column standard deviation if the values in the column are not constant. Do nothing in a constant column.
UnitNorm
Divide by the column norm if it is non-zero.
ZeroMean | UnitVariance
First subtact the mean and then divide by the standard deviation, unless the column is constant (in which case the column remains unchanged).
ZeroMean | UnitNorm
If the column is non-constant, subtract the mean. Then divide by the norm of the result if the norm is non-zero.
Declarations: Standardize the matrix and return the parameters of the linear transformation. The matrices \a offset and \a scaling must be row vectors with as many columns as \a A. \code namespace vigra { namespace linalg { template void prepareColumns(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> & res, MultiArrayView<2, T, C3> & offset, MultiArrayView<2, T, C4> & scaling, DataPreparationGoals goals = ZeroMean | UnitVariance); } } \endcode Only standardize the matrix. \code namespace vigra { namespace linalg { template void prepareColumns(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> & res, DataPreparationGoals goals = ZeroMean | UnitVariance); } } \endcode Usage: \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg \code Matrix A(rows, columns); .. // fill A Matrix standardizedA(rows, columns), offset(1, columns), scaling(1, columns); prepareColumns(A, standardizedA, offset, scaling, ZeroMean | UnitNorm); // use offset and scaling to prepare additional data according to the same transformation Matrix newData(nrows, columns); Matrix standardizedNewData = (newData - repeatMatrix(offset, nrows, 1)) * pointWise(repeatMatrix(scaling, nrows, 1)); \endcode */ doxygen_overloaded_function(template <...> void prepareColumns) template inline void prepareColumns(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> & res, MultiArrayView<2, T, C3> & offset, MultiArrayView<2, T, C4> & scaling, DataPreparationGoals goals = ZeroMean | UnitVariance) { detail::prepareDataImpl(A, res, offset, scaling, goals); } template inline void prepareColumns(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> & res, DataPreparationGoals goals = ZeroMean | UnitVariance) { Matrix offset(1, columnCount(A)), scaling(1, columnCount(A)); detail::prepareDataImpl(A, res, offset, scaling, goals); } /*! Standardize the rows of a matrix according to given DataPreparationGoals. This algorithm works in the same way as \ref prepareColumns() (see there for detailed documentation), but is applied to the rows of the matrix \a A instead. Accordingly, the matrices holding the parameters of the linear transformation must be column vectors with as many rows as \a A. Declarations: Standardize the matrix and return the parameters of the linear transformation. The matrices \a offset and \a scaling must be column vectors with as many rows as \a A. \code namespace vigra { namespace linalg { template void prepareRows(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> & res, MultiArrayView<2, T, C3> & offset, MultiArrayView<2, T, C4> & scaling, DataPreparationGoals goals = ZeroMean | UnitVariance)´; } } \endcode Only standardize the matrix. \code namespace vigra { namespace linalg { template void prepareRows(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> & res, DataPreparationGoals goals = ZeroMean | UnitVariance); } } \endcode Usage: \#include \<vigra/matrix.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg \code Matrix A(rows, columns); .. // fill A Matrix standardizedA(rows, columns), offset(rows, 1), scaling(rows, 1); prepareRows(A, standardizedA, offset, scaling, ZeroMean | UnitNorm); // use offset and scaling to prepare additional data according to the same transformation Matrix newData(rows, ncolumns); Matrix standardizedNewData = (newData - repeatMatrix(offset, 1, ncolumns)) * pointWise(repeatMatrix(scaling, 1, ncolumns)); \endcode */ doxygen_overloaded_function(template <...> void prepareRows) template inline void prepareRows(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> & res, MultiArrayView<2, T, C3> & offset, MultiArrayView<2, T, C4> & scaling, DataPreparationGoals goals = ZeroMean | UnitVariance) { MultiArrayView<2, T, StridedArrayTag> tr = transpose(res), to = transpose(offset), ts = transpose(scaling); detail::prepareDataImpl(transpose(A), tr, to, ts, goals); } template inline void prepareRows(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> & res, DataPreparationGoals goals = ZeroMean | UnitVariance) { MultiArrayView<2, T, StridedArrayTag> tr = transpose(res); Matrix offset(rowCount(A), 1), scaling(rowCount(A), 1); detail::prepareDataImpl(transpose(A), tr, offset, scaling, goals); } //@} } // namespace linalg using linalg::columnStatistics; using linalg::prepareColumns; using linalg::rowStatistics; using linalg::prepareRows; using linalg::ZeroMean; using linalg::UnitVariance; using linalg::UnitNorm; } // namespace vigra #endif // VIGRA_MATRIX_HXX gamera-3.3.3/include/vigra/memory.hxx0000644000076500000000000000733011261456425016547 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2002-2003 by Ullrich Koethe, Hans Meine */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MEMORY_HXX #define VIGRA_MEMORY_HXX #include "metaprogramming.hxx" namespace vigra { namespace detail { template inline void destroy_n(T * /* p */, int /* n */, VigraTrueType /* isPOD */) { } template inline void destroy_n(T * p, int n, VigraFalseType /* isPOD */) { T * end = p + n; for(; p != end; ++p) p->~T(); } template inline void destroy_n(T * p, int n) { destroy_n(p, n, typename TypeTraits::isPOD()); } /********************************************************************/ // g++ 2.95 has std::destroy() in the STL #if !defined(__GNUC__) || __GNUC__ >= 3 template inline void destroy(T * p, VigraTrueType /* isPOD */) { } template inline void destroy(T * p, VigraFalseType /* isPOD */) { p->~T(); } template inline void destroy(T * p) { destroy(p, typename TypeTraits::isPOD()); } #else } } // namespace vigra::detail #include namespace vigra { namespace detail { using std::destroy; #endif } } // namespace vigra::detail #endif // VIGRA_MEMORY_HXX gamera-3.3.3/include/vigra/metaprogramming.hxx0000644000076500000000000002114511261456425020430 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_METAPROGRAMMING_HXX #define VIGRA_METAPROGRAMMING_HXX #include "config.hxx" #include namespace vigra { template class MetaInt { public: enum { value = N }; }; struct VigraTrueType { enum { asBool = true }; }; struct VigraFalseType { enum { asBool = false }; }; /** \addtogroup MultiArrayTags Multi-dimensional Array Tags Meta-programming tags to mark array's as strided or unstrided. */ //@{ /********************************************************/ /* */ /* StridedArrayTag */ /* */ /********************************************************/ /** tag for marking a MultiArray strided. \#include \<vigra/multi_array.hxx\> Namespace: vigra */ struct StridedArrayTag {}; /********************************************************/ /* */ /* UnstridedArrayTag */ /* */ /********************************************************/ /** tag for marking a MultiArray unstrided. \#include \<vigra/multi_array.hxx\> Namespace: vigra */ struct UnstridedArrayTag {}; template class TypeTraits { public: typedef VigraFalseType isConst; typedef VigraFalseType isPOD; typedef VigraFalseType isBuiltinType; }; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template class TypeTraits : public TypeTraits { public: typedef VigraTrueType isConst; }; template class TypeTraits { public: typedef VigraFalseType isConst; typedef VigraTrueType isPOD; typedef VigraTrueType isBuiltinType; }; template class TypeTraits { public: typedef VigraFalseType isConst; typedef VigraTrueType isPOD; typedef VigraTrueType isBuiltinType; }; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION namespace detail { template struct SizeToType; } // namespace detail #define VIGRA_TYPE_TRAITS(type, size) \ template<> \ class TypeTraits \ { \ public: \ typedef VigraFalseType isConst; \ typedef VigraTrueType isPOD; \ typedef VigraTrueType isBuiltinType; \ typedef char TypeToSize[size]; \ }; \ \ namespace detail { \ TypeTraits::TypeToSize * typeToSize(type); \ \ template <> \ struct SizeToType \ { \ typedef type result; \ }; \ } VIGRA_TYPE_TRAITS(char, 1) VIGRA_TYPE_TRAITS(signed char, 2) VIGRA_TYPE_TRAITS(unsigned char, 3) VIGRA_TYPE_TRAITS(short, 4) VIGRA_TYPE_TRAITS(unsigned short, 5) VIGRA_TYPE_TRAITS(int, 6) VIGRA_TYPE_TRAITS(unsigned int, 7) VIGRA_TYPE_TRAITS(long, 8) VIGRA_TYPE_TRAITS(unsigned long, 9) VIGRA_TYPE_TRAITS(float, 10) VIGRA_TYPE_TRAITS(double, 11) VIGRA_TYPE_TRAITS(long double, 12) #ifdef LLONG_MAX VIGRA_TYPE_TRAITS(long long, 13) VIGRA_TYPE_TRAITS(unsigned long long, 14) #endif #undef VIGRA_TYPE_TRAITS //@} template struct Not; template <> struct Not { typedef VigraFalseType result; static const bool boolResult = false; }; template <> struct Not { typedef VigraTrueType result; static const bool boolResult = true; }; template struct And; template <> struct And { typedef VigraFalseType result; static const bool boolResult = false; }; template <> struct And { typedef VigraFalseType result; static const bool boolResult = false; }; template <> struct And { typedef VigraFalseType result; static const bool boolResult = false; }; template <> struct And { typedef VigraTrueType result; static const bool boolResult = true; }; template struct Or; template <> struct Or { typedef VigraFalseType result; static const bool boolResult = false; }; template <> struct Or { typedef VigraTrueType result; static const bool boolResult = true; }; template <> struct Or { typedef VigraTrueType result; static const bool boolResult = true; }; template <> struct Or { typedef VigraTrueType result; static const bool boolResult = true; }; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct If; template struct If { typedef TRUECASE type; }; template struct If { typedef FALSECASE type; }; template struct IfBool; template struct IfBool { typedef TRUECASE type; }; template struct IfBool { typedef FALSECASE type; }; template struct IsSameType { typedef VigraFalseType result; static const bool boolResult = false; }; template struct IsSameType { typedef VigraTrueType result; static const bool boolResult = true; }; template struct IsDerivedFrom { typedef char falseResult[1]; typedef char trueResult[2]; static falseResult * testIsDerivedFrom(...); static trueResult * testIsDerivedFrom(BASE const *); enum { resultSize = sizeof(*testIsDerivedFrom((DERIVED const *)0)) }; static const bool boolResult = (resultSize == 2); typedef typename IfBool::type result; }; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION } // namespace vigra #endif /* VIGRA_METAPROGRAMMING_HXX */ gamera-3.3.3/include/vigra/multi_array.hxx0000644000076500000000000022561711261456425017601 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2003-2008 by Gunnar Kedenburg and Ullrich Koethe */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MULTI_ARRAY_HXX #define VIGRA_MULTI_ARRAY_HXX #include #include #include "accessor.hxx" #include "tinyvector.hxx" #include "rgbvalue.hxx" #include "basicimageview.hxx" #include "imageiterator.hxx" #include "numerictraits.hxx" #include "multi_iterator.hxx" #include "metaprogramming.hxx" #include "mathutil.hxx" namespace vigra { namespace detail { /********************************************************/ /* */ /* defaultStride */ /* */ /********************************************************/ /* generates the stride for a gapless shape. Namespace: vigra::detail */ template inline TinyVector defaultStride(const TinyVector &shape) { TinyVector ret; ret [0] = 1; for (int i = 1; i < (int)N; ++i) ret [i] = ret [i-1] * shape [i-1]; return ret; } /********************************************************/ /* */ /* ScanOrderToOffset */ /* */ /********************************************************/ /* transforms an index in scan order sense to a pointer offset in a possibly strided, multi-dimensional array. Namespace: vigra::detail */ template struct ScanOrderToOffset { template static MultiArrayIndex exec(MultiArrayIndex d, const TinyVector &shape, const TinyVector & stride) { return stride[N-K] * (d % shape[N-K]) + ScanOrderToOffset::exec(d / shape[N-K], shape, stride); } }; template <> struct ScanOrderToOffset<1> { template static MultiArrayIndex exec(MultiArrayIndex d, const TinyVector & /*shape*/, const TinyVector & stride) { return stride[N-1] * d; } }; template struct ScanOrderToCoordinate { template static void exec(MultiArrayIndex d, const TinyVector &shape, TinyVector & result) { result[N-K] = (d % shape[N-K]); ScanOrderToCoordinate::exec(d / shape[N-K], shape, result); } }; template <> struct ScanOrderToCoordinate<1> { template static void exec(MultiArrayIndex d, const TinyVector & /*shape*/, TinyVector & result) { result[N-1] = d; } }; template struct CoordinateToScanOrder { template static MultiArrayIndex exec(const TinyVector &shape, const TinyVector & coordinate) { return coordinate[N-K] + shape[N-K] * CoordinateToScanOrder::exec(shape, coordinate); } }; template <> struct CoordinateToScanOrder<1> { template static MultiArrayIndex exec(const TinyVector & /*shape*/, const TinyVector & coordinate) { return coordinate[N-1]; } }; template struct CoordinatesToOffest { template static MultiArrayIndex exec(const TinyVector & stride, MultiArrayIndex x) { return stride[0] * x; } template static MultiArrayIndex exec(const TinyVector & stride, MultiArrayIndex x, MultiArrayIndex y) { return stride[0] * x + stride[1] * y; } }; template <> struct CoordinatesToOffest { template static MultiArrayIndex exec(const TinyVector & /*stride*/, MultiArrayIndex x) { return x; } template static MultiArrayIndex exec(const TinyVector & stride, MultiArrayIndex x, MultiArrayIndex y) { return x + stride[1] * y; } }; /********************************************************/ /* */ /* MaybeStrided */ /* */ /********************************************************/ /* metatag implementing a test for marking MultiArrays that were indexed at the zero'th dimension as strided, and all others as unstrided. \#include \<vigra/multi_array.hxx\> Namespace: vigra::detail */ template struct MaybeStrided { typedef UnstridedArrayTag type; }; template <> struct MaybeStrided <0> { typedef StridedArrayTag type; }; /********************************************************/ /* */ /* MultiIteratorChooser */ /* */ /********************************************************/ /* metatag implementing a test (by pattern matching) for marking MultiArrays that were indexed at the zero'th dimension as strided. \#include \<vigra/multi_array.hxx\> Namespace: vigra::detail */ template struct MultiIteratorChooser { struct Nil {}; template struct Traverser { typedef Nil type; }; }; /********************************************************/ /* */ /* MultiIteratorChooser */ /* */ /********************************************************/ /* specialization of the MultiIteratorChooser for strided arrays. \#include \<vigra/multi_array.hxx\> Namespace: vigra::detail */ template <> struct MultiIteratorChooser { template struct Traverser { typedef StridedMultiIterator type; }; }; /********************************************************/ /* */ /* MultiIteratorChooser */ /* */ /********************************************************/ /* specialization of the MultiIteratorChooser for unstrided arrays. \#include \<vigra/multi_array.hxx\> Namespace: vigra::detail */ template <> struct MultiIteratorChooser { template struct Traverser { typedef MultiIterator type; }; }; /********************************************************/ /* */ /* helper functions */ /* */ /********************************************************/ template inline void initMultiArrayData(DestIterator d, Shape const & shape, T const & init, MetaInt<0>) { DestIterator dend = d + shape[0]; for(; d < dend; ++d) { *d = init; } } template void initMultiArrayData(DestIterator d, Shape const & shape, T const & init, MetaInt) { DestIterator dend = d + shape[N]; for(; d < dend; ++d) { initMultiArrayData(d.begin(), shape, init, MetaInt()); } } #define VIGRA_COPY_MULTI_ARRAY_DATA(name, op) \ template \ inline void \ name##MultiArrayData(SrcIterator s, Shape const & shape, DestIterator d, MetaInt<0>) \ { \ SrcIterator send = s + shape[0]; \ for(; s < send; ++s, ++d) \ { \ *d op *s; \ } \ } \ \ template \ void \ name##MultiArrayData(SrcIterator s, Shape const & shape, DestIterator d, MetaInt) \ { \ SrcIterator send = s + shape[N]; \ for(; s < send; ++s, ++d) \ { \ name##MultiArrayData(s.begin(), shape, d.begin(), MetaInt()); \ } \ } \ \ template \ inline void \ name##ScalarMultiArrayData(DestIterator d, Shape const & shape, T const & init, MetaInt<0>) \ { \ DestIterator dend = d + shape[0]; \ for(; d < dend; ++d) \ { \ *d op init; \ } \ } \ \ template \ void \ name##ScalarMultiArrayData(DestIterator d, Shape const & shape, T const & init, MetaInt) \ { \ DestIterator dend = d + shape[N]; \ for(; d < dend; ++d) \ { \ name##ScalarMultiArrayData(d.begin(), shape, init, MetaInt()); \ } \ } VIGRA_COPY_MULTI_ARRAY_DATA(copy, =) VIGRA_COPY_MULTI_ARRAY_DATA(copyAdd, +=) VIGRA_COPY_MULTI_ARRAY_DATA(copySub, -=) VIGRA_COPY_MULTI_ARRAY_DATA(copyMul, *=) VIGRA_COPY_MULTI_ARRAY_DATA(copyDiv, /=) #undef VIGRA_COPY_MULTI_ARRAY_DATA template inline void uninitializedCopyMultiArrayData(SrcIterator s, Shape const & shape, T * & d, ALLOC & a, MetaInt<0>) { SrcIterator send = s + shape[0]; for(; s < send; ++s, ++d) { a.construct(d, static_cast(*s)); } } template void uninitializedCopyMultiArrayData(SrcIterator s, Shape const & shape, T * & d, ALLOC & a, MetaInt) { SrcIterator send = s + shape[N]; for(; s < send; ++s) { uninitializedCopyMultiArrayData(s.begin(), shape, d, a, MetaInt()); } } template inline void normMaxOfMultiArray(SrcIterator s, Shape const & shape, T & result, MetaInt<0>) { SrcIterator send = s + shape[0]; for(; s < send; ++s) { T v = norm(*s); if(result < v) result = v; } } template void normMaxOfMultiArray(SrcIterator s, Shape const & shape, T & result, MetaInt) { SrcIterator send = s + shape[N]; for(; s < send; ++s) { normMaxOfMultiArray(s.begin(), shape, result, MetaInt()); } } template struct MultiArrayL1Functor { template T operator()(U t) const { return norm(t); } }; template struct MultiArrayL2Functor { template T operator()(U t) const { return squaredNorm(t); } }; template struct MultiArrayScaledL2Functor { T scale; MultiArrayScaledL2Functor(T s) : scale(s) {} template T operator()(U t) const { return squaredNorm(T(t) / scale); } }; template inline void sumOverMultiArray(SrcIterator s, Shape const & shape, Functor f, T & result, MetaInt<0>) { SrcIterator send = s + shape[0]; for(; s < send; ++s) { result += f(*s); } } template void sumOverMultiArray(SrcIterator s, Shape const & shape, Functor f, T & result, MetaInt) { SrcIterator send = s + shape[N]; for(; s < send; ++s) { sumOverMultiArray(s.begin(), shape, f, result, MetaInt()); } } template inline bool equalityOfMultiArrays(SrcIterator s, Shape const & shape, DestIterator d, MetaInt<0>) { SrcIterator send = s + shape[0]; for(; s < send; ++s, ++d) { if(!(*s == *d)) return false; } return true; } template bool equalityOfMultiArrays(SrcIterator s, Shape const & shape, DestIterator d, MetaInt) { SrcIterator send = s + shape[N]; for(; s < send; ++s, ++d) { if(!equalityOfMultiArrays(s.begin(), shape, d.begin(), MetaInt())) return false; } return true; } template inline void swapDataImpl(SrcIterator s, Shape const & shape, DestIterator d, MetaInt<0>) { SrcIterator send = s + shape[0]; for(; s < send; ++s, ++d) std::swap(*s, *d); } template void swapDataImpl(SrcIterator s, Shape const & shape, DestIterator d, MetaInt) { SrcIterator send = s + shape[N]; for(; s < send; ++s, ++d) swapDataImpl(s.begin(), shape, d.begin(), MetaInt()); } } // namespace detail /********************************************************/ /* */ /* MultiArrayView */ /* */ /********************************************************/ // forward declaration template class MultiArrayView; template > class MultiArray; /********************************************************/ /* */ /* NormTraits */ /* */ /********************************************************/ template struct NormTraits > { typedef MultiArrayView Type; typedef typename NormTraits::SquaredNormType SquaredNormType; typedef typename SquareRootTraits::SquareRootResult NormType; }; template struct NormTraits > : public NormTraits > { typedef NormTraits > BaseType; typedef MultiArray Type; typedef typename BaseType::SquaredNormType SquaredNormType; typedef typename BaseType::NormType NormType; }; /** \brief Base class for, and view to, \ref vigra::MultiArray. This class implements the interface of both MultiArray and MultiArrayView. By default, MultiArrayViews are tagged as unstrided. If necessary, strided arrays are constructed automatically by calls to a variant of the bind...() function. If you want to apply an algorithm requiring an image to a MultiArrayView of appropriate (2-dimensional) shape, you can create a \ref vigra::BasicImageView that acts as a wrapper with the necessary interface -- see \ref MultiArrayToImage. The template parameter are as follows \code N: the array dimension T: the type of the array elements C: a tag determining whether the array's inner dimension is strided or not. An array is unstrided if the array elements occupy consecutive memory location, strided if there is an offset in between (e.g. when a view is created that skips every other array element). The compiler can generate faster code for unstrided arrays. Possible values: UnstridedArrayTag (default), StridedArrayTag \endcode \#include \<vigra/multi_array.hxx\> Namespace: vigra */ template class MultiArrayView { public: /** the array's actual dimensionality. This ensures that MultiArrayView can also be used for scalars (that is, when N == 0). Calculated as:
\code actual_dimension = (N==0) ? 1 : N \endcode */ enum ActualDimension { actual_dimension = (N==0) ? 1 : N }; /** the array's value type */ typedef T value_type; /** reference type (result of operator[]) */ typedef value_type &reference; /** const reference type (result of operator[] const) */ typedef const value_type &const_reference; /** pointer type */ typedef value_type *pointer; /** const pointer type */ typedef const value_type *const_pointer; /** difference type (used for multi-dimensional offsets and indices) */ typedef typename MultiArrayShape::type difference_type; /** size type */ typedef difference_type size_type; /** difference and index type for a single dimension */ typedef MultiArrayIndex difference_type_1; /** traverser (MultiIterator) type */ typedef typename vigra::detail::MultiIteratorChooser < C>::template Traverser ::type traverser; /** const traverser (MultiIterator) type */ typedef typename vigra::detail::MultiIteratorChooser < C>::template Traverser ::type const_traverser; /** the view type associated with this array. */ typedef MultiArrayView view_type; /** the matrix type associated with this array. */ typedef MultiArray matrix_type; protected: typedef typename difference_type::value_type diff_zero_t; /** the shape of the image pointed to is stored here. */ difference_type m_shape; /** the strides (offset of a sample to the next) for every dimension are stored here. */ difference_type m_stride; /** pointer to the image. */ pointer m_ptr; template void copyImpl(const MultiArrayView & rhs); template void swapDataImpl(MultiArrayView rhs); template bool arraysOverlap(const MultiArrayView & rhs) const; public: /** default constructor: create an empty image of size 0. */ MultiArrayView () : m_shape (diff_zero_t(0)), m_stride (diff_zero_t(0)), m_ptr (0) {} /** construct from shape and pointer */ MultiArrayView (const difference_type &shape, pointer ptr) : m_shape (shape), m_stride (detail::defaultStride ::actual_dimension> (shape)), m_ptr (ptr) {} /** construct from shape, strides (offset of a sample to the next) for every dimension) and pointer */ MultiArrayView (const difference_type &shape, const difference_type &stride, pointer ptr) : m_shape (shape), m_stride (stride), m_ptr (ptr) {} /** Assignment. There are 3 cases:
  • When this MultiArrayView does not point to valid data (e.g. after default construction), it becomes a copy of \a rhs.
  • When the shapes of the two arrays match, the array contents are copied.
  • Otherwise, a PreconditionViolation exception is thrown.
*/ MultiArrayView & operator=(MultiArrayView const & rhs); /** Assignment of a differently typed MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArrayView & operator=(MultiArrayView const & rhs) { vigra_precondition(this->shape() == rhs.shape(), "MultiArrayView::operator=() size mismatch."); this->copyImpl(rhs); return *this; } /** Add-assignment of a compatible MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArrayView & operator+=(MultiArrayView const & rhs); /** Subtract-assignment of a compatible MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArrayView & operator-=(MultiArrayView const & rhs); /** Multiply-assignment of a compatible MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArrayView & operator*=(MultiArrayView const & rhs); /** Divide-assignment of a compatible MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArrayView & operator/=(MultiArrayView const & rhs); /** Add-assignment of a scalar. */ MultiArrayView & operator+=(T const & rhs) { detail::copyAddScalarMultiArrayData(traverser_begin(), shape(), rhs, MetaInt()); return *this; } /** Subtract-assignment of a scalar. */ MultiArrayView & operator-=(T const & rhs) { detail::copySubScalarMultiArrayData(traverser_begin(), shape(), rhs, MetaInt()); return *this; } /** Multiply-assignment of a scalar. */ MultiArrayView & operator*=(T const & rhs) { detail::copyMulScalarMultiArrayData(traverser_begin(), shape(), rhs, MetaInt()); return *this; } /** Divide-assignment of a scalar. */ MultiArrayView & operator/=(T const & rhs) { detail::copyDivScalarMultiArrayData(traverser_begin(), shape(), rhs, MetaInt()); return *this; } /** array access. */ reference operator[] (const difference_type &d) { return m_ptr [dot (d, m_stride)]; } /** array access. */ const_reference operator[] (const difference_type &d) const { return m_ptr [dot (d, m_stride)]; } /** array access in scan-order sense. Mostly useful to support standard indexing for 1-dimensional multi-arrays, but works for any N. Use scanOrderIndexToCoordinate() and coordinateToScanOrderIndex() for conversion between indices and coordinates. */ reference operator[](difference_type_1 d) { return m_ptr [detail::ScanOrderToOffset::exec(d, m_shape, m_stride)]; } /** array access in scan-order sense. Mostly useful to support standard indexing for 1-dimensional multi-arrays, but works for any N. Use scanOrderIndexToCoordinate() and coordinateToScanOrderIndex() for conversion between indices and coordinates. */ const_reference operator[](difference_type_1 d) const { return m_ptr [detail::ScanOrderToOffset::exec(d, m_shape, m_stride)]; } /** convert scan-order index to coordinate. */ difference_type scanOrderIndexToCoordinate(difference_type_1 d) const { difference_type result; detail::ScanOrderToCoordinate::exec(d, m_shape, result); return result; } /** convert coordinate to scan-order index. */ difference_type_1 coordinateToScanOrderIndex(const difference_type &d) const { return detail::CoordinateToScanOrder::exec(m_shape, d); } /** 1D array access. Use only if N == 1. */ reference operator() (difference_type_1 x) { return m_ptr [detail::CoordinatesToOffest::exec(m_stride, x)]; } /** 2D array access. Use only if N == 2. */ reference operator() (difference_type_1 x, difference_type_1 y) { return m_ptr [detail::CoordinatesToOffest::exec(m_stride, x, y)]; } /** 3D array access. Use only if N == 3. */ reference operator() (difference_type_1 x, difference_type_1 y, difference_type_1 z) { return m_ptr [m_stride[0]*x + m_stride[1]*y + m_stride[2]*z]; } /** 4D array access. Use only if N == 4. */ reference operator() (difference_type_1 x, difference_type_1 y, difference_type_1 z, difference_type_1 u) { return m_ptr [m_stride[0]*x + m_stride[1]*y + m_stride[2]*z + m_stride[3]*u]; } /** 5D array access. Use only if N == 5. */ reference operator() (difference_type_1 x, difference_type_1 y, difference_type_1 z, difference_type_1 u, difference_type_1 v) { return m_ptr [m_stride[0]*x + m_stride[1]*y + m_stride[2]*z + m_stride[3]*u + m_stride[4]*v]; } /** 1D const array access. Use only if N == 1. */ const_reference operator() (difference_type_1 x) const { return m_ptr [detail::CoordinatesToOffest::exec(m_stride, x)]; } /** 2D const array access. Use only if N == 2. */ const_reference operator() (difference_type_1 x, difference_type_1 y) const { return m_ptr [detail::CoordinatesToOffest::exec(m_stride, x, y)]; } /** 3D const array access. Use only if N == 3. */ const_reference operator() (difference_type_1 x, difference_type_1 y, difference_type_1 z) const { return m_ptr [m_stride[0]*x + m_stride[1]*y + m_stride[2]*z]; } /** 4D const array access. Use only if N == 4. */ const_reference operator() (difference_type_1 x, difference_type_1 y, difference_type_1 z, difference_type_1 u) const { return m_ptr [m_stride[0]*x + m_stride[1]*y + m_stride[2]*z + m_stride[3]*u]; } /** 5D const array access. Use only if N == 5. */ const_reference operator() (difference_type_1 x, difference_type_1 y, difference_type_1 z, difference_type_1 u, difference_type_1 v) const { return m_ptr [m_stride[0]*x + m_stride[1]*y + m_stride[2]*z + m_stride[3]*u + m_stride[4]*v]; } /** Init with a constant. */ template MultiArrayView & init(const U & init) { detail::copyScalarMultiArrayData(traverser_begin(), shape(), init, MetaInt()); return *this; } /** Copy the data of the right-hand array (array shapes must match). */ void copy(const MultiArrayView & rhs) { if(this == &rhs) return; this->copyImpl(rhs); } /** Copy the data of the right-hand array (array shapes must match). */ template void copy(const MultiArrayView & rhs) { this->copyImpl(rhs); } /** swap the data between two MultiArrayView objects. The shapes of the two array must match. */ void swapData(MultiArrayView rhs) { if(this != &rhs) swapDataImpl(rhs); } /** swap the data between two MultiArrayView objects. The shapes of the two array must match. */ template void swapData(MultiArrayView rhs) { swapDataImpl(rhs); } /** bind the M outmost dimensions to certain indices. this reduces the dimensionality of the image to max { 1, N-M }. Usage: \code // create a 3D array of size 40x30x20 typedef MultiArray<3, double>::difference_type Shape; MultiArray<3, double> array3(Shape(40, 30, 20)); // get a 1D array by fixing index 1 to 12, and index 2 to 10 MultiArrayView <1, double> array1 = array3.bindOuter(TinyVector(12, 10)); \endcode */ template MultiArrayView bindOuter (const TinyVector &d) const; /** bind the M innermost dimensions to certain indices. this reduces the dimensionality of the image to max { 1, N-M }. Usage: \code // create a 3D array of size 40x30x20 typedef MultiArray<3, double>::difference_type Shape; MultiArray<3, double> array3(Shape(40, 30, 20)); // get a 1D array by fixing index 0 to 12, and index 1 to 10 MultiArrayView <1, double, StridedArrayTag> array1 = array3.bindInner(TinyVector(12, 10)); \endcode */ template MultiArrayView bindInner (const TinyVector &d) const; /** bind dimension M to index d. this reduces the dimensionality of the image to max { 1, N-1 }. Usage: \code // create a 3D array of size 40x30x20 typedef MultiArray<3, double>::difference_type Shape; MultiArray<3, double> array3(Shape(40, 30, 20)); // get a 2D array by fixing index 1 to 12 MultiArrayView <2, double> array2 = array3.bind<1>(12); // get a 2D array by fixing index 0 to 23 MultiArrayView <2, double, StridedArrayTag> array2a = array3.bind<0>(23); \endcode */ template MultiArrayView ::type > bind (difference_type_1 d) const; /** bind the outmost dimension to a certain index. this reduces the dimensionality of the image to max { 1, N-1 }. Usage: \code // create a 3D array of size 40x30x20 typedef MultiArray<3, double>::difference_type Shape; MultiArray<3, double> array3(Shape(40, 30, 20)); // get a 2D array by fixing the outermost index (i.e. index 2) to 12 MultiArrayView <2, double> array2 = array3.bindOuter(12); \endcode */ MultiArrayView bindOuter (difference_type_1 d) const; /** bind the innermost dimension to a certain index. this reduces the dimensionality of the image to max { 1, N-1 }. Usage: \code // create a 3D array of size 40x30x20 typedef MultiArray<3, double>::difference_type Shape; MultiArray<3, double> array3(Shape(40, 30, 20)); // get a 2D array by fixing the innermost index (i.e. index 0) to 23 MultiArrayView <2, double, StridedArrayTag> array2 = array3.bindInner(23); \endcode */ MultiArrayView bindInner (difference_type_1 d) const; /** bind dimension m to index d. this reduces the dimensionality of the image to max { 1, N-1 }. Usage: \code // create a 3D array of size 40x30x20 typedef MultiArray<3, double>::difference_type Shape; MultiArray<3, double> array3(Shape(40, 30, 20)); // get a 2D array by fixing index 2 to 15 MultiArrayView <2, double, StridedArrayTag> array2 = array3.bindAt(2, 15); \endcode */ MultiArrayView bindAt (difference_type_1 m, difference_type_1 d) const; /** create a rectangular subarray that spans between the points p and q, where p is in the subarray, q not. Usage: \code // create a 3D array of size 40x30x20 typedef MultiArray<3, double>::difference_type Shape; MultiArray<3, double> array3(Shape(40, 30, 20)); // get a subarray set is smaller by one element at all sides MultiArrayView <3, double> subarray = array3.subarray(Shape(1,1,1), Shape(39, 29, 19)); \endcode */ MultiArrayView subarray (const difference_type &p, const difference_type &q) const { const difference_type_1 offset = dot (m_stride, p); return MultiArrayView (q - p, m_stride, m_ptr + offset); } /** apply an additional striding to the image, thereby reducing the shape of the array. for example, multiplying the stride of dimension one by three turns an appropriately layed out (interleaved) rgb image into a single band image. */ MultiArrayView stridearray (const difference_type &s) const { difference_type shape = m_shape; for (unsigned int i = 0; i < actual_dimension; ++i) shape [i] /= s [i]; return MultiArrayView (shape, m_stride * s, m_ptr); } /** permute the dimensions of the array. The function exchanges the meaning of the dimensions without copying the data. In case of a 2-dimensional array, this is simply array transposition. In higher dimensions, there are more possibilities. Usage:
\code typedef MultiArray<2, double>::difference_type Shape; MultiArray<2, double> array(10, 20); MultiArray<2, double, StridedArrayTag> transposed = array.permuteDimensions(Shape(1,0)); for(int i=0; i permuteDimensions (const difference_type &s) const { difference_type shape, stride, check((typename difference_type::value_type)0); for (unsigned int i = 0; i < actual_dimension; ++i) { shape[i] = m_shape[s[i]]; stride[i] = m_stride[s[i]]; ++check[s[i]]; } vigra_precondition(check == difference_type(1), "MultiArrayView::permuteDimensions(): every dimension must occur exactly once."); return MultiArrayView (shape, stride, m_ptr); } /** transpose a 2-dimensional array. Use only if N==2. Usage:
\code typedef MultiArray<2, double>::difference_type Shape; MultiArray<2, double> array(10, 20); MultiArray<2, double, StridedArrayTag> transposed = array.transpose(); for(int i=0; i transpose () const { difference_type shape(m_shape[1], m_shape[0]), stride(m_stride[1], m_stride[0]); return MultiArrayView <2, T, StridedArrayTag>(shape, stride, m_ptr); } /** number of the elements in the array. */ difference_type_1 elementCount () const { difference_type_1 ret = m_shape[0]; for(int i = 1; i < actual_dimension; ++i) ret *= m_shape[i]; return ret; } /** number of the elements in the array. Same as elementCount(). Mostly useful to support the std::vector interface. */ difference_type_1 size () const { return elementCount(); } /** return the array's shape. */ const difference_type & shape () const { return m_shape; } /** return the array's size at a certain dimension. */ difference_type_1 size (difference_type_1 n) const { return m_shape [n]; } /** return the array's shape at a certain dimension (same as size(n)). */ difference_type_1 shape (difference_type_1 n) const { return m_shape [n]; } /** return the array's stride for every dimension. */ const difference_type & stride () const { return m_stride; } /** return the array's stride at a certain dimension. */ difference_type_1 stride (int n) const { return m_stride [n]; } /** check whether two arrays are elementwise equal. */ template bool operator==(MultiArrayView const & rhs) const { if(this->shape() != rhs.shape()) return false; return detail::equalityOfMultiArrays(traverser_begin(), shape(), rhs.traverser_begin(), MetaInt()); } /** check whether two arrays are not elementwise equal. Also true when the two arrays have different shapes. */ template bool operator!=(MultiArrayView const & rhs) const { return !operator==(rhs); } /** check whether the given point is in the array range. */ bool isInside (difference_type const & p) const { for(int d=0; d= shape(d)) return false; return true; } /** Compute the squared Euclidean norm of the array (sum of squares of the array elements). */ typename NormTraits::SquaredNormType squaredNorm() const { typedef typename NormTraits::SquaredNormType SquaredNormType; SquaredNormType res = NumericTraits::zero(); detail::sumOverMultiArray(traverser_begin(), shape(), detail::MultiArrayL2Functor(), res, MetaInt()); return res; } /** Compute various norms of the array. The norm is determined by parameter \a type:
  • type == 0: maximum norm (L-infinity): maximum of absolute values of the array elements
  • type == 1: Manhattan norm (L1): sum of absolute values of the array elements
  • type == 2: Euclidean norm (L2): square root of squaredNorm() when \a useSquaredNorm is true,
    or direct algorithm that avoids underflow/overflow otherwise.
Parameter \a useSquaredNorm has no effect when \a type != 2. Defaults: compute L2 norm as square root of squaredNorm(). */ typename NormTraits::NormType norm(int type = 2, bool useSquaredNorm = true) const; /** return the pointer to the image data */ pointer data () const { return m_ptr; } /** returns the N-dimensional MultiIterator pointing to the first element in every dimension. */ traverser traverser_begin () { traverser ret (m_ptr, m_stride.begin (), m_shape.begin ()); return ret; } /** returns the N-dimensional MultiIterator pointing to the const first element in every dimension. */ const_traverser traverser_begin () const { const_traverser ret (m_ptr, m_stride.begin (), m_shape.begin ()); return ret; } /** returns the N-dimensional MultiIterator pointing beyond the last element in dimension N, and to the first element in every other dimension. */ traverser traverser_end () { traverser ret (m_ptr, m_stride.begin (), m_shape.begin ()); ret += m_shape [actual_dimension-1]; return ret; } /** returns the N-dimensional const MultiIterator pointing beyond the last element in dimension N, and to the first element in every other dimension. */ const_traverser traverser_end () const { const_traverser ret (m_ptr, m_stride.begin (), m_shape.begin ()); ret += m_shape [actual_dimension-1]; return ret; } view_type view () { return *this; } }; template MultiArrayView & MultiArrayView ::operator=(MultiArrayView const & rhs) { if(this == &rhs) return *this; vigra_precondition(this->shape() == rhs.shape() || m_ptr == 0, "MultiArrayView::operator=(MultiArrayView const &) size mismatch - use MultiArrayView::reset()."); if(m_ptr == 0) { m_shape = rhs.m_shape; m_stride = rhs.m_stride; m_ptr = rhs.m_ptr; } else this->copyImpl(rhs); return *this; } template template bool MultiArrayView ::arraysOverlap(const MultiArrayView & rhs) const { vigra_precondition (shape () == rhs.shape (), "MultiArrayView::arraysOverlap(): shape mismatch."); const_pointer first_element = this->m_ptr, last_element = first_element + dot(this->m_shape - difference_type(1), this->m_stride); typename MultiArrayView ::const_pointer rhs_first_element = rhs.data(), rhs_last_element = rhs_first_element + dot(rhs.shape() - difference_type(1), rhs.stride()); return !(last_element < rhs_first_element || rhs_last_element < first_element); } template template void MultiArrayView ::copyImpl(const MultiArrayView & rhs) { if(!arraysOverlap(rhs)) { // no overlap -- can copy directly detail::copyMultiArrayData(rhs.traverser_begin(), shape(), traverser_begin(), MetaInt()); } else { // overlap: we got different views to the same data -- copy to intermediate memory in order to avoid // overwriting elements that are still needed on the rhs. MultiArray tmp(rhs); detail::copyMultiArrayData(tmp.traverser_begin(), shape(), traverser_begin(), MetaInt()); } } #define VIGRA_MULTI_ARRY_COMPUTED_ASSIGNMENT(name, op) \ template \ template \ MultiArrayView & \ MultiArrayView ::operator op(MultiArrayView const & rhs) \ { \ vigra_precondition(this->shape() == rhs.shape(), "MultiArrayView::operator" #op "() size mismatch."); \ if(!arraysOverlap(rhs)) \ { \ detail::name##MultiArrayData(rhs.traverser_begin(), shape(), traverser_begin(), MetaInt()); \ } \ else \ { \ MultiArray tmp(rhs); \ detail::name##MultiArrayData(tmp.traverser_begin(), shape(), traverser_begin(), MetaInt()); \ } \ return *this; \ } VIGRA_MULTI_ARRY_COMPUTED_ASSIGNMENT(copyAdd, +=) VIGRA_MULTI_ARRY_COMPUTED_ASSIGNMENT(copySub, -=) VIGRA_MULTI_ARRY_COMPUTED_ASSIGNMENT(copyMul, *=) VIGRA_MULTI_ARRY_COMPUTED_ASSIGNMENT(copyDiv, /=) #undef VIGRA_MULTI_ARRY_COMPUTED_ASSIGNMENT template template void MultiArrayView ::swapDataImpl(MultiArrayView rhs) { vigra_precondition (shape () == rhs.shape (), "MultiArrayView::swapData(): shape mismatch."); // check for overlap of this and rhs const_pointer first_element = this->m_ptr, last_element = first_element + dot(this->m_shape - difference_type(1), this->m_stride); typename MultiArrayView ::const_pointer rhs_first_element = rhs.data(), rhs_last_element = rhs_first_element + dot(rhs.shape() - difference_type(1), rhs.stride()); if(last_element < rhs_first_element || rhs_last_element < first_element) { // no overlap -- can swap directly detail::swapDataImpl(traverser_begin(), shape(), rhs.traverser_begin(), MetaInt()); } else { // overlap: we got different views to the same data -- copy to intermediate memory in order to avoid // overwriting elements that are still needed. MultiArray tmp(*this); copy(rhs); rhs.copy(tmp); } } template template MultiArrayView MultiArrayView ::bindOuter (const TinyVector &d) const { TinyVector stride; stride.init (m_stride.begin () + N-M, m_stride.end ()); pointer ptr = m_ptr + dot (d, stride); static const int NNew = (N-M == 0) ? 1 : N-M; TinyVector inner_shape, inner_stride; if (N-M == 0) { inner_shape [0] = 1; inner_stride [0] = 0; } else { inner_shape.init (m_shape.begin (), m_shape.end () - M); inner_stride.init (m_stride.begin (), m_stride.end () - M); } return MultiArrayView (inner_shape, inner_stride, ptr); } template template MultiArrayView MultiArrayView ::bindInner (const TinyVector &d) const { TinyVector stride; stride.init (m_stride.begin (), m_stride.end () - N + M); pointer ptr = m_ptr + dot (d, stride); static const int NNew = (N-M == 0) ? 1 : N-M; TinyVector outer_shape, outer_stride; if (N-M == 0) { outer_shape [0] = 1; outer_stride [0] = 0; } else { outer_shape.init (m_shape.begin () + M, m_shape.end ()); outer_stride.init (m_stride.begin () + M, m_stride.end ()); } return MultiArrayView (outer_shape, outer_stride, ptr); } template template MultiArrayView ::type > MultiArrayView ::bind (difference_type_1 d) const { static const int NNew = (N-1 == 0) ? 1 : N-1; TinyVector shape, stride; // the remaining dimensions are 0..n-1,n+1..N-1 if (N-1 == 0) { shape[0] = 1; stride[0] = 0; } else { std::copy (m_shape.begin (), m_shape.begin () + M, shape.begin ()); std::copy (m_shape.begin () + M+1, m_shape.end (), shape.begin () + M); std::copy (m_stride.begin (), m_stride.begin () + M, stride.begin ()); std::copy (m_stride.begin () + M+1, m_stride.end (), stride.begin () + M); } return MultiArrayView ::type> (shape, stride, m_ptr + d * m_stride[M]); } template MultiArrayView MultiArrayView ::bindOuter (difference_type_1 d) const { static const int NNew = (N-1 == 0) ? 1 : N-1; TinyVector inner_shape, inner_stride; if (N-1 == 0) { inner_shape [0] = 1; inner_stride [0] = 0; } else { inner_shape.init (m_shape.begin (), m_shape.end () - 1); inner_stride.init (m_stride.begin (), m_stride.end () - 1); } return MultiArrayView (inner_shape, inner_stride, m_ptr + d * m_stride [N-1]); } template MultiArrayView MultiArrayView ::bindInner (difference_type_1 d) const { static const int NNew = (N-1 == 0) ? 1 : N-1; TinyVector outer_shape, outer_stride; if (N-1 == 0) { outer_shape [0] = 1; outer_stride [0] = 0; } else { outer_shape.init (m_shape.begin () + 1, m_shape.end ()); outer_stride.init (m_stride.begin () + 1, m_stride.end ()); } return MultiArrayView (outer_shape, outer_stride, m_ptr + d * m_stride [0]); } template MultiArrayView MultiArrayView ::bindAt (difference_type_1 n, difference_type_1 d) const { vigra_precondition ( n < static_cast (N), "MultiArrayView ::bindAt(): dimension out of range."); static const int NNew = (N-1 == 0) ? 1 : N-1; TinyVector shape, stride; // the remaining dimensions are 0..n-1,n+1..N-1 if (N-1 == 0) { shape [0] = 1; stride [0] = 0; } else { std::copy (m_shape.begin (), m_shape.begin () + n, shape.begin ()); std::copy (m_shape.begin () + n+1, m_shape.end (), shape.begin () + n); std::copy (m_stride.begin (), m_stride.begin () + n, stride.begin ()); std::copy (m_stride.begin () + n+1, m_stride.end (), stride.begin () + n); } return MultiArrayView (shape, stride, m_ptr + d * m_stride[n]); } template typename NormTraits >::NormType MultiArrayView ::norm(int type, bool useSquaredNorm) const { typedef typename NormTraits::NormType NormType; switch(type) { case 0: { NormType res = NumericTraits::zero(); detail::normMaxOfMultiArray(traverser_begin(), shape(), res, MetaInt()); return res; } case 1: { NormType res = NumericTraits::zero(); detail::sumOverMultiArray(traverser_begin(), shape(), detail::MultiArrayL1Functor(), res, MetaInt()); return res; } case 2: { if(useSquaredNorm) { return sqrt((NormType)squaredNorm()); } else { NormType normMax = NumericTraits::zero(); detail::normMaxOfMultiArray(traverser_begin(), shape(), normMax, MetaInt()); if(normMax == NumericTraits::zero()) return normMax; NormType res = NumericTraits::zero(); detail::sumOverMultiArray(traverser_begin(), shape(), detail::MultiArrayScaledL2Functor(normMax), res, MetaInt()); return sqrt(res)*normMax; } } default: vigra_precondition(false, "MultiArrayView::norm(): Unknown norm type."); return NumericTraits::zero(); // unreachable } } /********************************************************/ /* */ /* norm */ /* */ /********************************************************/ template inline typename NormTraits >::SquaredNormType squaredNorm(MultiArrayView const & a) { return a.squaredNorm(); } template inline typename NormTraits >::NormType norm(MultiArrayView const & a) { return a.norm(); } /********************************************************/ /* */ /* MultiArray */ /* */ /********************************************************/ /** \brief Main MultiArray class containing the memory management. This class inherits the interface of MultiArrayView, and implements the memory ownership. MultiArray's are always unstrided, striding them creates a MultiArrayView. The template parameters are as follows \code N: the array dimension T: the type of the array elements A: the allocator used for internal storage management (default: std::allocator) \endcode \#include \<vigra/multi_array.hxx\> Namespace: vigra */ template class MultiArray : public MultiArrayView { public: using MultiArrayView ::actual_dimension; /** the allocator type used to allocate the memory */ typedef A allocator_type; /** the view type associated with this array. */ typedef MultiArrayView view_type; /** the matrix type associated with this array. */ typedef MultiArray matrix_type; /** the array's value type */ typedef typename view_type::value_type value_type; /** pointer type */ typedef typename view_type::pointer pointer; /** const pointer type */ typedef typename view_type::const_pointer const_pointer; /** reference type (result of operator[]) */ typedef typename view_type::reference reference; /** const reference type (result of operator[] const) */ typedef typename view_type::const_reference const_reference; /** size type */ typedef typename view_type::size_type size_type; /** difference type (used for multi-dimensional offsets and indices) */ typedef typename view_type::difference_type difference_type; /** difference and index type for a single dimension */ typedef typename view_type::difference_type_1 difference_type_1; /** traverser type */ typedef typename vigra::detail::MultiIteratorChooser < UnstridedArrayTag>::template Traverser ::type traverser; /** traverser type to const data */ typedef typename vigra::detail::MultiIteratorChooser < UnstridedArrayTag>::template Traverser ::type const_traverser; /** sequential (random access) iterator type */ typedef T * iterator; /** sequential (random access) const iterator type */ typedef T * const_iterator; protected: typedef typename difference_type::value_type diff_zero_t; /** the allocator used to allocate the memory */ allocator_type m_alloc; /** allocate memory for s pixels, write its address into the given pointer and initialize the pixels with init. */ void allocate (pointer &ptr, difference_type_1 s, const_reference init); /** allocate memory for s pixels, write its address into the given pointer and initialize the linearized pixels to the values of init. */ template void allocate (pointer &ptr, difference_type_1 s, U const * init); /** allocate memory, write its address into the given pointer and initialize it by copying the data from the given MultiArrayView. */ template void allocate (pointer &ptr, MultiArrayView const & init); /** deallocate the memory (of length s) starting at the given address. */ void deallocate (pointer &ptr, difference_type_1 s); template void copyOrReshape (const MultiArrayView &rhs); public: /** default constructor */ MultiArray () : MultiArrayView (difference_type (diff_zero_t(0)), difference_type (diff_zero_t(0)), 0) {} /** construct with given allocator */ MultiArray (allocator_type const & alloc) : MultiArrayView (difference_type (diff_zero_t(0)), difference_type (diff_zero_t(0)), 0), m_alloc(alloc) {} /** construct with given shape */ explicit MultiArray (const difference_type &shape, allocator_type const & alloc = allocator_type()); /** construct from shape with an initial value */ MultiArray (const difference_type &shape, const_reference init, allocator_type const & alloc = allocator_type()); /** construct from shape and copy values from the given array */ MultiArray (const difference_type &shape, const_pointer init, allocator_type const & alloc = allocator_type()); /** copy constructor */ MultiArray (const MultiArray &rhs) : MultiArrayView (rhs.m_shape, rhs.m_stride, 0), m_alloc (rhs.m_alloc) { allocate (this->m_ptr, this->elementCount (), rhs.data ()); } /** construct by copying from a MultiArrayView */ template MultiArray (const MultiArrayView &rhs, allocator_type const & alloc = allocator_type()); /** assignment.
If the size of \a rhs is the same as the left-hand side arrays's old size, only the data are copied. Otherwise, new storage is allocated, which invalidates all objects (array views, iterators) depending on the lhs array. */ MultiArray & operator= (const MultiArray &rhs) { if (this != &rhs) this->copyOrReshape(rhs); return *this; } /** assignment from arbitrary MultiArrayView.
If the size of \a rhs is the same as the left-hand side arrays's old size, only the data are copied. Otherwise, new storage is allocated, which invalidates all objects (array views, iterators) depending on the lhs array. */ template MultiArray &operator= (const MultiArrayView &rhs) { this->copyOrReshape(rhs); return *this; } /** Add-assignment from arbitrary MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArray &operator+= (const MultiArrayView &rhs) { view_type::operator+=(rhs); return *this; } /** Subtract-assignment from arbitrary MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArray &operator-= (const MultiArrayView &rhs) { view_type::operator-=(rhs); return *this; } /** Multiply-assignment from arbitrary MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArray &operator*= (const MultiArrayView &rhs) { view_type::operator*=(rhs); return *this; } /** Divide-assignment from arbitrary MultiArrayView. Fails with PreconditionViolation exception when the shapes do not match. */ template MultiArray &operator/= (const MultiArrayView &rhs) { view_type::operator/=(rhs); return *this; } /** Add-assignment of a scalar. */ MultiArray &operator+= (const T &rhs) { view_type::operator+=(rhs); return *this; } /** Subtract-assignment of a scalar. */ MultiArray &operator-= (const T &rhs) { view_type::operator-=(rhs); return *this; } /** Multiply-assignment of a scalar. */ MultiArray &operator*= (const T &rhs) { view_type::operator*=(rhs); return *this; } /** Divide-assignment of a scalar. */ MultiArray &operator/= (const T &rhs) { view_type::operator/=(rhs); return *this; } /** destructor */ ~MultiArray () { deallocate (this->m_ptr, this->elementCount ()); } /** init elements with a constant */ template MultiArray & init(const U & init) { view_type::init(init); return *this; } /** change the shape and allocate new memory.
Note: this operation invalidates all dependent objects (array views and iterators) */ void reshape (const difference_type &shape) { reshape (shape, NumericTraits ::zero ()); } /** change the shape, allocate new memory and initialize it with the given value.
Note: this operation invalidates all dependent objects (array views and iterators) */ void reshape (const difference_type &shape, const_reference init); /** Swap the contents with another MultiArray. This is fast, because no data are copied, but only pointers and shapes swapped. Note: this operation invalidates all dependent objects (array views and iterators) */ void swap (MultiArray & other); /** sequential iterator pointing to the first array element. */ iterator begin () { return this->data(); } /** sequential iterator pointing beyond the last array element. */ iterator end () { return this->data() + this->elementCount(); } /** sequential const iterator pointing to the first array element. */ const_iterator begin () const { return this->data(); } /** sequential const iterator pointing beyond the last array element. */ const_iterator end () const { return this->data() + this->elementCount(); } /** get the allocator. */ allocator_type const & allocator () const { return m_alloc; } }; template MultiArray ::MultiArray (const difference_type &shape, allocator_type const & alloc) : MultiArrayView (shape, detail::defaultStride ::actual_dimension> (shape), 0), m_alloc(alloc) { if (N == 0) { this->m_shape [0] = 1; this->m_stride [0] = 0; } allocate (this->m_ptr, this->elementCount (), NumericTraits::zero ()); } template MultiArray ::MultiArray (const difference_type &shape, const_reference init, allocator_type const & alloc) : MultiArrayView (shape, detail::defaultStride ::actual_dimension> (shape), 0), m_alloc(alloc) { if (N == 0) { this->m_shape [0] = 1; this->m_stride [0] = 0; } allocate (this->m_ptr, this->elementCount (), init); } template MultiArray ::MultiArray (const difference_type &shape, const_pointer init, allocator_type const & alloc) : MultiArrayView (shape, detail::defaultStride ::actual_dimension> (shape), 0), m_alloc(alloc) { if (N == 0) { this->m_shape [0] = 1; this->m_stride [0] = 0; } allocate (this->m_ptr, this->elementCount (), init); } template template MultiArray ::MultiArray(const MultiArrayView &rhs, allocator_type const & alloc) : MultiArrayView (rhs.shape(), detail::defaultStride ::actual_dimension>(rhs.shape()), 0), m_alloc (alloc) { allocate (this->m_ptr, rhs); } template template void MultiArray ::copyOrReshape(const MultiArrayView &rhs) { if (this->shape() == rhs.shape()) this->copy(rhs); else { MultiArray t(rhs); this->swap(t); } } template void MultiArray ::reshape (const difference_type & new_shape, const_reference initial) { if (N== 0) { return; } else if(new_shape == this->shape()) { this->init(initial); } else { difference_type new_stride = detail::defaultStride ::actual_dimension> (new_shape); difference_type_1 new_size = new_shape [MultiArrayView::actual_dimension-1] * new_stride [MultiArrayView::actual_dimension-1]; T *new_ptr; allocate (new_ptr, new_size, initial); deallocate (this->m_ptr, this->elementCount ()); this->m_ptr = new_ptr; this->m_shape = new_shape; this->m_stride = new_stride; } } template inline void MultiArray ::swap (MultiArray & other) { if (this == &other) return; std::swap(this->m_shape, other.m_shape); std::swap(this->m_stride, other.m_stride); std::swap(this->m_ptr, other.m_ptr); std::swap(this->m_alloc, other.m_alloc); } template void MultiArray ::allocate (pointer & ptr, difference_type_1 s, const_reference init) { ptr = m_alloc.allocate ((typename A::size_type)s); difference_type_1 i; try { for (i = 0; i < s; ++i) m_alloc.construct (ptr + i, init); } catch (...) { for (difference_type_1 j = 0; j < i; ++j) m_alloc.destroy (ptr + j); m_alloc.deallocate (ptr, (typename A::size_type)s); throw; } } template template void MultiArray ::allocate (pointer & ptr, difference_type_1 s, U const * init) { ptr = m_alloc.allocate ((typename A::size_type)s); difference_type_1 i; try { for (i = 0; i < s; ++i, ++init) m_alloc.construct (ptr + i, *init); } catch (...) { for (difference_type_1 j = 0; j < i; ++j) m_alloc.destroy (ptr + j); m_alloc.deallocate (ptr, (typename A::size_type)s); throw; } } template template void MultiArray ::allocate (pointer & ptr, MultiArrayView const & init) { difference_type_1 s = init.elementCount(); ptr = m_alloc.allocate ((typename A::size_type)s); pointer p = ptr; try { detail::uninitializedCopyMultiArrayData(init.traverser_begin(), init.shape(), p, m_alloc, MetaInt()); } catch (...) { for (pointer pp = ptr; pp < p; ++pp) m_alloc.destroy (pp); m_alloc.deallocate (ptr, (typename A::size_type)s); throw; } } template inline void MultiArray ::deallocate (pointer & ptr, difference_type_1 s) { if (ptr == 0) return; for (difference_type_1 i = 0; i < s; ++i) m_alloc.destroy (ptr + i); m_alloc.deallocate (ptr, (typename A::size_type)s); ptr = 0; } /********************************************************/ /* */ /* argument object factories */ /* */ /********************************************************/ template inline triple::const_traverser, typename MultiArrayView::difference_type, typename AccessorTraits::default_const_accessor > srcMultiArrayRange( MultiArrayView const & array ) { return triple::const_traverser, typename MultiArrayView::difference_type, typename AccessorTraits::default_const_accessor > ( array.traverser_begin(), array.shape(), typename AccessorTraits::default_const_accessor() ); } template inline triple::const_traverser, typename MultiArrayView::difference_type, Accessor > srcMultiArrayRange( MultiArrayView const & array, Accessor a ) { return triple::const_traverser, typename MultiArrayView::difference_type, Accessor > ( array.traverser_begin(), array.shape(), a); } template inline pair::const_traverser, typename AccessorTraits::default_const_accessor > srcMultiArray( MultiArrayView const & array ) { return pair::const_traverser, typename AccessorTraits::default_const_accessor > ( array.traverser_begin(), typename AccessorTraits::default_const_accessor() ); } template inline pair::const_traverser, Accessor > srcMultiArray( MultiArrayView const & array, Accessor a ) { return pair::const_traverser, Accessor > ( array.traverser_begin(), a ); } template inline triple::traverser, typename MultiArrayView::difference_type, typename AccessorTraits::default_accessor > destMultiArrayRange( MultiArrayView & array ) { return triple::traverser, typename MultiArrayView::difference_type, typename AccessorTraits::default_accessor > ( array.traverser_begin(), array.shape(), typename AccessorTraits::default_accessor() ); } template inline triple::traverser, typename MultiArrayView::difference_type, Accessor > destMultiArrayRange( MultiArrayView & array, Accessor a ) { return triple::traverser, typename MultiArrayView::difference_type, Accessor > ( array.traverser_begin(), array.shape(), a ); } template inline pair::traverser, typename AccessorTraits::default_accessor > destMultiArray( MultiArrayView & array ) { return pair::traverser, typename AccessorTraits::default_accessor > ( array.traverser_begin(), typename AccessorTraits::default_accessor() ); } template inline pair::traverser, Accessor > destMultiArray( MultiArrayView & array, Accessor a ) { return pair::traverser, Accessor > ( array.traverser_begin(), a ); } /********************************************************/ /* */ /* makeBasicImageView */ /* */ /********************************************************/ /** \addtogroup MultiArrayToImage Wrap a \ref vigra::MultiArrayView in a \ref vigra::BasicImageView */ //@{ /** Create a \ref vigra::BasicImageView from an unstrided 2-dimensional \ref vigra::MultiArrayView. The \ref vigra::BasicImageView will have the same value_type as the original \ref vigra::MultiArrayView. */ template BasicImageView makeBasicImageView (MultiArrayView <2, T, UnstridedArrayTag> const &array) { return BasicImageView (array.data (), array.shape (0), array.shape (1)); } /** Create a \ref vigra::BasicImageView from a 3-dimensional \ref vigra::MultiArray. This wrapper flattens the two innermost dimensions of the array into single rows of the resulting image. The \ref vigra::BasicImageView will have the same value_type as the original \ref vigra::MultiArray. */ template BasicImageView makeBasicImageView (MultiArray <3, T> const &array) { return BasicImageView (array.data (), array.shape (0)*array.shape (1), array.shape (2)); } /** Create a \ref vigra::BasicImageView from a 3-dimensional \ref vigra::MultiArray. This wrapper only works if T is a scalar type and the array's innermost dimension has size 3. It then re-interprets the data array as a 2-dimensional array with value_type RGBValue. */ template BasicImageView > makeRGBImageView (MultiArray<3, T> const &array) { vigra_precondition ( array.shape (0) == 3, "makeRGBImageView(): array.shape(0) must be 3."); return BasicImageView > ( reinterpret_cast *> (array.data ()), array.shape (1), array.shape (2)); } //@} } // namespace vigra #endif // VIGRA_MULTI_ARRAY_HXX gamera-3.3.3/include/vigra/multi_convolution.hxx0000644000076500000000000007112011261456425021026 0ustar chriswheel//-- -*- c++ -*- /************************************************************************/ /* */ /* Copyright 2003 by Christian-Dennis Rahn */ /* and Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MULTI_CONVOLUTION_H #define VIGRA_MULTI_CONVOLUTION_H #include "separableconvolution.hxx" #include "array_vector.hxx" #include "multi_array.hxx" #include "accessor.hxx" #include "numerictraits.hxx" #include "navigator.hxx" #include "metaprogramming.hxx" #include "multi_pointoperators.hxx" namespace vigra { namespace detail { /********************************************************/ /* */ /* internalSeparableConvolveMultiArray */ /* */ /********************************************************/ template void internalSeparableConvolveMultiArrayTmp( SrcIterator si, SrcShape const & shape, SrcAccessor src, DestIterator di, DestAccessor dest, KernelIterator kit) { enum { N = 1 + SrcIterator::level }; typedef typename NumericTraits::RealPromote TmpType; // temporay array to hold the current line to enable in-place operation ArrayVector tmp( shape[0] ); typedef MultiArrayNavigator SNavigator; typedef MultiArrayNavigator DNavigator; { // only operate on first dimension here SNavigator snav( si, shape, 0 ); DNavigator dnav( di, shape, 0 ); for( ; snav.hasMore(); snav++, dnav++ ) { // first copy source to temp for maximum cache efficiency copyLine( snav.begin(), snav.end(), src, tmp.begin(), typename AccessorTraits::default_accessor() ); convolveLine( srcIterRange(tmp.begin(), tmp.end(), typename AccessorTraits::default_const_accessor()), destIter( dnav.begin(), dest ), kernel1d( *kit ) ); } ++kit; } // operate on further dimensions for( int d = 1; d < N; ++d, ++kit ) { DNavigator dnav( di, shape, d ); tmp.resize( shape[d] ); for( ; dnav.hasMore(); dnav++ ) { // first copy source to temp for maximum cache efficiency copyLine( dnav.begin(), dnav.end(), dest, tmp.begin(), typename AccessorTraits::default_accessor() ); convolveLine( srcIterRange(tmp.begin(), tmp.end(), typename AccessorTraits::default_const_accessor()), destIter( dnav.begin(), dest ), kernel1d( *kit ) ); } } } } // namespace detail /** \addtogroup MultiArrayConvolutionFilters Convolution filters for multi-dimensional arrays. These functions realize a separable convolution on an arbitrary dimensional array that is specified by iterators (compatible to \ref MultiIteratorPage) and shape objects. It can therefore be applied to a wide range of data structures (\ref vigra::MultiArrayView, \ref vigra::MultiArray etc.). */ //@{ /********************************************************/ /* */ /* separableConvolveMultiArray */ /* */ /********************************************************/ /** \brief Separated convolution on multi-dimensional arrays. This function computes a separated convolution on all dimensions of the given multi-dimensional array. Both source and destination arrays are represented by iterators, shape objects and accessors. The destination array is required to already have the correct size. There are two variants of this functions: one takes a single kernel of type \ref vigra::Kernel1D which is then applied to all dimensions, whereas the other requires an iterator referencing a sequence of \ref vigra::Kernel1D objects, one for every dimension of the data. Then the first kernel in this sequence is applied to the innermost dimension (e.g. the x-dimension of an image), while the last is applied to the outermost dimension (e.g. the z-dimension in a 3D image). This function may work in-place, which means that siter == diter is allowed. A full-sized internal array is only allocated if working on the destination array directly would cause round-off errors (i.e. if typeid(typename NumericTraits::RealPromote) != typeid(typename DestAccessor::value_type). Declarations: pass arguments explicitly: \code namespace vigra { // apply the same kernel to all dimensions template void separableConvolveMultiArray(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, Kernel1D const & kernel); // apply each kernel from the sequence `kernels³ in turn template void separableConvolveMultiArray(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, KernelIterator kernels); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { // apply the same kernel to all dimensions template void separableConvolveMultiArray(triple const & source, pair const & dest, Kernel1D const & kernel); // apply each kernel from the sequence `kernels³ in turn template void separableConvolveMultiArray(triple const & source, pair const & dest, KernelIterator kernels); } \endcode Usage: \#include \<vigra/multi_convolution.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, float> dest(shape); ... Kernel1D gauss; gauss.initGaussian(sigma); // create 3 Gauss kernels, one for each dimension ArrayVector > kernels(3, gauss); // perform Gaussian smoothing on all dimensions separableConvolveMultiArray(srcMultiArrayRange(source), destMultiArray(dest), kernels.begin()); \endcode \see vigra::Kernel1D, convolveLine() */ doxygen_overloaded_function(template <...> void separableConvolveMultiArray) template void separableConvolveMultiArray( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, KernelIterator kernels ) { typedef typename NumericTraits::RealPromote TmpType; if(!IsSameType::boolResult) { // need a temporary array to avoid rounding errors MultiArray tmpArray(shape); detail::internalSeparableConvolveMultiArrayTmp( s, shape, src, tmpArray.traverser_begin(), typename AccessorTraits::default_accessor(), kernels ); copyMultiArray(srcMultiArrayRange(tmpArray), destIter(d, dest)); } else { // work directly on the destination array detail::internalSeparableConvolveMultiArrayTmp( s, shape, src, d, dest, kernels ); } } template inline void separableConvolveMultiArray( triple const & source, pair const & dest, KernelIterator kit ) { separableConvolveMultiArray( source.first, source.second, source.third, dest.first, dest.second, kit ); } template inline void separableConvolveMultiArray( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, Kernel1D const & kernel ) { ArrayVector > kernels(shape.size(), kernel); separableConvolveMultiArray( s, shape, src, d, dest, kernels.begin() ); } template inline void separableConvolveMultiArray(triple const & source, pair const & dest, Kernel1D const & kernel ) { ArrayVector > kernels(source.second.size(), kernel); separableConvolveMultiArray( source.first, source.second, source.third, dest.first, dest.second, kernels.begin() ); } /********************************************************/ /* */ /* convolveMultiArrayOneDimension */ /* */ /********************************************************/ /** \brief Convolution along a single dimension of a multi-dimensional arrays. This function computes a convolution along one dimension (specified by the parameter dim of the given multi-dimensional array with the given kernel. Both source and destination arrays are represented by iterators, shape objects and accessors. The destination array is required to already have the correct size. This function may work in-place, which means that siter == diter is allowed. Declarations: pass arguments explicitly: \code namespace vigra { template void convolveMultiArrayOneDimension(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, unsigned int dim, vigra::Kernel1D const & kernel); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void convolveMultiArrayOneDimension(triple const & source, pair const & dest, unsigned int dim, vigra::Kernel1D const & kernel); } \endcode Usage: \#include \<vigra/multi_convolution.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, float> dest(shape); ... Kernel1D gauss; gauss.initGaussian(sigma); // perform Gaussian smoothing along dimensions 1 (height) convolveMultiArrayOneDimension(srcMultiArrayRange(source), destMultiArray(dest), 1, gauss); \endcode \see separableConvolveMultiArray() */ doxygen_overloaded_function(template <...> void convolveMultiArrayOneDimension) template void convolveMultiArrayOneDimension(SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, unsigned int dim, vigra::Kernel1D const & kernel ) { enum { N = 1 + SrcIterator::level }; vigra_precondition( dim < N, "convolveMultiArrayOneDimension(): The dimension number to convolve must be smaller " "than the data dimensionality" ); typedef typename NumericTraits::RealPromote TmpType; ArrayVector tmp( shape[dim] ); typedef MultiArrayNavigator SNavigator; typedef MultiArrayNavigator DNavigator; SNavigator snav( s, shape, dim ); DNavigator dnav( d, shape, dim ); for( ; snav.hasMore(); snav++, dnav++ ) { // first copy source to temp for maximum cache efficiency copyLine( snav.begin(), snav.end(), src, tmp.begin(), typename AccessorTraits::default_accessor() ); convolveLine( srcIterRange( tmp.begin(), tmp.end(), typename AccessorTraits::default_const_accessor()), destIter( dnav.begin(), dest ), kernel1d( kernel ) ); } } template inline void convolveMultiArrayOneDimension(triple const & source, pair const & dest, unsigned int dim, vigra::Kernel1D const & kernel ) { convolveMultiArrayOneDimension( source.first, source.second, source.third, dest.first, dest.second, dim, kernel ); } /********************************************************/ /* */ /* gaussianSmoothMultiArray */ /* */ /********************************************************/ /** \brief Isotropic Gaussian smoothing of a multi-dimensional arrays. This function computes an isotropic convolution of the given multi-dimensional array with a Gaussian filter at the given standard deviation sigma. Both source and destination arrays are represented by iterators, shape objects and accessors. The destination array is required to already have the correct size. This function may work in-place, which means that siter == diter is allowed. It is implemented by a call to \ref separableConvolveMultiArray() with the appropriate kernel. If the data are anisotropic (different pixel size along different dimensions) you should call \ref separableConvolveMultiArray() directly with the appropriate anisotropic Gaussians. Declarations: pass arguments explicitly: \code namespace vigra { template void gaussianSmoothMultiArray(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, double sigma); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void gaussianSmoothMultiArray(triple const & source, pair const & dest, double sigma); } \endcode Usage: \#include \<vigra/multi_convolution.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, float> dest(shape); ... // perform isotropic Gaussian smoothing at scale `sigma³ gaussianSmoothMultiArray(srcMultiArrayRange(source), destMultiArray(dest), sigma); \endcode \see separableConvolveMultiArray() */ doxygen_overloaded_function(template <...> void gaussianSmoothMultiArray) template void gaussianSmoothMultiArray( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, double sigma ) { typedef typename NumericTraits::RealPromote kernel_type; Kernel1D gauss; gauss.initGaussian( sigma ); separableConvolveMultiArray( s, shape, src, d, dest, gauss); } template inline void gaussianSmoothMultiArray(triple const & source, pair const & dest, double sigma ) { gaussianSmoothMultiArray( source.first, source.second, source.third, dest.first, dest.second, sigma ); } /********************************************************/ /* */ /* gaussianGradientMultiArray */ /* */ /********************************************************/ /** \brief Calculate Gaussian gradient of a multi-dimensional arrays. This function computes the Gaussian gradient of the given multi-dimensional array with a sequence of first-derivative-of-Gaussian filters at the given standard deviation sigma (differentiation is applied to each dimension in turn, starting with the innermost dimension). Both source and destination arrays are represented by iterators, shape objects and accessors. The destination array is required to have a vector valued pixel type with as many elements as the number of dimensions. This function is implemented by calls to \ref separableConvolveMultiArray() with the appropriate kernels. If the data are anisotropic (different pixel size along different dimensions) you should call \ref separableConvolveMultiArray() directly with the appropriate anisotropic Gaussian derivatives. Declarations: pass arguments explicitly: \code namespace vigra { template void gaussianGradientMultiArray(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, double sigma); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void gaussianGradientMultiArray(triple const & source, pair const & dest, double sigma); } \endcode Usage: \#include \<vigra/multi_convolution.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, TinyVector > dest(shape); ... // compute Gaussian gradient at scale sigma gaussianGradientMultiArray(srcMultiArrayRange(source), destMultiArray(dest), sigma); \endcode Required Interface: see \ref convolveImage(), in addition: \code int dimension = 0; VectorElementAccessor elementAccessor(0, dest); \endcode \see separableConvolveMultiArray() */ doxygen_overloaded_function(template <...> void gaussianGradientMultiArray) template void gaussianGradientMultiArray( SrcIterator si, SrcShape const & shape, SrcAccessor src, DestIterator di, DestAccessor dest, double sigma ) { typedef typename DestAccessor::value_type DestType; typedef typename NumericTraits::RealPromote kernel_type; Kernel1D gauss, derivative; gauss.initGaussian(sigma); derivative.initGaussianDerivative(sigma, 1); typedef VectorElementAccessor ElementAccessor; // compute gradient components for(unsigned int d = 0; d < shape.size(); ++d ) { ArrayVector > kernels(shape.size(), gauss); kernels[d] = derivative; separableConvolveMultiArray( si, shape, src, di, ElementAccessor(d, dest), kernels.begin()); } } template inline void gaussianGradientMultiArray(triple const & source, pair const & dest, double sigma ) { gaussianGradientMultiArray( source.first, source.second, source.third, dest.first, dest.second, sigma ); } /********************************************************/ /* */ /* symmetricGradientMultiArray */ /* */ /********************************************************/ /** \brief Calculate gradient of a multi-dimensional arrays using symmetric difference filters. This function computes the gradient of the given multi-dimensional array with a sequence of symmetric difference filters a (differentiation is applied to each dimension in turn, starting with the innermost dimension). Both source and destination arrays are represented by iterators, shape objects and accessors. The destination array is required to have a vector valued pixel type with as many elements as the number of dimensions. This function is implemented by calls to \ref convolveMultiArrayOneDimension() with the symmetric difference kernel. Declarations: pass arguments explicitly: \code namespace vigra { template void symmetricGradientMultiArray(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void symmetricGradientMultiArray(triple const & source, pair const & dest); } \endcode Usage: \#include \<vigra/multi_convolution.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, TinyVector > dest(shape); ... // compute gradient symmetricGradientMultiArray(srcMultiArrayRange(source), destMultiArray(dest)); \endcode Required Interface: see \ref convolveImage(), in addition: \code int dimension = 0; VectorElementAccessor elementAccessor(0, dest); \endcode \see convolveMultiArrayOneDimension() */ doxygen_overloaded_function(template <...> void symmetricGradientMultiArray) template void symmetricGradientMultiArray(SrcIterator si, SrcShape const & shape, SrcAccessor src, DestIterator di, DestAccessor dest) { typedef typename DestAccessor::value_type DestType; typedef typename NumericTraits::RealPromote kernel_type; Kernel1D filter; filter.initSymmetricGradient(); typedef VectorElementAccessor ElementAccessor; // compute gradient components for(unsigned int d = 0; d < shape.size(); ++d ) { convolveMultiArrayOneDimension(si, shape, src, di, ElementAccessor(d, dest), d, filter); } } template inline void symmetricGradientMultiArray(triple const & source, pair const & dest ) { symmetricGradientMultiArray(source.first, source.second, source.third, dest.first, dest.second); } //@} } //-- namespace vigra #endif //-- VIGRA_MULTI_CONVOLUTION_H gamera-3.3.3/include/vigra/multi_distance.hxx0000644000076500000000000005267111261456425020253 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2003-2007 by Kasim Terzic, Christian-Dennis Rahn */ /* and Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MULTI_DISTANCE_HXX #define VIGRA_MULTI_DISTANCE_HXX #include #include #include "array_vector.hxx" #include "multi_array.hxx" #include "accessor.hxx" #include "numerictraits.hxx" #include "navigator.hxx" #include "metaprogramming.hxx" #include "multi_pointoperators.hxx" #include "functorexpression.hxx" namespace vigra { namespace detail { /********************************************************/ /* */ /* distParabola */ /* */ /* Version with sigma (parabola spread) for morphology */ /* */ /********************************************************/ template void distParabola(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor da, float sigma ) { // We assume that the data in the input is distance squared and treat it as such int w = iend - is; typedef typename NumericTraits::ValueType ValueType; typedef typename NumericTraits::RealPromote SumType; // Define the stack we use to determine the nearest background row // (from previous dimension), the items on the stack will separate this column into // separate regions of influence. Each region of influence is closest to the same // background row from the previous dimension. typedef triple influence; std::vector _stack; SrcIterator ibegin = is; _stack.push_back(influence(0, sa(is), w)); ++is; int current = 1; int y0, y1, y2, y_dash, delta_y; sigma = sigma * sigma; bool nosigma = closeAtTolerance( sigma, 1.0 ); y0 = 0; // The beginning of the influence of row y1 while( is != iend && current < w ) { y1 = _stack.back().first; y2 = current; delta_y = y2 - y1; // If sigma is 1 (common case) avoid float multiplication here. if(nosigma) y_dash = (int)(sa(is) - _stack.back().second) - delta_y*delta_y; else y_dash = (int)(sigma * (sa(is) - _stack.back().second)) - delta_y*delta_y; y_dash = y_dash / (delta_y + delta_y); y_dash += y2; if( y_dash > y0) { if( y_dash <= w ) // CASE 2 -- A new region of influence { y0 = y_dash; _stack.back().third = y_dash; _stack.push_back(influence(current, sa(is), w)); } // CASE 1 -- This parabola is never active ++is; ++current; continue; } else // CASE 3 -- Parabola shadows the previous one completely { _stack.pop_back(); if(_stack.size() < 2) y0=0; else y0=_stack[_stack.size()-2].third; if(_stack.empty()) // This row influences all previous rows. { _stack.push_back(influence(current, sa(is), w)); ++is; ++current; continue; } } } // Now we have the stack indicating which rows are influenced by (and therefore // closest to) which row. We can go through the stack and calculate the // distance squared for each element of the column. typename std::vector::iterator it = _stack.begin(); ValueType distance = 0; // The distance squared current = 0; delta_y = 0; is = ibegin; for(; is != iend; ++current, ++id, ++is) { // FIXME FIXME Bound checking incorrect here? vvv if( current >= (*it).third && it != _stack.end()) ++it; // FIXME FIXME The following check speeds things up for distance, but completely // messes up the grayscale morphology. Use an extra flag??? /* if( *is == 0 ) // Skip background pixels { *id = 0; continue; } */ delta_y = current - (*it).first; distance = delta_y * delta_y + (*it).second; *id = distance; } } template inline void distParabola(triple src, pair dest, float sigma ) { distParabola(src.first, src.second, src.third, dest.first, dest.second, sigma); } /********************************************************/ /* */ /* internalSeparableMultiArrayDistTmp */ /* */ /********************************************************/ template void internalSeparableMultiArrayDistTmp( SrcIterator si, SrcShape const & shape, SrcAccessor src, DestIterator di, DestAccessor dest, float sigma, bool invert) { // Sigma is the spread of the parabolas and is only used for ND morphology. When // calculating the distance transform, it is set to 1 enum { N = 1 + SrcIterator::level }; // we need the Promote type here if we want to invert the image (dilation) typedef typename NumericTraits::Promote TmpType; // temporary array to hold the current line to enable in-place operation ArrayVector tmp( shape[0] ); typedef MultiArrayNavigator SNavigator; typedef MultiArrayNavigator DNavigator; // only operate on first dimension here SNavigator snav( si, shape, 0 ); DNavigator dnav( di, shape, 0 ); using namespace vigra::functor; for( ; snav.hasMore(); snav++, dnav++ ) { // first copy source to temp for maximum cache efficiency // Invert the values if necessary. Only needed for grayscale morphology if(invert) transformLine( snav.begin(), snav.end(), src, tmp.begin(), typename AccessorTraits::default_accessor(), Param(NumericTraits::zero())-Arg1()); else copyLine( snav.begin(), snav.end(), src, tmp.begin(), typename AccessorTraits::default_accessor() ); detail::distParabola( srcIterRange(tmp.begin(), tmp.end(), typename AccessorTraits::default_const_accessor()), destIter( dnav.begin(), dest ), sigma ); } // operate on further dimensions for( int d = 1; d < N; ++d ) { DNavigator dnav( di, shape, d ); tmp.resize( shape[d] ); for( ; dnav.hasMore(); dnav++ ) { // first copy source to temp for maximum cache efficiency copyLine( dnav.begin(), dnav.end(), dest, tmp.begin(), typename AccessorTraits::default_accessor() ); detail::distParabola( srcIterRange(tmp.begin(), tmp.end(), typename AccessorTraits::default_const_accessor()), destIter( dnav.begin(), dest ), sigma ); } } if(invert) transformMultiArray( di, shape, dest, di, dest, -Arg1()); } template inline void internalSeparableMultiArrayDistTmp( SrcIterator si, SrcShape const & shape, SrcAccessor src, DestIterator di, DestAccessor dest, float sigma) { internalSeparableMultiArrayDistTmp( si, shape, src, di, dest, sigma, false ); } template inline void internalSeparableMultiArrayDistTmp( SrcIterator si, SrcShape const & shape, SrcAccessor src, DestIterator di, DestAccessor dest) { internalSeparableMultiArrayDistTmp( si, shape, src, di, dest, 1, false ); } } // namespace detail /** \addtogroup MultiArrayDistanceTransform Euclidean distance transform for multi-dimensional arrays. These functions perform the Euclidean distance transform an arbitrary dimensional array that is specified by iterators (compatible to \ref MultiIteratorPage) and shape objects. It can therefore be applied to a wide range of data structures (\ref vigra::MultiArrayView, \ref vigra::MultiArray etc.). */ //@{ /********************************************************/ /* */ /* separableMultiDistSquared */ /* */ /********************************************************/ /** \brief Euclidean distance squared on multi-dimensional arrays. Declarations: pass arguments explicitly: \code namespace vigra { // apply the same kernel to all dimensions template void separableMultiDistSquared(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, bool background); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void separableMultiDistance(triple const & source, pair const & dest, bool background); } \endcode This function performs a Euclidean distance squared transform on the given multi-dimensional array. Both source and destination arrays are represented by iterators, shape objects and accessors. The destination array is required to already have the correct size. This function expects a mask as its source, where background pixels are marked as zero, and non-background pixels as non-zero. If the parameter background is true, then the squared distance of all background pixels to the nearest object is calculated. Otherwise, the distance of all object pixels to the nearest background pixel is calculated. This function may work in-place, which means that siter == diter is allowed. A full-sized internal array is only allocated if working on the destination array directly would cause overflow errors (i.e. if typeid(typename DestAccessor::value_type) < N * M*M, where M is the size of the largest dimension of the array. Usage: \#include \<vigra/multi_distance.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, unsigned int> dest(shape); ... // Calculate Euclidean distance squared for all background pixels separableMultiDistSquared(srcMultiArrayRange(source), destMultiArray(dest), true); \endcode \see vigra::distanceTransform() */ doxygen_overloaded_function(template <...> void separableMultiDistSquared) template void separableMultiDistSquared( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, bool background) { typedef typename NumericTraits::ValueType DestType; typedef typename NumericTraits::Promote TmpType; DestType MaxValue = NumericTraits::max(); enum { N = 1 + SrcIterator::level }; int MaxDim = 0; for( int i=0; i MaxValue) // need a temporary array to avoid overflows { // Threshold the values so all objects have infinity value in the beginning MultiArray tmpArray(shape); if(background == true) transformMultiArray( s, shape, src, tmpArray.traverser_begin(), typename AccessorTraits::default_accessor(), ifThenElse( Arg1() == Param(0), Param(MaxDist), Param(0) )); else transformMultiArray( s, shape, src, tmpArray.traverser_begin(), typename AccessorTraits::default_accessor(), ifThenElse( Arg1() != Param(0), Param(MaxDist), Param(0) )); detail::internalSeparableMultiArrayDistTmp( tmpArray.traverser_begin(), shape, typename AccessorTraits::default_accessor(), tmpArray.traverser_begin(), typename AccessorTraits::default_accessor()); //copyMultiArray(srcMultiArrayRange(tmpArray), destIter(d, dest)); transformMultiArray( tmpArray.traverser_begin(), shape, typename AccessorTraits::default_accessor(), d, dest, ifThenElse( Arg1() > Param(MaxValue), Param(MaxValue), Arg1() ) ); } else // work directly on the destination array { // Threshold the values so all objects have infinity value in the beginning if(background == true) transformMultiArray( s, shape, src, d, dest, ifThenElse( Arg1() == Param(0), Param(MaxDist), Param(0) )); else transformMultiArray( s, shape, src, d, dest, ifThenElse( Arg1() != Param(0), Param(MaxDist), Param(0) )); detail::internalSeparableMultiArrayDistTmp( d, shape, dest, d, dest); } } template inline void separableMultiDistSquared( triple const & source, pair const & dest, bool background) { separableMultiDistSquared( source.first, source.second, source.third, dest.first, dest.second, background ); } /********************************************************/ /* */ /* separableMultiDistance */ /* */ /********************************************************/ /** \brief Euclidean distance on multi-dimensional arrays. Declarations: pass arguments explicitly: \code namespace vigra { // apply the same kernel to all dimensions template void separableMultiDistance(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, bool background); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void separableMultiDistance(triple const & source, pair const & dest, bool background); } \endcode This function performs a Euclidean distance transform on the given multi-dimensional array. Both source and destination arrays are represented by iterators, shape objects and accessors. The destination array is required to already have the correct size. This function expects a mask as its source, where background pixels are marked as zero, and non-background pixels as non-zero. If the parameter background is true, then the squared distance of all background pixels to the nearest object is calculated. Otherwise, the distance of all object pixels to the nearest background pixel is calculated. This function may work in-place, which means that siter == diter is allowed. A full-sized internal array is only allocated if working on the destination array directly would cause overflow errors (i.e. if typeid(typename DestAccessor::value_type) < N * M*M, where M is the size of the largest dimension of the array. Usage: \#include \<vigra/multi_distance.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, unsigned float> dest(shape); ... // Calculate Euclidean distance squared for all background pixels separableMultiDistance(srcMultiArrayRange(source), destMultiArray(dest), true); \endcode \see vigra::distanceTransform() */ doxygen_overloaded_function(template <...> void separableMultiDistance) template void separableMultiDistance( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, bool background) { separableMultiDistSquared( s, shape, src, d, dest, background); // Finally, calculate the square root of the distances transformMultiArray( d, shape, dest, d, dest, (double(*)(double))&std::sqrt ); } template inline void separableMultiDistance( triple const & source, pair const & dest, bool background) { separableMultiDistance( source.first, source.second, source.third, dest.first, dest.second, background ); } //@} } //-- namespace vigra #endif //-- VIGRA_MULTI_DISTANCE_HXX gamera-3.3.3/include/vigra/multi_impex.hxx0000644000076500000000000003773611261456425017610 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2003 by Gunnar Kedenburg */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MULTI_IMPEX_HXX #define VIGRA_MULTI_IMPEX_HXX #include #include #include #include #include #include #include "config.hxx" #include "basicimageview.hxx" #include "impex.hxx" #include "multi_array.hxx" #include "multi_pointoperators.hxx" #ifdef _MSC_VER # include #else # include #endif namespace vigra { class VolumeImportInfo { public: typedef ImageImportInfo::PixelType PixelType; /// type of volume size returned by shape() typedef MultiArrayShape<3>::type ShapeType; /// provided for backwards-compatibility (deprecated) typedef ShapeType size_type; /// 3D resolution type returned by resolution() typedef TinyVector Resolution; VIGRA_EXPORT VolumeImportInfo(const std::string &filename); VIGRA_EXPORT VolumeImportInfo(const std::string &baseName, const std::string &extension); VIGRA_EXPORT ShapeType shape() const { return shape_; } /** * resolution() contains the alignment and resolution of the * volume. resolution()[0] is the x increment in a left-handed * world coordinate system of one unstrided step in the volume * memory. The [1] and [2] elements contain the y resp. z * increments of the strided row resp. slice steps in the * volume. * * EXAMPLES: (1.f, 1.f, 4.f) means that the slices are four * times thicker than the x/y resolution. * (1.f, -1.f, 1.f) means that the volume coordinate system is * right-handed. */ VIGRA_EXPORT Resolution resolution() const { return resolution_; } VIGRA_EXPORT PixelType pixelType() const { return pixelType_; } VIGRA_EXPORT int numBands() const { return numBands_; } VIGRA_EXPORT bool isGrayscale() const { return numBands_ == 1; } VIGRA_EXPORT bool isColor() const { return numBands_ > 1; } // get base file name without path, image index, and extension VIGRA_EXPORT const std::string &name() const { return name_; } VIGRA_EXPORT const std::string &description() const { return description_; } template void importImpl(MultiArray <3, T, Allocator> &volume) const; protected: void getVolumeInfoFromFirstSlice(const std::string &filename); size_type shape_; Resolution resolution_; PixelType pixelType_; int numBands_; std::string path_, name_, description_; std::string rawFilename_; std::string baseName_, extension_; std::vector numbers_; }; template void VolumeImportInfo::importImpl(MultiArray <3, T, Allocator> &volume) const { volume.reshape(this->shape()); if(rawFilename_.size()) { std::string dirName, baseName; char oldCWD[2048]; #ifdef _MSC_VER _getcwd(oldCWD, 2048); if(_chdir(path_.c_str())) perror("chdir"); #else getcwd(oldCWD, 2048); if(chdir(path_.c_str())) perror("chdir"); #endif std::ifstream s(rawFilename_.c_str(), std::ios::binary); vigra_precondition(s.good(), "RAW file could not be opened"); s.read((char*)volume.begin(), shape_[0]*shape_[1]*shape_[2]*sizeof(T)); #ifdef _MSC_VER _chdir(oldCWD); #else chdir(oldCWD); #endif vigra_postcondition( volume.shape() == shape(), "imported volume has wrong size"); } else { for (unsigned int i = 0; i < numbers_.size(); ++i) { // build the filename std::string name = baseName_ + numbers_[i] + extension_; // import the image ImageImportInfo info (name.c_str ()); // generate a basic image view to the current layer MultiArrayView <2, T> array_view (volume.bindOuter (i)); BasicImageView view = makeBasicImageView (array_view); vigra_precondition(view.size() == info.size(), "importVolume(): image size mismatch."); importImage (info, destImage(view)); } } } VIGRA_EXPORT void findImageSequence(const std::string &name_base, const std::string &name_ext, std::vector & numbers); /** \addtogroup VolumeImpex Import/export of volume data. */ //@{ /********************************************************/ /* */ /* importVolume */ /* */ /********************************************************/ /** \brief Function for importing a 3D volume. The data are expected to be stored in a by-slice manner, where the slices are enumerated from name_base+"[0-9]+"+name_ext. name_base may contain a path. All slice files with the same name base and extension are considered part of the same volume. Slice numbers must be non-negative, but can otherwise start anywhere and need not be successive. Slices will be read in ascending numerical (not lexicographic) order. All slices must have the same size. The volume will be reshaped to match the count and size of the slices found. \#include \<vigra/multi_impex.hxx\> Namespace: vigra */ template void importVolume (MultiArray <3, T, Allocator> & volume, const std::string &name_base, const std::string &name_ext) { VolumeImportInfo info(name_base, name_ext); info.importImpl(volume); } /** \brief Function for importing a 3D volume. The data can be given in two ways:
  • If the volume is stored in a by-slice manner (e.g. one image per slice), the filename can refer to an arbitrary image from the set. importVolume() then assumes that the slices are enumerated like name_base+"[0-9]+"+name_ext, where name_base, the index, and name_ext are determined automatically. All slice files with the same name base and extension are considered part of the same volume. Slice numbers must be non-negative, but can otherwise start anywhere and need not be successive. Slices will be read in ascending numerical (not lexicographic) order. All slices must have the same size.
  • Otherwise, importVolume() will try to read filename as an info text file with the following key-value pairs:
    • name = [short descriptive name of the volume] (optional)
    • filename = [absolute or relative path to raw voxel data file] (required)
    • gradfile = [absolute or relative path to gradient data file] (currently ignored)
    • description = [arbitrary description of the data set] (optional)
    • width = [positive integer] (required)
    • height = [positive integer] (required)
    • depth = [positive integer] (required)
    • datatype = [UNSIGNED_CHAR | UNSIGNED_BYTE] (default: UNSIGNED_CHAR)
    The voxel type is currently assumed to be binary compatible to the value_type T of the MuliArray. Lines starting with "#" are ignored.
In either case, the volume will be reshaped to match the count and size of the slices found. \#include \<vigra/multi_impex.hxx\> Namespace: vigra */ template void importVolume(MultiArray <3, T, Allocator> &volume, const std::string &filename) { VolumeImportInfo info(filename); info.importImpl(volume); } /** \brief Function for importing a 3D volume. Read the volume data set info refers to. Explicit construction of the info object allows to allocate a volume object type whose value_type matches the voxel type of the stored data. The volume will be reshaped to match the count and size of the slices found. \#include \<vigra/multi_impex.hxx\> Namespace: vigra */ template void importVolume(VolumeImportInfo const & info, MultiArray <3, T, Allocator> &volume) { info.importImpl(volume); } namespace detail { template void setRangeMapping(std::string const & pixeltype, FindMinMax const & minmax, ImageExportInfo & info) { if(pixeltype == "UINT8") info.setForcedRangeMapping(minmax.min, minmax.max, (double)NumericTraits::min(), (double)NumericTraits::max()); else if(pixeltype == "INT16") info.setForcedRangeMapping(minmax.min, minmax.max, (double)NumericTraits::min(), (double)NumericTraits::max()); else if(pixeltype == "UINT16") info.setForcedRangeMapping(minmax.min, minmax.max, (double)NumericTraits::min(), (double)NumericTraits::max()); else if(pixeltype == "INT32") info.setForcedRangeMapping(minmax.min, minmax.max, (double)NumericTraits::min(), (double)NumericTraits::max()); else if(pixeltype == "UINT32") info.setForcedRangeMapping(minmax.min, minmax.max, (double)NumericTraits::min(), (double)NumericTraits::max()); else if(pixeltype == "FLOAT") info.setForcedRangeMapping(minmax.min, minmax.max, 0.0, 1.0); else if(pixeltype == "DOUBLE") info.setForcedRangeMapping(minmax.min, minmax.max, 0.0, 1.0); } template void setRangeMapping(MultiArrayView <3, T, Tag> const & volume, ImageExportInfo & info, VigraTrueType /* isScalar */) { std::string pixeltype = info.getPixelType(); bool downcast = negotiatePixelType(getEncoderType(info.getFileName(), info.getFileType()), TypeAsString::result(), pixeltype); if(downcast) { FindMinMax minmax; inspectMultiArray(srcMultiArrayRange(volume), minmax); setRangeMapping(pixeltype, minmax, info); } } template void setRangeMapping(MultiArrayView <3, T, Tag> const & volume, ImageExportInfo & info, VigraFalseType /* isScalar */) { typedef typename T::value_type SrcComponent; std::string pixeltype = info.getPixelType(); bool downcast = negotiatePixelType(getEncoderType(info.getFileName(), info.getFileType()), TypeAsString::result(), pixeltype); if(downcast) { unsigned int bands = volume(0,0,0).size(); FindMinMax minmax; for(unsigned int i=0; i band(i); inspectMultiArray(srcMultiArrayRange(volume, band), minmax ); } setRangeMapping(pixeltype, minmax, info); } } } // namespace detail /********************************************************/ /* */ /* exportVolume */ /* */ /********************************************************/ /** \brief Function for exporting a 3D volume. The volume is exported in a by-slice manner, where the number of slices equals the depth of the volume. The file names will be enumerated like name_base+"000"+name_ext, name_base+"001"+name_ext etc. (the actual number of zeros depends on the depth). If the target image type does not support the source voxel type, all slices will be mapped simultaneously to the appropriate target range. \#include \<vigra/multi_impex.hxx\> Namespace: vigra */ template void exportVolume (MultiArrayView <3, T, Tag> const & volume, const std::string &name_base, const std::string &name_ext) { std::string name = name_base + name_ext; ImageExportInfo info(name.c_str()); detail::setRangeMapping(volume, info, typename NumericTraits::isScalar()); const unsigned int depth = volume.shape (2); int numlen = static_cast (std::ceil (std::log10 ((double)depth))); for (unsigned int i = 0; i < depth; ++i) { // build the filename std::stringstream stream; stream << std::setfill ('0') << std::setw (numlen) << i; std::string name_num; stream >> name_num; std::string name = name_base + name_num + name_ext; if(i == 0) { } // generate a basic image view to the current layer MultiArrayView <2, T, Tag> array_view (volume.bindOuter (i)); BasicImageView view = makeBasicImageView (array_view); // export the image info.setFileName(name.c_str ()); exportImage(srcImageRange(view), info); } } //@} } // namespace vigra #endif // VIGRA_MULTI_IMPEX_HXX gamera-3.3.3/include/vigra/multi_iterator.hxx0000644000076500000000000015003011261456425020276 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2003-2008 by Gunnar Kedenburg and Ullrich Koethe */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* ( Version 1.3.0, Sep 10 2004 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MULTI_ITERATOR_HXX #define VIGRA_MULTI_ITERATOR_HXX #include #include "tinyvector.hxx" #include "iteratortags.hxx" namespace vigra { template class MultiIterator; template class StridedMultiIterator; /** \page MultiIteratorPage Multi-dimensional Array Iterators General iterators for arrays of arbitrary dimension.

  • \ref vigra::MultiArrayShape
       Iterator for unstrided \ref vigra::MultiArrayView
  • \ref vigra::MultiIterator
       Iterator for unstrided \ref vigra::MultiArrayView
  • \ref vigra::StridedMultiIterator
       Iterator for strided \ref vigra::MultiArrayView

The Multidimensional Iterator concept allows navigation on arrays of arbitrary dimension. It provides two modes of iteration: direct traveral, and hierarchical traversal. In general, hierarchical traversal will be faster, while only direct traversal allows for true random access in all dimensions. Via the dim() function, operations applying to a particular dimension can be used in the direct traversal mode. In contrast, direct traversal functions should not be used in the hierarchical mode because the hierarchical functions are only well-defined if the iterator points to element 0 in all dimensions below its current dimension. The current dimension of a MultiIterator is N-1.

Gerneral Requirements for MultiIterator

Local Types Meaning
MultiIterator::value_typethe underlying arrays's pixel type
MultiIterator::reference the iterator's reference type (return type of *iter). Will be value_type & for a mutable iterator, and convertible to value_type const & for a const iterator.
MultiIterator::pointer the iterator's pointer type (return type of iter.operator->()). Will be value_type * for a mutable iterator, and convertible to value_type const * for a const iterator.
MultiIterator::iterator_category the iterator tag (vigra::multi_dimensional_traverser_tag)
Operation Result Semantics
MultiIterator k;default constructor
MultiIterator k(i);copy constructor
k = i MultiIterator &assignment
i == jbool equality (iterators point to the same element)
i != jbool inequality (iterators don't point to the same element)
*iMultiIterator::reference access the current element
i->member()depends on operation call member function of underlying pixel type via operator-> of iterator

Requirements for Direct Traversal

Local Types Meaning
MultiIterator::multi_difference_type the iterator's multi-dimensional difference type (TinyVector)
Operation Result Semantics
i += diffMultiIterator & add offset to current position
i -= diffMultiIterator & subtract offset from current position
i + diffMultiIterator create traverser by adding offset
i - diffMultiIterator create traverser by subtracting offset
i[diff]MultiIterator::reference access element at offset diff
i.dim()MultiIterator Access the traverser with the current dimension set to K. Typically used to call navigation functions referring to a particular dimension.
Example (assuming i, j are 3-dimensional):
\code i.dim<0>()++; // increment dimension 0 i.dim<1>()++; // increment dimension 1 i.dim<2>()++; // increment dimension 2 j += MultiIterator::multi_difference_type(1,1,1); // same effect \endcode
i, j are of type MultiIterator
diff is of type MultiIterator::multi_difference_type
K is an integer compile-time constant

Note that it is impossible to support an operator- between two iterators which returns a MultiIterator::multi_difference_type because it is impossible to decide to which dimension a difference applies. Consider for example, a 2-dimensional iterator i, and let j = i + multi_difference_type(width, 0), k = i + multi_difference_type(0,1), where width is the array's total width. In general, j and k point to the same memory location, so that the two cases cannot easily be distinguished (it is possible, but iterator performance will suffer significantly, as is experienced with \ref vigra::ImageIterator where differencing is allowed).

Requirements for Hierarchical Traversal

Local Types Meaning
MultiIterator::difference_type the iterator's difference type (MultiArrayIndex)
MultiIterator::next_typetype of the next iterator (referring to the next lower dimension) in the hierarchy
Operation Result Semantics
++iMultiIterator & pre-increment iterator in its current dimension
i++MultiIterator post-increment iterator in its current dimension
--iMultiIterator & pre-decrement iterator in its current dimension
i--MultiIterator post-decrement iterator in its current dimension
i += dMultiIterator & add d in current dimension
i -= dMultiIterator & subtract d in from dimension
i + dMultiIterator create new iterator by adding d in current dimension
i - dMultiIterator create new iterator by subtracting d in current dimension
i - jdifference_type difference of i and j in the current dimension
Note: The result of this operation is undefined if the iterator doesn't point to element 0 in all dimensions below its current dimension.
i < jbool i - j < 0
Note: The result of this operation is undefined if the iterator doesn't point to element 0 in all dimensions below its current dimension.
i[d]MultiIterator::reference access element by adding offset d in current dimension
i.begin()next_type create the hierarchical iterator poiting to the first element in the next lower dimension.
Note: The result of this operation is undefined if the iterator doesn't point to element 0 in all dimensions below its current dimension.
Usage:
\code MultiIterator<3, int> i3 = ..., end3 = ...; for(; i3 != end3; ++i3) { MultiIterator<3, int>::next_type i2 = i3.begin(), end2 = i3.end(); for(; i2 != end2; ++i2) { MultiIterator<3, int>::next_type::next_type i1 = i2.begin(), end1 = i2.end(); for(; i1 != end1; ++i1) { ... // do something with the current element } } } \endcode
i.end()next_type create the hierarchical iterator poiting to the past-the-end location in the next lower dimension.
Note: The result of this operation is undefined if the iterator doesn't point to element 0 in all dimensions below its current dimension.
i, j are of type MultiIterator
d is of type MultiIterator::difference_type

*/ /** \addtogroup MultiIteratorGroup Multi-dimensional Array Iterators \brief General iterators for arrays of arbitrary dimension. */ //@{ /** Index type for a single dimension of a MultiArrayView or MultiArray. */ typedef std::ptrdiff_t MultiArrayIndex; /** Traits class for the difference type of all MultiIterator, MultiArrayView, and MultiArray variants. */ template class MultiArrayShape { public: /** The difference type of all MultiIterator, MultiArrayView, and MultiArray variants. */ typedef TinyVector type; }; /********************************************************/ /* */ /* MultiIterator */ /* */ /********************************************************/ template class MultiIterator; /********************************************************/ /* */ /* MultiIterator<1> */ /* */ /********************************************************/ // template class MultiIterator<1, T, REFERENCE, POINTER> { public: enum { level = 0 }; typedef T value_type; typedef REFERENCE reference; typedef const value_type &const_reference; typedef POINTER pointer; typedef const value_type *const_pointer; typedef typename MultiArrayShape<1>::type multi_difference_type; typedef MultiArrayIndex difference_type; typedef StridedMultiIterator<1, T, REFERENCE, POINTER> iterator; typedef std::random_access_iterator_tag iterator_category; protected: pointer m_ptr; public: MultiIterator () : m_ptr (0) {} MultiIterator (pointer ptr, const difference_type *, const difference_type *) : m_ptr (ptr) {} void operator++ () { ++m_ptr; } void operator-- () { --m_ptr; } MultiIterator operator++ (int) { MultiIterator ret = *this; ++(*this); return ret; } MultiIterator operator-- (int) { MultiIterator ret = *this; --(*this); return ret; } MultiIterator &operator+= (difference_type n) { m_ptr += n; return *this; } MultiIterator & operator+= (multi_difference_type const & d) { m_ptr += d[level]; return *this; } MultiIterator &operator-= (difference_type n) { m_ptr -= n; return *this; } MultiIterator & operator-= (multi_difference_type const & d) { m_ptr -= d[level]; return *this; } MultiIterator operator+ (difference_type n) const { MultiIterator ret = *this; ret += n; return ret; } MultiIterator operator+ (multi_difference_type const & d) const { MultiIterator ret = *this; ret += d; return ret; } difference_type operator- (MultiIterator const & d) const { return (m_ptr - d.m_ptr); } MultiIterator operator- (difference_type n) const { MultiIterator ret = *this; ret -= n; return ret; } MultiIterator operator- (multi_difference_type const & d) const { MultiIterator ret = *this; ret -= d; return ret; } reference operator[] (difference_type n) const { return m_ptr [n]; } reference operator[] (multi_difference_type const & d) const { return m_ptr [d[level]]; } reference operator* () const { return *m_ptr; } pointer get () const { return m_ptr; } pointer operator->() const { return &(operator*()); } bool operator!= (const MultiIterator &rhs) const { return m_ptr != rhs.m_ptr; } bool operator== (const MultiIterator &rhs) const { return m_ptr == rhs.m_ptr; } bool operator< (const MultiIterator &rhs) const { return m_ptr < rhs.m_ptr; } bool operator<= (const MultiIterator &rhs) const { return m_ptr <= rhs.m_ptr; } bool operator> (const MultiIterator &rhs) const { return m_ptr > rhs.m_ptr; } bool operator>= (const MultiIterator &rhs) const { return m_ptr >= rhs.m_ptr; } iterator iteratorForDimension(unsigned int d) const { vigra_precondition(d == 0, "MultiIterator<1>::iteratorForDimension(d): d == 0 required"); const difference_type stride = 1; return iterator(m_ptr, &stride, 0); } template MultiIterator & dim() { return *this; } MultiIterator<1, T, REFERENCE, POINTER> & dim0() { return *this; } protected: difference_type total_stride(typename multi_difference_type::const_iterator d) const { return d[level]; } }; /********************************************************/ /* */ /* MultiIterator<2> */ /* */ /********************************************************/ // template class MultiIterator<2, T, REFERENCE, POINTER> : public MultiIterator<1, T, REFERENCE, POINTER> { public: typedef MultiIterator<1, T, REFERENCE, POINTER> base_type; enum { level = 1 }; typedef T value_type; typedef REFERENCE reference; typedef const value_type &const_reference; typedef POINTER pointer; typedef const value_type *const_pointer; typedef typename MultiArrayShape<2>::type multi_difference_type; typedef MultiArrayIndex difference_type; typedef base_type next_type; typedef StridedMultiIterator<1, T, REFERENCE, POINTER> iterator; typedef multi_dimensional_traverser_tag iterator_category; protected: const difference_type *m_stride; const difference_type *m_shape; public: /* use default copy constructor and assignment operator */ MultiIterator () : base_type (), m_stride (0), m_shape (0) {} MultiIterator (pointer ptr, const difference_type *stride, const difference_type *shape) : base_type (ptr, stride, shape), m_stride (stride), m_shape (shape) {} void operator++ () { this->m_ptr += m_stride [level]; } void operator-- () { this->m_ptr -= m_stride [level]; } MultiIterator operator++ (int) { MultiIterator ret = *this; ++(*this); return ret; } MultiIterator operator-- (int) { MultiIterator ret = *this; --(*this); return ret; } MultiIterator & operator+= (difference_type n) { this->m_ptr += n * m_stride [level]; return *this; } MultiIterator & operator+= (multi_difference_type const & d) { this->m_ptr += total_stride(d.begin()); return *this; } MultiIterator &operator-= (difference_type n) { this->m_ptr -= n * m_stride [level]; return *this; } MultiIterator & operator-= (multi_difference_type const & d) { this->m_ptr -= total_stride(d.begin()); return *this; } MultiIterator operator+ (difference_type n) const { MultiIterator ret = *this; ret += n; return ret; } MultiIterator operator+ (multi_difference_type const & d) const { MultiIterator ret = *this; ret += d; return ret; } difference_type operator- (MultiIterator const & d) const { return (this->m_ptr - d.m_ptr) / this->m_stride[level]; } MultiIterator operator- (difference_type n) const { MultiIterator ret = *this; ret -= n; return ret; } MultiIterator operator- (multi_difference_type const & d) const { MultiIterator ret = *this; ret -= d; return ret; } reference operator[] (difference_type n) const { return this->m_ptr [n*m_stride [level]]; } reference operator[] (multi_difference_type const & d) const { return this->m_ptr [total_stride(d.begin())]; } next_type begin () const { return *this; } next_type end () const { next_type ret = *this; ret += m_shape [level-1]; return ret; } iterator iteratorForDimension(unsigned int d) const { vigra_precondition(d <= level, "MultiIterator::iteratorForDimension(d): d < N required"); return iterator(this->m_ptr, &m_stride [d], 0); } template MultiIterator & dim() { return *this; } MultiIterator<1, T, REFERENCE, POINTER> & dim0() { return *this; } MultiIterator<2, T, REFERENCE, POINTER> & dim1() { return *this; } protected: difference_type total_stride(typename multi_difference_type::const_iterator d) const { return d[level]*m_stride[level] + base_type::total_stride(d); } }; /********************************************************/ /* */ /* MultiIterator */ /* */ /********************************************************/ /** \brief A multi-dimensional hierarchical iterator to be used with \ref vigra::MultiArrayView if it is not strided. See \ref MultiIteratorPage for further documentation. \#include \<vigra/multi_iterator.hxx\> Namespace: vigra */ template class MultiIterator : public MultiIterator { public: /** the type of the parent in the inheritance hierarchy. */ typedef MultiIterator base_type; /** the iterator's level in the dimension hierarchy */ enum { level = N-1 }; /** the iterator's value type */ typedef T value_type; /** reference type (result of operator[]) */ typedef REFERENCE reference; /** const reference type (result of operator[] const) */ typedef const value_type &const_reference; /** pointer type */ typedef POINTER pointer; /** const pointer type */ typedef const value_type *const_pointer; /** multi difference type (used for offsetting along all axes simultaneously) */ typedef typename MultiArrayShape::type multi_difference_type; /** difference type (used for offsetting) */ typedef MultiArrayIndex difference_type; /** the MultiIterator for the next lower dimension. */ typedef base_type next_type; /** the 1-dimensional iterator for this iterator hierarchy (result of iteratorForDimension()). */ typedef StridedMultiIterator<1, T, REFERENCE, POINTER> iterator; /** the iterator tag (image traverser) */ typedef multi_dimensional_traverser_tag iterator_category; /* use default copy constructor and assignment operator */ /** default constructor. */ MultiIterator () {} /** construct from pointer, strides (offset of a sample to the next) for every dimension, and the shape. */ MultiIterator (pointer ptr, const difference_type *stride, const difference_type *shape) : base_type (ptr, stride, shape) {} /** prefix-increment the iterator in it's current dimension */ void operator++ () { this->m_ptr += this->m_stride [level]; } /** prefix-decrement the iterator in it's current dimension */ void operator-- () { this->m_ptr -= this->m_stride [level]; } /** postfix-increment the iterator in it's current dimension */ MultiIterator operator++ (int) { MultiIterator ret = *this; ++(*this); return ret; } /** postfix-decrement the iterator in it's current dimension */ MultiIterator operator-- (int) { MultiIterator ret = *this; --(*this); return ret; } /** increment the iterator in it's current dimension by the given value. */ MultiIterator & operator+= (difference_type n) { this->m_ptr += n * this->m_stride [level]; return *this; } /** increment the iterator in all dimensions by the given offset. */ MultiIterator & operator+= (multi_difference_type const & d) { this->m_ptr += total_stride(d.begin()); return *this; } /** decrement the iterator in it's current dimension by the given value. */ MultiIterator & operator-= (difference_type n) { this->m_ptr -= n * this->m_stride [level]; return *this; } /** decrement the iterator in all dimensions by the given offset. */ MultiIterator & operator-= (multi_difference_type const & d) { this->m_ptr -= total_stride(d.begin()); return *this; } /** addition within current dimension */ MultiIterator operator+ (difference_type n) const { MultiIterator ret = *this; ret += n; return ret; } /** addition along all dimensions */ MultiIterator operator+ (multi_difference_type const & d) const { MultiIterator ret = *this; ret += d; return ret; } /** difference of two iterators in the current dimension. The result of this operation is undefined if the iterator doesn't point to element 0 in all dimensions below its current dimension. */ difference_type operator- (MultiIterator const & d) const { return (this->m_ptr - d.m_ptr) / this->m_stride[level]; } /** subtraction within current dimension */ MultiIterator operator- (difference_type n) const { MultiIterator ret = *this; ret -= n; return ret; } /** subtraction along all dimensions */ MultiIterator operator- (multi_difference_type const & d) const { MultiIterator ret = *this; ret -= d; return ret; } #ifdef DOXYGEN /* documentation only: operators *, ->, ==, !=, <, <=, >, >= are inherited */ /** derefenrence item */ reference operator* () const; /** get address of current item */ pointer get () const; /** call method of current item */ pointer operator->() const; /** inequality. True if iterators reference different items. */ bool operator!= (const MultiIterator &rhs) const; /** equality. True if iterators reference the same items. */ bool operator== (const MultiIterator &rhs) const; /** less than. */ bool operator< (const MultiIterator &rhs) const; /** less or equal. */ bool operator<= (const MultiIterator &rhs) const; /** greater than. */ bool operator> (const MultiIterator &rhs) const; /** greater or equal. */ bool operator>= (const MultiIterator &rhs) const; #endif /** access the array element at the given offset in the current dimension. */ reference operator[] (difference_type n) const { return this->m_ptr [n* this->m_stride [level]]; } /** access the array element at the given offset. */ reference operator[] (multi_difference_type const & d) const { return this->m_ptr [total_stride(d.begin())]; } /** Return the (N-1)-dimensional multi-iterator that points to the first (N-1)-dimensional subarray of the N-dimensional array this iterator is referring to. The result is only valid if this iterator refers to location 0 in all dimensions below its current dimension N, otherwise it is undefined. Usage: \code MultiIterator<2, int> outer = ...; // this iterator MultiIterator<2, int>::next_type inner = outer.begin(); for(; inner != outer.end(); ++inner) { // manipulate current 1D subimage } \endcode */ next_type begin () const { return *this; } /** Return the (N-1)-dimensional multi-iterator that points beyond the last (N-1)-dimensional subarray of the N-dimensional array this iterator is referring to. The result is only valid if this iterator refers to location 0 in all dimensions below its current dimension N, otherwise it is undefined. */ next_type end () const { next_type ret = *this; ret += this->m_shape [level-1]; return ret; } /** Get a 1-dimensional, STL-compatible iterator for the given dimension, pointing to the current element of this. Usage: \code MultiIterator<3, int> outer = ...; // this iterator MultiIterator<3, int>::iterator i = outer.iteratorForDimension(1); MultiIterator<3, int>::iterator end = i + height; for(; i != end; ++i) { // go down the current column starting at the location of 'outer' } \endcode */ iterator iteratorForDimension(unsigned int d) const { vigra_precondition(d <= level, "MultiIterator::iteratorForDimension(d): d < N required"); return iterator(this->m_ptr, &this->m_stride [d], 0); } /** Return the multi-iterator that operates on dimension K in order to manipulate this dimension directly. Usage: \code MultiIterator<3, int> i3 = ...; i3.template dim<2>()++; // increment outer dimension i3.template dim<0>()++; // increment inner dimension \endcode For convenience, the same functionality is also available as dim0(), dim1() etc. up to dim4(): \code MultiIterator<3, int> i3 = ...; i3.dim2()++; // increment outer dimension i3.dim0()++; // increment inner dimension \endcode */ template MultiIterator & dim() { return *this; } MultiIterator<1, T, REFERENCE, POINTER> & dim0() { return *this; } MultiIterator<2, T, REFERENCE, POINTER> & dim1() { return *this; } MultiIterator<3, T, REFERENCE, POINTER> & dim2() { return *this; } MultiIterator<4, T, REFERENCE, POINTER> & dim3() { return *this; } MultiIterator<5, T, REFERENCE, POINTER> & dim4() { return *this; } protected: difference_type total_stride(typename multi_difference_type::const_iterator d) const { return d[level]*this->m_stride[level] + base_type::total_stride(d); } }; /********************************************************/ /* */ /* StridedMultiIterator */ /* */ /********************************************************/ template class StridedMultiIterator; /********************************************************/ /* */ /* StridedMultiIterator<1> */ /* */ /********************************************************/ // template class StridedMultiIterator<1, T, REFERENCE, POINTER> { public: enum { level = 0 }; typedef T value_type; typedef REFERENCE reference; typedef const value_type &const_reference; typedef POINTER pointer; typedef const value_type *const_pointer; typedef typename MultiArrayShape<1>::type multi_difference_type; typedef MultiArrayIndex difference_type; typedef StridedMultiIterator<1, T, REFERENCE, POINTER> iterator; typedef std::random_access_iterator_tag iterator_category; protected: pointer m_ptr; difference_type m_stride; /* use default copy constructor and assignment operator */ public: StridedMultiIterator () : m_ptr (0), m_stride (0) {} StridedMultiIterator (pointer ptr, const difference_type *stride, const difference_type *) : m_ptr (ptr), m_stride (stride [level]) {} void operator++ () { m_ptr += m_stride; } void operator-- () { m_ptr -= m_stride; } StridedMultiIterator operator++ (int) { StridedMultiIterator ret = *this; ++(*this); return ret; } StridedMultiIterator operator-- (int) { StridedMultiIterator ret = *this; --(*this); return ret; } StridedMultiIterator &operator+= (difference_type n) { m_ptr += n * m_stride; return *this; } StridedMultiIterator & operator+= (multi_difference_type const & d) { m_ptr += d[level] * m_stride; return *this; } StridedMultiIterator &operator-= (difference_type n) { m_ptr -= n * m_stride; return *this; } StridedMultiIterator & operator-= (multi_difference_type const & d) { m_ptr -= d[level] * m_stride; return *this; } StridedMultiIterator operator+ (difference_type n) const { StridedMultiIterator ret = *this; ret += n; return ret; } StridedMultiIterator operator+ (multi_difference_type const & d) const { StridedMultiIterator ret = *this; ret += d; return ret; } difference_type operator- (StridedMultiIterator const & d) const { return (m_ptr - d.m_ptr) / m_stride; } StridedMultiIterator operator- (difference_type n) const { StridedMultiIterator ret = *this; ret -= n; return ret; } StridedMultiIterator operator- (multi_difference_type const & d) const { StridedMultiIterator ret = *this; ret -= d; return ret; } reference operator[] (difference_type n) const { return m_ptr [n*m_stride]; } reference operator[] (multi_difference_type const & d) const { return m_ptr [d[level]*m_stride]; } reference operator* () const { return *m_ptr; } pointer get () const { return m_ptr; } pointer operator->() const { return &(operator*()); } bool operator!= (const StridedMultiIterator &rhs) const { return m_ptr != rhs.m_ptr; } bool operator== (const StridedMultiIterator &rhs) const { return m_ptr == rhs.m_ptr; } bool operator< (const StridedMultiIterator &rhs) const { return m_ptr < rhs.m_ptr; } bool operator<= (const StridedMultiIterator &rhs) const { return m_ptr <= rhs.m_ptr; } bool operator> (const StridedMultiIterator &rhs) const { return m_ptr > rhs.m_ptr; } bool operator>= (const StridedMultiIterator &rhs) const { return m_ptr >= rhs.m_ptr; } iterator iteratorForDimension(unsigned int d) const { vigra_precondition(d == 0, "StridedMultiIterator<1>::iteratorForDimension(d): d == 0 required"); const difference_type stride = 1; return iterator(m_ptr, &stride, 0); } template StridedMultiIterator & dim() { return *this; } StridedMultiIterator<1, T, REFERENCE, POINTER> & dim0() { return *this; } protected: difference_type total_stride(typename multi_difference_type::const_iterator d) const { return d[level] * m_stride; } }; /********************************************************/ /* */ /* StridedMultiIterator<2> */ /* */ /********************************************************/ // template class StridedMultiIterator<2, T, REFERENCE, POINTER> : public StridedMultiIterator<1, T, REFERENCE, POINTER> { public: typedef StridedMultiIterator<1, T, REFERENCE, POINTER> base_type; enum { level = 1 }; typedef T value_type; typedef REFERENCE reference; typedef const value_type &const_reference; typedef POINTER pointer; typedef const value_type *const_pointer; typedef typename MultiArrayShape<2>::type multi_difference_type; typedef MultiArrayIndex difference_type; typedef base_type next_type; typedef StridedMultiIterator<1, T, REFERENCE, POINTER> iterator; typedef multi_dimensional_traverser_tag iterator_category; protected: const difference_type *m_stride; const difference_type *m_shape; public: /* use default copy constructor and assignment operator */ StridedMultiIterator () : base_type (), m_stride (0), m_shape (0) {} StridedMultiIterator (pointer ptr, const difference_type *stride, const difference_type *shape) : base_type (ptr, stride, shape), m_stride (stride), m_shape (shape) {} void operator++ () { this->m_ptr += m_stride [level]; } void operator-- () { this->m_ptr -= m_stride [level]; } StridedMultiIterator operator++ (int) { StridedMultiIterator ret = *this; ++(*this); return ret; } StridedMultiIterator operator-- (int) { StridedMultiIterator ret = *this; --(*this); return ret; } StridedMultiIterator & operator+= (difference_type n) { this->m_ptr += n * m_stride [level]; return *this; } StridedMultiIterator & operator+= (multi_difference_type const & d) { this->m_ptr += total_stride(d.begin()); return *this; } StridedMultiIterator &operator-= (difference_type n) { this->m_ptr -= n * m_stride [level]; return *this; } StridedMultiIterator & operator-= (multi_difference_type const & d) { this->m_ptr -= total_stride(d.begin()); return *this; } StridedMultiIterator operator+ (difference_type n) const { StridedMultiIterator ret = *this; ret += n; return ret; } StridedMultiIterator operator+ (multi_difference_type const & d) const { StridedMultiIterator ret = *this; ret += d; return ret; } difference_type operator- (StridedMultiIterator const & d) const { return (this->m_ptr - d.m_ptr) / this->m_stride[level]; } StridedMultiIterator operator- (difference_type n) const { StridedMultiIterator ret = *this; ret -= n; return ret; } StridedMultiIterator operator- (multi_difference_type const & d) const { StridedMultiIterator ret = *this; ret -= d; return ret; } reference operator[] (difference_type n) const { return this->m_ptr [n*m_stride [level]]; } reference operator[] (multi_difference_type const & d) const { return this->m_ptr [total_stride(d.begin())]; } next_type begin () const { return *this; } next_type end () const { next_type ret = *this; ret += m_shape [level-1]; return ret; } iterator iteratorForDimension(unsigned int d) const { vigra_precondition(d <= level, "StridedMultiIterator::iteratorForDimension(d): d < N required"); return iterator(this->m_ptr, &m_stride [d], 0); } template StridedMultiIterator & dim() { return *this; } StridedMultiIterator<1, T, REFERENCE, POINTER> & dim0() { return *this; } StridedMultiIterator<2, T, REFERENCE, POINTER> & dim1() { return *this; } protected: difference_type total_stride(typename multi_difference_type::const_iterator d) const { return d[level]*m_stride[level] + base_type::total_stride(d); } }; /********************************************************/ /* */ /* StridedMultiIterator */ /* */ /********************************************************/ /** \brief A multi-dimensional hierarchical iterator to be used with \ref vigra::MultiArrayView if it is not strided. See \ref MultiIteratorPage for further documentation. \#include \<vigra/multi_iterator.hxx\> Namespace: vigra */ template class StridedMultiIterator : public StridedMultiIterator { public: /** the type of the parent in the inheritance hierarchy. */ typedef StridedMultiIterator base_type; /** the iterator's level in the dimension hierarchy */ enum { level = N-1 }; /** the iterator's value type */ typedef T value_type; /** reference type (result of operator[]) */ typedef REFERENCE reference; /** const reference type (result of operator[] const) */ typedef const value_type &const_reference; /** pointer type */ typedef POINTER pointer; /** const pointer type */ typedef const value_type *const_pointer; /** multi difference type (used for offsetting along all axes simultaneously) */ typedef typename MultiArrayShape::type multi_difference_type; /** difference type (used for offsetting) */ typedef MultiArrayIndex difference_type; /** the StridedMultiIterator for the next lower dimension. */ typedef base_type next_type; /** the 1-dimensional iterator for this iterator hierarchy (result of iteratorForDimension()). */ typedef StridedMultiIterator<1, T, REFERENCE, POINTER> iterator; /** the iterator tag (image traverser) */ typedef multi_dimensional_traverser_tag iterator_category; /* use default copy constructor and assignment operator */ /** default constructor. */ StridedMultiIterator () {} /** construct from pointer, strides (offset of a sample to the next) for every dimension, and the shape. */ StridedMultiIterator (pointer ptr, const difference_type *stride, const difference_type *shape) : base_type (ptr, stride, shape) {} /** prefix-increment the iterator in it's current dimension */ void operator++ () { this->m_ptr += this->m_stride [level]; } /** prefix-decrement the iterator in it's current dimension */ void operator-- () { this->m_ptr -= this->m_stride [level]; } /** postfix-increment the iterator in it's current dimension */ StridedMultiIterator operator++ (int) { StridedMultiIterator ret = *this; ++(*this); return ret; } /** postfix-decrement the iterator in it's current dimension */ StridedMultiIterator operator-- (int) { StridedMultiIterator ret = *this; --(*this); return ret; } /** increment the iterator in it's current dimension by the given value. */ StridedMultiIterator & operator+= (difference_type n) { this->m_ptr += n * this->m_stride [level]; return *this; } /** increment the iterator in all dimensions by the given offset. */ StridedMultiIterator & operator+= (multi_difference_type const & d) { this->m_ptr += total_stride(d.begin()); return *this; } /** decrement the iterator in it's current dimension by the given value. */ StridedMultiIterator & operator-= (difference_type n) { this->m_ptr -= n * this->m_stride [level]; return *this; } /** decrement the iterator in all dimensions by the given offset. */ StridedMultiIterator & operator-= (multi_difference_type const & d) { this->m_ptr -= total_stride(d.begin()); return *this; } /** addition within current dimension */ StridedMultiIterator operator+ (difference_type n) const { StridedMultiIterator ret = *this; ret += n; return ret; } /** addition along all dimensions */ StridedMultiIterator operator+ (multi_difference_type const & d) const { StridedMultiIterator ret = *this; ret += d; return ret; } /** difference of two iterators in the current dimension. The result of this operation is undefined if the iterator doesn't point to element 0 in all dimensions below its current dimension. */ difference_type operator- (StridedMultiIterator const & d) const { return (this->m_ptr - d.m_ptr) / this->m_stride[level]; } /** subtraction within current dimension */ StridedMultiIterator operator- (difference_type n) const { StridedMultiIterator ret = *this; ret -= n; return ret; } /** subtraction along all dimensions */ StridedMultiIterator operator- (multi_difference_type const & d) const { StridedMultiIterator ret = *this; ret -= d; return ret; } #ifdef DOXYGEN /* documentation only: operators *, ->, ==, !=, <, <=, >, >= are inherited */ /** derefenrence item */ reference operator* () const; /** get address of current item */ pointer get () const; /** call method of current item */ pointer operator->() const; /** inequality. True if iterators reference different items. */ bool operator!= (const StridedMultiIterator &rhs) const; /** equality. True if iterators reference the same items. */ bool operator== (const StridedMultiIterator &rhs) const; /** less than. */ bool operator< (const StridedMultiIterator &rhs) const; /** less or equal. */ bool operator<= (const StridedMultiIterator &rhs) const; /** greater than. */ bool operator> (const StridedMultiIterator &rhs) const; /** greater or equal. */ bool operator>= (const StridedMultiIterator &rhs) const; #endif /** access the array element at the given offset in the current dimension. */ reference operator[] (difference_type n) const { return this->m_ptr [n* this->m_stride [level]]; } /** access the array element at the given offset. */ reference operator[] (multi_difference_type const & d) const { return this->m_ptr [total_stride(d.begin())]; } /** Return the (N-1)-dimensional multi-iterator that points to the first (N-1)-dimensional subarray of the N-dimensional array this iterator is referring to. The result is only valid if this iterator refers to location 0 in all dimensions below its current dimension N, otherwise it is undefined. Usage: \code StridedMultiIterator<2, int> outer = ...; // this iterator StridedMultiIterator<2, int>::next_type inner = outer.begin(); for(; inner != outer.end(); ++inner) { // manipulate current 1D subimage } \endcode */ next_type begin () const { return *this; } /** Return the (N-1)-dimensional multi-iterator that points beyond the last (N-1)-dimensional subarray of the N-dimensional array this iterator is referring to. The result is only valid if this iterator refers to location 0 in all dimensions below its current dimension N, otherwise it is undefined. */ next_type end () const { next_type ret = *this; ret += this->m_shape [level-1]; return ret; } /** Get a 1-dimensional, STL-compatible iterator for the given dimension, pointing to the current element of this. Usage: \code StridedMultiIterator<3, int> outer = ...; // this iterator StridedMultiIterator<3, int>::iterator i = outer.iteratorForDimension(1); StridedMultiIterator<3, int>::iterator end = i + height; for(; i != end; ++i) { // go down the current column starting at the location of 'outer' } \endcode */ iterator iteratorForDimension(unsigned int d) const { vigra_precondition(d <= level, "StridedMultiIterator::iteratorForDimension(d): d < N required"); return iterator(this->m_ptr, &this->m_stride [d], 0); } /** Return the multi-iterator that operates on dimension K in order to manipulate this dimension directly. Usage: \code StridedMultiIterator<3, int> i3 = ...; i3.template dim<2>()++; // increment outer dimension i3.template dim<0>()++; // increment inner dimension \endcode For convenience, the same functionality is also available as dim0(), dim1() etc. up to dim4(): \code StridedMultiIterator<3, int> i3 = ...; i3.dim2()++; // increment outer dimension i3.dim0()++; // increment inner dimension \endcode */ template StridedMultiIterator & dim() { return *this; } StridedMultiIterator<1, T, REFERENCE, POINTER> & dim0() { return *this; } StridedMultiIterator<2, T, REFERENCE, POINTER> & dim1() { return *this; } StridedMultiIterator<3, T, REFERENCE, POINTER> & dim2() { return *this; } StridedMultiIterator<4, T, REFERENCE, POINTER> & dim3() { return *this; } StridedMultiIterator<5, T, REFERENCE, POINTER> & dim4() { return *this; } protected: difference_type total_stride(typename multi_difference_type::const_iterator d) const { return d[level]*this->m_stride[level] + base_type::total_stride(d); } }; //@} } // namespace vigra #endif // VIGRA_MULTI_ITERATOR_HXX gamera-3.3.3/include/vigra/multi_morphology.hxx0000644000076500000000000005451611261456425020660 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2003-2007 by Kasim Terzic, Christian-Dennis Rahn */ /* and Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MULTI_MORPHOLOGY_HXX #define VIGRA_MULTI_MORPHOLOGY_HXX #include #include #include "multi_distance.hxx" #include "array_vector.hxx" #include "multi_array.hxx" #include "accessor.hxx" #include "numerictraits.hxx" #include "navigator.hxx" #include "metaprogramming.hxx" #include "multi_pointoperators.hxx" #include "functorexpression.hxx" namespace vigra { /** \addtogroup MultiArrayMorphology Morphological operators for multi-dimensional arrays. These functions perform morphological operations on an arbitrary dimensional array that is specified by iterators (compatible to \ref MultiIteratorPage) and shape objects. It can therefore be applied to a wide range of data structures (\ref vigra::MultiArrayView, \ref vigra::MultiArray etc.). */ //@{ /********************************************************/ /* */ /* multiBinaryErosion */ /* */ /********************************************************/ /** \brief Binary erosion on multi-dimensional arrays. This function applies a flat circular erosion operator with a given radius. The operation is isotropic. The input is a binary multi-dimensional array where non-zero pixels represent foreground and zero pixels represent background. This function may work in-place, which means that siter == diter is allowed. A full-sized internal array is only allocated if working on the destination array directly would cause overflow errors (i.e. if typeid(typename DestAccessor::value_type) < N * M*M, where M is the size of the largest dimension of the array. Declarations: pass arguments explicitly: \code namespace vigra { template void multiBinaryErosion(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, int radius); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void multiBinaryErosion(triple const & source, pair const & dest, int radius); } \endcode Usage: \#include \<vigra/multi_morphology.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, unsigned char> dest(shape); ... // perform isotropic binary erosion multiBinaryErosion(srcMultiArrayRange(source), destMultiArray(dest), 3); \endcode \see vigra::discErosion() */ doxygen_overloaded_function(template <...> void multiBinaryErosion) template void multiBinaryErosion( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, float radius) { typedef typename NumericTraits::ValueType DestType; typedef typename NumericTraits::Promote TmpType; DestType MaxValue = NumericTraits::max(); float radius2 = (float) radius * radius; enum { N = 1 + SrcIterator::level }; int MaxDim = 0; for( int i=0; i MaxValue) { // Allocate a new temporary array if the distances squared wouldn't fit MultiArray tmpArray(shape); //detail::internalSeparableMultiArrayDistTmp( s, shape, src, tmpArray.traverser_begin(), // typename AccessorTraits::default_accessor()/*, false*/ ); separableMultiDistSquared(s, shape, src, tmpArray.traverser_begin(), typename AccessorTraits::default_accessor(), false ); // threshold everything less than radius away from the edge // std::cerr << "Thresholding!!!!!" << std::endl; transformMultiArray( tmpArray.traverser_begin(), shape, typename AccessorTraits::default_accessor(), d, dest, ifThenElse( Arg1() > Param(radius2), Param(MaxValue), Param(0) ) ); } else // work directly on the destination array { //detail::internalSeparableMultiArrayDistTmp( s, shape, src, d, dest/*, false*/ ); separableMultiDistSquared( s, shape, src, d, dest, false ); // threshold everything less than radius away from the edge transformMultiArray( d, shape, dest, d, dest, ifThenElse( Arg1() > Param(radius2), Param(MaxValue), Param(0) ) ); } } template inline void multiBinaryErosion( triple const & source, pair const & dest, int radius) { multiBinaryErosion( source.first, source.second, source.third, dest.first, dest.second, radius ); } /********************************************************/ /* */ /* multiBinaryDilation */ /* */ /********************************************************/ /** \brief Binary dilation on multi-dimensional arrays. This function applies a flat circular dilation operator with a given radius. The operation is isotropic. The input is a binary multi-dimensional array where non-zero pixels represent foreground and zero pixels represent background. This function may work in-place, which means that siter == diter is allowed. A full-sized internal array is only allocated if working on the destination array directly would cause overflow errors (i.e. if typeid(typename DestAccessor::value_type) < N * M*M, where M is the size of the largest dimension of the array. Declarations: pass arguments explicitly: \code namespace vigra { template void multiBinaryDilation(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, int radius); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void multiBinaryDilation(triple const & source, pair const & dest, int radius); } \endcode Usage: \#include \<vigra/multi_morphology.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, unsigned char> dest(shape); ... // perform isotropic binary erosion multiBinaryDilation(srcMultiArrayRange(source), destMultiArray(dest), 3); \endcode \see vigra::discDilation() */ doxygen_overloaded_function(template <...> void multiBinaryDilation) template void multiBinaryDilation( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, float radius) { typedef typename NumericTraits::ValueType DestType; typedef typename NumericTraits::Promote TmpType; DestType MaxValue = NumericTraits::max(); float radius2 = (float) radius * radius; enum { N = 1 + SrcIterator::level }; int MaxDim = 0; for( int i=0; i MaxValue) { // Allocate a new temporary array if the distances squared wouldn't fit MultiArray tmpArray(shape); //detail::internalSeparableMultiArrayDistTmp( s, shape, src, tmpArray.traverser_begin(), // typename AccessorTraits::default_accessor(), true ); separableMultiDistSquared(s, shape, src, tmpArray.traverser_begin(), typename AccessorTraits::default_accessor(), true ); // threshold everything less than radius away from the edge transformMultiArray( tmpArray.traverser_begin(), shape, typename AccessorTraits::default_accessor(), d, dest, ifThenElse( Arg1() > Param(radius2), Param(0), Param(MaxValue) ) ); } else // work directly on the destination array { //detail::internalSeparableMultiArrayDistTmp( s, shape, src, d, dest, true ); separableMultiDistSquared( s, shape, src, d, dest, true ); // threshold everything less than radius away from the edge transformMultiArray( d, shape, dest, d, dest, ifThenElse( Arg1() > Param(radius2), Param(0), Param(MaxValue) ) ); } } template inline void multiBinaryDilation( triple const & source, pair const & dest, int radius) { multiBinaryDilation( source.first, source.second, source.third, dest.first, dest.second, radius ); } /********************************************************/ /* */ /* multiGrayscaleErosion */ /* */ /********************************************************/ /** \brief Parabolic grayscale erosion on multi-dimensional arrays. This function applies a parabolic erosion operator with a given spread (sigma) on a grayscale array. The operation is isotropic. The input is a grayscale multi-dimensional array. This function may work in-place, which means that siter == diter is allowed. A full-sized internal array is only allocated if working on the destination array directly would cause overflow errors (i.e. if typeid(typename DestAccessor::value_type) < N * M*M, where M is the size of the largest dimension of the array. Declarations: pass arguments explicitly: \code namespace vigra { template void multiGrayscaleErosion(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, float sigma); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void multiGrayscaleErosion(triple const & source, pair const & dest, float sigma); } \endcode Usage: \#include \<vigra/multi_morphology.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, unsigned char> dest(shape); ... // perform isotropic grayscale erosion multiGrayscaleErosion(srcMultiArrayRange(source), destMultiArray(dest), 3.0); \endcode \see vigra::discErosion() */ doxygen_overloaded_function(template <...> void multiGrayscaleErosion) template void multiGrayscaleErosion( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, float sigma) { typedef typename NumericTraits::ValueType DestType; typedef typename NumericTraits::Promote TmpType; DestType MaxValue = NumericTraits::max(); enum { N = 1 + SrcIterator::level }; // temporay array to hold the current line to enable in-place operation ArrayVector tmp( shape[0] ); typedef MultiArrayNavigator SNavigator; typedef MultiArrayNavigator DNavigator; int MaxDim = 0; for( int i=0; i MaxValue) { MultiArray tmpArray(shape); detail::internalSeparableMultiArrayDistTmp( s, shape, src, tmpArray.traverser_begin(), typename AccessorTraits::default_accessor(), sigma ); transformMultiArray( tmpArray.traverser_begin(), shape, typename AccessorTraits::default_accessor(), d, dest, ifThenElse( Arg1() > Param(MaxValue), Param(MaxValue), Arg1() ) ); //copyMultiArray( tmpArray.traverser_begin(), shape, // typename AccessorTraits::default_accessor(), d, dest ); } else { detail::internalSeparableMultiArrayDistTmp( s, shape, src, d, dest, sigma ); } } template inline void multiGrayscaleErosion( triple const & source, pair const & dest, float sigma) { multiGrayscaleErosion( source.first, source.second, source.third, dest.first, dest.second, sigma); } /********************************************************/ /* */ /* multiGrayscaleDilation */ /* */ /********************************************************/ /** \brief Parabolic grayscale dilation on multi-dimensional arrays. This function applies a parabolic dilation operator with a given spread (sigma) on a grayscale array. The operation is isotropic. The input is a grayscale multi-dimensional array. This function may work in-place, which means that siter == diter is allowed. A full-sized internal array is only allocated if working on the destination array directly would cause overflow errors (i.e. if typeid(typename DestAccessor::value_type) < N * M*M, where M is the size of the largest dimension of the array. Declarations: pass arguments explicitly: \code namespace vigra { template void multiGrayscaleDilation(SrcIterator siter, SrcShape const & shape, SrcAccessor src, DestIterator diter, DestAccessor dest, float sigma); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void multiGrayscaleDilation(triple const & source, pair const & dest, float sigma); } \endcode Usage: \#include \<vigra/multi_morphology.hxx\> \code MultiArray<3, unsigned char>::size_type shape(width, height, depth); MultiArray<3, unsigned char> source(shape); MultiArray<3, unsigned char> dest(shape); ... // perform isotropic grayscale erosion multiGrayscaleDilation(srcMultiArrayRange(source), destMultiArray(dest), 3.0); \endcode \see vigra::discErosion() */ doxygen_overloaded_function(template <...> void multiGrayscaleDilation) template void multiGrayscaleDilation( SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, float sigma) { typedef typename NumericTraits::ValueType DestType; typedef typename NumericTraits::Promote TmpType; DestType MinValue = NumericTraits::min(); DestType MaxValue = NumericTraits::max(); enum { N = 1 + SrcIterator::level }; // temporay array to hold the current line to enable in-place operation ArrayVector tmp( shape[0] ); typedef MultiArrayNavigator SNavigator; typedef MultiArrayNavigator DNavigator; int MaxDim = 0; for( int i=0; i MaxValue) { MultiArray tmpArray(shape); detail::internalSeparableMultiArrayDistTmp( s, shape, src, tmpArray.traverser_begin(), typename AccessorTraits::default_accessor(), sigma, true ); transformMultiArray( tmpArray.traverser_begin(), shape, typename AccessorTraits::default_accessor(), d, dest, ifThenElse( Arg1() > Param(MaxValue), Param(MaxValue), ifThenElse( Arg1() < Param(MinValue), Param(MinValue), Arg1() ) ) ); } else { detail::internalSeparableMultiArrayDistTmp( s, shape, src, d, dest, sigma, true ); } } template inline void multiGrayscaleDilation( triple const & source, pair const & dest, float sigma) { multiGrayscaleDilation( source.first, source.second, source.third, dest.first, dest.second, sigma); } //@} } //-- namespace vigra #endif //-- VIGRA_MULTI_MORPHOLOGY_HXX gamera-3.3.3/include/vigra/multi_pointoperators.hxx0000644000076500000000000020052711261456425021544 0ustar chriswheel//-- -*- c++ -*- /************************************************************************/ /* */ /* Copyright 2003 by Ullrich Koethe, B. Seppke, F. Heinrich */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MULTI_POINTOPERATORS_H #define VIGRA_MULTI_POINTOPERATORS_H #include "initimage.hxx" #include "copyimage.hxx" #include "transformimage.hxx" #include "combineimages.hxx" #include "inspectimage.hxx" #include "multi_array.hxx" #include "metaprogramming.hxx" namespace vigra { /** \addtogroup MultiPointoperators Point operators for multi-dimensional arrays. Copy, transform, and inspect arbitrary dimensional arrays which are represented by iterators compatible to \ref MultiIteratorPage. Note that are range is here specified by a pair: an iterator referring to the first point of the array and a shape object specifying the size of the (rectangular) ROI. \#include \<vigra/multi_pointoperators.hxx\> */ //@{ /********************************************************/ /* */ /* initMultiArray */ /* */ /********************************************************/ template inline void initMultiArrayImpl(Iterator s, Shape const & shape, Accessor a, VALUETYPE const & v, MetaInt<0>) { initLine(s, s + shape[0], a, v); } template void initMultiArrayImpl(Iterator s, Shape const & shape, Accessor a, VALUETYPE const & v, MetaInt) { Iterator send = s + shape[N]; for(; s < send; ++s) { initMultiArrayImpl(s.begin(), shape, a, v, MetaInt()); } } /** \brief Write a value to every pixel in a multi-dimensional array. This function can be used to init the array which must be represented by a pair of iterators compatible to \ref vigra::MultiIterator. It uses an accessor to access the data alements. Note that the iterator range must be specified by a shape object, because otherwise we could not control the range simultaneously in all dimensions (this is a necessary consequence of the \ref vigra::MultiIterator design). The initial value can either be a constant of appropriate type (compatible with the destination's value_type), or a functor with compatible result_type. These two cases are automatically distinguished when FunctorTraits::isInitializer yields VigraTrueType. Since the functor is passed by const reference, its operator() must be const, and ist internal state may need to be mutable. Declarations: pass arguments explicitly: \code namespace vigra { template void initMultiArray(Iterator s, Shape const & shape, Accessor a, VALUETYPE const & v); template void initMultiArray(Iterator s, Shape const & shape, Accessor a, FUNCTOR const & f); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void initMultiArray(triple const & s, VALUETYPE const & v); template void initMultiArray(triple const & s, FUNCTOR const & f); } \endcode Usage: \#include \<vigra/multi_pointoperators.hxx\>
Namespace: vigra \code typedef vigra::MultiArray<3, int> Array; Array array(Array::size_type(100, 200, 50)); // zero the array vigra::initMultiArray(destMultiArrayRange(array), 0); \endcode Required Interface: The function accepts either a value that is copied into every destination element: \code MultiIterator begin; Accessor accessor; VALUETYPE v; accessor.set(v, begin); \endcode or a functor that is called (without argument) at every location, and the result is written into the current element. Internally, functors are recognized by the meta function FunctorTraits::isInitializer yielding VigraTrueType. Make sure that your functor correctly defines FunctorTraits because otherwise the code will not compile. \code MultiIterator begin; Accessor accessor; FUNCTOR f; assert(typeid(FunctorTraits::isInitializer) == typeid(VigraTrueType)); accessor.set(f(), begin); \endcode */ doxygen_overloaded_function(template <...> void initMultiArray) template inline void initMultiArray(Iterator s, Shape const & shape, Accessor a, VALUETYPE const & v) { initMultiArrayImpl(s, shape, a, v, MetaInt()); } template inline void initMultiArray(triple const & s, VALUETYPE const & v) { initMultiArray(s.first, s.second, s.third, v); } /********************************************************/ /* */ /* initMultiArrayBorder */ /* */ /********************************************************/ /** \brief Write value to the specified border values in the array. */template inline void initMultiArrayBorder( Iterator upperleft, Diff_type shape, Accessor a, int border_width, VALUETYPE v) { Diff_type border(shape); for(unsigned int dim=0; dim shape[dim]) ? shape[dim] : border_width; } for(unsigned int dim=0; dim inline void initMultiArrayBorder( triple multiArray, int border_width, VALUETYPE v) { initMultiArrayBorder(multiArray.first, multiArray.second, multiArray.third, border_width, v); } /********************************************************/ /* */ /* copyMultiArray */ /* */ /********************************************************/ template void copyMultiArrayImpl(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, MetaInt<0>) { if(sshape[0] == 1) { initLine(d, d + dshape[0], dest, src(s)); } else { copyLine(s, s + sshape[0], src, d, dest); } } template void copyMultiArrayImpl(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, MetaInt) { DestIterator dend = d + dshape[N]; if(sshape[N] == 1) { for(; d < dend; ++d) { copyMultiArrayImpl(s.begin(), sshape, src, d.begin(), dshape, dest, MetaInt()); } } else { for(; d < dend; ++s, ++d) { copyMultiArrayImpl(s.begin(), sshape, src, d.begin(), dshape, dest, MetaInt()); } } } /** \brief Copy a multi-dimensional array. This function can be applied in two modes:
Standard Mode:
If the source and destination arrays have the same size, the corresponding array elements are simply copied. If necessary, type conversion takes place.
Expanding Mode:
If the source array has length 1 along some (or even all) dimensions, the source value at index 0 is used for all destination elements in those dimensions. For example, if we have single row of data (column length is 1), we can copy it into a 2D image of the same width: The given row is automatically repeated for every row of the destination image. Again, type conversion os performed if necessary.
The arrays must be represented by iterators compatible with \ref vigra::MultiIterator, and the iteration range is specified by means of shape objects. If only the source shape is given the destination array is assumed to have the same shape, and standard mode is applied. If two shapes are given, the size of corresponding dimensions must be either equal (standard copy), or the source length must be 1 (expanding copy). The function uses accessors to access the data elements. Declarations: \#include \<vigra/multi_pointoperators.hxx\>
Namespace: vigra pass arguments explicitly: \code namespace vigra { template void copyMultiArray(SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest); template void copyMultiArray(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void copyMultiArray(triple const & src, pair const & dest); template void copyMultiArray(triple const & src, triple const & dest); } \endcode Usage - Standard Mode: \code typedef vigra::MultiArray<3, int> Array; Array src(Array::size_type(100, 200, 50)), dest(Array::size_type(100, 200, 50)); ... vigra::copyMultiArray(srcMultiArrayRange(src), destMultiArray(dest)); \endcode Usage - Expanding Mode: The source array is only 2D (it has depth 1). Thus, the destination will contain 50 identical copies of this image. Note that the destination shape must be passed to the algorithm for the expansion to work, so we use destMultiArrayRange() rather than destMultiArray(). \code typedef vigra::MultiArray<3, int> Array; Array src(Array::size_type(100, 200, 1)), dest(Array::size_type(100, 200, 50)); ... vigra::copyMultiArray(srcMultiArrayRange(src), destMultiArrayRange(dest)); \endcode Required Interface: \code MultiIterator src_begin, dest_begin; SrcAccessor src_accessor; DestAccessor dest_accessor; dest_accessor.set(src_accessor(src_begin), dest_begin); \endcode */ doxygen_overloaded_function(template <...> void copyMultiArray) template inline void copyMultiArray(SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest) { copyMultiArrayImpl(s, shape, src, d, shape, dest, MetaInt()); } template inline void copyMultiArray(triple const & src, pair const & dest) { copyMultiArray(src.first, src.second, src.third, dest.first, dest.second); } template void copyMultiArray(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest) { vigra_precondition(sshape.size() == dshape.size(), "copyMultiArray(): dimensionality of source and destination array differ"); for(unsigned int i=0; i()); } template inline void copyMultiArray(triple const & src, triple const & dest) { copyMultiArray(src.first, src.second, src.third, dest.first, dest.second, dest.third); } /********************************************************/ /* */ /* transformMultiArray */ /* */ /********************************************************/ template void transformMultiArrayReduceImpl(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, SrcShape const & reduceShape, Functor const & ff, MetaInt<0>) { DestIterator dend = d + dshape[0]; for(; d < dend; ++s.template dim<0>(), ++d) { Functor f = ff; inspectMultiArray(s, reduceShape, src, f); dest.set(f(), d); } } template void transformMultiArrayReduceImpl(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, SrcShape const & reduceShape, Functor const & f, MetaInt) { DestIterator dend = d + dshape[N]; for(; d < dend; ++s.template dim(), ++d) { transformMultiArrayReduceImpl(s, sshape, src, d.begin(), dshape, dest, reduceShape, f, MetaInt()); } } template void transformMultiArrayImpl(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f, VigraTrueType) { // reduce mode SrcShape reduceShape = sshape; for(unsigned int i=0; i()); } template void transformMultiArrayExpandImpl(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f, MetaInt<0>) { if(sshape[0] == 1) { initLine(d, d + dshape[0], dest, f(src(s))); } else { transformLine(s, s + sshape[0], src, d, dest, f); } } template void transformMultiArrayExpandImpl(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f, MetaInt) { DestIterator dend = d + dshape[N]; if(sshape[N] == 1) { for(; d < dend; ++d) { transformMultiArrayExpandImpl(s.begin(), sshape, src, d.begin(), dshape, dest, f, MetaInt()); } } else { for(; d < dend; ++s, ++d) { transformMultiArrayExpandImpl(s.begin(), sshape, src, d.begin(), dshape, dest, f, MetaInt()); } } } template void transformMultiArrayImpl(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f, VigraFalseType) { // expand mode for(unsigned int i=0; i()); } /** \brief Transform a multi-dimensional array with a unary function or functor. This function can be applied in three modes:
Standard Mode:
If the source and destination arrays have the same size, the transformation given by the functor is applied to every source element and the result written into the corresponding destination element. Unary functions, unary functors from the STL and the functors specifically defined in \ref TransformFunctor can be used in standard mode. Creation of new functors is easiest by using \ref FunctorExpressions.
Expanding Mode:
If the source array has length 1 along some (or even all) dimensions, the source value at index 0 is used for all destination elements in those dimensions. In other words, the source index is not incremented along these dimensions, but the transformation functor is applied as usual. So, we can expand a small array (e.g. a single row of data, column length is 1), into a larger one (e.g. a 2D image with the same width): the given values are simply reused as necessary (e.g. for every row of the destination image). The same functors as in standard mode can be applied.
Reducing Mode:
If the destination array has length 1 along some (or even all) dimensions, the source values in these dimensions are reduced to single values by means of a suitable functor (e.g. \ref vigra::ReduceFunctor), which supports two function call operators: one with a single argument to collect the values, and without argument to obtain the final (reduced) result. This behavior is a multi-dimensional generalization of the C++ standard function std::accumulate().
The arrays must be represented by iterators compatible with \ref vigra::MultiIterator, and the iteration range is specified by means of shape objects. If only the source shape is given the destination array is assumed to have the same shape, and standard mode is applied. If two shapes are given, the size of corresponding dimensions must be either equal (standard copy), or the source length must be 1 (expand mode), or the destination length must be 1 (reduce mode). However, reduction and expansion cannot be executed at the same time, so the latter conditions are mutual exclusive, even if they apply to different dimensions. The function uses accessors to access the data elements. Declarations: \#include \<vigra/multi_pointoperators.hxx\>
Namespace: vigra pass arguments explicitly: \code namespace vigra { template void transformMultiArray(SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, Functor const & f); template void transformMultiArray(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void transformMultiArray(triple const & src, pair const & dest, Functor const & f); template void transformMultiArray(triple const & src, triple const & dest, Functor const & f) } \endcode Usage - Standard Mode: Source and destination array have the same size. \code #include // for sqrt() typedef vigra::MultiArray<3, float> Array; Array src(Array::size_type(100, 200, 50)), dest(Array::size_type(100, 200, 50)); ... vigra::transformMultiArray(srcMultiArrayRange(src), destMultiArray(dest), (float(*)(float))&std::sqrt ); \endcode Usage - Expand Mode: The source array is only 2D (it has depth 1). Thus, the destination will contain 50 identical copies of the transformed source array. Note that the destination shape must be passed to the algorithm for the expansion to work, so we use destMultiArrayRange() rather than destMultiArray(). \code #include // for sqrt() typedef vigra::MultiArray<3, float> Array; Array src(Array::size_type(100, 200, 1)), dest(Array::size_type(100, 200, 50)); ... vigra::transformMultiArray(srcMultiArrayRange(src), destMultiArrayRange(dest), (float(*)(float))&std::sqrt ); \endcode Usage - Reduce Mode: The destination array is only 1D (it's width and height are 1). Thus, it will contain accumulated data for every slice of the source volume (or for every frame, if the source is intepreted as an image sequence). In the example, we use the functor \ref vigra::FindAverage to calculate the average gray value of every slice. Note that the destination shape must also be passed for the reduction to work, so we use destMultiArrayRange() rather than destMultiArray(). \code typedef vigra::MultiArray<3, float> Array; Array src(Array::size_type(100, 200, 50)), dest(Array::size_type(1, 1, 50)); ... vigra::transformMultiArray(srcMultiArrayRange(src), destMultiArrayRange(dest), vigra::FindAverage() ); \endcode Required Interface: In standard and expand mode, the functor must be a model of UnaryFunction (i.e. support function call with one argument and a return value res = functor(arg)): \code MultiIterator src_begin, src_end, dest_begin; SrcAccessor src_accessor; DestAccessor dest_accessor; Functor functor; dest_accessor.set(functor(src_accessor(src_begin)), dest_begin); \endcode In reduce mode, it must be a model of UnaryAnalyser (i.e. support function call with one argument and no return vakue functor(arg)) and Initializer (i.e. support function call with no argument, but return value res = functor()). Internally, such functors are recognized by the meta functions FunctorTraits::isUnaryAnalyser and FunctorTraits::isInitializer which must both yield VigraTrueType. Make sure that your functor correctly defines FunctorTraits because otherwise reduce mode will not work. In addition, the functor must be copy constructible in order to start each reduction with a fresh functor. \code MultiIterator src_begin, src_end, dest_begin; SrcAccessor src_accessor; DestAccessor dest_accessor; FUNCTOR initial_functor, functor(initial_functor); assert(typeid(FunctorTraits::isInitializer) == typeid(VigraTrueType)); assert(typeid(FunctorTraits::isUnaryAnalyser) == typeid(VigraTrueType)); functor(src_accessor(src_begin)); dest_accessor.set(functor(), dest_begin); \endcode */ doxygen_overloaded_function(template <...> void transformMultiArray) template inline void transformMultiArray(SrcIterator s, SrcShape const & shape, SrcAccessor src, DestIterator d, DestAccessor dest, Functor const & f) { transformMultiArrayExpandImpl(s, shape, src, d, shape, dest, f, MetaInt()); } template inline void transformMultiArray(triple const & src, pair const & dest, Functor const & f) { transformMultiArray(src.first, src.second, src.third, dest.first, dest.second, f); } template void transformMultiArray(SrcIterator s, SrcShape const & sshape, SrcAccessor src, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f) { vigra_precondition(sshape.size() == dshape.size(), "transformMultiArray(): dimensionality of source and destination array differ"); typedef FunctorTraits FT; typedef typename And::result isAnalyserInitializer; transformMultiArrayImpl(s, sshape, src, d, dshape, dest, f, isAnalyserInitializer()); } template inline void transformMultiArray(triple const & src, triple const & dest, Functor const & f) { transformMultiArray(src.first, src.second, src.third, dest.first, dest.second, dest.third, f); } /********************************************************/ /* */ /* combineTwoMultiArrays */ /* */ /********************************************************/ template void combineTwoMultiArraysReduceImpl( SrcIterator1 s1, SrcShape const & sshape, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, DestIterator d, DestShape const & dshape, DestAccessor dest, SrcShape const & reduceShape, Functor const & ff, MetaInt<0>) { DestIterator dend = d + dshape[0]; for(; d < dend; ++s1.template dim<0>(), ++s2.template dim<0>(), ++d) { Functor f = ff; inspectTwoMultiArrays(s1, reduceShape, src1, s2, src2, f); dest.set(f(), d); } } template void combineTwoMultiArraysReduceImpl( SrcIterator1 s1, SrcShape const & sshape, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, DestIterator d, DestShape const & dshape, DestAccessor dest, SrcShape const & reduceShape, Functor const & f, MetaInt) { DestIterator dend = d + dshape[N]; for(; d < dend; ++s1.template dim(), ++s2.template dim(), ++d) { combineTwoMultiArraysReduceImpl(s1, sshape, src1, s2, src2, d.begin(), dshape, dest, reduceShape, f, MetaInt()); } } template void combineTwoMultiArraysImpl( SrcIterator1 s1, SrcShape1 const & sshape1, SrcAccessor1 src1, SrcIterator2 s2, SrcShape2 const & sshape2, SrcAccessor2 src2, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f, VigraTrueType) { // reduce mode SrcShape1 reduceShape = sshape1; for(unsigned int i=0; i()); } template void combineTwoMultiArraysExpandImpl( SrcIterator1 s1, SrcShape1 const & sshape1, SrcAccessor1 src1, SrcIterator2 s2, SrcShape2 const & sshape2, SrcAccessor2 src2, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f, MetaInt<0>) { DestIterator dend = d + dshape[0]; if(sshape1[0] == 1 && sshape2[0] == 1) { initLine(d, dend, dest, f(src1(s1), src2(s2))); } else if(sshape1[0] == 1) { typename SrcAccessor1::value_type sv1 = src1(s1); for(; d < dend; ++d, ++s2) dest.set(f(sv1, src2(s2)), d); } else if(sshape2[0] == 1) { typename SrcAccessor2::value_type sv2 = src2(s2); for(; d < dend; ++d, ++s1) dest.set(f(src1(s1), sv2), d); } else { combineTwoLines(s1, s1 + sshape1[0], src1, s2, src2, d, dest, f); } } template void combineTwoMultiArraysExpandImpl( SrcIterator1 s1, SrcShape1 const & sshape1, SrcAccessor1 src1, SrcIterator2 s2, SrcShape2 const & sshape2, SrcAccessor2 src2, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f, MetaInt) { DestIterator dend = d + dshape[N]; int s1inc = sshape1[N] == 1 ? 0 : 1; int s2inc = sshape2[N] == 1 ? 0 : 1; for(; d < dend; ++d, s1 += s1inc, s2 += s2inc) { combineTwoMultiArraysExpandImpl(s1.begin(), sshape1, src1, s2.begin(), sshape2, src2, d.begin(), dshape, dest, f, MetaInt()); } } template void combineTwoMultiArraysImpl( SrcIterator1 s1, SrcShape1 const & sshape1, SrcAccessor1 src1, SrcIterator2 s2, SrcShape2 const & sshape2, SrcAccessor2 src2, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f, VigraFalseType) { // expand mode for(unsigned int i=0; i()); } /** \brief Combine two multi-dimensional arrays into one using a binary function or functor. This function can be applied in three modes:
Standard Mode:
If the source and destination arrays have the same size, the transformation given by the functor is applied to every pair of corresponding source elements and the result written into the corresponding destination element. Binary functions, binary functors from the STL and the functors specifically defined in \ref CombineFunctor can be used in standard mode. Creation of new functors is easiest by using \ref FunctorExpressions.
Expanding Mode:
If the source arrays have length 1 along some (or even all) dimensions, the source values at index 0 are used for all destination elements in those dimensions. In other words, the source index is not incremented along those dimensions, but the transformation functor is applied as usual. So, we can expand small arrays (e.g. a single row of data, column length is 1), into larger ones (e.g. a 2D image with the same width): the given values are simply reused as necessary (e.g. for every row of the destination image). It is not even necessary that the source array shapes are equal. For example, we can combine a small array with one that hase the same size as the destination array. The same functors as in standard mode can be applied.
Reducing Mode:
If the destination array has length 1 along some (or even all) dimensions, the source values in these dimensions are reduced to single values by means of a suitable functor which supports two function call operators: one with two arguments to collect the values, and one without argument to obtain the final (reduced) result. This behavior is a multi-dimensional generalization of the C++ standard function std::accumulate().
The arrays must be represented by iterators compatible with \ref vigra::MultiIterator, and the iteration range is specified by means of shape objects. If only a single source shape is given the destination array is assumed to have the same shape, and standard mode is applied. If three shapes are given, the size of corresponding dimensions must be either equal (standard copy), or the length of this dimension must be 1 in one or both source arrays (expand mode), or the destination length must be 1 (reduce mode). However, reduction and expansion cannot be executed at the same time, so the latter conditions are mutual exclusive, even if they apply to different dimensions. The function uses accessors to access the data elements. Declarations: \#include \<vigra/multi_pointoperators.hxx\>
Namespace: vigra pass arguments explicitly: \code namespace vigra { template void combineTwoMultiArrays( SrcIterator1 s1, SrcShape const & shape, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, DestIterator d, DestAccessor dest, Functor const & f); template void combineTwoMultiArrays( SrcIterator1 s1, SrcShape1 const & sshape1, SrcAccessor1 src1, SrcIterator2 s2, SrcShape2 const & sshape2, SrcAccessor2 src2, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void combineTwoMultiArrays( triple const & src1, pair const & src2, pair const & dest, Functor const & f); template void combineTwoMultiArrays( triple const & src1, triple const & src2, triple const & dest, Functor const & f); } \endcode Usage - Standard Mode: Source and destination arrays have the same size. \code #include // for std::plus typedef vigra::MultiArray<3, int> Array; Array src1(Array::size_type(100, 200, 50)), src2(Array::size_type(100, 200, 50)), dest(Array::size_type(100, 200, 50)); ... vigra::combineTwoMultiArrays( srcMultiArrayRange(src1), srcMultiArray(src2), destMultiArray(dest), std::plus()); \endcode Usage - Expand Mode: One source array is only 2D (it has depth 1). This image will be added to every slice of the other source array, and the result if written into the corresponding destination slice. Note that the shapes of all arrays must be passed to the algorithm, so we use srcMultiArrayRange() and destMultiArrayRange() rather than srcMultiArray() and destMultiArray(). \code #include // for std::plus typedef vigra::MultiArray<3, int> Array; Array src1(Array::size_type(100, 200, 1)), src2(Array::size_type(100, 200, 50)), dest(Array::size_type(100, 200, 50)); ... vigra::combineTwoMultiArrays( srcMultiArrayRange(src1), srcMultiArray(src2), destMultiArray(dest), std::plus()); \endcode Usage - Reduce Mode: The destination array is only 1D (it's width and height are 1). Thus, it will contain accumulated data for every slice of the source volumes (or for every frame, if the sources are intepreted as image sequences). In the example, we use \ref vigra::ReduceFunctor together with a functor expression (see \ref FunctorExpressions) to calculate the total absolute difference of the gray values in every pair of source slices. Note that the shapes of all arrays must be passed to the algorithm in order for the reduction to work, so we use srcMultiArrayRange() and destMultiArrayRange() rather than srcMultiArray() and destMultiArray(). \code #include using namespace vigra::functor; typedef vigra::MultiArray<3, int> Array; Array src1(Array::size_type(100, 200, 50)), src2(Array::size_type(100, 200, 50)), dest(Array::size_type(1, 1, 50)); ... vigra::combineTwoMultiArrays( srcMultiArrayRange(src1), srcMultiArray(src2), destMultiArray(dest), reduceFunctor(Arg1() + abs(Arg2() - Arg3()), 0) ); // Arg1() is the sum accumulated so far, initialzed with 0 \endcode Required Interface: In standard and expand mode, the functor must be a model of BinaryFunction (i.e. support function call with two arguments and a return value res = functor(arg1, arg2)): \code MultiIterator src1_begin, src2_begin, dest_begin; SrcAccessor1 src1_accessor; SrcAccessor2 src2_accessor; DestAccessor dest_accessor; Functor functor; dest_accessor.set( functor(src1_accessor(src1_begin), src2_accessor(src2_begin)), dest_begin); \endcode In reduce mode, it must be a model of BinaryAnalyser (i.e. support function call with two arguments and no return vakue functor(arg1, arg2)) and Initializer (i.e. support function call with no argument, but return value res = functor()). Internally, such functors are recognized by the meta functions FunctorTraits::isBinaryAnalyser and FunctorTraits::isInitializer which must both yield VigraTrueType. Make sure that your functor correctly defines FunctorTraits because otherwise reduce mode will not work. In addition, the functor must be copy constructible in order to start each reduction with a fresh functor. \code MultiIterator src1_begin, src2_begin, dest_begin; SrcAccessor1 src1_accessor; SrcAccessor2 src2_accessor; DestAccessor dest_accessor; FUNCTOR initial_functor, functor(initial_functor); assert(typeid(FunctorTraits::isInitializer) == typeid(VigraTrueType)); assert(typeid(FunctorTraits::isBinaryAnalyser) == typeid(VigraTrueType)); functor(src1_accessor(src1_begin), src2_accessor(src2_begin)); dest_accessor.set(functor(), dest_begin); \endcode */ doxygen_overloaded_function(template <...> void combineTwoMultiArrays) template inline void combineTwoMultiArrays(SrcIterator1 s1, SrcShape const & shape, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, DestIterator d, DestAccessor dest, Functor const & f) { combineTwoMultiArraysExpandImpl(s1, shape, src1, s2, shape, src2, d, shape, dest, f, MetaInt()); } template inline void combineTwoMultiArrays(triple const & src1, pair const & src2, pair const & dest, Functor const & f) { combineTwoMultiArrays( src1.first, src1.second, src1.third, src2.first, src2.second, dest.first, dest.second, f); } template void combineTwoMultiArrays( SrcIterator1 s1, SrcShape1 const & sshape1, SrcAccessor1 src1, SrcIterator2 s2, SrcShape2 const & sshape2, SrcAccessor2 src2, DestIterator d, DestShape const & dshape, DestAccessor dest, Functor const & f) { vigra_precondition(sshape1.size() == dshape.size() && sshape2.size() == dshape.size(), "combineTwoMultiArrays(): dimensionality of source and destination arrays differ"); typedef FunctorTraits FT; typedef typename And::result isAnalyserInitializer; combineTwoMultiArraysImpl(s1, sshape1, src1, s2, sshape2, src2, d, dshape, dest, f, isAnalyserInitializer()); } template inline void combineTwoMultiArrays( triple const & src1, triple const & src2, triple const & dest, Functor const & f) { combineTwoMultiArrays(src1.first, src1.second, src1.third, src2.first, src2.second, src2.third, dest.first, dest.second, dest.third, f); } /********************************************************/ /* */ /* combineThreeMultiArrays */ /* */ /********************************************************/ template inline void combineThreeMultiArraysImpl(SrcIterator1 s1, SrcShape const & shape, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, SrcIterator3 s3, SrcAccessor3 src3, DestIterator d, DestAccessor dest, Functor const & f, MetaInt<0>) { combineThreeLines(s1, s1 + shape[0], src1, s2, src2, s3, src3, d, dest, f); } template void combineThreeMultiArraysImpl(SrcIterator1 s1, SrcShape const & shape, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, SrcIterator3 s3, SrcAccessor3 src3, DestIterator d, DestAccessor dest, Functor const & f, MetaInt) { SrcIterator1 s1end = s1 + shape[N]; for(; s1 < s1end; ++s1, ++s2, ++s3, ++d) { combineThreeMultiArraysImpl(s1.begin(), shape, src1, s2.begin(), src2, s3.begin(), src3, d.begin(), dest, f, MetaInt()); } } /** \brief Combine three multi-dimensional arrays into one using a ternary function or functor. Except for the fact that it operates on three input arrays, this function is identical to \ref combineTwoMultiArrays(). Declarations: pass arguments explicitly: \code namespace vigra { template void combineThreeMultiArrays(SrcIterator1 s1, SrcShape const & shape, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, SrcIterator3 s3, SrcAccessor3 src3, DestIterator d, DestAccessor dest, Functor const & f); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void combineThreeMultiArrays(triple const & src1, pair const & src2, pair const & src3, pair const & dest, Functor const & f); } \endcode Usage: \#include \<vigra/multi_pointoperators.hxx\>
Namespace: vigra \code #include // for plus typedef vigra::MultiArray<3, int> Array; Array src1(Array::size_type(100, 200, 50)), src2(Array::size_type(100, 200, 50)), src3(Array::size_type(100, 200, 50)), dest(Array::size_type(100, 200, 50)); ... vigra::combineThreeMultiArrays( srcMultiArrayRange(src1), srcMultiArray(src2), srcMultiArray(src3), destMultiArray(dest), SomeThreeArgumentFunctor()); \endcode */ doxygen_overloaded_function(template <...> void combineThreeMultiArrays) template inline void combineThreeMultiArrays(SrcIterator1 s1, SrcShape const & shape, SrcAccessor1 src1, SrcIterator2 s2, SrcAccessor2 src2, SrcIterator3 s3, SrcAccessor3 src3, DestIterator d, DestAccessor dest, Functor const & f) { combineThreeMultiArraysImpl(s1, shape, src1, s2, src2, s3, src3, d, dest, f, MetaInt()); } template inline void combineThreeMultiArrays(triple const & src1, pair const & src2, pair const & src3, pair const & dest, Functor const & f) { combineThreeMultiArrays( src1.first, src1.second, src1.third, src2.first, src2.second, src3.first, src3.second, dest.first, dest.second, f); } /********************************************************/ /* */ /* inspectMultiArray */ /* */ /********************************************************/ template inline void inspectMultiArrayImpl(Iterator s, Shape const & shape, Accessor a, Functor & f, MetaInt<0>) { inspectLine(s, s + shape[0], a, f); } template void inspectMultiArrayImpl(Iterator s, Shape const & shape, Accessor a, Functor & f, MetaInt) { Iterator send = s + shape[N]; for(; s < send; ++s) { inspectMultiArrayImpl(s.begin(), shape, a, f, MetaInt()); } } /** \brief Call an analyzing functor at every element of a multi-dimensional array. This function can be used to collect statistics of the array etc. The results must be stored in the functor, which serves as a return value. The arrays must be represented by iterators compatible with \ref vigra::MultiIterator. The function uses an accessor to access the pixel data. Note that the iterator range must be specified by a shape object, because otherwise we could not control the range simultaneously in all dimensions (this is a necessary consequence of the \ref vigra::MultiIterator design). Declarations: pass arguments explicitly: \code namespace vigra { template void inspectMultiArray(Iterator s, Shape const & shape, Accessor a, Functor & f); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void inspectMultiArray(triple const & s, Functor & f); } \endcode Usage: \#include \<vigra/multi_pointoperators.hxx\>
Namespace: vigra \code typedef vigra::MultiArray<3, int> Array; Array array(Array::size_type(100, 200, 50)); // init functor vigra::FindMinMax minmax; vigra::inspectMultiArray(srcMultiArrayRange(array), minmax); cout << "Min: " << minmax.min << " Max: " << minmax.max; \endcode Required Interface: \code MultiIterator src_begin; Accessor accessor; Functor functor; functor(accessor(src_begin)); \endcode */ doxygen_overloaded_function(template <...> void inspectMultiArray) template inline void inspectMultiArray(Iterator s, Shape const & shape, Accessor a, Functor & f) { inspectMultiArrayImpl(s, shape, a, f, MetaInt()); } template inline void inspectMultiArray(triple const & s, Functor & f) { inspectMultiArray(s.first, s.second, s.third, f); } /********************************************************/ /* */ /* inspectTwoMultiArrays */ /* */ /********************************************************/ template inline void inspectTwoMultiArraysImpl(Iterator1 s1, Shape const & shape, Accessor1 a1, Iterator2 s2, Accessor2 a2, Functor & f, MetaInt<0>) { inspectTwoLines(s1, s1 + shape[0], a1, s2, a2, f); } template void inspectTwoMultiArraysImpl(Iterator1 s1, Shape const & shape, Accessor1 a1, Iterator2 s2, Accessor2 a2, Functor & f, MetaInt) { Iterator1 s1end = s1 + shape[N]; for(; s1 < s1end; ++s1, ++s2) { inspectTwoMultiArraysImpl(s1.begin(), shape, a1, s2.begin(), a2, f, MetaInt()); } } /** \brief Call an analyzing functor at all corresponding elements of two multi-dimensional arrays. This function can be used to collect statistics of the array etc. The results must be stored in the functor, which serves as a return value. The arrays must be represented by iterators compatible with \ref vigra::MultiIterator. The function uses an accessor to access the pixel data. Note that the iterator range must be specified by a shape object, because otherwise we could not control the range simultaneously in all dimensions (this is a necessary consequence of the \ref vigra::MultiIterator design). Declarations: pass arguments explicitly: \code namespace vigra { template void inspectTwoMultiArrays(Iterator1 s1, Shape const & shape, Accessor1 a1, Iterator2 s2, Accessor2 a2, Functor & f); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void inspectTwoMultiArrays(triple const & s1, pair const & s2, Functor & f); } \endcode Usage: \#include \<vigra/multi_pointoperators.hxx\>
Namespace: vigra \code typedef vigra::MultiArray<3, int> Array; Array array1(Array::size_type(100, 200, 50)), array2(Array::size_type(100, 200, 50)); // init functor SomeStatisticsFunctor stats(..); vigra::inspectTwoMultiArrays(srcMultiArrayRange(array1), srcMultiArray(array2), stats); \endcode Required Interface: \code MultiIterator src1_begin, src2_begin; Accessor a1, a2; Functor functor; functor(a1(src1_begin), a2(src2_begin)); \endcode */ doxygen_overloaded_function(template <...> void inspectTwoMultiArrays) template inline void inspectTwoMultiArrays(Iterator1 s1, Shape const & shape, Accessor1 a1, Iterator2 s2, Accessor2 a2, Functor & f) { inspectTwoMultiArraysImpl(s1, shape, a1, s2, a2, f, MetaInt()); } template inline void inspectTwoMultiArrays(triple const & s1, pair const & s2, Functor & f) { inspectTwoMultiArrays(s1.first, s1.second, s1.third, s2.first, s2.second, f); } //@} } //-- namespace vigra #endif //-- VIGRA_MULTI_POINTOPERATORS_H gamera-3.3.3/include/vigra/multi_resize.hxx0000644000076500000000000002743711261456425017764 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_MULTI_RESIZE_HXX #define VIGRA_MULTI_RESIZE_HXX #include #include "resizeimage.hxx" namespace vigra { namespace detail { template void internalResizeMultiArrayOneDimension( SrcIterator si, Shape const & sshape, SrcAccessor src, DestIterator di, Shape const & dshape, DestAccessor dest, Kernel const & spline, unsigned int d) { enum { N = 1 + SrcIterator::level }; typedef typename NumericTraits::RealPromote TmpType; typedef MultiArrayNavigator SNavigator; typedef MultiArrayNavigator DNavigator; SNavigator snav( si, sshape, d ); DNavigator dnav( di, dshape, d ); int ssize = sshape[d]; int dsize = dshape[d]; vigra_precondition(ssize > 1, "resizeMultiArraySplineInterpolation(): " "Source array too small.\n"); Rational ratio(dsize - 1, ssize - 1); Rational offset(0); resampling_detail::MapTargetToSourceCoordinate mapCoordinate(ratio, offset); int period = lcm(ratio.numerator(), ratio.denominator()); ArrayVector const & prefilterCoeffs = spline.prefilterCoefficients(); ArrayVector > kernels(period); createResamplingKernels(spline, mapCoordinate, kernels); // temporay array to hold the current line to enable in-place operation ArrayVector tmp( ssize ); ArrayVector::iterator t = tmp.begin(), tend = tmp.end(); typename AccessorTraits::default_accessor ta; for( ; snav.hasMore(); snav++, dnav++ ) { // first copy source to temp for maximum cache efficiency copyLine( snav.begin(), snav.end(), src, t, ta); for(unsigned int b = 0; b < prefilterCoeffs.size(); ++b) { recursiveFilterLine(t, tend, ta, t, ta, prefilterCoeffs[b], BORDER_TREATMENT_REFLECT); } resamplingConvolveLine(t, tend, ta, dnav.begin(), dnav.begin() + dsize, dest, kernels, mapCoordinate); } } } // namespace detail /** \addtogroup GeometricTransformations Geometric Transformations */ //@{ /***************************************************************/ /* */ /* resizeMultiArraySplineInterpolation */ /* */ /***************************************************************/ /** \brief Resize MultiArray using B-spline interpolation. Declarations: pass arguments explicitly: \code namespace vigra { template > void resizeMultiArraySplineInterpolation( SrcIterator si, Shape const & sshape, SrcAccessor src, DestIterator di, Shape const & dshape, DestAccessor dest, Kernel const & spline = BSpline<3, double>()); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template > void resizeMultiArraySplineInterpolation( triple src, triple dest, Kernel const & spline = BSpline<3, double>()); } \endcode The function implements separable spline interpolation algorithm described in M. Unser, A. Aldroubi, M. Eden, "B-Spline Signal Processing" IEEE Transactions on Signal Processing, vol. 41, no. 2, pp. 821-833 (part I), pp. 834-848 (part II), 1993. to obtain optimal interpolation quality and speed. You may pass the funcion a spline of arbitrary order (e.g. BSpline or CatmullRomSpline). The default is a third order spline which gives a twice continuously differentiable interpolant. The implementation ensures that image values are interpolated rather than smoothed by first calling a recursive (sharpening) prefilter as described in the above paper. Then the actual interpolation is done using \ref resamplingConvolveLine(). The range of both the input and output images (resp. regions) must be given. The input image must have a size of at least 4x4, the destination of at least 2x2. The scaling factors are then calculated accordingly. If the source image is larger than the destination, it is smoothed (band limited) using a recursive exponential filter. The source value_type (SrcAccessor::value_type) must be a linear algebra, i.e. it must support addition, subtraction, and multiplication (+, -, *), multiplication with a scalar real number and \ref NumericTraits "NumericTraits". The function uses accessors. Usage: \#include \<vigra/multi_resize.hxx\>
Namespace: vigra \code typedef vigra::MultiArray<3, float>::difference_type Shape; vigra::MultiArray<3, float> src(Shape(5, 7, 10)), dest(Shape(9, 13, 19)); // double the size // use default cubic spline interpolator vigra::resizeMultiArraySplineInterpolation( srcMultiArrayRange(src), destMultiArrayRange(dest)); \endcode Required Interface: The source and destination iterators must be compatible with \ref vigra::MultiIterator. The array value types must be models of \ref LinearSpace. */ doxygen_overloaded_function(template <...> void resizeMultiArraySplineInterpolation) template void resizeMultiArraySplineInterpolation( SrcIterator si, Shape const & sshape, SrcAccessor src, DestIterator di, Shape const & dshape, DestAccessor dest, Kernel const & spline) { enum { N = 1 + SrcIterator::level }; typedef typename NumericTraits::RealPromote TmpType; typedef MultiArray TmpArray; typedef typename AccessorTraits::default_accessor TmpAccessor; if(N==1) { detail::internalResizeMultiArrayOneDimension(si, sshape, src, di, dshape, dest, spline, 0); } else { unsigned int d = 0; Shape tmpShape(sshape); tmpShape[d] = dshape[d]; MultiArray tmp(tmpShape); TmpAccessor ta; detail::internalResizeMultiArrayOneDimension(si, sshape, src, tmp.traverser_begin(), tmpShape, ta, spline, d); d = 1; for(; d dtmp(tmpShape); detail::internalResizeMultiArrayOneDimension(tmp.traverser_begin(), tmp.shape(), ta, dtmp.traverser_begin(), tmpShape, ta, spline, d); dtmp.swap(tmp); } detail::internalResizeMultiArrayOneDimension(tmp.traverser_begin(), tmp.shape(), ta, di, dshape, dest, spline, d); } } template inline void resizeMultiArraySplineInterpolation(triple src, triple dest, Kernel const & spline) { resizeMultiArraySplineInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third, spline); } template inline void resizeMultiArraySplineInterpolation( SrcIterator si, Shape const & sshape, SrcAccessor src, DestIterator di, Shape const & dshape, DestAccessor dest) { resizeMultiArraySplineInterpolation(si, sshape, src, di, dshape, dest, BSpline<3, double>()); } template inline void resizeMultiArraySplineInterpolation(triple src, triple dest) { resizeMultiArraySplineInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third); } //@} } // namespace vigra #endif // VIGRA_MULTI_RESIZE_HXX gamera-3.3.3/include/vigra/navigator.hxx0000644000076500000000000002054311261456425017232 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_NAVIGATOR_HXX #define VIGRA_NAVIGATOR_HXX namespace vigra { /********************************************************/ /* */ /* MultiArrayNavigator */ /* */ /********************************************************/ /** \brief A navigator that provides acces to the 1D subranges of an n-dimensional range given by a \ref vigra::MultiIterator and an nD shape. Normally, the innermost loop of an iteration extends over the innermost dimension of a given array. Sometimes, however, it is necessary to have some other dimension in the inner loop. For example, instead of iterating over the rows, the inner loop should extend over the columns. The class MultiArrayNavigator encapsulates the necessary functionality. Given an arbitrary dimensional array (represented by a vigra::MultiIterator/shape pair), and the desired inner loop dimension d, it moves the encapsulated iterator to all possible starting points of 1D subsets along the given dimension (e.g. all columns). By calling begin() and end(), one can then obtain an STL-compatible 1-dimensional iterator for the current subset. The template parameters specify the embedded iterator type and its dimension. Usage: \#include \<vigra/navigator.hxx\> Namespace: vigra \code typedef vigra::MultiArray<3, int> Array; Array a(Array::size_type(X, Y, Z)); typedef vigra::MultiArrayNavigator Navigator; for(int d=0; d<3; ++d) { // create Navigator for dimension d Navigator nav(a.traverser_begin(), a.shape(), d); // outer loop: move navigator to all starting points // of 1D subsets that run parallel to coordinate axis d for(; nav.hasMore(); ++nav) { // inner loop: linear iteration over current subset // d == {0, 1, 2}: interate along {x, y, z}-axis respectively Navigator::iterator i = nav.begin(), end = nav.end(); for(; i != end; ++i) // do something } } \endcode */ template class MultiArrayNavigator #ifndef DOXYGEN // doxygen doesn't understand this inheritance : public MultiArrayNavigator #endif { typedef MultiArrayNavigator base_type; public: enum { level = N-1 }; /** The required shape type for the given iterator type. */ typedef typename MULTI_ITERATOR::multi_difference_type shape_type; /** The iterator type for the inner loop (result of begin() and end()). */ typedef typename MULTI_ITERATOR::iterator iterator; /** Construct navigator for multi-dimensional iterator i, array shape shape and inner loop dimension inner_dimension. */ MultiArrayNavigator(MULTI_ITERATOR const & i, shape_type const & shape, unsigned int inner_dimension) : base_type(i, shape, inner_dimension), i_(i), end_(i) { if(inner_dimension != level) end_.template dim() += shape[level]; } /** Advance to next starting location. */ void operator++() { base_type::operator++(); if(base_type::atEnd() && i_ < end_) // this tests implicitly inner_dimension_ != level { ++i_.template dim(); if(i_ < end_) base_type::reset(i_); } } /** Advance to next starting location. */ void operator++(int) { ++*this; } /** true if there are more elements. */ bool hasMore() const { return this->inner_dimension_ == level ? base_type::hasMore() : i_ < end_; } /** true if iterator is exhausted. */ bool atEnd() const { return this->inner_dimension_ == level ? base_type::atEnd() : !( i_ < end_); } protected: void reset(MULTI_ITERATOR const & i) { end_ = i_ = i; if(this->inner_dimension_ != level) end_.template dim() += this->shape_[level]; base_type::reset(i); } MULTI_ITERATOR i_, end_; }; template class MultiArrayNavigator { public: enum { level = 0 }; typedef typename MULTI_ITERATOR::multi_difference_type shape_type; typedef typename MULTI_ITERATOR::iterator iterator; MultiArrayNavigator(MULTI_ITERATOR const & i, shape_type const & shape, unsigned int inner_dimension) : shape_(shape), inner_dimension_(inner_dimension), i_(i), end_(i) { if(inner_dimension != level) end_.template dim() += shape[level]; } void operator++() { ++i_.template dim(); } void operator++(int) { ++*this; } iterator begin() const { return i_.iteratorForDimension(inner_dimension_); } iterator end() const { return begin() + shape_[inner_dimension_]; } bool hasMore() const { return i_ < end_; } bool atEnd() const { return !( i_ < end_); } protected: void reset(MULTI_ITERATOR const & i) { end_ = i_ = i; if(inner_dimension_ != level) end_.template dim() += shape_[level]; } shape_type shape_; unsigned int inner_dimension_; MULTI_ITERATOR i_, end_; }; } // namespace vigra #endif /* VIGRA_NAVIGATOR_HXX */ gamera-3.3.3/include/vigra/noise_normalization.hxx0000644000076500000000000016711511261456425021332 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2006 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_NOISE_NORMALIZATION_HXX #define VIGRA_NOISE_NORMALIZATION_HXX #include "utilities.hxx" #include "tinyvector.hxx" #include "stdimage.hxx" #include "transformimage.hxx" #include "combineimages.hxx" #include "localminmax.hxx" #include "functorexpression.hxx" #include "numerictraits.hxx" #include "separableconvolution.hxx" #include "linear_solve.hxx" #include "array_vector.hxx" #include "static_assert.hxx" #include namespace vigra { /** \addtogroup NoiseNormalization Noise Normalization Estimate noise with intensity-dependent variance and transform it into additive Gaussian noise. */ //@{ /********************************************************/ /* */ /* NoiseNormalizationOptions */ /* */ /********************************************************/ /** \brief Pass options to one of the noise normalization functions. NoiseNormalizationOptions is an argument object that holds various optional parameters used by the noise normalization functions. If a parameter is not explicitly set, a suitable default will be used. Usage: \#include \<vigra/noise_normalization.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); std::vector > result; ... vigra::noiseVarianceEstimation(srcImageRange(src), result, vigra::NoiseNormalizationOptions().windowRadius(9).noiseVarianceInitialGuess(25.0)); \endcode */ class NoiseNormalizationOptions { public: /** Initialize all options with default values. */ NoiseNormalizationOptions() : window_radius(6), cluster_count(10), noise_estimation_quantile(1.5), averaging_quantile(0.8), noise_variance_initial_guess(10.0), use_gradient(true) {} /** Select the noise estimation algorithm. If \a r is true, use the gradient-based noise estimator according to Förstner (default). Otherwise, use an algorithm that uses the intensity values directly. */ NoiseNormalizationOptions & useGradient(bool r) { use_gradient = r; return *this; } /** Set the window radius for a single noise estimate. Every window of the given size gives raise to one intensity/variance pair.
Default: 6 pixels */ NoiseNormalizationOptions & windowRadius(unsigned int r) { vigra_precondition(r > 0, "NoiseNormalizationOptions: window radius must be > 0."); window_radius = r; return *this; } /** Set the number of clusters for non-parametric noise normalization. The intensity/variance pairs found are grouped into clusters before the noise normalization transform is computed.
Default: 10 clusters */ NoiseNormalizationOptions & clusterCount(unsigned int c) { vigra_precondition(c > 0, "NoiseNormalizationOptions: cluster count must be > 0."); cluster_count = c; return *this; } /** Set the quantile for cluster averaging. After clustering, the cluster center (i.e. average noise variance as a function of the average intensity in the cluster) is computed using only the cluster members whose estimated variance is below \a quantile times the maximum variance in the cluster.
Default: 0.8
Precondition: 0 < \a quantile <= 1.0 */ NoiseNormalizationOptions & averagingQuantile(double quantile) { vigra_precondition(quantile > 0.0 && quantile <= 1.0, "NoiseNormalizationOptions: averaging quantile must be between 0 and 1."); averaging_quantile = quantile; return *this; } /** Set the operating range of the robust noise estimator. Intensity changes that are larger than \a quantile times the current estimate of the noise variance are ignored by the robust noise estimator.
Default: 1.5
Precondition: 0 < \a quantile */ NoiseNormalizationOptions & noiseEstimationQuantile(double quantile) { vigra_precondition(quantile > 0.0, "NoiseNormalizationOptions: noise estimation quantile must be > 0."); noise_estimation_quantile = quantile; return *this; } /** Set the initial estimate of the noise variance. Robust noise variance estimation is an iterative procedure starting at the given value.
Default: 10.0
Precondition: 0 < \a quess */ NoiseNormalizationOptions & noiseVarianceInitialGuess(double guess) { vigra_precondition(guess > 0.0, "NoiseNormalizationOptions: noise variance initial guess must be > 0."); noise_variance_initial_guess = guess; return *this; } unsigned int window_radius, cluster_count; double noise_estimation_quantile, averaging_quantile, noise_variance_initial_guess; bool use_gradient; }; //@} template class NonparametricNoiseNormalizationFunctor { struct Segment { double lower, a, b, shift; }; ArrayVector segments_; template double exec(unsigned int k, T t) const { if(segments_[k].a == 0.0) { return t / VIGRA_CSTD::sqrt(segments_[k].b); } else { return 2.0 / segments_[k].a * VIGRA_CSTD::sqrt(std::max(0.0, segments_[k].a * t + segments_[k].b)); } } public: typedef ArgumentType argument_type; typedef ResultType result_type; template NonparametricNoiseNormalizationFunctor(Vector const & clusters) : segments_(clusters.size()-1) { for(unsigned int k = 0; k 0 ? if(k == 0) { segments_[k].shift = segments_[k].lower - exec(k, segments_[k].lower); } else { segments_[k].shift = exec(k-1, segments_[k].lower) - exec(k, segments_[k].lower) + segments_[k-1].shift; } } } result_type operator()(argument_type t) const { // find the segment unsigned int k = 0; for(; k < segments_.size(); ++k) if(t < segments_[k].lower) break; if(k > 0) --k; return detail::RequiresExplicitCast::cast(exec(k, t) + segments_[k].shift); } }; template class QuadraticNoiseNormalizationFunctor { double a, b, c, d, f, o; void init(double ia, double ib, double ic, double xmin) { a = ia; b = ib; c = ic; d = VIGRA_CSTD::sqrt(VIGRA_CSTD::fabs(c)); if(c > 0.0) { o = VIGRA_CSTD::log(VIGRA_CSTD::fabs((2.0*c*xmin + b)/d + 2*VIGRA_CSTD::sqrt(c*sq(xmin) +b*xmin + a)))/d; f = 0.0; } else { f = VIGRA_CSTD::sqrt(b*b - 4.0*a*c); o = -VIGRA_CSTD::asin((2.0*c*xmin+b)/f)/d; } } public: typedef ArgumentType argument_type; typedef ResultType result_type; template QuadraticNoiseNormalizationFunctor(Vector const & clusters) { double xmin = NumericTraits::max(); Matrix m(3,3), r(3, 1), l(3, 1); for(unsigned int k = 0; k 0.0) r = VIGRA_CSTD::log(VIGRA_CSTD::fabs((2.0*c*t + b)/d + 2.0*VIGRA_CSTD::sqrt(c*t*t +b*t + a)))/d-o; else r = -VIGRA_CSTD::asin((2.0*c*t+b)/f)/d-o; return detail::RequiresExplicitCast::cast(r); } }; template class LinearNoiseNormalizationFunctor { double a, b, o; void init(double ia, double ib, double xmin) { a = ia; b = ib; if(b != 0.0) { o = xmin - 2.0 / b * VIGRA_CSTD::sqrt(a + b * xmin); } else { o = xmin - xmin / VIGRA_CSTD::sqrt(a); } } public: typedef ArgumentType argument_type; typedef ResultType result_type; template LinearNoiseNormalizationFunctor(Vector const & clusters) { double xmin = NumericTraits::max(); Matrix m(2,2), r(2, 1), l(2, 1); for(unsigned int k = 0; k::cast(r); } }; #define VIGRA_NoiseNormalizationFunctor(name, type, size) \ template \ class name \ { \ ResultType lut_[size]; \ \ public: \ typedef type argument_type; \ typedef ResultType result_type; \ \ template \ name(Vector const & clusters) \ { \ name f(clusters); \ \ for(unsigned int k = 0; k < size; ++k) \ { \ lut_[k] = f(k); \ } \ } \ \ result_type operator()(argument_type t) const \ { \ return lut_[t]; \ } \ }; VIGRA_NoiseNormalizationFunctor(NonparametricNoiseNormalizationFunctor, UInt8, 256) VIGRA_NoiseNormalizationFunctor(NonparametricNoiseNormalizationFunctor, UInt16, 65536) VIGRA_NoiseNormalizationFunctor(QuadraticNoiseNormalizationFunctor, UInt8, 256) VIGRA_NoiseNormalizationFunctor(QuadraticNoiseNormalizationFunctor, UInt16, 65536) VIGRA_NoiseNormalizationFunctor(LinearNoiseNormalizationFunctor, UInt8, 256) VIGRA_NoiseNormalizationFunctor(LinearNoiseNormalizationFunctor, UInt16, 65536) #undef VIGRA_NoiseNormalizationFunctor namespace detail { template bool iterativeNoiseEstimationChi2(SrcIterator s, SrcAcessor src, GradIterator g, double & mean, double & variance, double robustnessThreshold, int windowRadius) { double l2 = sq(robustnessThreshold); double countThreshold = 1.0 - VIGRA_CSTD::exp(-l2); double f = (1.0 - VIGRA_CSTD::exp(-l2)) / (1.0 - (1.0 + l2)*VIGRA_CSTD::exp(-l2)); Diff2D ul(-windowRadius, -windowRadius); int r2 = sq(windowRadius); for(int iter=0; iter<100 ; ++iter) // maximum iteration 100 only for terminating // if something is wrong { double sum=0.0; double gsum=0.0; unsigned int count = 0; unsigned int tcount = 0; SrcIterator siy = s + ul; GradIterator giy = g + ul; for(int y=-windowRadius; y <= windowRadius; y++, ++siy.y, ++giy.y) { typename SrcIterator::row_iterator six = siy.rowIterator(); typename GradIterator::row_iterator gix = giy.rowIterator(); for(int x=-windowRadius; x <= windowRadius; x++, ++six, ++gix) { if (sq(x) + sq(y) > r2) continue; ++tcount; if (*gix < l2*variance) { sum += src(six); gsum += *gix; ++count; } } } if (count==0) // not homogeneous enough return false; double oldvariance = variance; variance= f * gsum / count; mean = sum / count; if ( closeAtTolerance(oldvariance - variance, 0.0, 1e-10)) return (count >= tcount * countThreshold / 2.0); // sufficiently many valid points } return false; // no convergence } template bool iterativeNoiseEstimationGauss(SrcIterator s, SrcAcessor src, GradIterator, double & mean, double & variance, double robustnessThreshold, int windowRadius) { double l2 = sq(robustnessThreshold); double countThreshold = erf(VIGRA_CSTD::sqrt(0.5 * l2)); double f = countThreshold / (countThreshold - VIGRA_CSTD::sqrt(2.0/M_PI*l2)*VIGRA_CSTD::exp(-l2/2.0)); mean = src(s); Diff2D ul(-windowRadius, -windowRadius); int r2 = sq(windowRadius); for(int iter=0; iter<100 ; ++iter) // maximum iteration 100 only for terminating // if something is wrong { double sum = 0.0; double sum2 = 0.0; unsigned int count = 0; unsigned int tcount = 0; SrcIterator siy = s + ul; for(int y=-windowRadius; y <= windowRadius; y++, ++siy.y) { typename SrcIterator::row_iterator six = siy.rowIterator(); for(int x=-windowRadius; x <= windowRadius; x++, ++six) { if (sq(x) + sq(y) > r2) continue; ++tcount; if (sq(src(six) - mean) < l2*variance) { sum += src(six); sum2 += sq(src(six)); ++count; } } } if (count==0) // not homogeneous enough return false; double oldmean = mean; double oldvariance = variance; mean = sum / count; variance= f * (sum2 / count - sq(mean)); if ( closeAtTolerance(oldmean - mean, 0.0, 1e-10) && closeAtTolerance(oldvariance - variance, 0.0, 1e-10)) return (count >= tcount * countThreshold / 2.0); // sufficiently many valid points } return false; // no convergence } template void symmetricDifferenceSquaredMagnitude( SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest) { using namespace functor; int w = slr.x - sul.x; int h = slr.y - sul.y; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; Kernel1D mask; mask.initSymmetricGradient(); mask.setBorderTreatment(BORDER_TREATMENT_REFLECT); TmpImage dx(w, h), dy(w, h); separableConvolveX(srcIterRange(sul, slr, src), destImage(dx), kernel1d(mask)); separableConvolveY(srcIterRange(sul, slr, src), destImage(dy), kernel1d(mask)); combineTwoImages(srcImageRange(dx), srcImage(dy), destIter(dul, dest), Arg1()*Arg1() + Arg2()*Arg2()); } template void findHomogeneousRegionsFoerstner( SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, unsigned int windowRadius = 6, double homogeneityThreshold = 40.0) { using namespace vigra::functor; int w = slr.x - sul.x; int h = slr.y - sul.y; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; BImage btmp(w, h); transformImage(srcIterRange(sul, slr, src), destImage(btmp), ifThenElse(Arg1() <= Param(homogeneityThreshold), Param(1), Param(0))); // Erosion discErosion(srcImageRange(btmp), destIter(dul, dest), windowRadius); } template void findHomogeneousRegions( SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest) { localMinima(sul, slr, src, dul, dest); } template void noiseVarianceListMedianCut(Vector1 const & noise, Vector2 & clusters, unsigned int maxClusterCount) { typedef typename Vector2::value_type Result; clusters.push_back(Result(0, noise.size())); while(clusters.size() <= maxClusterCount) { // find biggest cluster unsigned int kMax; double diffMax = 0.0; for(unsigned int k=0; k < clusters.size(); ++k) { double diff = noise[clusters[k][1]-1][0] - noise[clusters[k][0]][0]; if(diff > diffMax) { diffMax = diff; kMax = k; } } if(diffMax == 0.0) return; // all clusters have only one value unsigned int k1 = clusters[kMax][0], k2 = clusters[kMax][1]; unsigned int kSplit = k1 + (k2 - k1) / 2; clusters[kMax][1] = kSplit; clusters.push_back(Result(kSplit, k2)); } } struct SortNoiseByMean { template bool operator()(T const & l, T const & r) const { return l[0] < r[0]; } }; struct SortNoiseByVariance { template bool operator()(T const & l, T const & r) const { return l[1] < r[1]; } }; template void noiseVarianceClusterAveraging(Vector1 & noise, Vector2 & clusters, Vector3 & result, double quantile) { typedef typename Vector1::iterator Iter; typedef typename Vector3::value_type Result; for(unsigned int k=0; k(VIGRA_CSTD::ceil(quantile*(i2 - i1))); if(static_cast(i2 - i1) < size) size = i2 - i1; if(size < 1) size = 1; i2 = i1 + size; double mean = 0.0, variance = 0.0; for(; i1 < i2; ++i1) { mean += (*i1)[0]; variance += (*i1)[1]; } result.push_back(Result(mean / size, variance / size)); } } template void noiseVarianceEstimationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, BackInsertable & result, NoiseNormalizationOptions const & options) { typedef typename BackInsertable::value_type ResultType; unsigned int w = slr.x - sul.x; unsigned int h = slr.y - sul.y; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; TmpImage gradient(w, h); symmetricDifferenceSquaredMagnitude(sul, slr, src, gradient.upperLeft(), gradient.accessor()); BImage homogeneous(w, h); findHomogeneousRegions(gradient.upperLeft(), gradient.lowerRight(), gradient.accessor(), homogeneous.upperLeft(), homogeneous.accessor()); // Generate noise of each of the remaining pixels == centers of homogenous areas (border is not used) unsigned int windowRadius = options.window_radius; for(unsigned int y=windowRadius; y void noiseVarianceClusteringImpl(Vector & noise, BackInsertable & result, unsigned int clusterCount, double quantile) { std::sort(noise.begin(), noise.end(), detail::SortNoiseByMean()); ArrayVector > clusters; detail::noiseVarianceListMedianCut(noise, clusters, clusterCount); std::sort(clusters.begin(), clusters.end(), detail::SortNoiseByMean()); detail::noiseVarianceClusterAveraging(noise, clusters, result, quantile); } template bool noiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options) { ArrayVector > noiseData; noiseVarianceEstimationImpl(sul, slr, src, noiseData, options); if(noiseData.size() < 10) return false; std::sort(noiseData.begin(), noiseData.end(), SortNoiseByMean()); ArrayVector > noiseClusters; noiseVarianceClusteringImpl(noiseData, noiseClusters, options.cluster_count, options.averaging_quantile); transformImage(sul, slr, src, dul, dest, Functor(noiseClusters)); return true; } template bool nonparametricNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options, VigraTrueType /* isScalar */) { typedef typename SrcAccessor::value_type SrcType; typedef typename DestAccessor::value_type DestType; return noiseNormalizationImpl > (sul, slr, src, dul, dest, options); } template bool nonparametricNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options, VigraFalseType /* isScalar */) { int bands = src.size(sul); for(int b=0; b sband(b, src); VectorElementAccessor dband(b, dest); typedef typename VectorElementAccessor::value_type SrcType; typedef typename VectorElementAccessor::value_type DestType; if(!noiseNormalizationImpl > (sul, slr, sband, dul, dband, options)) return false; } return true; } template bool quadraticNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options, VigraTrueType /* isScalar */) { typedef typename SrcAccessor::value_type SrcType; typedef typename DestAccessor::value_type DestType; return noiseNormalizationImpl > (sul, slr, src, dul, dest, options); } template bool quadraticNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options, VigraFalseType /* isScalar */) { int bands = src.size(sul); for(int b=0; b sband(b, src); VectorElementAccessor dband(b, dest); typedef typename VectorElementAccessor::value_type SrcType; typedef typename VectorElementAccessor::value_type DestType; if(!noiseNormalizationImpl > (sul, slr, sband, dul, dband, options)) return false; } return true; } template void quadraticNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double a0, double a1, double a2, VigraTrueType /* isScalar */) { ArrayVector > noiseClusters; noiseClusters.push_back(TinyVector(0.0, a0)); noiseClusters.push_back(TinyVector(1.0, a0 + a1 + a2)); noiseClusters.push_back(TinyVector(2.0, a0 + 2.0*a1 + 4.0*a2)); transformImage(sul, slr, src, dul, dest, QuadraticNoiseNormalizationFunctor(noiseClusters)); } template void quadraticNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double a0, double a1, double a2, VigraFalseType /* isScalar */) { int bands = src.size(sul); for(int b=0; b sband(b, src); VectorElementAccessor dband(b, dest); quadraticNoiseNormalizationImpl(sul, slr, sband, dul, dband, a0, a1, a2, VigraTrueType()); } } template bool linearNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options, VigraTrueType /* isScalar */) { typedef typename SrcAccessor::value_type SrcType; typedef typename DestAccessor::value_type DestType; return noiseNormalizationImpl > (sul, slr, src, dul, dest, options); } template bool linearNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options, VigraFalseType /* isScalar */) { int bands = src.size(sul); for(int b=0; b sband(b, src); VectorElementAccessor dband(b, dest); typedef typename VectorElementAccessor::value_type SrcType; typedef typename VectorElementAccessor::value_type DestType; if(!noiseNormalizationImpl > (sul, slr, sband, dul, dband, options)) return false; } return true; } template void linearNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double a0, double a1, VigraTrueType /* isScalar */) { ArrayVector > noiseClusters; noiseClusters.push_back(TinyVector(0.0, a0)); noiseClusters.push_back(TinyVector(1.0, a0 + a1)); transformImage(sul, slr, src, dul, dest, LinearNoiseNormalizationFunctor(noiseClusters)); } template void linearNoiseNormalizationImpl(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double a0, double a1, VigraFalseType /* isScalar */) { int bands = src.size(sul); for(int b=0; b sband(b, src); VectorElementAccessor dband(b, dest); linearNoiseNormalizationImpl(sul, slr, sband, dul, dband, a0, a1, VigraTrueType()); } } } // namespace detail template struct noiseVarianceEstimation_can_only_work_on_scalar_images : vigra::staticAssert::AssertBool

{}; /** \addtogroup NoiseNormalization Noise Normalization Estimate noise with intensity-dependent variance and transform it into additive Gaussian noise. */ //@{ /********************************************************/ /* */ /* noiseVarianceEstimation */ /* */ /********************************************************/ /** \brief Determine the noise variance as a function of the image intensity. This operator applies an algorithm described in W. Förstner: "Image Preprocessing for Feature Extraction in Digital Intensity, Color and Range Images", Proc. Summer School on Data Analysis and the Statistical Foundations of Geomatics, Lecture Notes in Earth Science, Berlin: Springer, 1999 in order to estimate the noise variance as a function of the image intensity in a robust way, i.e. so that intensity changes due to edges do not bias the estimate. The source value type (SrcAccessor::value_type) must be a scalar type which is convertible to double. The result is written into the \a result sequence, whose value_type must be constructible from two double values. The following options can be set via the \a options object (see \ref vigra::NoiseNormalizationOptions for details):

useGradient, windowRadius, noiseEstimationQuantile, noiseVarianceInitialGuess Declarations: pass arguments explicitly: \code namespace vigra { template void noiseVarianceEstimation(SrcIterator sul, SrcIterator slr, SrcAccessor src, BackInsertable & result, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void noiseVarianceEstimation(triple src, BackInsertable & result, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode Usage: \#include \<vigra/noise_normalization.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); std::vector > result; ... vigra::noiseVarianceEstimation(srcImageRange(src), result, vigra::NoiseNormalizationOptions().windowRadius(9).noiseVarianceInitialGuess(25.0)); // print the intensity / variance pairs found for(int k=0; k Required Interface: \code SrcIterator upperleft, lowerright; SrcAccessor src; typedef SrcAccessor::value_type SrcType; typedef NumericTraits::isScalar isScalar; assert(isScalar::asBool == true); double value = src(uperleft); BackInsertable result; typedef BackInsertable::value_type ResultType; double intensity, variance; result.push_back(ResultType(intensity, variance)); \endcode */ doxygen_overloaded_function(template <...> void noiseVarianceEstimation) template inline void noiseVarianceEstimation(SrcIterator sul, SrcIterator slr, SrcAccessor src, BackInsertable & result, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { typedef typename BackInsertable::value_type ResultType; typedef typename SrcAccessor::value_type SrcType; typedef typename NumericTraits::isScalar isScalar; VIGRA_STATIC_ASSERT(( noiseVarianceEstimation_can_only_work_on_scalar_images<(isScalar::asBool)>)); detail::noiseVarianceEstimationImpl(sul, slr, src, result, options); } template inline void noiseVarianceEstimation(triple src, BackInsertable & result, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { noiseVarianceEstimation(src.first, src.second, src.third, result, options); } /********************************************************/ /* */ /* noiseVarianceClustering */ /* */ /********************************************************/ /** \brief Determine the noise variance as a function of the image intensity and cluster the results. This operator first calls \ref noiseVarianceEstimation() to obtain a sequence of intensity/variance pairs, which are then clustered using the median cut algorithm. Then the cluster centers (i.e. average variance vs. average intensity) are determined and returned in the \a result sequence. In addition to the options valid for \ref noiseVarianceEstimation(), the following options can be set via the \a options object (see \ref vigra::NoiseNormalizationOptions for details):

clusterCount, averagingQuantile Declarations: pass arguments explicitly: \code namespace vigra { template void noiseVarianceClustering(SrcIterator sul, SrcIterator slr, SrcAccessor src, BackInsertable & result, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void noiseVarianceClustering(triple src, BackInsertable & result, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode Usage: \#include \<vigra/noise_normalization.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); std::vector > result; ... vigra::noiseVarianceClustering(srcImageRange(src), result, vigra::NoiseNormalizationOptions().windowRadius(9).noiseVarianceInitialGuess(25.0). clusterCount(15)); // print the intensity / variance pairs representing the cluster centers for(int k=0; k Required Interface: same as \ref noiseVarianceEstimation() */ doxygen_overloaded_function(template <...> void noiseVarianceClustering) template inline void noiseVarianceClustering(SrcIterator sul, SrcIterator slr, SrcAccessor src, BackInsertable & result, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { ArrayVector > variance; noiseVarianceEstimation(sul, slr, src, variance, options); detail::noiseVarianceClusteringImpl(variance, result, options.cluster_count, options.averaging_quantile); } template inline void noiseVarianceClustering(triple src, BackInsertable & result, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { noiseVarianceClustering(src.first, src.second, src.third, result, options); } /********************************************************/ /* */ /* nonparametricNoiseNormalization */ /* */ /********************************************************/ /** \brief Noise normalization by means of an estimated non-parametric noise model. The original image is assumed to be corrupted by noise whose variance depends on the intensity in an unknown way. The present functions first calls \ref noiseVarianceClustering() to obtain a sequence of intensity/variance pairs (cluster centers) which estimate this dependency. The cluster centers are connected into a piecewise linear function which is the inverted according to the formula derived in W. Förstner: "Image Preprocessing for Feature Extraction in Digital Intensity, Color and Range Images", Proc. Summer School on Data Analysis and the Statistical Foundations of Geomatics, Lecture Notes in Earth Science, Berlin: Springer, 1999 The inverted formula defines a pixel-wise intensity transformation whose application turns the original image into one that is corrupted by additive Gaussian noise with unit variance. Most subsequent algorithms will be able to handle this type of noise much better than the original noise. RGB and other multiband images will be processed one band at a time. The function returns true on success. Noise normalization will fail if the original image does not contain sufficiently homogeneous regions that allow robust estimation of the noise variance. The \a options object may use all options described in \ref vigra::NoiseNormalizationOptions. Declarations: pass arguments explicitly: \code namespace vigra { template bool nonparametricNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template bool nonparametricNoiseNormalization(triple src, pair dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode Usage: \#include \<vigra/noise_normalization.hxx\>
Namespace: vigra \code vigra::BRGBImage src(w,h), dest(w, h); ... vigra::nonparametricNoiseNormalization(srcImageRange(src), destImage(dest), vigra::NoiseNormalizationOptions().windowRadius(9).noiseVarianceInitialGuess(25.0). clusterCount(15)); \endcode Required Interface: same as \ref noiseVarianceEstimation() */ doxygen_overloaded_function(template <...> bool nonparametricNoiseNormalization) template inline bool nonparametricNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { typedef typename SrcAccessor::value_type SrcType; return detail::nonparametricNoiseNormalizationImpl(sul, slr, src, dul, dest, options, typename NumericTraits::isScalar()); } template inline bool nonparametricNoiseNormalization(triple src, pair dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { return nonparametricNoiseNormalization(src.first, src.second, src.third, dest.first, dest.second, options); } /********************************************************/ /* */ /* quadraticNoiseNormalization */ /* */ /********************************************************/ /** \brief Noise normalization by means of an estimated quadratic noise model. This function works in the same way as \ref nonparametricNoiseNormalization() with the exception of the model for the dependency between intensity and noise variance: it assumes that this dependency is a quadratic function rather than a piecewise linear function. If the quadratic model is applicable, it leads to a somewhat smoother transformation. Declarations: pass arguments explicitly: \code namespace vigra { template bool quadraticNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template bool quadraticNoiseNormalization(triple src, pair dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode Usage: \#include \<vigra/noise_normalization.hxx\>
Namespace: vigra \code vigra::BRGBImage src(w,h), dest(w, h); ... vigra::quadraticNoiseNormalization(srcImageRange(src), destImage(dest), vigra::NoiseNormalizationOptions().windowRadius(9).noiseVarianceInitialGuess(25.0). clusterCount(15)); \endcode Required Interface: same as \ref noiseVarianceEstimation() */ doxygen_overloaded_function(template <...> bool quadraticNoiseNormalization) template inline bool quadraticNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { typedef typename SrcAccessor::value_type SrcType; return detail::quadraticNoiseNormalizationImpl(sul, slr, src, dul, dest, options, typename NumericTraits::isScalar()); } template inline bool quadraticNoiseNormalization(triple src, pair dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { return quadraticNoiseNormalization(src.first, src.second, src.third, dest.first, dest.second, options); } /********************************************************/ /* */ /* quadraticNoiseNormalization */ /* */ /********************************************************/ /** \brief Noise normalization by means of a given quadratic noise model. This function works similar to \ref nonparametricNoiseNormalization() with the exception that the functional dependency of the noise variance from the intensity is given (by a quadratic function) rather than estimated: \code variance = a0 + a1 * intensity + a2 * sq(intensity) \endcode Declarations: pass arguments explicitly: \code namespace vigra { template void quadraticNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double a0, double a1, double a2); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void quadraticNoiseNormalization(triple src, pair dest, double a0, double a1, double a2); } \endcode Usage: \#include \<vigra/noise_normalization.hxx\>
Namespace: vigra \code vigra::BRGBImage src(w,h), dest(w, h); ... vigra::quadraticNoiseNormalization(srcImageRange(src), destImage(dest), 100, 0.02, 1e-6); \endcode Required Interface: The source value type must be convertible to double or must be a vector whose elements are convertible to double. Likewise, the destination type must be assignable from double or a vector whose elements are assignable from double. */ doxygen_overloaded_function(template <...> void quadraticNoiseNormalization) template inline void quadraticNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double a0, double a1, double a2) { typedef typename SrcAccessor::value_type SrcType; detail::quadraticNoiseNormalizationImpl(sul, slr, src, dul, dest, a0, a1, a2, typename NumericTraits::isScalar()); } template inline void quadraticNoiseNormalization(triple src, pair dest, double a0, double a1, double a2) { quadraticNoiseNormalization(src.first, src.second, src.third, dest.first, dest.second, a0, a1, a2); } /********************************************************/ /* */ /* linearNoiseNormalization */ /* */ /********************************************************/ /** \brief Noise normalization by means of an estimated linear noise model. This function works in the same way as \ref nonparametricNoiseNormalization() with the exception of the model for the dependency between intensity and noise variance: it assumes that this dependency is a linear function rather than a piecewise linear function. If the linear model is applicable, it leads to a very simple transformation which is similar to the familiar gamma correction. Declarations: pass arguments explicitly: \code namespace vigra { template bool linearNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template bool linearNoiseNormalization(triple src, pair dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()); } \endcode Usage: \#include \<vigra/noise_normalization.hxx\>
Namespace: vigra \code vigra::BRGBImage src(w,h), dest(w, h); ... vigra::linearNoiseNormalization(srcImageRange(src), destImage(dest), vigra::NoiseNormalizationOptions().windowRadius(9).noiseVarianceInitialGuess(25.0). clusterCount(15)); \endcode Required Interface: same as \ref noiseVarianceEstimation() */ doxygen_overloaded_function(template <...> bool linearNoiseNormalization) template inline bool linearNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { typedef typename SrcAccessor::value_type SrcType; return detail::linearNoiseNormalizationImpl(sul, slr, src, dul, dest, options, typename NumericTraits::isScalar()); } template inline bool linearNoiseNormalization(triple src, pair dest, NoiseNormalizationOptions const & options = NoiseNormalizationOptions()) { return linearNoiseNormalization(src.first, src.second, src.third, dest.first, dest.second, options); } /********************************************************/ /* */ /* linearNoiseNormalization */ /* */ /********************************************************/ /** \brief Noise normalization by means of a given linear noise model. This function works similar to \ref nonparametricNoiseNormalization() with the exception that the functional dependency of the noise variance from the intensity is given (as a linear function) rather than estimated: \code variance = a0 + a1 * intensity \endcode Declarations: pass arguments explicitly: \code namespace vigra { template void linearNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double a0, double a1); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void linearNoiseNormalization(triple src, pair dest, double a0, double a1); } \endcode Usage: \#include \<vigra/noise_normalization.hxx\>
Namespace: vigra \code vigra::BRGBImage src(w,h), dest(w, h); ... vigra::linearNoiseNormalization(srcImageRange(src), destImage(dest), 100, 0.02); \endcode Required Interface: The source value type must be convertible to double or must be a vector whose elements are convertible to double. Likewise, the destination type must be assignable from double or a vector whose elements are assignable from double. */ doxygen_overloaded_function(template <...> void linearNoiseNormalization) template inline void linearNoiseNormalization(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double a0, double a1) { typedef typename SrcAccessor::value_type SrcType; detail::linearNoiseNormalizationImpl(sul, slr, src, dul, dest, a0, a1, typename NumericTraits::isScalar()); } template inline void linearNoiseNormalization(triple src, pair dest, double a0, double a1) { linearNoiseNormalization(src.first, src.second, src.third, dest.first, dest.second, a0, a1); } //@} } // namespace vigra #endif // VIGRA_NOISE_NORMALIZATION_HXX gamera-3.3.3/include/vigra/nonlineardiffusion.hxx0000644000076500000000000006067711261456425021150 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_NONLINEARDIFFUSION_HXX #define VIGRA_NONLINEARDIFFUSION_HXX #include #include "stdimage.hxx" #include "stdimagefunctions.hxx" #include "imageiteratoradapter.hxx" #include "functortraits.hxx" namespace vigra { template void internalNonlinearDiffusionDiagonalSolver( SrcIterator sbegin, SrcIterator send, SrcAccessor sa, CoeffIterator diag, CoeffIterator upper, CoeffIterator lower, DestIterator dbegin) { int w = send - sbegin - 1; int i; for(i=0; i=0; --i) { dbegin[i] = (dbegin[i] - upper[i] * dbegin[i+1]) / diag[i]; } } template void internalNonlinearDiffusionAOSStep( SrcIterator sul, SrcIterator slr, SrcAccessor as, WeightIterator wul, WeightAccessor aw, DestIterator dul, DestAccessor ad, double timestep) { // use traits to determine SumType as to prevent possible overflow typedef typename NumericTraits::RealPromote DestType; typedef typename NumericTraits::RealPromote WeightType; // calculate width and height of the image int w = slr.x - sul.x; int h = slr.y - sul.y; int d = (w < h) ? h : w; std::vector lower(d), diag(d), upper(d); std::vector res(d); int x,y; WeightType one = NumericTraits::one(); // create y iterators SrcIterator ys = sul; WeightIterator yw = wul; DestIterator yd = dul; // x-direction for(y=0; y t is the time, x is the location vector, u( x , t) is the smoothed image at time t, and g(.) is the location dependent diffusivity. At time zero, the image u( x , 0) is simply the original image. The time is propotional to the square of the scale parameter: \f$t = s^2\f$. The diffusion equation is solved iteratively according to the Additive Operator Splitting Scheme (AOS) from J. Weickert: "Recursive Separable Schemes for Nonlinear Diffusion Filters", in: B. ter Haar Romeny, L. Florack, J. Koenderingk, M. Viergever (eds.): 1st Intl. Conf. on Scale-Space Theory in Computer Vision 1997, Springer LNCS 1252 DiffusivityFunctor implements the gradient dependent local diffusivity. It is passed as an argument to \ref gradientBasedTransform(). The return value must be between 0 and 1 and determines the weight a pixel gets when its neighbors are smoothed. Weickert recommends the use of the diffusivity implemented by class \ref DiffusivityFunctor. It's also possible to use other functors, for example one that always returns 1, in which case we obtain the solution to the linear diffusion equation, i.e. Gaussian convolution. The source value type must be a linear space with internal addition, scalar multiplication, and NumericTraits defined. The value_type of the DiffusivityFunctor must be the scalar field over wich the source value type's linear space is defined. In addition to nonlinearDiffusion(), there is an algorithm nonlinearDiffusionExplicit() which implements the Explicit Scheme described in the above article. Both algorithms have the same interface, but the explicit scheme gives slightly more accurate approximations of the diffusion process at the cost of much slower processing. Declarations: pass arguments explicitly: \code namespace vigra { template void nonlinearDiffusion(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, DiffusivityFunctor const & weight, double scale); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void nonlinearDiffusion( triple src, pair dest, DiffusivityFunctor const & weight, double scale); } \endcode Usage: \#include \<vigra/nonlineardiffusion.hxx\> \code FImage src(w,h), dest(w,h); float edge_threshold, scale; ... nonlinearDiffusion(srcImageRange(src), destImage(dest), DiffusivityFunctor(edge_threshold), scale); \endcode Required Interface:

  • SrcIterator and DestIterator are models of ImageIterator
  • SrcAccessor and DestAccessor are models of StandardAccessor
  • SrcAccessor::value_type is a linear space
  • DiffusivityFunctor conforms to the requirements of \ref gradientBasedTransform(). Its range is between 0 and 1.
  • DiffusivityFunctor::value_type is an algebraic field
Precondition: scale > 0 */ doxygen_overloaded_function(template <...> void nonlinearDiffusion) template void nonlinearDiffusion(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, DiffusivityFunc const & weight, double scale) { vigra_precondition(scale > 0.0, "nonlinearDiffusion(): scale must be > 0"); double total_time = scale*scale/2.0; static const double time_step = 5.0; int number_of_steps = (int)(total_time / time_step); double rest_time = total_time - time_step * number_of_steps; Size2D size(slr.x - sul.x, slr.y - sul.y); typedef typename NumericTraits::RealPromote TmpType; typedef typename DiffusivityFunc::value_type WeightType; BasicImage smooth1(size); BasicImage smooth2(size); BasicImage weights(size); typename BasicImage::Iterator s1 = smooth1.upperLeft(), s2 = smooth2.upperLeft(); typename BasicImage::Accessor a = smooth1.accessor(); typename BasicImage::Iterator wi = weights.upperLeft(); typename BasicImage::Accessor wa = weights.accessor(); gradientBasedTransform(sul, slr, as, wi, wa, weight); internalNonlinearDiffusionAOSStep(sul, slr, as, wi, wa, s1, a, rest_time); for(int i = 0; i < number_of_steps; ++i) { gradientBasedTransform(s1, s1+size, a, wi, wa, weight); internalNonlinearDiffusionAOSStep(s1, s1+size, a, wi, wa, s2, a, time_step); std::swap(s1, s2); } copyImage(s1, s1+size, a, dul, ad); } template inline void nonlinearDiffusion( triple src, pair dest, DiffusivityFunc const & weight, double scale) { nonlinearDiffusion(src.first, src.second, src.third, dest.first, dest.second, weight, scale); } template void internalNonlinearDiffusionExplicitStep( SrcIterator sul, SrcIterator slr, SrcAccessor as, WeightIterator wul, WeightAccessor aw, DestIterator dul, DestAccessor ad, double time_step) { // use traits to determine SumType as to prevent possible overflow typedef typename NumericTraits::RealPromote SumType; typedef typename NumericTraits::RealPromote WeightType; // calculate width and height of the image int w = slr.x - sul.x; int h = slr.y - sul.y; int x,y; static const Diff2D left(-1, 0); static const Diff2D right(1, 0); static const Diff2D top(0, -1); static const Diff2D bottom(0, 1); WeightType gt, gb, gl, gr, g0; WeightType one = NumericTraits::one(); SumType sum; time_step /= 2.0; // create y iterators SrcIterator ys = sul; WeightIterator yw = wul; DestIterator yd = dul; SrcIterator xs = ys; WeightIterator xw = yw; DestIterator xd = yd; gt = (aw(xw) + aw(xw, bottom)) * time_step; gb = (aw(xw) + aw(xw, bottom)) * time_step; gl = (aw(xw) + aw(xw, right)) * time_step; gr = (aw(xw) + aw(xw, right)) * time_step; g0 = one - gt - gb - gr - gl; sum = g0 * as(xs); sum += gt * as(xs, bottom); sum += gb * as(xs, bottom); sum += gl * as(xs, right); sum += gr * as(xs, right); ad.set(sum, xd); for(x=2, ++xs.x, ++xd.x, ++xw.x; x void nonlinearDiffusionExplicit(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, DiffusivityFunc const & weight, double scale) { vigra_precondition(scale > 0.0, "nonlinearDiffusionExplicit(): scale must be > 0"); double total_time = scale*scale/2.0; static const double time_step = 0.25; int number_of_steps = total_time / time_step; double rest_time = total_time - time_step * number_of_steps; Size2D size(slr.x - sul.x, slr.y - sul.y); typedef typename NumericTraits::RealPromote TmpType; typedef typename DiffusivityFunc::value_type WeightType; BasicImage smooth1(size); BasicImage smooth2(size); BasicImage weights(size); typename BasicImage::Iterator s1 = smooth1.upperLeft(), s2 = smooth2.upperLeft(); typename BasicImage::Accessor a = smooth1.accessor(); typename BasicImage::Iterator wi = weights.upperLeft(); typename BasicImage::Accessor wa = weights.accessor(); gradientBasedTransform(sul, slr, as, wi, wa, weight); internalNonlinearDiffusionExplicitStep(sul, slr, as, wi, wa, s1, a, rest_time); for(int i = 0; i < number_of_steps; ++i) { gradientBasedTransform(s1, s1+size, a, wi, wa, weight); internalNonlinearDiffusionExplicitStep(s1, s1+size, a, wi, wa, s2, a, time_step); swap(s1, s2); } copyImage(s1, s1+size, a, dul, ad); } template inline void nonlinearDiffusionExplicit( triple src, pair dest, DiffusivityFunc const & weight, double scale) { nonlinearDiffusionExplicit(src.first, src.second, src.third, dest.first, dest.second, weight, scale); } /********************************************************/ /* */ /* DiffusivityFunctor */ /* */ /********************************************************/ /** \brief Diffusivity functor for non-linear diffusion. This functor implements the diffusivity recommended by Weickert: \f[ g(|\nabla u|) = 1 - \exp{\left(\frac{-3.315}{(|\nabla u| / thresh)^4}\right)} \f] where thresh is a threshold that determines whether a specific gradient magnitude is interpreted as a significant edge (above the threshold) or as noise. It is meant to be used with \ref nonlinearDiffusion(). */ template class DiffusivityFunctor { public: /** the functors first argument type (must be an algebraic field with exp() defined). However, the functor also works with RGBValue (this hack is necessary since Microsoft C++ doesn't support partial specialization). */ typedef Value first_argument_type; /** the functors second argument type (same as first). However, the functor also works with RGBValue (this hack is necessary since Microsoft C++ doesn't support partial specialization). */ typedef Value second_argument_type; /** the functors result type */ typedef typename NumericTraits::RealPromote result_type; /** \deprecated use first_argument_type, second_argument_type, result_type */ typedef Value value_type; /** init functor with given edge threshold */ DiffusivityFunctor(Value const & thresh) : weight_(thresh*thresh), one_(NumericTraits::one()), zero_(NumericTraits::zero()) {} /** calculate diffusivity from scalar arguments */ result_type operator()(first_argument_type const & gx, second_argument_type const & gy) const { Value mag = (gx*gx + gy*gy) / weight_; return (mag == zero_) ? one_ : one_ - VIGRA_CSTD::exp(-3.315 / mag / mag); } /** calculate diffusivity from RGB arguments */ result_type operator()(RGBValue const & gx, RGBValue const & gy) const { result_type mag = (gx.red()*gx.red() + gx.green()*gx.green() + gx.blue()*gx.blue() + gy.red()*gy.red() + gy.green()*gy.green() + gy.blue()*gy.blue()) / weight_; return (mag == zero_) ? one_ : one_ - VIGRA_CSTD::exp(-3.315 / mag / mag); } result_type weight_; result_type one_; result_type zero_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isBinaryFunctor; }; //@} } // namespace vigra #endif /* VIGRA_NONLINEARDIFFUSION_HXX */ gamera-3.3.3/include/vigra/numerictraits.hxx0000644000076500000000000013300411261456425020126 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_NUMERICTRAITS_HXX #define VIGRA_NUMERICTRAITS_HXX #include #include #include #include "metaprogramming.hxx" #include "sized_int.hxx" /********************************************************/ /* */ /* NumericTraits */ /* */ /********************************************************/ /** \page NumericPromotionTraits Numeric and Promotion Traits Meta-information about arithmetic types.
  • \ref NumericTraits
       Unary traits for promotion, conversion, creation of arithmetic objects
  • \ref PromoteTraits
       Binary traits for promotion of arithmetic objects
  • \ref SquareRootTraits
       Unary traits for the calculation of the square root of arithmetic objects
  • \ref NormTraits
       Unary traits for the calculation of the norm and squared norm of arithmetic objects
These traits classes contain information that is used by generic algorithms and data structures to determine intermediate and result types of numerical calculations, to convert between different representations of arithmetic types, and to create certain important constants of each type. Thus, algorithms and data structures operating that need arithmetic operations can be made more independent from the actual data representation. NumericTraits are implemented as template specializations of one arithmetic type, while PromoteTraits are specialized for a pair of arithmetic types that shall be combined in one operation. */ /** \page NumericTraits template<> struct NumericTraits Unary traits for promotion, conversion, creation of arithmetic objects. \#include \<vigra/numerictraits.hxx\> This traits class is used derive important properties of an arithmetic type. Consider the following algorithm: \code // calculate the sum of a sequence of bytes int sumBytes(unsigned char * begin, unsigned char * end) { int result = 0; for(; begin != end; ++begin) result += *begin; return result; } \endcode The return type of this function can not be 'unsigned char' because the summation would very likely overflow. Since we know the source type, we can easily choose 'int' as an appropriate return type. Likewise, we would have choosen 'float' if we had to sum a sequence of floats. If we want to make this algorithm generic, we would like to derive the appropriate return type automatically. This can be done with NumericTraits. The code would look like this (we use \ref DataAccessors to read the data from the sequence): \code // calculate the sum of any sequence template typename vigra::NumericTraits::Promote sumSequence(Iterator begin, Iterator end, Accessor a) { // an abbreviation typedef vigra::NumericTraits SrcTraits; // find out result type typedef typename SrcTraits::Promote ResultType; // init result to zero ResultType result = vigra::NumericTraits::zero(); for(; begin != end; ++begin) { // cast current item to ResultType and add result += SrcTraits::toPromote(a(begin)); } return result; } \endcode In this example NumericTraits is not only used to deduce the ReturnType of the operation, but also to initialize it with the constant 'zero'. This is necessary since we do not know in general, which expression must be used to obtain a zero of some arbitrary type - 'ResultType result = 0;' would only work if the ResultType had an constructor taking an 'int' argument, and we would not even have any guarantee as to what the semantics of this constructor are. In addition, the traits are used to cast the source type into the promote type. Similarly, an algorithm that needs multiplication would use the return type RealPromote and the functions one() and toRealPromote(). The following members are defined in NumericTraits:
typedef ... Type; the type itself
typedef ... Promote; promote type for addition and subtraction
typedef ... RealPromote; promote type for multiplication and division with a real number (only defined if ArithmeticType supports these operations)
typedef ... ComplexPromote; promote type for complex arithmetic
typedef ... ValueType; for scalar types: the type itself
otherwise: typename Type::value_type (if defined)
static Promote toPromote(ArithmeticType v); convert to Promote type
static RealPromote toRealPromote(ArithmeticType v); convert to RealPromote type (only defined if ArithmeticType supports multiplication)
static ArithmeticType fromPromote(Promote v); convert from Promote type if v is outside the range of ArithmeticType it is clipped;
static ArithmeticType fromRealPromote(RealPromote v); convert from RealPromote type (only defined if ArithmeticType supports multiplication) if ArithmeticType is an integral type, the result is rounded if v is outside the range of ArithmeticType it is clipped
static ArithmeticType zero(); create neutral element of addition i.e. (ArithmeticType a = ..., a + NumericTraits::zero() == a) must always yield true
static ArithmeticType nonZero(); create a non-zero element (if multiplication is defined, this yields one()) i.e. (ArithmeticType a = ..., a + NumericTraits::nonZero() == a) must always yield false
static ArithmeticType min(); the smallest number representable in this type.
Only available if isOrdered is VigraTrueType. For integral types, this equals INT_MIN etc., for real valued types it is -FLT_MAX etc. (not FLT_MIN -- this is the smallest positive float)
static ArithmeticType max(); the largest number representable in this type.
Only available if isOrdered is VigraTrueType. For integral types, this equals INT_MAX etc., for real valued types it is FLT_MAX etc.
static ArithmeticType one(); create neutral element of multiplication (only defined if ArithmeticType supports multiplication) i.e. (ArithmeticType a = ..., a * NumericTraits::one() == a) must always yield true
typedef ... isIntegral; VigraTrueType if ArithmeticType is an integral type, VigraFalseType otherwise
typedef ... isScalar; VigraTrueType if ArithmeticType is a scalar type, VigraFalseType otherwise
typedef ... isSigned; VigraTrueType if ArithmeticType is a signed type, VigraFalseType otherwise
typedef ... isOrdered; VigraTrueType if ArithmeticType supports operator<(), VigraFalseType otherwise
typedef ... isComplex; VigraTrueType if ArithmeticType is a complex number, VigraFalseType otherwise
NumericTraits for the built-in types are defined in \#include \<vigra/numerictraits.hxx\> Namespace: vigra */ /** \page PromoteTraits template<> struct PromoteTraits Binary traits for promotion of arithmetic objects. \#include \<vigra/numerictraits.hxx\> This traits class is used to determine the appropriate result type of arithmetic expressions which depend of two arguments. Consider the following function: \code template T min(T t1, T t2) { return (t1 < t2) ? t1 : t2; } \endcode This template is only applicable if both arguments have the same type. However, sometimes we may want to use the function in cases where the argument types differ. The we can deduce the approrpiate return type by using PromoteTraits: \code template typename vigra::PromoteTraits::Promote min(T1 t1, T2 t2) { return (t1 < t2) ? vigra::PromoteTraits::toPromote(t1) : vigra::PromoteTraits::toPromote(t2); } \endcode In addition, the traits class provide static functions to cast the arguments to the promote type. For example, if T1 were int and T2 were float, the Promote type would be float. The following members are defined in PromoteTraits:
typedef ... Promote; promote type
static Promote toPromote(ArithmeticType1 v); static Promote toPromote(ArithmeticType2 v); convert to Promote type
PromoteTraits for the built-in types are defined in \#include \<vigra/numerictraits.hxx\> Namespace: vigra */ /** \page SquareRootTraits template<> struct SquareRootTraits Unary traits for the calculation of the square root of arithmetic objects. \#include \<vigra/numerictraits.hxx\> This traits class is used to determine appropriate argument and result types for the function sqrt(). These traits are typically used like this: \code ArithmeticType t = ...; SquareRootTraits::SquareRootResult r = sqrt((SquareRootTraits::SquareRootArgument)t); \endcode This approach avoids 'ambigouos overload errors' when taking the square root of an integer type. It also takes care of determining the proper result of the sqrt() function of \ref vigra::FixedPoint and of the norm() function, when it is implemented via sqrt(squaredNorm(x)). The following members are defined in SquareRootTraits:
typedef ArithmeticType Type; the type itself
typedef ... SquareRootArgument; required argument type for srqt(), i.e. sqrt((SquareRootArgument)x)
typedef ... SquareRootResult; result of sqrt((SquareRootArgument)x)
NormTraits for the built-in types are defined in \#include \<vigra/numerictraits.hxx\> Namespace: vigra */ /** \page NormTraits template<> struct NormTraits Unary traits for the calculation of the norm and squared norm of arithmetic objects. \#include \<vigra/numerictraits.hxx\> This traits class is used to determine appropriate result types for the functions norm() and squaredNorm(). These functions are always declared like this (where ArithmeticType is a type thats supports a norm): \code NormTraits::NormType norm(ArithmeticType const & t); NormTraits::SquaredNormType squaredNorm(ArithmeticType const & t); \endcode The following members are defined in NormTraits:
typedef ArithmeticType Type; the type itself
typedef ... SquaredNormType; result of squaredNorm(ArithmeticType)
typedef ... NormType; result of norm(ArithmeticType)
Usually equal to SquareRootTraits::SquareRootResult
NormTraits for the built-in types are defined in \#include \<vigra/numerictraits.hxx\> Namespace: vigra */ namespace vigra { struct Error_NumericTraits_not_specialized_for_this_case { }; struct Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char { }; template struct NumericTraits { typedef Error_NumericTraits_not_specialized_for_this_case Type; typedef Error_NumericTraits_not_specialized_for_this_case Promote; typedef Error_NumericTraits_not_specialized_for_this_case UnsignedPromote; typedef Error_NumericTraits_not_specialized_for_this_case RealPromote; typedef Error_NumericTraits_not_specialized_for_this_case ComplexPromote; typedef Error_NumericTraits_not_specialized_for_this_case ValueType; typedef Error_NumericTraits_not_specialized_for_this_case isScalar; typedef Error_NumericTraits_not_specialized_for_this_case isIntegral; typedef Error_NumericTraits_not_specialized_for_this_case isSigned; typedef Error_NumericTraits_not_specialized_for_this_case isOrdered; typedef Error_NumericTraits_not_specialized_for_this_case isComplex; }; template<> struct NumericTraits { typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char Type; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char Promote; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char UnsignedPromote; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char RealPromote; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char ComplexPromote; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char ValueType; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char isScalar; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char isIntegral; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char isSigned; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char isOrdered; typedef Error_NumericTraits_char_is_not_a_numeric_type__use_signed_char_or_unsigned_char isComplex; }; #ifndef NO_BOOL template<> struct NumericTraits { typedef bool Type; typedef int Promote; typedef unsigned int UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraFalseType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static bool zero() { return false; } static bool one() { return true; } static bool nonZero() { return true; } static bool min() { return false; } static bool max() { return true; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = false , maxConst = true }; #else static const bool minConst = false; static const bool maxConst = true; #endif static Promote toPromote(bool v) { return v ? 1 : 0; } static RealPromote toRealPromote(bool v) { return v ? 1.0 : 0.0; } static bool fromPromote(Promote v) { return (v == 0) ? false : true; } static bool fromRealPromote(RealPromote v) { return (v == 0.0) ? false : true; } }; #endif template<> struct NumericTraits { typedef signed char Type; typedef int Promote; typedef unsigned int UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static signed char zero() { return 0; } static signed char one() { return 1; } static signed char nonZero() { return 1; } static signed char min() { return SCHAR_MIN; } static signed char max() { return SCHAR_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = SCHAR_MIN, maxConst = SCHAR_MIN }; #else static const signed char minConst = SCHAR_MIN; static const signed char maxConst = SCHAR_MIN; #endif static Promote toPromote(signed char v) { return v; } static RealPromote toRealPromote(signed char v) { return v; } static signed char fromPromote(Promote v) { return ((v < SCHAR_MIN) ? SCHAR_MIN : (v > SCHAR_MAX) ? SCHAR_MAX : v); } static signed char fromRealPromote(RealPromote v) { return ((v < 0.0) ? ((v < (RealPromote)SCHAR_MIN) ? SCHAR_MIN : static_cast(v - 0.5)) : (v > (RealPromote)SCHAR_MAX) ? SCHAR_MAX : static_cast(v + 0.5)); } }; template<> struct NumericTraits { typedef unsigned char Type; typedef int Promote; typedef unsigned int UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraFalseType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static unsigned char zero() { return 0; } static unsigned char one() { return 1; } static unsigned char nonZero() { return 1; } static unsigned char min() { return 0; } static unsigned char max() { return UCHAR_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = 0, maxConst = UCHAR_MAX }; #else static const unsigned char minConst = 0; static const unsigned char maxConst = UCHAR_MAX; #endif static Promote toPromote(unsigned char v) { return v; } static RealPromote toRealPromote(unsigned char v) { return v; } static unsigned char fromPromote(Promote const & v) { return Type((v < 0) ? 0 : (v > (Promote)UCHAR_MAX) ? UCHAR_MAX : v); } static unsigned char fromRealPromote(RealPromote const & v) { return Type((v < 0.0) ? 0 : ((v > (RealPromote)UCHAR_MAX) ? UCHAR_MAX : v + 0.5)); } }; template<> struct NumericTraits { typedef short int Type; typedef int Promote; typedef unsigned int UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static short int zero() { return 0; } static short int one() { return 1; } static short int nonZero() { return 1; } static short int min() { return SHRT_MIN; } static short int max() { return SHRT_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = SHRT_MIN, maxConst = SHRT_MAX }; #else static const short int minConst = SHRT_MIN; static const short int maxConst = SHRT_MAX; #endif static Promote toPromote(short int v) { return v; } static RealPromote toRealPromote(short int v) { return v; } static short int fromPromote(Promote v) { return ((v < SHRT_MIN) ? SHRT_MIN : (v > SHRT_MAX) ? SHRT_MAX : v); } static short int fromRealPromote(RealPromote v) { return ((v < 0.0) ? ((v < (RealPromote)SHRT_MIN) ? SHRT_MIN : static_cast(v - 0.5)) : ((v > (RealPromote)SHRT_MAX) ? SHRT_MAX : static_cast(v + 0.5))); } }; template<> struct NumericTraits { typedef short unsigned int Type; typedef int Promote; typedef unsigned int UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraFalseType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static short unsigned int zero() { return 0; } static short unsigned int one() { return 1; } static short unsigned int nonZero() { return 1; } static short unsigned int min() { return 0; } static short unsigned int max() { return USHRT_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = 0, maxConst = USHRT_MAX }; #else static const short unsigned int minConst = 0; static const short unsigned int maxConst = USHRT_MAX; #endif static Promote toPromote(short unsigned int v) { return v; } static RealPromote toRealPromote(short unsigned int v) { return v; } static short unsigned int fromPromote(Promote v) { return Type((v < 0) ? 0 : (v > USHRT_MAX) ? USHRT_MAX : v); } static short unsigned int fromRealPromote(RealPromote v) { return Type((v < 0.0) ? 0 : ((v > (RealPromote)USHRT_MAX) ? USHRT_MAX : v + 0.5)); } }; template<> struct NumericTraits { typedef int Type; typedef int Promote; typedef unsigned int UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static int zero() { return 0; } static int one() { return 1; } static int nonZero() { return 1; } static int min() { return INT_MIN; } static int max() { return INT_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = INT_MIN, maxConst = INT_MAX }; #else static const int minConst = INT_MIN; static const int maxConst = INT_MAX; #endif static Promote toPromote(int v) { return v; } static RealPromote toRealPromote(int v) { return v; } static int fromPromote(Promote v) { return v; } static int fromRealPromote(RealPromote v) { return ((v < 0.0) ? ((v < (RealPromote)INT_MIN) ? INT_MIN : static_cast(v - 0.5)) : ((v > (RealPromote)INT_MAX) ? INT_MAX : static_cast(v + 0.5))); } }; template<> struct NumericTraits { typedef unsigned int Type; typedef unsigned int Promote; typedef unsigned int UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraFalseType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static unsigned int zero() { return 0; } static unsigned int one() { return 1; } static unsigned int nonZero() { return 1; } static unsigned int min() { return 0; } static unsigned int max() { return UINT_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = 0, maxConst = UINT_MAX }; #else static const unsigned int minConst = 0; static const unsigned int maxConst = UINT_MAX; #endif static Promote toPromote(unsigned int v) { return v; } static RealPromote toRealPromote(unsigned int v) { return v; } static unsigned int fromPromote(Promote v) { return v; } static unsigned int fromRealPromote(RealPromote v) { return ((v < 0.0) ? 0 : ((v > (RealPromote)UINT_MAX) ? UINT_MAX : static_cast(v + 0.5))); } }; template<> struct NumericTraits { typedef long Type; typedef long Promote; typedef unsigned long UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static long zero() { return 0; } static long one() { return 1; } static long nonZero() { return 1; } static long min() { return LONG_MIN; } static long max() { return LONG_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = LONG_MIN, maxConst = LONG_MAX }; #else static const long minConst = LONG_MIN; static const long maxConst = LONG_MAX; #endif static Promote toPromote(long v) { return v; } static RealPromote toRealPromote(long v) { return v; } static long fromPromote(Promote v) { return v; } static long fromRealPromote(RealPromote v) { return ((v < 0.0) ? ((v < (RealPromote)LONG_MIN) ? LONG_MIN : static_cast(v - 0.5)) : ((v > (RealPromote)LONG_MAX) ? LONG_MAX : static_cast(v + 0.5))); } }; template<> struct NumericTraits { typedef unsigned long Type; typedef unsigned long Promote; typedef unsigned long UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraFalseType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static unsigned long zero() { return 0; } static unsigned long one() { return 1; } static unsigned long nonZero() { return 1; } static unsigned long min() { return 0; } static unsigned long max() { return ULONG_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = 0, maxConst = ULONG_MAX }; #else static const unsigned long minConst = 0; static const unsigned long maxConst = ULONG_MAX; #endif static Promote toPromote(unsigned long v) { return v; } static RealPromote toRealPromote(unsigned long v) { return v; } static unsigned long fromPromote(Promote v) { return v; } static unsigned long fromRealPromote(RealPromote v) { return ((v < 0.0) ? 0 : ((v > (RealPromote)ULONG_MAX) ? ULONG_MAX : static_cast(v + 0.5))); } }; #ifdef LLONG_MAX template<> struct NumericTraits { typedef long long Type; typedef long long Promote; typedef unsigned long long UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static long long zero() { return 0; } static long long one() { return 1; } static long long nonZero() { return 1; } static long long min() { return LLONG_MIN; } static long long max() { return LLONG_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = LLONG_MIN, maxConst = LLONG_MAX }; #else static const long long minConst = LLONG_MIN; static const long long maxConst = LLONG_MAX; #endif static Promote toPromote(long long v) { return v; } static RealPromote toRealPromote(long long v) { return v; } static long long fromPromote(Promote v) { return v; } static long long fromRealPromote(RealPromote v) { return ((v < 0.0) ? ((v < (RealPromote)LLONG_MIN) ? LLONG_MIN : static_cast(v - 0.5)) : ((v > (RealPromote)LLONG_MAX) ? LLONG_MAX : static_cast(v + 0.5))); } }; template<> struct NumericTraits { typedef unsigned long long Type; typedef unsigned long long Promote; typedef unsigned long long UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraTrueType isIntegral; typedef VigraTrueType isScalar; typedef VigraFalseType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static unsigned long long zero() { return 0; } static unsigned long long one() { return 1; } static unsigned long long nonZero() { return 1; } static unsigned long long min() { return 0; } static unsigned long long max() { return ULLONG_MAX; } #ifdef NO_INLINE_STATIC_CONST_DEFINITION enum { minConst = 0, maxConst = ULLONG_MAX }; #else static const unsigned long long minConst = 0; static const unsigned long long maxConst = ULLONG_MAX; #endif static Promote toPromote(unsigned long long v) { return v; } static RealPromote toRealPromote(unsigned long long v) { return v; } static unsigned long long fromPromote(Promote v) { return v; } static unsigned long long fromRealPromote(RealPromote v) { return ((v < 0.0) ? 0 : ((v > (RealPromote)ULLONG_MAX) ? ULONG_MAX : static_cast(v + 0.5))); } }; #endif // LLONG_MAX template<> struct NumericTraits { typedef float Type; typedef float Promote; typedef float UnsignedPromote; typedef float RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraFalseType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static float zero() { return 0.0; } static float one() { return 1.0; } static float nonZero() { return 1.0; } static float epsilon() { return FLT_EPSILON; } static float smallestPositive() { return FLT_MIN; } static float min() { return -FLT_MAX; } static float max() { return FLT_MAX; } static Promote toPromote(float v) { return v; } static RealPromote toRealPromote(float v) { return v; } static float fromPromote(Promote v) { return v; } static float fromRealPromote(RealPromote v) { return v; } }; template<> struct NumericTraits { typedef double Type; typedef double Promote; typedef double UnsignedPromote; typedef double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraFalseType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static double zero() { return 0.0; } static double one() { return 1.0; } static double nonZero() { return 1.0; } static double epsilon() { return DBL_EPSILON; } static double smallestPositive() { return DBL_MIN; } static double min() { return -DBL_MAX; } static double max() { return DBL_MAX; } static Promote toPromote(double v) { return v; } static RealPromote toRealPromote(double v) { return v; } static double fromPromote(Promote v) { return v; } static double fromRealPromote(RealPromote v) { return v; } }; template<> struct NumericTraits { typedef long double Type; typedef long double Promote; typedef long double UnsignedPromote; typedef long double RealPromote; typedef std::complex ComplexPromote; typedef Type ValueType; typedef VigraFalseType isIntegral; typedef VigraTrueType isScalar; typedef VigraTrueType isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static long double zero() { return 0.0; } static long double one() { return 1.0; } static long double nonZero() { return 1.0; } static long double epsilon() { return LDBL_EPSILON; } static long double smallestPositive() { return LDBL_MIN; } static long double min() { return -LDBL_MAX; } static long double max() { return LDBL_MAX; } static Promote toPromote(long double v) { return v; } static RealPromote toRealPromote(long double v) { return v; } static long double fromPromote(Promote v) { return v; } static long double fromRealPromote(RealPromote v) { return v; } }; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct NumericTraits > { typedef std::complex Type; typedef std::complex::Promote> Promote; typedef std::complex::UnsignedPromote> UnsignedPromote; typedef std::complex::RealPromote> RealPromote; typedef std::complex ComplexPromote; typedef T ValueType; typedef VigraFalseType isIntegral; typedef VigraFalseType isScalar; typedef typename NumericTraits::isSigned isSigned; typedef VigraFalseType isOrdered; typedef VigraTrueType isComplex; static Type zero() { return Type(0.0); } static Type one() { return Type(1.0); } static Type nonZero() { return one(); } static Type epsilon() { return Type(NumericTraits::epsilon()); } static Type smallestPositive() { return Type(NumericTraits::smallestPositive()); } static Promote toPromote(Type const & v) { return v; } static Type fromPromote(Promote const & v) { return v; } static Type fromRealPromote(RealPromote v) { return Type(v); } }; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION /********************************************************/ /* */ /* SquareRootTraits */ /* */ /********************************************************/ template struct SquareRootTraits { typedef T Type; typedef typename NumericTraits::RealPromote SquareRootResult; typedef typename NumericTraits::RealPromote SquareRootArgument; }; /********************************************************/ /* */ /* NormTraits */ /* */ /********************************************************/ struct Error_NormTraits_not_specialized_for_this_case { }; template struct NormTraits { typedef T Type; typedef Error_NormTraits_not_specialized_for_this_case SquaredNormType; typedef Error_NormTraits_not_specialized_for_this_case NormType; }; #define VIGRA_DEFINE_NORM_TRAITS(T) \ template <> struct NormTraits { \ typedef T Type; \ typedef NumericTraits::Promote SquaredNormType; \ typedef T NormType; \ }; VIGRA_DEFINE_NORM_TRAITS(bool) VIGRA_DEFINE_NORM_TRAITS(signed char) VIGRA_DEFINE_NORM_TRAITS(unsigned char) VIGRA_DEFINE_NORM_TRAITS(short) VIGRA_DEFINE_NORM_TRAITS(unsigned short) VIGRA_DEFINE_NORM_TRAITS(int) VIGRA_DEFINE_NORM_TRAITS(unsigned int) VIGRA_DEFINE_NORM_TRAITS(long) VIGRA_DEFINE_NORM_TRAITS(unsigned long) VIGRA_DEFINE_NORM_TRAITS(float) VIGRA_DEFINE_NORM_TRAITS(double) VIGRA_DEFINE_NORM_TRAITS(long double) #ifdef LLONG_MAX VIGRA_DEFINE_NORM_TRAITS(long long) VIGRA_DEFINE_NORM_TRAITS(unsigned long long) #endif // LLONG_MAX #undef VIGRA_DEFINE_NORM_TRAITS #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct NormTraits > { typedef std::complex Type; typedef typename NormTraits::SquaredNormType SquaredNormType; typedef typename SquareRootTraits::SquareRootResult NormType; }; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION /********************************************************/ /* */ /* PromoteTraits */ /* */ /********************************************************/ namespace detail { template struct PromoteType { static T & t(); static U & u(); // let C++ figure out the promote type by adding a T and an U typedef typename SizeToType::result Promote; static Promote toPromote(T t) { return Promote(t); } static Promote toPromote(U u) { return Promote(u); } }; template struct PromoteType { static T & t(); // let C++ figure out the promote type by adding two Ts typedef typename SizeToType::result Promote; static Promote toPromote(T t) { return Promote(t); } }; } // namespace detail struct Error_PromoteTraits_not_specialized_for_this_case { }; template struct PromoteTraits { typedef Error_PromoteTraits_not_specialized_for_this_case Promote; }; #include "promote_traits.hxx" #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct PromoteTraits, std::complex > { typedef std::complex::Promote> Promote; static Promote toPromote(std::complex const & v) { return v; } }; template struct PromoteTraits, std::complex > { typedef std::complex::Promote> Promote; static Promote toPromote(std::complex const & v) { return v; } static Promote toPromote(std::complex const & v) { return v; } }; template struct PromoteTraits, T2 > { typedef std::complex::Promote> Promote; static Promote toPromote(std::complex const & v) { return v; } static Promote toPromote(T2 const & v) { return Promote(v); } }; template struct PromoteTraits > { typedef std::complex::Promote> Promote; static Promote toPromote(T1 const & v) { return Promote(v); } static Promote toPromote(std::complex const & v) { return v; } }; #endif namespace detail { template struct RequiresExplicitCast { template static U const & cast(U const & v) { return v; } }; #if !defined(_MSC_VER) || _MSC_VER >= 1300 # define VIGRA_SPECIALIZED_CAST(type) \ template <> \ struct RequiresExplicitCast { \ static type cast(float v) \ { return NumericTraits::fromRealPromote(v); } \ static type cast(double v) \ { return NumericTraits::fromRealPromote(v); } \ static type cast(type v) \ { return v; } \ template \ static type cast(U v) \ { return static_cast(v); } \ \ }; #else # define VIGRA_SPECIALIZED_CAST(type) \ template <> \ struct RequiresExplicitCast { \ static type cast(float v) \ { return NumericTraits::fromRealPromote(v); } \ static type cast(double v) \ { return NumericTraits::fromRealPromote(v); } \ static type cast(signed char v) \ { return v; } \ static type cast(unsigned char v) \ { return v; } \ static type cast(short v) \ { return v; } \ static type cast(unsigned short v) \ { return v; } \ static type cast(int v) \ { return v; } \ static type cast(unsigned int v) \ { return v; } \ static type cast(long v) \ { return v; } \ static type cast(unsigned long v) \ { return v; } \ }; #endif VIGRA_SPECIALIZED_CAST(signed char) VIGRA_SPECIALIZED_CAST(unsigned char) VIGRA_SPECIALIZED_CAST(short) VIGRA_SPECIALIZED_CAST(unsigned short) VIGRA_SPECIALIZED_CAST(int) VIGRA_SPECIALIZED_CAST(unsigned int) VIGRA_SPECIALIZED_CAST(long) VIGRA_SPECIALIZED_CAST(unsigned long) template <> struct RequiresExplicitCast { template static U cast(U v) { return v; } }; template <> struct RequiresExplicitCast { template static U cast(U v) { return v; } }; #undef VIGRA_SPECIALIZED_CAST } // namespace detail } // namespace vigra #endif // VIGRA_NUMERICTRAITS_HXX gamera-3.3.3/include/vigra/orientedtensorfilters.hxx0000644000076500000000000005141711261456425021701 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2002-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_ORIENTEDTENSORFILTERS_HXX #define VIGRA_ORIENTEDTENSORFILTERS_HXX #include #include "utilities.hxx" #include "initimage.hxx" #include "stdconvolution.hxx" namespace vigra { /** \addtogroup TensorImaging Tensor Image Processing */ //@{ /********************************************************/ /* */ /* hourGlassFilter */ /* */ /********************************************************/ /** \brief Anisotropic tensor smoothing with the hourglass filter. This function implements anisotropic tensor smoothing by an hourglass-shaped filters as described in U. Köthe: "Edge and Junction Detection with an Improved Structure Tensor", in: Proc. of 25th DAGM Symposium, Magdeburg 2003, Lecture Notes in Computer Science 2781, pp. 25-32, Heidelberg: Springer, 2003 It is closely related to the structure tensor (see \ref structureTensor()), but replaces the linear tensor smoothing with a smoothing along edges only. Smoothing accross edges is largely suppressed. This means that the image structure is preserved much better because nearby features such as parallel edges are not blended into each other. The hourglass filter is typically applied to a gradient tensor, i.e. the Euclidean product of the gradient with itself, which can be obtained by a gradient operator followed with \ref vectorToTensor(), see example below. The hourglass shape of the filter can be interpreted as indicating the likely continuations of a local edge element. The parameter sigma determines the radius of the hourglass (i.e. how far the influence of the edge element reaches), and rho controls its opening angle (i.e. how narrow the edge orientation os followed). Recommended values are sigma = 1.4 (or, more generally, two to three times the scale of the gradient operator used in the first step), and rho = 0.4 which corresponds to an opening angle of 22.5 degrees to either side of the edge. Declarations: pass arguments explicitly: \code namespace vigra { template void hourGlassFilter(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double sigma, double rho); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void hourGlassFilter(triple s, pair d, double sigma, double rho); } \endcode Usage: \#include \<vigra/orientedtensorfilters.hxx\> \code FImage img(w,h); FVector2Image gradient(w,h); FVector3Image tensor(w,h), smoothedTensor(w,h); gaussianGradient(srcImageRange(img), destImage(gradient), 1.0); vectorToTensor(srcImageRange(gradient), destImage(tensor)); hourGlassFilter(srcImageRange(tensor), destImage(smoothedTensor), 2.0, 0.4); \endcode \see vectorToTensor() */ doxygen_overloaded_function(template <...> void hourGlassFilter) template void hourGlassFilter(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double sigma, double rho) { vigra_precondition(sigma >= 0.0 && rho >= 0.0, "hourGlassFilter(): sigma and rho must be >= 0.0"); vigra_precondition(src.size(sul) == 3, "hourGlassFilter(): input image must have 3 bands."); vigra_precondition(dest.size(dul) == 3, "hourGlassFilter(): output image must have 3 bands."); // TODO: normalization int w = slr.x - sul.x; int h = slr.y - sul.y; double radius = VIGRA_CSTD::floor(3.0*sigma + 0.5); double sigma2 = -0.5 / sigma / sigma; double rho2 = -0.5 / rho / rho; double norm = 1.0 / (2.0 * M_PI * sigma * sigma); initImage(dul, dul+Diff2D(w,h), dest, NumericTraits::zero()); for(int y=0; y= w ? w - x - 1 : radius; double y1 = y + radius >= h ? h - y - 1 : radius; DestIterator dwul = d + Diff2D((int)x0, (int)y0); for(double yy=y0; yy <= y1; ++yy, ++dwul.y) { typename DestIterator::row_iterator dw = dwul.rowIterator(); for(double xx=x0; xx <= x1; ++xx, ++dw) { double r2 = xx*xx + yy*yy; double p = u*xx - v*yy; double q = v*xx + u*yy; double kernel = (p == 0.0) ? (q == 0.0) ? norm : 0.0 : norm * VIGRA_CSTD::exp(sigma2*r2 + rho2*q*q/p/p); dest.set(dest(dw) + kernel*src(s), dw); } } } } } template inline void hourGlassFilter(triple s, pair d, double sigma, double rho) { hourGlassFilter(s.first, s.second, s.third, d.first, d.second, sigma, rho); } /********************************************************/ /* */ /* ellipticGaussian */ /* */ /********************************************************/ template void ellipticGaussian(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, double sigmax, double sigmin) { vigra_precondition(sigmax >= sigmin && sigmin >= 0.0, "ellipticGaussian(): " "sigmax >= sigmin and sigmin >= 0.0 required"); int w = slr.x - sul.x; int h = slr.y - sul.y; double radius = VIGRA_CSTD::floor(3.0*sigmax + 0.5); double sigmin2 = -0.5 / sigmin / sigmin; double norm = 1.0 / (2.0 * M_PI * sigmin * sigmax); initImage(dul, dul+Diff2D(w,h), dest, NumericTraits::zero()); for(int y=0; y::RealPromote TmpType; TmpType d1 = src.getComponent(s,0) + src.getComponent(s,2); TmpType d2 = src.getComponent(s,0) - src.getComponent(s,2); TmpType d3 = 2.0 * src.getComponent(s,1); TmpType d4 = VIGRA_CSTD::sqrt(sq(d2) + sq(d3)); TmpType excentricity = 1.0 - (d1 - d4) / (d1 + d4); double sigmax2 = -0.5 / sq((sigmax - sigmin)*excentricity + sigmin); double phi = 0.5 * VIGRA_CSTD::atan2(d3, d2); double u = -VIGRA_CSTD::sin(phi); double v = VIGRA_CSTD::cos(phi); double x0 = x - radius < 0 ? -x : -radius; double y0 = y - radius < 0 ? -y : -radius; double x1 = x + radius >= w ? w - x - 1 : radius; double y1 = y + radius >= h ? h - y - 1 : radius; DestIterator dwul = d + Diff2D((int)x0, (int)y0); for(double yy=y0; yy <= y1; ++yy, ++dwul.y) { typename DestIterator::row_iterator dw = dwul.rowIterator(); for(double xx=x0; xx <= x1; ++xx, ++dw) { double p = u*xx - v*yy; double q = v*xx + u*yy; double kernel = norm * VIGRA_CSTD::exp(sigmax2*p*p + sigmin2*q*q); dest.set(dest(dw) + kernel*src(s), dw); } } } } } template inline void ellipticGaussian(triple s, pair d, double sigmax, double sigmin) { ellipticGaussian(s.first, s.second, s.third, d.first, d.second, sigmax, sigmin); } /********************************************************/ /* */ /* kernels for orientedTrigonometricFilter */ /* */ /********************************************************/ class FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; FoerstnerKernelBase(double scale, bool ringShaped = false) : radius_((int)(3.0*scale+0.5)), weights_(2*radius_+1, 2*radius_+1), vectors_(2*radius_+1, 2*radius_+1) { double norm = 1.0 / (2.0 * M_PI * scale * scale); double s2 = -0.5 / scale / scale; for(int y = -radius_; y <= radius_; ++y) { for(int x = -radius_; x <= radius_; ++x) { double d2 = x*x + y*y; double d = VIGRA_CSTD::sqrt(d2); vectors_(x+radius_,y+radius_) = d != 0.0 ? VectorType(x/d, -y/d) : VectorType(0, 0); weights_(x+radius_,y+radius_) = ringShaped ? norm * d2 * VIGRA_CSTD::exp(d2 * s2) : norm * VIGRA_CSTD::exp(d2 * s2); } } } ResultType operator()(int x, int y, VectorType const &) const { // isotropic filtering return weights_(radius_, radius_); } int radius_; DImage weights_; DVector2Image vectors_; }; class FoerstnerRingKernelBase : public FoerstnerKernelBase { public: FoerstnerRingKernelBase(double scale) : FoerstnerKernelBase(scale, true) {} }; class Cos2RingKernel : public FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; Cos2RingKernel(double scale) : FoerstnerKernelBase(scale, true) {} ResultType operator()(int x, int y, VectorType const & v) const { if(x == 0 && y == 0) return weights_(radius_, radius_); double d = dot(vectors_(x+radius_, y+radius_), v); return d * d * weights_(x+radius_, y+radius_); } }; class Cos2Kernel : public FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; Cos2Kernel(double scale) : FoerstnerKernelBase(scale, false) {} ResultType operator()(int x, int y, VectorType const & v) const { if(x == 0 && y == 0) return weights_(radius_, radius_); double d = dot(vectors_(x+radius_, y+radius_), v); return d * d * weights_(x+radius_, y+radius_); } }; class Sin2RingKernel : public FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; Sin2RingKernel(double scale) : FoerstnerKernelBase(scale, true) {} ResultType operator()(int x, int y, VectorType const & v) const { if(x == 0 && y == 0) return weights_(radius_, radius_); double d = dot(vectors_(x+radius_, y+radius_), v); return (1.0 - d * d) * weights_(x+radius_, y+radius_); } }; class Sin2Kernel : public FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; Sin2Kernel(double scale) : FoerstnerKernelBase(scale, false) {} ResultType operator()(int x, int y, VectorType const & v) const { if(x == 0 && y == 0) return weights_(radius_, radius_); double d = dot(vectors_(x+radius_, y+radius_), v); return (1.0 - d * d) * weights_(x+radius_, y+radius_); } }; class Sin6RingKernel : public FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; Sin6RingKernel(double scale) : FoerstnerKernelBase(scale, true) {} ResultType operator()(int x, int y, VectorType const & v) const { if(x == 0 && y == 0) return weights_(radius_, radius_); double d = dot(vectors_(x+radius_, y+radius_), v); return VIGRA_CSTD::pow(1.0 - d * d, 3) * weights_(x+radius_, y+radius_); } }; class Sin6Kernel : public FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; Sin6Kernel(double scale) : FoerstnerKernelBase(scale, false) {} ResultType operator()(int x, int y, VectorType const & v) const { if(x == 0 && y == 0) return weights_(radius_, radius_); double d = dot(vectors_(x+radius_, y+radius_), v); return VIGRA_CSTD::pow(1.0 - d * d, 3) * weights_(x+radius_, y+radius_); } }; class Cos6RingKernel : public FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; Cos6RingKernel(double scale) : FoerstnerKernelBase(scale, true) {} ResultType operator()(int x, int y, VectorType const & v) const { if(x == 0 && y == 0) return weights_(radius_, radius_); double d = dot(vectors_(x+radius_, y+radius_), v); return (1.0 - VIGRA_CSTD::pow(1.0 - d * d, 3)) * weights_(x+radius_, y+radius_); } }; class Cos6Kernel : public FoerstnerKernelBase { public: typedef double ResultType; typedef double WeightType; typedef DVector2Image::value_type VectorType; Cos6Kernel(double scale) : FoerstnerKernelBase(scale, false) {} ResultType operator()(int x, int y, VectorType const & v) const { if(x == 0 && y == 0) return weights_(radius_, radius_); double d = dot(vectors_(x+radius_, y+radius_), v); return (1.0 - VIGRA_CSTD::pow(1.0 - d * d, 3)) * weights_(x+radius_, y+radius_); } }; /********************************************************/ /* */ /* orientedTrigonometricFilter */ /* */ /********************************************************/ template void orientedTrigonometricFilter(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, Kernel const & kernel) { vigra_precondition(src.size(sul) == 2, "orientedTrigonometricFilter(): input image must have 2 bands."); vigra_precondition(dest.size(dul) == 3, "orientedTrigonometricFilter(): output image must have 3 bands."); int w = slr.x - sul.x; int h = slr.y - sul.y; int radius = kernel.radius_; typedef typename SrcAccessor::value_type VectorType; typedef typename DestAccessor::value_type TensorType; initImage(dul, dul+Diff2D(w,h), dest, NumericTraits::zero()); for(int y=0; y= w ? w - x - 1 : radius; int y1 = y + radius >= h ? h - y - 1 : radius; VectorType v(src(s)); TensorType t(sq(v[0]), v[0]*v[1], sq(v[1])); double sqMag = t[0] + t[2]; double mag = VIGRA_CSTD::sqrt(sqMag); if(mag != 0.0) v /= mag; else v *= 0.0; Diff2D dd; for(dd.y = y0; dd.y <= y1; ++dd.y) { for(dd.x = x0; dd.x <= x1; ++dd.x) { dest.set(dest(d, dd) + kernel(dd.x, dd.y, v) * t, d, dd); } } } } } template inline void orientedTrigonometricFilter(triple s, pair d, Kernel const & kernel) { orientedTrigonometricFilter(s.first, s.second, s.third, d.first, d.second, kernel); } //@} } // namespace vigra #endif /* VIGRA_ORIENTEDTENSORFILTERS_HXX */ gamera-3.3.3/include/vigra/pixelneighborhood.hxx0000644000076500000000000015361311261456424020755 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2005 by Hans Meine, Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_PIXELNEIGHBORHOOD_HXX #define VIGRA_PIXELNEIGHBORHOOD_HXX #include "utilities.hxx" namespace vigra { /** \addtogroup PixelNeighborhood Utilities to manage pixel neighborhoods 4- and 8-neighborhood definitions and circulators. \#include \<vigra/pixelneighborhood.hxx\>
See also: \ref vigra::NeighborhoodCirculator */ //@{ /********************************************************/ /* */ /* AtImageBorder */ /* */ /********************************************************/ /** \brief Encode whether a point is near the image border. This enum is used with \ref isAtImageBorder() and \ref vigra::RestrictedNeighborhoodCirculator. \#include \<vigra/pixelneighborhood.hxx\>
Namespace: vigra */ enum AtImageBorder { NotAtBorder = 0, ///<   RightBorder = 1, ///<   LeftBorder = 2, ///<   TopBorder = 4, ///<   BottomBorder = 8, ///<   FrontBorder = 16, ///<   RearBorder = 32, TopRightBorder = TopBorder | RightBorder, //5 TopLeftBorder = TopBorder | LeftBorder, //6 TopFrontBorder = TopBorder | FrontBorder, //20 TopRearBorder = TopBorder | RearBorder, //36 BottomLeftBorder = BottomBorder | LeftBorder, //10 BottomRightBorder = BottomBorder | RightBorder, //9 BottomFrontBorder = BottomBorder | FrontBorder, //24 BottomRearBorder = BottomBorder | RearBorder, //40 FrontLeftBorder = FrontBorder | LeftBorder, //18 FrontRightBorder = FrontBorder | RightBorder, //17 RearLeftBorder = RearBorder | LeftBorder, //34 RearRightBorder = RearBorder | RightBorder, //33 TopRightFrontBorder = TopBorder | RightBorder | FrontBorder, //21 TopLeftFrontBorder = TopBorder | LeftBorder | FrontBorder, //22 BottomLeftFrontBorder = BottomBorder | LeftBorder | FrontBorder, //26 BottomRightFrontBorder = BottomBorder | RightBorder | FrontBorder, //25 TopRightRearBorder = TopBorder | RightBorder | RearBorder, //37 TopLeftRearBorder = TopBorder | LeftBorder | RearBorder, //38 BottomLeftRearBorder = BottomBorder | LeftBorder | RearBorder, //42 BottomRightRearBorder = BottomBorder | RightBorder | RearBorder //41 }; /** \brief Find out whether a point is at the image border. This function checks if \a x == 0 or \a x == \a width - 1 and \a y == 0 or \a y == \a height - 1 and returns the appropriate value of \ref vigra::AtImageBorder, or zero when the point is not at te image border. The behavior of the function is undefined if (x,y) is not inside the image. \#include \<vigra/pixelneighborhood.hxx\>
Namespace: vigra */ inline AtImageBorder isAtImageBorder(int x, int y, int width, int height) { return static_cast((x == 0 ? LeftBorder : x == width-1 ? RightBorder : NotAtBorder) | (y == 0 ? TopBorder : y == height-1 ? BottomBorder : NotAtBorder)); } /********************************************************/ /* */ /* FourNeighborhood */ /* */ /********************************************************/ /** Utilities for 4-neighborhood. */ namespace FourNeighborhood { /** \brief Encapsulation of direction management for 4-neighborhood. This helper class allows the transformation between Freeman chain codes (East = 0, North = 1 etc.) and the corresponding Diff2D instances and back. You can either use the chain codes by explicit qualification: \code // the following three lines are equivalent FourNeighborhood::NeighborCode::Direction d = FourNeighborhood::NeighborCode::East; FourNeighborCode::Direction d = FourNeighborCode::East; FourNeighborhood::Direction d = FourNeighborhood::East; \endcode or you can fix 4-neighborhood by importing the entire namespace in your function: \code using namespace FourNeighborhood; Direction d = East; \endcode If you want to pass 4-neighborhood codes as a template parameter, use the class FourNeighborhood::NeighborCode. \#include \<vigra/pixelneighborhood.hxx\>
Namespace: vigra::FourNeighborhood */ class NeighborCode { public: typedef Diff2D difference_type; /** Freeman direction codes for the 4-neighborhood. East = 0, North = 1 etc. DirectionCount may be used for portable loop termination conditions. CausalFirst and CausalLast are the first and last (inclusive) neighbors in the causal neighborhood, i.e. in the set of neighbors that have already been visited when the image is traversed in scan order. AntiCausalFirst and AntiCausalLast are the opposite. */ enum Direction { Error = -1, ///<   East = 0, ///<   North, ///<   West, ///<   South, ///<   DirectionCount, ///<   CausalFirst = North, ///<   CausalLast = West, ///<   AntiCausalFirst = South, ///<   AntiCausalLast = East, ///<   InitialDirection = East, OppositeDirPrefix = 1, OppositeOffset = West }; static unsigned int directionBit(Direction d) { static unsigned int b[] = {1 << (East + 1), 1 << (North + 1), 1 << (West + 1), 1 << (South + 1)}; return b[d]; }; /** The number of valid neighbors if the current center is at the image border. */ static unsigned int nearBorderDirectionCount(AtImageBorder b) { static unsigned int c[] = { 4, 3, 3, 0, 3, 2, 2, 0, 3, 2, 2}; return c[b]; } /** The valid direction codes when the center is at the image border. \a index must be in the range 0...nearBorderDirectionCount(b)-1. */ static Direction nearBorderDirections(AtImageBorder b, int index) { static Direction c[11][4] = { { East, North, West, South}, { North, West, South, Error}, { East, North, South, Error}, { Error, Error, Error, Error}, { East, West, South, Error}, { West, South, Error, Error}, { East, South, Error, Error}, { Error, Error, Error, Error}, { East, North, West, Error}, { North, West, Error, Error}, { East, North, Error, Error} }; return c[b][index]; } /** Transform direction code into corresponding Diff2D offset. (note: there is no bounds checking on the code you pass.) */ static Diff2D const & diff(Direction code) { static Diff2D d[] = { Diff2D(1, 0), Diff2D(0, -1), Diff2D(-1, 0), Diff2D(0, 1) }; return d[code]; } /** Equivalent to diff(static_cast(code)). (note: there is no bounds checking on the code you pass.) */ static Diff2D const & diff(int code) { return diff(static_cast(code)); } /** Get the relative offset from one neighbor to the other. For example, relativeDiff(East, West) == Diff2D(-2,0). (note: there is no bounds checking on the code you pass.) */ static Diff2D const & relativeDiff(Direction fromCode, Direction toCode) { static Diff2D d[][4] = { { Diff2D(0, 0), Diff2D(-1, -1), Diff2D(-2, 0), Diff2D(-1, 1) }, { Diff2D(1, 1), Diff2D(0, 0), Diff2D(-1, 1), Diff2D(0, 2) }, { Diff2D(2, 0), Diff2D(1, -1), Diff2D(0, 0), Diff2D(1, 1) }, { Diff2D(1, -1), Diff2D(0, -2), Diff2D(-1, -1), Diff2D(0, 0) } }; return d[fromCode][toCode]; } /** Equivalent to relativeDiff(static_cast(fromCode), static_cast(toCode)). (note: there is no bounds checking on the code you pass.) */ static Diff2D const & relativeDiff(int fromCode, int toCode) { return relativeDiff(static_cast(fromCode), static_cast(toCode)); } /** X-component of diff() */ static int dX(Direction code) { return diff(code).x; } /** Y-component of diff() */ static int dY(Direction code) { return diff(code).y; } /** X-component of diff() */ static int dX(int code) { return diff(code).x; } /** Y-component of diff() */ static int dY(int code) { return diff(code).y; } /** Transform Diff2D offset into corresponding direction code. The code Direction::Error will be returned if diff is not in the 4-neighborhood. */ static Direction code(Diff2D const & diff) { switch(diff.x) { case 0: { switch(diff.y) { case 1: return South; case -1: return North; default: return Error; } } case -1: { return (diff.y == 0) ? West : Error; } case 1: { return (diff.y == 0) ? East : Error; } } return Error; } /** Check whether a code refers to a diagonal direction. Useful if you want to abstract the differences between 4- and 8-neighborhood. Always false for 4-neighborhood. */ static bool isDiagonal(Direction) { return false; } static Diff2D const & right() { return diff(East); } /**< Offset to the right neighbor */ static Diff2D const & top() { return diff(North); } /**< Offset to the top neighbor */ static Diff2D const & left() { return diff(West); } /**< Offset to the left neighbor */ static Diff2D const & bottom() { return diff(South); } /**< Offset to the bottom neighbor */ static Diff2D const & east() { return diff(East); } /**< Offset to the east neighbor */ static Diff2D const & north() { return diff(North); } /**< Offset to the north neighbor */ static Diff2D const & west() { return diff(West); } /**< Offset to the west neighbor */ static Diff2D const & south() { return diff(South); } /**< Offset to the south neighbor */ }; /** Export NeighborCode::Direction into the scope of namespace FourNeighborhood. */ typedef NeighborCode::Direction Direction; static const Direction East = NeighborCode::East; /**< Export NeighborCode::East to namespace FourNeighborhood */ static const Direction North = NeighborCode::North; /**< Export NeighborCode::North to namespace FourNeighborhood */ static const Direction West = NeighborCode::West; /**< Export NeighborCode::West to namespace FourNeighborhood */ static const Direction South = NeighborCode::South; /**< Export NeighborCode::South to namespace FourNeighborhood */ static const Direction DirectionCount = NeighborCode::DirectionCount; /**< Export NeighborCode::DirectionCount to namespace FourNeighborhood */ inline Diff2D const & east() { return NeighborCode::diff(East); } /**< Offset to the east neighbor */ inline Diff2D const & north() { return NeighborCode::diff(North); } /**< Offset to the north neighbor */ inline Diff2D const & west() { return NeighborCode::diff(West); } /**< Offset to the west neighbor */ inline Diff2D const & south() { return NeighborCode::diff(South); } /**< Offset to the south neighbor */ } // namespace FourNeighborhood /** Export \ref vigra::FourNeighborhood::NeighborCode into the scope of namespace vigra. */ typedef FourNeighborhood::NeighborCode FourNeighborCode; /********************************************************/ /* */ /* EightNeighborhood */ /* */ /********************************************************/ /** Utilities for 8-neighborhood. */ namespace EightNeighborhood { /** \brief Encapsulation of direction management for the 8-neighborhood. This helper class allows the transformation between Freeman chain codes (East = 0, NorthEast = 1 etc.) and the corresponding Diff2D instances and back. You can either use the chain codes by explicit qualification: \code // the following three lines are equivalent EightNeighborhood::NeighborCode::Direction d = EightNeighborhood::NeighborCode::East; EightNeighborCode::Direction d = EightNeighborCode::East; EightNeighborhood::Direction d = EightNeighborhood::East; \endcode or you can fix 8-neighborhood by importing the entire namespace in your function: \code using namespace EightNeighborhood; Direction d = East; \endcode If you want to pass 8-neighborhood codes as a template parameter, use the class EightNeighborhood::NeighborCode. \#include \<vigra/pixelneighborhood.hxx\>
Namespace: vigra::EightNeighborhood */ class NeighborCode { public: typedef Diff2D difference_type; /** Freeman direction codes for the 8-neighborhood. East = 0, North = 1 etc. DirectionCount may be used for portable loop termination conditions. CausalFirst and CausalLast are the first and last (inclusive) neighbors in the causal neighborhood, i.e. in the set of neighbors that have already been visited when the image is traversed in scan order. AntiCausalFirst and AntiCausalLast are the opposite. */ enum Direction { Error = -1, ///<   East = 0, ///<   NorthEast, ///<   North, ///<   NorthWest, ///<   West, ///<   SouthWest, ///<   South, ///<   SouthEast, ///<   DirectionCount, ///<   CausalFirst = NorthEast, ///<   CausalLast = West, ///<   AntiCausalFirst = SouthWest, ///<   AntiCausalLast = East, ///<   InitialDirection = East, OppositeDirPrefix = 1, OppositeOffset = West }; static unsigned int directionBit(Direction d) { static unsigned int b[] = {1 << (East + 1), 1 << (NorthEast + 1), 1 << (North + 1), 1 << (NorthWest + 1), 1 << (West + 1), 1 << (SouthWest + 1), 1 << (South + 1), 1 << (SouthEast + 1)}; return b[d]; }; /** The number of valid neighbors if the current center is at the image border. */ static unsigned int nearBorderDirectionCount(AtImageBorder b) { static unsigned int c[] = { 8, 5, 5, 0, 5, 3, 3, 0, 5, 3, 3}; return c[b]; } /** The valid direction codes when the center is at the image border. \a index must be in the range 0...nearBorderDirectionCount(b)-1. */ static Direction nearBorderDirections(AtImageBorder b, int index) { static Direction c[11][8] = { { East, NorthEast, North, NorthWest, West, SouthWest, South, SouthEast}, { North, NorthWest, West, SouthWest, South, Error, Error, Error}, { East, NorthEast, North, South, SouthEast, Error, Error, Error}, { Error, Error, Error, Error, Error, Error, Error, Error}, { East, West, SouthWest, South, SouthEast, Error, Error, Error}, { West, SouthWest, South, Error, Error, Error, Error, Error}, { East, South, SouthEast, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error, Error, Error}, { East, NorthEast, North, NorthWest, West, Error, Error, Error}, { North, NorthWest, West, Error, Error, Error, Error, Error}, { East, NorthEast, North, Error, Error, Error, Error, Error} }; return c[b][index]; } /** Transform direction code into corresponding Diff2D offset. (note: there is no bounds checking on the code you pass.) */ static Diff2D const & diff(Direction code) { static Diff2D d[] = { Diff2D(1, 0), Diff2D(1, -1), Diff2D(0, -1), Diff2D(-1, -1), Diff2D(-1, 0), Diff2D(-1, 1), Diff2D(0, 1), Diff2D(1, 1) }; return d[code]; } /** Equivalent to diff(static_cast(code)). (note: there is no bounds checking on the code you pass.) */ static Diff2D const & diff(int code) { return diff(static_cast(code)); } /** Get the relative offset from one neighbor to the other. For example, relativeDiff(East, West) == Diff2D(-2,0). (note: there is no bounds checking on the code you pass.) */ static Diff2D const & relativeDiff(Direction fromCode, Direction toCode) { static Diff2D d[][8] = { { Diff2D(0, 0), Diff2D(0, -1), Diff2D(-1, -1), Diff2D(-2, -1), Diff2D(-2, 0), Diff2D(-2, 1), Diff2D(-1, 1), Diff2D(0, 1) }, { Diff2D(0, 1), Diff2D(0, 0), Diff2D(-1, 0), Diff2D(-2, 0), Diff2D(-2, 1), Diff2D(-2, 2), Diff2D(-1, 2), Diff2D(0, 2) }, { Diff2D(1, 1), Diff2D(1, 0), Diff2D(0, 0), Diff2D(-1, 0), Diff2D(-1, 1), Diff2D(-1, 2), Diff2D(0, 2), Diff2D(1, 2) }, { Diff2D(2, 1), Diff2D(2, 0), Diff2D(1, 0), Diff2D(0, 0), Diff2D(0, 1), Diff2D(0, 2), Diff2D(1, 2), Diff2D(2, 2) }, { Diff2D(2, 0), Diff2D(2, -1), Diff2D(1, -1), Diff2D(0, -1), Diff2D(0, 0), Diff2D(0, 1), Diff2D(1, 1), Diff2D(2, 1) }, { Diff2D(2, -1), Diff2D(2, -2), Diff2D(1, -2), Diff2D(0, -2), Diff2D(0, -1), Diff2D(0, 0), Diff2D(1, 0), Diff2D(2, 0) }, { Diff2D(1, -1), Diff2D(1, -2), Diff2D(0, -2), Diff2D(-1, -2), Diff2D(-1, -1), Diff2D(-1, 0), Diff2D(0, 0), Diff2D(1, 0) }, { Diff2D(0, -1), Diff2D(0, -2), Diff2D(-1, -2), Diff2D(-2, -2), Diff2D(-2, -1), Diff2D(-2, 0), Diff2D(-1, 0), Diff2D(0, 0) } }; return d[fromCode][toCode]; } /** Equivalent to relativeDiff(static_cast(fromCode), static_cast(toCode)). (note: there is no bounds checking on the code you pass.) */ static Diff2D const & relativeDiff(int fromCode, int toCode) { return relativeDiff(static_cast(fromCode), static_cast(toCode)); } /** X-component of diff() */ static int dX(Direction code) { return diff(code).x; } /** Y-component of diff() */ static int dY(Direction code) { return diff(code).y; } /** X-component of diff() */ static int dX(int code) { return diff(code).x; } /** Y-component of diff() */ static int dY(int code) { return diff(code).y; } /** Transform 4-neighborhood code into 8-neighborhood code. */ static Direction code(FourNeighborhood::Direction d) { return static_cast(2*d); } /** Transform Diff2D offset into corresponding direction code. The code Direction::Error will be returned if diff is not in the 8-neighborhood. */ static Direction code(Diff2D const & diff) { switch(diff.x) { case 0: { switch(diff.y) { case 1: return South; case -1: return North; default: return Error; } } case -1: { switch(diff.y) { case 0: return West; case 1: return SouthWest; case -1: return NorthWest; default: return Error; } } case 1: { switch(diff.y) { case 0: return East; case 1: return SouthEast; case -1: return NorthEast; default: return Error; } } } return Error; } /** Check whether a code refers to a diagonal direction. Useful if you want to abstract the differences between 4- and 8-neighborhood. */ static bool isDiagonal(Direction code) { return (code % 2) != 0; } static Diff2D const & right() { return diff(East); } /**< Offset to the right neighbor */ static Diff2D const & topRight() { return diff(NorthEast); } /**< Offset to the topRight neighbor */ static Diff2D const & top() { return diff(North); } /**< Offset to the top neighbor */ static Diff2D const & topLeft() { return diff(NorthWest); } /**< Offset to the topLeft neighbor */ static Diff2D const & left() { return diff(West); } /**< Offset to the left neighbor */ static Diff2D const & bottomLeft() { return diff(SouthWest); } /**< Offset to the bottomLeft neighbor */ static Diff2D const & bottom() { return diff(South); } /**< Offset to the bottom neighbor */ static Diff2D const & bottomRight() { return diff(SouthEast); } /**< Offset to the bottomRight neighbor */ static Diff2D const & east() { return diff(East); } /**< Offset to the east neighbor */ static Diff2D const & northEast() { return diff(NorthEast); } /**< Offset to the northEast neighbor */ static Diff2D const & north() { return diff(North); } /**< Offset to the north neighbor */ static Diff2D const & northWest() { return diff(NorthWest); } /**< Offset to the northWest neighbor */ static Diff2D const & west() { return diff(West); } /**< Offset to the west neighbor */ static Diff2D const & southWest() { return diff(SouthWest); } /**< Offset to the southWest neighbor */ static Diff2D const & south() { return diff(South); } /**< Offset to the south neighbor */ static Diff2D const & southEast() { return diff(SouthEast); } /**< Offset to the southEast neighbor */ }; /** Export NeighborCode::Direction into the scope of namespace EightNeighborhood. */ typedef NeighborCode::Direction Direction; static const Direction East = NeighborCode::East; /**< Export NeighborCode::East to namespace EightNeighborhood */ static const Direction NorthEast = NeighborCode::NorthEast; /**< Export NeighborCode::NorthEast to namespace EightNeighborhood */ static const Direction North = NeighborCode::North; /**< Export NeighborCode::North to namespace EightNeighborhood */ static const Direction NorthWest = NeighborCode::NorthWest; /**< Export NeighborCode::NorthWest to namespace EightNeighborhood */ static const Direction West = NeighborCode::West; /**< Export NeighborCode::West to namespace EightNeighborhood */ static const Direction SouthWest = NeighborCode::SouthWest; /**< Export NeighborCode::SouthWest to namespace EightNeighborhood */ static const Direction South = NeighborCode::South; /**< Export NeighborCode::South to namespace EightNeighborhood */ static const Direction SouthEast = NeighborCode::SouthEast; /**< Export NeighborCode::SouthEast to namespace EightNeighborhood */ static const Direction DirectionCount = NeighborCode::DirectionCount; /**< Export NeighborCode::DirectionCount to namespace EightNeighborhood */ inline Diff2D const & east() { return NeighborCode::diff(East); } /**< Offset to the east neighbor */ inline Diff2D const & northEast() { return NeighborCode::diff(NorthEast); } /**< Offset to the northEast neighbor */ inline Diff2D const & north() { return NeighborCode::diff(North); } /**< Offset to the north neighbor */ inline Diff2D const & northWest() { return NeighborCode::diff(NorthWest); } /**< Offset to the northWest neighbor */ inline Diff2D const & west() { return NeighborCode::diff(West); } /**< Offset to the west neighbor */ inline Diff2D const & southWest() { return NeighborCode::diff(SouthWest); } /**< Offset to the southWest neighbor */ inline Diff2D const & south() { return NeighborCode::diff(South); } /**< Offset to the south neighbor */ inline Diff2D const & southEast() { return NeighborCode::diff(SouthEast); } /**< Offset to the southEast neighbor */ } // namespace EightNeighborhood /** Export \ref vigra::EightNeighborhood::NeighborCode into the scope of namespace vigra. */ typedef EightNeighborhood::NeighborCode EightNeighborCode; /********************************************************/ /* */ /* NeighborOffsetCirculator */ /* */ /********************************************************/ /** \brief Circulator that walks around a given location. The template parameter defines the kind of neighborhood used, e.g. \code NeighborOffsetCirculator eight_circulator; NeighborOffsetCirculator four_circulator; \endcode Since this circulator doesn't now about the pixels in any particular image, you usually doesn't use it directly but rather as a base class or helper for neighborhood circulators refering to a particular image (e.g. NeighborhoodCirculator) \#include \<vigra/pixelneighborhood.hxx\>
Namespace: vigra */ template class NeighborOffsetCirculator : public NEIGHBORCODE { public: typedef NEIGHBORCODE NeighborCode; /** return type of direction() */ typedef typename NEIGHBORCODE::Direction Direction; /** the circulator's value type */ typedef typename NEIGHBORCODE::difference_type value_type; /** the circulator's reference type (return type of *circ) */ typedef value_type const & reference; /** the circulator's index reference type (return type of circ[n]) */ typedef value_type const & index_reference; /** the circulator's pointer type (return type of operator->) */ typedef value_type const * pointer; /** the circulator's difference type (argument type of circ[diff]) */ typedef int difference_type; /** the circulator tag (random access iterator) */ typedef random_access_circulator_tag iterator_category; protected: Direction direction_; public: /** Create circulator refering to the given direction. */ NeighborOffsetCirculator(Direction dir = NEIGHBORCODE::InitialDirection) : direction_(dir) { } /** pre-increment */ NeighborOffsetCirculator & operator++() { direction_ = static_cast((direction_+1) % NEIGHBORCODE::DirectionCount); return *this; } /** pre-decrement */ NeighborOffsetCirculator & operator--() { direction_ = static_cast((direction_ + NEIGHBORCODE::DirectionCount-1) % NEIGHBORCODE::DirectionCount); return *this; } /** post-increment */ NeighborOffsetCirculator operator++(int) { NeighborOffsetCirculator ret(*this); operator++(); return ret; } /** post-decrement */ NeighborOffsetCirculator operator--(int) { NeighborOffsetCirculator ret(*this); operator--(); return ret; } /** add-assignment */ NeighborOffsetCirculator & operator+=(difference_type d) { direction_ = static_cast((direction_ + d) % NEIGHBORCODE::DirectionCount); if(direction_ < 0) direction_ = static_cast(direction_ + NEIGHBORCODE::DirectionCount); return *this; } /** subtract-assignment */ NeighborOffsetCirculator & operator-=(difference_type d) { direction_ = static_cast((direction_ - d) % NEIGHBORCODE::DirectionCount); if(direction_ < 0) direction_ = static_cast(direction_ + NEIGHBORCODE::DirectionCount); return *this; } /** addition */ NeighborOffsetCirculator operator+(difference_type d) const { return NeighborOffsetCirculator(*this) += d; } /** subtraction */ NeighborOffsetCirculator operator-(difference_type d) const { return NeighborOffsetCirculator(*this) -= d; } /** Move to the direction that is 'right' relative to the current direction. This is equivalent to four_circulator-- and eight_circulator -= 2 respectively. */ NeighborOffsetCirculator & turnRight() { direction_ = static_cast((direction_ + NEIGHBORCODE::South) % NEIGHBORCODE::DirectionCount); return *this; } /** Move to the direction that is 'left' relative to the current direction. This is equivalent to four_circulator++ and eight_circulator += 2 respectively. */ NeighborOffsetCirculator & turnLeft() { direction_ = static_cast((direction_ + NEIGHBORCODE::North) % NEIGHBORCODE::DirectionCount); return *this; } /** Move to the opposite direction of the current direction. This is equivalent to four_circulator += 2 and eight_circulator += 4 respectively. */ NeighborOffsetCirculator & turnRound() { direction_ = opposite(); return *this; } /** Move to the given direction. */ NeighborOffsetCirculator & turnTo(Direction d) { direction_ = d; return *this; } /** equality */ bool operator==(NeighborOffsetCirculator const & o) const { return direction_ == o.direction_; } /** unequality */ bool operator!=(NeighborOffsetCirculator const & o) const { return direction_ != o.direction_; } /** subtraction */ difference_type operator-(NeighborOffsetCirculator const & o) const { return direction_ - o.direction_; } /** dereference */ reference operator*() const { return diff(); } /** index */ index_reference operator[](difference_type d) const { return NEIGHBORCODE::diff(direction(d)); } /** member access */ pointer operator->() const { return &diff(); } /** Get offset from center to current neighbor. */ reference diff() const { return NEIGHBORCODE::diff(direction_); } /** Get offset to given direction. */ static reference diff(Direction dir) { return NEIGHBORCODE::diff(dir); } /** Get relative distance from current neighbor to neighbor at given offset. */ value_type relativeDiff(difference_type offset) const { Direction toDir = static_cast((direction_ + offset) % NEIGHBORCODE::DirectionCount); if(toDir < 0) toDir = static_cast(toDir + NEIGHBORCODE::DirectionCount); return NEIGHBORCODE::relativeDiff(direction_, toDir); } /** X-component of diff() */ int dX() const { return NEIGHBORCODE::dX(direction_); } /** Y-component of diff() */ int dY() const { return NEIGHBORCODE::dY(direction_); } /** Check whether current direction is a diagonal one. */ bool isDiagonal() const { return NEIGHBORCODE::isDiagonal(direction_); } /** Get current direction. */ Direction direction() const { return direction_; } /** Get current direction bit. */ unsigned int directionBit() const { return NEIGHBORCODE::directionBit(direction_); } /** Get opposite of current direction. */ Direction opposite() const { return static_cast((NEIGHBORCODE::OppositeDirPrefix*direction_ + NEIGHBORCODE::OppositeOffset) % NEIGHBORCODE::DirectionCount); } /** Get opposite bit of current direction. */ unsigned int oppositeDirectionBit() const { return NEIGHBORCODE::directionBit(opposite()); } /** Get direction code at offset of current direction. */ Direction direction(difference_type offset) const { int result = (direction_ + offset) % NEIGHBORCODE::DirectionCount; if(result < 0) result += NEIGHBORCODE::DirectionCount; return static_cast(result); } }; /** Specialization of NeighborOffsetCirculator for 8-neighborhood. */ typedef NeighborOffsetCirculator EightNeighborOffsetCirculator; /** Specialization of NeighborOffsetCirculator for 4-neighborhood. */ typedef NeighborOffsetCirculator FourNeighborOffsetCirculator; //@} /** \addtogroup ImageIteratorAdapters */ //@{ /********************************************************/ /* */ /* NeighborhoodCirculator */ /* */ /********************************************************/ /** \brief Circulator that walks around a given location in a given image. The template parameters define the kind of neighborhood used and the underlying image. The access functions return the value of the current neighbor pixel. Use center() to access the center pixel of the neighborhood. The center can be changed by calling moveCenterToNeighbor() or swapCenterNeighbor(). Note that this circulator cannot when the center is at the image border. You must then use \ref vigra::RestrictedNeighborhoodCirculator Usage:
\#include \<vigra/pixelneighborhood.hxx\>
Namespace: vigra \code BImage::traverser upperleft(...), lowerright(...); int width = lowerright.x - upperleft.x; int height = lowerright.y - upperleft.y; ++upperleft.y; // avoid image border for(int y=1; y circulator(ix), end(circulator); do { analysisFunc(*circulator, ...); // do sth. with current neighbor } while(++circulator != end); // compare with start/end circulator } } \endcode */ template class NeighborhoodCirculator : private IMAGEITERATOR { typedef NeighborOffsetCirculator NEIGHBOROFFSETCIRCULATOR; public: /** type of the underlying image iterator */ typedef IMAGEITERATOR base_type; /** type of the used neighbor code */ typedef NEIGHBORCODE NeighborCode; /** the circulator's value type */ typedef typename IMAGEITERATOR::value_type value_type; /** type of the direction code */ typedef typename NEIGHBORCODE::Direction Direction; /** the circulator's reference type (return type of *circ) */ typedef typename IMAGEITERATOR::reference reference; /** the circulator's index reference type (return type of circ[n]) */ typedef reference index_reference; /** the circulator's pointer type (return type of operator->) */ typedef typename IMAGEITERATOR::pointer pointer; /** the circulator's difference type (argument type of circ[diff]) */ typedef typename NEIGHBOROFFSETCIRCULATOR::difference_type difference_type; /** the circulator tag (random_access_circulator_tag) */ typedef typename NEIGHBOROFFSETCIRCULATOR::iterator_category iterator_category; /** Construct circulator with given center pixel, pointing to the neighbor at the given direction d. */ NeighborhoodCirculator(IMAGEITERATOR const & center = IMAGEITERATOR(), Direction d = NEIGHBOROFFSETCIRCULATOR::InitialDirection) : IMAGEITERATOR(center), neighborCode_(d) { IMAGEITERATOR::operator+=(neighborCode_.diff()); } /** pre-increment */ NeighborhoodCirculator & operator++() { return operator+=(1); } /** pre-decrement */ NeighborhoodCirculator operator++(int) { NeighborhoodCirculator ret(*this); operator++(); return ret; } /** post-increment */ NeighborhoodCirculator & operator--() { return operator+=(-1); } /** post-decrement */ NeighborhoodCirculator operator--(int) { NeighborhoodCirculator ret(*this); operator--(); return ret; } /** add-assignment */ NeighborhoodCirculator & operator+=(difference_type d) { IMAGEITERATOR::operator+=(neighborCode_.relativeDiff(d)); neighborCode_+= d; return *this; } /** subtract-assignment */ NeighborhoodCirculator & operator-=(difference_type d) { return operator+=(-d); } /** addition */ NeighborhoodCirculator operator+(difference_type d) const { NeighborhoodCirculator result(*this); result+= d; return result; } /** subtraction */ NeighborhoodCirculator operator-(difference_type d) const { NeighborhoodCirculator result(*this); result-= d; return result; } /** Move to the direction that is 'right' relative to the current direction. This is equivalent to four_circulator-- and eight_circulator -= 2 respectively. */ NeighborhoodCirculator & turnRight() { Direction oldDirection = neighborCode_.direction(); neighborCode_.turnRight(); IMAGEITERATOR::operator+=(NeighborCode::relativeDiff (oldDirection, neighborCode_.direction())); return *this; } /** Move to the direction that is 'left' relative to the current direction. This is equivalent to four_circulator++ and eight_circulator += 2 respectively. */ NeighborhoodCirculator & turnLeft() { Direction oldDirection = neighborCode_.direction(); neighborCode_.turnLeft(); IMAGEITERATOR::operator+=(NeighborCode::relativeDiff (oldDirection, neighborCode_.direction())); return *this; } /** Move to the opposite direction of the current direction. This is equivalent to four_circulator += 2 and eight_circulator += 4 respectively. */ NeighborhoodCirculator & turnRound() { Direction oldDirection = neighborCode_.direction(); neighborCode_.turnRound(); IMAGEITERATOR::operator+=(NeighborCode::relativeDiff (oldDirection, neighborCode_.direction())); return *this; } /** Move to the given direction. */ NeighborhoodCirculator & turnTo(Direction d) { Direction oldDirection = neighborCode_.direction(); neighborCode_.turnTo(d); IMAGEITERATOR::operator+=(NeighborCode::relativeDiff (oldDirection, neighborCode_.direction())); return *this; } /** Move the center in the current direction. The current neighbor becomes the new center, the direction does not change. */ NeighborhoodCirculator & moveCenterToNeighbor() { IMAGEITERATOR::operator+=(neighborCode_.diff()); return *this; } /** Exchange the center with the current neighbor. Equivalent to circ.moveCenterToNeighbor().turnRound() (but shorter and more efficient). */ NeighborhoodCirculator & swapCenterNeighbor() { neighborCode_.turnRound(); IMAGEITERATOR::operator+=(neighborCode_.diff()); return *this; } /** equality */ bool operator==(NeighborhoodCirculator const & rhs) const { return neighborCode_ == rhs.neighborCode_ && IMAGEITERATOR::operator==(rhs); } /** inequality */ bool operator!=(NeighborhoodCirculator const & rhs) const { return neighborCode_ != rhs.neighborCode_ || IMAGEITERATOR::operator!=(rhs); } /** subtraction */ difference_type operator-(NeighborhoodCirculator const & rhs) const { return neighborCode_ - rhs.neighborCode_; } /** dereference */ reference operator*() const { return IMAGEITERATOR::operator*(); } /** index */ index_reference operator[](difference_type d) const { return IMAGEITERATOR::operator[](neighborCode_.relativeDiff(d)); } /** member access */ pointer operator->() const { return IMAGEITERATOR::operator->(); } /** Get the base iterator for the current neighbor. */ base_type const & base() const { return *this; } /** Get the base iterator for the center of the circulator. */ base_type center() const { return (base_type)*this - neighborCode_.diff(); } /** Get the current direction. */ Direction direction() const { return neighborCode_.direction(); } /** Get the current direction bit. */ unsigned int directionBit() const { return neighborCode_.directionBit(); } /** Get the difference vector (Diff2D) from the center to the current neighbor. */ Diff2D const & diff() const { return neighborCode_.diff(); } /** Is the current neighbor a diagonal neighbor? */ bool isDiagonal() const { return neighborCode_.isDiagonal(); } private: NEIGHBOROFFSETCIRCULATOR neighborCode_; }; /********************************************************/ /* */ /* RestrictedNeighborhoodCirculator */ /* */ /********************************************************/ /** \brief Circulator that walks around a given location in a given image, unsing a restricted neighborhood. This circulator behaves essentially like \ref vigra::NeighborhoodCirculator, but can also be used near the image border, where some of the neighbor points would be outside the image und must not be accessed. The template parameters define the kind of neighborhood used (four or eight) and the underlying image, whereas the required neighbirhood restriction is given by the last constructur argument. This below for typical usage. The access functions return the value of the current neighbor pixel. Use center() to access the center pixel of the neighborhood. Usage:
\#include \<vigra/pixelneighborhood.hxx\>
Namespace: vigra \code BImage::traverser upperleft(...), lowerright(...); int width = lowerright.x - upperleft.x; int height = lowerright.y - upperleft.y; for(int y=0; y circulator(ix, isAtImageBorder(x, y, width, height)), end(circulator); do { ... // do something with the circulator } while(++circulator != end); // out-of-range pixels will be automatically skipped } } \endcode */ template class RestrictedNeighborhoodCirculator : private NeighborhoodCirculator { typedef NeighborhoodCirculator BaseType; public: /** type of the underlying image iterator */ typedef IMAGEITERATOR base_type; /** type of the used neighbor code */ typedef NEIGHBORCODE NeighborCode; /** the circulator's value type */ typedef typename BaseType::value_type value_type; /** type of the direction code */ typedef typename BaseType::Direction Direction; /** the circulator's reference type (return type of *circ) */ typedef typename BaseType::reference reference; /** the circulator's index reference type (return type of circ[n]) */ typedef typename BaseType::index_reference index_reference; /** the circulator's pointer type (return type of operator->) */ typedef typename BaseType::pointer pointer; /** the circulator's difference type (argument type of circ[diff]) */ typedef typename BaseType::difference_type difference_type; /** the circulator tag (random_access_circulator_tag) */ typedef typename BaseType::iterator_category iterator_category; /** Construct circulator with given center pixel, using the restricted neighborhood given by \a atBorder. */ RestrictedNeighborhoodCirculator(IMAGEITERATOR const & center = IMAGEITERATOR(), AtImageBorder atBorder = NotAtBorder) : BaseType(center, NEIGHBORCODE::nearBorderDirections(atBorder, 0)), whichBorder_(atBorder), count_(NEIGHBORCODE::nearBorderDirectionCount(atBorder)), current_(0) {} /** pre-increment */ RestrictedNeighborhoodCirculator & operator++() { return operator+=(1); } /** pre-decrement */ RestrictedNeighborhoodCirculator operator++(int) { RestrictedNeighborhoodCirculator ret(*this); operator++(); return ret; } /** post-increment */ RestrictedNeighborhoodCirculator & operator--() { return operator+=(-1); } /** post-decrement */ RestrictedNeighborhoodCirculator operator--(int) { RestrictedNeighborhoodCirculator ret(*this); operator--(); return ret; } /** add-assignment */ RestrictedNeighborhoodCirculator & operator+=(difference_type d) { current_ = static_cast((current_ + count_ + d) % count_); BaseType::turnTo(NEIGHBORCODE::nearBorderDirections(whichBorder_, current_)); return *this; } /** subtract-assignment */ RestrictedNeighborhoodCirculator & operator-=(difference_type d) { return operator+=(-d); } /** addition */ RestrictedNeighborhoodCirculator operator+(difference_type d) const { RestrictedNeighborhoodCirculator result(*this); result+= d; return result; } /** subtraction */ RestrictedNeighborhoodCirculator operator-(difference_type d) const { RestrictedNeighborhoodCirculator result(*this); result-= d; return result; } /** equality */ bool operator==(RestrictedNeighborhoodCirculator const & rhs) const { return current_ == rhs.current_; } /** inequality */ bool operator!=(RestrictedNeighborhoodCirculator const & rhs) const { return current_ != rhs.current_; } /** subtraction */ difference_type operator-(RestrictedNeighborhoodCirculator const & rhs) const { return (current_ - rhs.current_) % count_; } /** dereference */ reference operator*() const { return BaseType::operator*(); } /** member access */ pointer operator->() const { return BaseType::operator->(); } /** Get the base iterator for the current neighbor. */ base_type const & base() const { return BaseType::base(); } /** Get the base iterator for the center of the circulator. */ base_type center() const { return BaseType::center(); } /** Get the current direction. */ Direction direction() const { return BaseType::direction(); } /** Get the current direction bit. */ unsigned int directionBit() const { return BaseType::directionBit(); } /** Get the difference vector (Diff2D) from the center to the current neighbor. */ Diff2D const & diff() const { return BaseType::diff(); } /** Is the current neighbor a diagonal neighbor? */ bool isDiagonal() const { return BaseType::isDiagonal(); } private: AtImageBorder whichBorder_; signed char count_, current_; }; //@} } // namespace vigra #endif /* VIGRA_PIXELNEIGHBORHOOD_HXX */ gamera-3.3.3/include/vigra/polynomial.hxx0000644000076500000000000010540511261456425017424 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_POLYNOMIAL_HXX #define VIGRA_POLYNOMIAL_HXX #include #include #include #include #include "error.hxx" #include "mathutil.hxx" #include "numerictraits.hxx" #include "array_vector.hxx" namespace vigra { template class Polynomial; template class StaticPolynomial; /*****************************************************************/ /* */ /* PolynomialView */ /* */ /*****************************************************************/ /** Polynomial interface for an externally managed array. The coefficient type T can be either a scalar or complex (compatible to std::complex) type. \see vigra::Polynomial, vigra::StaticPolynomial, polynomialRoots() \#include \<vigra/polynomial.hxx\>
Namespace: vigra \ingroup Polynomials */ template class PolynomialView { public: /** Coefficient type of the polynomial */ typedef T value_type; /** Promote type of value_type used for polynomial calculations */ typedef typename NumericTraits::RealPromote RealPromote; /** Scalar type associated with RealPromote */ typedef typename NumericTraits::ValueType Real; /** Complex type associated with RealPromote */ typedef typename NumericTraits::ComplexPromote Complex; /** Iterator for the coefficient sequence */ typedef T * iterator; /** Const iterator for the coefficient sequence */ typedef T const * const_iterator; typedef Polynomial RealPolynomial; typedef Polynomial ComplexPolynomial; /** Construct from a coefficient array of given order. The externally managed array must have length order+1 and is interpreted as representing the polynomial: \code coeffs[0] + x * coeffs[1] + x * x * coeffs[2] + ... \endcode The coefficients are not copied, we only store a pointer to the array.epsilon (default: 1.0e-14) determines the precision of subsequent algorithms (especially root finding) performed on the polynomial. */ PolynomialView(T * coeffs, unsigned int order, double epsilon = 1.0e-14) : coeffs_(coeffs), order_(order), epsilon_(epsilon) {} /// Access the coefficient of x^i T & operator[](unsigned int i) { return coeffs_[i]; } /// Access the coefficient of x^i T const & operator[](unsigned int i) const { return coeffs_[i]; } /** Evaluate the polynomial at the point v Multiplication must be defined between the types V and PromoteTraits::Promote. If both V and V are scalar, the result will be a scalar, otherwise it will be complex. */ template typename PromoteTraits::Promote operator()(V v) const; /** Differentiate the polynomial n times. */ void differentiate(unsigned int n = 1); /** Deflate the polynomial at the root r with the given multiplicity. The behavior of this function is undefined if r is not a root with at least the given multiplicity. This function calls forwardBackwardDeflate(). */ void deflate(T const & r, unsigned int multiplicity = 1); /** Forward-deflate the polynomial at the root r. The behavior of this function is undefined if r is not a root. Forward deflation is best if r is the biggest root (by magnitude). */ void forwardDeflate(T const & v); /** Forward/backward eflate the polynomial at the root r. The behavior of this function is undefined if r is not a root. Combined forward/backward deflation is best if r is an ontermediate root or we don't know r's relation to the other roots of the polynomial. */ void forwardBackwardDeflate(T v); /** Backward-deflate the polynomial at the root r. The behavior of this function is undefined if r is not a root. Backward deflation is best if r is the snallest root (by magnitude). */ void backwardDeflate(T v); /** Deflate the polynomial with the complex conjugate roots r and conj(r). The behavior of this function is undefined if these are not roots. */ void deflateConjugatePair(Complex const & v); /** Adjust the polynomial's order if the highest coefficients are near zero. The order is reduced as long as the absolute value does not exceed the given \a epsilon. */ void minimizeOrder(double epsilon = 0.0); /** Normalize the polynomial, i.e. dived by the highest coefficient. */ void normalize(); void balance(); /** Get iterator for the coefficient sequence. */ iterator begin() { return coeffs_; } /** Get end iterator for the coefficient sequence. */ iterator end() { return begin() + size(); } /** Get const_iterator for the coefficient sequence. */ const_iterator begin() const { return coeffs_; } /** Get end const_iterator for the coefficient sequence. */ const_iterator end() const { return begin() + size(); } /** Get length of the coefficient sequence (order() + 1). */ unsigned int size() const { return order_ + 1; } /** Get order of the polynomial. */ unsigned int order() const { return order_; } /** Get requested precision for polynomial algorithms (especially root finding). */ double epsilon() const { return epsilon_; } /** Set requested precision for polynomial algorithms (especially root finding). */ void setEpsilon(double eps) { epsilon_ = eps; } protected: PolynomialView(double epsilon = 1e-14) : coeffs_(0), order_(0), epsilon_(epsilon) {} void setCoeffs(T * coeffs, unsigned int order) { coeffs_ = coeffs; order_ = order; } T * coeffs_; unsigned int order_; double epsilon_; }; template template typename PromoteTraits::Promote PolynomialView::operator()(U v) const { typename PromoteTraits::Promote p(coeffs_[order_]); for(int i = order_ - 1; i >= 0; --i) { p = v * p + coeffs_[i]; } return p; } /* template typename PolynomialView::Complex PolynomialView::operator()(Complex const & v) const { Complex p(coeffs_[order_]); for(int i = order_ - 1; i >= 0; --i) { p = v * p + coeffs_[i]; } return p; } */ template void PolynomialView::differentiate(unsigned int n) { if(n == 0) return; if(order_ == 0) { coeffs_[0] = 0.0; return; } for(unsigned int i = 1; i <= order_; ++i) { coeffs_[i-1] = double(i)*coeffs_[i]; } --order_; if(n > 1) differentiate(n-1); } template void PolynomialView::deflate(T const & v, unsigned int multiplicity) { vigra_precondition(order_ > 0, "PolynomialView::deflate(): cannot deflate 0th order polynomial."); if(v == 0.0) { ++coeffs_; --order_; } else { // we use combined forward/backward deflation because // our initial guess seems to favour convergence to // a root with magnitude near the median among all roots forwardBackwardDeflate(v); } if(multiplicity > 1) deflate(v, multiplicity-1); } template void PolynomialView::forwardDeflate(T const & v) { for(int i = order_-1; i > 0; --i) { coeffs_[i] += v * coeffs_[i+1]; } ++coeffs_; --order_; } template void PolynomialView::forwardBackwardDeflate(T v) { unsigned int order2 = order_ / 2; T tmp = coeffs_[order_]; for(unsigned int i = order_-1; i >= order2; --i) { T tmp1 = coeffs_[i]; coeffs_[i] = tmp; tmp = tmp1 + v * tmp; } v = -1.0 / v; coeffs_[0] *= v; for(unsigned int i = 1; i < order2; ++i) { coeffs_[i] = v * (coeffs_[i] - coeffs_[i-1]); } --order_; } template void PolynomialView::backwardDeflate(T v) { v = -1.0 / v; coeffs_[0] *= v; for(unsigned int i = 1; i < order_; ++i) { coeffs_[i] = v * (coeffs_[i] - coeffs_[i-1]); } --order_; } template void PolynomialView::deflateConjugatePair(Complex const & v) { vigra_precondition(order_ > 1, "PolynomialView::deflateConjugatePair(): cannot deflate 2 roots " "from 1st order polynomial."); Real a = 2.0*v.real(); Real b = -sq(v.real()) - sq(v.imag()); coeffs_[order_-1] += a * coeffs_[order_]; for(int i = order_-2; i > 1; --i) { coeffs_[i] += a * coeffs_[i+1] + b*coeffs_[i+2]; } coeffs_ += 2; order_ -= 2; } template void PolynomialView::minimizeOrder(double epsilon) { while(std::abs(coeffs_[order_]) <= epsilon && order_ > 0) --order_; } template void PolynomialView::normalize() { for(unsigned int i = 0; i void PolynomialView::balance() { Real p0 = abs(coeffs_[0]), po = abs(coeffs_[order_]); Real norm = (p0 > 0.0) ? VIGRA_CSTD::sqrt(p0*po) : po; for(unsigned int i = 0; i<=order_; ++i) coeffs_[i] /= norm; } /*****************************************************************/ /* */ /* Polynomial */ /* */ /*****************************************************************/ /** Polynomial with internally managed array. Most interesting functionality is inherited from \ref vigra::PolynomialView. \see vigra::PolynomialView, vigra::StaticPolynomial, polynomialRoots() \#include \<vigra/polynomial.hxx\>
Namespace: vigra \ingroup Polynomials */ template class Polynomial : public PolynomialView { typedef PolynomialView BaseType; public: typedef typename BaseType::Real Real; typedef typename BaseType::Complex Complex; typedef Polynomial RealPolynomial; typedef Polynomial ComplexPolynomial; typedef T value_type; typedef T * iterator; typedef T const * const_iterator; /** Construct polynomial with given order and all coefficients set to zero (they can be set later using operator[] or the iterators). epsilon (default: 1.0e-14) determines the precision of subsequent algorithms (especially root finding) performed on the polynomial. */ Polynomial(unsigned int order = 0, double epsilon = 1.0e-14) : BaseType(epsilon), polynomial_(order + 1, T()) { this->setCoeffs(&polynomial_[0], order); } /** Copy constructor */ Polynomial(Polynomial const & p) : BaseType(p.epsilon()), polynomial_(p.begin(), p.end()) { this->setCoeffs(&polynomial_[0], p.order()); } /** Construct polynomial by copying the given coefficient sequence. */ template Polynomial(ITER i, unsigned int order) : BaseType(), polynomial_(i, i + order + 1) { this->setCoeffs(&polynomial_[0], order); } /** Construct polynomial by copying the given coefficient sequence. Set epsilon (default: 1.0e-14) as the precision of subsequent algorithms (especially root finding) performed on the polynomial. */ template Polynomial(ITER i, unsigned int order, double epsilon) : BaseType(epsilon), polynomial_(i, i + order + 1) { this->setCoeffs(&polynomial_[0], order); } /** Assigment */ Polynomial & operator=(Polynomial const & p) { if(this == &p) return *this; ArrayVector tmp(p.begin(), p.end()); polynomial_.swap(tmp); this->setCoeffs(&polynomial_[0], p.order()); this->epsilon_ = p.epsilon_; return *this; } /** Construct new polynomial representing the derivative of this polynomial. */ Polynomial getDerivative(unsigned int n = 1) const { Polynomial res(*this); res.differentiate(n); return res; } /** Construct new polynomial representing this polynomial after deflation at the real root r. */ Polynomial getDeflated(Real r) const { Polynomial res(*this); res.deflate(r); return res; } /** Construct new polynomial representing this polynomial after deflation at the complex root r. The resulting polynomial will have complex coefficients, even if this polynomial had real ones. */ Polynomial getDeflated(Complex const & r) const { Polynomial res(this->begin(), this->order(), this->epsilon()); res.deflate(r); return res; } protected: ArrayVector polynomial_; }; /*****************************************************************/ /* */ /* StaticPolynomial */ /* */ /*****************************************************************/ /** Polynomial with internally managed array of static length. Most interesting functionality is inherited from \ref vigra::PolynomialView. This class differs from \ref vigra::Polynomial in that it allocates its memory statically which is much faster. Therefore, StaticPolynomial can only represent polynomials up to the given MAXORDER. \see vigra::PolynomialView, vigra::Polynomial, polynomialRoots() \#include \<vigra/polynomial.hxx\>
Namespace: vigra \ingroup Polynomials */ template class StaticPolynomial : public PolynomialView { typedef PolynomialView BaseType; public: typedef typename BaseType::Real Real; typedef typename BaseType::Complex Complex; typedef StaticPolynomial RealPolynomial; typedef StaticPolynomial ComplexPolynomial; typedef T value_type; typedef T * iterator; typedef T const * const_iterator; /** Construct polynomial with given order <= MAXORDER and all coefficients set to zero (they can be set later using operator[] or the iterators). epsilon (default: 1.0e-14) determines the precision of subsequent algorithms (especially root finding) performed on the polynomial. */ StaticPolynomial(unsigned int order = 0, double epsilon = 1.0e-14) : BaseType(epsilon) { vigra_precondition(order <= MAXORDER, "StaticPolynomial(): order exceeds MAXORDER."); std::fill_n(polynomial_, order+1, T()); this->setCoeffs(polynomial_, order); } /** Copy constructor */ StaticPolynomial(StaticPolynomial const & p) : BaseType(p.epsilon()) { std::copy(p.begin(), p.end(), polynomial_); this->setCoeffs(polynomial_, p.order()); } /** Construct polynomial by copying the given coefficient sequence. order <= MAXORDER is required. */ template StaticPolynomial(ITER i, unsigned int order) : BaseType() { vigra_precondition(order <= MAXORDER, "StaticPolynomial(): order exceeds MAXORDER."); std::copy(i, i + order + 1, polynomial_); this->setCoeffs(polynomial_, order); } /** Construct polynomial by copying the given coefficient sequence. order <= MAXORDER is required. Set epsilon (default: 1.0e-14) as the precision of subsequent algorithms (especially root finding) performed on the polynomial. */ template StaticPolynomial(ITER i, unsigned int order, double epsilon) : BaseType(epsilon) { vigra_precondition(order <= MAXORDER, "StaticPolynomial(): order exceeds MAXORDER."); std::copy(i, i + order + 1, polynomial_); this->setCoeffs(polynomial_, order); } /** Assigment. */ StaticPolynomial & operator=(StaticPolynomial const & p) { if(this == &p) return *this; std::copy(p.begin(), p.end(), polynomial_); this->setCoeffs(polynomial_, p.order()); this->epsilon_ = p.epsilon_; return *this; } /** Construct new polynomial representing the derivative of this polynomial. */ StaticPolynomial getDerivative(unsigned int n = 1) const { StaticPolynomial res(*this); res.differentiate(n); return res; } /** Construct new polynomial representing this polynomial after deflation at the real root r. */ StaticPolynomial getDeflated(Real r) const { StaticPolynomial res(*this); res.deflate(r); return res; } /** Construct new polynomial representing this polynomial after deflation at the complex root r. The resulting polynomial will have complex coefficients, even if this polynomial had real ones. */ StaticPolynomial getDeflated(Complex const & r) const { StaticPolynomial res(this->begin(), this->order(), this->epsilon()); res.deflate(r); return res; } void setOrder(unsigned int order) { vigra_precondition(order <= MAXORDER, "taticPolynomial::setOrder(): order exceeds MAXORDER."); this->order_ = order; } protected: T polynomial_[MAXORDER+1]; }; /************************************************************/ namespace detail { // replacement for complex division (some compilers have numerically // less stable implementations); code from python complexobject.c template std::complex complexDiv(std::complex const & a, std::complex const & b) { const double abs_breal = b.real() < 0 ? -b.real() : b.real(); const double abs_bimag = b.imag() < 0 ? -b.imag() : b.imag(); if (abs_breal >= abs_bimag) { /* divide tops and bottom by b.real() */ if (abs_breal == 0.0) { return std::complex(a.real() / abs_breal, a.imag() / abs_breal); } else { const double ratio = b.imag() / b.real(); const double denom = b.real() + b.imag() * ratio; return std::complex((a.real() + a.imag() * ratio) / denom, (a.imag() - a.real() * ratio) / denom); } } else { /* divide tops and bottom by b.imag() */ const double ratio = b.real() / b.imag(); const double denom = b.real() * ratio + b.imag(); return std::complex((a.real() * ratio + a.imag()) / denom, (a.imag() * ratio - a.real()) / denom); } } template std::complex deleteBelowEpsilon(std::complex const & x, double eps) { return std::abs(x.imag()) <= 2.0*eps*std::abs(x.real()) ? std::complex(x.real()) : std::abs(x.real()) <= 2.0*eps*std::abs(x.imag()) ? std::complex(NumericTraits::zero(), x.imag()) : x; } template typename POLYNOMIAL::value_type laguerreStartingGuess(POLYNOMIAL const & p) { double N = p.order(); typename POLYNOMIAL::value_type centroid = -p[p.order()-1] / N / p[p.order()]; double dist = VIGRA_CSTD::pow(std::abs(p(centroid) / p[p.order()]), 1.0 / N); return centroid + dist; } template int laguerre1Root(POLYNOMIAL const & p, Complex & x, unsigned int multiplicity) { typedef typename NumericTraits::ValueType Real; static double frac[] = {0.0, 0.5, 0.25, 0.75, 0.13, 0.38, 0.62, 0.88, 1.0}; int maxiter = 80, count; double N = p.order(); double eps = p.epsilon(), eps2 = VIGRA_CSTD::sqrt(eps); if(multiplicity == 0) x = laguerreStartingGuess(p); bool mayTryDerivative = true; // try derivative for multiple roots for(count = 0; count < maxiter; ++count) { // Horner's algorithm to calculate values of polynomial and its // first two derivatives and estimate error for current x Complex p0(p[p.order()]); Complex p1(0.0); Complex p2(0.0); Real ax = std::abs(x); Real err = std::abs(p0); for(int i = p.order()-1; i >= 0; --i) { p2 = p2 * x + p1; p1 = p1 * x + p0; p0 = p0 * x + p[i]; err = err * ax + std::abs(p0); } p2 *= 2.0; err *= eps; Real ap0 = std::abs(p0); if(ap0 <= err) { break; // converged } Complex g = complexDiv(p1, p0); Complex g2 = g * g; Complex h = g2 - complexDiv(p2, p0); // estimate root multiplicity according to Tien Chen if(g2 != 0.0) { multiplicity = (unsigned int)VIGRA_CSTD::floor(N / (std::abs(N * complexDiv(h, g2) - 1.0) + 1.0) + 0.5); if(multiplicity < 1) multiplicity = 1; } // improve accuracy of multiple roots on the derivative, as suggested by C. Bond // (do this only if we are already near the root, otherwise we may converge to // a different root of the derivative polynomial) if(mayTryDerivative && multiplicity > 1 && ap0 < eps2) { Complex x1 = x; int derivativeMultiplicity = laguerre1Root(p.getDerivative(), x1, multiplicity-1); if(derivativeMultiplicity && std::abs(p(x1)) < std::abs(p(x))) { // successful search on derivative x = x1; return derivativeMultiplicity + 1; } else { // unsuccessful search on derivative => don't do it again mayTryDerivative = false; } } Complex sq = VIGRA_CSTD::sqrt((N - 1.0) * (N * h - g2)); Complex gp = g + sq; Complex gm = g - sq; if(std::abs(gp) < std::abs(gm)) gp = gm; Complex dx; if(gp != 0.0) { dx = complexDiv(Complex(N) , gp); } else { // re-initialisation trick due to Numerical Recipes dx = (1.0 + ax) * Complex(VIGRA_CSTD::cos(double(count)), VIGRA_CSTD::sin(double(count))); } Complex x1 = x - dx; if(x1 - x == 0.0) { break; // converged } if((count + 1) % 10) x = x1; else // cycle breaking trick according to Numerical Recipes x = x - frac[(count+1)/10] * dx; } return count < maxiter ? multiplicity : 0; } template struct PolynomialRootCompare { Real epsilon; PolynomialRootCompare(Real eps) : epsilon(eps) {} template bool operator()(T const & l, T const & r) { return closeAtTolerance(l.real(), r.real(), epsilon) ? l.imag() < r.imag() : l.real() < r.real(); } }; } // namespace detail /** \addtogroup Polynomials Polynomials and root determination Classes to represent polynomials and functions to find polynomial roots. */ //@{ /*****************************************************************/ /* */ /* polynomialRoots */ /* */ /*****************************************************************/ /** Determine the roots of the polynomial poriginal. The roots are appended to the vector roots, with optional root polishing as specified by polishRoots (default: do polishing). The function uses an improved version of Laguerre's algorithm. The improvements are as follows:
  • It uses a clever initial guess for the iteration, according to a proposal by Tien Chen
  • It estimates each root's multiplicity, again according to Tien Chen, and reduces multiplicity by switching to the polynomial's derivative (which has the same root, with multiplicity reduced by one), as proposed by C. Bond.
The algorithm has been successfully used for polynomials up to order 80. The function stops and returns false if an iteration fails to converge within 80 steps. The type POLYNOMIAL must be compatible to \ref vigra::PolynomialView, VECTOR must be compatible to std::vector with a value_type compatible to the type POLYNOMIAL::Complex. Declaration: pass arguments explicitly: \code namespace vigra { template bool polynomialRoots(POLYNOMIAL const & poriginal, VECTOR & roots, bool polishRoots = true); } \endcode Usage: \#include \<vigra/polynomial.hxx\>
Namespace: vigra \code // encode the polynomial x^4 - 1 Polynomial poly(4); poly[0] = -1.0; poly[4] = 1.0; ArrayVector > roots; polynomialRoots(poly, roots); \endcode \see polynomialRootsEigenvalueMethod() */ template bool polynomialRoots(POLYNOMIAL const & poriginal, VECTOR & roots, bool polishRoots) { typedef typename POLYNOMIAL::value_type T; typedef typename POLYNOMIAL::Real Real; typedef typename POLYNOMIAL::Complex Complex; typedef typename POLYNOMIAL::ComplexPolynomial WorkPolynomial; double eps = poriginal.epsilon(); WorkPolynomial p(poriginal.begin(), poriginal.order(), eps); p.minimizeOrder(); if(p.order() == 0) return true; Complex x = detail::laguerreStartingGuess(p); unsigned int multiplicity = 1; bool triedConjugate = false; // handle the high order cases while(p.order() > 2) { p.balance(); // find root estimate using Laguerre's method on deflated polynomial p; // zero return indicates failure to converge multiplicity = detail::laguerre1Root(p, x, multiplicity); if(multiplicity == 0) return false; // polish root on original polynomial poriginal; // zero return indicates failure to converge if(polishRoots && !detail::laguerre1Root(poriginal, x, multiplicity)) return false; x = detail::deleteBelowEpsilon(x, eps); roots.push_back(x); p.deflate(x); // determine the next starting guess if(multiplicity > 1) { // probably multiple root => keep current root as starting guess --multiplicity; triedConjugate = false; } else { // need a new starting guess if(x.imag() != 0.0 && !triedConjugate) { // if the root is complex and we don't already have // the conjugate root => try the conjugate as starting guess triedConjugate = true; x = conj(x); } else { // otherwise generate new starting guess triedConjugate = false; x = detail::laguerreStartingGuess(p); } } } // handle the low order cases if(p.order() == 2) { Complex a = p[2]; Complex b = p[1]; Complex c = p[0]; Complex b2 = std::sqrt(b*b - 4.0*a*c); Complex q; if((conj(b)*b2).real() >= 0.0) q = -0.5 * (b + b2); else q = -0.5 * (b - b2); x = detail::complexDiv(q, a); if(polishRoots) detail::laguerre1Root(poriginal, x, 1); roots.push_back(detail::deleteBelowEpsilon(x, eps)); x = detail::complexDiv(c, q); if(polishRoots) detail::laguerre1Root(poriginal, x, 1); roots.push_back(detail::deleteBelowEpsilon(x, eps)); } else if(p.order() == 1) { x = detail::complexDiv(-p[0], p[1]); if(polishRoots) detail::laguerre1Root(poriginal, x, 1); roots.push_back(detail::deleteBelowEpsilon(x, eps)); } std::sort(roots.begin(), roots.end(), detail::PolynomialRootCompare(eps)); return true; } template inline bool polynomialRoots(POLYNOMIAL const & poriginal, VECTOR & roots) { return polynomialRoots(poriginal, roots, true); } /** Determine the real roots of the polynomial p. This function simply calls \ref polynomialRoots() and than throws away all complex roots. Accordingly, VECTOR must be compatible to std::vector with a value_type compatible to the type POLYNOMIAL::Real. Declaration: pass arguments explicitly: \code namespace vigra { template bool polynomialRealRoots(POLYNOMIAL const & p, VECTOR & roots, bool polishRoots = true); } \endcode Usage: \#include \<vigra/polynomial.hxx\>
Namespace: vigra \code // encode the polynomial x^4 - 1 Polynomial poly(4); poly[0] = -1.0; poly[4] = 1.0; ArrayVector roots; polynomialRealRoots(poly, roots); \endcode \see polynomialRealRootsEigenvalueMethod() */ template bool polynomialRealRoots(POLYNOMIAL const & p, VECTOR & roots, bool polishRoots) { typedef typename NumericTraits::ComplexPromote Complex; ArrayVector croots; if(!polynomialRoots(p, croots, polishRoots)) return false; for(unsigned int i = 0; i < croots.size(); ++i) if(croots[i].imag() == 0.0) roots.push_back(croots[i].real()); return true; } template inline bool polynomialRealRoots(POLYNOMIAL const & poriginal, VECTOR & roots) { return polynomialRealRoots(poriginal, roots, true); } //@} } // namespace vigra namespace std { template ostream & operator<<(ostream & o, vigra::PolynomialView const & p) { for(unsigned int k=0; k < p.order(); ++k) o << p[k] << " "; o << p[p.order()]; return o; } } // namespace std #endif // VIGRA_POLYNOMIAL_HXX gamera-3.3.3/include/vigra/promote_traits.hxx0000644000076500000000000015062211261456425020315 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2008 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_PROMOTETRAITS_HXX #define VIGRA_PROMOTETRAITS_HXX // this file was autogenerated from promote_traits.hxx.py - DO NOT EDIT template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #ifdef LLONG_MAX template <> struct PromoteTraits : public detail::PromoteType { typedef detail::PromoteType::Promote Promote; using detail::PromoteType::toPromote; }; #endif // LLONG_MAX #endif // VIGRA_PROMOTETRAITS_HXX gamera-3.3.3/include/vigra/random.hxx0000644000076500000000000006337311261456425016530 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2008 by Ullrich Koethe */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_RANDOM_HXX #define VIGRA_RANDOM_HXX #include "mathutil.hxx" #include "functortraits.hxx" #include namespace vigra { enum RandomSeedTag { RandomSeed }; namespace detail { enum RandomEngineTag { TT800, MT19937 }; template struct RandomState; template void seed(UInt32 theSeed, RandomState & engine) { engine.state_[0] = theSeed; for(UInt32 i=1; i::N; ++i) { engine.state_[i] = 1812433253U * (engine.state_[i-1] ^ (engine.state_[i-1] >> 30)) + i; } } template void seed(Iterator init, UInt32 key_length, RandomState & engine) { const UInt32 N = RandomState::N; int k = (int)std::max(N, key_length); UInt32 i = 1, j = 0; Iterator data = init; for (; k; --k) { engine.state_[i] = (engine.state_[i] ^ ((engine.state_[i-1] ^ (engine.state_[i-1] >> 30)) * 1664525U)) + *data + j; /* non linear */ ++i; ++j; ++data; if (i >= N) { engine.state_[0] = engine.state_[N-1]; i=1; } if (j>=key_length) { j=0; data = init; } } for (k=N-1; k; --k) { engine.state_[i] = (engine.state_[i] ^ ((engine.state_[i-1] ^ (engine.state_[i-1] >> 30)) * 1566083941U)) - i; /* non linear */ ++i; if (i>=N) { engine.state_[0] = engine.state_[N-1]; i=1; } } engine.state_[0] = 0x80000000U; /* MSB is 1; assuring non-zero initial array */ } template void seed(RandomSeedTag, RandomState & engine) { UInt32 init[2] = { (UInt32)time(0), (UInt32)clock() }; seed(init, 2, engine); } /* Tempered twister TT800 by M. Matsumoto */ template<> struct RandomState { static const UInt32 N = 25, M = 7; mutable UInt32 state_[N]; mutable UInt32 current_; RandomState() : current_(0) { UInt32 seeds[N] = { 0x95f24dab, 0x0b685215, 0xe76ccae7, 0xaf3ec239, 0x715fad23, 0x24a590ad, 0x69e4b5ef, 0xbf456141, 0x96bc1b7b, 0xa7bdf825, 0xc1de75b7, 0x8858a9c9, 0x2da87693, 0xb657f9dd, 0xffdc8a9f, 0x8121da71, 0x8b823ecb, 0x885d05f5, 0x4e20cd47, 0x5a9ad5d9, 0x512c0c03, 0xea857ccd, 0x4cc1d30f, 0x8891a8a1, 0xa6b7aadb }; for(UInt32 i=0; i> 16); } void generateNumbers() const; void seedImpl(RandomSeedTag) { seed(RandomSeed, *this); } void seedImpl(UInt32 theSeed) { seed(theSeed, *this); } template void seedImpl(Iterator init, UInt32 length) { seed(init, length, *this); } }; void RandomState::generateNumbers() const { UInt32 mag01[2]= { 0x0, 0x8ebfd028 }; for(UInt32 i=0; i> 1) ^ mag01[state_[i] % 2]; } for (UInt32 i=N-M; i> 1) ^ mag01[state_[i] % 2]; } current_ = 0; } /* Mersenne twister MT19937 by M. Matsumoto */ template<> struct RandomState { static const UInt32 N = 624, M = 397; mutable UInt32 state_[N]; mutable UInt32 current_; RandomState() : current_(0) { seed(19650218U, *this); } protected: UInt32 get() const { if(current_ == N) generateNumbers(); UInt32 x = state_[current_++]; x ^= (x >> 11); x ^= (x << 7) & 0x9D2C5680U; x ^= (x << 15) & 0xEFC60000U; return x ^ (x >> 18); } void generateNumbers() const; static UInt32 twiddle(UInt32 u, UInt32 v) { return (((u & 0x80000000U) | (v & 0x7FFFFFFFU)) >> 1) ^ ((v & 1U) ? 0x9908B0DFU : 0x0U); } void seedImpl(RandomSeedTag) { seed(RandomSeed, *this); generateNumbers(); } void seedImpl(UInt32 theSeed) { seed(theSeed, *this); generateNumbers(); } template void seedImpl(Iterator init, UInt32 length) { seed(19650218U, *this); seed(init, length, *this); generateNumbers(); } }; void RandomState::generateNumbers() const { for (int i = 0; i < (N - M); ++i) { state_[i] = state_[i + M] ^ twiddle(state_[i], state_[i + 1]); } for (int i = N - M; i < (N - 1); ++i) { state_[i] = state_[i + M - N] ^ twiddle(state_[i], state_[i + 1]); } state_[N - 1] = state_[M - 1] ^ twiddle(state_[N - 1], state_[0]); current_ = 0; } } // namespace detail /** \addtogroup RandomNumberGeneration Random Number Generation High-quality random number generators and related functors. */ //@{ /** Generic random number generator. The actual generator is passed in the template argument Engine. Two generators are currently available:
  • RandomMT19937: The state-of-the-art Mersenne Twister with a state length of 219937 and very high statistical quality.
  • RandomTT800: (default) The Tempered Twister, a simpler predecessor of the Mersenne Twister with period length 2800.
Both generators have been designed by Makoto Matsumoto. Traits defined: FunctorTraits >::isInitializer is true (VigraTrueType). */ template > class RandomNumberGenerator : public Engine { mutable double normalCached_; mutable bool normalCachedValid_; public: /** Create a new random generator object with standard seed. Due to standard seeding, the random numbers generated will always be the same. This is useful for debugging. */ RandomNumberGenerator() : normalCached_(0.0), normalCachedValid_(false) {} /** Create a new random generator object with a random seed. The seed is obtained from the machines current clock() and time() values. Usage: \code RandomNumberGenerator<> rnd = RandomNumberGenerator<>(RandomSeed); \endcode */ RandomNumberGenerator(RandomSeedTag) : normalCached_(0.0), normalCachedValid_(false) { this->seedImpl(RandomSeed); } /** Create a new random generator object from the given seed. The same seed will always produce identical random sequences. */ RandomNumberGenerator(UInt32 theSeed) : normalCached_(0.0), normalCachedValid_(false) { this->seedImpl(theSeed); } /** Create a new random generator object from the given seed sequence. Longer seed sequences lead to better initialization in the sense that the generator's state space is covered much better than is possible with 32-bit seeds alone. */ template RandomNumberGenerator(Iterator init, UInt32 length) : normalCached_(0.0), normalCachedValid_(false) { this->seedImpl(init, length); } /** Re-initialize the random generator object with a random seed. The seed is obtained from the machines current clock() and time() values. Usage: \code RandomNumberGenerator<> rnd = ...; ... rnd.seed(RandomSeed); \endcode */ void seed(RandomSeedTag) { this->seedImpl(RandomSeed); normalCachedValid_ = false; } /** Re-initialize the random generator object from the given seed. The same seed will always produce identical random sequences. */ void seed(UInt32 theSeed) { this->seedImpl(theSeed); normalCachedValid_ = false; } /** Re-initialize the random generator object from the given seed sequence. Longer seed sequences lead to better initialization in the sense that the generator's state space is covered much better than is possible with 32-bit seeds alone. */ template void seed(Iterator init, UInt32 length) { this->seedImpl(init, length); normalCachedValid_ = false; } /** Return a uniformly distributed integer random number in [0, 232). That is, 0 <= i < 232. */ UInt32 operator()() const { return this->get(); } /** Return a uniformly distributed integer random number in [0, 232). That is, 0 <= i < 232. */ UInt32 uniformInt() const { return this->get(); } #if 0 // difficult implementation necessary if low bits are not sufficiently random // in [0,beyond) UInt32 uniformInt(UInt32 beyond) const { if(beyond < 2) return 0; UInt32 factor = factorForUniformInt(beyond); UInt32 res = this->get() / factor; // Use rejection method to avoid quantization bias. // On average, we will need two raw random numbers to generate one. while(res >= beyond) res = this->get() / factor; return res; } #endif /* #if 0 */ /** Return a uniformly distributed integer random number in [0, beyond). That is, 0 <= i < beyond. */ UInt32 uniformInt(UInt32 beyond) const { // in [0,beyond) -- simple implementation when low bits are sufficiently random, which is // the case for TT800 and MT19937 if(beyond < 2) return 0; UInt32 remainder = (NumericTraits::max() - beyond + 1) % beyond; UInt32 lastSafeValue = NumericTraits::max() - remainder; UInt32 res = this->get(); // Use rejection method to avoid quantization bias. // We will need two raw random numbers in amortized worst case. while(res > lastSafeValue) res = this->get(); return res % beyond; } /** Return a uniformly distributed double-precision random number in [0.0, 1.0). That is, 0.0 <= i < 1.0. All 53-bit bits of the mantissa are random (two 32-bit integers are used to create this number). */ double uniform53() const { // make full use of the entire 53-bit mantissa of a double, by Isaku Wada return ( (this->get() >> 5) * 67108864.0 + (this->get() >> 6)) * (1.0/9007199254740992.0); } /** Return a uniformly distributed double-precision random number in [0.0, 1.0]. That is, 0.0 <= i <= 1.0. This nuber is computed by uniformInt() / 232, so it has effectively only 32 random bits. */ double uniform() const { return (double)this->get() / 4294967295.0; } /** Return a uniformly distributed double-precision random number in [lower, upper]. That is, lower <= i <= upper. This number is computed from uniform(), so it has effectively only 32 random bits. */ double uniform(double lower, double upper) const { vigra_precondition(lower < upper, "RandomNumberGenerator::uniform(): lower bound must be smaller than upper bound."); return uniform() * (upper-lower) + lower; } /** Return a standard normal variate (Gaussian) random number. Mean is zero, standard deviation is 1.0. It uses the polar form of the Box-Muller transform. */ double normal() const; /** Return a normal variate (Gaussian) random number with the given mean and standard deviation. It uses the polar form of the Box-Muller transform. */ double normal(double mean, double stddev) const { vigra_precondition(stddev > 0.0, "RandomNumberGenerator::normal(): standard deviation must be positive."); return normal()*stddev + mean; } /** Access the global (program-wide) instance of the present random number generator. Normally, you will create a local generator by one of the constructor calls. But sometimes it is useful to have all program parts access the same generator. */ static RandomNumberGenerator & global() { static RandomNumberGenerator generator; return generator; } static UInt32 factorForUniformInt(UInt32 range) { return (range > 2147483648U || range == 0) ? 1 : 2*(2147483648U / ceilPower2(range)); } }; template double RandomNumberGenerator::normal() const { if(normalCachedValid_) { normalCachedValid_ = false; return normalCached_; } else { double x1, x2, w; do { x1 = uniform(-1.0, 1.0); x2 = uniform(-1.0, 1.0); w = x1 * x1 + x2 * x2; } while ( w > 1.0 || w == 0.0); w = std::sqrt( -2.0 * std::log( w ) / w ); normalCached_ = x2 * w; normalCachedValid_ = true; return x1 * w; } } /** Shorthand for the TT800 random number generator class. */ typedef RandomNumberGenerator<> RandomTT800; /** Shorthand for the MT19937 random number generator class. */ typedef RandomNumberGenerator > RandomMT19937; /** Access the global (program-wide) instance of the TT800 random number generator. */ inline RandomTT800 & randomTT800() { return RandomTT800::global(); } /** Access the global (program-wide) instance of the MT19937 random number generator. */ inline RandomMT19937 & randomMT19937() { return RandomMT19937::global(); } template class FunctorTraits > { public: typedef RandomNumberGenerator type; typedef VigraTrueType isInitializer; typedef VigraFalseType isUnaryFunctor; typedef VigraFalseType isBinaryFunctor; typedef VigraFalseType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; /** Functor to create uniformely distributed integer random numbers. This functor encapsulates the appropriate functions of the given random number Engine (usually RandomTT800 or RandomMT19937) in an STL-compatible interface. Traits defined: FunctorTraits >::isInitializer and FunctorTraits >::isUnaryFunctor are true (VigraTrueType). */ template class UniformIntRandomFunctor { UInt32 lower_, difference_, factor_; Engine & generator_; bool useLowBits_; public: typedef UInt32 argument_type; ///< STL required functor argument type typedef UInt32 result_type; ///< STL required functor result type /** Create functor for uniform random integers in the range [0, 232) using the given engine. That is, the generated numbers satisfy 0 <= i < 232. */ explicit UniformIntRandomFunctor(Engine & generator = Engine::global() ) : lower_(0), difference_(0xffffffff), factor_(1), generator_(generator), useLowBits_(true) {} /** Create functor for uniform random integers in the range [lower, upper] using the given engine. That is, the generated numbers satisfy lower <= i <= upper. \a useLowBits should be set to false when the engine generates random numbers whose low bits are significantly less random than the high bits. This does not apply to RandomTT800 and RandomMT19937, but is necessary for simpler linear congruential generators. */ UniformIntRandomFunctor(UInt32 lower, UInt32 upper, Engine & generator = Engine::global(), bool useLowBits = true) : lower_(lower), difference_(upper-lower), factor_(Engine::factorForUniformInt(difference_ + 1)), generator_(generator), useLowBits_(useLowBits) { vigra_precondition(lower < upper, "UniformIntRandomFunctor(): lower bound must be smaller than upper bound."); } /** Return a random number as specified in the constructor. */ UInt32 operator()() const { if(difference_ == 0xffffffff) // lower_ is necessarily 0 return generator_(); else if(useLowBits_) return generator_.uniformInt(difference_+1) + lower_; else { UInt32 res = generator_() / factor_; // Use rejection method to avoid quantization bias. // On average, we will need two raw random numbers to generate one. while(res > difference_) res = generator_() / factor_; return res + lower_; } } /** Return a uniformly distributed integer random number in the range [0, beyond). That is, 0 <= i < beyond. This is a required interface for std::random_shuffle. It ignores the limits specified in the constructor and the flag useLowBits. */ UInt32 operator()(UInt32 beyond) const { if(beyond < 2) return 0; return generator_.uniformInt(beyond); } }; template class FunctorTraits > { public: typedef UniformIntRandomFunctor type; typedef VigraTrueType isInitializer; typedef VigraTrueType isUnaryFunctor; typedef VigraFalseType isBinaryFunctor; typedef VigraFalseType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; /** Functor to create uniformely distributed double-precision random numbers. This functor encapsulates the function uniform() of the given random number Engine (usually RandomTT800 or RandomMT19937) in an STL-compatible interface. Traits defined: FunctorTraits >::isInitializer is true (VigraTrueType). */ template class UniformRandomFunctor { double offset_, scale_; Engine & generator_; public: typedef double result_type; ///< STL required functor result type /** Create functor for uniform random double-precision numbers in the range [0.0, 1.0] using the given engine. That is, the generated numbers satisfy 0.0 <= i <= 1.0. */ UniformRandomFunctor(Engine & generator = Engine::global()) : offset_(0.0), scale_(1.0), generator_(generator) {} /** Create functor for uniform random double-precision numbers in the range [lower, upper] using the given engine. That is, the generated numbers satisfy lower <= i <= upper. */ UniformRandomFunctor(double lower, double upper, Engine & generator = Engine::global()) : offset_(lower), scale_(upper - lower), generator_(generator) { vigra_precondition(lower < upper, "UniformRandomFunctor(): lower bound must be smaller than upper bound."); } /** Return a random number as specified in the constructor. */ double operator()() const { return generator_.uniform() * scale_ + offset_; } }; template class FunctorTraits > { public: typedef UniformRandomFunctor type; typedef VigraTrueType isInitializer; typedef VigraFalseType isUnaryFunctor; typedef VigraFalseType isBinaryFunctor; typedef VigraFalseType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; /** Functor to create normal variate random numbers. This functor encapsulates the function normal() of the given random number Engine (usually RandomTT800 or RandomMT19937) in an STL-compatible interface. Traits defined: FunctorTraits >::isInitializer is true (VigraTrueType). */ template struct NormalRandomFunctor { double mean_, stddev_; Engine & generator_; public: typedef double result_type; ///< STL required functor result type /** Create functor for standard normal random numbers using the given engine. That is, mean is 0.0 and standard deviation is 1.0. */ NormalRandomFunctor(Engine & generator = Engine::global()) : mean_(0.0), stddev_(1.0), generator_(generator) {} /** Create functor for normal random numbers with goven mean and standard deviation using the given engine. */ NormalRandomFunctor(double mean, double stddev, Engine & generator = Engine::global()) : mean_(mean), stddev_(stddev), generator_(generator) { vigra_precondition(stddev > 0.0, "NormalRandomFunctor(): standard deviation must be positive."); } /** Return a random number as specified in the constructor. */ double operator()() const { return generator_.normal() * stddev_ + mean_; } }; template class FunctorTraits > { public: typedef UniformRandomFunctor type; typedef VigraTrueType isInitializer; typedef VigraFalseType isUnaryFunctor; typedef VigraFalseType isBinaryFunctor; typedef VigraFalseType isTernaryFunctor; typedef VigraFalseType isUnaryAnalyser; typedef VigraFalseType isBinaryAnalyser; typedef VigraFalseType isTernaryAnalyser; }; //@} } // namespace vigra #endif // VIGRA_RANDOM_HXX gamera-3.3.3/include/vigra/rational.hxx0000644000076500000000000011325411261456425017053 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* It was adapted from the file boost/rational.hpp of the */ /* boost library. */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ // this file is based on work by Paul Moore: // // (C) Copyright Paul Moore 1999. Permission to copy, use, modify, sell and // distribute this software is granted provided this copyright notice appears // in all copies. This software is provided "as is" without express or // implied warranty, and with no claim as to its suitability for any purpose. // // See http://www.boost.org/libs/rational for documentation. #ifndef VIGRA_RATIONAL_HPP #define VIGRA_RATIONAL_HPP #include #include #include #include "config.hxx" #include "mathutil.hxx" #include "numerictraits.hxx" #include "metaprogramming.hxx" namespace vigra { /** \addtogroup MathFunctions Mathematical Functions */ //@{ /********************************************************/ /* */ /* gcd */ /* */ /********************************************************/ /*! Calculate the greatest common divisor. This function works for arbitrary integer types, including user-defined (e.g. infinite precision) ones. \#include \<vigra/rational.hxx\>
Namespace: vigra */ template IntType gcd(IntType n, IntType m) { // Avoid repeated construction IntType zero(0); // This is abs() - given the existence of broken compilers with Koenig // lookup issues and other problems, I code this explicitly. (Remember, // IntType may be a user-defined type). if (n < zero) n = -n; if (m < zero) m = -m; // As n and m are now positive, we can be sure that %= returns a // positive value (the standard guarantees this for built-in types, // and we require it of user-defined types). for(;;) { if(m == zero) return n; n %= m; if(n == zero) return m; m %= n; } } /********************************************************/ /* */ /* lcm */ /* */ /********************************************************/ /*! Calculate the lowest common multiple. This function works for arbitrary integer types, including user-defined (e.g. infinite precision) ones. \#include \<vigra/rational.hxx\>
Namespace: vigra */ template IntType lcm(IntType n, IntType m) { // Avoid repeated construction IntType zero(0); if (n == zero || m == zero) return zero; n /= gcd(n, m); n *= m; if (n < zero) n = -n; return n; } //@} class bad_rational : public std::domain_error { public: explicit bad_rational() : std::domain_error("bad rational: zero denominator") {} }; template class Rational; template Rational abs(const Rational& r); template Rational pow(const Rational& r, int n); template Rational floor(const Rational& r); template Rational ceil(const Rational& r); /********************************************************/ /* */ /* Rational */ /* */ /********************************************************/ /** Template for rational numbers. This template can make use of arbitrary integer types, including user-defined (e.g. infinite precision) ones. Note, however, that overflow in either the numerator or denominator is not detected during calculations -- the standard behavior of the integer type (e.g. wrap around) applies. The class can represent and handle positive and negative infinity resulting from division by zero. Indeterminate expressions such as 0/0 are signaled by a bad_rational exception which is derived from std::domain_error. Rational implements the required interface of an \ref AlgebraicField and the required \ref RationalTraits "numeric and promotion traits". All arithmetic and comparison operators, as well as the relevant algebraic functions are supported . See also:
  • \ref RationalTraits
  • \ref RationalOperations
\#include \<vigra/rational.hxx\>
Namespace: vigra */ template class Rational { public: /** The type of numerator and denominator */ typedef IntType value_type; /** Determine whether arguments should be passed as IntType or IntType const &. */ typedef typename If::isBuiltinType, IntType, IntType const &>::type param_type; /** Default constructor: creates zero (0/1) */ Rational() : num(0), den(1) {} /** Copy constructor */ template Rational(Rational const & r) : num(r.numerator()), den(r.denominator()) {} /** Integer constructor: creates n/1 */ Rational(param_type n) : num(n), den(IntType(1)) {} /** Ratio constructor: creates n/d. The ratio will be normalized unless doNormalize = false. Since the internal representation is assumed to be normalized, doNormalize = false must only be used as an optimization if n and d are known to be already normalized (i.e. have 1 as their greatest common divisor). */ Rational(param_type n, param_type d, bool doNormalize = true) : num(n), den(d) { if(doNormalize) normalize(); } /** Construct as an approximation of a real number. The maximal allowed relative error is given by epsilon. */ explicit Rational(double v, double epsilon = 1e-4) : num(IntType(v < 0.0 ? v/epsilon - 0.5 : v/epsilon + 0.5)), den(IntType(1.0/epsilon + 0.5)) { normalize(); } // Default copy constructor and assignment are fine /** Assignment from IntType. */ Rational& operator=(param_type n) { return assign(n, 1); } /** Assignment from IntType pair. */ Rational& assign(param_type n, param_type d, bool doNormalize = true); /** Access numerator. */ param_type numerator() const { return num; } /** Access denominator. */ param_type denominator() const { return den; } /** Add-assignment from Rational throws bad_rational if indeterminate expression. */ Rational& operator+= (const Rational& r); /** Subtract-assignment from Rational throws bad_rational if indeterminate expression. */ Rational& operator-= (const Rational& r); /** Multiply-assignment from Rational throws bad_rational if indeterminate expression. */ Rational& operator*= (const Rational& r); /** Divide-assignment from Rational throws bad_rational if indeterminate expression. */ Rational& operator/= (const Rational& r); /** Add-assignment from IntType throws bad_rational if indeterminate expression. */ Rational& operator+= (param_type i); /** Subtract-assignment from IntType throws bad_rational if indeterminate expression. */ Rational& operator-= (param_type i); /** Multiply-assignment from IntType throws bad_rational if indeterminate expression. */ Rational& operator*= (param_type i); /** Divide-assignment from IntType throws bad_rational if indeterminate expression. */ Rational& operator/= (param_type i); /** Pre-increment. */ Rational& operator++(); /** Pre-decrement. */ Rational& operator--(); /** Post-increment. */ Rational operator++(int) { Rational res(*this); operator++(); return res; } /** Post-decrement. */ Rational operator--(int) { Rational res(*this); operator--(); return res; } /** Check for zero by calling !numerator() */ bool operator!() const { return !num; } /** Check whether we have positive infinity. */ bool is_pinf() const { IntType zero(0); return den == zero && num > zero; } /** Check whether we have negative infinity. */ bool is_ninf() const { IntType zero(0); return den == zero && num < zero; } /** Check whether we have positive or negative infinity. */ bool is_inf() const { IntType zero(0); return den == zero && num != zero; } /** Check the sign. Gives 1 if the number is positive, -1 if negative, and 0 otherwise. */ int sign() const { IntType zero(0); return num == zero ? 0 : num < zero ? -1 : 1; } private: // Implementation - numerator and denominator (normalized). // Other possibilities - separate whole-part, or sign, fields? IntType num; IntType den; // Representation note: Fractions are kept in normalized form at all // times. normalized form is defined as gcd(num,den) == 1 and den > 0. // In particular, note that the implementation of abs() below relies // on den always being positive. void normalize(); }; // Assign in place template inline Rational& Rational::assign(param_type n, param_type d, bool doNormalize) { num = n; den = d; if(doNormalize) normalize(); return *this; } // Arithmetic assignment operators template Rational& Rational::operator+= (const Rational& r) { IntType zero(0); // handle the Inf and NaN cases if(den == zero) { if(r.den == zero && sign()*r.sign() < 0) throw bad_rational(); return *this; } if(r.den == zero) { assign(r.num, zero, false); // Inf or -Inf return *this; } // This calculation avoids overflow, and minimises the number of expensive // calculations. Thanks to Nickolay Mladenov for this algorithm. // // Proof: // We have to compute a/b + c/d, where gcd(a,b)=1 and gcd(b,c)=1. // Let g = gcd(b,d), and b = b1*g, d=d1*g. Then gcd(b1,d1)=1 // // The result is (a*d1 + c*b1) / (b1*d1*g). // Now we have to normalize this ratio. // Let's assume h | gcd((a*d1 + c*b1), (b1*d1*g)), and h > 1 // If h | b1 then gcd(h,d1)=1 and hence h|(a*d1+c*b1) => h|a. // But since gcd(a,b1)=1 we have h=1. // Similarly h|d1 leads to h=1. // So we have that h | gcd((a*d1 + c*b1) , (b1*d1*g)) => h|g // Finally we have gcd((a*d1 + c*b1), (b1*d1*g)) = gcd((a*d1 + c*b1), g) // Which proves that instead of normalizing the result, it is better to // divide num and den by gcd((a*d1 + c*b1), g) // Protect against self-modification IntType r_num = r.num; IntType r_den = r.den; IntType g = gcd(den, r_den); den /= g; // = b1 from the calculations above num = num * (r_den / g) + r_num * den; g = gcd(num, g); num /= g; den *= r_den/g; return *this; } template Rational& Rational::operator-= (const Rational& r) { IntType zero(0); // handle the Inf and NaN cases if(den == zero) { if(r.den == zero && sign()*r.sign() > 0) throw bad_rational(); return *this; } if(r.den == zero) { assign(-r.num, zero, false); // Inf or -Inf return *this; } // Protect against self-modification IntType r_num = r.num; IntType r_den = r.den; // This calculation avoids overflow, and minimises the number of expensive // calculations. It corresponds exactly to the += case above IntType g = gcd(den, r_den); den /= g; num = num * (r_den / g) - r_num * den; g = gcd(num, g); num /= g; den *= r_den/g; return *this; } template Rational& Rational::operator*= (const Rational& r) { IntType zero(0); // handle the Inf and NaN cases if(den == zero) { if(r.num == zero) throw bad_rational(); num *= r.sign(); return *this; } if(r.den == zero) { if(num == zero) throw bad_rational(); num = r.num * sign(); den = zero; return *this; } // Protect against self-modification IntType r_num = r.num; IntType r_den = r.den; // Avoid overflow and preserve normalization IntType gcd1 = gcd(num, r_den); IntType gcd2 = gcd(r_num, den); num = (num/gcd1) * (r_num/gcd2); den = (den/gcd2) * (r_den/gcd1); return *this; } template Rational& Rational::operator/= (const Rational& r) { IntType zero(0); // handle the Inf and NaN cases if(den == zero) { if(r.den == zero) throw bad_rational(); if(r.num != zero) num *= r.sign(); return *this; } if(r.num == zero) { if(num == zero) throw bad_rational(); num = IntType(sign()); // normalized inf! den = zero; return *this; } if (num == zero) return *this; // Protect against self-modification IntType r_num = r.num; IntType r_den = r.den; // Avoid overflow and preserve normalization IntType gcd1 = gcd(num, r_num); IntType gcd2 = gcd(r_den, den); num = (num/gcd1) * (r_den/gcd2); den = (den/gcd2) * (r_num/gcd1); if (den < zero) { num = -num; den = -den; } return *this; } // Mixed-mode operators -- implement explicitly to save gcd() calculations template inline Rational& Rational::operator+= (param_type i) { num += i * den; return *this; } template inline Rational& Rational::operator-= (param_type i) { num -= i * den; return *this; } template Rational& Rational::operator*= (param_type i) { if(i == IntType(1)) return *this; IntType zero(0); if(i == zero) { if(den == zero) { throw bad_rational(); } else { num = zero; den = IntType(1); return *this; } } IntType g = gcd(i, den); den /= g; num *= i / g; return *this; } template Rational& Rational::operator/= (param_type i) { if(i == IntType(1)) return *this; IntType zero(0); if(i == zero) { if(num == zero) throw bad_rational(); num = IntType(sign()); // normalized inf! den = zero; return *this; } IntType g = gcd(i, num); if(i < zero) { num /= -g; den *= -i / g; } else { num /= g; den *= i / g; } return *this; } // Increment and decrement template inline Rational& Rational::operator++() { // This can never denormalise the fraction num += den; return *this; } template inline Rational& Rational::operator--() { // This can never denormalise the fraction num -= den; return *this; } // Normalisation template void Rational::normalize() { // Avoid repeated construction IntType zero(0); if (den == zero) { if(num == zero) throw bad_rational(); if(num < zero) num = IntType(-1); else num = IntType(1); return; } // Handle the case of zero separately, to avoid division by zero if (num == zero) { den = IntType(1); return; } IntType g = gcd(num, den); num /= g; den /= g; // Ensure that the denominator is positive if (den < zero) { num = -num; den = -den; } } /********************************************************/ /* */ /* Rational-Traits */ /* */ /********************************************************/ /** \page RationalTraits Numeric and Promote Traits of Rational The numeric and promote traits for Rational follow the general specifications for \ref NumericPromotionTraits and \ref AlgebraicField. They are implemented in terms of the traits of the basic types by partial template specialization: \code template struct NumericTraits > { typedef Rational::Promote> Promote; typedef Rational::RealPromote> RealPromote; typedef typename NumericTraits::isIntegral isIntegral; typedef VigraTrueType isScalar; typedef typename NumericTraits::isSigned isSigned; typedef VigraTrueType isOrdered; // etc. }; template struct NormTraits > { typedef Rational Type; typedef typename NumericTraits::Promote SquaredNormType; typedef Type NormType; }; template struct PromoteTraits, Rational > { typedef Rational::Promote> Promote; }; \endcode \#include \<vigra/rational.hxx\>
Namespace: vigra */ #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template struct NumericTraits > { typedef Rational Type; typedef Rational::Promote> Promote; typedef Rational::RealPromote> RealPromote; typedef std::complex > ComplexPromote; typedef T ValueType; typedef typename NumericTraits::isIntegral isIntegral; typedef VigraTrueType isScalar; typedef typename NumericTraits::isSigned isSigned; typedef VigraTrueType isOrdered; typedef VigraFalseType isComplex; static Type zero() { return Type(0); } static Type one() { return Type(1); } static Type nonZero() { return one(); } static Promote toPromote(Type const & v) { return Promote(v.numerator(), v.denominator(), false); } static RealPromote toRealPromote(Type const & v) { return RealPromote(v.numerator(), v.denominator(), false); } static Type fromPromote(Promote const & v) { return Type(NumericTraits::fromPromote(v.numerator()), NumericTraits::fromPromote(v.denominator()), false); } static Type fromRealPromote(RealPromote const & v) { return Type(NumericTraits::fromRealPromote(v.numerator()), NumericTraits::fromRealPromote(v.denominator()), false); } }; template struct NormTraits > { typedef Rational Type; typedef typename NumericTraits::Promote SquaredNormType; typedef Type NormType; }; template struct PromoteTraits, Rational > { typedef Rational::Promote> Promote; static Promote toPromote(Rational const & v) { return v; } }; template struct PromoteTraits, Rational > { typedef Rational::Promote> Promote; static Promote toPromote(Rational const & v) { return v; } static Promote toPromote(Rational const & v) { return v; } }; template struct PromoteTraits, T2 > { typedef Rational::Promote> Promote; static Promote toPromote(Rational const & v) { return v; } static Promote toPromote(T2 const & v) { return Promote(v); } }; template struct PromoteTraits > { typedef Rational::Promote> Promote; static Promote toPromote(T1 const & v) { return Promote(v); } static Promote toPromote(Rational const & v) { return v; } }; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION /********************************************************/ /* */ /* RationalOperations */ /* */ /********************************************************/ /** \addtogroup RationalOperations Functions for Rational \brief \#include \<vigra/rational.hxx\>
These functions fulfill the requirements of an \ref AlgebraicField. Namespace: vigra

*/ //@{ /********************************************************/ /* */ /* arithmetic */ /* */ /********************************************************/ /// unary plus template inline Rational operator+ (const Rational& r) { return r; } /// unary minus (negation) template inline Rational operator- (const Rational& r) { return Rational(-r.numerator(), r.denominator(), false); } /// addition template inline Rational operator+(Rational l, Rational const & r) { return l += r; } /// subtraction template inline Rational operator-(Rational l, Rational const & r) { return l -= r; } /// multiplication template inline Rational operator*(Rational l, Rational const & r) { return l *= r; } /// division template inline Rational operator/(Rational l, Rational const & r) { return l /= r; } /// addition of right-hand IntType argument template inline Rational operator+(Rational l, typename Rational::param_type r) { return l += r; } /// subtraction of right-hand IntType argument template inline Rational operator-(Rational l, typename Rational::param_type r) { return l -= r; } /// multiplication with right-hand IntType argument template inline Rational operator*(Rational l, typename Rational::param_type r) { return l *= r; } /// division by right-hand IntType argument template inline Rational operator/(Rational l, typename Rational::param_type r) { return l /= r; } /// addition of left-hand IntType argument template inline Rational operator+(typename Rational::param_type l, Rational r) { return r += l; } /// subtraction from left-hand IntType argument template inline Rational operator-(typename Rational::param_type l, Rational const & r) { return (-r) += l; } /// multiplication with left-hand IntType argument template inline Rational operator*(typename Rational::param_type l, Rational r) { return r *= l; } /// division of left-hand IntType argument template inline Rational operator/(typename Rational::param_type l, Rational const & r) { if(r.numerator() < IntType(0)) return Rational(-r.denominator(), -r.numerator(), false) *= l; else return Rational(r.denominator(), r.numerator(), false) *= l; } /********************************************************/ /* */ /* comparison */ /* */ /********************************************************/ /// equality template inline bool operator== (const Rational & l, const Rational& r) { return l.denominator() == r.denominator() && l.numerator() == r.numerator(); // works since numbers are normalized, even // if they represent +-infinity } /// equality with right-hand IntType2 argument template inline bool operator== (const Rational & l, IntType2 const & i) { return ((l.denominator() == IntType1(1)) && (l.numerator() == i)); } /// equality with left-hand IntType1 argument template inline bool operator==(IntType1 const & l, Rational const & r) { return r == l; } /// inequality template inline bool operator!=(Rational const & l, Rational const & r) { return l.denominator() != r.denominator() || l.numerator() != r.numerator(); // works since numbers are normalized, even // if they represent +-infinity } /// inequality with right-hand IntType2 argument template inline bool operator!= (const Rational & l, IntType2 const & i) { return ((l.denominator() != IntType1(1)) || (l.numerator() != i)); } /// inequality with left-hand IntType1 argument template inline bool operator!=(IntType1 const & l, Rational const & r) { return r != l; } /// less-than template bool operator< (const Rational & l, const Rational& r) { // Avoid repeated construction typedef typename PromoteTraits::Promote IntType; IntType zero(0); // Handle the easy cases. Take advantage of the fact // that the denominator is never negative. if(l.denominator() == zero) { if(r.denominator() == zero) // -inf < inf, !(-inf < -inf), !(inf < -inf), !(inf < inf) return l.numerator() < r.numerator(); else // -inf < -1, -inf < 0, -inf < 1 // !(inf < -1), !(inf < 0), !(inf < 1) return l.numerator() < zero; } if(r.denominator() == zero) // -1 < inf, 0 < inf, 1 < inf // !(-1 < -inf), !(0 < -inf), !(1 < -inf) return r.numerator() > zero; // !(1 < -1), !(1 < 0), !(0 < -1), !(0 < 0) if(l.numerator() >= zero && r.numerator() <= zero) return false; // -1 < 0, -1 < 1, 0 < 1 (note: !(0 < 0) was already handled!) if(l.numerator() <= zero && r.numerator() >= zero) return true; // both numbers have the same sign (and are neither zero or +-infinity) // => calculate result, avoid overflow IntType gcd1 = gcd(l.numerator(), r.numerator()); IntType gcd2 = gcd(r.denominator(), l.denominator()); return (l.numerator()/gcd1) * (r.denominator()/gcd2) < (l.denominator()/gcd2) * (r.numerator()/gcd1); } /// less-than with right-hand IntType2 argument template bool operator< (const Rational & l, IntType2 const & i) { // Avoid repeated construction typedef typename PromoteTraits::Promote IntType; IntType zero(0); // Handle the easy cases. Take advantage of the fact // that the denominator is never negative. if(l.denominator() == zero) // -inf < -1, -inf < 0, -inf < 1 // !(inf < -1), !(inf < 0), !(inf < 1) return l.numerator() < zero; // !(1 < -1), !(1 < 0), !(0 < -1), !(0 < 0) if(l.numerator() >= zero && i <= zero) return false; // -1 < 0, -1 < 1, 0 < 1 (note: !(0 < 0) was already handled!) if(l.numerator() <= zero && i >= zero) return true; // Now, use the fact that n/d truncates towards zero as long as n and d // are both positive. // Divide instead of multiplying to avoid overflow issues. Of course, // division may be slower, but accuracy is more important than speed... if (l.numerator() > zero) return (l.numerator()/l.denominator()) < i; else return -i < (-l.numerator()/l.denominator()); } /// less-than with left-hand IntType1 argument template inline bool operator<(IntType1 const & l, Rational const & r) { return r > l; } /// greater-than template inline bool operator>(Rational const & l, Rational const & r) { return r < l; } /// greater-than with right-hand IntType2 argument template bool operator> (const Rational & l, IntType2 const & i) { // Trap equality first if (l.numerator() == i && l.denominator() == IntType1(1)) return false; // Otherwise, we can use operator< return !(l < i); } /// greater-than with left-hand IntType1 argument template inline bool operator>(IntType1 const & l, Rational const & r) { return r < l; } /// less-equal template inline bool operator<=(Rational const & l, Rational const & r) { return !(r < l); } /// less-equal with right-hand IntType2 argument template inline bool operator<=(Rational const & l, IntType2 const & r) { return !(l > r); } /// less-equal with left-hand IntType1 argument template inline bool operator<=(IntType1 const & l, Rational const & r) { return r >= l; } /// greater-equal template inline bool operator>=(Rational const & l, Rational const & r) { return !(l < r); } /// greater-equal with right-hand IntType2 argument template inline bool operator>=(Rational const & l, IntType2 const & r) { return !(l < r); } /// greater-equal with left-hand IntType1 argument template inline bool operator>=(IntType1 const & l, Rational const & r) { return r <= l; } /********************************************************/ /* */ /* algebraic functions */ /* */ /********************************************************/ /// absolute value template inline Rational abs(const Rational& r) { if (r.numerator() >= IntType(0)) return r; return Rational(-r.numerator(), r.denominator(), false); } /// norm (same as abs(r)) template inline Rational norm(const Rational& r) { return abs(r); } /// squared norm template inline typename NormTraits >::SquaredNormType squaredNorm(const Rational& r) { return typename NormTraits >::SquaredNormType(sq(r.numerator()), sq(r.denominator()), false); } /** integer powers throws bad_rational if indeterminate expression. */ template Rational pow(const Rational& r, int e) { IntType zero(0); int ae; if(e == 0) { if(r.denominator() == zero) throw bad_rational(); return Rational(IntType(1)); } else if(e < 0) { if(r.numerator() == zero) return Rational(IntType(1), zero, false); if(r.denominator() == zero) return Rational(zero); ae = -e; } else { if(r.denominator() == zero || r.numerator() == zero) return r; ae = e; } IntType nold = r.numerator(), dold = r.denominator(), nnew = IntType(1), dnew = IntType(1); for(; ae != 0; ae >>= 1, nold *= nold, dold *= dold) { if(ae % 2 != 0) { nnew *= nold; dnew *= dold; } } if(e < 0) { if(nnew < zero) return Rational(-dnew, -nnew, false); else return Rational(dnew, nnew, false); } else return Rational(nnew, dnew, false); } /// largest integer not larger than r template Rational floor(const Rational& r) { IntType zero(0), one(1); if(r.denominator() == zero || r.denominator() == one) return r; return r.numerator() < zero ? Rational(r.numerator() / r.denominator() - one) : Rational(r.numerator() / r.denominator()); } /// smallest integer not smaller than r template Rational ceil(const Rational& r) { IntType zero(0), one(1); if(r.denominator() == zero || r.denominator() == one) return r; return r.numerator() < IntType(0) ? Rational(r.numerator() / r.denominator()) : Rational(r.numerator() / r.denominator() + one); } /** Type conversion Executes static_cast(numerator()) / denominator(). Usage: \code Rational r; int i; double d; i = rational_cast(r); // round r downwards d = rational_cast(r); // represent rational as a double r = rational_cast >(r); // no change \endcode */ template inline T rational_cast(const Rational& src) { return static_cast(src.numerator())/src.denominator(); } template inline T const & rational_cast(T const & v) { return v; } //@} template std::ostream& operator<< (std::ostream& os, const vigra::Rational& r) { os << r.numerator() << '/' << r.denominator(); return os; } } // namespace vigra #endif // VIGRA_RATIONAL_HPP gamera-3.3.3/include/vigra/README0000644000076500000000000000244111747510564015370 0ustar chriswheelReadme for VIGRA inclusion in Gamera ==================================== These header files are taken from VIGRA version 1.6.0 avaliable from http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ Due to some shortcomings in VIGRA 1.6.0, the following files are modified: - basicgeometry.hxx has been taken from the development branch of VIGRA to make the Gamera plugin "resize" work - stdconvolution.hxx a compiler warning about uninitialized variables is suppressed. This change is already included in the development branch of VIGRA - rational.hxx has been taken from the development branch of VIGRA to suppress a compiler warning about an "ambiguous else" - resizeimage.hxx has been taken from the development branch of VIGRA, even though this version still does not work correctly for an image resize without interpolation. Therefore never use resizeImageNoInterpolation(), but instead resampleImage() - inspectimage.hxx removed #pragma warning - affinegeometry.hxx has been taken from the development branch of VIGRA, to avoid rounding errors for exact rotations in rotateImage() - sized_int.hxx fix for gcc 4.7. This change is already included in the development branch of VIGRA Christoph Dalitz gamera-3.3.3/include/vigra/recursiveconvolution.hxx0000644000076500000000000014636011261456425021555 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_RECURSIVECONVOLUTION_HXX #define VIGRA_RECURSIVECONVOLUTION_HXX #include #include #include "utilities.hxx" #include "numerictraits.hxx" #include "imageiteratoradapter.hxx" #include "bordertreatment.hxx" namespace vigra { /********************************************************/ /* */ /* Recursive convolution functions */ /* */ /********************************************************/ /** \addtogroup RecursiveConvolution Recursive convolution functions First order recursive filters and their specialization for the exponential filter and its derivatives (1D and separable 2D). These filters are very fast, and the speed does not depend on the filter size. */ //@{ /********************************************************/ /* */ /* recursiveFilterLine */ /* */ /********************************************************/ /** \brief Performs a 1-dimensional recursive convolution of the source signal. The function performs a causal and an anti-causal first or second order recursive filtering with the given filter parameter b1 and border treatment border (first order filter, b2 = 0) or parameters b1, b2 and BORDER_TREATMENT_REFLECT (second order filter). Thus, the result is always a filtering with linear phase. \f[ \begin{array}{rcl} a_{i, causal} & = & source_i + b1 * a_{i-1, causal} + b2 * a_{i-2, causal} \\ a_{i, anticausal} & = & source_i + b1 * a_{i+1, anticausal} + b2 * a_{i+2, anticausal} \\ dest_i & = & \frac{1 - b1 - b2}{1 + b1 + b2}(a_{i, causal} + a_{i, anticausal} - source_i) \end{array} \f] The signal's value_type (SrcAccessor::value_type) must be a linear space over double, i.e. addition of source values, multiplication with double, and NumericTraits must be defined. Declaration: First order recursive filter: \code namespace vigra { template void recursiveFilterLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double b1, BorderTreatmentMode border) } \endcode Second order recursive filter: \code namespace vigra { template void recursiveFilterLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double b1, double b2) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vector src, dest; ... vigra::DefaultAccessor::iterator, float> FAccessor; vigra::recursiveFilterLine(src.begin(), src.end(), FAccessor(), dest.begin(), FAccessor(), 0.5, BORDER_TREATMENT_REFLECT); \endcode Required Interface: \code RandomAccessIterator is, isend; RandomAccessIterator id; SrcAccessor src_accessor; DestAccessor dest_accessor; NumericTraits::RealPromote s = src_accessor(is); double d; s = s + s; s = d * s; dest_accessor.set( NumericTraits::fromRealPromote(s), id); \endcode Preconditions: \code -1 < b < 1 \endcode */ doxygen_overloaded_function(template <...> void recursiveFilterLine) template void recursiveFilterLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double b, BorderTreatmentMode border) { int w = isend - is; SrcIterator istart = is; int x; vigra_precondition(-1.0 < b && b < 1.0, "recursiveFilterLine(): -1 < factor < 1 required.\n"); if(b == 0.0) { for(; is != isend; ++is, ++id) { ad.set(as(is), id); } return; } double eps = 0.00001; int kernelw = std::min(w-1, (int)(VIGRA_CSTD::log(eps)/VIGRA_CSTD::log(VIGRA_CSTD::fabs(b)))); typedef typename NumericTraits::RealPromote TempType; typedef NumericTraits DestTraits; // store result of causal filtering std::vector vline(w); typename std::vector::iterator line = vline.begin(); double norm = (1.0 - b) / (1.0 + b); TempType old; if(border == BORDER_TREATMENT_REPEAT || border == BORDER_TREATMENT_AVOID) { old = (1.0 / (1.0 - b)) * as(is); } else if(border == BORDER_TREATMENT_REFLECT) { is += kernelw; old = (1.0 / (1.0 - b)) * as(is); for(x = 0; x < kernelw; ++x, --is) old = as(is) + b * old; } else if(border == BORDER_TREATMENT_WRAP) { is = isend - kernelw; old = (1.0 / (1.0 - b)) * as(is); for(x = 0; x < kernelw; ++x, ++is) old = as(is) + b * old; } else if(border == BORDER_TREATMENT_CLIP) { old = NumericTraits::zero(); } else vigra_fail("recursiveFilterLine(): Unknown border treatment mode.\n"); // left side of filter for(x=0, is = istart; x < w; ++x, ++is) { old = as(is) + b * old; line[x] = old; } // right side of the filter if(border == BORDER_TREATMENT_REPEAT || border == BORDER_TREATMENT_AVOID) { is = isend - 1; old = (1.0 / (1.0 - b)) * as(is); } else if(border == BORDER_TREATMENT_REFLECT) { old = line[w-2]; } else if(border == BORDER_TREATMENT_WRAP) { is = istart + kernelw - 1; old = (1.0 / (1.0 - b)) * as(is); for(x = 0; x < kernelw; ++x, --is) old = as(is) + b * old; } else if(border == BORDER_TREATMENT_CLIP) { old = NumericTraits::zero(); } is = isend - 1; id += w - 1; if(border == BORDER_TREATMENT_CLIP) { // correction factors for b double bright = b; double bleft = VIGRA_CSTD::pow(b, w); for(x=w-1; x>=0; --x, --is, --id) { TempType f = b * old; old = as(is) + f; double norm = (1.0 - b) / (1.0 + b - bleft - bright); bleft /= b; bright *= b; ad.set(norm * (line[x] + f), id); } } else if(border == BORDER_TREATMENT_AVOID) { for(x=w-1; x >= kernelw; --x, --is, --id) { TempType f = b * old; old = as(is) + f; if(x < w - kernelw) ad.set(DestTraits::fromRealPromote(norm * (line[x] + f)), id); } } else { for(x=w-1; x>=0; --x, --is, --id) { TempType f = b * old; old = as(is) + f; ad.set(DestTraits::fromRealPromote(norm * (line[x] + f)), id); } } } /********************************************************/ /* */ /* recursiveFilterLine (2nd order) */ /* */ /********************************************************/ template void recursiveFilterLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double b1, double b2) { int w = isend - is; SrcIterator istart = is; int x; typedef typename NumericTraits::RealPromote TempType; typedef NumericTraits DestTraits; // speichert den Ergebnis der linkseitigen Filterung. std::vector vline(w+1); typename std::vector::iterator line = vline.begin(); double norm = 1.0 - b1 - b2; double norm1 = (1.0 - b1 - b2) / (1.0 + b1 + b2); double norm2 = norm * norm; // init left side of filter int kernelw = std::min(w-1, std::max(8, (int)(1.0 / norm + 0.5))); is += (kernelw - 2); line[kernelw] = as(is); line[kernelw-1] = as(is); for(x = kernelw - 2; x > 0; --x, --is) { line[x] = as(is) + b1 * line[x+1] + b2 * line[x+2]; } line[0] = as(is) + b1 * line[1] + b2 * line[2]; ++is; line[1] = as(is) + b1 * line[0] + b2 * line[1]; ++is; for(x=2; x < w; ++x, ++is) { line[x] = as(is) + b1 * line[x-1] + b2 * line[x-2]; } line[w] = line[w-1]; line[w-1] = norm1 * (line[w-1] + b1 * line[w-2] + b2 * line[w-3]); line[w-2] = norm1 * (line[w-2] + b1 * line[w] + b2 * line[w-2]); id += w-1; ad.set(line[w-1], id); --id; ad.set(line[w-2], id); --id; for(x=w-3; x>=0; --x, --id, --is) { line[x] = norm2 * line[x] + b1 * line[x+1] + b2 * line[x+2]; ad.set(line[x], id); } } /********************************************************/ /* */ /* recursiveSmoothLine */ /* */ /********************************************************/ /** \brief Convolves the image with a 1-dimensional exponential filter. This function calls \ref recursiveFilterLine() with b = exp(-1.0/scale) and border = BORDER_TREATMENT_REPEAT. See \ref recursiveFilterLine() for more documentation. Declaration: \code namespace vigra { template void recursiveSmoothLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vector src, dest; ... vigra::DefaultAccessor::iterator, float> FAccessor; vigra::recursiveSmoothLine(src.begin(), src.end(), FAccessor(), dest.begin(), FAccessor(), 3.0); \endcode Required Interface: \code RandomAccessIterator is, isend; RandomAccessIterator id; SrcAccessor src_accessor; DestAccessor dest_accessor; NumericTraits::RealPromote s = src_accessor(is); double d; s = s + s; s = d * s; dest_accessor.set( NumericTraits::fromRealPromote(s), id); \endcode Preconditions: \code scale > 0 \endcode */ doxygen_overloaded_function(template <...> void recursiveSmoothLine) template inline void recursiveSmoothLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double scale) { vigra_precondition(scale >= 0, "recursiveSmoothLine(): scale must be >= 0.\n"); double b = (scale == 0.0) ? 0.0 : VIGRA_CSTD::exp(-1.0/scale); recursiveFilterLine(is, isend, as, id, ad, b, BORDER_TREATMENT_REPEAT); } /********************************************************/ /* */ /* recursiveFirstDerivativeLine */ /* */ /********************************************************/ /** \brief Performs a 1 dimensional recursive convolution of the source signal. It uses the first derivative an exponential d/dx exp(-abs(x)/scale) as a kernel. The signal's value_type (SrcAccessor::value_type) must be a linear space over double, i.e. addition and subtraction of source values, multiplication with double, and NumericTraits must be defined. Border treatment is always BORDER_TREATMENT_REPEAT. Declaration: \code namespace vigra { template void recursiveFirstDerivativeLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vector src, dest; ... vigra::DefaultAccessor::iterator, float> FAccessor; vigra::recursiveFirstDerivativeLine(src.begin(), src.end(), FAccessor(), dest.begin(), FAccessor(), 3.0); \endcode Required Interface: \code RandomAccessIterator is, isend; RandomAccessIterator id; SrcAccessor src_accessor; DestAccessor dest_accessor; NumericTraits::RealPromote s = src_accessor(is); double d; s = s + s; s = -s; s = d * s; dest_accessor.set( NumericTraits::fromRealPromote(s), id); \endcode Preconditions: \code scale > 0 \endcode */ doxygen_overloaded_function(template <...> void recursiveFirstDerivativeLine) template void recursiveFirstDerivativeLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double scale) { vigra_precondition(scale > 0, "recursiveFirstDerivativeLine(): scale must be > 0.\n"); int w = isend -is; int x; typedef typename NumericTraits::RealPromote TempType; typedef NumericTraits DestTraits; std::vector vline(w); typename std::vector::iterator line = vline.begin(); double b = VIGRA_CSTD::exp(-1.0/scale); double norm = (1.0 - b) * (1.0 - b) / 2.0 / b; TempType old = (1.0 / (1.0 - b)) * as(is); // left side of filter for(x=0; x=0; --x) { --is; --id; old = as(is) + b * old; ad.set(DestTraits::fromRealPromote(norm * (line[x] + old)), id); } } /********************************************************/ /* */ /* recursiveSecondDerivativeLine */ /* */ /********************************************************/ /** \brief Performs a 1 dimensional recursive convolution of the source signal. It uses the second derivative an exponential d2/dx2 exp(-abs(x)/scale) as a kernel. The signal's value_type (SrcAccessor::value_type) must be a linear space over double, i.e. addition and subtraction of source values, multiplication with double, and NumericTraits must be defined. Border treatment is always BORDER_TREATMENT_REPEAT. Declaration: \code namespace vigra { template void recursiveSecondDerivativeLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vector src, dest; ... vigra::DefaultAccessor::iterator, float> FAccessor; vigra::recursiveSecondDerivativeLine(src.begin(), src.end(), FAccessor(), dest.begin(), FAccessor(), 3.0); \endcode Required Interface: \code RandomAccessIterator is, isend; RandomAccessIterator id; SrcAccessor src_accessor; DestAccessor dest_accessor; NumericTraits::RealPromote s = src_accessor(is); double d; s = s + s; s = s - s; s = d * s; dest_accessor.set( NumericTraits::fromRealPromote(s), id); \endcode Preconditions: \code scale > 0 \endcode */ doxygen_overloaded_function(template <...> void recursiveSecondDerivativeLine) template void recursiveSecondDerivativeLine(SrcIterator is, SrcIterator isend, SrcAccessor as, DestIterator id, DestAccessor ad, double scale) { vigra_precondition(scale > 0, "recursiveSecondDerivativeLine(): scale must be > 0.\n"); int w = isend -is; int x; typedef typename NumericTraits::RealPromote TempType; typedef NumericTraits DestTraits; std::vector vline(w); typename std::vector::iterator line = vline.begin(); double b = VIGRA_CSTD::exp(-1.0/scale); double a = -2.0 / (1.0 - b); double norm = (1.0 - b) * (1.0 - b) * (1.0 - b) / (1.0 + b); TempType old = (1.0 / (1.0 - b)) * as(is); // left side of filter for(x=0; x=0; --x) { --is; --id; TempType f = old + a * as(is); old = as(is) + b * old; ad.set(DestTraits::fromRealPromote(norm * (line[x] + f)), id); } } /********************************************************/ /* */ /* recursiveFilterX */ /* */ /********************************************************/ /** \brief Performs 1 dimensional recursive filtering (1st and 2nd order) in x direction. It calls \ref recursiveFilterLine() for every row of the image. See \ref recursiveFilterLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { // first order filter template void recursiveFilterX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double b, BorderTreatmentMode border); // second order filter template void recursiveFilterX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double b1, double b2); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { // first order filter template void recursiveFilterX( triple src, pair dest, double b, BorderTreatmentMode border); // second order filter template void recursiveFilterX( triple src, pair dest, double b1, double b2); } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... vigra::recursiveSmoothX(srcImageRange(src), destImage(dest), 0.5, BORDER_TREATMENT_REFLECT); \endcode */ doxygen_overloaded_function(template <...> void recursiveFilterX) template void recursiveFilterX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double b, BorderTreatmentMode border) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int y; for(y=0; y inline void recursiveFilterX( triple src, pair dest, double b, BorderTreatmentMode border) { recursiveFilterX(src.first, src.second, src.third, dest.first, dest.second, b, border); } /********************************************************/ /* */ /* recursiveFilterX (2nd order) */ /* */ /********************************************************/ template void recursiveFilterX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double b1, double b2) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int y; for(y=0; y inline void recursiveFilterX( triple src, pair dest, double b1, double b2) { recursiveFilterX(src.first, src.second, src.third, dest.first, dest.second, b1, b2); } /********************************************************/ /* */ /* recursiveSmoothX */ /* */ /********************************************************/ /** \brief Performs 1 dimensional recursive smoothing in x direction. It calls \ref recursiveSmoothLine() for every row of the image. See \ref recursiveSmoothLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { template void recursiveSmoothX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void recursiveSmoothX( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... vigra::recursiveSmoothX(srcImageRange(src), destImage(dest), 3.0); \endcode */ doxygen_overloaded_function(template <...> void recursiveSmoothX) template void recursiveSmoothX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int y; for(y=0; y inline void recursiveSmoothX( triple src, pair dest, double scale) { recursiveSmoothX(src.first, src.second, src.third, dest. first, dest.second, scale); } /********************************************************/ /* */ /* recursiveFilterY */ /* */ /********************************************************/ /** \brief Performs 1 dimensional recursive filtering (1st and 2nd order) in y direction. It calls \ref recursiveFilterLine() for every column of the image. See \ref recursiveFilterLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { // first order filter template void recursiveFilterY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double b, BorderTreatmentMode border); // second order filter template void recursiveFilterY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double b1, double b2); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { // first order filter template void recursiveFilterY( triple src, pair dest, double b, BorderTreatmentMode border); // second order filter template void recursiveFilterY( triple src, pair dest, double b1, double b2); } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... vigra::recursiveFilterY(srcImageRange(src), destImage(dest), -0.6, -0.06); \endcode */ doxygen_overloaded_function(template <...> void recursiveFilterY) template void recursiveFilterY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double b, BorderTreatmentMode border) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int x; for(x=0; x inline void recursiveFilterY( triple src, pair dest, double b, BorderTreatmentMode border) { recursiveFilterY(src.first, src.second, src.third, dest.first, dest.second, b, border); } /********************************************************/ /* */ /* recursiveFilterY (2nd order) */ /* */ /********************************************************/ template void recursiveFilterY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double b1, double b2) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int x; for(x=0; x inline void recursiveFilterY( triple src, pair dest, double b1, double b2) { recursiveFilterY(src.first, src.second, src.third, dest.first, dest.second, b1, b2); } /********************************************************/ /* */ /* recursiveSmoothY */ /* */ /********************************************************/ /** \brief Performs 1 dimensional recursive smoothing in y direction. It calls \ref recursiveSmoothLine() for every column of the image. See \ref recursiveSmoothLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { template void recursiveSmoothY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void recursiveSmoothY( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... vigra::recursiveSmoothY(srcImageRange(src), destImage(dest), 3.0); \endcode */ doxygen_overloaded_function(template <...> void recursiveSmoothY) template void recursiveSmoothY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int x; for(x=0; x inline void recursiveSmoothY( triple src, pair dest, double scale) { recursiveSmoothY(src.first, src.second, src.third, dest. first, dest.second, scale); } /********************************************************/ /* */ /* recursiveFirstDerivativeX */ /* */ /********************************************************/ /** \brief Recursively calculates the 1 dimensional first derivative in x direction. It calls \ref recursiveFirstDerivativeLine() for every row of the image. See \ref recursiveFirstDerivativeLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { template void recursiveFirstDerivativeX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void recursiveFirstDerivativeX( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... vigra::recursiveFirstDerivativeX(srcImageRange(src), destImage(dest), 3.0); \endcode */ doxygen_overloaded_function(template <...> void recursiveFirstDerivativeX) template void recursiveFirstDerivativeX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int y; for(y=0; y inline void recursiveFirstDerivativeX( triple src, pair dest, double scale) { recursiveFirstDerivativeX(src.first, src.second, src.third, dest. first, dest.second, scale); } /********************************************************/ /* */ /* recursiveFirstDerivativeY */ /* */ /********************************************************/ /** \brief Recursively calculates the 1 dimensional first derivative in y direction. It calls \ref recursiveFirstDerivativeLine() for every column of the image. See \ref recursiveFirstDerivativeLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { template void recursiveFirstDerivativeY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void recursiveFirstDerivativeY( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... vigra::recursiveFirstDerivativeY(srcImageRange(src), destImage(dest), 3.0); \endcode */ doxygen_overloaded_function(template <...> void recursiveFirstDerivativeY) template void recursiveFirstDerivativeY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int x; for(x=0; x inline void recursiveFirstDerivativeY( triple src, pair dest, double scale) { recursiveFirstDerivativeY(src.first, src.second, src.third, dest. first, dest.second, scale); } /********************************************************/ /* */ /* recursiveSecondDerivativeX */ /* */ /********************************************************/ /** \brief Recursively calculates the 1 dimensional second derivative in x direction. It calls \ref recursiveSecondDerivativeLine() for every row of the image. See \ref recursiveSecondDerivativeLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { template void recursiveSecondDerivativeX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void recursiveSecondDerivativeX( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... vigra::recursiveSecondDerivativeX(srcImageRange(src), destImage(dest), 3.0); \endcode */ doxygen_overloaded_function(template <...> void recursiveSecondDerivativeX) template void recursiveSecondDerivativeX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int y; for(y=0; y inline void recursiveSecondDerivativeX( triple src, pair dest, double scale) { recursiveSecondDerivativeX(src.first, src.second, src.third, dest. first, dest.second, scale); } /********************************************************/ /* */ /* recursiveSecondDerivativeY */ /* */ /********************************************************/ /** \brief Recursively calculates the 1 dimensional second derivative in y direction. It calls \ref recursiveSecondDerivativeLine() for every column of the image. See \ref recursiveSecondDerivativeLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { template void recursiveSecondDerivativeY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void recursiveSecondDerivativeY( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/recursiveconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... vigra::recursiveSecondDerivativeY(srcImageRange(src), destImage(dest), 3.0); \endcode */ doxygen_overloaded_function(template <...> void recursiveSecondDerivativeY) template void recursiveSecondDerivativeY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor as, DestImageIterator dupperleft, DestAccessor ad, double scale) { int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; int x; for(x=0; x inline void recursiveSecondDerivativeY( triple src, pair dest, double scale) { recursiveSecondDerivativeY(src.first, src.second, src.third, dest. first, dest.second, scale); } //@} } // namespace vigra #endif // VIGRA_RECURSIVECONVOLUTION_HXX gamera-3.3.3/include/vigra/regression.hxx0000644000076500000000000003750011261456425017421 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2008 by Ullrich Koethe */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_REGRESSION_HXX #define VIGRA_REGRESSION_HXX #include "matrix.hxx" #include "linear_solve.hxx" #include "singular_value_decomposition.hxx" #include "numerictraits.hxx" #include "functorexpression.hxx" namespace vigra { namespace linalg { /** \addtogroup MatrixAlgebra */ //@{ /** Ordinary Least Squares Regression. Given a matrix \a A with m rows and n columns (with m \>= n), and a column vector \a b of length m rows, this function computes a column vector \a x of length n rows such that the residual \f[ \left|\textrm{\bf A} \textrm{\bf x} - \textrm{\bf b}\right|^2 \f] is minimized. When \a b is a matrix with k columns, \a x must also have k columns, which will contain the solutions for the corresponding columns of \a b. Note that all matrices must already have the correct shape. This function is just another name for \ref linearSolve(), perhaps leading to more readable code when \a A is a rectangular matrix. It returns false when the rank of \a A is less than n. See \ref linearSolve() for more documentation. \#include \<vigra/regression_8hxx.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template inline bool leastSquares(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> const &b, MultiArrayView<2, T, C3> &x, std::string method = "QR") { return linearSolve(A, b, x, method); } /** Weighted Least Squares Regression. Given a matrix \a A with m rows and n columns (with m \>= n), a vector \a b of length m, and a weight vector \a weights of length m with non-negative entries, this function computes a vector \a x of length n such that the weighted residual \f[ \left(\textrm{\bf A} \textrm{\bf x} - \textrm{\bf b}\right)^T \textrm{diag}(\textrm{\bf weights}) \left(\textrm{\bf A} \textrm{\bf x} - \textrm{\bf b}\right) \f] is minimized, where diag(weights) creates a diagonal matrix from \a weights. The algorithm calls \ref leastSquares() on the equivalent problem \f[ \left|\textrm{diag}(\textrm{\bf weights})^{1/2}\textrm{\bf A} \textrm{\bf x} - \textrm{diag}(\textrm{\bf weights})^{1/2} \textrm{\bf b}\right|^2 \f] where the square root of \a weights is just taken element-wise. When \a b is a matrix with k columns, \a x must also have k columns, which will contain the solutions for the corresponding columns of \a b. Note that all matrices must already have the correct shape. The function returns false when the rank of the weighted matrix \a A is less than n. \#include \<vigra/regression.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool weightedLeastSquares(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> const &b, MultiArrayView<2, T, C3> const &weights, MultiArrayView<2, T, C4> &x, std::string method = "QR") { typedef T Real; const unsigned int rows = rowCount(A); const unsigned int cols = columnCount(A); const unsigned int rhsCount = columnCount(b); vigra_precondition(rows >= cols, "weightedLeastSquares(): Input matrix A must be rectangular with rowCount >= columnCount."); vigra_precondition(rowCount(b) == rows, "weightedLeastSquares(): Shape mismatch between matrices A and b."); vigra_precondition(rowCount(b) == rowCount(weights) && columnCount(weights) == 1, "weightedLeastSquares(): Weight matrix has wrong shape."); vigra_precondition(rowCount(x) == cols && columnCount(x) == rhsCount, "weightedLeastSquares(): Result matrix x has wrong shape."); Matrix wa(A.shape()), wb(b.shape()); for(unsigned int k=0; k= 0, "weightedLeastSquares(): Weights must be positive."); T w = std::sqrt(weights(k,0)); for(unsigned int l=0; lm rows and n columns (with m \>= n), a vector \a b of length m, and a regularization parameter lambda \>= 0.0, this function computes a vector \a x of length n such that the residual \f[ \left|\textrm{\bf A} \textrm{\bf x} - \textrm{\bf b}\right|^2 + \lambda \textrm{\bf x}^T\textrm{\bf x} \f] is minimized. This is implemented by means of \ref singularValueDecomposition(). When \a b is a matrix with k columns, \a x must also have k columns, which will contain the solutions for the corresponding columns of \a b. Note that all matrices must already have the correct shape. The function returns false if the rank of \a A is less than n and lambda == 0.0. \#include \<vigra/regression.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool ridgeRegression(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> const &b, MultiArrayView<2, T, C3> &x, double lambda) { typedef T Real; const unsigned int rows = rowCount(A); const unsigned int cols = columnCount(A); const unsigned int rhsCount = columnCount(b); vigra_precondition(rows >= cols, "ridgeRegression(): Input matrix A must be rectangular with rowCount >= columnCount."); vigra_precondition(rowCount(b) == rows, "ridgeRegression(): Shape mismatch between matrices A and b."); vigra_precondition(rowCount(x) == cols && columnCount(x) == rhsCount, "ridgeRegression(): Result matrix x has wrong shape."); vigra_precondition(lambda >= 0.0, "ridgeRegression(): lambda >= 0.0 required."); unsigned int m = rows; unsigned int n = cols; Matrix u(m, n), s(n, 1), v(n, n); unsigned int rank = singularValueDecomposition(A, u, s, v); if(rank < n && lambda == 0.0) return false; Matrix t = transpose(u)*b; for(unsigned int k=0; km rows and n columns (with m \>= n), a vector \a b of length m, a weight vector \a weights of length m with non-negative entries, and a regularization parameter lambda >= 0.0 this function computes a vector \a x of length n such that the weighted residual \f[ \left(\textrm{\bf A} \textrm{\bf x} - \textrm{\bf b}\right)^T \textrm{diag}(\textrm{\bf weights}) \left(\textrm{\bf A} \textrm{\bf x} - \textrm{\bf b}\right) + \lambda \textrm{\bf x}^T\textrm{\bf x} \f] is minimized, where diag(weights) creates a diagonal matrix from \a weights. The algorithm calls \ref ridgeRegression() on the equivalent problem \f[ \left|\textrm{diag}(\textrm{\bf weights})^{1/2}\textrm{\bf A} \textrm{\bf x} - \textrm{diag}(\textrm{\bf weights})^{1/2} \textrm{\bf b}\right|^2 + \lambda \textrm{\bf x}^T\textrm{\bf x} \f] where the square root of \a weights is just taken element-wise. This solution is computed by means of \ref singularValueDecomposition(). When \a b is a matrix with k columns, \a x must also have k columns, which will contain the solutions for the corresponding columns of \a b. Note that all matrices must already have the correct shape. The function returns false if the rank of \a A is less than n and lambda == 0.0. \#include \<vigra/regression.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool weightedRidgeRegression(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> const &b, MultiArrayView<2, T, C3> const &weights, MultiArrayView<2, T, C4> &x, double lambda) { typedef T Real; const unsigned int rows = rowCount(A); const unsigned int cols = columnCount(A); const unsigned int rhsCount = columnCount(b); vigra_precondition(rows >= cols, "weightedRidgeRegression(): Input matrix A must be rectangular with rowCount >= columnCount."); vigra_precondition(rowCount(b) == rows, "weightedRidgeRegression(): Shape mismatch between matrices A and b."); vigra_precondition(rowCount(b) == rowCount(weights) && columnCount(weights) == 1, "weightedRidgeRegression(): Weight matrix has wrong shape."); vigra_precondition(rowCount(x) == cols && columnCount(x) == rhsCount, "weightedRidgeRegression(): Result matrix x has wrong shape."); vigra_precondition(lambda >= 0.0, "weightedRidgeRegression(): lambda >= 0.0 required."); Matrix wa(A.shape()), wb(b.shape()); for(unsigned int k=0; k= 0, "weightedRidgeRegression(): Weights must be positive."); T w = std::sqrt(weights(k,0)); for(unsigned int l=0; lstd::vector interface, i.e. must support lambda.size() and lambda[k]. The columns of the matrix \a x will contain the solutions for the corresponding lambda, so the number of columns of the matrix \a x must be equal to lambda.size(), and \a b must be a columns vector, i.e. cannot contain several right hand sides at once. The function returns false when the matrix \a A is rank deficient. If this happens, and one of the lambdas is zero, the corresponding column of \a x will be skipped. \#include \<vigra/regression.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template bool ridgeRegressionSeries(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> const &b, MultiArrayView<2, T, C3> &x, Array const & lambda) { typedef T Real; const unsigned int rows = rowCount(A); const unsigned int cols = columnCount(A); const unsigned int lambdaCount = lambda.size(); vigra_precondition(rows >= cols, "ridgeRegressionSeries(): Input matrix A must be rectangular with rowCount >= columnCount."); vigra_precondition(rowCount(b) == rows && columnCount(b) == 1, "ridgeRegressionSeries(): Shape mismatch between matrices A and b."); vigra_precondition(rowCount(x) == cols && columnCount(x) == lambdaCount, "ridgeRegressionSeries(): Result matrix x has wrong shape."); unsigned int m = rows; unsigned int n = cols; Matrix u(m, n), s(n, 1), v(n, n); unsigned int rank = singularValueDecomposition(A, u, s, v); Matrix xl = transpose(u)*b; Matrix xt(cols,1); for(unsigned int i=0; i= 0.0, "ridgeRegressionSeries(): lambda >= 0.0 required."); if(lambda == 0.0 && rank < rows) continue; for(unsigned int k=0; k #include "stdimage.hxx" #include "array_vector.hxx" #include "rational.hxx" #include "functortraits.hxx" #include "functorexpression.hxx" #include "transformimage.hxx" #include "imagecontainer.hxx" namespace vigra { namespace resampling_detail { struct MapTargetToSourceCoordinate { MapTargetToSourceCoordinate(Rational const & samplingRatio, Rational const & offset) : a(samplingRatio.denominator()*offset.denominator()), b(samplingRatio.numerator()*offset.numerator()), c(samplingRatio.numerator()*offset.denominator()) {} // the following functions are more efficient realizations of: // rational_cast(i / samplingRatio + offset); // we need efficiency because this may be called in the inner loop int operator()(int i) const { return (i * a + b) / c; } double toDouble(int i) const { return double(i * a + b) / c; } Rational toRational(int i) const { return Rational(i * a + b, c); } bool isExpand2() const { return a == 1 && b == 0 && c == 2; } bool isReduce2() const { return a == 2 && b == 0 && c == 1; } int a, b, c; }; } // namespace resampling_detail template <> class FunctorTraits : public FunctorTraitsBase { public: typedef VigraTrueType isUnaryFunctor; }; template void resamplingExpandLine2(SrcIter s, SrcIter send, SrcAcc src, DestIter d, DestIter dend, DestAcc dest, KernelArray const & kernels) { typedef typename KernelArray::value_type Kernel; typedef typename KernelArray::const_reference KernelRef; typedef typename Kernel::const_iterator KernelIter; typedef typename PromoteTraits::Promote TmpType; int wo = send - s; int wn = dend - d; int wo2 = 2*wo - 2; int ileft = std::max(kernels[0].right(), kernels[1].right()); int iright = wo + std::min(kernels[0].left(), kernels[1].left()) - 1; for(int i = 0; i < wn; ++i, ++d) { int is = i / 2; KernelRef kernel = kernels[i & 1]; KernelIter k = kernel.center() + kernel.right(); TmpType sum = NumericTraits::zero(); if(is < ileft) { for(int m=is-kernel.right(); m <= is-kernel.left(); ++m, --k) { int mm = (m < 0) ? -m : m; sum += *k * src(s, mm); } } else if(is > iright) { for(int m=is-kernel.right(); m <= is-kernel.left(); ++m, --k) { int mm = (m >= wo) ? wo2 - m : m; sum += *k * src(s, mm); } } else { SrcIter ss = s + is - kernel.right(); for(int m = 0; m < kernel.size(); ++m, --k, ++ss) { sum += *k * src(ss); } } dest.set(sum, d); } } template void resamplingReduceLine2(SrcIter s, SrcIter send, SrcAcc src, DestIter d, DestIter dend, DestAcc dest, KernelArray const & kernels) { typedef typename KernelArray::value_type Kernel; typedef typename KernelArray::const_reference KernelRef; typedef typename Kernel::const_iterator KernelIter; KernelRef kernel = kernels[0]; KernelIter kbegin = kernel.center() + kernel.right(); typedef typename PromoteTraits::Promote TmpType; int wo = send - s; int wn = dend - d; int wo2 = 2*wo - 2; int ileft = kernel.right(); int iright = wo + kernel.left() - 1; for(int i = 0; i < wn; ++i, ++d) { int is = 2 * i; KernelIter k = kbegin; TmpType sum = NumericTraits::zero(); if(is < ileft) { for(int m=is-kernel.right(); m <= is-kernel.left(); ++m, --k) { int mm = (m < 0) ? -m : m; sum += *k * src(s, mm); } } else if(is > iright) { for(int m=is-kernel.right(); m <= is-kernel.left(); ++m, --k) { int mm = (m >= wo) ? wo2 - m : m; sum += *k * src(s, mm); } } else { SrcIter ss = s + is - kernel.right(); for(int m = 0; m < kernel.size(); ++m, --k, ++ss) { sum += *k * src(ss); } } dest.set(sum, d); } } /** \addtogroup ResamplingConvolutionFilters Resampling Convolution Filters These functions implement the convolution operation when the source and target images have different sizes. This is realized by accessing a continous kernel at the appropriate non-integer positions. The technique is, for example, described in D. Schumacher: General Filtered Image Rescaling, in: Graphics Gems III, Academic Press, 1992. */ //@{ /********************************************************/ /* */ /* resamplingConvolveLine */ /* */ /********************************************************/ /** \brief Performs a 1-dimensional resampling convolution of the source signal using the given set of kernels. This function is mainly used internally: It is called for each dimension of a higher dimensional array in order to perform a separable resize operation. Declaration: \#include \<vigra/resampling_convolution.hxx\> \code namespace vigra { template void resamplingConvolveLine(SrcIter s, SrcIter send, SrcAcc src, DestIter d, DestIter dend, DestAcc dest, KernelArray const & kernels, Functor mapTargetToSourceCoordinate) } \endcode */ doxygen_overloaded_function(template <...> void resamplingConvolveLine) template void resamplingConvolveLine(SrcIter s, SrcIter send, SrcAcc src, DestIter d, DestIter dend, DestAcc dest, KernelArray const & kernels, Functor mapTargetToSourceCoordinate) { if(mapTargetToSourceCoordinate.isExpand2()) { resamplingExpandLine2(s, send, src, d, dend, dest, kernels); return; } if(mapTargetToSourceCoordinate.isReduce2()) { resamplingReduceLine2(s, send, src, d, dend, dest, kernels); return; } typedef typename NumericTraits::RealPromote TmpType; typedef typename KernelArray::value_type Kernel; typedef typename Kernel::const_iterator KernelIter; int wo = send - s; int wn = dend - d; int wo2 = 2*wo - 2; int i; typename KernelArray::const_iterator kernel = kernels.begin(); for(i=0; i::zero(); int lbound = is - kernel->right(), hbound = is - kernel->left(); KernelIter k = kernel->center() + kernel->right(); if(lbound < 0 || hbound >= wo) { vigra_precondition(-lbound < wo && wo2 - hbound >= 0, "resamplingConvolveLine(): kernel or offset larger than image."); for(int m=lbound; m <= hbound; ++m, --k) { int mm = (m < 0) ? -m : (m >= wo) ? wo2 - m : m; sum += *k * src(s, mm); } } else { SrcIter ss = s + lbound; SrcIter ssend = s + hbound; for(; ss <= ssend; ++ss, --k) { sum += *k * src(ss); } } dest.set(sum, d); } } template void createResamplingKernels(Kernel const & kernel, MapCoordinate const & mapCoordinate, KernelArray & kernels) { for(unsigned int idest = 0; idest < kernels.size(); ++idest) { int isrc = mapCoordinate(idest); double idsrc = mapCoordinate.toDouble(idest); double offset = idsrc - isrc; double radius = kernel.radius(); int left = int(ceil(-radius - offset)); int right = int(floor(radius - offset)); kernels[idest].initExplicitly(left, right); double x = left + offset; for(int i = left; i <= right; ++i, ++x) kernels[idest][i] = kernel(x); kernels[idest].normalize(1.0, kernel.derivativeOrder(), offset); } } /** \brief Apply a resampling filter in the x-direction. This function implements a convolution operation in x-direction (i.e. applies a 1D filter to every row) where the width of the source and destination images differ. This is typically used to avoid aliasing if the image is scaled down, or to interpolate smoothly if the image is scaled up. The target coordinates are transformed into source coordinates by \code xsource = (xtarget - offset) / samplingRatio \endcode The samplingRatio and offset must be given as \ref vigra::Rational in order to avoid rounding errors in this transformation. It is required that for all pixels of the target image, xsource remains within the range of the source image (i.e. 0 <= xsource <= sourceWidth-1. Since xsource is in general not an integer, the kernel must be a functor that can be accessed at arbitrary (double) coordinates. It must also provide a member function radius() which specifies the support (non-zero interval) of the kernel. VIGRA already provides a number of suitable functors, e.g. \ref vigra::Gaussian, \ref vigra::BSpline \ref vigra::CatmullRomSpline, and \ref vigra::CoscotFunction. The function \ref resizeImageSplineInterpolation() is implemented by means resamplingConvolveX() and resamplingConvolveY(). Declarations: pass arguments explicitly: \code namespace vigra { template void resamplingConvolveX(SrcIter sul, SrcIter slr, SrcAcc src, DestIter dul, DestIter dlr, DestAcc dest, Kernel const & kernel, Rational const & samplingRatio, Rational const & offset); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void resamplingConvolveX(triple src, triple dest, Kernel const & kernel, Rational const & samplingRatio, Rational const & offset); } \endcode Usage: \#include \<vigra/resampling_convolution.hxx\> \code Rational ratio(2), offset(0); FImage src(w,h), dest(rational_cast(ratio*w), h); float sigma = 2.0; Gaussian smooth(sigma); ... // simpultaneously enlarge and smooth source image resamplingConvolveX(srcImageRange(src), destImageRange(dest), smooth, ratio, offset); \endcode Required Interface: \code Kernel kernel; int kernelRadius = kernel.radius(); double x = ...; // must be <= radius() double value = kernel(x); \endcode */ doxygen_overloaded_function(template <...> void resamplingConvolveX) template void resamplingConvolveX(SrcIter sul, SrcIter slr, SrcAcc src, DestIter dul, DestIter dlr, DestAcc dest, Kernel const & kernel, Rational const & samplingRatio, Rational const & offset) { int wold = slr.x - sul.x; int wnew = dlr.x - dul.x; vigra_precondition(!samplingRatio.is_inf() && samplingRatio > 0, "resamplingConvolveX(): sampling ratio must be > 0 and < infinity"); vigra_precondition(!offset.is_inf(), "resamplingConvolveX(): offset must be < infinity"); int period = lcm(samplingRatio.numerator(), samplingRatio.denominator()); resampling_detail::MapTargetToSourceCoordinate mapCoordinate(samplingRatio, offset); ArrayVector > kernels(period); createResamplingKernels(kernel, mapCoordinate, kernels); for(; sul.y < slr.y; ++sul.y, ++dul.y) { typename SrcIter::row_iterator sr = sul.rowIterator(); typename DestIter::row_iterator dr = dul.rowIterator(); resamplingConvolveLine(sr, sr+wold, src, dr, dr+wnew, dest, kernels, mapCoordinate); } } template inline void resamplingConvolveX(triple src, triple dest, Kernel const & kernel, Rational const & samplingRatio, Rational const & offset) { resamplingConvolveX(src.first, src.second, src.third, dest.first, dest.second, dest.third, kernel, samplingRatio, offset); } /********************************************************/ /* */ /* resamplingConvolveY */ /* */ /********************************************************/ /** \brief Apply a resampling filter in the y-direction. This function implements a convolution operation in y-direction (i.e. applies a 1D filter to every column) where the height of the source and destination images differ. This is typically used to avoid aliasing if the image is scaled down, or to interpolate smoothly if the image is scaled up. The target coordinates are transformed into source coordinates by \code ysource = (ytarget - offset) / samplingRatio \endcode The samplingRatio and offset must be given as \ref vigra::Rational in order to avoid rounding errors in this transformation. It is required that for all pixels of the target image, ysource remains within the range of the source image (i.e. 0 <= ysource <= sourceHeight-1. Since ysource is in general not an integer, the kernel must be a functor that can be accessed at arbitrary (double) coordinates. It must also provide a member function radius() which specifies the support (non-zero interval) of the kernel. VIGRA already provides a number of suitable functors, e.g. \ref vigra::Gaussian, \ref vigra::BSpline \ref vigra::CatmullRomSpline, and \ref vigra::CoscotFunction. The function \ref resizeImageSplineInterpolation() is implemented by means resamplingConvolveX() and resamplingConvolveY(). Declarations: pass arguments explicitly: \code namespace vigra { template void resamplingConvolveY(SrcIter sul, SrcIter slr, SrcAcc src, DestIter dul, DestIter dlr, DestAcc dest, Kernel const & kernel, Rational const & samplingRatio, Rational const & offset); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void resamplingConvolveY(triple src, triple dest, Kernel const & kernel, Rational const & samplingRatio, Rational const & offset); } \endcode Usage: \#include \<vigra/resampling_convolution.hxx\> \code Rational ratio(2), offset(0); FImage src(w,h), dest(w, rational_cast(ratio*h)); float sigma = 2.0; Gaussian smooth(sigma); ... // simpultaneously enlarge and smooth source image resamplingConvolveY(srcImageRange(src), destImageRange(dest), smooth, ratio, offset); \endcode Required Interface: \code Kernel kernel; int kernelRadius = kernel.radius(); double y = ...; // must be <= radius() double value = kernel(y); \endcode */ doxygen_overloaded_function(template <...> void resamplingConvolveY) template void resamplingConvolveY(SrcIter sul, SrcIter slr, SrcAcc src, DestIter dul, DestIter dlr, DestAcc dest, Kernel const & kernel, Rational const & samplingRatio, Rational const & offset) { int hold = slr.y - sul.y; int hnew = dlr.y - dul.y; vigra_precondition(!samplingRatio.is_inf() && samplingRatio > 0, "resamplingConvolveY(): sampling ratio must be > 0 and < infinity"); vigra_precondition(!offset.is_inf(), "resamplingConvolveY(): offset must be < infinity"); int period = lcm(samplingRatio.numerator(), samplingRatio.denominator()); resampling_detail::MapTargetToSourceCoordinate mapCoordinate(samplingRatio, offset); ArrayVector > kernels(period); createResamplingKernels(kernel, mapCoordinate, kernels); for(; sul.x < slr.x; ++sul.x, ++dul.x) { typename SrcIter::column_iterator sc = sul.columnIterator(); typename DestIter::column_iterator dc = dul.columnIterator(); resamplingConvolveLine(sc, sc+hold, src, dc, dc+hnew, dest, kernels, mapCoordinate); } } template inline void resamplingConvolveY(triple src, triple dest, Kernel const & kernel, Rational const & samplingRatio, Rational const & offset) { resamplingConvolveY(src.first, src.second, src.third, dest.first, dest.second, dest.third, kernel, samplingRatio, offset); } /********************************************************/ /* */ /* resamplingConvolveImage */ /* */ /********************************************************/ /** \brief Apply two separable resampling filters successively, the first in x-direction, the second in y-direction. This function is a shorthand for the concatenation of a call to \ref resamplingConvolveX() and \ref resamplingConvolveY() with the given kernels. See there for detailed documentation. Declarations: pass arguments explicitly: \code namespace vigra { template void resamplingConvolveImage(SrcIterator sul,SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, KernelX const & kx, Rational const & samplingRatioX, Rational const & offsetX, KernelY const & ky, Rational const & samplingRatioY, Rational const & offsetY); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void resamplingConvolveImage(triple src, triple dest, KernelX const & kx, Rational const & samplingRatioX, Rational const & offsetX, KernelY const & ky, Rational const & samplingRatioY, Rational const & offsetY); } \endcode Usage: \#include \<vigra/resampling_convolution.hxx\> \code Rational xratio(2), yratio(3), offset(0); FImage src(w,h), dest(rational_cast(xratio*w), rational_cast(yratio*h)); float sigma = 2.0; Gaussian smooth(sigma); ... // simpultaneously enlarge and smooth source image resamplingConvolveImage(srcImageRange(src), destImageRange(dest), smooth, xratio, offset, smooth, yratio, offset); \endcode */ doxygen_overloaded_function(template <...> void resamplingConvolveImage) template void resamplingConvolveImage(SrcIterator sul,SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, KernelX const & kx, Rational const & samplingRatioX, Rational const & offsetX, KernelY const & ky, Rational const & samplingRatioY, Rational const & offsetY) { typedef typename NumericTraits::RealPromote TmpType; BasicImage tmp(dlr.x - dul.x, slr.y - sul.y); resamplingConvolveX(srcIterRange(sul, slr, src), destImageRange(tmp), kx, samplingRatioX, offsetX); resamplingConvolveY(srcImageRange(tmp), destIterRange(dul, dlr, dest), ky, samplingRatioY, offsetY); } template inline void resamplingConvolveImage(triple src, triple dest, KernelX const & kx, Rational const & samplingRatioX, Rational const & offsetX, KernelY const & ky, Rational const & samplingRatioY, Rational const & offsetY) { resamplingConvolveImage(src.first, src.second, src.third, dest.first, dest.second, dest.third, kx, samplingRatioX, offsetX, ky, samplingRatioY, offsetY); } /** \brief Two-fold down-sampling for image pyramid construction. Sorry, no \ref detailedDocumentation() available yet. Declarations: \#include \<vigra/resampling_convolution.hxx\>
Namespace: vigra pass arguments explicitly: \code namespace vigra { template void pyramidReduceBurtFilter(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, double centerValue = 0.4); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void pyramidReduceBurtFilter(triple src, triple dest, double centerValue = 0.4); } \endcode use a \ref vigra::ImagePyramid : \code namespace vigra { template void pyramidReduceBurtFilter(ImagePyramid & pyramid, int fromLevel, int toLevel, double centerValue = 0.4); } \endcode */ doxygen_overloaded_function(template <...> void pyramidReduceBurtFilter) template void pyramidReduceBurtFilter(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, double centerValue = 0.4) { vigra_precondition(0.25 <= centerValue && centerValue <= 0.5, "pyramidReduceBurtFilter(): centerValue must be between 0.25 and 0.5."); int wold = slr.x - sul.x; int wnew = dlr.x - dul.x; int hold = slr.y - sul.y; int hnew = dlr.y - dul.y; Rational samplingRatio(1,2), offset(0); resampling_detail::MapTargetToSourceCoordinate mapCoordinate(samplingRatio, offset); ArrayVector > kernels(1); kernels[0].initExplicitly(-2, 2) = 0.25 - centerValue / 2.0, 0.25, centerValue, 0.25, 0.25 - centerValue / 2.0; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; typedef typename TmpImage::traverser TmpIterator; BasicImage tmp(wnew, hold); TmpIterator tul = tmp.upperLeft(); for(; sul.y < slr.y; ++sul.y, ++tul.y) { typename SrcIterator::row_iterator sr = sul.rowIterator(); typename TmpIterator::row_iterator tr = tul.rowIterator(); // FIXME: replace with reduceLineBurtFilter() resamplingConvolveLine(sr, sr+wold, src, tr, tr+wnew, tmp.accessor(), kernels, mapCoordinate); } tul = tmp.upperLeft(); for(; dul.x < dlr.x; ++dul.x, ++tul.x) { typename DestIterator::column_iterator dc = dul.columnIterator(); typename TmpIterator::column_iterator tc = tul.columnIterator(); resamplingConvolveLine(tc, tc+hold, tmp.accessor(), dc, dc+hnew, dest, kernels, mapCoordinate); } } template inline void pyramidReduceBurtFilter(triple src, triple dest, double centerValue = 0.4) { pyramidReduceBurtFilter(src.first, src.second, src.third, dest.first, dest.second, dest.third, centerValue); } template inline void pyramidReduceBurtFilter(ImagePyramid & pyramid, int fromLevel, int toLevel, double centerValue = 0.4) { vigra_precondition(fromLevel < toLevel, "pyramidReduceBurtFilter(): fromLevel must be smaller than toLevel."); vigra_precondition(pyramid.lowestLevel() <= fromLevel && toLevel <= pyramid.highestLevel(), "pyramidReduceBurtFilter(): fromLevel and toLevel must be between the lowest and highest pyramid levels (inclusive)."); for(int i=fromLevel+1; i <= toLevel; ++i) pyramidReduceBurtFilter(srcImageRange(pyramid[i-1]), destImageRange(pyramid[i]), centerValue); } /** \brief Two-fold up-sampling for image pyramid reconstruction. Sorry, no \ref detailedDocumentation() available yet. Declarations: \#include \<vigra/resampling_convolution.hxx\>
Namespace: vigra pass arguments explicitly: \code namespace vigra { template void pyramidExpandBurtFilter(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, double centerValue = 0.4); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void pyramidExpandBurtFilter(triple src, triple dest, double centerValue = 0.4); } \endcode use a \ref vigra::ImagePyramid : \code namespace vigra { template void pyramidExpandBurtFilter(ImagePyramid & pyramid, int fromLevel, int toLevel, double centerValue = 0.4); } \endcode */ doxygen_overloaded_function(template <...> void pyramidExpandBurtFilter) template void pyramidExpandBurtFilter(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestIterator dlr, DestAccessor dest, double centerValue = 0.4) { vigra_precondition(0.25 <= centerValue && centerValue <= 0.5, "pyramidExpandBurtFilter(): centerValue must be between 0.25 and 0.5."); int wold = slr.x - sul.x; int wnew = dlr.x - dul.x; int hold = slr.y - sul.y; int hnew = dlr.y - dul.y; Rational samplingRatio(2), offset(0); resampling_detail::MapTargetToSourceCoordinate mapCoordinate(samplingRatio, offset); ArrayVector > kernels(2); kernels[0].initExplicitly(-1, 1) = 0.5 - centerValue, 2.0*centerValue, 0.5 - centerValue; kernels[1].initExplicitly(-1, 0) = 0.5, 0.5; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; typedef typename TmpImage::traverser TmpIterator; BasicImage tmp(wnew, hold); TmpIterator tul = tmp.upperLeft(); for(; sul.y < slr.y; ++sul.y, ++tul.y) { typename SrcIterator::row_iterator sr = sul.rowIterator(); typename TmpIterator::row_iterator tr = tul.rowIterator(); // FIXME: replace with expandLineBurtFilter() resamplingConvolveLine(sr, sr+wold, src, tr, tr+wnew, tmp.accessor(), kernels, mapCoordinate); } tul = tmp.upperLeft(); for(; dul.x < dlr.x; ++dul.x, ++tul.x) { typename DestIterator::column_iterator dc = dul.columnIterator(); typename TmpIterator::column_iterator tc = tul.columnIterator(); resamplingConvolveLine(tc, tc+hold, tmp.accessor(), dc, dc+hnew, dest, kernels, mapCoordinate); } } template inline void pyramidExpandBurtFilter(triple src, triple dest, double centerValue = 0.4) { pyramidExpandBurtFilter(src.first, src.second, src.third, dest.first, dest.second, dest.third, centerValue); } template inline void pyramidExpandBurtFilter(ImagePyramid & pyramid, int fromLevel, int toLevel, double centerValue = 0.4) { vigra_precondition(fromLevel > toLevel, "pyramidExpandBurtFilter(): fromLevel must be larger than toLevel."); vigra_precondition(pyramid.lowestLevel() <= toLevel && fromLevel <= pyramid.highestLevel(), "pyramidExpandBurtFilter(): fromLevel and toLevel must be between the lowest and highest pyramid levels (inclusive)."); for(int i=fromLevel-1; i >= toLevel; --i) pyramidExpandBurtFilter(srcImageRange(pyramid[i+1]), destImageRange(pyramid[i]), centerValue); } /** \brief Create a Laplacian pyramid. Sorry, no \ref detailedDocumentation() available yet. \#include \<vigra/resampling_convolution.hxx\>
Namespace: vigra */ template inline void pyramidReduceBurtLaplacian(ImagePyramid & pyramid, int fromLevel, int toLevel, double centerValue = 0.4) { using namespace functor; pyramidReduceBurtFilter(pyramid, fromLevel, toLevel, centerValue); for(int i=fromLevel; i < toLevel; ++i) { typename ImagePyramid::value_type tmpImage(pyramid[i].size()); pyramidExpandBurtFilter(srcImageRange(pyramid[i+1]), destImageRange(tmpImage), centerValue); combineTwoImages(srcImageRange(tmpImage), srcImage(pyramid[i]), destImage(pyramid[i]), Arg1() - Arg2()); } } /** \brief Reconstruct a Laplacian pyramid. Sorry, no \ref detailedDocumentation() available yet. \#include \<vigra/resampling_convolution.hxx\>
Namespace: vigra */ template inline void pyramidExpandBurtLaplacian(ImagePyramid & pyramid, int fromLevel, int toLevel, double centerValue = 0.4) { using namespace functor; vigra_precondition(fromLevel > toLevel, "pyramidExpandBurtLaplacian(): fromLevel must be larger than toLevel."); vigra_precondition(pyramid.lowestLevel() <= toLevel && fromLevel <= pyramid.highestLevel(), "pyramidExpandBurtLaplacian(): fromLevel and toLevel must be between the lowest and highest pyramid levels (inclusive)."); for(int i=fromLevel-1; i >= toLevel; --i) { typename ImagePyramid::value_type tmpImage(pyramid[i].size()); pyramidExpandBurtFilter(srcImageRange(pyramid[i+1]), destImageRange(tmpImage), centerValue); combineTwoImages(srcImageRange(tmpImage), srcImage(pyramid[i]), destImage(pyramid[i]), Arg1() - Arg2()); } } //@} } // namespace vigra #endif /* VIGRA_RESAMPLING_CONVOLUTION_HXX */ gamera-3.3.3/include/vigra/resizeimage.hxx0000644000076500000000000014052411261456425017546 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_RESIZEIMAGE_HXX #define VIGRA_RESIZEIMAGE_HXX #include #include "utilities.hxx" #include "numerictraits.hxx" #include "stdimage.hxx" #include "recursiveconvolution.hxx" #include "separableconvolution.hxx" #include "resampling_convolution.hxx" #include "splines.hxx" namespace vigra { /*****************************************************************/ /* */ /* CoscotFunction */ /* */ /*****************************************************************/ /*! The Coscot interpolation function. Implements the Coscot interpolation function proposed by Maria Magnusson Seger (maria@isy.liu.se) in the context of tomographic reconstruction. It provides a fast transition between the pass- and stop-bands and minimal ripple outside the transition region. Both properties are important for this application and can be tuned by the parameters m and h (with defaults 3 and 0.5). The function is defined by \f[ f_{m,h}(x) = \left\{ \begin{array}{ll} \frac{1}{2m}\sin(\pi x)\cot(\pi x / (2 m))(h + (1-h)\cos(\pi x/m)) & |x| \leq m \\ 0 & \mbox{otherwise} \end{array}\right. \f] It can be used as a functor, and as a kernel for \ref resamplingConvolveImage() to create a differentiable interpolant of an image. \#include \<vigra/resizeimage.hxx\>
Namespace: vigra \ingroup MathFunctions */ template class CoscotFunction { public: /** the kernel's value type */ typedef T value_type; /** the unary functor's argument type */ typedef T argument_type; /** the splines polynomial order */ typedef T result_type; CoscotFunction(unsigned int m = 3, double h = 0.5) : m_(m), h_(h) {} /** function (functor) call */ result_type operator()(argument_type x) const { return x == 0.0 ? 1.0 : abs(x) < m_ ? VIGRA_CSTD::sin(M_PI*x) / VIGRA_CSTD::tan(M_PI * x / 2.0 / m_) * (h_ + (1.0 - h_) * VIGRA_CSTD::cos(M_PI * x / m_)) / 2.0 / m_ : 0.0; } /** index operator -- same as operator() */ value_type operator[](value_type x) const { return operator()(x); } /** Radius of the function's support. Needed for \ref resamplingConvolveImage(), equals m. */ double radius() const { return m_; } /** Derivative order of the function: always 0. */ unsigned int derivativeOrder() const { return 0; } /** Prefilter coefficients for compatibility with \ref vigra::BSpline. (array has zero length, since prefiltering is not necessary). */ ArrayVector const & prefilterCoefficients() const { static ArrayVector b; return b; } protected: unsigned int m_; double h_; }; /** \addtogroup GeometricTransformations Geometric Transformations Zoom up and down by repeating pixels, or using various interpolation schemes. See also: \ref resamplingConvolveImage(), \ref resampleImage(), \ref resizeMultiArraySplineInterpolation() \#include \<vigra/stdimagefunctions.hxx\>
or
\#include \<vigra/resizeimage.hxx\>
*/ //@{ /********************************************************/ /* */ /* resizeLineNoInterpolation */ /* */ /********************************************************/ template void resizeLineNoInterpolation(SrcIterator i1, SrcIterator iend, SrcAccessor as, DestIterator id, DestIterator idend, DestAccessor ad) { int wold = iend - i1; int wnew = idend - id; if(wnew == 1) { ad.set(as(i1), id); return; } double dx = (double)(wold - 1) / (wnew - 1); double x = 0.5; for(; id != idend; ++id, x += dx) { int ix = (int)x; ad.set(as(i1, ix), id); } } /********************************************************/ /* */ /* resizeImageNoInterpolation */ /* */ /********************************************************/ /** \brief Resize image by repeating the nearest pixel values. This algorithm is very fast and does not require any arithmetic on the pixel types. The range of both the input and output images (resp. regions) must be given. Both images must have a size of at least 2x2 pixels. The scaling factors are then calculated accordingly. Destination pixels are directly copied from the appropriate source pixels. The function uses accessors. Declarations: pass arguments explicitly: \code namespace vigra { template void resizeImageNoInterpolation( SrcImageIterator is, SrcImageIterator iend, SrcAccessor sa, DestImageIterator id, DestImageIterator idend, DestAccessor da) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void resizeImageNoInterpolation( triple src, triple dest) } \endcode Usage: \#include \<vigra/resizeimage.hxx\>
Namespace: vigra \code vigra::resizeImageNoInterpolation( src.upperLeft(), src.lowerRight(), src.accessor(), dest.upperLeft(), dest.lowerRight(), dest.accessor()); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft, src_lowerright; SrcAccessor src_accessor; DestAccessor dest_accessor; dest_accessor.set(src_accessor(src_upperleft), dest_upperleft); \endcode Preconditions: \code src_lowerright.x - src_upperleft.x > 1 src_lowerright.y - src_upperleft.y > 1 dest_lowerright.x - dest_upperleft.x > 1 dest_lowerright.y - dest_upperleft.y > 1 \endcode */ doxygen_overloaded_function(template <...> void resizeImageNoInterpolation) template void resizeImageNoInterpolation(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestIterator idend, DestAccessor da) { int w = iend.x - is.x; int h = iend.y - is.y; int wnew = idend.x - id.x; int hnew = idend.y - id.y; vigra_precondition((w > 1) && (h > 1), "resizeImageNoInterpolation(): " "Source image to small.\n"); vigra_precondition((wnew > 1) && (hnew > 1), "resizeImageNoInterpolation(): " "Destination image to small.\n"); typedef BasicImage TmpImage; typedef typename TmpImage::traverser TmpImageIterator; TmpImage tmp(w, hnew); TmpImageIterator yt = tmp.upperLeft(); for(int x=0; x inline void resizeImageNoInterpolation(triple src, triple dest) { resizeImageNoInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third); } /********************************************************/ /* */ /* resizeLineLinearInterpolation */ /* */ /********************************************************/ template void resizeLineLinearInterpolation(SrcIterator i1, SrcIterator iend, SrcAccessor as, DestIterator id, DestIterator idend, DestAccessor ad) { int wold = iend - i1; int wnew = idend - id; if((wold <= 1) || (wnew <= 1)) return; // oder error ? typedef NumericTraits DestTraits; typedef typename DestTraits::RealPromote RealPromote; ad.set(DestTraits::fromRealPromote(as(i1)), id); ++id; --iend, --idend; ad.set(DestTraits::fromRealPromote(as(iend)), idend); double dx = (double)(wold - 1) / (wnew - 1); double x = dx; for(; id != idend; ++id, x += dx) { if(x >= 1.0) { int xx = (int)x; i1 += xx; x -= (double)xx; } double x1 = 1.0 - x; ad.set(DestTraits::fromRealPromote(RealPromote(x1 * as(i1) + x * as(i1, 1))), id); } } /********************************************************/ /* */ /* resizeImageLinearInterpolation */ /* */ /********************************************************/ /** \brief Resize image using linear interpolation. The function uses the standard separable bilinear interpolation algorithm to obtain a good compromize between quality and speed. The range must of both the input and output images (resp. regions) must be given. Both images must have a size of at least 2x2. The scaling factors are then calculated accordingly. If the source image is larger than the destination, it is smoothed (band limited) using a recursive exponential filter. The source value_type (SrcAccessor::value_type) must be a linear space, i.e. it must support addition, multiplication with a scalar real number and \ref NumericTraits "NumericTraits". The function uses accessors. Declarations: pass arguments explicitly: \code namespace vigra { template void resizeImageLinearInterpolation( SrcImageIterator is, SrcImageIterator iend, SrcAccessor sa, DestImageIterator id, DestImageIterator idend, DestAccessor da) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void resizeImageLinearInterpolation( triple src, triple dest) } \endcode Usage: \#include \<vigra/resizeimage.hxx\>
Namespace: vigra \code vigra::resizeImageLinearInterpolation( src.upperLeft(), src.lowerRight(), src.accessor(), dest.upperLeft(), dest.lowerRight(), dest.accessor()); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft, src_lowerright; SrcAccessor src_accessor; DestAccessor dest_accessor; NumericTraits::RealPromote u = src_accessor(src_upperleft), v = src_accessor(src_upperleft, 1); double d; u = d * v; u = u + v; dest_accessor.set( NumericTraits::fromRealPromote(u), dest_upperleft); \endcode Preconditions: \code src_lowerright.x - src_upperleft.x > 1 src_lowerright.y - src_upperleft.y > 1 dest_lowerright.x - dest_upperleft.x > 1 dest_lowerright.y - dest_upperleft.y > 1 \endcode */ doxygen_overloaded_function(template <...> void resizeImageLinearInterpolation) template void resizeImageLinearInterpolation(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestIterator idend, DestAccessor da) { int w = iend.x - is.x; int h = iend.y - is.y; int wnew = idend.x - id.x; int hnew = idend.y - id.y; vigra_precondition((w > 1) && (h > 1), "resizeImageLinearInterpolation(): " "Source image to small.\n"); vigra_precondition((wnew > 1) && (hnew > 1), "resizeImageLinearInterpolation(): " "Destination image to small.\n"); double const scale = 2.0; typedef typename SrcAccessor::value_type SRCVT; typedef typename NumericTraits::RealPromote TMPTYPE; typedef BasicImage TmpImage; typedef typename TmpImage::traverser TmpImageIterator; BasicImage tmp(w, hnew); BasicImage line((h > w) ? h : w, 1); int x,y; typename BasicImage::Iterator yt = tmp.upperLeft(); typename TmpImageIterator::row_iterator lt = line.upperLeft().rowIterator(); for(x=0; x inline void resizeImageLinearInterpolation(triple src, triple dest) { resizeImageLinearInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third); } /***************************************************************/ /* */ /* resizeImageSplineInterpolation */ /* */ /***************************************************************/ /** \brief Resize image using B-spline interpolation. The function implements separable spline interpolation algorithm described in M. Unser, A. Aldroubi, M. Eden, "B-Spline Signal Processing" IEEE Transactions on Signal Processing, vol. 41, no. 2, pp. 821-833 (part I), pp. 834-848 (part II), 1993. to obtain optimal interpolation quality and speed. You may pass the funcion a spline of arbitrary order (e.g. BSpline or CatmullRomSpline). The default is a third order spline which gives a twice continuously differentiable interpolant. The implementation ensures that image values are interpolated rather than smoothed by first calling a recursive (sharpening) prefilter as described in the above paper. Then the actual interpolation is done using \ref resamplingConvolveLine(). The range of both the input and output images (resp. regions) must be given. The input image must have a size of at least 4x4, the destination of at least 2x2. The scaling factors are then calculated accordingly. If the source image is larger than the destination, it is smoothed (band limited) using a recursive exponential filter. The source value_type (SrcAccessor::value_type) must be a linear algebra, i.e. it must support addition, subtraction, and multiplication (+, -, *), multiplication with a scalar real number and \ref NumericTraits "NumericTraits". The function uses accessors. Declarations: pass arguments explicitly: \code namespace vigra { template void resizeImageSplineInterpolation( SrcImageIterator is, SrcImageIterator iend, SrcAccessor sa, DestImageIterator id, DestImageIterator idend, DestAccessor da, SPLINE spline = BSpline<3, double>()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void resizeImageSplineInterpolation( triple src, triple dest, SPLINE spline = BSpline<3, double>()) } \endcode Usage: \#include \<vigra/resizeimage.hxx\>
Namespace: vigra \code vigra::resizeImageSplineInterpolation( src.upperLeft(), src.lowerRight(), src.accessor(), dest.upperLeft(), dest.lowerRight(), dest.accessor()); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft, src_lowerright; SrcAccessor src_accessor; DestAccessor dest_accessor; NumericTraits::RealPromote u = src_accessor(src_upperleft), v = src_accessor(src_upperleft, 1); double d; u = d * v; u = u + v; u = u - v; u = u * v; u += v; u -= v; dest_accessor.set( NumericTraits::fromRealPromote(u), dest_upperleft); \endcode Preconditions: \code src_lowerright.x - src_upperleft.x > 3 src_lowerright.y - src_upperleft.y > 3 dest_lowerright.x - dest_upperleft.x > 1 dest_lowerright.y - dest_upperleft.y > 1 \endcode */ doxygen_overloaded_function(template <...> void resizeImageSplineInterpolation) template void resizeImageSplineInterpolation( SrcIterator src_iter, SrcIterator src_iter_end, SrcAccessor src_acc, DestIterator dest_iter, DestIterator dest_iter_end, DestAccessor dest_acc, SPLINE const & spline) { int width_old = src_iter_end.x - src_iter.x; int height_old = src_iter_end.y - src_iter.y; int width_new = dest_iter_end.x - dest_iter.x; int height_new = dest_iter_end.y - dest_iter.y; vigra_precondition((width_old > 1) && (height_old > 1), "resizeImageSplineInterpolation(): " "Source image to small.\n"); vigra_precondition((width_new > 1) && (height_new > 1), "resizeImageSplineInterpolation(): " "Destination image to small.\n"); Rational xratio(width_new - 1, width_old - 1); Rational yratio(height_new - 1, height_old - 1); Rational offset(0); resampling_detail::MapTargetToSourceCoordinate xmapCoordinate(xratio, offset); resampling_detail::MapTargetToSourceCoordinate ymapCoordinate(yratio, offset); int xperiod = lcm(xratio.numerator(), xratio.denominator()); int yperiod = lcm(yratio.numerator(), yratio.denominator()); double const scale = 2.0; typedef typename SrcAccessor::value_type SRCVT; typedef typename NumericTraits::RealPromote TMPTYPE; typedef BasicImage TmpImage; typedef typename TmpImage::traverser TmpImageIterator; BasicImage tmp(width_old, height_new); BasicImage line((height_old > width_old) ? height_old : width_old, 1); typename BasicImage::Accessor tmp_acc = tmp.accessor(); ArrayVector const & prefilterCoeffs = spline.prefilterCoefficients(); int x,y; ArrayVector > kernels(yperiod); createResamplingKernels(spline, ymapCoordinate, kernels); typename BasicImage::Iterator y_tmp = tmp.upperLeft(); typename TmpImageIterator::row_iterator line_tmp = line.upperLeft().rowIterator(); for(x=0; x= height_old) { resamplingConvolveLine(c_src, c_src + height_old, src_acc, c_tmp, c_tmp + height_new, tmp_acc, kernels, ymapCoordinate); } else { recursiveSmoothLine(c_src, c_src + height_old, src_acc, line_tmp, line.accessor(), (double)height_old/height_new/scale); resamplingConvolveLine(line_tmp, line_tmp + height_old, line.accessor(), c_tmp, c_tmp + height_new, tmp_acc, kernels, ymapCoordinate); } } else { recursiveFilterLine(c_src, c_src + height_old, src_acc, line_tmp, line.accessor(), prefilterCoeffs[0], BORDER_TREATMENT_REFLECT); for(unsigned int b = 1; b < prefilterCoeffs.size(); ++b) { recursiveFilterLine(line_tmp, line_tmp + height_old, line.accessor(), line_tmp, line.accessor(), prefilterCoeffs[b], BORDER_TREATMENT_REFLECT); } if(height_new < height_old) { recursiveSmoothLine(line_tmp, line_tmp + height_old, line.accessor(), line_tmp, line.accessor(), (double)height_old/height_new/scale); } resamplingConvolveLine(line_tmp, line_tmp + height_old, line.accessor(), c_tmp, c_tmp + height_new, tmp_acc, kernels, ymapCoordinate); } } y_tmp = tmp.upperLeft(); DestIterator dest = dest_iter; kernels.resize(xperiod); createResamplingKernels(spline, xmapCoordinate, kernels); for(y=0; y < height_new; ++y, ++y_tmp.y, ++dest_iter.y) { typename DestIterator::row_iterator r_dest = dest_iter.rowIterator(); typename TmpImageIterator::row_iterator r_tmp = y_tmp.rowIterator(); if(prefilterCoeffs.size() == 0) { if(width_new >= width_old) { resamplingConvolveLine(r_tmp, r_tmp + width_old, tmp.accessor(), r_dest, r_dest + width_new, dest_acc, kernels, xmapCoordinate); } else { recursiveSmoothLine(r_tmp, r_tmp + width_old, tmp.accessor(), line_tmp, line.accessor(), (double)width_old/width_new/scale); resamplingConvolveLine(line_tmp, line_tmp + width_old, line.accessor(), r_dest, r_dest + width_new, dest_acc, kernels, xmapCoordinate); } } else { recursiveFilterLine(r_tmp, r_tmp + width_old, tmp.accessor(), line_tmp, line.accessor(), prefilterCoeffs[0], BORDER_TREATMENT_REFLECT); for(unsigned int b = 1; b < prefilterCoeffs.size(); ++b) { recursiveFilterLine(line_tmp, line_tmp + width_old, line.accessor(), line_tmp, line.accessor(), prefilterCoeffs[b], BORDER_TREATMENT_REFLECT); } if(width_new < width_old) { recursiveSmoothLine(line_tmp, line_tmp + width_old, line.accessor(), line_tmp, line.accessor(), (double)width_old/width_new/scale); } resamplingConvolveLine(line_tmp, line_tmp + width_old, line.accessor(), r_dest, r_dest + width_new, dest_acc, kernels, xmapCoordinate); } } } template inline void resizeImageSplineInterpolation(triple src, triple dest, SPLINE const & spline) { resizeImageSplineInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third, spline); } template void resizeImageSplineInterpolation(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestIterator idend, DestAccessor da) { resizeImageSplineInterpolation(is, iend, sa, id, idend, da, BSpline<3, double>()); } template inline void resizeImageSplineInterpolation(triple src, triple dest) { resizeImageSplineInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third); } /*****************************************************************/ /* */ /* resizeImageCatmullRomInterpolation */ /* */ /*****************************************************************/ /** \brief Resize image using the Catmull/Rom interpolation function. The function calls like \ref resizeImageSplineInterpolation() with \ref vigra::CatmullRomSpline as an interpolation kernel. The interpolated function has one continuous derivative. (See \ref resizeImageSplineInterpolation() for more documentation) Declarations: pass arguments explicitly: \code namespace vigra { template void resizeImageCatmullRomInterpolation(SrcIterator src_iter, SrcIterator src_iter_end, SrcAccessor src_acc, DestIterator dest_iter, DestIterator dest_iter_end, DestAccessor dest_acc); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void resizeImageCatmullRomInterpolation(triple src, triple dest); } \endcode \#include \<vigra/resizeimage.hxx\>
Namespace: vigra */ doxygen_overloaded_function(template <...> void resizeImageCatmullRomInterpolation) template inline void resizeImageCatmullRomInterpolation(SrcIterator src_iter, SrcIterator src_iter_end, SrcAccessor src_acc, DestIterator dest_iter, DestIterator dest_iter_end, DestAccessor dest_acc) { resizeImageSplineInterpolation(src_iter, src_iter_end, src_acc, dest_iter, dest_iter_end, dest_acc, CatmullRomSpline()); } template inline void resizeImageCatmullRomInterpolation(triple src, triple dest) { resizeImageCatmullRomInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third); } #if 0 /*****************************************************************/ /* */ /* resizeImageCubicInterpolation */ /* */ /*****************************************************************/ /** \brief Resize image using the cardinal B-spline interpolation function. The function calls like \ref resizeImageSplineInterpolation() with \ref vigra::BSpline<3, double> and prefiltering as an interpolation kernel. The interpolated function has two continuous derivatives. (See \ref resizeImageSplineInterpolation() for more documentation) \#include \<vigra/resizeimage.hxx\>
Namespace: vigra */ template void resizeImageCubicInterpolation(SrcIterator src_iter, SrcIterator src_iter_end, SrcAccessor src_acc, DestIterator dest_iter, DestIterator dest_iter_end, DestAccessor dest_acc) { resizeImageSplineInterpolation(src_iter, src_iter_end, src_acc, dest_iter, dest_iter_end, dest_acc, BSpline<3, double>()); } template inline void resizeImageCubicInterpolation(triple src, triple dest) { resizeImageCubicInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third); } #endif /*****************************************************************/ /* */ /* resizeImageCoscotInterpolation */ /* */ /*****************************************************************/ /** \brief Resize image using the Coscot interpolation function. The function calls \ref resizeImageSplineInterpolation() with \ref vigra::CoscotFunction as an interpolation kernel. The interpolated function has one continuous derivative. (See \ref resizeImageSplineInterpolation() for more documentation) Declarations: pass arguments explicitly: \code namespace vigra { template void resizeImageCoscotInterpolation(SrcIterator src_iter, SrcIterator src_iter_end, SrcAccessor src_acc, DestIterator dest_iter, DestIterator dest_iter_end, DestAccessor dest_acc); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void resizeImageCoscotInterpolation(triple src, triple dest); } \endcode \#include \<vigra/resizeimage.hxx\>
Namespace: vigra */ doxygen_overloaded_function(template <...> void resizeImageCoscotInterpolation) template void resizeImageCoscotInterpolation(SrcIterator src_iter, SrcIterator src_iter_end, SrcAccessor src_acc, DestIterator dest_iter, DestIterator dest_iter_end, DestAccessor dest_acc) { resizeImageSplineInterpolation(src_iter, src_iter_end, src_acc, dest_iter, dest_iter_end, dest_acc, CoscotFunction()); } template inline void resizeImageCoscotInterpolation(triple src, triple dest) { resizeImageCoscotInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third); } #if 0 // old version of the spline interpolation algorithm /********************************************************/ /* */ /* resizeCalculateSplineCoefficients */ /* (internally used by resize functions) */ /* */ /********************************************************/ template void resizeCalculateSplineCoefficients(SrcIterator i1, SrcIterator iend, SrcAccessor a, VALUETYPE * i2) { int n = iend - i1; if(n <= 0) return; VALUETYPE zero = NumericTraits::zero(); VALUETYPE two = 2.0 * NumericTraits::one(); VALUETYPE half = 0.5 * NumericTraits::one(); *i2 = zero; if(n == 1) return; std::vector vec(n); typename std::vector::iterator u = vec.begin(); *u = zero; for(++i1, ++i2, ++u, --iend; i1 != iend; ++i1, ++i2, ++u) { VALUETYPE p = 0.5 * i2[-1] + two; *i2 = half / p; *u = 3.0 *(a(i1,1) - 2.0 * a(i1) + a(i1, -1)) - 0.5 * u[-1] / p; } *i2 = zero; for(--i2, --u; u != vec; --u, --i2) { *i2 = *i2 * i2[1] + *u; } } /********************************************************/ /* */ /* resizeImageInternalSplineGradient */ /* */ /********************************************************/ template void resizeImageInternalSplineGradient(SrcIterator in, SrcIterator inend, SrcAccessor sa, DoubleIterator tmp, TempIterator r, DestIterator id) { int w = inend - in; int x; typedef typename SrcAccessor::value_type SRCVT; typedef typename NumericTraits::RealPromote TMPTYPE; // calculate border derivatives SrcIterator xs = in; TMPTYPE p0 = -11.0/6.0 * sa(xs); ++xs; p0 += 3.0 * sa(xs); ++xs; p0 += -1.5 * sa(xs); ++xs; p0 += 1.0/3.0 * sa(xs); xs = in + w-1; TMPTYPE pw = 11.0/6.0 * sa(xs); --xs; pw += -3.0 * sa(xs); --xs; pw += 1.5 * sa(xs); --xs; pw += -1.0/3.0 * sa(xs); xs = in + 2; SrcIterator xs1 = in; for(x=1; x=1; --x) { id[x] -= tmp[x+1]*id[x+1]; } } /********************************************************/ /* */ /* resizeImageInternalSplineInterpolation */ /* */ /********************************************************/ template void resizeImageInternalSplineInterpolation(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestIterator idend, DestAccessor da) { int w = iend.x - is.x; int h = iend.y - is.y; int wnew = idend.x - id.x; int hnew = idend.y - id.y; typedef typename SrcAccessor::value_type SRCVT; typedef typename NumericTraits::RealPromote TMPTYPE; typedef typename BasicImage::Iterator TMPITER; typedef NumericTraits DestTraits; BasicImage dx(w,h); BasicImage dy(w,h); BasicImage dxy(w,h); BasicImage W(4,4), W1(4,4); std::vector R(w > h ? w : h); std::vector tmp(w > h ? w : h); typename BasicImage::Accessor ta; SrcIterator in = is; TMPITER idx = dx.upperLeft(); TMPITER idy = dy.upperLeft(); TMPITER idxy = dxy.upperLeft(); typename std::vector::iterator r = R.begin(); typename std::vector::iterator it = tmp.begin(); double ig[] = { 1.0, 0.0, -3.0, 2.0, 0.0, 1.0, -2.0, 1.0, 0.0, 0.0, 3.0, -2.0, 0.0, 0.0, -1.0, 1.0 }; int x, y, i, j, k; // calculate x derivatives for(y=0; y= 1.0) continue; int y1 = y+1; double v = ov; double ou = 0.0; int ox = 0; int xx = ox; SrcIterator xs = in; for(x=0; x= 1.0) continue; int x1 = x+1; double u = ou; DestIterator xd = id + Diff2D(ox,oy); W[0][0] = sa(xs); W[0][1] = dy(x, y); W[0][2] = sa(xs, down); W[0][3] = dy(x, y1); W[1][0] = dx(x, y); W[1][1] = dxy(x, y); W[1][2] = dx(x, y1); W[1][3] = dxy(x, y1); W[2][0] = sa(xs, right); W[2][1] = dy(x1,y); W[2][2] = sa(xs, downright); W[2][3] = dy(x1, y1); W[3][0] = dx(x1, y); W[3][1] = dxy(x1, y); W[3][2] = dx(x1, y1); W[3][3] = dxy(x1, y1); for(i=0; i<4; ++i) { for(j=0; j<4; ++j) { W1[j][i] = ig[j] * W[0][i]; for(k=1; k<4; ++k) { W1[j][i] += ig[j+4*k] * W[k][i]; } } } for(i=0; i<4; ++i) { for(j=0; j<4; ++j) { W[j][i] = ig[i] * W1[j][0]; for(k=1; k<4; ++k) { W[j][i] += ig[4*k+i] * W1[j][k]; } } } TMPTYPE a1,a2,a3,a4; yyd = xd; for(v=ov, yy=oy; v<1.0; v+=dv, ++yyd.y, ++yy) { a1 = W[0][0] + v * (W[0][1] + v * (W[0][2] + v * W[0][3])); a2 = W[1][0] + v * (W[1][1] + v * (W[1][2] + v * W[1][3])); a3 = W[2][0] + v * (W[2][1] + v * (W[2][2] + v * W[2][3])); a4 = W[3][0] + v * (W[3][1] + v * (W[3][2] + v * W[3][3])); xxd = yyd; for(u=ou, xx=ox; u<1.0; u+=du, ++xxd.x, ++xx) { da.set(DestTraits::fromRealPromote(a1 + u * (a2 + u * (a3 + u * a4))), xxd); } if(xx == wnew-1) { da.set(DestTraits::fromRealPromote(a1 + a2 + a3 + a4), xxd); } } if(yy == hnew-1) { a1 = W[0][0] + W[0][1] + W[0][2] + W[0][3]; a2 = W[1][0] + W[1][1] + W[1][2] + W[1][3]; a3 = W[2][0] + W[2][1] + W[2][2] + W[2][3]; a4 = W[3][0] + W[3][1] + W[3][2] + W[3][3]; DestIterator xxd = yyd; for(u=ou, xx=ox; u<1.0; u+=du, ++xxd.x, ++xx) { da.set(DestTraits::fromRealPromote(a1 + u * (a2 + u * (a3 + u * a4))), xxd); } if(xx == wnew-1) { da.set(DestTraits::fromRealPromote(a1 + a2 + a3 + a4), xxd); } } ou = u; ox = xx; } ov = v; oy = yy; } } template void resizeImageSplineInterpolation(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestIterator idend, DestAccessor da) { int w = iend.x - is.x; int h = iend.y - is.y; int wnew = idend.x - id.x; int hnew = idend.y - id.y; vigra_precondition((w > 3) && (h > 3), "resizeImageSplineInterpolation(): " "Source image to small.\n"); vigra_precondition((wnew > 1) && (hnew > 1), "resizeImageSplineInterpolation(): " "Destination image to small.\n"); double scale = 2.0; if(wnew < w || hnew < h) { typedef typename SrcAccessor::value_type SRCVT; typedef typename NumericTraits::RealPromote TMPTYPE; typedef typename BasicImage::Iterator TMPITER; BasicImage t(w,h); TMPITER it = t.upperLeft(); if(wnew < w) { recursiveSmoothX(is, iend, sa, it, t.accessor(), (double)w/wnew/scale); if(hnew < h) { recursiveSmoothY(it, t.lowerRight(), t.accessor(), it, t.accessor(), (double)h/hnew/scale); } } else { recursiveSmoothY(is, iend, sa, it, t.accessor(), (double)h/hnew/scale); } resizeImageInternalSplineInterpolation(it, t.lowerRight(), t.accessor(), id, idend, da); } else { resizeImageInternalSplineInterpolation(is, iend, sa, id, idend, da); } } template inline void resizeImageSplineInterpolation(triple src, triple dest) { resizeImageSplineInterpolation(src.first, src.second, src.third, dest.first, dest.second, dest.third); } #endif // old alghorithm version //@} } // namespace vigra #endif // VIGRA_RESIZEIMAGE_HXX gamera-3.3.3/include/vigra/rfftw.hxx0000644000076500000000000002141411261456425016366 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_RFFTW_HXX #define VIGRA_RFFTW_HXX #include "array_vector.hxx" #include "fftw.hxx" #include namespace vigra { namespace detail { struct FFTWSinCosConfig { ArrayVector twiddles; ArrayVector fftwInput; ArrayVector fftwTmpResult; fftw_real norm; rfftwnd_plan fftwPlan; }; template void cosineTransformLineImpl(SrcIterator s, SrcIterator send, SrcAccessor src, DestIterator d, DestAccessor dest, Config & config) { int size = send - s; int ns2 = size / 2; int nm1 = size - 1; int modn = size % 2; if(size <= 0) return; fftw_real const * twiddles = config.twiddles.begin(); fftw_real * fftwInput = config.fftwInput.begin(); fftw_complex * fftwTmpResult = config.fftwTmpResult.begin(); fftw_real norm = config.norm; rfftwnd_plan fftwPlan = config.fftwPlan; switch(size) { case 1: { dest.set(src(s) / norm, d); break; } case 2: { dest.set((src(s) + src(s, 1)) / norm, d); dest.set((src(s) - src(s, 1)) / norm, d, 1); break; } case 3: { fftw_real x1p3 = src(s) + src(s, 2); fftw_real tx2 = 2.0 * src(s, 1); dest.set((x1p3 + tx2) / norm, d, 0); dest.set((src(s) - src(s, 2)) / norm, d, 1); dest.set((x1p3 - tx2) / norm, d, 2); break; } default: { fftw_real c1 = src(s) - src(s, nm1); fftwInput[0] = src(s) + src(s, nm1); for(int k=1; k void cosineTransformX(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { int w = slr.x - sul.x; int h = slr.y - sul.y; detail::FFTWSinCosConfig config; // horizontal transformation int ns2 = w / 2; int nm1 = w - 1; int modn = w % 2; config.twiddles.resize(w+1); config.fftwInput.resize(w+1); config.fftwTmpResult.resize(w+1); config.norm = norm; config.fftwPlan = rfftw2d_create_plan(1, nm1, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE ); fftw_real dt = M_PI / nm1; for(int k=1; k void cosineTransformY(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { int w = slr.x - sul.x; int h = slr.y - sul.y; detail::FFTWSinCosConfig config; // horizontal transformation int ns2 = h / 2; int nm1 = h - 1; int modn = h % 2; config.twiddles.resize(h + 1); config.fftwInput.resize(h + 1); config.fftwTmpResult.resize(h + 1); config.norm = norm; config.fftwPlan = rfftw2d_create_plan(1, nm1, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE ); fftw_real dt = M_PI / nm1; for(int k=1; k inline void realFourierTransformXEvenYEven(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { BasicImage tmp(slr - sul); cosineTransformX(sul, slr, src, tmp.upperLeft(), tmp.accessor(), 1.0); cosineTransformY(tmp.upperLeft(), tmp.lowerRight(), tmp.accessor(), dul, dest, norm); } template inline void realFourierTransformXEvenYEven(triple src, pair dest, fftw_real norm) { realFourierTransformXEvenYEven(src.first, src.second, src.third, dest.first, dest.second, norm); } } // namespace vigra #endif // VIGRA_RFFTW_HXX gamera-3.3.3/include/vigra/rgbvalue.hxx0000644000076500000000000011731111261456425017047 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_RGBVALUE_HXX #define VIGRA_RGBVALUE_HXX #include // abs(double) #include // abs(int) #include "config.hxx" #include "numerictraits.hxx" #include "accessor.hxx" #include "tinyvector.hxx" #include "static_assert.hxx" namespace vigra { namespace detail { template struct SelectColorIndexRHS; template struct SelectColorIndexRHS<0, R, G, B> { enum { res = R }; }; template struct SelectColorIndexRHS<1, R, G, B> { enum { res = G }; }; template struct SelectColorIndexRHS<2, R, G, B> { enum { res = B }; }; } // namespace detail #ifndef DOXYGEN template struct RGBValue_bad_color_indices : staticAssert::AssertBool<(R < 3 && G < 3 && B < 3 && ((1 << R) + (1 << G) + (1 << B) == 7))> {}; #endif /* DOXYGEN */ /********************************************************/ /* */ /* RGBValue */ /* */ /********************************************************/ /** \brief Class for a single RGB value. This class contains three values (of the specified type) that represent red, green, and blue color channels. By means of the template parameters RED_IDX, GREEN_IDX, BLUE_IDX, the indices 0, 1, 2 can be assigned to the three colors arbitrarily, so that, for example, a BGR type can be created as \code typedef RGBValue BGRValue; \endcode The standard order red=0, green=1, blue=2 is the default. There are three possibilities to access the color values: accessor functions (\ref red(), \ref green(), \ref blue()), index operator (operator[](dx), where the rgb[RED_IDX] returns red etc.) and iterator (STL-compatible random access iterator that references the three colors in turn). The latter two methods, together with the necessary embedded typedefs, ensure compatibility of a RGBValue with a STL vector. \ref RGBValueOperators "Arithmetic operations" are defined as component-wise applications of these operations. Addition, subtraction, and multiplication of two RGBValues (+=, -=, *=, +, -, *, unary -), multiplication and division of an RGBValue with a double, and NumericTraits/PromoteTraits are defined, so that RGBValue fulfills the requirements of a \ref LinearAlgebraConcept "Linear Algebra". A number of \ref RGBValueAccessors "accessors" are provided that support access to RGBValues as a whole, to a selected color component, or to the luminance value. \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra */ template class RGBValue : public TinyVector { typedef TinyVector Base; // inverse mapping from index to color enum { IDX0 = (RED_IDX == 0) ? 0 : (GREEN_IDX == 0) ? 1 : 2, IDX1 = (RED_IDX == 1) ? 0 : (GREEN_IDX == 1) ? 1 : 2, IDX2 = (RED_IDX == 2) ? 0 : (GREEN_IDX == 2) ? 1 : 2 }; public: /** STL-compatible definition of valuetype */ typedef typename Base::value_type value_type; /** STL-compatible definition of iterator */ typedef typename Base::iterator iterator; /** STL-compatible definition of const iterator */ typedef typename Base::const_iterator const_iterator; /** squared norm type (result of squaredManitude()) */ typedef typename Base::SquaredNormType SquaredNormType; /** norm type (result of magnitude()) */ typedef typename Base::NormType NormType; /** Color index positions */ enum { RedIdx = RED_IDX, GreenIdx = GREEN_IDX, BlueIdx = BLUE_IDX }; /** Construct from explicit color values. \a first, \a second, \a third are written in this order, irrespective of how the color indices are specified. */ RGBValue(value_type first, value_type second, value_type third) : Base(first, second, third) { VIGRA_STATIC_ASSERT((RGBValue_bad_color_indices)); } /** Construct gray value */ RGBValue(value_type gray) : Base(gray, gray, gray) { VIGRA_STATIC_ASSERT((RGBValue_bad_color_indices)); } /** Construct from another sequence (must have length 3!) */ template RGBValue(Iterator i, Iterator end) : Base(i[0], i[1], i[2]) { VIGRA_STATIC_ASSERT((RGBValue_bad_color_indices)); } /** Default constructor (sets all components to 0) */ RGBValue() : Base(0, 0, 0) { VIGRA_STATIC_ASSERT((RGBValue_bad_color_indices)); } #if !defined(TEMPLATE_COPY_CONSTRUCTOR_BUG) RGBValue(RGBValue const & r) : Base(r) { VIGRA_STATIC_ASSERT((RGBValue_bad_color_indices)); } RGBValue & operator=(RGBValue const & r) { Base::operator=(r); return *this; } #endif // TEMPLATE_COPY_CONSTRUCTOR_BUG /** Copy constructor. */ template RGBValue(RGBValue const & r) : Base(detail::RequiresExplicitCast::cast(r[detail::SelectColorIndexRHS::res]), detail::RequiresExplicitCast::cast(r[detail::SelectColorIndexRHS::res]), detail::RequiresExplicitCast::cast(r[detail::SelectColorIndexRHS::res])) { VIGRA_STATIC_ASSERT((RGBValue_bad_color_indices)); } /** Copy assignment. */ template RGBValue & operator=(RGBValue const & r) { setRed(detail::RequiresExplicitCast::cast(r.red())); setGreen(detail::RequiresExplicitCast::cast(r.green())); setBlue(detail::RequiresExplicitCast::cast(r.blue())); return *this; } /** construct from TinyVector */ RGBValue(TinyVector const & r) : Base(r) { VIGRA_STATIC_ASSERT((RGBValue_bad_color_indices)); } /** assign TinyVector. */ RGBValue & operator=(TinyVector const & r) { Base::operator=(r); return *this; } /** Unary negation (construct RGBValue with negative values) */ RGBValue operator-() const { return RGBValue(-red(), -green(), -blue()); } /** Access red component. */ value_type & red() { return (*this)[RED_IDX]; } /** Access green component. */ value_type & green() { return (*this)[GREEN_IDX]; } /** Access blue component. */ value_type & blue() { return (*this)[BLUE_IDX]; } /** Get red component. */ value_type const & red() const { return (*this)[RED_IDX]; } /** Get green component. */ value_type const & green() const { return (*this)[GREEN_IDX]; } /** Get blue component. */ value_type const & blue() const { return (*this)[BLUE_IDX]; } /** Calculate luminance. */ value_type luminance() const { return detail::RequiresExplicitCast::cast(0.3*red() + 0.59*green() + 0.11*blue()); } /** Calculate magnitude. */ NormType magnitude() const { return Base::magnitude(); } /** Calculate squared magnitude. */ SquaredNormType squaredMagnitude() const { return Base::squaredMagnitude(); } /** Set red component. The type V of the passed in value is automatically converted to VALUETYPE. */ template void setRed(V value) { (*this)[RED_IDX] = detail::RequiresExplicitCast::cast(value); } /** Set green component.The type V of the passed in value is automatically converted to VALUETYPE. */ template void setGreen(V value) { (*this)[GREEN_IDX] = detail::RequiresExplicitCast::cast(value); } /** Set blue component.The type V of the passed in value is automatically converted to VALUETYPE. */ template void setBlue(V value) { (*this)[BLUE_IDX] = detail::RequiresExplicitCast::cast(value); } template void setRGB(V r, V g, V b) { (*this)[RED_IDX] = detail::RequiresExplicitCast::cast(r); (*this)[GREEN_IDX] = detail::RequiresExplicitCast::cast(g); (*this)[BLUE_IDX] = detail::RequiresExplicitCast::cast(b); } }; /********************************************************/ /* */ /* RGBValue Comparison */ /* */ /********************************************************/ /** \addtogroup RGBValueOperators Functions for RGBValue \brief Implement basic arithmetic and equality for RGBValue. These functions fulfill the requirements of a Linear Algebra. Return types are determined according to \ref RGBValueTraits. \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra

*/ //@{ /// component-wise equal template inline bool operator==(RGBValue const & l, RGBValue const & r) { return (l.red() == r.red()) && (l.green() == r.green()) && (l.blue() == r.blue()); } /// component-wise not equal template inline bool operator!=(RGBValue const & l, RGBValue const & r) { return (l.red() != r.red()) || (l.green() != r.green()) || (l.blue() != r.blue()); } //@} /********************************************************/ /* */ /* RGBValue-Traits */ /* */ /********************************************************/ /** \page RGBValueTraits Numeric and Promote Traits of RGBValue The numeric and promote traits for RGBValues follow the general specifications for \ref NumericPromotionTraits. They are implemented in terms of the traits of the basic types by partial template specialization. Note that PromoteTraits are only defined for the case that the color indices are the same in both RGBValues. \code template struct NumericTraits > { typedef RGBValue Type; typedef RGBValue::Promote, R, G, B> Promote; typedef RGBValue::RealPromote, R, G, B> RealPromote; typedef RGBValue::ComplexPromote, R, G, B> ComplexPromote; typedef T ValueType; typedef typename NumericTraits::isIntegral isIntegral; typedef VigraFalseType isScalar; typedef typename NumericTraits::isSigned isSigned; // etc. }; template struct NormTraits > { typedef RGBValue Type; typedef typename Type::SquaredNormType SquaredNormType; typedef typename Type::NormType NormType; }; template struct PromoteTraits, RGBValue > { typedef RGBValue::Promote, R, G, B> Promote; }; template struct PromoteTraits, double > { typedef RGBValue::RealPromote, R, G, B> Promote; }; template struct PromoteTraits > { typedef RGBValue::RealPromote, R, G, B> Promote; }; \endcode \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra */ #if !defined(NO_PARTIAL_TEMPLATE_SPECIALIZATION) template struct NumericTraits > { typedef RGBValue Type; typedef RGBValue::Promote, R, G, B> Promote; typedef RGBValue::RealPromote, R, G, B> RealPromote; typedef RGBValue::ComplexPromote, R, G, B> ComplexPromote; typedef T ValueType; typedef typename NumericTraits::isIntegral isIntegral; typedef VigraFalseType isScalar; typedef typename NumericTraits::isSigned isSigned; typedef VigraFalseType isOrdered; typedef VigraFalseType isComplex; static Type zero() { return Type(NumericTraits::zero()); } static Type one() { return Type(NumericTraits::one()); } static Type nonZero() { return Type(NumericTraits::nonZero()); } static Promote toPromote(Type const & v) { return Promote(v); } static RealPromote toRealPromote(Type const & v) { return RealPromote(v); } static Type fromPromote(Promote const & v) { return Type(NumericTraits::fromPromote(v.red()), NumericTraits::fromPromote(v.green()), NumericTraits::fromPromote(v.blue())); } static Type fromRealPromote(RealPromote const & v) { return Type(NumericTraits::fromRealPromote(v.red()), NumericTraits::fromRealPromote(v.green()), NumericTraits::fromRealPromote(v.blue())); } }; template struct NormTraits > { typedef RGBValue Type; typedef typename Type::SquaredNormType SquaredNormType; typedef typename Type::NormType NormType; }; template struct PromoteTraits, RGBValue > { typedef RGBValue::Promote, R, G, B> Promote; }; template struct PromoteTraits, double > { typedef RGBValue::RealPromote, R, G, B> Promote; }; template struct PromoteTraits > { typedef RGBValue::RealPromote, R, G, B> Promote; }; #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION #define RGBVALUE_NUMTRAITS(T) \ template<>\ struct NumericTraits >\ {\ typedef RGBValue Type; \ typedef RGBValue::Promote> Promote; \ typedef RGBValue::RealPromote> RealPromote; \ typedef RGBValue::ComplexPromote> ComplexPromote; \ typedef T ValueType; \ \ typedef NumericTraits::isIntegral isIntegral; \ typedef VigraFalseType isScalar; \ typedef NumericTraits::isSigned isSigned; \ typedef VigraFalseType isOrdered; \ typedef VigraFalseType isComplex; \ \ static RGBValue zero() { \ return RGBValue(NumericTraits::zero()); \ }\ static RGBValue one() { \ return RGBValue(NumericTraits::one()); \ }\ static RGBValue nonZero() { \ return RGBValue(NumericTraits::nonZero()); \ }\ \ static Promote toPromote(RGBValue const & v) { \ return Promote(v); \ }\ static RealPromote toRealPromote(RGBValue const & v) { \ return RealPromote(v); \ }\ static RGBValue fromPromote(Promote const & v) { \ RGBValue res;\ RGBValue::iterator d = res.begin();\ Promote::const_iterator s = v.begin();\ for(; d != res.end(); ++d, ++s)\ *d = NumericTraits::fromPromote(*s);\ return res;\ }\ static RGBValue fromRealPromote(RealPromote const & v) {\ RGBValue res;\ RGBValue::iterator d = res.begin();\ RealPromote::const_iterator s = v.begin();\ for(; d != res.end(); ++d, ++s)\ *d = NumericTraits::fromRealPromote(*s);\ return res;\ }\ }; \ template<>\ struct NormTraits >\ {\ typedef RGBValue Type;\ typedef Type::SquaredNormType SquaredNormType; \ typedef Type::NormType NormType; \ }; #define RGBVALUE_PROMTRAITS1(type1) \ template<> \ struct PromoteTraits, RGBValue > \ { \ typedef RGBValue::Promote> Promote; \ static Promote toPromote(RGBValue const & v) { \ return static_cast(v); } \ }; \ template <> \ struct PromoteTraits, double > \ { \ typedef RGBValue::RealPromote> Promote; \ }; \ template <> \ struct PromoteTraits > \ { \ typedef RGBValue::RealPromote> Promote; \ }; #define RGBVALUE_PROMTRAITS2(type1, type2) \ template<> \ struct PromoteTraits, RGBValue > \ { \ typedef RGBValue::Promote> Promote; \ static Promote toPromote(RGBValue const & v) { \ return static_cast(v); } \ static Promote toPromote(RGBValue const & v) { \ return static_cast(v); } \ }; RGBVALUE_NUMTRAITS(unsigned char) RGBVALUE_NUMTRAITS(int) RGBVALUE_NUMTRAITS(float) RGBVALUE_NUMTRAITS(double) RGBVALUE_PROMTRAITS1(unsigned char) RGBVALUE_PROMTRAITS1(int) RGBVALUE_PROMTRAITS1(float) RGBVALUE_PROMTRAITS1(double) RGBVALUE_PROMTRAITS2(float, unsigned char) RGBVALUE_PROMTRAITS2(unsigned char, float) RGBVALUE_PROMTRAITS2(int, unsigned char) RGBVALUE_PROMTRAITS2(unsigned char, int) RGBVALUE_PROMTRAITS2(int, float) RGBVALUE_PROMTRAITS2(float, int) RGBVALUE_PROMTRAITS2(double, unsigned char) RGBVALUE_PROMTRAITS2(unsigned char, double) RGBVALUE_PROMTRAITS2(int, double) RGBVALUE_PROMTRAITS2(double, int) RGBVALUE_PROMTRAITS2(double, float) RGBVALUE_PROMTRAITS2(float, double) #undef RGBVALUE_NUMTRAITS #undef RGBVALUE_PROMTRAITS1 #undef RGBVALUE_PROMTRAITS2 #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION /********************************************************/ /* */ /* RGBValue-Arithmetic */ /* */ /********************************************************/ /** \addtogroup RGBValueOperators */ //@{ /// componentwise add-assignment template inline RGBValue & operator+=(RGBValue & l, RGBValue const & r) { l.red() += r.red(); l.green() += r.green(); l.blue() += r.blue(); return l; } /// componentwise subtract-assignment template inline RGBValue & operator-=(RGBValue & l, RGBValue const & r) { l.red() -= r.red(); l.green() -= r.green(); l.blue() -= r.blue(); return l; } /// componentwise multiply-assignment template inline RGBValue & operator*=(RGBValue & l, RGBValue const & r) { l.red() *= r.red(); l.green() *= r.green(); l.blue() *= r.blue(); return l; } /// componentwise scalar multiply-assignment template inline RGBValue & operator*=(RGBValue & l, double r) { l.red() *= r; l.green() *= r; l.blue() *= r; return l; } /// componentwise scalar divide-assignment template inline RGBValue & operator/=(RGBValue & l, double r) { l.red() /= r; l.green() /= r; l.blue() /= r; return l; } using VIGRA_CSTD::abs; /// component-wise absolute value template inline RGBValue abs(RGBValue const & v) { return RGBValue(abs(v.red()), abs(v.green()), abs(v.blue())); } /// component-wise addition template inline typename PromoteTraits, RGBValue >::Promote operator+(RGBValue const & r1, RGBValue const & r2) { typename PromoteTraits, RGBValue >::Promote res(r1); res += r2; return res; } /// component-wise subtraction template inline typename PromoteTraits, RGBValue >::Promote operator-(RGBValue const & r1, RGBValue const & r2) { typename PromoteTraits, RGBValue >::Promote res(r1); res -= r2; return res; } /// component-wise multiplication template inline typename PromoteTraits, RGBValue >::Promote operator*(RGBValue const & r1, RGBValue const & r2) { typename PromoteTraits, RGBValue >::Promote res(r1); res *= r2; return res; } /// component-wise left scalar multiplication template inline typename NumericTraits >::RealPromote operator*(double v, RGBValue const & r) { typename NumericTraits >::RealPromote res(r); res *= v; return res; } /// component-wise right scalar multiplication template inline typename NumericTraits >::RealPromote operator*(RGBValue const & r, double v) { typename NumericTraits >::RealPromote res(r); res *= v; return res; } /// component-wise scalar division template inline typename NumericTraits >::RealPromote operator/(RGBValue const & r, double v) { typename NumericTraits >::RealPromote res(r); res /= v; return res; } /// cross product template inline typename PromoteTraits, RGBValue >::Promote cross(RGBValue const & r1, RGBValue const & r2) { typedef typename PromoteTraits, RGBValue >::Promote Res; return Res(r1.green()*r2.blue() - r1.blue()*r2.green(), r1.blue()*r2.red() - r1.red()*r2.blue(), r1.red()*r2.green() - r1.green()*r2.red()); } /// dot product template inline typename PromoteTraits::Promote dot(RGBValue const & r1, RGBValue const & r2) { return r1.red()*r2.red() + r1.green()*r2.green() + r1.blue()*r2.blue(); } using VIGRA_CSTD::ceil; /** Apply ceil() function to each RGB component. */ template inline RGBValue ceil(RGBValue const & r) { return RGBValue(ceil(r.red()), ceil(r.green()), ceil(r.blue())); } using VIGRA_CSTD::floor; /** Apply floor() function to each RGB component. */ template inline RGBValue floor(RGBValue const & r) { return RGBValue(floor(r.red()), floor(r.green()), floor(r.blue())); } //@} /********************************************************/ /* */ /* RGBValue-Accessors */ /* */ /********************************************************/ /** \addtogroup DataAccessors */ //@{ /** \defgroup RGBValueAccessors Accessors for RGBValue */ //@{ /** Encapsulate access to rgb values. \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra */ template class RGBAccessor : public VectorAccessor { public: typedef typename RGBVALUE::value_type component_type; /** Get value of the red component */ template component_type const & red(RGBIterator const & rgb) const { return (*rgb).red(); } template void setRGB(V r, V g, V b, RGBIterator const & rgb) const { (*rgb).setRGB( r, g, b ); } /** Set value of the red component. The type V of the passed in value is automatically converted to component_type. */ template void setRed(V value, RGBIterator const & rgb) const { (*rgb).setRed(value); } /** Get value of the red component at an offset */ template component_type const & red(RGBIterator const & rgb, DIFFERENCE diff) const { return rgb[diff].red(); } /** Set value of the red component at an offset. The type V of the passed in value is automatically converted to component_type. */ template void setRed(V value, RGBIterator const & rgb, DIFFERENCE diff) const { rgb[diff].setRed(value); } /** Get value of the green component */ template component_type const & green(RGBIterator const & rgb) const { return (*rgb).green(); } /** Set value of the green component. The type V of the passed in value is automatically converted to component_type. */ template void setGreen(V value, RGBIterator const & rgb) const { (*rgb).setGreen(value); } /** Get value of the green component at an offset */ template component_type const & green(RGBIterator const & rgb, DIFFERENCE d) const { return rgb[d].green(); } /** Set value of the green component at an offset. The type V of the passed in value is automatically converted to component_type. */ template void setGreen(V value, RGBIterator const & rgb, DIFFERENCE d) const { rgb[d].setGreen(value); } /** Get value of the blue component */ template component_type const & blue(RGBIterator const & rgb) const { return (*rgb).blue(); } /** Set value of the blue component. The type V of the passed in value is automatically converted to component_type. */ template void setBlue(V value, RGBIterator const & rgb) const { (*rgb).setBlue(value); } /** Get value of the blue component at an offset */ template component_type const & blue(RGBIterator const & rgb, DIFFERENCE d) const { return rgb[d].blue(); } /** Set value of the blue component at an offset. The type V of the passed in value is automatically converted to component_type. */ template void setBlue(V value, RGBIterator const & rgb, DIFFERENCE d) const { rgb[d].setBlue(value); } }; /********************************************************/ /* */ /* RedAccessor */ /* */ /********************************************************/ /** Encapsulate access to red band of an rgb value. \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra */ template class RedAccessor { public: typedef typename RGBVALUE::value_type value_type; /** Get value of the red component */ template value_type const & operator()(ITERATOR const & i) const { return (*i).red(); } /** Get value of the red component at an offset */ template value_type const & operator()(ITERATOR const & i, DIFFERENCE d) const { return i[d].red(); } /** Set value of the red component. The type V of the passed in value is automatically converted to value_type. */ template void set(V value, ITERATOR const & i) const { (*i).setRed(value); } /** Set value of the red component at an offset. The type V of the passed in value is automatically converted to value_type. */ template void set(V value, ITERATOR const & i, DIFFERENCE d) const { i[d].setRed(value); } }; /********************************************************/ /* */ /* GreenAccessor */ /* */ /********************************************************/ /** Encapsulate access to green band of an rgb value. \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra */ template class GreenAccessor { public: typedef typename RGBVALUE::value_type value_type; /** Get value of the green component */ template value_type const & operator()(ITERATOR const & i) const { return (*i).green(); } /** Get value of the green component at an offset */ template value_type const & operator()(ITERATOR const & i, DIFFERENCE d) const { return i[d].green(); } /** Set value of the green component. The type V of the passed in value is automatically converted to value_type. */ template void set(V value, ITERATOR const & i) const { (*i).setGreen(value); } /** Set value of the green component at an offset. The type V of the passed in value is automatically converted to value_type. */ template void set(V value, ITERATOR const & i, DIFFERENCE d) const { i[d].setGreen(value); } }; /********************************************************/ /* */ /* BlueAccessor */ /* */ /********************************************************/ /** Encapsulate access to blue band of an rgb value. \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra */ template class BlueAccessor { public: typedef typename RGBVALUE::value_type value_type; /** Get value of the blue component */ template value_type const & operator()(ITERATOR const & i) const { return (*i).blue(); } /** Get value of the blue component at an offset */ template value_type const & operator()(ITERATOR const & i, DIFFERENCE d) const { return i[d].blue(); } /** Set value of the blue component. The type V of the passed in value is automatically converted to value_type. */ template void set(V value, ITERATOR const & i) const { (*i).setBlue(value); } /** Set value of the blue component at an offset. The type V of the passed in value is automatically converted to value_type. */ template void set(V value, ITERATOR const & i, DIFFERENCE d) const { i[d].setBlue(value); } }; /********************************************************/ /* */ /* RGBToGrayAccessor */ /* */ /********************************************************/ /** Encapsulate access to luminance of an rgb value. \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra */ template class RGBToGrayAccessor { public: typedef typename RGBVALUE::value_type value_type; /** Get value of the luminance */ template value_type operator()(ITERATOR const & i) const { return (*i).luminance(); } /** Get value of the luminance at an offset */ template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return i[d].luminance(); } }; /********************************************************/ /* */ /* GrayToRGBAccessor */ /* */ /********************************************************/ /** Create an RGB view for a grayscale image by making all three channels equal. \#include \<vigra/rgbvalue.hxx\>
Namespace: vigra */ template class GrayToRGBAccessor { public: typedef typename vigra::RGBValue value_type; /** Get RGB value for the given pixel. */ template value_type operator()(ITERATOR const & i) const { return value_type(*i,*i,*i); } /** Get RGB value at an offset */ template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return value_type(i[d],i[d],i[d]); } }; //@} //@} } // namespace vigra #endif // VIGRA_RGBVALUE_HXX gamera-3.3.3/include/vigra/seededregiongrowing.hxx0000644000076500000000000005055711261456425021302 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2003 by Ullrich Koethe, Hans Meine */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_SEEDEDREGIONGROWING_HXX #define VIGRA_SEEDEDREGIONGROWING_HXX #include #include #include #include "utilities.hxx" #include "stdimage.hxx" #include "stdimagefunctions.hxx" namespace vigra { namespace detail { template class SeedRgPixel { public: Point2D location_, nearest_; COST cost_; int count_; int label_; int dist_; SeedRgPixel() : location_(0,0), nearest_(0,0), cost_(0), count_(0), label_(0) {} SeedRgPixel(Point2D const & location, Point2D const & nearest, COST const & cost, int const & count, int const & label) : location_(location), nearest_(nearest), cost_(cost), count_(count), label_(label) { int dx = location_.x - nearest_.x; int dy = location_.y - nearest_.y; dist_ = dx * dx + dy * dy; } void set(Point2D const & location, Point2D const & nearest, COST const & cost, int const & count, int const & label) { location_ = location; nearest_ = nearest; cost_ = cost; count_ = count; label_ = label; int dx = location_.x - nearest_.x; int dy = location_.y - nearest_.y; dist_ = dx * dx + dy * dy; } struct Compare { // must implement > since priority_queue looks for largest element bool operator()(SeedRgPixel const & l, SeedRgPixel const & r) const { if(r.cost_ == l.cost_) { if(r.dist_ == l.dist_) return r.count_ < l.count_; return r.dist_ < l.dist_; } return r.cost_ < l.cost_; } bool operator()(SeedRgPixel const * l, SeedRgPixel const * r) const { if(r->cost_ == l->cost_) { if(r->dist_ == l->dist_) return r->count_ < l->count_; return r->dist_ < l->dist_; } return r->cost_ < l->cost_; } }; struct Allocator { ~Allocator() { while(!freelist_.empty()) { delete freelist_.top(); freelist_.pop(); } } SeedRgPixel * create(Point2D const & location, Point2D const & nearest, COST const & cost, int const & count, int const & label) { if(!freelist_.empty()) { SeedRgPixel * res = freelist_.top(); freelist_.pop(); res->set(location, nearest, cost, count, label); return res; } return new SeedRgPixel(location, nearest, cost, count, label); } void dismiss(SeedRgPixel * p) { freelist_.push(p); } std::stack *> freelist_; }; }; struct UnlabelWatersheds { int operator()(int label) const { return label < 0 ? 0 : label; } }; } // namespace detail enum SRGType { KeepContours, CompleteGrow, SRGWatershedLabel = -1 }; /** \addtogroup SeededRegionGrowing Region Segmentation Algorithms Region growing, watersheds, and voronoi tesselation */ //@{ /********************************************************/ /* */ /* seededRegionGrowing */ /* */ /********************************************************/ /** \brief Region Segmentation by means of Seeded Region Growing. This algorithm implements seeded region growing as described in R. Adams, L. Bischof: " Seeded Region Growing", IEEE Trans. on Pattern Analysis and Maschine Intelligence, vol 16, no 6, 1994, and Ullrich Köthe: Primary Image Segmentation, in: G. Sagerer, S. Posch, F. Kummert (eds.): Mustererkennung 1995, Proc. 17. DAGM-Symposium, Springer 1995 The seed image is a partly segmented image which contains uniquely labeled regions (the seeds) and unlabeled pixels (the candidates, label 0). Seed regions can be as large as you wish and as small as one pixel. If there are no candidates, the algorithm will simply copy the seed image into the output image. Otherwise it will aggregate the candidates into the existing regions so that a cost function is minimized. This works as follows:

  1. Find all candidate pixels that are 4-adjacent to a seed region. Calculate the cost for aggregating each candidate into its adajacent region and put the candidates into a priority queue.
  2. While( priority queue is not empty)
    1. Take the candidate with least cost from the queue. If it has not already been merged, merge it with it's adjacent region.
    2. Put all candidates that are 4-adjacent to the pixel just processed into the priority queue.
If SRGType == CompleteGrow (the default), this algorithm will produce a complete 4-connected tesselation of the image. If SRGType == KeepContours, a one-pixel-wide border will be left between the regions. The border pixels get label 0 (zero). The cost is determined jointly by the source image and the region statistics functor. The source image contains feature values for each pixel which will be used by the region statistics functor to calculate and update statistics for each region and to calculate the cost for each candidate. The RegionStatisticsArray must be compatible to the \ref ArrayOfRegionStatistics functor and contains an array of statistics objects for each region. The indices must correspond to the labels of the seed regions. The statistics for the initial regions must have been calculated prior to calling seededRegionGrowing() (for example by means of \ref inspectTwoImagesIf()). For each candidate x that is adjacent to region i, the algorithm will call stats[i].cost(as(x)) to get the cost (where x is a SrcImageIterator and as is the SrcAccessor). When a candidate has been merged with a region, the statistics are updated by calling stats[i].operator()(as(x)). Since the RegionStatisticsArray is passed by reference, this will overwrite the original statistics. If a candidate could be merged into more than one regions with identical cost, the algorithm will favour the nearest region. In some cases, the cost only depends on the feature value of the current pixel. Then the update operation will simply be a no-op, and the cost() function returns its argument. This behavior is implemented by the \ref SeedRgDirectValueFunctor. With SRGType == KeepContours, this is equivalent to the watershed algorithm. Declarations: pass arguments explicitly: \code namespace vigra { template void seededRegionGrowing(SrcImageIterator srcul, SrcImageIterator srclr, SrcAccessor as, SeedImageIterator seedsul, SeedAccessor aseeds, DestImageIterator destul, DestAccessor ad, RegionStatisticsArray & stats, SRGType srgType = CompleteGrow); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void seededRegionGrowing(triple img1, pair img3, pair img4, RegionStatisticsArray & stats, SRGType srgType = CompleteGrow); } \endcode Usage: \#include \<vigra/seededregiongrowing.hxx\>
Namespace: vigra Example: implementation of the voronoi tesselation \code vigra::BImage points(w,h); vigra::FImage dist(x,y); // empty edge image points = 0; dist = 0; int max_region_label = 100; // throw in some random points: for(int i = 1; i <= max_region_label; ++i) points(w * rand() / RAND_MAX , h * rand() / RAND_MAX) = i; // calculate Euclidean distance transform vigra::distanceTransform(srcImageRange(points), destImage(dist), 2); // init statistics functor vigra::ArrayOfRegionStatistics > stats(max_region_label); // find voronoi region of each point vigra:: seededRegionGrowing(srcImageRange(dist), srcImage(points), destImage(points), stats); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; SeedImageIterator seed_upperleft; DestImageIterator dest_upperleft; SrcAccessor src_accessor; SeedAccessor seed_accessor; DestAccessor dest_accessor; RegionStatisticsArray stats; // calculate costs RegionStatisticsArray::value_type::cost_type cost = stats[seed_accessor(seed_upperleft)].cost(src_accessor(src_upperleft)); // compare costs cost < cost; // update statistics stats[seed_accessor(seed_upperleft)](src_accessor(src_upperleft)); // set result dest_accessor.set(seed_accessor(seed_upperleft), dest_upperleft); \endcode Further requirements are determined by the RegionStatisticsArray. */ doxygen_overloaded_function(template <...> void seededRegionGrowing) template void seededRegionGrowing(SrcImageIterator srcul, SrcImageIterator srclr, SrcAccessor as, SeedImageIterator seedsul, SeedAccessor aseeds, DestImageIterator destul, DestAccessor ad, RegionStatisticsArray & stats, const SRGType srgType) { int w = srclr.x - srcul.x; int h = srclr.y - srcul.y; int count = 0; SrcImageIterator isy = srcul, isx = srcul; // iterators for the src image typedef typename RegionStatisticsArray::value_type RegionStatistics; typedef typename RegionStatistics::cost_type CostType; typedef detail::SeedRgPixel Pixel; typename Pixel::Allocator allocator; typedef std::priority_queue, typename Pixel::Compare> SeedRgPixelHeap; // copy seed image in an image with border IImage regions(w+2, h+2); IImage::Iterator ir = regions.upperLeft() + Diff2D(1,1); IImage::Iterator iry, irx; initImageBorder(destImageRange(regions), 1, SRGWatershedLabel); copyImage(seedsul, seedsul+Diff2D(w,h), aseeds, ir, regions.accessor()); // allocate and init memory for the results SeedRgPixelHeap pheap; int cneighbor; static const Diff2D dist[] = { Diff2D(-1,0), Diff2D(0,-1), Diff2D(1,0), Diff2D(0,1) }; Point2D pos(0,0); for(isy=srcul, iry=ir, pos.y=0; pos.y 0) { CostType cost = stats[cneighbor].cost(as(isx)); Pixel * pixel = allocator.create(pos, pos+dist[i], cost, count++, cneighbor); pheap.push(pixel); } } } } } // perform region growing while(pheap.size() != 0) { Pixel * pixel = pheap.top(); pheap.pop(); Point2D pos = pixel->location_; Point2D nearest = pixel->nearest_; int lab = pixel->label_; allocator.dismiss(pixel); irx = ir + pos; isx = srcul + pos; if(*irx) // already labelled region / watershed? continue; if(srgType == KeepContours) { for(int i=0; i<4; i++) { cneighbor = irx[dist[i]]; if((cneighbor>0) && (cneighbor != lab)) { lab = SRGWatershedLabel; break; } } } *irx = lab; if((srgType != KeepContours) || (lab > 0)) { // update statistics stats[*irx](as(isx)); // search neighborhood // second pass: find new candidate pixels for(int i=0; i<4; i++) { if(irx[dist[i]] == 0) { CostType cost = stats[lab].cost(as(isx, dist[i])); Pixel * new_pixel = allocator.create(pos+dist[i], nearest, cost, count++, lab); pheap.push(new_pixel); } } } } // write result transformImage(ir, ir+Point2D(w,h), regions.accessor(), destul, ad, detail::UnlabelWatersheds()); } template inline void seededRegionGrowing(SrcImageIterator srcul, SrcImageIterator srclr, SrcAccessor as, SeedImageIterator seedsul, SeedAccessor aseeds, DestImageIterator destul, DestAccessor ad, RegionStatisticsArray & stats) { seededRegionGrowing(srcul, srclr, as, seedsul, aseeds, destul, ad, stats, CompleteGrow); } template inline void seededRegionGrowing(triple img1, pair img3, pair img4, RegionStatisticsArray & stats, SRGType srgType) { seededRegionGrowing(img1.first, img1.second, img1.third, img3.first, img3.second, img4.first, img4.second, stats, srgType); } template inline void seededRegionGrowing(triple img1, pair img3, pair img4, RegionStatisticsArray & stats) { seededRegionGrowing(img1.first, img1.second, img1.third, img3.first, img3.second, img4.first, img4.second, stats, CompleteGrow); } /********************************************************/ /* */ /* SeedRgDirectValueFunctor */ /* */ /********************************************************/ /** \brief Statistics functor to be used for seeded region growing. This functor can be used if the cost of a candidate during \ref seededRegionGrowing() is equal to the feature value of that candidate and does not depend on properties of the region it is going to be merged with. \#include \<vigra/seededregiongrowing.hxx\>
Namespace: vigra Required Interface: no requirements */ template class SeedRgDirectValueFunctor { public: /** the functor's argument type */ typedef Value argument_type; /** the functor's result type (unused, only necessary for use of SeedRgDirectValueFunctor in \ref vigra::ArrayOfRegionStatistics */ typedef Value result_type; /** \deprecated use argument_type */ typedef Value value_type; /** the return type of the cost() function */ typedef Value cost_type; /** Do nothing (since we need not update region statistics). */ void operator()(argument_type const &) const {} /** Return argument (since cost is identical to feature value) */ cost_type const & cost(argument_type const & v) const { return v; } }; //@} } // namespace vigra #endif // VIGRA_SEEDEDREGIONGROWING_HXX gamera-3.3.3/include/vigra/seededregiongrowing3d.hxx0000644000076500000000000006110111261456425021514 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2003-2007 by Kasim Terzic, Christian-Dennis Rahn */ /* and Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_SEEDEDREGIONGROWING_3D_HXX #define VIGRA_SEEDEDREGIONGROWING_3D_HXX #include #include #include #include "utilities.hxx" #include "stdimage.hxx" #include "stdimagefunctions.hxx" #include "seededregiongrowing.hxx" #include "multi_pointoperators.hxx" namespace vigra { namespace detail { template class SeedRgVoxel { public: Diff_type location_, nearest_; COST cost_; int count_; int label_; int dist_; SeedRgVoxel() //: location_(0,0,0), nearest_(0,0,0), cost_(0), count_(0), label_(0) { location_ = Diff_type(0,0,0); nearest_ = Diff_type(0,0,0); cost_ = 0; count_ = 0; label_ = 0; } SeedRgVoxel(Diff_type const & location, Diff_type const & nearest, COST const & cost, int const & count, int const & label) : location_(location), nearest_(nearest), cost_(cost), count_(count), label_(label) { int dx = location_[0] - nearest_[0]; int dy = location_[1] - nearest_[1]; int dz = location_[2] - nearest_[2]; dist_ = dx * dx + dy * dy + dz * dz; } void set(Diff_type const & location, Diff_type const & nearest, COST const & cost, int const & count, int const & label) { location_ = location; nearest_ = nearest; cost_ = cost; count_ = count; label_ = label; int dx = location_[0] - nearest_[0]; int dy = location_[1] - nearest_[1]; int dz = location_[2] - nearest_[2]; dist_ = dx * dx + dy * dy + dz * dz; } struct Compare { // must implement > since priority_queue looks for largest element bool operator()(SeedRgVoxel const & l, SeedRgVoxel const & r) const { if(r.cost_ == l.cost_) { if(r.dist_ == l.dist_) return r.count_ < l.count_; return r.dist_ < l.dist_; } return r.cost_ < l.cost_; } bool operator()(SeedRgVoxel const * l, SeedRgVoxel const * r) const { if(r->cost_ == l->cost_) { if(r->dist_ == l->dist_) return r->count_ < l->count_; return r->dist_ < l->dist_; } return r->cost_ < l->cost_; } }; struct Allocator { ~Allocator() { while(!freelist_.empty()) { delete freelist_.top(); freelist_.pop(); } } SeedRgVoxel * create(Diff_type const & location, Diff_type const & nearest, COST const & cost, int const & count, int const & label) { if(!freelist_.empty()) { SeedRgVoxel * res = freelist_.top(); freelist_.pop(); res->set(location, nearest, cost, count, label); return res; } return new SeedRgVoxel(location, nearest, cost, count, label); } void dismiss(SeedRgVoxel * p) { freelist_.push(p); } std::stack *> freelist_; }; }; } // namespace detail /** \addtogroup SeededRegionGrowing Region segmentation and voronoi tesselation */ //@{ /********************************************************/ /* */ /* seededRegionGrowing3D */ /* */ /********************************************************/ /** \brief Three-dimensional Region Segmentation by means of Seeded Region Growing. This algorithm implements seeded region growing as described in The seed image is a partly segmented multi-dimensional array which contains uniquely labeled regions (the seeds) and unlabeled voxels (the candidates, label 0). Seed regions can be as large as you wish and as small as one voxel. If there are no candidates, the algorithm will simply copy the seed array into the output array. Otherwise it will aggregate the candidates into the existing regions so that a cost function is minimized. This works as follows:
  1. Find all candidate pixels that are 6-adjacent to a seed region. Calculate the cost for aggregating each candidate into its adajacent region and put the candidates into a priority queue.
  2. While( priority queue is not empty)
    1. Take the candidate with least cost from the queue. If it has not already been merged, merge it with it's adjacent region.
    2. Put all candidates that are 4-adjacent to the pixel just processed into the priority queue.
If SRGType == CompleteGrow (the default), this algorithm will produce a complete 6-connected tesselation of the array. Other grow types (such as keeping contours for watersheds) are currently not supported The cost is determined jointly by the source array and the region statistics functor. The source array contains feature values for each pixel which will be used by the region statistics functor to calculate and update statistics for each region and to calculate the cost for each candidate. The RegionStatisticsArray must be compatible to the \ref ArrayOfRegionStatistics functor and contains an array of statistics objects for each region. The indices must correspond to the labels of the seed regions. The statistics for the initial regions must have been calculated prior to calling seededRegionGrowing3D() For each candidate x that is adjacent to region i, the algorithm will call stats[i].cost(as(x)) to get the cost (where x is a SrcImageIterator and as is the SrcAccessor). When a candidate has been merged with a region, the statistics are updated by calling stats[i].operator()(as(x)). Since the RegionStatisticsArray is passed by reference, this will overwrite the original statistics. If a candidate could be merged into more than one regions with identical cost, the algorithm will favour the nearest region. If, at any point in the algorithm, the cost of the current candidate exceeds the optional max_cost value (which defaults to -1), region growing is aborted, and all voxels not yet assigned to a region remain unlabeled. In some cases, the cost only depends on the feature value of the current voxel. Then the update operation will simply be a no-op, and the cost() function returns its argument. This behavior is implemented by the \ref SeedRgDirectValueFunctor. Declarations: pass arguments explicitly: \code namespace vigra { template void seededRegionGrowing3D(SrcImageIterator srcul, Diff_type shape, SrcAccessor as, SeedImageIterator seedsul, SeedAccessor aseeds, DestImageIterator destul, DestAccessor ad, RegionStatisticsArray & stats, CostThresholdType max_cost = -1.0, const SRGType srgType == CompleteGrow); template void seededRegionGrowing3D(SrcImageIterator srcul, Diff_type shape, SrcAccessor as, SeedImageIterator seedsul, SeedAccessor aseeds, DestImageIterator destul, DestAccessor ad, RegionStatisticsArray & stats, const SRGType srgType == CompleteGrow); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void seededRegionGrowing3D(triple img1, pair img3, pair img4, RegionStatisticsArray & stats, CostThresholdType max_cost = -1.0, const SRGType srgType == CompleteGrow); template void seededRegionGrowing3D(triple img1, pair img3, pair img4, RegionStatisticsArray & stats, const SRGType srgType == CompleteGrow); } \endcode */ doxygen_overloaded_function(template <...> void seededRegionGrowing3D) template void seededRegionGrowing3D(SrcImageIterator srcul, Diff_type shape, SrcAccessor as, SeedImageIterator seedsul, SeedAccessor aseeds, DestImageIterator destul, DestAccessor ad, RegionStatisticsArray & stats, CostThresholdType max_cost, const SRGType srgType) { SrcImageIterator srclr = srcul + shape; //int w = srclr.x - srcul.x; int w = shape[0]; //int h = srclr.y - srcul.y; int h = shape[1]; //int d = srclr.z - srcul.z; int d = shape[2]; int count = 0; SrcImageIterator isy = srcul, isx = srcul, isz = srcul; // iterators for the src image typedef typename RegionStatisticsArray::value_type RegionStatistics; typedef typename PromoteTraits::Promote CostType; typedef detail::SeedRgVoxel Voxel; typename Voxel::Allocator allocator; typedef std::priority_queue< Voxel *, std::vector, typename Voxel::Compare > SeedRgVoxelHeap; typedef MultiArray<3, int> IVolume; // copy seed image in an image with border Diff_type regionshape = shape + Diff_type(2,2,2); IVolume regions(regionshape); MultiIterator<3,int> ir = regions.traverser_begin(); ir = ir + Diff_type(1,1,1); //IVolume::Iterator iry, irx, irz; MultiIterator<3,int> iry, irx, irz; //initImageBorder(destImageRange(regions), 1, SRGWatershedLabel); initMultiArrayBorder(destMultiArrayRange(regions), 1, SRGWatershedLabel); copyMultiArray(seedsul, Diff_type(w,h,d), aseeds, ir, AccessorTraits::default_accessor()/* vigra::StandardValueAccessor*/); // allocate and init memory for the results SeedRgVoxelHeap pheap; int cneighbor; static const Diff_type dist[] = { Diff_type(-1, 0, 0), Diff_type( 0,-1, 0), Diff_type( 1, 0, 0), Diff_type( 0, 1, 0), Diff_type( 0, 0,-1), Diff_type( 0, 0, 1) }; Diff_type pos(0,0,0); for(isz=srcul, irz=ir, pos[2]=0; pos[2] #include "utilities.hxx" #include "numerictraits.hxx" #include "imageiteratoradapter.hxx" #include "bordertreatment.hxx" #include "gaussians.hxx" #include "array_vector.hxx" namespace vigra { /********************************************************/ /* */ /* internalConvolveLineWrap */ /* */ /********************************************************/ template void internalConvolveLineWrap(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor da, KernelIterator kernel, KernelAccessor ka, int kleft, int kright) { // int w = iend - is; int w = std::distance( is, iend ); typedef typename NumericTraits::RealPromote SumType; SrcIterator ibegin = is; for(int x=0; x::zero(); if(x < kright) { int x0 = x - kright; SrcIterator iss = iend + x0; for(; x0; ++x0, --ik, ++iss) { sum += ka(ik) * sa(iss); } iss = ibegin; SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } } else if(w-x <= -kleft) { SrcIterator iss = is + (-kright); SrcIterator isend = iend; for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } int x0 = -kleft - w + x + 1; iss = ibegin; for(; x0; --x0, --ik, ++iss) { sum += ka(ik) * sa(iss); } } else { SrcIterator iss = is - kright; SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } } da.set(NumericTraits::fromRealPromote(sum), id); } } /********************************************************/ /* */ /* internalConvolveLineClip */ /* */ /********************************************************/ template void internalConvolveLineClip(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor da, KernelIterator kernel, KernelAccessor ka, int kleft, int kright, Norm norm) { // int w = iend - is; int w = std::distance( is, iend ); typedef typename NumericTraits::RealPromote SumType; SrcIterator ibegin = is; for(int x=0; x::zero(); if(x < kright) { int x0 = x - kright; Norm clipped = NumericTraits::zero(); for(; x0; ++x0, --ik) { clipped += ka(ik); } SrcIterator iss = ibegin; SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } sum = norm / (norm - clipped) * sum; } else if(w-x <= -kleft) { SrcIterator iss = is + (-kright); SrcIterator isend = iend; for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } Norm clipped = NumericTraits::zero(); int x0 = -kleft - w + x + 1; for(; x0; --x0, --ik) { clipped += ka(ik); } sum = norm / (norm - clipped) * sum; } else { SrcIterator iss = is + (-kright); SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } } da.set(NumericTraits::fromRealPromote(sum), id); } } /********************************************************/ /* */ /* internalConvolveLineReflect */ /* */ /********************************************************/ template void internalConvolveLineReflect(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor da, KernelIterator kernel, KernelAccessor ka, int kleft, int kright) { // int w = iend - is; int w = std::distance( is, iend ); typedef typename NumericTraits::RealPromote SumType; SrcIterator ibegin = is; for(int x=0; x::zero(); if(x < kright) { int x0 = x - kright; SrcIterator iss = ibegin - x0; for(; x0; ++x0, --ik, --iss) { sum += ka(ik) * sa(iss); } SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } } else if(w-x <= -kleft) { SrcIterator iss = is + (-kright); SrcIterator isend = iend; for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } int x0 = -kleft - w + x + 1; iss = iend - 2; for(; x0; --x0, --ik, --iss) { sum += ka(ik) * sa(iss); } } else { SrcIterator iss = is + (-kright); SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } } da.set(NumericTraits::fromRealPromote(sum), id); } } /********************************************************/ /* */ /* internalConvolveLineRepeat */ /* */ /********************************************************/ template void internalConvolveLineRepeat(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor da, KernelIterator kernel, KernelAccessor ka, int kleft, int kright) { // int w = iend - is; int w = std::distance( is, iend ); typedef typename NumericTraits::RealPromote SumType; SrcIterator ibegin = is; for(int x=0; x::zero(); if(x < kright) { int x0 = x - kright; SrcIterator iss = ibegin; for(; x0; ++x0, --ik) { sum += ka(ik) * sa(iss); } SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } } else if(w-x <= -kleft) { SrcIterator iss = is + (-kright); SrcIterator isend = iend; for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } int x0 = -kleft - w + x + 1; iss = iend - 1; for(; x0; --x0, --ik) { sum += ka(ik) * sa(iss); } } else { SrcIterator iss = is + (-kright); SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } } da.set(NumericTraits::fromRealPromote(sum), id); } } /********************************************************/ /* */ /* internalConvolveLineAvoid */ /* */ /********************************************************/ template void internalConvolveLineAvoid(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor da, KernelIterator kernel, KernelAccessor ka, int kleft, int kright) { // int w = iend - is; int w = std::distance( is, iend ); typedef typename NumericTraits::RealPromote SumType; is += kright; id += kright; for(int x=kright; x::zero(); SrcIterator iss = is + (-kright); SrcIterator isend = is + (1 - kleft); for(; iss != isend ; --ik, ++iss) { sum += ka(ik) * sa(iss); } da.set(NumericTraits::fromRealPromote(sum), id); } } /********************************************************/ /* */ /* Separable convolution functions */ /* */ /********************************************************/ /** \addtogroup SeparableConvolution One-dimensional and separable convolution functions Perform 1D convolution and separable filtering in 2 dimensions. These generic convolution functions implement the standard convolution operation for a wide range of images and signals that fit into the required interface. They need a suitable kernel to operate. */ //@{ /** \brief Performs a 1-dimensional convolution of the source signal using the given kernel. The KernelIterator must point to the center iterator, and the kernel's size is given by its left (kleft <= 0) and right (kright >= 0) borders. The signal must always be larger than the kernel. At those positions where the kernel does not completely fit into the signal's range, the specified \ref BorderTreatmentMode is applied. The signal's value_type (SrcAccessor::value_type) must be a linear space over the kernel's value_type (KernelAccessor::value_type), i.e. addition of source values, multiplication with kernel values, and NumericTraits must be defined. The kernel's value_type must be an algebraic field, i.e. the arithmetic operations (+, -, *, /) and NumericTraits must be defined. Declarations: pass arguments explicitly: \code namespace vigra { template void convolveLine(SrcIterator is, SrcIterator isend, SrcAccessor sa, DestIterator id, DestAccessor da, KernelIterator ik, KernelAccessor ka, int kleft, int kright, BorderTreatmentMode border) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void convolveLine(triple src, pair dest, tuple5 kernel) } \endcode Usage: \#include \<vigra/separableconvolution.hxx\> \code std::vector src, dest; ... // define binomial filter of size 5 static float kernel[] = { 1.0/16.0, 4.0/16.0, 6.0/16.0, 4.0/16.0, 1.0/16.0}; typedef vigra::StandardAccessor FAccessor; typedef vigra::StandardAccessor KernelAccessor; vigra::convolveLine(src.begin(), src.end(), FAccessor(), dest.begin(), FAccessor(), kernel+2, KernelAccessor(), -2, 2, BORDER_TREATMENT_REFLECT); // ^^^^^^^^ this is the center of the kernel \endcode Required Interface: \code RandomAccessIterator is, isend; RandomAccessIterator id; RandomAccessIterator ik; SrcAccessor src_accessor; DestAccessor dest_accessor; KernelAccessor kernel_accessor; NumericTraits::RealPromote s = src_accessor(is); s = s + s; s = kernel_accessor(ik) * s; dest_accessor.set( NumericTraits::fromRealPromote(s), id); \endcode If border == BORDER_TREATMENT_CLIP: \code NumericTraits::RealPromote k = kernel_accessor(ik); k = k + k; k = k - k; k = k * k; k = k / k; \endcode Preconditions: \code kleft <= 0 kright >= 0 iend - is >= kright + kleft + 1 \endcode If border == BORDER_TREATMENT_CLIP: Sum of kernel elements must be != 0. */ doxygen_overloaded_function(template <...> void convolveLine) template void convolveLine(SrcIterator is, SrcIterator iend, SrcAccessor sa, DestIterator id, DestAccessor da, KernelIterator ik, KernelAccessor ka, int kleft, int kright, BorderTreatmentMode border) { typedef typename KernelAccessor::value_type KernelValue; vigra_precondition(kleft <= 0, "convolveLine(): kleft must be <= 0.\n"); vigra_precondition(kright >= 0, "convolveLine(): kright must be >= 0.\n"); // int w = iend - is; int w = std::distance( is, iend ); vigra_precondition(w >= kright - kleft + 1, "convolveLine(): kernel longer than line\n"); switch(border) { case BORDER_TREATMENT_WRAP: { internalConvolveLineWrap(is, iend, sa, id, da, ik, ka, kleft, kright); break; } case BORDER_TREATMENT_AVOID: { internalConvolveLineAvoid(is, iend, sa, id, da, ik, ka, kleft, kright); break; } case BORDER_TREATMENT_REFLECT: { internalConvolveLineReflect(is, iend, sa, id, da, ik, ka, kleft, kright); break; } case BORDER_TREATMENT_REPEAT: { internalConvolveLineRepeat(is, iend, sa, id, da, ik, ka, kleft, kright); break; } case BORDER_TREATMENT_CLIP: { // find norm of kernel typedef typename KernelAccessor::value_type KT; KT norm = NumericTraits::zero(); KernelIterator iik = ik + kleft; for(int i=kleft; i<=kright; ++i, ++iik) norm += ka(iik); vigra_precondition(norm != NumericTraits::zero(), "convolveLine(): Norm of kernel must be != 0" " in mode BORDER_TREATMENT_CLIP.\n"); internalConvolveLineClip(is, iend, sa, id, da, ik, ka, kleft, kright, norm); break; } default: { vigra_precondition(0, "convolveLine(): Unknown border treatment mode.\n"); } } } template inline void convolveLine(triple src, pair dest, tuple5 kernel) { convolveLine(src.first, src.second, src.third, dest.first, dest.second, kernel.first, kernel.second, kernel.third, kernel.fourth, kernel.fifth); } /********************************************************/ /* */ /* separableConvolveX */ /* */ /********************************************************/ /** \brief Performs a 1 dimensional convolution in x direction. It calls \ref convolveLine() for every row of the image. See \ref convolveLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { template void separableConvolveX(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor sa, DestImageIterator dupperleft, DestAccessor da, KernelIterator ik, KernelAccessor ka, int kleft, int kright, BorderTreatmentMode border) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void separableConvolveX(triple src, pair dest, tuple5 kernel) } \endcode Usage: \#include \<vigra/separableconvolution.hxx\> \code vigra::FImage src(w,h), dest(w,h); ... // define Gaussian kernel with std. deviation 3.0 vigra::Kernel1D kernel; kernel.initGaussian(3.0); vigra::separableConvolveX(srcImageRange(src), destImage(dest), kernel1d(kernel)); \endcode */ doxygen_overloaded_function(template <...> void separableConvolveX) template void separableConvolveX(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, KernelIterator ik, KernelAccessor ka, int kleft, int kright, BorderTreatmentMode border) { typedef typename KernelAccessor::value_type KernelValue; vigra_precondition(kleft <= 0, "separableConvolveX(): kleft must be <= 0.\n"); vigra_precondition(kright >= 0, "separableConvolveX(): kright must be >= 0.\n"); int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; vigra_precondition(w >= kright - kleft + 1, "separableConvolveX(): kernel longer than line\n"); int y; for(y=0; y inline void separableConvolveX(triple src, pair dest, tuple5 kernel) { separableConvolveX(src.first, src.second, src.third, dest.first, dest.second, kernel.first, kernel.second, kernel.third, kernel.fourth, kernel.fifth); } /********************************************************/ /* */ /* separableConvolveY */ /* */ /********************************************************/ /** \brief Performs a 1 dimensional convolution in y direction. It calls \ref convolveLine() for every column of the image. See \ref convolveLine() for more information about required interfaces and vigra_preconditions. Declarations: pass arguments explicitly: \code namespace vigra { template void separableConvolveY(SrcImageIterator supperleft, SrcImageIterator slowerright, SrcAccessor sa, DestImageIterator dupperleft, DestAccessor da, KernelIterator ik, KernelAccessor ka, int kleft, int kright, BorderTreatmentMode border) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void separableConvolveY(triple src, pair dest, tuple5 kernel) } \endcode Usage: \#include \<vigra/separableconvolution.hxx\> \code vigra::FImage src(w,h), dest(w,h); ... // define Gaussian kernel with std. deviation 3.0 vigra::Kernel1D kernel; kernel.initGaussian(3.0); vigra::separableConvolveY(srcImageRange(src), destImage(dest), kernel1d(kernel)); \endcode */ doxygen_overloaded_function(template <...> void separableConvolveY) template void separableConvolveY(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, KernelIterator ik, KernelAccessor ka, int kleft, int kright, BorderTreatmentMode border) { typedef typename KernelAccessor::value_type KernelValue; vigra_precondition(kleft <= 0, "separableConvolveY(): kleft must be <= 0.\n"); vigra_precondition(kright >= 0, "separableConvolveY(): kright must be >= 0.\n"); int w = slowerright.x - supperleft.x; int h = slowerright.y - supperleft.y; vigra_precondition(h >= kright - kleft + 1, "separableConvolveY(): kernel longer than line\n"); int x; for(x=0; x inline void separableConvolveY(triple src, pair dest, tuple5 kernel) { separableConvolveY(src.first, src.second, src.third, dest.first, dest.second, kernel.first, kernel.second, kernel.third, kernel.fourth, kernel.fifth); } //@} /********************************************************/ /* */ /* Kernel1D */ /* */ /********************************************************/ /** \brief Generic 1 dimensional convolution kernel. This kernel may be used for convolution of 1 dimensional signals or for separable convolution of multidimensional signals. Convlution functions access the kernel via a 1 dimensional random access iterator which they get by calling \ref center(). This iterator points to the center of the kernel. The kernel's size is given by its left() (<=0) and right() (>= 0) methods. The desired border treatment mode is returned by borderTreatment(). The different init functions create a kernel with the specified properties. The kernel's value_type must be a linear space, i.e. it must define multiplication with doubles and NumericTraits. The kernel defines a factory function kernel1d() to create an argument object (see \ref KernelArgumentObjectFactories). Usage: \#include \<vigra/stdconvolution.hxx\> \code vigra::FImage src(w,h), dest(w,h); ... // define Gaussian kernel with std. deviation 3.0 vigra::Kernel1D kernel; kernel.initGaussian(3.0); vigra::separableConvolveX(srcImageRange(src), destImage(dest), kernel1d(kernel)); \endcode Required Interface: \code value_type v = vigra::NumericTraits::one(); // if norm is not // given explicitly double d; v = d * v; \endcode */ template class Kernel1D { public: typedef ArrayVector InternalVector; /** the kernel's value type */ typedef typename InternalVector::value_type value_type; /** the kernel's reference type */ typedef typename InternalVector::reference reference; /** the kernel's const reference type */ typedef typename InternalVector::const_reference const_reference; /** deprecated -- use Kernel1D::iterator */ typedef typename InternalVector::iterator Iterator; /** 1D random access iterator over the kernel's values */ typedef typename InternalVector::iterator iterator; /** const 1D random access iterator over the kernel's values */ typedef typename InternalVector::const_iterator const_iterator; /** the kernel's accessor */ typedef StandardAccessor Accessor; /** the kernel's const accessor */ typedef StandardConstAccessor ConstAccessor; struct InitProxy { InitProxy(Iterator i, int count, value_type & norm) : iter_(i), base_(i), count_(count), sum_(count), norm_(norm) {} ~InitProxy() { vigra_precondition(count_ == 1 || count_ == sum_, "Kernel1D::initExplicitly(): " "Wrong number of init values."); } InitProxy & operator,(value_type const & v) { if(sum_ == count_) norm_ = *iter_; norm_ += v; --count_; if(count_ > 0) { ++iter_; *iter_ = v; } return *this; } Iterator iter_, base_; int count_, sum_; value_type & norm_; }; static value_type one() { return NumericTraits::one(); } /** Default constructor. Creates a kernel of size 1 which would copy the signal unchanged. */ Kernel1D() : kernel_(), left_(0), right_(0), border_treatment_(BORDER_TREATMENT_REFLECT), norm_(one()) { kernel_.push_back(norm_); } /** Copy constructor. */ Kernel1D(Kernel1D const & k) : kernel_(k.kernel_), left_(k.left_), right_(k.right_), border_treatment_(k.border_treatment_), norm_(k.norm_) {} /** Copy assignment. */ Kernel1D & operator=(Kernel1D const & k) { if(this != &k) { left_ = k.left_; right_ = k.right_; border_treatment_ = k.border_treatment_; norm_ = k.norm_; kernel_ = k.kernel_; } return *this; } /** Initialization. This initializes the kernel with the given constant. The norm becomes v*size(). Instead of a single value an initializer list of length size() can be used like this: \code vigra::Kernel1D roberts_gradient_x; roberts_gradient_x.initExplicitly(0, 1) = 1.0, -1.0; \endcode In this case, the norm will be set to the sum of the init values. An initializer list of wrong length will result in a run-time error. */ InitProxy operator=(value_type const & v) { int size = right_ - left_ + 1; for(unsigned int i=0; inorm' denotes the sum of all bins of the kernel (i.e. the kernel is corrected for the normalization error introduced by windowing the Gaussian to a finite interval). However, if norm is 0.0, the kernel is normalized to 1 by the analytic expression for the Gaussian, and no correction for the windowing error is performed. Precondition: \code std_dev >= 0.0 \endcode Postconditions: \code 1. left() == -(int)(3.0*std_dev + 0.5) 2. right() == (int)(3.0*std_dev + 0.5) 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == norm \endcode */ void initGaussian(double std_dev, value_type norm); /** Init as a Gaussian function with norm 1. */ void initGaussian(double std_dev) { initGaussian(std_dev, one()); } /** Init as Lindeberg's discrete analog of the Gaussian function. The radius of the kernel is always 3*std_dev. 'norm' denotes the sum of all bins of the kernel. Precondition: \code std_dev >= 0.0 \endcode Postconditions: \code 1. left() == -(int)(3.0*std_dev + 0.5) 2. right() == (int)(3.0*std_dev + 0.5) 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == norm \endcode */ void initDiscreteGaussian(double std_dev, value_type norm); /** Init as a Lindeberg's discrete analog of the Gaussian function with norm 1. */ void initDiscreteGaussian(double std_dev) { initDiscreteGaussian(std_dev, one()); } /** Init as a Gaussian derivative of order 'order'. The radius of the kernel is always 3*std_dev + 0.5*order. 'norm' denotes the norm of the kernel so that the following condition is fulfilled: \f[ \sum_{i=left()}^{right()} \frac{(-i)^{order}kernel[i]}{order!} = norm \f] Thus, the kernel will be corrected for the error introduced by windowing the Gaussian to a finite interval. However, if norm is 0.0, the kernel is normalized to 1 by the analytic expression for the Gaussian derivative, and no correction for the windowing error is performed. Preconditions: \code 1. std_dev >= 0.0 2. order >= 1 \endcode Postconditions: \code 1. left() == -(int)(3.0*std_dev + 0.5*order + 0.5) 2. right() == (int)(3.0*std_dev + 0.5*order + 0.5) 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == norm \endcode */ void initGaussianDerivative(double std_dev, int order, value_type norm); /** Init as a Gaussian derivative with norm 1. */ void initGaussianDerivative(double std_dev, int order) { initGaussianDerivative(std_dev, order, one()); } /** Init an optimal 3-tap smoothing filter. The filter values are \code [0.216, 0.568, 0.216] \endcode These values are optimal in the sense that the 3x3 filter obtained by separable application of this filter is the best possible 3x3 approximation to a Gaussian filter. The equivalent Gaussian has sigma = 0.680. Postconditions: \code 1. left() == -1 2. right() == 1 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initOptimalSmoothing3() { this->initExplicitly(-1, 1) = 0.216, 0.568, 0.216; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init an optimal 3-tap smoothing filter to be used in the context of first derivative computation. This filter must be used in conjunction with the symmetric difference filter (see initSymmetricDifference()), such that the difference filter is applied along one dimension, and the smoothing filter along the other. The filter values are \code [0.224365, 0.55127, 0.224365] \endcode These values are optimal in the sense that the 3x3 filter obtained by combining this filter with the symmetric difference is the best possible 3x3 approximation to a Gaussian first derivative filter. The equivalent Gaussian has sigma = 0.675. Postconditions: \code 1. left() == -1 2. right() == 1 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initOptimalFirstDerivativeSmoothing3() { this->initExplicitly(-1, 1) = 0.224365, 0.55127, 0.224365; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init an optimal 3-tap smoothing filter to be used in the context of second derivative computation. This filter must be used in conjunction with the 3-tap second difference filter (see initSecondDifference3()), such that the difference filter is applied along one dimension, and the smoothing filter along the other. The filter values are \code [0.13, 0.74, 0.13] \endcode These values are optimal in the sense that the 3x3 filter obtained by combining this filter with the 3-tap second difference is the best possible 3x3 approximation to a Gaussian second derivative filter. The equivalent Gaussian has sigma = 0.433. Postconditions: \code 1. left() == -1 2. right() == 1 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initOptimalSecondDerivativeSmoothing3() { this->initExplicitly(-1, 1) = 0.13, 0.74, 0.13; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init an optimal 5-tap smoothing filter. The filter values are \code [0.03134, 0.24, 0.45732, 0.24, 0.03134] \endcode These values are optimal in the sense that the 5x5 filter obtained by separable application of this filter is the best possible 5x5 approximation to a Gaussian filter. The equivalent Gaussian has sigma = 0.867. Postconditions: \code 1. left() == -2 2. right() == 2 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initOptimalSmoothing5() { this->initExplicitly(-2, 2) = 0.03134, 0.24, 0.45732, 0.24, 0.03134; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init an optimal 5-tap smoothing filter to be used in the context of first derivative computation. This filter must be used in conjunction with the optimal 5-tap first derivative filter (see initOptimalFirstDerivative5()), such that the derivative filter is applied along one dimension, and the smoothing filter along the other. The filter values are \code [0.04255, 0.241, 0.4329, 0.241, 0.04255] \endcode These values are optimal in the sense that the 5x5 filter obtained by combining this filter with the optimal 5-tap first derivative is the best possible 5x5 approximation to a Gaussian first derivative filter. The equivalent Gaussian has sigma = 0.906. Postconditions: \code 1. left() == -2 2. right() == 2 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initOptimalFirstDerivativeSmoothing5() { this->initExplicitly(-2, 2) = 0.04255, 0.241, 0.4329, 0.241, 0.04255; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init an optimal 5-tap smoothing filter to be used in the context of second derivative computation. This filter must be used in conjunction with the optimal 5-tap second derivative filter (see initOptimalSecondDerivative5()), such that the derivative filter is applied along one dimension, and the smoothing filter along the other. The filter values are \code [0.0243, 0.23556, 0.48028, 0.23556, 0.0243] \endcode These values are optimal in the sense that the 5x5 filter obtained by combining this filter with the optimal 5-tap second derivative is the best possible 5x5 approximation to a Gaussian second derivative filter. The equivalent Gaussian has sigma = 0.817. Postconditions: \code 1. left() == -2 2. right() == 2 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initOptimalSecondDerivativeSmoothing5() { this->initExplicitly(-2, 2) = 0.0243, 0.23556, 0.48028, 0.23556, 0.0243; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init a 5-tap filter as defined by Peter Burt in the context of pyramid creation. The filter values are \code [a, 0.25, 0.5-2*a, 0.25, a] \endcode The default a = 0.04785 is optimal in the sense that it minimizes the difference to a true Gaussian filter (which would have sigma = 0.975). For other values of a, the scale of the most similar Gaussian can be approximated by \code sigma = 5.1 * a + 0.731 \endcode Preconditions: \code 0 <= a <= 0.125 \endcode Postconditions: \code 1. left() == -2 2. right() == 2 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initBurtFilter(double a = 0.04785) { vigra_precondition(a >= 0.0 && a <= 0.125, "Kernel1D::initBurtFilter(): 0 <= a <= 0.125 required."); this->initExplicitly(-2, 2) = a, 0.25, 0.5 - 2.0*a, 0.25, a; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init as a Binomial filter. 'norm' denotes the sum of all bins of the kernel. Precondition: \code radius >= 0 \endcode Postconditions: \code 1. left() == -radius 2. right() == radius 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == norm \endcode */ void initBinomial(int radius, value_type norm); /** Init as a Binomial filter with norm 1. */ void initBinomial(int radius) { initBinomial(radius, one()); } /** Init as an Averaging filter. 'norm' denotes the sum of all bins of the kernel. The window size is (2*radius+1) * (2*radius+1) Precondition: \code radius >= 0 \endcode Postconditions: \code 1. left() == -radius 2. right() == radius 3. borderTreatment() == BORDER_TREATMENT_CLIP 4. norm() == norm \endcode */ void initAveraging(int radius, value_type norm); /** Init as an Averaging filter with norm 1. */ void initAveraging(int radius) { initAveraging(radius, one()); } /** Init as a symmetric gradient filter of the form [ 0.5 * norm, 0.0 * norm, -0.5 * norm] Deprecated. Use initSymmetricDifference() instead. Postconditions: \code 1. left() == -1 2. right() == 1 3. borderTreatment() == BORDER_TREATMENT_REPEAT 4. norm() == norm \endcode */ void initSymmetricGradient(value_type norm ) { initSymmetricDifference(norm); setBorderTreatment(BORDER_TREATMENT_REPEAT); } /** Init as a symmetric gradient filter with norm 1. Deprecated. Use initSymmetricDifference() instead. */ void initSymmetricGradient() { initSymmetricGradient(one()); } void initSymmetricDifference(value_type norm ); /** Init as the 3-tap symmetric difference filter The filter values are \code [0.5, 0, -0.5] \endcode Postconditions: \code 1. left() == -1 2. right() == 1 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initSymmetricDifference() { initSymmetricDifference(one()); } /** Init the 3-tap second difference filter. The filter values are \code [1, -2, 1] \endcode Postconditions: \code 1. left() == -1 2. right() == 1 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1 \endcode */ void initSecondDifference3() { this->initExplicitly(-1, 1) = 1.0, -2.0, 1.0; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init an optimal 5-tap first derivative filter. This filter must be used in conjunction with the corresponding 5-tap smoothing filter (see initOptimalFirstDerivativeSmoothing5()), such that the derivative filter is applied along one dimension, and the smoothing filter along the other. The filter values are \code [0.1, 0.3, 0.0, -0.3, -0.1] \endcode These values are optimal in the sense that the 5x5 filter obtained by combining this filter with the corresponding 5-tap smoothing filter is the best possible 5x5 approximation to a Gaussian first derivative filter. The equivalent Gaussian has sigma = 0.906. If the filter is instead separably combined with itself, an almost optimal approximation of the mixed second Gaussian derivative at scale sigma = 0.899 results. Postconditions: \code 1. left() == -2 2. right() == 2 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initOptimalFirstDerivative5() { this->initExplicitly(-2, 2) = 0.1, 0.3, 0.0, -0.3, -0.1; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init an optimal 5-tap second derivative filter. This filter must be used in conjunction with the corresponding 5-tap smoothing filter (see initOptimalSecondDerivativeSmoothing5()), such that the derivative filter is applied along one dimension, and the smoothing filter along the other. The filter values are \code [0.22075, 0.117, -0.6755, 0.117, 0.22075] \endcode These values are optimal in the sense that the 5x5 filter obtained by combining this filter with the corresponding 5-tap smoothing filter is the best possible 5x5 approximation to a Gaussian second derivative filter. The equivalent Gaussian has sigma = 0.817. Postconditions: \code 1. left() == -2 2. right() == 2 3. borderTreatment() == BORDER_TREATMENT_REFLECT 4. norm() == 1.0 \endcode */ void initOptimalSecondDerivative5() { this->initExplicitly(-2, 2) = 0.22075, 0.117, -0.6755, 0.117, 0.22075; this->setBorderTreatment(BORDER_TREATMENT_REFLECT); } /** Init the kernel by an explicit initializer list. The left and right boundaries of the kernel must be passed. A comma-separated initializer list is given after the assignment operator. This function is used like this: \code // define horizontal Roberts filter vigra::Kernel1D roberts_gradient_x; roberts_gradient_x.initExplicitly(0, 1) = 1.0, -1.0; \endcode The norm is set to the sum of the initialzer values. If the wrong number of values is given, a run-time error results. It is, however, possible to give just one initializer. This creates an averaging filter with the given constant: \code vigra::Kernel1D average5x1; average5x1.initExplicitly(-2, 2) = 1.0/5.0; \endcode Here, the norm is set to value*size(). Preconditions: \code 1. left <= 0 2. right >= 0 3. the number of values in the initializer list is 1 or equals the size of the kernel. \endcode */ Kernel1D & initExplicitly(int left, int right) { vigra_precondition(left <= 0, "Kernel1D::initExplicitly(): left border must be <= 0."); vigra_precondition(right >= 0, "Kernel1D::initExplicitly(): right border must be >= 0."); right_ = right; left_ = left; kernel_.resize(right - left + 1); return *this; } /** Get iterator to center of kernel Postconditions: \code center()[left()] ... center()[right()] are valid kernel positions \endcode */ iterator center() { return kernel_.begin() - left(); } const_iterator center() const { return kernel_.begin() - left(); } /** Access kernel value at specified location. Preconditions: \code left() <= location <= right() \endcode */ reference operator[](int location) { return kernel_[location - left()]; } const_reference operator[](int location) const { return kernel_[location - left()]; } /** left border of kernel (inclusive), always <= 0 */ int left() const { return left_; } /** right border of kernel (inclusive), always >= 0 */ int right() const { return right_; } /** size of kernel (right() - left() + 1) */ int size() const { return right_ - left_ + 1; } /** current border treatment mode */ BorderTreatmentMode borderTreatment() const { return border_treatment_; } /** Set border treatment mode. */ void setBorderTreatment( BorderTreatmentMode new_mode) { border_treatment_ = new_mode; } /** norm of kernel */ value_type norm() const { return norm_; } /** set a new norm and normalize kernel, use the normalization formula for the given derivativeOrder. */ void normalize(value_type norm, unsigned int derivativeOrder = 0, double offset = 0.0); /** normalize kernel to norm 1. */ void normalize() { normalize(one()); } /** get a const accessor */ ConstAccessor accessor() const { return ConstAccessor(); } /** get an accessor */ Accessor accessor() { return Accessor(); } private: InternalVector kernel_; int left_, right_; BorderTreatmentMode border_treatment_; value_type norm_; }; template void Kernel1D::normalize(value_type norm, unsigned int derivativeOrder, double offset) { typedef typename NumericTraits::RealPromote TmpType; // find kernel sum Iterator k = kernel_.begin(); TmpType sum = NumericTraits::zero(); if(derivativeOrder == 0) { for(; k < kernel_.end(); ++k) { sum += *k; } } else { unsigned int faculty = 1; for(unsigned int i = 2; i <= derivativeOrder; ++i) faculty *= i; for(double x = left() + offset; k < kernel_.end(); ++x, ++k) { sum += *k * VIGRA_CSTD::pow(-x, int(derivativeOrder)) / faculty; } } vigra_precondition(sum != NumericTraits::zero(), "Kernel1D::normalize(): " "Cannot normalize a kernel with sum = 0"); // normalize sum = norm / sum; k = kernel_.begin(); for(; k != kernel_.end(); ++k) { *k = *k * sum; } norm_ = norm; } /***********************************************************************/ template void Kernel1D::initGaussian(double std_dev, value_type norm) { vigra_precondition(std_dev >= 0.0, "Kernel1D::initGaussian(): Standard deviation must be >= 0."); if(std_dev > 0.0) { Gaussian gauss(std_dev); // first calculate required kernel sizes int radius = (int)(3.0 * std_dev + 0.5); if(radius == 0) radius = 1; // allocate the kernel kernel_.erase(kernel_.begin(), kernel_.end()); kernel_.reserve(radius*2+1); for(ARITHTYPE x = -radius; x <= radius; ++x) { kernel_.push_back(gauss(x)); } left_ = -radius; right_ = radius; } else { kernel_.erase(kernel_.begin(), kernel_.end()); kernel_.push_back(1.0); left_ = 0; right_ = 0; } if(norm != 0.0) normalize(norm); else norm_ = 1.0; // best border treatment for Gaussians is BORDER_TREATMENT_REFLECT border_treatment_ = BORDER_TREATMENT_REFLECT; } /***********************************************************************/ template void Kernel1D::initDiscreteGaussian(double std_dev, value_type norm) { vigra_precondition(std_dev >= 0.0, "Kernel1D::initDiscreteGaussian(): Standard deviation must be >= 0."); if(std_dev > 0.0) { // first calculate required kernel sizes int radius = (int)(3.0*std_dev + 0.5); if(radius == 0) radius = 1; double f = 2.0 / std_dev / std_dev; // allocate the working array int maxIndex = (int)(2.0 * (radius + 5.0 * VIGRA_CSTD::sqrt((double)radius)) + 0.5); InternalVector warray(maxIndex+1); warray[maxIndex] = 0.0; warray[maxIndex-1] = 1.0; for(int i = maxIndex-2; i >= radius; --i) { warray[i] = warray[i+2] + f * (i+1) * warray[i+1]; if(warray[i] > 1.0e40) { warray[i+1] /= warray[i]; warray[i] = 1.0; } } // the following rescaling ensures that the numbers stay in a sensible range // during the rest of the iteration, so no other rescaling is needed double er = VIGRA_CSTD::exp(-radius*radius / (2.0*std_dev*std_dev)); warray[radius+1] = er * warray[radius+1] / warray[radius]; warray[radius] = er; for(int i = radius-1; i >= 0; --i) { warray[i] = warray[i+2] + f * (i+1) * warray[i+1]; er += warray[i]; } double scale = norm / (2*er - warray[0]); initExplicitly(-radius, radius); iterator c = center(); for(int i=0; i<=radius; ++i) { c[i] = c[-i] = warray[i] * scale; } } else { kernel_.erase(kernel_.begin(), kernel_.end()); kernel_.push_back(norm); left_ = 0; right_ = 0; } norm_ = norm; // best border treatment for Gaussians is BORDER_TREATMENT_REFLECT border_treatment_ = BORDER_TREATMENT_REFLECT; } /***********************************************************************/ template void Kernel1D::initGaussianDerivative(double std_dev, int order, value_type norm) { vigra_precondition(order >= 0, "Kernel1D::initGaussianDerivative(): Order must be >= 0."); if(order == 0) { initGaussian(std_dev, norm); return; } vigra_precondition(std_dev > 0.0, "Kernel1D::initGaussianDerivative(): " "Standard deviation must be > 0."); Gaussian gauss(std_dev, order); // first calculate required kernel sizes int radius = (int)(3.0 * std_dev + 0.5 * order + 0.5); if(radius == 0) radius = 1; // allocate the kernels kernel_.clear(); kernel_.reserve(radius*2+1); // fill the kernel and calculate the DC component // introduced by truncation of the Gaussian ARITHTYPE dc = 0.0; for(ARITHTYPE x = -radius; x <= radius; ++x) { kernel_.push_back(gauss(x)); dc += kernel_[kernel_.size()-1]; } dc /= (2.0*radius + 1.0); // remove DC, but only if kernel correction is permitted by a non-zero // value for norm if(norm != 0.0) { for(unsigned int i=0; i < kernel_.size(); ++i) { kernel_[i] -= dc; } } left_ = -radius; right_ = radius; if(norm != 0.0) normalize(norm, order); else norm_ = 1.0; // best border treatment for Gaussian derivatives is // BORDER_TREATMENT_REFLECT border_treatment_ = BORDER_TREATMENT_REFLECT; } /***********************************************************************/ template void Kernel1D::initBinomial(int radius, value_type norm) { vigra_precondition(radius > 0, "Kernel1D::initBinomial(): Radius must be > 0."); // allocate the kernel InternalVector kernel(radius*2+1); int i,j; for(i=0; i=-radius; --j) { for(i=j; i void Kernel1D::initAveraging(int radius, value_type norm) { vigra_precondition(radius > 0, "Kernel1D::initAveraging(): Radius must be > 0."); // calculate scaling double scale = 1.0 / (radius * 2 + 1); // normalize kernel_.erase(kernel_.begin(), kernel_.end()); kernel_.reserve(radius*2+1); for(int i=0; i<=radius*2+1; ++i) { kernel_.push_back(scale * norm); } left_ = -radius; right_ = radius; norm_ = norm; // best border treatment for Averaging is BORDER_TREATMENT_CLIP border_treatment_ = BORDER_TREATMENT_CLIP; } /***********************************************************************/ template void Kernel1D::initSymmetricDifference(value_type norm) { kernel_.erase(kernel_.begin(), kernel_.end()); kernel_.reserve(3); kernel_.push_back(0.5 * norm); kernel_.push_back(0.0 * norm); kernel_.push_back(-0.5 * norm); left_ = -1; right_ = 1; norm_ = norm; // best border treatment for symmetric difference is // BORDER_TREATMENT_REFLECT border_treatment_ = BORDER_TREATMENT_REFLECT; } /**************************************************************/ /* */ /* Argument object factories for Kernel1D */ /* */ /* (documentation: see vigra/convolution.hxx) */ /* */ /**************************************************************/ template inline tuple5 kernel1d(KernelIterator ik, KernelAccessor ka, int kleft, int kright, BorderTreatmentMode border) { return tuple5( ik, ka, kleft, kright, border); } template inline tuple5::const_iterator, typename Kernel1D::ConstAccessor, int, int, BorderTreatmentMode> kernel1d(Kernel1D const & k) { return tuple5::const_iterator, typename Kernel1D::ConstAccessor, int, int, BorderTreatmentMode>( k.center(), k.accessor(), k.left(), k.right(), k.borderTreatment()); } template inline tuple5::const_iterator, typename Kernel1D::ConstAccessor, int, int, BorderTreatmentMode> kernel1d(Kernel1D const & k, BorderTreatmentMode border) { return tuple5::const_iterator, typename Kernel1D::ConstAccessor, int, int, BorderTreatmentMode>( k.center(), k.accessor(), k.left(), k.right(), border); } } // namespace vigra #endif // VIGRA_SEPARABLECONVOLUTION_HXX gamera-3.3.3/include/vigra/singular_value_decomposition.hxx0000644000076500000000000004311511261456425023214 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2007 by Ullrich Koethe */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_SINGULAR_VALUE_DECOMPOSITION_HXX #define VIGRA_SINGULAR_VALUE_DECOMPOSITION_HXX #include "matrix.hxx" #include "array_vector.hxx" namespace vigra { namespace linalg { /** Singular Value Decomposition. \ingroup MatrixAlgebra For an m-by-n matrix \a A with m >= n, the singular value decomposition is an m-by-n orthogonal matrix \a U, an n-by-n diagonal matrix S, and an n-by-n orthogonal matrix \a V so that A = U*S*V'. To save memory, this functions stores the matrix \a S in a column vector of appropriate length (a diagonal matrix can be obtained by diagonalMatrix(S)). The singular values, sigma[k] = S(k, 0), are ordered so that sigma[0] >= sigma[1] >= ... >= sigma[n-1]. The singular value decomposition always exists, so this function will never fail (except if the shapes of the argument matrices don't match). The effective numerical rank of A is returned. (Adapted from JAMA, a Java Matrix Library, developed jointly by the Mathworks and NIST; see http://math.nist.gov/javanumerics/jama). \#include \<vigra/singular_value_decomposition.hxx\> or
\#include \<vigra/linear_algebra.hxx\>
Namespaces: vigra and vigra::linalg */ template unsigned int singularValueDecomposition(MultiArrayView<2, T, C1> const & A, MultiArrayView<2, T, C2> &U, MultiArrayView<2, T, C3> &S, MultiArrayView<2, T, C4> &V) { typedef T Real; typedef MultiArrayShape<2>::type Shape; const MultiArrayIndex rows = rowCount(A); const MultiArrayIndex cols = columnCount(A); vigra_precondition(rows >= cols, "singularValueDecomposition(): Input matrix A must be rectangular with rowCount >= columnCount."); vigra_precondition(rowCount(S) == cols && columnCount(S) == 1, "singularValueDecomposition(): Output S must be column vector with rowCount == columnCount(A)."); vigra_precondition(rowCount(U) == rows && columnCount(U) == cols, "singularValueDecomposition(): Output matrix U must have the same dimensions as input matrix A."); vigra_precondition(rowCount(V) == cols && columnCount(V) == cols, "singularValueDecomposition(): Output matrix V must be square with n = columnCount(A)."); MultiArrayIndex m = rows; MultiArrayIndex n = cols; MultiArrayIndex nu = n; U.init(0.0); S.init(0.0); V.init(0.0); ArrayVector e((unsigned int)n); ArrayVector work((unsigned int)m); Matrix a(A); MultiArrayView<1, T, C3> s = S.bindOuter(0); MultiArrayIndex i=0, j=0, k=0; // Reduce a to bidiagonal form, storing the diagonal elements // in s and the super-diagonal elements in e. MultiArrayIndex nct = std::min(m-1,n); MultiArrayIndex nrt = std::max((MultiArrayIndex)0,n-2); for (k = 0; k < std::max(nct,nrt); ++k) { if (k < nct) { // Compute the transformation for the k-th column and // place the k-th diagonal in s(k). // Compute 2-norm of k-th column without under/overflow. s(k) = 0.0; for (i = k; i < m; ++i) { s(k) = hypot(s(k), a(i, k)); } if (s(k) != 0.0) { if (a(k, k) < 0.0) { s(k) = -s(k); } for (i = k; i < m; ++i) { a(i, k) /= s(k); } a(k, k) += 1.0; } s(k) = -s(k); } for (j = k+1; j < n; ++j) { if ((k < nct) && (s(k) != 0.0)) { // Apply the transformation. Real t(0.0); for (i = k; i < m; ++i) { t += a(i, k)*a(i, j); } t = -t/a(k, k); for (i = k; i < m; ++i) { a(i, j) += t*a(i, k); } } // Place the k-th row of a into e for the // subsequent calculation of the row transformation. e[j] = a(k, j); } if (k < nct) { // Place the transformation in U for subsequent back // multiplication. for (i = k; i < m; ++i) { U(i, k) = a(i, k); } } if (k < nrt) { // Compute the k-th row transformation and place the // k-th super-diagonal in e[k]. // Compute 2-norm without under/overflow. e[k] = 0; for (i = k+1; i < n; ++i) { e[k] = hypot(e[k],e[i]); } if (e[k] != 0.0) { if (e[k+1] < 0.0) { e[k] = -e[k]; } for (i = k+1; i < n; ++i) { e[i] /= e[k]; } e[k+1] += 1.0; } e[k] = -e[k]; if ((k+1 < m) & (e[k] != 0.0)) { // Apply the transformation. for (i = k+1; i < m; ++i) { work[i] = 0.0; } for (j = k+1; j < n; ++j) { for (i = k+1; i < m; ++i) { work[i] += e[j]*a(i, j); } } for (j = k+1; j < n; ++j) { Real t(-e[j]/e[k+1]); for (i = k+1; i < m; ++i) { a(i, j) += t*work[i]; } } } // Place the transformation in V for subsequent // back multiplication. for (i = k+1; i < n; ++i) { V(i, k) = e[i]; } } } // Set up the final bidiagonal matrix of order p. MultiArrayIndex p = n; if (nct < n) { s(nct) = a(nct, nct); } if (m < p) { s(p-1) = 0.0; } if (nrt+1 < p) { e[nrt] = a(nrt, p-1); } e[p-1] = 0.0; // Generate U. for (j = nct; j < nu; ++j) { for (i = 0; i < m; ++i) { U(i, j) = 0.0; } U(j, j) = 1.0; } for (k = nct-1; k >= 0; --k) { if (s(k) != 0.0) { for (j = k+1; j < nu; ++j) { Real t(0.0); for (i = k; i < m; ++i) { t += U(i, k)*U(i, j); } t = -t/U(k, k); for (i = k; i < m; ++i) { U(i, j) += t*U(i, k); } } for (i = k; i < m; ++i ) { U(i, k) = -U(i, k); } U(k, k) = 1.0 + U(k, k); for (i = 0; i < k-1; ++i) { U(i, k) = 0.0; } } else { for (i = 0; i < m; ++i) { U(i, k) = 0.0; } U(k, k) = 1.0; } } // Generate V. for (k = n-1; k >= 0; --k) { if ((k < nrt) & (e[k] != 0.0)) { for (j = k+1; j < nu; ++j) { Real t(0.0); for (i = k+1; i < n; ++i) { t += V(i, k)*V(i, j); } t = -t/V(k+1, k); for (i = k+1; i < n; ++i) { V(i, j) += t*V(i, k); } } } for (i = 0; i < n; ++i) { V(i, k) = 0.0; } V(k, k) = 1.0; } // Main iteration loop for the singular values. MultiArrayIndex pp = p-1; int iter = 0; Real eps = NumericTraits::epsilon()*2.0; while (p > 0) { MultiArrayIndex k=0; int kase=0; // Here is where a test for too many iterations would go. // This section of the program inspects for // negligible elements in the s and e arrays. On // completion the variables kase and k are set as follows. // kase = 1 if s(p) and e[k-1] are negligible and k

= -1; --k) { if (k == -1) { break; } if (abs(e[k]) <= eps*(abs(s(k)) + abs(s(k+1)))) { e[k] = 0.0; break; } } if (k == p-2) { kase = 4; } else { MultiArrayIndex ks; for (ks = p-1; ks >= k; --ks) { if (ks == k) { break; } Real t( (ks != p ? abs(e[ks]) : 0.) + (ks != k+1 ? abs(e[ks-1]) : 0.)); if (abs(s(ks)) <= eps*t) { s(ks) = 0.0; break; } } if (ks == k) { kase = 3; } else if (ks == p-1) { kase = 1; } else { kase = 2; k = ks; } } ++k; // Perform the task indicated by kase. switch (kase) { case 1: // Deflate negligible s(p). { Real f(e[p-2]); e[p-2] = 0.0; for (j = p-2; j >= k; --j) { Real t( hypot(s(j),f)); Real cs(s(j)/t); Real sn(f/t); s(j) = t; if (j != k) { f = -sn*e[j-1]; e[j-1] = cs*e[j-1]; } for (i = 0; i < n; ++i) { t = cs*V(i, j) + sn*V(i, p-1); V(i, p-1) = -sn*V(i, j) + cs*V(i, p-1); V(i, j) = t; } } break; } case 2: // Split at negligible s(k). { Real f(e[k-1]); e[k-1] = 0.0; for (j = k; j < p; ++j) { Real t(hypot(s(j),f)); Real cs( s(j)/t); Real sn(f/t); s(j) = t; f = -sn*e[j]; e[j] = cs*e[j]; for (i = 0; i < m; ++i) { t = cs*U(i, j) + sn*U(i, k-1); U(i, k-1) = -sn*U(i, j) + cs*U(i, k-1); U(i, j) = t; } } break; } case 3: // Perform one qr step. { // Calculate the shift. Real scale = std::max(std::max(std::max(std::max( abs(s(p-1)),abs(s(p-2))),abs(e[p-2])), abs(s(k))),abs(e[k])); Real sp = s(p-1)/scale; Real spm1 = s(p-2)/scale; Real epm1 = e[p-2]/scale; Real sk = s(k)/scale; Real ek = e[k]/scale; Real b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/2.0; Real c = (sp*epm1)*(sp*epm1); Real shift = 0.0; if ((b != 0.0) || (c != 0.0)) { shift = VIGRA_CSTD::sqrt(b*b + c); if (b < 0.0) { shift = -shift; } shift = c/(b + shift); } Real f = (sk + sp)*(sk - sp) + shift; Real g = sk*ek; // Chase zeros. for (j = k; j < p-1; ++j) { Real t = hypot(f,g); Real cs = f/t; Real sn = g/t; if (j != k) { e[j-1] = t; } f = cs*s(j) + sn*e[j]; e[j] = cs*e[j] - sn*s(j); g = sn*s(j+1); s(j+1) = cs*s(j+1); for (i = 0; i < n; ++i) { t = cs*V(i, j) + sn*V(i, j+1); V(i, j+1) = -sn*V(i, j) + cs*V(i, j+1); V(i, j) = t; } t = hypot(f,g); cs = f/t; sn = g/t; s(j) = t; f = cs*e[j] + sn*s(j+1); s(j+1) = -sn*e[j] + cs*s(j+1); g = sn*e[j+1]; e[j+1] = cs*e[j+1]; if (j < m-1) { for (i = 0; i < m; ++i) { t = cs*U(i, j) + sn*U(i, j+1); U(i, j+1) = -sn*U(i, j) + cs*U(i, j+1); U(i, j) = t; } } } e[p-2] = f; iter = iter + 1; break; } case 4: // Convergence. { // Make the singular values positive. if (s(k) <= 0.0) { s(k) = (s(k) < 0.0 ? -s(k) : 0.0); for (i = 0; i <= pp; ++i) { V(i, k) = -V(i, k); } } // Order the singular values. while (k < pp) { if (s(k) >= s(k+1)) { break; } Real t = s(k); s(k) = s(k+1); s(k+1) = t; if (k < n-1) { for (i = 0; i < n; ++i) { t = V(i, k+1); V(i, k+1) = V(i, k); V(i, k) = t; } } if (k < m-1) { for (i = 0; i < m; ++i) { t = U(i, k+1); U(i, k+1) = U(i, k); U(i, k) = t; } } ++k; } iter = 0; --p; break; } default: vigra_fail("vigra::svd(): Internal error."); } } Real tol = std::max(m,n)*s(0)*eps; unsigned int rank = 0; for (MultiArrayIndex i = 0; i < n; ++i) { if (s(i) > tol) { ++rank; } } return rank; // effective rank } } // namespace linalg using linalg::singularValueDecomposition; } // namespace vigra #endif // VIGRA_SINGULAR_VALUE_DECOMPOSITION_HXX gamera-3.3.3/include/vigra/sized_int.hxx0000644000076500000000000001517011747510564017234 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_SIZED_INT_HXX #define VIGRA_SIZED_INT_HXX #include "metaprogramming.hxx" namespace vigra { class Int_type_not_supported_on_this_platform {}; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION namespace detail { template struct IntTypeList { enum { size = sizeof(T)*8 }; typedef T type; typedef NEXT next; }; template struct SelectIntegerType { typedef typename IfBool<(SIZE == LIST::size), typename LIST::type, typename SelectIntegerType::type >::type type; }; template struct SelectIntegerType { typedef Int_type_not_supported_on_this_platform type; }; template struct SelectBiggestIntegerType { enum { cursize = static_cast(LIST::size), nextsize = static_cast(SelectBiggestIntegerType::size), size = (cursize < nextsize) ? nextsize : cursize }; typedef typename IfBool<(cursize < nextsize), typename SelectBiggestIntegerType::type, typename LIST::type>::type type; }; template<> struct SelectBiggestIntegerType { enum { size = 0 }; typedef Int_type_not_supported_on_this_platform type; }; typedef IntTypeList > > > > SignedIntTypes; typedef IntTypeList > > > > UnsignedIntTypes; } // namespace detail /** \addtogroup FixedSizeInt Fixed Size Integer Types Since the C++ standard does only specify minimal sizes for the built-in integer types, one cannot rely on them to have a specific size. But pixel types with a specific size are often required in image processing, especially when reading or writing binary files. The VIGRA typedefs are guaranteed to have exactly the correct size. If the system does not provide a suitable type, the typedef will evaluate to Int_type_not_supported_on_this_platform. */ //@{ /// 8-bit signed int typedef detail::SelectIntegerType<8, detail::SignedIntTypes>::type Int8; /// 16-bit signed int typedef detail::SelectIntegerType<16, detail::SignedIntTypes>::type Int16; /// 32-bit signed int typedef detail::SelectIntegerType<32, detail::SignedIntTypes>::type Int32; /// 64-bit signed int typedef detail::SelectIntegerType<64, detail::SignedIntTypes>::type Int64; /// 8-bit unsigned int typedef detail::SelectIntegerType<8, detail::UnsignedIntTypes>::type UInt8; /// 16-bit unsigned int typedef detail::SelectIntegerType<16, detail::UnsignedIntTypes>::type UInt16; /// 32-bit unsigned int typedef detail::SelectIntegerType<32, detail::UnsignedIntTypes>::type UInt32; /// 64-bit unsigned int typedef detail::SelectIntegerType<64, detail::UnsignedIntTypes>::type UInt64; /// the biggest signed integer type of the system typedef detail::SelectBiggestIntegerType::type IntBiggest; /// the biggest unsigned integer type of the system typedef detail::SelectBiggestIntegerType::type UIntBiggest; //@} #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION typedef signed char Int8; typedef signed short Int16; typedef signed int Int32; typedef Int_type_not_supported_on_this_platform Int64; typedef unsigned char UInt8; typedef unsigned short UInt16; typedef unsigned int UInt32; typedef Int_type_not_supported_on_this_platform UInt64; typedef Int32 IntBiggest; typedef UInt32 UIntBiggest; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION } // namespace vigra #endif /* VIGRA_SIZED_INT_HXX */ gamera-3.3.3/include/vigra/slanted_edge_mtf.hxx0000644000076500000000000006156311261456425020533 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2006 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_SLANTED_EDGE_MTF_HXX #define VIGRA_SLANTED_EDGE_MTF_HXX #include #include "array_vector.hxx" #include "basicgeometry.hxx" #include "edgedetection.hxx" #include "fftw3.hxx" #include "functorexpression.hxx" #include "linear_solve.hxx" #include "mathutil.hxx" #include "numerictraits.hxx" #include "separableconvolution.hxx" #include "static_assert.hxx" #include "stdimage.hxx" #include "transformimage.hxx" #include "utilities.hxx" namespace vigra { /** \addtogroup SlantedEdgeMTF Camera MTF Estimation Determine the magnitude transfer function (MTF) of a camera using the slanted edge method. */ //@{ /********************************************************/ /* */ /* SlantedEdgeMTFOptions */ /* */ /********************************************************/ /** \brief Pass options to one of the \ref slantedEdgeMTF() functions. SlantedEdgeMTFOptions is an argument objects that holds various optional parameters used by the \ref slantedEdgeMTF() functions. If a parameter is not explicitly set, a suitable default will be used. Changing the defaults is only necessary if you can't obtain good input data, but absolutely need an MTF estimate. Usage: \#include \<vigra/slanted_edge_mtf.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); std::vector > mtf; ... vigra::slantedEdgeMTF(srcImageRange(src), mtf, vigra::SlantedEdgeMTFOptions().mtfSmoothingScale(1.0)); // print the frequency / attenuation pairs found for(int k=0; k Default: 20 */ SlantedEdgeMTFOptions & minimumNumberOfLines(unsigned int n) { minimum_number_of_lines = n; return *this; } /** Desired number of pixels perpendicular to the edge. The larger the regions to either side of the edge, the more accurate the resulting MTF estimate. If you don't have good data, but absolutely have to compute an MTF, you may force a lower value here.
Default: 10 */ SlantedEdgeMTFOptions & desiredEdgeWidth(unsigned int n) { desired_edge_width = n; return *this; } /** Minimum acceptable number of pixels perpendicular to the edge. The larger the regions to either side of the edge, the more accurate the resulting MTF estimate. If you don't have good data, but absolutely have to compute an MTF, you may force a lower value here.
Default: 5 */ SlantedEdgeMTFOptions & minimumEdgeWidth(unsigned int n) { minimum_edge_width = n; return *this; } /** Amount of smoothing of the computed MTF. If the datais noisy, so will be the MTF. Thus, some smoothing is useful.
Default: 2.0 */ SlantedEdgeMTFOptions & mtfSmoothingScale(double scale) { vigra_precondition(scale >= 0.0, "SlantedEdgeMTFOptions: MTF smoothing scale must not be < 0."); mtf_smoothing_scale = scale; return *this; } unsigned int minimum_number_of_lines, desired_edge_width, minimum_edge_width; double mtf_smoothing_scale; }; //@} namespace detail { struct SortEdgelsByStrength { bool operator()(Edgel const & l, Edgel const & r) const { return l.strength > r.strength; } }; /* Make sure that the edge runs vertically, intersects the top and bottom border of the image, and white is on the left. */ template unsigned int prepareSlantedEdgeInput(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestImage & res, SlantedEdgeMTFOptions const & options) { unsigned int w = slr.x - sul.x; unsigned int h = slr.y - sul.y; // find rough estimate of the edge ArrayVector edgels; cannyEdgelList(sul, slr, src, edgels, 2.0); std::sort(edgels.begin(), edgels.end(), SortEdgelsByStrength()); double x = 0.0, y = 0.0, x2 = 0.0, y2 = 0.0, xy = 0.0; unsigned int c = std::min(w, h); for(unsigned int k = 0; k < c; ++k) { x += edgels[k].x; y += edgels[k].y; x2 += sq(edgels[k].x); xy += edgels[k].x*edgels[k].y; y2 += sq(edgels[k].y); } double xc = x / c, yc = y / c; x2 = x2 / c - sq(xc); xy = xy / c - xc*yc; y2 = y2 / c - sq(yc); double angle = 0.5*VIGRA_CSTD::atan2(2*xy, x2 - y2); DestImage tmp; // rotate image when slope is less than +-45 degrees if(VIGRA_CSTD::fabs(angle) < M_PI / 4.0) { xc = yc; yc = w - xc - 1; std::swap(w, h); tmp.resize(w, h); rotateImage(srcIterRange(sul, slr, src), destImage(tmp), 90); angle += M_PI / 2.0; } else { tmp.resize(w, h); copyImage(srcIterRange(sul, slr, src), destImage(tmp)); if(angle < 0.0) angle += M_PI; } // angle is now between pi/4 and 3*pi/4 double slope = VIGRA_CSTD::tan(M_PI/2.0 - angle); vigra_precondition(slope != 0.0, "slantedEdgeMTF(): Input edge is not slanted"); // trim image so that the edge only intersects the top and bottom border unsigned int minimumNumberOfLines = options.minimum_number_of_lines, //20, edgeWidth = options.desired_edge_width, // 10 minimumEdgeWidth = options.minimum_edge_width; // 5 int y0, y1; for(; edgeWidth >= minimumEdgeWidth; --edgeWidth) { y0 = int(VIGRA_CSTD::floor((edgeWidth - xc) / slope + yc + 0.5)); y1 = int(VIGRA_CSTD::floor((w - edgeWidth - 1 - xc) / slope + yc + 0.5)); if(slope < 0.0) std::swap(y0, y1); if(y1 - y0 >= (int)minimumNumberOfLines) break; } vigra_precondition(edgeWidth >= minimumEdgeWidth, "slantedEdgeMTF(): Input edge is too slanted or image is too small"); y0 = std::max(y0, 0); y1 = std::min(y1+1, (int)h); res.resize(w, y1-y0); // ensure that white is on the left if(tmp(0,0) < tmp(w-1, h-1)) { rotateImage(srcIterRange(tmp.upperLeft() + Diff2D(0, y0), tmp.upperLeft() + Diff2D(w, y1), tmp.accessor()), destImage(res), 180); } else { copyImage(srcImageRange(tmp), destImage(res)); } return edgeWidth; } template void slantedEdgeShadingCorrection(Image & i, unsigned int edgeWidth) { using namespace functor; // after prepareSlantedEdgeInput(), the white region is on the left // find a plane that approximates the logarithm of the white ROI transformImage(srcImageRange(i), destImage(i), log(Arg1() + Param(1.0))); unsigned int w = i.width(), h = i.height(), s = edgeWidth*h; Matrix m(3,3), r(3, 1), l(3, 1); for(unsigned int y = 0; y < h; ++y) { for(unsigned int x = 0; x < edgeWidth; ++x) { l(0,0) = x; l(1,0) = y; l(2,0) = 1.0; m += outer(l); r += i(x,y)*l; } } linearSolve(m, r, l); double a = l(0,0), b = l(1,0), c = l(2,0); // subtract the plane and go back to the non-logarithmic representation for(unsigned int y = 0; y < h; ++y) { for(unsigned int x = 0; x < w; ++x) { i(x, y) = VIGRA_CSTD::exp(i(x,y) - a*x - b*y - c); } } } template void slantedEdgeSubpixelShift(Image const & img, BackInsertable & centers, double & angle, SlantedEdgeMTFOptions const & options) { unsigned int w = img.width(); unsigned int h = img.height(); Image grad(w, h); Kernel1D kgrad; kgrad.initGaussianDerivative(1.0, 1); separableConvolveX(srcImageRange(img), destImage(grad), kernel1d(kgrad)); int desiredEdgeWidth = (int)options.desired_edge_width; double sy = 0.0, sx = 0.0, syy = 0.0, sxy = 0.0; for(unsigned int y = 0; y < h; ++y) { double a = 0.0, b = 0.0; for(unsigned int x = 0; x < w; ++x) { a += x*grad(x,y); b += grad(x,y); } int c = int(a / b); // c is biased because the numbers of black and white pixels differ // repeat the analysis with a symmetric window around the edge a = 0.0; b = 0.0; int ew = desiredEdgeWidth; if(c-desiredEdgeWidth < 0) ew = c; if(c + ew + 1 >= (int)w) ew = w - c - 1; for(int x = c-ew; x < c+ew+1; ++x) { a += x*grad(x,y); b += grad(x,y); } double sc = a / b; sy += y; sx += sc; syy += sq(y); sxy += sc*y; } // fit a line to the subpixel locations double a = (h * sxy - sx * sy) / (h * syy - sq(sy)); double b = (sx * syy - sxy * sy) / (h * syy - sq(sy)); // compute the regularized subpixel values of the edge location angle = VIGRA_CSTD::atan(a); for(unsigned int y = 0; y < h; ++y) { centers.push_back(a * y + b); } } template void slantedEdgeCreateOversampledLine(Image const & img, Vector const & centers, Image & result) { unsigned int w = img.width(); unsigned int h = img.height(); unsigned int w2 = std::min(std::min(int(centers[0]), int(centers[h-1])), std::min(int(w - centers[0]) - 1, int(w - centers[h-1]) - 1)); unsigned int ww = 8*w2; Image r(ww, 1), s(ww, 1); for(unsigned int y = 0; y < h; ++y) { int x0 = int(centers[y]) - w2; int x1 = int((VIGRA_CSTD::ceil(centers[y]) - centers[y])*4); for(; x1 < (int)ww; x1 += 4) { r(x1, 0) += img(x0, y); ++s(x1, 0); ++x0; } } for(unsigned int x = 0; x < ww; ++x) { vigra_precondition(s(x,0) > 0.0, "slantedEdgeMTF(): Input edge is not slanted enough"); r(x,0) /= s(x,0); } result.resize(ww-1, 1); for(unsigned int x = 0; x < ww-1; ++x) { result(x,0) = r(x+1,0) - r(x,0); } } template void slantedEdgeMTFImpl(Image const & i, BackInsertable & mtf, double angle, SlantedEdgeMTFOptions const & options) { unsigned int w = i.width(); unsigned int h = i.height(); double slantCorrection = VIGRA_CSTD::cos(angle); int desiredEdgeWidth = 4*options.desired_edge_width; Image magnitude; if(w - 2*desiredEdgeWidth < 64) { FFTWComplexImage otf(w, h); fourierTransform(srcImageRange(i), destImage(otf)); magnitude.resize(w, h); for(unsigned int y = 0; y < h; ++y) { for(unsigned int x = 0; x < w; ++x) { magnitude(x, y) = norm(otf(x, y)); } } } else { w -= 2*desiredEdgeWidth; FFTWComplexImage otf(w, h); fourierTransform(srcImageRange(i, Rect2D(Point2D(desiredEdgeWidth, 0), Size2D(w, h))), destImage(otf)); // create an image where the edge is skipped - presumably it only contains the // noise which can then be subtracted Image noise(w,h); copyImage(srcImageRange(i, Rect2D(Point2D(0,0), Size2D(w/2, h))), destImage(noise)); copyImage(srcImageRange(i, Rect2D(Point2D(i.width()-w/2, 0), Size2D(w/2, h))), destImage(noise, Point2D(w/2, 0))); FFTWComplexImage fnoise(w, h); fourierTransform(srcImageRange(noise), destImage(fnoise)); // subtract the noise power spectrum from the total power spectrum magnitude.resize(w, h); for(unsigned int y = 0; y < h; ++y) { for(unsigned int x = 0; x < w; ++x) { magnitude(x, y) = VIGRA_CSTD::sqrt(std::max(0.0, squaredNorm(otf(x, y))-squaredNorm(fnoise(x, y)))); } } } Kernel1D gauss; gauss.initGaussian(options.mtf_smoothing_scale); Image smooth(w,h); separableConvolveX(srcImageRange(magnitude), destImage(smooth), kernel1d(gauss)); unsigned int ww = w/4; double maxVal = smooth(0,0), minVal = maxVal; for(unsigned int k = 1; k < ww; ++k) { if(smooth(k,0) >= 0.0 && smooth(k,0) < minVal) minVal = smooth(k,0); } double norm = maxVal-minVal; typedef typename BackInsertable::value_type Result; mtf.push_back(Result(0.0, 1.0)); for(unsigned int k = 1; k < ww; ++k) { double n = (smooth(k,0) - minVal)/norm*sq(M_PI*k/w/VIGRA_CSTD::sin(M_PI*k/w)); double xx = 4.0*k/w/slantCorrection; if(n < 0.0 || xx > 1.0) break; mtf.push_back(Result(xx, n)); } } } // namespace detail /** \addtogroup SlantedEdgeMTF Camera MTF Estimation Determine the magnitude transfer function (MTF) of a camera using the slanted edge method. */ //@{ /********************************************************/ /* */ /* slantedEdgeMTF */ /* */ /********************************************************/ /** \brief Determine the magnitude transfer function of the camera. This operator estimates the magnitude transfer function (MTF) of a camera by means of the slanted edge method described in: ISO Standard No. 12233: "Photography - Electronic still picture cameras - Resolution measurements", 2000 The input must be an image that contains a single step edge with bright pixels on one side and dark pixels on the other. However, the intensity values must be neither saturated nor zero. The algorithms computes the MTF from the Fourier transform of the edge's derivative. Thus, if the actual MTF is unisotropic, the estimated MTF does actually only apply in the direction perpendicular to the edge - several edges at different orientations are required to estimate an unisotropic MTF. The algorithm returns a sequence of frequency / attenuation pairs. The frequency axis is normalized so that the Nyquist frequency of the original image is 0.5. Since the edge's derivative is computed with subpixel accuracy, the attenuation can usually be computed for frequencies significantly above the Nyquist frequency as well. The MTF estimate ends at either the first zero crossing of the MTF or at frequency 1, whichever comes earlier. The present implementation improves the original slanted edge algorithm according to ISO 12233 in a number of ways:

  • The edge is not required to run nearly vertically or horizontally (i.e. with a slant of approximately 5 degrees). The algorithm will automatically compute the edge's actual angle and adjust estimates accordingly. However, it is still necessary for the edge to be somewhat slanted, because subpixel-accurate estimation of the derivative is impossible otherwise (i.e. the edge position perpendicular to the edge direction must differ by at least 1 pixel between the two ends of the edge).
  • Our implementation uses a more accurate subpixel derivative algrithm. In addition, we first perform a shading correction in order to reduce possible derivative bias due to nonuniform illumination.
  • If the input image is large enough (i.e. there are at least 20 pixels on either side of the edge over the edge's entire length), our algorithm attempts to subtract the estimated noise power spectrum from the estimated MTF.
The source value type (SrcAccessor::value_type) must be a scalar type which is convertible to double. The result is written into the \a result sequence, whose value_type must be constructible from two double values. Algorithm options can be set via the \a options object (see \ref vigra::NoiseNormalizationOptions for details). Declarations: pass arguments explicitly: \code namespace vigra { template void slantedEdgeMTF(SrcIterator sul, SrcIterator slr, SrcAccessor src, BackInsertable & mtf, SlantedEdgeMTFOptions const & options = SlantedEdgeMTFOptions()); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void slantedEdgeMTF(triple src, BackInsertable & mtf, SlantedEdgeMTFOptions const & options = SlantedEdgeMTFOptions()) } \endcode Usage: \#include \<vigra/slanted_edge_mtf.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); std::vector > mtf; ... vigra::slantedEdgeMTF(srcImageRange(src), mtf); // print the frequency / attenuation pairs found for(int k=0; k Required Interface: \code SrcIterator upperleft, lowerright; SrcAccessor src; typedef SrcAccessor::value_type SrcType; typedef NumericTraits::isScalar isScalar; assert(isScalar::asBool == true); double value = src(uperleft); BackInsertable result; typedef BackInsertable::value_type ResultType; double intensity, variance; result.push_back(ResultType(intensity, variance)); \endcode */ doxygen_overloaded_function(template <...> void slantedEdgeMTF) template void slantedEdgeMTF(SrcIterator sul, SrcIterator slr, SrcAccessor src, BackInsertable & mtf, SlantedEdgeMTFOptions const & options = SlantedEdgeMTFOptions()) { DImage preparedInput; unsigned int edgeWidth = detail::prepareSlantedEdgeInput(sul, slr, src, preparedInput, options); detail::slantedEdgeShadingCorrection(preparedInput, edgeWidth); ArrayVector centers; double angle = 0.0; detail::slantedEdgeSubpixelShift(preparedInput, centers, angle, options); DImage oversampledLine; detail::slantedEdgeCreateOversampledLine(preparedInput, centers, oversampledLine); detail::slantedEdgeMTFImpl(oversampledLine, mtf, angle, options); } template inline void slantedEdgeMTF(triple src, BackInsertable & mtf, SlantedEdgeMTFOptions const & options = SlantedEdgeMTFOptions()) { slantedEdgeMTF(src.first, src.second, src.third, mtf, options); } /********************************************************/ /* */ /* mtfFitGaussian */ /* */ /********************************************************/ /** \brief Fit a Gaussian function to a given MTF. This function expects a squence of frequency / attenuation pairs as produced by \ref slantedEdgeMTF() and finds the best fitting Gaussian point spread function (Gaussian functions are good approximations of the PSF of many real cameras). It returns the standard deviation (scale) of this function. The algorithm computes the standard deviation by means of a linear least square on the logarithm of the MTF, i.e. an algebraic fit rather than a Euclidean fit - thus, the resulting Gaussian may not be the one that intuitively fits the data optimally. Declaration: \code namespace vigra { template double mtfFitGaussian(Vector const & mtf); } \endcode Usage: \#include \<vigra/slanted_edge_mtf.hxx\>
Namespace: vigra \code vigra::BImage src(w,h); std::vector > mtf; ... vigra::slantedEdgeMTF(srcImageRange(src), mtf); double scale = vigra::mtfFitGaussian(mtf) std::cout << "The camera PSF is approximately a Gaussian at scale " << scale << std::endl; \endcode Required Interface: \code Vector mtf; int numberOfMeasurements = mtf.size() double frequency = mtf[0][0]; double attenuation = mtf[0][1]; \endcode */ template double mtfFitGaussian(Vector const & mtf) { double minVal = mtf[0][1]; for(unsigned int k = 1; k < mtf.size(); ++k) { if(mtf[k][1] < minVal) minVal = mtf[k][1]; } double x2 = 0.0, xy = 0.0; for(unsigned int k = 1; k < mtf.size(); ++k) { if(mtf[k][1] <= 0.0) break; double x = mtf[k][0], y = VIGRA_CSTD::sqrt(-VIGRA_CSTD::log(mtf[k][1])/2.0)/M_PI; x2 += vigra::sq(x); xy += x*y; if(mtf[k][1] == minVal) break; } return xy / x2; } //@} } // namespace vigra #endif // VIGRA_SLANTED_EDGE_MTF_HXX gamera-3.3.3/include/vigra/splineimageview.hxx0000644000076500000000000020354211261456425020432 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_SPLINEIMAGEVIEW_HXX #define VIGRA_SPLINEIMAGEVIEW_HXX #include "mathutil.hxx" #include "recursiveconvolution.hxx" #include "splines.hxx" #include "array_vector.hxx" #include "basicimage.hxx" #include "copyimage.hxx" #include "tinyvector.hxx" #include "fixedpoint.hxx" #include "multi_array.hxx" namespace vigra { /********************************************************/ /* */ /* SplineImageView */ /* */ /********************************************************/ /** \brief Create a continuous view onto a discrete image using splines. This class is very useful if image values or derivatives at arbitrary real-valued coordinates are needed. Access at such coordinates is implemented by interpolating the given discrete image values with a spline of the specified ORDER. Continuous derivatives are available up to degree ORDER-1. If the requested coordinates are near the image border, reflective boundary conditions are applied. In principle, this class can also be used for image resizing, but here the functions from the resize... family are more efficient, since they exploit the regularity of the sampling grid. The SplineImageView template is explicitly specialized to make it as efficient as possible. In particular, unnecessary copying of the image is avoided when the iterators passed in the constructor originate from a \ref vigra::BasicImage. In addition, these specializations provide function unchecked(...) that do not perform bounds checking. If the original image is not a variant of \ref vigra::BasicImage, one can customize the internal representation by using \ref vigra::SplineImageView0 or \ref vigra::SplineImageView1. Usage: \#include \<vigra/splineimageview.hxx\>
Namespace: vigra \code BImage img(w,h); ... // fill img // construct spline view for quadratic interpolation SplineImageView<2, double> spi2(srcImageRange(img)); double x = ..., y = ...; double v2 = spi2(x, y); // construct spline view for linear interpolation SplineImageView<1, UInt32> spi1(srcImageRange(img)); UInt32 v1 = spi1(x, y); FixedPoint<16, 15> fx(...), fy(...); UInt32 vf = spi1.unchecked(fx, fy); // caller is sure that (fx, fy) are valid coordinates \endcode */ template class SplineImageView { typedef typename NumericTraits::RealPromote InternalValue; public: /** The view's value type (return type of access and derivative functions). */ typedef VALUETYPE value_type; /** The view's size type. */ typedef Size2D size_type; /** The view's difference type. */ typedef TinyVector difference_type; /** The order of the spline used. */ enum StaticOrder { order = ORDER }; /** The type of the internal image holding the spline coefficients. */ typedef BasicImage InternalImage; private: typedef typename InternalImage::traverser InternalTraverser; typedef typename InternalTraverser::row_iterator InternalRowIterator; typedef typename InternalTraverser::column_iterator InternalColumnIterator; typedef BSpline Spline; enum { ksize_ = ORDER + 1, kcenter_ = ORDER / 2 }; public: /** Construct SplineImageView for the given image. If skipPrefiltering = true (default: false), the recursive prefilter of the cardinal spline function is not applied, resulting in an approximating (smoothing) rather than interpolating spline. This is especially useful if customized prefilters are to be applied. */ template SplineImageView(SrcIterator is, SrcIterator iend, SrcAccessor sa, bool skipPrefiltering = false) : w_(iend.x - is.x), h_(iend.y - is.y), w1_(w_-1), h1_(h_-1), x0_(kcenter_), x1_(w_ - kcenter_ - 2), y0_(kcenter_), y1_(h_ - kcenter_ - 2), image_(w_, h_), x_(-1.0), y_(-1.0), u_(-1.0), v_(-1.0) { copyImage(srcIterRange(is, iend, sa), destImage(image_)); if(!skipPrefiltering) init(); } /** Construct SplineImageView for the given image. If skipPrefiltering = true (default: false), the recursive prefilter of the cardinal spline function is not applied, resulting in an approximating (smoothing) rather than interpolating spline. This is especially useful if customized prefilters are to be applied. */ template SplineImageView(triple s, bool skipPrefiltering = false) : w_(s.second.x - s.first.x), h_(s.second.y - s.first.y), w1_(w_-1), h1_(h_-1), x0_(kcenter_), x1_(w_ - kcenter_ - 2), y0_(kcenter_), y1_(h_ - kcenter_ - 2), image_(w_, h_), x_(-1.0), y_(-1.0), u_(-1.0), v_(-1.0) { copyImage(srcIterRange(s.first, s.second, s.third), destImage(image_)); if(!skipPrefiltering) init(); } /** Access interpolated function at real-valued coordinate (x, y). If (x, y) is near the image border or outside the image, the value is calculated with reflective boundary conditions. An exception is thrown if the coordinate is outside the first reflection. */ value_type operator()(double x, double y) const; /** Access derivative of order (dx, dy) at real-valued coordinate (x, y). If (x, y) is near the image border or outside the image, the value is calculated with reflective boundary conditions. An exception is thrown if the coordinate is outside the first reflection. */ value_type operator()(double x, double y, unsigned int dx, unsigned int dy) const; /** Access 1st derivative in x-direction at real-valued coordinate (x, y). Equivalent to splineView(x, y, 1, 0). */ value_type dx(double x, double y) const { return operator()(x, y, 1, 0); } /** Access 1st derivative in y-direction at real-valued coordinate (x, y). Equivalent to splineView(x, y, 0, 1). */ value_type dy(double x, double y) const { return operator()(x, y, 0, 1); } /** Access 2nd derivative in x-direction at real-valued coordinate (x, y). Equivalent to splineView(x, y, 2, 0). */ value_type dxx(double x, double y) const { return operator()(x, y, 2, 0); } /** Access mixed 2nd derivative at real-valued coordinate (x, y). Equivalent to splineView(x, y, 1, 1). */ value_type dxy(double x, double y) const { return operator()(x, y, 1, 1); } /** Access 2nd derivative in y-direction at real-valued coordinate (x, y). Equivalent to splineView(x, y, 0, 2). */ value_type dyy(double x, double y) const { return operator()(x, y, 0, 2); } /** Access 3rd derivative in x-direction at real-valued coordinate (x, y). Equivalent to splineView(x, y, 3, 0). */ value_type dx3(double x, double y) const { return operator()(x, y, 3, 0); } /** Access 3rd derivative in y-direction at real-valued coordinate (x, y). Equivalent to splineView(x, y, 0, 3). */ value_type dy3(double x, double y) const { return operator()(x, y, 0, 3); } /** Access mixed 3rd derivative dxxy at real-valued coordinate (x, y). Equivalent to splineView(x, y, 2, 1). */ value_type dxxy(double x, double y) const { return operator()(x, y, 2, 1); } /** Access mixed 3rd derivative dxyy at real-valued coordinate (x, y). Equivalent to splineView(x, y, 1, 2). */ value_type dxyy(double x, double y) const { return operator()(x, y, 1, 2); } /** Access interpolated function at real-valued coordinate d. Equivalent to splineView(d[0], d[1]). */ value_type operator()(difference_type const & d) const { return operator()(d[0], d[1]); } /** Access derivative of order (dx, dy) at real-valued coordinate d. Equivalent to splineView(d[0], d[1], dx, dy). */ value_type operator()(difference_type const & d, unsigned int dx, unsigned int dy) const { return operator()(d[0], d[1], dx, dy); } /** Access 1st derivative in x-direction at real-valued coordinate d. Equivalent to splineView.dx(d[0], d[1]). */ value_type dx(difference_type const & d) const { return dx(d[0], d[1]); } /** Access 1st derivative in y-direction at real-valued coordinate d. Equivalent to splineView.dy(d[0], d[1]). */ value_type dy(difference_type const & d) const { return dy(d[0], d[1]); } /** Access 2nd derivative in x-direction at real-valued coordinate d. Equivalent to splineView.dxx(d[0], d[1]). */ value_type dxx(difference_type const & d) const { return dxx(d[0], d[1]); } /** Access mixed 2nd derivative at real-valued coordinate d. Equivalent to splineView.dxy(d[0], d[1]). */ value_type dxy(difference_type const & d) const { return dxy(d[0], d[1]); } /** Access 2nd derivative in y-direction at real-valued coordinate d. Equivalent to splineView.dyy(d[0], d[1]). */ value_type dyy(difference_type const & d) const { return dyy(d[0], d[1]); } /** Access 3rd derivative in x-direction at real-valued coordinate d. Equivalent to splineView.dx3(d[0], d[1]). */ value_type dx3(difference_type const & d) const { return dx3(d[0], d[1]); } /** Access 3rd derivative in y-direction at real-valued coordinate d. Equivalent to splineView.dy3(d[0], d[1]). */ value_type dy3(difference_type const & d) const { return dy3(d[0], d[1]); } /** Access mixed 3rd derivative dxxy at real-valued coordinate d. Equivalent to splineView.dxxy(d[0], d[1]). */ value_type dxxy(difference_type const & d) const { return dxxy(d[0], d[1]); } /** Access mixed 3rd derivative dxyy at real-valued coordinate d. Equivalent to splineView.dxyy(d[0], d[1]). */ value_type dxyy(difference_type const & d) const { return dxyy(d[0], d[1]); } /** Access gradient squared magnitude at real-valued coordinate (x, y). */ value_type g2(double x, double y) const; /** Access 1st derivative in x-direction of gradient squared magnitude at real-valued coordinate (x, y). */ value_type g2x(double x, double y) const; /** Access 1st derivative in y-direction of gradient squared magnitude at real-valued coordinate (x, y). */ value_type g2y(double x, double y) const; /** Access 2nd derivative in x-direction of gradient squared magnitude at real-valued coordinate (x, y). */ value_type g2xx(double x, double y) const; /** Access mixed 2nd derivative of gradient squared magnitude at real-valued coordinate (x, y). */ value_type g2xy(double x, double y) const; /** Access 2nd derivative in y-direction of gradient squared magnitude at real-valued coordinate (x, y). */ value_type g2yy(double x, double y) const; /** Access gradient squared magnitude at real-valued coordinate d. */ value_type g2(difference_type const & d) const { return g2(d[0], d[1]); } /** Access 1st derivative in x-direction of gradient squared magnitude at real-valued coordinate d. */ value_type g2x(difference_type const & d) const { return g2x(d[0], d[1]); } /** Access 1st derivative in y-direction of gradient squared magnitude at real-valued coordinate d. */ value_type g2y(difference_type const & d) const { return g2y(d[0], d[1]); } /** Access 2nd derivative in x-direction of gradient squared magnitude at real-valued coordinate d. */ value_type g2xx(difference_type const & d) const { return g2xx(d[0], d[1]); } /** Access mixed 2nd derivative of gradient squared magnitude at real-valued coordinate d. */ value_type g2xy(difference_type const & d) const { return g2xy(d[0], d[1]); } /** Access 2nd derivative in y-direction of gradient squared magnitude at real-valued coordinate d. */ value_type g2yy(difference_type const & d) const { return g2yy(d[0], d[1]); } /** The width of the image. 0 <= x <= width()-1 is required for all access functions. */ unsigned int width() const { return w_; } /** The height of the image. 0 <= y <= height()-1 is required for all access functions. */ unsigned int height() const { return h_; } /** The size of the image. 0 <= x <= size().x-1 and 0 <= y <= size().y-1 are required for all access functions. */ size_type size() const { return size_type(w_, h_); } /** The internal image holding the spline coefficients. */ InternalImage const & image() const { return image_; } /** Get the array of polynomial coefficients for the facet containing the point (x, y). The array res will be resized to dimension (ORDER+1)x(ORDER+1). From these coefficients, the value of the interpolated function can be calculated by the following algorithm \code SplineImageView view(...); double x = ..., y = ...; double dx, dy; // calculate the local facet coordinates of x and y if(ORDER % 2) { // odd order => facet coordinates between 0 and 1 dx = x - floor(x); dy = y - floor(y); } else { // even order => facet coordinates between -0.5 and 0.5 dx = x - floor(x + 0.5); dy = y - floor(y + 0.5); } BasicImage coefficients; view.coefficientArray(x, y, coefficients); float f_x_y = 0.0; for(int ny = 0; ny < ORDER + 1; ++ny) for(int nx = 0; nx < ORDER + 1; ++nx) f_x_y += pow(dx, nx) * pow(dy, ny) * coefficients(nx, ny); assert(abs(f_x_y - view(x, y)) < 1e-6); \endcode */ template void coefficientArray(double x, double y, Array & res) const; /** Check if x is in the original image range. Equivalent to 0 <= x <= width()-1. */ bool isInsideX(double x) const { return x >= 0.0 && x <= width()-1.0; } /** Check if y is in the original image range. Equivalent to 0 <= y <= height()-1. */ bool isInsideY(double y) const { return y >= 0.0 && y <= height()-1.0; } /** Check if x and y are in the original image range. Equivalent to 0 <= x <= width()-1 and 0 <= y <= height()-1. */ bool isInside(double x, double y) const { return isInsideX(x) && isInsideY(y); } /** Check if x and y are in the valid range. Points outside the original image range are computed by reflcective boundary conditions, but only within the first reflection. Equivalent to -width() + ORDER/2 + 2 < x < 2*width() - ORDER/2 - 2 and -height() + ORDER/2 + 2 < y < 2*height() - ORDER/2 - 2. */ bool isValid(double x, double y) const { return x < w1_ + x1_ && x > -x1_ && y < h1_ + y1_ && y > -y1_; } /** Check whether the points (x0, y0) and (x1, y1) are in the same spline facet. For odd order splines, facets span the range (floor(x), floor(x)+1) x (floor(y), floor(y)+1) (i.e. we have integer facet borders), whereas even order splines have facet between half integer values (floor(x)-0.5, floor(x)+0.5) x (floor(y)-0.5, floor(y)+0.5). */ bool sameFacet(double x0, double y0, double x1, double y1) const { x0 = VIGRA_CSTD::floor((ORDER % 2) ? x0 : x0 + 0.5); y0 = VIGRA_CSTD::floor((ORDER % 2) ? y0 : y0 + 0.5); x1 = VIGRA_CSTD::floor((ORDER % 2) ? x1 : x1 + 0.5); y1 = VIGRA_CSTD::floor((ORDER % 2) ? y1 : y1 + 0.5); return x0 == x1 && y0 == y1; } protected: void init(); void calculateIndices(double x, double y) const; void coefficients(double t, double * const & c) const; void derivCoefficients(double t, unsigned int d, double * const & c) const; value_type convolve() const; unsigned int w_, h_; int w1_, h1_; double x0_, x1_, y0_, y1_; InternalImage image_; Spline k_; mutable double x_, y_, u_, v_, kx_[ksize_], ky_[ksize_]; mutable int ix_[ksize_], iy_[ksize_]; }; template void SplineImageView::init() { ArrayVector const & b = k_.prefilterCoefficients(); for(unsigned int i=0; i struct SplineImageViewUnrollLoop1 { template static void exec(int c0, Array c) { SplineImageViewUnrollLoop1::exec(c0, c); c[i] = c0 + i; } }; template <> struct SplineImageViewUnrollLoop1<0> { template static void exec(int c0, Array c) { c[0] = c0; } }; template struct SplineImageViewUnrollLoop2 { template static ValueType exec(Array1 k, RowIterator r, Array2 x) { return k[i] * r[x[i]] + SplineImageViewUnrollLoop2::exec(k, r, x); } }; template struct SplineImageViewUnrollLoop2<0, ValueType> { template static ValueType exec(Array1 k, RowIterator r, Array2 x) { return k[0] * r[x[0]]; } }; } // namespace detail template void SplineImageView::calculateIndices(double x, double y) const { if(x == x_ && y == y_) return; // still in cache if(x > x0_ && x < x1_ && y > y0_ && y < y1_) { detail::SplineImageViewUnrollLoop1::exec( (ORDER % 2) ? int(x - kcenter_) : int(x + 0.5 - kcenter_), ix_); detail::SplineImageViewUnrollLoop1::exec( (ORDER % 2) ? int(y - kcenter_) : int(y + 0.5 - kcenter_), iy_); u_ = x - ix_[kcenter_]; v_ = y - iy_[kcenter_]; } else { vigra_precondition(isValid(x,y), "SplineImageView::calculateIndices(): coordinates out of range."); int xCenter = (ORDER % 2) ? (int)VIGRA_CSTD::floor(x) : (int)VIGRA_CSTD::floor(x + 0.5); int yCenter = (ORDER % 2) ? (int)VIGRA_CSTD::floor(y) : (int)VIGRA_CSTD::floor(y + 0.5); if(x >= x1_) { for(int i = 0; i < ksize_; ++i) ix_[i] = w1_ - vigra::abs(w1_ - xCenter - (i - kcenter_)); } else { for(int i = 0; i < ksize_; ++i) ix_[i] = vigra::abs(xCenter - (kcenter_ - i)); } if(y >= y1_) { for(int i = 0; i < ksize_; ++i) iy_[i] = h1_ - vigra::abs(h1_ - yCenter - (i - kcenter_)); } else { for(int i = 0; i < ksize_; ++i) iy_[i] = vigra::abs(yCenter - (kcenter_ - i)); } u_ = x - xCenter; v_ = y - yCenter; } x_ = x; y_ = y; } template void SplineImageView::coefficients(double t, double * const & c) const { t += kcenter_; for(int i = 0; i void SplineImageView::derivCoefficients(double t, unsigned int d, double * const & c) const { t += kcenter_; for(int i = 0; i VALUETYPE SplineImageView::convolve() const { InternalValue sum; sum = ky_[0]*detail::SplineImageViewUnrollLoop2::exec(kx_, image_.rowBegin(iy_[0]), ix_); for(int j=1; j::exec(kx_, image_.rowBegin(iy_[j]), ix_); } return NumericTraits::fromRealPromote(sum); } template template void SplineImageView::coefficientArray(double x, double y, Array & res) const { typename Spline::WeightMatrix & weights = Spline::weights(); InternalValue tmp[ksize_][ksize_]; calculateIndices(x, y); for(int j=0; j VALUETYPE SplineImageView::operator()(double x, double y) const { calculateIndices(x, y); coefficients(u_, kx_); coefficients(v_, ky_); return convolve(); } template VALUETYPE SplineImageView::operator()(double x, double y, unsigned int dx, unsigned int dy) const { calculateIndices(x, y); derivCoefficients(u_, dx, kx_); derivCoefficients(v_, dy, ky_); return convolve(); } template VALUETYPE SplineImageView::g2(double x, double y) const { return sq(dx(x,y)) + sq(dy(x,y)); } template VALUETYPE SplineImageView::g2x(double x, double y) const { return 2.0*(dx(x,y) * dxx(x,y) + dy(x,y) * dxy(x,y)); } template VALUETYPE SplineImageView::g2y(double x, double y) const { return 2.0*(dx(x,y) * dxy(x,y) + dy(x,y) * dyy(x,y)); } template VALUETYPE SplineImageView::g2xx(double x, double y) const { return 2.0*(sq(dxx(x,y)) + dx(x,y) * dx3(x,y) + sq(dxy(x,y)) + dy(x,y) * dxxy(x,y)); } template VALUETYPE SplineImageView::g2yy(double x, double y) const { return 2.0*(sq(dxy(x,y)) + dx(x,y) * dxyy(x,y) + sq(dyy(x,y)) + dy(x,y) * dy3(x,y)); } template VALUETYPE SplineImageView::g2xy(double x, double y) const { return 2.0*(dx(x,y) * dxxy(x,y) + dy(x,y) * dxyy(x,y) + dxy(x,y) * (dxx(x,y) + dyy(x,y))); } /********************************************************/ /* */ /* SplineImageView0 */ /* */ /********************************************************/ template class SplineImageView0Base { typedef typename INTERNAL_INDEXER::value_type InternalValue; public: typedef VALUETYPE value_type; typedef Size2D size_type; typedef TinyVector difference_type; enum StaticOrder { order = 0 }; public: SplineImageView0Base(unsigned int w, unsigned int h) : w_(w), h_(h) {} SplineImageView0Base(int w, int h, INTERNAL_INDEXER i) : w_(w), h_(h), internalIndexer_(i) {} template value_type unchecked(FixedPoint x, FixedPoint y) const { return internalIndexer_(round(x), round(y)); } template value_type unchecked(FixedPoint x, FixedPoint y, unsigned int dx, unsigned int dy) const { if((dx != 0) || (dy != 0)) return NumericTraits::zero(); return unchecked(x, y); } value_type unchecked(double x, double y) const { return internalIndexer_((int)(x + 0.5), (int)(y + 0.5)); } value_type unchecked(double x, double y, unsigned int dx, unsigned int dy) const { if((dx != 0) || (dy != 0)) return NumericTraits::zero(); return unchecked(x, y); } value_type operator()(double x, double y) const { int ix, iy; if(x < 0.0) { ix = (int)(-x + 0.5); vigra_precondition(ix <= (int)w_ - 1, "SplineImageView::operator(): coordinates out of range."); } else { ix = (int)(x + 0.5); if(ix >= (int)w_) { ix = 2*w_-2-ix; vigra_precondition(ix >= 0, "SplineImageView::operator(): coordinates out of range."); } } if(y < 0.0) { iy = (int)(-y + 0.5); vigra_precondition(iy <= (int)h_ - 1, "SplineImageView::operator(): coordinates out of range."); } else { iy = (int)(y + 0.5); if(iy >= (int)h_) { iy = 2*h_-2-iy; vigra_precondition(iy >= 0, "SplineImageView::operator(): coordinates out of range."); } } return internalIndexer_(ix, iy); } value_type operator()(double x, double y, unsigned int dx, unsigned int dy) const { if((dx != 0) || (dy != 0)) return NumericTraits::zero(); return operator()(x, y); } value_type dx(double x, double y) const { return NumericTraits::zero(); } value_type dy(double x, double y) const { return NumericTraits::zero(); } value_type dxx(double x, double y) const { return NumericTraits::zero(); } value_type dxy(double x, double y) const { return NumericTraits::zero(); } value_type dyy(double x, double y) const { return NumericTraits::zero(); } value_type dx3(double x, double y) const { return NumericTraits::zero(); } value_type dy3(double x, double y) const { return NumericTraits::zero(); } value_type dxxy(double x, double y) const { return NumericTraits::zero(); } value_type dxyy(double x, double y) const { return NumericTraits::zero(); } value_type operator()(difference_type const & d) const { return operator()(d[0], d[1]); } value_type operator()(difference_type const & d, unsigned int dx, unsigned int dy) const { return operator()(d[0], d[1], dx, dy); } value_type dx(difference_type const & d) const { return NumericTraits::zero(); } value_type dy(difference_type const & d) const { return NumericTraits::zero(); } value_type dxx(difference_type const & d) const { return NumericTraits::zero(); } value_type dxy(difference_type const & d) const { return NumericTraits::zero(); } value_type dyy(difference_type const & d) const { return NumericTraits::zero(); } value_type dx3(difference_type const & d) const { return NumericTraits::zero(); } value_type dy3(difference_type const & d) const { return NumericTraits::zero(); } value_type dxxy(difference_type const & d) const { return NumericTraits::zero(); } value_type dxyy(difference_type const & d) const { return NumericTraits::zero(); } value_type g2(double x, double y) const { return NumericTraits::zero(); } value_type g2x(double x, double y) const { return NumericTraits::zero(); } value_type g2y(double x, double y) const { return NumericTraits::zero(); } value_type g2xx(double x, double y) const { return NumericTraits::zero(); } value_type g2xy(double x, double y) const { return NumericTraits::zero(); } value_type g2yy(double x, double y) const { return NumericTraits::zero(); } value_type g2(difference_type const & d) const { return NumericTraits::zero(); } value_type g2x(difference_type const & d) const { return NumericTraits::zero(); } value_type g2y(difference_type const & d) const { return NumericTraits::zero(); } value_type g2xx(difference_type const & d) const { return NumericTraits::zero(); } value_type g2xy(difference_type const & d) const { return NumericTraits::zero(); } value_type g2yy(difference_type const & d) const { return NumericTraits::zero(); } unsigned int width() const { return w_; } unsigned int height() const { return h_; } size_type size() const { return size_type(w_, h_); } template void coefficientArray(double x, double y, Array & res) const { res.resize(1, 1); res(0, 0) = operator()(x,y); } bool isInsideX(double x) const { return x >= 0.0 && x <= width() - 1.0; } bool isInsideY(double y) const { return y >= 0.0 && y <= height() - 1.0; } bool isInside(double x, double y) const { return isInsideX(x) && isInsideY(y); } bool isValid(double x, double y) const { return x < 2.0*w_-2.0 && x > -w_+1.0 && y < 2.0*h_-2.0 && y > -h_+1.0; } bool sameFacet(double x0, double y0, double x1, double y1) const { x0 = VIGRA_CSTD::floor(x0 + 0.5); y0 = VIGRA_CSTD::floor(y0 + 0.5); x1 = VIGRA_CSTD::floor(x1 + 0.5); y1 = VIGRA_CSTD::floor(y1 + 0.5); return x0 == x1 && y0 == y1; } protected: unsigned int w_, h_; INTERNAL_INDEXER internalIndexer_; }; /** \brief Create an image view for nearest-neighbor interpolation. This class behaves like \ref vigra::SplineImageView<0, ...>, but one can pass an additional template argument that determined the internal representation of the image. If this is equal to the argument type passed in the constructor, the image is not copied. By default, this works for \ref vigra::BasicImage, \ref vigra::BasicImageView, \ref vigra::MultiArray<2, ...>, and \ref vigra::MultiArrayView<2, ...>. */ template ::const_traverser> class SplineImageView0 : public SplineImageView0Base { typedef SplineImageView0Base Base; public: typedef typename Base::value_type value_type; typedef typename Base::size_type size_type; typedef typename Base::difference_type difference_type; enum StaticOrder { order = Base::order }; typedef BasicImage InternalImage; protected: typedef typename IteratorTraits::mutable_iterator InternalTraverser; typedef typename IteratorTraits::DefaultAccessor InternalAccessor; typedef typename IteratorTraits::const_iterator InternalConstTraverser; typedef typename IteratorTraits::DefaultAccessor InternalConstAccessor; public: /* when traverser and accessor types passed to the constructor are the same as the corresponding internal types, we need not copy the image (speed up) */ SplineImageView0(InternalTraverser is, InternalTraverser iend, InternalAccessor sa) : Base(iend.x - is.x, iend.y - is.y, is) {} SplineImageView0(triple s) : Base(s.second.x - s.first.x, s.second.y - s.first.y, s.first) {} SplineImageView0(InternalConstTraverser is, InternalConstTraverser iend, InternalConstAccessor sa) : Base(iend.x - is.x, iend.y - is.y, is) {} SplineImageView0(triple s) : Base(s.second.x - s.first.x, s.second.y - s.first.y, s.first) {} template SplineImageView0(MultiArrayView<2, T, SU> const & i) : Base(i.shape(0), i.shape(1)), image_(i.shape(0), i.shape(1)) { for(unsigned int y=0; yheight(); ++y) for(unsigned int x=0; xwidth(); ++x) image_(x,y) = detail::RequiresExplicitCast::cast(i(x,y)); this->internalIndexer_ = image_.upperLeft(); } template SplineImageView0(SrcIterator is, SrcIterator iend, SrcAccessor sa) : Base(iend.x - is.x, iend.y - is.y), image_(iend - is) { copyImage(srcIterRange(is, iend, sa), destImage(image_)); this->internalIndexer_ = image_.upperLeft(); } template SplineImageView0(triple s) : Base(s.second.x - s.first.x, s.second.y - s.first.y), image_(s.second - s.first) { copyImage(s, destImage(image_)); this->internalIndexer_ = image_.upperLeft(); } InternalImage const & image() const { return image_; } protected: InternalImage image_; }; template class SplineImageView0 > : public SplineImageView0Base > { typedef SplineImageView0Base > Base; public: typedef typename Base::value_type value_type; typedef typename Base::size_type size_type; typedef typename Base::difference_type difference_type; enum StaticOrder { order = Base::order }; typedef BasicImage InternalImage; protected: typedef MultiArrayView<2, VALUETYPE, StridedOrUnstrided> InternalIndexer; public: /* when traverser and accessor types passed to the constructor are the same as the corresponding internal types, we need not copy the image (speed up) */ SplineImageView0(InternalIndexer const & i) : Base(i.shape(0), i.shape(1), i) {} template SplineImageView0(MultiArrayView<2, T, SU> const & i) : Base(i.shape(0), i.shape(1)), image_(i.shape(0), i.shape(1)) { for(unsigned int y=0; yheight(); ++y) for(unsigned int x=0; xwidth(); ++x) image_(x,y) = detail::RequiresExplicitCast::cast(i(x,y)); this->internalIndexer_ = InternalIndexer(typename InternalIndexer::difference_type(this->width(), this->height()), image_.data()); } template SplineImageView0(SrcIterator is, SrcIterator iend, SrcAccessor sa) : Base(iend.x - is.x, iend.y - is.y), image_(iend-is) { copyImage(srcIterRange(is, iend, sa), destImage(image_)); this->internalIndexer_ = InternalIndexer(typename InternalIndexer::difference_type(this->width(), this->height()), image_.data()); } template SplineImageView0(triple s) : Base(s.second.x - s.first.x, s.second.y - s.first.y), image_(s.second - s.first) { copyImage(s, destImage(image_)); this->internalIndexer_ = InternalIndexer(typename InternalIndexer::difference_type(this->width(), this->height()), image_.data()); } InternalImage const & image() const { return image_; } protected: InternalImage image_; }; template class SplineImageView<0, VALUETYPE> : public SplineImageView0 { typedef SplineImageView0 Base; public: typedef typename Base::value_type value_type; typedef typename Base::size_type size_type; typedef typename Base::difference_type difference_type; enum StaticOrder { order = Base::order }; typedef typename Base::InternalImage InternalImage; protected: typedef typename Base::InternalTraverser InternalTraverser; typedef typename Base::InternalAccessor InternalAccessor; typedef typename Base::InternalConstTraverser InternalConstTraverser; typedef typename Base::InternalConstAccessor InternalConstAccessor; public: /* when traverser and accessor types passed to the constructor are the same as the corresponding internal types, we need not copy the image (speed up) */ SplineImageView(InternalTraverser is, InternalTraverser iend, InternalAccessor sa, bool /* unused */ = false) : Base(is, iend, sa) {} SplineImageView(triple s, bool /* unused */ = false) : Base(s) {} SplineImageView(InternalConstTraverser is, InternalConstTraverser iend, InternalConstAccessor sa, bool /* unused */ = false) : Base(is, iend, sa) {} SplineImageView(triple s, bool /* unused */ = false) : Base(s) {} template SplineImageView(SrcIterator is, SrcIterator iend, SrcAccessor sa, bool /* unused */ = false) : Base(is, iend, sa) { copyImage(srcIterRange(is, iend, sa), destImage(this->image_)); } template SplineImageView(triple s, bool /* unused */ = false) : Base(s) { copyImage(s, destImage(this->image_)); } }; /********************************************************/ /* */ /* SplineImageView1 */ /* */ /********************************************************/ template class SplineImageView1Base { typedef typename INTERNAL_INDEXER::value_type InternalValue; public: typedef VALUETYPE value_type; typedef Size2D size_type; typedef TinyVector difference_type; enum StaticOrder { order = 1 }; public: SplineImageView1Base(unsigned int w, unsigned int h) : w_(w), h_(h) {} SplineImageView1Base(int w, int h, INTERNAL_INDEXER i) : w_(w), h_(h), internalIndexer_(i) {} template value_type unchecked(FixedPoint x, FixedPoint y) const { int ix = floor(x); FixedPoint<0, FractionalBits1> tx = frac(x - FixedPoint(ix)); FixedPoint<0, FractionalBits1> dtx = dual_frac(tx); if(ix == (int)w_ - 1) { --ix; tx.value = FixedPoint<0, FractionalBits1>::ONE; dtx.value = 0; } int iy = floor(y); FixedPoint<0, FractionalBits2> ty = frac(y - FixedPoint(iy)); FixedPoint<0, FractionalBits2> dty = dual_frac(ty); if(iy == (int)h_ - 1) { --iy; ty.value = FixedPoint<0, FractionalBits2>::ONE; dty.value = 0; } return fixed_point_cast( dty*(dtx*fixedPoint(internalIndexer_(ix,iy)) + tx*fixedPoint(internalIndexer_(ix+1,iy))) + ty *(dtx*fixedPoint(internalIndexer_(ix,iy+1)) + tx*fixedPoint(internalIndexer_(ix+1,iy+1)))); } template value_type unchecked(FixedPoint x, FixedPoint y, unsigned int dx, unsigned int dy) const { int ix = floor(x); FixedPoint<0, FractionalBits1> tx = frac(x - FixedPoint(ix)); FixedPoint<0, FractionalBits1> dtx = dual_frac(tx); if(ix == (int)w_ - 1) { --ix; tx.value = FixedPoint<0, FractionalBits1>::ONE; dtx.value = 0; } int iy = floor(y); FixedPoint<0, FractionalBits2> ty = frac(y - FixedPoint(iy)); FixedPoint<0, FractionalBits2> dty = dual_frac(ty); if(iy == (int)h_ - 1) { --iy; ty.value = FixedPoint<0, FractionalBits2>::ONE; dty.value = 0; } switch(dx) { case 0: switch(dy) { case 0: return fixed_point_cast( dty*(dtx*fixedPoint(internalIndexer_(ix,iy)) + tx*fixedPoint(internalIndexer_(ix+1,iy))) + ty *(dtx*fixedPoint(internalIndexer_(ix,iy+1)) + tx*fixedPoint(internalIndexer_(ix+1,iy+1)))); case 1: return fixed_point_cast( (dtx*fixedPoint(internalIndexer_(ix,iy+1)) + tx*fixedPoint(internalIndexer_(ix+1,iy+1))) - (dtx*fixedPoint(internalIndexer_(ix,iy)) + tx*fixedPoint(internalIndexer_(ix+1,iy)))); default: return NumericTraits::zero(); } case 1: switch(dy) { case 0: return fixed_point_cast( dty*(fixedPoint(internalIndexer_(ix+1,iy)) - fixedPoint(internalIndexer_(ix,iy))) + ty *(fixedPoint(internalIndexer_(ix+1,iy+1)) - fixedPoint(internalIndexer_(ix,iy+1)))); case 1: return detail::RequiresExplicitCast::cast( (internalIndexer_(ix+1,iy+1) - internalIndexer_(ix,iy+1)) - (internalIndexer_(ix+1,iy) - internalIndexer_(ix,iy))); default: return NumericTraits::zero(); } default: return NumericTraits::zero(); } } value_type unchecked(double x, double y) const { int ix = (int)std::floor(x); if(ix == (int)w_ - 1) --ix; double tx = x - ix; int iy = (int)std::floor(y); if(iy == (int)h_ - 1) --iy; double ty = y - iy; return NumericTraits::fromRealPromote( (1.0-ty)*((1.0-tx)*internalIndexer_(ix,iy) + tx*internalIndexer_(ix+1,iy)) + ty *((1.0-tx)*internalIndexer_(ix,iy+1) + tx*internalIndexer_(ix+1,iy+1))); } value_type unchecked(double x, double y, unsigned int dx, unsigned int dy) const { int ix = (int)std::floor(x); if(ix == (int)w_ - 1) --ix; double tx = x - ix; int iy = (int)std::floor(y); if(iy == (int)h_ - 1) --iy; double ty = y - iy; switch(dx) { case 0: switch(dy) { case 0: return NumericTraits::fromRealPromote( (1.0-ty)*((1.0-tx)*internalIndexer_(ix,iy) + tx*internalIndexer_(ix+1,iy)) + ty *((1.0-tx)*internalIndexer_(ix,iy+1) + tx*internalIndexer_(ix+1,iy+1))); case 1: return NumericTraits::fromRealPromote( ((1.0-tx)*internalIndexer_(ix,iy+1) + tx*internalIndexer_(ix+1,iy+1)) - ((1.0-tx)*internalIndexer_(ix,iy) + tx*internalIndexer_(ix+1,iy))); default: return NumericTraits::zero(); } case 1: switch(dy) { case 0: return NumericTraits::fromRealPromote( (1.0-ty)*(internalIndexer_(ix+1,iy) - internalIndexer_(ix,iy)) + ty *(internalIndexer_(ix+1,iy+1) - internalIndexer_(ix,iy+1))); case 1: return detail::RequiresExplicitCast::cast( (internalIndexer_(ix+1,iy+1) - internalIndexer_(ix,iy+1)) - (internalIndexer_(ix+1,iy) - internalIndexer_(ix,iy))); default: return NumericTraits::zero(); } default: return NumericTraits::zero(); } } value_type operator()(double x, double y) const { return operator()(x, y, 0, 0); } value_type operator()(double x, double y, unsigned int dx, unsigned int dy) const { value_type mul = NumericTraits::one(); if(x < 0.0) { x = -x; vigra_precondition(x <= w_ - 1.0, "SplineImageView::operator(): coordinates out of range."); if(dx % 2) mul = -mul; } else if(x > w_ - 1.0) { x = 2.0*w_-2.0-x; vigra_precondition(x >= 0.0, "SplineImageView::operator(): coordinates out of range."); if(dx % 2) mul = -mul; } if(y < 0.0) { y = -y; vigra_precondition(y <= h_ - 1.0, "SplineImageView::operator(): coordinates out of range."); if(dy % 2) mul = -mul; } else if(y > h_ - 1.0) { y = 2.0*h_-2.0-y; vigra_precondition(y >= 0.0, "SplineImageView::operator(): coordinates out of range."); if(dy % 2) mul = -mul; } return mul*unchecked(x, y, dx, dy); } value_type dx(double x, double y) const { return operator()(x, y, 1, 0); } value_type dy(double x, double y) const { return operator()(x, y, 0, 1); } value_type dxx(double x, double y) const { return NumericTraits::zero(); } value_type dxy(double x, double y) const { return operator()(x, y, 1, 1); } value_type dyy(double x, double y) const { return NumericTraits::zero(); } value_type dx3(double x, double y) const { return NumericTraits::zero(); } value_type dy3(double x, double y) const { return NumericTraits::zero(); } value_type dxxy(double x, double y) const { return NumericTraits::zero(); } value_type dxyy(double x, double y) const { return NumericTraits::zero(); } value_type operator()(difference_type const & d) const { return operator()(d[0], d[1]); } value_type operator()(difference_type const & d, unsigned int dx, unsigned int dy) const { return operator()(d[0], d[1], dx, dy); } value_type dx(difference_type const & d) const { return operator()(d[0], d[1], 1, 0); } value_type dy(difference_type const & d) const { return operator()(d[0], d[1], 0, 1); } value_type dxx(difference_type const & d) const { return NumericTraits::zero(); } value_type dxy(difference_type const & d) const { return operator()(d[0], d[1], 1, 1); } value_type dyy(difference_type const & d) const { return NumericTraits::zero(); } value_type dx3(difference_type const & d) const { return NumericTraits::zero(); } value_type dy3(difference_type const & d) const { return NumericTraits::zero(); } value_type dxxy(difference_type const & d) const { return NumericTraits::zero(); } value_type dxyy(difference_type const & d) const { return NumericTraits::zero(); } value_type g2(double x, double y) const { return sq(dx(x,y)) + sq(dy(x,y)); } value_type g2x(double x, double y) const { return NumericTraits::zero(); } value_type g2y(double x, double y) const { return NumericTraits::zero(); } value_type g2xx(double x, double y) const { return NumericTraits::zero(); } value_type g2xy(double x, double y) const { return NumericTraits::zero(); } value_type g2yy(double x, double y) const { return NumericTraits::zero(); } value_type g2(difference_type const & d) const { return g2(d[0], d[1]); } value_type g2x(difference_type const & d) const { return NumericTraits::zero(); } value_type g2y(difference_type const & d) const { return NumericTraits::zero(); } value_type g2xx(difference_type const & d) const { return NumericTraits::zero(); } value_type g2xy(difference_type const & d) const { return NumericTraits::zero(); } value_type g2yy(difference_type const & d) const { return NumericTraits::zero(); } unsigned int width() const { return w_; } unsigned int height() const { return h_; } size_type size() const { return size_type(w_, h_); } template void coefficientArray(double x, double y, Array & res) const; void calculateIndices(double x, double y, int & ix, int & iy, int & ix1, int & iy1) const; bool isInsideX(double x) const { return x >= 0.0 && x <= width() - 1.0; } bool isInsideY(double y) const { return y >= 0.0 && y <= height() - 1.0; } bool isInside(double x, double y) const { return isInsideX(x) && isInsideY(y); } bool isValid(double x, double y) const { return x < 2.0*w_-2.0 && x > 1.0-w_ && y < 2.0*h_-2.0 && y > 1.0-h_; } bool sameFacet(double x0, double y0, double x1, double y1) const { x0 = VIGRA_CSTD::floor(x0); y0 = VIGRA_CSTD::floor(y0); x1 = VIGRA_CSTD::floor(x1); y1 = VIGRA_CSTD::floor(y1); return x0 == x1 && y0 == y1; } protected: unsigned int w_, h_; INTERNAL_INDEXER internalIndexer_; }; template template void SplineImageView1Base::coefficientArray(double x, double y, Array & res) const { int ix, iy, ix1, iy1; calculateIndices(x, y, ix, iy, ix1, iy1); res.resize(2, 2); res(0,0) = internalIndexer_(ix,iy); res(1,0) = internalIndexer_(ix1,iy) - internalIndexer_(ix,iy); res(0,1) = internalIndexer_(ix,iy1) - internalIndexer_(ix,iy); res(1,1) = internalIndexer_(ix,iy) - internalIndexer_(ix1,iy) - internalIndexer_(ix,iy1) + internalIndexer_(ix1,iy1); } template void SplineImageView1Base::calculateIndices(double x, double y, int & ix, int & iy, int & ix1, int & iy1) const { if(x < 0.0) { x = -x; vigra_precondition(x <= w_ - 1.0, "SplineImageView::calculateIndices(): coordinates out of range."); ix = (int)VIGRA_CSTD::ceil(x); ix1 = ix - 1; } else if(x >= w_ - 1.0) { x = 2.0*w_-2.0-x; vigra_precondition(x > 0.0, "SplineImageView::calculateIndices(): coordinates out of range."); ix = (int)VIGRA_CSTD::ceil(x); ix1 = ix - 1; } else { ix = (int)VIGRA_CSTD::floor(x); ix1 = ix + 1; } if(y < 0.0) { y = -y; vigra_precondition(y <= h_ - 1.0, "SplineImageView::calculateIndices(): coordinates out of range."); iy = (int)VIGRA_CSTD::ceil(y); iy1 = iy - 1; } else if(y >= h_ - 1.0) { y = 2.0*h_-2.0-y; vigra_precondition(y > 0.0, "SplineImageView::calculateIndices(): coordinates out of range."); iy = (int)VIGRA_CSTD::ceil(y); iy1 = iy - 1; } else { iy = (int)VIGRA_CSTD::floor(y); iy1 = iy + 1; } } /** \brief Create an image view for bi-linear interpolation. This class behaves like \ref vigra::SplineImageView<1, ...>, but one can pass an additional template argument that determined the internal representation of the image. If this is equal to the argument type passed in the constructor, the image is not copied. By default, this works for \ref vigra::BasicImage, \ref vigra::BasicImageView, \ref vigra::MultiArray<2, ...>, and \ref vigra::MultiArrayView<2, ...>. In addition to the function provided by \ref vigra::SplineImageView, there are functions unchecked(x,y) and unchecked(x,y, xorder, yorder) which improve speed by not applying bounds checking and reflective border treatment (isInside(x, y) must be true), but otherwise behave identically to their checked counterparts. In addition, x and y can have type \ref vigra::FixedPoint instead of double. */ template ::const_traverser> class SplineImageView1 : public SplineImageView1Base { typedef SplineImageView1Base Base; public: typedef typename Base::value_type value_type; typedef typename Base::size_type size_type; typedef typename Base::difference_type difference_type; enum StaticOrder { order = Base::order }; typedef BasicImage InternalImage; protected: typedef typename IteratorTraits::mutable_iterator InternalTraverser; typedef typename IteratorTraits::DefaultAccessor InternalAccessor; typedef typename IteratorTraits::const_iterator InternalConstTraverser; typedef typename IteratorTraits::DefaultAccessor InternalConstAccessor; public: /* when traverser and accessor types passed to the constructor are the same as the corresponding internal types, we need not copy the image (speed up) */ SplineImageView1(InternalTraverser is, InternalTraverser iend, InternalAccessor sa) : Base(iend.x - is.x, iend.y - is.y, is) {} SplineImageView1(triple s) : Base(s.second.x - s.first.x, s.second.y - s.first.y, s.first) {} SplineImageView1(InternalConstTraverser is, InternalConstTraverser iend, InternalConstAccessor sa) : Base(iend.x - is.x, iend.y - is.y, is) {} SplineImageView1(triple s) : Base(s.second.x - s.first.x, s.second.y - s.first.y, s.first) {} template SplineImageView1(MultiArrayView<2, T, SU> const & i) : Base(i.shape(0), i.shape(1)), image_(i.shape(0), i.shape(1)) { for(unsigned int y=0; yheight(); ++y) for(unsigned int x=0; xwidth(); ++x) image_(x,y) = detail::RequiresExplicitCast::cast(i(x,y)); this->internalIndexer_ = image_.upperLeft(); } template SplineImageView1(SrcIterator is, SrcIterator iend, SrcAccessor sa) : Base(iend.x - is.x, iend.y - is.y), image_(iend - is) { copyImage(srcIterRange(is, iend, sa), destImage(image_)); this->internalIndexer_ = image_.upperLeft(); } template SplineImageView1(triple s) : Base(s.second.x - s.first.x, s.second.y - s.first.y), image_(s.second - s.first) { copyImage(s, destImage(image_)); this->internalIndexer_ = image_.upperLeft(); } InternalImage const & image() const { return image_; } protected: InternalImage image_; }; template class SplineImageView1 > : public SplineImageView1Base > { typedef SplineImageView1Base > Base; public: typedef typename Base::value_type value_type; typedef typename Base::size_type size_type; typedef typename Base::difference_type difference_type; enum StaticOrder { order = Base::order }; typedef BasicImage InternalImage; protected: typedef MultiArrayView<2, VALUETYPE, StridedOrUnstrided> InternalIndexer; public: /* when traverser and accessor types passed to the constructor are the same as the corresponding internal types, we need not copy the image (speed up) */ SplineImageView1(InternalIndexer const & i) : Base(i.shape(0), i.shape(1), i) {} template SplineImageView1(MultiArrayView<2, T, SU> const & i) : Base(i.shape(0), i.shape(1)), image_(i.shape(0), i.shape(1)) { for(unsigned int y=0; yheight(); ++y) for(unsigned int x=0; xwidth(); ++x) image_(x,y) = detail::RequiresExplicitCast::cast(i(x,y)); this->internalIndexer_ = InternalIndexer(typename InternalIndexer::difference_type(this->width(), this->height()), image_.data()); } template SplineImageView1(SrcIterator is, SrcIterator iend, SrcAccessor sa) : Base(iend.x - is.x, iend.y - is.y), image_(iend-is) { copyImage(srcIterRange(is, iend, sa), destImage(image_)); this->internalIndexer_ = InternalIndexer(typename InternalIndexer::difference_type(this->width(), this->height()), image_.data()); } template SplineImageView1(triple s) : Base(s.second.x - s.first.x, s.second.y - s.first.y), image_(s.second - s.first) { copyImage(s, destImage(image_)); this->internalIndexer_ = InternalIndexer(typename InternalIndexer::difference_type(this->width(), this->height()), image_.data()); } InternalImage const & image() const { return image_; } protected: InternalImage image_; }; template class SplineImageView<1, VALUETYPE> : public SplineImageView1 { typedef SplineImageView1 Base; public: typedef typename Base::value_type value_type; typedef typename Base::size_type size_type; typedef typename Base::difference_type difference_type; enum StaticOrder { order = Base::order }; typedef typename Base::InternalImage InternalImage; protected: typedef typename Base::InternalTraverser InternalTraverser; typedef typename Base::InternalAccessor InternalAccessor; typedef typename Base::InternalConstTraverser InternalConstTraverser; typedef typename Base::InternalConstAccessor InternalConstAccessor; public: /* when traverser and accessor types passed to the constructor are the same as the corresponding internal types, we need not copy the image (speed up) */ SplineImageView(InternalTraverser is, InternalTraverser iend, InternalAccessor sa, bool /* unused */ = false) : Base(is, iend, sa) {} SplineImageView(triple s, bool /* unused */ = false) : Base(s) {} SplineImageView(InternalConstTraverser is, InternalConstTraverser iend, InternalConstAccessor sa, bool /* unused */ = false) : Base(is, iend, sa) {} SplineImageView(triple s, bool /* unused */ = false) : Base(s) {} template SplineImageView(SrcIterator is, SrcIterator iend, SrcAccessor sa, bool /* unused */ = false) : Base(is, iend, sa) { copyImage(srcIterRange(is, iend, sa), destImage(this->image_)); } template SplineImageView(triple s, bool /* unused */ = false) : Base(s) { copyImage(s, destImage(this->image_)); } }; } // namespace vigra #endif /* VIGRA_SPLINEIMAGEVIEW_HXX */ gamera-3.3.3/include/vigra/splines.hxx0000644000076500000000000011167611261456425016725 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_SPLINES_HXX #define VIGRA_SPLINES_HXX #include #include "config.hxx" #include "mathutil.hxx" #include "polynomial.hxx" #include "array_vector.hxx" #include "fixedpoint.hxx" namespace vigra { /** \addtogroup MathFunctions Mathematical Functions */ //@{ /* B-Splines of arbitrary order and interpolating Catmull/Rom splines. \#include \<vigra/splines.hxx\>
Namespace: vigra */ #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION /** Basic interface of the spline functors. Implements the spline functions defined by the recursion \f[ B_0(x) = \left\{ \begin{array}{ll} 1 & -\frac{1}{2} \leq x < \frac{1}{2} \\ 0 & \mbox{otherwise} \end{array}\right. \f] and \f[ B_n(x) = B_0(x) * B_{n-1}(x) \f] where * denotes convolution, and n is the spline order given by the template parameter ORDER. These spline classes can be used as unary and binary functors, as kernels for \ref resamplingConvolveImage(), and as arguments for \ref vigra::SplineImageView. Note that the spline order is given as a template argument. \#include \<vigra/splines.hxx\>
Namespace: vigra */ template class BSplineBase { public: /** the value type if used as a kernel in \ref resamplingConvolveImage(). */ typedef T value_type; /** the functor's unary argument type */ typedef T argument_type; /** the functor's first binary argument type */ typedef T first_argument_type; /** the functor's second binary argument type */ typedef unsigned int second_argument_type; /** the functor's result type (unary and binary) */ typedef T result_type; /** the spline order */ enum StaticOrder { order = ORDER }; /** Create functor for gevine derivative of the spline. The spline's order is specified spline by the template argument ORDER. */ explicit BSplineBase(unsigned int derivativeOrder = 0) : s1_(derivativeOrder) {} /** Unary function call. Returns the value of the spline with the derivative order given in the constructor. Note that only derivatives up to ORDER-1 are continous, and derivatives above ORDER+1 are zero. */ result_type operator()(argument_type x) const { return exec(x, derivativeOrder()); } /** Binary function call. The given derivative order is added to the derivative order specified in the constructor. Note that only derivatives up to ORDER-1 are continous, and derivatives above ORDER+1 are zero. */ result_type operator()(first_argument_type x, second_argument_type derivative_order) const { return exec(x, derivativeOrder() + derivative_order); } /** Index operator. Same as unary function call. */ value_type operator[](value_type x) const { return operator()(x); } /** Get the required filter radius for a discrete approximation of the spline. Always equal to (ORDER + 1) / 2.0. */ double radius() const { return (ORDER + 1) * 0.5; } /** Get the derivative order of the Gaussian. */ unsigned int derivativeOrder() const { return s1_.derivativeOrder(); } /** Get the prefilter coefficients required for interpolation. To interpolate with a B-spline, \ref resamplingConvolveImage() can be used. However, the image to be interpolated must be pre-filtered using \ref recursiveFilterX() and \ref recursiveFilterY() with the filter coefficients given by this function. The length of the array corresponds to how many times the above recursive filtering has to be applied (zero length means no prefiltering necessary). */ ArrayVector const & prefilterCoefficients() const { static ArrayVector const & b = calculatePrefilterCoefficients(); return b; } static ArrayVector const & calculatePrefilterCoefficients(); typedef T WeightMatrix[ORDER+1][ORDER+1]; /** Get the coefficients to transform spline coefficients into the coefficients of the corresponding polynomial. Currently internally used in SplineImageView; needs more documentation ??? */ static WeightMatrix & weights() { static WeightMatrix & b = calculateWeightMatrix(); return b; } static WeightMatrix & calculateWeightMatrix(); protected: result_type exec(first_argument_type x, second_argument_type derivative_order) const; BSplineBase s1_; }; template typename BSplineBase::result_type BSplineBase::exec(first_argument_type x, second_argument_type derivative_order) const { if(derivative_order == 0) { T n12 = (ORDER + 1.0) / 2.0; return ((n12 + x) * s1_(x + 0.5) + (n12 - x) * s1_(x - 0.5)) / ORDER; } else { --derivative_order; return s1_(x + 0.5, derivative_order) - s1_(x - 0.5, derivative_order); } } template ArrayVector const & BSplineBase::calculatePrefilterCoefficients() { static ArrayVector b; if(ORDER > 1) { static const int r = ORDER / 2; StaticPolynomial<2*r, double> p(2*r); BSplineBase spline; for(int i = 0; i <= 2*r; ++i) p[i] = spline(T(i-r)); ArrayVector roots; polynomialRealRoots(p, roots); for(unsigned int i = 0; i < roots.size(); ++i) if(VIGRA_CSTD::fabs(roots[i]) < 1.0) b.push_back(roots[i]); } return b; } template typename BSplineBase::WeightMatrix & BSplineBase::calculateWeightMatrix() { static WeightMatrix b; double faculty = 1.0; for(int d = 0; d <= ORDER; ++d) { if(d > 1) faculty *= d; double x = ORDER / 2; // (note: integer division) BSplineBase spline; for(int i = 0; i <= ORDER; ++i, --x) b[d][i] = spline(x, d) / faculty; } return b; } /********************************************************/ /* */ /* BSpline */ /* */ /********************************************************/ /** Spline functors for arbitrary orders. Provides the interface of \ref vigra::BSplineBase with a more convenient name -- see there for more documentation. */ template class BSpline : public BSplineBase { public: /** Constructor forwarded to the base class constructor.. */ explicit BSpline(unsigned int derivativeOrder = 0) : BSplineBase(derivativeOrder) {} }; /********************************************************/ /* */ /* BSpline<0, T> */ /* */ /********************************************************/ template class BSplineBase<0, T> { public: typedef T value_type; typedef T argument_type; typedef T first_argument_type; typedef unsigned int second_argument_type; typedef T result_type; enum StaticOrder { order = 0 }; explicit BSplineBase(unsigned int derivativeOrder = 0) : derivativeOrder_(derivativeOrder) {} result_type operator()(argument_type x) const { return exec(x, derivativeOrder_); } template FixedPoint operator()(FixedPoint x) const { typedef FixedPoint Value; return x.value < Value::ONE_HALF && -Value::ONE_HALF <= x.value ? Value(Value::ONE, FPNoShift) : Value(0, FPNoShift); } result_type operator()(first_argument_type x, second_argument_type derivative_order) const { return exec(x, derivativeOrder_ + derivative_order); } value_type operator[](value_type x) const { return operator()(x); } double radius() const { return 0.5; } unsigned int derivativeOrder() const { return derivativeOrder_; } ArrayVector const & prefilterCoefficients() const { static ArrayVector b; return b; } typedef T WeightMatrix[1][1]; static WeightMatrix & weights() { static T b[1][1] = {{ 1.0}}; return b; } protected: result_type exec(first_argument_type x, second_argument_type derivative_order) const { if(derivative_order == 0) return x < 0.5 && -0.5 <= x ? 1.0 : 0.0; else return 0.0; } unsigned int derivativeOrder_; }; /********************************************************/ /* */ /* BSpline<1, T> */ /* */ /********************************************************/ template class BSpline<1, T> { public: typedef T value_type; typedef T argument_type; typedef T first_argument_type; typedef unsigned int second_argument_type; typedef T result_type; enum StaticOrder { order = 1 }; explicit BSpline(unsigned int derivativeOrder = 0) : derivativeOrder_(derivativeOrder) {} result_type operator()(argument_type x) const { return exec(x, derivativeOrder_); } template FixedPoint operator()(FixedPoint x) const { typedef FixedPoint Value; int v = abs(x.value); return v < Value::ONE ? Value(Value::ONE - v, FPNoShift) : Value(0, FPNoShift); } result_type operator()(first_argument_type x, second_argument_type derivative_order) const { return exec(x, derivativeOrder_ + derivative_order); } value_type operator[](value_type x) const { return operator()(x); } double radius() const { return 1.0; } unsigned int derivativeOrder() const { return derivativeOrder_; } ArrayVector const & prefilterCoefficients() const { static ArrayVector b; return b; } typedef T WeightMatrix[2][2]; static WeightMatrix & weights() { static T b[2][2] = {{ 1.0, 0.0}, {-1.0, 1.0}}; return b; } protected: T exec(T x, unsigned int derivative_order) const; unsigned int derivativeOrder_; }; template T BSpline<1, T>::exec(T x, unsigned int derivative_order) const { switch(derivative_order) { case 0: { x = VIGRA_CSTD::fabs(x); return x < 1.0 ? 1.0 - x : 0.0; } case 1: { return x < 0.0 ? -1.0 <= x ? 1.0 : 0.0 : x < 1.0 ? -1.0 : 0.0; } default: return 0.0; } } /********************************************************/ /* */ /* BSpline<2, T> */ /* */ /********************************************************/ template class BSpline<2, T> { public: typedef T value_type; typedef T argument_type; typedef T first_argument_type; typedef unsigned int second_argument_type; typedef T result_type; enum StaticOrder { order = 2 }; explicit BSpline(unsigned int derivativeOrder = 0) : derivativeOrder_(derivativeOrder) {} result_type operator()(argument_type x) const { return exec(x, derivativeOrder_); } template FixedPoint operator()(FixedPoint x) const { typedef FixedPoint Value; enum { ONE_HALF = Value::ONE_HALF, THREE_HALVES = ONE_HALF * 3, THREE_QUARTERS = THREE_HALVES / 2, PREMULTIPLY_SHIFT1 = FracBits <= 16 ? 0 : FracBits - 16, PREMULTIPLY_SHIFT2 = FracBits - 1 <= 16 ? 0 : FracBits - 17, POSTMULTIPLY_SHIFT1 = FracBits - 2*PREMULTIPLY_SHIFT1, POSTMULTIPLY_SHIFT2 = FracBits - 2*PREMULTIPLY_SHIFT2 }; int v = abs(x.value); return v == ONE_HALF ? Value(ONE_HALF, FPNoShift) : v <= ONE_HALF ? Value(THREE_QUARTERS - (int)(sq((unsigned)v >> PREMULTIPLY_SHIFT2) >> POSTMULTIPLY_SHIFT2), FPNoShift) : v < THREE_HALVES ? Value((int)(sq((unsigned)(THREE_HALVES-v) >> PREMULTIPLY_SHIFT1) >> (POSTMULTIPLY_SHIFT1 + 1)), FPNoShift) : Value(0, FPNoShift); } result_type operator()(first_argument_type x, second_argument_type derivative_order) const { return exec(x, derivativeOrder_ + derivative_order); } result_type dx(argument_type x) const { return operator()(x, 1); } value_type operator[](value_type x) const { return operator()(x); } double radius() const { return 1.5; } unsigned int derivativeOrder() const { return derivativeOrder_; } ArrayVector const & prefilterCoefficients() const { static ArrayVector b(1, 2.0*M_SQRT2 - 3.0); return b; } typedef T WeightMatrix[3][3]; static WeightMatrix & weights() { static T b[3][3] = {{ 0.125, 0.75, 0.125}, {-0.5, 0.0, 0.5}, { 0.5, -1.0, 0.5}}; return b; } protected: result_type exec(first_argument_type x, second_argument_type derivative_order) const; unsigned int derivativeOrder_; }; template typename BSpline<2, T>::result_type BSpline<2, T>::exec(first_argument_type x, second_argument_type derivative_order) const { switch(derivative_order) { case 0: { x = VIGRA_CSTD::fabs(x); return x < 0.5 ? 0.75 - x*x : x < 1.5 ? 0.5 * sq(1.5 - x) : 0.0; } case 1: { return x >= -0.5 ? x <= 0.5 ? -2.0 * x : x < 1.5 ? x - 1.5 : 0.0 : x > -1.5 ? x + 1.5 : 0.0; } case 2: { return x >= -0.5 ? x < 0.5 ? -2.0 : x < 1.5 ? 1.0 : 0.0 : x >= -1.5 ? 1.0 : 0.0; } default: return 0.0; } } /********************************************************/ /* */ /* BSpline<3, T> */ /* */ /********************************************************/ template class BSpline<3, T> { public: typedef T value_type; typedef T argument_type; typedef T first_argument_type; typedef unsigned int second_argument_type; typedef T result_type; enum StaticOrder { order = 3 }; explicit BSpline(unsigned int derivativeOrder = 0) : derivativeOrder_(derivativeOrder) {} result_type operator()(argument_type x) const { return exec(x, derivativeOrder_); } template FixedPoint operator()(FixedPoint x) const { typedef FixedPoint Value; enum { ONE = Value::ONE, TWO = 2 * ONE, TWO_THIRDS = TWO / 3, ONE_SIXTH = ONE / 6, PREMULTIPLY_SHIFT = FracBits <= 16 ? 0 : FracBits - 16, POSTMULTIPLY_SHIFT = FracBits - 2*PREMULTIPLY_SHIFT }; int v = abs(x.value); return v == ONE ? Value(ONE_SIXTH, FPNoShift) : v < ONE ? Value(TWO_THIRDS + (((int)(sq((unsigned)v >> PREMULTIPLY_SHIFT) >> (POSTMULTIPLY_SHIFT + PREMULTIPLY_SHIFT)) * (((v >> 1) - ONE) >> PREMULTIPLY_SHIFT)) >> POSTMULTIPLY_SHIFT), FPNoShift) : v < TWO ? Value((int)((sq((unsigned)(TWO-v) >> PREMULTIPLY_SHIFT) >> (POSTMULTIPLY_SHIFT + PREMULTIPLY_SHIFT)) * ((unsigned)(TWO-v) >> PREMULTIPLY_SHIFT) / 6) >> POSTMULTIPLY_SHIFT, FPNoShift) : Value(0, FPNoShift); } result_type operator()(first_argument_type x, second_argument_type derivative_order) const { return exec(x, derivativeOrder_ + derivative_order); } result_type dx(argument_type x) const { return operator()(x, 1); } result_type dxx(argument_type x) const { return operator()(x, 2); } value_type operator[](value_type x) const { return operator()(x); } double radius() const { return 2.0; } unsigned int derivativeOrder() const { return derivativeOrder_; } ArrayVector const & prefilterCoefficients() const { static ArrayVector b(1, VIGRA_CSTD::sqrt(3.0) - 2.0); return b; } typedef T WeightMatrix[4][4]; static WeightMatrix & weights() { static T b[4][4] = {{ 1.0 / 6.0, 2.0 / 3.0, 1.0 / 6.0, 0.0}, {-0.5, 0.0, 0.5, 0.0}, { 0.5, -1.0, 0.5, 0.0}, {-1.0 / 6.0, 0.5, -0.5, 1.0 / 6.0}}; return b; } protected: result_type exec(first_argument_type x, second_argument_type derivative_order) const; unsigned int derivativeOrder_; }; template typename BSpline<3, T>::result_type BSpline<3, T>::exec(first_argument_type x, second_argument_type derivative_order) const { switch(derivative_order) { case 0: { x = VIGRA_CSTD::fabs(x); if(x < 1.0) { return 2.0/3.0 + x*x*(-1.0 + 0.5*x); } else if(x < 2.0) { x = 2.0 - x; return x*x*x/6.0; } else return 0.0; } case 1: { double s = x < 0.0 ? -1.0 : 1.0; x = VIGRA_CSTD::fabs(x); return x < 1.0 ? s*x*(-2.0 + 1.5*x) : x < 2.0 ? -0.5*s*sq(2.0 - x) : 0.0; } case 2: { x = VIGRA_CSTD::fabs(x); return x < 1.0 ? 3.0*x - 2.0 : x < 2.0 ? 2.0 - x : 0.0; } case 3: { return x < 0.0 ? x < -1.0 ? x < -2.0 ? 0.0 : 1.0 : -3.0 : x < 1.0 ? 3.0 : x < 2.0 ? -1.0 : 0.0; } default: return 0.0; } } typedef BSpline<3, double> CubicBSplineKernel; /********************************************************/ /* */ /* BSpline<4, T> */ /* */ /********************************************************/ template class BSpline<4, T> { public: typedef T value_type; typedef T argument_type; typedef T first_argument_type; typedef unsigned int second_argument_type; typedef T result_type; enum StaticOrder { order = 4 }; explicit BSpline(unsigned int derivativeOrder = 0) : derivativeOrder_(derivativeOrder) {} result_type operator()(argument_type x) const { return exec(x, derivativeOrder_); } result_type operator()(first_argument_type x, second_argument_type derivative_order) const { return exec(x, derivativeOrder_ + derivative_order); } result_type dx(argument_type x) const { return operator()(x, 1); } result_type dxx(argument_type x) const { return operator()(x, 2); } result_type dx3(argument_type x) const { return operator()(x, 3); } value_type operator[](value_type x) const { return operator()(x); } double radius() const { return 2.5; } unsigned int derivativeOrder() const { return derivativeOrder_; } ArrayVector const & prefilterCoefficients() const { static ArrayVector const & b = initPrefilterCoefficients(); return b; } static ArrayVector const & initPrefilterCoefficients() { static ArrayVector b(2); // -19 + 4*sqrt(19) + 2*sqrt(2*(83 - 19*sqrt(19))) b[0] = -0.361341225900220177092212841325; // -19 - 4*sqrt(19) + 2*sqrt(2*(83 + 19*sqrt(19))) b[1] = -0.013725429297339121360331226939; return b; } typedef T WeightMatrix[5][5]; static WeightMatrix & weights() { static T b[5][5] = {{ 1.0/384.0, 19.0/96.0, 115.0/192.0, 19.0/96.0, 1.0/384.0}, {-1.0/48.0, -11.0/24.0, 0.0, 11.0/24.0, 1.0/48.0}, { 1.0/16.0, 1.0/4.0, -5.0/8.0, 1.0/4.0, 1.0/16.0}, {-1.0/12.0, 1.0/6.0, 0.0, -1.0/6.0, 1.0/12.0}, { 1.0/24.0, -1.0/6.0, 0.25, -1.0/6.0, 1.0/24.0}}; return b; } protected: result_type exec(first_argument_type x, second_argument_type derivative_order) const; unsigned int derivativeOrder_; }; template typename BSpline<4, T>::result_type BSpline<4, T>::exec(first_argument_type x, second_argument_type derivative_order) const { switch(derivative_order) { case 0: { x = VIGRA_CSTD::fabs(x); if(x <= 0.5) { return 115.0/192.0 + x*x*(-0.625 + x*x*0.25); } else if(x < 1.5) { return (55.0/16.0 + x*(1.25 + x*(-7.5 + x*(5.0 - x)))) / 6.0; } else if(x < 2.5) { x = 2.5 - x; return sq(x*x) / 24.0; } else return 0.0; } case 1: { double s = x < 0.0 ? -1.0 : 1.0; x = VIGRA_CSTD::fabs(x); if(x <= 0.5) { return s*x*(-1.25 + x*x); } else if(x < 1.5) { return s*(5.0 + x*(-60.0 + x*(60.0 - 16.0*x))) / 24.0; } else if(x < 2.5) { x = 2.5 - x; return s*x*x*x / -6.0; } else return 0.0; } case 2: { x = VIGRA_CSTD::fabs(x); if(x <= 0.5) { return -1.25 + 3.0*x*x; } else if(x < 1.5) { return -2.5 + x*(5.0 - 2.0*x); } else if(x < 2.5) { x = 2.5 - x; return x*x / 2.0; } else return 0.0; } case 3: { double s = x < 0.0 ? -1.0 : 1.0; x = VIGRA_CSTD::fabs(x); if(x <= 0.5) { return s*x*6.0; } else if(x < 1.5) { return s*(5.0 - 4.0*x); } else if(x < 2.5) { return s*(x - 2.5); } else return 0.0; } case 4: { return x < 0.0 ? x < -2.5 ? 0.0 : x < -1.5 ? 1.0 : x < -0.5 ? -4.0 : 6.0 : x < 0.5 ? 6.0 : x < 1.5 ? -4.0 : x < 2.5 ? 1.0 : 0.0; } default: return 0.0; } } typedef BSpline<4, double> QuarticBSplineKernel; /********************************************************/ /* */ /* BSpline<5, T> */ /* */ /********************************************************/ template class BSpline<5, T> { public: typedef T value_type; typedef T argument_type; typedef T first_argument_type; typedef unsigned int second_argument_type; typedef T result_type; enum StaticOrder { order = 5 }; explicit BSpline(unsigned int derivativeOrder = 0) : derivativeOrder_(derivativeOrder) {} result_type operator()(argument_type x) const { return exec(x, derivativeOrder_); } result_type operator()(first_argument_type x, second_argument_type derivative_order) const { return exec(x, derivativeOrder_ + derivative_order); } result_type dx(argument_type x) const { return operator()(x, 1); } result_type dxx(argument_type x) const { return operator()(x, 2); } result_type dx3(argument_type x) const { return operator()(x, 3); } result_type dx4(argument_type x) const { return operator()(x, 4); } value_type operator[](value_type x) const { return operator()(x); } double radius() const { return 3.0; } unsigned int derivativeOrder() const { return derivativeOrder_; } ArrayVector const & prefilterCoefficients() const { static ArrayVector const & b = initPrefilterCoefficients(); return b; } static ArrayVector const & initPrefilterCoefficients() { static ArrayVector b(2); // -(13/2) + sqrt(105)/2 + sqrt(1/2*((135 - 13*sqrt(105)))) b[0] = -0.430575347099973791851434783493; // (1/2)*((-13) - sqrt(105) + sqrt(2*((135 + 13*sqrt(105))))) b[1] = -0.043096288203264653822712376822; return b; } typedef T WeightMatrix[6][6]; static WeightMatrix & weights() { static T b[6][6] = {{ 1.0/120.0, 13.0/60.0, 11.0/20.0, 13.0/60.0, 1.0/120.0, 0.0}, {-1.0/24.0, -5.0/12.0, 0.0, 5.0/12.0, 1.0/24.0, 0.0}, { 1.0/12.0, 1.0/6.0, -0.5, 1.0/6.0, 1.0/12.0, 0.0}, {-1.0/12.0, 1.0/6.0, 0.0, -1.0/6.0, 1.0/12.0, 0.0}, { 1.0/24.0, -1.0/6.0, 0.25, -1.0/6.0, 1.0/24.0, 0.0}, {-1.0/120.0, 1.0/24.0, -1.0/12.0, 1.0/12.0, -1.0/24.0, 1.0/120.0}}; return b; } protected: result_type exec(first_argument_type x, second_argument_type derivative_order) const; unsigned int derivativeOrder_; }; template typename BSpline<5, T>::result_type BSpline<5, T>::exec(first_argument_type x, second_argument_type derivative_order) const { switch(derivative_order) { case 0: { x = VIGRA_CSTD::fabs(x); if(x <= 1.0) { return 0.55 + x*x*(-0.5 + x*x*(0.25 - x/12.0)); } else if(x < 2.0) { return 17.0/40.0 + x*(0.625 + x*(-1.75 + x*(1.25 + x*(-0.375 + x/24.0)))); } else if(x < 3.0) { x = 3.0 - x; return x*sq(x*x) / 120.0; } else return 0.0; } case 1: { double s = x < 0.0 ? -1.0 : 1.0; x = VIGRA_CSTD::fabs(x); if(x <= 1.0) { return s*x*(-1.0 + x*x*(1.0 - 5.0/12.0*x)); } else if(x < 2.0) { return s*(0.625 + x*(-3.5 + x*(3.75 + x*(-1.5 + 5.0/24.0*x)))); } else if(x < 3.0) { x = 3.0 - x; return s*sq(x*x) / -24.0; } else return 0.0; } case 2: { x = VIGRA_CSTD::fabs(x); if(x <= 1.0) { return -1.0 + x*x*(3.0 -5.0/3.0*x); } else if(x < 2.0) { return -3.5 + x*(7.5 + x*(-4.5 + 5.0/6.0*x)); } else if(x < 3.0) { x = 3.0 - x; return x*x*x / 6.0; } else return 0.0; } case 3: { double s = x < 0.0 ? -1.0 : 1.0; x = VIGRA_CSTD::fabs(x); if(x <= 1.0) { return s*x*(6.0 - 5.0*x); } else if(x < 2.0) { return s*(7.5 + x*(-9.0 + 2.5*x)); } else if(x < 3.0) { x = 3.0 - x; return -0.5*s*x*x; } else return 0.0; } case 4: { x = VIGRA_CSTD::fabs(x); if(x <= 1.0) { return 6.0 - 10.0*x; } else if(x < 2.0) { return -9.0 + 5.0*x; } else if(x < 3.0) { return 3.0 - x; } else return 0.0; } case 5: { return x < 0.0 ? x < -2.0 ? x < -3.0 ? 0.0 : 1.0 : x < -1.0 ? -5.0 : 10.0 : x < 2.0 ? x < 1.0 ? -10.0 : 5.0 : x < 3.0 ? -1.0 : 0.0; } default: return 0.0; } } typedef BSpline<5, double> QuinticBSplineKernel; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION /********************************************************/ /* */ /* CatmullRomSpline */ /* */ /********************************************************/ /** Interpolating 3-rd order splines. Implements the Catmull/Rom cardinal function \f[ f(x) = \left\{ \begin{array}{ll} \frac{3}{2}x^3 - \frac{5}{2}x^2 + 1 & |x| \leq 1 \\ -\frac{1}{2}x^3 + \frac{5}{2}x^2 -4x + 2 & |x| \leq 2 \\ 0 & \mbox{otherwise} \end{array}\right. \f] It can be used as a functor, and as a kernel for \ref resamplingConvolveImage() to create a differentiable interpolant of an image. However, it should be noted that a twice differentiable interpolant can be created with only slightly more effort by recursive prefiltering followed by convolution with a 3rd order B-spline. \#include \<vigra/splines.hxx\>
Namespace: vigra */ template class CatmullRomSpline { public: /** the kernel's value type */ typedef T value_type; /** the unary functor's argument type */ typedef T argument_type; /** the unary functor's result type */ typedef T result_type; /** the splines polynomial order */ enum StaticOrder { order = 3 }; /** function (functor) call */ result_type operator()(argument_type x) const; /** index operator -- same as operator() */ T operator[] (T x) const { return operator()(x); } /** Radius of the function's support. Needed for \ref resamplingConvolveImage(), always 2. */ int radius() const {return 2;} /** Derivative order of the function: always 0. */ unsigned int derivativeOrder() const { return 0; } /** Prefilter coefficients for compatibility with \ref vigra::BSpline. (array has zero length, since prefiltering is not necessary). */ ArrayVector const & prefilterCoefficients() const { static ArrayVector b; return b; } }; template typename CatmullRomSpline::result_type CatmullRomSpline::operator()(argument_type x) const { x = VIGRA_CSTD::fabs(x); if (x <= 1.0) { return 1.0 + x * x * (-2.5 + 1.5 * x); } else if (x >= 2.0) { return 0.0; } else { return 2.0 + x * (-4.0 + x * (2.5 - 0.5 * x)); } } //@} } // namespace vigra #endif /* VIGRA_SPLINES_HXX */ gamera-3.3.3/include/vigra/static_assert.hxx0000644000076500000000000001142211261456425020104 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2004-2005 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_STATIC_ASSERT_HXX #define VIGRA_STATIC_ASSERT_HXX // based on the static assertion design in boost::mpl (see www.boost.org) #define VIGRA_PREPROCESSOR_CONCATENATE(a, b) VIGRA_PREPROCESSOR_CONCATENATE_IMPL(a, b) #define VIGRA_PREPROCESSOR_CONCATENATE_IMPL(a, b) a ## b namespace vigra { namespace staticAssert { template struct AssertBool; template <> struct AssertBool { typedef int type; typedef void * not_type; }; template <> struct AssertBool { typedef void * type; typedef int not_type; }; template struct Assert; template <> struct Assert { typedef int type; typedef void * not_type; }; template <> struct Assert { typedef void * type; typedef int not_type; }; struct failure{}; struct success {}; inline int check( success ) { return 0; } template< typename Predicate > failure ************ (Predicate::************ assertImpl( void (*)(Predicate), typename Predicate::not_type ) ); template< typename Predicate > success assertImpl( void (*)(Predicate), typename Predicate::type ); /* Usage: 1. Define an assertion class, derived from vigra::staticAssert::Assert, whose name serves as an error message: template struct FixedPoint_overflow_error__More_than_31_bits_requested : vigra::staticAssert::AssertBool<(N < 32)> {}; 2. Call VIGRA_STATIC_ASSERT() with the assertion class: template void test() { // signal error if N > 31 VIGRA_STATIC_ASSERT((FixedPoint_overflow_error__More_than_31_bits_requested)); } TODO: provide more assertion base classes for other (non boolean) types of tests */ #if !defined(__GNUC__) || __GNUC__ > 2 #define VIGRA_STATIC_ASSERT(Predicate) \ enum { \ VIGRA_PREPROCESSOR_CONCATENATE(vigra_assertion_in_line_, __LINE__) = sizeof( \ staticAssert::check( \ staticAssert::assertImpl( (void (*) Predicate)0, 1 ) \ ) \ ) \ } #else #define VIGRA_STATIC_ASSERT(Predicate) #endif } // namespace staticAssert } // namespace vigra #endif // VIGRA_STATIC_ASSERT_HXX gamera-3.3.3/include/vigra/stdconvolution.hxx0000644000076500000000000016154711261456425020344 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_STDCONVOLUTION_HXX #define VIGRA_STDCONVOLUTION_HXX #include #include "stdimage.hxx" #include "bordertreatment.hxx" #include "separableconvolution.hxx" #include "utilities.hxx" #include "sized_int.hxx" namespace vigra { template void internalPixelEvaluationByClip(int x, int y, int w, int h, SrcIterator xs, SrcAccessor src_acc, DestIterator xd, DestAccessor dest_acc, KernelIterator ki, Diff2D kul, Diff2D klr, KernelAccessor ak, KSumType norm) { typedef typename NumericTraits::RealPromote SumType; typedef NumericTraits DestTraits; // calculate width and height of the kernel int kernel_width = klr.x - kul.x + 1; int kernel_height = klr.y - kul.y + 1; SumType sum = NumericTraits::zero(); int xx, yy; int x0, y0, x1, y1; y0 = (y::zero(); kernel_width = x1 - x0 + 1; kernel_height = y1 - y0 + 1; //es wird zuerst abgeschnitten und dann gespigelt! for(yy=0; yy void internalPixelEvaluationByWrapReflectRepeat(int x, int y, int src_width, int src_height, SrcIterator xs, SrcAccessor src_acc, DestIterator xd, DestAccessor dest_acc, KernelIterator ki, Diff2D kul, Diff2D klr, KernelAccessor ak, BorderTreatmentMode border) { typedef typename NumericTraits::RealPromote SumType; typedef NumericTraits DestTraits; SumType sum = NumericTraits::zero(); SrcIterator src_ul = xs - Diff2D(x, y); SrcIterator src_lr = src_ul + Diff2D(src_width, src_height); SrcIterator yys = xs; KernelIterator yk = ki; // calculate width and height of the kernel int kernel_width = klr.x - kul.x + 1; int kernel_height = klr.y - kul.y + 1; // where the kernel is beyond the borders: bool top_to_much = (yur or (-1, -1) for lr->ul Diff2D way_increment; /* Iteration is always done from valid to invalid range. The following tuple is composed as such: - If an invalid range is reached while iterating in X, a jump of border_increment.first is performed and border_increment.third is used for further iterating. - If an invalid range is reached while iterating in Y, a jump of border_increment.second is performed and border_increment.fourth is used for further iterating. */ tuple4 border_increment; if (border == BORDER_TREATMENT_REPEAT){ border_increment = tuple4(1, 1, 0, 0); }else if (border == BORDER_TREATMENT_REFLECT){ border_increment = tuple4(2, 2, -1, -1); }else{ // BORDER_TREATMENT_WRAP border_increment = tuple4(src_width, src_height, 1, 1); } pair valid_step_count; if(left_to_much && !top_to_much && !down_to_much) { yys += klr; yk += kul; way_increment = Diff2D(-1, -1); border_increment.third = -border_increment.third; border_increment.fourth = -border_increment.fourth; valid_step_count = std::make_pair((yys - src_ul).x + 1, kernel_height); } else if(top_to_much && !left_to_much && !right_to_much) { yys += klr; yk += kul; way_increment = Diff2D(-1, -1); border_increment.third = -border_increment.third; border_increment.fourth = -border_increment.fourth; valid_step_count = std::make_pair(kernel_width, (yys - src_ul).y + 1); } else if(right_to_much && !top_to_much && !down_to_much) { yys += kul; yk += klr; way_increment = Diff2D(1, 1); border_increment.first = -border_increment.first; border_increment.second = -border_increment.second; valid_step_count = std::make_pair((src_lr - yys).x, kernel_height); } else if(down_to_much && !left_to_much && !right_to_much) { yys += kul; yk += klr; way_increment = Diff2D(1, 1); border_increment.first = -border_increment.first; border_increment.second = -border_increment.second; valid_step_count = std::make_pair(kernel_width, (src_lr - yys).y); } else if(down_to_much && left_to_much) { yys += kul + Diff2D(kernel_width - 1, 0); yk += kul + Diff2D(0, kernel_height - 1); way_increment = Diff2D(-1, 1); border_increment.second = -border_increment.second; border_increment.third = -border_increment.third; valid_step_count = std::make_pair((yys - src_ul).x + 1, (src_lr - yys).y); } else if(down_to_much && right_to_much) { yys += kul; yk += klr; way_increment = Diff2D(1, 1); border_increment.first = -border_increment.first; border_increment.second = -border_increment.second; valid_step_count = std::make_pair((src_lr - yys).x, (src_lr - yys).y); } else if(top_to_much && left_to_much) { yys += klr; yk += kul; way_increment = Diff2D(-1, -1); border_increment.third = -border_increment.third; border_increment.fourth = -border_increment.fourth; valid_step_count = std::make_pair((yys - src_ul).x + 1, (yys - src_ul).y + 1); } else { //top_to_much && right_to_much yys += kul + Diff2D(0, kernel_height - 1); yk += kul + Diff2D(kernel_width - 1, 0); way_increment = Diff2D(1, -1); border_increment.first = -border_increment.first; border_increment.fourth = -border_increment.fourth; valid_step_count = std::make_pair((src_lr - yys).x, (yys - src_ul).y + 1); } int yy = 0, xx; //laeuft den zulässigen Bereich in y-Richtung durch for(; yy < valid_step_count.second; ++yy, yys.y += way_increment.y, yk.y -= way_increment.y ) { SrcIterator xxs = yys; KernelIterator xk = yk; //laeuft den zulässigen Bereich in x-Richtung durch for(xx = 0; xx < valid_step_count.first; ++xx, xxs.x += way_increment.x, xk.x -= way_increment.x) { sum += ak(xk) * src_acc(xxs); } //Nächstes ++xxs.x wuerde in unzulässigen Bereich //bringen => Sprung in zulaessigen Bereich xxs.x += border_increment.first; for( ; xx < kernel_width; ++xx, xxs.x += border_increment.third, xk.x -= way_increment.x ) { sum += ak(xk) * src_acc(xxs); } } //Nächstes ++yys.y wuerde in unzulässigen Bereich //bringen => Sprung in zulaessigen Bereich yys.y += border_increment.second; for( ; yy < kernel_height; ++yy, yys.y += border_increment.third, yk.y -= way_increment.y) { SrcIterator xxs = yys; KernelIterator xk = yk; for(xx=0; xx < valid_step_count.first; ++xx, xxs.x += way_increment.x, xk.x -= way_increment.x) { sum += ak(xk) * src_acc(xxs); } //Sprung in den zulaessigen Bereich xxs.x += border_increment.first; for( ; xx < kernel_width; ++xx, xxs.x += border_increment.third, xk.x -= way_increment.x ) { sum += ak(xk) * src_acc(xxs); } } // store average in destination pixel dest_acc.set(DestTraits::fromRealPromote(sum), xd); }// end of internalPixelEvaluationByWrapReflectRepeat #endif /* #if 0 */ template void internalPixelEvaluationByWrapReflectRepeat(SrcIterator xs, SrcAccessor src_acc, KernelIterator xk, KernelAccessor ak, int left, int right, int kleft, int kright, int borderskipx, int borderinc, SumType & sum) { SrcIterator xxs = xs + left; KernelIterator xxk = xk - left; for(int xx = left; xx <= right; ++xx, ++xxs, --xxk) { sum += ak(xxk) * src_acc(xxs); } xxs = xs + left - borderskipx; xxk = xk - left + 1; for(int xx = left - 1; xx >= -kright; --xx, xxs -= borderinc, ++xxk) { sum += ak(xxk) * src_acc(xxs); } xxs = xs + right + borderskipx; xxk = xk - right - 1; for(int xx = right + 1; xx <= -kleft; ++xx, xxs += borderinc, --xxk) { sum += ak(xxk) * src_acc(xxs); } } /** \addtogroup StandardConvolution Two-dimensional convolution functions Perform 2D non-separable convolution, with and without ROI mask. These generic convolution functions implement the standard 2D convolution operation for images that fit into the required interface. Arbitrary ROI's are supported by the mask version of the algorithm. The functions need a suitable 2D kernel to operate. */ //@{ /** \brief Performs a 2 dimensional convolution of the source image using the given kernel. The KernelIterator must point to the center of the kernel, and the kernel's size is given by its upper left (x and y of distance <= 0) and lower right (distance >= 0) corners. The image must always be larger than the kernel. At those positions where the kernel does not completely fit into the image, the specified \ref BorderTreatmentMode is applied. You can choice between following BorderTreatmentModes:
  • BORDER_TREATMENT_CLIP
  • BORDER_TREATMENT_AVOID
  • BORDER_TREATMENT_WRAP
  • BORDER_TREATMENT_REFLECT
  • BORDER_TREATMENT_REPEAT

The images's pixel type (SrcAccessor::value_type) must be a linear space over the kernel's value_type (KernelAccessor::value_type), i.e. addition of source values, multiplication with kernel values, and NumericTraits must be defined. The kernel's value_type must be an algebraic field, i.e. the arithmetic operations (+, -, *, /) and NumericTraits must be defined. Declarations: pass arguments explicitly: \code namespace vigra { template void convolveImage(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, DestIterator dest_ul, DestAccessor dest_acc, KernelIterator ki, KernelAccessor ak, Diff2D kul, Diff2D klr, BorderTreatmentMode border); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void convolveImage(triple src, pair dest, tuple5 kernel); } \endcode Usage: \#include \<vigra/stdconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... // define horizontal Sobel filter vigra::Kernel2D sobel; sobel.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = // upper left and lower right 0.125, 0.0, -0.125, 0.25, 0.0, -0.25, 0.125, 0.0, -0.125; sobel.setBorderTreatment(vigra::BORDER_TREATMENT_REFLECT); vigra::convolveImage(srcImageRange(src), destImage(dest), kernel2d(sobel)); \endcode Required Interface: \code ImageIterator src_ul, src_lr; ImageIterator dest_ul; ImageIterator ik; SrcAccessor src_accessor; DestAccessor dest_accessor; KernelAccessor kernel_accessor; NumericTraits::RealPromote s = src_accessor(src_ul); s = s + s; s = kernel_accessor(ik) * s; s -= s; dest_accessor.set( NumericTraits::fromRealPromote(s), dest_ul); NumericTraits::RealPromote k = kernel_accessor(ik); k += k; k -= k; k = k / k; \endcode Preconditions: \code kul.x <= 0 kul.y <= 0 klr.x >= 0 klr.y >= 0 src_lr.x - src_ul.x >= klr.x + kul.x + 1 src_lr.y - src_ul.y >= klr.y + kul.y + 1 \endcode If border == BORDER_TREATMENT_CLIP: Sum of kernel elements must be != 0. */ template void convolveImage(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, DestIterator dest_ul, DestAccessor dest_acc, KernelIterator ki, KernelAccessor ak, Diff2D kul, Diff2D klr, BorderTreatmentMode border) { vigra_precondition((border == BORDER_TREATMENT_CLIP || border == BORDER_TREATMENT_AVOID || border == BORDER_TREATMENT_REFLECT || border == BORDER_TREATMENT_REPEAT || border == BORDER_TREATMENT_WRAP), "convolveImage():\n" " Border treatment must be one of follow treatments:\n" " - BORDER_TREATMENT_CLIP\n" " - BORDER_TREATMENT_AVOID\n" " - BORDER_TREATMENT_REFLECT\n" " - BORDER_TREATMENT_REPEAT\n" " - BORDER_TREATMENT_WRAP\n"); vigra_precondition(kul.x <= 0 && kul.y <= 0, "convolveImage(): coordinates of " "kernel's upper left must be <= 0."); vigra_precondition(klr.x >= 0 && klr.y >= 0, "convolveImage(): coordinates of " "kernel's lower right must be >= 0."); // use traits to determine SumType as to prevent possible overflow typedef typename PromoteTraits::Promote SumType; typedef typename NumericTraits::RealPromote KernelSumType; typedef NumericTraits DestTraits; // calculate width and height of the image int w = src_lr.x - src_ul.x; int h = src_lr.y - src_ul.y; // calculate width and height of the kernel int kernel_width = klr.x - kul.x + 1; int kernel_height = klr.y - kul.y + 1; vigra_precondition(w >= kernel_width && h >= kernel_height, "convolveImage(): kernel larger than image."); KernelSumType norm = NumericTraits::zero(); if(border == BORDER_TREATMENT_CLIP) { // calculate the sum of the kernel elements for renormalization KernelIterator yk = ki + klr; // determine sum within kernel (= norm) for(int y = 0; y < kernel_height; ++y, --yk.y) { KernelIterator xk = yk; for(int x = 0; x < kernel_width; ++x, --xk.x) { norm += ak(xk); } } vigra_precondition(norm != NumericTraits::zero(), "convolveImage(): Cannot use BORDER_TREATMENT_CLIP with a DC-free kernel"); } // create iterators for the interior part of the image (where the kernel always fits into the image) DestIterator yd = dest_ul + Diff2D(klr.x, klr.y); SrcIterator ys = src_ul + Diff2D(klr.x, klr.y); SrcIterator send = src_lr + Diff2D(kul.x, kul.y); // iterate over the interior part for(; ys.y < send.y; ++ys.y, ++yd.y) { // create x iterators DestIterator xd(yd); SrcIterator xs(ys); for(; xs.x < send.x; ++xs.x, ++xd.x) { // init the sum SumType sum = NumericTraits::zero(); SrcIterator yys = xs - klr; SrcIterator yyend = xs - kul; KernelIterator yk = ki + klr; for(; yys.y <= yyend.y; ++yys.y, --yk.y) { typename SrcIterator::row_iterator xxs = yys.rowIterator(); typename SrcIterator::row_iterator xxe = xxs + kernel_width; typename KernelIterator::row_iterator xk = yk.rowIterator(); for(; xxs < xxe; ++xxs, --xk) { sum += ak(xk) * src_acc(xxs); } } // store convolution result in destination pixel dest_acc.set(DestTraits::fromRealPromote(sum), xd); } } if(border == BORDER_TREATMENT_AVOID) return; // skip processing near the border int interiorskip = w + kul.x - klr.x - 1; int borderskipx = 0; int borderskipy = 0; int borderinc = 0; if(border == BORDER_TREATMENT_REPEAT) { borderskipx = 0; borderskipy = 0; borderinc = 0; } else if(border == BORDER_TREATMENT_REFLECT) { borderskipx = -1; borderskipy = -1; borderinc = -1; } else if(border == BORDER_TREATMENT_WRAP) { borderskipx = -w+1; borderskipy = -h+1; borderinc = 1; } // create iterators for the entire image yd = dest_ul; ys = src_ul; // work on entire image (but skip the already computed points in the loop) for(int y = 0; y < h; ++y, ++ys.y, ++yd.y) { int top = std::max(static_cast(-klr.y), static_cast(src_ul.y - ys.y)); int bottom = std::min(static_cast(-kul.y), static_cast(src_lr.y - ys.y - 1)); // create x iterators DestIterator xd(yd); SrcIterator xs(ys); for(int x = 0; x < w; ++x, ++xs.x, ++xd.x) { // check if we are away from the border if(y >= klr.y && y < h+kul.y && x == klr.x) { // yes => skip the already computed points x += interiorskip; xs.x += interiorskip; xd.x += interiorskip; continue; } if (border == BORDER_TREATMENT_CLIP) { internalPixelEvaluationByClip(x, y, w, h, xs, src_acc, xd, dest_acc, ki, kul, klr, ak, norm); } else { int left = std::max(-klr.x, src_ul.x - xs.x); int right = std::min(-kul.x, src_lr.x - xs.x - 1); // init the sum SumType sum = NumericTraits::zero(); // create iterators for the part of the kernel that fits into the image SrcIterator yys = xs + Size2D(0, top); KernelIterator yk = ki - Size2D(0, top); int yy; for(yy = top; yy <= bottom; ++yy, ++yys.y, --yk.y) { internalPixelEvaluationByWrapReflectRepeat(yys.rowIterator(), src_acc, yk.rowIterator(), ak, left, right, kul.x, klr.x, borderskipx, borderinc, sum); } yys = xs + Size2D(0, top - borderskipy); yk = ki - Size2D(0, top - 1); for(yy = top - 1; yy >= -klr.y; --yy, yys.y -= borderinc, ++yk.y) { internalPixelEvaluationByWrapReflectRepeat(yys.rowIterator(), src_acc, yk.rowIterator(), ak, left, right, kul.x, klr.x, borderskipx, borderinc, sum); } yys = xs + Size2D(0, bottom + borderskipy); yk = ki - Size2D(0, bottom + 1); for(yy = bottom + 1; yy <= -kul.y; ++yy, yys.y += borderinc, --yk.y) { internalPixelEvaluationByWrapReflectRepeat(yys.rowIterator(), src_acc, yk.rowIterator(), ak, left, right, kul.x, klr.x, borderskipx, borderinc, sum); } // store convolution result in destination pixel dest_acc.set(DestTraits::fromRealPromote(sum), xd); // internalPixelEvaluationByWrapReflectRepeat(x, y, w, h, xs, src_acc, xd, dest_acc, ki, kul, klr, ak, border); } } } } template inline void convolveImage( triple src, pair dest, tuple5 kernel) { convolveImage(src.first, src.second, src.third, dest.first, dest.second, kernel.first, kernel.second, kernel.third, kernel.fourth, kernel.fifth); } /** \brief Performs a 2-dimensional normalized convolution, i.e. convolution with a mask image. This functions computes normalized convolution as defined in Knutsson, H. and Westin, C-F.: Normalized and differential convolution: Methods for Interpolation and Filtering of incomplete and uncertain data. Proc. of the IEEE Conf. on Computer Vision and Pattern Recognition, 1993, 515-523. The mask image must be binary and encodes which pixels of the original image are valid. It is used as follows: Only pixel under the mask are used in the calculations. Whenever a part of the kernel lies outside the mask, it is ignored, and the kernel is renormalized to its original norm (analogous to the CLIP \ref BorderTreatmentMode). Thus, a useful convolution result is computed whenever at least one valid pixel is within the current window Thus, destination pixels not under the mask still receive a value if they are near the mask. Therefore, this algorithm is useful as an interpolator of sparse input data. If you are only interested in the destination values under the mask, you can perform a subsequent \ref copyImageIf(). The KernelIterator must point to the center of the kernel, and the kernel's size is given by its upper left (x and y of distance <= 0) and lower right (distance >= 0) corners. The image must always be larger than the kernel. At those positions where the kernel does not completely fit into the image, the specified \ref BorderTreatmentMode is applied. Only BORDER_TREATMENT_CLIP and BORDER_TREATMENT_AVOID are currently supported. The images's pixel type (SrcAccessor::value_type) must be a linear space over the kernel's value_type (KernelAccessor::value_type), i.e. addition of source values, multiplication with kernel values, and NumericTraits must be defined. The kernel's value_type must be an algebraic field, i.e. the arithmetic operations (+, -, *, /) and NumericTraits must be defined. Declarations: pass arguments explicitly: \code namespace vigra { template void normalizedConvolveImage(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, MaskIterator mul, MaskAccessor am, DestIterator dest_ul, DestAccessor dest_acc, KernelIterator ki, KernelAccessor ak, Diff2D kul, Diff2D klr, BorderTreatmentMode border); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void normalizedConvolveImage(triple src, pair mask, pair dest, tuple5 kernel); } \endcode Usage: \#include \<vigra/stdconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); vigra::CImage mask(w,h); ... // define 3x3 binomial filter vigra::Kernel2D binom; binom.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = // upper left and lower right 0.0625, 0.125, 0.0625, 0.125, 0.25, 0.125, 0.0625, 0.125, 0.0625; vigra::normalizedConvolveImage(srcImageRange(src), maskImage(mask), destImage(dest), kernel2d(binom)); \endcode Required Interface: \code ImageIterator src_ul, src_lr; ImageIterator mul; ImageIterator dest_ul; ImageIterator ik; SrcAccessor src_accessor; MaskAccessor mask_accessor; DestAccessor dest_accessor; KernelAccessor kernel_accessor; NumericTraits::RealPromote s = src_accessor(src_ul); s = s + s; s = kernel_accessor(ik) * s; s -= s; if(mask_accessor(mul)) ...; dest_accessor.set( NumericTraits::fromRealPromote(s), dest_ul); NumericTraits::RealPromote k = kernel_accessor(ik); k += k; k -= k; k = k / k; \endcode Preconditions: \code kul.x <= 0 kul.y <= 0 klr.x >= 0 klr.y >= 0 src_lr.x - src_ul.x >= klr.x + kul.x + 1 src_lr.y - src_ul.y >= klr.y + kul.y + 1 border == BORDER_TREATMENT_CLIP || border == BORDER_TREATMENT_AVOID \endcode Sum of kernel elements must be != 0. */ doxygen_overloaded_function(template <...> void normalizedConvolveImage) template void normalizedConvolveImage(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, MaskIterator mul, MaskAccessor am, DestIterator dest_ul, DestAccessor dest_acc, KernelIterator ki, KernelAccessor ak, Diff2D kul, Diff2D klr, BorderTreatmentMode border) { vigra_precondition((border == BORDER_TREATMENT_CLIP || border == BORDER_TREATMENT_AVOID), "normalizedConvolveImage(): " "Border treatment must be BORDER_TREATMENT_CLIP or BORDER_TREATMENT_AVOID."); vigra_precondition(kul.x <= 0 && kul.y <= 0, "normalizedConvolveImage(): left borders must be <= 0."); vigra_precondition(klr.x >= 0 && klr.y >= 0, "normalizedConvolveImage(): right borders must be >= 0."); // use traits to determine SumType as to prevent possible overflow typedef typename NumericTraits::RealPromote SumType; typedef typename NumericTraits::RealPromote KSumType; typedef NumericTraits DestTraits; // calculate width and height of the image int w = src_lr.x - src_ul.x; int h = src_lr.y - src_ul.y; int kernel_width = klr.x - kul.x + 1; int kernel_height = klr.y - kul.y + 1; int x,y; int ystart = (border == BORDER_TREATMENT_AVOID) ? klr.y : 0; int yend = (border == BORDER_TREATMENT_AVOID) ? h+kul.y : h; int xstart = (border == BORDER_TREATMENT_AVOID) ? klr.x : 0; int xend = (border == BORDER_TREATMENT_AVOID) ? w+kul.x : w; // create y iterators DestIterator yd = dest_ul + Diff2D(xstart, ystart); SrcIterator ys = src_ul + Diff2D(xstart, ystart); MaskIterator ym = mul + Diff2D(xstart, ystart); KSumType norm = ak(ki); int xx, yy; KernelIterator yk = ki + klr; for(yy=0; yy::zero()) { dest_acc.set(DestTraits::fromRealPromote((norm / ksum) * sum), xd); } } } } template inline void normalizedConvolveImage( triple src, pair mask, pair dest, tuple5 kernel) { normalizedConvolveImage(src.first, src.second, src.third, mask.first, mask.second, dest.first, dest.second, kernel.first, kernel.second, kernel.third, kernel.fourth, kernel.fifth); } /** \brief Deprecated name of 2-dimensional normalized convolution, i.e. convolution with a mask image. See \ref normalizedConvolveImage() for documentation. Declarations: pass arguments explicitly: \code namespace vigra { template void convolveImageWithMask(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, MaskIterator mul, MaskAccessor am, DestIterator dest_ul, DestAccessor dest_acc, KernelIterator ki, KernelAccessor ak, Diff2D kul, Diff2D klr, BorderTreatmentMode border); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void convolveImageWithMask(triple src, pair mask, pair dest, tuple5 kernel); } \endcode */ doxygen_overloaded_function(template <...> void convolveImageWithMask) template inline void convolveImageWithMask(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc, MaskIterator mul, MaskAccessor am, DestIterator dest_ul, DestAccessor dest_acc, KernelIterator ki, KernelAccessor ak, Diff2D kul, Diff2D klr, BorderTreatmentMode border) { normalizedConvolveImage(src_ul, src_lr, src_acc, mul, am, dest_ul, dest_acc, ki, ak, kul, klr, border); } template inline void convolveImageWithMask( triple src, pair mask, pair dest, tuple5 kernel) { normalizedConvolveImage(src.first, src.second, src.third, mask.first, mask.second, dest.first, dest.second, kernel.first, kernel.second, kernel.third, kernel.fourth, kernel.fifth); } //@} /********************************************************/ /* */ /* Kernel2D */ /* */ /********************************************************/ /** \brief Generic 2 dimensional convolution kernel. This kernel may be used for convolution of 2 dimensional signals. Convolution functions access the kernel via an ImageIterator which they get by calling \ref center(). This iterator points to the center of the kernel. The kernel's size is given by its upperLeft() (upperLeft().x <= 0, upperLeft().y <= 0) and lowerRight() (lowerRight().x >= 0, lowerRight().y >= 0) methods. The desired border treatment mode is returned by borderTreatment(). (Note that the \ref StandardConvolution "2D convolution functions" don't currently support all modes.) The different init functions create a kernel with the specified properties. The requirements for the kernel's value_type depend on the init function used. At least NumericTraits must be defined. The kernel defines a factory function kernel2d() to create an argument object (see \ref KernelArgumentObjectFactories). Usage: \#include \<vigra/stdconvolution.hxx\>
Namespace: vigra \code vigra::FImage src(w,h), dest(w,h); ... // define horizontal Sobel filter vigra::Kernel2D sobel; sobel.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = // upper left and lower right 0.125, 0.0, -0.125, 0.25, 0.0, -0.25, 0.125, 0.0, -0.125; vigra::convolveImage(srcImageRange(src), destImage(dest), kernel2d(sobel)); \endcode Required Interface: \code value_type v = NumericTraits::one(); \endcode See also the init functions. */ template class Kernel2D { public: /** the kernel's value type */ typedef ARITHTYPE value_type; /** 2D random access iterator over the kernel's values */ typedef typename BasicImage::traverser Iterator; /** const 2D random access iterator over the kernel's values */ typedef typename BasicImage::const_traverser ConstIterator; /** the kernel's accessor */ typedef typename BasicImage::Accessor Accessor; /** the kernel's const accessor */ typedef typename BasicImage::ConstAccessor ConstAccessor; struct InitProxy { typedef typename BasicImage::ScanOrderIterator Iterator; InitProxy(Iterator i, int count, value_type & norm) : iter_(i), base_(i), count_(count), sum_(count), norm_(norm) {} ~InitProxy() { vigra_precondition(count_ == 1 || count_ == sum_, "Kernel2D::initExplicitly(): " "Too few init values."); } InitProxy & operator,(value_type const & v) { if(count_ == sum_) norm_ = *iter_; --count_; vigra_precondition(count_ > 0, "Kernel2D::initExplicitly(): " "Too many init values."); norm_ += v; ++iter_; *iter_ = v; return *this; } Iterator iter_, base_; int count_, sum_; value_type & norm_; }; static value_type one() { return NumericTraits::one(); } /** Default constructor. Creates a kernel of size 1x1 which would copy the signal unchanged. */ Kernel2D() : kernel_(1, 1, one()), left_(0, 0), right_(0, 0), norm_(one()), border_treatment_(BORDER_TREATMENT_CLIP) {} /** Copy constructor. */ Kernel2D(Kernel2D const & k) : kernel_(k.kernel_), left_(k.left_), right_(k.right_), norm_(k.norm_), border_treatment_(k.border_treatment_) {} /** Copy assignment. */ Kernel2D & operator=(Kernel2D const & k) { if(this != &k) { kernel_ = k.kernel_; left_ = k.left_; right_ = k.right_; norm_ = k.norm_; border_treatment_ = k.border_treatment_; } return *this; } /** Initialization. This initializes the kernel with the given constant. The norm becomes v*width()*height(). Instead of a single value an initializer list of length width()*height() can be used like this: \code vigra::Kernel2D binom; binom.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = 0.0625, 0.125, 0.0625, 0.125, 0.25, 0.125, 0.0625, 0.125, 0.0625; \endcode In this case, the norm will be set to the sum of the init values. An initializer list of wrong length will result in a run-time error. */ InitProxy operator=(value_type const & v) { int size = (right_.x - left_.x + 1) * (right_.y - left_.y + 1); kernel_ = v; norm_ = (double)size*v; return InitProxy(kernel_.begin(), size, norm_); } /** Destructor. */ ~Kernel2D() {} /** Init the 2D kernel as the cartesian product of two 1D kernels of type \ref Kernel1D. The norm becomes the product of the two original norms. Required Interface: The kernel's value_type must be a linear algebra. \code vigra::Kernel2D<...>::value_type v; v = v * v; \endcode */ void initSeparable(Kernel1D & kx, Kernel1D & ky) { left_ = Diff2D(kx.left(), ky.left()); right_ = Diff2D(kx.right(), ky.right()); int w = right_.x - left_.x + 1; int h = right_.y - left_.y + 1; kernel_.resize(w, h); norm_ = kx.norm() * ky.norm(); typedef typename Kernel1D::Iterator KIter; typename Kernel1D::Accessor ka; KIter kiy = ky.center() + left_.y; Iterator iy = center() + left_; for(int y=left_.y; y<=right_.y; ++y, ++kiy, ++iy.y) { KIter kix = kx.center() + left_.x; Iterator ix = iy; for(int x=left_.x; x<=right_.x; ++x, ++kix, ++ix.x) { *ix = ka(kix) * ka(kiy); } } } /** Init the 2D kernel as the cartesian product of two 1D kernels given explicitly by iterators and sizes. The norm becomes the sum of the resulting kernel values. Required Interface: The kernel's value_type must be a linear algebra. \code vigra::Kernel2D<...>::value_type v; v = v * v; v += v; \endcode Preconditions: \code xleft <= 0; xright >= 0; yleft <= 0; yright >= 0; \endcode */ template void initSeparable(KernelIterator kxcenter, int xleft, int xright, KernelIterator kycenter, int yleft, int yright) { vigra_precondition(xleft <= 0 && yleft <= 0, "Kernel2D::initSeparable(): left borders must be <= 0."); vigra_precondition(xright >= 0 && yright >= 0, "Kernel2D::initSeparable(): right borders must be >= 0."); left_ = Point2D(xleft, yleft); right_ = Point2D(xright, yright); int w = right_.x - left_.x + 1; int h = right_.y - left_.y + 1; kernel_.resize(w, h); KernelIterator kiy = kycenter + left_.y; Iterator iy = center() + left_; for(int y=left_.y; y<=right_.y; ++y, ++kiy, ++iy.y) { KernelIterator kix = kxcenter + left_.x; Iterator ix = iy; for(int x=left_.x; x<=right_.x; ++x, ++kix, ++ix.x) { *ix = *kix * *kiy; } } typename BasicImage::iterator i = kernel_.begin(); typename BasicImage::iterator iend = kernel_.end(); norm_ = *i; ++i; for(; i!= iend; ++i) { norm_ += *i; } } /** Init the 2D kernel as a circular averaging filter. The norm will be calculated as NumericTraits::one() / (number of non-zero kernel values). The kernel's value_type must be a linear space. Required Interface: \code value_type v = vigra::NumericTraits::one(); double d; v = d * v; \endcode Precondition: \code radius > 0; \endcode */ void initDisk(int radius) { vigra_precondition(radius > 0, "Kernel2D::initDisk(): radius must be > 0."); left_ = Point2D(-radius, -radius); right_ = Point2D(radius, radius); int w = right_.x - left_.x + 1; int h = right_.y - left_.y + 1; kernel_.resize(w, h); norm_ = NumericTraits::one(); kernel_ = NumericTraits::zero(); double count = 0.0; Iterator k = center(); double r2 = (double)radius*radius; int i; for(i=0; i<= radius; ++i) { double r = (double) i - 0.5; int w = (int)(VIGRA_CSTD::sqrt(r2 - r*r) + 0.5); for(int j=-w; j<=w; ++j) { k(j, i) = NumericTraits::one(); k(j, -i) = NumericTraits::one(); count += (i != 0) ? 2.0 : 1.0; } } count = 1.0 / count; for(int y=-radius; y<=radius; ++y) { for(int x=-radius; x<=radius; ++x) { k(x,y) = count * k(x,y); } } } /** Init the kernel by an explicit initializer list. The upper left and lower right corners of the kernel must be passed. A comma-separated initializer list is given after the assignment operator. This function is used like this: \code // define horizontal Sobel filter vigra::Kernel2D sobel; sobel.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = 0.125, 0.0, -0.125, 0.25, 0.0, -0.25, 0.125, 0.0, -0.125; \endcode The norm is set to the sum of the initialzer values. If the wrong number of values is given, a run-time error results. It is, however, possible to give just one initializer. This creates an averaging filter with the given constant: \code vigra::Kernel2D average3x3; average3x3.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = 1.0/9.0; \endcode Here, the norm is set to value*width()*height(). Preconditions: \code 1. upperleft.x <= 0; 2. upperleft.y <= 0; 3. lowerright.x >= 0; 4. lowerright.y >= 0; 5. the number of values in the initializer list is 1 or equals the size of the kernel. \endcode */ Kernel2D & initExplicitly(Diff2D upperleft, Diff2D lowerright) { vigra_precondition(upperleft.x <= 0 && upperleft.y <= 0, "Kernel2D::initExplicitly(): left borders must be <= 0."); vigra_precondition(lowerright.x >= 0 && lowerright.y >= 0, "Kernel2D::initExplicitly(): right borders must be >= 0."); left_ = Point2D(upperleft); right_ = Point2D(lowerright); int w = right_.x - left_.x + 1; int h = right_.y - left_.y + 1; kernel_.resize(w, h); return *this; } /** Coordinates of the upper left corner of the kernel. */ Point2D upperLeft() const { return left_; } /** Coordinates of the lower right corner of the kernel. */ Point2D lowerRight() const { return right_; } /** Width of the kernel. */ int width() const { return right_.x - left_.x + 1; } /** Height of the kernel. */ int height() const { return right_.y - left_.y + 1; } /** ImageIterator that points to the center of the kernel (coordinate (0,0)). */ Iterator center() { return kernel_.upperLeft() - left_; } /** ImageIterator that points to the center of the kernel (coordinate (0,0)). */ ConstIterator center() const { return kernel_.upperLeft() - left_; } /** Access kernel entry at given position. */ value_type & operator()(int x, int y) { return kernel_[Diff2D(x,y) - left_]; } /** Read kernel entry at given position. */ value_type operator()(int x, int y) const { return kernel_[Diff2D(x,y) - left_]; } /** Access kernel entry at given position. */ value_type & operator[](Diff2D const & d) { return kernel_[d - left_]; } /** Read kernel entry at given position. */ value_type operator[](Diff2D const & d) const { return kernel_[d - left_]; } /** Norm of the kernel (i.e. sum of its elements). */ value_type norm() const { return norm_; } /** The kernels default accessor. */ Accessor accessor() { return Accessor(); } /** The kernels default const accessor. */ ConstAccessor accessor() const { return ConstAccessor(); } /** Normalize the kernel to the given value. (The norm is the sum of all kernel elements.) The kernel's value_type must be a division algebra or algebraic field. Required Interface: \code value_type v = vigra::NumericTraits::one(); // if norm is not // given explicitly v += v; v = v * v; v = v / v; \endcode */ void normalize(value_type norm) { typename BasicImage::iterator i = kernel_.begin(); typename BasicImage::iterator iend = kernel_.end(); typename NumericTraits::RealPromote sum = *i; ++i; for(; i!= iend; ++i) { sum += *i; } sum = norm / sum; i = kernel_.begin(); for(; i != iend; ++i) { *i = *i * sum; } norm_ = norm; } /** Normalize the kernel to norm 1. */ void normalize() { normalize(one()); } /** current border treatment mode */ BorderTreatmentMode borderTreatment() const { return border_treatment_; } /** Set border treatment mode. Only BORDER_TREATMENT_CLIP and BORDER_TREATMENT_AVOID are currently allowed. */ void setBorderTreatment( BorderTreatmentMode new_mode) { vigra_precondition((new_mode == BORDER_TREATMENT_CLIP || new_mode == BORDER_TREATMENT_AVOID || new_mode == BORDER_TREATMENT_REFLECT || new_mode == BORDER_TREATMENT_REPEAT || new_mode == BORDER_TREATMENT_WRAP), "convolveImage():\n" " Border treatment must be one of follow treatments:\n" " - BORDER_TREATMENT_CLIP\n" " - BORDER_TREATMENT_AVOID\n" " - BORDER_TREATMENT_REFLECT\n" " - BORDER_TREATMENT_REPEAT\n" " - BORDER_TREATMENT_WRAP\n"); border_treatment_ = new_mode; } private: BasicImage kernel_; Point2D left_, right_; value_type norm_; BorderTreatmentMode border_treatment_; }; /**************************************************************/ /* */ /* Argument object factories for Kernel2D */ /* */ /* (documentation: see vigra/convolution.hxx) */ /* */ /**************************************************************/ template inline tuple5 kernel2d(KernelIterator ik, KernelAccessor ak, Diff2D kul, Diff2D klr, BorderTreatmentMode border) { return tuple5 ( ik, ak, kul, klr, border); } template inline tuple5::ConstIterator, typename Kernel2D::ConstAccessor, Diff2D, Diff2D, BorderTreatmentMode> kernel2d(Kernel2D const & k) { return tuple5::ConstIterator, typename Kernel2D::ConstAccessor, Diff2D, Diff2D, BorderTreatmentMode>( k.center(), k.accessor(), k.upperLeft(), k.lowerRight(), k.borderTreatment()); } template inline tuple5::ConstIterator, typename Kernel2D::ConstAccessor, Diff2D, Diff2D, BorderTreatmentMode> kernel2d(Kernel2D const & k, BorderTreatmentMode border) { return tuple5::ConstIterator, typename Kernel2D::ConstAccessor, Diff2D, Diff2D, BorderTreatmentMode>( k.center(), k.accessor(), k.upperLeft(), k.lowerRight(), border); } } // namespace vigra #endif // VIGRA_STDCONVOLUTION_HXX gamera-3.3.3/include/vigra/stdimage.hxx0000644000076500000000000003441211261456425017035 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_STDIMAGE_HXX #define VIGRA_STDIMAGE_HXX #include "sized_int.hxx" #include "tuple.hxx" #include "basicimage.hxx" #include "iteratortraits.hxx" #include "accessor.hxx" #include "rgbvalue.hxx" namespace vigra { /** \addtogroup StandardImageTypes Standard Image Types \brief The most common instantiations of the \ref vigra::BasicImage template */ //@{ /** Byte (8-bit unsigned) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage BImage; /** Byte (8-bit unsigned) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage UInt8Image; /** Signed byte (8-bit signed) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage Int8Image; /** Short integer (16-bit signed) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage SImage; /** Short integer (16-bit unsigned) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage UInt16Image; /** Short integer (16-bit signed) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage Int16Image; /** Integer (32-bit signed) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage IImage; /** Integer (32-bit unsigned) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage UInt32Image; /** Integer (32-bit signed) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage Int32Image; /** Float (float) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage FImage; /** Double (double) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage DImage; /** Byte (3x 8-bit unsigned) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > BRGBImage; /** Byte (3x 8-bit unsigned) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > UInt8RGBImage; /** Byte (3x 8-bit signed) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > Int8RGBImage; /** Short (3x 16-bit signed) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > SRGBImage; /** Short (3x 16-bit unsigned) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > UInt16RGBImage; /** Short (3x 16-bit signed) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > Int16RGBImage; /** Integer (3x 32-bit signed) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > IRGBImage; /** Integer (3x 32-bit unsigned) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > UInt32RGBImage; /** Integer (3x 32-bit signed) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > Int32RGBImage; /** Floating-point (3x float) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > FRGBImage; /** Double-precision floating-point (3x double) RGB image. The pixel type is \ref vigra::RGBValue "vigra::RGBValue". It uses \ref vigra::BasicImageIterator and \ref vigra::RGBAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > DRGBImage; /** Floating-point TinyVector image. The pixel type is \ref vigra::TinyVector "vigra::TinyVector". It uses \ref vigra::BasicImageIterator and \ref vigra::VectorAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > FVector2Image; /** Floating-point TinyVector image. The pixel type is \ref vigra::TinyVector "vigra::TinyVector". It uses \ref vigra::BasicImageIterator and \ref vigra::VectorAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > FVector3Image; /** Floating-point TinyVector image. The pixel type is \ref vigra::TinyVector "vigra::TinyVector". It uses \ref vigra::BasicImageIterator and \ref vigra::VectorAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > FVector4Image; /** Floating-point TinyVector image. The pixel type is \ref vigra::TinyVector "vigra::TinyVector". It uses \ref vigra::BasicImageIterator and \ref vigra::VectorAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > DVector2Image; /** Floating-point TinyVector image. The pixel type is \ref vigra::TinyVector "vigra::TinyVector". It uses \ref vigra::BasicImageIterator and \ref vigra::VectorAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ //typedef BasicImage > DVector3Image; typedef BasicImage > DVector3Image; /** Floating-point TinyVector image. The pixel type is \ref vigra::TinyVector "vigra::TinyVector". It uses \ref vigra::BasicImageIterator and \ref vigra::VectorAccessor and their const counterparts to access the data. \#include \<vigra/stdimage.hxx\>
Namespace: vigra */ typedef BasicImage > DVector4Image; //@} } // namespace vigra #endif // VIGRA_STDIMAGE_HXX gamera-3.3.3/include/vigra/stdimagefunctions.hxx0000644000076500000000000001037411261456425020767 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_STDIMAGEFUNCTIONS_HXX #define VIGRA_STDIMAGEFUNCTIONS_HXX /** \page PointOperators Point Operators
  • \ref InitAlgo
        init images or image borders
  • \ref InspectAlgo
        Apply read-only functor to every pixel
  • \ref InspectFunctor
        Functors which report image statistics
  • \ref CopyAlgo
        Copy images or regions
  • \ref TransformAlgo
        apply functor to calculate a pixelwise transformation of one image
  • \ref TransformFunctor
        frequently used unary transformation functors
  • \ref CombineAlgo
        apply functor to calculate a pixelwise transformation from several image
  • \ref CombineFunctor
        frequently used binary transformations functors
  • \ref MultiPointoperators
        Point operators on multi-dimensional arrays
\#include \<vigra/stdimagefunctions.hxx\>
Namespace: vigra see also: \ref FunctorExpressions "Automatic Functor Creation" */ #include "initimage.hxx" #include "inspectimage.hxx" #include "copyimage.hxx" #include "transformimage.hxx" #include "combineimages.hxx" #include "resizeimage.hxx" #endif // VIGRA_STDIMAGEFUNCTIONS_HXX gamera-3.3.3/include/vigra/symmetry.hxx0000644000076500000000000002276611261456425017142 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_SYMMETRY_HXX #define VIGRA_SYMMETRY_HXX #include "utilities.hxx" #include "numerictraits.hxx" #include "stdimage.hxx" #include "convolution.hxx" namespace vigra { /** \addtogroup SymmetryDetection Symmetry Detection Measure the local symmetry at each pixel. */ //@{ /********************************************************/ /* */ /* radialSymmetryTransform */ /* */ /********************************************************/ /** \brief Find centers of radial symmetry in an image. This algorithm implements the Fast Radial Symmetry Transform according to [G. Loy, A. Zelinsky: "A Fast Radial Symmetry Transform for Detecting Points of Interest", in: A. Heyden et al. (Eds.): Proc. of 7th European Conf. on Computer Vision, Part 1, pp. 358-368, Springer LNCS 2350, 2002]. Minima of the algorithm response mark dark blobs, maxima correspond to light blobs. The "radial strictness parameter" is fixed at alpha = 2.0, the spatial spreading of the raw response is done by a Gaussian convolution at 0.25*scale (these values are recommendations from the paper). Loy and Zelinsky additionally propose to add the operator response from several scales (see usage example below). Declarations: pass arguments explicitly: \code namespace vigra { template void radialSymmetryTransform(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template inline void radialSymmetryTransform( triple src, pair dest, double scale) } \endcode Usage: \#include \<vigra/symmetry.hxx\>
Namespace: vigra \code vigra::BImage src(w,h), centers(w,h); vigra::FImage symmetry(w,h); // empty result image centers.init(128); symmetry.init(0.0); // input width of edge detection filter for(double scale = 2.0; scale <= 8.0; scale *= 2.0) { vigra::FImage tmp(w,h); // find centers of symmetry radialSymmetryTransform(srcImageRange(src), destImage(tmp), scale); combineTwoImages(srcImageRange(symmetry), srcImage(tmp), destImage(symmetry), std::plus()); } localMinima(srcImageRange(symmetry), destImage(centers), 0); localMaxima(srcImageRange(symmetry), destImage(centers), 255); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; // SrcAccessor::value_type must be a built-in type SrcAccessor::value_type u = src_accessor(src_upperleft); dest_accessor.set(u, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> void radialSymmetryTransform) template void radialSymmetryTransform(SrcIterator sul, SrcIterator slr, SrcAccessor as, DestIterator dul, DestAccessor ad, double scale) { vigra_precondition(scale > 0.0, "radialSymmetryTransform(): Scale must be > 0"); int w = slr.x - sul.x; int h = slr.y - sul.y; if(w <= 0 || h <= 0) return; typedef typename NumericTraits::RealPromote TmpType; typedef BasicImage TmpImage; typedef typename TmpImage::Iterator TmpIterator; TmpImage gx(w,h); TmpImage gy(w,h); IImage orientationCounter(w,h); TmpImage magnitudeAccumulator(w,h); gaussianGradient(srcIterRange(sul, slr, as), destImage(gx), destImage(gy), scale); orientationCounter.init(0); magnitudeAccumulator.init(NumericTraits::zero()); TmpIterator gxi = gx.upperLeft(); TmpIterator gyi = gy.upperLeft(); int y; for(y=0; y::epsilon()*10.0) continue; int dx = NumericTraits::fromRealPromote(scale * VIGRA_CSTD::cos(angle)); int dy = NumericTraits::fromRealPromote(scale * VIGRA_CSTD::sin(angle)); int xx = x + dx; int yy = y - dy; if(xx >= 0 && xx < w && yy >= 0 && yy < h) { orientationCounter(xx, yy) += 1; magnitudeAccumulator(xx, yy) += magnitude; } xx = x - dx; yy = y + dy; if(xx >= 0 && xx < w && yy >= 0 && yy < h) { orientationCounter(xx, yy) -= 1; magnitudeAccumulator(xx, yy) -= magnitude; } } } int maxOrientation = 0; TmpType maxMagnitude = NumericTraits::zero(); for(y=0; y maxOrientation) maxOrientation = o; TmpType m = VIGRA_CSTD::abs(magnitudeAccumulator(x,y)); if(m > maxMagnitude) maxMagnitude = m; } } for(y=0; y inline void radialSymmetryTransform( triple src, pair dest, double scale) { radialSymmetryTransform(src.first, src.second, src.third, dest.first, dest.second, scale); } //@} } // namespace vigra #endif /* VIGRA_SYMMETRY_HXX */ gamera-3.3.3/include/vigra/tensorutilities.hxx0000644000076500000000000004554511261456425020517 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2002-2004 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_TENSORUTILITIES_HXX #define VIGRA_TENSORUTILITIES_HXX #include #include "utilities.hxx" namespace vigra { /** \addtogroup TensorImaging Tensor Image Processing */ //@{ /********************************************************/ /* */ /* vectorToTensor */ /* */ /********************************************************/ /** \brief Calculate the tensor (outer) product of a 2D vector with itself. This function is useful to transform vector images into a tensor representation that can be used as input to tensor based processing and analysis functions (e.g. tensor smoothing). The imput pixel type must be vectors of length 2, whereas the output must contain vectors of length 3 which will represent the tensor components in the order t11, t12 (== t21 due to symmetry), t22. Note: By default, this function negates the second component of the vector in order to turn a left handed vector (the usual resul of convolution, e.g. a gradient filter, because y runs from top to bottom) into a right handed tensor (as is required by all tensor function in VIGRA). This behavior can be switched off by setting negateComponent2 = false. Declarations: pass arguments explicitly: \code namespace vigra { template void vectorToTensor(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, bool negateComponent2 = true); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void vectorToTensor(triple s, pair d, bool negateComponent2 = true); } \endcode Usage: \#include \<vigra/tensorutilities.hxx\> \code FImage img(w,h); FVector2Image gradient(w,h); FVector3Image tensor(w,h); gaussianGradient(srcImageRange(img), destImage(gradient), 2.0); vectorToTensor(srcImageRange(gradient), destImage(tensor)); \endcode */ doxygen_overloaded_function(template <...> void vectorToTensor) template void vectorToTensor(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest, bool negateComponent2) { vigra_precondition(src.size(sul) == 2, "vectorToTensor(): input image must have 2 bands."); vigra_precondition(dest.size(dul) == 3, "vectorToTensor(): output image must have 3 bands."); int w = slr.x - sul.x; int h = slr.y - sul.y; for(int y=0; y inline void vectorToTensor(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest) { vectorToTensor(sul, slr, src, dul, dest, true); } template inline void vectorToTensor(triple s, pair d, bool negateComponent2) { vectorToTensor(s.first, s.second, s.third, d.first, d.second, negateComponent2); } template inline void vectorToTensor(triple s, pair d) { vectorToTensor(s.first, s.second, s.third, d.first, d.second, true); } /********************************************************/ /* */ /* tensorEigenRepresentation */ /* */ /********************************************************/ /** \brief Calculate eigen representation of a symmetric 2x2 tensor. This function turns a 3-band image representing the tensor components t11, t12 (== t21 due to symmetry), t22 into the a 3-band image holding the eigen representation e1, e2, and angle, where e1 \> e2. The original tensor must be defined in a right-handed coordinate system, and the angle of the tensor will then be given in mathematical positive (counter-clockwise) orientation, starting at the x-axis. Declarations: pass arguments explicitly: \code namespace vigra { template void tensorEigenRepresentation(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void tensorEigenRepresentation(triple s, pair d); } \endcode Usage: \#include \<vigra/tensorutilities.hxx\> \code FVector3Image tensor(w,h); FVector3Image eigen(w,h); tensorEigenRepresentation(srcImageRange(tensor), destImage(eigen)); \endcode */ doxygen_overloaded_function(template <...> void tensorEigenRepresentation) template void tensorEigenRepresentation(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest) { vigra_precondition(src.size(sul) == 3, "tensorEigenRepresentation(): input image must have 3 bands."); vigra_precondition(dest.size(dul) == 3, "tensorEigenRepresentation(): output image must have 3 bands."); int w = slr.x - sul.x; int h = slr.y - sul.y; for(int y=0; y::RealPromote TmpType; TmpType d1 = src.getComponent(s,0) + src.getComponent(s,2); TmpType d2 = src.getComponent(s,0) - src.getComponent(s,2); TmpType d3 = 2.0 * src.getComponent(s,1); TmpType d4 = VIGRA_CSTD::sqrt(sq(d2) + sq(d3)); dest.setComponent(0.5 * (d1 + d4), d, 0); // large EV dest.setComponent(0.5 * (d1 - d4), d, 1); // small EV if(d2==0.0 && d3==0.0) { dest.setComponent(0, d, 2); // orientation } else { dest.setComponent(0.5 * VIGRA_CSTD::atan2(d3, d2), d, 2); // orientation } } } } template inline void tensorEigenRepresentation(triple s, pair d) { tensorEigenRepresentation(s.first, s.second, s.third, d.first, d.second); } /********************************************************/ /* */ /* tensorTrace */ /* */ /********************************************************/ /** \brief Calculate the trace of a 2x2 tensor. This function turns a 3-band image representing the tensor components t11, t12 (== t21 due to symmetry), t22 into the a 1-band image holding the tensor trace t11 + t22. Declarations: pass arguments explicitly: \code namespace vigra { template void tensorTrace(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void tensorTrace(triple s, pair d); } \endcode Usage: \#include \<vigra/tensorutilities.hxx\> \code FVector3Image tensor(w,h); FImage trace(w,h); tensorTrace(srcImageRange(tensor), destImage(trace)); \endcode */ doxygen_overloaded_function(template <...> void tensorTrace) template void tensorTrace(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator dul, DestAccessor dest) { vigra_precondition(src.size(sul) == 3, "tensorTrace(): input image must have 3 bands."); int w = slr.x - sul.x; int h = slr.y - sul.y; for(int y=0; y inline void tensorTrace(triple s, pair d) { tensorTrace(s.first, s.second, s.third, d.first, d.second); } /********************************************************/ /* */ /* tensorToEdgeCorner */ /* */ /********************************************************/ /** \brief Decompose a symmetric 2x2 tensor into its edge and corner parts. This function turns a 3-band image representing the tensor components t11, t12 (== t21 due to symmetry), t22 into the a 2-band image holding the tensor's edgeness (difference of the tensor's eigenvalues) and orientation, and a 1-band image representing its corner part (equal to the twice the small eigen value). The original tensor must be positive definite and defined in a right-handed coordinate system (e.g. the tensor resulting from \ref boundaryTensor()). Declarations: pass arguments explicitly: \code namespace vigra { template void tensorToEdgeCorner(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator1 edgeul, DestAccessor1 edge, DestIterator2 cornerul, DestAccessor2 corner); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void tensorToEdgeCorner(triple s, pair edge, pair corner); } \endcode Usage: \#include \<vigra/tensorutilities.hxx\> \code FVector3Image tensor(w,h); FVector2Image edgePart(w,h); FImage cornerPart(w,h); tensorTrace(srcImageRange(tensor), destImage(edgePart), destImage(cornerPart)); \endcode */ doxygen_overloaded_function(template <...> void tensorToEdgeCorner) template void tensorToEdgeCorner(SrcIterator sul, SrcIterator slr, SrcAccessor src, DestIterator1 edgeul, DestAccessor1 edge, DestIterator2 cornerul, DestAccessor2 corner) { vigra_precondition(src.size(sul) == 3, "tensorToEdgeCorner(): input image must have 3 bands."); vigra_precondition(edge.size(edgeul) == 2, "tensorToEdgeCorner(): edge image must have 2 bands."); int w = slr.x - sul.x; int h = slr.y - sul.y; for(int y=0; y::RealPromote TmpType; TmpType d1 = src.getComponent(s,0) + src.getComponent(s,2); TmpType d2 = src.getComponent(s,0) - src.getComponent(s,2); TmpType d3 = 2.0 * src.getComponent(s,1); TmpType d4 = VIGRA_CSTD::sqrt(sq(d2) + sq(d3)); edge.setComponent(d4, e, 0); // edgeness = difference of EVs if(d2 == 0.0 && d3 == 0.0) { edge.setComponent(0.0, e, 1); // orientation } else { edge.setComponent(0.5 * VIGRA_CSTD::atan2(d3, d2), e, 1); // orientation } corner.set(d1 - d4, c); // cornerness = 2 * small EV } } } template inline void tensorToEdgeCorner(triple s, pair edge, pair corner) { tensorToEdgeCorner(s.first, s.second, s.third, edge.first, edge.second, corner.first, corner.second); } //@} } // namespace vigra #endif /* VIGRA_TENSORUTILITIES_HXX */ gamera-3.3.3/include/vigra/tiff.hxx0000644000076500000000000016272611261456425016202 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_TIFF_HXX #define VIGRA_TIFF_HXX #include "utilities.hxx" #include "numerictraits.hxx" #include "rgbvalue.hxx" extern "C" { #include #include } namespace vigra { typedef TIFF TiffImage; /** \defgroup TIFFImpex Import/export of the TIFF format TIFF conversion and file export/import. Normally, you need not call the TIFF functions directly. They are available much more conveniently via \ref importImage() and \ref exportImage() TIFF (Tagged Image File Format) is a very versatile image format - one can store different pixel types (byte, integer, float, double) and color models (black and white, RGB, mapped RGB, other color systems). For more details and information on how to create a TIFF image, refer to the TIFF documentation at http://www.libtiff.org/ for details. */ //@{ /********************************************************/ /* */ /* importTiffImage */ /* */ /********************************************************/ /** \brief Convert given TiffImage into image specified by iterator range. Accessors are used to write the data. This function calls \ref tiffToScalarImage() or \ref tiffToRGBImage(), depending on the accessor's value_type. Declarations: pass arguments explicitly: \code namespace vigra { template void importTiffImage(TiffImage * tiff, ImageIterator iter, Accessor a) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void importTiffImage(TiffImage * tiff, pair dest) } \endcode Usage: \#include \<vigra/tiff.hxx\> \code uint32 w, h; TiffImage * tiff = TIFFOpen("tiffimage.tiff", "r"); TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &h); vigra::BImage img(w,h); vigra::importTiffImage(tiff, destImage(img)); TIFFClose(tiff); \endcode Required Interface: see \ref tiffToScalarImage() and \ref tiffToRGBImage() Preconditions: see \ref tiffToScalarImage() and \ref tiffToRGBImage() */ doxygen_overloaded_function(template <...> void importTiffImage) template inline void importTiffImage(TiffImage * tiff, ImageIterator iter, Accessor a) { typedef typename NumericTraits::isScalar isScalar; importTiffImage(tiff, iter, a, isScalar()); } template inline void importTiffImage(TiffImage * tiff, pair dest) { importTiffImage(tiff, dest.first, dest.second); } template inline void importTiffImage(TiffImage * tiff, ImageIterator iter, Accessor a, VigraTrueType) { tiffToScalarImage(tiff, iter, a); } template inline void importTiffImage(TiffImage * tiff, ImageIterator iter, Accessor a, VigraFalseType) { tiffToRGBImage(tiff, iter, a); } /********************************************************/ /* */ /* tiffToScalarImage */ /* */ /********************************************************/ /** \brief Convert single-band TiffImage to scalar image. This function uses accessors to write the data. Declarations: pass arguments explicitly: \code namespace vigra { template void tiffToScalarImage(TiffImage * tiff, ImageIterator iter, Accessor a) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void tiffToScalarImage(TiffImage * tiff, pair dest) } \endcode Usage: \#include \<vigra/tiff.hxx\> \code uint32 w, h; uint16 photometric TiffImage * tiff = TIFFOpen("tiffimage.tiff", "r"); TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(tiff_, TIFFTAG_PHOTOMETRIC, &photometric); if(photometric != PHOTOMETRIC_MINISWHITE && photometric != PHOTOMETRIC_MINISBLACK) { // not a scalar image - handle error } vigra::BImage img(w,h); vigra::tiffToScalarImage(tiff, destImage(img)); TIFFClose(tiff); \endcode Required Interface: \code ImageIterator upperleft; value; Accessor accessor; accessor.set(value, upperleft); \endcode Preconditions: ImageIterator must refer to a large enough image. \code uint16 sampleFormat, samplesPerPixel, bitsPerSample, photometric; TIFFGetField(tiff, TIFFTAG_SAMPLEFORMAT, &sampleFormat); TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel); TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitsPerSample); TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); sampleFormat != SAMPLEFORMAT_VOID samplesPerPixel == 1 photometric == PHOTOMETRIC_MINISWHITE || photometric == PHOTOMETRIC_MINISBLACK bitsPerSample == 1 || bitsPerSample == 8 || bitsPerSample == 16 || bitsPerSample == 32 || bitsPerSample == 64 \endcode */ doxygen_overloaded_function(template <...> void tiffToScalarImage) template void tiffToScalarImage(TiffImage * tiff, ImageIterator iter, Accessor a) { vigra_precondition(tiff != 0, "tiffToScalarImage(TiffImage *, ScalarImageIterator): " "NULL pointer to input data."); uint16 sampleFormat = 1, bitsPerSample, fillorder, samplesPerPixel, photometric; uint32 w,h; TIFFGetField(tiff, TIFFTAG_SAMPLEFORMAT, &sampleFormat); TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitsPerSample); TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel); TIFFGetField(tiff, TIFFTAG_FILLORDER, &fillorder); TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &h); vigra_precondition(photometric == PHOTOMETRIC_MINISWHITE || photometric == PHOTOMETRIC_MINISBLACK, "tiffToScalarImage(TiffImage *, ScalarImageIterator): " "Image isn't grayscale."); vigra_precondition(samplesPerPixel == 1, "tiffToScalarImage(TiffImage *, ScalarImageIterator): " "Image is multiband, not scalar."); vigra_precondition(sampleFormat != SAMPLEFORMAT_VOID, "tiffToScalarImage(TiffImage *, ScalarImageIterator): " "undefined pixeltype (SAMPLEFORMAT_VOID)."); ImageIterator yd(iter); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; int offset, scale, max, min; if(photometric == PHOTOMETRIC_MINISWHITE) { min = 255; max = 0; scale = -1; offset = 255; } else { scale = 1; offset = 0; min = 0; max = 255; } try{ switch(sampleFormat) { case SAMPLEFORMAT_UINT: { switch (bitsPerSample) { case 1: { for(unsigned int y=0; y> (7 - x%8)) & 1) ? max : min, xd); } else { a.set(((((uint8 *)buf)[x/8] >> (x%8)) & 1) ? max : min, xd); } } } break; } case 8: { for(unsigned int y=0; y> (7 - x%8)) & 1) ? max : min, xd); } else { a.set(((((int8 *)buf)[x/8] >> (x%8)) & 1) ? max : min, xd); } } } break; } case 8: { for(unsigned int y=0; y void tiffToScalarImage(TiffImage * tiff, pair dest) { tiffToScalarImage(tiff, dest.first, dest.second); } /********************************************************/ /* */ /* tiffToRGBImage */ /* */ /********************************************************/ /** \brief Convert RGB (3-band or color-mapped) TiffImage to RGB image. This function uses \ref RGBAccessor to write the data. A RGBImageIterator is an iterator which is associated with a RGBAccessor. Declarations: pass arguments explicitly: \code namespace vigra { template void tiffToRGBImage(TiffImage * tiff, RGBImageIterator iter, RGBAccessor a) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void tiffToRGBImage(TiffImage * tiff, pair dest) } \endcode Usage: \#include \<vigra/tiff.hxx\> \code uint32 w, h; uint16 photometric TiffImage * tiff = TIFFOpen("tiffimage.tiff", "r"); TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &h); TIFFGetField(tiff_, TIFFTAG_PHOTOMETRIC, &photometric); if(photometric != PHOTOMETRIC_RGB && photometric != PHOTOMETRIC_PALETTE) { // not an RGB image - handle error } vigra::BRGBImage img(w, h); vigra::tiffToRGBImage(tiff, destImage(img)); TIFFClose(tiff); \endcode Required Interface: \code ImageIterator upperleft; rvalue, gvalue, bvalue; RGBAccessor accessor; accessor.setRed(rvalue, upperleft); accessor.setGreen(gvalue, upperleft); accessor.setBlue(bvalue, upperleft); \endcode Preconditions: ImageIterator must refer to a large enough image. \code uint16 sampleFormat, samplesPerPixel, bitsPerSample, photometric; TIFFGetField(tiff, TIFFTAG_SAMPLEFORMAT, &sampleFormat); TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel); TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitsPerSample); TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); sampleFormat != SAMPLEFORMAT_VOID samplesPerPixel == 3 // unlass photometric == PHOTOMETRIC_PALETTE photometric == PHOTOMETRIC_RGB || photometric == PHOTOMETRIC_PALETTE bitsPerSample == 1 || bitsPerSample == 8 || bitsPerSample == 16 || bitsPerSample == 32 || bitsPerSample == 64 \endcode */ doxygen_overloaded_function(template <...> void tiffToRGBImage) template void tiffToRGBImage(TiffImage * tiff, RGBImageIterator iter, RGBAccessor a) { vigra_precondition(tiff != 0, "tiffToRGBImage(TiffImage *, RGBImageIterator): " "NULL pointer to input data."); uint16 sampleFormat = 1, bitsPerSample, samplesPerPixel, planarConfig, photometric; uint32 w,h; TIFFGetField(tiff, TIFFTAG_SAMPLEFORMAT, &sampleFormat); TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bitsPerSample); TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel); TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); TIFFGetField(tiff, TIFFTAG_PLANARCONFIG, &planarConfig); TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &h); vigra_precondition(photometric == PHOTOMETRIC_RGB || photometric == PHOTOMETRIC_PALETTE, "tiffToRGBImage(TiffImage *, RGBImageIterator): " "Image isn't RGB."); vigra_precondition(sampleFormat != SAMPLEFORMAT_VOID, "tiffToRGBImage(TiffImage *, RGBImageIterator): " "undefined pixeltype (SAMPLEFORMAT_VOID)."); RGBImageIterator yd(iter); switch (photometric) { case PHOTOMETRIC_PALETTE: { uint32 * raster = new uint32[w*h]; try { if (!TIFFReadRGBAImage(tiff, w, h, raster, 0)) { vigra_fail( "tiffToRGBImage(TiffImage *, RGBImageIterator): " "unable to read image data."); } for(unsigned int y=0; y void tiffToRGBImage(TiffImage * tiff, pair dest) { tiffToRGBImage(tiff, dest.first, dest.second); } template struct CreateTiffImage; /********************************************************/ /* */ /* createTiffImage */ /* */ /********************************************************/ /** \brief Create a TiffImage from the given iterator range. Type and size of the TiffImage are determined by the input image. Currently, the function can create scalar images and RGB images of type unsigned char, short, int, float, and double. This function uses accessors to read the data. Declarations: pass arguments explicitly: \code namespace vigra { template TiffImage * createTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template TiffImage * createTiffImage(triple src) } \endcode Usage: \#include \<vigra/tiff.hxx\> \code vigra::BImage img(width, height); ... TiffImage * tiff = TIFFOpen(("tiffimage.tiff", "w"); vigra::createTiffImage(srcImageRange(img), tiff); TIFFClose(tiff); // implicitly writes the image to the disk \endcode Required Interface: \code ImageIterator upperleft; Accessor accessor; accessor(upperleft); // result written into TiffImage \endcode */ doxygen_overloaded_function(template <...> void createTiffImage) template inline void createTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { CreateTiffImage:: exec(upperleft, lowerright, a, tiff); } template inline void createTiffImage(triple src, TiffImage * tiff) { createTiffImage(src.first, src.second, src.third, tiff); } /********************************************************/ /* */ /* createScalarTiffImage */ /* */ /********************************************************/ /** \brief Create a single-band TiffImage from the given scalar image. Type and size of the TiffImage are determined by the input image (may be one of unsigned char, short, int, float, or double). This function uses accessors to read the data. Declarations: pass arguments explicitly: \code namespace vigra { template TiffImage * createScalarTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template TiffImage * createScalarTiffImage(triple src) } \endcode Usage: \#include \<vigra/tiff.hxx\> \code vigra::BImage img(width, height); ... TiffImage * tiff = TIFFOpen(("tiffimage.tiff", "w"); vigra::createScalarTiffImage(srcImageRange(img), tiff); TIFFClose(tiff); // implicitly writes the image to the disk \endcode Required Interface: \code ImageIterator upperleft; Accessor accessor; accessor(upperleft); // result written into TiffImage \endcode */ doxygen_overloaded_function(template <...> void createScalarTiffImage) template inline void createScalarTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { CreateTiffImage:: exec(upperleft, lowerright, a, tiff); } template inline void createScalarTiffImage(triple src, TiffImage * tiff) { createScalarTiffImage(src.first, src.second, src.third, tiff); } template void createBScalarTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; ImageIterator ys(upperleft); try { for(int y=0; y void createShortScalarTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; ImageIterator ys(upperleft); try { for(int y=0; y void createIScalarTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 32); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; ImageIterator ys(upperleft); try { for(int y=0; y void createFScalarTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, sizeof(float)*8); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; ImageIterator ys(upperleft); try { for(int y=0; y void createDScalarTiffImage(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, sizeof(double)*8); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 1); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; ImageIterator ys(upperleft); try { for(int y=0; y struct CreateTiffImage { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createBScalarTiffImage(upperleft, lowerright, a, tiff); } }; template <> struct CreateTiffImage { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createShortScalarTiffImage(upperleft, lowerright, a, tiff); } }; template <> struct CreateTiffImage { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createIScalarTiffImage(upperleft, lowerright, a, tiff); } }; template <> struct CreateTiffImage { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createFScalarTiffImage(upperleft, lowerright, a, tiff); } }; template <> struct CreateTiffImage { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createDScalarTiffImage(upperleft, lowerright, a, tiff); } }; /********************************************************/ /* */ /* createRGBTiffImage */ /* */ /********************************************************/ /** \brief Create a 3-band TiffImage from the given RGB image. Type and size of the TiffImage are determined by the input image (may be one of unsigned char, int, float, or double). This function uses \ref RGBAccessor to read the data. A RGBImageIterator is an iterator that is associated with a RGBAccessor. Declarations: pass arguments explicitly: \code namespace vigra { template TiffImage * createRGBTiffImage(RGBImageIterator upperleft, RGBImageIterator lowerright, RGBAccessor a) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template TiffImage * createRGBTiffImage(triple src) } \endcode Usage: \#include \<vigra/tiff.hxx\> \code vigra::BRGBImage img(width, height); ... TiffImage * tiff = TIFFOpen(("tiffimage.tiff", "w"); vigra::createRGBTiffImage(srcImageRange(img), tiff); TIFFClose(tiff); // implicitly writes the image to the disk \endcode Required Interface: \code ImageIterator upperleft; RGBAccessor accessor; accessor.red(upperleft); // result written into TiffImage accessor.green(upperleft); // result written into TiffImage accessor.blue(upperleft); // result written into TiffImage \endcode */ doxygen_overloaded_function(template <...> void createRGBTiffImage) template inline void createRGBTiffImage(RGBImageIterator upperleft, RGBImageIterator lowerright, RGBAccessor a, TiffImage * tiff) { CreateTiffImage:: exec(upperleft, lowerright, a, tiff); } template inline void createRGBTiffImage(triple src, TiffImage * tiff) { createRGBTiffImage(src.first, src.second, src.third, tiff); } template void createBRGBTiffImage(RGBImageIterator upperleft, RGBImageIterator lowerright, RGBAccessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; RGBImageIterator ys(upperleft); try { for(int y=0; y void createShortRGBTiffImage(RGBImageIterator upperleft, RGBImageIterator lowerright, RGBAccessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; RGBImageIterator ys(upperleft); try { for(int y=0; y void createIRGBTiffImage(RGBImageIterator upperleft, RGBImageIterator lowerright, RGBAccessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 32); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; RGBImageIterator ys(upperleft); try { for(int y=0; y void createFRGBTiffImage(RGBImageIterator upperleft, RGBImageIterator lowerright, RGBAccessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, sizeof(float)*8); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; RGBImageIterator ys(upperleft); try { for(int y=0; y void createDRGBTiffImage(RGBImageIterator upperleft, RGBImageIterator lowerright, RGBAccessor a, TiffImage * tiff) { int w = lowerright.x - upperleft.x; int h = lowerright.y - upperleft.y; TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, sizeof(double)*8); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 3); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); int bufsize = TIFFScanlineSize(tiff); tdata_t * buf = new tdata_t[bufsize]; RGBImageIterator ys(upperleft); try { for(int y=0; y struct CreateTiffImage > { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createBRGBTiffImage(upperleft, lowerright, a, tiff); } }; template <> struct CreateTiffImage > { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createShortRGBTiffImage(upperleft, lowerright, a, tiff); } }; template <> struct CreateTiffImage > { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createIRGBTiffImage(upperleft, lowerright, a, tiff); } }; template <> struct CreateTiffImage > { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createFRGBTiffImage(upperleft, lowerright, a, tiff); } }; template <> struct CreateTiffImage > { template static void exec(ImageIterator upperleft, ImageIterator lowerright, Accessor a, TiffImage * tiff) { createDRGBTiffImage(upperleft, lowerright, a, tiff); } }; //@} } // namespace vigra #endif /* VIGRA_TIFF_HXX */ gamera-3.3.3/include/vigra/tinyvector.hxx0000644000076500000000000012117511261456425017451 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_TINYVECTOR_HXX #define VIGRA_TINYVECTOR_HXX #include // abs(double) #include // abs(int) #include // ostream #include "config.hxx" #include "error.hxx" #include "numerictraits.hxx" #include "mathutil.hxx" namespace vigra { using VIGRA_CSTD::abs; using VIGRA_CSTD::ceil; using VIGRA_CSTD::floor; template class TinyVectorBase; template inline typename TinyVectorBase::SquaredNormType squaredNorm(TinyVectorBase const & t); namespace detail { #define VIGRA_EXEC_LOOP(NAME, OPER) \ template \ static void NAME(T1 * left, T2 const * right) \ { \ for(int i=0; i \ static void NAME(T1 * left, T2 right) \ { \ for(int i=0; i struct ExecLoop { template static void assignCast(T1 * left, T2 const * right) { for(int i=0; i::cast(right[i]); } VIGRA_EXEC_LOOP(assign, =) VIGRA_EXEC_LOOP(add, +=) VIGRA_EXEC_LOOP(sub, -=) VIGRA_EXEC_LOOP(mul, *=) VIGRA_EXEC_LOOP(neg, = -) VIGRA_EXEC_LOOP(abs, = vigra::abs) VIGRA_EXEC_LOOP(floor, = vigra::floor) VIGRA_EXEC_LOOP(ceil, = vigra::ceil) VIGRA_EXEC_LOOP(fromPromote, = NumericTraits::fromPromote) VIGRA_EXEC_LOOP(fromRealPromote, = NumericTraits::fromRealPromote) VIGRA_EXEC_LOOP_SCALAR(assignScalar, =) VIGRA_EXEC_LOOP_SCALAR(mulScalar, *=) VIGRA_EXEC_LOOP_SCALAR(divScalar, /=) template static bool notEqual(T1 const * left, T2 const * right) { for(int i=0; i static typename NumericTraits::Promote dot(T const * d) { typename NumericTraits::Promote res(*d * *d); for(int i=1; i static typename PromoteTraits::Promote dot(T1 const * left, T2 const * right) { typename PromoteTraits::Promote res(*left * *right); for(int i=1; i static typename NormTraits::SquaredNormType squaredNorm(T const * d) { typename NormTraits::SquaredNormType res = vigra::squaredNorm(*d); for(int i=1; i struct UnrollDot { template static typename NumericTraits::Promote dot(T const * d) { return *d * *d + UnrollDot::dot(d+1); } template static typename PromoteTraits::Promote dot(T1 const * left, T2 const * right) { return *left * *right + UnrollDot::dot(left+1, right+1); } }; template <> struct UnrollDot<1> { template static typename NumericTraits::Promote dot(T const * d) { return *d * *d ; } template static typename PromoteTraits::Promote dot(T1 const * left, T2 const * right) { return *left * *right; } }; template struct UnrollSquaredNorm { template static typename NormTraits::SquaredNormType squaredNorm(T const * d) { return vigra::squaredNorm(*d) + UnrollSquaredNorm::squaredNorm(d+1); } }; template <> struct UnrollSquaredNorm<1> { template static typename NormTraits::SquaredNormType squaredNorm(T const * d) { return vigra::squaredNorm(*d); } }; #undef VIGRA_EXEC_LOOP #undef VIGRA_EXEC_LOOP_SCALAR #define VIGRA_UNROLL_LOOP(NAME, OPER) \ template \ static void NAME(T1 * left, T2 const * right) \ { \ (*left) OPER (*right); \ UnrollLoop::NAME(left+1, right+1); \ } #define VIGRA_UNROLL_LOOP_SCALAR(NAME, OPER) \ template \ static void NAME(T1 * left, T2 right) \ { \ (*left) OPER (right); \ UnrollLoop::NAME(left+1, right); \ } template struct UnrollLoop { template static void assignCast(T1 * left, T2 const * right) { *left = detail::RequiresExplicitCast::cast(*right); UnrollLoop::assignCast(left+1, right+1); } VIGRA_UNROLL_LOOP(assign, =) VIGRA_UNROLL_LOOP(add, +=) VIGRA_UNROLL_LOOP(sub, -=) VIGRA_UNROLL_LOOP(mul, *=) VIGRA_UNROLL_LOOP(neg, = -) VIGRA_UNROLL_LOOP(abs, = vigra::abs) VIGRA_UNROLL_LOOP(floor, = vigra::floor) VIGRA_UNROLL_LOOP(ceil, = vigra::ceil) VIGRA_UNROLL_LOOP(fromPromote, = NumericTraits::fromPromote) VIGRA_UNROLL_LOOP(fromRealPromote, = NumericTraits::fromRealPromote) VIGRA_UNROLL_LOOP_SCALAR(assignScalar, =) VIGRA_UNROLL_LOOP_SCALAR(mulScalar, *=) VIGRA_UNROLL_LOOP_SCALAR(divScalar, /=) template static bool notEqual(T1 const * left, T2 const * right) { return (*left != *right) || UnrollLoop::notEqual(left+1, right+1); } template static typename NumericTraits::Promote dot(T const * d) { return UnrollDot::dot(d); } template static typename PromoteTraits::Promote dot(T1 const * left, T2 const * right) { return UnrollDot::dot(left, right); } template static typename NormTraits::SquaredNormType squaredNorm(T const * d) { return UnrollSquaredNorm::squaredNorm(d); } }; #undef VIGRA_UNROLL_LOOP #undef VIGRA_UNROLL_LOOP_SCALAR template <> struct UnrollLoop<0> { template static void assignCast(T1, T2) {} template static void assign(T1, T2) {} template static void assignScalar(T1, T2) {} template static void add(T1, T2) {} template static void sub(T1, T2) {} template static void mul(T1, T2) {} template static void mulScalar(T1, T2) {} template static void div(T1, T2) {} template static void divScalar(T1, T2) {} template static void fromPromote(T1, T2) {} template static void fromRealPromote(T1, T2) {} template static void neg(T1, T2) {} template static void abs(T1, T2) {} template static void floor(T1, T2) {} template static void ceil(T1, T2) {} template static bool notEqual(T1, T2) { return false; } }; template struct TinyVectorIf { template struct res { typedef T type; }; }; template <> struct TinyVectorIf { template struct res { typedef F type; }; }; template struct LoopType { typedef typename TinyVectorIf:: template res, ExecLoop >::type type; }; struct DontInit {}; inline DontInit dontInit() {return DontInit(); } } // namespace detail template class TinyVector; template class TinyVectorView; /********************************************************/ /* */ /* TinyVectorBase */ /* */ /********************************************************/ /** \brief Base class for fixed size vectors. This class contains functionality shared by \ref TinyVector and \ref TinyVectorView, and enables these classes to be freely mixed within expressions. It is typically not used directly. \#include \<vigra/tinyvector.hxx\>
Namespace: vigra **/ template class TinyVectorBase { TinyVectorBase(TinyVectorBase const &); // do not use TinyVectorBase & operator=(TinyVectorBase const & other); // do not use protected: typedef typename detail::LoopType::type Loop; TinyVectorBase() {} public: /** STL-compatible definition of valuetype */ typedef VALUETYPE value_type; /** reference (return of operator[]). */ typedef VALUETYPE & reference; /** const reference (return of operator[] const). */ typedef VALUETYPE const & const_reference; /** pointer (return of operator->). */ typedef VALUETYPE * pointer; /** const pointer (return of operator-> const). */ typedef VALUETYPE const * const_pointer; /** STL-compatible definition of iterator */ typedef value_type * iterator; /** STL-compatible definition of const iterator */ typedef value_type const * const_iterator; /** STL-compatible definition of size_type */ typedef unsigned int size_type; /** STL-compatible definition of difference_type */ typedef int difference_type; /** the scalar type for the outer product */ typedef double scalar_multiplier; /** the vector's squared norm type */ typedef typename NormTraits::SquaredNormType SquaredNormType; /** the vector's norm type */ typedef typename SquareRootTraits::SquareRootResult NormType; /** the vector's size */ enum { static_size = SIZE }; /** Initialize from another sequence (must have length SIZE!) */ template void init(Iterator i, Iterator end) { vigra_precondition(end-i == SIZE, "TinyVector::init(): Sequence has wrong size."); Loop::assignCast(data_, i); } /** Component-wise add-assignment */ template DERIVED & operator+=(TinyVectorBase const & r) { Loop::add(data_, r.begin()); return static_cast(*this); } /** Component-wise subtract-assignment */ template DERIVED & operator-=(TinyVectorBase const & r) { Loop::sub(data_, r.begin()); return static_cast(*this); } /** Component-wise multiply-assignment */ template DERIVED & operator*=(TinyVectorBase const & r) { Loop::mul(data_, r.begin()); return static_cast(*this); } /** Component-wise scalar multiply-assignment */ DERIVED & operator*=(double r) { Loop::mulScalar(data_, r); return static_cast(*this); } /** Component-wise scalar divide-assignment */ DERIVED & operator/=(double r) { Loop::divScalar(data_, r); return static_cast(*this); } /** Calculate magnitude. */ NormType magnitude() const { return sqrt(static_cast::SquareRootArgument>(squaredMagnitude())); } /** Calculate squared magnitude. */ SquaredNormType squaredMagnitude() const { return Loop::squaredNorm(data_); } /** Access component by index. */ reference operator[](difference_type i) { return data_[i]; } /** Get component by index. */ const_reference operator[](difference_type i) const { return data_[i]; } /** Get random access iterator to begin of vector. */ iterator begin() { return data_; } /** Get random access iterator past-the-end of vector. */ iterator end() { return data_ + SIZE; } /** Get const random access iterator to begin of vector. */ const_iterator begin() const { return data_; } /** Get const random access iterator past-the-end of vector. */ const_iterator end() const { return data_ + SIZE; } /** Size of TinyVector vector always equals the template parameter SIZE. */ size_type size() const { return SIZE; } pointer data() { return data_; } const_pointer data() const { return data_; } protected: DATA data_; }; /** \brief Class for fixed size vectors. This class contains an array of size SIZE of the specified VALUETYPE. The interface conforms to STL vector, except that there are no functions that change the size of a TinyVector. \ref TinyVectorOperators "Arithmetic operations" on TinyVectors are defined as component-wise applications of these operations. Addition and subtraction of two TinyVectors (+=, -=, +, -, unary -), multiplication and division of an TinyVector with a double, and NumericTraits/PromoteTraits are defined, so that TinyVector fulfills the requirements of \ref LinearAlgebraConcept "Linear Algebra". VIGRA algorithms typically use \ref vigra::VectorAccessor to access TinyVectors as a whole, or specific components of them. See also:
  • \ref vigra::TinyVectorBase
  • \ref vigra::TinyVectorView
  • \ref TinyVectorTraits
  • \ref TinyVectorOperators
\#include \<vigra/tinyvector.hxx\>
Namespace: vigra **/ template class TinyVector : public TinyVectorBase > { typedef TinyVectorBase > BaseType; typedef typename BaseType::Loop Loop; public: typedef typename BaseType::value_type value_type; typedef typename BaseType::reference reference; typedef typename BaseType::const_reference const_reference; typedef typename BaseType::pointer pointer; typedef typename BaseType::const_pointer const_pointer; typedef typename BaseType::iterator iterator; typedef typename BaseType::const_iterator const_iterator; typedef typename BaseType::size_type size_type; typedef typename BaseType::difference_type difference_type; typedef typename BaseType::scalar_multiplier scalar_multiplier; typedef typename BaseType::SquaredNormType SquaredNormType; typedef typename BaseType::NormType NormType; /** Construction with constant value */ explicit TinyVector(value_type const & initial) : BaseType() { Loop::assignScalar(BaseType::begin(), initial); } /** Construction with explicit values. Call only if SIZE == 2 */ TinyVector(value_type const & i1, value_type const & i2) : BaseType() { BaseType::data_[0] = i1; BaseType::data_[1] = i2; } /** Construction with explicit values. Call only if SIZE == 3 */ TinyVector(value_type const & i1, value_type const & i2, value_type const & i3) : BaseType() { BaseType::data_[0] = i1; BaseType::data_[1] = i2; BaseType::data_[2] = i3; } /** Construction with explicit values. Call only if SIZE == 4 */ TinyVector(value_type const & i1, value_type const & i2, value_type const & i3, value_type const & i4) : BaseType() { BaseType::data_[0] = i1; BaseType::data_[1] = i2; BaseType::data_[2] = i3; BaseType::data_[3] = i4; } /** Default constructor (initializes all components with zero) */ TinyVector() : BaseType() { Loop::assignScalar(BaseType::data_, NumericTraits::zero()); } /** Copy constructor. */ TinyVector(TinyVector const & r) : BaseType() { Loop::assign(BaseType::data_, r.data_); } /** Constructor from C array. */ explicit TinyVector(const_pointer data) : BaseType() { Loop::assign(BaseType::data_, data); } /** Copy assignment. */ TinyVector & operator=(TinyVector const & r) { Loop::assign(BaseType::data_, r.data_); return *this; } /** Copy with type conversion. */ template TinyVector(TinyVectorBase const & r) : BaseType() { Loop::assignCast(BaseType::data_, r.begin()); } /** Copy assignment with type conversion. */ template TinyVector & operator=(TinyVectorBase const & r) { Loop::assignCast(BaseType::data_, r.begin()); return *this; } explicit TinyVector(detail::DontInit) : BaseType() {} }; /** \brief Wrapper for fixed size vectors. This class wraps an array of size SIZE of the specified VALUETYPE. Thus, the array can be accessed with an interface similar to that of std::vector (except that there are no functions that change the size of a TinyVectorView). The TinyVectorView does not assume ownership of the given memory. \ref TinyVectorOperators "Arithmetic operations" on TinyVectorViews are defined as component-wise applications of these operations. Addition and subtraction of two TinyVectorViews (+=, -=, +, -, unary -), multiplication and division of an TinyVectorViews with a double, and NumericTraits/PromoteTraits are defined, so that TinyVectorView fulfills the requirements of \ref LinearAlgebraConcept "Linear Algebra". VIGRA algorithms typically use \ref vigra::VectorAccessor to access TinyVectorViews as a whole, or specific components of them. See also:
  • \ref vigra::TinyVectorBase
  • \ref vigra::TinyVector
  • \ref TinyVectorTraits
  • \ref TinyVectorOperators
\#include \<vigra/tinyvector.hxx\>
Namespace: vigra **/ template class TinyVectorView : public TinyVectorBase > { typedef TinyVectorBase > BaseType; typedef typename BaseType::Loop Loop; public: typedef typename BaseType::value_type value_type; typedef typename BaseType::reference reference; typedef typename BaseType::const_reference const_reference; typedef typename BaseType::pointer pointer; typedef typename BaseType::const_pointer const_pointer; typedef typename BaseType::iterator iterator; typedef typename BaseType::const_iterator const_iterator; typedef typename BaseType::size_type size_type; typedef typename BaseType::difference_type difference_type; typedef typename BaseType::scalar_multiplier scalar_multiplier; typedef typename BaseType::SquaredNormType SquaredNormType; typedef typename BaseType::NormType NormType; /** Default constructor (pointer to wrapped data is NULL). */ TinyVectorView() : BaseType() { BaseType::data_ = 0; } /** Construct view for given data array */ TinyVectorView(const_pointer data) : BaseType() { BaseType::data_ = const_cast(data); } /** Copy constructor (shallow copy). */ TinyVectorView(TinyVectorView const & other) : BaseType() { BaseType::data_ = const_cast(other.data_); } /** Construct view from other TinyVector. */ template TinyVectorView(TinyVectorBase const & other) : BaseType() { BaseType::data_ = const_cast(other.data()); } /** Copy the data (not the pointer) of the rhs. */ TinyVectorView & operator=(TinyVectorView const & r) { Loop::assign(BaseType::data_, r.begin()); return *this; } /** Copy the data of the rhs with cast. */ template TinyVectorView & operator=(TinyVectorBase const & r) { Loop::assignCast(BaseType::data_, r.begin()); return *this; } }; /********************************************************/ /* */ /* TinyVector Comparison */ /* */ /********************************************************/ /** \addtogroup TinyVectorOperators Functions for TinyVector \brief Implement basic arithmetic and equality for TinyVector. These functions fulfill the requirements of a Linear Space (vector space). Return types are determined according to \ref TinyVectorTraits. \#include \<vigra/tinyvector.hxx\>
Namespace: vigra */ //@{ /// component-wise equal template inline bool operator==(TinyVectorBase const & l, TinyVectorBase const & r) { return !(l != r); } /// component-wise not equal template inline bool operator!=(TinyVectorBase const & l, TinyVectorBase const & r) { typedef typename detail::LoopType::type ltype; return ltype::notEqual(l.begin(), r.begin()); } /********************************************************/ /* */ /* TinyVector Output */ /* */ /********************************************************/ /// stream output template std::ostream & operator<<(std::ostream & out, TinyVectorBase const & l) { out << "("; int i; for(i=0; i struct NumericTraits > { typedef TinyVector::Promote, SIZE> Promote; typedef TinyVector::RealPromote, SIZE> RealPromote; typedef typename NumericTraits::isIntegral isIntegral; typedef VigraFalseType isScalar; typedef typename NumericTraits::isSigned isSigned; // etc. }; template struct NormTraits > { typedef TinyVector Type; typedef typename Type::SquaredNormType SquaredNormType; typedef typename Type::NormType NormType; }; template struct PromoteTraits, TinyVector > { typedef TinyVector::Promote, SIZE> Promote; }; \endcode \#include \<vigra/tinyvector.hxx\>
Namespace: vigra On compilers that don't support pertial template specialization (e.g. MS VisualC++), the traits classes are explicitly specialized for TinyVector with VALUETYPE = unsigned char | int | float | double and SIZE = 2 | 3 | 4. */ #if !defined(NO_PARTIAL_TEMPLATE_SPECIALIZATION) template struct NumericTraits > { typedef TinyVector Type; typedef TinyVector::Promote, SIZE> Promote; typedef TinyVector::RealPromote, SIZE> RealPromote; typedef TinyVector::ComplexPromote, SIZE> ComplexPromote; typedef T ValueType; typedef typename NumericTraits::isIntegral isIntegral; typedef VigraFalseType isScalar; typedef typename NumericTraits::isSigned isSigned; typedef VigraFalseType isOrdered; typedef VigraFalseType isComplex; static TinyVector zero() { return TinyVector(NumericTraits::zero()); } static TinyVector one() { return TinyVector(NumericTraits::one()); } static TinyVector nonZero() { return TinyVector(NumericTraits::nonZero()); } template static Promote toPromote(TinyVectorBase const & v) { return Promote(v); } template static RealPromote toRealPromote(TinyVectorBase const & v) { return RealPromote(v); } template static TinyVector fromPromote(TinyVectorBase::Promote, SIZE, D1, D2> const & v) { TinyVector res(detail::dontInit()); typedef typename detail::LoopType::type ltype; ltype::fromPromote(res.begin(), v.begin()); return res; } template static TinyVector fromRealPromote(TinyVectorBase::RealPromote, SIZE, D1, D2> const & v) { TinyVector res(detail::dontInit()); typedef typename detail::LoopType::type ltype; ltype::fromRealPromote(res.begin(), v.begin()); return res; } }; template struct NumericTraits > : public NumericTraits > { typedef TinyVector Type; typedef TinyVector::Promote, SIZE> Promote; typedef TinyVector::RealPromote, SIZE> RealPromote; typedef TinyVector::ComplexPromote, SIZE> ComplexPromote; typedef T ValueType; typedef typename NumericTraits::isIntegral isIntegral; typedef VigraFalseType isScalar; typedef typename NumericTraits::isSigned isSigned; typedef VigraFalseType isOrdered; typedef VigraFalseType isComplex; }; template struct NormTraits > { typedef TinyVector Type; typedef typename Type::SquaredNormType SquaredNormType; typedef typename Type::NormType NormType; }; template struct NormTraits > { typedef TinyVector Type; typedef typename Type::SquaredNormType SquaredNormType; typedef typename Type::NormType NormType; }; template struct PromoteTraits, TinyVector > { typedef TinyVector::Promote, SIZE> Promote; }; template struct PromoteTraits, TinyVectorView > { typedef TinyVector::Promote, SIZE> Promote; }; template struct PromoteTraits, TinyVector > { typedef TinyVector::Promote, SIZE> Promote; }; template struct PromoteTraits, TinyVectorView > { typedef TinyVector::Promote, SIZE> Promote; }; template struct PromoteTraits, double > { typedef TinyVector::RealPromote, SIZE> Promote; }; template struct PromoteTraits > { typedef TinyVector::RealPromote, SIZE> Promote; }; template struct PromoteTraits, double > { typedef TinyVector::RealPromote, SIZE> Promote; }; template struct PromoteTraits > { typedef TinyVector::RealPromote, SIZE> Promote; }; #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION #define TINYVECTOR_NUMTRAITS(T, SIZE) \ template<>\ struct NumericTraits >\ {\ typedef TinyVector Type;\ typedef TinyVector::Promote, SIZE> Promote;\ typedef TinyVector::RealPromote, SIZE> RealPromote;\ typedef TinyVector::ComplexPromote, SIZE> ComplexPromote;\ typedef T ValueType; \ typedef NumericTraits::isIntegral isIntegral;\ typedef VigraFalseType isScalar;\ typedef NumericTraits::isSigned isSigned; \ typedef VigraFalseType isOrdered;\ typedef VigraFalseType isComplex;\ \ static TinyVector zero() { \ return TinyVector(NumericTraits::zero()); \ }\ static TinyVector one() { \ return TinyVector(NumericTraits::one()); \ }\ static TinyVector nonZero() { \ return TinyVector(NumericTraits::nonZero()); \ }\ \ static Promote toPromote(TinyVector const & v) { \ return Promote(v); \ }\ static RealPromote toRealPromote(TinyVector const & v) { \ return RealPromote(v); \ }\ static TinyVector fromPromote(Promote const & v) { \ TinyVector res;\ TinyVector::iterator d = res.begin(), dend = res.end();\ Promote::const_iterator s = v.begin();\ for(; d != dend; ++d, ++s)\ *d = NumericTraits::fromPromote(*s);\ return res;\ }\ static TinyVector fromRealPromote(RealPromote const & v) {\ TinyVector res;\ TinyVector::iterator d = res.begin(), dend = res.end();\ RealPromote::const_iterator s = v.begin();\ for(; d != dend; ++d, ++s)\ *d = NumericTraits::fromRealPromote(*s);\ return res;\ }\ }; \ template<>\ struct NormTraits >\ {\ typedef TinyVector Type;\ typedef Type::SquaredNormType SquaredNormType; \ typedef Type::NormType NormType; \ }; #define TINYVECTOR_PROMTRAITS1(type1, SIZE) \ template<> \ struct PromoteTraits, TinyVector > \ { \ typedef TinyVector::Promote, SIZE> Promote; \ static Promote toPromote(TinyVector const & v) { \ return static_cast(v); } \ }; #define TINYVECTOR_PROMTRAITS2(type1, type2, SIZE) \ template<> \ struct PromoteTraits, TinyVector > \ { \ typedef TinyVector::Promote, SIZE> Promote; \ static Promote toPromote(TinyVector const & v) { \ return static_cast(v); } \ static Promote toPromote(TinyVector const & v) { \ return static_cast(v); } \ }; #define TINYVECTOR_TRAITS(SIZE) \ TINYVECTOR_NUMTRAITS(unsigned char, SIZE)\ TINYVECTOR_NUMTRAITS(int, SIZE)\ TINYVECTOR_NUMTRAITS(float, SIZE)\ TINYVECTOR_NUMTRAITS(double, SIZE)\ TINYVECTOR_PROMTRAITS1(unsigned char, SIZE)\ TINYVECTOR_PROMTRAITS1(int, SIZE)\ TINYVECTOR_PROMTRAITS1(float, SIZE)\ TINYVECTOR_PROMTRAITS1(double, SIZE)\ TINYVECTOR_PROMTRAITS2(float, unsigned char, SIZE)\ TINYVECTOR_PROMTRAITS2(unsigned char, float, SIZE)\ TINYVECTOR_PROMTRAITS2(int, unsigned char, SIZE)\ TINYVECTOR_PROMTRAITS2(unsigned char, int, SIZE)\ TINYVECTOR_PROMTRAITS2(int, float, SIZE)\ TINYVECTOR_PROMTRAITS2(float, int, SIZE)\ TINYVECTOR_PROMTRAITS2(double, unsigned char, SIZE)\ TINYVECTOR_PROMTRAITS2(unsigned char, double, SIZE)\ TINYVECTOR_PROMTRAITS2(int, double, SIZE)\ TINYVECTOR_PROMTRAITS2(double, int, SIZE)\ TINYVECTOR_PROMTRAITS2(double, float, SIZE)\ TINYVECTOR_PROMTRAITS2(float, double, SIZE) TINYVECTOR_TRAITS(2) TINYVECTOR_TRAITS(3) TINYVECTOR_TRAITS(4) #undef TINYVECTOR_NUMTRAITS #undef TINYVECTOR_PROMTRAITS1 #undef TINYVECTOR_PROMTRAITS2 #undef TINYVECTOR_TRAITS #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION /********************************************************/ /* */ /* TinyVector-Arithmetic */ /* */ /********************************************************/ /** \addtogroup TinyVectorOperators */ //@{ /// component-wise addition template inline typename PromoteTraits, TinyVector >::Promote operator+(TinyVectorBase const & l, TinyVectorBase const & r) { return typename PromoteTraits, TinyVector >::Promote(l) += r; } /// component-wise subtraction template inline typename PromoteTraits, TinyVector >::Promote operator-(TinyVectorBase const & l, TinyVectorBase const & r) { return typename PromoteTraits, TinyVector >::Promote(l) -= r; } /// component-wise multiplication template inline typename PromoteTraits, TinyVector >::Promote operator*(TinyVectorBase const & l, TinyVectorBase const & r) { return typename PromoteTraits, TinyVector >::Promote(l) *= r; } /// component-wise left scalar multiplication template inline typename NumericTraits >::RealPromote operator*(double v, TinyVectorBase const & r) { return typename NumericTraits >::RealPromote(r) *= v; } /// component-wise right scalar multiplication template inline typename NumericTraits >::RealPromote operator*(TinyVectorBase const & l, double v) { return typename NumericTraits >::RealPromote(l) *= v; } /// component-wise scalar division template inline typename NumericTraits >::RealPromote operator/(TinyVectorBase const & l, double v) { return typename NumericTraits >::RealPromote(l) /= v; } /** Unary negation (construct TinyVector with negative values) */ template inline TinyVector operator-(TinyVectorBase const & v) { TinyVector res(detail::dontInit()); typedef typename detail::LoopType::type ltype; ltype::neg(res.begin(), v.begin()); return res; } /// component-wise absolute value template inline TinyVector abs(TinyVectorBase const & v) { TinyVector res(detail::dontInit()); typedef typename detail::LoopType::type ltype; ltype::abs(res.begin(), v.begin()); return res; } /** Apply ceil() function to each vector component. */ template inline TinyVector ceil(TinyVectorBase const & v) { TinyVector res(detail::dontInit()); typedef typename detail::LoopType::type ltype; ltype::ceil(res.begin(), v.begin()); return res; } /** Apply floor() function to each vector component. */ template inline TinyVector floor(TinyVectorBase const & v) { TinyVector res(detail::dontInit()); typedef typename detail::LoopType::type ltype; ltype::floor(res.begin(), v.begin()); return res; } /// cross product template inline TinyVector::Promote, 3> cross(TinyVectorBase const & r1, TinyVectorBase const & r2) { typedef TinyVector::Promote, 3> Res; return Res(r1[1]*r2[2] - r1[2]*r2[1], r1[2]*r2[0] - r1[0]*r2[2], r1[0]*r2[1] - r1[1]*r2[0]); } /// dot product template inline typename PromoteTraits::Promote dot(TinyVectorBase const & l, TinyVectorBase const & r) { typedef typename detail::LoopType::type ltype; return ltype::dot(l.begin(), r.begin()); } /// squared norm template inline typename TinyVectorBase::SquaredNormType squaredNorm(TinyVectorBase const & t) { return t.squaredMagnitude(); } /// squared norm template inline typename TinyVector::SquaredNormType squaredNorm(TinyVector const & t) { return t.squaredMagnitude(); } //@} } // namespace vigra #endif // VIGRA_TINYVECTOR_HXX gamera-3.3.3/include/vigra/transformimage.hxx0000644000076500000000000014040411261456425020255 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_TRANSFORMIMAGE_HXX #define VIGRA_TRANSFORMIMAGE_HXX #include "utilities.hxx" #include "numerictraits.hxx" #include "iteratortraits.hxx" #include "rgbvalue.hxx" #include "functortraits.hxx" namespace vigra { /** \addtogroup TransformAlgo Algorithms to Transform Images Apply functor to calculate a pixelwise transformation of one image @{ */ /********************************************************/ /* */ /* transformLine */ /* */ /********************************************************/ template void transformLine(SrcIterator s, SrcIterator send, SrcAccessor src, DestIterator d, DestAccessor dest, Functor const & f) { for(; s != send; ++s, ++d) dest.set(f(src(s)), d); } template void transformLineIf(SrcIterator s, SrcIterator send, SrcAccessor src, MaskIterator m, MaskAccessor mask, DestIterator d, DestAccessor dest, Functor const & f) { for(; s != send; ++s, ++d, ++m) if(mask(m)) dest.set(f(src(s)), d); } /********************************************************/ /* */ /* transformImage */ /* */ /********************************************************/ /** \brief Apply unary point transformation to each pixel. The transformation given by the functor is applied to every source pixel and the result written into the corresponding destination pixel. The function uses accessors to access the pixel data. Note that the unary functors of the STL can be used in addition to the functors specifically defined in \ref TransformFunctor. Creation of new functors is easiest by using \ref FunctorExpressions. Declarations: pass arguments explicitly: \code namespace vigra { template void transformImage(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void transformImage(triple src, pair dest, Functor const & f) } \endcode Usage: \#include \<vigra/transformimage.hxx\>
Namespace: vigra \code #include // for sqrt() vigra::transformImage(srcImageRange(src), destImage(dest), (double(*)(double))&std::sqrt ); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcImageIterator::row_iterator sx = src_upperleft.rowIterator(); DestImageIterator::row_iterator dx = dest_upperleft.rowIterator(); SrcAccessor src_accessor; DestAccessor dest_accessor; Functor functor; dest_accessor.set(functor(src_accessor(sx)), dx); \endcode */ doxygen_overloaded_function(template <...> void transformImage) template void transformImage(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) { int w = src_lowerright.x - src_upperleft.x; for(; src_upperleft.y < src_lowerright.y; ++src_upperleft.y, ++dest_upperleft.y) { transformLine(src_upperleft.rowIterator(), src_upperleft.rowIterator() + w, sa, dest_upperleft.rowIterator(), da, f); } } template inline void transformImage(triple src, pair dest, Functor const & f) { transformImage(src.first, src.second, src.third, dest.first, dest.second, f); } /********************************************************/ /* */ /* transformImageIf */ /* */ /********************************************************/ /** \brief Apply unary point transformation to each pixel within the ROI (i.e., where the mask is non-zero). The transformation given by the functor is applied to every source pixel in the ROI (i.e. when the return vlaue of the mask's accessor is not zero) and the result is written into the corresponding destination pixel. The function uses accessors to access the pixel data. Note that the unary functors of the STL can be used in addition to the functors specifically defined in \ref TransformFunctor. Creation of new functors is easiest by using \ref FunctorExpressions. Declarations: pass arguments explicitly: \code namespace vigra { template void transformImageIf(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, MaskImageIterator mask_upperleft, MaskAccessor ma, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void transformImageIf(triple src, pair mask, pair dest, Functor const & f) } \endcode Usage: \#include \<vigra/transformimage.hxx\>
Namespace: vigra \code #include // for sqrt() vigra::transformImageIf(srcImageRange(src), maskImage(mask), destImage(dest), (double(*)(double))&std::sqrt ); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; MaskImageIterator mask_upperleft; SrcImageIterator::row_iterator sx = src_upperleft.rowIterator(); MaskImageIterator::row_iterator mx = mask_upperleft.rowIterator(); DestImageIterator::row_iterator dx = dest_upperleft.rowIterator(); SrcAccessor src_accessor; DestAccessor dest_accessor; MaskAccessor mask_accessor; Functor functor; if(mask_accessor(mx)) dest_accessor.set(functor(src_accessor(sx)), dx); \endcode */ doxygen_overloaded_function(template <...> void transformImageIf) template void transformImageIf(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, MaskImageIterator mask_upperleft, MaskAccessor ma, DestImageIterator dest_upperleft, DestAccessor da, Functor const & f) { int w = src_lowerright.x - src_upperleft.x; for(; src_upperleft.y < src_lowerright.y; ++src_upperleft.y, ++mask_upperleft.y, ++dest_upperleft.y) { transformLineIf(src_upperleft.rowIterator(), src_upperleft.rowIterator() + w, sa, mask_upperleft.rowIterator(), ma, dest_upperleft.rowIterator(), da, f); } } template inline void transformImageIf(triple src, pair mask, pair dest, Functor const & f) { transformImageIf(src.first, src.second, src.third, mask.first, mask.second, dest.first, dest.second, f); } /********************************************************/ /* */ /* gradientBasedTransform */ /* */ /********************************************************/ /** \brief Calculate a function of the image gradient. The gradient and the function represented by Functor f are calculated in one go: for each location, the symmetric difference in x- and y-directions (asymmetric difference at the image borders) are passed to the given functor, and the result is written the destination image. Functors to be used with this function include \ref MagnitudeFunctor and \ref RGBGradientMagnitudeFunctor. Declarations: pass arguments explicitly: \code namespace vigra { template void gradientBasedTransform(SrcImageIterator srcul, SrcImageIterator srclr, SrcAccessor sa, DestImageIterator destul, DestAccessor da, Functor const & f) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void gradientBasedTransform(triple src, pair dest, Functor const & const & f) } \endcode Usage: \#include \<vigra/transformimage.hxx\> \code vigra::FImage src(w,h), magnitude(w,h); ... gradientBasedTransform(srcImageRange(src), destImage(magnitude), vigra::MagnitudeFunctor()); \endcode Required Interface: \code SrcImageIterator is, isend; DestImageIterator id; SrcAccessor src_accessor; DestAccessor dest_accessor; typename NumericTraits::RealPromote diffx, diffy; diffx = src_accessor(is, Diff2D(-1,0)) - src_accessor(is, Diff2D(1,0)); diffy = src_accessor(is, Diff2D(0,-1)) - src_accessor(is, Diff2D(0,1)); Functor f; dest_accessor.set(f(diffx, diffy), id); \endcode */ doxygen_overloaded_function(template <...> void gradientBasedTransform) template void gradientBasedTransform(SrcImageIterator srcul, SrcImageIterator srclr, SrcAccessor sa, DestImageIterator destul, DestAccessor da, Functor const & grad) { int w = srclr.x - srcul.x; int h = srclr.y - srcul.y; int x,y; SrcImageIterator sy = srcul; DestImageIterator dy = destul; static const Diff2D left(-1,0); static const Diff2D right(1,0); static const Diff2D top(0,-1); static const Diff2D bottom(0,1); typename NumericTraits::RealPromote diffx, diffy; SrcImageIterator sx = sy; DestImageIterator dx = dy; diffx = sa(sx) - sa(sx, right); diffy = sa(sx) - sa(sx, bottom); da.set(grad(diffx, diffy), dx); for(x=2, ++sx.x, ++dx.x; x inline void gradientBasedTransform(triple src, pair dest, Functor const & grad) { gradientBasedTransform(src.first, src.second, src.third, dest.first, dest.second, grad); } /** @} */ /** \addtogroup TransformFunctor Functors to Transform Images Note that the unary functors of the STL can also be used in connection with \ref transformImage(). */ //@{ template class LinearIntensityTransform { public: /* the functors argument type (actually, since operator() is a template, much more types are possible) */ typedef DestValueType argument_type; /* the functors result type */ typedef DestValueType result_type; /* \deprecated use argument_type and result_type */ typedef DestValueType value_type; /* type of the offset (used in internal calculations to prevent overflows and minimize round-off errors). */ typedef typename NumericTraits::RealPromote argument_promote; /* type of the scale factor */ typedef Multiplier scalar_multiplier_type; /* init scale and offset */ LinearIntensityTransform(scalar_multiplier_type scale, argument_promote offset) : scale_(scale), offset_(offset) {} /* calculate transform */ template result_type operator()(SrcValueType const & s) const { return NumericTraits::fromRealPromote(scale_ * (s + offset_)); } private: scalar_multiplier_type scale_; argument_promote offset_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; template class ScalarIntensityTransform { public: /* the functors argument type (actually, since operator() is a template, much more types are possible) */ typedef DestValueType argument_type; /* the functors result type */ typedef DestValueType result_type; /* \deprecated use argument_type and result_type */ typedef DestValueType value_type; /* type of the scale factor */ typedef Multiplier scalar_multiplier_type; /* init scale */ ScalarIntensityTransform(scalar_multiplier_type scale) : scale_(scale) {} /* calculate transform */ template result_type operator()(SrcValueType const & s) const { return NumericTraits::fromRealPromote(scale_ * s); } private: scalar_multiplier_type scale_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /********************************************************/ /* */ /* linearIntensityTransform */ /* */ /********************************************************/ /** \brief Apply a linear transform to the source pixel values Factory function for a functor that linearly transforms the source pixel values. The functor applies the transform 'destvalue = scale * (srcvalue + offset)' to every pixel. This can, for example, be used to transform images into the visible range 0...255 or to invert an image. If you leave out the second parameter / offset, you will get an optimized version of the functor which only scales by the given factor, however you have to make the template parameter (pixel type) explicit then. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) Declaration: \code namespace vigra { template LinearIntensityTransform linearIntensityTransform(Multiplier scale, DestValueType offset); template ScalarIntensityTransform linearIntensityTransform(Multiplier scale); } \endcode Usage: \#include \<vigra/transformimage.hxx\>
Namespace: vigra \code vigra::IImage src(width, height); vigra::BImage dest(width, height); ... vigra::FindMinMax minmax; // functor to find range vigra::inspectImage(srcImageRange(src), minmax); // find original range // transform to range 0...255 vigra::transformImage(srcImageRange(src), destImage(dest), linearIntensityTransform( 255.0 / (minmax.max - minmax.min), // scaling - minmax.min)); // offset \endcode The one-parameter version can be used like this: \code // scale from 0..255 to 0..1.0 FImage dest(src.size()); vigra::transformImage(srcImageRange(src), destImage(dest), linearIntensityTransform(1.0 / 255)); \endcode Required Interface: The source and destination value types must be models of \ref LinearSpace in both cases. */ template LinearIntensityTransform linearIntensityTransform(Multiplier scale, DestValueType offset) { return LinearIntensityTransform(scale, offset); } template ScalarIntensityTransform linearIntensityTransform(Multiplier scale) { return ScalarIntensityTransform(scale); } /********************************************************/ /* */ /* linearRangeMapping */ /* */ /********************************************************/ /** \brief Map a source intensity range linearly to a destination range. Factory function for a functor that linearly transforms the source pixel values. The functor applies the transform 'destvalue = scale * (srcvalue + offset)' to every pixel, where scale = (dest_max - dest_min) / (src_max - src_min) and offset = dest_min / scale - src_min. As a result, the pixel values src_max, src_min in the source image are mapped onto dest_max, dest_min respectively. This works for scalar as well as vector pixel types. Declaration: \code namespace vigra { template LinearIntensityTransform::RealPromote> linearRangeMapping(SrcValueType src_min, SrcValueType src_max, DestValueType dest_min, DestValueType dest_max ); } \endcode Usage: \#include \<vigra/transformimage.hxx\>
Namespace: vigra \code vigra::IImage src(width, height); vigra::BImage dest(width, height); ... vigra::FindMinMax minmax; // functor to find range vigra::inspectImage(srcImageRange(src), minmax); // find original range // transform to range 0...255 vigra::transformImage(srcImageRange(src), destImage(dest), linearRangeTransform( minmax.min, minmax.max, // src range (unsigned char)0, (unsigned char)255) // dest range ); \endcode Required Interface: The source and destination value types must be models of \ref LinearSpace in both cases. */ template LinearIntensityTransform::RealPromote> linearRangeMapping(SrcValueType src_min, SrcValueType src_max, DestValueType dest_min, DestValueType dest_max ) { return linearRangeMapping(src_min, src_max, dest_min, dest_max, typename NumericTraits::isScalar()); } template LinearIntensityTransform::RealPromote> linearRangeMapping( SrcValueType src_min, SrcValueType src_max, DestValueType dest_min, DestValueType dest_max, VigraTrueType /* isScalar */ ) { typedef typename NumericTraits::RealPromote Multiplier; Multiplier diff = src_max - src_min; Multiplier scale = diff == NumericTraits::zero() ? NumericTraits::one() : (dest_max - dest_min) / diff; return LinearIntensityTransform( scale, dest_min / scale - src_min ); } template LinearIntensityTransform::RealPromote> linearRangeMapping( SrcValueType src_min, SrcValueType src_max, DestValueType dest_min, DestValueType dest_max, VigraFalseType /* isScalar */ ) { typedef typename NumericTraits::RealPromote Multiplier; typedef typename Multiplier::value_type MComponent; Multiplier scale(dest_max), offset(dest_max); for(unsigned int i=0; i::zero() ? NumericTraits::one() : (dest_max[i] - dest_min[i]) / diff; offset[i] = dest_min[i] / scale[i] - src_min[i]; } return LinearIntensityTransform(scale, offset); } /********************************************************/ /* */ /* Threshold */ /* */ /********************************************************/ /** \brief Threshold an image. If a source pixel is above or equal the lower and below or equal the higher threshold (i.e. within the closed interval [lower, heigher]) the destination pixel is set to 'yesresult', otherwise to 'noresult'. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) Usage: \#include \<vigra/transformimage.hxx\>
Namespace: vigra \code vigra::BImage src(width, height), dest(width, height); ... vigra::transformImage(src.upperLeft(), src.lowerRight(), src.accessor(), dest.upperLeft(), dest.accessor(), vigra::Threshold< vigra::BImage::PixelType, vigra::BImage::PixelType>(10, 100, 0, 255)); \endcode Required Interface: \code SrcValueType src; DestValueType dest, yesresult, noresult; dest = ((src < lower) || (higher < src)) ? noresult : yesresult; \endcode */ template class Threshold { public: /** the functor's argument type */ typedef SrcValueType argument_type; /** the functor's result type */ typedef DestValueType result_type; /** init thresholds and return values */ Threshold(argument_type lower, argument_type higher, result_type noresult, result_type yesresult) : lower_(lower), higher_(higher), yesresult_(yesresult), noresult_(noresult) {} /** calculate transform */ result_type operator()(argument_type s) const { return ((s < lower_) || (higher_ < s)) ? noresult_ : yesresult_; } private: argument_type lower_, higher_; result_type yesresult_, noresult_; }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /********************************************************/ /* */ /* BrightnessContrastFunctor */ /* */ /********************************************************/ /** \brief Adjust brightness and contrast of an image. This functor applies a gamma correction to each pixel in order to modify the brightness of the image. To the result of the gamma correction, another transform is applied that modifies the contrast. The brightness and contrast parameters must be positive. Values greater than 1 will increase image brightness or contrast respectively, values smaller than 1 decrease them. A value of exactly 1 will have no effect. If contrast is set to 1, the result is equivalent to that of the GammaFunctor with gamma = 1./brightness. For \ref RGBValue "RGBValue's", the transforms are applied component-wise. The pixel values are assumed to lie between the given minimum and maximum values (in case of RGB, this is again understood component-wise). In case of unsigned char, min and max default to 0 and 255 respectively. Precisely, the following transform is applied to each PixelValue: \f[ \begin{array}{rcl} V_1 & = & \frac{PixelValue - min}{max - min} \\ V_2 & = & V_1^\frac{1}{brightness} \\ V_3 & = & 2 V_2 - 1 \\ V_4 & = & \left\lbrace \begin{array}{l} V_3^\frac{1}{contrast} \mbox{\rm \quad if } V_3 \ge 0 \\ - (-V_3)^\frac{1}{contrast} \mbox{\rm \quad otherwise} \end{array} \right. \\ Result & = & \frac{V_4 + 1}{2} (max - min) + min \end{array} \f] If the PixelType is unsigned char, a look-up-table is used for faster computation. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) Usage: \#include \<vigra/transformimage.hxx\>
Namespace: vigra \code vigra::BImage bimage(width, height); double brightness, contrast; ... vigra::transformImage(srcImageRange(bimage), destImage(bimage), vigra::BrightnessContrastFunctor(brightness, contrast)); vigra::FImage fimage(width, height); ... vigra::FindMinmax minmax; vigra::inspectImage(srcImageRange(fimage), minmax); vigra::transformImage(srcImageRange(fimage), destImage(fimage), vigra::BrightnessContrastFunctor(brightness, contrast, minmax.min, minmax.max)); \endcode Required Interface: Scalar types: must be a linear algebra (+, - *, NumericTraits), strict weakly ordered (<), and pow() must be defined. RGB values: the component type must meet the above requirements. */ template class BrightnessContrastFunctor { typedef typename NumericTraits::RealPromote promote_type; public: /** the functor's argument type */ typedef PixelType argument_type; /** the functor's result type */ typedef PixelType result_type; /** \deprecated use argument_type and result_type */ typedef PixelType value_type; /** Init functor for argument range [min, max]. brightness and contrast values > 1 will increase brightness and contrast, < 1 will decrease them, and == 1 means no change. */ BrightnessContrastFunctor(promote_type brightness, promote_type contrast, argument_type const & min, argument_type const & max) : b_(1.0/brightness), c_(1.0/contrast), min_(min), diff_(max - min), zero_(NumericTraits::zero()), one_(NumericTraits::one()) {} /** Calculate modified gray or color value */ result_type operator()(argument_type const & v) const { promote_type v1 = (v - min_) / diff_; promote_type brighter = VIGRA_CSTD::pow(v1, b_); promote_type v2 = 2.0 * brighter - one_; promote_type contrasted = (v2 < zero_) ? -VIGRA_CSTD::pow(-v2, c_) : VIGRA_CSTD::pow(v2, c_); return result_type(0.5 * diff_ * (contrasted + one_) + min_); } private: promote_type b_, c_; argument_type min_; promote_type diff_, zero_, one_; }; template <> class BrightnessContrastFunctor { typedef NumericTraits::RealPromote promote_type; unsigned char lut[256]; public: typedef unsigned char value_type; BrightnessContrastFunctor(promote_type brightness, promote_type contrast, value_type const & min = 0, value_type const & max = 255) { BrightnessContrastFunctor f(brightness, contrast, min, max); for(int i = min; i <= max; ++i) { lut[i] = static_cast(f(i)+0.5); } } value_type operator()(value_type const & v) const { return lut[v]; } }; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template class BrightnessContrastFunctor > { typedef typename NumericTraits::RealPromote promote_type; BrightnessContrastFunctor red, green, blue; public: typedef RGBValue value_type; BrightnessContrastFunctor(promote_type brightness, promote_type contrast, value_type const & min, value_type const & max) : red(brightness, contrast, min.red(), max.red()), green(brightness, contrast, min.green(), max.green()), blue(brightness, contrast, min.blue(), max.blue()) {} value_type operator()(value_type const & v) const { return value_type(red(v.red()), green(v.green()), blue(v.blue())); } }; #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION template <> class BrightnessContrastFunctor > { typedef NumericTraits::RealPromote promote_type; BrightnessContrastFunctor red, green, blue; public: typedef RGBValue value_type; BrightnessContrastFunctor(promote_type brightness, promote_type contrast, value_type const & min, value_type const & max) : red(brightness, contrast, min.red(), max.red()), green(brightness, contrast, min.green(), max.green()), blue(brightness, contrast, min.blue(), max.blue()) {} value_type operator()(value_type const & v) const { return value_type(red(v.red()), green(v.green()), blue(v.blue())); } }; template <> class BrightnessContrastFunctor > { typedef NumericTraits::RealPromote promote_type; BrightnessContrastFunctor red, green, blue; public: typedef RGBValue value_type; BrightnessContrastFunctor(promote_type brightness, promote_type contrast, value_type const & min, value_type const & max) : red(brightness, contrast, min.red(), max.red()), green(brightness, contrast, min.green(), max.green()), blue(brightness, contrast, min.blue(), max.blue()) {} value_type operator()(value_type const & v) const { return value_type(red(v.red()), green(v.green()), blue(v.blue())); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION template <> class BrightnessContrastFunctor > { typedef NumericTraits::RealPromote promote_type; BrightnessContrastFunctor red, green, blue; public: typedef RGBValue value_type; BrightnessContrastFunctor(promote_type brightness, promote_type contrast, value_type const & min = value_type(0,0,0), value_type const & max = value_type(255, 255, 255)) : red(brightness, contrast, min.red(), max.red()), green(brightness, contrast, min.green(), max.green()), blue(brightness, contrast, min.blue(), max.blue()) {} value_type operator()(value_type const & v) const { return value_type(red(v.red()), green(v.green()), blue(v.blue())); } }; /********************************************************/ /* */ /* GammaFunctor */ /* */ /********************************************************/ /** \brief Perform gamma correction of an image. This functor applies a gamma correction to each pixel in order to modify the brightness of the image. Gamma values smaller than 1 will increase image brightness, whereas values greater than 1 decrease it. A value of gamma = 1 will have no effect. (See also BrightnessContrastFunctor, which additionally changes the contrast.) For \ref RGBValue "RGBValue's", the transforms are applied component-wise. For ease of use, the pixel values are assumed to lie between the given minimum and maximum values (in case of RGB, this is again understood component-wise). In case of unsigned char, min and max default to 0 and 255 respectively. Precisely, the following transform is applied to each PixelValue: \f[ \begin{array}{rcl} V_1 & = & \frac{PixelValue - min}{max - min} \\ V_2 & = & V_1^{gamma} \\ Result & = & V_2 (max - min) + min \end{array} \f] If the PixelType is unsigned char, a look-up-table is used for faster computation. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) Usage: \#include \<vigra/transformimage.hxx\>
Namespace: vigra \code vigra::BImage bimage(width, height); double gamma; ... vigra::transformImage(srcImageRange(bimage), destImage(bimage), vigra::GammaFunctor(gamma)); vigra::FImage fimage(width, height); ... vigra::FindMinmax minmax; vigra::inspectImage(srcImageRange(fimage), minmax); vigra::transformImage(srcImageRange(fimage), destImage(fimage), vigra::GammaFunctor(gamma, minmax.min, minmax.max)); \endcode Required Interface: Scalar types: must be a linear algebra (+, - *, NumericTraits), strict weakly ordered (<), and pow() must be defined. RGB values: the component type must meet the above requirements. */ template class GammaFunctor { typedef typename NumericTraits::RealPromote promote_type; public: /** the functor's argument type */ typedef PixelType argument_type; /** the functor's result type */ typedef PixelType result_type; /** \deprecated use argument_type and result_type */ typedef PixelType value_type; /** Init functor for argument range [min, max]. gamma values < 1 will increase brightness, > 1 will decrease it (gamma == 1 means no change). */ GammaFunctor(promote_type gamma, argument_type const & min, argument_type const & max) : gamma_(gamma), min_(min), diff_(max - min), zero_(NumericTraits::zero()), one_(NumericTraits::one()) {} /** Calculate modified gray or color value */ result_type operator()(argument_type const & v) const { promote_type v1 = (v - min_) / diff_; promote_type brighter = VIGRA_CSTD::pow(v1, gamma_); return result_type(diff_ * brighter + min_); } private: promote_type gamma_; argument_type min_; promote_type diff_, zero_, one_; }; template <> class GammaFunctor { typedef NumericTraits::RealPromote promote_type; unsigned char lut[256]; public: typedef unsigned char value_type; GammaFunctor(promote_type gamma, value_type const & min = 0, value_type const & max = 255) { GammaFunctor f(gamma, min, max); for(int i = min; i <= max; ++i) { lut[i] = static_cast(f(i)+0.5); } } value_type operator()(value_type const & v) const { return lut[v]; } }; #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION template class GammaFunctor > { typedef typename NumericTraits::RealPromote promote_type; GammaFunctor red, green, blue; public: typedef RGBValue value_type; GammaFunctor(promote_type gamma, value_type const & min, value_type const & max) : red(gamma, min.red(), max.red()), green(gamma, min.green(), max.green()), blue(gamma, min.blue(), max.blue()) {} value_type operator()(value_type const & v) const { return value_type(red(v.red()), green(v.green()), blue(v.blue())); } }; #else // NO_PARTIAL_TEMPLATE_SPECIALIZATION template <> class GammaFunctor > { typedef NumericTraits::RealPromote promote_type; GammaFunctor red, green, blue; public: typedef RGBValue value_type; GammaFunctor(promote_type gamma, value_type const & min, value_type const & max) : red(gamma, min.red(), max.red()), green(gamma, min.green(), max.green()), blue(gamma, min.blue(), max.blue()) {} value_type operator()(value_type const & v) const { return value_type(red(v.red()), green(v.green()), blue(v.blue())); } }; template <> class GammaFunctor > { typedef NumericTraits::RealPromote promote_type; GammaFunctor red, green, blue; public: typedef RGBValue value_type; GammaFunctor(promote_type gamma, value_type const & min, value_type const & max) : red(gamma, min.red(), max.red()), green(gamma, min.green(), max.green()), blue(gamma, min.blue(), max.blue()) {} value_type operator()(value_type const & v) const { return value_type(red(v.red()), green(v.green()), blue(v.blue())); } }; template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; #endif // NO_PARTIAL_TEMPLATE_SPECIALIZATION template <> class GammaFunctor > { typedef NumericTraits::RealPromote promote_type; GammaFunctor red, green, blue; public: typedef RGBValue value_type; GammaFunctor(promote_type gamma, value_type const & min = value_type(0,0,0), value_type const & max = value_type(255, 255, 255)) : red(gamma, min.red(), max.red()), green(gamma, min.green(), max.green()), blue(gamma, min.blue(), max.blue()) {} value_type operator()(value_type const & v) const { return value_type(red(v.red()), green(v.green()), blue(v.blue())); } }; /********************************************************/ /* */ /* VectorNormFunctor */ /* */ /********************************************************/ /** \brief A functor for computing the vector norm Calculate the magnitude or norm from a given vector-valued entity. The vector type will typically be some sort of ref vigra::TinyVector. If the vector is represented by a pair of scalar-valued images, use \ref vigra::MagnitudeFunctor instead. At least, the vector type is required to have a function 'result = dot(v,v)'. Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) Usage: \#include \<vigra/transformimage.hxx\>
Namespace: vigra \code typedef vigra::TinyVector Vector; vigra::BasicImage grad(width, height); vigra::FImage magn(width,height); ... vigra::transformImage(srcImageRange(grad), destImage(magn), VectorNormFunctor() ); \endcode \see vigra::TinyVector, dot(), vigra::MagnitudeFunctor */ template class VectorNormFunctor { public: /** the functor's argument type */ typedef ValueType argument_type; /** the functor's result type */ typedef typename NumericTraits::RealPromote result_type; /** calculate transform 'sqrt(v1*v1 + v2*v2 + ...)'. */ result_type operator()( const argument_type &a ) const { return VIGRA_CSTD::sqrt( dot(a,a) ); } }; //-- class VectorNormFunctor template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; /** \brief A functor for computing the squared vector norm Calculate the squared magnitude or norm from a given vector-valued entity. The vector type will typically be some sort of TinyVector. At least, the vector type is required to have a function 'result = dot(v,v)'. For an example of its usage see VectorNormFunctor Traits defined: FunctorTraits::isUnaryFunctor is true (VigraTrueType) \see TinyVector, dot() */ template class VectorNormSqFunctor { public: /** the functor's argument type */ typedef ValueType argument_type; /** the functor's result type */ typedef typename NumericTraits::RealPromote result_type; /** calculate transform 'v1*v1 + v2*v2 + ...'. */ result_type operator()( const argument_type &a ) const { return dot(a,a); } }; //-- class VectorNormSqFunctor template class FunctorTraits > : public FunctorTraitsBase > { public: typedef VigraTrueType isUnaryFunctor; }; //@} } // namespace vigra #endif // VIGRA_TRANSFORMIMAGE_HXX gamera-3.3.3/include/vigra/tuple.hxx0000644000076500000000000001536511261456425016377 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_TUPLE_HXX #define VIGRA_TUPLE_HXX #include // for pair namespace vigra { /*! \page TupleTypes Tuple Types pair, triple, tuple4, tuple5 \#include \<vigra/utilities.hxx\>
Namespace: vigra VIGRA defines tuple types \p vigra::triple, \p vigra::tuple4, \p vigra::tuple5. In addition, \p std::pair is imported into namespace vigra from the C++ standard library. All these types are defined similarly:
  • They are parameterized by the respective number of types. For each tuple, a constructor is defined that takes that many arguments, e.g.: \code template class Triple { ... }; \endcode
  • A number of \p typedef's tells the types stored in the tuple: \code typedef ... first_type; typedef ... second_type; typedef ... third_type; // triple, tuple4, tuple5 only typedef ... forth_type; // tuple4, tuple5 only typedef ... fifth_type; // tuple5 only \endcode
  • Items are stored in the following public attributes: \code first; second; third; // triple, tuple4, tuple5 only forth; // tuple4, tuple5 only fifth; // tuple5 only \endcode
*/ /********************************************************/ /* */ /* pair */ /* */ /********************************************************/ using std::pair; /********************************************************/ /* */ /* triple */ /* */ /********************************************************/ template struct triple { typedef T1 first_type; typedef T2 second_type; typedef T3 third_type; T1 first; T2 second; T3 third; triple() {} triple(const T1& a, const T2& b, const T3& c) : first(a), second(b), third(c) {} }; template triple make_triple( T1 t1, T2 t2, T3 t3 ) { return triple( t1, t2, t3 ); } /********************************************************/ /* */ /* tuple4 */ /* */ /********************************************************/ template struct tuple4 { typedef T1 first_type; typedef T2 second_type; typedef T3 third_type; typedef T4 fourth_type; T1 first; T2 second; T3 third; T4 fourth; tuple4() {} tuple4(const T1& a, const T2& b, const T3& c, const T4& d) : first(a), second(b), third(c), fourth(d) {} }; template tuple4 make_tuple4( T1 t1, T2 t2, T3 t3, T4 t4 ) { return tuple4( t1, t2, t3, t4 ); } /********************************************************/ /* */ /* tuple5 */ /* */ /********************************************************/ template struct tuple5 { typedef T1 first_type; typedef T2 second_type; typedef T3 third_type; typedef T4 fourth_type; typedef T5 fifth_type; T1 first; T2 second; T3 third; T4 fourth; T5 fifth; tuple5() {} tuple5(const T1& a, const T2& b, const T3& c, const T4& d, const T5& e) : first(a), second(b), third(c), fourth(d), fifth(e) {} }; template tuple5 make_tuple5( T1 t1, T2 t2, T3 t3, T4 t4, T5 t5 ) { return tuple5( t1, t2, t3, t4, t5 ); } } // namespace vigra #endif /* VIGRA_TUPLE_HXX */ gamera-3.3.3/include/vigra/utilities.hxx0000644000076500000000000000721311261456425017252 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2002 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_BASICS_HXX #define VIGRA_BASICS_HXX #include "config.hxx" #include "error.hxx" #include "metaprogramming.hxx" #include "tuple.hxx" #include "diff2d.hxx" #include "mathutil.hxx" /*! \page Utilities Utilities Basic helper functionality needed throughout.
  • \ref vigra::ArrayVector
       replacement for std::vector
  • \ref RangesAndPoints
       2-dimensional positions, extents, and rectangles
  • \ref PixelNeighborhood
       4- and 8-neighborhood definitions and circulators
  • \ref vigra::IteratorAdaptor
       Quickly create STL-compatible 1D iterator adaptors
  • \ref TupleTypes
       pair, triple, tuple4, tuple5
  • \ref MathConstants
       M_PI, M_SQRT2
*/ #endif // VIGRA_BASICS_HXX gamera-3.3.3/include/vigra/voxelneighborhood.hxx0000644000076500000000000032420511261456425020767 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2006-2007 by F. Heinrich, B. Seppke, Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_VOXELNEIGHBORHOOD_HXX #define VIGRA_VOXELNEIGHBORHOOD_HXX #include "tinyvector.hxx" #include "pixelneighborhood.hxx" namespace vigra { /** \addtogroup VoxelNeighborhood Utilities to manage voxel neighborhoods 6- and 26-neighborhood definitions and circulators. \#include \<vigra/voxelneighborhood.hxx\>
See also: \ref vigra::NeighborhoodCirculator */ //@{ /// 3-dimensional difference vector typedef vigra::TinyVector Diff3D; /********************************************************/ /* */ /* AtVolumeBorder */ /* */ /********************************************************/ /** \brief Encode whether a voxel is near the volume border. // This enum is used with \ref isAtVolumeBorder() and // \ref vigra::RestrictedNeighborhoodCirculator. //\#include \<vigra/voxelneighborhood.hxx\>
//Namespace: vigra */ typedef AtImageBorder AtVolumeBorder; /** \brief Find out whether a voxel is at the volume border. This function checks if \a x == 0 or \a x == \a width - 1 and \a y == 0 or \a y == \a height - 1 and so on and returns the appropriate value of \ref vigra::AtVolumeBorder, or zero when the voxel is not at te volume border. The behavior of the function is undefined if (x,y,z) is not inside the volume. */ inline AtVolumeBorder isAtVolumeBorder(int x, int y, int z, int width, int height, int depth) { return static_cast((x == 0 ? LeftBorder : x == width-1 ? RightBorder : NotAtBorder) | (y == 0 ? TopBorder : y == height-1 ? BottomBorder : NotAtBorder) | (z == 0 ? FrontBorder : z == depth-1 ? RearBorder : NotAtBorder)); }; /** \brief Find out whether a voxel is at a scan-order relevant volume border. This function checks if \a x == 0 or \a y == 0 or \a z == \a 0 and returns the appropriate value of \ref vigra::AtVolumeBorder, or zero when the voxel is not at te volume border. The behavior of the function is undefined if (x,y,z) is not inside the volume. */ inline AtVolumeBorder isAtVolumeBorderCausal(int x, int y, int z, int width, int height, int depth) { return static_cast((x == 0 ? LeftBorder : NotAtBorder) | (y == 0 ? TopBorder : NotAtBorder) | (z == 0 ? FrontBorder : NotAtBorder)); }; /** TODO: Write new comment \brief Find out whether a voxel is at a scan-order relevant volume border. This function checks if \a x == 0 or \a y == 0 or \a z == \a 0 and returns the appropriate value of \ref vigra::AtVolumeBorder, or zero when the voxel is not at te volume border. The behavior of the function is undefined if (x,y,z) is not inside the volume. */ inline AtVolumeBorder isAtVolumeBorderAntiCausal(int x, int y, int z, int width, int height, int depth) { return static_cast((x == width-1 ? RightBorder : NotAtBorder) | (y == height-1 ? BottomBorder : NotAtBorder) | (z == depth-1 ? RearBorder : NotAtBorder)); }; /********************************************************/ /* */ /* Neighborhood3DSix */ /* */ /********************************************************/ /** 3D 6-Neighborhood. */ namespace Neighborhood3DSix { /** \brief Encapsulation of direction management of neighbors for a 3D 6-neighborhood. */ class NeighborCode3D { public: typedef Diff3D difference_type; /** provides enumeration of all directions. DirectionCount may be used for portable loop termination conditions. */ enum Direction { Error = -1, InFront= 0, North, West , Behind, South, East, DirectionCount, CausalFirst = InFront, CausalLast = West, AntiCausalFirst = Behind, AntiCausalLast = East, InitialDirection = InFront, OppositeDirPrefix = 1, OppositeOffset = 3 }; static unsigned int directionBit(Direction d) { static unsigned int b[] = { 1 << (InFront + 1), 1 << (North + 1), 1 << (West + 1), 1 << (Behind + 1), 1 << (South + 1), 1 << (East + 1) }; return b[d]; }; /** The number of valid neighbors if the current center is at the volume border. */ static unsigned int nearBorderDirectionCount(AtVolumeBorder b) { static unsigned int c[] = { 6, 5, 5, 0, 5, 4, 4, 0, 5, 4, 4, 0, 0, 0, 0, 0, 5, 4, 4, 0, 4, 3, 3, 0, 4, 3, 3, 0, 0, 0, 0, 0, 5, 4, 4, 0, 4, 3, 3, 0, 4, 3, 3}; return c[b]; } /** The valid direction codes when the center is at the volume border. \a index must be in the range 0...nearBorderDirectionCount(b)-1. */ static Direction nearBorderDirections(AtVolumeBorder b, int index) { static Direction c[43][6] = { { InFront, North, West, Behind, South, East}, // 0 - NotAtBorder { InFront, North, West, Behind, South, Error}, // 1 - AtRightBorder { InFront, North, Behind, South, East, Error}, // 2 - AtLeftBorder { Error, Error, Error, Error, Error, Error}, { InFront, West, Behind, South, East, Error}, // 4 - AtTopBorder { InFront, West, Behind, South, Error, Error}, // 5 - AtTopRightBorder { InFront, Behind, South, East, Error, Error}, // 6 - AtTopLeftBorder { Error, Error, Error, Error, Error, Error}, { InFront, North, West, Behind, East, Error}, // 8 - AtBottomBorder { InFront, North, West, Behind, Error, Error}, // 9 - AtBottomRightBorder { InFront, North, Behind, East, Error, Error}, //10- AtBottomLeftBorder { Error, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error}, { North, West, Behind, South, East, Error}, //16 - AtFrontBorder { North, West, Behind, South, Error, Error}, //17 - AtFrontRightBorder { North, Behind, South, East, Error, Error}, //18 - AtFrontLeftBorder { Error, Error, Error, Error, Error, Error}, { West, Behind, South, East, Error, Error}, //20 - AtTopFrontBorder { West, Behind, South, Error, Error, Error}, //21 - AtTopRightFrontBorder { Behind, South, East, Error, Error, Error}, //22 - AtTopLeftFrontBorder { Error, Error, Error, Error, Error, Error}, { North, West, Behind, East, Error, Error}, //24 - AtBottomFrontBorder { North, West, Behind, Error, Error, Error}, //25 - AtBottomRightFrontBorder { North, Behind, East, Error, Error, Error}, //26 - AtBottomLeftFrontBorder { Error, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error}, { Error, Error, Error, Error, Error, Error}, { InFront, North, West, South, East,Error}, //32 - AtRearBorder { InFront, North, West, South, Error, Error}, //33 - AtRearRightBorder { InFront, North, South, East, Error, Error}, //34 - AtRearLeftBorder { Error, Error, Error, Error, Error, Error}, { InFront, West, South, East, Error, Error}, //36 - AtTopRearBorder { InFront, West, South, Error, Error, Error}, //37 - AtTopRightRearBorder { InFront, South, East, Error, Error, Error}, //38 - AtTopLeftRearBorder { Error, Error, Error, Error, Error, Error}, { InFront, North, West, East, Error, Error}, //40 - AtBottomRearBorder { InFront, North, West, Error, Error, Error}, //41 - AtBottomRightRearBorder { InFront, North, East, Error, Error, Error} //42 - AtBottomLeftRearBorder }; return c[b][index]; } /** The valid direction three codes in anti causal direction (means: look back in scanline direction)when the center is at the volume border. Should be used with isAtVolumeBorderCausal to determine the Directions, as this avoids using of the nonesense border ids (e.g. 0,1,8,9...) of this table. \a index must be in the range 0...nearBorderDirectionCount(b)-1. */ static Direction nearBorderDirectionsCausal(AtVolumeBorder b, int index) { static Direction c[43][3] = { { InFront, North, West}, // 0 - NotAtBorder -----> should never be used { InFront, North, West}, // 1 - AtRightBorder -----> should never be used { InFront, North, Error}, // 2 - AtLeftBorder { Error, Error, Error}, { InFront, West, Error}, // 4 - AtTopBorder { InFront, West, Error}, // 5 - AtTopRightBorder { InFront, Error,Error}, // 6 - AtTopLeftBorder { Error, Error, Error}, { InFront, North, West}, // 8 - AtBottomBorder -----> should never be used { InFront, North, West}, // 9 - AtBottomRightBorder -----> should never be used { InFront, North, Error}, //10- AtBottomLeftBorder { Error, Error, Error}, { Error, Error, Error}, { Error, Error, Error}, { Error, Error, Error}, { Error, Error, Error}, { North, West, Error}, //16 - AtFrontBorder { North, West, Error}, //17 - AtFrontRightBorder { North, Error, Error}, //18 - AtFrontLeftBorder { Error, Error, Error}, { West, Error, Error}, //20 - AtTopFrontBorder { West, Error, Error}, //21 - AtTopRightFrontBorder { Error, Error, Error}, //22 - AtTopLeftFrontBorder { Error, Error, Error}, { North, West, Error}, //24 - AtBottomFrontBorder { North, West, Error}, //25 - AtBottomRightFrontBorder { North, Error, Error}, //26 - AtBottomLeftFrontBorder { Error, Error, Error}, { Error, Error, Error}, { Error, Error, Error}, { Error, Error, Error}, { Error, Error, Error}, { InFront, North, West}, //32 - AtRearBorder -----> should never be used { InFront, North, West}, //33 - AtRearRightBorder -----> should never be used { InFront, North, Error}, //34 - AtRearLeftBorder { Error, Error, Error}, { InFront, West, Error}, //36 - AtTopRearBorder { InFront, West, Error}, //37 - AtTopRightRearBorder { InFront, Error, Error}, //38 - AtTopLeftRearBorder { Error, Error, Error}, { InFront, North, West}, //40 - AtBottomRearBorder -----> should never be used { InFront, North, West}, //41 - AtBottomRightRearBorder -----> should never be used { InFront, North, Error} //42 - AtBottomLeftRearBorder }; return c[b][index]; } /** transform direction code into corresponding Diff3D offset. (note: there is no bounds checking on the code you pass.) */ static Diff3D const & diff(Direction code) { static Diff3D d[] = { Diff3D( 0, 0, -1), //InFront Diff3D( 0, -1, 0), //North Diff3D( -1, 0, 0), //West Diff3D( 0, 0, 1), //Behind Diff3D( 0, 1, 0), //South Diff3D( 1, 0, 0) //East }; return d[code]; } /** Equivalent to diff(static_cast(code)). (note: there is no bounds checking on the code you pass.) */ static Diff3D const & diff(int code) { return diff(static_cast(code)); } /** Equivalent to diff(code)[dim] */ static int diff(Direction code, int dim) { return diff(code)[dim]; } /** Get the relative offset from one neighbor to the other. For example, relativeDiff(East, West) == multi_differencetype(-2,0,0). (note: there is no bounds checking on the code you pass.) */ static Diff3D const & relativeDiff(Direction fromCode, Direction toCode) { static Diff3D d[6][6] = { // InFront - North - West - Behind - South - East { Diff3D( 0, 0, 0), Diff3D(0, -1, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 2), Diff3D( 0, 1, 1), Diff3D( 1, 0, 1)}, //InFront { Diff3D( 0, 1,-1), Diff3D( 0, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 1), Diff3D( 0, 2, 0), Diff3D( 1, 1, 0)}, //North { Diff3D( 1, 0,-1), Diff3D( 1,-1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 1), Diff3D( 1, 1, 0), Diff3D( 2, 0, 0)}, //West { Diff3D( 0, 0,-2), Diff3D( 0,-1,-1), Diff3D(-1, 0,-1), Diff3D( 0, 0, 0), Diff3D( 0, 1,-1), Diff3D( 1, 0,-1)}, //Behind { Diff3D( 0,-1,-1), Diff3D( 0,-2, 0), Diff3D(-1,-1, 0), Diff3D( 0,-1, 1), Diff3D( 0, 0, 0), Diff3D( 1,-1, 0)}, //South { Diff3D(-1, 0,-1), Diff3D(-1,-1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 1), Diff3D(-1, 1, 0), Diff3D( 0, 0, 0) } //East }; return d[fromCode][toCode]; } /** Equivalent to relativeDiff(static_cast(fromCode), static_cast(toCode)). (note: there is no bounds checking on the code you pass.) */ static Diff3D const & relativeDiff(int fromCode, int toCode) { return relativeDiff(static_cast(fromCode), static_cast(toCode)); } /** X-component of diff() */ static int dX(Direction code) { return diff(code)[0]; } /** Y-component of diff() */ static int dY(Direction code) { return diff(code)[1]; } /** Z-component of diff() */ static int dZ(Direction code) { return diff(code)[2]; } /** X-component of diff() */ static int dX(int code) { return diff(code)[0]; } /** Y-component of diff() */ static int dY(int code) { return diff(code)[1]; } /** Z-component of diff() */ static int dZ(int code) { return diff(code)[2]; } /** transform Diff3D offset into corresponding direction code. The code Direction::Error will be returned if diff is not in the 3DSix-Neighborhood. */ static Direction code(Diff3D const & diff) { switch(diff[0]) { case 0: { switch(diff[1]) { case 0: switch(diff[2]) { case 1: return Behind; case -1: return InFront; default: return Error; } case 1: return (diff[2] == 0) ? South : Error; case -1: return (diff[2] == 0) ? North : Error; default: return Error; } } case -1: return ((diff[1] == 0) && (diff[2] == 0)) ? West : Error; case 1: return ((diff[1] == 0) && (diff[2] == 0)) ? East : Error; } return Error; } /** Check whether a code refers to a diagonal direction. Useful if you want to abstract the differences between 6- and 26-neighborhood. Always false for 6-neighborhood. */ static bool isDiagonal(Direction) { return false; } static Diff3D const & right() { return diff(East); } /**< Offset to the right neighbor */ static Diff3D const & top() { return diff(North); } /**< Offset to the top neighbor */ static Diff3D const & left() { return diff(West); } /**< Offset to the left neighbor */ static Diff3D const & bottom() { return diff(South); } /**< Offset to the bottom neighbor */ static Diff3D const & rear() { return diff(Behind); } /**< Offset to the rear neighbor */ static Diff3D const & front() { return diff(InFront); } /**< Offset to the neighbor in front */ static Diff3D const & east() { return diff(East); } /**< Offset to the east neighbor */ static Diff3D const & north() { return diff(North); } /**< Offset to the north neighbor */ static Diff3D const & west() { return diff(West); } /**< Offset to the west neighbor */ static Diff3D const & south() { return diff(South); } /**< Offset to the south neighbor */ static Diff3D const & behind() { return diff(Behind); } /**< Offset to the rear neighbor */ static Diff3D const & infront() { return diff(InFront); } /**< Offset to the neighbor in front */ }; // class Neighborhood3DSix /** Export NeighborCode3D::Direction into the scope of namespace Neighborhood3DSix. */ typedef NeighborCode3D::Direction Direction; static const Direction East = NeighborCode3D::East; /**< Export NeighborCode3D::East to namespace Neighborhood3DSix */ static const Direction North = NeighborCode3D::North; /**< Export NeighborCode3D::North to namespace Neighborhood3DSix */ static const Direction West = NeighborCode3D::West; /**< Export NeighborCode3D::West to namespace Neighborhood3DSix */ static const Direction South = NeighborCode3D::South; /**< Export NeighborCode3D::South to namespace Neighborhood3DSix */ static const Direction Behind = NeighborCode3D::Behind; /**< Export NeighborCode3D::Behind to namespace Neighborhood3DSix */ static const Direction InFront = NeighborCode3D::InFront; /**< Export NeighborCode3D::InFront to namespace Neighborhood3DSix */ static const Direction DirectionCount = NeighborCode3D::DirectionCount; /**< Export NeighborCode3D::DirectionCount to namespace Neighborhood3DSix */ }//namespace Neighborhood3DSix /** Export \ref vigra::Neighborhood3DSix::NeighborCode3D into the scope of namespace vigra. */ typedef Neighborhood3DSix::NeighborCode3D NeighborCode3DSix; /********************************************************/ /* */ /* Neighborhood3DTwentySix */ /* */ /********************************************************/ /** 3D 26-Neighborhood. */ namespace Neighborhood3DTwentySix { /** \brief Encapsulation of direction management of neighbors for a 3D 26-neighborhood. */ class NeighborCode3D { public: typedef Diff3D difference_type; /** provides enumeration of all directions. DirectionCount may be used for portable loop termination conditions. */ enum Direction { Error = -1, InFrontNorthWest = 0, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West, East, SouthWest, South, SouthEast, BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast, DirectionCount, CausalFirst = InFrontNorthWest, CausalLast = West, AntiCausalFirst = BehindSouthEast, AntiCausalLast = East, InitialDirection = InFrontNorthWest, OppositeDirPrefix = -1, OppositeOffset = 25 }; static unsigned int directionBit(Direction d) { static unsigned int b[] = { 1 << (InFrontNorthWest+1), 1 << (InFrontNorth+1), 1 << (InFrontNorthEast+1), 1 << (InFrontWest+1), 1 << (InFront+1), 1 << (InFrontEast+1), 1 << (InFrontSouthWest+1), 1 << (InFrontSouth+1), 1 << (InFrontSouthEast+1), 1 << (NorthWest+1), 1 << (North+1), 1 << (NorthEast+1), 1 << (West+1), 1 << (East+1), 1 << (SouthWest+1), 1 << (South+1), 1 << (SouthEast+1), 1 << (BehindNorthWest+1), 1 << (BehindNorth+1), 1 << (BehindNorthEast+1), 1 << (BehindWest+1), 1 << (Behind+1), 1 << (BehindEast+1), 1 << (BehindSouthWest+1), 1 << (BehindSouth+1), 1 << (BehindSouthEast+1) }; return b[d]; }; /** The number of valid neighbors if the current center is at the volume border. */ static unsigned int nearBorderDirectionCount(AtVolumeBorder b) { static unsigned int c[] = { 26, 17, 17, 0, 17, 11, 11, 0, 17, 11, 11, 0, 0, 0, 0, 0, 17, 11, 11, 0, 11, 7, 7, 0, 11, 7, 7, 0, 0, 0, 0, 0, 17, 11, 11, 0, 11, 7, 7, 0, 11, 7, 7}; return c[b]; } /** The valid direction codes when the center is at the volume border. \a index must be in the range 0...nearBorderDirectionCount(b)-1. */ static Direction nearBorderDirections(AtVolumeBorder b, int index) { static Direction c[43][26] = { //0 - NotAtBorder { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West, East, SouthWest, South, SouthEast, BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast}, //1 - AtRightBorder { InFrontNorthWest, InFrontNorth, /*InFrontNorthEast,*/ InFrontWest, InFront, /*InFrontEast,*/ InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ NorthWest, North, /*NorthEast,*/ West, /*East,*/ SouthWest, South, /*SouthEast,*/ BehindNorthWest, BehindNorth, /*BehindNorthEast,*/ BehindWest, Behind, /*BehindEast,*/ BehindSouthWest, BehindSouth, /*BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error}, //2 - AtLeftBorder { /*InFrontNorthWest,*/ InFrontNorth, InFrontNorthEast, /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/ InFrontSouth, InFrontSouthEast, /*NorthWest,*/ North, NorthEast, /*West,*/ East, /*SouthWest,*/ South, SouthEast, /*BehindNorthWest,*/ BehindNorth, BehindNorthEast, /*BehindWest,*/ Behind, BehindEast, /*BehindSouthWest,*/ BehindSouth, BehindSouthEast, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //3 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //4 - AtTopBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, /*NorthWest, North, NorthEast,*/ West, East, SouthWest, South, SouthEast, /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //5 - AtTopRightBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ InFrontWest, InFront, /*InFrontEast,*/ InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ West, /*East,*/ SouthWest, South, /*SouthEast,*/ /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ BehindWest, Behind, /*BehindEast,*/ BehindSouthWest, BehindSouth, /*BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //6 - AtTopLeftBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/ InFrontSouth, InFrontSouthEast, /*NorthWest, North, NorthEast,*/ /*West,*/ East, /*SouthWest,*/ South, SouthEast, /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ /*BehindWest, */ Behind, BehindEast, /*BehindSouthWest,*/ BehindSouth, BehindSouthEast, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //7 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //8 - AtBottomBorder { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, NorthEast, West, East, /*SouthWest, South, SouthEast,*/ BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, /*BehindSouthWest, BehindSouth, BehindSouthEast*/ Error, Error, Error, Error, Error, Error, Error, Error, Error}, //9 - AtBottomRightBorder { InFrontNorthWest, InFrontNorth, /*InFrontNorthEast,*/ InFrontWest, InFront, /*InFrontEast,*/ /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, /*NorthEast,*/ West, /*East,*/ /*SouthWest, South, SouthEast,*/ BehindNorthWest, BehindNorth, /*BehindNorthEast,*/ BehindWest, Behind, /*BehindEast,*/ /*BehindSouthWest, BehindSouth, BehindSouthEast*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //10 - AtBottomLeftBorder { /*InFrontNorthWest,*/ InFrontNorth, InFrontNorthEast, /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest,*/ North, NorthEast, /*West,*/ East, /*SouthWest, South, SouthEast,*/ /*BehindNorthWest,*/ BehindNorth, BehindNorthEast, /*BehindWest,*/ Behind, BehindEast, /*BehindSouthWest, BehindSouth, BehindSouthEast*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //11 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //12 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //13 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //14 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //15 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //16 - AtFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, NorthEast, West, East, SouthWest, South, SouthEast, BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //17 - AtFrontRightBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, /*NorthEast,*/ West, /*East,*/ SouthWest, South, /*SouthEast,*/ BehindNorthWest, BehindNorth, /*BehindNorthEast,*/ BehindWest, Behind, /*BehindEast,*/ BehindSouthWest, BehindSouth, /*BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //18 - AtFrontLeftBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest,*/ North, NorthEast, /*West,*/ East, /*SouthWest,*/ South, SouthEast, /*BehindNorthWest,*/ BehindNorth, BehindNorthEast, /*BehindWest,*/ Behind, BehindEast, /*BehindSouthWest,*/ BehindSouth, BehindSouthEast, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //19 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //20 - AtTopFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ West, East, SouthWest, South, SouthEast, /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //21 - AtTopRightFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ West, /*East,*/ SouthWest, South, /*SouthEast,*/ /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ BehindWest, Behind, /*BehindEast,*/ BehindSouthWest, BehindSouth, /*BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //22 - AtTopLeftFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ /*West,*/ East, /*SouthWest,*/ South, SouthEast, /*BehindNorthWest, BehindNorth, BehindNorthEast,*/ /*BehindWest,*/ Behind, BehindEast, /*BehindSouthWest,*/ BehindSouth, BehindSouthEast, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //23 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //24 - AtBottomFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, NorthEast, West, East, /*SouthWest, South, SouthEast,*/ BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, /*BehindSouthWest, BehindSouth, BehindSouthEast*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //25 - AtBottomRightFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, /*NorthEast,*/ West, /* East,*/ /*SouthWest, South, SouthEast,*/ BehindNorthWest, BehindNorth, /*BehindNorthEast,*/ BehindWest, Behind, /*BehindEast,*/ /*BehindSouthWest, BehindSouth, BehindSouthEast*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //26 - AtBottomLeftFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest,*/ North, NorthEast, /*West,*/ East, /*SouthWest, South, SouthEast,*/ /*BehindNorthWest,*/ BehindNorth, BehindNorthEast, /*BehindWest,*/ Behind, BehindEast, /*BehindSouthWest, BehindSouth, BehindSouthEast*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //27 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //28 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //29 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //30 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //31 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //32 - AtRearBorder { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West, East, SouthWest, South, SouthEast, /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error}, //33 - AtRearRightBorder { InFrontNorthWest, InFrontNorth, /*InFrontNorthEast,*/ InFrontWest, InFront, /*InFrontEast,*/ InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ NorthWest, North, /*NorthEast,*/ West, /*East,*/ SouthWest, South, /*SouthEast,*/ /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //34 - AtRearLeftBorder { /*InFrontNorthWest,*/ InFrontNorth, InFrontNorthEast, /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/ InFrontSouth, InFrontSouthEast, /*NorthWest,*/ North, NorthEast, /*West,*/ East, /*SouthWest,*/ South, SouthEast, /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //35 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //36 - AtTopRearBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, /*NorthWest, North, NorthEast,*/ West, East, SouthWest, South, SouthEast, /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //37 - AtTopRightRearBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ InFrontWest, InFront, /*InFrontEast,*/ InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ West, /*East,*/ SouthWest, South, /*SouthEast,*/ /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //38 - AtTopLeftRearBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/ InFrontSouth, InFrontSouthEast, /*NorthWest, North, NorthEast,*/ /*West,*/ East, /*SouthWest,*/ South, SouthEast, /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //39 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //40 - AtBottomRearBorder { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, NorthEast, West, East, /*SouthWest, South, SouthEast,*/ /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //41 - AtBottomRightRearBorder { InFrontNorthWest, InFrontNorth, /*InFrontNorthEast,*/ InFrontWest, InFront, /*InFrontEast,*/ /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, /*NorthEast,*/ West, /*East,*/ /*SouthWest, South, SouthEast,*/ /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //42 - AtBottomLeftRearBorder { /*InFrontNorthWest,*/ InFrontNorth, InFrontNorthEast, /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest,*/ North, NorthEast, /*West,*/ East, /*SouthWest, South, SouthEast,*/ /*BehindNorthWest, BehindNorth, BehindNorthEast, BehindWest, Behind, BehindEast, BehindSouthWest, BehindSouth, BehindSouthEast,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error} }; return c[b][index]; } /** The valid direction three codes in anti causal direction (means: look back in scanline direction)when the center is at the volume border. Should be used with isAtVolumeBorderCausal to determine the Directions, as this avoids using of the nonesense border ids (e.g. 0,1,8,9...) of this table. \a index must be in the range 0...nearBorderDirectionCount(b)-1. */ static Direction nearBorderDirectionsCausal(AtVolumeBorder b, int index) { static Direction c[43][13] = { //0 - NotAtBorder -----> should never be used { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West}, //1 - AtRightBorder -----> should never be used { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West}, //2 - AtLeftBorder { /*InFrontNorthWest,*/ InFrontNorth,InFrontNorthEast, /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, /*NorthWest,*/ North, NorthEast, /*West*/ Error, Error, Error, Error, Error}, //3 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //4 - AtTopBorder { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast,*/ InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, /*NorthWest, North, NorthEast,*/ West, Error, Error, Error, Error, Error, Error}, //5 - AtTopRightBorder { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast,*/ InFrontWest, InFront, /*InFrontEast,*/ InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ West, Error, Error, Error, Error, Error, Error, Error, Error}, //6 - AtTopLeftBorder { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast,*/ /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, /*NorthWest, North, NorthEast,*/ /*West,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error}, //7 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //8 - AtBottomBorder -----> should never be used { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West}, //9 - AtBottomRightBorder -----> should never be used { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West}, //10 - AtBottomLeftBorder { /*InFrontNorthWest,*/InFrontNorth, InFrontNorthEast, /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, /*NorthWest,*/ North, NorthEast, /*West*/ Error, Error, Error, Error, Error}, //11 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //12 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //13 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //14 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //15 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //16 - AtFrontBorder { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, NorthEast, West, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //17 - AtFrontRightBorder { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, /*NorthEast,*/ West, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //18 - AtFrontLeftBorder { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest,*/ North, NorthEast, /*West,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //19 - Nothin' { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //20 - AtTopFrontBorder { /*InFrontNorthWest,InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ West, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //21 - AtTopRightFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ West, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //22 - AtTopLeftFrontBorder { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //23 - Nothin { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //24 - AtBottomFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, NorthEast, West, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //25 - AtBottomRightFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ NorthWest, North, /*NorthEast,*/ West, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //26 - AtBottomLeftFrontBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast,*/ /*NorthWest,*/ North, NorthEast, West, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //27 - Nothin { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //28 - Nothin { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //29 - Nothin { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //30 - Nothin { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //31 - Nothin { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //32 - AtRearBorder -----> should never be used { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West}, //33 - AtRearRightBorder -----> should never be used { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West}, //34 - AtRearLeftBorder { /*InFrontNorthWest,*/InFrontNorth, InFrontNorthEast, /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, /*NorthWest,*/ North, NorthEast, /*West*/ Error, Error, Error, Error, Error}, //35 - Nothin { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //36 - AtTopRearBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, /*NorthWest, North, NorthEast,*/ West, Error, Error, Error, Error, Error, Error}, //37 - AtTopRightRearBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ InFrontWest, InFront, /*InFrontEast,*/ InFrontSouthWest, InFrontSouth, /*InFrontSouthEast,*/ /*NorthWest, North, NorthEast,*/ West, Error, Error, Error, Error, Error, Error, Error, Error}, //38 - AtTopLeftRearBorder { /*InFrontNorthWest, InFrontNorth, InFrontNorthEast,*/ /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,*/InFrontSouth, InFrontSouthEast, /*NorthWest, North, NorthEast,*/ /*West,*/ Error, Error, Error, Error, Error, Error, Error, Error, Error}, //39 - Nothin { Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error, Error}, //40 - AtBottomRearBorder -----> should never be used { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West}, //41 - AtBottomRightRearBorder -----> should never be used { InFrontNorthWest, InFrontNorth, InFrontNorthEast, InFrontWest, InFront, InFrontEast, InFrontSouthWest, InFrontSouth, InFrontSouthEast, NorthWest, North, NorthEast, West}, //42 - AtBottomLeftRearBorder { /*InFrontNorthWest,*/InFrontNorth, InFrontNorthEast, /*InFrontWest,*/ InFront, InFrontEast, /*InFrontSouthWest,InFrontSouth, InFrontSouthEast,*/ /*NorthWest,*/ North, NorthEast, /*West*/ Error, Error, Error, Error, Error, Error, Error} }; return c[b][index]; } /** transform direction code into corresponding Diff3D offset. (note: there is no bounds checking on the code you pass.) */ static Diff3D const & diff(Direction code) { static Diff3D d[] = { Diff3D( -1, -1, -1), //InFrontNorthWest Diff3D( 0, -1, -1), //InFrontNorth Diff3D( 1, -1, -1), //InFrontNorthEast Diff3D( -1, 0, -1), //InFrontWest Diff3D( 0, 0, -1), //InFront Diff3D( 1, 0, -1), //InFrontEast Diff3D( -1, 1, -1), //InFrontSouthWest Diff3D( 0, 1, -1), //InFrontSouth Diff3D( 1, 1, -1), //InFrontSouthEast Diff3D( -1, -1, 0), //NorthWest Diff3D( 0, -1, 0), //North Diff3D( 1, -1, 0), //NorthEast Diff3D( -1, 0, 0), //West Diff3D( 1, 0, 0), //East Diff3D( -1, 1, 0), //SouthWest Diff3D( 0, 1, 0), //South Diff3D( 1, 1, 0), //SouthEast Diff3D( -1, -1, 1), //BehindNorthWest Diff3D( 0, -1, 1), //BehindNorth Diff3D( 1, -1, 1), //BehindNorthEast Diff3D( -1, 0, 1), //BehindWest Diff3D( 0, 0, 1), //Behind Diff3D( 1, 0, 1), //BehindEast Diff3D( -1, 1, 1), //BehindSouthWest Diff3D( 0, 1, 1), //BehindSouth Diff3D( 1, 1, 1), //BehindSouthEast }; return d[code]; } /** Equivalent to diff(static_cast(code)). (note: there is no bounds checking on the code you pass.) */ static Diff3D const & diff(int code) { return diff(static_cast(code)); } /** Equivalent to diff(code)[dim] */ static int diff(Direction code, int dim) { return diff(code)[dim]; } /** Get the relative offset from one neighbor to the other. For example, relativeDiff(East, West) == multi_differencetype(-2,0,0). (note: there is no bounds checking on the code you pass.) */ static Diff3D const relativeDiff(Direction fromCode, Direction toCode) { //Uncomment the following lines may cause the program to crash because of insufficient //static allocatable memory on the stack /* static Diff3D d[][] = { // InFront-NW --- InFront-N --- InFront-NE --- Infront-W --- InFront --- InFront-E --- InFront-SW --- InFront-S --- InFront-SE --- NorthWest --- North --- NorthEast --- West --- East --- SouthWest --- South --- SouthEast --- Behind-NW --- Behind-N --- Behind-NE --- Behind-W --- Behind --- Behind-E --- Behind-SW --- Behind-S --- Behind-SE { Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D( 2, 2, 0), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, 1, 1), Diff3D( 2, 1, 1), Diff3D( 0, 2, 1), Diff3D( 1, 2, 1), Diff3D( 2, 2, 1), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D( 2, 0, 2), Diff3D( 0, 1, 2), Diff3D( 1, 1, 2), Diff3D( 2, 1, 2), Diff3D( 0, 2, 2), Diff3D( 1, 2, 2), Diff3D( 2, 2, 2) }, //InFront-NW { Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D(-1, 1, 1), Diff3D( 1, 1, 1), Diff3D(-1, 2, 1), Diff3D( 0, 2, 1), Diff3D( 1, 2, 1), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D(-1, 1, 2), Diff3D( 0, 1, 2), Diff3D( 1, 1, 2), Diff3D(-1, 2, 2), Diff3D( 0, 2, 2), Diff3D( 1, 2, 2) }, //InFront-N { Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, 2, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, 1, 1), Diff3D( 0, 1, 1), Diff3D(-2, 2, 1), Diff3D(-1, 2, 1), Diff3D( 0, 2, 1), Diff3D(-2, 0, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D(-2, 1, 2), Diff3D(-1, 1, 2), Diff3D( 0, 1, 2), Diff3D(-2, 2, 2), Diff3D(-1, 2, 2), Diff3D( 0, 2, 2) }, //InFront-NE { Diff3D(0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D( 2, -1, 1), Diff3D( 0, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D( 2, 1, 1), Diff3D( 0, -1, 2), Diff3D( 1, -1, 2), Diff3D( 2, -1, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D( 2, 0, 2), Diff3D( 0, 1, 2), Diff3D( 1, 1, 2), Diff3D( 2, 1, 2) }, //Infront-W { Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D(-1, 0, 1), Diff3D( 1, 0, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D(-1, -1, 2), Diff3D( 0, -1, 2), Diff3D( 1, -1, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D(-1, 1, 2), Diff3D( 0, 1, 2), Diff3D( 1, 1, 2) }, //InFront { Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, -1, 1), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D(-2, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, 1, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1), Diff3D(-2, -1, 2), Diff3D(-1, -1, 2), Diff3D( 0, -1, 2), Diff3D(-2, 0, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D(-2, 1, 2), Diff3D(-1, 1, 2), Diff3D( 0, 1, 2) }, //InFront-E { Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D( 2, -2, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, -2, 1), Diff3D( 1, -2, 1), Diff3D( 2, -2, 1), Diff3D( 0, -1, 1), Diff3D( 2, -1, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, -2, 2), Diff3D( 1, -2, 2), Diff3D( 2, -2, 2), Diff3D( 0, -1, 2), Diff3D( 1, -1, 2), Diff3D( 2, -1, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2), Diff3D( 2, 0, 2) }, //InFront-SW { Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, -2, 1), Diff3D( 0, -2, 1), Diff3D( 1, -2, 1), Diff3D(-1, -1, 1), Diff3D( 1, -1, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D(-1, -2, 2), Diff3D( 0, -2, 2), Diff3D( 1, -2, 2), Diff3D(-1, -1, 2), Diff3D( 0, -1, 2), Diff3D( 1, -1, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2), Diff3D( 1, 0, 2) }, //InFront-S { Diff3D(-2, -2, 0), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, -2, 1), Diff3D(-1, -2, 1), Diff3D( 0, -2, 1), Diff3D(-2, -1, 1), Diff3D( 0, -1, 1), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, -2, 2), Diff3D(-1, -2, 2), Diff3D( 0, -2, 2), Diff3D(-2, -1, 2), Diff3D(-1, -1, 2), Diff3D( 0, -1, 2), Diff3D(-2, 0, 2), Diff3D(-1, 0, 2), Diff3D( 0, 0, 2) }, //InFront-SE { Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D( 2, 1, -1), Diff3D( 0, 2, -1), Diff3D( 1, 2, -1), Diff3D( 2, 2, -1), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D( 2, 2, 0), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D( 2, 1, 1), Diff3D( 0, 2, 1), Diff3D( 1, 2, 1), Diff3D( 2, 2, 1) }, //NorthWest { Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D(-1, 2, -1), Diff3D( 0, 2, -1), Diff3D( 1, 2, -1), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 1, 1, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D(-1, 2, 1), Diff3D( 0, 2, 1), Diff3D( 1, 2, 1) }, //North { Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, 1, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D(-2, 2, -1), Diff3D(-1, 2, -1), Diff3D( 0, 2, -1), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, 2, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, 1, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1), Diff3D(-2, 2, 1), Diff3D(-1, 2, 1), Diff3D( 0, 2, 1) }, //NortEast { Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D( 2, -1, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D( 2, 1, -1), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D( 2, -1, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1), Diff3D( 0, 1, 1), Diff3D( 1, 1, 1), Diff3D( 2, 1, 1) }, //West { Diff3D(-2, -1, -1), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, 1, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, -1, 1), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D(-2, 1, 1), Diff3D(-1, 1, 1), Diff3D( 0, 1, 1) }, //East { Diff3D( 0, -2, -1), Diff3D( 1, -2, -1), Diff3D( 2, -2, -1), Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D( 2, -1, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D( 2, -2, 0), Diff3D( 0, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, -2, 1), Diff3D( 1, -2, 1), Diff3D( 2, -2, 1), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D( 2, -1, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1), Diff3D( 2, 0, 1) }, //SouthWest { Diff3D(-1, -2, -1), Diff3D( 0, -2, -1), Diff3D( 1, -2, -1), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D(-1, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, -2, 1), Diff3D( 0, -2, 1), Diff3D( 1, -2, 1), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D( 1, -1, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1), Diff3D( 1, 0, 1) }, //South { Diff3D(-2, -2, -1), Diff3D(-1, -2, -1), Diff3D( 0, -2, -1), Diff3D(-2, -1, -1), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, -2, 0), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D(-2, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, -2, 1), Diff3D(-1, -2, 1), Diff3D( 0, -2, 1), Diff3D(-2, -1, 1), Diff3D(-1, -1, 1), Diff3D( 0, -1, 1), Diff3D(-2, 0, 1), Diff3D(-1, 0, 1), Diff3D( 0, 0, 1) }, //SouthEast { Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D( 2, 0, -2), Diff3D( 0, 1, -2), Diff3D( 1, 1, -2), Diff3D( 2, 1, -2), Diff3D( 0, 2, -2), Diff3D( 1, 2, -2), Diff3D( 2, 2, -2), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, 1, -1), Diff3D( 2, 1, -1), Diff3D( 0, 2, -1), Diff3D( 1, 2, -1), Diff3D( 2, 2, -1), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0), Diff3D( 2, 2, 0) }, //Behind-NW { Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D(-1, 1, -2), Diff3D( 0, 1, -2), Diff3D( 1, 1, -2), Diff3D(-1, 2, -2), Diff3D( 0, 2, -2), Diff3D( 1, 2, -2), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, 1, -1), Diff3D( 1, 1, -1), Diff3D(-1, 2, -1), Diff3D( 0, 2, -1), Diff3D( 1, 2, -1), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0), Diff3D( 1, 2, 0) }, //Behind-N { Diff3D(-2, 0, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D(-2, 1, -2), Diff3D(-1, 1, -2), Diff3D( 0, 1, -2), Diff3D(-2, 2, -2), Diff3D(-1, 2, -2), Diff3D( 0, 2, -2), Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, 1, -1), Diff3D( 0, 1, -1), Diff3D(-2, 2, -1), Diff3D(-1, 2, -1), Diff3D( 0, 2, -1), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D(-2, 2, 0), Diff3D(-1, 2, 0), Diff3D( 0, 2, 0) }, //Behind-NE { Diff3D( 0, -1, -2), Diff3D( 1, -1, -2), Diff3D( 2, -1, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D( 2, 0, -2), Diff3D( 0, 1, -2), Diff3D( 1, 1, -2), Diff3D( 2, 1, -2), Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D( 2, -1, -1), Diff3D( 0, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D( 2, 1, -1), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0), Diff3D( 2, 1, 0) }, //Behind-W { Diff3D(-1, -1, -2), Diff3D( 0, -1, -2), Diff3D( 1, -1, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D(-1, 1, -2), Diff3D( 0, 1, -2), Diff3D( 1, 1, -2), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D( 1, -1, -1), Diff3D(-1, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D( 1, 1, -1), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0), Diff3D( 1, 1, 0) }, //Behind { Diff3D(-2, -1, -2), Diff3D(-1, -1, -2), Diff3D( 0, -1, -2), Diff3D(-2, 0, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D(-2, 1, -2), Diff3D(-1, 1, -2), Diff3D( 0, 1, -2), Diff3D(-2, -1, -1), Diff3D(-1, -1, -1), Diff3D( 0, -1, -1), Diff3D(-2, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, 1, -1), Diff3D(-1, 1, -1), Diff3D( 0, 1, -1), Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D(-2, 1, 0), Diff3D(-1, 1, 0), Diff3D( 0, 1, 0) }, //Behind-E { Diff3D( 0, -2, -2), Diff3D( 1, -2, -2), Diff3D( 2, -2, -2), Diff3D( 0, -1, -2), Diff3D( 1, -1, -2), Diff3D( 2, -1, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D( 2, 0, -2), Diff3D( 0, -2, -1), Diff3D( 1, -2, -1), Diff3D( 2, -2, -1), Diff3D( 0, -1, -1), Diff3D( 2, -1, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D( 2, 0, -1), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D( 2, -2, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D( 2, -1, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0), Diff3D( 2, 0, 0) }, //Behind-SW { Diff3D(-1, -2, -2), Diff3D( 0, -2, -2), Diff3D( 1, -2, -2), Diff3D(-1, -1, -2), Diff3D( 0, -1, -2), Diff3D( 1, -1, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D( 1, 0, -2), Diff3D(-1, -2, -1), Diff3D( 0, -2, -1), Diff3D( 1, -2, -1), Diff3D(-1, -1, -1), Diff3D( 1, -1, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D( 1, 0, -1), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D( 1, -2, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D( 1, -1, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0), Diff3D( 1, 0, 0) }, //Behind-S { Diff3D(-2, -2, -2), Diff3D(-1, -2, -2), Diff3D( 0, -2, -2), Diff3D(-2, -1, -2), Diff3D(-1, -1, -2), Diff3D( 0, -1, -2), Diff3D(-2, 0, -2), Diff3D(-1, 0, -2), Diff3D( 0, 0, -2), Diff3D(-2, -2, -1), Diff3D(-1, -2, -1), Diff3D( 0, -2, -1), Diff3D(-2, -1, -1), Diff3D( 0, -1, -1), Diff3D(-2, 0, -1), Diff3D(-1, 0, -1), Diff3D( 0, 0, -1), Diff3D(-2, -2, 0), Diff3D(-1, -2, 0), Diff3D( 0, -2, 0), Diff3D(-2, -1, 0), Diff3D(-1, -1, 0), Diff3D( 0, -1, 0), Diff3D(-2, 0, 0), Diff3D(-1, 0, 0), Diff3D( 0, 0, 0) } //Behind-SE }; return d[fromCode][toCode]; */ return diff(toCode)-diff(fromCode); } /** Equivalent to relativeDiff(static_cast(fromCode), static_cast(toCode)). (note: there is no bounds checking on the code you pass.) */ static Diff3D const relativeDiff(int fromCode, int toCode) { return relativeDiff(static_cast(fromCode), static_cast(toCode)); } /** X-component of diff() */ static int dX(Direction code) { return diff(code)[0]; } /** Y-component of diff() */ static int dY(Direction code) { return diff(code)[1]; } /** Z-component of diff() */ static int dZ(Direction code) { return diff(code)[2]; } /** X-component of diff() */ static int dX(int code) { return diff(code)[0]; } /** Y-component of diff() */ static int dY(int code) { return diff(code)[1]; } /** Z-component of diff() */ static int dZ(int code) { return diff(code)[2]; } /** transform 6-neighborhood code into 26-neighborhood code. */ static Direction code(Neighborhood3DSix::Direction d) { switch (d){ case Neighborhood3DSix::InFront : return InFront; case Neighborhood3DSix::North : return North; case Neighborhood3DSix::West : return West; case Neighborhood3DSix::East : return East; case Neighborhood3DSix::South : return South; case Neighborhood3DSix::Behind : return Behind; } return Error; } /** transform Diff3D offset into corresponding direction code. The code Direction::Error will be returned if diff is not in the 3DTwentySix-Neighborhood. */ static Direction code(Diff3D const & diff) { switch(diff[0]){ case -1: switch(diff[1]){ case -1: switch(diff[2]){ case -1: return InFrontNorthWest; // ( -1, -1, -1) case 0: return NorthWest; // ( -1, -1, 0) case 1: return BehindNorthWest; // ( -1, -1, 1) } case 0: switch(diff[2]){ case -1: return InFrontWest; // ( -1, 0, -1) case 0: return West; // ( -1, 0, 0) case 1: return BehindWest; // ( -1, 0, 1) } case 1: switch(diff[2]){ case -1: return InFrontSouthWest; // ( -1, 1, -1) case 0: return SouthWest; // ( -1, 1, 0) case 1: return BehindSouthWest; // ( -1, 1, 1) } } case 0: switch(diff[1]){ case -1: switch(diff[2]){ case -1: return InFrontNorth; // ( 0, 0, -1) case 0: return North; // ( 0, -1, 0) case 1: return BehindNorth; // ( 0, -1, 1) } case 0: switch(diff[2]){ case -1: return InFront; // ( 0, 0, -1) case 1: return Behind; // ( 0, 0, 1) } case 1: switch(diff[2]){ case -1: return InFrontSouth; // ( 0, 1, -1) case 0: return South; // ( 0, 1, 0) case 1: return BehindSouth; // ( 0, 1, 1) } } case 1: switch(diff[1]){ case -1: switch(diff[2]){ case -1: return InFrontNorthEast; // ( 1, -1, -1) case 0: return NorthEast; // ( 1, -1, 0) case 1: return BehindNorthEast; // ( 1, -1, 1) } case 0: switch(diff[2]){ case -1: return InFrontEast; // ( 1, 0, -1) case 0: return East; // ( 1, 0, 0) case 1: return BehindEast; // ( 1, 0, 1) } case 1: switch(diff[2]){ case -1: return InFrontSouthEast; // ( 1, 1, -1) case 0: return SouthEast; // ( 1, 1, 0) case 1: return BehindSouthEast; // ( 1, 1, 1) } } } return Error; // better safe than sorry } /** Check whether a code refers to a diagonal direction. Useful if you want to abstract the differences between 6- and 26-neighborhood. Always false for 6-neighborhood. */ static bool isDiagonal(Direction dir) { Diff3D d = diff(dir); if (abs(d[0])+abs(d[1])+abs(d[2])==1) return false; else return true; } static Diff3D const & frontTopLeft() { return diff(InFrontNorthWest); } /**< Offset to the front-top-left neighbor */ static Diff3D const & frontTop() { return diff(InFrontNorth); } /**< Offset to the front-top neighbor */ static Diff3D const & frontTopRight() { return diff(InFrontNorthEast); } /**< Offset to the front-top-right neighbor */ static Diff3D const & frontLeft() { return diff(InFrontWest); } /**< Offset to the front-left neighbor */ static Diff3D const & front() { return diff(InFront); } /**< Offset to the front neighbor */ static Diff3D const & frontRight() { return diff(InFrontEast); } /**< Offset to the front-right neighbor */ static Diff3D const & frontBottomLeft() { return diff(InFrontSouthWest); } /**< Offset to the front-bottom-left neighbor */ static Diff3D const & frontBottom() { return diff(InFrontSouth); } /**< Offset to the front-bottom neighbor */ static Diff3D const & frontBottomRight() { return diff(InFrontSouthEast); } /**< Offset to the front-bottom-right neighbor */ static Diff3D const & topLeft() { return diff(NorthWest); } /**< Offset to the top-left neighbor */ static Diff3D const & top() { return diff(North); } /**< Offset to the top neighbor */ static Diff3D const & topRight() { return diff(NorthEast); } /**< Offset to the top-right neighbor */ static Diff3D const & left() { return diff(West); } /**< Offset to the left neighbor */ static Diff3D const & right() { return diff(East); } /**< Offset to the right neighbor */ static Diff3D const & bottomLeft() { return diff(SouthWest); } /**< Offset to the bottom-left neighbor */ static Diff3D const & bottom() { return diff(South); } /**< Offset to the bottom neighbor */ static Diff3D const & bottomRight() { return diff(SouthEast); } /**< Offset to the bottom-right neighbor */ static Diff3D const & rearTopLeft() { return diff(BehindNorthWest); } /**< Offset to the rear-top-left neighbor */ static Diff3D const & rearTop() { return diff(BehindNorth); } /**< Offset to the rear-top neighbor */ static Diff3D const & rearTopRight() { return diff(BehindNorthEast); } /**< Offset to the rear-top-right neighbor */ static Diff3D const & rearLeft() { return diff(BehindWest); } /**< Offset to the rear-left neighbor */ static Diff3D const & rear() { return diff(Behind); } /**< Offset to the rear neighbor */ static Diff3D const & rearRight() { return diff(BehindEast); } /**< Offset to the rear-right neighbor */ static Diff3D const & rearBottomLeft() { return diff(BehindSouthWest); } /**< Offset to the rear-bottom-left neighbor */ static Diff3D const & rearBottom() { return diff(BehindSouth); } /**< Offset to the rear-bottom neighbor */ static Diff3D const & rearBottomRight() { return diff(BehindSouthEast); } /**< Offset to the rear-bottom-right neighbor */ //----- other namings static Diff3D const & infrontNorthWest() { return diff(InFrontNorthWest); } /**< Offset to the infront-north-west neighbor */ static Diff3D const & infrontNorth() { return diff(InFrontNorth); } /**< Offset to the infront-north neighbor */ static Diff3D const & infrontNorthEast() { return diff(InFrontNorthEast); } /**< Offset to the infront-north-east neighbor */ static Diff3D const & infrontWest() { return diff(InFrontWest); } /**< Offset to the infront-west neighbor */ static Diff3D const & infront() { return diff(InFront); } /**< Offset to the infront neighbor */ static Diff3D const & infrontEast() { return diff(InFrontEast); } /**< Offset to the infront-east neighbor */ static Diff3D const & infrontSouthWest() { return diff(InFrontSouthWest); } /**< Offset to the infront-south-west neighbor */ static Diff3D const & infrontSouth() { return diff(InFrontSouth); } /**< Offset to the infront-south neighbor */ static Diff3D const & infrontSouthEast() { return diff(InFrontSouthEast); } /**< Offset to the infront-south-east neighbor */ static Diff3D const & northWest() { return diff(NorthWest); } /**< Offset to the north-west neighbor */ static Diff3D const & north() { return diff(North); } /**< Offset to the north neighbor */ static Diff3D const & northEast() { return diff(NorthEast); } /**< Offset to the north-east neighbor */ static Diff3D const & west() { return diff(West); } /**< Offset to the west neighbor */ static Diff3D const & east() { return diff(East); } /**< Offset to the right neighbor */ static Diff3D const & southWest() { return diff(SouthWest); } /**< Offset to the south-west neighbor */ static Diff3D const & south() { return diff(South); } /**< Offset to the south neighbor */ static Diff3D const & southEast() { return diff(SouthEast); } /**< Offset to the south-east neighbor */ static Diff3D const & behindNorthWest() { return diff(BehindNorthWest); } /**< Offset to the behind-north-west neighbor */ static Diff3D const & behindNorth() { return diff(BehindNorth); } /**< Offset to the behind-north neighbor */ static Diff3D const & behindNorthEast() { return diff(BehindNorthEast); } /**< Offset to the behind-north-east neighbor */ static Diff3D const & behindEast() { return diff(BehindWest); } /**< Offset to the behind-west neighbor */ static Diff3D const & behind() { return diff(Behind); } /**< Offset to the behind neighbor */ static Diff3D const & behindWest() { return diff(BehindEast); } /**< Offset to the behind-right neighbor */ static Diff3D const & behindSouthWest() { return diff(BehindSouthWest); } /**< Offset to the behind-south-west neighbor */ static Diff3D const & behindSouth() { return diff(BehindSouth); } /**< Offset to the behind-south neighbor */ static Diff3D const & behindSouthEast() { return diff(BehindSouthEast); } /**< Offset to the behind-south-east neighbor */ }; // class Neighborhood3D /** Export NeighborCode3D::Direction into the scope of namespace Neighborhood3DSix. */ typedef NeighborCode3D::Direction Direction; static const Direction InFrontNorthWest = NeighborCode3D::InFrontNorthWest; /**< Export NeighborCode3D::InFrontNorthWest to namespace Neighborhood3DTwentySix */ static const Direction InFrontNorth = NeighborCode3D::InFrontNorth; /**< Export NeighborCode3D::InFrontNorth to namespace Neighborhood3DTwentySix */ static const Direction InFrontNorthEast = NeighborCode3D::InFrontNorthEast; /**< Export NeighborCode3D::InFrontNorthEast to namespace Neighborhood3DTwentySix */ static const Direction InFrontWest = NeighborCode3D::InFrontWest; /**< Export NeighborCode3D::InFrontWest to namespace Neighborhood3DTwentySix */ static const Direction InFront = NeighborCode3D::InFront; /**< Export NeighborCode3D::InFront to namespace Neighborhood3DTwentySix */ static const Direction InFrontEast = NeighborCode3D::InFrontEast; /**< Export NeighborCode3D::InFrontEast to namespace Neighborhood3DTwentySix */ static const Direction InFrontSouthWest = NeighborCode3D::InFrontSouthWest; /**< Export NeighborCode3D::InFrontSouthWest to namespace Neighborhood3DTwentySix */ static const Direction InFrontSouth = NeighborCode3D::InFrontSouth; /**< Export NeighborCode3D::InFrontSouth to namespace Neighborhood3DTwentySix */ static const Direction InFrontSouthEast = NeighborCode3D::InFrontSouthEast; /**< Export NeighborCode3D::InFrontSouthEast to namespace Neighborhood3DTwentySix */ static const Direction NorthWest = NeighborCode3D::NorthWest; /**< Export NeighborCode3D::NorthWest to namespace Neighborhood3DTwentySix */ static const Direction North = NeighborCode3D::North; /**< Export NeighborCode3D::North to namespace Neighborhood3DTwentySix */ static const Direction NorthEast = NeighborCode3D::NorthEast; /**< Export NeighborCode3D::NorthEast to namespace Neighborhood3DTwentySix */ static const Direction West = NeighborCode3D::West; /**< Export NeighborCode3D::West to namespace Neighborhood3DTwentySix */ static const Direction East = NeighborCode3D::East; /**< Export NeighborCode3D::East to namespace Neighborhood3DTwentySix */ static const Direction SouthWest = NeighborCode3D::SouthWest; /**< Export NeighborCode3D::SouthWest to namespace Neighborhood3DTwentySix */ static const Direction South = NeighborCode3D::South; /**< Export NeighborCode3D::South to namespace Neighborhood3DTwentySix */ static const Direction SouthEast = NeighborCode3D::SouthEast; /**< Export NeighborCode3D::SouthEast to namespace Neighborhood3DTwentySix */ static const Direction BehindNorthWest = NeighborCode3D::BehindNorthWest; /**< Export NeighborCode3D::BehindNorthWest to namespace Neighborhood3DTwentySix */ static const Direction BehindNorth = NeighborCode3D::BehindNorth; /**< Export NeighborCode3D::BehindNorth to namespace Neighborhood3DTwentySix */ static const Direction BehindNorthEast = NeighborCode3D::BehindNorthEast; /**< Export NeighborCode3D::BehindNorthEast to namespace Neighborhood3DTwentySix */ static const Direction BehindWest = NeighborCode3D::BehindWest; /**< Export NeighborCode3D::BehindWest to namespace Neighborhood3DTwentySix */ static const Direction Behind = NeighborCode3D::Behind; /**< Export NeighborCode3D::Behind to namespace Neighborhood3DTwentySix */ static const Direction BehindEast = NeighborCode3D::BehindEast; /**< Export NeighborCode3D::BehindEast to namespace Neighborhood3DTwentySix */ static const Direction BehindSouthWest = NeighborCode3D::BehindSouthWest; /**< Export NeighborCode3D::BehindSouthWest to namespace Neighborhood3DTwentySix */ static const Direction BehindSouth = NeighborCode3D::BehindSouth; /**< Export NeighborCode3D::BehindSouth to namespace Neighborhood3DTwentySix */ static const Direction BehindSouthEast = NeighborCode3D::BehindSouthEast; /**< Export NeighborCode3D::BehindSouthEast to namespace Neighborhood3DTwentySix */ static const Direction DirectionCount = NeighborCode3D::DirectionCount; /**< Export NeighborCode3D::DirectionCount to namespace Neighborhood3DTwentySix */ }//namespace Neighborhood3DTwentySix /** Export \ref vigra::Neighborhood3DTwentySix::NeighborCode3D into the scope of namespace vigra. */ typedef Neighborhood3DTwentySix::NeighborCode3D NeighborCode3DTwentySix; //@} } // namespace vigra #endif /* VIGRA_VOXELNEIGHBORHOOD_HXX */ gamera-3.3.3/include/vigra/watersheds.hxx0000644000076500000000000004265311261456425017417 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2005 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_WATERSHEDS_HXX #define VIGRA_WATERSHEDS_HXX #include #include "mathutil.hxx" #include "stdimage.hxx" #include "pixelneighborhood.hxx" namespace vigra { template unsigned int watershedLabeling(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, Neighborhood neighborhood) { int w = lowerrights.x - upperlefts.x; int h = lowerrights.y - upperlefts.y; int x,y,i; SrcIterator ys(upperlefts); SrcIterator xs(ys); // temporary image to store region labels typedef IImage LabelImage; typedef LabelImage::traverser LabelTraverser; LabelImage labelimage(w, h); LabelTraverser yt = labelimage.upperLeft(); LabelTraverser xt(yt); // Kovalevsky's clever idea to use // image iterator and scan order iterator simultaneously LabelImage::ScanOrderIterator label = labelimage.begin(); // initialize the neighborhood circulators NeighborOffsetCirculator ncstart(Neighborhood::CausalFirst); NeighborOffsetCirculator ncstartBorder(Neighborhood::North); NeighborOffsetCirculator ncend(Neighborhood::CausalLast); ++ncend; NeighborOffsetCirculator ncendBorder(Neighborhood::North); ++ncendBorder; // pass 1: scan image from upper left to lower right // to find connected components // Each component will be represented by a tree of pixels. Each // pixel contains the scan order address of its parent in the // tree. In order for pass 2 to work correctly, the parent must // always have a smaller scan order address than the child. // Therefore, we can merge trees only at their roots, because the // root of the combined tree must have the smallest scan order // address among all the tree's pixels/ nodes. The root of each // tree is distinguished by pointing to itself (it contains its // own scan order address). This condition is enforced whenever a // new region is found or two regions are merged xs = ys; xt = yt; *xt = 0; ++xs.x; ++xt.x; for(x = 1; x != w; ++x, ++xs.x, ++xt.x) { if((*xs & Neighborhood::directionBit(Neighborhood::West)) || (xs[Neighborhood::west()] & Neighborhood::directionBit(Neighborhood::East))) { *xt = xt[Neighborhood::west()]; } else { *xt = x; } } ++ys.y; ++yt.y; for(y = 1; y != h; ++y, ++ys.y, ++yt.y) { xs = ys; xt = yt; for(x = 0; x != w; ++x, ++xs.x, ++xt.x) { NeighborOffsetCirculator nc(x == w-1 ? ncstartBorder : ncstart); NeighborOffsetCirculator nce(x == 0 ? ncendBorder : ncend); *xt = x + w*y; // default: new region for(; nc != nce; ++nc) { if((*xs & nc.directionBit()) || (xs[*nc] & nc.oppositeDirectionBit())) { int neighborLabel = xt[*nc]; // find the root label of a label tree while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } if(neighborLabel < *xt) // always keep the smallest among the possible labels { label[*xt] = neighborLabel; *xt = neighborLabel; } else { label[neighborLabel] = *xt; } } } } } // pass 2: assign one label to each region (tree) // so that labels form a consecutive sequence 1, 2, ... DestIterator yd(upperleftd); unsigned int count = 0; i = 0; for(y=0; y != h; ++y, ++yd.y) { DestIterator xd(yd); for(x = 0; x != w; ++x, ++xd.x, ++i) { if(label[i] == i) { label[i] = ++count; } else { label[i] = label[label[i]]; } da.set(label[i], xd); } } return count; } template void prepareWatersheds(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, FourNeighborCode) { int w = lowerrights.x - upperlefts.x; int h = lowerrights.y - upperlefts.y; int x,y; SrcIterator ys(upperlefts); SrcIterator xs(ys); DestIterator yd = upperleftd; for(y = 0; y != h; ++y, ++ys.y, ++yd.y) { xs = ys; DestIterator xd = yd; for(x = 0; x != w; ++x, ++xs.x, ++xd.x) { AtImageBorder atBorder = isAtImageBorder(x,y,w,h); typename SrcAccessor::value_type v = sa(xs); // the following choice causes minima to point // to their lowest neighbor -- would this be better??? // typename SrcAccessor::value_type v = NumericTraits::max(); int o = 0; // means center is minimum if(atBorder == NotAtBorder) { NeighborhoodCirculator c(xs), cend(c); do { if(sa(c) <= v) { v = sa(c); o = c.directionBit(); } } while(++c != cend); } else { RestrictedNeighborhoodCirculator c(xs, atBorder), cend(c); do { if(sa(c) <= v) { v = sa(c); o = c.directionBit(); } } while(++c != cend); } da.set(o, xd); } } } template void prepareWatersheds(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, EightNeighborCode) { int w = lowerrights.x - upperlefts.x; int h = lowerrights.y - upperlefts.y; int x,y; SrcIterator ys(upperlefts); SrcIterator xs(ys); DestIterator yd = upperleftd; for(y = 0; y != h; ++y, ++ys.y, ++yd.y) { xs = ys; DestIterator xd = yd; for(x = 0; x != w; ++x, ++xs.x, ++xd.x) { AtImageBorder atBorder = isAtImageBorder(x,y,w,h); typename SrcAccessor::value_type v = sa(xs); // the following choice causes minima to point // to their lowest neighbor -- would this be better??? // typename SrcAccessor::value_type v = NumericTraits::max(); int o = 0; // means center is minimum if(atBorder == NotAtBorder) { // handle diagonal and principal neighbors separately // so that principal neighbors are preferred when there are // candidates with equal strength NeighborhoodCirculator c(xs, EightNeighborCode::NorthEast); for(int i = 0; i < 4; ++i, c += 2) { if(sa(c) <= v) { v = sa(c); o = c.directionBit(); } } --c; for(int i = 0; i < 4; ++i, c += 2) { if(sa(c) <= v) { v = sa(c); o = c.directionBit(); } } } else { RestrictedNeighborhoodCirculator c(xs, atBorder), cend(c); do { if(!c.isDiagonal()) continue; if(sa(c) <= v) { v = sa(c); o = c.directionBit(); } } while(++c != cend); do { if(c.isDiagonal()) continue; if(sa(c) <= v) { v = sa(c); o = c.directionBit(); } } while(++c != cend); } da.set(o, xd); } } } /** \addtogroup SeededRegionGrowing Region Segmentation Algorithms Region growing, watersheds, and voronoi tesselation */ //@{ /********************************************************/ /* */ /* watersheds */ /* */ /********************************************************/ /** \brief Region Segmentation by means of the watershed algorithm. This function implements the union-find version of the watershed algorithms as described in J. Roerdink, R. Meijster: "The watershed transform: definitions, algorithms, and parallelization stretegies", Fundamenta Informaticae, 41:187-228, 2000 The source image is a boundary indicator such as the gradient magnitude of the trace of the \ref boundaryTensor(). Local minima of the boundary indicator are used as region seeds, and all other pixels are recursively assigned to the same region as their lowest neighbor. Pass \ref vigra::EightNeighborCode or \ref vigra::FourNeighborCode to determine the neighborhood where pixel values are compared. The pixel type of the input image must be LessThanComparable. The function uses accessors. Note that VIGRA provides an alternative implementaion of the watershed transform via \ref seededRegionGrowing(). It is slower, but handles plateaus better and allows to keep a one pixel wide boundary between regions. Declarations: pass arguments explicitly: \code namespace vigra { template unsigned int watersheds(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, Neighborhood neighborhood = EightNeighborCode()) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template unsigned int watersheds(triple src, pair dest, Neighborhood neighborhood = EightNeighborCode()) } \endcode Usage: \#include \<vigra/watersheds.hxx\>
Namespace: vigra Example: watersheds of the gradient magnitude. \code vigra::BImage in(w,h); ... // read input data vigra::FImage gradx(x,y), grady(x,y), gradMag(x,y); gaussianGradient(srcImageRange(src), destImage(gradx), destImage(grady), 3.0); combineTwoImages(srcImageRange(gradx), srcImage(grady), destImage(gradMag), vigra::MagnitudeFunctor()); // the pixel type of the destination image must be large enough to hold // numbers up to 'max_region_label' to prevent overflow vigra::IImage labeling(x,y); int max_region_label = watersheds(srcImageRange(gradMag), destImage(labeling)); \endcode Required Interface: \code SrcImageIterator src_upperleft, src_lowerright; DestImageIterator dest_upperleft; SrcAccessor src_accessor; DestAccessor dest_accessor; // compare src values src_accessor(src_upperleft) <= src_accessor(src_upperleft) // set result int label; dest_accessor.set(label, dest_upperleft); \endcode */ doxygen_overloaded_function(template <...> unsigned int watersheds) template unsigned int watersheds(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da, Neighborhood neighborhood) { SImage orientationImage(lowerrights - upperlefts); SImage::traverser yo = orientationImage.upperLeft(); prepareWatersheds(upperlefts, lowerrights, sa, orientationImage.upperLeft(), orientationImage.accessor(), neighborhood); return watershedLabeling(orientationImage.upperLeft(), orientationImage.lowerRight(), orientationImage.accessor(), upperleftd, da, neighborhood); } template inline unsigned int watersheds(SrcIterator upperlefts, SrcIterator lowerrights, SrcAccessor sa, DestIterator upperleftd, DestAccessor da) { return watersheds(upperlefts, lowerrights, sa, upperleftd, da, EightNeighborCode()); } template inline unsigned int watersheds(triple src, pair dest, Neighborhood neighborhood) { return watersheds(src.first, src.second, src.third, dest.first, dest.second, neighborhood); } template inline unsigned int watersheds(triple src, pair dest) { return watersheds(src.first, src.second, src.third, dest.first, dest.second); } //@} } // namespace vigra #endif // VIGRA_WATERSHEDS_HXX gamera-3.3.3/include/vigra/watersheds3d.hxx0000644000076500000000000005000511261456425017634 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2006-2007 by F. Heinrich, B. Seppke, Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_watersheds3D_HXX #define VIGRA_watersheds3D_HXX #include "voxelneighborhood.hxx" #include "multi_array.hxx" namespace vigra { template int preparewatersheds3D( SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D) { //basically needed for iteration and border-checks int w = srcShape[0], h = srcShape[1], d = srcShape[2]; int x,y,z, local_min_count=0; //declare and define Iterators for all three dims at src SrcIterator zs = s_Iter; SrcIterator ys(zs); SrcIterator xs(ys); //Declare Iterators for all three dims at dest DestIterator zd = d_Iter; for(z = 0; z != d; ++z, ++zs.dim2(), ++zd.dim2()) { ys = zs; DestIterator yd(zd); for(y = 0; y != h; ++y, ++ys.dim1(), ++yd.dim1()) { xs = ys; DestIterator xd(yd); for(x = 0; x != w; ++x, ++xs.dim0(), ++xd.dim0()) { AtVolumeBorder atBorder = isAtVolumeBorder(x,y,z,w,h,d); typename SrcAccessor::value_type v = sa(xs); // the following choice causes minima to point // to their lowest neighbor -- would this be better??? // typename SrcAccessor::value_type v = NumericTraits::max(); int o = 0; // means center is minimum typename SrcAccessor::value_type my_v = v; if(atBorder == NotAtBorder) { #if 0 NeighborhoodTraverser c(xs), cend(c); #endif /* #if 0 */ NeighborhoodCirculator c(xs), cend(c); do { if(sa(c) < v) { v = sa(c); o = c.directionBit(); } else if(sa(c) == my_v && my_v == v) { o = o | c.directionBit(); } } while(++c != cend); } else { #if 0 RestrictedNeighborhoodTraverser c(xs, atBorder), cend(c); #endif /* #if 0 */ RestrictedNeighborhoodCirculator c(xs, atBorder), cend(c); do { if(sa(c) < v) { v = sa(c); o = c.directionBit(); } else if(sa(c) == my_v && my_v == v) { o = o | c.directionBit(); } } while(++c != cend); } if (o==0) local_min_count++; da.set(o, xd); }//end x-iteration }//end y-iteration }//end z-iteration return local_min_count; } template unsigned int watershedLabeling3D( SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D) { //basically needed for iteration and border-checks int w = srcShape[0], h = srcShape[1], d = srcShape[2]; int x,y,z, i; //declare and define Iterators for all three dims at src SrcIterator zs = s_Iter; SrcIterator ys(zs); SrcIterator xs(ys); // temporary image to store region labels typedef vigra::MultiArray<3,int> LabelVolume; typedef LabelVolume::traverser LabelTraverser; LabelVolume labelvolume(srcShape); //Declare traversers for all three dims at target LabelTraverser zt = labelvolume.traverser_begin(); LabelTraverser yt(zt); LabelTraverser xt(yt); // Kovalevsky's clever idea to use // image iterator and scan order iterator simultaneously // memory order indicates label LabelVolume::iterator label = labelvolume.begin(); // initialize the neighborhood traversers #if 0 NeighborOffsetTraverser nc(Neighborhood3D::CausalFirst); NeighborOffsetTraverser nce(Neighborhood3D::CausalLast); #endif /* #if 0 */ NeighborOffsetCirculator nc(Neighborhood3D::CausalFirst); NeighborOffsetCirculator nce(Neighborhood3D::CausalLast); ++nce; // pass 1: scan image from upper left front to lower right back // to find connected components // Each component will be represented by a tree of pixels. Each // pixel contains the scan order address of its parent in the // tree. In order for pass 2 to work correctly, the parent must // always have a smaller scan order address than the child. // Therefore, we can merge trees only at their roots, because the // root of the combined tree must have the smallest scan order // address among all the tree's pixels/ nodes. The root of each // tree is distinguished by pointing to itself (it contains its // own scan order address). This condition is enforced whenever a // new region is found or two regions are merged i=0; for(z = 0; z != d; ++z, ++zs.dim2(), ++zt.dim2()) { ys = zs; yt = zt; for(y = 0; y != h; ++y, ++ys.dim1(), ++yt.dim1()) { xs = ys; xt = yt; for(x = 0; x != w; ++x, ++xs.dim0(), ++xt.dim0(), ++i) { *xt = i; // default: new region //queck whether there is a special borde threatment to be used or not AtVolumeBorder atBorder = isAtVolumeBorderCausal(x,y,z,w,h,z); //We are not at the border! if(atBorder == NotAtBorder) { #if 0 nc = NeighborOffsetTraverser(Neighborhood3D::CausalFirst); #endif /* #if 0 */ nc = NeighborOffsetCirculator(Neighborhood3D::CausalFirst); do { // Direction of NTraversr Neighbor's direction bit is pointing // = Direction of voxel towards us? if((*xs & nc.directionBit()) || (xs[*nc] & nc.oppositeDirectionBit())) { int neighborLabel = xt[*nc]; // find the root label of a label tree while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } if(neighborLabel < *xt) // always keep the smallest among the possible neighbor labels { label[*xt] = neighborLabel; *xt = neighborLabel; } else { label[neighborLabel] = *xt; } } ++nc; }while(nc!=nce); } //we are at a border - handle this!! else { #if 0 nc = NeighborOffsetTraverser(Neighborhood3D::nearBorderDirectionsCausal(atBorder,0)); #endif /* #if 0 */ nc = NeighborOffsetCirculator(Neighborhood3D::nearBorderDirectionsCausal(atBorder,0)); int j=0; while(nc.direction() != Neighborhood3D::Error) { // Direction of NTraversr Neighbor's direction bit is pointing // = Direction of voxel towards us? if((*xs & nc.directionBit()) || (xs[*nc] & nc.oppositeDirectionBit())) { int neighborLabel = xt[*nc]; // find the root label of a label tree while(neighborLabel != label[neighborLabel]) { neighborLabel = label[neighborLabel]; } if(neighborLabel < *xt) // always keep the smallest among the possible neighbor labels { label[*xt] = neighborLabel; *xt = neighborLabel; } else { label[neighborLabel] = *xt; } } nc.turnTo(Neighborhood3D::nearBorderDirectionsCausal(atBorder,++j)); } } } } } // pass 2: assign one label to each region (tree) // so that labels form a consecutive sequence 1, 2, ... DestIterator zd = d_Iter; unsigned int count = 0; i= 0; for(z=0; z != d; ++z, ++zd.dim2()) { DestIterator yd(zd); for(y=0; y != h; ++y, ++yd.dim1()) { DestIterator xd(yd); for(x = 0; x != w; ++x, ++xd.dim0(), ++i) { if(label[i] == i) { label[i] = count++; } else { label[i] = label[label[i]]; // compress trees } da.set(label[i]+1, xd); } } } return count; } /** \addtogroup SeededRegionGrowing Region Segmentation Algorithms Region growing, watersheds, and voronoi tesselation */ //@{ /********************************************************/ /* */ /* watersheds3D */ /* */ /********************************************************/ /** \brief Region Segmentation by means of the watershed algorithm. Declarations: pass arguments explicitly: \code namespace vigra { template unsigned int watersheds3D(SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D neighborhood3D); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template unsigned int watersheds3D(triple src, pair dest, Neighborhood3D neighborhood3D); } \endcode use with 3D-Six-Neighborhood: \code namespace vigra { template unsigned int watersheds3DSix(triple src, pair dest); } \endcode use with 3D-TwentySix-Neighborhood: \code namespace vigra { template unsigned int watersheds3DTwentySix(triple src, pair dest); } \endcode This function implements the union-find version of the watershed algorithms as described in J. Roerdink, R. Meijster: "The watershed transform: definitions, algorithms, and parallelization stretegies", Fundamenta Informaticae, 41:187-228, 2000 The source volume is a boundary indicator such as the gradient magnitude of the trace of the \ref boundaryTensor(). Local minima of the boundary indicator are used as region seeds, and all other voxels are recursively assigned to the same region as their lowest neighbor. Pass \ref vigra::NeighborCode3DSix or \ref vigra::NeighborCode3DTwentySix to determine the neighborhood where voxel values are compared. The voxel type of the input volume must be LessThanComparable. The function uses accessors. ...probably soon in VIGRA: Note that VIGRA provides an alternative implementaion of the watershed transform via \ref seededRegionGrowing3D(). It is slower, but handles plateaus better and allows to keep a one pixel wide boundary between regions. Usage: \#include \<vigra/watersheds3D.hxx\>
Namespace: vigra Example: watersheds3D of the gradient magnitude. \code typedef vigra::MultiArray<3,int> IntVolume; typedef vigra::MultiArray<3,double> DVolume; DVolume src(DVolume::difference_type(w,h,d)); IntVolume dest(IntVolume::difference_type(w,h,d)); float gauss=1; vigra::MultiArray<3, vigra::TinyVector > temp(IntVolume::difference_type(w,h,d)); vigra::gaussianGradientMultiArray(srcMultiArrayRange(vol),destMultiArray(temp),gauss); IntVolume::iterator temp_iter=temp.begin(); for(DVolume::iterator iter=src.begin(); iter!=src.end(); ++iter, ++temp_iter) *iter = norm(*temp_iter); // find 6-connected regions int max_region_label = vigra::watersheds3DSix(srcMultiArrayRange(src), destMultiArray(dest)); // find 26-connected regions max_region_label = vigra::watersheds3DTwentySix(srcMultiArrayRange(src), destMultiArray(dest)); \endcode Required Interface: \code SrcIterator src_begin; SrcShape src_shape; DestIterator dest_begin; SrcAccessor src_accessor; DestAccessor dest_accessor; // compare src values src_accessor(src_begin) <= src_accessor(src_begin) // set result int label; dest_accessor.set(label, dest_begin); \endcode */ doxygen_overloaded_function(template <...> unsigned int watersheds3D) template unsigned int watersheds3D( SrcIterator s_Iter, SrcShape srcShape, SrcAccessor sa, DestIterator d_Iter, DestAccessor da, Neighborhood3D neighborhood3D) { //create temporary volume to store the DAG of directions to minima if ((int)Neighborhood3D::DirectionCount>7){ //If we have 3D-TwentySix Neighborhood vigra::MultiArray<3,int> orientationVolume(srcShape); int local_min_count= preparewatersheds3D( s_Iter, srcShape, sa, destMultiArray(orientationVolume).first, destMultiArray(orientationVolume).second, neighborhood3D); return watershedLabeling3D( srcMultiArray(orientationVolume).first, srcShape, srcMultiArray(orientationVolume).second, d_Iter, da, neighborhood3D); } else{ vigra::MultiArray<3,unsigned char> orientationVolume(srcShape); int local_min_count= preparewatersheds3D( s_Iter, srcShape, sa, destMultiArray(orientationVolume).first, destMultiArray(orientationVolume).second, neighborhood3D); return watershedLabeling3D( srcMultiArray(orientationVolume).first, srcShape, srcMultiArray(orientationVolume).second, d_Iter, da, neighborhood3D); } } template inline unsigned int watersheds3DSix( vigra::triple src, vigra::pair dest) { return watersheds3D(src.first, src.second, src.third, dest.first, dest.second, NeighborCode3DSix()); } template inline unsigned int watersheds3DTwentySix( vigra::triple src, vigra::pair dest) { return watersheds3D(src.first, src.second, src.third, dest.first, dest.second, NeighborCode3DTwentySix()); } }//namespace vigra #endif //VIGRA_watersheds3D_HXX gamera-3.3.3/include/vigra/windows.h0000644000076500000000000000573610714675672016372 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2002-2003 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.5.0, Dec 07 2006 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* koethe@informatik.uni-hamburg.de or */ /* vigra@kogs1.informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_WINDOWS_H #define VIGRA_WINDOWS_H // prevent the global namespace to become polluted with // badly named Windows macros #if defined(_WIN32) # define VC_EXTRALEAN # define NOMINMAX # include # undef NOMINMAX # ifdef DIFFERENCE # undef DIFFERENCE # endif #endif #endif /* VIGRA_WINDOWS_H */ gamera-3.3.3/include/vigra_iterators.hpp0000644000076500000000000003010611240323133017272 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 1998-2001 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.1.4, Nov 23 2001 ) */ /* You may use, modify, and distribute this software according */ /* to the terms stated in the LICENSE file included in */ /* the VIGRA distribution. */ /* */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* koethe@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef kwm05192002_vigra_iterator #define kwm05192002_vigra_iterator #include "vigra/utilities.hxx" #include "vigra/iteratortraits.hxx" #include "accessor.hpp" #include "image_view_iterators.hpp" #include "iterator_base.hpp" namespace Gamera { template class ImageIteratorBase { public: typedef ValueType PixelType; typedef ValueType value_type; class MoveX { public: MoveX & operator=(MoveX const & rhs) { current_ = rhs.current_; return *this; } void operator++() {++current_;} void operator++(int) {++current_;} void operator--() {--current_;} void operator--(int) {--current_;} void operator+=(int dx) {current_ += dx; } void operator-=(int dx) {current_ -= dx; } bool operator==(MoveX const & rhs) const { return current_ == rhs.current_; } bool operator!=(MoveX const & rhs) const { return current_ != rhs.current_; } bool operator<(MoveX const & rhs) const { return current_ < rhs.current_; } bool operator<=(MoveX const & rhs) const { return current_ <= rhs.current_; } bool operator>(MoveX const & rhs) const { return current_ > rhs.current_; } bool operator>=(MoveX const & rhs) const { return current_ >= rhs.current_; } int operator-(MoveX const & rhs) const { return current_ - rhs.current_; } MoveX(Iterator base) : current_(base) {} MoveX(MoveX const & rhs) : current_(rhs.current_) {} Iterator current_; }; class MoveY { public: MoveY & operator=(MoveY const & rhs) { width_ = rhs.width_; offset_ = rhs.offset_; return *this; } void operator++() {offset_ += width_; } void operator++(int) {offset_ += width_; } void operator--() {offset_ -= width_; } void operator--(int) {offset_ -= width_; } void operator+=(int dy) {offset_ += dy*width_; } void operator-=(int dy) {offset_ -= dy*width_; } bool operator==(MoveY const & rhs) const { return (offset_ == rhs.offset_); } bool operator!=(MoveY const & rhs) const { return (offset_ != rhs.offset_); } bool operator<(MoveY const & rhs) const { return (offset_ < rhs.offset_); } bool operator<=(MoveY const & rhs) const { return (offset_ <= rhs.offset_); } bool operator>(MoveY const & rhs) const { return (offset_ > rhs.offset_); } bool operator>=(MoveY const & rhs) const { return (offset_ >= rhs.offset_); } int operator-(MoveY const & rhs) const { return ((offset_ - rhs.offset_) / width_); } MoveY(size_t width) : width_(width), offset_(0) {} MoveY(MoveY const & rhs) : width_(rhs.width_), offset_(rhs.offset_) {} int width_; int offset_; }; bool operator==(ImageIteratorBase const & rhs) const { return (x == rhs.x) && (y == rhs.y); } bool operator!=(ImageIteratorBase const & rhs) const { return (x != rhs.x) || (y != rhs.y); } Diff2D operator-(ImageIteratorBase const & rhs) const { return Diff2D(x - rhs.x, y - rhs.y); } MoveX x; MoveY y; protected: ImageIteratorBase(Iterator base, size_t width) : x(base), y(width) {} ImageIteratorBase(const ImageIteratorBase & rhs) : x(rhs.x), y(rhs.y) {} ImageIteratorBase() : x(Iterator()), y(0) {} ImageIteratorBase & operator=(const ImageIteratorBase & rhs) { if(this != &rhs) { x = rhs.x; y = rhs.y; } return *this; } ImageIteratorBase & operator+=(Diff2D const & s) { x += s.x; y += s.y; return *this; } ImageIteratorBase & operator-=(Diff2D const & s) { x -= s.x; y -= s.y; return *this; } int width() const { return y.width_; } }; template class ImageIterator : public ImageIteratorBase { public: using ImageIteratorBase::x; using ImageIteratorBase::y; using ImageIteratorBase::width; typedef typename Image::value_type value_type; typedef value_type PixelType; typedef typename Image::reference reference; typedef reference index_reference; typedef typename Image::pointer pointer; typedef Diff2D difference_type; typedef image_traverser_tag iterator_category; typedef I row_iterator; typedef ImageViewDetail::RowIterator column_iterator; ImageIterator(Image* mat, I base, size_t offset) : ImageIteratorBase(base, offset), m_mat(mat) { } ImageIterator(const ImageIterator & rhs) : ImageIteratorBase(rhs), m_mat(NULL) { m_mat = rhs.m_mat; } ImageIterator() : ImageIteratorBase(), m_mat(NULL) {} ImageIterator & operator=(const ImageIterator & rhs) { if(this != &rhs) { ImageIteratorBase::operator=(rhs); } return *this; } ImageIterator & operator+=(Diff2D const & s) { ImageIteratorBase::operator+=(s); return *this; } ImageIterator & operator-=(Diff2D const & s) { ImageIteratorBase::operator-=(s); return *this; } Diff2D operator-(ImageIterator const & rhs) const { return Diff2D(x - rhs.x, y - rhs.y); } ImageIterator operator+(Diff2D const & s) const { ImageIterator ret(*this); ret += s; return ret; } ImageIterator operator-(Diff2D const & s) const { ImageIterator ret(*this); ret -= s; return ret; } value_type operator*() const { return *(x.current_ + y.offset_); } pointer operator->() const { return const_cast(&*x.current_); } value_type operator[](Diff2D const & d) const { return m_accessor(x.current_ + d.x + (d.y * width())); } value_type operator()(int dx, int dy) const { return m_accessor(x.current_ + dx + (dy * width())); } row_iterator operator[](int dy) const { return x.current_ + (dy * width()); } row_iterator rowIterator() const { return x.current_ + y.offset_; } column_iterator columnIterator() const { return column_iterator(m_mat, x.current_ + y.offset_); } value_type get() const { return m_accessor(x.current_ + y.offset_); } void set(value_type v) { m_accessor.set(v, x.current_ + y.offset_); } private: ImageAccessor m_accessor; Image* m_mat; }; template class ConstImageIterator : public ImageIteratorBase { public: using ImageIteratorBase::x; using ImageIteratorBase::y; using ImageIteratorBase::width; typedef typename Image::value_type value_type; typedef value_type PixelType; typedef typename Image::reference reference; typedef reference index_reference; typedef typename Image::pointer pointer; typedef Diff2D difference_type; typedef image_traverser_tag iterator_category; typedef I row_iterator; typedef ImageViewDetail::ConstRowIterator column_iterator; ConstImageIterator(Image* mat, I base, size_t offset) : ImageIteratorBase(base, offset), m_mat(mat) { } ConstImageIterator(const ConstImageIterator & rhs) : ImageIteratorBase(rhs) { m_mat = rhs.m_mat; } ConstImageIterator() : ImageIteratorBase() {} ConstImageIterator & operator=(const ConstImageIterator & rhs) { if(this != &rhs) { ImageIteratorBase::operator=(rhs); } return *this; } ConstImageIterator & operator+=(Diff2D const & s) { ImageIteratorBase::operator+=(s); return *this; } ConstImageIterator & operator-=(Diff2D const & s) { ImageIteratorBase::operator-=(s); return *this; } Diff2D operator-(ConstImageIterator const & rhs) const { return Diff2D(x - rhs.x, y - rhs.y); } ConstImageIterator operator+(Diff2D const & s) const { ConstImageIterator ret(*this); ret += s; return ret; } ConstImageIterator operator-(Diff2D const & s) const { ConstImageIterator ret(*this); ret -= s; return ret; } value_type operator*() const { return *(x.current_ + y.offset_); } pointer operator->() const { return const_cast(&*x.current_); } value_type operator[](Diff2D const & d) const { return m_accessor(x.current_ + d.x + (d.y * width())); } value_type operator()(int dx, int dy) const { return m_accessor(x.current_ + dx + (dy * width())); } row_iterator operator[](int dy) const { return x.current_ + dy * width(); } row_iterator rowIterator() const { return x.current_ + y.offset_; } column_iterator columnIterator() const { return column_iterator(m_mat, x.current_ + y.offset_); } value_type get() const { return m_accessor(x.current_ + y.offset_); } private: ImageAccessor m_accessor; Image* m_mat; }; } #endif gamera-3.3.3/include/vigra_support.hpp0000644000076500000000000007317111652050140017005 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2009 Jonathan Koch * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ /* Much of this code is a modified version of Vigra code and should be covered by the following copyright information: */ /************************************************************************/ /* */ /* Copyright 1998-2001 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.1.4, Nov 23 2001 ) */ /* ( Version 1.1.4, Nov 23 2001 ) */ /* You may use, modify, and distribute this software according */ /* to the terms stated in the LICENSE file included in */ /* the VIGRA distribution. */ /* */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* koethe@informatik.uni-hamburg.de */ /* */ /* THIS SOFTWARE IS PROVIDED AS IS AND WITHOUT ANY EXPRESS OR */ /* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ /* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* */ /************************************************************************/ #ifndef kwm03072002_vigra_support #define kwm03072002_vigra_support #include "vigra/rgbvalue.hxx" #include "vigra/accessor.hxx" #include "vigra/interpolating_accessor.hxx" #include "image_types.hpp" #include "static_image.hpp" using namespace vigra; /* This is the necessary support to use the VIGRA library. Included are convenience functions to make the calling of the vigra library algorithms easiers and accessors for a variety of Gamera image types. The accessor also invert 0 and 1 from the Gamera standards for OneBitPixel for interoperability with vigra. */ namespace Gamera { template class Accessor { public: typedef T value_type; typedef T VALUETYPE; template VALUETYPE operator()(ITERATOR const & i) const { return m_accessor(i); } template VALUETYPE operator()(ITERATOR & i, DIFFERENCE diff) const { ITERATOR tmp = i + diff; return m_accessor(tmp); } template void set(V const & value, ITERATOR & i) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); m_accessor.set(tmp, i); } template void set(V const & value, ITERATOR & i, DIFFERENCE diff) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); ITERATOR tmpi = i + diff; m_accessor.set(tmp, tmpi); } ImageAccessor m_accessor; }; template class SequenceAccessor : public Gamera::Accessor { public: typedef typename SEQUENCE::value_type component_type; typedef typename SEQUENCE::iterator iterator; template iterator begin(ITERATOR & i) const { return (*i).begin(); } template iterator end(ITERATOR & i) const { return (*i).end(); } template iterator begin(ITERATOR & i, DIFFERENCE diff) const { return i[diff].begin(); } template iterator end(ITERATOR & i, DIFFERENCE diff) const { return i[diff].end(); } template int size(ITERATOR & i) const { return (*i).size(); } template int size(ITERATOR & i, DIFFERENCE diff) const { return i[diff].size(); } }; template class VectorAccessor : public Gamera::SequenceAccessor { public: typedef typename VECTOR::value_type component_type; template component_type getComponent(ITERATOR & i, int idx) const { return (*i)[idx]; } template void setComponent(V const & value, ITERATOR & i, int idx) const { (*i)[idx] = detail::RequiresExplicitCast::cast(value); } template component_type getComponent(ITERATOR & i, DIFFERENCE diff, int idx) const { return i[diff][idx]; } template void setComponent(V const & value, ITERATOR & i, DIFFERENCE diff, int idx) const { i[diff][idx] = detail::RequiresExplicitCast::cast(value); } }; template class RGBAccessor : public Gamera::VectorAccessor { public: typedef typename RGBVALUE::value_type component_type; template component_type red(RGBIterator & rgb) const { return (*rgb).red(); } template void setRed(V value, RGBIterator & rgb) const { (*rgb).setRed(value); } template component_type red(RGBIterator & rgb, DIFFERENCE diff) const { return rgb[diff].red(); } template void setRed(V value, RGBIterator & rgb, DIFFERENCE diff) const { rgb[diff].setRed(value); } template component_type green(RGBIterator & rgb) const { return (*rgb).green(); } template void setGreen(V value, RGBIterator & rgb) const { (*rgb).setGreen(value); } template component_type green(RGBIterator & rgb, DIFFERENCE d) const { return rgb[d].green(); } template void setGreen(V value, RGBIterator & rgb, DIFFERENCE d) const { rgb[d].setGreen(value); } template component_type blue(RGBIterator & rgb) const { return (*rgb).blue(); } template void setBlue(V value, RGBIterator & rgb) const { (*rgb).setBlue(value); } template component_type blue(RGBIterator & rgb, DIFFERENCE d) const { return rgb[d].blue(); } template void setBlue(V value, RGBIterator & rgb, DIFFERENCE d) const { rgb[d].setBlue(value); } // template // void set(RGBValue value, RGBIterator& rgb) const { // typedef typename RGBVALUE::value_type V; // (*rgb).setRGB(NumericTraits::fromPromote(value.red()), // NumericTraits::fromPromote(value.green()), // NumericTraits::fromPromote(value.blue())); // } }; class ComplexRealAccessor { public: /// The accessor's value type. typedef double value_type; /// Read real part at iterator position. template value_type operator()(Iterator const & i) const { return (*i).real(); } /// Read real part at offset from iterator position. template value_type operator()(Iterator const & i, Difference d) const { return (*(i+d)).real(); } /// Write real part at iterator position. template void set(value_type const & v, Iterator const & i) const { (*i) = v; } /// Write real part at offset from iterator position. template void set(value_type const & v, Iterator const & i, Difference d) const { (*(i+d)) = v; } }; class RGBRealAccessor { public: /// The accessor's value type. typedef double value_type; /// Read real part at iterator position. template value_type operator()(Iterator const & i) const { return (*i).luminance(); } /// Read real part at offset from iterator position. template value_type operator()(Iterator const & i, Difference d) const { return (*(i+d)).luminance(); } /// Write real part at iterator position. template void set(value_type const & v, Iterator const & i) const { (*i).setRed(v); (*i).setGreen(v); (*i).setBlue(v); } /// Write real part at offset from iterator position. template void set(value_type const & v, Iterator const & i, Difference d) const { (*(i+d)).setRed(v); (*(i+d)).setGreen(v); (*(i+d)).setBlue(v); } }; /* The CCAccessor provides filtering of pixels based on an image label. This serves the same purpose as the CCProxy in connected_component_iterators.hpp. */ class CCAccessor { public: typedef OneBitPixel value_type; typedef OneBitPixel VALUETYPE; CCAccessor(OneBitPixel label) : m_label(label) { } template VALUETYPE operator()(ITERATOR const & i) const { if (m_label == m_accessor(i)) return 0; else return 1; } template VALUETYPE operator()(ITERATOR & i, DIFFERENCE diff) const { ITERATOR tmp = i + diff; if (m_label == m_accessor(tmp)) return 0; else return 1; } template void set(V const & value, ITERATOR & i) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); if (m_accessor(i) == m_label) { if (tmp) { m_accessor.set(0, i); } else { m_accessor.set(m_label, i); } } } template void set(V const & value, ITERATOR & i, DIFFERENCE diff) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); ITERATOR tmpi = i + diff; if (m_accessor(tmpi) == m_label) { if (tmp) { m_accessor.set(0, tmpi); } else { m_accessor.set(m_label, tmpi); } } } OneBitPixel m_label; ImageAccessor m_accessor; }; class RawCCAccessor { public: typedef OneBitPixel value_type; typedef OneBitPixel VALUETYPE; RawCCAccessor(OneBitPixel label) : m_label(label) { } template VALUETYPE operator()(ITERATOR const & i) const { if (m_label == m_accessor(i)) return 1; else return 0; } template VALUETYPE operator()(ITERATOR & i, DIFFERENCE diff) const { ITERATOR tmp = i + diff; if (m_label == m_accessor(tmp)) return 1; else return 0; } template void set(V const & value, ITERATOR & i) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); if (m_accessor(i) == m_label) { if (tmp) { m_accessor.set(m_label, i); } else { m_accessor.set(0, i); } } } template void set(V const & value, ITERATOR & i, DIFFERENCE diff) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); ITERATOR tmpi = i + diff; if (m_accessor(tmpi) == m_label) { if (tmp) { m_accessor.set(m_label, tmpi); } else { m_accessor.set(0, tmpi); } } } OneBitPixel m_label; ImageAccessor m_accessor; }; /**********************************************/ /* The MLCCAccessor provides filtering of pixels based on an image label. This serves the same purpose as the MLCCProxy in connected_component_iterators.hpp. */ class MLCCAccessor { public: typedef OneBitPixel value_type; typedef OneBitPixel VALUETYPE; MLCCAccessor(const std::map* labels){ m_labels=labels; } inline bool has_label(value_type value) const { return m_labels->find(value)==m_labels->end(); } template VALUETYPE operator()(ITERATOR const & i) const { if (has_label(m_accessor(i))) return 0; else return 1; } template VALUETYPE operator()(ITERATOR & i, DIFFERENCE diff) const { ITERATOR tmp = i + diff; if (has_label(m_accessor(tmp))) return 0; else return 1; } template void set(V const & value, ITERATOR & i) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); value_type val=m_accessor(i); if (has_label(val)) { if (tmp) { m_accessor.set(0, i); } else { m_accessor.set(val, i); } } } template void set(V const & value, ITERATOR & i, DIFFERENCE diff) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); ITERATOR tmpi = i + diff; value_type val=m_accessor(tmpi); if (has_label(val)) { if (tmp) { m_accessor.set(0, tmpi); } else { m_accessor.set(val, tmpi); } } } const std::map* m_labels; ImageAccessor m_accessor; }; class RawMLCCAccessor { public: typedef OneBitPixel value_type; typedef OneBitPixel VALUETYPE; RawMLCCAccessor(const std::map* labels){ m_labels=labels; } inline bool has_label(value_type value) const { return m_labels->find(value)==m_labels->end(); } template VALUETYPE operator()(ITERATOR const & i) const { if (has_label(m_accessor(i))) return 1; else return 0; } template VALUETYPE operator()(ITERATOR & i, DIFFERENCE diff) const { ITERATOR tmp = i + diff; if (has_label(m_accessor(tmp))) return 1; else return 0; } template void set(V const & value, ITERATOR & i) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); value_type val=m_accessor(i); if (has_label(val)) { if (tmp) { m_accessor.set(val, i); } else { m_accessor.set(0, i); } } } template void set(V const & value, ITERATOR & i, DIFFERENCE diff) const { VALUETYPE tmp = vigra::detail::RequiresExplicitCast::cast(value); ITERATOR tmpi = i + diff; value_type val=m_accessor(tmpi); if (has_label(val)) { if (tmp) { m_accessor.set(val, tmpi); } else { m_accessor.set(0, tmpi); } } } const std::map* m_labels; ImageAccessor m_accessor; }; /**********************************************/ /* The OneBitAccessor hides the fact that OneBitValues can be something other than 0 or 1 in Gamera images. */ class OneBitAccessor { public: typedef OneBitPixel value_type; typedef OneBitPixel VALUETYPE; template VALUETYPE operator()(ITERATOR const & i) const { if (m_accessor(i)) return 0; else return 1; } template VALUETYPE operator()(ITERATOR & i, DIFFERENCE diff) const { if (m_accessor(i + diff)) return 0; else return 1; } template void set(V const & value, ITERATOR & i) const { if (value) m_accessor.set(0, i); else m_accessor.set(1, i); } template void set(V const & value, ITERATOR & i, DIFFERENCE diff) const { if (value) m_accessor.set(0, i + diff); else m_accessor.set(1, i + diff); } ImageAccessor m_accessor; }; // A OneBitAccessor that doesn't do any pixel inversion. Should // only be used when converting a OneBit image to another OneBit image. class RawOneBitAccessor { public: typedef OneBitPixel value_type; typedef OneBitPixel VALUETYPE; template VALUETYPE operator()(ITERATOR const & i) const { return m_accessor(i); } template VALUETYPE operator()(ITERATOR & i, DIFFERENCE diff) const { return m_accessor(i + diff); } template void set(V const & value, ITERATOR & i) const { if (value) m_accessor.set(1, i); else m_accessor.set(0, i); } template void set(V const & value, ITERATOR & i, DIFFERENCE diff) const { if (value) m_accessor.set(1, i + diff); else m_accessor.set(0, i + diff); } ImageAccessor m_accessor; }; /* These classes are used to make the selection of the appropriate accessor for a given type easier. They are, in essence, compile time factories that use specialization to choose the correct types. Also, the make_accessor static function is used to give the same function signature regardless of the arguments to the accessor. */ template struct choose_accessor { typedef Accessor accessor; static accessor make_accessor(const T& mat) { return accessor(); } typedef Accessor raw_accessor; static raw_accessor make_raw_accessor(const T& mat) { return raw_accessor(); } typedef accessor real_accessor; static real_accessor make_real_accessor(const T& mat) { return real_accessor(); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(const T& mat) { return interp_accessor(make_raw_accessor(mat)); } }; template<> struct choose_accessor { typedef Gamera::RGBAccessor accessor; static accessor make_accessor(const RGBImageView& mat) { return accessor(); } typedef Gamera::RGBAccessor raw_accessor; static raw_accessor make_raw_accessor(const RGBImageView& mat) { return raw_accessor(); } typedef RGBRealAccessor real_accessor; static real_accessor make_real_accessor(const RGBImageView& mat) { return real_accessor(); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(const RGBImageView& mat) { return interp_accessor(make_raw_accessor(mat)); } }; template<> struct choose_accessor { typedef Accessor accessor; static accessor make_accessor(const ComplexImageView& mat) { return accessor(); } typedef Accessor raw_accessor; static raw_accessor make_raw_accessor(const ComplexImageView& mat) { return raw_accessor(); } typedef ComplexRealAccessor real_accessor; static real_accessor make_real_accessor(const ComplexImageView& mat) { return real_accessor(); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(const ComplexImageView& mat) { return interp_accessor(make_raw_accessor(mat)); } }; template<> struct choose_accessor { typedef OneBitAccessor accessor; static accessor make_accessor(const OneBitImageView& mat) { return accessor(); } typedef RawOneBitAccessor raw_accessor; static raw_accessor make_raw_accessor(const OneBitImageView& mat) { return raw_accessor(); } typedef accessor real_accessor; static real_accessor make_real_accessor(const OneBitImageView& mat) { return real_accessor(); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(const OneBitImageView& mat) { return interp_accessor(make_raw_accessor(mat)); } }; template<> struct choose_accessor { typedef OneBitAccessor accessor; static accessor make_accessor(const OneBitRleImageView& mat) { return accessor(); } typedef RawOneBitAccessor raw_accessor; static raw_accessor make_raw_accessor(const OneBitRleImageView& mat) { return raw_accessor(); } typedef accessor real_accessor; static real_accessor make_real_accessor(const OneBitRleImageView& mat) { return real_accessor(); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(const OneBitRleImageView& mat) { return interp_accessor(make_raw_accessor(mat)); } }; template<> struct choose_accessor > { typedef OneBitAccessor accessor; static accessor make_accessor(const StaticImage& mat) { return accessor(); } typedef RawOneBitAccessor raw_accessor; static raw_accessor make_raw_accessor(const StaticImage& mat) { return raw_accessor(); } typedef accessor real_accessor; static real_accessor make_real_accessor(const StaticImage& mat) { return real_accessor(); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(const StaticImage& mat) { return interp_accessor(make_raw_accessor(mat)); } }; template<> struct choose_accessor { typedef CCAccessor accessor; static accessor make_accessor(const Cc& mat) { return accessor(mat.label()); } typedef RawCCAccessor raw_accessor; static raw_accessor make_raw_accessor(const Cc& mat) { return raw_accessor(mat.label()); } typedef accessor real_accessor; static real_accessor make_real_accessor(const Cc& mat) { return real_accessor(mat.label()); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(const Cc& mat) { return interp_accessor(make_raw_accessor(mat)); } }; template<> struct choose_accessor { typedef MLCCAccessor accessor; static accessor make_accessor(const MlCc& mat) { return accessor(mat.get_labels_pointer()); } typedef RawMLCCAccessor raw_accessor; static raw_accessor make_raw_accessor(const MlCc& mat) { return raw_accessor(mat.get_labels_pointer()); } typedef accessor real_accessor; static real_accessor make_real_accessor(const MlCc& mat) { return real_accessor(mat.get_labels_pointer()); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(MlCc& mat) { return interp_accessor(make_raw_accessor(mat)); } }; template<> struct choose_accessor { typedef CCAccessor accessor; static accessor make_accessor(const RleCc& mat) { return accessor(mat.label()); } typedef RawCCAccessor raw_accessor; static raw_accessor make_raw_accessor(const RleCc& mat) { return raw_accessor(mat.label()); } typedef accessor real_accessor; static real_accessor make_real_accessor(const RleCc& mat) { return real_accessor(mat.label()); } typedef BilinearInterpolatingAccessor interp_accessor; static interp_accessor make_interp_accessor(const RleCc& mat) { return interp_accessor(make_raw_accessor(mat)); } }; /* These three functions are for convenience. They create the arguments for Vigra algorithms including the appropriate iterators and the corrent accessor for the type. */ template inline triple::accessor> src_image_range(const Mat& img) { return triple::accessor> (img.upperLeft(), img.lowerRight(), choose_accessor::make_accessor(img)); } template inline std::pair::accessor> src_image(const Mat& img) { return std::pair::accessor> (img.upperLeft(), choose_accessor::make_accessor(img)); } template inline triple::accessor> dest_image_range(Mat& img) { return triple::accessor> (img.upperLeft(), img.lowerRight(), choose_accessor::make_accessor(img)); } template inline std::pair::accessor> dest_image(Mat& img) { return std::pair::accessor>(img.upperLeft(), choose_accessor::make_accessor(img)); } } /* Declare numeric traits for the RGB type in Gamera. This must be done in the vigra namespace, though it seems kind of nasty to hijack someone else's namespace . . . */ namespace vigra { /* NumericTraits for Gamera RGB types. */ using namespace Gamera; template<> struct NumericTraits { typedef RGBPixel Type; typedef RGBValue::Promote> Promote; typedef RGBValue::RealPromote> RealPromote; typedef NumericTraits::isIntegral isIntegral; typedef VigraFalseType isScalar; typedef VigraFalseType isOrdered; static RGBPixel zero() { return RGBPixel(NumericTraits::zero()); } static RGBPixel one() { return RGBPixel(NumericTraits::one()); } static RGBPixel nonZero() { return RGBPixel(NumericTraits::nonZero()); } static Promote toPromote(RGBPixel const & v) { return Promote(v); } static RealPromote toRealPromote(RGBPixel const & v) { return RealPromote(v); } static RGBPixel fromPromote(Promote const & v) { return RGBPixel(NumericTraits::fromPromote(v.red()), NumericTraits::fromPromote(v.green()), NumericTraits::fromPromote(v.blue())); } static RGBPixel fromRealPromote(RealPromote const & v) { return RGBPixel(NumericTraits::fromRealPromote(v.red()), NumericTraits::fromRealPromote(v.green()), NumericTraits::fromRealPromote(v.blue())); } }; #if 0 template struct PromoteTraits > { typedef RGBValue::Promote> Promote; }; #endif template<> struct PromoteTraits { typedef RGBValue::RealPromote> Promote; }; template<> struct PromoteTraits { typedef RGBValue::RealPromote> Promote; }; template<> struct NumericTraits { typedef ComplexPixel Type; typedef ComplexPixel Promote; typedef ComplexPixel RealPromote; typedef VigraFalseType isIntegral; typedef VigraFalseType isScalar; typedef VigraFalseType isOrdered; static ComplexPixel zero() { return ComplexPixel(0.0, 0.0); } static ComplexPixel one() { return ComplexPixel(1.0, 0.0); } static ComplexPixel nonZero() { return one(); } static ComplexPixel epsilon() { return ComplexPixel(LDBL_EPSILON, LDBL_EPSILON); } static ComplexPixel max() { return ComplexPixel(DBL_MAX, DBL_MAX); }; static ComplexPixel min() { return ComplexPixel(-DBL_MAX, -DBL_MAX); }; static const Promote & toPromote(const Type & v) { return v; } static const RealPromote & toRealPromote(const Type & v) { return v; } static const Type & fromPromote(const Promote & v) { return v; } static const Type & fromRealPromote(const RealPromote & v) { return v; } }; } #endif gamera-3.3.3/include/zlib-1.2.1/0000755000076500000000000000000011755376174015002 5ustar chriswheelgamera-3.3.3/include/zlib-1.2.1/crc32.h0000755000076500000000000007355010714675666016106 0ustar chriswheel/* crc32.h -- tables for rapid CRC calculation * Generated automatically by crc32.c */ local const unsigned long FAR crc_table[TBLS][256] = { { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, 0x2d02ef8dUL #ifdef BYFOUR }, { 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, 0x9324fd72UL }, { 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, 0xbe9834edUL }, { 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, 0xde0506f1UL }, { 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, 0x8def022dUL }, { 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, 0x72fd2493UL }, { 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, 0xed3498beUL }, { 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, 0xf10605deUL #endif } }; gamera-3.3.3/include/zlib-1.2.1/deflate.h0000755000076500000000000002732210714675666016572 0ustar chriswheel/* deflate.h -- internal compression state * Copyright (C) 1995-2002 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id: deflate.h 921 2005-09-27 14:12:37Z mdboom $ */ #ifndef DEFLATE_H #define DEFLATE_H #include "zutil.h" /* define NO_GZIP when compiling if you want to disable gzip header and trailer creation by deflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip encoding should be left enabled. */ #ifndef NO_GZIP # define GZIP #endif /* =========================================================================== * Internal compression state. */ #define LENGTH_CODES 29 /* number of length codes, not counting the special END_BLOCK code */ #define LITERALS 256 /* number of literal bytes 0..255 */ #define L_CODES (LITERALS+1+LENGTH_CODES) /* number of Literal or Length codes, including the END_BLOCK code */ #define D_CODES 30 /* number of distance codes */ #define BL_CODES 19 /* number of codes used to transfer the bit lengths */ #define HEAP_SIZE (2*L_CODES+1) /* maximum heap size */ #define MAX_BITS 15 /* All codes must not exceed MAX_BITS bits */ #define INIT_STATE 42 #define BUSY_STATE 113 #define FINISH_STATE 666 /* Stream status */ /* Data structure describing a single value and its code string. */ typedef struct ct_data_s { union { ush freq; /* frequency count */ ush code; /* bit string */ } fc; union { ush dad; /* father node in Huffman tree */ ush len; /* length of bit string */ } dl; } FAR ct_data; #define Freq fc.freq #define Code fc.code #define Dad dl.dad #define Len dl.len typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; typedef Pos FAR Posf; typedef unsigned IPos; /* A Pos is an index in the character window. We use short instead of int to * save space in the various tables. IPos is used only for parameter passing. */ typedef struct internal_state { z_streamp strm; /* pointer back to this zlib stream */ int status; /* as the name implies */ Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ int pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ Byte data_type; /* UNKNOWN, BINARY or ASCII */ Byte method; /* STORED (for zip only) or DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ /* used by deflate.c: */ uInt w_size; /* LZ77 window size (32K by default) */ uInt w_bits; /* log2(w_size) (8..16) */ uInt w_mask; /* w_size - 1 */ Bytef *window; /* Sliding window. Input bytes are read into the second half of the window, * and move to the first half later to keep a dictionary of at least wSize * bytes. With this organization, matches are limited to a distance of * wSize-MAX_MATCH bytes, but this ensures that IO is always * performed with a length multiple of the block size. Also, it limits * the window size to 64K, which is quite useful on MSDOS. * To do: use the user input buffer as sliding window. */ ulg window_size; /* Actual size of window: 2*wSize, except when the user input buffer * is directly used as sliding window. */ Posf *prev; /* Link to older string with same hash index. To limit the size of this * array to 64K, this link is maintained only for the last 32K strings. * An index in this array is thus a window index modulo 32K. */ Posf *head; /* Heads of the hash chains or NIL. */ uInt ins_h; /* hash index of string to be inserted */ uInt hash_size; /* number of elements in hash table */ uInt hash_bits; /* log2(hash_size) */ uInt hash_mask; /* hash_size-1 */ uInt hash_shift; /* Number of bits by which ins_h must be shifted at each input * step. It must be such that after MIN_MATCH steps, the oldest * byte no longer takes part in the hash key, that is: * hash_shift * MIN_MATCH >= hash_bits */ long block_start; /* Window position at the beginning of the current output block. Gets * negative when the window is moved backwards. */ uInt match_length; /* length of best match */ IPos prev_match; /* previous match */ int match_available; /* set if previous match exists */ uInt strstart; /* start of string to insert */ uInt match_start; /* start of matching string */ uInt lookahead; /* number of valid bytes ahead in window */ uInt prev_length; /* Length of the best match at previous step. Matches not greater than this * are discarded. This is used in the lazy match evaluation. */ uInt max_chain_length; /* To speed up deflation, hash chains are never searched beyond this * length. A higher limit improves compression ratio but degrades the * speed. */ uInt max_lazy_match; /* Attempt to find a better match only when the current match is strictly * smaller than this value. This mechanism is used only for compression * levels >= 4. */ # define max_insert_length max_lazy_match /* Insert new strings in the hash table only if the match length is not * greater than this length. This saves time but degrades compression. * max_insert_length is used only for compression levels <= 3. */ int level; /* compression level (1..9) */ int strategy; /* favor or force Huffman coding*/ uInt good_match; /* Use a faster search when the previous match is longer than this */ int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ /* Didn't use ct_data typedef below to supress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ struct tree_desc_s l_desc; /* desc. for literal tree */ struct tree_desc_s d_desc; /* desc. for distance tree */ struct tree_desc_s bl_desc; /* desc. for bit length tree */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ int heap_len; /* number of elements in the heap */ int heap_max; /* element of largest frequency */ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. * The same heap array is used to build all trees. */ uch depth[2*L_CODES+1]; /* Depth of each subtree used as tie breaker for trees of equal frequency */ uchf *l_buf; /* buffer for literals or lengths */ uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for * limiting lit_bufsize to 64K: * - frequencies can be kept in 16 bit counters * - if compression is not successful for the first block, all input * data is still in the window so we can still emit a stored block even * when input comes from standard input. (This can also be done for * all blocks if lit_bufsize is not greater than 32K.) * - if compression is not successful for a file smaller than 64K, we can * even emit a stored file instead of a stored block (saving 5 bytes). * This is applicable only for zip (not gzip or zlib). * - creating new Huffman trees less frequently may not provide fast * adaptation to changes in the input data statistics. (Take for * example a binary file with poorly compressible code followed by * a highly compressible string table.) Smaller buffer sizes give * fast adaptation but have of course the overhead of transmitting * trees more frequently. * - I can't count above 4 */ uInt last_lit; /* running index in l_buf */ ushf *d_buf; /* Buffer for distances. To simplify the code, d_buf and l_buf have * the same number of elements. To use different lengths, an extra flag * array would be necessary. */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ uInt matches; /* number of string matches in current block */ int last_eob_len; /* bit length of EOB code for last block */ #ifdef DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif ush bi_buf; /* Output buffer. bits are inserted starting at the bottom (least * significant bits). */ int bi_valid; /* Number of valid bits in bi_buf. All bits above the last valid bit * are always zero. */ } FAR deflate_state; /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ #define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ #define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) /* In order to simplify the code, particularly on 16 bit machines, match * distances are limited to MAX_DIST instead of WSIZE. */ /* in trees.c */ void _tr_init OF((deflate_state *s)); int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); void _tr_align OF((deflate_state *s)); void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, int eof)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. _dist_code[256] and _dist_code[257] are never * used. */ #ifndef DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) extern uch _length_code[]; extern uch _dist_code[]; #else extern const uch _length_code[]; extern const uch _dist_code[]; #endif # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->d_buf[s->last_lit] = 0; \ s->l_buf[s->last_lit++] = cc; \ s->dyn_ltree[cc].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (length); \ ush dist = (distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->last_lit == s->lit_bufsize-1); \ } #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ flush = _tr_tally(s, distance, length) #endif #endif /* DEFLATE_H */ gamera-3.3.3/include/zlib-1.2.1/inffast.h0000755000076500000000000000062710714675666016617 0ustar chriswheel/* inffast.h -- header to use inffast.c * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ void inflate_fast OF((z_streamp strm, unsigned start)); gamera-3.3.3/include/zlib-1.2.1/inffixed.h0000755000076500000000000001430710714675666016761 0ustar chriswheel /* inffixed.h -- table for decoding fixed codes * Generated automatically by makefixed(). */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ static const code lenfix[512] = { {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, {0,9,255} }; static const code distfix[32] = { {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, {22,5,193},{64,5,0} }; gamera-3.3.3/include/zlib-1.2.1/inflate.h0000755000076500000000000001325210714675666016605 0ustar chriswheel/* inflate.h -- internal inflate state definition * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* define NO_GZIP when compiling if you want to disable gzip header and trailer decoding by inflate(). NO_GZIP would be used to avoid linking in the crc code when it is not needed. For shared libraries, gzip decoding should be left enabled. */ #ifndef NO_GZIP # define GUNZIP #endif /* Possible inflate modes between inflate() calls */ typedef enum { HEAD, /* i: waiting for magic header */ #ifdef GUNZIP FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ EXLEN, /* i: waiting for extra length (gzip) */ EXTRA, /* i: waiting for extra bytes (gzip) */ NAME, /* i: waiting for end of file name (gzip) */ COMMENT, /* i: waiting for end of comment (gzip) */ HCRC, /* i: waiting for header crc (gzip) */ #endif DICTID, /* i: waiting for dictionary check value */ DICT, /* waiting for inflateSetDictionary() call */ TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ LEN, /* i: waiting for length/lit code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ MATCH, /* o: waiting for output space to copy string */ LIT, /* o: waiting for output space to write literal */ CHECK, /* i: waiting for 32-bit check value */ #ifdef GUNZIP LENGTH, /* i: waiting for 32-bit length (gzip) */ #endif DONE, /* finished check, done -- remain here until reset */ BAD, /* got a data error -- remain here until reset */ MEM, /* got an inflate() memory error -- remain here until reset */ SYNC /* looking for synchronization bytes to restart inflate() */ } inflate_mode; /* State transitions between above modes - (most modes can go to the BAD or MEM mode -- not shown for clarity) Process header: HEAD -> (gzip) or (zlib) (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME NAME -> COMMENT -> HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE Read deflate blocks: TYPE -> STORED or TABLE or LEN or CHECK STORED -> COPY -> TYPE TABLE -> LENLENS -> CODELENS -> LEN Read deflate codes: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN Process trailer: CHECK -> LENGTH -> DONE */ /* state maintained between inflate() calls. Approximately 7K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ /* sliding window */ unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ unsigned bits; /* number of bits in "in" */ /* for string and stored block copying */ unsigned length; /* literal or length of data to copy */ unsigned offset; /* distance back to copy string from */ /* for table and code decoding */ unsigned extra; /* extra bits needed */ /* fixed and dynamic code tables */ code const FAR *lencode; /* starting table for length/literal codes */ code const FAR *distcode; /* starting table for distance codes */ unsigned lenbits; /* index bits for lencode */ unsigned distbits; /* index bits for distcode */ /* dynamic table building */ unsigned ncode; /* number of code length code lengths */ unsigned nlen; /* number of length code lengths */ unsigned ndist; /* number of distance code lengths */ unsigned have; /* number of code lengths in lens[] */ code FAR *next; /* next available space in codes[] */ unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ }; gamera-3.3.3/include/zlib-1.2.1/inftrees.h0000755000076500000000000000450510714675666017003 0ustar chriswheel/* inftrees.h -- header to use inftrees.c * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* Structure for decoding tables. Each entry provides either the information needed to do the operation requested by the code that indexed that table entry, or it provides a pointer to another table that indexes more bits of the code. op indicates whether the entry is a pointer to another table, a literal, a length or distance, an end-of-block, or an invalid code. For a table pointer, the low four bits of op is the number of index bits of that table. For a length or distance, the low four bits of op is the number of extra bits to get after the code. bits is the number of bits in this code or part of the code to drop off of the bit buffer. val is the actual byte to output in the case of a literal, the base length or distance, or the offset from the current table to the next table. Each entry is four bytes. */ typedef struct { unsigned char op; /* operation, extra bits, table bits */ unsigned char bits; /* bits in this part of the code */ unsigned short val; /* offset in table or code value */ } code; /* op values as set by inflate_table(): 00000000 - literal 0000tttt - table link, tttt != 0 is the number of table index bits 0001eeee - length or distance, eeee is the number of extra bits 01100000 - end of block 01000000 - invalid code */ /* Maximum size of dynamic tree. The maximum found in a long but non- exhaustive search was 1004 code structures (850 for length/literals and 154 for distances, the latter actually the result of an exhaustive search). The true maximum is not known, but the value below is more than safe. */ #define ENOUGH 1440 #define MAXD 154 /* Type of code to build for inftable() */ typedef enum { CODES, LENS, DISTS } codetype; extern int inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); gamera-3.3.3/include/zlib-1.2.1/trees.h0000755000076500000000000002037410714675666016310 0ustar chriswheel/* header created automatically with -DGEN_TREES_H */ local const ct_data static_ltree[L_CODES+2] = { {{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, {{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, {{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, {{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, {{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, {{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, {{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, {{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, {{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, {{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, {{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, {{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, {{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, {{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, {{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, {{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, {{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, {{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, {{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, {{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, {{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, {{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, {{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, {{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, {{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, {{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, {{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, {{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, {{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, {{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, {{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, {{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, {{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, {{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, {{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, {{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, {{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, {{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, {{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, {{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, {{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, {{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, {{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, {{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, {{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, {{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, {{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, {{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, {{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, {{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, {{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, {{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, {{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, {{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, {{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, {{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, {{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, {{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} }; local const ct_data static_dtree[D_CODES] = { {{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, {{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, {{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, {{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, {{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, {{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} }; const uch _dist_code[DIST_CODE_LEN] = { 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 }; const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }; local const int base_length[LENGTH_CODES] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0 }; local const int base_dist[D_CODES] = { 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 }; gamera-3.3.3/include/zlib-1.2.1/zconf.h0000755000076500000000000002142010714675666016276 0ustar chriswheel/* zconf.h -- configuration of the zlib compression library * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id: zconf.h 921 2005-09-27 14:12:37Z mdboom $ */ #ifndef ZCONF_H #define ZCONF_H /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. */ #ifdef Z_PREFIX # define deflateInit_ z_deflateInit_ # define deflate z_deflate # define deflateEnd z_deflateEnd # define inflateInit_ z_inflateInit_ # define inflate z_inflate # define inflateEnd z_inflateEnd # define deflateInit2_ z_deflateInit2_ # define deflateSetDictionary z_deflateSetDictionary # define deflateCopy z_deflateCopy # define deflateReset z_deflateReset # define deflatePrime z_deflatePrime # define deflateParams z_deflateParams # define deflateBound z_deflateBound # define inflateInit2_ z_inflateInit2_ # define inflateSetDictionary z_inflateSetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateCopy z_inflateCopy # define inflateReset z_inflateReset # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound # define uncompress z_uncompress # define adler32 z_adler32 # define crc32 z_crc32 # define get_crc_table z_get_crc_table # define Byte z_Byte # define uInt z_uInt # define uLong z_uLong # define Bytef z_Bytef # define charf z_charf # define intf z_intf # define uIntf z_uIntf # define uLongf z_uLongf # define voidpf z_voidpf # define voidp z_voidp #endif #if defined(__MSDOS__) && !defined(MSDOS) # define MSDOS #endif #if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) # define OS2 #endif #if defined(_WINDOWS) && !defined(WINDOWS) # define WINDOWS #endif #if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32) # define WIN32 #endif #if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) # if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) # ifndef SYS16BIT # define SYS16BIT # endif # endif #endif /* * Compile with -DMAXSEG_64K if the alloc function cannot allocate more * than 64k bytes at a time (needed on systems with 16-bit int). */ #ifdef SYS16BIT # define MAXSEG_64K #endif #ifdef MSDOS # define UNALIGNED_OK #endif #ifdef __STDC_VERSION__ # ifndef STDC # define STDC # endif # if __STDC_VERSION__ >= 199901L # ifndef STDC99 # define STDC99 # endif # endif #endif #if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) # define STDC #endif #if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) # define STDC #endif #if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) # define STDC #endif #if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) # define STDC #endif #if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ # define STDC #endif #ifndef STDC # ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ # define const /* note: need a more gentle solution here */ # endif #endif /* Some Mac compilers merge all .h files incorrectly: */ #if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) # define NO_DUMMY_DECL #endif /* Maximum value for memLevel in deflateInit2 */ #ifndef MAX_MEM_LEVEL # ifdef MAXSEG_64K # define MAX_MEM_LEVEL 8 # else # define MAX_MEM_LEVEL 9 # endif #endif /* Maximum value for windowBits in deflateInit2 and inflateInit2. * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files * created by gzip. (Files created by minigzip can still be extracted by * gzip.) */ #ifndef MAX_WBITS # define MAX_WBITS 15 /* 32K LZ77 window */ #endif /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) plus a few kilobytes for small objects. For example, if you want to reduce the default memory requirements from 256K to 128K, compile with make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits that is, 32K for windowBits=15 (default value) plus a few kilobytes for small objects. */ /* Type declarations */ #ifndef OF /* function prototypes */ # ifdef STDC # define OF(args) args # else # define OF(args) () # endif #endif /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, * just define FAR to be empty. */ #ifdef SYS16BIT # if defined(M_I86SM) || defined(M_I86MM) /* MSC small or medium model */ # define SMALL_MEDIUM # ifdef _MSC_VER # define FAR _far # else # define FAR far # endif # endif # if (defined(__SMALL__) || defined(__MEDIUM__)) /* Turbo C small or medium model */ # define SMALL_MEDIUM # ifdef __BORLANDC__ # define FAR _far # else # define FAR far # endif # endif #endif #if defined(WINDOWS) || defined(WIN32) /* If building or using zlib as a DLL, define ZLIB_DLL. * This is not mandatory, but it offers a little performance increase. */ # ifdef ZLIB_DLL # if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) # ifdef ZLIB_INTERNAL # define ZEXTERN extern __declspec(dllexport) # else # define ZEXTERN extern __declspec(dllimport) # endif # endif # endif /* ZLIB_DLL */ /* If building or using zlib with the WINAPI/WINAPIV calling convention, * define ZLIB_WINAPI. * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. */ # ifdef ZLIB_WINAPI # ifdef FAR # undef FAR # endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ # define ZEXPORT WINAPI # ifdef WIN32 # define ZEXPORTVA WINAPIV # else # define ZEXPORTVA FAR CDECL # endif # endif #endif #if defined (__BEOS__) # ifdef ZLIB_DLL # ifdef ZLIB_INTERNAL # define ZEXPORT __declspec(dllexport) # define ZEXPORTVA __declspec(dllexport) # else # define ZEXPORT __declspec(dllimport) # define ZEXPORTVA __declspec(dllimport) # endif # endif #endif #ifndef ZEXTERN # define ZEXTERN extern #endif #ifndef ZEXPORT # define ZEXPORT #endif #ifndef ZEXPORTVA # define ZEXPORTVA #endif #ifndef FAR # define FAR #endif #if !defined(__MACTYPES__) typedef unsigned char Byte; /* 8 bits */ #endif typedef unsigned int uInt; /* 16 bits or more */ typedef unsigned long uLong; /* 32 bits or more */ #ifdef SMALL_MEDIUM /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ # define Bytef Byte FAR #else typedef Byte FAR Bytef; #endif typedef char FAR charf; typedef int FAR intf; typedef uInt FAR uIntf; typedef uLong FAR uLongf; #ifdef STDC typedef void const *voidpc; typedef void FAR *voidpf; typedef void *voidp; #else typedef Byte const *voidpc; typedef Byte FAR *voidpf; typedef Byte *voidp; #endif #if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ # include /* for off_t */ # include /* for SEEK_* and off_t */ # ifdef VMS # include /* for off_t */ # endif # define z_off_t off_t #endif #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif #ifndef z_off_t # define z_off_t long #endif #if defined(__OS400__) #define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf # ifdef FAR # undef FAR # endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) # pragma map(deflateInit_,"DEIN") # pragma map(deflateInit2_,"DEIN2") # pragma map(deflateEnd,"DEEND") # pragma map(deflateBound,"DEBND") # pragma map(inflateInit_,"ININ") # pragma map(inflateInit2_,"ININ2") # pragma map(inflateEnd,"INEND") # pragma map(inflateSync,"INSY") # pragma map(inflateSetDictionary,"INSEDI") # pragma map(compressBound,"CMBND") # pragma map(inflate_table,"INTABL") # pragma map(inflate_fast,"INFA") # pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ gamera-3.3.3/include/zlib-1.2.1/zlib.h0000755000076500000000000016061310714675666016127 0ustar chriswheel/* zlib.h -- interface of the 'zlib' general purpose compression library version 1.2.1, November 17th, 2003 Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Jean-loup Gailly Mark Adler jloup@gzip.org madler@alumni.caltech.edu The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). */ #ifndef ZLIB_H #define ZLIB_H #include "zconf.h" #ifdef __cplusplus extern "C" { #endif #define ZLIB_VERSION "1.2.1" #define ZLIB_VERNUM 0x1210 /* The 'zlib' compression library provides in-memory compression and decompression functions, including integrity checks of the uncompressed data. This version of the library supports only one compression method (deflation) but other algorithms will be added later and will have the same stream interface. Compression can be done in a single step if the buffers are large enough (for example if an input file is mmap'ed), or can be done by repeated calls of the compression function. In the latter case, the application must provide more input and/or consume the output (providing more output space) before each call. The compressed data format used by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. This library does not provide any functions to write gzip files in memory. However such functions could be easily written using zlib's deflate function, the documentation in the gzip RFC, and the examples in gzio.c. The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); typedef void (*free_func) OF((voidpf opaque, voidpf address)); struct internal_state; typedef struct z_stream_s { Bytef *next_in; /* next input byte */ uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total nb of input bytes read so far */ Bytef *next_out; /* next output byte should be put there */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total nb of bytes output so far */ char *msg; /* last error message, NULL if no error */ struct internal_state FAR *state; /* not visible by applications */ alloc_func zalloc; /* used to allocate the internal state */ free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ int data_type; /* best guess about the data type: ascii or binary */ uLong adler; /* adler32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; typedef z_stream FAR *z_streamp; /* The application must update next_in and avail_in when avail_in has dropped to zero. It must update next_out and avail_out when avail_out has dropped to zero. The application must initialize zalloc, zfree and opaque before calling the init function. All other fields are set by the compression library and must not be updated by the application. The opaque value provided by the application will be passed as the first parameter for calls of zalloc and zfree. This can be useful for custom memory management. The compression library attaches no meaning to the opaque value. zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers returned by zalloc for objects of exactly 65536 bytes *must* have their offset normalized to zero. The default allocation function provided by this library ensures this (see zutil.c). To reduce memory requirements and avoid any allocation of 64K objects, at the expense of compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the uncompressed data and may be saved for use in the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 #define Z_STREAM_END 1 #define Z_NEED_DICT 2 #define Z_ERRNO (-1) #define Z_STREAM_ERROR (-2) #define Z_DATA_ERROR (-3) #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) /* Return codes for the compression/decompression functions. Negative * values are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 #define Z_BEST_SPEED 1 #define Z_BEST_COMPRESSION 9 #define Z_DEFAULT_COMPRESSION (-1) /* compression levels */ #define Z_FILTERED 1 #define Z_HUFFMAN_ONLY 2 #define Z_RLE 3 #define Z_DEFAULT_STRATEGY 0 /* compression strategy; see deflateInit2() below for details */ #define Z_BINARY 0 #define Z_ASCII 1 #define Z_UNKNOWN 2 /* Possible values of the data_type field (though see inflate()) */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION requests a default compromise between speed and compression (currently equivalent to level 6). deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if level is not a valid compression level, Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible with the version assumed by the caller (ZLIB_VERSION). msg is set to null if there is no error message. deflateInit does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter should be set only when necessary (in interactive applications). Some output may be provided even if flush is not set. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating avail_in or avail_out accordingly; avail_out should never be zero before the call. The application can consume the compressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so that the decompressor can get all input data available so far. (In particular avail_in is zero after the call if enough output space has been provided before the call.) Flushing may degrade compression for some compression algorithms and so it should be used only when necessary. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if random access is desired. Using Z_FULL_FLUSH too often can seriously degrade the compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no more input data, until it returns with Z_STREAM_END or an error. After deflate has returned Z_STREAM_END, the only possible operations on the stream are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression is to be done in a single step. In this case, avail_out must be at least the value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update data_type if it can make a good guess about the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered binary. This field is only for information purposes and does not affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed prematurely (some input or output was discarded). In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. If next_in is not Z_NULL and avail_in is large enough (the exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller. msg is set to null if there is no error message. inflateInit does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in is updated and processing will resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more output, and updating the next_* and avail_* values accordingly. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much output as possible to the output buffer. Z_BLOCK requests that inflate() stop if and when it get to the next deflate block boundary. When decoding the zlib or gzip format, this will cause inflate() to return immediately after the header and before the first block. When doing a raw inflate, inflate() will go ahead and process the first block, and will return when it gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or decoding the complete header up to just before the first byte of the deflate stream. The end-of-block will not be indicated until all of the uncompressed data from that block has been written to strm->next_out. The number of unused bits may in general be greater than seven, except when bit 7 of data_type is set, in which case the number of unused bits will be less than eight. inflate() should normally be called until it returns Z_STREAM_END or an error. However if all decompression is to be performed in a single step (a single call of inflate), the parameter flush should be set to Z_FINISH. In this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all the uncompressed data. (The size of the uncompressed data may have been saved by the compressor for this purpose.) The next operation on this stream must be inflateEnd to deallocate the decompression state. The use of Z_FINISH is never required, but can be used to inform inflate that a faster approach may be used for the single inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early because Z_BLOCK is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm-adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() will decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically. Any information contained in the gzip header is not retained, so applications that need that information should instead use raw inflate, see inflateInit2() below, or inflateBack() and perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ /* Advanced functions */ /* The following functions are needed only in some special applications. */ /* ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy)); This is another version of deflateInit with more compression options. The fields next_in, zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. Larger values of this parameter result in better compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no header crc, and the operating system will be set to 255 (unknown). The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is slow and reduces compression ratio; memLevel=9 uses maximum memory for optimal speed. The default value is 8. See zconf.h for total memory usage as a function of windowBits and memLevel. The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length encoding). Filtered data consists mostly of small values with a somewhat random distribution. In this case, the compression algorithm is tuned to compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy parameter only affects the compression ratio but not the correctness of the compressed output even if it is not set appropriately. deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid method). msg is set to null if there is no error message. deflateInit2 does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. This function must be called immediately after deflateInit, deflateInit2 or deflateReset, before any call of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be discarded, for example if the dictionary is larger than the window size in deflate or deflate2. Thus the strings most likely to be useful should be put at the end of the dictionary, not at the front. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent (for example if deflate has already been called for this stream or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal compression state which can be quite large, so this strategy is slow and can consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate all the internal compression state. The stream will keep the same compression level and any other attributes that may have been set by deflateInit2. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int level, int strategy)); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression level is changed, the input available so far is compressed with the old level (and may be flushed); the new level will take effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for a call of deflate(), since the currently available input may have to be compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if strm->avail_out was zero. */ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or deflateInit2(). This would be used to allocate an output buffer for deflation in a single pass, and so would be called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int bits, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits leftover from a previous deflate stream when appending to it. As such, this function can only be used for raw deflate, and must be used before the first deflate() call after a deflateInit2() or deflateReset(). bits must be less than or equal to 16, and that many of the least significant bits of value will be inserted in the output. deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for this version of the library. The default value is 15 if inflateInit is used instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. windowBits can also be -8..-15 for raw inflate. In this case, -windowBits determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative memLevel). msg is set to null if there is no error message. inflateInit2 does not perform any decompression apart from reading the zlib header if present: this will be done by inflate(). (So next_in and avail_in may be modified, but next_out and avail_out are unchanged.) */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, const Bytef *dictionary, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate if this call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by this call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (such as NULL dictionary) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* Skips invalid compressed data until a full flush point (see above the description of deflate with Z_FULL_FLUSH) can be found, or until all available input is skipped. No output is provided. inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the success case, the application may save the current current value of total_in which indicates where valid compressed data was found. In the error case, the application may repeatedly call inflateSync, providing more input each time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, z_streamp source)); /* Sets the destination stream as a complete copy of the source stream. This function can be useful when randomly accessing a large stream. The first pass through the stream can periodically record the inflate state, allowing restarting inflate at those points when randomly accessing the stream. inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc being NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate all the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being NULL). */ /* ZEXTERN int ZEXPORT inflateBackInit OF((z_stream FAR *strm, int windowBits, unsigned char FAR *window)); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized before the call. If zalloc and zfree are Z_NULL, then the default library- derived memory allocation routines are used. windowBits is the base two logarithm of the window size, in the range 8..15. window is a caller supplied buffer of that size. Except for special applications where it is assured that deflate was used with small window sizes, windowBits must be 15 and a 32K byte window must be supplied to be able to decompress general deflate streams. See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of the paramaters are invalid, Z_MEM_ERROR if the internal state could not be allocated, or Z_VERSION_ERROR if the version of the library does not match the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); ZEXTERN int ZEXPORT inflateBack OF((z_stream FAR *strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc)); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is more efficient than inflate() for file i/o applications in that it avoids copying between the output and the sliding window by simply making the window itself the output buffer. This function trusts the application to not change the output buffer passed by the output function, at least until inflateBack() returns. inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw deflate stream with each call. inflateBackEnd() is then called to free the allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only the raw deflate stream to decompress. This is different from the normal behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those routines until it reads a complete deflate stream and writes out all of the uncompressed data, or until it encounters an error. The function's parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If there is no input available, in() must return zero--buf is ignored in that case--and inflateBack() will return a buffer error. inflateBack() will call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() should return zero on success, or non-zero on failure. If out() returns non-zero, inflateBack() will return with an error. Neither in() nor out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). For convenience, inflateBack() can be provided input on the first call by setting strm->next_in and strm->avail_in. If that input is exhausted, then in() will be called. Therefore strm->next_in must be initialized before calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These descriptors can be optionally used to pass any information that the caller- supplied in() and out() functions need to do their job. On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR if in() or out() returned an error, Z_DATA_ERROR if there was a format error in the deflate stream (in which case strm->msg is set to indicate the nature of the error), or Z_STREAM_ERROR if the stream was not properly initialized. In the case of Z_BUF_ERROR, an input or output error can be distinguished using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_stream FAR *strm)); /* All memory allocated by inflateBackInit() is freed. inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream state was inconsistent. */ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: 1.0: size of uInt 3.2: size of uLong 5.4: size of voidpf (pointer) 7.6: size of z_off_t Compiler, assembler, and debug options: 8: DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) One-time table building (smaller code, but not thread-safe if true): 12: BUILDFIXED -- build static block decoding tables when needed 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed 14,15: 0 (reserved) Library content (indicates missing functionality): 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking deflate code when not needed) 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect and decode gzip streams (to avoid linking crc code) 18-19: 0 (reserved) Operation variations (changes in library functionality): 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate 21: FASTEST -- deflate algorithm with only one, lowest compression level 22,23: 0 (reserved) The sprintf variant used by gzprintf (zero is best): 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! 26: 0 = returns value, 1 = void -- 1 means inferred string length returned Remainder: 27-31: 0 (reserved) */ /* utility functions */ /* The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. This function can be used to compress a whole file at once if the input file is mmap'ed. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. */ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. */ typedef voidp gzFile; ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb") but can also include a compression level ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman only compression as in "wb1h", or 'R' for run-length encoding as in "wb1R". (See the description of deflateInit2 for more information about the strategy parameter.) gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. gzopen returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* gzdopen() associates a gzFile with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno (in the file has been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd), mode) closes the file descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). gzdopen returns NULL if there was insufficient memory to allocate the (de)compression state. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* Reads the given number of uncompressed bytes from the compressed file. If the input file was not in gzip format, gzread copies the given number of bytes into the buffer. gzread returns the number of uncompressed bytes actually read (0 for end of file, -1 for error). */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, voidpc buf, unsigned len)); /* Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of uncompressed bytes actually written (0 in case of error). */ ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); /* Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). The number of uncompressed bytes written is limited to 4095. The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if zlib was compiled with the insecure functions sprintf() or vsprintf() because the secure snprintf() or vsnprintf() functions were not available. */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. */ ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* Push one character back onto the stream to be read again later. Only one character of push-back is allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if a character has been pushed but not read yet, or if c is -1. The pushed character will be discarded if the stream is repositioned with gzseek() or gzrewind(). */ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. The return value is the zlib error number (see function gzerror below). gzflush returns Z_OK if the flush parameter is Z_FINISH and all output could be flushed. gzflush should be called only when strictly necessary because it can degrade compression. */ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, z_off_t offset, int whence)); /* Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. If the file is opened for reading, this function is emulated but can be extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. */ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. The return value is the zlib error number (see function gzerror below). */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* Returns the error message for the last error which occurred on the given compressed file. errnum is set to zlib error number. If an error occurred in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* Clears the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ /* checksum functions */ /* These functions are not related to compression but are exported anyway because they might be useful in applications using the compression library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and return the updated checksum. If buf is NULL, this function returns the required initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC32 but can be computed much faster. Usage example: uLong adler = adler32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { adler = adler32(adler, buffer, length); } if (adler != original_adler) error(); */ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running crc with the bytes buf[0..len-1] and return the updated crc. If buf is NULL, this function returns the required initial value for the crc. Pre- and post-conditioning (one's complement) is performed within this function so it shouldn't be done by the application. Usage example: uLong crc = crc32(0L, Z_NULL, 0); while (read_buffer(buffer, length) != EOF) { crc = crc32(crc, buffer, length); } if (crc != original_crc) error(); */ /* various hacks, don't look :) */ /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, const char *version, int stream_size)); ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, const char *version, int stream_size)); ZEXTERN int ZEXPORT inflateBackInit_ OF((z_stream FAR *strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); #define deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit(strm) \ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) #define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ (strategy), ZLIB_VERSION, sizeof(z_stream)) #define inflateInit2(strm, windowBits) \ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ ZLIB_VERSION, sizeof(z_stream)) #if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) struct internal_state {int dummy;}; /* hack for buggy compilers */ #endif ZEXTERN const char * ZEXPORT zError OF((int err)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); #ifdef __cplusplus } #endif #endif /* ZLIB_H */ gamera-3.3.3/include/zlib-1.2.1/zutil.h0000755000076500000000000001461210714675666016333 0ustar chriswheel/* zutil.h -- internal interface and configuration of the compression library * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* WARNING: this file should *not* be used by applications. It is part of the implementation of the compression library and is subject to change. Applications should only use zlib.h. */ /* @(#) $Id: zutil.h 921 2005-09-27 14:12:37Z mdboom $ */ #ifndef ZUTIL_H #define ZUTIL_H #define ZLIB_INTERNAL #include "zlib.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ typedef unsigned char uch; typedef uch FAR uchf; typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ #define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] #define ERR_RETURN(strm,err) \ return (strm->msg = (char*)ERR_MSG(err), (err)) /* To be used only when the state is known to be valid */ /* common constants */ #ifndef DEF_WBITS # define DEF_WBITS MAX_WBITS #endif /* default windowBits for decompression. MAX_WBITS is for compression only */ #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif /* default memLevel */ #define STORED_BLOCK 0 #define STATIC_TREES 1 #define DYN_TREES 2 /* The three kinds of block type */ #define MIN_MATCH 3 #define MAX_MATCH 258 /* The minimum and maximum match lengths */ #define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ /* target dependencies */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 # if defined(__TURBOC__) || defined(__BORLANDC__) # if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); # else # include # endif # else /* MSC or DJGPP */ # include # endif #endif #ifdef AMIGA # define OS_CODE 0x01 #endif #if defined(VAXC) || defined(VMS) # define OS_CODE 0x02 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif #if defined(ATARI) || defined(atarist) # define OS_CODE 0x05 #endif #ifdef OS2 # define OS_CODE 0x06 #endif #if defined(MACOS) || defined(TARGET_OS_MAC) # define OS_CODE 0x07 # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include /* for fdopen */ # else # ifndef fdopen # define fdopen(fd,mode) NULL /* No fdopen() */ # endif # endif #endif #ifdef TOPS20 # define OS_CODE 0x0a #endif #ifdef WIN32 # ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ # define OS_CODE 0x0b # endif #endif #ifdef __50SERIES /* Prime/PRIMOS */ # define OS_CODE 0x0f #endif #if defined(_BEOS_) || defined(RISCOS) # define fdopen(fd,mode) NULL /* No fdopen() */ #endif #if (defined(_MSC_VER) && (_MSC_VER > 600)) # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED typedef int ptrdiff_t; # define _PTRDIFF_T_DEFINED # endif # else # define fdopen(fd,type) _fdopen(fd,type) # endif #endif /* common defaults */ #ifndef OS_CODE # define OS_CODE 0x03 /* assume Unix */ #endif #ifndef F_OPEN # define F_OPEN(name, mode) fopen((name), (mode)) #endif /* functions */ #if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #if defined(__CYGWIN__) # ifndef HAVE_VSNPRINTF # define HAVE_VSNPRINTF # endif #endif #ifndef HAVE_VSNPRINTF # ifdef MSDOS /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), but for now we just assume it doesn't. */ # define NO_vsnprintf # endif # ifdef __TURBOC__ # define NO_vsnprintf # endif # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) # define vsnprintf _vsnprintf # endif # endif # ifdef __SASC # define NO_vsnprintf # endif #endif #ifdef HAVE_STRERROR extern char *strerror OF((int)); # define zstrerror(errnum) strerror(errnum) #else # define zstrerror(errnum) "" #endif #if defined(pyr) # define NO_MEMCPY #endif #if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) /* Use our own functions for small and medium model with MSC <= 5.0. * You may have to use the same strategy for Borland C (untested). * The __SC__ check is for Symantec. */ # define NO_MEMCPY #endif #if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) # define HAVE_MEMCPY #endif #ifdef HAVE_MEMCPY # ifdef SMALL_MEDIUM /* MSDOS small or medium model */ # define zmemcpy _fmemcpy # define zmemcmp _fmemcmp # define zmemzero(dest, len) _fmemset(dest, 0, len) # else # define zmemcpy memcpy # define zmemcmp memcmp # define zmemzero(dest, len) memset(dest, 0, len) # endif #else extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); extern void zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include extern int z_verbose; extern void z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} # define Tracevv(x) {if (z_verbose>1) fprintf x ;} # define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} # define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} #else # define Assert(cond,msg) # define Trace(x) # define Tracev(x) # define Tracevv(x) # define Tracec(c,x) # define Tracecv(c,x) #endif voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); void zcfree OF((voidpf opaque, voidpf ptr)); #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) #define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) #define TRY_FREE(s, p) {if (p) ZFREE(s, p);} #endif /* ZUTIL_H */ gamera-3.3.3/INSTALL0000644000076500000000000002576511216641434013014 0ustar chriswheel============================== Building and installing Gamera ============================== Microsoft Windows ================= Installing from source ---------------------- Currently, Gamera can be built using the MingW32/GNU toolset. The "officially supported" configuration, (i.e. the one that the Gamera developers use) is to use the MingW32 compiler to build for the official Python.org Python. This can be done in one of the following two ways: - with the `standalone Mingw32`__ toolchain (easiest solution) .. __: #mingw32 - or with the MingW32 compiler installed `inside of Cygwin`__ .. __: #cygwin If you have success with other compilers and configurations, please consider contributing your experiences to this documentation. Prerequisites ````````````` - Python 2.4.x or later with Python 2.5.x recommended (only the distribution from python.org has been tested) - wxPython 2.6.x or later (wxPython 2.8.x or later recommended for full functionality) .. note:: The Python 2.6 binary from python.org has been built with a version of MS Visual Studio that causes problems when extensions are compiled with Mingw32. The reason is an errenous file ``libmsvcr90.a`` coming with Mingw32. To fix it, you can recreate the file from the DLL ``msvcr90.dll`` that comes with Python 2.6 with pexports__ and *dlltool* (the latter is part of Mingw32):: pexports msvcr90.dll > msvcr90.def dlltool --input-def msvcr90.def --dllname msvcr90.dll --output-lib libmsvcr90.a -k With Python 2.5, these changes are not necessary. .. __: http://www.emmestech.com/software/pexports-0.43/download_pexports.html .. _mingw32: Standalone Mingw32 `````````````````` Install the Mingw32 port of gcc from http://mingw.org/. Make sure that you do not only install *gcc-core*, but also *g++* and *make*. Add the *bin* subdirectory of your Mingw32 installation to the environment variable ``PATH``. Assuming you have installed Python to ``C:\Python25``, you can then compile gamera at a DOS command prompt from the root directory of the gamera source code with:: C:\Python25\python setup.py build --compiler=mingw32 bdist_wininst This will create a Windows installer, including uninstallation support, in the *dist* subdirectory. It can be started with a double click in the Explorer, or from the DOS command prompt with:: start dist\gamera-X.X.X-win32.exe .. _cygwin: Mingw32 inside Cygwin ````````````````````` Use the installer from http://www.cygwin.com/ to install Cygwin, including the ``g++-mingw32`` compiler and the ``MingW32`` libraries. If you plan to track development of Gamera, you will probably also want to install ``subversion``. The important thing to note here is that we are using Cygwin's Mingw32 compiler to build for the standard (non-Cygwin) Python from python.org. After a clean install of Cygwin, typing 'python' will start up Cygwin's version of Python, not the one from python.org. Therefore, you will want to add the standard Python to your Cygwin PATH using the command (assuming you installed Python in standard location):: export PATH=/cygdrive/c/Python25/:$PATH Ensure you are using the correct Python by typing:: which python The result should be ``/cygdrive/c/Python25/python.exe``, not ``/usr/bin/python``. Beware that the file ``/usr/bin/gcc`` installed by Cygwin actually is *not* the compiler executable, but a symbolic link. Symbolic links are not supported by MS Windows, but are a Cygwin-only feature. This means that the Python Distutils system cannot execute ``/usr/bin/gcc`` and the build command will fail. To fix this, replace the symbolic link with the actual compiler executable:: cp /usr/bin/gcc-3 /usr/bin/gcc cp /usr/bin/g++-3 /usr/bin/g++ From here on, you can proceed as for the standalone Mingw32 toolchain, i.e.:: python setup.py build --compiler=mingw32 bdist_wininst dist/gamera-X.X.X-win32.exe Linux (and other \*nix) ======================= Prerequisites ------------- - Python 2.3 and later are supported, though Python 2.4 or later is recommended. You will need to have the headers (but not the complete source) to build Gamera from source code. Most Linux distributions include these as a separate package (eg. ``python-dev`` or ``python-devel``). - wxPython 2.4.x or later (wxPython 2.8.x or later recommended for full functionality). - ``gcc`` version 3.1 or later. - libtiff 3.5.x or later - libpng 1.2.x or later If any of these prerequisites is installed in a non standard directory, you can use the environment variables ``CFLAGS`` and ``LDFLAGS`` to pass its locations to the build script, e.g.:: CFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib export CFLAGS LDFLAGS Standard Build and Install -------------------------- Gamera is built using the Python-standard Distutils system. Open a terminal and type:: python setup.py build sudo python setup.py install Installing without root priviledges ----------------------------------- .. _without_root: If you do not have root access to your machine, you can make a local installation of Gamera. A quick-and-easy way to do this is to use the ``virtual_python.py`` script available here__, and then follow the standard installation instructions (without using sudo):: python setup.py build python setup.py install .. __: http://peak.telecommunity.com/DevCenter/EasyInstall#creating-a-virtual-python Alternatively, you can set up a local installation by hand. Make a local python module directory somewhere that you have write priviledges (such as your home directory):: mkdir ~/python From the Gamera build directory, install Gamera into that directory:: python setup.py install --home=~/python Set up an environment variables so Python can find stuff there (you may want to add this to your ~/.bash_profile file):: export PYTHONPATH=~/python/lib/python Add the local Python scripts directory to your path:: export PATH=~/python/bin:$PATH Now you should be able to run the ``gamera_gui`` script from the command line. Running ------- Run the ``gamera_gui`` script, which should have installed to ``/usr/local/bin``. This file can also be copied anywhere (such as the Desktop) and double-clicked to run Gamera. .. note:: Running the script from the root of the source tree will not work, since it will not be able to find the compiled version of Gamera. Mac OS-X ======== Earlier versions of Gamera ran on OS-X by using X11 as an emulation of a standard Unix environment. The current SVN version of Gamera now uses Cocoa, and feels much more like a standard Macintosh application. Please follow the instructions for *either* X11 or Cocoa install below. Native (Cocoa) build -------------------- Prerequisites ````````````` Gamera installs out of the box on Mac OS-X 10.4 (Tiger) and 10.5 (Leopard). The only prerequisite is to install XCode, which is shipped with the OS-X installation DVD, but is not installed by default. It should be noted that OS-X 10.4 comes with the unstable branch 2.5 of wxPython. So far we have not yet encountered any problems with this version, but if you have any problems, please consider to install wxPython 2.6 instead. This is *not* possible from the binary installers from http://www.wxpython.org/, because there is none for Python 2.3, and the other Python versions require a particular prerelease of Xcode to build extensions, that is no longer available. So if you decide to upgrade wxPython on OS-X 10.4, you must do it from the source release of wxPython 2.6. Standard Build and Install `````````````````````````` Gamera is built using the Python-standard Distutils system. To build Gamera, open a terminal and type:: python setup.py build and then to install (you'll need to have admin priviledges):: sudo pythonw setup.py install On OS-X 10.4, you must do the installation with ``pythonw`` rather than with ``python``, because ``gamera_gui`` is a GUI application. On OS-X 10.5 this distinction is no longer necessary, but using ``pythonw`` also works. The scripts can be installed by:: sudo pythonw setup.py install_scripts -d /usr/bin .. note:: The ``-d /usr/bin/`` installs the scripts in a reasonable place on the PATH. If you do not specify it, the scripts are by default installed to ``/System/Library/Frameworks/Python.framework/Versions/2.3/bin``. So you can also simply add this directory to your PATH environment variable and forget about the *install_scripts* step. Installing without root priviledges ``````````````````````````````````` The instructions for `installing without root (administrator) priviledges`__ can also be used on Mac OS-X. __ without_root_ Running ``````` Start the Terminal application and run the ``gamera_gui`` script. .. note:: Running the script from the root of the source tree will not work, since it will not be able to find the compiled version of Gamera. X11 build --------- Please note that this build is no longer maintained by the Gamera developers. So use it only when the Cocoa build is not possible for some reason (e.g. on a legacy OS-X 10.3 system). Prerequisites ````````````` - Mac OS-X 10.3 (Panther) or presumably later - Python 2.3 (including the version included). - wxPython-GTK 2.4.x or later Since there is no official build of the Gtk+/X11 version for Mac OS-X, I have made one available in the Gamera SourceForge Files section. - XCode. The version of XCode that shipped on the Tiger installation DVD will not work if you plan to use a newer version of Python downloaded from python.org. XCode 2.4.1, may be downloaded from http://developer.apple.com/tools/xcode . - X11. This is available on the Tiger installation DVD. You should also use Software Update to update X11 to the latest version. Standard Build and Install `````````````````````````` Download and install the unoffical wxPython-Gtk-X11 distribution from the Gamera Files section on SourceForge. Alternatively, you can install fink and then build the package wxPython-Py23, which is currently in the unstable branch, (and its dependencies) from source. You will then need to use the fink version of Python (not the one that Apple provides) to carry out the instructions below. Gamera is built using the Python-standard Distutils system. To build Gamera, open a X11 terminal and type:: python setup.py build and then to install (you'll need to have admin priviledges):: sudo python setup.py install The scripts can be installed by:: sudo python setup.py install_scripts -d /usr/bin .. note:: The ``-d /usr/bin/`` installs the scripts in a reasonable place on the PATH. If you do not specify it, the scripts are by default installed to ``/System/Library/Frameworks/Python.framework/Versions/2.3/bin``. Installing without root priviledges ``````````````````````````````````` The instructions for `installing without root (administrator) priviledges`__ can also be used on Mac OS-X. __ without_root_ Running ``````` Start an X11 terminal and run the ``gamera_gui`` script. .. note:: Running the script from the root of the source tree will not work, since it will not be able to find the compiled version of Gamera. gamera-3.3.3/KNOWN_BUGS0000644000076500000000000000053611271041104013374 0ustar chriswheelThe following issues in Gamera are known. Fixes for some of them are currently under consideration. - Config options should be somewhere documented. - GAlib is a copy of an old version, which generates a number of compiler warnings. This should be updated - pixel values in Cc's can only be changed over the iterators, but not with set() gamera-3.3.3/LICENSE0000644000076500000000000003542311652050143012753 0ustar chriswheel GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS gamera-3.3.3/MANIFEST.in0000644000076500000000000000170611277325002013503 0ustar chriswheelrecursive-include misc * recursive-include doc gendoc.py recursive-include doc/src *.txt *.png *.css recursive-include doc/html *.css recursive-include gamera/pixmaps *.png *.py *.bmp recursive-include gamera/test *.tiff recursive-include src *.cpp *.c *.h makefile.* *.hpp *.txt ANNOUNCE CHANGES INSTALL LICENSE README TODO KNOWNBUG Y2KINFO recursive-include examples *.py README *.tiff *.xml recursive-include include *.hpp *.hxx *.h README recursive-include win32 *.py recursive-include win32/msisource *.mmh *.txt *.jpg *.c *.template *.bmp recursive-include gamera/mac/ *.py *.html DMG_DS_STORE recursive-include gamera/mac/resources *.jpg recursive-include migration_tools README gamera_deprecation_filter generate_migration_docs replace_get_set include CHANGES INSTALL LICENSE ACKNOWLEDGEMENTS KNOWN_BUGS MANIFEST.in TODO setup.cfg gamera_post_install.py version recursive-include tests *.py README recursive-include tests/data * include tests/tmp/.empty_dir gamera-3.3.3/migration_tools/0000755000076500000000000000000011755376174015173 5ustar chriswheelgamera-3.3.3/migration_tools/gamera_deprecation_filter0000755000076500000000000001024410714675724022275 0ustar chriswheel#!/usr/bin/env python """ The ``gamera_deprecation_filter`` tool is useful for correcting calls to deprecated Gamera functions from you C++ code. This tool only works with ``gcc``, and only on non-MS Windows platforms (for some unknown reason. The output from ``gcc`` about deprecated functions is helpful, but is somewhat limited. For example:: include/dimensions.hpp:314: warning: `__comp_ctor' is deprecated (declared at include/dimensions.hpp:216) Here ``__comp_ctor`` refers to the constructor of the Dimensions class. Not only is this cryptic, but it doesn't specify which of the overloaded signatures it is referring to (except by line numbers). It also doesn't explain *why* the function call was deprecated or suggest a reasonable alternative. This filter replaces these cryptic warnings with more human-readable ones by extracting and displaying the comment associated with the deprecated function. For example, the above warning becomes:: include/dimensions.hpp:314: warning: deprecated call return Dimensions(nrows(), ncols()); Dimensions(nrows, ncols) is deprecated. Reason: (x, y) coordinate consistency. Use Dim(ncols, nrows) instead. This script can be used as a filter or on a given filename. Be sure to send ``stderr`` to ``gamera_deprecation_filter``. Usage as a filter:: $ python setup.py build 2>&1 | ./migration_tools/gamera_deprecation_filter or offline:: $ python setup.py build &> log $ ./gamera_deprecation_filter log """ import re import sys def get_lineno(filename, lineno): return open(filename, "r").readlines()[lineno - 1] comment_cache = {} def get_comment_before_lineno(filename, lineno): comment_key = "%s:%d" % (filename, lineno) if comment_cache.has_key(comment_key): return comment_cache[comment_key] lines = open(filename, "r").readlines() comment = [] for i in xrange(lineno - 1, -1, -1): if i < 0 or i >= len(lines): raise RuntimeError() find = lines[i].find(r"*/") if find != -1: comment.insert(0, lines[i][:find].strip()) break for j in xrange(i - 1, -1, -1): if j < 0 or j >= len(lines): raise RuntimeError() find = lines[j].find(r"/*") if find != -1: comment.insert(0, lines[j][find+2:].strip()) break comment.insert(0, lines[j].strip()) comment = "\n".join(comment) comment_cache[comment_key] = comment return comment warning_regex = re.compile("(?P.+?):(?P\d+?): warning: `.+?' is deprecated \(declared at (?P.+?):(?P\d+?)\)") def filter_warnings(input_stream, output_stream): duplicates = {} for line in input_stream: match = warning_regex.match(line) if not match is None: filename = match.group("filename") lineno = int(match.group("lineno")) decl_filename = match.group("decl_filename") decl_lineno = int(match.group("decl_lineno")) source_line = get_lineno(filename, lineno).strip() if "// deprecated call" in source_line: print >> output_stream, ( "Gamera is making a *deliberate* deprecated call to provide backward\n" + "compatibility. This does not represent an error.") else: print >> output_stream, "%s:%d: warning: deprecated call" % (filename, lineno) print >> output_stream, source_line.strip() try: comment = get_comment_before_lineno(decl_filename, decl_lineno) except RuntimeError: print >> output_stream, "Information about this deprecation could not be found." else: print >> output_stream, comment.strip() print >> output_stream else: print >> output_stream, line[:-1] def main(): from optparse import OptionParser parser = OptionParser(usage = __doc__) options, args = parser.parse_args() if len(args) > 1: parser.error("You must supply a single filename to filter.") if len(args) == 0: input_stream = sys.stdin else: input_stream = open(args[0], "r") output_stream = sys.stdout filter_warnings(input_stream, output_stream) if __name__ == "__main__": main() gamera-3.3.3/migration_tools/generate_migration_docs0000755000076500000000000003212510714675724021774 0ustar chriswheel#!/usr/bin/env python """This script builds the documentation about migrating from Gamera 2.x to Gamera 3.x. End users should not have to run this script.""" import cStringIO import imp import os import re import textwrap # This is the main content of the document with Python # formatting markers in it for parts that are # automatically generated. source = """======================================= Migrating from Gamera 2.x to Gamera 3.x ======================================= The migration from Gamera 2.x to Gamera 3.x is intended to be as painless as possible. In future releases of Gamera, backward compatibility will need to be broken in order to fix some low-level design flaws in Gamera. Gamera 3.x is the first step in that process. Certain functions signatures that existed in 2.x have been deprecated in 3.x, but they continue to work in order to maintain backward compatibility with existing scripts. As of Gamera 3.x, these deprecated calls all have easy alternatives, and they should be replaced with the new recommended forms as soon as possible to ensure compatibility with future versions of Gamera. Note, however, that some rarely-used deprecated functions do not have direct alternatives in Gamera 2.x, so this migration process may break your scripts' compatibility with Gamera 2.x. However, if appropriate care is taken, such as switching based on the Gamera version, it should still be possible to write code that is compatible with both Gamera 2.x and Gamera 3.x. This document is divided into the following sections: - `Reasons for deprecations`_ describes the different categories of deprecated functions, and what changes are required in end-user scripts. - `How to migrate existing code`_ presents some tips and techniques for making migration easier. - `Migration tools`_ describes the provided tools for finding and replacing deprecated calls in end-user code. This tools provide only a semi-automated process. - `C++ deprecations reference`_ and `Python deprecations reference`_ list all deprecated functions, with their reason for deprecation and a suggested alternative. Reasons for deprecations ======================== (x, y) coordinate consistency ----------------------------- In Gamera 2.x, some functions received coordinates in the order (y, x), (or (rows, cols)), while others took coordinates in (x, y) order. This self-inconsistency and departure from the majority of image processing systems often resulted in confusion and subtle errors. The new recommended way to call these functions is to pass in Point, FloatPoint, Size or Dim arguments as required, instead of two integers. This solution allows the old function signatures to be maintained for backward compatibility, while allowing migration to a style that consistently uses (x, y) ordering everywhere. For example, ``image.get(r, c)`` becomes ``image.get(Point(c, r))``. 2-element sequences in place of Point type '''''''''''''''''''''''''''''''''''''''''' For convenience in Python code, 2-element sequences can be used wherever Point or FloatPoint is expected. Therefore, ``image.get((x, y))`` is equivalent to ``image.get(Point(x, y))``. Dimensions type ''''''''''''''' Additionally, the ``Dimensions`` class, whose constructor is ``Dimensions(nrows, ncols)``, has been deprecated because it is inconsistent with the new requirement of "(x, y) everywhere". Since it would be impossible to change the order of the constructor's arguments without breaking backward imcompatibility, a new type has been introduced, ``Dim``, which is identical to Dimensions in all respects except its constructor is ``Dim(ncols, nrows)``. All uses of the ``Dimensions`` type are deprecated and should be migrated to use ``Dim`` instead. FloatPoint type ''''''''''''''' A new FloatPoint type has been added to hold coordinates using floating point numbers. The standard Gamera ``Point`` stores coordinates as unsigned (positive) integers, and doesn't have any arithmetic operators. For this reason, ``FloatPoint`` is highly recommended for any analyses that require precision and flexibility. ``Point`` is kept around for backward compatibility, and because it is a more natural way to refer to physical pixels, as opposed to logical coordinates. There are, however, implicit conversions (in Python only) between the two types, so a ``FloatPoint`` can be used in place of ``Point`` where it makes sense. Care should be taken to ensure that negative values are never used to reference image pixels. (Range checking is performed when accessing from Python, but not when accessing from C++.) Additionally, the standard arithmetic operators are available on ``FloatPoint`` objects (+ - * / abs). Functions should be parameterized by arguments, not by name ----------------------------------------------------------- There are certain groups of plugin functions that perform essentially the same functionality. Take for example:: black_horizontal_run_histogram() black_vertical_run_histogram() white_horizontal_run_histogram() white_vertical_run_histogram() These four functions compute a run length histogram, parameterized by the color and direction of the runs. Maintaining four separate functions for a single logical task has a number of disadvantages: - Even if the code is abstracted such that the core of the algorithm is in a single function, the documentation still needs to be updated in multiple places. - The generated documentation becomes longer and therefore harder to browse through, and contains a lot of redundant information or excessive hyperlinking. - Autocompletion in the Gamera shell becomes less useful. - Alphabetization of the functions doesn't necessarily reveal their membership as part of the same family of functionality. Therefore, in Gamera 3.x, these sorts of functions have been merged into a single function. For example, the four functions above are now the single function:: run_histogram(color, direction) How to migrate existing code ============================ There are two distinct techniques for finding deprecated functions: one for C++ code and one for Python code. C++ code -------- On the C++ side, all deprecated function calls will be caught at compile time. Simply recompiling your C++ code will provide compiler warnings to this effect. The compiler warnings produced by gcc can be fairly cryptic. The gamera_deprecation_filter_ (described below) will filter these warning messages and produce detailed human-readable suggestions for updating your deprecated calls. .. note:: This technique only works with gcc version 3.1 and greater. Python code ----------- Finding the deprecated calls in Python code is somewhat more difficult, since the exact function calls being made can not be determined until runtime. When a deprecated function call is made, a deprecation warning is printed to stderr. This message provides the name of the deprecated function, the reason it was deprecated, and a suggested alternative. The only way to find all deprecated calls in your code this is to ensure that all of your code is run. This is sometimes difficult to do, though a code coverage tool such as Garth Rees' `Statement coverage for Python`__ may help. .. __: http://www.garethrees.org/2001/12/04/python-coverage/ A manual search through your code for deprecated functions may in some cases be more efficient. A master list of all deprecated Python functions in Gamera is presented in the `Python deprecations reference`_. Migration tools =============== There are a number of scripts in the ``migration_tools`` directory that make the process of migrating code from Gamera 2.x to 3.x easier. - gamera_deprecation_filter_: Helps display the deprecated calls in your C++ code. - replace_get_set_: Replaces C++ calls to get and set in the old form to the new form. gamera_deprecation_filter ------------------------- %(gamera_deprecation_filter_docs)s replace_get_set --------------- %(replace_get_set_docs)s C++ deprecations reference ========================== This is an alphabetical list of the deprecated C++ functions. %(cpp_deprecations)s Python deprecations reference ============================= This is an alphabetical list of the deprecated Python functions. %(python_deprecations)s """ # This is a list of reasons for deprecating functions and # their reasons = [ ("(x, y) coordinate consistency", "#x-y-coordinate-consistency"), ("Functions parameterized by arguments, not by name", "#functions-should-be-parameterized-by-arguments-not-by-name")] def get_tool_docs(tools, chunks): for tool in tools: mod = imp.load_module(tool, open(tool, "r"), tool, ("", "", imp.PY_SOURCE)) chunks[tool + "_docs"] = mod.__doc__ def get_files_recursively(root, extensions): for dirpath, dirnames, filenames in os.walk(root): if not "build" in dirpath and not "dist" in dirpath: for filename in filenames: root, ext = os.path.splitext(filename) if ext in extensions: yield open(os.path.join(dirpath, filename), "r") def find_all_matches(regex, file): for match in regex.findall(file.read()): yield match def find_comments(file): lines = file.readlines() for lineno, line in enumerate(lines): if "GAMERA_CPP_DEPRECATED" in line and not line.startswith("#"): comment = [] for i in xrange(lineno, -1, -1): if i < 0 or i >= len(lines): raise RuntimeError("Couldn't find comment.") find = lines[i].find(r"*/") if find != -1: comment.insert(0, lines[i][:find].strip()) break for j in xrange(i - 1, -1, -1): if j < 0 or j >= len(lines): raise RuntimeError("Couldn't find comment.") find = lines[j].find(r"/*") if find != -1: comment.insert(0, lines[j][find+2:].strip()) break comment.insert(0, lines[j].strip()) comment = "\n".join(comment) yield comment def format_deprecations(deprecations): table_line = "+" + ("-" * 80) + "+" + ("-" * 80) + "+\n" table_header = "+" + ("=" * 80) + "+" + ("=" * 80) + "+\n" output = cStringIO.StringIO() output.write(table_line) output.write("|%-80s|%-80s|\n" % ("Deprecated function", "Notes")) output.write(table_header) for deprecation in deprecations: parts = deprecation.split("\n\n") if len(parts) != 3: continue function = parts[0].strip() reason = parts[1][len("Reason: "):].strip() for i, r in enumerate(reasons): if reason.startswith(r[0]): function = function + " [%d_]" % (i + 1) break suggestion = "\n\n".join(parts[2:]).strip() function = textwrap.wrap(function) suggestion = textwrap.wrap(suggestion) lines = max(len(function), len(suggestion)) for x in function, suggestion: if len(x) < lines: for i in range(lines - len(x)): x.append("") for a, b in zip(function, suggestion): output.write("|%-80s|%-80s|\n" % (a, b)) output.write(table_line) output.write("\n") for i, r in enumerate(reasons): output.write(".. _%d: %s\n" % (i + 1, r[1])) output.write("\n") return output.getvalue() def get_cpp_deprecations(): deprecations = [] for fd in get_files_recursively("..", [".hpp", ".cpp"]): for match in find_comments(fd): deprecations.append(match) deprecations.sort(lambda x, y: cmp(x.lower(), y.lower())) print "%d C++ deprecations" % len(deprecations) return deprecations cpp_python_deprecation_regex = re.compile( "send_deprecation_warning\((?P.*?),\s*\"[^\"]+\",\s*__LINE__\)", re.DOTALL) python_deprecation_regex = re.compile( "warn_deprecated\((?P(?:(?:(?:\"\"\".*?\"\"\")|(?:'''.*?''')|(?:\".*?\")|(?:\'.*?\'))\s*)+)\)", re.DOTALL) python_deprecation_regex2 = re.compile("\.\.\s+warning::\s+(?P.*?)\"\"\"", re.DOTALL) def get_python_deprecations(): deprecations = [] for data in get_files_recursively("..", [".hpp", ".cpp"]): for match in find_all_matches(cpp_python_deprecation_regex, data): try: deprecations.append(eval("(%s)" % match)) except SyntaxError: pass for data in get_files_recursively("..", [".py"]): for match in find_all_matches(python_deprecation_regex, data): try: deprecations.append(eval(match)) except SyntaxError: pass for data in get_files_recursively("..", [".py"]): for match in find_all_matches(python_deprecation_regex2, data): deprecations.append(match) deprecations.sort(lambda x, y: cmp(x.lower(), y.lower())) print "%d Python deprecations" % len(deprecations) return deprecations def main(): chunks = {} get_tool_docs("gamera_deprecation_filter replace_get_set".split(), chunks) chunks["cpp_deprecations"] = format_deprecations(get_cpp_deprecations()) chunks["python_deprecations"] = format_deprecations(get_python_deprecations()) output = open("../doc/src/migration_guide.txt", "w") output.write(source % chunks) output.close() if __name__ == "__main__": main() gamera-3.3.3/migration_tools/README0000644000076500000000000000024210714675724016046 0ustar chriswheelThis directory contains a number of tools to help migrate Gamera scripts from Gamera 2.x to Gamera 3.x. See doc/html/migration_guide.html for more information. gamera-3.3.3/migration_tools/replace_get_set0000755000076500000000000000443710714675724020253 0ustar chriswheel#!/usr/bin/env python """ This script searches through C++ source files and corrects all uses of get and set in the deprecated Gamera 2.x style to the new Gamera 3.x style. For example:: get(r, c) will change to:: get(Point(c, r)) Note that this script uses regular expressions and is pretty naive about its understanding of C++, and will replace any method .get or .set (or ->get and ->set), not just those on Gamera Image objects, so it is recommended to check the results with a visual diffing tool. Usage on files:: $ ./replace_get_set source.hpp > source.hpp.new or as a filter:: $ cat source.hpp | ./replace_get_set > source.hpp.new """ import re import sys get_regex = re.compile("(?:\.|(?:->))get\((?!P)(?P.*?),(?P\s+)(?P.*?)\)") set_regex = re.compile("(?:\.|(?:->))set\((?!P)(?P.*?),(?P\s+)(?P.*?),(?P\s+)(?P.*?)\)") def migrate_get_and_set(input_data): while 1: get_match = get_regex.search(input_data) set_match = set_regex.search(input_data) if not get_match is None: group = get_match.group input_data = (input_data[:get_match.start()] + "get(Point(%s,%s%s))" % (group("b"), group("space"), group("a")) + input_data[get_match.end():]) num_substitutions += 1 elif not set_match is None: group = set_match.group input_data = (input_data[:set_match.start()] + "set(Point(%s,%s%s),%s%s)" % (group("b"), group("space"), group("a"), group("space2"), group("v")) + input_data[set_match.end():]) num_substitutions += 1 else: break return input_data def migrate_get_and_set_streams(input_stream, output_stream): output_stream.write(migrate_get_and_set(input_stream.read())) def main(): from optparse import OptionParser parser = OptionParser(usage = __doc__) options, args = parser.parse_args() if len(args) > 1: parser.error("You must supply a single filename to filter.") if len(args) == 0: input_stream = sys.stdin else: input_stream = open(args[0], "r") output_stream = sys.stdout migrate_get_and_set_streams(input_stream, output_stream) if __name__ == "__main__": main() gamera-3.3.3/misc/0000755000076500000000000000000011755376174012715 5ustar chriswheelgamera-3.3.3/misc/changefsfaddress.sh0000644000076500000000000000054511652050141016522 0ustar chriswheel#!/bin/sh OLDADDRESS="59 Temple Place - Suite 330, Boston, MA 02111-1307, USA" NEWADDRESS="51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA" for f in `grep -rl "$OLDADDRESS" src/* include/* gamera/* doc/* *.py LICENSE | grep -v '.svn/'` #for f in bla.py do echo "converting $f" sed "s/$OLDADDRESS/$NEWADDRESS/" $f > $f.new mv $f.new $f done gamera-3.3.3/misc/daily_build.py0000755000076500000000000001407511243556050015543 0ustar chriswheel#!/usr/bin/python # # Copyright (C) 2008-2009 Michael Droettboom # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # This is a total hack to generate and upload the daily builds. # Nothing about this file should be expected to be portable between # machines. # This script runs successfully on an Ubuntu 8.04 LTS system with # (at least) the following packages installed: # python-dev # python2.4 # python2.4-dev # mingw32 # g++ # libpng12-dev # libtiff4-dev # python-docutils # python-pygments # openssh-client # rsync import datetime import os import shutil import sys from distutils.util import get_platform import subprocess import pysvn ROOT_PATH = "/home/mdboom/JHU/builds/" WORKING_PATH = "gamera-daily-build" REPOS_PATH = "https://gamera.svn.sf.net/svnroot/gamera/trunk/gamera" STAGING_PATH = "gamera-daily" RSYNC_TARGET = "mdboom@xs004.mse.jhu.edu:/mnt/gamera-builds/" KEEP = 10 def mysystem(message, command): print message, try: # process = subprocess.Popen(command, shell=True, # stdout=subprocess.PIPE, # stderr=subprocess.PIPE) # retcode = process.wait() retcode = os.system(command) if retcode != 0: print "FAILED (%d)" % retcode return except: print "FAILED" raise else: print "SUCCESS" def myrmtree(path): if os.path.exists(path): shutil.rmtree(path) def mymkdir(path): if not os.path.exists(path): os.mkdir(path) def update_working_copy(): client = pysvn.Client() push_update = False if os.path.exists(WORKING_PATH): current_working = client.info(WORKING_PATH)['revision'].number current_remote = 0 for rev in client.update(WORKING_PATH): current_remote = max(current_remote, rev.number) if current_remote > current_working: print "Updates in SVN" push_update = True else: print "Checking out clean" client.checkout(REPOS_PATH, WORKING_PATH) current_working = client.info(WORKING_PATH)['revision'].number push_update = True return push_update, current_working def get_version(now, current_working): return "daily-%s-SVN-r%s" % (now, current_working) def update_version(version): fd = open(os.path.join(WORKING_PATH, "version"), "w") fd.write(version) fd.close() def build(version): build_dir = os.path.abspath(os.path.join(WORKING_PATH, "build", "lib.%s-%s" % (get_platform(), sys.version[0:3]))) if "--clean" in sys.argv: myrmtree(os.path.join(WORKING_PATH, "build")) myrmtree(os.path.join(WORKING_PATH, "dist")) myrmtree(os.path.join(WORKING_PATH, "doc/html")) os.chdir(WORKING_PATH) mysystem("Building for Linux (Python 2.6)...", "python setup.py build") mysystem("Building source distribution...", "python setup.py sdist") mysystem("Building for Windows...", "python setup.py build --compiler=mingw32_cross bdist_wininst") os.chdir("doc") mysystem("Building docs...", "export PYTHONPATH=%s:$PYTHONPATH; python gendoc.py" % build_dir) os.rename("html", "gamera-doc-%s" % version) mysystem("tar-gzipping docs...", "tar czvf gamera-doc-%s.tar.gz gamera-doc-%s" % (version, version)) mysystem("zipping docs...", "zip -r gamera-doc-%s.zip gamera-doc-%s" % (version, version)) os.rename("gamera-doc-%s" % version, "html") os.chdir("../..") def rotate(path, number=2): files = [] for f in os.listdir(path): p = os.path.join(path, f) files.append((os.stat(p).st_mtime, p)) if len(files) < KEEP * number: return files.sort() files.reverse() remove = files[KEEP * number:] for t, f in remove: os.path.remove(f) def stage(version): mymkdir(os.path.join(STAGING_PATH, "src")) mymkdir(os.path.join(STAGING_PATH, "win32")) mymkdir(os.path.join(STAGING_PATH, "doc")) shutil.copy2(os.path.join(WORKING_PATH, "dist", "gamera-%s.tar.gz" % version), os.path.join(STAGING_PATH, "src")) shutil.copy2(os.path.join(WORKING_PATH, "dist", "gamera-%s.win32-py%d.%d.exe" % (version, sys.version_info[0], sys.version_info[1])), os.path.join(STAGING_PATH, "win32")) shutil.copy2(os.path.join(WORKING_PATH, "doc", "gamera-doc-%s.tar.gz" % version), os.path.join(STAGING_PATH, "doc")) shutil.copy2(os.path.join(WORKING_PATH, "doc", "gamera-doc-%s.zip" % version), os.path.join(STAGING_PATH, "doc")) rotate(os.path.join(STAGING_PATH, "src")) rotate(os.path.join(STAGING_PATH, "win32")) rotate(os.path.join(STAGING_PATH, "doc"), 2) def rsync(): mysystem("uploading", "rsync -e ssh -arvz --delete %s/* %s" % (STAGING_PATH, RSYNC_TARGET)) def main(): os.chdir(ROOT_PATH) now = datetime.datetime.now().strftime("%Y%m%d") mymkdir(STAGING_PATH) log_file = open(os.path.join(STAGING_PATH, "daily-build.log"), "a") sys.stdout = log_file sys.stderr = log_file print "-" * 76 print "RUNNING:", now push_update, current_working = update_working_copy() if '--force' in sys.argv: push_update = True if not push_update: print "No updates today." else: version = get_version(now, current_working) update_version(version) build(version) stage(version) rsync() if __name__ == '__main__': main() gamera-3.3.3/misc/gamera.dtd0000644000076500000000000000167010714675701014642 0ustar chriswheel gamera-3.3.3/PKG-INFO0000644000076500000000000000055011755376174013057 0ustar chriswheelMetadata-Version: 1.0 Name: gamera Version: 3.3.3 Summary: This is the Gamera installer. Please ensure that Python 2.3 and wxPython 2.5 are installed before proceeding. Home-page: http://gamera.sourceforge.net/ Author: Michael Droettboom and Christoph Dalitz Author-email: gamera-devel@yahoogroups.com License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN gamera-3.3.3/README0000755000076500000000000000221511652050143012622 0ustar chriswheel====== Gamera ====== Gamera is a framework for building document analysis applications. It is not a packaged document recognition system, but a toolkit for building document image recognition systems. For more information about Gamera, visit the Gamera website at: http://gamera.informatik.hsnr.de/ Installation and Usage ---------------------- See the INSTALL file for installation instructions, or online under http://gamera.sourceforge.net/doc/html/install.html The complete Gamera documentation is available online at: http://gamera.sourceforge.net/doc/html/ Authors and License ------------------- (c)2001-2003 Michael Droettboom, Karl Mac Millan, Ichiro Fujinaga (c)2004-2007 Michael Droettboom (c)2008-2011 Michael Droettboom and Christoph Dalitz See the file ACKNOWLEDGEMENTS for additional contributors. This software is distributed under the GNU General Public License. See the file LICENSE for more information. As the GNU GPL is only applicable to software, the accompanying documentation is distributed under the terms of the Creative Commons Attribution-Share Alike license. See the bottom of the file doc/src/index.txt for details. gamera-3.3.3/setup.cfg0000755000076500000000000000051510714675736013607 0ustar chriswheel[bdist_wininst] bitmap=gamera/pixmaps/gamera_wizard.bmp title=Gamera 3 install-script=gamera_post_install.py [bdist_rpm] packager=Michael Droettboom doc_files=INSTALL LICENSE doc/html/ requires=python >= 2.3, python-dev >= 2.3, wxPythonGTK >= 2.6.0.0, libtiff >= 3.5, libpng >= 1.2 provides=gamera [clean] all=1 gamera-3.3.3/setup.py0000644000076500000000000001702711652050143013460 0ustar chriswheel#!/usr/bin/env python # -*- mode: python; indent-tabs-mode: nil; tab-width: 3 -*- # vim: set tabstop=3 shiftwidth=3 expandtab: # # Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, # and Karl MacMillan # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # import sys, os, glob, datetime from distutils.sysconfig import get_python_lib if sys.hexversion < 0x02030000: print "At least Python 2.3 is required to build Gamera. You have" print sys.version sys.exit(1) cross_compiling = False # We do this first, so that when gamera.__init__ loads gamera.__version__, # it is in fact the new and updated version gamera_version = open("version", 'r').readlines()[0].strip() i = 0 for argument in sys.argv: i = i + 1 if argument=="--dated_version": d = datetime.date.today() monthstring = str(d.month) daystring = str(d.day) if d.month < 10: monthstring = '0' + monthstring if d.day < 10: daystring = '0' + daystring gamera_version = "2_nightly_%s%s%s" % (d.year, monthstring, daystring) sys.argv.remove(argument) break elif argument == '--compiler=mingw32_cross': import mingw32_cross_compile sys.argv[sys.argv.index('--compiler=mingw32_cross')] = '--compiler=mingw32' cross_compiling = True open("gamera/__version__.py", "w").write("ver = '%s'\n\n" % gamera_version) print gamera_version from distutils.core import setup, Extension from gamera import gamera_setup ########################################## # generate the command line startup scripts command_line_utils = ( ('gamera_gui', 'gamera_gui.py', """#!%(executable)s %(header)s print "Loading GAMERA..." print "Use 'gamera_gui --help' to display command line options" import sys try: from gamera.config import config from gamera.gui import gui config.parse_args(sys.argv[1:]) gui.run() except Exception, e: if not isinstance(e, (SystemExit, KeyboardInterrupt)): import traceback import textwrap print "Gamera made the following fatal error:" print print textwrap.fill(str(e)) print print "=" * 75 print "The traceback is below. Please send this to the Gamera developers" print "if you feel you got here in error." print "-" * 75 traceback.print_exc() print "=" * 75 if sys.platform == "win32": print print "Press to exit." x = raw_input() """), ) if sys.platform == 'win32': command_line_filename_at = 1 scripts_directory_name = "Scripts" else: command_line_filename_at = 0 scripts_directory_name = "bin/" info = {'executable': sys.executable, 'header' : """# This file was automatically generated by the\n""" """# Gamera setup script on %s.\n""" % sys.platform} for util in command_line_utils: if sys.platform == 'win32': _, file, content = util else: file, _, content = util fd = open(file, 'w') fd.write(content % info) fd.close() os.chmod(file, 0700) scripts = [x[command_line_filename_at] for x in command_line_utils] + ['gamera_post_install.py'] ########################################## # generate the plugins plugin_extensions = [] plugins = gamera_setup.get_plugin_filenames('gamera/plugins/') plugin_extensions = gamera_setup.generate_plugins( plugins, "gamera.plugins", True) ######################################## # Non-plugin extensions ga_files = glob.glob("src/ga/*.cpp") ga_files.append("src/knncoremodule.cpp") graph_files = glob.glob("src/graph/*.cpp") + glob.glob("src/graph/graphmodule/*.cpp") kdtree_files = ["src/kdtreemodule.cpp", "src/geostructs/kdtree.cpp"] extensions = [Extension("gamera.gameracore", ["src/gameramodule.cpp", "src/sizeobject.cpp", "src/pointobject.cpp", "src/floatpointobject.cpp", "src/dimobject.cpp", "src/rectobject.cpp", "src/regionobject.cpp", "src/regionmapobject.cpp", "src/rgbpixelobject.cpp", "src/imagedataobject.cpp", "src/imageobject.cpp", "src/imageinfoobject.cpp", "src/iteratorobject.cpp" ], include_dirs=["include"], **gamera_setup.extras ), Extension("gamera.knncore", ga_files, include_dirs=["include", "src/ga", "src"], **gamera_setup.extras), Extension("gamera.graph", graph_files, include_dirs=["include", "src", "include/graph", "src/graph/graphmodule"], **gamera_setup.extras), Extension("gamera.kdtree", kdtree_files, include_dirs=["include", "src", "include/geostructs"], **gamera_setup.extras)] extensions.extend(plugin_extensions) ########################################## # Here's the basic distutils stuff # read versions from compile computer pythonversion = "%d.%d" % (sys.version_info[0],sys.version_info[1]) import wx wx_version_info = wx.__version__.split(".") wxversion = "%s.%s" % (wx_version_info[0],wx_version_info[1]) description = ("This is the Gamera installer.\n" + \ "\tPlease ensure that Python " + pythonversion + \ " and wxPython " + wxversion + "\n" + \ "\tare installed before proceeding.") includes = [(os.path.join(gamera_setup.include_path, path), glob.glob(os.path.join("include", os.path.join(path, ext)))) for path, ext in ("", "*.hpp"), ("plugins", "*.hpp"), ("vigra", "*.hxx"), ("geostructs", "*.hpp"), ("graph", "*.hpp")] srcfiles = [(os.path.join(gamera_setup.lib_path,path), glob.glob(os.path.join(path, ext))) for path, ext in [("src/geostructs", "*.cpp"), ("src/graph", "*.cpp")]] packages = ['gamera', 'gamera.gui', 'gamera.plugins', 'gamera.toolkits', 'gamera.backport'] if sys.hexversion >= 0x02040000: data_files = includes package_data = {"gamera": ["test/*.tiff"]} else: data_files = [(os.path.join(gamera_setup.lib_path, "$LIB/test"), glob.glob("gamera/test/*.tiff"))] + includes package_data = {} data_files += srcfiles if sys.platform == 'darwin': packages.append("gamera.mac") setup(cmdclass = gamera_setup.cmdclass, name = "gamera", version = gamera_version, url = "http://gamera.sourceforge.net/", author = "Michael Droettboom and Christoph Dalitz", author_email = "gamera-devel@yahoogroups.com", ext_modules = extensions, description = description, packages = packages, scripts = scripts, package_data = package_data, data_files = data_files ) gamera-3.3.3/src/0000755000076500000000000000000011755376174012551 5ustar chriswheelgamera-3.3.3/src/dimobject.cpp0000644000076500000000000001074211652050141015174 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; extern "C" { static PyObject* dim_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void dim_dealloc(PyObject* self); static int dim_set_nrows(PyObject* self, PyObject* value); static PyObject* dim_get_nrows(PyObject* self); static int dim_set_ncols(PyObject* self, PyObject* value); static PyObject* dim_get_ncols(PyObject* self); static PyObject* dim_richcompare(PyObject* a, PyObject* b, int op); static PyObject* dim_repr(PyObject* self); } static PyTypeObject DimType = { PyObject_HEAD_INIT(NULL) 0, }; static PyGetSetDef dim_getset[] = { { (char *)"nrows", (getter)dim_get_nrows, (setter)dim_set_nrows, (char *)"(int property get/set)\n\nThe current number of rows", 0}, { (char *)"ncols", (getter)dim_get_ncols, (setter)dim_set_ncols, (char *)"(int property get/set)\n\nthe current number of columns", 0}, { NULL } }; PyTypeObject* get_DimType() { return &DimType; } static PyObject* dim_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int x, y; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "ii:Dim.__init__", &x, &y) <= 0) return 0; DimObject* so; so = (DimObject*)pytype->tp_alloc(pytype, 0); so->m_x = new Dim((size_t)x, (size_t)y); return (PyObject*)so; } static void dim_dealloc(PyObject* self) { DimObject* x = (DimObject*)self; delete x->m_x; self->ob_type->tp_free(self); } #define CREATE_GET_FUNC(name) static PyObject* dim_get_##name(PyObject* self) {\ Dim* x = ((DimObject*)self)->m_x; \ return PyInt_FromLong((int)x->name()); \ } #define CREATE_SET_FUNC(name) static int dim_set_##name(PyObject* self, PyObject* value) {\ Dim* x = ((DimObject*)self)->m_x; \ x->name((size_t)PyInt_AS_LONG(value)); \ return 0; \ } CREATE_GET_FUNC(nrows) CREATE_SET_FUNC(nrows) CREATE_GET_FUNC(ncols) CREATE_SET_FUNC(ncols) static PyObject* dim_richcompare(PyObject* a, PyObject* b, int op) { if (!is_DimObject(a) || !is_DimObject(b)) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Dim& ap = *((DimObject*)a)->m_x; Dim& bp = *((DimObject*)b)->m_x; /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_LT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_LE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_EQ: cmp = ap == bp; break; case Py_NE: cmp = ap != bp; break; case Py_GT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_GE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; default: return 0; // cannot happen } if (cmp) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* dim_repr(PyObject* self) { Dim* x = ((DimObject*)self)->m_x; return PyString_FromFormat("Dim(%i, %i)", (int)x->ncols(), (int)x->nrows()); } void init_DimType(PyObject* module_dict) { DimType.ob_type = &PyType_Type; DimType.tp_name = CHAR_PTR_CAST "gameracore.Dim"; DimType.tp_basicsize = sizeof(DimObject); DimType.tp_dealloc = dim_dealloc; DimType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; DimType.tp_new = dim_new; DimType.tp_getattro = PyObject_GenericGetAttr; DimType.tp_alloc = NULL; // PyType_GenericAlloc; DimType.tp_richcompare = dim_richcompare; DimType.tp_getset = dim_getset; DimType.tp_free = NULL; // _PyObject_Del; DimType.tp_repr = dim_repr; DimType.tp_doc = CHAR_PTR_CAST "__init__(Int *ncols*, Int *nrows*)\n\n" "Dim stores a dimension (*ncols*, *nrows*)\n\n"; PyType_Ready(&DimType); PyDict_SetItemString(module_dict, "Dim", (PyObject*)&DimType); } gamera-3.3.3/src/floatpointobject.cpp0000644000076500000000000002142311652050141016600 0ustar chriswheel/* * * Copyright (C) 2005 Michael Droettboom * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" extern "C" { static PyObject* floatpoint_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void floatpoint_dealloc(PyObject* self); // get/set static PyObject* floatpoint_get_x(PyObject* self); static PyObject* floatpoint_get_y(PyObject* self); static PyObject* floatpoint_richcompare(PyObject* a, PyObject* b, int op); // methods static PyObject* floatpoint_distance(PyObject* self, PyObject* args); static PyObject* floatpoint_repr(PyObject* self); // operators static PyObject* floatpoint_add(PyObject* self, PyObject* args); static PyObject* floatpoint_sub(PyObject* self, PyObject* args); static PyObject* floatpoint_mul(PyObject* self, PyObject* args); static PyObject* floatpoint_div(PyObject* self, PyObject* args); static PyObject* floatpoint_negative(PyObject* self); static PyObject* floatpoint_positive(PyObject* self); static PyObject* floatpoint_absolute(PyObject* self); } static PyTypeObject FloatPointType = { PyObject_HEAD_INIT(NULL) 0, }; static PyNumberMethods floatpoint_number_methods; static PyGetSetDef floatpoint_getset[] = { { (char *)"x", (getter)floatpoint_get_x, NULL, (char *)"(float property)\n\nGet the current x value", 0}, { (char *)"y", (getter)floatpoint_get_y, NULL, (char *)"(float property)\n\nGet the current y value", 0}, { NULL } }; static PyMethodDef floatpoint_methods[] = { { CHAR_PTR_CAST "distance", floatpoint_distance, METH_O, CHAR_PTR_CAST "**distance** (POINT *p*)\n\nCalculates the Euclidean distance from this point to another point."}, { NULL } }; PyTypeObject* get_FloatPointType() { return &FloatPointType; } static PyObject* _floatpoint_new(PyTypeObject* pytype, FloatPoint* fp) { FloatPointObject* so; so = (FloatPointObject*)pytype->tp_alloc(pytype, 0); so->m_x = fp; return (PyObject*)so; } static PyObject* floatpoint_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); if (num_args == 2) { double x, y; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "dd:FloatPoint.__init__", &x, &y)) return _floatpoint_new(pytype, new FloatPoint(x, y)); } PyErr_Clear(); if (num_args == 1) { PyObject* p; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &p)) { try { return _floatpoint_new(pytype, new FloatPoint(coerce_FloatPoint(p))); } catch (std::exception e) { ; } } } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to FloatPoint constructor. Valid forms are: (x, y), (Point p), and ((x, y))."); return 0; } static void floatpoint_dealloc(PyObject* self) { FloatPointObject* x = (FloatPointObject*)self; delete x->m_x; self->ob_type->tp_free(self); } #define CREATE_GET_FUNC(name) static PyObject* floatpoint_get_##name(PyObject* self) {\ FloatPoint* x = ((FloatPointObject*)self)->m_x; \ return PyFloat_FromDouble(x->name()); \ } CREATE_GET_FUNC(x) CREATE_GET_FUNC(y) static PyObject* floatpoint_distance(PyObject* self, PyObject* point) { FloatPoint* x = ((FloatPointObject*)self)->m_x; try { FloatPoint fp = coerce_FloatPoint(point); double distance = x->distance(fp); return PyFloat_FromDouble(distance); } catch (std::exception e) { return 0; } } static PyObject* floatpoint_richcompare(PyObject* a, PyObject* b, int op) { FloatPoint ap, bp; try { ap = coerce_FloatPoint(a); } catch (std::exception e) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } try { bp = coerce_FloatPoint(b); } catch (std::exception e) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_LT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_LE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_EQ: cmp = ap == bp; break; case Py_NE: cmp = ap != bp; break; case Py_GT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_GE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; default: return 0; // cannot happen } if (cmp) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* floatpoint_repr(PyObject* self) { // Why do they make this so hard? PyString_FromFormat does // not support doubles FloatPoint* x = ((FloatPointObject*)self)->m_x; std::ostringstream ostr; ostr << *x; PyObject* result = PyString_FromStringAndSize(ostr.str().data(), ostr.str().size()); return result; } #define CREATE_BINARY_OPERATOR(name, op) \ static PyObject* floatpoint_##name(PyObject* self, PyObject* args) { \ FloatPoint* x = ((FloatPointObject*)self)->m_x; \ try { \ FloatPoint fp = coerce_FloatPoint(args); \ FloatPoint result = *x op fp; \ return create_FloatPointObject(result); \ } catch (std::exception e) { \ return 0; \ } \ } \ #define CREATE_UNARY_OPERATOR(name, op) \ static PyObject* floatpoint_##name(PyObject* self) { \ FloatPoint* x = ((FloatPointObject*)self)->m_x; \ FloatPoint result = op (*x); \ return create_FloatPointObject(result); \ } \ CREATE_BINARY_OPERATOR(add, +); CREATE_BINARY_OPERATOR(sub, -); CREATE_BINARY_OPERATOR(mul, *); CREATE_BINARY_OPERATOR(div, /); CREATE_UNARY_OPERATOR(negative, -); CREATE_UNARY_OPERATOR(positive, +); static PyObject* floatpoint_absolute(PyObject* self) { FloatPoint* x = ((FloatPointObject*)self)->m_x; FloatPoint result = abs(*x); return create_FloatPointObject(result); } void init_FloatPointType(PyObject* module_dict) { floatpoint_number_methods.nb_add = floatpoint_add; floatpoint_number_methods.nb_subtract = floatpoint_sub; floatpoint_number_methods.nb_multiply = floatpoint_mul; floatpoint_number_methods.nb_divide = floatpoint_div; floatpoint_number_methods.nb_negative = floatpoint_negative; floatpoint_number_methods.nb_positive = floatpoint_positive; floatpoint_number_methods.nb_absolute = floatpoint_absolute; FloatPointType.ob_type = &PyType_Type; FloatPointType.tp_name = CHAR_PTR_CAST "gameracore.FloatPoint"; FloatPointType.tp_basicsize = sizeof(FloatPointObject); FloatPointType.tp_dealloc = floatpoint_dealloc; FloatPointType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; FloatPointType.tp_new = floatpoint_new; FloatPointType.tp_getattro = PyObject_GenericGetAttr; FloatPointType.tp_alloc = NULL; // PyType_GenericAlloc; FloatPointType.tp_richcompare = floatpoint_richcompare; FloatPointType.tp_getset = floatpoint_getset; FloatPointType.tp_free = NULL; // _PyObject_Del; FloatPointType.tp_methods = floatpoint_methods; FloatPointType.tp_repr = floatpoint_repr; FloatPointType.tp_doc = CHAR_PTR_CAST "**FloatPoint** (*x*, *y*)\n\n" " *or*\n\n" "**FloatPoint** (Point *p*)\n\n" " *or*\n\n" "**FloatPoint** ((*x*, *y*))\n\n" "FloatPoint stores an (*x*, *y*) coordinate point using floating-point values.\n" "It is an immutable object, i.e., once it has been created at a certain position,\n" "it can not be moved.\n\n" "The standard Gamera ``Point`` stores coordinates as unsigned (positive) integers, " "and doesn't have any arithmetic operators. For this reason, ``FloatPoint`` is " "highly recommended for any analyses that require precision and flexibility. ``Point`` " "is kept around for backward compatibility, and because it is a more natural way to refer " "to physical pixels, as opposed to logical coordinates. There are, however, implicit " "conversions between the two types, so a ``FloatPoint`` can be used in place of ``Point`` " "where it makes sense. Care should be taken to ensure that negative values are never used " "to reference image pixels. (Range checking is performed when using from Python, but not " "when using from C++.)\n\n" "The standard arithmetic operators are available on ``FloatPoint`` objects (+ - * / abs)."; FloatPointType.tp_as_number = &floatpoint_number_methods; PyType_Ready(&FloatPointType); PyDict_SetItemString(module_dict, "FloatPoint", (PyObject*)&FloatPointType); } gamera-3.3.3/src/ga/0000755000076500000000000000000011755376174013140 5ustar chriswheelgamera-3.3.3/src/ga/ga.h0000644000076500000000000002071410714675676013707 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- ga.h mbwall 28jul94 Copyright (c) 1995-1996 Massachusetts Institute of Technology all rights reserved Main header for the GAlibrary. This header is provided to make it easy to include GAlib components in your code. It includes all of the genetic algorithm classes as well as all of the genome classes (plus a bunch of comments giving an overview of the library). References to 'Goldberg's Book' are to David E Goldberg's book, and references to 'Numerical Recipes' are to the Numerical Recipes in C book. "Genetic Algorithms in Search, Optimization, and Machine Learning" Goldberg, David Edward, 1953- Addison-Wesley Pub. Co., (c) 1989 ISBN 0-201-15767-5 "Numerical Recipes in C: The Art of Scientific Computing" Cambridge University Press, (c) 1988-1992 ISBN 0-521-43108-5 ------------------------------------------------------------------------------- Overview of who does what in the GAlibrary -- see http://lancet.mit.edu/ga/ ------------------------------------------------------------------------------- Here are the library capabilities and which parts of the library are involved: Genetic Algorithm This object contains the operators and data needed to perform the optimization. There are a few basic GA implementations in the library, including the basic 'simple' genetic algorithm described by Goldberg, the 'steady-state' genetic algorithm, the 'incremental' genetic algorithm based on the Genitor model, and the 'parallel' genetic algorithm that uses multiple populations in parallel on a single CPU. The base GA object defines many of the parameters and statistics useful when running an experiment. It also defines the basic interface for most genetic algorithms. Genome The genome object contains the actual problem-specific data as well as the mapping from data-domain to problem-domain (by way of the objective functions All of the genomes are derived from a base genome class. The base genome class defines the interface used by genetic algorithms to modify the data. Any genome used in an experiment must be derived from the base genom class as well as a user-defined data type (or one of the sample types provided in GAlib). The library includes array, tree, list, and binary-string data types to use if you do not want to define your own. Population Each population contains a bunch of genomes. Populations know how to select genomes. They also have housekeeping routines such as replace, remove, and add. A population can be given some intelligence by using its evaluation member rather than evaluting each individual on its own. Selection Selection is implemented as a member function of the population object. Any GA simply calls the population's 'select' member to get the genome that it needs to work with. Crossover/Mating Crossover is implemented as a separate object. We have various crossover objects, each corresponding to a genome type. These could be templatized, but that wouldn't buy us much since the behaviour depends upon the data type anyway. Crossover is not a member function of the genomes. I fretted over how to do this properly and decided to keep crossover as an operator separate from the genomes. The other viable option was to make crossover a member function of the genomes, but then changing the crossover during the course of the evolution becomes more difficult. Also, it is easier to define asexual (or other non-standard mating schemes) with an operator that is not a member of the genome object. When you create a GA, you specify a genome (or population of genomes). The GA asks the genome how it mates, and the genome returns a pointer to its preferred crossover method. You can set the crossover explicitly on the GA if you prefer. Using this scheme we can assign default crossover operators so that you don't have to specify a crossover unless you want to. Each genome type must have a corresponding crossover operator defined that can operate on that data type. The genetic algorithms don't care about the specific crossover type - they call the mating methods based upon the high level interface definition. Mutation Mutation is defined at the genome level and is implemented as a member function of the base genome class. Each genome must define its own mutation method that will operate on its specific data type. Replacement strategies The replacement strategy defines how a child is inserted into a population. Replacement strategies include child-replaces-parent, child-replaces-worst, and child-replaces-random. These make sense only for GAs with overlapping populations. Convergence and completion The GA defines a 'done' member that calls a user-defineable completion function to determine whether or not the GA is finished. Built-in completion routines include population-converged, best-converged and number-of-generations. Fitness vs Objective Note the difference between fitness function and objective function. In this library, the objective function is user-defined and tells (on an arbitrary scale) how well a genome performs relative to other genomes. The fitness function, on the other hand, takes objective function scores and processes them to produce a number for each genome that represents its fitness for mating/selection. The selection strategies include roulette wheel, tournament, linear ranking, and stochastic sampling. See the selector headers for more details about each strategy and its implementation. Speciation is included as a type of selection. To use the speciating selector you must define a distance function. See the selector header for more details. Scaling methods are loosely coupled with the selection strategies. They include linear scaling, sigma truncation, and ranking. See the fitness headers for more details about how you can mix and match scaling methods with selection strategies. Elitism Elitism is optional. If you want the best of each generation to be carried over to the next generation, turn on the elitism. If not, turn it off. This only works with non-overlapping populations. Initialization Each genome has its own initialization operator. When a GA is initialized, it initializes its populations, which in turn tells each chromomosome to initialize itself. You can use the initialization method to bias an initial population. This can be done either at the population level by customizing the population's initialization operator or at the genome level by customizing the genome's initilizer. Default initializers are included for most genomes. See the documentation and genome headers for more details. ------------------------------------------------------------------------------- Basic usage You create a GA by first instantiating the non-default parts that you want to use. For example, if you want a binary string genome with uniform crossover and roulette wheel selection, you would define an objective function, instantiate a genome, instantiate a uniform crossover operator, then instantiate the GA. Since the roulette wheel selector is the default, you do not need to instantiate one to use that method. In every case you MUST define an objective function and you MUST instantiate one copy of the genome type you want to use. ---------------------------------------------------------------------------- */ #ifndef _ga_ga_h_ #define _ga_ga_h_ // Make sure that we get the configuration into each of the galib components // that will be used. #include // These are the headers for all of the genetic algorithm classes. #include #include #include #include #ifndef NO_TEMPLATES #include #endif // Here we include the headers for all of the various genome types. We do // *not* include the headers for template specializations. This prevents // unnecessary instantiations of template objects. #include #include #include #include #ifndef NO_TEMPLATES #include #include #include #include #include //#include //#include #endif #endif gamera-3.3.3/src/ga/GA1DArrayGenome.cpp0000644000076500000000000010522310714675676016460 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- array1.C mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the 1D array genome. ---------------------------------------------------------------------------- */ #ifndef _ga_array1_C_ #define _ga_array1_C_ #include #include #include #include #include #include template int GA1DArrayIsHole(const GA1DArrayGenome&, const GA1DArrayGenome&, int, int, int); /* ---------------------------------------------------------------------------- 1DArrayGenome ---------------------------------------------------------------------------- */ template const char * GA1DArrayGenome::className() const {return "GA1DArrayGenome";} template int GA1DArrayGenome::classID() const {return GAID::ArrayGenome;} // Set all the initial values to NULL or zero, then allocate the space we'll // need (using the resize method). We do NOT call the initialize method at // this point - initialization must be done explicitly by the user of the // genome (eg when the population is created or reset). If we called the // initializer routine here then we could end up with multiple initializations // and/or calls to dummy initializers (for example when the genome is // created with a dummy initializer and the initializer is assigned later on). // Besides, we default to the no-initialization initializer by calling the // default genome constructor. template GA1DArrayGenome:: GA1DArrayGenome(unsigned int length, GAGenome::Evaluator f, void * u) : GAArray(length), GAGenome(DEFAULT_1DARRAY_INITIALIZER, DEFAULT_1DARRAY_MUTATOR, DEFAULT_1DARRAY_COMPARATOR) { evaluator(f); userData(u); nx=minX=maxX=length; crossover(DEFAULT_1DARRAY_CROSSOVER); } // This is the copy initializer. We set everything to the default values, then // copy the original. The Array creator takes care of zeroing the data. template GA1DArrayGenome:: GA1DArrayGenome(const GA1DArrayGenome & orig) : GAArray(orig.sz), GAGenome() { GA1DArrayGenome::copy(orig); } // Delete whatever we own. template GA1DArrayGenome::~GA1DArrayGenome() { } // This is the class-specific copy method. It will get called by the super // class since the superclass operator= is set up to call ccopy (and that is // what we define here - a virtual function). We should check to be sure that // both genomes are the same class and same dimension. This function tries // to be smart about they way it copies. If we already have data, then we do // a memcpy of the one we're supposed to copy. If we don't or we're not the // same size as the one we're supposed to copy, then we adjust ourselves. // The Array takes care of the resize in its copy method. template void GA1DArrayGenome::copy(const GAGenome & orig){ if(&orig == this) return; const GA1DArrayGenome* c = DYN_CAST(const GA1DArrayGenome*, &orig); if(c) { GAGenome::copy(*c); GAArray::copy(*c); nx = c->nx; minX = c->minX; maxX = c->maxX; } } template GAGenome * GA1DArrayGenome::clone(GAGenome::CloneMethod flag) const { GA1DArrayGenome *cpy = new GA1DArrayGenome(nx); if(flag == CONTENTS){ cpy->copy(*this); } else{ cpy->GAGenome::copy(*this); cpy->maxX = maxX; cpy->minX = minX; } return cpy; } // Resize the genome. // A negative value for the length means that we should randomly set the // length of the genome (if the resize behaviour is resizeable). If // someone tries to randomly set the length and the resize behaviour is fixed // length, then we don't do anything. // We pay attention to the values of minX and maxX - they determine what kind // of resizing we are allowed to do. If a resize is requested with a length // less than the min length specified by the behaviour, we set the minimum // to the length. If the length is longer than the max length specified by // the behaviour, we set the max value to the length. // We return the total size (in bits) of the genome after resize. // We don't do anything to the new contents! template int GA1DArrayGenome::resize(int len) { if(len == STA_CAST(int,nx)) return nx; if(len == GAGenome::ANY_SIZE) len = GARandomInt(minX, maxX); else if(len < 0) return nx; // do nothing else if(minX == maxX) minX=maxX=len; else{ if(len < STA_CAST(int,minX)) len=minX; if(len > STA_CAST(int,maxX)) len=maxX; } nx = GAArray::size(len); _evaluated = gaFalse; return sz; } #ifndef NO_STREAMS // We don't define this one apriori. Do it in a specialization. template int GA1DArrayGenome::read(istream &) { GAErr(GA_LOC, className(), "read", gaErrOpUndef); return 1; } // When we write the data to a stream we do it with spaces between elements. // Also, there is no newline at the end of the stream of digits. template int GA1DArrayGenome::write(ostream & os) const { for(unsigned int i=0; i int GA1DArrayGenome:: resizeBehaviour(unsigned int lower, unsigned int upper) { if(upper < lower){ GAErr(GA_LOC, className(), "resizeBehaviour", gaErrBadResizeBehaviour); return resizeBehaviour(); } minX = lower; maxX = upper; if(nx > upper) GA1DArrayGenome::resize(upper); if(nx < lower) GA1DArrayGenome::resize(lower); return resizeBehaviour(); } template int GA1DArrayGenome::resizeBehaviour() const { int val = maxX; if(maxX == minX) val = FIXED_SIZE; return val; } template int GA1DArrayGenome::equal(const GAGenome & c) const { const GA1DArrayGenome & b = DYN_CAST(const GA1DArrayGenome &, c); return((this == &c) ? 1 : ((nx != b.nx) ? 0 : GAArray::equal(b,0,0,nx))); } /* ---------------------------------------------------------------------------- 1DArrayAlleleGenome These genomes contain an allele set. When we create a new genome, it owns its own, independent allele set. If we clone a new genome, the new one gets a link to our allele set (so we don't end up with zillions of allele sets). Same is true for the copy constructor. The array may have a single allele set or an array of allele sets, depending on which creator was called. Either way, the allele set cannot be changed once the array is created. ---------------------------------------------------------------------------- */ template const char * GA1DArrayAlleleGenome::className() const {return "GA1DArrayAlleleGenome";} template int GA1DArrayAlleleGenome::classID() const {return GAID::ArrayAlleleGenome;} template GA1DArrayAlleleGenome:: GA1DArrayAlleleGenome(unsigned int length, const GAAlleleSet & s, GAGenome::Evaluator f, void * u) : GA1DArrayGenome(length, f, u){ naset = 1; aset = new GAAlleleSet[1]; aset[0] = s; initializer(DEFAULT_1DARRAY_ALLELE_INITIALIZER); mutator(DEFAULT_1DARRAY_ALLELE_MUTATOR); comparator(DEFAULT_1DARRAY_ALLELE_COMPARATOR); crossover(DEFAULT_1DARRAY_ALLELE_CROSSOVER); } template GA1DArrayAlleleGenome:: GA1DArrayAlleleGenome(const GAAlleleSetArray & sa, GAGenome::Evaluator f, void * u) : GA1DArrayGenome(sa.size(), f, u) { naset = sa.size(); aset = new GAAlleleSet[naset]; for(int i=0; i GA1DArrayAlleleGenome:: GA1DArrayAlleleGenome(const GA1DArrayAlleleGenome& orig) : GA1DArrayGenome(orig.sz) { naset = 0; aset = (GAAlleleSet*)0; GA1DArrayAlleleGenome::copy(orig); } // Delete the allele set template GA1DArrayAlleleGenome::~GA1DArrayAlleleGenome(){ delete [] aset; } // This implementation of clone does not make use of the contents/attributes // capability because this whole interface isn't quite right yet... Just // clone the entire thing, contents and all. template GAGenome * GA1DArrayAlleleGenome::clone(GAGenome::CloneMethod) const { return new GA1DArrayAlleleGenome(*this); } template void GA1DArrayAlleleGenome::copy(const GAGenome& orig){ if(&orig == this) return; const GA1DArrayAlleleGenome * c = DYN_CAST(const GA1DArrayAlleleGenome*, &orig); if(c) { GA1DArrayGenome::copy(*c); if(naset != c->naset){ delete [] aset; naset = c->naset; aset = new GAAlleleSet[naset]; } for(int i=0; iaset[i]); } } // If we resize to a larger length then we need to set the contents to a valid // value (ie one of our alleles). template int GA1DArrayAlleleGenome::resize(int len){ unsigned int oldx = nx; GA1DArrayGenome::resize(len); if(nx > oldx){ for(unsigned int i=oldx; i int GA1DArrayAlleleGenome::read(istream& is){ return GA1DArrayGenome::read(is); } template int GA1DArrayAlleleGenome::write(ostream& os) const { return GA1DArrayGenome::write(os); } #endif template int GA1DArrayAlleleGenome::equal(const GAGenome & c) const { return GA1DArrayGenome::equal(c); } /* ---------------------------------------------------------------------------- Operator definitions ---------------------------------------------------------------------------- */ // The random initializer sets the elements of the array based on the alleles // set. We choose randomly the allele for each element. template void GA1DArrayAlleleGenome::UniformInitializer(GAGenome & c) { GA1DArrayAlleleGenome &child= DYN_CAST(GA1DArrayAlleleGenome &, c); child.resize(GAGenome::ANY_SIZE); // let chrom resize if it can for(int i=child.length()-1; i>=0; i--) child.gene(i, child.alleleset(i).allele()); } // Random initializer for order-based genome. Loop through the genome // and assign each element the next allele in the allele set. Once each // element has been initialized, scramble the contents by swapping elements. // This assumes that there is only one allele set for the array. template void GA1DArrayAlleleGenome::OrderedInitializer(GAGenome & c) { GA1DArrayAlleleGenome &child= DYN_CAST(GA1DArrayAlleleGenome &, c); child.resize(GAGenome::ANY_SIZE); // let chrom resize if it can int length = child.length()-1; int n=0; int i; for(i=length; i>=0; i--){ child.gene(i, child.alleleset().allele(n++)); if(n >= child.alleleset().size()) n = 0; } for(i=length; i>=0; i--) child.swap(i, GARandomInt(0, length)); } // Randomly pick elements in the array then set the element to any of the // alleles in the allele set for this genome. This will work for any number // of allele sets for a given array. template int GA1DArrayAlleleGenome::FlipMutator(GAGenome & c, float pmut) { GA1DArrayAlleleGenome &child= DYN_CAST(GA1DArrayAlleleGenome &, c); register int n, i; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float,child.length()); if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=child.length()-1; i>=0; i--){ if(GAFlipCoin(pmut)){ child.gene(i, child.alleleset(i).allele()); nMut++; } } } else{ // only flip the number of bits we need to flip for(n=0; n int GA1DArrayGenome::SwapMutator(GAGenome & c, float pmut) { GA1DArrayGenome &child=DYN_CAST(GA1DArrayGenome&, c); register int n, i; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float,child.length()); int length = child.length()-1; if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=length; i>=0; i--){ if(GAFlipCoin(pmut)){ child.swap(i, GARandomInt(0, length)); nMut++; } } } else{ // only flip the number of bits we need to flip for(n=0; n float GA1DArrayGenome:: ElementComparator(const GAGenome& a, const GAGenome& b) { const GA1DArrayGenome& sis= DYN_CAST(const GA1DArrayGenome&, a); const GA1DArrayGenome& bro= DYN_CAST(const GA1DArrayGenome&, b); if(sis.length() != bro.length()) return -1; if(sis.length() == 0) return 0; float count = 0.0; for(int i=sis.length()-1; i>=0; i--) count += ((sis.gene(i) == bro.gene(i)) ? 0 : 1); return count/sis.length(); } #define SWAP(a,b) {unsigned int tmp=a; a=b; b=tmp;} // Randomly take bits from each parent. For each bit we flip a coin to see if // that bit should come from the mother or the father. If strings are // different lengths then we need to use the mask to get things right. template int GA1DArrayGenome:: UniformCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DArrayGenome &mom=DYN_CAST(const GA1DArrayGenome &, p1); const GA1DArrayGenome &dad=DYN_CAST(const GA1DArrayGenome &, p2); int n=0; int i; if(c1 && c2){ GA1DArrayGenome &sis=DYN_CAST(GA1DArrayGenome &, *c1); GA1DArrayGenome &bro=DYN_CAST(GA1DArrayGenome &, *c2); if(sis.length() == bro.length() && mom.length() == dad.length() && sis.length() == mom.length()){ for(i=sis.length()-1; i>=0; i--){ if(GARandomBit()){ sis.gene(i, mom.gene(i)); bro.gene(i, dad.gene(i)); } else{ sis.gene(i, dad.gene(i)); bro.gene(i, mom.gene(i)); } } } else{ GAMask mask; int start; int max = (sis.length() > bro.length()) ? sis.length() : bro.length(); int min = (mom.length() < dad.length()) ? mom.length() : dad.length(); mask.size(max); for(i=0; i=0; i--) sis.gene(i, (mask[i] ? mom.gene(i) : dad.gene(i))); start = (bro.length() < min) ? bro.length()-1 : min-1; for(i=start; i>=0; i--) bro.gene(i, (mask[i] ? dad.gene(i) : mom.gene(i))); } n = 2; } else if(c1 || c2){ GA1DArrayGenome &sis = (c1 ? DYN_CAST(GA1DArrayGenome &, *c1) : DYN_CAST(GA1DArrayGenome &, *c2)); if(mom.length() == dad.length() && sis.length() == mom.length()){ for(i=sis.length()-1; i>=0; i--) sis.gene(i, (GARandomBit() ? mom.gene(i) : dad.gene(i))); } else{ int min = (mom.length() < dad.length()) ? mom.length() : dad.length(); min = (sis.length() < min) ? sis.length() : min; for(i=min-1; i>=0; i--) sis.gene(i, (GARandomBit() ? mom.gene(i) : dad.gene(i))); } n = 1; } return n; } // Single point crossover for 1D array genomes. Pick a single point then // copy genetic material from each parent. We must allow for resizable genomes // so be sure to check the behaviours before we do the crossovers. If resizing // is allowed then the children will change depending on where the site is // located. It is also possible to have a mixture of resize behaviours, but // we won't worry about that at this point. If this happens we just say that // we cannot handle that and post an error message. template int GA1DArrayGenome:: OnePointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DArrayGenome &mom=DYN_CAST(const GA1DArrayGenome &, p1); const GA1DArrayGenome &dad=DYN_CAST(const GA1DArrayGenome &, p2); int nc=0; unsigned int momsite, momlen; unsigned int dadsite, dadlen; if(c1 && c2){ GA1DArrayGenome &sis=DYN_CAST(GA1DArrayGenome &, *c1); GA1DArrayGenome &bro=DYN_CAST(GA1DArrayGenome &, *c2); if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE && bro.resizeBehaviour() == GAGenome::FIXED_SIZE){ if(mom.length() != dad.length() || sis.length() != bro.length() || sis.length() != mom.length()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } momsite = dadsite = GARandomInt(0, mom.length()); momlen = dadlen = mom.length() - momsite; } else if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE || bro.resizeBehaviour() == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsite = GARandomInt(0, mom.length()); dadsite = GARandomInt(0, dad.length()); momlen = mom.length() - momsite; dadlen = dad.length() - dadsite; sis.resize(momsite+dadlen); bro.resize(dadsite+momlen); } sis.copy(mom, 0, 0, momsite); sis.copy(dad, momsite, dadsite, dadlen); bro.copy(dad, 0, 0, dadsite); bro.copy(mom, dadsite, momsite, momlen); nc = 2; } else if(c1 || c2){ GA1DArrayGenome &sis = (c1 ? DYN_CAST(GA1DArrayGenome &, *c1) : DYN_CAST(GA1DArrayGenome &, *c2)); if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE){ if(mom.length() != dad.length() || sis.length() != mom.length()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } momsite = dadsite = GARandomInt(0, mom.length()); momlen = dadlen = mom.length() - momsite; } else{ momsite = GARandomInt(0, mom.length()); dadsite = GARandomInt(0, dad.length()); momlen = mom.length() - momsite; dadlen = dad.length() - dadsite; sis.resize(momsite+dadlen); } if(GARandomBit()){ sis.copy(mom, 0, 0, momsite); sis.copy(dad, momsite, dadsite, dadlen); } else{ sis.copy(dad, 0, 0, dadsite); sis.copy(mom, dadsite, momsite, momlen); } nc = 1; } return nc; } // Two point crossover for the 1D array genome. Similar to the single point // crossover, but here we pick two points then grab the sections based upon // those two points. // When we pick the points, it doesn't matter where they fall (one is not // dependent upon the other). Make sure we get the lesser one into the first // position of our site array. template int GA1DArrayGenome:: TwoPointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DArrayGenome &mom=DYN_CAST(const GA1DArrayGenome &, p1); const GA1DArrayGenome &dad=DYN_CAST(const GA1DArrayGenome &, p2); int nc=0; unsigned int momsite[2], momlen[2]; unsigned int dadsite[2], dadlen[2]; if(c1 && c2){ GA1DArrayGenome &sis=DYN_CAST(GA1DArrayGenome &, *c1); GA1DArrayGenome &bro=DYN_CAST(GA1DArrayGenome &, *c2); if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE && bro.resizeBehaviour() == GAGenome::FIXED_SIZE){ if(mom.length() != dad.length() || sis.length() != bro.length() || sis.length() != mom.length()){ GAErr(GA_LOC, mom.className(), "two-point cross", gaErrSameLengthReqd); return nc; } momsite[0] = GARandomInt(0, mom.length()); momsite[1] = GARandomInt(0, mom.length()); if(momsite[0] > momsite[1]) SWAP(momsite[0], momsite[1]); momlen[0] = momsite[1] - momsite[0]; momlen[1] = mom.length() - momsite[1]; dadsite[0] = momsite[0]; dadsite[1] = momsite[1]; dadlen[0] = momlen[0]; dadlen[1] = momlen[1]; } else if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE || bro.resizeBehaviour() == GAGenome::FIXED_SIZE){ return nc; } else{ momsite[0] = GARandomInt(0, mom.length()); momsite[1] = GARandomInt(0, mom.length()); if(momsite[0] > momsite[1]) SWAP(momsite[0], momsite[1]); momlen[0] = momsite[1] - momsite[0]; momlen[1] = mom.length() - momsite[1]; dadsite[0] = GARandomInt(0, dad.length()); dadsite[1] = GARandomInt(0, dad.length()); if(dadsite[0] > dadsite[1]) SWAP(dadsite[0], dadsite[1]); dadlen[0] = dadsite[1] - dadsite[0]; dadlen[1] = dad.length() - dadsite[1]; sis.resize(momsite[0]+dadlen[0]+momlen[1]); bro.resize(dadsite[0]+momlen[0]+dadlen[1]); } sis.copy(mom, 0, 0, momsite[0]); sis.copy(dad, momsite[0], dadsite[0], dadlen[0]); sis.copy(mom, momsite[0]+dadlen[0], momsite[1], momlen[1]); bro.copy(dad, 0, 0, dadsite[0]); bro.copy(mom, dadsite[0], momsite[0], momlen[0]); bro.copy(dad, dadsite[0]+momlen[0], dadsite[1], dadlen[1]); nc = 2; } else if(c1 || c2){ GA1DArrayGenome &sis = (c1 ? DYN_CAST(GA1DArrayGenome &, *c1) : DYN_CAST(GA1DArrayGenome &, *c2)); if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE){ if(mom.length() != dad.length() || sis.length() != mom.length()){ GAErr(GA_LOC, mom.className(), "two-point cross", gaErrSameLengthReqd); return nc; } momsite[0] = GARandomInt(0, mom.length()); momsite[1] = GARandomInt(0, mom.length()); if(momsite[0] > momsite[1]) SWAP(momsite[0], momsite[1]); momlen[0] = momsite[1] - momsite[0]; momlen[1] = mom.length() - momsite[1]; dadsite[0] = momsite[0]; dadsite[1] = momsite[1]; dadlen[0] = momlen[0]; dadlen[1] = momlen[1]; } else{ momsite[0] = GARandomInt(0, mom.length()); momsite[1] = GARandomInt(0, mom.length()); if(momsite[0] > momsite[1]) SWAP(momsite[0], momsite[1]); momlen[0] = momsite[1] - momsite[0]; momlen[1] = mom.length() - momsite[1]; dadsite[0] = GARandomInt(0, dad.length()); dadsite[1] = GARandomInt(0, dad.length()); if(dadsite[0] > dadsite[1]) SWAP(dadsite[0], dadsite[1]); dadlen[0] = dadsite[1] - dadsite[0]; dadlen[1] = dad.length() - dadsite[1]; sis.resize(momsite[0]+dadlen[0]+momlen[1]); } if(GARandomBit()){ sis.copy(mom, 0, 0, momsite[0]); sis.copy(dad, momsite[0], dadsite[0], dadlen[0]); sis.copy(mom, momsite[0]+dadlen[0], momsite[1], momlen[1]); } else{ sis.copy(dad, 0, 0, dadsite[0]); sis.copy(mom, dadsite[0], momsite[0], momlen[0]); sis.copy(dad, dadsite[0]+momlen[0], dadsite[1], dadlen[1]); } nc = 1; } return nc; } // Even and odd crossover for the array works just like it does for the // binary strings. For even crossover we take the 0th element and every other // one after that from the mother. The 1st and every other come from the // father. For odd crossover, we do just the opposite. template int GA1DArrayGenome:: EvenOddCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DArrayGenome &mom=DYN_CAST(const GA1DArrayGenome &, p1); const GA1DArrayGenome &dad=DYN_CAST(const GA1DArrayGenome &, p2); int nc=0; int i; if(c1 && c2){ GA1DArrayGenome &sis=DYN_CAST(GA1DArrayGenome &, *c1); GA1DArrayGenome &bro=DYN_CAST(GA1DArrayGenome &, *c2); if(sis.length() == bro.length() && mom.length() == dad.length() && sis.length() == mom.length()){ for(i=sis.length()-1; i>=1; i-=2){ sis.gene(i, mom.gene(i)); bro.gene(i, dad.gene(i)); sis.gene(i-1, dad.gene(i-1)); bro.gene(i-1, mom.gene(i-1)); } if(i==0){ sis.gene(0, mom.gene(0)); bro.gene(0, dad.gene(0)); } } else{ int start; int min = (mom.length() < dad.length()) ? mom.length() : dad.length(); start = (sis.length() < min) ? sis.length()-1 : min-1; for(i=start; i>=0; i--) sis.gene(i, ((i%2 == 0) ? mom.gene(i) : dad.gene(i))); start = (bro.length() < min) ? bro.length()-1 : min-1; for(i=start; i>=0; i--) bro.gene(i, ((i%2 == 0) ? dad.gene(i) : mom.gene(i))); } nc = 2; } else if(c1 || c2){ GA1DArrayGenome &sis = (c1 ? DYN_CAST(GA1DArrayGenome &, *c1) : DYN_CAST(GA1DArrayGenome &, *c2)); if(mom.length() == dad.length() && sis.length() == mom.length()){ for(i=sis.length()-1; i>=1; i-=2){ sis.gene(i, mom.gene(i)); sis.gene(i-1, dad.gene(i-1)); } if(i==0){ sis.gene(0, mom.gene(0)); } } else{ int min = (mom.length() < dad.length()) ? mom.length() : dad.length(); min = (sis.length() < min) ? sis.length()-1 : min-1; for(i=min; i>=0; i--) sis.gene(i, ((i%2 == 0) ? mom.gene(i) : dad.gene(i))); } nc = 1; } return nc; } // Partial match crossover for the 1D array genome. This uses the partial // matching algorithm described in Goldberg's book. // Parents and children must be the same size for this crossover to work. If // they are not, we post an error message. // We make sure that b will be greater than a. template int GA1DArrayGenome:: PartialMatchCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DArrayGenome &mom=DYN_CAST(const GA1DArrayGenome &, p1); const GA1DArrayGenome &dad=DYN_CAST(const GA1DArrayGenome &, p2); int nc=0; int a = GARandomInt(0, mom.length()); int b = GARandomInt(0, dad.length()); if(b < a) SWAP(a,b); int i,j,index; if(mom.length() != dad.length()){ GAErr(GA_LOC, mom.className(), "parial match cross", gaErrBadParentLength); return nc; } if(c1 && c2){ GA1DArrayGenome &sis=DYN_CAST(GA1DArrayGenome &, *c1); GA1DArrayGenome &bro=DYN_CAST(GA1DArrayGenome &, *c2); sis.GAArray::copy(mom); for(i=a, index=a; i::copy(dad); for(i=a, index=a; i &sis = (c1 ? DYN_CAST(GA1DArrayGenome &, *c1) : DYN_CAST(GA1DArrayGenome &, *c2)); const GA1DArrayGenome *parent1, *parent2; if(GARandomBit()) { parent1 = &mom; parent2 = &dad; } else { parent1 = &dad; parent2 = &mom; } sis.GAArray::copy(*parent1); for(i=a, index=a; igene(index); j++); sis.swap(i,j); } nc = 1; } return nc; } // This function determines whether or not an indexed position is a hole that // we can substitute into. It does a linear search to find the holes (yuk). template int GA1DArrayIsHole(const GA1DArrayGenome &c, const GA1DArrayGenome &dad, int index, int a, int b){ for(int i=a; i int GA1DArrayGenome:: OrderCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DArrayGenome &mom=DYN_CAST(const GA1DArrayGenome &, p1); const GA1DArrayGenome &dad=DYN_CAST(const GA1DArrayGenome &, p2); int nc=0; int a = GARandomInt(0, mom.length()); int b = GARandomInt(0, mom.length()); if(b < a) SWAP(a,b); int i,j, index; if(mom.length() != dad.length()){ GAErr(GA_LOC, mom.className(), "order cross", gaErrBadParentLength); return nc; } if(c1 && c2){ GA1DArrayGenome &sis=DYN_CAST(GA1DArrayGenome &, *c1); GA1DArrayGenome &bro=DYN_CAST(GA1DArrayGenome &, *c2); // Copy the parent sis.GAArray::copy(mom); // Move all the 'holes' into the crossover section for(i=0, index=b; i= sis.size()) index=0; if(GA1DArrayIsHole(sis,dad,index,a,b)) break; } for(; i= sis.size()) index=0; j=index; do{ j++; if(j >= sis.size()) j=0; } while(GA1DArrayIsHole(sis,dad,j,a,b)); sis.swap(index,j); } // Now put the 'holes' in the proper order within the crossover section. for(i=a; i::copy(dad); // Move all the 'holes' into the crossover section for(i=0, index=b; i= bro.size()) index=0; if(GA1DArrayIsHole(bro,mom,index,a,b)) break; } for(; i= bro.size()) index=0; j=index; do{ j++; if(j >= bro.size()) j=0; } while(GA1DArrayIsHole(bro,mom,j,a,b)); bro.swap(index,j); } // Now put the 'holes' in the proper order within the crossover section. for(i=a; i &sis = (c1 ? DYN_CAST(GA1DArrayGenome &, *c1) : DYN_CAST(GA1DArrayGenome &, *c2)); const GA1DArrayGenome *parent1, *parent2; if(GARandomBit()) { parent1 = &mom; parent2 = &dad; } else { parent1 = &dad; parent2 = &mom; } sis.GAArray::copy(*parent1); for(i=0, index=b; i= sis.size()) index=0; if(GA1DArrayIsHole(sis,*parent2,index,a,b)) break; } for(; i= sis.size()) index=0; j=index; do{ j++; if(j >= sis.size()) j=0; } while(GA1DArrayIsHole(sis,*parent2,j,a,b)); sis.swap(index,j); } for(i=a; igene(i)){ for(j=i+1; jgene(i)) sis.swap(i,j); } } nc = 1; } return nc; } // Cycle crossover for the 1D array genome. This is implemented as described // in goldberg's book. The first is picked from mom, then cycle using dad. // Finally, fill in the gaps with the elements from dad. // We allocate space for a temporary array in this routine. It never frees // the memory that it uses, so you might want to re-think this if you're really // memory-constrained (similar to what we do with the uniform crossover when // the children are resizeable). // Allocate space for an array of flags. We use this to keep track of whether // the child's contents came from the mother or the father. We don't free the // space here, but it is not a memory leak. // The first step is to cycle through mom & dad to get the cyclic part of // the crossover. Then fill in the rest of the sis with dad's contents that // we didn't use in the cycle. Finally, do the same thing for the other child. // Notice that this implementation makes serious use of the operator= for the // objects in the array. It also requires the operator != and == comparators. template int GA1DArrayGenome:: CycleCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DArrayGenome &mom=DYN_CAST(const GA1DArrayGenome &, p1); const GA1DArrayGenome &dad=DYN_CAST(const GA1DArrayGenome &, p2); int nc=0; int i, current=0; if(mom.length() != dad.length()){ GAErr(GA_LOC, mom.className(), "cycle cross", gaErrBadParentLength); return nc; } if(c1 && c2){ GAMask mask; GA1DArrayGenome &sis=DYN_CAST(GA1DArrayGenome &, *c1); GA1DArrayGenome &bro=DYN_CAST(GA1DArrayGenome &, *c2); mask.size(sis.length()); mask.clear(); sis.gene(0, mom.gene(0)); mask[0] = 1; while(dad.gene(current) != mom.gene(0)){ for(i=0; i &sis = (c1 ? DYN_CAST(GA1DArrayGenome &, *c1) : DYN_CAST(GA1DArrayGenome &, *c2)); const GA1DArrayGenome *parent1, *parent2; if(GARandomBit()) { parent1 = &mom; parent2 = &dad; } else { parent1 = &dad; parent2 = &mom; } GAMask mask; mask.size(sis.length()); mask.clear(); sis.gene(0, parent1->gene(0)); mask[0] = 1; while(parent2->gene(current) != parent1->gene(0)){ for(i=0; igene(i) == parent2->gene(current)){ sis.gene(i, parent1->gene(i)); mask[i] = 1; current = i; break; } } } for(i=0; igene(i)); nc = 1; } return nc; } #undef SWAP #endif gamera-3.3.3/src/ga/GA1DArrayGenome.h0000644000076500000000000001571411755375060016120 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- array1.h mbwall 25feb95 Copyright (c) 1995-1996 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This header defines the interface for the 1D array genome. You can use ANY kind of object in this genome. But notice that it is really easy to optimize this for some of the simpler types. I'll try to do that for common instantiations (float, char). The objects in the array must have the following operators defined: = == != >> must be defined if you use the default read methods TO DO: *** If you want speed, specialize the comparison routines and copy routines so that you can use memcpy, memmove, memcmp rather than looping through each element. *** make the object defined for simple types, if you want to use complex types then specialize to do member copy rather than bit copy (that way simple users won't sacrifice speed, and complex users will get more complexity) ---------------------------------------------------------------------------- */ #ifndef _ga_array1_h_ #define _ga_array1_h_ #include #include #include /* ---------------------------------------------------------------------------- 1DArrayGenome ---------------------------------------------------------------------------- */ template class GA1DArrayGenome : public GAArray, public GAGenome { protected: using GAArray::sz; using GAArray::a; public: GADeclareIdentity(); static int SwapMutator(GAGenome&, float); static float ElementComparator(const GAGenome&, const GAGenome&); static int UniformCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int EvenOddCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int OnePointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int TwoPointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int PartialMatchCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int OrderCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int CycleCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); public: GA1DArrayGenome(unsigned int x, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA1DArrayGenome(const GA1DArrayGenome & orig); GA1DArrayGenome& operator=(const GAGenome& orig) {copy(orig); return *this;} GA1DArrayGenome& operator=(const T array []) // no err checks! {for(unsigned int i=0; i & orig, unsigned int r, unsigned int x, unsigned int l){ if(l > 0 && x < orig.nx && r < nx){ if(x + l > orig.nx) l = orig.nx - x; if(r + l > nx) l = nx - r; GAArray::copy(orig,r,x,l); } _evaluated = gaFalse; } void swap(unsigned int i, unsigned int j) {GAArray::swap(i,j); _evaluated = gaFalse; } protected: unsigned int nx; // how long is the data string? unsigned int minX; // what is the lower limit? unsigned int maxX; // what is the upper limit? private: GA1DArrayGenome() : GAArray(0){} }; /* ---------------------------------------------------------------------------- 1DArrayAlleleGenome ------------------------------------------------------------------------------- We don't do any error checking on the assignment to const array of type T, so the array may contain elements that are not in the allele set. When we clone, we link the new allele set to our own so that we don't make unnecessary copies. If someone sets a new allele set on the genome, then we make a complete new copy of the new one and break any link to a previous one. It is OK to resize these genomes, so we don't have to protect the resize. If this is an order-based genome then resizing should be done when the allele set is changed, but there is nothing implicit in the object that tells us that this is an order-based genome, so that's up to the user to take care of. If you're really concerned about catching this type of error, derive a class from this class that does order-based protection. I have defined all of the genome virtual functions here to make it easier to do specializations (you can specialize this class instead if its superclass). We define our own resize so that we can set to allele values on resize to a bigger length. ---------------------------------------------------------------------------- */ template class GA1DArrayAlleleGenome : public GA1DArrayGenome { protected: using GA1DArrayGenome::nx; using GA1DArrayGenome::a; public: using GA1DArrayGenome::ElementComparator; using GA1DArrayGenome::OnePointCrossover; using GA1DArrayGenome::initializer; using GA1DArrayGenome::mutator; using GA1DArrayGenome::comparator; using GA1DArrayGenome::crossover; GADeclareIdentity(); static void UniformInitializer(GAGenome&); static void OrderedInitializer(GAGenome&); static int FlipMutator(GAGenome&, float); public: GA1DArrayAlleleGenome(unsigned int x, const GAAlleleSet & a, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA1DArrayAlleleGenome(const GAAlleleSetArray & a, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA1DArrayAlleleGenome(const GA1DArrayAlleleGenome&); GA1DArrayAlleleGenome& operator=(const GAGenome& arr) {copy(arr); return *this;} GA1DArrayAlleleGenome& operator=(const T array []) // no err checks! {GA1DArrayGenome::operator=(array); return *this;} virtual ~GA1DArrayAlleleGenome(); virtual GAGenome *clone(GAGenome::CloneMethod flag=GAGenome::CONTENTS) const; virtual void copy(const GAGenome &); #ifndef NO_STREAMS virtual int read(istream& is); virtual int write (ostream& os) const; #endif virtual int equal(const GAGenome & c) const ; virtual int resize(int x); const GAAlleleSet& alleleset(unsigned int i=0) const {return aset[i%naset];} protected: int naset; GAAlleleSet * aset; // the allele set(s) for this genome }; #ifdef USE_BORLAND_INST #include #endif #endif gamera-3.3.3/src/ga/GA1DBinStrGenome.cpp0000644000076500000000000005412310714675676016605 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr1.C mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the 1D binary string genome. ---------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #define SWAP(a,b) {unsigned int tmp=a; a=b; b=tmp;} /* ---------------------------------------------------------------------------- Genome class definition ---------------------------------------------------------------------------- */ // Set all the initial values to NULL or zero, then allocate the space we'll // need (using the resize method). We do NOT call the initialize method at // this point - initialization must be done explicitly by the user of the // genome (eg when the population is created or reset). If we called the // initializer routine here then we could end up with multiple initializations // and/or calls to dummy initializers (for example when the genome is // created with a dummy initializer and the initializer is assigned later on). GA1DBinaryStringGenome:: GA1DBinaryStringGenome(unsigned int len, GAGenome::Evaluator f, void * u) : GABinaryString(len), GAGenome(DEFAULT_1DBINSTR_INITIALIZER, DEFAULT_1DBINSTR_MUTATOR, DEFAULT_1DBINSTR_COMPARATOR) { evaluator(f); userData(u); crossover(DEFAULT_1DBINSTR_CROSSOVER); // assign the default sexual crossover nx=minX=maxX=0; resize(len); } // This is the copy initializer. We set everything to the default values, then // copy the original. The BinaryStringGenome creator takes care of zeroing // the data and sz members. GA1DBinaryStringGenome:: GA1DBinaryStringGenome(const GA1DBinaryStringGenome& orig) : GABinaryString(orig.GABinaryString::size()), GAGenome() { nx=minX=maxX=0; GA1DBinaryStringGenome::copy(orig); } GA1DBinaryStringGenome::~GA1DBinaryStringGenome() { } // The clone member creates a duplicate (exact or just attributes, depending // on the flag). The caller is responsible for freeing the memory that is // allocated by this method. GAGenome* GA1DBinaryStringGenome::clone(GAGenome::CloneMethod flag) const { GA1DBinaryStringGenome *cpy = new GA1DBinaryStringGenome(nx); if(flag == CONTENTS){ cpy->copy(*this); } else{ cpy->GAGenome::copy(*this); cpy->maxX = maxX; cpy->minX = minX; } return cpy; } // This is the class-specific copy method. It will get called by the super // class since the superclass operator= is set up to call ccopy (and that is // what we define here - a virtual function). We should check to be sure that // both genomes are the same class and same dimension. This function tries // to be smart about they way it copies. If we already have data, then we do // a memcpy of the one we're supposed to copy. If we don't or we're not the // same size as the one we're supposed to copy, then we adjust ourselves. // The BinaryStringGenome takes care of the resize in its copy method. // It also copies the bitstring for us. void GA1DBinaryStringGenome::copy(const GAGenome & orig) { if(&orig == this) return; const GA1DBinaryStringGenome* c = DYN_CAST(const GA1DBinaryStringGenome*, &orig); if(c) { GAGenome::copy(*c); GABinaryString::copy(*c); nx = c->nx; minX = c->minX; maxX = c->maxX; } } // Resize the genome. If someone specifies ANY_RESIZE then we pick a random // size within the behaviour limits that have been set. If limits have been // set and someone passes us something outside the limits, we resize to the // closest bound. If the genome is fixed size (ie min limit equals max limit) // then we resize to the specified value and move the min/max to match it. int GA1DBinaryStringGenome::resize(int l) { if(l == STA_CAST(int, nx)) return nx; if(l == GAGenome::ANY_SIZE) l = GARandomInt(minX, maxX); else if(l < 0) return nx; // do nothing else if(minX == maxX) minX=maxX=l; else{ if(l < STA_CAST(int, minX)) l=minX; if(l > STA_CAST(int, maxX)) l=maxX; } GABinaryString::resize(l); if(l > STA_CAST(int, nx)) for(int i=nx; i> c; if(isdigit(c)) gene(i++, ((c == '0') ? 0 : 1)); } _evaluated = gaFalse; if(is.eof() && i < nx){ GAErr(GA_LOC, className(), "read", gaErrUnexpectedEOF); is.clear(ios::badbit | is.rdstate()); return 1; } return 0; } // When we write the data to a stream we do it without any spaces. Also, there // is no newline at the end of the stream of digits. int GA1DBinaryStringGenome::write(ostream & os) const { for(unsigned int i=0; i upper) resize(upper); if(nx < lower) resize(lower); return resizeBehaviour(); } int GA1DBinaryStringGenome::resizeBehaviour() const { int val = maxX; if(maxX == minX) val = FIXED_SIZE; return val; } int GA1DBinaryStringGenome:: equal(const GA1DBinaryStringGenome& c, unsigned int dest, unsigned int src, unsigned int len) const { return GABinaryString::equal(c,dest,src,len); } int GA1DBinaryStringGenome::equal(const GAGenome & c) const { if(this == &c) return 1; const GA1DBinaryStringGenome* b = DYN_CAST(const GA1DBinaryStringGenome*,&c); int eq = 0; if(b) { eq = ((nx != b->nx) ? 0 : GABinaryString::equal(*b,0,0,nx)); } return eq; } /* ---------------------------------------------------------------------------- Operators ---------------------------------------------------------------------------- */ // Set the bits of the genome to random values. We use the library's // random bit function so we don't have to worry about machine-specific stuff. // We also do a resize so the genome can resize itself (randomly) if it // is a resizeable genome. void GA1DBinaryStringGenome::UniformInitializer(GAGenome & c) { GA1DBinaryStringGenome &child=DYN_CAST(GA1DBinaryStringGenome &, c); child.resize(GAGenome::ANY_SIZE); // let chrom resize if it can for(int i=child.length()-1; i>=0; i--) child.gene(i, GARandomBit()); // initial values are all random } // Unset all of the bits in the genome. void GA1DBinaryStringGenome::UnsetInitializer(GAGenome & c) { GA1DBinaryStringGenome &child=DYN_CAST(GA1DBinaryStringGenome &, c); child.resize(GAGenome::ANY_SIZE); // let chrom resize if it can child.unset(0, child.length()); } // Set all of the bits in the genome. void GA1DBinaryStringGenome::SetInitializer(GAGenome & c) { GA1DBinaryStringGenome &child=DYN_CAST(GA1DBinaryStringGenome &, c); child.resize(GAGenome::ANY_SIZE); // let chrom resize if it can child.set(0, child.length()); } // This function gets called a lot (especially for the simple ga) so it must // be as streamlined as possible. If the mutation probability is small, then // we must call random on each bit in the string. Otherwise, can can simply // mutate a known number of bits (based on the mutation rate). We don't check // to see how many bits we flip, nor do we keep track of which ones got flipped // so this can result in an actual mutation that is lower than that specified, // but the bigger the genome and the smaller the mutation probability, the // better the chance that it will match the desired mutation rate. // If nMut is greater than 1, then we round up, so a mutation of 2.2 would // be 3 mutations, and 2.9 would be 3 as well. nMut of 3 would be 3 mutations. int GA1DBinaryStringGenome::FlipMutator(GAGenome & c, float pmut) { GA1DBinaryStringGenome &child=DYN_CAST(GA1DBinaryStringGenome &, c); register int n, i; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float, child.length()); if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=child.length()-1; i>=0; i--){ if(GAFlipCoin(pmut)){ child.gene(i, ((child.gene(i) == 0) ? 1 : 0)); nMut++; } } } else{ // only flip the number of bits we need to flip for(n=0; n=0; i--) count += ((sis.gene(i) == bro.gene(i)) ? 0 : 1); return count/sis.length(); } // Randomly take bits from each parent. For each bit we flip a coin to see if // that bit should come from the mother or the father. This operator can be // used on genomes of different lengths, but the crossover is truncated to the // shorter of the parents and child. int GA1DBinaryStringGenome:: UniformCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DBinaryStringGenome &mom= DYN_CAST(const GA1DBinaryStringGenome &, p1); const GA1DBinaryStringGenome &dad= DYN_CAST(const GA1DBinaryStringGenome &, p2); int n=0; int i; if(c1 && c2){ GA1DBinaryStringGenome &sis=DYN_CAST(GA1DBinaryStringGenome &, *c1); GA1DBinaryStringGenome &bro=DYN_CAST(GA1DBinaryStringGenome &, *c2); if(sis.length() == bro.length() && mom.length() == dad.length() && sis.length() == mom.length()){ for(i=sis.length()-1; i>=0; i--){ if(GARandomBit()){ sis.gene(i, mom.gene(i)); bro.gene(i, dad.gene(i)); } else{ sis.gene(i, dad.gene(i)); bro.gene(i, mom.gene(i)); } } } else{ GAMask mask; int start; int max = (sis.length() > bro.length()) ? sis.length() : bro.length(); int min = (mom.length() < dad.length()) ? mom.length() : dad.length(); mask.size(max); for(i=0; i=0; i--) sis.gene(i, (mask[i] ? mom.gene(i) : dad.gene(i))); start = (bro.length() < min) ? bro.length()-1 : min-1; for(i=start; i>=0; i--) bro.gene(i, (mask[i] ? dad.gene(i) : mom.gene(i))); } n = 2; } else if(c1 || c2){ GA1DBinaryStringGenome &sis = (c1 ? DYN_CAST(GA1DBinaryStringGenome&, *c1) : DYN_CAST(GA1DBinaryStringGenome&, *c2)); if(mom.length() == dad.length() && sis.length() == mom.length()){ for(i=sis.length()-1; i>=0; i--) sis.gene(i, (GARandomBit() ? mom.gene(i) : dad.gene(i))); } else{ int min = (mom.length() < dad.length()) ? mom.length() : dad.length(); min = (sis.length() < min) ? sis.length() : min; for(i=min-1; i>=0; i--) sis.gene(i, (GARandomBit() ? mom.gene(i) : dad.gene(i))); } n = 1; } return n; } // Pick a point in the parents then grab alternating chunks for each child. // A word about crossover site mapping. If a genome has width 10, the // cross site can assume a value of 0 to 10, inclusive. A site of 0 means // that all of the material comes from the father. A site of 10 means that // all of the material comes from the mother. A site of 3 means that bits // 0-2 come from the mother and bits 3-9 come from the father. int GA1DBinaryStringGenome:: OnePointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DBinaryStringGenome &mom= DYN_CAST(const GA1DBinaryStringGenome &, p1); const GA1DBinaryStringGenome &dad= DYN_CAST(const GA1DBinaryStringGenome &, p2); int n=0; unsigned int momsite, momlen; unsigned int dadsite, dadlen; if(c1 && c2){ GA1DBinaryStringGenome &sis=DYN_CAST(GA1DBinaryStringGenome &, *c1); GA1DBinaryStringGenome &bro=DYN_CAST(GA1DBinaryStringGenome &, *c2); if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE && bro.resizeBehaviour() == GAGenome::FIXED_SIZE){ if(mom.length() != dad.length() || sis.length() != bro.length() || sis.length() != mom.length()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return n; } momsite = dadsite = GARandomInt(0, mom.length()); momlen = dadlen = mom.length() - momsite; } else if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE || bro.resizeBehaviour() == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return n; } else{ momsite = GARandomInt(0, mom.length()); dadsite = GARandomInt(0, dad.length()); momlen = mom.length() - momsite; dadlen = dad.length() - dadsite; sis.resize(momsite+dadlen); bro.resize(dadsite+momlen); } sis.copy(mom, 0, 0, momsite); sis.copy(dad, momsite, dadsite, dadlen); bro.copy(dad, 0, 0, dadsite); bro.copy(mom, dadsite, momsite, momlen); n = 2; } else if(c1 || c2){ GA1DBinaryStringGenome &sis = (c1 ? DYN_CAST(GA1DBinaryStringGenome&, *c1) : DYN_CAST(GA1DBinaryStringGenome&, *c2)); if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE){ if(mom.length() != dad.length() || sis.length() != mom.length()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return n; } momsite = dadsite = GARandomInt(0, mom.length()); momlen = dadlen = mom.length() - momsite; } else{ momsite = GARandomInt(0, mom.length()); dadsite = GARandomInt(0, dad.length()); momlen = mom.length() - momsite; dadlen = dad.length() - dadsite; sis.resize(momsite+dadlen); } if(GARandomBit()){ sis.copy(mom, 0, 0, momsite); sis.copy(dad, momsite, dadsite, dadlen); } else{ sis.copy(dad, 0, 0, dadsite); sis.copy(mom, dadsite, momsite, momlen); } n = 1; } return n; } // Two point crossover for one dimension binary strings. The first part is // taken from the mother, the second from the father, and the third from the // mother. If the child is resizable then we resize before copying the parts. // The rules for doing resizable crossover apply here as well as for the // single point crossover (see comments for 1Pt for details). int GA1DBinaryStringGenome:: TwoPointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DBinaryStringGenome &mom= DYN_CAST(const GA1DBinaryStringGenome &, p1); const GA1DBinaryStringGenome &dad= DYN_CAST(const GA1DBinaryStringGenome &, p2); int n=0; unsigned int momsite[2], momlen[2]; unsigned int dadsite[2], dadlen[2]; if(c1 && c2){ GA1DBinaryStringGenome &sis=DYN_CAST(GA1DBinaryStringGenome &, *c1); GA1DBinaryStringGenome &bro=DYN_CAST(GA1DBinaryStringGenome &, *c2); if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE && bro.resizeBehaviour() == GAGenome::FIXED_SIZE){ if(mom.length() != dad.length() || sis.length() != bro.length() || sis.length() != mom.length()){ GAErr(GA_LOC, mom.className(), "two-point cross", gaErrSameLengthReqd); return n; } momsite[0] = GARandomInt(0, mom.length()); momsite[1] = GARandomInt(0, mom.length()); if(momsite[0] > momsite[1]) SWAP(momsite[0], momsite[1]); momlen[0] = momsite[1] - momsite[0]; momlen[1] = mom.length() - momsite[1]; dadsite[0] = momsite[0]; dadsite[1] = momsite[1]; dadlen[0] = momlen[0]; dadlen[1] = momlen[1]; } else if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE || bro.resizeBehaviour() == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "two-point cross", gaErrSameBehavReqd); return n; } else{ momsite[0] = GARandomInt(0, mom.length()); momsite[1] = GARandomInt(0, mom.length()); if(momsite[0] > momsite[1]) SWAP(momsite[0], momsite[1]); momlen[0] = momsite[1] - momsite[0]; momlen[1] = mom.length() - momsite[1]; dadsite[0] = GARandomInt(0, dad.length()); dadsite[1] = GARandomInt(0, dad.length()); if(dadsite[0] > dadsite[1]) SWAP(dadsite[0], dadsite[1]); dadlen[0] = dadsite[1] - dadsite[0]; dadlen[1] = dad.length() - dadsite[1]; sis.resize(momsite[0]+dadlen[0]+momlen[1]); bro.resize(dadsite[0]+momlen[0]+dadlen[1]); } sis.copy(mom, 0, 0, momsite[0]); sis.copy(dad, momsite[0], dadsite[0], dadlen[0]); sis.copy(mom, momsite[0]+dadlen[0], momsite[1], momlen[1]); bro.copy(dad, 0, 0, dadsite[0]); bro.copy(mom, dadsite[0], momsite[0], momlen[0]); bro.copy(dad, dadsite[0]+momlen[0], dadsite[1], dadlen[1]); n = 2; } else if(c1 || c2){ GA1DBinaryStringGenome &sis = (c1 ? DYN_CAST(GA1DBinaryStringGenome&, *c1) : DYN_CAST(GA1DBinaryStringGenome&, *c2)); if(sis.resizeBehaviour() == GAGenome::FIXED_SIZE){ if(mom.length() != dad.length() || sis.length() != mom.length()){ GAErr(GA_LOC, mom.className(), "two-point cross", gaErrSameLengthReqd); return n; } momsite[0] = GARandomInt(0, mom.length()); momsite[1] = GARandomInt(0, mom.length()); if(momsite[0] > momsite[1]) SWAP(momsite[0], momsite[1]); momlen[0] = momsite[1] - momsite[0]; momlen[1] = mom.length() - momsite[1]; dadsite[0] = momsite[0]; dadsite[1] = momsite[1]; dadlen[0] = momlen[0]; dadlen[1] = momlen[1]; } else{ momsite[0] = GARandomInt(0, mom.length()); momsite[1] = GARandomInt(0, mom.length()); if(momsite[0] > momsite[1]) SWAP(momsite[0], momsite[1]); momlen[0] = momsite[1] - momsite[0]; momlen[1] = mom.length() - momsite[1]; dadsite[0] = GARandomInt(0, dad.length()); dadsite[1] = GARandomInt(0, dad.length()); if(dadsite[0] > dadsite[1]) SWAP(dadsite[0], dadsite[1]); dadlen[0] = dadsite[1] - dadsite[0]; dadlen[1] = dad.length() - dadsite[1]; sis.resize(momsite[0]+dadlen[0]+momlen[1]); } if(GARandomBit()){ sis.copy(mom, 0, 0, momsite[0]); sis.copy(dad, momsite[0], dadsite[0], dadlen[0]); sis.copy(mom, momsite[0]+dadlen[0], momsite[1], momlen[1]); } else{ sis.copy(dad, 0, 0, dadsite[0]); sis.copy(mom, dadsite[0], momsite[0], momlen[0]); sis.copy(dad, dadsite[0]+momlen[0], dadsite[1], dadlen[1]); } n = 1; } return n; } // Even and odd crossovers take alternating bits from the mother and father. // For even crossover, we take every even bit from the mother and every odd bit // from the father (the first bit is the 0th bit, so it is even). Odd // crossover is just the opposite. int GA1DBinaryStringGenome:: EvenOddCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA1DBinaryStringGenome &mom= DYN_CAST(const GA1DBinaryStringGenome &, p1); const GA1DBinaryStringGenome &dad= DYN_CAST(const GA1DBinaryStringGenome &, p2); int n=0; int i; if(c1 && c2){ GA1DBinaryStringGenome &sis=DYN_CAST(GA1DBinaryStringGenome &, *c1); GA1DBinaryStringGenome &bro=DYN_CAST(GA1DBinaryStringGenome &, *c2); if(sis.length() == bro.length() && mom.length() == dad.length() && sis.length() == mom.length()){ for(i=sis.length()-1; i>=1; i-=2){ sis.gene(i, mom.gene(i)); bro.gene(i, dad.gene(i)); sis.gene(i-1, dad.gene(i-1)); bro.gene(i-1, mom.gene(i-1)); } if(i==0){ sis.gene(0, mom.gene(0)); bro.gene(0, dad.gene(0)); } } else{ int start; int min = (mom.length() < dad.length()) ? mom.length() : dad.length(); start = (sis.length() < min) ? sis.length()-1 : min-1; for(i=start; i>=0; i--) sis.gene(i, ((i%2 == 0) ? mom.gene(i) : dad.gene(i))); start = (bro.length() < min) ? bro.length()-1 : min-1; for(i=start; i>=0; i--) bro.gene(i, ((i%2 == 0) ? dad.gene(i) : mom.gene(i))); } n = 2; } else if(c1 || c2){ GA1DBinaryStringGenome &sis = (c1 ? DYN_CAST(GA1DBinaryStringGenome&, *c1) : DYN_CAST(GA1DBinaryStringGenome&, *c2)); if(mom.length() == dad.length() && sis.length() == mom.length()){ for(i=sis.length()-1; i>=1; i-=2){ sis.gene(i, mom.gene(i)); sis.gene(i-1, dad.gene(i-1)); } if(i==0){ sis.gene(0, mom.gene(0)); } } else{ int min = (mom.length() < dad.length()) ? mom.length() : dad.length(); min = (sis.length() < min) ? sis.length()-1 : min-1; for(i=min; i>=0; i--) sis.gene(i, ((i%2 == 0) ? mom.gene(i) : dad.gene(i))); } n = 1; } return n; } gamera-3.3.3/src/ga/GA1DBinStrGenome.h0000644000076500000000000001314310714675676016247 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr1.h mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This header defines the interface for the 1D binary string genome, including crossover objects and all the default and built-in operators. ---------------------------------------------------------------------------- */ #ifndef _ga_binstr1_h_ #define _ga_binstr1_h_ #include #include /* ---------------------------------------------------------------------------- 1DBinaryStringGenome ------------------------------------------------------------------------------- resize These genomes are resizable. In addition, you can set a resize behaviour to specify the bounds in which the resize can occur. copy Copy bits from the specified genome using the location and length that are passed to us. If the current genome is too short for the entire length, copy whatever we can. If the original genome is too short for the specified length, copy whatever we can. If either location is out of bounds, return without doing anything. We do NOT check for negative values in the locations! This routine clips if the copy sizes do not match - it does NOT resize the genome to fit the copy. You'll have to do resizes before you call this routine if you want the copy to fit the original. ==, != Are two genomes equal? Our test for equality is based upon the contents of the genome, NOT the behaviour. So as long as the bitstreams match, the genomes are 'equal'. This means that a resizeable genome may be equal to a fixed-length genome. But a chromsome with 500 bits allocated is not equal to a genome with 10 bits allocated unless both are the same size. ---------------------------------------------------------------------------- */ class GA1DBinaryStringGenome : public GABinaryString, public GAGenome { public: GADefineIdentity("GA1DBinaryStringGenome", GAID::BinaryStringGenome); static void UniformInitializer(GAGenome &); static void UnsetInitializer(GAGenome &); static void SetInitializer(GAGenome &); static int FlipMutator(GAGenome &, float); static int UniformCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int EvenOddCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int OnePointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int TwoPointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static float BitComparator(const GAGenome&, const GAGenome&); public: GA1DBinaryStringGenome(unsigned int x, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA1DBinaryStringGenome(const GA1DBinaryStringGenome & orig); GA1DBinaryStringGenome& operator=(const GAGenome& arg) {copy(arg); return *this;} GA1DBinaryStringGenome& operator=(const short array []) // no err checks! {for(unsigned int i=0; i 0 && x < orig.nx && r < nx){ if(x + l > orig.nx) l = orig.nx - x; if(r + l > nx) l = nx - r; GABinaryString::copy(orig,r,x,l); } _evaluated = gaFalse; } inline void GA1DBinaryStringGenome::set(unsigned int x, unsigned int l){ if(x + l > nx) l = nx - x; GABinaryString::set(x, l); _evaluated = gaFalse; } inline void GA1DBinaryStringGenome::unset(unsigned int x, unsigned int l){ if(x + l > nx) l = nx - x; GABinaryString::unset(x, l); _evaluated = gaFalse; } inline void GA1DBinaryStringGenome::randomize(unsigned int x, unsigned int l){ if(x + l > nx) l = nx - x; GABinaryString::randomize(x, l); _evaluated = gaFalse; } inline void GA1DBinaryStringGenome::move(unsigned int x, unsigned int srcx,unsigned int l){ if(srcx + l > nx) l = nx - srcx; if(x + l > nx) l = nx - x; GABinaryString::move(x, srcx, l); _evaluated = gaFalse; } #endif gamera-3.3.3/src/ga/GA2DArrayGenome.cpp0000644000076500000000000005326110714675676016465 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- array2.C mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the 2D array genome. ---------------------------------------------------------------------------- */ #ifndef _ga_array2_C_ #define _ga_array2_C_ #include #include #include #include #include #include /* ---------------------------------------------------------------------------- 2DArrayGenome ---------------------------------------------------------------------------- */ template const char * GA2DArrayGenome::className() const {return "GA2DArrayGenome";} template int GA2DArrayGenome::classID() const {return GAID::ArrayGenome2D;} template GA2DArrayGenome:: GA2DArrayGenome(unsigned int width, unsigned int height, GAGenome::Evaluator f, void * u) : GAArray(width*height), GAGenome(DEFAULT_2DARRAY_INITIALIZER, DEFAULT_2DARRAY_MUTATOR, DEFAULT_2DARRAY_COMPARATOR) { evaluator(f); userData(u); crossover(DEFAULT_2DARRAY_CROSSOVER); nx=minX=maxX=width; ny=minY=maxY=height; } template GA2DArrayGenome:: GA2DArrayGenome(const GA2DArrayGenome & orig) : GAArray(orig.sz){ GA2DArrayGenome::copy(orig); } template GA2DArrayGenome::~GA2DArrayGenome() { } template void GA2DArrayGenome::copy(const GAGenome & orig){ if(&orig == this) return; const GA2DArrayGenome* c = DYN_CAST(const GA2DArrayGenome*, &orig); if(c) { GAGenome::copy(*c); GAArray::copy(*c); nx = c->nx; ny = c->ny; minX = c->minX; minY = c->minY; maxX = c->maxX; maxY = c->maxY; } } template GAGenome * GA2DArrayGenome::clone(GAGenome::CloneMethod flag) const { GA2DArrayGenome *cpy = new GA2DArrayGenome(nx,ny); if(flag == CONTENTS){ cpy->copy(*this); } else{ cpy->GAGenome::copy(*this); cpy->minX = minX; cpy->minY = minY; cpy->maxX = maxX; cpy->maxY = maxY; } return cpy; } template int GA2DArrayGenome::resize(int w, int h){ if(w == STA_CAST(int,nx) && h == STA_CAST(int,ny)) return sz; if(w == GAGenome::ANY_SIZE) w = GARandomInt(minX, maxX); else if(w < 0) w = nx; // do nothing else if(minX == maxX) minX=maxX = w; else{ if(w < STA_CAST(int,minX)) w=minX; if(w > STA_CAST(int,maxX)) w=maxX; } if(h == GAGenome::ANY_SIZE) h = GARandomInt(minY, maxY); else if(h < 0) h = ny; // do nothing else if(minY == maxY) minY=maxY = h; else{ if(h < STA_CAST(int,minY)) h=minY; if(h > STA_CAST(int,maxY)) h=maxY; } if(w < STA_CAST(int,nx)){ int y=GAMin(STA_CAST(int,ny),h); for(int j=0; j::size(w*h); if(w > STA_CAST(int,nx)){ // adjust the existing chunks of bits int y=GAMin(STA_CAST(int,ny),h); for(int j=y-1; j>=0; j--) GAArray::move(j*w,j*nx,nx); } nx = w; ny = h; _evaluated = gaFalse; return sz; } #ifndef NO_STREAMS template int GA2DArrayGenome::read(istream &) { GAErr(GA_LOC, className(), "read", gaErrOpUndef); return 1; } template int GA2DArrayGenome::write(ostream & os) const { for(unsigned int j=0; j int GA2DArrayGenome::resizeBehaviour(GAGenome::Dimension which) const { int val = 0; if(which == WIDTH) { if(maxX == minX) val = FIXED_SIZE; else val = maxX; } else if(which == HEIGHT) { if(maxY == minY) val = FIXED_SIZE; else val = maxY; } return val; } template int GA2DArrayGenome:: resizeBehaviour(GAGenome::Dimension which, unsigned int lower, unsigned int upper) { if(upper < lower){ GAErr(GA_LOC, className(), "resizeBehaviour", gaErrBadResizeBehaviour); return resizeBehaviour(which); } switch(which){ case WIDTH: minX = lower; maxX = upper; if(nx > upper) GA2DArrayGenome::resize(upper,ny); if(nx < lower) GA2DArrayGenome::resize(lower,ny); break; case HEIGHT: minY = lower; maxY = upper; if(ny > upper) GA2DArrayGenome::resize(nx,upper); if(ny < lower) GA2DArrayGenome::resize(nx,lower); break; default: break; } return resizeBehaviour(which); } template void GA2DArrayGenome::copy(const GA2DArrayGenome & orig, unsigned int r, unsigned int s, unsigned int x, unsigned int y, unsigned int w, unsigned int h) { if(w == 0 || x >= orig.nx || r >= nx || h == 0 || y >= orig.ny || s >= ny) return; if(x + w > orig.nx) w = orig.nx - x; if(y + h > orig.ny) h = orig.ny - y; if(r + w > nx) w = nx - r; if(s + h > ny) h = ny - s; for(unsigned int j=0; j::copy(orig, (s+j)*nx+r, (y+j)*orig.nx+x, w); _evaluated = gaFalse; } template int GA2DArrayGenome::equal(const GAGenome & c) const { if(this == &c) return 1; GA2DArrayGenome & b = (GA2DArrayGenome &)c; if(nx != b.nx || ny != b.ny) return 0; int val=0; for(unsigned int j=0; j::equal(b,j*nx,j*nx,nx) ? 0 : 1; return(val ? 0 : 1); } /* ---------------------------------------------------------------------------- 2DArrayAlleleGenome ---------------------------------------------------------------------------- */ template const char * GA2DArrayAlleleGenome::className() const {return "GA2DArrayAlleleGenome";} template int GA2DArrayAlleleGenome::classID() const {return GAID::ArrayAlleleGenome2D;} template GA2DArrayAlleleGenome:: GA2DArrayAlleleGenome(unsigned int width, unsigned int height, const GAAlleleSet & s, GAGenome::Evaluator f, void * u) : GA2DArrayGenome(width,height,f,u){ naset = 1; aset = new GAAlleleSet[1]; aset[0] = s; initializer(DEFAULT_2DARRAY_ALLELE_INITIALIZER); mutator(DEFAULT_2DARRAY_ALLELE_MUTATOR); comparator(DEFAULT_2DARRAY_ALLELE_COMPARATOR); crossover(DEFAULT_2DARRAY_ALLELE_CROSSOVER); } template GA2DArrayAlleleGenome:: GA2DArrayAlleleGenome(unsigned int width, unsigned int height, const GAAlleleSetArray & sa, GAGenome::Evaluator f, void * u) : GA2DArrayGenome(width,height, f, u) { naset = sa.size(); aset = new GAAlleleSet[naset]; for(int i=0; i GA2DArrayAlleleGenome:: GA2DArrayAlleleGenome(const GA2DArrayAlleleGenome & orig) : GA2DArrayGenome(orig.nx, orig.ny) { naset = 0; aset = (GAAlleleSet*)0; GA2DArrayAlleleGenome::copy(orig); } template GA2DArrayAlleleGenome::~GA2DArrayAlleleGenome(){ delete [] aset; } template GAGenome * GA2DArrayAlleleGenome::clone(GAGenome::CloneMethod) const { return new GA2DArrayAlleleGenome(*this); } template void GA2DArrayAlleleGenome::copy(const GAGenome& orig){ if(&orig == this) return; const GA2DArrayAlleleGenome* c = DYN_CAST(const GA2DArrayAlleleGenome*, &orig); if(c) { GA2DArrayGenome::copy(*c); if(naset != c->naset){ delete [] aset; naset = c->naset; aset = new GAAlleleSet[c->naset]; } for(int i=0; iaset[i]); } } template int GA2DArrayAlleleGenome::resize(int x, int y){ unsigned int oldx = nx; unsigned int oldy = ny; GA2DArrayGenome::resize(x,y); if(nx > oldx){ // adjust the existing chunks of bits int y=GAMin(oldy,ny); for(int j=y-1; j>=0; j--){ for(unsigned int i=oldx; i oldy){ // change in height is always new bits for(unsigned int i=nx*oldy; i int GA2DArrayAlleleGenome::read(istream& is){ return GA2DArrayGenome::read(is); } template int GA2DArrayAlleleGenome::write(ostream& os) const { return GA2DArrayGenome::write(os); } #endif template int GA2DArrayAlleleGenome::equal(const GAGenome & c) const { return GA2DArrayGenome::equal(c); } /* ---------------------------------------------------------------------------- Operator definitions ---------------------------------------------------------------------------- */ // this does not handle genomes with multiple allele sets! template void GA2DArrayAlleleGenome::UniformInitializer(GAGenome & c) { GA2DArrayAlleleGenome &child= DYN_CAST(GA2DArrayAlleleGenome &, c); child.resize(GAGenome::ANY_SIZE,GAGenome::ANY_SIZE); for(int i=child.width()-1; i>=0; i--) for(int j=child.height()-1; j>=0; j--) child.gene(i, j, child.alleleset().allele()); } template int GA2DArrayAlleleGenome::FlipMutator(GAGenome & c, float pmut) { GA2DArrayAlleleGenome &child= DYN_CAST(GA2DArrayAlleleGenome &, c); register int n, m, i, j; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float,child.size()); if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=child.width()-1; i>=0; i--){ for(j=child.height()-1; j>=0; j--){ if(GAFlipCoin(pmut)){ child.gene(i, j, child.alleleset().allele()); nMut++; } } } } else{ // only flip the number of bits we need to flip for(n=0; n int GA2DArrayGenome::SwapMutator(GAGenome & c, float pmut) { GA2DArrayGenome &child=DYN_CAST(GA2DArrayGenome&, c); register int n, i; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float,child.size()); int size = child.size()-1; if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=size; i>=0; i--){ if(GAFlipCoin(pmut)){ child.GAArray::swap(i, GARandomInt(0, size)); nMut++; } } } else{ // only flip the number of bits we need to flip for(n=0; n::swap(GARandomInt(0,size),GARandomInt(0,size)); } return(STA_CAST(int,nMut)); } template float GA2DArrayGenome:: ElementComparator(const GAGenome& a, const GAGenome& b) { const GA2DArrayGenome& sis= DYN_CAST(const GA2DArrayGenome&, a); const GA2DArrayGenome& bro= DYN_CAST(const GA2DArrayGenome&, b); if(sis.size() != bro.size()) return -1; if(sis.size() == 0) return 0; float count = 0.0; for(int i=sis.width()-1; i>=0; i--) for(int j=sis.height()-1; j>=0; j--) count += ((sis.gene(i,j) == bro.gene(i,j)) ? 0 : 1); return count/sis.size(); } template int GA2DArrayGenome:: UniformCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA2DArrayGenome &mom=DYN_CAST(const GA2DArrayGenome &, p1); const GA2DArrayGenome &dad=DYN_CAST(const GA2DArrayGenome &, p2); int nc=0; int i,j; if(c1 && c2){ GA2DArrayGenome &sis=DYN_CAST(GA2DArrayGenome &, *c1); GA2DArrayGenome &bro=DYN_CAST(GA2DArrayGenome &, *c2); if(sis.width() == bro.width() && sis.height() == bro.height() && mom.width() == dad.width() && mom.height() == dad.height() && sis.width() == mom.width() && sis.height() == mom.height()){ for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ if(GARandomBit()){ sis.gene(i,j, mom.gene(i,j)); bro.gene(i,j, dad.gene(i,j)); } else{ sis.gene(i,j, dad.gene(i,j)); bro.gene(i,j, mom.gene(i,j)); } } } } else{ GAMask mask; int startx, starty; int maxx = (sis.width() > bro.width()) ? sis.width() : bro.width(); int minx = (mom.width() < dad.width()) ? mom.width() : dad.width(); int maxy = (sis.height() > bro.height()) ? sis.height() : bro.height(); int miny = (mom.height() < dad.height()) ? mom.height() : dad.height(); mask.size(maxx*maxy); for(i=0; i=0; i--) for(j=starty-1; j>=0; j--) sis.gene(i,j, (mask[i*starty+j] ? mom.gene(i,j) : dad.gene(i,j))); startx = (bro.width() < minx) ? bro.width() : minx; starty = (bro.height() < miny) ? bro.height() : miny; for(i=startx-1; i>=0; i--) for(j=starty-1; j>=0; j--) bro.gene(i,j, (mask[i*starty+j] ? dad.gene(i,j) : mom.gene(i,j))); } nc = 2; } else if(c1){ GA2DArrayGenome &sis=DYN_CAST(GA2DArrayGenome &, *c1); if(mom.width() == dad.width() && mom.height() == dad.height() && sis.width() == mom.width() && sis.height() == mom.height()){ for(i=sis.width()-1; i>=0; i--) for(j=sis.height()-1; j>=0; j--) sis.gene(i,j, (GARandomBit() ? mom.gene(i,j) : dad.gene(i,j))); } else{ int minx = (mom.width() < dad.width()) ? mom.width() : dad.width(); int miny = (mom.height() < dad.height()) ? mom.height() : dad.height(); minx = (sis.width() < minx) ? sis.width() : minx; miny = (sis.height() < miny) ? sis.height() : miny; for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) sis.gene(i,j, (GARandomBit() ? mom.gene(i,j) : dad.gene(i,j))); } nc = 1; } return nc; } // This crossover does clipping (no padding) for resizables. Notice that this // means that any resizable children of two parents will have identical // dimensions no matter what. template int GA2DArrayGenome:: OnePointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA2DArrayGenome &mom=DYN_CAST(const GA2DArrayGenome &, p1); const GA2DArrayGenome &dad=DYN_CAST(const GA2DArrayGenome &, p2); int nc=0; unsigned int momsitex, momlenx, momsitey, momleny; unsigned int dadsitex, dadlenx, dadsitey, dadleny; unsigned int sitex, lenx, sitey, leny; if(c1 && c2){ GA2DArrayGenome &sis=DYN_CAST(GA2DArrayGenome &, *c1); GA2DArrayGenome &bro=DYN_CAST(GA2DArrayGenome &, *c2); if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE && bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ if(mom.width() != dad.width() || sis.width() != bro.width() || sis.width() != mom.width()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitex = momsitex = dadsitex = GARandomInt(0, mom.width()); lenx = momlenx = dadlenx = mom.width() - momsitex; } else if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE || bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsitex = GARandomInt(0, mom.width()); dadsitex = GARandomInt(0, dad.width()); momlenx = mom.width() - momsitex; dadlenx = dad.width() - dadsitex; sitex = GAMin(momsitex, dadsitex); lenx = GAMin(momlenx, dadlenx); } if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE && bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ if(mom.height() != dad.height() || sis.height() != bro.height() || sis.height() != mom.height()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitey = momsitey = dadsitey = GARandomInt(0, mom.height()); leny = momleny = dadleny = mom.height() - momsitey; } else if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE || bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsitey = GARandomInt(0, mom.height()); dadsitey = GARandomInt(0, dad.height()); momleny = mom.height() - momsitey; dadleny = dad.height() - dadsitey; sitey = GAMin(momsitey, dadsitey); leny = GAMin(momleny, dadleny); } sis.resize(sitex+lenx, sitey+leny); bro.resize(sitex+lenx, sitey+leny); sis.copy(mom, 0, 0, momsitex-sitex, momsitey-sitey, sitex, sitey); sis.copy(dad, sitex, 0, dadsitex, dadsitey-sitey, lenx, sitey); sis.copy(dad, 0, sitey, dadsitex-sitex, dadsitey, sitex, leny); sis.copy(mom, sitex, sitey, momsitex, momsitey, lenx, leny); bro.copy(dad, 0, 0, dadsitex-sitex, dadsitey-sitey, sitex, sitey); bro.copy(mom, sitex, 0, momsitex, momsitey-sitey, lenx, sitey); bro.copy(mom, 0, sitey, momsitex-sitex, momsitey, sitex, leny); bro.copy(dad, sitex, sitey, dadsitex, dadsitey, lenx, leny); nc = 2; } else if(c1){ GA2DArrayGenome &sis=DYN_CAST(GA2DArrayGenome &, *c1); if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ if(mom.width() != dad.width() || sis.width() != mom.width()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitex = momsitex = dadsitex = GARandomInt(0, mom.width()); lenx = momlenx = dadlenx = mom.width() - momsitex; } else{ momsitex = GARandomInt(0, mom.width()); dadsitex = GARandomInt(0, dad.width()); momlenx = mom.width() - momsitex; dadlenx = dad.width() - dadsitex; sitex = GAMin(momsitex, dadsitex); lenx = GAMin(momlenx, dadlenx); } if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ if(mom.height() != dad.height() || sis.height() != mom.height()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitey = momsitey = dadsitey = GARandomInt(0, mom.height()); leny = momleny = dadleny = mom.height() - momsitey; } else{ momsitey = GARandomInt(0, mom.height()); dadsitey = GARandomInt(0, dad.height()); momleny = mom.height() - momsitey; dadleny = dad.height() - dadsitey; sitey = GAMin(momsitey, dadsitey); leny = GAMin(momleny, dadleny); } sis.resize(sitex+lenx, sitey+leny); if(GARandomBit()){ sis.copy(mom, 0, 0, momsitex-sitex, momsitey-sitey, sitex, sitey); sis.copy(dad, sitex, 0, dadsitex, dadsitey-sitey, lenx, sitey); sis.copy(dad, 0, sitey, dadsitex-sitex, dadsitey, sitex, leny); sis.copy(mom, sitex, sitey, momsitex, momsitey, lenx, leny); } else{ sis.copy(dad, 0, 0, dadsitex-sitex, dadsitey-sitey, sitex, sitey); sis.copy(mom, sitex, 0, momsitex, momsitey-sitey, lenx, sitey); sis.copy(mom, 0, sitey, momsitex-sitex, momsitey, sitex, leny); sis.copy(dad, sitex, sitey, dadsitex, dadsitey, lenx, leny); } nc = 1; } return nc; } template int GA2DArrayGenome:: EvenOddCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA2DArrayGenome &mom=DYN_CAST(const GA2DArrayGenome &, p1); const GA2DArrayGenome &dad=DYN_CAST(const GA2DArrayGenome &, p2); int nc=0; int i,j; if(c1 && c2){ GA2DArrayGenome &sis=DYN_CAST(GA2DArrayGenome &, *c1); GA2DArrayGenome &bro=DYN_CAST(GA2DArrayGenome &, *c2); if(sis.width() == bro.width() && sis.height() == bro.height() && mom.width() == dad.width() && mom.height() == dad.height() && sis.width() == mom.width() && sis.height() == mom.height()){ int count=0; for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ sis.gene(i,j, ((count%2 == 0) ? mom.gene(i,j) : dad.gene(i,j))); bro.gene(i,j, ((count%2 == 0) ? dad.gene(i,j) : mom.gene(i,j))); count++; } } } else{ int startx, starty; int minx = (mom.width() < dad.width()) ? mom.width() : dad.width(); int miny = (mom.height() < dad.height()) ? mom.height() : dad.height(); startx = (sis.width() < minx) ? sis.width() : minx; starty = (sis.height() < miny) ? sis.height() : miny; for(i=startx-1; i>=0; i--) for(j=starty-1; j>=0; j--) sis.gene(i,j, (((i*starty+j)%2 == 0) ? mom.gene(i,j):dad.gene(i,j))); startx = (bro.width() < minx) ? bro.width() : minx; starty = (bro.height() < miny) ? bro.height() : miny; for(i=startx-1; i>=0; i--) for(j=starty-1; j>=0; j--) bro.gene(i,j, (((i*starty+j)%2 == 0) ? dad.gene(i,j):mom.gene(i,j))); } nc = 2; } else if(c1){ GA2DArrayGenome &sis=DYN_CAST(GA2DArrayGenome &, *c1); if(mom.width() == dad.width() && mom.height() == dad.height() && sis.width() == mom.width() && sis.height() == mom.height()){ int count=0; for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ sis.gene(i,j, ((count%2 == 0) ? mom.gene(i,j) : dad.gene(i,j))); count++; } } } else{ int minx = (mom.width() < dad.width()) ? mom.width() : dad.width(); int miny = (mom.height() < dad.height()) ? mom.height() : dad.height(); minx = (sis.width() < minx) ? sis.width() : minx; miny = (sis.height() < miny) ? sis.height() : miny; for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) sis.gene(i,j, (((i*miny+j)%2 == 0) ? mom.gene(i,j) : dad.gene(i,j))); } nc = 1; } return nc; } #endif gamera-3.3.3/src/ga/GA2DArrayGenome.h0000644000076500000000000001204311755375044016113 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- array2.h mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This header defines the interface for the 2D array genome. See comments in 1D array file. ---------------------------------------------------------------------------- */ #ifndef _ga_array2_h_ #define _ga_array2_h_ #include #include #include /* ---------------------------------------------------------------------------- 2DArrayGenome ---------------------------------------------------------------------------- */ template class GA2DArrayGenome : public GAArray, public GAGenome { protected: using GAArray::a; using GAArray::sz; public: using GAArray::move; GADeclareIdentity(); static int SwapMutator(GAGenome&, float); static float ElementComparator(const GAGenome&, const GAGenome&); static int UniformCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int EvenOddCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int OnePointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); public: GA2DArrayGenome(unsigned int x, unsigned int y, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA2DArrayGenome(const GA2DArrayGenome & orig); GA2DArrayGenome& operator=(const GAGenome& orig) {copy(orig); return *this;} GA2DArrayGenome& operator=(const T array []){ for(unsigned int i=0; i::swap(b*nx+a, d*nx+c); _evaluated = gaFalse; } protected: GAAlleleSet * as; // the allele set unsigned int nx, ny, minX, minY, maxX, maxY; }; /* ---------------------------------------------------------------------------- 2DArrayAlleleGenome ---------------------------------------------------------------------------- */ template class GA2DArrayAlleleGenome : public GA2DArrayGenome { protected: using GA2DArrayGenome::nx; using GA2DArrayGenome::ny; using GA2DArrayGenome::a; using GA2DArrayGenome::sz; public: using GA2DArrayGenome::ElementComparator; using GA2DArrayGenome::OnePointCrossover; using GA2DArrayGenome::initializer; using GA2DArrayGenome::mutator; using GA2DArrayGenome::comparator; using GA2DArrayGenome::crossover; GADeclareIdentity(); static void UniformInitializer(GAGenome&); static int FlipMutator(GAGenome&, float); public: GA2DArrayAlleleGenome(unsigned int x, unsigned int y, const GAAlleleSet & a, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA2DArrayAlleleGenome(unsigned int x, unsigned int y, const GAAlleleSetArray & a, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA2DArrayAlleleGenome(const GA2DArrayAlleleGenome & orig); GA2DArrayAlleleGenome& operator=(const GAGenome& orig) {copy(orig); return *this;} GA2DArrayAlleleGenome& operator=(const T array []) { GA2DArrayGenome::operator=(array); return *this; } virtual ~GA2DArrayAlleleGenome(); virtual GAGenome * clone(GAGenome::CloneMethod flag=GAGenome::CONTENTS) const; virtual void copy(const GAGenome &); #ifndef NO_STREAMS virtual int read(istream& is); virtual int write (ostream& os) const ; #endif int equal(const GAGenome & c) const ; virtual int resize(int x, int y); const GAAlleleSet& alleleset(unsigned int i=0) const {return aset[i%naset];} protected: int naset; GAAlleleSet * aset; }; #ifdef USE_BORLAND_INST #include #endif #endif gamera-3.3.3/src/ga/GA2DBinStrGenome.cpp0000644000076500000000000005157010714675676016611 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr2.C mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the 2D binary string genome. See the 1D genome for comments. ---------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include /* ---------------------------------------------------------------------------- Genome class definition ---------------------------------------------------------------------------- */ GA2DBinaryStringGenome:: GA2DBinaryStringGenome(unsigned int width, unsigned int height, GAGenome::Evaluator f, void * u) : GABinaryString(width*height), GAGenome(DEFAULT_2DBINSTR_INITIALIZER, DEFAULT_2DBINSTR_MUTATOR, DEFAULT_2DBINSTR_COMPARATOR) { evaluator(f); userData(u); crossover(DEFAULT_2DBINSTR_CROSSOVER); nx=minX=maxX=0; ny=minY=maxY=0; resize(width, height); } GA2DBinaryStringGenome:: GA2DBinaryStringGenome(const GA2DBinaryStringGenome & orig) : GABinaryString(orig.GABinaryString::size()), GAGenome() { nx=minX=maxX=0; ny=minY=maxY=0; GA2DBinaryStringGenome::copy(orig); } GA2DBinaryStringGenome::~GA2DBinaryStringGenome() { } GAGenome * GA2DBinaryStringGenome::clone(GAGenome::CloneMethod flag) const { GA2DBinaryStringGenome *cpy = new GA2DBinaryStringGenome(nx,ny); if(flag == CONTENTS){ cpy->copy(*this); } else{ cpy->GAGenome::copy(*this); cpy->minX = minX; cpy->minY = minY; cpy->maxX = maxX; cpy->maxY = maxY; } return cpy; } void GA2DBinaryStringGenome::copy(const GAGenome & orig) { if(&orig == this) return; const GA2DBinaryStringGenome* c = DYN_CAST(const GA2DBinaryStringGenome*, &orig); if(c) { GAGenome::copy(*c); GABinaryString::copy(*c); nx = c->nx; ny = c->ny; minX = c->minX; minY = c->minY; maxX = c->maxX; maxY = c->maxY; } } int GA2DBinaryStringGenome::resize(int w, int h) { if((unsigned int)w == nx && (unsigned int)h == ny) return sz; if(w == GAGenome::ANY_SIZE) w = GARandomInt(minX, maxX); else if(w < 0) w = nx; // do nothing else if(minX == maxX) minX=maxX = w; else{ if(w < STA_CAST(int, minX)) w=minX; if(w > STA_CAST(int, maxX)) w=maxX; } if(h == GAGenome::ANY_SIZE) h = GARandomInt(minY, maxY); else if(h < 0) h = ny; // do nothing else if(minY == maxY) minY=maxY = h; else{ if(h < STA_CAST(int, minY)) h=minY; if(h > STA_CAST(int, maxY)) h=maxY; } // Move the bits into the right position. If we're smaller, then shift to // the smaller size before we do the resize (the resize method maintains bit // integrety). If we're larger, do the move after the resize. If we're the // same size the we don't do anything. When we're adding more bits, the new // bits get set randomly to 0 or 1. if(w < STA_CAST(int,nx)){ int y=GAMin(STA_CAST(int,ny),h); for(int j=0; j STA_CAST(int,nx)){ // adjust the existing chunks of bits int y=GAMin(STA_CAST(int,ny),h); for(int j=y-1; j>=0; j--){ GABinaryString::move(j*w,j*nx,nx); for(int i=nx; i STA_CAST(int,ny)){ // change in height is always new bits for(int i=w*ny; i> c; if(isdigit(c)){ gene(i, j, ((c == '0') ? 0 : 1)); if(++i >= nx){ // ready for next row i=0; j++; } } } _evaluated = gaFalse; if(is.eof() && ((j < ny) || // didn't get some lines (i < nx && i != 0))){ // stopped early on a row GAErr(GA_LOC, className(), "read", gaErrUnexpectedEOF); is.clear(ios::badbit | is.rdstate()); return 1; } return 0; } // Dump the digits to the stream with a newline between each row. No newline // at the end of the whole thing. int GA2DBinaryStringGenome::write(ostream & os) const { for(unsigned int j=0; j upper) resize(upper,ny); if(nx < lower) resize(lower,ny); break; case HEIGHT: minY = lower; maxY = upper; if(ny > upper) resize(nx,upper); if(ny < lower) resize(nx,lower); break; default: break; } return resizeBehaviour(which); } void GA2DBinaryStringGenome::copy(const GA2DBinaryStringGenome & orig, unsigned int r, unsigned int s, unsigned int x, unsigned int y, unsigned int w, unsigned int h) { if(w == 0 || x >= orig.nx || r >= nx || h == 0 || y >= orig.ny || s >= ny) return; if(x + w > orig.nx) w = orig.nx - x; if(y + h > orig.ny) h = orig.ny - y; if(r + w > nx) w = nx - r; if(s + h > ny) h = ny - s; for(unsigned int j=0; j nx) w = nx - x; if(y + h > ny) h = ny - y; for(unsigned int j=0; j nx) w = nx - x; if(y + h > ny) h = ny - y; for(unsigned int j=0; j nx) w = nx - x; if(y + h > ny) h = ny - y; for(unsigned int j=0; j nx) w = nx - srcx; if(x + w > nx) w = nx - x; if(srcy + h > ny) h = ny - srcy; if(y + h > ny) h = ny - y; if(srcy=0; j--) GABinaryString::move((y+j)*nx+x, (srcy+j)*nx+srcx, w); } else{ for(unsigned int j=0; j=0; i--) for(int j=child.height()-1; j>=0; j--) child.gene(i, j, GARandomBit()); } void GA2DBinaryStringGenome::UnsetInitializer(GAGenome & c) { GA2DBinaryStringGenome &child=DYN_CAST(GA2DBinaryStringGenome &, c); child.resize(GAGenome::ANY_SIZE, GAGenome::ANY_SIZE); child.unset(0, 0, child.width(), child.height()); } void GA2DBinaryStringGenome::SetInitializer(GAGenome & c) { GA2DBinaryStringGenome &child=DYN_CAST(GA2DBinaryStringGenome &, c); child.resize(GAGenome::ANY_SIZE, GAGenome::ANY_SIZE); child.set(0, 0, child.width(), child.height()); } int GA2DBinaryStringGenome::FlipMutator(GAGenome & c, float pmut) { GA2DBinaryStringGenome &child=DYN_CAST(GA2DBinaryStringGenome &, c); register int n, m, i, j; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float, child.size()); if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=child.width()-1; i>=0; i--){ for(j=child.height()-1; j>=0; j--){ if(GAFlipCoin(pmut)){ child.gene(i, j, ((child.gene(i,j) == 0) ? 1 : 0)); nMut++; } } } } else{ // only flip the number of bits we need to flip for(n=0; n=0; i--) for(int j=sis.height()-1; j>=0; j--) count += ((sis.gene(i,j) == bro.gene(i,j)) ? 0 : 1); return count/sis.size(); } int GA2DBinaryStringGenome:: UniformCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA2DBinaryStringGenome &mom= DYN_CAST(const GA2DBinaryStringGenome &, p1); const GA2DBinaryStringGenome &dad= DYN_CAST(const GA2DBinaryStringGenome &, p2); int nc=0; int i,j; if(c1 && c2){ GA2DBinaryStringGenome &sis=DYN_CAST(GA2DBinaryStringGenome &, *c1); GA2DBinaryStringGenome &bro=DYN_CAST(GA2DBinaryStringGenome &, *c2); if(sis.width() == bro.width() && sis.height() == bro.height() && mom.width() == dad.width() && mom.height() == dad.height() && sis.width() == mom.width() && sis.height() == mom.height()){ for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ if(GARandomBit()){ sis.gene(i,j, mom.gene(i,j)); bro.gene(i,j, dad.gene(i,j)); } else{ sis.gene(i,j, dad.gene(i,j)); bro.gene(i,j, mom.gene(i,j)); } } } } else{ GAMask mask; int maxx = GAMax(sis.width(), bro.width()); int minx = GAMin(mom.width(), dad.width()); int maxy = GAMax(sis.height(), bro.height()); int miny = GAMin(mom.height(), dad.height()); mask.size(maxx*maxy); for(i=0; i=0; i--) for(j=sis.height()-1; j>=0; j--) sis.gene(i,j, (GARandomBit() ? mom.gene(i,j) : dad.gene(i,j))); } else{ int minx = GAMin(mom.width(), dad.width()); int miny = GAMin(mom.height(), dad.height()); minx = GAMin(sis.width(), minx); miny = GAMin(sis.height(), miny); for(i=0; i=0; i--){ for(j=sis.height()-1; j>=0; j--){ if(count%2 == 0){ sis.gene(i,j, mom.gene(i,j)); bro.gene(i,j, dad.gene(i,j)); } else{ sis.gene(i,j, dad.gene(i,j)); bro.gene(i,j, mom.gene(i,j)); } count++; } } } else{ int count; int minx = GAMin(mom.width(), dad.width()); int miny = GAMin(mom.height(), dad.height()); count = 0; minx = GAMin(sis.width(), minx); miny = GAMin(sis.height(), miny); for(i=0; i=0; i--){ for(j=sis.height()-1; j>=0; j--){ sis.gene(i,j, ((count%2 == 0) ? mom.gene(i,j) : dad.gene(i,j))); count++; } } } else{ int minx = GAMin(mom.width(), dad.width()); int miny = GAMin(mom.height(), dad.height()); minx = GAMin(sis.width(), minx); miny = GAMin(sis.height(), miny); for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) sis.gene(i,j, (((i*miny+j)%2 == 0) ? mom.gene(i,j) : dad.gene(i,j))); } nc = 1; } return nc; } gamera-3.3.3/src/ga/GA2DBinStrGenome.h0000644000076500000000000000765310714675676016261 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr2.h mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This header defines the interface for the 2D binary string genome, including crossover objects and all the default and built-in operators. ---------------------------------------------------------------------------- */ #ifndef _ga_binstr2_h_ #define _ga_binstr2_h_ #include #include /* ---------------------------------------------------------------------------- 2DBinaryStringGenome ------------------------------------------------------------------------------- ---------------------------------------------------------------------------- */ class GA2DBinaryStringGenome : public GABinaryString, public GAGenome { public: GADefineIdentity("GA2DBinaryStringGenome", GAID::BinaryStringGenome2D); static void UniformInitializer(GAGenome &); static void UnsetInitializer(GAGenome &); static void SetInitializer(GAGenome &); static int FlipMutator(GAGenome &, float); static float BitComparator(const GAGenome&, const GAGenome&); static int UniformCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int EvenOddCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int OnePointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); public: GA2DBinaryStringGenome(unsigned int x, unsigned int y, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA2DBinaryStringGenome(const GA2DBinaryStringGenome & orig); GA2DBinaryStringGenome& operator=(const GAGenome& arg) {copy(arg); return *this;} GA2DBinaryStringGenome& operator=(const short array []){ for(unsigned int i=0; i #include #include #include #include #include /* ---------------------------------------------------------------------------- 3DArrayGenome ---------------------------------------------------------------------------- */ template const char * GA3DArrayGenome::className() const {return "GA3DArrayGenome";} template int GA3DArrayGenome::classID() const {return GAID::ArrayGenome3D;} template GA3DArrayGenome:: GA3DArrayGenome(unsigned int w, unsigned int h, unsigned int d, GAGenome::Evaluator f, void * u) : GAArray(w*h*d), GAGenome(DEFAULT_3DARRAY_INITIALIZER, DEFAULT_3DARRAY_MUTATOR, DEFAULT_3DARRAY_COMPARATOR) { evaluator(f); userData(u); crossover(DEFAULT_3DARRAY_CROSSOVER); nx=minX=maxX=w; ny=minY=maxY=h; nz=minZ=maxZ=d; } template GA3DArrayGenome:: GA3DArrayGenome(const GA3DArrayGenome & orig) : GAArray(orig.sz), GAGenome(){ GA3DArrayGenome::copy(orig); } template GA3DArrayGenome::~GA3DArrayGenome(){ } template void GA3DArrayGenome::copy(const GAGenome & orig){ if(&orig == this) return; const GA3DArrayGenome* c = DYN_CAST(const GA3DArrayGenome*, &orig); if(c) { GAGenome::copy(*c); GAArray::copy(*c); nx = c->nx; ny = c->ny; nz = c->nz; minX = c->minX; minY = c->minY; minZ = c->minZ; maxX = c->maxX; maxY = c->maxY; maxZ = c->maxZ; } } template GAGenome * GA3DArrayGenome::clone(GAGenome::CloneMethod flag) const { GA3DArrayGenome *cpy = new GA3DArrayGenome(nx,ny,nz); if(flag == CONTENTS){ cpy->copy(*this); } else{ cpy->GAGenome::copy(*this); cpy->minX = minX; cpy->minY = minY; cpy->minZ = minZ; cpy->maxX = maxX; cpy->maxY = maxY; cpy->maxZ = maxZ; } return cpy; } template int GA3DArrayGenome::resize(int w, int h, int d) { if(w == STA_CAST(int,nx) && h == STA_CAST(int,ny) && d == STA_CAST(int,nz)) return sz; if(w == GAGenome::ANY_SIZE) w = GARandomInt(minX, maxX); else if(w < 0) w = nx; // do nothing else if(minX == maxX) minX=maxX = w; else{ if(w < STA_CAST(int,minX)) w=minX; if(w > STA_CAST(int,maxX)) w=maxX; } if(h == GAGenome::ANY_SIZE) h = GARandomInt(minY, maxY); else if(h < 0) h = ny; // do nothing else if(minY == maxY) minY=maxY = h; else{ if(h < STA_CAST(int,minY)) h=minY; if(h > STA_CAST(int,maxY)) h=maxY; } if(d == GAGenome::ANY_SIZE) d = GARandomInt(minZ, maxZ); else if(d < 0) d = nz; // do nothing else if(minZ == maxZ) minZ=maxZ = d; else{ if(d < STA_CAST(int,minZ)) d=minZ; if(d > STA_CAST(int,maxZ)) d=maxZ; } if(w < STA_CAST(int,nx) && h < STA_CAST(int,ny)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=0; k::move(k*h*w+j*w,k*ny*nx+j*nx,w); } else if(w < STA_CAST(int,nx)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=0; k::move(k*ny*w+j*w,k*ny*nx+j*nx,w); } else if(h < STA_CAST(int,ny)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=0; k::move(k*h*nx+j*nx,k*ny*nx+j*nx,nx); } GAArray::size(w*h*d); if(w > STA_CAST(int,nx) && h > STA_CAST(int,ny)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=z-1; k>=0; k--) for(int j=ny-1; j>=0; j--) GAArray::move(k*h*w+j*w,k*ny*nx+j*nx,nx); } else if(w > STA_CAST(int,nx)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=z-1; k>=0; k--) for(int j=h-1; j>=0; j--) GAArray::move(k*h*w+j*w,k*h*nx+j*nx,nx); } else if(h > STA_CAST(int,ny)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=z-1; k>=0; k--) for(int j=ny-1; j>=0; j--) GAArray::move(k*h*w+j*w,k*ny*w+j*w,w); } nx = w; ny = h; nz = d; _evaluated = gaFalse; return sz; } #ifndef NO_STREAMS template int GA3DArrayGenome::read(istream &) { GAErr(GA_LOC, className(), "read", gaErrOpUndef); return 1; } template int GA3DArrayGenome::write(ostream & os) const { for(unsigned int k=0; k int GA3DArrayGenome::resizeBehaviour(GAGenome::Dimension which) const { int val = 0; if(which == WIDTH) { if(maxX == minX) val = FIXED_SIZE; else val = maxX; } else if(which == HEIGHT) { if(maxY == minY) val = FIXED_SIZE; else val = maxY; } else if(which == DEPTH) { if(maxZ == minZ) val = FIXED_SIZE; else val = maxZ; } return val; } template int GA3DArrayGenome:: resizeBehaviour(GAGenome::Dimension which, unsigned int lower, unsigned int upper) { if(upper < lower){ GAErr(GA_LOC, className(), "resizeBehaviour", gaErrBadResizeBehaviour); return resizeBehaviour(which); } switch(which){ case WIDTH: minX = lower; maxX = upper; if(nx > upper) GA3DArrayGenome::resize(upper,ny,nz); if(nx < lower) GA3DArrayGenome::resize(lower,ny,nz); break; case HEIGHT: minY = lower; maxY = upper; if(ny > upper) GA3DArrayGenome::resize(nx,upper,nz); if(ny < lower) GA3DArrayGenome::resize(nx,lower,nz); break; case DEPTH: minZ = lower; maxZ = upper; if(nz > upper) GA3DArrayGenome::resize(nx,ny,upper); if(nz < lower) GA3DArrayGenome::resize(nx,ny,lower); break; default: break; } return resizeBehaviour(which); } template void GA3DArrayGenome:: copy(const GA3DArrayGenome & orig, unsigned int r, unsigned int s, unsigned int t, unsigned int x, unsigned int y, unsigned int z, unsigned int w, unsigned int h, unsigned int d) { if(w == 0 || x >= orig.nx || r >= nx || h == 0 || y >= orig.ny || s >= ny || d == 0 || z >= orig.nz || t >= nz) return; if(x + w > orig.nx) w = orig.nx - x; if(y + h > orig.ny) h = orig.ny - y; if(z + d > orig.nz) d = orig.nz - z; if(r + w > nx) w = nx - r; if(s + h > ny) h = ny - s; if(t + d > nz) d = nz - t; for(unsigned int k=0; k::copy(orig, (t+k)*ny*nx + (s+j)*nx + r, (z+k)*orig.ny*orig.nx + (y+j)*orig.nx + x, w); _evaluated = gaFalse; } template int GA3DArrayGenome::equal(const GAGenome & c) const { if(this == &c) return 1; GA3DArrayGenome & b = (GA3DArrayGenome &)c; if(nx != b.nx || ny != b.ny || nz != b.nz) return 0; int val=0; for(unsigned int k=0; k::equal(b,k*ny*nx,k*ny*nx,nx) ? 0 : 1; return(val ? 0 : 1); } /* ---------------------------------------------------------------------------- 3DArrayAlleleGenome ---------------------------------------------------------------------------- */ template const char * GA3DArrayAlleleGenome::className() const {return "GA3DArrayAlleleGenome";} template int GA3DArrayAlleleGenome::classID() const {return GAID::ArrayAlleleGenome3D;} template GA3DArrayAlleleGenome:: GA3DArrayAlleleGenome(unsigned int w, unsigned int h, unsigned int d, const GAAlleleSet & s, GAGenome::Evaluator f, void * u) : GA3DArrayGenome(w,h,d,f,u) { naset = 1; aset = new GAAlleleSet[1]; aset[0] = s; initializer(DEFAULT_3DARRAY_ALLELE_INITIALIZER); mutator(DEFAULT_3DARRAY_ALLELE_MUTATOR); comparator(DEFAULT_3DARRAY_ALLELE_COMPARATOR); crossover(DEFAULT_3DARRAY_ALLELE_CROSSOVER); } template GA3DArrayAlleleGenome:: GA3DArrayAlleleGenome(unsigned int w, unsigned int h, unsigned int d, const GAAlleleSetArray & sa, GAGenome::Evaluator f, void * u) : GA3DArrayGenome(w,h,d, f, u) { naset = sa.size(); aset = new GAAlleleSet[naset]; for(int i=0; i GA3DArrayAlleleGenome:: GA3DArrayAlleleGenome(const GA3DArrayAlleleGenome & orig) : GA3DArrayGenome(orig.nx, orig.ny, orig.nz) { naset = 0; aset = (GAAlleleSet*)0; GA3DArrayAlleleGenome::copy(orig); } template GA3DArrayAlleleGenome::~GA3DArrayAlleleGenome(){ delete [] aset; } template GAGenome * GA3DArrayAlleleGenome::clone(GAGenome::CloneMethod) const { return new GA3DArrayAlleleGenome(*this); } template void GA3DArrayAlleleGenome::copy(const GAGenome& orig){ if(&orig == this) return; const GA3DArrayAlleleGenome* c = DYN_CAST(const GA3DArrayAlleleGenome*, &orig); if(c) { GA3DArrayGenome::copy(*c); if(naset != c->naset){ delete [] aset; naset = c->naset; aset = new GAAlleleSet[c->naset]; } for(int i=0; iaset[i]); } } template int GA3DArrayAlleleGenome::resize(int w, int h, int d){ unsigned int oldx = nx; unsigned int oldy = ny; unsigned int oldz = nz; GA3DArrayGenome::resize(w,h,d); // set new elements to proper randomly selected values if(nx > oldx && ny > oldy){ int z=GAMin(oldz,nz); for(int k=z-1; k>=0; k--){ int j; for(j=oldy-1; j>=0; j--) for(unsigned int i=oldx; i oldx){ int z=GAMin(oldz,nz); for(int k=z-1; k>=0; k--) for(int j=ny-1; j>=0; j--) for(unsigned int i=oldx; i oldy){ int z=GAMin(oldz,nz); for(int k=z-1; k>=0; k--) for(unsigned int j=oldy; j oldz){ // change in depth is always new elements for(unsigned int i=nx*ny*oldz; i int GA3DArrayAlleleGenome::read(istream& is){ return GA3DArrayGenome::read(is); } template int GA3DArrayAlleleGenome::write(ostream& os) const { return GA3DArrayGenome::write(os); } #endif template int GA3DArrayAlleleGenome::equal(const GAGenome & c) const { return GA3DArrayGenome::equal(c); } /* ---------------------------------------------------------------------------- Operator definitions ---------------------------------------------------------------------------- */ // this does not handle genomes with multiple allele sets! template void GA3DArrayAlleleGenome::UniformInitializer(GAGenome & c) { GA3DArrayAlleleGenome &child= DYN_CAST(GA3DArrayAlleleGenome &, c); child.resize(GAGenome::ANY_SIZE,GAGenome::ANY_SIZE,GAGenome::ANY_SIZE); for(int i=child.width()-1; i>=0; i--) for(int j=child.height()-1; j>=0; j--) for(int k=child.depth()-1; k>=0; k--) child.gene(i, j, k, child.alleleset().allele()); } template int GA3DArrayAlleleGenome::FlipMutator(GAGenome & c, float pmut) { GA3DArrayAlleleGenome &child= DYN_CAST(GA3DArrayAlleleGenome &, c); register int n, m, d, i, j, k; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float,child.size()); if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=child.width()-1; i>=0; i--){ for(j=child.height()-1; j>=0; j--){ for(k=child.depth()-1; k>=0; k--){ if(GAFlipCoin(pmut)){ child.gene(i, j, k, child.alleleset().allele()); nMut++; } } } } } else{ // only flip the number of bits we need to flip for(n=0; n int GA3DArrayGenome::SwapMutator(GAGenome & c, float pmut) { GA3DArrayGenome &child=DYN_CAST(GA3DArrayGenome&, c); register int n, i; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float,child.size()); int size = child.size()-1; if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=size; i>=0; i--){ if(GAFlipCoin(pmut)){ child.GAArray::swap(i, GARandomInt(0, size)); nMut++; } } } else{ // only flip the number of bits we need to flip for(n=0; n::swap(GARandomInt(0, size), GARandomInt(0, size)); } return(STA_CAST(int,nMut)); } template float GA3DArrayGenome:: ElementComparator(const GAGenome& a, const GAGenome& b) { const GA3DArrayGenome& sis= DYN_CAST(const GA3DArrayGenome&, a); const GA3DArrayGenome& bro= DYN_CAST(const GA3DArrayGenome&, b); if(sis.size() != bro.size()) return -1; if(sis.size() == 0) return 0; float count = 0.0; for(int i=sis.width()-1; i>=0; i--) for(int j=sis.height()-1; j>=0; j--) for(int k=sis.depth()-1; k>=0; k--) count += ((sis.gene(i,j,k) == bro.gene(i,j,k)) ? 0 : 1); return count/sis.size(); } // Make sure our bitmask is big enough, generate a mask, then use it to // extract the information from each parent to stuff the two children. // We don't deallocate any space for the masks under the assumption that we'll // have to use them again in the future. // For now we'll implement this only for fixed length genomes. If you use // this crossover method on genomes of different sizes it might break! template int GA3DArrayGenome:: UniformCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA3DArrayGenome &mom=DYN_CAST(const GA3DArrayGenome &, p1); const GA3DArrayGenome &dad=DYN_CAST(const GA3DArrayGenome &, p2); int nc=0; int i,j,k; if(c1 && c2){ GA3DArrayGenome &sis=DYN_CAST(GA3DArrayGenome &, *c1); GA3DArrayGenome &bro=DYN_CAST(GA3DArrayGenome &, *c2); if(sis.width() == bro.width() && sis.height() == bro.height() && sis.depth() == bro.depth() && mom.width() == dad.width() && mom.height() == dad.height() && mom.depth() == dad.depth() && sis.width() == mom.width() && sis.height() == mom.height() && sis.depth() == mom.depth()){ for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ for(k=sis.depth()-1; k>=0; k--){ if(GARandomBit()){ sis.gene(i,j,k, mom.gene(i,j,k)); bro.gene(i,j,k, dad.gene(i,j,k)); } else{ sis.gene(i,j,k, dad.gene(i,j,k)); bro.gene(i,j,k, mom.gene(i,j,k)); } } } } } else{ GAMask mask; int startx, starty, startz; int maxx = (sis.width() > bro.width()) ? sis.width() : bro.width(); int minx = (mom.width() < dad.width()) ? mom.width() : dad.width(); int maxy = (sis.height() > bro.height()) ? sis.height() : bro.height(); int miny = (mom.height() < dad.height()) ? mom.height() : dad.height(); int maxz = (sis.depth() > bro.depth()) ? sis.depth() : bro.depth(); int minz = (mom.depth() < dad.depth()) ? mom.depth() : dad.depth(); mask.size(maxx*maxy*maxz); for(i=0; i=0; i--) for(j=starty-1; j>=0; j--) for(k=startz-1; k>=0; k--) sis.gene(i,j,k, (mask[i*starty*startz+j*startz+k] ? mom.gene(i,j,k) : dad.gene(i,j,k))); startx = (bro.width() < minx) ? bro.width() : minx; starty = (bro.height() < miny) ? bro.height() : miny; startz = (bro.depth() < minz) ? bro.depth() : minz; for(i=startx-1; i>=0; i--) for(j=starty-1; j>=0; j--) for(k=startz-1; k>=0; k--) bro.gene(i,j,k, (mask[i*starty*startz+j*startz+k] ? dad.gene(i,j,k) : mom.gene(i,j,k))); } nc = 2; } else if(c1){ GA3DArrayGenome &sis=DYN_CAST(GA3DArrayGenome &, *c1); if(mom.width() == dad.width() && mom.height() == dad.height() && mom.depth() == dad.depth() && sis.width() == mom.width() && sis.height() == mom.height() && sis.depth() == mom.depth()){ for(i=sis.width()-1; i>=0; i--) for(j=sis.height()-1; j>=0; j--) for(k=sis.depth()-1; k>=0; k--) sis.gene(i,j,k, (GARandomBit() ? mom.gene(i,j,k):dad.gene(i,j,k))); } else{ int minx = (mom.width() < dad.width()) ? mom.width() : dad.width(); int miny = (mom.height() < dad.height()) ? mom.height() : dad.height(); int minz = (mom.depth() < dad.depth()) ? mom.depth() : dad.depth(); minx = (sis.width() < minx) ? sis.width() : minx; miny = (sis.height() < miny) ? sis.height() : miny; minz = (sis.depth() < minz) ? sis.depth() : minz; for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) for(k=minz-1; k>=0; k--) sis.gene(i,j,k, (GARandomBit() ? mom.gene(i,j,k):dad.gene(i,j,k))); } nc = 1; } return nc; } // For even crossover we take the even bits from the mother (for the daughter) // and the odd bits from the father. Just the opposite for the son. // This is designed only for genomes that are the same length. If the child // is not the same length as the parent, or if the children are not the same // size, we don't do the crossover. // In the interest of speed we do not do any checks for size. Do not use // this crossover method when the parents and children may be different sizes. // It might break! template int GA3DArrayGenome:: EvenOddCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA3DArrayGenome &mom=DYN_CAST(const GA3DArrayGenome &, p1); const GA3DArrayGenome &dad=DYN_CAST(const GA3DArrayGenome &, p2); int nc=0; int i,j,k; if(c1 && c2){ GA3DArrayGenome &sis=DYN_CAST(GA3DArrayGenome &, *c1); GA3DArrayGenome &bro=DYN_CAST(GA3DArrayGenome &, *c2); if(sis.width() == bro.width() && sis.height() == bro.height() && sis.depth() == bro.depth() && mom.width() == dad.width() && mom.height() == dad.height() && mom.depth() == dad.depth() && sis.width() == mom.width() && sis.height() == mom.height() && sis.depth() == mom.depth()){ int count=0; for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ for(k=sis.depth()-1; k>=0; k--){ sis.gene(i,j,k,((count%2 == 0) ? mom.gene(i,j,k):dad.gene(i,j,k))); bro.gene(i,j,k,((count%2 == 0) ? dad.gene(i,j,k):mom.gene(i,j,k))); count++; } } } } else{ int startx, starty, startz; int maxx = (sis.width() > bro.width()) ? sis.width() : bro.width(); int minx = (mom.width() < dad.width()) ? mom.width() : dad.width(); int maxy = (sis.height() > bro.height()) ? sis.height() : bro.height(); int miny = (mom.height() < dad.height()) ? mom.height() : dad.height(); int maxz = (sis.depth() > bro.depth()) ? sis.depth() : bro.depth(); int minz = (mom.depth() < dad.depth()) ? mom.depth() : dad.depth(); startx = (sis.width() < minx) ? sis.width() : minx; starty = (sis.height() < miny) ? sis.height() : miny; startz = (sis.depth() < minz) ? sis.depth() : minz; for(i=startx-1; i>=0; i--) for(j=starty-1; j>=0; j--) for(k=startz-1; k>=0; k--) sis.gene(i,j,k, (((i*starty*startz+j*startz+k)%2 == 0) ? mom.gene(i,j,k) : dad.gene(i,j,k))); startx = (bro.width() < minx) ? bro.width() : minx; starty = (bro.height() < miny) ? bro.height() : miny; startz = (bro.depth() < minz) ? bro.depth() : minz; for(i=startx-1; i>=0; i--) for(j=starty-1; j>=0; j--) for(k=startz-1; k>=0; k--) bro.gene(i,j,k, (((i*starty*startz+j*startz+k)%2 == 0) ? dad.gene(i,j,k) : mom.gene(i,j,k))); } nc = 2; } else if(c1){ GA3DArrayGenome &sis=DYN_CAST(GA3DArrayGenome &, *c1); if(mom.width() == dad.width() && mom.height() == dad.height() && mom.depth() == dad.depth() && sis.width() == mom.width() && sis.height() == mom.height() && sis.depth() == mom.depth()){ int count=0; for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ for(k=sis.depth()-1; k>=0; k--){ sis.gene(i,j,k,((count%2 == 0) ? mom.gene(i,j,k):dad.gene(i,j,k))); count++; } } } } else{ int minx = (mom.width() < dad.width()) ? mom.width() : dad.width(); int miny = (mom.height() < dad.height()) ? mom.height() : dad.height(); int minz = (mom.depth() < dad.depth()) ? mom.depth() : dad.depth(); minx = (sis.width() < minx) ? sis.width() : minx; miny = (sis.height() < miny) ? sis.height() : miny; minz = (sis.depth() < minz) ? sis.depth() : minz; for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) for(k=minz-1; k>=0; k--) sis.gene(i,j, (((i*miny*minz+j*minz+k)%2 == 0) ? mom.gene(i,j,k) : dad.gene(i,j,k))); } nc = 1; } return nc; } // Pick a single point in the 3D block and grab alternating quadrants for each // child. If the children are resizable, this crossover does clipping. template int GA3DArrayGenome:: OnePointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA3DArrayGenome &mom=DYN_CAST(const GA3DArrayGenome &, p1); const GA3DArrayGenome &dad=DYN_CAST(const GA3DArrayGenome &, p2); int nc=0; unsigned int momsitex, momlenx, momsitey, momleny, momsitez, momlenz; unsigned int dadsitex, dadlenx, dadsitey, dadleny, dadsitez, dadlenz; unsigned int sitex, lenx, sitey, leny, sitez, lenz; if(c1 && c2){ GA3DArrayGenome &sis=DYN_CAST(GA3DArrayGenome &, *c1); GA3DArrayGenome &bro=DYN_CAST(GA3DArrayGenome &, *c2); if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE && bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ if(mom.width() != dad.width() || sis.width() != bro.width() || sis.width() != mom.width()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitex = momsitex = dadsitex = GARandomInt(0, mom.width()); lenx = momlenx = dadlenx = mom.width() - momsitex; } else if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE || bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsitex = GARandomInt(0, mom.width()); dadsitex = GARandomInt(0, dad.width()); momlenx = mom.width() - momsitex; dadlenx = dad.width() - dadsitex; sitex = GAMin(momsitex, dadsitex); lenx = GAMin(momlenx, dadlenx); } if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE && bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ if(mom.height() != dad.height() || sis.height() != bro.height() || sis.height() != mom.height()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitey = momsitey = dadsitey = GARandomInt(0, mom.height()); leny = momleny = dadleny = mom.height() - momsitey; } else if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE || bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsitey = GARandomInt(0, mom.height()); dadsitey = GARandomInt(0, dad.height()); momleny = mom.height() - momsitey; dadleny = dad.height() - dadsitey; sitey = GAMin(momsitey, dadsitey); leny = GAMin(momleny, dadleny); } if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE && bro.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){ if(mom.depth() != dad.depth() || sis.depth() != bro.depth() || sis.depth() != mom.depth()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitez = momsitez = dadsitez = GARandomInt(0, mom.depth()); lenz = momlenz = dadlenz = mom.depth() - momsitez; } else if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE || bro.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsitez = GARandomInt(0, mom.depth()); dadsitez = GARandomInt(0, dad.depth()); momlenz = mom.depth() - momsitez; dadlenz = dad.depth() - dadsitez; sitez = GAMin(momsitez, dadsitez); lenz = GAMin(momlenz, dadlenz); } sis.resize(sitex+lenx, sitey+leny, sitez+lenz); bro.resize(sitex+lenx, sitey+leny, sitez+lenz); sis.copy(mom, 0, 0, 0, momsitex-sitex, momsitey-sitey, momsitez-sitez, sitex, sitey, sitez); sis.copy(dad, sitex, 0, 0, dadsitex, dadsitey-sitey, dadsitez-sitez, lenx, sitey, sitez); sis.copy(dad, 0, sitey, 0, dadsitex-sitex, dadsitey, dadsitez-sitez, sitex, leny, sitez); sis.copy(mom, sitex, sitey, 0, momsitex, momsitey, momsitez-sitez, lenx, leny, sitez); sis.copy(dad, 0, 0, sitez, dadsitex-sitex, dadsitey-sitey, dadsitez, sitex, sitey, lenz); sis.copy(mom, sitex, 0, sitez, momsitex, momsitey-sitey, momsitez, lenx, sitey, lenz); sis.copy(mom, 0, sitey, sitez, momsitex-sitex, momsitey, momsitez, sitex, leny, lenz); sis.copy(dad, sitex, sitey, sitez, dadsitex, dadsitey, dadsitez, lenx, leny, lenz); bro.copy(dad, 0, 0, 0, dadsitex-sitex, dadsitey-sitey, dadsitez-sitez, sitex, sitey, sitez); bro.copy(mom, sitex, 0, 0, momsitex, momsitey-sitey, momsitez-sitez, lenx, sitey, sitez); bro.copy(mom, 0, sitey, 0, momsitex-sitex, momsitey, momsitez-sitez, sitex, leny, sitez); bro.copy(dad, sitex, sitey, 0, dadsitex, dadsitey, dadsitez-sitez, lenx, leny, sitez); bro.copy(mom, 0, 0, sitez, momsitex-sitex, momsitey-sitey, momsitez, sitex, sitey, lenz); bro.copy(dad, sitex, 0, sitez, dadsitex, dadsitey-sitey, dadsitez, lenx, sitey, lenz); bro.copy(dad, 0, sitey, sitez, dadsitex-sitex, dadsitey, dadsitez, sitex, leny, lenz); bro.copy(mom, sitex, sitey, sitez, momsitex, momsitey, momsitez, lenx, leny, lenz); nc = 2; } else if(c1){ GA3DArrayGenome &sis=DYN_CAST(GA3DArrayGenome &, *c1); if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ if(mom.width() != dad.width() || sis.width() != mom.width()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitex = momsitex = dadsitex = GARandomInt(0, mom.width()); lenx = momlenx = dadlenx = mom.width() - momsitex; } else{ momsitex = GARandomInt(0, mom.width()); dadsitex = GARandomInt(0, dad.width()); momlenx = mom.width() - momsitex; dadlenx = dad.width() - dadsitex; sitex = GAMin(momsitex, dadsitex); lenx = GAMin(momlenx, dadlenx); } if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ if(mom.height() != dad.height() || sis.height() != mom.height()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitey = momsitey = dadsitey = GARandomInt(0, mom.height()); leny = momleny = dadleny = mom.height() - momsitey; } else{ momsitey = GARandomInt(0, mom.height()); dadsitey = GARandomInt(0, dad.height()); momleny = mom.height() - momsitey; dadleny = dad.height() - dadsitey; sitey = GAMin(momsitey, dadsitey); leny = GAMin(momleny, dadleny); } if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){ if(mom.depth() != dad.depth() || sis.depth() != mom.depth()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitez = momsitez = dadsitez = GARandomInt(0, mom.depth()); lenz = momlenz = dadlenz = mom.depth() - momsitez; } else{ momsitez = GARandomInt(0, mom.depth()); dadsitez = GARandomInt(0, dad.depth()); momlenz = mom.depth() - momsitez; dadlenz = dad.depth() - dadsitez; sitez = GAMin(momsitez, dadsitez); lenz = GAMin(momlenz, dadlenz); } sis.resize(sitex+lenx, sitey+leny, sitez+lenz); if(GARandomBit()){ sis.copy(mom, 0, 0, 0, momsitex-sitex, momsitey-sitey, momsitez-sitez, sitex, sitey, sitez); sis.copy(dad, sitex, 0, 0, dadsitex, dadsitey-sitey, dadsitez-sitez, lenx, sitey, sitez); sis.copy(dad, 0, sitey, 0, dadsitex-sitex, dadsitey, dadsitez-sitez, sitex, leny, sitez); sis.copy(mom, sitex, sitey, 0, momsitex, momsitey, momsitez-sitez, lenx, leny, sitez); sis.copy(dad, 0, 0, sitez, dadsitex-sitex, dadsitey-sitey, dadsitez, sitex, sitey, lenz); sis.copy(mom, sitex, 0, sitez, momsitex, momsitey-sitey, momsitez, lenx, sitey, lenz); sis.copy(mom, 0, sitey, sitez, momsitex-sitex, momsitey, momsitez, sitex, leny, lenz); sis.copy(dad, sitex, sitey, sitez, dadsitex, dadsitey, dadsitez, lenx, leny, lenz); } else{ sis.copy(dad, 0, 0, 0, dadsitex-sitex, dadsitey-sitey, dadsitez-sitez, sitex, sitey, sitez); sis.copy(mom, sitex, 0, 0, momsitex, momsitey-sitey, momsitez-sitez, lenx, sitey, sitez); sis.copy(mom, 0, sitey, 0, momsitex-sitex, momsitey, momsitez-sitez, sitex, leny, sitez); sis.copy(dad, sitex, sitey, 0, dadsitex, dadsitey, dadsitez-sitez, lenx, leny, sitez); sis.copy(mom, 0, 0, sitez, momsitex-sitex, momsitey-sitey, momsitez, sitex, sitey, lenz); sis.copy(dad, sitex, 0, sitez, dadsitex, dadsitey-sitey, dadsitez, lenx, sitey, lenz); sis.copy(dad, 0, sitey, sitez, dadsitex-sitex, dadsitey, dadsitez, sitex, leny, lenz); sis.copy(mom, sitex, sitey, sitez, momsitex, momsitey, momsitez, lenx, leny, lenz); } nc = 1; } return nc; } #endif gamera-3.3.3/src/ga/GA3DArrayGenome.h0000644000076500000000000001302211755375113016107 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- array3.h mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This header defines the interface for the 3D array genome. See comments in 1D array file. ---------------------------------------------------------------------------- */ #ifndef _ga_array3_h_ #define _ga_array3_h_ #include #include #include /* ---------------------------------------------------------------------------- 3DArrayGenome ---------------------------------------------------------------------------- */ template class GA3DArrayGenome : public GAArray, public GAGenome { protected: using GAArray::a; using GAArray::sz; public: GADeclareIdentity(); static int SwapMutator(GAGenome&, float); static float ElementComparator(const GAGenome&, const GAGenome&); static int UniformCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int EvenOddCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int OnePointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); public: GA3DArrayGenome(unsigned int x, unsigned int y, unsigned int z, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA3DArrayGenome(const GA3DArrayGenome & orig); GA3DArrayGenome& operator=(const GAGenome& orig) {copy(orig); return *this;} GA3DArrayGenome& operator=(const T array []){ for(unsigned int i=0; i::swap(c*ny*nx+b*nx+a, f*ny*nx+e*nx+d); _evaluated = gaFalse; } protected: unsigned int nx, ny, nz, minX, minY, minZ, maxX, maxY, maxZ; }; /* ---------------------------------------------------------------------------- 3DArrayAlleleGenome ---------------------------------------------------------------------------- */ template class GA3DArrayAlleleGenome : public GA3DArrayGenome { protected: using GA3DArrayGenome::nx; using GA3DArrayGenome::ny; using GA3DArrayGenome::nz; using GA3DArrayGenome::a; using GA3DArrayGenome::sz; public: using GA3DArrayGenome::ElementComparator; using GA3DArrayGenome::OnePointCrossover; using GA3DArrayGenome::initializer; using GA3DArrayGenome::mutator; using GA3DArrayGenome::comparator; using GA3DArrayGenome::crossover; GADeclareIdentity(); static void UniformInitializer(GAGenome&); static int FlipMutator(GAGenome&, float); public: GA3DArrayAlleleGenome(unsigned int x, unsigned int y, unsigned int z, const GAAlleleSet & a, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA3DArrayAlleleGenome(unsigned int x, unsigned int y, unsigned int z, const GAAlleleSetArray & a, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA3DArrayAlleleGenome(const GA3DArrayAlleleGenome & orig); GA3DArrayAlleleGenome& operator=(const GAGenome& orig) {copy(orig); return *this;} GA3DArrayAlleleGenome& operator=(const T array []) {GA3DArrayGenome::operator=(array); return *this;} virtual ~GA3DArrayAlleleGenome(); virtual GAGenome * clone(GAGenome::CloneMethod flag=GAGenome::CONTENTS) const; virtual void copy(const GAGenome &); #ifndef NO_STREAMS virtual int read(istream& is); virtual int write (ostream& os) const; #endif virtual int equal(const GAGenome & c) const ; virtual int resize(int x, int y, int z); const GAAlleleSet& alleleset(unsigned int i=0) const {return aset[i%naset];} protected: int naset; GAAlleleSet * aset; }; #ifdef USE_BORLAND_INST #include #endif #endif gamera-3.3.3/src/ga/GA3DBinStrGenome.cpp0000644000076500000000000007526110714675676016615 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr3.C mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the 3D binary string genome. See the 1D genome for comments. ---------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include /* ---------------------------------------------------------------------------- Genome class definition ---------------------------------------------------------------------------- */ GA3DBinaryStringGenome:: GA3DBinaryStringGenome(unsigned int width, unsigned int height, unsigned int depth, GAGenome::Evaluator f, void * u) : GABinaryString(width*height*depth), GAGenome(DEFAULT_3DBINSTR_INITIALIZER, DEFAULT_3DBINSTR_MUTATOR, DEFAULT_3DBINSTR_COMPARATOR) { evaluator(f); userData(u); crossover(DEFAULT_3DBINSTR_CROSSOVER); nx=minX=maxX=0; ny=minY=maxY=0; nz=minZ=maxZ=0; resize(width, height, depth); } GA3DBinaryStringGenome:: GA3DBinaryStringGenome(const GA3DBinaryStringGenome & orig) : GABinaryString(orig.GABinaryString::size()), GAGenome() { nx=minX=maxX=0; ny=minY=maxY=0; nz=minZ=maxZ=0; GA3DBinaryStringGenome::copy(orig); } GA3DBinaryStringGenome::~GA3DBinaryStringGenome() { } GAGenome * GA3DBinaryStringGenome::clone(GAGenome::CloneMethod flag) const { GA3DBinaryStringGenome *cpy = new GA3DBinaryStringGenome(nx,ny,nz); if(flag == CONTENTS){ cpy->copy(*this); } else{ cpy->GAGenome::copy(*this); cpy->minX = minX; cpy->minY = minY; cpy->minZ = minZ; cpy->maxX = maxX; cpy->maxY = maxY; cpy->maxZ = maxZ; } return cpy; } void GA3DBinaryStringGenome::copy(const GAGenome & orig) { if(&orig == this) return; const GA3DBinaryStringGenome* c = DYN_CAST(const GA3DBinaryStringGenome*, &orig); if(c) { GAGenome::copy(*c); GABinaryString::copy(*c); nx = c->nx; ny = c->ny; nz = c->nz; minX = c->minX; minY = c->minY; minZ = c->minZ; maxX = c->maxX; maxY = c->maxY; maxZ = c->maxZ; } } int GA3DBinaryStringGenome::resize(int w, int h, int d) { if(w == STA_CAST(int,nx) && h == STA_CAST(int,ny) && d == STA_CAST(int,nz)) return sz; if(w == GAGenome::ANY_SIZE) w = GARandomInt(minX, maxX); else if(w < 0) w = nx; // do nothing else if(minX == maxX) minX=maxX = w; else{ if(w < STA_CAST(int,minX)) w=minX; if(w > STA_CAST(int,maxX)) w=maxX; } if(h == GAGenome::ANY_SIZE) h = GARandomInt(minY, maxY); else if(h < 0) h = ny; // do nothing else if(minY == maxY) minY=maxY = h; else{ if(h < STA_CAST(int,minY)) h=minY; if(h > STA_CAST(int,maxY)) h=maxY; } if(d == GAGenome::ANY_SIZE) d = GARandomInt(minZ, maxZ); else if(d < 0) d = nz; // do nothing else if(minZ == maxZ) minZ=maxZ = d; else{ if(d < STA_CAST(int,minZ)) d=minZ; if(d > STA_CAST(int,maxZ)) d=maxZ; } if(w < STA_CAST(int,nx) && h < STA_CAST(int,ny)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=0; k STA_CAST(int,nx) && h > STA_CAST(int,ny)){ // adjust the existing bits int z=GAMin(STA_CAST(int,nz),d); for(int k=z-1; k>=0; k--){ int j; for(j=ny-1; j>=0; j--){ GABinaryString::move(k*h*w+j*w,k*ny*nx+j*nx,nx); for(int i=nx; i STA_CAST(int,nx)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=z-1; k>=0; k--){ for(int j=h-1; j>=0; j--){ GABinaryString::move(k*h*w+j*w,k*h*nx+j*nx,nx); for(int i=nx; i STA_CAST(int,ny)){ int z=GAMin(STA_CAST(int,nz),d); for(int k=z-1; k>=0; k--){ int j; for(j=ny-1; j>=0; j--) GABinaryString::move(k*h*w+j*w,k*ny*w+j*w,w); for(j=ny; j STA_CAST(int,nz)){ // change in depth is always new bits for(int i=w*h*nz; i> c; if(isdigit(c)){ gene(i++, j, k, ((c == '0') ? 0 : 1)); if(i >= nx){ i=0; j++; } if(j >= ny){ j=0; k++; } } } _evaluated = gaFalse; if(is.eof() && ((k < nz) || // didn't get some lines (j < ny && j != 0) || // didn't get some lines (i < nx && i != 0))){ // didn't get some lines GAErr(GA_LOC, className(), "read", gaErrUnexpectedEOF); is.clear(ios::badbit | is.rdstate()); return 1; } return 0; } // Dump the bits to the stream with a newline at the end of each row and // another at the end of each layer. No newline at the end of the block. int GA3DBinaryStringGenome::write(ostream & os) const { for(unsigned int k=0; k upper) resize(upper,ny,nz); if(nx < lower) resize(lower,ny,nz); break; case HEIGHT: minY = lower; maxY = upper; if(ny > upper) resize(nx,upper,nz); if(ny < lower) resize(nx,lower,nz); break; case DEPTH: minZ = lower; maxZ = upper; if(nz > upper) resize(nx,ny,upper); if(nz < lower) resize(nx,ny,lower); break; default: break; } return resizeBehaviour(which); } void GA3DBinaryStringGenome:: copy(const GA3DBinaryStringGenome & orig, unsigned int r, unsigned int s, unsigned int t, unsigned int x, unsigned int y, unsigned int z, unsigned int w, unsigned int h, unsigned int d) { if(w == 0 || x >= orig.nx || r >= nx || h == 0 || y >= orig.ny || s >= ny || d == 0 || z >= orig.nz || t >= nz) return; if(x + w > orig.nx) w = orig.nx - x; if(y + h > orig.ny) h = orig.ny - y; if(z + d > orig.nz) d = orig.nz - z; if(r + w > nx) w = nx - r; if(s + h > ny) h = ny - s; if(t + d > nz) d = nz - t; for(unsigned int k=0; k nx) w = nx - x; if(y + h > ny) h = ny - y; if(z + d > nz) d = nz - z; for(unsigned int k=0; k nx) w = nx - x; if(y + h > ny) h = ny - y; if(z + d > nz) d = nz - z; for(unsigned int k=0; k nx) w = nx - x; if(y + h > ny) h = ny - y; if(z + d > nz) d = nz - z; for(unsigned int k=0; k nx) w = nx - srcx; if(x + w > nx) w = nx - x; if(srcy + h > ny) h = ny - srcy; if(y + h > ny) h = ny - y; if(srcz + d > nz) d = nz - srcz; if(z + d > nz) d = nz - z; if(srcz=0; k--) for(int j=h-1; j>=0; j--) GABinaryString::move((z+k)*ny*nx + (y+j)*nx + x, (srcz+k)*ny*nx + (srcy+j)*nx + srcx, w); } else{ for(int k=d-1; k>=0; k--) for(unsigned int j=0; j=0; j--) GABinaryString::move((z+k)*ny*nx + (y+j)*nx + x, (srcz+k)*ny*nx + (srcy+j)*nx + srcx, w); } else{ for(unsigned int k=0; k=0; i--) for(int j=child.height()-1; j>=0; j--) for(int k=child.depth()-1; k>=0; k--) child.gene(i,j,k, GARandomBit()); } void GA3DBinaryStringGenome::UnsetInitializer(GAGenome & c) { GA3DBinaryStringGenome &child=DYN_CAST(GA3DBinaryStringGenome &, c); child.resize(GAGenome::ANY_SIZE,GAGenome::ANY_SIZE,GAGenome::ANY_SIZE); child.unset(0, 0, 0, child.width(), child.height(), child.depth()); } void GA3DBinaryStringGenome::SetInitializer(GAGenome & c) { GA3DBinaryStringGenome &child=DYN_CAST(GA3DBinaryStringGenome &, c); child.resize(GAGenome::ANY_SIZE,GAGenome::ANY_SIZE,GAGenome::ANY_SIZE); child.set(0, 0, 0, child.width(), child.height(), child.depth()); } int GA3DBinaryStringGenome::FlipMutator(GAGenome & c, float pmut) { GA3DBinaryStringGenome &child=DYN_CAST(GA3DBinaryStringGenome &, c); register int n, m, i, j, k, d; if(pmut <= 0.0) return(0); float nMut = pmut * STA_CAST(float,child.size()); if(nMut < 1.0){ // we have to do a flip test on each bit nMut = 0; for(i=child.width()-1; i>=0; i--){ for(j=child.height()-1; j>=0; j--){ for(k=child.depth()-1; k>=0; k--){ if(GAFlipCoin(pmut)){ child.gene(i, j, k, ((child.gene(i,j,k) == 0) ? 1 : 0)); nMut++; } } } } } else{ // only flip the number of bits we need to flip for(n=0; n=0; i--) for(int j=sis.height()-1; j>=0; j--) for(int k=sis.depth()-1; k>=0; k--) count += ((sis.gene(i,j,k) == bro.gene(i,j,k)) ? 0 : 1); return count/sis.size(); } // Make sure our bitmask is big enough, generate a mask, then use it to // extract the information from each parent to stuff the two children. // We don't deallocate any space for the masks under the assumption that we'll // have to use them again in the future. // For now we'll implement this only for fixed length genomes. If you use // this crossover method on genomes of different sizes it might break! int GA3DBinaryStringGenome:: UniformCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA3DBinaryStringGenome &mom= DYN_CAST(const GA3DBinaryStringGenome &, p1); const GA3DBinaryStringGenome &dad= DYN_CAST(const GA3DBinaryStringGenome &, p2); int i,j,k, nc=0;; if(c1 && c2){ GA3DBinaryStringGenome &sis=DYN_CAST(GA3DBinaryStringGenome &, *c1); GA3DBinaryStringGenome &bro=DYN_CAST(GA3DBinaryStringGenome &, *c2); if(sis.width() == bro.width() && sis.height() == bro.height() && sis.depth() == bro.depth() && mom.width() == dad.width() && mom.height() == dad.height() && mom.depth() == dad.depth() && sis.width() == mom.width() && sis.height() == mom.height() && sis.depth() == mom.depth()){ for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ for(k=sis.depth()-1; k>=0; k--){ if(GARandomBit()){ sis.gene(i,j,k, mom.gene(i,j,k)); bro.gene(i,j,k, dad.gene(i,j,k)); } else{ sis.gene(i,j,k, dad.gene(i,j,k)); bro.gene(i,j,k, mom.gene(i,j,k)); } } } } } else{ GAMask mask; int maxx = GAMax(sis.width(), bro.width()); int minx = GAMin(mom.width(), dad.width()); int maxy = GAMax(sis.height(), bro.height()); int miny = GAMin(mom.height(), dad.height()); int maxz = GAMax(sis.depth(), bro.depth()); int minz = GAMin(mom.depth(), dad.depth()); mask.size(maxx*maxy*maxz); for(i=0; i=0; i--) for(j=miny-1; j>=0; j--) for(k=minz-1; k>=0; k--) sis.gene(i,j,k, (mask[i*miny*minz+j*minz+k] ? mom.gene(i,j,k) : dad.gene(i,j,k))); minx = GAMin(bro.width(), minx); miny = GAMin(bro.height(), miny); minz = GAMin(bro.depth(), minz); for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) for(k=minz-1; k>=0; k--) bro.gene(i,j,k, (mask[i*miny*minz+j*minz+k] ? dad.gene(i,j,k) : mom.gene(i,j,k))); } nc = 2; } else if(c1 || c2){ GA3DBinaryStringGenome &sis = (c1 ? DYN_CAST(GA3DBinaryStringGenome&, *c1) : DYN_CAST(GA3DBinaryStringGenome&, *c2)); if(mom.width() == dad.width() && mom.height() == dad.height() && mom.depth() == dad.depth() && sis.width() == mom.width() && sis.height() == mom.height() && sis.depth() == mom.depth()){ for(i=sis.width()-1; i>=0; i--) for(j=sis.height()-1; j>=0; j--) for(k=sis.depth()-1; k>=0; k--) sis.gene(i,j,k, (GARandomBit() ? mom.gene(i,j,k):dad.gene(i,j,k))); } else{ int minx = GAMin(mom.width(), dad.width()); int miny = GAMin(mom.height(), dad.height()); int minz = GAMin(mom.depth(), dad.depth()); minx = GAMin(sis.width(), minx); miny = GAMin(sis.height(), miny); minz = GAMin(sis.depth(), minz); for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) for(k=minz-1; k>=0; k--) sis.gene(i,j,k, (GARandomBit() ? mom.gene(i,j,k):dad.gene(i,j,k))); } nc = 1; } return nc; } // For even crossover we take the even bits from the mother (for the daughter) // and the odd bits from the father. Just the opposite for the son. // This is designed only for genomes that are the same length. If the child // is not the same length as the parent, or if the children are not the same // size, we don't do the crossover. // In the interest of speed we do not do any checks for size. Do not use // this crossover method when the parents and children may be different sizes. // It might break! int GA3DBinaryStringGenome:: EvenOddCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA3DBinaryStringGenome &mom= DYN_CAST(const GA3DBinaryStringGenome &, p1); const GA3DBinaryStringGenome &dad= DYN_CAST(const GA3DBinaryStringGenome &, p2); int nc=0; int i,j,k; if(c1 && c2){ GA3DBinaryStringGenome &sis=DYN_CAST(GA3DBinaryStringGenome &, *c1); GA3DBinaryStringGenome &bro=DYN_CAST(GA3DBinaryStringGenome &, *c2); if(sis.width() == bro.width() && sis.height() == bro.height() && sis.depth() == bro.depth() && mom.width() == dad.width() && mom.height() == dad.height() && mom.depth() == dad.depth() && sis.width() == mom.width() && sis.height() == mom.height() && sis.depth() == mom.depth()){ int count=0; for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ for(k=sis.depth()-1; k>=0; k--){ if(count%2 == 0){ sis.gene(i,j,k, mom.gene(i,j,k)); bro.gene(i,j,k, dad.gene(i,j,k)); } else{ sis.gene(i,j,k, dad.gene(i,j,k)); bro.gene(i,j,k, mom.gene(i,j,k)); } count++; } } } } else{ int minx = GAMin(mom.width(), dad.width()); int miny = GAMin(mom.height(), dad.height()); int minz = GAMin(mom.depth(), dad.depth()); minx = GAMin(sis.width(), minx); miny = GAMin(sis.height(), miny); minz = GAMin(sis.depth(), minz); for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) for(k=minz-1; k>=0; k--) sis.gene(i,j,k, (((i*miny*minz+j*minz+k)%2 == 0) ? mom.gene(i,j,k) : dad.gene(i,j,k))); minx = (bro.width() < minx) ? bro.width() : minx; miny = (bro.height() < miny) ? bro.height() : miny; minz = (bro.depth() < minz) ? bro.depth() : minz; for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) for(k=minz-1; k>=0; k--) bro.gene(i,j,k, (((i*miny*minz+j*minz+k)%2 == 0) ? dad.gene(i,j,k) : mom.gene(i,j,k))); } nc = 2; } else if(c1 || c2){ GA3DBinaryStringGenome &sis = (c1 ? DYN_CAST(GA3DBinaryStringGenome &, *c1) : DYN_CAST(GA3DBinaryStringGenome &, *c2)); if(mom.width() == dad.width() && mom.height() == dad.height() && mom.depth() == dad.depth() && sis.width() == mom.width() && sis.height() == mom.height() && sis.depth() == mom.depth()){ int count=0; for(i=sis.width()-1; i>=0; i--){ for(j=sis.height()-1; j>=0; j--){ for(k=sis.depth()-1; k>=0; k--){ sis.gene(i,j,k,((count%2 == 0) ? mom.gene(i,j,k):dad.gene(i,j,k))); count++; } } } } else{ int minx = GAMin(mom.width(), dad.width()); int miny = GAMin(mom.height(), dad.height()); int minz = GAMin(mom.depth(), dad.depth()); minx = GAMin(sis.width(), minx); miny = GAMin(sis.height(), miny); minz = GAMin(sis.depth(), minz); for(i=minx-1; i>=0; i--) for(j=miny-1; j>=0; j--) for(k=minz-1; k>=0; k--) sis.gene(i,j, (((i*miny*minz+j*minz+k)%2 == 0) ? mom.gene(i,j,k) : dad.gene(i,j,k))); } nc = 1; } return nc; } // Pick a single point in the 3D block and grab alternating quadrants for each // child. If the children are resizable, this crossover does clipping or // padding depending on the setting of the clip flag. If we pad, we fill the // additional bits with random contents. int GA3DBinaryStringGenome:: OnePointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GA3DBinaryStringGenome &mom= DYN_CAST(const GA3DBinaryStringGenome &, p1); const GA3DBinaryStringGenome &dad= DYN_CAST(const GA3DBinaryStringGenome &, p2); int nc=0; unsigned int momsitex, momlenx, momsitey, momleny, momsitez, momlenz; unsigned int dadsitex, dadlenx, dadsitey, dadleny, dadsitez, dadlenz; unsigned int sitex, lenx, sitey, leny, sitez, lenz; if(c1 && c2){ GA3DBinaryStringGenome &sis=DYN_CAST(GA3DBinaryStringGenome &, *c1); GA3DBinaryStringGenome &bro=DYN_CAST(GA3DBinaryStringGenome &, *c2); if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE && bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ if(mom.width() != dad.width() || sis.width() != bro.width() || sis.width() != mom.width()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitex = momsitex = dadsitex = GARandomInt(0, mom.width()); lenx = momlenx = dadlenx = mom.width() - momsitex; } else if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE || bro.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsitex = GARandomInt(0, mom.width()); dadsitex = GARandomInt(0, dad.width()); momlenx = mom.width() - momsitex; dadlenx = dad.width() - dadsitex; sitex = GAMin(momsitex, dadsitex); lenx = GAMin(momlenx, dadlenx); } if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE && bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ if(mom.height() != dad.height() || sis.height() != bro.height() || sis.height() != mom.height()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitey = momsitey = dadsitey = GARandomInt(0, mom.height()); leny = momleny = dadleny = mom.height() - momsitey; } else if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE || bro.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsitey = GARandomInt(0, mom.height()); dadsitey = GARandomInt(0, dad.height()); momleny = mom.height() - momsitey; dadleny = dad.height() - dadsitey; sitey = GAMin(momsitey, dadsitey); leny = GAMin(momleny, dadleny); } if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE && bro.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){ if(mom.depth() != dad.depth() || sis.depth() != bro.depth() || sis.depth() != mom.depth()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitez = momsitez = dadsitez = GARandomInt(0, mom.depth()); lenz = momlenz = dadlenz = mom.depth() - momsitez; } else if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE || bro.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameBehavReqd); return nc; } else{ momsitez = GARandomInt(0, mom.depth()); dadsitez = GARandomInt(0, dad.depth()); momlenz = mom.depth() - momsitez; dadlenz = dad.depth() - dadsitez; sitez = GAMin(momsitez, dadsitez); lenz = GAMin(momlenz, dadlenz); } sis.resize(sitex+lenx, sitey+leny, sitez+lenz); bro.resize(sitex+lenx, sitey+leny, sitez+lenz); sis.copy(mom, 0, 0, 0, momsitex-sitex, momsitey-sitey, momsitez-sitez, sitex, sitey, sitez); sis.copy(dad, sitex, 0, 0, dadsitex, dadsitey-sitey, dadsitez-sitez, lenx, sitey, sitez); sis.copy(dad, 0, sitey, 0, dadsitex-sitex, dadsitey, dadsitez-sitez, sitex, leny, sitez); sis.copy(mom, sitex, sitey, 0, momsitex, momsitey, momsitez-sitez, lenx, leny, sitez); sis.copy(dad, 0, 0, sitez, dadsitex-sitex, dadsitey-sitey, dadsitez, sitex, sitey, lenz); sis.copy(mom, sitex, 0, sitez, momsitex, momsitey-sitey, momsitez, lenx, sitey, lenz); sis.copy(mom, 0, sitey, sitez, momsitex-sitex, momsitey, momsitez, sitex, leny, lenz); sis.copy(dad, sitex, sitey, sitez, dadsitex, dadsitey, dadsitez, lenx, leny, lenz); bro.copy(dad, 0, 0, 0, dadsitex-sitex, dadsitey-sitey, dadsitez-sitez, sitex, sitey, sitez); bro.copy(mom, sitex, 0, 0, momsitex, momsitey-sitey, momsitez-sitez, lenx, sitey, sitez); bro.copy(mom, 0, sitey, 0, momsitex-sitex, momsitey, momsitez-sitez, sitex, leny, sitez); bro.copy(dad, sitex, sitey, 0, dadsitex, dadsitey, dadsitez-sitez, lenx, leny, sitez); bro.copy(mom, 0, 0, sitez, momsitex-sitex, momsitey-sitey, momsitez, sitex, sitey, lenz); bro.copy(dad, sitex, 0, sitez, dadsitex, dadsitey-sitey, dadsitez, lenx, sitey, lenz); bro.copy(dad, 0, sitey, sitez, dadsitex-sitex, dadsitey, dadsitez, sitex, leny, lenz); bro.copy(mom, sitex, sitey, sitez, momsitex, momsitey, momsitez, lenx, leny, lenz); nc = 2; } else if(c1 || c2){ GA3DBinaryStringGenome &sis = (c1 ? DYN_CAST(GA3DBinaryStringGenome &, *c1) : DYN_CAST(GA3DBinaryStringGenome &, *c2)); if(sis.resizeBehaviour(GAGenome::WIDTH) == GAGenome::FIXED_SIZE){ if(mom.width() != dad.width() || sis.width() != mom.width()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitex = momsitex = dadsitex = GARandomInt(0, mom.width()); lenx = momlenx = dadlenx = mom.width() - momsitex; } else{ momsitex = GARandomInt(0, mom.width()); dadsitex = GARandomInt(0, dad.width()); momlenx = mom.width() - momsitex; dadlenx = dad.width() - dadsitex; sitex = GAMin(momsitex, dadsitex); lenx = GAMin(momlenx, dadlenx); } if(sis.resizeBehaviour(GAGenome::HEIGHT) == GAGenome::FIXED_SIZE){ if(mom.height() != dad.height() || sis.height() != mom.height()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitey = momsitey = dadsitey = GARandomInt(0, mom.height()); leny = momleny = dadleny = mom.height() - momsitey; } else{ momsitey = GARandomInt(0, mom.height()); dadsitey = GARandomInt(0, dad.height()); momleny = mom.height() - momsitey; dadleny = dad.height() - dadsitey; sitey = GAMin(momsitey, dadsitey); leny = GAMin(momleny, dadleny); } if(sis.resizeBehaviour(GAGenome::DEPTH) == GAGenome::FIXED_SIZE){ if(mom.depth() != dad.depth() || sis.depth() != mom.depth()){ GAErr(GA_LOC, mom.className(), "one-point cross", gaErrSameLengthReqd); return nc; } sitez = momsitez = dadsitez = GARandomInt(0, mom.depth()); lenz = momlenz = dadlenz = mom.depth() - momsitez; } else{ momsitez = GARandomInt(0, mom.depth()); dadsitez = GARandomInt(0, dad.depth()); momlenz = mom.depth() - momsitez; dadlenz = dad.depth() - dadsitez; sitez = GAMin(momsitez, dadsitez); lenz = GAMin(momlenz, dadlenz); } sis.resize(sitex+lenx, sitey+leny, sitez+lenz); if(GARandomBit()){ sis.copy(mom, 0, 0, 0, momsitex-sitex, momsitey-sitey, momsitez-sitez, sitex, sitey, sitez); sis.copy(dad, sitex, 0, 0, dadsitex, dadsitey-sitey, dadsitez-sitez, lenx, sitey, sitez); sis.copy(dad, 0, sitey, 0, dadsitex-sitex, dadsitey, dadsitez-sitez, sitex, leny, sitez); sis.copy(mom, sitex, sitey, 0, momsitex, momsitey, momsitez-sitez, lenx, leny, sitez); sis.copy(dad, 0, 0, sitez, dadsitex-sitex, dadsitey-sitey, dadsitez, sitex, sitey, lenz); sis.copy(mom, sitex, 0, sitez, momsitex, momsitey-sitey, momsitez, lenx, sitey, lenz); sis.copy(mom, 0, sitey, sitez, momsitex-sitex, momsitey, momsitez, sitex, leny, lenz); sis.copy(dad, sitex, sitey, sitez, dadsitex, dadsitey, dadsitez, lenx, leny, lenz); } else{ sis.copy(dad, 0, 0, 0, dadsitex-sitex, dadsitey-sitey, dadsitez-sitez, sitex, sitey, sitez); sis.copy(mom, sitex, 0, 0, momsitex, momsitey-sitey, momsitez-sitez, lenx, sitey, sitez); sis.copy(mom, 0, sitey, 0, momsitex-sitex, momsitey, momsitez-sitez, sitex, leny, sitez); sis.copy(dad, sitex, sitey, 0, dadsitex, dadsitey, dadsitez-sitez, lenx, leny, sitez); sis.copy(mom, 0, 0, sitez, momsitex-sitex, momsitey-sitey, momsitez, sitex, sitey, lenz); sis.copy(dad, sitex, 0, sitez, dadsitex, dadsitey-sitey, dadsitez, lenx, sitey, lenz); sis.copy(dad, 0, sitey, sitez, dadsitex-sitex, dadsitey, dadsitez, sitex, leny, lenz); sis.copy(mom, sitex, sitey, sitez, momsitex, momsitey, momsitez, lenx, leny, lenz); } nc = 1; } return nc; } gamera-3.3.3/src/ga/GA3DBinStrGenome.h0000644000076500000000000001070510714675676016252 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr3.h mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This header defines the interface for the 3D binary string genome. ---------------------------------------------------------------------------- */ #ifndef _ga_binstr3_h_ #define _ga_binstr3_h_ #include #include /* ---------------------------------------------------------------------------- 3DBinaryStringGenome ------------------------------------------------------------------------------- ---------------------------------------------------------------------------- */ class GA3DBinaryStringGenome : public GABinaryString, public GAGenome { public: GADefineIdentity("GA3DBinaryStringGenome", GAID::BinaryStringGenome3D); static void UniformInitializer(GAGenome &); static void UnsetInitializer(GAGenome &); static void SetInitializer(GAGenome &); static int FlipMutator(GAGenome &, float); static float BitComparator(const GAGenome&, const GAGenome&); static int UniformCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int EvenOddCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int OnePointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); public: GA3DBinaryStringGenome(unsigned int x, unsigned int y, unsigned int z, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0); GA3DBinaryStringGenome(const GA3DBinaryStringGenome & orig); GA3DBinaryStringGenome& operator=(const GAGenome& arg) {copy(arg); return *this;} GA3DBinaryStringGenome& operator=(const short array []){ for(unsigned int i=0; i #include #include #define GA_ALLELE_CHUNK 10 template GAAlleleSetCore::GAAlleleSetCore() : type(GAAllele::ENUMERATED), csz(GA_ALLELE_CHUNK), sz(0), SZ(0), a(0) { lowerb = GAAllele::NONE; upperb = GAAllele::NONE; cnt = 1; } template GAAlleleSetCore::GAAlleleSetCore(unsigned int n, const T array []) : type(GAAllele::ENUMERATED), csz(GA_ALLELE_CHUNK), sz(n), SZ(GA_ALLELE_CHUNK) { while(SZ < sz) SZ += csz; a = new T [SZ]; // memcpy(a, array, n*sizeof(T)); for(unsigned int i=0; i GAAlleleSetCore:: GAAlleleSetCore(const T& lower, const T& upper, GAAllele::BoundType lb, GAAllele::BoundType ub) : type(GAAllele::BOUNDED), csz(GA_ALLELE_CHUNK), sz(2), SZ(2), a(new T[2]) { a[0] = lower; a[1] = upper; lowerb = lb; upperb = ub; cnt = 1; } template GAAlleleSetCore:: GAAlleleSetCore(const T& lower, const T& upper, const T& increment, GAAllele::BoundType lb, GAAllele::BoundType ub) : type(GAAllele::DISCRETIZED), csz(GA_ALLELE_CHUNK), sz(3), SZ(3), a(new T[3]) { a[0] = lower; a[1] = upper; a[2] = increment; lowerb = lb; upperb = ub; cnt = 1; } // We do not copy the original's reference count! template GAAlleleSetCore::GAAlleleSetCore(const GAAlleleSetCore & orig) : csz(orig.csz), sz(orig.sz), SZ(orig.SZ), a(new T[orig.SZ]) { // memcpy(a, orig.a, sz*sizeof(T)); for(unsigned int i=0; i GAAlleleSetCore::~GAAlleleSetCore(){ if(cnt > 0) GAErr(GA_LOC, "GAAlleleSetCore", "destructor", gaErrRefsRemain); delete [] a; } // Copying the contents of another allele set core does NOT change the current // count of the allele set core! template GAAlleleSetCore & GAAlleleSetCore::operator=(const GAAlleleSetCore & orig){ if(this == &orig) return *this; if(SZ < orig.sz){ while(SZ < orig.sz) SZ += csz; delete [] a; a = new T [SZ]; } // memcpy(a, orig.a, orig.sz*sizeof(T)); for(unsigned int i=0; i void GAAlleleSet::link(GAAlleleSet& set){ if(&set != this){ if(core != 0){ core->cnt -= 1; if(core->cnt == 0) delete core; } core=set.core; core->cnt += 1; } } template void GAAlleleSet::unlink(){ if(core == 0) return; // nothing to unlink if(core->cnt > 1){ core->cnt -= 1; core = new GAAlleleSetCore(*core); } } // If everthing goes OK, return 0. If there's an error, we return -1. I // really wish there were enough compilers doing exceptions to use them... template int GAAlleleSet::add(const T & alle){ if(core == 0) core = new GAAlleleSetCore; if(core->type != GAAllele::ENUMERATED) return 1; if(core->sz >= core->SZ){ core->SZ += core->csz; T * tmp = core->a; core->a = new T [core->SZ]; for(unsigned int i=0; isz; i++) core->a[i] = tmp[i]; // memcpy(core->a, tmp, core->sz*sizeof(T)); delete [] tmp; } core->a[core->sz] = alle; core->sz += 1; return 0; } template int GAAlleleSet::remove(const T & allele){ if(core == 0) core = new GAAlleleSetCore; if(core->type != GAAllele::ENUMERATED) return 1; for(unsigned int i=0; isz; i++){ if(core->a[i] == allele){ for(unsigned int j=i; jsz-1; j++) core->a[j] = core->a[j+1]; // memmove(&(core->a[i]), &(core->a[i+1]), (core->sz-i-1)*sizeof(T)); core->sz -= 1; i = core->sz; // break out of the loop } } return 0; } template int GAAlleleSet::remove(unsigned int x){ for(unsigned int j=x; jsz-1; j++) core->a[j] = core->a[j+1]; // memmove(&(core->a[i]), &(core->a[i+1]), (core->sz-i-1)*sizeof(T)); core->sz -= 1; return 0; } // When returning an allele from the set, we have to know what type we are. // The allele that we return depends on the type. If we're an enumerated set // then just pick randomly from the list of alleles. If we're a bounded set // then pick randomly from the bounds, and respect the bound types. If we're // a discretized set then we do much as we would for the bounded set, but we // respect the discretization. // Be sure to specialize this member function (see the real genome for an // example of how to do this) template T GAAlleleSet::allele() const { if(core->type == GAAllele::ENUMERATED) return core->a[GARandomInt(0, core->sz-1)]; else if(core->type == GAAllele::DISCRETIZED){ GAErr(GA_LOC, "GAAlleleSet", "allele(unsigned int)", gaErrOpUndef); return core->a[0]; } else{ GAErr(GA_LOC, "GAAlleleSet", "allele(unsigned int)", gaErrOpUndef); return core->a[0]; } } // This works only for enumerated sets. If someone tries to use this on a // non-enumerated set then we post an error message. No bounds checking on // the value that was passed to us, but we do modulo it so that we'll never // break. Also, this means you can wrap an allele set around an array that // is significantly larger than the allele set that defines its contents. template T GAAlleleSet::allele(unsigned int i) const { if(core->type == GAAllele::ENUMERATED) return core->a[i % core->sz]; else if(core->type == GAAllele::DISCRETIZED){ GAErr(GA_LOC, "GAAlleleSet", "allele(unsigned int)", gaErrOpUndef); return core->a[0]; } else{ GAErr(GA_LOC, "GAAlleleSet", "allele(unsigned int)", gaErrNoAlleleIndex); return core->a[0]; } } #ifndef NO_STREAMS template int GAAlleleSet::read(istream&){ GAErr(GA_LOC, "GAAlleleSet", "read", gaErrOpUndef); return 1; } template int GAAlleleSet::write(ostream &) const { GAErr(GA_LOC, "GAAlleleSet", "write", gaErrOpUndef); return 1; } /* // ** won't work with NULL cores!!!!!!! // The default read assumes input in the format that we write out. // We should do more checks on the values that we read in. template int GAAlleleSet::read(istream& is){ char buf[32]; int n; if(is.fail() || is.eof()) return 1; is.width(sizeof(buf)); // don't allow to overflow buffer is >> buf; if(strcmp(buf, "ENUMERATED") == 0){ core->type = GAAllele::ENUMERATED; is >> n; if(is.fail() || is.eof()) return 1; core->sz = n; if(core->sz >= core->SZ){ while(core->sz >= core->SZ) core->SZ += core->csz; delete [] core->a; core->a = new T [core->SZ]; for(int i=0; isz; i++){ is >> core->a[i]; if(is.fail() || is.eof()) return 1; } } } else if(strcmp(buf, "BOUNDED") == 0){ core->type = GAAllele::BOUNDED; delete [] core->a; core->SZ = 2; core->sz = 2; core->a = new T [core->SZ]; is >> buf; if(strcmp(buf, "INCL") == 0) core->lowerb = GAAllele::INCLUSIVE; else core->lowerb = GAAllele::EXCLUSIVE; is >> buf; if(strcmp(buf, "INCL") == 0) core->upperb = GAAllele::INCLUSIVE; else core->upperb = GAAllele::EXCLUSIVE; is >> core->a[0] >> core->a[1]; if(is.fail() || is.eof()) return 1; } else if(strcmp(buf, "DISCRETIZED") == 0){ core->type = GAAllele::DISCRETIZED; delete [] core->a; core->SZ = 3; core->sz = 3; core->a = new T [core->SZ]; is >> buf; if(strcmp(buf, "INCL") == 0) core->lowerb = GAAllele::INCLUSIVE; else core->lowerb = GAAllele::EXCLUSIVE; is >> buf; if(strcmp(buf, "INCL") == 0) core->upperb = GAAllele::INCLUSIVE; else core->upperb = GAAllele::EXCLUSIVE; is >> core->a[0] >> core->a[1]; if(is.fail() || is.eof()) return 1; } else { is.clear(ios::badbit | is.rdstate()); GAErr(GA_LOC, "GAAlleleSet", "read", "unrecognized allele set type.", "Expected ENUMERATED, BOUNDED, or DISCRETIZED"); return 1; } return 0; } // The default write method prints out the type of the allele set followed by // the contents. We use a single space as our separator. template int GAAlleleSet::write(ostream & os) const { switch(core->type){ case GAAllele::ENUMERATED: os << "ENUMERATED "; os << core->sz << "\n"; for(int i=0; isz; i++) os << core->a[i] << " "; os << "\n"; break; case GAAllele::BOUNDED: os << "BOUNDED "; os << ((core->lowerb == GAAllele::INCLUSIVE) ? "INCL" : "EXCL") << " "; os << ((core->upperb == GAAllele::INCLUSIVE) ? "INCL" : "EXCL") << "\n"; os << core->a[0] << " " << core->a[1] << "\n"; break; case GAAllele::DISCRETIZED: os << "DISCRETIZED "; os << ((core->lowerb == GAAllele::INCLUSIVE) ? "INCL" : "EXCL") << " "; os << ((core->upperb == GAAllele::INCLUSIVE) ? "INCL" : "EXCL") << "\n"; os << core->a[0] << " " << core->a[1] << " " << core->a[2] << "\n"; break; default: break; } return 0; } */ #endif // could do these with a memcmp if the type is simple... template int operator==(const GAAlleleSet & a, const GAAlleleSet & b) { if(a.core == b.core) return 1; if(a.core == 0 || b.core == 0) return 0; if(a.core->sz != b.core->sz) return 0; // return((memcmp(a.core, b.core, a.core->sz * sizeof(T)) == 0) ? 1 : 0); unsigned int i; for(i=0; isz && a.core->a[i] == b.core->a[i]; i++); return((i == a.core->sz) ? 1 : 0); } template int operator!=(const GAAlleleSet & a, const GAAlleleSet & b) { if(a.core == b.core) return 0; if(a.core == 0 || b.core == 0) return 1; if(a.core->sz != b.core->sz) return 1; // return((memcmp(a.core, b.core, a.core->sz * sizeof(T)) == 0) ? 0 : 1); unsigned int i; for(i=0; isz && a.core->a[i] == b.core->a[i]; i++); return((i == a.core->sz) ? 0 : 1); } template GAAlleleSetArray::GAAlleleSetArray() : csz(GA_ALLELE_CHUNK), sz(0), SZ(0), aset(0) {} template GAAlleleSetArray::GAAlleleSetArray(const GAAlleleSet& s) : csz(GA_ALLELE_CHUNK), sz(1), SZ(GA_ALLELE_CHUNK), aset(new GAAlleleSet * [GA_ALLELE_CHUNK]) { aset[0] = new GAAlleleSet(s); } template GAAlleleSetArray::GAAlleleSetArray(const GAAlleleSetArray& orig) : csz(orig.csz), sz(orig.sz), SZ(orig.SZ), aset(new GAAlleleSet * [orig.SZ]) { for(unsigned int i=0; i(orig.set(i)); } template GAAlleleSetArray::~GAAlleleSetArray(){ for(unsigned int i=0; i GAAlleleSetArray& GAAlleleSetArray::operator=(const GAAlleleSetArray& orig){ if(this == &orig) return *this; unsigned int i; for(i=0; i * [SZ]; } for(i=0; i(orig.set(i)); sz = orig.sz; return *this; } // Return 0 if everything goes OK, otherwise return -1 template int GAAlleleSetArray::add(const GAAlleleSet& s){ if(sz+1 > SZ){ SZ += csz; GAAlleleSet** tmp = aset; aset = new GAAlleleSet * [SZ]; memcpy(aset, tmp, sz * sizeof(GAAlleleSet*)); delete [] tmp; } aset[sz] = new GAAlleleSet(s); sz++; return 0; } template int GAAlleleSetArray::add(unsigned int n, const T a[]){ if(sz+1 > SZ){ SZ += csz; GAAlleleSet** tmp = aset; aset = new GAAlleleSet * [SZ]; memcpy(aset, tmp, sz * sizeof(GAAlleleSet*)); delete [] tmp; } aset[sz] = new GAAlleleSet(n, a); sz++; return 0; } template int GAAlleleSetArray::add(const T& lower, const T& upper, GAAllele::BoundType lb, GAAllele::BoundType ub){ if(sz+1 > SZ){ SZ += csz; GAAlleleSet** tmp = aset; aset = new GAAlleleSet * [SZ]; memcpy(aset, tmp, sz * sizeof(GAAlleleSet*)); delete [] tmp; } aset[sz] = new GAAlleleSet(lower,upper,lb,ub); sz++; return 0; } template int GAAlleleSetArray::add(const T& lower, const T& upper, const T& increment, GAAllele::BoundType lb, GAAllele::BoundType ub){ if(sz+1 > SZ){ SZ += csz; GAAlleleSet** tmp = aset; aset = new GAAlleleSet * [SZ]; memcpy(aset, tmp, sz * sizeof(GAAlleleSet*)); delete [] tmp; } aset[sz] = new GAAlleleSet(lower,upper,increment,lb,ub); sz++; return 0; } template int GAAlleleSetArray::remove(unsigned int n){ if(n >= sz) return 1; delete aset[n]; for(unsigned int i=n; i #include #include class GAAllele { public: enum Type {ENUMERATED=1, BOUNDED=2, DISCRETIZED}; enum BoundType {NONE, INCLUSIVE, EXCLUSIVE}; }; /* ---------------------------------------------------------------------------- This object contains a set of alleles for use with a similarly typed genome. This object can be used with any type that has operator= defined for it. If you use the remove member then you must have operator== defined for it. This should be implemented as a derivative of the Array class? But I don't want that overhead at this point. Also, behaviour is not the same. The allele set uses the envelope/message structure. The core allele object is a reference-counted structure that contains all of the guts of an allele set. The outer shell, the allele set itself, is what users actually see. It defines the interface. With this setup you can create a single allele set then each genome does not have to make its own copy. And we don't have to worry about an allele set going out of scope then leaving genomes hanging (a problem if we just used a pointer to a single alleleset with no reference counting). You can link an allele set to another so that they share the same core. Use the 'link' member function (this is typically used within the GAlib to reduce the number of actual alleleset instances when cloning populations of genomes). There is no way to 'resize' an allele set. You must add to it or remove elements from it. The base template class assumes that the objects in the allele set are complex, i.e. it is not OK to do a bit-copy of each object. We should do specializations for non-complex objects (or perhaps a separate class that does bit-copies rather than logical-copies?) When you clone an allele set, the new one has its own core. Why didn't I do this as a couple of objects (enumerated set, bounded set, discretized set, etc)? I wanted to be able to have an array that uses sets of many different types. I suppose the allele set should be completely polymorphic like the rest of the GAlib objects, but for now we'll do it as a single object with multiple personalities (and a state). There is no error checking. You should check the type before you try to call any of the member functions. In particular, if you try to get the bounds on an enumerated set of one element, it will break. *** should the assignment operator check to be sure that no allele is duplicated, or is it OK to have duplicate alleles in a set? For now we allow duplicates (via either the add or assignemnt ops). ---------------------------------------------------------------------------- */ template class GAAlleleSetCore { public: GAAlleleSetCore(); GAAlleleSetCore(unsigned int n, const T array []); GAAlleleSetCore(const T& lower, const T& upper, GAAllele::BoundType lb=GAAllele::INCLUSIVE, GAAllele::BoundType ub=GAAllele::INCLUSIVE); GAAlleleSetCore(const T& lower, const T& upper, const T& increment, GAAllele::BoundType lb=GAAllele::INCLUSIVE, GAAllele::BoundType ub=GAAllele::INCLUSIVE); GAAlleleSetCore(const GAAlleleSetCore&); virtual ~GAAlleleSetCore(); GAAlleleSetCore& operator=(const GAAlleleSetCore&); GAAllele::Type type; // is this an ennumerated or bounded set? GAAllele::BoundType lowerb, upperb; // what kind of limit is the bound? unsigned int cnt; // how many objects are using us? unsigned int csz; // how big are the chunks to allocate? unsigned int sz; // number we have unsigned int SZ; // how many have we allocated? T * a; }; // mods for symantec C++ on macOS. thanks to RJG 15jul96 #if defined(THINK_C) || __powerc template int operator==(const T &, const T &); template int operator!=(const T &, const T &); #endif template class GAAlleleSet { public: GAAlleleSet() : core(0) {} GAAlleleSet(unsigned int n, const T a[]) : core(new GAAlleleSetCore(n,a)) {} GAAlleleSet(const T& lower, const T& upper, GAAllele::BoundType lb=GAAllele::INCLUSIVE, GAAllele::BoundType ub=GAAllele::INCLUSIVE) : core(new GAAlleleSetCore(lower, upper, lb, ub)) {} GAAlleleSet(const T& lower, const T& upper, const T& increment, GAAllele::BoundType lb=GAAllele::INCLUSIVE, GAAllele::BoundType ub=GAAllele::INCLUSIVE) : core(new GAAlleleSetCore(lower, upper, increment, lb, ub)) {} GAAlleleSet(const GAAlleleSet& set) : core(new GAAlleleSetCore(*(set.core))) {} virtual ~GAAlleleSet(){ if(core != 0){ core->cnt -= 1; if(core->cnt==0) delete core; } } GAAlleleSet & operator=(const GAAlleleSet& set){ if(this == &set) return *this; if(core) *core = *set.core; else core = new GAAlleleSetCore(*(set.core)); return *this; } GAAlleleSet * clone() const {return new GAAlleleSet(*this);} void link(GAAlleleSet& set); void unlink(); int size() const {return core->sz;} // only meaninful for enumerated sets int add(const T&); // only for enumerated sets int remove(const T&); // only for enumerated sets int remove(unsigned int); // only for enumerated sets T allele() const; // ok for any type of set T allele(unsigned int i) const; // only for enumerated sets T lower() const {return core->a[0];} // only for bounded sets T upper() const {return core->a[1];} T inc() const {return core->a[2];} GAAllele::BoundType lowerBoundType() const {return core->lowerb;} GAAllele::BoundType upperBoundType() const {return core->upperb;} GAAllele::Type type() const {return core->type;} #ifndef NO_STREAMS int read(istream &); int write(ostream & os) const; #endif #if defined(THINK_C) || __powerc friend operator==(const GAAlleleSet &, const GAAlleleSet &); friend operator!=(const GAAlleleSet &, const GAAlleleSet &); #elif defined(__GNUG__) && __GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ <= 3) friend int operator==(const GAAlleleSet &, const GAAlleleSet &); friend int operator!=(const GAAlleleSet &, const GAAlleleSet &); #else friend int operator==(const GAAlleleSet &, const GAAlleleSet &); friend int operator!=(const GAAlleleSet &, const GAAlleleSet &); #endif protected: GAAlleleSetCore *core; }; template class GAAlleleSetArray { public: GAAlleleSetArray(); GAAlleleSetArray(const GAAlleleSet& s); GAAlleleSetArray(const GAAlleleSetArray&); virtual ~GAAlleleSetArray(); GAAlleleSetArray& operator=(const GAAlleleSetArray&); int size() const {return sz;} const GAAlleleSet& set(unsigned int i) const {return *(aset[i]);} int add(const GAAlleleSet& s); int add(unsigned int n, const T a[]); int add(const T& lower, const T& upper, GAAllele::BoundType lb=GAAllele::INCLUSIVE, GAAllele::BoundType ub=GAAllele::INCLUSIVE); int add(const T& lower, const T& upper, const T& increment, GAAllele::BoundType lb=GAAllele::INCLUSIVE, GAAllele::BoundType ub=GAAllele::INCLUSIVE); int remove(unsigned int); protected: unsigned int csz; unsigned int sz; unsigned int SZ; GAAlleleSet **aset; }; #ifndef NO_STREAMS template ostream& operator<< (ostream& os, const GAAlleleSet & arg) { arg.write(os); return os; } template istream& operator>> (istream& is, GAAlleleSet & arg) { arg.read(is); return is; } #endif #ifdef USE_BORLAND_INST #include #endif #endif gamera-3.3.3/src/ga/GAArray.h0000644000076500000000000000611310714675676014603 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- arraytmpl.h mbwall 22apr95 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the array base class. Be careful what you put into one of these arrays! This class can be used only on objects that have: a default constructor (takes no arguments) operator= operator== operator!= In other words, use only primitive objects in this array (e.g. int, float, pointers, etc) The constructor will try to initialize to zero, but only if the type is right. We don't do any over-allocation, so resizing can be expensive. No error checking on the copy, so don't walk over end of array! TODO: should do specialization for simple types that does memcpy rather than loop ---------------------------------------------------------------------------- */ #ifndef _ga_arraytmpl_h_ #define _ga_arraytmpl_h_ template class GAArray { public: GAArray(unsigned int s) : sz(s), a(sz ? new T[sz] : 0) {for(unsigned int i=0; i & orig){sz=0; a=(T *)0; copy(orig);} GAArray & operator=(const GAArray & orig){copy(orig); return *this;} GAArray & operator=(const T array []) // no err checks! {for(unsigned int i=0; i * clone(){return new GAArray(*this);} operator const T * () const {return a;} operator T * () const {return a;} T * operator()() {return a;} const T & operator[](unsigned int i) const {return a[i];} T & operator[](unsigned int i) {return a[i];} void copy(const GAArray & orig){ size(orig.sz); for(unsigned int i=0; i & orig, unsigned int dest, unsigned int src, unsigned int length){ for(unsigned int i=0; i dest) for(unsigned int i=0; i=0; i--) tmp[i] = a[i]; delete [] a; a = tmp; return sz=n; } int equal(const GAArray & b, unsigned int dest, unsigned int src, unsigned int length) const { for(unsigned int i=0; i int operator==(const GAArray & a, const GAArray & b){ if(a.size() != b.size()) return 0; return a.equal(b,0,0,a.sz); } template int operator!=(const GAArray & a, const GAArray & b){ if(a.size() != b.size()) return 1; return a.equal(b,0,0,a.sz) ? 0 : 1; } #endif gamera-3.3.3/src/ga/GABaseGA.cpp0000644000076500000000000004267210714675676015154 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gabase.C mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved Source file for the base genetic algorithm object. ---------------------------------------------------------------------------- */ #include #include #include #include #include // gets the RCS string in for ident purposes //#define GA_DEBUG // Here we assign the default values of the GAlib default parameters. int gaDefNumGen = 250; float gaDefPConv = 0.99; int gaDefNConv = 20; float gaDefPMut = 0.01; float gaDefPCross = 0.90; int gaDefPopSize = 50; int gaDefNPop = 10; float gaDefPRepl = 0.5; int gaDefNRepl = 10; int gaDefNumOff = 2; float gaDefPMig = 0.1; int gaDefNMig = 5; int gaDefSelectScores = GAStatistics::Maximum; int gaDefMiniMaxi = 1; GABoolean gaDefDivFlag = gaFalse; GABoolean gaDefElitism = gaTrue; // Here are a few termination functions that you can use. Terminators return // gaTrue if the algorithm should finish, gaFalse otherwise. GABoolean GAGeneticAlgorithm::TerminateUponGeneration(GAGeneticAlgorithm & ga){ return(ga.generation() < ga.nGenerations() ? gaFalse : gaTrue); } // If we are maximizing, then terminate when the convergence has exceeded the // specified convergence. If we are minimizing, then terminate when the // convergence has dropped below the specified convergence. GABoolean GAGeneticAlgorithm::TerminateUponConvergence(GAGeneticAlgorithm & ga){ GABoolean val = gaFalse; if(ga.minimaxi() == GAGeneticAlgorithm::MINIMIZE) { if(ga.convergence() == 0 || ga.convergence() > ga.pConvergence()) val = gaFalse; else val = gaTrue; } else { if(ga.convergence() < ga.pConvergence()) val = gaFalse; else val = gaTrue; } return val; } // Use the ratio between the minimum and maximum to determine whether the // population has converged. This method will not work if the values cross // zero! // Note that this is significantly different than the definition (and the // bug-laden implementation) that was in version of GAlib prior to 2.4.5. // // For historical purposes, here is the old definition of this method: // // Use the ratio of the population mean divided by the population maximum to // determine whether the population has converged. If we are maximizing, then // check to see if the ratio exceeds the convergence. If we are minimizing, // then check to see if the ratio has dropped below the convergence. GABoolean GAGeneticAlgorithm::TerminateUponPopConvergence(GAGeneticAlgorithm & ga){ GABoolean val = gaFalse; if(ga.statistics().current(GAStatistics::Maximum) == 0) { return val; } float ratio = ga.statistics().current(GAStatistics::Minimum) / ga.statistics().current(GAStatistics::Maximum); if(ga.minimaxi() == GAGeneticAlgorithm::MINIMIZE) { if(ratio <= ga.pConvergence()) val = gaTrue; else val = gaFalse; } else { if(ratio >= ga.pConvergence()) val = gaTrue; else val = gaFalse; } return val; } GAParameterList& GAGeneticAlgorithm::registerDefaultParameters(GAParameterList& p) { p.add(gaNminimaxi, gaSNminimaxi, GAParameter::INT, &gaDefMiniMaxi); p.add(gaNnGenerations, gaSNnGenerations, GAParameter::INT, &gaDefNumGen); p.add(gaNnConvergence, gaSNnConvergence, GAParameter::INT, &gaDefNConv); p.add(gaNpConvergence, gaSNpConvergence, GAParameter::FLOAT, &gaDefPConv); p.add(gaNpCrossover, gaSNpCrossover, GAParameter::FLOAT, &gaDefPCross); p.add(gaNpMutation, gaSNpMutation, GAParameter::FLOAT, &gaDefPMut); p.add(gaNpopulationSize, gaSNpopulationSize, GAParameter::INT, &gaDefPopSize); p.add(gaNnBestGenomes, gaSNnBestGenomes, GAParameter::INT, &gaDefNumBestGenomes); p.add(gaNscoreFrequency, gaSNscoreFrequency, GAParameter::INT, &gaDefScoreFrequency1); p.add(gaNflushFrequency, gaSNflushFrequency, GAParameter::INT, &gaDefFlushFrequency); p.add(gaNrecordDiversity, gaSNrecordDiversity, GAParameter::INT, &gaDefDivFlag); p.add(gaNscoreFilename, gaSNscoreFilename, GAParameter::STRING, gaDefScoreFilename); p.add(gaNselectScores, gaSNselectScores, GAParameter::INT, &gaDefSelectScores); return p; } // When we create a GA, we stuff the parameters with the basics that will be // needed by most genetic algorithms - num generations, p convergence, etc. GAGeneticAlgorithm::GAGeneticAlgorithm(const GAGenome& g) : stats(), params() { pop = new GAPopulation(g, gaDefPopSize); pop->geneticAlgorithm(*this); ud = (void *)0; cf = GAGeneticAlgorithm::DEFAULT_TERMINATOR; minmax = gaDefMiniMaxi; params.add(gaNminimaxi, gaSNminimaxi, GAParameter::INT, &minmax); ngen = gaDefNumGen; params.add(gaNnGenerations, gaSNnGenerations, GAParameter::INT, &ngen); nconv = gaDefNConv; stats.nConvergence(nconv); params.add(gaNnConvergence, gaSNnConvergence, GAParameter::INT, &nconv); pconv = gaDefPConv; params.add(gaNpConvergence, gaSNpConvergence, GAParameter::FLOAT, &pconv); pcross = gaDefPCross; params.add(gaNpCrossover, gaSNpCrossover, GAParameter::FLOAT, &pcross); pmut = gaDefPMut; params.add(gaNpMutation, gaSNpMutation, GAParameter::FLOAT, &pmut); int psize = pop->size(); params.add(gaNpopulationSize, gaSNpopulationSize, GAParameter::INT, &psize); stats.scoreFrequency(gaDefScoreFrequency1); params.add(gaNscoreFrequency, gaSNscoreFrequency, GAParameter::INT, &gaDefScoreFrequency1); stats.flushFrequency(gaDefFlushFrequency); params.add(gaNflushFrequency, gaSNflushFrequency, GAParameter::INT, &gaDefFlushFrequency); stats.recordDiversity(gaDefDivFlag); params.add(gaNrecordDiversity, gaSNrecordDiversity, GAParameter::INT, &gaDefDivFlag); stats.scoreFilename(gaDefScoreFilename); params.add(gaNscoreFilename, gaSNscoreFilename, GAParameter::STRING, gaDefScoreFilename); stats.selectScores(gaDefSelectScores); params.add(gaNselectScores, gaSNselectScores, GAParameter::INT, &gaDefSelectScores); stats.nBestGenomes(g, gaDefNumBestGenomes); params.add(gaNnBestGenomes, gaSNnBestGenomes, GAParameter::INT, &gaDefNumBestGenomes); scross = g.sexual(); across = g.asexual(); } GAGeneticAlgorithm::GAGeneticAlgorithm(const GAPopulation& p) : stats(), params() { pop = new GAPopulation(p); pop->geneticAlgorithm(*this); ud = (void *)0; cf = GAGeneticAlgorithm::DEFAULT_TERMINATOR; minmax = gaDefMiniMaxi; params.add(gaNminimaxi, gaSNminimaxi, GAParameter::INT, &minmax); ngen = gaDefNumGen; params.add(gaNnGenerations, gaSNnGenerations, GAParameter::INT, &ngen); nconv = gaDefNConv; stats.nConvergence(nconv); params.add(gaNnConvergence, gaSNnConvergence, GAParameter::INT, &nconv); pconv = gaDefPConv; params.add(gaNpConvergence, gaSNpConvergence, GAParameter::FLOAT, &pconv); pcross = gaDefPCross; params.add(gaNpCrossover, gaSNpCrossover, GAParameter::FLOAT, &pcross); pmut = gaDefPMut; params.add(gaNpMutation, gaSNpMutation, GAParameter::FLOAT, &pmut); int psize = pop->size(); params.add(gaNpopulationSize, gaSNpopulationSize, GAParameter::INT, &psize); stats.scoreFrequency(gaDefScoreFrequency1); params.add(gaNscoreFrequency, gaSNscoreFrequency, GAParameter::INT, &gaDefScoreFrequency1); stats.flushFrequency(gaDefFlushFrequency); params.add(gaNflushFrequency, gaSNflushFrequency, GAParameter::INT, &gaDefFlushFrequency); stats.recordDiversity(gaDefDivFlag); params.add(gaNrecordDiversity, gaSNrecordDiversity, GAParameter::INT, &gaDefDivFlag); stats.scoreFilename(gaDefScoreFilename); params.add(gaNscoreFilename, gaSNscoreFilename, GAParameter::STRING, gaDefScoreFilename); stats.selectScores(gaDefSelectScores); params.add(gaNselectScores, gaSNselectScores, GAParameter::INT, &gaDefSelectScores); stats.nBestGenomes(p.individual(0), gaDefNumBestGenomes); params.add(gaNnBestGenomes, gaSNnBestGenomes, GAParameter::INT, &gaDefNumBestGenomes); scross = p.individual(0).sexual(); across = p.individual(0).asexual(); } GAGeneticAlgorithm::GAGeneticAlgorithm(const GAGeneticAlgorithm& ga) : stats(ga.stats), params(ga.params){ pop = ga.pop->clone(); pop->geneticAlgorithm(*this); cf = ga.cf; ud = ga.ud; ngen = ga.ngen; nconv = ga.nconv; pconv = ga.pconv; pcross = ga.pcross; pmut = ga.pmut; minmax = ga.minmax; scross = ga.scross; across = ga.across; } GAGeneticAlgorithm::~GAGeneticAlgorithm() { delete pop; } void GAGeneticAlgorithm::copy(const GAGeneticAlgorithm& ga) { if(pop) pop->copy(*(ga.pop)); else pop = ga.pop->clone(); pop->geneticAlgorithm(*this); stats = ga.stats; params = ga.params; cf = ga.cf; ud = ga.ud; ngen = ga.ngen; nconv = ga.nconv; pconv = ga.pconv; pcross = ga.pcross; pmut = ga.pmut; minmax = ga.minmax; scross = ga.scross; across = ga.across; } const GAParameterList& GAGeneticAlgorithm::parameters(const GAParameterList& list){ for(int i=0; isize(); status = 0; } else if(strcmp(name, gaNminimaxi) == 0 || strcmp(name, gaSNminimaxi) == 0){ *((int*)value) = minmax; status = 0; } else if(strcmp(name, gaNnGenerations) == 0 || strcmp(name, gaSNnGenerations) == 0){ *((int*)value) = ngen; status = 0; } else if(strcmp(name, gaNpConvergence) == 0 || strcmp(name, gaSNpConvergence) == 0){ *((float*)value) = pconv; status = 0; } else if(strcmp(name, gaNnConvergence) == 0 || strcmp(name, gaSNnConvergence) == 0){ *((int*)value) = nconv; status = 0; } else if(strcmp(name, gaNpCrossover) == 0 || strcmp(name, gaSNpCrossover) == 0){ *((float*)value) = pcross; status = 0; } else if(strcmp(name, gaNpMutation) == 0 || strcmp(name, gaSNpMutation) == 0){ *((float*)value) = pmut; status = 0; } else if(strcmp(name,gaNscoreFrequency) == 0 || strcmp(name,gaSNscoreFrequency) == 0){ *((int*)value) = stats.scoreFrequency(); status = 0; } else if(strcmp(name,gaNflushFrequency) == 0 || strcmp(name,gaSNflushFrequency) == 0){ *((int*)value) = stats.flushFrequency(); status = 0; } else if(strcmp(name,gaNrecordDiversity) == 0 || strcmp(name,gaSNrecordDiversity) == 0){ *((int*)value) = stats.recordDiversity(); status = 0; } else if(strcmp(name,gaNselectScores) == 0 || strcmp(name,gaSNselectScores)==0){ *((int*)value) = stats.selectScores(); status = 0; } else if(strcmp(name,gaNscoreFilename) == 0 || strcmp(name,gaSNscoreFilename) == 0){ *((const char**)value) = stats.scoreFilename(); status = 0; } return status; } void GAGeneticAlgorithm::objectiveFunction(GAGenome::Evaluator f){ for(int i=0; isize(); i++) pop->individual(i).evaluator(f); } void GAGeneticAlgorithm::objectiveData(const GAEvalData& v){ for(int i=0; isize(); i++) pop->individual(i).evalData(v); } const GAPopulation& GAGeneticAlgorithm::population(const GAPopulation& p) { if(p.size() < 1) { GAErr(GA_LOC, className(), "population", gaErrNoIndividuals); return *pop; } pop->copy(p); pop->geneticAlgorithm(*this); return *pop; } int GAGeneticAlgorithm::populationSize(unsigned int value){ unsigned int ps = value; params.set(gaNpopulationSize, value); return pop->size(ps); } int GAGeneticAlgorithm::minimaxi(int m) { if(m == MINIMIZE) pop->order(GAPopulation::LOW_IS_BEST); else pop->order(GAPopulation::HIGH_IS_BEST); params.set(gaNminimaxi, m); minmax = (m == MINIMIZE ? MINIMIZE : MAXIMIZE); return minmax; } gamera-3.3.3/src/ga/GABaseGA.h0000644000076500000000000002354310714675676014615 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gabase.h mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved Header for the base genetic algorithm class. ---------------------------------------------------------------------------- */ #ifndef _ga_gabase_h_ #define _ga_gabase_h_ #include #include #include #include #include #include #include #include // When specifying parameters for a GAlib object, you can use the fullname (the // name used in parameters data files) or the short name (the name typically // used on the command line). When specifying parameters in your code you can // use a string, or use the predefined macros below (kind of like using the // resource/class names in Motif for you Xt jocks). #define gaNnGenerations "number_of_generations" #define gaSNnGenerations "ngen" #define gaNpConvergence "convergence_percentage" #define gaSNpConvergence "pconv" #define gaNnConvergence "generations_to_convergence" #define gaSNnConvergence "nconv" #define gaNpCrossover "crossover_probability" #define gaSNpCrossover "pcross" #define gaNpMutation "mutation_probability" #define gaSNpMutation "pmut" #define gaNpopulationSize "population_size" #define gaSNpopulationSize "popsize" #define gaNnPopulations "number_of_populations" #define gaSNnPopulations "npop" #define gaNpReplacement "replacement_percentage" #define gaSNpReplacement "prepl" #define gaNnReplacement "replacement_number" #define gaSNnReplacement "nrepl" #define gaNnBestGenomes "number_of_best" #define gaSNnBestGenomes "nbest" #define gaNscoreFrequency "score_frequency" #define gaSNscoreFrequency "sfreq" #define gaNflushFrequency "flush_frequency" #define gaSNflushFrequency "ffreq" #define gaNscoreFilename "score_filename" #define gaSNscoreFilename "sfile" #define gaNselectScores "select_scores" #define gaSNselectScores "sscores" #define gaNelitism "elitism" #define gaSNelitism "el" #define gaNnOffspring "number_of_offspring" #define gaSNnOffspring "noffspr" #define gaNrecordDiversity "record_diversity" #define gaSNrecordDiversity "recdiv" #define gaNpMigration "migration_percentage" #define gaSNpMigration "pmig" #define gaNnMigration "migration_number" #define gaSNnMigration "nmig" #define gaNminimaxi "minimaxi" #define gaSNminimaxi "mm" extern int gaDefNumGen; extern float gaDefPConv; extern int gaDefNConv; extern float gaDefPMut; extern float gaDefPCross; extern int gaDefPopSize; extern int gaDefNPop; extern float gaDefPRepl; extern int gaDefNRepl; extern int gaDefNumOff; extern float gaDefPMig; extern int gaDefNMig; extern int gaDefSelectScores; extern int gaDefMiniMaxi; extern GABoolean gaDefDivFlag; extern GABoolean gaDefElitism; /* ---------------------------------------------------------------------------- The base GA class is virtual - it defines the core data elements and parts of the interface that are common to all genetic algorithms (as defined in GAlib, that is). initialize Undefined for the base class. The initialization routine typically calls the population initializer (which typically calls the genome initializers). It should also reset the statistics. step Evolve by one generation. 'generation' can be defined different ways for different genetic algorithms, but in the traditional formulation a generation mean creation of a new population (or portion thereof). done Calls the completion measure routine to tell whether or not the GA is done. evolve This method is provided as a convenience so that you don't have to increment the GA generation-by-generation by hand. If you do decide to do it by hand, be sure that you initialize before you start evolving! ---------------------------------------------------------------------------- */ class GAGeneticAlgorithm : public GAID { public: GADefineIdentity("GAIncrementalGA", GAID::BaseGA); typedef GABoolean (*Terminator)(GAGeneticAlgorithm & ga); enum { MINIMIZE=-1, MAXIMIZE=1 }; static GAParameterList& registerDefaultParameters(GAParameterList&); static GABoolean TerminateUponGeneration(GAGeneticAlgorithm &); static GABoolean TerminateUponConvergence(GAGeneticAlgorithm &); static GABoolean TerminateUponPopConvergence(GAGeneticAlgorithm &); public: GAGeneticAlgorithm(const GAGenome&); GAGeneticAlgorithm(const GAPopulation&); GAGeneticAlgorithm(const GAGeneticAlgorithm&); virtual ~GAGeneticAlgorithm(); virtual void copy(const GAGeneticAlgorithm&); GABoolean done(){ return (*cf)(*this); } virtual void initialize(unsigned int seed=0) =0; virtual void step() =0; virtual void evolve(unsigned int seed=0){ initialize(seed); while(!done()){step();} if(stats.flushFrequency() > 0) stats.flushScores(); } #ifndef NO_STREAMS virtual int write(const char*) const {return 0;} virtual int write(ostream&) const {return 0;} virtual int read(const char*){return 0;} virtual int read(istream&){return 0;} #endif void * userData() const {return ud;} void * userData(void * d){return ud=d;} Terminator terminator() const {return cf;} Terminator terminator(Terminator f){return cf=f;} const GAParameterList& parameters() const { return params; } const GAParameterList& parameters(const GAParameterList&); const GAParameterList& parameters(int&, char **, GABoolean flag=gaFalse); #ifndef NO_STREAMS const GAParameterList& parameters(const char* filename, GABoolean f=gaFalse); const GAParameterList& parameters(istream&, GABoolean flag=gaFalse); #endif virtual int get(const char*, void*) const; virtual int setptr(const char*, const void*); int set(const char* s, int v) { return setptr(s, (void*)&v); } int set(const char* s, unsigned int v) { return setptr(s, (void*)&v); } int set(const char* s, char v) { return setptr(s, (void*)&v); } int set(const char* s, const char* v) { return setptr(s, (void*)v); } int set(const char* s, const void* v) { return setptr(s, v); } int set(const char* s, double v); virtual int minimaxi() const {return minmax;} virtual int minimaxi(int m); int minimize() {return minimaxi(MINIMIZE);} int maximize() {return minimaxi(MAXIMIZE);} int nGenerations() const {return ngen;} int nGenerations(unsigned int n) {params.set(gaNnGenerations, n); return ngen = n;} int nConvergence() const {return nconv;} int nConvergence(unsigned int n) {params.set(gaNnConvergence, n); return nconv = stats.nConvergence(n);} float pConvergence() const {return pconv;} float pConvergence(float p) {params.set(gaNpConvergence, p); return pconv = p;} float pCrossover() const {return pcross;} float pCrossover(float p) {params.set(gaNpCrossover, p); return pcross = p;} float pMutation() const {return pmut;} float pMutation(float p) {params.set(gaNpMutation, p); return pmut = p;} GAGenome::SexualCrossover crossover(GAGenome::SexualCrossover f) {return scross=f;} GAGenome::SexualCrossover sexual() const {return scross;} GAGenome::AsexualCrossover crossover(GAGenome::AsexualCrossover f) {return across=f;} GAGenome::AsexualCrossover asexual() const {return across;} const GAStatistics & statistics() const {return stats;} float convergence() const {return stats.convergence();} int generation() const {return stats.generation();} void flushScores() {if(stats.flushFrequency() > 0) stats.flushScores();} int scoreFrequency() const {return stats.scoreFrequency();} int scoreFrequency(unsigned int x) {params.set(gaNscoreFrequency, x); return stats.scoreFrequency(x);} int flushFrequency() const {return stats.flushFrequency();} int flushFrequency(unsigned int x) {params.set(gaNflushFrequency, x); return stats.flushFrequency(x);} const char* scoreFilename() const {return stats.scoreFilename();} const char* scoreFilename(const char* fn) {params.set(gaNscoreFilename, fn); return stats.scoreFilename(fn);} int selectScores(){return stats.selectScores();} int selectScores(int w) {params.set(gaNselectScores, w); return stats.selectScores(w);} GABoolean recordDiversity() const {return stats.recordDiversity();} GABoolean recordDiversity(GABoolean f) {params.set(gaNrecordDiversity, (int)f); return stats.recordDiversity(f);} virtual const GAPopulation& population() const {return *pop;} virtual const GAPopulation& population(const GAPopulation&); virtual int populationSize() const {return pop->size();} virtual int populationSize(unsigned int n); virtual int nBestGenomes() const {return stats.nBestGenomes();} virtual int nBestGenomes(unsigned int n) { params.set(gaNnBestGenomes, n); return stats.nBestGenomes(pop->individual(0), n); } virtual GAScalingScheme& scaling() const {return pop->scaling();} virtual GAScalingScheme& scaling(const GAScalingScheme & s) {return pop->scaling(s);} virtual GASelectionScheme& selector() const {return pop->selector(); } virtual GASelectionScheme& selector(const GASelectionScheme& s) {return pop->selector(s);} virtual void objectiveFunction(GAGenome::Evaluator f); virtual void objectiveData(const GAEvalData& v); protected: GAStatistics stats; GAParameterList params; GAPopulation *pop; Terminator cf; // function for determining done-ness void * ud; // pointer to user data structure unsigned int ngen; unsigned int nconv; float pconv; float pcross; float pmut; int minmax; GAGenome::SexualCrossover scross; // sexual crossover to use GAGenome::AsexualCrossover across; // asexual crossover to use }; #endif gamera-3.3.3/src/ga/GABin2DecGenome.cpp0000644000076500000000000002132410714675676016422 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- bin2dec.C mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the binary-to-decimal genome. This is the phenotype for converting binary strings to decimal values. There are limits to the size of the numbers you can use (ie you're limited to the number of bits that can represent a float - see the converters file for more information). ---------------------------------------------------------------------------- */ #include #include #include #include #include #include /* ---------------------------------------------------------------------------- Phenotype class definitions ---------------------------------------------------------------------------- */ #define GA_B2D_CHUNKSIZE 20 GABin2DecPhenotypeCore::GABin2DecPhenotypeCore() : csz(GA_B2D_CHUNKSIZE), n(0), N(0), sz(0) { nbits = oset = 0; minval = maxval = 0; cnt = 1; } GABin2DecPhenotypeCore:: GABin2DecPhenotypeCore(const GABin2DecPhenotypeCore& p) : csz(p.csz), n(p.n), N(p.N), sz(p.sz) { nbits = new unsigned short[N]; oset = new unsigned short[N]; minval = new float[N]; maxval = new float[N]; memcpy(nbits, p.nbits, n*sizeof(unsigned short)); memcpy(oset, p.oset, n*sizeof(unsigned short)); memcpy(minval, p.minval, n*sizeof(float)); memcpy(maxval, p.maxval, n*sizeof(float)); cnt = 1; } GABin2DecPhenotypeCore::~GABin2DecPhenotypeCore(){ if(cnt > 0) GAErr(GA_LOC, "GABin2DecPhenotypeCore", "destructor", gaErrRefsRemain); delete [] nbits; delete [] oset; delete [] minval; delete [] maxval; } GABin2DecPhenotypeCore& GABin2DecPhenotypeCore::operator=(const GABin2DecPhenotypeCore& p){ if(&p == this) return *this; delete [] nbits; delete [] oset; delete [] minval; delete [] maxval; n = p.n; sz = p.sz; N = p.N; csz = p.csz; nbits = new unsigned short[N]; oset = new unsigned short[N]; minval = new float[N]; maxval = new float[N]; memcpy(nbits, p.nbits, n*sizeof(unsigned short)); memcpy(oset, p.oset, n*sizeof(unsigned short)); memcpy(minval, p.minval, n*sizeof(float)); memcpy(maxval, p.maxval, n*sizeof(float)); return *this; } // Add another phenotype to this phenotype object. If needed, we allocate more // space, otherwise just tag the new on then end. We allocate space in chunks // so we don't spend too much time doing memory allocation stuff. void GABin2DecPhenotype::add(unsigned int nb, float min, float max){ if(core->n + 1 > core->N){ core->N += core->csz; unsigned short *nbtmp = core->nbits; core->nbits = new unsigned short[core->N]; memcpy(core->nbits, nbtmp, core->n*sizeof(unsigned short)); delete [] nbtmp; unsigned short *ostmp = core->oset; core->oset = new unsigned short[core->N]; memcpy(core->oset, ostmp, core->n*sizeof(unsigned short)); delete [] ostmp; float *mintmp = core->minval; core->minval = new float[core->N]; memcpy(core->minval, mintmp, core->n*sizeof(float)); delete [] mintmp; float *maxtmp = core->maxval; core->maxval = new float[core->N]; memcpy(core->maxval, maxtmp, core->n*sizeof(float)); delete [] maxtmp; } core->nbits[core->n] = nb; if(core->n > 0) core->oset[core->n] = core->oset[core->n-1] + core->nbits[core->n-1]; else core->oset[core->n] = 0; core->minval[core->n] = min; core->maxval[core->n] = max; core->n++; core->sz += nb; } void GABin2DecPhenotype::remove(unsigned int x){ if(x >= core->n) return; memmove(&(core->nbits[x]), &(core->nbits[x+1]), (core->n - x - 1)*sizeof(unsigned short)); memmove(&(core->oset[x]), &(core->oset[x+1]), (core->n - x - 1)*sizeof(unsigned short)); memmove(&(core->minval[x]), &(core->minval[x+1]), (core->n - x - 1)*sizeof(float)); memmove(&(core->maxval[x]), &(core->maxval[x+1]), (core->n - x - 1)*sizeof(float)); core->n -= 1; } int GABin2DecPhenotype::equal(const GABin2DecPhenotype & b) const { if(core->sz != b.core->sz || core->n != b.core->n) return gaFalse; if(memcmp(core->nbits,b.core->nbits,core->n*sizeof(unsigned short))!=0 || memcmp(core->oset, b.core->oset, core->n*sizeof(unsigned short))!=0 || memcmp(core->minval, b.core->minval, core->n*sizeof(float)) != 0 || memcmp(core->maxval, b.core->maxval, core->n*sizeof(float))) return gaFalse; return(gaTrue); } /* ---------------------------------------------------------------------------- Genome class definition ---------------------------------------------------------------------------- */ void GABin2DecGenome::copy(const GAGenome & orig) { if(&orig == this) return; const GABin2DecGenome* c = DYN_CAST(const GABin2DecGenome*, &orig); if(c) { GA1DBinaryStringGenome::copy(*c); encode = c->encode; decode = c->decode; if(ptype) *ptype = *(c->ptype); else ptype = new GABin2DecPhenotype(*(c->ptype)); } } // We shouldn't have to worry about our superclass's data members for the // attributes part here, but there is no 'copy attributes' function, so we // end up doing it. bummer. GAGenome * GABin2DecGenome::clone(GAGenome::CloneMethod flag) const { GABin2DecGenome *cpy = new GABin2DecGenome(*ptype); if(flag == CONTENTS){ cpy->copy(*this); } else{ cpy->GAGenome::copy(*this); cpy->maxX = maxX; cpy->minX = minX; *(cpy->ptype) = *ptype; cpy->encode = encode; cpy->decode = decode; } return cpy; } // The phenotype does reference counting, so its ok to keep our own copy of // the phenotype. So all we have to do here is copy the one that is passed // to us, then modify the bit string to accomodate the new mapping. const GABin2DecPhenotype & GABin2DecGenome::phenotypes(const GABin2DecPhenotype & p) { *ptype = p; GA1DBinaryStringGenome::resize(p.size()); return *ptype; } // We access the data string directly here. This could be dangerous (if the // bitstream ever changes on us it will affect the way this method sees the // data string). // Eventually we may need to cache the decimal values in an array of floats, // but for now we call the converter routine every time each phenotype is // requested. float GABin2DecGenome::phenotype(unsigned int n) const { if(n >= ptype->nPhenotypes()){ GAErr(GA_LOC, className(), "phenotype", gaErrBadPhenotypeID); return(0.0); } float val=0.0; decode(val, &(data[ptype->offset(n)]), ptype->length(n), ptype->min(n), ptype->max(n)); return val; } // Set the bits of the binary string based on the decimal value that is passed // to us. Notice that the number you pass may or may not be set properly. It // depends on the resolution defined in the phenotype. If you didn't define // enough resolution, then there may be no way to represent the number. // We round off to the closest representable value, then return the number // that we actually entered (the rounded value). // *** this is dangerous! we're accessing the superclass' data representation // directly, so if the representation changes to a bit stream, this will break. // If someone tries to set the phenotype beyond the bounds, we post an error // then set the bits to the closer bound. float GABin2DecGenome::phenotype(unsigned int n, float val) { if(n >= ptype->nPhenotypes()){ GAErr(GA_LOC, className(), "phenotype", gaErrBadPhenotypeID); return val; } if(val < ptype->min(n) || val > ptype->max(n)){ GAErr(GA_LOC, className(), "phenotype", gaErrBadPhenotypeValue); val = ((val < ptype->min(n)) ? ptype->min(n) : ptype->max(n)); } encode(val, &(data[ptype->offset(n)]), ptype->length(n), ptype->min(n), ptype->max(n)); return val; } #ifndef NO_STREAMS // Read the incoming data as a list of phenotype values. It would be nice to // do this either as binary or decimal read, but oh well... not much need. int GABin2DecGenome::read(istream & is) { float value; for(unsigned int i=0; i> value; if(is.fail() || is.eof()) return 1; phenotype(i, value); } return 0; } int GABin2DecGenome::write(ostream & os) const { for(unsigned int i=0; i #include #ifdef max #undef max #endif #ifdef min #undef min #endif class GABin2DecPhenotypeCore { public: GABin2DecPhenotypeCore(); GABin2DecPhenotypeCore(const GABin2DecPhenotypeCore&); virtual ~GABin2DecPhenotypeCore(); GABin2DecPhenotypeCore& operator=(const GABin2DecPhenotypeCore&); unsigned int cnt; // how many references to us? unsigned int csz; // how big are the chunks we allocate? unsigned int n, N; // how many phenotypes do we have? (real,alloc) unsigned short *nbits; // number of bits that max/min get mapped into unsigned short *oset; // offset of the nth gene float *minval, *maxval; // min, max value of phenotype elem unsigned int sz; // total number of bits required }; class GABin2DecPhenotype { public: GABin2DecPhenotype() : core(new GABin2DecPhenotypeCore) {} GABin2DecPhenotype(const GABin2DecPhenotype& p) : core(new GABin2DecPhenotypeCore(*(p.core))) {} virtual ~GABin2DecPhenotype(){core->cnt -= 1; if(core->cnt==0){delete core;}} GABin2DecPhenotype & operator=(const GABin2DecPhenotype& p){ if(&p != this) *core = *(p.core); return *this; } GABin2DecPhenotype * clone() const {return new GABin2DecPhenotype(*this);} void link(GABin2DecPhenotype& p){ core->cnt -= 1; if(core->cnt == 0) delete core; core=p.core; core->cnt += 1; } void add(unsigned int nbits, float min, float max); void remove(unsigned int which); unsigned int size() const {return core->sz;} unsigned int nPhenotypes() const {return core->n;} float min(int which) const {return core->minval[which];} float max(int which) const {return core->maxval[which];} int length(int which) const {return core->nbits[which];} int offset(int which) const {return core->oset[which];} int equal(const GABin2DecPhenotype&) const; protected: GABin2DecPhenotypeCore *core; }; inline int operator==(const GABin2DecPhenotype& a, const GABin2DecPhenotype& b) { return a.equal(b); } inline int operator!=(const GABin2DecPhenotype& a, const GABin2DecPhenotype& b) { return (a.equal(b) ? 0 : 1); } /* ---------------------------------------------------------------------------- The phenotype does reference counting, so we can make a copy of it for our own use and we don't have to worry about extra overhead. ---------------------------------------------------------------------------- */ class GABin2DecGenome : public GA1DBinaryStringGenome { public: GADefineIdentity("GABin2DecGenome", GAID::Bin2DecGenome); public: GABin2DecGenome(const GABin2DecPhenotype & p, GAGenome::Evaluator f=(GAGenome::Evaluator)0, void * u=(void *)0) : GA1DBinaryStringGenome(p.size(), f, u), ptype(new GABin2DecPhenotype(p)){ comparator(DEFAULT_BIN2DEC_COMPARATOR); encoder(DEFAULT_BIN2DEC_ENCODER); decoder(DEFAULT_BIN2DEC_DECODER); } GABin2DecGenome(const GABin2DecGenome & orig) : GA1DBinaryStringGenome(orig.sz) {ptype=(GABin2DecPhenotype *)0; copy(orig);} GABin2DecGenome& operator=(const GAGenome& arg) {copy(arg); return *this;} virtual ~GABin2DecGenome(){delete ptype;} virtual GAGenome *clone(GAGenome::CloneMethod flag=CONTENTS) const ; virtual void copy(const GAGenome &); #ifndef NO_STREAMS virtual int read (istream & is=cin); virtual int write (ostream & os=cout) const; #endif virtual int equal(const GAGenome &) const; virtual int notequal(const GAGenome &) const; const GABin2DecPhenotype & phenotypes(const GABin2DecPhenotype & p); const GABin2DecPhenotype & phenotypes() const {return *ptype;} int nPhenotypes() const {return ptype->nPhenotypes();} float phenotype(unsigned int n, float val); float phenotype(unsigned int n) const; void encoder(GABinaryEncoder e){encode = e; _evaluated = gaFalse;} void decoder(GABinaryDecoder d){decode = d; _evaluated = gaFalse;} protected: GABin2DecPhenotype * ptype; GABinaryEncoder encode; // function we use to encode the bits GABinaryDecoder decode; // function we use to decode the bits }; #endif gamera-3.3.3/src/ga/gabincvt.cpp0000644000076500000000000002426610714675676015456 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- bincvt.C mbwall 29jun95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Binary-to-decimal converters. ---------------------------------------------------------------------------- */ #include #include #include #include #include #include // These numbers are machine-specific and are a function of the word length of // the OS you are running. The binary string cannot be too long or else we // can't represent it. And we don't do any special multi-word handling, so we // limit the number of bits that our converters can work on. #ifndef BITBASE #define BITBASE long int #endif // Define the number of bits based on the builtin type #define _GA_MAX_BITS (int)(BITS_IN_WORD*sizeof(BITBASE)) // These are publicly available, but we don't want to advertise them. They are // mostly just for testing purposes. These are unscaled versions of the // converter routines. int GABinaryEncode(unsigned BITBASE, GABit* bits, unsigned int); int GABinaryDecode(float&, const GABit* bits, unsigned int); // If you write your own encoder/decoder you may want to use these to verify // the parameters. int GACheckEncoding(float&,unsigned int&,float,float,unsigned BITBASE &); int GACheckDecoding(unsigned int&); // This stuff is private. extern char _gaerrbuf1[]; extern char _gaerrbuf2[]; static int _GAEncodeBase(unsigned int, unsigned BITBASE, GABit *, int, int); /* ---------------------------------------------------------------------------- Utilities to check the values for proper sizes. ---------------------------------------------------------------------------- */ int GACheckDecoding(unsigned int& nbits) { if((int)nbits >= _GA_MAX_BITS){ sprintf(_gaerrbuf1,"string is %d bits, max is %d", nbits, _GA_MAX_BITS-1); GAErr(GA_LOC, "GACheckDecoding", gaErrBinStrTooLong, _gaerrbuf1); nbits = _GA_MAX_BITS-1; return 1; } return 0; } int GACheckEncoding(float& val, unsigned int& nbits, float minval, float maxval, unsigned BITBASE & nintervals) { int status = 0; if((int)nbits >= _GA_MAX_BITS){ sprintf(_gaerrbuf1,"string is %d bits, max is %d", nbits, _GA_MAX_BITS-1); GAErr(GA_LOC, "GACheckEncoding", gaErrBinStrTooLong, _gaerrbuf1); nbits = _GA_MAX_BITS-1; status = 1; } nintervals = 1; // this type limits the number of bits we can do nintervals <<= nbits; nintervals--; double interval = (maxval-minval)/(double)nintervals; double actual = (val-minval)/interval; // how many intervals we need nintervals = (unsigned BITBASE)actual; // make it an integer actual = minval+(double)nintervals*interval; // get value we can represent if(actual != val){ sprintf(_gaerrbuf1,"desired: %f\tactual: %f\tdiscretization: %f", val, actual, interval); sprintf(_gaerrbuf2," nbits: %d\t\tmin: %f\t\tmax: %f", nbits, minval, maxval); GAErr(GA_LOC, "GACheckEncoding", gaErrDataLost, _gaerrbuf1, _gaerrbuf2); val = (float)actual; status = 1; } return status; } /* ---------------------------------------------------------------------------- Utility routine to encode bits of a decimal number. This routine recursively loops through the decimal value and grabs the remainder (modulo the base) and sticks the result into each 'bit' (if base is 2 then they're bits, otherwise they're the equivalent for whatever base you're doing). This will only do unsigned integers. ---------------------------------------------------------------------------- */ static int _GAEncodeBase(unsigned int base, unsigned BITBASE val, GABit * binstr, int n, int c) { int status = 0; if(c < 0) return 1; // if this happens we should post an error // it means we didn't get a perfect encoding binstr[c] = (GABit)val % base; unsigned BITBASE quotient = val / base; if(quotient) status = _GAEncodeBase(base, quotient, binstr, n, c-1); return status; } /* ---------------------------------------------------------------------------- Convert the string of bits into a decimal value. This routine does no scaling - the result that it generates will be a power of two. You must specify a number of bits so that we know how many bits to consider. If you specify too many bits, then we reset to the max we can handle and do the conversion using those bits. We return 1 if there was a problem, otherwise 0. ---------------------------------------------------------------------------- */ int GABinaryDecode(float& result, const GABit* bits, unsigned int nbits) { if(bits == (GABit *)0 || nbits == 0){ result = 0.0; return 1; } int status = GACheckDecoding(nbits); unsigned BITBASE maxint=1; float sum=0.0; for(int i=nbits-1; i>(-1); i--){ // most significant bit first // for(int i=0; i(-1); i--){ // 0th bit is most significant // for(int i=0; i>j); unsigned BITBASE maxint = 1<>1); for(unsigned int i=0; i // The encoder converts a decimal value into a binary string. The decoder // converts a string of bits into a decimal value. Both types of functions // return an error code to indicate whether or not the conversion was // successful. The caller must make sure that sufficient space is available // for the arguments. The encoder will set the value to whatever it was able // to encode, so be sure to check the return status and make your value such // that you can check it if you get a non-zero return code. typedef int (*GABinaryEncoder)(float& value, GABit* bits, unsigned int nbits, float min, float max); typedef int (*GABinaryDecoder)(float& value, const GABit* bits, unsigned int nbits, float min, float max); int GABinaryEncode(float&, GABit* bits, unsigned int, float, float); int GABinaryDecode(float&, const GABit* bits, unsigned int, float, float); int GAGrayEncode(float&, GABit* bits, unsigned int, float, float); int GAGrayDecode(float&, const GABit* bits, unsigned int, float, float); #endif gamera-3.3.3/src/ga/GABinStr.cpp0000644000076500000000000000365010714675676015264 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr.C mbwall 30jun95 Copyright (c) 1995 Massachusetts Institute of Technology DESCRIPTION: Source file for the binary string genome. ---------------------------------------------------------------------------- */ #include #include #include #include #include /* ---------------------------------------------------------------------------- BinaryStringGenome ---------------------------------------------------------------------------- */ // Copy the contents of the bitstream. We don't care what format it is in - // we resize to make sure we have adequate space then we just copy all of the // data. // If the original is actually this, then we don't do anything. If the // original is not the same class as this, then we post an error and return. void GABinaryString::copy(const GABinaryString& orig) { if(&orig == this) return; resize(orig.sz); memcpy(data, orig.data, SZ*sizeof(GABit)); } // Resize the bitstream to the specified number of bits. We return the number // of bits actually allocated. For now there is no error checking or memory // management - we assume that we'll always get all of the memory we ask for. // If we resize, we copy the previous bits into the new space. The memory // will never overlap (new should see to that) so we use memcpy not memmove. // If we're making more space, we set the contents of the new space to zeros. int GABinaryString::resize(unsigned int x) { if(sz == x) return sz; if(SZ < x){ while(SZ < x) SZ += csz; if(!data){ data = new GABit [SZ]; memset(data, 0, SZ*sizeof(GABit)); } else{ GABit * tmp = data; data = new GABit [SZ]; memcpy(data, tmp, sz * sizeof(GABit)); memset(&(data[sz]), 0, (SZ-sz)*sizeof(GABit)); delete [] tmp; } } return(sz = x); } gamera-3.3.3/src/ga/GABinStr.h0000644000076500000000000000476210714675676014736 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr.h mbwall 30jun95 Copyright (c) 1995 Massachusetts Institute of Technology DESCRIPTION: This header defines the interface for the binary string. This is a crude version of a real bitstring object. We don't do real bitstring in the interest of speed and ease of coding this mess up. TO DO: we can get major improvements to speed by inlining functions and getting rid of the error checking... for example, inlining genome and removing the conditional makes it go from 7.5 seconds to 3.2 seconds (bm bl cs 1024 c 0.9) ---------------------------------------------------------------------------- */ #ifndef _ga_binstr_h_ #define _ga_binstr_h_ #include #include #include #define GA_BINSTR_CHUNKSIZE 32 // size of the chunks of bits we allocate class GABinaryString { public: GABinaryString(unsigned int s){ csz=GA_BINSTR_CHUNKSIZE; sz=0; SZ=0; data=(GABit *)0; resize(s); } GABinaryString(const GABinaryString& orig){ sz=0; SZ=0; data=(GABit *)0; copy(orig); } virtual ~GABinaryString(){delete [] data;} void copy(const GABinaryString&); int resize(unsigned int); // pass desired size, in bits int size() const {return sz;} short bit(unsigned int a) const { return(data[a]); } short bit(unsigned int a, short val) { // set/unset the bit return(data[a] = (val ? 1 : 0)); } int equal(const GABinaryString & b, unsigned int r, unsigned int x, unsigned int l) const { return(memcmp(&(data[r]),&(b.data[x]),l*sizeof(GABit))?0:1); } void copy(const GABinaryString & orig, unsigned int r, unsigned int x, unsigned int l){ memcpy(&(data[r]), &(orig.data[x]), l*sizeof(GABit)); } void move(unsigned int r, unsigned int x, unsigned int l){ memmove(&(data[r]), &(data[x]), l*sizeof(GABit)); } void set(unsigned int a, unsigned int l){ memset(&(data[a]), 1, l*sizeof(GABit)); } void unset(unsigned int a, unsigned int l){ memset(&(data[a]), 0, l*sizeof(GABit)); } void randomize(unsigned int a, unsigned int l){ for(unsigned int i=0; i #if (_MIPS_SIM == _MIPS_SIM_NABI32) #define USE_CPP_CASTS #elif (_MIPS_SIM == _MIPS_SIM_ABI64) #define USE_CPP_CASTS #elif (_MIPS_SIM == _MIPS_SIM_ABI32) #define USE_AUTO_INST #endif // ---------------------------------------------------------------------------- // This is an unknown/untested platform and/or compiler. The defaults below // might work for you, but then again, they might not. You may have to adjust // the values of the macros until everything works properly. Comment out the // #error directive to allow things to compile properly. Eventually I'll get // areound to replacing this with autoconf... #else #error Unknown/untested compiler/operating system! Check these settings! #define USE_CPP_CASTS //#define USE_BORLAND_INST #define USE_AUTO_INST #define USE_PID #endif // Use the right streams library based on which streams macro was defined. #if defined(USE_OLD_STREAMS) #include #include #elif defined(USE_ANSI_STREAMS) #include #include // i'm terribly sorry to do this, but it is the easiest way for me to get // things to work properly with vcpp. using namespace std; #else #ifndef NO_STREAMS #define NO_STREAMS #endif #endif // If no RNG has been selected, use the ran2 generator by default #if !defined(USE_RAND) && !defined(USE_RANDOM) && \ !defined(USE_RAND48) && !defined(USE_RAN2) && !defined(USE_RAN3) #define USE_RAN2 #endif // This defines how many bits are in a single word on your system. Most // systems have a word length of 8 bits. #ifndef BITS_IN_WORD #define BITS_IN_WORD 8 #endif // Use this to set the maximum number of bits that can be used in binary-to- // decimal conversions. You should make this type the largest integer type // that your system supports. #ifndef BITBASE #define BITBASE long int #endif // If the system/compiler understands C++ casts, then we use them. Otherwise // we default to the C-style casts. The macros make explicit the fact that we // are doing casts. #if defined(USE_CPP_CASTS) #define DYN_CAST(type,x) (dynamic_cast(x)) #define CON_CAST(type,x) (const_cast(x)) #define STA_CAST(type,x) (static_cast(x)) #define REI_CAST(type,x) (reinterpret_cast(x)) #else #define DYN_CAST(type,x) ((type)(x)) #define CON_CAST(type,x) ((type)(x)) #define STA_CAST(type,x) ((type)(x)) #define REI_CAST(type,x) ((type)(x)) #endif // Windows is brain-dead about how to export things, so we do this to keep the // code (somewhat) cleaner but still accomodate windows' stupidity. #if defined(COMPILE_GALIB_AS_DLL) #define GA_DLLDECL __declspec(dllexport) #elif defined(USE_GALIB_AS_DLL) #define GA_DLLDECL __declspec(dllimport) #else #define GA_DLLDECL #endif /* ---------------------------------------------------------------------------- SPACE SAVERS and DEFAULT OPERATORS These directives determine which operators will be used by default for each of the objects in GAlib. If space is limited, you may want to compile the library with only the parts that you need (compiling in DOS comes to mind). Your compiler should do this automatically for you (ie only use the parts that you use). If not, then comment out the chunks in the files you're not going to use (for example, comment out the ordered initializer in the list object). To disable a certain type of genome, simply don't compile its source file. The following directives are defined so that you can trim out the parts of the genetic algorithm objects that are not in separate files. ---------------------------------------------------------------------------- */ // scaling schemes #define USE_LINEAR_SCALING 1 #define USE_SIGMA_TRUNC_SCALING 1 #define USE_POWER_LAW_SCALING 1 #define USE_SHARING 1 // selection schemes #define USE_RANK_SELECTOR 1 #define USE_ROULETTE_SELECTOR 1 #define USE_TOURNAMENT_SELECTOR 1 #define USE_DS_SELECTOR 1 #define USE_SRS_SELECTOR 1 #define USE_UNIFORM_SELECTOR 1 // These are the compiled-in defaults for various genomes and GA objects #define DEFAULT_SCALING GALinearScaling #define DEFAULT_SELECTOR GARouletteWheelSelector #define DEFAULT_TERMINATOR TerminateUponGeneration #define DEFAULT_1DBINSTR_INITIALIZER UniformInitializer #define DEFAULT_1DBINSTR_MUTATOR FlipMutator #define DEFAULT_1DBINSTR_COMPARATOR BitComparator #define DEFAULT_1DBINSTR_CROSSOVER OnePointCrossover #define DEFAULT_2DBINSTR_INITIALIZER UniformInitializer #define DEFAULT_2DBINSTR_MUTATOR FlipMutator #define DEFAULT_2DBINSTR_COMPARATOR BitComparator #define DEFAULT_2DBINSTR_CROSSOVER OnePointCrossover #define DEFAULT_3DBINSTR_INITIALIZER UniformInitializer #define DEFAULT_3DBINSTR_MUTATOR FlipMutator #define DEFAULT_3DBINSTR_COMPARATOR BitComparator #define DEFAULT_3DBINSTR_CROSSOVER OnePointCrossover #define DEFAULT_BIN2DEC_ENCODER GABinaryEncode #define DEFAULT_BIN2DEC_DECODER GABinaryDecode #define DEFAULT_BIN2DEC_COMPARATOR BitComparator #define DEFAULT_1DARRAY_INITIALIZER NoInitializer #define DEFAULT_1DARRAY_MUTATOR SwapMutator #define DEFAULT_1DARRAY_COMPARATOR ElementComparator #define DEFAULT_1DARRAY_CROSSOVER OnePointCrossover #define DEFAULT_2DARRAY_INITIALIZER NoInitializer #define DEFAULT_2DARRAY_MUTATOR SwapMutator #define DEFAULT_2DARRAY_COMPARATOR ElementComparator #define DEFAULT_2DARRAY_CROSSOVER OnePointCrossover #define DEFAULT_3DARRAY_INITIALIZER NoInitializer #define DEFAULT_3DARRAY_MUTATOR SwapMutator #define DEFAULT_3DARRAY_COMPARATOR ElementComparator #define DEFAULT_3DARRAY_CROSSOVER OnePointCrossover #define DEFAULT_1DARRAY_ALLELE_INITIALIZER UniformInitializer #define DEFAULT_1DARRAY_ALLELE_MUTATOR FlipMutator #define DEFAULT_1DARRAY_ALLELE_COMPARATOR ElementComparator #define DEFAULT_1DARRAY_ALLELE_CROSSOVER OnePointCrossover #define DEFAULT_2DARRAY_ALLELE_INITIALIZER UniformInitializer #define DEFAULT_2DARRAY_ALLELE_MUTATOR FlipMutator #define DEFAULT_2DARRAY_ALLELE_COMPARATOR ElementComparator #define DEFAULT_2DARRAY_ALLELE_CROSSOVER OnePointCrossover #define DEFAULT_3DARRAY_ALLELE_INITIALIZER UniformInitializer #define DEFAULT_3DARRAY_ALLELE_MUTATOR FlipMutator #define DEFAULT_3DARRAY_ALLELE_COMPARATOR ElementComparator #define DEFAULT_3DARRAY_ALLELE_CROSSOVER OnePointCrossover #define DEFAULT_STRING_INITIALIZER UniformInitializer #define DEFAULT_STRING_MUTATOR FlipMutator #define DEFAULT_STRING_COMPARATOR ElementComparator #define DEFAULT_STRING_CROSSOVER UniformCrossover #define DEFAULT_REAL_INITIALIZER UniformInitializer #define DEFAULT_REAL_MUTATOR GARealGaussianMutator #define DEFAULT_REAL_COMPARATOR ElementComparator #define DEFAULT_REAL_CROSSOVER UniformCrossover #define DEFAULT_TREE_INITIALIZER NoInitializer #define DEFAULT_TREE_MUTATOR SwapSubtreeMutator #define DEFAULT_TREE_COMPARATOR TopologyComparator #define DEFAULT_TREE_CROSSOVER OnePointCrossover #define DEFAULT_LIST_INITIALIZER NoInitializer #define DEFAULT_LIST_MUTATOR SwapMutator #define DEFAULT_LIST_COMPARATOR NodeComparator #define DEFAULT_LIST_CROSSOVER OnePointCrossover #endif gamera-3.3.3/src/ga/GADCrowdingGA.cpp0000644000076500000000000000402110714675676016144 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gadcrowdingga.C mbwall 29mar99 Copyright (c) 1999 Matthew Wall, all rights reserved ---------------------------------------------------------------------------- */ #include "GADCrowdingGA.h" #include "GAList.h" #include "garandom.h" // this assumes that all of the genomes in the population are the same class void GADCrowdingGA::initialize(unsigned int seed) { GARandomSeed(seed); pop->initialize(); pop->evaluate(gaTrue); stats.reset(*pop); if(!scross) GAErr(GA_LOC, className(), "initialize", gaErrNoSexualMating); } void GADCrowdingGA::step() { if(pop->size() == 0) return; GAGenome *child = pop->individual(0).clone(); GAList indpool; for (int i=0; isize(); i++) indpool.insert(i); do { int *ip; indpool.warp(GARandomInt(0,indpool.size()-1)); // select mom ip=indpool.remove(); GAGenome *mom = &pop->individual(*ip); delete ip; indpool.warp(GARandomInt(0,indpool.size()-1)); // select dad ip=indpool.remove(); GAGenome *dad = &pop->individual(*ip); delete ip; stats.numsel += 2; // create child stats.numcro += (*scross)(*mom, *dad, child, 0); stats.nummut += child->mutate(pMutation()); stats.numeval += 1; float d1 = child->compare(*mom); // replace closest parent float d2 = child->compare(*dad); if (d1 < d2) { if (minmax == MINIMIZE) { if (child->score() < mom->score()) { mom->copy(*child); stats.numrep += 1; } } else { if (child->score() > mom->score()) { mom->copy(*child); stats.numrep += 1; } } } else { if (minmax == MINIMIZE) { if (child->score() < dad->score()) { dad->copy(*child); stats.numrep += 1; } } else { if (child->score() > dad->score()) { dad->copy(*child); stats.numrep += 1; } } } } while (indpool.size()>1); pop->evaluate(gaTrue); stats.update(*pop); delete child; } gamera-3.3.3/src/ga/GADCrowdingGA.h0000644000076500000000000000140610714675676015615 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- dcrowdingga.h mbwall 29mar99 Copyright (c) 1999 Matthew Wall, all rights reserved Header file for the steady-state genetic algorithm class. ---------------------------------------------------------------------------- */ #ifndef _ga_deterministic_crowding_ga_h_ #define _ga_deterministic_crowding_ga_h_ #include class GADCrowdingGA : public GAGeneticAlgorithm { public: GADefineIdentity("GADeterministicCrowdingGA", 241); GADCrowdingGA(const GAGenome& g) : GAGeneticAlgorithm(g) {} virtual ~GADCrowdingGA() {} virtual void initialize(unsigned int seed=0); virtual void step(); GADCrowdingGA& operator++() { step(); return *this; } }; #endif gamera-3.3.3/src/ga/GADemeGA.cpp0000644000076500000000000002761510714675676015154 0ustar chriswheel/* ---------------------------------------------------------------------------- gademe.C mbwall 28jul94 Copyright (c) 1995-1996 Massachusetts Institute of Technology all rights reserved Souce file for the deme-based genetic algorithm object. ---------------------------------------------------------------------------- */ #include #include GAParameterList& GADemeGA::registerDefaultParameters(GAParameterList& p) { GAGeneticAlgorithm::registerDefaultParameters(p); p.add(gaNnPopulations, gaSNnPopulations, GAParameter::INT, &gaDefNPop); p.add(gaNnMigration, gaSNnMigration, GAParameter::INT, &gaDefNMig); return p; } GADemeGA::GADemeGA(const GAGenome& c) : GAGeneticAlgorithm(c) { npop = gaDefNPop; params.add(gaNnPopulations, gaSNnPopulations, GAParameter::INT, &npop); nmig = gaDefNMig; params.add(gaNnMigration, gaSNnMigration, GAParameter::INT, &nmig); unsigned int nr = pop->size()/2; nrepl = new int [npop]; deme = new GAPopulation* [npop]; pstats = new GAStatistics [npop]; tmppop = new GAPopulation(c, nr); for(unsigned int i=0; isize()/2; nrepl = new int [npop]; deme = new GAPopulation* [npop]; pstats = new GAStatistics [npop]; tmppop = new GAPopulation(p.individual(0), nr); for(unsigned int i=0; icopy(*(ga.deme[i])); tmppop->copy(*(ga.tmppop)); pstats = new GAStatistics[npop]; for(i=0; isize(); jj++) deme[ii]->individual(jj).evaluator(f); else for(int jj=0; jjsize(); jj++) deme[i]->individual(jj).evaluator(f); } void GADemeGA::objectiveData(int i, const GAEvalData& v){ if(i == ALL) for(unsigned int ii=0; iisize(); jj++) deme[ii]->individual(jj).evalData(v); else for(int jj=0; jjsize(); jj++) deme[i]->individual(jj).evalData(v); } const GAPopulation& GADemeGA::population(int i, const GAPopulation& p) { if(i == ALL) for(unsigned int ii=0; iisize(value); else deme[i]->size(value); return value; } int GADemeGA::nReplacement(int i, unsigned int value){ if(i == ALL) { for(unsigned int ii=0; ii (unsigned int)deme[ii]->size()) GAErr(GA_LOC, className(), "nReplacement", gaErrBadPRepl); else { params.set(gaNnReplacement, (unsigned int)value); nrepl[ii] = value; } } } else { if(value > (unsigned int)deme[i]->size()) GAErr(GA_LOC, className(), "nReplacement", gaErrBadNRepl); else nrepl[i] = value; } if((unsigned int)(tmppop->size()) < value) { tmppop->size(value); } return value; } GAScalingScheme& GADemeGA::scaling(int i, const GAScalingScheme & s){ if(i == ALL) for(unsigned int ii=0; iiscaling(s); else deme[i]->scaling(s); return deme[((i==ALL) ? 0 : i)]->scaling(); } GASelectionScheme& GADemeGA::selector(int i, const GASelectionScheme& s){ if(i == ALL) for(unsigned int ii=0; iiselector(s); else deme[i]->selector(s); return deme[((i==ALL) ? 0 : i)]->selector(); } int GADemeGA::nMigration(unsigned int n) { params.set(gaNnMigration, (unsigned int)n); return nmig = n; } // change the number of populations. try affect the evolution as little as // possible in the process, so set things to sane values where we can. int GADemeGA::nPopulations(unsigned int n) { if(n < 1 || n == npop) return npop; if(n < npop) { for(unsigned int i=n; isize(npop); return npop; } int GADemeGA::minimaxi(int m) { if(m == MINIMIZE){ tmppop->order(GAPopulation::LOW_IS_BEST); for(unsigned int i=0; iorder(GAPopulation::LOW_IS_BEST); } else{ tmppop->order(GAPopulation::HIGH_IS_BEST); for(unsigned int i=0; iorder(GAPopulation::HIGH_IS_BEST); } return GAGeneticAlgorithm::minimaxi(m); } // We only use the sexual mating, so only check for that one. Initialize each // of the popultions and set stats appropriately. void GADemeGA::initialize(unsigned int seed) { GARandomSeed(seed); for(unsigned int i=0; iinitialize(); deme[i]->evaluate(gaTrue); pstats[i].reset(*deme[i]); pop->individual(i).copy(deme[i]->best()); } pop->touch(); stats.reset(*pop); if(!scross) GAErr(GA_LOC, className(), "initialize", gaErrNoSexualMating); } // To evolve the genetic algorithm, we loop through all of our populations and // evolve each one of them. Then allow the migrator to do its thing. Assumes // that the tmp pop is at least as big as the largest nrepl that we'll use. // The master population maintains the best n individuals from each of the // populations, and it is based on those that we keep the statistics for the // entire genetic algorithm run. void GADemeGA::step() { int i, mut, c1, c2; GAGenome *mom, *dad; float pc; if(!scross) pc = 0.0; else pc = pCrossover(); for(unsigned int ii=0; iiselect()); dad = &(deme[ii]->select()); pstats[ii].numsel += 2; c1 = c2 = 0; if(GAFlipCoin(pc)){ pstats[ii].numcro += (*scross)(*mom, *dad, &tmppop->individual(i), &tmppop->individual(i+1)); c1 = c2 = 1; } else{ tmppop->individual( i ).copy(*mom); tmppop->individual(i+1).copy(*dad); } pstats[ii].nummut += (mut=tmppop->individual( i ).mutate(pMutation())); if(mut > 0) c1 = 1; pstats[ii].nummut += (mut=tmppop->individual(i+1).mutate(pMutation())); if(mut > 0) c2 = 1; pstats[ii].numeval += c1 + c2; } if(nrepl[ii] % 2 != 0){ // do the remaining population member mom = &(deme[ii]->select()); dad = &(deme[ii]->select()); pstats[ii].numsel += 2; c1 = 0; if(GAFlipCoin(pc)){ pstats[ii].numcro += (*scross)(*mom, *dad, &tmppop->individual(i), (GAGenome*)0); c1 = 1; } else{ if(GARandomBit()) tmppop->individual(i).copy(*mom); else tmppop->individual(i).copy(*dad); } pstats[ii].nummut += (mut=tmppop->individual(i).mutate(pMutation())); if(mut > 0) c1 = 1; pstats[ii].numeval += c1; } for(i=0; iadd(&tmppop->individual(i)); deme[ii]->evaluate(); deme[ii]->scale(); for(i=0; ireplace(deme[ii]->remove(GAPopulation::WORST, GAPopulation::SCALED), i); pstats[ii].numrep += nrepl[ii]; } migrate(); for(unsigned int jj=0; jjevaluate(); pstats[jj].update(*deme[jj]); } stats.numsel = stats.numcro = stats.nummut = stats.numrep = stats.numeval=0; for(unsigned int kk=0; kkindividual(kk).copy(deme[kk]->best()); stats.numsel += pstats[kk].numsel; stats.numcro += pstats[kk].numcro; stats.nummut += pstats[kk].nummut; stats.numrep += pstats[kk].numrep; stats.numeval += pstats[kk].numeval; } pop->touch(); stats.update(*pop); for(unsigned int ll=0; llindividual(j)); for(unsigned int i=1; ireplace(ind[j], j); } for(j=0; jreplace(ind[j], j); delete [] ind; } gamera-3.3.3/src/ga/GADemeGA.h0000644000076500000000000001066310714675676014614 0ustar chriswheel/* ---------------------------------------------------------------------------- gademe.h mbwall jan96 Copyright (c) 1995-1996 Massachusetts Institute of Technology all rights reserved Header for the deme (parallel population) genetic algorithm class. This genetic algorithm lets you specify a number of individuals to migrate from one population to another at the end of each generation. You can specify how many populations to maintain. Each population evolves using a steady-state genetic algorithm. At the end of each generation, the specified number of individuals migrate from one population to the next (we use the loop migration topology in this implementation). You can modify the migration method by deriving a new class from this one and redefine the migration method. If you want to use a different kind of genetic algorithm for each population then you'll have to modify the mechanics of the step method. ---------------------------------------------------------------------------- */ #ifndef _ga_gademe_h_ #define _ga_gademe_h_ #include class GADemeGA : public GAGeneticAlgorithm { public: GADefineIdentity("GADemeGA", GAID::DemeGA); enum {ALL=(-1)}; static GAParameterList& registerDefaultParameters(GAParameterList&); public: GADemeGA(const GAGenome&); GADemeGA(const GAPopulation&); GADemeGA(const GADemeGA&); GADemeGA& operator=(const GADemeGA&); virtual ~GADemeGA(); virtual void copy(const GAGeneticAlgorithm&); virtual void initialize(unsigned int seed=0); virtual void step(); virtual void migrate(); // new for this derived class GADemeGA & operator++() { step(); return *this; } virtual int setptr(const char* name, const void* value); virtual int get(const char* name, void* value) const; virtual int minimaxi() const {return minmax;} virtual int minimaxi(int m); virtual const GAPopulation& population() const {return *pop;} virtual const GAPopulation& population(const GAPopulation& p) { GAGeneticAlgorithm::population(p); return population(ALL,p); } virtual int populationSize() const {return pop->size();} virtual int populationSize(unsigned int n) { GAGeneticAlgorithm::populationSize(n); return populationSize(ALL,n); } virtual GAScalingScheme& scaling() const {return pop->scaling();} virtual GAScalingScheme& scaling(const GAScalingScheme & s) { GAGeneticAlgorithm::scaling(s); return scaling(ALL,s);} virtual GASelectionScheme& selector() const {return pop->selector(); } virtual GASelectionScheme& selector(const GASelectionScheme& s) { GAGeneticAlgorithm::selector(s); return selector(ALL,s);} virtual void objectiveFunction(GAGenome::Evaluator f) { GAGeneticAlgorithm::objectiveFunction(f); objectiveFunction(ALL,f); } virtual void objectiveData(const GAEvalData& v) { GAGeneticAlgorithm::objectiveData(v); objectiveData(ALL,v); } const GAPopulation& population(unsigned int i) const {return *deme[i];} const GAPopulation& population(int i, const GAPopulation&); int populationSize(unsigned int i) const {return deme[i]->size();} int populationSize(int i, unsigned int n); int nReplacement(unsigned int i) const {return nrepl[i];} int nReplacement(int i, unsigned int n); int nMigration() const {return nmig;} int nMigration(unsigned int i); int nPopulations() const {return npop;} int nPopulations(unsigned int i); GAScalingScheme& scaling(unsigned int i) const {return deme[i]->scaling();} GAScalingScheme& scaling(int i, const GAScalingScheme & s); GASelectionScheme& selector(unsigned int i)const{return deme[i]->selector();} GASelectionScheme& selector(int i, const GASelectionScheme& s); void objectiveFunction(int i, GAGenome::Evaluator f); void objectiveData(int i, const GAEvalData&); const GAStatistics& statistics() const {return stats;} const GAStatistics& statistics(unsigned int i) const {return pstats[i];} protected: unsigned int npop; // how many populations do we have? int *nrepl; // how many to replace each generation GAPopulation** deme; // array of populations that we'll use GAPopulation* tmppop; // temp pop for doing the evolutions GAStatistics* pstats; // statistics for each population unsigned int nmig; // number to migrate from each population }; #ifndef NO_STREAMS inline ostream & operator<< (ostream & os, GADemeGA & arg) {arg.write(os); return(os);} inline istream & operator>> (istream & is, GADemeGA & arg) {arg.read(is); return(is);} #endif #endif gamera-3.3.3/src/ga/gaerror.cpp0000644000076500000000000001251011022153646015264 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- error.C mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This file contains all of the error messages for the library. ---------------------------------------------------------------------------- */ #include #include #include char gaErrMsg[512]; char _gaerrbuf1[120]; char _gaerrbuf2[120]; #ifndef NO_STREAMS static ostream *__gaErrStream = &cerr; #endif static GABoolean __gaErrFlag = gaTrue; static char *__gaErrStr[] = { (char *)"error reading from file: ", (char *)"error writing to file: ", (char *)"unexpected EOF encountered during read.", (char *)"bad probability value. Must be between 0.0 and 1.0, inclusive.", (char *)"objects are different types.", (char *)"this method has not been defined.", (char *)"core deleted with references remaining.", (char *)"the custom replacement strategy requires a replacement function", (char *)"unknown replacement strategy", (char *)"number of children must be greater than 0", (char *)"replacement percentage must be between 0.0 and 1.0, inclusive", (char *)"number of indiv for replacement must be less than pop size", (char *)"index of individual is out-of-bounds", (char *)"population contains no individuals from which to clone new individuals", (char *)"there must be at least one individual in each population", (char *)"no sexual crossover has been defined. no mating can occur.", (char *)"no asexual crossover has been defined. no mating can occur.", (char *)"children must have same resize behaviour for any given dimension", (char *)"parents and children must have the same dimensions", (char *)"parents must be the same length", (char *)"upper limit must be greater than lower limit.", (char *)"bad phenotype - ID is out of bounds.", (char *)"bad phenotype - value is less than min or greater than max.", (char *)"dimensions of bounds set do not match dimensions of the genome", (char *)"linear scaling multiplier must be greater than 1.0", (char *)"sigma truncation multiplier must be greater than 0.0", (char *)"negative objective function score!\n\ all raw objective scores must be positive for linear scaling.", (char *)"negative objective function score!\n\ all raw objective scores must be positive for power law scaling.", (char *)"the cutoff for triangular sharing must be greater than 0.0", (char *)"cannot index an allele in a bounded, non-discretized set of alleles", (char *)"length of binary string exceeds maximum for this computer/OS type.", (char *)"specified value cannot be exactly represented with these bits.", (char *)"bad 'where' indicator", (char *)"bogus type, data may be corrupt", (char *)"bad links in tree. operation aborted.", (char *)"cannot swap a node with its ancestor", (char *)"cannot insert this object into itself", (char *)"node relative to which insertion is made must be non-NULL.", (char *)"root node must have no siblings. insertion aborted.", (char *)"cannot insert before a root node (only below).", (char *)"cannot insert after a root node (only below)." }; void GAErr(const GASourceLocator loc, const char *clss, const char *func, const char *msg1, const char *msg2, const char *msg3){ gaErrMsg[0] = '\0'; strcat(gaErrMsg, clss); strcat(gaErrMsg, "::"); strcat(gaErrMsg, func); strcat(gaErrMsg, ":\n "); strcat(gaErrMsg, msg1); strcat(gaErrMsg, "\n"); if(msg2){ strcat(gaErrMsg, " "); strcat(gaErrMsg, msg2); strcat(gaErrMsg, "\n"); } if(msg3){ strcat(gaErrMsg, " "); strcat(gaErrMsg, msg3); strcat(gaErrMsg, "\n"); } sprintf(_gaerrbuf1, " %s : %ld\n", loc.file, loc.line); strcat(gaErrMsg, _gaerrbuf1); #ifndef NO_STREAMS if(__gaErrFlag == gaTrue) *__gaErrStream << gaErrMsg; #endif } void GAErr(const GASourceLocator loc, const char *clss, const char *func, GAErrorIndex i, const char *msg2, const char *msg3){ gaErrMsg[0] = '\0'; strcat(gaErrMsg, clss); strcat(gaErrMsg, "::"); strcat(gaErrMsg, func); strcat(gaErrMsg, ":\n "); strcat(gaErrMsg, __gaErrStr[i]); strcat(gaErrMsg, "\n"); if(msg2){ strcat(gaErrMsg, " "); strcat(gaErrMsg, msg2); strcat(gaErrMsg, "\n"); } if(msg3){ strcat(gaErrMsg, " "); strcat(gaErrMsg, msg3); strcat(gaErrMsg, "\n"); } sprintf(_gaerrbuf1, " %s : %ld\n", loc.file, loc.line); strcat(gaErrMsg, _gaerrbuf1); #ifndef NO_STREAMS if(__gaErrFlag == gaTrue) *__gaErrStream << gaErrMsg; #endif } void GAErr(const GASourceLocator loc, const char *func, GAErrorIndex i, const char *msg2, const char *msg3){ gaErrMsg[0] = '\0'; strcat(gaErrMsg, func); strcat(gaErrMsg, ":\n "); strcat(gaErrMsg, __gaErrStr[i]); strcat(gaErrMsg, "\n"); if(msg2){ strcat(gaErrMsg, " "); strcat(gaErrMsg, msg2); strcat(gaErrMsg, "\n"); } if(msg3){ strcat(gaErrMsg, " "); strcat(gaErrMsg, msg3); strcat(gaErrMsg, "\n"); } sprintf(_gaerrbuf1, " %s : %ld\n", loc.file, loc.line); strcat(gaErrMsg, _gaerrbuf1); #ifndef NO_STREAMS if(__gaErrFlag == gaTrue) *__gaErrStream << gaErrMsg; #endif } void GAReportErrors(GABoolean flag){ __gaErrFlag = flag; } #ifndef NO_STREAMS void GASetErrorStream(ostream& s){ __gaErrStream = &s; } #endif gamera-3.3.3/src/ga/gaerror.h0000644000076500000000000000667510714675676014773 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- error.h mbwall 7may95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This defines the error routines for handling errors. ---------------------------------------------------------------------------- */ #ifndef _ga_error_h_ #define _ga_error_h_ #include #include // This object is for telling us where in the source code an error occurs. class GASourceLocator { public: GASourceLocator(const char* f, long l) : file(f), line(l) {} const char* file; long line; }; #define GA_LOC GASourceLocator(__FILE__, __LINE__) // These are the indices for all of the error messages used in the library. enum GAErrorIndex { // general errors gaErrReadError=0, gaErrWriteError, gaErrUnexpectedEOF, gaErrBadProbValue, gaErrObjectTypeMismatch, gaErrOpUndef, gaErrRefsRemain, // errors for the GA objects gaErrNeedRS, gaErrBadRS, gaErrBadCS, gaErrBadPRepl, gaErrBadNRepl, gaErrBadPopIndex, gaErrNoIndividuals, gaErrBadPopSize, gaErrNoSexualMating, gaErrNoAsexualMating, // errors for the genome and crossover objects gaErrSameBehavReqd, gaErrSameLengthReqd, gaErrBadParentLength, gaErrBadResizeBehaviour, gaErrBadPhenotypeID, gaErrBadPhenotypeValue, gaErrBadBndsDim, // scaling scheme error messages gaErrBadLinearScalingMult, gaErrBadSigmaTruncationMult, gaErrNegFitness, gaErrPowerNegFitness, gaErrBadSharingCutoff, // miscellaneous error messages from various data objects gaErrNoAlleleIndex, gaErrBinStrTooLong, gaErrDataLost, gaErrBadWhereIndicator, gaErrBadTypeIndicator, gaErrBadTreeLinks, gaErrCannotSwapAncestors, gaErrCannotInsertIntoSelf, gaErrCannotInsertOnNilNode, gaErrCannotInsertWithSiblings, gaErrCannotInsertBeforeRoot, gaErrCannotInsertAfterRoot }; // Error messages will look like this: (assuming that you use streams) // // GASimpleGA::function: // this is the error message // /usr/people/jimmyboy/doughhead.C : XXX // // GAGenome::function: // primary error message // additional error messages go here // /usr/people/algore/distribute_your_intelligence.C : XXX // // MyOwnFunction: // primary error message // additional error messages go here // /usr/people/algore/distribute_your_intelligence.C : XXX // void GAErr(const GASourceLocator loc, const char *clss, const char *function_name, GAErrorIndex i, const char *msg2=0, const char *msg3=0); void GAErr(const GASourceLocator loc, const char *clss, const char *function_name, const char *msg1, const char *msg2=0, const char *msg3=0); void GAErr(const GASourceLocator loc, const char *function_name, GAErrorIndex i, const char *msg2=0, const char *msg3=0); // Use this function to turn on/off the error reporting. If you turn off the // error reporting, the messages will still get stuck into the global error // message string, but they will not be sent to the error stream. void GAReportErrors(GABoolean flag); // Provide a mechanism for redirecting the error messages. #ifdef NO_STREAMS inline void GASetErrorStream(){} // dummy function #else void GASetErrorStream(ostream&); #endif // This error string contains the text of the most recent error message. If a // GAlib function returns an error code, this string will contain the text of // the explanation for the error. extern char gaErrMsg[]; #endif gamera-3.3.3/src/ga/GAEvalData.h0000644000076500000000000000150510714675676015206 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- eval.h mbwall 3dec95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This is the basic interface for the object that contains evaluation data. It can be used with genomes and/or populations in combination with their respective evaluation methods. ---------------------------------------------------------------------------- */ #ifndef _ga_eval_h_ #define _ga_eval_h_ class GAEvalData { public: GAEvalData() {} GAEvalData(const GAEvalData&) {} virtual ~GAEvalData() {} GAEvalData& operator=(const GAEvalData& orig) { if(&orig != this) copy(orig); return *this; } virtual GAEvalData* clone() const =0; virtual void copy(const GAEvalData&) =0; }; #endif gamera-3.3.3/src/ga/GAGenome.cpp0000644000076500000000000000463410714675676015300 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- genome.C mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Definitions for genome base class. See the header file for complete documentation for deriving new classes. Comments here are implementation- specific details about base class member functions. ---------------------------------------------------------------------------- */ #include // These are the default genome operators. // None does anything - they just post an error message to let you know that no // method has been defined. These are for the base class (which has no // function by itself). void GAGenome::NoInitializer(GAGenome & c){ GAErr(GA_LOC, c.className(), "initializer", gaErrOpUndef); } int GAGenome::NoMutator(GAGenome & c, float){ GAErr(GA_LOC, c.className(), "mutator", gaErrOpUndef); return 0; } float GAGenome::NoComparator(const GAGenome& c, const GAGenome&){ GAErr(GA_LOC, c.className(), "comparator", gaErrOpUndef); return -1.0; } GAGenome:: GAGenome(Initializer i, Mutator m, Comparator c){ if(i==0) i=NoInitializer; if(m==0) m=NoMutator; if(c==0) c=NoComparator; _score=_fitness=0.0; _evaluated=gaFalse; _neval=0; ga=0; ud=0; eval=0; evd=0; init=i; mutr=m; cmp=c; sexcross = 0; asexcross = 0; } GAGenome::GAGenome(const GAGenome & orig){ evd=0; _neval=0; GAGenome::copy(orig); } GAGenome::~GAGenome(){ delete evd; } GAGenome* GAGenome::clone(CloneMethod) const { GAErr(GA_LOC, className(), "clone", gaErrOpUndef); return new GAGenome(*this); } // The eval count is not copied from the other genome - that would inflate the // count. void GAGenome::copy(const GAGenome & orig){ if(&orig == this) return; _score=orig._score; _fitness=orig._fitness; _evaluated=orig._evaluated; ga=orig.ga; ud=orig.ud; eval=orig.eval; init=orig.init; mutr=orig.mutr; cmp=orig.cmp; sexcross=orig.sexcross; asexcross=orig.asexcross; _neval = 0; if(orig.evd){ if(evd) evd->copy(*orig.evd); else evd = orig.evd->clone(); } // don't delete if c doesn't have one } float GAGenome::evaluate(GABoolean flag) const { if(_evaluated == gaFalse || flag == gaTrue){ GAGenome *This = (GAGenome*)this; if(eval){ This->_neval++; This->_score = (*eval)(*This); } This->_evaluated = gaTrue; } return _score; } gamera-3.3.3/src/ga/GAGenome.h0000644000076500000000000003214410714675676014742 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- genome.h mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology DESCRIPTION: The base genome class just defines the genome interface - how to mutate, crossover, evaluate, etc. When you create your own genome, multiply inherit from the base genome class and the data type that you want to use. Use the data type to store the information and use the genome part to tell the GA how it should operate on the data. See comments below for further details. ---------------------------------------------------------------------------- */ #ifndef _ga_genome_h_ #define _ga_genome_h_ #include #include #include #include #include #include class GAGeneticAlgorithm; class GAGenome; /* ---------------------------------------------------------------------------- Genome ------------------------------------------------------------------------------- Deriving your own genomes: For any derived class be sure to define the canonical methods: constructor, copy constructor, operator=, and destructor. Make sure that you check for a self-copy in your copy method (it is possible that a genome will be selected to cross with itself, and self-copying is not out of the question) To work properly with the GAlib, you MUST define the following: YourGenome( -default-args-for-your-genome ) YourGenome(const YourGenome&) virtual ~YourGenome() virtual GAGenome* clone(GAGenome::CloneMethod) virtual copy(const GAGenome&) If your genome class defines any new properties you should to define: virtual int read(istream&) virtual int write(ostream&) const virtual int equal(const GAGenome&) const When you derive a genome, don't forget to use the _evaluated flag to indicate when the state of the genome has changed and an evaluation is needed. Assign a default crossover method so that users don't have to assign one unless they want to. Do this in the constructor. It is a good idea to define an identity for your genome (especially if you will be using it in an environment with multiple genome types running around). Use the DefineIdentity/DeclareIdentity macros (defined in id.h) to do this in your class definition. Brief overview of the member functions: initialize Use this method to set the initial state of your genomes once they have been created. This initialization is for setting up the genome's state, not for doing the basic mechanics of genome class management. The default behaviour of this method is to change randomly the contents of the genome. If you want to bias your initial population, this is where to make that happen. The initializer is used to initialize the genome (duh). Notice that the state of the genome is unknown - memory may or may not have been allocated, and the genome may or may not have been used before. So your initializer should first clean up as needed, then do its thing. The initializer may be called any number of times (unlike a class constructor which is called only once for a given instance). mutate Mutate the genome with probability as specified. What mutation means depends upon the data type of the genome. For example, you could have a bit string in which 50% mutation means each bit has a 50% chance of getting flipped, or you could have a tree in which 50% mutation means each node has a 50% chance of getting deleted, or you could have a bit string in which 50% mutation means 50% of the bits ACTUALLY get flipped. The mutations member returns the number of mutations since the genome was initialized. The mutator makes a change to the genome with likeliehood determined by the mutation rate parameter. The exact meaning of mutation is up to you, as is the specific meaning of the mutation rate. The function returns the number of mutations that actually occurred. crossover Genomes don't really have any clue about other genomes, so we don't make the crossover a member function. Instead, each genome kind of knows how to mate with other genomes to generate offspring, but they are not capable of doing it themselves. The crossover member function is used to set the default mating mode for the genomes - it does not actually perform the crossover. This way the GA can use asexual crossover if it wants to (but genomes only know how to do the default sexual crossover). This also lets you do funky stuff like crossover between different data types and group sex to generate new offspring. We define two types of crossover: sexual and asexual. Most GAlib algorithms use the sexual crossover, but both are available. Each genome knows the preferred crossover method, but none is capable of reproducing. The genetic algorithm must actually perform the mating because it involves another genome (as parent and/or child). evaluator Set the genome's objective function. This also sets marks the evaluated flag to indicate that the genome must be re-evaluated. Evaluation happens on-demand - the objective score is not calculated until it is requested. Then it is cached so that it does not need to be re- calculated each time it is requested. This means that any member function that modifies the state of the genome must also set the evaluated flag to indicate that the score must be recalculated. The genome objective function is used by the GA to evaluate each member of the population. comparator This method is used to determine how similar two genomes are. If you want to use a different comparison method without deriving a new class, then use the comparator function to do so. For example, you may want to do phenotype- based comparisons rather than genotype-based comparisons. In many cases we have to compare two genomes to determine how similar or different they are. In traditional GA literature this type of function is referred to as a 'distance' function, probably because bit strings can be compared using the Hamming distance as a measure of similarity. In GAlib, we define a genome comparator function that does exactly this kind of comparison. If the genomes are identical, the similarity function should return a value of 0.0, if completely different then return a value greater than 0. The specific definition of what "the same" and what "different" mean is up to you. Most of the default comparators use the genotype for the comparison, but you can use the phenotype if you prefer. There is no upper limit to the distance score as far as GAlib is concerned. The no-op function returns a -1 to signify that the comparison failed. evalData The evalData member is useful if you do not want to derive a new genome class but want to store data with each genome. When you clone a genome, the eval data also gets cloned so that each genome has its own eval data (unlike the user data pointer described next which is shared by all genomes). userData The userData member is used to provide all genomes access to the same user data. This can be a pointer to anything you want. Any genome cloned from another will share the same userData as the original. This means that all of the genomes in a population, for example, share the same userData. score Evaluate the 'performance' of the genome using the objective function. The score is kept in the 'score' member. The 'evaluated' member tells us whether or not we can trust the score. Be sure to set/unset the 'evaluated' member as appropriate (eg cross and mutate change the contents of the genome so they unset the 'evaluated' flag). If there is no objective function, then simply return the score. This allows us to use population-based evaluation methods (where the population method sets the score of each genome). clone This method allocates space for a new genome and copies the original into the new space. Depending on the argument, it either copies the entire original or just parts of the original. For some data types, clone contents and clone attributes will do the same thing. If your data type requires significant overhead for initialization, then you'll probably want to distinguish between cloning contents and cloning attributes. clone(cont) Clone the contents of the genome. Returns a pointer to a GAGenome (which actually points to a genome of the type that was cloned). This is a 'deep copy' in which every part of the genome is duplicated. clone(attr) Clone the attributes of the genome. This method does nothing to the contents of the genome. It does NOT call the initialization method. For some data types this is the same thing as cloning the contents. ---------------------------------------------------------------------------- */ class GAGenome : public GAID { public: GADefineIdentity("GAGenome", GAID::Genome); public: typedef float (*Evaluator)(GAGenome &); typedef void (*Initializer)(GAGenome &); typedef int (*Mutator)(GAGenome &, float); typedef float (*Comparator)(const GAGenome&, const GAGenome&); typedef int (*SexualCrossover)(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); typedef int (*AsexualCrossover)(const GAGenome&, GAGenome*); public: static void NoInitializer(GAGenome &); static int NoMutator(GAGenome &, float); static float NoComparator(const GAGenome&, const GAGenome&); public: enum Dimension {LENGTH = 0, WIDTH = 0, HEIGHT = 1, DEPTH = 2}; enum CloneMethod {CONTENTS = 0, ATTRIBUTES = 1}; enum {FIXED_SIZE = -1, ANY_SIZE = -10}; public: // The GNU compiler sucks. It won't recognize No*** as a member of the genome // class. So we have to use 0 as the defaults then check in the constructor. GAGenome(Initializer i=0, Mutator m=0, Comparator c=0); GAGenome(const GAGenome&); GAGenome & operator=(const GAGenome & arg){copy(arg); return *this;} virtual ~GAGenome(); virtual GAGenome* clone(CloneMethod flag=CONTENTS) const; virtual void copy(const GAGenome &); #ifndef NO_STREAMS virtual int read(istream &) { GAErr(GA_LOC, className(), "read", gaErrOpUndef); return 0; } virtual int write(ostream &) const { GAErr(GA_LOC, className(), "write", gaErrOpUndef); return 0; } #endif virtual int equal(const GAGenome &) const { GAErr(GA_LOC, className(), "equal", gaErrOpUndef); return 1; } virtual int notequal(const GAGenome & g) const { return (equal(g) ? 0 : 1); } public: int nevals() const {return _neval;} float score() const { evaluate(); return _score; } float score(float s){ _evaluated=gaTrue; return _score=s; } float fitness(){return _fitness;} float fitness(float f){return _fitness = f;} GAGeneticAlgorithm* geneticAlgorithm() const {return ga;} GAGeneticAlgorithm* geneticAlgorithm(GAGeneticAlgorithm& g){return(ga=&g);} void * userData() const {return ud;} void * userData(void * u){return(ud=u);} GAEvalData * evalData() const {return evd;} GAEvalData * evalData(const GAEvalData& o) {delete evd; evd = o.clone(); return evd;} float evaluate(GABoolean flag = gaFalse) const; Evaluator evaluator() const {return eval;} Evaluator evaluator(Evaluator f) { _evaluated=gaFalse; return(eval=f); } void initialize(){_evaluated=gaFalse; _neval=0; (*init)(*this);} Initializer initializer() const {return init;} Initializer initializer(Initializer op){return (init=op);} int mutate(float p){ return((*mutr)(*this,p)); } Mutator mutator() const {return mutr;} Mutator mutator(Mutator op){return (mutr=op);} float compare(const GAGenome& g) const {return (*cmp)(*this,g);} Comparator comparator() const {return cmp;} Comparator comparator(Comparator c){return (cmp=c);} SexualCrossover crossover(SexualCrossover f) { return sexcross = f; } SexualCrossover sexual() const { return sexcross; } AsexualCrossover crossover(AsexualCrossover f) { return asexcross = f; } AsexualCrossover asexual() const { return asexcross; } protected: float _score; // value returned by the objective function float _fitness; // (possibly scaled) fitness score GABoolean _evaluated; // has this genome been evaluated? unsigned int _neval; // how many evaluations since initialization? GAGeneticAlgorithm* ga; // the ga that is using this genome void* ud; // pointer to user data Evaluator eval; // objective function GAEvalData* evd; // evaluation data (specific to each genome) Mutator mutr; // the mutation operator to use for mutations Initializer init; // how to initialize this genome Comparator cmp; // how to compare two genomes of this type SexualCrossover sexcross; // preferred sexual mating method AsexualCrossover asexcross; // preferred asexual mating method }; #ifndef NO_STREAMS inline ostream& operator<< (ostream& os, const GAGenome& genome) { genome.write(os); return(os); } inline istream& operator>> (istream& is, GAGenome& genome) { genome.read(is); return(is); } #endif inline int operator== (const GAGenome& a, const GAGenome& b) { return a.equal(b); } inline int operator!= (const GAGenome& a, const GAGenome& b) { return a.notequal(b); } #endif gamera-3.3.3/src/ga/gaid.h0000644000076500000000000000742610714675676014231 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- id.h mbwall 7may95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This defines the identifiers for polymorphic classes. The IDs are used primarily for checking to be see if the two objects are the same type before doing a copy, for example. The name is often used when printing out error messages so you'll know where things are happening. I hate to derive so many classes from the same base class, especially when the derived classes are completely unrelated. But this is a convenient way to enumerate the built-in classes, and they DO share the polymorphic behaviour (even if they do NOT share any other attributes). TO DO: I leave the id/classname implementation for backward compatibility. Also, as of fall98 there are still some systems that do not support RTTI (or environs that do not want to use RTTI for some reason or another). This whole thing will be replaced with a proper RTTI implementation as soon as RTTI is stable on all the platforms (and as soon as I have time to do the update). So for now, I apologize for the 'hack'iness of this implementation. ---------------------------------------------------------------------------- */ #ifndef _ga_id_h_ #define _ga_id_h_ class GAID { public: enum { BaseGA=0, SimpleGA, SteadyStateGA, IncrementalGA, DemeGA, Population=10, Scaling=15, NoScaling, LinearScaling, SigmaTruncationScaling, PowerLawScaling, Sharing, Selection=40, RankSelection, RouletteWheelSelection, TournamentSelection, UniformSelection, SRSSelection, DSSelection, Genome=50, BinaryStringGenome, BinaryStringGenome2D, BinaryStringGenome3D, Bin2DecGenome, ListGenome, TreeGenome, ArrayGenome, ArrayGenome2D, ArrayGenome3D, ArrayAlleleGenome, ArrayAlleleGenome2D, ArrayAlleleGenome3D, StringGenome, FloatGenome, IntGenome, DoubleGenome }; virtual ~GAID() { } int sameClass(const GAID &b) const {return(classID() == b.classID());} virtual const char * className() const {return "no class";} virtual int classID() const {return 0;} }; // Here are the ID values for the GA library: // // class range // --------------------------------------------- // reserved 0-199 // anyone can use these 200- // // The ID numbers for built-in classes are enumerated in the GAID class. Sorry // but I had to do the dimension at the end of the names rather than at the // beginning since you cannot use a digit to start a variable name. // If you derive your own polymorphic class or specialize a // template class, then give it its own ID number and class name in the // specialization (see the string and real number specializations for examples) // Use these macros to define the identity for your class. If you do not use // these macros then your object will be identity-less. // Here's how to use the macro. // // class GASimpleGA : public GA { // public: // GADefineClassIdentity("GASimpleGA", 1); // ... // }; // // Notice that your template classes will all have the same name using this // method unless you specialize. For example, GA1DArrayGenome and // GA1DArrayGenome will both have the name GA1DArrayGenome as well as // the same number. Beware. #define GADefineIdentity(name,id) \ const char * className() const {return name;} \ int classID() const {return id;} #define GADeclareIdentity() \ const char * className() const; \ int classID() const #define GADefineIdentitySRC(clss,name,id) \ const char * clss :: className() const {return name;} \ int clss :: classID() const {return id;} #endif gamera-3.3.3/src/ga/GAIncGA.cpp0000644000076500000000000001476710714675676015017 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gainc.C mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved Source file for the incremental genetic algorithm object. ---------------------------------------------------------------------------- */ #include #include GAParameterList& GAIncrementalGA::registerDefaultParameters(GAParameterList& p) { GAGeneticAlgorithm::registerDefaultParameters(p); p.add(gaNnOffspring, gaSNnOffspring, GAParameter::INT, &gaDefNumOff); p.set(gaNscoreFrequency, &gaDefScoreFrequency2); return p; } GAIncrementalGA::GAIncrementalGA(const GAGenome& c) : GAGeneticAlgorithm(c) { child1 = pop->individual(0).clone(GAGenome::ATTRIBUTES); child2 = pop->individual(0).clone(GAGenome::ATTRIBUTES); child1->geneticAlgorithm(*this); child2->geneticAlgorithm(*this); rs = WORST; rf = 0; noffspr = gaDefNumOff; params.add(gaNnOffspring, gaSNnOffspring, GAParameter::INT, &noffspr); stats.scoreFrequency(gaDefScoreFrequency2); params.set(gaNscoreFrequency, &gaDefScoreFrequency2); } GAIncrementalGA::GAIncrementalGA(const GAPopulation& p): GAGeneticAlgorithm(p){ child1 = pop->individual(0).clone(GAGenome::ATTRIBUTES); child2 = pop->individual(0).clone(GAGenome::ATTRIBUTES); child1->geneticAlgorithm(*this); child2->geneticAlgorithm(*this); rs = WORST; rf = 0; noffspr = gaDefNumOff; params.add(gaNnOffspring, gaSNnOffspring, GAParameter::INT, &noffspr); stats.scoreFrequency(gaDefScoreFrequency2); params.set(gaNscoreFrequency, &gaDefScoreFrequency2); } GAIncrementalGA::GAIncrementalGA(const GAIncrementalGA& ga) : GAGeneticAlgorithm(ga){ child1 = (GAGenome *)0; child2 = (GAGenome *)0; copy(ga); } GAIncrementalGA::~GAIncrementalGA(){ delete child1; delete child2; } GAIncrementalGA& GAIncrementalGA::operator=(const GAIncrementalGA& ga){ if(&ga != this) copy(ga); return *this; } void GAIncrementalGA::copy(const GAGeneticAlgorithm & g){ GAGeneticAlgorithm::copy(g); const GAIncrementalGA& ga = DYN_CAST(const GAIncrementalGA&, g); rs = ga.rs; rf = ga.rf; noffspr = ga.noffspr; if(child1) child1->copy(*ga.child1); else child1 = ga.child1->clone(); if(child2) child2->copy(*ga.child2); else child2 = ga.child2->clone(); child1->geneticAlgorithm(*this); child2->geneticAlgorithm(*this); } int GAIncrementalGA::setptr(const char* name, const void* value){ int status = GAGeneticAlgorithm::setptr(name, value); if(strcmp(name, gaNnOffspring) == 0 || strcmp(name, gaSNnOffspring) == 0){ nOffspring(*((int*)value)); status = 0; } return status; } int GAIncrementalGA::get(const char* name, void* value) const { int status = GAGeneticAlgorithm::get(name, value); if(strcmp(name, gaNnOffspring) == 0 || strcmp(name, gaSNnOffspring) == 0){ *((int*)value) = noffspr; status = 0; } return status; } void GAIncrementalGA::objectiveFunction(GAGenome::Evaluator f){ GAGeneticAlgorithm::objectiveFunction(f); child1->evaluator(f); child2->evaluator(f); } void GAIncrementalGA::objectiveData(const GAEvalData& v){ GAGeneticAlgorithm::objectiveData(v); child1->evalData(v); child2->evalData(v); } GAIncrementalGA::ReplacementScheme GAIncrementalGA:: replacement(GAIncrementalGA::ReplacementScheme n, GAIncrementalGA::ReplacementFunction f){ switch(n){ case BEST: case WORST: case RANDOM: case PARENT: rs = n; break; case CUSTOM: if(f){ rs = n; rf = f; } else GAErr(GA_LOC, className(), "replacement", gaErrNeedRS); break; default: GAErr(GA_LOC, className(), "replacement", gaErrBadRS); break; } return rs; } int GAIncrementalGA::nOffspring(unsigned int value){ if(value != 1 && value != 2){ GAErr(GA_LOC, className(), "numCrossStrategy", gaErrBadCS); noffspr = 1; } else{ noffspr = value; } params.set(gaNnOffspring, value); return noffspr; } // Do some basic stupidity checks then initialize the population. We must // also initialize our temporary genomes, but we don't have to evaluate // them. Finally, reset the statistics. void GAIncrementalGA::initialize(unsigned int seed) { GARandomSeed(seed); pop->initialize(); pop->evaluate(gaTrue); stats.reset(*pop); if(!scross) GAErr(GA_LOC, className(), "initialize", gaErrNoSexualMating); } // Evolve a new generation of genomes. A steady-state GA has no 'old' // and 'new' populations - we pick from the current population and replace its // members with the new ones we create. We generate either one or two children // each 'generation'. The replacement strategy is set by the GA. void GAIncrementalGA::step() { int mut, c1, c2; GAGenome *mom, *dad; // tmp holders for selected genomes mom = &(pop->select()); dad = &(pop->select()); stats.numsel += 2; // keep track of the number of selections if(noffspr == 1){ c1 = 0; if(GAFlipCoin(pCrossover())){ stats.numcro += (*scross)(*mom, *dad, child1, (GAGenome*)0); c1 = 1; } else{ if(GARandomBit()) child1->copy(*mom); else child1->copy(*dad); } stats.nummut += (mut = child1->mutate(pMutation())); if(mut > 0) c1 = 1; stats.numeval += c1; if(rs == PARENT) child1 = pop->replace(child1, mom); else if(rs == CUSTOM) child1 = pop->replace(child1, &(rf(*child1, *pop))); else child1 = pop->replace(child1, rs); stats.numrep += 1; } else{ c1 = c2 = 0; if(GAFlipCoin(pCrossover())){ stats.numcro += (*scross)(*mom, *dad, child1, child2); c1 = c2 = 1; } else{ child1->copy(*mom); child2->copy(*dad); } stats.nummut += (mut = child1->mutate(pMutation())); if(mut > 0) c1 = 1; stats.nummut += (mut = child2->mutate(pMutation())); if(mut > 0) c2 = 1; stats.numeval += c1 + c2; if(rs == PARENT){ child1 = pop->replace(child1, mom); if(mom == dad) // this is a possibility, if so do worst child2 = pop->replace(child2, GAPopulation::WORST); else child2 = pop->replace(child2, dad); } else if(rs == CUSTOM){ child1 = pop->replace(child1, &(rf(*child1, *pop))); child2 = pop->replace(child2, &(rf(*child2, *pop))); } else{ child1 = pop->replace(child1, rs); child2 = pop->replace(child2, rs); } stats.numrep += 2; } pop->evaluate(gaTrue); // allow pop-based evaluators to do their thing stats.update(*pop); // update the statistics for this generation } gamera-3.3.3/src/ga/GAIncGA.h0000644000076500000000000000705610714675676014455 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gainc.h mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved Header file for the incremental genetic algorithm class. replacement The replacement strategy defines how the new children will be stuck into the population. If you want the new child to replace one of its parents, use the Parent strategy. If you want the child to replace a random population member, use the Random strategy. If you want the child to replace the worst population member, use the Worst strategy. These are meaningful only for overlapping populations. To do DeJong-style speciation (crowding), use the Crowding strategy. You must also specify a crowding function as the replacement function if you choose this strategy. If you use Custom as the replacement strategy you must also specify a replacement function. Note that not every replacement scheme can be used with every type of genetic algorithm. If a GA supports replacement schemes, it will specify which schemes are valid and which are not. The replacement function is required for crowding and custom replacement strategies. This function is used to pick which genome will be replaced. The first argument passed to the replacement function is the individual that is supposed to go into the population. The second argument is the population into which the individual is supposed to go. The replacement function should return a reference to the genome that the individual should replace. If no replacement should take place, the replacement function should return a reference to the individual. ---------------------------------------------------------------------------- */ #ifndef _ga_gainc_h_ #define _ga_gainc_h_ #include class GAIncrementalGA : public GAGeneticAlgorithm { public: GADefineIdentity("GAIncrementalGA", GAID::IncrementalGA); typedef GAGenome & (*ReplacementFunction)(GAGenome&, GAPopulation&); enum ReplacementScheme { RANDOM = GAPopulation::RANDOM, BEST = GAPopulation::BEST, WORST = GAPopulation::WORST, CUSTOM = -30, CROWDING = -30, PARENT = -10 }; static GAParameterList& registerDefaultParameters(GAParameterList&); public: GAIncrementalGA(const GAGenome&); GAIncrementalGA(const GAPopulation&); GAIncrementalGA(const GAIncrementalGA&); GAIncrementalGA& operator=(const GAIncrementalGA&); virtual ~GAIncrementalGA(); virtual void copy(const GAGeneticAlgorithm &); virtual void initialize(unsigned int seed=0); virtual void step(); GAIncrementalGA & operator++() { step(); return *this; } virtual int setptr(const char* name, const void* value); virtual int get(const char* name, void* value) const; virtual void objectiveFunction(GAGenome::Evaluator f); virtual void objectiveData(const GAEvalData& v); int nOffspring() const {return noffspr;} int nOffspring(unsigned int); ReplacementScheme replacement() const {return rs;} ReplacementScheme replacement(ReplacementScheme, ReplacementFunction f=0); protected: GAGenome *child1, *child2; // children that will be generated each gen ReplacementScheme rs; // replacement strategy ReplacementFunction rf; // (optional) replacement function unsigned int noffspr; // number of children to generate in crossover }; #ifndef NO_STREAMS inline ostream& operator<< (ostream& os, GAIncrementalGA & arg) { arg.write(os); return(os); } inline istream& operator>> (istream& is, GAIncrementalGA & arg) { arg.read(is); return(is); } #endif #endif gamera-3.3.3/src/ga/GAList.cpp0000644000076500000000000001333610714675676015000 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- listtmpl.C mbwall 25feb95 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the templatized list objects. TO DO: Make insert work better with size and depth so not so many recalcs needed. Implement better memory mangement, faster allocation, referencing. Use array representation of nodes so we don't have to do so much recursion. ---------------------------------------------------------------------------- */ #ifndef _ga_listtmpl_C_ #define _ga_listtmpl_C_ #include extern GANodeBASE * _GAListTraverse(unsigned int index, unsigned int & cur, GANodeBASE * node); //template GANode * _GAListCopy(GANode *, GANode *); /* ---------------------------------------------------------------------------- List ---------------------------------------------------------------------------- */ // The destructor just goes through the list and deletes every node. template GAList::~GAList() { while(hd) delete GAListBASE::remove(DYN_CAST(GANode*, hd)); iter.node = (GANodeBASE *)0; } // Yes, this is really ugly. We do a complete destruction of the existing list // then we copy the new one. No caching, no nothing. Oh well. We set the // iterator to the head node - it should be set to the corresponding node, but // I won't do that right now. THIS IS A BUG! template void GAList::copy(const GAList & orig) { while(hd) delete GAListBASE::remove(DYN_CAST(GANode*, hd)); hd = _GAListCopy(DYN_CAST(GANode*, orig.hd), DYN_CAST(GANode*, orig.hd)); iter.node = hd; sz = orig.sz; csz = orig.csz; } // This remove method returns a pointer to the contents of the node that was // removed. The node itself is destroyed. // The iterator gets set to the next node toward the head of the list. // This routine makes a copy of the node contents using the copy initializer // of the T object, so the copy initializer MUST be defined and accessible. // We return a pointer to the contents rather than the contenst for the same // reason we return a pointer from all the iter routines - we don't want to // pass big objects around. template T * GAList::remove() { GANode * node = DYN_CAST(GANode*, iter.node); if(!node) return (T *)0; if(node->prev != node) iter.node = node->prev; else iter.node = (GANodeBASE *)0; node = DYN_CAST(GANode*, GAListBASE::remove(node)); T * contents = new T(node->contents); delete node; return contents; } // Make a copy of a list and return the pointer to the new list. The cloning // is based on the value passed to this routine. A value of 0 will clone the // entire list. Any other value will clone the list from the index to the end // of the list. This routine has no effect on the iterator in the original // list. template GAList * GAList::clone(unsigned int i) const { GAList * t = new GAList; GANode * node; unsigned int w=0; if(i == 0) node = DYN_CAST(GANode*, hd); else node = DYN_CAST(GANode*, _GAListTraverse(i, w, hd)); if(!node) return t; GANode * newnode = _GAListCopy(node, DYN_CAST(GANode*, hd)); t->insert(newnode, (GANode *)0, GAListBASE::HEAD); // need to set iterator to right spot in the clone!! for now its at the head return t; } // Destroy the specified node. This uses the current node as the one to // destroy, so be sure to use the iteration methods to move to the node you // want to destroy. Once the node is gone, we set the current node to the // prev node of the one that was destroyed. If the node that was nuked was the // head node then we set the current node to the new head. template int GAList::destroy() { GANodeBASE * node = iter.node; if(!node) return GAListBASE::NO_ERR; if(node->prev && node->prev != node) if(hd == node) iter.node = node->next; else iter.node = node->prev; else iter.node = (GANodeBASE *)0; delete GAListBASE::remove(node); return GAListBASE::NO_ERR; } // Swap two nodes in the list. This has no effect on the size or the iterator. // If either index is out of bounds then we don't do anything. template int GAList::swap(unsigned int a, unsigned int b) { if(a == b || a > (unsigned int)size() || b > (unsigned int)size()) return GAListBASE::NO_ERR; GANodeBASE *tmp=hd, *anode=(GANodeBASE *)0, *bnode=(GANodeBASE *)0; unsigned int cur=0; while(tmp && tmp->next != hd){ if(a == cur) anode = tmp; if(b == cur) bnode = tmp; tmp = tmp->next; cur++; } if(a == cur) anode = tmp; if(b == cur) bnode = tmp; return GAListBASE::swapnode(anode,bnode); } /* ---------------------------------------------------------------------------- Utility routines for the List objects ---------------------------------------------------------------------------- */ // Copy a node, including all of its siblings up to the end of the list. We do // NOT wrap around the list until we return the first node - we stop at the // tail of the list. Return the pointer to the first node in the list. template GANode * _GAListCopy(GANode * node, GANode * head) { if(!node) return (GANode *)0; GANode *newnode = new GANode(node->contents); GANode *lasttmp = newnode, *newtmp = (GANode *)0; GANode *tmp = DYN_CAST(GANode*, node->next); while(tmp && tmp != head){ newtmp = new GANode(tmp->contents); newtmp->prev = lasttmp; lasttmp->next = newtmp; lasttmp = newtmp; tmp = DYN_CAST(GANode*, tmp->next); } if(newtmp){ newtmp->next = newnode; newnode->prev = newtmp; } else{ newnode->next = newnode; newnode->prev = newnode; } return newnode; } #endif gamera-3.3.3/src/ga/GAList.h0000644000076500000000000001737410714675676014453 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- listtmpl.h mbwall 25feb95 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the template-ized list objects. ---------------------------------------------------------------------------- */ #ifndef _ga_listtmpl_h_ #define _ga_listtmpl_h_ #include #include /* ---------------------------------------------------------------------------- GAList ------------------------------------------------------------------------------- This object is a container for nodes that have a list structure. The base list object is responsible for maintaining the list heirarchy. This object is responsible for doing the memory management (allocating and de-allocating the nodes in the list). We insulate the user entirely from nodes - when you use a list, you don't get nodes back, you get the contents of nodes (ie the user doesn't have to think about the list parts of a node, they can simply assume that their data is organized into a list structure). We include an iterator in this object so that you can navigate through the list. You can create another iterator and assign it to your list so you can have multiple iterators. All of the actions take place relative to the current location of the embedded iterator. None of the iterators change the state of the list. Be careful so that you don't end up with an iterator dangling with a pointer to a part of a list that no longer exists (I would need some kind of reference counting and/or message passing to take care of this at a lower level, and I'm not ready to implement that at this point). For now we allocate nodes on the fly. Eventually I would like to do some better memory management (arrays perhaps?) so we don't have to do so much alloc and dealloc and recursion. We depend on the template-ized GAListIter routine, thus the declaration. copy Make a complete copy of the list and return a pointer to the new list. remove Remove the current node from the list, free the memory used by the node, and return a pointer to a copy of the object that the node contained. destroy Remove the current node from the list and free the memory it was using. Destroys the object that the node contained. insert - list Inserts the contents of list in to the current list and removes it from the original list. Does NOT delete the original list, but DOES assume responsibility for the memory used by the contents of the original list. insert - object Insert the object into the list at the specified place relative to the current location of the embedded iterator. current, head, tail, next, prev, warp These iterator methods are defined as access to the embedded iterator of the list. Use these methods to move the insertion point and to traverse the list. You can also create other iterators for this list, but they won't affect the contents. ---------------------------------------------------------------------------- */ template class GAListIter; template class GAList : public GAListBASE { public: GAList() : GAListBASE() { iter(*this); } GAList(const T & t):GAListBASE(new GANode(t)), iter(*this) {} GAList(const GAList & orig){iter(*this); copy(orig);} GAList & operator=(const GAList & orig) {if(&orig != this) copy(orig); return *this;} virtual ~GAList(); GAList * clone(unsigned int i=0) const; // methods that modify the state of the list void copy(const GAList & orig); int destroy(); int swap(unsigned int, unsigned int); T * remove(); int insert(GAList * t, GAListBASE::Location where=GAListBASE::AFTER){ if(this == t){ GAErr(GA_LOC, "GAList", "insert", gaErrCannotInsertIntoSelf); return GAListBASE::ERR; } if(GAListBASE::insert(t->hd, iter.node, where) == GAListBASE::ERR){ return GAListBASE::ERR; } iter.node = (t->hd ? t->hd : iter.node); t->hd=(GANodeBASE *)0; t->iter.node=(GANodeBASE *)0; return GAListBASE::NO_ERR; } int insert(const T & t, GAListBASE::Location where=GAListBASE::AFTER){ GANode * c = new GANode(t); if(GAListBASE::insert(c, iter.node, where) == GAListBASE::ERR){ delete c; return GAListBASE::ERR; } iter.node = c; return GAListBASE::NO_ERR; } // typesafes on iteration methods. These call the built-in iterator then // return the contents of the now-current node. They do not affect the state // of the list. T * head(){return iter.head();} T * tail(){return iter.tail();} T * current(){return iter.current();} T * next(){return iter.next();} T * prev(){return iter.prev();} T * warp(unsigned int i){return iter.warp(i);} T * warp(const GAListIter & i) {return((i.list == this) ? iter.warp(i) : (T *)0);} T * operator[](unsigned int i){return iter.warp(i);} protected: int insert(GANode *n, GANode *idx, GAListBASE::Location where=GAListBASE::AFTER){ if(GAListBASE::insert(n, idx, where) == GAListBASE::ERR) return GAListBASE::ERR; iter.node = n; return GAListBASE::NO_ERR; } GAListIter iter; // the embedded iterator friend class GAListIter; }; /* ---------------------------------------------------------------------------- GAListIter ------------------------------------------------------------------------------- This is a type-safe derivation of the base ListIter object. I copied the methods from the base class (I know, a no-no) rather than doing calls to the base class methods. We depend on the template-ized GAList, thus the declaration. Behaviour for the iterator methods is defined as follows. If the current node is null, attempts to access a derived position from the current position will return NULL. The only way to reset the current node is to call the head() locater (you always have to start at the list head to navigate the list). If the current node is non-null and the derived node is null, the current node is NOT changed, but NULL is returned. You can also warp to a new position if you have another iterator or a list with an embedded iterator. When we create a new list iterator, it defaults to the same node as the one used to create it. If it is created with a list as its argument, it defaults to the list's iterator's current position. ---------------------------------------------------------------------------- */ template class GAList; template class GAListIter : public GAListIterBASE { public: GAListIter() : GAListIterBASE(){} GAListIter(const GAList & t) : GAListIterBASE(t){node=t.iter.node;} GAListIter(const GAListIter & i) : GAListIterBASE(i){} T * current() {return(node ? &((GANode *)node)->contents : (T *)0);} T * head() {return(((node=GAListIterBASE::head()) != (GANodeBASE *)0) ? &((GANode *)GAListIterBASE::head())->contents : (T *)0);} T * tail() {return(((node=GAListIterBASE::tail()) != (GANodeBASE *)0) ? &((GANode *)GAListIterBASE::tail())->contents : (T *)0);} T * next() {return((node && node->next) ? &((GANode *)(node=node->next))->contents : (T *)0);} T * prev() {return((node && node->prev) ? &((GANode *)(node=node->prev))->contents : (T *)0);} T * warp(const GAList & t){ list = &t; node = t.iter.node; return(t.iter.node ? &((GANode *)(node=t.iter.node))->contents :(T *)0); } T * warp(const GAListIter & i){ list = i.list; node = i.node; return(i.node ? &((GANode *)(node=i.node))->contents : (T *)0); } T * warp(unsigned int i){ GANodeBASE * n = GAListIterBASE::warp(i); return(n ? &((GANode *)(node=n))->contents : (T *)0); } private: friend class GAList; // do I need to do this? }; #ifdef USE_BORLAND_INST #include #endif #endif gamera-3.3.3/src/ga/GAListBASE.cpp0000644000076500000000000002011010714675676015417 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- listbase.C mbwall 10dec94 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the list objects. TO DO: Make insert work better with size and depth so not so many recalcs needed. Implement better memory mangement, faster allocation, referencing. Use array representation of nodes so we don't have to do so much recursion. ---------------------------------------------------------------------------- */ #include #include GANodeBASE * _GAListTraverse(unsigned int index, unsigned int & cur, GANodeBASE * node); /* ---------------------------------------------------------------------------- ListBASE ---------------------------------------------------------------------------- */ // Insert node n into the list relative to node idx. There are three different // insertion modes: head, before, and after. If there is no head node, // then the node n becomes the head no matter what. // We have to check to see if the node that is going in is an isolated node // or contains other nodes. If it is linked to other nodes, then we put the // entire set of nodes into the list. If the nodes' prev and next are NULL or // point to itself, then we stick only it into the list. // head: idx is ignored. The previous head pointer becomes 'next' to the // new head. // before: If node idx is the first in a row in the list, then n becomes // the first in the row. If idx is the head node, then we post an error // message (can't have more than one head node). // after: If the node idx is the last in a row, n becomes the last node. If // idx is the head node, we post an error. int GAListBASE::insert(GANodeBASE * n, GANodeBASE * idx, Location where) { if(!n) return NO_ERR; if(!idx){ if(!hd) where = HEAD; else if(where != HEAD && where != TAIL){ GAErr(GA_LOC, "GAListBASE", "insert", gaErrCannotInsertOnNilNode); return ERR; } } GANodeBASE * last = (n->prev && n->prev != n) ? n->prev : n; switch(where){ case HEAD: if(hd){ last->next = hd; n->prev = hd->prev; hd->prev->next = n; hd->prev = last; } hd = n; if(!hd->next) hd->next = hd; if(!hd->prev) hd->prev = hd; break; case TAIL: if(hd){ last->next = hd; n->prev = hd->prev; hd->prev->next = n; hd->prev = last; } else{ hd = n; if(!hd->next) hd->next = hd; if(!hd->prev) hd->prev = hd; } break; case BEFORE: last->next = idx; n->prev = idx->prev; idx->prev->next = n; idx->prev = last; break; case AFTER: n->prev = idx; last->next = idx->next; idx->next->prev = last; idx->next = n; break; default: GAErr(GA_LOC, "GAListBASE", "insert", gaErrBadWhereIndicator); break; } csz = 1; return NO_ERR; } // Remove the specified node from the list. We don't cruise through the list // to make certain that the node is in the list. But we do check to make sure // that the connections were ok before we prune the node. If there is any // problem with the links, we return a NULL. If we get a NULL node, then we // don't do anything. // We don't do anything to the next, prev, etc links of the node that is // being removed (they are left pointing to where they used to point) so be // careful!! // If the removal is on the head node, set the head node to the next node. GANodeBASE * GAListBASE::remove(GANodeBASE * n) { if(!n) return (GANodeBASE *)0; if(n->next && n->next != n){ // reset links on neighbors if they exist n->prev->next = n->next; n->next->prev = n->prev; } if(n == hd){ // reset head node if needed if(n->next != n) hd = n->next; else hd = (GANodeBASE *)0; } // uncomment these to modify the node that is getting removed // n->prev = n; // n->next = n; csz = 1; return n; } // Swap the specified nodes. If we get NULL nodes or the nodes are the same, // don't do anything. This moves the two nodes. Note // that swapping two nodes shouldn't change the size or depth of the list, so // we don't set the change flags. // If either of the nodes is the head of the list, we change the head to // point to the node that got swapped. Note that if you pass nodes that are // in different trees and one of the nodes is a head node, you'll lose an // entire list! // There is a special case we must handle when the nodes are adjacent. We // assume that the nodes are intact - we don't check for bogus node // configurations. We assume that there are no NULL prev or next pointers on // either node. // For now we assume that both nodes are in the same list. If we ever // implement a swap that operates on two lists then we'll have to change // that... int GAListBASE::swapnode(GANodeBASE * a, GANodeBASE * b) { if(!a || !b || a == b) return NO_ERR; GANodeBASE * aprev = a->prev; GANodeBASE * anext = a->next; GANodeBASE * bprev = b->prev; GANodeBASE * bnext = b->next; if(anext == b && bnext == a){ // do nothing - check for head/tail at end } else if(anext == b){ // same as b->prev == a a->prev = b; a->next = bnext; b->prev = aprev; b->next = a; aprev->next = b; bnext->prev = a; } else if(bnext == a){ // same as a->prev == b a->prev = bprev; a->next = b; b->prev = a; b->next = anext; anext->prev = b; bprev->next = a; } else{ // a and b are not adjacent if(bprev == b || bnext == b){ a->prev = a; a->next = a; } else{ a->prev = bprev; a->next = bnext; bprev->next = a; bnext->prev = a; } if(aprev == a || anext == a){ b->prev = b; b->next = b; } else{ b->prev = aprev; b->next = anext; aprev->next = b; anext->prev = b; } } if(hd == a) hd = b; // this only works if they're in the same list! else if(hd == b) hd = a; return NO_ERR; } // Return the number of nodes in the list. We do a complete traversal of the // list and count the number of nodes that we encounter. Could do this breadth // first or depth first - doesn't really matter. We have to traverse the // entire list to do the count. // We have to do a little work-around here to get through the const-ness of // the size method. Its ok to call size on a const object because it does not // modify the logical state of the object. It does, however, modify the // physical state of the object. So to work around the strictness of the // const specifier, we do a little pointer magic and cast this to be non-const. int GAListBASE::size() const { if(!csz) return sz; GAListBASE * This = CON_CAST(GAListBASE *, this); This->csz = 0; if(hd == (GANodeBASE *)0) return This->sz=0; GANodeBASE * tmp = hd; This->sz=1; while(tmp && tmp->next != hd){ tmp = tmp->next; This->sz++; } return This->sz; } /* ---------------------------------------------------------------------------- ListIterBASE ---------------------------------------------------------------------------- */ // Set the current node to the node indexed by the integer x. If x is out of // bounds, we don't do anything to the state of the iterator and return NULL. GANodeBASE * GAListIterBASE::warp(unsigned int x) { unsigned int cur=0; return(_GAListTraverse(x, cur, GAListIterBASE::head())); } /* ---------------------------------------------------------------------------- utilities ---------------------------------------------------------------------------- */ // Traverse the list until we come to the indexed node. Return NULL if // cur != index. We count relative to the node that is passed to this routine // so to get an absolute count, pass 0 for 'cur' and the root node for 'node'. // If the index is out of bounds, we return NULL. GANodeBASE * _GAListTraverse(unsigned int index, unsigned int & cur, GANodeBASE * node) { if(!node) return (GANodeBASE *)0; GANodeBASE * tmp = node; while(cur < index && tmp && tmp->next != node){ tmp = tmp->next; cur++; } if(cur != index) tmp = 0; // we didn't find the right node return tmp; } gamera-3.3.3/src/ga/GAListBASE.h0000644000076500000000000001606410714675676015101 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- listbase.h mbwall 25nov94 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the list objects. TO DO: Probably should put the size (and depth for trees) into the templateized class since those take care of memory management. BASE class has no concept of memory management, nor does it know the best way to count what its got. ---------------------------------------------------------------------------- */ #ifndef _ga_listbase_h_ #define _ga_listbase_h_ #include /* ---------------------------------------------------------------------------- GAListBASE ------------------------------------------------------------------------------- This is the base list class from which template lists are derived. This object does no memory management - it just keeps track of a list structure. Whoever calls the members of this object is responsible for allocating and deallocating the memory associated with each node. This class does not define any of the iteration operators for traversing the list. That is left to the iterator friend of this class. The iterator class is declared as a friend so that it can access our internals. It iterates over the list without changing anything. We have to break through the const-ness of the list in order to make things work properly. When you ask for the size of a list, you don't change the size but you do (possibly) change the value of the sz member. This doesn't change the state of the tree, so it is, in effect, a const-correct operation. But const is too strict, so we have to work around it. See the size() definition to see how this is done. Beware that copying this object will copy pointers, NOT the contents of the pointers. You cannot simply say list1 = list2 or GAListBASE l = list1. If you do this, you'll get a copy of the list object, but not a duplicate of the list. creation You can create a list by passing a node (the node becomes the head of the list) or by passing nothing (the head of the list is NULL, and the next insert automatically becomes the head). insert Stick a node into the list. Where the node goes depends on the second node and the value of the flag. There are three flag values: head, before, and after. The flag specifies where the new node should go relative to the old node. If you don't pass a value for flag, it defaults to after. The syntax for using the insert method looks like this: mylist.insert(newnode, oldnode, GAListBASE::before); mylist.insert(newnode, oldnode); The node can be a member of a list. If it is, then the list will be broken just previous to the node, then inserted into the list. If the insert was successful, return NO_ERR. If there was a problem, return ERR. remove Remove the specified node from the list. If the node does not exist, an ERR message is posted and NULL is returned. The node is returned if the removal is successful, otherwise NULL. swapnode Switch nodes a and b in the list. Leave the rest of the list intact. If the swap was successful, return NO_ERR. If there was a problem, return ERR. size How many nodes are in the list? We keep a flag to tell us if any operation has been performed that would require a recalculation of the size. If you change the contents of the list using any method other than those in this object (which you could do, by the way) then you risk screwing up the count. ---------------------------------------------------------------------------- */ class GAListBASE { public: enum Location {HEAD=0, TAIL, BEFORE, AFTER}; // values for 'where' to insert enum {NO_ERR=0, ERR= -1}; // return codes GAListBASE(){hd=(GANodeBASE *)0; sz=0; csz=0;} GAListBASE(GANodeBASE * n){hd=n; csz=1;} GANodeBASE * remove(GANodeBASE * n); int insert(GANodeBASE * n, GANodeBASE * idx, Location where=AFTER); int swapnode(GANodeBASE * a, GANodeBASE * b); int size() const; protected: int sz, csz; // number of nodes, have contents changed? GANodeBASE *hd; // the head node of the list private: GAListBASE(const GAListBASE &){} // copying is not allowed GAListBASE & operator=(const GAListBASE &){return *this;} // or op= friend class GAListIterBASE; }; /* ---------------------------------------------------------------------------- GAListIterBASE ------------------------------------------------------------------------------- This is the base class for iterators for the list objects. We define this class separately from the List object so that you can have multiple interators for each list and so that you can more easily customize the traversal algorithms within the iterator. From the object point of view, the way you traverse a list is independent of how you represent the list. Like the ListBASE object, this object doesn't do any memory allocation or deallocation. All we do is provide list traversal. Notice that we keep a 'current location' in the list - whatever your last query was is stored as the node, so if you refer to the current member, you'll get your last query. If you pass a NULL node to these routines they will not break; passing a NULL will result in a no-op, and NULL will be returned. creation When you create an iterator, you should pass another iterator (the new one will copy the first) or a list (the iterator will default to the head node of the list). current, head, tail, next, prev, warp Set the iterator to the specified node and return a pointer to the node that the iterator now points to. If current is NULL or a NULL is passed to one of these routines, a NULL is returned and the iterator does not move. warp Move the iterator to the node referenced by index. The head node is node '0' then the count increases from there. ---------------------------------------------------------------------------- */ class GAListIterBASE { public: GAListIterBASE(){node=(GANodeBASE *)0; list=(GAListBASE *)0;} GAListIterBASE(const GAListBASE & t){list = &t; node = t.hd;} GAListIterBASE(const GAListIterBASE & i){list = i.list; node = i.node;} void operator()(const GAListBASE & t){list = &t; node = t.hd;} GANodeBASE * current(GANodeBASE * c) {return(c ? (node=c) : (GANodeBASE *)0);} GANodeBASE * current(){return node;} GANodeBASE * next(){return(node ? (node=node->next) : (GANodeBASE *)0);} GANodeBASE * next(GANodeBASE * c) {return(c ? (node=c->next) : (GANodeBASE *)0);} GANodeBASE * prev(){return(node ? (node=node->prev) : (GANodeBASE *)0);} GANodeBASE * prev(GANodeBASE * c) {return(c ? (node=c->prev) : (GANodeBASE *)0);} GANodeBASE * head(){return(list ? (node=list->hd) : (GANodeBASE *)0);} GANodeBASE * tail() {return((list && list->hd)?(node=list->hd->prev) : (GANodeBASE *)0);} GANodeBASE * warp(unsigned int); GANodeBASE * warp(const GAListIterBASE & i){ list=i.list; node=(GANodeBASE *)0; return(i.node ? (node=i.node) : (GANodeBASE *)0); } int size(){return(list ? list->size() : 0);} protected: GANodeBASE * node; const GAListBASE * list; }; #endif gamera-3.3.3/src/ga/GAListGenome.cpp0000644000076500000000000004312010714675676016125 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- list.C mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the list genome. ---------------------------------------------------------------------------- */ #ifndef _ga_list_C_ #define _ga_list_C_ #include #include #include #include #include template int GAListIsHole(const GAListGenome&, const GAListGenome&, int, int, int); template const char * GAListGenome::className() const {return "GAListGenome";} template int GAListGenome::classID() const {return GAID::ListGenome;} template GAListGenome::GAListGenome(GAGenome::Evaluator f, void * u) : GAList(), GAGenome(DEFAULT_LIST_INITIALIZER, DEFAULT_LIST_MUTATOR, DEFAULT_LIST_COMPARATOR) { evaluator(f); userData(u); crossover(DEFAULT_LIST_CROSSOVER); } template GAListGenome::GAListGenome(const GAListGenome & orig) : GAList(), GAGenome() { GAListGenome::copy(orig); } template GAListGenome::~GAListGenome() { } template GAGenome * GAListGenome::clone(GAGenome::CloneMethod flag) const { GAListGenome *cpy = new GAListGenome(); if(flag == (int)CONTENTS){cpy->copy(*this);} // the cast is for metrowerks... else{cpy->GAGenome::copy(*this);} return cpy; } template void GAListGenome::copy(const GAGenome & orig){ if(&orig == this) return; const GAListGenome* c = DYN_CAST(const GAListGenome*, &orig); if(c) { GAGenome::copy(*c); GAList::copy(*c); } } #ifndef NO_STREAMS // Traverse the list (breadth-first) and dump the contents as best we can to // the stream. We don't try to write the contents of the nodes - we simply // write a . for each node in the list. template int GAListGenome::write(ostream & os) const { os << "node next prev contents\n"; if(!hd) return 0;; os.width(10); os << hd << " "; os.width(10); os << hd->next << " "; os.width(10); os << hd->prev << " "; os.width(10); os << &(DYN_CAST(GANode*, hd)->contents) << "\n"; for(GANodeBASE * tmp=hd->next; tmp && tmp != hd; tmp=tmp->next){ os.width(10); os << tmp << " "; os.width(10); os << tmp->next << " "; os.width(10); os << tmp->prev << " "; os.width(10); os << &(DYN_CAST(GANode*, tmp)->contents) << "\n"; } return 0; } #endif // Both the == and != operators assume that both operator== and operator!= are // defined for the object that is store in the node of your list. If it is // not, you'll get an error message. If you're storing pointers in the nodes, // then you have nothing to worry about. // Neither of these operators affects the internal iterator of either // list genome in any way. template int GAListGenome::equal(const GAGenome & c) const { if(this == &c) return 1; const GAListGenome & b = DYN_CAST(const GAListGenome&, c); if(size() != b.size()) return 0; GAListIter iterA(*this), iterB(b); T *tmpA = iterA.head(), *tmpB = iterB.head(); T *head = tmpA; do{ if(tmpA && tmpB && *tmpA != *tmpB) return gaFalse; tmpB = iterB.next(); tmpA = iterA.next(); }while(tmpA && tmpA != head); return 1; } /* ---------------------------------------------------------------------------- Operator definitions ---------------------------------------------------------------------------- */ // Mutate a list by nuking nodes. Any node has a pmut chance of getting nuked. // This is actually kind of bogus for the second part of the if clause (if nMut // is greater than or equal to 1). Nodes end up having more than pmut // probability of getting nuked. // After the mutation the iterator is left at the head of the list. template int GAListGenome::DestructiveMutator(GAGenome & c, float pmut) { GAListGenome &child=DYN_CAST(GAListGenome &, c); register int n, i; if(pmut <= 0.0) return 0; n = child.size(); float nMut = pmut * STA_CAST(float, n); if(nMut < 1.0){ // we have to do a flip test for each node nMut = 0; for(i=0; i int GAListGenome::SwapMutator(GAGenome & c, float pmut) { GAListGenome &child=DYN_CAST(GAListGenome &, c); register int n, i; if(pmut <= 0.0) return 0; n = child.size(); float nMut = pmut * STA_CAST(float,n); nMut *= 0.5; // swapping one node swaps another as well if(nMut < 1.0){ // we have to do a flip test for each node nMut = 0; for(i=0; i float GAListGenome::NodeComparator(const GAGenome& a, const GAGenome& b) { if(&a == &b) return 0; const GAListGenome& sis=DYN_CAST(const GAListGenome&, a); const GAListGenome& bro=DYN_CAST(const GAListGenome&, b); if(sis.size() > bro.size()) return (float)(sis.size() - bro.size()); if(sis.size() < bro.size()) return (float)(bro.size() - sis.size()); if(sis.size() == 0) return 0; float count = 0; GAListIter biter(bro), siter(sis); T *sptr, *bptr; for(int i=siter.size()-1; i>=0; i--) { sptr = siter.next(); bptr = biter.next(); if(sptr != 0 && bptr != 0) count += ((*sptr == *bptr) ? 0 : 1); } return count; } #define SWAP(a,b) {unsigned int tmp=a; a=b; b=tmp;} // This crossover picks a site between nodes in each parent. It is the same // as single point crossover on a resizeable binary string genome. The site // in the mother is not necessarily the same as the site in the father! // When we pick a crossover site, it is between nodes of the list (otherwise // we won't be able to do NULL lists or get an empty list from one parent or // the other). Beware that a list is numbered from 0 to size-1, inclusive, // whereas the cross site possibilities are numbered from 0 to size, inclusive. // This means we have to map the site to the list to determine whether an // insertion should occur before or after a node. // We first copy the mother into the child (this deletes whatever contents // were in the child originally). Then we clone the father from the cross site // to the end of the list. Then we delete the tail of the child from the // mother's cross site to the end of the list. Finally, we insert the clone // at the end of the child. // The last thing we do is delete the clone (the contents of the clone are // now owned by the child, but the clone itself uses memory that we must free). // This implementation isn't particularly efficient. For example, we copy // the mother then proceed to destroy much of the copy we just made. We could // do better by copying only what we need of the mother. template int GAListGenome:: OnePointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GAListGenome &mom=DYN_CAST(const GAListGenome &, p1); const GAListGenome &dad=DYN_CAST(const GAListGenome &, p2); int nc=0; int a = GARandomInt(0, mom.size()); int b = GARandomInt(0, dad.size()); GAList * list; if(c1){ GAListGenome &sis=DYN_CAST(GAListGenome &, *c1); sis.GAList::copy(mom); list = dad.GAList::clone(b); if(a < mom.size()){ T *site = sis.warp(a); while(sis.tail() != site) sis.destroy(); // delete the tail node sis.destroy(); // trash the trailing node (list[a]) } else{ sis.tail(); // move to the end of the list } sis.insert(list); // stick the clone onto the end delete list; sis.head(); // set iterator to head of list nc += 1; } if(c2){ GAListGenome &bro=DYN_CAST(GAListGenome &, *c2); bro.GAList::copy(dad); list = mom.GAList::clone(a); if(b < dad.size()){ T *site = bro.warp(b); while(bro.tail() != site) bro.destroy(); // delete the tail node bro.destroy(); // trash the trailing node (list[a]) } else{ bro.tail(); // move to the end of the list } bro.insert(list); // stick the clone onto the end delete list; bro.head(); // set iterator to head of list nc += 1; } return nc; } // Partial match crossover for list genomes. We need two versions of this // routine: one for lists whose nodes are pointers to objects (each genome // points to the same objects as all of the other genomes) and one for // lists whose nodes contain independent objects (each node has its own copy // of the object). // This version of the partial match crossover uses objects that are multiply // instantiated - each list genome contains its own objects in its nodes. // The operator== method must be defined on the object for this implementation // to work! In this case, the 'object' is an int, so we're OK. If you are // putting your own objects in the nodes, be sure you have operator== defined // for your object. You must also have operator!= defined for your object. We // do not do any assignments, so operator= and/or copy is not required. // We assume that none of the nodes will return a NULL pointer. Also assume // that the cross site has been selected properly. // First we make a copy of the mother. Then we loop through the match // section and try to swap each element in the child's match section with its // partner (as defined by the current node in the father's match section). // Mirroring will work the same way - just swap mom & dad and you're all set. // The parents should be the same size as the child (and they should contain // the same nodes, but in any order). We do not check for this!! template int GAListGenome:: PartialMatchCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GAListGenome &mom=DYN_CAST(const GAListGenome &, p1); const GAListGenome &dad=DYN_CAST(const GAListGenome &, p2); if(mom.size() != dad.size()){ GAErr(GA_LOC, mom.className(), "cross", gaErrBadParentLength); return 0; } int a = GARandomInt(0, mom.size()); int b = GARandomInt(0, dad.size()); if(b &sis=DYN_CAST(GAListGenome &, *c1); sis.GAList::copy(mom); GAListIter diter(dad); index = diter.warp(a); for(i=a; isize } } sis.head(); // set iterator to head of list nc += 1; } if(c2){ GAListGenome &bro=DYN_CAST(GAListGenome &, *c2); bro.GAList::copy(dad); GAListIter miter(mom); index = miter.warp(a); for(i=a; isize } } bro.head(); // set iterator to head of list nc += 2; } return nc; } // Order crossover for lists. As described in Goldberg's book. // We assume that we'll never get a NULL pointer while iterating through the // list. Also we assume that the lists are the same size and non-NULL. template int GAListIsHole(const GAListGenome &child, const GAListGenome &parent, int index, int a, int b){ GAListIter citer(child), piter(parent); citer.warp(index); piter.warp(a); for(int i=a; i int GAListGenome:: OrderCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GAListGenome &mom=DYN_CAST(const GAListGenome &, p1); const GAListGenome &dad=DYN_CAST(const GAListGenome &, p2); if(mom.size() != dad.size()){ GAErr(GA_LOC, mom.className(), "cross", gaErrBadParentLength); return 0; } int a = GARandomInt(0, mom.size()); int b = GARandomInt(0, dad.size()); if(b &sis=DYN_CAST(GAListGenome &, *c1); sis.GAList::copy(mom); GAListIter siter(sis); GAListIter diter(dad); // Move all the 'holes' into the crossover section and maintain the ordering of // the non-hole elements. for(i=0, index=b; i= sis.size()) index=0; if(GAListIsHole(sis,dad,index,a,b)) break; } for(; i= sis.size()) index=0; j=index; do{ j++; if(j >= sis.size()) j=0; } while(GAListIsHole(sis,dad,j,a,b)); sis.swap(index,j); } // Now put the 'holes' in the proper order within the crossover section. for(i=a, sis.warp(a), diter.warp(a); i &bro=DYN_CAST(GAListGenome &, *c2); bro.GAList::copy(dad); GAListIter biter(bro); GAListIter miter(mom); // Move all the 'holes' into the crossover section and maintain the ordering of // the non-hole elements. for(i=0, index=b; i= bro.size()) index=0; if(GAListIsHole(bro,mom,index,a,b)) break; } for(; i= bro.size()) index=0; j=index; do{ j++; if(j >= bro.size()) j=0; } while(GAListIsHole(bro,mom,j,a,b)); bro.swap(index,j); } // Now put the 'holes' in the proper order within the crossover section. for(i=a, bro.warp(a), miter.warp(a); i int GAListGenome:: CycleCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GAListGenome &mom=DYN_CAST(const GAListGenome &, p1); const GAListGenome &dad=DYN_CAST(const GAListGenome &, p2); if(mom.size() != dad.size()){ GAErr(GA_LOC, mom.className(), "cross", gaErrBadParentLength); return 0; } GAMask mask; mask.size(mom.size()); mask.clear(); int i, nc=0; if(c1){ GAListGenome &sis=DYN_CAST(GAListGenome &, *c1); sis.GAList::copy(mom); GAListIter diter(dad); // Cycle through mom & dad to get the cyclic part of the crossover. mask[0] = 1; diter.head(); while(*diter.current() != *sis.head()){ for(i=0; i &bro=DYN_CAST(GAListGenome &, *c2); bro.GAList::copy(dad); GAListIter miter(mom); // Cycle through mom & dad to get the cyclic part of the crossover. mask[0] = 1; miter.head(); while(*miter.current() != *bro.head()){ for(i=0; i #include /* ---------------------------------------------------------------------------- ListGenome ------------------------------------------------------------------------------- ---------------------------------------------------------------------------- */ template class GAListGenome : public GAList, public GAGenome { protected: using GAList::hd; public: using GAList::size; GADeclareIdentity(); static int DestructiveMutator(GAGenome &, float); static int SwapMutator(GAGenome &, float); static float NodeComparator(const GAGenome&, const GAGenome&); static int OnePointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int PartialMatchCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int OrderCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static int CycleCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); public: GAListGenome(GAGenome::Evaluator f=0, void * u=(void *)0); GAListGenome(const GAListGenome &); GAListGenome & operator=(const GAGenome & orig) {copy(orig); return *this;} virtual ~GAListGenome(); virtual GAGenome *clone(GAGenome::CloneMethod flag=CONTENTS) const; virtual void copy(const GAGenome &); #ifndef NO_STREAMS virtual int write (ostream & os=cout) const; #endif virtual int equal(const GAGenome & c) const; // Here we do inlined versions of the access members of the super class. We // do our own here so that we can set/unset the _evaluated flag appropriately. int destroy() { _evaluated = gaFalse; return GAList::destroy(); } int swap(unsigned int i, unsigned int j) { _evaluated = gaFalse; return GAList::swap(i,j); } T * remove() { _evaluated = gaFalse; return GAList::remove(); } int insert(GAList * t, GAListBASE::Location where=GAListBASE::AFTER) { _evaluated = gaFalse; return GAList::insert(t, where); } int insert(const T & t, GAListBASE::Location where=GAListBASE::AFTER) { _evaluated = gaFalse; return GAList::insert(t, where); } }; #ifdef USE_BORLAND_INST #include #endif #endif gamera-3.3.3/src/ga/GAMask.h0000644000076500000000000000241610714675676014422 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- binstr1.h mbwall 19apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved ---------------------------------------------------------------------------- */ #ifndef _ga_mask_h_ #define _ga_mask_h_ #include #define GA_MASK_TYPE char class GAMask { public: GAMask() { _n=0; _mask=(GA_MASK_TYPE*)0; } GAMask(const GAMask& m) { _n=0; _mask=(GA_MASK_TYPE*)0; copy(m); } GAMask& operator=(const GAMask& m) { copy(m); return *this; } ~GAMask() { delete [] _mask; } void copy(const GAMask& m) { size(m.size()); memcpy(_mask, m._mask, _n*sizeof(GA_MASK_TYPE)); } void clear() { memset(_mask, 0, _n*sizeof(GA_MASK_TYPE)); } int size() const {return _n;} int size(unsigned int s){ if(s > _n){ _n = s; delete [] _mask; _mask = new GA_MASK_TYPE [_n]; } return _n; } GA_MASK_TYPE mask(unsigned int i) const { return _mask[i]; } GA_MASK_TYPE & mask(unsigned int i) { return _mask[i]; } GA_MASK_TYPE operator[] (unsigned int i) const { return _mask[i]; } GA_MASK_TYPE & operator[] (unsigned int i) { return _mask[i]; } protected: GA_MASK_TYPE * _mask; unsigned int _n; }; #endif gamera-3.3.3/src/ga/GANode.h0000644000076500000000000000710310714675676014412 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- node.h mbwall 25nov94 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the node objects. ---------------------------------------------------------------------------- */ #ifndef _ga_node_h_ #define _ga_node_h_ #include /* ---------------------------------------------------------------------------- GANodeBASE ------------------------------------------------------------------------------- This is the basic node object. In its basic form it should be useful for trees, lists, and some graphs. I debated whether to make two different objects for tree and list nodes, but decided for now to make them the same. ---------------------------------------------------------------------------- */ struct GANodeBASE { GANodeBASE *next, *prev, *parent, *child; GANodeBASE() {next=0; prev=0; parent=0; child=0;} GANodeBASE(GANodeBASE *n, GANodeBASE *p, GANodeBASE *par, GANodeBASE *chi) {next=n; prev=p; parent=par; child=chi;} virtual ~GANodeBASE() {} }; #ifndef NO_STREAMS inline ostream & operator<<(ostream & os, GANodeBASE & arg){ os << " node: " << &arg << "\n"; os << " next: " << arg.next << "\n"; os << " prev: " << arg.prev << "\n"; os << " child: " << arg.child << "\n"; os << " parent: " << arg.parent << "\n"; return(os); } #endif /* ---------------------------------------------------------------------------- GANode ------------------------------------------------------------------------------- This node is a container for any kind of object you want to put into a list. Since it is a sub-class of the BASE node object, it inherits all of the next, prev, etc members of that class. All we add here is support for the type- specific contents. Beware of what you put in for the type. Remember that it can be expensive to use an object rather than a pointer (if you have big objects, for example). We define this template using the object rather than a pointer so that it can be use for ints, chars, or other small objects. If you are going to contain a large object, you should instantiate it as a pointer to the object, not the object itself. Note also that we use the copy constructor to intialize the object rather than doing an assignment! This assumes that the object you put into this container has a properly functioning copy initializer and avoids the default construction followed by assignment that you'd get with operator=. You must have a copy creator defined for any object that goes into the nodes. The operator= must defined as well (it is used when the node contents get reassigned). We do not allow the nodes to be created without any arguments. Summary of methods your object must have: copy initializer operator= The node always owns its contents; when the node is destroyed, the contents of the node get destroyed as well. ---------------------------------------------------------------------------- */ template struct GANode : public GANodeBASE { T contents; // GANode() : GANodeBASE(), contents() {} GANode(const T & t) : GANodeBASE(), contents(t) {} virtual ~GANode() {} T & operator()(const T & t){contents = t; return contents;} }; #ifndef NO_STREAMS template ostream & operator<<(ostream & os, GANode & arg){ os << " node: " << &arg << "\n"; os << " next: " << arg.next << "\n"; os << " prev: " << arg.prev << "\n"; os << " child: " << arg.child << "\n"; os << " parent: " << arg.parent << "\n"; return(os); } #endif #endif gamera-3.3.3/src/ga/GAParameter.cpp0000644000076500000000000004026610714675676016007 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- parameters.C mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Definition of the parameter object and a container list for it. I did this as a separate list implementation because I don't want all of the overhead of a fullblown list. The parameter list is a special purpose, stripped down list implementation. ---------------------------------------------------------------------------- */ #include #include #include #include #include #include #define PRM_CHUNKSIZE 10 #define BUFSIZE 1024 // size of buffer for reading pairs #define MAX_PAIRS 5000 // max number of name-value pairs in stream #define NAMESIZE 128 // max length of name in name-value pair extern char _gaerrbuf1[]; extern char _gaerrbuf2[]; static int IsNumeric(const char*); GAParameter::GAParameter(const char* fn, const char* sn, Type tp, const void* v){ if(fn){ fname = new char[strlen(fn)+1]; strcpy(fname, fn); } else fname = (char*)0; if(sn){ sname = new char[strlen(sn)+1]; strcpy(sname, sn); } else sname = (char*)0; t = tp; memset(&val, 0, sizeof(Value)); setvalue(v); } GAParameter::GAParameter(const GAParameter& orig){ fname=sname = (char*)0; memset(&val, 0, sizeof(Value)); copy(orig); } void GAParameter::copy(const GAParameter& orig){ if(&orig == this) return; delete [] fname; delete [] sname; if(orig.fname){ fname = new char[strlen(orig.fname)+1]; strcpy(fname, orig.fname); } else fname = (char *)0; if(orig.sname){ sname = new char[strlen(orig.sname)+1]; strcpy(sname, orig.sname); } else sname = (char *)0; t = orig.t; setvalue(orig.value()); // do this directly... } GAParameter::~GAParameter(){ delete [] fname; delete [] sname; if(t == STRING) delete [] val.sval; } void GAParameter::setvalue(const void* v){ switch(t){ case BOOLEAN: case INT: val.ival = *((int*)v); break; case CHAR: val.cval = *((char*)v); break; case STRING: if(v != val.sval) { char* ptr=0; if(strlen((char*)v) > 0){ ptr = new char[strlen((char*)v)+1]; strcpy(ptr, (char*)v); } delete [] val.sval; val.sval = ptr; } break; case FLOAT: val.fval = *((float*)v); break; case DOUBLE: val.dval = *((double*)v); break; case POINTER: default: val.pval = v; break; } } // The default parameter list is empty. Allocate space for the pointers, but // don't allocate any parameters at this point. GAParameterList::GAParameterList(){ N = n = cur = 0; p = (GAParameter**)0; } GAParameterList::GAParameterList(const GAParameterList& list){ N = list.N; n = list.n; cur = list.cur; p = new GAParameter * [N]; for(unsigned int i=0; ifullname()) == 0 || strcmp(name, p[i]->shrtname()) == 0){ p[i]->value(v); found = 1; } } return found ? 0 : -1; } // Must do a special case for double/float. Any floats that get passed to this // routine will be cast to doubles, but then we need to force them back to a // float if FLOAT is the type that is expected. Kind of sucks, eh? // We could check the parameter type against the type here, but we don't. // (could do it for all of the 'set' members). Maybe in a later release. int GAParameterList::set(const char* name, double v) { int found = 0; for(unsigned int i=0; ifullname()) == 0 || strcmp(name, p[i]->shrtname()) == 0){ if(p[i]->type() == GAParameter::FLOAT){ float fval = (float)v; p[i]->value((void*)&fval); } else if(p[i]->type() == GAParameter::DOUBLE) p[i]->value((void*)&v); else GAErr(GA_LOC, "GAParameterList", "set", gaErrBadTypeIndicator); found = 1; } } return found ? 0 : -1; } // This allocates space for strings, so be sure to free it! int GAParameterList::get(const char* name, void* value) const { int status = 1; for(unsigned int i=0; ifullname()) == 0 || strcmp(name, p[i]->shrtname()) == 0){ switch(p[i]->type()){ case GAParameter::BOOLEAN: case GAParameter::INT: *((int*)value) = *((int*)p[i]->value()); break; case GAParameter::CHAR: *((char*)value) = *((char*)p[i]->value()); break; case GAParameter::STRING: break; case GAParameter::FLOAT: *((float*)value) = *((float*)p[i]->value()); break; case GAParameter::DOUBLE: *((double*)value) = *((double*)p[i]->value()); break; case GAParameter::POINTER: default: break; } status = 0; } } return status; } // Add the item to the list if it does not already exist. Return 0 if the add // was OK, -1 if there was a problem. int GAParameterList::add(const char* fn, const char* sn, GAParameter::Type t, const void* v) { int status = -1; if(n == N){ N += PRM_CHUNKSIZE; GAParameter **tmp = p; p = new GAParameter* [N]; memcpy(p, tmp, n * sizeof(GAParameter*)); delete [] tmp; } int found = 0; for(unsigned int i=0; ifullname()) == 0 && strcmp(sn, p[i]->shrtname()) == 0) found = 1; } if(!found){ cur = n; p[n++] = new GAParameter(fn, sn, t, v); } return status; } // When you remove a parameter from the list, the iterator is left pointing // at the same location. If the item was the last in the list, then the // iterator moves to the new last item in the list. // Return 0 if everything was OK, -1 if error. int GAParameterList::remove(){ int status = -1; if(cur > n) return status; delete p[cur]; memmove(&(p[cur]), &(p[cur+1]), (n-cur-1)*sizeof(GAParameter*)); n--; if(cur > n) cur = n; status = 0; return status; } GAParameter* GAParameterList::operator()(const char* name){ for(unsigned int i=0; ifullname())==0 || strcmp(name, p[i]->shrtname())==0) return p[i]; return (GAParameter*)0; } #ifndef NO_STREAMS // Dump the parameters to the specified stream. Just name-value pairs with a // tab delimiter and newline separating pairs. // If there is an error, return 1, otherwise return 0. int GAParameterList::write(ostream& os) const { for(unsigned int i=0; ifullname() << "\t"; switch(p[i]->type()){ case GAParameter::BOOLEAN: ival = *((int*)(p[i]->value())); if(ival) os << "1\n"; else os << "0\n"; break; case GAParameter::INT: ival = *((int*)(p[i]->value())); os << ival << "\n"; break; case GAParameter::CHAR: cval = *((char*)(p[i]->value())); os << cval << "\n"; break; case GAParameter::STRING: sval = ((char*)(p[i]->value())); os << sval << "\n"; break; case GAParameter::FLOAT: fval = *((float*)(p[i]->value())); os << fval << "\n"; break; case GAParameter::DOUBLE: dval = *((double*)(p[i]->value())); os << dval << "\n"; break; case GAParameter::POINTER: default: os << "(pointer)\n"; // os << p[i]->value() << "\n"; break; } } return 0; } int GAParameterList::write(const char* filename) const { ofstream outfile(filename, (ios::out | ios::trunc)); // should be done this way, but SGI systems (and others?) don't do it right... // if(! outfile.is_open()){ if(outfile.fail()){ GAErr(GA_LOC, "GAParameterList", "write", gaErrWriteError, filename); return 1; } int status = write(outfile); outfile.close(); return status; } // Read name-value pairs from the stream. If the first item is a number, then // we expect that many name-value pairs. If not, then we read until the end of // the stream. Be sure not to duplicate the last one, and be sure to dump any // items from a # to end-of-line. // Parse for name-value pairs, where the pairs are separated by whitespace. // *Every* parameter must be specified as a name-value pair (no single name // with no value allowed). If we get a single name with no value that will // screw up the name-value pairing for any remaining pairs. We could check for // this situation, but for now we just let it happen and dump the errors. (i'll // do a better parsing algorithm at some later point). // We return the number of items that we were able to read from the stream. // If we come across an item that is unrecognized, we dump an error message. // The buffer length is limited here, so don't try to read in any really long // lines. // We parse only for items that we know about - if we come across a pair // whose name we do not know about, we ignore the pair and go on to the next. // There's no global list to tell us what type things are, and we don't assume. // We don't allow setting pointers using this method. int GAParameterList::read(istream& is, GABoolean flag){ int nfound = 0; if(n == 0) return nfound; char buf[BUFSIZE]; char name[NAMESIZE]; int toggle = 0, count = 0, npairs = -1; is.width(sizeof(buf)); // don't allow to overrun buffer do{ is >> buf; if(npairs == -1){ if(IsNumeric(buf)){ npairs = atoi(buf); is >> buf; } else{ npairs = MAX_PAIRS; } } if(is.eof()){ break; } else if(buf[0] == '#'){ // dump to end-of-line is.get(buf, BUFSIZE); // fails on lines longer than BUFSIZE } else if(toggle == 0){ strcpy(name, buf); toggle = 1; } else if(toggle == 1){ int found = 0; count += 1; toggle = 0; for(unsigned int i=0; ifullname()) == 0 || strcmp(name, p[i]->shrtname()) == 0){ found = 1; int ival; float fval; double dval; switch(p[i]->type()){ case GAParameter::BOOLEAN: case GAParameter::INT: ival = atoi(buf); set(name, (void*)&ival); nfound += 1; break; case GAParameter::CHAR: case GAParameter::STRING: set(name, (void*)buf); nfound += 1; break; case GAParameter::FLOAT: fval = (float)atof(buf); set(name, (void*)&fval); nfound += 1; break; case GAParameter::DOUBLE: dval = (double)atof(buf); set(name, (void*)&dval); nfound += 1; break; case GAParameter::POINTER: default: break; } // Move this parameter to the front of the list // if(i > 0) { // GAParameter *tmpptr = p[i]; // memmove(&(p[1]), &(p[0]), i * sizeof(GAParameter*)); // p[0] = tmpptr; // } if(i < n-1) { GAParameter *tmpptr = p[i]; memmove(&(p[i]), &(p[i+1]), (n-i-1) * sizeof(GAParameter*)); p[n-1] = tmpptr; } } } if(!found && flag == gaTrue){ strcpy(_gaerrbuf1, ""); strcat(_gaerrbuf1, "unrecognized variable name '"); strcat(_gaerrbuf1, name); strcat(_gaerrbuf1, "'"); GAErr(GA_LOC, "GAParameterList", "read", _gaerrbuf1); } } } while(!is.eof() && count < npairs); if(toggle == 1){ strcpy(_gaerrbuf1, ""); strcat(_gaerrbuf1, "variable "); strcat(_gaerrbuf1, name); strcat(_gaerrbuf1, " has no value"); strcat(_gaerrbuf2, "be sure there is a newline at end of the file"); GAErr(GA_LOC, "GAParameterList", "read", _gaerrbuf1, _gaerrbuf2); is.clear(ios::badbit | is.rdstate()); } return nfound; } int GAParameterList::read(const char* filename, GABoolean flag){ ifstream infile(filename, ios::in); if(!infile){ GAErr(GA_LOC, "GAParameterList", "read", gaErrReadError, filename); return 1; } int status = read(infile, flag); infile.close(); return status; } #endif // Parse the arglist for any recognized arguments. If we find a string we // know, then we set the value. If we find a string we don't know then we // don't do anything unless the flag is set. If the flag is set then we // complain about unknown arguments. // You should set up the list before you do the parsing in order to grab // arguments from the arglist. // When we encounter names we know with valid values, we put the list into // order as we get the new values. When we recognize a pair, we pull the // parameter from the list, set its value, then stick it at the end of the // parameter list. So if something turns up more than once, we'll remove- // then-append it more than once and the ordering from argv will be properly // maintained. // We assume that argv[0] is the name of the program, so we don't barf on // it if it is not a recognized name. int GAParameterList::parse(int& argc, char *argv[], GABoolean flag){ int nfound = 0; if(n == 0) return nfound; char **argvout = new char* [argc]; int argcu = argc-1; int argcl = 0; for(int i=0; ishrtname(), argv[i]) == 0 || strcmp(p[j]->fullname(), argv[i]) == 0){ found = 1; argvout[argcu] = argv[i]; argcu--; if(++i >= argc){ GAErr(GA_LOC, argv[0], argv[i-1], " needs a value"); } else{ int ival; float fval; double dval; switch(p[j]->type()){ case GAParameter::BOOLEAN: if(IsNumeric(argv[i])){ ival = atoi(argv[i]); ival = (ival == 0) ? 0 : 1; } else { if(strcmp(argv[i], "true") == 0 || strcmp(argv[i], "True") == 0 || strcmp(argv[i], "TRUE") == 0 || strcmp(argv[i], "t") == 0 || strcmp(argv[i], "T") == 0) ival = 1; } set(argv[i-1], (void*)&ival); nfound += 1; break; case GAParameter::INT: ival = atoi(argv[i]); set(argv[i-1], (void*)&ival); nfound += 1; break; case GAParameter::CHAR: case GAParameter::STRING: set(argv[i-1], (void*)argv[i]); nfound += 1; break; case GAParameter::FLOAT: fval = (float)atof(argv[i]); set(argv[i-1], (void*)&fval); nfound += 1; break; case GAParameter::DOUBLE: dval = (double)atof(argv[i]); set(argv[i-1], (void*)&dval); nfound += 1; break; case GAParameter::POINTER: default: break; } // Move this parameter to the front of the list // if(j > 0) { // GAParameter *tmpptr = p[j]; // memmove(&(p[1]), &(p[0]), j * sizeof(GAParameter*)); // p[0] = tmpptr; // } if(j < n-1) { GAParameter *tmpptr = p[j]; memmove(&(p[j]), &(p[j+1]), (n-j-1) * sizeof(GAParameter*)); p[n-1] = tmpptr; } // Now update the argv array and argc count to indicate we understood this one argvout[argcu] = argv[i]; argcu--; continue; } } } if(!found){ if(flag && i!=0){ _gaerrbuf1[0] = '\0'; strcat(_gaerrbuf1, "unrecognized name "); strcat(_gaerrbuf1, argv[i]); GAErr(GA_LOC, "GAParameterList", "parse", _gaerrbuf1); } argvout[argcl] = argv[i]; argcl++; } } // bcopy(argvout, argv, argc * sizeof(char*)); memcpy(argv, argvout, argc*sizeof(char*)); argc = argcl; delete [] argvout; return nfound; } static int IsNumeric(const char* str){ for(int i=strlen(str)-1; i>=0; i--) if(! isdigit(str[i]) && str[i] != '.') return 0; return 1; } gamera-3.3.3/src/ga/GAParameter.h0000644000076500000000000000721110714675676015445 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- parameters.h mbwall 14jul95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Header for the parameters object used by the GA objects. ---------------------------------------------------------------------------- */ #ifndef _ga_parameters_h_ #define _ga_parameters_h_ #include #include /* ---------------------------------------------------------------------------- This object is used for naming the parameters. We associate a fullname, a short name, and a value with each parameter. ---------------------------------------------------------------------------- */ class GAParameter { public: enum Type {BOOLEAN, CHAR, STRING, INT, FLOAT, DOUBLE, POINTER}; public: GAParameter(const char* fn, const char* sn, Type tp, const void* v); GAParameter(const GAParameter& orig); GAParameter& operator=(const GAParameter& orig){ copy(orig); return *this; } virtual ~GAParameter(); void copy(const GAParameter&); char* fullname() const { return fname; } char* shrtname() const { return sname; } const void* value() const { return (t==STRING ? val.sval : (t==POINTER ? val.pval : &val)); } const void* value(const void* v) {setvalue(v); return(t==STRING ? val.sval : (t==POINTER ? val.pval:&val));} Type type() const { return t; } protected: char* fname; char* sname; union Value { int ival; char cval; char* sval; float fval; double dval; const void* pval; } val; Type t; void setvalue(const void*); }; /* ---------------------------------------------------------------------------- The parameter list is implemented as an array, but has the interface of a list. Don't ask. You can traverse through the list to get the parameters that you need. Be sure to check the type before you try to extract the value for any specific parameter in the list. ---------------------------------------------------------------------------- */ class GAParameterList { public: GAParameterList(); GAParameterList(const GAParameterList&); GAParameterList& operator=(const GAParameterList&); virtual ~GAParameterList(); int size() const { return n; } int get(const char*, void*) const; int set(const char*, const void*); int set(const char* s, int v) { return set(s, (void*)&v); } int set(const char* s, unsigned int v) { return set(s, (void*)&v); } int set(const char* s, char v) { return set(s, (void*)&v); } int set(const char* s, const char* v) { return set(s, (void*)v); } int set(const char* s, double v); int add(const char*, const char*, GAParameter::Type, const void*); int remove(); GAParameter& operator[](unsigned int i) const {return *(p[i]);} GAParameter& next(){return *(p[((cur > n) ? cur=0 : ++cur)]);} GAParameter& prev(){return *(p[((cur == 0) ? cur=n-1 : --cur)]);} GAParameter& current() const {return *(p[cur]);} GAParameter& first(){return *(p[cur=0]);} GAParameter& last(){return *(p[cur=n-1]);} GAParameter* operator()(const char* name); int parse(int& argc, char **argv, GABoolean flag=gaTrue); #ifndef NO_STREAMS int write(const char* filename) const; int write(ostream& os) const; int read(const char* filename, GABoolean flag=gaTrue); int read(istream& is, GABoolean flag=gaTrue); #endif protected: unsigned int n, N, cur; GAParameter **p; }; #ifndef NO_STREAMS inline ostream& operator<< (ostream& os, const GAParameterList& plist) { plist.write(os); return os; } inline istream& operator>> (istream& is, GAParameterList& plist) { plist.read(is); return is; } #endif #endif gamera-3.3.3/src/ga/GAPopulation.cpp0000644000076500000000000005741510714675676016225 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- population.C mbwall 11aug94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved ---------------------------------------------------------------------------- */ #include #include #include #include #include #include // for the sake of flaky g++ compiler #ifndef NOMINMAX #define NOMINMAX // for the sake of window, thanks nick wienholt #endif // This is the default population initializer. It simply calls the initializer // for each member of the population. Then we touch the population to tell it // that it needs to update stats and/or sort (but we don't actually force // either one to occur. // The population object takes care of setting/unsetting the status flags. void GAPopulation::DefaultInitializer(GAPopulation & p){ for(int i=0; iassign(*this); sclscm = new DEFAULT_SCALING; evaldata = (GAEvalData*)0; ga = (GAGeneticAlgorithm*)0; } GAPopulation::GAPopulation(const GAGenome & c, unsigned int popsize) { csz = N = GA_POP_CHUNKSIZE; n = (popsize < 1 ? 1 : popsize); while(N < n) N += csz; rind = new GAGenome * [N]; sind = new GAGenome * [N]; for(unsigned int i=0; iassign(*this); sclscm = new DEFAULT_SCALING; evaldata = (GAEvalData*)0; ga = (GAGeneticAlgorithm*)0; } GAPopulation::GAPopulation(const GAPopulation & orig){ n = N = 0; rind = sind = (GAGenome**)0; indDiv = (float*)0; sclscm = (GAScalingScheme*)0; slct = (GASelectionScheme*)0; evaldata = (GAEvalData*)0; copy(orig); } GAPopulation::~GAPopulation(){ for(unsigned int i=0; iclone(); sind = new GAGenome * [N]; memcpy(sind, rind, N * sizeof(GAGenome*)); if(arg.indDiv) { indDiv = new float[N*N]; memcpy(indDiv, arg.indDiv, (N*N*sizeof(float))); } else { indDiv = 0; } sclscm = arg.sclscm->clone(); scaled = gaFalse; if(arg.scaled == gaTrue) scale(); slct = arg.slct->clone(); slct->assign(*this); selectready = gaFalse; if(arg.selectready == gaTrue) prepselect(); if(arg.evaldata) evaldata = arg.evaldata->clone(); else evaldata = (GAEvalData*)0; neval = 0; // don't copy the evaluation count! rawSum = arg.rawSum; rawAve = arg.rawAve; rawMax = arg.rawMax; rawMin = arg.rawMin; rawVar = arg.rawVar; rawDev = arg.rawDev; popDiv = arg.popDiv; fitSum = arg.fitSum; fitAve = arg.fitAve; fitMax = arg.fitMax; fitMin = arg.fitMin; fitVar = arg.fitVar; fitDev = arg.fitDev; sortorder = arg.sortorder; rsorted = arg.rsorted; ssorted = gaFalse; // we must sort at some later point statted = arg.statted; evaluated = arg.evaluated; divved = arg.divved; init = arg.init; eval = arg.eval; ud = arg.ud; ga = arg.ga; } // Resize the population. If we shrink, we delete the extra genomes. If // we grow, we clone new ones (and we DO NOT initialize them!!!). When we // trash the genomes, we delete the worst of the population! We do not // free up the space used by the array of pointers, but we do free up the // space used by the genomes. // We do a clone of the genome contents so that we don't have to initialize // the new ones (what if the population has a custom initilizer?). We randomly // pick which ones to clone from the existing individuals. If the population // contains no genomes, then we post an error message (since there are no // individuals from which to clone the new ones). // If the population was evaluated, then we evaluate the new genomes. We // do not sort nor restat the population, and we tag the statted and sorted // flags to reflect the fact that they are no longer valid. // Resizing to a bigger size is the same as a batch 'add' int GAPopulation::size(unsigned int popsize){ if(popsize == n) return n; if(n == 0 && popsize > 0) { GAErr(GA_LOC, "GAPopuluation", "size", gaErrNoIndividuals); return n; } if(popsize > n){ grow(popsize); for(unsigned int i=n; iclone(GAGenome::CONTENTS); rsorted = gaFalse; } else{ for(unsigned int i=popsize; irind, 0, n-1); else GAPopulation::QuickSortDescendingRaw(This->rind, 0, n-1); This->selectready = gaFalse; } This->rsorted = gaTrue; } else if(basis == SCALED){ if(ssorted == gaFalse || flag == gaTrue){ if(sortorder == LOW_IS_BEST) GAPopulation::QuickSortAscendingScaled(This->sind, 0, n-1); else GAPopulation::QuickSortDescendingScaled(This->sind, 0, n-1); This->selectready = gaFalse; } This->ssorted = gaTrue; } } // Evaluate each member of the population and store basic population statistics // in the member variables. It is OK to run this on a const object - it // changes to physical state of the population, but not the logical state. // The partial sums are normalized to the range [0,1] so that they can be // used whether the population is sorted as low-is-best or high-is-best. // Individual 0 is always the best individual, and the partial sums are // calculated so that the worst individual has the smallest partial sum. All // of the partial sums add to 1.0. void GAPopulation::statistics(GABoolean flag) const { if(statted == gaTrue && flag != gaTrue) return; GAPopulation * This = (GAPopulation *)this; if(n > 0) { float tmpsum; This->rawMin = This->rawMax = tmpsum = rind[0]->score(); unsigned int i; for(i=1; iscore(); This->rawMax = GAMax(rawMax, rind[i]->score()); This->rawMin = GAMin(rawMin, rind[i]->score()); } float tmpave = tmpsum / n; This->rawAve = tmpave; This->rawSum = tmpsum; // if scores are huge we'll lose data here float tmpvar = 0.0; if(n > 1){ for(i=0; iscore() - This->rawAve; s *= s; tmpvar += s; } tmpvar /= (n-1); } This->rawDev = (float)sqrt(tmpvar); This->rawVar = tmpvar; // could lose data if huge variance } else { This->rawMin = This->rawMax = This->rawSum = 0.0; This->rawDev = This->rawVar = 0.0; } This->statted = gaTrue; } // Do the scaling on the population. Like the statistics and diversity, this // method does not change the contents of the population, but it does change // the values of the status members of the object. So we allow it to work on // a const population. void GAPopulation::scale(GABoolean flag) const { if(scaled == gaTrue && flag != gaTrue) return; GAPopulation* This = (GAPopulation*)this; if(n > 0) { sclscm->evaluate(*This); float tmpsum; This->fitMin = This->fitMax = tmpsum = sind[0]->fitness(); unsigned int i; for(i=1; ifitness(); This->fitMax = GAMax(fitMax, sind[i]->fitness()); This->fitMin = GAMin(fitMin, sind[i]->fitness()); } float tmpave = tmpsum / n; This->fitAve = tmpave; This->fitSum = tmpsum; // if scores are huge we'll lose data here float tmpvar = 0.0; if(n > 1){ for(i=0; ifitness() - This->fitAve; s *= s; tmpvar += s; } tmpvar /= (n-1); } This->fitDev = (float)sqrt(tmpvar); This->fitVar = tmpvar; // could lose data if huge variance } else { This->fitMin = This->fitMax = This->fitSum = 0.0; This->fitVar = This->fitDev = 0.0; } This->scaled = gaTrue; This->ssorted = gaFalse; } // Calculate the population's diversity score. The matrix is triangular and // we don't have to calculate the diagonals. This assumes that div(i,j) is // the same as div(j,i) (for our purposes this will always be true, but it is // possible for someone to override some of the individuals in the population // and not others). // For now we keep twice as many diversity numbers as we need. We need only // n*(n-1)/2, but I can't seem to figure out an efficient way to map i,j to the // reduced n*(n-1)/2 set (remember that the diagonals are always 0.0). // The diversity of the entire population is just the average of all the // individual diversities. So if every individual is completely different from // all of the others, the population diversity is > 0. If they are all the // same, the diversity is 0.0. We don't count the diagonals for the population // diversity measure. 0 means minimal diversity means all the same. void GAPopulation::diversity(GABoolean flag) const { if(divved == gaTrue && flag != gaTrue) return; GAPopulation* This = (GAPopulation*)this; if(n > 1) { if(This->indDiv == 0) This->indDiv = new float[N*N]; This->popDiv = 0.0; for(unsigned int i=0; iindDiv[i*n+i] = 0.0; for(unsigned int j=i+1; jindDiv[j*n+i] = This->indDiv[i*n+j] = individual(i).compare(individual(j)); This->popDiv += indDiv[i*n+j]; } } This->popDiv /= n*(n-1)/2; } else { This->popDiv = 0.0; } This->divved = gaTrue; } void GAPopulation::prepselect(GABoolean flag) const { if(selectready == gaTrue && flag != gaTrue) return; GAPopulation* This = (GAPopulation*)this; This->slct->update(); This->selectready = gaTrue; } // Return a reference to the scaling object. GAScalingScheme & GAPopulation::scaling(const GAScalingScheme& s){ delete sclscm; sclscm = s.clone(); scaled = gaFalse; return *sclscm; } // Return a reference to the selection object. GASelectionScheme& GAPopulation::selector(const GASelectionScheme& s) { delete slct; slct = s.clone(); slct->assign(*this); selectready = gaFalse; return *slct; } // Replace the specified genome with the one that is passed to us then // return the one that got replaced. Use the replacement flags to determine // which genome will be replaced. If we get a genome as the second // argument, then replace that one. If we get a NULL genome, then we // return a NULL and don't do anything. // If the population is sorted, then we maintain the sort by doing a smart // replacement. // If the population is not sorted, then we just do the replacement without // worrying about the sort. Replace best and worst both require that we know // which chromsomes are which, so we do a sort before we do the replacement, // then we do a smart replacement. // In both cases we flag the stats as out-of-date, but we do not update the // stats. Let that happen when it needs to happen. // If which is < 0 then it is a flag that tells us to do a certain kind of // replacement. Anything non-negative is assumed to be an index to a // genome in the population. // This does not affect the state of the evaluated member - it assumes that // the individual genome has a valid number for its score. GAGenome * GAPopulation::replace(GAGenome * repl, int which, SortBasis basis) { int i=-1; GAGenome * orig=(GAGenome *)0; if(repl == (GAGenome *)0) return orig; switch(which){ case BEST: sort(gaFalse, basis); i = 0; break; case WORST: sort(gaFalse, basis); i = n-1; break; case RANDOM: i = GARandomInt(0, n-1); break; default: if(0 <= which && which < (int)n) i = which; break; } if(i >= 0){ // We could insert this properly if the population is sorted, but that would // require us to evaluate the genome, and we don't want to do that 'cause that // will screw up any parallel implementations. So we just stick it in the // population and let the sort take care of it at a later time as needed. if(basis == RAW){ orig = rind[i]; // keep the original to return at the end rind[i] = repl; memcpy(sind, rind, N * sizeof(GAGenome*)); } else{ orig = sind[i]; // keep the original to return at the end sind[i] = repl; memcpy(rind, sind, N * sizeof(GAGenome*)); } rsorted = ssorted = gaFalse; // must sort again // flag for recalculate stats statted = gaFalse; // Must flag for a new evaluation. evaluated = gaFalse; // No way to do incremental update of scaling info since we don't know what the // scaling object will do. scaled = gaFalse; // *** should do an incremental update of the diversity here so we don't // recalculate all of the diversities when only one is updated divved = gaFalse; // selector needs update selectready = gaFalse; // make sure the genome has the correct genetic algorithm pointer if(ga) repl->geneticAlgorithm(*ga); } return orig; } // Replace the genome o in the population with the genome r. Return a // pointer to the original genome, o. This assumes that o exists in the // population. If it does not, we return a NULL. If the genomes are the // same, do nothing and return a pointer to the genome. GAGenome * GAPopulation::replace(GAGenome * r, GAGenome * o) { GAGenome * orig=(GAGenome *)0; if(r == (GAGenome *)0 || o == (GAGenome *)0) return orig; if(r == o) return r; unsigned int i; for(i=0; i= (int)n) return removed; if(basis == RAW){ removed = rind[i]; memmove(&(rind[i]), &(rind[i+1]), (n-i-1)*sizeof(GAGenome *)); memcpy(sind, rind, N * sizeof(GAGenome*)); ssorted = gaFalse; } else if(basis == SCALED){ removed = sind[i]; memmove(&(sind[i]), &(sind[i+1]), (n-i-1)*sizeof(GAGenome *)); memcpy(rind, sind, N * sizeof(GAGenome*)); rsorted = gaFalse; } else return removed; n--; evaluated = gaFalse; // *** should be smart about these and do incremental update? scaled = statted = divved = selectready = gaFalse; return removed; } // Remove the specified genome from the population. If the genome is // not in the population, we return NULL. We do a linear search here (yuk for // large pops, but little else we can do). The memory used by the genome is // now the responsibility of the caller. GAGenome * GAPopulation::remove(GAGenome * r) { GAGenome * removed=(GAGenome *)0; if(r == (GAGenome *)0) return removed; unsigned int i; for(i=0; igeneticAlgorithm(*ga); n++; rsorted = ssorted = gaFalse; // may or may not be true, but must be sure evaluated = scaled = statted = divved = selectready = gaFalse; return c; } GAGeneticAlgorithm * GAPopulation::geneticAlgorithm(GAGeneticAlgorithm& g){ for(unsigned int i=0; igeneticAlgorithm(g); return(ga = &g); } #ifndef NO_STREAMS void GAPopulation::write(ostream & os, SortBasis basis) const { for(unsigned int i=0; i l){ v = c[r]->score(); i = l-1; j = r; for(;;){ while(c[++i]->score() < v && i <= r); while(c[--j]->score() > v && j > 0); if(i >= j) break; t = c[i]; c[i] = c[j]; c[j] = t; } t = c[i]; c[i] = c[r]; c[r] = t; GAPopulation::QuickSortAscendingRaw(c,l,i-1); GAPopulation::QuickSortAscendingRaw(c,i+1,r); } } void GAPopulation::QuickSortDescendingRaw(GAGenome **c, int l, int r) { int i,j; float v; GAGenome *t; if(r > l){ v = c[r]->score(); i = l-1; j = r; for(;;){ while(c[++i]->score() > v && i <= r); while(c[--j]->score() < v && j > 0); if(i >= j) break; t = c[i]; c[i] = c[j]; c[j] = t; } t = c[i]; c[i] = c[r]; c[r] = t; GAPopulation::QuickSortDescendingRaw(c,l,i-1); GAPopulation::QuickSortDescendingRaw(c,i+1,r); } } void GAPopulation::QuickSortAscendingScaled(GAGenome **c, int l, int r) { int i,j; float v; GAGenome *t; if(r > l){ v = c[r]->fitness(); i = l-1; j = r; for(;;){ while(c[++i]->fitness() < v && i <= r); while(c[--j]->fitness() > v && j > 0); if(i >= j) break; t = c[i]; c[i] = c[j]; c[j] = t; } t = c[i]; c[i] = c[r]; c[r] = t; GAPopulation::QuickSortAscendingScaled(c,l,i-1); GAPopulation::QuickSortAscendingScaled(c,i+1,r); } } void GAPopulation::QuickSortDescendingScaled(GAGenome **c, int l, int r) { int i,j; float v; GAGenome *t; if(r > l){ v = c[r]->fitness(); i = l-1; j = r; for(;;){ while(c[++i]->fitness() > v && i <= r); while(c[--j]->fitness() < v && j > 0); if(i >= j) break; t = c[i]; c[i] = c[j]; c[j] = t; } t = c[i]; c[i] = c[r]; c[r] = t; GAPopulation::QuickSortDescendingScaled(c,l,i-1); GAPopulation::QuickSortDescendingScaled(c,i+1,r); } } gamera-3.3.3/src/ga/GAPopulation.h0000644000076500000000000002200410714675676015654 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- population.h mbwall 3aug94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: The population holds an array of pointers to genomes. It also keeps track of the fitness statistics for the genomes in the population. ---------------------------------------------------------------------------- */ #ifndef _ga_population_h_ #define _ga_population_h_ #include #include #include #include #include #include #ifdef max #undef max #endif #ifdef min #undef min #endif /* ---------------------------------------------------------------------------- size Use the size member function to get and set the size of the population. The population allocates space for genomes in chunks, so you can vary the chunksize as well if you are really tight for space. The compact member function will remove all extra pointers. If you shrink the population to 0 then you cannot use the 'size' method to make the population bigger. When resizing to a larger size, we clone randomly individuals from the existing population. sort The sort member is defined so that it can work on a const population. It does not change the logical state of the population, but it does change its physical state. We sort from best (0th individual) to worst (n-1). The sort figures out whether high is best or low is best. evaluate If you want to force an evaluation, pass gaTrue to the evaluate member function. Otherwise the population will use its internal state to determine whether or not it needs to do the evaluation. initialize This method determines how the population should be initialized. The default is to call the initializer for each genome. statistics Update the statistics. We do this only on-demand so that no unneeded calculations take place. diversity Like the statistics function, we call this one only on demand. This member function can be particularly expensive, especially for large populations. So we store the values and update them only as needed. The population diversity measure is the average of the individual measures (less the diagonal scores). ---------------------------------------------------------------------------- */ class GAPopulation : public GAID { public: GADefineIdentity("GAPopulation", GAID::Population); typedef void (*Initializer)(GAPopulation &); typedef void (*Evaluator)(GAPopulation &); static void DefaultInitializer(GAPopulation &); static void DefaultEvaluator(GAPopulation &); public: enum SortBasis { RAW, SCALED }; enum SortOrder { LOW_IS_BEST, HIGH_IS_BEST }; enum Replacement { BEST = -1, WORST = -2, RANDOM = -3 }; public: GAPopulation(); GAPopulation(const GAGenome & c, unsigned int psize=1); GAPopulation(const GAPopulation & arg); GAPopulation & operator=(const GAPopulation & arg){copy(arg); return(*this);} virtual ~GAPopulation(); virtual GAPopulation * clone() const {return new GAPopulation(*this);} virtual void copy(const GAPopulation & arg); int size() const { return n; } int size(unsigned int popsize); int chunksize() const { return csz; } int chunksize(unsigned int csize) { return csz=csize; } int compact(); void touch() { rsorted=ssorted=selectready=divved=statted=scaled=evaluated=gaFalse; } void statistics(GABoolean flag=gaFalse) const; void diversity(GABoolean flag=gaFalse) const; void scale(GABoolean flag=gaFalse) const; void prepselect(GABoolean flag=gaFalse) const; void sort(GABoolean flag=gaFalse, SortBasis basis=RAW) const; float sum() const {if(!statted) statistics(); return rawSum;} float ave() const {if(!statted) statistics(); return rawAve;} float var() const {if(!statted) statistics(); return rawVar;} float dev() const {if(!statted) statistics(); return rawDev;} float max() const {if(!statted) statistics(); return rawMax;} float min() const {if(!statted) statistics(); return rawMin;} float div() const {if(!divved) diversity(); return popDiv;} float div(unsigned int i, unsigned int j) const {if(!divved) diversity(); return indDiv[i*n+j];} float fitsum() const {if(!scaled) scale(); return fitSum;} float fitave() const {if(!scaled) scale(); return fitAve;} float fitmax() const {if(!scaled) scale(); return fitMax;} float fitmin() const {if(!scaled) scale(); return fitMin;} float fitvar() const {if(!scaled) scale(); return fitVar;} float fitdev() const {if(!scaled) scale(); return fitDev;} int nevals() const { return neval; } void evaluate(GABoolean flag=gaFalse) { if(evaluated == gaFalse || flag == gaTrue){ (*eval)(*this); neval++; scaled = statted = divved = rsorted = ssorted = gaFalse; } evaluated = gaTrue; } Evaluator evaluator() const {return eval;} Evaluator evaluator(Evaluator e) { evaluated = gaFalse; return eval=e; } void initialize() { neval = 0; (*init)(*this); touch(); } Initializer initializer() const {return init;} Initializer initializer(Initializer i) { return init=i; } SortOrder order() const { return sortorder; } SortOrder order(SortOrder flag); GAGenome & select() { if(!selectready) prepselect(); return slct->select(); } GASelectionScheme & selector() const { return *slct; } GASelectionScheme & selector(const GASelectionScheme&); GAScalingScheme & scaling() const { GAPopulation* This = (GAPopulation*)this; This->scaled=gaFalse; return *sclscm; } GAScalingScheme & scaling(const GAScalingScheme&); GAGeneticAlgorithm * geneticAlgorithm() const {return ga;} GAGeneticAlgorithm * geneticAlgorithm(GAGeneticAlgorithm&); void * userData() const {return ud;} void * userData(void * u){return(ud=u);} GAEvalData * evalData() const {return evaldata;} GAEvalData * evalData(const GAEvalData& o) {delete evaldata; evaldata = o.clone(); return evaldata;} GAGenome& best(unsigned int i=0, SortBasis basis=RAW) const { if(basis == SCALED) scale(); sort(gaFalse, basis); return ((basis == RAW) ? *(rind[i]) : *(sind[i])); } GAGenome& worst(unsigned int i=0, SortBasis basis=RAW) const { if(basis == SCALED) scale(); sort(gaFalse, basis); return ((basis == RAW) ? *(rind[n-1-i]) : *(sind[n-1-i])); } GAGenome& individual(unsigned int i, SortBasis basis=RAW) const { return ((basis == RAW) ? *(rind[i]) : *(sind[i])); } GAGenome * add(GAGenome *); GAGenome * add(const GAGenome&); GAGenome * remove(int which=WORST, SortBasis basis=RAW); GAGenome * remove(GAGenome *); GAGenome * replace(GAGenome *, int which=RANDOM, SortBasis basis=RAW); GAGenome * replace(GAGenome * newgenome, GAGenome * oldgenome); void destroy(int w=WORST, SortBasis b=RAW) { delete remove(w,b); } #ifndef NO_STREAMS virtual void read(istream &){} virtual void write (ostream & os, SortBasis basis=RAW) const; #endif protected: unsigned int neval; // number of evals since initialization unsigned int csz; // how big are chunks we allocate? unsigned int n, N; // how many are in the population, allocated SortOrder sortorder; // is best a high score or a low score? GABoolean rsorted; // are the individuals sorted? (raw) GABoolean ssorted; // are the individuals sorted? (scaled) GABoolean scaled; // has the population been scaled? GABoolean statted; // are the stats valid? GABoolean evaluated; // has the population been evaluated? GABoolean divved; // has the population diversity been measured? GABoolean selectready; // has the selector been updated? float rawSum, rawAve; // sum, ave of the population's objectives float rawMax, rawMin; // max, min of the population's objectives float rawVar, rawDev; // variance, standard deviation float popDiv; // overall population diversity [0,) float* indDiv; // table for genome similarities (diversity) GAGenome** rind; // the individuals of the population (raw) GAGenome** sind; // the individuals of the population (scaled) float fitSum, fitAve; // sum, ave of the population's fitness scores float fitMax, fitMin; // max, min of the population's fitness scores float fitVar, fitDev; // variance, standard deviation of fitness GAScalingScheme* sclscm; // scaling method GASelectionScheme* slct; // selection method Initializer init; // initialization method Evaluator eval; // population evaluation method void* ud; // pointer to user data GAGeneticAlgorithm* ga; // the ga that is using this population GAEvalData* evaldata; // data for evaluator to use (optional) int grow(unsigned int); static void QuickSortAscendingRaw(GAGenome**, int, int); static void QuickSortDescendingRaw(GAGenome**, int, int); static void QuickSortAscendingScaled(GAGenome**, int, int); static void QuickSortDescendingScaled(GAGenome**, int, int); }; #ifndef NO_STREAMS inline ostream& operator<< (ostream& os, const GAPopulation & arg) { arg.write(os); return os; } inline istream& operator>> (istream& is, GAPopulation & arg) { arg.read(is); return is; } #endif #endif gamera-3.3.3/src/ga/garandom.cpp0000644000076500000000000002001710714675676015437 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- random.C mbwall 5sep95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Random number stuff for use in GAlib. ---------------------------------------------------------------------------- */ #include #include #include #include static void bitseed(unsigned int seed=1); // If the machine has multiple processes, use the PID to help make the random // number generator seed more random. #if defined(USE_PID) #include #define _GA_PID * getpid() #else #define _GA_PID #endif // Return a string indicating which random number generator was compiled-in to // the library. const char* GAGetRNG() { #if defined(USE_RAN1) return "RAN1"; #elif defined(USE_RAN2) return "RAN2"; #elif defined(USE_RAN3) return "RAN3"; #elif defined(USE_RAND) return "RAND"; #elif defined(USE_RANDOM) return "RANDOM"; #elif defined(USE_RAND48) return "RAND48"; #else return "UNKNOWN"; #endif } // Seed the random number generator with an appropriate value. We seed both // the random number generator and the random bit generator. Set the seed only // if a seed is not specified. If a seed is specified, then set the seed to // the specified value and use it. We remember the seed so that multiple calls // to this function with the same seed do not reset the generator. Subsequent // calls to this function with a different seed will initialize the generator // to the new seed. Multiple calls with a value of 0 do nothing (we do *not* // re-seed the generator because 0 is the default value and we don't want // people to re-seed the generator inadvertantly). // Some systems return a long as the return value for time, so we need to be // sure to get whatever variation from it that we can since our seed is only an // unsigned int. static unsigned int seed=0; unsigned int GAGetRandomSeed() { return seed; } void GARandomSeed(unsigned int s) { if(s == 0 && seed == 0) { unsigned long int tmp; while(seed == 0) { tmp = time(NULL) _GA_PID; for(unsigned int i=0; i= 1.0 || rsquare == 0.0); double val = -2.0 * log(rsquare) / rsquare; if(val > 0.0) factor = sqrt(val); else factor = 0.0; // should not happen, but might due to roundoff cachevalue = var1 * factor; cached = gaTrue; return (var2 * factor); } // This is the random bit generator Method II from numerical recipes in C. The // seed determines where in the cycle of numbers the generator will start, so // we don't need full 'long' precision in the argument to the seed function. #define IB1 1 #define IB2 2 #define IB5 16 #define IB18 131072L #define MASK (IB1+IB2+IB5) static unsigned long iseed; void bitseed(unsigned int seed) { iseed = seed; } int GARandomBit() { if (iseed & IB18) { iseed=((iseed ^ MASK) << 1) | IB1; return 1; } else { iseed <<= 1; return 0; } } #undef MASK #undef IB18 #undef IB5 #undef IB2 #undef IB1 // The following random number generators are from Numerical Recipes in C. // I have split them into a seed function and random number function. // The ran1 pseudo-random number generator. This one is OK to use as long as // you don't call it more than about 10^8 times, so for any long GA runs you'd // better use something with a longer period. #if defined(USE_RAN1) #define IA 16807L #define IM 2147483647L #define AM (1.0/IM) #define IQ 127773L #define IR 2836L #define NTAB 32 #define NDIV (1+(IM-1)/NTAB) #define EPS 1.2e-7 #define RNMX (1.0-EPS) static long iy=0; static long iv[NTAB]; static long idum=0; void sran1(unsigned int seed) { int j; long k; idum = seed; if (idum == 0) idum=1; if (idum < 0) idum = -idum; for (j=NTAB+7;j>=0;j--) { k=(idum)/IQ; idum=IA*(idum-k*IQ)-IR*k; if (idum < 0) idum += IM; if (j < NTAB) iv[j] = idum; } iy=iv[0]; } float ran1() { int j; long k; float temp; k=(idum)/IQ; idum=IA*(idum-k*IQ)-IR*k; if (idum < 0) idum += IM; j=iy/NDIV; iy=iv[j]; iv[j] = idum; if ((temp=AM*iy) > RNMX) return RNMX; else return temp; } #undef IA #undef IM #undef AM #undef IQ #undef IR #undef NTAB #undef NDIV #undef EPS #undef RNMX #endif // The ran2 pseudo-random number generator. It has a period of 2 * 10^18 and // returns a uniform random deviate on the interval (0.0, 1.0) excluding the // end values. idum initializes the sequence, so we create a separate seeding // function to set the seed. If you reset the seed then you re-initialize the // sequence. #if defined(USE_RAN2) #define IM1 2147483563L #define IM2 2147483399L #define AM (1.0/IM1) #define IMM1 (IM1-1) #define IA1 40014L #define IA2 40692L #define IQ1 53668L #define IQ2 52774L #define IR1 12211L #define IR2 3791 #define NTAB 32 #define NDIV (1+IMM1/NTAB) #define EPS 1.2e-7 #define RNMX (1.0-EPS) static long idum2=123456789; static long iy=0; static long iv[NTAB]; static long idum=0; void sran2(unsigned int seed) { int j; long k; idum = STA_CAST(long,seed); if (idum == 0) idum=1; if (idum < 0) idum = -idum; idum2=(idum); for (j=NTAB+7;j>=0;j--) { k=(idum)/IQ1; idum=IA1*(idum-k*IQ1)-k*IR1; if (idum < 0) idum += IM1; if (j < NTAB) iv[j] = idum; } iy=iv[0]; } float ran2() { int j; long k; float temp; k=(idum)/IQ1; idum=IA1*(idum-k*IQ1)-k*IR1; if (idum < 0) idum += IM1; k=idum2/IQ2; idum2=IA2*(idum2-k*IQ2)-k*IR2; if (idum2 < 0) idum2 += IM2; j=iy/NDIV; iy=iv[j]-idum2; iv[j] = idum; if (iy < 1) iy += IMM1; if ((temp=AM*iy) > RNMX) return (float)RNMX; else return temp; } #undef IM1 #undef IM2 #undef AM #undef IMM1 #undef IA1 #undef IA2 #undef IQ1 #undef IQ2 #undef IR1 #undef IR2 #undef NTAB #undef NDIV #undef EPS #undef RNMX #endif #if defined(USE_RAN3) // The ran3 pseudo-random number generator. It is *not* linear congruential. #define MBIG 1000000000 #define MSEED 161803398 #define MZ 0 #define FAC (1.0/MBIG) static int inext,inextp; static long ma[56]; void sran3(unsigned int seed) { long idum = seed; long mj,mk; int i,ii,k; mj=labs(MSEED-labs(idum)); mj %= MBIG; ma[55]=mj; mk=1; for (i=1;i<=54;i++) { ii=(21*i) % 55; ma[ii]=mk; mk=mj-mk; if (mk < MZ) mk += MBIG; mj=ma[ii]; } for (k=1;k<=4;k++) for (i=1;i<=55;i++) { ma[i] -= ma[1+(i+30) % 55]; if (ma[i] < MZ) ma[i] += MBIG; } inext=0; inextp=31; } float ran3() { long mj; int i,ii,k; if (++inext == 56) inext=1; if (++inextp == 56) inextp=1; mj=ma[inext]-ma[inextp]; if (mj < MZ) mj += MBIG; ma[inext]=mj; return mj*FAC; } #undef MBIG #undef MSEED #undef MZ #undef FAC #endif gamera-3.3.3/src/ga/garandom.h0000644000076500000000000001411210714675676015103 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- random.h mbwall 29jun95 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: Initialize the random function by using the current time as the seed. We use the pid as well as the time for the random seed in an attempt to get rid of some of the periodicity from the low bits when using only the time as the random seed. These routines use the random/srandom routines to generate random numbers. The documentation says that rand/srand is about 30% faster than random/srandom, but rand/srand has a significantly smaller period so you'll get less random results. For the best results, use a RNG with a larger period (such as ran2). This is *not* implemented as a separate RNG class because I wanted to be able to inline everything as much as possible. Also, we don't need to switch RNGs for most purposes - I assume that compiling in the RNG is ok. In addition, many methods make use of RNG calls of a global nature - they should not contain a RNG, and they may not have access to a RNG other than the global functions. GARandomInt, GARandomFloat, GARandomDouble Return a number selected at random within the bounds low and high, inclusive. Don't forget the 'inclusive' part! If you're using this to get the index of an element in an array, be sure to use the last element of the array, not the number of elements in the array as the arguement for 'high'. If you screw up and pass a value for low that is less than the value for high, this routine does not complain. It will merrily return a possibly negative value. We need speed here, so there's no error checking. GARandomBit This is a faster implementation of GARandomInt(0,1). GAFlipCoin Simulate a coin toss. Use specified probability to bias toss. GAUnitGaussian Returns a number from a Gaussian distribution with mean 0 and stddev of 1 GAGaussianFloat, GAGaussianDouble Scaled versions of the gaussian distribution. You must specify a stddev, then these functions scale the distribution to that deviation. Mean is still 0 ---------------------------------------------------------------------------- */ #ifndef _ga_random_h_ #define _ga_random_h_ #include #include #include // Here we determine which random number generator will be used. The critical // parts here are the name of the random number generator (e.g. rand or random) // the name of the seed routine (e.g. srand or srandom), the maximum value of // the number returned by the generator (e.g. RAND_MAX or LONG_MAX), and the // C++ type of the number returned (e.g. int or long int). // If you want to use your own random function, this is where to declare it. // Just set the _GA_RND macros to the appropriate values for your random number // generator. // There are *many* ways to speed things up here if you know specifics about // the machine on which you're going to be running the code. For example, if // you have a floating coprocessor then you might want to use ran3 and convert // it so that it is entirely floating point (as described in NR in C). Or if // you're really daring, substitute some assembly code. For many bit-flipping // genetic algorithms the random number generator is the bottleneck, so this // isn't totally useless musing... #if defined(USE_RAN1) || defined(USE_RAN2) || defined(USE_RAN3) #if defined(USE_RAN1) #define _GA_RND ran1 #define _GA_RND_SEED sran1 void sran1(unsigned int seed=1); float ran1(); #elif defined(USE_RAN2) #define _GA_RND ran2 #define _GA_RND_SEED sran2 void sran2(unsigned int seed=1); float ran2(); #elif defined(USE_RAN3) #define _GA_RND ran3 #define _GA_RND_SEED sran3 void sran3(unsigned int seed=1); float ran3(); #endif inline int GARandomInt(){ return _GA_RND() > 0.5 ? 1 : 0; } inline int GARandomInt(int low, int high){ float val=STA_CAST(float,high)-STA_CAST(float,low)+(float)1; val*=_GA_RND(); return (STA_CAST(int,val)+low); } inline double GARandomDouble(){ return _GA_RND(); } inline double GARandomDouble(double low, double high){ double val=high-low; val*=_GA_RND(); return val+low; } inline float GARandomFloat(){ return _GA_RND(); } inline float GARandomFloat(float low, float high){ float val=high-low; val*=_GA_RND(); return val+low; } #elif defined(USE_RAND) || defined(USE_RANDOM) || defined(USE_RAND48) #error It is usually a bad idea to use the system randum number generator! #error Be sure that your system generator works properly, then comment #error these lines to go ahead and do your compilation. #include #include #if defined(USE_RANDOM) #define _GA_RND random #define _GA_RND_SEED srandom #define _GA_RND_MAX LONG_MAX #elif defined(USE_RAND48) #define _GA_RND lrand48 #define _GA_RND_SEED srand48 #define _GA_RND_MAX LONG_MAX #else #define _GA_RND rand #define _GA_RND_SEED srand #define _GA_RND_MAX RAND_MAX #endif inline int GARandomInt(){ return _GA_RND() > _GA_RND_MAX/2 ? 1 : 0; } inline int GARandomInt(int low, int high){ return low + _GA_RND() % (high-low+1); } inline double GARandomDouble(){ double val=_GA_RND(); val/=_GA_RND_MAX; return val; } inline double GARandomDouble(double low, double high){ double val=high-low; val*=_GA_RND(); val/=_GA_RND_MAX; val+=low; return val; } inline float GARandomFloat(){ float val=_GA_RND(); val/=_GA_RND_MAX; return val; } inline float GARandomFloat(float low, float high){ float val=high-low; val*=_GA_RND(); val/=_GA_RND_MAX; val+=low; return val; } #endif unsigned int GAGetRandomSeed(); void GARandomSeed(unsigned int seed=0); void GAResetRNG(unsigned int seed); int GARandomBit(); double GAUnitGaussian(); inline GABoolean GAFlipCoin(float p){ return((p == 1.0) ? gaTrue : (p == 0.0) ? gaFalse : ((GARandomFloat() <= p) ? gaTrue : gaFalse)); } inline float GAGaussianFloat(float dev){ return (float)GAUnitGaussian()*dev; } inline double GAGaussianDouble(double dev){ return GAUnitGaussian() * dev; } const char* GAGetRNG(); #endif gamera-3.3.3/src/ga/GARealGenome.h0000644000076500000000000000476710714675676015560 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- real.h mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This header defines the specialization of the array genome of type float for the real number genome. ---------------------------------------------------------------------------- */ #ifndef _ga_real_h_ #define _ga_real_h_ #include #include typedef GAAlleleSet GARealAlleleSet; typedef GAAlleleSetArray GARealAlleleSetArray; typedef GA1DArrayAlleleGenome GARealGenome; inline void GARealUniformInitializer(GAGenome& g){ GA1DArrayAlleleGenome::UniformInitializer(g); } inline void GARealOrderedInitializer(GAGenome& g){ GA1DArrayAlleleGenome::OrderedInitializer(g); } inline int GARealUniformMutator(GAGenome& g, float pmut){ return GA1DArrayAlleleGenome::FlipMutator(g, pmut); } inline int GARealSwapMutator(GAGenome& g, float pmut){ return GA1DArrayGenome::SwapMutator(g, pmut); } int GARealGaussianMutator(GAGenome &, float); inline int GARealUniformCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::UniformCrossover(a,b,c,d); } inline int GARealEvenOddCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::EvenOddCrossover(a,b,c,d); } inline int GARealOnePointCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::OnePointCrossover(a,b,c,d); } inline int GARealTwoPointCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::TwoPointCrossover(a,b,c,d); } inline int GARealPartialMatchCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::PartialMatchCrossover(a,b,c,d); } inline int GARealOrderCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::OrderCrossover(a,b,c,d); } inline int GARealCycleCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::CycleCrossover(a,b,c,d); } int GARealArithmeticCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d); int GARealBlendCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d); #endif gamera-3.3.3/src/ga/GAScaling.cpp0000644000076500000000000002264210714675676015445 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- scaling.C mbwall 10aug94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Class definitions for the scaling objects. These objects translate (scale) the raw objective scores of a population into 'fitness' scores that are used to determine which genomes are fit for mating/selection. In all of these routines we do a check to be sure that we have enough space to do our evaluations. We don't need to do this so long as the population objects that call us do the test themselves. I'll leave the redundancy for now. ---------------------------------------------------------------------------- */ #include #include #include #include #include #include float gaDefLinearScalingMultiplier = 1.2; float gaDefSigmaTruncationMultiplier = 2.0; float gaDefPowerScalingFactor = 1.0005; float gaDefSharingCutoff = 1.0; /* ---------------------------------------------------------------------------- NoScaling ---------------------------------------------------------------------------- */ // Assign the fitness scores to be the same as the objective scores for all of // the individuals in the population. void GANoScaling::evaluate(const GAPopulation& p) { for(int i=0; i ((double)c * pave - pmax)/((double)c - 1.0)){ delta = pmax - pave; a = ((double)c - 1.0) * pave / delta; b = pave * (pmax - (double)c * pave) / delta; } else{ // stretch to make min be 0 delta = pave - pmin; a = pave / delta; b = -pmin * pave / delta; } // and now we calculate the scaled scaled values. Negative scores are not // allowed with this kind of scaling, so check for negative values. If we get // a negative value, dump an error message then set all of the scores to 0. for(int i=0; i (int)N){ delete [] d; N = p.size(); d = new float[N*N]; } int n = p.size(); int i, j; if(df) { for(i=0; iminimaxi(); else mm = ((p.order() == GAPopulation::HIGH_IS_BEST) ? GAGeneticAlgorithm::MAXIMIZE : GAGeneticAlgorithm::MINIMIZE); } else { mm = _minmax; } for(i=0; i= _sigma) ? 0.0 : 1.0 - d[i*n+j]/_sigma); else sum += ((d[i*n+j]>=_sigma) ? 0.0 : 1.0-pow(d[i*n+j]/_sigma,_alpha)); } } double f; if(mm == GAGeneticAlgorithm::MINIMIZE) f = p.individual(i).score() * sum; else f = p.individual(i).score() / sum; p.individual(i).fitness((float)f); // might lose information here! } } void GASharing::copy(const GAScalingScheme & arg){ if(&arg == this) return; GAScalingScheme::copy(arg); const GASharing& s = DYN_CAST(const GASharing&, arg); delete [] d; _minmax = s._minmax; _sigma = s._sigma; _alpha = s._alpha; df = s.df; N = s.N; d = new float[N*N]; memcpy(d, s.d, N*N*sizeof(float)); } // The cutoff for triangular sharing must always be greater than 0 float GASharing::sigma(float c) { if(c <= 0.0){ GAErr(GA_LOC, className(), "sigma", gaErrBadSharingCutoff); return _sigma; } return _sigma = c; } int GASharing::minimaxi(int i) { if(i == GAGeneticAlgorithm::MAXIMIZE) _minmax = GAGeneticAlgorithm::MAXIMIZE; else if(i == GAGeneticAlgorithm::MINIMIZE) _minmax = GAGeneticAlgorithm::MINIMIZE; else _minmax = 0; return _minmax; } #endif gamera-3.3.3/src/ga/GAScaling.h0000644000076500000000000002515210714675676015111 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- scaling.h mbwall 10aug94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This is the GAScaling class. It is used to do scaling on a population. When a genome is evaluated, the user's objective function provides an overall rating for each genome. The GA is concerned with fitness, not objective score (unless you do no scaling). So this object is the container for the scaled values. Examples of scaling include linear scaling, sigma truncation, and power law. Goldberg's sharing function is also a type of scaling, and it is implemented here as a unique class. The scaling class is designed to be used with a population. It is stupid - it does know how to update itself, but it must be told when. ---------------------------------------------------------------------------- */ #ifndef _ga_scaling_h_ #define _ga_scaling_h_ #include #include #include #include #include class GAPopulation; extern float gaDefLinearScalingMultiplier; extern float gaDefSigmaTruncationMultiplier; extern float gaDefPowerScalingFactor; extern float gaDefSharingCutoff; /* ---------------------------------------------------------------------------- Scaling The scaling object is used to scale the objective scores of a population to avoid clustering and premature convergence (among other things). See golberg for more about the theory. This is basically just a container for any data that the scaling object might need to do its thing. The simplest scalings don't store any data. ---------------------------------------------------------------------------- */ class GAScalingScheme : public GAID { public: GADefineIdentity("GAScalingScheme", GAID::Scaling); GAScalingScheme() {} GAScalingScheme(const GAScalingScheme& s) { copy(s); } GAScalingScheme& operator=(const GAScalingScheme& s) {copy(s); return *this;} virtual ~GAScalingScheme() { } virtual GAScalingScheme * clone() const=0; virtual void copy(const GAScalingScheme &) {} virtual void evaluate(const GAPopulation & p)=0; }; /* ---------------------------------------------------------------------------- NoScaling ---------------------------------------------------------------------------- */ class GANoScaling : public GAScalingScheme { public: GADefineIdentity("GANoScaling", GAID::NoScaling); GANoScaling() : GAScalingScheme() {} GANoScaling(const GANoScaling &) : GAScalingScheme() {} GANoScaling& operator=(const GAScalingScheme&){ return *this; } virtual ~GANoScaling(){} virtual GAScalingScheme * clone() const {return new GANoScaling(*this);} virtual void evaluate(const GAPopulation & p); }; /* ---------------------------------------------------------------------------- LinearScaling This scaling object does linear scaling as described in goldberg pp 122-124. ---------------------------------------------------------------------------- */ #if USE_LINEAR_SCALING == 1 class GALinearScaling : public GAScalingScheme { public: GADefineIdentity("GALinearScaling", GAID::LinearScaling); GALinearScaling(float fm=gaDefLinearScalingMultiplier) {multiplier(fm);} GALinearScaling(const GALinearScaling & arg) {copy(arg);} GALinearScaling & operator=(const GAScalingScheme & arg) {copy(arg); return(*this);} virtual ~GALinearScaling(){} virtual GAScalingScheme * clone() const {return new GALinearScaling(*this);} virtual void evaluate(const GAPopulation & p); virtual void copy(const GAScalingScheme & arg){ if(&arg != this){ GAScalingScheme::copy(arg); c=(DYN_CAST(const GALinearScaling&,arg)).c; } } float multiplier(float fm); float multiplier() const {return c;} protected: float c; // linear scaling multiplier }; #endif /* ---------------------------------------------------------------------------- SigmaTruncationScaling This scaling object does sigma truncation as defined in goldberg p124. ---------------------------------------------------------------------------- */ #if USE_SIGMA_TRUNC_SCALING == 1 class GASigmaTruncationScaling : public GAScalingScheme { public: GADefineIdentity("GASigmaTruncationScaling", GAID::SigmaTruncationScaling); GASigmaTruncationScaling(float m=gaDefSigmaTruncationMultiplier) {multiplier(m);} GASigmaTruncationScaling(const GASigmaTruncationScaling & arg){copy(arg);} GASigmaTruncationScaling & operator=(const GAScalingScheme & arg) {copy(arg); return(*this);} virtual ~GASigmaTruncationScaling(){} virtual GAScalingScheme * clone() const {return new GASigmaTruncationScaling(*this);} virtual void evaluate(const GAPopulation & p); virtual void copy(const GAScalingScheme & arg){ if(&arg != this){ GAScalingScheme::copy(arg); c=(DYN_CAST(const GASigmaTruncationScaling&,arg)).c; } } float multiplier(float fm); float multiplier() const {return c;} protected: float c; // std deviation multiplier }; #endif /* ---------------------------------------------------------------------------- PowerLawScaling This scaling object does power law scaling as defined in goldberg p124. ---------------------------------------------------------------------------- */ #if USE_POWER_LAW_SCALING == 1 class GAPowerLawScaling : public GAScalingScheme { public: GADefineIdentity("GAPowerLawScaling", GAID::PowerLawScaling); GAPowerLawScaling(float f=gaDefPowerScalingFactor) {k = f;} GAPowerLawScaling(const GAPowerLawScaling & arg) {copy(arg);} GAPowerLawScaling & operator=(const GAScalingScheme & arg) {copy(arg); return(*this);} virtual ~GAPowerLawScaling(){} virtual GAScalingScheme * clone() const {return new GAPowerLawScaling(*this);} virtual void evaluate(const GAPopulation & p); virtual void copy(const GAScalingScheme & arg){ if(&arg != this){ GAScalingScheme::copy(arg); k=(DYN_CAST(const GAPowerLawScaling&,arg)).k; } } float power(float p){return k=p;} float power() const {return k;} protected: float k; // power scaling factor }; #endif /* ---------------------------------------------------------------------------- Sharing This scaling object does sharing as described in goldberg p 192. This implementation does triangular sharing with the (optional) alpha parameter for changing the curvature of the sharing range and the (required) sigma parameter for controlling the range of influence. If you want a different type of sharing function, then derive from this class and define a new (virtual) evaluate method and add whatever member data you need to specify the shape of your sharing function. We use the distance function to scale the objective scores of the genomes so that if there are many similar genomes in a population their scores will be decreased, thus giving sub-species a greater chance to reproduce. This sharing function is defined as follows: / | 1 - (d(i,j)/sigma) ^ alpha d(i,j) < sigma s(d(i,j)) = | | 0 d(i,j) >= sigma \ where d is the distance between any two individuals and is defined such that d(i,j) = 0 means that individuals i and j are identical. d() has no upper bound, but it is never negative. The alpha controls the shape of the sharing function. When alpha=1 then the 'curve' is a straight line. If alpha is < 1 then the curves are concave, if alpha is > 1 then the curves are convex. If you decide to use this type of sharing, be careful of the sigma value that you use. It can make a HUGE difference, depending upon the objective. Distance functions are independent of the sharing functions (as defined in Goldberg, that is). A similarity (distance) function is used with the sharing object. It is a type of speciation (similar in functionality to DeJong crowding, but this uses fitness scaling rather than replacement strategy to affect the speciation). If the genomes are identical, the similarity function should return a value of 0.0, if completely different then return a value of 1.0. 0 means less diversity means all genomes are the same. You can specify whether the scaling should be maximize or minimize based. If you are maximizing, the scaling will divide the raw score by the scaling factor. If you are minimizing, the scaling will multiply the score by the scaling factor. (By definition, the scaling factor will always be >= 1.0) By default, the scaling object uses the max/min settings that it contains (so you can set the scaling independently of the GA). If the scaling's min/max was not set, then it tries to use the min/max settings in the GA that owns the population to which the scaling object is attached. If there is no GA, then it bases its min/max on the sort order of the population. You can set the minimaxi to: GA::MINIMIZE - scale by multiplying the raw scores GA::MAXIMIZE - scale by dividing the raw scores 0 - minimize or maximize based upon the GA's settings *** This should be called TriangularSharing rather than simply Sharing. ---------------------------------------------------------------------------- */ #if USE_SHARING == 1 class GASharing : public GAScalingScheme { public: GADefineIdentity("GASharing", GAID::Sharing); GASharing(GAGenome::Comparator func, float cut=gaDefSharingCutoff, float a=1.0) { N=0; d=(float*)0; df=func; _sigma = cut; _alpha = a; _minmax = 0; } GASharing(float cut=gaDefSharingCutoff, float a=1.0) { N=0; d=(float*)0; df=0; _sigma = cut; _alpha = a; _minmax = 0; } GASharing(const GASharing & arg) { N=0; d=(float*)0; copy(arg); } GASharing & operator=(const GAScalingScheme & arg){copy(arg); return(*this);} virtual ~GASharing(){ delete [] d;} virtual GAScalingScheme * clone() const {return new GASharing(*this);} virtual void copy(const GAScalingScheme & arg); virtual void evaluate(const GAPopulation & p); GAGenome::Comparator distanceFunction(GAGenome::Comparator f){return df=f;} GAGenome::Comparator distanceFunction() const {return df;} float sigma(float); float sigma() const { return _sigma; } float alpha(float c) { return _alpha = c; } float alpha() const { return _alpha; } int minimaxi(int i); int minimaxi() const { return _minmax; } protected: GAGenome::Comparator df; // the user-defined distance function unsigned int N; // how many do we have? (n of n-by-n) float *d; // the distances for each genome pair float _sigma; // absolute cutoff from central point float _alpha; // controls the curvature of sharing f int _minmax; // should we minimize or maximize? }; #endif #endif gamera-3.3.3/src/ga/GASelector.cpp0000644000076500000000000003607010714675676015645 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- selector.C mbwall 10aug94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This file defines the built-in selection objects for GAlib. ---------------------------------------------------------------------------- */ #include #include #include #include #include #include #if USE_DS_SELECTOR == 1 static void GAQuickSort(unsigned int *, float *, int, int); #endif /* ---------------------------------------------------------------------------- RankSelector ---------------------------------------------------------------------------- */ // Any population may contain more than one individual with the same score. // This method must be able to return any one of those 'best' individuals, so // we do a short search here to find out how many of those 'best' there are. // This routine assumes that the 'best' individual is that with index 0. It // uses either the fitness or objective score to do the ranking, depending on // which was selected in the selector object. #if USE_RANK_SELECTOR == 1 GAGenome & GARankSelector::select() const { int i, count=1; GAPopulation::SortBasis basis = (which == SCALED ? GAPopulation::SCALED : GAPopulation::RAW); pop->sort(gaFalse, basis); if(which == SCALED){ for(i=1; isize() && pop->best(i,basis).fitness() == pop->best(0,basis).fitness(); i++) count++; } else{ for(i=1; isize() && pop->best(i,basis).score() == pop->best(0,basis).score(); i++) count++; } return pop->best(GARandomInt(0,count-1),basis); } #endif /* ---------------------------------------------------------------------------- UniformSelector ---------------------------------------------------------------------------- */ // Randomly select an individual from the population. This selector does not // care whether it operates on the fitness or objective scores. #if USE_UNIFORM_SELECTOR == 1 GAGenome& GAUniformSelector::select() const { return pop->individual(GARandomInt(0, pop->size()-1)); } #endif /* ---------------------------------------------------------------------------- RouletteWheelSelector ---------------------------------------------------------------------------- */ // This selection routine is straight out of Goldberg's Genetic Algorithms // book (with the added restriction of not allowing zero scores - Goldberg // does not address this degenerate case). We look through the members of the // population using a weighted roulette wheel. Likliehood of selection is // proportionate to the fitness score. // This is a binary search method (using cached partial sums). It assumes // that the genomes are in order from best (0th) to worst (n-1). #if USE_ROULETTE_SELECTOR == 1 || USE_TOURNAMENT_SELECTOR == 1 GAGenome & GARouletteWheelSelector::select() const { float cutoff; int i, upper, lower; cutoff = GARandomFloat(); lower = 0; upper = pop->size()-1; while(upper >= lower){ i = lower + (upper-lower)/2; if(psum[i] > cutoff) upper = i-1; else lower = i+1; } lower = GAMin(pop->size()-1, lower); lower = GAMax(0, lower); return pop->individual(lower, (which == SCALED ? GAPopulation::SCALED : GAPopulation::RAW)); } // Update our list of partial sums. Use the appropriate fitness/objective // scores as determined by the flag. The delete/alloc assumes that the pop // size won't be changing a great deal. // Our selector requires that the population is sorted (it uses a binary // search to go faster) so we force the sort here. void GARouletteWheelSelector::update() { if(pop->size() != n){ delete [] psum; n = pop->size(); psum = new float [n]; } int i; if(which == GASelectionScheme::RAW){ if(pop->max() == pop->min()){ for(i=0; imax() > 0 && pop->min() >= 0) || (pop->max() <= 0 && pop->min() < 0)){ pop->sort(gaFalse, GAPopulation::RAW); if(pop->order() == GAPopulation::HIGH_IS_BEST){ psum[0] = pop->individual(0, GAPopulation::RAW).score(); for(i=1; iindividual(i, GAPopulation::RAW).score() + psum[i-1]; for(i=0; iindividual(0, GAPopulation::RAW).score() + pop->max() + pop->min(); for(i=1; iindividual(i, GAPopulation::RAW).score() + pop->max() + pop->min() + psum[i-1]; for(i=0; ifitmax() == pop->fitmin()){ for(i=0; ifitmax() > 0 && pop->fitmin() >= 0) || (pop->fitmax() <= 0 && pop->fitmin() < 0)){ pop->sort(gaFalse, GAPopulation::SCALED); if(pop->order() == GAPopulation::HIGH_IS_BEST){ psum[0] = pop->individual(0, GAPopulation::SCALED).fitness(); for(i=1; iindividual(i, GAPopulation::SCALED).fitness() + psum[i-1]; for(i=0; iindividual(0, GAPopulation::SCALED).fitness() + pop->fitmax() + pop->fitmin(); for(i=1; iindividual(i, GAPopulation::SCALED).fitness() + pop->fitmax() + pop->fitmin() + psum[i-1]; for(i=0; isize()-1; while(upper >= lower){ i = lower + (upper-lower)/2; if(psum[i] > cutoff) upper = i-1; else lower = i+1; } lower = GAMin(pop->size()-1, lower); lower = GAMax(0, lower); picked = lower; cutoff = GARandomFloat(); lower = 0; upper = pop->size()-1; while(upper >= lower){ i = lower + (upper-lower)/2; if(psum[i] > cutoff) upper = i-1; else lower = i+1; } lower = GAMin(pop->size()-1, lower); lower = GAMax(0, lower); GAPopulation::SortBasis basis = (which == SCALED ? GAPopulation::SCALED : GAPopulation::RAW); if(pop->order() == GAPopulation::LOW_IS_BEST){ if(pop->individual(lower,basis).score() < pop->individual(picked,basis).score()) picked = lower; } else{ if(pop->individual(lower,basis).score() > pop->individual(picked,basis).score()) picked = lower; } return pop->individual(picked,basis); } #endif /* ---------------------------------------------------------------------------- SRSSelector - stochastic remainder sampling The selection happens in two stages. First we generate an array using the integer and remainder parts of the expected number of individuals. Then we pick an individual from the population by randomly picking from this array. This is implemented just as in Goldberg's book. Not very efficient... In Goldberg's implementation he uses a variable called 'nremain' so that multiple calls to the selection routine can be dependent upon previous calls. We don't have that option with this architecture; we would need to make selection an object coupled closely with the population to make that work. ---------------------------------------------------------------------------- */ #if USE_SRS_SELECTOR == 1 GAGenome & GASRSSelector::select() const { return pop->individual(choices[GARandomInt(0, pop->size()-1)], (which == SCALED ? GAPopulation::SCALED : GAPopulation::RAW)); } // Make sure we have enough memory to work with. Set values of choices array // to appropriate values. // This is the preselection part. Figure out how many we should expect of // each individual. An individual with e of 4.3 will get 4 places and have a // 30% chance of a 5th place. // This implementation only works if fitness scores are strictly positive or // strictly negative. void GASRSSelector::update() { if(n != (unsigned int)(pop->size())){ delete [] fraction; delete [] choices; n = pop->size(); fraction = new float [n]; choices = new unsigned int [n]; } int i,ne,k=0; if(which == GASelectionScheme::RAW){ if(pop->ave() == 0 || pop->max() == pop->min()){ for(i=0; (unsigned int)imax() >= 0 && pop->min() >= 0) || (pop->max() <= 0 && pop->min() <= 0)){ float expected; for(i=0; isize(); i++){ if(pop->order() == GAPopulation::HIGH_IS_BEST) expected = pop->individual(i, GAPopulation::RAW).score()/pop->ave(); else expected = (-pop->individual(i, GAPopulation::RAW).score() + pop->max() + pop->min())/pop->ave(); ne = (int)expected; fraction[i] = expected - ne; while(ne > 0){ choices[k] = i; k++; ne--; } } i=0; while(k < pop->size()){ if(fraction[i] > 0.0 && GAFlipCoin(fraction[i])){ choices[k] = i; fraction[i] -= 1.0; k++; } i++; if(i >= pop->size()) i=0; } } else { GAErr(GA_LOC, className(), "update", "objective scores are not strictly negative or strictly positive", "this selection method cannot be used with these scores"); } } else { if(pop->fitave() == 0 || pop->fitmax() == pop->fitmin()){ for(i=0; (unsigned int)ifitmax() >= 0 && pop->fitmin() >= 0) || (pop->fitmax() <= 0 && pop->fitmin() <= 0)){ float expected; for(i=0; isize(); i++){ if(pop->order() == GAPopulation::HIGH_IS_BEST) expected = pop->individual(i, GAPopulation::SCALED).fitness()/pop->fitave(); else expected = (-pop->individual(i, GAPopulation::SCALED).fitness() + pop->fitmax() + pop->fitmin()) / pop->fitave(); ne = (int)expected; fraction[i] = expected - ne; while(ne > 0){ choices[k] = i; k++; ne--; } } i=0; int flag = 1; while(k < pop->size() && flag){ if(i >= pop->size()){ i=0; flag = 0; } if(fraction[i] > 0.0 && GAFlipCoin(fraction[i])){ choices[k] = i; fraction[i] -= 1.0; k++; flag = 1; } i++; } if(k < pop->size()){ for(; ksize(); k++) choices[k] = GARandomInt(0,pop->size()-1); } } else { GAErr(GA_LOC, className(), "update", "fitness scores are not strictly negative or strictly positive", "this selection method cannot be used with these scores"); } } } #endif /* ---------------------------------------------------------------------------- DSSelector - deterministic sampling This is implemented as described in Goldberg's book. ---------------------------------------------------------------------------- */ #if USE_DS_SELECTOR == 1 GAGenome & GADSSelector::select() const { return pop->individual(choices[GARandomInt(0, pop->size()-1)], (which == SCALED ? GAPopulation::SCALED : GAPopulation::RAW)); } // Make sure we have enough memory to work with. Then calc the choices array. // This is the preselection part. Figure out how many we should expect of // each individual. An individual with e of 4.3 will get 4 places, an // individual with e of 5.9 will get 5 places. If there are any spaces // remaining then we fill them with the individuals with highest fractional // values (don't as *ME* why Goldberg does it this way...) // This implementation only works if fitness scores are strictly positive or // strictly negative. void GADSSelector::update() { if(n != (unsigned int)pop->size()){ delete [] fraction; delete [] choices; delete [] idx; n = pop->size(); fraction = new float [n]; choices = new unsigned int [n]; idx = new unsigned int [n]; } int i,ne,k=0; if(which == GASelectionScheme::RAW){ if(pop->ave() == 0 || pop->max() == pop->min()){ for(i=0; (unsigned int)imax() >= 0 && pop->min() >= 0) || (pop->max() <= 0 && pop->min() <= 0)){ float expected; for(i=0; isize(); i++){ idx[i] = i; if(pop->order() == GAPopulation::HIGH_IS_BEST) expected = pop->individual(i, GAPopulation::RAW).score()/pop->ave(); else expected = (-pop->individual(i, GAPopulation::RAW).score() + pop->max() + pop->min())/pop->ave(); ne = (int)expected; fraction[i] = expected - ne; while(ne > 0){ choices[k] = i; k++; ne--; } } GAQuickSort(idx, fraction, 0, n-1); for(i=pop->size()-1; ksize(); k++, i--) choices[k] = idx[i]; } else{ GAErr(GA_LOC, className(), "update", "objective scores are not strictly negative or strictly positive", "this selection method cannot be used with these scores"); } } else{ if(pop->fitave() == 0 || pop->fitmax() == pop->fitmin()){ for(i=0; (unsigned int)ifitmax() >= 0 && pop->fitmin() >= 0) || (pop->fitmax() <= 0 && pop->fitmin() <= 0)){ float expected; for(i=0; isize(); i++){ idx[i] = i; if(pop->order() == GAPopulation::HIGH_IS_BEST) expected = pop->individual(i, GAPopulation::SCALED).fitness()/pop->fitave(); else expected = (-pop->individual(i, GAPopulation::SCALED).fitness() + pop->fitmax() + pop->fitmin()) / pop->fitave(); ne = (int)expected; fraction[i] = expected - ne; while(ne > 0){ choices[k] = i; k++; ne--; } } GAQuickSort(idx, fraction, 0, n-1); for(i=pop->size()-1; ksize(); k++, i--) choices[k] = idx[i]; } else{ GAErr(GA_LOC, className(), "update", "fitness scores are not strictly negative or strictly positive", "this selection method cannot be used with these scores"); } } } static void GAQuickSort(unsigned int *c, float *s, int l, int r) { int i,j; float v; unsigned int tc; float ts; if(r > l){ v = s[r]; i = l-1; j = r; for(;;){ while(s[++i] < v); // might exceed max array limit here while(s[--j] > v && j > 0); if(i >= j) break; tc = c[i]; c[i] = c[j]; c[j] = tc; ts = s[i]; s[i] = s[j]; s[j] = ts; } tc = c[i]; c[i] = c[r]; c[r] = tc; ts = s[i]; s[i] = s[r]; s[r] = ts; GAQuickSort(c,s,l,i-1); GAQuickSort(c,s,i+1,r); } } #endif gamera-3.3.3/src/ga/GASelector.h0000644000076500000000000002462210714675676015312 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- selector.h mbwall 10aug94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: The selectors are functions that use information in fitness objects to pick genomes from a population. There are a number of selection criteria, and not every selection method will work with every fitness object. These are the pre-defined selection methods. A brief outline of what each one does is given here, but for more details (especially the theoretical foundations for each method), see Goldberg. See the source file for some implementation details that Goldberg does not delve into. The selection methods can, to some extent, be mixed and matched with the various scaling methods. If you want to do speciating selection (e.g. DeJong-style crowding with Hamming distance) then you will have to write your own selection method. Rank - pick the genome with the best fitness (not objective score) RouletteWheel - weighted selection where individuals with better fitness have a greater chance of being selected than those with lower scores. Tournament - similar to roulette, but instead of choosing one, choose two then pick the better of the two as the selected individuals Uniform - stochastic uniform selection picks randomly from the population. Each individual has as much chance as any other. SRS - stochastic remainder selection does a preselection based on the expected number of each genome, then a random sampling on the preselected list. DS - deterministic sampling is implemented as described in Goldberg's book (as much as I could understand it, anyway). ---------------------------------------------------------------------------- */ #ifndef _ga_selector_h_ #define _ga_selector_h_ #include #include class GAGenome; class GAPopulation; /* ---------------------------------------------------------------------------- The base class definition for the selector object defines the interface. Any derived selector must define a clone member and a select member. If you add any special data members then you should also define a copy member. Any selector can do its business based on fitness or objective scores. The base selector provides the mechanism for this. Derived classes can use it if they want to, or ignore it. ---------------------------------------------------------------------------- */ class GASelectionScheme : public GAID { public: GADefineIdentity("GASelectionScheme", GAID::Selection); enum { RAW, SCALED }; GASelectionScheme(int w=SCALED) { which = w;} GASelectionScheme(const GASelectionScheme& orig) { copy(orig); } GASelectionScheme& operator=(const GASelectionScheme& orig) { if(&orig != this) copy(orig); return *this; } virtual ~GASelectionScheme() {} virtual GASelectionScheme* clone() const=0; virtual void copy(const GASelectionScheme& orig) { pop=orig.pop; which=orig.which; } virtual void assign(GAPopulation& p) { pop = &p; } virtual void update() {} virtual GAGenome& select() const=0; protected: GAPopulation* pop; int which; // should we use fitness or objective scores? }; /* ---------------------------------------------------------------------------- The rank selector simply picks the best individual in the population. You can specify whether the selector should use the raw (objective) scores or the scaled (fitness) scores to determine the best individual. Default is fitness. ---------------------------------------------------------------------------- */ #if USE_RANK_SELECTOR == 1 class GARankSelector : public GASelectionScheme { public: GADefineIdentity("GARankSelector", GAID::RankSelection); GARankSelector(int w=GASelectionScheme::SCALED) : GASelectionScheme(w) {} GARankSelector(const GARankSelector& orig) { copy(orig); } GARankSelector& operator=(const GASelectionScheme& orig) { if(&orig != this) copy(orig); return *this; } virtual ~GARankSelector() {} virtual GASelectionScheme* clone() const { return new GARankSelector; } virtual GAGenome& select() const; }; #endif /* ---------------------------------------------------------------------------- Roulette wheel uses a fitness-proportional algorithm for selecting individuals. ---------------------------------------------------------------------------- */ #if USE_ROULETTE_SELECTOR == 1 || USE_TOURNAMENT_SELECTOR == 1 class GARouletteWheelSelector : public GASelectionScheme { public: GADefineIdentity("GARouletteWheelSelector", GAID::RouletteWheelSelection); GARouletteWheelSelector(int w=GASelectionScheme::SCALED) : GASelectionScheme(w) { psum = (float*)0; n = 0; } GARouletteWheelSelector(const GARouletteWheelSelector& orig) { psum = (float*)0; n = 0; copy(orig); } GARouletteWheelSelector& operator=(const GASelectionScheme& orig) { if(&orig != this) copy(orig); return *this; } virtual ~GARouletteWheelSelector() { delete [] psum; } virtual GASelectionScheme* clone() const { return new GARouletteWheelSelector; } virtual void copy(const GASelectionScheme& orig) { GASelectionScheme::copy(orig); const GARouletteWheelSelector& sel = DYN_CAST(const GARouletteWheelSelector&,orig); delete [] psum; n = sel.n; psum = new float[n]; memcpy(psum, sel.psum, n * sizeof(float)); } virtual GAGenome& select() const; virtual void update(); protected: int n; float* psum; }; #endif /* ---------------------------------------------------------------------------- This version of the tournament selector does two roulette wheel selections then picks the better of the two. We derive from the roulette wheel class so that we can use its update method. ---------------------------------------------------------------------------- */ #if USE_TOURNAMENT_SELECTOR == 1 class GATournamentSelector : public GARouletteWheelSelector { public: GADefineIdentity("GATournamentSelector", GAID::TournamentSelection); GATournamentSelector(int w=GASelectionScheme::SCALED) : GARouletteWheelSelector(w) {} GATournamentSelector(const GATournamentSelector& orig) { copy(orig); } GATournamentSelector& operator=(const GASelectionScheme& orig) { if(&orig != this) copy(orig); return *this; } virtual ~GATournamentSelector() {} virtual GASelectionScheme* clone() const { return new GATournamentSelector; } virtual GAGenome& select() const; }; #endif /* ---------------------------------------------------------------------------- Stochastic uniform sampling selection. This is just a fancy name for random sampling. Any individual in the population has as much chance of being selected as any other. ---------------------------------------------------------------------------- */ #if USE_UNIFORM_SELECTOR == 1 class GAUniformSelector : public GASelectionScheme { public: GADefineIdentity("GAUniformSelector", GAID::UniformSelection); GAUniformSelector(int w=GASelectionScheme::SCALED) : GASelectionScheme(w) { } GAUniformSelector(const GAUniformSelector& orig) { copy(orig); } GAUniformSelector& operator=(const GASelectionScheme& orig) { if(&orig != this) copy(orig); return *this; } virtual ~GAUniformSelector() { } virtual GASelectionScheme* clone() const { return new GAUniformSelector; } virtual GAGenome& select() const; }; #endif /* ---------------------------------------------------------------------------- Stochastic remainder sampling selection. ---------------------------------------------------------------------------- */ #if USE_SRS_SELECTOR == 1 class GASRSSelector : public GASelectionScheme { public: GADefineIdentity("GASRSSelector", GAID::SRSSelection); GASRSSelector(int w=GASelectionScheme::SCALED) : GASelectionScheme(w) { fraction = (float*)0; choices = (unsigned int *)0; n = 0; } GASRSSelector(const GASRSSelector& orig) { fraction = (float*)0; choices = (unsigned int *)0; n = 0; copy(orig); } GASRSSelector& operator=(const GASelectionScheme& orig) { if(&orig != this) copy(orig); return *this; } virtual ~GASRSSelector() { delete [] fraction; delete [] choices; } virtual GASelectionScheme* clone() const { return new GASRSSelector; } virtual void copy(const GASelectionScheme& orig) { GASelectionScheme::copy(orig); const GASRSSelector& sel = DYN_CAST(const GASRSSelector&, orig); delete [] fraction; delete [] choices; n = sel.n; fraction = new float [n]; choices = new unsigned int [n]; memcpy(fraction, sel.fraction, n * sizeof(float)); memcpy(choices, sel.choices, n * sizeof(unsigned int)); } virtual GAGenome& select() const; virtual void update(); protected: float *fraction; unsigned int *choices; unsigned int n; }; #endif /* ---------------------------------------------------------------------------- Deterministic sampling selection. ---------------------------------------------------------------------------- */ #if USE_DS_SELECTOR == 1 class GADSSelector : public GASelectionScheme { public: GADefineIdentity("GADSSelector", GAID::DSSelection); GADSSelector(int w=GASelectionScheme::SCALED) : GASelectionScheme(w) { fraction = (float*)0; choices = (unsigned int *)0; idx = (unsigned int *)0; n = 0; } GADSSelector(const GADSSelector& orig) { fraction = (float*)0; choices = (unsigned int *)0; idx = (unsigned int *)0; n = 0; copy(orig); } GADSSelector& operator=(const GASelectionScheme& orig) { if(&orig != this) copy(orig); return *this; } virtual ~GADSSelector() { delete [] fraction; delete [] choices; delete [] idx; } virtual GASelectionScheme* clone() const { return new GADSSelector; } virtual void copy(const GASelectionScheme& orig) { GASelectionScheme::copy(orig); const GADSSelector& sel = DYN_CAST(const GADSSelector&, orig); delete [] fraction; delete [] choices; delete [] idx; n = sel.n; fraction = new float [n]; choices = new unsigned int [n]; idx = new unsigned int [n]; memcpy(fraction, sel.fraction, n * sizeof(float)); memcpy(choices, sel.choices, n * sizeof(unsigned int)); memcpy(idx, sel.idx, n * sizeof(unsigned int)); } virtual GAGenome& select() const; virtual void update(); protected: float *fraction; unsigned int *choices; unsigned int *idx; unsigned int n; }; #endif #endif gamera-3.3.3/src/ga/GASimpleGA.cpp0000644000076500000000000001477310714675676015534 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gasimple.C mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved Source file for the simple genetic algorithm object. ---------------------------------------------------------------------------- */ #include #include GAParameterList& GASimpleGA::registerDefaultParameters(GAParameterList& p) { GAGeneticAlgorithm::registerDefaultParameters(p); p.add(gaNelitism, gaSNelitism, GAParameter::BOOLEAN, &gaDefElitism); return p; } GASimpleGA::GASimpleGA(const GAGenome& c) : GAGeneticAlgorithm(c){ oldPop = pop->clone(); el = gaTrue; params.add(gaNelitism, gaSNelitism, GAParameter::BOOLEAN, &el); } GASimpleGA::GASimpleGA(const GAPopulation& p) : GAGeneticAlgorithm(p){ oldPop = pop->clone(); el = gaTrue; params.add(gaNelitism, gaSNelitism, GAParameter::BOOLEAN, &el); } GASimpleGA::GASimpleGA(const GASimpleGA& ga) : GAGeneticAlgorithm(ga){ oldPop = (GAPopulation *)0; copy(ga); } GASimpleGA::~GASimpleGA(){ delete oldPop; } GASimpleGA& GASimpleGA::operator=(const GASimpleGA& ga){ if(&ga != this) copy(ga); return *this; } void GASimpleGA::copy(const GAGeneticAlgorithm & g){ GAGeneticAlgorithm::copy(g); const GASimpleGA& ga = DYN_CAST(const GASimpleGA&,g); el = ga.el; if(oldPop) oldPop->copy(*(ga.oldPop)); else oldPop = ga.oldPop->clone(); oldPop->geneticAlgorithm(*this); } int GASimpleGA::setptr(const char* name, const void* value){ int status = GAGeneticAlgorithm::setptr(name, value); if(strcmp(name, gaNelitism) == 0 || strcmp(name, gaSNelitism) == 0){ el = (*((int*)value) != 0 ? gaTrue : gaFalse); status = 0; } return status; } int GASimpleGA::get(const char* name, void* value) const { int status = GAGeneticAlgorithm::get(name, value); if(strcmp(name, gaNelitism) == 0 || strcmp(name, gaSNelitism) == 0){ *((int*)value) = (el == gaTrue ? 1 : 0); status = 0; } return status; } void GASimpleGA::objectiveFunction(GAGenome::Evaluator f){ GAGeneticAlgorithm::objectiveFunction(f); for(int i=0; isize(); i++) oldPop->individual(i).evaluator(f); } void GASimpleGA::objectiveData(const GAEvalData& v){ GAGeneticAlgorithm::objectiveData(v); for(int i=0; isize(); i++) pop->individual(i).evalData(v); } const GAPopulation& GASimpleGA::population(const GAPopulation& p) { if(p.size() < 1) { GAErr(GA_LOC, className(), "population", gaErrNoIndividuals); return *pop; } GAGeneticAlgorithm::population(p); oldPop->copy(*pop->clone()); oldPop->geneticAlgorithm(*this); return *pop; } int GASimpleGA::populationSize(unsigned int n) { GAGeneticAlgorithm::populationSize(n); oldPop->size(n); return n; } int GASimpleGA::minimaxi(int m) { GAGeneticAlgorithm::minimaxi(m); if(m == MINIMIZE) oldPop->order(GAPopulation::LOW_IS_BEST); else oldPop->order(GAPopulation::HIGH_IS_BEST); return minmax; } // Initialize the population, set the random seed as needed, do a few stupidity // checks, reset the stats. We must initialize the old pop because there is no // guarantee that each individual will get initialized during the course of our // operator++ operations. We do not evaluate the old pop because that will // happen as-needed later on. void GASimpleGA::initialize(unsigned int seed) { GARandomSeed(seed); pop->initialize(); pop->evaluate(gaTrue); // the old pop will get it when the pops switch // oldPop->initialize(); stats.reset(*pop); if(!scross) GAErr(GA_LOC, className(), "initialize", gaErrNoSexualMating); } // Evolve a new generation of genomes. When we start this routine, pop // contains the current generation. When we finish, pop contains the new // generation and oldPop contains the (no longer) current generation. The // previous old generation is lost. We don't deallocate any memory, we just // reset the contents of the genomes. // The selection routine must return a pointer to a genome from the old // population. void GASimpleGA::step() { int i, mut, c1, c2; GAGenome *mom, *dad; // tmp holders for selected genomes GAPopulation *tmppop; // Swap the old population with the new pop. tmppop = oldPop; // When we finish the ++ we want the newly oldPop = pop; // generated population to be current (for pop = tmppop; // references to it from member functions). // Generate the individuals in the temporary population from individuals in // the main population. for(i=0; isize()-1; i+=2){ // takes care of odd population mom = &(oldPop->select()); dad = &(oldPop->select()); stats.numsel += 2; // keep track of number of selections c1 = c2 = 0; if(GAFlipCoin(pCrossover())){ stats.numcro += (*scross)(*mom, *dad, &pop->individual(i), &pop->individual(i+1)); c1 = c2 = 1; } else{ pop->individual( i ).copy(*mom); pop->individual(i+1).copy(*dad); } stats.nummut += (mut = pop->individual( i ).mutate(pMutation())); if(mut > 0) c1 = 1; stats.nummut += (mut = pop->individual(i+1).mutate(pMutation())); if(mut > 0) c2 = 1; stats.numeval += c1 + c2; } if(pop->size() % 2 != 0){ // do the remaining population member mom = &(oldPop->select()); dad = &(oldPop->select()); stats.numsel += 2; // keep track of number of selections c1 = 0; if(GAFlipCoin(pCrossover())){ stats.numcro += (*scross)(*mom, *dad, &pop->individual(i), (GAGenome*)0); c1 = 1; } else{ if(GARandomBit()) pop->individual( i ).copy(*mom); else pop->individual( i ).copy(*dad); } stats.nummut += (mut = pop->individual( i ).mutate(pMutation())); if(mut > 0) c1 = 1; stats.numeval += c1; } stats.numrep += pop->size(); pop->evaluate(gaTrue); // get info about current pop for next time // If we are supposed to be elitist, carry the best individual from the old // population into the current population. Be sure to check whether we are // supposed to minimize or maximize. if(minimaxi() == GAGeneticAlgorithm::MAXIMIZE) { if(el && oldPop->best().score() > pop->best().score()) oldPop->replace(pop->replace(&(oldPop->best()), GAPopulation::WORST), GAPopulation::BEST); } else { if(el && oldPop->best().score() < pop->best().score()) oldPop->replace(pop->replace(&(oldPop->best()), GAPopulation::WORST), GAPopulation::BEST); } stats.update(*pop); // update the statistics by one generation } gamera-3.3.3/src/ga/GASimpleGA.h0000644000076500000000000000446510714675676015176 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gasimple.h mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved Header file for the simple genetic algorithm class. ---------------------------------------------------------------------------- */ #ifndef _ga_gasimple_h_ #define _ga_gasimple_h_ #include class GASimpleGA : public GAGeneticAlgorithm { public: GADefineIdentity("GASimpleGA", GAID::SimpleGA); static GAParameterList& registerDefaultParameters(GAParameterList&); public: GASimpleGA(const GAGenome&); GASimpleGA(const GAPopulation&); GASimpleGA(const GASimpleGA&); GASimpleGA& operator=(const GASimpleGA&); virtual ~GASimpleGA(); virtual void copy(const GAGeneticAlgorithm&); virtual void initialize(unsigned int seed=0); virtual void step(); GASimpleGA & operator++() { step(); return *this; } virtual int setptr(const char* name, const void* value); virtual int get(const char* name, void* value) const; GABoolean elitist() const {return el;} GABoolean elitist(GABoolean flag) {params.set(gaNelitism, (int)flag); return el=flag;} virtual int minimaxi() const {return minmax;} virtual int minimaxi(int m); virtual const GAPopulation& population() const {return *pop;} virtual const GAPopulation& population(const GAPopulation&); virtual int populationSize() const {return pop->size();} virtual int populationSize(unsigned int n); virtual GAScalingScheme& scaling() const {return pop->scaling();} virtual GAScalingScheme& scaling(const GAScalingScheme & s) {oldPop->scaling(s); return GAGeneticAlgorithm::scaling(s);} virtual GASelectionScheme& selector() const {return pop->selector(); } virtual GASelectionScheme& selector(const GASelectionScheme& s) {oldPop->selector(s); return GAGeneticAlgorithm::selector(s);} virtual void objectiveFunction(GAGenome::Evaluator f); virtual void objectiveData(const GAEvalData& v); protected: GAPopulation *oldPop; // current and old populations GABoolean el; // are we elitist? }; #ifndef NO_STREAMS inline ostream& operator<< (ostream& os, GASimpleGA & arg) { arg.write(os); return(os); } inline istream& operator>> (istream& is, GASimpleGA & arg) { arg.read(is); return(is); } #endif #endif gamera-3.3.3/src/ga/GASStateGA.cpp0000644000076500000000000002331710714675676015500 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gasteadystate.C mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved Souce file for the steady-state genetic algorithm object. ---------------------------------------------------------------------------- */ #include #include //#define GA_DEBUG #define USE_PREPL 0 #define USE_NREPL 1 GAParameterList& GASteadyStateGA::registerDefaultParameters(GAParameterList& p) { GAGeneticAlgorithm::registerDefaultParameters(p); int ival = 1; p.add(gaNnReplacement, gaSNnReplacement, GAParameter::INT, &ival); p.add(gaNpReplacement, gaSNpReplacement, GAParameter::FLOAT, &gaDefPRepl); p.set(gaNscoreFrequency, gaDefScoreFrequency2); return p; } GASteadyStateGA::GASteadyStateGA(const GAGenome& c) : GAGeneticAlgorithm(c) { pRepl = gaDefPRepl; params.add(gaNpReplacement, gaSNpReplacement, GAParameter::FLOAT, &pRepl); float n = ((pRepl*(float)pop->size() < 1) ? 1 : pRepl*(float)pop->size()); tmpPop = new GAPopulation(pop->individual(0), (unsigned int)n); nRepl = tmpPop->size(); params.add(gaNnReplacement, gaSNnReplacement, GAParameter::INT, &nRepl); stats.scoreFrequency(gaDefScoreFrequency2); params.set(gaNscoreFrequency, gaDefScoreFrequency2); which = USE_PREPL; } GASteadyStateGA::GASteadyStateGA(const GAPopulation& p): GAGeneticAlgorithm(p){ pRepl = gaDefPRepl; params.add(gaNpReplacement, gaSNpReplacement, GAParameter::FLOAT, &pRepl); float n = ((pRepl*(float)pop->size() < 1) ? 1 : pRepl*(float)pop->size()); tmpPop = new GAPopulation(pop->individual(0), (unsigned int)n); nRepl = tmpPop->size(); params.add(gaNnReplacement, gaSNnReplacement, GAParameter::INT, &nRepl); stats.scoreFrequency(gaDefScoreFrequency2); params.set(gaNscoreFrequency, gaDefScoreFrequency2); which = USE_PREPL; } GASteadyStateGA::GASteadyStateGA(const GASteadyStateGA& ga) : GAGeneticAlgorithm(ga) { tmpPop = (GAPopulation *)0; copy(ga); } GASteadyStateGA::~GASteadyStateGA(){ delete tmpPop; } GASteadyStateGA& GASteadyStateGA::operator=(const GASteadyStateGA& ga){ if(&ga != this) copy(ga); return *this; } void GASteadyStateGA::copy(const GAGeneticAlgorithm & g){ GAGeneticAlgorithm::copy(g); const GASteadyStateGA& ga = DYN_CAST(const GASteadyStateGA&, g); pRepl = ga.pRepl; nRepl = ga.nRepl; if(tmpPop) tmpPop->copy(*(ga.tmpPop)); else tmpPop = ga.tmpPop->clone(); tmpPop->geneticAlgorithm(*this); which = ga.which; } int GASteadyStateGA::setptr(const char* name, const void* value){ int status = GAGeneticAlgorithm::setptr(name, value); if(strcmp(name, gaNpReplacement) == 0 || strcmp(name, gaSNpReplacement) == 0){ #ifdef GA_DEBUG cerr << "GAGeneticAlgorithm::setptr\n setting '" << name << "' to '" << *((float*)value) << "'\n"; #endif pReplacement(*((float*)value)); status = 0; } else if(strcmp(name, gaNnReplacement) == 0 || strcmp(name, gaSNnReplacement) == 0){ #ifdef GA_DEBUG cerr << "GAGeneticAlgorithm::setptr\n setting '" << name << "' to '" << *((int*)value) << "'\n"; #endif nReplacement(*((int*)value)); status = 0; } return status; } int GASteadyStateGA::get(const char* name, void* value) const { int status = GAGeneticAlgorithm::get(name, value); if(strcmp(name, gaNpReplacement) == 0 || strcmp(name, gaSNpReplacement) == 0){ *((float*)value) = pRepl; status = 0; } else if(strcmp(name, gaNnReplacement) == 0 || strcmp(name, gaSNnReplacement) == 0){ *((int*)value) = nRepl; status = 0; } return status; } void GASteadyStateGA::objectiveFunction(GAGenome::Evaluator f){ GAGeneticAlgorithm::objectiveFunction(f); for(int i=0; isize(); i++) tmpPop->individual(i).evaluator(f); } void GASteadyStateGA::objectiveData(const GAEvalData& v){ GAGeneticAlgorithm::objectiveData(v); for(int i=0; isize(); i++) tmpPop->individual(i).evalData(v); } const GAPopulation& GASteadyStateGA::population(const GAPopulation& p) { if(p.size() < 1) { GAErr(GA_LOC, className(), "population", gaErrNoIndividuals); return *pop; } GAGeneticAlgorithm::population(p); delete tmpPop; if(which == USE_PREPL){ float n = pRepl * pop->size(); if(n < 1) n = 1.0; nRepl = (unsigned int)n; params.set(gaNnReplacement, nRepl); } else{ if(nRepl > (unsigned int)(pop->size())) nRepl = pop->size(); if(nRepl < 1) nRepl = 1; } tmpPop = new GAPopulation(pop->individual(0), nRepl); tmpPop->geneticAlgorithm(*this); return *pop; } int GASteadyStateGA::populationSize(unsigned int value){ GAGeneticAlgorithm::populationSize(value); if(which == USE_PREPL){ float n = ((pRepl*(float)pop->size() < 1) ? 1 : pRepl*(float)pop->size()); nRepl = (unsigned int)n; params.set(gaNnReplacement, (unsigned int)nRepl); tmpPop->size(nRepl); } else { // if we're using nrepl, be sure in valid range if(nRepl > value) { // clip to new population size nRepl = value; tmpPop->size(nRepl); } } return value; } // If we get a value of 0 for either of these, this means to use the other // measure instead. float GASteadyStateGA::pReplacement(float value){ if(value == pRepl) return pRepl; if(value <= 0 || value > 1){ GAErr(GA_LOC, className(), "pReplacement", gaErrBadPRepl); params.set(gaNpReplacement, pRepl); // force it back return pRepl; } params.set(gaNpReplacement, (double)value); pRepl = value; float n = ((value*(float)pop->size() < 1) ? 1 : value*(float)pop->size()); nRepl = (unsigned int)n; params.set(gaNnReplacement, (unsigned int)nRepl); which = USE_PREPL; tmpPop->size(nRepl); return pRepl; } int GASteadyStateGA::nReplacement(unsigned int value){ if(value == nRepl) return nRepl; if(value == 0 || value > (unsigned int)(pop->size())){ GAErr(GA_LOC, className(), "nReplacement", gaErrBadNRepl); params.set(gaNnReplacement, nRepl); // force it back return nRepl; } params.set(gaNnReplacement, (unsigned int)value); nRepl = value; pRepl = (float)nRepl / (float)pop->size(); params.set(gaNpReplacement, (double)pRepl); which = USE_NREPL; tmpPop->size(nRepl); return nRepl; } int GASteadyStateGA::minimaxi(int m) { GAGeneticAlgorithm::minimaxi(m); if(m == MINIMIZE) tmpPop->order(GAPopulation::LOW_IS_BEST); else tmpPop->order(GAPopulation::HIGH_IS_BEST); return minmax; } // For initialization we set the random seed, check for stupid errors, init the // population, reset the statistics, and that's it. // If we don't get a seed then we set it ourselves. If we do get one, then // we use it as the random seed. void GASteadyStateGA::initialize(unsigned int seed) { GARandomSeed(seed); pop->initialize(); pop->evaluate(gaTrue); stats.reset(*pop); if(!scross) GAErr(GA_LOC, className(), "initialize", gaErrNoSexualMating); } // Evolve a new generation of genomes. A steady-state GA has no 'old' // and 'new' populations - we pick from the current population and replace its // members with the new ones we create. We replace the worst members of the // preceeding population. If a genome in the tmp population is worse than // one in the main population, the genome in the main population will be // replaced regardless of its better score. void GASteadyStateGA::step() { int i, mut, c1, c2; GAGenome *mom, *dad; // tmp holders for selected genomes // Generate the individuals in the temporary population from individuals in // the main population. for(i=0; isize()-1; i+=2){ // takes care of odd population mom = &(pop->select()); dad = &(pop->select()); stats.numsel += 2; // keep track of number of selections c1 = c2 = 0; if(GAFlipCoin(pCrossover())){ stats.numcro += (*scross)(*mom, *dad, &tmpPop->individual(i), &tmpPop->individual(i+1)); c1 = c2 = 1; } else{ tmpPop->individual( i ).copy(*mom); tmpPop->individual(i+1).copy(*dad); } stats.nummut += (mut = tmpPop->individual( i ).mutate(pMutation())); if(mut > 0) c1 = 1; stats.nummut += (mut = tmpPop->individual(i+1).mutate(pMutation())); if(mut > 0) c2 = 1; stats.numeval += c1 + c2; } if(tmpPop->size() % 2 != 0){ // do the remaining population member mom = &(pop->select()); dad = &(pop->select()); stats.numsel += 2; // keep track of number of selections c1 = 0; if(GAFlipCoin(pCrossover())){ stats.numcro += (*scross)(*mom, *dad, &tmpPop->individual(i), (GAGenome*)0); c1 = 1; } else{ if(GARandomBit()) tmpPop->individual( i ).copy(*mom); else tmpPop->individual( i ).copy(*dad); } stats.nummut += (mut = tmpPop->individual( i ).mutate(pMutation())); if(mut > 0) c1 = 1; stats.numeval += c1; } // Replace the worst genomes in the main population with all of the individuals // we just created. Notice that we invoke the population's add member with a // genome pointer rather than reference. This way we don't force a clone of // the genome - we just let the population take over. Then we take it back by // doing a remove then a replace in the tmp population. for(i=0; isize(); i++) pop->add(&tmpPop->individual(i)); pop->evaluate(); // get info about current pop for next time pop->scale(); // remind the population to do its scaling // the individuals in tmpPop are all owned by pop, but tmpPop does not know // that. so we use replace to take the individuals from the pop and stick // them back into tmpPop for(i=0; isize(); i++) tmpPop->replace(pop->remove(GAPopulation::WORST, GAPopulation::SCALED), i); stats.numrep += tmpPop->size(); stats.update(*pop); // update the statistics by one generation } gamera-3.3.3/src/ga/GASStateGA.h0000644000076500000000000000510610714675676015141 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gasteadystate.h mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved Header file for the steady-state genetic algorithm class. ---------------------------------------------------------------------------- */ #ifndef _ga_gasteadystate_h_ #define _ga_gasteadystate_h_ #include class GASteadyStateGA : public GAGeneticAlgorithm { public: GADefineIdentity("GASteadyStateGA", GAID::SteadyStateGA); static GAParameterList& registerDefaultParameters(GAParameterList&); public: GASteadyStateGA(const GAGenome&); GASteadyStateGA(const GAPopulation&); GASteadyStateGA(const GASteadyStateGA&); GASteadyStateGA& operator=(const GASteadyStateGA&); virtual ~GASteadyStateGA(); virtual void copy(const GAGeneticAlgorithm&); virtual void initialize(unsigned int seed=0); virtual void step(); GASteadyStateGA & operator++() { step(); return *this; } virtual int setptr(const char* name, const void* value); virtual int get(const char* name, void* value) const; virtual int minimaxi() const {return minmax;} virtual int minimaxi(int m); virtual const GAPopulation& population() const {return *pop;} virtual const GAPopulation& population(const GAPopulation&); virtual int populationSize() const {return pop->size();} virtual int populationSize(unsigned int n); virtual GAScalingScheme& scaling() const {return pop->scaling();} virtual GAScalingScheme& scaling(const GAScalingScheme & s) { /* tmpPop->scaling(s); */ return GAGeneticAlgorithm::scaling(s); } virtual GASelectionScheme& selector() const {return pop->selector(); } virtual GASelectionScheme& selector(const GASelectionScheme& s) { /* tmpPop->selector(s); */ return GAGeneticAlgorithm::selector(s); } virtual void objectiveFunction(GAGenome::Evaluator f); virtual void objectiveData(const GAEvalData& v); float pReplacement() const { return pRepl; } float pReplacement(float p); int nReplacement() const { return nRepl; } int nReplacement(unsigned int n); protected: GAPopulation *tmpPop; // temporary population for replacements float pRepl; // percentage of population to replace each gen unsigned int nRepl; // how many of each population to replace short which; // 0 if prepl, 1 if nrepl }; #ifndef NO_STREAMS inline ostream& operator<< (ostream& os, GASteadyStateGA & arg) { arg.write(os); return(os); } inline istream& operator>> (istream& is, GASteadyStateGA & arg) { arg.read(is); return(is); } #endif #endif gamera-3.3.3/src/ga/GAStatistics.cpp0000644000076500000000000004354010714675676016217 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- statistics.C mbwall 28jul94 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Definition of the statistics object. ---------------------------------------------------------------------------- */ #include #include #include // Default settings and their names. int gaDefNumBestGenomes = 1; int gaDefScoreFrequency1 = 1; int gaDefScoreFrequency2 = 100; int gaDefFlushFrequency = 0; char gaDefScoreFilename[] = "generations.dat"; GAStatistics::GAStatistics() { curgen = 0; numsel = numcro = nummut = numrep = numeval = numpeval = 0; maxever = minever = 0.0; on = offmax = offmin = 0.0; aveInit = maxInit = minInit = devInit = 0.0; divInit = -1.0; aveCur = maxCur = minCur = devCur = 0.0; divCur = -1.0; scoreFreq = gaDefScoreFrequency1; dodiv = gaFalse; // default is do not calculate diversity nconv=0; Nconv = 10; cscore = new float[Nconv]; memset(cscore, 0, Nconv*sizeof(float)); nscrs=0; Nscrs = gaDefFlushFrequency; gen = new int[Nscrs]; memset(gen, 0, Nscrs*sizeof(int)); aveScore = new float[Nscrs]; memset(aveScore, 0, Nscrs*sizeof(float)); maxScore = new float[Nscrs]; memset(maxScore, 0, Nscrs*sizeof(float)); minScore = new float[Nscrs]; memset(minScore, 0, Nscrs*sizeof(float)); devScore = new float[Nscrs]; memset(devScore, 0, Nscrs*sizeof(float)); divScore = new float[Nscrs]; memset(divScore, 0, Nscrs*sizeof(float)); scorefile = new char[strlen(gaDefScoreFilename)+1]; strcpy(scorefile, gaDefScoreFilename); which = Maximum; boa = (GAPopulation *)0; } GAStatistics::GAStatistics(const GAStatistics & orig){ cscore=(float *)0; gen=(int *)0; aveScore=(float *)0; maxScore=(float *)0; minScore=(float *)0; devScore=(float *)0; divScore=(float *)0; scorefile=(char *)0; boa=(GAPopulation *)0; copy(orig); } GAStatistics::~GAStatistics(){ delete [] cscore; delete [] gen; delete [] aveScore; delete [] maxScore; delete [] minScore; delete [] devScore; delete [] divScore; delete [] scorefile; delete boa; } void GAStatistics::copy(const GAStatistics & orig){ if(&orig == this) return; curgen = orig.curgen; numsel = orig.numsel; numcro = orig.numcro; nummut = orig.nummut; numrep = orig.numrep; numeval = orig.numeval; numpeval = orig.numpeval; maxever = orig.maxever; minever = orig.minever; on = orig.on; offmax = orig.offmax; offmin = orig.offmin; aveInit = orig.aveInit; maxInit = orig.maxInit; minInit = orig.minInit; devInit = orig.devInit; divInit = orig.divInit; aveCur = orig.aveCur; maxCur = orig.maxCur; minCur = orig.minCur; devCur = orig.devCur; divCur = orig.divCur; scoreFreq = orig.scoreFreq; dodiv = orig.dodiv; nconv=orig.nconv; Nconv=orig.Nconv; delete [] cscore; cscore = new float [Nconv]; memcpy(cscore, orig.cscore, Nconv*sizeof(float)); nscrs=orig.nscrs; Nscrs=orig.Nscrs; delete [] gen; gen = new int [Nscrs]; memcpy(gen, orig.gen, Nscrs*sizeof(int)); delete [] aveScore; aveScore = new float [Nscrs]; memcpy(aveScore, orig.aveScore, Nscrs*sizeof(float)); delete [] maxScore; maxScore = new float [Nscrs]; memcpy(maxScore, orig.maxScore, Nscrs*sizeof(float)); delete [] minScore; minScore = new float [Nscrs]; memcpy(minScore, orig.minScore, Nscrs*sizeof(float)); delete [] devScore; devScore = new float [Nscrs]; memcpy(devScore, orig.devScore, Nscrs*sizeof(float)); delete [] divScore; divScore = new float [Nscrs]; memcpy(divScore, orig.divScore, Nscrs*sizeof(float)); delete [] scorefile; if(orig.scorefile){ scorefile = new char [strlen(orig.scorefile)+1]; strcpy(scorefile, orig.scorefile); } else scorefile = (char*)0; which = orig.which; delete boa; if(orig.boa) boa = orig.boa->clone(); } // Update the genomes in the 'best of all' population to reflect any // changes made to the current population. We just grab the genomes with // the highest scores from the current population, and if they are higher than // those of the genomes in the boa population, they get copied. Note that // the bigger the boa array, the bigger your running performance hit because // we have to look through all of the boa to figure out which are better than // those in the population. The fastest way to use the boa is to keep only // one genome in the boa population. A flag of 'True' will reset the boa // population so that it is filled with the best of the current population. // Unfortunately it could take a long time to update the boa array using the // copy method. We'd like to simply keep pointers to the best genomes, but // the genomes change from generation to generation, so we can't depend on // that. // Notice that keeping boa is useful even for overlapping populations. The // boa keeps individuals that are different from each other - the overlapping // population may not. However, keeping boa is most useful for populations // with little overlap. // When we check to see if a potentially better member is already in our // best-of-all population, we use the operator== comparator not the genome // comparator to do the comparison. void GAStatistics:: updateBestIndividual(const GAPopulation & pop, GABoolean flag){ if(boa == (GAPopulation *)0 || boa->size() == 0) return; // do nothing if(pop.order() != boa->order()) boa->order(pop.order()); if(flag == gaTrue){ // reset the BOA array int j=0; for(int i=0; isize(); i++){ boa->best(i).copy(pop.best(j)); if(j < pop.size()-1) j++; } return; } if(boa->size() == 1){ // there's only one boa so replace it with bop if(boa->order() == GAPopulation::HIGH_IS_BEST && pop.best().score() > boa->best().score()) boa->best().copy(pop.best()); if(boa->order() == GAPopulation::LOW_IS_BEST && pop.best().score() < boa->best().score()) boa->best().copy(pop.best()); } else{ int i=0, j, k; if(boa->order() == GAPopulation::HIGH_IS_BEST) { while(i < pop.size() && pop.best(i).score() > boa->worst().score()){ for(k=0; pop.best(i).score() < boa->best(k).score() && k < boa->size(); k++); for(j=k; jsize(); j++){ if(pop.best(i) == boa->best(j)) break; if(pop.best(i).score() > boa->best(j).score()){ boa->worst().copy(pop.best(i)); // replace worst individual boa->sort(gaTrue, GAPopulation::RAW); // re-sort the population break; } } i++; } } if(boa->order() == GAPopulation::LOW_IS_BEST) { while(i < pop.size() && pop.best(i).score() < boa->worst().score()){ for(k=0; pop.best(i).score() > boa->best(k).score() && k < boa->size(); k++); for(j=k; jsize(); j++){ if(pop.best(i) == boa->best(j)) break; if(pop.best(i).score() < boa->best(j).score()){ boa->worst().copy(pop.best(i)); // replace worst individual boa->sort(gaTrue, GAPopulation::RAW); // re-sort the population break; } } i++; } } } return; } // Use this method to update the statistics to account for the current // population. This routine increments the generation counter and assumes that // the population that gets passed is the current population. // If we are supposed to flush the scores, then we dump them to the specified // file. If no flushing frequency has been specified then we don't record. void GAStatistics::update(const GAPopulation & pop){ ++curgen; // must do this first so no divide-by-zero if(scoreFreq > 0 && (curgen % scoreFreq == 0)) setScore(pop); if(Nscrs > 0 && nscrs >= Nscrs) flushScores(); maxever = (pop.max() > maxever) ? pop.max() : maxever; minever = (pop.min() < minever) ? pop.min() : minever; float tmpval; tmpval = (on*(curgen-1) + pop.ave()) / curgen; on = tmpval; tmpval = (offmax*(curgen-1) + pop.max()) / curgen; offmax = tmpval; tmpval = (offmin*(curgen-1) + pop.min()) / curgen; offmin = tmpval; setConvergence((pop.order() == GAPopulation::HIGH_IS_BEST) ? pop.max() : pop.min()); updateBestIndividual(pop); numpeval = pop.nevals(); } // Reset the GA's statistics based on the population. To do this right you // should initialize the population before you pass it to this routine. If you // don't, the stats will be based on a non-initialized population. void GAStatistics::reset(const GAPopulation & pop){ curgen = 0; numsel = numcro = nummut = numrep = numeval = numpeval = 0; memset(gen, 0, Nscrs*sizeof(int)); memset(aveScore, 0, Nscrs*sizeof(float)); memset(maxScore, 0, Nscrs*sizeof(float)); memset(minScore, 0, Nscrs*sizeof(float)); memset(devScore, 0, Nscrs*sizeof(float)); memset(divScore, 0, Nscrs*sizeof(float)); nscrs = 0; setScore(pop); if(Nscrs > 0) flushScores(); memset(cscore, 0, Nconv*sizeof(float)); nconv = 0; // should set to -1 then call setConv cscore[0] = ((pop.order() == GAPopulation::HIGH_IS_BEST) ? pop.max() : pop.min()); // cscore[0] = pop.max(); // setConvergence(maxScore[0]); updateBestIndividual(pop, gaTrue); aveCur = aveInit = pop.ave(); maxCur = maxInit = maxever = pop.max(); minCur = minInit = minever = pop.min(); devCur = devInit = pop.dev(); divCur = divInit = ((dodiv == gaTrue) ? pop.div() : (float)-1.0); on = pop.ave(); offmax = pop.max(); offmin = pop.min(); numpeval = pop.nevals(); for(int i=0; isize(n); } return n; } const GAGenome & GAStatistics::bestIndividual(unsigned int n) const { if(boa == 0 || (int)n >= boa->size()){ GAErr(GA_LOC, "GAStatistics", "bestIndividual", gaErrBadPopIndex); n = 0; } return boa->best(n); // this will crash if no boa } // Adjust the scores buffers to match the specified amount. If someone // specifies zero then we don't keep the scores, so set all to NULL. int GAStatistics::flushFrequency(unsigned int freq){ if(freq == 0){ if(nscrs > 0) flushScores(); resizeScores(freq); } else if(freq > Nscrs){ resizeScores(freq); } else if(freq < Nscrs){ if(nscrs > freq) flushScores(); resizeScores(freq); } Nscrs = freq; return freq; } // Resize the scores vectors to the specified amount. Copy any scores that // exist. void GAStatistics::resizeScores(unsigned int n){ int *tmpi; float *tmpf; if(n == 0){ delete [] gen; gen = (int*)0; delete [] aveScore; aveScore = (float*)0; delete [] maxScore; maxScore = (float*)0; delete [] minScore; minScore = (float*)0; delete [] devScore; devScore = (float*)0; delete [] divScore; divScore = (float*)0; nscrs = n; } else{ tmpi = gen; gen = new int [n]; memcpy(gen, tmpi, (n < Nscrs ? n : Nscrs)*sizeof(int)); delete [] tmpi; tmpf = aveScore; aveScore = new float [n]; memcpy(aveScore, tmpf, (n < Nscrs ? n : Nscrs)*sizeof(float)); delete [] tmpf; tmpf = maxScore; maxScore = new float [n]; memcpy(maxScore, tmpf, (n < Nscrs ? n : Nscrs)*sizeof(float)); delete [] tmpf; tmpf = minScore; minScore = new float [n]; memcpy(minScore, tmpf, (n < Nscrs ? n : Nscrs)*sizeof(float)); delete [] tmpf; tmpf = devScore; devScore = new float [n]; memcpy(devScore, tmpf, (n < Nscrs ? n : Nscrs)*sizeof(float)); delete [] tmpf; tmpf = divScore; divScore = new float [n]; memcpy(divScore, tmpf, (n < Nscrs ? n : Nscrs)*sizeof(float)); delete [] tmpf; if(nscrs > n) nscrs = n; } Nscrs = n; } // Write the current scores to file. If this is the first chunk (ie gen[0] // is 0) then we create a new file. Otherwise we append to an existing file. // We give no notice that we're overwriting the existing file!! void GAStatistics::writeScores(){ if(!scorefile) return; #ifndef NO_STREAMS ofstream outfile(scorefile, ((gen[0] == 0) ? (ios::out | ios::trunc) : (ios::out | ios::app))); // should be done this way, but SGI systems (and others?) don't do it right... // if(! outfile.is_open()){ if(outfile.fail()){ GAErr(GA_LOC, "GAStatistics", "writeScores", gaErrWriteError, scorefile); return; } scores(outfile, which); outfile.close(); #endif } #ifndef NO_STREAMS int GAStatistics::write(const char* filename) const { ofstream outfile(filename, (ios::out | ios::trunc)); // should be done this way, but SGI systems (and others?) don't do it right... // if(! outfile.is_open()){ if(outfile.fail()){ GAErr(GA_LOC, "GAStatistics", "write", gaErrWriteError, filename); return 1; } write(outfile); outfile.close(); return 0; } int GAStatistics::write(ostream & os) const { os << curgen << "\t# current generation\n"; os << convergence() << "\t# current convergence\n"; os << numsel << "\t# number of selections since initialization\n"; os << numcro << "\t# number of crossovers since initialization\n"; os << nummut << "\t# number of mutations since initialization\n"; os << numrep << "\t# number of replacements since initialization\n"; os << numeval << "\t# number of genome evaluations since initialization\n"; os << numpeval << "\t# number of population evaluations since initialization\n"; os << maxever << "\t# maximum score since initialization\n"; os << minever << "\t# minimum score since initialization\n"; os << on << "\t# average of all scores ('on-line' performance)\n"; os << offmax << "\t# average of maximum scores ('off-line' performance)\n"; os << offmin << "\t# average of minimum scores ('off-line' performance)\n"; os << "\n"; os << aveInit << "\t# mean score in initial population\n"; os << maxInit << "\t# maximum score in initial population\n"; os << minInit << "\t# minimum score in initial population\n"; os << devInit << "\t# standard deviation of initial population\n"; os < #include #include #include #include // Default settings and their names. extern int gaDefNumBestGenomes; extern int gaDefScoreFrequency1; extern int gaDefScoreFrequency2; extern int gaDefFlushFrequency; extern char gaDefScoreFilename[]; /* ---------------------------------------------------------------------------- Statistics class We define this class as a storage object for the current state of the GA. Whereas the parameters object keeps track of the user-definable settings for the GA, the statistics object keeps track of the data that the GA generates along the way. ---------------------------------------------------------------------------- */ class GAStatistics { public: enum { NoScores=0x00, Mean=0x01, Maximum=0x02, Minimum=0x04, Deviation=0x08, Diversity=0x10, AllScores=0xff }; GAStatistics(); GAStatistics(const GAStatistics&); GAStatistics& operator=(const GAStatistics& orig){copy(orig); return *this;} virtual ~GAStatistics(); void copy(const GAStatistics &); float online() const {return on;} float offlineMax() const {return offmax;} float offlineMin() const {return offmin;} float initial(int w=Maximum) const; float current(int w=Maximum) const; float maxEver() const {return maxever;} float minEver() const {return minever;} int generation() const {return curgen;} unsigned long int selections() const {return numsel;} unsigned long int crossovers() const {return numcro;} unsigned long int mutations() const {return nummut;} unsigned long int replacements() const {return numrep;} unsigned long int indEvals() const {return numeval;} unsigned long int popEvals() const {return numpeval;} float convergence() const; int nConvergence() const { return Nconv; } int nConvergence(unsigned int); int nBestGenomes(const GAGenome&, unsigned int); int nBestGenomes() const { return(boa ? boa->size() : 0); } int scoreFrequency(unsigned int x) { return(scoreFreq = x); } int scoreFrequency() const { return scoreFreq; } int flushFrequency(unsigned int x); int flushFrequency() const { return Nscrs; } const char* scoreFilename(const char *filename); const char* scoreFilename() const { return scorefile; } int selectScores(int w){ return which = w; } int selectScores() const { return which; } GABoolean recordDiversity(GABoolean flag){ return dodiv=flag; } GABoolean recordDiversity() const { return dodiv; } void flushScores(); void update(const GAPopulation & pop); void reset(const GAPopulation & pop); const GAPopulation & bestPopulation() const { return *boa; } const GAGenome & bestIndividual(unsigned int n=0) const; #ifndef NO_STREAMS int scores(const char* filename, int which=NoScores); int scores(ostream& os, int which=NoScores); int write(const char* filename) const; int write(ostream& os) const; #endif // These should be protected (accessible only to the GA class) but for now they // are publicly accessible. Do not try to set these unless you know what you // are doing!! unsigned long int numsel; // number of selections since reset unsigned long int numcro; // number of crossovers since reset unsigned long int nummut; // number of mutations since reset unsigned long int numrep; // number of replacements since reset unsigned long int numeval; // number of individual evaluations since reset unsigned long int numpeval; // number of population evals since reset protected: unsigned int curgen; // current generation number unsigned int scoreFreq; // how often (in generations) to record scores GABoolean dodiv; // should we record diversity? float maxever; // maximum score since initialization float minever; // minimum score since initialization float on; // "on-line" performance (ave of all scores) float offmax; // "off-line" performance (ave of maximum) float offmin; // "off-line" performance (ave of minimum) float aveInit; // stats from the initial population float maxInit; float minInit; float devInit; float divInit; float aveCur; // stats from the current population float maxCur; float minCur; float devCur; float divCur; unsigned int nconv, Nconv; // how many scores we're recording (flushFreq) float * cscore; // best score of last n generations unsigned int nscrs, Nscrs; // how many scores do we have? int * gen; // generation number corresponding to scores float * aveScore; // average scores of each generation float * maxScore; // best scores of each generation float * minScore; // worst scores of each generation float * devScore; // stddev of each generation float * divScore; // diversity of each generation char * scorefile; // name of file to which scores get written int which; // which data to write to file GAPopulation * boa; // keep a copy of the best genomes void setConvergence(float); void setScore(const GAPopulation&); void updateBestIndividual(const GAPopulation&, GABoolean flag=gaFalse); void writeScores(); void resizeScores(unsigned int); friend class GA; }; inline const char* GAStatistics::scoreFilename(const char* filename){ delete [] scorefile; scorefile = 0; if(filename){ scorefile = new char[strlen(filename)+1]; strcpy(scorefile, filename); } return scorefile; } inline float GAStatistics::convergence() const { double cnv = 0.0; if(nconv >= Nconv-1 && cscore[nconv%Nconv] != 0) cnv = (double)(cscore[(nconv+1)%Nconv]) / (double)(cscore[nconv%Nconv]); return (float)cnv; } inline float GAStatistics::initial(int w) const { float val = 0.0; switch(w){ case Mean: val = aveInit; break; case Maximum: val = maxInit; break; case Minimum: val = minInit; break; case Deviation: val = devInit; break; case Diversity: val = divInit; break; default: break; } return val; } inline float GAStatistics::current(int w) const { float val = 0.0; switch(w){ case Mean: val = aveCur; break; case Maximum: val = maxCur; break; case Minimum: val = minCur; break; case Deviation: val = devCur; break; case Diversity: val = divCur; break; default: break; } return val; } #ifndef NO_STREAMS inline ostream& operator<< (ostream& os, const GAStatistics& s) { s.write(os); return os; } #endif #endif gamera-3.3.3/src/ga/GAStringGenome.cpp0000644000076500000000000000617110714675676016465 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- string.C mbwall 21mar95 Copyright (c) 1995-1996 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the string specialization of the array genome. ---------------------------------------------------------------------------- */ #include template<> const char * GA1DArrayAlleleGenome::className() const {return "GAStringGenome";} template<> int GA1DArrayAlleleGenome::classID() const {return GAID::StringGenome;} template<> GA1DArrayAlleleGenome:: GA1DArrayAlleleGenome(unsigned int length, const GAAlleleSet & s, GAGenome::Evaluator f, void * u) : GA1DArrayGenome(length, f, u){ naset = 1; aset = new GAAlleleSet[1]; aset[0] = s; initializer(DEFAULT_STRING_INITIALIZER); mutator(DEFAULT_STRING_MUTATOR); comparator(DEFAULT_STRING_COMPARATOR); crossover(DEFAULT_STRING_CROSSOVER); } template<> GA1DArrayAlleleGenome:: GA1DArrayAlleleGenome(const GAAlleleSetArray & sa, GAGenome::Evaluator f, void * u) : GA1DArrayGenome(sa.size(), f, u){ naset = sa.size(); aset = new GAAlleleSet[naset]; for(int i=0; i1310) GA1DArrayAlleleGenome::~GA1DArrayAlleleGenome(){ delete [] aset; } #endif #ifndef NO_STREAMS // The read specialization takes in each character whether it is whitespace or // not and stuffs it into the genome. This is unlike the default array read. template<> int GA1DArrayAlleleGenome::read(istream & is) { unsigned int i=0; char c; do{ is.get(c); if(!is.fail()) gene(i++, c); } while(!is.fail() && !is.eof() && i < nx); if(is.eof() && i < nx){ GAErr(GA_LOC, className(), "read", gaErrUnexpectedEOF); is.clear(ios::badbit | is.rdstate()); return 1; } return 0; } // Unlike the base array genome, here when we write out we don't put any // whitespace between genes. No newline at end of it all. template<> int GA1DArrayAlleleGenome::write(ostream & os) const { for(unsigned int i=0; i #include #if defined(__BORLANDC__) GAAlleleSet; GAAlleleSetCore; GAAlleleSetArray; GAArray; GA1DArrayGenome; GA1DArrayAlleleGenome; #else template class GAAlleleSet; template class GAAlleleSetCore; template class GAAlleleSetArray; template class GAArray; template class GA1DArrayGenome; template class GA1DArrayAlleleGenome; #endif #endif gamera-3.3.3/src/ga/GAStringGenome.h0000644000076500000000000000435710714675676016136 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- string.h mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology DESCRIPTION: This header defines the interface for the string genome. ---------------------------------------------------------------------------- */ #ifndef _ga_string_h_ #define _ga_string_h_ #include #include typedef GAAlleleSet GAStringAlleleSet; typedef GAAlleleSet GACharacterAlleleSet; typedef GAAlleleSetArray GAStringAlleleSetArray; typedef GA1DArrayAlleleGenome GAStringGenome; inline void GAStringUniformInitializer(GAGenome& g){ GA1DArrayAlleleGenome::UniformInitializer(g); } inline void GAStringOrderedInitializer(GAGenome& g){ GA1DArrayAlleleGenome::OrderedInitializer(g); } inline int GAStringFlipMutator(GAGenome& g, float pmut){ return GA1DArrayAlleleGenome::FlipMutator(g, pmut); } inline int GAStringSwapMutator(GAGenome& g, float pmut){ return GA1DArrayGenome::SwapMutator(g, pmut); } inline int GAStringUniformCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::UniformCrossover(a,b,c,d); } inline int GAStringEvenOddCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::EvenOddCrossover(a,b,c,d); } inline int GAStringOnePointCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::OnePointCrossover(a,b,c,d); } inline int GAStringTwoPointCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::TwoPointCrossover(a,b,c,d); } inline int GAStringPartialMatchCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::PartialMatchCrossover(a,b,c,d); } inline int GAStringOrderCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::OrderCrossover(a,b,c,d); } inline int GAStringCycleCrossover(const GAGenome& a, const GAGenome& b, GAGenome* c, GAGenome* d) { return GA1DArrayGenome::CycleCrossover(a,b,c,d); } #endif gamera-3.3.3/src/ga/GATree.cpp0000644000076500000000000002506110714675676014762 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- treetmpl.C mbwall 25feb95 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the templatized tree objects. TO DO: Make insert work better with size and depth so not so many recalcs needed. Implement better memory mangement, faster allocation, referencing. Use array representation of nodes so we don't have to do so much recursion. Figure better way to do traversals so that we speed up the swaps. ---------------------------------------------------------------------------- */ #ifndef _ga_treetmpl_C_ #define _ga_treetmpl_C_ #include extern GANodeBASE * _GATreeTraverse(unsigned int, unsigned int&, GANodeBASE *); //template void _GATreeDestroy(GANode *); //template GANode * _GATreeCopy(GANode *, GANode *); /* ---------------------------------------------------------------------------- Tree ---------------------------------------------------------------------------- */ // The destructor just goes through the tree and deletes every node. As with // any method that uses the BASE tree, we have to use its members so it doesn't // get messed up. template GATree::~GATree() { _GATreeDestroy(DYN_CAST(GANode*, rt)); iter.node = (GANodeBASE *)0; } // Yes, this is really ugly. We do a complete destruction of the existing tree // then we copy the new one. No caching, no nothing. Oh well. The iterator // is set to the root node - it should be set to the corresponding node, but // I won't do that for now. THIS IS A BUG! template void GATree::copy(const GATree & orig) { _GATreeDestroy(DYN_CAST(GANode*, rt)); rt = _GATreeCopy(DYN_CAST(GANode*, orig.rt), (GANode *)0); iter.node = rt; sz=orig.sz; csz=orig.csz; dpth=orig.dpth; cdpth=orig.cdpth; } // This remove method returns a tree with the removed node as its root. The // node we remove is the current node. We allocate memory for the tree, but // we don't allocate any memory for the node or its children. That is taken // from the previous (this) tree and it no longer has to worry about it. It // is the responsibility of the new tree to delete that memory. // The iterator gets set to the elder child of the node that was removed. If // there is no elder child, then it gets set to the parent. If no parent, then // it gets set to NULL. // Thank you to Uli Bubenheimer (uli@aisun1.ai.uga.edu) for the bug fix here. // I forgot to fix the pointers in the root node of the sub-tree. template GATree * GATree::remove() { GATree * t = new GATree; GANode * node = DYN_CAST(GANode*, iter.node); if(!node) return t; if(node->prev != node) iter.eldest(); else if(node->parent) iter.parent(); else iter.node = (GANodeBASE *)0; GANode * tmpnode = DYN_CAST(GANode*, GATreeBASE::remove(node)); tmpnode->prev = tmpnode; tmpnode->next = tmpnode; tmpnode->parent = (GANodeBASE *)0; t->insert(tmpnode, (GANode *)0, GATreeBASE::ROOT); return t; } // Recursively duplicate a subtree given a base node. This uses the _copy // method (which does a deep and wide copy). Here we just copy a node, then // sic the _copy method on the child if it exists. The parent of the new node // is set to NULL - this makes it a root node in the new tree object. // We do the cloning based on the valued passed to the routine. 0 is the // root node and makes a clone of the entire tree. This routine has no effect // on the iterator in the original tree. // The iterator in the clone is left pointing to the root node of the clone. template GATree * GATree::clone(unsigned int i) const { GATree * t = new GATree; GANode * node; unsigned int w=0; if(i == 0) node = DYN_CAST(GANode*, rt); else node = DYN_CAST(GANode*, _GATreeTraverse(i, w, rt)); if(!node) return t; GANode * newnode = new GANode(node->contents); newnode->child = _GATreeCopy(DYN_CAST(GANode*, node->child), newnode); if(newnode->child) newnode->child->parent = newnode; t->insert(newnode, (GANode *)0, GATreeBASE::ROOT); return t; } // Destroy the specified node and all nodes attached to it looking downward. // This does NOT destroy any nodes above the specified node. If this node is // in a tree, it will be removed before the nuking occurs. This gives the tree // object a chance to flag for any recalculations it might need. The destroy // method effect on the tree as a remove, but it is destructive (it frees up // the memory as well). // We do the nuking recursively, so its not really that efficient. I'll // figure out a better way to track these nodes one of these days. // We use the _destroy routine to do the recursion. _destroy kills all of // the siblings of the node whereas this routine kills only descendents. // This uses the current node as the one to destroy, so be sure to use the // iteration methods to move to the node you want to destroy. Once the node is // gone, we set the current node to the eldest child or parent of the node that // was destroyed. template int GATree::destroy() { GANodeBASE * node = iter.node; if(!node) return GATreeBASE::NO_ERR; if(node->prev == node || !node->prev) if(node->parent) iter.node = node->parent; else iter.node = (GANodeBASE *)0; else iter.eldest(); _GATreeDestroy(DYN_CAST(GANode*, node->child)); delete GATreeBASE::remove(node); return GATreeBASE::NO_ERR; } // Swap two subtrees. We use the nodes pointed to by the iterators in the // current tree and the one that was passed to us. The TreeBASE swaptree // changes the next, prev, parent, child pointers on the nodes we pass it as // well as the nodes that those nodes point to. // Notice that this routine uses the current location of the iterators to // do its job, so be sure to set them properly before you call this routine! // The iterators are reset to the nodes where the swaps occurred. Sizes and // depths are possibly changed - the insert method flags them for a recalc. // If an iterator is NULL then we do an insert ONLY if the root node of that // iterator's tree is NULL. If the tree's root is non-NULL, we don't do // anything (most likely the iterator was unset or badly set). template int GATree::swaptree(GATree * t) { GANodeBASE * tmp; if(t->iter.node && iter.node){ if(GATreeBASE::swaptree(t->iter.node, iter.node) == GATreeBASE::ERR) return GATreeBASE::ERR; if(t->rt == t->iter.node) t->rt = iter.node; tmp = t->iter.node; t->iter.node = iter.node; iter.node = tmp; t->csz = 1; t->cdpth = 1; // remember to flag the changes in t! csz = 1; cdpth = 1; } else if(t->iter.node){ // iter.node is NULL, so we have no root if(!rt){ // should always be true at this point tmp = t->GATreeBASE::remove(t->iter.node); // tmp->next = tmp; // tmp->prev = tmp; t->iter.node = (GANodeBASE *)0; if(insert(DYN_CAST(GANode*, tmp), (GANode *)0, GATreeBASE::ROOT) == GATreeBASE::ERR) return GATreeBASE::ERR; } } else if(iter.node){ // t's iter is NULL, so it has no root if(!t->rt){ // should always be true tmp = GATreeBASE::remove(iter.node); // tmp->next = tmp; // tmp->prev = tmp; iter.node = (GANodeBASE *)0; if(t->insert(DYN_CAST(GANode*,tmp),(GANode*)0,GATreeBASE::ROOT) == GATreeBASE::ERR) return GATreeBASE::ERR; } } // else both t->iter.node and iter.node are NULL, so don't do anything return GATreeBASE::NO_ERR; } // Same as the swaptree above, but this routine uses the node indices to do // the swap. This can be dangerous: if one of the nodes is a decendent of the // other then we could end up with a fragmented tree, so we'll have to check // for that situation. Unfortunately this check slows things down quite a bit. // If one is the ancestor of the other, then we don't do the swap. // This routine does not affect the size of the tree, but it could change the // depth of the tree. We leave the iterator where it was pointing before the // swap. template int GATree::swaptree(unsigned int a, unsigned int b) { unsigned int aw=0, bw=0; GANodeBASE * anode = _GATreeTraverse(a, aw, rt); GANodeBASE * bnode = _GATreeTraverse(b, bw, rt); return GATreeBASE::swaptree(anode,bnode); } // Swap two nodes in a tree, leave their subtrees intact. This routine does // not affect the iterator or the size or depth of the tree. template int GATree::swap(unsigned int a, unsigned int b) { unsigned int aw=0, bw=0; GANodeBASE * anode = _GATreeTraverse(a, aw, rt); GANodeBASE * bnode = _GATreeTraverse(b, bw, rt); return GATreeBASE::swapnode(anode,bnode); } /* ---------------------------------------------------------------------------- Recursive routines for the Tree objects ---------------------------------------------------------------------------- */ // Recursively copy a node, including all of its siblings. This routine copies // a row, then it calls itself to copy the next generation if it finds a next // generation in the next node. template GANode * _GATreeCopy(GANode * node, GANode * parent) { if(!node) return (GANode *)0; GANode * newnode = new GANode(node->contents); newnode->parent = parent; newnode->child = _GATreeCopy(DYN_CAST(GANode*, node->child), newnode); GANode *lasttmp = newnode, *newtmp = (GANode *)0; GANode *tmp = DYN_CAST(GANode*, node->next); while(tmp && tmp != node){ newtmp = new GANode(tmp->contents); newtmp->parent = parent; newtmp->child = _GATreeCopy(DYN_CAST(GANode*, tmp->child), newtmp); newtmp->prev = lasttmp; lasttmp->next = newtmp; lasttmp = newtmp; tmp = DYN_CAST(GANode*, tmp->next); } if(newtmp){ newtmp->next = newnode; newnode->prev = newtmp; } else{ newnode->next = newnode; newnode->prev = newnode; } return newnode; } // This routine destroys the specified node, its children, its siblings, and // all of their children, their childrens' siblings, etc. Since we kill off // all of the siblings, we need to set the parent's link to its child to NULL. template void _GATreeDestroy(GANode * node) { if(!node) return; if(node->parent) node->parent->child = (GANodeBASE *)0; _GATreeDestroy(DYN_CAST(GANode*, node->child)); GANodeBASE * tmp; while(node->next && node->next != node){ tmp = node->next; node->next = tmp->next; tmp->next->prev = node; _GATreeDestroy(DYN_CAST(GANode*, tmp->child)); delete tmp; } delete node; } #endif gamera-3.3.3/src/ga/GATree.h0000644000076500000000000002230410714675676014424 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- treetmpl.h mbwall 25feb95 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the templatized tree objects. ---------------------------------------------------------------------------- */ #ifndef _ga_treetmpl_h_ #define _ga_treetmpl_h_ #include #include /* ---------------------------------------------------------------------------- GATree ------------------------------------------------------------------------------- This object is a container for nodes that have a tree structure. The base tree object is responsible for maintaining the tree heirarchy. This object is responsible for doing the memory management (allocating and de-allocating the nodes in the tree). We insulate the user entirely from nodes - when you use a tree, you don't get nodes back, you get the contents of nodes (ie the user doesn't have to think about the tree parts of a node, they can simply assume that their data is organized into a tree structure). We include an iterator in this object so that you can navigate through the tree. You can create another iterator and assign it to your tree so you can have multiple iterators. All of the actions take place relative to the current location of the embedded iterator. None of the iterators change the state of the tree. Be careful so that you don't end up with an iterator dangling with a pointer to a part of a tree that no longer exists (I would need some kind of reference counting and/or message passing to take care of this at a lower level, and I'm not ready to implement that at this point). For now we allocate nodes on the fly. Eventually I would like to do some better memory management (arrays perhaps?) so we don't have to do so much alloc and dealloc and recursion. We depend on the template-ized GATreeIter routine, thus the declaration. copy Make a copy of the specified tree. Iterator goes to root node (should go to appropriate node in copy, but we don't do that yet). clone Allocate space and make a copy of the tree and return a pointer to the new one. The iterator of the original is not affected. The iterator of the clone is set to the appropriate place in the clone. If you specify a node index when you call clone then a clone of the subtree is made and the iterator in the clone is set to the root node (the top of the subtree). remove Remove the current node (and its subtree) from the tree and stick it into a new tree. Returns a pointer to the new tree. Leaves the original iterator pointing to the eldest child or parent of the node that was removed. Iter of the new tree points to the root node. destroy Destroys the node and subtree where the iterator is currently pointing. Moves the iterator to the eldest sibling or parent of the node that was deleted from the tree. swap Swap nodes in a tree, leaves the nodes' subtrees in place (subtrees do not move with the nodes in the swap). swaptree - tree Swap subtrees referenced by the iterators of this and the second tree. The iterators are reset to point to the new subtrees (same point in the trees, but different nodes due to the swap). swaptree - indices Swap the subtrees referenced by the integer values. Indices must not be related (ie one cannot be ancestor of the other). Iterator is not changed. insert - tree Inserts the contents of tree in to the current tree and removes it from the original tree. Does NOT delete the original tree, but DOES assume responsibility for the memory used by original tree contents. insert - object Inserts the object into a new node relative to the location of the iterator root, current, next, prev, parent, child, warp These iterator methods are defined as access to the embedded iterator of the tree. Use these methods to move the insertion point and to traverse the tree. You can also create other iterators for this tree, but they won't affect the contents. ---------------------------------------------------------------------------- */ template class GATreeIter; template class GATree : public GATreeBASE { public: GATree() : GATreeBASE() { iter(*this); } GATree(const T & t) : GATreeBASE(new GANode(t)), iter(*this) {} GATree(const GATree & orig){iter(*this); copy(orig);} GATree & operator=(const GATree & orig) {if(&orig != this) copy(orig); return *this;} virtual ~GATree(); GATree * clone(unsigned int i=0) const; // methods that modify the state of the tree void copy(const GATree & orig); int destroy(); int swaptree(GATree * t); int swaptree(unsigned int, unsigned int); int swap(unsigned int, unsigned int); GATree * remove(); int insert(GATree * t, GATreeBASE::Location where=GATreeBASE::BELOW){ if(this == t){ GAErr(GA_LOC, "GATree", "insert", gaErrCannotInsertIntoSelf); return GATreeBASE::ERR; } if(GATreeBASE::insert(t->rt, iter.node, where) == GATreeBASE::ERR){ return GATreeBASE::ERR; } iter.node = (t->rt ? t->rt : iter.node); t->rt=(GANodeBASE *)0; t->iter.node=(GANodeBASE *)0; return GATreeBASE::NO_ERR; } int insert(const T & t, GATreeBASE::Location where=GATreeBASE::BELOW){ GANode * c = new GANode(t); if(GATreeBASE::insert(c, iter.node, where) == GATreeBASE::ERR){ delete c; return GATreeBASE::ERR; } iter.node = c; return GATreeBASE::NO_ERR; } // typesafes on iteration methods. These call the built-in iterator then // return the contents of the now-current node. They do not affect the state // of the tree. T * root(){return iter.root();} T * current(){return iter.current();} T * next(){return iter.next();} T * prev(){return iter.prev();} T * parent(){return iter.parent();} T * child(){return iter.child();} T * eldest(){return iter.eldest();} T * youngest(){return iter.youngest();} T * warp(unsigned int i){return iter.warp(i);} T * warp(const GATreeIter & i) {return((i.tree == this) ? iter.warp(i) : (T *)0);} int nchildren(){return iter.nchildren();} int nsiblings(){return iter.nsiblings();} protected: int insert(GANode *n, GANode *idx, GATreeBASE::Location where=GATreeBASE::BELOW){ if(GATreeBASE::insert(n, idx, where) == GATreeBASE::ERR) return GATreeBASE::ERR; iter.node = n; return GATreeBASE::NO_ERR; } GATreeIter iter; friend class GATreeIter; }; /* ---------------------------------------------------------------------------- GATreeIter ------------------------------------------------------------------------------- This is a type-safe derivation of the base TreeIter object. I copied the methods from the base class (I know, a no-no) rather than doing calls to the base class methods. We depend on the template-ized GATree, thus the declaration. Behaviour for the iterator methods is defined as follows. If the current node is null, attempts to access a derived position from the current position will return NULL. The only way to reset the current node is to call the root() locater (you always have to start at the tree root to navigate the tree). If the current node is non-null and the derived node is null, the current node is NOT changed, but NULL is returned. When we create a new tree iterator, it defaults to the same node as the one used to create it. If it is created with a tree as its argument, it defaults to the tree's iterator's current position. ---------------------------------------------------------------------------- */ template class GATree; template class GATreeIter : public GATreeIterBASE { public: GATreeIter() : GATreeIterBASE(){} GATreeIter(const GATree & t) : GATreeIterBASE(t){node=t.iter.node;} GATreeIter(const GATreeIter & i) : GATreeIterBASE(i){} T * current() {return(node ? &((GANode *)node)->contents : (T *)0);} T * root() {return(((node=GATreeIterBASE::root()) != (GANodeBASE *)0) ? &((GANode *)GATreeIterBASE::root(node))->contents : (T *)0);} T * next() {return((node && node->next) ? &((GANode *)(node=node->next))->contents : (T *)0);} T * prev() {return((node && node->prev) ? &((GANode *)(node=node->prev))->contents : (T *)0);} T * parent() {return((node && node->parent) ? &((GANode *)(node=node->parent))->contents : (T *)0);} T * child() {return((node && node->child) ? &((GANode *)(node=node->child))->contents : (T *)0);} T * eldest() {return(node ? &((GANode *)GATreeIterBASE::eldest(node))->contents : (T *)0);} T * youngest() {return(node ? &((GANode *)GATreeIterBASE::youngest(node))->contents : (T *)0);} T * warp(const GATree & t){ tree = &t; node = t.iter.node; return(t.iter.node ? &((GANode *)(node=t.iter.node))->contents :(T *)0); } T * warp(const GATreeIter & i){ tree = i.tree; node = i.node; return(i.node ? &((GANode *)(node=i.node))->contents : (T *)0); } T * warp(unsigned int i){ GANodeBASE * n = GATreeIterBASE::warp(i); return(n ? &((GANode *)(node=n))->contents : (T *)0); } private: friend class GATree; }; #ifdef USE_BORLAND_INST #include #endif #endif gamera-3.3.3/src/ga/GATreeBASE.cpp0000644000076500000000000005231210714675676015414 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- treebase.C mbwall 25nov94 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the tree objects. TO DO: Make insert work better with size and depth so not so many recalcs needed. Implement better memory mangement, faster allocation, referencing. Use array representation of nodes so we don't have to do so much recursion. Figure better way to do traversals so that we speed up the swaps. ---------------------------------------------------------------------------- */ #include #include static int _GATreeSize(GANodeBASE *); static int _GATreeDepth(GANodeBASE *); GANodeBASE * _GATreeTraverse(unsigned int, unsigned int &, GANodeBASE *); int _GATreeCompare(GANodeBASE * anode, GANodeBASE * bnode); // Traverse up the tree until we find the root node. If the node we got was // NULL, return NULL. Otherwise return the pointer to the root node. inline GANodeBASE * _GARootOfNode(GANodeBASE * n){ GANodeBASE * tmp = (GANodeBASE *)0; if((tmp=n) != (GANodeBASE *)0){while(tmp->parent) tmp = tmp->parent;} return tmp; } /* ---------------------------------------------------------------------------- TreeBASE ---------------------------------------------------------------------------- */ // Insert node n into the tree relative to node idx. There are four different // insertion modes: root, before, after, and below. If there is no root node, // then the node n becomes the root no matter what. If there is no root then // we don't do anything. // If the node that you are inserting has any siblings then the siblings will // be lost! Therefore we post an error message and return without doing // anything. // If you try to replace the existing root node, the previous root node // becomes the eldest child of the node that is being inserted. // root: idx is ignored. Beware that the previous root ptr is lost (unless // you keep you own copy of it somewhere else). // before: If node idx is the first in a row in the tree, then n becomes // the first in the row. If idx is the root node, then we post an error // message (can't have more than one root node). // after: If the node idx is the last in a row, n becomes the last node. If // idx is the root node, we post an error. // below: This is the default operation. This is the only valid operation // on a root node. int GATreeBASE::insert(GANodeBASE * n, GANodeBASE * idx, Location where) { if(!n) return NO_ERR; if(!idx){ if(!rt) where = ROOT; else if(where != ROOT){ GAErr(GA_LOC, "GATreeBASE", "insert", gaErrCannotInsertOnNilNode); return ERR; } } switch(where){ case ROOT: if((n->prev && n->prev != n) || (n->next && n->next != n)){ GAErr(GA_LOC, "GATreeBASE", "insert", gaErrCannotInsertWithSiblings); return ERR; } if(rt){ // root exists, so make old root eldest child rt->parent = n; if(n->child){ if(n->child->prev && n->child->prev != n->child){ rt->prev = n->child->prev; rt->next = n->child; n->child->prev->next = rt; n->child->prev = rt; } else{ rt->next = n->child; rt->prev = n->child->prev; n->child->prev = rt; n->child->next = rt; } } n->child = rt; } rt = n; n->parent = (GANodeBASE *)0; n->prev = n; n->next = n; break; case BEFORE: if(!idx->parent){ GAErr(GA_LOC, "GATreeBASE", "insert", gaErrCannotInsertBeforeRoot); return ERR; } n->parent = idx->parent; n->next = idx; n->prev = idx->prev; idx->prev->next = n; idx->prev = n; if(idx->parent && idx->parent->child == idx) n->parent->child = n; break; case AFTER: if(!idx->parent){ GAErr(GA_LOC, "GATreeBASE", "insert", gaErrCannotInsertAfterRoot); return ERR; } n->parent = idx->parent; n->prev = idx; n->next = idx->next; idx->next->prev = n; idx->next = n; break; case BELOW: n->parent = idx; if(idx->child){ n->prev = idx->child->prev; n->next = idx->child; idx->child->prev->next = n; idx->child->prev = n; } else{ n->prev = n; n->next = n; idx->child = n; } break; default: GAErr(GA_LOC, "GATreeBASE", "insert", gaErrBadWhereIndicator); break; } csz = 1; cdpth = 1; return NO_ERR; } // Remove the specified node from the tree. We don't cruise through the tree // to make certain that the node is in the tree. But we do check to make sure // that the connections were ok before we prune the node. If there is any // problem with the links, we return a NULL. If we get a NULL node, then we // don't do anything. // We don't do anything to the next, prev, etc links of the node that is // being removed (they are left pointing to where they used to point) so be // careful!! // If the removal is on the root node, set the root node to NULL. GANodeBASE * GATreeBASE::remove(GANodeBASE * n) { if(!n) return (GANodeBASE *)0; if(!n->next || !n->prev || n->prev->next != n || n->next->prev != n){ GAErr(GA_LOC, "GATreeBASE", "remove", gaErrBadTreeLinks); return (GANodeBASE*)0; } if(n->next == n || !n->next){ if(n->parent && n->parent->child == n) n->parent->child = (GANodeBASE *)0; } else{ if(n->parent && n->parent->child == n) n->parent->child = n->next; n->prev->next = n->next; n->next->prev = n->prev; } if(n == rt) rt = (GANodeBASE *)0; // uncomment these to modify the node that is getting removed n->prev = n; n->next = n; n->parent = 0; csz = 1; cdpth = 1; return n; } // Swap the specified nodes. If we get NULL nodes or the nodes are the same, // don't do anything. Swapping will work only on nodes that are not directly // related, eg a cannot be the ancestor of b. If you do a swap on nodes that // are directly related, you'll end up with two separate trees. For now we // don't check for this. // This swaps two nodes and their entire subtrees, its doesn't simply swap // the nodes themselves!! // We have to be concerned about the type of node that we get. If the node // is pointing to itself in its prev and next members, then it is probably a // root node. At any rate, we have to make the node its getting swapped with // have the same attributes (but not the same next and prev). // If either of the nodes is NULL, we don't do anything. // We check to see if the nodes are in the same tree (but only if we have to) // If the nodes are in the same tree then we check their ancestry before we // do the swap (so that we don't end up with any dangling trees or leaked // memory). // If the nodes are in the same tree and one of them is the root node, then // the other must have been a descendent of the first, so trying to swap them // is an error. If they are in different trees and one is the root node of // this tree, we can reset the root node of this tree. We have no way of // resetting the root node of the other tree, however, so beware that you // could lose the second tree (the one that used to be in this tree) if you // swap into another root. // This implementation has much room for improvement. We don't have to // traverse the tree multiple times, for example. int GATreeBASE::swaptree(GANodeBASE * a, GANodeBASE * b) { if(!a || !b || a == b) return NO_ERR; GANodeBASE * aprev = a->prev; GANodeBASE * anext = a->next; GANodeBASE * aparent = a->parent; GANodeBASE * bprev = b->prev; GANodeBASE * bnext = b->next; GANodeBASE * bparent = b->parent; if(anext == b || bnext == a){ // a & b are adjacent if(aparent && aparent->child == a) aparent->child = b; else if(bparent && bparent->child == b) bparent->child = a; if(anext == b && bnext != a){ // same as b->prev = a a->prev = b; a->next = bnext; b->prev = aprev; b->next = a; aprev->next = b; bnext->prev = a; } else if(bnext == a && anext != b){ // same as a->prev = b a->prev = bprev; a->next = b; b->prev = a; b->next = anext; anext->prev = b; bprev->next = a; } if(rt == a) rt = b; else if(rt == b) rt = a; } else{ // check for same tree then ancestry GANodeBASE * aroot = _GARootOfNode(a); GANodeBASE * broot = _GARootOfNode(b); if(aroot == broot){ // check ancestry while(aparent && aparent != b) aparent = aparent->parent; if(aparent == b){ GAErr(GA_LOC, "GATreeBASE", "swaptree", gaErrCannotSwapAncestors); return ERR; } while(bparent && bparent != a) bparent = bparent->parent; if(bparent == a){ GAErr(GA_LOC, "GATreeBASE", "swaptree", gaErrCannotSwapAncestors); return ERR; } aparent = a->parent; // reset the values bparent = b->parent; } // if not in same tree, we don't bother to check the ancestry if(aparent == bparent){ if(aparent && aparent->child == a) aparent->child = b; else if(bparent && bparent->child == b) bparent->child = a; } else{ if(aparent && aparent->child == a) aparent->child = b; if(bparent && bparent->child == b) bparent->child = a; } a->parent = bparent; b->parent = aparent; if(bprev == b || bnext == b){ a->prev = a; a->next = a; } else{ a->prev = bprev; a->next = bnext; bprev->next = a; bnext->prev = a; } if(aprev == a || anext == a){ b->prev = b; b->next = b; } else{ b->prev = aprev; b->next = anext; aprev->next = b; anext->prev = b; } if(aroot != broot){ if(rt == a) rt = b; else if(rt == b) rt = a; // We could lose the other node here, but we have no way of knowing what the // root node in the other tree is, so its up to the caller of this routine // to take care of this! } } csz = 1; cdpth = 1; return NO_ERR; } // Swap the specified nodes. If we get NULL nodes or the nodes are the same, // don't do anything. This moves the two nodes and leaves their subtrees in // place (if they have any). The subtrees do not move with the nodes. Note // that swapping two nodes shouldn't change the size or depth of the tree, so // we don't set the change flags. // We have to look for a few special cases. If a and b are parent/child or // a and b are adjacent then we have to give them special treatment. We don't // care if they are otherwise related. // We don't check for bogus configurations (eg b is a's child and a's next) // or for NULL members. We assume the tree is correctly configured. // We assume that the nodes are both in the same tree. If they are not, you // may (or may not) get an error. The error will occur if either of the nodes // is a root node and the nodes are not in the same tree. // At this point this routine is used ONLY for node swapping within the same // tree, so I won't worry about the different trees case. int GATreeBASE::swapnode(GANodeBASE * a, GANodeBASE * b) { if(!a || !b || a == b) return NO_ERR; GANodeBASE * aprev = a->prev; GANodeBASE * anext = a->next; GANodeBASE * achild = a->child; GANodeBASE * aparent = a->parent; GANodeBASE * bprev = b->prev; GANodeBASE * bnext = b->next; GANodeBASE * bchild = b->child; GANodeBASE * bparent = b->parent; if(anext == b || bnext == a){ // a & b are adjacent if(aparent && aparent->child == a) aparent->child = b; else if(bparent && bparent->child == b) bparent->child = a; a->child = bchild; b->child = achild; if(achild){ achild->parent = b; for(GANodeBASE * n=achild->next; n && n != achild; n=n->next) n->parent = b; } if(bchild){ bchild->parent = a; for(GANodeBASE * n=bchild->next; n && n != bchild; n=n->next) n->parent = a; } if(anext == b && bnext != a){ // same as b->prev = a a->prev = b; a->next = bnext; b->prev = aprev; b->next = a; aprev->next = b; bnext->prev = a; } else if(bnext == a && anext != b){ // same as a->prev = b a->prev = bprev; a->next = b; b->prev = a; b->next = anext; anext->prev = b; bprev->next = a; } } else{ // a & b are not adjacent if(bprev == b || bnext == b){ a->prev = a; a->next = a; } else{ a->prev = bprev; a->next = bnext; bprev->next = a; bnext->prev = a; } if(aprev == a || anext == a){ b->prev = b; b->next = b; } else{ b->prev = aprev; b->next = anext; aprev->next = b; anext->prev = b; } if(achild == b){ // same as b->parent = a a->parent = b; a->child = bchild; b->parent = aparent; b->child = a; if(aparent && aparent->child == a) aparent->child = b; for(GANodeBASE * n=a->next; n && n != a; n=n->next) n->parent = b; if(bchild){ bchild->parent = a; for(GANodeBASE * n=bchild->next; n && n != bchild; n=n->next) n->parent = a; } } else if(bchild == a){ // same as a->parent = b a->parent = bparent; a->child = b; b->parent = a; b->child = achild; if(bparent && bparent->child == b) bparent->child = a; if(achild){ achild->parent = b; for(GANodeBASE * n=achild->next; n && n != achild; n=n->next) n->parent = b; } for(GANodeBASE * n=b->next; n && n != b; n=n->next) n->parent = a; } else{ // a and b are not adjacent nor parent-child a->parent = bparent; a->child = bchild; b->parent = aparent; b->child = achild; if(aparent == bparent){ if(aparent && aparent->child == a) aparent->child = b; else if(bparent && bparent->child == b) bparent->child = a; } else{ if(aparent && aparent->child == a) aparent->child = b; if(bparent && bparent->child == b) bparent->child = a; } if(achild){ achild->parent = b; for(GANodeBASE * n=achild->next; n && n != achild; n=n->next) n->parent = b; } if(bchild){ bchild->parent = a; for(GANodeBASE * n=bchild->next; n && n != bchild; n=n->next) n->parent = a; } } } if(rt == a) rt = b; // this only works if they're in the same tree! else if(rt == b) rt = a; return NO_ERR; } // Return the number of nodes in the tree. We do a complete traversal of the // tree and count the number of nodes that we encounter. Could do this breadth // first or depth first - doesn't really matter. We have to traverse the // entire tree to do the count. // We have to do a little work-around here to get through the const-ness of // the size method. Its ok to call size on a const object because it does not // modify the logical state of the object. It does, however, modify the // physical state of the object. So to work around the strictness of the // const specifier, we do a little pointer magic and cast this to be non-const. int GATreeBASE::size() const { if(!csz) return sz; GATreeBASE * This = CON_CAST(GATreeBASE *, this); This->csz = 0; return(This->sz = _GATreeSize(rt)); } // Return the number of levels in the tree. We do a complete traversal of the // tree and keep a count of the number of times we go down and come up a level. // I should be able to combine _size and _depth so we don't have to do two // traversals... int GATreeBASE::depth() const { if(!cdpth) return dpth; GATreeBASE * This = CON_CAST(GATreeBASE *, this); This->cdpth = 0; return(This->dpth = _GATreeDepth(rt)); } // Is node i an ancestor of node j or vice versa? If so, we return 1. Other- // wise we return a 0. int GATreeBASE::ancestral(unsigned int i, unsigned int j) const { GATreeIterBASE aiter(*this); GATreeIterBASE biter(*this); GANodeBASE * aparent, *a; GANodeBASE * bparent, *b; aparent = a = aiter.warp(i); bparent = b = biter.warp(j); while(aparent && aparent != b) aparent = aparent->parent; if(aparent == b) return 1; while(bparent && bparent != a) bparent = bparent->parent; if(bparent == a) return 1; return 0; } /* ---------------------------------------------------------------------------- Recursive routines for the TreeBASE objects ---------------------------------------------------------------------------- */ static int _GATreeSize(GANodeBASE * node) { if(!node) return 0; int count = 1 + _GATreeSize(node->child); for(GANodeBASE * tmp=node->next; tmp && tmp != node; tmp=tmp->next){ count++; count += _GATreeSize(tmp->child); } return count; } static int _GATreeDepth(GANodeBASE * node) { if(!node) return 0; int depth; int maxdepth = 1 + _GATreeDepth(node->child); for(GANodeBASE * tmp=node->next; tmp != node; tmp=tmp->next){ depth = 1 + _GATreeDepth(tmp->child); maxdepth = maxdepth > depth ? maxdepth : depth; } return maxdepth; } /* ---------------------------------------------------------------------------- TreeIterBASE ---------------------------------------------------------------------------- */ // Return the root of the specified node. GANodeBASE * GATreeIterBASE::root(GANodeBASE * c) { if(!c) return (GANodeBASE *)0; while(c->parent != (GANodeBASE *)0) c = c->parent; return(node = c); } // Return the eldest child in a row of siblings. The eldest is the one that // the parent of that row points to. // This could get into an infinite loop if the tree structure were ever // corrupted, so be sure that it doesn't! Also, it will break if the parent // member is not set in any child, so be sure that never happens either. // Remember to set the current node to the one we found. GANodeBASE * GATreeIterBASE::eldest(GANodeBASE * c) { if(!c) return (GANodeBASE *)0; if(!c->parent) return(node=c); GANodeBASE * tmp = c; while(tmp->parent->child != tmp) tmp = tmp->next; return(node = tmp); } // Return the youngest child in a row of siblings. The youngest is the last // one in the row (ie the prev for the eldest since we're using circular lists) // Basically we just find the eldest then take the one previous to that one. // Remember to set the current node to the one we found. GANodeBASE * GATreeIterBASE::youngest(GANodeBASE * c) { if(!c) return (GANodeBASE *)0; if(!c->parent) return(node=c); GANodeBASE * tmp = c; while(tmp->parent->child != tmp) tmp = tmp->next; return(node = tmp->prev); } // Return the number of siblings for the specified node. Notice that this // function returns the number of siblings INCLUDING the specified node. int GATreeIterBASE::nsiblings(GANodeBASE * c) { GANodeBASE * tmp = c; int n=1; while(tmp->next && ((tmp=tmp->next) != c)) n++; return n; } // Return the number of children for the specified node. This is basically the // same code as the nsiblings routine, but we look at the child of the node, // not the node itself. int GATreeIterBASE::nchildren(GANodeBASE * c) { if(!c->child) return 0; GANodeBASE * tmp = c->child; int n=1; while(tmp->next && ((tmp=tmp->next) != c->child)) n++; return n; } // Set the current node to the node indexed by the integer x. If x is out of // bounds, we return NULL and don't change the state of the iterator. This // method uses a depth-first traversal to find the node. Root node is 0, then // we go up from there. GANodeBASE * GATreeIterBASE::warp(unsigned int x) { unsigned int w=0; GANodeBASE * tmp = _GATreeTraverse(x, w, root()); if(tmp) node = tmp; return(tmp); } // Return the number of nodes in the tree from the specified node on down. // Similar to the TreeBASE size method, but we don't set the sz member and // we can't cache the size since this could be called on any node. int GATreeIterBASE::size(GANodeBASE * n) { return(_GATreeSize(n)); } // Return the depth of the tree from the specified node on down. int GATreeIterBASE::depth(GANodeBASE * n) { return(_GATreeDepth(n)); } // Traverse the tree (depth-first) until we come to the node with the index // specified by 'index'. Return NULL if cur != index. GANodeBASE * _GATreeTraverse(unsigned int index, unsigned int & cur, GANodeBASE * node) { if(!node) return (GANodeBASE *)0; if(cur == index) return node; cur++; GANodeBASE * n; if((n = _GATreeTraverse(index, cur, node->child)) != (GANodeBASE *)0) return n; for(GANodeBASE * tmp=node->next; tmp && tmp != node; tmp=tmp->next){ if(cur == index) return tmp; cur++; if((n = _GATreeTraverse(index, cur, tmp->child)) != (GANodeBASE *)0) return n; } return (GANodeBASE *)0; } // Comparison operators for a a tree check for identical tree structure // only (no check for same contents of nodes). These check for // similar tree structure - we traverse one tree and expect the second to be // just like it (depth-first traversal). If there is any difference along the // way, then we return a not equal. // Neither of these operators affects the internal iterator of either // tree genome in any way. // Recursively traverse two trees at the same time. Return 1 if they are // different, return a 0 if they are identical. This checks only the tree // structure, not the node contents. int _GATreeCompare(GANodeBASE * anode, GANodeBASE * bnode) { if(anode==0 && bnode==0) return 0; if(anode==0 || bnode==0) return 1; int count = _GATreeCompare(anode->child, bnode->child); for(GANodeBASE * atmp=anode->next, * btmp=bnode->next; atmp && atmp != anode; atmp=atmp->next, btmp=btmp->next){ count += _GATreeCompare(atmp->child, btmp->child); } return count; } gamera-3.3.3/src/ga/GATreeBASE.h0000644000076500000000000002245510714675676015066 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- treebase.h mbwall 25nov94 Copyright 1995 Massachusetts Institute of Technology DESCRIPTION: This defines the tree objects. ---------------------------------------------------------------------------- */ #ifndef _ga_treebase_h_ #define _ga_treebase_h_ #include /* ---------------------------------------------------------------------------- GATreeBASE ------------------------------------------------------------------------------- This is the base tree class from which template trees are derived. This object does no memory management - it just keeps track of a tree structure. Whoever calls the members of this object is responsible for allocating and deallocating the memory associated with each node. This class does not define any of the iteration operators for traversing the tree. That is left to the iterator friend of this class. We have to break through the const-ness of the tree in order to make things work properly. When you ask for the size of a tree, you don't change the size but you do (possibly) change the value of the sz member. This doesn't change the state of the tree, so it is, in effect, a const-correct operation. But const is too strict, so we have to work around it. See the size() definition to see how this is done. Beware that when you copy this object, you copy pointers, NOT the contents of the pointers. You cannot simply say tree1 = tree2 or GATreeBASE t = tree1. If you do, you'll get a copy of the tree object but not a copy of the tree (the copy will point to the same tree as the original). creation Create a tree by passing a root node. If you don't pass a root node, then the next node assigned to the tree with an insert or append operation will become the root node (regardless of the idx node you pass). insert Stick a node into the tree. Where the node goes depends on the second node and the value of the flag. There are three flag values: before, after, and below. The flag specifies where the new node should go relative to the old node. If oldnode is the root node, the only valid value for flag is below. If there are already children on a node, specifying below puts the new node at the end of the row of children (it becomes the youngest sibling). If you don't pass a value for flag, it defaults to below. The syntax for using the insert method looks like this: mytree.insert(newnode, oldnode, GATreeBASE::before); mytree.insert(newnode, oldnode); Insertions assume that the node to be inserted has NO siblings. If it does, they will be lost! However, the node MAY have children (a subtree). If the insert was successful, return NO_ERR. If there was a problem, return ERR. remove Remove the specified node from the tree. If the node does not exist, an ERR message is posted and NULL is returned. If the node has children, the children are removed from the tree as well (they stay with the node). A pointer to the node is returned if the removal is successful, otherwise NULL. swaptree Move node a to node b's position in the tree and vice versa. This swap maintains the integrity of all of a's and b's descendents. It checks for ancestry conflicts so that you cannot swap a node with one of its descendents. You can swap nodes in different trees, but if you do, be sure to check for root nodes! The swap routine can set only the root node of the current tree - it doesn't know about the root node of the other tree, so you'll have to reset that one. If the swap was successful, return NO_ERR. If there was a problem, return ERR. swapnode Switch nodes a and b, leaving their subtrees (if any) in their original positions (the subtrees don't follow a and b). If the swap was successful, return NO_ERR. If there was a problem, return ERR. size How many nodes are in the tree? We keep a flag to tell us if any operation has been performed that would require a recalculation of the size. If you change the contents of the tree using any method other than those in this object (which you could do, by the way) then you risk screwing up the count. depth How many levels (generations) are there in the tree? ---------------------------------------------------------------------------- */ class GATreeBASE { public: enum Location {ROOT=0, BEFORE, AFTER, BELOW}; // values for 'where' to insert enum {NO_ERR = 0, ERR = -1}; // returns codes for tree funcs GATreeBASE(){rt=(GANodeBASE *)0; sz=0; dpth=0; csz=0; cdpth=0;} GATreeBASE(GANodeBASE * n){rt=n; csz=1; cdpth=1;} GANodeBASE * remove(GANodeBASE * n); int insert(GANodeBASE * n, GANodeBASE * idx, Location where=BELOW); int swaptree(GANodeBASE * a, GANodeBASE * b); int swapnode(GANodeBASE * a, GANodeBASE * b); int size() const; int depth() const; int ancestral(unsigned int i, unsigned int j) const; protected: int sz, dpth; // number of nodes, number of levels in tree short csz, cdpth; // have the contents changed since last update? GANodeBASE *rt; // the root node of the tree private: GATreeBASE(const GATreeBASE &){} // we don't allow copying GATreeBASE & operator=(const GATreeBASE &){return *this;} // or op= friend class GATreeIterBASE; }; /* ---------------------------------------------------------------------------- GATreeIterBASE ------------------------------------------------------------------------------- This is the base class for iterators for the tree objects. We define this class separately from the Tree object so that you can have multiple interators for each tree and so that you can more easily customize the traversal algorithms within the iterator. From the object point of view, the way you traverse a tree is independent of how you represent the tree. Like the TreeBASE object, this object doesn't do any memory allocation or deallocation. All we do is provide tree traversal. Notice that we keep a 'current location' in the tree - whatever your last query was is stored as the node, so if you refer to the current member, you'll get your last query. If you pass a NULL node to these routines they will break. In the interest of speed we don't do any error checking. creation Create an iterator by passing either a tree or another iterator. If you pass a tree, the iterator will default to the root node of the tree. If you pass another iterator, the new iterator will point to the same node that the original iterator points to. nchildren Returns the number of children that are direct offspring of the specified node (or current node if none is specified). nsiblings Returns the number of nodes at the same level as the specified or current node. This number includes the specified or current node. current, root, next, prev, parent, child, eldest, youngest, warp Set the iterator to the specified node and return a pointer to the node that the iterator now points to. If current is NULL or a NULL is passed to one of these routines, a NULL is returned the iterator does not move. warp Move the iterator to the node referenced by index. The root node is node '0' then the count increases from there using a depth-first search. This means that any subtree in a tree will have a contiguous chunk of indices. ---------------------------------------------------------------------------- */ class GATreeIterBASE { public: GATreeIterBASE(){node=(GANodeBASE *)0; tree=(GATreeBASE *)0;} GATreeIterBASE(const GATreeBASE & t){tree = &t; node = t.rt;} GATreeIterBASE(const GATreeIterBASE & i){tree = i.tree; node = i.node;} void operator()(const GATreeBASE & t){tree = &t; node = t.rt;} GANodeBASE * current(GANodeBASE * c) {return(c ? (node=c) : (GANodeBASE *)0);} GANodeBASE * current(){return node;} GANodeBASE * next(){return(node ? (node=node->next) : (GANodeBASE *)0);} GANodeBASE * next(GANodeBASE * c) {return(c ? (node=c->next) : (GANodeBASE *)0);} GANodeBASE * prev(){return(node ? (node=node->prev) : (GANodeBASE *)0);} GANodeBASE * prev(GANodeBASE * c) {return(c ? (node=c->prev) : (GANodeBASE *)0);} GANodeBASE * parent() {return(node ? (node=node->parent) : (GANodeBASE *)0);} GANodeBASE * parent(GANodeBASE * c) {return(c ? (node=c->parent) : (GANodeBASE *)0);} GANodeBASE * child(){return(node ? (node=node->child) : (GANodeBASE *)0);} GANodeBASE * child(GANodeBASE * c) {return(c ? (node=c->child) : (GANodeBASE *)0);} GANodeBASE * root(){return(tree ? (node=tree->rt) : (GANodeBASE *)0);} GANodeBASE * root(GANodeBASE * c); GANodeBASE * eldest() {return(node ? (node=eldest(node)) : (GANodeBASE *)0);} GANodeBASE * eldest(GANodeBASE * c); GANodeBASE * youngest() {return(node ? (node=youngest(node)) : (GANodeBASE *)0);} GANodeBASE * youngest(GANodeBASE * c); GANodeBASE * warp(unsigned int); GANodeBASE * warp(const GATreeIterBASE & i){ tree=i.tree; node=(GANodeBASE *)0; return(i.node ? (node=i.node) : (GANodeBASE *)0); } int size(){return(node ? size(node) : 0);} int size(GANodeBASE * c); int depth(){return(node ? depth(node) : 0);} int depth(GANodeBASE * c); int nchildren(){return(node ? nchildren(node) : 0);} int nchildren(GANodeBASE * c); int nsiblings(){return(node ? nsiblings(node) : 0);} int nsiblings(GANodeBASE * c); protected: GANodeBASE * node; const GATreeBASE * tree; }; #endif gamera-3.3.3/src/ga/GATreeGenome.cpp0000644000076500000000000002307210714675676016115 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- tree.C mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: Source file for the tree genome. ---------------------------------------------------------------------------- */ #ifndef _ga_tree_C_ #define _ga_tree_C_ #include #include #include #include extern int _GATreeCompare(GANodeBASE * anode, GANodeBASE * bnode); template const char * GATreeGenome::className() const {return "GATreeGenome";} template int GATreeGenome::classID() const {return GAID::TreeGenome;} template GATreeGenome::GATreeGenome(GAGenome::Evaluator f, void * u) : GATree(), GAGenome(DEFAULT_TREE_INITIALIZER, DEFAULT_TREE_MUTATOR, DEFAULT_TREE_COMPARATOR) { evaluator(f); userData(u); crossover(DEFAULT_TREE_CROSSOVER); } template GATreeGenome::GATreeGenome(const GATreeGenome & orig) : GATree(), GAGenome() { GATreeGenome::copy(orig); } template GATreeGenome::~GATreeGenome() { } template GAGenome * GATreeGenome::clone(GAGenome::CloneMethod flag) const { GATreeGenome *cpy = new GATreeGenome(); if(flag == (int)CONTENTS){cpy->copy(*this);} // cast is for metrowerks... else{cpy->GAGenome::copy(*this);} return cpy; } template void GATreeGenome::copy(const GAGenome & orig) { if(&orig == this) return; const GATreeGenome* c = DYN_CAST(const GATreeGenome*, &orig); if(c) { GAGenome::copy(*c); GATree::copy(*c); } } #ifndef NO_STREAMS // Traverse the tree (breadth-first) and dump the contents as best we can to // the stream. We don't try to write the contents of the nodes - we simply // write a . for each node in the tree. // We allocate space for x,y coord pair for each node in the tree. Then we // do a depth-first traversal of the tree and assign coords to the nodes in the // order we get them in the traversal. Each coord pair is measured relative to // the parent of the node. template void _tt(ostream & os, GANode * n) { if(!n) return; GANodeBASE * node = DYN_CAST(GANodeBASE*, n); os.width(10); os << node << " "; os.width(10); os << node->parent << " "; os.width(10); os << node->child << " "; os.width(10); os << node->next << " "; os.width(10); os << node->prev << " "; os.width(10); os << &(n->contents) << "\n"; _tt(os, DYN_CAST(GANode*, node->child)); for(GANodeBASE * tmp=node->next; tmp && tmp != node; tmp=tmp->next){ os.width(10); os << tmp << " "; os.width(10); os << tmp->parent << " "; os.width(10); os << tmp->child << " "; os.width(10); os << tmp->next << " "; os.width(10); os << tmp->prev << " "; os.width(10); os << &(DYN_CAST(GANode*, tmp)->contents) << "\n"; _tt(os, DYN_CAST(GANode*, tmp->child)); } } template int GATreeGenome::write(ostream & os) const { os << "node parent child next prev contents\n"; _tt(os, (GANode *)rt); return 0; } #endif template int GATreeGenome::equal(const GAGenome & c) const { if(this == &c) return 1; const GATreeGenome& b = DYN_CAST(const GATreeGenome&, c); return _GATreeCompare(rt, b.rt) ? 0 : 1; } /* ---------------------------------------------------------------------------- Operator definitions ---------------------------------------------------------------------------- */ // This mutation method is destructive. We randomly pick a node in the tree // then delete the subtree and node at that point. Each node in the tree has // a pmut probability of getting nuked. // After the mutation the iterator is left at the root of the tree. template int GATreeGenome::DestructiveMutator(GAGenome & c, float pmut) { GATreeGenome &child=DYN_CAST(GATreeGenome &, c); register int n, i; if(pmut <= 0.0) return 0; n = child.size(); float nMut = pmut * STA_CAST(float,n); if(nMut < 1.0){ // we have to do a flip test for each node nMut = 0; for(i=0; i int GATreeGenome::SwapNodeMutator(GAGenome & c, float pmut) { GATreeGenome &child=DYN_CAST(GATreeGenome &, c); register int n, i; if(pmut <= 0.0) return 0; n = child.size(); float nMut = pmut * STA_CAST(float,n); nMut *= 0.5; // swapping one node swaps another as well if(nMut < 1.0){ // we have to do a flip test for each node nMut = 0; for(i=0; i int GATreeGenome::SwapSubtreeMutator(GAGenome & c, float pmut) { GATreeGenome &child=DYN_CAST(GATreeGenome &, c); register int n, i; int a, b; if(pmut <= 0.0) return 0; n = child.size(); float nMut = pmut * STA_CAST(float,n); nMut *= 0.5; // swapping one node swaps another as well if(nMut < 1.0){ // we have to do a flip test for each node nMut = 0; for(i=0; i float GATreeGenome::TopologyComparator(const GAGenome& a, const GAGenome& b) { if(&a == &b) return 0; const GATreeGenome& sis=DYN_CAST(const GATreeGenome&, a); const GATreeGenome& bro=DYN_CAST(const GATreeGenome&, b); return STA_CAST(float, _GATreeCompare(sis.rt, bro.rt)); } // The default crossover operator takes a node from parent a (with its entire // sub-tree) and replaces it with a node from parent b (with its entire sub- // tree). If the crossover site is not set, then we pick a random site based // on the trees in the genomes we're going to cross. Once we have a valid // crossover site, we copy the trees from the two genomes. // If the crossover site is out of bounds (ie refers to a node not in the // tree) then we don't do anything to the child. // We allow crossover at ANY site in the genomes (including at the root // node). // *** we should be able to speed this up. there is an extra traversal when we // do the check to see if the crossover site is valid. template int GATreeGenome:: OnePointCrossover(const GAGenome& p1, const GAGenome& p2, GAGenome* c1, GAGenome* c2){ const GATreeGenome &mom=DYN_CAST(const GATreeGenome &, p1); const GATreeGenome &dad=DYN_CAST(const GATreeGenome &, p2); int nc=0; unsigned int a = GARandomInt(0, mom.size()-1); unsigned int b = GARandomInt(0, dad.size()-1); GATreeIter momiter(mom), daditer(dad); GATree * tree; if(c1 && c2){ GATreeGenome &sis=DYN_CAST(GATreeGenome &, *c1); GATreeGenome &bro=DYN_CAST(GATreeGenome &, *c2); // first do the sister... if(momiter.warp(a) && daditer.warp(b)){ sis.GATree::copy(mom); tree = dad.GATree::clone(b); sis.warp(a); sis.swaptree(tree); delete tree; sis.warp(0); } // ...now do the brother. if(momiter.warp(a) && daditer.warp(b)){ bro.GATree::copy(dad); tree = mom.GATree::clone(a); bro.warp(b); bro.swaptree(tree); delete tree; bro.warp(0); } nc = 2; } else if(c1){ GATreeGenome &sis=DYN_CAST(GATreeGenome &, *c1); if(GARandomBit()){ if(momiter.warp(a) && daditer.warp(b)){ sis.GATree::copy(mom); tree = dad.GATree::clone(b); sis.warp(a); sis.swaptree(tree); delete tree; sis.warp(0); } } else{ if(momiter.warp(a) && daditer.warp(b)){ sis.GATree::copy(dad); tree = mom.GATree::clone(a); sis.warp(b); sis.swaptree(tree); delete tree; sis.warp(0); } } nc = 1; } return nc; } #endif gamera-3.3.3/src/ga/GATreeGenome.h0000644000076500000000000000543710714675676015567 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- tree.h mbwall 25feb95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved DESCRIPTION: This header defines the interface for the tree genome. ---------------------------------------------------------------------------- */ #ifndef _ga_tree_h_ #define _ga_tree_h_ #include #include /* ---------------------------------------------------------------------------- TreeGenome ------------------------------------------------------------------------------- Beware that the tree genome can grow unbounded - there is no size limit on the tree, so if you have an objective function that encourages size the tree will grow until you run out of memory. ---------------------------------------------------------------------------- */ template class GATreeGenome : public GATree, public GAGenome { protected: using GATree::rt; public: GADeclareIdentity(); static int DestructiveMutator(GAGenome &, float); static int SwapNodeMutator(GAGenome &, float); static int SwapSubtreeMutator(GAGenome &, float); static int OnePointCrossover(const GAGenome&, const GAGenome&, GAGenome*, GAGenome*); static float TopologyComparator(const GAGenome&, const GAGenome&); // static float NodeComparator(const GAGenome&, const GAGenome&); public: GATreeGenome(GAGenome::Evaluator f=NULL, void * u=NULL); GATreeGenome(const GATreeGenome &); GATreeGenome & operator=(const GAGenome & orig) {copy(orig); return *this;} virtual ~GATreeGenome(); virtual GAGenome *clone(GAGenome::CloneMethod flag=CONTENTS) const; virtual void copy(const GAGenome &); #ifndef NO_STREAMS virtual int write (ostream & os=cout) const; #endif virtual int equal(const GAGenome & c) const; // Here we do inlined versions of the access members of the super class. We // do our own here so that we can set/unset the _evaluated flag appropriately. int destroy() { _evaluated = gaFalse; return GATree::destroy(); } int swaptree(GATree * t) { _evaluated = gaFalse; return GATree::swaptree(t); } int swaptree(unsigned int i, unsigned int j) { _evaluated = gaFalse; return GATree::swaptree(i,j); } int swap(unsigned int i, unsigned int j) { _evaluated = gaFalse; return GATree::swap(i,j); } GATree * remove() { _evaluated = gaFalse; return GATree::remove(); } int insert(GATree * t, GATreeBASE::Location where=GATreeBASE::BELOW) { _evaluated = gaFalse; return GATree::insert(t, where); } int insert(const T & t, GATreeBASE::Location where=GATreeBASE::BELOW) { _evaluated = gaFalse; return GATree::insert(t, where); } }; #ifdef USE_BORLAND_INST #include #endif #endif gamera-3.3.3/src/ga/gatypes.h0000644000076500000000000000155710714675676015000 0ustar chriswheel// $Header$ /* ---------------------------------------------------------------------------- gatypes.h mbwall 29apr95 Copyright (c) 1995 Massachusetts Institute of Technology all rights reserved ---------------------------------------------------------------------------- */ #ifndef _ga_types_h_ #define _ga_types_h_ typedef float GAProbability; typedef float GAProb; // This enforces return values and arguments to functions that want strict // boolean arguments. typedef enum _GABoolean { gaFalse=0, gaTrue } GABoolean, GABool; typedef enum _GAStatus { gaSuccess=0, gaFailure=-1 } GAStatus; // This defines what type to use for the bitstream data storage. Use the // smallest type available on your platform. typedef unsigned char GABit; #define GAMax(a,b) ((a) > (b) ? (a) : (b)) #define GAMin(a,b) ((a) < (b) ? (a) : (b)) #endif gamera-3.3.3/src/ga/gaversion.h0000644000076500000000000000100310714675676015303 0ustar chriswheel/* ---------------------------------------------------------------------------- version.h mbwall 10oct98 This is the header file to keep track of the versions and revisions of the GA library. You can use the ident command to extract the version of galib that you are using. ---------------------------------------------------------------------------- */ #ifndef _ga_version_h_ #define _ga_version_h_ //static char *rcsid = "$Date: 2002-11-22 23:16:24 +0100 (Fri, 22 Nov 2002) $ $Revision: 157 $"; #endif gamera-3.3.3/src/ga/makefile.sources0000644000076500000000000000315110714675676016325 0ustar chriswheel# -*- Mode: makefile -*- HDRS= ga.h gaconfig.h gatypes.h gaid.h garandom.h gaerror.h \ GAEvalData.h GAParameter.h GAStatistics.h \ GABaseGA.h GASStateGA.h GASimpleGA.h GAIncGA.h GADemeGA.h GADCrowdingGA.h \ GASelector.h GAScaling.h GAPopulation.h GAGenome.h GAMask.h \ GABinStr.h gabincvt.h GAAllele.h GAArray.h GANode.h \ GA1DBinStrGenome.h GA2DBinStrGenome.h GA3DBinStrGenome.h GABin2DecGenome.h \ GA1DArrayGenome.h GA2DArrayGenome.h GA3DArrayGenome.h \ GAStringGenome.h GARealGenome.h \ GATreeBASE.h GATree.h GATreeGenome.h GAListBASE.h GAList.h GAListGenome.h SRCS= garandom.C gaerror.C GAParameter.C GAStatistics.C \ GABaseGA.C GASStateGA.C GASimpleGA.C GAIncGA.C GADemeGA.C GADCrowdingGA.C \ GASelector.C GAScaling.C GAPopulation.C GAGenome.C \ GABinStr.C gabincvt.C GAAllele.C GAStringGenome.C GARealGenome.C \ GA1DBinStrGenome.C GA2DBinStrGenome.C GA3DBinStrGenome.C GABin2DecGenome.C \ GA1DArrayGenome.C GA2DArrayGenome.C GA3DArrayGenome.C \ GATreeBASE.C GATree.C GATreeGenome.C GAListBASE.C GAList.C GAListGenome.C OBJS= garandom.o gaerror.o GAParameter.o GAStatistics.o \ GABaseGA.o GASStateGA.o GASimpleGA.o GAIncGA.o GADemeGA.o GADCrowdingGA.o \ GASelector.o GAScaling.o GAPopulation.o GAGenome.o \ GABinStr.o gabincvt.o GAAllele.o \ GA1DBinStrGenome.o GA2DBinStrGenome.o GA3DBinStrGenome.o GABin2DecGenome.o \ GA1DArrayGenome.o GA2DArrayGenome.o GA3DArrayGenome.o \ GATreeBASE.o GATree.o GATreeGenome.o GAListBASE.o GAList.o GAListGenome.o TMPL_SRCS= GAAllele.C \ GA1DArrayGenome.C GA2DArrayGenome.C GA3DArrayGenome.C \ GATree.C GATreeGenome.C GAList.C GAListGenome.C \ GAStringGenome.C GARealGenome.C gamera-3.3.3/src/ga/makefile.win320000644000076500000000000000207510714675676015610 0ustar chriswheel# -*- Mode: makefile -*- # Copyright (c) 1994-1996 Massachusetts Institute of Technology # Copyright (c) 1996-1999 Matthew Wall # ----------------------------------------------------------------------------- !include ../makevars.win32 !include makefile.sources CXXFLAGS = $(CXXFLAGS) /I.. STATIC = $(LIB_NAME) LIB = $(STATIC).lib all: $(LIB) $(LIB): $(OBJS) $(AR) $(ARFLAGS) /out:$(LIB) $? @echo $(LIB_NAME) is now up-to-date install: install.lib install.hdr @echo installation complete install.lib: $(LIB) lib_directories $(INSTALL) $(LIB) $(LIB_DEST_DIR) install.hdr: hdr_directories @for %i in ( $(HDRS) ) do \ $(CP) /Q %i $(HDR_DEST_DIR)\$(LIB_NAME) @for %i in ( $(TMPL_SRCS) ) do \ $(CP) /Q %i $(HDR_DEST_DIR)\$(LIB_NAME) lib_directories: @if not exist $(LIB_DEST_DIR) \ $(MKDIR) $(LIB_DEST_DIR) hdr_directories: @if not exist $(HDR_DEST_DIR)\$(LIB_NAME) \ $(MKDIR) $(HDR_DEST_DIR)\$(LIB_NAME) remove: $(RM) $(LIB_DEST_DIR)/$(LIB) $(HDR_DEST_DIR)/$(LIB_NAME) clean: $(RM) $(LIB_NAME).lib $(RM) *.obj *.o *.pdb vc* gamera-3.3.3/src/gameramodule.cpp0000644000076500000000000000422511652050141015675 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; /* These are prototyped here because this is the only file in which they will be used. They are defined in the .cpp files for each of the types. */ void init_SizeType(PyObject* module_dict); void init_PointType(PyObject* module_dict); void init_FloatPointType(PyObject* module_dict); void init_DimType(PyObject* module_dict); void init_RectType(PyObject* module_dict); void init_RegionType(PyObject* module_dict); void init_RegionMapType(PyObject* module_dict); void init_RGBPixelType(PyObject* module_dict); void init_ImageDataType(PyObject* module_dict); void init_ImageType(PyObject* module_dict); void init_ImageInfoType(PyObject* module_dict); void init_ListUtilities(PyObject* module_dict); void init_IteratorType(PyObject* module_dict); extern "C" { DL_EXPORT(void) initgameracore(void); } PyMethodDef gamera_module_methods[] = { {NULL, NULL }, }; DL_EXPORT(void) initgameracore(void) { PyObject* m = Py_InitModule(CHAR_PTR_CAST "gameracore", gamera_module_methods); PyObject* d = PyModule_GetDict(m); init_SizeType(d); init_PointType(d); init_FloatPointType(d); init_DimType(d); init_RectType(d); init_RegionType(d); init_RegionMapType(d); init_RGBPixelType(d); init_ImageDataType(d); init_ImageType(d); init_ImageInfoType(d); init_IteratorType(d); } gamera-3.3.3/src/geostructs/0000755000076500000000000000000011755376174014753 5ustar chriswheelgamera-3.3.3/src/geostructs/delaunaytree.cpp0000644000076500000000000004056711741631156020142 0ustar chriswheel// // Copyright (C) 2010-2012 Oliver Christen, Christoph Dalitz // // This code is based on the Delaunay_Tree implementation // http://people.sc.fsu.edu/~burkardt/cpp_src/delaunay_tree_2d/ // with the kind permission by Olivier Devillers. // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // // // This data structure is only available in C++ // For a Delaunay triangulation in Python, // use the Gamera plugin delaunay_from_points() // #include "geostructs/delaunaytree.hpp" #include #include //------------------------------------------------------------------------- // data structure for computing the two dimensional Delaunay triangulation //------------------------------------------------------------------------- namespace Gamera { namespace Delaunaytree { // are three points collinear? inline bool three_points_collinear(Vertex* v1, Vertex* v2, Vertex* v3) { // in DIA applications, the coordinates are typically integers // => we may compare to a hard coded epsilon return fabs( v1->getX() * (v2->getY() - v3->getY()) + v2->getX() * (v3->getY() - v1->getY()) + v3->getX() * (v1->getY() - v2->getY()) ) < 1.0e-07F; } // Vertex Vertex::Vertex(double x, double y) { this->x = x; this->y = y; this->label = -1; } Vertex::Vertex(double x, double y, int label) { this->x = x; this->y = y; this->label = label; } double Vertex::getX() { return this->x; } double Vertex::getY() { return this->y; } int Vertex::getLabel() { return this->label; } inline Vertex operator+(Vertex a, Vertex b) { return Vertex(a.x + b.x, a.y + b.y); } inline Vertex operator-(Vertex a, Vertex b) { return Vertex(a.x - b.x, a.y - b.y); } inline double operator*(Vertex a, Vertex b) { return a.x * b.x + a.y * b.y; } inline double operator^(Vertex a, Vertex b) { return a.x * b.y - a.y * b.x; } //TriangleFlag TriangleFlag::TriangleFlag() { this->flag = 0; } void TriangleFlag::kill() { this->flag |= 16; } bool TriangleFlag::isDead() { return this->flag & 16; } void TriangleFlag::setInfinite(int i) { this->flag |= i; } int TriangleFlag::isInfinite() { return this->flag & 7; } void TriangleFlag::setLastFinite() { this->flag |= 8; } bool TriangleFlag::isLastFinite() { return this->flag & 8; } int TriangleFlag::getFlag() { return flag; } // TriangleList TriangleList::TriangleList(TriangleList *list, Triangle *triangle) { this->next = list; this->triangle = triangle; } TriangleList::~TriangleList() { if(next) { delete next; next = NULL; triangle = NULL; } } Triangle * TriangleList::getTriangle() { return this->triangle; } TriangleList * TriangleList::getNext() { return this->next; } // DelaunayTree DelaunayTree::DelaunayTree() { this->number = 0; this->root = new Triangle(this); new Triangle(this, root, 0); new Triangle(this, root, 1); new Triangle(this, root, 2); this->root->getNeighbor(0)->setNeighbor(1, this->root->getNeighbor(1)); this->root->getNeighbor(0)->setNeighbor(2, this->root->getNeighbor(2)); this->root->getNeighbor(1)->setNeighbor(0, this->root->getNeighbor(0)); this->root->getNeighbor(1)->setNeighbor(2, this->root->getNeighbor(2)); this->root->getNeighbor(2)->setNeighbor(0, this->root->getNeighbor(0)); this->root->getNeighbor(2)->setNeighbor(1, this->root->getNeighbor(1)); } DelaunayTree::~DelaunayTree() { delete root->getVertex(0); delete root->getVertex(1); delete root->getVertex(2); std::vector::iterator it; for( it = triangles.begin() ; it != triangles.end() ; ++it ) { delete *it; } } void DelaunayTree::appendTriangle(Triangle *t) { this->triangles.push_back(t); } void DelaunayTree::addVertex(Vertex *v) { Triangle *n, *first, *last, *created; Vertex *q, *r; int i; this->root->setNumber( ++this->number ); n = this->root->findConflict(v); if(!n) { return; } n->getFlag()->kill(); for(i = 0; i < (3 - n->getFlag()->isInfinite()); ++i) { if( ( v->getX() == n->getVertex(i)->getX() ) && ( v->getY() == n->getVertex(i)->getY() ) ) { char msg[64]; sprintf(msg, "point (%.1f,%.1f) is already inserted", v->getX(), v->getY()); throw std::runtime_error(msg); } } q = n->getVertex(0); while( n->getNeighbor( i = n->cwNeighbor(q) )->Conflict(v) ) { n = n->getNeighbor(i); n->getFlag()->kill(); } first = last = new Triangle(this, n, v, i); r = n->getVertex((i+2) % 3); while(true) { i = n->cwNeighbor(r); if(n->getNeighbor(i)->getFlag()->isDead()) { n = n->getNeighbor(i); continue; } if(n->getNeighbor(i)->Conflict(v)) { n = n->getNeighbor(i); n->getFlag()->kill(); continue; } break; } while(true) { created = new Triangle(this, n, v, i); created->setNeighbor(2, last); last->setNeighbor(1, created); last = created; r = n->getVertex((i+2) % 3); if(r==q) { break; } while(true) { i = n->cwNeighbor(r); if(n->getNeighbor(i)->getFlag()->isDead()) { n = n->getNeighbor(i); continue; } if(n->getNeighbor(i)->Conflict(v)) { n = n->getNeighbor(i); n->getFlag()->kill(); continue; } break; } } first->setNeighbor(2, last); last->setNeighbor(1, first); return; } void DelaunayTree::addVertices(std::vector *vertices) { std::vector::iterator it; unsigned int i; // randomization commented out, to avoid unexpected changes to input // argument => input data should be randomized beforehand by caller // //random_shuffle(vertices->begin(), vertices->end()); // to avoid an infinite loop while adding the first three points, // we must make sure that these are not colliner if( three_points_collinear((*vertices)[0], (*vertices)[1], (*vertices)[2]) ) { if(vertices->size() == 3) { throw std::runtime_error("all points are collinear"); } this->addVertex((*vertices)[0]); this->addVertex((*vertices)[1]); i = 3; // find next non collinear point while( three_points_collinear((*vertices)[0], (*vertices)[1], (*vertices)[i] )) { i++; if(i == vertices->size()) { throw std::runtime_error("all points are collinear"); } } // insert points beginning at first non collinear point for(it = vertices->begin() + i; it != vertices->end() ; ++it) { this->addVertex(*it); } // insert skipped points for(it = vertices->begin() + 2; it != vertices->begin() + i ; ++it) { this->addVertex(*it); } } // when the first three points are not collinear, // we can insert all points sequentially else { for (it = vertices->begin(); it != vertices->end(); ++it) { this->addVertex(*it); } } } // returns all neighboring vertices as a map vertex->{neighbor1, ...} // every neighbor pair is only listed once in the set for the smaller vertex* void DelaunayTree::neighboringVertices(std::map > *vertexmap) { root->setNumber(++number); // termination criterium root->neighboringVertices(vertexmap); } // returns all neighboring labels as a map label->{neighbor1, ...} // every neighbor pair is only listed once in the set for the smaller label void DelaunayTree::neighboringLabels(std::map > *labelmap) { root->setNumber(++number); // termination criterium root->neighboringLabels(labelmap); } void DelaunayTree::getTriangles(std::list< std::vector* > *triangles) { root->setNumber(++number); // termination criterium root->getTriangles(triangles); } // Triangle Triangle::Triangle(DelaunayTree *tree) { tree->appendTriangle(this); this->vertices[0] = new Vertex(1.0, 0.0); this->vertices[1] = new Vertex(-0.5, 0.8660254); this->vertices[2] = new Vertex(-0.5, -0.8660254); this->flag.setInfinite(3); this->number = 0; this->sons = NULL; } Triangle::Triangle(DelaunayTree *tree, Triangle *parent, int i) { tree->appendTriangle(this); this->vertices[0] = parent->vertices[0]; this->vertices[1] = parent->vertices[1]; this->vertices[2] = parent->vertices[2]; this->flag.setInfinite(4); this->number = 0; this->sons = NULL; this->neighbors[i] = parent; parent->neighbors[i] = this; } Triangle::Triangle(DelaunayTree *tree, Triangle *parent, Vertex *v, int i) { tree->appendTriangle(this); switch( parent->flag.isInfinite() ) { case 0: flag.setInfinite(0); break; case 1: if( parent->flag.isLastFinite() ) { flag.setInfinite( (i==1) ? 0 : 1 ); } else { flag.setInfinite( (i==2) ? 0 : 1 ); } if(flag.isInfinite()) { if(parent->flag.isLastFinite()) { if(i==0) { flag.setLastFinite(); } } else { if(i==1) { flag.setLastFinite(); } } } break; case 2: flag.setInfinite( (i==0 ) ? 2 : 1); if(i==1) { flag.setLastFinite(); } break; case 3: flag.setInfinite(2); break; } number = 0; sons = NULL; parent->sons = new TriangleList( parent->sons, this ); parent->neighbors[i]->sons = new TriangleList(parent->neighbors[i]->sons, this); parent->neighbors[i]->neighbors[ parent->neighbors[i]->NeighborIndex(parent) ] = this; vertices[0] = v; neighbors[0] = parent->neighbors[i]; switch(i) { case 0: vertices[1] = parent->vertices[1]; vertices[2] = parent->vertices[2]; break; case 1: vertices[1] = parent->vertices[2]; vertices[2] = parent->vertices[0]; break; case 2: vertices[1] = parent->vertices[0]; vertices[2] = parent->vertices[1]; break; } } Triangle::~Triangle() { if(sons) { delete sons; } } Triangle * Triangle::findConflict(Vertex *v) { if( !Conflict(v) ) { return NULL; } if(!flag.isDead()) { return this; } for(TriangleList *l = sons ; l ; l = l->getNext()) { if( l->getTriangle()->number != this->number ) { l->getTriangle()->number = this->number; Triangle *n = l->getTriangle()->findConflict(v); if(n) { return n; } } } return NULL; } bool Triangle::Conflict(Vertex *v) { switch( this->flag.isInfinite() ) { case 4: return false; case 3: return true; case 2: return ( ( *v - *vertices[0] ) * ( *vertices[1] + *vertices[2] ) >= 0 ); case 1: if( this->flag.isLastFinite() ) { return ( (( *v - *vertices[2] ) ^ ( *vertices[2] - *vertices[0] )) >= 0 ); } else { return ( (( *v - *vertices[0] ) ^ ( *vertices[0] - *vertices[1] )) >= 0 ); } case 0: double x = v->getX(); double y = v->getY(); double x0 = vertices[0]->getX(); double y0 = vertices[0]->getY(); double x1 = vertices[1]->getX(); double y1 = vertices[1]->getY(); double x2 = vertices[2]->getX(); double y2 = vertices[2]->getY(); x1 -= x0; y1 -= y0; x2 -= x0; y2 -= y0; x -= x0; y -= y0; double z1 = (x1*x1)+(y1*y1); double z2 = (x2*x2)+(y2*y2); double alpha = (y1*z2)-(z1*y2); double beta = (x2*z1)-(x1*z2); double gamma = (x1*y2)-(y1*x2); return ((alpha*x)+(beta*y)+gamma*((x*x)+(y*y)) <= 0); } return false; } int Triangle::NeighborIndex(Triangle *t) { return ( (this->neighbors[0] == t) ? 0 : ( (this->neighbors[1] == t) ? 1 : 2) ); } int Triangle::cwNeighbor(Vertex *v) { return ( (v == this->vertices[0]) ? 2 : ( (v == vertices[1]) ? 0 : 1) ); } TriangleFlag * Triangle::getFlag() { return &this->flag; } Vertex * Triangle::getVertex(int i) { return this->vertices[i]; } void Triangle::setNeighbor(int i, Triangle *t) { this->neighbors[i] = t; } Triangle * Triangle::getNeighbor(int i) { return this->neighbors[i]; } void Triangle::setNumber(int i) { this->number = i; } int Triangle::getNumber() { return this->number; } // adds the labels of neighboring vertices into the neighbors map void Triangle::neighboringLabels(std::map > *allneighbors) { if( flag.isDead() ) { for( TriangleList *l = sons; l ; l = l->getNext() ) { if( l->getTriangle()->number != number ) { l->getTriangle()->number = number; l->getTriangle()->neighboringLabels(allneighbors); } } return; } if(three_points_collinear(vertices[0], vertices[1], vertices[2]) || vertices[0]->getLabel() == -1 || vertices[1]->getLabel() == -1 || vertices[2]->getLabel() == -1) { return; } if( vertices[0]->getLabel() < vertices[1]->getLabel() ) { (*allneighbors)[vertices[0]->getLabel()].insert(vertices[1]->getLabel()); } else if( vertices[0]->getLabel() > vertices[1]->getLabel() ) { (*allneighbors)[vertices[1]->getLabel()].insert(vertices[0]->getLabel()); } if( vertices[1]->getLabel() < vertices[2]->getLabel() ) { (*allneighbors)[vertices[1]->getLabel()].insert(vertices[2]->getLabel()); } else if( vertices[1]->getLabel() > vertices[2]->getLabel() ) { (*allneighbors)[vertices[2]->getLabel()].insert(vertices[1]->getLabel()); } if( vertices[2]->getLabel() < vertices[0]->getLabel() ) { (*allneighbors)[vertices[2]->getLabel()].insert(vertices[0]->getLabel()); } else if( vertices[2]->getLabel() > vertices[0]->getLabel() ) { (*allneighbors)[vertices[0]->getLabel()].insert(vertices[2]->getLabel()); } } // adds the neighboring vertices into the map neighbors void Triangle::neighboringVertices(std::map > *allneighbors) { if( flag.isDead() ) { for( TriangleList *l = sons; l; l = l->getNext() ) { if( l->getTriangle()->number != number ) { l->getTriangle()->number = number; l->getTriangle()->neighboringVertices(allneighbors); } } return; } if(three_points_collinear(vertices[0], vertices[1], vertices[2]) || vertices[0]->getLabel() == -1 || vertices[1]->getLabel() == -1 || vertices[2]->getLabel() == -1) { return; } if( vertices[0] < vertices[1] ) { (*allneighbors)[vertices[0]].insert(vertices[1]); } else if( vertices[0] > vertices[1] ) { (*allneighbors)[vertices[1]].insert(vertices[0]); } if( vertices[1] < vertices[2] ) { (*allneighbors)[vertices[1]].insert(vertices[2]); } else if( vertices[1] > vertices[2] ) { (*allneighbors)[vertices[2]].insert(vertices[1]); } if( vertices[2] < vertices[0] ) { (*allneighbors)[vertices[2]].insert(vertices[0]); } else if( vertices[2] > vertices[0] ) { (*allneighbors)[vertices[0]].insert(vertices[2]); } } void Triangle::getTriangles(std::list< std::vector* > *triangles) { if( flag.isDead() ) { for( TriangleList *l = sons; l ; l = l->getNext() ) { if( l->getTriangle()->number != number ) { l->getTriangle()->number = number; l->getTriangle()->getTriangles(triangles); } } return; } if(three_points_collinear(vertices[0], vertices[1], vertices[2]) || vertices[0]->getLabel() == -1 || vertices[1]->getLabel() == -1 || vertices[2]->getLabel() == -1) { return; } std::vector* tri = new std::vector(); tri->push_back(vertices[0]); tri->push_back(vertices[1]); tri->push_back(vertices[2]); triangles->push_back(tri); } }} // end namespace Gamera::Delaunaytree gamera-3.3.3/src/geostructs/kdtree.cpp0000644000076500000000000002760011652050141016715 0ustar chriswheel// // Copyright (C) 2009 Christoph Dalitz // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. // #include "geostructs/kdtree.hpp" #include #include #include #include namespace Gamera { namespace Kdtree { //-------------------------------------------------------------- // function object for comparing only dimension d of two vecotrs //-------------------------------------------------------------- class compare_dimension { public: compare_dimension(size_t dim) { d=dim; } bool operator()(const KdNode &p, const KdNode &q) { return (p.point[d] < q.point[d]); } size_t d; }; //-------------------------------------------------------------- // internal node structure used by kdtree //-------------------------------------------------------------- class kdtree_node { public: kdtree_node() { dataindex = cutdim = 0; loson = hison = (kdtree_node*)NULL; } ~kdtree_node() { if (loson) delete loson; if (hison) delete hison; } // index of node data in kdtree array "allnodes" size_t dataindex; // cutting dimension size_t cutdim; // value of point //double cutval; // == point[cutdim] CoordPoint point; // roots of the two subtrees kdtree_node *loson, *hison; // bounding rectangle of this node's subtree CoordPoint lobound, upbound; }; //-------------------------------------------------------------- // different distance metrics //-------------------------------------------------------------- class DistanceMeasure { public: DistanceMeasure() {} virtual ~DistanceMeasure() {} virtual double distance(const CoordPoint &p, const CoordPoint &q) = 0; virtual double coordinate_distance(double x, double y, size_t dim) = 0; }; // Maximum distance (Linfinite norm) class DistanceL0 : virtual public DistanceMeasure { DoubleVector* w; public: DistanceL0(const DoubleVector* weights = NULL) { if (weights) w = new DoubleVector(*weights); else w = (DoubleVector*)NULL; } ~DistanceL0() { if (w) delete w; } double distance(const CoordPoint &p, const CoordPoint &q) { size_t i; double dist, test; if (w) { dist = (*w)[0] * fabs(p[0]-q[0]); for (i=1; i dist) dist = test; } } else { dist = fabs(p[0]-q[0]); for (i=1; i dist) dist = test; } } return dist; } double coordinate_distance(double x, double y, size_t dim) { if (w) return (*w)[dim] * fabs(x-y); else return fabs(x-y); } }; // Manhatten distance (L1 norm) class DistanceL1 : virtual public DistanceMeasure { DoubleVector* w; public: DistanceL1(const DoubleVector* weights = NULL) { if (weights) w = new DoubleVector(*weights); else w = (DoubleVector*)NULL; } ~DistanceL1() { if (w) delete w; } double distance(const CoordPoint &p, const CoordPoint &q) { size_t i; double dist = 0.0; if (w) { for (i=0; ibegin()->point.size(); allnodes = *nodes; // initialize distance values distance = NULL; set_distance(distance_type); // compute global bounding box lobound = nodes->begin()->point; upbound = nodes->begin()->point; for (i=1; isize(); i++) { for (j=0; j val) lobound[j] = val; if (upbound[j] < val) upbound[j] = val; } } // build tree recursively root = build_tree(0,0,allnodes.size()); } // distance_type can be 0 (Maximum), 1 (Manhatten), or 2 (Euklidean) void KdTree::set_distance(int distance_type, const DoubleVector* weights /*=NULL*/) { if (distance) delete distance; if (distance_type == 0) { distance = (DistanceMeasure*) new DistanceL0(weights); } else if (distance_type == 1) { distance = (DistanceMeasure*) new DistanceL1(weights); } else { distance = (DistanceMeasure*) new DistanceL2(weights); } } //-------------------------------------------------------------- // recursive build of tree // "a" and "b"-1 are the lower and upper indices // from "allnodes" from which the subtree is to be built //-------------------------------------------------------------- kdtree_node* KdTree::build_tree(size_t depth, size_t a, size_t b) { size_t m; double temp, cutval; kdtree_node* node = new kdtree_node(); node->lobound = lobound; node->upbound = upbound; node->cutdim = depth % dimension; if (b-a <= 1) { node->dataindex = a; node->point = allnodes[a].point; } else { m = (a+b)/2; std::nth_element(allnodes.begin()+a, allnodes.begin()+m, allnodes.begin()+b, compare_dimension(node->cutdim)); node->point = allnodes[m].point; cutval = allnodes[m].point[node->cutdim]; node->dataindex = m; if (m-a>0) { temp = upbound[node->cutdim]; upbound[node->cutdim] = cutval; node->loson = build_tree(depth+1,a,m); upbound[node->cutdim] = temp; } if (b-m>1) { temp = lobound[node->cutdim]; lobound[node->cutdim] = cutval; node->hison = build_tree(depth+1,m+1,b); lobound[node->cutdim] = temp; } } return node; } //-------------------------------------------------------------- // k nearest neighbor search // returns the *k* nearest neighbors of *point* in O(log(n)) // time. The result is returned in *result* and is sorted by // distance from *point*. // The optional search predicate is a callable class (aka "functor") // derived from KdNodePredicate. When Null (default, no search // predicate is applied). //-------------------------------------------------------------- void KdTree::k_nearest_neighbors(const CoordPoint &point, size_t k, KdNodeVector* result, KdNodePredicate* pred /*=NULL*/) { size_t i; KdNode temp; searchpredicate = pred; result->clear(); if (k<1) return; if (point.size() != dimension) throw std::invalid_argument("kdtree::k_nearest_neighbors(): point must be of same dimension as kdtree"); // collect result of k values in neighborheap neighborheap = new std::priority_queue, compare_nn4heap>(); if (k>allnodes.size()) { // when more neighbors asked than nodes in tree, return everything k = allnodes.size(); for (i=0; ipush(nn4heap(i,distance->distance(allnodes[i].point,point))); } } else { neighbor_search(point, root, k); } // copy over result sorted by distance // (we must revert the vector for ascending order) while (!neighborheap->empty()) { i = neighborheap->top().dataindex; neighborheap->pop(); result->push_back(allnodes[i]); } // beware that less than k results might have been returned k = result->size(); for (i=0; idistance(point, node->point); if (!(searchpredicate && !(*searchpredicate)(allnodes[node->dataindex]))) { if (neighborheap->size() < k) { neighborheap->push(nn4heap(node->dataindex,curdist)); } else if (curdist < neighborheap->top().distance) { neighborheap->pop(); neighborheap->push(nn4heap(node->dataindex,curdist)); } } // first search on side closer to point if (point[node->cutdim] < node->point[node->cutdim]) { if (node->loson) if (neighbor_search(point, node->loson, k)) return true; } else { if (node->hison) if (neighbor_search(point, node->hison, k)) return true; } // second search on farther side, if necessary if (neighborheap->size() < k) { dist = std::numeric_limits::max(); } else { dist = neighborheap->top().distance; } if (point[node->cutdim] < node->point[node->cutdim]) { if (node->hison && bounds_overlap_ball(point,dist,node->hison)) if (neighbor_search(point, node->hison, k)) return true; } else { if (node->loson && bounds_overlap_ball(point,dist,node->loson)) if (neighbor_search(point, node->loson, k)) return true; } if (neighborheap->size() == k) dist = neighborheap->top().distance; return ball_within_bounds(point, dist, node); } // returns true when the bounds of *node* overlap with the // ball with radius *dist* around *point* bool KdTree::bounds_overlap_ball(const CoordPoint &point, double dist, kdtree_node* node) { double distsum = 0.0; size_t i; for (i=0; ilobound[i]) { // lower than low boundary distsum += distance->coordinate_distance(point[i],node->lobound[i],i); if (distsum > dist) return false; } else if (point[i] > node->upbound[i]) { // higher than high boundary distsum += distance->coordinate_distance(point[i],node->upbound[i],i); if (distsum > dist) return false; } } return true; } // returns true when the bounds of *node* completely contain the // ball with radius *dist* around *point* bool KdTree::ball_within_bounds(const CoordPoint &point, double dist, kdtree_node* node) { size_t i; for (i=0; icoordinate_distance(point[i],node->lobound[i],i) <= dist || distance->coordinate_distance(point[i],node->upbound[i],i) <= dist) return false; return true; } }} // end namespace Gamera::Kdtree gamera-3.3.3/src/graph/0000755000076500000000000000000011755376174013652 5ustar chriswheelgamera-3.3.3/src/graph/bfsdfsiterator.cpp0000644000076500000000000000463411712302464017366 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/graph_common.hpp" #include "graph/bfsdfsiterator.hpp" #include "graph/node.hpp" #include "graph/edge.hpp" #include "graph/graph.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- void BfsIterator::init(Node* start) { visit(start); _queue.push(start); } // ----------------------------------------------------------------------------- Node* BfsIterator::next() { if(_queue.empty()) return NULL; Node* current = _queue.front(); _queue.pop(); for(EdgeIterator it = current->_edges.begin(); it != current->_edges.end(); it++) { Node* n = (*it)->traverse(current); if(n != NULL && !is_visited(n)) { visit(n); _queue.push(n); } } return current; } // ----------------------------------------------------------------------------- void DfsIterator::init(Node* start) { found_cycles = false; visit(start); _stack.push(start); } // ----------------------------------------------------------------------------- Node* DfsIterator::next() { if(_stack.empty()) return NULL; Node* current = _stack.top(); _stack.pop(); for(EdgeIterator it = current->_edges.begin(); it != current->_edges.end(); it++) { Node* n = (*it)->traverse(current); if(n != NULL && !is_visited(n)) { visit(n); _stack.push(n); _used_edges.insert(*it); } else if(!found_cycles && n != NULL && _used_edges.find(*it) == _used_edges.end()) { found_cycles = true; } } return current; } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/edge.cpp0000644000076500000000000000435211712302464015246 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/edge.hpp" #include "graph/node.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- Edge::Edge(Node* from_node, Node* to_node, cost_t weight, bool directed, void* label) { this->is_directed = directed; this->from_node = from_node; this->to_node = to_node; this->weight = weight; this->label = label; from_node->add_edge(this); to_node->add_edge(this); } // ----------------------------------------------------------------------------- void Edge::remove_self() { try { if(from_node) from_node->_edges.remove(this); if(to_node) to_node->_edges.remove(this); } catch (...) { assert(false); } from_node = NULL; to_node = NULL; } // ----------------------------------------------------------------------------- Node* Edge::traverse(Node* node) { if(from_node == NULL or to_node == NULL) return NULL; else if(node == from_node) return to_node; else if(!is_directed && node == to_node) return from_node; return NULL; } // ----------------------------------------------------------------------------- Node* Edge::traverse(GraphData * value) { if(from_node == NULL or to_node == NULL) return NULL; else if(*value == *from_node->_value) return to_node; else if(!is_directed && *value == *to_node->_value) return from_node; return NULL; } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/graph_algorithm.cpp0000644000076500000000000001341611712302465017513 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/graph.hpp" #include "graph/edge.hpp" #include "graph/node.hpp" #include "graph/bfsdfsiterator.hpp" #include "graph/spanning_tree.hpp" #include "graph/shortest_path.hpp" #include "graph/subgraph_root.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- NodeVector *Graph::get_subgraph_roots() { NodeVector* roots; SubgraphRoots* algo = new SubgraphRoots(); roots = algo->subgraph_roots(this); delete algo; return roots; } // ----------------------------------------------------------------------------- size_t Graph::get_nsubgraphs() { NodeVector *roots = get_subgraph_roots(); size_t count = roots->size(); delete roots; return count; } // ----------------------------------------------------------------------------- size_t Graph::size_of_subgraph(GraphData * value) { Node* node = get_node(value); if(node != NULL) { return size_of_subgraph(node); } return 0; } // ----------------------------------------------------------------------------- bool Graph::is_fully_connected() { Node* start = _nodes.front(); size_t count = 0; DfsIterator *it = DFS(start); while(it->next() != 0) count++; delete it; return count == get_nnodes(); } // ----------------------------------------------------------------------------- bool Graph::has_path(GraphData * from_value, GraphData * to_value) { Node* from_node = get_node(from_value); Node* to_node = get_node(to_value); if(from_node == NULL || to_node == NULL) return false; else return has_path(from_node, to_node); } // ----------------------------------------------------------------------------- bool Graph::has_path(Node* from_node, Node* to_node) { DfsIterator it(this, from_node); Node* n; while((n = it.next()) != NULL) { if(to_node == n) return true; } return false; } // ----------------------------------------------------------------------------- /// returns size of subgraph with root *node*. please remind that starting node /// is not counted; size_t Graph::size_of_subgraph(Node* node) { DfsIterator it(this, node); size_t count = 0; while(it.next() != NULL) count++; return count; } // ----------------------------------------------------------------------------- // algorithms // ----------------------------------------------------------------------------- BfsIterator* Graph::BFS(Node* node) { if(node == NULL) return NULL; BfsIterator* it = new BfsIterator(this, node); return it; } // ----------------------------------------------------------------------------- BfsIterator* Graph::BFS(GraphData * value) { Node* node = get_node(value); return BFS(node); } // ----------------------------------------------------------------------------- DfsIterator* Graph::DFS(Node* node) { if(node == NULL) return NULL; DfsIterator* it = new DfsIterator(this, node); return it; } // ----------------------------------------------------------------------------- DfsIterator* Graph::DFS(GraphData * value) { Node* node = get_node(value); return DFS(node); } // ----------------------------------------------------------------------------- ShortestPathMap* Graph::dijkstra_shortest_path(Node* node) { if(node == NULL) { return NULL; } else { ShortestPath s; return s.dijkstra_shortest_path(this, node); } } // ----------------------------------------------------------------------------- ShortestPathMap* Graph::dijkstra_shortest_path(GraphData * value) { Node *node = get_node(value); return dijkstra_shortest_path(node); } // ----------------------------------------------------------------------------- std::map Graph::dijkstra_all_pairs_shortest_path() { std::map res; NodePtrIterator *it = get_nodes(); Node* n; while((n=it->next()) != NULL) { res[n] = dijkstra_shortest_path(n); } delete it; return res; } // ----------------------------------------------------------------------------- std::map Graph::all_pairs_shortest_path() { //multiple dijkstra is better (O(n^2 log n + e)) than algorithm in //old implementation (O(n^3)) return dijkstra_all_pairs_shortest_path(); } // ----------------------------------------------------------------------------- Graph *Graph::create_spanning_tree(GraphData * value) { Node* n = get_node(value); if(n == NULL) return NULL; return create_spanning_tree(n); } // ----------------------------------------------------------------------------- /// creates a spanning tree using DFS technique Graph *Graph::create_spanning_tree(Node* node) { return SpanningTree::create_spanning_tree(this, node); } // ----------------------------------------------------------------------------- Graph *Graph::create_minimum_spanning_tree() { //Kruskal return SpanningTree::create_minimum_spanning_tree(this); } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/graph_colorize.cpp0000644000076500000000000001506711712302465017357 0ustar chriswheel/* * * Copyright (C) 2010 Tobias Bolten, Oliver Christen * 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include "graph/graph.hpp" #include "graph/node.hpp" #include "graph/graphdataderived.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- unsigned int Graph::get_color(Node* n) { if(_colors == NULL) throw std::runtime_error("Graph::get_color: Graph is not colorized"); ColorMap::iterator it = _colors->find(n); if(it == _colors->end()) throw std::runtime_error("Graph::get_color: Node is not colorized"); return it->second; } // ----------------------------------------------------------------------------- void Graph::set_color(Node* n, unsigned int color) { if(_colors == NULL) { _colors = new ColorMap(); } (*_colors)[n] = color; } // ----------------------------------------------------------------------------- /** * algorithm from * ftp://db.stanford.edu/pub/cstr/reports/cs/tr/80/830/CS-TR-80-830.pdf * */ void Graph::colorize(unsigned int ncolors) { if (ncolors < 6) { throw std::runtime_error("Graph::colorize: insufficient colors. " "ncolors has to be at least 6"); } typedef std::list NodeList; typedef std::map DegreeMap; typedef std::map NodeDegreeMap; NodeDegreeMap nodedegrees; DegreeMap degrees; NodePtrIterator* n_it; Node* n; // -------------------------------------------------------------------------- //Step 1: form degree_list n_it = get_nodes(); while((n = n_it->next()) != NULL) { size_t nnodes = n->get_nnodes(); if(degrees[nnodes] == NULL) degrees[nnodes] = new NodeList; degrees[nnodes]->push_back(n); nodedegrees[n] = nnodes; } delete n_it; // -------------------------------------------------------------------------- //Step 2 // std::vector removed(get_nnodes()); for(int i = get_nnodes()-1; i >= 0; i--) { Node* to_be_removed = NULL; //find first Node of smallest degree for(DegreeMap::iterator it = degrees.begin(); it != degrees.end(); it++) { if(it->second->size() > 0) { to_be_removed = it->second->front(); removed[i] = to_be_removed; it->second->pop_front(); break; } } if(to_be_removed == NULL) throw std::runtime_error("Something went wrong when colorizing"); NodePtrEdgeIterator* neighbors = to_be_removed->get_nodes(); Node* neighbor; while((neighbor = neighbors->next()) != NULL) { int degree = nodedegrees[neighbor]; if(degree == -1) // not in a degree list continue; NodeList::iterator it = std::find(degrees[degree]->begin(), degrees[degree]->end(), neighbor); if(it != degrees[degree]->end()) { degrees[degree]->erase(it); nodedegrees[n] = degree -1; if(degree >= 0) { if(degrees[degree-1] == NULL) degrees[degree-1] = new NodeList; //insert at degree-1 degrees[degree-1]->push_back(neighbor); } } } delete neighbors; } // -------------------------------------------------------------------------- //Step 3 //initialize histogram with 0 if(_colorhistogram != NULL) { delete _colorhistogram; } _colorhistogram = new Histogram(ncolors, 0); n_it = get_nodes(); try { for(std::vector::iterator it = removed.begin(); it != removed.end(); it++) { // while ((n = n_it->next()) != NULL) { n = *it; if(n == NULL) continue; std::vector available_colors(ncolors, true); //erase colors which are set in the neighborhood of the node NodePtrEdgeIterator* neighbors = n->get_nodes(); Node* neighbor; unsigned int neighbor_color; while((neighbor = neighbors->next()) != NULL) { try { neighbor_color = get_color(neighbor); available_colors[neighbor_color] = false; #ifdef __DEBUG_GAPI__ std::cerr<< neighbor_color << ","; #endif } catch(std::runtime_error) { //node is not colorized } } #ifdef __DEBUG_GAPI__ std::cerr << std::endl; #endif delete neighbors; int color = -1; unsigned int mincount = std::numeric_limits::max(); for(unsigned int i = 0; i < ncolors; i++) { unsigned int count = (*_colorhistogram)[i]; #ifdef __DEBUG_GAPI__ std::cerr << "color: " << i <<"count: " << count << std::endl; #endif if(available_colors[i] == true && (color == -1 || count <= mincount)) { color = i; mincount = count; #ifdef __DEBUG_GAPI__ std::cerr << "new color: " << color << std::endl; #endif } } if(color < 0) { #ifdef __DEBUG_GAPI__ GraphDataLong* dat = dynamic_cast(n->_value); if(dat) std::cerr << "no more colors at label: " << dat->data << std::endl; #endif throw std::runtime_error("not enough colors for this graph"); } #ifdef __DEBUG_GAPI__ std::cerr << "decided color: " << color << std::endl; #endif set_color(n, color); (*_colorhistogram)[color]++; } } catch(std::runtime_error) { //free degreemap for(DegreeMap::iterator it = degrees.begin(); it != degrees.end(); it++) { delete it->second; } delete n_it; throw; } for(DegreeMap::iterator it = degrees.begin(); it != degrees.end(); it++) { delete it->second; } delete n_it; } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/graph_flags.cpp0000644000076500000000000002557311712302465016630 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/graph.hpp" #include "graph/edge.hpp" #include "graph/node.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- bool Graph::is_directed() { return GRAPH_HAS_FLAG(this, FLAG_DIRECTED); } // ----------------------------------------------------------------------------- /// sets each edge to directed and adds the same in other direction void Graph::make_directed() { EdgePtrIterator* it = get_edges(); Edge* e; GRAPH_SET_FLAG(this, FLAG_DIRECTED); EdgeVector edges; while((e = it->next()) != NULL) { e->is_directed = true; edges.push_back(e); } delete it; for(EdgeIterator it = edges.begin(); it != edges.end(); it++) { Edge* e = *it; add_edge(e->to_node, e->from_node, e->weight, true, e->label); } } // ----------------------------------------------------------------------------- /// This is a small helper-struct for remembering edges in make_undirected struct smallEdge { Node *_to, *_from; smallEdge(Node* from, Node* to) { _to = to; _from = from; } }; // ----------------------------------------------------------------------------- /// sets each edge as undirected and tries to remove edges in other direction void Graph::make_undirected() { if(is_undirected()) return; std::vector remove; { EdgePtrIterator *it = get_edges(); Edge* e; while((e = it->next()) != NULL) { Node* from = e->from_node; Node* to = e->to_node; e->is_directed = false; if(has_edge(to,from)) { remove.push_back(new smallEdge(to, from)); } } delete it; } for(std::vector::iterator it = remove.begin(); it != remove.end(); it++) { try { remove_edge((*it)->_from, (*it)->_to); } catch (std::runtime_error) { std::cerr << "somthing went wrong" << std::endl; } delete *it; } GRAPH_UNSET_FLAG(this, FLAG_DIRECTED); } // ----------------------------------------------------------------------------- bool Graph::is_cyclic() { if(get_nedges() == 0) //trivial case return false; else if(get_nnodes() == 1) //another trivial case return true; bool cyclic = false; if(is_directed()) { //similar algorithm to make_acyclic NodeStack node_stack; std::set visited; if (get_nedges() != 0) { NodePtrIterator *i = get_nodes(); Node* n; while((n = i->next()) != NULL && !cyclic) { if (visited.count(n) == 0) { node_stack.push(n); while (!node_stack.empty() && !cyclic) { Node* node = node_stack.top(); node_stack.pop(); visited.insert(node); EdgePtrIterator *it = node->get_edges(); Edge* e; while ((e = it->next()) != NULL && !cyclic) { Node* inner_node = e->traverse(node); if(inner_node) { if(visited.count(inner_node) != 0) { cyclic = true; } else { node_stack.push(inner_node); visited.insert(inner_node); } } } delete it; } } } delete i; } } else { NodeVector* roots = NULL; roots = get_subgraph_roots(); for(NodeVector::iterator rit = roots->begin(); rit != roots->end() && !cyclic; rit++) { //tests for cycles in each subgraph DfsIterator *it = DFS(*rit); while(it->next() != NULL) ; cyclic = cyclic || it->has_cycles(); delete it; } delete roots; } return cyclic; } // ----------------------------------------------------------------------------- // only sets flag to allow cycles void Graph::make_cyclic() { GRAPH_SET_FLAG(this, FLAG_CYCLIC); } // ----------------------------------------------------------------------------- /** make_acyclic removes any cycles from the graph. * Another probably better way for doing this could be spanning_tree * * This implementation works only with directed graphs. As a solution the * graph is converted to a directed graph and back to an undirected after * running the algorithm. * */ void Graph::make_acyclic() { typedef std::set EdgeSet; EdgeSet edges_to_remove; NodeStack node_stack; std::set visited; bool undirected = is_undirected(); if(undirected) make_directed(); if (get_nedges() != 0) { NodePtrIterator *i = get_nodes(); Node* n; while((n = i->next()) != NULL) { if (visited.count(n) == 0) { if (node_stack.size()) throw std::runtime_error("Error in graph_make_acyclic. " "This error should never be raised. Please report " "it to the author."); node_stack.push(n); while (!node_stack.empty()) { Node* node = node_stack.top(); node_stack.pop(); visited.insert(node); EdgePtrIterator *it = node->get_edges(); Edge* e; while ((e = it->next()) != NULL) { Node* inner_node = e->traverse(node); if(inner_node) { if(visited.count(inner_node) != 0) { edges_to_remove.insert(e); } else { node_stack.push(inner_node); visited.insert(inner_node); } } } delete it; } } } for(EdgeSet::iterator it = edges_to_remove.begin(); it != edges_to_remove.end(); it++) { remove_edge(*it); } delete i; } if(undirected) make_undirected(); GRAPH_UNSET_FLAG(this, FLAG_CYCLIC); } // ----------------------------------------------------------------------------- bool Graph::is_tree() { return !is_cyclic() && !is_directed(); } // ----------------------------------------------------------------------------- // only sets flag void Graph::make_multi_connected() { GRAPH_SET_FLAG(this, FLAG_MULTI_CONNECTED); } // ----------------------------------------------------------------------------- // unsets flag and removes multiple edges void Graph::make_singly_connected() { typedef std::pair edgepair; EdgeVector to_remove; std::set edgeset; EdgePtrIterator* it = get_edges(); Edge* e; if(is_directed()) { while((e = it->next()) != NULL) { edgepair ep(e->from_node, e->to_node); if(edgeset.count(ep) > 0) to_remove.push_back(e); else edgeset.insert(ep); } } else { while((e = it->next()) != NULL) { edgepair ep(std::min(e->from_node, e->to_node), std::max(e->from_node, e->to_node)); if(edgeset.count(ep) > 0) to_remove.push_back(e); else edgeset.insert(ep); } } delete it; for(EdgeIterator it = to_remove.begin(); it != to_remove.end(); it++) { remove_edge(*it); } GRAPH_UNSET_FLAG(this, FLAG_MULTI_CONNECTED); } // ----------------------------------------------------------------------------- // only sets flag void Graph::make_self_connected() { GRAPH_SET_FLAG(this, FLAG_SELF_CONNECTED); } // ----------------------------------------------------------------------------- //unsets flag and remove self-connections void Graph::make_not_self_connected() { std::vector remove; { EdgePtrIterator *it = get_edges(); Edge* e; while((e = it->next()) != NULL) { Node* from = e->from_node; Node* to = e->to_node; if(to == from) { remove.push_back(new smallEdge(to, from)); } } delete it; } for(std::vector::iterator it = remove.begin(); it != remove.end(); it++) { remove_edge((*it)->_from, (*it)->_to); delete *it; } GRAPH_UNSET_FLAG(this, FLAG_SELF_CONNECTED); } // ----------------------------------------------------------------------------- bool Graph::conforms_restrictions() { if(!GRAPH_HAS_FLAG(this, FLAG_CYCLIC) && is_cyclic()) return false; if(!GRAPH_HAS_FLAG(this, FLAG_MULTI_CONNECTED) && is_multi_connected()) return false; if(!GRAPH_HAS_FLAG(this, FLAG_SELF_CONNECTED) && is_self_connected()) { return false; } return true; } // ----------------------------------------------------------------------------- bool Graph::is_multi_connected() { std::set > edgeset; EdgePtrIterator* it = get_edges(); Edge* e; if(is_directed()) { while((e = it->next()) != NULL) { edgeset.insert(std::pair(e->from_node, e->to_node)); } } else { while((e = it->next()) != NULL) { edgeset.insert(std::pair( std::min(e->from_node, e->to_node), std::max(e->from_node, e->to_node) )); } } delete it; return edgeset.size() != get_nedges(); } // ----------------------------------------------------------------------------- bool Graph::is_self_connected() { bool selfconnections = false; EdgePtrIterator* it = get_edges(); Edge* e; while((e = it->next()) != NULL && !selfconnections) { if( *e->from_node->_value == *e->to_node->_value) { selfconnections = true; } } delete it; return selfconnections; } // ----------------------------------------------------------------------------- void Graph::make_tree() { GRAPH_SET_FLAG(this, FLAG_TREE); make_undirected(); make_acyclic(); } // ----------------------------------------------------------------------------- void Graph::make_blob() { GRAPH_UNSET_FLAG(this, FLAG_TREE); } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/graph_structure.cpp0000644000076500000000000002767611712302464017601 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/graph.hpp" #include "graph/edge.hpp" #include "graph/node.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- Graph::Graph(bool directed, bool check_on_insert) { _flags = FLAG_FREE; //flag free as default flags if(directed) GRAPH_SET_FLAG(this, FLAG_DIRECTED); else GRAPH_UNSET_FLAG(this, FLAG_DIRECTED); if(check_on_insert) GRAPH_SET_FLAG(this, FLAG_CHECK_ON_INSERT); else GRAPH_UNSET_FLAG(this, FLAG_CHECK_ON_INSERT); _colorhistogram = NULL; _colors = NULL; } // ----------------------------------------------------------------------------- Graph::Graph(flag_t flags) { if(flags == FLAG_TREE) { UNSET_FLAG(flags, FLAG_DIRECTED); UNSET_FLAG(flags, FLAG_CYCLIC); } else if(flags == FLAG_BLOB) { SET_FLAG(flags, FLAG_CYCLIC); } if(!HAS_FLAG(flags, FLAG_CYCLIC)) { UNSET_FLAG(flags, FLAG_MULTI_CONNECTED); UNSET_FLAG(flags, FLAG_SELF_CONNECTED); } _flags = flags; _colorhistogram = NULL; _colors = NULL; } // ----------------------------------------------------------------------------- /** * deletes all edges and nodes when deleting the whole graph */ Graph::~Graph() { size_t edgecount=0, nodecount=0; for(EdgeIterator it = _edges.begin(); it != _edges.end(); it++) { delete *it; edgecount++; } for(NodeIterator it = _nodes.begin(); it != _nodes.end(); it++) { delete *it; nodecount++; } assert(nodecount == _nodes.size()); assert(edgecount == _edges.size()); _edges.clear(); _nodes.clear(); _valuemap.clear(); if(_colors) delete _colors; if(_colorhistogram) delete _colorhistogram; } // ----------------------------------------------------------------------------- /** * copies the whole graph as a deep copy */ Graph::Graph(Graph &g) { _colors = NULL; _colorhistogram = NULL; _flags = g._flags; NodePtrIterator *nit = g.get_nodes(); Node *n; while((n=nit->next()) != NULL) add_node(n->_value); delete nit; EdgePtrIterator *eit = g.get_edges(); Edge *e; while((e=eit->next()) != NULL) { add_edge(e->from_node->_value, e->to_node->_value, e->weight, e->is_directed, e->label); } delete eit; } // ----------------------------------------------------------------------------- Graph::Graph(Graph* g, flag_t flags) { _colors = NULL; _colorhistogram = NULL; _flags = flags; bool directed = GRAPH_HAS_FLAG(g, FLAG_DIRECTED); NodePtrIterator *nit = g->get_nodes(); Node *n; while((n=nit->next()) != NULL) add_node(n->_value->copy()); delete nit; EdgePtrIterator *eit = g->get_edges(); Edge *e; if(!directed) { while((e=eit->next()) != NULL) { add_edge(e->from_node->_value, e->to_node->_value, e->weight, e->is_directed, e->label); } } else { while((e=eit->next()) != NULL) { add_edge(e->from_node->_value, e->to_node->_value, e->weight, false, e->label); } } delete eit; } // ----------------------------------------------------------------------------- // methods for nodes // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- /** * returns true when graph has a node with same value as the given Node. */ bool Graph::has_node(Node* node) { return has_node(node->_value); } // ----------------------------------------------------------------------------- bool Graph::has_node(GraphData * value) { return _valuemap.find(value) != _valuemap.end(); } // ----------------------------------------------------------------------------- /** * a new node is created and added using add_node */ bool Graph::add_node(GraphData * value) { Node* toadd = new Node(value); if(add_node(toadd) == false) { delete toadd; return false; } else return true; } // ----------------------------------------------------------------------------- /** a Node is added in following steps - assign value to node - check if value is already present in graph - set node's graph - add node to graph's nodelist - add node's value to graph's valuemap */ bool Graph::add_node(Node* node) { if(!has_node(node)) { node->add_to_graph(this); _nodes.push_back(node); _valuemap[node->_value] = node; return true; } else { //already in list return false; } } // ----------------------------------------------------------------------------- Node* Graph::add_node_ptr(GraphData * value) { Node* n = get_node(value); if(n == NULL) { n = new Node(value); if(add_node(n) == false) { delete n; n = NULL; } } return n; } // ----------------------------------------------------------------------------- /** Parameter: NodeVector of nodes which should be added returns count of added nodes */ int Graph::add_nodes(NodeVector nodes) { int count = 0; for(NodeIterator it = nodes.begin(); it != nodes.end(); it++) { if(add_node(*it)) count++; } return count; } // ----------------------------------------------------------------------------- /** Parameter: ValueVector of values which should be added returns count of added nodes */ int Graph::add_nodes(ValueVector values) { int count = 0; for(ValueIterator it = values.begin(); it != values.end(); it++) { if(add_node(*it)) count++; } return count; } // ----------------------------------------------------------------------------- Node* Graph::get_node(GraphData * value) { ValueNodeMap::iterator it = _valuemap.find(value); if(it == _valuemap.end()) return NULL; else return it->second; } // ----------------------------------------------------------------------------- NodePtrIterator* Graph::get_nodes() { NodePtrIterator* it= new NodePtrIterator(this, _nodes.begin(), _nodes.end()); return it; } // ----------------------------------------------------------------------------- /** removes a node glueing all edges together */ void Graph::remove_node(Node* node) { if(node != NULL) { node->remove_self(true); _nodes.remove(node); _valuemap.erase(node->_value); delete node; } else { throw std::runtime_error("some error occured: Null pointer to node"); } } // ----------------------------------------------------------------------------- void Graph::remove_node(GraphData * value) { Node* node = get_node(value); if (node != NULL) remove_node(node); else throw std::runtime_error("node not present"); } // ----------------------------------------------------------------------------- /** * removes a node not glueing all edges together */ void Graph::remove_node_and_edges(Node* node) { if(node != NULL) { node->remove_self(false); _nodes.remove(node); _valuemap.erase(node->_value); delete node; } } // ----------------------------------------------------------------------------- void Graph::remove_node_and_edges(GraphData * value) { Node* node = get_node(value); if (node != NULL) remove_node_and_edges(node); } // ----------------------------------------------------------------------------- int Graph::add_edge(GraphData * from_value, GraphData * to_value, cost_t cost, bool directed, void* label) { Node *from_node, *to_node; from_node = add_node_ptr(from_value); to_node = add_node_ptr(to_value); return add_edge(from_node, to_node, cost, directed, label); } // ----------------------------------------------------------------------------- int Graph::add_edge(Node* from_node, Node* to_node, cost_t cost, bool directed, void* label) { Edge *e = NULL, *f = NULL; unsigned long count = 0; if (from_node == NULL || to_node == NULL) return 0; if(!GRAPH_HAS_FLAG(this, FLAG_DIRECTED) && directed) throw std::invalid_argument("Cannot insert directed edge into " "undirected graph."); if(GRAPH_HAS_FLAG(this, FLAG_DIRECTED) && !directed) { directed = true; f = new Edge(to_node, from_node, cost, true, label); _edges.push_back(f); if(GRAPH_HAS_FLAG(this, FLAG_CHECK_ON_INSERT) && !conforms_restrictions()) { remove_edge(f); f = NULL; } else count++; } e = new Edge(from_node, to_node, cost, directed, label); _edges.push_back(e); if(GRAPH_HAS_FLAG(this, FLAG_CHECK_ON_INSERT) && !conforms_restrictions()) { remove_edge(e); e = NULL; } else count++; return count; } // ----------------------------------------------------------------------------- EdgePtrIterator *Graph::get_edges() { EdgePtrIterator* it= new EdgePtrIterator(this, _edges.begin(), _edges.end()); return it; } // ----------------------------------------------------------------------------- bool Graph::has_edge(GraphData * from_value, GraphData * to_value) { Node* from_node = get_node(from_value); Node* to_node = get_node(to_value); return has_edge(from_node, to_node); } // ----------------------------------------------------------------------------- bool Graph::has_edge(Node* from_node, Node* to_node) { if(from_node == NULL || to_node == NULL) return false; if(!is_directed()) return from_node->has_edge_to(to_node) || to_node->has_edge_to(from_node); else return from_node->has_edge_to(to_node); } // ----------------------------------------------------------------------------- void Graph::remove_edge(GraphData * from_value, GraphData * to_value) { Node* from_node = get_node(from_value); Node* to_node = get_node(to_value); remove_edge(from_node, to_node); } // ----------------------------------------------------------------------------- void Graph::remove_edge(Node* from_node, Node* to_node) { unsigned long count = 0; EdgeVector to_remove; for(EdgeIterator it = _edges.begin(); it != _edges.end(); it++) { Edge *e = *it; if(e->to_node == to_node && e->from_node == from_node) { to_remove.push_back(e); } else if(is_undirected() && e->from_node == to_node && e->to_node == from_node) { to_remove.push_back(e); } } for(EdgeIterator it = to_remove.begin(); it != to_remove.end(); it++) { remove_edge(*it); count++; } if(count == 0) throw std::runtime_error("There is no edge with given nodes in this graph."); } // ----------------------------------------------------------------------------- void Graph::remove_edge(Edge* edge) { edge->remove_self(); // int count = _edges.size(); _edges.remove(edge); // assert(_edges.size() < count); delete edge; } // ----------------------------------------------------------------------------- void Graph::remove_all_edges() { //not calling remove_edge because this would take O ( e*ln(e)*ln(e) ) //doing it this way takes only O(e * ln(e)) for(EdgeIterator it = _edges.begin(); it != _edges.end(); it ++) { (*it)->remove_self(); delete *it; } _edges.clear(); } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/graphmodule/0000755000076500000000000000000011755376174016161 5ustar chriswheelgamera-3.3.3/src/graph/graphmodule/edgeobject.cpp0000644000076500000000000002111411652050141020732 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "edgeobject.hpp" #include "nodeobject.hpp" extern "C" { static void edge_dealloc(PyObject* self); static PyObject* edge_traverse(PyObject* self, PyObject* pyobject); static PyObject* edge___call__(PyObject* self, PyObject* args, PyObject* kwds); static PyObject* edge___repr__(PyObject* self); static PyObject* edge_get_from_node(PyObject* self); static PyObject* edge_get_to_node(PyObject* self); static PyObject* edge_get_cost(PyObject* self); static int edge_set_cost(PyObject* self, PyObject* object); static PyObject* edge_get_label(PyObject* self); static int edge_set_label(PyObject* self, PyObject* object); } // ----------------------------------------------------------------------------- /* Python Type Definition */ // ----------------------------------------------------------------------------- static PyTypeObject EdgeType = { PyObject_HEAD_INIT(NULL) 0, }; // ----------------------------------------------------------------------------- PyMethodDef edge_methods[] = { { CHAR_PTR_CAST "traverse", edge_traverse, METH_O, CHAR_PTR_CAST "**traverse** (*node*)\n\n" "Get the other node in an edge"}, {NULL} }; // ----------------------------------------------------------------------------- PyGetSetDef edge_getset[] = { { CHAR_PTR_CAST "from_node", (getter)edge_get_from_node, 0, CHAR_PTR_CAST "node this edge starts from (get)", 0}, { CHAR_PTR_CAST "to_node", (getter)edge_get_to_node, 0, CHAR_PTR_CAST "node this edge points to (get)", 0}, { CHAR_PTR_CAST "cost", (getter)edge_get_cost, (setter)edge_set_cost, CHAR_PTR_CAST "cost assigned to this edge (get/set)", 0}, { CHAR_PTR_CAST "label", (getter)edge_get_label, (setter)edge_set_label, CHAR_PTR_CAST "label assigned to this edge (get/set)", 0}, { NULL } }; // ----------------------------------------------------------------------------- void init_EdgeType() { EdgeType.ob_type = &PyType_Type; EdgeType.tp_name = CHAR_PTR_CAST "gamera.graph.Edge"; EdgeType.tp_basicsize = sizeof(EdgeObject); EdgeType.tp_dealloc = edge_dealloc; EdgeType.tp_repr = edge___repr__; EdgeType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; EdgeType.tp_getattro = PyObject_GenericGetAttr; EdgeType.tp_alloc = NULL; // PyType_GenericAlloc; EdgeType.tp_free = NULL; // _PyObject_Del; EdgeType.tp_call = edge___call__; EdgeType.tp_methods = edge_methods; EdgeType.tp_getset = edge_getset; EdgeType.tp_weaklistoffset = 0; PyType_Ready(&EdgeType); } // ----------------------------------------------------------------------------- /* Wrapper Methods */ // ----------------------------------------------------------------------------- /** edge_new creates a new Python EdgeObject. Note that this edge gets invalid * when it is removed from the graph. This could lead to undefined behaviour. * A possibly future solution could be tracking every EdgeObject and throwing * exceptions if they are invalidated. * */ PyObject* edge_new(Edge* edge) { EdgeObject* so; so = (EdgeObject*)EdgeType.tp_alloc(&EdgeType, 0); so->_edge = edge; so->_graph = NULL; return (PyObject*)so; } // ----------------------------------------------------------------------------- PyObject* edge_deliver(Edge* edge, GraphObject* graph) { #ifdef __DEBUG_GAPI__ std::cerr << "edge: " << edge << "\nGraphObject: " << graph << std::endl; std::cerr << "edgenodes: " << edge->from_node->_value << edge->to_node->_value << std::endl; #endif if(graph == NULL || edge == NULL) return NULL; #ifdef __DEBUG_GAPI__ std::cerr << "size: " << graph->assigned_edgeobjects->size() << std::endl; #endif if(graph->assigned_edgeobjects->find(edge) == graph->assigned_edgeobjects->end()) { EdgeObject* so = (EdgeObject*)edge_new(edge); if(graph && is_GraphObject((PyObject*)graph)) { Py_INCREF(graph); so->_graph = graph; graph->assigned_edgeobjects->insert(std::make_pair(edge, so)); } return (PyObject*)so; } EdgeObject* so = (*graph->assigned_edgeobjects)[edge]; Py_INCREF(so); return (PyObject*)so; } // ----------------------------------------------------------------------------- bool is_EdgeObject(PyObject* self) { return PyObject_TypeCheck(self, &EdgeType); } // ----------------------------------------------------------------------------- static void edge_dealloc(PyObject* self) { INIT_SELF_EDGE(); if(so->_graph) { so->_graph->assigned_edgeobjects->erase(so->_edge); Py_DECREF(so->_graph); so->_graph = NULL; } self->ob_type->tp_free(self); } // ----------------------------------------------------------------------------- static PyObject* edge_traverse(PyObject* self, PyObject* pyobject) { INIT_SELF_EDGE(); Node* other_node = NULL; if(is_NodeObject(pyobject)) { other_node = so->_edge->traverse(((NodeObject*)pyobject)->_node->_value); } else { GraphDataPyObject a(pyobject); other_node = so->_edge->traverse(&a); } return node_new(other_node); } // ----------------------------------------------------------------------------- static PyObject* edge___call__(PyObject* self, PyObject* args, PyObject* kwds) { PyObject* data = NULL; if(PyArg_ParseTuple(args, CHAR_PTR_CAST "|O:Edge.__call__", &data) <= 0) return NULL; if (data == NULL) return edge_get_cost(self); edge_set_cost(self, data); RETURN_VOID(); } // ----------------------------------------------------------------------------- static PyObject* edge___repr__(PyObject* self) { INIT_SELF_EDGE(); PyObject* from_data = dynamic_cast(so->_edge->from_node->_value)->data; PyObject* to_data = dynamic_cast(so->_edge->to_node->_value)->data; PyObject* weight = PyFloat_FromDouble(so->_edge->weight); Py_INCREF(from_data); Py_INCREF(to_data); Py_INCREF(weight); char* a = PyString_AsString(PyObject_Repr(from_data)); char* b = PyString_AsString(PyObject_Repr(to_data)); char* c = PyString_AsString(PyObject_Repr(weight)); PyObject* ret = PyString_FromFormat("", a,b,c); return ret; } // ----------------------------------------------------------------------------- static PyObject* edge_get_from_node(PyObject* self) { INIT_SELF_EDGE(); return node_deliver(so->_edge->from_node, so->_graph); } // ----------------------------------------------------------------------------- static PyObject* edge_get_to_node(PyObject* self) { INIT_SELF_EDGE(); return node_deliver(so->_edge->to_node, so->_graph); } // ----------------------------------------------------------------------------- static PyObject* edge_get_cost(PyObject* self) { INIT_SELF_EDGE(); RETURN_DOUBLE(so->_edge->weight); } // ----------------------------------------------------------------------------- static int edge_set_cost(PyObject* self, PyObject* object) { if(!PyFloat_Check(object)) { PyErr_SetString(PyExc_TypeError, "edge: expected a float"); return -1; } INIT_SELF_EDGE(); so->_edge->weight = PyFloat_AsDouble(object); return 0; } // ----------------------------------------------------------------------------- static PyObject* edge_get_label(PyObject* self) { INIT_SELF_EDGE(); if(so->_edge->label) { Py_INCREF((PyObject*)so->_edge->label); return (PyObject*)so->_edge->label; } else { RETURN_VOID(); } } // ----------------------------------------------------------------------------- static int edge_set_label(PyObject* self, PyObject* object) { INIT_SELF_EDGE(); if(so->_edge->label) { Py_DECREF((PyObject*)so->_edge->label); } so->_edge->label = (void*)object; Py_INCREF(object); return 0; } gamera-3.3.3/src/graph/graphmodule/edgeobject.hpp0000644000076500000000000000242111652050141020737 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _EDGEOBJECT_HPP_EBAA99C250B47F #define _EDGEOBJECT_HPP_EBAA99C250B47F #include "wrapper.hpp" #include "edge.hpp" #include "graphobject.hpp" /// EdgeObject wraps a Graph's EdgeObject in a Python Object struct EdgeObject { PyObject_HEAD Edge* _edge; ///< pointer to Graph's EdgeObject GraphObject* _graph; }; void init_EdgeType(); PyObject* edge_new(Edge* edge); bool is_EdgeObject(PyObject* self); PyObject* edge_deliver(Edge* edge, GraphObject* graph); #endif /* _EDGEOBJECT_HPP_EBAA99C250B47F */ gamera-3.3.3/src/graph/graphmodule/graphmodule.cpp0000644000076500000000000000607511652050141021157 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "nodeobject.hpp" #include "graphobject.hpp" #include "edgeobject.hpp" extern "C" { DL_EXPORT(void) initgraph(void); } // Factory wrapper for creating graph easier template static PyObject* Factory(PyObject* self, PyObject* args) { PyObject *a = NULL; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "|O", &a) <= 0) return 0; if (a == NULL) return (PyObject*)graph_new(F); if (is_GraphObject(a)) return (PyObject*)graph_copy((GraphObject*)a, F); PyErr_SetString(PyExc_TypeError, "Invalid argument type (must be Graph)"); return 0; } // defines some convenience wrappers for creating graphs easier. PyMethodDef graph_module_methods[] = { { CHAR_PTR_CAST "Tree", Factory, METH_VARARGS, CHAR_PTR_CAST "Create a new Tree" }, { CHAR_PTR_CAST "FreeGraph", Factory, METH_VARARGS, CHAR_PTR_CAST "Create a new freeform Graph" }, { CHAR_PTR_CAST "Free", Factory, METH_VARARGS, CHAR_PTR_CAST "Create a new freeform Graph" }, { CHAR_PTR_CAST "DAG", Factory, METH_VARARGS, CHAR_PTR_CAST "Create a new directed acyclic graph" }, { CHAR_PTR_CAST "Undirected", Factory, METH_VARARGS, CHAR_PTR_CAST "Create a new undirected (cyclic) graph" }, {NULL} }; DL_EXPORT(void) initgraph(void) { PyObject* m = Py_InitModule(CHAR_PTR_CAST "gamera.graph", graph_module_methods); PyObject* d = PyModule_GetDict(m); init_NodeType(); init_EdgeType(); init_GraphType(d); PyDict_SetItemString(d, "DEFAULT", PyInt_FromLong(FLAG_DEFAULT)); PyDict_SetItemString(d, "DIRECTED", PyInt_FromLong(FLAG_DIRECTED)); PyDict_SetItemString(d, "CYCLIC", PyInt_FromLong(FLAG_CYCLIC)); PyDict_SetItemString(d, "BLOB", PyInt_FromLong(FLAG_BLOB)); PyDict_SetItemString(d, "MULTI_CONNECTED", PyInt_FromLong(FLAG_MULTI_CONNECTED)); PyDict_SetItemString(d, "SELF_CONNECTED", PyInt_FromLong(FLAG_SELF_CONNECTED)); PyDict_SetItemString(d, "UNDIRECTED", PyInt_FromLong(FLAG_UNDIRECTED)); PyDict_SetItemString(d, "TREE", PyInt_FromLong(FLAG_TREE)); PyDict_SetItemString(d, "FREE", PyInt_FromLong(FLAG_FREE)); PyDict_SetItemString(d, "FLAG_DAG", PyInt_FromLong(FLAG_DAG)); PyDict_SetItemString(d, "CHECK_ON_INSERT", PyInt_FromLong(FLAG_CHECK_ON_INSERT)); } gamera-3.3.3/src/graph/graphmodule/graphobject.cpp0000644000076500000000000011675411712302464021153 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph.hpp" #include "graphobject.hpp" #include "edgeobject.hpp" #include "nodeobject.hpp" #include "graphobject_algorithm.hpp" #include "iteratorobject.hpp" extern "C" { static PyObject* graph_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void graph_dealloc(PyObject* self); static PyObject* graph_copy(PyObject* self, PyObject* args); static PyObject* graph_add_node(PyObject* self, PyObject* pyobject); static PyObject* graph_add_nodes(PyObject* self, PyObject* pyobject); static PyObject* graph_remove_node_and_edges(PyObject* self, PyObject* pyobject); static PyObject* graph_remove_node(PyObject* self, PyObject* pyobject); static PyObject* graph_add_edge(PyObject* self, PyObject* args); static PyObject* graph_add_edges(PyObject* self, PyObject* args); static PyObject* graph_remove_edge(PyObject* self, PyObject* args); static PyObject* graph_remove_all_edges(PyObject* self, PyObject* args); static PyObject* graph_is_directed(PyObject* self, PyObject* _); static PyObject* graph_is_undirected(PyObject* self, PyObject* _); static PyObject* graph_make_directed(PyObject* self, PyObject* _); static PyObject* graph_make_undirected(PyObject* self, PyObject* _); static PyObject* graph_is_cyclic(PyObject* self, PyObject* _); static PyObject* graph_is_acyclic(PyObject* self, PyObject* _); static PyObject* graph_make_cyclic(PyObject* self, PyObject* _); static PyObject* graph_make_acyclic(PyObject* self, PyObject* _); static PyObject* graph_is_tree(PyObject* self, PyObject* _); static PyObject* graph_is_blob(PyObject* self, PyObject* _); static PyObject* graph_make_blob(PyObject* self, PyObject* _); static PyObject* graph_make_tree(PyObject* self, PyObject* _); static PyObject* graph_is_multi_connected(PyObject* self, PyObject* _); static PyObject* graph_is_singly_connected(PyObject* self, PyObject* _); static PyObject* graph_make_multi_connected(PyObject* self, PyObject* _); static PyObject* graph_make_singly_connected(PyObject* self, PyObject* _); static PyObject* graph_is_self_connected(PyObject* self, PyObject* _); static PyObject* graph_make_self_connected(PyObject* self, PyObject* _); static PyObject* graph_make_not_self_connected(PyObject* self, PyObject* _); static PyObject* graph_get_node(PyObject* self, PyObject* args); static PyObject* graph_get_nodes(PyObject* self, PyObject* _); static PyObject* graph_has_node(PyObject* self, PyObject* node); static PyObject* graph_get_nnodes(PyObject* self, PyObject* _); static PyObject* graph_get_edges(PyObject* self, PyObject* _); static PyObject* graph_has_edge(PyObject* self, PyObject* args); static PyObject* graph_get_nedges(PyObject* self, PyObject* _); static PyObject* graph_get_subgraph_roots(PyObject* self, PyObject* args); static PyObject* graph_get_nsubgraphs(PyObject* self, PyObject* _); static PyObject* graph_size_of_subgraph(PyObject* self, PyObject* pyobject); static PyObject* graph_is_fully_connected(PyObject* self, PyObject* _); static PyObject* graph_has_flag(PyObject* self, PyObject* pyobject); static PyObject* graph_has_path(PyObject* self, PyObject* args); } // ----------------------------------------------------------------------------- // Python Type Definition // ----------------------------------------------------------------------------- static PyTypeObject GraphType = { PyObject_HEAD_INIT(NULL) 0, }; // ----------------------------------------------------------------------------- PyMethodDef graph_methods[] = { { CHAR_PTR_CAST "copy", graph_copy, METH_VARARGS, CHAR_PTR_CAST "**copy** (*flags* = ``FREE``)\n\n" \ "Copies a graph (optionally specifying new flags for the new graph).\n\n" \ "In some cases, copying the graph to a new graph type may be faster\n" \ "than using one of the in-place conversion functions.\n\n" \ "See `Graph constructor`_ for a definition of *flags*.\n\n" }, { CHAR_PTR_CAST "add_node", graph_add_node, METH_O, CHAR_PTR_CAST "**add_node** (*value*)\n\n" \ "Add a node identified by the given *value*. " \ "The newly-created node has no edges.\n\n" \ "Returns ``1`` if a new node was created.\n" \ "Returns ``0`` if a node already exists with the associated *value*.\n\n" \ "**Complexity**: Nodes are added in logarithmic time.\n\n" }, { CHAR_PTR_CAST "add_nodes", graph_add_nodes, METH_O, CHAR_PTR_CAST "**add_nodes** (*list_of_values*)\n\n" \ "Add nodes identified by each value in a list. " \ "The newly-created nodes have no edges.\n\n" \ "Returns the number of new nodes that were created.\n\n" \ "**Complexity**: `add_nodes` is moderately faster than multiple calls to " \ "add_node_. Nodes are added in logarithmic time\n\n" }, { CHAR_PTR_CAST "remove_node_and_edges", graph_remove_node_and_edges, METH_O, CHAR_PTR_CAST "**remove_node_and_edges** (*value*)\n\n" \ "Remove the node identifed by *value* from the graph, and remove all " \ "edges pointing inward or outward from that node.\n\n" \ "For instance, given the graph::\n\n" \ " a -> b -> c\n\n" \ "``.remove_node_and_edges('b')`` will result in::\n\n" \ " a c\n\n" \ "**Complexity**: Removing a node takes *O* (*n* + *e*) where *n* is the " \ "number of nodes in the graph and *e* is the number of edges attached to " \ "the given node.\n\n" }, { CHAR_PTR_CAST "remove_node", graph_remove_node, METH_O, CHAR_PTR_CAST "**remove_node** (*value*)\n\n" \ "Remove a node identified by *value* from the graph, stitching together " \ "the broken edges.\n\n" \ "For instance, given the graph::\n\n" \ " a -> b -> c\n\n" \ "``.remove_node('b')`` will result in::\n\n" \ " a -> c\n\n" \ "**Complexity**: Removing a node takes *O* (*n* + *e*) where *n* is the " \ "number of nodes in the graph and *e* is the number of edges attached to the given node.\n\n" }, { CHAR_PTR_CAST "add_edge", graph_add_edge, METH_VARARGS, CHAR_PTR_CAST "**add_edge** (*from_value*, *to_value*, *cost* = 1.0, *label* = None)\n\n" \ "Add an edge between the two nodes identified by *from_value* and *to_value*.\n\n" \ "The return value is the number of edges created. If the graph has set " \ "the flag ``CHECK_ON_INSERT`` and the edge violates any of the " \ "restrictions specified the edge by the flags to the graph's constructor " \ "will not be created. If the graph is ``DIRECTED``, the edge goes from " \ "*from_value* to *to_value*. If a node representing one of the values is " \ "not present, a node wille be implicitly created. \n\n" \ "Optionally, a *cost* and *label* can be associated with the edge. These " \ "values are used by some higher-level graph algorithms such as " \ "create_minimum_spanning_tree_ or shortest_path_.\n\n" \ "**Complexity**: Edges are added in *O* ( ln *n* ) because of getting " \ "the nodes which are associated to *from_value* or *to_value*.\n\n" }, { "add_edges", graph_add_edges, METH_O, "**add_edges** (*list_of_tuples*)\n\n" \ "Add edges specified by a list of tuples of the form:\n\n" \ " (*from_value*, *to_value*, [*cost*[, *label*]]).\n\n" \ "The members of this tuple correspond to the arguments to add_edge_.\n\n" \ "The return value is the number of edges created. For more information " \ "on adding edges see add_edge_ If an edge violates any of the " \ "restrictions specified\n\n" \ "**Complexity:** ``add_edges`` is moderately faster than multiple calls " \ "to add_edge_.\n\n" \ }, { CHAR_PTR_CAST "remove_edge", graph_remove_edge, METH_VARARGS, CHAR_PTR_CAST "**remove_edge** (*from_value*, *to_value*)\n\n" \ "Remove an edge between two nodes identified by *from_value* and *to_value*.\n\n" \ "If the edge does not exist in the graph, a ``RuntimeError`` exception is raised.\n\n" \ "When the graph is ``DIRECTED``, only the edge going from *from_value* to *to_value* is removed.\n\n" \ "If the graph is ``MULTI_CONNECTED``, **all** edges from *from_value* to *to_value* are removed.\n\n" \ "**Complexity**: Edges can be removed in *O*(*e*) time where *e* is the number of edges in the graph.\n\n" }, { CHAR_PTR_CAST "remove_all_edges", graph_remove_all_edges, METH_NOARGS, CHAR_PTR_CAST "**remove_all_edges** ()\n\n" \ "Remove all the edges in the graph, leaving all nodes as islands.\n\n" \ "**Complexity**: ``remove_all_edges`` takes *O* ( *n* + *e*) time where *n* is the number of nodes in the graph and *e* is the number of edges in the graph." }, { CHAR_PTR_CAST "is_directed", graph_is_directed, METH_NOARGS, CHAR_PTR_CAST "**is_directed** ()\n\n" \ "Return ``True`` if the graph is defined as directed." }, { CHAR_PTR_CAST "is_undirected", graph_is_undirected, METH_NOARGS, CHAR_PTR_CAST "**is_undirected** ()\n\n" \ "Return ``True`` if the graph is defined as undirected." }, { CHAR_PTR_CAST "make_directed", graph_make_directed, METH_NOARGS, CHAR_PTR_CAST "**make_directed** ()\n\n" \ "If the graph is undirected, converts it into an directed graph by adding a complementary edge for\n" \ "each existing edge.\n" \ "**Complexity**: The graph can be converted in *O* ( *e* ) time.\n\n" }, { CHAR_PTR_CAST "make_undirected", graph_make_undirected, METH_NOARGS, CHAR_PTR_CAST "**make_undirected** ()\n\n" \ "If the graph is directed, converts it into an undirected graph. Each edge in the existing graph\n" \ "will become a non-directional edge in the resulting graph." }, { CHAR_PTR_CAST "is_cyclic", graph_is_cyclic, METH_NOARGS, CHAR_PTR_CAST "**is_cyclic** ()\n\n" \ "Returns ``True`` if the graph has any cycles. Note that this is independent \n"\ "from the flag ``CYCLIC``.\n\n" }, { CHAR_PTR_CAST "is_acyclic", graph_is_acyclic, METH_NOARGS, CHAR_PTR_CAST "**is_acyclic** ()\n\n" \ "Returns ``True`` if the graph does not have any cycles." }, { CHAR_PTR_CAST "make_cyclic", graph_make_cyclic, METH_NOARGS, CHAR_PTR_CAST "**make_cyclic** ()\n\n" \ "Allow the graph to include cycles from this point on. This does nothing except set the ``CYCLIC`` flag." }, { CHAR_PTR_CAST "make_acyclic", graph_make_acyclic, METH_NOARGS, CHAR_PTR_CAST "**make_acyclic** ()\n\n" \ "Remove any cycles (using a depth-first search technique) and disallow cycles from this point on.\n\n" \ "This may not be the most appropriate cycle-removing technique for all applications.\n\n" \ "See create_spanning_tree_ for other ways to do this.\n\n" }, { CHAR_PTR_CAST "is_tree", graph_is_tree, METH_NOARGS, CHAR_PTR_CAST "**is_tree** ()\n\n" \ "Returns ``True`` if the graph conforms to the restrictions of a tree." }, { CHAR_PTR_CAST "is_blob", graph_is_blob, METH_NOARGS, CHAR_PTR_CAST "**is_blob** ()\n\n" \ "Returns ``True`` if the graph does not conform to the restricitions of a tree." }, { CHAR_PTR_CAST "make_tree", graph_make_tree, METH_NOARGS, CHAR_PTR_CAST "**make_tree** ()\n\n" \ "Turns the graph into a tree by calling make_acyclic_ followed by make_undirected_. Sets the ``BLOB`` flag to ``False``.\n\n" \ "This approach may not be reasonable for all applications. For other ways to convert blobs to trees, see `spanning trees`_.\n\n" }, { CHAR_PTR_CAST "make_blob", graph_make_blob, METH_NOARGS, CHAR_PTR_CAST "**make_blob** ()\n\n" \ "Make the graph into a blob (the opposite of a tree). This does nothing \n" "except set the ``BLOB`` flag.\n" }, { CHAR_PTR_CAST "is_multi_connected", graph_is_multi_connected, METH_NOARGS, CHAR_PTR_CAST "**is_multi_connected** ()\n\n" \ "Returns ``True`` if the graph is multi-connected (multiple edges between a single pair of nodes)." }, { CHAR_PTR_CAST "is_singly_connected", graph_is_singly_connected, METH_NOARGS, CHAR_PTR_CAST "**is_singly_connected** ()\n\n" \ "Returns ``True`` if the graph does not have multiple edges between a single pair of nodes." }, { CHAR_PTR_CAST "make_multi_connected", graph_make_multi_connected, METH_NOARGS, CHAR_PTR_CAST "**make_multi_connected** ()\n\n" \ "Allow the graph to be multi-connected from this point on. This does \n" "nothing except set the ``MULTI_CONNECTED`` flag." }, { CHAR_PTR_CAST "make_singly_connected", graph_make_singly_connected, METH_NOARGS, CHAR_PTR_CAST "**make_singly_connected** ()\n\n" \ "For each pair of nodes, leave only one remaining edge in either direction.\n" \ "Restrict the graph to being singly-connected from this point on." }, { CHAR_PTR_CAST "is_self_connected", graph_is_self_connected, METH_NOARGS, CHAR_PTR_CAST "**is_self_connected** ()\n\n" \ "Returns ``True`` if the graph is self-connected. When ``True`` the graph\n" "has edges pointfrom from one node to that same node.\n" }, { CHAR_PTR_CAST "make_self_connected", graph_make_self_connected, METH_NOARGS, CHAR_PTR_CAST "**make_self_connected** ()\n\n" \ "Allow the graph to be self-conncted from this point on. This does nothing except set the ``SELF_CONNECTED`` flag.\n" }, { CHAR_PTR_CAST "make_not_self_connected", graph_make_not_self_connected, METH_NOARGS, CHAR_PTR_CAST "**make_not_self_connected** ()\n\n" \ "Remove all self-connections and restrict the graph to have no self-connections from this point on." }, { CHAR_PTR_CAST "get_node", graph_get_node, METH_O, CHAR_PTR_CAST "**get_node** (*value*)\n\n" \ "Returns the ``Node`` object identified by the given *value*.\n\n" "Raises a ``ValueError`` exception if there is no node associated with the given *value*.\n\n" "**Complexity**: Searching for a node takes *O* ( ln *n* ) time where \n"\ "*n* is the number of nodes in the graph.\n\n" }, { CHAR_PTR_CAST "get_nodes", graph_get_nodes, METH_NOARGS, CHAR_PTR_CAST "**get_nodes** ()\n\n" \ "Returns a lazy iterator over all nodes in the graph. The ordering of the nodes is undefined.\n" \ }, { CHAR_PTR_CAST "get_subgraph_roots", graph_get_subgraph_roots, METH_NOARGS, CHAR_PTR_CAST "**get_subgraph_roots** ()\n\n" \ "Returns a lazy iterator over each of the subgraph roots. Performing a breadth-first or depth-first search\n" \ "from each of this notes will visit every node in the graph. Currently this algorithm is proofed for undirected graphs only but should also work for directed graphs.\n\n" }, { CHAR_PTR_CAST "has_node", graph_has_node, METH_O, CHAR_PTR_CAST "**has_node** (*value*)\n\n" \ "Returns ``True`` if graph has a node identified by *value*.\n\n"\ "**Comlexity**: Searching for an node takes *O* ( ln *n* ) time where \n"\ "*n* is the number of nodes in the graph.\n\n" }, { CHAR_PTR_CAST "get_edges", graph_get_edges, METH_NOARGS, CHAR_PTR_CAST "**get_edges** ()\n\n" \ "Returns an iterator over all edges in the graph. The ordering of the edges is undefined.\n\n" }, { CHAR_PTR_CAST "has_edge", graph_has_edge, METH_VARARGS, CHAR_PTR_CAST "**has_edge** (*from_value*, *to_value*)\n\n" \ " *or*\n\n**has_edge** (*from_node*, *to_node*)\n\n" \ " *or*\n\n**has_edge** (*edge*)\n\n" \ "Returns ``True`` if graph contains the given edge. The edge can be \n"\ "specified as either a pair of values identifying nodes,\n" \ "a pair of ``Node`` objects, or a single ``Edge`` object.\n\n" \ "**Complexity**: Searching for an edge takes *O* ( *e* + ln *n* ) time \n"\ "where *e* is the number of edges in the graph and *n* is the number of \n"\ "nodes in the graph." }, { CHAR_PTR_CAST "size_of_subgraph", graph_size_of_subgraph, METH_O, CHAR_PTR_CAST "**size_of_subgraph** (*value*)\n\n *or*\n\n**size_of_subgraph** (*node*)\n\n" \ "Returns the size of the subgraph rooted at the given node. In other words, this returns the\n" \ "number of nodes reachable from the given node." }, { CHAR_PTR_CAST "is_fully_connected", graph_is_fully_connected, METH_NOARGS, CHAR_PTR_CAST "**is_fully_connected** ()\n\n" \ "Returns ``True`` if there is only one subgraph in the graph. In other words it returns \n" \ "``True`` if the number of nodes reachable from the first inserted node is equal to the \n" \ "overall number of nodes. Currently this algorithm is only defined for undirected graphs." }, { CHAR_PTR_CAST "has_flag", graph_has_flag, METH_O, CHAR_PTR_CAST "**has_flag** (*flag*)\n\n" \ "Returns ``True`` when the given flag is set in the graph. *flag* can be a single flag or \n" "or-combination of flags which are documented in `Graph constructor`_ ." }, { CHAR_PTR_CAST "has_path", graph_has_path, METH_VARARGS, CHAR_PTR_CAST "**has_path** (*from_node*, *to_node*)\n\n" \ "Returns ``True`` when *to_node* is reachable starting at *start_node*.\n" "*start_node* and *to_node* can be a Node object or a node's value.\n\n" }, ALGORITHM_METHODS { NULL } }; // ----------------------------------------------------------------------------- PyGetSetDef graph_getset[] = { { CHAR_PTR_CAST "nnodes", (getter)graph_get_nnodes, 0, CHAR_PTR_CAST "Number of nodes in the graph", 0 }, { CHAR_PTR_CAST "nedges", (getter)graph_get_nedges, 0, CHAR_PTR_CAST "Number of edges in the graph", 0 }, { CHAR_PTR_CAST "nsubgraphs", (getter)graph_get_nsubgraphs, 0, CHAR_PTR_CAST "Number of edges in the graph", 0 }, { NULL } }; // ----------------------------------------------------------------------------- void init_GraphType(PyObject* d) { GraphType.ob_type = &PyType_Type; GraphType.tp_name = CHAR_PTR_CAST "gamera.graph.Graph"; GraphType.tp_basicsize = sizeof(GraphObject); GraphType.tp_dealloc = graph_dealloc; GraphType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; GraphType.tp_new = graph_new; GraphType.tp_getattro = PyObject_GenericGetAttr; GraphType.tp_alloc = NULL; // PyType_GenericAlloc; GraphType.tp_free = NULL; // _PyObject_Del; GraphType.tp_methods = graph_methods; GraphType.tp_getset = graph_getset; GraphType.tp_weaklistoffset = 0; GraphType.tp_doc = CHAR_PTR_CAST "**Graph** (*flags* = ``FREE``)\n\n" \ "Construct a new graph.\n\n" \ "The *flags* are used to set certain restrictions on the graph. When adding an edge\n" \ "violates one of these restrictions, the edge is not added and ``None`` is returned. Note\n" \ "that exceptions are not raised. The graph type may be changed at any time after creation\n" \ "using methods such as make_directed_ or make_undirected_, but conversion may take some time.\n\n" \ "The *flags* may be any combination of the following values (use bitwise-or to combine flags). The values\n" \ "of these flags are defined in the ``graph`` module. By default, all flags except of ``CHECK_ON_INSERT`` are ``True``:\n\n" \ " - ``DIRECTED``:\n\n" \ " When ``True``, the graph will have directed edges. Nodes will only\n" \ " traverse to other nodes in the direction of the edge.\n\n" \ " - ``CYCLIC``:\n\n" \ " When ``True``, the graph may contain cycles. When ``False``, edges are\n" \ " added to the graph only when they do not create cycles. (When ``False``, ``MULTI_CONNECTED``" \ " and ``SELF_CONNECTED`` are set to ``False``.)\n\n" \ " - ``BLOB``:\n\n" \ " A \"blob\" is defined as the opposite of a tree. (When ``False``, ``DIRECTED``\n" \ " and ``CYCLIC`` will be set to ``False``).\n\n" \ " - ``MULTI_CONNECTED``:\n\n" " When ``True``, the graph may contain multiple edges between a single\n" \ " pair of nodes.\n\n" \ " - ``SELF_CONNECTED``:\n\n" " When ``True``, the graph may contain edges that start and end at the\n" \ " same node.\n\n" \ " - ``CHECK_ON_INSERT``:\n\n" \ " When ``True``, an edge is only inserted when it conforms all restrictions. \n" \ " This is disabled by default because the checks slow down adding edges \n" \ " significantly.\n\n" \ "In addition to these raw flags, there are some convenience values for common combinations of these\n" \ "flags.\n\n" \ " - ``FREE``: Equivalent to all flags being set. There are no restrictions on the graph morphology.\n\n" \ " - ``TREE``: Tree structure (no flags set).\n\n" \ " - ``FLAG_DAG``: Directed, acyclic graph.\n\n" \ " - ``UNDIRECTED``: Undirected, cyclic graph.\n\n"; PyType_Ready(&GraphType); PyDict_SetItemString(d, "Graph", (PyObject*)&GraphType); } GraphObject* graph_new(flag_t flags) { GraphObject* so = (GraphObject*)(GraphType.tp_alloc(&GraphType, 0)); so->assigned_edgeobjects = new EdgeObjectMap; so->_graph = new Graph(flags); return so; } GraphObject* graph_new(Graph* g) { GraphObject* so = (GraphObject*)(GraphType.tp_alloc(&GraphType, 0)); so->_graph = g; so->assigned_edgeobjects = new EdgeObjectMap(); return so; } GraphObject* graph_copy(GraphObject* so, flag_t flags) { Graph* g = new Graph(so->_graph, flags); return graph_new(g); } // ----------------------------------------------------------------------------- PyObject* graph_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { unsigned long flags = FLAG_FREE; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "|k:Graph.__init__", &flags) <= 0) return NULL; return (PyObject*)graph_new(flags); } // ----------------------------------------------------------------------------- bool is_GraphObject(PyObject* self) { return PyObject_TypeCheck(self, &GraphType); } // ----------------------------------------------------------------------------- void graph_dealloc(PyObject* self) { if(is_GraphObject(self)) { INIT_SELF_GRAPH(); if(so->_graph) { //invalidate nodeeobjects NodePtrIterator* it = so->_graph->get_nodes(); Node *n; while((n = it->next()) != NULL) { if(n->_value == NULL) continue; GraphDataPyObject* d = dynamic_cast(n->_value); if(d == NULL) throw std::runtime_error("somehting went wrong in dealloc"); if(d->_node != NULL) { ((NodeObject*)d->_node)->_graph = NULL; ((NodeObject*)d->_node)->_node = NULL; d->_node = NULL; } delete d; } delete it; delete so->_graph; so->_graph = NULL; } #ifdef __DEBUG_GAPI__ std::cerr << "assigned edgeobjects" << so->assigned_edgeobjects->size() << std::endl; #endif delete so->assigned_edgeobjects; so->assigned_edgeobjects = NULL; self->ob_type->tp_free(self); } } // ----------------------------------------------------------------------------- PyObject* graph_copy(PyObject* self, PyObject* args) { INIT_SELF_GRAPH(); unsigned long flags = FLAG_FREE; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "|k:Graph.copy", &flags) <= 0) return NULL; return (PyObject*)graph_copy(so, flags); } // ----------------------------------------------------------------------------- /* Python wrapper methods */ // ----------------------------------------------------------------------------- PyObject* graph_add_node(PyObject* self, PyObject* pyobject) { INIT_SELF_GRAPH(); GraphDataPyObject* data = new GraphDataPyObject(pyobject); if(so->_graph->add_node(data)) { #ifdef __DEBUG_GAPI__ std::cerr << "Node added" << std::endl; #endif RETURN_INT(1); } #ifdef __DEBUG_GAPI__ std::cerr << "Node not added" << std::endl; #endif delete data; RETURN_INT(0); } // ----------------------------------------------------------------------------- PyObject* graph_add_nodes(PyObject* self, PyObject* pyobject) { PyObject* seq = PySequence_Fast(pyobject, "Argument must be an iterable of nodes"); if (seq == NULL) return 0; size_t list_size = PySequence_Fast_GET_SIZE(seq); size_t result = 0; for (size_t i = 0; i < list_size; ++i) if (graph_add_node(self, PySequence_Fast_GET_ITEM(seq, i))) result++; Py_DECREF(seq); RETURN_INT(result); } // ----------------------------------------------------------------------------- PyObject* graph_remove_node_and_edges(PyObject* self, PyObject* a) { INIT_SELF_GRAPH(); if(is_NodeObject(a)) { NodeObject* no = (NodeObject*)a; so->_graph->remove_node_and_edges(no->_node); no->_node = NULL; no->_graph = NULL; } else { GraphDataPyObject data(a); GraphDataPyObject* d = NULL; //invalidate delivered nodes Node* n = so->_graph->get_node(&data); if(n != NULL) { d = dynamic_cast(n->_value); NodeObject* no = (NodeObject*)d->_node; if(no != NULL) { no->_node = NULL; no->_graph = NULL; } } so->_graph->remove_node_and_edges(&data); delete d; } RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_remove_node(PyObject* self, PyObject* a) { INIT_SELF_GRAPH(); try { if(is_NodeObject(a)) { NodeObject* no = (NodeObject*)a; so->_graph->remove_node(no->_node); no->_node = NULL; no->_graph = NULL; } else { GraphDataPyObject data(a); GraphDataPyObject* d = NULL; //invalidate delivered nodes Node* n = so->_graph->get_node(&data); if(n == NULL) throw std::runtime_error("node not found"); d = dynamic_cast(n->_value); NodeObject* no = (NodeObject*)d->_node; if(no != NULL) { no->_node = NULL; no->_graph = NULL; } so->_graph->remove_node(n); delete d; } } catch (std::runtime_error e) { PyErr_SetString(PyExc_ValueError, e.what()); return NULL; } RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_add_edge(PyObject* self, PyObject* args) { INIT_SELF_GRAPH(); int res = 0; PyObject* from_pyobject, *to_pyobject; cost_t cost = 1.0; PyObject* label = NULL; if(PyArg_ParseTuple(args, CHAR_PTR_CAST "OO|dO:add_edge", &from_pyobject, &to_pyobject, &cost, &label) <= 0 ) return NULL; if(is_NodeObject(from_pyobject) && is_NodeObject(to_pyobject)) { Node* from_node = ((NodeObject*)from_pyobject)->_node; Node* to_node = ((NodeObject*)to_pyobject)->_node; res = (so->_graph->add_edge(from_node, to_node, cost, so->_graph->is_directed(), label)); } else { GraphDataPyObject *from = new GraphDataPyObject(from_pyobject); GraphDataPyObject *to = new GraphDataPyObject(to_pyobject); bool del_from = true, del_to = true; if(!so->_graph->has_node(from)) { del_from = false; so->_graph->add_node(from); } if(!so->_graph->has_node(to)) { so->_graph->add_node(to); del_to = false; } #ifdef __DEBUG_GAPI__ std::cerr << from << to << std::endl; #endif if(label != NULL) Py_INCREF(label); res = so->_graph->add_edge(from, to, cost, so->_graph->is_directed(), label); if(del_from) delete from; if(del_to) delete to; } RETURN_INT(res); } // ----------------------------------------------------------------------------- PyObject* graph_add_edges(PyObject* self, PyObject* args) { PyObject* seq = PySequence_Fast(args, "Argument must be an iterable of edges"); if (seq == NULL) return 0; size_t list_size = PySequence_Fast_GET_SIZE(seq); size_t result = 0; for (size_t i = 0; i < list_size; ++i) result += PyInt_AsUnsignedLongMask(graph_add_edge(self, PySequence_Fast_GET_ITEM(seq, i))); Py_DECREF(seq); RETURN_INT(result); } // ----------------------------------------------------------------------------- PyObject* graph_remove_edge(PyObject* self, PyObject* args) { INIT_SELF_GRAPH(); PyObject* from_pyobject, *to_pyobject = NULL; if(PyArg_ParseTuple(args, CHAR_PTR_CAST "O|O:remove_edge", &from_pyobject, &to_pyobject) <= 0) return NULL; try { if(to_pyobject == NULL && is_EdgeObject(from_pyobject)) { so->_graph->remove_edge(((EdgeObject*)from_pyobject)->_edge); } else if(is_NodeObject(from_pyobject) && is_NodeObject(to_pyobject)) { Node* from_node = ((NodeObject*)from_pyobject)->_node; Node* to_node = ((NodeObject*)to_pyobject)->_node; so->_graph->remove_edge(from_node->_value, to_node->_value); } else if(from_pyobject != NULL && to_pyobject != NULL) { GraphDataPyObject a(from_pyobject), b(to_pyobject); so->_graph->remove_edge(&a, &b); } } catch(std::runtime_error e) { PyErr_SetString(PyExc_RuntimeError, e.what()); return NULL; } RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_remove_all_edges(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); //TODO: invalidate delivered EdgeObjects so->_graph->remove_all_edges(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_is_directed(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_directed()); } // ----------------------------------------------------------------------------- PyObject* graph_is_undirected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_undirected()); } // ----------------------------------------------------------------------------- PyObject* graph_make_directed(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); //TODO: invalidate delivered EdgeObjects so->_graph->make_directed(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_make_undirected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); so->_graph->make_undirected(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_is_cyclic(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_cyclic()); } // ----------------------------------------------------------------------------- PyObject* graph_is_acyclic(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_acyclic()); } // ----------------------------------------------------------------------------- PyObject* graph_make_cyclic(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); so->_graph->make_cyclic(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_make_acyclic(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); //TODO: invalidate EdgeObjects so->_graph->make_acyclic(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_is_tree(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_tree()); } // ----------------------------------------------------------------------------- PyObject* graph_is_blob(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_blob()); } // ----------------------------------------------------------------------------- PyObject* graph_make_tree(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); //TODO: invalidate EdgeObjects so->_graph->make_tree(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_make_blob(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); so->_graph->make_blob(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_is_multi_connected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_multi_connected()); } // ----------------------------------------------------------------------------- PyObject* graph_is_singly_connected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_singly_connected()); } // ----------------------------------------------------------------------------- PyObject* graph_make_multi_connected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); so->_graph->make_multi_connected(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_make_singly_connected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); //TODO: invalidate EdgeObjects so->_graph->make_singly_connected(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_is_self_connected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_self_connected()); } // ----------------------------------------------------------------------------- PyObject* graph_make_self_connected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); so->_graph->make_self_connected(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_make_not_self_connected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); //TODO: invalidate EdgeObjects so->_graph->make_not_self_connected(); RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_get_nodes(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); NodePtrIterator* it = so->_graph->get_nodes(); NTIteratorObject* nti = iterator_new >(); nti->init(it, so); return (PyObject*)nti; } // ----------------------------------------------------------------------------- PyObject* graph_get_node(PyObject* self, PyObject* pyobject) { INIT_SELF_GRAPH(); GraphDataPyObject value(pyobject); Node *node = so->_graph->get_node(&value); if(node == NULL) { PyErr_SetString(PyExc_ValueError, "There is no node associated with the given value"); return NULL; } PyObject* ret = node_deliver(node, so); // Py_DECREF(pyobject); return ret; } // ----------------------------------------------------------------------------- PyObject* graph_has_node(PyObject* self, PyObject* a) { INIT_SELF_GRAPH(); bool res; Py_INCREF(a); #ifdef __DEBUG_GAPI__ std::cout << "graph_has_node\n"; #endif if(is_NodeObject(a)) { res = so->_graph->has_node(((NodeObject*)a)->_node); } else { GraphDataPyObject obj(a); res = so->_graph->has_node(&obj); } Py_DECREF(a); RETURN_BOOL(res); } // ----------------------------------------------------------------------------- PyObject* graph_get_nnodes(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); if(so->_graph) RETURN_INT(so->_graph->get_nnodes()); PyErr_SetString(PyExc_RuntimeError, "internal error in graph"); return NULL; } // ----------------------------------------------------------------------------- PyObject* graph_get_edges(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); EdgePtrIterator* it = so->_graph->get_edges(); ETIteratorObject* nti = iterator_new >(); nti->init(it, so); return (PyObject*)nti; } // ----------------------------------------------------------------------------- PyObject* graph_has_edge(PyObject* self, PyObject* args) { INIT_SELF_GRAPH(); bool res = false; PyObject* from_pyobject, *to_pyobject = NULL; if(PyArg_ParseTuple(args, CHAR_PTR_CAST "O|O:has_edge", &from_pyobject, &to_pyobject) <= 0) return NULL; if(to_pyobject == NULL && is_EdgeObject(from_pyobject)) { res = so->_graph->has_edge(((EdgeObject*)from_pyobject)->_edge); } else if(is_NodeObject(from_pyobject) && is_NodeObject(to_pyobject)) { Node* from_node = ((NodeObject*)from_pyobject)->_node; Node* to_node = ((NodeObject*)to_pyobject)->_node; res = so->_graph->has_edge(from_node->_value, to_node->_value); } else if(from_pyobject != NULL && to_pyobject != NULL) { GraphDataPyObject from(from_pyobject), to(to_pyobject); res = so->_graph->has_edge(&from, &to); } RETURN_BOOL(res); } // ----------------------------------------------------------------------------- PyObject* graph_get_nedges(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_INT(so->_graph->get_nedges()); } // ----------------------------------------------------------------------------- PyObject* graph_get_subgraph_roots(PyObject* self, PyObject* args) { try { INIT_SELF_GRAPH(); NodeVector* roots = so->_graph->get_subgraph_roots(); NodeVectorPtrIterator* it = new NodeVectorPtrIterator(so->_graph, roots); NTIteratorObject* nti = iterator_new >(); nti->init(it, so); return (PyObject*)nti; } catch(std::runtime_error e) { PyErr_SetString(PyExc_TypeError, e.what()); return NULL; } } // ----------------------------------------------------------------------------- PyObject* graph_is_fully_connected(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_BOOL(so->_graph->is_fully_connected()); } // ----------------------------------------------------------------------------- PyObject* graph_get_nsubgraphs(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); RETURN_INT(so->_graph->get_nsubgraphs()); } // ----------------------------------------------------------------------------- PyObject* graph_size_of_subgraph(PyObject* self, PyObject* node) { INIT_SELF_GRAPH(); size_t size = 0; if(is_NodeObject(node)) size = so->_graph->size_of_subgraph(((NodeObject*)node)->_node); else { GraphDataPyObject a(node); size = so->_graph->size_of_subgraph(&a); } RETURN_INT(size); } static PyObject* graph_has_flag(PyObject* self, PyObject* pyobject) { INIT_SELF_GRAPH(); flag_t flag = (flag_t)PyInt_AsUnsignedLongMask(pyobject); RETURN_BOOL(so->_graph->has_flag(flag)); } // ----------------------------------------------------------------------------- static PyObject* graph_has_path(PyObject* self, PyObject* args) { INIT_SELF_GRAPH(); bool res = false; PyObject* from_pyobject, *to_pyobject = NULL; if(PyArg_ParseTuple(args, CHAR_PTR_CAST "OO:has_path", &from_pyobject, &to_pyobject) <= 0) return NULL; if(is_NodeObject(from_pyobject) && is_NodeObject(to_pyobject)) { Node* from_node = ((NodeObject*)from_pyobject)->_node; Node* to_node = ((NodeObject*)to_pyobject)->_node; res = so->_graph->has_path(from_node, to_node); } else if(from_pyobject != NULL && to_pyobject != NULL) { GraphDataPyObject from(from_pyobject), to(to_pyobject); res = so->_graph->has_path(&from,&to); } RETURN_BOOL(res); } gamera-3.3.3/src/graph/graphmodule/graphobject.hpp0000644000076500000000000000253711652050141021144 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _GRAPHOBJECT_HPP_55E85D4C458276 #define _GRAPHOBJECT_HPP_55E85D4C458276 #include "wrapper.hpp" #include "graph.hpp" typedef std::map EdgeObjectMap; // GraphObject contains a pointer to Graph; struct GraphObject { PyObject_HEAD Graph* _graph; EdgeObjectMap *assigned_edgeobjects; }; void init_GraphType(PyObject* dict); bool is_GraphObject(PyObject* self); GraphObject* graph_new(flag_t flags = FLAG_DEFAULT); GraphObject* graph_new(Graph* g); GraphObject* graph_copy(GraphObject* so, flag_t flags = FLAG_DEFAULT); #endif /* _GRAPHOBJECT_HPP_55E85D4C458276 */ gamera-3.3.3/src/graph/graphmodule/graphobject_algorithm.cpp0000644000076500000000000002452511652050141023206 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graphobject.hpp" #include "graphobject_algorithm.hpp" #include "iteratorobject.hpp" #include "bfsdfsiterator.hpp" #include "nodeobject.hpp" // ----------------------------------------------------------------------------- /// Helper for converting a ShortestPathMap into a Python Dictionary inline PyObject* pathmap_to_dict(ShortestPathMap *pathmap) { PyObject* pathdict = PyDict_New(); for(ShortestPathMap::iterator it = pathmap->begin(); it != pathmap->end(); it++) { Node* dest_node = it->first; DijkstraPath path = it->second; PyObject *pathtuple = PyTuple_New(2); PyObject *pathlist = PyList_New(0); PyTuple_SetItem(pathtuple, 0, PyFloat_FromDouble(path.cost)); PyTuple_SetItem(pathtuple, 1, pathlist); for(std::vector::iterator pit = path.path.begin(); pit != path.path.end(); pit++) { Node* n = *pit; PyList_Append(pathlist, dynamic_cast(n->_value)->data); } PyDict_SetItem(pathdict, dynamic_cast(dest_node->_value)->data, pathtuple); Py_DECREF(pathtuple); } return pathdict; } // ----------------------------------------------------------------------------- PyObject* graph_dijkstra_shortest_path(PyObject* self, PyObject* root) { INIT_SELF_GRAPH(); ShortestPathMap *pathmap; if(is_NodeObject(root)) pathmap = so->_graph->dijkstra_shortest_path(((NodeObject*)root)->_node); else { GraphDataPyObject a(root); pathmap = so->_graph->dijkstra_shortest_path(&a); } PyObject* pathdict = pathmap_to_dict(pathmap); delete pathmap; return pathdict; } // ----------------------------------------------------------------------------- PyObject* graph_dijkstra_all_pairs_shortest_path(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); std::map all_pairs = so->_graph->dijkstra_all_pairs_shortest_path(); PyObject *res = PyDict_New(); for(std::map::iterator it = all_pairs.begin(); it != all_pairs.end(); it++) { Node* source_node = it->first; ShortestPathMap* path = it->second; PyObject* pypath = pathmap_to_dict(path); PyObject* pysource = dynamic_cast(source_node->_value)->data; PyDict_SetItem(res, pysource, pypath); Py_DECREF(pypath); delete path; } return res; } // ----------------------------------------------------------------------------- PyObject* graph_all_pairs_shortest_path(PyObject* self, PyObject* _) { INIT_SELF_GRAPH(); std::map all_pairs = so->_graph->all_pairs_shortest_path(); PyObject *res = PyDict_New(); for(std::map::iterator it = all_pairs.begin(); it != all_pairs.end(); it++) { Node* source_node = it->first; ShortestPathMap* path = it->second; PyObject* pypath = pathmap_to_dict(path); PyObject* pysource = dynamic_cast(source_node->_value)->data; PyDict_SetItem(res, pysource, pypath); Py_DECREF(pypath); delete path; } return res; } // ----------------------------------------------------------------------------- PyObject* graph_create_spanning_tree(PyObject* self, PyObject* pyobject) { INIT_SELF_GRAPH(); Graph* g; if(is_NodeObject(pyobject)) g = so->_graph->create_spanning_tree(((NodeObject*)pyobject)->_node); else { GraphDataPyObject a(pyobject); g = so->_graph->create_spanning_tree(&a); } if(g == NULL) { PyErr_SetString(PyExc_TypeError, "Graph Type does not match"); return NULL; } return (PyObject*)graph_new(g); } // ----------------------------------------------------------------------------- // graph_create_minimum_spanning_tree_unique_distances // ----------------------------------------------------------------------------- /// Sorting class for graph_create_minimum_spanning_tree_unique_distances struct DistsSorter { DistsSorter(FloatImageView* image) { m_image = image; } bool operator()(const std::pair& a, const std::pair& b) { return m_image->get(Point(a.second, a.first)) < m_image->get(Point(b.second, b.first)); } FloatImageView* m_image; }; // ----------------------------------------------------------------------------- PyObject* graph_create_minimum_spanning_tree_unique_distances(GraphObject* so, PyObject* images, PyObject* uniq_dists) { PyObject* images_seq = PySequence_Fast(images, "images must be iteratable"); if (images_seq == NULL) return NULL; static PyTypeObject* imagebase = 0; if (imagebase == 0) { PyObject* mod = PyImport_ImportModule(CHAR_PTR_CAST "gamera.gameracore"); if (mod == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to load gameracore.\n"); Py_DECREF(images_seq); return 0; } PyObject* dict = PyModule_GetDict(mod); if (dict == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get module dictionary\n"); Py_DECREF(images_seq); return 0; } imagebase = (PyTypeObject*)PyDict_GetItemString(dict, "Image"); } // get the matrix if (!PyObject_TypeCheck(uniq_dists, imagebase) || get_pixel_type(uniq_dists) != Gamera::FLOAT) { PyErr_SetString(PyExc_TypeError, "uniq_dists must be a float image."); Py_DECREF(images_seq); return 0; } FloatImageView* dists = (FloatImageView*)((RectObject*)uniq_dists)->m_x; if (dists->nrows() != dists->ncols()) { PyErr_SetString(PyExc_TypeError, "image must be symmetric."); Py_DECREF(images_seq); return 0; } // get the graph ready so->_graph->remove_all_edges(); GRAPH_UNSET_FLAG(so->_graph, FLAG_CYCLIC); // make the list for sorting typedef std::vector > index_vec_type; index_vec_type indexes(((dists->nrows() * dists->nrows()) - dists->nrows()) / 2); size_t row, col, index = 0; for (row = 0; row < dists->nrows(); ++row) { for (col = row + 1; col < dists->nrows(); ++col) { indexes[index].first = row; indexes[index++].second = col; } } std::sort(indexes.begin(), indexes.end(), DistsSorter(dists)); // Add the nodes to the graph and build our map for later int images_len = PySequence_Fast_GET_SIZE(images_seq); std::vector nodes(images_len); int i; for (i = 0; i < images_len; ++i) { GraphDataPyObject* obj = new GraphDataPyObject(PySequence_Fast_GET_ITEM(images_seq, i)); nodes[i] = so->_graph->add_node_ptr(obj); assert(nodes[i] != NULL); } Py_DECREF(images_seq); // create the mst using kruskal i = 0; while (i < int(indexes.size()) && (int(so->_graph->get_nedges()) < (images_len - 1))) { size_t row = indexes[i].first; size_t col = indexes[i].second; cost_t weight = dists->get(Point(col, row)); so->_graph->add_edge(nodes[row], nodes[col], weight); ++i; } RETURN_VOID(); } // ----------------------------------------------------------------------------- PyObject* graph_create_minimum_spanning_tree(PyObject* self, PyObject* args) { INIT_SELF_GRAPH(); PyObject* images = NULL; PyObject* uniq_dists = NULL; if(PyArg_ParseTuple(args, CHAR_PTR_CAST "|OO:create_minimum_spanning_tree", &images, &uniq_dists) <= 0) return NULL; if (images == NULL || uniq_dists == NULL) { Graph* g = so->_graph->create_minimum_spanning_tree(); if(g == NULL) { PyErr_SetString(PyExc_TypeError, "Graph Type does not match"); return NULL; } return (PyObject*)graph_new(g); } else return graph_create_minimum_spanning_tree_unique_distances(so, images, uniq_dists); } // ----------------------------------------------------------------------------- PyObject* graph_BFS(PyObject* self, PyObject* root) { INIT_SELF_GRAPH(); BfsIterator* it = NULL; if(is_NodeObject(root)) it = so->_graph->BFS(((NodeObject*)root)->_node); else { GraphDataPyObject a(root); it = so->_graph->BFS(&a); } if(it == NULL) { PyErr_SetString(PyExc_KeyError, "starting-node not found"); return NULL; } NTIteratorObject* nti = iterator_new >(); nti->init(it, so); return (PyObject*)nti; } // ----------------------------------------------------------------------------- PyObject* graph_DFS(PyObject* self, PyObject* root) { INIT_SELF_GRAPH(); DfsIterator* it = NULL; if(is_NodeObject(root)) it = so->_graph->DFS(((NodeObject*)root)->_node); else { GraphDataPyObject a(root); it = so->_graph->DFS(&a); } if(it == NULL) { PyErr_SetString(PyExc_KeyError, "starting-node not found"); return NULL; } NTIteratorObject* nti = iterator_new >(); nti->init(it, so); return (PyObject*)nti; } PyObject* graph_get_color(PyObject* self, PyObject* pyobject) { INIT_SELF_GRAPH(); if(is_NodeObject(pyobject)) { RETURN_INT(so->_graph->get_color(((NodeObject*)pyobject)->_node)); } else { GraphDataPyObject a(pyobject); RETURN_INT(so->_graph->get_color(&a)); } } PyObject* graph_colorize(PyObject* self, PyObject* pyobject) { INIT_SELF_GRAPH(); unsigned int ncolors = PyInt_AsUnsignedLongMask(pyobject); try { so->_graph->colorize(ncolors); RETURN_VOID(); } catch (std::runtime_error e) { PyErr_SetString(PyExc_RuntimeError, e.what()); return NULL; } } gamera-3.3.3/src/graph/graphmodule/graphobject_algorithm.hpp0000644000076500000000000001546511652050141023216 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2011 Christoph Dalitz * 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _GRAPHOBJECT_ALGORITHM_HPP_80F4CF20EC34D5 #define _GRAPHOBJECT_ALGORITHM_HPP_80F4CF20EC34D5 #include "wrapper.hpp" #include "partitions.hpp" extern "C" { PyObject* graph_dijkstra_shortest_path(PyObject* self, PyObject* root); PyObject* graph_dijkstra_all_pairs_shortest_path(PyObject* self, PyObject* _); PyObject* graph_all_pairs_shortest_path(PyObject* self, PyObject* _); PyObject* graph_create_spanning_tree(PyObject* self, PyObject* pyobject); PyObject* graph_create_minimum_spanning_tree(PyObject* so, PyObject* args); PyObject* graph_BFS(PyObject* self, PyObject* args); PyObject* graph_DFS(PyObject* self, PyObject* args); PyObject* graph_get_color(PyObject* self, PyObject* pyobject); PyObject* graph_colorize(PyObject* self, PyObject* pyobject); } // ----------------------------------------------------------------------------- #define SHORTEST_PATH_METHODS \ { CHAR_PTR_CAST "dijkstra_shortest_path", graph_dijkstra_shortest_path, METH_O, \ CHAR_PTR_CAST "**dijkstra_shortest_path** (*value* or *node*)\n\n" \ "Calculates the shortest path from the given node to all other reachable " \ "nodes using Djikstra's algorithm.\n\n" \ "The return value is a dictionary of paths. The keys are destination node " \ "identifiers and the values are tuples of the form\n\n" \ " (*distance*, *nodes*)\n\n" \ "where distance is the distance traveled from the given node to the "\ "destination node and *nodes* is a list of node identifiers in the "\ "shortest path to reach the destination node.\n\n" \ "This algorithm will use the *cost* values associated with each edge if "\ "they are given.\n\n" \ }, \ { CHAR_PTR_CAST "shortest_path", graph_dijkstra_shortest_path, METH_O, \ CHAR_PTR_CAST "**shortest_path** (*value* or *node*)\n\n" \ "An alias for dijkstra_shortest_path_.\n\n" }, \ { CHAR_PTR_CAST "dijkstra_all_pairs_shortest_path", \ graph_dijkstra_all_pairs_shortest_path, METH_NOARGS, \ CHAR_PTR_CAST "**dijkstra_all_pairs_shortest_path** ()\n\n" \ "Calculates the shortest paths between all pairs of nodes in the graph by "\ "calling dijkstra_shortest_path_ multiple times.\n\n" \ "The return value is a dictionary where the keys are source node identifiers"\ " and the values are dictionaries of paths keyed by destination\n" \ "node identifiers (of the same form as dijkstra_shortest_path_). " \ "The values of the internal dictionaries are tuples of the form\n\n" \ " (*distance*, *nodes*)\n\n" \ "where distance is the distance traveled from the given node to the " \ "destination node and *nodes* is a list of node identifiers in the shortest " \ "path to reach the destination node.\n\n" \ "This algorithm will use the *cost* values associated with each edge if " \ "they are given.\n\n" \ }, \ { CHAR_PTR_CAST "all_pairs_shortest_path", graph_all_pairs_shortest_path, METH_NOARGS, \ CHAR_PTR_CAST "**all_pairs_shortest_path** ()\n\n" \ "An alias for dijkstra_all_pairs_shortest_path_.\n\n" }, #define SPANNING_TREE_METHODS \ { CHAR_PTR_CAST "create_spanning_tree", graph_create_spanning_tree, METH_O, \ CHAR_PTR_CAST "**create_spanning_tree** (*value* or *node*)\n\n" \ "Returns a new graph which is a (probably non-optimal) spanning tree of all nodes reachable from the given node. This tree is created using DFS." }, \ { CHAR_PTR_CAST "create_minimum_spanning_tree", graph_create_minimum_spanning_tree, METH_VARARGS, \ CHAR_PTR_CAST "**create_minimum_spanning_tree** ()\n\n" \ "Creates a minimum spanning tree of the entire graph in place using Kruskal's algorithm.\n" \ "A minimum spanning tree connects all nodes using the minimum total edge cost.\n" \ }, \ #define SEARCH_METHODS \ { CHAR_PTR_CAST "BFS", graph_BFS, METH_O, \ CHAR_PTR_CAST "**BFS** (*value* or *node*)\n\n" \ "A lazy iterator that returns the nodes in breadth-first order starting from the given *value* or *node*. Note that the starting node is included in the returned nodes." }, \ { CHAR_PTR_CAST "DFS", graph_DFS, METH_O, \ CHAR_PTR_CAST "**DFS** (*value* or *node*)\n\n" \ "A lazy iterator that returns the nodes in depth-first order starting from the given *value* or *node*. Note that the starting node is included in the returned nodes." }, \ #define COLOR_METHODS \ { CHAR_PTR_CAST "colorize", graph_colorize, METH_O, \ CHAR_PTR_CAST "**colorize** (*ncolors*)\n\n" \ "This method colors the graph using *ncolors* colors with the " \ "constraint that adjacent nodes have different colors. When the number of " \ "colors is too small for the given graph, a runtime_error is raised.\n" \ "The graph coloring algorithm is based on the \"6-COLOR\" alorithm for planar " \ "graphs, as described in:\n\n" \ " D. Matula, Y. Shiloach, R. Tarjan:\n"\ " `Two linear-time algorithms for five-coloring a planar graph.`__\n" \ " Tech Rep STAN-CS-80-830, Computer Science Dep., Stanford Univ., 1980\n\n" \ ".. __: ftp://db.stanford.edu/pub/cstr/reports/cs/tr/80/830/CS-TR-80-830.pdf\n\n"\ "We have modified the algorithm in such a way that the color distribution is\n"\ "balanced, i.e. that each color is assigned approximately to the same\n"\ "number of nodes (also known as \"equitable coloring\").\n\n"\ ".. note:: The coloring algorithm works in linear time and is only\n" \ " guaranteed to work for planar graphs and *ncolors* > 5. When the algorithm runs out\n" \ " of colors (e.g., because the graph is not planar), an exception is thrown." \ }, \ { CHAR_PTR_CAST "get_color", graph_get_color, METH_O, \ CHAR_PTR_CAST "**get_color** (*value* or *node*)\n\n" \ "Returns the color of the node after the graph was colorized with colorize_." }, \ #define ALGORITHM_METHODS \ PARTITIONS_METHODS \ SHORTEST_PATH_METHODS \ SPANNING_TREE_METHODS \ SEARCH_METHODS \ COLOR_METHODS #endif /* _GRAPHOBJECT_ALGORITHM_HPP_80F4CF20EC34D5 */ gamera-3.3.3/src/graph/graphmodule/iteratorobject.hpp0000644000076500000000000000605511652050141021673 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _ITERATOROBJECT_HPP_EBAA99C250B47F #define _ITERATOROBJECT_HPP_EBAA99C250B47F #include "wrapper.hpp" #include "python_iterator.hpp" #include "nodetraverseiterator.hpp" #include "nodeobject.hpp" #include "edgeobject.hpp" /** This classes are wrappers from gamera's python_iterator to the Graph-API specific iterators. Node* are put in NodeObject* Edge* are put in EdgeObject* for being used in Python applications */ // ----------------------------------------------------------------------------- template struct NTIteratorObject: IteratorObject { GraphObject* _graph; void init(itertype* it, GraphObject* graph) { _iterator = it; _graph = graph; if(_graph) Py_INCREF(_graph); }; static PyObject* next(IteratorObject* self) { if(self == NULL || ((NTIteratorObject*)self)->_iterator == NULL) return NULL; Node *n = ((NTIteratorObject*)self)->_iterator->next(); if (n == NULL) return NULL; return (PyObject*)node_deliver(n,((NTIteratorObject*)self)->_graph); } static void dealloc(IteratorObject* self) { if(((NTIteratorObject*)self)->_graph) { Py_DECREF(((NTIteratorObject*)self)->_graph); } delete (itertype*)((NTIteratorObject*)self)->_iterator; } itertype* _iterator; }; // ----------------------------------------------------------------------------- template struct ETIteratorObject: IteratorObject { GraphObject* _graph; void init(itertype* it, GraphObject* graph) { _iterator = it; _graph = graph; if(_graph) Py_INCREF(_graph); } static PyObject* next(IteratorObject* self) { if(self == NULL || ((ETIteratorObject*)self)->_iterator == NULL || ((ETIteratorObject*)self)->_graph == NULL) return NULL; Edge *n = ((ETIteratorObject*)self)->_iterator->next(); if (n == NULL) return NULL; return (PyObject*)edge_deliver(n,((ETIteratorObject*)self)->_graph); } static void dealloc(IteratorObject* self) { if(((ETIteratorObject*)self)->_graph) { Py_DECREF(((ETIteratorObject*)self)->_graph); } delete (itertype*)((ETIteratorObject*)self)->_iterator; } itertype* _iterator; }; #endif /* _ITERATOROBJECT_HPP_EBAA99C250B47F */ gamera-3.3.3/src/graph/graphmodule/nodeobject.cpp0000644000076500000000000001542411652050141020762 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "nodeobject.hpp" #include "iteratorobject.hpp" #include "graph.hpp" #ifdef __DEBUG_GAPI__ #include #endif extern "C" { static void node_dealloc(PyObject* self); static PyObject* node___call__(PyObject* self, PyObject* args, PyObject* kwds); static PyObject* node___repr__(PyObject* self); static PyObject* node_get_edges(PyObject* self); static PyObject* node_get_nodes(PyObject* self); static PyObject* node_get_nedges(PyObject* self); static PyObject* node_get_data(PyObject* self); } // ----------------------------------------------------------------------------- /* Python Type Definition */ // ----------------------------------------------------------------------------- static PyTypeObject NodeType = { PyObject_HEAD_INIT(NULL) 0, }; // ----------------------------------------------------------------------------- PyMethodDef node_methods[] = { { NULL } }; // ----------------------------------------------------------------------------- PyGetSetDef node_getset[] = { { CHAR_PTR_CAST "data", (getter)node_get_data, 0, CHAR_PTR_CAST "The value the identified with this node. (get/set)", 0 }, { CHAR_PTR_CAST "edges", (getter)node_get_edges, 0, CHAR_PTR_CAST "An iterator over edges pointing in/out from node (get)", 0 }, { CHAR_PTR_CAST "nodes", (getter)node_get_nodes, 0, CHAR_PTR_CAST "An iterator over nodes that can be reached directly " "(through a single edge) from this node (get)", 0 }, { CHAR_PTR_CAST "nedges", (getter)node_get_nedges, 0, CHAR_PTR_CAST "The number of edges pointing in/out of this node (get)", 0 }, { NULL } }; // ----------------------------------------------------------------------------- void init_NodeType() { NodeType.ob_type = &PyType_Type; NodeType.tp_name = CHAR_PTR_CAST "gamera.graph.Node"; NodeType.tp_basicsize = sizeof(NodeObject); NodeType.tp_dealloc = node_dealloc; NodeType.tp_repr = node___repr__; NodeType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; NodeType.tp_getattro = PyObject_GenericGetAttr; NodeType.tp_alloc = NULL; // PyType_GenericAlloc; NodeType.tp_free = NULL; // _PyObject_Del; NodeType.tp_methods = node_methods; NodeType.tp_getset = node_getset; NodeType.tp_call = node___call__; NodeType.tp_weaklistoffset = 0; PyType_Ready(&NodeType); } // ----------------------------------------------------------------------------- /// node_new creates a new Python NodeObject by copying the given note. PyObject* node_new(Node* n) { #ifdef __DEBUG_GAPI__ std::cout<<"node_new(Node* n)\n"; #endif if (n == NULL) { RETURN_VOID(); } NodeObject* so; so = (NodeObject*)(NodeType.tp_alloc(&NodeType, 0)); so->_node=n; so->_graph = NULL; return (PyObject*)so; } // ----------------------------------------------------------------------------- PyObject* node_deliver(Node* n, GraphObject* go) { if(n == NULL || go == NULL) return NULL; GraphDataPyObject* nodedata = dynamic_cast(n->_value); if(nodedata->_node == NULL) { nodedata->_node = node_new(n); ((NodeObject*)nodedata->_node)->_graph = go; Py_INCREF(go); // Py_INCREF(nodedata->_node); } else { Py_INCREF(nodedata->_node); } return nodedata->_node; } // ----------------------------------------------------------------------------- bool is_NodeObject(PyObject* self) { return PyObject_TypeCheck(self, &NodeType); } // ----------------------------------------------------------------------------- /* Wrapper Methods */ // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- static void node_dealloc(PyObject* self) { #ifdef __DEBUG_GAPI__ std::cout<<"node_dealloc(PyObjecT* self)\n"; #endif INIT_SELF_NODE(); if(so->_node) { GraphDataPyObject* nodedata = dynamic_cast(so->_node->_value); nodedata->_node = NULL; } if(so->_graph != NULL && is_GraphObject((PyObject*)so->_graph)) { Py_DECREF(so->_graph); } self->ob_type->tp_free(self); } // ----------------------------------------------------------------------------- static PyObject* node_get_edges(PyObject* self) { INIT_SELF_NODE(); Node* n = so->_node; EdgePtrIterator* it = n->get_edges(); ETIteratorObject* nti = iterator_new >(); nti->init(it, so->_graph); return (PyObject*)nti; } // ----------------------------------------------------------------------------- static PyObject* node_get_nodes(PyObject* self) { INIT_SELF_NODE(); Node* n = so->_node; NodePtrEdgeIterator* it = n->get_nodes(); NTIteratorObject* nti = iterator_new >(); nti->init(it, so->_graph); return (PyObject*)nti; } // ----------------------------------------------------------------------------- static PyObject* node_get_nedges(PyObject* self) { INIT_SELF_NODE(); size_t nedges = so->_node->get_nedges(); RETURN_INT(nedges); } // ----------------------------------------------------------------------------- static PyObject* node_get_data(PyObject* self) { INIT_SELF_NODE(); PyObject *data = dynamic_cast(so->_node->_value)->data; Py_INCREF(data); return data; } // ----------------------------------------------------------------------------- static PyObject* node___call__(PyObject* self, PyObject* args, PyObject* kwds) { return node_get_data(self); } // ----------------------------------------------------------------------------- static PyObject* node___repr__(PyObject* self) { PyObject* data = node_get_data(self); PyObject* repr = PyObject_Repr(data); Py_INCREF(repr); PyObject* ret = PyString_FromFormat("", PyString_AsString(repr)); Py_DECREF(repr); Py_DECREF(data); return ret; } gamera-3.3.3/src/graph/graphmodule/nodeobject.hpp0000644000076500000000000000220611652050141020761 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _NODEOBJECT_HPP_2356F7048D8CCA #define _NODEOBJECT_HPP_2356F7048D8CCA #include "wrapper.hpp" #include "node.hpp" struct NodeObject { PyObject_HEAD Node *_node; GraphObject *_graph; }; void init_NodeType(); PyObject* node_new(Node* n); bool is_NodeObject(PyObject* self); PyObject* node_deliver(Node* n, GraphObject* go); #endif /* _NODEOBJECT_HPP_2356F7048D8CCA */ gamera-3.3.3/src/graph/graphmodule/partitions.cpp0000644000076500000000000003774211652050141021051 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Christoph Dalitz * 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include "graphobject.hpp" #include "nodeobject.hpp" #include "node.hpp" #include "edge.hpp" #include "graph.hpp" // This should always be at least a 64-bit unsigned // If compiling on a platform with a larger available native integer length, // you might want to use that instead #ifdef _MSC_VER typedef unsigned __int64 Bitfield; #define BITFIELD_SIZE 64 #else typedef unsigned long long Bitfield; #define BITFIELD_SIZE 64 #endif extern "C" { PyObject* graph_optimize_partitions(PyObject* self, PyObject* args); } // ----------------------------------------------------------------------------- /** This class encapsulates the old methods from optimize_partitions and adds * sets for holding the visited-markers. * */ class Partitions { protected: std::set _visited1; std::set _visited2; std::map _number; void visit1(Node* n) { _visited1.insert(n); } void visit2(Node* n) { _visited2.insert(n); } void unvisit1(Node* n) { _visited1.erase(n); } void unvisit2(Node* n) { _visited2.erase(n); } bool visited1(Node* n) { return _visited1.count(n) == 1; } bool visited2(Node* n) { return _visited2.count(n) == 1; } void set_number(Node *n, unsigned long number) { _number[n] = number; } unsigned long get_number(Node *n) { return _number[n]; } /* SUBTYPES */ // -------------------------------------------------------------------------- class Part { public: inline Part(Bitfield _bits, double _score) : bits(_bits), score(_score), begin(), end() {}; Bitfield bits; double score; size_t begin, end; }; // two score values for a partition // when the first value is equal, the second value is compared struct ScoreValue { double value1; double value2; bool operator >(const ScoreValue& b) { if(this->value1 == b.value1) { return this->value2 > b.value2; } else { return this->value1 > b.value1; } }; bool operator <(const ScoreValue& b) { if(this->value1 == b.value1) { return this->value2 < b.value2; } else { return this->value1 < b.value1; } }; }; typedef std::vector Parts; typedef std::vector Solution; void print_parts(Parts& parts) { std::cerr << "parts =====\n"; for (size_t i = 0; i < parts.size(); ++i) { std::cerr << i << " "; Part part = parts[i]; for (size_t j = 0; j < BITFIELD_SIZE; ++j) { if ((Bitfield(1) << j) & part.bits) std::cerr << "*"; else std::cerr << "-"; } std::cerr << " " << part.begin << " " << part.end << " " << part.score << "\n"; } std::cerr << "\n"; } // -------------------------------------------------------------------------- inline Node* graph_optimize_partitions_find_root(Node* root, std::vector& subgraph) { // Find the node with the minimum edges NodeQueue node_queue; node_queue.push(root); size_t min_edges = std::numeric_limits::max(); visit1(root); while (!node_queue.empty()) { Node* node; node = node_queue.front(); node_queue.pop(); subgraph.push_back(node); if (node->get_nedges() < min_edges) { min_edges = node->get_nedges(); root = node; } EdgePtrIterator* ei = node->get_edges(); Edge* e; while((e = ei->next()) != NULL) { Node* to_node = e->traverse(node); if (!visited1(to_node)) { node_queue.push(to_node); visit1(to_node); } } delete ei; } return root; } // -------------------------------------------------------------------------- inline void graph_optimize_partitions_number_parts(Node* root, std::vector& subgraph) { // Now visit the graph in the correct order NodeQueue node_queue; node_queue.push(root); visit2(root); size_t count = 0; while (!node_queue.empty()) { Node* node; node = node_queue.front(); node_queue.pop(); subgraph.push_back(node); set_number(node, count++); EdgePtrIterator* ei = node->get_edges(); Edge* e; while((e=ei->next()) != NULL) { Node* to_node = e->traverse(node); if (!visited2(to_node)) { node_queue.push(to_node); visit2(to_node); } } delete ei; } } // -------------------------------------------------------------------------- inline void graph_optimize_partitions_evaluate_parts(Node* node, const size_t max_parts_per_group, const size_t subgraph_size, std::vector& node_stack, Bitfield bits, const PyObject* eval_func, Parts& parts) { size_t node_number = get_number(node); node_stack.push_back(node); bits |= (Bitfield)1 << node_number; // Get the score for this part by building a Python list and // passing it to the (Python) evaluation function PyObject* result = PyList_New(node_stack.size()); size_t j = 0; for (std::vector::iterator i = node_stack.begin(); i != node_stack.end(); ++i, ++j) { Py_INCREF(dynamic_cast((*i)->_value)->data); PyList_SET_ITEM(result, j, dynamic_cast((*i)->_value)->data); } PyObject* tuple = Py_BuildValue(CHAR_PTR_CAST "(O)", result); PyObject* evalobject = PyObject_CallObject(const_cast(eval_func), tuple); Py_DECREF(tuple); Py_DECREF(result); double eval; if (evalobject == NULL) eval = -1.0; else { if (PyFloat_Check(evalobject)) eval = PyFloat_AsDouble(evalobject); else eval = -1.0; Py_DECREF(evalobject); } parts.push_back(Part(bits, eval)); if ((node_stack.size() < max_parts_per_group) && (get_number(node) != subgraph_size - 1)) { EdgePtrIterator* ei = node->get_edges(); Edge* e; while((e = ei->next()) != NULL) { Node* to_node = e->traverse(node); if (get_number(to_node) > node_number) graph_optimize_partitions_evaluate_parts( to_node, max_parts_per_group, subgraph_size, node_stack, bits, eval_func, parts); } delete ei; } node_stack.pop_back(); return; } // -------------------------------------------------------------------------- inline void graph_optimize_partitions_find_skips(Parts &parts) { for (size_t i = 0; i < parts.size(); ++i) { Part& root = parts[i]; size_t j = i; for (; j < parts.size(); ++j) if (!(root.bits & parts[j].bits)) break; root.begin = j; // Find the position of the left-most set bit Bitfield temp = root.bits; size_t b = 0; while (temp) { temp >>= 1; ++b; } // Create a mask of all bits set starting with the left-most set bit temp = (1 << (b + 1)) - 1; size_t k = j; for (; k < parts.size(); ++k) if (!(temp & parts[k].bits)) break; root.end = k; } // print_parts(parts); } // -------------------------------------------------------------------------- inline void graph_optimize_partitions_find_solution (const Parts& parts, const size_t begin, const size_t end, Solution& best_solution, ScoreValue& best_val, Solution& partial_solution, ScoreValue partial_val, const Bitfield bits, const Bitfield all_bits, const char* criterion) { ScoreValue tmp_val = partial_val; if (bits == all_bits) { // when criterion = "min", partial_val.value1 contains highest minimum confidence // when criterion "avg", it contains the sum over all confidences // partial_val.value2 always contains sum over confidences tmp_val.value2 = partial_val.value2 / partial_solution.size(); if (0 == strcmp(criterion, "avg")) { tmp_val.value1 = tmp_val.value2; } if (tmp_val > best_val){ best_val = tmp_val; best_solution = partial_solution; // Copy } } for (size_t i = begin; i < end; ++i) { const Part& root = parts[i]; if (!(root.bits & bits)) { // If this part "fits into" the current parts partial_solution.push_back(root.bits); tmp_val.value2 = partial_val.value2 + root.score; if (0 == strcmp(criterion, "avg")) { tmp_val.value1 = tmp_val.value2; } else { // criterion == "min" tmp_val.value1 = std::min(partial_val.value1, root.score); } graph_optimize_partitions_find_solution( parts, std::max(begin, root.begin), std::max(end, root.end), best_solution, best_val, partial_solution, tmp_val, bits | root.bits, all_bits, criterion); partial_solution.pop_back(); } } } public: // -------------------------------------------------------------------------- PyObject* optimize_partitions(const GraphObject* so, Node* root, const PyObject* eval_func, const size_t max_parts_per_group, const size_t max_graph_size, const char* criterion = "min") { _visited2.clear(); _visited1.clear(); // not neccessary because of set-based approach size_t size; { std::vector subgraph; root = graph_optimize_partitions_find_root(root, subgraph); size = subgraph.size(); // We can't do the grouping if there's more than 64 nodes, // so just return them all. Also, if there's only one node, // just trivially return it to save time. if (size > BITFIELD_SIZE - 2 || size > max_graph_size || size == 1) { // Now, build a Python list of the solution PyObject* result = PyList_New(subgraph.size()); for (size_t i = 0; i < subgraph.size(); ++i) { PyObject* subresult = PyList_New(1); Py_INCREF(dynamic_cast(subgraph[i]->_value)->data); PyList_SET_ITEM(subresult, 0, dynamic_cast(subgraph[i]->_value)->data); PyList_SET_ITEM(result, i, subresult); } return result; } } { Solution best_solution; std::vector subgraph; subgraph.reserve(size); { Parts parts; graph_optimize_partitions_number_parts(root, subgraph); // That gives us an idea of the number of nodes in the graph, // now go through and find the parts parts.reserve(size * max_parts_per_group); std::vector node_stack; node_stack.reserve(max_parts_per_group); for (std::vector::iterator i = subgraph.begin(); i != subgraph.end(); ++i) { Bitfield bits = 0; graph_optimize_partitions_evaluate_parts(*i, max_parts_per_group, size, node_stack, bits, eval_func, parts); } // Build the skip list graph_optimize_partitions_find_skips(parts); // Now, we find a solution Solution partial_solution; best_solution.reserve(size); // Maximum size the solution can be partial_solution.reserve(size); // Maximum size the solution can be Bitfield all_bits = (Bitfield(1) << size) - 1; ScoreValue best_val; best_val.value1 = best_val.value2 = 0.0; // partial_val.value1 carries sum (criterion "avg") or minimum ("min") // of confidences in subgroups => different initialization // partial_val.value2 always carries sum ScoreValue partial_val_init; partial_val_init.value2 = 0.0; if (0 == strcmp(criterion, "avg")) { partial_val_init.value1 = 0.0; } else { // criterion == "min" partial_val_init.value1 = std::numeric_limits::max(); } graph_optimize_partitions_find_solution( parts, 0, (*(parts.begin())).begin, best_solution, best_val, partial_solution, partial_val_init, 0, all_bits, criterion); } // Now, build a Python list of the solution PyObject* result = PyList_New(best_solution.size()); for (size_t i = 0; i < best_solution.size(); ++i) { Bitfield solution_part = best_solution[i]; size_t c = 0; for (size_t b=0; b < BITFIELD_SIZE; ++b) { if (((Bitfield)1 << b) & solution_part) ++c; } // Count the set bits (Kernighan's method) so that we can allocate the // correct sized list from the get-go // (Kernighan's method does not seem to work on OS-X PPC, so I've // replaced it with the above) /* size_t c = 0; for (; solution_part; c++) solution_part &= solution_part - 1; */ PyObject* subresult = PyList_New(c); Bitfield k = (Bitfield)1; solution_part = best_solution[i]; for (size_t j = 0, l = 0; k < solution_part; ++j, k <<= 1) if (solution_part & k) { PyObject* data = dynamic_cast(subgraph[j]->_value)->data; Py_INCREF(data); PyList_SET_ITEM(subresult, l++, data); } PyList_SET_ITEM(result, i, subresult); } return result; } } }; // ----------------------------------------------------------------------------- PyObject* graph_optimize_partitions(PyObject* self, PyObject* args) { GraphObject* so = ((GraphObject*)self); PyObject* a, *eval_func; int max_parts_per_group = 5; int max_graph_size = 16; char* criterion = (char*)"min"; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO|iis:optimize_partitions", &a, &eval_func, &max_parts_per_group, &max_graph_size, &criterion) <= 0) return 0; Node* root; if(is_NodeObject(a)) root = so->_graph->get_node(((NodeObject*)a)->_node->_value); else { GraphDataPyObject obj(a); root = so->_graph->get_node(&obj); } if (root == NULL) return 0; Partitions p; PyObject* result = p.optimize_partitions(so, root, eval_func, max_parts_per_group, max_graph_size, criterion); assert(result != NULL); return result; } gamera-3.3.3/src/graph/graphmodule/partitions.hpp0000644000076500000000000000470411652050141021046 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef mgd010103_partitions_hpp #define mgd010103_partitions_hpp #include "wrapper.hpp" #include "graph.hpp" #include "node.hpp" #include "edge.hpp" extern "C" { PyObject* graph_optimize_partitions(PyObject* self, PyObject* args); } // ----------------------------------------------------------------------------- #define PARTITIONS_METHODS \ { CHAR_PTR_CAST "optimize_partitions", graph_optimize_partitions, METH_VARARGS, \ CHAR_PTR_CAST "**optimize_partitions** (*root_node*, *fittness_func*, "\ "*max_parts_per_group* = 5, *max_subgraph_size* = 16, criterion = \"min\")\n\n" \ "A partition is defined as a way to divide a subgraph into groups. This "\ "algorithm finds an optimal\n" \ "partition according to the given fitness function.\n\n" \ " *root_node*\n" \ " The root node of the subgraph to be optimized.\n\n" \ " *fitness_func*\n" \ " A user-provided Python function, that given a partition as a nested \n"\ " list of groups, where each value is a node\n" \ " identifier, returns a floating-point score. Higher values indicate \n"\ " greater fitness.\n\n" \ " *max_parts_per_group*\n" \ " Limits the number of nodes that will be placed into a single group.\n\n" \ " *max_subgraph_size*\n" \ " If the subgraph rooted at *root_node* has more than \n"\ " *max_subgraph_size* nodes, the partitions will not be optimized\n\n" \ " *criterion*\n" \ " Choses the solution with the highest minimum ('min') or highest \n"\ " average ('avg') confidence.\n\n" \ }, \ #endif gamera-3.3.3/src/graph/graphmodule/wrapper.hpp0000644000076500000000000000360611652050141020332 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _WRAPPER_HPP_940FFAA9288997 #define _WRAPPER_HPP_940FFAA9288997 ////////////////#define __DEBUG_GAPI__ #include #include "gameramodule.hpp" //##include "graphdata_pyobject.hpp" #ifdef __DEBUG_GAPI__ #include #endif #ifdef CHAR_PTR_CAST #undef CHAR_PTR_CAST #endif #define CHAR_PTR_CAST (char*) #include "graph_common.hpp" #include "graphdatapyobject.hpp" using namespace Gamera::GraphApi; class GraphObject; class EdgeObject; class NodeObject; // ----------------------------------------------------------------------------- // some wrappers for easier handling of self-parameters and return values #define INIT_SELF_GRAPH() GraphObject* so = ((GraphObject*)self) #define INIT_SELF_EDGE() EdgeObject* so = ((EdgeObject*)self) #define INIT_SELF_NODE() NodeObject* so = ((NodeObject*)self) #define RETURN_BOOL(a) {PyObject *_ret_ = PyBool_FromLong((long)(a)); return _ret_;} #define RETURN_INT(a) {return PyInt_FromLong((long)(a));} #define RETURN_VOID() {PyObject *_ret_ = Py_None; Py_INCREF(_ret_); return _ret_;} #define RETURN_DOUBLE(a) {return PyFloat_FromDouble((a));} #endif /* _WRAPPER_HPP_940FFAA9288997 */ gamera-3.3.3/src/graph/node.cpp0000644000076500000000000001263211712302465015270 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/node.hpp" #include "graph/graph.hpp" #include "graph/edge.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- Node::Node(GraphData * value, Graph* graph) { _value = value; _graph = graph; } // ----------------------------------------------------------------------------- Node::~Node() { #ifdef __DEBUG_GAPI__ // std::cout << "~Node\n"; #endif } // ----------------------------------------------------------------------------- Node::Node(Node& node) { _value = node._value; _graph = node._graph; } // ----------------------------------------------------------------------------- Node::Node(Node* node) { _value = node->_value; _graph = node->_graph; } // ----------------------------------------------------------------------------- EdgePtrIterator* Node::get_edges(bool both_directions) { Node* from_node = NULL; if(_graph->is_directed() && !both_directions) from_node = this; EdgePtrIterator* it= new EdgePtrIterator(_graph, _edges.begin(), _edges.end(), from_node); return it; } // ----------------------------------------------------------------------------- NodePtrEdgeIterator* Node::get_nodes(bool both_directions) { Node* from_node = NULL; if(_graph->is_directed() && !both_directions) from_node = this; NodePtrEdgeIterator* it = new NodePtrEdgeIterator(_graph, _edges.begin(), _edges.end(), this); return it; } // ----------------------------------------------------------------------------- bool Node::has_edge_to(Node* node) { Edge* e; bool ret = false; EdgePtrIterator* it = get_edges(); while((e = it->next()) != NULL && ret==false) { if (e->to_node == node) ret = true; } delete it; return ret; } // ----------------------------------------------------------------------------- bool Node::has_edge_from(Node* node) { Edge* e; bool ret = false; EdgePtrIterator* it = get_edges(); while((e = it->next()) != NULL && ret==false) { if (e->from_node == node) ret = true; } delete it; return ret; } // ----------------------------------------------------------------------------- void Node::add_edge(Edge* edge) { if(edge->from_node == this || edge->to_node == this) { _edges.push_back(edge); } else throw std::runtime_error("edge not valid for this node"); } // ----------------------------------------------------------------------------- void Node::remove_edge(Edge* edge) { _edges.remove(edge); } // ----------------------------------------------------------------------------- void Node::remove_self(bool glue) { EdgeVector to_remove; typedef std::pair NodeWeight; typedef std::vector NodeWeightVector; NodeWeightVector in_nodes, out_nodes; if(glue) { EdgePtrIterator* it = get_edges(true); Edge* e; while((e = it->next()) != NULL) { if(*e->from_node->_value == *this->_value && *e->to_node->_value != *this->_value) { out_nodes.push_back(NodeWeight(e->to_node, e->weight)); } else if(*e->to_node->_value == *this->_value && *e->from_node->_value != *this->_value) { in_nodes.push_back(NodeWeight(e->from_node, e->weight)); } to_remove.push_back(e); } delete it; } else { for(EdgeIterator it = _edges.begin(); it != _edges.end(); it++) { to_remove.push_back(*it); } } size_t i = _edges.size(); for(EdgeIterator it = to_remove.begin(); it != to_remove.end(); it++) { Edge* e = *it; if(e->to_node != NULL && e->from_node != NULL) { if (e->to_node != this && e->to_node != NULL) e->to_node->_edges.remove(e); if (e->from_node != this && e->from_node != NULL) e->from_node->_edges.remove(e); e->to_node = NULL; e->from_node = NULL; _graph->_edges.remove(e); e->weight = 2000; delete e; } i--; } if(glue) { for(NodeWeightVector::iterator iit = in_nodes.begin(); iit != in_nodes.end(); iit++) { for(NodeWeightVector::iterator oit = out_nodes.begin(); oit != out_nodes.end(); oit++) { Node* from_node = iit->first; Node* to_node = oit->first; if(from_node != to_node && from_node != this && to_node != this) _graph->add_edge(from_node, to_node, iit->second+oit->second, _graph->is_directed()); } } } remove_from_graph(); } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/shortest_path.cpp0000644000076500000000000001135011712302465017226 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/graph.hpp" #include "graph/node.hpp" #include "graph/edge.hpp" #include "graph/shortest_path.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- void ShortestPath::init_single_source(Graph* g, Node *s) { NodePtrIterator *it = g->get_nodes(); Node* itn; while((itn = it->next()) != NULL) { DijkstraNode *n = new DijkstraNode(itn); if(itn == s) { n->distance = 0; queue.push(n); } nodes[itn] = n; //queue.push(n); } } // ----------------------------------------------------------------------------- ShortestPathMap* ShortestPath::dijkstra_shortest_path(Graph* g, Node *source) { DfsIterator* it = g->DFS(source); Node* node; while((node = it->next()) != NULL) { DijkstraNode *n = new DijkstraNode(node); nodes[node] = n; } delete it; nodes[source]->distance = 0; queue.push(nodes[source]); while(!queue.empty()) { DijkstraNode *n = queue.top(); queue.pop(); if(!n->visited) { n->visited = true; EdgePtrIterator* eit = n->node->get_edges(); Edge* e; while((e = eit->next()) != NULL) { DijkstraNode* from = nodes[e->from_node]; DijkstraNode* to = nodes[e->to_node]; if(from == n && from->distance + e->weight < to->distance) { to->distance = from->distance + e->weight; to->predecessor = from->node; queue.push(to); } //undirected edges in both directions if(!GRAPH_HAS_FLAG(g, FLAG_DIRECTED) && to == n && to->distance + e->weight < from->distance) { from->distance = to->distance + e->weight; from->predecessor = to->node; queue.push(from); } } delete eit; } } /* create map for results */ ShortestPathMap *result = new ShortestPathMap(); NodePtrIterator *it2 = g->get_nodes(); Node* itn; while((itn = it2->next()) != NULL) { DijkstraPath path; Node* n = itn; DijkstraNode *dn = nodes[n]; if(dn != NULL) { path.cost = dn->distance; } else path.cost = 0; while(n != NULL) { path.path.push_back(n); dn = nodes[n]; if(dn != NULL) n = dn->predecessor; else n = NULL; } (*result)[itn] = path; } delete it2; return result; } // ----------------------------------------------------------------------------- std::map* ShortestPath::dijkstra_all_pairs_shortest_path( Graph* g) { std::map* result = new std::map; NodePtrIterator* it = g->get_nodes(); Node* n; while((n = it->next()) != NULL) { (*result)[n] = dijkstra_shortest_path(g, n); } delete it; return result; } // ----------------------------------------------------------------------------- ShortestPath::~ShortestPath() { for(std::map::iterator it = nodes.begin(); it != nodes.end(); it++) { delete it->second; } } // ----------------------------------------------------------------------------- ShortestPathMap *ShortestPath::faster_all_pairs_shortest_path(Graph* g) { size_t nnodes = g->get_nnodes(); size_t i = 0; std::map nodes; std::vector weights(nnodes*2, std::numeric_limits::max()); //init nodes Node *n; NodePtrIterator* nit = g->get_nodes(); while((n = nit->next()) != NULL) { nodes[n] = i; i++; } delete nit; //init edges Edge *e; EdgePtrIterator* eit = g->get_edges(); while((e = eit->next()) != NULL) { size_t from = nodes[e->from_node]; size_t to = nodes[e->to_node]; weights[from*nnodes+to] = e->weight; } delete eit; return NULL; } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/spanning_tree.cpp0000644000076500000000000000644011712302465017177 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/graph.hpp" #include "graph/node.hpp" #include "graph/edge.hpp" #include "graph/spanning_tree.hpp" namespace Gamera { namespace GraphApi { // ----------------------------------------------------------------------------- Graph *SpanningTree::create_minimum_spanning_tree_kruskal(Graph* g) { if(g->is_directed()) //Kruskal-algorithm is only for undirected graphs return NULL; Graph* tree = new Graph(FLAG_TREE); std::priority_queue, mst_compare_func> edgeQueue; EdgePtrIterator *eit = g->get_edges(); Edge* e; while((e = eit->next()) != NULL) { edgeQueue.push(e); } delete eit; NodePtrIterator *nit = g->get_nodes(); Node* n; while((n=nit->next()) != NULL) { tree->add_node((n)->_value->copy()); } delete nit; while(!edgeQueue.empty() && (tree->get_nnodes()-1) > tree->get_nedges()) { Edge* edge = edgeQueue.top(); edgeQueue.pop(); bool path_fromto = tree->has_path(edge->from_node->_value, edge->to_node->_value); bool path_tofrom = tree->has_path(edge->to_node->_value, edge->from_node->_value); if (!path_fromto && !path_tofrom) { tree->add_edge(edge->from_node->_value, edge->to_node->_value, edge->weight, false); } } return tree; } // ----------------------------------------------------------------------------- Graph *SpanningTree::create_minimum_spanning_tree(Graph *g) { return create_minimum_spanning_tree_kruskal(g); } // ----------------------------------------------------------------------------- Graph *SpanningTree::create_spanning_tree(Graph* g, Node* root) { if(root == NULL) throw std::runtime_error("create_spanning_tree NULL exception"); Graph *t = new Graph(FLAG_DAG); NodeSet visited; NodeStack node_stack; node_stack.push(root); while(!node_stack.empty()) { Node* n = node_stack.top(); node_stack.pop(); visited.insert(n); Node* tree_node1 = t->add_node_ptr(n->_value); EdgePtrIterator* eit = n->get_edges(); Edge* e; while((e = eit->next()) != NULL) { Node* inner_node = e->traverse(n); if(inner_node != NULL && visited.count(inner_node) == 0) { Node* tree_node2 = t->add_node_ptr(inner_node->_value); t->add_edge(tree_node1, tree_node2, e->weight, e->label); node_stack.push(inner_node); visited.insert(inner_node); } } delete eit; } return t; } }} // end Gamera::GraphApi gamera-3.3.3/src/graph/subgraph_root.cpp0000644000076500000000000000377611712302464017231 0ustar chriswheel/* * * Copyright (C) 2011 Christian Brandt * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "graph/subgraph_root.hpp" namespace Gamera { namespace GraphApi { void SubgraphRoots::process(SubgraphNode* v) { SubgraphNode *w = NULL; v->root = true; v->visited = true; DfsIterator* it = g->DFS(v->n); Node* w_node = it->next(); while((w_node = it->next()) != NULL) { w = nodeMap[w_node]; w->root = false; w->visited = true; } delete it; } // ----------------------------------------------------------------------------- NodeVector* SubgraphRoots::subgraph_roots(Graph* g) { this->g = g; NodePtrIterator *nit = g->get_nodes(); Node *n = NULL; while((n = nit->next()) != NULL) { SubgraphNode* t = new SubgraphNode(n); nodeMap[n] = t; } delete nit; i = 0; for(std::map::iterator it = nodeMap.begin(); it != nodeMap.end(); it ++) { SubgraphNode* v = it->second; if(!v->visited) { process(v); } } //create root-vector NodeVector *nv = new NodeVector(); for(std::map::iterator it = nodeMap.begin(); it != nodeMap.end(); it ++) { if(it->second->root) nv->push_back(it->second->n); delete it->second; } return nv; } }} // end Gamera::GraphApi gamera-3.3.3/src/imagedataobject.cpp0000644000076500000000000002155611652050141016344 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; extern "C" { static PyObject* imagedata_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void imagedata_dealloc(PyObject* self); // get/set static PyObject* imagedata_get_stride(PyObject* self); static PyObject* imagedata_get_ncols(PyObject* self); static PyObject* imagedata_get_nrows(PyObject* self); static PyObject* imagedata_get_page_offset_x(PyObject* self); static PyObject* imagedata_get_page_offset_y(PyObject* self); static PyObject* imagedata_get_size(PyObject* self); static PyObject* imagedata_get_bytes(PyObject* self); static PyObject* imagedata_get_mbytes(PyObject* self); static PyObject* imagedata_get_pixel_type(PyObject* self); static PyObject* imagedata_get_storage_format(PyObject* self); static int imagedata_set_page_offset_x(PyObject* self, PyObject* v); static int imagedata_set_page_offset_y(PyObject* self, PyObject* v); static int imagedata_set_nrows(PyObject* self, PyObject* v); static int imagedata_set_ncols(PyObject* self, PyObject* v); // methods static PyObject* imagedata_dimensions(PyObject* self, PyObject* args); } static PyTypeObject ImageDataType = { PyObject_HEAD_INIT(NULL) 0, }; static PyGetSetDef imagedata_getset[] = { { (char *)"nrows", (getter)imagedata_get_nrows, (setter)imagedata_set_nrows, (char *)"(int property get/set)\n\nThe number of rows", 0 }, { (char *)"ncols", (getter)imagedata_get_ncols, (setter)imagedata_set_ncols, (char *)"(int property get/set)\n\nThe number of columns", 0 }, { (char *)"page_offset_x", (getter)imagedata_get_page_offset_x, (setter)imagedata_set_page_offset_x, (char *)"(int property get/set)\n\nThe *x* offset in the page for the data", 0 }, { (char *)"page_offset_y", (getter)imagedata_get_page_offset_y, (setter)imagedata_set_page_offset_y, (char *)"(int property get/set)\n\nThe *y* offset in the page for the data", 0 }, { (char *)"stride", (getter)imagedata_get_stride, 0, (char *)"(int property get/set)\n\nThe length of the data stride", 0 }, { (char *)"size", (getter)imagedata_get_size, 0, (char *)"(Size property get/set)\n\nThe size of the image data", 0 }, { (char *)"bytes", (getter)imagedata_get_bytes, 0, (char *)"(int property get/set)\n\nThe size of the data in bytes", 0 }, { (char *)"mbytes", (getter)imagedata_get_mbytes, 0, (char *)"(int property get/set)\n\nThe size of the data in megabytes", 0 }, { (char *)"pixel_type", (getter)imagedata_get_pixel_type, 0, (char *)"(int property get/set)\n\nThe type of the pixels. See `pixel types`__ for more info.\n\n.. __: image_types.html#pixel-types", 0 }, { (char *)"storage_format", (getter)imagedata_get_storage_format, 0, (char *)"(int property get/set)\n\nThe format of the storage. See `storage formats`__ for more info.\n\n.. __: image_types.html#storage-formats", 0 }, { NULL } }; static PyMethodDef imagedata_methods[] = { { CHAR_PTR_CAST "dimensions", imagedata_dimensions, METH_VARARGS }, { NULL } }; PyTypeObject* get_ImageDataType() { return &ImageDataType; } static PyObject* imagedata_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int format, pixel; int num_args = PyTuple_GET_SIZE(args); if (num_args == 4) { PyObject* py_point = NULL; PyObject* py_dim = NULL; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OOii", &py_dim, &py_point, &pixel, &format)) { if (is_DimObject(py_dim)) { try { return create_ImageDataObject(*(((DimObject*)py_dim)->m_x), coerce_Point(py_point), pixel, format); } catch (std::invalid_argument e) { ; } } } } PyErr_Clear(); if (num_args == 1) { PyObject* py_rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &py_rect)) { if (is_RectObject(py_rect)) { Rect* rect = ((RectObject*)py_rect)->m_x; return create_ImageDataObject(rect->dim(), rect->origin(), pixel, format); } } } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to ImageData constructor. Valid forms are: (Dim dim, Point p, pixel_type = 0, storage_format = 0), and (Rect rect, pixel_type = 0, storage_format = 0). "); return 0; } static void imagedata_dealloc(PyObject* self) { ImageDataObject* x = (ImageDataObject*)self; delete x->m_x; self->ob_type->tp_free(self); } #define CREATE_GET_FUNC(name) static PyObject* imagedata_get_##name(PyObject* self) {\ ImageDataBase* x = ((ImageDataObject*)self)->m_x; \ return PyInt_FromLong((int)x->name()); \ } #define CREATE_SET_FUNC(name) static int imagedata_set_##name(PyObject* self, PyObject* value) {\ ImageDataBase* x = ((ImageDataObject*)self)->m_x; \ x->name((size_t)PyInt_AS_LONG(value)); \ return 0; \ } CREATE_GET_FUNC(stride) CREATE_GET_FUNC(ncols) CREATE_GET_FUNC(nrows) CREATE_GET_FUNC(page_offset_x) CREATE_GET_FUNC(page_offset_y) CREATE_GET_FUNC(size) CREATE_GET_FUNC(bytes) CREATE_SET_FUNC(page_offset_x) CREATE_SET_FUNC(page_offset_y) CREATE_SET_FUNC(nrows) CREATE_SET_FUNC(ncols) static PyObject* imagedata_get_mbytes(PyObject* self) { ImageDataBase* x = ((ImageDataObject*)self)->m_x; return Py_BuildValue(CHAR_PTR_CAST "d", x->mbytes()); } static PyObject* imagedata_get_pixel_type(PyObject* self) { return Py_BuildValue(CHAR_PTR_CAST "i", ((ImageDataObject*)self)->m_pixel_type); } static PyObject* imagedata_get_storage_format(PyObject* self) { return Py_BuildValue(CHAR_PTR_CAST "i", ((ImageDataObject*)self)->m_storage_format); } static PyObject* imagedata_dimensions(PyObject* self, PyObject* args) { ImageDataBase* x = ((ImageDataObject*)self)->m_x; int num_args = PyTuple_GET_SIZE(args); if (num_args == 1) { PyObject* py_dim; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &py_dim)) { if (is_DimObject(py_dim)) { x->dim(*(((DimObject*)py_dim)->m_x)); Py_INCREF(Py_None); return Py_None; } } } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to ImageData.dimensions. Must be one Dim argument."); return 0; } void init_ImageDataType(PyObject* module_dict) { ImageDataType.ob_type = &PyType_Type; ImageDataType.tp_name = CHAR_PTR_CAST "gameracore.ImageData"; ImageDataType.tp_basicsize = sizeof(ImageDataObject); ImageDataType.tp_dealloc = imagedata_dealloc; ImageDataType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; ImageDataType.tp_getset = imagedata_getset; ImageDataType.tp_methods = imagedata_methods; ImageDataType.tp_new = imagedata_new; ImageDataType.tp_getattro = PyObject_GenericGetAttr; ImageDataType.tp_alloc = NULL; // PyType_GenericAlloc; ImageDataType.tp_free = NULL; // _PyObject_Del; ImageDataType.tp_doc = CHAR_PTR_CAST "There are many ways to initialize ImageData:\n\n" " - ImageData(Dim *dim*, Point *offset*, Int *pixel_type*, Int *storage_format*)\n\n" " - ImageData(Rect *rect*, Int *pixel_type*, Int *storage_format*)\n\n" "*pixel_type*\n" " An integer value specifying the type of the pixels in the image.\n" " See `pixel types`__ for more information.\n\n" ".. __: image_types.html#pixel-types\n\n" "*storage_format*\n" " An integer value specifying the method used to store the image data.\n" " See `storage formats`__ for more information.\n\n" ".. __: image_types.html#storage-formats\n"; PyType_Ready(&ImageDataType); PyDict_SetItemString(module_dict, "ImageData", (PyObject*)&ImageDataType); // Some constants PyDict_SetItemString(module_dict, "FLOAT", Py_BuildValue(CHAR_PTR_CAST "i", Gamera::FLOAT)); PyDict_SetItemString(module_dict, "COMPLEX", Py_BuildValue(CHAR_PTR_CAST "i", Gamera::COMPLEX)); PyDict_SetItemString(module_dict, "ONEBIT", Py_BuildValue(CHAR_PTR_CAST "i", ONEBIT)); PyDict_SetItemString(module_dict, "GREYSCALE", Py_BuildValue(CHAR_PTR_CAST "i", GREYSCALE)); PyDict_SetItemString(module_dict, "GREY16", Py_BuildValue(CHAR_PTR_CAST "i", GREY16)); PyDict_SetItemString(module_dict, "RGB", Py_BuildValue(CHAR_PTR_CAST "i", RGB)); PyDict_SetItemString(module_dict, "DENSE", Py_BuildValue(CHAR_PTR_CAST "i", DENSE)); PyDict_SetItemString(module_dict, "RLE", Py_BuildValue(CHAR_PTR_CAST "i", RLE)); } gamera-3.3.3/src/imageinfoobject.cpp0000644000076500000000000001262311652050141016361 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; extern "C" { static PyObject* imageinfo_new(PyTypeObject* pytpe, PyObject* args, PyObject* kwds); static void imageinfo_dealloc(PyObject* self); // get/set static int imageinfo_set_x_resolution(PyObject* self, PyObject* value); static PyObject* imageinfo_get_x_resolution(PyObject* self); static int imageinfo_set_y_resolution(PyObject* self, PyObject* value); static PyObject* imageinfo_get_y_resolution(PyObject* self); static int imageinfo_set_ncols(PyObject* self, PyObject* value); static PyObject* imageinfo_get_ncols(PyObject* self); static int imageinfo_set_nrows(PyObject* self, PyObject* value); static PyObject* imageinfo_get_nrows(PyObject* self); static int imageinfo_set_depth(PyObject* self, PyObject* value); static PyObject* imageinfo_get_depth(PyObject* self); static int imageinfo_set_ncolors(PyObject* self, PyObject* value); static PyObject* imageinfo_get_ncolors(PyObject* self); } static PyTypeObject ImageInfoType = { PyObject_HEAD_INIT(NULL) 0, }; static PyGetSetDef imageinfo_getset[] = { { (char *)"x_resolution", (getter)imageinfo_get_x_resolution, (setter)imageinfo_set_x_resolution, (char *)"The x resolution of the image." }, { (char *)"y_resolution", (getter)imageinfo_get_y_resolution, (setter)imageinfo_set_y_resolution, (char *)"The y resolution of the image." }, { (char *)"ncols", (getter)imageinfo_get_ncols, (setter)imageinfo_set_ncols, (char *)"The number of columns of the image." }, { (char *)"nrows", (getter)imageinfo_get_nrows, (setter)imageinfo_set_nrows, (char *)"The number of rows of the image." }, { (char *)"depth", (getter)imageinfo_get_depth, (setter)imageinfo_set_depth, (char *)"The bit depth of the image (in bits)." }, { (char *)"ncolors", (getter)imageinfo_get_ncolors, (setter)imageinfo_set_ncolors, (char *)"The number of colors in the image." }, { NULL } }; PyTypeObject* get_ImageInfoType() { return &ImageInfoType; } static PyObject* imageinfo_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); if (num_args != 0) { PyErr_SetString(PyExc_TypeError, "Invalid arguments to ImageInfo constructor."); return 0; } ImageInfoObject* o; o = (ImageInfoObject*)pytype->tp_alloc(pytype, 0); o->m_x = new ImageInfo(); return (PyObject*)o; } static void imageinfo_dealloc(PyObject* self) { ImageInfoObject* x = (ImageInfoObject*)self; delete x->m_x; self->ob_type->tp_free(self); } #define CREATE_GET_FUNC(name) static PyObject* imageinfo_get_##name(PyObject* self) {\ ImageInfo* x = ((ImageInfoObject*)self)->m_x; \ return PyInt_FromLong((int)x->name()); \ } #define CREATE_SET_FUNC(name) static int imageinfo_set_##name(PyObject* self, PyObject* value) {\ ImageInfo* x = ((ImageInfoObject*)self)->m_x; \ x->name((size_t)PyInt_AS_LONG(value)); \ return 0; \ } #define CREATE_GET_FLOAT_FUNC(name) static PyObject* imageinfo_get_##name(PyObject* self) {\ ImageInfo* x = ((ImageInfoObject*)self)->m_x; \ return Py_BuildValue(CHAR_PTR_CAST "f", x->name()); \ } #define CREATE_SET_FLOAT_FUNC(name) static int imageinfo_set_##name(PyObject* self, PyObject* value) {\ ImageInfo* x = ((ImageInfoObject*)self)->m_x; \ x->name(PyFloat_AS_DOUBLE(value)); \ return 0; \ } CREATE_GET_FLOAT_FUNC(x_resolution) CREATE_SET_FLOAT_FUNC(x_resolution) CREATE_GET_FLOAT_FUNC(y_resolution) CREATE_SET_FLOAT_FUNC(y_resolution) CREATE_GET_FUNC(nrows) CREATE_SET_FUNC(nrows) CREATE_GET_FUNC(ncols) CREATE_SET_FUNC(ncols) CREATE_GET_FUNC(depth) CREATE_SET_FUNC(depth) CREATE_GET_FUNC(ncolors) CREATE_SET_FUNC(ncolors) void init_ImageInfoType(PyObject* module_dict) { ImageInfoType.ob_type = &PyType_Type; ImageInfoType.tp_name = CHAR_PTR_CAST "gameracore.ImageInfo"; ImageInfoType.tp_basicsize = sizeof(ImageInfoObject); ImageInfoType.tp_dealloc = imageinfo_dealloc; ImageInfoType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; ImageInfoType.tp_new = imageinfo_new; ImageInfoType.tp_getattro = PyObject_GenericGetAttr; ImageInfoType.tp_alloc = NULL; // PyType_GenericAlloc; ImageInfoType.tp_getset = imageinfo_getset; ImageInfoType.tp_free = NULL; // _PyObject_Del; ImageInfoType.tp_doc = CHAR_PTR_CAST "__init__()\n\n" "The ImageInfo class allows the properties of a disk-based image file " "to be examined without loading it.\n\n" "It is rare to instantiate this class directly.\n\n" "To get image info, use the image_info(*filename*) function in the " "module ``gamera.core``."; PyType_Ready(&ImageInfoType); PyDict_SetItemString(module_dict, "ImageInfo", (PyObject*)&ImageInfoType); } gamera-3.3.3/src/imageobject.cpp0000644000076500000000000021477311652050141015517 0ustar chriswheel/* * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2009 Jonathan Koch * 2009-2010 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" #include "pixel.hpp" #include using namespace Gamera; extern "C" { // we use __new__ instead of __init__ as constructor... static PyObject* image_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static PyObject* sub_image_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static PyObject* cc_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); // ...but we must implement dummy __init__ functions // to suppress deprecation warnings in python 2.6 static int image_init(PyObject* self, PyObject* args, PyObject* kwds) { return 0; }; static int sub_image_init(PyObject* self, PyObject* args, PyObject* kwds) { return 0; }; static int cc_init(PyObject* self, PyObject* args, PyObject* kwds) { return 0; }; // more useful stuff... static void image_dealloc(PyObject* self); static int image_traverse(PyObject* self, visitproc visit, void* arg); static int image_clear(PyObject* self); static PyObject* image_repr(PyObject* self); // methods static PyObject* image_get(PyObject* self, PyObject* args); static PyObject* image_set(PyObject* self, PyObject* args); static PyObject* image_white(PyObject* self, PyObject* args); static PyObject* image_black(PyObject* self, PyObject* args); static PyObject* image_getitem(PyObject* self, PyObject* args); static PyObject* image_setitem(PyObject* self, PyObject* args); static PyObject* image_len(PyObject* self, PyObject* args); // Removed 07/28/04 MGD. Can't figure out why this is useful. // static PyObject* image_sort(PyObject* self, PyObject* args); // Get/set static PyObject* image_get_data(PyObject* self); static PyObject* image_get_features(PyObject* self); static PyObject* image_get_id_name(PyObject* self); static PyObject* image_get_confidence(PyObject* self); static PyObject* image_get_children_images(PyObject* self); static PyObject* image_get_classification_state(PyObject* self); static PyObject* image_get_scaling(PyObject* self); static PyObject* image_get_resolution(PyObject* self); static int image_set_features(PyObject* self, PyObject* v); static int image_set_id_name(PyObject* self, PyObject* v); static int image_set_confidence(PyObject* self, PyObject* v); static int image_set_children_images(PyObject* self, PyObject* v); static int image_set_classification_state(PyObject* self, PyObject* v); static int image_set_scaling(PyObject* self, PyObject* v); static int image_set_resolution(PyObject* self, PyObject* v); static PyObject* cc_get_label(PyObject* self); static int cc_set_label(PyObject* self, PyObject* v); static PyObject* mlcc_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static int mlcc_init(PyObject* self, PyObject* args, PyObject* kwds) { return 0; }; static PyObject* cc_convert_to_mlcc(PyObject* self); static PyObject* mlcc_convert_to_cc(PyObject* self); static PyObject* mlcc_convert_to_cc_list(PyObject* self); static PyObject* mlcc_has_label(PyObject* self, PyObject* v); static PyObject* mlcc_relabel(PyObject* self, PyObject* args); static PyObject* mlcc_get_labels(PyObject* self); static PyObject* mlcc_get_neighbors(PyObject* self); static PyObject* mlcc_add_label(PyObject* self, PyObject* args); static PyObject* mlcc_remove_label(PyObject* self, PyObject* args); //static PyObject* mlcc_find_bounding_box(PyObject* self, PyObject* args); static PyObject* mlcc_add_neighbors(PyObject* self, PyObject* args); static PyObject* mlcc_copy(PyObject* self, PyObject* args); } static PyTypeObject ImageType = { PyObject_HEAD_INIT(NULL) 0, }; PyTypeObject* get_ImageType() { return &ImageType; } static PyTypeObject SubImageType = { PyObject_HEAD_INIT(NULL) 0, }; PyTypeObject* get_SubImageType() { return &SubImageType; } static PyTypeObject CCType = { PyObject_HEAD_INIT(NULL) 0, }; PyTypeObject* get_CCType() { return &CCType; } static PyGetSetDef image_getset[] = { { (char *)"data", (getter)image_get_data, 0, (char *)"(read-only property)\n\n" "Returns the underlying ImageData__ object.\n\n" ".. __: gamera.core.ImageData.html", 0 }, { (char *)"features", (getter)image_get_features, (setter)image_set_features, (char *)"(read/write property)\n\n" "The feature vector of the image (of type array)", 0 }, { (char *)"id_name", (getter)image_get_id_name, (setter)image_set_id_name, (char *)"(read/write property)\n\n" "A list of strings representing the classifications of the image.", 0 }, { (char *)"confidence", (getter)image_get_confidence, (setter)image_set_confidence, (char *)"(read/write property)\n\n" "A mapping of confidence values for the main id (id_name[0]).", 0 }, { (char *)"children_images", (getter)image_get_children_images, (setter)image_set_children_images, (char *)"(read/write property)\n\n" "A list of images created from classifications that produce images, such as splitting algorithms.", 0 }, { (char *)"classification_state", (getter)image_get_classification_state, (setter)image_set_classification_state, (char *)"(read/write property)\n\n" "How (or whether) an image is classified", 0 }, { (char *)"scaling", (getter)image_get_scaling, (setter)image_set_scaling, (char *)"(read/write property)\n\n" "The scaling (if any) applied to the features as a floating-point value.", 0 }, { (char *)"resolution", (getter)image_get_resolution, (setter)image_set_resolution, (char *)"(read/write property)\n\n" "The resolution of the image", 0 }, { NULL } }; static PyGetSetDef cc_getset[] = { { (char *)"label", (getter)cc_get_label, (setter)cc_set_label, (char *)"(read/write property)\n\nThe pixel label value for the Cc", 0}, { NULL } }; static PyMethodDef cc_methods[] = { {"convert_to_mlcc", (PyCFunction)cc_convert_to_mlcc, METH_NOARGS, (char*)"**convert_to_mlcc** ()\n\n" "Converts the ConnectedComponent into a MultiLabelCC." }, {NULL} //Sentinel// }; static PyMethodDef image_methods[] = { { (char *)"get", image_get, METH_VARARGS, (char *)"**get** (Point *p*)\n\n" "Gets a pixel value at the given (*x*, *y*) coordinate.\n\n" "A 2-element sequence may be used in place of the ``Point`` argument. For " "instance, the following are all equivalent:\n\n" ".. code:: Python\n\n" " px = image.get(Point(5, 2))\n" " px = image.get((5, 2))\n" " px = image.get([5, 2])\n\n" "This coordinate is relative to the image view, not the logical coordinates." }, { (char *)"set", image_set, METH_VARARGS, (char *)"**set** (Point *p*, Pixel *value*)\n\n" "Sets a pixel value at the given (*x*, *y*) coordinate.\n\n" "A 2-element sequence may be used in place of the ``Point`` argument. For " "instance, the following are all equivalent:\n\n" ".. code:: Python\n\n" " image.set(Point(5, 2), value)\n" " image.set((5, 2), value)\n" " image.set([5, 2], value)\n\n" "This coordinate is relative to the image view, not the logical coordinates." }, { (char *)"white", image_white, METH_NOARGS, (char *)"Pixel **white** ()\n\n" "Returns the pixel value representing the color white for this image." }, { (char *)"black", image_black, METH_NOARGS, (char *)"Pixel **black** ()\n\n" "Returns the pixel value representing the color black for this image." }, { (char *)"__getitem__", image_getitem, METH_VARARGS }, { (char *)"__setitem__", image_setitem, METH_VARARGS }, { (char *)"__len__", image_len, METH_NOARGS }, // Removed 07/28/04 MGD. Can't figure out why this is useful. // { "sort", image_sort, METH_NOARGS }, { NULL } }; static PyObject* _image_new(PyTypeObject* pytype, const Point& offset, const Dim& dim, int pixel, int format) { /* This is looks really awful, but it is not. We are simply creating a matrix view and some matrix data based on the pixel type and storage format. The python interface only works with the base types, but here we have to create the appropriate C++ type. The type pixel/storage info is stored in the ImageDataObject structure, so we don't need another copy here. Additionally, all of the type information can be determined through RTTI, but it is simpler to use an enum and makes it easier to export to Python. */ ImageDataObject* py_data = NULL; Rect* image = NULL; try { if (format == DENSE) { if (pixel == ONEBIT) { py_data = (ImageDataObject*)create_ImageDataObject(dim, offset, pixel, format); ImageData* data = (ImageData*)(py_data->m_x); image = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == GREYSCALE) { py_data = (ImageDataObject*)create_ImageDataObject(dim, offset, pixel, format); ImageData* data = (ImageData*)(py_data->m_x); image = (Rect *)new ImageView >(*data, offset, dim); } else if (pixel == GREY16) { py_data = (ImageDataObject*)create_ImageDataObject(dim, offset, pixel, format); ImageData* data = (ImageData*)(py_data->m_x); image = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == Gamera::FLOAT) { py_data = (ImageDataObject*)create_ImageDataObject(dim, offset, pixel, format); ImageData* data = (ImageData*)(py_data->m_x); image = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == RGB) { py_data = (ImageDataObject*)create_ImageDataObject(dim, offset, pixel, format); ImageData* data = (ImageData*)(py_data->m_x); image = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == Gamera::COMPLEX) { py_data = (ImageDataObject*)create_ImageDataObject(dim, offset, pixel, format); ImageData* data = (ImageData*)(py_data->m_x); image = (Rect*)new ImageView >(*data, offset, dim); } else { PyErr_Format(PyExc_TypeError, "Unknown pixel type '%d'.", pixel); return NULL; } } else if (format == RLE) { if (pixel == ONEBIT) { py_data = (ImageDataObject*)create_ImageDataObject(dim, offset, pixel, format); RleImageData* data = (RleImageData*)(py_data->m_x); image = (Rect*)new ImageView >(*data, offset, dim); } else { PyErr_SetString(PyExc_TypeError, "Pixel type must be ONEBIT if storage format is RLE."); return NULL; } } else { PyErr_SetString(PyExc_TypeError, "Unknown pixel type/storage format combination."); return NULL; } } catch (std::exception& e) { Py_DECREF(py_data); delete image; PyErr_SetString(PyExc_RuntimeError, e.what()); return NULL; } ImageObject* o; // we do not call rect_new here because we do all of the // required initializations o = (ImageObject*)pytype->tp_alloc(pytype, 0); // initialize the weakreflist o->m_weakreflist = NULL; o->m_data = (PyObject*)py_data; ((RectObject*)o)->m_x = image; PyObject* o2 = init_image_members(o); return o2; } static PyObject* image_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); if (num_args >= 2 && num_args <= 4) { PyObject* a = NULL; PyObject* b = NULL; int pixel = 0; int format = 0; static const char *kwlist[] = {"a", "b", "pixel_type", "storage_format", NULL}; if (PyArg_ParseTupleAndKeywords(args, kwds, (char *)"OO|ii", (char **)kwlist, &a, &b, &pixel, &format)) { Point point_a; try { point_a = coerce_Point(a); } catch (std::invalid_argument e) { goto phase2; } try { Point point_b = coerce_Point(b); int ncols = point_b.x() - point_a.x() + 1; int nrows = point_b.y() - point_a.y() + 1; return _image_new(pytype, point_a, Dim(ncols, nrows), pixel, format); } catch (std::invalid_argument e) { PyErr_Clear(); if (is_SizeObject(b)) { Size* size_b = ((SizeObject*)b)->m_x; int nrows = size_b->height() + 1; int ncols = size_b->width() + 1; return _image_new(pytype, point_a, Dim(ncols, nrows), pixel, format); } else if (is_DimObject(b)) { Dim* dim_b = ((DimObject*)b)->m_x; return _image_new(pytype, point_a, *dim_b, pixel, format); } #ifdef GAMERA_DEPRECATED else if (is_DimensionsObject(b)) { if (send_deprecation_warning( "Image(Point point, Dimensions dimensions, pixel_type, storage_format) \n" "is deprecated.\n\n" "Reason: (x, y) coordinate consistency. (Dimensions is now deprecated \n" "in favor of Dim).\n\n" "Use Image((offset_x, offset_y), Dim(ncols, nrows), pixel_type, \n" "storage_format) instead.", "imageobject.cpp", __LINE__) == 0) return 0; Dimensions* dim_b = ((DimensionsObject*)b)->m_x; return _image_new(pytype, point_a, Dim(dim_b->ncols(), dim_b->nrows()), pixel, format); } #endif } } } phase2: PyErr_Clear(); if (num_args >= 1 && num_args <= 3) { PyObject* src = NULL; int pixel = -1; int format = -1; static const char *kwlist[] = {"image", "pixel_type", "storage_format", NULL}; if (PyArg_ParseTupleAndKeywords(args, kwds, (char *)"O|ii", (char **)kwlist, &src, &pixel, &format)) { if (is_RectObject(src)) { Rect* rect = ((RectObject*)src)->m_x; if (is_ImageObject(src)) { ImageObject* py_src = (ImageObject*)src; if (pixel == -1) { pixel = ((ImageDataObject*)py_src->m_data)->m_pixel_type; } if (format == -1) { format = ((ImageDataObject*)py_src->m_data)->m_storage_format; } } else { if (pixel == -1) pixel = 0; if (format == -1) format = 0; } return _image_new(pytype, rect->origin(), rect->dim(), pixel, format); } } } #ifdef GAMERA_DEPRECATED PyErr_Clear(); if (num_args >= 4 && num_args <= 6) { int offset_y, offset_x, nrows, ncols; int pixel = 0; int format = 0; static char *kwlist[] = {"offset_y", "offset_x", "nrows", "ncols", "pixel_type", "storage_format", NULL}; if (PyArg_ParseTupleAndKeywords(args, kwds, "iiii|ii", kwlist, &offset_y, &offset_x, &nrows, &ncols, &pixel, &format)) { if (send_deprecation_warning( "Image(offset_y, offset_x, nrows, ncols, pixel_type, storage_format) is \n" "deprecated.\n\n" "Reason: (x, y) coordinate consistency.\n\n" "Use Image((offset_x, offset_y), Dim(ncols, nrows), pixel_type, \n" "storage_format) instead.", "imageobject.cpp", __LINE__) == 0) return 0; return _image_new(pytype, Point(offset_x, offset_y), Dim(ncols, nrows), pixel, format); } } #endif /* GAMERA_DEPRECATED */ PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to Image constructor. See the Image docstring for valid arguments."); return 0; } static PyObject* _sub_image_new(PyTypeObject* pytype, PyObject* py_src, const Point& offset, const Dim& dim) { if (!is_ImageObject(py_src)) { PyErr_SetString(PyExc_TypeError, "First argument to SubImage constructor must be an Image (or SubImage)."); return false; } int pixel, format; ImageObject* src = (ImageObject*)py_src; pixel = ((ImageDataObject*)src->m_data)->m_pixel_type; format = ((ImageDataObject*)src->m_data)->m_storage_format; Rect* subimage = NULL; try { if (format == DENSE) { if (pixel == ONEBIT) { ImageData* data = ((ImageData*)((ImageDataObject*)src->m_data)->m_x); subimage = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == GREYSCALE) { ImageData* data = ((ImageData*)((ImageDataObject*)src->m_data)->m_x); subimage = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == GREY16) { ImageData* data = ((ImageData*)((ImageDataObject*)src->m_data)->m_x); subimage = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == Gamera::FLOAT) { ImageData* data = ((ImageData*)((ImageDataObject*)src->m_data)->m_x); subimage = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == RGB) { ImageData* data = ((ImageData*)((ImageDataObject*)src->m_data)->m_x); subimage = (Rect*)new ImageView >(*data, offset, dim); } else if (pixel == Gamera::COMPLEX) { ImageData* data = ((ImageData*)((ImageDataObject*)src->m_data)->m_x); subimage = (Rect*)new ImageView >(*data, offset, dim); } else { PyErr_Format(PyExc_TypeError, "Unknown pixel type '%d'. Receiving this error indicates an internal inconsistency or memory corruption. Please report it on the Gamera mailing list.", pixel); return NULL; } } else if (format == RLE) { if (pixel == ONEBIT) { RleImageData* data = ((RleImageData*)((ImageDataObject*)src->m_data)->m_x); subimage = (Rect *)new ImageView >(*data, offset, dim); } else { PyErr_SetString(PyExc_TypeError, "Pixel type must be ONEBIT if storage format is RLE. Receiving this error indicates an internal inconsistency or memory corruption. Please report it on the Gamera mailing list."); return NULL; } } else { PyErr_SetString(PyExc_TypeError, "Unknown pixel type/storage format combination. Receiving this error indicates an internal inconsistency or memory corruption. Please report it on the Gamera mailing list."); return NULL; } } catch (std::exception& e) { delete subimage; PyErr_SetString(PyExc_RuntimeError, e.what()); return NULL; } ImageObject* o; o = (ImageObject*)pytype->tp_alloc(pytype, 0); ((RectObject*)o)->m_x = subimage; o->m_data = ((ImageObject*)py_src)->m_data; Py_INCREF(o->m_data); ((Image*)((RectObject*)o)->m_x)->resolution(((Image*)((RectObject*)py_src)->m_x)->resolution()); return init_image_members(o); } PyObject* sub_image_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); PyObject* image; if (num_args == 3) { PyObject *a, *b; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OOO", &image, &a, &b)) { Point point_a; try { point_a = coerce_Point(a); } catch (std::invalid_argument e) { goto phase2; } try { Point point_b = coerce_Point(b); int nrows = point_b.y() - point_a.y() + 1; int ncols = point_b.x() - point_a.x() + 1; return _sub_image_new(pytype, image, point_a, Dim(ncols, nrows)); } catch (std::invalid_argument e) { PyErr_Clear(); if (is_SizeObject(b)) { Size* size_b = ((SizeObject*)b)->m_x; int nrows = size_b->height() + 1; int ncols = size_b->width() + 1; return _sub_image_new(pytype, image, point_a, Dim(ncols, nrows)); } else if (is_DimObject(b)) { Dim* dim_b = ((DimObject*)b)->m_x; return _sub_image_new(pytype, image, point_a, *dim_b); } #ifdef GAMERA_DEPRECATED else if (is_DimensionsObject(b)) { if (send_deprecation_warning( "SubImage(image, Point offset, Dimensions dimensions) is deprecated.\n\n" "Reason: (x, y) coordinate consistency. (Dimensions is now deprecated \n" "in favor of Dim).\n\n" "Use Image(image, (offset_x, offset_y), Dim(ncols, nrows)) instead.", "imageobject.cpp", __LINE__) == 0) return 0; Dimensions* dim_b = ((DimensionsObject*)b)->m_x; int nrows = dim_b->nrows(); int ncols = dim_b->ncols(); return _sub_image_new(pytype, image, point_a, Dim(ncols, nrows)); } #endif } } } phase2: PyErr_Clear(); if (num_args == 2) { PyObject* pyrect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO", &image, &pyrect)) { if (is_RectObject(pyrect)) { Rect* rect = ((RectObject*)pyrect)->m_x; return _sub_image_new(pytype, image, rect->origin(), rect->dim()); } } } #ifdef GAMERA_DEPRECATED PyErr_Clear(); if (num_args == 5) { int offset_y, offset_x, nrows, ncols; if (PyArg_ParseTuple(args, "Oiiii", &image, &offset_y, &offset_x, &nrows, &ncols) > 0) { if (send_deprecation_warning( "SubImage(image, offset_y, offset_x, nrows, ncols) is deprecated.\n\n" "Reason: (x, y) coordinate consistency.\n\n" "Use SubImage(image, (offset_x, offset_y), Dim(ncols, nrows)) instead.", "imageobject.cpp", __LINE__) == 0) return 0; return _sub_image_new(pytype, image, Point(offset_x, offset_y), Dim(ncols, nrows)); } } #endif PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to SubImage constructor. See the SubImage docstring for valid arguments."); return 0; } static PyObject* _cc_new(PyTypeObject* pytype, PyObject* py_src, int label, const Point& offset, const Dim& dim) { if (!is_ImageObject(py_src)) { PyErr_SetString(PyExc_TypeError, "First argument to the Cc constructor must be an Image (or SubImage)."); return NULL; } int pixel, format; ImageObject* src = (ImageObject*)py_src; pixel = ((ImageDataObject*)src->m_data)->m_pixel_type; format = ((ImageDataObject*)src->m_data)->m_storage_format; Rect* cc = NULL; try { if (pixel != ONEBIT) { PyErr_SetString(PyExc_TypeError, "Cc objects may only be created from ONEBIT Images."); return NULL; } if (format == DENSE) { ImageData* data = ((ImageData*)((ImageDataObject*)src->m_data)->m_x); cc = (Rect*)new ConnectedComponent >(*data, label, offset, dim); } else if (format == RLE) { RleImageData* data = ((RleImageData*)((ImageDataObject*)src->m_data)->m_x); cc = (Rect*)new ConnectedComponent >(*data, label, offset, dim); } else { PyErr_SetString(PyExc_TypeError, "Unknown pixel type/storage format combination. Receiving this error indicates an internal inconsistency or memory corruption. Please report it on the Gamera mailing list."); return NULL; } } catch (std::exception& e) { delete cc; PyErr_SetString(PyExc_RuntimeError, e.what()); return NULL; } ImageObject* o; o = (ImageObject*)pytype->tp_alloc(pytype, 0); ((RectObject*)o)->m_x = cc; o->m_data = ((ImageObject*)py_src)->m_data; Py_INCREF(o->m_data); // set the resolution ((Image*)((RectObject*)o)->m_x)->resolution(((Image*)((RectObject*)py_src)->m_x)->resolution()); return init_image_members(o); } PyObject* cc_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); PyObject* image = NULL; if (num_args == 4) { PyObject *a, *b; int label; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OiOO", &image, &label, &a, &b)) { Point point_a; try { point_a = coerce_Point(a); } catch (std::invalid_argument e) { goto phase2; } try { Point point_b = coerce_Point(b); int nrows = point_b.y() - point_a.y() + 1; int ncols = point_b.x() - point_a.x() + 1; return _cc_new(pytype, image, label, point_a, Dim(ncols, nrows)); } catch (std::invalid_argument e) { PyErr_Clear(); if (is_SizeObject(b)) { Size* size_b = ((SizeObject*)b)->m_x; int nrows = size_b->height() + 1; int ncols = size_b->width() + 1; return _cc_new(pytype, image, label, point_a, Dim(ncols, nrows)); } else if (is_DimObject(b)) { Dim* dim_b = ((DimObject*)b)->m_x; return _cc_new(pytype, image, label, point_a, *dim_b); } #ifdef GAMERA_DEPRECATED else if (is_DimensionsObject(b)) { if (send_deprecation_warning( "Cc(image, label, Point offset, Dimensions dimensions) is deprecated.\n\n" "Reason: (x, y) coordinate consistency. (Dimensions is now deprecated \n" "in favor of Dim).\n\n" "Use Cc(image, label, (offset_x, offset_y), Dim(ncols, nrows)) instead.", "imageobject.cpp", __LINE__) == 0) return 0; Dimensions* dim_b = ((DimensionsObject*)b)->m_x; int nrows = dim_b->nrows(); int ncols = dim_b->ncols(); return _cc_new(pytype, image, label, point_a, Dim(ncols, nrows)); } #endif } } } phase2: PyErr_Clear(); if (num_args == 3) { int label; PyObject* pyrect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OiO", &image, &label, &pyrect)) { if (is_RectObject(pyrect)) { Rect* rect = ((RectObject*)pyrect)->m_x; return _cc_new(pytype, image, label, rect->origin(), rect->dim()); } } } #ifdef GAMERA_DEPRECATED PyErr_Clear(); if (num_args == 6) { int offset_y, offset_x, nrows, ncols, label; if (PyArg_ParseTuple(args, "Oiiiii", &image, &label, &offset_y, &offset_x, &nrows, &ncols) > 0) { if (send_deprecation_warning( "Cc(image, label, offset_y, offset_x, nrows, ncols) is deprecated.\n\n" "Reason: (x, y) coordinate consistency.\n\n" "Use Cc(image, label, (offset_x, offset_y), Dim(ncols, nrows)) instead.", "imageobject.cpp", __LINE__) == 0) return 0; return _cc_new(pytype, image, label, Point(offset_x, offset_y), Dim(ncols, nrows)); } } #endif PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to Cc constructor. See the Cc docstring for valid arguments."); return 0; } static void image_dealloc(PyObject* self) { ImageObject* o = (ImageObject*)self; if (o->m_weakreflist != NULL) { PyObject_ClearWeakRefs(self); } image_clear(self); Py_DECREF(o->m_data); Py_DECREF(o->m_features); Py_DECREF(o->m_classification_state); delete ((RectObject*)self)->m_x; self->ob_type->tp_free(self); } static int image_traverse(PyObject* self, visitproc visit, void *arg) { ImageObject* o = (ImageObject*)self; if (o->m_id_name) { int err = visit(o->m_id_name, arg); if (err) return err; } if (o->m_children_images) { int err = visit(o->m_children_images, arg); if (err) return err; } return 0; } static int image_clear(PyObject* self) { ImageObject* o = (ImageObject*)self; PyObject* tmp = o->m_id_name; o->m_id_name = NULL; Py_XDECREF(tmp); tmp = o->m_confidence; o->m_confidence = NULL; Py_XDECREF(tmp); tmp = o->m_children_images; o->m_children_images = NULL; Py_XDECREF(tmp); return 0; } static PyObject* image_repr(PyObject* self) { Rect* x = ((RectObject*)self)->m_x; return PyString_FromFormat("", (int)x->offset_x(), (int)x->offset_y(), (int)x->ncols(), (int)x->nrows()); } static PyObject* image_get(PyObject* self, const Point& point) { RectObject* o = (RectObject*)self; ImageDataObject* od = (ImageDataObject*)((ImageObject*)self)->m_data; Rect* r = (Rect*)o->m_x; if (point.y() >= r->nrows() || point.x() >= r->ncols()) { PyErr_Format(PyExc_IndexError, "('%d', '%d') is out of bounds for image with size ('%d', '%d'). Remember get/set coordinates are relative to the upper left corner of the subimage, not to the corner of the page.", (int)point.x(), (int)point.y(), (int)r->ncols(), (int)r->nrows()); return 0; } if (is_CCObject(self)) { return PyInt_FromLong(((Cc*)o->m_x)->get(point)); } else if (is_MLCCObject(self)) { return PyInt_FromLong(((MlCc*)o->m_x)->get(point)); } else if (od->m_storage_format == RLE) { return PyInt_FromLong(((OneBitRleImageView*)o->m_x)->get(point)); } else { switch (od->m_pixel_type) { case Gamera::FLOAT: return PyFloat_FromDouble(((FloatImageView*)o->m_x)->get(point)); break; case Gamera::RGB: return create_RGBPixelObject(((RGBImageView*)o->m_x)->get(point)); break; case Gamera::GREYSCALE: return PyInt_FromLong(((GreyScaleImageView*)o->m_x)->get(point)); break; case Gamera::GREY16: return PyInt_FromLong(((Grey16ImageView*)o->m_x)->get(point)); break; case Gamera::ONEBIT: return PyInt_FromLong(((OneBitImageView*)o->m_x)->get(point)); break; case Gamera::COMPLEX: { ComplexPixel temp = ((ComplexImageView*)o->m_x)->get(point); return PyComplex_FromDoubles(temp.real(), temp.imag()); break; } default: return 0; } } } static PyObject* image_set(PyObject* self, const Point& point, PyObject* value) { RectObject* o = (RectObject*)self; ImageDataObject* od = (ImageDataObject*)((ImageObject*)self)->m_data; Rect* r = (Rect*)o->m_x; if (point.y() >= r->nrows() || point.x() >= r->ncols()) { PyErr_Format(PyExc_IndexError, "('%d', '%d') is out of bounds for image with size ('%d', '%d'). " "Remember get/set coordinates are relative to the upper left corner " "of the subimage, not to the corner of the page.", (int)point.x(), (int)point.y(), (int)r->ncols(), (int)r->nrows()); return 0; } if (is_CCObject(self)) { if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for CC objects must be an int."); return 0; } ((Cc*)o->m_x)->set(point, (OneBitPixel)PyInt_AS_LONG(value)); } else if (is_MLCCObject(self)) { if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for MlCc objects must be an int."); return 0; } ((MlCc*)o->m_x)->set(point, (OneBitPixel)PyInt_AS_LONG(value)); } else if (od->m_pixel_type == Gamera::FLOAT) { if (!PyFloat_Check(value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for Float objects must be a float."); return 0; } ((FloatImageView*)o->m_x)->set(point, PyFloat_AS_DOUBLE(value)); } else if (od->m_storage_format == RLE) { if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for OneBit objects must be an int."); return 0; } ((OneBitRleImageView*)o->m_x)->set(point, (OneBitPixel)PyInt_AS_LONG(value)); } else if (od->m_pixel_type == RGB) { if (!is_RGBPixelObject((PyObject*)value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for OneBit objects must be an RGBPixel"); return 0; } RGBPixelObject* v = (RGBPixelObject*)value; ((RGBImageView*)o->m_x)->set(point, *v->m_x); } else if (od->m_pixel_type == GREYSCALE) { if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for GreyScale objects must be an int."); return 0; } ((GreyScaleImageView*)o->m_x)->set(point, (GreyScalePixel)PyInt_AS_LONG(value)); } else if (od->m_pixel_type == GREY16) { if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for Grey16 objects must be an int."); return 0; } ((Grey16ImageView*)o->m_x)->set(point, (Grey16Pixel)PyInt_AS_LONG(value)); } else if (od->m_pixel_type == ONEBIT) { if (!PyInt_Check(value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for OneBit objects must be an int."); return 0; } ((OneBitImageView*)o->m_x)->set(point, (OneBitPixel)PyInt_AS_LONG(value)); } else if (od->m_pixel_type == Gamera::COMPLEX) { if (!PyComplex_Check(value)) { PyErr_SetString(PyExc_TypeError, "Pixel value for Complex objects must be a complex number."); return 0; } ComplexPixel temp(PyComplex_RealAsDouble(value), PyComplex_ImagAsDouble(value)); ((ComplexImageView*)o->m_x)->set(point, temp); } Py_INCREF(Py_None); return Py_None; } static PyObject* image_get(PyObject* self, PyObject* args) { int num_args = PyTuple_GET_SIZE(args); if (num_args == 1) { PyObject* py_point; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &py_point)) { try { return image_get(self, coerce_Point(py_point)); } catch (std::invalid_argument e) { PyErr_Clear(); int i; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "i", &i)) { Rect* image = (Image*)((RectObject*)self)->m_x; return image_get(self, Point(i % image->ncols(), i / image->ncols())); } } } } #ifdef GAMERA_DEPRECATED PyErr_Clear(); if (num_args == 2) { int row, col; if (PyArg_ParseTuple(args, "ii", &row, &col)) { if (send_deprecation_warning( "get(y, x) is deprecated.\n\n" "Reason: (x, y) coordinate consistency.\n\n" "Use get((x, y)) instead.", "imageobject.cpp", __LINE__) == 0) return 0 ; return image_get(self, Point(col, row)); } } #endif PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to get. Acceptable forms are: get(Point p), get((x, y)) and get(int index)."); return 0; } static PyObject* image_set(PyObject* self, PyObject* args) { int num_args = PyTuple_GET_SIZE(args); PyObject* value; if (num_args == 2) { PyObject* py_point; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO", &py_point, &value)) { try { return image_set(self, coerce_Point(py_point), value); } catch (std::invalid_argument e) { PyErr_Clear(); int i; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "iO", &i, &value)) { Rect* image = ((RectObject*)self)->m_x; return image_set(self, Point(i % image->ncols(), i / image->ncols()), value); } } } } #ifdef GAMERA_DEPRECATED PyErr_Clear(); if (num_args == 3) { int row, col; if (PyArg_ParseTuple(args, "iiO", &row, &col, &value)) { if (send_deprecation_warning( "set(y, x, value) is deprecated.\n\n" "Reason: (x, y) coordinate consistency.\n\n" "Use set((x, y), value) instead.", "imageobject.cpp", __LINE__) == 0) return 0; return image_set(self, Point(col, row), value); } } #endif PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to set. " "Acceptable forms are: set(Point p, Pixel v), get((x, y), Pixel v) " "and get(Int index, Pixel v)."); return 0; } static PyObject* image_white(PyObject* self, PyObject* args) { ImageDataObject* od = (ImageDataObject*)((ImageObject*)self)->m_data; switch (od->m_pixel_type) { case Gamera::FLOAT: return PyFloat_FromDouble(pixel_traits::white()); break; case Gamera::RGB: return create_RGBPixelObject(pixel_traits::white()); break; case Gamera::GREYSCALE: return PyInt_FromLong(pixel_traits::white()); break; case Gamera::GREY16: return PyInt_FromLong(pixel_traits::white()); break; case Gamera::ONEBIT: return PyInt_FromLong(pixel_traits::white()); break; case Gamera::COMPLEX: { ComplexPixel temp = pixel_traits::white(); return PyComplex_FromDoubles(temp.real(), temp.imag()); break; } default: return 0; } } static PyObject* image_black(PyObject* self, PyObject* args) { ImageDataObject* od = (ImageDataObject*)((ImageObject*)self)->m_data; switch (od->m_pixel_type) { case Gamera::FLOAT: return PyFloat_FromDouble(pixel_traits::black()); break; case Gamera::RGB: return create_RGBPixelObject(pixel_traits::black()); break; case Gamera::GREYSCALE: return PyInt_FromLong(pixel_traits::black()); break; case Gamera::GREY16: return PyInt_FromLong(pixel_traits::black()); break; case Gamera::ONEBIT: return PyInt_FromLong(pixel_traits::black()); break; case Gamera::COMPLEX: { ComplexPixel temp = pixel_traits::black(); return PyComplex_FromDoubles(temp.real(), temp.imag()); break; } default: return 0; } } // convert Python indexing into row/col format for images // Removed, since getitem/setitem now take a tuple of coordinates /* static inline int get_rowcol(Image* image, long index, size_t* row, size_t* col) { if (index < 0) { size_t len = image->ncols() * image->nrows(); size_t real_index = len + index; *row = real_index / image->ncols(); *col = real_index - (*row * image->ncols()); } else { *row = (size_t)(index / image->ncols()); *col = (size_t)(index - (*row * image->ncols())); } if (size_t(*row) >= image->nrows() || size_t(*col) >= image->ncols()) { PyErr_SetString(PyExc_IndexError, "Out of bounds for image"); return -1; } return 0; } */ static PyObject* image_getitem(PyObject* self, PyObject* args) { PyObject* arg = PyTuple_GET_ITEM(args, 0); Point point; if (PyInt_Check(arg)) { size_t i; i = PyInt_AsLong(arg); Rect* image = ((RectObject*)self)->m_x; return image_get(self, Point(i % image->ncols(), i / image->ncols())); } try { return image_get(self, coerce_Point(arg)); } catch (std::invalid_argument e) { ; } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to __getitem__. Acceptable forms are: image[Point p], image[x, y], image[index]"); return 0; } static PyObject* image_setitem(PyObject* self, PyObject* args) { PyObject* value; PyObject* arg; Point point; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO", &arg, &value) <= 0) return 0; if (PyInt_Check(arg)) { size_t i; i = PyInt_AsLong(arg); Rect* image = ((RectObject*)self)->m_x; return image_set(self, Point(i % image->ncols(), i / image->ncols()), value); } try { return image_set(self, coerce_Point(arg), value); } catch (std::invalid_argument e) { ; } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to __setitem__. Acceptable forms are: image[Point p], image[x, y], image[int index]"); return 0; } static PyObject* image_len(PyObject* self, PyObject* args) { Image* image = (Image*)((RectObject*)self)->m_x; return Py_BuildValue(CHAR_PTR_CAST "i", (long)(image->nrows() * image->ncols())); } #define CREATE_GET_FUNC(name) static PyObject* image_get_##name(PyObject* self) {\ ImageObject* o = (ImageObject*)self; \ Py_INCREF(o->m_##name); \ return o->m_##name; \ } #define CREATE_SET_FUNC(name) static int image_set_##name(PyObject* self, PyObject* v) {\ ImageObject* o = (ImageObject*)self; \ Py_DECREF(o->m_##name); \ o->m_##name = v; \ Py_INCREF(o->m_##name); \ return 0; \ } CREATE_GET_FUNC(data) CREATE_GET_FUNC(features) CREATE_SET_FUNC(features) CREATE_SET_FUNC(id_name) CREATE_GET_FUNC(id_name) CREATE_SET_FUNC(confidence) CREATE_GET_FUNC(confidence) CREATE_GET_FUNC(children_images) CREATE_SET_FUNC(children_images) CREATE_GET_FUNC(classification_state) CREATE_SET_FUNC(classification_state) static PyObject* image_get_scaling(PyObject* self) { RectObject* o = (RectObject*)self; return Py_BuildValue(CHAR_PTR_CAST "f", ((Image*)o->m_x)->scaling()); } static int image_set_scaling(PyObject* self, PyObject* v) { RectObject* o = (RectObject*)self; if (!PyFloat_Check(v)) { PyErr_SetString(PyExc_TypeError, "scaling must be a float value."); return -1; } ((Image*)o->m_x)->scaling(PyFloat_AS_DOUBLE(v)); return 0; } static PyObject* image_get_resolution(PyObject* self) { RectObject* o = (RectObject*)self; return Py_BuildValue(CHAR_PTR_CAST "f", ((Image*)o->m_x)->resolution()); } static int image_set_resolution(PyObject* self, PyObject* v) { RectObject* o = (RectObject*)self; if (!PyFloat_Check(v)) { PyErr_SetString(PyExc_TypeError, "resolution must be a float value."); return -1; } ((Image*)o->m_x)->resolution(PyFloat_AS_DOUBLE(v)); return 0; } static PyObject* cc_get_label(PyObject* self) { RectObject* o = (RectObject*)self; return Py_BuildValue(CHAR_PTR_CAST "i", ((Cc*)o->m_x)->label()); } static int cc_set_label(PyObject* self, PyObject* v) { RectObject* o = (RectObject*)self; if (!PyInt_Check(v)) { PyErr_SetString(PyExc_TypeError, "label must be an int value."); return -1; } ((Cc*)o->m_x)->label(PyInt_AS_LONG(v)); return 0; } static PyObject* image_richcompare(PyObject* a, PyObject* b, int op) { if (!is_ImageObject(a) || !is_ImageObject(b)) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Image& ap = *(Image*)((RectObject*)a)->m_x; Image& bp = *(Image*)((RectObject*)b)->m_x; /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_EQ: cmp = (ap == bp) && (ap.data() == bp.data()); break; case Py_NE: cmp = (ap != bp) || (ap.data() != bp.data()); break; case Py_LT: case Py_LE: case Py_GT: case Py_GE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; default: return 0; // cannot happen } if (cmp) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* cc_richcompare(PyObject* a, PyObject* b, int op) { if (!is_ImageObject(a) || !is_ImageObject(b)) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Image& ap = *(Image*)((RectObject*)a)->m_x; Image& bp = *(Image*)((RectObject*)b)->m_x; /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_EQ: if (!is_CCObject(a) || !is_CCObject(b)) cmp = false; else { Cc& ac = *(Cc*)((RectObject*)a)->m_x; Cc& bc = *(Cc*)((RectObject*)b)->m_x; cmp = (ap == bp) && (ap.data() == bp.data()) && ac.label() == bc.label(); } break; case Py_NE: if (!is_CCObject(a) || !is_CCObject(b)) cmp = true; else { Cc& ac = *(Cc*)((RectObject*)a)->m_x; Cc& bc = *(Cc*)((RectObject*)b)->m_x; cmp = (ap != bp) || (ap.data() != bp.data()) || ac.label() != bc.label(); } break; case Py_LT: case Py_LE: case Py_GT: case Py_GE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; default: return 0; // cannot happen } if (cmp) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyTypeObject MLCCType = { PyObject_HEAD_INIT(NULL) 0, }; PyTypeObject* get_MLCCType() { return &MLCCType; } /* (char *)"**get** (Point *p*)\n\n" "Gets a pixel value at the given (*x*, *y*) coordinate.\n\n" "A 2-element sequence may be used in place of the ``Point`` argument. For " "instance, the following are all equivalent:\n\n" */ static PyMethodDef mlcc_methods[] = { {(char*)"add_label", (PyCFunction)mlcc_add_label, METH_VARARGS, (char*)"**add_label** (int *label*, Rect *rect*)\n\n" "Adds a label and a bounding box (for the label) to a MultiLabelCC. The bounding box of the MlCc is extended by the given *rect*." }, {(char*)"remove_label", (PyCFunction)mlcc_remove_label, METH_O, (char*)"**remove_label** (int *label*)\n\n" "Removes a label from a MultiLabelCC. The bounding box of the MlCc is shrunk by the bounding box associated with the removed label as far as possible with respect to the other bounding boxes." }, // {(char*)"find_bounding_box", (PyCFunction)mlcc_find_bounding_box, METH_NOARGS, // (char*)"**find_bounding_box** ()\n\n" // "Calculates the bounding box of a MultiLabelCC depending from the stored labels/rectangles." // }, {(char*)"add_neighbors", (PyCFunction)mlcc_add_neighbors, METH_VARARGS, (char*)"**add_neighbors** (int *i*, int *j*)\n\n" "Adds a neighborhood relation to the MultiLabelCC.\n\n" "This is entirely optional: neighborship relations are only stored, and can be returned with get_neighbors(), but are not used internally by MlCc." }, {(char*)"copy", (PyCFunction)mlcc_copy, METH_VARARGS, (char*)"**copy** ()\n\n" "Makes a deep copy of a MultiLabelCC. " "There are a number of ways to to call this Method:\n\n" " - **copy** (MlCc *other*, Point *upper_left*, Point *lower_right*)\n\n" " - **copy** (MlCc *other*, Point *upper_left*, Size *size*)\n\n" " - **copy** (MlCc *other*, Point *upper_left*, Dim *dim*)\n\n" " - **copy** (MlCc *other*, Rect *rectangle*)\n\n" }, {(char*)"get_labels", (PyCFunction)mlcc_get_labels, METH_NOARGS, (char*)"**get_labels** ()\n\n" "Returns a list of all labels belonging to the MultiLabelCC." }, {(char*)"has_label", (PyCFunction)mlcc_has_label, METH_O, (char*)"**has_label** (int *label*)\n\n" "Returns wether a label belongs to the MlCc or not." }, {(char*)"get_neighbors", (PyCFunction)mlcc_get_neighbors, METH_NOARGS, (char*)"**get_neighbors** ()\n\n" "Returns all pairs of neighbors that have been previously added with add_neighbors()." }, {(char*)"relabel", (PyCFunction)mlcc_relabel, METH_VARARGS, (char *)"Returns a new MlCc containing only the given labels. For computing the new bounding boxes, the bounding box information stored for each label are utilized. The neighborship information is lost in the returned MlCc.\n\nThis function is overloaded to return either a single or several new MlCc's:\n\n" "**relabel** (List *l*)\n\n" "Creates a single MultiLabelCC based on the current one.\n\n" ".. code:: Python\n\n" " new_mlcc = mlcc.relabel([2,3,4])\n\n" "This returns a single MultiLabelCC which contains the labels 2,3,4.\n\n" "**relabel** (List> *l*)\n\n" "Creates a list of MultiLabelCC based on the current one.\n\n" ".. code:: Python\n\n" " new_mlcc_list = mlcc.relabel([[2,3],[4]])\n\n" "This returns a list of two MultiLabelCCs. The first one contains the labels 2,3; the " "second one contains the label 4." }, {(char*)"convert_to_cc", (PyCFunction)mlcc_convert_to_cc, METH_NOARGS, (char*)"**convert_to_cc** ()\n\n" "Converts the MultiLabelCC into a ConnectedComponent. All labels belonging to the MultiLabelCc are set to the value of the first label. After calling this method, the MultiLabelCc only has one label." }, {(char*)"convert_to_cc_list", (PyCFunction)mlcc_convert_to_cc_list, METH_NOARGS, (char*)"**convert_to_cc_list** ()\n\n" "Converts the MultiLabelCC into a list of ConnectedComponent." "Each ConnectedComponent in the List represents one label of the MultiLabelCC.\n" "For example: You have a MultiLabelCC with the labels 2, 3, 4. Therefore it would be " "transformed into a list of 3 ConnectedComponent, one for each label." }, {NULL} //Sentinel// }; static PyObject* mlcc_add_neighbors(PyObject* self, PyObject* args){ int i, j; if (!PyArg_ParseTuple(args, "ii", &i, &j)){ PyErr_SetString(PyExc_TypeError, "Both labels need to be int values."); return 0; } RectObject* o = (RectObject*)self; ((MlCc*)o->m_x)->add_neighbors(i, j); Py_INCREF(Py_None); return Py_None; } // static PyObject* mlcc_find_bounding_box(PyObject* self, PyObject* args){ // RectObject* o = (RectObject*)self; // ((MlCc*)o->m_x)->find_bounding_box(); // Py_INCREF(Py_None); // return Py_None; // } static PyObject* mlcc_remove_label(PyObject* self, PyObject* args){ if (!PyInt_Check(args)) { PyErr_SetString(PyExc_TypeError, "Label must be an int value."); return 0; } RectObject* o = (RectObject*)self; ((MlCc*)o->m_x)->remove_label(PyInt_AS_LONG(args)); Py_INCREF(Py_None); return Py_None; } static PyObject* mlcc_add_label(PyObject* self, PyObject* args){ int i; PyObject *pyrect; if (!PyArg_ParseTuple(args, "iO", &i, &pyrect)){ PyErr_SetString(PyExc_TypeError, "usage: add_label(int, Rect)."); return 0; } Rect *rect; try{ rect=(Rect*)( ((RectObject*)pyrect)->m_x ); } catch (...) { PyErr_SetString(PyExc_TypeError, "The second argument has to be of the type Rectangle."); return 0; } RectObject* o = (RectObject*)self; ((MlCc*)o->m_x)->add_label(i, *rect); Py_INCREF(Py_None); return Py_None; } static PyObject* mlcc_get_labels(PyObject* self){ PyObject *pylist; RectObject* o = (RectObject*)self; std::vector labels; ((MlCc*)o->m_x)->get_labels(labels); pylist = PyList_New(labels.size()); for (size_t i=0; i >(*mlcc, offset, dim); return create_ImageObject(mlcc_new); } static PyObject* mlcc_copy(PyObject* self, PyObject* args){ int num_args = PyTuple_GET_SIZE(args); RectObject* o = (RectObject*)self; MlCc* mlcc=(MlCc*)o->m_x; if (num_args == 2) { PyObject *a, *b; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO", &a, &b)) { Point point_a; try { point_a = coerce_Point(a); } catch (std::invalid_argument e) { goto phase2; } try { Point point_b = coerce_Point(b); int nrows = point_b.y() - point_a.y() + 1; int ncols = point_b.x() - point_a.x() + 1; return _mlcc_copy(mlcc, point_a, Dim(ncols, nrows)); } catch (std::invalid_argument e) { PyErr_Clear(); if (is_SizeObject(b)) { Size* size_b = ((SizeObject*)b)->m_x; int nrows = size_b->height() + 1; int ncols = size_b->width() + 1; return _mlcc_copy(mlcc, point_a, Dim(ncols, nrows)); } else if (is_DimObject(b)) { Dim* dim_b = ((DimObject*)b)->m_x; return _mlcc_copy(mlcc, point_a, *dim_b); } } } } phase2: PyErr_Clear(); if (num_args == 3) { PyObject* pyrect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &pyrect)) { if (is_RectObject(pyrect)) { Rect* rect = ((RectObject*)pyrect)->m_x; return _mlcc_copy(mlcc, rect->origin(), rect->dim()); } } } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to MlCc constructor. See the MlCc docstring for valid arguments."); return 0; } static PyObject* mlcc_get_neighbors(PyObject* self){ PyObject *pylist, *tuple; RectObject* o = (RectObject*)self; std::vector neighbors; ((MlCc*)o->m_x)->get_neighbors(neighbors); pylist = PyList_New(neighbors.size()/2); for (size_t i=0; im_x)->has_label(PyInt_AS_LONG(v))){ Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* mlcc_relabel(PyObject* self, PyObject* args){ RectObject* o = (RectObject*)self; PyObject* pyList; int outer_size; bool error=false; bool listOfList=false; //used as a trick to "overload" the function. The return value also depends from this value. std::vector* > labelVector; std::vector mlccs; if (!PyArg_ParseTuple(args, "O", &pyList)){ PyErr_SetString(PyExc_TypeError, "no argument given."); error=true; goto tidyUp; } if (!PyList_Check(pyList)){ PyErr_SetString(PyExc_TypeError, "argument has to be a list."); error=true; goto tidyUp; } outer_size=PyList_Size(pyList); if(outer_size==0){ PyErr_SetString(PyExc_TypeError, "argument (list) has to contain further values (lists/integers)."); error=true; goto tidyUp; } if(!PyList_Check(PyList_GetItem(pyList,0))){ //if first inner element is not a list assume, that the given argument is a list of labels IntVector* labels=new IntVector(); labelVector.push_back(labels); for (int i=0; ipush_back(PyInt_AS_LONG(label)); } else { PyErr_SetString(PyExc_TypeError, "label values have to be int values."); error=true; goto tidyUp; } } } else { listOfList=true; for (int i=0; ipush_back(PyInt_AS_LONG(label)); } else { PyErr_SetString(PyExc_TypeError, "label values have to be int values."); error=true; goto tidyUp; } } } else { PyErr_SetString(PyExc_TypeError, "one of the inner elements is not a list."); error=true; goto tidyUp; } } } try{ ((MlCc*)o->m_x)->relabel(labelVector, mlccs); } catch (std::exception& e) { error=true; PyErr_SetString(PyExc_RuntimeError, e.what()); goto tidyUp; } pyList = PyList_New(mlccs.size()); for (size_t i = 0; i < mlccs.size(); i++){ PyObject* retVal=create_ImageObject(mlccs[i]); PyList_SetItem(pyList, i, retVal); } tidyUp: for (size_t i=0; im_parent); RectObject* rectObject=&(imageObject->m_parent); Image* mlcc=(((Cc*)rectObject->m_x)->convert_to_mlcc()); PyObject* retVal=create_ImageObject(mlcc); return retVal; } static PyObject* mlcc_convert_to_cc_list(PyObject* self){ CCObject* ccObject=(CCObject*)self; ImageObject* imageObject=&(ccObject->m_parent); RectObject* rectObject=&(imageObject->m_parent); std::list* ccs=(((MlCc*)rectObject->m_x)->convert_to_cc_list()); PyObject* pylist = PyList_New(ccs->size()); std::list::iterator it = ccs->begin(); for (size_t i = 0; i < ccs->size(); ++i, ++it) { PyObject *item = create_ImageObject(*it); PyList_SetItem(pylist, i, item); } delete ccs; return pylist; } static PyObject* mlcc_convert_to_cc(PyObject* self){ CCObject* ccObject=(CCObject*)self; ImageObject* imageObject=&(ccObject->m_parent); RectObject* rectObject=&(imageObject->m_parent); Image* cc=(((MlCc*)rectObject->m_x)->convert_to_cc()); PyObject* retVal=create_ImageObject(cc); return retVal; } static PyObject* _mlcc_new(PyTypeObject* pytype, PyObject* py_src, int label, const Point& offset, const Dim& dim) { if (!is_ImageObject(py_src)) { PyErr_SetString(PyExc_TypeError, "First argument to the MlCc constructor must be an Image (or SubImage)."); return NULL; } int pixel, format; ImageObject* src = (ImageObject*)py_src; pixel = ((ImageDataObject*)src->m_data)->m_pixel_type; format = ((ImageDataObject*)src->m_data)->m_storage_format; Rect* mlcc = NULL; try { if (pixel != ONEBIT) { PyErr_SetString(PyExc_TypeError, "MlCc objects may only be created from ONEBIT Images."); return NULL; } if (format == DENSE) { ImageData* data = ((ImageData*)((ImageDataObject*)src->m_data)->m_x); mlcc = (Rect*)new MultiLabelCC >(*data, label, offset, dim); } else if (format == RLE) { PyErr_SetString(PyExc_TypeError, "MultiLabelCCs cannot be used with runline length encoding."); return NULL; } else { PyErr_SetString(PyExc_TypeError, "Unknown pixel type/storage format combination. Receiving this error indicates an internal inconsistency or memory corruption. Please report it on the Gamera mailing list."); return NULL; } } catch (std::exception& e) { delete mlcc; PyErr_SetString(PyExc_RuntimeError, e.what()); return NULL; } ImageObject* o; o = (ImageObject*)pytype->tp_alloc(pytype, 0); ((RectObject*)o)->m_x = mlcc; o->m_data = ((ImageObject*)py_src)->m_data; Py_INCREF(o->m_data); // set the resolution ((Image*)((RectObject*)o)->m_x)->resolution(((Image*)((RectObject*)py_src)->m_x)->resolution()); return init_image_members(o); } PyObject* mlcc_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); PyObject* image = NULL; if (num_args == 1) { // create MLCC from list of CCs PyObject *cclist; size_t n, N; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &cclist)) { if (!PyList_Check(cclist)) { PyErr_SetString(PyExc_TypeError, "MlCc objects must be constructed from a Cc list."); return 0; } N = PyList_Size(cclist); for (n=0; nm_x); for (n=1; nm_x); if(mlcc->data()!=cc->data()){ //check if every Cc has the same image Py_DECREF(py_mlcc); //free memory on error PyErr_SetString(PyExc_TypeError, "All Ccs have to be a part of the same image."); return 0; } mlcc->add_label(cc->label(),*cc); } return py_mlcc; } } if (num_args == 4) { PyObject *a, *b; int label; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OiOO", &image, &label, &a, &b)) { Point point_a; try { point_a = coerce_Point(a); } catch (std::invalid_argument e) { goto phase2; } try { Point point_b = coerce_Point(b); int nrows = point_b.y() - point_a.y() + 1; int ncols = point_b.x() - point_a.x() + 1; return _mlcc_new(pytype, image, label, point_a, Dim(ncols, nrows)); } catch (std::invalid_argument e) { PyErr_Clear(); if (is_SizeObject(b)) { Size* size_b = ((SizeObject*)b)->m_x; int nrows = size_b->height() + 1; int ncols = size_b->width() + 1; return _mlcc_new(pytype, image, label, point_a, Dim(ncols, nrows)); } else if (is_DimObject(b)) { Dim* dim_b = ((DimObject*)b)->m_x; return _mlcc_new(pytype, image, label, point_a, *dim_b); } #ifdef GAMERA_DEPRECATED else if (is_DimensionsObject(b)) { if (send_deprecation_warning( "MlCc(image, label, Point offset, Dimensions dimensions) is deprecated.\n\n" "Reason: (x, y) coordinate consistency. (Dimensions is now deprecated \n" "in favor of Dim).\n\n" "Use MlCc(image, label, (offset_x, offset_y), Dim(ncols, nrows)) instead.", "imageobject.cpp", __LINE__) == 0) return 0; Dimensions* dim_b = ((DimensionsObject*)b)->m_x; int nrows = dim_b->nrows(); int ncols = dim_b->ncols(); return _mlcc_new(pytype, image, label, point_a, Dim(ncols, nrows)); } #endif } } } phase2: PyErr_Clear(); if (num_args == 3) { int label; PyObject* pyrect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OiO", &image, &label, &pyrect)) { if (is_RectObject(pyrect)) { Rect* rect = ((RectObject*)pyrect)->m_x; return _mlcc_new(pytype, image, label, rect->origin(), rect->dim()); } } } #ifdef GAMERA_DEPRECATED PyErr_Clear(); if (num_args == 6) { int offset_y, offset_x, nrows, ncols, label; if (PyArg_ParseTuple(args, "Oiiiii", &image, &label, &offset_y, &offset_x, &nrows, &ncols) > 0) { if (send_deprecation_warning( "MlCc(image, label, offset_y, offset_x, nrows, ncols) is deprecated.\n\n" "Reason: (x, y) coordinate consistency.\n\n" "Use MlCc(image, label, (offset_x, offset_y), Dim(ncols, nrows)) instead.", "imageobject.cpp", __LINE__) == 0) return 0; return _mlcc_new(pytype, image, label, Point(offset_x, offset_y), Dim(ncols, nrows)); } } #endif PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to MlCc constructor. See the MlCc docstring for valid arguments."); return 0; } static PyObject* mlcc_richcompare(PyObject* a, PyObject* b, int op) { if (!is_ImageObject(a) || !is_ImageObject(b)) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Image& ap = *(Image*)((RectObject*)a)->m_x; Image& bp = *(Image*)((RectObject*)b)->m_x; /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_EQ: if (!is_MLCCObject(a) || !is_MLCCObject(b)) cmp = false; else { MlCc& ac = *(MlCc*)((RectObject*)a)->m_x; MlCc& bc = *(MlCc*)((RectObject*)b)->m_x; cmp=true; std::vector labels; ac.get_labels(labels); for(size_t i=0; im_x; MlCc& bc = *(MlCc*)((RectObject*)b)->m_x; cmp=true; std::vector labels; ac.get_labels(labels); for(size_t i=0; im_fp_dealloc))(so); self->ob_type->tp_free(self); } PyObject* iterator_get_iter(PyObject* self) { Py_INCREF(self); return self; } PyObject* iterator_next(PyObject* self) { IteratorObject* so = (IteratorObject*)self; PyObject* result = (*(so->m_fp_next))(so); if (result == NULL) { PyErr_SetString(PyExc_StopIteration, ""); return 0; } return result; } void init_IteratorType(PyObject* module_dict) { IteratorType.ob_type = &PyType_Type; IteratorType.tp_name = CHAR_PTR_CAST "gamera.Iterator"; IteratorType.tp_basicsize = sizeof(IteratorObject); IteratorType.tp_dealloc = iterator_dealloc; IteratorType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; IteratorType.tp_getattro = PyObject_GenericGetAttr; IteratorType.tp_alloc = NULL; // PyType_GenericAlloc; IteratorType.tp_free = NULL; // _PyObject_Del; IteratorType.tp_iter = iterator_get_iter; IteratorType.tp_iternext = iterator_next; PyType_Ready(&IteratorType); PyDict_SetItemString(module_dict, "Iterator", (PyObject*)&IteratorType); } gamera-3.3.3/src/kdtreemodule.cpp0000644000076500000000000003605211652050141015722 0ustar chriswheel/* * * Copyright (C) 2009 Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include "gameramodule.hpp" #include "geostructs/kdtree.hpp" // these classes are used from kdtree.hpp: //using Gamera::Kdtree::KdTree; //using Gamera::Kdtree::KdNode; //using Gamera::Kdtree::KdNodePredicate; //using Gamera::Kdtree::KdNodeVector; //using Gamera::Kdtree::CoordPoint; //using Gamera::Kdtree::DoubleVector; //====================================================================== // interface for KdNode class //====================================================================== struct KdNodeObject { PyObject_HEAD PyObject* point; PyObject* data; }; extern "C" { static PyObject* kdnode_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void kdnode_dealloc(PyObject* self); static PyObject* kdnode_get_point(PyObject* self); static PyObject* kdnode_get_data(PyObject* self); } static PyTypeObject KdNodeType = { PyObject_HEAD_INIT(NULL) 0, }; static PyObject* kdnode_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { KdNodeObject* self; size_t n, i; PyObject* point; PyObject* data = NULL; PyObject* sequence; PyObject* entry; // do some plausibility checks if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O|O:kdnode_new", &sequence, &data) <= 0) return 0; if(!PySequence_Check(sequence)) { PyErr_SetString(PyExc_RuntimeError, "KdNode: given point must be sequence of numbers"); return 0; } n = PySequence_Size(sequence); if (0 == n) { PyErr_SetString(PyExc_RuntimeError, "KdNode: given point list must not be empty"); return 0; } point = PySequence_List(sequence); for(i=0;ipoint = point; if (data) Py_INCREF(data); self->data = data; return (PyObject*)self; } static void kdnode_dealloc(PyObject* self) { PyObject* data = ((KdNodeObject*)self)->data; PyObject* point = ((KdNodeObject*)self)->point; Py_DECREF(point); if (data) { Py_DECREF(data); } self->ob_type->tp_free(self); } static PyObject* kdnode_get_point(PyObject* self) { KdNodeObject* so = (KdNodeObject*)self; Py_INCREF(so->point); return so->point; } static PyObject* kdnode_get_data(PyObject* self) { KdNodeObject* so = (KdNodeObject*)self; if (so->data) { Py_INCREF(so->data); return so->data; } else { Py_INCREF(Py_None); return Py_None; } } PyMethodDef kdnode_methods[] = { { NULL } }; PyGetSetDef kdnode_getset[] = { { (char *)"point", (getter)kdnode_get_point, 0, (char *)"geometric point of the kd-node", 0 }, { (char *)"data", (getter)kdnode_get_data, 0, (char *)"data stroed with the kd-node", 0 }, { NULL } }; void init_KdNodeType(PyObject* d) { KdNodeType.ob_type = &PyType_Type; KdNodeType.tp_name = CHAR_PTR_CAST "gamera.kdtree.KdNode"; KdNodeType.tp_basicsize = sizeof(KdNodeObject); KdNodeType.tp_dealloc = kdnode_dealloc; KdNodeType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; KdNodeType.tp_new = kdnode_new; KdNodeType.tp_getattro = PyObject_GenericGetAttr; KdNodeType.tp_alloc = NULL; // PyType_GenericAlloc; KdNodeType.tp_free = NULL; // _PyObject_Del; KdNodeType.tp_methods = kdnode_methods; KdNodeType.tp_getset = kdnode_getset; KdNodeType.tp_weaklistoffset = 0; KdNodeType.tp_doc = CHAR_PTR_CAST "**KdNode** (*point*, *data* = ``None``)\n\n" \ "The ``KdNode`` constructor creates a new node for use in a kd-tree.\n\n" \ "*point* must not be of the Gamera data type ``Point``, but a sequence of numerical values. The optional parameter *data* can be used to store arbitrary additonal information connected to the location *point*."; PyType_Ready(&KdNodeType); PyDict_SetItemString(d, "KdNode", (PyObject*)&KdNodeType); } //====================================================================== // interface for KdTree class //====================================================================== struct KdTreeObject { PyObject_HEAD size_t dimension; Kdtree::KdTree* tree; // the nodes are stored in the property kdnode.data // of the nodes in tree->allnodes }; extern "C" { static PyObject* kdtree_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void kdtree_dealloc(PyObject* self); static PyObject* kdtree_get_dimension(PyObject* self); } static PyTypeObject KdTreeType = { PyObject_HEAD_INIT(NULL) 0, }; static PyObject* kdtree_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { KdTreeObject* self; int distance_type=2; size_t i,j,n,dimension; PyObject* list = NULL; PyObject *obj1,*obj2; Kdtree::KdNodeVector nodes4tree; // do some plausibility checks and extract basic properties if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O|i:kdtree_new", &list, &distance_type) <= 0) return 0; if(!PyList_Check(list)) { PyErr_SetString(PyExc_RuntimeError, "KdTree: given nodes must be list of KdNode's"); return 0; } n = PyList_Size(list); if (0 == n) { PyErr_SetString(PyExc_RuntimeError, "KdTree: Given node list must not be empty"); return 0; } obj1 = PyList_GetItem(list,0); if (!PyObject_TypeCheck(obj1, &KdNodeType)) { PyErr_SetString(PyExc_RuntimeError, "KdTree: given nodes must be list of KdNode's"); return 0; } // constructor of KdNode does a number of plausi checks on property point // => the following two lines should be guaranteed to work obj2 = PyObject_GetAttrString(obj1,"point"); dimension = PyList_Size(obj2); Py_DECREF(obj2); // prepare nodes for C++ class kdtree Kdtree::CoordPoint p(dimension); for (i=0; idimension = dimension; self->tree = new Kdtree::KdTree(&nodes4tree,distance_type); return (PyObject*)self; } static void kdtree_dealloc(PyObject* self) { size_t i; Kdtree::KdTree* tree = ((KdTreeObject*)self)->tree; for (i=0; iallnodes.size(); i++) { Py_DECREF((PyObject*)tree->allnodes[i].data); } delete tree; self->ob_type->tp_free(self); } static PyObject* kdtree_get_dimension(PyObject* self) { KdTreeObject* so = (KdTreeObject*)self; return PyInt_FromLong((long)(so->dimension)); } static PyObject* kdtree_set_distance(PyObject* self, PyObject* args) { KdTreeObject* so = (KdTreeObject*)self; int distance_type; size_t n,i; PyObject* weights = NULL; PyObject* entry; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "i|O", &distance_type, &weights) <= 0) { return 0; } Kdtree::DoubleVector wvector(so->dimension, 1.0); if (weights) { if(!PySequence_Check(weights)) { PyErr_SetString(PyExc_RuntimeError, "KdTree.set_distance: weights must be list of floats"); return 0; } n = PySequence_Size(weights); if (n != so->dimension) { PyErr_SetString(PyExc_RuntimeError, "KdTree.set_distance: weight list must have length of KdTree.dimension"); return 0; } // copy over input data for(i=0;itree->set_distance(distance_type, &wvector); Py_INCREF(Py_None); return Py_None; } // helper class for passing over search predicate to k_nearest_neighbor struct KdNodePredicate_Py : public Gamera::Kdtree::KdNodePredicate { PyObject* pyfunctor; KdNodePredicate_Py(PyObject* pf) { pyfunctor = pf; Py_INCREF(pf); } ~KdNodePredicate_Py() { Py_DECREF(pyfunctor); } bool operator()(const Gamera::Kdtree::KdNode& kn) const { // remember that complete python KdNode object is stored // in KdNode.data in the C++ KdTree => we can easily // extract it and pass it to comparison function PyObject *result; bool retval; //printf("KdNodePredicate_Py called\n"); result = PyObject_CallFunctionObjArgs(pyfunctor,(PyObject*)kn.data,NULL); retval = PyObject_IsTrue(result); Py_DECREF(result); return retval; } }; static PyObject* kdtree_k_nearest_neighbors(PyObject* self, PyObject* args) { KdTreeObject* so = (KdTreeObject*)self; Kdtree::CoordPoint point(so->dimension); PyObject *list, *entry; PyObject *predicate = NULL; int k; size_t i,n; Kdtree::KdNodeVector result; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "Oi|O", &list, &k, &predicate) <= 0) { return 0; } if (predicate && !PyCallable_Check(predicate)) { PyErr_SetString(PyExc_RuntimeError, "KdTree.k_nearest_neighbor: search predicate must be callable"); return 0; } if(!PySequence_Check(list)) { PyErr_SetString(PyExc_RuntimeError, "KdTree.k_nearest_neighbor: given point must be list or tuple of numbers"); return 0; } n = PySequence_Size(list); if (n != so->dimension) { PyErr_SetString(PyExc_RuntimeError, "KdTree.k_nearest_neighbor: given point must have same dimension as KdTree"); return 0; } // copy over input data for(i=0;itree->k_nearest_neighbors(point, (size_t)k, &result, &searchpredicate); } else { so->tree->k_nearest_neighbors(point, (size_t)k, &result); } // copy over result data list = PyList_New(result.size()); for (i=0; i #include #include #include #include #include #include // for ga optimization #include #include #include #include // for rand #include #include using namespace Gamera; using namespace Gamera::kNN; extern "C" { DL_EXPORT(void) initknncore(void); // Construction/destruction static PyObject* knn_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void knn_dealloc(PyObject* self); static PyObject* knn_instantiate_from_images(PyObject* self, PyObject* args); // classification static PyObject* knn_classify(PyObject* self, PyObject* args); static PyObject* knn_classify_with_images(PyObject* self, PyObject* args); static PyObject* knn_leave_one_out(PyObject* self, PyObject* args); // distance static PyObject* knn_knndistance_statistics(PyObject* self, PyObject* args); static PyObject* knn_distance_from_images(PyObject* self, PyObject* args); static PyObject* knn_distance_between_images(PyObject* self, PyObject* args); static PyObject* knn_distance_matrix(PyObject* self, PyObject* args); static PyObject* knn_unique_distances(PyObject* self, PyObject* args); // settings static PyObject* knn_get_num_k(PyObject* self); static int knn_set_num_k(PyObject* self, PyObject* v); static PyObject* knn_get_distance_type(PyObject* self); static int knn_set_distance_type(PyObject* self, PyObject* v); static PyObject* knn_get_confidence_types(PyObject* self); static int knn_set_confidence_types(PyObject* self, PyObject* v); static PyObject* knn_get_weights(PyObject* self, PyObject* args); static PyObject* knn_set_weights(PyObject* self, PyObject* args); static PyObject* knn_get_num_features(PyObject* self); static int knn_set_num_features(PyObject* self, PyObject* v); // saving/loading static PyObject* knn_serialize(PyObject* self, PyObject* args); static PyObject* knn_unserialize(PyObject* self, PyObject* args); // GA for optimization static PyObject* knn_ga_create(PyObject* self, PyObject* args); static PyObject* knn_ga_destroy(PyObject* self, PyObject* args); static PyObject* knn_ga_step(PyObject* self, PyObject* args); static PyObject* knn_get_ga_mutation(PyObject* self); static int knn_set_ga_mutation(PyObject* self, PyObject* v); static PyObject* knn_get_ga_crossover(PyObject* self); static int knn_set_ga_crossover(PyObject* self, PyObject* v); static PyObject* knn_get_ga_population(PyObject* self); static int knn_set_ga_population(PyObject* self, PyObject* v); } static PyTypeObject KnnType = { PyObject_HEAD_INIT(NULL) 0, }; /* The KnnObject holds all of the information needed by knn. Unlike many of the parts of Gamera, there is a significant amount of functionality implemented in this module rather than just a wrapper around a C++ objects/code. */ struct KnnObject { PyObject_HEAD // the number of features in each feature vector size_t num_features; // the total number of feature vectors stored in the database size_t num_feature_vectors; /* The feature vectors. A flat array of doubles (of size num_features * num_feature_vectors) is used to store the feature vectors for performance reasons (the memory access will be faster than using a multi-dimensional data structure). This does not complicate the implementation because this array is a fixed size (it is only used for non-interactive classification). */ double* feature_vectors; // The id_names for the feature vectors char** id_names; // confidence types to be computed during classification std::vector confidence_types; // The current weights applied to the distance calculation double* weight_vector; // a histogram of the id_names for use in leave-one-out int* id_name_histogram; /* The normalization applied to the feature vectors prior to distance calculation. */ Normalize* normalize; /* Temporary storage for the normalized version of the unknown feature vector. This is simply to avoid allocating memory for each call to classify (and could potentially increase our cache hit rate, but who really knows). */ double* normalized_unknown; // k - this is k-NN after all size_t num_k; // the distance type currently being used. DistanceType distance_type; /* GA */ GA1DArrayGenome* genome; GASteadyStateGA* ga; size_t ga_population; double ga_mutation; double ga_crossover; bool ga_running; }; PyMethodDef knn_methods[] = { { (char *)"classify_with_images", knn_classify_with_images, METH_VARARGS, (char *)"classify an unknown image using a list of images." }, { (char *)"instantiate_from_images", knn_instantiate_from_images, METH_VARARGS, (char *)"Use the list of images for non-interactive classification." }, { (char *)"_distance_from_images", knn_distance_from_images, METH_VARARGS, (char *)"" }, { (char *)"_distance_between_images", knn_distance_between_images, METH_VARARGS, (char *)"" }, { (char *)"_distance_matrix", knn_distance_matrix, METH_VARARGS, (char *)"" }, { (char *)"_unique_distances", knn_unique_distances, METH_VARARGS, (char *)"" }, { (char *)"set_weights", knn_set_weights, METH_VARARGS, (char *)"Set the weights used for classification." }, { (char *)"get_weights", knn_get_weights, METH_VARARGS, (char *)"Get the weights used for classification." }, { (char *)"classify", knn_classify, METH_VARARGS, (char *)"" }, { (char *)"leave_one_out", knn_leave_one_out, METH_VARARGS, (char *)"" }, { (char *)"_knndistance_statistics", knn_knndistance_statistics, METH_VARARGS, (char *)"" }, { (char *)"serialize", knn_serialize, METH_VARARGS, (char *)"" }, { (char *)"unserialize", knn_unserialize, METH_VARARGS, (char *)"" }, { (char *)"_ga_create", knn_ga_create, METH_VARARGS, (char *)"" }, { (char *)"_ga_destroy", knn_ga_destroy, METH_VARARGS, (char *)"" }, { (char *)"_ga_step", knn_ga_step, METH_VARARGS, (char *)"" }, { NULL } }; PyGetSetDef knn_getset[] = { { (char *)"num_k", (getter)knn_get_num_k, (setter)knn_set_num_k, (char *)"The value of k used for classification.", 0 }, { (char *)"distance_type", (getter)knn_get_distance_type, (setter)knn_set_distance_type, (char *)"The type of distance calculation used.", 0 }, { (char *)"confidence_types", (getter)knn_get_confidence_types, (setter)knn_set_confidence_types, (char *)"The types of confidences computed during classification.", 0 }, { (char *)"ga_mutation", (getter)knn_get_ga_mutation, (setter)knn_set_ga_mutation, (char *)"The mutation rate for GA optimization.", 0 }, { (char *)"ga_crossover", (getter)knn_get_ga_crossover, (setter)knn_set_ga_crossover, (char *)"The crossover rate for GA optimization.", 0 }, { (char *)"ga_population", (getter)knn_get_ga_population, (setter)knn_set_ga_population, (char *)"The population for GA optimization.", 0 }, { (char *)"num_features", (getter)knn_get_num_features, (setter)knn_set_num_features, (char *)"The current number of features.", 0 }, { NULL } }; static PyObject* array_init; /* Convenience function to delete all of the dynamic data used for classification. */ static void knn_delete_feature_data(KnnObject* o) { if (o->feature_vectors != 0) { delete[] o->feature_vectors; o->feature_vectors = 0; } if (o->id_names != 0) { for (size_t i = 0; i < o->num_feature_vectors; ++i) { if (o->id_names[i] != 0) delete[] o->id_names[i]; } delete[] o->id_names; o->id_names = 0; } if (o->id_name_histogram != 0) { delete[] o->id_name_histogram; o->id_name_histogram = 0; } o->num_feature_vectors = 0; } static void set_num_features(KnnObject* o, size_t num_features) { if (num_features == o->num_features) return; /* To prevent things from being in an unsafe state we delete all of the feature data if the number of features has changed. */ knn_delete_feature_data(o); o->num_features = num_features; if (o->weight_vector != 0) delete[] o->weight_vector; o->weight_vector = new double[o->num_features]; std::fill(o->weight_vector, o->weight_vector + o->num_features, 1.0); if (o->normalize != 0) delete o->normalize; o->normalize = new Normalize(o->num_features); if (o->normalized_unknown != 0) delete[] o->normalized_unknown; o->normalized_unknown = new double[o->num_features]; } /* Create a new kNN object and initialize all of the data. */ static PyObject* knn_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { KnnObject* o; o = (KnnObject*)pytype->tp_alloc(pytype, 0); /* Initialize knn */ o->num_features = 0; o->num_feature_vectors = 0; o->feature_vectors = 0; o->id_names = 0; o->id_name_histogram = 0; o->weight_vector = 0; o->normalize = 0; o->normalized_unknown = 0; o->num_k = 1; o->distance_type = CITY_BLOCK; o->confidence_types.push_back(CONFIDENCE_DEFAULT); /* Initialize the ga */ o->ga_running = false; o->ga = 0; o->genome = 0; o->ga_population = 20; o->ga_mutation = 0.01; o->ga_crossover = 0.6; Py_INCREF(Py_None); return (PyObject*)o; } /* Create and initialize all of the classification data with the given number of features and number of feature vectors. Throughout this object it is assumed that the number of feature vectors is fixed. This is reasonable because if you need to classify using a changing set of known images classify_with_images is a much easier choice. Because we can assume a fixed number of feature vectors it makes allocation easier and also allows certain features (like normalization) to become a lot easier. */ static int knn_create_feature_data(KnnObject* o, size_t num_feature_vectors) { try { o->num_feature_vectors = num_feature_vectors; assert(o->num_feature_vectors > 0); o->feature_vectors = new double[o->num_features * o->num_feature_vectors]; o->id_names = new char*[o->num_feature_vectors]; for (size_t i = 0; i < o->num_feature_vectors; ++i) o->id_names[i] = 0; o->id_name_histogram = new int[o->num_feature_vectors]; } catch (std::exception e) { PyErr_SetString(PyExc_RuntimeError, e.what()); return -1; } return 1; } // destructor for Python static void knn_dealloc(PyObject* self) { KnnObject* o = (KnnObject*)self; knn_delete_feature_data(o); if (o->weight_vector != 0) delete[] o->weight_vector; if (o->normalize != 0) delete o->normalize; if (o->normalized_unknown != 0) delete[] o->normalized_unknown; self->ob_type->tp_free(self); } /* String comparison functors used by the kNearestNeighbors object */ struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } }; struct eqstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) == 0; } }; /* Take a list of images from Python and instatiate the internal data structures for knn - this is used for non-interactive classification using the classify method. The major difference between interactive classification and non-interactive classification (other than speed) is that the data is normalized for non-interactive classification. The feature vectors are normalized in place ahead of time, so when the classifier is serialized the data is saved normalized. This is appropriate because non-interactive classifiers cannot have feature vectors added or deleted by definition. */ static PyObject* knn_instantiate_from_images(PyObject* self, PyObject* args) { PyObject* images; KnnObject* o = (KnnObject*)self; if (o->ga_running == true) { PyErr_SetString(PyExc_RuntimeError, "knn: cannot call while ga is active."); return 0; } if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &images) <= 0) { return 0; } /* Unlike classify_with_images this method requires a list so that the size can be known ahead of time. One of the advantages of the non-interactive classifier is that the data structures can be more static, so knowing the size ahead of time is _much_ easier. */ PyObject* images_seq = PySequence_Fast(images, "First argument must be iterable"); if (images_seq == NULL) return 0; // delete all the feature data and initialize the object knn_delete_feature_data(o); if (o->normalize != 0) delete o->normalize; o->normalize = new Normalize(o->num_features); int images_size = PySequence_Fast_GET_SIZE(images_seq); if (images_size == 0) { PyErr_SetString(PyExc_ValueError, "Initial database of a non-interactive kNN classifier must have at least one element."); Py_DECREF(images_seq); return 0; } /* Create all of the data */ if (knn_create_feature_data(o, images_size) < 0) { Py_DECREF(images_seq); return 0; } /* Copy the id_names and the features to the internal data structures. */ double* tmp_fv; Py_ssize_t tmp_fv_len; std::map id_name_histogram; double* current_features = o->feature_vectors; for (size_t i = 0; i < o->num_feature_vectors; ++i, current_features += o->num_features) { PyObject* cur_image = PySequence_Fast_GET_ITEM(images_seq, i); if (image_get_fv(cur_image, &tmp_fv, &tmp_fv_len) < 0) { knn_delete_feature_data(o); PyErr_SetString(PyExc_ValueError, "knn: could not get features from image"); goto error; } if (size_t(tmp_fv_len) != o->num_features) { knn_delete_feature_data(o); PyErr_SetString(PyExc_ValueError, "knn: feature vector lengths don't match"); goto error; } std::copy(tmp_fv, tmp_fv + o->num_features, current_features); o->normalize->add(tmp_fv, tmp_fv + o->num_features); char* tmp_id_name = NULL; int len = 0; if (image_get_id_name(cur_image, &tmp_id_name, &len) < 0) { knn_delete_feature_data(o); PyErr_SetString(PyExc_ValueError, "knn: could not get id name"); goto error; } o->id_names[i] = new char[len + 1]; strncpy(o->id_names[i], tmp_id_name, len + 1); id_name_histogram[o->id_names[i]]++; } /* Apply the normalization and store the histogram data for fast access in leave-one-out. */ o->normalize->compute_normalization(); current_features = o->feature_vectors; for (size_t i = 0; i < o->num_feature_vectors; ++i, current_features += o->num_features) { o->normalize->apply(current_features, current_features + o->num_features); o->id_name_histogram[i] = id_name_histogram[o->id_names[i]]; } Py_DECREF(images_seq); Py_INCREF(Py_None); return Py_None; error: Py_DECREF(images_seq); return 0; } /* non-interactive classification using the data created by instantiate from images. */ static PyObject* knn_classify(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; if (o->ga_running == true) { PyErr_SetString(PyExc_RuntimeError, "knn: cannot call while ga is active."); return 0; } if (o->feature_vectors == 0) { PyErr_SetString(PyExc_RuntimeError, "knn: classify called before instantiate from images"); return 0; } PyObject* unknown; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &unknown) <= 0) { return 0; } if (!is_ImageObject(unknown)) { PyErr_SetString(PyExc_TypeError, "knn: unknown must be an image"); return 0; } double* fv; Py_ssize_t fv_len; if (image_get_fv(unknown, &fv, &fv_len) < 0) { PyErr_SetString(PyExc_ValueError, "knn: could not get features"); return 0; } if (size_t(fv_len) != o->num_features) { PyErr_SetString(PyExc_ValueError, "knn: features not the correct size"); return 0; } // normalize the unknown o->normalize->apply(fv, fv + o->num_features, o->normalized_unknown); // create the kNN object kNearestNeighbors knn(o->num_k); knn.confidence_types = o->confidence_types; double* current_known = o->feature_vectors; for (size_t i = 0; i < o->num_feature_vectors; ++i, current_known += o->num_features) { double distance; if (o->distance_type == CITY_BLOCK) { distance = city_block_distance(current_known, current_known + o->num_features, o->normalized_unknown, o->weight_vector); } else if (o->distance_type == FAST_EUCLIDEAN) { distance = fast_euclidean_distance(current_known, current_known + o->num_features, o->normalized_unknown, o->weight_vector); } else { distance = euclidean_distance(current_known, current_known + o->num_features, o->normalized_unknown, o->weight_vector); } knn.add(o->id_names[i], distance); } knn.majority(); knn.calculate_confidences(); PyObject* ans_list = PyList_New(knn.answer.size()); for (size_t i = 0; i < knn.answer.size(); ++i) { // PyList_SET_ITEM steals references so this code only looks // like it leaks. KWM PyObject* ans = PyTuple_New(2); PyTuple_SET_ITEM(ans, 0, PyFloat_FromDouble(knn.answer[i].second)); PyTuple_SET_ITEM(ans, 1, PyString_FromString(knn.answer[i].first)); PyList_SET_ITEM(ans_list, i, ans); } PyObject* conf_dict = PyDict_New(); for (size_t i = 0; i < knn.confidence_types.size(); ++i) { PyObject* o1 = PyInt_FromLong(knn.confidence_types[i]); PyObject* o2 = PyFloat_FromDouble(knn.confidence[i]); PyDict_SetItem(conf_dict, o1, o2); Py_DECREF(o1); Py_DECREF(o2); } PyObject* result = PyTuple_New(2); PyTuple_SET_ITEM(result, 0, ans_list); PyTuple_SET_ITEM(result, 1, conf_dict); return result; } static PyObject* knn_classify_with_images(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; if (o->ga_running == true) { PyErr_SetString(PyExc_RuntimeError, "knn: cannot call while ga is active."); return 0; } PyObject* unknown, *iterator, *container; int cross_validation_mode = 0; int do_confidence = 1; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO|ii", &container, &unknown, &cross_validation_mode, &do_confidence) <= 0) { return 0; } iterator = PyObject_GetIter(container); if (iterator == NULL) { PyErr_SetString(PyExc_TypeError, "Known features must be iterable."); return 0; } if (!is_ImageObject(unknown)) { PyErr_SetString(PyExc_TypeError, "knn: unknown must be an image"); return 0; } double* unknown_buf; Py_ssize_t unknown_len; if (image_get_fv(unknown, &unknown_buf, &unknown_len) < 0) { PyErr_SetString(PyExc_ValueError, "knn: error getting feature vector \ (This is most likely because features have not been generated.)"); return 0; } if (size_t(unknown_len) != o->num_features) { PyErr_SetString(PyExc_RuntimeError, "knn: the number of features does not match."); return 0; } kNearestNeighbors knn(o->num_k); knn.confidence_types = o->confidence_types; PyObject* cur; while ((cur = PyIter_Next(iterator))) { if (!is_ImageObject(cur)) { PyErr_SetString(PyExc_TypeError, "knn: non-image in known list"); return 0; } if (cross_validation_mode && (cur == unknown)) continue; double distance; if (compute_distance(o->distance_type, cur, unknown_buf, &distance, o->weight_vector, unknown_len) < 0) { PyErr_SetString(PyExc_ValueError, "knn: error in distance calculation \ (This is most likely because features have not been generated.)"); return 0; } char* id_name; int len; if (image_get_id_name(cur, &id_name, &len) < 0) return 0; knn.add(id_name, distance); Py_DECREF(cur); } knn.majority(); if (do_confidence) knn.calculate_confidences(); PyObject* ans_list = PyList_New(knn.answer.size()); for (size_t i = 0; i < knn.answer.size(); ++i) { // PyList_SET_ITEM steal references so this code only looks // like it leaks. KWM PyObject* ans = PyTuple_New(2); PyTuple_SET_ITEM(ans, 0, PyFloat_FromDouble(knn.answer[i].second)); PyTuple_SET_ITEM(ans, 1, PyString_FromString(knn.answer[i].first)); PyList_SET_ITEM(ans_list, i, ans); } PyObject* conf_dict = PyDict_New(); if (do_confidence) { for (size_t i = 0; i < knn.confidence_types.size(); ++i) { PyObject* o1 = PyInt_FromLong(knn.confidence_types[i]); PyObject* o2 = PyFloat_FromDouble(knn.confidence[i]); PyDict_SetItem(conf_dict, o1, o2); Py_DECREF(o1); Py_DECREF(o2); } } PyObject* result = PyTuple_New(2); PyTuple_SET_ITEM(result, 0, ans_list); PyTuple_SET_ITEM(result, 1, conf_dict); return result; } static PyObject* knn_distance_from_images(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; if (o->ga_running == true) { PyErr_SetString(PyExc_TypeError, "knn: cannot call while ga is active."); return 0; } PyObject* unknown, *iterator; double maximum_distance = std::numeric_limits::max(); if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO|d", &iterator, &unknown, &maximum_distance) <= 0) { return 0; } if (!PyIter_Check(iterator)) { PyErr_SetString(PyExc_TypeError, "Known features must be iterable."); return 0; } if (!is_ImageObject(unknown)) { PyErr_SetString(PyExc_TypeError, "knn: unknown must be an image"); return 0; } double* unknown_buf, *weights; Py_ssize_t unknown_len; if (image_get_fv(unknown, &unknown_buf, &unknown_len) < 0) { PyErr_SetString(PyExc_ValueError, "knn: error getting feature vector \ (This is most likely because features have not been generated.)"); return 0; } weights = o->weight_vector; PyObject* cur; PyObject* distance_list = PyList_New(0); PyObject* tmp_val; while ((cur = PyIter_Next(iterator))) { if (!is_ImageObject(cur)) { PyErr_SetString(PyExc_TypeError, "knn: non-image in known list"); return 0; } double distance; if (compute_distance(o->distance_type, cur, unknown_buf, &distance, weights, unknown_len) < 0) { PyErr_SetString(PyExc_ValueError, "knn: error in distance calculation \ (This is most likely because features have not been generated.)"); return 0; } tmp_val = Py_BuildValue(CHAR_PTR_CAST "(fO)", distance, cur); if (distance < maximum_distance) if (PyList_Append(distance_list, tmp_val) < 0) return 0; Py_DECREF(tmp_val); Py_DECREF(cur); } return distance_list; } static PyObject* knn_distance_between_images(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; PyObject* imagea, *imageb; PyArg_ParseTuple(args, CHAR_PTR_CAST "OO", &imagea, &imageb); if (!is_ImageObject(imagea)) { PyErr_SetString(PyExc_TypeError, "knn: unknown must be an image"); return 0; } if (!is_ImageObject(imageb)) { PyErr_SetString(PyExc_TypeError, "knn: known must be an image"); return 0; } double distance = 0.0; compute_distance(o->distance_type, imagea, imageb, &distance, o->weight_vector, o->num_features); return Py_BuildValue(CHAR_PTR_CAST "f", distance); } /* Create a symmetric float matrix (image) containing all of the distances between the images in the list passed in. This is useful because it allows you to find the distance between any two pairs of images regardless of the order of the pairs. NOTE: the features are normalized before performing the distance calculations. */ PyObject* knn_distance_matrix(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; PyObject* images; PyObject* progress = 0; long normalize = 1; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O|Oi", &images, &progress, &normalize) <= 0) return 0; // images is a list of Gamera/Python ImageObjects PyObject* images_seq = PySequence_Fast(images, "First argument must be iterable."); if (images_seq == NULL) return 0; int images_len = PySequence_Fast_GET_SIZE(images_seq); if (!(images_len > 1)) { PyErr_SetString(PyExc_ValueError, "List must have at least two images."); Py_DECREF(images_seq); return 0; } // Check the number of features double* buf_a, *buf_b; Py_ssize_t len_a, len_b; PyObject* cur_a, *cur_b; cur_a = PySequence_Fast_GET_ITEM(images_seq, 0); if (!is_ImageObject(cur_a)) { PyErr_SetString(PyExc_TypeError, "knn: expected an image"); Py_DECREF(images_seq); return 0; } if (image_get_fv(cur_a, &buf_a, &len_a) < 0) { Py_DECREF(images_seq); return 0; } double* weights = o->weight_vector; if (len_a != (int)o->num_features) { PyErr_SetString(PyExc_ValueError, "knn: feature vector lengths don't match."); Py_DECREF(images_seq); return 0; } // create the normalization object double* tmp_a = new double[len_a]; double* tmp_b = new double[len_a]; FloatImageData* data = new FloatImageData(Dim(images_len, images_len)); FloatImageView* mat = new FloatImageView(*data); kNN::Normalize norm(len_a); for (int i = 0; i < images_len; ++i) { cur_a = PySequence_Fast_GET_ITEM(images_seq, i); if (cur_a == NULL) goto mat_error; if (!is_ImageObject(cur_a)) { PyErr_SetString(PyExc_TypeError, "knn: expected an image"); goto mat_error; } if (image_get_fv(cur_a, &buf_a, &len_a) < 0) goto mat_error; if (len_a != (int)o->num_features) { PyErr_SetString(PyExc_ValueError, "knn: feature vector lengths don't match."); goto mat_error; } if (normalize) norm.add(buf_a, buf_a + len_a); } if (normalize) norm.compute_normalization(); std::fill(mat->vec_begin(), mat->vec_end(), 0.0); // do the distance calculations for (int i = 0; i < images_len; ++i) { cur_a = PySequence_Fast_GET_ITEM(images_seq, i); if (cur_a == NULL) goto mat_error; if (image_get_fv(cur_a, &buf_a, &len_a) < 0) goto mat_error; if (normalize) norm.apply(buf_a, buf_a + len_a, tmp_a); for (int j = i + 1; j < images_len; ++j) { cur_b = PySequence_Fast_GET_ITEM(images_seq, j); if (cur_b == NULL) goto mat_error; if (image_get_fv(cur_b, &buf_b, &len_b) < 0) goto mat_error; if (normalize) norm.apply(buf_b, buf_b + len_b, tmp_b); double distance; if (normalize) compute_distance(o->distance_type, tmp_a, len_a, tmp_b, &distance, weights); else compute_distance(o->distance_type, buf_a, len_a, buf_b, &distance, weights); mat->set(Point(j, i), distance); mat->set(Point(i, j), distance); } if (progress) PyObject_CallObject(progress, NULL); } delete[] tmp_a; delete[] tmp_b; Py_DECREF(images_seq); return create_ImageObject(mat); mat_error: Py_DECREF(images_seq); // delete the image delete mat; delete data; // delete the tmp buffers delete[] tmp_a; delete[] tmp_b; return 0; } /* unique_distances takes a list of images and returns all of the unique pairs of distances between the images. */ PyObject* knn_unique_distances(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; PyObject* images; PyObject* progress; long normalize = 1; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO|i", &images, &progress, &normalize) <= 0) return 0; // images is a list of Gamera/Python ImageObjects PyObject* images_seq = PySequence_Fast(images, "First argument must be iterable."); if (images_seq == NULL) return 0; int images_len = PySequence_Fast_GET_SIZE(images_seq); if (!(images_len > 1)) { PyErr_SetString(PyExc_ValueError, "List must have at least two images."); Py_DECREF(images_seq); return 0; } // create the 'vector' for the output int list_len = ((images_len * images_len) - images_len) / 2; FloatImageData* data = new FloatImageData(Dim(list_len, 1)); FloatImageView* list = new FloatImageView(*data); // create a default set of weights for the distance calculation. double* buf_a, *buf_b; Py_ssize_t len_a, len_b; PyObject* cur_a, *cur_b; cur_a = PySequence_Fast_GET_ITEM(images_seq, 0); if (!is_ImageObject(cur_a)) { PyErr_SetString(PyExc_TypeError, "knn: expected an image"); Py_DECREF(images_seq); return 0; } if (image_get_fv(cur_a, &buf_a, &len_a) < 0) { Py_DECREF(images_seq); return 0; } double* weights = o->weight_vector; if (len_a != (int)o->num_features) { PyErr_SetString(PyExc_ValueError, "knn: feature vector lengths don't match."); Py_DECREF(images_seq); return 0; } // create the normalization object kNN::Normalize norm(len_a); for (int i = 0; i < images_len; ++i) { cur_a = PySequence_Fast_GET_ITEM(images_seq, i); if (!is_ImageObject(cur_a)) { PyErr_SetString(PyExc_TypeError, "knn: expected an image"); Py_DECREF(images_seq); return 0; } if (cur_a == NULL) { Py_DECREF(images_seq); return 0; } if (image_get_fv(cur_a, &buf_a, &len_a) < 0) { Py_DECREF(images_seq); return 0; } if (normalize) norm.add(buf_a, buf_a + len_a); } if (normalize) norm.compute_normalization(); double* tmp_a = new double[len_a]; double* tmp_b = new double[len_a]; // do the distance calculations size_t index = 0; for (int i = 0; i < images_len; ++i) { cur_a = PySequence_Fast_GET_ITEM(images_seq, i); if (cur_a == NULL) goto uniq_error; if (image_get_fv(cur_a, &buf_a, &len_a) < 0) goto uniq_error; if (normalize) norm.apply(buf_a, buf_a + len_a, tmp_a); for (int j = i + 1; j < images_len; ++j) { cur_b = PySequence_Fast_GET_ITEM(images_seq, j); if (cur_b == NULL) goto uniq_error; if (image_get_fv(cur_b, &buf_b, &len_b) < 0) goto uniq_error; if (len_a != len_b) { PyErr_SetString(PyExc_ValueError, "Feature vector lengths do not match!"); goto uniq_error; } if (normalize) norm.apply(buf_b, buf_b + len_b, tmp_b); double distance; if (normalize) compute_distance(o->distance_type, tmp_a, len_a, tmp_b, &distance, weights); else compute_distance(o->distance_type, buf_a, len_a, buf_b, &distance, weights); list->set(Point(index, 0), distance); index++; } // call the progress object PyObject_CallObject(progress, NULL); } delete[] tmp_a; delete[] tmp_b; return create_ImageObject(list); // in case of error uniq_error: delete[] tmp_a; delete[] tmp_b; delete list; delete data; return 0; } static PyObject* knn_get_num_k(PyObject* self) { return Py_BuildValue(CHAR_PTR_CAST "i", ((KnnObject*)self)->num_k); } static int knn_set_num_k(PyObject* self, PyObject* v) { if (!PyInt_Check(v)) { PyErr_SetString(PyExc_TypeError, "knn: expected an int."); return -1; } ((KnnObject*)self)->num_k = PyInt_AS_LONG(v); return 0; } static PyObject* knn_get_distance_type(PyObject* self) { return Py_BuildValue(CHAR_PTR_CAST "i", ((KnnObject*)self)->distance_type); } static int knn_set_distance_type(PyObject* self, PyObject* v) { if (!PyInt_Check(v)) { PyErr_SetString(PyExc_TypeError, "knn: expected an int."); return -1; } ((KnnObject*)self)->distance_type = (DistanceType)PyInt_AS_LONG(v); return 0; } static PyObject* knn_get_confidence_types(PyObject* self) { size_t n,i; PyObject* entry; KnnObject* o = ((KnnObject*)self); n = o->confidence_types.size(); PyObject* result = PyList_New(n); for (i=0; iconfidence_types[i]); PyList_SetItem(result, i, entry); } return result; } static int knn_set_confidence_types(PyObject* self, PyObject* list) { if(!PyList_Check(list)) { PyErr_SetString(PyExc_TypeError, "knn: confidence_types must be list."); return -1; } size_t n,i; int ct; PyObject* entry; KnnObject* o = ((KnnObject*)self); o->confidence_types.clear(); n = PyList_Size(list); for (i=0; iconfidence_types.push_back(ct); } return 0; } static std::pair leave_one_out(KnnObject* o, int stop_threshold, double* weight_vector = 0, std::vector* indexes = 0) { double* weights = weight_vector; if (weights == 0) weights = o->weight_vector; assert(o->feature_vectors != 0); kNearestNeighbors knn(o->num_k); int total_correct = 0; int total_queries = 0; if (indexes == 0) { for (size_t i = 0; i < o->num_feature_vectors; ++i) { // We don't want to do the calculation if there is no // hope that kNN will return the correct answer (because // there aren't enough examples in the database). if (o->id_name_histogram[i] < int((o->num_k + 0.5) / 2)) { continue; } double* current_known = o->feature_vectors; double* unknown = &o->feature_vectors[i * o->num_features]; for (size_t j = 0; j < o->num_feature_vectors; ++j, current_known += o->num_features) { if (i == j) continue; double distance; if (o->distance_type == CITY_BLOCK) { distance = city_block_distance(current_known, current_known + o->num_features, unknown, weights); } else if (o->distance_type == FAST_EUCLIDEAN) { distance = fast_euclidean_distance(current_known, current_known + o->num_features, unknown, weights); } else { distance = euclidean_distance(current_known, current_known + o->num_features, unknown, weights); } knn.add(o->id_names[j], distance); } knn.majority(); if (strcmp(knn.answer[0].first, o->id_names[i]) == 0) { total_correct++; } knn.reset(); total_queries++; if (total_queries - total_correct > stop_threshold) return std::make_pair(total_correct, total_queries); } } else { for (size_t i = 0; i < o->num_feature_vectors; ++i) { if (o->id_name_histogram[i] < int((o->num_k + 0.5) / 2)) continue; double* current_known = o->feature_vectors; double* unknown = &o->feature_vectors[i * o->num_features]; for (size_t j = 0; j < o->num_feature_vectors; ++j, current_known += o->num_features) { if (i == j) continue; double distance; if (o->distance_type == CITY_BLOCK) { distance = city_block_distance_skip(current_known, unknown, weights, indexes->begin(), indexes->end()); } else if (o->distance_type == FAST_EUCLIDEAN) { distance = fast_euclidean_distance_skip(current_known, unknown, weights, indexes->begin(), indexes->end()); } else { distance = euclidean_distance_skip(current_known, unknown, weights, indexes->begin(), indexes->end()); } knn.add(o->id_names[j], distance); } knn.majority(); if (strcmp(knn.answer[0].first, o->id_names[i]) == 0) { total_correct++; } knn.reset(); total_queries++; if (total_queries - total_correct > stop_threshold) return std::make_pair(total_correct, total_queries); } } return std::make_pair(total_correct, total_queries); } /* Leave-one-out cross validation */ static PyObject* knn_leave_one_out(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; PyObject* indexes = 0; int stop_threshold = std::numeric_limits::max(); if (PyArg_ParseTuple(args, CHAR_PTR_CAST "|Oi", &indexes, &stop_threshold) <= 0) return 0; if (o->feature_vectors == 0) { PyErr_SetString(PyExc_RuntimeError, "knn: leave_one_out called before instantiate_from_images."); return 0; } if (indexes == 0) { // If we don't have a list of indexes, just do the leave_one_out std::pair ans = leave_one_out(o, std::numeric_limits::max()); return Py_BuildValue(CHAR_PTR_CAST "(ii)", ans.first, ans.second); } else { // Get the list of indexes PyObject* indexes_seq = PySequence_Fast(indexes, "Indexes must be an iterable list of indexes."); if (indexes_seq == NULL) return 0; int indexes_size = PySequence_Fast_GET_SIZE(indexes_seq); // Make certain that there aren't too many indexes if (indexes_size > (int)o->num_features) { PyErr_SetString(PyExc_ValueError, "knn: index list too large for data"); Py_DECREF(indexes_seq); return 0; } // copy the indexes into a vector std::vector idx(indexes_size); for (int i = 0; i < indexes_size; ++i) { PyObject* tmp = PySequence_Fast_GET_ITEM(indexes_seq, i); if (!PyInt_Check(tmp)) { PyErr_SetString(PyExc_TypeError, "knn: expected indexes to be ints"); Py_DECREF(indexes_seq); return 0; } idx[i] = PyInt_AS_LONG(tmp); } // make certain that none of the indexes are out of range for (size_t i = 0; i < idx.size(); ++i) { if (idx[i] > (long)(o->num_features - 1)) { PyErr_SetString(PyExc_IndexError, "knn: index out of range in index list"); Py_DECREF(indexes_seq); return 0; } } // do the leave-one-out std::pair ans = leave_one_out(o, stop_threshold, o->weight_vector, &idx); return Py_BuildValue(CHAR_PTR_CAST "(ii)", ans.first, ans.second); } } /* statistics of average distance to k nearest neighbors */ static PyObject* knn_knndistance_statistics(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; PyObject* progress = 0; int k; size_t i,j; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "|iO", &k, &progress) <= 0) return 0; if (o->feature_vectors == 0) { PyErr_SetString(PyExc_RuntimeError, "knn: knndistance_statistics called before instantiate_from_images."); return 0; } if (k <= 0) { k = o->num_k; } if (k > (int)o->num_feature_vectors - 1) { PyErr_SetString(PyExc_RuntimeError, "knn: knndistance_statistics requires more than k training samples."); return 0; } PyObject* entry; PyObject* result = PyList_New(o->num_feature_vectors); double *feature_i, *feature_j; double distance; kNearestNeighbors knn((size_t)k); for (i=0; inum_feature_vectors; i++) { knn.reset(); // find k nearest neighbors of i-th prototype feature_i = &o->feature_vectors[i * o->num_features]; for (j=0; jnum_feature_vectors; j++) { if (j==i) continue; feature_j = &o->feature_vectors[j * o->num_features]; // compute distance if (o->distance_type == CITY_BLOCK) { distance = city_block_distance(feature_i, feature_i + o->num_features, feature_j, o->weight_vector); } else if (o->distance_type == FAST_EUCLIDEAN) { distance = fast_euclidean_distance(feature_i, feature_i + o->num_features, feature_j, o->weight_vector); } else { distance = euclidean_distance(feature_i, feature_i + o->num_features, feature_j, o->weight_vector); } // store distance in kNearestNeighbors knn.add(o->id_names[j], distance); } // compute average distance distance = 0.0; for (j=0; j < knn.m_nn.size(); ++j) { distance += knn.m_nn[j].distance; } distance = distance / k; entry = PyTuple_New(2); PyTuple_SET_ITEM(entry, 0, PyFloat_FromDouble(distance)); PyTuple_SET_ITEM(entry, 1, PyString_FromString(o->id_names[i])); PyList_SetItem(result, i, entry); if (progress) PyObject_CallObject(progress, NULL); } return result; } /* Serialize and unserialize save and restore the internal data of the kNN object to/from a fast and compact binary format. This allows a user to create a file that can be used to create non-interactive classifiers in a very fast way. ARGUMENTS This function takes a filename and a list of features - the python wrapper of this class handles providing the list of features. FORMAT The format is designed to be as simple as possible. First is a header consisting of the file format version (currently 1), then the size and settings of the data, and finally the data. HEADER size what ------------------------------------------ unsigned long version unsigned long number of k unsigned long number of feaures unsigned long number of feature vectors unsigned long number of feature names na list of feature names in the format of unsigned long (length - including null) and char[] DATA The data as stored a list of id_names followed by the feature vectors. The id_names are stored as: size what ------------------------------------------ unsigned long length of string char[] id_name There are, of course, num_feature_vectors id_names. Next is the data which is simply written directly - i.e. num_feature_vectors arrays of doubles of length num_features. */ static PyObject* knn_serialize(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; char* filename; PyObject* features; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "sO", &filename, &features) <= 0) { return 0; } // type check the features if (!PyList_Check(features)) { PyErr_SetString(PyExc_TypeError, "knn: list of features must be a list."); return 0; } unsigned long feature_size = PyList_GET_SIZE(features); FILE* file = fopen(filename, "w+b"); if (file == 0) { PyErr_SetString(PyExc_IOError, "knn: error opening file."); return 0; } if (o->feature_vectors == 0) { PyErr_SetString(PyExc_RuntimeError, "knn: serialize called before instatiate from images."); fclose(file); return 0; } // write the header info unsigned long version = 1; if (fwrite((const void*)&version, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } unsigned long num_k = (unsigned long)o->num_k; if (fwrite((const void*)&num_k, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } unsigned long num_features = (unsigned long)o->num_features; if (fwrite((const void*)&num_features, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } unsigned long num_feature_vectors = (unsigned long)o->num_feature_vectors; if (fwrite((const void*)&num_feature_vectors, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } // write the feature names if (fwrite((const void*)&feature_size, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } for (size_t i = 0; i < feature_size; ++i) { PyObject* cur_string = PyList_GET_ITEM(features, i); unsigned long string_size = PyString_GET_SIZE(cur_string) + 1; if (fwrite((const void*)&string_size, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } if (fwrite((const void*)PyString_AS_STRING(cur_string), sizeof(char), string_size, file) != string_size) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } } for (size_t i = 0; i < o->num_feature_vectors; ++i) { unsigned long len = strlen(o->id_names[i]) + 1; // include \0 if (fwrite((const void*)&len, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } if (fwrite((const void*)o->id_names[i], sizeof(char), len, file) != len) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } } if (fwrite((const void*)o->normalize->get_norm_vector(), sizeof(double), o->num_features, file) != o->num_features) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } if (fwrite((const void*)o->weight_vector, sizeof(double), o->num_features, file) != o->num_features) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } // write the data double* cur = o->feature_vectors; for (size_t i = 0; i < o->num_feature_vectors; ++i, cur += o->num_features) { if (fwrite((const void*)cur, sizeof(double), o->num_features, file) != o->num_features) { PyErr_SetString(PyExc_IOError, "knn: problem writing to a file."); fclose(file); return 0; } } fclose(file); Py_INCREF(Py_None); return Py_None; } static PyObject* knn_unserialize(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; char* filename; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "s", &filename) <= 0) return 0; FILE* file = fopen(filename, "rb"); if (file == 0) { PyErr_SetString(PyExc_IOError, "knn: error opening file."); return 0; } unsigned long version, num_k, num_features, num_feature_vectors, num_feature_names; if (fread((void*)&version, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } if (version != 1) { PyErr_SetString(PyExc_IOError, "knn: unknown version of knn file."); fclose(file); return 0; } if (fread((void*)&num_k, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } if (fread((void*)&num_features, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } if (fread((void*)&num_feature_vectors, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } if (fread((void*)&num_feature_names, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } PyObject* feature_names = PyList_New(num_feature_names); for (size_t i = 0; i < num_feature_names; ++i) { unsigned long string_size; if (fread((void*)&string_size, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_RuntimeError, "knn: problem reading file."); fclose(file); return 0; } char tmp_string[1024]; if (fread((void*)&tmp_string, sizeof(char), string_size, file) != string_size) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } PyList_SET_ITEM(feature_names, i, PyString_FromStringAndSize((const char*)&tmp_string, string_size - 1)); } knn_delete_feature_data(o); set_num_features(o, (size_t)num_features); if (knn_create_feature_data(o, (size_t)num_feature_vectors) < 0) { fclose(file); return 0; } o->num_k = num_k; std::map id_name_histogram; for (size_t i = 0; i < o->num_feature_vectors; ++i) { unsigned long len; if (fread((void*)&len, sizeof(unsigned long), 1, file) != 1) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } o->id_names[i] = new char[len]; if (fread((void*)o->id_names[i], sizeof(char), len, file) != len) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } id_name_histogram[o->id_names[i]]++; } double* tmp_norm = new double[o->num_features]; if (fread((void*)tmp_norm, sizeof(double), o->num_features, file) != o->num_features) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); delete[] tmp_norm; fclose(file); return 0; } o->normalize->set_norm_vector(tmp_norm, tmp_norm + o->num_features); delete[] tmp_norm; if (fread((void*)o->weight_vector, sizeof(double), o->num_features, file) != o->num_features) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } double* cur = o->feature_vectors; for (size_t i = 0; i < o->num_feature_vectors; ++i, cur += o->num_features) { if (fread((void*)cur, sizeof(double), o->num_features, file) != o->num_features) { PyErr_SetString(PyExc_IOError, "knn: problem reading file."); fclose(file); return 0; } o->id_name_histogram[i] = id_name_histogram[o->id_names[i]]; } fclose(file); return feature_names; } static PyObject* knn_get_weights(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; PyObject* arglist = Py_BuildValue(CHAR_PTR_CAST "(s)", "d"); PyObject* array = PyEval_CallObject(array_init, arglist); if (array == 0) { PyErr_SetString(PyExc_IOError, "knn: Error creating array."); return 0; } Py_DECREF(arglist); PyObject* result; for (size_t i = 0; i < o->num_features; ++i) { result = PyObject_CallMethod(array, (char *)"append", (char *)"f", o->weight_vector[i]); if (result == 0) return 0; Py_DECREF(result); } Py_DECREF(arglist); return array; } static PyObject* knn_set_weights(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; PyObject* array; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &array) <= 0) { return 0; } Py_ssize_t len; double* weights; if (!PyObject_CheckReadBuffer(array)) { PyErr_SetString(PyExc_RuntimeError, "knn: Error getting weight array buffer."); return 0; } if ((PyObject_AsReadBuffer(array, (const void**)&weights, &len) != 0)) { PyErr_SetString(PyExc_RuntimeError, "knn: Error getting weight array buffer."); return 0; } if (size_t(len) != o->num_features * sizeof(double)) { PyErr_SetString(PyExc_ValueError, "knn: weight vector is not the correct size."); return 0; } for (size_t i = 0; i < o->num_features; ++i) { o->weight_vector[i] = weights[i]; } Py_INCREF(Py_None); return Py_None; } /* GA */ float Fitness(GAGenome & g) { GA1DArrayGenome & genome = (GA1DArrayGenome &)g; KnnObject* knn = (KnnObject*)genome.userData(); std::pair ans = leave_one_out(knn, std::numeric_limits::max(), genome()); return (float)ans.first / ans.second; } void Initializer(GAGenome& genome) { GA1DArrayGenome& g = (GA1DArrayGenome&)genome; for (int i = 0; i < g.length(); i++) { g.gene(i, rand() / (RAND_MAX + 1.0)); } } static PyObject* knn_ga_create(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; o->ga_running = true; srand(time(0)); Py_BEGIN_ALLOW_THREADS if (o->ga != 0) delete o->ga; if (o->genome != 0) delete o->genome; o->genome = new GA1DArrayGenome(o->num_features, Fitness); o->genome->userData(o); o->genome->initializer(Initializer); GARandomSeed(); o->ga = new GASteadyStateGA(*o->genome); o->ga->populationSize(o->ga_population); o->ga->nGenerations(1); o->ga->pMutation(o->ga_mutation); o->ga->pCrossover(o->ga_crossover); o->ga->initialize(); Py_END_ALLOW_THREADS return Py_BuildValue(CHAR_PTR_CAST "f", o->ga->statistics().initial()); } static PyObject* knn_ga_destroy(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; if (o->ga != 0) { delete o->ga; o->ga = 0; } if (o->genome != 0) { delete o->genome; o->genome = 0; } o->ga_running = false; Py_INCREF(Py_None); return Py_None; } static PyObject* knn_ga_step(PyObject* self, PyObject* args) { KnnObject* o = (KnnObject*)self; Py_BEGIN_ALLOW_THREADS o->ga->populationSize(o->ga_population); o->ga->pMutation(o->ga_mutation); o->ga->pCrossover(o->ga_crossover); o->ga->step(); Py_END_ALLOW_THREADS GA1DArrayGenome& g =(GA1DArrayGenome&)o->ga->statistics().bestIndividual(); for (size_t i = 0; i < o->num_features; i++) o->weight_vector[i] = g.gene(i); return Py_BuildValue(CHAR_PTR_CAST "f", o->ga->statistics().maxEver()); } static PyObject* knn_get_ga_mutation(PyObject* self) { KnnObject* o = (KnnObject*)self; return Py_BuildValue(CHAR_PTR_CAST "f", o->ga_mutation); } static int knn_set_ga_mutation(PyObject* self, PyObject* v) { KnnObject* o = (KnnObject*)self; if (!PyFloat_Check(v)) { PyErr_SetString(PyExc_TypeError, "knn: must be a floating-point number."); return -1; } o->ga_mutation = PyFloat_AS_DOUBLE(v); return 0; } static PyObject* knn_get_ga_crossover(PyObject* self) { KnnObject* o = (KnnObject*)self; return Py_BuildValue(CHAR_PTR_CAST "f", o->ga_crossover); } static int knn_set_ga_crossover(PyObject* self, PyObject* v) { KnnObject* o = (KnnObject*)self; if (!PyFloat_Check(v)) { PyErr_SetString(PyExc_TypeError, "knn: must be a floating-point number."); return -1; } o->ga_crossover = PyFloat_AS_DOUBLE(v); return 0; } static PyObject* knn_get_ga_population(PyObject* self) { KnnObject* o = (KnnObject*)self; return Py_BuildValue(CHAR_PTR_CAST "i", o->ga_population); } static int knn_set_ga_population(PyObject* self, PyObject* v) { KnnObject* o = (KnnObject*)self; if (!PyInt_Check(v)) { PyErr_SetString(PyExc_TypeError, "knn: must be a floating-point number."); return -1; } o->ga_population = size_t(PyInt_AS_LONG(v)); return 0; } static PyObject* knn_get_num_features(PyObject* self) { KnnObject* o = (KnnObject*)self; return Py_BuildValue(CHAR_PTR_CAST "i", o->num_features); } static int knn_set_num_features(PyObject* self, PyObject* v) { KnnObject* o = (KnnObject*)self; if (!PyInt_Check(v)) { PyErr_SetString(PyExc_TypeError, "knn: must be an integer."); return -1; } set_num_features(o, PyInt_AS_LONG(v)); return 0; } PyMethodDef knn_module_methods[] = { { NULL } }; DL_EXPORT(void) initknncore(void) { PyObject* m = Py_InitModule(CHAR_PTR_CAST "gamera.knncore", knn_module_methods); PyObject* d = PyModule_GetDict(m); KnnType.ob_type = &PyType_Type; KnnType.tp_name = CHAR_PTR_CAST "gamera.knncore.kNN"; KnnType.tp_basicsize = sizeof(KnnObject); KnnType.tp_dealloc = knn_dealloc; KnnType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; KnnType.tp_new = knn_new; KnnType.tp_getattro = PyObject_GenericGetAttr; KnnType.tp_alloc = NULL; // PyType_GenericAlloc; KnnType.tp_free = NULL; // _PyObject_Del; KnnType.tp_methods = knn_methods; KnnType.tp_getset = knn_getset; PyType_Ready(&KnnType); PyDict_SetItemString(d, "kNN", (PyObject*)&KnnType); PyDict_SetItemString(d, "CITY_BLOCK", Py_BuildValue(CHAR_PTR_CAST "i", CITY_BLOCK)); PyDict_SetItemString(d, "EUCLIDEAN", Py_BuildValue(CHAR_PTR_CAST "i", EUCLIDEAN)); PyDict_SetItemString(d, "FAST_EUCLIDEAN", Py_BuildValue(CHAR_PTR_CAST "i", FAST_EUCLIDEAN)); PyObject* array_dict = get_module_dict("array"); if (array_dict == 0) { return; } array_init = PyDict_GetItemString(array_dict, "array"); if (array_init == 0) { PyErr_SetString(PyExc_RuntimeError, "Unable to get array init method\n"); return; } } gamera-3.3.3/src/libpng-1.2.5/0000755000076500000000000000000011755376174014465 5ustar chriswheelgamera-3.3.3/src/libpng-1.2.5/ANNOUNCE0000644000076500000000000000235210714675701015610 0ustar chriswheel Libpng 1.2.5 - October 3, 2002 This is a public release of libpng, intended for use in production codes. Changes since the last public release (1.2.4): Revised makefile.cygwin to use DLL number 12 instead of 13. Added code to contrib/gregbook/readpng2.c to ignore unused chunks. Replaced toucan.png in contrib/gregbook (it has been corrupt since 1.0.11) Removed some stray *.o files from contrib/gregbook. Changed png_error() to png_warning() about "Too much data" in pngpread.c and about "Extra compressed data" in pngrutil.c. Prevent png_ptr->pass from exceeding 7 in png_push_finish_row(). Updated makefile.hggcc Updated png.c and pnggccrd.c handling of return from png_mmx_support() Only issue png_warning() about "Too much data" in pngpread.c when avail_in is nonzero. Updated makefiles to install a separate libpng.so.3 with its own rpath. Revised makefiles to not remove previous minor versions of shared libraries. Revised 13 makefiles to remove "-lz" and "-L$(ZLIBLIB)", etc., from shared library loader directive. Revised libpng-config script. Relocated two misplaced PNGAPI lines in pngtest.c Send comments/corrections/commendations to png-implement@ccrc.wustl.edu or to randeg@alum.rpi.edu Glenn R-P gamera-3.3.3/src/libpng-1.2.5/CHANGES0000644000076500000000000020530110714675701015451 0ustar chriswheel CHANGES - changes for libpng version 0.2 added reader into png.h fixed small problems in stub file version 0.3 added pull reader split up pngwrite.c to several files added pnglib.txt added example.c cleaned up writer, adding a few new tranformations fixed some bugs in writer interfaced with zlib 0.5 added K&R support added check for 64 KB blocks for 16 bit machines version 0.4 cleaned up code and commented code simplified time handling into png_time created png_color_16 and png_color_8 to handle color needs cleaned up color type defines fixed various bugs made various names more consistant interfaced with zlib 0.71 cleaned up zTXt reader and writer (using zlib's Reset functions) split transformations into pngrtran.c and pngwtran.c version 0.5 interfaced with zlib 0.8 fixed many reading and writing bugs saved using 3 spaces instead of tabs version 0.6 added png_large_malloc() and png_large_free() added png_size_t cleaned up some compiler warnings added png_start_read_image() version 0.7 cleaned up lots of bugs finished dithering and other stuff added test program changed name from pnglib to libpng version 0.71 [June, 1995] changed pngtest.png for zlib 0.93 fixed error in libpng.txt and example.c version 0.8 cleaned up some bugs added png_set_filler() split up pngstub.c into pngmem.c, pngio.c, and pngerror.c added #define's to remove unwanted code moved png_info_init() to png.c added old_size into png_realloc() added functions to manually set filtering and compression info changed compression parameters based on image type optimized filter selection code added version info changed external functions passing floats to doubles (k&r problems?) put all the configurable stuff in pngconf.h enabled png_set_shift to work with paletted images on read added png_read_update_info() - updates info structure with transformations version 0.81 [August, 1995] incorporated Tim Wegner's medium model code (thanks, Tim) version 0.82 [September, 1995] [unspecified changes] version 0.85 [December, 1995] added more medium model code (almost everything's a far) added i/o, error, and memory callback functions fixed some bugs (16 bit, 4 bit interlaced, etc.) added first run progressive reader (barely tested) version 0.86 [January, 1996] fixed bugs improved documentation version 0.87 [January, 1996] fixed medium model bugs fixed other bugs introduced in 0.85 and 0.86 added some minor documentation version 0.88 [January, 1996] fixed progressive bugs replaced tabs with spaces cleaned up documentation added callbacks for read/write and warning/error functions version 0.89 [July, 1996] added new initialization API to make libpng work better with shared libs we now have png_create_read_struct(), png_create_write_struct(), png_create_info_struct(), png_destroy_read_struct(), and png_destroy_write_struct() instead of the separate calls to malloc and png_read_init(), png_info_init(), and png_write_init() changed warning/error callback functions to fix bug - this means you should use the new initialization API if you were using the old png_set_message_fn() calls, and that the old API no longer exists so that people are aware that they need to change their code changed filter selection API to allow selection of multiple filters since it didn't work in previous versions of libpng anyways optimized filter selection code fixed png_set_background() to allow using an arbitrary RGB color for paletted images fixed gamma and background correction for paletted images, so png_correct_palette is not needed unless you are correcting an external palette (you will need to #define PNG_CORRECT_PALETTE_SUPPORTED in pngconf.h) - if nobody uses this, it may disappear in the future. fixed bug with Borland 64K memory allocation (Alexander Lehmann) fixed bug in interlace handling (Smarasderagd, I think) added more error checking for writing and image to reduce invalid files separated read and write functions so that they won't both be linked into a binary when only reading or writing functionality is used new pngtest image also has interlacing and zTXt updated documentation to reflect new API version 0.90 [January, 1997] made CRC errors/warnings on critical and ancillary chunks configurable libpng will use the zlib CRC routines by (compile-time) default changed DOS small/medium model memory support - needs zlib 1.04 (Tim Wegner) added external C++ wrapper statements to png.h (Gilles Dauphin) allow PNG file to be read when some or all of file signature has already been read from the beginning of the stream. ****This affects the size of info_struct and invalidates all programs that use a shared libpng**** fixed png_filler() declarations fixed? background color conversions fixed order of error function pointers to match documentation current chunk name is now available in png_struct to reduce the number of nearly identical error messages (will simplify multi-lingual support when available) try to get ready for unknown-chunk callback functions: - previously read critical chunks are flagged, so the chunk handling routines can determine if the chunk is in the right place - all chunk handling routines have the same prototypes, so we will be able to handle all chunks via a callback mechanism try to fix Linux "setjmp" buffer size problems removed png_large_malloc, png_large_free, and png_realloc functions. version 0.95 [March, 1997] fixed bug in pngwutil.c allocating "up_row" twice and "avg_row" never fixed bug in PNG file signature compares when start != 0 changed parameter type of png_set_filler(...filler...) from png_byte to png_uint_32 added test for MACOS to ensure that both math.h and fp.h are not #included added macros for libpng to be compiled as a Windows DLL (Andreas Kupries) added "packswap" transformation, which changes the endianness of packed-pixel bytes (Kevin Bracey) added "strip_alpha" transformation, which removes the alpha channel of input images without using it (not neccesarily a good idea) added "swap_alpha" transformation, which puts the alpha channel in front of the color bytes instead of after removed all implicit variable tests which assume NULL == 0 (I think) changed several variables to "png_size_t" to show 16/32-bit limitations added new pCAL chunk read/write support added experimental filter selection weighting (Greg Roelofs) removed old png_set_rgbx() and png_set_xrgb() functions that have been obsolete for about 2 years now (use png_set_filler() instead) added macros to read 16- and 32-bit ints directly from buffer, to be used only on those systems that support it (namely PowerPC and 680x0) With some testing, this may become the default for MACOS/PPC systems. only calculate CRC on data if we are going to use it added macros for zTXt compression type PNG_zTXt_COMPRESSION_??? added macros for simple libpng debugging output selectable at compile time removed PNG_READ_END_MODE in progressive reader (Smarasderagd) more description of info_struct in libpng.txt and png.h more instructions in example.c more chunk types tested in pngtest.c renamed pngrcb.c to pngset.c, and all png_read_ functions to be png_set_. We now have corresponding png_get_ functions in pngget.c to get infomation in info_ptr. This isolates the application from the internal organization of png_info_struct (good for shared library implementations). version 0.96 [May, 1997] fixed serious bug with < 8bpp images introduced in 0.95 fixed 256-color transparency bug (Greg Roelofs) fixed up documentation (Greg Roelofs, Laszlo Nyul) fixed "error" in pngconf.h for Linux setjmp() behaviour fixed DOS medium model support (Tim Wegner) fixed png_check_keyword() for case with error in static string text added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul) added typecasts to quiet compiler errors added more debugging info version 0.97 [January, 1998] removed PNG_USE_OWN_CRC capability relocated png_set_crc_action from pngrutil.c to pngrtran.c fixed typecasts of "new_key", etc. (Andreas Dilger) added RFC 1152 [sic] date support fixed bug in gamma handling of 4-bit grayscale added 2-bit grayscale gamma handling (Glenn R-P) added more typecasts. 65536L becomes (png_uint_32)65536L, etc. (Glenn R-P) minor corrections in libpng.txt added simple sRGB support (Glenn R-P) easier conditional compiling, e.g. define PNG_READ/WRITE_NOT_FULLY_SUPPORTED; all configurable options can be selected from command-line instead of having to edit pngconf.h (Glenn R-P) fixed memory leak in pngwrite.c (free info_ptr->text) (Glenn R-P) added more conditions for png_do_background, to avoid changing black pixels to background when a background is supplied and no pixels are transparent repaired PNG_NO_STDIO behaviour tested NODIV support and made it default behaviour (Greg Roelofs) added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler) regularized version numbering scheme and bumped shared-library major version number to 2 to avoid problems with libpng 0.89 apps (Greg Roelofs) version 0.98 [January, 1998] cleaned up some typos in libpng.txt and in code documentation fixed memory leaks in pCAL chunk processing (Glenn R-P and John Bowler) cosmetic change "display_gamma" to "screen_gamma" in pngrtran.c changed recommendation about file_gamma for PC images to .51 from .45, in example.c and libpng.txt, added comments to distinguish between screen_gamma, viewing_gamma, and display_gamma. changed all references to RFC1152 to read RFC1123 and changed the PNG_TIME_RFC1152_SUPPORTED macro to PNG_TIME_RFC1123_SUPPORTED added png_invert_alpha capability (Glenn R-P -- suggestion by Jon Vincent) changed srgb_intent from png_byte to int to avoid compiler bugs version 0.99 [January 30, 1998] free info_ptr->text instead of end_info_ptr->text in pngread.c (John Bowler) fixed a longstanding "packswap" bug in pngtrans.c fixed some inconsistencies in pngconf.h that prevented compiling with PNG_READ_GAMMA_SUPPORTED and PNG_READ_hIST_SUPPORTED undefined fixed some typos and made other minor rearrangement of libpng.txt (Andreas) changed recommendation about file_gamma for PC images to .50 from .51 in example.c and libpng.txt, and changed file_gamma for sRGB images to .45 added a number of functions to access information from the png structure png_get_image_height(), etc. (Glenn R-P, suggestion by Brad Pettit) added TARGET_MACOS similar to zlib-1.0.8 define PNG_ALWAYS_EXTERN when __MWERKS__ && WIN32 are defined added type casting to all png_malloc() function calls version 0.99a [January 31, 1998] Added type casts and parentheses to all returns that return a value.(Tim W.) version 0.99b [February 4, 1998] Added type cast png_uint_32 on malloc function calls where needed. Changed type of num_hist from png_uint_32 to int (same as num_palette). Added checks for rowbytes overflow, in case png_size_t is less than 32 bits. Renamed makefile.elf to makefile.lnx. version 0.99c [February 7, 1998] More type casting. Removed erroneous overflow test in pngmem.c. Added png_buffered_memcpy() and png_buffered_memset(), apply them to rowbytes. Added UNIX manual pages libpng.3 (incorporating libpng.txt) and png.5. version 0.99d [February 11, 1998] Renamed "far_to_near()" "png_far_to_near()" Revised libpng.3 Version 99c "buffered" operations didn't work as intended. Replaced them with png_memcpy_check() and png_memset_check(). Added many "if (png_ptr == NULL) return" to quell compiler warnings about unused png_ptr, mostly in pngget.c and pngset.c. Check for overlength tRNS chunk present when indexed-color PLTE is read. Cleaned up spelling errors in libpng.3/libpng.txt Corrected a problem with png_get_tRNS() which returned undefined trans array version 0.99e [February 28, 1998] Corrected png_get_tRNS() again. Add parentheses for easier reading of pngget.c, fixed "||" should be "&&". Touched up example.c to make more of it compileable, although the entire file still can't be compiled (Willem van Schaik) Fixed a bug in png_do_shift() (Bryan Tsai) Added a space in png.h prototype for png_write_chunk_start() Replaced pngtest.png with one created with zlib 1.1.1 Changed pngtest to report PASS even when file size is different (Jean-loup G.) Corrected some logic errors in png_do_invert_alpha() (Chris Patterson) version 0.99f [March 5, 1998] Corrected a bug in pngpread() introduced in version 99c (Kevin Bracey) Moved makefiles into a "scripts" directory, and added INSTALL instruction file Added makefile.os2 and pngos2.def (A. Zabolotny) and makefile.s2x (W. Sebok) Added pointers to "note on libpng versions" in makefile.lnx and README Added row callback feature when reading and writing nonprogressive rows and added a test of this feature in pngtest.c Added user transform callbacks, with test of the feature in pngtest.c version 0.99g [March 6, 1998, morning] Minor changes to pngtest.c to suppress compiler warnings. Removed "beta" language from documentation. version 0.99h [March 6, 1998, evening] Minor changes to previous minor changes to pngtest.c Changed PNG_READ_NOT_FULLY_SUPPORTED to PNG_READ_TRANSFORMS_NOT_SUPPORTED and added PNG_PROGRESSIVE_READ_NOT_SUPPORTED macro Added user transform capability version 1.00 [March 7, 1998] Changed several typedefs in pngrutil.c Added makefile.wat (Pawel Mrochen), updated makefile.tc3 (Willem van Schaik) replaced "while(1)" with "for(;;)" added PNGARG() to prototypes in pngtest.c and removed some prototypes updated some of the makefiles (Tom Lane) changed some typedefs (s_start, etc.) in pngrutil.c fixed dimensions of "short_months" array in pngwrite.c Replaced ansi2knr.c with the one from jpeg-v6 version 1.0.0 [March 8, 1998] Changed name from 1.00 to 1.0.0 (Adam Costello) Added smakefile.ppc (with SCOPTIONS.ppc) for Amiga PPC (Andreas Kleinert) version 1.0.0a [March 9, 1998] Fixed three bugs in pngrtran.c to make gamma+background handling consistent (Greg Roelofs) Changed format of the PNG_LIBPNG_VER integer to xyyzz instead of xyz for major, minor, and bugfix releases. This is 10001. (Adam Costello, Tom Lane) Make months range from 1-12 in png_convert_to_rfc1123 version 1.0.0b [March 13, 1998] Quieted compiler complaints about two empty "for" loops in pngrutil.c Minor changes to makefile.s2x Removed #ifdef/#endif around a png_free() in pngread.c version 1.0.1 [March 14, 1998] Changed makefile.s2x to reduce security risk of using a relative pathname Fixed some typos in the documentation (Greg). Fixed a problem with value of "channels" returned by png_read_update_info() version 1.0.1a [April 21, 1998] Optimized Paeth calculations by replacing abs() function calls with intrinsics plus other loop optimizations. Improves avg decoding speed by about 20%. Commented out i386istic "align" compiler flags in makefile.lnx. Reduced the default warning level in some makefiles, to make them consistent. Removed references to IJG and JPEG in the ansi2knr.c copyright statement. Fixed a bug in png_do_strip_filler with XXRRGGBB => RRGGBB transformation. Added grayscale and 16-bit capability to png_do_read_filler(). Fixed a bug in pngset.c, introduced in version 0.99c, that sets rowbytes too large when writing an image with bit_depth < 8 (Bob Dellaca). Corrected some bugs in the experimental weighted filtering heuristics. Moved a misplaced pngrutil code block that truncates tRNS if it has more than num_palette entries -- test was done before num_palette was defined. Fixed a png_convert_to_rfc1123() bug that converts day 31 to 0 (Steve Eddins). Changed compiler flags in makefile.wat for better optimization (Pawel Mrochen). version 1.0.1b [May 2, 1998] Relocated png_do_gray_to_rgb() within png_do_read_transformations() (Greg). Relocated the png_composite macros from pngrtran.c to png.h (Greg). Added makefile.sco (contributed by Mike Hopkirk). Fixed two bugs (missing definitions of "istop") introduced in libpng-1.0.1a. Fixed a bug in pngrtran.c that would set channels=5 under some circumstances. More work on the Paeth-filtering, achieving imperceptible speedup (A Kleinert). More work on loop optimization which may help when compiled with C++ compilers. Added warnings when people try to use transforms they've defined out. Collapsed 4 "i" and "c" loops into single "i" loops in pngrtran and pngwtran. Revised paragraph about png_set_expand() in libpng.txt and libpng.3 (Greg) version 1.0.1c [May 11, 1998] Fixed a bug in pngrtran.c (introduced in libpng-1.0.1a) where the masks for filler bytes should have been 0xff instead of 0xf. Added max_pixel_depth=32 in pngrutil.c when using FILLER with palette images. Moved PNG_WRITE_WEIGHTED_FILTER_SUPPORTED and PNG_WRITE_FLUSH_SUPPORTED out of the PNG_WRITE_TRANSFORMS_NOT_SUPPORTED block of pngconf.h Added "PNG_NO_WRITE_TRANSFORMS" etc., as alternatives for *_NOT_SUPPORTED, for consistency, in pngconf.h Added individual "ifndef PNG_NO_[CAPABILITY]" in pngconf.h to make it easier to remove unwanted capabilities via the compile line Made some corrections to grammar (which, it's) in documentation (Greg). Corrected example.c, use of row_pointers in png_write_image(). version 1.0.1d [May 24, 1998] Corrected several statements that used side effects illegally in pngrutil.c and pngtrans.c, that were introduced in version 1.0.1b Revised png_read_rows() to avoid repeated if-testing for NULL (A Kleinert) More corrections to example.c, use of row_pointers in png_write_image() and png_read_rows(). Added pngdll.mak and pngdef.pas to scripts directory, contributed by Bob Dellaca, to make a png32bd.dll with Borland C++ 4.5 Fixed error in example.c with png_set_text: num_text is 3, not 2 (Guido V.) Changed several loops from count-down to count-up, for consistency. version 1.0.1e [June 6, 1998] Revised libpng.txt and libpng.3 description of png_set_read|write_fn(), and added warnings when people try to set png_read_fn and png_write_fn in the same structure. Added a test such that png_do_gamma will be done when num_trans==0 for truecolor images that have defined a background. This corrects an error that was introduced in libpng-0.90 that can cause gamma processing to be skipped. Added tests in png.h to include "trans" and "trans_values" in structures when PNG_READ_BACKGROUND_SUPPORTED or PNG_READ_EXPAND_SUPPORTED is defined. Add png_free(png_ptr->time_buffer) in png_destroy_read_struct() Moved png_convert_to_rfc_1123() from pngwrite.c to png.c Added capability for user-provided malloc_fn() and free_fn() functions, and revised pngtest.c to demonstrate their use, replacing the PNGTEST_DEBUG_MEM feature. Added makefile.w32, for Microsoft C++ 4.0 and later (Tim Wegner). version 1.0.2 [June 14, 1998] Fixed two bugs in makefile.bor . version 1.0.2a [December 30, 1998] Replaced and extended code that was removed from png_set_filler() in 1.0.1a. Fixed a bug in png_do_filler() that made it fail to write filler bytes in the left-most pixel of each row (Kevin Bracey). Changed "static pngcharp tIME_string" to "static char tIME_string[30]" in pngtest.c (Duncan Simpson). Fixed a bug in pngtest.c that caused pngtest to try to write a tIME chunk even when no tIME chunk was present in the source file. Fixed a problem in pngrutil.c: gray_to_rgb didn't always work with 16-bit. Fixed a problem in png_read_push_finish_row(), which would not skip some passes that it should skip, for images that are less than 3 pixels high. Interchanged the order of calls to png_do_swap() and png_do_shift() in pngwtran.c (John Cromer). Added #ifdef PNG_DEBUG/#endif surrounding use of PNG_DEBUG in png.h . Changed "bad adaptive filter type" from error to warning in pngrutil.c . Fixed a documentation error about default filtering with 8-bit indexed-color. Separated the PNG_NO_STDIO macro into PNG_NO_STDIO and PNG_NO_CONSOLE_IO (L. Peter Deutsch). Added png_set_rgb_to_gray() and png_get_rgb_to_gray_status() functions. Added png_get_copyright() and png_get_header_version() functions. Revised comments on png_set_progressive_read_fn() in libpng.txt and example.c Added information about debugging in libpng.txt and libpng.3 . Changed "ln -sf" to "ln -s -f" in makefile.s2x, makefile.lnx, and makefile.sco. Removed lines after Dynamic Dependencies" in makefile.aco . Revised makefile.dec to make a shared library (Jeremie Petit). Removed trailing blanks from all files. version 1.0.2a [January 6, 1999] Removed misplaced #endif and #ifdef PNG_NO_EXTERN near the end of png.h Added "if" tests to silence complaints about unused png_ptr in png.h and png.c Changed "check_if_png" function in example.c to return true (nonzero) if PNG. Changed libpng.txt to demonstrate png_sig_cmp() instead of png_check_sig() which is obsolete. version 1.0.3 [January 14, 1999] Added makefile.hux, for Hewlett Packard HPUX 10.20 and 11.00 (Jim Rice) Added a statement of Y2K compliance in png.h, libpng.3, and Y2KINFO. version 1.0.3a [August 12, 1999] Added check for PNG_READ_INTERLACE_SUPPORTED in pngread.c; issue a warning if an attempt is made to read an interlaced image when it's not supported. Added check if png_ptr->trans is defined before freeing it in pngread.c Modified the Y2K statement to include versions back to version 0.71 Fixed a bug in the check for valid IHDR bit_depth/color_types in pngrutil.c Modified makefile.wat (added -zp8 flag, ".symbolic", changed some comments) Replaced leading blanks with tab characters in makefile.hux Changed "dworkin.wustl.edu" to "ccrc.wustl.edu" in various documents. Changed (float)red and (float)green to (double)red, (double)green in png_set_rgb_to_gray() to avoid "promotion" problems in AIX. Fixed a bug in pngconf.h that omitted when PNG_DEBUG==0 (K Bracey). Reformatted libpng.3 and libpngpf.3 with proper fonts (script by J. vanZandt). Updated documentation to refer to the PNG-1.2 specification. Removed ansi2knr.c and left pointers to the latest source for ansi2knr.c in makefile.knr, INSTALL, and README (L. Peter Deutsch) Fixed bugs in calculation of the length of rowbytes when adding alpha channels to 16-bit images, in pngrtran.c (Chris Nokleberg) Added function png_set_user_transform_info() to store user_transform_ptr, user_depth, and user_channels into the png_struct, and a function png_get_user_transform_ptr() to retrieve the pointer (Chris Nokleberg) Added function png_set_empty_plte_permitted() to make libpng useable in MNG applications. Corrected the typedef for png_free_ptr in png.h (Jesse Jones). Correct gamma with srgb is 45455 instead of 45000 in pngrutil.c, to be consistent with PNG-1.2, and allow variance of 500 before complaining. Added assembler code contributed by Intel in file pngvcrd.c and modified makefile.w32 to use it (Nirav Chhatrapati, INTEL Corporation, Gilles Vollant) Changed "ln -s -f" to "ln -f -s" in the makefiles to make Solaris happy. Added some aliases for png_set_expand() in pngrtran.c, namely png_set_expand_PLTE(), png_set_expand_depth(), and png_set_expand_tRNS() (Greg Roelofs, in "PNG: The Definitive Guide"). Added makefile.beo for BEOS on X86, contributed by Sander Stok. version 1.0.3b [August 26, 1999] Replaced 2147483647L several places with PNG_MAX_UINT macro, defined in png.h Changed leading blanks to tabs in all makefiles. Define PNG_USE_PNGVCRD in makefile.w32, to get MMX assembler code. Made alternate versions of png_set_expand() in pngrtran.c, namely png_set_gray_1_2_4_to_8, png_set_palette_to_rgb, and png_set_tRNS_to_alpha (Greg Roelofs, in "PNG: The Definitive Guide"). Deleted the 1.0.3a aliases. Relocated start of 'extern "C"' block in png.h so it doesn't include pngconf.h Revised calculation of num_blocks in pngmem.c to avoid a potentially negative shift distance, whose results are undefined in the C language. Added a check in pngset.c to prevent writing multiple tIME chunks. Added a check in pngwrite.c to detect invalid small window_bits sizes. version 1.0.3d [September 4, 1999] Fixed type casting of igamma in pngrutil.c Added new png_expand functions to scripts/pngdef.pas and pngos2.def Added a demo read_user_transform_fn that examines the row filters in pngtest.c version 1.0.4 [September 24, 1999] Define PNG_ALWAYS_EXTERN in pngconf.h if __STDC__ is defined Delete #define PNG_INTERNAL and include "png.h" from pngasmrd.h Made several minor corrections to pngtest.c Renamed the makefiles with longer but more user friendly extensions. Copied the PNG copyright and license to a separate LICENSE file. Revised documentation, png.h, and example.c to remove reference to "viewing_gamma" which no longer appears in the PNG specification. Revised pngvcrd.c to use MMX code for interlacing only on the final pass. Updated pngvcrd.c to use the faster C filter algorithms from libpng-1.0.1a Split makefile.win32vc into two versions, makefile.vcawin32 (uses MMX assembler code) and makefile.vcwin32 (doesn't). Added a CPU timing report to pngtest.c (enabled by defining PNGTEST_TIMING) Added a copy of pngnow.png to the distribution. version 1.0.4a [September 25, 1999] Increase max_pixel_depth in pngrutil.c if a user transform needs it. Changed several division operations to right-shifts in pngvcrd.c version 1.0.4b [September 30, 1999] Added parentheses in line 3732 of pngvcrd.c Added a comment in makefile.linux warning about buggy -O3 in pgcc 2.95.1 version 1.0.4c [October 1, 1999] Added a "png_check_version" function in png.c and pngtest.c that will generate a helpful compiler error if an old png.h is found in the search path. Changed type of png_user_transform_depth|channels from int to png_byte. version 1.0.4d [October 6, 1999] Changed 0.45 to 0.45455 in png_set_sRGB() Removed unused PLTE entries from pngnow.png Re-enabled some parts of pngvcrd.c (png_combine_row) that work properly. version 1.0.4e [October 10, 1999] Fixed sign error in pngvcrd.c (Greg Roelofs) Replaced some instances of memcpy with simple assignments in pngvcrd (GR-P) version 1.0.4f [October 15, 1999] Surrounded example.c code with #if 0 .. #endif to prevent people from inadvertently trying to compile it. Changed png_get_header_version() from a function to a macro in png.h Added type casting mostly in pngrtran.c and pngwtran.c Removed some pointless "ptr = NULL" in pngmem.c Added a "contrib" directory containing the source code from Greg's book. version 1.0.5 [October 15, 1999] Minor editing of the INSTALL and README files. version 1.0.5a [October 23, 1999] Added contrib/pngsuite and contrib/pngminus (Willem van Schaik) Fixed a typo in the png_set_sRGB() function call in example.c (Jan Nijtmans) Further optimization and bugfix of pngvcrd.c Revised pngset.c so that it does not allocate or free memory in the user's text_ptr structure. Instead, it makes its own copy. Created separate write_end_info_struct in pngtest.c for a more severe test. Added code in pngwrite.c to free info_ptr->text[i].key to stop a memory leak. version 1.0.5b [November 23, 1999] Moved PNG_FLAG_HAVE_CHUNK_HEADER, PNG_FLAG_BACKGROUND_IS_GRAY and PNG_FLAG_WROTE_tIME from flags to mode. Added png_write_info_before_PLTE() function. Fixed some typecasting in contrib/gregbook/*.c Updated scripts/makevms.com and added makevms.com to contrib/gregbook and contrib/pngminus (Martin Zinser) version 1.0.5c [November 26, 1999] Moved png_get_header_version from png.h to png.c, to accomodate ansi2knr. Removed all global arrays (according to PNG_NO_GLOBAL_ARRAYS macro), to accomodate making DLL's: Moved usr_png_ver from global variable to function png_get_header_ver() in png.c. Moved png_sig to png_sig_bytes in png.c and eliminated use of png_sig in pngwutil.c. Moved the various png_CHNK arrays into pngtypes.h. Eliminated use of global png_pass arrays. Declared the png_CHNK and png_pass arrays to be "const". Made the global arrays available to applications (although none are used in libpng itself) when PNG_NO_GLOBAL_ARRAYS is not defined or when PNG_GLOBAL_ARRAYS is defined. Removed some extraneous "-I" from contrib/pngminus/makefile.std Changed the PNG_sRGB_INTENT macros in png.h to be consistent with PNG-1.2. Change PNG_SRGB_INTENT to PNG_sRGB_INTENT in libpng.txt and libpng.3 version 1.0.5d [November 29, 1999] Add type cast (png_const_charp) two places in png.c Eliminated pngtypes.h; use macros instead to declare PNG_CHNK arrays. Renamed "PNG_GLOBAL_ARRAYS" to "PNG_USE_GLOBAL_ARRAYS" and made available to applications a macro "PNG_USE_LOCAL_ARRAYS". #ifdef out all the new declarations when PNG_USE_GLOBAL_ARRAYS is defined. Added PNG_EXPORT_VAR macro to accommodate making DLL's. version 1.0.5e [November 30, 1999] Added iCCP, iTXt, and sPLT support; added "lang" member to the png_text structure; refactored the inflate/deflate support to make adding new chunks with trailing compressed parts easier in the future, and added new functions png_free_iCCP, png_free_pCAL, png_free_sPLT, png_free_text, png_get_iCCP, png_get_spalettes, png_set_iCCP, png_set_spalettes (Eric S. Raymond). NOTE: Applications that write text chunks MUST define png_text->lang before calling png_set_text(). It must be set to NULL if you want to write tEXt or zTXt chunks. If you want your application to be able to run with older versions of libpng, use #ifdef PNG_iTXt_SUPPORTED png_text[i].lang = NULL; #endif Changed png_get_oFFs() and png_set_oFFs() to use signed rather than unsigned offsets (Eric S. Raymond). Combined PNG_READ_cHNK_SUPPORTED and PNG_WRITE_cHNK_SUPPORTED macros into PNG_cHNK_SUPPORTED and combined the three types of PNG_text_SUPPORTED macros, leaving the separate macros also available. Removed comments on #endifs at the end of many short, non-nested #if-blocks. version 1.0.5f [December 6, 1999] Changed makefile.solaris to issue a warning about potential problems when the ucb "ld" is in the path ahead of the ccs "ld". Removed "- [date]" from the "synopsis" line in libpng.3 and libpngpf.3. Added sCAL chunk support (Eric S. Raymond). version 1.0.5g [December 7, 1999] Fixed "png_free_spallettes" typo in png.h Added code to handle new chunks in pngpread.c Moved PNG_CHNK string macro definitions outside of PNG_NO_EXTERN block Added "translated_key" to png_text structure and png_write_iTXt(). Added code in pngwrite.c to work around a newly discovered zlib bug. version 1.0.5h [December 10, 1999] NOTE: regarding the note for version 1.0.5e, the following must also be included in your code: png_text[i].translated_key = NULL; Unknown chunk handling is now supported. Option to eliminate all floating point support was added. Some new fixed-point functions such as png_set_gAMA_fixed() were added. Expanded tabs and removed trailing blanks in source files. version 1.0.5i [December 13, 1999] Added some type casts to silence compiler warnings. Renamed "png_free_spalette" to "png_free_spalettes" for consistency. Removed leading blanks from a #define in pngvcrd.c Added some parameters to the new png_set_keep_unknown_chunks() function. Added a test for up->location != 0 in the first instance of writing unknown chunks in pngwrite.c Changed "num" to "i" in png_free_spalettes() and png_free_unknowns() to prevent recursion. Added png_free_hIST() function. Various patches to fix bugs in the sCAL and integer cHRM processing, and to add some convenience macros for use with sCAL. version 1.0.5j [December 21, 1999] Changed "unit" parameter of png_write_sCAL from png_byte to int, to work around buggy compilers. Added new type "png_fixed_point" for integers that hold float*100000 values Restored backward compatibility of tEXt/zTXt chunk processing: Restored the first four members of png_text to the same order as v.1.0.5d. Added members "lang_key" and "itxt_length" to png_text struct. Set text_length=0 when "text" contains iTXt data. Use the "compression" member to distinguish among tEXt/zTXt/iTXt types. Added PNG_ITXT_COMPRESSION_NONE (1) and PNG_ITXT_COMPRESSION_zTXt(2) macros. The "Note" above, about backward incompatibility of libpng-1.0.5e, no longer applies. Fixed png_read|write_iTXt() to read|write parameters in the right order, and to write the iTXt chunk after IDAT if it appears in the end_ptr. Added pnggccrd.c, version of pngvcrd.c Intel assembler for gcc (Greg Roelofs) Reversed the order of trying to write floating-point and fixed-point gAMA. version 1.0.5k [December 27, 1999] Added many parentheses, e.g., "if (a && b & c)" becomes "if (a && (b & c))" Added png_handle_as_unknown() function (Glenn) Added png_free_chunk_list() function and chunk_list and num_chunk_list members of png_ptr. Eliminated erroneous warnings about multiple sPLT chunks and sPLT-after-PLTE. Fixed a libpng-1.0.5h bug in pngrutil.c that was issuing erroneous warnings about ignoring incorrect gAMA with sRGB (gAMA was in fact not ignored) Added png_free_tRNS(); png_set_tRNS() now malloc's its own trans array (ESR). Define png_get_int_32 when oFFs chunk is supported as well as when pCAL is. Changed type of proflen from png_int_32 to png_uint_32 in png_get_iCCP(). version 1.0.5l [January 1, 2000] Added functions png_set_read_user_chunk_fn() and png_get_user_chunk_ptr() for setting a callback function to handle unknown chunks and for retrieving the associated user pointer (Glenn). version 1.0.5m [January 7, 2000] Added high-level functions png_read_png(), png_write_png(), png_free_pixels(). version 1.0.5n [January 9, 2000] Added png_free_PLTE() function, and modified png_set_PLTE() to malloc its own memory for info_ptr->palette. This makes it safe for the calling application to free its copy of the palette any time after it calls png_set_PLTE(). version 1.0.5o [January 20, 2000] Cosmetic changes only (removed some trailing blanks and TABs) version 1.0.5p [January 31, 2000] Renamed pngdll.mak to makefile.bd32 Cosmetic changes in pngtest.c version 1.0.5q [February 5, 2000] Relocated the makefile.solaris warning about PATH problems. Fixed pngvcrd.c bug by pushing/popping registers in mmxsupport (Bruce Oberg) Revised makefile.gcmmx Added PNG_SETJMP_SUPPORTED, PNG_SETJMP_NOT_SUPPORTED, and PNG_ABORT() macros version 1.0.5r [February 7, 2000] Removed superfluous prototype for png_get_itxt from png.h Fixed a bug in pngrtran.c that improperly expanded the background color. Return *num_text=0 from png_get_text() when appropriate, and fix documentation of png_get_text() in libpng.txt/libpng.3. version 1.0.5s [February 18, 2000] Added "png_jmp_env()" macro to pngconf.h, to help people migrate to the new error handler that's planned for the next libpng release, and changed example.c, pngtest.c, and contrib programs to use this macro. Revised some of the DLL-export macros in pngconf.h (Greg Roelofs) Fixed a bug in png_read_png() that caused it to fail to expand some images that it should have expanded. Fixed some mistakes in the unused and undocumented INCH_CONVERSIONS functions in pngget.c Changed the allocation of palette, history, and trans arrays back to the version 1.0.5 method (linking instead of copying) which restores backward compatibility with version 1.0.5. Added some remarks about that in example.c. Added "free_me" member to info_ptr and png_ptr and added png_free_data() function. Updated makefile.linux and makefile.gccmmx to make directories conditionally. Made cosmetic changes to pngasmrd.h Added png_set_rows() and png_get_rows(), for use with png_read|write_png(). Modified png_read_png() to allocate info_ptr->row_pointers only if it hasn't already been allocated. version 1.0.5t [March 4, 2000] Changed png_jmp_env() migration aiding macro to png_jmpbuf(). Fixed "interlace" typo (should be "interlaced") in contrib/gregbook/read2-x.c Fixed bug with use of PNG_BEFORE_IHDR bit in png_ptr->mode, introduced when PNG_FLAG_HAVE_CHUNK_HEADER was moved into png_ptr->mode in version 1.0.5b Files in contrib/gregbook were revised to use png_jmpbuf() and to select a 24-bit visual if one is available, and to allow abbreviated options. Files in contrib/pngminus were revised to use the png_jmpbuf() macro. Removed spaces in makefile.linux and makefile.gcmmx, introduced in 1.0.5s version 1.0.5u [March 5, 2000] Simplified the code that detects old png.h in png.c and pngtest.c Renamed png_spalette (_p, _pp) to png_sPLT_t (_tp, _tpp) Increased precision of rgb_to_gray calculations from 8 to 15 bits and added png_set_rgb_to_gray_fixed() function. Added makefile.bc32 (32-bit Borland C++, C mode) version 1.0.5v [March 11, 2000] Added some parentheses to the png_jmpbuf macro definition. Updated references to the zlib home page, which has moved to freesoftware.com. Corrected bugs in documentation regarding png_read_row() and png_write_row(). Updated documentation of png_rgb_to_gray calculations in libpng.3/libpng.txt. Renamed makefile.borland,turboc3 back to makefile.bor,tc3 as in version 1.0.3, revised borland makefiles; added makefile.ibmvac3 and makefile.gcc (Cosmin) version 1.0.6 [March 20, 2000] Minor revisions of makefile.bor, libpng.txt, and gregbook/rpng2-win.c Added makefile.sggcc (SGI IRIX with gcc) version 1.0.6d [April 7, 2000] Changed sprintf() to strcpy() in png_write_sCAL_s() to work without STDIO Added data_length parameter to png_decompress_chunk() function Revised documentation to remove reference to abandoned png_free_chnk functions Fixed an error in png_rgb_to_gray_fixed() Revised example.c, usage of png_destroy_write_struct(). Renamed makefile.ibmvac3 to makefile.ibmc, added libpng.icc IBM project file Added a check for info_ptr->free_me&PNG_FREE_TEXT when freeing text in png.c Simplify png_sig_bytes() function to remove use of non-ISO-C strdup(). version 1.0.6e [April 9, 2000] Added png_data_freer() function. In the code that checks for over-length tRNS chunks, added check of info_ptr->num_trans as well as png_ptr->num_trans (Matthias Benckmann) Minor revisions of libpng.txt/libpng.3. Check for existing data and free it if the free_me flag is set, in png_set_*() and png_handle_*(). Only define PNG_WEIGHTED_FILTERS_SUPPORTED when PNG_FLOATING_POINT_SUPPORTED is defined. Changed several instances of PNG_NO_CONSOLE_ID to PNG_NO_STDIO in pngrutil.c and mentioned the purposes of the two macros in libpng.txt/libpng.3. version 1.0.6f [April 14, 2000] Revised png_set_iCCP() and png_set_rows() to avoid prematurely freeing data. Add checks in png_set_text() for NULL members of the input text structure. Revised libpng.txt/libpng.3. Removed superfluous prototype for png_set_itxt from png.h Removed "else" from pngread.c, after png_error(), and changed "0" to "length". Changed several png_errors about malformed ancillary chunks to png_warnings. version 1.0.6g [April 24, 2000] Added png_pass-* arrays to pnggccrd.c when PNG_USE_LOCAL_ARRAYS is defined. Relocated paragraph about png_set_background() in libpng.3/libpng.txt and other revisions (Matthias Benckmann) Relocated info_ptr->free_me, png_ptr->free_me, and other info_ptr and png_ptr members to restore binary compatibility with libpng-1.0.5 (breaks compatibility with libpng-1.0.6). version 1.0.6h [April 24, 2000] Changed shared library so-number pattern from 2.x.y.z to xy.z (this builds libpng.so.10 & libpng.so.10.6h instead of libpng.so.2 & libpng.so.2.1.0.6h) This is a temporary change for test purposes. version 1.0.6i [May 2, 2000] Rearranged some members at the end of png_info and png_struct, to put unknown_chunks_num and free_me within the original size of the png_structs and free_me, png_read_user_fn, and png_free_fn within the original png_info, because some old applications allocate the structs directly instead of using png_create_*(). Added documentation of user memory functions in libpng.txt/libpng.3 Modified png_read_png so that it will use user_allocated row_pointers if present, unless free_me directs that it be freed, and added description of the use of png_set_rows() and png_get_rows() in libpng.txt/libpng.3. Added PNG_LEGACY_SUPPORTED macro, and #ifdef out all new (since version 1.00) members of png_struct and png_info, to regain binary compatibility when you define this macro. Capabilities lost in this event are user transforms (new in version 1.0.0),the user transform pointer (new in version 1.0.2), rgb_to_gray (new in 1.0.5), iCCP, sCAL, sPLT, the high-level interface, and unknown chunks support (all new in 1.0.6). This was necessary because of old applications that allocate the structs directly as authors were instructed to do in libpng-0.88 and earlier, instead of using png_create_*(). Added modes PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT which can be used to detect codes that directly allocate the structs, and code to check these modes in png_read_init() and png_write_init() and generate a libpng error if the modes aren't set and PNG_LEGACY_SUPPORTED was not defined. Added makefile.intel and updated makefile.watcom (Pawel Mrochen) version 1.0.6j [May 3, 2000] Overloaded png_read_init() and png_write_init() with macros that convert calls to png_read_init_2() or png_write_init_2() that check the version and structure sizes. version 1.0.7beta11 [May 7, 2000] Removed the new PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT modes which are no longer used. Eliminated the three new members of png_text when PNG_LEGACY_SUPPORTED is defined or when neither PNG_READ_iTXt_SUPPORTED nor PNG_WRITE_iTXT_SUPPORTED is defined. Made PNG_NO_READ|WRITE_iTXt the default setting, to avoid memory overrun when old applications fill the info_ptr->text structure directly. Added PNGAPI macro, and added it to the definitions of all exported functions. Relocated version macro definitions ahead of the includes of zlib.h and pngconf.h in png.h. version 1.0.7beta12 [May 12, 2000] Revised pngset.c to avoid a problem with expanding the png_debug macro. Deleted some extraneous defines from pngconf.h Made PNG_NO_CONSOLE_IO the default condition when PNG_BUILD_DLL is defined. Use MSC _RPTn debugging instead of fprintf if _MSC_VER is defined. Added png_access_version_number() function. Check for mask&PNG_FREE_CHNK (for TEXT, SCAL, PCAL) in png_free_data(). Expanded libpng.3/libpng.txt information about png_data_freer(). version 1.0.7beta14 [May 17, 2000] (beta13 was not published) Changed pnggccrd.c and pngvcrd.c to handle bad adaptive filter types as warnings instead of errors, as pngrutil.c does. Set the PNG_INFO_IDAT valid flag in png_set_rows() so png_write_png() will actually write IDATs. Made the default PNG_USE_LOCAL_ARRAYS depend on PNG_DLL instead of WIN32. Make png_free_data() ignore its final parameter except when freeing data that can have multiple instances (text, sPLT, unknowns). Fixed a new bug in png_set_rows(). Removed info_ptr->valid tests from png_free_data(), as in version 1.0.5. Added png_set_invalid() function. Fixed incorrect illustrations of png_destroy_write_struct() in example.c. version 1.0.7beta15 [May 30, 2000] Revised the deliberately erroneous Linux setjmp code in pngconf.h to produce fewer error messages. Rearranged checks for Z_OK to check the most likely path first in pngpread.c and pngwutil.c. Added checks in pngtest.c for png_create_*() returning NULL, and mentioned in libpng.txt/libpng.3 the need for applications to check this. Changed names of png_default_*() functions in pngtest to pngtest_*(). Changed return type of png_get_x|y_offset_*() from png_uint_32 to png_int_32. Fixed some bugs in the unused PNG_INCH_CONVERSIONS functions in pngget.c Set each pointer to NULL after freeing it in png_free_data(). Worked around a problem in pngconf.h; AIX's strings.h defines an "index" macro that conflicts with libpng's png_color_16.index. (Dimitri Papadapoulos) Added "msvc" directory with MSVC++ project files (Simon-Pierre Cadieux). version 1.0.7beta16 [June 4, 2000] Revised the workaround of AIX string.h "index" bug. Added a check for overlength PLTE chunk in pngrutil.c. Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer indexing in pngrutil.c and pngwutil.c to accommodate a buggy compiler. Added a warning in png_decompress_chunk() when it runs out of data, e.g. when it tries to read an erroneous PhotoShop iCCP chunk. Added PNG_USE_DLL macro. Revised the copyright/disclaimer/license notice. Added contrib/msvctest directory version 1.0.7rc1 [June 9, 2000] Corrected the definition of PNG_TRANSFORM_INVERT_ALPHA (0x0400 not 0x0200) Added contrib/visupng directory (Willem van Schaik) version 1.0.7beta18 [June 23, 2000] Revised PNGAPI definition, and pngvcrd.c to work with __GCC__ and do not redefine PNGAPI if it is passed in via a compiler directive. Revised visupng/PngFile.c to remove returns from within the Try block. Removed leading underscores from "_PNG_H" and "_PNG_SAVE_BSD_SOURCE" macros. Updated contrib/visupng/cexcept.h to version 1.0.0. Fixed bugs in pngwrite.c and pngwutil.c that prevented writing iCCP chunks. version 1.0.7rc2 [June 28, 2000] Updated license to include disclaimers required by UCITA. Fixed "DJBPP" typo in pnggccrd.c introduced in beta18. version 1.0.7 [July 1, 2000] Revised the definition of "trans_values" in libpng.3/libpng.txt version 1.0.8beta1 [July 8, 2000] Added png_free(png_ptr, key) two places in pngpread.c to stop memory leaks. Changed PNG_NO_STDIO to PNG_NO_CONSOLE_IO, several places in pngrutil.c and pngwutil.c. Changed PNG_EXPORT_VAR to use PNG_IMPEXP, in pngconf.h. Removed unused "#include " from png.c Added WindowsCE support. Revised pnggccrd.c to work with gcc-2.95.2 and in the Cygwin environment. version 1.0.8beta2 [July 10, 2000] Added project files to the wince directory and made further revisions of pngtest.c, pngrio.c, and pngwio.c in support of WindowsCE. version 1.0.8beta3 [July 11, 2000] Only set the PNG_FLAG_FREE_TRNS or PNG_FREE_TRNS flag in png_handle_tRNS() for indexed-color input files to avoid potential double-freeing trans array under some unusual conditions; problem was introduced in version 1.0.6f. Further revisions to pngtest.c and files in the wince subdirectory. version 1.0.8beta4 [July 14, 2000] Added the files pngbar.png and pngbar.jpg to the distribution. Added makefile.cygwin, and cygwin support in pngconf.h Added PNG_NO_ZALLOC_ZERO macro (makes png_zalloc skip zeroing memory) version 1.0.8rc1 [July 16, 2000] Revised png_debug() macros and statements to eliminate compiler warnings. version 1.0.8 [July 24, 2000] Added png_flush() in pngwrite.c, after png_write_IEND(). Updated makefile.hpux to build a shared library. version 1.0.9beta1 [November 10, 2000] Fixed typo in scripts/makefile.hpux Updated makevms.com in scripts and contrib/* and contrib/* (Martin Zinser) Fixed seqence-point bug in contrib/pngminus/png2pnm (Martin Zinser) Changed "cdrom.com" in documentation to "libpng.org" Revised pnggccrd.c to get it all working, and updated makefile.gcmmx (Greg). Changed type of "params" from voidp to png_voidp in png_read|write_png(). Make sure PNGAPI and PNG_IMPEXP are defined in pngconf.h. Revised the 3 instances of WRITEFILE in pngtest.c. Relocated "msvc" and "wince" project subdirectories into "dll" subdirectory. Updated png.rc in dll/msvc project Revised makefile.dec to define and use LIBPATH and INCPATH Increased size of global png_libpng_ver[] array from 12 to 18 chars. Made global png_libpng_ver[], png_sig[] and png_pass_*[] arrays const. Removed duplicate png_crc_finish() from png_handle_bKGD() function. Added a warning when application calls png_read_update_info() multiple times. Revised makefile.cygwin Fixed bugs in iCCP support in pngrutil.c and pngwutil.c. Replaced png_set_empty_plte_permitted() with png_permit_mng_features(). version 1.0.9beta2 [November 19, 2000] Renamed the "dll" subdirectory "projects". Added borland project files to "projects" subdirectory. Set VS_FF_PRERELEASE and VS_FF_PATCHED flags in msvc/png.rc when appropriate. Add error message in png_set_compression_buffer_size() when malloc fails. version 1.0.9beta3 [November 23, 2000] Revised PNG_LIBPNG_BUILD_TYPE macro in png.h, used in the msvc project. Removed the png_flush() in pngwrite.c that crashes some applications that don't set png_output_flush_fn. Added makefile.macosx and makefile.aix to scripts directory. version 1.0.9beta4 [December 1, 2000] Change png_chunk_warning to png_warning in png_check_keyword(). Increased the first part of msg buffer from 16 to 18 in png_chunk_error(). version 1.0.9beta5 [December 15, 2000] Added support for filter method 64 (for PNG datastreams embedded in MNG). version 1.0.9beta6 [December 18, 2000] Revised png_set_filter() to accept filter method 64 when appropriate. Added new PNG_HAVE_PNG_SIGNATURE bit to png_ptr->mode and use it to help prevent applications from using MNG features in PNG datastreams. Added png_permit_mng_features() function. Revised libpng.3/libpng.txt. Changed "filter type" to "filter method". version 1.0.9rc1 [December 23, 2000] Revised test for PNG_HAVE_PNG_SIGNATURE in pngrutil.c Fixed error handling of unknown compression type in png_decompress_chunk(). In pngconf.h, define __cdecl when _MSC_VER is defined. version 1.0.9beta7 [December 28, 2000] Changed PNG_TEXT_COMPRESSION_zTXt to PNG_COMPRESSION_TYPE_BASE several places. Revised memory management in png_set_hIST and png_handle_hIST in a backward compatible manner. PLTE and tRNS were revised similarly. Revised the iCCP chunk reader to ignore trailing garbage. version 1.0.9beta8 [January 12, 2001] Moved pngasmrd.h into pngconf.h. Improved handling of out-of-spec garbage iCCP chunks generated by PhotoShop. version 1.0.9beta9 [January 15, 2001] Added png_set_invalid, png_permit_mng_features, and png_mmx_supported to wince and msvc project module definition files. Minor revision of makefile.cygwin. Fixed bug with progressive reading of narrow interlaced images in pngpread.c version 1.0.9beta10 [January 16, 2001] Do not typedef png_FILE_p in pngconf.h when PNG_NO_STDIO is defined. Fixed "png_mmx_supported" typo in project definition files. version 1.0.9beta11 [January 19, 2001] Updated makefile.sgi to make shared library. Removed png_mmx_support() function and disabled PNG_MNG_FEATURES_SUPPORTED by default, for the benefit of DLL forward compatibility. These will be re-enabled in version 1.2.0. version 1.0.9rc2 [January 22, 2001] Revised cygwin support. version 1.0.9 [January 31, 2001] Added check of cygwin's ALL_STATIC in pngconf.h Added "-nommx" parameter to contrib/gregbook/rpng2-win and rpng2-x demos. version 1.0.10beta1 [March 14, 2001] Revised makefile.dec, makefile.sgi, and makefile.sggcc; added makefile.hpgcc. Reformatted libpng.3 to eliminate bad line breaks. Added checks for _mmx_supported in the read_filter_row function of pnggccrd.c Added prototype for png_mmx_support() near the top of pnggccrd.c Moved some error checking from png_handle_IHDR to png_set_IHDR. Added PNG_NO_READ_SUPPORTED and PNG_NO_WRITE_SUPPORTED macros. Revised png_mmx_support() function in pnggccrd.c Restored version 1.0.8 PNG_WRITE_EMPTY_PLTE_SUPPORTED behavior in pngwutil.c Fixed memory leak in contrib/visupng/PngFile.c Fixed bugs in png_combine_row() in pnggccrd.c and pngvcrd.c (C version) Added warnings when retrieving or setting gamma=0. Increased the first part of msg buffer from 16 to 18 in png_chunk_warning(). version 1.0.10rc1 [March 23, 2001] Changed all instances of memcpy, strcpy, and strlen to png_memcpy, png_strcpy, and png_strlen. Revised png_mmx_supported() function in pnggccrd.c to return proper value. Fixed bug in progressive reading (pngpread.c) with small images (height < 8). version 1.0.10 [March 30, 2001] Deleted extraneous space (introduced in 1.0.9) from line 42 of makefile.cygwin Added beos project files (Chris Herborth) version 1.0.11beta1 [April 3, 2001] Added type casts on several png_malloc() calls (Dimitri Papadapoulos). Removed a no-longer needed AIX work-around from pngconf.h Changed several "//" single-line comments to C-style in pnggccrd.c version 1.0.11beta2 [April 11, 2001] Removed PNGAPI from several functions whose prototypes did not have PNGAPI. Updated scripts/pngos2.def version 1.0.11beta3 [April 14, 2001] Added checking the results of many instances of png_malloc() for NULL version 1.0.11beta4 [April 20, 2001] Undid the changes from version 1.0.11beta3. Added a check for NULL return from user's malloc_fn(). Removed some useless type casts of the NULL pointer. Added makefile.netbsd version 1.0.11 [April 27, 2001] Revised makefile.netbsd version 1.0.12beta1 [May 14, 2001] Test for Windows platform in pngconf.h when including malloc.h (Emmanuel Blot) Updated makefile.cygwin and handling of Cygwin's ALL_STATIC in pngconf.h Added some never-to-be-executed code in pnggccrd.c to quiet compiler warnings. Eliminated the png_error about apps using png_read|write_init(). Instead, libpng will reallocate the png_struct and info_struct if they are too small. This retains future binary compatibility for old applications written for libpng-0.88 and earlier. version 1.2.0beta1 [May 6, 2001] Bumped DLLNUM to 2. Re-enabled PNG_MNG_FEATURES_SUPPORTED and enabled PNG_ASSEMBLER_CODE_SUPPORTED by default. Added runtime selection of MMX features. Added png_set_strip_error_numbers function and related macros. version 1.2.0beta2 [May 7, 2001] Finished merging 1.2.0beta1 with version 1.0.11 Added a check for attempts to read or write PLTE in grayscale PNG datastreams. version 1.2.0beta3 [May 17, 2001] Enabled user memory function by default. Modified png_create_struct so it passes user mem_ptr to user memory allocator. Increased png_mng_features flag from png_byte to png_uint_32. Bumped shared-library (so-number) and dll-number to 3. version 1.2.0beta4 [June 23, 2001] Check for missing profile length field in iCCP chunk and free chunk_data in case of truncated iCCP chunk. Bumped shared-library number to 3 in makefile.sgi and makefile.sggcc Bumped dll-number from 2 to 3 in makefile.cygwin Revised contrib/gregbook/rpng*-x.c to avoid a memory leak and to exit cleanly if user attempts to run it on an 8-bit display. Updated contrib/gregbook Use png_malloc instead of png_zalloc to allocate palette in pngset.c Updated makefile.ibmc Added some typecasts to eliminate gcc 3.0 warnings. Changed prototypes of png_write_oFFS width and height from png_uint_32 to png_int_32. Updated example.c Revised prototypes for png_debug_malloc and png_debug_free in pngtest.c version 1.2.0beta5 [August 8, 2001] Revised contrib/gregbook Revised makefile.gcmmx Revised pnggccrd.c to conditionally compile some thread-unsafe code only when PNG_THREAD_UNSAFE_OK is defined. Added tests to prevent pngwutil.c from writing a bKGD or tRNS chunk with value exceeding 2^bit_depth-1 Revised makefile.sgi and makefile.sggcc Replaced calls to fprintf(stderr,...) with png_warning() in pnggccrd.c Removed restriction that do_invert_mono only operate on 1-bit opaque files version 1.2.0 [September 1, 2001] Changed a png_warning() to png_debug() in pnggccrd.c Fixed contrib/gregbook/rpng-x.c, rpng2-x.c to avoid crash with XFreeGC(). version 1.2.1beta1 [October 19, 2001] Revised makefile.std in contrib/pngminus Include background_1 in png_struct regardless of gamma support. Revised makefile.netbsd and makefile.macosx, added makefile.darwin. Revised example.c to provide more details about using row_callback(). version 1.2.1beta2 [October 25, 2001] Added type cast to each NULL appearing in a function call, except for WINCE functions. Added makefile.so9. version 1.2.1beta3 [October 27, 2001] Removed type casts from all NULLs. Simplified png_create_struct_2(). version 1.2.1beta4 [November 7, 2001] Revised png_create_info_struct() and png_creat_struct_2(). Added error message if png_write_info() was omitted. Type cast NULLs appearing in function calls when _NO_PROTO or PNG_TYPECAST_NULL is defined. version 1.2.1rc1 [November 24, 2001] Type cast NULLs appearing in function calls except when PNG_NO_TYPECAST_NULL is defined. Changed typecast of "size" argument to png_size_t in pngmem.c calls to the user malloc_fn, to agree with the prototype in png.h Added a pop/push operation to pnggccrd.c, to preserve Eflag (Maxim Sobolev) Updated makefile.sgi to recognize LIBPATH and INCPATH. Updated various makefiles so "make clean" does not remove previous major version of the shared library. version 1.2.1rc2 [December 4, 2001] Always allocate 256-entry internal palette, hist, and trans arrays, to avoid out-of-bounds memory reference caused by invalid PNG datastreams. Added a check for prefix_length > data_length in iCCP chunk handler. version 1.2.1 [December 7, 2001] None. version 1.2.2beta1 [February 22, 2002] Fixed a bug with reading the length of iCCP profiles (Larry Reeves). Revised makefile.linux, makefile.gcmmx, and makefile.sgi to generate libpng.a, libpng12.so (not libpng.so.3), and libpng12/png.h Revised makefile.darwin to remove "-undefined suppress" option. Added checks for gamma and chromaticity values over 21474.83, which exceed the limit for PNG unsigned 32-bit integers when encoded. Revised calls to png_create_read_struct() and png_create_write_struct() for simpler debugging. Revised png_zalloc() so zlib handles errors (uses PNG_FLAG_MALLOC_NULL_MEM_OK) version 1.2.2beta2 [February 23, 2002] Check chunk_length and idat_size for invalid (over PNG_MAX_UINT) lengths. Check for invalid image dimensions in png_get_IHDR. Added missing "fi;" in the install target of the SGI makefiles. Added install-static to all makefiles that make shared libraries. Always do gamma compensation when image is partially transparent. version 1.2.2beta3 [March 7, 2002] Compute background.gray and background_1.gray even when color_type is RGB in case image gets reduced to gray later. Modified shared-library makefiles to install pkgconfig/libpngNN.pc. Export (with PNGAPI) png_zalloc, png_zfree, and png_handle_as_unknown Removed unused png_write_destroy_info prototype from png.h Eliminated incorrect use of width_mmx from pnggccrd.c in pixel_bytes == 8 case Added install-shared target to all makefiles that make shared libraries. Stopped a double free of palette, hist, and trans when not using free_me. Added makefile.32sunu for Sun Ultra 32 and makefile.64sunu for Sun Ultra 64. version 1.2.2beta4 [March 8, 2002] Compute background.gray and background_1.gray even when color_type is RGB in case image gets reduced to gray later (Jason Summers). Relocated a misplaced /bin/rm in the "install-shared" makefile targets Added PNG_1_0_X macro which can be used to build a 1.0.x-compatible library. version 1.2.2beta5 [March 26, 2002] Added missing PNGAPI to several function definitions. Check for invalid bit_depth or color_type in png_get_IHDR(), and check for missing PLTE or IHDR in png_push_read_chunk() (Matthias Clasen). Revised iTXt support to accept NULL for lang and lang_key. Compute gamma for color components of background even when color_type is gray. Changed "()" to "{}" in scripts/libpng.pc.in. Revised makefiles to put png.h and pngconf.h only in $prefix/include/libpngNN Revised makefiles to make symlink to libpng.so.NN in addition to libpngNN.so version 1.2.2beta6 [March 31, 2002] version 1.0.13beta1 [March 31, 2002] Prevent png_zalloc() from trying to memset memory that it failed to acquire. Add typecasts of PNG_MAX_UINT in pngset_cHRM_fixed() (Matt Holgate). Ensure that the right function (user or default) is used to free the png_struct after an error in png_create_read_struct_2(). version 1.2.2rc1 [April 7, 2002] version 1.0.13rc1 [April 7, 2002] Save the ebx register in pnggccrd.c (Sami Farin) Add "mem_ptr = png_ptr->mem_ptr" in png_destroy_write_struct() (Paul Gardner). Updated makefiles to put headers in include/libpng and remove old include/*.h. version 1.2.2 [April 15, 2002] version 1.0.13 [April 15, 2002] Revised description of png_set_filter() in libpng.3/libpng.txt. Revised makefile.netbsd and added makefile.neNNbsd and makefile.freebsd version 1.0.13patch01 [April 17, 2002] version 1.2.2patch01 [April 17, 2002] Changed ${PNGMAJ}.${PNGVER} bug to ${PNGVER} in makefile.sgi and makefile.sggcc Fixed VER -> PNGVER typo in makefile.macosx and added install-static to install Added install: target to makefile.32sunu and makefile.64sunu version 1.0.13patch03 [April 18, 2002] version 1.2.2patch03 [April 18, 2002] Revised 15 makefiles to link libpng.a to libpngNN.a and the include libpng subdirectory to libpngNN subdirectory without the full pathname. Moved generation of libpng.pc from "install" to "all" in 15 makefiles. version 1.2.3rc1 [April 28, 2002] Added install-man target to 15 makefiles (Dimitri Papadopolous-Orfanos). Added $(DESTDIR) feature to 24 makefiles (Tim Mooney) Fixed bug with $prefix, should be $(prefix) in makefile.hpux. Updated cygwin-specific portion of pngconf.h and revised makefile.cygwin Added a link from libpngNN.pc to libpng.pc in 15 makefiles. Added links from include/libpngNN/*.h to include/*.h in 24 makefiles. Revised makefile.darwin to make relative links without full pathname. Added setjmp() at the end of png_create_*_struct_2() in case user forgets to put one in their application. Restored png_zalloc() and png_zfree() prototypes to version 1.2.1 and removed them from module definition files. version 1.2.3rc2 [May 1, 2002] Fixed bug in reporting number of channels in pngget.c and pngset.c, that was introduced in version 1.2.2beta5. Exported png_zalloc(), png_zfree(), png_default_read(), png_default_write(), png_default_flush(), and png_push_fill_buffer() and included them in module definition files. Added "libpng.pc" dependency to the "install-shared" target in 15 makefiles. version 1.2.3rc3 [May 1, 2002] Revised prototype for png_default_flush() Remove old libpng.pc and libpngNN.pc before installing new ones. version 1.2.3rc4 [May 2, 2002] Typos in *.def files (png_default_read|write -> png_default_read|write_data) In makefiles, changed rm libpng.NN.pc to rm libpngNN.pc Added libpng-config and libpngNN-config and modified makefiles to install them. Changed $(MANPATH) to $(DESTDIR)$(MANPATH) in makefiles Added "Win32 DLL VB" configuration to projects/msvc/libpng.dsp version 1.2.3rc5 [May 11, 2002] Changed "error" and "message" in prototypes to "error_message" and "warning_message" to avoid namespace conflict. Revised 15 makefiles to build libpng-config from libpng-config-*.in Once more restored png_zalloc and png_zfree to regular nonexported form. Restored png_default_read|write_data, png_default_flush, png_read_fill_buffer to nonexported form, but with PNGAPI, and removed them from module def files. version 1.2.3rc6 [May 14, 2002] Removed "PNGAPI" from png_zalloc() and png_zfree() in png.c Changed "Gz" to "Gd" in projects/msvc/libpng.dsp and zlib.dsp. Removed leftover libpng-config "sed" script from four makefiles. Revised libpng-config creating script in 16 makefiles. version 1.2.3 [May 22, 2002] Revised libpng-config target in makefile.cygwin. Removed description of png_set_mem_fn() from documentation. Revised makefile.freebsd. Minor cosmetic changes to 15 makefiles, e.g., $(DI) = $(DESTDIR)/$(INCDIR). Revised projects/msvc/README.txt Changed -lpng to -lpngNN in LDFLAGS in several makefiles. version 1.2.4beta1 [May 24, 2002] Added libpng.pc and libpng-config to "all:" target in 16 makefiles. Fixed bug in 16 makefiles: $(DESTDIR)/$(LIBPATH) to $(DESTDIR)$(LIBPATH) Added missing "\" before closing double quote in makefile.gcmmx. Plugged various memory leaks; added png_malloc_warn() and png_set_text_2() functions. version 1.2.4beta2 [June 25, 2002] Plugged memory leak of png_ptr->current_text (Matt Holgate). Check for buffer overflow before reading CRC in pngpread.c (Warwick Allison) Added -soname to the loader flags in makefile.dec, makefile.sgi, and makefile.sggcc. Added "test-installed" target to makefile.linux, makefile.gcmmx, makefile.sgi, and makefile.sggcc. version 1.2.4beta3 [June 28, 2002] Plugged memory leak of row_buf in pngtest.c when there is a png_error(). Detect buffer overflow in pngpread.c when IDAT is corrupted with extra data. Added "test-installed" target to makefile.32sunu, makefile.64sunu, makefile.beos, makefile.darwin, makefile.dec, makefile.macosx, makefile.solaris, makefile.hpux, makefile.hpgcc, and makefile.so9. version 1.2.4rc1 and 1.0.14rc1 [July 2, 2002] Added "test-installed" target to makefile.cygwin and makefile.sco. Revised pnggccrd.c to be able to back out version 1.0.x via PNG_1_0_X macro. version 1.2.4 and 1.0.14 [July 8, 2002] Changed png_warning() to png_error() when width is too large to process. version 1.2.4patch01 [July 20, 2002] Revised makefile.cygwin to use DLL number 12 instead of 13. version 1.2.5beta1 [August 6, 2002] Added code to contrib/gregbook/readpng2.c to ignore unused chunks. Replaced toucan.png in contrib/gregbook (it has been corrupt since 1.0.11) Removed some stray *.o files from contrib/gregbook. Changed png_error() to png_warning() about "Too much data" in pngpread.c and about "Extra compressed data" in pngrutil.c. Prevent png_ptr->pass from exceeding 7 in png_push_finish_row(). Updated makefile.hpgcc Updated png.c and pnggccrd.c handling of return from png_mmx_support() version 1.2.5beta2 [August 15, 2002] Only issue png_warning() about "Too much data" in pngpread.c when avail_in is nonzero. Updated makefiles to install a separate libpng.so.3 with its own rpath. version 1.2.5rc1 and 1.0.15rc1 [August 24, 2002] Revised makefiles to not remove previous minor versions of shared libraries. version 1.2.5rc2 and 1.0.15rc2 [September 16, 2002] Revised 13 makefiles to remove "-lz" and "-L$(ZLIBLIB)", etc., from shared library loader directive. Added missing "$OBJSDLL" line to makefile.gcmmx. Added missing "; fi" to makefile.32sunu. version 1.2.5rc3 and 1.0.15rc3 [September 18, 2002] Revised libpng-config script. version 1.2.5 and 1.0.15 [October 3, 2002] Revised makefile.macosx, makefile.darwin, makefile.hpgcc, and makefile.hpux, and makefile.aix. Relocated two misplaced PNGAPI lines in pngtest.c Send comments/corrections/commendations to png-implement@ccrc.wustl.edu or to randeg@alum.rpi.edu Glenn R-P gamera-3.3.3/src/libpng-1.2.5/INSTALL0000644000076500000000000001504510714675701015513 0ustar chriswheel Installing libpng version 1.2.5 - October 3, 2002 Before installing libpng, you must first install zlib. zlib can usually be found wherever you got libpng. zlib can be placed in another directory, at the same level as libpng. Note that your system might already have a preinstalled zlib, but you will still need to have access to the zlib.h and zconf.h include files that correspond to the version of zlib that's installed. You can rename the directories that you downloaded (they might be called "libpng-1.2.5" or "lpng109" and "zlib-1.1.4" or "zlib114") so that you have directories called "zlib" and "libpng". Your directory structure should look like this: .. (the parent directory) libpng (this directory) INSTALL (this file) README *.h *.c contrib gregbook msvctest pngminus pngsuite visupng projects beos borland msvc netware.txt wince.txt scripts makefile.* libpng*.in pngtest.png etc. zlib README *.h *.c contrib etc. If the line endings in the files look funny, you may wish to get the other distribution of libpng. It is available in both tar.gz (UNIX style line endings) and zip (DOS style line endings) formats. If you are building libpng with MSVC, you can enter the libpng\msvc directory and follow the instructions in msvc\README.txt. You can build libpng for WindowsCE by entering the downloading and installing the libpng\wince directory as instructed in the projects\wince.txt file, and then following the instructions in the README* files. Similarly, you can build libpng for Netware as instructed in projects\netware.txt. Else enter the zlib directory and follow the instructions in zlib/README, then come back here and choose the appropriate makefile.sys in the scripts directory. The files that are presently available in the scripts directory include makefile.std => Generic UNIX makefile (cc, creates static libpng.a) makefile.linux => Linux/ELF makefile (gcc, creates libpng12.so.0.1.2.5) makefile.gcmmx => Linux/ELF makefile (gcc, creates libpng12.so.0.1.2.5, uses assembler code tuned for Intel MMX platform) makefile.gcc => Generic makefile (gcc, creates static libpng.a) makefile.knr => Archaic UNIX Makefile that converts files with ansi2knr (Requires ansi2knr.c from ftp://ftp.cs.wisc.edu/ghost) makefile.aix => AIX/gcc makefile makefile.cygwin => Cygwin/gcc makefile makefile.darwin => Darwin makefile makefile.dec => DEC Alpha UNIX makefile makefile.hpgcc => FreeBSD makefile makefile.hpgcc => HPUX makefile using gcc makefile.hpux => HPUX (10.20 and 11.00) makefile makefile.ibmc => IBM C/C++ version 3.x for Win32 and OS/2 (static) makefile.intel => Intel C/C++ version 4.0 and later libpng.icc => Project file for IBM VisualAge/C++ version 4.0 or later makefile.macosx => MACOS X Makefile makefile.netbsd => NetBSD/cc makefile, uses PNGGCCRD, makes libpng.so. makefile.ne0bsd => NetBSD/cc makefile, uses PNGGCCRD, makes libpng0.so makefile.openbsd => OpenBSD makefile makefile.sgi => Silicon Graphics IRIX makefile (cc, creates static lib) makefile.sggcc => Silicon Graphics (gcc, creates libpng12.so.0.1.2.5) makefile.sunos => Sun makefile makefile.solaris => Solaris 2.X makefile (gcc, creates libpng12.so.0.1.2.5) makefile.so9 => Solaris 9 makefile (gcc, creates libpng12.so.0.1.2.5) makefile.32sunu => Sun Ultra 32-bit makefile makefile.64sunu => Sun Ultra 64-bit makefile makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc makefile.mips => MIPS makefile makefile.acorn => Acorn makefile makefile.amiga => Amiga makefile smakefile.ppc => AMIGA smakefile for SAS C V6.58/7.00 PPC compiler (Requires SCOPTIONS, copied from scripts/SCOPTIONS.ppc) makefile.atari => Atari makefile makefile.beos => BEOS makefile for X86 makefile.bor => Borland makefile (uses bcc) makefile.bc32 => 32-bit Borland C++ (all modules compiled in C mode) makefile.bd32 => To make a png32bd.dll with Borland C++ 4.5 makefile.tc3 => Turbo C 3.0 makefile makefile.dj2 => DJGPP 2 makefile makefile.msc => Microsoft C makefile makefile.vcawin32 => makefile for Microsoft Visual C++ 5.0 and later (uses assembler code tuned for Intel MMX platform) makefile.vcwin32 => makefile for Microsoft Visual C++ 4.0 and later (does not use assembler code) makefile.os2 => OS/2 Makefile (gcc and emx, requires pngos2.def) pngos2.def => OS/2 module definition file used by makefile.os2 makefile.watcom => Watcom 10a+ Makefile, 32-bit flat memory model makevms.com => VMS build script descrip.mms => VMS makefile for MMS or MMK pngdef.pas => Defines for a png32bd.dll with Borland C++ 4.5 SCOPTIONS.ppc => Used with smakefile.ppc Copy the file (or files) that you need from the scripts directory into this directory, for example MSDOS example: copy scripts\makefile.msc makefile UNIX example: cp scripts/makefile.std makefile Read the makefile to see if you need to change any source or target directories to match your preferences. Then read pngconf.h to see if you want to make any configuration changes. Then just run "make test" which will create the libpng library in this directory and run a quick test that reads the "pngtest.png" file and writes a "pngout.png" file that should be identical to it. Look for "9782 zero samples" in the output of the test. For more confidence, you can run another test by typing "pngtest pngnow.png" and looking for "289 zero samples" in the output. Also, you can run "pngtest -m *.png" in the "contrib/pngsuite" directory and compare your output with the result shown in contrib/pngsuite/README. Most of the makefiles will allow you to run "make install" to put the library in its final resting place (if you want to do that, run "make install" in the zlib directory first if necessary). Some also allow you to run "make test-installed" after you have run "make install". Further information can be found in the README and libpng.txt files, in the individual makefiles, in png.h, in the README files in subdirectories of the LIB directory, and the manual pages libpng.3 and png.5. gamera-3.3.3/src/libpng-1.2.5/KNOWNBUG0000644000076500000000000000062210714675701015632 0ustar chriswheel Known bugs in libpng version 1.2.5 1. April 22, 2001: pnggccrd.c has been reported to crash on NetBSD when reading interlaced PNG files, when assembler code is enabled but running on a non-MMX i386 platform. STATUS: Under investigation. The change to pnggccrd.c in libpng-1.2.1 fixed a problem under FreeBSD but not the problem with NetBSD, which still fails as of libpng-1.2.2rc1. gamera-3.3.3/src/libpng-1.2.5/libpng.txt0000644000076500000000000036444410714675701016510 0ustar chriswheellibpng.txt - A description on how to use and modify libpng libpng version 1.2.5 - October 3, 2002 Updated and distributed by Glenn Randers-Pehrson Copyright (c) 1998-2002 Glenn Randers-Pehrson For conditions of distribution and use, see copyright notice in png.h. based on: libpng 1.0 beta 6 version 0.96 May 28, 1997 Updated and distributed by Andreas Dilger Copyright (c) 1996, 1997 Andreas Dilger libpng 1.0 beta 2 - version 0.88 January 26, 1996 For conditions of distribution and use, see copyright notice in png.h. Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. Updated/rewritten per request in the libpng FAQ Copyright (c) 1995, 1996 Frank J. T. Wojcik December 18, 1995 & January 20, 1996 I. Introduction This file describes how to use and modify the PNG reference library (known as libpng) for your own use. There are five sections to this file: introduction, structures, reading, writing, and modification and configuration notes for various special platforms. In addition to this file, example.c is a good starting point for using the library, as it is heavily commented and should include everything most people will need. We assume that libpng is already installed; see the INSTALL file for instructions on how to install libpng. Libpng was written as a companion to the PNG specification, as a way of reducing the amount of time and effort it takes to support the PNG file format in application programs. The PNG-1.2 specification is available at and at . The PNG-1.0 specification is available as RFC 2083 and as a W3C Recommendation . Some additional chunks are described in the special-purpose public chunks documents at . Other information about PNG, and the latest version of libpng, can be found at the PNG home page, and at . Most users will not have to modify the library significantly; advanced users may want to modify it more. All attempts were made to make it as complete as possible, while keeping the code easy to understand. Currently, this library only supports C. Support for other languages is being considered. Libpng has been designed to handle multiple sessions at one time, to be easily modifiable, to be portable to the vast majority of machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy to use. The ultimate goal of libpng is to promote the acceptance of the PNG file format in whatever way possible. While there is still work to be done (see the TODO file), libpng should cover the majority of the needs of its users. Libpng uses zlib for its compression and decompression of PNG files. Further information about zlib, and the latest version of zlib, can be found at the zlib home page, . The zlib compression utility is a general purpose utility that is useful for more than PNG files, and can be used without libpng. See the documentation delivered with zlib for more details. You can usually find the source files for the zlib utility wherever you find the libpng source files. Libpng is thread safe, provided the threads are using different instances of the structures. Each thread should have its own png_struct and png_info instances, and thus its own image. Libpng does not protect itself against two threads using the same instance of a structure. Note: thread safety may be defeated by use of some of the MMX assembler code in pnggccrd.c, which is only compiled when the user defines PNG_THREAD_UNSAFE_OK. II. Structures There are two main structures that are important to libpng, png_struct and png_info. The first, png_struct, is an internal structure that will not, for the most part, be used by a user except as the first variable passed to every libpng function call. The png_info structure is designed to provide information about the PNG file. At one time, the fields of png_info were intended to be directly accessible to the user. However, this tended to cause problems with applications using dynamically loaded libraries, and as a result a set of interface functions for png_info (the png_get_*() and png_set_*() functions) was developed. The fields of png_info are still available for older applications, but it is suggested that applications use the new interfaces if at all possible. Applications that do make direct access to the members of png_struct (except for png_ptr->jmpbuf) must be recompiled whenever the library is updated, and applications that make direct access to the members of png_info must be recompiled if they were compiled or loaded with libpng version 1.0.6, in which the members were in a different order. In version 1.0.7, the members of the png_info structure reverted to the old order, as they were in versions 0.97c through 1.0.5. Starting with version 2.0.0, both structures are going to be hidden, and the contents of the structures will only be accessible through the png_get/png_set functions. The png.h header file is an invaluable reference for programming with libpng. And while I'm on the topic, make sure you include the libpng header file: #include III. Reading We'll now walk you through the possible functions to call when reading in a PNG file sequentially, briefly explaining the syntax and purpose of each one. See example.c and png.h for more detail. While progressive reading is covered in the next section, you will still need some of the functions discussed in this section to read a PNG file. Setup You will want to do the I/O initialization(*) before you get into libpng, so if it doesn't work, you don't have much to undo. Of course, you will also want to insure that you are, in fact, dealing with a PNG file. Libpng provides a simple check to see if a file is a PNG file. To use it, pass in the first 1 to 8 bytes of the file to the function png_sig_cmp(), and it will return 0 if the bytes match the corresponding bytes of the PNG signature, or nonzero otherwise. Of course, the more bytes you pass in, the greater the accuracy of the prediction. If you are intending to keep the file pointer open for use in libpng, you must ensure you don't read more than 8 bytes from the beginning of the file, and you also have to make a call to png_set_sig_bytes_read() with the number of bytes you read from the beginning. Libpng will then only check the bytes (if any) that your program didn't read. (*): If you are not using the standard I/O functions, you will need to replace them with custom functions. See the discussion under Customizing libpng. FILE *fp = fopen(file_name, "rb"); if (!fp) { return (ERROR); } fread(header, 1, number, fp); is_png = !png_sig_cmp(header, 0, number); if (!is_png) { return (NOT_PNG); } Next, png_struct and png_info need to be allocated and initialized. In order to ensure that the size of these structures is correct even with a dynamically linked libpng, there are functions to initialize and allocate the structures. We also pass the library version, optional pointers to error handling functions, and a pointer to a data struct for use by the error functions, if necessary (the pointer and functions can be NULL if the default error handlers are to be used). See the section on Changes to Libpng below regarding the old initialization functions. The structure allocation functions quietly return NULL if they fail to create the structure, so your application should check for that. png_structp png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, user_error_fn, user_warning_fn); if (!png_ptr) return (ERROR); png_infop info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); return (ERROR); } png_infop end_info = png_create_info_struct(png_ptr); if (!end_info) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); return (ERROR); } If you want to use your own memory allocation routines, define PNG_USER_MEM_SUPPORTED and use png_create_read_struct_2() instead of png_create_read_struct(): png_structp png_ptr = png_create_read_struct_2 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, user_error_fn, user_warning_fn, (png_voidp) user_mem_ptr, user_malloc_fn, user_free_fn); The error handling routines passed to png_create_read_struct() and the memory alloc/free routines passed to png_create_struct_2() are only necessary if you are not using the libpng supplied error handling and memory alloc/free functions. When libpng encounters an error, it expects to longjmp back to your routine. Therefore, you will need to call setjmp and pass your png_jmpbuf(png_ptr). If you read the file from different routines, you will need to update the jmpbuf field every time you enter a new routine that will call a png_*() function. See your documentation of setjmp/longjmp for your compiler for more information on setjmp/longjmp. See the discussion on libpng error handling in the Customizing Libpng section below for more information on the libpng error handling. If an error occurs, and libpng longjmp's back to your setjmp, you will want to call png_destroy_read_struct() to free any memory. if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(fp); return (ERROR); } If you would rather avoid the complexity of setjmp/longjmp issues, you can compile libpng with PNG_SETJMP_NOT_SUPPORTED, in which case errors will result in a call to PNG_ABORT() which defaults to abort(). Now you need to set up the input code. The default for libpng is to use the C function fread(). If you use this, you will need to pass a valid FILE * in the function png_init_io(). Be sure that the file is opened in binary mode. If you wish to handle reading data in another way, you need not call the png_init_io() function, but you must then implement the libpng I/O methods discussed in the Customizing Libpng section below. png_init_io(png_ptr, fp); If you had previously opened the file and read any of the signature from the beginning in order to see if this was a PNG file, you need to let libpng know that there are some bytes missing from the start of the file. png_set_sig_bytes(png_ptr, number); Setting up callback code You can set up a callback function to handle any unknown chunks in the input stream. You must supply the function read_chunk_callback(png_ptr ptr, png_unknown_chunkp chunk); { /* The unknown chunk structure contains your chunk data: */ png_byte name[5]; png_byte *data; png_size_t size; /* Note that libpng has already taken care of the CRC handling */ /* put your code here. Return one of the following: */ return (-n); /* chunk had an error */ return (0); /* did not recognize */ return (n); /* success */ } (You can give your function another name that you like instead of "read_chunk_callback") To inform libpng about your function, use png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr, read_chunk_callback); This names not only the callback function, but also a user pointer that you can retrieve with png_get_user_chunk_ptr(png_ptr); At this point, you can set up a callback function that will be called after each row has been read, which you can use to control a progress meter or the like. It's demonstrated in pngtest.c. You must supply a function void read_row_callback(png_ptr ptr, png_uint_32 row, int pass); { /* put your code here */ } (You can give it another name that you like instead of "read_row_callback") To inform libpng about your function, use png_set_read_status_fn(png_ptr, read_row_callback); Unknown-chunk handling Now you get to set the way the library processes unknown chunks in the input PNG stream. Both known and unknown chunks will be read. Normal behavior is that known chunks will be parsed into information in various info_ptr members; unknown chunks will be discarded. To change this, you can call: png_set_keep_unknown_chunks(png_ptr, info_ptr, keep, chunk_list, num_chunks); keep - 0: do not keep 1: keep only if safe-to-copy 2: keep even if unsafe-to-copy chunk_list - list of chunks affected (a byte string, five bytes per chunk, NULL or '\0' if num_chunks is 0) num_chunks - number of chunks affected; if 0, all unknown chunks are affected Unknown chunks declared in this way will be saved as raw data onto a list of png_unknown_chunk structures. If a chunk that is normally known to libpng is named in the list, it will be handled as unknown, according to the "keep" directive. If a chunk is named in successive instances of png_set_keep_unknown_chunks(), the final instance will take precedence. The high-level read interface At this point there are two ways to proceed; through the high-level read interface, or through a sequence of low-level read operations. You can use the high-level interface if (a) you are willing to read the entire image into memory, and (b) the input transformations you want to do are limited to the following set: PNG_TRANSFORM_IDENTITY No transformation PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to 8 bits PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit samples to bytes PNG_TRANSFORM_PACKSWAP Change order of packed pixels to LSB first PNG_TRANSFORM_EXPAND Perform set_expand() PNG_TRANSFORM_INVERT_MONO Invert monochrome images PNG_TRANSFORM_SHIFT Normalize pixels to the sBIT depth PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA to BGRA PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA to AG PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity to transparency PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples (This excludes setting a background color, doing gamma transformation, dithering, and setting filler.) If this is the case, simply do this: png_read_png(png_ptr, info_ptr, png_transforms, NULL) where png_transforms is an integer containing the logical OR of some set of transformation flags. This call is equivalent to png_read_info(), followed the set of transformations indicated by the transform mask, then png_read_image(), and finally png_read_end(). (The final parameter of this call is not yet used. Someday it might point to transformation parameters required by some future input transform.) After you have called png_read_png(), you can retrieve the image data with row_pointers = png_get_rows(png_ptr, info_ptr); where row_pointers is an array of pointers to the pixel data for each row: png_bytep row_pointers[height]; If you know your image size and pixel size ahead of time, you can allocate row_pointers prior to calling png_read_png() with row_pointers = png_malloc(png_ptr, height*sizeof(png_bytep)); for (int i=0; i) and png_get_(png_ptr, info_ptr, ...) functions return non-zero if the data has been read, or zero if it is missing. The parameters to the png_get_ are set directly if they are simple data types, or a pointer into the info_ptr is returned for any complex types. png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette); palette - the palette for the file (array of png_color) num_palette - number of entries in the palette png_get_gAMA(png_ptr, info_ptr, &gamma); gamma - the gamma the file is written at (PNG_INFO_gAMA) png_get_sRGB(png_ptr, info_ptr, &srgb_intent); srgb_intent - the rendering intent (PNG_INFO_sRGB) The presence of the sRGB chunk means that the pixel data is in the sRGB color space. This chunk also implies specific values of gAMA and cHRM. png_get_iCCP(png_ptr, info_ptr, &name, &compression_type, &profile, &proflen); name - The profile name. compression - The compression type; always PNG_COMPRESSION_TYPE_BASE for PNG 1.0. You may give NULL to this argument to ignore it. profile - International Color Consortium color profile data. May contain NULs. proflen - length of profile data in bytes. png_get_sBIT(png_ptr, info_ptr, &sig_bit); sig_bit - the number of significant bits for (PNG_INFO_sBIT) each of the gray, red, green, and blue channels, whichever are appropriate for the given color type (png_color_16) png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, &trans_values); trans - array of transparent entries for palette (PNG_INFO_tRNS) trans_values - graylevel or color sample values of the single transparent color for non-paletted images (PNG_INFO_tRNS) num_trans - number of transparent entries (PNG_INFO_tRNS) png_get_hIST(png_ptr, info_ptr, &hist); (PNG_INFO_hIST) hist - histogram of palette (array of png_uint_16) png_get_tIME(png_ptr, info_ptr, &mod_time); mod_time - time image was last modified (PNG_VALID_tIME) png_get_bKGD(png_ptr, info_ptr, &background); background - background color (PNG_VALID_bKGD) valid 16-bit red, green and blue values, regardless of color_type num_comments = png_get_text(png_ptr, info_ptr, &text_ptr, &num_text); num_comments - number of comments text_ptr - array of png_text holding image comments text_ptr[i].compression - type of compression used on "text" PNG_TEXT_COMPRESSION_NONE PNG_TEXT_COMPRESSION_zTXt PNG_ITXT_COMPRESSION_NONE PNG_ITXT_COMPRESSION_zTXt text_ptr[i].key - keyword for comment. Must contain 1-79 characters. text_ptr[i].text - text comments for current keyword. Can be empty. text_ptr[i].text_length - length of text string, after decompression, 0 for iTXt text_ptr[i].itxt_length - length of itxt string, after decompression, 0 for tEXt/zTXt text_ptr[i].lang - language of comment (empty string for unknown). text_ptr[i].lang_key - keyword in UTF-8 (empty string for unknown). num_text - number of comments (same as num_comments; you can put NULL here to avoid the duplication) Note while png_set_text() will accept text, language, and translated keywords that can be NULL pointers, the structure returned by png_get_text will always contain regular zero-terminated C strings. They might be empty strings but they will never be NULL pointers. num_spalettes = png_get_sPLT(png_ptr, info_ptr, &palette_ptr); palette_ptr - array of palette structures holding contents of one or more sPLT chunks read. num_spalettes - number of sPLT chunks read. png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, &unit_type); offset_x - positive offset from the left edge of the screen offset_y - positive offset from the top edge of the screen unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, &unit_type); res_x - pixels/unit physical resolution in x direction res_y - pixels/unit physical resolution in x direction unit_type - PNG_RESOLUTION_UNKNOWN, PNG_RESOLUTION_METER png_get_sCAL(png_ptr, info_ptr, &unit, &width, &height) unit - physical scale units (an integer) width - width of a pixel in physical scale units height - height of a pixel in physical scale units (width and height are doubles) png_get_sCAL_s(png_ptr, info_ptr, &unit, &width, &height) unit - physical scale units (an integer) width - width of a pixel in physical scale units height - height of a pixel in physical scale units (width and height are strings like "2.54") num_unknown_chunks = png_get_unknown_chunks(png_ptr, info_ptr, &unknowns) unknowns - array of png_unknown_chunk structures holding unknown chunks unknowns[i].name - name of unknown chunk unknowns[i].data - data of unknown chunk unknowns[i].size - size of unknown chunk's data unknowns[i].location - position of chunk in file The value of "i" corresponds to the order in which the chunks were read from the PNG file or inserted with the png_set_unknown_chunks() function. The data from the pHYs chunk can be retrieved in several convenient forms: res_x = png_get_x_pixels_per_meter(png_ptr, info_ptr) res_y = png_get_y_pixels_per_meter(png_ptr, info_ptr) res_x_and_y = png_get_pixels_per_meter(png_ptr, info_ptr) res_x = png_get_x_pixels_per_inch(png_ptr, info_ptr) res_y = png_get_y_pixels_per_inch(png_ptr, info_ptr) res_x_and_y = png_get_pixels_per_inch(png_ptr, info_ptr) aspect_ratio = png_get_pixel_aspect_ratio(png_ptr, info_ptr) (Each of these returns 0 [signifying "unknown"] if the data is not present or if res_x is 0; res_x_and_y is 0 if res_x != res_y) The data from the oFFs chunk can be retrieved in several convenient forms: x_offset = png_get_x_offset_microns(png_ptr, info_ptr); y_offset = png_get_y_offset_microns(png_ptr, info_ptr); x_offset = png_get_x_offset_inches(png_ptr, info_ptr); y_offset = png_get_y_offset_inches(png_ptr, info_ptr); (Each of these returns 0 [signifying "unknown" if both x and y are 0] if the data is not present or if the chunk is present but the unit is the pixel) For more information, see the png_info definition in png.h and the PNG specification for chunk contents. Be careful with trusting rowbytes, as some of the transformations could increase the space needed to hold a row (expand, filler, gray_to_rgb, etc.). See png_read_update_info(), below. A quick word about text_ptr and num_text. PNG stores comments in keyword/text pairs, one pair per chunk, with no limit on the number of text chunks, and a 2^31 byte limit on their size. While there are suggested keywords, there is no requirement to restrict the use to these strings. It is strongly suggested that keywords and text be sensible to humans (that's the point), so don't use abbreviations. Non-printing symbols are not allowed. See the PNG specification for more details. There is also no requirement to have text after the keyword. Keywords should be limited to 79 Latin-1 characters without leading or trailing spaces, but non-consecutive spaces are allowed within the keyword. It is possible to have the same keyword any number of times. The text_ptr is an array of png_text structures, each holding a pointer to a language string, a pointer to a keyword and a pointer to a text string. The text string, language code, and translated keyword may be empty or NULL pointers. The keyword/text pairs are put into the array in the order that they are received. However, some or all of the text chunks may be after the image, so, to make sure you have read all the text chunks, don't mess with these until after you read the stuff after the image. This will be mentioned again below in the discussion that goes with png_read_end(). Input transformations After you've read the header information, you can set up the library to handle any special transformations of the image data. The various ways to transform the data will be described in the order that they should occur. This is important, as some of these change the color type and/or bit depth of the data, and some others only work on certain color types and bit depths. Even though each transformation checks to see if it has data that it can do something with, you should make sure to only enable a transformation if it will be valid for the data. For example, don't swap red and blue on grayscale data. The colors used for the background and transparency values should be supplied in the same format/depth as the current image data. They are stored in the same format/depth as the image data in a bKGD or tRNS chunk, so this is what libpng expects for this data. The colors are transformed to keep in sync with the image data when an application calls the png_read_update_info() routine (see below). Data will be decoded into the supplied row buffers packed into bytes unless the library has been told to transform it into another format. For example, 4 bit/pixel paletted or grayscale data will be returned 2 pixels/byte with the leftmost pixel in the high-order bits of the byte, unless png_set_packing() is called. 8-bit RGB data will be stored in RGB RGB RGB format unless png_set_filler() is called to insert filler bytes, either before or after each RGB triplet. 16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant byte of the color value first, unless png_set_strip_16() is called to transform it to regular RGB RGB triplets, or png_set_filler() is called to insert filler bytes, either before or after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can be modified with png_set_filler() or png_set_strip_16(). The following code transforms grayscale images of less than 8 to 8 bits, changes paletted images to RGB, and adds a full alpha channel if there is transparency information in a tRNS chunk. This is most useful on grayscale images with bit depths of 2 or 4 or if there is a multiple-image viewing application that wishes to treat all images in the same way. if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr); if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); These three functions are actually aliases for png_set_expand(), added in libpng version 1.0.4, with the function names expanded to improve code readability. In some future version they may actually do different things. PNG can have files with 16 bits per channel. If you only can handle 8 bits per channel, this will strip the pixels down to 8 bit. if (bit_depth == 16) png_set_strip_16(png_ptr); If, for some reason, you don't need the alpha channel on an image, and you want to remove it rather than combining it with the background (but the image author certainly had in mind that you *would* combine it with the background, so that's what you should probably do): if (color_type & PNG_COLOR_MASK_ALPHA) png_set_strip_alpha(png_ptr); In PNG files, the alpha channel in an image is the level of opacity. If you need the alpha channel in an image to be the level of transparency instead of opacity, you can invert the alpha channel (or the tRNS chunk data) after it's read, so that 0 is fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit images) is fully transparent, with png_set_invert_alpha(png_ptr); PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as they can, resulting in, for example, 8 pixels per byte for 1 bit files. This code expands to 1 pixel per byte without changing the values of the pixels: if (bit_depth < 8) png_set_packing(png_ptr); PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels stored in a PNG image have been "scaled" or "shifted" up to the next higher possible bit depth (e.g. from 5 bits/sample in the range [0,31] to 8 bits/sample in the range [0, 255]). However, it is also possible to convert the PNG pixel data back to the original bit depth of the image. This call reduces the pixels back down to the original bit depth: png_color_8p sig_bit; if (png_get_sBIT(png_ptr, info_ptr, &sig_bit)) png_set_shift(png_ptr, sig_bit); PNG files store 3-color pixels in red, green, blue order. This code changes the storage of the pixels to blue, green, red: if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) png_set_bgr(png_ptr); PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them into 4 or 8 bytes for windowing systems that need them in this format: if (color_type == PNG_COLOR_TYPE_RGB) png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE); where "filler" is the 8 or 16-bit number to fill with, and the location is either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether you want the filler before the RGB or after. This transformation does not affect images that already have full alpha channels. To add an opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which will generate RGBA pixels. If you are reading an image with an alpha channel, and you need the data as ARGB instead of the normal PNG format RGBA: if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) png_set_swap_alpha(png_ptr); For some uses, you may want a grayscale image to be represented as RGB. This code will do that conversion: if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); Conversely, you can convert an RGB or RGBA image to grayscale or grayscale with alpha. if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) png_set_rgb_to_gray_fixed(png_ptr, error_action, int red_weight, int green_weight); error_action = 1: silently do the conversion error_action = 2: issue a warning if the original image has any pixel where red != green or red != blue error_action = 3: issue an error and abort the conversion if the original image has any pixel where red != green or red != blue red_weight: weight of red component times 100000 green_weight: weight of green component times 100000 If either weight is negative, default weights (21268, 71514) are used. If you have set error_action = 1 or 2, you can later check whether the image really was gray, after processing the image rows, with the png_get_rgb_to_gray_status(png_ptr) function. It will return a png_byte that is zero if the image was gray or 1 if there were any non-gray pixels. bKGD and sBIT data will be silently converted to grayscale, using the green channel data, regardless of the error_action setting. With red_weight+green_weight<=100000, the normalized graylevel is computed: int rw = red_weight * 65536; int gw = green_weight * 65536; int bw = 65536 - (rw + gw); gray = (rw*red + gw*green + bw*blue)/65536; The default values approximate those recommended in the Charles Poynton's Color FAQ, Copyright (c) 1998-01-04 Charles Poynton poynton@inforamp.net Y = 0.212671 * R + 0.715160 * G + 0.072169 * B Libpng approximates this with Y = 0.21268 * R + 0.7151 * G + 0.07217 * B which can be expressed with integers as Y = (6969 * R + 23434 * G + 2365 * B)/32768 The calculation is done in a linear colorspace, if the image gamma is known. If you have a grayscale and you are using png_set_expand_depth(), png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to a higher bit-depth, you must either supply the background color as a gray value at the original file bit-depth (need_expand = 1) or else supply the background color as an RGB triplet at the final, expanded bit depth (need_expand = 0). Similarly, if you are reading a paletted image, you must either supply the background color as a palette index (need_expand = 1) or as an RGB triplet that may or may not be in the palette (need_expand = 0). png_color_16 my_background; png_color_16p image_background; if (png_get_bKGD(png_ptr, info_ptr, &image_background)) png_set_background(png_ptr, image_background, PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); else png_set_background(png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); The png_set_background() function tells libpng to composite images with alpha or simple transparency against the supplied background color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid), you may use this color, or supply another color more suitable for the current display (e.g., the background color from a web page). You need to tell libpng whether the color is in the gamma space of the display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file (PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't know why anyone would use this, but it's here). To properly display PNG images on any kind of system, the application needs to know what the display gamma is. Ideally, the user will know this, and the application will allow them to set it. One method of allowing the user to set the display gamma separately for each system is to check for a SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be correctly set. Note that display_gamma is the overall gamma correction required to produce pleasing results, which depends on the lighting conditions in the surrounding environment. In a dim or brightly lit room, no compensation other than the physical gamma exponent of the monitor is needed, while in a dark room a slightly smaller exponent is better. double gamma, screen_gamma; if (/* We have a user-defined screen gamma value */) { screen_gamma = user_defined_screen_gamma; } /* One way that applications can share the same screen gamma value */ else if ((gamma_str = getenv("SCREEN_GAMMA")) != NULL) { screen_gamma = (double)atof(gamma_str); } /* If we don't have another value */ else { screen_gamma = 2.2; /* A good guess for a PC monitor in a bright office or a dim room */ screen_gamma = 2.0; /* A good guess for a PC monitor in a dark room */ screen_gamma = 1.7 or 1.0; /* A good guess for Mac systems */ } The png_set_gamma() function handles gamma transformations of the data. Pass both the file gamma and the current screen_gamma. If the file does not have a gamma value, you can pass one anyway if you have an idea what it is (usually 0.45455 is a good guess for GIF images on PCs). Note that file gammas are inverted from screen gammas. See the discussions on gamma in the PNG specification for an excellent description of what gamma is, and why all applications should support it. It is strongly recommended that PNG viewers support gamma correction. if (png_get_gAMA(png_ptr, info_ptr, &gamma)) png_set_gamma(png_ptr, screen_gamma, gamma); else png_set_gamma(png_ptr, screen_gamma, 0.45455); If you need to reduce an RGB file to a paletted file, or if a paletted file has more entries then will fit on your screen, png_set_dither() will do that. Note that this is a simple match dither that merely finds the closest color available. This should work fairly well with optimized palettes, and fairly badly with linear color cubes. If you pass a palette that is larger then maximum_colors, the file will reduce the number of colors in the palette so it will fit into maximum_colors. If there is a histogram, it will use it to make more intelligent choices when reducing the palette. If there is no histogram, it may not do as good a job. if (color_type & PNG_COLOR_MASK_COLOR) { if (png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE)) { png_uint_16p histogram = NULL; png_get_hIST(png_ptr, info_ptr, &histogram); png_set_dither(png_ptr, palette, num_palette, max_screen_colors, histogram, 1); } else { png_color std_color_cube[MAX_SCREEN_COLORS] = { ... colors ... }; png_set_dither(png_ptr, std_color_cube, MAX_SCREEN_COLORS, MAX_SCREEN_COLORS, NULL,0); } } PNG files describe monochrome as black being zero and white being one. The following code will reverse this (make black be one and white be zero): if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) png_set_invert_mono(png_ptr); This function can also be used to invert grayscale and gray-alpha images: if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_invert_mono(png_ptr); PNG files store 16 bit pixels in network byte order (big-endian, ie. most significant bits first). This code changes the storage to the other way (little-endian, i.e. least significant bits first, the way PCs store them): if (bit_depth == 16) png_set_swap(png_ptr); If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you need to change the order the pixels are packed into bytes, you can use: if (bit_depth < 8) png_set_packswap(png_ptr); Finally, you can write your own transformation function if none of the existing ones meets your needs. This is done by setting a callback with png_set_read_user_transform_fn(png_ptr, read_transform_fn); You must supply the function void read_transform_fn(png_ptr ptr, row_info_ptr row_info, png_bytep data) See pngtest.c for a working example. Your function will be called after all of the other transformations have been processed. You can also set up a pointer to a user structure for use by your callback function, and you can inform libpng that your transform function will change the number of channels or bit depth with the function png_set_user_transform_info(png_ptr, user_ptr, user_depth, user_channels); The user's application, not libpng, is responsible for allocating and freeing any memory required for the user structure. You can retrieve the pointer via the function png_get_user_transform_ptr(). For example: voidp read_user_transform_ptr = png_get_user_transform_ptr(png_ptr); The last thing to handle is interlacing; this is covered in detail below, but you must call the function here if you want libpng to handle expansion of the interlaced image. number_of_passes = png_set_interlace_handling(png_ptr); After setting the transformations, libpng can update your png_info structure to reflect any transformations you've requested with this call. This is most useful to update the info structure's rowbytes field so you can use it to allocate your image memory. This function will also update your palette with the correct screen_gamma and background if these have been given with the calls above. png_read_update_info(png_ptr, info_ptr); After you call png_read_update_info(), you can allocate any memory you need to hold the image. The row data is simply raw byte data for all forms of images. As the actual allocation varies among applications, no example will be given. If you are allocating one large chunk, you will need to build an array of pointers to each row, as it will be needed for some of the functions below. Reading image data After you've allocated memory, you can read the image data. The simplest way to do this is in one function call. If you are allocating enough memory to hold the whole image, you can just call png_read_image() and libpng will read in all the image data and put it in the memory area supplied. You will need to pass in an array of pointers to each row. This function automatically handles interlacing, so you don't need to call png_set_interlace_handling() or call this function multiple times, or any of that other stuff necessary with png_read_rows(). png_read_image(png_ptr, row_pointers); where row_pointers is: png_bytep row_pointers[height]; You can point to void or char or whatever you use for pixels. If you don't want to read in the whole image at once, you can use png_read_rows() instead. If there is no interlacing (check interlace_type == PNG_INTERLACE_NONE), this is simple: png_read_rows(png_ptr, row_pointers, NULL, number_of_rows); where row_pointers is the same as in the png_read_image() call. If you are doing this just one row at a time, you can do this with a single row_pointer instead of an array of row_pointers: png_bytep row_pointer = row; png_read_row(png_ptr, row_pointer, NULL); If the file is interlaced (interlace_type != 0 in the IHDR chunk), things get somewhat harder. The only current (PNG Specification version 1.2) interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7) is a somewhat complicated 2D interlace scheme, known as Adam7, that breaks down an image into seven smaller images of varying size, based on an 8x8 grid. libpng can fill out those images or it can give them to you "as is". If you want them filled out, there are two ways to do that. The one mentioned in the PNG specification is to expand each pixel to cover those pixels that have not been read yet (the "rectangle" method). This results in a blocky image for the first pass, which gradually smooths out as more pixels are read. The other method is the "sparkle" method, where pixels are drawn only in their final locations, with the rest of the image remaining whatever colors they were initialized to before the start of the read. The first method usually looks better, but tends to be slower, as there are more pixels to put in the rows. If you don't want libpng to handle the interlacing details, just call png_read_rows() seven times to read in all seven images. Each of the images is a valid image by itself, or they can all be combined on an 8x8 grid to form a single image (although if you intend to combine them you would be far better off using the libpng interlace handling). The first pass will return an image 1/8 as wide as the entire image (every 8th column starting in column 0) and 1/8 as high as the original (every 8th row starting in row 0), the second will be 1/8 as wide (starting in column 4) and 1/8 as high (also starting in row 0). The third pass will be 1/4 as wide (every 4th pixel starting in column 0) and 1/8 as high (every 8th row starting in row 4), and the fourth pass will be 1/4 as wide and 1/4 as high (every 4th column starting in column 2, and every 4th row starting in row 0). The fifth pass will return an image 1/2 as wide, and 1/4 as high (starting at column 0 and row 2), while the sixth pass will be 1/2 as wide and 1/2 as high as the original (starting in column 1 and row 0). The seventh and final pass will be as wide as the original, and 1/2 as high, containing all of the odd numbered scanlines. Phew! If you want libpng to expand the images, call this before calling png_start_read_image() or png_read_update_info(): if (interlace_type == PNG_INTERLACE_ADAM7) number_of_passes = png_set_interlace_handling(png_ptr); This will return the number of passes needed. Currently, this is seven, but may change if another interlace type is added. This function can be called even if the file is not interlaced, where it will return one pass. If you are not going to display the image after each pass, but are going to wait until the entire image is read in, use the sparkle effect. This effect is faster and the end result of either method is exactly the same. If you are planning on displaying the image after each pass, the "rectangle" effect is generally considered the better looking one. If you only want the "sparkle" effect, just call png_read_rows() as normal, with the third parameter NULL. Make sure you make pass over the image number_of_passes times, and you don't change the data in the rows between calls. You can change the locations of the data, just not the data. Each pass only writes the pixels appropriate for that pass, and assumes the data from previous passes is still valid. png_read_rows(png_ptr, row_pointers, NULL, number_of_rows); If you only want the first effect (the rectangles), do the same as before except pass the row buffer in the third parameter, and leave the second parameter NULL. png_read_rows(png_ptr, NULL, row_pointers, number_of_rows); Finishing a sequential read After you are finished reading the image through either the high- or low-level interfaces, you can finish reading the file. If you are interested in comments or time, which may be stored either before or after the image data, you should pass the separate png_info struct if you want to keep the comments from before and after the image separate. If you are not interested, you can pass NULL. png_read_end(png_ptr, end_info); When you are done, you can free all memory allocated by libpng like this: png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); It is also possible to individually free the info_ptr members that point to libpng-allocated storage with the following function: png_free_data(png_ptr, info_ptr, mask, seq) mask - identifies data to be freed, a mask containing the logical OR of one or more of PNG_FREE_PLTE, PNG_FREE_TRNS, PNG_FREE_HIST, PNG_FREE_ICCP, PNG_FREE_PCAL, PNG_FREE_ROWS, PNG_FREE_SCAL, PNG_FREE_SPLT, PNG_FREE_TEXT, PNG_FREE_UNKN, or simply PNG_FREE_ALL seq - sequence number of item to be freed (-1 for all items) This function may be safely called when the relevant storage has already been freed, or has not yet been allocated, or was allocated by the user and not by libpng, and will in those cases do nothing. The "seq" parameter is ignored if only one item of the selected data type, such as PLTE, is allowed. If "seq" is not -1, and multiple items are allowed for the data type identified in the mask, such as text or sPLT, only the n'th item in the structure is freed, where n is "seq". The default behavior is only to free data that was allocated internally by libpng. This can be changed, so that libpng will not free the data, or so that it will free data that was allocated by the user with png_malloc() or png_zalloc() and passed in via a png_set_*() function, with png_data_freer(png_ptr, info_ptr, freer, mask) mask - which data elements are affected same choices as in png_free_data() freer - one of PNG_DESTROY_WILL_FREE_DATA PNG_SET_WILL_FREE_DATA PNG_USER_WILL_FREE_DATA This function only affects data that has already been allocated. You can call this function after reading the PNG data but before calling any png_set_*() functions, to control whether the user or the png_set_*() function is responsible for freeing any existing data that might be present, and again after the png_set_*() functions to control whether the user or png_destroy_*() is supposed to free the data. When the user assumes responsibility for libpng-allocated data, the application must use png_free() to free it, and when the user transfers responsibility to libpng for data that the user has allocated, the user must have used png_malloc() or png_zalloc() to allocate it. If you allocated your row_pointers in a single block, as suggested above in the description of the high level read interface, you must not transfer responsibility for freeing it to the png_set_rows or png_read_destroy function, because they would also try to free the individual row_pointers[i]. If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword separately, do not transfer responsibility for freeing text_ptr to libpng, because when libpng fills a png_text structure it combines these members with the key member, and png_free_data() will free only text_ptr.key. Similarly, if you transfer responsibility for free'ing text_ptr from libpng to your application, your application must not separately free those members. The png_free_data() function will turn off the "valid" flag for anything it frees. If you need to turn the flag off for a chunk that was freed by your application instead of by libpng, you can use png_set_invalid(png_ptr, info_ptr, mask); mask - identifies the chunks to be made invalid, containing the logical OR of one or more of PNG_INFO_gAMA, PNG_INFO_sBIT, PNG_INFO_cHRM, PNG_INFO_PLTE, PNG_INFO_tRNS, PNG_INFO_bKGD, PNG_INFO_hIST, PNG_INFO_pHYs, PNG_INFO_oFFs, PNG_INFO_tIME, PNG_INFO_pCAL, PNG_INFO_sRGB, PNG_INFO_iCCP, PNG_INFO_sPLT, PNG_INFO_sCAL, PNG_INFO_IDAT For a more compact example of reading a PNG image, see the file example.c. Reading PNG files progressively The progressive reader is slightly different then the non-progressive reader. Instead of calling png_read_info(), png_read_rows(), and png_read_end(), you make one call to png_process_data(), which calls callbacks when it has the info, a row, or the end of the image. You set up these callbacks with png_set_progressive_read_fn(). You don't have to worry about the input/output functions of libpng, as you are giving the library the data directly in png_process_data(). I will assume that you have read the section on reading PNG files above, so I will only highlight the differences (although I will show all of the code). png_structp png_ptr; png_infop info_ptr; /* An example code fragment of how you would initialize the progressive reader in your application. */ int initialize_png_reader() { png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, user_error_fn, user_warning_fn); if (!png_ptr) return (ERROR); info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); return (ERROR); } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); return (ERROR); } /* This one's new. You can provide functions to be called when the header info is valid, when each row is completed, and when the image is finished. If you aren't using all functions, you can specify NULL parameters. Even when all three functions are NULL, you need to call png_set_progressive_read_fn(). You can use any struct as the user_ptr (cast to a void pointer for the function call), and retrieve the pointer from inside the callbacks using the function png_get_progressive_ptr(png_ptr); which will return a void pointer, which you have to cast appropriately. */ png_set_progressive_read_fn(png_ptr, (void *)user_ptr, info_callback, row_callback, end_callback); return 0; } /* A code fragment that you call as you receive blocks of data */ int process_data(png_bytep buffer, png_uint_32 length) { if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); return (ERROR); } /* This one's new also. Simply give it a chunk of data from the file stream (in order, of course). On machines with segmented memory models machines, don't give it any more than 64K. The library seems to run fine with sizes of 4K. Although you can give it much less if necessary (I assume you can give it chunks of 1 byte, I haven't tried less then 256 bytes yet). When this function returns, you may want to display any rows that were generated in the row callback if you don't already do so there. */ png_process_data(png_ptr, info_ptr, buffer, length); return 0; } /* This function is called (as set by png_set_progressive_read_fn() above) when enough data has been supplied so all of the header has been read. */ void info_callback(png_structp png_ptr, png_infop info) { /* Do any setup here, including setting any of the transformations mentioned in the Reading PNG files section. For now, you _must_ call either png_start_read_image() or png_read_update_info() after all the transformations are set (even if you don't set any). You may start getting rows before png_process_data() returns, so this is your last chance to prepare for that. */ } /* This function is called when each row of image data is complete */ void row_callback(png_structp png_ptr, png_bytep new_row, png_uint_32 row_num, int pass) { /* If the image is interlaced, and you turned on the interlace handler, this function will be called for every row in every pass. Some of these rows will not be changed from the previous pass. When the row is not changed, the new_row variable will be NULL. The rows and passes are called in order, so you don't really need the row_num and pass, but I'm supplying them because it may make your life easier. For the non-NULL rows of interlaced images, you must call png_progressive_combine_row() passing in the row and the old row. You can call this function for NULL rows (it will just return) and for non-interlaced images (it just does the memcpy for you) if it will make the code easier. Thus, you can just do this for all cases: */ png_progressive_combine_row(png_ptr, old_row, new_row); /* where old_row is what was displayed for previously for the row. Note that the first pass (pass == 0, really) will completely cover the old row, so the rows do not have to be initialized. After the first pass (and only for interlaced images), you will have to pass the current row, and the function will combine the old row and the new row. */ } void end_callback(png_structp png_ptr, png_infop info) { /* This function is called after the whole image has been read, including any chunks after the image (up to and including the IEND). You will usually have the same info chunk as you had in the header, although some data may have been added to the comments and time fields. Most people won't do much here, perhaps setting a flag that marks the image as finished. */ } IV. Writing Much of this is very similar to reading. However, everything of importance is repeated here, so you won't have to constantly look back up in the reading section to understand writing. Setup You will want to do the I/O initialization before you get into libpng, so if it doesn't work, you don't have anything to undo. If you are not using the standard I/O functions, you will need to replace them with custom writing functions. See the discussion under Customizing libpng. FILE *fp = fopen(file_name, "wb"); if (!fp) { return (ERROR); } Next, png_struct and png_info need to be allocated and initialized. As these can be both relatively large, you may not want to store these on the stack, unless you have stack space to spare. Of course, you will want to check if they return NULL. If you are also reading, you won't want to name your read structure and your write structure both "png_ptr"; you can call them anything you like, such as "read_ptr" and "write_ptr". Look at pngtest.c, for example. png_structp png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, user_error_fn, user_warning_fn); if (!png_ptr) return (ERROR); png_infop info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return (ERROR); } If you want to use your own memory allocation routines, define PNG_USER_MEM_SUPPORTED and use png_create_write_struct_2() instead of png_create_write_struct(): png_structp png_ptr = png_create_write_struct_2 (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, user_error_fn, user_warning_fn, (png_voidp) user_mem_ptr, user_malloc_fn, user_free_fn); After you have these structures, you will need to set up the error handling. When libpng encounters an error, it expects to longjmp() back to your routine. Therefore, you will need to call setjmp() and pass the png_jmpbuf(png_ptr). If you write the file from different routines, you will need to update the png_jmpbuf(png_ptr) every time you enter a new routine that will call a png_*() function. See your documentation of setjmp/longjmp for your compiler for more information on setjmp/longjmp. See the discussion on libpng error handling in the Customizing Libpng section below for more information on the libpng error handling. if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); fclose(fp); return (ERROR); } ... return; If you would rather avoid the complexity of setjmp/longjmp issues, you can compile libpng with PNG_SETJMP_NOT_SUPPORTED, in which case errors will result in a call to PNG_ABORT() which defaults to abort(). Now you need to set up the output code. The default for libpng is to use the C function fwrite(). If you use this, you will need to pass a valid FILE * in the function png_init_io(). Be sure that the file is opened in binary mode. Again, if you wish to handle writing data in another way, see the discussion on libpng I/O handling in the Customizing Libpng section below. png_init_io(png_ptr, fp); Write callbacks At this point, you can set up a callback function that will be called after each row has been written, which you can use to control a progress meter or the like. It's demonstrated in pngtest.c. You must supply a function void write_row_callback(png_ptr, png_uint_32 row, int pass); { /* put your code here */ } (You can give it another name that you like instead of "write_row_callback") To inform libpng about your function, use png_set_write_status_fn(png_ptr, write_row_callback); You now have the option of modifying how the compression library will run. The following functions are mainly for testing, but may be useful in some cases, like if you need to write PNG files extremely fast and are willing to give up some compression, or if you want to get the maximum possible compression at the expense of slower writing. If you have no special needs in this area, let the library do what it wants by not calling this function at all, as it has been tuned to deliver a good speed/compression ratio. The second parameter to png_set_filter() is the filter method, for which the only valid values are 0 (as of the July 1999 PNG specification, version 1.2) or 64 (if you are writing a PNG datastream that is to be embedded in a MNG datastream). The third parameter is a flag that indicates which filter type(s) are to be tested for each scanline. See the PNG specification for details on the specific filter types. /* turn on or off filtering, and/or choose specific filters. You can use either a single PNG_FILTER_VALUE_NAME or the logical OR of one or more PNG_FILTER_NAME masks. */ png_set_filter(png_ptr, 0, PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE | PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB | PNG_FILTER_UP | PNG_FILTER_VALUE_UP | PNG_FILTER_AVE | PNG_FILTER_VALUE_AVE | PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH| PNG_ALL_FILTERS); If an application wants to start and stop using particular filters during compression, it should start out with all of the filters (to ensure that the previous row of pixels will be stored in case it's needed later), and then add and remove them after the start of compression. If you are writing a PNG datastream that is to be embedded in a MNG datastream, the second parameter can be either 0 or 64. The png_set_compression_*() functions interface to the zlib compression library, and should mostly be ignored unless you really know what you are doing. The only generally useful call is png_set_compression_level() which changes how much time zlib spends on trying to compress the image data. See the Compression Library (zlib.h and algorithm.txt, distributed with zlib) for details on the compression levels. /* set the zlib compression level */ png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); /* set other zlib parameters */ png_set_compression_mem_level(png_ptr, 8); png_set_compression_strategy(png_ptr, Z_DEFAULT_STRATEGY); png_set_compression_window_bits(png_ptr, 15); png_set_compression_method(png_ptr, 8); png_set_compression_buffer_size(png_ptr, 8192) extern PNG_EXPORT(void,png_set_zbuf_size) Setting the contents of info for output You now need to fill in the png_info structure with all the data you wish to write before the actual image. Note that the only thing you are allowed to write after the image is the text chunks and the time chunk (as of PNG Specification 1.2, anyway). See png_write_end() and the latest PNG specification for more information on that. If you wish to write them before the image, fill them in now, and flag that data as being valid. If you want to wait until after the data, don't fill them until png_write_end(). For all the fields in png_info and their data types, see png.h. For explanations of what the fields contain, see the PNG specification. Some of the more important parts of the png_info are: png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, interlace_type, compression_type, filter_method) width - holds the width of the image in pixels (up to 2^31). height - holds the height of the image in pixels (up to 2^31). bit_depth - holds the bit depth of one of the image channels. (valid values are 1, 2, 4, 8, 16 and depend also on the color_type. See also significant bits (sBIT) below). color_type - describes which color/alpha channels are present. PNG_COLOR_TYPE_GRAY (bit depths 1, 2, 4, 8, 16) PNG_COLOR_TYPE_GRAY_ALPHA (bit depths 8, 16) PNG_COLOR_TYPE_PALETTE (bit depths 1, 2, 4, 8) PNG_COLOR_TYPE_RGB (bit_depths 8, 16) PNG_COLOR_TYPE_RGB_ALPHA (bit_depths 8, 16) PNG_COLOR_MASK_PALETTE PNG_COLOR_MASK_COLOR PNG_COLOR_MASK_ALPHA interlace_type - PNG_INTERLACE_NONE or PNG_INTERLACE_ADAM7 compression_type - (must be PNG_COMPRESSION_TYPE_DEFAULT) filter_method - (must be PNG_FILTER_TYPE_DEFAULT or, if you are writing a PNG to be embedded in a MNG datastream, can also be PNG_INTRAPIXEL_DIFFERENCING) png_set_PLTE(png_ptr, info_ptr, palette, num_palette); palette - the palette for the file (array of png_color) num_palette - number of entries in the palette png_set_gAMA(png_ptr, info_ptr, gamma); gamma - the gamma the image was created at (PNG_INFO_gAMA) png_set_sRGB(png_ptr, info_ptr, srgb_intent); srgb_intent - the rendering intent (PNG_INFO_sRGB) The presence of the sRGB chunk means that the pixel data is in the sRGB color space. This chunk also implies specific values of gAMA and cHRM. Rendering intent is the CSS-1 property that has been defined by the International Color Consortium (http://www.color.org). It can be one of PNG_sRGB_INTENT_SATURATION, PNG_sRGB_INTENT_PERCEPTUAL, PNG_sRGB_INTENT_ABSOLUTE, or PNG_sRGB_INTENT_RELATIVE. png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, srgb_intent); srgb_intent - the rendering intent (PNG_INFO_sRGB) The presence of the sRGB chunk means that the pixel data is in the sRGB color space. This function also causes gAMA and cHRM chunks with the specific values that are consistent with sRGB to be written. png_set_iCCP(png_ptr, info_ptr, name, compression_type, profile, proflen); name - The profile name. compression - The compression type; always PNG_COMPRESSION_TYPE_BASE for PNG 1.0. You may give NULL to this argument to ignore it. profile - International Color Consortium color profile data. May contain NULs. proflen - length of profile data in bytes. png_set_sBIT(png_ptr, info_ptr, sig_bit); sig_bit - the number of significant bits for (PNG_INFO_sBIT) each of the gray, red, green, and blue channels, whichever are appropriate for the given color type (png_color_16) png_set_tRNS(png_ptr, info_ptr, trans, num_trans, trans_values); trans - array of transparent entries for palette (PNG_INFO_tRNS) trans_values - graylevel or color sample values of the single transparent color for non-paletted images (PNG_INFO_tRNS) num_trans - number of transparent entries (PNG_INFO_tRNS) png_set_hIST(png_ptr, info_ptr, hist); (PNG_INFO_hIST) hist - histogram of palette (array of png_uint_16) png_set_tIME(png_ptr, info_ptr, mod_time); mod_time - time image was last modified (PNG_VALID_tIME) png_set_bKGD(png_ptr, info_ptr, background); background - background color (PNG_VALID_bKGD) png_set_text(png_ptr, info_ptr, text_ptr, num_text); text_ptr - array of png_text holding image comments text_ptr[i].compression - type of compression used on "text" PNG_TEXT_COMPRESSION_NONE PNG_TEXT_COMPRESSION_zTXt PNG_ITXT_COMPRESSION_NONE PNG_ITXT_COMPRESSION_zTXt text_ptr[i].key - keyword for comment. Must contain 1-79 characters. text_ptr[i].text - text comments for current keyword. Can be NULL or empty. text_ptr[i].text_length - length of text string, after decompression, 0 for iTXt text_ptr[i].itxt_length - length of itxt string, after decompression, 0 for tEXt/zTXt text_ptr[i].lang - language of comment (NULL or empty for unknown). text_ptr[i].translated_keyword - keyword in UTF-8 (NULL or empty for unknown). num_text - number of comments png_set_sPLT(png_ptr, info_ptr, &palette_ptr, num_spalettes); palette_ptr - array of png_sPLT_struct structures to be added to the list of palettes in the info structure. num_spalettes - number of palette structures to be added. png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type); offset_x - positive offset from the left edge of the screen offset_y - positive offset from the top edge of the screen unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type); res_x - pixels/unit physical resolution in x direction res_y - pixels/unit physical resolution in y direction unit_type - PNG_RESOLUTION_UNKNOWN, PNG_RESOLUTION_METER png_set_sCAL(png_ptr, info_ptr, unit, width, height) unit - physical scale units (an integer) width - width of a pixel in physical scale units height - height of a pixel in physical scale units (width and height are doubles) png_set_sCAL_s(png_ptr, info_ptr, unit, width, height) unit - physical scale units (an integer) width - width of a pixel in physical scale units height - height of a pixel in physical scale units (width and height are strings like "2.54") png_set_unknown_chunks(png_ptr, info_ptr, &unknowns, num_unknowns) unknowns - array of png_unknown_chunk structures holding unknown chunks unknowns[i].name - name of unknown chunk unknowns[i].data - data of unknown chunk unknowns[i].size - size of unknown chunk's data unknowns[i].location - position to write chunk in file 0: do not write chunk PNG_HAVE_IHDR: before PLTE PNG_HAVE_PLTE: before IDAT PNG_AFTER_IDAT: after IDAT The "location" member is set automatically according to what part of the output file has already been written. You can change its value after calling png_set_unknown_chunks() as demonstrated in pngtest.c. Within each of the "locations", the chunks are sequenced according to their position in the structure (that is, the value of "i", which is the order in which the chunk was either read from the input file or defined with png_set_unknown_chunks). A quick word about text and num_text. text is an array of png_text structures. num_text is the number of valid structures in the array. Each png_text structure holds a language code, a keyword, a text value, and a compression type. The compression types have the same valid numbers as the compression types of the image data. Currently, the only valid number is zero. However, you can store text either compressed or uncompressed, unlike images, which always have to be compressed. So if you don't want the text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE. Because tEXt and zTXt chunks don't have a language field, if you specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt any language code or translated keyword will not be written out. Until text gets around 1000 bytes, it is not worth compressing it. After the text has been written out to the file, the compression type is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR, so that it isn't written out again at the end (in case you are calling png_write_end() with the same struct. The keywords that are given in the PNG Specification are: Title Short (one line) title or caption for image Author Name of image's creator Description Description of image (possibly long) Copyright Copyright notice Creation Time Time of original image creation (usually RFC 1123 format, see below) Software Software used to create the image Disclaimer Legal disclaimer Warning Warning of nature of content Source Device used to create the image Comment Miscellaneous comment; conversion from other image format The keyword-text pairs work like this. Keywords should be short simple descriptions of what the comment is about. Some typical keywords are found in the PNG specification, as is some recommendations on keywords. You can repeat keywords in a file. You can even write some text before the image and some after. For example, you may want to put a description of the image before the image, but leave the disclaimer until after, so viewers working over modem connections don't have to wait for the disclaimer to go over the modem before they start seeing the image. Finally, keywords should be full words, not abbreviations. Keywords and text are in the ISO 8859-1 (Latin-1) character set (a superset of regular ASCII) and can not contain NUL characters, and should not contain control or other unprintable characters. To make the comments widely readable, stick with basic ASCII, and avoid machine specific character set extensions like the IBM-PC character set. The keyword must be present, but you can leave off the text string on non-compressed pairs. Compressed pairs must have a text string, as only the text string is compressed anyway, so the compression would be meaningless. PNG supports modification time via the png_time structure. Two conversion routines are provided, png_convert_from_time_t() for time_t and png_convert_from_struct_tm() for struct tm. The time_t routine uses gmtime(). You don't have to use either of these, but if you wish to fill in the png_time structure directly, you should provide the time in universal time (GMT) if possible instead of your local time. Note that the year number is the full year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and that months start with 1. If you want to store the time of the original image creation, you should use a plain tEXt chunk with the "Creation Time" keyword. This is necessary because the "creation time" of a PNG image is somewhat vague, depending on whether you mean the PNG file, the time the image was created in a non-PNG format, a still photo from which the image was scanned, or possibly the subject matter itself. In order to facilitate machine-readable dates, it is recommended that the "Creation Time" tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"), although this isn't a requirement. Unlike the tIME chunk, the "Creation Time" tEXt chunk is not expected to be automatically changed by the software. To facilitate the use of RFC 1123 dates, a function png_convert_to_rfc1123(png_timep) is provided to convert from PNG time to an RFC 1123 format string. Writing unknown chunks You can use the png_set_unknown_chunks function to queue up chunks for writing. You give it a chunk name, raw data, and a size; that's all there is to it. The chunks will be written by the next following png_write_info_before_PLTE, png_write_info, or png_write_end function. Any chunks previously read into the info structure's unknown-chunk list will also be written out in a sequence that satisfies the PNG specification's ordering rules. The high-level write interface At this point there are two ways to proceed; through the high-level write interface, or through a sequence of low-level write operations. You can use the high-level interface if your image data is present in the info structure. All defined output transformations are permitted, enabled by the following masks. PNG_TRANSFORM_IDENTITY No transformation PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples PNG_TRANSFORM_PACKSWAP Change order of packed pixels to LSB first PNG_TRANSFORM_INVERT_MONO Invert monochrome images PNG_TRANSFORM_SHIFT Normalize pixels to the sBIT depth PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA to BGRA PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA to AG PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity to transparency PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples PNG_TRANSFORM_STRIP_FILLER Strip out filler bytes. If you have valid image data in the info structure (you can use png_set_rows() to put image data in the info structure), simply do this: png_write_png(png_ptr, info_ptr, png_transforms, NULL) where png_transforms is an integer containing the logical OR of some set of transformation flags. This call is equivalent to png_write_info(), followed the set of transformations indicated by the transform mask, then png_write_image(), and finally png_write_end(). (The final parameter of this call is not yet used. Someday it might point to transformation parameters required by some future output transform.) The low-level write interface If you are going the low-level route instead, you are now ready to write all the file information up to the actual image data. You do this with a call to png_write_info(). png_write_info(png_ptr, info_ptr); Note that there is one transformation you may need to do before png_write_info(). In PNG files, the alpha channel in an image is the level of opacity. If your data is supplied as a level of transparency, you can invert the alpha channel before you write it, so that 0 is fully transparent and 255 (in 8-bit or paletted images) or 65535 (in 16-bit images) is fully opaque, with png_set_invert_alpha(png_ptr); This must appear before png_write_info() instead of later with the other transformations because in the case of paletted images the tRNS chunk data has to be inverted before the tRNS chunk is written. If your image is not a paletted image, the tRNS data (which in such cases represents a single color to be rendered as transparent) won't need to be changed, and you can safely do this transformation after your png_write_info() call. If you need to write a private chunk that you want to appear before the PLTE chunk when PLTE is present, you can write the PNG info in two steps, and insert code to write your own chunk between them: png_write_info_before_PLTE(png_ptr, info_ptr); png_set_unknown_chunks(png_ptr, info_ptr, ...); png_write_info(png_ptr, info_ptr); After you've written the file information, you can set up the library to handle any special transformations of the image data. The various ways to transform the data will be described in the order that they should occur. This is important, as some of these change the color type and/or bit depth of the data, and some others only work on certain color types and bit depths. Even though each transformation checks to see if it has data that it can do something with, you should make sure to only enable a transformation if it will be valid for the data. For example, don't swap red and blue on grayscale data. PNG files store RGB pixels packed into 3 or 6 bytes. This code tells the library to strip input data that has 4 or 8 bytes per pixel down to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2 bytes per pixel). png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); where the 0 is unused, and the location is either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel is stored XRGB or RGBX. PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as they can, resulting in, for example, 8 pixels per byte for 1 bit files. If the data is supplied at 1 pixel per byte, use this code, which will correctly pack the pixels into a single byte: png_set_packing(png_ptr); PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your data is of another bit depth, you can write an sBIT chunk into the file so that decoders can recover the original data if desired. /* Set the true bit depth of the image data */ if (color_type & PNG_COLOR_MASK_COLOR) { sig_bit.red = true_bit_depth; sig_bit.green = true_bit_depth; sig_bit.blue = true_bit_depth; } else { sig_bit.gray = true_bit_depth; } if (color_type & PNG_COLOR_MASK_ALPHA) { sig_bit.alpha = true_bit_depth; } png_set_sBIT(png_ptr, info_ptr, &sig_bit); If the data is stored in the row buffer in a bit depth other than one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG), this will scale the values to appear to be the correct bit depth as is required by PNG. png_set_shift(png_ptr, &sig_bit); PNG files store 16 bit pixels in network byte order (big-endian, ie. most significant bits first). This code would be used if they are supplied the other way (little-endian, i.e. least significant bits first, the way PCs store them): if (bit_depth > 8) png_set_swap(png_ptr); If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you need to change the order the pixels are packed into bytes, you can use: if (bit_depth < 8) png_set_packswap(png_ptr); PNG files store 3 color pixels in red, green, blue order. This code would be used if they are supplied as blue, green, red: png_set_bgr(png_ptr); PNG files describe monochrome as black being zero and white being one. This code would be used if the pixels are supplied with this reversed (black being one and white being zero): png_set_invert_mono(png_ptr); Finally, you can write your own transformation function if none of the existing ones meets your needs. This is done by setting a callback with png_set_write_user_transform_fn(png_ptr, write_transform_fn); You must supply the function void write_transform_fn(png_ptr ptr, row_info_ptr row_info, png_bytep data) See pngtest.c for a working example. Your function will be called before any of the other transformations are processed. You can also set up a pointer to a user structure for use by your callback function. png_set_user_transform_info(png_ptr, user_ptr, 0, 0); The user_channels and user_depth parameters of this function are ignored when writing; you can set them to zero as shown. You can retrieve the pointer via the function png_get_user_transform_ptr(). For example: voidp write_user_transform_ptr = png_get_user_transform_ptr(png_ptr); It is possible to have libpng flush any pending output, either manually, or automatically after a certain number of lines have been written. To flush the output stream a single time call: png_write_flush(png_ptr); and to have libpng flush the output stream periodically after a certain number of scanlines have been written, call: png_set_flush(png_ptr, nrows); Note that the distance between rows is from the last time png_write_flush() was called, or the first row of the image if it has never been called. So if you write 50 lines, and then png_set_flush 25, it will flush the output on the next scanline, and every 25 lines thereafter, unless png_write_flush() is called before 25 more lines have been written. If nrows is too small (less than about 10 lines for a 640 pixel wide RGB image) the image compression may decrease noticeably (although this may be acceptable for real-time applications). Infrequent flushing will only degrade the compression performance by a few percent over images that do not use flushing. Writing the image data That's it for the transformations. Now you can write the image data. The simplest way to do this is in one function call. If you have the whole image in memory, you can just call png_write_image() and libpng will write the image. You will need to pass in an array of pointers to each row. This function automatically handles interlacing, so you don't need to call png_set_interlace_handling() or call this function multiple times, or any of that other stuff necessary with png_write_rows(). png_write_image(png_ptr, row_pointers); where row_pointers is: png_byte *row_pointers[height]; You can point to void or char or whatever you use for pixels. If you don't want to write the whole image at once, you can use png_write_rows() instead. If the file is not interlaced, this is simple: png_write_rows(png_ptr, row_pointers, number_of_rows); row_pointers is the same as in the png_write_image() call. If you are just writing one row at a time, you can do this with a single row_pointer instead of an array of row_pointers: png_bytep row_pointer = row; png_write_row(png_ptr, row_pointer); When the file is interlaced, things can get a good deal more complicated. The only currently (as of the PNG Specification version 1.2, dated July 1999) defined interlacing scheme for PNG files is the "Adam7" interlace scheme, that breaks down an image into seven smaller images of varying size. libpng will build these images for you, or you can do them yourself. If you want to build them yourself, see the PNG specification for details of which pixels to write when. If you don't want libpng to handle the interlacing details, just use png_set_interlace_handling() and call png_write_rows() the correct number of times to write all seven sub-images. If you want libpng to build the sub-images, call this before you start writing any rows: number_of_passes = png_set_interlace_handling(png_ptr); This will return the number of passes needed. Currently, this is seven, but may change if another interlace type is added. Then write the complete image number_of_passes times. png_write_rows(png_ptr, row_pointers, number_of_rows); As some of these rows are not used, and thus return immediately, you may want to read about interlacing in the PNG specification, and only update the rows that are actually used. Finishing a sequential write After you are finished writing the image, you should finish writing the file. If you are interested in writing comments or time, you should pass an appropriately filled png_info pointer. If you are not interested, you can pass NULL. png_write_end(png_ptr, info_ptr); When you are done, you can free all memory used by libpng like this: png_destroy_write_struct(&png_ptr, &info_ptr); It is also possible to individually free the info_ptr members that point to libpng-allocated storage with the following function: png_free_data(png_ptr, info_ptr, mask, seq) mask - identifies data to be freed, a mask containing the logical OR of one or more of PNG_FREE_PLTE, PNG_FREE_TRNS, PNG_FREE_HIST, PNG_FREE_ICCP, PNG_FREE_PCAL, PNG_FREE_ROWS, PNG_FREE_SCAL, PNG_FREE_SPLT, PNG_FREE_TEXT, PNG_FREE_UNKN, or simply PNG_FREE_ALL seq - sequence number of item to be freed (-1 for all items) This function may be safely called when the relevant storage has already been freed, or has not yet been allocated, or was allocated by the user and not by libpng, and will in those cases do nothing. The "seq" parameter is ignored if only one item of the selected data type, such as PLTE, is allowed. If "seq" is not -1, and multiple items are allowed for the data type identified in the mask, such as text or sPLT, only the n'th item in the structure is freed, where n is "seq". If you allocated data such as a palette that you passed in to libpng with png_set_*, you must not free it until just before the call to png_destroy_write_struct(). The default behavior is only to free data that was allocated internally by libpng. This can be changed, so that libpng will not free the data, or so that it will free data that was allocated by the user with png_malloc() or png_zalloc() and passed in via a png_set_*() function, with png_data_freer(png_ptr, info_ptr, freer, mask) mask - which data elements are affected same choices as in png_free_data() freer - one of PNG_DESTROY_WILL_FREE_DATA PNG_SET_WILL_FREE_DATA PNG_USER_WILL_FREE_DATA For example, to transfer responsibility for some data from a read structure to a write structure, you could use png_data_freer(read_ptr, read_info_ptr, PNG_USER_WILL_FREE_DATA, PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) png_data_freer(write_ptr, write_info_ptr, PNG_DESTROY_WILL_FREE_DATA, PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) thereby briefly reassigning responsibility for freeing to the user but immediately afterwards reassigning it once more to the write_destroy function. Having done this, it would then be safe to destroy the read structure and continue to use the PLTE, tRNS, and hIST data in the write structure. This function only affects data that has already been allocated. You can call this function before calling after the png_set_*() functions to control whether the user or png_destroy_*() is supposed to free the data. When the user assumes responsibility for libpng-allocated data, the application must use png_free() to free it, and when the user transfers responsibility to libpng for data that the user has allocated, the user must have used png_malloc() or png_zalloc() to allocate it. If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword separately, do not transfer responsibility for freeing text_ptr to libpng, because when libpng fills a png_text structure it combines these members with the key member, and png_free_data() will free only text_ptr.key. Similarly, if you transfer responsibility for free'ing text_ptr from libpng to your application, your application must not separately free those members. For a more compact example of writing a PNG image, see the file example.c. V. Modifying/Customizing libpng: There are three issues here. The first is changing how libpng does standard things like memory allocation, input/output, and error handling. The second deals with more complicated things like adding new chunks, adding new transformations, and generally changing how libpng works. Both of those are compile-time issues; that is, they are generally determined at the time the code is written, and there is rarely a need to provide the user with a means of changing them. The third is a run-time issue: choosing between and/or tuning one or more alternate versions of computationally intensive routines; specifically, optimized assembly-language (and therefore compiler- and platform-dependent) versions. Memory allocation, input/output, and error handling All of the memory allocation, input/output, and error handling in libpng goes through callbacks that are user-settable. The default routines are in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change these functions, call the appropriate png_set_*_fn() function. Memory allocation is done through the functions png_malloc() and png_free(). These currently just call the standard C functions. If your pointers can't access more then 64K at a time, you will want to set MAXSEG_64K in zlib.h. Since it is unlikely that the method of handling memory allocation on a platform will change between applications, these functions must be modified in the library at compile time. If you prefer to use a different method of allocating and freeing data, you can use png_create_read_struct_2() or png_create_write_struct_2() to register your own functions as described above. These functions also provide a void pointer that can be retrieved via mem_ptr=png_get_mem_ptr(png_ptr); Your replacement memory functions must have prototypes as follows: png_voidp malloc_fn(png_structp png_ptr, png_size_t size); void free_fn(png_structp png_ptr, png_voidp ptr); Your malloc_fn() should return NULL in case of failure. The png_malloc() function will call png_error() if it receives a NULL from the system memory allocator or from your replacement malloc_fn(). Input/Output in libpng is done through png_read() and png_write(), which currently just call fread() and fwrite(). The FILE * is stored in png_struct and is initialized via png_init_io(). If you wish to change the method of I/O, the library supplies callbacks that you can set through the function png_set_read_fn() and png_set_write_fn() at run time, instead of calling the png_init_io() function. These functions also provide a void pointer that can be retrieved via the function png_get_io_ptr(). For example: png_set_read_fn(png_structp read_ptr, voidp read_io_ptr, png_rw_ptr read_data_fn) png_set_write_fn(png_structp write_ptr, voidp write_io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn); voidp read_io_ptr = png_get_io_ptr(read_ptr); voidp write_io_ptr = png_get_io_ptr(write_ptr); The replacement I/O functions must have prototypes as follows: void user_read_data(png_structp png_ptr, png_bytep data, png_size_t length); void user_write_data(png_structp png_ptr, png_bytep data, png_size_t length); void user_flush_data(png_structp png_ptr); Supplying NULL for the read, write, or flush functions sets them back to using the default C stream functions. It is an error to read from a write stream, and vice versa. Error handling in libpng is done through png_error() and png_warning(). Errors handled through png_error() are fatal, meaning that png_error() should never return to its caller. Currently, this is handled via setjmp() and longjmp() (unless you have compiled libpng with PNG_SETJMP_NOT_SUPPORTED, in which case it is handled via PNG_ABORT()), but you could change this to do things like exit() if you should wish. On non-fatal errors, png_warning() is called to print a warning message, and then control returns to the calling code. By default png_error() and png_warning() print a message on stderr via fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined (because you don't want the messages) or PNG_NO_STDIO defined (because fprintf() isn't available). If you wish to change the behavior of the error functions, you will need to set up your own message callbacks. These functions are normally supplied at the time that the png_struct is created. It is also possible to redirect errors and warnings to your own replacement functions after png_create_*_struct() has been called by calling: png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn); png_voidp error_ptr = png_get_error_ptr(png_ptr); If NULL is supplied for either error_fn or warning_fn, then the libpng default function will be used, calling fprintf() and/or longjmp() if a problem is encountered. The replacement error functions should have parameters as follows: void user_error_fn(png_structp png_ptr, png_const_charp error_msg); void user_warning_fn(png_structp png_ptr, png_const_charp warning_msg); The motivation behind using setjmp() and longjmp() is the C++ throw and catch exception handling methods. This makes the code much easier to write, as there is no need to check every return code of every function call. However, there are some uncertainties about the status of local variables after a longjmp, so the user may want to be careful about doing anything after setjmp returns non-zero besides returning itself. Consult your compiler documentation for more details. For an alternative approach, you may wish to use the "cexcept" facility (see http://cexcept.sourceforge.net). Custom chunks If you need to read or write custom chunks, you may need to get deeper into the libpng code. The library now has mechanisms for storing and writing chunks of unknown type; you can even declare callbacks for custom chunks. Hoewver, this may not be good enough if the library code itself needs to know about interactions between your chunk and existing `intrinsic' chunks. If you need to write a new intrinsic chunk, first read the PNG specification. Acquire a first level of understanding of how it works. Pay particular attention to the sections that describe chunk names, and look at how other chunks were designed, so you can do things similarly. Second, check out the sections of libpng that read and write chunks. Try to find a chunk that is similar to yours and use it as a template. More details can be found in the comments inside the code. It is best to handle unknown chunks in a generic method, via callback functions, instead of by modifying libpng functions. If you wish to write your own transformation for the data, look through the part of the code that does the transformations, and check out some of the simpler ones to get an idea of how they work. Try to find a similar transformation to the one you want to add and copy off of it. More details can be found in the comments inside the code itself. Configuring for 16 bit platforms You will want to look into zconf.h to tell zlib (and thus libpng) that it cannot allocate more then 64K at a time. Even if you can, the memory won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K. Configuring for DOS For DOS users who only have access to the lower 640K, you will have to limit zlib's memory usage via a png_set_compression_mem_level() call. See zlib.h or zconf.h in the zlib library for more information. Configuring for Medium Model Libpng's support for medium model has been tested on most of the popular compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets defined, and FAR gets defined to far in pngconf.h, and you should be all set. Everything in the library (except for zlib's structure) is expecting far data. You must use the typedefs with the p or pp on the end for pointers (or at least look at them and be careful). Make note that the rows of data are defined as png_bytepp, which is an unsigned char far * far *. Configuring for gui/windowing platforms: You will need to write new error and warning functions that use the GUI interface, as described previously, and set them to be the error and warning functions at the time that png_create_*_struct() is called, in order to have them available during the structure initialization. They can be changed later via png_set_error_fn(). On some compilers, you may also have to change the memory allocators (png_malloc, etc.). Configuring for compiler xxx: All includes for libpng are in pngconf.h. If you need to add/change/delete an include, this is the place to do it. The includes that are not needed outside libpng are protected by the PNG_INTERNAL definition, which is only defined for those routines inside libpng itself. The files in libpng proper only include png.h, which includes pngconf.h. Configuring zlib: There are special functions to configure the compression. Perhaps the most useful one changes the compression level, which currently uses input compression values in the range 0 - 9. The library normally uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests have shown that for a large majority of images, compression values in the range 3-6 compress nearly as well as higher levels, and do so much faster. For online applications it may be desirable to have maximum speed (Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also specify no compression (Z_NO_COMPRESSION = 0), but this would create files larger than just storing the raw bitmap. You can specify the compression level by calling: png_set_compression_level(png_ptr, level); Another useful one is to reduce the memory level used by the library. The memory level defaults to 8, but it can be lowered if you are short on memory (running DOS, for example, where you only have 640K). Note that the memory level does have an effect on compression; among other things, lower levels will result in sections of incompressible data being emitted in smaller stored blocks, with a correspondingly larger relative overhead of up to 15% in the worst case. png_set_compression_mem_level(png_ptr, level); The other functions are for configuring zlib. They are not recommended for normal use and may result in writing an invalid PNG file. See zlib.h for more information on what these mean. png_set_compression_strategy(png_ptr, strategy); png_set_compression_window_bits(png_ptr, window_bits); png_set_compression_method(png_ptr, method); png_set_compression_buffer_size(png_ptr, size); Controlling row filtering If you want to control whether libpng uses filtering or not, which filters are used, and how it goes about picking row filters, you can call one of these functions. The selection and configuration of row filters can have a significant impact on the size and encoding speed and a somewhat lesser impact on the decoding speed of an image. Filtering is enabled by default for RGB and grayscale images (with and without alpha), but not for paletted images nor for any images with bit depths less than 8 bits/pixel. The 'method' parameter sets the main filtering method, which is currently only '0' in the PNG 1.2 specification. The 'filters' parameter sets which filter(s), if any, should be used for each scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS to turn filtering on and off, respectively. Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB, PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise ORed together with '|' to specify one or more filters to use. These filters are described in more detail in the PNG specification. If you intend to change the filter type during the course of writing the image, you should start with flags set for all of the filters you intend to use so that libpng can initialize its internal structures appropriately for all of the filter types. (Note that this means the first row must always be adaptively filtered, because libpng currently does not allocate the filter buffers until png_write_row() is called for the first time.) filters = PNG_FILTER_NONE | PNG_FILTER_SUB PNG_FILTER_UP | PNG_FILTER_AVE | PNG_FILTER_PAETH | PNG_ALL_FILTERS; png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, filters); The second parameter can also be PNG_INTRAPIXEL_DIFFERENCING if you are writing a PNG to be embedded in a MNG datastream. This parameter must be the same as the value of filter_method used in png_set_IHDR(). It is also possible to influence how libpng chooses from among the available filters. This is done in one or both of two ways - by telling it how important it is to keep the same filter for successive rows, and by telling it the relative computational costs of the filters. double weights[3] = {1.5, 1.3, 1.1}, costs[PNG_FILTER_VALUE_LAST] = {1.0, 1.3, 1.3, 1.5, 1.7}; png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_WEIGHTED, 3, weights, costs); The weights are multiplying factors that indicate to libpng that the row filter should be the same for successive rows unless another row filter is that many times better than the previous filter. In the above example, if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a "sum of absolute differences" 1.5 x 1.3 times higher than other filters and still be chosen, while the NONE filter could have a sum 1.1 times higher than other filters and still be chosen. Unspecified weights are taken to be 1.0, and the specified weights should probably be declining like those above in order to emphasize recent filters over older filters. The filter costs specify for each filter type a relative decoding cost to be considered when selecting row filters. This means that filters with higher costs are less likely to be chosen over filters with lower costs, unless their "sum of absolute differences" is that much smaller. The costs do not necessarily reflect the exact computational speeds of the various filters, since this would unduly influence the final image size. Note that the numbers above were invented purely for this example and are given only to help explain the function usage. Little testing has been done to find optimum values for either the costs or the weights. Removing unwanted object code There are a bunch of #define's in pngconf.h that control what parts of libpng are compiled. All the defines end in _SUPPORTED. If you are never going to use a capability, you can change the #define to #undef before recompiling libpng and save yourself code and data space, or you can turn off individual capabilities with defines that begin with PNG_NO_. You can also turn all of the transforms and ancillary chunk capabilities off en masse with compiler directives that define PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS, or all four, along with directives to turn on any of the capabilities that you do want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable the extra transformations but still leave the library fully capable of reading and writing PNG files with all known public chunks Use of the PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive produces a library that is incapable of reading or writing ancillary chunks. If you are not using the progressive reading capability, you can turn that off with PNG_NO_PROGRESSIVE_READ (don't confuse this with the INTERLACING capability, which you'll still have). All the reading and writing specific code are in separate files, so the linker should only grab the files it needs. However, if you want to make sure, or if you are building a stand alone library, all the reading files start with pngr and all the writing files start with pngw. The files that don't match either (like png.c, pngtrans.c, etc.) are used for both reading and writing, and always need to be included. The progressive reader is in pngpread.c If you are creating or distributing a dynamically linked library (a .so or DLL file), you should not remove or disable any parts of the library, as this will cause applications linked with different versions of the library to fail if they call functions not available in your library. The size of the library itself should not be an issue, because only those sections that are actually used will be loaded into memory. Requesting debug printout The macro definition PNG_DEBUG can be used to request debugging printout. Set it to an integer value in the range 0 to 3. Higher numbers result in increasing amounts of debugging information. The information is printed to the "stderr" file, unless another file name is specified in the PNG_DEBUG_FILE macro definition. When PNG_DEBUG > 0, the following functions (macros) become available: png_debug(level, message) png_debug1(level, message, p1) png_debug2(level, message, p1, p2) in which "level" is compared to PNG_DEBUG to decide whether to print the message, "message" is the formatted string to be printed, and p1 and p2 are parameters that are to be embedded in the string according to printf-style formatting directives. For example, png_debug1(2, "foo=%d\n", foo); is expanded to if(PNG_DEBUG > 2) fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo); When PNG_DEBUG is defined but is zero, the macros aren't defined, but you can still use PNG_DEBUG to control your own debugging: #ifdef PNG_DEBUG fprintf(stderr, ... #endif When PNG_DEBUG = 1, the macros are defined, but only png_debug statements having level = 0 will be printed. There aren't any such statements in this version of libpng, but if you insert some they will be printed. VI. Runtime optimization A new feature in libpng 1.2.0 is the ability to dynamically switch between standard and optimized versions of some routines. Currently these are limited to three computationally intensive tasks when reading PNG files: decoding row filters, expanding interlacing, and combining interlaced or transparent row data with previous row data. Currently the optimized versions are available only for x86 (Intel, AMD, etc.) platforms with MMX support, though this may change in future versions. (For example, the non-MMX assembler optimizations for zlib might become similarly runtime-selectable in future releases, in which case libpng could be extended to support them. Alternatively, the compile-time choice of floating-point versus integer routines for gamma correction might become runtime-selectable.) Because such optimizations tend to be very platform- and compiler-dependent, both in how they are written and in how they perform, the new runtime code in libpng has been written to allow programs to query, enable, and disable either specific optimizations or all such optimizations. For example, to enable all possible optimizations (bearing in mind that some "optimizations" may actually run more slowly in rare cases): #if defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) png_uint_32 mask, flags; flags = png_get_asm_flags(png_ptr); mask = png_get_asm_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE); png_set_asm_flags(png_ptr, flags | mask); #endif To enable only optimizations relevant to reading PNGs, use PNG_SELECT_READ by itself when calling png_get_asm_flagmask(); similarly for optimizing only writing. To disable all optimizations: #if defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) flags = png_get_asm_flags(png_ptr); mask = png_get_asm_flagmask(PNG_SELECT_READ | PNG_SELECT_WRITE); png_set_asm_flags(png_ptr, flags & ~mask); #endif To enable or disable only MMX-related features, use png_get_mmx_flagmask() in place of png_get_asm_flagmask(). The mmx version takes one additional parameter: #if defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) int selection = PNG_SELECT_READ | PNG_SELECT_WRITE; int compilerID; mask = png_get_mmx_flagmask(selection, &compilerID); #endif On return, compilerID will indicate which version of the MMX assembler optimizations was compiled. Currently two flavors exist: Microsoft Visual C++ (compilerID == 1) and GNU C (a.k.a. gcc/gas, compilerID == 2). On non-x86 platforms or on systems compiled without MMX optimizations, a value of -1 is used. Note that both png_get_asm_flagmask() and png_get_mmx_flagmask() return all valid, settable optimization bits for the version of the library that's currently in use. In the case of shared (dynamically linked) libraries, this may include optimizations that did not exist at the time the code was written and compiled. It is also possible, of course, to enable only known, specific optimizations; for example: #if defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) flags = PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ | PNG_ASM_FLAG_MMX_READ_INTERLACE \ | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; png_set_asm_flags(png_ptr, flags); #endif This method would enable only the MMX read-optimizations available at the time of libpng 1.2.0's release, regardless of whether a later version of the DLL were actually being used. (Also note that these functions did not exist in versions older than 1.2.0, so any attempt to run a dynamically linked app on such an older version would fail.) To determine whether the processor supports MMX instructions at all, use the png_mmx_support() function: #if defined(PNG_LIBPNG_VER) && (PNG_LIBPNG_VER >= 10200) mmxsupport = png_mmx_support(); #endif It returns -1 if MMX support is not compiled into libpng, 0 if MMX code is compiled but MMX is not supported by the processor, or 1 if MMX support is fully available. Note that png_mmx_support(), png_get_mmx_flagmask(), and png_get_asm_flagmask() all may be called without allocating and ini- tializing any PNG structures (for example, as part of a usage screen or "about" box). The following code can be used to prevent an application from using the thread_unsafe features, even if libpng was built with PNG_THREAD_UNSAFE_OK defined: #if defined(PNG_USE_PNGGCCRD) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) \ && defined(PNG_THREAD_UNSAFE_OK) /* Disable thread-unsafe features of pnggccrd */ if (png_access_version() >= 10200) { png_uint_32 mmx_disable_mask = 0; png_uint_32 asm_flags; mmx_disable_mask |= ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ); asm_flags = png_get_asm_flags(png_ptr); png_set_asm_flags(png_ptr, asm_flags & ~mmx_disable_mask); } #endif For more extensive examples of runtime querying, enabling and disabling of optimized features, see contrib/gregbook/readpng2.c in the libpng source-code distribution. VII. MNG support The MNG specification (available at http://www.libpng.org/pub/mng) allows certain extensions to PNG for PNG images that are embedded in MNG datastreams. Libpng can support some of these extensions. To enable them, use the png_permit_mng_features() function: feature_set = png_permit_mng_features(png_ptr, mask) mask is a png_uint_32 containing the logical OR of the features you want to enable. These include PNG_FLAG_MNG_EMPTY_PLTE PNG_FLAG_MNG_FILTER_64 PNG_ALL_MNG_FEATURES feature_set is a png_32_uint that is the logical AND of your mask with the set of MNG features that is supported by the version of libpng that you are using. It is an error to use this function when reading or writing a standalone PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped in a MNG datastream. As a minimum, it must have the MNG 8-byte signature and the MHDR and MEND chunks. Libpng does not provide support for these or any other MNG chunks; your application must provide its own support for them. You may wish to consider using libmng (available at http://www.libmng.com) instead. VIII. Changes to Libpng from version 0.88 It should be noted that versions of libpng later than 0.96 are not distributed by the original libpng author, Guy Schalnat, nor by Andreas Dilger, who had taken over from Guy during 1996 and 1997, and distributed versions 0.89 through 0.96, but rather by another member of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are still alive and well, but they have moved on to other things. The old libpng functions png_read_init(), png_write_init(), png_info_init(), png_read_destroy(), and png_write_destroy() have been moved to PNG_INTERNAL in version 0.95 to discourage their use. These functions will be removed from libpng version 2.0.0. The preferred method of creating and initializing the libpng structures is via the png_create_read_struct(), png_create_write_struct(), and png_create_info_struct() because they isolate the size of the structures from the application, allow version error checking, and also allow the use of custom error handling routines during the initialization, which the old functions do not. The functions png_read_destroy() and png_write_destroy() do not actually free the memory that libpng allocated for these structs, but just reset the data structures, so they can be used instead of png_destroy_read_struct() and png_destroy_write_struct() if you feel there is too much system overhead allocating and freeing the png_struct for each image read. Setting the error callbacks via png_set_message_fn() before png_read_init() as was suggested in libpng-0.88 is no longer supported because this caused applications that do not use custom error functions to fail if the png_ptr was not initialized to zero. It is still possible to set the error callbacks AFTER png_read_init(), or to change them with png_set_error_fn(), which is essentially the same function, but with a new name to force compilation errors with applications that try to use the old method. Starting with version 1.0.7, you can find out which version of the library you are using at run-time: png_uint_32 libpng_vn = png_access_version_number(); The number libpng_vn is constructed from the major version, minor version with leading zero, and release number with leading zero, (e.g., libpng_vn for version 1.0.7 is 10007). You can also check which version of png.h you used when compiling your application: png_uint_32 application_vn = PNG_LIBPNG_VER; IX. Y2K Compliance in libpng October 3, 2002 Since the PNG Development group is an ad-hoc body, we can't make an official declaration. This is your unofficial assurance that libpng from version 0.71 and upward through 1.2.5 are Y2K compliant. It is my belief that earlier versions were also Y2K compliant. Libpng only has three year fields. One is a 2-byte unsigned integer that will hold years up to 65535. The other two hold the date in text format, and will hold years up to 9999. The integer is "png_uint_16 year" in png_time_struct. The strings are "png_charp time_buffer" in png_struct and "near_time_buffer", which is a local character string in png.c. There are seven time-related functions: png_convert_to_rfc_1123() in png.c (formerly png_convert_to_rfc_1152() in error) png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c png_convert_from_time_t() in pngwrite.c png_get_tIME() in pngget.c png_handle_tIME() in pngrutil.c, called in pngread.c png_set_tIME() in pngset.c png_write_tIME() in pngwutil.c, called in pngwrite.c All appear to handle dates properly in a Y2K environment. The png_convert_from_time_t() function calls gmtime() to convert from system clock time, which returns (year - 1900), which we properly convert to the full 4-digit year. There is a possibility that applications using libpng are not passing 4-digit years into the png_convert_to_rfc_1123() function, or that they are incorrectly passing only a 2-digit year instead of "year - 1900" into the png_convert_from_struct_tm() function, but this is not under our control. The libpng documentation has always stated that it works with 4-digit years, and the APIs have been documented as such. The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned integer to hold the year, and can hold years as large as 65535. zlib, upon which libpng depends, is also Y2K compliant. It contains no date-related code. Glenn Randers-Pehrson libpng maintainer PNG Development Group gamera-3.3.3/src/libpng-1.2.5/LICENSE0000644000076500000000000000737210714675701015473 0ustar chriswheel This copy of the libpng notices is provided for your convenience. In case of any discrepancy between this copy and the notices in the file png.h that is included in the libpng distribution, the latter shall prevail. COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: If you modify libpng you may insert additional notices immediately following this sentence. libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are Copyright (c) 2000-2002 Glenn Randers-Pehrson and are distributed according to the same disclaimer and license as libpng-1.0.6 with the following individuals added to the list of Contributing Authors Simon-Pierre Cadieux Eric S. Raymond Gilles Vollant and with the following additions to the disclaimer: There is no warranty against interference with your enjoyment of the library or against infringement. There is no warranty that our efforts or the library will fulfill any of your particular purposes or needs. This library is provided with all faults, and the entire risk of satisfactory quality, performance, accuracy, and effort is with the user. libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are distributed according to the same disclaimer and license as libpng-0.96, with the following individuals added to the list of Contributing Authors: Tom Lane Glenn Randers-Pehrson Willem van Schaik libpng versions 0.89, June 1996, through 0.96, May 1997, are Copyright (c) 1996, 1997 Andreas Dilger Distributed according to the same disclaimer and license as libpng-0.88, with the following individuals added to the list of Contributing Authors: John Bowler Kevin Bracey Sam Bushell Magnus Holmgren Greg Roelofs Tom Tanner libpng versions 0.5, May 1995, through 0.88, January 1996, are Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. For the purposes of this copyright and license, "Contributing Authors" is defined as the following set of individuals: Andreas Dilger Dave Martindale Guy Eric Schalnat Paul Schmidt Tim Wegner The PNG Reference Library is supplied "AS IS". The Contributing Authors and Group 42, Inc. disclaim all warranties, expressed or implied, including, without limitation, the warranties of merchantability and of fitness for any purpose. The Contributing Authors and Group 42, Inc. assume no liability for direct, indirect, incidental, special, exemplary, or consequential damages, which may result from the use of the PNG Reference Library, even if advised of the possibility of such damage. Permission is hereby granted to use, copy, modify, and distribute this source code, or portions hereof, for any purpose, without fee, subject to the following restrictions: 1. The origin of this source code must not be misrepresented. 2. Altered versions must be plainly marked as such and must not be misrepresented as being the original source. 3. This Copyright notice may not be removed or altered from any source or altered source distribution. The Contributing Authors and Group 42, Inc. specifically permit, without fee, and encourage the use of this source code as a component to supporting the PNG file format in commercial products. If you use this source code in a product, acknowledgment is not required but would be appreciated. A "png_get_copyright" function is available, for convenient use in "about" boxes and the like: printf("%s",png_get_copyright(NULL)); Also, the PNG logo (in PNG format, of course) is supplied in the files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a certification mark of the Open Source Initiative. Glenn Randers-Pehrson randeg@alum.rpi.edu October 3, 2002 gamera-3.3.3/src/libpng-1.2.5/png.c0000644000076500000000000005446510714675701015423 0ustar chriswheel /* png.c - location for general purpose libpng functions * * libpng version 1.2.5 - October 3, 2002 * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * */ #define PNG_INTERNAL #define PNG_NO_EXTERN #include "png.h" /* Generate a compiler error if there is an old png.h in the search path. */ typedef version_1_2_5 Your_png_h_is_not_version_1_2_5; /* Version information for C files. This had better match the version * string defined in png.h. */ #ifdef PNG_USE_GLOBAL_ARRAYS /* png_libpng_ver was changed to a function in version 1.0.5c */ const char png_libpng_ver[18] = "1.2.5"; /* png_sig was changed to a function in version 1.0.5c */ /* Place to hold the signature string for a PNG file. */ const png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10}; /* Invoke global declarations for constant strings for known chunk types */ PNG_IHDR; PNG_IDAT; PNG_IEND; PNG_PLTE; PNG_bKGD; PNG_cHRM; PNG_gAMA; PNG_hIST; PNG_iCCP; PNG_iTXt; PNG_oFFs; PNG_pCAL; PNG_sCAL; PNG_pHYs; PNG_sBIT; PNG_sPLT; PNG_sRGB; PNG_tEXt; PNG_tIME; PNG_tRNS; PNG_zTXt; /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* start of interlace block */ const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; /* offset to next interlace block */ const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; /* start of interlace block in the y direction */ const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; /* offset to next interlace block in the y direction */ const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; /* width of interlace block (used in assembler routines only) */ #ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; #endif /* Height of interlace block. This is not currently used - if you need * it, uncomment it here and in png.h const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; */ /* Mask to determine which pixels are valid in a pass */ const int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; /* Mask to determine which pixels to overwrite while displaying */ const int FARDATA png_pass_dsp_mask[] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; #endif /* Tells libpng that we have already handled the first "num_bytes" bytes * of the PNG file signature. If the PNG data is embedded into another * stream we can set num_bytes = 8 so that libpng will not attempt to read * or write any of the magic bytes before it starts on the IHDR. */ void PNGAPI png_set_sig_bytes(png_structp png_ptr, int num_bytes) { png_debug(1, "in png_set_sig_bytes\n"); if (num_bytes > 8) png_error(png_ptr, "Too many bytes for PNG signature."); png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes); } /* Checks whether the supplied bytes match the PNG signature. We allow * checking less than the full 8-byte signature so that those apps that * already read the first few bytes of a file to determine the file type * can simply check the remaining bytes for extra assurance. Returns * an integer less than, equal to, or greater than zero if sig is found, * respectively, to be less than, to match, or be greater than the correct * PNG signature (this is the same behaviour as strcmp, memcmp, etc). */ int PNGAPI png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check) { png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; if (num_to_check > 8) num_to_check = 8; else if (num_to_check < 1) return (0); if (start > 7) return (0); if (start + num_to_check > 8) num_to_check = 8 - start; return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check))); } /* (Obsolete) function to check signature bytes. It does not allow one * to check a partial signature. This function might be removed in the * future - use png_sig_cmp(). Returns true (nonzero) if the file is a PNG. */ int PNGAPI png_check_sig(png_bytep sig, int num) { return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num)); } /* Function to allocate memory for zlib and clear it to 0. */ #ifdef PNG_1_0_X voidpf PNGAPI #else voidpf /* private */ #endif png_zalloc(voidpf png_ptr, uInt items, uInt size) { png_uint_32 num_bytes = (png_uint_32)items * size; png_voidp ptr; png_structp p=png_ptr; png_uint_32 save_flags=p->flags; p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes); p->flags=save_flags; #ifndef PNG_NO_ZALLOC_ZERO if (ptr == NULL) return ((voidpf)ptr); if (num_bytes > (png_uint_32)0x8000L) { png_memset(ptr, 0, (png_size_t)0x8000L); png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0, (png_size_t)(num_bytes - (png_uint_32)0x8000L)); } else { png_memset(ptr, 0, (png_size_t)num_bytes); } #endif return ((voidpf)ptr); } /* function to free memory for zlib */ #ifdef PNG_1_0_X void PNGAPI #else void /* private */ #endif png_zfree(voidpf png_ptr, voidpf ptr) { png_free((png_structp)png_ptr, (png_voidp)ptr); } /* Reset the CRC variable to 32 bits of 1's. Care must be taken * in case CRC is > 32 bits to leave the top bits 0. */ void /* PRIVATE */ png_reset_crc(png_structp png_ptr) { png_ptr->crc = crc32(0, Z_NULL, 0); } /* Calculate the CRC over a section of data. We can only pass as * much data to this routine as the largest single buffer size. We * also check that this data will actually be used before going to the * trouble of calculating it. */ void /* PRIVATE */ png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) { int need_crc = 1; if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ { if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) need_crc = 0; } else /* critical */ { if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) need_crc = 0; } if (need_crc) png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length); } /* Allocate the memory for an info_struct for the application. We don't * really need the png_ptr, but it could potentially be useful in the * future. This should be used in favour of malloc(sizeof(png_info)) * and png_info_init() so that applications that want to use a shared * libpng don't have to be recompiled if png_info changes size. */ png_infop PNGAPI png_create_info_struct(png_structp png_ptr) { png_infop info_ptr; png_debug(1, "in png_create_info_struct\n"); if(png_ptr == NULL) return (NULL); #ifdef PNG_USER_MEM_SUPPORTED info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO, png_ptr->malloc_fn, png_ptr->mem_ptr); #else info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); #endif if (info_ptr != NULL) png_info_init_3(&info_ptr, sizeof(png_info)); return (info_ptr); } /* This function frees the memory associated with a single info struct. * Normally, one would use either png_destroy_read_struct() or * png_destroy_write_struct() to free an info struct, but this may be * useful for some applications. */ void PNGAPI png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr) { png_infop info_ptr = NULL; png_debug(1, "in png_destroy_info_struct\n"); if (info_ptr_ptr != NULL) info_ptr = *info_ptr_ptr; if (info_ptr != NULL) { png_info_destroy(png_ptr, info_ptr); #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn, png_ptr->mem_ptr); #else png_destroy_struct((png_voidp)info_ptr); #endif *info_ptr_ptr = NULL; } } /* Initialize the info structure. This is now an internal function (0.89) * and applications using it are urged to use png_create_info_struct() * instead. */ #undef png_info_init void PNGAPI png_info_init(png_infop info_ptr) { /* We only come here via pre-1.0.12-compiled applications */ png_info_init_3(&info_ptr, 0); } void PNGAPI png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size) { png_infop info_ptr = *ptr_ptr; png_debug(1, "in png_info_init_3\n"); if(sizeof(png_info) > png_info_struct_size) { png_destroy_struct(info_ptr); info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); *ptr_ptr = info_ptr; } /* set everything to 0 */ png_memset(info_ptr, 0, sizeof (png_info)); } #ifdef PNG_FREE_ME_SUPPORTED void PNGAPI png_data_freer(png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask) { png_debug(1, "in png_data_freer\n"); if (png_ptr == NULL || info_ptr == NULL) return; if(freer == PNG_DESTROY_WILL_FREE_DATA) info_ptr->free_me |= mask; else if(freer == PNG_USER_WILL_FREE_DATA) info_ptr->free_me &= ~mask; else png_warning(png_ptr, "Unknown freer parameter in png_data_freer."); } #endif void PNGAPI png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, int num) { png_debug(1, "in png_free_data\n"); if (png_ptr == NULL || info_ptr == NULL) return; #if defined(PNG_TEXT_SUPPORTED) /* free text item num or (if num == -1) all text items */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) #else if (mask & PNG_FREE_TEXT) #endif { if (num != -1) { if (info_ptr->text && info_ptr->text[num].key) { png_free(png_ptr, info_ptr->text[num].key); info_ptr->text[num].key = NULL; } } else { int i; for (i = 0; i < info_ptr->num_text; i++) png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); png_free(png_ptr, info_ptr->text); info_ptr->text = NULL; info_ptr->num_text=0; } } #endif #if defined(PNG_tRNS_SUPPORTED) /* free any tRNS entry */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) #else if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS)) #endif { png_free(png_ptr, info_ptr->trans); info_ptr->valid &= ~PNG_INFO_tRNS; #ifndef PNG_FREE_ME_SUPPORTED png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; #endif info_ptr->trans = NULL; } #endif #if defined(PNG_sCAL_SUPPORTED) /* free any sCAL entry */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) #else if (mask & PNG_FREE_SCAL) #endif { #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) png_free(png_ptr, info_ptr->scal_s_width); png_free(png_ptr, info_ptr->scal_s_height); info_ptr->scal_s_width = NULL; info_ptr->scal_s_height = NULL; #endif info_ptr->valid &= ~PNG_INFO_sCAL; } #endif #if defined(PNG_pCAL_SUPPORTED) /* free any pCAL entry */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) #else if (mask & PNG_FREE_PCAL) #endif { png_free(png_ptr, info_ptr->pcal_purpose); png_free(png_ptr, info_ptr->pcal_units); info_ptr->pcal_purpose = NULL; info_ptr->pcal_units = NULL; if (info_ptr->pcal_params != NULL) { int i; for (i = 0; i < (int)info_ptr->pcal_nparams; i++) { png_free(png_ptr, info_ptr->pcal_params[i]); info_ptr->pcal_params[i]=NULL; } png_free(png_ptr, info_ptr->pcal_params); info_ptr->pcal_params = NULL; } info_ptr->valid &= ~PNG_INFO_pCAL; } #endif #if defined(PNG_iCCP_SUPPORTED) /* free any iCCP entry */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) #else if (mask & PNG_FREE_ICCP) #endif { png_free(png_ptr, info_ptr->iccp_name); png_free(png_ptr, info_ptr->iccp_profile); info_ptr->iccp_name = NULL; info_ptr->iccp_profile = NULL; info_ptr->valid &= ~PNG_INFO_iCCP; } #endif #if defined(PNG_sPLT_SUPPORTED) /* free a given sPLT entry, or (if num == -1) all sPLT entries */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) #else if (mask & PNG_FREE_SPLT) #endif { if (num != -1) { if(info_ptr->splt_palettes) { png_free(png_ptr, info_ptr->splt_palettes[num].name); png_free(png_ptr, info_ptr->splt_palettes[num].entries); info_ptr->splt_palettes[num].name = NULL; info_ptr->splt_palettes[num].entries = NULL; } } else { if(info_ptr->splt_palettes_num) { int i; for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); png_free(png_ptr, info_ptr->splt_palettes); info_ptr->splt_palettes = NULL; info_ptr->splt_palettes_num = 0; } info_ptr->valid &= ~PNG_INFO_sPLT; } } #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) #else if (mask & PNG_FREE_UNKN) #endif { if (num != -1) { if(info_ptr->unknown_chunks) { png_free(png_ptr, info_ptr->unknown_chunks[num].data); info_ptr->unknown_chunks[num].data = NULL; } } else { int i; if(info_ptr->unknown_chunks_num) { for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++) png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); png_free(png_ptr, info_ptr->unknown_chunks); info_ptr->unknown_chunks = NULL; info_ptr->unknown_chunks_num = 0; } } } #endif #if defined(PNG_hIST_SUPPORTED) /* free any hIST entry */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_HIST) & info_ptr->free_me) #else if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST)) #endif { png_free(png_ptr, info_ptr->hist); info_ptr->hist = NULL; info_ptr->valid &= ~PNG_INFO_hIST; #ifndef PNG_FREE_ME_SUPPORTED png_ptr->flags &= ~PNG_FLAG_FREE_HIST; #endif } #endif /* free any PLTE entry that was internally allocated */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) #else if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE)) #endif { png_zfree(png_ptr, info_ptr->palette); info_ptr->palette = NULL; info_ptr->valid &= ~PNG_INFO_PLTE; #ifndef PNG_FREE_ME_SUPPORTED png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; #endif info_ptr->num_palette = 0; } #if defined(PNG_INFO_IMAGE_SUPPORTED) /* free any image bits attached to the info structure */ #ifdef PNG_FREE_ME_SUPPORTED if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) #else if (mask & PNG_FREE_ROWS) #endif { if(info_ptr->row_pointers) { int row; for (row = 0; row < (int)info_ptr->height; row++) { png_free(png_ptr, info_ptr->row_pointers[row]); info_ptr->row_pointers[row]=NULL; } png_free(png_ptr, info_ptr->row_pointers); info_ptr->row_pointers=NULL; } info_ptr->valid &= ~PNG_INFO_IDAT; } #endif #ifdef PNG_FREE_ME_SUPPORTED if(num == -1) info_ptr->free_me &= ~mask; else info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL); #endif } /* This is an internal routine to free any memory that the info struct is * pointing to before re-using it or freeing the struct itself. Recall * that png_free() checks for NULL pointers for us. */ void /* PRIVATE */ png_info_destroy(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_info_destroy\n"); png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) if (png_ptr->num_chunk_list) { png_free(png_ptr, png_ptr->chunk_list); png_ptr->chunk_list=NULL; png_ptr->num_chunk_list=0; } #endif png_info_init_3(&info_ptr, sizeof(png_info)); } /* This function returns a pointer to the io_ptr associated with the user * functions. The application should free any memory associated with this * pointer before png_write_destroy() or png_read_destroy() are called. */ png_voidp PNGAPI png_get_io_ptr(png_structp png_ptr) { return (png_ptr->io_ptr); } #if !defined(PNG_NO_STDIO) /* Initialize the default input/output functions for the PNG file. If you * use your own read or write routines, you can call either png_set_read_fn() * or png_set_write_fn() instead of png_init_io(). If you have defined * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't * necessarily available. */ void PNGAPI png_init_io(png_structp png_ptr, png_FILE_p fp) { png_debug(1, "in png_init_io\n"); png_ptr->io_ptr = (png_voidp)fp; } #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) /* Convert the supplied time into an RFC 1123 string suitable for use in * a "Creation Time" or other text-based time string. */ png_charp PNGAPI png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) { static PNG_CONST char short_months[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; if (png_ptr->time_buffer == NULL) { png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* sizeof(char))); } #if defined(_WIN32_WCE) { wchar_t time_buf[29]; wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"), ptime->day % 32, short_months[(ptime->month - 1) % 12], ptime->year, ptime->hour % 24, ptime->minute % 60, ptime->second % 61); WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29, NULL, NULL); } #else #ifdef USE_FAR_KEYWORD { char near_time_buf[29]; sprintf(near_time_buf, "%d %s %d %02d:%02d:%02d +0000", ptime->day % 32, short_months[(ptime->month - 1) % 12], ptime->year, ptime->hour % 24, ptime->minute % 60, ptime->second % 61); png_memcpy(png_ptr->time_buffer, near_time_buf, 29*sizeof(char)); } #else sprintf(png_ptr->time_buffer, "%d %s %d %02d:%02d:%02d +0000", ptime->day % 32, short_months[(ptime->month - 1) % 12], ptime->year, ptime->hour % 24, ptime->minute % 60, ptime->second % 61); #endif #endif /* _WIN32_WCE */ return ((png_charp)png_ptr->time_buffer); } #endif /* PNG_TIME_RFC1123_SUPPORTED */ #if 0 /* Signature string for a PNG file. */ png_bytep PNGAPI png_sig_bytes(void) { return ((png_bytep)"\211\120\116\107\015\012\032\012"); } #endif png_charp PNGAPI png_get_copyright(png_structp png_ptr) { if (png_ptr != NULL || png_ptr == NULL) /* silence compiler warning */ return ((png_charp) "\n libpng version 1.2.5 - October 3, 2002\n\ Copyright (c) 1998-2002 Glenn Randers-Pehrson\n\ Copyright (c) 1996-1997 Andreas Dilger\n\ Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n"); return ((png_charp) ""); } /* The following return the library version as a short string in the * format 1.0.0 through 99.99.99zz. To get the version of *.h files used * with your application, print out PNG_LIBPNG_VER_STRING, which is defined * in png.h. */ png_charp PNGAPI png_get_libpng_ver(png_structp png_ptr) { /* Version of *.c files used when building libpng */ if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */ return((png_charp) "1.2.5"); return((png_charp) "1.2.5"); } png_charp PNGAPI png_get_header_ver(png_structp png_ptr) { /* Version of *.h files used when building libpng */ if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */ return((png_charp) PNG_LIBPNG_VER_STRING); return((png_charp) PNG_LIBPNG_VER_STRING); } png_charp PNGAPI png_get_header_version(png_structp png_ptr) { /* Returns longer string containing both version and date */ if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */ return((png_charp) PNG_HEADER_VERSION_STRING); return((png_charp) PNG_HEADER_VERSION_STRING); } #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED int PNGAPI png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name) { /* check chunk_name and return "keep" value if it's on the list, else 0 */ int i; png_bytep p; if((png_ptr == NULL && chunk_name == NULL) || png_ptr->num_chunk_list<=0) return 0; p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5; for (i = png_ptr->num_chunk_list; i; i--, p-=5) if (!png_memcmp(chunk_name, p, 4)) return ((int)*(p+4)); return 0; } #endif /* This function, added to libpng-1.0.6g, is untested. */ int PNGAPI png_reset_zstream(png_structp png_ptr) { return (inflateReset(&png_ptr->zstream)); } /* This function was added to libpng-1.0.7 */ png_uint_32 PNGAPI png_access_version_number(void) { /* Version of *.c files used when building libpng */ return((png_uint_32) 10205L); } #if !defined(PNG_1_0_X) #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */ /* this INTERNAL function was added to libpng 1.2.0 */ void /* PRIVATE */ png_init_mmx_flags (png_structp png_ptr) { png_ptr->mmx_rowbytes_threshold = 0; png_ptr->mmx_bitdepth_threshold = 0; # if (defined(PNG_USE_PNGVCRD) || defined(PNG_USE_PNGGCCRD)) png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_COMPILED; if (png_mmx_support() > 0) { png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU # ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW | PNG_ASM_FLAG_MMX_READ_COMBINE_ROW # endif # ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE | PNG_ASM_FLAG_MMX_READ_INTERLACE # endif # ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW ; # else | PNG_ASM_FLAG_MMX_READ_FILTER_SUB | PNG_ASM_FLAG_MMX_READ_FILTER_UP | PNG_ASM_FLAG_MMX_READ_FILTER_AVG | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; png_ptr->mmx_rowbytes_threshold = PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT; png_ptr->mmx_bitdepth_threshold = PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT; # endif } else { png_ptr->asm_flags &= ~( PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU | PNG_MMX_READ_FLAGS | PNG_MMX_WRITE_FLAGS ); } # else /* !((PNGVCRD || PNGGCCRD) && PNG_ASSEMBLER_CODE_SUPPORTED)) */ /* clear all MMX flags; no support is compiled in */ png_ptr->asm_flags &= ~( PNG_MMX_FLAGS ); # endif /* ?(PNGVCRD || PNGGCCRD) */ } #endif /* !(PNG_ASSEMBLER_CODE_SUPPORTED) */ /* this function was added to libpng 1.2.0 */ #if !defined(PNG_USE_PNGGCCRD) && \ !(defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD)) int PNGAPI png_mmx_support(void) { return -1; } #endif #endif /* PNG_1_0_X */ gamera-3.3.3/src/libpng-1.2.5/png.h0000644000076500000000000041272710714675701015427 0ustar chriswheel/* png.h - header file for PNG reference library * * libpng version 1.2.5 - October 3, 2002 * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * Authors and maintainers: * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.2.5 - October 3, 2002: Glenn * See also "Contributing Authors", below. * * Note about libpng version numbers: * * Due to various miscommunications, unforeseen code incompatibilities * and occasional factors outside the authors' control, version numbering * on the library has not always been consistent and straightforward. * The following table summarizes matters since version 0.89c, which was * the first widely used release: * * source png.h png.h shared-lib * version string int version * ------- ------ ----- ---------- * 0.89c "1.0 beta 3" 0.89 89 1.0.89 * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] * 0.97c 0.97 97 2.0.97 * 0.98 0.98 98 2.0.98 * 0.99 0.99 98 2.0.99 * 0.99a-m 0.99 99 2.0.99 * 1.00 1.00 100 2.1.0 [100 should be 10000] * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] * 1.0.1 png.h string is 10001 2.1.0 * 1.0.1a-e identical to the 10002 from here on, the shared library * 1.0.2 source version) 10002 is 2.V where V is the source code * 1.0.2a-b 10003 version, except as noted. * 1.0.3 10003 * 1.0.3a-d 10004 * 1.0.4 10004 * 1.0.4a-f 10005 * 1.0.5 (+ 2 patches) 10005 * 1.0.5a-d 10006 * 1.0.5e-r 10100 (not source compatible) * 1.0.5s-v 10006 (not binary compatible) * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) * 1.0.6d-f 10007 (still binary incompatible) * 1.0.6g 10007 * 1.0.6h 10007 10.6h (testing xy.z so-numbering) * 1.0.6i 10007 10.6i * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) * 1.0.7 1 10007 (still compatible) * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 * 1.0.8rc1 1 10008 2.1.0.8rc1 * 1.0.8 1 10008 2.1.0.8 * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 * 1.0.9rc1 1 10009 2.1.0.9rc1 * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 * 1.0.9rc2 1 10009 2.1.0.9rc2 * 1.0.9 1 10009 2.1.0.9 * 1.0.10beta1 1 10010 2.1.0.10beta1 * 1.0.10rc1 1 10010 2.1.0.10rc1 * 1.0.10 1 10010 2.1.0.10 * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 * 1.0.11rc1 1 10011 2.1.0.11rc1 * 1.0.11 1 10011 2.1.0.11 * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 * 1.0.12rc1 2 10012 2.1.0.12rc1 * 1.0.12 2 10012 2.1.0.12 * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 * 1.2.0rc1 3 10200 3.1.2.0rc1 * 1.2.0 3 10200 3.1.2.0 * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 * 1.2.1 3 10201 3.1.2.1 * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 * 1.0.13 10 10013 10.so.0.1.0.13 * 1.2.2 12 10202 12.so.0.1.2.2 * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 * 1.2.3 12 10203 12.so.0.1.2.3 * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 * 1.0.14 10 10014 10.so.0.1.0.14 * 1.2.4 13 10204 12.so.0.1.2.4 * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 * 1.0.15 10 10015 10.so.0.1.0.15 * 1.2.5 13 10205 12.so.0.1.2.5 * * Henceforth the source version will match the shared-library major * and minor numbers; the shared-library major version number will be * used for changes in backward compatibility, as it is intended. The * PNG_LIBPNG_VER macro, which is not used within libpng but is available * for applications, is an unsigned integer of the form xyyzz corresponding * to the source version x.y.z (leading zeros in y and z). Beta versions * were given the previous public release number plus a letter, until * version 1.0.6j; from then on they were given the upcoming public * release number plus "betaNN" or "rcN". * * Binary incompatibility exists only when applications make direct access * to the info_ptr or png_ptr members through png.h, and the compiled * application is loaded with a different version of the library. * * DLLNUM will change each time there are forward or backward changes * in binary compatibility (e.g., when a new feature is added). * * See libpng.txt or libpng.3 for more information. The PNG specification * is available as RFC 2083 * and as a W3C Recommendation */ /* * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: * * If you modify libpng you may insert additional notices immediately following * this sentence. * * libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are * Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are * distributed according to the same disclaimer and license as libpng-1.0.6 * with the following individuals added to the list of Contributing Authors * * Simon-Pierre Cadieux * Eric S. Raymond * Gilles Vollant * * and with the following additions to the disclaimer: * * There is no warranty against interference with your enjoyment of the * library or against infringement. There is no warranty that our * efforts or the library will fulfill any of your particular purposes * or needs. This library is provided with all faults, and the entire * risk of satisfactory quality, performance, accuracy, and effort is with * the user. * * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson * Distributed according to the same disclaimer and license as libpng-0.96, * with the following individuals added to the list of Contributing Authors: * * Tom Lane * Glenn Randers-Pehrson * Willem van Schaik * * libpng versions 0.89, June 1996, through 0.96, May 1997, are * Copyright (c) 1996, 1997 Andreas Dilger * Distributed according to the same disclaimer and license as libpng-0.88, * with the following individuals added to the list of Contributing Authors: * * John Bowler * Kevin Bracey * Sam Bushell * Magnus Holmgren * Greg Roelofs * Tom Tanner * * libpng versions 0.5, May 1995, through 0.88, January 1996, are * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * * For the purposes of this copyright and license, "Contributing Authors" * is defined as the following set of individuals: * * Andreas Dilger * Dave Martindale * Guy Eric Schalnat * Paul Schmidt * Tim Wegner * * The PNG Reference Library is supplied "AS IS". The Contributing Authors * and Group 42, Inc. disclaim all warranties, expressed or implied, * including, without limitation, the warranties of merchantability and of * fitness for any purpose. The Contributing Authors and Group 42, Inc. * assume no liability for direct, indirect, incidental, special, exemplary, * or consequential damages, which may result from the use of the PNG * Reference Library, even if advised of the possibility of such damage. * * Permission is hereby granted to use, copy, modify, and distribute this * source code, or portions hereof, for any purpose, without fee, subject * to the following restrictions: * * 1. The origin of this source code must not be misrepresented. * * 2. Altered versions must be plainly marked as such and * must not be misrepresented as being the original source. * * 3. This Copyright notice may not be removed or altered from * any source or altered source distribution. * * The Contributing Authors and Group 42, Inc. specifically permit, without * fee, and encourage the use of this source code as a component to * supporting the PNG file format in commercial products. If you use this * source code in a product, acknowledgment is not required but would be * appreciated. */ /* * A "png_get_copyright" function is available, for convenient use in "about" * boxes and the like: * * printf("%s",png_get_copyright(NULL)); * * Also, the PNG logo (in PNG format, of course) is supplied in the * files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). */ /* * Libpng is OSI Certified Open Source Software. OSI Certified is a * certification mark of the Open Source Initiative. */ /* * The contributing authors would like to thank all those who helped * with testing, bug fixes, and patience. This wouldn't have been * possible without all of you. * * Thanks to Frank J. T. Wojcik for helping with the documentation. */ /* * Y2K compliance in libpng: * ========================= * * October 3, 2002 * * Since the PNG Development group is an ad-hoc body, we can't make * an official declaration. * * This is your unofficial assurance that libpng from version 0.71 and * upward through 1.2.5 are Y2K compliant. It is my belief that earlier * versions were also Y2K compliant. * * Libpng only has three year fields. One is a 2-byte unsigned integer * that will hold years up to 65535. The other two hold the date in text * format, and will hold years up to 9999. * * The integer is * "png_uint_16 year" in png_time_struct. * * The strings are * "png_charp time_buffer" in png_struct and * "near_time_buffer", which is a local character string in png.c. * * There are seven time-related functions: * png.c: png_convert_to_rfc_1123() in png.c * (formerly png_convert_to_rfc_1152() in error) * png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c * png_convert_from_time_t() in pngwrite.c * png_get_tIME() in pngget.c * png_handle_tIME() in pngrutil.c, called in pngread.c * png_set_tIME() in pngset.c * png_write_tIME() in pngwutil.c, called in pngwrite.c * * All handle dates properly in a Y2K environment. The * png_convert_from_time_t() function calls gmtime() to convert from system * clock time, which returns (year - 1900), which we properly convert to * the full 4-digit year. There is a possibility that applications using * libpng are not passing 4-digit years into the png_convert_to_rfc_1123() * function, or that they are incorrectly passing only a 2-digit year * instead of "year - 1900" into the png_convert_from_struct_tm() function, * but this is not under our control. The libpng documentation has always * stated that it works with 4-digit years, and the APIs have been * documented as such. * * The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned * integer to hold the year, and can hold years as large as 65535. * * zlib, upon which libpng depends, is also Y2K compliant. It contains * no date-related code. * * Glenn Randers-Pehrson * libpng maintainer * PNG Development Group */ #ifndef PNG_H #define PNG_H /* This is not the place to learn how to use libpng. The file libpng.txt * describes how to use libpng, and the file example.c summarizes it * with some code on which to build. This file is useful for looking * at the actual function definitions and structure components. */ /* Version information for png.h - this should match the version in png.c */ #define PNG_LIBPNG_VER_STRING "1.2.5" #define PNG_LIBPNG_VER_SONUM 0 #define PNG_LIBPNG_VER_DLLNUM %DLLNUM% /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 2 #define PNG_LIBPNG_VER_RELEASE 5 /* This should match the numeric part of the final component of * PNG_LIBPNG_VER_STRING, omitting any leading zero: */ #define PNG_LIBPNG_VER_BUILD 0 #define PNG_LIBPNG_BUILD_ALPHA 1 #define PNG_LIBPNG_BUILD_BETA 2 #define PNG_LIBPNG_BUILD_RC 3 #define PNG_LIBPNG_BUILD_STABLE 4 #define PNG_LIBPNG_BUILD_TYPEMASK 7 #define PNG_LIBPNG_BUILD_PATCH 8 /* Can be OR'ed with STABLE only */ #define PNG_LIBPNG_BUILD_TYPE 4 /* Careful here. At one time, Guy wanted to use 082, but that would be octal. * We must not include leading zeros. * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only * version 1.0.0 was mis-numbered 100 instead of 10000). From * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */ #define PNG_LIBPNG_VER 10205 /* 1.2.5 */ #ifndef PNG_VERSION_INFO_ONLY /* include the compression library's header */ #include "zlib.h" /* include all user configurable info, including optional assembler routines */ #include "pngconf.h" /* Inhibit C++ name-mangling for libpng functions but not for system calls. */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* This file is arranged in several sections. The first section contains * structure and type definitions. The second section contains the external * library functions, while the third has the internal library functions, * which applications aren't expected to use directly. */ #ifndef PNG_NO_TYPECAST_NULL #define int_p_NULL (int *)NULL #define png_bytep_NULL (png_bytep)NULL #define png_bytepp_NULL (png_bytepp)NULL #define png_doublep_NULL (png_doublep)NULL #define png_error_ptr_NULL (png_error_ptr)NULL #define png_flush_ptr_NULL (png_flush_ptr)NULL #define png_free_ptr_NULL (png_free_ptr)NULL #define png_infopp_NULL (png_infopp)NULL #define png_malloc_ptr_NULL (png_malloc_ptr)NULL #define png_read_status_ptr_NULL (png_read_status_ptr)NULL #define png_rw_ptr_NULL (png_rw_ptr)NULL #define png_structp_NULL (png_structp)NULL #define png_uint_16p_NULL (png_uint_16p)NULL #define png_voidp_NULL (png_voidp)NULL #define png_write_status_ptr_NULL (png_write_status_ptr)NULL #else #define int_p_NULL NULL #define png_bytep_NULL NULL #define png_bytepp_NULL NULL #define png_doublep_NULL NULL #define png_error_ptr_NULL NULL #define png_flush_ptr_NULL NULL #define png_free_ptr_NULL NULL #define png_infopp_NULL NULL #define png_malloc_ptr_NULL NULL #define png_read_status_ptr_NULL NULL #define png_rw_ptr_NULL NULL #define png_structp_NULL NULL #define png_uint_16p_NULL NULL #define png_voidp_NULL NULL #define png_write_status_ptr_NULL NULL #endif /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) /* Version information for C files, stored in png.c. This had better match * the version above. */ #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (const char) png_libpng_ver[18]; /* need room for 99.99.99beta99z */ #else #define png_libpng_ver png_get_header_ver(NULL) #endif #ifdef PNG_USE_GLOBAL_ARRAYS /* This was removed in version 1.0.5c */ /* Structures to facilitate easy interlacing. See png.c for more details */ PNG_EXPORT_VAR (const int FARDATA) png_pass_start[7]; PNG_EXPORT_VAR (const int FARDATA) png_pass_inc[7]; PNG_EXPORT_VAR (const int FARDATA) png_pass_ystart[7]; PNG_EXPORT_VAR (const int FARDATA) png_pass_yinc[7]; PNG_EXPORT_VAR (const int FARDATA) png_pass_mask[7]; PNG_EXPORT_VAR (const int FARDATA) png_pass_dsp_mask[7]; #ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW PNG_EXPORT_VAR (const int FARDATA) png_pass_width[7]; #endif /* This isn't currently used. If you need it, see png.c for more details. PNG_EXPORT_VAR (const int FARDATA) png_pass_height[7]; */ #endif #endif /* PNG_NO_EXTERN */ /* Three color definitions. The order of the red, green, and blue, (and the * exact size) is not important, although the size of the fields need to * be png_byte or png_uint_16 (as defined below). */ typedef struct png_color_struct { png_byte red; png_byte green; png_byte blue; } png_color; typedef png_color FAR * png_colorp; typedef png_color FAR * FAR * png_colorpp; typedef struct png_color_16_struct { png_byte index; /* used for palette files */ png_uint_16 red; /* for use in red green blue files */ png_uint_16 green; png_uint_16 blue; png_uint_16 gray; /* for use in grayscale files */ } png_color_16; typedef png_color_16 FAR * png_color_16p; typedef png_color_16 FAR * FAR * png_color_16pp; typedef struct png_color_8_struct { png_byte red; /* for use in red green blue files */ png_byte green; png_byte blue; png_byte gray; /* for use in grayscale files */ png_byte alpha; /* for alpha channel files */ } png_color_8; typedef png_color_8 FAR * png_color_8p; typedef png_color_8 FAR * FAR * png_color_8pp; /* * The following two structures are used for the in-core representation * of sPLT chunks. */ typedef struct png_sPLT_entry_struct { png_uint_16 red; png_uint_16 green; png_uint_16 blue; png_uint_16 alpha; png_uint_16 frequency; } png_sPLT_entry; typedef png_sPLT_entry FAR * png_sPLT_entryp; typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp; /* When the depth of the sPLT palette is 8 bits, the color and alpha samples * occupy the LSB of their respective members, and the MSB of each member * is zero-filled. The frequency member always occupies the full 16 bits. */ typedef struct png_sPLT_struct { png_charp name; /* palette name */ png_byte depth; /* depth of palette samples */ png_sPLT_entryp entries; /* palette entries */ png_int_32 nentries; /* number of palette entries */ } png_sPLT_t; typedef png_sPLT_t FAR * png_sPLT_tp; typedef png_sPLT_t FAR * FAR * png_sPLT_tpp; #ifdef PNG_TEXT_SUPPORTED /* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file, * and whether that contents is compressed or not. The "key" field * points to a regular zero-terminated C string. The "text", "lang", and * "lang_key" fields can be regular C strings, empty strings, or NULL pointers. * However, the * structure returned by png_get_text() will always contain * regular zero-terminated C strings (possibly empty), never NULL pointers, * so they can be safely used in printf() and other string-handling functions. */ typedef struct png_text_struct { int compression; /* compression value: -1: tEXt, none 0: zTXt, deflate 1: iTXt, none 2: iTXt, deflate */ png_charp key; /* keyword, 1-79 character description of "text" */ png_charp text; /* comment, may be an empty string (ie "") or a NULL pointer */ png_size_t text_length; /* length of the text string */ #ifdef PNG_iTXt_SUPPORTED png_size_t itxt_length; /* length of the itxt string */ png_charp lang; /* language code, 0-79 characters or a NULL pointer */ png_charp lang_key; /* keyword translated UTF-8 string, 0 or more chars or a NULL pointer */ #endif } png_text; typedef png_text FAR * png_textp; typedef png_text FAR * FAR * png_textpp; #endif /* Supported compression types for text in PNG files (tEXt, and zTXt). * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */ #define PNG_TEXT_COMPRESSION_NONE_WR -3 #define PNG_TEXT_COMPRESSION_zTXt_WR -2 #define PNG_TEXT_COMPRESSION_NONE -1 #define PNG_TEXT_COMPRESSION_zTXt 0 #define PNG_ITXT_COMPRESSION_NONE 1 #define PNG_ITXT_COMPRESSION_zTXt 2 #define PNG_TEXT_COMPRESSION_LAST 3 /* Not a valid value */ /* png_time is a way to hold the time in an machine independent way. * Two conversions are provided, both from time_t and struct tm. There * is no portable way to convert to either of these structures, as far * as I know. If you know of a portable way, send it to me. As a side * note - PNG has always been Year 2000 compliant! */ typedef struct png_time_struct { png_uint_16 year; /* full year, as in, 1995 */ png_byte month; /* month of year, 1 - 12 */ png_byte day; /* day of month, 1 - 31 */ png_byte hour; /* hour of day, 0 - 23 */ png_byte minute; /* minute of hour, 0 - 59 */ png_byte second; /* second of minute, 0 - 60 (for leap seconds) */ } png_time; typedef png_time FAR * png_timep; typedef png_time FAR * FAR * png_timepp; #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* png_unknown_chunk is a structure to hold queued chunks for which there is * no specific support. The idea is that we can use this to queue * up private chunks for output even though the library doesn't actually * know about their semantics. */ typedef struct png_unknown_chunk_t { png_byte name[5]; png_byte *data; png_size_t size; /* libpng-using applications should NOT directly modify this byte. */ png_byte location; /* mode of operation at read time */ } png_unknown_chunk; typedef png_unknown_chunk FAR * png_unknown_chunkp; typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp; #endif /* png_info is a structure that holds the information in a PNG file so * that the application can find out the characteristics of the image. * If you are reading the file, this structure will tell you what is * in the PNG file. If you are writing the file, fill in the information * you want to put into the PNG file, then call png_write_info(). * The names chosen should be very close to the PNG specification, so * consult that document for information about the meaning of each field. * * With libpng < 0.95, it was only possible to directly set and read the * the values in the png_info_struct, which meant that the contents and * order of the values had to remain fixed. With libpng 0.95 and later, * however, there are now functions that abstract the contents of * png_info_struct from the application, so this makes it easier to use * libpng with dynamic libraries, and even makes it possible to use * libraries that don't have all of the libpng ancillary chunk-handing * functionality. * * In any case, the order of the parameters in png_info_struct should NOT * be changed for as long as possible to keep compatibility with applications * that use the old direct-access method with png_info_struct. * * The following members may have allocated storage attached that should be * cleaned up before the structure is discarded: palette, trans, text, * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these * are automatically freed when the info structure is deallocated, if they were * allocated internally by libpng. This behavior can be changed by means * of the png_data_freer() function. * * More allocation details: all the chunk-reading functions that * change these members go through the corresponding png_set_* * functions. A function to clear these members is available: see * png_free_data(). The png_set_* functions do not depend on being * able to point info structure members to any of the storage they are * passed (they make their own copies), EXCEPT that the png_set_text * functions use the same storage passed to them in the text_ptr or * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns * functions do not make their own copies. */ typedef struct png_info_struct { /* the following are necessary for every PNG file */ png_uint_32 width; /* width of image in pixels (from IHDR) */ png_uint_32 height; /* height of image in pixels (from IHDR) */ png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */ png_uint_32 rowbytes; /* bytes needed to hold an untransformed row */ png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */ png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */ png_uint_16 num_trans; /* number of transparent palette color (tRNS) */ png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */ png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */ /* The following three should have been named *_method not *_type */ png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */ png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */ png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ /* The following is informational only on read, and not used on writes. */ png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */ png_byte pixel_depth; /* number of bits per pixel */ png_byte spare_byte; /* to align the data, and for future use */ png_byte signature[8]; /* magic bytes read by libpng from start of file */ /* The rest of the data is optional. If you are reading, check the * valid field to see if the information in these are valid. If you * are writing, set the valid field to those chunks you want written, * and initialize the appropriate fields below. */ #if defined(PNG_gAMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) /* The gAMA chunk describes the gamma characteristics of the system * on which the image was created, normally in the range [1.0, 2.5]. * Data is valid if (valid & PNG_INFO_gAMA) is non-zero. */ float gamma; /* gamma value of image, if (valid & PNG_INFO_gAMA) */ #endif #if defined(PNG_sRGB_SUPPORTED) /* GR-P, 0.96a */ /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */ png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */ #endif #if defined(PNG_TEXT_SUPPORTED) /* The tEXt, and zTXt chunks contain human-readable textual data in * uncompressed, compressed, and optionally compressed forms, respectively. * The data in "text" is an array of pointers to uncompressed, * null-terminated C strings. Each chunk has a keyword that describes the * textual data contained in that chunk. Keywords are not required to be * unique, and the text string may be empty. Any number of text chunks may * be in an image. */ int num_text; /* number of comments read/to write */ int max_text; /* current size of text array */ png_textp text; /* array of comments read/to write */ #endif /* PNG_TEXT_SUPPORTED */ #if defined(PNG_tIME_SUPPORTED) /* The tIME chunk holds the last time the displayed image data was * modified. See the png_time struct for the contents of this struct. */ png_time mod_time; #endif #if defined(PNG_sBIT_SUPPORTED) /* The sBIT chunk specifies the number of significant high-order bits * in the pixel data. Values are in the range [1, bit_depth], and are * only specified for the channels in the pixel data. The contents of * the low-order bits is not specified. Data is valid if * (valid & PNG_INFO_sBIT) is non-zero. */ png_color_8 sig_bit; /* significant bits in color channels */ #endif #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ defined(PNG_READ_BACKGROUND_SUPPORTED) /* The tRNS chunk supplies transparency data for paletted images and * other image types that don't need a full alpha channel. There are * "num_trans" transparency values for a paletted image, stored in the * same order as the palette colors, starting from index 0. Values * for the data are in the range [0, 255], ranging from fully transparent * to fully opaque, respectively. For non-paletted images, there is a * single color specified that should be treated as fully transparent. * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. */ png_bytep trans; /* transparent values for paletted image */ png_color_16 trans_values; /* transparent color for non-palette image */ #endif #if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) /* The bKGD chunk gives the suggested image background color if the * display program does not have its own background color and the image * is needs to composited onto a background before display. The colors * in "background" are normally in the same color space/depth as the * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero. */ png_color_16 background; #endif #if defined(PNG_oFFs_SUPPORTED) /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards * and downwards from the top-left corner of the display, page, or other * application-specific co-ordinate space. See the PNG_OFFSET_ defines * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero. */ png_int_32 x_offset; /* x offset on page */ png_int_32 y_offset; /* y offset on page */ png_byte offset_unit_type; /* offset units type */ #endif #if defined(PNG_pHYs_SUPPORTED) /* The pHYs chunk gives the physical pixel density of the image for * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero. */ png_uint_32 x_pixels_per_unit; /* horizontal pixel density */ png_uint_32 y_pixels_per_unit; /* vertical pixel density */ png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */ #endif #if defined(PNG_hIST_SUPPORTED) /* The hIST chunk contains the relative frequency or importance of the * various palette entries, so that a viewer can intelligently select a * reduced-color palette, if required. Data is an array of "num_palette" * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) * is non-zero. */ png_uint_16p hist; #endif #ifdef PNG_cHRM_SUPPORTED /* The cHRM chunk describes the CIE color characteristics of the monitor * on which the PNG was created. This data allows the viewer to do gamut * mapping of the input image to ensure that the viewer sees the same * colors in the image as the creator. Values are in the range * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero. */ #ifdef PNG_FLOATING_POINT_SUPPORTED float x_white; float y_white; float x_red; float y_red; float x_green; float y_green; float x_blue; float y_blue; #endif #endif #if defined(PNG_pCAL_SUPPORTED) /* The pCAL chunk describes a transformation between the stored pixel * values and original physical data values used to create the image. * The integer range [0, 2^bit_depth - 1] maps to the floating-point * range given by [pcal_X0, pcal_X1], and are further transformed by a * (possibly non-linear) transformation function given by "pcal_type" * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ * defines below, and the PNG-Group's PNG extensions document for a * complete description of the transformations and how they should be * implemented, and for a description of the ASCII parameter strings. * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. */ png_charp pcal_purpose; /* pCAL chunk description string */ png_int_32 pcal_X0; /* minimum value */ png_int_32 pcal_X1; /* maximum value */ png_charp pcal_units; /* Latin-1 string giving physical units */ png_charpp pcal_params; /* ASCII strings containing parameter values */ png_byte pcal_type; /* equation type (see PNG_EQUATION_ below) */ png_byte pcal_nparams; /* number of parameters given in pcal_params */ #endif /* New members added in libpng-1.0.6 */ #ifdef PNG_FREE_ME_SUPPORTED png_uint_32 free_me; /* flags items libpng is responsible for freeing */ #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* storage for unknown chunks that the library doesn't recognize. */ png_unknown_chunkp unknown_chunks; png_size_t unknown_chunks_num; #endif #if defined(PNG_iCCP_SUPPORTED) /* iCCP chunk data. */ png_charp iccp_name; /* profile name */ png_charp iccp_profile; /* International Color Consortium profile data */ /* Note to maintainer: should be png_bytep */ png_uint_32 iccp_proflen; /* ICC profile data length */ png_byte iccp_compression; /* Always zero */ #endif #if defined(PNG_sPLT_SUPPORTED) /* data on sPLT chunks (there may be more than one). */ png_sPLT_tp splt_palettes; png_uint_32 splt_palettes_num; #endif #if defined(PNG_sCAL_SUPPORTED) /* The sCAL chunk describes the actual physical dimensions of the * subject matter of the graphic. The chunk contains a unit specification * a byte value, and two ASCII strings representing floating-point * values. The values are width and height corresponsing to one pixel * in the image. This external representation is converted to double * here. Data values are valid if (valid & PNG_INFO_sCAL) is non-zero. */ png_byte scal_unit; /* unit of physical scale */ #ifdef PNG_FLOATING_POINT_SUPPORTED double scal_pixel_width; /* width of one pixel */ double scal_pixel_height; /* height of one pixel */ #endif #ifdef PNG_FIXED_POINT_SUPPORTED png_charp scal_s_width; /* string containing height */ png_charp scal_s_height; /* string containing width */ #endif #endif #if defined(PNG_INFO_IMAGE_SUPPORTED) /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) non-zero */ /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ png_bytepp row_pointers; /* the image bits */ #endif #if defined(PNG_FIXED_POINT_SUPPORTED) && defined(PNG_gAMA_SUPPORTED) png_fixed_point int_gamma; /* gamma of image, if (valid & PNG_INFO_gAMA) */ #endif #if defined(PNG_cHRM_SUPPORTED) && defined(PNG_FIXED_POINT_SUPPORTED) png_fixed_point int_x_white; png_fixed_point int_y_white; png_fixed_point int_x_red; png_fixed_point int_y_red; png_fixed_point int_x_green; png_fixed_point int_y_green; png_fixed_point int_x_blue; png_fixed_point int_y_blue; #endif } png_info; typedef png_info FAR * png_infop; typedef png_info FAR * FAR * png_infopp; /* Maximum positive integer used in PNG is (2^31)-1 */ #define PNG_MAX_UINT ((png_uint_32)0x7fffffffL) /* These describe the color_type field in png_info. */ /* color type masks */ #define PNG_COLOR_MASK_PALETTE 1 #define PNG_COLOR_MASK_COLOR 2 #define PNG_COLOR_MASK_ALPHA 4 /* color types. Note that not all combinations are legal */ #define PNG_COLOR_TYPE_GRAY 0 #define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE) #define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR) #define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA) #define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA) /* aliases */ #define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA #define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA /* This is for compression type. PNG 1.0-1.2 only define the single type. */ #define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */ #define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE /* This is for filter type. PNG 1.0-1.2 only define the single type. */ #define PNG_FILTER_TYPE_BASE 0 /* Single row per-byte filtering */ #define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */ #define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE /* These are for the interlacing type. These values should NOT be changed. */ #define PNG_INTERLACE_NONE 0 /* Non-interlaced image */ #define PNG_INTERLACE_ADAM7 1 /* Adam7 interlacing */ #define PNG_INTERLACE_LAST 2 /* Not a valid value */ /* These are for the oFFs chunk. These values should NOT be changed. */ #define PNG_OFFSET_PIXEL 0 /* Offset in pixels */ #define PNG_OFFSET_MICROMETER 1 /* Offset in micrometers (1/10^6 meter) */ #define PNG_OFFSET_LAST 2 /* Not a valid value */ /* These are for the pCAL chunk. These values should NOT be changed. */ #define PNG_EQUATION_LINEAR 0 /* Linear transformation */ #define PNG_EQUATION_BASE_E 1 /* Exponential base e transform */ #define PNG_EQUATION_ARBITRARY 2 /* Arbitrary base exponential transform */ #define PNG_EQUATION_HYPERBOLIC 3 /* Hyperbolic sine transformation */ #define PNG_EQUATION_LAST 4 /* Not a valid value */ /* These are for the sCAL chunk. These values should NOT be changed. */ #define PNG_SCALE_UNKNOWN 0 /* unknown unit (image scale) */ #define PNG_SCALE_METER 1 /* meters per pixel */ #define PNG_SCALE_RADIAN 2 /* radians per pixel */ #define PNG_SCALE_LAST 3 /* Not a valid value */ /* These are for the pHYs chunk. These values should NOT be changed. */ #define PNG_RESOLUTION_UNKNOWN 0 /* pixels/unknown unit (aspect ratio) */ #define PNG_RESOLUTION_METER 1 /* pixels/meter */ #define PNG_RESOLUTION_LAST 2 /* Not a valid value */ /* These are for the sRGB chunk. These values should NOT be changed. */ #define PNG_sRGB_INTENT_PERCEPTUAL 0 #define PNG_sRGB_INTENT_RELATIVE 1 #define PNG_sRGB_INTENT_SATURATION 2 #define PNG_sRGB_INTENT_ABSOLUTE 3 #define PNG_sRGB_INTENT_LAST 4 /* Not a valid value */ /* This is for text chunks */ #define PNG_KEYWORD_MAX_LENGTH 79 /* Maximum number of entries in PLTE/sPLT/tRNS arrays */ #define PNG_MAX_PALETTE_LENGTH 256 /* These determine if an ancillary chunk's data has been successfully read * from the PNG header, or if the application has filled in the corresponding * data in the info_struct to be written into the output file. The values * of the PNG_INFO_ defines should NOT be changed. */ #define PNG_INFO_gAMA 0x0001 #define PNG_INFO_sBIT 0x0002 #define PNG_INFO_cHRM 0x0004 #define PNG_INFO_PLTE 0x0008 #define PNG_INFO_tRNS 0x0010 #define PNG_INFO_bKGD 0x0020 #define PNG_INFO_hIST 0x0040 #define PNG_INFO_pHYs 0x0080 #define PNG_INFO_oFFs 0x0100 #define PNG_INFO_tIME 0x0200 #define PNG_INFO_pCAL 0x0400 #define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ #define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ #define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ #define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ #define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ /* This is used for the transformation routines, as some of them * change these values for the row. It also should enable using * the routines for other purposes. */ typedef struct png_row_info_struct { png_uint_32 width; /* width of row */ png_uint_32 rowbytes; /* number of bytes in row */ png_byte color_type; /* color type of row */ png_byte bit_depth; /* bit depth of row */ png_byte channels; /* number of channels (1, 2, 3, or 4) */ png_byte pixel_depth; /* bits per pixel (depth * channels) */ } png_row_info; typedef png_row_info FAR * png_row_infop; typedef png_row_info FAR * FAR * png_row_infopp; /* These are the function types for the I/O functions and for the functions * that allow the user to override the default I/O functions with his or her * own. The png_error_ptr type should match that of user-supplied warning * and error functions, while the png_rw_ptr type should match that of the * user read/write data functions. */ typedef struct png_struct_def png_struct; typedef png_struct FAR * png_structp; typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, int)); typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, int)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, png_uint_32, int)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, png_row_infop, png_bytep)); #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); #endif /* Transform masks for the high-level interface */ #define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ #define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ #define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ #define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ #define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ #define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ #define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ #define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ #define PNG_TRANSFORM_BGR 0x0080 /* read and write */ #define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ #define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ #define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ #define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only */ /* Flags for MNG supported features */ #define PNG_FLAG_MNG_EMPTY_PLTE 0x01 #define PNG_FLAG_MNG_FILTER_64 0x04 #define PNG_ALL_MNG_FEATURES 0x05 typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); /* The structure that holds the information to read and write PNG files. * The only people who need to care about what is inside of this are the * people who will be modifying the library for their own special needs. * It should NOT be accessed directly by an application, except to store * the jmp_buf. */ struct png_struct_def { #ifdef PNG_SETJMP_SUPPORTED jmp_buf jmpbuf; /* used in png_error */ #endif png_error_ptr error_fn; /* function for printing errors and aborting */ png_error_ptr warning_fn; /* function for printing warnings */ png_voidp error_ptr; /* user supplied struct for error functions */ png_rw_ptr write_data_fn; /* function for writing output data */ png_rw_ptr read_data_fn; /* function for reading input data */ png_voidp io_ptr; /* ptr to application struct for I/O functions */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr read_user_transform_fn; /* user read transform */ #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_user_transform_ptr write_user_transform_fn; /* user write transform */ #endif /* These were added in libpng-1.0.2 */ #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) png_voidp user_transform_ptr; /* user supplied struct for user transform */ png_byte user_transform_depth; /* bit depth of user transformed pixels */ png_byte user_transform_channels; /* channels in user transformed pixels */ #endif #endif png_uint_32 mode; /* tells us where we are in the PNG file */ png_uint_32 flags; /* flags indicating various things to libpng */ png_uint_32 transformations; /* which transformations to perform */ z_stream zstream; /* pointer to decompression structure (below) */ png_bytep zbuf; /* buffer for zlib */ png_size_t zbuf_size; /* size of zbuf */ int zlib_level; /* holds zlib compression level */ int zlib_method; /* holds zlib compression method */ int zlib_window_bits; /* holds zlib compression window bits */ int zlib_mem_level; /* holds zlib compression memory level */ int zlib_strategy; /* holds zlib compression strategy */ png_uint_32 width; /* width of image in pixels */ png_uint_32 height; /* height of image in pixels */ png_uint_32 num_rows; /* number of rows in current pass */ png_uint_32 usr_width; /* width of row at start of write */ png_uint_32 rowbytes; /* size of row in bytes */ png_uint_32 irowbytes; /* size of current interlaced row in bytes */ png_uint_32 iwidth; /* width of current interlaced row in pixels */ png_uint_32 row_number; /* current row in interlace pass */ png_bytep prev_row; /* buffer to save previous (unfiltered) row */ png_bytep row_buf; /* buffer to save current (unfiltered) row */ png_bytep sub_row; /* buffer to save "sub" row when filtering */ png_bytep up_row; /* buffer to save "up" row when filtering */ png_bytep avg_row; /* buffer to save "avg" row when filtering */ png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ png_row_info row_info; /* used for transformation routines */ png_uint_32 idat_size; /* current IDAT size for read */ png_uint_32 crc; /* current chunk CRC value */ png_colorp palette; /* palette from the input file */ png_uint_16 num_palette; /* number of color entries in palette */ png_uint_16 num_trans; /* number of transparency values */ png_byte chunk_name[5]; /* null-terminated name of current chunk */ png_byte compression; /* file compression type (always 0) */ png_byte filter; /* file filter type (always 0) */ png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ png_byte pass; /* current interlace pass (0 - 6) */ png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ png_byte color_type; /* color type of file */ png_byte bit_depth; /* bit depth of file */ png_byte usr_bit_depth; /* bit depth of users row */ png_byte pixel_depth; /* number of bits per pixel */ png_byte channels; /* number of channels in file */ png_byte usr_channels; /* channels at start of write */ png_byte sig_bytes; /* magic bytes read/written from start of file */ #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) #ifdef PNG_LEGACY_SUPPORTED png_byte filler; /* filler byte for pixel expansion */ #else png_uint_16 filler; /* filler bytes for pixel expansion */ #endif #endif #if defined(PNG_bKGD_SUPPORTED) png_byte background_gamma_type; # ifdef PNG_FLOATING_POINT_SUPPORTED float background_gamma; # endif png_color_16 background; /* background color in screen gamma space */ #if defined(PNG_READ_GAMMA_SUPPORTED) png_color_16 background_1; /* background normalized to gamma 1.0 */ #endif #endif /* PNG_bKGD_SUPPORTED */ #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_flush_ptr output_flush_fn;/* Function for flushing output */ png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ png_uint_32 flush_rows; /* number of rows written since last flush */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ #ifdef PNG_FLOATING_POINT_SUPPORTED float gamma; /* file gamma value */ float screen_gamma; /* screen gamma value (display_exponent) */ #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep gamma_table; /* gamma table for 8-bit depth files */ png_bytep gamma_from_1; /* converts from 1.0 to screen */ png_bytep gamma_to_1; /* converts from file to 1.0 */ png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ #endif #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) png_color_8 sig_bit; /* significant bits in each available channel */ #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) png_color_8 shift; /* shift for significant bit tranformation */ #endif #if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_bytep trans; /* transparency values for paletted files */ png_color_16 trans_values; /* transparency values for non-paletted files */ #endif png_read_status_ptr read_row_fn; /* called after each row is decoded */ png_write_status_ptr write_row_fn; /* called after each row is encoded */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED png_progressive_info_ptr info_fn; /* called after header data fully read */ png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ png_progressive_end_ptr end_fn; /* called after image is complete */ png_bytep save_buffer_ptr; /* current location in save_buffer */ png_bytep save_buffer; /* buffer for previously read data */ png_bytep current_buffer_ptr; /* current location in current_buffer */ png_bytep current_buffer; /* buffer for recently used data */ png_uint_32 push_length; /* size of current input chunk */ png_uint_32 skip_length; /* bytes to skip in input data */ png_size_t save_buffer_size; /* amount of data now in save_buffer */ png_size_t save_buffer_max; /* total size of save_buffer */ png_size_t buffer_size; /* total amount of available input data */ png_size_t current_buffer_size; /* amount of data now in current_buffer */ int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ # if defined(PNG_TEXT_SUPPORTED) png_size_t current_text_size; /* current size of text input data */ png_size_t current_text_left; /* how much text left to read in input */ png_charp current_text; /* current text chunk buffer */ png_charp current_text_ptr; /* current location in current_text */ # endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */ #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) /* for the Borland special 64K segment handler */ png_bytepp offset_table_ptr; png_bytep offset_table; png_uint_16 offset_table_number; png_uint_16 offset_table_count; png_uint_16 offset_table_count_free; #endif #if defined(PNG_READ_DITHER_SUPPORTED) png_bytep palette_lookup; /* lookup table for dithering */ png_bytep dither_index; /* index translation for palette files */ #endif #if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) png_uint_16p hist; /* histogram */ #endif #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_byte heuristic_method; /* heuristic for row filter selection */ png_byte num_prev_filters; /* number of weights for previous rows */ png_bytep prev_filters; /* filter type(s) of previous row(s) */ png_uint_16p filter_weights; /* weight(s) for previous line(s) */ png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ png_uint_16p filter_costs; /* relative filter calculation cost */ png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) png_charp time_buffer; /* String to hold RFC 1123 time text */ #endif /* New members added in libpng-1.0.6 */ #ifdef PNG_FREE_ME_SUPPORTED png_uint_32 free_me; /* flags items libpng is responsible for freeing */ #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) png_voidp user_chunk_ptr; png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) int num_chunk_list; png_bytep chunk_list; #endif /* New members added in libpng-1.0.3 */ #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) png_byte rgb_to_gray_status; /* These were changed from png_byte in libpng-1.0.6 */ png_uint_16 rgb_to_gray_red_coeff; png_uint_16 rgb_to_gray_green_coeff; png_uint_16 rgb_to_gray_blue_coeff; #endif /* New member added in libpng-1.0.4 (renamed in 1.0.9) */ #if defined(PNG_MNG_FEATURES_SUPPORTED) || \ defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* changed from png_byte to png_uint_32 at version 1.2.0 */ #ifdef PNG_1_0_X png_byte mng_features_permitted; #else png_uint_32 mng_features_permitted; #endif /* PNG_1_0_X */ #endif /* New member added in libpng-1.0.7 */ #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) png_fixed_point int_gamma; #endif /* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ #if defined(PNG_MNG_FEATURES_SUPPORTED) png_byte filter_type; #endif #if defined(PNG_1_0_X) || (defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD)) /* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ png_uint_32 row_buf_size; #endif /* New members added in libpng-1.2.0 */ #if !defined(PNG_1_0_X) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) png_byte mmx_bitdepth_threshold; png_uint_32 mmx_rowbytes_threshold; png_uint_32 asm_flags; #endif /* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ #ifdef PNG_USER_MEM_SUPPORTED png_voidp mem_ptr; /* user supplied struct for mem functions */ png_malloc_ptr malloc_fn; /* function for allocating memory */ png_free_ptr free_fn; /* function for freeing memory */ #endif /* New member added in libpng-1.0.13 and 1.2.0 */ png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ #if defined(PNG_READ_DITHER_SUPPORTED) /* The following three members were added at version 1.0.14 and 1.2.4 */ png_bytep dither_sort; /* working sort array */ png_bytep index_to_palette; /* where the original index currently is */ /* in the palette */ png_bytep palette_to_index; /* which original index points to this */ /* palette color */ #endif }; /* This prevents a compiler error in png.c if png.c and png.h are both at version 1.2.5 */ typedef png_structp version_1_2_5; typedef png_struct FAR * FAR * png_structpp; /* Here are the function definitions most commonly used. This is not * the place to find out how to use libpng. See libpng.txt for the * full explanation, see example.c for the summary. This just provides * a simple one line description of the use of each function. */ /* Returns the version number of the library */ extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); /* Tell lib we have already handled the first magic bytes. * Handling more than 8 bytes from the beginning of the file is an error. */ extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, int num_bytes)); /* Check sig[start] through sig[start + num_to_check - 1] to see if it's a * PNG file. Returns zero if the supplied bytes match the 8-byte PNG * signature, and non-zero otherwise. Having num_to_check == 0 or * start > 7 will always fail (ie return non-zero). */ extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, png_size_t num_to_check)); /* Simple signature checking function. This is the same as calling * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). */ extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); /* Allocate and initialize png_ptr struct for reading, and any other memory. */ extern PNG_EXPORT(png_structp,png_create_read_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); /* Allocate and initialize png_ptr struct for writing, and any other memory */ extern PNG_EXPORT(png_structp,png_create_write_struct) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn)); extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_compression_buffer_size) PNGARG((png_structp png_ptr, png_uint_32 size)); /* Reset the compression stream */ extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); /* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_structp,png_create_read_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); extern PNG_EXPORT(png_structp,png_create_write_struct_2) PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); #endif /* Write a PNG chunk - size, type, (optional) data, CRC. */ extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_bytep data, png_size_t length)); /* Write the start of a PNG chunk - length and chunk name. */ extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, png_bytep chunk_name, png_uint_32 length)); /* Write the data of a PNG chunk started with png_write_chunk_start(). */ extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Finish a chunk started with png_write_chunk_start() (includes CRC). */ extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); /* Allocate and initialize the info structure */ extern PNG_EXPORT(png_infop,png_create_info_struct) PNGARG((png_structp png_ptr)); /* Initialize the info structure (old interface - DEPRECATED) */ extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); #undef png_info_init #define png_info_init(info_ptr) png_info_init_3(&info_ptr, sizeof(png_info)); extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, png_size_t png_info_struct_size)); /* Writes all the PNG information before the image. */ extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* read the information before the actual image data. */ extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_TIME_RFC1123_SUPPORTED) extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) PNGARG((png_structp png_ptr, png_timep ptime)); #endif #if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ #if defined(PNG_WRITE_tIME_SUPPORTED) /* convert from a struct tm to png_time */ extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, struct tm FAR * ttime)); /* convert from time_t to png_time. Uses gmtime() */ extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, time_t ttime)); #endif /* PNG_WRITE_tIME_SUPPORTED */ #endif /* _WIN32_WCE */ #if defined(PNG_READ_EXPAND_SUPPORTED) /* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* Use blue, green, red order for pixels. */ extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) /* Expand the grayscale to 24-bit RGB if necessary. */ extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) /* Reduce RGB to grayscale. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, int error_action, double red, double green )); #endif extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, int error_action, png_fixed_point red, png_fixed_point green )); extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp png_ptr)); #endif extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, png_colorp palette)); #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) /* Add a filler byte to 24-bit RGB images. */ extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, png_uint_32 filler, int flags)); /* The values of the PNG_FILLER_ defines should NOT be changed */ #define PNG_FILLER_BEFORE 0 #define PNG_FILLER_AFTER 1 #endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* Swap bytes in 16-bit depth files. */ extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) /* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) /* Swap packing order of pixels in bytes. */ extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) /* Converts files to legal bit depths. */ extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, png_color_8p true_bits)); #endif #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ defined(PNG_WRITE_INTERLACING_SUPPORTED) /* Have the code handle the interlacing. Returns the number of passes. */ extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) /* Invert monochrome files */ extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) /* Handle alpha and tRNS by replacing with a background color. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, png_color_16p background_color, int background_gamma_code, int need_expand, double background_gamma)); #endif #define PNG_BACKGROUND_GAMMA_UNKNOWN 0 #define PNG_BACKGROUND_GAMMA_SCREEN 1 #define PNG_BACKGROUND_GAMMA_FILE 2 #define PNG_BACKGROUND_GAMMA_UNIQUE 3 #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) /* strip the second byte of information from a 16-bit depth file. */ extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) /* Turn on dithering, and reduce the palette to the number of colors available. */ extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, png_colorp palette, int num_palette, int maximum_colors, png_uint_16p histogram, int full_dither)); #endif #if defined(PNG_READ_GAMMA_SUPPORTED) /* Handle gamma correction. Screen_gamma=(display_exponent) */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, double screen_gamma, double default_file_gamma)); #endif #endif #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) /* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ /* Deprecated and will be removed. Use png_permit_mng_features() instead. */ extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, int empty_plte_permitted)); #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) /* Set how many lines between output flushes - 0 for no flushing */ extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); /* Flush the current PNG output buffer */ extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); #endif /* optional update palette with requested transformations */ extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* read one or more rows of image data. */ extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); /* read a row of data. */ extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, png_bytep row, png_bytep display_row)); /* read the whole image into memory at once. */ extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, png_bytepp image)); /* write a row of image data */ extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, png_bytep row)); /* write a few rows of image data */ extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, png_bytepp row, png_uint_32 num_rows)); /* write the image data */ extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, png_bytepp image)); /* writes the end of the PNG file. */ extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* read the end of the PNG file. */ extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* free any memory associated with the png_info_struct */ extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, png_infopp info_ptr_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); /* free all memory used by the read (old method - NOT DLL EXPORTED) */ extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)); /* free any memory associated with the png_struct and the png_info_structs */ extern PNG_EXPORT(void,png_destroy_write_struct) PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); /* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ extern void png_write_destroy PNGARG((png_structp png_ptr)); /* set the libpng method of handling chunk CRC errors */ extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, int crit_action, int ancil_action)); /* Values for png_set_crc_action() to say how to handle CRC errors in * ancillary and critical chunks, and whether to use the data contained * therein. Note that it is impossible to "discard" data in a critical * chunk. For versions prior to 0.90, the action was always error/quit, * whereas in version 0.90 and later, the action for CRC errors in ancillary * chunks is warn/discard. These values should NOT be changed. * * value action:critical action:ancillary */ #define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ #define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ #define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ #define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ #define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ #define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ /* These functions give the user control over the scan-line filtering in * libpng and the compression methods used by zlib. These functions are * mainly useful for testing, as the defaults should work with most users. * Those users who are tight on memory or want faster performance at the * expense of compression can modify them. See the compression library * header file (zlib.h) for an explination of the compression functions. */ /* set the filtering method(s) used by libpng. Currently, the only valid * value for "method" is 0. */ extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, int filters)); /* Flags for png_set_filter() to say which filters to use. The flags * are chosen so that they don't conflict with real filter types * below, in case they are supplied instead of the #defined constants. * These values should NOT be changed. */ #define PNG_NO_FILTERS 0x00 #define PNG_FILTER_NONE 0x08 #define PNG_FILTER_SUB 0x10 #define PNG_FILTER_UP 0x20 #define PNG_FILTER_AVG 0x40 #define PNG_FILTER_PAETH 0x80 #define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ PNG_FILTER_AVG | PNG_FILTER_PAETH) /* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. * These defines should NOT be changed. */ #define PNG_FILTER_VALUE_NONE 0 #define PNG_FILTER_VALUE_SUB 1 #define PNG_FILTER_VALUE_UP 2 #define PNG_FILTER_VALUE_AVG 3 #define PNG_FILTER_VALUE_PAETH 4 #define PNG_FILTER_VALUE_LAST 5 #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ /* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ * defines, either the default (minimum-sum-of-absolute-differences), or * the experimental method (weighted-minimum-sum-of-absolute-differences). * * Weights are factors >= 1.0, indicating how important it is to keep the * filter type consistent between rows. Larger numbers mean the current * filter is that many times as likely to be the same as the "num_weights" * previous filters. This is cumulative for each previous row with a weight. * There needs to be "num_weights" values in "filter_weights", or it can be * NULL if the weights aren't being specified. Weights have no influence on * the selection of the first row filter. Well chosen weights can (in theory) * improve the compression for a given image. * * Costs are factors >= 1.0 indicating the relative decoding costs of a * filter type. Higher costs indicate more decoding expense, and are * therefore less likely to be selected over a filter with lower computational * costs. There needs to be a value in "filter_costs" for each valid filter * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't * setting the costs. Costs try to improve the speed of decompression without * unduly increasing the compressed image size. * * A negative weight or cost indicates the default value is to be used, and * values in the range [0.0, 1.0) indicate the value is to remain unchanged. * The default values for both weights and costs are currently 1.0, but may * change if good general weighting/cost heuristics can be found. If both * the weights and costs are set to 1.0, this degenerates the WEIGHTED method * to the UNWEIGHTED method, but with added encoding time/computation. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, int heuristic_method, int num_weights, png_doublep filter_weights, png_doublep filter_costs)); #endif #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ /* Heuristic used for row filter selection. These defines should NOT be * changed. */ #define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ #define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ #define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ #define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ /* Set the library compression level. Currently, valid values range from * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 * (0 - no compression, 9 - "maximal" compression). Note that tests have * shown that zlib compression levels 3-6 usually perform as well as level 9 * for PNG images, and do considerably fewer caclulations. In the future, * these values may not correspond directly to the zlib compression levels. */ extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, int level)); extern PNG_EXPORT(void,png_set_compression_mem_level) PNGARG((png_structp png_ptr, int mem_level)); extern PNG_EXPORT(void,png_set_compression_strategy) PNGARG((png_structp png_ptr, int strategy)); extern PNG_EXPORT(void,png_set_compression_window_bits) PNGARG((png_structp png_ptr, int window_bits)); extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, int method)); /* These next functions are called for input/output, memory, and error * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, * and call standard C I/O routines such as fread(), fwrite(), and * fprintf(). These functions can be made to use other I/O routines * at run time for those applications that need to handle I/O in a * different manner by calling png_set_???_fn(). See libpng.txt for * more information. */ #if !defined(PNG_NO_STDIO) /* Initialize the input/output for the PNG file to the default functions. */ extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); #endif /* Replace the (error and abort), and warning functions with user * supplied functions. If no messages are to be printed you must still * write and use replacement functions. The replacement error_fn should * still do a longjmp to the last setjmp location if you are using this * method of error handling. If error_fn or warning_fn is NULL, the * default function will be used. */ extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); /* Return the user pointer associated with the error functions */ extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); /* Replace the default data output functions with a user supplied one(s). * If buffered output is not used, then output_flush_fn can be set to NULL. * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time * output_flush_fn will be ignored (and thus can be NULL). */ extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); /* Replace the default data input function with a user supplied one. */ extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn)); /* Return the user pointer associated with the I/O functions */ extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, png_read_status_ptr read_row_fn)); extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, png_write_status_ptr write_row_fn)); #ifdef PNG_USER_MEM_SUPPORTED /* Replace the default memory allocation functions with user supplied one(s). */ extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); /* Return the user pointer associated with the memory functions */ extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr read_user_transform_fn)); #endif #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp png_ptr, png_user_transform_ptr write_user_transform_fn)); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp png_ptr, png_voidp user_transform_ptr, int user_transform_depth, int user_transform_channels)); /* Return the user pointer associated with the user transform functions */ extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_USER_CHUNKS_SUPPORTED extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp png_ptr)); #endif #ifdef PNG_PROGRESSIVE_READ_SUPPORTED /* Sets the function callbacks for the push reader, and a pointer to a * user-defined structure available to the callback functions. */ extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, png_voidp progressive_ptr, png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); /* returns the user pointer associated with the push read functions */ extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) PNGARG((png_structp png_ptr)); /* function to be called when data becomes available */ extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); /* function that combines rows. Not very much different than the * png_combine_row() call. Is this even used????? */ extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, png_bytep old_row, png_bytep new_row)); #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, png_uint_32 size)); #if defined(PNG_1_0_X) # define png_malloc_warn png_malloc #else /* Added at libpng version 1.2.4 */ extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, png_uint_32 size)); #endif /* frees a pointer allocated by png_malloc() */ extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); #if defined(PNG_1_0_X) /* Function to allocate memory for zlib. */ extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); #endif /* Free data that was allocated internally */ extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 free_me, int num)); #ifdef PNG_FREE_ME_SUPPORTED /* Reassign responsibility for freeing existing data, whether allocated * by libpng or by the application */ extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, png_infop info_ptr, int freer, png_uint_32 mask)); #endif /* assignments for png_data_freer */ #define PNG_DESTROY_WILL_FREE_DATA 1 #define PNG_SET_WILL_FREE_DATA 1 #define PNG_USER_WILL_FREE_DATA 2 /* Flags for png_ptr->free_me and info_ptr->free_me */ #define PNG_FREE_HIST 0x0008 #define PNG_FREE_ICCP 0x0010 #define PNG_FREE_SPLT 0x0020 #define PNG_FREE_ROWS 0x0040 #define PNG_FREE_PCAL 0x0080 #define PNG_FREE_SCAL 0x0100 #define PNG_FREE_UNKN 0x0200 #define PNG_FREE_LIST 0x0400 #define PNG_FREE_PLTE 0x1000 #define PNG_FREE_TRNS 0x2000 #define PNG_FREE_TEXT 0x4000 #define PNG_FREE_ALL 0x7fff #define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ #ifdef PNG_USER_MEM_SUPPORTED extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, png_uint_32 size)); extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, png_voidp ptr)); #endif extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, png_voidp s1, png_voidp s2, png_uint_32 size)); extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, png_voidp s1, int value, png_uint_32 size)); #if defined(USE_FAR_KEYWORD) /* memory model conversion function */ extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, int check)); #endif /* USE_FAR_KEYWORD */ /* Fatal error in PNG image of libpng - can't continue */ extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); /* The same, but the chunk name is prepended to the error string. */ extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, png_const_charp error_message)); /* Non-fatal error in libpng. Can continue, but may have a problem. */ extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); /* Non-fatal error in libpng, chunk name is prepended to message. */ extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, png_const_charp warning_message)); /* The png_set_ functions are for storing values in the png_info_struct. * Similarly, the png_get_ calls are used to read values from the * png_info_struct, either storing the parameters in the passed variables, or * setting pointers into the png_info_struct where the data is stored. The * png_get_ functions return a non-zero value if the data was available * in info_ptr, or return zero and do not change any of the parameters if the * data was not available. * * These functions should be used instead of directly accessing png_info * to avoid problems with future changes in the size and internal layout of * png_info_struct. */ /* Returns "flag" if chunk data is valid in info_ptr. */ extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)); /* Returns number of bytes needed to hold a transformed row. */ extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* Returns row_pointers, which is an array of pointers to scanlines that was returned from png_read_png(). */ extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Set row_pointers, which is an array of pointers to scanlines for use by png_write_png(). */ extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)); #endif /* Returns number of color channels in image. */ extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifdef PNG_EASY_ACCESS_SUPPORTED /* Returns image width in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image height in pixels. */ extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image bit_depth. */ extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image color_type. */ extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image filter_type. */ extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image interlace_type. */ extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image compression_type. */ extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns image resolution in pixels per meter, from pHYs chunk data. */ extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp png_ptr, png_infop info_ptr)); /* Returns pixel aspect ratio, computed from pHYs chunk data. */ #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif /* PNG_EASY_ACCESS_SUPPORTED */ /* Returns pointer to signature string read from PNG header */ extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, png_infop info_ptr)); #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p *background)); #endif #if defined(PNG_bKGD_SUPPORTED) extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_16p background)); #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double *white_x, double *white_y, double *red_x, double *red_y, double *green_x, double *green_y, double *blue_x, double *blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)); #endif #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double *file_gamma)); #endif extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_file_gamma)); #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, png_infop info_ptr, double file_gamma)); #endif extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, png_infop info_ptr, png_fixed_point int_file_gamma)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)); #endif #if defined(PNG_hIST_SUPPORTED) extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)); #endif extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method)); extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_method, int compression_method, int filter_method)); #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)); #endif #if defined(PNG_oFFs_SUPPORTED) extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, int unit_type)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, png_charp *units, png_charpp *params)); #endif #if defined(PNG_pCAL_SUPPORTED) extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); #endif #if defined(PNG_pHYs_SUPPORTED) extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); #endif extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette)); extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, png_infop info_ptr, png_colorp palette, int num_palette)); #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)); #endif #if defined(PNG_sBIT_SUPPORTED) extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_color_8p sig_bit)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int *intent)); #endif #if defined(PNG_sRGB_SUPPORTED) extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, png_infop info_ptr, int intent)); #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charpp name, int *compression_type, png_charpp profile, png_uint_32 *proflen)); /* Note to maintainer: profile should be png_bytepp */ #endif #if defined(PNG_iCCP_SUPPORTED) extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, png_infop info_ptr, png_charp name, int compression_type, png_charp profile, png_uint_32 proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tpp entries)); #endif #if defined(PNG_sPLT_SUPPORTED) extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, png_infop info_ptr, png_sPLT_tp entries, int nentries)); #endif #if defined(PNG_TEXT_SUPPORTED) /* png_get_text also returns the number of text chunks in *num_text */ extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, int *num_text)); #endif /* * Note while png_set_text() will accept a structure whose text, * language, and translated keywords are NULL pointers, the structure * returned by png_get_text will always contain regular * zero-terminated C strings. They might be empty strings but * they will never be NULL pointers. */ #if defined(PNG_TEXT_SUPPORTED) extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)); #endif #if defined(PNG_tIME_SUPPORTED) extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, png_infop info_ptr, png_timep mod_time)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, png_infop info_ptr, png_bytep trans, int num_trans, png_color_16p trans_values)); #endif #if defined(PNG_tRNS_SUPPORTED) #endif #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, double *width, double *height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); #endif #endif #endif /* PNG_sCAL_SUPPORTED */ #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, double width, double height)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); #endif #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) /* provide a list of chunks and how they are to be handled, if the built-in handling or default unknown chunk handling is not desired. Any chunks not listed will be handled in the default manner. The IHDR and IEND chunks must not be listed. keep = 0: follow default behavour = 1: do not keep = 2: keep only if safe-to-copy = 3: keep even if unsafe-to-copy */ extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp png_ptr, int keep, png_bytep chunk_list, int num_chunks)); extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); extern PNG_EXPORT(void, png_set_unknown_chunk_location) PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); #endif #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep chunk_name)); #endif /* Png_free_data() will turn off the "valid" flag for anything it frees. If you need to turn it off for a chunk that your application has freed, you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, png_infop info_ptr, int mask)); #if defined(PNG_INFO_IMAGE_SUPPORTED) /* The "params" pointer is currently not used and is for future expansion. */ extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, png_infop info_ptr, int transforms, png_voidp params)); #endif /* Define PNG_DEBUG at compile time for debugging information. Higher * numbers for PNG_DEBUG mean more debugging information. This has * only been added since version 0.95 so it is not implemented throughout * libpng yet, but more support will be added as needed. */ #ifdef PNG_DEBUG #if (PNG_DEBUG > 0) #if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) #include #if (PNG_DEBUG > 1) #define png_debug(l,m) _RPT0(_CRT_WARN,m) #define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m,p1) #define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2) #endif #else /* PNG_DEBUG_FILE || !_MSC_VER */ #ifndef PNG_DEBUG_FILE #define PNG_DEBUG_FILE stderr #endif /* PNG_DEBUG_FILE */ #if (PNG_DEBUG > 1) #define png_debug(l,m) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ } #define png_debug1(l,m,p1) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ } #define png_debug2(l,m,p1,p2) \ { \ int num_tabs=l; \ fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ } #endif /* (PNG_DEBUG > 1) */ #endif /* _MSC_VER */ #endif /* (PNG_DEBUG > 0) */ #endif /* PNG_DEBUG */ #ifndef png_debug #define png_debug(l, m) #endif #ifndef png_debug1 #define png_debug1(l, m, p1) #endif #ifndef png_debug2 #define png_debug2(l, m, p1, p2) #endif extern PNG_EXPORT(png_bytep,png_sig_bytes) PNGARG((void)); extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); #ifdef PNG_MNG_FEATURES_SUPPORTED extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp png_ptr, png_uint_32 mng_features_permitted)); #endif /* Added to version 1.2.0 */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ #define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ #define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 #define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 #define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 #define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 #define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 #define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 #define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ #define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ | PNG_ASM_FLAG_MMX_READ_INTERLACE \ | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) #define PNG_MMX_WRITE_FLAGS ( 0 ) #define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ | PNG_MMX_READ_FLAGS \ | PNG_MMX_WRITE_FLAGS ) #define PNG_SELECT_READ 1 #define PNG_SELECT_WRITE 2 #if !defined(PNG_1_0_X) /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) PNGARG((int flag_select, int *compilerID)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) PNGARG((int flag_select)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_asm_flags) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) PNGARG((png_structp png_ptr)); /* pngget.c */ extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) PNGARG((png_structp png_ptr)); /* pngset.c */ extern PNG_EXPORT(void,png_set_asm_flags) PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); /* pngset.c */ extern PNG_EXPORT(void,png_set_mmx_thresholds) PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, png_uint_32 mmx_rowbytes_threshold)); #endif /* PNG_1_0_X */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ #if !defined(PNG_1_0_X) /* png.c, pnggccrd.c, or pngvcrd.c */ extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); /* Strip the prepended error numbers ("#nnn ") from error and warning * messages before passing them to the error or warning handler. */ #ifdef PNG_ERROR_NUMBERS_SUPPORTED extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp png_ptr, png_uint_32 strip_mode)); #endif #endif /* PNG_1_0_X */ /* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ #define PNG_HEADER_VERSION_STRING \ " libpng version 1.2.5 - October 3, 2002 (header)\n" #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED /* With these routines we avoid an integer divide, which will be slower on * most machines. However, it does take more operations than the corresponding * divide method, so it may be slower on a few RISC systems. There are two * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. * * Note that the rounding factors are NOT supposed to be the same! 128 and * 32768 are correct for the NODIV code; 127 and 32767 are correct for the * standard method. * * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] */ /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ # define png_composite(composite, fg, alpha, bg) \ { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ + (png_uint_16)(bg)*(png_uint_16)(255 - \ (png_uint_16)(alpha)) + (png_uint_16)128); \ (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } # define png_composite_16(composite, fg, alpha, bg) \ { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ + (png_uint_32)(bg)*(png_uint_32)(65535L - \ (png_uint_32)(alpha)) + (png_uint_32)32768L); \ (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } #else /* standard method using integer division */ # define png_composite(composite, fg, alpha, bg) \ (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ (png_uint_16)127) / 255) # define png_composite_16(composite, fg, alpha, bg) \ (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ (png_uint_32)32767) / (png_uint_32)65535L) #endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ /* These next functions are used internally in the code. They generally * shouldn't be used unless you are writing code to add or replace some * functionality in libpng. More information about most functions can * be found in the files where the functions are located. */ #if defined(PNG_INTERNAL) /* Various modes of operation. Note that after an init, mode is set to * zero automatically when the structure is created. */ #define PNG_HAVE_IHDR 0x01 #define PNG_HAVE_PLTE 0x02 #define PNG_HAVE_IDAT 0x04 #define PNG_AFTER_IDAT 0x08 #define PNG_HAVE_IEND 0x10 #define PNG_HAVE_gAMA 0x20 #define PNG_HAVE_cHRM 0x40 #define PNG_HAVE_sRGB 0x80 #define PNG_HAVE_CHUNK_HEADER 0x100 #define PNG_WROTE_tIME 0x200 #define PNG_WROTE_INFO_BEFORE_PLTE 0x400 #define PNG_BACKGROUND_IS_GRAY 0x800 #define PNG_HAVE_PNG_SIGNATURE 0x1000 /* flags for the transformations the PNG library does on the image data */ #define PNG_BGR 0x0001 #define PNG_INTERLACE 0x0002 #define PNG_PACK 0x0004 #define PNG_SHIFT 0x0008 #define PNG_SWAP_BYTES 0x0010 #define PNG_INVERT_MONO 0x0020 #define PNG_DITHER 0x0040 #define PNG_BACKGROUND 0x0080 #define PNG_BACKGROUND_EXPAND 0x0100 /* 0x0200 unused */ #define PNG_16_TO_8 0x0400 #define PNG_RGBA 0x0800 #define PNG_EXPAND 0x1000 #define PNG_GAMMA 0x2000 #define PNG_GRAY_TO_RGB 0x4000 #define PNG_FILLER 0x8000L #define PNG_PACKSWAP 0x10000L #define PNG_SWAP_ALPHA 0x20000L #define PNG_STRIP_ALPHA 0x40000L #define PNG_INVERT_ALPHA 0x80000L #define PNG_USER_TRANSFORM 0x100000L #define PNG_RGB_TO_GRAY_ERR 0x200000L #define PNG_RGB_TO_GRAY_WARN 0x400000L #define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ /* flags for png_create_struct */ #define PNG_STRUCT_PNG 0x0001 #define PNG_STRUCT_INFO 0x0002 /* Scaling factor for filter heuristic weighting calculations */ #define PNG_WEIGHT_SHIFT 8 #define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) #define PNG_COST_SHIFT 3 #define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) /* flags for the png_ptr->flags rather than declaring a byte for each one */ #define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 #define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 #define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 #define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 #define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 #define PNG_FLAG_ZLIB_FINISHED 0x0020 #define PNG_FLAG_ROW_INIT 0x0040 #define PNG_FLAG_FILLER_AFTER 0x0080 #define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 #define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 #define PNG_FLAG_CRC_CRITICAL_USE 0x0400 #define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 #define PNG_FLAG_FREE_PLTE 0x1000 #define PNG_FLAG_FREE_TRNS 0x2000 #define PNG_FLAG_FREE_HIST 0x4000 #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L #define PNG_FLAG_LIBRARY_MISMATCH 0x20000L #define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L #define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L #define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L /* For use in png_set_keep_unknown, png_handle_as_unknown */ #define HANDLE_CHUNK_AS_DEFAULT 0 #define HANDLE_CHUNK_NEVER 1 #define HANDLE_CHUNK_IF_SAFE 2 #define HANDLE_CHUNK_ALWAYS 3 #define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ PNG_FLAG_CRC_ANCILLARY_NOWARN) #define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ PNG_FLAG_CRC_CRITICAL_IGNORE) #define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ PNG_FLAG_CRC_CRITICAL_MASK) /* save typing and make code easier to understand */ #define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ abs((int)((c1).green) - (int)((c2).green)) + \ abs((int)((c1).blue) - (int)((c2).blue))) /* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ #if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) /* place to hold the signature string for a PNG file. */ #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (const png_byte FARDATA) png_sig[8]; #else #define png_sig png_sig_bytes(NULL) #endif #endif /* PNG_NO_EXTERN */ /* Constant strings for known chunk types. If you need to add a chunk, * define the name here, and add an invocation of the macro in png.c and * wherever it's needed. */ #define PNG_IHDR const png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} #define PNG_IDAT const png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} #define PNG_IEND const png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} #define PNG_PLTE const png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} #define PNG_bKGD const png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} #define PNG_cHRM const png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} #define PNG_gAMA const png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} #define PNG_hIST const png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} #define PNG_iCCP const png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} #define PNG_iTXt const png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} #define PNG_oFFs const png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} #define PNG_pCAL const png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} #define PNG_sCAL const png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} #define PNG_pHYs const png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} #define PNG_sBIT const png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} #define PNG_sPLT const png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} #define PNG_sRGB const png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} #define PNG_tEXt const png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} #define PNG_tIME const png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} #define PNG_tRNS const png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} #define PNG_zTXt const png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} #ifdef PNG_USE_GLOBAL_ARRAYS PNG_EXPORT_VAR (const png_byte FARDATA) png_IHDR[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_IDAT[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_IEND[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_PLTE[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_bKGD[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_cHRM[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_gAMA[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_hIST[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_iCCP[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_iTXt[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_oFFs[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_pCAL[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_sCAL[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_pHYs[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_sBIT[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_sPLT[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_sRGB[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_tEXt[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_tIME[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_tRNS[5]; PNG_EXPORT_VAR (const png_byte FARDATA) png_zTXt[5]; #endif /* PNG_USE_GLOBAL_ARRAYS */ /* Inline macros to do direct reads of bytes from the input buffer. These * require that you are using an architecture that uses PNG byte ordering * (MSB first) and supports unaligned data storage. I think that PowerPC * in big-endian mode and 680x0 are the only ones that will support this. * The x86 line of processors definitely do not. The png_get_int_32() * routine also assumes we are using two's complement format for negative * values, which is almost certainly true. */ #if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) # if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED) # define png_get_int_32(buf) ( *((png_int_32p) (buf))) # endif # define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) # define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) #else # if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED) PNG_EXTERN png_int_32 png_get_int_32 PNGARG((png_bytep buf)); # endif PNG_EXTERN png_uint_32 png_get_uint_32 PNGARG((png_bytep buf)); PNG_EXTERN png_uint_16 png_get_uint_16 PNGARG((png_bytep buf)); #endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ /* Initialize png_ptr struct for reading, and allocate any other memory. * (old interface - DEPRECATED - use png_create_read_struct instead). */ extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); #undef png_read_init #define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, sizeof(png_struct)); extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); /* Initialize png_ptr struct for writing, and allocate any other memory. * (old interface - DEPRECATED - use png_create_write_struct instead). */ extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); #undef png_write_init #define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ PNG_LIBPNG_VER_STRING, sizeof(png_struct)); extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size)); extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size)); /* Allocate memory for an internal libpng struct */ PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); /* Free memory from internal libpng struct */ PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)); PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr)); /* Free any memory that info_ptr points to and reset struct. */ PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, png_infop info_ptr)); #ifndef PNG_1_0_X /* Function to allocate memory for zlib. */ PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); /* Function to free memory for zlib */ PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); /* Next four functions are used internally as callbacks. PNGAPI is required * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) #if !defined(PNG_NO_STDIO) PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); #endif #endif #else /* PNG_1_0_X */ #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t length)); #endif #endif /* PNG_1_0_X */ /* Reset the CRC variable */ PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); /* Write the "data" buffer to whatever output you are using. */ PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read data from whatever input you are using into the "data" buffer */ PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); /* Read bytes into buf, and update png_ptr->crc */ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, png_size_t length)); /* Decompress data in a chunk that uses compression */ #if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr, int comp_type, png_charp chunkdata, png_size_t chunklength, png_size_t prefix_length, png_size_t *data_length)); #endif /* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); /* Read the CRC from the file and compare it to the libpng calculated CRC */ PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); /* Calculate the CRC over a section of data. Note that we are only * passing a maximum of 64K on systems that have this as a memory limit, * since this is the maximum buffer size we can specify. */ PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, png_size_t length)); #if defined(PNG_WRITE_FLUSH_SUPPORTED) PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); #endif /* Place a 32-bit number into a buffer in PNG byte order (big-endian). * The only currently known PNG chunks that use signed numbers are * the ancillary extension chunks, oFFs and pCAL. */ PNG_EXTERN void png_save_uint_32 PNGARG((png_bytep buf, png_uint_32 i)); #if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED) PNG_EXTERN void png_save_int_32 PNGARG((png_bytep buf, png_int_32 i)); #endif /* Place a 16-bit number into a buffer in PNG byte order. * The parameter is declared unsigned int, not png_uint_16, * just to avoid potential problems on pre-ANSI C compilers. */ PNG_EXTERN void png_save_uint_16 PNGARG((png_bytep buf, unsigned int i)); /* simple function to write the signature */ PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); /* write various chunks */ /* Write the IHDR chunk, and update the png_struct with the necessary * information. */ PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_method, int filter_method, int interlace_method)); PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)); PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, png_size_t length)); PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); #if defined(PNG_WRITE_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point file_gamma)); #endif #endif #if defined(PNG_WRITE_sBIT_SUPPORTED) PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, int color_type)); #endif #if defined(PNG_WRITE_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y)); #endif #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, png_fixed_point int_blue_y)); #endif #endif #if defined(PNG_WRITE_sRGB_SUPPORTED) PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, int intent)); #endif #if defined(PNG_WRITE_iCCP_SUPPORTED) PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, png_charp name, int compression_type, png_charp profile, int proflen)); /* Note to maintainer: profile should be png_bytep */ #endif #if defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, png_sPLT_tp palette)); #endif #if defined(PNG_WRITE_tRNS_SUPPORTED) PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, png_color_16p values, int number, int color_type)); #endif #if defined(PNG_WRITE_bKGD_SUPPORTED) PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, png_color_16p values, int color_type)); #endif #if defined(PNG_WRITE_hIST_SUPPORTED) PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, int num_hist)); #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, png_charp key, png_charpp new_key)); #endif #if defined(PNG_WRITE_tEXt_SUPPORTED) PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len)); #endif #if defined(PNG_WRITE_zTXt_SUPPORTED) PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len, int compression)); #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, int compression, png_charp key, png_charp lang, png_charp lang_key, png_charp text)); #endif #if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text)); #endif #if defined(PNG_WRITE_oFFs_SUPPORTED) PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, int unit_type)); #endif #if defined(PNG_WRITE_pCAL_SUPPORTED) PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)); #endif #if defined(PNG_WRITE_pHYs_SUPPORTED) PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, int unit_type)); #endif #if defined(PNG_WRITE_tIME_SUPPORTED) PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, png_timep mod_time)); #endif #if defined(PNG_WRITE_sCAL_SUPPORTED) #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, int unit, double width, double height)); #else #ifdef PNG_FIXED_POINT_SUPPORTED PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, int unit, png_charp width, png_charp height)); #endif #endif #endif /* Called when finished processing a row of data */ PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); /* Internal use only. Called before first row of data */ PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); #endif /* combine a row of data, dealing with alpha, etc. if requested */ PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, int mask)); #if defined(PNG_READ_INTERLACING_SUPPORTED) /* expand an interlaced row */ /* OLD pre-1.0.9 interface: PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass, png_uint_32 transformations)); */ PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); #endif /* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* grab pixels out of a row for an interlaced pass */ PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, png_bytep row, int pass)); #endif /* unfilter a row */ PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); /* Choose the best filter to use and filter the row data */ PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, png_row_infop row_info)); /* Write out the filtered row. */ PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, png_bytep filtered_row)); /* finish a row while reading, dealing with interlacing passes, etc. */ PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); /* initialize the row buffers, etc. */ PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); /* optional call to update the users info structure */ PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, png_infop info_ptr)); /* these are the functions that do the transformations */ #if defined(PNG_READ_FILLER_SUPPORTED) PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 filler, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 flags)); #endif #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_PACK_SUPPORTED) PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p sig_bits)); #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_READ_DITHER_SUPPORTED) PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); # if defined(PNG_CORRECT_PALETTE_SUPPORTED) PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, png_colorp palette, int num_palette)); # endif #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, png_color_8p bit_depth)); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background, png_color_16p background_1, png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, png_uint_16pp gamma_16_to_1, int gamma_shift)); #else PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background)); #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, png_bytep gamma_table, png_uint_16pp gamma_16_table, int gamma_shift)); #endif #if defined(PNG_READ_EXPAND_SUPPORTED) PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, png_bytep row, png_color_16p trans_value)); #endif /* The following decodes the appropriate chunks, and does error correction, * then calls the appropriate callback for the chunk if it is valid. */ /* decode the IHDR chunk */ PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #if defined(PNG_READ_bKGD_SUPPORTED) PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_cHRM_SUPPORTED) PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_gAMA_SUPPORTED) PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_hIST_SUPPORTED) PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_iCCP_SUPPORTED) extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_iCCP_SUPPORTED */ #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_oFFs_SUPPORTED) PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pCAL_SUPPORTED) PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_pHYs_SUPPORTED) PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sBIT_SUPPORTED) PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sCAL_SUPPORTED) PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_sPLT_SUPPORTED) extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif /* PNG_READ_sPLT_SUPPORTED */ #if defined(PNG_READ_sRGB_SUPPORTED) PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tIME_SUPPORTED) PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_tRNS_SUPPORTED) PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); #endif PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, png_bytep chunk_name)); /* handle the transformations for reading and writing */ PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, png_uint_32 length)); PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, png_bytep buffer, png_size_t buffer_length)); PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, png_infop info_ptr)); PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); #if defined(PNG_READ_tEXt_SUPPORTED) PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #if defined(PNG_READ_iTXt_SUPPORTED) PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 length)); PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr)); #endif #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ #ifdef PNG_MNG_FEATURES_SUPPORTED PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, png_bytep row)); #endif #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) /* png.c */ /* PRIVATE */ PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); #endif /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ #endif /* PNG_INTERNAL */ #ifdef __cplusplus } #endif #endif /* PNG_VERSION_INFO_ONLY */ /* do not put anything past this line */ #endif /* PNG_H */ gamera-3.3.3/src/libpng-1.2.5/pngasmrd.h0000644000076500000000000000052010714675701016436 0ustar chriswheel/* pngasmrd.h - assembler version of utilities to read a PNG file * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 2002 Glenn Randers-Pehrson * */ /* This file is obsolete in libpng-1.0.9 and later; its contents now appear * at the end of pngconf.h. */ gamera-3.3.3/src/libpng-1.2.5/pngconf.h0000644000076500000000000011745610714675701016276 0ustar chriswheel/* pngconf.h - machine configurable file for libpng * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ /* Any machine specific code is near the front of this file, so if you * are configuring libpng for a machine, you may want to read the section * starting here down to where it starts to typedef png_color, png_text, * and png_info. */ #ifndef PNGCONF_H #define PNGCONF_H /* This is the size of the compression buffer, and thus the size of * an IDAT chunk. Make this whatever size you feel is best for your * machine. One of these will be allocated per png_struct. When this * is full, it writes the data to the disk, and does some other * calculations. Making this an extremely small size will slow * the library down, but you may want to experiment to determine * where it becomes significant, if you are concerned with memory * usage. Note that zlib allocates at least 32Kb also. For readers, * this describes the size of the buffer available to read the data in. * Unless this gets smaller than the size of a row (compressed), * it should not make much difference how big this is. */ #ifndef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 8192 #endif /* Enable if you want a write-only libpng */ #ifndef PNG_NO_READ_SUPPORTED # define PNG_READ_SUPPORTED #endif /* Enable if you want a read-only libpng */ #ifndef PNG_NO_WRITE_SUPPORTED # define PNG_WRITE_SUPPORTED #endif /* Enabled by default in 1.2.0. You can disable this if you don't need to support PNGs that are embedded in MNG datastreams */ #if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) # ifndef PNG_MNG_FEATURES_SUPPORTED # define PNG_MNG_FEATURES_SUPPORTED # endif #endif #ifndef PNG_NO_FLOATING_POINT_SUPPORTED # ifndef PNG_FLOATING_POINT_SUPPORTED # define PNG_FLOATING_POINT_SUPPORTED # endif #endif /* If you are running on a machine where you cannot allocate more * than 64K of memory at once, uncomment this. While libpng will not * normally need that much memory in a chunk (unless you load up a very * large file), zlib needs to know how big of a chunk it can use, and * libpng thus makes sure to check any memory allocation to verify it * will fit into memory. #define PNG_MAX_MALLOC_64K */ #if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) # define PNG_MAX_MALLOC_64K #endif /* Special munging to support doing things the 'cygwin' way: * 'Normal' png-on-win32 defines/defaults: * PNG_BUILD_DLL -- building dll * PNG_USE_DLL -- building an application, linking to dll * (no define) -- building static library, or building an * application and linking to the static lib * 'Cygwin' defines/defaults: * PNG_BUILD_DLL -- (ignored) building the dll * (no define) -- (ignored) building an application, linking to the dll * PNG_STATIC -- (ignored) building the static lib, or building an * application that links to the static lib. * ALL_STATIC -- (ignored) building various static libs, or building an * application that links to the static libs. * Thus, * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and * this bit of #ifdefs will define the 'correct' config variables based on * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but * unnecessary. * * Also, the precedence order is: * ALL_STATIC (since we can't #undef something outside our namespace) * PNG_BUILD_DLL * PNG_STATIC * (nothing) == PNG_USE_DLL * * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent * of auto-import in binutils, we no longer need to worry about * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes * to __declspec() stuff. However, we DO need to worry about * PNG_BUILD_DLL and PNG_STATIC because those change some defaults * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. */ #if defined(__CYGWIN__) # if defined(ALL_STATIC) # if defined(PNG_BUILD_DLL) # undef PNG_BUILD_DLL # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # if !defined(PNG_STATIC) # define PNG_STATIC # endif # else # if defined (PNG_BUILD_DLL) # if defined(PNG_STATIC) # undef PNG_STATIC # endif # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # else # if defined(PNG_STATIC) # if defined(PNG_USE_DLL) # undef PNG_USE_DLL # endif # if defined(PNG_DLL) # undef PNG_DLL # endif # else # if !defined(PNG_USE_DLL) # define PNG_USE_DLL # endif # if !defined(PNG_DLL) # define PNG_DLL # endif # endif # endif # endif #endif /* This protects us against compilers that run on a windowing system * and thus don't have or would rather us not use the stdio types: * stdin, stdout, and stderr. The only one currently used is stderr * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will * prevent these from being compiled and used. #defining PNG_NO_STDIO * will also prevent these, plus will prevent the entire set of stdio * macros and functions (FILE *, printf, etc.) from being compiled and used, * unless (PNG_DEBUG > 0) has been #defined. * * #define PNG_NO_CONSOLE_IO * #define PNG_NO_STDIO */ #if defined(_WIN32_WCE) # include /* Console I/O functions are not supported on WindowsCE */ # define PNG_NO_CONSOLE_IO # ifdef PNG_DEBUG # undef PNG_DEBUG # endif #endif #ifdef PNG_BUILD_DLL # ifndef PNG_CONSOLE_IO_SUPPORTED # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # endif #endif # ifdef PNG_NO_STDIO # ifndef PNG_NO_CONSOLE_IO # define PNG_NO_CONSOLE_IO # endif # ifdef PNG_DEBUG # if (PNG_DEBUG > 0) # include # endif # endif # else # if !defined(_WIN32_WCE) /* "stdio.h" functions are not supported on WindowsCE */ # include # endif # endif /* This macro protects us against machines that don't have function * prototypes (ie K&R style headers). If your compiler does not handle * function prototypes, define this macro and use the included ansi2knr. * I've always been able to use _NO_PROTO as the indicator, but you may * need to drag the empty declaration out in front of here, or change the * ifdef to suit your own needs. */ #ifndef PNGARG #ifdef OF /* zlib prototype munger */ # define PNGARG(arglist) OF(arglist) #else #ifdef _NO_PROTO # define PNGARG(arglist) () # ifndef PNG_TYPECAST_NULL # define PNG_TYPECAST_NULL # endif #else # define PNGARG(arglist) arglist #endif /* _NO_PROTO */ #endif /* OF */ #endif /* PNGARG */ /* Try to determine if we are compiling on a Mac. Note that testing for * just __MWERKS__ is not good enough, because the Codewarrior is now used * on non-Mac platforms. */ #ifndef MACOS # if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) # define MACOS # endif #endif /* enough people need this for various reasons to include it here */ #if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) # include #endif #if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) # define PNG_SETJMP_SUPPORTED #endif #ifdef PNG_SETJMP_SUPPORTED /* This is an attempt to force a single setjmp behaviour on Linux. If * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. */ # ifdef __linux__ # ifdef _BSD_SOURCE # define PNG_SAVE_BSD_SOURCE # undef _BSD_SOURCE # endif # ifdef _SETJMP_H __png.h__ already includes setjmp.h; __dont__ include it again.; # endif # endif /* __linux__ */ /* include setjmp.h for error handling */ # include # ifdef __linux__ # ifdef PNG_SAVE_BSD_SOURCE # define _BSD_SOURCE # undef PNG_SAVE_BSD_SOURCE # endif # endif /* __linux__ */ #endif /* PNG_SETJMP_SUPPORTED */ #ifdef BSD # include #else # include #endif /* Other defines for things like memory and the like can go here. */ #ifdef PNG_INTERNAL #include /* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which * aren't usually used outside the library (as far as I know), so it is * debatable if they should be exported at all. In the future, when it is * possible to have run-time registry of chunk-handling functions, some of * these will be made available again. #define PNG_EXTERN extern */ #define PNG_EXTERN /* Other defines specific to compilers can go here. Try to keep * them inside an appropriate ifdef/endif pair for portability. */ #if defined(PNG_FLOATING_POINT_SUPPORTED) # if defined(MACOS) /* We need to check that hasn't already been included earlier * as it seems it doesn't agree with , yet we should really use * if possible. */ # if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) # include # endif # else # include # endif # if defined(_AMIGA) && defined(__SASC) && defined(_M68881) /* Amiga SAS/C: We must include builtin FPU functions when compiling using * MATH=68881 */ # include # endif #endif /* Codewarrior on NT has linking problems without this. */ #if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) # define PNG_ALWAYS_EXTERN #endif /* For some reason, Borland C++ defines memcmp, etc. in mem.h, not * stdlib.h like it should (I think). Or perhaps this is a C++ * "feature"? */ #ifdef __TURBOC__ # include # include "alloc.h" #endif #if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) # include #endif /* This controls how fine the dithering gets. As this allocates * a largish chunk of memory (32K), those who are not as concerned * with dithering quality can decrease some or all of these. */ #ifndef PNG_DITHER_RED_BITS # define PNG_DITHER_RED_BITS 5 #endif #ifndef PNG_DITHER_GREEN_BITS # define PNG_DITHER_GREEN_BITS 5 #endif #ifndef PNG_DITHER_BLUE_BITS # define PNG_DITHER_BLUE_BITS 5 #endif /* This controls how fine the gamma correction becomes when you * are only interested in 8 bits anyway. Increasing this value * results in more memory being used, and more pow() functions * being called to fill in the gamma tables. Don't set this value * less then 8, and even that may not work (I haven't tested it). */ #ifndef PNG_MAX_GAMMA_8 # define PNG_MAX_GAMMA_8 11 #endif /* This controls how much a difference in gamma we can tolerate before * we actually start doing gamma conversion. */ #ifndef PNG_GAMMA_THRESHOLD # define PNG_GAMMA_THRESHOLD 0.05 #endif #endif /* PNG_INTERNAL */ /* The following uses const char * instead of char * for error * and warning message functions, so some compilers won't complain. * If you do not want to use const, define PNG_NO_CONST here. */ #ifndef PNG_NO_CONST # define PNG_CONST const #else # define PNG_CONST #endif /* The following defines give you the ability to remove code from the * library that you will not be using. I wish I could figure out how to * automate this, but I can't do that without making it seriously hard * on the users. So if you are not using an ability, change the #define * to and #undef, and that part of the library will not be compiled. If * your linker can't find a function, you may want to make sure the * ability is defined here. Some of these depend upon some others being * defined. I haven't figured out all the interactions here, so you may * have to experiment awhile to get everything to compile. If you are * creating or using a shared library, you probably shouldn't touch this, * as it will affect the size of the structures, and this will cause bad * things to happen if the library and/or application ever change. */ /* Any features you will not be using can be undef'ed here */ /* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS * on the compile line, then pick and choose which ones to define without * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED * if you only want to have a png-compliant reader/writer but don't need * any of the extra transformations. This saves about 80 kbytes in a * typical installation of the library. (PNG_NO_* form added in version * 1.0.1c, for consistency) */ /* The size of the png_text structure changed in libpng-1.0.6 when * iTXt is supported. It is turned off by default, to support old apps * that malloc the png_text structure instead of calling png_set_text() * and letting libpng malloc it. It will be turned on by default in * libpng-1.3.0. */ #ifndef PNG_iTXt_SUPPORTED # if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) # define PNG_NO_READ_iTXt # endif # if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) # define PNG_NO_WRITE_iTXt # endif #endif /* The following support, added after version 1.0.0, can be turned off here en * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility * with old applications that require the length of png_struct and png_info * to remain unchanged. */ #ifdef PNG_LEGACY_SUPPORTED # define PNG_NO_FREE_ME # define PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_NO_READ_USER_CHUNKS # define PNG_NO_READ_iCCP # define PNG_NO_WRITE_iCCP # define PNG_NO_READ_iTXt # define PNG_NO_WRITE_iTXt # define PNG_NO_READ_sCAL # define PNG_NO_WRITE_sCAL # define PNG_NO_READ_sPLT # define PNG_NO_WRITE_sPLT # define PNG_NO_INFO_IMAGE # define PNG_NO_READ_RGB_TO_GRAY # define PNG_NO_READ_USER_TRANSFORM # define PNG_NO_WRITE_USER_TRANSFORM # define PNG_NO_USER_MEM # define PNG_NO_READ_EMPTY_PLTE # define PNG_NO_MNG_FEATURES # define PNG_NO_FIXED_POINT_SUPPORTED #endif /* Ignore attempt to turn off both floating and fixed point support */ #if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ !defined(PNG_NO_FIXED_POINT_SUPPORTED) # define PNG_FIXED_POINT_SUPPORTED #endif #ifndef PNG_NO_FREE_ME # define PNG_FREE_ME_SUPPORTED #endif #if defined(PNG_READ_SUPPORTED) #if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_TRANSFORMS) # define PNG_READ_TRANSFORMS_SUPPORTED #endif #ifdef PNG_READ_TRANSFORMS_SUPPORTED # ifndef PNG_NO_READ_EXPAND # define PNG_READ_EXPAND_SUPPORTED # endif # ifndef PNG_NO_READ_SHIFT # define PNG_READ_SHIFT_SUPPORTED # endif # ifndef PNG_NO_READ_PACK # define PNG_READ_PACK_SUPPORTED # endif # ifndef PNG_NO_READ_BGR # define PNG_READ_BGR_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP # define PNG_READ_SWAP_SUPPORTED # endif # ifndef PNG_NO_READ_PACKSWAP # define PNG_READ_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT # define PNG_READ_INVERT_SUPPORTED # endif # ifndef PNG_NO_READ_DITHER # define PNG_READ_DITHER_SUPPORTED # endif # ifndef PNG_NO_READ_BACKGROUND # define PNG_READ_BACKGROUND_SUPPORTED # endif # ifndef PNG_NO_READ_16_TO_8 # define PNG_READ_16_TO_8_SUPPORTED # endif # ifndef PNG_NO_READ_FILLER # define PNG_READ_FILLER_SUPPORTED # endif # ifndef PNG_NO_READ_GAMMA # define PNG_READ_GAMMA_SUPPORTED # endif # ifndef PNG_NO_READ_GRAY_TO_RGB # define PNG_READ_GRAY_TO_RGB_SUPPORTED # endif # ifndef PNG_NO_READ_SWAP_ALPHA # define PNG_READ_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_INVERT_ALPHA # define PNG_READ_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_STRIP_ALPHA # define PNG_READ_STRIP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_READ_USER_TRANSFORM # define PNG_READ_USER_TRANSFORM_SUPPORTED # endif # ifndef PNG_NO_READ_RGB_TO_GRAY # define PNG_READ_RGB_TO_GRAY_SUPPORTED # endif #endif /* PNG_READ_TRANSFORMS_SUPPORTED */ #if !defined(PNG_NO_PROGRESSIVE_READ) && \ !defined(PNG_PROGRESSIVE_READ_NOT_SUPPORTED) /* if you don't do progressive */ # define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ #endif /* about interlacing capability! You'll */ /* still have interlacing unless you change the following line: */ #define PNG_READ_INTERLACING_SUPPORTED /* required for PNG-compliant decoders */ #ifndef PNG_NO_READ_COMPOSITE_NODIV # ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ # define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ # endif #endif /* Deprecated, will be removed from version 2.0.0. Use PNG_MNG_FEATURES_SUPPORTED instead. */ #ifndef PNG_NO_READ_EMPTY_PLTE # define PNG_READ_EMPTY_PLTE_SUPPORTED #endif #endif /* PNG_READ_SUPPORTED */ #if defined(PNG_WRITE_SUPPORTED) # if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_TRANSFORMS) # define PNG_WRITE_TRANSFORMS_SUPPORTED #endif #ifdef PNG_WRITE_TRANSFORMS_SUPPORTED # ifndef PNG_NO_WRITE_SHIFT # define PNG_WRITE_SHIFT_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACK # define PNG_WRITE_PACK_SUPPORTED # endif # ifndef PNG_NO_WRITE_BGR # define PNG_WRITE_BGR_SUPPORTED # endif # ifndef PNG_NO_WRITE_SWAP # define PNG_WRITE_SWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_PACKSWAP # define PNG_WRITE_PACKSWAP_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT # define PNG_WRITE_INVERT_SUPPORTED # endif # ifndef PNG_NO_WRITE_FILLER # define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ # endif # ifndef PNG_NO_WRITE_SWAP_ALPHA # define PNG_WRITE_SWAP_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_INVERT_ALPHA # define PNG_WRITE_INVERT_ALPHA_SUPPORTED # endif # ifndef PNG_NO_WRITE_USER_TRANSFORM # define PNG_WRITE_USER_TRANSFORM_SUPPORTED # endif #endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) # ifndef PNG_NO_USER_TRANSFORM_PTR # define PNG_USER_TRANSFORM_PTR_SUPPORTED # endif #endif #define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant encoders, but can cause trouble if left undefined */ #if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ defined(PNG_FLOATING_POINT_SUPPORTED) # define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED #endif #ifndef PNG_1_0_X #ifndef PNG_NO_ERROR_NUMBERS #define PNG_ERROR_NUMBERS_SUPPORTED #endif #endif /* PNG_1_0_X */ #ifndef PNG_NO_WRITE_FLUSH # define PNG_WRITE_FLUSH_SUPPORTED #endif /* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ #ifndef PNG_NO_WRITE_EMPTY_PLTE # define PNG_WRITE_EMPTY_PLTE_SUPPORTED #endif #endif /* PNG_WRITE_SUPPORTED */ #ifndef PNG_NO_STDIO # define PNG_TIME_RFC1123_SUPPORTED #endif /* This adds extra functions in pngget.c for accessing data from the * info pointer (added in version 0.99) * png_get_image_width() * png_get_image_height() * png_get_bit_depth() * png_get_color_type() * png_get_compression_type() * png_get_filter_type() * png_get_interlace_type() * png_get_pixel_aspect_ratio() * png_get_pixels_per_meter() * png_get_x_offset_pixels() * png_get_y_offset_pixels() * png_get_x_offset_microns() * png_get_y_offset_microns() */ #if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) # define PNG_EASY_ACCESS_SUPPORTED #endif /* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 even when PNG_USE_PNGVCRD or PNG_USE_PNGGCCRD is not defined */ #if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) # ifndef PNG_ASSEMBLER_CODE_SUPPORTED # define PNG_ASSEMBLER_CODE_SUPPORTED # endif # if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) # define PNG_MMX_CODE_SUPPORTED # endif #endif /* If you are sure that you don't need thread safety and you are compiling with PNG_USE_PNGCCRD for an MMX application, you can define this for faster execution. See pnggccrd.c. #define PNG_THREAD_UNSAFE_OK */ #if !defined(PNG_1_0_X) #if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) # define PNG_USER_MEM_SUPPORTED #endif #endif /* PNG_1_0_X */ /* These are currently experimental features, define them if you want */ /* very little testing */ /* #ifdef PNG_READ_SUPPORTED # ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED # endif #endif */ /* This is only for PowerPC big-endian and 680x0 systems */ /* some testing */ /* #ifdef PNG_READ_SUPPORTED # ifndef PNG_PNG_READ_BIG_ENDIAN_SUPPORTED # define PNG_READ_BIG_ENDIAN_SUPPORTED # endif #endif */ /* Buggy compilers (e.g., gcc 2.7.2.2) need this */ /* #define PNG_NO_POINTER_INDEXING */ /* These functions are turned off by default, as they will be phased out. */ /* #define PNG_USELESS_TESTS_SUPPORTED #define PNG_CORRECT_PALETTE_SUPPORTED */ /* Any chunks you are not interested in, you can undef here. The * ones that allocate memory may be expecially important (hIST, * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info * a bit smaller. */ #if defined(PNG_READ_SUPPORTED) && \ !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_READ_ANCILLARY_CHUNKS) # define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #endif #if defined(PNG_WRITE_SUPPORTED) && \ !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) # define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #endif #ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_READ_TEXT # define PNG_NO_READ_iTXt # define PNG_NO_READ_tEXt # define PNG_NO_READ_zTXt #endif #ifndef PNG_NO_READ_bKGD # define PNG_READ_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED #endif #ifndef PNG_NO_READ_cHRM # define PNG_READ_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED #endif #ifndef PNG_NO_READ_gAMA # define PNG_READ_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED #endif #ifndef PNG_NO_READ_hIST # define PNG_READ_hIST_SUPPORTED # define PNG_hIST_SUPPORTED #endif #ifndef PNG_NO_READ_iCCP # define PNG_READ_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED #endif #ifndef PNG_NO_READ_iTXt # ifndef PNG_READ_iTXt_SUPPORTED # define PNG_READ_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_READ_oFFs # define PNG_READ_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED #endif #ifndef PNG_NO_READ_pCAL # define PNG_READ_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED #endif #ifndef PNG_NO_READ_sCAL # define PNG_READ_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED #endif #ifndef PNG_NO_READ_pHYs # define PNG_READ_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED #endif #ifndef PNG_NO_READ_sBIT # define PNG_READ_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED #endif #ifndef PNG_NO_READ_sPLT # define PNG_READ_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED #endif #ifndef PNG_NO_READ_sRGB # define PNG_READ_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED #endif #ifndef PNG_NO_READ_tEXt # define PNG_READ_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED #endif #ifndef PNG_NO_READ_tIME # define PNG_READ_tIME_SUPPORTED # define PNG_tIME_SUPPORTED #endif #ifndef PNG_NO_READ_tRNS # define PNG_READ_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED #endif #ifndef PNG_NO_READ_zTXt # define PNG_READ_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED #endif #ifndef PNG_NO_READ_UNKNOWN_CHUNKS # define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif #endif #if !defined(PNG_NO_READ_USER_CHUNKS) && \ defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) # define PNG_READ_USER_CHUNKS_SUPPORTED # define PNG_USER_CHUNKS_SUPPORTED # ifdef PNG_NO_READ_UNKNOWN_CHUNKS # undef PNG_NO_READ_UNKNOWN_CHUNKS # endif # ifdef PNG_NO_HANDLE_AS_UNKNOWN # undef PNG_NO_HANDLE_AS_UNKNOWN # endif #endif #ifndef PNG_NO_READ_OPT_PLTE # define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ #endif /* optional PLTE chunk in RGB and RGBA images */ #if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ defined(PNG_READ_zTXt_SUPPORTED) # define PNG_READ_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED #endif #endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ #ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED #ifdef PNG_NO_WRITE_TEXT # define PNG_NO_WRITE_iTXt # define PNG_NO_WRITE_tEXt # define PNG_NO_WRITE_zTXt #endif #ifndef PNG_NO_WRITE_bKGD # define PNG_WRITE_bKGD_SUPPORTED # ifndef PNG_bKGD_SUPPORTED # define PNG_bKGD_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_cHRM # define PNG_WRITE_cHRM_SUPPORTED # ifndef PNG_cHRM_SUPPORTED # define PNG_cHRM_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_gAMA # define PNG_WRITE_gAMA_SUPPORTED # ifndef PNG_gAMA_SUPPORTED # define PNG_gAMA_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_hIST # define PNG_WRITE_hIST_SUPPORTED # ifndef PNG_hIST_SUPPORTED # define PNG_hIST_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iCCP # define PNG_WRITE_iCCP_SUPPORTED # ifndef PNG_iCCP_SUPPORTED # define PNG_iCCP_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_iTXt # ifndef PNG_WRITE_iTXt_SUPPORTED # define PNG_WRITE_iTXt_SUPPORTED # endif # ifndef PNG_iTXt_SUPPORTED # define PNG_iTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_oFFs # define PNG_WRITE_oFFs_SUPPORTED # ifndef PNG_oFFs_SUPPORTED # define PNG_oFFs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pCAL # define PNG_WRITE_pCAL_SUPPORTED # ifndef PNG_pCAL_SUPPORTED # define PNG_pCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sCAL # define PNG_WRITE_sCAL_SUPPORTED # ifndef PNG_sCAL_SUPPORTED # define PNG_sCAL_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_pHYs # define PNG_WRITE_pHYs_SUPPORTED # ifndef PNG_pHYs_SUPPORTED # define PNG_pHYs_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sBIT # define PNG_WRITE_sBIT_SUPPORTED # ifndef PNG_sBIT_SUPPORTED # define PNG_sBIT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sPLT # define PNG_WRITE_sPLT_SUPPORTED # ifndef PNG_sPLT_SUPPORTED # define PNG_sPLT_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_sRGB # define PNG_WRITE_sRGB_SUPPORTED # ifndef PNG_sRGB_SUPPORTED # define PNG_sRGB_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tEXt # define PNG_WRITE_tEXt_SUPPORTED # ifndef PNG_tEXt_SUPPORTED # define PNG_tEXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tIME # define PNG_WRITE_tIME_SUPPORTED # ifndef PNG_tIME_SUPPORTED # define PNG_tIME_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_tRNS # define PNG_WRITE_tRNS_SUPPORTED # ifndef PNG_tRNS_SUPPORTED # define PNG_tRNS_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_zTXt # define PNG_WRITE_zTXt_SUPPORTED # ifndef PNG_zTXt_SUPPORTED # define PNG_zTXt_SUPPORTED # endif #endif #ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS # define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED # define PNG_UNKNOWN_CHUNKS_SUPPORTED # endif # ifndef PNG_NO_HANDLE_AS_UNKNOWN # ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED # define PNG_HANDLE_AS_UNKNOWN_SUPPORTED # endif # endif #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ defined(PNG_WRITE_zTXt_SUPPORTED) # define PNG_WRITE_TEXT_SUPPORTED # ifndef PNG_TEXT_SUPPORTED # define PNG_TEXT_SUPPORTED # endif #endif #endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ /* Turn this off to disable png_read_png() and * png_write_png() and leave the row_pointers member * out of the info structure. */ #ifndef PNG_NO_INFO_IMAGE # define PNG_INFO_IMAGE_SUPPORTED #endif /* need the time information for reading tIME chunks */ #if defined(PNG_tIME_SUPPORTED) # if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ # include # endif #endif /* Some typedefs to get us started. These should be safe on most of the * common platforms. The typedefs should be at least as large as the * numbers suggest (a png_uint_32 must be at least 32 bits long), but they * don't have to be exactly that size. Some compilers dislike passing * unsigned shorts as function parameters, so you may be better off using * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may * want to have unsigned int for png_uint_32 instead of unsigned long. */ typedef unsigned long png_uint_32; typedef long png_int_32; typedef unsigned short png_uint_16; typedef short png_int_16; typedef unsigned char png_byte; /* This is usually size_t. It is typedef'ed just in case you need it to change (I'm not sure if you will or not, so I thought I'd be safe) */ typedef size_t png_size_t; /* The following is needed for medium model support. It cannot be in the * PNG_INTERNAL section. Needs modification for other compilers besides * MSC. Model independent support declares all arrays and pointers to be * large using the far keyword. The zlib version used must also support * model independent data. As of version zlib 1.0.4, the necessary changes * have been made in zlib. The USE_FAR_KEYWORD define triggers other * changes that are needed. (Tim Wegner) */ /* Separate compiler dependencies (problem here is that zlib.h always defines FAR. (SJT) */ #ifdef __BORLANDC__ # if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) # define LDATA 1 # else # define LDATA 0 # endif /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ # if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) # define PNG_MAX_MALLOC_64K # if (LDATA != 1) # ifndef FAR # define FAR __far # endif # define USE_FAR_KEYWORD # endif /* LDATA != 1 */ /* Possibly useful for moving data out of default segment. * Uncomment it if you want. Could also define FARDATA as * const if your compiler supports it. (SJT) # define FARDATA FAR */ # endif /* __WIN32__, __FLAT__, __CYGWIN__ */ #endif /* __BORLANDC__ */ /* Suggest testing for specific compiler first before testing for * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, * making reliance oncertain keywords suspect. (SJT) */ /* MSC Medium model */ #if defined(FAR) # if defined(M_I86MM) # define USE_FAR_KEYWORD # define FARDATA FAR # include # endif #endif /* SJT: default case */ #ifndef FAR # define FAR #endif /* At this point FAR is always defined */ #ifndef FARDATA # define FARDATA #endif /* Typedef for floating-point numbers that are converted to fixed-point with a multiple of 100,000, e.g., int_gamma */ typedef png_int_32 png_fixed_point; /* Add typedefs for pointers */ typedef void FAR * png_voidp; typedef png_byte FAR * png_bytep; typedef png_uint_32 FAR * png_uint_32p; typedef png_int_32 FAR * png_int_32p; typedef png_uint_16 FAR * png_uint_16p; typedef png_int_16 FAR * png_int_16p; typedef PNG_CONST char FAR * png_const_charp; typedef char FAR * png_charp; typedef png_fixed_point FAR * png_fixed_point_p; #ifndef PNG_NO_STDIO #if defined(_WIN32_WCE) typedef HANDLE png_FILE_p; #else typedef FILE * png_FILE_p; #endif #endif #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * png_doublep; #endif /* Pointers to pointers; i.e. arrays */ typedef png_byte FAR * FAR * png_bytepp; typedef png_uint_32 FAR * FAR * png_uint_32pp; typedef png_int_32 FAR * FAR * png_int_32pp; typedef png_uint_16 FAR * FAR * png_uint_16pp; typedef png_int_16 FAR * FAR * png_int_16pp; typedef PNG_CONST char FAR * FAR * png_const_charpp; typedef char FAR * FAR * png_charpp; typedef png_fixed_point FAR * FAR * png_fixed_point_pp; #ifdef PNG_FLOATING_POINT_SUPPORTED typedef double FAR * FAR * png_doublepp; #endif /* Pointers to pointers to pointers; i.e., pointer to array */ typedef char FAR * FAR * FAR * png_charppp; /* libpng typedefs for types in zlib. If zlib changes * or another compression library is used, then change these. * Eliminates need to change all the source files. */ typedef charf * png_zcharp; typedef charf * FAR * png_zcharpp; typedef z_stream FAR * png_zstreamp; /* * Define PNG_BUILD_DLL if the module being built is a Windows * LIBPNG DLL. * * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. * It is equivalent to Microsoft predefined macro _DLL that is * automatically defined when you compile using the share * version of the CRT (C Run-Time library) * * The cygwin mods make this behavior a little different: * Define PNG_BUILD_DLL if you are building a dll for use with cygwin * Define PNG_STATIC if you are building a static library for use with cygwin, * -or- if you are building an application that you want to link to the * static library. * PNG_USE_DLL is defined by default (no user action needed) unless one of * the other flags is defined. */ #if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) # define PNG_DLL #endif /* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. * When building a static lib, default to no GLOBAL ARRAYS, but allow * command-line override */ #if defined(__CYGWIN__) # if !defined(PNG_STATIC) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # if !defined(PNG_USE_LOCAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif # else # if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) # if defined(PNG_USE_GLOBAL_ARRAYS) # undef PNG_USE_GLOBAL_ARRAYS # endif # endif # endif # if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # define PNG_USE_LOCAL_ARRAYS # endif #endif /* Do not use global arrays (helps with building DLL's) * They are no longer used in libpng itself, since version 1.0.5c, * but might be required for some pre-1.0.5c applications. */ #if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) # if defined(PNG_NO_GLOBAL_ARRAYS) || (defined(__GNUC__) && defined(PNG_DLL)) # define PNG_USE_LOCAL_ARRAYS # else # define PNG_USE_GLOBAL_ARRAYS # endif #endif #if defined(__CYGWIN__) # undef PNGAPI # define PNGAPI __cdecl # undef PNG_IMPEXP # define PNG_IMPEXP #endif /* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", * you may get warnings regarding the linkage of png_zalloc and png_zfree. * Don't ignore those warnings; you must also reset the default calling * convention in your compiler to match your PNGAPI, and you must build * zlib and your applications the same way you build libpng. */ #ifndef PNGAPI #if defined(__MINGW32__) && !defined(PNG_MODULEDEF) # ifndef PNG_NO_MODULEDEF # define PNG_NO_MODULEDEF # endif #endif #if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) # define PNG_IMPEXP #endif #if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ (( defined(_Windows) || defined(_WINDOWS) || \ defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) # if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) # define PNGAPI __cdecl # else # define PNGAPI _cdecl # endif # if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) # define PNG_IMPEXP # endif # if !defined(PNG_IMPEXP) # define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol # define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol /* Borland/Microsoft */ # if defined(_MSC_VER) || defined(__BORLANDC__) # if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) # define PNG_EXPORT PNG_EXPORT_TYPE1 # else # define PNG_EXPORT PNG_EXPORT_TYPE2 # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __export # else # define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in VC++ */ # endif /* Exists in Borland C++ for C++ classes (== huge) */ # endif # endif # if !defined(PNG_IMPEXP) # if defined(PNG_BUILD_DLL) # define PNG_IMPEXP __declspec(dllexport) # else # define PNG_IMPEXP __declspec(dllimport) # endif # endif # endif /* PNG_IMPEXP */ #else /* !(DLL || non-cygwin WINDOWS) */ # if (defined(__IBMC__) || defined(IBMCPP__)) && defined(__OS2__) # define PNGAPI _System # define PNG_IMPEXP # else # if 0 /* ... other platforms, with other meanings */ # else # define PNGAPI # define PNG_IMPEXP # endif # endif #endif #endif #ifndef PNGAPI # define PNGAPI #endif #ifndef PNG_IMPEXP # define PNG_IMPEXP #endif #ifndef PNG_EXPORT # define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol #endif #ifdef PNG_USE_GLOBAL_ARRAYS # ifndef PNG_EXPORT_VAR # define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type # endif #endif /* User may want to use these so they are not in PNG_INTERNAL. Any library * functions that are passed far data must be model independent. */ #ifndef PNG_ABORT # define PNG_ABORT() abort() #endif #ifdef PNG_SETJMP_SUPPORTED # define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) #else # define png_jmpbuf(png_ptr) \ (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) #endif #if defined(USE_FAR_KEYWORD) /* memory model independent fns */ /* use this to make far-to-near assignments */ # define CHECK 1 # define NOCHECK 0 # define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) # define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) # define png_strcpy _fstrcpy # define png_strlen _fstrlen # define png_memcmp _fmemcmp /* SJT: added */ # define png_memcpy _fmemcpy # define png_memset _fmemset #else /* use the usual functions */ # define CVT_PTR(ptr) (ptr) # define CVT_PTR_NOCHECK(ptr) (ptr) # define png_strcpy strcpy # define png_strlen strlen # define png_memcmp memcmp /* SJT: added */ # define png_memcpy memcpy # define png_memset memset #endif /* End of memory model independent support */ /* Just a little check that someone hasn't tried to define something * contradictory. */ #if (PNG_ZBUF_SIZE > 65536) && defined(PNG_MAX_MALLOC_64K) # undef PNG_ZBUF_SIZE # define PNG_ZBUF_SIZE 65536 #endif #ifdef PNG_READ_SUPPORTED /* Prior to libpng-1.0.9, this block was in pngasmrd.h */ #if defined(PNG_INTERNAL) /* These are the default thresholds before the MMX code kicks in; if either * rowbytes or bitdepth is below the threshold, plain C code is used. These * can be overridden at runtime via the png_set_mmx_thresholds() call in * libpng 1.2.0 and later. The values below were chosen by Intel. */ #ifndef PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT # define PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT 128 /* >= */ #endif #ifndef PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT # define PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT 9 /* >= */ #endif /* Set this in the makefile for VC++ on Pentium, not here. */ /* Platform must be Pentium. Makefile must assemble and load pngvcrd.c . * MMX will be detected at run time and used if present. */ #ifdef PNG_USE_PNGVCRD # define PNG_HAVE_ASSEMBLER_COMBINE_ROW # define PNG_HAVE_ASSEMBLER_READ_INTERLACE # define PNG_HAVE_ASSEMBLER_READ_FILTER_ROW #endif /* Set this in the makefile for gcc/as on Pentium, not here. */ /* Platform must be Pentium. Makefile must assemble and load pnggccrd.c . * MMX will be detected at run time and used if present. */ #ifdef PNG_USE_PNGGCCRD # define PNG_HAVE_ASSEMBLER_COMBINE_ROW # define PNG_HAVE_ASSEMBLER_READ_INTERLACE # define PNG_HAVE_ASSEMBLER_READ_FILTER_ROW #endif /* - see pnggccrd.c for info about what is currently enabled */ #endif /* PNG_INTERNAL */ #endif /* PNG_READ_SUPPORTED */ #endif /* PNGCONF_H */ gamera-3.3.3/src/libpng-1.2.5/pngerror.c0000644000076500000000000002046710714675701016470 0ustar chriswheel /* pngerror.c - stub functions for i/o and memory allocation * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This file provides a location for all error handling. Users who * need special error handling are expected to write replacement functions * and use png_set_error_fn() to use those functions. See the instructions * at each function. */ #define PNG_INTERNAL #include "png.h" static void /* PRIVATE */ png_default_error PNGARG((png_structp png_ptr, png_const_charp error_message)); static void /* PRIVATE */ png_default_warning PNGARG((png_structp png_ptr, png_const_charp warning_message)); /* This function is called whenever there is a fatal error. This function * should not be changed. If there is a need to handle errors differently, * you should supply a replacement error function and use png_set_error_fn() * to replace the error function at run-time. */ void PNGAPI png_error(png_structp png_ptr, png_const_charp error_message) { #ifdef PNG_ERROR_NUMBERS_SUPPORTED char msg[16]; if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) { int offset = 0; if (*error_message == '#') { for (offset=1; offset<15; offset++) if (*(error_message+offset) == ' ') break; if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) { int i; for (i=0; iflags&PNG_FLAG_STRIP_ERROR_TEXT) { msg[0]='0'; msg[1]='\0'; error_message=msg; } } } #endif if (png_ptr->error_fn != NULL) (*(png_ptr->error_fn))(png_ptr, error_message); /* if the following returns or doesn't exist, use the default function, which will not return */ png_default_error(png_ptr, error_message); } /* This function is called whenever there is a non-fatal error. This function * should not be changed. If there is a need to handle warnings differently, * you should supply a replacement warning function and use * png_set_error_fn() to replace the warning function at run-time. */ void PNGAPI png_warning(png_structp png_ptr, png_const_charp warning_message) { int offset = 0; #ifdef PNG_ERROR_NUMBERS_SUPPORTED if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) #endif { if (*warning_message == '#') { for (offset=1; offset<15; offset++) if (*(warning_message+offset) == ' ') break; } } if (png_ptr->warning_fn != NULL) (*(png_ptr->warning_fn))(png_ptr, (png_const_charp)(warning_message+offset)); else png_default_warning(png_ptr, (png_const_charp)(warning_message+offset)); } /* These utilities are used internally to build an error message that relates * to the current chunk. The chunk name comes from png_ptr->chunk_name, * this is used to prefix the message. The message is limited in length * to 63 bytes, the name characters are output as hex digits wrapped in [] * if the character is invalid. */ #define isnonalpha(c) ((c) < 41 || (c) > 122 || ((c) > 90 && (c) < 97)) static PNG_CONST char png_digit[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; static void /* PRIVATE */ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp error_message) { int iout = 0, iin = 0; while (iin < 4) { int c = png_ptr->chunk_name[iin++]; if (isnonalpha(c)) { buffer[iout++] = '['; buffer[iout++] = png_digit[(c & 0xf0) >> 4]; buffer[iout++] = png_digit[c & 0x0f]; buffer[iout++] = ']'; } else { buffer[iout++] = (png_byte)c; } } if (error_message == NULL) buffer[iout] = 0; else { buffer[iout++] = ':'; buffer[iout++] = ' '; png_memcpy(buffer+iout, error_message, 64); buffer[iout+63] = 0; } } void PNGAPI png_chunk_error(png_structp png_ptr, png_const_charp error_message) { char msg[18+64]; png_format_buffer(png_ptr, msg, error_message); png_error(png_ptr, msg); } void PNGAPI png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) { char msg[18+64]; png_format_buffer(png_ptr, msg, warning_message); png_warning(png_ptr, msg); } /* This is the default error handling function. Note that replacements for * this function MUST NOT RETURN, or the program will likely crash. This * function is used by default, or if the program supplies NULL for the * error function pointer in png_set_error_fn(). */ static void /* PRIVATE */ png_default_error(png_structp png_ptr, png_const_charp error_message) { #ifndef PNG_NO_CONSOLE_IO #ifdef PNG_ERROR_NUMBERS_SUPPORTED if (*error_message == '#') { int offset; char error_number[16]; for (offset=0; offset<15; offset++) { error_number[offset] = *(error_message+offset+1); if (*(error_message+offset) == ' ') break; } if((offset > 1) && (offset < 15)) { error_number[offset-1]='\0'; fprintf(stderr, "libpng error no. %s: %s\n", error_number, error_message+offset); } else fprintf(stderr, "libpng error: %s, offset=%d\n", error_message,offset); } else #endif fprintf(stderr, "libpng error: %s\n", error_message); #else if (error_message) /* make compiler happy */ ; #endif #ifdef PNG_SETJMP_SUPPORTED # ifdef USE_FAR_KEYWORD { jmp_buf jmpbuf; png_memcpy(jmpbuf,png_ptr->jmpbuf,sizeof(jmp_buf)); longjmp(jmpbuf, 1); } # else longjmp(png_ptr->jmpbuf, 1); # endif #else if (png_ptr) /* make compiler happy */ ; PNG_ABORT(); #endif } /* This function is called when there is a warning, but the library thinks * it can continue anyway. Replacement functions don't have to do anything * here if you don't want them to. In the default configuration, png_ptr is * not used, but it is passed in case it may be useful. */ static void /* PRIVATE */ png_default_warning(png_structp png_ptr, png_const_charp warning_message) { #ifndef PNG_NO_CONSOLE_IO # ifdef PNG_ERROR_NUMBERS_SUPPORTED if (*warning_message == '#') { int offset; char warning_number[16]; for (offset=0; offset<15; offset++) { warning_number[offset]=*(warning_message+offset+1); if (*(warning_message+offset) == ' ') break; } if((offset > 1) && (offset < 15)) { warning_number[offset-1]='\0'; fprintf(stderr, "libpng warning no. %s: %s\n", warning_number, warning_message+offset); } else fprintf(stderr, "libpng warning: %s\n", warning_message); } else # endif fprintf(stderr, "libpng warning: %s\n", warning_message); #else if (warning_message) /* appease compiler */ ; #endif if (png_ptr) return; } /* This function is called when the application wants to use another method * of handling errors and warnings. Note that the error function MUST NOT * return to the calling routine or serious problems will occur. The return * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1) */ void PNGAPI png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn) { png_ptr->error_ptr = error_ptr; png_ptr->error_fn = error_fn; png_ptr->warning_fn = warning_fn; } /* This function returns a pointer to the error_ptr associated with the user * functions. The application should free any memory associated with this * pointer before png_write_destroy and png_read_destroy are called. */ png_voidp PNGAPI png_get_error_ptr(png_structp png_ptr) { return ((png_voidp)png_ptr->error_ptr); } #ifdef PNG_ERROR_NUMBERS_SUPPORTED void PNGAPI png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) { if(png_ptr != NULL) { png_ptr->flags &= ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); } } #endif gamera-3.3.3/src/libpng-1.2.5/pnggccrd.c0000644000076500000000000071234610714675701016425 0ustar chriswheel/* pnggccrd.c - mixed C/assembler version of utilities to read a PNG file * * For Intel x86 CPU (Pentium-MMX or later) and GNU C compiler. * * See http://www.intel.com/drg/pentiumII/appnotes/916/916.htm * and http://www.intel.com/drg/pentiumII/appnotes/923/923.htm * for Intel's performance analysis of the MMX vs. non-MMX code. * * libpng version 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * Copyright (c) 1998, Intel Corporation * * Based on MSVC code contributed by Nirav Chhatrapati, Intel Corp., 1998. * Interface to libpng contributed by Gilles Vollant, 1999. * GNU C port by Greg Roelofs, 1999-2001. * * Lines 2350-4300 converted in place with intel2gas 1.3.1: * * intel2gas -mdI pnggccrd.c.partially-msvc -o pnggccrd.c * * and then cleaned up by hand. See http://hermes.terminal.at/intel2gas/ . * * NOTE: A sufficiently recent version of GNU as (or as.exe under DOS/Windows) * is required to assemble the newer MMX instructions such as movq. * For djgpp, see * * ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bnu281b.zip * * (or a later version in the same directory). For Linux, check your * distribution's web site(s) or try these links: * * http://rufus.w3.org/linux/RPM/binutils.html * http://www.debian.org/Packages/stable/devel/binutils.html * ftp://ftp.slackware.com/pub/linux/slackware/slackware/slakware/d1/ * binutils.tgz * * For other platforms, see the main GNU site: * * ftp://ftp.gnu.org/pub/gnu/binutils/ * * Version 2.5.2l.15 is definitely too old... */ /* * TEMPORARY PORTING NOTES AND CHANGELOG (mostly by Greg Roelofs) * ===================================== * * 19991006: * - fixed sign error in post-MMX cleanup code (16- & 32-bit cases) * * 19991007: * - additional optimizations (possible or definite): * x [DONE] write MMX code for 64-bit case (pixel_bytes == 8) [not tested] * - write MMX code for 48-bit case (pixel_bytes == 6) * - figure out what's up with 24-bit case (pixel_bytes == 3): * why subtract 8 from width_mmx in the pass 4/5 case? * (only width_mmx case) (near line 1606) * x [DONE] replace pixel_bytes within each block with the true * constant value (or are compilers smart enough to do that?) * - rewrite all MMX interlacing code so it's aligned with * the *beginning* of the row buffer, not the end. This * would not only allow one to eliminate half of the memory * writes for odd passes (that is, pass == odd), it may also * eliminate some unaligned-data-access exceptions (assuming * there's a penalty for not aligning 64-bit accesses on * 64-bit boundaries). The only catch is that the "leftover" * pixel(s) at the end of the row would have to be saved, * but there are enough unused MMX registers in every case, * so this is not a problem. A further benefit is that the * post-MMX cleanup code (C code) in at least some of the * cases could be done within the assembler block. * x [DONE] the "v3 v2 v1 v0 v7 v6 v5 v4" comments are confusing, * inconsistent, and don't match the MMX Programmer's Reference * Manual conventions anyway. They should be changed to * "b7 b6 b5 b4 b3 b2 b1 b0," where b0 indicates the byte that * was lowest in memory (e.g., corresponding to a left pixel) * and b7 is the byte that was highest (e.g., a right pixel). * * 19991016: * - Brennan's Guide notwithstanding, gcc under Linux does *not* * want globals prefixed by underscores when referencing them-- * i.e., if the variable is const4, then refer to it as const4, * not _const4. This seems to be a djgpp-specific requirement. * Also, such variables apparently *must* be declared outside * of functions; neither static nor automatic variables work if * defined within the scope of a single function, but both * static and truly global (multi-module) variables work fine. * * 19991023: * - fixed png_combine_row() non-MMX replication bug (odd passes only?) * - switched from string-concatenation-with-macros to cleaner method of * renaming global variables for djgpp--i.e., always use prefixes in * inlined assembler code (== strings) and conditionally rename the * variables, not the other way around. Hence _const4, _mask8_0, etc. * * 19991024: * - fixed mmxsupport()/png_do_read_interlace() first-row bug * This one was severely weird: even though mmxsupport() doesn't touch * ebx (where "row" pointer was stored), it nevertheless managed to zero * the register (even in static/non-fPIC code--see below), which in turn * caused png_do_read_interlace() to return prematurely on the first row of * interlaced images (i.e., without expanding the interlaced pixels). * Inspection of the generated assembly code didn't turn up any clues, * although it did point at a minor optimization (i.e., get rid of * mmx_supported_local variable and just use eax). Possibly the CPUID * instruction is more destructive than it looks? (Not yet checked.) * - "info gcc" was next to useless, so compared fPIC and non-fPIC assembly * listings... Apparently register spillage has to do with ebx, since * it's used to index the global offset table. Commenting it out of the * input-reg lists in png_combine_row() eliminated compiler barfage, so * ifdef'd with __PIC__ macro: if defined, use a global for unmask * * 19991107: * - verified CPUID clobberage: 12-char string constant ("GenuineIntel", * "AuthenticAMD", etc.) placed in ebx:ecx:edx. Still need to polish. * * 19991120: * - made "diff" variable (now "_dif") global to simplify conversion of * filtering routines (running out of regs, sigh). "diff" is still used * in interlacing routines, however. * - fixed up both versions of mmxsupport() (ORIG_THAT_USED_TO_CLOBBER_EBX * macro determines which is used); original not yet tested. * * 20000213: * - when compiling with gcc, be sure to use -fomit-frame-pointer * * 20000319: * - fixed a register-name typo in png_do_read_interlace(), default (MMX) case, * pass == 4 or 5, that caused visible corruption of interlaced images * * 20000623: * - Various problems were reported with gcc 2.95.2 in the Cygwin environment, * many of the form "forbidden register 0 (ax) was spilled for class AREG." * This is explained at http://gcc.gnu.org/fom_serv/cache/23.html, and * Chuck Wilson supplied a patch involving dummy output registers. See * http://sourceforge.net/bugs/?func=detailbug&bug_id=108741&group_id=5624 * for the original (anonymous) SourceForge bug report. * * 20000706: * - Chuck Wilson passed along these remaining gcc 2.95.2 errors: * pnggccrd.c: In function `png_combine_row': * pnggccrd.c:525: more than 10 operands in `asm' * pnggccrd.c:669: more than 10 operands in `asm' * pnggccrd.c:828: more than 10 operands in `asm' * pnggccrd.c:994: more than 10 operands in `asm' * pnggccrd.c:1177: more than 10 operands in `asm' * They are all the same problem and can be worked around by using the * global _unmask variable unconditionally, not just in the -fPIC case. * Reportedly earlier versions of gcc also have the problem with more than * 10 operands; they just don't report it. Much strangeness ensues, etc. * * 20000729: * - enabled png_read_filter_row_mmx_up() (shortest remaining unconverted * MMX routine); began converting png_read_filter_row_mmx_sub() * - to finish remaining sections: * - clean up indentation and comments * - preload local variables * - add output and input regs (order of former determines numerical * mapping of latter) * - avoid all usage of ebx (including bx, bh, bl) register [20000823] * - remove "$" from addressing of Shift and Mask variables [20000823] * * 20000731: * - global union vars causing segfaults in png_read_filter_row_mmx_sub()? * * 20000822: * - ARGH, stupid png_read_filter_row_mmx_sub() segfault only happens with * shared-library (-fPIC) version! Code works just fine as part of static * library. Damn damn damn damn damn, should have tested that sooner. * ebx is getting clobbered again (explicitly this time); need to save it * on stack or rewrite asm code to avoid using it altogether. Blargh! * * 20000823: * - first section was trickiest; all remaining sections have ebx -> edx now. * (-fPIC works again.) Also added missing underscores to various Shift* * and *Mask* globals and got rid of leading "$" signs. * * 20000826: * - added visual separators to help navigate microscopic printed copies * (http://pobox.com/~newt/code/gpr-latest.zip, mode 10); started working * on png_read_filter_row_mmx_avg() * * 20000828: * - finished png_read_filter_row_mmx_avg(): only Paeth left! (930 lines...) * What the hell, did png_read_filter_row_mmx_paeth(), too. Comments not * cleaned up/shortened in either routine, but functionality is complete * and seems to be working fine. * * 20000829: * - ahhh, figured out last(?) bit of gcc/gas asm-fu: if register is listed * as an input reg (with dummy output variables, etc.), then it *cannot* * also appear in the clobber list or gcc 2.95.2 will barf. The solution * is simple enough... * * 20000914: * - bug in png_read_filter_row_mmx_avg(): 16-bit grayscale not handled * correctly (but 48-bit RGB just fine) * * 20000916: * - fixed bug in png_read_filter_row_mmx_avg(), bpp == 2 case; three errors: * - "_ShiftBpp.use = 24;" should have been "_ShiftBpp.use = 16;" * - "_ShiftRem.use = 40;" should have been "_ShiftRem.use = 48;" * - "psllq _ShiftRem, %%mm2" should have been "psrlq _ShiftRem, %%mm2" * * 20010101: * - added new png_init_mmx_flags() function (here only because it needs to * call mmxsupport(), which should probably become global png_mmxsupport()); * modified other MMX routines to run conditionally (png_ptr->asm_flags) * * 20010103: * - renamed mmxsupport() to png_mmx_support(), with auto-set of mmx_supported, * and made it public; moved png_init_mmx_flags() to png.c as internal func * * 20010104: * - removed dependency on png_read_filter_row_c() (C code already duplicated * within MMX version of png_read_filter_row()) so no longer necessary to * compile it into pngrutil.o * * 20010310: * - fixed buffer-overrun bug in png_combine_row() C code (non-MMX) * * 20020304: * - eliminated incorrect use of width_mmx in pixel_bytes == 8 case * * STILL TO DO: * - test png_do_read_interlace() 64-bit case (pixel_bytes == 8) * - write MMX code for 48-bit case (pixel_bytes == 6) * - figure out what's up with 24-bit case (pixel_bytes == 3): * why subtract 8 from width_mmx in the pass 4/5 case? * (only width_mmx case) (near line 1606) * - rewrite all MMX interlacing code so it's aligned with beginning * of the row buffer, not the end (see 19991007 for details) * x pick one version of mmxsupport() and get rid of the other * - add error messages to any remaining bogus default cases * - enable pixel_depth == 8 cases in png_read_filter_row()? (test speed) * x add support for runtime enable/disable/query of various MMX routines */ #define PNG_INTERNAL #include "png.h" #if defined(PNG_USE_PNGGCCRD) int PNGAPI png_mmx_support(void); #ifdef PNG_USE_LOCAL_ARRAYS static const int FARDATA png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; static const int FARDATA png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; static const int FARDATA png_pass_width[7] = {8, 4, 4, 2, 2, 1, 1}; #endif #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) /* djgpp, Win32, and Cygwin add their own underscores to global variables, * so define them without: */ #if defined(__DJGPP__) || defined(WIN32) || defined(__CYGWIN__) # define _mmx_supported mmx_supported # define _const4 const4 # define _const6 const6 # define _mask8_0 mask8_0 # define _mask16_1 mask16_1 # define _mask16_0 mask16_0 # define _mask24_2 mask24_2 # define _mask24_1 mask24_1 # define _mask24_0 mask24_0 # define _mask32_3 mask32_3 # define _mask32_2 mask32_2 # define _mask32_1 mask32_1 # define _mask32_0 mask32_0 # define _mask48_5 mask48_5 # define _mask48_4 mask48_4 # define _mask48_3 mask48_3 # define _mask48_2 mask48_2 # define _mask48_1 mask48_1 # define _mask48_0 mask48_0 # define _LBCarryMask LBCarryMask # define _HBClearMask HBClearMask # define _ActiveMask ActiveMask # define _ActiveMask2 ActiveMask2 # define _ActiveMaskEnd ActiveMaskEnd # define _ShiftBpp ShiftBpp # define _ShiftRem ShiftRem #ifdef PNG_THREAD_UNSAFE_OK # define _unmask unmask # define _FullLength FullLength # define _MMXLength MMXLength # define _dif dif # define _patemp patemp # define _pbtemp pbtemp # define _pctemp pctemp #endif #endif /* These constants are used in the inlined MMX assembly code. Ignore gcc's "At top level: defined but not used" warnings. */ /* GRR 20000706: originally _unmask was needed only when compiling with -fPIC, * since that case uses the %ebx register for indexing the Global Offset Table * and there were no other registers available. But gcc 2.95 and later emit * "more than 10 operands in `asm'" errors when %ebx is used to preload unmask * in the non-PIC case, so we'll just use the global unconditionally now. */ #ifdef PNG_THREAD_UNSAFE_OK static int _unmask; #endif static unsigned long long _mask8_0 = 0x0102040810204080LL; static unsigned long long _mask16_1 = 0x0101020204040808LL; static unsigned long long _mask16_0 = 0x1010202040408080LL; static unsigned long long _mask24_2 = 0x0101010202020404LL; static unsigned long long _mask24_1 = 0x0408080810101020LL; static unsigned long long _mask24_0 = 0x2020404040808080LL; static unsigned long long _mask32_3 = 0x0101010102020202LL; static unsigned long long _mask32_2 = 0x0404040408080808LL; static unsigned long long _mask32_1 = 0x1010101020202020LL; static unsigned long long _mask32_0 = 0x4040404080808080LL; static unsigned long long _mask48_5 = 0x0101010101010202LL; static unsigned long long _mask48_4 = 0x0202020204040404LL; static unsigned long long _mask48_3 = 0x0404080808080808LL; static unsigned long long _mask48_2 = 0x1010101010102020LL; static unsigned long long _mask48_1 = 0x2020202040404040LL; static unsigned long long _mask48_0 = 0x4040808080808080LL; static unsigned long long _const4 = 0x0000000000FFFFFFLL; //static unsigned long long _const5 = 0x000000FFFFFF0000LL; // NOT USED static unsigned long long _const6 = 0x00000000000000FFLL; // These are used in the row-filter routines and should/would be local // variables if not for gcc addressing limitations. // WARNING: Their presence probably defeats the thread safety of libpng. #ifdef PNG_THREAD_UNSAFE_OK static png_uint_32 _FullLength; static png_uint_32 _MMXLength; static int _dif; static int _patemp; // temp variables for Paeth routine static int _pbtemp; static int _pctemp; #endif void /* PRIVATE */ png_squelch_warnings(void) { #ifdef PNG_THREAD_UNSAFE_OK _dif = _dif; _patemp = _patemp; _pbtemp = _pbtemp; _pctemp = _pctemp; _MMXLength = _MMXLength; #endif _const4 = _const4; _const6 = _const6; _mask8_0 = _mask8_0; _mask16_1 = _mask16_1; _mask16_0 = _mask16_0; _mask24_2 = _mask24_2; _mask24_1 = _mask24_1; _mask24_0 = _mask24_0; _mask32_3 = _mask32_3; _mask32_2 = _mask32_2; _mask32_1 = _mask32_1; _mask32_0 = _mask32_0; _mask48_5 = _mask48_5; _mask48_4 = _mask48_4; _mask48_3 = _mask48_3; _mask48_2 = _mask48_2; _mask48_1 = _mask48_1; _mask48_0 = _mask48_0; } #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ static int _mmx_supported = 2; /*===========================================================================*/ /* */ /* P N G _ C O M B I N E _ R O W */ /* */ /*===========================================================================*/ #if defined(PNG_HAVE_ASSEMBLER_COMBINE_ROW) #define BPP2 2 #define BPP3 3 /* bytes per pixel (a.k.a. pixel_bytes) */ #define BPP4 4 #define BPP6 6 /* (defined only to help avoid cut-and-paste errors) */ #define BPP8 8 /* Combines the row recently read in with the previous row. This routine takes care of alpha and transparency if requested. This routine also handles the two methods of progressive display of interlaced images, depending on the mask value. The mask value describes which pixels are to be combined with the row. The pattern always repeats every 8 pixels, so just 8 bits are needed. A one indicates the pixel is to be combined; a zero indicates the pixel is to be skipped. This is in addition to any alpha or transparency value associated with the pixel. If you want all pixels to be combined, pass 0xff (255) in mask. */ /* Use this routine for the x86 platform - it uses a faster MMX routine if the machine supports MMX. */ void /* PRIVATE */ png_combine_row(png_structp png_ptr, png_bytep row, int mask) { png_debug(1, "in png_combine_row (pnggccrd.c)\n"); #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) if (_mmx_supported == 2) { /* this should have happened in png_init_mmx_flags() already */ png_warning(png_ptr, "asm_flags may not have been initialized"); png_mmx_support(); } #endif if (mask == 0xff) { png_debug(2,"mask == 0xff: doing single png_memcpy()\n"); png_memcpy(row, png_ptr->row_buf + 1, (png_size_t)((png_ptr->width * png_ptr->row_info.pixel_depth + 7) >> 3)); } else /* (png_combine_row() is never called with mask == 0) */ { switch (png_ptr->row_info.pixel_depth) { case 1: /* png_ptr->row_info.pixel_depth */ { png_bytep sp; png_bytep dp; int s_inc, s_start, s_end; int m; int shift; png_uint_32 i; sp = png_ptr->row_buf + 1; dp = row; m = 0x80; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 7; s_inc = 1; } else #endif { s_start = 7; s_end = 0; s_inc = -1; } shift = s_start; for (i = 0; i < png_ptr->width; i++) { if (m & mask) { int value; value = (*sp >> shift) & 0x1; *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } case 2: /* png_ptr->row_info.pixel_depth */ { png_bytep sp; png_bytep dp; int s_start, s_end, s_inc; int m; int shift; png_uint_32 i; int value; sp = png_ptr->row_buf + 1; dp = row; m = 0x80; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 6; s_inc = 2; } else #endif { s_start = 6; s_end = 0; s_inc = -2; } shift = s_start; for (i = 0; i < png_ptr->width; i++) { if (m & mask) { value = (*sp >> shift) & 0x3; *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } case 4: /* png_ptr->row_info.pixel_depth */ { png_bytep sp; png_bytep dp; int s_start, s_end, s_inc; int m; int shift; png_uint_32 i; int value; sp = png_ptr->row_buf + 1; dp = row; m = 0x80; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 4; s_inc = 4; } else #endif { s_start = 4; s_end = 0; s_inc = -4; } shift = s_start; for (i = 0; i < png_ptr->width; i++) { if (m & mask) { value = (*sp >> shift) & 0xf; *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } case 8: /* png_ptr->row_info.pixel_depth */ { png_bytep srcptr; png_bytep dstptr; #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && _mmx_supported */ ) #else if (_mmx_supported) #endif { png_uint_32 len; int diff; int dummy_value_a; // fix 'forbidden register spilled' error int dummy_value_d; int dummy_value_c; int dummy_value_S; int dummy_value_D; _unmask = ~mask; // global variable for -fPIC version srcptr = png_ptr->row_buf + 1; dstptr = row; len = png_ptr->width &~7; // reduce to multiple of 8 diff = (int) (png_ptr->width & 7); // amount lost __asm__ __volatile__ ( "movd _unmask, %%mm7 \n\t" // load bit pattern "psubb %%mm6, %%mm6 \n\t" // zero mm6 "punpcklbw %%mm7, %%mm7 \n\t" "punpcklwd %%mm7, %%mm7 \n\t" "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks "movq _mask8_0, %%mm0 \n\t" "pand %%mm7, %%mm0 \n\t" // nonzero if keep byte "pcmpeqb %%mm6, %%mm0 \n\t" // zeros->1s, v versa // preload "movl len, %%ecx \n\t" // load length of line // preload "movl srcptr, %%esi \n\t" // load source // preload "movl dstptr, %%edi \n\t" // load dest "cmpl $0, %%ecx \n\t" // len == 0 ? "je mainloop8end \n\t" "mainloop8: \n\t" "movq (%%esi), %%mm4 \n\t" // *srcptr "pand %%mm0, %%mm4 \n\t" "movq %%mm0, %%mm6 \n\t" "pandn (%%edi), %%mm6 \n\t" // *dstptr "por %%mm6, %%mm4 \n\t" "movq %%mm4, (%%edi) \n\t" "addl $8, %%esi \n\t" // inc by 8 bytes processed "addl $8, %%edi \n\t" "subl $8, %%ecx \n\t" // dec by 8 pixels processed "ja mainloop8 \n\t" "mainloop8end: \n\t" // preload "movl diff, %%ecx \n\t" // (diff is in eax) "movl %%eax, %%ecx \n\t" "cmpl $0, %%ecx \n\t" "jz end8 \n\t" // preload "movl mask, %%edx \n\t" "sall $24, %%edx \n\t" // make low byte, high byte "secondloop8: \n\t" "sall %%edx \n\t" // move high bit to CF "jnc skip8 \n\t" // if CF = 0 "movb (%%esi), %%al \n\t" "movb %%al, (%%edi) \n\t" "skip8: \n\t" "incl %%esi \n\t" "incl %%edi \n\t" "decl %%ecx \n\t" "jnz secondloop8 \n\t" "end8: \n\t" "EMMS \n\t" // DONE : "=a" (dummy_value_a), // output regs (dummy) "=d" (dummy_value_d), "=c" (dummy_value_c), "=S" (dummy_value_S), "=D" (dummy_value_D) : "3" (srcptr), // esi // input regs "4" (dstptr), // edi "0" (diff), // eax // was (unmask) "b" RESERVED // ebx // Global Offset Table idx "2" (len), // ecx "1" (mask) // edx #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm4", "%mm6", "%mm7" // clobber list #endif ); } else /* mmx _not supported - Use modified C routine */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { register png_uint_32 i; png_uint_32 initial_val = png_pass_start[png_ptr->pass]; /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ register int stride = png_pass_inc[png_ptr->pass]; /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ register int rep_bytes = png_pass_width[png_ptr->pass]; /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ int diff = (int) (png_ptr->width & 7); /* amount lost */ register png_uint_32 final_val = len; /* GRR bugfix */ srcptr = png_ptr->row_buf + 1 + initial_val; dstptr = row + initial_val; for (i = initial_val; i < final_val; i += stride) { png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } if (diff) /* number of leftover pixels: 3 for pngtest */ { final_val+=diff /* *BPP1 */ ; for (; i < final_val; i += stride) { if (rep_bytes > (int)(final_val-i)) rep_bytes = (int)(final_val-i); png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } } } /* end of else (_mmx_supported) */ break; } /* end 8 bpp */ case 16: /* png_ptr->row_info.pixel_depth */ { png_bytep srcptr; png_bytep dstptr; #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && _mmx_supported */ ) #else if (_mmx_supported) #endif { png_uint_32 len; int diff; int dummy_value_a; // fix 'forbidden register spilled' error int dummy_value_d; int dummy_value_c; int dummy_value_S; int dummy_value_D; _unmask = ~mask; // global variable for -fPIC version srcptr = png_ptr->row_buf + 1; dstptr = row; len = png_ptr->width &~7; // reduce to multiple of 8 diff = (int) (png_ptr->width & 7); // amount lost // __asm__ __volatile__ ( "movd _unmask, %%mm7 \n\t" // load bit pattern "psubb %%mm6, %%mm6 \n\t" // zero mm6 "punpcklbw %%mm7, %%mm7 \n\t" "punpcklwd %%mm7, %%mm7 \n\t" "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks "movq _mask16_0, %%mm0 \n\t" "movq _mask16_1, %%mm1 \n\t" "pand %%mm7, %%mm0 \n\t" "pand %%mm7, %%mm1 \n\t" "pcmpeqb %%mm6, %%mm0 \n\t" "pcmpeqb %%mm6, %%mm1 \n\t" // preload "movl len, %%ecx \n\t" // load length of line // preload "movl srcptr, %%esi \n\t" // load source // preload "movl dstptr, %%edi \n\t" // load dest "cmpl $0, %%ecx \n\t" "jz mainloop16end \n\t" "mainloop16: \n\t" "movq (%%esi), %%mm4 \n\t" "pand %%mm0, %%mm4 \n\t" "movq %%mm0, %%mm6 \n\t" "movq (%%edi), %%mm7 \n\t" "pandn %%mm7, %%mm6 \n\t" "por %%mm6, %%mm4 \n\t" "movq %%mm4, (%%edi) \n\t" "movq 8(%%esi), %%mm5 \n\t" "pand %%mm1, %%mm5 \n\t" "movq %%mm1, %%mm7 \n\t" "movq 8(%%edi), %%mm6 \n\t" "pandn %%mm6, %%mm7 \n\t" "por %%mm7, %%mm5 \n\t" "movq %%mm5, 8(%%edi) \n\t" "addl $16, %%esi \n\t" // inc by 16 bytes processed "addl $16, %%edi \n\t" "subl $8, %%ecx \n\t" // dec by 8 pixels processed "ja mainloop16 \n\t" "mainloop16end: \n\t" // preload "movl diff, %%ecx \n\t" // (diff is in eax) "movl %%eax, %%ecx \n\t" "cmpl $0, %%ecx \n\t" "jz end16 \n\t" // preload "movl mask, %%edx \n\t" "sall $24, %%edx \n\t" // make low byte, high byte "secondloop16: \n\t" "sall %%edx \n\t" // move high bit to CF "jnc skip16 \n\t" // if CF = 0 "movw (%%esi), %%ax \n\t" "movw %%ax, (%%edi) \n\t" "skip16: \n\t" "addl $2, %%esi \n\t" "addl $2, %%edi \n\t" "decl %%ecx \n\t" "jnz secondloop16 \n\t" "end16: \n\t" "EMMS \n\t" // DONE : "=a" (dummy_value_a), // output regs (dummy) "=c" (dummy_value_c), "=d" (dummy_value_d), "=S" (dummy_value_S), "=D" (dummy_value_D) : "0" (diff), // eax // input regs // was (unmask) " " RESERVED // ebx // Global Offset Table idx "1" (len), // ecx "2" (mask), // edx "3" (srcptr), // esi "4" (dstptr) // edi #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1", "%mm4" // clobber list , "%mm5", "%mm6", "%mm7" #endif ); } else /* mmx _not supported - Use modified C routine */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { register png_uint_32 i; png_uint_32 initial_val = BPP2 * png_pass_start[png_ptr->pass]; /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ register int stride = BPP2 * png_pass_inc[png_ptr->pass]; /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ register int rep_bytes = BPP2 * png_pass_width[png_ptr->pass]; /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ int diff = (int) (png_ptr->width & 7); /* amount lost */ register png_uint_32 final_val = BPP2 * len; /* GRR bugfix */ srcptr = png_ptr->row_buf + 1 + initial_val; dstptr = row + initial_val; for (i = initial_val; i < final_val; i += stride) { png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } if (diff) /* number of leftover pixels: 3 for pngtest */ { final_val+=diff*BPP2; for (; i < final_val; i += stride) { if (rep_bytes > (int)(final_val-i)) rep_bytes = (int)(final_val-i); png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } } } /* end of else (_mmx_supported) */ break; } /* end 16 bpp */ case 24: /* png_ptr->row_info.pixel_depth */ { png_bytep srcptr; png_bytep dstptr; #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && _mmx_supported */ ) #else if (_mmx_supported) #endif { png_uint_32 len; int diff; int dummy_value_a; // fix 'forbidden register spilled' error int dummy_value_d; int dummy_value_c; int dummy_value_S; int dummy_value_D; _unmask = ~mask; // global variable for -fPIC version srcptr = png_ptr->row_buf + 1; dstptr = row; len = png_ptr->width &~7; // reduce to multiple of 8 diff = (int) (png_ptr->width & 7); // amount lost // __asm__ __volatile__ ( "movd _unmask, %%mm7 \n\t" // load bit pattern "psubb %%mm6, %%mm6 \n\t" // zero mm6 "punpcklbw %%mm7, %%mm7 \n\t" "punpcklwd %%mm7, %%mm7 \n\t" "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks "movq _mask24_0, %%mm0 \n\t" "movq _mask24_1, %%mm1 \n\t" "movq _mask24_2, %%mm2 \n\t" "pand %%mm7, %%mm0 \n\t" "pand %%mm7, %%mm1 \n\t" "pand %%mm7, %%mm2 \n\t" "pcmpeqb %%mm6, %%mm0 \n\t" "pcmpeqb %%mm6, %%mm1 \n\t" "pcmpeqb %%mm6, %%mm2 \n\t" // preload "movl len, %%ecx \n\t" // load length of line // preload "movl srcptr, %%esi \n\t" // load source // preload "movl dstptr, %%edi \n\t" // load dest "cmpl $0, %%ecx \n\t" "jz mainloop24end \n\t" "mainloop24: \n\t" "movq (%%esi), %%mm4 \n\t" "pand %%mm0, %%mm4 \n\t" "movq %%mm0, %%mm6 \n\t" "movq (%%edi), %%mm7 \n\t" "pandn %%mm7, %%mm6 \n\t" "por %%mm6, %%mm4 \n\t" "movq %%mm4, (%%edi) \n\t" "movq 8(%%esi), %%mm5 \n\t" "pand %%mm1, %%mm5 \n\t" "movq %%mm1, %%mm7 \n\t" "movq 8(%%edi), %%mm6 \n\t" "pandn %%mm6, %%mm7 \n\t" "por %%mm7, %%mm5 \n\t" "movq %%mm5, 8(%%edi) \n\t" "movq 16(%%esi), %%mm6 \n\t" "pand %%mm2, %%mm6 \n\t" "movq %%mm2, %%mm4 \n\t" "movq 16(%%edi), %%mm7 \n\t" "pandn %%mm7, %%mm4 \n\t" "por %%mm4, %%mm6 \n\t" "movq %%mm6, 16(%%edi) \n\t" "addl $24, %%esi \n\t" // inc by 24 bytes processed "addl $24, %%edi \n\t" "subl $8, %%ecx \n\t" // dec by 8 pixels processed "ja mainloop24 \n\t" "mainloop24end: \n\t" // preload "movl diff, %%ecx \n\t" // (diff is in eax) "movl %%eax, %%ecx \n\t" "cmpl $0, %%ecx \n\t" "jz end24 \n\t" // preload "movl mask, %%edx \n\t" "sall $24, %%edx \n\t" // make low byte, high byte "secondloop24: \n\t" "sall %%edx \n\t" // move high bit to CF "jnc skip24 \n\t" // if CF = 0 "movw (%%esi), %%ax \n\t" "movw %%ax, (%%edi) \n\t" "xorl %%eax, %%eax \n\t" "movb 2(%%esi), %%al \n\t" "movb %%al, 2(%%edi) \n\t" "skip24: \n\t" "addl $3, %%esi \n\t" "addl $3, %%edi \n\t" "decl %%ecx \n\t" "jnz secondloop24 \n\t" "end24: \n\t" "EMMS \n\t" // DONE : "=a" (dummy_value_a), // output regs (dummy) "=d" (dummy_value_d), "=c" (dummy_value_c), "=S" (dummy_value_S), "=D" (dummy_value_D) : "3" (srcptr), // esi // input regs "4" (dstptr), // edi "0" (diff), // eax // was (unmask) "b" RESERVED // ebx // Global Offset Table idx "2" (len), // ecx "1" (mask) // edx #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1", "%mm2" // clobber list , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } else /* mmx _not supported - Use modified C routine */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { register png_uint_32 i; png_uint_32 initial_val = BPP3 * png_pass_start[png_ptr->pass]; /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ register int stride = BPP3 * png_pass_inc[png_ptr->pass]; /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ register int rep_bytes = BPP3 * png_pass_width[png_ptr->pass]; /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ int diff = (int) (png_ptr->width & 7); /* amount lost */ register png_uint_32 final_val = BPP3 * len; /* GRR bugfix */ srcptr = png_ptr->row_buf + 1 + initial_val; dstptr = row + initial_val; for (i = initial_val; i < final_val; i += stride) { png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } if (diff) /* number of leftover pixels: 3 for pngtest */ { final_val+=diff*BPP3; for (; i < final_val; i += stride) { if (rep_bytes > (int)(final_val-i)) rep_bytes = (int)(final_val-i); png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } } } /* end of else (_mmx_supported) */ break; } /* end 24 bpp */ case 32: /* png_ptr->row_info.pixel_depth */ { png_bytep srcptr; png_bytep dstptr; #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && _mmx_supported */ ) #else if (_mmx_supported) #endif { png_uint_32 len; int diff; int dummy_value_a; // fix 'forbidden register spilled' error int dummy_value_d; int dummy_value_c; int dummy_value_S; int dummy_value_D; _unmask = ~mask; // global variable for -fPIC version srcptr = png_ptr->row_buf + 1; dstptr = row; len = png_ptr->width &~7; // reduce to multiple of 8 diff = (int) (png_ptr->width & 7); // amount lost // __asm__ __volatile__ ( "movd _unmask, %%mm7 \n\t" // load bit pattern "psubb %%mm6, %%mm6 \n\t" // zero mm6 "punpcklbw %%mm7, %%mm7 \n\t" "punpcklwd %%mm7, %%mm7 \n\t" "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks "movq _mask32_0, %%mm0 \n\t" "movq _mask32_1, %%mm1 \n\t" "movq _mask32_2, %%mm2 \n\t" "movq _mask32_3, %%mm3 \n\t" "pand %%mm7, %%mm0 \n\t" "pand %%mm7, %%mm1 \n\t" "pand %%mm7, %%mm2 \n\t" "pand %%mm7, %%mm3 \n\t" "pcmpeqb %%mm6, %%mm0 \n\t" "pcmpeqb %%mm6, %%mm1 \n\t" "pcmpeqb %%mm6, %%mm2 \n\t" "pcmpeqb %%mm6, %%mm3 \n\t" // preload "movl len, %%ecx \n\t" // load length of line // preload "movl srcptr, %%esi \n\t" // load source // preload "movl dstptr, %%edi \n\t" // load dest "cmpl $0, %%ecx \n\t" // lcr "jz mainloop32end \n\t" "mainloop32: \n\t" "movq (%%esi), %%mm4 \n\t" "pand %%mm0, %%mm4 \n\t" "movq %%mm0, %%mm6 \n\t" "movq (%%edi), %%mm7 \n\t" "pandn %%mm7, %%mm6 \n\t" "por %%mm6, %%mm4 \n\t" "movq %%mm4, (%%edi) \n\t" "movq 8(%%esi), %%mm5 \n\t" "pand %%mm1, %%mm5 \n\t" "movq %%mm1, %%mm7 \n\t" "movq 8(%%edi), %%mm6 \n\t" "pandn %%mm6, %%mm7 \n\t" "por %%mm7, %%mm5 \n\t" "movq %%mm5, 8(%%edi) \n\t" "movq 16(%%esi), %%mm6 \n\t" "pand %%mm2, %%mm6 \n\t" "movq %%mm2, %%mm4 \n\t" "movq 16(%%edi), %%mm7 \n\t" "pandn %%mm7, %%mm4 \n\t" "por %%mm4, %%mm6 \n\t" "movq %%mm6, 16(%%edi) \n\t" "movq 24(%%esi), %%mm7 \n\t" "pand %%mm3, %%mm7 \n\t" "movq %%mm3, %%mm5 \n\t" "movq 24(%%edi), %%mm4 \n\t" "pandn %%mm4, %%mm5 \n\t" "por %%mm5, %%mm7 \n\t" "movq %%mm7, 24(%%edi) \n\t" "addl $32, %%esi \n\t" // inc by 32 bytes processed "addl $32, %%edi \n\t" "subl $8, %%ecx \n\t" // dec by 8 pixels processed "ja mainloop32 \n\t" "mainloop32end: \n\t" // preload "movl diff, %%ecx \n\t" // (diff is in eax) "movl %%eax, %%ecx \n\t" "cmpl $0, %%ecx \n\t" "jz end32 \n\t" // preload "movl mask, %%edx \n\t" "sall $24, %%edx \n\t" // low byte => high byte "secondloop32: \n\t" "sall %%edx \n\t" // move high bit to CF "jnc skip32 \n\t" // if CF = 0 "movl (%%esi), %%eax \n\t" "movl %%eax, (%%edi) \n\t" "skip32: \n\t" "addl $4, %%esi \n\t" "addl $4, %%edi \n\t" "decl %%ecx \n\t" "jnz secondloop32 \n\t" "end32: \n\t" "EMMS \n\t" // DONE : "=a" (dummy_value_a), // output regs (dummy) "=d" (dummy_value_d), "=c" (dummy_value_c), "=S" (dummy_value_S), "=D" (dummy_value_D) : "3" (srcptr), // esi // input regs "4" (dstptr), // edi "0" (diff), // eax // was (unmask) "b" RESERVED // ebx // Global Offset Table idx "2" (len), // ecx "1" (mask) // edx #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1", "%mm2", "%mm3" // clobber list , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } else /* mmx _not supported - Use modified C routine */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { register png_uint_32 i; png_uint_32 initial_val = BPP4 * png_pass_start[png_ptr->pass]; /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ register int stride = BPP4 * png_pass_inc[png_ptr->pass]; /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ register int rep_bytes = BPP4 * png_pass_width[png_ptr->pass]; /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ int diff = (int) (png_ptr->width & 7); /* amount lost */ register png_uint_32 final_val = BPP4 * len; /* GRR bugfix */ srcptr = png_ptr->row_buf + 1 + initial_val; dstptr = row + initial_val; for (i = initial_val; i < final_val; i += stride) { png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } if (diff) /* number of leftover pixels: 3 for pngtest */ { final_val+=diff*BPP4; for (; i < final_val; i += stride) { if (rep_bytes > (int)(final_val-i)) rep_bytes = (int)(final_val-i); png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } } } /* end of else (_mmx_supported) */ break; } /* end 32 bpp */ case 48: /* png_ptr->row_info.pixel_depth */ { png_bytep srcptr; png_bytep dstptr; #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && _mmx_supported */ ) #else if (_mmx_supported) #endif { png_uint_32 len; int diff; int dummy_value_a; // fix 'forbidden register spilled' error int dummy_value_d; int dummy_value_c; int dummy_value_S; int dummy_value_D; _unmask = ~mask; // global variable for -fPIC version srcptr = png_ptr->row_buf + 1; dstptr = row; len = png_ptr->width &~7; // reduce to multiple of 8 diff = (int) (png_ptr->width & 7); // amount lost // __asm__ __volatile__ ( "movd _unmask, %%mm7 \n\t" // load bit pattern "psubb %%mm6, %%mm6 \n\t" // zero mm6 "punpcklbw %%mm7, %%mm7 \n\t" "punpcklwd %%mm7, %%mm7 \n\t" "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks "movq _mask48_0, %%mm0 \n\t" "movq _mask48_1, %%mm1 \n\t" "movq _mask48_2, %%mm2 \n\t" "movq _mask48_3, %%mm3 \n\t" "movq _mask48_4, %%mm4 \n\t" "movq _mask48_5, %%mm5 \n\t" "pand %%mm7, %%mm0 \n\t" "pand %%mm7, %%mm1 \n\t" "pand %%mm7, %%mm2 \n\t" "pand %%mm7, %%mm3 \n\t" "pand %%mm7, %%mm4 \n\t" "pand %%mm7, %%mm5 \n\t" "pcmpeqb %%mm6, %%mm0 \n\t" "pcmpeqb %%mm6, %%mm1 \n\t" "pcmpeqb %%mm6, %%mm2 \n\t" "pcmpeqb %%mm6, %%mm3 \n\t" "pcmpeqb %%mm6, %%mm4 \n\t" "pcmpeqb %%mm6, %%mm5 \n\t" // preload "movl len, %%ecx \n\t" // load length of line // preload "movl srcptr, %%esi \n\t" // load source // preload "movl dstptr, %%edi \n\t" // load dest "cmpl $0, %%ecx \n\t" "jz mainloop48end \n\t" "mainloop48: \n\t" "movq (%%esi), %%mm7 \n\t" "pand %%mm0, %%mm7 \n\t" "movq %%mm0, %%mm6 \n\t" "pandn (%%edi), %%mm6 \n\t" "por %%mm6, %%mm7 \n\t" "movq %%mm7, (%%edi) \n\t" "movq 8(%%esi), %%mm6 \n\t" "pand %%mm1, %%mm6 \n\t" "movq %%mm1, %%mm7 \n\t" "pandn 8(%%edi), %%mm7 \n\t" "por %%mm7, %%mm6 \n\t" "movq %%mm6, 8(%%edi) \n\t" "movq 16(%%esi), %%mm6 \n\t" "pand %%mm2, %%mm6 \n\t" "movq %%mm2, %%mm7 \n\t" "pandn 16(%%edi), %%mm7 \n\t" "por %%mm7, %%mm6 \n\t" "movq %%mm6, 16(%%edi) \n\t" "movq 24(%%esi), %%mm7 \n\t" "pand %%mm3, %%mm7 \n\t" "movq %%mm3, %%mm6 \n\t" "pandn 24(%%edi), %%mm6 \n\t" "por %%mm6, %%mm7 \n\t" "movq %%mm7, 24(%%edi) \n\t" "movq 32(%%esi), %%mm6 \n\t" "pand %%mm4, %%mm6 \n\t" "movq %%mm4, %%mm7 \n\t" "pandn 32(%%edi), %%mm7 \n\t" "por %%mm7, %%mm6 \n\t" "movq %%mm6, 32(%%edi) \n\t" "movq 40(%%esi), %%mm7 \n\t" "pand %%mm5, %%mm7 \n\t" "movq %%mm5, %%mm6 \n\t" "pandn 40(%%edi), %%mm6 \n\t" "por %%mm6, %%mm7 \n\t" "movq %%mm7, 40(%%edi) \n\t" "addl $48, %%esi \n\t" // inc by 48 bytes processed "addl $48, %%edi \n\t" "subl $8, %%ecx \n\t" // dec by 8 pixels processed "ja mainloop48 \n\t" "mainloop48end: \n\t" // preload "movl diff, %%ecx \n\t" // (diff is in eax) "movl %%eax, %%ecx \n\t" "cmpl $0, %%ecx \n\t" "jz end48 \n\t" // preload "movl mask, %%edx \n\t" "sall $24, %%edx \n\t" // make low byte, high byte "secondloop48: \n\t" "sall %%edx \n\t" // move high bit to CF "jnc skip48 \n\t" // if CF = 0 "movl (%%esi), %%eax \n\t" "movl %%eax, (%%edi) \n\t" "skip48: \n\t" "addl $4, %%esi \n\t" "addl $4, %%edi \n\t" "decl %%ecx \n\t" "jnz secondloop48 \n\t" "end48: \n\t" "EMMS \n\t" // DONE : "=a" (dummy_value_a), // output regs (dummy) "=d" (dummy_value_d), "=c" (dummy_value_c), "=S" (dummy_value_S), "=D" (dummy_value_D) : "3" (srcptr), // esi // input regs "4" (dstptr), // edi "0" (diff), // eax // was (unmask) "b" RESERVED // ebx // Global Offset Table idx "2" (len), // ecx "1" (mask) // edx #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1", "%mm2", "%mm3" // clobber list , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } else /* mmx _not supported - Use modified C routine */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { register png_uint_32 i; png_uint_32 initial_val = BPP6 * png_pass_start[png_ptr->pass]; /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ register int stride = BPP6 * png_pass_inc[png_ptr->pass]; /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ register int rep_bytes = BPP6 * png_pass_width[png_ptr->pass]; /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ int diff = (int) (png_ptr->width & 7); /* amount lost */ register png_uint_32 final_val = BPP6 * len; /* GRR bugfix */ srcptr = png_ptr->row_buf + 1 + initial_val; dstptr = row + initial_val; for (i = initial_val; i < final_val; i += stride) { png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } if (diff) /* number of leftover pixels: 3 for pngtest */ { final_val+=diff*BPP6; for (; i < final_val; i += stride) { if (rep_bytes > (int)(final_val-i)) rep_bytes = (int)(final_val-i); png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } } } /* end of else (_mmx_supported) */ break; } /* end 48 bpp */ case 64: /* png_ptr->row_info.pixel_depth */ { png_bytep srcptr; png_bytep dstptr; register png_uint_32 i; png_uint_32 initial_val = BPP8 * png_pass_start[png_ptr->pass]; /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */ register int stride = BPP8 * png_pass_inc[png_ptr->pass]; /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */ register int rep_bytes = BPP8 * png_pass_width[png_ptr->pass]; /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */ int diff = (int) (png_ptr->width & 7); /* amount lost */ register png_uint_32 final_val = BPP8 * len; /* GRR bugfix */ srcptr = png_ptr->row_buf + 1 + initial_val; dstptr = row + initial_val; for (i = initial_val; i < final_val; i += stride) { png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } if (diff) /* number of leftover pixels: 3 for pngtest */ { final_val+=diff*BPP8; for (; i < final_val; i += stride) { if (rep_bytes > (int)(final_val-i)) rep_bytes = (int)(final_val-i); png_memcpy(dstptr, srcptr, rep_bytes); srcptr += stride; dstptr += stride; } } break; } /* end 64 bpp */ default: /* png_ptr->row_info.pixel_depth != 1,2,4,8,16,24,32,48,64 */ { /* this should never happen */ png_warning(png_ptr, "Invalid row_info.pixel_depth in pnggccrd"); break; } } /* end switch (png_ptr->row_info.pixel_depth) */ } /* end if (non-trivial mask) */ } /* end png_combine_row() */ #endif /* PNG_HAVE_ASSEMBLER_COMBINE_ROW */ /*===========================================================================*/ /* */ /* P N G _ D O _ R E A D _ I N T E R L A C E */ /* */ /*===========================================================================*/ #if defined(PNG_READ_INTERLACING_SUPPORTED) #if defined(PNG_HAVE_ASSEMBLER_READ_INTERLACE) /* png_do_read_interlace() is called after any 16-bit to 8-bit conversion * has taken place. [GRR: what other steps come before and/or after?] */ void /* PRIVATE */ png_do_read_interlace(png_structp png_ptr) { png_row_infop row_info = &(png_ptr->row_info); png_bytep row = png_ptr->row_buf + 1; int pass = png_ptr->pass; #if defined(PNG_READ_PACKSWAP_SUPPORTED) png_uint_32 transformations = png_ptr->transformations; #endif png_debug(1, "in png_do_read_interlace (pnggccrd.c)\n"); #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) if (_mmx_supported == 2) { #if !defined(PNG_1_0_X) /* this should have happened in png_init_mmx_flags() already */ png_warning(png_ptr, "asm_flags may not have been initialized"); #endif png_mmx_support(); } #endif if (row != NULL && row_info != NULL) { png_uint_32 final_width; final_width = row_info->width * png_pass_inc[pass]; switch (row_info->pixel_depth) { case 1: { png_bytep sp, dp; int sshift, dshift; int s_start, s_end, s_inc; png_byte v; png_uint_32 i; int j; sp = row + (png_size_t)((row_info->width - 1) >> 3); dp = row + (png_size_t)((final_width - 1) >> 3); #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (int)((row_info->width + 7) & 7); dshift = (int)((final_width + 7) & 7); s_start = 7; s_end = 0; s_inc = -1; } else #endif { sshift = 7 - (int)((row_info->width + 7) & 7); dshift = 7 - (int)((final_width + 7) & 7); s_start = 0; s_end = 7; s_inc = 1; } for (i = row_info->width; i; i--) { v = (png_byte)((*sp >> sshift) & 0x1); for (j = 0; j < png_pass_inc[pass]; j++) { *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } case 2: { png_bytep sp, dp; int sshift, dshift; int s_start, s_end, s_inc; png_uint_32 i; sp = row + (png_size_t)((row_info->width - 1) >> 2); dp = row + (png_size_t)((final_width - 1) >> 2); #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (png_size_t)(((row_info->width + 3) & 3) << 1); dshift = (png_size_t)(((final_width + 3) & 3) << 1); s_start = 6; s_end = 0; s_inc = -2; } else #endif { sshift = (png_size_t)((3 - ((row_info->width + 3) & 3)) << 1); dshift = (png_size_t)((3 - ((final_width + 3) & 3)) << 1); s_start = 0; s_end = 6; s_inc = 2; } for (i = row_info->width; i; i--) { png_byte v; int j; v = (png_byte)((*sp >> sshift) & 0x3); for (j = 0; j < png_pass_inc[pass]; j++) { *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } case 4: { png_bytep sp, dp; int sshift, dshift; int s_start, s_end, s_inc; png_uint_32 i; sp = row + (png_size_t)((row_info->width - 1) >> 1); dp = row + (png_size_t)((final_width - 1) >> 1); #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (png_size_t)(((row_info->width + 1) & 1) << 2); dshift = (png_size_t)(((final_width + 1) & 1) << 2); s_start = 4; s_end = 0; s_inc = -4; } else #endif { sshift = (png_size_t)((1 - ((row_info->width + 1) & 1)) << 2); dshift = (png_size_t)((1 - ((final_width + 1) & 1)) << 2); s_start = 0; s_end = 4; s_inc = 4; } for (i = row_info->width; i; i--) { png_byte v; int j; v = (png_byte)((*sp >> sshift) & 0xf); for (j = 0; j < png_pass_inc[pass]; j++) { *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } /*====================================================================*/ default: /* 8-bit or larger (this is where the routine is modified) */ { #if 0 // static unsigned long long _const4 = 0x0000000000FFFFFFLL; no good // static unsigned long long const4 = 0x0000000000FFFFFFLL; no good // unsigned long long _const4 = 0x0000000000FFFFFFLL; no good // unsigned long long const4 = 0x0000000000FFFFFFLL; no good #endif png_bytep sptr, dp; png_uint_32 i; png_size_t pixel_bytes; int width = (int)row_info->width; pixel_bytes = (row_info->pixel_depth >> 3); /* point sptr at the last pixel in the pre-expanded row: */ sptr = row + (width - 1) * pixel_bytes; /* point dp at the last pixel position in the expanded row: */ dp = row + (final_width - 1) * pixel_bytes; /* New code by Nirav Chhatrapati - Intel Corporation */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_INTERLACE) /* && _mmx_supported */ ) #else if (_mmx_supported) #endif { //-------------------------------------------------------------- if (pixel_bytes == 3) { if (((pass == 0) || (pass == 1)) && width) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $21, %%edi \n\t" // (png_pass_inc[pass] - 1)*pixel_bytes ".loop3_pass0: \n\t" "movd (%%esi), %%mm0 \n\t" // x x x x x 2 1 0 "pand _const4, %%mm0 \n\t" // z z z z z 2 1 0 "movq %%mm0, %%mm1 \n\t" // z z z z z 2 1 0 "psllq $16, %%mm0 \n\t" // z z z 2 1 0 z z "movq %%mm0, %%mm2 \n\t" // z z z 2 1 0 z z "psllq $24, %%mm0 \n\t" // 2 1 0 z z z z z "psrlq $8, %%mm1 \n\t" // z z z z z z 2 1 "por %%mm2, %%mm0 \n\t" // 2 1 0 2 1 0 z z "por %%mm1, %%mm0 \n\t" // 2 1 0 2 1 0 2 1 "movq %%mm0, %%mm3 \n\t" // 2 1 0 2 1 0 2 1 "psllq $16, %%mm0 \n\t" // 0 2 1 0 2 1 z z "movq %%mm3, %%mm4 \n\t" // 2 1 0 2 1 0 2 1 "punpckhdq %%mm0, %%mm3 \n\t" // 0 2 1 0 2 1 0 2 "movq %%mm4, 16(%%edi) \n\t" "psrlq $32, %%mm0 \n\t" // z z z z 0 2 1 0 "movq %%mm3, 8(%%edi) \n\t" "punpckldq %%mm4, %%mm0 \n\t" // 1 0 2 1 0 2 1 0 "subl $3, %%esi \n\t" "movq %%mm0, (%%edi) \n\t" "subl $24, %%edi \n\t" "decl %%ecx \n\t" "jnz .loop3_pass0 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width) // ecx // doesn't work "i" (0x0000000000FFFFFFLL) // %1 (a.k.a. _const4) #if 0 /* %mm0, ..., %mm4 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1", "%mm2" // clobber list , "%mm3", "%mm4" #endif ); } else if (((pass == 2) || (pass == 3)) && width) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $9, %%edi \n\t" // (png_pass_inc[pass] - 1)*pixel_bytes ".loop3_pass2: \n\t" "movd (%%esi), %%mm0 \n\t" // x x x x x 2 1 0 "pand _const4, %%mm0 \n\t" // z z z z z 2 1 0 "movq %%mm0, %%mm1 \n\t" // z z z z z 2 1 0 "psllq $16, %%mm0 \n\t" // z z z 2 1 0 z z "movq %%mm0, %%mm2 \n\t" // z z z 2 1 0 z z "psllq $24, %%mm0 \n\t" // 2 1 0 z z z z z "psrlq $8, %%mm1 \n\t" // z z z z z z 2 1 "por %%mm2, %%mm0 \n\t" // 2 1 0 2 1 0 z z "por %%mm1, %%mm0 \n\t" // 2 1 0 2 1 0 2 1 "movq %%mm0, 4(%%edi) \n\t" "psrlq $16, %%mm0 \n\t" // z z 2 1 0 2 1 0 "subl $3, %%esi \n\t" "movd %%mm0, (%%edi) \n\t" "subl $12, %%edi \n\t" "decl %%ecx \n\t" "jnz .loop3_pass2 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width) // ecx #if 0 /* %mm0, ..., %mm2 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1", "%mm2" // clobber list #endif ); } else if (width) /* && ((pass == 4) || (pass == 5)) */ { int width_mmx = ((width >> 1) << 1) - 8; // GRR: huh? if (width_mmx < 0) width_mmx = 0; width -= width_mmx; // 8 or 9 pix, 24 or 27 bytes if (width_mmx) { // png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; // sptr points at last pixel in pre-expanded row // dp points at last pixel position in expanded row int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $3, %%esi \n\t" "subl $9, %%edi \n\t" // (png_pass_inc[pass] + 1)*pixel_bytes ".loop3_pass4: \n\t" "movq (%%esi), %%mm0 \n\t" // x x 5 4 3 2 1 0 "movq %%mm0, %%mm1 \n\t" // x x 5 4 3 2 1 0 "movq %%mm0, %%mm2 \n\t" // x x 5 4 3 2 1 0 "psllq $24, %%mm0 \n\t" // 4 3 2 1 0 z z z "pand _const4, %%mm1 \n\t" // z z z z z 2 1 0 "psrlq $24, %%mm2 \n\t" // z z z x x 5 4 3 "por %%mm1, %%mm0 \n\t" // 4 3 2 1 0 2 1 0 "movq %%mm2, %%mm3 \n\t" // z z z x x 5 4 3 "psllq $8, %%mm2 \n\t" // z z x x 5 4 3 z "movq %%mm0, (%%edi) \n\t" "psrlq $16, %%mm3 \n\t" // z z z z z x x 5 "pand _const6, %%mm3 \n\t" // z z z z z z z 5 "por %%mm3, %%mm2 \n\t" // z z x x 5 4 3 5 "subl $6, %%esi \n\t" "movd %%mm2, 8(%%edi) \n\t" "subl $12, %%edi \n\t" "subl $2, %%ecx \n\t" "jnz .loop3_pass4 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, ..., %mm3 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1" // clobber list , "%mm2", "%mm3" #endif ); } sptr -= width_mmx*3; dp -= width_mmx*6; for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 3); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, 3); dp -= 3; } sptr -= 3; } } } /* end of pixel_bytes == 3 */ //-------------------------------------------------------------- else if (pixel_bytes == 1) { if (((pass == 0) || (pass == 1)) && width) { int width_mmx = ((width >> 2) << 2); width -= width_mmx; // 0-3 pixels => 0-3 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $3, %%esi \n\t" "subl $31, %%edi \n\t" ".loop1_pass0: \n\t" "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 "movq %%mm0, %%mm1 \n\t" // x x x x 3 2 1 0 "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0 "movq %%mm0, %%mm2 \n\t" // 3 3 2 2 1 1 0 0 "punpcklwd %%mm0, %%mm0 \n\t" // 1 1 1 1 0 0 0 0 "movq %%mm0, %%mm3 \n\t" // 1 1 1 1 0 0 0 0 "punpckldq %%mm0, %%mm0 \n\t" // 0 0 0 0 0 0 0 0 "punpckhdq %%mm3, %%mm3 \n\t" // 1 1 1 1 1 1 1 1 "movq %%mm0, (%%edi) \n\t" "punpckhwd %%mm2, %%mm2 \n\t" // 3 3 3 3 2 2 2 2 "movq %%mm3, 8(%%edi) \n\t" "movq %%mm2, %%mm4 \n\t" // 3 3 3 3 2 2 2 2 "punpckldq %%mm2, %%mm2 \n\t" // 2 2 2 2 2 2 2 2 "punpckhdq %%mm4, %%mm4 \n\t" // 3 3 3 3 3 3 3 3 "movq %%mm2, 16(%%edi) \n\t" "subl $4, %%esi \n\t" "movq %%mm4, 24(%%edi) \n\t" "subl $32, %%edi \n\t" "subl $4, %%ecx \n\t" "jnz .loop1_pass0 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, ..., %mm4 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1", "%mm2" // clobber list , "%mm3", "%mm4" #endif ); } sptr -= width_mmx; dp -= width_mmx*8; for (i = width; i; i--) { int j; /* I simplified this part in version 1.0.4e * here and in several other instances where * pixel_bytes == 1 -- GR-P * * Original code: * * png_byte v[8]; * png_memcpy(v, sptr, pixel_bytes); * for (j = 0; j < png_pass_inc[pass]; j++) * { * png_memcpy(dp, v, pixel_bytes); * dp -= pixel_bytes; * } * sptr -= pixel_bytes; * * Replacement code is in the next three lines: */ for (j = 0; j < png_pass_inc[pass]; j++) { *dp-- = *sptr; } --sptr; } } else if (((pass == 2) || (pass == 3)) && width) { int width_mmx = ((width >> 2) << 2); width -= width_mmx; // 0-3 pixels => 0-3 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $3, %%esi \n\t" "subl $15, %%edi \n\t" ".loop1_pass2: \n\t" "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0 "movq %%mm0, %%mm1 \n\t" // 3 3 2 2 1 1 0 0 "punpcklwd %%mm0, %%mm0 \n\t" // 1 1 1 1 0 0 0 0 "punpckhwd %%mm1, %%mm1 \n\t" // 3 3 3 3 2 2 2 2 "movq %%mm0, (%%edi) \n\t" "subl $4, %%esi \n\t" "movq %%mm1, 8(%%edi) \n\t" "subl $16, %%edi \n\t" "subl $4, %%ecx \n\t" "jnz .loop1_pass2 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1" // clobber list #endif ); } sptr -= width_mmx; dp -= width_mmx*4; for (i = width; i; i--) { int j; for (j = 0; j < png_pass_inc[pass]; j++) { *dp-- = *sptr; } --sptr; } } else if (width) /* && ((pass == 4) || (pass == 5)) */ { int width_mmx = ((width >> 3) << 3); width -= width_mmx; // 0-3 pixels => 0-3 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $7, %%esi \n\t" "subl $15, %%edi \n\t" ".loop1_pass4: \n\t" "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0 "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0 "punpckhbw %%mm1, %%mm1 \n\t" // 7 7 6 6 5 5 4 4 "movq %%mm1, 8(%%edi) \n\t" "subl $8, %%esi \n\t" "movq %%mm0, (%%edi) \n\t" "subl $16, %%edi \n\t" "subl $8, %%ecx \n\t" "jnz .loop1_pass4 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (none) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1" // clobber list #endif ); } sptr -= width_mmx; dp -= width_mmx*2; for (i = width; i; i--) { int j; for (j = 0; j < png_pass_inc[pass]; j++) { *dp-- = *sptr; } --sptr; } } } /* end of pixel_bytes == 1 */ //-------------------------------------------------------------- else if (pixel_bytes == 2) { if (((pass == 0) || (pass == 1)) && width) { int width_mmx = ((width >> 1) << 1); width -= width_mmx; // 0,1 pixels => 0,2 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $2, %%esi \n\t" "subl $30, %%edi \n\t" ".loop2_pass0: \n\t" "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0 "movq %%mm0, %%mm1 \n\t" // 3 2 3 2 1 0 1 0 "punpckldq %%mm0, %%mm0 \n\t" // 1 0 1 0 1 0 1 0 "punpckhdq %%mm1, %%mm1 \n\t" // 3 2 3 2 3 2 3 2 "movq %%mm0, (%%edi) \n\t" "movq %%mm0, 8(%%edi) \n\t" "movq %%mm1, 16(%%edi) \n\t" "subl $4, %%esi \n\t" "movq %%mm1, 24(%%edi) \n\t" "subl $32, %%edi \n\t" "subl $2, %%ecx \n\t" "jnz .loop2_pass0 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1" // clobber list #endif ); } sptr -= (width_mmx*2 - 2); // sign fixed dp -= (width_mmx*16 - 2); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 2; png_memcpy(v, sptr, 2); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 2; png_memcpy(dp, v, 2); } } } else if (((pass == 2) || (pass == 3)) && width) { int width_mmx = ((width >> 1) << 1) ; width -= width_mmx; // 0,1 pixels => 0,2 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $2, %%esi \n\t" "subl $14, %%edi \n\t" ".loop2_pass2: \n\t" "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0 "movq %%mm0, %%mm1 \n\t" // 3 2 3 2 1 0 1 0 "punpckldq %%mm0, %%mm0 \n\t" // 1 0 1 0 1 0 1 0 "punpckhdq %%mm1, %%mm1 \n\t" // 3 2 3 2 3 2 3 2 "movq %%mm0, (%%edi) \n\t" "subl $4, %%esi \n\t" "movq %%mm1, 8(%%edi) \n\t" "subl $16, %%edi \n\t" "subl $2, %%ecx \n\t" "jnz .loop2_pass2 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1" // clobber list #endif ); } sptr -= (width_mmx*2 - 2); // sign fixed dp -= (width_mmx*8 - 2); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 2; png_memcpy(v, sptr, 2); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 2; png_memcpy(dp, v, 2); } } } else if (width) // pass == 4 or 5 { int width_mmx = ((width >> 1) << 1) ; width -= width_mmx; // 0,1 pixels => 0,2 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $2, %%esi \n\t" "subl $6, %%edi \n\t" ".loop2_pass4: \n\t" "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0 "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0 "subl $4, %%esi \n\t" "movq %%mm0, (%%edi) \n\t" "subl $8, %%edi \n\t" "subl $2, %%ecx \n\t" "jnz .loop2_pass4 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0" // clobber list #endif ); } sptr -= (width_mmx*2 - 2); // sign fixed dp -= (width_mmx*4 - 2); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 2; png_memcpy(v, sptr, 2); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 2; png_memcpy(dp, v, 2); } } } } /* end of pixel_bytes == 2 */ //-------------------------------------------------------------- else if (pixel_bytes == 4) { if (((pass == 0) || (pass == 1)) && width) { int width_mmx = ((width >> 1) << 1); width -= width_mmx; // 0,1 pixels => 0,4 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $4, %%esi \n\t" "subl $60, %%edi \n\t" ".loop4_pass0: \n\t" "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0 "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0 "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4 "movq %%mm0, (%%edi) \n\t" "movq %%mm0, 8(%%edi) \n\t" "movq %%mm0, 16(%%edi) \n\t" "movq %%mm0, 24(%%edi) \n\t" "movq %%mm1, 32(%%edi) \n\t" "movq %%mm1, 40(%%edi) \n\t" "movq %%mm1, 48(%%edi) \n\t" "subl $8, %%esi \n\t" "movq %%mm1, 56(%%edi) \n\t" "subl $64, %%edi \n\t" "subl $2, %%ecx \n\t" "jnz .loop4_pass0 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1" // clobber list #endif ); } sptr -= (width_mmx*4 - 4); // sign fixed dp -= (width_mmx*32 - 4); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 4; png_memcpy(v, sptr, 4); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 4; png_memcpy(dp, v, 4); } } } else if (((pass == 2) || (pass == 3)) && width) { int width_mmx = ((width >> 1) << 1); width -= width_mmx; // 0,1 pixels => 0,4 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $4, %%esi \n\t" "subl $28, %%edi \n\t" ".loop4_pass2: \n\t" "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0 "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0 "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4 "movq %%mm0, (%%edi) \n\t" "movq %%mm0, 8(%%edi) \n\t" "movq %%mm1, 16(%%edi) \n\t" "movq %%mm1, 24(%%edi) \n\t" "subl $8, %%esi \n\t" "subl $32, %%edi \n\t" "subl $2, %%ecx \n\t" "jnz .loop4_pass2 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1" // clobber list #endif ); } sptr -= (width_mmx*4 - 4); // sign fixed dp -= (width_mmx*16 - 4); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 4; png_memcpy(v, sptr, 4); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 4; png_memcpy(dp, v, 4); } } } else if (width) // pass == 4 or 5 { int width_mmx = ((width >> 1) << 1) ; width -= width_mmx; // 0,1 pixels => 0,4 bytes if (width_mmx) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $4, %%esi \n\t" "subl $12, %%edi \n\t" ".loop4_pass4: \n\t" "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0 "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0 "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4 "movq %%mm0, (%%edi) \n\t" "subl $8, %%esi \n\t" "movq %%mm1, 8(%%edi) \n\t" "subl $16, %%edi \n\t" "subl $2, %%ecx \n\t" "jnz .loop4_pass4 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width_mmx) // ecx #if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0", "%mm1" // clobber list #endif ); } sptr -= (width_mmx*4 - 4); // sign fixed dp -= (width_mmx*8 - 4); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 4; png_memcpy(v, sptr, 4); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 4; png_memcpy(dp, v, 4); } } } } /* end of pixel_bytes == 4 */ //-------------------------------------------------------------- else if (pixel_bytes == 8) { // GRR TEST: should work, but needs testing (special 64-bit version of rpng2?) // GRR NOTE: no need to combine passes here! if (((pass == 0) || (pass == 1)) && width) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; // source is 8-byte RRGGBBAA // dest is 64-byte RRGGBBAA RRGGBBAA RRGGBBAA RRGGBBAA ... __asm__ __volatile__ ( "subl $56, %%edi \n\t" // start of last block ".loop8_pass0: \n\t" "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 "movq %%mm0, (%%edi) \n\t" "movq %%mm0, 8(%%edi) \n\t" "movq %%mm0, 16(%%edi) \n\t" "movq %%mm0, 24(%%edi) \n\t" "movq %%mm0, 32(%%edi) \n\t" "movq %%mm0, 40(%%edi) \n\t" "movq %%mm0, 48(%%edi) \n\t" "subl $8, %%esi \n\t" "movq %%mm0, 56(%%edi) \n\t" "subl $64, %%edi \n\t" "decl %%ecx \n\t" "jnz .loop8_pass0 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width) // ecx #if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0" // clobber list #endif ); } else if (((pass == 2) || (pass == 3)) && width) { // source is 8-byte RRGGBBAA // dest is 32-byte RRGGBBAA RRGGBBAA RRGGBBAA RRGGBBAA // (recall that expansion is _in place_: sptr and dp // both point at locations within same row buffer) { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $24, %%edi \n\t" // start of last block ".loop8_pass2: \n\t" "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 "movq %%mm0, (%%edi) \n\t" "movq %%mm0, 8(%%edi) \n\t" "movq %%mm0, 16(%%edi) \n\t" "subl $8, %%esi \n\t" "movq %%mm0, 24(%%edi) \n\t" "subl $32, %%edi \n\t" "decl %%ecx \n\t" "jnz .loop8_pass2 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width) // ecx #if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0" // clobber list #endif ); } } else if (width) // pass == 4 or 5 { // source is 8-byte RRGGBBAA // dest is 16-byte RRGGBBAA RRGGBBAA { int dummy_value_c; // fix 'forbidden register spilled' int dummy_value_S; int dummy_value_D; __asm__ __volatile__ ( "subl $8, %%edi \n\t" // start of last block ".loop8_pass4: \n\t" "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0 "movq %%mm0, (%%edi) \n\t" "subl $8, %%esi \n\t" "movq %%mm0, 8(%%edi) \n\t" "subl $16, %%edi \n\t" "decl %%ecx \n\t" "jnz .loop8_pass4 \n\t" "EMMS \n\t" // DONE : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "1" (sptr), // esi // input regs "2" (dp), // edi "0" (width) // ecx #if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */ : "%mm0" // clobber list #endif ); } } } /* end of pixel_bytes == 8 */ //-------------------------------------------------------------- else if (pixel_bytes == 6) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 6); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, 6); dp -= 6; } sptr -= 6; } } /* end of pixel_bytes == 6 */ //-------------------------------------------------------------- else { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, pixel_bytes); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sptr-= pixel_bytes; } } } // end of _mmx_supported ======================================== else /* MMX not supported: use modified C code - takes advantage * of inlining of png_memcpy for a constant */ /* GRR 19991007: does it? or should pixel_bytes in each * block be replaced with immediate value (e.g., 1)? */ /* GRR 19991017: replaced with constants in each case */ #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { if (pixel_bytes == 1) { for (i = width; i; i--) { int j; for (j = 0; j < png_pass_inc[pass]; j++) { *dp-- = *sptr; } --sptr; } } else if (pixel_bytes == 3) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 3); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, 3); dp -= 3; } sptr -= 3; } } else if (pixel_bytes == 2) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 2); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, 2); dp -= 2; } sptr -= 2; } } else if (pixel_bytes == 4) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 4); for (j = 0; j < png_pass_inc[pass]; j++) { #ifdef PNG_DEBUG if (dp < row || dp+3 > row+png_ptr->row_buf_size) { printf("dp out of bounds: row=%d, dp=%d, rp=%d\n", row, dp, row+png_ptr->row_buf_size); printf("row_buf=%d\n",png_ptr->row_buf_size); } #endif png_memcpy(dp, v, 4); dp -= 4; } sptr -= 4; } } else if (pixel_bytes == 6) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 6); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, 6); dp -= 6; } sptr -= 6; } } else if (pixel_bytes == 8) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 8); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, 8); dp -= 8; } sptr -= 8; } } else /* GRR: should never be reached */ { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, pixel_bytes); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sptr -= pixel_bytes; } } } /* end if (MMX not supported) */ break; } } /* end switch (row_info->pixel_depth) */ row_info->width = final_width; row_info->rowbytes = ((final_width * (png_uint_32)row_info->pixel_depth + 7) >> 3); } } /* end png_do_read_interlace() */ #endif /* PNG_HAVE_ASSEMBLER_READ_INTERLACE */ #endif /* PNG_READ_INTERLACING_SUPPORTED */ #if defined(PNG_HAVE_ASSEMBLER_READ_FILTER_ROW) #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) // These variables are utilized in the functions below. They are declared // globally here to ensure alignment on 8-byte boundaries. union uAll { long long use; double align; } _LBCarryMask = {0x0101010101010101LL}, _HBClearMask = {0x7f7f7f7f7f7f7f7fLL}, _ActiveMask, _ActiveMask2, _ActiveMaskEnd, _ShiftBpp, _ShiftRem; #ifdef PNG_THREAD_UNSAFE_OK //===========================================================================// // // // P N G _ R E A D _ F I L T E R _ R O W _ M M X _ A V G // // // //===========================================================================// // Optimized code for PNG Average filter decoder static void /* PRIVATE */ png_read_filter_row_mmx_avg(png_row_infop row_info, png_bytep row, png_bytep prev_row) { int bpp; int dummy_value_c; // fix 'forbidden register 2 (cx) was spilled' error int dummy_value_S; int dummy_value_D; bpp = (row_info->pixel_depth + 7) >> 3; // get # bytes per pixel _FullLength = row_info->rowbytes; // # of bytes to filter __asm__ __volatile__ ( // initialize address pointers and offset #ifdef __PIC__ "pushl %%ebx \n\t" // save index to Global Offset Table #endif //pre "movl row, %%edi \n\t" // edi: Avg(x) "xorl %%ebx, %%ebx \n\t" // ebx: x "movl %%edi, %%edx \n\t" //pre "movl prev_row, %%esi \n\t" // esi: Prior(x) //pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp) "xorl %%eax,%%eax \n\t" // Compute the Raw value for the first bpp bytes // Raw(x) = Avg(x) + (Prior(x)/2) "avg_rlp: \n\t" "movb (%%esi,%%ebx,),%%al \n\t" // load al with Prior(x) "incl %%ebx \n\t" "shrb %%al \n\t" // divide by 2 "addb -1(%%edi,%%ebx,),%%al \n\t" // add Avg(x); -1 to offset inc ebx //pre "cmpl bpp, %%ebx \n\t" // (bpp is preloaded into ecx) "cmpl %%ecx, %%ebx \n\t" "movb %%al,-1(%%edi,%%ebx,) \n\t" // write Raw(x); -1 to offset inc ebx "jb avg_rlp \n\t" // mov does not affect flags // get # of bytes to alignment "movl %%edi, _dif \n\t" // take start of row "addl %%ebx, _dif \n\t" // add bpp "addl $0xf, _dif \n\t" // add 7+8 to incr past alignment bdry "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary "subl %%edi, _dif \n\t" // subtract from start => value ebx at "jz avg_go \n\t" // alignment // fix alignment // Compute the Raw value for the bytes up to the alignment boundary // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) "xorl %%ecx, %%ecx \n\t" "avg_lp1: \n\t" "xorl %%eax, %%eax \n\t" "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x) "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp) "addw %%cx, %%ax \n\t" "incl %%ebx \n\t" "shrw %%ax \n\t" // divide by 2 "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset inc ebx "cmpl _dif, %%ebx \n\t" // check if at alignment boundary "movb %%al, -1(%%edi,%%ebx,) \n\t" // write Raw(x); -1 to offset inc ebx "jb avg_lp1 \n\t" // repeat until at alignment boundary "avg_go: \n\t" "movl _FullLength, %%eax \n\t" "movl %%eax, %%ecx \n\t" "subl %%ebx, %%eax \n\t" // subtract alignment fix "andl $0x00000007, %%eax \n\t" // calc bytes over mult of 8 "subl %%eax, %%ecx \n\t" // drop over bytes from original length "movl %%ecx, _MMXLength \n\t" #ifdef __PIC__ "popl %%ebx \n\t" // restore index to Global Offset Table #endif : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "0" (bpp), // ecx // input regs "1" (prev_row), // esi "2" (row) // edi : "%eax", "%edx" // clobber list #ifndef __PIC__ , "%ebx" #endif // GRR: INCLUDE "memory" as clobbered? (_dif, _MMXLength) // (seems to work fine without...) ); // now do the math for the rest of the row switch (bpp) { case 3: { _ActiveMask.use = 0x0000000000ffffffLL; _ShiftBpp.use = 24; // == 3 * 8 _ShiftRem.use = 40; // == 64 - 24 __asm__ __volatile__ ( // re-init address pointers and offset "movq _ActiveMask, %%mm7 \n\t" "movl _dif, %%ecx \n\t" // ecx: x = offset to "movq _LBCarryMask, %%mm5 \n\t" // alignment boundary // preload "movl row, %%edi \n\t" // edi: Avg(x) "movq _HBClearMask, %%mm4 \n\t" // preload "movl prev_row, %%esi \n\t" // esi: Prior(x) // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes // (correct pos. in loop below) "avg_3lp: \n\t" "movq (%%edi,%%ecx,), %%mm0 \n\t" // load mm0 with Avg(x) "movq %%mm5, %%mm3 \n\t" "psrlq _ShiftRem, %%mm2 \n\t" // correct position Raw(x-bpp) // data "movq (%%esi,%%ecx,), %%mm1 \n\t" // load mm1 with Prior(x) "movq %%mm7, %%mm6 \n\t" "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for // each byte // add 1st active group (Raw(x-bpp)/2) to average with LBCarry "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both // lsb's were == 1 (only valid for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm6, %%mm2 \n\t" // leave only Active Group 1 // bytes to add to Avg "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to // Avg for each Active // byte // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover // bytes 3-5 "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both // lsb's were == 1 (only valid for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 // bytes to add to Avg "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to // Avg for each Active // byte // add 3rd active group (Raw(x-bpp)/2) to average with _LBCarry "psllq _ShiftBpp, %%mm6 \n\t" // shift mm6 mask to cover last // two // bytes "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly // Data only needs to be shifted once here to // get the correct x-bpp offset. "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both // lsb's were == 1 (only valid for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 // bytes to add to Avg "addl $8, %%ecx \n\t" "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to // Avg for each Active // byte // now ready to write back to memory "movq %%mm0, -8(%%edi,%%ecx,) \n\t" // move updated Raw(x) to use as Raw(x-bpp) for next loop "cmpl _MMXLength, %%ecx \n\t" "movq %%mm0, %%mm2 \n\t" // mov updated Raw(x) to mm2 "jb avg_3lp \n\t" : "=S" (dummy_value_S), // output regs (dummy) "=D" (dummy_value_D) : "0" (prev_row), // esi // input regs "1" (row) // edi : "%ecx" // clobber list #if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } break; // end 3 bpp case 6: case 4: //case 7: // who wrote this? PNG doesn't support 5 or 7 bytes/pixel //case 5: // GRR BOGUS { _ActiveMask.use = 0xffffffffffffffffLL; // use shift below to clear // appropriate inactive bytes _ShiftBpp.use = bpp << 3; _ShiftRem.use = 64 - _ShiftBpp.use; __asm__ __volatile__ ( "movq _HBClearMask, %%mm4 \n\t" // re-init address pointers and offset "movl _dif, %%ecx \n\t" // ecx: x = offset to // alignment boundary // load _ActiveMask and clear all bytes except for 1st active group "movq _ActiveMask, %%mm7 \n\t" // preload "movl row, %%edi \n\t" // edi: Avg(x) "psrlq _ShiftRem, %%mm7 \n\t" // preload "movl prev_row, %%esi \n\t" // esi: Prior(x) "movq %%mm7, %%mm6 \n\t" "movq _LBCarryMask, %%mm5 \n\t" "psllq _ShiftBpp, %%mm6 \n\t" // create mask for 2nd active // group // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes // (we correct pos. in loop below) "avg_4lp: \n\t" "movq (%%edi,%%ecx,), %%mm0 \n\t" "psrlq _ShiftRem, %%mm2 \n\t" // shift data to pos. correctly "movq (%%esi,%%ecx,), %%mm1 \n\t" // add (Prev_row/2) to average "movq %%mm5, %%mm3 \n\t" "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for // each byte // add 1st active group (Raw(x-bpp)/2) to average with _LBCarry "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both // lsb's were == 1 (only valid for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm7, %%mm2 \n\t" // leave only Active Group 1 // bytes to add to Avg "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to Avg // for each Active // byte // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly "addl $8, %%ecx \n\t" "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both // lsb's were == 1 (only valid for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 // bytes to add to Avg "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to // Avg for each Active // byte "cmpl _MMXLength, %%ecx \n\t" // now ready to write back to memory "movq %%mm0, -8(%%edi,%%ecx,) \n\t" // prep Raw(x-bpp) for next loop "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 "jb avg_4lp \n\t" : "=S" (dummy_value_S), // output regs (dummy) "=D" (dummy_value_D) : "0" (prev_row), // esi // input regs "1" (row) // edi : "%ecx" // clobber list #if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } break; // end 4,6 bpp case 2: { _ActiveMask.use = 0x000000000000ffffLL; _ShiftBpp.use = 16; // == 2 * 8 _ShiftRem.use = 48; // == 64 - 16 __asm__ __volatile__ ( // load _ActiveMask "movq _ActiveMask, %%mm7 \n\t" // re-init address pointers and offset "movl _dif, %%ecx \n\t" // ecx: x = offset to alignment // boundary "movq _LBCarryMask, %%mm5 \n\t" // preload "movl row, %%edi \n\t" // edi: Avg(x) "movq _HBClearMask, %%mm4 \n\t" // preload "movl prev_row, %%esi \n\t" // esi: Prior(x) // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes // (we correct pos. in loop below) "avg_2lp: \n\t" "movq (%%edi,%%ecx,), %%mm0 \n\t" "psrlq _ShiftRem, %%mm2 \n\t" // shift data to pos. correctly "movq (%%esi,%%ecx,), %%mm1 \n\t" // (GRR BUGFIX: was psllq) // add (Prev_row/2) to average "movq %%mm5, %%mm3 \n\t" "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each // byte "movq %%mm7, %%mm6 \n\t" "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for // each byte // add 1st active group (Raw(x-bpp)/2) to average with _LBCarry "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both // lsb's were == 1 (only valid // for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm6, %%mm2 \n\t" // leave only Active Group 1 // bytes to add to Avg "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to Avg // for each Active byte // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover // bytes 2 & 3 "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both // lsb's were == 1 (only valid // for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 // bytes to add to Avg "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to // Avg for each Active byte // add 3rd active group (Raw(x-bpp)/2) to average with _LBCarry "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover // bytes 4 & 5 "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both lsb's were == 1 // (only valid for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 // bytes to add to Avg "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to // Avg for each Active byte // add 4th active group (Raw(x-bpp)/2) to average with _LBCarry "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover // bytes 6 & 7 "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly "addl $8, %%ecx \n\t" "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting // LBCarrys "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte // where both // lsb's were == 1 (only valid // for active group) "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2) // for each byte "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2 // bytes to add to Avg "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to // Avg for each Active byte "cmpl _MMXLength, %%ecx \n\t" // now ready to write back to memory "movq %%mm0, -8(%%edi,%%ecx,) \n\t" // prep Raw(x-bpp) for next loop "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2 "jb avg_2lp \n\t" : "=S" (dummy_value_S), // output regs (dummy) "=D" (dummy_value_D) : "0" (prev_row), // esi // input regs "1" (row) // edi : "%ecx" // clobber list #if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } break; // end 2 bpp case 1: { __asm__ __volatile__ ( // re-init address pointers and offset #ifdef __PIC__ "pushl %%ebx \n\t" // save Global Offset Table index #endif "movl _dif, %%ebx \n\t" // ebx: x = offset to alignment // boundary // preload "movl row, %%edi \n\t" // edi: Avg(x) "cmpl _FullLength, %%ebx \n\t" // test if offset at end of array "jnb avg_1end \n\t" // do Paeth decode for remaining bytes // preload "movl prev_row, %%esi \n\t" // esi: Prior(x) "movl %%edi, %%edx \n\t" // preload "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp) "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx // in loop below "avg_1lp: \n\t" // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) "xorl %%eax, %%eax \n\t" "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x) "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp) "addw %%cx, %%ax \n\t" "incl %%ebx \n\t" "shrw %%ax \n\t" // divide by 2 "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset // inc ebx "cmpl _FullLength, %%ebx \n\t" // check if at end of array "movb %%al, -1(%%edi,%%ebx,) \n\t" // write back Raw(x); // mov does not affect flags; -1 to offset inc ebx "jb avg_1lp \n\t" "avg_1end: \n\t" #ifdef __PIC__ "popl %%ebx \n\t" // Global Offset Table index #endif : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "0" (bpp), // ecx // input regs "1" (prev_row), // esi "2" (row) // edi : "%eax", "%edx" // clobber list #ifndef __PIC__ , "%ebx" #endif ); } return; // end 1 bpp case 8: { __asm__ __volatile__ ( // re-init address pointers and offset "movl _dif, %%ecx \n\t" // ecx: x == offset to alignment "movq _LBCarryMask, %%mm5 \n\t" // boundary // preload "movl row, %%edi \n\t" // edi: Avg(x) "movq _HBClearMask, %%mm4 \n\t" // preload "movl prev_row, %%esi \n\t" // esi: Prior(x) // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes // (NO NEED to correct pos. in loop below) "avg_8lp: \n\t" "movq (%%edi,%%ecx,), %%mm0 \n\t" "movq %%mm5, %%mm3 \n\t" "movq (%%esi,%%ecx,), %%mm1 \n\t" "addl $8, %%ecx \n\t" "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 "pand %%mm2, %%mm3 \n\t" // get LBCarrys for each byte // where both lsb's were == 1 "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7, each byte "paddb %%mm3, %%mm0 \n\t" // add LBCarrys to Avg, each byte "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7, each byte "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg, each "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) to Avg for each "cmpl _MMXLength, %%ecx \n\t" "movq %%mm0, -8(%%edi,%%ecx,) \n\t" "movq %%mm0, %%mm2 \n\t" // reuse as Raw(x-bpp) "jb avg_8lp \n\t" : "=S" (dummy_value_S), // output regs (dummy) "=D" (dummy_value_D) : "0" (prev_row), // esi // input regs "1" (row) // edi : "%ecx" // clobber list #if 0 /* %mm0, ..., %mm5 not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2" , "%mm3", "%mm4", "%mm5" #endif ); } break; // end 8 bpp default: // bpp greater than 8 (!= 1,2,3,4,[5],6,[7],8) { #ifdef PNG_DEBUG // GRR: PRINT ERROR HERE: SHOULD NEVER BE REACHED png_debug(1, "Internal logic error in pnggccrd (png_read_filter_row_mmx_avg())\n"); #endif #if 0 __asm__ __volatile__ ( "movq _LBCarryMask, %%mm5 \n\t" // re-init address pointers and offset "movl _dif, %%ebx \n\t" // ebx: x = offset to // alignment boundary "movl row, %%edi \n\t" // edi: Avg(x) "movq _HBClearMask, %%mm4 \n\t" "movl %%edi, %%edx \n\t" "movl prev_row, %%esi \n\t" // esi: Prior(x) "subl bpp, %%edx \n\t" // edx: Raw(x-bpp) "avg_Alp: \n\t" "movq (%%edi,%%ebx,), %%mm0 \n\t" "movq %%mm5, %%mm3 \n\t" "movq (%%esi,%%ebx,), %%mm1 \n\t" "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte "movq (%%edx,%%ebx,), %%mm2 \n\t" "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2 "pand %%mm2, %%mm3 \n\t" // get LBCarrys for each byte // where both lsb's were == 1 "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2 "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm3, %%mm0 \n\t" // add LBCarrys to Avg for each // byte "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each // byte "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for // each byte "addl $8, %%ebx \n\t" "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) to Avg for each // byte "cmpl _MMXLength, %%ebx \n\t" "movq %%mm0, -8(%%edi,%%ebx,) \n\t" "jb avg_Alp \n\t" : // FIXASM: output regs/vars go here, e.g.: "=m" (memory_var) : // FIXASM: input regs, e.g.: "c" (count), "S" (src), "D" (dest) : "%ebx", "%edx", "%edi", "%esi" // CHECKASM: clobber list ); #endif /* 0 - NEVER REACHED */ } break; } // end switch (bpp) __asm__ __volatile__ ( // MMX acceleration complete; now do clean-up // check if any remaining bytes left to decode #ifdef __PIC__ "pushl %%ebx \n\t" // save index to Global Offset Table #endif "movl _MMXLength, %%ebx \n\t" // ebx: x == offset bytes after MMX //pre "movl row, %%edi \n\t" // edi: Avg(x) "cmpl _FullLength, %%ebx \n\t" // test if offset at end of array "jnb avg_end \n\t" // do Avg decode for remaining bytes //pre "movl prev_row, %%esi \n\t" // esi: Prior(x) "movl %%edi, %%edx \n\t" //pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp) "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx below "avg_lp2: \n\t" // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) "xorl %%eax, %%eax \n\t" "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x) "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp) "addw %%cx, %%ax \n\t" "incl %%ebx \n\t" "shrw %%ax \n\t" // divide by 2 "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset inc ebx "cmpl _FullLength, %%ebx \n\t" // check if at end of array "movb %%al, -1(%%edi,%%ebx,) \n\t" // write back Raw(x) [mov does not "jb avg_lp2 \n\t" // affect flags; -1 to offset inc ebx] "avg_end: \n\t" "EMMS \n\t" // end MMX; prep for poss. FP instrs. #ifdef __PIC__ "popl %%ebx \n\t" // restore index to Global Offset Table #endif : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "0" (bpp), // ecx // input regs "1" (prev_row), // esi "2" (row) // edi : "%eax", "%edx" // clobber list #ifndef __PIC__ , "%ebx" #endif ); } /* end png_read_filter_row_mmx_avg() */ #endif #ifdef PNG_THREAD_UNSAFE_OK //===========================================================================// // // // P N G _ R E A D _ F I L T E R _ R O W _ M M X _ P A E T H // // // //===========================================================================// // Optimized code for PNG Paeth filter decoder static void /* PRIVATE */ png_read_filter_row_mmx_paeth(png_row_infop row_info, png_bytep row, png_bytep prev_row) { int bpp; int dummy_value_c; // fix 'forbidden register 2 (cx) was spilled' error int dummy_value_S; int dummy_value_D; bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel _FullLength = row_info->rowbytes; // # of bytes to filter __asm__ __volatile__ ( #ifdef __PIC__ "pushl %%ebx \n\t" // save index to Global Offset Table #endif "xorl %%ebx, %%ebx \n\t" // ebx: x offset //pre "movl row, %%edi \n\t" "xorl %%edx, %%edx \n\t" // edx: x-bpp offset //pre "movl prev_row, %%esi \n\t" "xorl %%eax, %%eax \n\t" // Compute the Raw value for the first bpp bytes // Note: the formula works out to be always // Paeth(x) = Raw(x) + Prior(x) where x < bpp "paeth_rlp: \n\t" "movb (%%edi,%%ebx,), %%al \n\t" "addb (%%esi,%%ebx,), %%al \n\t" "incl %%ebx \n\t" //pre "cmpl bpp, %%ebx \n\t" (bpp is preloaded into ecx) "cmpl %%ecx, %%ebx \n\t" "movb %%al, -1(%%edi,%%ebx,) \n\t" "jb paeth_rlp \n\t" // get # of bytes to alignment "movl %%edi, _dif \n\t" // take start of row "addl %%ebx, _dif \n\t" // add bpp "xorl %%ecx, %%ecx \n\t" "addl $0xf, _dif \n\t" // add 7 + 8 to incr past alignment // boundary "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary "subl %%edi, _dif \n\t" // subtract from start ==> value ebx // at alignment "jz paeth_go \n\t" // fix alignment "paeth_lp1: \n\t" "xorl %%eax, %%eax \n\t" // pav = p - a = (a + b - c) - a = b - c "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) "movl %%eax, _patemp \n\t" // Save pav for later use "xorl %%eax, %%eax \n\t" // pbv = p - b = (a + b - c) - b = a - c "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) "movl %%eax, %%ecx \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "addl _patemp, %%eax \n\t" // pcv = pav + pbv // pc = abs(pcv) "testl $0x80000000, %%eax \n\t" "jz paeth_pca \n\t" "negl %%eax \n\t" // reverse sign of neg values "paeth_pca: \n\t" "movl %%eax, _pctemp \n\t" // save pc for later use // pb = abs(pbv) "testl $0x80000000, %%ecx \n\t" "jz paeth_pba \n\t" "negl %%ecx \n\t" // reverse sign of neg values "paeth_pba: \n\t" "movl %%ecx, _pbtemp \n\t" // save pb for later use // pa = abs(pav) "movl _patemp, %%eax \n\t" "testl $0x80000000, %%eax \n\t" "jz paeth_paa \n\t" "negl %%eax \n\t" // reverse sign of neg values "paeth_paa: \n\t" "movl %%eax, _patemp \n\t" // save pa for later use // test if pa <= pb "cmpl %%ecx, %%eax \n\t" "jna paeth_abb \n\t" // pa > pb; now test if pb <= pc "cmpl _pctemp, %%ecx \n\t" "jna paeth_bbc \n\t" // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "jmp paeth_paeth \n\t" "paeth_bbc: \n\t" // pb <= pc; Raw(x) = Paeth(x) + Prior(x) "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl "jmp paeth_paeth \n\t" "paeth_abb: \n\t" // pa <= pb; now test if pa <= pc "cmpl _pctemp, %%eax \n\t" "jna paeth_abc \n\t" // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "jmp paeth_paeth \n\t" "paeth_abc: \n\t" // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl "paeth_paeth: \n\t" "incl %%ebx \n\t" "incl %%edx \n\t" // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 "addb %%cl, -1(%%edi,%%ebx,) \n\t" "cmpl _dif, %%ebx \n\t" "jb paeth_lp1 \n\t" "paeth_go: \n\t" "movl _FullLength, %%ecx \n\t" "movl %%ecx, %%eax \n\t" "subl %%ebx, %%eax \n\t" // subtract alignment fix "andl $0x00000007, %%eax \n\t" // calc bytes over mult of 8 "subl %%eax, %%ecx \n\t" // drop over bytes from original length "movl %%ecx, _MMXLength \n\t" #ifdef __PIC__ "popl %%ebx \n\t" // restore index to Global Offset Table #endif : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "0" (bpp), // ecx // input regs "1" (prev_row), // esi "2" (row) // edi : "%eax", "%edx" // clobber list #ifndef __PIC__ , "%ebx" #endif ); // now do the math for the rest of the row switch (bpp) { case 3: { _ActiveMask.use = 0x0000000000ffffffLL; _ActiveMaskEnd.use = 0xffff000000000000LL; _ShiftBpp.use = 24; // == bpp(3) * 8 _ShiftRem.use = 40; // == 64 - 24 __asm__ __volatile__ ( "movl _dif, %%ecx \n\t" // preload "movl row, %%edi \n\t" // preload "movl prev_row, %%esi \n\t" "pxor %%mm0, %%mm0 \n\t" // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%ecx,), %%mm1 \n\t" "paeth_3lp: \n\t" "psrlq _ShiftRem, %%mm1 \n\t" // shift last 3 bytes to 1st // 3 bytes "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) "punpcklbw %%mm0, %%mm1 \n\t" // unpack High bytes of a "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // prep c=Prior(x-bpp) bytes "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b "psrlq _ShiftRem, %%mm3 \n\t" // shift last 3 bytes to 1st // 3 bytes // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" "psubw %%mm3, %%mm4 \n\t" "pxor %%mm7, %%mm7 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "movq %%mm4, %%mm6 \n\t" "psubw %%mm3, %%mm5 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 "paddw %%mm5, %%mm6 \n\t" "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 "psubw %%mm0, %%mm4 \n\t" "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm7, %%mm5 \n\t" "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" "pandn %%mm4, %%mm7 \n\t" "pandn %%mm1, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "pxor %%mm1, %%mm1 \n\t" "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm0, %%mm0 \n\t" "packuswb %%mm1, %%mm7 \n\t" "movq (%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp) "pand _ActiveMask, %%mm7 \n\t" "movq %%mm3, %%mm2 \n\t" // load b=Prior(x) step 1 "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x) "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value "movq %%mm7, %%mm1 \n\t" // now mm1 will be used as // Raw(x-bpp) // now do Paeth for 2nd set of bytes (3-5) "psrlq _ShiftBpp, %%mm2 \n\t" // load b=Prior(x) step 2 "punpcklbw %%mm0, %%mm1 \n\t" // unpack High bytes of a "pxor %%mm7, %%mm7 \n\t" "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" "psubw %%mm3, %%mm5 \n\t" "psubw %%mm3, %%mm4 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = // pav + pbv = pbv + pav "movq %%mm5, %%mm6 \n\t" "paddw %%mm4, %%mm6 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm5, %%mm0 \n\t" // create mask pbv bytes < 0 "pcmpgtw %%mm4, %%mm7 \n\t" // create mask pav bytes < 0 "pand %%mm5, %%mm0 \n\t" // only pbv bytes < 0 in mm0 "pand %%mm4, %%mm7 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm0, %%mm5 \n\t" "psubw %%mm7, %%mm4 \n\t" "psubw %%mm0, %%mm5 \n\t" "psubw %%mm7, %%mm4 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" "pandn %%mm4, %%mm7 \n\t" "pandn %%mm1, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "pxor %%mm1, %%mm1 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm0, %%mm0 \n\t" "packuswb %%mm1, %%mm7 \n\t" "movq %%mm2, %%mm3 \n\t" // load c=Prior(x-bpp) step 1 "pand _ActiveMask, %%mm7 \n\t" "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b "psllq _ShiftBpp, %%mm7 \n\t" // shift bytes to 2nd group of // 3 bytes // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x) "psllq _ShiftBpp, %%mm3 \n\t" // load c=Prior(x-bpp) step 2 "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value "movq %%mm7, %%mm1 \n\t" "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c "psllq _ShiftBpp, %%mm1 \n\t" // shift bytes // now mm1 will be used as Raw(x-bpp) // now do Paeth for 3rd, and final, set of bytes (6-7) "pxor %%mm7, %%mm7 \n\t" "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a "psubw %%mm3, %%mm4 \n\t" // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "movq %%mm4, %%mm6 \n\t" "psubw %%mm3, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "paddw %%mm5, %%mm6 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" "pandn %%mm1, %%mm0 \n\t" "pandn %%mm4, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm1, %%mm1 \n\t" "packuswb %%mm7, %%mm1 \n\t" // step ecx to next set of 8 bytes and repeat loop til done "addl $8, %%ecx \n\t" "pand _ActiveMaskEnd, %%mm1 \n\t" "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with // Raw(x) "cmpl _MMXLength, %%ecx \n\t" "pxor %%mm0, %%mm0 \n\t" // pxor does not affect flags "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value // mm1 will be used as Raw(x-bpp) next loop // mm3 ready to be used as Prior(x-bpp) next loop "jb paeth_3lp \n\t" : "=S" (dummy_value_S), // output regs (dummy) "=D" (dummy_value_D) : "0" (prev_row), // esi // input regs "1" (row) // edi : "%ecx" // clobber list #if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } break; // end 3 bpp case 6: //case 7: // GRR BOGUS //case 5: // GRR BOGUS { _ActiveMask.use = 0x00000000ffffffffLL; _ActiveMask2.use = 0xffffffff00000000LL; _ShiftBpp.use = bpp << 3; // == bpp * 8 _ShiftRem.use = 64 - _ShiftBpp.use; __asm__ __volatile__ ( "movl _dif, %%ecx \n\t" // preload "movl row, %%edi \n\t" // preload "movl prev_row, %%esi \n\t" // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%ecx,), %%mm1 \n\t" "pxor %%mm0, %%mm0 \n\t" "paeth_6lp: \n\t" // must shift to position Raw(x-bpp) data "psrlq _ShiftRem, %%mm1 \n\t" // do first set of 4 bytes "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) "punpcklbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b // must shift to position Prior(x-bpp) data "psrlq _ShiftRem, %%mm3 \n\t" // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" "punpcklbw %%mm0, %%mm3 \n\t" // unpack Low bytes of c // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" "psubw %%mm3, %%mm4 \n\t" "pxor %%mm7, %%mm7 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "movq %%mm4, %%mm6 \n\t" "psubw %%mm3, %%mm5 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 "paddw %%mm5, %%mm6 \n\t" "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 "psubw %%mm0, %%mm4 \n\t" "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm7, %%mm5 \n\t" "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" "pandn %%mm4, %%mm7 \n\t" "pandn %%mm1, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "pxor %%mm1, %%mm1 \n\t" "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm0, %%mm0 \n\t" "packuswb %%mm1, %%mm7 \n\t" "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp) "pand _ActiveMask, %%mm7 \n\t" "psrlq _ShiftRem, %%mm3 \n\t" "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) step 1 "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor and Raw(x) "movq %%mm2, %%mm6 \n\t" "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value "movq -8(%%edi,%%ecx,), %%mm1 \n\t" "psllq _ShiftBpp, %%mm6 \n\t" "movq %%mm7, %%mm5 \n\t" "psrlq _ShiftRem, %%mm1 \n\t" "por %%mm6, %%mm3 \n\t" "psllq _ShiftBpp, %%mm5 \n\t" "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c "por %%mm5, %%mm1 \n\t" // do second set of 4 bytes "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" "psubw %%mm3, %%mm4 \n\t" "pxor %%mm7, %%mm7 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "movq %%mm4, %%mm6 \n\t" "psubw %%mm3, %%mm5 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 "paddw %%mm5, %%mm6 \n\t" "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 "psubw %%mm0, %%mm4 \n\t" "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm7, %%mm5 \n\t" "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" "pandn %%mm4, %%mm7 \n\t" "pandn %%mm1, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "pxor %%mm1, %%mm1 \n\t" "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "pxor %%mm1, %%mm1 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm0, %%mm0 \n\t" // step ecx to next set of 8 bytes and repeat loop til done "addl $8, %%ecx \n\t" "packuswb %%mm7, %%mm1 \n\t" "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with Raw(x) "cmpl _MMXLength, %%ecx \n\t" "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value // mm1 will be used as Raw(x-bpp) next loop "jb paeth_6lp \n\t" : "=S" (dummy_value_S), // output regs (dummy) "=D" (dummy_value_D) : "0" (prev_row), // esi // input regs "1" (row) // edi : "%ecx" // clobber list #if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } break; // end 6 bpp case 4: { _ActiveMask.use = 0x00000000ffffffffLL; __asm__ __volatile__ ( "movl _dif, %%ecx \n\t" // preload "movl row, %%edi \n\t" // preload "movl prev_row, %%esi \n\t" "pxor %%mm0, %%mm0 \n\t" // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // only time should need to read // a=Raw(x-bpp) bytes "paeth_4lp: \n\t" // do first set of 4 bytes "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes "punpckhbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" "psubw %%mm3, %%mm4 \n\t" "pxor %%mm7, %%mm7 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "movq %%mm4, %%mm6 \n\t" "psubw %%mm3, %%mm5 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 "paddw %%mm5, %%mm6 \n\t" "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 "psubw %%mm0, %%mm4 \n\t" "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm7, %%mm5 \n\t" "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" "pandn %%mm4, %%mm7 \n\t" "pandn %%mm1, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "pxor %%mm1, %%mm1 \n\t" "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm0, %%mm0 \n\t" "packuswb %%mm1, %%mm7 \n\t" "movq (%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp) "pand _ActiveMask, %%mm7 \n\t" "movq %%mm3, %%mm2 \n\t" // load b=Prior(x) step 1 "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x) "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value "movq %%mm7, %%mm1 \n\t" // now mm1 will be used as Raw(x-bpp) // do second set of 4 bytes "punpckhbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" "psubw %%mm3, %%mm4 \n\t" "pxor %%mm7, %%mm7 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "movq %%mm4, %%mm6 \n\t" "psubw %%mm3, %%mm5 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 "paddw %%mm5, %%mm6 \n\t" "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 "psubw %%mm0, %%mm4 \n\t" "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm7, %%mm5 \n\t" "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" "pandn %%mm4, %%mm7 \n\t" "pandn %%mm1, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "pxor %%mm1, %%mm1 \n\t" "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "pxor %%mm1, %%mm1 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm0, %%mm0 \n\t" // step ecx to next set of 8 bytes and repeat loop til done "addl $8, %%ecx \n\t" "packuswb %%mm7, %%mm1 \n\t" "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add predictor with Raw(x) "cmpl _MMXLength, %%ecx \n\t" "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value // mm1 will be used as Raw(x-bpp) next loop "jb paeth_4lp \n\t" : "=S" (dummy_value_S), // output regs (dummy) "=D" (dummy_value_D) : "0" (prev_row), // esi // input regs "1" (row) // edi : "%ecx" // clobber list #if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } break; // end 4 bpp case 8: // bpp == 8 { _ActiveMask.use = 0x00000000ffffffffLL; __asm__ __volatile__ ( "movl _dif, %%ecx \n\t" // preload "movl row, %%edi \n\t" // preload "movl prev_row, %%esi \n\t" "pxor %%mm0, %%mm0 \n\t" // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // only time should need to read // a=Raw(x-bpp) bytes "paeth_8lp: \n\t" // do first set of 4 bytes "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) "punpcklbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" "punpcklbw %%mm0, %%mm3 \n\t" // unpack Low bytes of c // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" "psubw %%mm3, %%mm4 \n\t" "pxor %%mm7, %%mm7 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "movq %%mm4, %%mm6 \n\t" "psubw %%mm3, %%mm5 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 "paddw %%mm5, %%mm6 \n\t" "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 "psubw %%mm0, %%mm4 \n\t" "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm7, %%mm5 \n\t" "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" "pandn %%mm4, %%mm7 \n\t" "pandn %%mm1, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "pxor %%mm1, %%mm1 \n\t" "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm0, %%mm0 \n\t" "packuswb %%mm1, %%mm7 \n\t" "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes "pand _ActiveMask, %%mm7 \n\t" "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x) "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // read a=Raw(x-bpp) bytes // do second set of 4 bytes "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a // pav = p - a = (a + b - c) - a = b - c "movq %%mm2, %%mm4 \n\t" // pbv = p - b = (a + b - c) - b = a - c "movq %%mm1, %%mm5 \n\t" "psubw %%mm3, %%mm4 \n\t" "pxor %%mm7, %%mm7 \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "movq %%mm4, %%mm6 \n\t" "psubw %%mm3, %%mm5 \n\t" // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0 "paddw %%mm5, %%mm6 \n\t" "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7 "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0 "psubw %%mm0, %%mm4 \n\t" "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0 "psubw %%mm0, %%mm4 \n\t" "psubw %%mm7, %%mm5 \n\t" "pxor %%mm0, %%mm0 \n\t" "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0 "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7 "psubw %%mm7, %%mm5 \n\t" "psubw %%mm0, %%mm6 \n\t" // test pa <= pb "movq %%mm4, %%mm7 \n\t" "psubw %%mm0, %%mm6 \n\t" "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb? "movq %%mm7, %%mm0 \n\t" // use mm7 mask to merge pa & pb "pand %%mm7, %%mm5 \n\t" // use mm0 mask copy to merge a & b "pand %%mm0, %%mm2 \n\t" "pandn %%mm4, %%mm7 \n\t" "pandn %%mm1, %%mm0 \n\t" "paddw %%mm5, %%mm7 \n\t" "paddw %%mm2, %%mm0 \n\t" // test ((pa <= pb)? pa:pb) <= pc "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc? "pxor %%mm1, %%mm1 \n\t" "pand %%mm7, %%mm3 \n\t" "pandn %%mm0, %%mm7 \n\t" "pxor %%mm1, %%mm1 \n\t" "paddw %%mm3, %%mm7 \n\t" "pxor %%mm0, %%mm0 \n\t" // step ecx to next set of 8 bytes and repeat loop til done "addl $8, %%ecx \n\t" "packuswb %%mm7, %%mm1 \n\t" "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with Raw(x) "cmpl _MMXLength, %%ecx \n\t" "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value // mm1 will be used as Raw(x-bpp) next loop "jb paeth_8lp \n\t" : "=S" (dummy_value_S), // output regs (dummy) "=D" (dummy_value_D) : "0" (prev_row), // esi // input regs "1" (row) // edi : "%ecx" // clobber list #if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } break; // end 8 bpp case 1: // bpp = 1 case 2: // bpp = 2 default: // bpp > 8 { __asm__ __volatile__ ( #ifdef __PIC__ "pushl %%ebx \n\t" // save Global Offset Table index #endif "movl _dif, %%ebx \n\t" "cmpl _FullLength, %%ebx \n\t" "jnb paeth_dend \n\t" // preload "movl row, %%edi \n\t" // preload "movl prev_row, %%esi \n\t" // do Paeth decode for remaining bytes "movl %%ebx, %%edx \n\t" // preload "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) "subl %%ecx, %%edx \n\t" // edx = ebx - bpp "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx "paeth_dlp: \n\t" "xorl %%eax, %%eax \n\t" // pav = p - a = (a + b - c) - a = b - c "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) "movl %%eax, _patemp \n\t" // Save pav for later use "xorl %%eax, %%eax \n\t" // pbv = p - b = (a + b - c) - b = a - c "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) "movl %%eax, %%ecx \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "addl _patemp, %%eax \n\t" // pcv = pav + pbv // pc = abs(pcv) "testl $0x80000000, %%eax \n\t" "jz paeth_dpca \n\t" "negl %%eax \n\t" // reverse sign of neg values "paeth_dpca: \n\t" "movl %%eax, _pctemp \n\t" // save pc for later use // pb = abs(pbv) "testl $0x80000000, %%ecx \n\t" "jz paeth_dpba \n\t" "negl %%ecx \n\t" // reverse sign of neg values "paeth_dpba: \n\t" "movl %%ecx, _pbtemp \n\t" // save pb for later use // pa = abs(pav) "movl _patemp, %%eax \n\t" "testl $0x80000000, %%eax \n\t" "jz paeth_dpaa \n\t" "negl %%eax \n\t" // reverse sign of neg values "paeth_dpaa: \n\t" "movl %%eax, _patemp \n\t" // save pa for later use // test if pa <= pb "cmpl %%ecx, %%eax \n\t" "jna paeth_dabb \n\t" // pa > pb; now test if pb <= pc "cmpl _pctemp, %%ecx \n\t" "jna paeth_dbbc \n\t" // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "jmp paeth_dpaeth \n\t" "paeth_dbbc: \n\t" // pb <= pc; Raw(x) = Paeth(x) + Prior(x) "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl "jmp paeth_dpaeth \n\t" "paeth_dabb: \n\t" // pa <= pb; now test if pa <= pc "cmpl _pctemp, %%eax \n\t" "jna paeth_dabc \n\t" // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "jmp paeth_dpaeth \n\t" "paeth_dabc: \n\t" // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl "paeth_dpaeth: \n\t" "incl %%ebx \n\t" "incl %%edx \n\t" // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 "addb %%cl, -1(%%edi,%%ebx,) \n\t" "cmpl _FullLength, %%ebx \n\t" "jb paeth_dlp \n\t" "paeth_dend: \n\t" #ifdef __PIC__ "popl %%ebx \n\t" // index to Global Offset Table #endif : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "0" (bpp), // ecx // input regs "1" (prev_row), // esi "2" (row) // edi : "%eax", "%edx" // clobber list #ifndef __PIC__ , "%ebx" #endif ); } return; // No need to go further with this one } // end switch (bpp) __asm__ __volatile__ ( // MMX acceleration complete; now do clean-up // check if any remaining bytes left to decode #ifdef __PIC__ "pushl %%ebx \n\t" // save index to Global Offset Table #endif "movl _MMXLength, %%ebx \n\t" "cmpl _FullLength, %%ebx \n\t" "jnb paeth_end \n\t" //pre "movl row, %%edi \n\t" //pre "movl prev_row, %%esi \n\t" // do Paeth decode for remaining bytes "movl %%ebx, %%edx \n\t" //pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx) "subl %%ecx, %%edx \n\t" // edx = ebx - bpp "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx below "paeth_lp2: \n\t" "xorl %%eax, %%eax \n\t" // pav = p - a = (a + b - c) - a = b - c "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) "movl %%eax, _patemp \n\t" // Save pav for later use "xorl %%eax, %%eax \n\t" // pbv = p - b = (a + b - c) - b = a - c "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp) "movl %%eax, %%ecx \n\t" // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv "addl _patemp, %%eax \n\t" // pcv = pav + pbv // pc = abs(pcv) "testl $0x80000000, %%eax \n\t" "jz paeth_pca2 \n\t" "negl %%eax \n\t" // reverse sign of neg values "paeth_pca2: \n\t" "movl %%eax, _pctemp \n\t" // save pc for later use // pb = abs(pbv) "testl $0x80000000, %%ecx \n\t" "jz paeth_pba2 \n\t" "negl %%ecx \n\t" // reverse sign of neg values "paeth_pba2: \n\t" "movl %%ecx, _pbtemp \n\t" // save pb for later use // pa = abs(pav) "movl _patemp, %%eax \n\t" "testl $0x80000000, %%eax \n\t" "jz paeth_paa2 \n\t" "negl %%eax \n\t" // reverse sign of neg values "paeth_paa2: \n\t" "movl %%eax, _patemp \n\t" // save pa for later use // test if pa <= pb "cmpl %%ecx, %%eax \n\t" "jna paeth_abb2 \n\t" // pa > pb; now test if pb <= pc "cmpl _pctemp, %%ecx \n\t" "jna paeth_bbc2 \n\t" // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "jmp paeth_paeth2 \n\t" "paeth_bbc2: \n\t" // pb <= pc; Raw(x) = Paeth(x) + Prior(x) "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl "jmp paeth_paeth2 \n\t" "paeth_abb2: \n\t" // pa <= pb; now test if pa <= pc "cmpl _pctemp, %%eax \n\t" "jna paeth_abc2 \n\t" // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl "jmp paeth_paeth2 \n\t" "paeth_abc2: \n\t" // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl "paeth_paeth2: \n\t" "incl %%ebx \n\t" "incl %%edx \n\t" // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 "addb %%cl, -1(%%edi,%%ebx,) \n\t" "cmpl _FullLength, %%ebx \n\t" "jb paeth_lp2 \n\t" "paeth_end: \n\t" "EMMS \n\t" // end MMX; prep for poss. FP instrs. #ifdef __PIC__ "popl %%ebx \n\t" // restore index to Global Offset Table #endif : "=c" (dummy_value_c), // output regs (dummy) "=S" (dummy_value_S), "=D" (dummy_value_D) : "0" (bpp), // ecx // input regs "1" (prev_row), // esi "2" (row) // edi : "%eax", "%edx" // clobber list (no input regs!) #ifndef __PIC__ , "%ebx" #endif ); } /* end png_read_filter_row_mmx_paeth() */ #endif #ifdef PNG_THREAD_UNSAFE_OK //===========================================================================// // // // P N G _ R E A D _ F I L T E R _ R O W _ M M X _ S U B // // // //===========================================================================// // Optimized code for PNG Sub filter decoder static void /* PRIVATE */ png_read_filter_row_mmx_sub(png_row_infop row_info, png_bytep row) { int bpp; int dummy_value_a; int dummy_value_D; bpp = (row_info->pixel_depth + 7) >> 3; // calc number of bytes per pixel _FullLength = row_info->rowbytes - bpp; // number of bytes to filter __asm__ __volatile__ ( //pre "movl row, %%edi \n\t" "movl %%edi, %%esi \n\t" // lp = row //pre "movl bpp, %%eax \n\t" "addl %%eax, %%edi \n\t" // rp = row + bpp //irr "xorl %%eax, %%eax \n\t" // get # of bytes to alignment "movl %%edi, _dif \n\t" // take start of row "addl $0xf, _dif \n\t" // add 7 + 8 to incr past // alignment boundary "xorl %%ecx, %%ecx \n\t" "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary "subl %%edi, _dif \n\t" // subtract from start ==> value "jz sub_go \n\t" // ecx at alignment "sub_lp1: \n\t" // fix alignment "movb (%%esi,%%ecx,), %%al \n\t" "addb %%al, (%%edi,%%ecx,) \n\t" "incl %%ecx \n\t" "cmpl _dif, %%ecx \n\t" "jb sub_lp1 \n\t" "sub_go: \n\t" "movl _FullLength, %%eax \n\t" "movl %%eax, %%edx \n\t" "subl %%ecx, %%edx \n\t" // subtract alignment fix "andl $0x00000007, %%edx \n\t" // calc bytes over mult of 8 "subl %%edx, %%eax \n\t" // drop over bytes from length "movl %%eax, _MMXLength \n\t" : "=a" (dummy_value_a), // 0 // output regs (dummy) "=D" (dummy_value_D) // 1 : "0" (bpp), // eax // input regs "1" (row) // edi : "%ebx", "%ecx", "%edx" // clobber list , "%esi" #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); // now do the math for the rest of the row switch (bpp) { case 3: { _ActiveMask.use = 0x0000ffffff000000LL; _ShiftBpp.use = 24; // == 3 * 8 _ShiftRem.use = 40; // == 64 - 24 __asm__ __volatile__ ( // preload "movl row, %%edi \n\t" "movq _ActiveMask, %%mm7 \n\t" // load _ActiveMask for 2nd // active byte group "movl %%edi, %%esi \n\t" // lp = row // preload "movl bpp, %%eax \n\t" "addl %%eax, %%edi \n\t" // rp = row + bpp "movq %%mm7, %%mm6 \n\t" "movl _dif, %%edx \n\t" "psllq _ShiftBpp, %%mm6 \n\t" // move mask in mm6 to cover // 3rd active byte group // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%edx,), %%mm1 \n\t" "sub_3lp: \n\t" // shift data for adding first "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask; // shift clears inactive bytes) // add 1st active group "movq (%%edi,%%edx,), %%mm0 \n\t" "paddb %%mm1, %%mm0 \n\t" // add 2nd active group "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly "pand %%mm7, %%mm1 \n\t" // mask to use 2nd active group "paddb %%mm1, %%mm0 \n\t" // add 3rd active group "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly "pand %%mm6, %%mm1 \n\t" // mask to use 3rd active group "addl $8, %%edx \n\t" "paddb %%mm1, %%mm0 \n\t" "cmpl _MMXLength, %%edx \n\t" "movq %%mm0, -8(%%edi,%%edx,) \n\t" // write updated Raws to array "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop "jb sub_3lp \n\t" : "=a" (dummy_value_a), // 0 // output regs (dummy) "=D" (dummy_value_D) // 1 : "0" (bpp), // eax // input regs "1" (row) // edi : "%edx", "%esi" // clobber list #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm6", "%mm7" #endif ); } break; case 1: { __asm__ __volatile__ ( "movl _dif, %%edx \n\t" // preload "movl row, %%edi \n\t" "cmpl _FullLength, %%edx \n\t" "jnb sub_1end \n\t" "movl %%edi, %%esi \n\t" // lp = row "xorl %%eax, %%eax \n\t" // preload "movl bpp, %%eax \n\t" "addl %%eax, %%edi \n\t" // rp = row + bpp "sub_1lp: \n\t" "movb (%%esi,%%edx,), %%al \n\t" "addb %%al, (%%edi,%%edx,) \n\t" "incl %%edx \n\t" "cmpl _FullLength, %%edx \n\t" "jb sub_1lp \n\t" "sub_1end: \n\t" : "=a" (dummy_value_a), // 0 // output regs (dummy) "=D" (dummy_value_D) // 1 : "0" (bpp), // eax // input regs "1" (row) // edi : "%edx", "%esi" // clobber list ); } return; case 6: case 4: //case 7: // GRR BOGUS //case 5: // GRR BOGUS { _ShiftBpp.use = bpp << 3; _ShiftRem.use = 64 - _ShiftBpp.use; __asm__ __volatile__ ( // preload "movl row, %%edi \n\t" "movl _dif, %%edx \n\t" "movl %%edi, %%esi \n\t" // lp = row // preload "movl bpp, %%eax \n\t" "addl %%eax, %%edi \n\t" // rp = row + bpp // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%edx,), %%mm1 \n\t" "sub_4lp: \n\t" // shift data for adding first "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask; // shift clears inactive bytes) "movq (%%edi,%%edx,), %%mm0 \n\t" "paddb %%mm1, %%mm0 \n\t" // add 2nd active group "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly "addl $8, %%edx \n\t" "paddb %%mm1, %%mm0 \n\t" "cmpl _MMXLength, %%edx \n\t" "movq %%mm0, -8(%%edi,%%edx,) \n\t" "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop "jb sub_4lp \n\t" : "=a" (dummy_value_a), // 0 // output regs (dummy) "=D" (dummy_value_D) // 1 : "0" (bpp), // eax // input regs "1" (row) // edi : "%edx", "%esi" // clobber list #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1" #endif ); } break; case 2: { _ActiveMask.use = 0x00000000ffff0000LL; _ShiftBpp.use = 16; // == 2 * 8 _ShiftRem.use = 48; // == 64 - 16 __asm__ __volatile__ ( "movq _ActiveMask, %%mm7 \n\t" // load _ActiveMask for 2nd // active byte group "movl _dif, %%edx \n\t" "movq %%mm7, %%mm6 \n\t" // preload "movl row, %%edi \n\t" "psllq _ShiftBpp, %%mm6 \n\t" // move mask in mm6 to cover // 3rd active byte group "movl %%edi, %%esi \n\t" // lp = row "movq %%mm6, %%mm5 \n\t" // preload "movl bpp, %%eax \n\t" "addl %%eax, %%edi \n\t" // rp = row + bpp "psllq _ShiftBpp, %%mm5 \n\t" // move mask in mm5 to cover // 4th active byte group // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%edx,), %%mm1 \n\t" "sub_2lp: \n\t" // shift data for adding first "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask; // shift clears inactive bytes) // add 1st active group "movq (%%edi,%%edx,), %%mm0 \n\t" "paddb %%mm1, %%mm0 \n\t" // add 2nd active group "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly "pand %%mm7, %%mm1 \n\t" // mask to use 2nd active group "paddb %%mm1, %%mm0 \n\t" // add 3rd active group "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly "pand %%mm6, %%mm1 \n\t" // mask to use 3rd active group "paddb %%mm1, %%mm0 \n\t" // add 4th active group "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1 "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly "pand %%mm5, %%mm1 \n\t" // mask to use 4th active group "addl $8, %%edx \n\t" "paddb %%mm1, %%mm0 \n\t" "cmpl _MMXLength, %%edx \n\t" "movq %%mm0, -8(%%edi,%%edx,) \n\t" // write updated Raws to array "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop "jb sub_2lp \n\t" : "=a" (dummy_value_a), // 0 // output regs (dummy) "=D" (dummy_value_D) // 1 : "0" (bpp), // eax // input regs "1" (row) // edi : "%edx", "%esi" // clobber list #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm5", "%mm6", "%mm7" #endif ); } break; case 8: { __asm__ __volatile__ ( // preload "movl row, %%edi \n\t" "movl _dif, %%edx \n\t" "movl %%edi, %%esi \n\t" // lp = row // preload "movl bpp, %%eax \n\t" "addl %%eax, %%edi \n\t" // rp = row + bpp "movl _MMXLength, %%ecx \n\t" // prime the pump: load the first Raw(x-bpp) data set "movq -8(%%edi,%%edx,), %%mm7 \n\t" "andl $0x0000003f, %%ecx \n\t" // calc bytes over mult of 64 "sub_8lp: \n\t" "movq (%%edi,%%edx,), %%mm0 \n\t" // load Sub(x) for 1st 8 bytes "paddb %%mm7, %%mm0 \n\t" "movq 8(%%edi,%%edx,), %%mm1 \n\t" // load Sub(x) for 2nd 8 bytes "movq %%mm0, (%%edi,%%edx,) \n\t" // write Raw(x) for 1st 8 bytes // Now mm0 will be used as Raw(x-bpp) for the 2nd group of 8 bytes. // This will be repeated for each group of 8 bytes with the 8th // group being used as the Raw(x-bpp) for the 1st group of the // next loop. "paddb %%mm0, %%mm1 \n\t" "movq 16(%%edi,%%edx,), %%mm2 \n\t" // load Sub(x) for 3rd 8 bytes "movq %%mm1, 8(%%edi,%%edx,) \n\t" // write Raw(x) for 2nd 8 bytes "paddb %%mm1, %%mm2 \n\t" "movq 24(%%edi,%%edx,), %%mm3 \n\t" // load Sub(x) for 4th 8 bytes "movq %%mm2, 16(%%edi,%%edx,) \n\t" // write Raw(x) for 3rd 8 bytes "paddb %%mm2, %%mm3 \n\t" "movq 32(%%edi,%%edx,), %%mm4 \n\t" // load Sub(x) for 5th 8 bytes "movq %%mm3, 24(%%edi,%%edx,) \n\t" // write Raw(x) for 4th 8 bytes "paddb %%mm3, %%mm4 \n\t" "movq 40(%%edi,%%edx,), %%mm5 \n\t" // load Sub(x) for 6th 8 bytes "movq %%mm4, 32(%%edi,%%edx,) \n\t" // write Raw(x) for 5th 8 bytes "paddb %%mm4, %%mm5 \n\t" "movq 48(%%edi,%%edx,), %%mm6 \n\t" // load Sub(x) for 7th 8 bytes "movq %%mm5, 40(%%edi,%%edx,) \n\t" // write Raw(x) for 6th 8 bytes "paddb %%mm5, %%mm6 \n\t" "movq 56(%%edi,%%edx,), %%mm7 \n\t" // load Sub(x) for 8th 8 bytes "movq %%mm6, 48(%%edi,%%edx,) \n\t" // write Raw(x) for 7th 8 bytes "addl $64, %%edx \n\t" "paddb %%mm6, %%mm7 \n\t" "cmpl %%ecx, %%edx \n\t" "movq %%mm7, -8(%%edi,%%edx,) \n\t" // write Raw(x) for 8th 8 bytes "jb sub_8lp \n\t" "cmpl _MMXLength, %%edx \n\t" "jnb sub_8lt8 \n\t" "sub_8lpA: \n\t" "movq (%%edi,%%edx,), %%mm0 \n\t" "addl $8, %%edx \n\t" "paddb %%mm7, %%mm0 \n\t" "cmpl _MMXLength, %%edx \n\t" "movq %%mm0, -8(%%edi,%%edx,) \n\t" // -8 to offset early addl edx "movq %%mm0, %%mm7 \n\t" // move calculated Raw(x) data // to mm1 to be new Raw(x-bpp) // for next loop "jb sub_8lpA \n\t" "sub_8lt8: \n\t" : "=a" (dummy_value_a), // 0 // output regs (dummy) "=D" (dummy_value_D) // 1 : "0" (bpp), // eax // input regs "1" (row) // edi : "%ecx", "%edx", "%esi" // clobber list #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } break; default: // bpp greater than 8 bytes GRR BOGUS { __asm__ __volatile__ ( "movl _dif, %%edx \n\t" // preload "movl row, %%edi \n\t" "movl %%edi, %%esi \n\t" // lp = row // preload "movl bpp, %%eax \n\t" "addl %%eax, %%edi \n\t" // rp = row + bpp "sub_Alp: \n\t" "movq (%%edi,%%edx,), %%mm0 \n\t" "movq (%%esi,%%edx,), %%mm1 \n\t" "addl $8, %%edx \n\t" "paddb %%mm1, %%mm0 \n\t" "cmpl _MMXLength, %%edx \n\t" "movq %%mm0, -8(%%edi,%%edx,) \n\t" // mov does not affect flags; // -8 to offset addl edx "jb sub_Alp \n\t" : "=a" (dummy_value_a), // 0 // output regs (dummy) "=D" (dummy_value_D) // 1 : "0" (bpp), // eax // input regs "1" (row) // edi : "%edx", "%esi" // clobber list #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1" #endif ); } break; } // end switch (bpp) __asm__ __volatile__ ( "movl _MMXLength, %%edx \n\t" //pre "movl row, %%edi \n\t" "cmpl _FullLength, %%edx \n\t" "jnb sub_end \n\t" "movl %%edi, %%esi \n\t" // lp = row //pre "movl bpp, %%eax \n\t" "addl %%eax, %%edi \n\t" // rp = row + bpp "xorl %%eax, %%eax \n\t" "sub_lp2: \n\t" "movb (%%esi,%%edx,), %%al \n\t" "addb %%al, (%%edi,%%edx,) \n\t" "incl %%edx \n\t" "cmpl _FullLength, %%edx \n\t" "jb sub_lp2 \n\t" "sub_end: \n\t" "EMMS \n\t" // end MMX instructions : "=a" (dummy_value_a), // 0 // output regs (dummy) "=D" (dummy_value_D) // 1 : "0" (bpp), // eax // input regs "1" (row) // edi : "%edx", "%esi" // clobber list ); } // end of png_read_filter_row_mmx_sub() #endif //===========================================================================// // // // P N G _ R E A D _ F I L T E R _ R O W _ M M X _ U P // // // //===========================================================================// // Optimized code for PNG Up filter decoder static void /* PRIVATE */ png_read_filter_row_mmx_up(png_row_infop row_info, png_bytep row, png_bytep prev_row) { png_uint_32 len; int dummy_value_d; // fix 'forbidden register 3 (dx) was spilled' error int dummy_value_S; int dummy_value_D; len = row_info->rowbytes; // number of bytes to filter __asm__ __volatile__ ( //pre "movl row, %%edi \n\t" // get # of bytes to alignment #ifdef __PIC__ "pushl %%ebx \n\t" #endif "movl %%edi, %%ecx \n\t" "xorl %%ebx, %%ebx \n\t" "addl $0x7, %%ecx \n\t" "xorl %%eax, %%eax \n\t" "andl $0xfffffff8, %%ecx \n\t" //pre "movl prev_row, %%esi \n\t" "subl %%edi, %%ecx \n\t" "jz up_go \n\t" "up_lp1: \n\t" // fix alignment "movb (%%edi,%%ebx,), %%al \n\t" "addb (%%esi,%%ebx,), %%al \n\t" "incl %%ebx \n\t" "cmpl %%ecx, %%ebx \n\t" "movb %%al, -1(%%edi,%%ebx,) \n\t" // mov does not affect flags; -1 to "jb up_lp1 \n\t" // offset incl ebx "up_go: \n\t" //pre "movl len, %%edx \n\t" "movl %%edx, %%ecx \n\t" "subl %%ebx, %%edx \n\t" // subtract alignment fix "andl $0x0000003f, %%edx \n\t" // calc bytes over mult of 64 "subl %%edx, %%ecx \n\t" // drop over bytes from length // unrolled loop - use all MMX registers and interleave to reduce // number of branch instructions (loops) and reduce partial stalls "up_loop: \n\t" "movq (%%esi,%%ebx,), %%mm1 \n\t" "movq (%%edi,%%ebx,), %%mm0 \n\t" "movq 8(%%esi,%%ebx,), %%mm3 \n\t" "paddb %%mm1, %%mm0 \n\t" "movq 8(%%edi,%%ebx,), %%mm2 \n\t" "movq %%mm0, (%%edi,%%ebx,) \n\t" "paddb %%mm3, %%mm2 \n\t" "movq 16(%%esi,%%ebx,), %%mm5 \n\t" "movq %%mm2, 8(%%edi,%%ebx,) \n\t" "movq 16(%%edi,%%ebx,), %%mm4 \n\t" "movq 24(%%esi,%%ebx,), %%mm7 \n\t" "paddb %%mm5, %%mm4 \n\t" "movq 24(%%edi,%%ebx,), %%mm6 \n\t" "movq %%mm4, 16(%%edi,%%ebx,) \n\t" "paddb %%mm7, %%mm6 \n\t" "movq 32(%%esi,%%ebx,), %%mm1 \n\t" "movq %%mm6, 24(%%edi,%%ebx,) \n\t" "movq 32(%%edi,%%ebx,), %%mm0 \n\t" "movq 40(%%esi,%%ebx,), %%mm3 \n\t" "paddb %%mm1, %%mm0 \n\t" "movq 40(%%edi,%%ebx,), %%mm2 \n\t" "movq %%mm0, 32(%%edi,%%ebx,) \n\t" "paddb %%mm3, %%mm2 \n\t" "movq 48(%%esi,%%ebx,), %%mm5 \n\t" "movq %%mm2, 40(%%edi,%%ebx,) \n\t" "movq 48(%%edi,%%ebx,), %%mm4 \n\t" "movq 56(%%esi,%%ebx,), %%mm7 \n\t" "paddb %%mm5, %%mm4 \n\t" "movq 56(%%edi,%%ebx,), %%mm6 \n\t" "movq %%mm4, 48(%%edi,%%ebx,) \n\t" "addl $64, %%ebx \n\t" "paddb %%mm7, %%mm6 \n\t" "cmpl %%ecx, %%ebx \n\t" "movq %%mm6, -8(%%edi,%%ebx,) \n\t" // (+56)movq does not affect flags; "jb up_loop \n\t" // -8 to offset addl ebx "cmpl $0, %%edx \n\t" // test for bytes over mult of 64 "jz up_end \n\t" "cmpl $8, %%edx \n\t" // test for less than 8 bytes "jb up_lt8 \n\t" // [added by lcreeve@netins.net] "addl %%edx, %%ecx \n\t" "andl $0x00000007, %%edx \n\t" // calc bytes over mult of 8 "subl %%edx, %%ecx \n\t" // drop over bytes from length "jz up_lt8 \n\t" "up_lpA: \n\t" // use MMX regs to update 8 bytes sim. "movq (%%esi,%%ebx,), %%mm1 \n\t" "movq (%%edi,%%ebx,), %%mm0 \n\t" "addl $8, %%ebx \n\t" "paddb %%mm1, %%mm0 \n\t" "cmpl %%ecx, %%ebx \n\t" "movq %%mm0, -8(%%edi,%%ebx,) \n\t" // movq does not affect flags; -8 to "jb up_lpA \n\t" // offset add ebx "cmpl $0, %%edx \n\t" // test for bytes over mult of 8 "jz up_end \n\t" "up_lt8: \n\t" "xorl %%eax, %%eax \n\t" "addl %%edx, %%ecx \n\t" // move over byte count into counter "up_lp2: \n\t" // use x86 regs for remaining bytes "movb (%%edi,%%ebx,), %%al \n\t" "addb (%%esi,%%ebx,), %%al \n\t" "incl %%ebx \n\t" "cmpl %%ecx, %%ebx \n\t" "movb %%al, -1(%%edi,%%ebx,) \n\t" // mov does not affect flags; -1 to "jb up_lp2 \n\t" // offset inc ebx "up_end: \n\t" "EMMS \n\t" // conversion of filtered row complete #ifdef __PIC__ "popl %%ebx \n\t" #endif : "=d" (dummy_value_d), // 0 // output regs (dummy) "=S" (dummy_value_S), // 1 "=D" (dummy_value_D) // 2 : "0" (len), // edx // input regs "1" (prev_row), // esi "2" (row) // edi : "%eax", "%ebx", "%ecx" // clobber list (no input regs!) #if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */ , "%mm0", "%mm1", "%mm2", "%mm3" , "%mm4", "%mm5", "%mm6", "%mm7" #endif ); } // end of png_read_filter_row_mmx_up() #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ /*===========================================================================*/ /* */ /* P N G _ R E A D _ F I L T E R _ R O W */ /* */ /*===========================================================================*/ /* Optimized png_read_filter_row routines */ void /* PRIVATE */ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter) { #ifdef PNG_DEBUG char filnm[10]; #endif #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) /* GRR: these are superseded by png_ptr->asm_flags: */ #define UseMMX_sub 1 // GRR: converted 20000730 #define UseMMX_up 1 // GRR: converted 20000729 #define UseMMX_avg 1 // GRR: converted 20000828 (+ 16-bit bugfix 20000916) #define UseMMX_paeth 1 // GRR: converted 20000828 if (_mmx_supported == 2) { /* this should have happened in png_init_mmx_flags() already */ #if !defined(PNG_1_0_X) png_warning(png_ptr, "asm_flags may not have been initialized"); #endif png_mmx_support(); } #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ #ifdef PNG_DEBUG png_debug(1, "in png_read_filter_row (pnggccrd.c)\n"); switch (filter) { case 0: sprintf(filnm, "none"); break; case 1: sprintf(filnm, "sub-%s", #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)? "MMX" : #endif #endif "x86"); break; case 2: sprintf(filnm, "up-%s", #ifdef PNG_ASSEMBLER_CODE_SUPPORTED #if !defined(PNG_1_0_X) (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP)? "MMX" : #endif #endif "x86"); break; case 3: sprintf(filnm, "avg-%s", #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)? "MMX" : #endif #endif "x86"); break; case 4: sprintf(filnm, "Paeth-%s", #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)? "MMX": #endif #endif "x86"); break; default: sprintf(filnm, "unknw"); break; } png_debug2(0, "row_number=%5ld, %5s, ", png_ptr->row_number, filnm); png_debug1(0, "row=0x%08lx, ", (unsigned long)row); png_debug2(0, "pixdepth=%2d, bytes=%d, ", (int)row_info->pixel_depth, (int)((row_info->pixel_depth + 7) >> 3)); png_debug1(0,"rowbytes=%8ld\n", row_info->rowbytes); #endif /* PNG_DEBUG */ switch (filter) { case PNG_FILTER_VALUE_NONE: break; case PNG_FILTER_VALUE_SUB: #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB) && (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) #else if (_mmx_supported) #endif { png_read_filter_row_mmx_sub(row_info, row); } else #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { png_uint_32 i; png_uint_32 istop = row_info->rowbytes; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_bytep rp = row + bpp; png_bytep lp = row; for (i = bpp; i < istop; i++) { *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); rp++; } } /* end !UseMMX_sub */ break; case PNG_FILTER_VALUE_UP: #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP) && (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) #else if (_mmx_supported) #endif { png_read_filter_row_mmx_up(row_info, row, prev_row); } else #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { png_uint_32 i; png_uint_32 istop = row_info->rowbytes; png_bytep rp = row; png_bytep pp = prev_row; for (i = 0; i < istop; ++i) { *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); rp++; } } /* end !UseMMX_up */ break; case PNG_FILTER_VALUE_AVG: #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG) && (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) #else if (_mmx_supported) #endif { png_read_filter_row_mmx_avg(row_info, row, prev_row); } else #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { png_uint_32 i; png_bytep rp = row; png_bytep pp = prev_row; png_bytep lp = row; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_uint_32 istop = row_info->rowbytes - bpp; for (i = 0; i < bpp; i++) { *rp = (png_byte)(((int)(*rp) + ((int)(*pp++) >> 1)) & 0xff); rp++; } for (i = 0; i < istop; i++) { *rp = (png_byte)(((int)(*rp) + ((int)(*pp++ + *lp++) >> 1)) & 0xff); rp++; } } /* end !UseMMX_avg */ break; case PNG_FILTER_VALUE_PAETH: #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK) #if !defined(PNG_1_0_X) if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH) && (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) #else if (_mmx_supported) #endif { png_read_filter_row_mmx_paeth(row_info, row, prev_row); } else #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ { png_uint_32 i; png_bytep rp = row; png_bytep pp = prev_row; png_bytep lp = row; png_bytep cp = prev_row; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_uint_32 istop = row_info->rowbytes - bpp; for (i = 0; i < bpp; i++) { *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); rp++; } for (i = 0; i < istop; i++) /* use leftover rp,pp */ { int a, b, c, pa, pb, pc, p; a = *lp++; b = *pp++; c = *cp++; p = b - c; pc = a - c; #ifdef PNG_USE_ABS pa = abs(p); pb = abs(pc); pc = abs(p + pc); #else pa = p < 0 ? -p : p; pb = pc < 0 ? -pc : pc; pc = (p + pc) < 0 ? -(p + pc) : p + pc; #endif /* if (pa <= pb && pa <= pc) p = a; else if (pb <= pc) p = b; else p = c; */ p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; *rp = (png_byte)(((int)(*rp) + p) & 0xff); rp++; } } /* end !UseMMX_paeth */ break; default: png_warning(png_ptr, "Ignoring bad row-filter type"); *row=0; break; } } #endif /* PNG_HAVE_ASSEMBLER_READ_FILTER_ROW */ /*===========================================================================*/ /* */ /* P N G _ M M X _ S U P P O R T */ /* */ /*===========================================================================*/ /* GRR NOTES: (1) the following code assumes 386 or better (pushfl/popfl) * (2) all instructions compile with gcc 2.7.2.3 and later * (3) the function is moved down here to prevent gcc from * inlining it in multiple places and then barfing be- * cause the ".NOT_SUPPORTED" label is multiply defined * [is there a way to signal that a *single* function should * not be inlined? is there a way to modify the label for * each inlined instance, e.g., by appending _1, _2, etc.? * maybe if don't use leading "." in label name? (nope...sigh)] */ int PNGAPI png_mmx_support(void) { #if defined(PNG_MMX_CODE_SUPPORTED) __asm__ __volatile__ ( "pushl %%ebx \n\t" // ebx gets clobbered by CPUID instruction "pushl %%ecx \n\t" // so does ecx... "pushl %%edx \n\t" // ...and edx (but ecx & edx safe on Linux) // ".byte 0x66 \n\t" // convert 16-bit pushf to 32-bit pushfd // "pushf \n\t" // 16-bit pushf "pushfl \n\t" // save Eflag to stack "popl %%eax \n\t" // get Eflag from stack into eax "movl %%eax, %%ecx \n\t" // make another copy of Eflag in ecx "xorl $0x200000, %%eax \n\t" // toggle ID bit in Eflag (i.e., bit 21) "pushl %%eax \n\t" // save modified Eflag back to stack // ".byte 0x66 \n\t" // convert 16-bit popf to 32-bit popfd // "popf \n\t" // 16-bit popf "popfl \n\t" // restore modified value to Eflag reg "pushfl \n\t" // save Eflag to stack "popl %%eax \n\t" // get Eflag from stack "pushl %%ecx \n\t" // save original Eflag to stack "popfl \n\t" // restore original Eflag "xorl %%ecx, %%eax \n\t" // compare new Eflag with original Eflag "jz 0f \n\t" // if same, CPUID instr. is not supported "xorl %%eax, %%eax \n\t" // set eax to zero // ".byte 0x0f, 0xa2 \n\t" // CPUID instruction (two-byte opcode) "cpuid \n\t" // get the CPU identification info "cmpl $1, %%eax \n\t" // make sure eax return non-zero value "jl 0f \n\t" // if eax is zero, MMX is not supported "xorl %%eax, %%eax \n\t" // set eax to zero and... "incl %%eax \n\t" // ...increment eax to 1. This pair is // faster than the instruction "mov eax, 1" "cpuid \n\t" // get the CPU identification info again "andl $0x800000, %%edx \n\t" // mask out all bits but MMX bit (23) "cmpl $0, %%edx \n\t" // 0 = MMX not supported "jz 0f \n\t" // non-zero = yes, MMX IS supported "movl $1, %%eax \n\t" // set return value to 1 "jmp 1f \n\t" // DONE: have MMX support "0: \n\t" // .NOT_SUPPORTED: target label for jump instructions "movl $0, %%eax \n\t" // set return value to 0 "1: \n\t" // .RETURN: target label for jump instructions "movl %%eax, _mmx_supported \n\t" // save in global static variable, too "popl %%edx \n\t" // restore edx "popl %%ecx \n\t" // restore ecx "popl %%ebx \n\t" // restore ebx // "ret \n\t" // DONE: no MMX support // (fall through to standard C "ret") : // output list (none) : // any variables used on input (none) : "%eax" // clobber list // , "%ebx", "%ecx", "%edx" // GRR: we handle these manually // , "memory" // if write to a variable gcc thought was in a reg // , "cc" // "condition codes" (flag bits) ); #else _mmx_supported = 0; #endif /* PNG_MMX_CODE_SUPPORTED */ return _mmx_supported; } #endif /* PNG_USE_PNGGCCRD */ gamera-3.3.3/src/libpng-1.2.5/pngget.c0000644000076500000000000006221310714675701016111 0ustar chriswheel /* pngget.c - retrieval of values from info struct * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ #define PNG_INTERNAL #include "png.h" png_uint_32 PNGAPI png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->valid & flag); else return(0); } png_uint_32 PNGAPI png_get_rowbytes(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->rowbytes); else return(0); } #if defined(PNG_INFO_IMAGE_SUPPORTED) png_bytepp PNGAPI png_get_rows(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->row_pointers); else return(0); } #endif #ifdef PNG_EASY_ACCESS_SUPPORTED /* easy access to info, added in libpng-0.99 */ png_uint_32 PNGAPI png_get_image_width(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) { return info_ptr->width; } return (0); } png_uint_32 PNGAPI png_get_image_height(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) { return info_ptr->height; } return (0); } png_byte PNGAPI png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) { return info_ptr->bit_depth; } return (0); } png_byte PNGAPI png_get_color_type(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) { return info_ptr->color_type; } return (0); } png_byte PNGAPI png_get_filter_type(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) { return info_ptr->filter_type; } return (0); } png_byte PNGAPI png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) { return info_ptr->interlace_type; } return (0); } png_byte PNGAPI png_get_compression_type(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) { return info_ptr->compression_type; } return (0); } png_uint_32 PNGAPI png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) #if defined(PNG_pHYs_SUPPORTED) if (info_ptr->valid & PNG_INFO_pHYs) { png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter"); if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) return (0); else return (info_ptr->x_pixels_per_unit); } #else return (0); #endif return (0); } png_uint_32 PNGAPI png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) #if defined(PNG_pHYs_SUPPORTED) if (info_ptr->valid & PNG_INFO_pHYs) { png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter"); if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) return (0); else return (info_ptr->y_pixels_per_unit); } #else return (0); #endif return (0); } png_uint_32 PNGAPI png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) #if defined(PNG_pHYs_SUPPORTED) if (info_ptr->valid & PNG_INFO_pHYs) { png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter"); if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER || info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit) return (0); else return (info_ptr->x_pixels_per_unit); } #else return (0); #endif return (0); } #ifdef PNG_FLOATING_POINT_SUPPORTED float PNGAPI png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) #if defined(PNG_pHYs_SUPPORTED) if (info_ptr->valid & PNG_INFO_pHYs) { png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio"); if (info_ptr->x_pixels_per_unit == 0) return ((float)0.0); else return ((float)((float)info_ptr->y_pixels_per_unit /(float)info_ptr->x_pixels_per_unit)); } #else return (0.0); #endif return ((float)0.0); } #endif png_int_32 PNGAPI png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) #if defined(PNG_oFFs_SUPPORTED) if (info_ptr->valid & PNG_INFO_oFFs) { png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) return (0); else return (info_ptr->x_offset); } #else return (0); #endif return (0); } png_int_32 PNGAPI png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) #if defined(PNG_oFFs_SUPPORTED) if (info_ptr->valid & PNG_INFO_oFFs) { png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) return (0); else return (info_ptr->y_offset); } #else return (0); #endif return (0); } png_int_32 PNGAPI png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) #if defined(PNG_oFFs_SUPPORTED) if (info_ptr->valid & PNG_INFO_oFFs) { png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) return (0); else return (info_ptr->x_offset); } #else return (0); #endif return (0); } png_int_32 PNGAPI png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) #if defined(PNG_oFFs_SUPPORTED) if (info_ptr->valid & PNG_INFO_oFFs) { png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) return (0); else return (info_ptr->y_offset); } #else return (0); #endif return (0); } #if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) png_uint_32 PNGAPI png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) { return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr) *.0254 +.5)); } png_uint_32 PNGAPI png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) { return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr) *.0254 +.5)); } png_uint_32 PNGAPI png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) { return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr) *.0254 +.5)); } float PNGAPI png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr) { return ((float)png_get_x_offset_microns(png_ptr, info_ptr) *.00003937); } float PNGAPI png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr) { return ((float)png_get_y_offset_microns(png_ptr, info_ptr) *.00003937); } #if defined(PNG_pHYs_SUPPORTED) png_uint_32 PNGAPI png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) { png_uint_32 retval = 0; if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) { png_debug1(1, "in %s retrieval function\n", "pHYs"); if (res_x != NULL) { *res_x = info_ptr->x_pixels_per_unit; retval |= PNG_INFO_pHYs; } if (res_y != NULL) { *res_y = info_ptr->y_pixels_per_unit; retval |= PNG_INFO_pHYs; } if (unit_type != NULL) { *unit_type = (int)info_ptr->phys_unit_type; retval |= PNG_INFO_pHYs; if(*unit_type == 1) { if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); } } } return (retval); } #endif /* PNG_pHYs_SUPPORTED */ #endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ /* png_get_channels really belongs in here, too, but it's been around longer */ #endif /* PNG_EASY_ACCESS_SUPPORTED */ png_byte PNGAPI png_get_channels(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->channels); else return (0); } png_bytep PNGAPI png_get_signature(png_structp png_ptr, png_infop info_ptr) { if (png_ptr != NULL && info_ptr != NULL) return(info_ptr->signature); else return (NULL); } #if defined(PNG_bKGD_SUPPORTED) png_uint_32 PNGAPI png_get_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p *background) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) && background != NULL) { png_debug1(1, "in %s retrieval function\n", "bKGD"); *background = &(info_ptr->background); return (PNG_INFO_bKGD); } return (0); } #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED png_uint_32 PNGAPI png_get_cHRM(png_structp png_ptr, png_infop info_ptr, double *white_x, double *white_y, double *red_x, double *red_y, double *green_x, double *green_y, double *blue_x, double *blue_y) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) { png_debug1(1, "in %s retrieval function\n", "cHRM"); if (white_x != NULL) *white_x = (double)info_ptr->x_white; if (white_y != NULL) *white_y = (double)info_ptr->y_white; if (red_x != NULL) *red_x = (double)info_ptr->x_red; if (red_y != NULL) *red_y = (double)info_ptr->y_red; if (green_x != NULL) *green_x = (double)info_ptr->x_green; if (green_y != NULL) *green_y = (double)info_ptr->y_green; if (blue_x != NULL) *blue_x = (double)info_ptr->x_blue; if (blue_y != NULL) *blue_y = (double)info_ptr->y_blue; return (PNG_INFO_cHRM); } return (0); } #endif #ifdef PNG_FIXED_POINT_SUPPORTED png_uint_32 PNGAPI png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, png_fixed_point *blue_x, png_fixed_point *blue_y) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) { png_debug1(1, "in %s retrieval function\n", "cHRM"); if (white_x != NULL) *white_x = info_ptr->int_x_white; if (white_y != NULL) *white_y = info_ptr->int_y_white; if (red_x != NULL) *red_x = info_ptr->int_x_red; if (red_y != NULL) *red_y = info_ptr->int_y_red; if (green_x != NULL) *green_x = info_ptr->int_x_green; if (green_y != NULL) *green_y = info_ptr->int_y_green; if (blue_x != NULL) *blue_x = info_ptr->int_x_blue; if (blue_y != NULL) *blue_y = info_ptr->int_y_blue; return (PNG_INFO_cHRM); } return (0); } #endif #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED png_uint_32 PNGAPI png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) && file_gamma != NULL) { png_debug1(1, "in %s retrieval function\n", "gAMA"); *file_gamma = (double)info_ptr->gamma; return (PNG_INFO_gAMA); } return (0); } #endif #ifdef PNG_FIXED_POINT_SUPPORTED png_uint_32 PNGAPI png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point *int_file_gamma) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) && int_file_gamma != NULL) { png_debug1(1, "in %s retrieval function\n", "gAMA"); *int_file_gamma = info_ptr->int_gamma; return (PNG_INFO_gAMA); } return (0); } #endif #endif #if defined(PNG_sRGB_SUPPORTED) png_uint_32 PNGAPI png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) && file_srgb_intent != NULL) { png_debug1(1, "in %s retrieval function\n", "sRGB"); *file_srgb_intent = (int)info_ptr->srgb_intent; return (PNG_INFO_sRGB); } return (0); } #endif #if defined(PNG_iCCP_SUPPORTED) png_uint_32 PNGAPI png_get_iCCP(png_structp png_ptr, png_infop info_ptr, png_charpp name, int *compression_type, png_charpp profile, png_uint_32 *proflen) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) && name != NULL && profile != NULL && proflen != NULL) { png_debug1(1, "in %s retrieval function\n", "iCCP"); *name = info_ptr->iccp_name; *profile = info_ptr->iccp_profile; /* compression_type is a dummy so the API won't have to change if we introduce multiple compression types later. */ *proflen = (int)info_ptr->iccp_proflen; *compression_type = (int)info_ptr->iccp_compression; return (PNG_INFO_iCCP); } return (0); } #endif #if defined(PNG_sPLT_SUPPORTED) png_uint_32 PNGAPI png_get_sPLT(png_structp png_ptr, png_infop info_ptr, png_sPLT_tpp spalettes) { if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) *spalettes = info_ptr->splt_palettes; return ((png_uint_32)info_ptr->splt_palettes_num); } #endif #if defined(PNG_hIST_SUPPORTED) png_uint_32 PNGAPI png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) && hist != NULL) { png_debug1(1, "in %s retrieval function\n", "hIST"); *hist = info_ptr->hist; return (PNG_INFO_hIST); } return (0); } #endif png_uint_32 PNGAPI png_get_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_type, int *compression_type, int *filter_type) { if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL && bit_depth != NULL && color_type != NULL) { int pixel_depth, channels; png_uint_32 rowbytes_per_pixel; png_debug1(1, "in %s retrieval function\n", "IHDR"); *width = info_ptr->width; *height = info_ptr->height; *bit_depth = info_ptr->bit_depth; if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16) png_error(png_ptr, "Invalid bit depth"); *color_type = info_ptr->color_type; if (info_ptr->color_type > 6) png_error(png_ptr, "Invalid color type"); if (compression_type != NULL) *compression_type = info_ptr->compression_type; if (filter_type != NULL) *filter_type = info_ptr->filter_type; if (interlace_type != NULL) *interlace_type = info_ptr->interlace_type; /* check for potential overflow of rowbytes */ if (*color_type == PNG_COLOR_TYPE_PALETTE) channels = 1; else if (*color_type & PNG_COLOR_MASK_COLOR) channels = 3; else channels = 1; if (*color_type & PNG_COLOR_MASK_ALPHA) channels++; pixel_depth = *bit_depth * channels; rowbytes_per_pixel = (pixel_depth + 7) >> 3; if (width == 0 || *width > PNG_MAX_UINT) png_error(png_ptr, "Invalid image width"); if (height == 0 || *height > PNG_MAX_UINT) png_error(png_ptr, "Invalid image height"); if (*width > PNG_MAX_UINT/rowbytes_per_pixel - 64) { png_error(png_ptr, "Width too large for libpng to process image data."); } return (1); } return (0); } #if defined(PNG_oFFs_SUPPORTED) png_uint_32 PNGAPI png_get_oFFs(png_structp png_ptr, png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) && offset_x != NULL && offset_y != NULL && unit_type != NULL) { png_debug1(1, "in %s retrieval function\n", "oFFs"); *offset_x = info_ptr->x_offset; *offset_y = info_ptr->y_offset; *unit_type = (int)info_ptr->offset_unit_type; return (PNG_INFO_oFFs); } return (0); } #endif #if defined(PNG_pCAL_SUPPORTED) png_uint_32 PNGAPI png_get_pCAL(png_structp png_ptr, png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, png_charp *units, png_charpp *params) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && nparams != NULL && units != NULL && params != NULL) { png_debug1(1, "in %s retrieval function\n", "pCAL"); *purpose = info_ptr->pcal_purpose; *X0 = info_ptr->pcal_X0; *X1 = info_ptr->pcal_X1; *type = (int)info_ptr->pcal_type; *nparams = (int)info_ptr->pcal_nparams; *units = info_ptr->pcal_units; *params = info_ptr->pcal_params; return (PNG_INFO_pCAL); } return (0); } #endif #if defined(PNG_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED png_uint_32 PNGAPI png_get_sCAL(png_structp png_ptr, png_infop info_ptr, int *unit, double *width, double *height) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) { *unit = info_ptr->scal_unit; *width = info_ptr->scal_pixel_width; *height = info_ptr->scal_pixel_height; return (PNG_INFO_sCAL); } return(0); } #else #ifdef PNG_FIXED_POINT_SUPPORTED png_uint_32 PNGAPI png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr, int *unit, png_charpp width, png_charpp height) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) { *unit = info_ptr->scal_unit; *width = info_ptr->scal_s_width; *height = info_ptr->scal_s_height; return (PNG_INFO_sCAL); } return(0); } #endif #endif #endif #if defined(PNG_pHYs_SUPPORTED) png_uint_32 PNGAPI png_get_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) { png_uint_32 retval = 0; if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) { png_debug1(1, "in %s retrieval function\n", "pHYs"); if (res_x != NULL) { *res_x = info_ptr->x_pixels_per_unit; retval |= PNG_INFO_pHYs; } if (res_y != NULL) { *res_y = info_ptr->y_pixels_per_unit; retval |= PNG_INFO_pHYs; } if (unit_type != NULL) { *unit_type = (int)info_ptr->phys_unit_type; retval |= PNG_INFO_pHYs; } } return (retval); } #endif png_uint_32 PNGAPI png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) && palette != NULL) { png_debug1(1, "in %s retrieval function\n", "PLTE"); *palette = info_ptr->palette; *num_palette = info_ptr->num_palette; png_debug1(3, "num_palette = %d\n", *num_palette); return (PNG_INFO_PLTE); } return (0); } #if defined(PNG_sBIT_SUPPORTED) png_uint_32 PNGAPI png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) && sig_bit != NULL) { png_debug1(1, "in %s retrieval function\n", "sBIT"); *sig_bit = &(info_ptr->sig_bit); return (PNG_INFO_sBIT); } return (0); } #endif #if defined(PNG_TEXT_SUPPORTED) png_uint_32 PNGAPI png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, int *num_text) { if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) { png_debug1(1, "in %s retrieval function\n", (png_ptr->chunk_name[0] == '\0' ? "text" : (png_const_charp)png_ptr->chunk_name)); if (text_ptr != NULL) *text_ptr = info_ptr->text; if (num_text != NULL) *num_text = info_ptr->num_text; return ((png_uint_32)info_ptr->num_text); } if (num_text != NULL) *num_text = 0; return(0); } #endif #if defined(PNG_tIME_SUPPORTED) png_uint_32 PNGAPI png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) { if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) && mod_time != NULL) { png_debug1(1, "in %s retrieval function\n", "tIME"); *mod_time = &(info_ptr->mod_time); return (PNG_INFO_tIME); } return (0); } #endif #if defined(PNG_tRNS_SUPPORTED) png_uint_32 PNGAPI png_get_tRNS(png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values) { png_uint_32 retval = 0; if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) { png_debug1(1, "in %s retrieval function\n", "tRNS"); if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { if (trans != NULL) { *trans = info_ptr->trans; retval |= PNG_INFO_tRNS; } if (trans_values != NULL) *trans_values = &(info_ptr->trans_values); } else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ { if (trans_values != NULL) { *trans_values = &(info_ptr->trans_values); retval |= PNG_INFO_tRNS; } if(trans != NULL) *trans = NULL; } if(num_trans != NULL) { *num_trans = info_ptr->num_trans; retval |= PNG_INFO_tRNS; } } return (retval); } #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) png_uint_32 PNGAPI png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, png_unknown_chunkpp unknowns) { if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) *unknowns = info_ptr->unknown_chunks; return ((png_uint_32)info_ptr->unknown_chunks_num); } #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) png_byte PNGAPI png_get_rgb_to_gray_status (png_structp png_ptr) { return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0); } #endif #if defined(PNG_USER_CHUNKS_SUPPORTED) png_voidp PNGAPI png_get_user_chunk_ptr(png_structp png_ptr) { return (png_ptr? png_ptr->user_chunk_ptr : NULL); } #endif png_uint_32 PNGAPI png_get_compression_buffer_size(png_structp png_ptr) { return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L); } #ifndef PNG_1_0_X #ifdef PNG_ASSEMBLER_CODE_SUPPORTED /* this function was added to libpng 1.2.0 and should exist by default */ png_uint_32 PNGAPI png_get_asm_flags (png_structp png_ptr) { return (png_uint_32)(png_ptr? png_ptr->asm_flags : 0L); } /* this function was added to libpng 1.2.0 and should exist by default */ png_uint_32 PNGAPI png_get_asm_flagmask (int flag_select) { png_uint_32 settable_asm_flags = 0; if (flag_select & PNG_SELECT_READ) settable_asm_flags |= PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | PNG_ASM_FLAG_MMX_READ_INTERLACE | PNG_ASM_FLAG_MMX_READ_FILTER_SUB | PNG_ASM_FLAG_MMX_READ_FILTER_UP | PNG_ASM_FLAG_MMX_READ_FILTER_AVG | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; /* no non-MMX flags yet */ #if 0 /* GRR: no write-flags yet, either, but someday... */ if (flag_select & PNG_SELECT_WRITE) settable_asm_flags |= PNG_ASM_FLAG_MMX_WRITE_ [whatever] ; #endif /* 0 */ return settable_asm_flags; /* _theoretically_ settable capabilities only */ } #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */ /* this function was added to libpng 1.2.0 */ png_uint_32 PNGAPI png_get_mmx_flagmask (int flag_select, int *compilerID) { png_uint_32 settable_mmx_flags = 0; if (flag_select & PNG_SELECT_READ) settable_mmx_flags |= PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | PNG_ASM_FLAG_MMX_READ_INTERLACE | PNG_ASM_FLAG_MMX_READ_FILTER_SUB | PNG_ASM_FLAG_MMX_READ_FILTER_UP | PNG_ASM_FLAG_MMX_READ_FILTER_AVG | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ; #if 0 /* GRR: no MMX write support yet, but someday... */ if (flag_select & PNG_SELECT_WRITE) settable_mmx_flags |= PNG_ASM_FLAG_MMX_WRITE_ [whatever] ; #endif /* 0 */ if (compilerID != NULL) { #ifdef PNG_USE_PNGVCRD *compilerID = 1; /* MSVC */ #else #ifdef PNG_USE_PNGGCCRD *compilerID = 2; /* gcc/gas */ #else *compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */ #endif #endif } return settable_mmx_flags; /* _theoretically_ settable capabilities only */ } /* this function was added to libpng 1.2.0 */ png_byte PNGAPI png_get_mmx_bitdepth_threshold (png_structp png_ptr) { return (png_byte)(png_ptr? png_ptr->mmx_bitdepth_threshold : 0); } /* this function was added to libpng 1.2.0 */ png_uint_32 PNGAPI png_get_mmx_rowbytes_threshold (png_structp png_ptr) { return (png_uint_32)(png_ptr? png_ptr->mmx_rowbytes_threshold : 0L); } #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ #endif /* PNG_1_0_X */ gamera-3.3.3/src/libpng-1.2.5/pngmem.c0000644000076500000000000003721110714675701016110 0ustar chriswheel /* pngmem.c - stub functions for memory allocation * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This file provides a location for all memory allocation. Users who * need special memory handling are expected to supply replacement * functions for png_malloc() and png_free(), and to use * png_create_read_struct_2() and png_create_write_struct_2() to * identify the replacement functions. */ #define PNG_INTERNAL #include "png.h" /* Borland DOS special memory handler */ #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) /* if you change this, be sure to change the one in png.h also */ /* Allocate memory for a png_struct. The malloc and memset can be replaced by a single call to calloc() if this is thought to improve performance. */ png_voidp /* PRIVATE */ png_create_struct(int type) { #ifdef PNG_USER_MEM_SUPPORTED return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); } /* Alternate version of png_create_struct, for use with user-defined malloc. */ png_voidp /* PRIVATE */ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) { #endif /* PNG_USER_MEM_SUPPORTED */ png_size_t size; png_voidp struct_ptr; if (type == PNG_STRUCT_INFO) size = sizeof(png_info); else if (type == PNG_STRUCT_PNG) size = sizeof(png_struct); else return (png_get_copyright()); #ifdef PNG_USER_MEM_SUPPORTED if(malloc_fn != NULL) { png_struct dummy_struct; png_structp png_ptr = &dummy_struct; png_ptr->mem_ptr=mem_ptr; struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); } else #endif /* PNG_USER_MEM_SUPPORTED */ struct_ptr = (png_voidp)farmalloc(size)); if (struct_ptr != NULL) png_memset(struct_ptr, 0, size); return (struct_ptr); } /* Free memory allocated by a png_create_struct() call */ void /* PRIVATE */ png_destroy_struct(png_voidp struct_ptr) { #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); } /* Free memory allocated by a png_create_struct() call */ void /* PRIVATE */ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr) { #endif if (struct_ptr != NULL) { #ifdef PNG_USER_MEM_SUPPORTED if(free_fn != NULL) { png_struct dummy_struct; png_structp png_ptr = &dummy_struct; png_ptr->mem_ptr=mem_ptr; (*(free_fn))(png_ptr, struct_ptr); return; } #endif /* PNG_USER_MEM_SUPPORTED */ farfree (struct_ptr); } } /* Allocate memory. For reasonable files, size should never exceed * 64K. However, zlib may allocate more then 64K if you don't tell * it not to. See zconf.h and png.h for more information. zlib does * need to allocate exactly 64K, so whatever you call here must * have the ability to do that. * * Borland seems to have a problem in DOS mode for exactly 64K. * It gives you a segment with an offset of 8 (perhaps to store its * memory stuff). zlib doesn't like this at all, so we have to * detect and deal with it. This code should not be needed in * Windows or OS/2 modes, and only in 16 bit mode. This code has * been updated by Alexander Lehmann for version 0.89 to waste less * memory. * * Note that we can't use png_size_t for the "size" declaration, * since on some systems a png_size_t is a 16-bit quantity, and as a * result, we would be truncating potentially larger memory requests * (which should cause a fatal error) and introducing major problems. */ png_voidp PNGAPI png_malloc(png_structp png_ptr, png_uint_32 size) { png_voidp ret; if (png_ptr == NULL || size == 0) return (NULL); #ifdef PNG_USER_MEM_SUPPORTED if(png_ptr->malloc_fn != NULL) { ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of memory!"); return (ret); } else return png_malloc_default(png_ptr, size); } png_voidp PNGAPI png_malloc_default(png_structp png_ptr, png_uint_32 size) { png_voidp ret; #endif /* PNG_USER_MEM_SUPPORTED */ #ifdef PNG_MAX_MALLOC_64K if (size > (png_uint_32)65536L) png_error(png_ptr, "Cannot Allocate > 64K"); #endif if (size == (png_uint_32)65536L) { if (png_ptr->offset_table == NULL) { /* try to see if we need to do any of this fancy stuff */ ret = farmalloc(size); if (ret == NULL || ((png_size_t)ret & 0xffff)) { int num_blocks; png_uint_32 total_size; png_bytep table; int i; png_byte huge * hptr; if (ret != NULL) { farfree(ret); ret = NULL; } if(png_ptr->zlib_window_bits > 14) num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); else num_blocks = 1; if (png_ptr->zlib_mem_level >= 7) num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); else num_blocks++; total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; table = farmalloc(total_size); if (table == NULL) { if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */ else png_warning(png_ptr, "Out Of Memory."); return (NULL); } if ((png_size_t)table & 0xfff0) { if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Farmalloc didn't return normalized pointer"); else png_warning(png_ptr, "Farmalloc didn't return normalized pointer"); return (NULL); } png_ptr->offset_table = table; png_ptr->offset_table_ptr = farmalloc(num_blocks * sizeof (png_bytep)); if (png_ptr->offset_table_ptr == NULL) { if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */ else png_warning(png_ptr, "Out Of memory."); return (NULL); } hptr = (png_byte huge *)table; if ((png_size_t)hptr & 0xf) { hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ } for (i = 0; i < num_blocks; i++) { png_ptr->offset_table_ptr[i] = (png_bytep)hptr; hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ } png_ptr->offset_table_number = num_blocks; png_ptr->offset_table_count = 0; png_ptr->offset_table_count_free = 0; } } if (png_ptr->offset_table_count >= png_ptr->offset_table_number) { if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ else png_warning(png_ptr, "Out of Memory."); return (NULL); } ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; } else ret = farmalloc(size); if (ret == NULL) { if (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ else png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ } return (ret); } /* free a pointer allocated by png_malloc(). In the default configuration, png_ptr is not used, but is passed in case it is needed. If ptr is NULL, return without taking any action. */ void PNGAPI png_free(png_structp png_ptr, png_voidp ptr) { if (png_ptr == NULL || ptr == NULL) return; #ifdef PNG_USER_MEM_SUPPORTED if (png_ptr->free_fn != NULL) { (*(png_ptr->free_fn))(png_ptr, ptr); return; } else png_free_default(png_ptr, ptr); } void PNGAPI png_free_default(png_structp png_ptr, png_voidp ptr) { #endif /* PNG_USER_MEM_SUPPORTED */ if (png_ptr->offset_table != NULL) { int i; for (i = 0; i < png_ptr->offset_table_count; i++) { if (ptr == png_ptr->offset_table_ptr[i]) { ptr = NULL; png_ptr->offset_table_count_free++; break; } } if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) { farfree(png_ptr->offset_table); farfree(png_ptr->offset_table_ptr); png_ptr->offset_table = NULL; png_ptr->offset_table_ptr = NULL; } } if (ptr != NULL) { farfree(ptr); } } #else /* Not the Borland DOS special memory handler */ /* Allocate memory for a png_struct or a png_info. The malloc and memset can be replaced by a single call to calloc() if this is thought to improve performance noticably. */ png_voidp /* PRIVATE */ png_create_struct(int type) { #ifdef PNG_USER_MEM_SUPPORTED return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); } /* Allocate memory for a png_struct or a png_info. The malloc and memset can be replaced by a single call to calloc() if this is thought to improve performance noticably. */ png_voidp /* PRIVATE */ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) { #endif /* PNG_USER_MEM_SUPPORTED */ png_size_t size; png_voidp struct_ptr; if (type == PNG_STRUCT_INFO) size = sizeof(png_info); else if (type == PNG_STRUCT_PNG) size = sizeof(png_struct); else return (NULL); #ifdef PNG_USER_MEM_SUPPORTED if(malloc_fn != NULL) { png_struct dummy_struct; png_structp png_ptr = &dummy_struct; png_ptr->mem_ptr=mem_ptr; struct_ptr = (*(malloc_fn))(png_ptr, size); if (struct_ptr != NULL) png_memset(struct_ptr, 0, size); return (struct_ptr); } #endif /* PNG_USER_MEM_SUPPORTED */ #if defined(__TURBOC__) && !defined(__FLAT__) if ((struct_ptr = (png_voidp)farmalloc(size)) != NULL) #else # if defined(_MSC_VER) && defined(MAXSEG_64K) if ((struct_ptr = (png_voidp)halloc(size,1)) != NULL) # else if ((struct_ptr = (png_voidp)malloc(size)) != NULL) # endif #endif { png_memset(struct_ptr, 0, size); } return (struct_ptr); } /* Free memory allocated by a png_create_struct() call */ void /* PRIVATE */ png_destroy_struct(png_voidp struct_ptr) { #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); } /* Free memory allocated by a png_create_struct() call */ void /* PRIVATE */ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, png_voidp mem_ptr) { #endif /* PNG_USER_MEM_SUPPORTED */ if (struct_ptr != NULL) { #ifdef PNG_USER_MEM_SUPPORTED if(free_fn != NULL) { png_struct dummy_struct; png_structp png_ptr = &dummy_struct; png_ptr->mem_ptr=mem_ptr; (*(free_fn))(png_ptr, struct_ptr); return; } #endif /* PNG_USER_MEM_SUPPORTED */ #if defined(__TURBOC__) && !defined(__FLAT__) farfree(struct_ptr); #else # if defined(_MSC_VER) && defined(MAXSEG_64K) hfree(struct_ptr); # else free(struct_ptr); # endif #endif } } /* Allocate memory. For reasonable files, size should never exceed 64K. However, zlib may allocate more then 64K if you don't tell it not to. See zconf.h and png.h for more information. zlib does need to allocate exactly 64K, so whatever you call here must have the ability to do that. */ png_voidp PNGAPI png_malloc(png_structp png_ptr, png_uint_32 size) { png_voidp ret; if (png_ptr == NULL || size == 0) return (NULL); #ifdef PNG_USER_MEM_SUPPORTED if(png_ptr->malloc_fn != NULL) { ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of Memory!"); return (ret); } else return (png_malloc_default(png_ptr, size)); } png_voidp PNGAPI png_malloc_default(png_structp png_ptr, png_uint_32 size) { png_voidp ret; #endif /* PNG_USER_MEM_SUPPORTED */ #ifdef PNG_MAX_MALLOC_64K if (size > (png_uint_32)65536L) { if(png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Cannot Allocate > 64K"); else return NULL; } #endif #if defined(__TURBOC__) && !defined(__FLAT__) ret = farmalloc(size); #else # if defined(_MSC_VER) && defined(MAXSEG_64K) ret = halloc(size, 1); # else ret = malloc((size_t)size); # endif #endif if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) png_error(png_ptr, "Out of Memory"); return (ret); } /* Free a pointer allocated by png_malloc(). If ptr is NULL, return without taking any action. */ void PNGAPI png_free(png_structp png_ptr, png_voidp ptr) { if (png_ptr == NULL || ptr == NULL) return; #ifdef PNG_USER_MEM_SUPPORTED if (png_ptr->free_fn != NULL) { (*(png_ptr->free_fn))(png_ptr, ptr); return; } else png_free_default(png_ptr, ptr); } void PNGAPI png_free_default(png_structp png_ptr, png_voidp ptr) { if (png_ptr == NULL || ptr == NULL) return; #endif /* PNG_USER_MEM_SUPPORTED */ #if defined(__TURBOC__) && !defined(__FLAT__) farfree(ptr); #else # if defined(_MSC_VER) && defined(MAXSEG_64K) hfree(ptr); # else free(ptr); # endif #endif } #endif /* Not Borland DOS special memory handler */ #if defined(PNG_1_0_X) # define png_malloc_warn png_malloc #else /* This function was added at libpng version 1.2.3. The png_malloc_warn() * function will issue a png_warning and return NULL instead of issuing a * png_error, if it fails to allocate the requested memory. */ png_voidp PNGAPI png_malloc_warn(png_structp png_ptr, png_uint_32 size) { png_voidp ptr; png_uint_32 save_flags=png_ptr->flags; png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); png_ptr->flags=save_flags; return(ptr); } #endif png_voidp PNGAPI png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, png_uint_32 length) { png_size_t size; size = (png_size_t)length; if ((png_uint_32)size != length) png_error(png_ptr,"Overflow in png_memcpy_check."); return(png_memcpy (s1, s2, size)); } png_voidp PNGAPI png_memset_check (png_structp png_ptr, png_voidp s1, int value, png_uint_32 length) { png_size_t size; size = (png_size_t)length; if ((png_uint_32)size != length) png_error(png_ptr,"Overflow in png_memset_check."); return (png_memset (s1, value, size)); } #ifdef PNG_USER_MEM_SUPPORTED /* This function is called when the application wants to use another method * of allocating and freeing memory. */ void PNGAPI png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn) { png_ptr->mem_ptr = mem_ptr; png_ptr->malloc_fn = malloc_fn; png_ptr->free_fn = free_fn; } /* This function returns a pointer to the mem_ptr associated with the user * functions. The application should free any memory associated with this * pointer before png_write_destroy and png_read_destroy are called. */ png_voidp PNGAPI png_get_mem_ptr(png_structp png_ptr) { return ((png_voidp)png_ptr->mem_ptr); } #endif /* PNG_USER_MEM_SUPPORTED */ gamera-3.3.3/src/libpng-1.2.5/pngpread.c0000644000076500000000000012743310714675701016433 0ustar chriswheel /* pngpread.c - read a png file in push mode * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ #define PNG_INTERNAL #include "png.h" #ifdef PNG_PROGRESSIVE_READ_SUPPORTED /* push model modes */ #define PNG_READ_SIG_MODE 0 #define PNG_READ_CHUNK_MODE 1 #define PNG_READ_IDAT_MODE 2 #define PNG_SKIP_MODE 3 #define PNG_READ_tEXt_MODE 4 #define PNG_READ_zTXt_MODE 5 #define PNG_READ_DONE_MODE 6 #define PNG_READ_iTXt_MODE 7 #define PNG_ERROR_MODE 8 void PNGAPI png_process_data(png_structp png_ptr, png_infop info_ptr, png_bytep buffer, png_size_t buffer_size) { png_push_restore_buffer(png_ptr, buffer, buffer_size); while (png_ptr->buffer_size) { png_process_some_data(png_ptr, info_ptr); } } /* What we do with the incoming data depends on what we were previously * doing before we ran out of data... */ void /* PRIVATE */ png_process_some_data(png_structp png_ptr, png_infop info_ptr) { switch (png_ptr->process_mode) { case PNG_READ_SIG_MODE: { png_push_read_sig(png_ptr, info_ptr); break; } case PNG_READ_CHUNK_MODE: { png_push_read_chunk(png_ptr, info_ptr); break; } case PNG_READ_IDAT_MODE: { png_push_read_IDAT(png_ptr); break; } #if defined(PNG_READ_tEXt_SUPPORTED) case PNG_READ_tEXt_MODE: { png_push_read_tEXt(png_ptr, info_ptr); break; } #endif #if defined(PNG_READ_zTXt_SUPPORTED) case PNG_READ_zTXt_MODE: { png_push_read_zTXt(png_ptr, info_ptr); break; } #endif #if defined(PNG_READ_iTXt_SUPPORTED) case PNG_READ_iTXt_MODE: { png_push_read_iTXt(png_ptr, info_ptr); break; } #endif case PNG_SKIP_MODE: { png_push_crc_finish(png_ptr); break; } default: { png_ptr->buffer_size = 0; break; } } } /* Read any remaining signature bytes from the stream and compare them with * the correct PNG signature. It is possible that this routine is called * with bytes already read from the signature, either because they have been * checked by the calling application, or because of multiple calls to this * routine. */ void /* PRIVATE */ png_push_read_sig(png_structp png_ptr, png_infop info_ptr) { png_size_t num_checked = png_ptr->sig_bytes, num_to_check = 8 - num_checked; if (png_ptr->buffer_size < num_to_check) { num_to_check = png_ptr->buffer_size; } png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check); if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) { if (num_checked < 4 && png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) png_error(png_ptr, "Not a PNG file"); else png_error(png_ptr, "PNG file corrupted by ASCII conversion"); } else { if (png_ptr->sig_bytes >= 8) { png_ptr->process_mode = PNG_READ_CHUNK_MODE; } } } void /* PRIVATE */ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IHDR; PNG_IDAT; PNG_IEND; PNG_PLTE; #if defined(PNG_READ_bKGD_SUPPORTED) PNG_bKGD; #endif #if defined(PNG_READ_cHRM_SUPPORTED) PNG_cHRM; #endif #if defined(PNG_READ_gAMA_SUPPORTED) PNG_gAMA; #endif #if defined(PNG_READ_hIST_SUPPORTED) PNG_hIST; #endif #if defined(PNG_READ_iCCP_SUPPORTED) PNG_iCCP; #endif #if defined(PNG_READ_iTXt_SUPPORTED) PNG_iTXt; #endif #if defined(PNG_READ_oFFs_SUPPORTED) PNG_oFFs; #endif #if defined(PNG_READ_pCAL_SUPPORTED) PNG_pCAL; #endif #if defined(PNG_READ_pHYs_SUPPORTED) PNG_pHYs; #endif #if defined(PNG_READ_sBIT_SUPPORTED) PNG_sBIT; #endif #if defined(PNG_READ_sCAL_SUPPORTED) PNG_sCAL; #endif #if defined(PNG_READ_sRGB_SUPPORTED) PNG_sRGB; #endif #if defined(PNG_READ_sPLT_SUPPORTED) PNG_sPLT; #endif #if defined(PNG_READ_tEXt_SUPPORTED) PNG_tEXt; #endif #if defined(PNG_READ_tIME_SUPPORTED) PNG_tIME; #endif #if defined(PNG_READ_tRNS_SUPPORTED) PNG_tRNS; #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_zTXt; #endif #endif /* PNG_USE_LOCAL_ARRAYS */ /* First we make sure we have enough data for the 4 byte chunk name * and the 4 byte chunk length before proceeding with decoding the * chunk data. To fully decode each of these chunks, we also make * sure we have enough data in the buffer for the 4 byte CRC at the * end of every chunk (except IDAT, which is handled separately). */ if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) { png_byte chunk_length[4]; if (png_ptr->buffer_size < 8) { png_push_save_buffer(png_ptr); return; } png_push_fill_buffer(png_ptr, chunk_length, 4); png_ptr->push_length = png_get_uint_32(chunk_length); png_reset_crc(png_ptr); png_crc_read(png_ptr, png_ptr->chunk_name, 4); png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; } if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); } else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); } else if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) { /* If we reach an IDAT chunk, this means we have read all of the * header chunks, and we can start reading the image (or if this * is called after the image has been read - we have an error). */ if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before IDAT"); else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && !(png_ptr->mode & PNG_HAVE_PLTE)) png_error(png_ptr, "Missing PLTE before IDAT"); if (png_ptr->mode & PNG_HAVE_IDAT) { if (png_ptr->push_length == 0) return; if (png_ptr->mode & PNG_AFTER_IDAT) png_error(png_ptr, "Too many IDAT's found"); } png_ptr->idat_size = png_ptr->push_length; png_ptr->mode |= PNG_HAVE_IDAT; png_ptr->process_mode = PNG_READ_IDAT_MODE; png_push_have_info(png_ptr, info_ptr); png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; png_ptr->zstream.next_out = png_ptr->row_buf; return; } else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); png_ptr->process_mode = PNG_READ_DONE_MODE; png_push_have_end(png_ptr, info_ptr); } #if defined(PNG_READ_gAMA_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_sBIT_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_cHRM_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_sRGB_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_iCCP_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_sPLT_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_tRNS_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_bKGD_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_hIST_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_pHYs_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_oFFs_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_pCAL_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_sCAL_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_tIME_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_tEXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_zTXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif #if defined(PNG_READ_iTXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); } #endif else { if (png_ptr->push_length + 4 > png_ptr->buffer_size) { png_push_save_buffer(png_ptr); return; } png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); } png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; } void /* PRIVATE */ png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) { png_ptr->process_mode = PNG_SKIP_MODE; png_ptr->skip_length = skip; } void /* PRIVATE */ png_push_crc_finish(png_structp png_ptr) { if (png_ptr->skip_length && png_ptr->save_buffer_size) { png_size_t save_size; if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) save_size = (png_size_t)png_ptr->skip_length; else save_size = png_ptr->save_buffer_size; png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); png_ptr->skip_length -= save_size; png_ptr->buffer_size -= save_size; png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } if (png_ptr->skip_length && png_ptr->current_buffer_size) { png_size_t save_size; if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) save_size = (png_size_t)png_ptr->skip_length; else save_size = png_ptr->current_buffer_size; png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); png_ptr->skip_length -= save_size; png_ptr->buffer_size -= save_size; png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } if (!png_ptr->skip_length) { if (png_ptr->buffer_size < 4) { png_push_save_buffer(png_ptr); return; } png_crc_finish(png_ptr, 0); png_ptr->process_mode = PNG_READ_CHUNK_MODE; } } void PNGAPI png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) { png_bytep ptr; ptr = buffer; if (png_ptr->save_buffer_size) { png_size_t save_size; if (length < png_ptr->save_buffer_size) save_size = length; else save_size = png_ptr->save_buffer_size; png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); length -= save_size; ptr += save_size; png_ptr->buffer_size -= save_size; png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } if (length && png_ptr->current_buffer_size) { png_size_t save_size; if (length < png_ptr->current_buffer_size) save_size = length; else save_size = png_ptr->current_buffer_size; png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); png_ptr->buffer_size -= save_size; png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } } void /* PRIVATE */ png_push_save_buffer(png_structp png_ptr) { if (png_ptr->save_buffer_size) { if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) { png_size_t i,istop; png_bytep sp; png_bytep dp; istop = png_ptr->save_buffer_size; for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; i < istop; i++, sp++, dp++) { *dp = *sp; } } } if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > png_ptr->save_buffer_max) { png_size_t new_max; png_bytep old_buffer; new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; old_buffer = png_ptr->save_buffer; png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr, (png_uint_32)new_max); png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); png_free(png_ptr, old_buffer); png_ptr->save_buffer_max = new_max; } if (png_ptr->current_buffer_size) { png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); png_ptr->save_buffer_size += png_ptr->current_buffer_size; png_ptr->current_buffer_size = 0; } png_ptr->save_buffer_ptr = png_ptr->save_buffer; png_ptr->buffer_size = 0; } void /* PRIVATE */ png_push_restore_buffer(png_structp png_ptr, png_bytep buffer, png_size_t buffer_length) { png_ptr->current_buffer = buffer; png_ptr->current_buffer_size = buffer_length; png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; png_ptr->current_buffer_ptr = png_ptr->current_buffer; } void /* PRIVATE */ png_push_read_IDAT(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IDAT; #endif if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) { png_byte chunk_length[4]; if (png_ptr->buffer_size < 8) { png_push_save_buffer(png_ptr); return; } png_push_fill_buffer(png_ptr, chunk_length, 4); png_ptr->push_length = png_get_uint_32(chunk_length); png_reset_crc(png_ptr); png_crc_read(png_ptr, png_ptr->chunk_name, 4); png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) { png_ptr->process_mode = PNG_READ_CHUNK_MODE; if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) png_error(png_ptr, "Not enough compressed data"); return; } png_ptr->idat_size = png_ptr->push_length; } if (png_ptr->idat_size && png_ptr->save_buffer_size) { png_size_t save_size; if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) { save_size = (png_size_t)png_ptr->idat_size; /* check for overflow */ if((png_uint_32)save_size != png_ptr->idat_size) png_error(png_ptr, "save_size overflowed in pngpread"); } else save_size = png_ptr->save_buffer_size; png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); png_ptr->idat_size -= save_size; png_ptr->buffer_size -= save_size; png_ptr->save_buffer_size -= save_size; png_ptr->save_buffer_ptr += save_size; } if (png_ptr->idat_size && png_ptr->current_buffer_size) { png_size_t save_size; if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) { save_size = (png_size_t)png_ptr->idat_size; /* check for overflow */ if((png_uint_32)save_size != png_ptr->idat_size) png_error(png_ptr, "save_size overflowed in pngpread"); } else save_size = png_ptr->current_buffer_size; png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); png_ptr->idat_size -= save_size; png_ptr->buffer_size -= save_size; png_ptr->current_buffer_size -= save_size; png_ptr->current_buffer_ptr += save_size; } if (!png_ptr->idat_size) { if (png_ptr->buffer_size < 4) { png_push_save_buffer(png_ptr); return; } png_crc_finish(png_ptr, 0); png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; png_ptr->mode |= PNG_AFTER_IDAT; } } void /* PRIVATE */ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, png_size_t buffer_length) { int ret; if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) png_error(png_ptr, "Extra compression data"); png_ptr->zstream.next_in = buffer; png_ptr->zstream.avail_in = (uInt)buffer_length; for(;;) { ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); if (ret != Z_OK) { if (ret == Z_STREAM_END) { if (png_ptr->zstream.avail_in) png_error(png_ptr, "Extra compressed data"); if (!(png_ptr->zstream.avail_out)) { png_push_process_row(png_ptr); } png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; break; } else if (ret == Z_BUF_ERROR) break; else png_error(png_ptr, "Decompression Error"); } if (!(png_ptr->zstream.avail_out)) { if (( #if defined(PNG_READ_INTERLACING_SUPPORTED) png_ptr->interlaced && png_ptr->pass > 6) || (!png_ptr->interlaced && #endif png_ptr->row_number == png_ptr->num_rows-1)) { if (png_ptr->zstream.avail_in) png_warning(png_ptr, "Too much data in IDAT chunks"); png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; break; } png_push_process_row(png_ptr); png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; png_ptr->zstream.next_out = png_ptr->row_buf; } else break; } } void /* PRIVATE */ png_push_process_row(png_structp png_ptr) { png_ptr->row_info.color_type = png_ptr->color_type; png_ptr->row_info.width = png_ptr->iwidth; png_ptr->row_info.channels = png_ptr->channels; png_ptr->row_info.bit_depth = png_ptr->bit_depth; png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; png_ptr->row_info.rowbytes = ((png_ptr->row_info.width * (png_uint_32)png_ptr->row_info.pixel_depth + 7) >> 3); png_read_filter_row(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->prev_row + 1, (int)(png_ptr->row_buf[0])); png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1); if (png_ptr->transformations) png_do_read_transformations(png_ptr); #if defined(PNG_READ_INTERLACING_SUPPORTED) /* blow up interlaced rows to full size */ if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) { if (png_ptr->pass < 6) /* old interface (pre-1.0.9): png_do_read_interlace(&(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); */ png_do_read_interlace(png_ptr); switch (png_ptr->pass) { case 0: { int i; for (i = 0; i < 8 && png_ptr->pass == 0; i++) { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */ } if (png_ptr->pass == 2) /* pass 1 might be empty */ { for (i = 0; i < 4 && png_ptr->pass == 2; i++) { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } } if (png_ptr->pass == 4 && png_ptr->height <= 4) { for (i = 0; i < 2 && png_ptr->pass == 4; i++) { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } } if (png_ptr->pass == 6 && png_ptr->height <= 4) { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } break; } case 1: { int i; for (i = 0; i < 8 && png_ptr->pass == 1; i++) { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); } if (png_ptr->pass == 2) /* skip top 4 generated rows */ { for (i = 0; i < 4 && png_ptr->pass == 2; i++) { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } } break; } case 2: { int i; for (i = 0; i < 4 && png_ptr->pass == 2; i++) { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); } for (i = 0; i < 4 && png_ptr->pass == 2; i++) { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } if (png_ptr->pass == 4) /* pass 3 might be empty */ { for (i = 0; i < 2 && png_ptr->pass == 4; i++) { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } } break; } case 3: { int i; for (i = 0; i < 4 && png_ptr->pass == 3; i++) { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); } if (png_ptr->pass == 4) /* skip top two generated rows */ { for (i = 0; i < 2 && png_ptr->pass == 4; i++) { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } } break; } case 4: { int i; for (i = 0; i < 2 && png_ptr->pass == 4; i++) { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); } for (i = 0; i < 2 && png_ptr->pass == 4; i++) { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } if (png_ptr->pass == 6) /* pass 5 might be empty */ { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } break; } case 5: { int i; for (i = 0; i < 2 && png_ptr->pass == 5; i++) { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); } if (png_ptr->pass == 6) /* skip top generated row */ { png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } break; } case 6: { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); if (png_ptr->pass != 6) break; png_push_have_row(png_ptr, png_bytep_NULL); png_read_push_finish_row(png_ptr); } } } else #endif { png_push_have_row(png_ptr, png_ptr->row_buf + 1); png_read_push_finish_row(png_ptr); } } void /* PRIVATE */ png_read_push_finish_row(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* start of interlace block */ const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; /* offset to next interlace block */ const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; /* start of interlace block in the y direction */ const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; /* offset to next interlace block in the y direction */ const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; /* Width of interlace block. This is not currently used - if you need * it, uncomment it here and in png.h const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */ /* Height of interlace block. This is not currently used - if you need * it, uncomment it here and in png.h const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; */ #endif png_ptr->row_number++; if (png_ptr->row_number < png_ptr->num_rows) return; if (png_ptr->interlaced) { png_ptr->row_number = 0; png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); do { png_ptr->pass++; if ((png_ptr->pass == 1 && png_ptr->width < 5) || (png_ptr->pass == 3 && png_ptr->width < 3) || (png_ptr->pass == 5 && png_ptr->width < 2)) png_ptr->pass++; if (png_ptr->pass > 7) png_ptr->pass--; if (png_ptr->pass >= 7) break; png_ptr->iwidth = (png_ptr->width + png_pass_inc[png_ptr->pass] - 1 - png_pass_start[png_ptr->pass]) / png_pass_inc[png_ptr->pass]; png_ptr->irowbytes = ((png_ptr->iwidth * png_ptr->pixel_depth + 7) >> 3) + 1; if (png_ptr->transformations & PNG_INTERLACE) break; png_ptr->num_rows = (png_ptr->height + png_pass_yinc[png_ptr->pass] - 1 - png_pass_ystart[png_ptr->pass]) / png_pass_yinc[png_ptr->pass]; } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); } } #if defined(PNG_READ_tEXt_SUPPORTED) void /* PRIVATE */ png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) { png_error(png_ptr, "Out of place tEXt"); /* to quiet some compiler warnings */ if(info_ptr == NULL) return; } #ifdef PNG_MAX_MALLOC_64K png_ptr->skip_length = 0; /* This may not be necessary */ if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ { png_warning(png_ptr, "tEXt chunk too large to fit in memory"); png_ptr->skip_length = length - (png_uint_32)65535L; length = (png_uint_32)65535L; } #endif png_ptr->current_text = (png_charp)png_malloc(png_ptr, (png_uint_32)(length+1)); png_ptr->current_text[length] = '\0'; png_ptr->current_text_ptr = png_ptr->current_text; png_ptr->current_text_size = (png_size_t)length; png_ptr->current_text_left = (png_size_t)length; png_ptr->process_mode = PNG_READ_tEXt_MODE; } void /* PRIVATE */ png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) { if (png_ptr->buffer_size && png_ptr->current_text_left) { png_size_t text_size; if (png_ptr->buffer_size < png_ptr->current_text_left) text_size = png_ptr->buffer_size; else text_size = png_ptr->current_text_left; png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); png_ptr->current_text_left -= text_size; png_ptr->current_text_ptr += text_size; } if (!(png_ptr->current_text_left)) { png_textp text_ptr; png_charp text; png_charp key; int ret; if (png_ptr->buffer_size < 4) { png_push_save_buffer(png_ptr); return; } png_push_crc_finish(png_ptr); #if defined(PNG_MAX_MALLOC_64K) if (png_ptr->skip_length) return; #endif key = png_ptr->current_text; for (text = key; *text; text++) /* empty loop */ ; if (text != key + png_ptr->current_text_size) text++; text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text)); text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; text_ptr->key = key; #ifdef PNG_iTXt_SUPPORTED text_ptr->lang = NULL; text_ptr->lang_key = NULL; #endif text_ptr->text = text; ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); png_free(png_ptr, key); png_free(png_ptr, text_ptr); png_ptr->current_text = NULL; if (ret) png_warning(png_ptr, "Insufficient memory to store text chunk."); } } #endif #if defined(PNG_READ_zTXt_SUPPORTED) void /* PRIVATE */ png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) { png_error(png_ptr, "Out of place zTXt"); /* to quiet some compiler warnings */ if(info_ptr == NULL) return; } #ifdef PNG_MAX_MALLOC_64K /* We can't handle zTXt chunks > 64K, since we don't have enough space * to be able to store the uncompressed data. Actually, the threshold * is probably around 32K, but it isn't as definite as 64K is. */ if (length > (png_uint_32)65535L) { png_warning(png_ptr, "zTXt chunk too large to fit in memory"); png_push_crc_skip(png_ptr, length); return; } #endif png_ptr->current_text = (png_charp)png_malloc(png_ptr, (png_uint_32)(length+1)); png_ptr->current_text[length] = '\0'; png_ptr->current_text_ptr = png_ptr->current_text; png_ptr->current_text_size = (png_size_t)length; png_ptr->current_text_left = (png_size_t)length; png_ptr->process_mode = PNG_READ_zTXt_MODE; } void /* PRIVATE */ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) { if (png_ptr->buffer_size && png_ptr->current_text_left) { png_size_t text_size; if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) text_size = png_ptr->buffer_size; else text_size = png_ptr->current_text_left; png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); png_ptr->current_text_left -= text_size; png_ptr->current_text_ptr += text_size; } if (!(png_ptr->current_text_left)) { png_textp text_ptr; png_charp text; png_charp key; int ret; png_size_t text_size, key_size; if (png_ptr->buffer_size < 4) { png_push_save_buffer(png_ptr); return; } png_push_crc_finish(png_ptr); key = png_ptr->current_text; for (text = key; *text; text++) /* empty loop */ ; /* zTXt can't have zero text */ if (text == key + png_ptr->current_text_size) { png_ptr->current_text = NULL; png_free(png_ptr, key); return; } text++; if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */ { png_ptr->current_text = NULL; png_free(png_ptr, key); return; } text++; png_ptr->zstream.next_in = (png_bytep )text; png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - (text - key)); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; key_size = text - key; text_size = 0; text = NULL; ret = Z_STREAM_END; while (png_ptr->zstream.avail_in) { ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); if (ret != Z_OK && ret != Z_STREAM_END) { inflateReset(&png_ptr->zstream); png_ptr->zstream.avail_in = 0; png_ptr->current_text = NULL; png_free(png_ptr, key); png_free(png_ptr, text); return; } if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) { if (text == NULL) { text = (png_charp)png_malloc(png_ptr, (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out + key_size + 1)); png_memcpy(text + key_size, png_ptr->zbuf, png_ptr->zbuf_size - png_ptr->zstream.avail_out); png_memcpy(text, key, key_size); text_size = key_size + png_ptr->zbuf_size - png_ptr->zstream.avail_out; *(text + text_size) = '\0'; } else { png_charp tmp; tmp = text; text = (png_charp)png_malloc(png_ptr, text_size + (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1)); png_memcpy(text, tmp, text_size); png_free(png_ptr, tmp); png_memcpy(text + text_size, png_ptr->zbuf, png_ptr->zbuf_size - png_ptr->zstream.avail_out); text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; *(text + text_size) = '\0'; } if (ret != Z_STREAM_END) { png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } } else { break; } if (ret == Z_STREAM_END) break; } inflateReset(&png_ptr->zstream); png_ptr->zstream.avail_in = 0; if (ret != Z_STREAM_END) { png_ptr->current_text = NULL; png_free(png_ptr, key); png_free(png_ptr, text); return; } png_ptr->current_text = NULL; png_free(png_ptr, key); key = text; text += key_size; text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text)); text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; text_ptr->key = key; #ifdef PNG_iTXt_SUPPORTED text_ptr->lang = NULL; text_ptr->lang_key = NULL; #endif text_ptr->text = text; ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); png_free(png_ptr, key); png_free(png_ptr, text_ptr); if (ret) png_warning(png_ptr, "Insufficient memory to store text chunk."); } } #endif #if defined(PNG_READ_iTXt_SUPPORTED) void /* PRIVATE */ png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) { png_error(png_ptr, "Out of place iTXt"); /* to quiet some compiler warnings */ if(info_ptr == NULL) return; } #ifdef PNG_MAX_MALLOC_64K png_ptr->skip_length = 0; /* This may not be necessary */ if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ { png_warning(png_ptr, "iTXt chunk too large to fit in memory"); png_ptr->skip_length = length - (png_uint_32)65535L; length = (png_uint_32)65535L; } #endif png_ptr->current_text = (png_charp)png_malloc(png_ptr, (png_uint_32)(length+1)); png_ptr->current_text[length] = '\0'; png_ptr->current_text_ptr = png_ptr->current_text; png_ptr->current_text_size = (png_size_t)length; png_ptr->current_text_left = (png_size_t)length; png_ptr->process_mode = PNG_READ_iTXt_MODE; } void /* PRIVATE */ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) { if (png_ptr->buffer_size && png_ptr->current_text_left) { png_size_t text_size; if (png_ptr->buffer_size < png_ptr->current_text_left) text_size = png_ptr->buffer_size; else text_size = png_ptr->current_text_left; png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); png_ptr->current_text_left -= text_size; png_ptr->current_text_ptr += text_size; } if (!(png_ptr->current_text_left)) { png_textp text_ptr; png_charp key; int comp_flag; png_charp lang; png_charp lang_key; png_charp text; int ret; if (png_ptr->buffer_size < 4) { png_push_save_buffer(png_ptr); return; } png_push_crc_finish(png_ptr); #if defined(PNG_MAX_MALLOC_64K) if (png_ptr->skip_length) return; #endif key = png_ptr->current_text; for (lang = key; *lang; lang++) /* empty loop */ ; if (lang != key + png_ptr->current_text_size) lang++; comp_flag = *lang++; lang++; /* skip comp_type, always zero */ for (lang_key = lang; *lang_key; lang_key++) /* empty loop */ ; lang_key++; /* skip NUL separator */ for (text = lang_key; *text; text++) /* empty loop */ ; if (text != key + png_ptr->current_text_size) text++; text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text)); text_ptr->compression = comp_flag + 2; text_ptr->key = key; text_ptr->lang = lang; text_ptr->lang_key = lang_key; text_ptr->text = text; text_ptr->text_length = 0; text_ptr->itxt_length = png_strlen(text); ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); png_ptr->current_text = NULL; png_free(png_ptr, text_ptr); if (ret) png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); } } #endif /* This function is called when we haven't found a handler for this * chunk. If there isn't a problem with the chunk itself (ie a bad chunk * name or a critical chunk), the chunk is (currently) silently ignored. */ void /* PRIVATE */ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_uint_32 skip=0; png_check_chunk_name(png_ptr, png_ptr->chunk_name); if (!(png_ptr->chunk_name[0] & 0x20)) { #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != HANDLE_CHUNK_ALWAYS #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) && png_ptr->read_user_chunk_fn == NULL #endif ) #endif png_chunk_error(png_ptr, "unknown critical chunk"); /* to quiet compiler warnings about unused info_ptr */ if (info_ptr == NULL) return; } #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) { png_unknown_chunk chunk; #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { png_warning(png_ptr, "unknown chunk too large to fit in memory"); skip = length - (png_uint_32)65535L; length = (png_uint_32)65535L; } #endif png_strcpy((png_charp)chunk.name, (png_charp)png_ptr->chunk_name); chunk.data = (png_bytep)png_malloc(png_ptr, length); png_crc_read(png_ptr, chunk.data, length); chunk.size = length; #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) if(png_ptr->read_user_chunk_fn != NULL) { /* callback to user unknown chunk handler */ if ((*(png_ptr->read_user_chunk_fn)) (png_ptr, &chunk) <= 0) { if (!(png_ptr->chunk_name[0] & 0x20)) if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != HANDLE_CHUNK_ALWAYS) png_chunk_error(png_ptr, "unknown critical chunk"); } png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1); } else #endif png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1); png_free(png_ptr, chunk.data); } else #endif skip=length; png_push_crc_skip(png_ptr, skip); } void /* PRIVATE */ png_push_have_info(png_structp png_ptr, png_infop info_ptr) { if (png_ptr->info_fn != NULL) (*(png_ptr->info_fn))(png_ptr, info_ptr); } void /* PRIVATE */ png_push_have_end(png_structp png_ptr, png_infop info_ptr) { if (png_ptr->end_fn != NULL) (*(png_ptr->end_fn))(png_ptr, info_ptr); } void /* PRIVATE */ png_push_have_row(png_structp png_ptr, png_bytep row) { if (png_ptr->row_fn != NULL) (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, (int)png_ptr->pass); } void PNGAPI png_progressive_combine_row (png_structp png_ptr, png_bytep old_row, png_bytep new_row) { #ifdef PNG_USE_LOCAL_ARRAYS const int FARDATA png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; #endif if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); } void PNGAPI png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn) { png_ptr->info_fn = info_fn; png_ptr->row_fn = row_fn; png_ptr->end_fn = end_fn; png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); } png_voidp PNGAPI png_get_progressive_ptr(png_structp png_ptr) { return png_ptr->io_ptr; } #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ gamera-3.3.3/src/libpng-1.2.5/pngread.c0000644000076500000000000013056410714675701016252 0ustar chriswheel /* pngread.c - read a PNG file * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This file contains routines that an application calls directly to * read a PNG file or stream. */ #define PNG_INTERNAL #include "png.h" /* Create a PNG structure for reading, and allocate any memory needed. */ png_structp PNGAPI png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn) { #ifdef PNG_USER_MEM_SUPPORTED return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); } /* Alternate create PNG structure for reading, and allocate any memory needed. */ png_structp PNGAPI png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn) { #endif /* PNG_USER_MEM_SUPPORTED */ png_structp png_ptr; #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD jmp_buf jmpbuf; #endif #endif int i; png_debug(1, "in png_create_read_struct\n"); #ifdef PNG_USER_MEM_SUPPORTED png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); #else png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); #endif if (png_ptr == NULL) return (NULL); #if !defined(PNG_1_0_X) #ifdef PNG_ASSEMBLER_CODE_SUPPORTED png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ #endif #endif /* PNG_1_0_X */ #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD if (setjmp(jmpbuf)) #else if (setjmp(png_ptr->jmpbuf)) #endif { png_free(png_ptr, png_ptr->zbuf); png_ptr->zbuf=NULL; #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)png_ptr); #endif return (NULL); } #ifdef USE_FAR_KEYWORD png_memcpy(png_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf)); #endif #endif #ifdef PNG_USER_MEM_SUPPORTED png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); #endif png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); i=0; do { if(user_png_ver[i] != png_libpng_ver[i]) png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; } while (png_libpng_ver[i++]); if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) { /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so * we must recompile any applications that use any older library version. * For versions after libpng 1.0, we will be compatible, so we need * only check the first digit. */ if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || (user_png_ver[0] == '0' && user_png_ver[2] < '9')) { #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) char msg[80]; if (user_png_ver) { sprintf(msg, "Application was compiled with png.h from libpng-%.20s", user_png_ver); png_warning(png_ptr, msg); } sprintf(msg, "Application is running with png.c from libpng-%.20s", png_libpng_ver); png_warning(png_ptr, msg); #endif #ifdef PNG_ERROR_NUMBERS_SUPPORTED png_ptr->flags=0; #endif png_error(png_ptr, "Incompatible libpng version in application and library"); } } /* initialize zbuf - compression buffer */ png_ptr->zbuf_size = PNG_ZBUF_SIZE; png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); png_ptr->zstream.zalloc = png_zalloc; png_ptr->zstream.zfree = png_zfree; png_ptr->zstream.opaque = (voidpf)png_ptr; switch (inflateInit(&png_ptr->zstream)) { case Z_OK: /* Do nothing */ break; case Z_MEM_ERROR: case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break; case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break; default: png_error(png_ptr, "Unknown zlib error"); } png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); #ifdef PNG_SETJMP_SUPPORTED /* Applications that neglect to set up their own setjmp() and then encounter a png_error() will longjmp here. Since the jmpbuf is then meaningless we abort instead of returning. */ #ifdef USE_FAR_KEYWORD if (setjmp(jmpbuf)) PNG_ABORT(); png_memcpy(png_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf)); #else if (setjmp(png_ptr->jmpbuf)) PNG_ABORT(); #endif #endif return (png_ptr); } /* Initialize PNG structure for reading, and allocate any memory needed. This interface is deprecated in favour of the png_create_read_struct(), and it will eventually disappear. */ #undef png_read_init void PNGAPI png_read_init(png_structp png_ptr) { /* We only come here via pre-1.0.7-compiled applications */ png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0); } void PNGAPI png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size) { /* We only come here via pre-1.0.12-compiled applications */ #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) if(sizeof(png_struct) > png_struct_size || sizeof(png_info) > png_info_size) { char msg[80]; png_ptr->warning_fn=NULL; if (user_png_ver) { sprintf(msg, "Application was compiled with png.h from libpng-%.20s", user_png_ver); png_warning(png_ptr, msg); } sprintf(msg, "Application is running with png.c from libpng-%.20s", png_libpng_ver); png_warning(png_ptr, msg); } #endif if(sizeof(png_struct) > png_struct_size) { png_ptr->error_fn=NULL; #ifdef PNG_ERROR_NUMBERS_SUPPORTED png_ptr->flags=0; #endif png_error(png_ptr, "The png struct allocated by the application for reading is too small."); } if(sizeof(png_info) > png_info_size) { png_ptr->error_fn=NULL; #ifdef PNG_ERROR_NUMBERS_SUPPORTED png_ptr->flags=0; #endif png_error(png_ptr, "The info struct allocated by application for reading is too small."); } png_read_init_3(&png_ptr, user_png_ver, png_struct_size); } void PNGAPI png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size) { #ifdef PNG_SETJMP_SUPPORTED jmp_buf tmp_jmp; /* to save current jump buffer */ #endif int i=0; png_structp png_ptr=*ptr_ptr; do { if(user_png_ver[i] != png_libpng_ver[i]) { #ifdef PNG_LEGACY_SUPPORTED png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; #else png_ptr->warning_fn=NULL; png_warning(png_ptr, "Application uses deprecated png_read_init() and should be recompiled."); break; #endif } } while (png_libpng_ver[i++]); png_debug(1, "in png_read_init_3\n"); #ifdef PNG_SETJMP_SUPPORTED /* save jump buffer and error functions */ png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf)); #endif if(sizeof(png_struct) > png_struct_size) { png_destroy_struct(png_ptr); *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); png_ptr = *ptr_ptr; } /* reset all variables to 0 */ png_memset(png_ptr, 0, sizeof (png_struct)); #ifdef PNG_SETJMP_SUPPORTED /* restore jump buffer */ png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf)); #endif /* initialize zbuf - compression buffer */ png_ptr->zbuf_size = PNG_ZBUF_SIZE; png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); png_ptr->zstream.zalloc = png_zalloc; png_ptr->zstream.zfree = png_zfree; png_ptr->zstream.opaque = (voidpf)png_ptr; switch (inflateInit(&png_ptr->zstream)) { case Z_OK: /* Do nothing */ break; case Z_MEM_ERROR: case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break; case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break; default: png_error(png_ptr, "Unknown zlib error"); } png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); } /* Read the information before the actual image data. This has been * changed in v0.90 to allow reading a file that already has the magic * bytes read from the stream. You can tell libpng how many bytes have * been read from the beginning of the stream (up to the maximum of 8) * via png_set_sig_bytes(), and we will only check the remaining bytes * here. The application can then have access to the signature bytes we * read if it is determined that this isn't a valid PNG file. */ void PNGAPI png_read_info(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_read_info\n"); /* If we haven't checked all of the PNG signature bytes, do so now. */ if (png_ptr->sig_bytes < 8) { png_size_t num_checked = png_ptr->sig_bytes, num_to_check = 8 - num_checked; png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); png_ptr->sig_bytes = 8; if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) { if (num_checked < 4 && png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) png_error(png_ptr, "Not a PNG file"); else png_error(png_ptr, "PNG file corrupted by ASCII conversion"); } if (num_checked < 3) png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; } for(;;) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IHDR; PNG_IDAT; PNG_IEND; PNG_PLTE; #if defined(PNG_READ_bKGD_SUPPORTED) PNG_bKGD; #endif #if defined(PNG_READ_cHRM_SUPPORTED) PNG_cHRM; #endif #if defined(PNG_READ_gAMA_SUPPORTED) PNG_gAMA; #endif #if defined(PNG_READ_hIST_SUPPORTED) PNG_hIST; #endif #if defined(PNG_READ_iCCP_SUPPORTED) PNG_iCCP; #endif #if defined(PNG_READ_iTXt_SUPPORTED) PNG_iTXt; #endif #if defined(PNG_READ_oFFs_SUPPORTED) PNG_oFFs; #endif #if defined(PNG_READ_pCAL_SUPPORTED) PNG_pCAL; #endif #if defined(PNG_READ_pHYs_SUPPORTED) PNG_pHYs; #endif #if defined(PNG_READ_sBIT_SUPPORTED) PNG_sBIT; #endif #if defined(PNG_READ_sCAL_SUPPORTED) PNG_sCAL; #endif #if defined(PNG_READ_sPLT_SUPPORTED) PNG_sPLT; #endif #if defined(PNG_READ_sRGB_SUPPORTED) PNG_sRGB; #endif #if defined(PNG_READ_tEXt_SUPPORTED) PNG_tEXt; #endif #if defined(PNG_READ_tIME_SUPPORTED) PNG_tIME; #endif #if defined(PNG_READ_tRNS_SUPPORTED) PNG_tRNS; #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_zTXt; #endif #endif /* PNG_GLOBAL_ARRAYS */ png_byte chunk_length[4]; png_uint_32 length; png_read_data(png_ptr, chunk_length, 4); length = png_get_uint_32(chunk_length); png_reset_crc(png_ptr); png_crc_read(png_ptr, png_ptr->chunk_name, 4); png_debug2(0, "Reading %s chunk, length=%lu.\n", png_ptr->chunk_name, length); if (length > PNG_MAX_UINT) png_error(png_ptr, "Invalid chunk length."); /* This should be a binary subdivision search or a hash for * matching the chunk name rather than a linear search. */ if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) png_handle_IHDR(png_ptr, info_ptr, length); else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) png_handle_IEND(png_ptr, info_ptr, length); #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) { if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) png_ptr->mode |= PNG_HAVE_IDAT; png_handle_unknown(png_ptr, info_ptr, length); if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) png_ptr->mode |= PNG_HAVE_PLTE; else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) { if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before IDAT"); else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && !(png_ptr->mode & PNG_HAVE_PLTE)) png_error(png_ptr, "Missing PLTE before IDAT"); break; } } #endif else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) png_handle_PLTE(png_ptr, info_ptr, length); else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) { if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before IDAT"); else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && !(png_ptr->mode & PNG_HAVE_PLTE)) png_error(png_ptr, "Missing PLTE before IDAT"); png_ptr->idat_size = length; png_ptr->mode |= PNG_HAVE_IDAT; break; } #if defined(PNG_READ_bKGD_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) png_handle_bKGD(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_cHRM_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) png_handle_cHRM(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_gAMA_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) png_handle_gAMA(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_hIST_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) png_handle_hIST(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_oFFs_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) png_handle_oFFs(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_pCAL_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) png_handle_pCAL(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_sCAL_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) png_handle_sCAL(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_pHYs_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) png_handle_pHYs(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_sBIT_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) png_handle_sBIT(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_sRGB_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) png_handle_sRGB(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_iCCP_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) png_handle_iCCP(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_sPLT_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) png_handle_sPLT(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_tEXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) png_handle_tEXt(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_tIME_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) png_handle_tIME(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_tRNS_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) png_handle_tRNS(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_zTXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) png_handle_zTXt(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_iTXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) png_handle_iTXt(png_ptr, info_ptr, length); #endif else png_handle_unknown(png_ptr, info_ptr, length); } } /* optional call to update the users info_ptr structure */ void PNGAPI png_read_update_info(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_read_update_info\n"); if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) png_read_start_row(png_ptr); else png_warning(png_ptr, "Ignoring extra png_read_update_info() call; row buffer not reallocated"); png_read_transform_info(png_ptr, info_ptr); } /* Initialize palette, background, etc, after transformations * are set, but before any reading takes place. This allows * the user to obtain a gamma-corrected palette, for example. * If the user doesn't call this, we will do it ourselves. */ void PNGAPI png_start_read_image(png_structp png_ptr) { png_debug(1, "in png_start_read_image\n"); if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) png_read_start_row(png_ptr); } void PNGAPI png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IDAT; const int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; const int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; #endif int ret; png_debug2(1, "in png_read_row (row %lu, pass %d)\n", png_ptr->row_number, png_ptr->pass); if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) png_read_start_row(png_ptr); if (png_ptr->row_number == 0 && png_ptr->pass == 0) { /* check for transforms that have been set but were defined out */ #if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) if (png_ptr->transformations & PNG_INVERT_MONO) png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined."); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) if (png_ptr->transformations & PNG_FILLER) png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined."); #endif #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined."); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) if (png_ptr->transformations & PNG_PACK) png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined."); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) if (png_ptr->transformations & PNG_SHIFT) png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined."); #endif #if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) if (png_ptr->transformations & PNG_BGR) png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined."); #endif #if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) if (png_ptr->transformations & PNG_SWAP_BYTES) png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined."); #endif } #if defined(PNG_READ_INTERLACING_SUPPORTED) /* if interlaced and we do not need a new row, combine row and return */ if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) { switch (png_ptr->pass) { case 0: if (png_ptr->row_number & 0x07) { if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); png_read_finish_row(png_ptr); return; } break; case 1: if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) { if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); png_read_finish_row(png_ptr); return; } break; case 2: if ((png_ptr->row_number & 0x07) != 4) { if (dsp_row != NULL && (png_ptr->row_number & 4)) png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); png_read_finish_row(png_ptr); return; } break; case 3: if ((png_ptr->row_number & 3) || png_ptr->width < 3) { if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); png_read_finish_row(png_ptr); return; } break; case 4: if ((png_ptr->row_number & 3) != 2) { if (dsp_row != NULL && (png_ptr->row_number & 2)) png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); png_read_finish_row(png_ptr); return; } break; case 5: if ((png_ptr->row_number & 1) || png_ptr->width < 2) { if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); png_read_finish_row(png_ptr); return; } break; case 6: if (!(png_ptr->row_number & 1)) { png_read_finish_row(png_ptr); return; } break; } } #endif if (!(png_ptr->mode & PNG_HAVE_IDAT)) png_error(png_ptr, "Invalid attempt to read row data"); png_ptr->zstream.next_out = png_ptr->row_buf; png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; do { if (!(png_ptr->zstream.avail_in)) { while (!png_ptr->idat_size) { png_byte chunk_length[4]; png_crc_finish(png_ptr, 0); png_read_data(png_ptr, chunk_length, 4); png_ptr->idat_size = png_get_uint_32(chunk_length); if (png_ptr->idat_size > PNG_MAX_UINT) png_error(png_ptr, "Invalid chunk length."); png_reset_crc(png_ptr); png_crc_read(png_ptr, png_ptr->chunk_name, 4); if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) png_error(png_ptr, "Not enough image data"); } png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_in = png_ptr->zbuf; if (png_ptr->zbuf_size > png_ptr->idat_size) png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; png_crc_read(png_ptr, png_ptr->zbuf, (png_size_t)png_ptr->zstream.avail_in); png_ptr->idat_size -= png_ptr->zstream.avail_in; } ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); if (ret == Z_STREAM_END) { if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || png_ptr->idat_size) png_error(png_ptr, "Extra compressed data"); png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; break; } if (ret != Z_OK) png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : "Decompression error"); } while (png_ptr->zstream.avail_out); png_ptr->row_info.color_type = png_ptr->color_type; png_ptr->row_info.width = png_ptr->iwidth; png_ptr->row_info.channels = png_ptr->channels; png_ptr->row_info.bit_depth = png_ptr->bit_depth; png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; png_ptr->row_info.rowbytes = ((png_ptr->row_info.width * (png_uint_32)png_ptr->row_info.pixel_depth + 7) >> 3); if(png_ptr->row_buf[0]) png_read_filter_row(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->prev_row + 1, (int)(png_ptr->row_buf[0])); png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, png_ptr->rowbytes + 1); #if defined(PNG_MNG_FEATURES_SUPPORTED) if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) { /* Intrapixel differencing */ png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); } #endif if (png_ptr->transformations) png_do_read_transformations(png_ptr); #if defined(PNG_READ_INTERLACING_SUPPORTED) /* blow up interlaced rows to full size */ if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) { if (png_ptr->pass < 6) /* old interface (pre-1.0.9): png_do_read_interlace(&(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); */ png_do_read_interlace(png_ptr); if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, png_pass_dsp_mask[png_ptr->pass]); if (row != NULL) png_combine_row(png_ptr, row, png_pass_mask[png_ptr->pass]); } else #endif { if (row != NULL) png_combine_row(png_ptr, row, 0xff); if (dsp_row != NULL) png_combine_row(png_ptr, dsp_row, 0xff); } png_read_finish_row(png_ptr); if (png_ptr->read_row_fn != NULL) (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); } /* Read one or more rows of image data. If the image is interlaced, * and png_set_interlace_handling() has been called, the rows need to * contain the contents of the rows from the previous pass. If the * image has alpha or transparency, and png_handle_alpha()[*] has been * called, the rows contents must be initialized to the contents of the * screen. * * "row" holds the actual image, and pixels are placed in it * as they arrive. If the image is displayed after each pass, it will * appear to "sparkle" in. "display_row" can be used to display a * "chunky" progressive image, with finer detail added as it becomes * available. If you do not want this "chunky" display, you may pass * NULL for display_row. If you do not want the sparkle display, and * you have not called png_handle_alpha(), you may pass NULL for rows. * If you have called png_handle_alpha(), and the image has either an * alpha channel or a transparency chunk, you must provide a buffer for * rows. In this case, you do not have to provide a display_row buffer * also, but you may. If the image is not interlaced, or if you have * not called png_set_interlace_handling(), the display_row buffer will * be ignored, so pass NULL to it. * * [*] png_handle_alpha() does not exist yet, as of libpng version 1.2.5 */ void PNGAPI png_read_rows(png_structp png_ptr, png_bytepp row, png_bytepp display_row, png_uint_32 num_rows) { png_uint_32 i; png_bytepp rp; png_bytepp dp; png_debug(1, "in png_read_rows\n"); rp = row; dp = display_row; if (rp != NULL && dp != NULL) for (i = 0; i < num_rows; i++) { png_bytep rptr = *rp++; png_bytep dptr = *dp++; png_read_row(png_ptr, rptr, dptr); } else if(rp != NULL) for (i = 0; i < num_rows; i++) { png_bytep rptr = *rp; png_read_row(png_ptr, rptr, png_bytep_NULL); rp++; } else if(dp != NULL) for (i = 0; i < num_rows; i++) { png_bytep dptr = *dp; png_read_row(png_ptr, png_bytep_NULL, dptr); dp++; } } /* Read the entire image. If the image has an alpha channel or a tRNS * chunk, and you have called png_handle_alpha()[*], you will need to * initialize the image to the current image that PNG will be overlaying. * We set the num_rows again here, in case it was incorrectly set in * png_read_start_row() by a call to png_read_update_info() or * png_start_read_image() if png_set_interlace_handling() wasn't called * prior to either of these functions like it should have been. You can * only call this function once. If you desire to have an image for * each pass of a interlaced image, use png_read_rows() instead. * * [*] png_handle_alpha() does not exist yet, as of libpng version 1.2.5 */ void PNGAPI png_read_image(png_structp png_ptr, png_bytepp image) { png_uint_32 i,image_height; int pass, j; png_bytepp rp; png_debug(1, "in png_read_image\n"); #ifdef PNG_READ_INTERLACING_SUPPORTED pass = png_set_interlace_handling(png_ptr); #else if (png_ptr->interlaced) png_error(png_ptr, "Cannot read interlaced image -- interlace handler disabled."); pass = 1; #endif image_height=png_ptr->height; png_ptr->num_rows = image_height; /* Make sure this is set correctly */ for (j = 0; j < pass; j++) { rp = image; for (i = 0; i < image_height; i++) { png_read_row(png_ptr, *rp, png_bytep_NULL); rp++; } } } /* Read the end of the PNG file. Will not read past the end of the * file, will verify the end is accurate, and will read any comments * or time information at the end of the file, if info is not NULL. */ void PNGAPI png_read_end(png_structp png_ptr, png_infop info_ptr) { png_byte chunk_length[4]; png_uint_32 length; png_debug(1, "in png_read_end\n"); png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ do { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IHDR; PNG_IDAT; PNG_IEND; PNG_PLTE; #if defined(PNG_READ_bKGD_SUPPORTED) PNG_bKGD; #endif #if defined(PNG_READ_cHRM_SUPPORTED) PNG_cHRM; #endif #if defined(PNG_READ_gAMA_SUPPORTED) PNG_gAMA; #endif #if defined(PNG_READ_hIST_SUPPORTED) PNG_hIST; #endif #if defined(PNG_READ_iCCP_SUPPORTED) PNG_iCCP; #endif #if defined(PNG_READ_iTXt_SUPPORTED) PNG_iTXt; #endif #if defined(PNG_READ_oFFs_SUPPORTED) PNG_oFFs; #endif #if defined(PNG_READ_pCAL_SUPPORTED) PNG_pCAL; #endif #if defined(PNG_READ_pHYs_SUPPORTED) PNG_pHYs; #endif #if defined(PNG_READ_sBIT_SUPPORTED) PNG_sBIT; #endif #if defined(PNG_READ_sCAL_SUPPORTED) PNG_sCAL; #endif #if defined(PNG_READ_sPLT_SUPPORTED) PNG_sPLT; #endif #if defined(PNG_READ_sRGB_SUPPORTED) PNG_sRGB; #endif #if defined(PNG_READ_tEXt_SUPPORTED) PNG_tEXt; #endif #if defined(PNG_READ_tIME_SUPPORTED) PNG_tIME; #endif #if defined(PNG_READ_tRNS_SUPPORTED) PNG_tRNS; #endif #if defined(PNG_READ_zTXt_SUPPORTED) PNG_zTXt; #endif #endif /* PNG_GLOBAL_ARRAYS */ png_read_data(png_ptr, chunk_length, 4); length = png_get_uint_32(chunk_length); png_reset_crc(png_ptr); png_crc_read(png_ptr, png_ptr->chunk_name, 4); png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name); if (length > PNG_MAX_UINT) png_error(png_ptr, "Invalid chunk length."); if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) png_handle_IHDR(png_ptr, info_ptr, length); else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) png_handle_IEND(png_ptr, info_ptr, length); #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) { if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) { if (length > 0 || png_ptr->mode & PNG_AFTER_IDAT) png_error(png_ptr, "Too many IDAT's found"); } else png_ptr->mode |= PNG_AFTER_IDAT; png_handle_unknown(png_ptr, info_ptr, length); if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) png_ptr->mode |= PNG_HAVE_PLTE; } #endif else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) { /* Zero length IDATs are legal after the last IDAT has been * read, but not after other chunks have been read. */ if (length > 0 || png_ptr->mode & PNG_AFTER_IDAT) png_error(png_ptr, "Too many IDAT's found"); png_crc_finish(png_ptr, length); } else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) png_handle_PLTE(png_ptr, info_ptr, length); #if defined(PNG_READ_bKGD_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) png_handle_bKGD(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_cHRM_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) png_handle_cHRM(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_gAMA_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) png_handle_gAMA(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_hIST_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) png_handle_hIST(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_oFFs_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) png_handle_oFFs(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_pCAL_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) png_handle_pCAL(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_sCAL_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) png_handle_sCAL(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_pHYs_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) png_handle_pHYs(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_sBIT_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) png_handle_sBIT(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_sRGB_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) png_handle_sRGB(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_iCCP_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) png_handle_iCCP(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_sPLT_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) png_handle_sPLT(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_tEXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) png_handle_tEXt(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_tIME_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) png_handle_tIME(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_tRNS_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) png_handle_tRNS(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_zTXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) png_handle_zTXt(png_ptr, info_ptr, length); #endif #if defined(PNG_READ_iTXt_SUPPORTED) else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) png_handle_iTXt(png_ptr, info_ptr, length); #endif else png_handle_unknown(png_ptr, info_ptr, length); } while (!(png_ptr->mode & PNG_HAVE_IEND)); } /* free all memory used by the read */ void PNGAPI png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr) { png_structp png_ptr = NULL; png_infop info_ptr = NULL, end_info_ptr = NULL; #ifdef PNG_USER_MEM_SUPPORTED png_free_ptr free_fn = NULL; png_voidp mem_ptr = NULL; #endif png_debug(1, "in png_destroy_read_struct\n"); if (png_ptr_ptr != NULL) png_ptr = *png_ptr_ptr; if (info_ptr_ptr != NULL) info_ptr = *info_ptr_ptr; if (end_info_ptr_ptr != NULL) end_info_ptr = *end_info_ptr_ptr; #ifdef PNG_USER_MEM_SUPPORTED free_fn = png_ptr->free_fn; mem_ptr = png_ptr->mem_ptr; #endif png_read_destroy(png_ptr, info_ptr, end_info_ptr); if (info_ptr != NULL) { #if defined(PNG_TEXT_SUPPORTED) png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1); #endif #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)info_ptr); #endif *info_ptr_ptr = NULL; } if (end_info_ptr != NULL) { #if defined(PNG_READ_TEXT_SUPPORTED) png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1); #endif #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)end_info_ptr); #endif *end_info_ptr_ptr = NULL; } if (png_ptr != NULL) { #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)png_ptr); #endif *png_ptr_ptr = NULL; } } /* free all memory used by the read (old method) */ void /* PRIVATE */ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr) { #ifdef PNG_SETJMP_SUPPORTED jmp_buf tmp_jmp; #endif png_error_ptr error_fn; png_error_ptr warning_fn; png_voidp error_ptr; #ifdef PNG_USER_MEM_SUPPORTED png_free_ptr free_fn; #endif png_debug(1, "in png_read_destroy\n"); if (info_ptr != NULL) png_info_destroy(png_ptr, info_ptr); if (end_info_ptr != NULL) png_info_destroy(png_ptr, end_info_ptr); png_free(png_ptr, png_ptr->zbuf); png_free(png_ptr, png_ptr->big_row_buf); png_free(png_ptr, png_ptr->prev_row); #if defined(PNG_READ_DITHER_SUPPORTED) png_free(png_ptr, png_ptr->palette_lookup); png_free(png_ptr, png_ptr->dither_index); #endif #if defined(PNG_READ_GAMMA_SUPPORTED) png_free(png_ptr, png_ptr->gamma_table); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) png_free(png_ptr, png_ptr->gamma_from_1); png_free(png_ptr, png_ptr->gamma_to_1); #endif #ifdef PNG_FREE_ME_SUPPORTED if (png_ptr->free_me & PNG_FREE_PLTE) png_zfree(png_ptr, png_ptr->palette); png_ptr->free_me &= ~PNG_FREE_PLTE; #else if (png_ptr->flags & PNG_FLAG_FREE_PLTE) png_zfree(png_ptr, png_ptr->palette); png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; #endif #if defined(PNG_tRNS_SUPPORTED) || \ defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) #ifdef PNG_FREE_ME_SUPPORTED if (png_ptr->free_me & PNG_FREE_TRNS) png_free(png_ptr, png_ptr->trans); png_ptr->free_me &= ~PNG_FREE_TRNS; #else if (png_ptr->flags & PNG_FLAG_FREE_TRNS) png_free(png_ptr, png_ptr->trans); png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; #endif #endif #if defined(PNG_READ_hIST_SUPPORTED) #ifdef PNG_FREE_ME_SUPPORTED if (png_ptr->free_me & PNG_FREE_HIST) png_free(png_ptr, png_ptr->hist); png_ptr->free_me &= ~PNG_FREE_HIST; #else if (png_ptr->flags & PNG_FLAG_FREE_HIST) png_free(png_ptr, png_ptr->hist); png_ptr->flags &= ~PNG_FLAG_FREE_HIST; #endif #endif #if defined(PNG_READ_GAMMA_SUPPORTED) if (png_ptr->gamma_16_table != NULL) { int i; int istop = (1 << (8 - png_ptr->gamma_shift)); for (i = 0; i < istop; i++) { png_free(png_ptr, png_ptr->gamma_16_table[i]); } png_free(png_ptr, png_ptr->gamma_16_table); } #if defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->gamma_16_from_1 != NULL) { int i; int istop = (1 << (8 - png_ptr->gamma_shift)); for (i = 0; i < istop; i++) { png_free(png_ptr, png_ptr->gamma_16_from_1[i]); } png_free(png_ptr, png_ptr->gamma_16_from_1); } if (png_ptr->gamma_16_to_1 != NULL) { int i; int istop = (1 << (8 - png_ptr->gamma_shift)); for (i = 0; i < istop; i++) { png_free(png_ptr, png_ptr->gamma_16_to_1[i]); } png_free(png_ptr, png_ptr->gamma_16_to_1); } #endif #endif #if defined(PNG_TIME_RFC1123_SUPPORTED) png_free(png_ptr, png_ptr->time_buffer); #endif inflateEnd(&png_ptr->zstream); #ifdef PNG_PROGRESSIVE_READ_SUPPORTED png_free(png_ptr, png_ptr->save_buffer); #endif #ifdef PNG_PROGRESSIVE_READ_SUPPORTED #ifdef PNG_TEXT_SUPPORTED png_free(png_ptr, png_ptr->current_text); #endif /* PNG_TEXT_SUPPORTED */ #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ /* Save the important info out of the png_struct, in case it is * being used again. */ #ifdef PNG_SETJMP_SUPPORTED png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf)); #endif error_fn = png_ptr->error_fn; warning_fn = png_ptr->warning_fn; error_ptr = png_ptr->error_ptr; #ifdef PNG_USER_MEM_SUPPORTED free_fn = png_ptr->free_fn; #endif png_memset(png_ptr, 0, sizeof (png_struct)); png_ptr->error_fn = error_fn; png_ptr->warning_fn = warning_fn; png_ptr->error_ptr = error_ptr; #ifdef PNG_USER_MEM_SUPPORTED png_ptr->free_fn = free_fn; #endif #ifdef PNG_SETJMP_SUPPORTED png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf)); #endif } void PNGAPI png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) { png_ptr->read_row_fn = read_row_fn; } #if defined(PNG_INFO_IMAGE_SUPPORTED) void PNGAPI png_read_png(png_structp png_ptr, png_infop info_ptr, int transforms, voidp params) { int row; #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) /* invert the alpha channel from opacity to transparency */ if (transforms & PNG_TRANSFORM_INVERT_ALPHA) png_set_invert_alpha(png_ptr); #endif /* The call to png_read_info() gives us all of the information from the * PNG file before the first IDAT (image data chunk). */ png_read_info(png_ptr, info_ptr); /* -------------- image transformations start here ------------------- */ #if defined(PNG_READ_16_TO_8_SUPPORTED) /* tell libpng to strip 16 bit/color files down to 8 bits/color */ if (transforms & PNG_TRANSFORM_STRIP_16) png_set_strip_16(png_ptr); #endif #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) /* Strip alpha bytes from the input data without combining with the * background (not recommended). */ if (transforms & PNG_TRANSFORM_STRIP_ALPHA) png_set_strip_alpha(png_ptr); #endif #if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single * byte into separate bytes (useful for paletted and grayscale images). */ if (transforms & PNG_TRANSFORM_PACKING) png_set_packing(png_ptr); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) /* Change the order of packed pixels to least significant bit first * (not useful if you are using png_set_packing). */ if (transforms & PNG_TRANSFORM_PACKSWAP) png_set_packswap(png_ptr); #endif #if defined(PNG_READ_EXPAND_SUPPORTED) /* Expand paletted colors into true RGB triplets * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel * Expand paletted or RGB images with transparency to full alpha * channels so the data will be available as RGBA quartets. */ if (transforms & PNG_TRANSFORM_EXPAND) if ((png_ptr->bit_depth < 8) || (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) png_set_expand(png_ptr); #endif /* We don't handle background color or gamma transformation or dithering. */ #if defined(PNG_READ_INVERT_SUPPORTED) /* invert monochrome files to have 0 as white and 1 as black */ if (transforms & PNG_TRANSFORM_INVERT_MONO) png_set_invert_mono(png_ptr); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) /* If you want to shift the pixel values from the range [0,255] or * [0,65535] to the original [0,7] or [0,31], or whatever range the * colors were originally in: */ if ((transforms & PNG_TRANSFORM_SHIFT) && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) { png_color_8p sig_bit; png_get_sBIT(png_ptr, info_ptr, &sig_bit); png_set_shift(png_ptr, sig_bit); } #endif #if defined(PNG_READ_BGR_SUPPORTED) /* flip the RGB pixels to BGR (or RGBA to BGRA) */ if (transforms & PNG_TRANSFORM_BGR) png_set_bgr(png_ptr); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */ if (transforms & PNG_TRANSFORM_SWAP_ALPHA) png_set_swap_alpha(png_ptr); #endif #if defined(PNG_READ_SWAP_SUPPORTED) /* swap bytes of 16 bit files to least significant byte first */ if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) png_set_swap(png_ptr); #endif /* We don't handle adding filler bytes */ /* Optional call to gamma correct and add the background to the palette * and update info structure. REQUIRED if you are expecting libpng to * update the palette for you (i.e., you selected such a transform above). */ png_read_update_info(png_ptr, info_ptr); /* -------------- image transformations end here ------------------- */ #ifdef PNG_FREE_ME_SUPPORTED png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); #endif if(info_ptr->row_pointers == NULL) { info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, info_ptr->height * sizeof(png_bytep)); #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_ROWS; #endif for (row = 0; row < (int)info_ptr->height; row++) { info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr)); } } png_read_image(png_ptr, info_ptr->row_pointers); info_ptr->valid |= PNG_INFO_IDAT; /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ png_read_end(png_ptr, info_ptr); if(transforms == 0 || params == NULL) /* quiet compiler warnings */ return; } #endif gamera-3.3.3/src/libpng-1.2.5/pngrio.c0000644000076500000000000001235110714675701016121 0ustar chriswheel /* pngrio.c - functions for data input * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This file provides a location for all input. Users who need * special handling are expected to write a function that has the same * arguments as this and performs a similar function, but that possibly * has a different input method. Note that you shouldn't change this * function, but rather write a replacement function and then make * libpng use it at run time with png_set_read_fn(...). */ #define PNG_INTERNAL #include "png.h" /* Read the data from whatever input you are using. The default routine reads from a file pointer. Note that this routine sometimes gets called with very small lengths, so you should implement some kind of simple buffering if you are using unbuffered reads. This should never be asked to read more then 64K on a 16 bit machine. */ void /* PRIVATE */ png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_debug1(4,"reading %d bytes\n", (int)length); if (png_ptr->read_data_fn != NULL) (*(png_ptr->read_data_fn))(png_ptr, data, length); else png_error(png_ptr, "Call to NULL read function"); } #if !defined(PNG_NO_STDIO) /* This is the function that does the actual reading of data. If you are not reading from a standard C stream, you should create a replacement read_data function and use it at run time with png_set_read_fn(), rather than changing the library. */ #ifndef USE_FAR_KEYWORD void PNGAPI png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_size_t check; /* fread() returns 0 on error, so it is OK to store this in a png_size_t * instead of an int, which is what fread() actually returns. */ #if defined(_WIN32_WCE) if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) check = 0; #else check = (png_size_t)fread(data, (png_size_t)1, length, (png_FILE_p)png_ptr->io_ptr); #endif if (check != length) png_error(png_ptr, "Read Error"); } #else /* this is the model-independent version. Since the standard I/O library can't handle far buffers in the medium and small models, we have to copy the data. */ #define NEAR_BUF_SIZE 1024 #define MIN(a,b) (a <= b ? a : b) static void /* PRIVATE */ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) { int check; png_byte *n_data; png_FILE_p io_ptr; /* Check if data really is near. If so, use usual code. */ n_data = (png_byte *)CVT_PTR_NOCHECK(data); io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); if ((png_bytep)n_data == data) { #if defined(_WIN32_WCE) if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) check = 0; #else check = fread(n_data, 1, length, io_ptr); #endif } else { png_byte buf[NEAR_BUF_SIZE]; png_size_t read, remaining, err; check = 0; remaining = length; do { read = MIN(NEAR_BUF_SIZE, remaining); #if defined(_WIN32_WCE) if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) ) err = 0; #else err = fread(buf, (png_size_t)1, read, io_ptr); #endif png_memcpy(data, buf, read); /* copy far buffer to near buffer */ if(err != read) break; else check += err; data += read; remaining -= read; } while (remaining != 0); } if ((png_uint_32)check != (png_uint_32)length) png_error(png_ptr, "read Error"); } #endif #endif /* This function allows the application to supply a new input function for libpng if standard C streams aren't being used. This function takes as its arguments: png_ptr - pointer to a png input data structure io_ptr - pointer to user supplied structure containing info about the input functions. May be NULL. read_data_fn - pointer to a new input function that takes as its arguments a pointer to a png_struct, a pointer to a location where input data can be stored, and a 32-bit unsigned int that is the number of bytes to be read. To exit and output any fatal error messages the new write function should call png_error(png_ptr, "Error msg"). */ void PNGAPI png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn) { png_ptr->io_ptr = io_ptr; #if !defined(PNG_NO_STDIO) if (read_data_fn != NULL) png_ptr->read_data_fn = read_data_fn; else png_ptr->read_data_fn = png_default_read_data; #else png_ptr->read_data_fn = read_data_fn; #endif /* It is an error to write to a read device */ if (png_ptr->write_data_fn != NULL) { png_ptr->write_data_fn = NULL; png_warning(png_ptr, "It's an error to set both read_data_fn and write_data_fn in the "); png_warning(png_ptr, "same structure. Resetting write_data_fn to NULL."); } #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_ptr->output_flush_fn = NULL; #endif } gamera-3.3.3/src/libpng-1.2.5/pngrtran.c0000644000076500000000000042565510714675701016475 0ustar chriswheel /* pngrtran.c - transforms the data in a row for PNG readers * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This file contains functions optionally called by an application * in order to tell libpng how to handle data when reading a PNG. * Transformations that are used in both reading and writing are * in pngtrans.c. */ #define PNG_INTERNAL #include "png.h" /* Set the action on getting a CRC error for an ancillary or critical chunk. */ void PNGAPI png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action) { png_debug(1, "in png_set_crc_action\n"); /* Tell libpng how we react to CRC errors in critical chunks */ switch (crit_action) { case PNG_CRC_NO_CHANGE: /* leave setting as is */ break; case PNG_CRC_WARN_USE: /* warn/use data */ png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE; break; case PNG_CRC_QUIET_USE: /* quiet/use data */ png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE | PNG_FLAG_CRC_CRITICAL_IGNORE; break; case PNG_CRC_WARN_DISCARD: /* not a valid action for critical data */ png_warning(png_ptr, "Can't discard critical data on CRC error."); case PNG_CRC_ERROR_QUIT: /* error/quit */ case PNG_CRC_DEFAULT: default: png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; break; } switch (ancil_action) { case PNG_CRC_NO_CHANGE: /* leave setting as is */ break; case PNG_CRC_WARN_USE: /* warn/use data */ png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE; break; case PNG_CRC_QUIET_USE: /* quiet/use data */ png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN; break; case PNG_CRC_ERROR_QUIT: /* error/quit */ png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN; break; case PNG_CRC_WARN_DISCARD: /* warn/discard data */ case PNG_CRC_DEFAULT: default: png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; break; } } #if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ defined(PNG_FLOATING_POINT_SUPPORTED) /* handle alpha and tRNS via a background color */ void PNGAPI png_set_background(png_structp png_ptr, png_color_16p background_color, int background_gamma_code, int need_expand, double background_gamma) { png_debug(1, "in png_set_background\n"); if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN) { png_warning(png_ptr, "Application must supply a known background gamma"); return; } png_ptr->transformations |= PNG_BACKGROUND; png_memcpy(&(png_ptr->background), background_color, sizeof(png_color_16)); png_ptr->background_gamma = (float)background_gamma; png_ptr->background_gamma_type = (png_byte)(background_gamma_code); png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0); /* Note: if need_expand is set and color_type is either RGB or RGB_ALPHA * (in which case need_expand is superfluous anyway), the background color * might actually be gray yet not be flagged as such. This is not a problem * for the current code, which uses PNG_BACKGROUND_IS_GRAY only to * decide when to do the png_do_gray_to_rgb() transformation. */ if ((need_expand && !(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) || (!need_expand && background_color->red == background_color->green && background_color->red == background_color->blue)) png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; } #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) /* strip 16 bit depth files to 8 bit depth */ void PNGAPI png_set_strip_16(png_structp png_ptr) { png_debug(1, "in png_set_strip_16\n"); png_ptr->transformations |= PNG_16_TO_8; } #endif #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) void PNGAPI png_set_strip_alpha(png_structp png_ptr) { png_debug(1, "in png_set_strip_alpha\n"); png_ptr->transformations |= PNG_STRIP_ALPHA; } #endif #if defined(PNG_READ_DITHER_SUPPORTED) /* Dither file to 8 bit. Supply a palette, the current number * of elements in the palette, the maximum number of elements * allowed, and a histogram if possible. If the current number * of colors is greater then the maximum number, the palette will be * modified to fit in the maximum number. "full_dither" indicates * whether we need a dithering cube set up for RGB images, or if we * simply are reducing the number of colors in a paletted image. */ typedef struct png_dsort_struct { struct png_dsort_struct FAR * next; png_byte left; png_byte right; } png_dsort; typedef png_dsort FAR * png_dsortp; typedef png_dsort FAR * FAR * png_dsortpp; void PNGAPI png_set_dither(png_structp png_ptr, png_colorp palette, int num_palette, int maximum_colors, png_uint_16p histogram, int full_dither) { png_debug(1, "in png_set_dither\n"); png_ptr->transformations |= PNG_DITHER; if (!full_dither) { int i; png_ptr->dither_index = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_palette * sizeof (png_byte))); for (i = 0; i < num_palette; i++) png_ptr->dither_index[i] = (png_byte)i; } if (num_palette > maximum_colors) { if (histogram != NULL) { /* This is easy enough, just throw out the least used colors. Perhaps not the best solution, but good enough. */ int i; /* initialize an array to sort colors */ png_ptr->dither_sort = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_palette * sizeof (png_byte))); /* initialize the dither_sort array */ for (i = 0; i < num_palette; i++) png_ptr->dither_sort[i] = (png_byte)i; /* Find the least used palette entries by starting a bubble sort, and running it until we have sorted out enough colors. Note that we don't care about sorting all the colors, just finding which are least used. */ for (i = num_palette - 1; i >= maximum_colors; i--) { int done; /* to stop early if the list is pre-sorted */ int j; done = 1; for (j = 0; j < i; j++) { if (histogram[png_ptr->dither_sort[j]] < histogram[png_ptr->dither_sort[j + 1]]) { png_byte t; t = png_ptr->dither_sort[j]; png_ptr->dither_sort[j] = png_ptr->dither_sort[j + 1]; png_ptr->dither_sort[j + 1] = t; done = 0; } } if (done) break; } /* swap the palette around, and set up a table, if necessary */ if (full_dither) { int j = num_palette; /* put all the useful colors within the max, but don't move the others */ for (i = 0; i < maximum_colors; i++) { if ((int)png_ptr->dither_sort[i] >= maximum_colors) { do j--; while ((int)png_ptr->dither_sort[j] >= maximum_colors); palette[i] = palette[j]; } } } else { int j = num_palette; /* move all the used colors inside the max limit, and develop a translation table */ for (i = 0; i < maximum_colors; i++) { /* only move the colors we need to */ if ((int)png_ptr->dither_sort[i] >= maximum_colors) { png_color tmp_color; do j--; while ((int)png_ptr->dither_sort[j] >= maximum_colors); tmp_color = palette[j]; palette[j] = palette[i]; palette[i] = tmp_color; /* indicate where the color went */ png_ptr->dither_index[j] = (png_byte)i; png_ptr->dither_index[i] = (png_byte)j; } } /* find closest color for those colors we are not using */ for (i = 0; i < num_palette; i++) { if ((int)png_ptr->dither_index[i] >= maximum_colors) { int min_d, k, min_k, d_index; /* find the closest color to one we threw out */ d_index = png_ptr->dither_index[i]; min_d = PNG_COLOR_DIST(palette[d_index], palette[0]); for (k = 1, min_k = 0; k < maximum_colors; k++) { int d; d = PNG_COLOR_DIST(palette[d_index], palette[k]); if (d < min_d) { min_d = d; min_k = k; } } /* point to closest color */ png_ptr->dither_index[i] = (png_byte)min_k; } } } png_free(png_ptr, png_ptr->dither_sort); png_ptr->dither_sort=NULL; } else { /* This is much harder to do simply (and quickly). Perhaps we need to go through a median cut routine, but those don't always behave themselves with only a few colors as input. So we will just find the closest two colors, and throw out one of them (chosen somewhat randomly). [We don't understand this at all, so if someone wants to work on improving it, be our guest - AED, GRP] */ int i; int max_d; int num_new_palette; png_dsortp t; png_dsortpp hash; t=NULL; /* initialize palette index arrays */ png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_palette * sizeof (png_byte))); png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_palette * sizeof (png_byte))); /* initialize the sort array */ for (i = 0; i < num_palette; i++) { png_ptr->index_to_palette[i] = (png_byte)i; png_ptr->palette_to_index[i] = (png_byte)i; } hash = (png_dsortpp)png_malloc(png_ptr, (png_uint_32)(769 * sizeof (png_dsortp))); for (i = 0; i < 769; i++) hash[i] = NULL; /* png_memset(hash, 0, 769 * sizeof (png_dsortp)); */ num_new_palette = num_palette; /* initial wild guess at how far apart the farthest pixel pair we will be eliminating will be. Larger numbers mean more areas will be allocated, Smaller numbers run the risk of not saving enough data, and having to do this all over again. I have not done extensive checking on this number. */ max_d = 96; while (num_new_palette > maximum_colors) { for (i = 0; i < num_new_palette - 1; i++) { int j; for (j = i + 1; j < num_new_palette; j++) { int d; d = PNG_COLOR_DIST(palette[i], palette[j]); if (d <= max_d) { t = (png_dsortp)png_malloc_warn(png_ptr, (png_uint_32)(sizeof(png_dsort))); if (t == NULL) break; t->next = hash[d]; t->left = (png_byte)i; t->right = (png_byte)j; hash[d] = t; } } if (t == NULL) break; } if (t != NULL) for (i = 0; i <= max_d; i++) { if (hash[i] != NULL) { png_dsortp p; for (p = hash[i]; p; p = p->next) { if ((int)png_ptr->index_to_palette[p->left] < num_new_palette && (int)png_ptr->index_to_palette[p->right] < num_new_palette) { int j, next_j; if (num_new_palette & 0x01) { j = p->left; next_j = p->right; } else { j = p->right; next_j = p->left; } num_new_palette--; palette[png_ptr->index_to_palette[j]] = palette[num_new_palette]; if (!full_dither) { int k; for (k = 0; k < num_palette; k++) { if (png_ptr->dither_index[k] == png_ptr->index_to_palette[j]) png_ptr->dither_index[k] = png_ptr->index_to_palette[next_j]; if ((int)png_ptr->dither_index[k] == num_new_palette) png_ptr->dither_index[k] = png_ptr->index_to_palette[j]; } } png_ptr->index_to_palette[png_ptr->palette_to_index [num_new_palette]] = png_ptr->index_to_palette[j]; png_ptr->palette_to_index[png_ptr->index_to_palette[j]] = png_ptr->palette_to_index[num_new_palette]; png_ptr->index_to_palette[j] = (png_byte)num_new_palette; png_ptr->palette_to_index[num_new_palette] = (png_byte)j; } if (num_new_palette <= maximum_colors) break; } if (num_new_palette <= maximum_colors) break; } } for (i = 0; i < 769; i++) { if (hash[i] != NULL) { png_dsortp p = hash[i]; while (p) { t = p->next; png_free(png_ptr, p); p = t; } } hash[i] = 0; } max_d += 96; } png_free(png_ptr, hash); png_free(png_ptr, png_ptr->palette_to_index); png_free(png_ptr, png_ptr->index_to_palette); png_ptr->palette_to_index=NULL; png_ptr->index_to_palette=NULL; } num_palette = maximum_colors; } if (png_ptr->palette == NULL) { png_ptr->palette = palette; } png_ptr->num_palette = (png_uint_16)num_palette; if (full_dither) { int i; png_bytep distance; int total_bits = PNG_DITHER_RED_BITS + PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS; int num_red = (1 << PNG_DITHER_RED_BITS); int num_green = (1 << PNG_DITHER_GREEN_BITS); int num_blue = (1 << PNG_DITHER_BLUE_BITS); png_size_t num_entries = ((png_size_t)1 << total_bits); png_ptr->palette_lookup = (png_bytep )png_malloc(png_ptr, (png_uint_32)(num_entries * sizeof (png_byte))); png_memset(png_ptr->palette_lookup, 0, num_entries * sizeof (png_byte)); distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries * sizeof(png_byte))); png_memset(distance, 0xff, num_entries * sizeof(png_byte)); for (i = 0; i < num_palette; i++) { int ir, ig, ib; int r = (palette[i].red >> (8 - PNG_DITHER_RED_BITS)); int g = (palette[i].green >> (8 - PNG_DITHER_GREEN_BITS)); int b = (palette[i].blue >> (8 - PNG_DITHER_BLUE_BITS)); for (ir = 0; ir < num_red; ir++) { int dr = abs(ir - r); int index_r = (ir << (PNG_DITHER_BLUE_BITS + PNG_DITHER_GREEN_BITS)); for (ig = 0; ig < num_green; ig++) { int dg = abs(ig - g); int dt = dr + dg; int dm = ((dr > dg) ? dr : dg); int index_g = index_r | (ig << PNG_DITHER_BLUE_BITS); for (ib = 0; ib < num_blue; ib++) { int d_index = index_g | ib; int db = abs(ib - b); int dmax = ((dm > db) ? dm : db); int d = dmax + dt + db; if (d < (int)distance[d_index]) { distance[d_index] = (png_byte)d; png_ptr->palette_lookup[d_index] = (png_byte)i; } } } } } png_free(png_ptr, distance); } } #endif #if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) /* Transform the image from the file_gamma to the screen_gamma. We * only do transformations on images where the file_gamma and screen_gamma * are not close reciprocals, otherwise it slows things down slightly, and * also needlessly introduces small errors. * * We will turn off gamma transformation later if no semitransparent entries * are present in the tRNS array for palette images. We can't do it here * because we don't necessarily have the tRNS chunk yet. */ void PNGAPI png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma) { png_debug(1, "in png_set_gamma\n"); if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) || (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) || (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) png_ptr->transformations |= PNG_GAMMA; png_ptr->gamma = (float)file_gamma; png_ptr->screen_gamma = (float)scrn_gamma; } #endif #if defined(PNG_READ_EXPAND_SUPPORTED) /* Expand paletted images to RGB, expand grayscale images of * less than 8-bit depth to 8-bit depth, and expand tRNS chunks * to alpha channels. */ void PNGAPI png_set_expand(png_structp png_ptr) { png_debug(1, "in png_set_expand\n"); png_ptr->transformations |= PNG_EXPAND; } /* GRR 19990627: the following three functions currently are identical * to png_set_expand(). However, it is entirely reasonable that someone * might wish to expand an indexed image to RGB but *not* expand a single, * fully transparent palette entry to a full alpha channel--perhaps instead * convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace * the transparent color with a particular RGB value, or drop tRNS entirely. * IOW, a future version of the library may make the transformations flag * a bit more fine-grained, with separate bits for each of these three * functions. * * More to the point, these functions make it obvious what libpng will be * doing, whereas "expand" can (and does) mean any number of things. */ /* Expand paletted images to RGB. */ void PNGAPI png_set_palette_to_rgb(png_structp png_ptr) { png_debug(1, "in png_set_expand\n"); png_ptr->transformations |= PNG_EXPAND; } /* Expand grayscale images of less than 8-bit depth to 8 bits. */ void PNGAPI png_set_gray_1_2_4_to_8(png_structp png_ptr) { png_debug(1, "in png_set_expand\n"); png_ptr->transformations |= PNG_EXPAND; } /* Expand tRNS chunks to alpha channels. */ void PNGAPI png_set_tRNS_to_alpha(png_structp png_ptr) { png_debug(1, "in png_set_expand\n"); png_ptr->transformations |= PNG_EXPAND; } #endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) void PNGAPI png_set_gray_to_rgb(png_structp png_ptr) { png_debug(1, "in png_set_gray_to_rgb\n"); png_ptr->transformations |= PNG_GRAY_TO_RGB; } #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) #if defined(PNG_FLOATING_POINT_SUPPORTED) /* Convert a RGB image to a grayscale of the same width. This allows us, * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image. */ void PNGAPI png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red, double green) { int red_fixed = (int)((float)red*100000.0 + 0.5); int green_fixed = (int)((float)green*100000.0 + 0.5); png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed); } #endif void PNGAPI png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, png_fixed_point red, png_fixed_point green) { png_debug(1, "in png_set_rgb_to_gray\n"); switch(error_action) { case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY; break; case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; break; case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; } if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) #if defined(PNG_READ_EXPAND_SUPPORTED) png_ptr->transformations |= PNG_EXPAND; #else { png_warning(png_ptr, "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED."); png_ptr->transformations &= ~PNG_RGB_TO_GRAY; } #endif { png_uint_16 red_int, green_int; if(red < 0 || green < 0) { red_int = 6968; /* .212671 * 32768 + .5 */ green_int = 23434; /* .715160 * 32768 + .5 */ } else if(red + green < 100000L) { red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L); } else { png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients"); red_int = 6968; green_int = 23434; } png_ptr->rgb_to_gray_red_coeff = red_int; png_ptr->rgb_to_gray_green_coeff = green_int; png_ptr->rgb_to_gray_blue_coeff = (png_uint_16)(32768-red_int-green_int); } } #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) void PNGAPI png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr read_user_transform_fn) { png_debug(1, "in png_set_read_user_transform_fn\n"); #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) png_ptr->transformations |= PNG_USER_TRANSFORM; png_ptr->read_user_transform_fn = read_user_transform_fn; #endif #ifdef PNG_LEGACY_SUPPORTED if(read_user_transform_fn) png_warning(png_ptr, "This version of libpng does not support user transforms"); #endif } #endif /* Initialize everything needed for the read. This includes modifying * the palette. */ void /* PRIVATE */ png_init_read_transformations(png_structp png_ptr) { png_debug(1, "in png_init_read_transformations\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if(png_ptr != NULL) #endif { #if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \ || defined(PNG_READ_GAMMA_SUPPORTED) int color_type = png_ptr->color_type; #endif #if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && (png_ptr->transformations & PNG_EXPAND)) { if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */ { /* expand background chunk. */ switch (png_ptr->bit_depth) { case 1: png_ptr->background.gray *= (png_uint_16)0xff; png_ptr->background.red = png_ptr->background.green = png_ptr->background.blue = png_ptr->background.gray; break; case 2: png_ptr->background.gray *= (png_uint_16)0x55; png_ptr->background.red = png_ptr->background.green = png_ptr->background.blue = png_ptr->background.gray; break; case 4: png_ptr->background.gray *= (png_uint_16)0x11; png_ptr->background.red = png_ptr->background.green = png_ptr->background.blue = png_ptr->background.gray; break; case 8: case 16: png_ptr->background.red = png_ptr->background.green = png_ptr->background.blue = png_ptr->background.gray; break; } } else if (color_type == PNG_COLOR_TYPE_PALETTE) { png_ptr->background.red = png_ptr->palette[png_ptr->background.index].red; png_ptr->background.green = png_ptr->palette[png_ptr->background.index].green; png_ptr->background.blue = png_ptr->palette[png_ptr->background.index].blue; #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) if (png_ptr->transformations & PNG_INVERT_ALPHA) { #if defined(PNG_READ_EXPAND_SUPPORTED) if (!(png_ptr->transformations & PNG_EXPAND)) #endif { /* invert the alpha channel (in tRNS) unless the pixels are going to be expanded, in which case leave it for later */ int i,istop; istop=(int)png_ptr->num_trans; for (i=0; itrans[i] = (png_byte)(255 - png_ptr->trans[i]); } } #endif } } #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) png_ptr->background_1 = png_ptr->background; #endif #if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) if ((color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_trans != 0) && (fabs(png_ptr->screen_gamma * png_ptr->gamma - 1.0) < PNG_GAMMA_THRESHOLD)) { int i,k; k=0; for (i=0; inum_trans; i++) { if (png_ptr->trans[i] != 0 && png_ptr->trans[i] != 0xff) k=1; /* partial transparency is present */ } if (k == 0) png_ptr->transformations &= (~PNG_GAMMA); } if (png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY)) { png_build_gamma_table(png_ptr); #if defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->transformations & PNG_BACKGROUND) { if (color_type == PNG_COLOR_TYPE_PALETTE) { /* could skip if no transparency and */ png_color back, back_1; png_colorp palette = png_ptr->palette; int num_palette = png_ptr->num_palette; int i; if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) { back.red = png_ptr->gamma_table[png_ptr->background.red]; back.green = png_ptr->gamma_table[png_ptr->background.green]; back.blue = png_ptr->gamma_table[png_ptr->background.blue]; back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; } else { double g, gs; switch (png_ptr->background_gamma_type) { case PNG_BACKGROUND_GAMMA_SCREEN: g = (png_ptr->screen_gamma); gs = 1.0; break; case PNG_BACKGROUND_GAMMA_FILE: g = 1.0 / (png_ptr->gamma); gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); break; case PNG_BACKGROUND_GAMMA_UNIQUE: g = 1.0 / (png_ptr->background_gamma); gs = 1.0 / (png_ptr->background_gamma * png_ptr->screen_gamma); break; default: g = 1.0; /* back_1 */ gs = 1.0; /* back */ } if ( fabs(gs - 1.0) < PNG_GAMMA_THRESHOLD) { back.red = (png_byte)png_ptr->background.red; back.green = (png_byte)png_ptr->background.green; back.blue = (png_byte)png_ptr->background.blue; } else { back.red = (png_byte)(pow( (double)png_ptr->background.red/255, gs) * 255.0 + .5); back.green = (png_byte)(pow( (double)png_ptr->background.green/255, gs) * 255.0 + .5); back.blue = (png_byte)(pow( (double)png_ptr->background.blue/255, gs) * 255.0 + .5); } back_1.red = (png_byte)(pow( (double)png_ptr->background.red/255, g) * 255.0 + .5); back_1.green = (png_byte)(pow( (double)png_ptr->background.green/255, g) * 255.0 + .5); back_1.blue = (png_byte)(pow( (double)png_ptr->background.blue/255, g) * 255.0 + .5); } for (i = 0; i < num_palette; i++) { if (i < (int)png_ptr->num_trans && png_ptr->trans[i] != 0xff) { if (png_ptr->trans[i] == 0) { palette[i] = back; } else /* if (png_ptr->trans[i] != 0xff) */ { png_byte v, w; v = png_ptr->gamma_to_1[palette[i].red]; png_composite(w, v, png_ptr->trans[i], back_1.red); palette[i].red = png_ptr->gamma_from_1[w]; v = png_ptr->gamma_to_1[palette[i].green]; png_composite(w, v, png_ptr->trans[i], back_1.green); palette[i].green = png_ptr->gamma_from_1[w]; v = png_ptr->gamma_to_1[palette[i].blue]; png_composite(w, v, png_ptr->trans[i], back_1.blue); palette[i].blue = png_ptr->gamma_from_1[w]; } } else { palette[i].red = png_ptr->gamma_table[palette[i].red]; palette[i].green = png_ptr->gamma_table[palette[i].green]; palette[i].blue = png_ptr->gamma_table[palette[i].blue]; } } } /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */ else /* color_type != PNG_COLOR_TYPE_PALETTE */ { double m = (double)(((png_uint_32)1 << png_ptr->bit_depth) - 1); double g = 1.0; double gs = 1.0; switch (png_ptr->background_gamma_type) { case PNG_BACKGROUND_GAMMA_SCREEN: g = (png_ptr->screen_gamma); gs = 1.0; break; case PNG_BACKGROUND_GAMMA_FILE: g = 1.0 / (png_ptr->gamma); gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); break; case PNG_BACKGROUND_GAMMA_UNIQUE: g = 1.0 / (png_ptr->background_gamma); gs = 1.0 / (png_ptr->background_gamma * png_ptr->screen_gamma); break; } png_ptr->background_1.gray = (png_uint_16)(pow( (double)png_ptr->background.gray / m, g) * m + .5); png_ptr->background.gray = (png_uint_16)(pow( (double)png_ptr->background.gray / m, gs) * m + .5); if ((png_ptr->background.red != png_ptr->background.green) || (png_ptr->background.red != png_ptr->background.blue) || (png_ptr->background.red != png_ptr->background.gray)) { /* RGB or RGBA with color background */ png_ptr->background_1.red = (png_uint_16)(pow( (double)png_ptr->background.red / m, g) * m + .5); png_ptr->background_1.green = (png_uint_16)(pow( (double)png_ptr->background.green / m, g) * m + .5); png_ptr->background_1.blue = (png_uint_16)(pow( (double)png_ptr->background.blue / m, g) * m + .5); png_ptr->background.red = (png_uint_16)(pow( (double)png_ptr->background.red / m, gs) * m + .5); png_ptr->background.green = (png_uint_16)(pow( (double)png_ptr->background.green / m, gs) * m + .5); png_ptr->background.blue = (png_uint_16)(pow( (double)png_ptr->background.blue / m, gs) * m + .5); } else { /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */ png_ptr->background_1.red = png_ptr->background_1.green = png_ptr->background_1.blue = png_ptr->background_1.gray; png_ptr->background.red = png_ptr->background.green = png_ptr->background.blue = png_ptr->background.gray; } } } else /* transformation does not include PNG_BACKGROUND */ #endif /* PNG_READ_BACKGROUND_SUPPORTED */ if (color_type == PNG_COLOR_TYPE_PALETTE) { png_colorp palette = png_ptr->palette; int num_palette = png_ptr->num_palette; int i; for (i = 0; i < num_palette; i++) { palette[i].red = png_ptr->gamma_table[palette[i].red]; palette[i].green = png_ptr->gamma_table[palette[i].green]; palette[i].blue = png_ptr->gamma_table[palette[i].blue]; } } } #if defined(PNG_READ_BACKGROUND_SUPPORTED) else #endif #endif /* PNG_READ_GAMMA_SUPPORTED && PNG_FLOATING_POINT_SUPPORTED */ #if defined(PNG_READ_BACKGROUND_SUPPORTED) /* No GAMMA transformation */ if ((png_ptr->transformations & PNG_BACKGROUND) && (color_type == PNG_COLOR_TYPE_PALETTE)) { int i; int istop = (int)png_ptr->num_trans; png_color back; png_colorp palette = png_ptr->palette; back.red = (png_byte)png_ptr->background.red; back.green = (png_byte)png_ptr->background.green; back.blue = (png_byte)png_ptr->background.blue; for (i = 0; i < istop; i++) { if (png_ptr->trans[i] == 0) { palette[i] = back; } else if (png_ptr->trans[i] != 0xff) { /* The png_composite() macro is defined in png.h */ png_composite(palette[i].red, palette[i].red, png_ptr->trans[i], back.red); png_composite(palette[i].green, palette[i].green, png_ptr->trans[i], back.green); png_composite(palette[i].blue, palette[i].blue, png_ptr->trans[i], back.blue); } } } #endif /* PNG_READ_BACKGROUND_SUPPORTED */ #if defined(PNG_READ_SHIFT_SUPPORTED) if ((png_ptr->transformations & PNG_SHIFT) && (color_type == PNG_COLOR_TYPE_PALETTE)) { png_uint_16 i; png_uint_16 istop = png_ptr->num_palette; int sr = 8 - png_ptr->sig_bit.red; int sg = 8 - png_ptr->sig_bit.green; int sb = 8 - png_ptr->sig_bit.blue; if (sr < 0 || sr > 8) sr = 0; if (sg < 0 || sg > 8) sg = 0; if (sb < 0 || sb > 8) sb = 0; for (i = 0; i < istop; i++) { png_ptr->palette[i].red >>= sr; png_ptr->palette[i].green >>= sg; png_ptr->palette[i].blue >>= sb; } } #endif /* PNG_READ_SHIFT_SUPPORTED */ } #if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \ && !defined(PNG_READ_BACKGROUND_SUPPORTED) if(png_ptr) return; #endif } /* Modify the info structure to reflect the transformations. The * info should be updated so a PNG file could be written with it, * assuming the transformations result in valid PNG data. */ void /* PRIVATE */ png_read_transform_info(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_read_transform_info\n"); #if defined(PNG_READ_EXPAND_SUPPORTED) if (png_ptr->transformations & PNG_EXPAND) { if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { if (png_ptr->num_trans) info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; else info_ptr->color_type = PNG_COLOR_TYPE_RGB; info_ptr->bit_depth = 8; info_ptr->num_trans = 0; } else { if (png_ptr->num_trans) info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; if (info_ptr->bit_depth < 8) info_ptr->bit_depth = 8; info_ptr->num_trans = 0; } } #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->transformations & PNG_BACKGROUND) { info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; info_ptr->num_trans = 0; info_ptr->background = png_ptr->background; } #endif #if defined(PNG_READ_GAMMA_SUPPORTED) if (png_ptr->transformations & PNG_GAMMA) { #ifdef PNG_FLOATING_POINT_SUPPORTED info_ptr->gamma = png_ptr->gamma; #endif #ifdef PNG_FIXED_POINT_SUPPORTED info_ptr->int_gamma = png_ptr->int_gamma; #endif } #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16)) info_ptr->bit_depth = 8; #endif #if defined(PNG_READ_DITHER_SUPPORTED) if (png_ptr->transformations & PNG_DITHER) { if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && png_ptr->palette_lookup && info_ptr->bit_depth == 8) { info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; } } #endif #if defined(PNG_READ_PACK_SUPPORTED) if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8)) info_ptr->bit_depth = 8; #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) if (png_ptr->transformations & PNG_GRAY_TO_RGB) info_ptr->color_type |= PNG_COLOR_MASK_COLOR; #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) if (png_ptr->transformations & PNG_RGB_TO_GRAY) info_ptr->color_type &= ~PNG_COLOR_MASK_COLOR; #endif if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) info_ptr->channels = 1; else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) info_ptr->channels = 3; else info_ptr->channels = 1; #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) if (png_ptr->transformations & PNG_STRIP_ALPHA) info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; #endif if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) info_ptr->channels++; #if defined(PNG_READ_FILLER_SUPPORTED) /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */ if ((png_ptr->transformations & PNG_FILLER) && ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || (info_ptr->color_type == PNG_COLOR_TYPE_GRAY))) { info_ptr->channels++; #if 0 /* if adding a true alpha channel not just filler */ info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; #endif } #endif #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \ defined(PNG_READ_USER_TRANSFORM_SUPPORTED) if(png_ptr->transformations & PNG_USER_TRANSFORM) { if(info_ptr->bit_depth < png_ptr->user_transform_depth) info_ptr->bit_depth = png_ptr->user_transform_depth; if(info_ptr->channels < png_ptr->user_transform_channels) info_ptr->channels = png_ptr->user_transform_channels; } #endif info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); info_ptr->rowbytes = ((info_ptr->width * info_ptr->pixel_depth + 7) >> 3); #if !defined(PNG_READ_EXPAND_SUPPORTED) if(png_ptr) return; #endif } /* Transform the row. The order of transformations is significant, * and is very touchy. If you add a transformation, take care to * decide how it fits in with the other transformations here. */ void /* PRIVATE */ png_do_read_transformations(png_structp png_ptr) { png_debug(1, "in png_do_read_transformations\n"); #if !defined(PNG_USELESS_TESTS_SUPPORTED) if (png_ptr->row_buf == NULL) { #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) char msg[50]; sprintf(msg, "NULL row buffer for row %ld, pass %d", png_ptr->row_number, png_ptr->pass); png_error(png_ptr, msg); #else png_error(png_ptr, "NULL row buffer"); #endif } #endif #if defined(PNG_READ_EXPAND_SUPPORTED) if (png_ptr->transformations & PNG_EXPAND) { if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE) { png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->palette, png_ptr->trans, png_ptr->num_trans); } else { if (png_ptr->num_trans) png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, &(png_ptr->trans_values)); else png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, NULL); } } #endif #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) if (png_ptr->transformations & PNG_STRIP_ALPHA) png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, PNG_FLAG_FILLER_AFTER); #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) if (png_ptr->transformations & PNG_RGB_TO_GRAY) { int rgb_error = png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1); if(rgb_error) { png_ptr->rgb_to_gray_status=1; if(png_ptr->transformations == PNG_RGB_TO_GRAY_WARN) png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); if(png_ptr->transformations == PNG_RGB_TO_GRAY_ERR) png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel"); } } #endif /* From Andreas Dilger e-mail to png-implement, 26 March 1998: In most cases, the "simple transparency" should be done prior to doing gray-to-RGB, or you will have to test 3x as many bytes to check if a pixel is transparent. You would also need to make sure that the transparency information is upgraded to RGB. To summarize, the current flow is: - Gray + simple transparency -> compare 1 or 2 gray bytes and composite with background "in place" if transparent, convert to RGB if necessary - Gray + alpha -> composite with gray background and remove alpha bytes, convert to RGB if necessary To support RGB backgrounds for gray images we need: - Gray + simple transparency -> convert to RGB + simple transparency, compare 3 or 6 bytes and composite with background "in place" if transparent (3x compare/pixel compared to doing composite with gray bkgrnd) - Gray + alpha -> convert to RGB + alpha, composite with background and remove alpha bytes (3x float operations/pixel compared with composite on gray background) Greg's change will do this. The reason it wasn't done before is for performance, as this increases the per-pixel operations. If we would check in advance if the background was gray or RGB, and position the gray-to-RGB transform appropriately, then it would save a lot of work/time. */ #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) /* if gray -> RGB, do so now only if background is non-gray; else do later * for performance reasons */ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) if ((png_ptr->transformations & PNG_BACKGROUND) && ((png_ptr->num_trans != 0 ) || (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1, &(png_ptr->trans_values), &(png_ptr->background) #if defined(PNG_READ_GAMMA_SUPPORTED) , &(png_ptr->background_1), png_ptr->gamma_table, png_ptr->gamma_from_1, png_ptr->gamma_to_1, png_ptr->gamma_16_table, png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1, png_ptr->gamma_shift #endif ); #endif #if defined(PNG_READ_GAMMA_SUPPORTED) if ((png_ptr->transformations & PNG_GAMMA) && #if defined(PNG_READ_BACKGROUND_SUPPORTED) !((png_ptr->transformations & PNG_BACKGROUND) && ((png_ptr->num_trans != 0) || (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && #endif (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)) png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->gamma_table, png_ptr->gamma_16_table, png_ptr->gamma_shift); #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) if (png_ptr->transformations & PNG_16_TO_8) png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_DITHER_SUPPORTED) if (png_ptr->transformations & PNG_DITHER) { png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->palette_lookup, png_ptr->dither_index); if(png_ptr->row_info.rowbytes == (png_uint_32)0) png_error(png_ptr, "png_do_dither returned rowbytes=0"); } #endif #if defined(PNG_READ_INVERT_SUPPORTED) if (png_ptr->transformations & PNG_INVERT_MONO) png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_SHIFT_SUPPORTED) if (png_ptr->transformations & PNG_SHIFT) png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1, &(png_ptr->shift)); #endif #if defined(PNG_READ_PACK_SUPPORTED) if (png_ptr->transformations & PNG_PACK) png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_BGR_SUPPORTED) if (png_ptr->transformations & PNG_BGR) png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) /* if gray -> RGB, do so now only if we did not do so above */ if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_FILLER_SUPPORTED) if (png_ptr->transformations & PNG_FILLER) png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, (png_uint_32)png_ptr->filler, png_ptr->flags); #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) if (png_ptr->transformations & PNG_INVERT_ALPHA) png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) if (png_ptr->transformations & PNG_SWAP_ALPHA) png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_SWAP_SUPPORTED) if (png_ptr->transformations & PNG_SWAP_BYTES) png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) if (png_ptr->transformations & PNG_USER_TRANSFORM) { if(png_ptr->read_user_transform_fn != NULL) (*(png_ptr->read_user_transform_fn)) /* user read transform function */ (png_ptr, /* png_ptr */ &(png_ptr->row_info), /* row_info: */ /* png_uint_32 width; width of row */ /* png_uint_32 rowbytes; number of bytes in row */ /* png_byte color_type; color type of pixels */ /* png_byte bit_depth; bit depth of samples */ /* png_byte channels; number of channels (1-4) */ /* png_byte pixel_depth; bits per pixel (depth*channels) */ png_ptr->row_buf + 1); /* start of pixel data for row */ #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) if(png_ptr->user_transform_depth) png_ptr->row_info.bit_depth = png_ptr->user_transform_depth; if(png_ptr->user_transform_channels) png_ptr->row_info.channels = png_ptr->user_transform_channels; #endif png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * png_ptr->row_info.channels); png_ptr->row_info.rowbytes = (png_ptr->row_info.width * png_ptr->row_info.pixel_depth+7)>>3; } #endif } #if defined(PNG_READ_PACK_SUPPORTED) /* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel, * without changing the actual values. Thus, if you had a row with * a bit depth of 1, you would end up with bytes that only contained * the numbers 0 or 1. If you would rather they contain 0 and 255, use * png_do_shift() after this. */ void /* PRIVATE */ png_do_unpack(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_unpack\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL && row_info->bit_depth < 8) #else if (row_info->bit_depth < 8) #endif { png_uint_32 i; png_uint_32 row_width=row_info->width; switch (row_info->bit_depth) { case 1: { png_bytep sp = row + (png_size_t)((row_width - 1) >> 3); png_bytep dp = row + (png_size_t)row_width - 1; png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07); for (i = 0; i < row_width; i++) { *dp = (png_byte)((*sp >> shift) & 0x01); if (shift == 7) { shift = 0; sp--; } else shift++; dp--; } break; } case 2: { png_bytep sp = row + (png_size_t)((row_width - 1) >> 2); png_bytep dp = row + (png_size_t)row_width - 1; png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); for (i = 0; i < row_width; i++) { *dp = (png_byte)((*sp >> shift) & 0x03); if (shift == 6) { shift = 0; sp--; } else shift += 2; dp--; } break; } case 4: { png_bytep sp = row + (png_size_t)((row_width - 1) >> 1); png_bytep dp = row + (png_size_t)row_width - 1; png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); for (i = 0; i < row_width; i++) { *dp = (png_byte)((*sp >> shift) & 0x0f); if (shift == 4) { shift = 0; sp--; } else shift = 4; dp--; } break; } } row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); row_info->rowbytes = row_width * row_info->channels; } } #endif #if defined(PNG_READ_SHIFT_SUPPORTED) /* Reverse the effects of png_do_shift. This routine merely shifts the * pixels back to their significant bits values. Thus, if you have * a row of bit depth 8, but only 5 are significant, this will shift * the values back to 0 through 31. */ void /* PRIVATE */ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) { png_debug(1, "in png_do_unshift\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && sig_bits != NULL && #endif row_info->color_type != PNG_COLOR_TYPE_PALETTE) { int shift[4]; int channels = 0; int c; png_uint_16 value = 0; png_uint_32 row_width = row_info->width; if (row_info->color_type & PNG_COLOR_MASK_COLOR) { shift[channels++] = row_info->bit_depth - sig_bits->red; shift[channels++] = row_info->bit_depth - sig_bits->green; shift[channels++] = row_info->bit_depth - sig_bits->blue; } else { shift[channels++] = row_info->bit_depth - sig_bits->gray; } if (row_info->color_type & PNG_COLOR_MASK_ALPHA) { shift[channels++] = row_info->bit_depth - sig_bits->alpha; } for (c = 0; c < channels; c++) { if (shift[c] <= 0) shift[c] = 0; else value = 1; } if (!value) return; switch (row_info->bit_depth) { case 2: { png_bytep bp; png_uint_32 i; png_uint_32 istop = row_info->rowbytes; for (bp = row, i = 0; i < istop; i++) { *bp >>= 1; *bp++ &= 0x55; } break; } case 4: { png_bytep bp = row; png_uint_32 i; png_uint_32 istop = row_info->rowbytes; png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) | (png_byte)((int)0xf >> shift[0])); for (i = 0; i < istop; i++) { *bp >>= shift[0]; *bp++ &= mask; } break; } case 8: { png_bytep bp = row; png_uint_32 i; png_uint_32 istop = row_width * channels; for (i = 0; i < istop; i++) { *bp++ >>= shift[i%channels]; } break; } case 16: { png_bytep bp = row; png_uint_32 i; png_uint_32 istop = channels * row_width; for (i = 0; i < istop; i++) { value = (png_uint_16)((*bp << 8) + *(bp + 1)); value >>= shift[i%channels]; *bp++ = (png_byte)(value >> 8); *bp++ = (png_byte)(value & 0xff); } break; } } } } #endif #if defined(PNG_READ_16_TO_8_SUPPORTED) /* chop rows of bit depth 16 down to 8 */ void /* PRIVATE */ png_do_chop(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_chop\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL && row_info->bit_depth == 16) #else if (row_info->bit_depth == 16) #endif { png_bytep sp = row; png_bytep dp = row; png_uint_32 i; png_uint_32 istop = row_info->width * row_info->channels; for (i = 0; i> 8)) >> 8; * * Approximate calculation with shift/add instead of multiply/divide: * *dp = ((((png_uint_32)(*sp) << 8) | * (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8; * * What we actually do to avoid extra shifting and conversion: */ *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0); #else /* Simply discard the low order byte */ *dp = *sp; #endif } row_info->bit_depth = 8; row_info->pixel_depth = (png_byte)(8 * row_info->channels); row_info->rowbytes = row_info->width * row_info->channels; } } #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) void /* PRIVATE */ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_read_swap_alpha\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL) #endif { png_uint_32 row_width = row_info->width; if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { /* This converts from RGBA to ARGB */ if (row_info->bit_depth == 8) { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_byte save; png_uint_32 i; for (i = 0; i < row_width; i++) { save = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = save; } } /* This converts from RRGGBBAA to AARRGGBB */ else { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_byte save[2]; png_uint_32 i; for (i = 0; i < row_width; i++) { save[0] = *(--sp); save[1] = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = save[0]; *(--dp) = save[1]; } } } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { /* This converts from GA to AG */ if (row_info->bit_depth == 8) { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_byte save; png_uint_32 i; for (i = 0; i < row_width; i++) { save = *(--sp); *(--dp) = *(--sp); *(--dp) = save; } } /* This converts from GGAA to AAGG */ else { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_byte save[2]; png_uint_32 i; for (i = 0; i < row_width; i++) { save[0] = *(--sp); save[1] = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = save[0]; *(--dp) = save[1]; } } } } } #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) void /* PRIVATE */ png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_read_invert_alpha\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL) #endif { png_uint_32 row_width = row_info->width; if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { /* This inverts the alpha channel in RGBA */ if (row_info->bit_depth == 8) { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_uint_32 i; for (i = 0; i < row_width; i++) { *(--dp) = (png_byte)(255 - *(--sp)); /* This does nothing: *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); We can replace it with: */ sp-=3; dp=sp; } } /* This inverts the alpha channel in RRGGBBAA */ else { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_uint_32 i; for (i = 0; i < row_width; i++) { *(--dp) = (png_byte)(255 - *(--sp)); *(--dp) = (png_byte)(255 - *(--sp)); /* This does nothing: *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); We can replace it with: */ sp-=6; dp=sp; } } } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { /* This inverts the alpha channel in GA */ if (row_info->bit_depth == 8) { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_uint_32 i; for (i = 0; i < row_width; i++) { *(--dp) = (png_byte)(255 - *(--sp)); *(--dp) = *(--sp); } } /* This inverts the alpha channel in GGAA */ else { png_bytep sp = row + row_info->rowbytes; png_bytep dp = sp; png_uint_32 i; for (i = 0; i < row_width; i++) { *(--dp) = (png_byte)(255 - *(--sp)); *(--dp) = (png_byte)(255 - *(--sp)); /* *(--dp) = *(--sp); *(--dp) = *(--sp); */ sp-=2; dp=sp; } } } } } #endif #if defined(PNG_READ_FILLER_SUPPORTED) /* Add filler channel if we have RGB color */ void /* PRIVATE */ png_do_read_filler(png_row_infop row_info, png_bytep row, png_uint_32 filler, png_uint_32 flags) { png_uint_32 i; png_uint_32 row_width = row_info->width; png_byte hi_filler = (png_byte)((filler>>8) & 0xff); png_byte lo_filler = (png_byte)(filler & 0xff); png_debug(1, "in png_do_read_filler\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif row_info->color_type == PNG_COLOR_TYPE_GRAY) { if(row_info->bit_depth == 8) { /* This changes the data from G to GX */ if (flags & PNG_FLAG_FILLER_AFTER) { png_bytep sp = row + (png_size_t)row_width; png_bytep dp = sp + (png_size_t)row_width; for (i = 1; i < row_width; i++) { *(--dp) = lo_filler; *(--dp) = *(--sp); } *(--dp) = lo_filler; row_info->channels = 2; row_info->pixel_depth = 16; row_info->rowbytes = row_width * 2; } /* This changes the data from G to XG */ else { png_bytep sp = row + (png_size_t)row_width; png_bytep dp = sp + (png_size_t)row_width; for (i = 0; i < row_width; i++) { *(--dp) = *(--sp); *(--dp) = lo_filler; } row_info->channels = 2; row_info->pixel_depth = 16; row_info->rowbytes = row_width * 2; } } else if(row_info->bit_depth == 16) { /* This changes the data from GG to GGXX */ if (flags & PNG_FLAG_FILLER_AFTER) { png_bytep sp = row + (png_size_t)row_width; png_bytep dp = sp + (png_size_t)row_width; for (i = 1; i < row_width; i++) { *(--dp) = hi_filler; *(--dp) = lo_filler; *(--dp) = *(--sp); *(--dp) = *(--sp); } *(--dp) = hi_filler; *(--dp) = lo_filler; row_info->channels = 2; row_info->pixel_depth = 32; row_info->rowbytes = row_width * 4; } /* This changes the data from GG to XXGG */ else { png_bytep sp = row + (png_size_t)row_width; png_bytep dp = sp + (png_size_t)row_width; for (i = 0; i < row_width; i++) { *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = hi_filler; *(--dp) = lo_filler; } row_info->channels = 2; row_info->pixel_depth = 32; row_info->rowbytes = row_width * 4; } } } /* COLOR_TYPE == GRAY */ else if (row_info->color_type == PNG_COLOR_TYPE_RGB) { if(row_info->bit_depth == 8) { /* This changes the data from RGB to RGBX */ if (flags & PNG_FLAG_FILLER_AFTER) { png_bytep sp = row + (png_size_t)row_width * 3; png_bytep dp = sp + (png_size_t)row_width; for (i = 1; i < row_width; i++) { *(--dp) = lo_filler; *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); } *(--dp) = lo_filler; row_info->channels = 4; row_info->pixel_depth = 32; row_info->rowbytes = row_width * 4; } /* This changes the data from RGB to XRGB */ else { png_bytep sp = row + (png_size_t)row_width * 3; png_bytep dp = sp + (png_size_t)row_width; for (i = 0; i < row_width; i++) { *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = lo_filler; } row_info->channels = 4; row_info->pixel_depth = 32; row_info->rowbytes = row_width * 4; } } else if(row_info->bit_depth == 16) { /* This changes the data from RRGGBB to RRGGBBXX */ if (flags & PNG_FLAG_FILLER_AFTER) { png_bytep sp = row + (png_size_t)row_width * 3; png_bytep dp = sp + (png_size_t)row_width; for (i = 1; i < row_width; i++) { *(--dp) = hi_filler; *(--dp) = lo_filler; *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); } *(--dp) = hi_filler; *(--dp) = lo_filler; row_info->channels = 4; row_info->pixel_depth = 64; row_info->rowbytes = row_width * 8; } /* This changes the data from RRGGBB to XXRRGGBB */ else { png_bytep sp = row + (png_size_t)row_width * 3; png_bytep dp = sp + (png_size_t)row_width; for (i = 0; i < row_width; i++) { *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = *(--sp); *(--dp) = hi_filler; *(--dp) = lo_filler; } row_info->channels = 4; row_info->pixel_depth = 64; row_info->rowbytes = row_width * 8; } } } /* COLOR_TYPE == RGB */ } #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) /* expand grayscale files to RGB, with or without alpha */ void /* PRIVATE */ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) { png_uint_32 i; png_uint_32 row_width = row_info->width; png_debug(1, "in png_do_gray_to_rgb\n"); if (row_info->bit_depth >= 8 && #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif !(row_info->color_type & PNG_COLOR_MASK_COLOR)) { if (row_info->color_type == PNG_COLOR_TYPE_GRAY) { if (row_info->bit_depth == 8) { png_bytep sp = row + (png_size_t)row_width - 1; png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 0; i < row_width; i++) { *(dp--) = *sp; *(dp--) = *sp; *(dp--) = *(sp--); } } else { png_bytep sp = row + (png_size_t)row_width * 2 - 1; png_bytep dp = sp + (png_size_t)row_width * 4; for (i = 0; i < row_width; i++) { *(dp--) = *sp; *(dp--) = *(sp - 1); *(dp--) = *sp; *(dp--) = *(sp - 1); *(dp--) = *(sp--); *(dp--) = *(sp--); } } } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { if (row_info->bit_depth == 8) { png_bytep sp = row + (png_size_t)row_width * 2 - 1; png_bytep dp = sp + (png_size_t)row_width * 2; for (i = 0; i < row_width; i++) { *(dp--) = *(sp--); *(dp--) = *sp; *(dp--) = *sp; *(dp--) = *(sp--); } } else { png_bytep sp = row + (png_size_t)row_width * 4 - 1; png_bytep dp = sp + (png_size_t)row_width * 4; for (i = 0; i < row_width; i++) { *(dp--) = *(sp--); *(dp--) = *(sp--); *(dp--) = *sp; *(dp--) = *(sp - 1); *(dp--) = *sp; *(dp--) = *(sp - 1); *(dp--) = *(sp--); *(dp--) = *(sp--); } } } row_info->channels += (png_byte)2; row_info->color_type |= PNG_COLOR_MASK_COLOR; row_info->pixel_depth = (png_byte)(row_info->channels * row_info->bit_depth); row_info->rowbytes = ((row_width * row_info->pixel_depth + 7) >> 3); } } #endif #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) /* reduce RGB files to grayscale, with or without alpha * using the equation given in Poynton's ColorFAQ at * * Copyright (c) 1998-01-04 Charles Poynton poynton@inforamp.net * * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B * * We approximate this with * * Y = 0.21268 * R + 0.7151 * G + 0.07217 * B * * which can be expressed with integers as * * Y = (6969 * R + 23434 * G + 2365 * B)/32768 * * The calculation is to be done in a linear colorspace. * * Other integer coefficents can be used via png_set_rgb_to_gray(). */ int /* PRIVATE */ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) { png_uint_32 i; png_uint_32 row_width = row_info->width; int rgb_error = 0; png_debug(1, "in png_do_rgb_to_gray\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif (row_info->color_type & PNG_COLOR_MASK_COLOR)) { png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; png_uint_32 bc = png_ptr->rgb_to_gray_blue_coeff; if (row_info->color_type == PNG_COLOR_TYPE_RGB) { if (row_info->bit_depth == 8) { #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) { png_bytep sp = row; png_bytep dp = row; for (i = 0; i < row_width; i++) { png_byte red = png_ptr->gamma_to_1[*(sp++)]; png_byte green = png_ptr->gamma_to_1[*(sp++)]; png_byte blue = png_ptr->gamma_to_1[*(sp++)]; if(red != green || red != blue) { rgb_error |= 1; *(dp++) = png_ptr->gamma_from_1[ (rc*red+gc*green+bc*blue)>>15]; } else *(dp++) = *(sp-1); } } else #endif { png_bytep sp = row; png_bytep dp = row; for (i = 0; i < row_width; i++) { png_byte red = *(sp++); png_byte green = *(sp++); png_byte blue = *(sp++); if(red != green || red != blue) { rgb_error |= 1; *(dp++) = (png_byte)((rc*red+gc*green+bc*blue)>>15); } else *(dp++) = *(sp-1); } } } else /* RGB bit_depth == 16 */ { #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->gamma_16_to_1 != NULL && png_ptr->gamma_16_from_1 != NULL) { png_bytep sp = row; png_bytep dp = row; for (i = 0; i < row_width; i++) { png_uint_16 red, green, blue, w; red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; if(red == green && red == blue) w = red; else { png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> png_ptr->gamma_shift][red>>8]; png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> png_ptr->gamma_shift][green>>8]; png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> png_ptr->gamma_shift][blue>>8]; png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1 + bc*blue_1)>>15); w = png_ptr->gamma_16_from_1[(gray16&0xff) >> png_ptr->gamma_shift][gray16 >> 8]; rgb_error |= 1; } *(dp++) = (png_byte)((w>>8) & 0xff); *(dp++) = (png_byte)(w & 0xff); } } else #endif { png_bytep sp = row; png_bytep dp = row; for (i = 0; i < row_width; i++) { png_uint_16 red, green, blue, gray16; red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; if(red != green || red != blue) rgb_error |= 1; gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); *(dp++) = (png_byte)((gray16>>8) & 0xff); *(dp++) = (png_byte)(gray16 & 0xff); } } } } if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { if (row_info->bit_depth == 8) { #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) { png_bytep sp = row; png_bytep dp = row; for (i = 0; i < row_width; i++) { png_byte red = png_ptr->gamma_to_1[*(sp++)]; png_byte green = png_ptr->gamma_to_1[*(sp++)]; png_byte blue = png_ptr->gamma_to_1[*(sp++)]; if(red != green || red != blue) rgb_error |= 1; *(dp++) = png_ptr->gamma_from_1 [(rc*red + gc*green + bc*blue)>>15]; *(dp++) = *(sp++); /* alpha */ } } else #endif { png_bytep sp = row; png_bytep dp = row; for (i = 0; i < row_width; i++) { png_byte red = *(sp++); png_byte green = *(sp++); png_byte blue = *(sp++); if(red != green || red != blue) rgb_error |= 1; *(dp++) = (png_byte)((gc*red + gc*green + bc*blue)>>8); *(dp++) = *(sp++); /* alpha */ } } } else /* RGBA bit_depth == 16 */ { #if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->gamma_16_to_1 != NULL && png_ptr->gamma_16_from_1 != NULL) { png_bytep sp = row; png_bytep dp = row; for (i = 0; i < row_width; i++) { png_uint_16 red, green, blue, w; red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; if(red == green && red == blue) w = red; else { png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> png_ptr->gamma_shift][red>>8]; png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> png_ptr->gamma_shift][green>>8]; png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> png_ptr->gamma_shift][blue>>8]; png_uint_16 gray16 = (png_uint_16)((rc * red_1 + gc * green_1 + bc * blue_1)>>15); w = png_ptr->gamma_16_from_1[(gray16&0xff) >> png_ptr->gamma_shift][gray16 >> 8]; rgb_error |= 1; } *(dp++) = (png_byte)((w>>8) & 0xff); *(dp++) = (png_byte)(w & 0xff); *(dp++) = *(sp++); /* alpha */ *(dp++) = *(sp++); } } else #endif { png_bytep sp = row; png_bytep dp = row; for (i = 0; i < row_width; i++) { png_uint_16 red, green, blue, gray16; red = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; green = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; blue = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; if(red != green || red != blue) rgb_error |= 1; gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); *(dp++) = (png_byte)((gray16>>8) & 0xff); *(dp++) = (png_byte)(gray16 & 0xff); *(dp++) = *(sp++); /* alpha */ *(dp++) = *(sp++); } } } } row_info->channels -= (png_byte)2; row_info->color_type &= ~PNG_COLOR_MASK_COLOR; row_info->pixel_depth = (png_byte)(row_info->channels * row_info->bit_depth); row_info->rowbytes = ((row_width * row_info->pixel_depth + 7) >> 3); } return rgb_error; } #endif /* Build a grayscale palette. Palette is assumed to be 1 << bit_depth * large of png_color. This lets grayscale images be treated as * paletted. Most useful for gamma correction and simplification * of code. */ void PNGAPI png_build_grayscale_palette(int bit_depth, png_colorp palette) { int num_palette; int color_inc; int i; int v; png_debug(1, "in png_do_build_grayscale_palette\n"); if (palette == NULL) return; switch (bit_depth) { case 1: num_palette = 2; color_inc = 0xff; break; case 2: num_palette = 4; color_inc = 0x55; break; case 4: num_palette = 16; color_inc = 0x11; break; case 8: num_palette = 256; color_inc = 1; break; default: num_palette = 0; color_inc = 0; break; } for (i = 0, v = 0; i < num_palette; i++, v += color_inc) { palette[i].red = (png_byte)v; palette[i].green = (png_byte)v; palette[i].blue = (png_byte)v; } } /* This function is currently unused. Do we really need it? */ #if defined(PNG_READ_DITHER_SUPPORTED) && defined(PNG_CORRECT_PALETTE_SUPPORTED) void /* PRIVATE */ png_correct_palette(png_structp png_ptr, png_colorp palette, int num_palette) { png_debug(1, "in png_correct_palette\n"); #if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND)) { png_color back, back_1; if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) { back.red = png_ptr->gamma_table[png_ptr->background.red]; back.green = png_ptr->gamma_table[png_ptr->background.green]; back.blue = png_ptr->gamma_table[png_ptr->background.blue]; back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; } else { double g; g = 1.0 / (png_ptr->background_gamma * png_ptr->screen_gamma); if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_SCREEN || fabs(g - 1.0) < PNG_GAMMA_THRESHOLD) { back.red = png_ptr->background.red; back.green = png_ptr->background.green; back.blue = png_ptr->background.blue; } else { back.red = (png_byte)(pow((double)png_ptr->background.red/255, g) * 255.0 + 0.5); back.green = (png_byte)(pow((double)png_ptr->background.green/255, g) * 255.0 + 0.5); back.blue = (png_byte)(pow((double)png_ptr->background.blue/255, g) * 255.0 + 0.5); } g = 1.0 / png_ptr->background_gamma; back_1.red = (png_byte)(pow((double)png_ptr->background.red/255, g) * 255.0 + 0.5); back_1.green = (png_byte)(pow((double)png_ptr->background.green/255, g) * 255.0 + 0.5); back_1.blue = (png_byte)(pow((double)png_ptr->background.blue/255, g) * 255.0 + 0.5); } if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { png_uint_32 i; for (i = 0; i < (png_uint_32)num_palette; i++) { if (i < png_ptr->num_trans && png_ptr->trans[i] == 0) { palette[i] = back; } else if (i < png_ptr->num_trans && png_ptr->trans[i] != 0xff) { png_byte v, w; v = png_ptr->gamma_to_1[png_ptr->palette[i].red]; png_composite(w, v, png_ptr->trans[i], back_1.red); palette[i].red = png_ptr->gamma_from_1[w]; v = png_ptr->gamma_to_1[png_ptr->palette[i].green]; png_composite(w, v, png_ptr->trans[i], back_1.green); palette[i].green = png_ptr->gamma_from_1[w]; v = png_ptr->gamma_to_1[png_ptr->palette[i].blue]; png_composite(w, v, png_ptr->trans[i], back_1.blue); palette[i].blue = png_ptr->gamma_from_1[w]; } else { palette[i].red = png_ptr->gamma_table[palette[i].red]; palette[i].green = png_ptr->gamma_table[palette[i].green]; palette[i].blue = png_ptr->gamma_table[palette[i].blue]; } } } else { int i; for (i = 0; i < num_palette; i++) { if (palette[i].red == (png_byte)png_ptr->trans_values.gray) { palette[i] = back; } else { palette[i].red = png_ptr->gamma_table[palette[i].red]; palette[i].green = png_ptr->gamma_table[palette[i].green]; palette[i].blue = png_ptr->gamma_table[palette[i].blue]; } } } } else #endif #if defined(PNG_READ_GAMMA_SUPPORTED) if (png_ptr->transformations & PNG_GAMMA) { int i; for (i = 0; i < num_palette; i++) { palette[i].red = png_ptr->gamma_table[palette[i].red]; palette[i].green = png_ptr->gamma_table[palette[i].green]; palette[i].blue = png_ptr->gamma_table[palette[i].blue]; } } #if defined(PNG_READ_BACKGROUND_SUPPORTED) else #endif #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) if (png_ptr->transformations & PNG_BACKGROUND) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { png_color back; back.red = (png_byte)png_ptr->background.red; back.green = (png_byte)png_ptr->background.green; back.blue = (png_byte)png_ptr->background.blue; for (i = 0; i < (int)png_ptr->num_trans; i++) { if (png_ptr->trans[i] == 0) { palette[i].red = back.red; palette[i].green = back.green; palette[i].blue = back.blue; } else if (png_ptr->trans[i] != 0xff) { png_composite(palette[i].red, png_ptr->palette[i].red, png_ptr->trans[i], back.red); png_composite(palette[i].green, png_ptr->palette[i].green, png_ptr->trans[i], back.green); png_composite(palette[i].blue, png_ptr->palette[i].blue, png_ptr->trans[i], back.blue); } } } else /* assume grayscale palette (what else could it be?) */ { int i; for (i = 0; i < num_palette; i++) { if (i == (png_byte)png_ptr->trans_values.gray) { palette[i].red = (png_byte)png_ptr->background.red; palette[i].green = (png_byte)png_ptr->background.green; palette[i].blue = (png_byte)png_ptr->background.blue; } } } } #endif } #endif #if defined(PNG_READ_BACKGROUND_SUPPORTED) /* Replace any alpha or transparency with the supplied background color. * "background" is already in the screen gamma, while "background_1" is * at a gamma of 1.0. Paletted files have already been taken care of. */ void /* PRIVATE */ png_do_background(png_row_infop row_info, png_bytep row, png_color_16p trans_values, png_color_16p background #if defined(PNG_READ_GAMMA_SUPPORTED) , png_color_16p background_1, png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, png_uint_16pp gamma_16_to_1, int gamma_shift #endif ) { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width=row_info->width; int shift; png_debug(1, "in png_do_background\n"); if (background != NULL && #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif (!(row_info->color_type & PNG_COLOR_MASK_ALPHA) || (row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_values))) { switch (row_info->color_type) { case PNG_COLOR_TYPE_GRAY: { switch (row_info->bit_depth) { case 1: { sp = row; shift = 7; for (i = 0; i < row_width; i++) { if ((png_uint_16)((*sp >> shift) & 0x01) == trans_values->gray) { *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } if (!shift) { shift = 7; sp++; } else shift--; } break; } case 2: { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_table != NULL) { sp = row; shift = 6; for (i = 0; i < row_width; i++) { if ((png_uint_16)((*sp >> shift) & 0x03) == trans_values->gray) { *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } else { png_byte p = (png_byte)((*sp >> shift) & 0x03); png_byte g = (png_byte)((gamma_table [p | (p << 2) | (p << 4) | (p << 6)] >> 6) & 0x03); *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *sp |= (png_byte)(g << shift); } if (!shift) { shift = 6; sp++; } else shift -= 2; } } else #endif { sp = row; shift = 6; for (i = 0; i < row_width; i++) { if ((png_uint_16)((*sp >> shift) & 0x03) == trans_values->gray) { *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } if (!shift) { shift = 6; sp++; } else shift -= 2; } } break; } case 4: { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_table != NULL) { sp = row; shift = 4; for (i = 0; i < row_width; i++) { if ((png_uint_16)((*sp >> shift) & 0x0f) == trans_values->gray) { *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } else { png_byte p = (png_byte)((*sp >> shift) & 0x0f); png_byte g = (png_byte)((gamma_table[p | (p << 4)] >> 4) & 0x0f); *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *sp |= (png_byte)(g << shift); } if (!shift) { shift = 4; sp++; } else shift -= 4; } } else #endif { sp = row; shift = 4; for (i = 0; i < row_width; i++) { if ((png_uint_16)((*sp >> shift) & 0x0f) == trans_values->gray) { *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *sp |= (png_byte)(background->gray << shift); } if (!shift) { shift = 4; sp++; } else shift -= 4; } } break; } case 8: { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_table != NULL) { sp = row; for (i = 0; i < row_width; i++, sp++) { if (*sp == trans_values->gray) { *sp = (png_byte)background->gray; } else { *sp = gamma_table[*sp]; } } } else #endif { sp = row; for (i = 0; i < row_width; i++, sp++) { if (*sp == trans_values->gray) { *sp = (png_byte)background->gray; } } } break; } case 16: { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_16 != NULL) { sp = row; for (i = 0; i < row_width; i++, sp += 2) { png_uint_16 v; v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); if (v == trans_values->gray) { /* background is already in screen gamma */ *sp = (png_byte)((background->gray >> 8) & 0xff); *(sp + 1) = (png_byte)(background->gray & 0xff); } else { v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); } } } else #endif { sp = row; for (i = 0; i < row_width; i++, sp += 2) { png_uint_16 v; v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); if (v == trans_values->gray) { *sp = (png_byte)((background->gray >> 8) & 0xff); *(sp + 1) = (png_byte)(background->gray & 0xff); } } } break; } } break; } case PNG_COLOR_TYPE_RGB: { if (row_info->bit_depth == 8) { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_table != NULL) { sp = row; for (i = 0; i < row_width; i++, sp += 3) { if (*sp == trans_values->red && *(sp + 1) == trans_values->green && *(sp + 2) == trans_values->blue) { *sp = (png_byte)background->red; *(sp + 1) = (png_byte)background->green; *(sp + 2) = (png_byte)background->blue; } else { *sp = gamma_table[*sp]; *(sp + 1) = gamma_table[*(sp + 1)]; *(sp + 2) = gamma_table[*(sp + 2)]; } } } else #endif { sp = row; for (i = 0; i < row_width; i++, sp += 3) { if (*sp == trans_values->red && *(sp + 1) == trans_values->green && *(sp + 2) == trans_values->blue) { *sp = (png_byte)background->red; *(sp + 1) = (png_byte)background->green; *(sp + 2) = (png_byte)background->blue; } } } } else /* if (row_info->bit_depth == 16) */ { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_16 != NULL) { sp = row; for (i = 0; i < row_width; i++, sp += 6) { png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); if (r == trans_values->red && g == trans_values->green && b == trans_values->blue) { /* background is already in screen gamma */ *sp = (png_byte)((background->red >> 8) & 0xff); *(sp + 1) = (png_byte)(background->red & 0xff); *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); *(sp + 3) = (png_byte)(background->green & 0xff); *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); *(sp + 5) = (png_byte)(background->blue & 0xff); } else { png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; *(sp + 2) = (png_byte)((v >> 8) & 0xff); *(sp + 3) = (png_byte)(v & 0xff); v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; *(sp + 4) = (png_byte)((v >> 8) & 0xff); *(sp + 5) = (png_byte)(v & 0xff); } } } else #endif { sp = row; for (i = 0; i < row_width; i++, sp += 6) { png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp+1)); png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); if (r == trans_values->red && g == trans_values->green && b == trans_values->blue) { *sp = (png_byte)((background->red >> 8) & 0xff); *(sp + 1) = (png_byte)(background->red & 0xff); *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); *(sp + 3) = (png_byte)(background->green & 0xff); *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); *(sp + 5) = (png_byte)(background->blue & 0xff); } } } } break; } case PNG_COLOR_TYPE_GRAY_ALPHA: { if (row_info->bit_depth == 8) { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_to_1 != NULL && gamma_from_1 != NULL && gamma_table != NULL) { sp = row; dp = row; for (i = 0; i < row_width; i++, sp += 2, dp++) { png_uint_16 a = *(sp + 1); if (a == 0xff) { *dp = gamma_table[*sp]; } else if (a == 0) { /* background is already in screen gamma */ *dp = (png_byte)background->gray; } else { png_byte v, w; v = gamma_to_1[*sp]; png_composite(w, v, a, background_1->gray); *dp = gamma_from_1[w]; } } } else #endif { sp = row; dp = row; for (i = 0; i < row_width; i++, sp += 2, dp++) { png_byte a = *(sp + 1); if (a == 0xff) { *dp = *sp; } #if defined(PNG_READ_GAMMA_SUPPORTED) else if (a == 0) { *dp = (png_byte)background->gray; } else { png_composite(*dp, *sp, a, background_1->gray); } #else *dp = (png_byte)background->gray; #endif } } } else /* if (png_ptr->bit_depth == 16) */ { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_16 != NULL && gamma_16_from_1 != NULL && gamma_16_to_1 != NULL) { sp = row; dp = row; for (i = 0; i < row_width; i++, sp += 4, dp += 2) { png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); if (a == (png_uint_16)0xffff) { png_uint_16 v; v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; *dp = (png_byte)((v >> 8) & 0xff); *(dp + 1) = (png_byte)(v & 0xff); } #if defined(PNG_READ_GAMMA_SUPPORTED) else if (a == 0) #else else #endif { /* background is already in screen gamma */ *dp = (png_byte)((background->gray >> 8) & 0xff); *(dp + 1) = (png_byte)(background->gray & 0xff); } #if defined(PNG_READ_GAMMA_SUPPORTED) else { png_uint_16 g, v, w; g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; png_composite_16(v, g, a, background_1->gray); w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; *dp = (png_byte)((w >> 8) & 0xff); *(dp + 1) = (png_byte)(w & 0xff); } #endif } } else #endif { sp = row; dp = row; for (i = 0; i < row_width; i++, sp += 4, dp += 2) { png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); if (a == (png_uint_16)0xffff) { png_memcpy(dp, sp, 2); } #if defined(PNG_READ_GAMMA_SUPPORTED) else if (a == 0) #else else #endif { *dp = (png_byte)((background->gray >> 8) & 0xff); *(dp + 1) = (png_byte)(background->gray & 0xff); } #if defined(PNG_READ_GAMMA_SUPPORTED) else { png_uint_16 g, v; g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); png_composite_16(v, g, a, background_1->gray); *dp = (png_byte)((v >> 8) & 0xff); *(dp + 1) = (png_byte)(v & 0xff); } #endif } } } break; } case PNG_COLOR_TYPE_RGB_ALPHA: { if (row_info->bit_depth == 8) { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_to_1 != NULL && gamma_from_1 != NULL && gamma_table != NULL) { sp = row; dp = row; for (i = 0; i < row_width; i++, sp += 4, dp += 3) { png_byte a = *(sp + 3); if (a == 0xff) { *dp = gamma_table[*sp]; *(dp + 1) = gamma_table[*(sp + 1)]; *(dp + 2) = gamma_table[*(sp + 2)]; } else if (a == 0) { /* background is already in screen gamma */ *dp = (png_byte)background->red; *(dp + 1) = (png_byte)background->green; *(dp + 2) = (png_byte)background->blue; } else { png_byte v, w; v = gamma_to_1[*sp]; png_composite(w, v, a, background_1->red); *dp = gamma_from_1[w]; v = gamma_to_1[*(sp + 1)]; png_composite(w, v, a, background_1->green); *(dp + 1) = gamma_from_1[w]; v = gamma_to_1[*(sp + 2)]; png_composite(w, v, a, background_1->blue); *(dp + 2) = gamma_from_1[w]; } } } else #endif { sp = row; dp = row; for (i = 0; i < row_width; i++, sp += 4, dp += 3) { png_byte a = *(sp + 3); if (a == 0xff) { *dp = *sp; *(dp + 1) = *(sp + 1); *(dp + 2) = *(sp + 2); } else if (a == 0) { *dp = (png_byte)background->red; *(dp + 1) = (png_byte)background->green; *(dp + 2) = (png_byte)background->blue; } else { png_composite(*dp, *sp, a, background->red); png_composite(*(dp + 1), *(sp + 1), a, background->green); png_composite(*(dp + 2), *(sp + 2), a, background->blue); } } } } else /* if (row_info->bit_depth == 16) */ { #if defined(PNG_READ_GAMMA_SUPPORTED) if (gamma_16 != NULL && gamma_16_from_1 != NULL && gamma_16_to_1 != NULL) { sp = row; dp = row; for (i = 0; i < row_width; i++, sp += 8, dp += 6) { png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) << 8) + (png_uint_16)(*(sp + 7))); if (a == (png_uint_16)0xffff) { png_uint_16 v; v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; *dp = (png_byte)((v >> 8) & 0xff); *(dp + 1) = (png_byte)(v & 0xff); v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; *(dp + 2) = (png_byte)((v >> 8) & 0xff); *(dp + 3) = (png_byte)(v & 0xff); v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; *(dp + 4) = (png_byte)((v >> 8) & 0xff); *(dp + 5) = (png_byte)(v & 0xff); } else if (a == 0) { /* background is already in screen gamma */ *dp = (png_byte)((background->red >> 8) & 0xff); *(dp + 1) = (png_byte)(background->red & 0xff); *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); *(dp + 3) = (png_byte)(background->green & 0xff); *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); *(dp + 5) = (png_byte)(background->blue & 0xff); } else { png_uint_16 v, w, x; v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; png_composite_16(w, v, a, background_1->red); x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; *dp = (png_byte)((x >> 8) & 0xff); *(dp + 1) = (png_byte)(x & 0xff); v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; png_composite_16(w, v, a, background_1->green); x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; *(dp + 2) = (png_byte)((x >> 8) & 0xff); *(dp + 3) = (png_byte)(x & 0xff); v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; png_composite_16(w, v, a, background_1->blue); x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8]; *(dp + 4) = (png_byte)((x >> 8) & 0xff); *(dp + 5) = (png_byte)(x & 0xff); } } } else #endif { sp = row; dp = row; for (i = 0; i < row_width; i++, sp += 8, dp += 6) { png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) << 8) + (png_uint_16)(*(sp + 7))); if (a == (png_uint_16)0xffff) { png_memcpy(dp, sp, 6); } else if (a == 0) { *dp = (png_byte)((background->red >> 8) & 0xff); *(dp + 1) = (png_byte)(background->red & 0xff); *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); *(dp + 3) = (png_byte)(background->green & 0xff); *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); *(dp + 5) = (png_byte)(background->blue & 0xff); } else { png_uint_16 v; png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) + *(sp + 3)); png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) + *(sp + 5)); png_composite_16(v, r, a, background->red); *dp = (png_byte)((v >> 8) & 0xff); *(dp + 1) = (png_byte)(v & 0xff); png_composite_16(v, g, a, background->green); *(dp + 2) = (png_byte)((v >> 8) & 0xff); *(dp + 3) = (png_byte)(v & 0xff); png_composite_16(v, b, a, background->blue); *(dp + 4) = (png_byte)((v >> 8) & 0xff); *(dp + 5) = (png_byte)(v & 0xff); } } } } break; } } if (row_info->color_type & PNG_COLOR_MASK_ALPHA) { row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; row_info->channels--; row_info->pixel_depth = (png_byte)(row_info->channels * row_info->bit_depth); row_info->rowbytes = ((row_width * row_info->pixel_depth + 7) >> 3); } } } #endif #if defined(PNG_READ_GAMMA_SUPPORTED) /* Gamma correct the image, avoiding the alpha channel. Make sure * you do this after you deal with the transparency issue on grayscale * or RGB images. If your bit depth is 8, use gamma_table, if it * is 16, use gamma_16_table and gamma_shift. Build these with * build_gamma_table(). */ void /* PRIVATE */ png_do_gamma(png_row_infop row_info, png_bytep row, png_bytep gamma_table, png_uint_16pp gamma_16_table, int gamma_shift) { png_bytep sp; png_uint_32 i; png_uint_32 row_width=row_info->width; png_debug(1, "in png_do_gamma\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif ((row_info->bit_depth <= 8 && gamma_table != NULL) || (row_info->bit_depth == 16 && gamma_16_table != NULL))) { switch (row_info->color_type) { case PNG_COLOR_TYPE_RGB: { if (row_info->bit_depth == 8) { sp = row; for (i = 0; i < row_width; i++) { *sp = gamma_table[*sp]; sp++; *sp = gamma_table[*sp]; sp++; *sp = gamma_table[*sp]; sp++; } } else /* if (row_info->bit_depth == 16) */ { sp = row; for (i = 0; i < row_width; i++) { png_uint_16 v; v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; } } break; } case PNG_COLOR_TYPE_RGB_ALPHA: { if (row_info->bit_depth == 8) { sp = row; for (i = 0; i < row_width; i++) { *sp = gamma_table[*sp]; sp++; *sp = gamma_table[*sp]; sp++; *sp = gamma_table[*sp]; sp++; sp++; } } else /* if (row_info->bit_depth == 16) */ { sp = row; for (i = 0; i < row_width; i++) { png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 4; } } break; } case PNG_COLOR_TYPE_GRAY_ALPHA: { if (row_info->bit_depth == 8) { sp = row; for (i = 0; i < row_width; i++) { *sp = gamma_table[*sp]; sp += 2; } } else /* if (row_info->bit_depth == 16) */ { sp = row; for (i = 0; i < row_width; i++) { png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 4; } } break; } case PNG_COLOR_TYPE_GRAY: { if (row_info->bit_depth == 2) { sp = row; for (i = 0; i < row_width; i += 4) { int a = *sp & 0xc0; int b = *sp & 0x30; int c = *sp & 0x0c; int d = *sp & 0x03; *sp = (png_byte)( ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)]) ) & 0xc0)| ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)| ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)| ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) )); sp++; } } if (row_info->bit_depth == 4) { sp = row; for (i = 0; i < row_width; i += 2) { int msb = *sp & 0xf0; int lsb = *sp & 0x0f; *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0) | (((int)gamma_table[(lsb << 4) | lsb]) >> 4)); sp++; } } else if (row_info->bit_depth == 8) { sp = row; for (i = 0; i < row_width; i++) { *sp = gamma_table[*sp]; sp++; } } else if (row_info->bit_depth == 16) { sp = row; for (i = 0; i < row_width; i++) { png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; *sp = (png_byte)((v >> 8) & 0xff); *(sp + 1) = (png_byte)(v & 0xff); sp += 2; } } break; } } } } #endif #if defined(PNG_READ_EXPAND_SUPPORTED) /* Expands a palette row to an RGB or RGBA row depending * upon whether you supply trans and num_trans. */ void /* PRIVATE */ png_do_expand_palette(png_row_infop row_info, png_bytep row, png_colorp palette, png_bytep trans, int num_trans) { int shift, value; png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width=row_info->width; png_debug(1, "in png_do_expand_palette\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif row_info->color_type == PNG_COLOR_TYPE_PALETTE) { if (row_info->bit_depth < 8) { switch (row_info->bit_depth) { case 1: { sp = row + (png_size_t)((row_width - 1) >> 3); dp = row + (png_size_t)row_width - 1; shift = 7 - (int)((row_width + 7) & 0x07); for (i = 0; i < row_width; i++) { if ((*sp >> shift) & 0x01) *dp = 1; else *dp = 0; if (shift == 7) { shift = 0; sp--; } else shift++; dp--; } break; } case 2: { sp = row + (png_size_t)((row_width - 1) >> 2); dp = row + (png_size_t)row_width - 1; shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); for (i = 0; i < row_width; i++) { value = (*sp >> shift) & 0x03; *dp = (png_byte)value; if (shift == 6) { shift = 0; sp--; } else shift += 2; dp--; } break; } case 4: { sp = row + (png_size_t)((row_width - 1) >> 1); dp = row + (png_size_t)row_width - 1; shift = (int)((row_width & 0x01) << 2); for (i = 0; i < row_width; i++) { value = (*sp >> shift) & 0x0f; *dp = (png_byte)value; if (shift == 4) { shift = 0; sp--; } else shift += 4; dp--; } break; } } row_info->bit_depth = 8; row_info->pixel_depth = 8; row_info->rowbytes = row_width; } switch (row_info->bit_depth) { case 8: { if (trans != NULL) { sp = row + (png_size_t)row_width - 1; dp = row + (png_size_t)(row_width << 2) - 1; for (i = 0; i < row_width; i++) { if ((int)(*sp) >= num_trans) *dp-- = 0xff; else *dp-- = trans[*sp]; *dp-- = palette[*sp].blue; *dp-- = palette[*sp].green; *dp-- = palette[*sp].red; sp--; } row_info->bit_depth = 8; row_info->pixel_depth = 32; row_info->rowbytes = row_width * 4; row_info->color_type = 6; row_info->channels = 4; } else { sp = row + (png_size_t)row_width - 1; dp = row + (png_size_t)(row_width * 3) - 1; for (i = 0; i < row_width; i++) { *dp-- = palette[*sp].blue; *dp-- = palette[*sp].green; *dp-- = palette[*sp].red; sp--; } row_info->bit_depth = 8; row_info->pixel_depth = 24; row_info->rowbytes = row_width * 3; row_info->color_type = 2; row_info->channels = 3; } break; } } } } /* If the bit depth < 8, it is expanded to 8. Also, if the * transparency value is supplied, an alpha channel is built. */ void /* PRIVATE */ png_do_expand(png_row_infop row_info, png_bytep row, png_color_16p trans_value) { int shift, value; png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width=row_info->width; png_debug(1, "in png_do_expand\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL) #endif { if (row_info->color_type == PNG_COLOR_TYPE_GRAY) { png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0); if (row_info->bit_depth < 8) { switch (row_info->bit_depth) { case 1: { gray = (png_uint_16)(gray*0xff); sp = row + (png_size_t)((row_width - 1) >> 3); dp = row + (png_size_t)row_width - 1; shift = 7 - (int)((row_width + 7) & 0x07); for (i = 0; i < row_width; i++) { if ((*sp >> shift) & 0x01) *dp = 0xff; else *dp = 0; if (shift == 7) { shift = 0; sp--; } else shift++; dp--; } break; } case 2: { gray = (png_uint_16)(gray*0x55); sp = row + (png_size_t)((row_width - 1) >> 2); dp = row + (png_size_t)row_width - 1; shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); for (i = 0; i < row_width; i++) { value = (*sp >> shift) & 0x03; *dp = (png_byte)(value | (value << 2) | (value << 4) | (value << 6)); if (shift == 6) { shift = 0; sp--; } else shift += 2; dp--; } break; } case 4: { gray = (png_uint_16)(gray*0x11); sp = row + (png_size_t)((row_width - 1) >> 1); dp = row + (png_size_t)row_width - 1; shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); for (i = 0; i < row_width; i++) { value = (*sp >> shift) & 0x0f; *dp = (png_byte)(value | (value << 4)); if (shift == 4) { shift = 0; sp--; } else shift = 4; dp--; } break; } } row_info->bit_depth = 8; row_info->pixel_depth = 8; row_info->rowbytes = row_width; } if (trans_value != NULL) { if (row_info->bit_depth == 8) { sp = row + (png_size_t)row_width - 1; dp = row + (png_size_t)(row_width << 1) - 1; for (i = 0; i < row_width; i++) { if (*sp == gray) *dp-- = 0; else *dp-- = 0xff; *dp-- = *sp--; } } else if (row_info->bit_depth == 16) { sp = row + row_info->rowbytes - 1; dp = row + (row_info->rowbytes << 1) - 1; for (i = 0; i < row_width; i++) { if (((png_uint_16)*(sp) | ((png_uint_16)*(sp - 1) << 8)) == gray) { *dp-- = 0; *dp-- = 0; } else { *dp-- = 0xff; *dp-- = 0xff; } *dp-- = *sp--; *dp-- = *sp--; } } row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; row_info->channels = 2; row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); row_info->rowbytes = ((row_width * row_info->pixel_depth) >> 3); } } else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_value) { if (row_info->bit_depth == 8) { sp = row + (png_size_t)row_info->rowbytes - 1; dp = row + (png_size_t)(row_width << 2) - 1; for (i = 0; i < row_width; i++) { if (*(sp - 2) == trans_value->red && *(sp - 1) == trans_value->green && *(sp - 0) == trans_value->blue) *dp-- = 0; else *dp-- = 0xff; *dp-- = *sp--; *dp-- = *sp--; *dp-- = *sp--; } } else if (row_info->bit_depth == 16) { sp = row + row_info->rowbytes - 1; dp = row + (png_size_t)(row_width << 3) - 1; for (i = 0; i < row_width; i++) { if ((((png_uint_16)*(sp - 4) | ((png_uint_16)*(sp - 5) << 8)) == trans_value->red) && (((png_uint_16)*(sp - 2) | ((png_uint_16)*(sp - 3) << 8)) == trans_value->green) && (((png_uint_16)*(sp - 0) | ((png_uint_16)*(sp - 1) << 8)) == trans_value->blue)) { *dp-- = 0; *dp-- = 0; } else { *dp-- = 0xff; *dp-- = 0xff; } *dp-- = *sp--; *dp-- = *sp--; *dp-- = *sp--; *dp-- = *sp--; *dp-- = *sp--; *dp-- = *sp--; } } row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; row_info->channels = 4; row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); row_info->rowbytes = ((row_width * row_info->pixel_depth) >> 3); } } } #endif #if defined(PNG_READ_DITHER_SUPPORTED) void /* PRIVATE */ png_do_dither(png_row_infop row_info, png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup) { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width=row_info->width; png_debug(1, "in png_do_dither\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL) #endif { if (row_info->color_type == PNG_COLOR_TYPE_RGB && palette_lookup && row_info->bit_depth == 8) { int r, g, b, p; sp = row; dp = row; for (i = 0; i < row_width; i++) { r = *sp++; g = *sp++; b = *sp++; /* this looks real messy, but the compiler will reduce it down to a reasonable formula. For example, with 5 bits per color, we get: p = (((r >> 3) & 0x1f) << 10) | (((g >> 3) & 0x1f) << 5) | ((b >> 3) & 0x1f); */ p = (((r >> (8 - PNG_DITHER_RED_BITS)) & ((1 << PNG_DITHER_RED_BITS) - 1)) << (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | (((g >> (8 - PNG_DITHER_GREEN_BITS)) & ((1 << PNG_DITHER_GREEN_BITS) - 1)) << (PNG_DITHER_BLUE_BITS)) | ((b >> (8 - PNG_DITHER_BLUE_BITS)) & ((1 << PNG_DITHER_BLUE_BITS) - 1)); *dp++ = palette_lookup[p]; } row_info->color_type = PNG_COLOR_TYPE_PALETTE; row_info->channels = 1; row_info->pixel_depth = row_info->bit_depth; row_info->rowbytes = ((row_width * row_info->pixel_depth + 7) >> 3); } else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && palette_lookup != NULL && row_info->bit_depth == 8) { int r, g, b, p; sp = row; dp = row; for (i = 0; i < row_width; i++) { r = *sp++; g = *sp++; b = *sp++; sp++; p = (((r >> (8 - PNG_DITHER_RED_BITS)) & ((1 << PNG_DITHER_RED_BITS) - 1)) << (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | (((g >> (8 - PNG_DITHER_GREEN_BITS)) & ((1 << PNG_DITHER_GREEN_BITS) - 1)) << (PNG_DITHER_BLUE_BITS)) | ((b >> (8 - PNG_DITHER_BLUE_BITS)) & ((1 << PNG_DITHER_BLUE_BITS) - 1)); *dp++ = palette_lookup[p]; } row_info->color_type = PNG_COLOR_TYPE_PALETTE; row_info->channels = 1; row_info->pixel_depth = row_info->bit_depth; row_info->rowbytes = ((row_width * row_info->pixel_depth + 7) >> 3); } else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && dither_lookup && row_info->bit_depth == 8) { sp = row; for (i = 0; i < row_width; i++, sp++) { *sp = dither_lookup[*sp]; } } } } #endif #ifdef PNG_FLOATING_POINT_SUPPORTED #if defined(PNG_READ_GAMMA_SUPPORTED) static int png_gamma_shift[] = {0x10, 0x21, 0x42, 0x84, 0x110, 0x248, 0x550, 0xff0}; /* We build the 8- or 16-bit gamma tables here. Note that for 16-bit * tables, we don't make a full table if we are reducing to 8-bit in * the future. Note also how the gamma_16 tables are segmented so that * we don't need to allocate > 64K chunks for a full 16-bit table. */ void /* PRIVATE */ png_build_gamma_table(png_structp png_ptr) { png_debug(1, "in png_build_gamma_table\n"); if(png_ptr->gamma != 0.0) { if (png_ptr->bit_depth <= 8) { int i; double g; if (png_ptr->screen_gamma > .000001) g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); else g = 1.0; png_ptr->gamma_table = (png_bytep)png_malloc(png_ptr, (png_uint_32)256); for (i = 0; i < 256; i++) { png_ptr->gamma_table[i] = (png_byte)(pow((double)i / 255.0, g) * 255.0 + .5); } #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY)) { g = 1.0 / (png_ptr->gamma); png_ptr->gamma_to_1 = (png_bytep)png_malloc(png_ptr, (png_uint_32)256); for (i = 0; i < 256; i++) { png_ptr->gamma_to_1[i] = (png_byte)(pow((double)i / 255.0, g) * 255.0 + .5); } png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr, (png_uint_32)256); if(png_ptr->screen_gamma > 0.000001) g = 1.0 / png_ptr->screen_gamma; else g = png_ptr->gamma; /* probably doing rgb_to_gray */ for (i = 0; i < 256; i++) { png_ptr->gamma_from_1[i] = (png_byte)(pow((double)i / 255.0, g) * 255.0 + .5); } } #endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ } else { double g; int i, j, shift, num; int sig_bit; png_uint_32 ig; if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) { sig_bit = (int)png_ptr->sig_bit.red; if ((int)png_ptr->sig_bit.green > sig_bit) sig_bit = png_ptr->sig_bit.green; if ((int)png_ptr->sig_bit.blue > sig_bit) sig_bit = png_ptr->sig_bit.blue; } else { sig_bit = (int)png_ptr->sig_bit.gray; } if (sig_bit > 0) shift = 16 - sig_bit; else shift = 0; if (png_ptr->transformations & PNG_16_TO_8) { if (shift < (16 - PNG_MAX_GAMMA_8)) shift = (16 - PNG_MAX_GAMMA_8); } if (shift > 8) shift = 8; if (shift < 0) shift = 0; png_ptr->gamma_shift = (png_byte)shift; num = (1 << (8 - shift)); if (png_ptr->screen_gamma > .000001) g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); else g = 1.0; png_ptr->gamma_16_table = (png_uint_16pp)png_malloc(png_ptr, (png_uint_32)(num * sizeof (png_uint_16p))); if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND)) { double fin, fout; png_uint_32 last, max; for (i = 0; i < num; i++) { png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, (png_uint_32)(256 * sizeof (png_uint_16))); } g = 1.0 / g; last = 0; for (i = 0; i < 256; i++) { fout = ((double)i + 0.5) / 256.0; fin = pow(fout, g); max = (png_uint_32)(fin * (double)((png_uint_32)num << 8)); while (last <= max) { png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] [(int)(last >> (8 - shift))] = (png_uint_16)( (png_uint_16)i | ((png_uint_16)i << 8)); last++; } } while (last < ((png_uint_32)num << 8)) { png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] [(int)(last >> (8 - shift))] = (png_uint_16)65535L; last++; } } else { for (i = 0; i < num; i++) { png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, (png_uint_32)(256 * sizeof (png_uint_16))); ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); for (j = 0; j < 256; j++) { png_ptr->gamma_16_table[i][j] = (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / 65535.0, g) * 65535.0 + .5); } } } #if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY)) { g = 1.0 / (png_ptr->gamma); png_ptr->gamma_16_to_1 = (png_uint_16pp)png_malloc(png_ptr, (png_uint_32)(num * sizeof (png_uint_16p ))); for (i = 0; i < num; i++) { png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr, (png_uint_32)(256 * sizeof (png_uint_16))); ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); for (j = 0; j < 256; j++) { png_ptr->gamma_16_to_1[i][j] = (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / 65535.0, g) * 65535.0 + .5); } } if(png_ptr->screen_gamma > 0.000001) g = 1.0 / png_ptr->screen_gamma; else g = png_ptr->gamma; /* probably doing rgb_to_gray */ png_ptr->gamma_16_from_1 = (png_uint_16pp)png_malloc(png_ptr, (png_uint_32)(num * sizeof (png_uint_16p))); for (i = 0; i < num; i++) { png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr, (png_uint_32)(256 * sizeof (png_uint_16))); ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); for (j = 0; j < 256; j++) { png_ptr->gamma_16_from_1[i][j] = (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / 65535.0, g) * 65535.0 + .5); } } } #endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ } } } #endif /* To do: install integer version of png_build_gamma_table here */ #endif #if defined(PNG_MNG_FEATURES_SUPPORTED) /* undoes intrapixel differencing */ void /* PRIVATE */ png_do_read_intrapixel(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_read_intrapixel\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif (row_info->color_type & PNG_COLOR_MASK_COLOR)) { int bytes_per_pixel; png_uint_32 row_width = row_info->width; if (row_info->bit_depth == 8) { png_bytep rp; png_uint_32 i; if (row_info->color_type == PNG_COLOR_TYPE_RGB) bytes_per_pixel = 3; else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) bytes_per_pixel = 4; else return; for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) { *(rp) = (png_byte)((256 + *rp + *(rp+1))&0xff); *(rp+2) = (png_byte)((256 + *(rp+2) + *(rp+1))&0xff); } } else if (row_info->bit_depth == 16) { png_bytep rp; png_uint_32 i; if (row_info->color_type == PNG_COLOR_TYPE_RGB) bytes_per_pixel = 6; else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) bytes_per_pixel = 8; else return; for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) { png_uint_32 s0=*(rp )<<8 | *(rp+1); png_uint_32 s1=*(rp+2)<<8 | *(rp+3); png_uint_32 s2=*(rp+4)<<8 | *(rp+5); png_uint_32 red=(65536+s0+s1)&0xffff; png_uint_32 blue=(65536+s2+s1)&0xffff; *(rp ) = (png_byte)((red>>8)&0xff); *(rp+1) = (png_byte)(red&0xff); *(rp+4) = (png_byte)((blue>>8)&0xff); *(rp+5) = (png_byte)(blue&0xff); } } } } #endif /* PNG_MNG_FEATURES_SUPPORTED */ gamera-3.3.3/src/libpng-1.2.5/pngrutil.c0000644000076500000000000025765110714675701016505 0ustar chriswheel /* pngrutil.c - utilities to read a PNG file * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This file contains routines that are only called from within * libpng itself during the course of reading an image. */ #define PNG_INTERNAL #include "png.h" #if defined(_WIN32_WCE) /* strtod() function is not supported on WindowsCE */ # ifdef PNG_FLOATING_POINT_SUPPORTED __inline double strtod(const char *nptr, char **endptr) { double result = 0; int len; wchar_t *str, *end; len = MultiByteToWideChar(CP_ACP, 0, nptr, -1, NULL, 0); str = (wchar_t *)malloc(len * sizeof(wchar_t)); if ( NULL != str ) { MultiByteToWideChar(CP_ACP, 0, nptr, -1, str, len); result = wcstod(str, &end); len = WideCharToMultiByte(CP_ACP, 0, end, -1, NULL, 0, NULL, NULL); *endptr = (char *)nptr + (png_strlen(nptr) - len + 1); free(str); } return result; } # endif #endif #ifndef PNG_READ_BIG_ENDIAN_SUPPORTED /* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ png_uint_32 /* PRIVATE */ png_get_uint_32(png_bytep buf) { png_uint_32 i = ((png_uint_32)(*buf) << 24) + ((png_uint_32)(*(buf + 1)) << 16) + ((png_uint_32)(*(buf + 2)) << 8) + (png_uint_32)(*(buf + 3)); return (i); } #if defined(PNG_READ_pCAL_SUPPORTED) || defined(PNG_READ_oFFs_SUPPORTED) /* Grab a signed 32-bit integer from a buffer in big-endian format. The * data is stored in the PNG file in two's complement format, and it is * assumed that the machine format for signed integers is the same. */ png_int_32 /* PRIVATE */ png_get_int_32(png_bytep buf) { png_int_32 i = ((png_int_32)(*buf) << 24) + ((png_int_32)(*(buf + 1)) << 16) + ((png_int_32)(*(buf + 2)) << 8) + (png_int_32)(*(buf + 3)); return (i); } #endif /* PNG_READ_pCAL_SUPPORTED */ /* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ png_uint_16 /* PRIVATE */ png_get_uint_16(png_bytep buf) { png_uint_16 i = (png_uint_16)(((png_uint_16)(*buf) << 8) + (png_uint_16)(*(buf + 1))); return (i); } #endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */ /* Read data, and (optionally) run it through the CRC. */ void /* PRIVATE */ png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length) { png_read_data(png_ptr, buf, length); png_calculate_crc(png_ptr, buf, length); } /* Optionally skip data and then check the CRC. Depending on whether we are reading a ancillary or critical chunk, and how the program has set things up, we may calculate the CRC on the data and print a message. Returns '1' if there was a CRC error, '0' otherwise. */ int /* PRIVATE */ png_crc_finish(png_structp png_ptr, png_uint_32 skip) { png_size_t i; png_size_t istop = png_ptr->zbuf_size; for (i = (png_size_t)skip; i > istop; i -= istop) { png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); } if (i) { png_crc_read(png_ptr, png_ptr->zbuf, i); } if (png_crc_error(png_ptr)) { if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */ !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) || (!(png_ptr->chunk_name[0] & 0x20) && /* Critical */ (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE))) { png_chunk_warning(png_ptr, "CRC error"); } else { png_chunk_error(png_ptr, "CRC error"); } return (1); } return (0); } /* Compare the CRC stored in the PNG file with that calculated by libpng from the data it has read thus far. */ int /* PRIVATE */ png_crc_error(png_structp png_ptr) { png_byte crc_bytes[4]; png_uint_32 crc; int need_crc = 1; if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ { if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) need_crc = 0; } else /* critical */ { if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) need_crc = 0; } png_read_data(png_ptr, crc_bytes, 4); if (need_crc) { crc = png_get_uint_32(crc_bytes); return ((int)(crc != png_ptr->crc)); } else return (0); } #if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \ defined(PNG_READ_iCCP_SUPPORTED) /* * Decompress trailing data in a chunk. The assumption is that chunkdata * points at an allocated area holding the contents of a chunk with a * trailing compressed part. What we get back is an allocated area * holding the original prefix part and an uncompressed version of the * trailing part (the malloc area passed in is freed). */ png_charp /* PRIVATE */ png_decompress_chunk(png_structp png_ptr, int comp_type, png_charp chunkdata, png_size_t chunklength, png_size_t prefix_size, png_size_t *newlength) { static char msg[] = "Error decoding compressed text"; png_charp text = NULL; png_size_t text_size; if (comp_type == PNG_COMPRESSION_TYPE_BASE) { int ret = Z_OK; png_ptr->zstream.next_in = (png_bytep)(chunkdata + prefix_size); png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; text_size = 0; text = NULL; while (png_ptr->zstream.avail_in) { ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); if (ret != Z_OK && ret != Z_STREAM_END) { if (png_ptr->zstream.msg != NULL) png_warning(png_ptr, png_ptr->zstream.msg); else png_warning(png_ptr, msg); inflateReset(&png_ptr->zstream); png_ptr->zstream.avail_in = 0; if (text == NULL) { text_size = prefix_size + sizeof(msg) + 1; text = (png_charp)png_malloc_warn(png_ptr, text_size); if (text == NULL) { png_free(png_ptr,chunkdata); png_error(png_ptr,"Not enough memory to decompress chunk"); } png_memcpy(text, chunkdata, prefix_size); } text[text_size - 1] = 0x00; /* Copy what we can of the error message into the text chunk */ text_size = (png_size_t)(chunklength - (text - chunkdata) - 1); text_size = sizeof(msg) > text_size ? text_size : sizeof(msg); png_memcpy(text + prefix_size, msg, text_size + 1); break; } if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END) { if (text == NULL) { text_size = prefix_size + png_ptr->zbuf_size - png_ptr->zstream.avail_out; text = (png_charp)png_malloc_warn(png_ptr, text_size + 1); if (text == NULL) { png_free(png_ptr,chunkdata); png_error(png_ptr,"Not enough memory to decompress chunk."); } png_memcpy(text + prefix_size, png_ptr->zbuf, text_size - prefix_size); png_memcpy(text, chunkdata, prefix_size); *(text + text_size) = 0x00; } else { png_charp tmp; tmp = text; text = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(text_size + png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1)); if (text == NULL) { png_free(png_ptr, tmp); png_free(png_ptr, chunkdata); png_error(png_ptr,"Not enough memory to decompress chunk.."); } png_memcpy(text, tmp, text_size); png_free(png_ptr, tmp); png_memcpy(text + text_size, png_ptr->zbuf, (png_ptr->zbuf_size - png_ptr->zstream.avail_out)); text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; *(text + text_size) = 0x00; } if (ret == Z_STREAM_END) break; else { png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } } } if (ret != Z_STREAM_END) { #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) char umsg[50]; if (ret == Z_BUF_ERROR) sprintf(umsg,"Buffer error in compressed datastream in %s chunk", png_ptr->chunk_name); else if (ret == Z_DATA_ERROR) sprintf(umsg,"Data error in compressed datastream in %s chunk", png_ptr->chunk_name); else sprintf(umsg,"Incomplete compressed datastream in %s chunk", png_ptr->chunk_name); png_warning(png_ptr, umsg); #else png_warning(png_ptr, "Incomplete compressed datastream in chunk other than IDAT"); #endif text_size=prefix_size; if (text == NULL) { text = (png_charp)png_malloc_warn(png_ptr, text_size+1); if (text == NULL) { png_free(png_ptr, chunkdata); png_error(png_ptr,"Not enough memory for text."); } png_memcpy(text, chunkdata, prefix_size); } *(text + text_size) = 0x00; } inflateReset(&png_ptr->zstream); png_ptr->zstream.avail_in = 0; png_free(png_ptr, chunkdata); chunkdata = text; *newlength=text_size; } else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */ { #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) char umsg[50]; sprintf(umsg, "Unknown zTXt compression type %d", comp_type); png_warning(png_ptr, umsg); #else png_warning(png_ptr, "Unknown zTXt compression type"); #endif *(chunkdata + prefix_size) = 0x00; *newlength=prefix_size; } return chunkdata; } #endif /* read and check the IDHR chunk */ void /* PRIVATE */ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_byte buf[13]; png_uint_32 width, height; int bit_depth, color_type, compression_type, filter_type; int interlace_type; png_debug(1, "in png_handle_IHDR\n"); if (png_ptr->mode & PNG_HAVE_IHDR) png_error(png_ptr, "Out of place IHDR"); /* check the length */ if (length != 13) png_error(png_ptr, "Invalid IHDR chunk"); png_ptr->mode |= PNG_HAVE_IHDR; png_crc_read(png_ptr, buf, 13); png_crc_finish(png_ptr, 0); width = png_get_uint_32(buf); height = png_get_uint_32(buf + 4); bit_depth = buf[8]; color_type = buf[9]; compression_type = buf[10]; filter_type = buf[11]; interlace_type = buf[12]; /* set internal variables */ png_ptr->width = width; png_ptr->height = height; png_ptr->bit_depth = (png_byte)bit_depth; png_ptr->interlaced = (png_byte)interlace_type; png_ptr->color_type = (png_byte)color_type; #if defined(PNG_MNG_FEATURES_SUPPORTED) png_ptr->filter_type = (png_byte)filter_type; #endif /* find number of channels */ switch (png_ptr->color_type) { case PNG_COLOR_TYPE_GRAY: case PNG_COLOR_TYPE_PALETTE: png_ptr->channels = 1; break; case PNG_COLOR_TYPE_RGB: png_ptr->channels = 3; break; case PNG_COLOR_TYPE_GRAY_ALPHA: png_ptr->channels = 2; break; case PNG_COLOR_TYPE_RGB_ALPHA: png_ptr->channels = 4; break; } /* set up other useful info */ png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * png_ptr->channels); png_ptr->rowbytes = ((png_ptr->width * (png_uint_32)png_ptr->pixel_depth + 7) >> 3); png_debug1(3,"bit_depth = %d\n", png_ptr->bit_depth); png_debug1(3,"channels = %d\n", png_ptr->channels); png_debug1(3,"rowbytes = %lu\n", png_ptr->rowbytes); png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, interlace_type, compression_type, filter_type); } /* read and check the palette */ void /* PRIVATE */ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_color palette[PNG_MAX_PALETTE_LENGTH]; int num, i; #ifndef PNG_NO_POINTER_INDEXING png_colorp pal_ptr; #endif png_debug(1, "in png_handle_PLTE\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before PLTE"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid PLTE after IDAT"); png_crc_finish(png_ptr, length); return; } else if (png_ptr->mode & PNG_HAVE_PLTE) png_error(png_ptr, "Duplicate PLTE chunk"); png_ptr->mode |= PNG_HAVE_PLTE; if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) { png_warning(png_ptr, "Ignoring PLTE chunk in grayscale PNG"); png_crc_finish(png_ptr, length); return; } #if !defined(PNG_READ_OPT_PLTE_SUPPORTED) if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) { png_crc_finish(png_ptr, length); return; } #endif if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3) { if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) { png_warning(png_ptr, "Invalid palette chunk"); png_crc_finish(png_ptr, length); return; } else { png_error(png_ptr, "Invalid palette chunk"); } } num = (int)length / 3; #ifndef PNG_NO_POINTER_INDEXING for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++) { png_byte buf[3]; png_crc_read(png_ptr, buf, 3); pal_ptr->red = buf[0]; pal_ptr->green = buf[1]; pal_ptr->blue = buf[2]; } #else for (i = 0; i < num; i++) { png_byte buf[3]; png_crc_read(png_ptr, buf, 3); /* don't depend upon png_color being any order */ palette[i].red = buf[0]; palette[i].green = buf[1]; palette[i].blue = buf[2]; } #endif /* If we actually NEED the PLTE chunk (ie for a paletted image), we do whatever the normal CRC configuration tells us. However, if we have an RGB image, the PLTE can be considered ancillary, so we will act as though it is. */ #if !defined(PNG_READ_OPT_PLTE_SUPPORTED) if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) #endif { png_crc_finish(png_ptr, 0); } #if !defined(PNG_READ_OPT_PLTE_SUPPORTED) else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */ { /* If we don't want to use the data from an ancillary chunk, we have two options: an error abort, or a warning and we ignore the data in this chunk (which should be OK, since it's considered ancillary for a RGB or RGBA image). */ if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) { if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) { png_chunk_error(png_ptr, "CRC error"); } else { png_chunk_warning(png_ptr, "CRC error"); return; } } /* Otherwise, we (optionally) emit a warning and use the chunk. */ else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) { png_chunk_warning(png_ptr, "CRC error"); } } #endif png_set_PLTE(png_ptr, info_ptr, palette, num); #if defined(PNG_READ_tRNS_SUPPORTED) if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) { if (png_ptr->num_trans > (png_uint_16)num) { png_warning(png_ptr, "Truncating incorrect tRNS chunk length"); png_ptr->num_trans = (png_uint_16)num; } if (info_ptr->num_trans > (png_uint_16)num) { png_warning(png_ptr, "Truncating incorrect info tRNS chunk length"); info_ptr->num_trans = (png_uint_16)num; } } } #endif } void /* PRIVATE */ png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_debug(1, "in png_handle_IEND\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT)) { png_error(png_ptr, "No image in file"); info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */ } png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND); if (length != 0) { png_warning(png_ptr, "Incorrect IEND chunk length"); } png_crc_finish(png_ptr, length); } #if defined(PNG_READ_gAMA_SUPPORTED) void /* PRIVATE */ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_fixed_point igamma; #ifdef PNG_FLOATING_POINT_SUPPORTED float file_gamma; #endif png_byte buf[4]; png_debug(1, "in png_handle_gAMA\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before gAMA"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid gAMA after IDAT"); png_crc_finish(png_ptr, length); return; } else if (png_ptr->mode & PNG_HAVE_PLTE) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place gAMA chunk"); else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) #if defined(PNG_READ_sRGB_SUPPORTED) && !(info_ptr->valid & PNG_INFO_sRGB) #endif ) { png_warning(png_ptr, "Duplicate gAMA chunk"); png_crc_finish(png_ptr, length); return; } if (length != 4) { png_warning(png_ptr, "Incorrect gAMA chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, 4); if (png_crc_finish(png_ptr, 0)) return; igamma = (png_fixed_point)png_get_uint_32(buf); /* check for zero gamma */ if (igamma == 0) { png_warning(png_ptr, "Ignoring gAMA chunk with gamma=0"); return; } #if defined(PNG_READ_sRGB_SUPPORTED) if (info_ptr->valid & PNG_INFO_sRGB) if(igamma < 45000L || igamma > 46000L) { png_warning(png_ptr, "Ignoring incorrect gAMA value when sRGB is also present"); #ifndef PNG_NO_CONSOLE_IO fprintf(stderr, "gamma = (%d/100000)\n", (int)igamma); #endif return; } #endif /* PNG_READ_sRGB_SUPPORTED */ #ifdef PNG_FLOATING_POINT_SUPPORTED file_gamma = (float)igamma / (float)100000.0; # ifdef PNG_READ_GAMMA_SUPPORTED png_ptr->gamma = file_gamma; # endif png_set_gAMA(png_ptr, info_ptr, file_gamma); #endif #ifdef PNG_FIXED_POINT_SUPPORTED png_set_gAMA_fixed(png_ptr, info_ptr, igamma); #endif } #endif #if defined(PNG_READ_sBIT_SUPPORTED) void /* PRIVATE */ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_size_t truelen; png_byte buf[4]; png_debug(1, "in png_handle_sBIT\n"); buf[0] = buf[1] = buf[2] = buf[3] = 0; if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before sBIT"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid sBIT after IDAT"); png_crc_finish(png_ptr, length); return; } else if (png_ptr->mode & PNG_HAVE_PLTE) { /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place sBIT chunk"); } else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) { png_warning(png_ptr, "Duplicate sBIT chunk"); png_crc_finish(png_ptr, length); return; } if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) truelen = 3; else truelen = (png_size_t)png_ptr->channels; if (length != truelen) { png_warning(png_ptr, "Incorrect sBIT chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, truelen); if (png_crc_finish(png_ptr, 0)) return; if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) { png_ptr->sig_bit.red = buf[0]; png_ptr->sig_bit.green = buf[1]; png_ptr->sig_bit.blue = buf[2]; png_ptr->sig_bit.alpha = buf[3]; } else { png_ptr->sig_bit.gray = buf[0]; png_ptr->sig_bit.red = buf[0]; png_ptr->sig_bit.green = buf[0]; png_ptr->sig_bit.blue = buf[0]; png_ptr->sig_bit.alpha = buf[1]; } png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit)); } #endif #if defined(PNG_READ_cHRM_SUPPORTED) void /* PRIVATE */ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_byte buf[4]; #ifdef PNG_FLOATING_POINT_SUPPORTED float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; #endif png_fixed_point int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, int_y_green, int_x_blue, int_y_blue; png_uint_32 uint_x, uint_y; png_debug(1, "in png_handle_cHRM\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before cHRM"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid cHRM after IDAT"); png_crc_finish(png_ptr, length); return; } else if (png_ptr->mode & PNG_HAVE_PLTE) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Missing PLTE before cHRM"); else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM) #if defined(PNG_READ_sRGB_SUPPORTED) && !(info_ptr->valid & PNG_INFO_sRGB) #endif ) { png_warning(png_ptr, "Duplicate cHRM chunk"); png_crc_finish(png_ptr, length); return; } if (length != 32) { png_warning(png_ptr, "Incorrect cHRM chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, 4); uint_x = png_get_uint_32(buf); png_crc_read(png_ptr, buf, 4); uint_y = png_get_uint_32(buf); if (uint_x > 80000L || uint_y > 80000L || uint_x + uint_y > 100000L) { png_warning(png_ptr, "Invalid cHRM white point"); png_crc_finish(png_ptr, 24); return; } int_x_white = (png_fixed_point)uint_x; int_y_white = (png_fixed_point)uint_y; png_crc_read(png_ptr, buf, 4); uint_x = png_get_uint_32(buf); png_crc_read(png_ptr, buf, 4); uint_y = png_get_uint_32(buf); if (uint_x > 80000L || uint_y > 80000L || uint_x + uint_y > 100000L) { png_warning(png_ptr, "Invalid cHRM red point"); png_crc_finish(png_ptr, 16); return; } int_x_red = (png_fixed_point)uint_x; int_y_red = (png_fixed_point)uint_y; png_crc_read(png_ptr, buf, 4); uint_x = png_get_uint_32(buf); png_crc_read(png_ptr, buf, 4); uint_y = png_get_uint_32(buf); if (uint_x > 80000L || uint_y > 80000L || uint_x + uint_y > 100000L) { png_warning(png_ptr, "Invalid cHRM green point"); png_crc_finish(png_ptr, 8); return; } int_x_green = (png_fixed_point)uint_x; int_y_green = (png_fixed_point)uint_y; png_crc_read(png_ptr, buf, 4); uint_x = png_get_uint_32(buf); png_crc_read(png_ptr, buf, 4); uint_y = png_get_uint_32(buf); if (uint_x > 80000L || uint_y > 80000L || uint_x + uint_y > 100000L) { png_warning(png_ptr, "Invalid cHRM blue point"); png_crc_finish(png_ptr, 0); return; } int_x_blue = (png_fixed_point)uint_x; int_y_blue = (png_fixed_point)uint_y; #ifdef PNG_FLOATING_POINT_SUPPORTED white_x = (float)int_x_white / (float)100000.0; white_y = (float)int_y_white / (float)100000.0; red_x = (float)int_x_red / (float)100000.0; red_y = (float)int_y_red / (float)100000.0; green_x = (float)int_x_green / (float)100000.0; green_y = (float)int_y_green / (float)100000.0; blue_x = (float)int_x_blue / (float)100000.0; blue_y = (float)int_y_blue / (float)100000.0; #endif #if defined(PNG_READ_sRGB_SUPPORTED) if (info_ptr->valid & PNG_INFO_sRGB) { if (abs(int_x_white - 31270L) > 1000 || abs(int_y_white - 32900L) > 1000 || abs(int_x_red - 64000L) > 1000 || abs(int_y_red - 33000L) > 1000 || abs(int_x_green - 30000L) > 1000 || abs(int_y_green - 60000L) > 1000 || abs(int_x_blue - 15000L) > 1000 || abs(int_y_blue - 6000L) > 1000) { png_warning(png_ptr, "Ignoring incorrect cHRM value when sRGB is also present"); #ifndef PNG_NO_CONSOLE_IO #ifdef PNG_FLOATING_POINT_SUPPORTED fprintf(stderr,"wx=%f, wy=%f, rx=%f, ry=%f\n", white_x, white_y, red_x, red_y); fprintf(stderr,"gx=%f, gy=%f, bx=%f, by=%f\n", green_x, green_y, blue_x, blue_y); #else fprintf(stderr,"wx=%ld, wy=%ld, rx=%ld, ry=%ld\n", int_x_white, int_y_white, int_x_red, int_y_red); fprintf(stderr,"gx=%ld, gy=%ld, bx=%ld, by=%ld\n", int_x_green, int_y_green, int_x_blue, int_y_blue); #endif #endif /* PNG_NO_CONSOLE_IO */ } png_crc_finish(png_ptr, 0); return; } #endif /* PNG_READ_sRGB_SUPPORTED */ #ifdef PNG_FLOATING_POINT_SUPPORTED png_set_cHRM(png_ptr, info_ptr, white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); #endif #ifdef PNG_FIXED_POINT_SUPPORTED png_set_cHRM_fixed(png_ptr, info_ptr, int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, int_y_green, int_x_blue, int_y_blue); #endif if (png_crc_finish(png_ptr, 0)) return; } #endif #if defined(PNG_READ_sRGB_SUPPORTED) void /* PRIVATE */ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { int intent; png_byte buf[1]; png_debug(1, "in png_handle_sRGB\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before sRGB"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid sRGB after IDAT"); png_crc_finish(png_ptr, length); return; } else if (png_ptr->mode & PNG_HAVE_PLTE) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place sRGB chunk"); else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) { png_warning(png_ptr, "Duplicate sRGB chunk"); png_crc_finish(png_ptr, length); return; } if (length != 1) { png_warning(png_ptr, "Incorrect sRGB chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, 1); if (png_crc_finish(png_ptr, 0)) return; intent = buf[0]; /* check for bad intent */ if (intent >= PNG_sRGB_INTENT_LAST) { png_warning(png_ptr, "Unknown sRGB intent"); return; } #if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) if ((info_ptr->valid & PNG_INFO_gAMA)) { int igamma; #ifdef PNG_FIXED_POINT_SUPPORTED igamma=(int)info_ptr->int_gamma; #else # ifdef PNG_FLOATING_POINT_SUPPORTED igamma=(int)(info_ptr->gamma * 100000.); # endif #endif if(igamma < 45000L || igamma > 46000L) { png_warning(png_ptr, "Ignoring incorrect gAMA value when sRGB is also present"); #ifndef PNG_NO_CONSOLE_IO # ifdef PNG_FIXED_POINT_SUPPORTED fprintf(stderr,"incorrect gamma=(%d/100000)\n",(int)png_ptr->int_gamma); # else # ifdef PNG_FLOATING_POINT_SUPPORTED fprintf(stderr,"incorrect gamma=%f\n",png_ptr->gamma); # endif # endif #endif } } #endif /* PNG_READ_gAMA_SUPPORTED */ #ifdef PNG_READ_cHRM_SUPPORTED #ifdef PNG_FIXED_POINT_SUPPORTED if (info_ptr->valid & PNG_INFO_cHRM) if (abs(info_ptr->int_x_white - 31270L) > 1000 || abs(info_ptr->int_y_white - 32900L) > 1000 || abs(info_ptr->int_x_red - 64000L) > 1000 || abs(info_ptr->int_y_red - 33000L) > 1000 || abs(info_ptr->int_x_green - 30000L) > 1000 || abs(info_ptr->int_y_green - 60000L) > 1000 || abs(info_ptr->int_x_blue - 15000L) > 1000 || abs(info_ptr->int_y_blue - 6000L) > 1000) { png_warning(png_ptr, "Ignoring incorrect cHRM value when sRGB is also present"); } #endif /* PNG_FIXED_POINT_SUPPORTED */ #endif /* PNG_READ_cHRM_SUPPORTED */ png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent); } #endif /* PNG_READ_sRGB_SUPPORTED */ #if defined(PNG_READ_iCCP_SUPPORTED) void /* PRIVATE */ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Note: this does not properly handle chunks that are > 64K under DOS */ { png_charp chunkdata; png_byte compression_type; png_bytep pC; png_charp profile; png_uint_32 skip = 0; png_uint_32 profile_size = 0; png_uint_32 profile_length = 0; png_size_t slength, prefix_length, data_length; png_debug(1, "in png_handle_iCCP\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before iCCP"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid iCCP after IDAT"); png_crc_finish(png_ptr, length); return; } else if (png_ptr->mode & PNG_HAVE_PLTE) /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Out of place iCCP chunk"); else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) { png_warning(png_ptr, "Duplicate iCCP chunk"); png_crc_finish(png_ptr, length); return; } #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { png_warning(png_ptr, "iCCP chunk too large to fit in memory"); skip = length - (png_uint_32)65535L; length = (png_uint_32)65535L; } #endif chunkdata = (png_charp)png_malloc(png_ptr, length + 1); slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)chunkdata, slength); if (png_crc_finish(png_ptr, skip)) { png_free(png_ptr, chunkdata); return; } chunkdata[slength] = 0x00; for (profile = chunkdata; *profile; profile++) /* empty loop to find end of name */ ; ++profile; /* there should be at least one zero (the compression type byte) following the separator, and we should be on it */ if ( profile >= chunkdata + slength) { png_free(png_ptr, chunkdata); png_warning(png_ptr, "Malformed iCCP chunk"); return; } /* compression_type should always be zero */ compression_type = *profile++; if (compression_type) { png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); compression_type=0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8 wrote nonzero) */ } prefix_length = profile - chunkdata; chunkdata = png_decompress_chunk(png_ptr, compression_type, chunkdata, slength, prefix_length, &data_length); profile_length = data_length - prefix_length; if ( prefix_length > data_length || profile_length < 4) { png_free(png_ptr, chunkdata); png_warning(png_ptr, "Profile size field missing from iCCP chunk"); return; } /* Check the profile_size recorded in the first 32 bits of the ICC profile */ pC = (png_bytep)(chunkdata+prefix_length); profile_size = ((*(pC ))<<24) | ((*(pC+1))<<16) | ((*(pC+2))<< 8) | ((*(pC+3)) ); if(profile_size < profile_length) profile_length = profile_size; if(profile_size > profile_length) { png_free(png_ptr, chunkdata); png_warning(png_ptr, "Ignoring truncated iCCP profile.\n"); return; } png_set_iCCP(png_ptr, info_ptr, chunkdata, compression_type, chunkdata + prefix_length, profile_length); png_free(png_ptr, chunkdata); } #endif /* PNG_READ_iCCP_SUPPORTED */ #if defined(PNG_READ_sPLT_SUPPORTED) void /* PRIVATE */ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) /* Note: this does not properly handle chunks that are > 64K under DOS */ { png_bytep chunkdata; png_bytep entry_start; png_sPLT_t new_palette; #ifdef PNG_NO_POINTER_INDEXING png_sPLT_entryp pp; #endif int data_length, entry_size, i; png_uint_32 skip = 0; png_size_t slength; png_debug(1, "in png_handle_sPLT\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before sPLT"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid sPLT after IDAT"); png_crc_finish(png_ptr, length); return; } #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { png_warning(png_ptr, "sPLT chunk too large to fit in memory"); skip = length - (png_uint_32)65535L; length = (png_uint_32)65535L; } #endif chunkdata = (png_bytep)png_malloc(png_ptr, length + 1); slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)chunkdata, slength); if (png_crc_finish(png_ptr, skip)) { png_free(png_ptr, chunkdata); return; } chunkdata[slength] = 0x00; for (entry_start = chunkdata; *entry_start; entry_start++) /* empty loop to find end of name */ ; ++entry_start; /* a sample depth should follow the separator, and we should be on it */ if (entry_start > chunkdata + slength) { png_free(png_ptr, chunkdata); png_warning(png_ptr, "malformed sPLT chunk"); return; } new_palette.depth = *entry_start++; entry_size = (new_palette.depth == 8 ? 6 : 10); data_length = (slength - (entry_start - chunkdata)); /* integrity-check the data length */ if (data_length % entry_size) { png_free(png_ptr, chunkdata); png_warning(png_ptr, "sPLT chunk has bad length"); return; } new_palette.nentries = data_length / entry_size; new_palette.entries = (png_sPLT_entryp)png_malloc( png_ptr, new_palette.nentries * sizeof(png_sPLT_entry)); #ifndef PNG_NO_POINTER_INDEXING for (i = 0; i < new_palette.nentries; i++) { png_sPLT_entryp pp = new_palette.entries + i; if (new_palette.depth == 8) { pp->red = *entry_start++; pp->green = *entry_start++; pp->blue = *entry_start++; pp->alpha = *entry_start++; } else { pp->red = png_get_uint_16(entry_start); entry_start += 2; pp->green = png_get_uint_16(entry_start); entry_start += 2; pp->blue = png_get_uint_16(entry_start); entry_start += 2; pp->alpha = png_get_uint_16(entry_start); entry_start += 2; } pp->frequency = png_get_uint_16(entry_start); entry_start += 2; } #else pp = new_palette.entries; for (i = 0; i < new_palette.nentries; i++) { if (new_palette.depth == 8) { pp[i].red = *entry_start++; pp[i].green = *entry_start++; pp[i].blue = *entry_start++; pp[i].alpha = *entry_start++; } else { pp[i].red = png_get_uint_16(entry_start); entry_start += 2; pp[i].green = png_get_uint_16(entry_start); entry_start += 2; pp[i].blue = png_get_uint_16(entry_start); entry_start += 2; pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2; } pp->frequency = png_get_uint_16(entry_start); entry_start += 2; } #endif /* discard all chunk data except the name and stash that */ new_palette.name = (png_charp)chunkdata; png_set_sPLT(png_ptr, info_ptr, &new_palette, 1); png_free(png_ptr, chunkdata); png_free(png_ptr, new_palette.entries); } #endif /* PNG_READ_sPLT_SUPPORTED */ #if defined(PNG_READ_tRNS_SUPPORTED) void /* PRIVATE */ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; png_debug(1, "in png_handle_tRNS\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before tRNS"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid tRNS after IDAT"); png_crc_finish(png_ptr, length); return; } else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) { png_warning(png_ptr, "Duplicate tRNS chunk"); png_crc_finish(png_ptr, length); return; } if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { if (!(png_ptr->mode & PNG_HAVE_PLTE)) { /* Should be an error, but we can cope with it */ png_warning(png_ptr, "Missing PLTE before tRNS"); } else if (length > (png_uint_32)png_ptr->num_palette) { png_warning(png_ptr, "Incorrect tRNS chunk length"); png_crc_finish(png_ptr, length); return; } if (length == 0) { png_warning(png_ptr, "Zero length tRNS chunk"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, readbuf, (png_size_t)length); png_ptr->num_trans = (png_uint_16)length; } else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) { png_byte buf[6]; if (length != 6) { png_warning(png_ptr, "Incorrect tRNS chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, (png_size_t)length); png_ptr->num_trans = 1; png_ptr->trans_values.red = png_get_uint_16(buf); png_ptr->trans_values.green = png_get_uint_16(buf + 2); png_ptr->trans_values.blue = png_get_uint_16(buf + 4); } else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) { png_byte buf[6]; if (length != 2) { png_warning(png_ptr, "Incorrect tRNS chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, 2); png_ptr->num_trans = 1; png_ptr->trans_values.gray = png_get_uint_16(buf); } else { png_warning(png_ptr, "tRNS chunk not allowed with alpha channel"); png_crc_finish(png_ptr, length); return; } if (png_crc_finish(png_ptr, 0)) return; png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, &(png_ptr->trans_values)); } #endif #if defined(PNG_READ_bKGD_SUPPORTED) void /* PRIVATE */ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_size_t truelen; png_byte buf[6]; png_debug(1, "in png_handle_bKGD\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before bKGD"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid bKGD after IDAT"); png_crc_finish(png_ptr, length); return; } else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && !(png_ptr->mode & PNG_HAVE_PLTE)) { png_warning(png_ptr, "Missing PLTE before bKGD"); png_crc_finish(png_ptr, length); return; } else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) { png_warning(png_ptr, "Duplicate bKGD chunk"); png_crc_finish(png_ptr, length); return; } if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) truelen = 1; else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) truelen = 6; else truelen = 2; if (length != truelen) { png_warning(png_ptr, "Incorrect bKGD chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, truelen); if (png_crc_finish(png_ptr, 0)) return; /* We convert the index value into RGB components so that we can allow * arbitrary RGB values for background when we have transparency, and * so it is easy to determine the RGB values of the background color * from the info_ptr struct. */ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { png_ptr->background.index = buf[0]; if(info_ptr->num_palette) { if(buf[0] > info_ptr->num_palette) { png_warning(png_ptr, "Incorrect bKGD chunk index value"); return; } png_ptr->background.red = (png_uint_16)png_ptr->palette[buf[0]].red; png_ptr->background.green = (png_uint_16)png_ptr->palette[buf[0]].green; png_ptr->background.blue = (png_uint_16)png_ptr->palette[buf[0]].blue; } } else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ { png_ptr->background.red = png_ptr->background.green = png_ptr->background.blue = png_ptr->background.gray = png_get_uint_16(buf); } else { png_ptr->background.red = png_get_uint_16(buf); png_ptr->background.green = png_get_uint_16(buf + 2); png_ptr->background.blue = png_get_uint_16(buf + 4); } png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background)); } #endif #if defined(PNG_READ_hIST_SUPPORTED) void /* PRIVATE */ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { int num, i; png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH]; png_debug(1, "in png_handle_hIST\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before hIST"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid hIST after IDAT"); png_crc_finish(png_ptr, length); return; } else if (!(png_ptr->mode & PNG_HAVE_PLTE)) { png_warning(png_ptr, "Missing PLTE before hIST"); png_crc_finish(png_ptr, length); return; } else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) { png_warning(png_ptr, "Duplicate hIST chunk"); png_crc_finish(png_ptr, length); return; } num = (int)length / 2 ; if (num != png_ptr->num_palette) { png_warning(png_ptr, "Incorrect hIST chunk length"); png_crc_finish(png_ptr, length); return; } for (i = 0; i < num; i++) { png_byte buf[2]; png_crc_read(png_ptr, buf, 2); readbuf[i] = png_get_uint_16(buf); } if (png_crc_finish(png_ptr, 0)) return; png_set_hIST(png_ptr, info_ptr, readbuf); } #endif #if defined(PNG_READ_pHYs_SUPPORTED) void /* PRIVATE */ png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_byte buf[9]; png_uint_32 res_x, res_y; int unit_type; png_debug(1, "in png_handle_pHYs\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before pHYs"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid pHYs after IDAT"); png_crc_finish(png_ptr, length); return; } else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) { png_warning(png_ptr, "Duplicate pHYs chunk"); png_crc_finish(png_ptr, length); return; } if (length != 9) { png_warning(png_ptr, "Incorrect pHYs chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, 9); if (png_crc_finish(png_ptr, 0)) return; res_x = png_get_uint_32(buf); res_y = png_get_uint_32(buf + 4); unit_type = buf[8]; png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type); } #endif #if defined(PNG_READ_oFFs_SUPPORTED) void /* PRIVATE */ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_byte buf[9]; png_int_32 offset_x, offset_y; int unit_type; png_debug(1, "in png_handle_oFFs\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before oFFs"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid oFFs after IDAT"); png_crc_finish(png_ptr, length); return; } else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) { png_warning(png_ptr, "Duplicate oFFs chunk"); png_crc_finish(png_ptr, length); return; } if (length != 9) { png_warning(png_ptr, "Incorrect oFFs chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, 9); if (png_crc_finish(png_ptr, 0)) return; offset_x = png_get_int_32(buf); offset_y = png_get_int_32(buf + 4); unit_type = buf[8]; png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type); } #endif #if defined(PNG_READ_pCAL_SUPPORTED) /* read the pCAL chunk (described in the PNG Extensions document) */ void /* PRIVATE */ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_charp purpose; png_int_32 X0, X1; png_byte type, nparams; png_charp buf, units, endptr; png_charpp params; png_size_t slength; int i; png_debug(1, "in png_handle_pCAL\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before pCAL"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid pCAL after IDAT"); png_crc_finish(png_ptr, length); return; } else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) { png_warning(png_ptr, "Duplicate pCAL chunk"); png_crc_finish(png_ptr, length); return; } png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n", length + 1); purpose = (png_charp)png_malloc_warn(png_ptr, length + 1); if (purpose == NULL) { png_warning(png_ptr, "No memory for pCAL purpose."); return; } slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)purpose, slength); if (png_crc_finish(png_ptr, 0)) { png_free(png_ptr, purpose); return; } purpose[slength] = 0x00; /* null terminate the last string */ png_debug(3, "Finding end of pCAL purpose string\n"); for (buf = purpose; *buf; buf++) /* empty loop */ ; endptr = purpose + slength; /* We need to have at least 12 bytes after the purpose string in order to get the parameter information. */ if (endptr <= buf + 12) { png_warning(png_ptr, "Invalid pCAL data"); png_free(png_ptr, purpose); return; } png_debug(3, "Reading pCAL X0, X1, type, nparams, and units\n"); X0 = png_get_int_32((png_bytep)buf+1); X1 = png_get_int_32((png_bytep)buf+5); type = buf[9]; nparams = buf[10]; units = buf + 11; png_debug(3, "Checking pCAL equation type and number of parameters\n"); /* Check that we have the right number of parameters for known equation types. */ if ((type == PNG_EQUATION_LINEAR && nparams != 2) || (type == PNG_EQUATION_BASE_E && nparams != 3) || (type == PNG_EQUATION_ARBITRARY && nparams != 3) || (type == PNG_EQUATION_HYPERBOLIC && nparams != 4)) { png_warning(png_ptr, "Invalid pCAL parameters for equation type"); png_free(png_ptr, purpose); return; } else if (type >= PNG_EQUATION_LAST) { png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); } for (buf = units; *buf; buf++) /* Empty loop to move past the units string. */ ; png_debug(3, "Allocating pCAL parameters array\n"); params = (png_charpp)png_malloc_warn(png_ptr, (png_uint_32)(nparams *sizeof(png_charp))) ; if (params == NULL) { png_free(png_ptr, purpose); png_warning(png_ptr, "No memory for pCAL params."); return; } /* Get pointers to the start of each parameter string. */ for (i = 0; i < (int)nparams; i++) { buf++; /* Skip the null string terminator from previous parameter. */ png_debug1(3, "Reading pCAL parameter %d\n", i); for (params[i] = buf; *buf != 0x00 && buf <= endptr; buf++) /* Empty loop to move past each parameter string */ ; /* Make sure we haven't run out of data yet */ if (buf > endptr) { png_warning(png_ptr, "Invalid pCAL data"); png_free(png_ptr, purpose); png_free(png_ptr, params); return; } } png_set_pCAL(png_ptr, info_ptr, purpose, X0, X1, type, nparams, units, params); png_free(png_ptr, purpose); png_free(png_ptr, params); } #endif #if defined(PNG_READ_sCAL_SUPPORTED) /* read the sCAL chunk */ void /* PRIVATE */ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_charp buffer, ep; #ifdef PNG_FLOATING_POINT_SUPPORTED double width, height; png_charp vp; #else #ifdef PNG_FIXED_POINT_SUPPORTED png_charp swidth, sheight; #endif #endif png_size_t slength; png_debug(1, "in png_handle_sCAL\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before sCAL"); else if (png_ptr->mode & PNG_HAVE_IDAT) { png_warning(png_ptr, "Invalid sCAL after IDAT"); png_crc_finish(png_ptr, length); return; } else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) { png_warning(png_ptr, "Duplicate sCAL chunk"); png_crc_finish(png_ptr, length); return; } png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n", length + 1); buffer = (png_charp)png_malloc_warn(png_ptr, length + 1); if (buffer == NULL) { png_warning(png_ptr, "Out of memory while processing sCAL chunk"); return; } slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)buffer, slength); if (png_crc_finish(png_ptr, 0)) { png_free(png_ptr, buffer); return; } buffer[slength] = 0x00; /* null terminate the last string */ ep = buffer + 1; /* skip unit byte */ #ifdef PNG_FLOATING_POINT_SUPPORTED width = strtod(ep, &vp); if (*vp) { png_warning(png_ptr, "malformed width string in sCAL chunk"); return; } #else #ifdef PNG_FIXED_POINT_SUPPORTED swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); if (swidth == NULL) { png_warning(png_ptr, "Out of memory while processing sCAL chunk width"); return; } png_memcpy(swidth, ep, (png_size_t)png_strlen(ep)); #endif #endif for (ep = buffer; *ep; ep++) /* empty loop */ ; ep++; #ifdef PNG_FLOATING_POINT_SUPPORTED height = strtod(ep, &vp); if (*vp) { png_warning(png_ptr, "malformed height string in sCAL chunk"); return; } #else #ifdef PNG_FIXED_POINT_SUPPORTED sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); if (swidth == NULL) { png_warning(png_ptr, "Out of memory while processing sCAL chunk height"); return; } png_memcpy(sheight, ep, (png_size_t)png_strlen(ep)); #endif #endif if (buffer + slength < ep #ifdef PNG_FLOATING_POINT_SUPPORTED || width <= 0. || height <= 0. #endif ) { png_warning(png_ptr, "Invalid sCAL data"); png_free(png_ptr, buffer); #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) png_free(png_ptr, swidth); png_free(png_ptr, sheight); #endif return; } #ifdef PNG_FLOATING_POINT_SUPPORTED png_set_sCAL(png_ptr, info_ptr, buffer[0], width, height); #else #ifdef PNG_FIXED_POINT_SUPPORTED png_set_sCAL_s(png_ptr, info_ptr, buffer[0], swidth, sheight); #endif #endif png_free(png_ptr, buffer); #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) png_free(png_ptr, swidth); png_free(png_ptr, sheight); #endif } #endif #if defined(PNG_READ_tIME_SUPPORTED) void /* PRIVATE */ png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_byte buf[7]; png_time mod_time; png_debug(1, "in png_handle_tIME\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Out of place tIME chunk"); else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) { png_warning(png_ptr, "Duplicate tIME chunk"); png_crc_finish(png_ptr, length); return; } if (png_ptr->mode & PNG_HAVE_IDAT) png_ptr->mode |= PNG_AFTER_IDAT; if (length != 7) { png_warning(png_ptr, "Incorrect tIME chunk length"); png_crc_finish(png_ptr, length); return; } png_crc_read(png_ptr, buf, 7); if (png_crc_finish(png_ptr, 0)) return; mod_time.second = buf[6]; mod_time.minute = buf[5]; mod_time.hour = buf[4]; mod_time.day = buf[3]; mod_time.month = buf[2]; mod_time.year = png_get_uint_16(buf); png_set_tIME(png_ptr, info_ptr, &mod_time); } #endif #if defined(PNG_READ_tEXt_SUPPORTED) /* Note: this does not properly handle chunks that are > 64K under DOS */ void /* PRIVATE */ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_textp text_ptr; png_charp key; png_charp text; png_uint_32 skip = 0; png_size_t slength; int ret; png_debug(1, "in png_handle_tEXt\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before tEXt"); if (png_ptr->mode & PNG_HAVE_IDAT) png_ptr->mode |= PNG_AFTER_IDAT; #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { png_warning(png_ptr, "tEXt chunk too large to fit in memory"); skip = length - (png_uint_32)65535L; length = (png_uint_32)65535L; } #endif key = (png_charp)png_malloc_warn(png_ptr, length + 1); if (key == NULL) { png_warning(png_ptr, "No memory to process text chunk."); return; } slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)key, slength); if (png_crc_finish(png_ptr, skip)) { png_free(png_ptr, key); return; } key[slength] = 0x00; for (text = key; *text; text++) /* empty loop to find end of key */ ; if (text != key + slength) text++; text_ptr = (png_textp)png_malloc_warn(png_ptr, (png_uint_32)sizeof(png_text)); if (text_ptr == NULL) { png_warning(png_ptr, "Not enough memory to process text chunk."); png_free(png_ptr, key); return; } text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; text_ptr->key = key; #ifdef PNG_iTXt_SUPPORTED text_ptr->lang = NULL; text_ptr->lang_key = NULL; text_ptr->itxt_length = 0; #endif text_ptr->text = text; text_ptr->text_length = png_strlen(text); ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); png_free(png_ptr, key); png_free(png_ptr, text_ptr); if (ret) png_warning(png_ptr, "Insufficient memory to process text chunk."); } #endif #if defined(PNG_READ_zTXt_SUPPORTED) /* note: this does not correctly handle chunks that are > 64K under DOS */ void /* PRIVATE */ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_textp text_ptr; png_charp chunkdata; png_charp text; int comp_type; int ret; png_size_t slength, prefix_len, data_len; png_debug(1, "in png_handle_zTXt\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before zTXt"); if (png_ptr->mode & PNG_HAVE_IDAT) png_ptr->mode |= PNG_AFTER_IDAT; #ifdef PNG_MAX_MALLOC_64K /* We will no doubt have problems with chunks even half this size, but there is no hard and fast rule to tell us where to stop. */ if (length > (png_uint_32)65535L) { png_warning(png_ptr,"zTXt chunk too large to fit in memory"); png_crc_finish(png_ptr, length); return; } #endif chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); if (chunkdata == NULL) { png_warning(png_ptr,"Out of memory processing zTXt chunk."); return; } slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)chunkdata, slength); if (png_crc_finish(png_ptr, 0)) { png_free(png_ptr, chunkdata); return; } chunkdata[slength] = 0x00; for (text = chunkdata; *text; text++) /* empty loop */ ; /* zTXt must have some text after the chunkdataword */ if (text == chunkdata + slength) { comp_type = PNG_TEXT_COMPRESSION_NONE; png_warning(png_ptr, "Zero length zTXt chunk"); } else { comp_type = *(++text); if (comp_type != PNG_TEXT_COMPRESSION_zTXt) { png_warning(png_ptr, "Unknown compression type in zTXt chunk"); comp_type = PNG_TEXT_COMPRESSION_zTXt; } text++; /* skip the compression_method byte */ } prefix_len = text - chunkdata; chunkdata = (png_charp)png_decompress_chunk(png_ptr, comp_type, chunkdata, (png_size_t)length, prefix_len, &data_len); text_ptr = (png_textp)png_malloc_warn(png_ptr, (png_uint_32)sizeof(png_text)); if (text_ptr == NULL) { png_warning(png_ptr,"Not enough memory to process zTXt chunk."); png_free(png_ptr, chunkdata); return; } text_ptr->compression = comp_type; text_ptr->key = chunkdata; #ifdef PNG_iTXt_SUPPORTED text_ptr->lang = NULL; text_ptr->lang_key = NULL; text_ptr->itxt_length = 0; #endif text_ptr->text = chunkdata + prefix_len; text_ptr->text_length = data_len; ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); png_free(png_ptr, text_ptr); png_free(png_ptr, chunkdata); if (ret) png_error(png_ptr, "Insufficient memory to store zTXt chunk."); } #endif #if defined(PNG_READ_iTXt_SUPPORTED) /* note: this does not correctly handle chunks that are > 64K under DOS */ void /* PRIVATE */ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_textp text_ptr; png_charp chunkdata; png_charp key, lang, text, lang_key; int comp_flag; int comp_type = 0; int ret; png_size_t slength, prefix_len, data_len; png_debug(1, "in png_handle_iTXt\n"); if (!(png_ptr->mode & PNG_HAVE_IHDR)) png_error(png_ptr, "Missing IHDR before iTXt"); if (png_ptr->mode & PNG_HAVE_IDAT) png_ptr->mode |= PNG_AFTER_IDAT; #ifdef PNG_MAX_MALLOC_64K /* We will no doubt have problems with chunks even half this size, but there is no hard and fast rule to tell us where to stop. */ if (length > (png_uint_32)65535L) { png_warning(png_ptr,"iTXt chunk too large to fit in memory"); png_crc_finish(png_ptr, length); return; } #endif chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); if (chunkdata == NULL) { png_warning(png_ptr, "No memory to process iTXt chunk."); return; } slength = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)chunkdata, slength); if (png_crc_finish(png_ptr, 0)) { png_free(png_ptr, chunkdata); return; } chunkdata[slength] = 0x00; for (lang = chunkdata; *lang; lang++) /* empty loop */ ; lang++; /* skip NUL separator */ /* iTXt must have a language tag (possibly empty), two compression bytes, translated keyword (possibly empty), and possibly some text after the keyword */ if (lang >= chunkdata + slength) { comp_flag = PNG_TEXT_COMPRESSION_NONE; png_warning(png_ptr, "Zero length iTXt chunk"); } else { comp_flag = *lang++; comp_type = *lang++; } for (lang_key = lang; *lang_key; lang_key++) /* empty loop */ ; lang_key++; /* skip NUL separator */ for (text = lang_key; *text; text++) /* empty loop */ ; text++; /* skip NUL separator */ prefix_len = text - chunkdata; key=chunkdata; if (comp_flag) chunkdata = png_decompress_chunk(png_ptr, comp_type, chunkdata, (size_t)length, prefix_len, &data_len); else data_len=png_strlen(chunkdata + prefix_len); text_ptr = (png_textp)png_malloc_warn(png_ptr, (png_uint_32)sizeof(png_text)); if (text_ptr == NULL) { png_warning(png_ptr,"Not enough memory to process iTXt chunk."); png_free(png_ptr, chunkdata); return; } text_ptr->compression = (int)comp_flag + 1; text_ptr->lang_key = chunkdata+(lang_key-key); text_ptr->lang = chunkdata+(lang-key); text_ptr->itxt_length = data_len; text_ptr->text_length = 0; text_ptr->key = chunkdata; text_ptr->text = chunkdata + prefix_len; ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); png_free(png_ptr, text_ptr); png_free(png_ptr, chunkdata); if (ret) png_error(png_ptr, "Insufficient memory to store iTXt chunk."); } #endif /* This function is called when we haven't found a handler for a chunk. If there isn't a problem with the chunk itself (ie bad chunk name, CRC, or a critical chunk), the chunk is silently ignored -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which case it will be saved away to be written out later. */ void /* PRIVATE */ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) { png_uint_32 skip = 0; png_debug(1, "in png_handle_unknown\n"); if (png_ptr->mode & PNG_HAVE_IDAT) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IDAT; #endif if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* not an IDAT */ png_ptr->mode |= PNG_AFTER_IDAT; } png_check_chunk_name(png_ptr, png_ptr->chunk_name); if (!(png_ptr->chunk_name[0] & 0x20)) { #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != HANDLE_CHUNK_ALWAYS #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) && png_ptr->read_user_chunk_fn == NULL #endif ) #endif png_chunk_error(png_ptr, "unknown critical chunk"); } #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) { png_unknown_chunk chunk; #ifdef PNG_MAX_MALLOC_64K if (length > (png_uint_32)65535L) { png_warning(png_ptr, "unknown chunk too large to fit in memory"); skip = length - (png_uint_32)65535L; length = (png_uint_32)65535L; } #endif png_strcpy((png_charp)chunk.name, (png_charp)png_ptr->chunk_name); chunk.data = (png_bytep)png_malloc(png_ptr, length); chunk.size = (png_size_t)length; png_crc_read(png_ptr, (png_bytep)chunk.data, length); #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) if(png_ptr->read_user_chunk_fn != NULL) { /* callback to user unknown chunk handler */ if ((*(png_ptr->read_user_chunk_fn)) (png_ptr, &chunk) <= 0) { if (!(png_ptr->chunk_name[0] & 0x20)) if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != HANDLE_CHUNK_ALWAYS) { png_free(png_ptr, chunk.data); png_chunk_error(png_ptr, "unknown critical chunk"); } png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1); } } else #endif png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1); png_free(png_ptr, chunk.data); } else #endif skip = length; png_crc_finish(png_ptr, skip); #if !defined(PNG_READ_USER_CHUNKS_SUPPORTED) info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */ #endif } /* This function is called to verify that a chunk name is valid. This function can't have the "critical chunk check" incorporated into it, since in the future we will need to be able to call user functions to handle unknown critical chunks after we check that the chunk name itself is valid. */ #define isnonalpha(c) ((c) < 41 || (c) > 122 || ((c) > 90 && (c) < 97)) void /* PRIVATE */ png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name) { png_debug(1, "in png_check_chunk_name\n"); if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) || isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3])) { png_chunk_error(png_ptr, "invalid chunk type"); } } /* Combines the row recently read in with the existing pixels in the row. This routine takes care of alpha and transparency if requested. This routine also handles the two methods of progressive display of interlaced images, depending on the mask value. The mask value describes which pixels are to be combined with the row. The pattern always repeats every 8 pixels, so just 8 bits are needed. A one indicates the pixel is to be combined, a zero indicates the pixel is to be skipped. This is in addition to any alpha or transparency value associated with the pixel. If you want all pixels to be combined, pass 0xff (255) in mask. */ #ifndef PNG_HAVE_ASSEMBLER_COMBINE_ROW void /* PRIVATE */ png_combine_row(png_structp png_ptr, png_bytep row, int mask) { png_debug(1,"in png_combine_row\n"); if (mask == 0xff) { png_memcpy(row, png_ptr->row_buf + 1, (png_size_t)((png_ptr->width * png_ptr->row_info.pixel_depth + 7) >> 3)); } else { switch (png_ptr->row_info.pixel_depth) { case 1: { png_bytep sp = png_ptr->row_buf + 1; png_bytep dp = row; int s_inc, s_start, s_end; int m = 0x80; int shift; png_uint_32 i; png_uint_32 row_width = png_ptr->width; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 7; s_inc = 1; } else #endif { s_start = 7; s_end = 0; s_inc = -1; } shift = s_start; for (i = 0; i < row_width; i++) { if (m & mask) { int value; value = (*sp >> shift) & 0x01; *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } case 2: { png_bytep sp = png_ptr->row_buf + 1; png_bytep dp = row; int s_start, s_end, s_inc; int m = 0x80; int shift; png_uint_32 i; png_uint_32 row_width = png_ptr->width; int value; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 6; s_inc = 2; } else #endif { s_start = 6; s_end = 0; s_inc = -2; } shift = s_start; for (i = 0; i < row_width; i++) { if (m & mask) { value = (*sp >> shift) & 0x03; *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } case 4: { png_bytep sp = png_ptr->row_buf + 1; png_bytep dp = row; int s_start, s_end, s_inc; int m = 0x80; int shift; png_uint_32 i; png_uint_32 row_width = png_ptr->width; int value; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 4; s_inc = 4; } else #endif { s_start = 4; s_end = 0; s_inc = -4; } shift = s_start; for (i = 0; i < row_width; i++) { if (m & mask) { value = (*sp >> shift) & 0xf; *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } default: { png_bytep sp = png_ptr->row_buf + 1; png_bytep dp = row; png_size_t pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); png_uint_32 i; png_uint_32 row_width = png_ptr->width; png_byte m = 0x80; for (i = 0; i < row_width; i++) { if (m & mask) { png_memcpy(dp, sp, pixel_bytes); } sp += pixel_bytes; dp += pixel_bytes; if (m == 1) m = 0x80; else m >>= 1; } break; } } } } #endif /* !PNG_HAVE_ASSEMBLER_COMBINE_ROW */ #ifdef PNG_READ_INTERLACING_SUPPORTED #ifndef PNG_HAVE_ASSEMBLER_READ_INTERLACE /* else in pngvcrd.c, pnggccrd.c */ /* OLD pre-1.0.9 interface: void png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, png_uint_32 transformations) */ void /* PRIVATE */ png_do_read_interlace(png_structp png_ptr) { png_row_infop row_info = &(png_ptr->row_info); png_bytep row = png_ptr->row_buf + 1; int pass = png_ptr->pass; png_uint_32 transformations = png_ptr->transformations; #ifdef PNG_USE_LOCAL_ARRAYS /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* offset to next interlace block */ const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; #endif png_debug(1,"in png_do_read_interlace (stock C version)\n"); if (row != NULL && row_info != NULL) { png_uint_32 final_width; final_width = row_info->width * png_pass_inc[pass]; switch (row_info->pixel_depth) { case 1: { png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3); png_bytep dp = row + (png_size_t)((final_width - 1) >> 3); int sshift, dshift; int s_start, s_end, s_inc; int jstop = png_pass_inc[pass]; png_byte v; png_uint_32 i; int j; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (int)((row_info->width + 7) & 0x07); dshift = (int)((final_width + 7) & 0x07); s_start = 7; s_end = 0; s_inc = -1; } else #endif { sshift = 7 - (int)((row_info->width + 7) & 0x07); dshift = 7 - (int)((final_width + 7) & 0x07); s_start = 0; s_end = 7; s_inc = 1; } for (i = 0; i < row_info->width; i++) { v = (png_byte)((*sp >> sshift) & 0x01); for (j = 0; j < jstop; j++) { *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } case 2: { png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2); png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2); int sshift, dshift; int s_start, s_end, s_inc; int jstop = png_pass_inc[pass]; png_uint_32 i; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (int)(((row_info->width + 3) & 0x03) << 1); dshift = (int)(((final_width + 3) & 0x03) << 1); s_start = 6; s_end = 0; s_inc = -2; } else #endif { sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1); dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1); s_start = 0; s_end = 6; s_inc = 2; } for (i = 0; i < row_info->width; i++) { png_byte v; int j; v = (png_byte)((*sp >> sshift) & 0x03); for (j = 0; j < jstop; j++) { *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } case 4: { png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1); png_bytep dp = row + (png_size_t)((final_width - 1) >> 1); int sshift, dshift; int s_start, s_end, s_inc; png_uint_32 i; int jstop = png_pass_inc[pass]; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (int)(((row_info->width + 1) & 0x01) << 2); dshift = (int)(((final_width + 1) & 0x01) << 2); s_start = 4; s_end = 0; s_inc = -4; } else #endif { sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2); dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2); s_start = 0; s_end = 4; s_inc = 4; } for (i = 0; i < row_info->width; i++) { png_byte v = (png_byte)((*sp >> sshift) & 0xf); int j; for (j = 0; j < jstop; j++) { *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } default: { png_size_t pixel_bytes = (row_info->pixel_depth >> 3); png_bytep sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes; png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes; int jstop = png_pass_inc[pass]; png_uint_32 i; for (i = 0; i < row_info->width; i++) { png_byte v[8]; int j; png_memcpy(v, sp, pixel_bytes); for (j = 0; j < jstop; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sp -= pixel_bytes; } break; } } row_info->width = final_width; row_info->rowbytes = ((final_width * (png_uint_32)row_info->pixel_depth + 7) >> 3); } #if !defined(PNG_READ_PACKSWAP_SUPPORTED) transformations = transformations; /* silence compiler warning */ #endif } #endif /* !PNG_HAVE_ASSEMBLER_READ_INTERLACE */ #endif /* PNG_READ_INTERLACING_SUPPORTED */ #ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW void /* PRIVATE */ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter) { png_debug(1, "in png_read_filter_row\n"); png_debug2(2,"row = %lu, filter = %d\n", png_ptr->row_number, filter); switch (filter) { case PNG_FILTER_VALUE_NONE: break; case PNG_FILTER_VALUE_SUB: { png_uint_32 i; png_uint_32 istop = row_info->rowbytes; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_bytep rp = row + bpp; png_bytep lp = row; for (i = bpp; i < istop; i++) { *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); rp++; } break; } case PNG_FILTER_VALUE_UP: { png_uint_32 i; png_uint_32 istop = row_info->rowbytes; png_bytep rp = row; png_bytep pp = prev_row; for (i = 0; i < istop; i++) { *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); rp++; } break; } case PNG_FILTER_VALUE_AVG: { png_uint_32 i; png_bytep rp = row; png_bytep pp = prev_row; png_bytep lp = row; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_uint_32 istop = row_info->rowbytes - bpp; for (i = 0; i < bpp; i++) { *rp = (png_byte)(((int)(*rp) + ((int)(*pp++) / 2 )) & 0xff); rp++; } for (i = 0; i < istop; i++) { *rp = (png_byte)(((int)(*rp) + (int)(*pp++ + *lp++) / 2 ) & 0xff); rp++; } break; } case PNG_FILTER_VALUE_PAETH: { png_uint_32 i; png_bytep rp = row; png_bytep pp = prev_row; png_bytep lp = row; png_bytep cp = prev_row; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_uint_32 istop=row_info->rowbytes - bpp; for (i = 0; i < bpp; i++) { *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); rp++; } for (i = 0; i < istop; i++) /* use leftover rp,pp */ { int a, b, c, pa, pb, pc, p; a = *lp++; b = *pp++; c = *cp++; p = b - c; pc = a - c; #ifdef PNG_USE_ABS pa = abs(p); pb = abs(pc); pc = abs(p + pc); #else pa = p < 0 ? -p : p; pb = pc < 0 ? -pc : pc; pc = (p + pc) < 0 ? -(p + pc) : p + pc; #endif /* if (pa <= pb && pa <= pc) p = a; else if (pb <= pc) p = b; else p = c; */ p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; *rp = (png_byte)(((int)(*rp) + p) & 0xff); rp++; } break; } default: png_warning(png_ptr, "Ignoring bad adaptive filter type"); *row=0; break; } } #endif /* !PNG_HAVE_ASSEMBLER_READ_FILTER_ROW */ void /* PRIVATE */ png_read_finish_row(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* start of interlace block */ const int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; /* offset to next interlace block */ const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; /* start of interlace block in the y direction */ const int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; /* offset to next interlace block in the y direction */ const int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; #endif png_debug(1, "in png_read_finish_row\n"); png_ptr->row_number++; if (png_ptr->row_number < png_ptr->num_rows) return; if (png_ptr->interlaced) { png_ptr->row_number = 0; png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); do { png_ptr->pass++; if (png_ptr->pass >= 7) break; png_ptr->iwidth = (png_ptr->width + png_pass_inc[png_ptr->pass] - 1 - png_pass_start[png_ptr->pass]) / png_pass_inc[png_ptr->pass]; png_ptr->irowbytes = ((png_ptr->iwidth * (png_uint_32)png_ptr->pixel_depth + 7) >> 3) +1; if (!(png_ptr->transformations & PNG_INTERLACE)) { png_ptr->num_rows = (png_ptr->height + png_pass_yinc[png_ptr->pass] - 1 - png_pass_ystart[png_ptr->pass]) / png_pass_yinc[png_ptr->pass]; if (!(png_ptr->num_rows)) continue; } else /* if (png_ptr->transformations & PNG_INTERLACE) */ break; } while (png_ptr->iwidth == 0); if (png_ptr->pass < 7) return; } if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IDAT; #endif char extra; int ret; png_ptr->zstream.next_out = (Byte *)&extra; png_ptr->zstream.avail_out = (uInt)1; for(;;) { if (!(png_ptr->zstream.avail_in)) { while (!png_ptr->idat_size) { png_byte chunk_length[4]; png_crc_finish(png_ptr, 0); png_read_data(png_ptr, chunk_length, 4); png_ptr->idat_size = png_get_uint_32(chunk_length); png_reset_crc(png_ptr); png_crc_read(png_ptr, png_ptr->chunk_name, 4); if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4)) png_error(png_ptr, "Not enough image data"); } png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_in = png_ptr->zbuf; if (png_ptr->zbuf_size > png_ptr->idat_size) png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in); png_ptr->idat_size -= png_ptr->zstream.avail_in; } ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); if (ret == Z_STREAM_END) { if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in || png_ptr->idat_size) png_warning(png_ptr, "Extra compressed data"); png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; break; } if (ret != Z_OK) png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : "Decompression Error"); if (!(png_ptr->zstream.avail_out)) { png_warning(png_ptr, "Extra compressed data."); png_ptr->mode |= PNG_AFTER_IDAT; png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; break; } } png_ptr->zstream.avail_out = 0; } if (png_ptr->idat_size || png_ptr->zstream.avail_in) png_warning(png_ptr, "Extra compression data"); inflateReset(&png_ptr->zstream); png_ptr->mode |= PNG_AFTER_IDAT; } void /* PRIVATE */ png_read_start_row(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* start of interlace block */ const int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; /* offset to next interlace block */ const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; /* start of interlace block in the y direction */ const int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; /* offset to next interlace block in the y direction */ const int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; #endif int max_pixel_depth; png_uint_32 row_bytes; png_debug(1, "in png_read_start_row\n"); png_ptr->zstream.avail_in = 0; png_init_read_transformations(png_ptr); if (png_ptr->interlaced) { if (!(png_ptr->transformations & PNG_INTERLACE)) png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - png_pass_ystart[0]) / png_pass_yinc[0]; else png_ptr->num_rows = png_ptr->height; png_ptr->iwidth = (png_ptr->width + png_pass_inc[png_ptr->pass] - 1 - png_pass_start[png_ptr->pass]) / png_pass_inc[png_ptr->pass]; row_bytes = ((png_ptr->iwidth * (png_uint_32)png_ptr->pixel_depth + 7) >> 3) +1; png_ptr->irowbytes = (png_size_t)row_bytes; if((png_uint_32)png_ptr->irowbytes != row_bytes) png_error(png_ptr, "Rowbytes overflow in png_read_start_row"); } else { png_ptr->num_rows = png_ptr->height; png_ptr->iwidth = png_ptr->width; png_ptr->irowbytes = png_ptr->rowbytes + 1; } max_pixel_depth = png_ptr->pixel_depth; #if defined(PNG_READ_PACK_SUPPORTED) if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8) max_pixel_depth = 8; #endif #if defined(PNG_READ_EXPAND_SUPPORTED) if (png_ptr->transformations & PNG_EXPAND) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { if (png_ptr->num_trans) max_pixel_depth = 32; else max_pixel_depth = 24; } else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) { if (max_pixel_depth < 8) max_pixel_depth = 8; if (png_ptr->num_trans) max_pixel_depth *= 2; } else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) { if (png_ptr->num_trans) { max_pixel_depth *= 4; max_pixel_depth /= 3; } } } #endif #if defined(PNG_READ_FILLER_SUPPORTED) if (png_ptr->transformations & (PNG_FILLER)) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) max_pixel_depth = 32; else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) { if (max_pixel_depth <= 8) max_pixel_depth = 16; else max_pixel_depth = 32; } else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) { if (max_pixel_depth <= 32) max_pixel_depth = 32; else max_pixel_depth = 64; } } #endif #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) if (png_ptr->transformations & PNG_GRAY_TO_RGB) { if ( #if defined(PNG_READ_EXPAND_SUPPORTED) (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || #endif #if defined(PNG_READ_FILLER_SUPPORTED) (png_ptr->transformations & (PNG_FILLER)) || #endif png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { if (max_pixel_depth <= 16) max_pixel_depth = 32; else max_pixel_depth = 64; } else { if (max_pixel_depth <= 8) { if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) max_pixel_depth = 32; else max_pixel_depth = 24; } else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) max_pixel_depth = 64; else max_pixel_depth = 48; } } #endif #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) if(png_ptr->transformations & PNG_USER_TRANSFORM) { int user_pixel_depth=png_ptr->user_transform_depth* png_ptr->user_transform_channels; if(user_pixel_depth > max_pixel_depth) max_pixel_depth=user_pixel_depth; } #endif /* align the width on the next larger 8 pixels. Mainly used for interlacing */ row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7)); /* calculate the maximum bytes needed, adding a byte and a pixel for safety's sake */ row_bytes = ((row_bytes * (png_uint_32)max_pixel_depth + 7) >> 3) + 1 + ((max_pixel_depth + 7) >> 3); #ifdef PNG_MAX_MALLOC_64K if (row_bytes > (png_uint_32)65536L) png_error(png_ptr, "This image requires a row greater than 64KB"); #endif png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes+64); png_ptr->row_buf = png_ptr->big_row_buf+32; #if defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD) png_ptr->row_buf_size = row_bytes; #endif #ifdef PNG_MAX_MALLOC_64K if ((png_uint_32)png_ptr->rowbytes + 1 > (png_uint_32)65536L) png_error(png_ptr, "This image requires a row greater than 64KB"); #endif png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)( png_ptr->rowbytes + 1)); png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); png_debug1(3, "width = %lu,\n", png_ptr->width); png_debug1(3, "height = %lu,\n", png_ptr->height); png_debug1(3, "iwidth = %lu,\n", png_ptr->iwidth); png_debug1(3, "num_rows = %lu\n", png_ptr->num_rows); png_debug1(3, "rowbytes = %lu,\n", png_ptr->rowbytes); png_debug1(3, "irowbytes = %lu,\n", png_ptr->irowbytes); png_ptr->flags |= PNG_FLAG_ROW_INIT; } gamera-3.3.3/src/libpng-1.2.5/pngset.c0000644000076500000000000010712010714675701016122 0ustar chriswheel /* pngset.c - storage of image information into info struct * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * The functions here are used during reads to store data from the file * into the info struct, and during writes to store application data * into the info struct for writing into the file. This abstracts the * info struct and allows us to change the structure in the future. */ #define PNG_INTERNAL #include "png.h" #if defined(PNG_bKGD_SUPPORTED) void PNGAPI png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background) { png_debug1(1, "in %s storage function\n", "bKGD"); if (png_ptr == NULL || info_ptr == NULL) return; png_memcpy(&(info_ptr->background), background, sizeof(png_color_16)); info_ptr->valid |= PNG_INFO_bKGD; } #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED void PNGAPI png_set_cHRM(png_structp png_ptr, png_infop info_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y) { png_debug1(1, "in %s storage function\n", "cHRM"); if (png_ptr == NULL || info_ptr == NULL) return; if (white_x < 0.0 || white_y < 0.0 || red_x < 0.0 || red_y < 0.0 || green_x < 0.0 || green_y < 0.0 || blue_x < 0.0 || blue_y < 0.0) { png_warning(png_ptr, "Ignoring attempt to set negative chromaticity value"); return; } if (white_x > 21474.83 || white_y > 21474.83 || red_x > 21474.83 || red_y > 21474.83 || green_x > 21474.83 || green_y > 21474.83 || blue_x > 21474.83 || blue_y > 21474.83) { png_warning(png_ptr, "Ignoring attempt to set chromaticity value exceeding 21474.83"); return; } info_ptr->x_white = (float)white_x; info_ptr->y_white = (float)white_y; info_ptr->x_red = (float)red_x; info_ptr->y_red = (float)red_y; info_ptr->x_green = (float)green_x; info_ptr->y_green = (float)green_y; info_ptr->x_blue = (float)blue_x; info_ptr->y_blue = (float)blue_y; #ifdef PNG_FIXED_POINT_SUPPORTED info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5); info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5); info_ptr->int_x_red = (png_fixed_point)( red_x*100000.+0.5); info_ptr->int_y_red = (png_fixed_point)( red_y*100000.+0.5); info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5); info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5); info_ptr->int_x_blue = (png_fixed_point)( blue_x*100000.+0.5); info_ptr->int_y_blue = (png_fixed_point)( blue_y*100000.+0.5); #endif info_ptr->valid |= PNG_INFO_cHRM; } #endif #ifdef PNG_FIXED_POINT_SUPPORTED void PNGAPI png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x, png_fixed_point blue_y) { png_debug1(1, "in %s storage function\n", "cHRM"); if (png_ptr == NULL || info_ptr == NULL) return; if (white_x < 0 || white_y < 0 || red_x < 0 || red_y < 0 || green_x < 0 || green_y < 0 || blue_x < 0 || blue_y < 0) { png_warning(png_ptr, "Ignoring attempt to set negative chromaticity value"); return; } if (white_x > (double) PNG_MAX_UINT || white_y > (double) PNG_MAX_UINT || red_x > (double) PNG_MAX_UINT || red_y > (double) PNG_MAX_UINT || green_x > (double) PNG_MAX_UINT || green_y > (double) PNG_MAX_UINT || blue_x > (double) PNG_MAX_UINT || blue_y > (double) PNG_MAX_UINT) { png_warning(png_ptr, "Ignoring attempt to set chromaticity value exceeding 21474.83"); return; } info_ptr->int_x_white = white_x; info_ptr->int_y_white = white_y; info_ptr->int_x_red = red_x; info_ptr->int_y_red = red_y; info_ptr->int_x_green = green_x; info_ptr->int_y_green = green_y; info_ptr->int_x_blue = blue_x; info_ptr->int_y_blue = blue_y; #ifdef PNG_FLOATING_POINT_SUPPORTED info_ptr->x_white = (float)(white_x/100000.); info_ptr->y_white = (float)(white_y/100000.); info_ptr->x_red = (float)( red_x/100000.); info_ptr->y_red = (float)( red_y/100000.); info_ptr->x_green = (float)(green_x/100000.); info_ptr->y_green = (float)(green_y/100000.); info_ptr->x_blue = (float)( blue_x/100000.); info_ptr->y_blue = (float)( blue_y/100000.); #endif info_ptr->valid |= PNG_INFO_cHRM; } #endif #endif #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED void PNGAPI png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma) { double gamma; png_debug1(1, "in %s storage function\n", "gAMA"); if (png_ptr == NULL || info_ptr == NULL) return; /* Check for overflow */ if (file_gamma > 21474.83) { png_warning(png_ptr, "Limiting gamma to 21474.83"); gamma=21474.83; } else gamma=file_gamma; info_ptr->gamma = (float)gamma; #ifdef PNG_FIXED_POINT_SUPPORTED info_ptr->int_gamma = (int)(gamma*100000.+.5); #endif info_ptr->valid |= PNG_INFO_gAMA; if(gamma == 0.0) png_warning(png_ptr, "Setting gamma=0"); } #endif void PNGAPI png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point int_gamma) { png_fixed_point gamma; png_debug1(1, "in %s storage function\n", "gAMA"); if (png_ptr == NULL || info_ptr == NULL) return; if (int_gamma > (png_fixed_point) PNG_MAX_UINT) { png_warning(png_ptr, "Limiting gamma to 21474.83"); gamma=PNG_MAX_UINT; } else { if (int_gamma < 0) { png_warning(png_ptr, "Setting negative gamma to zero"); gamma=0; } else gamma=int_gamma; } #ifdef PNG_FLOATING_POINT_SUPPORTED info_ptr->gamma = (float)(gamma/100000.); #endif #ifdef PNG_FIXED_POINT_SUPPORTED info_ptr->int_gamma = gamma; #endif info_ptr->valid |= PNG_INFO_gAMA; if(gamma == 0) png_warning(png_ptr, "Setting gamma=0"); } #endif #if defined(PNG_hIST_SUPPORTED) void PNGAPI png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist) { int i; png_debug1(1, "in %s storage function\n", "hIST"); if (png_ptr == NULL || info_ptr == NULL) return; if (info_ptr->num_palette == 0) { png_warning(png_ptr, "Palette size 0, hIST allocation skipped."); return; } #ifdef PNG_FREE_ME_SUPPORTED png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); #endif /* Changed from info->num_palette to 256 in version 1.2.1 */ png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, (png_uint_32)(256 * sizeof (png_uint_16))); if (png_ptr->hist == NULL) { png_warning(png_ptr, "Insufficient memory for hIST chunk data."); return; } for (i = 0; i < info_ptr->num_palette; i++) png_ptr->hist[i] = hist[i]; info_ptr->hist = png_ptr->hist; info_ptr->valid |= PNG_INFO_hIST; #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_HIST; #else png_ptr->flags |= PNG_FLAG_FREE_HIST; #endif } #endif void PNGAPI png_set_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int interlace_type, int compression_type, int filter_type) { int rowbytes_per_pixel; png_debug1(1, "in %s storage function\n", "IHDR"); if (png_ptr == NULL || info_ptr == NULL) return; /* check for width and height valid values */ if (width == 0 || height == 0) png_error(png_ptr, "Image width or height is zero in IHDR"); if (width > PNG_MAX_UINT || height > PNG_MAX_UINT) png_error(png_ptr, "Invalid image size in IHDR"); /* check other values */ if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && bit_depth != 8 && bit_depth != 16) png_error(png_ptr, "Invalid bit depth in IHDR"); if (color_type < 0 || color_type == 1 || color_type == 5 || color_type > 6) png_error(png_ptr, "Invalid color type in IHDR"); if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) || ((color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_GRAY_ALPHA || color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8)) png_error(png_ptr, "Invalid color type/bit depth combination in IHDR"); if (interlace_type >= PNG_INTERLACE_LAST) png_error(png_ptr, "Unknown interlace method in IHDR"); if (compression_type != PNG_COMPRESSION_TYPE_BASE) png_error(png_ptr, "Unknown compression method in IHDR"); #if defined(PNG_MNG_FEATURES_SUPPORTED) /* Accept filter_method 64 (intrapixel differencing) only if * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and * 2. Libpng did not read a PNG signature (this filter_method is only * used in PNG datastreams that are embedded in MNG datastreams) and * 3. The application called png_permit_mng_features with a mask that * included PNG_FLAG_MNG_FILTER_64 and * 4. The filter_method is 64 and * 5. The color_type is RGB or RGBA */ if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted) png_warning(png_ptr,"MNG features are not allowed in a PNG datastream\n"); if(filter_type != PNG_FILTER_TYPE_BASE) { if(!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA))) png_error(png_ptr, "Unknown filter method in IHDR"); if(png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) png_warning(png_ptr, "Invalid filter method in IHDR"); } #else if(filter_type != PNG_FILTER_TYPE_BASE) png_error(png_ptr, "Unknown filter method in IHDR"); #endif info_ptr->width = width; info_ptr->height = height; info_ptr->bit_depth = (png_byte)bit_depth; info_ptr->color_type =(png_byte) color_type; info_ptr->compression_type = (png_byte)compression_type; info_ptr->filter_type = (png_byte)filter_type; info_ptr->interlace_type = (png_byte)interlace_type; if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) info_ptr->channels = 1; else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) info_ptr->channels = 3; else info_ptr->channels = 1; if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) info_ptr->channels++; info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); /* check for overflow */ rowbytes_per_pixel = (info_ptr->pixel_depth + 7) >> 3; if ( width > PNG_MAX_UINT/rowbytes_per_pixel - 64) { png_warning(png_ptr, "Width too large to process image data; rowbytes will overflow."); info_ptr->rowbytes = (png_size_t)0; } else info_ptr->rowbytes = (info_ptr->width * info_ptr->pixel_depth + 7) >> 3; } #if defined(PNG_oFFs_SUPPORTED) void PNGAPI png_set_oFFs(png_structp png_ptr, png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, int unit_type) { png_debug1(1, "in %s storage function\n", "oFFs"); if (png_ptr == NULL || info_ptr == NULL) return; info_ptr->x_offset = offset_x; info_ptr->y_offset = offset_y; info_ptr->offset_unit_type = (png_byte)unit_type; info_ptr->valid |= PNG_INFO_oFFs; } #endif #if defined(PNG_pCAL_SUPPORTED) void PNGAPI png_set_pCAL(png_structp png_ptr, png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params) { png_uint_32 length; int i; png_debug1(1, "in %s storage function\n", "pCAL"); if (png_ptr == NULL || info_ptr == NULL) return; length = png_strlen(purpose) + 1; png_debug1(3, "allocating purpose for info (%lu bytes)\n", length); info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length); if (info_ptr->pcal_purpose == NULL) { png_warning(png_ptr, "Insufficient memory for pCAL purpose."); return; } png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length); png_debug(3, "storing X0, X1, type, and nparams in info\n"); info_ptr->pcal_X0 = X0; info_ptr->pcal_X1 = X1; info_ptr->pcal_type = (png_byte)type; info_ptr->pcal_nparams = (png_byte)nparams; length = png_strlen(units) + 1; png_debug1(3, "allocating units for info (%lu bytes)\n", length); info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length); if (info_ptr->pcal_units == NULL) { png_warning(png_ptr, "Insufficient memory for pCAL units."); return; } png_memcpy(info_ptr->pcal_units, units, (png_size_t)length); info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr, (png_uint_32)((nparams + 1) * sizeof(png_charp))); if (info_ptr->pcal_params == NULL) { png_warning(png_ptr, "Insufficient memory for pCAL params."); return; } info_ptr->pcal_params[nparams] = NULL; for (i = 0; i < nparams; i++) { length = png_strlen(params[i]) + 1; png_debug2(3, "allocating parameter %d for info (%lu bytes)\n", i, length); info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length); if (info_ptr->pcal_params[i] == NULL) { png_warning(png_ptr, "Insufficient memory for pCAL parameter."); return; } png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length); } info_ptr->valid |= PNG_INFO_pCAL; #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_PCAL; #endif } #endif #if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED void PNGAPI png_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width, double height) { png_debug1(1, "in %s storage function\n", "sCAL"); if (png_ptr == NULL || info_ptr == NULL) return; info_ptr->scal_unit = (png_byte)unit; info_ptr->scal_pixel_width = width; info_ptr->scal_pixel_height = height; info_ptr->valid |= PNG_INFO_sCAL; } #else #ifdef PNG_FIXED_POINT_SUPPORTED void PNGAPI png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr, int unit, png_charp swidth, png_charp sheight) { png_uint_32 length; png_debug1(1, "in %s storage function\n", "sCAL"); if (png_ptr == NULL || info_ptr == NULL) return; info_ptr->scal_unit = (png_byte)unit; length = png_strlen(swidth) + 1; png_debug1(3, "allocating unit for info (%d bytes)\n", length); info_ptr->scal_s_width = (png_charp)png_malloc(png_ptr, length); png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length); length = png_strlen(sheight) + 1; png_debug1(3, "allocating unit for info (%d bytes)\n", length); info_ptr->scal_s_height = (png_charp)png_malloc(png_ptr, length); png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length); info_ptr->valid |= PNG_INFO_sCAL; #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_SCAL; #endif } #endif #endif #endif #if defined(PNG_pHYs_SUPPORTED) void PNGAPI png_set_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type) { png_debug1(1, "in %s storage function\n", "pHYs"); if (png_ptr == NULL || info_ptr == NULL) return; info_ptr->x_pixels_per_unit = res_x; info_ptr->y_pixels_per_unit = res_y; info_ptr->phys_unit_type = (png_byte)unit_type; info_ptr->valid |= PNG_INFO_pHYs; } #endif void PNGAPI png_set_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp palette, int num_palette) { png_debug1(1, "in %s storage function\n", "PLTE"); if (png_ptr == NULL || info_ptr == NULL) return; /* * It may not actually be necessary to set png_ptr->palette here; * we do it for backward compatibility with the way the png_handle_tRNS * function used to do the allocation. */ #ifdef PNG_FREE_ME_SUPPORTED png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); #endif /* Changed in libpng-1.2.1 to allocate 256 instead of num_palette entries, in case of an invalid PNG file that has too-large sample values. */ png_ptr->palette = (png_colorp)png_zalloc(png_ptr, (uInt)256, sizeof (png_color)); if (png_ptr->palette == NULL) png_error(png_ptr, "Unable to malloc palette"); png_memcpy(png_ptr->palette, palette, num_palette * sizeof (png_color)); info_ptr->palette = png_ptr->palette; info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_PLTE; #else png_ptr->flags |= PNG_FLAG_FREE_PLTE; #endif info_ptr->valid |= PNG_INFO_PLTE; } #if defined(PNG_sBIT_SUPPORTED) void PNGAPI png_set_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p sig_bit) { png_debug1(1, "in %s storage function\n", "sBIT"); if (png_ptr == NULL || info_ptr == NULL) return; png_memcpy(&(info_ptr->sig_bit), sig_bit, sizeof (png_color_8)); info_ptr->valid |= PNG_INFO_sBIT; } #endif #if defined(PNG_sRGB_SUPPORTED) void PNGAPI png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent) { png_debug1(1, "in %s storage function\n", "sRGB"); if (png_ptr == NULL || info_ptr == NULL) return; info_ptr->srgb_intent = (png_byte)intent; info_ptr->valid |= PNG_INFO_sRGB; } void PNGAPI png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, int intent) { #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED float file_gamma; #endif #ifdef PNG_FIXED_POINT_SUPPORTED png_fixed_point int_file_gamma; #endif #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; #endif #ifdef PNG_FIXED_POINT_SUPPORTED png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y, int_blue_x, int_blue_y; #endif #endif png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM"); if (png_ptr == NULL || info_ptr == NULL) return; png_set_sRGB(png_ptr, info_ptr, intent); #if defined(PNG_gAMA_SUPPORTED) #ifdef PNG_FLOATING_POINT_SUPPORTED file_gamma = (float).45455; png_set_gAMA(png_ptr, info_ptr, file_gamma); #endif #ifdef PNG_FIXED_POINT_SUPPORTED int_file_gamma = 45455L; png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); #endif #endif #if defined(PNG_cHRM_SUPPORTED) #ifdef PNG_FIXED_POINT_SUPPORTED int_white_x = 31270L; int_white_y = 32900L; int_red_x = 64000L; int_red_y = 33000L; int_green_x = 30000L; int_green_y = 60000L; int_blue_x = 15000L; int_blue_y = 6000L; png_set_cHRM_fixed(png_ptr, info_ptr, int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y, int_blue_x, int_blue_y); #endif #ifdef PNG_FLOATING_POINT_SUPPORTED white_x = (float).3127; white_y = (float).3290; red_x = (float).64; red_y = (float).33; green_x = (float).30; green_y = (float).60; blue_x = (float).15; blue_y = (float).06; png_set_cHRM(png_ptr, info_ptr, white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); #endif #endif } #endif #if defined(PNG_iCCP_SUPPORTED) void PNGAPI png_set_iCCP(png_structp png_ptr, png_infop info_ptr, png_charp name, int compression_type, png_charp profile, png_uint_32 proflen) { png_charp new_iccp_name; png_charp new_iccp_profile; png_debug1(1, "in %s storage function\n", "iCCP"); if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) return; new_iccp_name = (png_charp)png_malloc(png_ptr, png_strlen(name)+1); png_strcpy(new_iccp_name, name); new_iccp_profile = (png_charp)png_malloc(png_ptr, proflen); png_memcpy(new_iccp_profile, profile, (png_size_t)proflen); png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0); info_ptr->iccp_proflen = proflen; info_ptr->iccp_name = new_iccp_name; info_ptr->iccp_profile = new_iccp_profile; /* Compression is always zero but is here so the API and info structure * does not have to change if we introduce multiple compression types */ info_ptr->iccp_compression = (png_byte)compression_type; #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_ICCP; #endif info_ptr->valid |= PNG_INFO_iCCP; } #endif #if defined(PNG_TEXT_SUPPORTED) void PNGAPI png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text) { int ret; ret=png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); if (ret) png_error(png_ptr, "Insufficient memory to store text"); } int /* PRIVATE */ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, int num_text) { int i; png_debug1(1, "in %s storage function\n", (png_ptr->chunk_name[0] == '\0' ? "text" : (png_const_charp)png_ptr->chunk_name)); if (png_ptr == NULL || info_ptr == NULL || num_text == 0) return(0); /* Make sure we have enough space in the "text" array in info_struct * to hold all of the incoming text_ptr objects. */ if (info_ptr->num_text + num_text > info_ptr->max_text) { if (info_ptr->text != NULL) { png_textp old_text; int old_max; old_max = info_ptr->max_text; info_ptr->max_text = info_ptr->num_text + num_text + 8; old_text = info_ptr->text; info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_uint_32)(info_ptr->max_text * sizeof (png_text))); if (info_ptr->text == NULL) { png_free(png_ptr, old_text); return(1); } png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * sizeof(png_text))); png_free(png_ptr, old_text); } else { info_ptr->max_text = num_text + 8; info_ptr->num_text = 0; info_ptr->text = (png_textp)png_malloc_warn(png_ptr, (png_uint_32)(info_ptr->max_text * sizeof (png_text))); if (info_ptr->text == NULL) return(1); #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_TEXT; #endif } png_debug1(3, "allocated %d entries for info_ptr->text\n", info_ptr->max_text); } for (i = 0; i < num_text; i++) { png_size_t text_length,key_len; png_size_t lang_len,lang_key_len; png_textp textp = &(info_ptr->text[info_ptr->num_text]); if (text_ptr[i].key == NULL) continue; key_len = png_strlen(text_ptr[i].key); if(text_ptr[i].compression <= 0) { lang_len = 0; lang_key_len = 0; } else #ifdef PNG_iTXt_SUPPORTED { /* set iTXt data */ if (text_ptr[i].lang != NULL) lang_len = png_strlen(text_ptr[i].lang); else lang_len = 0; if (text_ptr[i].lang_key != NULL) lang_key_len = png_strlen(text_ptr[i].lang_key); else lang_key_len = 0; } #else { png_warning(png_ptr, "iTXt chunk not supported."); continue; } #endif if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0') { text_length = 0; #ifdef PNG_iTXt_SUPPORTED if(text_ptr[i].compression > 0) textp->compression = PNG_ITXT_COMPRESSION_NONE; else #endif textp->compression = PNG_TEXT_COMPRESSION_NONE; } else { text_length = png_strlen(text_ptr[i].text); textp->compression = text_ptr[i].compression; } textp->key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + text_length + lang_len + lang_key_len + 4)); if (textp->key == NULL) return(1); png_debug2(2, "Allocated %lu bytes at %x in png_set_text\n", (png_uint_32)(key_len + lang_len + lang_key_len + text_length + 4), (int)textp->key); png_memcpy(textp->key, text_ptr[i].key, (png_size_t)(key_len)); *(textp->key+key_len) = '\0'; #ifdef PNG_iTXt_SUPPORTED if (text_ptr[i].compression > 0) { textp->lang=textp->key + key_len + 1; png_memcpy(textp->lang, text_ptr[i].lang, lang_len); *(textp->lang+lang_len) = '\0'; textp->lang_key=textp->lang + lang_len + 1; png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len); *(textp->lang_key+lang_key_len) = '\0'; textp->text=textp->lang_key + lang_key_len + 1; } else #endif { #ifdef PNG_iTXt_SUPPORTED textp->lang=NULL; textp->lang_key=NULL; #endif textp->text=textp->key + key_len + 1; } if(text_length) png_memcpy(textp->text, text_ptr[i].text, (png_size_t)(text_length)); *(textp->text+text_length) = '\0'; #ifdef PNG_iTXt_SUPPORTED if(textp->compression > 0) { textp->text_length = 0; textp->itxt_length = text_length; } else #endif { textp->text_length = text_length; #ifdef PNG_iTXt_SUPPORTED textp->itxt_length = 0; #endif } info_ptr->text[info_ptr->num_text]= *textp; info_ptr->num_text++; png_debug1(3, "transferred text chunk %d\n", info_ptr->num_text); } return(0); } #endif #if defined(PNG_tIME_SUPPORTED) void PNGAPI png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time) { png_debug1(1, "in %s storage function\n", "tIME"); if (png_ptr == NULL || info_ptr == NULL || (png_ptr->mode & PNG_WROTE_tIME)) return; png_memcpy(&(info_ptr->mod_time), mod_time, sizeof (png_time)); info_ptr->valid |= PNG_INFO_tIME; } #endif #if defined(PNG_tRNS_SUPPORTED) void PNGAPI png_set_tRNS(png_structp png_ptr, png_infop info_ptr, png_bytep trans, int num_trans, png_color_16p trans_values) { png_debug1(1, "in %s storage function\n", "tRNS"); if (png_ptr == NULL || info_ptr == NULL) return; if (trans != NULL) { /* * It may not actually be necessary to set png_ptr->trans here; * we do it for backward compatibility with the way the png_handle_tRNS * function used to do the allocation. */ #ifdef PNG_FREE_ME_SUPPORTED png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); #endif /* Changed from num_trans to 256 in version 1.2.1 */ png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr, (png_uint_32)256); png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans); #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_TRNS; #else png_ptr->flags |= PNG_FLAG_FREE_TRNS; #endif } if (trans_values != NULL) { png_memcpy(&(info_ptr->trans_values), trans_values, sizeof(png_color_16)); if (num_trans == 0) num_trans = 1; } info_ptr->num_trans = (png_uint_16)num_trans; info_ptr->valid |= PNG_INFO_tRNS; } #endif #if defined(PNG_sPLT_SUPPORTED) void PNGAPI png_set_sPLT(png_structp png_ptr, png_infop info_ptr, png_sPLT_tp entries, int nentries) { png_sPLT_tp np; int i; np = (png_sPLT_tp)png_malloc_warn(png_ptr, (info_ptr->splt_palettes_num + nentries) * sizeof(png_sPLT_t)); if (np == NULL) { png_warning(png_ptr, "No memory for sPLT palettes."); return; } png_memcpy(np, info_ptr->splt_palettes, info_ptr->splt_palettes_num * sizeof(png_sPLT_t)); png_free(png_ptr, info_ptr->splt_palettes); info_ptr->splt_palettes=NULL; for (i = 0; i < nentries; i++) { png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; png_sPLT_tp from = entries + i; to->name = (png_charp)png_malloc(png_ptr, png_strlen(from->name) + 1); png_strcpy(to->name, from->name); to->entries = (png_sPLT_entryp)png_malloc(png_ptr, from->nentries * sizeof(png_sPLT_t)); png_memcpy(to->entries, from->entries, from->nentries * sizeof(png_sPLT_t)); to->nentries = from->nentries; to->depth = from->depth; } info_ptr->splt_palettes = np; info_ptr->splt_palettes_num += nentries; info_ptr->valid |= PNG_INFO_sPLT; #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_SPLT; #endif } #endif /* PNG_sPLT_SUPPORTED */ #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) void PNGAPI png_set_unknown_chunks(png_structp png_ptr, png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns) { png_unknown_chunkp np; int i; if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) return; np = (png_unknown_chunkp)png_malloc_warn(png_ptr, (info_ptr->unknown_chunks_num + num_unknowns) * sizeof(png_unknown_chunk)); if (np == NULL) { png_warning(png_ptr, "Out of memory while processing unknown chunk."); return; } png_memcpy(np, info_ptr->unknown_chunks, info_ptr->unknown_chunks_num * sizeof(png_unknown_chunk)); png_free(png_ptr, info_ptr->unknown_chunks); info_ptr->unknown_chunks=NULL; for (i = 0; i < num_unknowns; i++) { png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; png_unknown_chunkp from = unknowns + i; png_strcpy((png_charp)to->name, (png_charp)from->name); to->data = (png_bytep)png_malloc(png_ptr, from->size); if (to->data == NULL) png_warning(png_ptr, "Out of memory while processing unknown chunk."); else { png_memcpy(to->data, from->data, from->size); to->size = from->size; /* note our location in the read or write sequence */ to->location = (png_byte)(png_ptr->mode & 0xff); } } info_ptr->unknown_chunks = np; info_ptr->unknown_chunks_num += num_unknowns; #ifdef PNG_FREE_ME_SUPPORTED info_ptr->free_me |= PNG_FREE_UNKN; #endif } void PNGAPI png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr, int chunk, int location) { if(png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < (int)info_ptr->unknown_chunks_num) info_ptr->unknown_chunks[chunk].location = (png_byte)location; } #endif #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) void PNGAPI png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted) { /* This function is deprecated in favor of png_permit_mng_features() and will be removed from libpng-2.0.0 */ png_debug(1, "in png_permit_empty_plte, DEPRECATED.\n"); if (png_ptr == NULL) return; png_ptr->mng_features_permitted = (png_byte) ((png_ptr->mng_features_permitted & (~(PNG_FLAG_MNG_EMPTY_PLTE))) | ((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE))); } #endif #if defined(PNG_MNG_FEATURES_SUPPORTED) png_uint_32 PNGAPI png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features) { png_debug(1, "in png_permit_mng_features\n"); if (png_ptr == NULL) return (png_uint_32)0; png_ptr->mng_features_permitted = (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); return (png_uint_32)png_ptr->mng_features_permitted; } #endif #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) void PNGAPI png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep chunk_list, int num_chunks) { png_bytep new_list, p; int i, old_num_chunks; if (num_chunks == 0) { if(keep == HANDLE_CHUNK_ALWAYS || keep == HANDLE_CHUNK_IF_SAFE) png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; else png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; if(keep == HANDLE_CHUNK_ALWAYS) png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; else png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; return; } if (chunk_list == NULL) return; old_num_chunks=png_ptr->num_chunk_list; new_list=(png_bytep)png_malloc(png_ptr, (png_uint_32)(5*(num_chunks+old_num_chunks))); if(png_ptr->chunk_list != NULL) { png_memcpy(new_list, png_ptr->chunk_list, (png_size_t)(5*old_num_chunks)); png_free(png_ptr, png_ptr->chunk_list); png_ptr->chunk_list=NULL; } png_memcpy(new_list+5*old_num_chunks, chunk_list, (png_size_t)(5*num_chunks)); for (p=new_list+5*old_num_chunks+4, i=0; inum_chunk_list=old_num_chunks+num_chunks; png_ptr->chunk_list=new_list; #ifdef PNG_FREE_ME_SUPPORTED png_ptr->free_me |= PNG_FREE_LIST; #endif } #endif #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) void PNGAPI png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn) { png_debug(1, "in png_set_read_user_chunk_fn\n"); png_ptr->read_user_chunk_fn = read_user_chunk_fn; png_ptr->user_chunk_ptr = user_chunk_ptr; } #endif #if defined(PNG_INFO_IMAGE_SUPPORTED) void PNGAPI png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) { png_debug1(1, "in %s storage function\n", "rows"); if (png_ptr == NULL || info_ptr == NULL) return; if(info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); info_ptr->row_pointers = row_pointers; if(row_pointers) info_ptr->valid |= PNG_INFO_IDAT; } #endif void PNGAPI png_set_compression_buffer_size(png_structp png_ptr, png_uint_32 size) { if(png_ptr->zbuf) png_free(png_ptr, png_ptr->zbuf); png_ptr->zbuf_size = (png_size_t)size; png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } void PNGAPI png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask) { if (png_ptr && info_ptr) info_ptr->valid &= ~(mask); } #ifndef PNG_1_0_X #ifdef PNG_ASSEMBLER_CODE_SUPPORTED /* this function was added to libpng 1.2.0 and should always exist by default */ void PNGAPI png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags) { png_uint_32 settable_asm_flags; png_uint_32 settable_mmx_flags; settable_mmx_flags = #ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW PNG_ASM_FLAG_MMX_READ_COMBINE_ROW | #endif #ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE PNG_ASM_FLAG_MMX_READ_INTERLACE | #endif #ifdef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW PNG_ASM_FLAG_MMX_READ_FILTER_SUB | PNG_ASM_FLAG_MMX_READ_FILTER_UP | PNG_ASM_FLAG_MMX_READ_FILTER_AVG | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH | #endif 0; /* could be some non-MMX ones in the future, but not currently: */ settable_asm_flags = settable_mmx_flags; if (!(png_ptr->asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_COMPILED) || !(png_ptr->asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU)) { /* clear all MMX flags if MMX isn't supported */ settable_asm_flags &= ~settable_mmx_flags; png_ptr->asm_flags &= ~settable_mmx_flags; } /* we're replacing the settable bits with those passed in by the user, * so first zero them out of the master copy, then logical-OR in the * allowed subset that was requested */ png_ptr->asm_flags &= ~settable_asm_flags; /* zero them */ png_ptr->asm_flags |= (asm_flags & settable_asm_flags); /* set them */ } #endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ #ifdef PNG_ASSEMBLER_CODE_SUPPORTED /* this function was added to libpng 1.2.0 */ void PNGAPI png_set_mmx_thresholds (png_structp png_ptr, png_byte mmx_bitdepth_threshold, png_uint_32 mmx_rowbytes_threshold) { png_ptr->mmx_bitdepth_threshold = mmx_bitdepth_threshold; png_ptr->mmx_rowbytes_threshold = mmx_rowbytes_threshold; } #endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ #endif /* ?PNG_1_0_X */ gamera-3.3.3/src/libpng-1.2.5/pngtrans.c0000644000076500000000000004707210714675701016467 0ustar chriswheel /* pngtrans.c - transforms the data in a row (used by both readers and writers) * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ #define PNG_INTERNAL #include "png.h" #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* turn on BGR-to-RGB mapping */ void PNGAPI png_set_bgr(png_structp png_ptr) { png_debug(1, "in png_set_bgr\n"); png_ptr->transformations |= PNG_BGR; } #endif #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* turn on 16 bit byte swapping */ void PNGAPI png_set_swap(png_structp png_ptr) { png_debug(1, "in png_set_swap\n"); if (png_ptr->bit_depth == 16) png_ptr->transformations |= PNG_SWAP_BYTES; } #endif #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) /* turn on pixel packing */ void PNGAPI png_set_packing(png_structp png_ptr) { png_debug(1, "in png_set_packing\n"); if (png_ptr->bit_depth < 8) { png_ptr->transformations |= PNG_PACK; png_ptr->usr_bit_depth = 8; } } #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) /* turn on packed pixel swapping */ void PNGAPI png_set_packswap(png_structp png_ptr) { png_debug(1, "in png_set_packswap\n"); if (png_ptr->bit_depth < 8) png_ptr->transformations |= PNG_PACKSWAP; } #endif #if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) void PNGAPI png_set_shift(png_structp png_ptr, png_color_8p true_bits) { png_debug(1, "in png_set_shift\n"); png_ptr->transformations |= PNG_SHIFT; png_ptr->shift = *true_bits; } #endif #if defined(PNG_READ_INTERLACING_SUPPORTED) || \ defined(PNG_WRITE_INTERLACING_SUPPORTED) int PNGAPI png_set_interlace_handling(png_structp png_ptr) { png_debug(1, "in png_set_interlace handling\n"); if (png_ptr->interlaced) { png_ptr->transformations |= PNG_INTERLACE; return (7); } return (1); } #endif #if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) /* Add a filler byte on read, or remove a filler or alpha byte on write. * The filler type has changed in v0.95 to allow future 2-byte fillers * for 48-bit input data, as well as to avoid problems with some compilers * that don't like bytes as parameters. */ void PNGAPI png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) { png_debug(1, "in png_set_filler\n"); png_ptr->transformations |= PNG_FILLER; png_ptr->filler = (png_byte)filler; if (filler_loc == PNG_FILLER_AFTER) png_ptr->flags |= PNG_FLAG_FILLER_AFTER; else png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; /* This should probably go in the "do_filler" routine. * I attempted to do that in libpng-1.0.1a but that caused problems * so I restored it in libpng-1.0.2a */ if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) { png_ptr->usr_channels = 4; } /* Also I added this in libpng-1.0.2a (what happens when we expand * a less-than-8-bit grayscale to GA? */ if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) { png_ptr->usr_channels = 2; } } #endif #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) void PNGAPI png_set_swap_alpha(png_structp png_ptr) { png_debug(1, "in png_set_swap_alpha\n"); png_ptr->transformations |= PNG_SWAP_ALPHA; } #endif #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) void PNGAPI png_set_invert_alpha(png_structp png_ptr) { png_debug(1, "in png_set_invert_alpha\n"); png_ptr->transformations |= PNG_INVERT_ALPHA; } #endif #if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) void PNGAPI png_set_invert_mono(png_structp png_ptr) { png_debug(1, "in png_set_invert_mono\n"); png_ptr->transformations |= PNG_INVERT_MONO; } /* invert monochrome grayscale data */ void /* PRIVATE */ png_do_invert(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_invert\n"); /* This test removed from libpng version 1.0.13 and 1.2.0: * if (row_info->bit_depth == 1 && */ #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row == NULL || row_info == NULL) return; #endif if (row_info->color_type == PNG_COLOR_TYPE_GRAY) { png_bytep rp = row; png_uint_32 i; png_uint_32 istop = row_info->rowbytes; for (i = 0; i < istop; i++) { *rp = (png_byte)(~(*rp)); rp++; } } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && row_info->bit_depth == 8) { png_bytep rp = row; png_uint_32 i; png_uint_32 istop = row_info->rowbytes; for (i = 0; i < istop; i+=2) { *rp = (png_byte)(~(*rp)); rp+=2; } } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && row_info->bit_depth == 16) { png_bytep rp = row; png_uint_32 i; png_uint_32 istop = row_info->rowbytes; for (i = 0; i < istop; i+=4) { *rp = (png_byte)(~(*rp)); *(rp+1) = (png_byte)(~(*(rp+1))); rp+=4; } } } #endif #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) /* swaps byte order on 16 bit depth images */ void /* PRIVATE */ png_do_swap(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_swap\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif row_info->bit_depth == 16) { png_bytep rp = row; png_uint_32 i; png_uint_32 istop= row_info->width * row_info->channels; for (i = 0; i < istop; i++, rp += 2) { png_byte t = *rp; *rp = *(rp + 1); *(rp + 1) = t; } } } #endif #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) static png_byte onebppswaptable[256] = { 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF }; static png_byte twobppswaptable[256] = { 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF }; static png_byte fourbppswaptable[256] = { 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF }; /* swaps pixel packing order within bytes */ void /* PRIVATE */ png_do_packswap(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_packswap\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif row_info->bit_depth < 8) { png_bytep rp, end, table; end = row + row_info->rowbytes; if (row_info->bit_depth == 1) table = onebppswaptable; else if (row_info->bit_depth == 2) table = twobppswaptable; else if (row_info->bit_depth == 4) table = fourbppswaptable; else return; for (rp = row; rp < end; rp++) *rp = table[*rp]; } } #endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ #if defined(PNG_WRITE_FILLER_SUPPORTED) || \ defined(PNG_READ_STRIP_ALPHA_SUPPORTED) /* remove filler or alpha byte(s) */ void /* PRIVATE */ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) { png_debug(1, "in png_do_strip_filler\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL) #endif { /* if (row_info->color_type == PNG_COLOR_TYPE_RGB || row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) */ png_bytep sp=row; png_bytep dp=row; png_uint_32 row_width=row_info->width; png_uint_32 i; if (row_info->channels == 4) { if (row_info->bit_depth == 8) { /* This converts from RGBX or RGBA to RGB */ if (flags & PNG_FLAG_FILLER_AFTER) { dp+=3; sp+=4; for (i = 1; i < row_width; i++) { *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; sp++; } } /* This converts from XRGB or ARGB to RGB */ else { for (i = 0; i < row_width; i++) { sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; } } row_info->pixel_depth = 24; row_info->rowbytes = row_width * 3; } else /* if (row_info->bit_depth == 16) */ { if (flags & PNG_FLAG_FILLER_AFTER) { /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ sp += 8; dp += 6; for (i = 1; i < row_width; i++) { /* This could be (although png_memcpy is probably slower): png_memcpy(dp, sp, 6); sp += 8; dp += 6; */ *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; sp += 2; } } else { /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ for (i = 0; i < row_width; i++) { /* This could be (although png_memcpy is probably slower): png_memcpy(dp, sp, 6); sp += 8; dp += 6; */ sp+=2; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; *dp++ = *sp++; } } row_info->pixel_depth = 48; row_info->rowbytes = row_width * 6; } row_info->channels = 3; row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; } /* else if (row_info->color_type == PNG_COLOR_TYPE_GRAY || row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) */ else if (row_info->channels == 2) { if (row_info->bit_depth == 8) { /* This converts from GX or GA to G */ if (flags & PNG_FLAG_FILLER_AFTER) { for (i = 0; i < row_width; i++) { *dp++ = *sp++; sp++; } } /* This converts from XG or AG to G */ else { for (i = 0; i < row_width; i++) { sp++; *dp++ = *sp++; } } row_info->pixel_depth = 8; row_info->rowbytes = row_width; } else /* if (row_info->bit_depth == 16) */ { if (flags & PNG_FLAG_FILLER_AFTER) { /* This converts from GGXX or GGAA to GG */ sp += 4; dp += 2; for (i = 1; i < row_width; i++) { *dp++ = *sp++; *dp++ = *sp++; sp += 2; } } else { /* This converts from XXGG or AAGG to GG */ for (i = 0; i < row_width; i++) { sp += 2; *dp++ = *sp++; *dp++ = *sp++; } } row_info->pixel_depth = 16; row_info->rowbytes = row_width * 2; } row_info->channels = 1; row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; } } } #endif #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) /* swaps red and blue bytes within a pixel */ void /* PRIVATE */ png_do_bgr(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_bgr\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif (row_info->color_type & PNG_COLOR_MASK_COLOR)) { png_uint_32 row_width = row_info->width; if (row_info->bit_depth == 8) { if (row_info->color_type == PNG_COLOR_TYPE_RGB) { png_bytep rp; png_uint_32 i; for (i = 0, rp = row; i < row_width; i++, rp += 3) { png_byte save = *rp; *rp = *(rp + 2); *(rp + 2) = save; } } else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { png_bytep rp; png_uint_32 i; for (i = 0, rp = row; i < row_width; i++, rp += 4) { png_byte save = *rp; *rp = *(rp + 2); *(rp + 2) = save; } } } else if (row_info->bit_depth == 16) { if (row_info->color_type == PNG_COLOR_TYPE_RGB) { png_bytep rp; png_uint_32 i; for (i = 0, rp = row; i < row_width; i++, rp += 6) { png_byte save = *rp; *rp = *(rp + 4); *(rp + 4) = save; save = *(rp + 1); *(rp + 1) = *(rp + 5); *(rp + 5) = save; } } else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { png_bytep rp; png_uint_32 i; for (i = 0, rp = row; i < row_width; i++, rp += 8) { png_byte save = *rp; *rp = *(rp + 4); *(rp + 4) = save; save = *(rp + 1); *(rp + 1) = *(rp + 5); *(rp + 5) = save; } } } } } #endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ defined(PNG_LEGACY_SUPPORTED) void PNGAPI png_set_user_transform_info(png_structp png_ptr, png_voidp user_transform_ptr, int user_transform_depth, int user_transform_channels) { png_debug(1, "in png_set_user_transform_info\n"); #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) png_ptr->user_transform_ptr = user_transform_ptr; png_ptr->user_transform_depth = (png_byte)user_transform_depth; png_ptr->user_transform_channels = (png_byte)user_transform_channels; #else if(user_transform_ptr || user_transform_depth || user_transform_channels) png_warning(png_ptr, "This version of libpng does not support user transform info"); #endif } #endif /* This function returns a pointer to the user_transform_ptr associated with * the user transform functions. The application should free any memory * associated with this pointer before png_write_destroy and png_read_destroy * are called. */ png_voidp PNGAPI png_get_user_transform_ptr(png_structp png_ptr) { #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) return ((png_voidp)png_ptr->user_transform_ptr); #else if(png_ptr) return (NULL); return (NULL); #endif } gamera-3.3.3/src/libpng-1.2.5/pngvcrd.c0000644000076500000000000042611610714675701016276 0ustar chriswheel/* pngvcrd.c - mixed C/assembler version of utilities to read a PNG file * * For Intel x86 CPU and Microsoft Visual C++ compiler * * libpng version 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * Copyright (c) 1998, Intel Corporation * * Contributed by Nirav Chhatrapati, Intel Corporation, 1998 * Interface to libpng contributed by Gilles Vollant, 1999 * * * In png_do_read_interlace() in libpng versions 1.0.3a through 1.0.4d, * a sign error in the post-MMX cleanup code for each pixel_depth resulted * in bad pixels at the beginning of some rows of some images, and also * (due to out-of-range memory reads and writes) caused heap corruption * when compiled with MSVC 6.0. The error was fixed in version 1.0.4e. * * [png_read_filter_row_mmx_avg() bpp == 2 bugfix, GRR 20000916] * * [runtime MMX configuration, GRR 20010102] * */ #define PNG_INTERNAL #include "png.h" #if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD) static int mmx_supported=2; int PNGAPI png_mmx_support(void) { int mmx_supported_local = 0; _asm { push ebx //CPUID will trash these push ecx push edx pushfd //Save Eflag to stack pop eax //Get Eflag from stack into eax mov ecx, eax //Make another copy of Eflag in ecx xor eax, 0x200000 //Toggle ID bit in Eflag [i.e. bit(21)] push eax //Save modified Eflag back to stack popfd //Restored modified value back to Eflag reg pushfd //Save Eflag to stack pop eax //Get Eflag from stack push ecx // save original Eflag to stack popfd // restore original Eflag xor eax, ecx //Compare the new Eflag with the original Eflag jz NOT_SUPPORTED //If the same, CPUID instruction is not supported, //skip following instructions and jump to //NOT_SUPPORTED label xor eax, eax //Set eax to zero _asm _emit 0x0f //CPUID instruction (two bytes opcode) _asm _emit 0xa2 cmp eax, 1 //make sure eax return non-zero value jl NOT_SUPPORTED //If eax is zero, mmx not supported xor eax, eax //set eax to zero inc eax //Now increment eax to 1. This instruction is //faster than the instruction "mov eax, 1" _asm _emit 0x0f //CPUID instruction _asm _emit 0xa2 and edx, 0x00800000 //mask out all bits but mmx bit(24) cmp edx, 0 // 0 = mmx not supported jz NOT_SUPPORTED // non-zero = Yes, mmx IS supported mov mmx_supported_local, 1 //set return value to 1 NOT_SUPPORTED: mov eax, mmx_supported_local //move return value to eax pop edx //CPUID trashed these pop ecx pop ebx } //mmx_supported_local=0; // test code for force don't support MMX //printf("MMX : %u (1=MMX supported)\n",mmx_supported_local); mmx_supported = mmx_supported_local; return mmx_supported_local; } /* Combines the row recently read in with the previous row. This routine takes care of alpha and transparency if requested. This routine also handles the two methods of progressive display of interlaced images, depending on the mask value. The mask value describes which pixels are to be combined with the row. The pattern always repeats every 8 pixels, so just 8 bits are needed. A one indicates the pixel is to be combined; a zero indicates the pixel is to be skipped. This is in addition to any alpha or transparency value associated with the pixel. If you want all pixels to be combined, pass 0xff (255) in mask. */ /* Use this routine for x86 platform - uses faster MMX routine if machine supports MMX */ void /* PRIVATE */ png_combine_row(png_structp png_ptr, png_bytep row, int mask) { #ifdef PNG_USE_LOCAL_ARRAYS const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; #endif png_debug(1,"in png_combine_row_asm\n"); if (mmx_supported == 2) { /* this should have happened in png_init_mmx_flags() already */ png_warning(png_ptr, "asm_flags may not have been initialized"); png_mmx_support(); } if (mask == 0xff) { png_memcpy(row, png_ptr->row_buf + 1, (png_size_t)((png_ptr->width * png_ptr->row_info.pixel_depth + 7) >> 3)); } /* GRR: add "else if (mask == 0)" case? * or does png_combine_row() not even get called in that case? */ else { switch (png_ptr->row_info.pixel_depth) { case 1: { png_bytep sp; png_bytep dp; int s_inc, s_start, s_end; int m; int shift; png_uint_32 i; sp = png_ptr->row_buf + 1; dp = row; m = 0x80; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 7; s_inc = 1; } else #endif { s_start = 7; s_end = 0; s_inc = -1; } shift = s_start; for (i = 0; i < png_ptr->width; i++) { if (m & mask) { int value; value = (*sp >> shift) & 0x1; *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } case 2: { png_bytep sp; png_bytep dp; int s_start, s_end, s_inc; int m; int shift; png_uint_32 i; int value; sp = png_ptr->row_buf + 1; dp = row; m = 0x80; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 6; s_inc = 2; } else #endif { s_start = 6; s_end = 0; s_inc = -2; } shift = s_start; for (i = 0; i < png_ptr->width; i++) { if (m & mask) { value = (*sp >> shift) & 0x3; *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } case 4: { png_bytep sp; png_bytep dp; int s_start, s_end, s_inc; int m; int shift; png_uint_32 i; int value; sp = png_ptr->row_buf + 1; dp = row; m = 0x80; #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) { s_start = 0; s_end = 4; s_inc = 4; } else #endif { s_start = 4; s_end = 0; s_inc = -4; } shift = s_start; for (i = 0; i < png_ptr->width; i++) { if (m & mask) { value = (*sp >> shift) & 0xf; *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); *dp |= (png_byte)(value << shift); } if (shift == s_end) { shift = s_start; sp++; dp++; } else shift += s_inc; if (m == 1) m = 0x80; else m >>= 1; } break; } case 8: { png_bytep srcptr; png_bytep dstptr; png_uint_32 len; int m; int diff, unmask; __int64 mask0=0x0102040810204080; if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && mmx_supported */ ) { srcptr = png_ptr->row_buf + 1; dstptr = row; m = 0x80; unmask = ~mask; len = png_ptr->width &~7; //reduce to multiple of 8 diff = png_ptr->width & 7; //amount lost _asm { movd mm7, unmask //load bit pattern psubb mm6,mm6 //zero mm6 punpcklbw mm7,mm7 punpcklwd mm7,mm7 punpckldq mm7,mm7 //fill register with 8 masks movq mm0,mask0 pand mm0,mm7 //nonzero if keep byte pcmpeqb mm0,mm6 //zeros->1s, v versa mov ecx,len //load length of line (pixels) mov esi,srcptr //load source mov ebx,dstptr //load dest cmp ecx,0 //lcr je mainloop8end mainloop8: movq mm4,[esi] pand mm4,mm0 movq mm6,mm0 pandn mm6,[ebx] por mm4,mm6 movq [ebx],mm4 add esi,8 //inc by 8 bytes processed add ebx,8 sub ecx,8 //dec by 8 pixels processed ja mainloop8 mainloop8end: mov ecx,diff cmp ecx,0 jz end8 mov edx,mask sal edx,24 //make low byte the high byte secondloop8: sal edx,1 //move high bit to CF jnc skip8 //if CF = 0 mov al,[esi] mov [ebx],al skip8: inc esi inc ebx dec ecx jnz secondloop8 end8: emms } } else /* mmx not supported - use modified C routine */ { register unsigned int incr1, initial_val, final_val; png_size_t pixel_bytes; png_uint_32 i; register int disp = png_pass_inc[png_ptr->pass]; int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* pixel_bytes; dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; initial_val = offset_table[png_ptr->pass]*pixel_bytes; final_val = png_ptr->width*pixel_bytes; incr1 = (disp)*pixel_bytes; for (i = initial_val; i < final_val; i += incr1) { png_memcpy(dstptr, srcptr, pixel_bytes); srcptr += incr1; dstptr += incr1; } } /* end of else */ break; } // end 8 bpp case 16: { png_bytep srcptr; png_bytep dstptr; png_uint_32 len; int unmask, diff; __int64 mask1=0x0101020204040808, mask0=0x1010202040408080; if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && mmx_supported */ ) { srcptr = png_ptr->row_buf + 1; dstptr = row; unmask = ~mask; len = (png_ptr->width)&~7; diff = (png_ptr->width)&7; _asm { movd mm7, unmask //load bit pattern psubb mm6,mm6 //zero mm6 punpcklbw mm7,mm7 punpcklwd mm7,mm7 punpckldq mm7,mm7 //fill register with 8 masks movq mm0,mask0 movq mm1,mask1 pand mm0,mm7 pand mm1,mm7 pcmpeqb mm0,mm6 pcmpeqb mm1,mm6 mov ecx,len //load length of line mov esi,srcptr //load source mov ebx,dstptr //load dest cmp ecx,0 //lcr jz mainloop16end mainloop16: movq mm4,[esi] pand mm4,mm0 movq mm6,mm0 movq mm7,[ebx] pandn mm6,mm7 por mm4,mm6 movq [ebx],mm4 movq mm5,[esi+8] pand mm5,mm1 movq mm7,mm1 movq mm6,[ebx+8] pandn mm7,mm6 por mm5,mm7 movq [ebx+8],mm5 add esi,16 //inc by 16 bytes processed add ebx,16 sub ecx,8 //dec by 8 pixels processed ja mainloop16 mainloop16end: mov ecx,diff cmp ecx,0 jz end16 mov edx,mask sal edx,24 //make low byte the high byte secondloop16: sal edx,1 //move high bit to CF jnc skip16 //if CF = 0 mov ax,[esi] mov [ebx],ax skip16: add esi,2 add ebx,2 dec ecx jnz secondloop16 end16: emms } } else /* mmx not supported - use modified C routine */ { register unsigned int incr1, initial_val, final_val; png_size_t pixel_bytes; png_uint_32 i; register int disp = png_pass_inc[png_ptr->pass]; int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* pixel_bytes; dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; initial_val = offset_table[png_ptr->pass]*pixel_bytes; final_val = png_ptr->width*pixel_bytes; incr1 = (disp)*pixel_bytes; for (i = initial_val; i < final_val; i += incr1) { png_memcpy(dstptr, srcptr, pixel_bytes); srcptr += incr1; dstptr += incr1; } } /* end of else */ break; } // end 16 bpp case 24: { png_bytep srcptr; png_bytep dstptr; png_uint_32 len; int unmask, diff; __int64 mask2=0x0101010202020404, //24bpp mask1=0x0408080810101020, mask0=0x2020404040808080; srcptr = png_ptr->row_buf + 1; dstptr = row; unmask = ~mask; len = (png_ptr->width)&~7; diff = (png_ptr->width)&7; if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && mmx_supported */ ) { _asm { movd mm7, unmask //load bit pattern psubb mm6,mm6 //zero mm6 punpcklbw mm7,mm7 punpcklwd mm7,mm7 punpckldq mm7,mm7 //fill register with 8 masks movq mm0,mask0 movq mm1,mask1 movq mm2,mask2 pand mm0,mm7 pand mm1,mm7 pand mm2,mm7 pcmpeqb mm0,mm6 pcmpeqb mm1,mm6 pcmpeqb mm2,mm6 mov ecx,len //load length of line mov esi,srcptr //load source mov ebx,dstptr //load dest cmp ecx,0 jz mainloop24end mainloop24: movq mm4,[esi] pand mm4,mm0 movq mm6,mm0 movq mm7,[ebx] pandn mm6,mm7 por mm4,mm6 movq [ebx],mm4 movq mm5,[esi+8] pand mm5,mm1 movq mm7,mm1 movq mm6,[ebx+8] pandn mm7,mm6 por mm5,mm7 movq [ebx+8],mm5 movq mm6,[esi+16] pand mm6,mm2 movq mm4,mm2 movq mm7,[ebx+16] pandn mm4,mm7 por mm6,mm4 movq [ebx+16],mm6 add esi,24 //inc by 24 bytes processed add ebx,24 sub ecx,8 //dec by 8 pixels processed ja mainloop24 mainloop24end: mov ecx,diff cmp ecx,0 jz end24 mov edx,mask sal edx,24 //make low byte the high byte secondloop24: sal edx,1 //move high bit to CF jnc skip24 //if CF = 0 mov ax,[esi] mov [ebx],ax xor eax,eax mov al,[esi+2] mov [ebx+2],al skip24: add esi,3 add ebx,3 dec ecx jnz secondloop24 end24: emms } } else /* mmx not supported - use modified C routine */ { register unsigned int incr1, initial_val, final_val; png_size_t pixel_bytes; png_uint_32 i; register int disp = png_pass_inc[png_ptr->pass]; int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* pixel_bytes; dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; initial_val = offset_table[png_ptr->pass]*pixel_bytes; final_val = png_ptr->width*pixel_bytes; incr1 = (disp)*pixel_bytes; for (i = initial_val; i < final_val; i += incr1) { png_memcpy(dstptr, srcptr, pixel_bytes); srcptr += incr1; dstptr += incr1; } } /* end of else */ break; } // end 24 bpp case 32: { png_bytep srcptr; png_bytep dstptr; png_uint_32 len; int unmask, diff; __int64 mask3=0x0101010102020202, //32bpp mask2=0x0404040408080808, mask1=0x1010101020202020, mask0=0x4040404080808080; srcptr = png_ptr->row_buf + 1; dstptr = row; unmask = ~mask; len = (png_ptr->width)&~7; diff = (png_ptr->width)&7; if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && mmx_supported */ ) { _asm { movd mm7, unmask //load bit pattern psubb mm6,mm6 //zero mm6 punpcklbw mm7,mm7 punpcklwd mm7,mm7 punpckldq mm7,mm7 //fill register with 8 masks movq mm0,mask0 movq mm1,mask1 movq mm2,mask2 movq mm3,mask3 pand mm0,mm7 pand mm1,mm7 pand mm2,mm7 pand mm3,mm7 pcmpeqb mm0,mm6 pcmpeqb mm1,mm6 pcmpeqb mm2,mm6 pcmpeqb mm3,mm6 mov ecx,len //load length of line mov esi,srcptr //load source mov ebx,dstptr //load dest cmp ecx,0 //lcr jz mainloop32end mainloop32: movq mm4,[esi] pand mm4,mm0 movq mm6,mm0 movq mm7,[ebx] pandn mm6,mm7 por mm4,mm6 movq [ebx],mm4 movq mm5,[esi+8] pand mm5,mm1 movq mm7,mm1 movq mm6,[ebx+8] pandn mm7,mm6 por mm5,mm7 movq [ebx+8],mm5 movq mm6,[esi+16] pand mm6,mm2 movq mm4,mm2 movq mm7,[ebx+16] pandn mm4,mm7 por mm6,mm4 movq [ebx+16],mm6 movq mm7,[esi+24] pand mm7,mm3 movq mm5,mm3 movq mm4,[ebx+24] pandn mm5,mm4 por mm7,mm5 movq [ebx+24],mm7 add esi,32 //inc by 32 bytes processed add ebx,32 sub ecx,8 //dec by 8 pixels processed ja mainloop32 mainloop32end: mov ecx,diff cmp ecx,0 jz end32 mov edx,mask sal edx,24 //make low byte the high byte secondloop32: sal edx,1 //move high bit to CF jnc skip32 //if CF = 0 mov eax,[esi] mov [ebx],eax skip32: add esi,4 add ebx,4 dec ecx jnz secondloop32 end32: emms } } else /* mmx _not supported - Use modified C routine */ { register unsigned int incr1, initial_val, final_val; png_size_t pixel_bytes; png_uint_32 i; register int disp = png_pass_inc[png_ptr->pass]; int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* pixel_bytes; dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; initial_val = offset_table[png_ptr->pass]*pixel_bytes; final_val = png_ptr->width*pixel_bytes; incr1 = (disp)*pixel_bytes; for (i = initial_val; i < final_val; i += incr1) { png_memcpy(dstptr, srcptr, pixel_bytes); srcptr += incr1; dstptr += incr1; } } /* end of else */ break; } // end 32 bpp case 48: { png_bytep srcptr; png_bytep dstptr; png_uint_32 len; int unmask, diff; __int64 mask5=0x0101010101010202, mask4=0x0202020204040404, mask3=0x0404080808080808, mask2=0x1010101010102020, mask1=0x2020202040404040, mask0=0x4040808080808080; if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW) /* && mmx_supported */ ) { srcptr = png_ptr->row_buf + 1; dstptr = row; unmask = ~mask; len = (png_ptr->width)&~7; diff = (png_ptr->width)&7; _asm { movd mm7, unmask //load bit pattern psubb mm6,mm6 //zero mm6 punpcklbw mm7,mm7 punpcklwd mm7,mm7 punpckldq mm7,mm7 //fill register with 8 masks movq mm0,mask0 movq mm1,mask1 movq mm2,mask2 movq mm3,mask3 movq mm4,mask4 movq mm5,mask5 pand mm0,mm7 pand mm1,mm7 pand mm2,mm7 pand mm3,mm7 pand mm4,mm7 pand mm5,mm7 pcmpeqb mm0,mm6 pcmpeqb mm1,mm6 pcmpeqb mm2,mm6 pcmpeqb mm3,mm6 pcmpeqb mm4,mm6 pcmpeqb mm5,mm6 mov ecx,len //load length of line mov esi,srcptr //load source mov ebx,dstptr //load dest cmp ecx,0 jz mainloop48end mainloop48: movq mm7,[esi] pand mm7,mm0 movq mm6,mm0 pandn mm6,[ebx] por mm7,mm6 movq [ebx],mm7 movq mm6,[esi+8] pand mm6,mm1 movq mm7,mm1 pandn mm7,[ebx+8] por mm6,mm7 movq [ebx+8],mm6 movq mm6,[esi+16] pand mm6,mm2 movq mm7,mm2 pandn mm7,[ebx+16] por mm6,mm7 movq [ebx+16],mm6 movq mm7,[esi+24] pand mm7,mm3 movq mm6,mm3 pandn mm6,[ebx+24] por mm7,mm6 movq [ebx+24],mm7 movq mm6,[esi+32] pand mm6,mm4 movq mm7,mm4 pandn mm7,[ebx+32] por mm6,mm7 movq [ebx+32],mm6 movq mm7,[esi+40] pand mm7,mm5 movq mm6,mm5 pandn mm6,[ebx+40] por mm7,mm6 movq [ebx+40],mm7 add esi,48 //inc by 32 bytes processed add ebx,48 sub ecx,8 //dec by 8 pixels processed ja mainloop48 mainloop48end: mov ecx,diff cmp ecx,0 jz end48 mov edx,mask sal edx,24 //make low byte the high byte secondloop48: sal edx,1 //move high bit to CF jnc skip48 //if CF = 0 mov eax,[esi] mov [ebx],eax skip48: add esi,4 add ebx,4 dec ecx jnz secondloop48 end48: emms } } else /* mmx _not supported - Use modified C routine */ { register unsigned int incr1, initial_val, final_val; png_size_t pixel_bytes; png_uint_32 i; register int disp = png_pass_inc[png_ptr->pass]; int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* pixel_bytes; dstptr = row + offset_table[png_ptr->pass]*pixel_bytes; initial_val = offset_table[png_ptr->pass]*pixel_bytes; final_val = png_ptr->width*pixel_bytes; incr1 = (disp)*pixel_bytes; for (i = initial_val; i < final_val; i += incr1) { png_memcpy(dstptr, srcptr, pixel_bytes); srcptr += incr1; dstptr += incr1; } } /* end of else */ break; } // end 48 bpp default: { png_bytep sptr; png_bytep dp; png_size_t pixel_bytes; int offset_table[7] = {0, 4, 0, 2, 0, 1, 0}; unsigned int i; register int disp = png_pass_inc[png_ptr->pass]; // get the offset register unsigned int incr1, initial_val, final_val; pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); sptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]* pixel_bytes; dp = row + offset_table[png_ptr->pass]*pixel_bytes; initial_val = offset_table[png_ptr->pass]*pixel_bytes; final_val = png_ptr->width*pixel_bytes; incr1 = (disp)*pixel_bytes; for (i = initial_val; i < final_val; i += incr1) { png_memcpy(dp, sptr, pixel_bytes); sptr += incr1; dp += incr1; } break; } } /* end switch (png_ptr->row_info.pixel_depth) */ } /* end if (non-trivial mask) */ } /* end png_combine_row() */ #if defined(PNG_READ_INTERLACING_SUPPORTED) void /* PRIVATE */ png_do_read_interlace(png_structp png_ptr) { png_row_infop row_info = &(png_ptr->row_info); png_bytep row = png_ptr->row_buf + 1; int pass = png_ptr->pass; png_uint_32 transformations = png_ptr->transformations; #ifdef PNG_USE_LOCAL_ARRAYS const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; #endif png_debug(1,"in png_do_read_interlace\n"); if (mmx_supported == 2) { /* this should have happened in png_init_mmx_flags() already */ png_warning(png_ptr, "asm_flags may not have been initialized"); png_mmx_support(); } if (row != NULL && row_info != NULL) { png_uint_32 final_width; final_width = row_info->width * png_pass_inc[pass]; switch (row_info->pixel_depth) { case 1: { png_bytep sp, dp; int sshift, dshift; int s_start, s_end, s_inc; png_byte v; png_uint_32 i; int j; sp = row + (png_size_t)((row_info->width - 1) >> 3); dp = row + (png_size_t)((final_width - 1) >> 3); #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (int)((row_info->width + 7) & 7); dshift = (int)((final_width + 7) & 7); s_start = 7; s_end = 0; s_inc = -1; } else #endif { sshift = 7 - (int)((row_info->width + 7) & 7); dshift = 7 - (int)((final_width + 7) & 7); s_start = 0; s_end = 7; s_inc = 1; } for (i = row_info->width; i; i--) { v = (png_byte)((*sp >> sshift) & 0x1); for (j = 0; j < png_pass_inc[pass]; j++) { *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } case 2: { png_bytep sp, dp; int sshift, dshift; int s_start, s_end, s_inc; png_uint_32 i; sp = row + (png_size_t)((row_info->width - 1) >> 2); dp = row + (png_size_t)((final_width - 1) >> 2); #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (png_size_t)(((row_info->width + 3) & 3) << 1); dshift = (png_size_t)(((final_width + 3) & 3) << 1); s_start = 6; s_end = 0; s_inc = -2; } else #endif { sshift = (png_size_t)((3 - ((row_info->width + 3) & 3)) << 1); dshift = (png_size_t)((3 - ((final_width + 3) & 3)) << 1); s_start = 0; s_end = 6; s_inc = 2; } for (i = row_info->width; i; i--) { png_byte v; int j; v = (png_byte)((*sp >> sshift) & 0x3); for (j = 0; j < png_pass_inc[pass]; j++) { *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } case 4: { png_bytep sp, dp; int sshift, dshift; int s_start, s_end, s_inc; png_uint_32 i; sp = row + (png_size_t)((row_info->width - 1) >> 1); dp = row + (png_size_t)((final_width - 1) >> 1); #if defined(PNG_READ_PACKSWAP_SUPPORTED) if (transformations & PNG_PACKSWAP) { sshift = (png_size_t)(((row_info->width + 1) & 1) << 2); dshift = (png_size_t)(((final_width + 1) & 1) << 2); s_start = 4; s_end = 0; s_inc = -4; } else #endif { sshift = (png_size_t)((1 - ((row_info->width + 1) & 1)) << 2); dshift = (png_size_t)((1 - ((final_width + 1) & 1)) << 2); s_start = 0; s_end = 4; s_inc = 4; } for (i = row_info->width; i; i--) { png_byte v; int j; v = (png_byte)((*sp >> sshift) & 0xf); for (j = 0; j < png_pass_inc[pass]; j++) { *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); *dp |= (png_byte)(v << dshift); if (dshift == s_end) { dshift = s_start; dp--; } else dshift += s_inc; } if (sshift == s_end) { sshift = s_start; sp--; } else sshift += s_inc; } break; } default: // This is the place where the routine is modified { __int64 const4 = 0x0000000000FFFFFF; // __int64 const5 = 0x000000FFFFFF0000; // unused... __int64 const6 = 0x00000000000000FF; png_bytep sptr, dp; png_uint_32 i; png_size_t pixel_bytes; int width = row_info->width; pixel_bytes = (row_info->pixel_depth >> 3); sptr = row + (width - 1) * pixel_bytes; dp = row + (final_width - 1) * pixel_bytes; // New code by Nirav Chhatrapati - Intel Corporation // sign fix by GRR // NOTE: there is NO MMX code for 48-bit and 64-bit images // use MMX routine if machine supports it if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_INTERLACE) /* && mmx_supported */ ) { if (pixel_bytes == 3) { if (((pass == 0) || (pass == 1)) && width) { _asm { mov esi, sptr mov edi, dp mov ecx, width sub edi, 21 // (png_pass_inc[pass] - 1)*pixel_bytes loop_pass0: movd mm0, [esi] ; X X X X X v2 v1 v0 pand mm0, const4 ; 0 0 0 0 0 v2 v1 v0 movq mm1, mm0 ; 0 0 0 0 0 v2 v1 v0 psllq mm0, 16 ; 0 0 0 v2 v1 v0 0 0 movq mm2, mm0 ; 0 0 0 v2 v1 v0 0 0 psllq mm0, 24 ; v2 v1 v0 0 0 0 0 0 psrlq mm1, 8 ; 0 0 0 0 0 0 v2 v1 por mm0, mm2 ; v2 v1 v0 v2 v1 v0 0 0 por mm0, mm1 ; v2 v1 v0 v2 v1 v0 v2 v1 movq mm3, mm0 ; v2 v1 v0 v2 v1 v0 v2 v1 psllq mm0, 16 ; v0 v2 v1 v0 v2 v1 0 0 movq mm4, mm3 ; v2 v1 v0 v2 v1 v0 v2 v1 punpckhdq mm3, mm0 ; v0 v2 v1 v0 v2 v1 v0 v2 movq [edi+16] , mm4 psrlq mm0, 32 ; 0 0 0 0 v0 v2 v1 v0 movq [edi+8] , mm3 punpckldq mm0, mm4 ; v1 v0 v2 v1 v0 v2 v1 v0 sub esi, 3 movq [edi], mm0 sub edi, 24 //sub esi, 3 dec ecx jnz loop_pass0 EMMS } } else if (((pass == 2) || (pass == 3)) && width) { _asm { mov esi, sptr mov edi, dp mov ecx, width sub edi, 9 // (png_pass_inc[pass] - 1)*pixel_bytes loop_pass2: movd mm0, [esi] ; X X X X X v2 v1 v0 pand mm0, const4 ; 0 0 0 0 0 v2 v1 v0 movq mm1, mm0 ; 0 0 0 0 0 v2 v1 v0 psllq mm0, 16 ; 0 0 0 v2 v1 v0 0 0 movq mm2, mm0 ; 0 0 0 v2 v1 v0 0 0 psllq mm0, 24 ; v2 v1 v0 0 0 0 0 0 psrlq mm1, 8 ; 0 0 0 0 0 0 v2 v1 por mm0, mm2 ; v2 v1 v0 v2 v1 v0 0 0 por mm0, mm1 ; v2 v1 v0 v2 v1 v0 v2 v1 movq [edi+4], mm0 ; move to memory psrlq mm0, 16 ; 0 0 v2 v1 v0 v2 v1 v0 movd [edi], mm0 ; move to memory sub esi, 3 sub edi, 12 dec ecx jnz loop_pass2 EMMS } } else if (width) /* && ((pass == 4) || (pass == 5)) */ { int width_mmx = ((width >> 1) << 1) - 8; if (width_mmx < 0) width_mmx = 0; width -= width_mmx; // 8 or 9 pix, 24 or 27 bytes if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub esi, 3 sub edi, 9 loop_pass4: movq mm0, [esi] ; X X v2 v1 v0 v5 v4 v3 movq mm7, mm0 ; X X v2 v1 v0 v5 v4 v3 movq mm6, mm0 ; X X v2 v1 v0 v5 v4 v3 psllq mm0, 24 ; v1 v0 v5 v4 v3 0 0 0 pand mm7, const4 ; 0 0 0 0 0 v5 v4 v3 psrlq mm6, 24 ; 0 0 0 X X v2 v1 v0 por mm0, mm7 ; v1 v0 v5 v4 v3 v5 v4 v3 movq mm5, mm6 ; 0 0 0 X X v2 v1 v0 psllq mm6, 8 ; 0 0 X X v2 v1 v0 0 movq [edi], mm0 ; move quad to memory psrlq mm5, 16 ; 0 0 0 0 0 X X v2 pand mm5, const6 ; 0 0 0 0 0 0 0 v2 por mm6, mm5 ; 0 0 X X v2 v1 v0 v2 movd [edi+8], mm6 ; move double to memory sub esi, 6 sub edi, 12 sub ecx, 2 jnz loop_pass4 EMMS } } sptr -= width_mmx*3; dp -= width_mmx*6; for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 3); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, 3); dp -= 3; } sptr -= 3; } } } /* end of pixel_bytes == 3 */ else if (pixel_bytes == 1) { if (((pass == 0) || (pass == 1)) && width) { int width_mmx = ((width >> 2) << 2); width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub edi, 31 sub esi, 3 loop1_pass0: movd mm0, [esi] ; X X X X v0 v1 v2 v3 movq mm1, mm0 ; X X X X v0 v1 v2 v3 punpcklbw mm0, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 movq mm2, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 punpcklwd mm0, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3 movq mm3, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3 punpckldq mm0, mm0 ; v3 v3 v3 v3 v3 v3 v3 v3 punpckhdq mm3, mm3 ; v2 v2 v2 v2 v2 v2 v2 v2 movq [edi], mm0 ; move to memory v3 punpckhwd mm2, mm2 ; v0 v0 v0 v0 v1 v1 v1 v1 movq [edi+8], mm3 ; move to memory v2 movq mm4, mm2 ; v0 v0 v0 v0 v1 v1 v1 v1 punpckldq mm2, mm2 ; v1 v1 v1 v1 v1 v1 v1 v1 punpckhdq mm4, mm4 ; v0 v0 v0 v0 v0 v0 v0 v0 movq [edi+16], mm2 ; move to memory v1 movq [edi+24], mm4 ; move to memory v0 sub esi, 4 sub edi, 32 sub ecx, 4 jnz loop1_pass0 EMMS } } sptr -= width_mmx; dp -= width_mmx*8; for (i = width; i; i--) { int j; /* I simplified this part in version 1.0.4e * here and in several other instances where * pixel_bytes == 1 -- GR-P * * Original code: * * png_byte v[8]; * png_memcpy(v, sptr, pixel_bytes); * for (j = 0; j < png_pass_inc[pass]; j++) * { * png_memcpy(dp, v, pixel_bytes); * dp -= pixel_bytes; * } * sptr -= pixel_bytes; * * Replacement code is in the next three lines: */ for (j = 0; j < png_pass_inc[pass]; j++) *dp-- = *sptr; sptr--; } } else if (((pass == 2) || (pass == 3)) && width) { int width_mmx = ((width >> 2) << 2); width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub edi, 15 sub esi, 3 loop1_pass2: movd mm0, [esi] ; X X X X v0 v1 v2 v3 punpcklbw mm0, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 movq mm1, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 punpcklwd mm0, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3 punpckhwd mm1, mm1 ; v0 v0 v0 v0 v1 v1 v1 v1 movq [edi], mm0 ; move to memory v2 and v3 sub esi, 4 movq [edi+8], mm1 ; move to memory v1 and v0 sub edi, 16 sub ecx, 4 jnz loop1_pass2 EMMS } } sptr -= width_mmx; dp -= width_mmx*4; for (i = width; i; i--) { int j; for (j = 0; j < png_pass_inc[pass]; j++) { *dp-- = *sptr; } sptr --; } } else if (width) /* && ((pass == 4) || (pass == 5))) */ { int width_mmx = ((width >> 3) << 3); width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub edi, 15 sub esi, 7 loop1_pass4: movq mm0, [esi] ; v0 v1 v2 v3 v4 v5 v6 v7 movq mm1, mm0 ; v0 v1 v2 v3 v4 v5 v6 v7 punpcklbw mm0, mm0 ; v4 v4 v5 v5 v6 v6 v7 v7 //movq mm1, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3 punpckhbw mm1, mm1 ;v0 v0 v1 v1 v2 v2 v3 v3 movq [edi+8], mm1 ; move to memory v0 v1 v2 and v3 sub esi, 8 movq [edi], mm0 ; move to memory v4 v5 v6 and v7 //sub esi, 4 sub edi, 16 sub ecx, 8 jnz loop1_pass4 EMMS } } sptr -= width_mmx; dp -= width_mmx*2; for (i = width; i; i--) { int j; for (j = 0; j < png_pass_inc[pass]; j++) { *dp-- = *sptr; } sptr --; } } } /* end of pixel_bytes == 1 */ else if (pixel_bytes == 2) { if (((pass == 0) || (pass == 1)) && width) { int width_mmx = ((width >> 1) << 1); width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub esi, 2 sub edi, 30 loop2_pass0: movd mm0, [esi] ; X X X X v1 v0 v3 v2 punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 movq mm1, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 punpckldq mm0, mm0 ; v3 v2 v3 v2 v3 v2 v3 v2 punpckhdq mm1, mm1 ; v1 v0 v1 v0 v1 v0 v1 v0 movq [edi], mm0 movq [edi + 8], mm0 movq [edi + 16], mm1 movq [edi + 24], mm1 sub esi, 4 sub edi, 32 sub ecx, 2 jnz loop2_pass0 EMMS } } sptr -= (width_mmx*2 - 2); // sign fixed dp -= (width_mmx*16 - 2); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 2; png_memcpy(v, sptr, 2); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 2; png_memcpy(dp, v, 2); } } } else if (((pass == 2) || (pass == 3)) && width) { int width_mmx = ((width >> 1) << 1) ; width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub esi, 2 sub edi, 14 loop2_pass2: movd mm0, [esi] ; X X X X v1 v0 v3 v2 punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 movq mm1, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 punpckldq mm0, mm0 ; v3 v2 v3 v2 v3 v2 v3 v2 punpckhdq mm1, mm1 ; v1 v0 v1 v0 v1 v0 v1 v0 movq [edi], mm0 sub esi, 4 movq [edi + 8], mm1 //sub esi, 4 sub edi, 16 sub ecx, 2 jnz loop2_pass2 EMMS } } sptr -= (width_mmx*2 - 2); // sign fixed dp -= (width_mmx*8 - 2); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 2; png_memcpy(v, sptr, 2); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 2; png_memcpy(dp, v, 2); } } } else if (width) // pass == 4 or 5 { int width_mmx = ((width >> 1) << 1) ; width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub esi, 2 sub edi, 6 loop2_pass4: movd mm0, [esi] ; X X X X v1 v0 v3 v2 punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2 sub esi, 4 movq [edi], mm0 sub edi, 8 sub ecx, 2 jnz loop2_pass4 EMMS } } sptr -= (width_mmx*2 - 2); // sign fixed dp -= (width_mmx*4 - 2); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 2; png_memcpy(v, sptr, 2); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 2; png_memcpy(dp, v, 2); } } } } /* end of pixel_bytes == 2 */ else if (pixel_bytes == 4) { if (((pass == 0) || (pass == 1)) && width) { int width_mmx = ((width >> 1) << 1) ; width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub esi, 4 sub edi, 60 loop4_pass0: movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4 movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4 punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4 punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0 movq [edi], mm0 movq [edi + 8], mm0 movq [edi + 16], mm0 movq [edi + 24], mm0 movq [edi+32], mm1 movq [edi + 40], mm1 movq [edi+ 48], mm1 sub esi, 8 movq [edi + 56], mm1 sub edi, 64 sub ecx, 2 jnz loop4_pass0 EMMS } } sptr -= (width_mmx*4 - 4); // sign fixed dp -= (width_mmx*32 - 4); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 4; png_memcpy(v, sptr, 4); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 4; png_memcpy(dp, v, 4); } } } else if (((pass == 2) || (pass == 3)) && width) { int width_mmx = ((width >> 1) << 1) ; width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub esi, 4 sub edi, 28 loop4_pass2: movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4 movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4 punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4 punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0 movq [edi], mm0 movq [edi + 8], mm0 movq [edi+16], mm1 movq [edi + 24], mm1 sub esi, 8 sub edi, 32 sub ecx, 2 jnz loop4_pass2 EMMS } } sptr -= (width_mmx*4 - 4); // sign fixed dp -= (width_mmx*16 - 4); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 4; png_memcpy(v, sptr, 4); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 4; png_memcpy(dp, v, 4); } } } else if (width) // pass == 4 or 5 { int width_mmx = ((width >> 1) << 1) ; width -= width_mmx; if (width_mmx) { _asm { mov esi, sptr mov edi, dp mov ecx, width_mmx sub esi, 4 sub edi, 12 loop4_pass4: movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4 movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4 punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4 punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0 movq [edi], mm0 sub esi, 8 movq [edi + 8], mm1 sub edi, 16 sub ecx, 2 jnz loop4_pass4 EMMS } } sptr -= (width_mmx*4 - 4); // sign fixed dp -= (width_mmx*8 - 4); // sign fixed for (i = width; i; i--) { png_byte v[8]; int j; sptr -= 4; png_memcpy(v, sptr, 4); for (j = 0; j < png_pass_inc[pass]; j++) { dp -= 4; png_memcpy(dp, v, 4); } } } } /* end of pixel_bytes == 4 */ else if (pixel_bytes == 6) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, 6); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, 6); dp -= 6; } sptr -= 6; } } /* end of pixel_bytes == 6 */ else { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, pixel_bytes); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sptr-= pixel_bytes; } } } /* end of mmx_supported */ else /* MMX not supported: use modified C code - takes advantage * of inlining of memcpy for a constant */ { if (pixel_bytes == 1) { for (i = width; i; i--) { int j; for (j = 0; j < png_pass_inc[pass]; j++) *dp-- = *sptr; sptr--; } } else if (pixel_bytes == 3) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, pixel_bytes); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sptr -= pixel_bytes; } } else if (pixel_bytes == 2) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, pixel_bytes); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sptr -= pixel_bytes; } } else if (pixel_bytes == 4) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, pixel_bytes); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sptr -= pixel_bytes; } } else if (pixel_bytes == 6) { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, pixel_bytes); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sptr -= pixel_bytes; } } else { for (i = width; i; i--) { png_byte v[8]; int j; png_memcpy(v, sptr, pixel_bytes); for (j = 0; j < png_pass_inc[pass]; j++) { png_memcpy(dp, v, pixel_bytes); dp -= pixel_bytes; } sptr -= pixel_bytes; } } } /* end of MMX not supported */ break; } } /* end switch (row_info->pixel_depth) */ row_info->width = final_width; row_info->rowbytes = ((final_width * (png_uint_32)row_info->pixel_depth + 7) >> 3); } } #endif /* PNG_READ_INTERLACING_SUPPORTED */ // These variables are utilized in the functions below. They are declared // globally here to ensure alignment on 8-byte boundaries. union uAll { __int64 use; double align; } LBCarryMask = {0x0101010101010101}, HBClearMask = {0x7f7f7f7f7f7f7f7f}, ActiveMask, ActiveMask2, ActiveMaskEnd, ShiftBpp, ShiftRem; // Optimized code for PNG Average filter decoder void /* PRIVATE */ png_read_filter_row_mmx_avg(png_row_infop row_info, png_bytep row , png_bytep prev_row) { int bpp; png_uint_32 FullLength; png_uint_32 MMXLength; //png_uint_32 len; int diff; bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel FullLength = row_info->rowbytes; // # of bytes to filter _asm { // Init address pointers and offset mov edi, row // edi ==> Avg(x) xor ebx, ebx // ebx ==> x mov edx, edi mov esi, prev_row // esi ==> Prior(x) sub edx, bpp // edx ==> Raw(x-bpp) xor eax, eax // Compute the Raw value for the first bpp bytes // Raw(x) = Avg(x) + (Prior(x)/2) davgrlp: mov al, [esi + ebx] // Load al with Prior(x) inc ebx shr al, 1 // divide by 2 add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx cmp ebx, bpp mov [edi+ebx-1], al // Write back Raw(x); // mov does not affect flags; -1 to offset inc ebx jb davgrlp // get # of bytes to alignment mov diff, edi // take start of row add diff, ebx // add bpp add diff, 0xf // add 7 + 8 to incr past alignment boundary and diff, 0xfffffff8 // mask to alignment boundary sub diff, edi // subtract from start ==> value ebx at alignment jz davggo // fix alignment // Compute the Raw value for the bytes upto the alignment boundary // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) xor ecx, ecx davglp1: xor eax, eax mov cl, [esi + ebx] // load cl with Prior(x) mov al, [edx + ebx] // load al with Raw(x-bpp) add ax, cx inc ebx shr ax, 1 // divide by 2 add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx cmp ebx, diff // Check if at alignment boundary mov [edi+ebx-1], al // Write back Raw(x); // mov does not affect flags; -1 to offset inc ebx jb davglp1 // Repeat until at alignment boundary davggo: mov eax, FullLength mov ecx, eax sub eax, ebx // subtract alignment fix and eax, 0x00000007 // calc bytes over mult of 8 sub ecx, eax // drop over bytes from original length mov MMXLength, ecx } // end _asm block // Now do the math for the rest of the row switch ( bpp ) { case 3: { ActiveMask.use = 0x0000000000ffffff; ShiftBpp.use = 24; // == 3 * 8 ShiftRem.use = 40; // == 64 - 24 _asm { // Re-init address pointers and offset movq mm7, ActiveMask mov ebx, diff // ebx ==> x = offset to alignment boundary movq mm5, LBCarryMask mov edi, row // edi ==> Avg(x) movq mm4, HBClearMask mov esi, prev_row // esi ==> Prior(x) // PRIME the pump (load the first Raw(x-bpp) data set movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes // (we correct position in loop below) davg3lp: movq mm0, [edi + ebx] // Load mm0 with Avg(x) // Add (Prev_row/2) to Average movq mm3, mm5 psrlq mm2, ShiftRem // Correct position Raw(x-bpp) data movq mm1, [esi + ebx] // Load mm1 with Prior(x) movq mm6, mm7 pand mm3, mm1 // get lsb for each prev_row byte psrlq mm1, 1 // divide prev_row bytes by 2 pand mm1, mm4 // clear invalid bit 7 of each byte paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm6 // Leave only Active Group 1 bytes to add to Avg paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active // byte // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 3-5 movq mm2, mm0 // mov updated Raws to mm2 psllq mm2, ShiftBpp // shift data to position correctly movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active // byte // Add 3rd active group (Raw(x-bpp)/2) to Average with LBCarry psllq mm6, ShiftBpp // shift the mm6 mask to cover the last two // bytes movq mm2, mm0 // mov updated Raws to mm2 psllq mm2, ShiftBpp // shift data to position correctly // Data only needs to be shifted once here to // get the correct x-bpp offset. movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg add ebx, 8 paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active // byte // Now ready to write back to memory movq [edi + ebx - 8], mm0 // Move updated Raw(x) to use as Raw(x-bpp) for next loop cmp ebx, MMXLength movq mm2, mm0 // mov updated Raw(x) to mm2 jb davg3lp } // end _asm block } break; case 6: case 4: case 7: case 5: { ActiveMask.use = 0xffffffffffffffff; // use shift below to clear // appropriate inactive bytes ShiftBpp.use = bpp << 3; ShiftRem.use = 64 - ShiftBpp.use; _asm { movq mm4, HBClearMask // Re-init address pointers and offset mov ebx, diff // ebx ==> x = offset to alignment boundary // Load ActiveMask and clear all bytes except for 1st active group movq mm7, ActiveMask mov edi, row // edi ==> Avg(x) psrlq mm7, ShiftRem mov esi, prev_row // esi ==> Prior(x) movq mm6, mm7 movq mm5, LBCarryMask psllq mm6, ShiftBpp // Create mask for 2nd active group // PRIME the pump (load the first Raw(x-bpp) data set movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes // (we correct position in loop below) davg4lp: movq mm0, [edi + ebx] psrlq mm2, ShiftRem // shift data to position correctly movq mm1, [esi + ebx] // Add (Prev_row/2) to Average movq mm3, mm5 pand mm3, mm1 // get lsb for each prev_row byte psrlq mm1, 1 // divide prev_row bytes by 2 pand mm1, mm4 // clear invalid bit 7 of each byte paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm7 // Leave only Active Group 1 bytes to add to Avg paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active // byte // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry movq mm2, mm0 // mov updated Raws to mm2 psllq mm2, ShiftBpp // shift data to position correctly add ebx, 8 movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active // byte cmp ebx, MMXLength // Now ready to write back to memory movq [edi + ebx - 8], mm0 // Prep Raw(x-bpp) for next loop movq mm2, mm0 // mov updated Raws to mm2 jb davg4lp } // end _asm block } break; case 2: { ActiveMask.use = 0x000000000000ffff; ShiftBpp.use = 16; // == 2 * 8 [BUGFIX] ShiftRem.use = 48; // == 64 - 16 [BUGFIX] _asm { // Load ActiveMask movq mm7, ActiveMask // Re-init address pointers and offset mov ebx, diff // ebx ==> x = offset to alignment boundary movq mm5, LBCarryMask mov edi, row // edi ==> Avg(x) movq mm4, HBClearMask mov esi, prev_row // esi ==> Prior(x) // PRIME the pump (load the first Raw(x-bpp) data set movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes // (we correct position in loop below) davg2lp: movq mm0, [edi + ebx] psrlq mm2, ShiftRem // shift data to position correctly [BUGFIX] movq mm1, [esi + ebx] // Add (Prev_row/2) to Average movq mm3, mm5 pand mm3, mm1 // get lsb for each prev_row byte psrlq mm1, 1 // divide prev_row bytes by 2 pand mm1, mm4 // clear invalid bit 7 of each byte movq mm6, mm7 paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm6 // Leave only Active Group 1 bytes to add to Avg paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 2 & 3 movq mm2, mm0 // mov updated Raws to mm2 psllq mm2, ShiftBpp // shift data to position correctly movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte // Add rdd active group (Raw(x-bpp)/2) to Average with LBCarry psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 4 & 5 movq mm2, mm0 // mov updated Raws to mm2 psllq mm2, ShiftBpp // shift data to position correctly // Data only needs to be shifted once here to // get the correct x-bpp offset. movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte // Add 4th active group (Raw(x-bpp)/2) to Average with LBCarry psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 6 & 7 movq mm2, mm0 // mov updated Raws to mm2 psllq mm2, ShiftBpp // shift data to position correctly // Data only needs to be shifted once here to // get the correct x-bpp offset. add ebx, 8 movq mm1, mm3 // now use mm1 for getting LBCarrys pand mm1, mm2 // get LBCarrys for each byte where both // lsb's were == 1 (Only valid for active group) psrlq mm2, 1 // divide raw bytes by 2 pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte cmp ebx, MMXLength // Now ready to write back to memory movq [edi + ebx - 8], mm0 // Prep Raw(x-bpp) for next loop movq mm2, mm0 // mov updated Raws to mm2 jb davg2lp } // end _asm block } break; case 1: // bpp == 1 { _asm { // Re-init address pointers and offset mov ebx, diff // ebx ==> x = offset to alignment boundary mov edi, row // edi ==> Avg(x) cmp ebx, FullLength // Test if offset at end of array jnb davg1end // Do Paeth decode for remaining bytes mov esi, prev_row // esi ==> Prior(x) mov edx, edi xor ecx, ecx // zero ecx before using cl & cx in loop below sub edx, bpp // edx ==> Raw(x-bpp) davg1lp: // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) xor eax, eax mov cl, [esi + ebx] // load cl with Prior(x) mov al, [edx + ebx] // load al with Raw(x-bpp) add ax, cx inc ebx shr ax, 1 // divide by 2 add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx cmp ebx, FullLength // Check if at end of array mov [edi+ebx-1], al // Write back Raw(x); // mov does not affect flags; -1 to offset inc ebx jb davg1lp davg1end: } // end _asm block } return; case 8: // bpp == 8 { _asm { // Re-init address pointers and offset mov ebx, diff // ebx ==> x = offset to alignment boundary movq mm5, LBCarryMask mov edi, row // edi ==> Avg(x) movq mm4, HBClearMask mov esi, prev_row // esi ==> Prior(x) // PRIME the pump (load the first Raw(x-bpp) data set movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes // (NO NEED to correct position in loop below) davg8lp: movq mm0, [edi + ebx] movq mm3, mm5 movq mm1, [esi + ebx] add ebx, 8 pand mm3, mm1 // get lsb for each prev_row byte psrlq mm1, 1 // divide prev_row bytes by 2 pand mm3, mm2 // get LBCarrys for each byte where both // lsb's were == 1 psrlq mm2, 1 // divide raw bytes by 2 pand mm1, mm4 // clear invalid bit 7 of each byte paddb mm0, mm3 // add LBCarrys to Avg for each byte pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte paddb mm0, mm2 // add (Raw/2) to Avg for each byte cmp ebx, MMXLength movq [edi + ebx - 8], mm0 movq mm2, mm0 // reuse as Raw(x-bpp) jb davg8lp } // end _asm block } break; default: // bpp greater than 8 { _asm { movq mm5, LBCarryMask // Re-init address pointers and offset mov ebx, diff // ebx ==> x = offset to alignment boundary mov edi, row // edi ==> Avg(x) movq mm4, HBClearMask mov edx, edi mov esi, prev_row // esi ==> Prior(x) sub edx, bpp // edx ==> Raw(x-bpp) davgAlp: movq mm0, [edi + ebx] movq mm3, mm5 movq mm1, [esi + ebx] pand mm3, mm1 // get lsb for each prev_row byte movq mm2, [edx + ebx] psrlq mm1, 1 // divide prev_row bytes by 2 pand mm3, mm2 // get LBCarrys for each byte where both // lsb's were == 1 psrlq mm2, 1 // divide raw bytes by 2 pand mm1, mm4 // clear invalid bit 7 of each byte paddb mm0, mm3 // add LBCarrys to Avg for each byte pand mm2, mm4 // clear invalid bit 7 of each byte paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte add ebx, 8 paddb mm0, mm2 // add (Raw/2) to Avg for each byte cmp ebx, MMXLength movq [edi + ebx - 8], mm0 jb davgAlp } // end _asm block } break; } // end switch ( bpp ) _asm { // MMX acceleration complete now do clean-up // Check if any remaining bytes left to decode mov ebx, MMXLength // ebx ==> x = offset bytes remaining after MMX mov edi, row // edi ==> Avg(x) cmp ebx, FullLength // Test if offset at end of array jnb davgend // Do Paeth decode for remaining bytes mov esi, prev_row // esi ==> Prior(x) mov edx, edi xor ecx, ecx // zero ecx before using cl & cx in loop below sub edx, bpp // edx ==> Raw(x-bpp) davglp2: // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2) xor eax, eax mov cl, [esi + ebx] // load cl with Prior(x) mov al, [edx + ebx] // load al with Raw(x-bpp) add ax, cx inc ebx shr ax, 1 // divide by 2 add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx cmp ebx, FullLength // Check if at end of array mov [edi+ebx-1], al // Write back Raw(x); // mov does not affect flags; -1 to offset inc ebx jb davglp2 davgend: emms // End MMX instructions; prep for possible FP instrs. } // end _asm block } // Optimized code for PNG Paeth filter decoder void /* PRIVATE */ png_read_filter_row_mmx_paeth(png_row_infop row_info, png_bytep row, png_bytep prev_row) { png_uint_32 FullLength; png_uint_32 MMXLength; //png_uint_32 len; int bpp; int diff; //int ptemp; int patemp, pbtemp, pctemp; bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel FullLength = row_info->rowbytes; // # of bytes to filter _asm { xor ebx, ebx // ebx ==> x offset mov edi, row xor edx, edx // edx ==> x-bpp offset mov esi, prev_row xor eax, eax // Compute the Raw value for the first bpp bytes // Note: the formula works out to be always // Paeth(x) = Raw(x) + Prior(x) where x < bpp dpthrlp: mov al, [edi + ebx] add al, [esi + ebx] inc ebx cmp ebx, bpp mov [edi + ebx - 1], al jb dpthrlp // get # of bytes to alignment mov diff, edi // take start of row add diff, ebx // add bpp xor ecx, ecx add diff, 0xf // add 7 + 8 to incr past alignment boundary and diff, 0xfffffff8 // mask to alignment boundary sub diff, edi // subtract from start ==> value ebx at alignment jz dpthgo // fix alignment dpthlp1: xor eax, eax // pav = p - a = (a + b - c) - a = b - c mov al, [esi + ebx] // load Prior(x) into al mov cl, [esi + edx] // load Prior(x-bpp) into cl sub eax, ecx // subtract Prior(x-bpp) mov patemp, eax // Save pav for later use xor eax, eax // pbv = p - b = (a + b - c) - b = a - c mov al, [edi + edx] // load Raw(x-bpp) into al sub eax, ecx // subtract Prior(x-bpp) mov ecx, eax // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv add eax, patemp // pcv = pav + pbv // pc = abs(pcv) test eax, 0x80000000 jz dpthpca neg eax // reverse sign of neg values dpthpca: mov pctemp, eax // save pc for later use // pb = abs(pbv) test ecx, 0x80000000 jz dpthpba neg ecx // reverse sign of neg values dpthpba: mov pbtemp, ecx // save pb for later use // pa = abs(pav) mov eax, patemp test eax, 0x80000000 jz dpthpaa neg eax // reverse sign of neg values dpthpaa: mov patemp, eax // save pa for later use // test if pa <= pb cmp eax, ecx jna dpthabb // pa > pb; now test if pb <= pc cmp ecx, pctemp jna dpthbbc // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) mov cl, [esi + edx] // load Prior(x-bpp) into cl jmp dpthpaeth dpthbbc: // pb <= pc; Raw(x) = Paeth(x) + Prior(x) mov cl, [esi + ebx] // load Prior(x) into cl jmp dpthpaeth dpthabb: // pa <= pb; now test if pa <= pc cmp eax, pctemp jna dpthabc // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) mov cl, [esi + edx] // load Prior(x-bpp) into cl jmp dpthpaeth dpthabc: // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) mov cl, [edi + edx] // load Raw(x-bpp) into cl dpthpaeth: inc ebx inc edx // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 add [edi + ebx - 1], cl cmp ebx, diff jb dpthlp1 dpthgo: mov ecx, FullLength mov eax, ecx sub eax, ebx // subtract alignment fix and eax, 0x00000007 // calc bytes over mult of 8 sub ecx, eax // drop over bytes from original length mov MMXLength, ecx } // end _asm block // Now do the math for the rest of the row switch ( bpp ) { case 3: { ActiveMask.use = 0x0000000000ffffff; ActiveMaskEnd.use = 0xffff000000000000; ShiftBpp.use = 24; // == bpp(3) * 8 ShiftRem.use = 40; // == 64 - 24 _asm { mov ebx, diff mov edi, row mov esi, prev_row pxor mm0, mm0 // PRIME the pump (load the first Raw(x-bpp) data set movq mm1, [edi+ebx-8] dpth3lp: psrlq mm1, ShiftRem // shift last 3 bytes to 1st 3 bytes movq mm2, [esi + ebx] // load b=Prior(x) punpcklbw mm1, mm0 // Unpack High bytes of a movq mm3, [esi+ebx-8] // Prep c=Prior(x-bpp) bytes punpcklbw mm2, mm0 // Unpack High bytes of b psrlq mm3, ShiftRem // shift last 3 bytes to 1st 3 bytes // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 punpcklbw mm3, mm0 // Unpack High bytes of c // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 psubw mm4, mm3 pxor mm7, mm7 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv movq mm6, mm4 psubw mm5, mm3 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm4 // Create mask pav bytes < 0 paddw mm6, mm5 pand mm0, mm4 // Only pav bytes < 0 in mm7 pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 psubw mm4, mm0 pand mm7, mm5 // Only pbv bytes < 0 in mm0 psubw mm4, mm0 psubw mm5, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm5, mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm7 mask to merge pa & pb pand mm5, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 pandn mm7, mm4 pandn mm0, mm1 paddw mm7, mm5 paddw mm0, mm2 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? pxor mm1, mm1 pand mm3, mm7 pandn mm7, mm0 paddw mm7, mm3 pxor mm0, mm0 packuswb mm7, mm1 movq mm3, [esi + ebx] // load c=Prior(x-bpp) pand mm7, ActiveMask movq mm2, mm3 // load b=Prior(x) step 1 paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) punpcklbw mm3, mm0 // Unpack High bytes of c movq [edi + ebx], mm7 // write back updated value movq mm1, mm7 // Now mm1 will be used as Raw(x-bpp) // Now do Paeth for 2nd set of bytes (3-5) psrlq mm2, ShiftBpp // load b=Prior(x) step 2 punpcklbw mm1, mm0 // Unpack High bytes of a pxor mm7, mm7 punpcklbw mm2, mm0 // Unpack High bytes of b // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 psubw mm5, mm3 psubw mm4, mm3 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = // pav + pbv = pbv + pav movq mm6, mm5 paddw mm6, mm4 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm5 // Create mask pbv bytes < 0 pcmpgtw mm7, mm4 // Create mask pav bytes < 0 pand mm0, mm5 // Only pbv bytes < 0 in mm0 pand mm7, mm4 // Only pav bytes < 0 in mm7 psubw mm5, mm0 psubw mm4, mm7 psubw mm5, mm0 psubw mm4, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm7 mask to merge pa & pb pand mm5, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 pandn mm7, mm4 pandn mm0, mm1 paddw mm7, mm5 paddw mm0, mm2 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? movq mm2, [esi + ebx] // load b=Prior(x) pand mm3, mm7 pandn mm7, mm0 pxor mm1, mm1 paddw mm7, mm3 pxor mm0, mm0 packuswb mm7, mm1 movq mm3, mm2 // load c=Prior(x-bpp) step 1 pand mm7, ActiveMask punpckhbw mm2, mm0 // Unpack High bytes of b psllq mm7, ShiftBpp // Shift bytes to 2nd group of 3 bytes // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) psllq mm3, ShiftBpp // load c=Prior(x-bpp) step 2 movq [edi + ebx], mm7 // write back updated value movq mm1, mm7 punpckhbw mm3, mm0 // Unpack High bytes of c psllq mm1, ShiftBpp // Shift bytes // Now mm1 will be used as Raw(x-bpp) // Now do Paeth for 3rd, and final, set of bytes (6-7) pxor mm7, mm7 punpckhbw mm1, mm0 // Unpack High bytes of a psubw mm4, mm3 // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv movq mm6, mm4 psubw mm5, mm3 pxor mm0, mm0 paddw mm6, mm5 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm4 // Create mask pav bytes < 0 pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 pand mm0, mm4 // Only pav bytes < 0 in mm7 pand mm7, mm5 // Only pbv bytes < 0 in mm0 psubw mm4, mm0 psubw mm5, mm7 psubw mm4, mm0 psubw mm5, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 // use mm7 mask to merge pa & pb pand mm5, mm7 pandn mm0, mm1 pandn mm7, mm4 paddw mm0, mm2 paddw mm7, mm5 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? pand mm3, mm7 pandn mm7, mm0 paddw mm7, mm3 pxor mm1, mm1 packuswb mm1, mm7 // Step ebx to next set of 8 bytes and repeat loop til done add ebx, 8 pand mm1, ActiveMaskEnd paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x) cmp ebx, MMXLength pxor mm0, mm0 // pxor does not affect flags movq [edi + ebx - 8], mm1 // write back updated value // mm1 will be used as Raw(x-bpp) next loop // mm3 ready to be used as Prior(x-bpp) next loop jb dpth3lp } // end _asm block } break; case 6: case 7: case 5: { ActiveMask.use = 0x00000000ffffffff; ActiveMask2.use = 0xffffffff00000000; ShiftBpp.use = bpp << 3; // == bpp * 8 ShiftRem.use = 64 - ShiftBpp.use; _asm { mov ebx, diff mov edi, row mov esi, prev_row // PRIME the pump (load the first Raw(x-bpp) data set movq mm1, [edi+ebx-8] pxor mm0, mm0 dpth6lp: // Must shift to position Raw(x-bpp) data psrlq mm1, ShiftRem // Do first set of 4 bytes movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes punpcklbw mm1, mm0 // Unpack Low bytes of a movq mm2, [esi + ebx] // load b=Prior(x) punpcklbw mm2, mm0 // Unpack Low bytes of b // Must shift to position Prior(x-bpp) data psrlq mm3, ShiftRem // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 punpcklbw mm3, mm0 // Unpack Low bytes of c // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 psubw mm4, mm3 pxor mm7, mm7 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv movq mm6, mm4 psubw mm5, mm3 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm4 // Create mask pav bytes < 0 paddw mm6, mm5 pand mm0, mm4 // Only pav bytes < 0 in mm7 pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 psubw mm4, mm0 pand mm7, mm5 // Only pbv bytes < 0 in mm0 psubw mm4, mm0 psubw mm5, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm5, mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm7 mask to merge pa & pb pand mm5, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 pandn mm7, mm4 pandn mm0, mm1 paddw mm7, mm5 paddw mm0, mm2 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? pxor mm1, mm1 pand mm3, mm7 pandn mm7, mm0 paddw mm7, mm3 pxor mm0, mm0 packuswb mm7, mm1 movq mm3, [esi + ebx - 8] // load c=Prior(x-bpp) pand mm7, ActiveMask psrlq mm3, ShiftRem movq mm2, [esi + ebx] // load b=Prior(x) step 1 paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) movq mm6, mm2 movq [edi + ebx], mm7 // write back updated value movq mm1, [edi+ebx-8] psllq mm6, ShiftBpp movq mm5, mm7 psrlq mm1, ShiftRem por mm3, mm6 psllq mm5, ShiftBpp punpckhbw mm3, mm0 // Unpack High bytes of c por mm1, mm5 // Do second set of 4 bytes punpckhbw mm2, mm0 // Unpack High bytes of b punpckhbw mm1, mm0 // Unpack High bytes of a // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 psubw mm4, mm3 pxor mm7, mm7 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv movq mm6, mm4 psubw mm5, mm3 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm4 // Create mask pav bytes < 0 paddw mm6, mm5 pand mm0, mm4 // Only pav bytes < 0 in mm7 pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 psubw mm4, mm0 pand mm7, mm5 // Only pbv bytes < 0 in mm0 psubw mm4, mm0 psubw mm5, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm5, mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm7 mask to merge pa & pb pand mm5, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 pandn mm7, mm4 pandn mm0, mm1 paddw mm7, mm5 paddw mm0, mm2 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? pxor mm1, mm1 pand mm3, mm7 pandn mm7, mm0 pxor mm1, mm1 paddw mm7, mm3 pxor mm0, mm0 // Step ex to next set of 8 bytes and repeat loop til done add ebx, 8 packuswb mm1, mm7 paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x) cmp ebx, MMXLength movq [edi + ebx - 8], mm1 // write back updated value // mm1 will be used as Raw(x-bpp) next loop jb dpth6lp } // end _asm block } break; case 4: { ActiveMask.use = 0x00000000ffffffff; _asm { mov ebx, diff mov edi, row mov esi, prev_row pxor mm0, mm0 // PRIME the pump (load the first Raw(x-bpp) data set movq mm1, [edi+ebx-8] // Only time should need to read // a=Raw(x-bpp) bytes dpth4lp: // Do first set of 4 bytes movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes punpckhbw mm1, mm0 // Unpack Low bytes of a movq mm2, [esi + ebx] // load b=Prior(x) punpcklbw mm2, mm0 // Unpack High bytes of b // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 punpckhbw mm3, mm0 // Unpack High bytes of c // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 psubw mm4, mm3 pxor mm7, mm7 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv movq mm6, mm4 psubw mm5, mm3 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm4 // Create mask pav bytes < 0 paddw mm6, mm5 pand mm0, mm4 // Only pav bytes < 0 in mm7 pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 psubw mm4, mm0 pand mm7, mm5 // Only pbv bytes < 0 in mm0 psubw mm4, mm0 psubw mm5, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm5, mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm7 mask to merge pa & pb pand mm5, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 pandn mm7, mm4 pandn mm0, mm1 paddw mm7, mm5 paddw mm0, mm2 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? pxor mm1, mm1 pand mm3, mm7 pandn mm7, mm0 paddw mm7, mm3 pxor mm0, mm0 packuswb mm7, mm1 movq mm3, [esi + ebx] // load c=Prior(x-bpp) pand mm7, ActiveMask movq mm2, mm3 // load b=Prior(x) step 1 paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) punpcklbw mm3, mm0 // Unpack High bytes of c movq [edi + ebx], mm7 // write back updated value movq mm1, mm7 // Now mm1 will be used as Raw(x-bpp) // Do second set of 4 bytes punpckhbw mm2, mm0 // Unpack Low bytes of b punpcklbw mm1, mm0 // Unpack Low bytes of a // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 psubw mm4, mm3 pxor mm7, mm7 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv movq mm6, mm4 psubw mm5, mm3 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm4 // Create mask pav bytes < 0 paddw mm6, mm5 pand mm0, mm4 // Only pav bytes < 0 in mm7 pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 psubw mm4, mm0 pand mm7, mm5 // Only pbv bytes < 0 in mm0 psubw mm4, mm0 psubw mm5, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm5, mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm7 mask to merge pa & pb pand mm5, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 pandn mm7, mm4 pandn mm0, mm1 paddw mm7, mm5 paddw mm0, mm2 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? pxor mm1, mm1 pand mm3, mm7 pandn mm7, mm0 pxor mm1, mm1 paddw mm7, mm3 pxor mm0, mm0 // Step ex to next set of 8 bytes and repeat loop til done add ebx, 8 packuswb mm1, mm7 paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x) cmp ebx, MMXLength movq [edi + ebx - 8], mm1 // write back updated value // mm1 will be used as Raw(x-bpp) next loop jb dpth4lp } // end _asm block } break; case 8: // bpp == 8 { ActiveMask.use = 0x00000000ffffffff; _asm { mov ebx, diff mov edi, row mov esi, prev_row pxor mm0, mm0 // PRIME the pump (load the first Raw(x-bpp) data set movq mm1, [edi+ebx-8] // Only time should need to read // a=Raw(x-bpp) bytes dpth8lp: // Do first set of 4 bytes movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes punpcklbw mm1, mm0 // Unpack Low bytes of a movq mm2, [esi + ebx] // load b=Prior(x) punpcklbw mm2, mm0 // Unpack Low bytes of b // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 punpcklbw mm3, mm0 // Unpack Low bytes of c // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 psubw mm4, mm3 pxor mm7, mm7 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv movq mm6, mm4 psubw mm5, mm3 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm4 // Create mask pav bytes < 0 paddw mm6, mm5 pand mm0, mm4 // Only pav bytes < 0 in mm7 pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 psubw mm4, mm0 pand mm7, mm5 // Only pbv bytes < 0 in mm0 psubw mm4, mm0 psubw mm5, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm5, mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm7 mask to merge pa & pb pand mm5, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 pandn mm7, mm4 pandn mm0, mm1 paddw mm7, mm5 paddw mm0, mm2 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? pxor mm1, mm1 pand mm3, mm7 pandn mm7, mm0 paddw mm7, mm3 pxor mm0, mm0 packuswb mm7, mm1 movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes pand mm7, ActiveMask movq mm2, [esi + ebx] // load b=Prior(x) paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x) punpckhbw mm3, mm0 // Unpack High bytes of c movq [edi + ebx], mm7 // write back updated value movq mm1, [edi+ebx-8] // read a=Raw(x-bpp) bytes // Do second set of 4 bytes punpckhbw mm2, mm0 // Unpack High bytes of b punpckhbw mm1, mm0 // Unpack High bytes of a // pav = p - a = (a + b - c) - a = b - c movq mm4, mm2 // pbv = p - b = (a + b - c) - b = a - c movq mm5, mm1 psubw mm4, mm3 pxor mm7, mm7 // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv movq mm6, mm4 psubw mm5, mm3 // pa = abs(p-a) = abs(pav) // pb = abs(p-b) = abs(pbv) // pc = abs(p-c) = abs(pcv) pcmpgtw mm0, mm4 // Create mask pav bytes < 0 paddw mm6, mm5 pand mm0, mm4 // Only pav bytes < 0 in mm7 pcmpgtw mm7, mm5 // Create mask pbv bytes < 0 psubw mm4, mm0 pand mm7, mm5 // Only pbv bytes < 0 in mm0 psubw mm4, mm0 psubw mm5, mm7 pxor mm0, mm0 pcmpgtw mm0, mm6 // Create mask pcv bytes < 0 pand mm0, mm6 // Only pav bytes < 0 in mm7 psubw mm5, mm7 psubw mm6, mm0 // test pa <= pb movq mm7, mm4 psubw mm6, mm0 pcmpgtw mm7, mm5 // pa > pb? movq mm0, mm7 // use mm7 mask to merge pa & pb pand mm5, mm7 // use mm0 mask copy to merge a & b pand mm2, mm0 pandn mm7, mm4 pandn mm0, mm1 paddw mm7, mm5 paddw mm0, mm2 // test ((pa <= pb)? pa:pb) <= pc pcmpgtw mm7, mm6 // pab > pc? pxor mm1, mm1 pand mm3, mm7 pandn mm7, mm0 pxor mm1, mm1 paddw mm7, mm3 pxor mm0, mm0 // Step ex to next set of 8 bytes and repeat loop til done add ebx, 8 packuswb mm1, mm7 paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x) cmp ebx, MMXLength movq [edi + ebx - 8], mm1 // write back updated value // mm1 will be used as Raw(x-bpp) next loop jb dpth8lp } // end _asm block } break; case 1: // bpp = 1 case 2: // bpp = 2 default: // bpp > 8 { _asm { mov ebx, diff cmp ebx, FullLength jnb dpthdend mov edi, row mov esi, prev_row // Do Paeth decode for remaining bytes mov edx, ebx xor ecx, ecx // zero ecx before using cl & cx in loop below sub edx, bpp // Set edx = ebx - bpp dpthdlp: xor eax, eax // pav = p - a = (a + b - c) - a = b - c mov al, [esi + ebx] // load Prior(x) into al mov cl, [esi + edx] // load Prior(x-bpp) into cl sub eax, ecx // subtract Prior(x-bpp) mov patemp, eax // Save pav for later use xor eax, eax // pbv = p - b = (a + b - c) - b = a - c mov al, [edi + edx] // load Raw(x-bpp) into al sub eax, ecx // subtract Prior(x-bpp) mov ecx, eax // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv add eax, patemp // pcv = pav + pbv // pc = abs(pcv) test eax, 0x80000000 jz dpthdpca neg eax // reverse sign of neg values dpthdpca: mov pctemp, eax // save pc for later use // pb = abs(pbv) test ecx, 0x80000000 jz dpthdpba neg ecx // reverse sign of neg values dpthdpba: mov pbtemp, ecx // save pb for later use // pa = abs(pav) mov eax, patemp test eax, 0x80000000 jz dpthdpaa neg eax // reverse sign of neg values dpthdpaa: mov patemp, eax // save pa for later use // test if pa <= pb cmp eax, ecx jna dpthdabb // pa > pb; now test if pb <= pc cmp ecx, pctemp jna dpthdbbc // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) mov cl, [esi + edx] // load Prior(x-bpp) into cl jmp dpthdpaeth dpthdbbc: // pb <= pc; Raw(x) = Paeth(x) + Prior(x) mov cl, [esi + ebx] // load Prior(x) into cl jmp dpthdpaeth dpthdabb: // pa <= pb; now test if pa <= pc cmp eax, pctemp jna dpthdabc // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) mov cl, [esi + edx] // load Prior(x-bpp) into cl jmp dpthdpaeth dpthdabc: // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) mov cl, [edi + edx] // load Raw(x-bpp) into cl dpthdpaeth: inc ebx inc edx // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 add [edi + ebx - 1], cl cmp ebx, FullLength jb dpthdlp dpthdend: } // end _asm block } return; // No need to go further with this one } // end switch ( bpp ) _asm { // MMX acceleration complete now do clean-up // Check if any remaining bytes left to decode mov ebx, MMXLength cmp ebx, FullLength jnb dpthend mov edi, row mov esi, prev_row // Do Paeth decode for remaining bytes mov edx, ebx xor ecx, ecx // zero ecx before using cl & cx in loop below sub edx, bpp // Set edx = ebx - bpp dpthlp2: xor eax, eax // pav = p - a = (a + b - c) - a = b - c mov al, [esi + ebx] // load Prior(x) into al mov cl, [esi + edx] // load Prior(x-bpp) into cl sub eax, ecx // subtract Prior(x-bpp) mov patemp, eax // Save pav for later use xor eax, eax // pbv = p - b = (a + b - c) - b = a - c mov al, [edi + edx] // load Raw(x-bpp) into al sub eax, ecx // subtract Prior(x-bpp) mov ecx, eax // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv add eax, patemp // pcv = pav + pbv // pc = abs(pcv) test eax, 0x80000000 jz dpthpca2 neg eax // reverse sign of neg values dpthpca2: mov pctemp, eax // save pc for later use // pb = abs(pbv) test ecx, 0x80000000 jz dpthpba2 neg ecx // reverse sign of neg values dpthpba2: mov pbtemp, ecx // save pb for later use // pa = abs(pav) mov eax, patemp test eax, 0x80000000 jz dpthpaa2 neg eax // reverse sign of neg values dpthpaa2: mov patemp, eax // save pa for later use // test if pa <= pb cmp eax, ecx jna dpthabb2 // pa > pb; now test if pb <= pc cmp ecx, pctemp jna dpthbbc2 // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp) mov cl, [esi + edx] // load Prior(x-bpp) into cl jmp dpthpaeth2 dpthbbc2: // pb <= pc; Raw(x) = Paeth(x) + Prior(x) mov cl, [esi + ebx] // load Prior(x) into cl jmp dpthpaeth2 dpthabb2: // pa <= pb; now test if pa <= pc cmp eax, pctemp jna dpthabc2 // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp) mov cl, [esi + edx] // load Prior(x-bpp) into cl jmp dpthpaeth2 dpthabc2: // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp) mov cl, [edi + edx] // load Raw(x-bpp) into cl dpthpaeth2: inc ebx inc edx // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256 add [edi + ebx - 1], cl cmp ebx, FullLength jb dpthlp2 dpthend: emms // End MMX instructions; prep for possible FP instrs. } // end _asm block } // Optimized code for PNG Sub filter decoder void /* PRIVATE */ png_read_filter_row_mmx_sub(png_row_infop row_info, png_bytep row) { //int test; int bpp; png_uint_32 FullLength; png_uint_32 MMXLength; int diff; bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel FullLength = row_info->rowbytes - bpp; // # of bytes to filter _asm { mov edi, row mov esi, edi // lp = row add edi, bpp // rp = row + bpp xor eax, eax // get # of bytes to alignment mov diff, edi // take start of row add diff, 0xf // add 7 + 8 to incr past // alignment boundary xor ebx, ebx and diff, 0xfffffff8 // mask to alignment boundary sub diff, edi // subtract from start ==> value // ebx at alignment jz dsubgo // fix alignment dsublp1: mov al, [esi+ebx] add [edi+ebx], al inc ebx cmp ebx, diff jb dsublp1 dsubgo: mov ecx, FullLength mov edx, ecx sub edx, ebx // subtract alignment fix and edx, 0x00000007 // calc bytes over mult of 8 sub ecx, edx // drop over bytes from length mov MMXLength, ecx } // end _asm block // Now do the math for the rest of the row switch ( bpp ) { case 3: { ActiveMask.use = 0x0000ffffff000000; ShiftBpp.use = 24; // == 3 * 8 ShiftRem.use = 40; // == 64 - 24 _asm { mov edi, row movq mm7, ActiveMask // Load ActiveMask for 2nd active byte group mov esi, edi // lp = row add edi, bpp // rp = row + bpp movq mm6, mm7 mov ebx, diff psllq mm6, ShiftBpp // Move mask in mm6 to cover 3rd active // byte group // PRIME the pump (load the first Raw(x-bpp) data set movq mm1, [edi+ebx-8] dsub3lp: psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes // no need for mask; shift clears inactive bytes // Add 1st active group movq mm0, [edi+ebx] paddb mm0, mm1 // Add 2nd active group movq mm1, mm0 // mov updated Raws to mm1 psllq mm1, ShiftBpp // shift data to position correctly pand mm1, mm7 // mask to use only 2nd active group paddb mm0, mm1 // Add 3rd active group movq mm1, mm0 // mov updated Raws to mm1 psllq mm1, ShiftBpp // shift data to position correctly pand mm1, mm6 // mask to use only 3rd active group add ebx, 8 paddb mm0, mm1 cmp ebx, MMXLength movq [edi+ebx-8], mm0 // Write updated Raws back to array // Prep for doing 1st add at top of loop movq mm1, mm0 jb dsub3lp } // end _asm block } break; case 1: { // Placed here just in case this is a duplicate of the // non-MMX code for the SUB filter in png_read_filter_row below // // png_bytep rp; // png_bytep lp; // png_uint_32 i; // bpp = (row_info->pixel_depth + 7) >> 3; // for (i = (png_uint_32)bpp, rp = row + bpp, lp = row; // i < row_info->rowbytes; i++, rp++, lp++) // { // *rp = (png_byte)(((int)(*rp) + (int)(*lp)) & 0xff); // } _asm { mov ebx, diff mov edi, row cmp ebx, FullLength jnb dsub1end mov esi, edi // lp = row xor eax, eax add edi, bpp // rp = row + bpp dsub1lp: mov al, [esi+ebx] add [edi+ebx], al inc ebx cmp ebx, FullLength jb dsub1lp dsub1end: } // end _asm block } return; case 6: case 7: case 4: case 5: { ShiftBpp.use = bpp << 3; ShiftRem.use = 64 - ShiftBpp.use; _asm { mov edi, row mov ebx, diff mov esi, edi // lp = row add edi, bpp // rp = row + bpp // PRIME the pump (load the first Raw(x-bpp) data set movq mm1, [edi+ebx-8] dsub4lp: psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes // no need for mask; shift clears inactive bytes movq mm0, [edi+ebx] paddb mm0, mm1 // Add 2nd active group movq mm1, mm0 // mov updated Raws to mm1 psllq mm1, ShiftBpp // shift data to position correctly // there is no need for any mask // since shift clears inactive bits/bytes add ebx, 8 paddb mm0, mm1 cmp ebx, MMXLength movq [edi+ebx-8], mm0 movq mm1, mm0 // Prep for doing 1st add at top of loop jb dsub4lp } // end _asm block } break; case 2: { ActiveMask.use = 0x00000000ffff0000; ShiftBpp.use = 16; // == 2 * 8 ShiftRem.use = 48; // == 64 - 16 _asm { movq mm7, ActiveMask // Load ActiveMask for 2nd active byte group mov ebx, diff movq mm6, mm7 mov edi, row psllq mm6, ShiftBpp // Move mask in mm6 to cover 3rd active // byte group mov esi, edi // lp = row movq mm5, mm6 add edi, bpp // rp = row + bpp psllq mm5, ShiftBpp // Move mask in mm5 to cover 4th active // byte group // PRIME the pump (load the first Raw(x-bpp) data set movq mm1, [edi+ebx-8] dsub2lp: // Add 1st active group psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes // no need for mask; shift clears inactive // bytes movq mm0, [edi+ebx] paddb mm0, mm1 // Add 2nd active group movq mm1, mm0 // mov updated Raws to mm1 psllq mm1, ShiftBpp // shift data to position correctly pand mm1, mm7 // mask to use only 2nd active group paddb mm0, mm1 // Add 3rd active group movq mm1, mm0 // mov updated Raws to mm1 psllq mm1, ShiftBpp // shift data to position correctly pand mm1, mm6 // mask to use only 3rd active group paddb mm0, mm1 // Add 4th active group movq mm1, mm0 // mov updated Raws to mm1 psllq mm1, ShiftBpp // shift data to position correctly pand mm1, mm5 // mask to use only 4th active group add ebx, 8 paddb mm0, mm1 cmp ebx, MMXLength movq [edi+ebx-8], mm0 // Write updated Raws back to array movq mm1, mm0 // Prep for doing 1st add at top of loop jb dsub2lp } // end _asm block } break; case 8: { _asm { mov edi, row mov ebx, diff mov esi, edi // lp = row add edi, bpp // rp = row + bpp mov ecx, MMXLength movq mm7, [edi+ebx-8] // PRIME the pump (load the first // Raw(x-bpp) data set and ecx, 0x0000003f // calc bytes over mult of 64 dsub8lp: movq mm0, [edi+ebx] // Load Sub(x) for 1st 8 bytes paddb mm0, mm7 movq mm1, [edi+ebx+8] // Load Sub(x) for 2nd 8 bytes movq [edi+ebx], mm0 // Write Raw(x) for 1st 8 bytes // Now mm0 will be used as Raw(x-bpp) for // the 2nd group of 8 bytes. This will be // repeated for each group of 8 bytes with // the 8th group being used as the Raw(x-bpp) // for the 1st group of the next loop. paddb mm1, mm0 movq mm2, [edi+ebx+16] // Load Sub(x) for 3rd 8 bytes movq [edi+ebx+8], mm1 // Write Raw(x) for 2nd 8 bytes paddb mm2, mm1 movq mm3, [edi+ebx+24] // Load Sub(x) for 4th 8 bytes movq [edi+ebx+16], mm2 // Write Raw(x) for 3rd 8 bytes paddb mm3, mm2 movq mm4, [edi+ebx+32] // Load Sub(x) for 5th 8 bytes movq [edi+ebx+24], mm3 // Write Raw(x) for 4th 8 bytes paddb mm4, mm3 movq mm5, [edi+ebx+40] // Load Sub(x) for 6th 8 bytes movq [edi+ebx+32], mm4 // Write Raw(x) for 5th 8 bytes paddb mm5, mm4 movq mm6, [edi+ebx+48] // Load Sub(x) for 7th 8 bytes movq [edi+ebx+40], mm5 // Write Raw(x) for 6th 8 bytes paddb mm6, mm5 movq mm7, [edi+ebx+56] // Load Sub(x) for 8th 8 bytes movq [edi+ebx+48], mm6 // Write Raw(x) for 7th 8 bytes add ebx, 64 paddb mm7, mm6 cmp ebx, ecx movq [edi+ebx-8], mm7 // Write Raw(x) for 8th 8 bytes jb dsub8lp cmp ebx, MMXLength jnb dsub8lt8 dsub8lpA: movq mm0, [edi+ebx] add ebx, 8 paddb mm0, mm7 cmp ebx, MMXLength movq [edi+ebx-8], mm0 // use -8 to offset early add to ebx movq mm7, mm0 // Move calculated Raw(x) data to mm1 to // be the new Raw(x-bpp) for the next loop jb dsub8lpA dsub8lt8: } // end _asm block } break; default: // bpp greater than 8 bytes { _asm { mov ebx, diff mov edi, row mov esi, edi // lp = row add edi, bpp // rp = row + bpp dsubAlp: movq mm0, [edi+ebx] movq mm1, [esi+ebx] add ebx, 8 paddb mm0, mm1 cmp ebx, MMXLength movq [edi+ebx-8], mm0 // mov does not affect flags; -8 to offset // add ebx jb dsubAlp } // end _asm block } break; } // end switch ( bpp ) _asm { mov ebx, MMXLength mov edi, row cmp ebx, FullLength jnb dsubend mov esi, edi // lp = row xor eax, eax add edi, bpp // rp = row + bpp dsublp2: mov al, [esi+ebx] add [edi+ebx], al inc ebx cmp ebx, FullLength jb dsublp2 dsubend: emms // End MMX instructions; prep for possible FP instrs. } // end _asm block } // Optimized code for PNG Up filter decoder void /* PRIVATE */ png_read_filter_row_mmx_up(png_row_infop row_info, png_bytep row, png_bytep prev_row) { png_uint_32 len; len = row_info->rowbytes; // # of bytes to filter _asm { mov edi, row // get # of bytes to alignment mov ecx, edi xor ebx, ebx add ecx, 0x7 xor eax, eax and ecx, 0xfffffff8 mov esi, prev_row sub ecx, edi jz dupgo // fix alignment duplp1: mov al, [edi+ebx] add al, [esi+ebx] inc ebx cmp ebx, ecx mov [edi + ebx-1], al // mov does not affect flags; -1 to offset inc ebx jb duplp1 dupgo: mov ecx, len mov edx, ecx sub edx, ebx // subtract alignment fix and edx, 0x0000003f // calc bytes over mult of 64 sub ecx, edx // drop over bytes from length // Unrolled loop - use all MMX registers and interleave to reduce // number of branch instructions (loops) and reduce partial stalls duploop: movq mm1, [esi+ebx] movq mm0, [edi+ebx] movq mm3, [esi+ebx+8] paddb mm0, mm1 movq mm2, [edi+ebx+8] movq [edi+ebx], mm0 paddb mm2, mm3 movq mm5, [esi+ebx+16] movq [edi+ebx+8], mm2 movq mm4, [edi+ebx+16] movq mm7, [esi+ebx+24] paddb mm4, mm5 movq mm6, [edi+ebx+24] movq [edi+ebx+16], mm4 paddb mm6, mm7 movq mm1, [esi+ebx+32] movq [edi+ebx+24], mm6 movq mm0, [edi+ebx+32] movq mm3, [esi+ebx+40] paddb mm0, mm1 movq mm2, [edi+ebx+40] movq [edi+ebx+32], mm0 paddb mm2, mm3 movq mm5, [esi+ebx+48] movq [edi+ebx+40], mm2 movq mm4, [edi+ebx+48] movq mm7, [esi+ebx+56] paddb mm4, mm5 movq mm6, [edi+ebx+56] movq [edi+ebx+48], mm4 add ebx, 64 paddb mm6, mm7 cmp ebx, ecx movq [edi+ebx-8], mm6 // (+56)movq does not affect flags; // -8 to offset add ebx jb duploop cmp edx, 0 // Test for bytes over mult of 64 jz dupend // 2 lines added by lcreeve@netins.net // (mail 11 Jul 98 in png-implement list) cmp edx, 8 //test for less than 8 bytes jb duplt8 add ecx, edx and edx, 0x00000007 // calc bytes over mult of 8 sub ecx, edx // drop over bytes from length jz duplt8 // Loop using MMX registers mm0 & mm1 to update 8 bytes simultaneously duplpA: movq mm1, [esi+ebx] movq mm0, [edi+ebx] add ebx, 8 paddb mm0, mm1 cmp ebx, ecx movq [edi+ebx-8], mm0 // movq does not affect flags; -8 to offset add ebx jb duplpA cmp edx, 0 // Test for bytes over mult of 8 jz dupend duplt8: xor eax, eax add ecx, edx // move over byte count into counter // Loop using x86 registers to update remaining bytes duplp2: mov al, [edi + ebx] add al, [esi + ebx] inc ebx cmp ebx, ecx mov [edi + ebx-1], al // mov does not affect flags; -1 to offset inc ebx jb duplp2 dupend: // Conversion of filtered row completed emms // End MMX instructions; prep for possible FP instrs. } // end _asm block } // Optimized png_read_filter_row routines void /* PRIVATE */ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter) { #ifdef PNG_DEBUG char filnm[10]; #endif if (mmx_supported == 2) { /* this should have happened in png_init_mmx_flags() already */ png_warning(png_ptr, "asm_flags may not have been initialized"); png_mmx_support(); } #ifdef PNG_DEBUG png_debug(1, "in png_read_filter_row\n"); switch (filter) { case 0: sprintf(filnm, "none"); break; case 1: sprintf(filnm, "sub-%s", (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)? "MMX" : "x86"); break; case 2: sprintf(filnm, "up-%s", (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP)? "MMX" : "x86"); break; case 3: sprintf(filnm, "avg-%s", (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)? "MMX" : "x86"); break; case 4: sprintf(filnm, "Paeth-%s", (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)? "MMX":"x86"); break; default: sprintf(filnm, "unknw"); break; } png_debug2(0,"row=%5d, %s, ", png_ptr->row_number, filnm); png_debug2(0, "pd=%2d, b=%d, ", (int)row_info->pixel_depth, (int)((row_info->pixel_depth + 7) >> 3)); png_debug1(0,"len=%8d, ", row_info->rowbytes); #endif /* PNG_DEBUG */ switch (filter) { case PNG_FILTER_VALUE_NONE: break; case PNG_FILTER_VALUE_SUB: { if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB) && (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) { png_read_filter_row_mmx_sub(row_info, row); } else { png_uint_32 i; png_uint_32 istop = row_info->rowbytes; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_bytep rp = row + bpp; png_bytep lp = row; for (i = bpp; i < istop; i++) { *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); rp++; } } break; } case PNG_FILTER_VALUE_UP: { if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP) && (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) { png_read_filter_row_mmx_up(row_info, row, prev_row); } else { png_uint_32 i; png_uint_32 istop = row_info->rowbytes; png_bytep rp = row; png_bytep pp = prev_row; for (i = 0; i < istop; ++i) { *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); rp++; } } break; } case PNG_FILTER_VALUE_AVG: { if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG) && (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) { png_read_filter_row_mmx_avg(row_info, row, prev_row); } else { png_uint_32 i; png_bytep rp = row; png_bytep pp = prev_row; png_bytep lp = row; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_uint_32 istop = row_info->rowbytes - bpp; for (i = 0; i < bpp; i++) { *rp = (png_byte)(((int)(*rp) + ((int)(*pp++) >> 1)) & 0xff); rp++; } for (i = 0; i < istop; i++) { *rp = (png_byte)(((int)(*rp) + ((int)(*pp++ + *lp++) >> 1)) & 0xff); rp++; } } break; } case PNG_FILTER_VALUE_PAETH: { if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH) && (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) && (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold)) { png_read_filter_row_mmx_paeth(row_info, row, prev_row); } else { png_uint_32 i; png_bytep rp = row; png_bytep pp = prev_row; png_bytep lp = row; png_bytep cp = prev_row; png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; png_uint_32 istop=row_info->rowbytes - bpp; for (i = 0; i < bpp; i++) { *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); rp++; } for (i = 0; i < istop; i++) // use leftover rp,pp { int a, b, c, pa, pb, pc, p; a = *lp++; b = *pp++; c = *cp++; p = b - c; pc = a - c; #ifdef PNG_USE_ABS pa = abs(p); pb = abs(pc); pc = abs(p + pc); #else pa = p < 0 ? -p : p; pb = pc < 0 ? -pc : pc; pc = (p + pc) < 0 ? -(p + pc) : p + pc; #endif /* if (pa <= pb && pa <= pc) p = a; else if (pb <= pc) p = b; else p = c; */ p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; *rp = (png_byte)(((int)(*rp) + p) & 0xff); rp++; } } break; } default: png_warning(png_ptr, "Ignoring bad row filter type"); *row=0; break; } } #endif /* PNG_ASSEMBLER_CODE_SUPPORTED && PNG_USE_PNGVCRD */ gamera-3.3.3/src/libpng-1.2.5/pngwio.c0000644000076500000000000001641610714675701016134 0ustar chriswheel /* pngwio.c - functions for data output * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) * * This file provides a location for all output. Users who need * special handling are expected to write functions that have the same * arguments as these and perform similar functions, but that possibly * use different output methods. Note that you shouldn't change these * functions, but rather write replacement functions and then change * them at run time with png_set_write_fn(...). */ #define PNG_INTERNAL #include "png.h" #ifdef PNG_WRITE_SUPPORTED /* Write the data to whatever output you are using. The default routine writes to a file pointer. Note that this routine sometimes gets called with very small lengths, so you should implement some kind of simple buffering if you are using unbuffered writes. This should never be asked to write more than 64K on a 16 bit machine. */ void /* PRIVATE */ png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { if (png_ptr->write_data_fn != NULL ) (*(png_ptr->write_data_fn))(png_ptr, data, length); else png_error(png_ptr, "Call to NULL write function"); } #if !defined(PNG_NO_STDIO) /* This is the function that does the actual writing of data. If you are not writing to a standard C stream, you should create a replacement write_data function and use it at run time with png_set_write_fn(), rather than changing the library. */ #ifndef USE_FAR_KEYWORD void PNGAPI png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_uint_32 check; #if defined(_WIN32_WCE) if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) check = 0; #else check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); #endif if (check != length) png_error(png_ptr, "Write Error"); } #else /* this is the model-independent version. Since the standard I/O library can't handle far buffers in the medium and small models, we have to copy the data. */ #define NEAR_BUF_SIZE 1024 #define MIN(a,b) (a <= b ? a : b) void PNGAPI png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) { png_uint_32 check; png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */ png_FILE_p io_ptr; /* Check if data really is near. If so, use usual code. */ near_data = (png_byte *)CVT_PTR_NOCHECK(data); io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); if ((png_bytep)near_data == data) { #if defined(_WIN32_WCE) if ( !WriteFile(io_ptr, near_data, length, &check, NULL) ) check = 0; #else check = fwrite(near_data, 1, length, io_ptr); #endif } else { png_byte buf[NEAR_BUF_SIZE]; png_size_t written, remaining, err; check = 0; remaining = length; do { written = MIN(NEAR_BUF_SIZE, remaining); png_memcpy(buf, data, written); /* copy far buffer to near buffer */ #if defined(_WIN32_WCE) if ( !WriteFile(io_ptr, buf, written, &err, NULL) ) err = 0; #else err = fwrite(buf, 1, written, io_ptr); #endif if (err != written) break; else check += err; data += written; remaining -= written; } while (remaining != 0); } if (check != length) png_error(png_ptr, "Write Error"); } #endif #endif /* This function is called to output any data pending writing (normally to disk). After png_flush is called, there should be no data pending writing in any buffers. */ #if defined(PNG_WRITE_FLUSH_SUPPORTED) void /* PRIVATE */ png_flush(png_structp png_ptr) { if (png_ptr->output_flush_fn != NULL) (*(png_ptr->output_flush_fn))(png_ptr); } #if !defined(PNG_NO_STDIO) void PNGAPI png_default_flush(png_structp png_ptr) { #if !defined(_WIN32_WCE) png_FILE_p io_ptr; io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); if (io_ptr != NULL) fflush(io_ptr); #endif } #endif #endif /* This function allows the application to supply new output functions for libpng if standard C streams aren't being used. This function takes as its arguments: png_ptr - pointer to a png output data structure io_ptr - pointer to user supplied structure containing info about the output functions. May be NULL. write_data_fn - pointer to a new output function that takes as its arguments a pointer to a png_struct, a pointer to data to be written, and a 32-bit unsigned int that is the number of bytes to be written. The new write function should call png_error(png_ptr, "Error msg") to exit and output any fatal error messages. flush_data_fn - pointer to a new flush function that takes as its arguments a pointer to a png_struct. After a call to the flush function, there should be no data in any buffers or pending transmission. If the output method doesn't do any buffering of ouput, a function prototype must still be supplied although it doesn't have to do anything. If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time, output_flush_fn will be ignored, although it must be supplied for compatibility. */ void PNGAPI png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) { png_ptr->io_ptr = io_ptr; #if !defined(PNG_NO_STDIO) if (write_data_fn != NULL) png_ptr->write_data_fn = write_data_fn; else png_ptr->write_data_fn = png_default_write_data; #else png_ptr->write_data_fn = write_data_fn; #endif #if defined(PNG_WRITE_FLUSH_SUPPORTED) #if !defined(PNG_NO_STDIO) if (output_flush_fn != NULL) png_ptr->output_flush_fn = output_flush_fn; else png_ptr->output_flush_fn = png_default_flush; #else png_ptr->output_flush_fn = output_flush_fn; #endif #endif /* PNG_WRITE_FLUSH_SUPPORTED */ /* It is an error to read while writing a png file */ if (png_ptr->read_data_fn != NULL) { png_ptr->read_data_fn = NULL; png_warning(png_ptr, "Attempted to set both read_data_fn and write_data_fn in"); png_warning(png_ptr, "the same structure. Resetting read_data_fn to NULL."); } } #if defined(USE_FAR_KEYWORD) #if defined(_MSC_VER) void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) { void *near_ptr; void FAR *far_ptr; FP_OFF(near_ptr) = FP_OFF(ptr); far_ptr = (void FAR *)near_ptr; if(check != 0) if(FP_SEG(ptr) != FP_SEG(far_ptr)) png_error(png_ptr,"segment lost in conversion"); return(near_ptr); } # else void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) { void *near_ptr; void FAR *far_ptr; near_ptr = (void FAR *)ptr; far_ptr = (void FAR *)near_ptr; if(check != 0) if(far_ptr != ptr) png_error(png_ptr,"segment lost in conversion"); return(near_ptr); } # endif # endif #endif /* PNG_WRITE_SUPPORTED */ gamera-3.3.3/src/libpng-1.2.5/pngwrite.c0000644000076500000000000013445710714675701016476 0ustar chriswheel /* pngwrite.c - general routines to write a PNG file * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ /* get internal access to png.h */ #define PNG_INTERNAL #include "png.h" #ifdef PNG_WRITE_SUPPORTED /* Writes all the PNG information. This is the suggested way to use the * library. If you have a new chunk to add, make a function to write it, * and put it in the correct location here. If you want the chunk written * after the image data, put it in png_write_end(). I strongly encourage * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing * the chunk, as that will keep the code from breaking if you want to just * write a plain PNG file. If you have long comments, I suggest writing * them in png_write_end(), and compressing them. */ void PNGAPI png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_write_info_before_PLTE\n"); if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) { png_write_sig(png_ptr); /* write PNG signature */ #if defined(PNG_MNG_FEATURES_SUPPORTED) if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted)) { png_warning(png_ptr,"MNG features are not allowed in a PNG datastream\n"); png_ptr->mng_features_permitted=0; } #endif /* write IHDR information. */ png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, info_ptr->filter_type, #if defined(PNG_WRITE_INTERLACING_SUPPORTED) info_ptr->interlace_type); #else 0); #endif /* the rest of these check to see if the valid field has the appropriate flag set, and if it does, writes the chunk. */ #if defined(PNG_WRITE_gAMA_SUPPORTED) if (info_ptr->valid & PNG_INFO_gAMA) { # ifdef PNG_FLOATING_POINT_SUPPORTED png_write_gAMA(png_ptr, info_ptr->gamma); #else #ifdef PNG_FIXED_POINT_SUPPORTED png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); # endif #endif } #endif #if defined(PNG_WRITE_sRGB_SUPPORTED) if (info_ptr->valid & PNG_INFO_sRGB) png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); #endif #if defined(PNG_WRITE_iCCP_SUPPORTED) if (info_ptr->valid & PNG_INFO_iCCP) png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); #endif #if defined(PNG_WRITE_sBIT_SUPPORTED) if (info_ptr->valid & PNG_INFO_sBIT) png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); #endif #if defined(PNG_WRITE_cHRM_SUPPORTED) if (info_ptr->valid & PNG_INFO_cHRM) { #ifdef PNG_FLOATING_POINT_SUPPORTED png_write_cHRM(png_ptr, info_ptr->x_white, info_ptr->y_white, info_ptr->x_red, info_ptr->y_red, info_ptr->x_green, info_ptr->y_green, info_ptr->x_blue, info_ptr->y_blue); #else # ifdef PNG_FIXED_POINT_SUPPORTED png_write_cHRM_fixed(png_ptr, info_ptr->int_x_white, info_ptr->int_y_white, info_ptr->int_x_red, info_ptr->int_y_red, info_ptr->int_x_green, info_ptr->int_y_green, info_ptr->int_x_blue, info_ptr->int_y_blue); # endif #endif } #endif #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) if (info_ptr->unknown_chunks_num) { png_unknown_chunk *up; png_debug(5, "writing extra chunks\n"); for (up = info_ptr->unknown_chunks; up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; up++) { int keep=png_handle_as_unknown(png_ptr, up->name); if (keep != HANDLE_CHUNK_NEVER && up->location && (!(up->location & PNG_HAVE_PLTE)) && ((up->name[3] & 0x20) || keep == HANDLE_CHUNK_ALWAYS || (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) { png_write_chunk(png_ptr, up->name, up->data, up->size); } } } #endif png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; } } void PNGAPI png_write_info(png_structp png_ptr, png_infop info_ptr) { #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) int i; #endif png_debug(1, "in png_write_info\n"); png_write_info_before_PLTE(png_ptr, info_ptr); if (info_ptr->valid & PNG_INFO_PLTE) png_write_PLTE(png_ptr, info_ptr->palette, (png_uint_32)info_ptr->num_palette); else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) png_error(png_ptr, "Valid palette required for paletted images\n"); #if defined(PNG_WRITE_tRNS_SUPPORTED) if (info_ptr->valid & PNG_INFO_tRNS) { #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) /* invert the alpha channel (in tRNS) */ if ((png_ptr->transformations & PNG_INVERT_ALPHA) && info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { int j; for (j=0; j<(int)info_ptr->num_trans; j++) info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); } #endif png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), info_ptr->num_trans, info_ptr->color_type); } #endif #if defined(PNG_WRITE_bKGD_SUPPORTED) if (info_ptr->valid & PNG_INFO_bKGD) png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); #endif #if defined(PNG_WRITE_hIST_SUPPORTED) if (info_ptr->valid & PNG_INFO_hIST) png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); #endif #if defined(PNG_WRITE_oFFs_SUPPORTED) if (info_ptr->valid & PNG_INFO_oFFs) png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, info_ptr->offset_unit_type); #endif #if defined(PNG_WRITE_pCAL_SUPPORTED) if (info_ptr->valid & PNG_INFO_pCAL) png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, info_ptr->pcal_units, info_ptr->pcal_params); #endif #if defined(PNG_WRITE_sCAL_SUPPORTED) if (info_ptr->valid & PNG_INFO_sCAL) #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); #else #ifdef PNG_FIXED_POINT_SUPPORTED png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, info_ptr->scal_s_width, info_ptr->scal_s_height); #else png_warning(png_ptr, "png_write_sCAL not supported; sCAL chunk not written.\n"); #endif #endif #endif #if defined(PNG_WRITE_pHYs_SUPPORTED) if (info_ptr->valid & PNG_INFO_pHYs) png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); #endif #if defined(PNG_WRITE_tIME_SUPPORTED) if (info_ptr->valid & PNG_INFO_tIME) { png_write_tIME(png_ptr, &(info_ptr->mod_time)); png_ptr->mode |= PNG_WROTE_tIME; } #endif #if defined(PNG_WRITE_sPLT_SUPPORTED) if (info_ptr->valid & PNG_INFO_sPLT) for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) /* Check to see if we need to write text chunks */ for (i = 0; i < info_ptr->num_text; i++) { png_debug2(2, "Writing header text chunk %d, type %d\n", i, info_ptr->text[i].compression); /* an internationalized chunk? */ if (info_ptr->text[i].compression > 0) { #if defined(PNG_WRITE_iTXt_SUPPORTED) /* write international chunk */ png_write_iTXt(png_ptr, info_ptr->text[i].compression, info_ptr->text[i].key, info_ptr->text[i].lang, info_ptr->text[i].lang_key, info_ptr->text[i].text); #else png_warning(png_ptr, "Unable to write international text\n"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } /* If we want a compressed text chunk */ else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) { #if defined(PNG_WRITE_zTXt_SUPPORTED) /* write compressed chunk */ png_write_zTXt(png_ptr, info_ptr->text[i].key, info_ptr->text[i].text, 0, info_ptr->text[i].compression); #else png_warning(png_ptr, "Unable to write compressed text\n"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; } else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) { #if defined(PNG_WRITE_tEXt_SUPPORTED) /* write uncompressed chunk */ png_write_tEXt(png_ptr, info_ptr->text[i].key, info_ptr->text[i].text, 0); #else png_warning(png_ptr, "Unable to write uncompressed text\n"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } } #endif #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) if (info_ptr->unknown_chunks_num) { png_unknown_chunk *up; png_debug(5, "writing extra chunks\n"); for (up = info_ptr->unknown_chunks; up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; up++) { int keep=png_handle_as_unknown(png_ptr, up->name); if (keep != HANDLE_CHUNK_NEVER && up->location && (up->location & PNG_HAVE_PLTE) && !(up->location & PNG_HAVE_IDAT) && ((up->name[3] & 0x20) || keep == HANDLE_CHUNK_ALWAYS || (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) { png_write_chunk(png_ptr, up->name, up->data, up->size); } } } #endif } /* Writes the end of the PNG file. If you don't want to write comments or * time information, you can pass NULL for info. If you already wrote these * in png_write_info(), do not write them again here. If you have long * comments, I suggest writing them here, and compressing them. */ void PNGAPI png_write_end(png_structp png_ptr, png_infop info_ptr) { png_debug(1, "in png_write_end\n"); if (!(png_ptr->mode & PNG_HAVE_IDAT)) png_error(png_ptr, "No IDATs written into file"); /* see if user wants us to write information chunks */ if (info_ptr != NULL) { #if defined(PNG_WRITE_TEXT_SUPPORTED) int i; /* local index variable */ #endif #if defined(PNG_WRITE_tIME_SUPPORTED) /* check to see if user has supplied a time chunk */ if ((info_ptr->valid & PNG_INFO_tIME) && !(png_ptr->mode & PNG_WROTE_tIME)) png_write_tIME(png_ptr, &(info_ptr->mod_time)); #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) /* loop through comment chunks */ for (i = 0; i < info_ptr->num_text; i++) { png_debug2(2, "Writing trailer text chunk %d, type %d\n", i, info_ptr->text[i].compression); /* an internationalized chunk? */ if (info_ptr->text[i].compression > 0) { #if defined(PNG_WRITE_iTXt_SUPPORTED) /* write international chunk */ png_write_iTXt(png_ptr, info_ptr->text[i].compression, info_ptr->text[i].key, info_ptr->text[i].lang, info_ptr->text[i].lang_key, info_ptr->text[i].text); #else png_warning(png_ptr, "Unable to write international text\n"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) { #if defined(PNG_WRITE_zTXt_SUPPORTED) /* write compressed chunk */ png_write_zTXt(png_ptr, info_ptr->text[i].key, info_ptr->text[i].text, 0, info_ptr->text[i].compression); #else png_warning(png_ptr, "Unable to write compressed text\n"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; } else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) { #if defined(PNG_WRITE_tEXt_SUPPORTED) /* write uncompressed chunk */ png_write_tEXt(png_ptr, info_ptr->text[i].key, info_ptr->text[i].text, 0); #else png_warning(png_ptr, "Unable to write uncompressed text\n"); #endif /* Mark this chunk as written */ info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; } } #endif #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) if (info_ptr->unknown_chunks_num) { png_unknown_chunk *up; png_debug(5, "writing extra chunks\n"); for (up = info_ptr->unknown_chunks; up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; up++) { int keep=png_handle_as_unknown(png_ptr, up->name); if (keep != HANDLE_CHUNK_NEVER && up->location && (up->location & PNG_AFTER_IDAT) && ((up->name[3] & 0x20) || keep == HANDLE_CHUNK_ALWAYS || (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) { png_write_chunk(png_ptr, up->name, up->data, up->size); } } } #endif } png_ptr->mode |= PNG_AFTER_IDAT; /* write end of PNG file */ png_write_IEND(png_ptr); #if 0 /* This flush, added in libpng-1.0.8, causes some applications to crash because they do not set png_ptr->output_flush_fn */ png_flush(png_ptr); #endif } #if defined(PNG_WRITE_tIME_SUPPORTED) #if !defined(_WIN32_WCE) /* "time.h" functions are not supported on WindowsCE */ void PNGAPI png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime) { png_debug(1, "in png_convert_from_struct_tm\n"); ptime->year = (png_uint_16)(1900 + ttime->tm_year); ptime->month = (png_byte)(ttime->tm_mon + 1); ptime->day = (png_byte)ttime->tm_mday; ptime->hour = (png_byte)ttime->tm_hour; ptime->minute = (png_byte)ttime->tm_min; ptime->second = (png_byte)ttime->tm_sec; } void PNGAPI png_convert_from_time_t(png_timep ptime, time_t ttime) { struct tm *tbuf; png_debug(1, "in png_convert_from_time_t\n"); tbuf = gmtime(&ttime); png_convert_from_struct_tm(ptime, tbuf); } #endif #endif /* Initialize png_ptr structure, and allocate any memory needed */ png_structp PNGAPI png_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn) { #ifdef PNG_USER_MEM_SUPPORTED return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); } /* Alternate initialize png_ptr structure, and allocate any memory needed */ png_structp PNGAPI png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn) { #endif /* PNG_USER_MEM_SUPPORTED */ png_structp png_ptr; #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD jmp_buf jmpbuf; #endif #endif int i; png_debug(1, "in png_create_write_struct\n"); #ifdef PNG_USER_MEM_SUPPORTED png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); #else png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); #endif /* PNG_USER_MEM_SUPPORTED */ if (png_ptr == NULL) return (NULL); #if !defined(PNG_1_0_X) #ifdef PNG_ASSEMBLER_CODE_SUPPORTED png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ #endif #endif /* PNG_1_0_X */ #ifdef PNG_SETJMP_SUPPORTED #ifdef USE_FAR_KEYWORD if (setjmp(jmpbuf)) #else if (setjmp(png_ptr->jmpbuf)) #endif { png_free(png_ptr, png_ptr->zbuf); png_ptr->zbuf=NULL; png_destroy_struct(png_ptr); return (NULL); } #ifdef USE_FAR_KEYWORD png_memcpy(png_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf)); #endif #endif #ifdef PNG_USER_MEM_SUPPORTED png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); #endif /* PNG_USER_MEM_SUPPORTED */ png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); i=0; do { if(user_png_ver[i] != png_libpng_ver[i]) png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; } while (png_libpng_ver[i++]); if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) { /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so * we must recompile any applications that use any older library version. * For versions after libpng 1.0, we will be compatible, so we need * only check the first digit. */ if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || (user_png_ver[0] == '0' && user_png_ver[2] < '9')) { #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) char msg[80]; if (user_png_ver) { sprintf(msg, "Application was compiled with png.h from libpng-%.20s", user_png_ver); png_warning(png_ptr, msg); } sprintf(msg, "Application is running with png.c from libpng-%.20s", png_libpng_ver); png_warning(png_ptr, msg); #endif #ifdef PNG_ERROR_NUMBERS_SUPPORTED png_ptr->flags=0; #endif png_error(png_ptr, "Incompatible libpng version in application and library"); } } /* initialize zbuf - compression buffer */ png_ptr->zbuf_size = PNG_ZBUF_SIZE; png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, png_flush_ptr_NULL); #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 1, png_doublep_NULL, png_doublep_NULL); #endif #ifdef PNG_SETJMP_SUPPORTED /* Applications that neglect to set up their own setjmp() and then encounter a png_error() will longjmp here. Since the jmpbuf is then meaningless we abort instead of returning. */ #ifdef USE_FAR_KEYWORD if (setjmp(jmpbuf)) PNG_ABORT(); png_memcpy(png_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf)); #else if (setjmp(png_ptr->jmpbuf)) PNG_ABORT(); #endif #endif return (png_ptr); } /* Initialize png_ptr structure, and allocate any memory needed */ #undef png_write_init void PNGAPI png_write_init(png_structp png_ptr) { /* We only come here via pre-1.0.7-compiled applications */ png_write_init_2(png_ptr, "1.0.6 or earlier", 0, 0); } void PNGAPI png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t png_info_size) { /* We only come here via pre-1.0.12-compiled applications */ #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) if(sizeof(png_struct) > png_struct_size || sizeof(png_info) > png_info_size) { char msg[80]; png_ptr->warning_fn=NULL; if (user_png_ver) { sprintf(msg, "Application was compiled with png.h from libpng-%.20s", user_png_ver); png_warning(png_ptr, msg); } sprintf(msg, "Application is running with png.c from libpng-%.20s", png_libpng_ver); png_warning(png_ptr, msg); } #endif if(sizeof(png_struct) > png_struct_size) { png_ptr->error_fn=NULL; #ifdef PNG_ERROR_NUMBERS_SUPPORTED png_ptr->flags=0; #endif png_error(png_ptr, "The png struct allocated by the application for writing is too small."); } if(sizeof(png_info) > png_info_size) { png_ptr->error_fn=NULL; #ifdef PNG_ERROR_NUMBERS_SUPPORTED png_ptr->flags=0; #endif png_error(png_ptr, "The info struct allocated by the application for writing is too small."); } png_write_init_3(&png_ptr, user_png_ver, png_struct_size); } void PNGAPI png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, png_size_t png_struct_size) { png_structp png_ptr=*ptr_ptr; #ifdef PNG_SETJMP_SUPPORTED jmp_buf tmp_jmp; /* to save current jump buffer */ #endif int i = 0; do { if (user_png_ver[i] != png_libpng_ver[i]) { #ifdef PNG_LEGACY_SUPPORTED png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; #else png_ptr->warning_fn=NULL; png_warning(png_ptr, "Application uses deprecated png_write_init() and should be recompiled."); break; #endif } } while (png_libpng_ver[i++]); png_debug(1, "in png_write_init_3\n"); #ifdef PNG_SETJMP_SUPPORTED /* save jump buffer and error functions */ png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf)); #endif if (sizeof(png_struct) > png_struct_size) { png_destroy_struct(png_ptr); png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); *ptr_ptr = png_ptr; } /* reset all variables to 0 */ png_memset(png_ptr, 0, sizeof (png_struct)); #if !defined(PNG_1_0_X) #ifdef PNG_ASSEMBLER_CODE_SUPPORTED png_init_mmx_flags(png_ptr); /* 1.2.0 addition */ #endif #endif /* PNG_1_0_X */ #ifdef PNG_SETJMP_SUPPORTED /* restore jump buffer */ png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf)); #endif png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, png_flush_ptr_NULL); /* initialize zbuf - compression buffer */ png_ptr->zbuf_size = PNG_ZBUF_SIZE; png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, 1, png_doublep_NULL, png_doublep_NULL); #endif } /* Write a few rows of image data. If the image is interlaced, * either you will have to write the 7 sub images, or, if you * have called png_set_interlace_handling(), you will have to * "write" the image seven times. */ void PNGAPI png_write_rows(png_structp png_ptr, png_bytepp row, png_uint_32 num_rows) { png_uint_32 i; /* row counter */ png_bytepp rp; /* row pointer */ png_debug(1, "in png_write_rows\n"); /* loop through the rows */ for (i = 0, rp = row; i < num_rows; i++, rp++) { png_write_row(png_ptr, *rp); } } /* Write the image. You only need to call this function once, even * if you are writing an interlaced image. */ void PNGAPI png_write_image(png_structp png_ptr, png_bytepp image) { png_uint_32 i; /* row index */ int pass, num_pass; /* pass variables */ png_bytepp rp; /* points to current row */ png_debug(1, "in png_write_image\n"); #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* intialize interlace handling. If image is not interlaced, this will set pass to 1 */ num_pass = png_set_interlace_handling(png_ptr); #else num_pass = 1; #endif /* loop through passes */ for (pass = 0; pass < num_pass; pass++) { /* loop through image */ for (i = 0, rp = image; i < png_ptr->height; i++, rp++) { png_write_row(png_ptr, *rp); } } } /* called by user to write a row of image data */ void PNGAPI png_write_row(png_structp png_ptr, png_bytep row) { png_debug2(1, "in png_write_row (row %ld, pass %d)\n", png_ptr->row_number, png_ptr->pass); /* initialize transformations and other stuff if first time */ if (png_ptr->row_number == 0 && png_ptr->pass == 0) { /* make sure we wrote the header info */ if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) png_error(png_ptr, "png_write_info was never called before png_write_row."); /* check for transforms that have been set but were defined out */ #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) if (png_ptr->transformations & PNG_INVERT_MONO) png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); #endif #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) if (png_ptr->transformations & PNG_FILLER) png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); #endif #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); #endif #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) if (png_ptr->transformations & PNG_PACK) png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); #endif #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) if (png_ptr->transformations & PNG_SHIFT) png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); #endif #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) if (png_ptr->transformations & PNG_BGR) png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); #endif #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) if (png_ptr->transformations & PNG_SWAP_BYTES) png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); #endif png_write_start_row(png_ptr); } #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* if interlaced and not interested in row, return */ if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) { switch (png_ptr->pass) { case 0: if (png_ptr->row_number & 0x07) { png_write_finish_row(png_ptr); return; } break; case 1: if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) { png_write_finish_row(png_ptr); return; } break; case 2: if ((png_ptr->row_number & 0x07) != 4) { png_write_finish_row(png_ptr); return; } break; case 3: if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) { png_write_finish_row(png_ptr); return; } break; case 4: if ((png_ptr->row_number & 0x03) != 2) { png_write_finish_row(png_ptr); return; } break; case 5: if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) { png_write_finish_row(png_ptr); return; } break; case 6: if (!(png_ptr->row_number & 0x01)) { png_write_finish_row(png_ptr); return; } break; } } #endif /* set up row info for transformations */ png_ptr->row_info.color_type = png_ptr->color_type; png_ptr->row_info.width = png_ptr->usr_width; png_ptr->row_info.channels = png_ptr->usr_channels; png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * png_ptr->row_info.channels); png_ptr->row_info.rowbytes = ((png_ptr->row_info.width * (png_uint_32)png_ptr->row_info.pixel_depth + 7) >> 3); png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type); png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width); png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels); png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth); png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth); png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes); /* Copy user's row into buffer, leaving room for filter byte. */ png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, png_ptr->row_info.rowbytes); #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* handle interlacing */ if (png_ptr->interlaced && png_ptr->pass < 6 && (png_ptr->transformations & PNG_INTERLACE)) { png_do_write_interlace(&(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->pass); /* this should always get caught above, but still ... */ if (!(png_ptr->row_info.width)) { png_write_finish_row(png_ptr); return; } } #endif /* handle other transformations */ if (png_ptr->transformations) png_do_write_transformations(png_ptr); #if defined(PNG_MNG_FEATURES_SUPPORTED) /* Write filter_method 64 (intrapixel differencing) only if * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and * 2. Libpng did not write a PNG signature (this filter_method is only * used in PNG datastreams that are embedded in MNG datastreams) and * 3. The application called png_permit_mng_features with a mask that * included PNG_FLAG_MNG_FILTER_64 and * 4. The filter_method is 64 and * 5. The color_type is RGB or RGBA */ if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) { /* Intrapixel differencing */ png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); } #endif /* Find a filter if necessary, filter the row and write it out. */ png_write_find_filter(png_ptr, &(png_ptr->row_info)); if (png_ptr->write_row_fn != NULL) (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); } #if defined(PNG_WRITE_FLUSH_SUPPORTED) /* Set the automatic flush interval or 0 to turn flushing off */ void PNGAPI png_set_flush(png_structp png_ptr, int nrows) { png_debug(1, "in png_set_flush\n"); png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); } /* flush the current output buffers now */ void PNGAPI png_write_flush(png_structp png_ptr) { int wrote_IDAT; png_debug(1, "in png_write_flush\n"); /* We have already written out all of the data */ if (png_ptr->row_number >= png_ptr->num_rows) return; do { int ret; /* compress the data */ ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); wrote_IDAT = 0; /* check for compression errors */ if (ret != Z_OK) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); else png_error(png_ptr, "zlib error"); } if (!(png_ptr->zstream.avail_out)) { /* write the IDAT and reset the zlib output buffer */ png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; wrote_IDAT = 1; } } while(wrote_IDAT == 1); /* If there is any data left to be output, write it into a new IDAT */ if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) { /* write the IDAT and reset the zlib output buffer */ png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - png_ptr->zstream.avail_out); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } png_ptr->flush_rows = 0; png_flush(png_ptr); } #endif /* PNG_WRITE_FLUSH_SUPPORTED */ /* free all memory used by the write */ void PNGAPI png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) { png_structp png_ptr = NULL; png_infop info_ptr = NULL; #ifdef PNG_USER_MEM_SUPPORTED png_free_ptr free_fn = NULL; png_voidp mem_ptr = NULL; #endif png_debug(1, "in png_destroy_write_struct\n"); if (png_ptr_ptr != NULL) { png_ptr = *png_ptr_ptr; #ifdef PNG_USER_MEM_SUPPORTED free_fn = png_ptr->free_fn; mem_ptr = png_ptr->mem_ptr; #endif } if (info_ptr_ptr != NULL) info_ptr = *info_ptr_ptr; if (info_ptr != NULL) { png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) if (png_ptr->num_chunk_list) { png_free(png_ptr, png_ptr->chunk_list); png_ptr->chunk_list=NULL; png_ptr->num_chunk_list=0; } #endif #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)info_ptr); #endif *info_ptr_ptr = NULL; } if (png_ptr != NULL) { png_write_destroy(png_ptr); #ifdef PNG_USER_MEM_SUPPORTED png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, (png_voidp)mem_ptr); #else png_destroy_struct((png_voidp)png_ptr); #endif *png_ptr_ptr = NULL; } } /* Free any memory used in png_ptr struct (old method) */ void /* PRIVATE */ png_write_destroy(png_structp png_ptr) { #ifdef PNG_SETJMP_SUPPORTED jmp_buf tmp_jmp; /* save jump buffer */ #endif png_error_ptr error_fn; png_error_ptr warning_fn; png_voidp error_ptr; #ifdef PNG_USER_MEM_SUPPORTED png_free_ptr free_fn; #endif png_debug(1, "in png_write_destroy\n"); /* free any memory zlib uses */ deflateEnd(&png_ptr->zstream); /* free our memory. png_free checks NULL for us. */ png_free(png_ptr, png_ptr->zbuf); png_free(png_ptr, png_ptr->row_buf); png_free(png_ptr, png_ptr->prev_row); png_free(png_ptr, png_ptr->sub_row); png_free(png_ptr, png_ptr->up_row); png_free(png_ptr, png_ptr->avg_row); png_free(png_ptr, png_ptr->paeth_row); #if defined(PNG_TIME_RFC1123_SUPPORTED) png_free(png_ptr, png_ptr->time_buffer); #endif #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) png_free(png_ptr, png_ptr->prev_filters); png_free(png_ptr, png_ptr->filter_weights); png_free(png_ptr, png_ptr->inv_filter_weights); png_free(png_ptr, png_ptr->filter_costs); png_free(png_ptr, png_ptr->inv_filter_costs); #endif #ifdef PNG_SETJMP_SUPPORTED /* reset structure */ png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf)); #endif error_fn = png_ptr->error_fn; warning_fn = png_ptr->warning_fn; error_ptr = png_ptr->error_ptr; #ifdef PNG_USER_MEM_SUPPORTED free_fn = png_ptr->free_fn; #endif png_memset(png_ptr, 0, sizeof (png_struct)); png_ptr->error_fn = error_fn; png_ptr->warning_fn = warning_fn; png_ptr->error_ptr = error_ptr; #ifdef PNG_USER_MEM_SUPPORTED png_ptr->free_fn = free_fn; #endif #ifdef PNG_SETJMP_SUPPORTED png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf)); #endif } /* Allow the application to select one or more row filters to use. */ void PNGAPI png_set_filter(png_structp png_ptr, int method, int filters) { png_debug(1, "in png_set_filter\n"); #if defined(PNG_MNG_FEATURES_SUPPORTED) if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && (method == PNG_INTRAPIXEL_DIFFERENCING)) method = PNG_FILTER_TYPE_BASE; #endif if (method == PNG_FILTER_TYPE_BASE) { switch (filters & (PNG_ALL_FILTERS | 0x07)) { case 5: case 6: case 7: png_warning(png_ptr, "Unknown row filter for method 0"); case PNG_FILTER_VALUE_NONE: png_ptr->do_filter=PNG_FILTER_NONE; break; case PNG_FILTER_VALUE_SUB: png_ptr->do_filter=PNG_FILTER_SUB; break; case PNG_FILTER_VALUE_UP: png_ptr->do_filter=PNG_FILTER_UP; break; case PNG_FILTER_VALUE_AVG: png_ptr->do_filter=PNG_FILTER_AVG; break; case PNG_FILTER_VALUE_PAETH: png_ptr->do_filter=PNG_FILTER_PAETH;break; default: png_ptr->do_filter = (png_byte)filters; break; } /* If we have allocated the row_buf, this means we have already started * with the image and we should have allocated all of the filter buffers * that have been selected. If prev_row isn't already allocated, then * it is too late to start using the filters that need it, since we * will be missing the data in the previous row. If an application * wants to start and stop using particular filters during compression, * it should start out with all of the filters, and then add and * remove them after the start of compression. */ if (png_ptr->row_buf != NULL) { if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) { png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; } if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) { if (png_ptr->prev_row == NULL) { png_warning(png_ptr, "Can't add Up filter after starting"); png_ptr->do_filter &= ~PNG_FILTER_UP; } else { png_ptr->up_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; } } if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) { if (png_ptr->prev_row == NULL) { png_warning(png_ptr, "Can't add Average filter after starting"); png_ptr->do_filter &= ~PNG_FILTER_AVG; } else { png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; } } if ((png_ptr->do_filter & PNG_FILTER_PAETH) && png_ptr->paeth_row == NULL) { if (png_ptr->prev_row == NULL) { png_warning(png_ptr, "Can't add Paeth filter after starting"); png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); } else { png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; } } if (png_ptr->do_filter == PNG_NO_FILTERS) png_ptr->do_filter = PNG_FILTER_NONE; } } else png_error(png_ptr, "Unknown custom filter method"); } /* This allows us to influence the way in which libpng chooses the "best" * filter for the current scanline. While the "minimum-sum-of-absolute- * differences metric is relatively fast and effective, there is some * question as to whether it can be improved upon by trying to keep the * filtered data going to zlib more consistent, hopefully resulting in * better compression. */ #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* GRR 970116 */ void PNGAPI png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, int num_weights, png_doublep filter_weights, png_doublep filter_costs) { int i; png_debug(1, "in png_set_filter_heuristics\n"); if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) { png_warning(png_ptr, "Unknown filter heuristic method"); return; } if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) { heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; } if (num_weights < 0 || filter_weights == NULL || heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) { num_weights = 0; } png_ptr->num_prev_filters = (png_byte)num_weights; png_ptr->heuristic_method = (png_byte)heuristic_method; if (num_weights > 0) { if (png_ptr->prev_filters == NULL) { png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, (png_uint_32)(sizeof(png_byte) * num_weights)); /* To make sure that the weighting starts out fairly */ for (i = 0; i < num_weights; i++) { png_ptr->prev_filters[i] = 255; } } if (png_ptr->filter_weights == NULL) { png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, (png_uint_32)(sizeof(png_uint_16) * num_weights)); png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, (png_uint_32)(sizeof(png_uint_16) * num_weights)); for (i = 0; i < num_weights; i++) { png_ptr->inv_filter_weights[i] = png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; } } for (i = 0; i < num_weights; i++) { if (filter_weights[i] < 0.0) { png_ptr->inv_filter_weights[i] = png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; } else { png_ptr->inv_filter_weights[i] = (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); png_ptr->filter_weights[i] = (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); } } } /* If, in the future, there are other filter methods, this would * need to be based on png_ptr->filter. */ if (png_ptr->filter_costs == NULL) { png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, (png_uint_32)(sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, (png_uint_32)(sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) { png_ptr->inv_filter_costs[i] = png_ptr->filter_costs[i] = PNG_COST_FACTOR; } } /* Here is where we set the relative costs of the different filters. We * should take the desired compression level into account when setting * the costs, so that Paeth, for instance, has a high relative cost at low * compression levels, while it has a lower relative cost at higher * compression settings. The filter types are in order of increasing * relative cost, so it would be possible to do this with an algorithm. */ for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) { if (filter_costs == NULL || filter_costs[i] < 0.0) { png_ptr->inv_filter_costs[i] = png_ptr->filter_costs[i] = PNG_COST_FACTOR; } else if (filter_costs[i] >= 1.0) { png_ptr->inv_filter_costs[i] = (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); png_ptr->filter_costs[i] = (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); } } } #endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ void PNGAPI png_set_compression_level(png_structp png_ptr, int level) { png_debug(1, "in png_set_compression_level\n"); png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; png_ptr->zlib_level = level; } void PNGAPI png_set_compression_mem_level(png_structp png_ptr, int mem_level) { png_debug(1, "in png_set_compression_mem_level\n"); png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; png_ptr->zlib_mem_level = mem_level; } void PNGAPI png_set_compression_strategy(png_structp png_ptr, int strategy) { png_debug(1, "in png_set_compression_strategy\n"); png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; png_ptr->zlib_strategy = strategy; } void PNGAPI png_set_compression_window_bits(png_structp png_ptr, int window_bits) { if (window_bits > 15) png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); else if (window_bits < 8) png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); #ifndef WBITS_8_OK /* avoid libpng bug with 256-byte windows */ if (window_bits == 8) { png_warning(png_ptr, "Compression window is being reset to 512"); window_bits=9; } #endif png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; png_ptr->zlib_window_bits = window_bits; } void PNGAPI png_set_compression_method(png_structp png_ptr, int method) { png_debug(1, "in png_set_compression_method\n"); if (method != 8) png_warning(png_ptr, "Only compression method 8 is supported by PNG"); png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; png_ptr->zlib_method = method; } void PNGAPI png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) { png_ptr->write_row_fn = write_row_fn; } #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) void PNGAPI png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr write_user_transform_fn) { png_debug(1, "in png_set_write_user_transform_fn\n"); png_ptr->transformations |= PNG_USER_TRANSFORM; png_ptr->write_user_transform_fn = write_user_transform_fn; } #endif #if defined(PNG_INFO_IMAGE_SUPPORTED) void PNGAPI png_write_png(png_structp png_ptr, png_infop info_ptr, int transforms, voidp params) { #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) /* invert the alpha channel from opacity to transparency */ if (transforms & PNG_TRANSFORM_INVERT_ALPHA) png_set_invert_alpha(png_ptr); #endif /* Write the file header information. */ png_write_info(png_ptr, info_ptr); /* ------ these transformations don't touch the info structure ------- */ #if defined(PNG_WRITE_INVERT_SUPPORTED) /* invert monochrome pixels */ if (transforms & PNG_TRANSFORM_INVERT_MONO) png_set_invert_mono(png_ptr); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) /* Shift the pixels up to a legal bit depth and fill in * as appropriate to correctly scale the image. */ if ((transforms & PNG_TRANSFORM_SHIFT) && (info_ptr->valid & PNG_INFO_sBIT)) png_set_shift(png_ptr, &info_ptr->sig_bit); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) /* pack pixels into bytes */ if (transforms & PNG_TRANSFORM_PACKING) png_set_packing(png_ptr); #endif #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) /* swap location of alpha bytes from ARGB to RGBA */ if (transforms & PNG_TRANSFORM_SWAP_ALPHA) png_set_swap_alpha(png_ptr); #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels). The second parameter is not used. */ if (transforms & PNG_TRANSFORM_STRIP_FILLER) png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); #endif #if defined(PNG_WRITE_BGR_SUPPORTED) /* flip BGR pixels to RGB */ if (transforms & PNG_TRANSFORM_BGR) png_set_bgr(png_ptr); #endif #if defined(PNG_WRITE_SWAP_SUPPORTED) /* swap bytes of 16-bit files to most significant byte first */ if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) png_set_swap(png_ptr); #endif #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) /* swap bits of 1, 2, 4 bit packed pixel formats */ if (transforms & PNG_TRANSFORM_PACKSWAP) png_set_packswap(png_ptr); #endif /* ----------------------- end of transformations ------------------- */ /* write the bits */ if (info_ptr->valid & PNG_INFO_IDAT) png_write_image(png_ptr, info_ptr->row_pointers); /* It is REQUIRED to call this to finish writing the rest of the file */ png_write_end(png_ptr, info_ptr); if(transforms == 0 || params == NULL) /* quiet compiler warnings */ return; } #endif #endif /* PNG_WRITE_SUPPORTED */ gamera-3.3.3/src/libpng-1.2.5/pngwtran.c0000644000076500000000000004107410714675701016467 0ustar chriswheel /* pngwtran.c - transforms the data in a row for PNG writers * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ #define PNG_INTERNAL #include "png.h" #ifdef PNG_WRITE_SUPPORTED /* Transform the data according to the user's wishes. The order of * transformations is significant. */ void /* PRIVATE */ png_do_write_transformations(png_structp png_ptr) { png_debug(1, "in png_do_write_transformations\n"); if (png_ptr == NULL) return; #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) if (png_ptr->transformations & PNG_USER_TRANSFORM) if(png_ptr->write_user_transform_fn != NULL) (*(png_ptr->write_user_transform_fn)) /* user write transform function */ (png_ptr, /* png_ptr */ &(png_ptr->row_info), /* row_info: */ /* png_uint_32 width; width of row */ /* png_uint_32 rowbytes; number of bytes in row */ /* png_byte color_type; color type of pixels */ /* png_byte bit_depth; bit depth of samples */ /* png_byte channels; number of channels (1-4) */ /* png_byte pixel_depth; bits per pixel (depth*channels) */ png_ptr->row_buf + 1); /* start of pixel data for row */ #endif #if defined(PNG_WRITE_FILLER_SUPPORTED) if (png_ptr->transformations & PNG_FILLER) png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, png_ptr->flags); #endif #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) if (png_ptr->transformations & PNG_PACKSWAP) png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_WRITE_PACK_SUPPORTED) if (png_ptr->transformations & PNG_PACK) png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1, (png_uint_32)png_ptr->bit_depth); #endif #if defined(PNG_WRITE_SWAP_SUPPORTED) if (png_ptr->transformations & PNG_SWAP_BYTES) png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) if (png_ptr->transformations & PNG_SHIFT) png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1, &(png_ptr->shift)); #endif #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) if (png_ptr->transformations & PNG_INVERT_ALPHA) png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) if (png_ptr->transformations & PNG_SWAP_ALPHA) png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_WRITE_BGR_SUPPORTED) if (png_ptr->transformations & PNG_BGR) png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif #if defined(PNG_WRITE_INVERT_SUPPORTED) if (png_ptr->transformations & PNG_INVERT_MONO) png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); #endif } #if defined(PNG_WRITE_PACK_SUPPORTED) /* Pack pixels into bytes. Pass the true bit depth in bit_depth. The * row_info bit depth should be 8 (one pixel per byte). The channels * should be 1 (this only happens on grayscale and paletted images). */ void /* PRIVATE */ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) { png_debug(1, "in png_do_pack\n"); if (row_info->bit_depth == 8 && #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif row_info->channels == 1) { switch ((int)bit_depth) { case 1: { png_bytep sp, dp; int mask, v; png_uint_32 i; png_uint_32 row_width = row_info->width; sp = row; dp = row; mask = 0x80; v = 0; for (i = 0; i < row_width; i++) { if (*sp != 0) v |= mask; sp++; if (mask > 1) mask >>= 1; else { mask = 0x80; *dp = (png_byte)v; dp++; v = 0; } } if (mask != 0x80) *dp = (png_byte)v; break; } case 2: { png_bytep sp, dp; int shift, v; png_uint_32 i; png_uint_32 row_width = row_info->width; sp = row; dp = row; shift = 6; v = 0; for (i = 0; i < row_width; i++) { png_byte value; value = (png_byte)(*sp & 0x03); v |= (value << shift); if (shift == 0) { shift = 6; *dp = (png_byte)v; dp++; v = 0; } else shift -= 2; sp++; } if (shift != 6) *dp = (png_byte)v; break; } case 4: { png_bytep sp, dp; int shift, v; png_uint_32 i; png_uint_32 row_width = row_info->width; sp = row; dp = row; shift = 4; v = 0; for (i = 0; i < row_width; i++) { png_byte value; value = (png_byte)(*sp & 0x0f); v |= (value << shift); if (shift == 0) { shift = 4; *dp = (png_byte)v; dp++; v = 0; } else shift -= 4; sp++; } if (shift != 4) *dp = (png_byte)v; break; } } row_info->bit_depth = (png_byte)bit_depth; row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); row_info->rowbytes = ((row_info->width * row_info->pixel_depth + 7) >> 3); } } #endif #if defined(PNG_WRITE_SHIFT_SUPPORTED) /* Shift pixel values to take advantage of whole range. Pass the * true number of bits in bit_depth. The row should be packed * according to row_info->bit_depth. Thus, if you had a row of * bit depth 4, but the pixels only had values from 0 to 7, you * would pass 3 as bit_depth, and this routine would translate the * data to 0 to 15. */ void /* PRIVATE */ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) { png_debug(1, "in png_do_shift\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL && #else if ( #endif row_info->color_type != PNG_COLOR_TYPE_PALETTE) { int shift_start[4], shift_dec[4]; int channels = 0; if (row_info->color_type & PNG_COLOR_MASK_COLOR) { shift_start[channels] = row_info->bit_depth - bit_depth->red; shift_dec[channels] = bit_depth->red; channels++; shift_start[channels] = row_info->bit_depth - bit_depth->green; shift_dec[channels] = bit_depth->green; channels++; shift_start[channels] = row_info->bit_depth - bit_depth->blue; shift_dec[channels] = bit_depth->blue; channels++; } else { shift_start[channels] = row_info->bit_depth - bit_depth->gray; shift_dec[channels] = bit_depth->gray; channels++; } if (row_info->color_type & PNG_COLOR_MASK_ALPHA) { shift_start[channels] = row_info->bit_depth - bit_depth->alpha; shift_dec[channels] = bit_depth->alpha; channels++; } /* with low row depths, could only be grayscale, so one channel */ if (row_info->bit_depth < 8) { png_bytep bp = row; png_uint_32 i; png_byte mask; png_uint_32 row_bytes = row_info->rowbytes; if (bit_depth->gray == 1 && row_info->bit_depth == 2) mask = 0x55; else if (row_info->bit_depth == 4 && bit_depth->gray == 3) mask = 0x11; else mask = 0xff; for (i = 0; i < row_bytes; i++, bp++) { png_uint_16 v; int j; v = *bp; *bp = 0; for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) { if (j > 0) *bp |= (png_byte)((v << j) & 0xff); else *bp |= (png_byte)((v >> (-j)) & mask); } } } else if (row_info->bit_depth == 8) { png_bytep bp = row; png_uint_32 i; png_uint_32 istop = channels * row_info->width; for (i = 0; i < istop; i++, bp++) { png_uint_16 v; int j; int c = (int)(i%channels); v = *bp; *bp = 0; for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) { if (j > 0) *bp |= (png_byte)((v << j) & 0xff); else *bp |= (png_byte)((v >> (-j)) & 0xff); } } } else { png_bytep bp; png_uint_32 i; png_uint_32 istop = channels * row_info->width; for (bp = row, i = 0; i < istop; i++) { int c = (int)(i%channels); png_uint_16 value, v; int j; v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1)); value = 0; for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) { if (j > 0) value |= (png_uint_16)((v << j) & (png_uint_16)0xffff); else value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff); } *bp++ = (png_byte)(value >> 8); *bp++ = (png_byte)(value & 0xff); } } } } #endif #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) void /* PRIVATE */ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_write_swap_alpha\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL) #endif { if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { /* This converts from ARGB to RGBA */ if (row_info->bit_depth == 8) { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; for (i = 0, sp = dp = row; i < row_width; i++) { png_byte save = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = save; } } /* This converts from AARRGGBB to RRGGBBAA */ else { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; for (i = 0, sp = dp = row; i < row_width; i++) { png_byte save[2]; save[0] = *(sp++); save[1] = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = save[0]; *(dp++) = save[1]; } } } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { /* This converts from AG to GA */ if (row_info->bit_depth == 8) { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; for (i = 0, sp = dp = row; i < row_width; i++) { png_byte save = *(sp++); *(dp++) = *(sp++); *(dp++) = save; } } /* This converts from AAGG to GGAA */ else { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; for (i = 0, sp = dp = row; i < row_width; i++) { png_byte save[2]; save[0] = *(sp++); save[1] = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = save[0]; *(dp++) = save[1]; } } } } } #endif #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) void /* PRIVATE */ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_write_invert_alpha\n"); #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL) #endif { if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) { /* This inverts the alpha channel in RGBA */ if (row_info->bit_depth == 8) { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; for (i = 0, sp = dp = row; i < row_width; i++) { *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = (png_byte)(255 - *(sp++)); } } /* This inverts the alpha channel in RRGGBBAA */ else { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; for (i = 0, sp = dp = row; i < row_width; i++) { *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = (png_byte)(255 - *(sp++)); *(dp++) = (png_byte)(255 - *(sp++)); } } } else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { /* This inverts the alpha channel in GA */ if (row_info->bit_depth == 8) { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; for (i = 0, sp = dp = row; i < row_width; i++) { *(dp++) = *(sp++); *(dp++) = (png_byte)(255 - *(sp++)); } } /* This inverts the alpha channel in GGAA */ else { png_bytep sp, dp; png_uint_32 i; png_uint_32 row_width = row_info->width; for (i = 0, sp = dp = row; i < row_width; i++) { *(dp++) = *(sp++); *(dp++) = *(sp++); *(dp++) = (png_byte)(255 - *(sp++)); *(dp++) = (png_byte)(255 - *(sp++)); } } } } } #endif #if defined(PNG_MNG_FEATURES_SUPPORTED) /* undoes intrapixel differencing */ void /* PRIVATE */ png_do_write_intrapixel(png_row_infop row_info, png_bytep row) { png_debug(1, "in png_do_write_intrapixel\n"); if ( #if defined(PNG_USELESS_TESTS_SUPPORTED) row != NULL && row_info != NULL && #endif (row_info->color_type & PNG_COLOR_MASK_COLOR)) { int bytes_per_pixel; png_uint_32 row_width = row_info->width; if (row_info->bit_depth == 8) { png_bytep rp; png_uint_32 i; if (row_info->color_type == PNG_COLOR_TYPE_RGB) bytes_per_pixel = 3; else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) bytes_per_pixel = 4; else return; for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) { *(rp) = (png_byte)((*rp - *(rp+1))&0xff); *(rp+2) = (png_byte)((*(rp+2) - *(rp+1))&0xff); } } else if (row_info->bit_depth == 16) { png_bytep rp; png_uint_32 i; if (row_info->color_type == PNG_COLOR_TYPE_RGB) bytes_per_pixel = 6; else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) bytes_per_pixel = 8; else return; for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) { png_uint_32 s0=*(rp )<<8 | *(rp+1); png_uint_32 s1=*(rp+2)<<8 | *(rp+3); png_uint_32 s2=*(rp+4)<<8 | *(rp+5); png_uint_32 red=(s0-s1)&0xffff; png_uint_32 blue=(s2-s1)&0xffff; *(rp ) = (png_byte)((red>>8)&0xff); *(rp+1) = (png_byte)(red&0xff); *(rp+4) = (png_byte)((blue>>8)&0xff); *(rp+5) = (png_byte)(blue&0xff); } } } } #endif /* PNG_MNG_FEATURES_SUPPORTED */ #endif /* PNG_WRITE_SUPPORTED */ gamera-3.3.3/src/libpng-1.2.5/pngwutil.c0000644000076500000000000023742110714675701016503 0ustar chriswheel /* pngwutil.c - utilities to write a PNG file * * libpng 1.2.5 - October 3, 2002 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2002 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) */ #define PNG_INTERNAL #include "png.h" #ifdef PNG_WRITE_SUPPORTED /* Place a 32-bit number into a buffer in PNG byte order. We work * with unsigned numbers for convenience, although one supported * ancillary chunk uses signed (two's complement) numbers. */ void /* PRIVATE */ png_save_uint_32(png_bytep buf, png_uint_32 i) { buf[0] = (png_byte)((i >> 24) & 0xff); buf[1] = (png_byte)((i >> 16) & 0xff); buf[2] = (png_byte)((i >> 8) & 0xff); buf[3] = (png_byte)(i & 0xff); } #if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED) /* The png_save_int_32 function assumes integers are stored in two's * complement format. If this isn't the case, then this routine needs to * be modified to write data in two's complement format. */ void /* PRIVATE */ png_save_int_32(png_bytep buf, png_int_32 i) { buf[0] = (png_byte)((i >> 24) & 0xff); buf[1] = (png_byte)((i >> 16) & 0xff); buf[2] = (png_byte)((i >> 8) & 0xff); buf[3] = (png_byte)(i & 0xff); } #endif /* Place a 16-bit number into a buffer in PNG byte order. * The parameter is declared unsigned int, not png_uint_16, * just to avoid potential problems on pre-ANSI C compilers. */ void /* PRIVATE */ png_save_uint_16(png_bytep buf, unsigned int i) { buf[0] = (png_byte)((i >> 8) & 0xff); buf[1] = (png_byte)(i & 0xff); } /* Write a PNG chunk all at once. The type is an array of ASCII characters * representing the chunk name. The array must be at least 4 bytes in * length, and does not need to be null terminated. To be safe, pass the * pre-defined chunk names here, and if you need a new one, define it * where the others are defined. The length is the length of the data. * All the data must be present. If that is not possible, use the * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end() * functions instead. */ void PNGAPI png_write_chunk(png_structp png_ptr, png_bytep chunk_name, png_bytep data, png_size_t length) { png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length); png_write_chunk_data(png_ptr, data, length); png_write_chunk_end(png_ptr); } /* Write the start of a PNG chunk. The type is the chunk type. * The total_length is the sum of the lengths of all the data you will be * passing in png_write_chunk_data(). */ void PNGAPI png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name, png_uint_32 length) { png_byte buf[4]; png_debug2(0, "Writing %s chunk (%lu bytes)\n", chunk_name, length); /* write the length */ png_save_uint_32(buf, length); png_write_data(png_ptr, buf, (png_size_t)4); /* write the chunk name */ png_write_data(png_ptr, chunk_name, (png_size_t)4); /* reset the crc and run it over the chunk name */ png_reset_crc(png_ptr); png_calculate_crc(png_ptr, chunk_name, (png_size_t)4); } /* Write the data of a PNG chunk started with png_write_chunk_start(). * Note that multiple calls to this function are allowed, and that the * sum of the lengths from these calls *must* add up to the total_length * given to png_write_chunk_start(). */ void PNGAPI png_write_chunk_data(png_structp png_ptr, png_bytep data, png_size_t length) { /* write the data, and run the CRC over it */ if (data != NULL && length > 0) { png_calculate_crc(png_ptr, data, length); png_write_data(png_ptr, data, length); } } /* Finish a chunk started with png_write_chunk_start(). */ void PNGAPI png_write_chunk_end(png_structp png_ptr) { png_byte buf[4]; /* write the crc */ png_save_uint_32(buf, png_ptr->crc); png_write_data(png_ptr, buf, (png_size_t)4); } /* Simple function to write the signature. If we have already written * the magic bytes of the signature, or more likely, the PNG stream is * being embedded into another stream and doesn't need its own signature, * we should call png_set_sig_bytes() to tell libpng how many of the * bytes have already been written. */ void /* PRIVATE */ png_write_sig(png_structp png_ptr) { png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; /* write the rest of the 8 byte signature */ png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], (png_size_t)8 - png_ptr->sig_bytes); if(png_ptr->sig_bytes < 3) png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; } #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_SUPPORTED) /* * This pair of functions encapsulates the operation of (a) compressing a * text string, and (b) issuing it later as a series of chunk data writes. * The compression_state structure is shared context for these functions * set up by the caller in order to make the whole mess thread-safe. */ typedef struct { char *input; /* the uncompressed input data */ int input_len; /* its length */ int num_output_ptr; /* number of output pointers used */ int max_output_ptr; /* size of output_ptr */ png_charpp output_ptr; /* array of pointers to output */ } compression_state; /* compress given text into storage in the png_ptr structure */ static int /* PRIVATE */ png_text_compress(png_structp png_ptr, png_charp text, png_size_t text_len, int compression, compression_state *comp) { int ret; comp->num_output_ptr = comp->max_output_ptr = 0; comp->output_ptr = NULL; comp->input = NULL; /* we may just want to pass the text right through */ if (compression == PNG_TEXT_COMPRESSION_NONE) { comp->input = text; comp->input_len = text_len; return((int)text_len); } if (compression >= PNG_TEXT_COMPRESSION_LAST) { #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) char msg[50]; sprintf(msg, "Unknown compression type %d", compression); png_warning(png_ptr, msg); #else png_warning(png_ptr, "Unknown compression type"); #endif } /* We can't write the chunk until we find out how much data we have, * which means we need to run the compressor first and save the * output. This shouldn't be a problem, as the vast majority of * comments should be reasonable, but we will set up an array of * malloc'd pointers to be sure. * * If we knew the application was well behaved, we could simplify this * greatly by assuming we can always malloc an output buffer large * enough to hold the compressed text ((1001 * text_len / 1000) + 12) * and malloc this directly. The only time this would be a bad idea is * if we can't malloc more than 64K and we have 64K of random input * data, or if the input string is incredibly large (although this * wouldn't cause a failure, just a slowdown due to swapping). */ /* set up the compression buffers */ png_ptr->zstream.avail_in = (uInt)text_len; png_ptr->zstream.next_in = (Bytef *)text; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_out = (Bytef *)png_ptr->zbuf; /* this is the same compression loop as in png_write_row() */ do { /* compress the data */ ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); if (ret != Z_OK) { /* error */ if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); else png_error(png_ptr, "zlib error"); } /* check to see if we need more room */ if (!png_ptr->zstream.avail_out && png_ptr->zstream.avail_in) { /* make sure the output array has room */ if (comp->num_output_ptr >= comp->max_output_ptr) { int old_max; old_max = comp->max_output_ptr; comp->max_output_ptr = comp->num_output_ptr + 4; if (comp->output_ptr != NULL) { png_charpp old_ptr; old_ptr = comp->output_ptr; comp->output_ptr = (png_charpp)png_malloc(png_ptr, (png_uint_32)(comp->max_output_ptr * sizeof (png_charpp))); png_memcpy(comp->output_ptr, old_ptr, old_max * sizeof (png_charp)); png_free(png_ptr, old_ptr); } else comp->output_ptr = (png_charpp)png_malloc(png_ptr, (png_uint_32)(comp->max_output_ptr * sizeof (png_charp))); } /* save the data */ comp->output_ptr[comp->num_output_ptr] = (png_charp)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, png_ptr->zbuf_size); comp->num_output_ptr++; /* and reset the buffer */ png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_out = png_ptr->zbuf; } /* continue until we don't have any more to compress */ } while (png_ptr->zstream.avail_in); /* finish the compression */ do { /* tell zlib we are finished */ ret = deflate(&png_ptr->zstream, Z_FINISH); if (ret == Z_OK) { /* check to see if we need more room */ if (!(png_ptr->zstream.avail_out)) { /* check to make sure our output array has room */ if (comp->num_output_ptr >= comp->max_output_ptr) { int old_max; old_max = comp->max_output_ptr; comp->max_output_ptr = comp->num_output_ptr + 4; if (comp->output_ptr != NULL) { png_charpp old_ptr; old_ptr = comp->output_ptr; /* This could be optimized to realloc() */ comp->output_ptr = (png_charpp)png_malloc(png_ptr, (png_uint_32)(comp->max_output_ptr * sizeof (png_charpp))); png_memcpy(comp->output_ptr, old_ptr, old_max * sizeof (png_charp)); png_free(png_ptr, old_ptr); } else comp->output_ptr = (png_charpp)png_malloc(png_ptr, (png_uint_32)(comp->max_output_ptr * sizeof (png_charp))); } /* save off the data */ comp->output_ptr[comp->num_output_ptr] = (png_charp)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, png_ptr->zbuf_size); comp->num_output_ptr++; /* and reset the buffer pointers */ png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_out = png_ptr->zbuf; } } else if (ret != Z_STREAM_END) { /* we got an error */ if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); else png_error(png_ptr, "zlib error"); } } while (ret != Z_STREAM_END); /* text length is number of buffers plus last buffer */ text_len = png_ptr->zbuf_size * comp->num_output_ptr; if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out; return((int)text_len); } /* ship the compressed text out via chunk writes */ static void /* PRIVATE */ png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) { int i; /* handle the no-compression case */ if (comp->input) { png_write_chunk_data(png_ptr, (png_bytep)comp->input, (png_size_t)comp->input_len); return; } /* write saved output buffers, if any */ for (i = 0; i < comp->num_output_ptr; i++) { png_write_chunk_data(png_ptr,(png_bytep)comp->output_ptr[i], png_ptr->zbuf_size); png_free(png_ptr, comp->output_ptr[i]); comp->output_ptr[i]=NULL; } if (comp->max_output_ptr != 0) png_free(png_ptr, comp->output_ptr); comp->output_ptr=NULL; /* write anything left in zbuf */ if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size) png_write_chunk_data(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - png_ptr->zstream.avail_out); /* reset zlib for another zTXt/iTXt or the image data */ deflateReset(&png_ptr->zstream); } #endif /* Write the IHDR chunk, and update the png_struct with the necessary * information. Note that the rest of this code depends upon this * information being correct. */ void /* PRIVATE */ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, int compression_type, int filter_type, int interlace_type) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IHDR; #endif png_byte buf[13]; /* buffer to store the IHDR info */ png_debug(1, "in png_write_IHDR\n"); /* Check that we have valid input data from the application info */ switch (color_type) { case PNG_COLOR_TYPE_GRAY: switch (bit_depth) { case 1: case 2: case 4: case 8: case 16: png_ptr->channels = 1; break; default: png_error(png_ptr,"Invalid bit depth for grayscale image"); } break; case PNG_COLOR_TYPE_RGB: if (bit_depth != 8 && bit_depth != 16) png_error(png_ptr, "Invalid bit depth for RGB image"); png_ptr->channels = 3; break; case PNG_COLOR_TYPE_PALETTE: switch (bit_depth) { case 1: case 2: case 4: case 8: png_ptr->channels = 1; break; default: png_error(png_ptr, "Invalid bit depth for paletted image"); } break; case PNG_COLOR_TYPE_GRAY_ALPHA: if (bit_depth != 8 && bit_depth != 16) png_error(png_ptr, "Invalid bit depth for grayscale+alpha image"); png_ptr->channels = 2; break; case PNG_COLOR_TYPE_RGB_ALPHA: if (bit_depth != 8 && bit_depth != 16) png_error(png_ptr, "Invalid bit depth for RGBA image"); png_ptr->channels = 4; break; default: png_error(png_ptr, "Invalid image color type specified"); } if (compression_type != PNG_COMPRESSION_TYPE_BASE) { png_warning(png_ptr, "Invalid compression type specified"); compression_type = PNG_COMPRESSION_TYPE_BASE; } /* Write filter_method 64 (intrapixel differencing) only if * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and * 2. Libpng did not write a PNG signature (this filter_method is only * used in PNG datastreams that are embedded in MNG datastreams) and * 3. The application called png_permit_mng_features with a mask that * included PNG_FLAG_MNG_FILTER_64 and * 4. The filter_method is 64 and * 5. The color_type is RGB or RGBA */ if ( #if defined(PNG_MNG_FEATURES_SUPPORTED) !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) && (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) && #endif filter_type != PNG_FILTER_TYPE_BASE) { png_warning(png_ptr, "Invalid filter type specified"); filter_type = PNG_FILTER_TYPE_BASE; } #ifdef PNG_WRITE_INTERLACING_SUPPORTED if (interlace_type != PNG_INTERLACE_NONE && interlace_type != PNG_INTERLACE_ADAM7) { png_warning(png_ptr, "Invalid interlace type specified"); interlace_type = PNG_INTERLACE_ADAM7; } #else interlace_type=PNG_INTERLACE_NONE; #endif /* save off the relevent information */ png_ptr->bit_depth = (png_byte)bit_depth; png_ptr->color_type = (png_byte)color_type; png_ptr->interlaced = (png_byte)interlace_type; #if defined(PNG_MNG_FEATURES_SUPPORTED) png_ptr->filter_type = (png_byte)filter_type; #endif png_ptr->width = width; png_ptr->height = height; png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels); png_ptr->rowbytes = ((width * (png_size_t)png_ptr->pixel_depth + 7) >> 3); /* set the usr info, so any transformations can modify it */ png_ptr->usr_width = png_ptr->width; png_ptr->usr_bit_depth = png_ptr->bit_depth; png_ptr->usr_channels = png_ptr->channels; /* pack the header information into the buffer */ png_save_uint_32(buf, width); png_save_uint_32(buf + 4, height); buf[8] = (png_byte)bit_depth; buf[9] = (png_byte)color_type; buf[10] = (png_byte)compression_type; buf[11] = (png_byte)filter_type; buf[12] = (png_byte)interlace_type; /* write the chunk */ png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13); /* initialize zlib with PNG info */ png_ptr->zstream.zalloc = png_zalloc; png_ptr->zstream.zfree = png_zfree; png_ptr->zstream.opaque = (voidpf)png_ptr; if (!(png_ptr->do_filter)) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || png_ptr->bit_depth < 8) png_ptr->do_filter = PNG_FILTER_NONE; else png_ptr->do_filter = PNG_ALL_FILTERS; } if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY)) { if (png_ptr->do_filter != PNG_FILTER_NONE) png_ptr->zlib_strategy = Z_FILTERED; else png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY; } if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL)) png_ptr->zlib_level = Z_DEFAULT_COMPRESSION; if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL)) png_ptr->zlib_mem_level = 8; if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS)) png_ptr->zlib_window_bits = 15; if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD)) png_ptr->zlib_method = 8; deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, png_ptr->zlib_method, png_ptr->zlib_window_bits, png_ptr->zlib_mem_level, png_ptr->zlib_strategy); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_ptr->mode = PNG_HAVE_IHDR; } /* write the palette. We are careful not to trust png_color to be in the * correct order for PNG, so people can redefine it to any convenient * structure. */ void /* PRIVATE */ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_PLTE; #endif png_uint_32 i; png_colorp pal_ptr; png_byte buf[3]; png_debug(1, "in png_write_PLTE\n"); if (( #if defined(PNG_MNG_FEATURES_SUPPORTED) !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && #endif num_pal == 0) || num_pal > 256) { if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) { png_error(png_ptr, "Invalid number of colors in palette"); } else { png_warning(png_ptr, "Invalid number of colors in palette"); return; } } if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) { png_warning(png_ptr, "Ignoring request to write a PLTE chunk in grayscale PNG"); return; } png_ptr->num_palette = (png_uint_16)num_pal; png_debug1(3, "num_palette = %d\n", png_ptr->num_palette); png_write_chunk_start(png_ptr, (png_bytep)png_PLTE, num_pal * 3); #ifndef PNG_NO_POINTER_INDEXING for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++) { buf[0] = pal_ptr->red; buf[1] = pal_ptr->green; buf[2] = pal_ptr->blue; png_write_chunk_data(png_ptr, buf, (png_size_t)3); } #else /* This is a little slower but some buggy compilers need to do this instead */ pal_ptr=palette; for (i = 0; i < num_pal; i++) { buf[0] = pal_ptr[i].red; buf[1] = pal_ptr[i].green; buf[2] = pal_ptr[i].blue; png_write_chunk_data(png_ptr, buf, (png_size_t)3); } #endif png_write_chunk_end(png_ptr); png_ptr->mode |= PNG_HAVE_PLTE; } /* write an IDAT chunk */ void /* PRIVATE */ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IDAT; #endif png_debug(1, "in png_write_IDAT\n"); png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length); png_ptr->mode |= PNG_HAVE_IDAT; } /* write an IEND chunk */ void /* PRIVATE */ png_write_IEND(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_IEND; #endif png_debug(1, "in png_write_IEND\n"); png_write_chunk(png_ptr, (png_bytep)png_IEND, png_bytep_NULL, (png_size_t)0); png_ptr->mode |= PNG_HAVE_IEND; } #if defined(PNG_WRITE_gAMA_SUPPORTED) /* write a gAMA chunk */ #ifdef PNG_FLOATING_POINT_SUPPORTED void /* PRIVATE */ png_write_gAMA(png_structp png_ptr, double file_gamma) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_gAMA; #endif png_uint_32 igamma; png_byte buf[4]; png_debug(1, "in png_write_gAMA\n"); /* file_gamma is saved in 1/100,000ths */ igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5); png_save_uint_32(buf, igamma); png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4); } #endif #ifdef PNG_FIXED_POINT_SUPPORTED void /* PRIVATE */ png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_gAMA; #endif png_byte buf[4]; png_debug(1, "in png_write_gAMA\n"); /* file_gamma is saved in 1/100,000ths */ png_save_uint_32(buf, (png_uint_32)file_gamma); png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4); } #endif #endif #if defined(PNG_WRITE_sRGB_SUPPORTED) /* write a sRGB chunk */ void /* PRIVATE */ png_write_sRGB(png_structp png_ptr, int srgb_intent) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_sRGB; #endif png_byte buf[1]; png_debug(1, "in png_write_sRGB\n"); if(srgb_intent >= PNG_sRGB_INTENT_LAST) png_warning(png_ptr, "Invalid sRGB rendering intent specified"); buf[0]=(png_byte)srgb_intent; png_write_chunk(png_ptr, (png_bytep)png_sRGB, buf, (png_size_t)1); } #endif #if defined(PNG_WRITE_iCCP_SUPPORTED) /* write an iCCP chunk */ void /* PRIVATE */ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, png_charp profile, int profile_len) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_iCCP; #endif png_size_t name_len; png_charp new_name; compression_state comp; png_debug(1, "in png_write_iCCP\n"); if (name == NULL || (name_len = png_check_keyword(png_ptr, name, &new_name)) == 0) { png_warning(png_ptr, "Empty keyword in iCCP chunk"); return; } if (compression_type != PNG_COMPRESSION_TYPE_BASE) png_warning(png_ptr, "Unknown compression type in iCCP chunk"); if (profile == NULL) profile_len = 0; if (profile_len) profile_len = png_text_compress(png_ptr, profile, (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp); /* make sure we include the NULL after the name and the compression type */ png_write_chunk_start(png_ptr, (png_bytep)png_iCCP, (png_uint_32)name_len+profile_len+2); new_name[name_len+1]=0x00; png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 2); if (profile_len) png_write_compressed_data_out(png_ptr, &comp); png_write_chunk_end(png_ptr); png_free(png_ptr, new_name); } #endif #if defined(PNG_WRITE_sPLT_SUPPORTED) /* write a sPLT chunk */ void /* PRIVATE */ png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_sPLT; #endif png_size_t name_len; png_charp new_name; png_byte entrybuf[10]; int entry_size = (spalette->depth == 8 ? 6 : 10); int palette_size = entry_size * spalette->nentries; png_sPLT_entryp ep; #ifdef PNG_NO_POINTER_INDEXING int i; #endif png_debug(1, "in png_write_sPLT\n"); if (spalette->name == NULL || (name_len = png_check_keyword(png_ptr, spalette->name, &new_name))==0) { png_warning(png_ptr, "Empty keyword in sPLT chunk"); return; } /* make sure we include the NULL after the name */ png_write_chunk_start(png_ptr, (png_bytep)png_sPLT, (png_uint_32)(name_len + 2 + palette_size)); png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 1); png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, 1); /* loop through each palette entry, writing appropriately */ #ifndef PNG_NO_POINTER_INDEXING for (ep = spalette->entries; epentries+spalette->nentries; ep++) { if (spalette->depth == 8) { entrybuf[0] = (png_byte)ep->red; entrybuf[1] = (png_byte)ep->green; entrybuf[2] = (png_byte)ep->blue; entrybuf[3] = (png_byte)ep->alpha; png_save_uint_16(entrybuf + 4, ep->frequency); } else { png_save_uint_16(entrybuf + 0, ep->red); png_save_uint_16(entrybuf + 2, ep->green); png_save_uint_16(entrybuf + 4, ep->blue); png_save_uint_16(entrybuf + 6, ep->alpha); png_save_uint_16(entrybuf + 8, ep->frequency); } png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); } #else ep=spalette->entries; for (i=0; i>spalette->nentries; i++) { if (spalette->depth == 8) { entrybuf[0] = (png_byte)ep[i].red; entrybuf[1] = (png_byte)ep[i].green; entrybuf[2] = (png_byte)ep[i].blue; entrybuf[3] = (png_byte)ep[i].alpha; png_save_uint_16(entrybuf + 4, ep[i].frequency); } else { png_save_uint_16(entrybuf + 0, ep[i].red); png_save_uint_16(entrybuf + 2, ep[i].green); png_save_uint_16(entrybuf + 4, ep[i].blue); png_save_uint_16(entrybuf + 6, ep[i].alpha); png_save_uint_16(entrybuf + 8, ep[i].frequency); } png_write_chunk_data(png_ptr, entrybuf, entry_size); } #endif png_write_chunk_end(png_ptr); png_free(png_ptr, new_name); } #endif #if defined(PNG_WRITE_sBIT_SUPPORTED) /* write the sBIT chunk */ void /* PRIVATE */ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_sBIT; #endif png_byte buf[4]; png_size_t size; png_debug(1, "in png_write_sBIT\n"); /* make sure we don't depend upon the order of PNG_COLOR_8 */ if (color_type & PNG_COLOR_MASK_COLOR) { png_byte maxbits; maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 : png_ptr->usr_bit_depth); if (sbit->red == 0 || sbit->red > maxbits || sbit->green == 0 || sbit->green > maxbits || sbit->blue == 0 || sbit->blue > maxbits) { png_warning(png_ptr, "Invalid sBIT depth specified"); return; } buf[0] = sbit->red; buf[1] = sbit->green; buf[2] = sbit->blue; size = 3; } else { if (sbit->gray == 0 || sbit->gray > png_ptr->usr_bit_depth) { png_warning(png_ptr, "Invalid sBIT depth specified"); return; } buf[0] = sbit->gray; size = 1; } if (color_type & PNG_COLOR_MASK_ALPHA) { if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth) { png_warning(png_ptr, "Invalid sBIT depth specified"); return; } buf[size++] = sbit->alpha; } png_write_chunk(png_ptr, (png_bytep)png_sBIT, buf, size); } #endif #if defined(PNG_WRITE_cHRM_SUPPORTED) /* write the cHRM chunk */ #ifdef PNG_FLOATING_POINT_SUPPORTED void /* PRIVATE */ png_write_cHRM(png_structp png_ptr, double white_x, double white_y, double red_x, double red_y, double green_x, double green_y, double blue_x, double blue_y) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_cHRM; #endif png_byte buf[32]; png_uint_32 itemp; png_debug(1, "in png_write_cHRM\n"); /* each value is saved in 1/100,000ths */ if (white_x < 0 || white_x > 0.8 || white_y < 0 || white_y > 0.8 || white_x + white_y > 1.0) { png_warning(png_ptr, "Invalid cHRM white point specified"); #if !defined(PNG_NO_CONSOLE_IO) fprintf(stderr,"white_x=%f, white_y=%f\n",white_x, white_y); #endif return; } itemp = (png_uint_32)(white_x * 100000.0 + 0.5); png_save_uint_32(buf, itemp); itemp = (png_uint_32)(white_y * 100000.0 + 0.5); png_save_uint_32(buf + 4, itemp); if (red_x < 0 || red_x > 0.8 || red_y < 0 || red_y > 0.8 || red_x + red_y > 1.0) { png_warning(png_ptr, "Invalid cHRM red point specified"); return; } itemp = (png_uint_32)(red_x * 100000.0 + 0.5); png_save_uint_32(buf + 8, itemp); itemp = (png_uint_32)(red_y * 100000.0 + 0.5); png_save_uint_32(buf + 12, itemp); if (green_x < 0 || green_x > 0.8 || green_y < 0 || green_y > 0.8 || green_x + green_y > 1.0) { png_warning(png_ptr, "Invalid cHRM green point specified"); return; } itemp = (png_uint_32)(green_x * 100000.0 + 0.5); png_save_uint_32(buf + 16, itemp); itemp = (png_uint_32)(green_y * 100000.0 + 0.5); png_save_uint_32(buf + 20, itemp); if (blue_x < 0 || blue_x > 0.8 || blue_y < 0 || blue_y > 0.8 || blue_x + blue_y > 1.0) { png_warning(png_ptr, "Invalid cHRM blue point specified"); return; } itemp = (png_uint_32)(blue_x * 100000.0 + 0.5); png_save_uint_32(buf + 24, itemp); itemp = (png_uint_32)(blue_y * 100000.0 + 0.5); png_save_uint_32(buf + 28, itemp); png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); } #endif #ifdef PNG_FIXED_POINT_SUPPORTED void /* PRIVATE */ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x, png_fixed_point blue_y) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_cHRM; #endif png_byte buf[32]; png_debug(1, "in png_write_cHRM\n"); /* each value is saved in 1/100,000ths */ if (white_x > 80000L || white_y > 80000L || white_x + white_y > 100000L) { png_warning(png_ptr, "Invalid fixed cHRM white point specified"); #if !defined(PNG_NO_CONSOLE_IO) fprintf(stderr,"white_x=%ld, white_y=%ld\n",white_x, white_y); #endif return; } png_save_uint_32(buf, (png_uint_32)white_x); png_save_uint_32(buf + 4, (png_uint_32)white_y); if (red_x > 80000L || red_y > 80000L || red_x + red_y > 100000L) { png_warning(png_ptr, "Invalid cHRM fixed red point specified"); return; } png_save_uint_32(buf + 8, (png_uint_32)red_x); png_save_uint_32(buf + 12, (png_uint_32)red_y); if (green_x > 80000L || green_y > 80000L || green_x + green_y > 100000L) { png_warning(png_ptr, "Invalid fixed cHRM green point specified"); return; } png_save_uint_32(buf + 16, (png_uint_32)green_x); png_save_uint_32(buf + 20, (png_uint_32)green_y); if (blue_x > 80000L || blue_y > 80000L || blue_x + blue_y > 100000L) { png_warning(png_ptr, "Invalid fixed cHRM blue point specified"); return; } png_save_uint_32(buf + 24, (png_uint_32)blue_x); png_save_uint_32(buf + 28, (png_uint_32)blue_y); png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); } #endif #endif #if defined(PNG_WRITE_tRNS_SUPPORTED) /* write the tRNS chunk */ void /* PRIVATE */ png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran, int num_trans, int color_type) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_tRNS; #endif png_byte buf[6]; png_debug(1, "in png_write_tRNS\n"); if (color_type == PNG_COLOR_TYPE_PALETTE) { if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette) { png_warning(png_ptr,"Invalid number of transparent colors specified"); return; } /* write the chunk out as it is */ png_write_chunk(png_ptr, (png_bytep)png_tRNS, trans, (png_size_t)num_trans); } else if (color_type == PNG_COLOR_TYPE_GRAY) { /* one 16 bit value */ if(tran->gray >= (1 << png_ptr->bit_depth)) { png_warning(png_ptr, "Ignoring attempt to write tRNS chunk out-of-range for bit_depth"); return; } png_save_uint_16(buf, tran->gray); png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)2); } else if (color_type == PNG_COLOR_TYPE_RGB) { /* three 16 bit values */ png_save_uint_16(buf, tran->red); png_save_uint_16(buf + 2, tran->green); png_save_uint_16(buf + 4, tran->blue); if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) { png_warning(png_ptr, "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); return; } png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)6); } else { png_warning(png_ptr, "Can't write tRNS with an alpha channel"); } } #endif #if defined(PNG_WRITE_bKGD_SUPPORTED) /* write the background chunk */ void /* PRIVATE */ png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_bKGD; #endif png_byte buf[6]; png_debug(1, "in png_write_bKGD\n"); if (color_type == PNG_COLOR_TYPE_PALETTE) { if ( #if defined(PNG_MNG_FEATURES_SUPPORTED) (png_ptr->num_palette || (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) && #endif back->index > png_ptr->num_palette) { png_warning(png_ptr, "Invalid background palette index"); return; } buf[0] = back->index; png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)1); } else if (color_type & PNG_COLOR_MASK_COLOR) { png_save_uint_16(buf, back->red); png_save_uint_16(buf + 2, back->green); png_save_uint_16(buf + 4, back->blue); if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) { png_warning(png_ptr, "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); return; } png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)6); } else { if(back->gray >= (1 << png_ptr->bit_depth)) { png_warning(png_ptr, "Ignoring attempt to write bKGD chunk out-of-range for bit_depth"); return; } png_save_uint_16(buf, back->gray); png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)2); } } #endif #if defined(PNG_WRITE_hIST_SUPPORTED) /* write the histogram */ void /* PRIVATE */ png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_hIST; #endif int i; png_byte buf[3]; png_debug(1, "in png_write_hIST\n"); if (num_hist > (int)png_ptr->num_palette) { png_debug2(3, "num_hist = %d, num_palette = %d\n", num_hist, png_ptr->num_palette); png_warning(png_ptr, "Invalid number of histogram entries specified"); return; } png_write_chunk_start(png_ptr, (png_bytep)png_hIST, (png_uint_32)(num_hist * 2)); for (i = 0; i < num_hist; i++) { png_save_uint_16(buf, hist[i]); png_write_chunk_data(png_ptr, buf, (png_size_t)2); } png_write_chunk_end(png_ptr); } #endif #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) /* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification, * and if invalid, correct the keyword rather than discarding the entire * chunk. The PNG 1.0 specification requires keywords 1-79 characters in * length, forbids leading or trailing whitespace, multiple internal spaces, * and the non-break space (0x80) from ISO 8859-1. Returns keyword length. * * The new_key is allocated to hold the corrected keyword and must be freed * by the calling routine. This avoids problems with trying to write to * static keywords without having to have duplicate copies of the strings. */ png_size_t /* PRIVATE */ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) { png_size_t key_len; png_charp kp, dp; int kflag; int kwarn=0; png_debug(1, "in png_check_keyword\n"); *new_key = NULL; if (key == NULL || (key_len = png_strlen(key)) == 0) { png_warning(png_ptr, "zero length keyword"); return ((png_size_t)0); } png_debug1(2, "Keyword to be checked is '%s'\n", key); *new_key = (png_charp)png_malloc(png_ptr, (png_uint_32)(key_len + 2)); /* Replace non-printing characters with a blank and print a warning */ for (kp = key, dp = *new_key; *kp != '\0'; kp++, dp++) { if (*kp < 0x20 || (*kp > 0x7E && (png_byte)*kp < 0xA1)) { #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) char msg[40]; sprintf(msg, "invalid keyword character 0x%02X", *kp); png_warning(png_ptr, msg); #else png_warning(png_ptr, "invalid character in keyword"); #endif *dp = ' '; } else { *dp = *kp; } } *dp = '\0'; /* Remove any trailing white space. */ kp = *new_key + key_len - 1; if (*kp == ' ') { png_warning(png_ptr, "trailing spaces removed from keyword"); while (*kp == ' ') { *(kp--) = '\0'; key_len--; } } /* Remove any leading white space. */ kp = *new_key; if (*kp == ' ') { png_warning(png_ptr, "leading spaces removed from keyword"); while (*kp == ' ') { kp++; key_len--; } } png_debug1(2, "Checking for multiple internal spaces in '%s'\n", kp); /* Remove multiple internal spaces. */ for (kflag = 0, dp = *new_key; *kp != '\0'; kp++) { if (*kp == ' ' && kflag == 0) { *(dp++) = *kp; kflag = 1; } else if (*kp == ' ') { key_len--; kwarn=1; } else { *(dp++) = *kp; kflag = 0; } } *dp = '\0'; if(kwarn) png_warning(png_ptr, "extra interior spaces removed from keyword"); if (key_len == 0) { png_free(png_ptr, *new_key); *new_key=NULL; png_warning(png_ptr, "Zero length keyword"); } if (key_len > 79) { png_warning(png_ptr, "keyword length must be 1 - 79 characters"); new_key[79] = '\0'; key_len = 79; } return (key_len); } #endif #if defined(PNG_WRITE_tEXt_SUPPORTED) /* write a tEXt chunk */ void /* PRIVATE */ png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_tEXt; #endif png_size_t key_len; png_charp new_key; png_debug(1, "in png_write_tEXt\n"); if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) { png_warning(png_ptr, "Empty keyword in tEXt chunk"); return; } if (text == NULL || *text == '\0') text_len = 0; else text_len = png_strlen(text); /* make sure we include the 0 after the key */ png_write_chunk_start(png_ptr, (png_bytep)png_tEXt, (png_uint_32)key_len+text_len+1); /* * We leave it to the application to meet PNG-1.0 requirements on the * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. */ png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1); if (text_len) png_write_chunk_data(png_ptr, (png_bytep)text, text_len); png_write_chunk_end(png_ptr); png_free(png_ptr, new_key); } #endif #if defined(PNG_WRITE_zTXt_SUPPORTED) /* write a compressed text chunk */ void /* PRIVATE */ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text, png_size_t text_len, int compression) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_zTXt; #endif png_size_t key_len; char buf[1]; png_charp new_key; compression_state comp; png_debug(1, "in png_write_zTXt\n"); if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) { png_warning(png_ptr, "Empty keyword in zTXt chunk"); return; } if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE) { png_write_tEXt(png_ptr, new_key, text, (png_size_t)0); png_free(png_ptr, new_key); return; } text_len = png_strlen(text); png_free(png_ptr, new_key); /* compute the compressed data; do it now for the length */ text_len = png_text_compress(png_ptr, text, text_len, compression, &comp); /* write start of chunk */ png_write_chunk_start(png_ptr, (png_bytep)png_zTXt, (png_uint_32) (key_len+text_len+2)); /* write key */ png_write_chunk_data(png_ptr, (png_bytep)key, key_len + 1); buf[0] = (png_byte)compression; /* write compression */ png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1); /* write the compressed data */ png_write_compressed_data_out(png_ptr, &comp); /* close the chunk */ png_write_chunk_end(png_ptr); } #endif #if defined(PNG_WRITE_iTXt_SUPPORTED) /* write an iTXt chunk */ void /* PRIVATE */ png_write_iTXt(png_structp png_ptr, int compression, png_charp key, png_charp lang, png_charp lang_key, png_charp text) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_iTXt; #endif png_size_t lang_len, key_len, lang_key_len, text_len; png_charp new_lang, new_key; png_byte cbuf[2]; compression_state comp; png_debug(1, "in png_write_iTXt\n"); if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) { png_warning(png_ptr, "Empty keyword in iTXt chunk"); return; } if (lang == NULL || (lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0) { png_warning(png_ptr, "Empty language field in iTXt chunk"); new_lang = NULL; lang_len = 0; } if (lang_key == NULL) lang_key_len = 0; else lang_key_len = png_strlen(lang_key); if (text == NULL) text_len = 0; else text_len = png_strlen(text); /* compute the compressed data; do it now for the length */ text_len = png_text_compress(png_ptr, text, text_len, compression-2, &comp); /* make sure we include the compression flag, the compression byte, * and the NULs after the key, lang, and lang_key parts */ png_write_chunk_start(png_ptr, (png_bytep)png_iTXt, (png_uint_32)( 5 /* comp byte, comp flag, terminators for key, lang and lang_key */ + key_len + lang_len + lang_key_len + text_len)); /* * We leave it to the application to meet PNG-1.0 requirements on the * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. */ png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1); /* set the compression flag */ if (compression == PNG_ITXT_COMPRESSION_NONE || \ compression == PNG_TEXT_COMPRESSION_NONE) cbuf[0] = 0; else /* compression == PNG_ITXT_COMPRESSION_zTXt */ cbuf[0] = 1; /* set the compression method */ cbuf[1] = 0; png_write_chunk_data(png_ptr, cbuf, 2); cbuf[0] = 0; png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), lang_len + 1); png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), lang_key_len + 1); png_write_compressed_data_out(png_ptr, &comp); png_write_chunk_end(png_ptr); png_free(png_ptr, new_key); if (new_lang) png_free(png_ptr, new_lang); } #endif #if defined(PNG_WRITE_oFFs_SUPPORTED) /* write the oFFs chunk */ void /* PRIVATE */ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, int unit_type) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_oFFs; #endif png_byte buf[9]; png_debug(1, "in png_write_oFFs\n"); if (unit_type >= PNG_OFFSET_LAST) png_warning(png_ptr, "Unrecognized unit type for oFFs chunk"); png_save_int_32(buf, x_offset); png_save_int_32(buf + 4, y_offset); buf[8] = (png_byte)unit_type; png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9); } #endif #if defined(PNG_WRITE_pCAL_SUPPORTED) /* write the pCAL chunk (described in the PNG extensions document) */ void /* PRIVATE */ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, png_charp units, png_charpp params) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_pCAL; #endif png_size_t purpose_len, units_len, total_len; png_uint_32p params_len; png_byte buf[10]; png_charp new_purpose; int i; png_debug1(1, "in png_write_pCAL (%d parameters)\n", nparams); if (type >= PNG_EQUATION_LAST) png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1; png_debug1(3, "pCAL purpose length = %d\n", (int)purpose_len); units_len = png_strlen(units) + (nparams == 0 ? 0 : 1); png_debug1(3, "pCAL units length = %d\n", (int)units_len); total_len = purpose_len + units_len + 10; params_len = (png_uint_32p)png_malloc(png_ptr, (png_uint_32)(nparams *sizeof(png_uint_32))); /* Find the length of each parameter, making sure we don't count the null terminator for the last parameter. */ for (i = 0; i < nparams; i++) { params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1); png_debug2(3, "pCAL parameter %d length = %lu\n", i, params_len[i]); total_len += (png_size_t)params_len[i]; } png_debug1(3, "pCAL total length = %d\n", (int)total_len); png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len); png_write_chunk_data(png_ptr, (png_bytep)new_purpose, purpose_len); png_save_int_32(buf, X0); png_save_int_32(buf + 4, X1); buf[8] = (png_byte)type; buf[9] = (png_byte)nparams; png_write_chunk_data(png_ptr, buf, (png_size_t)10); png_write_chunk_data(png_ptr, (png_bytep)units, (png_size_t)units_len); png_free(png_ptr, new_purpose); for (i = 0; i < nparams; i++) { png_write_chunk_data(png_ptr, (png_bytep)params[i], (png_size_t)params_len[i]); } png_free(png_ptr, params_len); png_write_chunk_end(png_ptr); } #endif #if defined(PNG_WRITE_sCAL_SUPPORTED) /* write the sCAL chunk */ #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) void /* PRIVATE */ png_write_sCAL(png_structp png_ptr, int unit, double width,double height) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_sCAL; #endif png_size_t total_len; char wbuf[32], hbuf[32]; png_debug(1, "in png_write_sCAL\n"); #if defined(_WIN32_WCE) /* sprintf() function is not supported on WindowsCE */ { wchar_t wc_buf[32]; swprintf(wc_buf, TEXT("%12.12e"), width); WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, wbuf, 32, NULL, NULL); swprintf(wc_buf, TEXT("%12.12e"), height); WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, hbuf, 32, NULL, NULL); } #else sprintf(wbuf, "%12.12e", width); sprintf(hbuf, "%12.12e", height); #endif total_len = 1 + png_strlen(wbuf)+1 + png_strlen(hbuf); png_debug1(3, "sCAL total length = %d\n", (int)total_len); png_write_chunk_start(png_ptr, (png_bytep)png_sCAL, (png_uint_32)total_len); png_write_chunk_data(png_ptr, (png_bytep)&unit, 1); png_write_chunk_data(png_ptr, (png_bytep)wbuf, png_strlen(wbuf)+1); png_write_chunk_data(png_ptr, (png_bytep)hbuf, png_strlen(hbuf)); png_write_chunk_end(png_ptr); } #else #ifdef PNG_FIXED_POINT_SUPPORTED void /* PRIVATE */ png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width, png_charp height) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_sCAL; #endif png_size_t total_len; char wbuf[32], hbuf[32]; png_debug(1, "in png_write_sCAL_s\n"); png_strcpy(wbuf,(const char *)width); png_strcpy(hbuf,(const char *)height); total_len = 1 + png_strlen(wbuf)+1 + png_strlen(hbuf); png_debug1(3, "sCAL total length = %d\n", total_len); png_write_chunk_start(png_ptr, (png_bytep)png_sCAL, (png_uint_32)total_len); png_write_chunk_data(png_ptr, (png_bytep)&unit, 1); png_write_chunk_data(png_ptr, (png_bytep)wbuf, png_strlen(wbuf)+1); png_write_chunk_data(png_ptr, (png_bytep)hbuf, png_strlen(hbuf)); png_write_chunk_end(png_ptr); } #endif #endif #endif #if defined(PNG_WRITE_pHYs_SUPPORTED) /* write the pHYs chunk */ void /* PRIVATE */ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, int unit_type) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_pHYs; #endif png_byte buf[9]; png_debug(1, "in png_write_pHYs\n"); if (unit_type >= PNG_RESOLUTION_LAST) png_warning(png_ptr, "Unrecognized unit type for pHYs chunk"); png_save_uint_32(buf, x_pixels_per_unit); png_save_uint_32(buf + 4, y_pixels_per_unit); buf[8] = (png_byte)unit_type; png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9); } #endif #if defined(PNG_WRITE_tIME_SUPPORTED) /* Write the tIME chunk. Use either png_convert_from_struct_tm() * or png_convert_from_time_t(), or fill in the structure yourself. */ void /* PRIVATE */ png_write_tIME(png_structp png_ptr, png_timep mod_time) { #ifdef PNG_USE_LOCAL_ARRAYS PNG_tIME; #endif png_byte buf[7]; png_debug(1, "in png_write_tIME\n"); if (mod_time->month > 12 || mod_time->month < 1 || mod_time->day > 31 || mod_time->day < 1 || mod_time->hour > 23 || mod_time->second > 60) { png_warning(png_ptr, "Invalid time specified for tIME chunk"); return; } png_save_uint_16(buf, mod_time->year); buf[2] = mod_time->month; buf[3] = mod_time->day; buf[4] = mod_time->hour; buf[5] = mod_time->minute; buf[6] = mod_time->second; png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7); } #endif /* initializes the row writing capability of libpng */ void /* PRIVATE */ png_write_start_row(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* start of interlace block */ int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; /* offset to next interlace block */ int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; /* start of interlace block in the y direction */ int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; /* offset to next interlace block in the y direction */ int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; #endif png_size_t buf_size; png_debug(1, "in png_write_start_row\n"); buf_size = (png_size_t)(((png_ptr->width * png_ptr->usr_channels * png_ptr->usr_bit_depth + 7) >> 3) + 1); /* set up row buffer */ png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; /* set up filtering buffer, if using this filter */ if (png_ptr->do_filter & PNG_FILTER_SUB) { png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; } /* We only need to keep the previous row if we are using one of these. */ if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) { /* set up previous row buffer */ png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); png_memset(png_ptr->prev_row, 0, buf_size); if (png_ptr->do_filter & PNG_FILTER_UP) { png_ptr->up_row = (png_bytep )png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; } if (png_ptr->do_filter & PNG_FILTER_AVG) { png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; } if (png_ptr->do_filter & PNG_FILTER_PAETH) { png_ptr->paeth_row = (png_bytep )png_malloc(png_ptr, (png_ptr->rowbytes + 1)); png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; } } #ifdef PNG_WRITE_INTERLACING_SUPPORTED /* if interlaced, we need to set up width and height of pass */ if (png_ptr->interlaced) { if (!(png_ptr->transformations & PNG_INTERLACE)) { png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - png_pass_ystart[0]) / png_pass_yinc[0]; png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 - png_pass_start[0]) / png_pass_inc[0]; } else { png_ptr->num_rows = png_ptr->height; png_ptr->usr_width = png_ptr->width; } } else #endif { png_ptr->num_rows = png_ptr->height; png_ptr->usr_width = png_ptr->width; } png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; png_ptr->zstream.next_out = png_ptr->zbuf; } /* Internal use only. Called when finished processing a row of data. */ void /* PRIVATE */ png_write_finish_row(png_structp png_ptr) { #ifdef PNG_USE_LOCAL_ARRAYS /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* start of interlace block */ int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; /* offset to next interlace block */ int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; /* start of interlace block in the y direction */ int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; /* offset to next interlace block in the y direction */ int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; #endif int ret; png_debug(1, "in png_write_finish_row\n"); /* next row */ png_ptr->row_number++; /* see if we are done */ if (png_ptr->row_number < png_ptr->num_rows) return; #ifdef PNG_WRITE_INTERLACING_SUPPORTED /* if interlaced, go to next pass */ if (png_ptr->interlaced) { png_ptr->row_number = 0; if (png_ptr->transformations & PNG_INTERLACE) { png_ptr->pass++; } else { /* loop until we find a non-zero width or height pass */ do { png_ptr->pass++; if (png_ptr->pass >= 7) break; png_ptr->usr_width = (png_ptr->width + png_pass_inc[png_ptr->pass] - 1 - png_pass_start[png_ptr->pass]) / png_pass_inc[png_ptr->pass]; png_ptr->num_rows = (png_ptr->height + png_pass_yinc[png_ptr->pass] - 1 - png_pass_ystart[png_ptr->pass]) / png_pass_yinc[png_ptr->pass]; if (png_ptr->transformations & PNG_INTERLACE) break; } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0); } /* reset the row above the image for the next pass */ if (png_ptr->pass < 7) { if (png_ptr->prev_row != NULL) png_memset(png_ptr->prev_row, 0, (png_size_t) (((png_uint_32)png_ptr->usr_channels * (png_uint_32)png_ptr->usr_bit_depth * png_ptr->width + 7) >> 3) + 1); return; } } #endif /* if we get here, we've just written the last row, so we need to flush the compressor */ do { /* tell the compressor we are done */ ret = deflate(&png_ptr->zstream, Z_FINISH); /* check for an error */ if (ret == Z_OK) { /* check to see if we need more room */ if (!(png_ptr->zstream.avail_out)) { png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } } else if (ret != Z_STREAM_END) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); else png_error(png_ptr, "zlib error"); } } while (ret != Z_STREAM_END); /* write any extra space */ if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) { png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - png_ptr->zstream.avail_out); } deflateReset(&png_ptr->zstream); } #if defined(PNG_WRITE_INTERLACING_SUPPORTED) /* Pick out the correct pixels for the interlace pass. * The basic idea here is to go through the row with a source * pointer and a destination pointer (sp and dp), and copy the * correct pixels for the pass. As the row gets compacted, * sp will always be >= dp, so we should never overwrite anything. * See the default: case for the easiest code to understand. */ void /* PRIVATE */ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) { #ifdef PNG_USE_LOCAL_ARRAYS /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ /* start of interlace block */ int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; /* offset to next interlace block */ int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; #endif png_debug(1, "in png_do_write_interlace\n"); /* we don't have to do anything on the last pass (6) */ #if defined(PNG_USELESS_TESTS_SUPPORTED) if (row != NULL && row_info != NULL && pass < 6) #else if (pass < 6) #endif { /* each pixel depth is handled separately */ switch (row_info->pixel_depth) { case 1: { png_bytep sp; png_bytep dp; int shift; int d; int value; png_uint_32 i; png_uint_32 row_width = row_info->width; dp = row; d = 0; shift = 7; for (i = png_pass_start[pass]; i < row_width; i += png_pass_inc[pass]) { sp = row + (png_size_t)(i >> 3); value = (int)(*sp >> (7 - (int)(i & 0x07))) & 0x01; d |= (value << shift); if (shift == 0) { shift = 7; *dp++ = (png_byte)d; d = 0; } else shift--; } if (shift != 7) *dp = (png_byte)d; break; } case 2: { png_bytep sp; png_bytep dp; int shift; int d; int value; png_uint_32 i; png_uint_32 row_width = row_info->width; dp = row; shift = 6; d = 0; for (i = png_pass_start[pass]; i < row_width; i += png_pass_inc[pass]) { sp = row + (png_size_t)(i >> 2); value = (*sp >> ((3 - (int)(i & 0x03)) << 1)) & 0x03; d |= (value << shift); if (shift == 0) { shift = 6; *dp++ = (png_byte)d; d = 0; } else shift -= 2; } if (shift != 6) *dp = (png_byte)d; break; } case 4: { png_bytep sp; png_bytep dp; int shift; int d; int value; png_uint_32 i; png_uint_32 row_width = row_info->width; dp = row; shift = 4; d = 0; for (i = png_pass_start[pass]; i < row_width; i += png_pass_inc[pass]) { sp = row + (png_size_t)(i >> 1); value = (*sp >> ((1 - (int)(i & 0x01)) << 2)) & 0x0f; d |= (value << shift); if (shift == 0) { shift = 4; *dp++ = (png_byte)d; d = 0; } else shift -= 4; } if (shift != 4) *dp = (png_byte)d; break; } default: { png_bytep sp; png_bytep dp; png_uint_32 i; png_uint_32 row_width = row_info->width; png_size_t pixel_bytes; /* start at the beginning */ dp = row; /* find out how many bytes each pixel takes up */ pixel_bytes = (row_info->pixel_depth >> 3); /* loop through the row, only looking at the pixels that matter */ for (i = png_pass_start[pass]; i < row_width; i += png_pass_inc[pass]) { /* find out where the original pixel is */ sp = row + (png_size_t)i * pixel_bytes; /* move the pixel */ if (dp != sp) png_memcpy(dp, sp, pixel_bytes); /* next pixel */ dp += pixel_bytes; } break; } } /* set new row width */ row_info->width = (row_info->width + png_pass_inc[pass] - 1 - png_pass_start[pass]) / png_pass_inc[pass]; row_info->rowbytes = ((row_info->width * row_info->pixel_depth + 7) >> 3); } } #endif /* This filters the row, chooses which filter to use, if it has not already * been specified by the application, and then writes the row out with the * chosen filter. */ #define PNG_MAXSUM (~((png_uint_32)0) >> 1) #define PNG_HISHIFT 10 #define PNG_LOMASK ((png_uint_32)0xffffL) #define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT)) void /* PRIVATE */ png_write_find_filter(png_structp png_ptr, png_row_infop row_info) { png_bytep prev_row, best_row, row_buf; png_uint_32 mins, bpp; png_byte filter_to_do = png_ptr->do_filter; png_uint_32 row_bytes = row_info->rowbytes; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) int num_p_filters = (int)png_ptr->num_prev_filters; #endif png_debug(1, "in png_write_find_filter\n"); /* find out how many bytes offset each pixel is */ bpp = (row_info->pixel_depth + 7) / 8; prev_row = png_ptr->prev_row; best_row = row_buf = png_ptr->row_buf; mins = PNG_MAXSUM; /* The prediction method we use is to find which method provides the * smallest value when summing the absolute values of the distances * from zero, using anything >= 128 as negative numbers. This is known * as the "minimum sum of absolute differences" heuristic. Other * heuristics are the "weighted minimum sum of absolute differences" * (experimental and can in theory improve compression), and the "zlib * predictive" method (not implemented yet), which does test compressions * of lines using different filter methods, and then chooses the * (series of) filter(s) that give minimum compressed data size (VERY * computationally expensive). * * GRR 980525: consider also * (1) minimum sum of absolute differences from running average (i.e., * keep running sum of non-absolute differences & count of bytes) * [track dispersion, too? restart average if dispersion too large?] * (1b) minimum sum of absolute differences from sliding average, probably * with window size <= deflate window (usually 32K) * (2) minimum sum of squared differences from zero or running average * (i.e., ~ root-mean-square approach) */ /* We don't need to test the 'no filter' case if this is the only filter * that has been chosen, as it doesn't actually do anything to the data. */ if ((filter_to_do & PNG_FILTER_NONE) && filter_to_do != PNG_FILTER_NONE) { png_bytep rp; png_uint_32 sum = 0; png_uint_32 i; int v; for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) { v = *rp; sum += (v < 128) ? v : 256 - v; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { png_uint_32 sumhi, sumlo; int j; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */ /* Reduce the sum if we match any of the previous rows */ for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } /* Factor in the cost of this filter (this is here for completeness, * but it makes no sense to have a "cost" for the NONE filter, as * it has the minimum possible computational cost - none). */ sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif mins = sum; } /* sub filter */ if (filter_to_do == PNG_FILTER_SUB) /* it's the only filter so no testing is needed */ { png_bytep rp, lp, dp; png_uint_32 i; for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; i++, rp++, dp++) { *dp = *rp; } for (lp = row_buf + 1; i < row_bytes; i++, rp++, lp++, dp++) { *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); } best_row = png_ptr->sub_row; } else if (filter_to_do & PNG_FILTER_SUB) { png_bytep rp, dp, lp; png_uint_32 sum = 0, lmins = mins; png_uint_32 i; int v; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* We temporarily increase the "minimum sum" by the factor we * would reduce the sum of this filter, so that we can do the * early exit comparison without scaling the sum each time. */ if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 lmhi, lmlo; lmlo = lmins & PNG_LOMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> PNG_COST_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; i++, rp++, dp++) { v = *dp = *rp; sum += (v < 128) ? v : 256 - v; } for (lp = row_buf + 1; i < row_info->rowbytes; i++, rp++, lp++, dp++) { v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); sum += (v < 128) ? v : 256 - v; if (sum > lmins) /* We are already worse, don't continue. */ break; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 sumhi, sumlo; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) { sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif if (sum < mins) { mins = sum; best_row = png_ptr->sub_row; } } /* up filter */ if (filter_to_do == PNG_FILTER_UP) { png_bytep rp, dp, pp; png_uint_32 i; for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, pp = prev_row + 1; i < row_bytes; i++, rp++, pp++, dp++) { *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); } best_row = png_ptr->up_row; } else if (filter_to_do & PNG_FILTER_UP) { png_bytep rp, dp, pp; png_uint_32 sum = 0, lmins = mins; png_uint_32 i; int v; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 lmhi, lmlo; lmlo = lmins & PNG_LOMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> PNG_COST_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, pp = prev_row + 1; i < row_bytes; i++) { v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); sum += (v < 128) ? v : 256 - v; if (sum > lmins) /* We are already worse, don't continue. */ break; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 sumhi, sumlo; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif if (sum < mins) { mins = sum; best_row = png_ptr->up_row; } } /* avg filter */ if (filter_to_do == PNG_FILTER_AVG) { png_bytep rp, dp, pp, lp; png_uint_32 i; for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, pp = prev_row + 1; i < bpp; i++) { *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); } for (lp = row_buf + 1; i < row_bytes; i++) { *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); } best_row = png_ptr->avg_row; } else if (filter_to_do & PNG_FILTER_AVG) { png_bytep rp, dp, pp, lp; png_uint_32 sum = 0, lmins = mins; png_uint_32 i; int v; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 lmhi, lmlo; lmlo = lmins & PNG_LOMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> PNG_COST_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, pp = prev_row + 1; i < bpp; i++) { v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); sum += (v < 128) ? v : 256 - v; } for (lp = row_buf + 1; i < row_bytes; i++) { v = *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); sum += (v < 128) ? v : 256 - v; if (sum > lmins) /* We are already worse, don't continue. */ break; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 sumhi, sumlo; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif if (sum < mins) { mins = sum; best_row = png_ptr->avg_row; } } /* Paeth filter */ if (filter_to_do == PNG_FILTER_PAETH) { png_bytep rp, dp, pp, cp, lp; png_uint_32 i; for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, pp = prev_row + 1; i < bpp; i++) { *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); } for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) { int a, b, c, pa, pb, pc, p; b = *pp++; c = *cp++; a = *lp++; p = b - c; pc = a - c; #ifdef PNG_USE_ABS pa = abs(p); pb = abs(pc); pc = abs(p + pc); #else pa = p < 0 ? -p : p; pb = pc < 0 ? -pc : pc; pc = (p + pc) < 0 ? -(p + pc) : p + pc; #endif p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); } best_row = png_ptr->paeth_row; } else if (filter_to_do & PNG_FILTER_PAETH) { png_bytep rp, dp, pp, cp, lp; png_uint_32 sum = 0, lmins = mins; png_uint_32 i; int v; #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 lmhi, lmlo; lmlo = lmins & PNG_LOMASK; lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) { lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> PNG_COST_SHIFT; lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> PNG_COST_SHIFT; if (lmhi > PNG_HIMASK) lmins = PNG_MAXSUM; else lmins = (lmhi << PNG_HISHIFT) + lmlo; } #endif for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, pp = prev_row + 1; i < bpp; i++) { v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); sum += (v < 128) ? v : 256 - v; } for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) { int a, b, c, pa, pb, pc, p; b = *pp++; c = *cp++; a = *lp++; #ifndef PNG_SLOW_PAETH p = b - c; pc = a - c; #ifdef PNG_USE_ABS pa = abs(p); pb = abs(pc); pc = abs(p + pc); #else pa = p < 0 ? -p : p; pb = pc < 0 ? -pc : pc; pc = (p + pc) < 0 ? -(p + pc) : p + pc; #endif p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; #else /* PNG_SLOW_PAETH */ p = a + b - c; pa = abs(p - a); pb = abs(p - b); pc = abs(p - c); if (pa <= pb && pa <= pc) p = a; else if (pb <= pc) p = b; else p = c; #endif /* PNG_SLOW_PAETH */ v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); sum += (v < 128) ? v : 256 - v; if (sum > lmins) /* We are already worse, don't continue. */ break; } #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) { int j; png_uint_32 sumhi, sumlo; sumlo = sum & PNG_LOMASK; sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; for (j = 0; j < num_p_filters; j++) { if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) { sumlo = (sumlo * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; sumhi = (sumhi * png_ptr->filter_weights[j]) >> PNG_WEIGHT_SHIFT; } } sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> PNG_COST_SHIFT; sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> PNG_COST_SHIFT; if (sumhi > PNG_HIMASK) sum = PNG_MAXSUM; else sum = (sumhi << PNG_HISHIFT) + sumlo; } #endif if (sum < mins) { best_row = png_ptr->paeth_row; } } /* Do the actual writing of the filtered row data from the chosen filter. */ png_write_filtered_row(png_ptr, best_row); #if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* Save the type of filter we picked this time for future calculations */ if (png_ptr->num_prev_filters > 0) { int j; for (j = 1; j < num_p_filters; j++) { png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1]; } png_ptr->prev_filters[j] = best_row[0]; } #endif } /* Do the actual writing of a previously filtered row. */ void /* PRIVATE */ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) { png_debug(1, "in png_write_filtered_row\n"); png_debug1(2, "filter = %d\n", filtered_row[0]); /* set up the zlib input buffer */ png_ptr->zstream.next_in = filtered_row; png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1; /* repeat until we have compressed all the data */ do { int ret; /* return of zlib */ /* compress the data */ ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); /* check for compression errors */ if (ret != Z_OK) { if (png_ptr->zstream.msg != NULL) png_error(png_ptr, png_ptr->zstream.msg); else png_error(png_ptr, "zlib error"); } /* see if it is time to write another IDAT */ if (!(png_ptr->zstream.avail_out)) { /* write the IDAT and reset the zlib output buffer */ png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); png_ptr->zstream.next_out = png_ptr->zbuf; png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; } /* repeat until all data has been compressed */ } while (png_ptr->zstream.avail_in); /* swap the current and previous rows */ if (png_ptr->prev_row != NULL) { png_bytep tptr; tptr = png_ptr->prev_row; png_ptr->prev_row = png_ptr->row_buf; png_ptr->row_buf = tptr; } /* finish row - updates counters and flushes zlib if last row */ png_write_finish_row(png_ptr); #if defined(PNG_WRITE_FLUSH_SUPPORTED) png_ptr->flush_rows++; if (png_ptr->flush_dist > 0 && png_ptr->flush_rows >= png_ptr->flush_dist) { png_write_flush(png_ptr); } #endif } #endif /* PNG_WRITE_SUPPORTED */ gamera-3.3.3/src/libpng-1.2.5/README0000644000076500000000000003400410714675701015336 0ustar chriswheelREADME for libpng 1.2.5 - October 3, 2002 (shared library 12.0) See the note about version numbers near the top of png.h See INSTALL for instructions on how to install libpng. Libpng comes in two distribution formats. Get libpng-*.tar.gz if you want UNIX-style line endings in the text files, or lpng*.zip if you want DOS-style line endings. Version 0.89 was the first official release of libpng. Don't let the fact that it's the first release fool you. The libpng library has been in extensive use and testing since mid-1995. By late 1997 it had finally gotten to the stage where there hadn't been significant changes to the API in some time, and people have a bad feeling about libraries with versions < 1.0. Version 1.0.0 was released in March 1998. **** Note that some of the changes to the png_info structure render this version of the library binary incompatible with libpng-0.89 or earlier versions if you are using a shared library. The type of the "filler" parameter for png_set_filler() has changed from png_byte to png_uint_32, which will affect shared-library applications that use this function. To avoid problems with changes to the internals of png_info_struct, new APIs have been made available in 0.95 to avoid direct application access to info_ptr. These functions are the png_set_ and png_get_ functions. These functions should be used when accessing/storing the info_struct data, rather than manipulating it directly, to avoid such problems in the future. It is important to note that the APIs do not make current programs that access the info struct directly incompatible with the new library. However, it is strongly suggested that new programs use the new APIs (as shown in example.c and pngtest.c), and older programs be converted to the new format, to facilitate upgrades in the future. **** Additions since 0.90 include the ability to compile libpng as a Windows DLL, and new APIs for accessing data in the info struct. Experimental functions include the ability to set weighting and cost factors for row filter selection, direct reads of integers from buffers on big-endian processors that support misaligned data access, faster methods of doing alpha composition, and more accurate 16->8 bit color conversion. The additions since 0.89 include the ability to read from a PNG stream which has had some (or all) of the signature bytes read by the calling application. This also allows the reading of embedded PNG streams that do not have the PNG file signature. As well, it is now possible to set the library action on the detection of chunk CRC errors. It is possible to set different actions based on whether the CRC error occurred in a critical or an ancillary chunk. The changes made to the library, and bugs fixed are based on discussions on the PNG implementation mailing list and not on material submitted privately to Guy, Andreas, or Glenn. They will forward any good suggestions to the list. For a detailed description on using libpng, read libpng.txt. For examples of libpng in a program, see example.c and pngtest.c. For usage information and restrictions (what little they are) on libpng, see png.h. For a description on using zlib (the compression library used by libpng) and zlib's restrictions, see zlib.h I have included a general makefile, as well as several machine and compiler specific ones, but you may have to modify one for your own needs. You should use zlib 1.0.4 or later to run this, but it MAY work with versions as old as zlib 0.95. Even so, there are bugs in older zlib versions which can cause the output of invalid compression streams for some images. You will definitely need zlib 1.0.4 or later if you are taking advantage of the MS-DOS "far" structure allocation for the small and medium memory models. You should also note that zlib is a compression library that is useful for more things than just PNG files. You can use zlib as a drop-in replacement for fread() and fwrite() if you are so inclined. zlib should be available at the same place that libpng is. If not, it should be at ftp.uu.net in /graphics/png Eventually, it will be at ftp.uu.net in /pub/archiving/zip/zlib You may also want a copy of the PNG specification. It is available as an RFC and a W3C Recommendation. Failing these resources you can try ftp.uu.net in the /graphics/png directory. This code is currently being archived at ftp.uu.net in the /graphics/png directory, and on CompuServe, Lib 20 (PNG SUPPORT) at GO GRAPHSUP. If you can't find it in any of those places, e-mail me, and I'll help you find it. If you have any code changes, requests, problems, etc., please e-mail them to me. Also, I'd appreciate any make files or project files, and any modifications you needed to make to get libpng to compile, along with a #define variable to tell what compiler/system you are on. If you needed to add transformations to libpng, or wish libpng would provide the image in a different way, drop me a note (and code, if possible), so I can consider supporting the transformation. Finally, if you get any warning messages when compiling libpng (note: not zlib), and they are easy to fix, I'd appreciate the fix. Please mention "libpng" somewhere in the subject line. Thanks. This release was created and will be supported by myself (of course based in a large way on Guy's and Andreas' earlier work), and the PNG group. randeg@alum.rpi.edu png-implement@ccrc.wustl.edu You can't reach Guy, the original libpng author, at the addresses given in previous versions of this document. He and Andreas will read mail addressed to the png-implement list, however. Please do not send general questions about PNG. Send them to the address in the specification (png-group@w3.org). At the same time, please do not send libpng questions to that address, send them to me or to png-implement@ccrc.wustl.edu. I'll get them in the end anyway. If you have a question about something in the PNG specification that is related to using libpng, send it to me. Send me any questions that start with "I was using libpng, and ...". If in doubt, send questions to me. I'll bounce them to others, if necessary. Please do not send suggestions on how to change PNG. We have been discussing PNG for three years now, and it is official and finished. If you have suggestions for libpng, however, I'll gladly listen. Even if your suggestion is not used for version 1.0, it may be used later. Files in this distribution: ANNOUNCE => Announcement of this version, with recent changes CHANGES => Description of changes between libpng versions KNOWNBUG => List of known bugs and deficiencies LICENSE => License to use and redistribute libpng README => This file TODO => Things not implemented in the current library Y2KINFO => Statement of Y2K compliance example.c => Example code for using libpng functions libpng.3 => manual page for libpng (includes libpng.txt) libpng.txt => Description of libpng and its functions libpngpf.3 => manual page for libpng's private functions png.5 => manual page for the PNG format png.c => Basic interface functions common to library png.h => Library function and interface declarations pngconf.h => System specific library configuration pngasmrd.h => Header file for assembler-coded functions pngerror.c => Error/warning message I/O functions pngget.c => Functions for retrieving info from struct pngmem.c => Memory handling functions pngbar.png => PNG logo, 88x31 pngnow.png => PNG logo, 98x31 pngpread.c => Progressive reading functions pngread.c => Read data/helper high-level functions pngrio.c => Lowest-level data read I/O functions pngrtran.c => Read data transformation functions pngrutil.c => Read data utility functions pngset.c => Functions for storing data into the info_struct pngtest.c => Library test program pngtest.png => Library test sample image pngtrans.c => Common data transformation functions pngwio.c => Lowest-level write I/O functions pngwrite.c => High-level write functions pngwtran.c => Write data transformations pngwutil.c => Write utility functions contrib => Contributions gregbook => source code for PNG reading and writing, from Greg Roelofs' "PNG: The Definitive Guide", O'Reilly, 1999 msvctest => Builds and runs pngtest using a MSVC workspace pngminus => Simple pnm2png and png2pnm programs pngsuite => Test images visupng => Contains a MSVC workspace for VisualPng projects => Contains project files and workspaces for building DLL beos => Contains a Beos workspace for building libpng borland => Contains a Borland workspace for building libpng and zlib msvc => Contains a Microsoft Visual C++ (MSVC) workspace for building libpng and zlib netware.txt => Contains instructions for downloading a set of project files for building libpng and zlib on Netware. wince.txt => Contains instructions for downloading a Microsoft Visual C++ (Windows CD Toolkit) workspace for building libpng and zlib on WindowsCE scripts => Directory containing scripts for building libpng: descrip.mms => VMS makefile for MMS or MMK makefile.std => Generic UNIX makefile (cc, creates static libpng.a) makefile.linux => Linux/ELF makefile (gcc, creates libpng12.so.0.1.2.5) makefile.gcmmx => Linux/ELF makefile (gcc, creates libpng12.so.0.1.2.5, uses assembler code tuned for Intel MMX platform) makefile.gcc => Generic makefile (gcc, creates static libpng.a) makefile.knr => Archaic UNIX Makefile that converts files with ansi2knr (Requires ansi2knr.c from ftp://ftp.cs.wisc.edu/ghost) makefile.aix => AIX makefile makefile.cygwin => Cygwin/gcc makefile makefile.darwin => Darwin makefile makefile.dec => DEC Alpha UNIX makefile makefile.freebsd => FreeBSD makefile makefile.hpgcc => HPUX makefile using gcc makefile.hpux => HPUX (10.20 and 11.00) makefile makefile.ibmc => IBM C/C++ version 3.x for Win32 and OS/2 (static) makefile.intel => Intel C/C++ version 4.0 and later libpng.icc => Project file, IBM VisualAge/C++ 4.0 or later makefile.macosx => MACOS X Makefile makefile.netbsd => NetBSD/cc makefile, PNGGCCRD, makes libpng.so. makefile.ne0bsd => NetBSD/cc makefile, PNGGCCRD, makes libpng0.so makefile.openbsd => OpenBSD makefile makefile.sgi => Silicon Graphics IRIX (cc, creates static lib) makefile.sggcc => Silicon Graphics (gcc, creates libpng12.so.0.1.2.5) makefile.sunos => Sun makefile makefile.solaris => Solaris 2.X makefile (gcc, creates libpng12.so.0.1.2.5) makefile.so9 => Solaris 9 makefile (gcc, creates libpng12.so.0.1.2.5) makefile.32sunu => Sun Ultra 32-bit makefile makefile.64sunu => Sun Ultra 64-bit makefile makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc makefile.mips => MIPS makefile makefile.acorn => Acorn makefile makefile.amiga => Amiga makefile smakefile.ppc => AMIGA smakefile for SAS C V6.58/7.00 PPC compiler (Requires SCOPTIONS, copied from scripts/SCOPTIONS.ppc) makefile.atari => Atari makefile makefile.beos => BEOS makefile for X86 makefile.bor => Borland makefile (uses bcc) makefile.bc32 => 32-bit Borland C++ (all modules compiled in C mode) makefile.bd32 => To make a png32bd.dll with Borland C++ 4.5 makefile.tc3 => Turbo C 3.0 makefile makefile.dj2 => DJGPP 2 makefile makefile.msc => Microsoft C makefile makefile.vcawin32 => makefile for Microsoft Visual C++ 5.0 and later (uses assembler code tuned for Intel MMX platform) makefile.vcwin32 => makefile for Microsoft Visual C++ 4.0 and later (does not use assembler code) makefile.os2 => OS/2 Makefile (gcc and emx, requires pngos2.def) pngos2.def => OS/2 module definition file used by makefile.os2 makefile.watcom => Watcom 10a+ Makefile, 32-bit flat memory model makevms.com => VMS build script pngdef.pas => Defines for a png32bd.dll with Borland C++ 4.5 SCOPTIONS.ppc => Used with smakefile.ppc mangle => Directory containing scripts to build libpng12m.so: mangle.in => Function-decoration macros added to png.h by the makefiles. makefile.linux => Linux/ELF makefile (gcc, creates libpng12m.so.0.1.2.5) makefile.gcmmx => Linux/ELF makefile (gcc, creates libpng12.so.0m.1.2.5, uses assembler code tuned for Intel MMX platform) makefile.sgi => Silicon Graphics (cc, creates libpng12m.so) makefile.sggcc => Silicon Graphics (gcc, creates libpng12m.so) Good luck, and happy coding. -Glenn Randers-Pehrson Internet: randeg@alum.rpi.edu -Andreas Eric Dilger Internet: adilger@enel.ucalgary.ca Web: http://www-mddsp.enel.ucalgary.ca/People/adilger/ -Guy Eric Schalnat (formerly of Group 42, Inc) Internet: gschal@infinet.com gamera-3.3.3/src/libpng-1.2.5/TODO0000644000076500000000000000223610714675701015150 0ustar chriswheelTODO - list of things to do for libpng: Final bug fixes. Improve API by hiding the png_struct and png_info structs. Finish work on the no-floating-point version (including gamma compensation) Better C++ wrapper/full C++ implementation? Fix problem with C++ and EXTERN "C". cHRM transformation. Improve setjmp/longjmp usage or remove it in favor of returning error codes. Add "grayscale->palette" transformation and "palette->grayscale" detection. Improved dithering. Multi-lingual error and warning message support. Complete sRGB transformation (presently it simply uses gamma=0.45455). Man pages for function calls. Better documentation. Better filter selection (counting huffman bits/precompression? filter inertia? filter costs?). Histogram creation. Text conversion between different code pages (Latin-1 -> Mac and DOS). Should we always malloc 2^bit_depth PLTE/tRNS/hIST entries for safety? Build gamma tables using fixed point (and do away with floating point entirely). Use greater precision when changing to linear gamma for compositing against background and doing rgb-to-gray transformation. Investigate pre-incremented loop counters and other loop constructions. gamera-3.3.3/src/libpng-1.2.5/Y2KINFO0000644000076500000000000000442010714675701015461 0ustar chriswheel Y2K compliance in libpng: ========================= October 3, 2002 Since the PNG Development group is an ad-hoc body, we can't make an official declaration. This is your unofficial assurance that libpng from version 0.71 and upward through 1.2.5 are Y2K compliant. It is my belief that earlier versions were also Y2K compliant. Libpng only has three year fields. One is a 2-byte unsigned integer that will hold years up to 65535. The other two hold the date in text format, and will hold years up to 9999. The integer is "png_uint_16 year" in png_time_struct. The strings are "png_charp time_buffer" in png_struct and "near_time_buffer", which is a local character string in png.c. There are seven time-related functions: png_convert_to_rfc_1123() in png.c (formerly png_convert_to_rfc_1152() in error) png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c png_convert_from_time_t() in pngwrite.c png_get_tIME() in pngget.c png_handle_tIME() in pngrutil.c, called in pngread.c png_set_tIME() in pngset.c png_write_tIME() in pngwutil.c, called in pngwrite.c All appear to handle dates properly in a Y2K environment. The png_convert_from_time_t() function calls gmtime() to convert from system clock time, which returns (year - 1900), which we properly convert to the full 4-digit year. There is a possibility that applications using libpng are not passing 4-digit years into the png_convert_to_rfc_1123() function, or that they are incorrectly passing only a 2-digit year instead of "year - 1900" into the png_convert_from_struct_tm() function, but this is not under our control. The libpng documentation has always stated that it works with 4-digit years, and the APIs have been documented as such. The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned integer to hold the year, and can hold years as large as 65535. zlib, upon which libpng depends, is also Y2K compliant. It contains no date-related code. Glenn Randers-Pehrson libpng maintainer PNG Development Group gamera-3.3.3/src/libtiff/0000755000076500000000000000000011755376174014170 5ustar chriswheelgamera-3.3.3/src/libtiff/fax3sm_winnt.c0000644000076500000000000023337710714675674016774 0ustar chriswheel/* WARNING, this file was automatically generated by the mkg3states program */ #include "tiff.h" #include "tif_fax3.h" const TIFFFaxTabEnt TIFFFaxMainTable[128] = { 12,7,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0, 2,3,0,3,1,0,4,3,1,3,1,0,5,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0, 1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,5,7,3,3,1,0,5,3,1,3,1,0, 2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0, 4,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0, 2,3,0,3,1,0,4,3,1,3,1,0,6,7,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0, 1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,5,6,2,3,1,0,5,3,1,3,1,0, 2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0, 4,7,3,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0, 2,3,0,3,1,0,4,3,1,3,1,0,4,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0, 1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0 }; const TIFFFaxTabEnt TIFFFaxWhiteTable[4096] = { 12,11,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6, 7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5, 7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5, 7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15, 9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,11,1792,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6, 7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5, 7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14, 7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6, 7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15, 7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7, 7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6, 7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 11,11,1856,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6, 7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5, 7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5, 7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15, 9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6, 7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5, 7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14, 7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6, 7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,11,12,2112,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15, 7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7, 7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6, 7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6, 7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5, 7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5, 7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15, 9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2368,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6, 7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5, 7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14, 7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6, 7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15, 7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7, 7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6, 7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 11,12,1984,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6, 7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5, 7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5, 7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15, 9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6, 7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5, 7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14, 7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6, 7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,11,11,1920,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15, 7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7, 7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6, 7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6, 7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5, 7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5, 7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15, 9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2240,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6, 7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5, 7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14, 7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6, 7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15, 7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7, 7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6, 7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 11,12,2496,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6, 7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5, 7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5, 7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15, 9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,12,11,0,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6, 7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5, 7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14, 7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6, 7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,11,11,1792,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15, 7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7, 7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6, 7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6, 7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5, 7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5, 7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15, 9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,11,1856,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6, 7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5, 7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14, 7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6, 7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15, 7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7, 7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6, 7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 11,12,2176,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6, 7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5, 7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5, 7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15, 9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6, 7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5, 7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14, 7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6, 7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,11,12,2432,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15, 7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7, 7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6, 7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6, 7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5, 7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5, 7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15, 9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2048,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6, 7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5, 7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14, 7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6, 7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15, 7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7, 7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6, 7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 11,11,1920,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6, 7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5, 7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5, 7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15, 9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6, 7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5, 7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14, 7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6, 7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,11,12,2304,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5, 7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15, 7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7, 7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6, 7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5, 7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14, 7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6, 7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5, 7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6, 7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5, 7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15, 9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6, 7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2560,7,4,3,7,5,11,7,4,5, 7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7, 7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6, 7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5, 7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7, 7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14, 7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6, 7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5, 7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7, 7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64, 7,5,10,7,4,4,7,4,2,7,4,7 }; const TIFFFaxTabEnt TIFFFaxBlackTable[8192] = { 12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,12,128,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,56,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,30,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,57,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,54,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,52,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,48,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,12,2112,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,44,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,36,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,384,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,28,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,60,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,40,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2368,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,12,1984,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,50,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,34,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,13,1664,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,26,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,13,1408,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,32,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,61,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,42,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1024,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,13,768,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,62,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2240,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,46,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,38,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,13,512,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,12,2496,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,12,11,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,25,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,12,192,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,13,1280,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,31,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1856,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,58,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,21,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,13,896,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,640,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,49,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,12,2176,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,45,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,37,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,12,448,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,29,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,13,1536,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,41,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,12,2432,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2048,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,51,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,35,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,12,320,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,27,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,59,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,33,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,256,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,43,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,13,1152,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,55,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,63,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,12,2304,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,47,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,39,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,53,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2560,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,11,1792,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,20,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,128,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,56,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,30,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,57,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,54,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,52,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,48,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2112,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,44,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,36,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,12,384,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,28,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,60,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,40,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,12,2368,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,12,1984,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,50,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,34,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1728,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,26,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,13,1472,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,32,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,61,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,42,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,13,1088,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,832,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,62,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,12,2240,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,46,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,38,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,13,576,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,24,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,12,2496,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,12,192,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1344,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,31,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,58,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,13,960,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,13,704,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,49,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,12,2176,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,45,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,37,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,448,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,29,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,13,1600,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,41,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2432,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,12,2048,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,51,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,35,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,12,320,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,27,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,59,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,33,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 10,12,256,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,43,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1216,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,55,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,63,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2304,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,12,47,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,39,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,12,53,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 11,12,2560,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2, 8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2, 8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2, 8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2, 8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2 }; gamera-3.3.3/src/libtiff/port.h0000644000076500000000000000420610714675674015330 0ustar chriswheel/* * Warning, this file was automatically created by the TIFF configure script * VERSION: v3.5.7 * RELEASE: * DATE: Thu Oct 24 16:52:27 2002 * TARGET: i686-pc-cygwin * CCOMPILER: /usr/bin/gcc-2.95.3-5 (cygwin special) */ #ifndef _PORT_ #define _PORT_ 1 #ifdef __cplusplus extern "C" { #endif #ifdef __CYGWIN__ typedef long off_t; typedef unsigned size_t; typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; #define HOST_FILLORDER FILLORDER_MSB2LSB #define HOST_BIGENDIAN 0 #ifndef O_RDONLY #define O_RDONLY 0 #endif #ifndef O_WRONLY #define O_WRONLY 1 #endif #ifndef O_RDWR #define O_RDWR 2 #endif typedef double dblparam_t; #ifdef __STRICT_ANSI__ #define INLINE __inline__ #else #define INLINE inline #endif #define GLOBALDATA(TYPE,NAME) extern TYPE NAME extern void* memset(void*, int, size_t); extern double floor(double); extern double ceil(double); extern double exp(double); extern double pow(double, double); extern int read(int, const void*, unsigned int); extern void* malloc(size_t); extern void* realloc(void*, size_t); extern void free(void*); #endif // __CYGWIN__ #if defined(__MINGW__) || defined(__MINGW32__) #include typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; #define HOST_FILLORDER FILLORDER_MSB2LSB #define HOST_BIGENDIAN 0 #include #include #include #include #include typedef double dblparam_t; #ifdef __STRICT_ANSI__ #define INLINE __inline__ #else #define INLINE inline #endif #define GLOBALDATA(TYPE,NAME) extern TYPE NAME extern void* malloc(size_t); extern void* realloc(void*, size_t); extern void free(void*); #endif #if defined(__APPLE__) #include #define HOST_FILLORDER FILLORDER_MSB2LSB #define HOST_BIGENDIAN 1 #include #include #include #include #include typedef double dblparam_t; #ifdef __STRICT_ANSI__ #define INLINE __inline__ #else #define INLINE inline #endif #define GLOBALDATA(TYPE,NAME) extern TYPE NAME #endif #ifdef __cplusplus } #endif #endif gamera-3.3.3/src/libtiff/t4.h0000644000076500000000000002602310714675674014674 0ustar chriswheel/* $Id: t4.h 158 2002-11-24 01:49:40Z karlmac $ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _T4_ #define _T4_ /* * CCITT T.4 1D Huffman runlength codes and * related definitions. Given the small sizes * of these tables it does not seem * worthwhile to make code & length 8 bits. */ typedef struct tableentry { unsigned short length; /* bit length of g3 code */ unsigned short code; /* g3 code */ short runlen; /* run length in bits */ } tableentry; #define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */ /* status values returned instead of a run length */ #define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */ #define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */ #define G3CODE_EOF -3 /* end of input data */ #define G3CODE_INCOMP -4 /* incomplete run code */ /* * Note that these tables are ordered such that the * index into the table is known to be either the * run length, or (run length / 64) + a fixed offset. * * NB: The G3CODE_INVALID entries are only used * during state generation (see mkg3states.c). */ #ifdef G3CODES const tableentry TIFFFaxWhiteCodes[] = { { 8, 0x35, 0 }, /* 0011 0101 */ { 6, 0x7, 1 }, /* 0001 11 */ { 4, 0x7, 2 }, /* 0111 */ { 4, 0x8, 3 }, /* 1000 */ { 4, 0xB, 4 }, /* 1011 */ { 4, 0xC, 5 }, /* 1100 */ { 4, 0xE, 6 }, /* 1110 */ { 4, 0xF, 7 }, /* 1111 */ { 5, 0x13, 8 }, /* 1001 1 */ { 5, 0x14, 9 }, /* 1010 0 */ { 5, 0x7, 10 }, /* 0011 1 */ { 5, 0x8, 11 }, /* 0100 0 */ { 6, 0x8, 12 }, /* 0010 00 */ { 6, 0x3, 13 }, /* 0000 11 */ { 6, 0x34, 14 }, /* 1101 00 */ { 6, 0x35, 15 }, /* 1101 01 */ { 6, 0x2A, 16 }, /* 1010 10 */ { 6, 0x2B, 17 }, /* 1010 11 */ { 7, 0x27, 18 }, /* 0100 111 */ { 7, 0xC, 19 }, /* 0001 100 */ { 7, 0x8, 20 }, /* 0001 000 */ { 7, 0x17, 21 }, /* 0010 111 */ { 7, 0x3, 22 }, /* 0000 011 */ { 7, 0x4, 23 }, /* 0000 100 */ { 7, 0x28, 24 }, /* 0101 000 */ { 7, 0x2B, 25 }, /* 0101 011 */ { 7, 0x13, 26 }, /* 0010 011 */ { 7, 0x24, 27 }, /* 0100 100 */ { 7, 0x18, 28 }, /* 0011 000 */ { 8, 0x2, 29 }, /* 0000 0010 */ { 8, 0x3, 30 }, /* 0000 0011 */ { 8, 0x1A, 31 }, /* 0001 1010 */ { 8, 0x1B, 32 }, /* 0001 1011 */ { 8, 0x12, 33 }, /* 0001 0010 */ { 8, 0x13, 34 }, /* 0001 0011 */ { 8, 0x14, 35 }, /* 0001 0100 */ { 8, 0x15, 36 }, /* 0001 0101 */ { 8, 0x16, 37 }, /* 0001 0110 */ { 8, 0x17, 38 }, /* 0001 0111 */ { 8, 0x28, 39 }, /* 0010 1000 */ { 8, 0x29, 40 }, /* 0010 1001 */ { 8, 0x2A, 41 }, /* 0010 1010 */ { 8, 0x2B, 42 }, /* 0010 1011 */ { 8, 0x2C, 43 }, /* 0010 1100 */ { 8, 0x2D, 44 }, /* 0010 1101 */ { 8, 0x4, 45 }, /* 0000 0100 */ { 8, 0x5, 46 }, /* 0000 0101 */ { 8, 0xA, 47 }, /* 0000 1010 */ { 8, 0xB, 48 }, /* 0000 1011 */ { 8, 0x52, 49 }, /* 0101 0010 */ { 8, 0x53, 50 }, /* 0101 0011 */ { 8, 0x54, 51 }, /* 0101 0100 */ { 8, 0x55, 52 }, /* 0101 0101 */ { 8, 0x24, 53 }, /* 0010 0100 */ { 8, 0x25, 54 }, /* 0010 0101 */ { 8, 0x58, 55 }, /* 0101 1000 */ { 8, 0x59, 56 }, /* 0101 1001 */ { 8, 0x5A, 57 }, /* 0101 1010 */ { 8, 0x5B, 58 }, /* 0101 1011 */ { 8, 0x4A, 59 }, /* 0100 1010 */ { 8, 0x4B, 60 }, /* 0100 1011 */ { 8, 0x32, 61 }, /* 0011 0010 */ { 8, 0x33, 62 }, /* 0011 0011 */ { 8, 0x34, 63 }, /* 0011 0100 */ { 5, 0x1B, 64 }, /* 1101 1 */ { 5, 0x12, 128 }, /* 1001 0 */ { 6, 0x17, 192 }, /* 0101 11 */ { 7, 0x37, 256 }, /* 0110 111 */ { 8, 0x36, 320 }, /* 0011 0110 */ { 8, 0x37, 384 }, /* 0011 0111 */ { 8, 0x64, 448 }, /* 0110 0100 */ { 8, 0x65, 512 }, /* 0110 0101 */ { 8, 0x68, 576 }, /* 0110 1000 */ { 8, 0x67, 640 }, /* 0110 0111 */ { 9, 0xCC, 704 }, /* 0110 0110 0 */ { 9, 0xCD, 768 }, /* 0110 0110 1 */ { 9, 0xD2, 832 }, /* 0110 1001 0 */ { 9, 0xD3, 896 }, /* 0110 1001 1 */ { 9, 0xD4, 960 }, /* 0110 1010 0 */ { 9, 0xD5, 1024 }, /* 0110 1010 1 */ { 9, 0xD6, 1088 }, /* 0110 1011 0 */ { 9, 0xD7, 1152 }, /* 0110 1011 1 */ { 9, 0xD8, 1216 }, /* 0110 1100 0 */ { 9, 0xD9, 1280 }, /* 0110 1100 1 */ { 9, 0xDA, 1344 }, /* 0110 1101 0 */ { 9, 0xDB, 1408 }, /* 0110 1101 1 */ { 9, 0x98, 1472 }, /* 0100 1100 0 */ { 9, 0x99, 1536 }, /* 0100 1100 1 */ { 9, 0x9A, 1600 }, /* 0100 1101 0 */ { 6, 0x18, 1664 }, /* 0110 00 */ { 9, 0x9B, 1728 }, /* 0100 1101 1 */ { 11, 0x8, 1792 }, /* 0000 0001 000 */ { 11, 0xC, 1856 }, /* 0000 0001 100 */ { 11, 0xD, 1920 }, /* 0000 0001 101 */ { 12, 0x12, 1984 }, /* 0000 0001 0010 */ { 12, 0x13, 2048 }, /* 0000 0001 0011 */ { 12, 0x14, 2112 }, /* 0000 0001 0100 */ { 12, 0x15, 2176 }, /* 0000 0001 0101 */ { 12, 0x16, 2240 }, /* 0000 0001 0110 */ { 12, 0x17, 2304 }, /* 0000 0001 0111 */ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ }; const tableentry TIFFFaxBlackCodes[] = { { 10, 0x37, 0 }, /* 0000 1101 11 */ { 3, 0x2, 1 }, /* 010 */ { 2, 0x3, 2 }, /* 11 */ { 2, 0x2, 3 }, /* 10 */ { 3, 0x3, 4 }, /* 011 */ { 4, 0x3, 5 }, /* 0011 */ { 4, 0x2, 6 }, /* 0010 */ { 5, 0x3, 7 }, /* 0001 1 */ { 6, 0x5, 8 }, /* 0001 01 */ { 6, 0x4, 9 }, /* 0001 00 */ { 7, 0x4, 10 }, /* 0000 100 */ { 7, 0x5, 11 }, /* 0000 101 */ { 7, 0x7, 12 }, /* 0000 111 */ { 8, 0x4, 13 }, /* 0000 0100 */ { 8, 0x7, 14 }, /* 0000 0111 */ { 9, 0x18, 15 }, /* 0000 1100 0 */ { 10, 0x17, 16 }, /* 0000 0101 11 */ { 10, 0x18, 17 }, /* 0000 0110 00 */ { 10, 0x8, 18 }, /* 0000 0010 00 */ { 11, 0x67, 19 }, /* 0000 1100 111 */ { 11, 0x68, 20 }, /* 0000 1101 000 */ { 11, 0x6C, 21 }, /* 0000 1101 100 */ { 11, 0x37, 22 }, /* 0000 0110 111 */ { 11, 0x28, 23 }, /* 0000 0101 000 */ { 11, 0x17, 24 }, /* 0000 0010 111 */ { 11, 0x18, 25 }, /* 0000 0011 000 */ { 12, 0xCA, 26 }, /* 0000 1100 1010 */ { 12, 0xCB, 27 }, /* 0000 1100 1011 */ { 12, 0xCC, 28 }, /* 0000 1100 1100 */ { 12, 0xCD, 29 }, /* 0000 1100 1101 */ { 12, 0x68, 30 }, /* 0000 0110 1000 */ { 12, 0x69, 31 }, /* 0000 0110 1001 */ { 12, 0x6A, 32 }, /* 0000 0110 1010 */ { 12, 0x6B, 33 }, /* 0000 0110 1011 */ { 12, 0xD2, 34 }, /* 0000 1101 0010 */ { 12, 0xD3, 35 }, /* 0000 1101 0011 */ { 12, 0xD4, 36 }, /* 0000 1101 0100 */ { 12, 0xD5, 37 }, /* 0000 1101 0101 */ { 12, 0xD6, 38 }, /* 0000 1101 0110 */ { 12, 0xD7, 39 }, /* 0000 1101 0111 */ { 12, 0x6C, 40 }, /* 0000 0110 1100 */ { 12, 0x6D, 41 }, /* 0000 0110 1101 */ { 12, 0xDA, 42 }, /* 0000 1101 1010 */ { 12, 0xDB, 43 }, /* 0000 1101 1011 */ { 12, 0x54, 44 }, /* 0000 0101 0100 */ { 12, 0x55, 45 }, /* 0000 0101 0101 */ { 12, 0x56, 46 }, /* 0000 0101 0110 */ { 12, 0x57, 47 }, /* 0000 0101 0111 */ { 12, 0x64, 48 }, /* 0000 0110 0100 */ { 12, 0x65, 49 }, /* 0000 0110 0101 */ { 12, 0x52, 50 }, /* 0000 0101 0010 */ { 12, 0x53, 51 }, /* 0000 0101 0011 */ { 12, 0x24, 52 }, /* 0000 0010 0100 */ { 12, 0x37, 53 }, /* 0000 0011 0111 */ { 12, 0x38, 54 }, /* 0000 0011 1000 */ { 12, 0x27, 55 }, /* 0000 0010 0111 */ { 12, 0x28, 56 }, /* 0000 0010 1000 */ { 12, 0x58, 57 }, /* 0000 0101 1000 */ { 12, 0x59, 58 }, /* 0000 0101 1001 */ { 12, 0x2B, 59 }, /* 0000 0010 1011 */ { 12, 0x2C, 60 }, /* 0000 0010 1100 */ { 12, 0x5A, 61 }, /* 0000 0101 1010 */ { 12, 0x66, 62 }, /* 0000 0110 0110 */ { 12, 0x67, 63 }, /* 0000 0110 0111 */ { 10, 0xF, 64 }, /* 0000 0011 11 */ { 12, 0xC8, 128 }, /* 0000 1100 1000 */ { 12, 0xC9, 192 }, /* 0000 1100 1001 */ { 12, 0x5B, 256 }, /* 0000 0101 1011 */ { 12, 0x33, 320 }, /* 0000 0011 0011 */ { 12, 0x34, 384 }, /* 0000 0011 0100 */ { 12, 0x35, 448 }, /* 0000 0011 0101 */ { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */ { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */ { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */ { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */ { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */ { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */ { 13, 0x72, 896 }, /* 0000 0011 1001 0 */ { 13, 0x73, 960 }, /* 0000 0011 1001 1 */ { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */ { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */ { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */ { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */ { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */ { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */ { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */ { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */ { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */ { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */ { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */ { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */ { 11, 0x8, 1792 }, /* 0000 0001 000 */ { 11, 0xC, 1856 }, /* 0000 0001 100 */ { 11, 0xD, 1920 }, /* 0000 0001 101 */ { 12, 0x12, 1984 }, /* 0000 0001 0010 */ { 12, 0x13, 2048 }, /* 0000 0001 0011 */ { 12, 0x14, 2112 }, /* 0000 0001 0100 */ { 12, 0x15, 2176 }, /* 0000 0001 0101 */ { 12, 0x16, 2240 }, /* 0000 0001 0110 */ { 12, 0x17, 2304 }, /* 0000 0001 0111 */ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ }; #else extern const tableentry TIFFFaxWhiteCodes[]; extern const tableentry TIFFFaxBlackCodes[]; #endif #endif /* _T4_ */ gamera-3.3.3/src/libtiff/tif_aux.c0000644000076500000000000001371210714675674016000 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Auxiliary Support Routines. */ #include "tiffiop.h" #ifdef COLORIMETRY_SUPPORT #include static void TIFFDefaultTransferFunction(TIFFDirectory* td) { uint16 **tf = td->td_transferfunction; long i, n = 1<td_bitspersample; tf[0] = (uint16 *)_TIFFmalloc(n * sizeof (uint16)); tf[0][0] = 0; for (i = 1; i < n; i++) { double t = (double)i/((double) n-1.); tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5); } if (td->td_samplesperpixel - td->td_extrasamples > 1) { tf[1] = (uint16 *)_TIFFmalloc(n * sizeof (uint16)); _TIFFmemcpy(tf[1], tf[0], n * sizeof (uint16)); tf[2] = (uint16 *)_TIFFmalloc(n * sizeof (uint16)); _TIFFmemcpy(tf[2], tf[0], n * sizeof (uint16)); } } static void TIFFDefaultRefBlackWhite(TIFFDirectory* td) { int i; td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float)); for (i = 0; i < 3; i++) { td->td_refblackwhite[2*i+0] = 0; td->td_refblackwhite[2*i+1] = (float)((1L<td_bitspersample)-1L); } } #endif /* * Like TIFFGetField, but return any default * value if the tag is not present in the directory. * * NB: We use the value in the directory, rather than * explcit values so that defaults exist only one * place in the library -- in TIFFDefaultDirectory. */ int TIFFVGetFieldDefaulted(TIFF* tif, ttag_t tag, va_list ap) { TIFFDirectory *td = &tif->tif_dir; if (TIFFVGetField(tif, tag, ap)) return (1); switch (tag) { case TIFFTAG_SUBFILETYPE: *va_arg(ap, uint32 *) = td->td_subfiletype; return (1); case TIFFTAG_BITSPERSAMPLE: *va_arg(ap, uint16 *) = td->td_bitspersample; return (1); case TIFFTAG_THRESHHOLDING: *va_arg(ap, uint16 *) = td->td_threshholding; return (1); case TIFFTAG_FILLORDER: *va_arg(ap, uint16 *) = td->td_fillorder; return (1); case TIFFTAG_ORIENTATION: *va_arg(ap, uint16 *) = td->td_orientation; return (1); case TIFFTAG_SAMPLESPERPIXEL: *va_arg(ap, uint16 *) = td->td_samplesperpixel; return (1); case TIFFTAG_ROWSPERSTRIP: *va_arg(ap, uint32 *) = td->td_rowsperstrip; return (1); case TIFFTAG_MINSAMPLEVALUE: *va_arg(ap, uint16 *) = td->td_minsamplevalue; return (1); case TIFFTAG_MAXSAMPLEVALUE: *va_arg(ap, uint16 *) = td->td_maxsamplevalue; return (1); case TIFFTAG_PLANARCONFIG: *va_arg(ap, uint16 *) = td->td_planarconfig; return (1); case TIFFTAG_RESOLUTIONUNIT: *va_arg(ap, uint16 *) = td->td_resolutionunit; return (1); #ifdef CMYK_SUPPORT case TIFFTAG_DOTRANGE: *va_arg(ap, uint16 *) = 0; *va_arg(ap, uint16 *) = (1<td_bitspersample)-1; return (1); case TIFFTAG_INKSET: *va_arg(ap, uint16 *) = td->td_inkset; return (1); case TIFFTAG_NUMBEROFINKS: *va_arg(ap, uint16 *) = td->td_ninks; return (1); #endif case TIFFTAG_EXTRASAMPLES: *va_arg(ap, uint16 *) = td->td_extrasamples; *va_arg(ap, uint16 **) = td->td_sampleinfo; return (1); case TIFFTAG_MATTEING: *va_arg(ap, uint16 *) = (td->td_extrasamples == 1 && td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA); return (1); case TIFFTAG_TILEDEPTH: *va_arg(ap, uint32 *) = td->td_tiledepth; return (1); case TIFFTAG_DATATYPE: *va_arg(ap, uint16 *) = td->td_sampleformat-1; return (1); case TIFFTAG_SAMPLEFORMAT: *va_arg(ap, uint16 *) = td->td_sampleformat; return(1); case TIFFTAG_IMAGEDEPTH: *va_arg(ap, uint32 *) = td->td_imagedepth; return (1); #ifdef YCBCR_SUPPORT case TIFFTAG_YCBCRCOEFFICIENTS: if (!td->td_ycbcrcoeffs) { td->td_ycbcrcoeffs = (float *) _TIFFmalloc(3*sizeof (float)); /* defaults are from CCIR Recommendation 601-1 */ td->td_ycbcrcoeffs[0] = 0.299f; td->td_ycbcrcoeffs[1] = 0.587f; td->td_ycbcrcoeffs[2] = 0.114f; } *va_arg(ap, float **) = td->td_ycbcrcoeffs; return (1); case TIFFTAG_YCBCRSUBSAMPLING: *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0]; *va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1]; return (1); case TIFFTAG_YCBCRPOSITIONING: *va_arg(ap, uint16 *) = td->td_ycbcrpositioning; return (1); #endif #ifdef COLORIMETRY_SUPPORT case TIFFTAG_TRANSFERFUNCTION: if (!td->td_transferfunction[0]) TIFFDefaultTransferFunction(td); *va_arg(ap, uint16 **) = td->td_transferfunction[0]; if (td->td_samplesperpixel - td->td_extrasamples > 1) { *va_arg(ap, uint16 **) = td->td_transferfunction[1]; *va_arg(ap, uint16 **) = td->td_transferfunction[2]; } return (1); case TIFFTAG_REFERENCEBLACKWHITE: if (!td->td_refblackwhite) TIFFDefaultRefBlackWhite(td); *va_arg(ap, float **) = td->td_refblackwhite; return (1); #endif } return (0); } /* * Like TIFFGetField, but return any default * value if the tag is not present in the directory. */ int TIFFGetFieldDefaulted(TIFF* tif, ttag_t tag, ...) { int ok; va_list ap; va_start(ap, tag); ok = TIFFVGetFieldDefaulted(tif, tag, ap); va_end(ap); return (ok); } gamera-3.3.3/src/libtiff/tif_close.c0000644000076500000000000000331710714675674016310 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" void TIFFClose(TIFF* tif) { if (tif->tif_mode != O_RDONLY) /* * Flush buffered data and directory (if dirty). */ TIFFFlush(tif); (*tif->tif_cleanup)(tif); TIFFFreeDirectory(tif); if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER)) _TIFFfree(tif->tif_rawdata); if (isMapped(tif)) TIFFUnmapFileContents(tif, tif->tif_base, tif->tif_size); (void) TIFFCloseFile(tif); if (tif->tif_fieldinfo) _TIFFfree(tif->tif_fieldinfo); _TIFFfree(tif); } gamera-3.3.3/src/libtiff/tif_codec.c0000644000076500000000000000724710714675674016266 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Builtin Compression Scheme Configuration Support. */ #include "tiffiop.h" static int NotConfigured(TIFF*, int); #ifndef LZW_SUPPORT #define TIFFInitLZW NotConfigured #endif #ifndef PACKBITS_SUPPORT #define TIFFInitPackbits NotConfigured #endif #ifndef THUNDER_SUPPORT #define TIFFInitThunderScan NotConfigured #endif #ifndef NEXT_SUPPORT #define TIFFInitNeXT NotConfigured #endif #ifndef JPEG_SUPPORT #define TIFFInitJPEG NotConfigured #endif #ifndef OJPEG_SUPPORT #define TIFFInitOJPEG NotConfigured #endif #ifndef CCITT_SUPPORT #define TIFFInitCCITTRLE NotConfigured #define TIFFInitCCITTRLEW NotConfigured #define TIFFInitCCITTFax3 NotConfigured #define TIFFInitCCITTFax4 NotConfigured #endif #ifndef JBIG_SUPPORT #define TIFFInitJBIG NotConfigured #endif #ifndef ZIP_SUPPORT #define TIFFInitZIP NotConfigured #endif #ifndef PIXARLOG_SUPPORT #define TIFFInitPixarLog NotConfigured #endif #ifndef LOGLUV_SUPPORT #define TIFFInitSGILog NotConfigured #endif /* * Compression schemes statically built into the library. */ #ifdef VMS const TIFFCodec _TIFFBuiltinCODECS[] = { #else TIFFCodec _TIFFBuiltinCODECS[] = { #endif { "None", COMPRESSION_NONE, TIFFInitDumpMode }, { "LZW", COMPRESSION_LZW, TIFFInitLZW }, { "PackBits", COMPRESSION_PACKBITS, TIFFInitPackBits }, { "ThunderScan", COMPRESSION_THUNDERSCAN,TIFFInitThunderScan }, { "NeXT", COMPRESSION_NEXT, TIFFInitNeXT }, { "JPEG", COMPRESSION_JPEG, TIFFInitJPEG }, { "Old-style JPEG", COMPRESSION_OJPEG, TIFFInitOJPEG }, { "CCITT RLE", COMPRESSION_CCITTRLE, TIFFInitCCITTRLE }, { "CCITT RLE/W", COMPRESSION_CCITTRLEW, TIFFInitCCITTRLEW }, { "CCITT Group 3", COMPRESSION_CCITTFAX3, TIFFInitCCITTFax3 }, { "CCITT Group 4", COMPRESSION_CCITTFAX4, TIFFInitCCITTFax4 }, { "ISO JBIG", COMPRESSION_JBIG, TIFFInitJBIG }, { "Deflate", COMPRESSION_DEFLATE, TIFFInitZIP }, { "AdobeDeflate", COMPRESSION_ADOBE_DEFLATE , TIFFInitZIP }, { "PixarLog", COMPRESSION_PIXARLOG, TIFFInitPixarLog }, { "SGILog", COMPRESSION_SGILOG, TIFFInitSGILog }, { "SGILog24", COMPRESSION_SGILOG24, TIFFInitSGILog }, { NULL } }; static int _notConfigured(TIFF* tif) { const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); TIFFError(tif->tif_name, "%s compression support is not configured", c->name); return (0); } static int NotConfigured(TIFF* tif, int scheme) { tif->tif_setupdecode = _notConfigured; tif->tif_setupencode = _notConfigured; return (1); } gamera-3.3.3/src/libtiff/tif_compress.c0000644000076500000000000001400610714675674017033 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Compression Scheme Configuration Support. */ #include "tiffiop.h" static int TIFFNoEncode(TIFF* tif, char* method) { const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); if (c) { if (! strncmp(c->name, "LZW", 3) ){ TIFFError(tif->tif_name, "%s %s encoding is no longer implemented due to Unisys patent enforcement", c->name, method); } else { TIFFError(tif->tif_name, "%s %s encoding is not implemented", c->name, method); } } else { TIFFError(tif->tif_name, "Compression scheme %u %s encoding is not implemented", tif->tif_dir.td_compression, method); } return (-1); } int _TIFFNoRowEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) { (void) pp; (void) cc; (void) s; return (TIFFNoEncode(tif, "scanline")); } int _TIFFNoStripEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) { (void) pp; (void) cc; (void) s; return (TIFFNoEncode(tif, "strip")); } int _TIFFNoTileEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) { (void) pp; (void) cc; (void) s; return (TIFFNoEncode(tif, "tile")); } static int TIFFNoDecode(TIFF* tif, char* method) { const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression); if (c) TIFFError(tif->tif_name, "%s %s decoding is not implemented", c->name, method); else TIFFError(tif->tif_name, "Compression scheme %u %s decoding is not implemented", tif->tif_dir.td_compression, method); return (-1); } int _TIFFNoRowDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) { (void) pp; (void) cc; (void) s; return (TIFFNoDecode(tif, "scanline")); } int _TIFFNoStripDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) { (void) pp; (void) cc; (void) s; return (TIFFNoDecode(tif, "strip")); } int _TIFFNoTileDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) { (void) pp; (void) cc; (void) s; return (TIFFNoDecode(tif, "tile")); } int _TIFFNoSeek(TIFF* tif, uint32 off) { (void) off; TIFFError(tif->tif_name, "Compression algorithm does not support random access"); return (0); } int _TIFFNoPreCode(TIFF* tif, tsample_t s) { (void) tif; (void) s; return (1); } static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); } static void _TIFFvoid(TIFF* tif) { (void) tif; } void _TIFFSetDefaultCompressionState(TIFF* tif) { tif->tif_setupdecode = _TIFFtrue; tif->tif_predecode = _TIFFNoPreCode; tif->tif_decoderow = _TIFFNoRowDecode; tif->tif_decodestrip = _TIFFNoStripDecode; tif->tif_decodetile = _TIFFNoTileDecode; tif->tif_setupencode = _TIFFtrue; tif->tif_preencode = _TIFFNoPreCode; tif->tif_postencode = _TIFFtrue; tif->tif_encoderow = _TIFFNoRowEncode; tif->tif_encodestrip = _TIFFNoStripEncode; tif->tif_encodetile = _TIFFNoTileEncode; tif->tif_close = _TIFFvoid; tif->tif_seek = _TIFFNoSeek; tif->tif_cleanup = _TIFFvoid; tif->tif_defstripsize = _TIFFDefaultStripSize; tif->tif_deftilesize = _TIFFDefaultTileSize; tif->tif_flags &= ~TIFF_NOBITREV; } int TIFFSetCompressionScheme(TIFF* tif, int scheme) { const TIFFCodec *c = TIFFFindCODEC((uint16) scheme); _TIFFSetDefaultCompressionState(tif); /* * Don't treat an unknown compression scheme as an error. * This permits applications to open files with data that * the library does not have builtin support for, but which * may still be meaningful. */ return (c ? (*c->init)(tif, scheme) : 1); } /* * Other compression schemes may be registered. Registered * schemes can also override the builtin versions provided * by this library. */ typedef struct _codec { struct _codec* next; TIFFCodec* info; } codec_t; static codec_t* registeredCODECS = NULL; const TIFFCodec* TIFFFindCODEC(uint16 scheme) { const TIFFCodec* c; codec_t* cd; for (cd = registeredCODECS; cd; cd = cd->next) if (cd->info->scheme == scheme) return ((const TIFFCodec*) cd->info); for (c = _TIFFBuiltinCODECS; c->name; c++) if (c->scheme == scheme) return (c); return ((const TIFFCodec*) 0); } TIFFCodec* TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init) { codec_t* cd = (codec_t*) _TIFFmalloc(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1); if (cd != NULL) { cd->info = (TIFFCodec*) ((tidata_t) cd + sizeof (codec_t)); cd->info->name = (char*) ((tidata_t) cd->info + sizeof (TIFFCodec)); strcpy(cd->info->name, name); cd->info->scheme = scheme; cd->info->init = init; cd->next = registeredCODECS; registeredCODECS = cd; } else TIFFError("TIFFRegisterCODEC", "No space to register compression scheme %s", name); return (cd->info); } void TIFFUnRegisterCODEC(TIFFCodec* c) { codec_t* cd; codec_t** pcd; for (pcd = ®isteredCODECS; (cd = *pcd); pcd = &cd->next) if (cd->info == c) { *pcd = cd->next; _TIFFfree(cd); return; } TIFFError("TIFFUnRegisterCODEC", "Cannot remove compression scheme %s; not registered", c->name); } gamera-3.3.3/src/libtiff/tif_dir.c0000644000076500000000000010734110714675674015763 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Directory Tag Get & Set Routines. * (and also some miscellaneous stuff) */ #include "tiffiop.h" /* * These are used in the backwards compatibility code... */ #define DATATYPE_VOID 0 /* !untyped data */ #define DATATYPE_INT 1 /* !signed integer data */ #define DATATYPE_UINT 2 /* !unsigned integer data */ #define DATATYPE_IEEEFP 3 /* !IEEE floating point data */ void _TIFFsetByteArray(void** vpp, void* vp, long n) { if (*vpp) _TIFFfree(*vpp), *vpp = 0; if (vp && (*vpp = (void*) _TIFFmalloc(n))) _TIFFmemcpy(*vpp, vp, n); } void _TIFFsetString(char** cpp, char* cp) { _TIFFsetByteArray((void**) cpp, (void*) cp, (long) (strlen(cp)+1)); } void _TIFFsetNString(char** cpp, char* cp, long n) { _TIFFsetByteArray((void**) cpp, (void*) cp, n); } void _TIFFsetShortArray(uint16** wpp, uint16* wp, long n) { _TIFFsetByteArray((void**) wpp, (void*) wp, n*sizeof (uint16)); } void _TIFFsetLongArray(uint32** lpp, uint32* lp, long n) { _TIFFsetByteArray((void**) lpp, (void*) lp, n*sizeof (uint32)); } void _TIFFsetFloatArray(float** fpp, float* fp, long n) { _TIFFsetByteArray((void**) fpp, (void*) fp, n*sizeof (float)); } void _TIFFsetDoubleArray(double** dpp, double* dp, long n) { _TIFFsetByteArray((void**) dpp, (void*) dp, n*sizeof (double)); } /* * Install extra samples information. */ static int setExtraSamples(TIFFDirectory* td, va_list ap, int* v) { uint16* va; int i; *v = va_arg(ap, int); if ((uint16) *v > td->td_samplesperpixel) return (0); va = va_arg(ap, uint16*); if (*v > 0 && va == NULL) /* typically missing param */ return (0); for (i = 0; i < *v; i++) if (va[i] > EXTRASAMPLE_UNASSALPHA) return (0); td->td_extrasamples = (uint16) *v; _TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples); return (1); } #ifdef CMYK_SUPPORT static int checkInkNamesString(TIFF* tif, int slen, const char* s) { TIFFDirectory* td = &tif->tif_dir; int i = td->td_samplesperpixel; if (slen > 0) { const char* ep = s+slen; const char* cp = s; for (; i > 0; i--) { for (; *cp != '\0'; cp++) if (cp >= ep) goto bad; cp++; /* skip \0 */ } return (cp-s); } bad: TIFFError("TIFFSetField", "%s: Invalid InkNames value; expecting %d names, found %d", tif->tif_name, td->td_samplesperpixel, td->td_samplesperpixel-i); return (0); } #endif static int _TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap) { TIFFDirectory* td = &tif->tif_dir; int status = 1; uint32 v32; int i, v; double d; char* s; switch (tag) { case TIFFTAG_SUBFILETYPE: td->td_subfiletype = va_arg(ap, uint32); break; case TIFFTAG_IMAGEWIDTH: td->td_imagewidth = va_arg(ap, uint32); break; case TIFFTAG_IMAGELENGTH: td->td_imagelength = va_arg(ap, uint32); break; case TIFFTAG_BITSPERSAMPLE: td->td_bitspersample = (uint16) va_arg(ap, int); /* * If the data require post-decoding processing * to byte-swap samples, set it up here. Note * that since tags are required to be ordered, * compression code can override this behaviour * in the setup method if it wants to roll the * post decoding work in with its normal work. */ if (tif->tif_flags & TIFF_SWAB) { if (td->td_bitspersample == 16) tif->tif_postdecode = _TIFFSwab16BitData; else if (td->td_bitspersample == 32) tif->tif_postdecode = _TIFFSwab32BitData; else if (td->td_bitspersample == 64) tif->tif_postdecode = _TIFFSwab64BitData; } break; case TIFFTAG_COMPRESSION: v = va_arg(ap, int) & 0xffff; /* * If we're changing the compression scheme, * the notify the previous module so that it * can cleanup any state it's setup. */ if (TIFFFieldSet(tif, FIELD_COMPRESSION)) { if (td->td_compression == v) break; (*tif->tif_cleanup)(tif); tif->tif_flags &= ~TIFF_CODERSETUP; } /* * Setup new compression routine state. */ if( (status = TIFFSetCompressionScheme(tif, v)) != 0 ) td->td_compression = v; else status = 0; break; case TIFFTAG_PHOTOMETRIC: td->td_photometric = (uint16) va_arg(ap, int); break; case TIFFTAG_THRESHHOLDING: td->td_threshholding = (uint16) va_arg(ap, int); break; case TIFFTAG_FILLORDER: v = va_arg(ap, int); if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB) goto badvalue; td->td_fillorder = (uint16) v; break; case TIFFTAG_DOCUMENTNAME: _TIFFsetString(&td->td_documentname, va_arg(ap, char*)); break; case TIFFTAG_ARTIST: _TIFFsetString(&td->td_artist, va_arg(ap, char*)); break; case TIFFTAG_DATETIME: _TIFFsetString(&td->td_datetime, va_arg(ap, char*)); break; case TIFFTAG_HOSTCOMPUTER: _TIFFsetString(&td->td_hostcomputer, va_arg(ap, char*)); break; case TIFFTAG_IMAGEDESCRIPTION: _TIFFsetString(&td->td_imagedescription, va_arg(ap, char*)); break; case TIFFTAG_MAKE: _TIFFsetString(&td->td_make, va_arg(ap, char*)); break; case TIFFTAG_MODEL: _TIFFsetString(&td->td_model, va_arg(ap, char*)); break; case TIFFTAG_SOFTWARE: _TIFFsetString(&td->td_software, va_arg(ap, char*)); break; case TIFFTAG_COPYRIGHT: _TIFFsetString(&td->td_copyright, va_arg(ap, char*)); break; case TIFFTAG_ORIENTATION: v = va_arg(ap, int); if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v) { TIFFWarning(tif->tif_name, "Bad value %ld for \"%s\" tag ignored", v, _TIFFFieldWithTag(tif, tag)->field_name); } else td->td_orientation = (uint16) v; break; case TIFFTAG_SAMPLESPERPIXEL: /* XXX should cross check -- e.g. if pallette, then 1 */ v = va_arg(ap, int); if (v == 0) goto badvalue; td->td_samplesperpixel = (uint16) v; break; case TIFFTAG_ROWSPERSTRIP: v32 = va_arg(ap, uint32); if (v32 == 0) goto badvalue32; td->td_rowsperstrip = v32; if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) { td->td_tilelength = v32; td->td_tilewidth = td->td_imagewidth; } break; case TIFFTAG_MINSAMPLEVALUE: td->td_minsamplevalue = (uint16) va_arg(ap, int); break; case TIFFTAG_MAXSAMPLEVALUE: td->td_maxsamplevalue = (uint16) va_arg(ap, int); break; case TIFFTAG_SMINSAMPLEVALUE: td->td_sminsamplevalue = (double) va_arg(ap, dblparam_t); break; case TIFFTAG_SMAXSAMPLEVALUE: td->td_smaxsamplevalue = (double) va_arg(ap, dblparam_t); break; case TIFFTAG_XRESOLUTION: td->td_xresolution = (float) va_arg(ap, dblparam_t); break; case TIFFTAG_YRESOLUTION: td->td_yresolution = (float) va_arg(ap, dblparam_t); break; case TIFFTAG_PLANARCONFIG: v = va_arg(ap, int); if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE) goto badvalue; td->td_planarconfig = (uint16) v; break; case TIFFTAG_PAGENAME: _TIFFsetString(&td->td_pagename, va_arg(ap, char*)); break; case TIFFTAG_XPOSITION: td->td_xposition = (float) va_arg(ap, dblparam_t); break; case TIFFTAG_YPOSITION: td->td_yposition = (float) va_arg(ap, dblparam_t); break; case TIFFTAG_RESOLUTIONUNIT: v = va_arg(ap, int); if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v) goto badvalue; td->td_resolutionunit = (uint16) v; break; case TIFFTAG_PAGENUMBER: td->td_pagenumber[0] = (uint16) va_arg(ap, int); td->td_pagenumber[1] = (uint16) va_arg(ap, int); break; case TIFFTAG_HALFTONEHINTS: td->td_halftonehints[0] = (uint16) va_arg(ap, int); td->td_halftonehints[1] = (uint16) va_arg(ap, int); break; case TIFFTAG_COLORMAP: v32 = (uint32)(1L<td_bitspersample); _TIFFsetShortArray(&td->td_colormap[0], va_arg(ap, uint16*), v32); _TIFFsetShortArray(&td->td_colormap[1], va_arg(ap, uint16*), v32); _TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32); break; case TIFFTAG_EXTRASAMPLES: if (!setExtraSamples(td, ap, &v)) goto badvalue; break; case TIFFTAG_MATTEING: td->td_extrasamples = (uint16) (va_arg(ap, int) != 0); if (td->td_extrasamples) { uint16 sv = EXTRASAMPLE_ASSOCALPHA; _TIFFsetShortArray(&td->td_sampleinfo, &sv, 1); } break; case TIFFTAG_TILEWIDTH: v32 = va_arg(ap, uint32); if (v32 % 16) { if (tif->tif_mode != O_RDONLY) goto badvalue32; TIFFWarning(tif->tif_name, "Nonstandard tile width %d, convert file", v32); } td->td_tilewidth = v32; tif->tif_flags |= TIFF_ISTILED; break; case TIFFTAG_TILELENGTH: v32 = va_arg(ap, uint32); if (v32 % 16) { if (tif->tif_mode != O_RDONLY) goto badvalue32; TIFFWarning(tif->tif_name, "Nonstandard tile length %d, convert file", v32); } td->td_tilelength = v32; tif->tif_flags |= TIFF_ISTILED; break; case TIFFTAG_TILEDEPTH: v32 = va_arg(ap, uint32); if (v32 == 0) goto badvalue32; td->td_tiledepth = v32; break; case TIFFTAG_DATATYPE: v = va_arg(ap, int); switch (v) { case DATATYPE_VOID: v = SAMPLEFORMAT_VOID; break; case DATATYPE_INT: v = SAMPLEFORMAT_INT; break; case DATATYPE_UINT: v = SAMPLEFORMAT_UINT; break; case DATATYPE_IEEEFP: v = SAMPLEFORMAT_IEEEFP;break; default: goto badvalue; } td->td_sampleformat = (uint16) v; break; case TIFFTAG_SAMPLEFORMAT: v = va_arg(ap, int); if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v) goto badvalue; td->td_sampleformat = (uint16) v; break; case TIFFTAG_IMAGEDEPTH: td->td_imagedepth = va_arg(ap, uint32); break; case TIFFTAG_STONITS: d = va_arg(ap, dblparam_t); if (d <= 0.) goto badvaluedbl; td->td_stonits = d; break; /* Begin Pixar Tags */ case TIFFTAG_PIXAR_IMAGEFULLWIDTH: td->td_imagefullwidth = va_arg(ap, uint32); break; case TIFFTAG_PIXAR_IMAGEFULLLENGTH: td->td_imagefulllength = va_arg(ap, uint32); break; case TIFFTAG_PIXAR_TEXTUREFORMAT: _TIFFsetString(&td->td_textureformat, va_arg(ap, char*)); break; case TIFFTAG_PIXAR_WRAPMODES: _TIFFsetString(&td->td_wrapmodes, va_arg(ap, char*)); break; case TIFFTAG_PIXAR_FOVCOT: td->td_fovcot = (float) va_arg(ap, dblparam_t); break; case TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN: _TIFFsetFloatArray(&td->td_matrixWorldToScreen, va_arg(ap, float*), 16); break; case TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA: _TIFFsetFloatArray(&td->td_matrixWorldToCamera, va_arg(ap, float*), 16); break; /* End Pixar Tags */ #if SUBIFD_SUPPORT case TIFFTAG_SUBIFD: if ((tif->tif_flags & TIFF_INSUBIFD) == 0) { td->td_nsubifd = (uint16) va_arg(ap, int); _TIFFsetLongArray(&td->td_subifd, va_arg(ap, uint32*), (long) td->td_nsubifd); } else { TIFFError(tif->tif_name, "Sorry, cannot nest SubIFDs"); status = 0; } break; #endif #ifdef YCBCR_SUPPORT case TIFFTAG_YCBCRCOEFFICIENTS: _TIFFsetFloatArray(&td->td_ycbcrcoeffs, va_arg(ap, float*), 3); break; case TIFFTAG_YCBCRPOSITIONING: td->td_ycbcrpositioning = (uint16) va_arg(ap, int); break; case TIFFTAG_YCBCRSUBSAMPLING: td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, int); td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, int); break; #endif #ifdef COLORIMETRY_SUPPORT case TIFFTAG_WHITEPOINT: _TIFFsetFloatArray(&td->td_whitepoint, va_arg(ap, float*), 2); break; case TIFFTAG_PRIMARYCHROMATICITIES: _TIFFsetFloatArray(&td->td_primarychromas, va_arg(ap, float*), 6); break; case TIFFTAG_TRANSFERFUNCTION: v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1; for (i = 0; i < v; i++) _TIFFsetShortArray(&td->td_transferfunction[i], va_arg(ap, uint16*), 1L<td_bitspersample); break; case TIFFTAG_REFERENCEBLACKWHITE: /* XXX should check for null range */ _TIFFsetFloatArray(&td->td_refblackwhite, va_arg(ap, float*), 6); break; #endif #ifdef CMYK_SUPPORT case TIFFTAG_INKSET: td->td_inkset = (uint16) va_arg(ap, int); break; case TIFFTAG_DOTRANGE: /* XXX should check for null range */ td->td_dotrange[0] = (uint16) va_arg(ap, int); td->td_dotrange[1] = (uint16) va_arg(ap, int); break; case TIFFTAG_INKNAMES: i = va_arg(ap, int); s = va_arg(ap, char*); i = checkInkNamesString(tif, i, s); status = i > 0; if( i > 0 ) { _TIFFsetNString(&td->td_inknames, s, i); td->td_inknameslen = i; } break; case TIFFTAG_NUMBEROFINKS: td->td_ninks = (uint16) va_arg(ap, int); break; case TIFFTAG_TARGETPRINTER: _TIFFsetString(&td->td_targetprinter, va_arg(ap, char*)); break; #endif #ifdef ICC_SUPPORT case TIFFTAG_ICCPROFILE: td->td_profileLength = (uint32) va_arg(ap, uint32); _TIFFsetByteArray(&td->td_profileData, va_arg(ap, void*), td->td_profileLength); break; #endif #ifdef PHOTOSHOP_SUPPORT case TIFFTAG_PHOTOSHOP: td->td_photoshopLength = (uint32) va_arg(ap, uint32); _TIFFsetByteArray (&td->td_photoshopData, va_arg(ap, void*), td->td_photoshopLength); break; #endif #ifdef IPTC_SUPPORT case TIFFTAG_RICHTIFFIPTC: td->td_richtiffiptcLength = (uint32) va_arg(ap, uint32); #ifdef PHOTOSHOP_SUPPORT _TIFFsetLongArray ((uint32**)&td->td_richtiffiptcData, va_arg(ap, uint32*), td->td_richtiffiptcLength); #else _TIFFsetByteArray (&td->td_photoshopData, va_arg(ap, void*), td->td_photoshopLength); #endif break; #endif default: /* * This can happen if multiple images are open with * different codecs which have private tags. The * global tag information table may then have tags * that are valid for one file but not the other. * If the client tries to set a tag that is not valid * for the image's codec then we'll arrive here. This * happens, for example, when tiffcp is used to convert * between compression schemes and codec-specific tags * are blindly copied. */ TIFFError("TIFFSetField", "%s: Invalid %stag \"%s\" (not supported by codec)", tif->tif_name, isPseudoTag(tag) ? "pseduo-" : "", _TIFFFieldWithTag(tif, tag)->field_name); status = 0; break; } if (status) { TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit); tif->tif_flags |= TIFF_DIRTYDIRECT; } va_end(ap); return (status); badvalue: TIFFError(tif->tif_name, "%d: Bad value for \"%s\"", v, _TIFFFieldWithTag(tif, tag)->field_name); va_end(ap); return (0); badvalue32: TIFFError(tif->tif_name, "%ld: Bad value for \"%s\"", v32, _TIFFFieldWithTag(tif, tag)->field_name); va_end(ap); return (0); badvaluedbl: TIFFError(tif->tif_name, "%f: Bad value for \"%s\"", d, _TIFFFieldWithTag(tif, tag)->field_name); va_end(ap); return (0); } /* * Return 1/0 according to whether or not * it is permissible to set the tag's value. * Note that we allow ImageLength to be changed * so that we can append and extend to images. * Any other tag may not be altered once writing * has commenced, unless its value has no effect * on the format of the data that is written. */ static int OkToChangeTag(TIFF* tif, ttag_t tag) { const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY); if (!fip) { /* unknown tag */ TIFFError("TIFFSetField", "%s: Unknown %stag %u", tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag); return (0); } if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) && !fip->field_oktochange) { /* * Consult info table to see if tag can be changed * after we've started writing. We only allow changes * to those tags that don't/shouldn't affect the * compression and/or format of the data. */ TIFFError("TIFFSetField", "%s: Cannot modify tag \"%s\" while writing", tif->tif_name, fip->field_name); return (0); } return (1); } /* * Record the value of a field in the * internal directory structure. The * field will be written to the file * when/if the directory structure is * updated. */ int TIFFSetField(TIFF* tif, ttag_t tag, ...) { va_list ap; int status; va_start(ap, tag); status = TIFFVSetField(tif, tag, ap); va_end(ap); return (status); } /* * Like TIFFSetField, but taking a varargs * parameter list. This routine is useful * for building higher-level interfaces on * top of the library. */ int TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap) { return OkToChangeTag(tif, tag) ? (*tif->tif_vsetfield)(tif, tag, ap) : 0; } static int _TIFFVGetField(TIFF* tif, ttag_t tag, va_list ap) { TIFFDirectory* td = &tif->tif_dir; switch (tag) { case TIFFTAG_SUBFILETYPE: *va_arg(ap, uint32*) = td->td_subfiletype; break; case TIFFTAG_IMAGEWIDTH: *va_arg(ap, uint32*) = td->td_imagewidth; break; case TIFFTAG_IMAGELENGTH: *va_arg(ap, uint32*) = td->td_imagelength; break; case TIFFTAG_BITSPERSAMPLE: *va_arg(ap, uint16*) = td->td_bitspersample; break; case TIFFTAG_COMPRESSION: *va_arg(ap, uint16*) = td->td_compression; break; case TIFFTAG_PHOTOMETRIC: *va_arg(ap, uint16*) = td->td_photometric; break; case TIFFTAG_THRESHHOLDING: *va_arg(ap, uint16*) = td->td_threshholding; break; case TIFFTAG_FILLORDER: *va_arg(ap, uint16*) = td->td_fillorder; break; case TIFFTAG_DOCUMENTNAME: *va_arg(ap, char**) = td->td_documentname; break; case TIFFTAG_ARTIST: *va_arg(ap, char**) = td->td_artist; break; case TIFFTAG_DATETIME: *va_arg(ap, char**) = td->td_datetime; break; case TIFFTAG_HOSTCOMPUTER: *va_arg(ap, char**) = td->td_hostcomputer; break; case TIFFTAG_IMAGEDESCRIPTION: *va_arg(ap, char**) = td->td_imagedescription; break; case TIFFTAG_MAKE: *va_arg(ap, char**) = td->td_make; break; case TIFFTAG_MODEL: *va_arg(ap, char**) = td->td_model; break; case TIFFTAG_SOFTWARE: *va_arg(ap, char**) = td->td_software; break; case TIFFTAG_COPYRIGHT: *va_arg(ap, char**) = td->td_copyright; break; case TIFFTAG_ORIENTATION: *va_arg(ap, uint16*) = td->td_orientation; break; case TIFFTAG_SAMPLESPERPIXEL: *va_arg(ap, uint16*) = td->td_samplesperpixel; break; case TIFFTAG_ROWSPERSTRIP: *va_arg(ap, uint32*) = td->td_rowsperstrip; break; case TIFFTAG_MINSAMPLEVALUE: *va_arg(ap, uint16*) = td->td_minsamplevalue; break; case TIFFTAG_MAXSAMPLEVALUE: *va_arg(ap, uint16*) = td->td_maxsamplevalue; break; case TIFFTAG_SMINSAMPLEVALUE: *va_arg(ap, double*) = td->td_sminsamplevalue; break; case TIFFTAG_SMAXSAMPLEVALUE: *va_arg(ap, double*) = td->td_smaxsamplevalue; break; case TIFFTAG_XRESOLUTION: *va_arg(ap, float*) = td->td_xresolution; break; case TIFFTAG_YRESOLUTION: *va_arg(ap, float*) = td->td_yresolution; break; case TIFFTAG_PLANARCONFIG: *va_arg(ap, uint16*) = td->td_planarconfig; break; case TIFFTAG_XPOSITION: *va_arg(ap, float*) = td->td_xposition; break; case TIFFTAG_YPOSITION: *va_arg(ap, float*) = td->td_yposition; break; case TIFFTAG_PAGENAME: *va_arg(ap, char**) = td->td_pagename; break; case TIFFTAG_RESOLUTIONUNIT: *va_arg(ap, uint16*) = td->td_resolutionunit; break; case TIFFTAG_PAGENUMBER: *va_arg(ap, uint16*) = td->td_pagenumber[0]; *va_arg(ap, uint16*) = td->td_pagenumber[1]; break; case TIFFTAG_HALFTONEHINTS: *va_arg(ap, uint16*) = td->td_halftonehints[0]; *va_arg(ap, uint16*) = td->td_halftonehints[1]; break; case TIFFTAG_COLORMAP: *va_arg(ap, uint16**) = td->td_colormap[0]; *va_arg(ap, uint16**) = td->td_colormap[1]; *va_arg(ap, uint16**) = td->td_colormap[2]; break; case TIFFTAG_STRIPOFFSETS: case TIFFTAG_TILEOFFSETS: *va_arg(ap, uint32**) = td->td_stripoffset; break; case TIFFTAG_STRIPBYTECOUNTS: case TIFFTAG_TILEBYTECOUNTS: *va_arg(ap, uint32**) = td->td_stripbytecount; break; case TIFFTAG_MATTEING: *va_arg(ap, uint16*) = (td->td_extrasamples == 1 && td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA); break; case TIFFTAG_EXTRASAMPLES: *va_arg(ap, uint16*) = td->td_extrasamples; *va_arg(ap, uint16**) = td->td_sampleinfo; break; case TIFFTAG_TILEWIDTH: *va_arg(ap, uint32*) = td->td_tilewidth; break; case TIFFTAG_TILELENGTH: *va_arg(ap, uint32*) = td->td_tilelength; break; case TIFFTAG_TILEDEPTH: *va_arg(ap, uint32*) = td->td_tiledepth; break; case TIFFTAG_DATATYPE: switch (td->td_sampleformat) { case SAMPLEFORMAT_UINT: *va_arg(ap, uint16*) = DATATYPE_UINT; break; case SAMPLEFORMAT_INT: *va_arg(ap, uint16*) = DATATYPE_INT; break; case SAMPLEFORMAT_IEEEFP: *va_arg(ap, uint16*) = DATATYPE_IEEEFP; break; case SAMPLEFORMAT_VOID: *va_arg(ap, uint16*) = DATATYPE_VOID; break; } break; case TIFFTAG_SAMPLEFORMAT: *va_arg(ap, uint16*) = td->td_sampleformat; break; case TIFFTAG_IMAGEDEPTH: *va_arg(ap, uint32*) = td->td_imagedepth; break; case TIFFTAG_STONITS: *va_arg(ap, double*) = td->td_stonits; break; #if SUBIFD_SUPPORT case TIFFTAG_SUBIFD: *va_arg(ap, uint16*) = td->td_nsubifd; *va_arg(ap, uint32**) = td->td_subifd; break; #endif #ifdef YCBCR_SUPPORT case TIFFTAG_YCBCRCOEFFICIENTS: *va_arg(ap, float**) = td->td_ycbcrcoeffs; break; case TIFFTAG_YCBCRPOSITIONING: *va_arg(ap, uint16*) = td->td_ycbcrpositioning; break; case TIFFTAG_YCBCRSUBSAMPLING: *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[0]; *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1]; break; #endif #ifdef COLORIMETRY_SUPPORT case TIFFTAG_WHITEPOINT: *va_arg(ap, float**) = td->td_whitepoint; break; case TIFFTAG_PRIMARYCHROMATICITIES: *va_arg(ap, float**) = td->td_primarychromas; break; case TIFFTAG_TRANSFERFUNCTION: *va_arg(ap, uint16**) = td->td_transferfunction[0]; if (td->td_samplesperpixel - td->td_extrasamples > 1) { *va_arg(ap, uint16**) = td->td_transferfunction[1]; *va_arg(ap, uint16**) = td->td_transferfunction[2]; } break; case TIFFTAG_REFERENCEBLACKWHITE: *va_arg(ap, float**) = td->td_refblackwhite; break; #endif #ifdef CMYK_SUPPORT case TIFFTAG_INKSET: *va_arg(ap, uint16*) = td->td_inkset; break; case TIFFTAG_DOTRANGE: *va_arg(ap, uint16*) = td->td_dotrange[0]; *va_arg(ap, uint16*) = td->td_dotrange[1]; break; case TIFFTAG_INKNAMES: *va_arg(ap, char**) = td->td_inknames; break; case TIFFTAG_NUMBEROFINKS: *va_arg(ap, uint16*) = td->td_ninks; break; case TIFFTAG_TARGETPRINTER: *va_arg(ap, char**) = td->td_targetprinter; break; #endif #ifdef ICC_SUPPORT case TIFFTAG_ICCPROFILE: *va_arg(ap, uint32*) = td->td_profileLength; *va_arg(ap, void**) = td->td_profileData; break; #endif #ifdef PHOTOSHOP_SUPPORT case TIFFTAG_PHOTOSHOP: *va_arg(ap, uint32*) = td->td_photoshopLength; *va_arg(ap, void**) = td->td_photoshopData; break; #endif #ifdef IPTC_SUPPORT case TIFFTAG_RICHTIFFIPTC: *va_arg(ap, uint32*) = td->td_richtiffiptcLength; *va_arg(ap, void**) = td->td_richtiffiptcData; break; #endif /* Begin Pixar Tags */ case TIFFTAG_PIXAR_IMAGEFULLWIDTH: *va_arg(ap, uint32*) = td->td_imagefullwidth; break; case TIFFTAG_PIXAR_IMAGEFULLLENGTH: *va_arg(ap, uint32*) = td->td_imagefulllength; break; case TIFFTAG_PIXAR_TEXTUREFORMAT: *va_arg(ap, char**) = td->td_textureformat; break; case TIFFTAG_PIXAR_WRAPMODES: *va_arg(ap, char**) = td->td_wrapmodes; break; case TIFFTAG_PIXAR_FOVCOT: *va_arg(ap, float*) = td->td_fovcot; break; case TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN: *va_arg(ap, float**) = td->td_matrixWorldToScreen; break; case TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA: *va_arg(ap, float**) = td->td_matrixWorldToCamera; break; /* End Pixar Tags */ default: /* * This can happen if multiple images are open with * different codecs which have private tags. The * global tag information table may then have tags * that are valid for one file but not the other. * If the client tries to get a tag that is not valid * for the image's codec then we'll arrive here. */ TIFFError("TIFFGetField", "%s: Invalid %stag \"%s\" (not supported by codec)", tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", _TIFFFieldWithTag(tif, tag)->field_name); break; } return (1); } /* * Return the value of a field in the * internal directory structure. */ int TIFFGetField(TIFF* tif, ttag_t tag, ...) { int status; va_list ap; va_start(ap, tag); status = TIFFVGetField(tif, tag, ap); va_end(ap); return (status); } /* * Like TIFFGetField, but taking a varargs * parameter list. This routine is useful * for building higher-level interfaces on * top of the library. */ int TIFFVGetField(TIFF* tif, ttag_t tag, va_list ap) { const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY); return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit)) ? (*tif->tif_vgetfield)(tif, tag, ap) : 0); } #define CleanupField(member) { \ if (td->member) { \ _TIFFfree(td->member); \ td->member = 0; \ } \ } /* * Release storage associated with a directory. */ void TIFFFreeDirectory(TIFF* tif) { register TIFFDirectory *td = &tif->tif_dir; CleanupField(td_colormap[0]); CleanupField(td_colormap[1]); CleanupField(td_colormap[2]); CleanupField(td_documentname); CleanupField(td_artist); CleanupField(td_datetime); CleanupField(td_hostcomputer); CleanupField(td_imagedescription); CleanupField(td_make); CleanupField(td_model); CleanupField(td_software); CleanupField(td_copyright); CleanupField(td_pagename); CleanupField(td_sampleinfo); #if SUBIFD_SUPPORT CleanupField(td_subifd); #endif #ifdef YCBCR_SUPPORT CleanupField(td_ycbcrcoeffs); #endif #ifdef CMYK_SUPPORT CleanupField(td_inknames); CleanupField(td_targetprinter); #endif #ifdef COLORIMETRY_SUPPORT CleanupField(td_whitepoint); CleanupField(td_primarychromas); CleanupField(td_refblackwhite); CleanupField(td_transferfunction[0]); CleanupField(td_transferfunction[1]); CleanupField(td_transferfunction[2]); #endif #ifdef ICC_SUPPORT CleanupField(td_profileData); #endif #ifdef PHOTOSHOP_SUPPORT CleanupField(td_photoshopData); #endif #ifdef IPTC_SUPPORT CleanupField(td_richtiffiptcData); #endif CleanupField(td_stripoffset); CleanupField(td_stripbytecount); /* Begin Pixar Tags */ CleanupField(td_textureformat); CleanupField(td_wrapmodes); CleanupField(td_matrixWorldToScreen); CleanupField(td_matrixWorldToCamera); /* End Pixar Tags */ } #undef CleanupField /* * Client Tag extension support (from Niles Ritter). */ static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL; TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc extender) { TIFFExtendProc prev = _TIFFextender; _TIFFextender = extender; return (prev); } /* * Setup for a new directory. Should we automatically call * TIFFWriteDirectory() if the current one is dirty? * * The newly created directory will not exist on the file till * TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called. */ int TIFFCreateDirectory(TIFF* tif) { TIFFDefaultDirectory(tif); tif->tif_diroff = 0; tif->tif_nextdiroff = 0; tif->tif_curoff = 0; tif->tif_row = (uint32) -1; tif->tif_curstrip = (tstrip_t) -1; return 0; } /* * Setup a default directory structure. */ int TIFFDefaultDirectory(TIFF* tif) { register TIFFDirectory* td = &tif->tif_dir; _TIFFSetupFieldInfo(tif); _TIFFmemset(td, 0, sizeof (*td)); td->td_fillorder = FILLORDER_MSB2LSB; td->td_bitspersample = 1; td->td_threshholding = THRESHHOLD_BILEVEL; td->td_orientation = ORIENTATION_TOPLEFT; td->td_samplesperpixel = 1; td->td_rowsperstrip = (uint32) -1; td->td_tilewidth = (uint32) -1; td->td_tilelength = (uint32) -1; td->td_tiledepth = 1; td->td_resolutionunit = RESUNIT_INCH; td->td_sampleformat = SAMPLEFORMAT_UINT; td->td_imagedepth = 1; #ifdef YCBCR_SUPPORT td->td_ycbcrsubsampling[0] = 2; td->td_ycbcrsubsampling[1] = 2; td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED; #endif #ifdef CMYK_SUPPORT td->td_inkset = INKSET_CMYK; td->td_ninks = 4; #endif tif->tif_postdecode = _TIFFNoPostDecode; tif->tif_vsetfield = _TIFFVSetField; tif->tif_vgetfield = _TIFFVGetField; tif->tif_printdir = NULL; /* * Give client code a chance to install their own * tag extensions & methods, prior to compression overloads. */ if (_TIFFextender) (*_TIFFextender)(tif); (void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); /* * NB: The directory is marked dirty as a result of setting * up the default compression scheme. However, this really * isn't correct -- we want TIFF_DIRTYDIRECT to be set only * if the user does something. We could just do the setup * by hand, but it seems better to use the normal mechanism * (i.e. TIFFSetField). */ tif->tif_flags &= ~TIFF_DIRTYDIRECT; /* * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19 * we clear the ISTILED flag when setting up a new directory. * Should we also be clearing stuff like INSUBIFD? */ tif->tif_flags &= ~TIFF_ISTILED; return (1); } static int TIFFAdvanceDirectory(TIFF* tif, uint32* nextdir, toff_t* off) { static const char module[] = "TIFFAdvanceDirectory"; uint16 dircount; if (isMapped(tif)) { toff_t poff=*nextdir; if (poff+sizeof(uint16) > tif->tif_size) { TIFFError(module, "%s: Error fetching directory count", tif->tif_name); return (0); } _TIFFmemcpy(&dircount, tif->tif_base+poff, sizeof (uint16)); if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); poff+=sizeof (uint16)+dircount*sizeof (TIFFDirEntry); if (off != NULL) *off = poff; if (((toff_t) (poff+sizeof (uint32))) > tif->tif_size) { TIFFError(module, "%s: Error fetching directory link", tif->tif_name); return (0); } _TIFFmemcpy(nextdir, tif->tif_base+poff, sizeof (uint32)); if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(nextdir); return (1); } else { if (!SeekOK(tif, *nextdir) || !ReadOK(tif, &dircount, sizeof (uint16))) { TIFFError(module, "%s: Error fetching directory count", tif->tif_name); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); if (off != NULL) *off = TIFFSeekFile(tif, dircount*sizeof (TIFFDirEntry), SEEK_CUR); else (void) TIFFSeekFile(tif, dircount*sizeof (TIFFDirEntry), SEEK_CUR); if (!ReadOK(tif, nextdir, sizeof (uint32))) { TIFFError(module, "%s: Error fetching directory link", tif->tif_name); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(nextdir); return (1); } } /* * Count the number of directories in a file. */ tdir_t TIFFNumberOfDirectories(TIFF* tif) { toff_t nextdir = tif->tif_header.tiff_diroff; tdir_t n = 0; while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL)) n++; return (n); } /* * Set the n-th directory as the current directory. * NB: Directories are numbered starting at 0. */ int TIFFSetDirectory(TIFF* tif, tdir_t dirn) { toff_t nextdir; tdir_t n; nextdir = tif->tif_header.tiff_diroff; for (n = dirn; n > 0 && nextdir != 0; n--) if (!TIFFAdvanceDirectory(tif, &nextdir, NULL)) return (0); tif->tif_nextdiroff = nextdir; /* * Set curdir to the actual directory index. The * -1 is because TIFFReadDirectory will increment * tif_curdir after successfully reading the directory. */ tif->tif_curdir = (dirn - n) - 1; return (TIFFReadDirectory(tif)); } /* * Set the current directory to be the directory * located at the specified file offset. This interface * is used mainly to access directories linked with * the SubIFD tag (e.g. thumbnail images). */ int TIFFSetSubDirectory(TIFF* tif, uint32 diroff) { tif->tif_nextdiroff = diroff; return (TIFFReadDirectory(tif)); } /* * Return file offset of the current directory. */ uint32 TIFFCurrentDirOffset(TIFF* tif) { return (tif->tif_diroff); } /* * Return an indication of whether or not we are * at the last directory in the file. */ int TIFFLastDirectory(TIFF* tif) { return (tif->tif_nextdiroff == 0); } /* * Unlink the specified directory from the directory chain. */ int TIFFUnlinkDirectory(TIFF* tif, tdir_t dirn) { static const char module[] = "TIFFUnlinkDirectory"; toff_t nextdir; toff_t off; tdir_t n; if (tif->tif_mode == O_RDONLY) { TIFFError(module, "Can not unlink directory in read-only file"); return (0); } /* * Go to the directory before the one we want * to unlink and nab the offset of the link * field we'll need to patch. */ nextdir = tif->tif_header.tiff_diroff; off = sizeof (uint16) + sizeof (uint16); for (n = dirn-1; n > 0; n--) { if (nextdir == 0) { TIFFError(module, "Directory %d does not exist", dirn); return (0); } if (!TIFFAdvanceDirectory(tif, &nextdir, &off)) return (0); } /* * Advance to the directory to be unlinked and fetch * the offset of the directory that follows. */ if (!TIFFAdvanceDirectory(tif, &nextdir, NULL)) return (0); /* * Go back and patch the link field of the preceding * directory to point to the offset of the directory * that follows. */ (void) TIFFSeekFile(tif, off, SEEK_SET); if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextdir); if (!WriteOK(tif, &nextdir, sizeof (uint32))) { TIFFError(module, "Error writing directory link"); return (0); } /* * Leave directory state setup safely. We don't have * facilities for doing inserting and removing directories, * so it's safest to just invalidate everything. This * means that the caller can only append to the directory * chain. */ (*tif->tif_cleanup)(tif); if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; tif->tif_rawcc = 0; } tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE); TIFFFreeDirectory(tif); TIFFDefaultDirectory(tif); tif->tif_diroff = 0; /* force link on next write */ tif->tif_nextdiroff = 0; /* next write must be at end */ tif->tif_curoff = 0; tif->tif_row = (uint32) -1; tif->tif_curstrip = (tstrip_t) -1; return (1); } /* [BFC] * * Author: Bruce Cameron * * Set a table of tags that are to be replaced during directory process by the * 'IGNORE' state - or return TRUE/FALSE for the requested tag such that * 'ReadDirectory' can use the stored information. */ int TIFFReassignTagToIgnore (enum TIFFIgnoreSense task, int TIFFtagID) { static int TIFFignoretags [FIELD_LAST]; static int tagcount = 0 ; int i; /* Loop index */ int j; /* Loop index */ switch (task) { case TIS_STORE: if ( tagcount < (FIELD_LAST - 1) ) { for ( j = 0 ; j < tagcount ; ++j ) { /* Do not add duplicate tag */ if ( TIFFignoretags [j] == TIFFtagID ) return (TRUE) ; } TIFFignoretags [tagcount++] = TIFFtagID ; return (TRUE) ; } break ; case TIS_EXTRACT: for ( i = 0 ; i < tagcount ; ++i ) { if ( TIFFignoretags [i] == TIFFtagID ) return (TRUE) ; } break; case TIS_EMPTY: tagcount = 0 ; /* Clear the list */ return (TRUE) ; default: break; } return (FALSE); } gamera-3.3.3/src/libtiff/tif_dir.h0000644000076500000000000002125110714675674015763 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFDIR_ #define _TIFFDIR_ #if !defined(__GNUC__) #include "tiffcomp.h" #endif /* * ``Library-private'' Directory-related Definitions. */ /* * Internal format of a TIFF directory entry. */ typedef struct { #define FIELD_SETLONGS 3 /* bit vector of fields that are set */ u_long td_fieldsset[FIELD_SETLONGS]; uint32 td_imagewidth, td_imagelength, td_imagedepth; uint32 td_tilewidth, td_tilelength, td_tiledepth; uint32 td_subfiletype; uint16 td_bitspersample; uint16 td_sampleformat; uint16 td_compression; uint16 td_photometric; uint16 td_threshholding; uint16 td_fillorder; uint16 td_orientation; uint16 td_samplesperpixel; uint32 td_rowsperstrip; uint16 td_minsamplevalue, td_maxsamplevalue; double td_sminsamplevalue, td_smaxsamplevalue; float td_xresolution, td_yresolution; uint16 td_resolutionunit; uint16 td_planarconfig; float td_xposition, td_yposition; uint16 td_pagenumber[2]; uint16* td_colormap[3]; uint16 td_halftonehints[2]; uint16 td_extrasamples; uint16* td_sampleinfo; double td_stonits; char* td_documentname; char* td_artist; char* td_datetime; char* td_hostcomputer; char* td_imagedescription; char* td_make; char* td_model; char* td_software; char* td_copyright; char* td_pagename; tstrip_t td_stripsperimage; tstrip_t td_nstrips; /* size of offset & bytecount arrays */ uint32* td_stripoffset; uint32* td_stripbytecount; #if SUBIFD_SUPPORT uint16 td_nsubifd; uint32* td_subifd; #endif #ifdef YCBCR_SUPPORT float* td_ycbcrcoeffs; uint16 td_ycbcrsubsampling[2]; uint16 td_ycbcrpositioning; #endif #ifdef COLORIMETRY_SUPPORT float* td_whitepoint; float* td_primarychromas; float* td_refblackwhite; uint16* td_transferfunction[3]; #endif #ifdef CMYK_SUPPORT uint16 td_inkset; uint16 td_ninks; uint16 td_dotrange[2]; int td_inknameslen; char* td_inknames; char* td_targetprinter; #endif #ifdef ICC_SUPPORT uint32 td_profileLength; void *td_profileData; #endif #ifdef PHOTOSHOP_SUPPORT uint32 td_photoshopLength; void *td_photoshopData; #endif #ifdef IPTC_SUPPORT uint32 td_richtiffiptcLength; void *td_richtiffiptcData; #endif /* Begin Pixar Tag values. */ uint32 td_imagefullwidth, td_imagefulllength; char* td_textureformat; char* td_wrapmodes; float td_fovcot; float* td_matrixWorldToScreen; float* td_matrixWorldToCamera; /* End Pixar Tag Values. */ } TIFFDirectory; /* * Field flags used to indicate fields that have * been set in a directory, and to reference fields * when manipulating a directory. */ /* * FIELD_IGNORE is used to signify tags that are to * be processed but otherwise ignored. This permits * antiquated tags to be quietly read and discarded. * Note that a bit *is* allocated for ignored tags; * this is understood by the directory reading logic * which uses this fact to avoid special-case handling */ #define FIELD_IGNORE 0 /* multi-item fields */ #define FIELD_IMAGEDIMENSIONS 1 #define FIELD_TILEDIMENSIONS 2 #define FIELD_RESOLUTION 3 #define FIELD_POSITION 4 /* single-item fields */ #define FIELD_SUBFILETYPE 5 #define FIELD_BITSPERSAMPLE 6 #define FIELD_COMPRESSION 7 #define FIELD_PHOTOMETRIC 8 #define FIELD_THRESHHOLDING 9 #define FIELD_FILLORDER 10 #define FIELD_DOCUMENTNAME 11 #define FIELD_IMAGEDESCRIPTION 12 #define FIELD_MAKE 13 #define FIELD_MODEL 14 #define FIELD_ORIENTATION 15 #define FIELD_SAMPLESPERPIXEL 16 #define FIELD_ROWSPERSTRIP 17 #define FIELD_MINSAMPLEVALUE 18 #define FIELD_MAXSAMPLEVALUE 19 #define FIELD_PLANARCONFIG 20 #define FIELD_PAGENAME 21 #define FIELD_RESOLUTIONUNIT 22 #define FIELD_PAGENUMBER 23 #define FIELD_STRIPBYTECOUNTS 24 #define FIELD_STRIPOFFSETS 25 #define FIELD_COLORMAP 26 #define FIELD_ARTIST 27 #define FIELD_DATETIME 28 #define FIELD_HOSTCOMPUTER 29 #define FIELD_SOFTWARE 30 #define FIELD_EXTRASAMPLES 31 #define FIELD_SAMPLEFORMAT 32 #define FIELD_SMINSAMPLEVALUE 33 #define FIELD_SMAXSAMPLEVALUE 34 #define FIELD_IMAGEDEPTH 35 #define FIELD_TILEDEPTH 36 #define FIELD_HALFTONEHINTS 37 #define FIELD_YCBCRCOEFFICIENTS 38 #define FIELD_YCBCRSUBSAMPLING 39 #define FIELD_YCBCRPOSITIONING 40 #define FIELD_REFBLACKWHITE 41 #define FIELD_WHITEPOINT 42 #define FIELD_PRIMARYCHROMAS 43 #define FIELD_TRANSFERFUNCTION 44 #define FIELD_INKSET 45 #define FIELD_INKNAMES 46 #define FIELD_DOTRANGE 47 #define FIELD_TARGETPRINTER 48 #define FIELD_SUBIFD 49 #define FIELD_NUMBEROFINKS 50 #define FIELD_ICCPROFILE 51 #define FIELD_PHOTOSHOP 52 #define FIELD_RICHTIFFIPTC 53 #define FIELD_STONITS 54 /* Begin PIXAR */ #define FIELD_IMAGEFULLWIDTH 55 #define FIELD_IMAGEFULLLENGTH 56 #define FIELD_TEXTUREFORMAT 57 #define FIELD_WRAPMODES 58 #define FIELD_FOVCOT 59 #define FIELD_MATRIX_WORLDTOSCREEN 60 #define FIELD_MATRIX_WORLDTOCAMERA 61 #define FIELD_COPYRIGHT 62 /* end of support for well-known tags; codec-private tags follow */ #define FIELD_CODEC 63 /* base of codec-private tags */ /* * Pseudo-tags don't normally need field bits since they * are not written to an output file (by definition). * The library also has express logic to always query a * codec for a pseudo-tag so allocating a field bit for * one is a waste. If codec wants to promote the notion * of a pseudo-tag being ``set'' or ``unset'' then it can * do using internal state flags without polluting the * field bit space defined for real tags. */ #define FIELD_PSEUDO 0 #define FIELD_LAST (32*FIELD_SETLONGS-1) #define TIFFExtractData(tif, type, v) \ ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \ ((v) >> (tif)->tif_typeshift[type]) & (tif)->tif_typemask[type] : \ (v) & (tif)->tif_typemask[type])) #define TIFFInsertData(tif, type, v) \ ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \ ((v) & (tif)->tif_typemask[type]) << (tif)->tif_typeshift[type] : \ (v) & (tif)->tif_typemask[type])) typedef struct { ttag_t field_tag; /* field's tag */ short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */ short field_writecount; /* write count/TIFF_VARIABLE */ TIFFDataType field_type; /* type of associated data */ u_short field_bit; /* bit in fieldsset bit vector */ u_char field_oktochange; /* if true, can change while writing */ u_char field_passcount; /* if true, pass dir count on set */ char *field_name; /* ASCII name */ } TIFFFieldInfo; #define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */ #define TIFF_VARIABLE -1 /* marker for variable length tags */ #define TIFF_SPP -2 /* marker for SamplesPerPixel tags */ #define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */ extern const int tiffDataWidth[]; /* table of tag datatype widths */ #define BITn(n) (((u_long)1L)<<((n)&0x1f)) #define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n)/32]) #define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field)) #define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field)) #define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field)) #define FieldSet(fields, f) (fields[(f)/32] & BITn(f)) #define ResetFieldBit(fields, f) (fields[(f)/32] &= ~BITn(f)) #if defined(__cplusplus) extern "C" { #endif extern void _TIFFSetupFieldInfo(TIFF*); extern void _TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int); extern void _TIFFPrintFieldInfo(TIFF*, FILE*); extern const TIFFFieldInfo* _TIFFFindFieldInfo(TIFF*, ttag_t, TIFFDataType); extern const TIFFFieldInfo* _TIFFFieldWithTag(TIFF*, ttag_t); extern TIFFDataType _TIFFSampleToTagType(TIFF*); #if defined(__cplusplus) } #endif #endif /* _TIFFDIR_ */ gamera-3.3.3/src/libtiff/tif_dirinfo.c0000644000076500000000000003707510714675674016645 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Core Directory Tag Support. */ #include "tiffiop.h" #include /* * NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG. * If a tag can have both LONG and SHORT types * then the LONG must be placed before the SHORT for * writing to work properly. * * NOTE: The second field (field_readcount) and third field (field_writecount) * sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3) * and TIFFTAG_SPP (-2). The macros should be used but would throw off * the formatting of the code, so please interprete the -1, -2 and -3 * values accordingly. */ #ifndef VMS static #endif const TIFFFieldInfo tiffFieldInfo[] = { { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_LONG, FIELD_SUBFILETYPE, TRUE, FALSE, "SubfileType" }, /* XXX SHORT for compatibility w/ old versions of the library */ { TIFFTAG_SUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE, TRUE, FALSE, "SubfileType" }, { TIFFTAG_OSUBFILETYPE, 1, 1, TIFF_SHORT, FIELD_SUBFILETYPE, TRUE, FALSE, "OldSubfileType" }, { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS, FALSE, FALSE, "ImageWidth" }, { TIFFTAG_IMAGEWIDTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS, FALSE, FALSE, "ImageWidth" }, { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_LONG, FIELD_IMAGEDIMENSIONS, TRUE, FALSE, "ImageLength" }, { TIFFTAG_IMAGELENGTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDIMENSIONS, TRUE, FALSE, "ImageLength" }, { TIFFTAG_BITSPERSAMPLE, -1,-1, TIFF_SHORT, FIELD_BITSPERSAMPLE, FALSE, FALSE, "BitsPerSample" }, { TIFFTAG_COMPRESSION, -1, 1, TIFF_SHORT, FIELD_COMPRESSION, FALSE, FALSE, "Compression" }, { TIFFTAG_PHOTOMETRIC, 1, 1, TIFF_SHORT, FIELD_PHOTOMETRIC, FALSE, FALSE, "PhotometricInterpretation" }, { TIFFTAG_THRESHHOLDING, 1, 1, TIFF_SHORT, FIELD_THRESHHOLDING, TRUE, FALSE, "Threshholding" }, { TIFFTAG_CELLWIDTH, 1, 1, TIFF_SHORT, FIELD_IGNORE, TRUE, FALSE, "CellWidth" }, { TIFFTAG_CELLLENGTH, 1, 1, TIFF_SHORT, FIELD_IGNORE, TRUE, FALSE, "CellLength" }, { TIFFTAG_FILLORDER, 1, 1, TIFF_SHORT, FIELD_FILLORDER, FALSE, FALSE, "FillOrder" }, { TIFFTAG_DOCUMENTNAME, -1,-1, TIFF_ASCII, FIELD_DOCUMENTNAME, TRUE, FALSE, "DocumentName" }, { TIFFTAG_IMAGEDESCRIPTION, -1,-1, TIFF_ASCII, FIELD_IMAGEDESCRIPTION, TRUE, FALSE, "ImageDescription" }, { TIFFTAG_MAKE, -1,-1, TIFF_ASCII, FIELD_MAKE, TRUE, FALSE, "Make" }, { TIFFTAG_MODEL, -1,-1, TIFF_ASCII, FIELD_MODEL, TRUE, FALSE, "Model" }, { TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_LONG, FIELD_STRIPOFFSETS, FALSE, FALSE, "StripOffsets" }, { TIFFTAG_STRIPOFFSETS, -1,-1, TIFF_SHORT, FIELD_STRIPOFFSETS, FALSE, FALSE, "StripOffsets" }, { TIFFTAG_ORIENTATION, 1, 1, TIFF_SHORT, FIELD_ORIENTATION, FALSE, FALSE, "Orientation" }, { TIFFTAG_SAMPLESPERPIXEL, 1, 1, TIFF_SHORT, FIELD_SAMPLESPERPIXEL, FALSE, FALSE, "SamplesPerPixel" }, { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_LONG, FIELD_ROWSPERSTRIP, FALSE, FALSE, "RowsPerStrip" }, { TIFFTAG_ROWSPERSTRIP, 1, 1, TIFF_SHORT, FIELD_ROWSPERSTRIP, FALSE, FALSE, "RowsPerStrip" }, { TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_STRIPBYTECOUNTS, FALSE, FALSE, "StripByteCounts" }, { TIFFTAG_STRIPBYTECOUNTS, -1,-1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS, FALSE, FALSE, "StripByteCounts" }, { TIFFTAG_MINSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MINSAMPLEVALUE, TRUE, FALSE, "MinSampleValue" }, { TIFFTAG_MAXSAMPLEVALUE, -2,-1, TIFF_SHORT, FIELD_MAXSAMPLEVALUE, TRUE, FALSE, "MaxSampleValue" }, { TIFFTAG_XRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION, FALSE, FALSE, "XResolution" }, { TIFFTAG_YRESOLUTION, 1, 1, TIFF_RATIONAL, FIELD_RESOLUTION, FALSE, FALSE, "YResolution" }, { TIFFTAG_PLANARCONFIG, 1, 1, TIFF_SHORT, FIELD_PLANARCONFIG, FALSE, FALSE, "PlanarConfiguration" }, { TIFFTAG_PAGENAME, -1,-1, TIFF_ASCII, FIELD_PAGENAME, TRUE, FALSE, "PageName" }, { TIFFTAG_XPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION, TRUE, FALSE, "XPosition" }, { TIFFTAG_YPOSITION, 1, 1, TIFF_RATIONAL, FIELD_POSITION, TRUE, FALSE, "YPosition" }, { TIFFTAG_FREEOFFSETS, -1,-1, TIFF_LONG, FIELD_IGNORE, FALSE, FALSE, "FreeOffsets" }, { TIFFTAG_FREEBYTECOUNTS, -1,-1, TIFF_LONG, FIELD_IGNORE, FALSE, FALSE, "FreeByteCounts" }, { TIFFTAG_GRAYRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE, TRUE, FALSE, "GrayResponseUnit" }, { TIFFTAG_GRAYRESPONSECURVE,-1,-1, TIFF_SHORT, FIELD_IGNORE, TRUE, FALSE, "GrayResponseCurve" }, { TIFFTAG_RESOLUTIONUNIT, 1, 1, TIFF_SHORT, FIELD_RESOLUTIONUNIT, FALSE, FALSE, "ResolutionUnit" }, { TIFFTAG_PAGENUMBER, 2, 2, TIFF_SHORT, FIELD_PAGENUMBER, TRUE, FALSE, "PageNumber" }, { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT, FIELD_IGNORE, TRUE, FALSE, "ColorResponseUnit" }, #ifdef COLORIMETRY_SUPPORT { TIFFTAG_TRANSFERFUNCTION, -1,-1, TIFF_SHORT, FIELD_TRANSFERFUNCTION, TRUE, FALSE, "TransferFunction" }, #endif { TIFFTAG_SOFTWARE, -1,-1, TIFF_ASCII, FIELD_SOFTWARE, TRUE, FALSE, "Software" }, { TIFFTAG_DATETIME, 20,20, TIFF_ASCII, FIELD_DATETIME, TRUE, FALSE, "DateTime" }, { TIFFTAG_ARTIST, -1,-1, TIFF_ASCII, FIELD_ARTIST, TRUE, FALSE, "Artist" }, { TIFFTAG_HOSTCOMPUTER, -1,-1, TIFF_ASCII, FIELD_HOSTCOMPUTER, TRUE, FALSE, "HostComputer" }, #ifdef COLORIMETRY_SUPPORT { TIFFTAG_WHITEPOINT, 2, 2, TIFF_RATIONAL,FIELD_WHITEPOINT, TRUE, FALSE, "WhitePoint" }, { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL,FIELD_PRIMARYCHROMAS, TRUE, FALSE, "PrimaryChromaticities" }, #endif { TIFFTAG_COLORMAP, -1,-1, TIFF_SHORT, FIELD_COLORMAP, TRUE, FALSE, "ColorMap" }, { TIFFTAG_HALFTONEHINTS, 2, 2, TIFF_SHORT, FIELD_HALFTONEHINTS, TRUE, FALSE, "HalftoneHints" }, { TIFFTAG_TILEWIDTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS, FALSE, FALSE, "TileWidth" }, { TIFFTAG_TILEWIDTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS, FALSE, FALSE, "TileWidth" }, { TIFFTAG_TILELENGTH, 1, 1, TIFF_LONG, FIELD_TILEDIMENSIONS, FALSE, FALSE, "TileLength" }, { TIFFTAG_TILELENGTH, 1, 1, TIFF_SHORT, FIELD_TILEDIMENSIONS, FALSE, FALSE, "TileLength" }, { TIFFTAG_TILEOFFSETS, -1, 1, TIFF_LONG, FIELD_STRIPOFFSETS, FALSE, FALSE, "TileOffsets" }, { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_LONG, FIELD_STRIPBYTECOUNTS, FALSE, FALSE, "TileByteCounts" }, { TIFFTAG_TILEBYTECOUNTS, -1, 1, TIFF_SHORT, FIELD_STRIPBYTECOUNTS, FALSE, FALSE, "TileByteCounts" }, #ifdef TIFFTAG_SUBIFD { TIFFTAG_SUBIFD, -1,-1, TIFF_LONG, FIELD_SUBIFD, TRUE, TRUE, "SubIFD" }, #endif #ifdef CMYK_SUPPORT /* 6.0 CMYK tags */ { TIFFTAG_INKSET, 1, 1, TIFF_SHORT, FIELD_INKSET, FALSE, FALSE, "InkSet" }, { TIFFTAG_INKNAMES, -1,-1, TIFF_ASCII, FIELD_INKNAMES, TRUE, TRUE, "InkNames" }, { TIFFTAG_NUMBEROFINKS, 1, 1, TIFF_SHORT, FIELD_NUMBEROFINKS, TRUE, FALSE, "NumberOfInks" }, { TIFFTAG_DOTRANGE, 2, 2, TIFF_SHORT, FIELD_DOTRANGE, FALSE, FALSE, "DotRange" }, { TIFFTAG_DOTRANGE, 2, 2, TIFF_BYTE, FIELD_DOTRANGE, FALSE, FALSE, "DotRange" }, { TIFFTAG_TARGETPRINTER, -1,-1, TIFF_ASCII, FIELD_TARGETPRINTER, TRUE, FALSE, "TargetPrinter" }, #endif { TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_SHORT, FIELD_EXTRASAMPLES, FALSE, FALSE, "ExtraSamples" }, /* XXX for bogus Adobe Photoshop v2.5 files */ { TIFFTAG_EXTRASAMPLES, -1,-1, TIFF_BYTE, FIELD_EXTRASAMPLES, FALSE, FALSE, "ExtraSamples" }, { TIFFTAG_SAMPLEFORMAT, -1,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT, FALSE, FALSE, "SampleFormat" }, { TIFFTAG_SMINSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMINSAMPLEVALUE, TRUE, FALSE, "SMinSampleValue" }, { TIFFTAG_SMAXSAMPLEVALUE, -2,-1, TIFF_ANY, FIELD_SMAXSAMPLEVALUE, TRUE, FALSE, "SMaxSampleValue" }, #ifdef YCBCR_SUPPORT /* 6.0 YCbCr tags */ { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL, FIELD_YCBCRCOEFFICIENTS, FALSE, FALSE, "YCbCrCoefficients" }, { TIFFTAG_YCBCRSUBSAMPLING, 2, 2, TIFF_SHORT, FIELD_YCBCRSUBSAMPLING, FALSE, FALSE, "YCbCrSubsampling" }, { TIFFTAG_YCBCRPOSITIONING, 1, 1, TIFF_SHORT, FIELD_YCBCRPOSITIONING, FALSE, FALSE, "YCbCrPositioning" }, #endif #ifdef COLORIMETRY_SUPPORT { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_RATIONAL, FIELD_REFBLACKWHITE, TRUE, FALSE, "ReferenceBlackWhite" }, /* XXX temporarily accept LONG for backwards compatibility */ { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_LONG, FIELD_REFBLACKWHITE, TRUE, FALSE, "ReferenceBlackWhite" }, #endif /* begin SGI tags */ { TIFFTAG_MATTEING, 1, 1, TIFF_SHORT, FIELD_EXTRASAMPLES, FALSE, FALSE, "Matteing" }, { TIFFTAG_DATATYPE, -2,-1, TIFF_SHORT, FIELD_SAMPLEFORMAT, FALSE, FALSE, "DataType" }, { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_LONG, FIELD_IMAGEDEPTH, FALSE, FALSE, "ImageDepth" }, { TIFFTAG_IMAGEDEPTH, 1, 1, TIFF_SHORT, FIELD_IMAGEDEPTH, FALSE, FALSE, "ImageDepth" }, { TIFFTAG_TILEDEPTH, 1, 1, TIFF_LONG, FIELD_TILEDEPTH, FALSE, FALSE, "TileDepth" }, { TIFFTAG_TILEDEPTH, 1, 1, TIFF_SHORT, FIELD_TILEDEPTH, FALSE, FALSE, "TileDepth" }, /* end SGI tags */ /* begin Pixar tags */ { TIFFTAG_PIXAR_IMAGEFULLWIDTH, 1, 1, TIFF_LONG, FIELD_IMAGEFULLWIDTH, TRUE, FALSE, "ImageFullWidth" }, { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG, FIELD_IMAGEFULLLENGTH, TRUE, FALSE, "ImageFullLength" }, { TIFFTAG_PIXAR_TEXTUREFORMAT, -1,-1, TIFF_ASCII, FIELD_TEXTUREFORMAT, TRUE, FALSE, "TextureFormat" }, { TIFFTAG_PIXAR_WRAPMODES, -1,-1, TIFF_ASCII, FIELD_WRAPMODES, TRUE, FALSE, "TextureWrapModes" }, { TIFFTAG_PIXAR_FOVCOT, 1, 1, TIFF_FLOAT, FIELD_FOVCOT, TRUE, FALSE, "FieldOfViewCotan" }, { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN, 16,16, TIFF_FLOAT, FIELD_MATRIX_WORLDTOSCREEN, TRUE, FALSE, "MatrixWorldToScreen" }, { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA, 16,16, TIFF_FLOAT, FIELD_MATRIX_WORLDTOCAMERA, TRUE, FALSE, "MatrixWorldToCamera" }, { TIFFTAG_COPYRIGHT, -1,-1, TIFF_ASCII, FIELD_COPYRIGHT, TRUE, FALSE, "Copyright" }, /* end Pixar tags */ #ifdef IPTC_SUPPORT #ifdef PHOTOSHOP_SUPPORT { TIFFTAG_RICHTIFFIPTC, -1,-1, TIFF_LONG, FIELD_RICHTIFFIPTC, FALSE, TRUE, "RichTIFFIPTC" }, #else { TIFFTAG_RICHTIFFIPTC, -1,-3, TIFF_UNDEFINED, FIELD_RICHTIFFIPTC, FALSE, TRUE, "RichTIFFIPTC" }, #endif #endif #ifdef PHOTOSHOP_SUPPORT { TIFFTAG_PHOTOSHOP, -1,-3, TIFF_BYTE, FIELD_PHOTOSHOP, FALSE, TRUE, "Photoshop" }, #endif #ifdef ICC_SUPPORT { TIFFTAG_ICCPROFILE, -1,-3, TIFF_UNDEFINED, FIELD_ICCPROFILE, FALSE, TRUE, "ICC Profile" }, #endif { TIFFTAG_STONITS, 1, 1, TIFF_DOUBLE, FIELD_STONITS, FALSE, FALSE, "StoNits" }, }; #define N(a) (sizeof (a) / sizeof (a[0])) void _TIFFSetupFieldInfo(TIFF* tif) { if (tif->tif_fieldinfo) { _TIFFfree(tif->tif_fieldinfo); tif->tif_nfields = 0; } _TIFFMergeFieldInfo(tif, tiffFieldInfo, N(tiffFieldInfo)); } static int tagCompare(const void* a, const void* b) { const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a; const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b; /* NB: be careful of return values for 16-bit platforms */ if (ta->field_tag != tb->field_tag) return (ta->field_tag < tb->field_tag ? -1 : 1); else return (tb->field_type < ta->field_type ? -1 : 1); } void _TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n) { TIFFFieldInfo** tp; int i; if (tif->tif_nfields > 0) { tif->tif_fieldinfo = (TIFFFieldInfo**) _TIFFrealloc(tif->tif_fieldinfo, (tif->tif_nfields+n) * sizeof (TIFFFieldInfo*)); } else { tif->tif_fieldinfo = (TIFFFieldInfo**) _TIFFmalloc(n * sizeof (TIFFFieldInfo*)); } tp = &tif->tif_fieldinfo[tif->tif_nfields]; for (i = 0; i < n; i++) tp[i] = (TIFFFieldInfo*) &info[i]; /* XXX */ /* * NB: the core tags are presumed sorted correctly. */ if (tif->tif_nfields > 0) qsort(tif->tif_fieldinfo, (size_t) (tif->tif_nfields += n), sizeof (TIFFFieldInfo*), tagCompare); else tif->tif_nfields += n; } void _TIFFPrintFieldInfo(TIFF* tif, FILE* fd) { int i; fprintf(fd, "%s: \n", tif->tif_name); for (i = 0; i < tif->tif_nfields; i++) { const TIFFFieldInfo* fip = tif->tif_fieldinfo[i]; fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n" , i , (unsigned long) fip->field_tag , fip->field_readcount, fip->field_writecount , fip->field_type , fip->field_bit , fip->field_oktochange ? "TRUE" : "FALSE" , fip->field_passcount ? "TRUE" : "FALSE" , fip->field_name ); } } const int tiffDataWidth[] = { 1, /* nothing */ 1, /* TIFF_BYTE */ 1, /* TIFF_ASCII */ 2, /* TIFF_SHORT */ 4, /* TIFF_LONG */ 8, /* TIFF_RATIONAL */ 1, /* TIFF_SBYTE */ 1, /* TIFF_UNDEFINED */ 2, /* TIFF_SSHORT */ 4, /* TIFF_SLONG */ 8, /* TIFF_SRATIONAL */ 4, /* TIFF_FLOAT */ 8, /* TIFF_DOUBLE */ }; /* * Return nearest TIFFDataType to the sample type of an image. */ TIFFDataType _TIFFSampleToTagType(TIFF* tif) { int bps = (int) TIFFhowmany(tif->tif_dir.td_bitspersample, 8); switch (tif->tif_dir.td_sampleformat) { case SAMPLEFORMAT_IEEEFP: return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE); case SAMPLEFORMAT_INT: return (bps <= 1 ? TIFF_SBYTE : bps <= 2 ? TIFF_SSHORT : TIFF_SLONG); case SAMPLEFORMAT_UINT: return (bps <= 1 ? TIFF_BYTE : bps <= 2 ? TIFF_SHORT : TIFF_LONG); case SAMPLEFORMAT_VOID: return (TIFF_UNDEFINED); } /*NOTREACHED*/ return (TIFF_UNDEFINED); } const TIFFFieldInfo* _TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt) { static const TIFFFieldInfo *last = NULL; int i, n; if (last && last->field_tag == tag && (dt == TIFF_ANY || dt == last->field_type)) return (last); /* NB: if table gets big, use sorted search (e.g. binary search) */ for (i = 0, n = tif->tif_nfields; i < n; i++) { const TIFFFieldInfo* fip = tif->tif_fieldinfo[i]; if (fip->field_tag == tag && (dt == TIFF_ANY || fip->field_type == dt)) return (last = fip); } return ((const TIFFFieldInfo *)0); } #include #include const TIFFFieldInfo* _TIFFFieldWithTag(TIFF* tif, ttag_t tag) { const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY); if (!fip) { TIFFError("TIFFFieldWithTag", "Internal error, unknown tag 0x%x", (u_int) tag); assert(fip != NULL); /*NOTREACHED*/ } return (fip); } gamera-3.3.3/src/libtiff/tif_dirread.c0000644000076500000000000011352710714675674016622 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Directory Read Support Routines. */ #include "tiffiop.h" #define IGNORE 0 /* tag placeholder used below */ #if HAVE_IEEEFP #define TIFFCvtIEEEFloatToNative(tif, n, fp) #define TIFFCvtIEEEDoubleToNative(tif, n, dp) #else extern void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*); extern void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*); #endif static void EstimateStripByteCounts(TIFF*, TIFFDirEntry*, uint16); static void MissingRequired(TIFF*, const char*); static int CheckDirCount(TIFF*, TIFFDirEntry*, uint32); static tsize_t TIFFFetchData(TIFF*, TIFFDirEntry*, char*); static tsize_t TIFFFetchString(TIFF*, TIFFDirEntry*, char*); static float TIFFFetchRational(TIFF*, TIFFDirEntry*); static int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*); static int TIFFFetchPerSampleShorts(TIFF*, TIFFDirEntry*, int*); static int TIFFFetchPerSampleAnys(TIFF*, TIFFDirEntry*, double*); static int TIFFFetchShortArray(TIFF*, TIFFDirEntry*, uint16*); static int TIFFFetchStripThing(TIFF*, TIFFDirEntry*, long, uint32**); static int TIFFFetchExtraSamples(TIFF*, TIFFDirEntry*); static int TIFFFetchRefBlackWhite(TIFF*, TIFFDirEntry*); static float TIFFFetchFloat(TIFF*, TIFFDirEntry*); static int TIFFFetchFloatArray(TIFF*, TIFFDirEntry*, float*); static int TIFFFetchDoubleArray(TIFF*, TIFFDirEntry*, double*); static int TIFFFetchAnyArray(TIFF*, TIFFDirEntry*, double*); static int TIFFFetchShortPair(TIFF*, TIFFDirEntry*); static void ChopUpSingleUncompressedStrip(TIFF*); static char * CheckMalloc(TIFF* tif, tsize_t n, const char* what) { char *cp = (char*)_TIFFmalloc(n); if (cp == NULL) TIFFError(tif->tif_name, "No space %s", what); return (cp); } /* * Read the next TIFF directory from a file * and convert it to the internal format. * We read directories sequentially. */ int TIFFReadDirectory(TIFF* tif) { register TIFFDirEntry* dp; register int n; register TIFFDirectory* td; TIFFDirEntry* dir; int iv; long v; double dv; const TIFFFieldInfo* fip; int fix; uint16 dircount; toff_t nextdiroff; char* cp; int diroutoforderwarning = 0; tif->tif_diroff = tif->tif_nextdiroff; if (tif->tif_diroff == 0) /* no more directories */ return (0); /* * Cleanup any previous compression state. */ (*tif->tif_cleanup)(tif); tif->tif_curdir++; nextdiroff = 0; if (!isMapped(tif)) { if (!SeekOK(tif, tif->tif_diroff)) { TIFFError(tif->tif_name, "Seek error accessing TIFF directory"); return (0); } if (!ReadOK(tif, &dircount, sizeof (uint16))) { TIFFError(tif->tif_name, "Can not read TIFF directory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); dir = (TIFFDirEntry *)CheckMalloc(tif, dircount * sizeof (TIFFDirEntry), "to read TIFF directory"); if (dir == NULL) return (0); if (!ReadOK(tif, dir, dircount*sizeof (TIFFDirEntry))) { TIFFError(tif->tif_name, "Can not read TIFF directory"); goto bad; } /* * Read offset to next directory for sequential scans. */ (void) ReadOK(tif, &nextdiroff, sizeof (uint32)); } else { toff_t off = tif->tif_diroff; if (off + sizeof (uint16) > tif->tif_size) { TIFFError(tif->tif_name, "Can not read TIFF directory count"); return (0); } else _TIFFmemcpy(&dircount, tif->tif_base + off, sizeof (uint16)); off += sizeof (uint16); if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); dir = (TIFFDirEntry *)CheckMalloc(tif, dircount * sizeof (TIFFDirEntry), "to read TIFF directory"); if (dir == NULL) return (0); if (off + dircount*sizeof (TIFFDirEntry) > tif->tif_size) { TIFFError(tif->tif_name, "Can not read TIFF directory"); goto bad; } else _TIFFmemcpy(dir, tif->tif_base + off, dircount*sizeof (TIFFDirEntry)); off += dircount* sizeof (TIFFDirEntry); if (off + sizeof (uint32) <= tif->tif_size) _TIFFmemcpy(&nextdiroff, tif->tif_base+off, sizeof (uint32)); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextdiroff); tif->tif_nextdiroff = nextdiroff; tif->tif_flags &= ~TIFF_BEENWRITING; /* reset before new dir */ /* * Setup default value and then make a pass over * the fields to check type and tag information, * and to extract info required to size data * structures. A second pass is made afterwards * to read in everthing not taken in the first pass. */ td = &tif->tif_dir; /* free any old stuff and reinit */ TIFFFreeDirectory(tif); TIFFDefaultDirectory(tif); /* * Electronic Arts writes gray-scale TIFF files * without a PlanarConfiguration directory entry. * Thus we setup a default value here, even though * the TIFF spec says there is no default value. */ TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); /* * Sigh, we must make a separate pass through the * directory for the following reason: * * We must process the Compression tag in the first pass * in order to merge in codec-private tag definitions (otherwise * we may get complaints about unknown tags). However, the * Compression tag may be dependent on the SamplesPerPixel * tag value because older TIFF specs permited Compression * to be written as a SamplesPerPixel-count tag entry. * Thus if we don't first figure out the correct SamplesPerPixel * tag value then we may end up ignoring the Compression tag * value because it has an incorrect count value (if the * true value of SamplesPerPixel is not 1). * * It sure would have been nice if Aldus had really thought * this stuff through carefully. */ for (dp = dir, n = dircount; n > 0; n--, dp++) { if (tif->tif_flags & TIFF_SWAB) { TIFFSwabArrayOfShort(&dp->tdir_tag, 2); TIFFSwabArrayOfLong(&dp->tdir_count, 2); } if (dp->tdir_tag == TIFFTAG_SAMPLESPERPIXEL) { if (!TIFFFetchNormalTag(tif, dp)) goto bad; dp->tdir_tag = IGNORE; } } /* * First real pass over the directory. */ fix = 0; for (dp = dir, n = dircount; n > 0; n--, dp++) { /* * Find the field information entry for this tag. * Added check for tags to ignore ... [BFC] */ if( TIFFReassignTagToIgnore(TIS_EXTRACT, dp->tdir_tag) ) dp->tdir_tag = IGNORE; if (dp->tdir_tag == IGNORE) continue; /* * Silicon Beach (at least) writes unordered * directory tags (violating the spec). Handle * it here, but be obnoxious (maybe they'll fix it?). */ if (dp->tdir_tag < tif->tif_fieldinfo[fix]->field_tag) { if (!diroutoforderwarning) { TIFFWarning(tif->tif_name, "invalid TIFF directory; tags are not sorted in ascending order"); diroutoforderwarning = 1; } fix = 0; /* O(n^2) */ } while (fix < tif->tif_nfields && tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag) fix++; if (fix == tif->tif_nfields || tif->tif_fieldinfo[fix]->field_tag != dp->tdir_tag) { TIFFWarning(tif->tif_name, "unknown field with tag %d (0x%x) ignored", dp->tdir_tag, dp->tdir_tag); dp->tdir_tag = IGNORE; fix = 0; /* restart search */ continue; } /* * Null out old tags that we ignore. */ if (tif->tif_fieldinfo[fix]->field_bit == FIELD_IGNORE) { ignore: dp->tdir_tag = IGNORE; continue; } /* * Check data type. */ fip = tif->tif_fieldinfo[fix]; while (dp->tdir_type != (u_short) fip->field_type) { if (fip->field_type == TIFF_ANY) /* wildcard */ break; fip++, fix++; if (fix == tif->tif_nfields || fip->field_tag != dp->tdir_tag) { TIFFWarning(tif->tif_name, "wrong data type %d for \"%s\"; tag ignored", dp->tdir_type, fip[-1].field_name); goto ignore; } } /* * Check count if known in advance. */ if (fip->field_readcount != TIFF_VARIABLE) { uint32 expected = (fip->field_readcount == TIFF_SPP) ? (uint32) td->td_samplesperpixel : (uint32) fip->field_readcount; if (!CheckDirCount(tif, dp, expected)) goto ignore; } switch (dp->tdir_tag) { case TIFFTAG_COMPRESSION: /* * The 5.0 spec says the Compression tag has * one value, while earlier specs say it has * one value per sample. Because of this, we * accept the tag if one value is supplied. */ if (dp->tdir_count == 1) { v = TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset); if (!TIFFSetField(tif, dp->tdir_tag, (int)v)) goto bad; break; } if (!TIFFFetchPerSampleShorts(tif, dp, &iv) || !TIFFSetField(tif, dp->tdir_tag, iv)) goto bad; dp->tdir_tag = IGNORE; break; case TIFFTAG_STRIPOFFSETS: case TIFFTAG_STRIPBYTECOUNTS: case TIFFTAG_TILEOFFSETS: case TIFFTAG_TILEBYTECOUNTS: TIFFSetFieldBit(tif, fip->field_bit); break; case TIFFTAG_IMAGEWIDTH: case TIFFTAG_IMAGELENGTH: case TIFFTAG_IMAGEDEPTH: case TIFFTAG_TILELENGTH: case TIFFTAG_TILEWIDTH: case TIFFTAG_TILEDEPTH: case TIFFTAG_PLANARCONFIG: case TIFFTAG_ROWSPERSTRIP: if (!TIFFFetchNormalTag(tif, dp)) goto bad; dp->tdir_tag = IGNORE; break; case TIFFTAG_EXTRASAMPLES: (void) TIFFFetchExtraSamples(tif, dp); dp->tdir_tag = IGNORE; break; } } /* * Allocate directory structure and setup defaults. */ if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) { MissingRequired(tif, "ImageLength"); goto bad; } if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) { MissingRequired(tif, "PlanarConfiguration"); goto bad; } /* * Setup appropriate structures (by strip or by tile) */ if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) { td->td_nstrips = TIFFNumberOfStrips(tif); td->td_tilewidth = td->td_imagewidth; td->td_tilelength = td->td_rowsperstrip; td->td_tiledepth = td->td_imagedepth; tif->tif_flags &= ~TIFF_ISTILED; } else { td->td_nstrips = TIFFNumberOfTiles(tif); tif->tif_flags |= TIFF_ISTILED; } td->td_stripsperimage = td->td_nstrips; if (td->td_planarconfig == PLANARCONFIG_SEPARATE) td->td_stripsperimage /= td->td_samplesperpixel; if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) { MissingRequired(tif, isTiled(tif) ? "TileOffsets" : "StripOffsets"); goto bad; } /* * Second pass: extract other information. */ for (dp = dir, n = dircount; n > 0; n--, dp++) { if (dp->tdir_tag == IGNORE) continue; switch (dp->tdir_tag) { case TIFFTAG_MINSAMPLEVALUE: case TIFFTAG_MAXSAMPLEVALUE: case TIFFTAG_BITSPERSAMPLE: /* * The 5.0 spec says the Compression tag has * one value, while earlier specs say it has * one value per sample. Because of this, we * accept the tag if one value is supplied. * * The MinSampleValue, MaxSampleValue and * BitsPerSample tags are supposed to be written * as one value/sample, but some vendors incorrectly * write one value only -- so we accept that * as well (yech). */ if (dp->tdir_count == 1) { v = TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset); if (!TIFFSetField(tif, dp->tdir_tag, (int)v)) goto bad; break; } /* fall thru... */ case TIFFTAG_DATATYPE: case TIFFTAG_SAMPLEFORMAT: if (!TIFFFetchPerSampleShorts(tif, dp, &iv) || !TIFFSetField(tif, dp->tdir_tag, iv)) goto bad; break; case TIFFTAG_SMINSAMPLEVALUE: case TIFFTAG_SMAXSAMPLEVALUE: if (!TIFFFetchPerSampleAnys(tif, dp, &dv) || !TIFFSetField(tif, dp->tdir_tag, dv)) goto bad; break; case TIFFTAG_STRIPOFFSETS: case TIFFTAG_TILEOFFSETS: if (!TIFFFetchStripThing(tif, dp, td->td_nstrips, &td->td_stripoffset)) goto bad; break; case TIFFTAG_STRIPBYTECOUNTS: case TIFFTAG_TILEBYTECOUNTS: if (!TIFFFetchStripThing(tif, dp, td->td_nstrips, &td->td_stripbytecount)) goto bad; break; case TIFFTAG_COLORMAP: case TIFFTAG_TRANSFERFUNCTION: /* * TransferFunction can have either 1x or 3x data * values; Colormap can have only 3x items. */ v = 1L<td_bitspersample; if (dp->tdir_tag == TIFFTAG_COLORMAP || dp->tdir_count != (uint32) v) { if (!CheckDirCount(tif, dp, (uint32)(3*v))) break; } v *= sizeof (uint16); cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint16), "to read \"TransferFunction\" tag"); if (cp != NULL) { if (TIFFFetchData(tif, dp, cp)) { /* * This deals with there being only * one array to apply to all samples. */ uint32 c = (uint32)1 << td->td_bitspersample; if (dp->tdir_count == c) v = 0; TIFFSetField(tif, dp->tdir_tag, cp, cp+v, cp+2*v); } _TIFFfree(cp); } break; case TIFFTAG_PAGENUMBER: case TIFFTAG_HALFTONEHINTS: case TIFFTAG_YCBCRSUBSAMPLING: case TIFFTAG_DOTRANGE: (void) TIFFFetchShortPair(tif, dp); break; #ifdef COLORIMETRY_SUPPORT case TIFFTAG_REFERENCEBLACKWHITE: (void) TIFFFetchRefBlackWhite(tif, dp); break; #endif /* BEGIN REV 4.0 COMPATIBILITY */ case TIFFTAG_OSUBFILETYPE: v = 0; switch (TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset)) { case OFILETYPE_REDUCEDIMAGE: v = FILETYPE_REDUCEDIMAGE; break; case OFILETYPE_PAGE: v = FILETYPE_PAGE; break; } if (v) (void) TIFFSetField(tif, TIFFTAG_SUBFILETYPE, (int)v); break; /* END REV 4.0 COMPATIBILITY */ default: (void) TIFFFetchNormalTag(tif, dp); break; } } /* * Verify Palette image has a Colormap. */ if (td->td_photometric == PHOTOMETRIC_PALETTE && !TIFFFieldSet(tif, FIELD_COLORMAP)) { MissingRequired(tif, "Colormap"); goto bad; } /* * Attempt to deal with a missing StripByteCounts tag. */ if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) { /* * Some manufacturers violate the spec by not giving * the size of the strips. In this case, assume there * is one uncompressed strip of data. */ if ((td->td_planarconfig == PLANARCONFIG_CONTIG && td->td_nstrips > 1) || (td->td_planarconfig == PLANARCONFIG_SEPARATE && td->td_nstrips != td->td_samplesperpixel)) { MissingRequired(tif, "StripByteCounts"); goto bad; } TIFFWarning(tif->tif_name, "TIFF directory is missing required \"%s\" field, calculating from imagelength", _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name); EstimateStripByteCounts(tif, dir, dircount); #define BYTECOUNTLOOKSBAD \ ((td->td_stripbytecount[0] == 0 && td->td_stripoffset[0] != 0) || \ (td->td_compression == COMPRESSION_NONE && \ td->td_stripbytecount[0] > TIFFGetFileSize(tif) - td->td_stripoffset[0])) } else if (td->td_nstrips == 1 && BYTECOUNTLOOKSBAD) { /* * Plexus (and others) sometimes give a value * of zero for a tag when they don't know what * the correct value is! Try and handle the * simple case of estimating the size of a one * strip image. */ TIFFWarning(tif->tif_name, "Bogus \"%s\" field, ignoring and calculating from imagelength", _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name); EstimateStripByteCounts(tif, dir, dircount); } if (dir) _TIFFfree((char *)dir); if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE)) td->td_maxsamplevalue = (uint16)((1L<td_bitspersample)-1); /* * Setup default compression scheme. */ if (!TIFFFieldSet(tif, FIELD_COMPRESSION)) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); /* * Some manufacturers make life difficult by writing * large amounts of uncompressed data as a single strip. * This is contrary to the recommendations of the spec. * The following makes an attempt at breaking such images * into strips closer to the recommended 8k bytes. A * side effect, however, is that the RowsPerStrip tag * value may be changed. */ if (td->td_nstrips == 1 && td->td_compression == COMPRESSION_NONE && (tif->tif_flags & (TIFF_STRIPCHOP|TIFF_ISTILED)) == TIFF_STRIPCHOP) ChopUpSingleUncompressedStrip(tif); /* * Reinitialize i/o since we are starting on a new directory. */ tif->tif_row = (uint32) -1; tif->tif_curstrip = (tstrip_t) -1; tif->tif_col = (uint32) -1; tif->tif_curtile = (ttile_t) -1; tif->tif_tilesize = TIFFTileSize(tif); tif->tif_scanlinesize = TIFFScanlineSize(tif); return (1); bad: if (dir) _TIFFfree(dir); return (0); } static void EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount) { register TIFFDirEntry *dp; register TIFFDirectory *td = &tif->tif_dir; uint16 i; if (td->td_stripbytecount) _TIFFfree(td->td_stripbytecount); td->td_stripbytecount = (uint32*) CheckMalloc(tif, td->td_nstrips * sizeof (uint32), "for \"StripByteCounts\" array"); if (td->td_compression != COMPRESSION_NONE) { uint32 space = (uint32)(sizeof (TIFFHeader) + sizeof (uint16) + (dircount * sizeof (TIFFDirEntry)) + sizeof (uint32)); toff_t filesize = TIFFGetFileSize(tif); uint16 n; /* calculate amount of space used by indirect values */ for (dp = dir, n = dircount; n > 0; n--, dp++) { uint32 cc = dp->tdir_count*tiffDataWidth[dp->tdir_type]; if (cc > sizeof (uint32)) space += cc; } space = filesize - space; if (td->td_planarconfig == PLANARCONFIG_SEPARATE) space /= td->td_samplesperpixel; for (i = 0; i < td->td_nstrips; i++) td->td_stripbytecount[i] = space; /* * This gross hack handles the case were the offset to * the last strip is past the place where we think the strip * should begin. Since a strip of data must be contiguous, * it's safe to assume that we've overestimated the amount * of data in the strip and trim this number back accordingly. */ i--; if (((toff_t)(td->td_stripoffset[i]+td->td_stripbytecount[i])) > filesize) td->td_stripbytecount[i] = filesize - td->td_stripoffset[i]; } else { uint32 rowbytes = TIFFScanlineSize(tif); uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage; for (i = 0; i < td->td_nstrips; i++) td->td_stripbytecount[i] = rowbytes*rowsperstrip; } TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS); if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP)) td->td_rowsperstrip = td->td_imagelength; } static void MissingRequired(TIFF* tif, const char* tagname) { TIFFError(tif->tif_name, "TIFF directory is missing required \"%s\" field", tagname); } /* * Check the count field of a directory * entry against a known value. The caller * is expected to skip/ignore the tag if * there is a mismatch. */ static int CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count) { if (count != dir->tdir_count) { TIFFWarning(tif->tif_name, "incorrect count for field \"%s\" (%lu, expecting %lu); tag ignored", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, dir->tdir_count, count); return (0); } return (1); } /* * Fetch a contiguous directory item. */ static tsize_t TIFFFetchData(TIFF* tif, TIFFDirEntry* dir, char* cp) { int w = tiffDataWidth[dir->tdir_type]; tsize_t cc = dir->tdir_count * w; if (!isMapped(tif)) { if (!SeekOK(tif, dir->tdir_offset)) goto bad; if (!ReadOK(tif, cp, cc)) goto bad; } else { if (dir->tdir_offset + cc > tif->tif_size) goto bad; _TIFFmemcpy(cp, tif->tif_base + dir->tdir_offset, cc); } if (tif->tif_flags & TIFF_SWAB) { switch (dir->tdir_type) { case TIFF_SHORT: case TIFF_SSHORT: TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count); break; case TIFF_LONG: case TIFF_SLONG: case TIFF_FLOAT: TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count); break; case TIFF_DOUBLE: TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count); break; } } return (cc); bad: TIFFError(tif->tif_name, "Error fetching data for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); return ((tsize_t) 0); } /* * Fetch an ASCII item from the file. */ static tsize_t TIFFFetchString(TIFF* tif, TIFFDirEntry* dir, char* cp) { if (dir->tdir_count <= 4) { uint32 l = dir->tdir_offset; if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&l); _TIFFmemcpy(cp, &l, dir->tdir_count); return (1); } return (TIFFFetchData(tif, dir, cp)); } /* * Convert numerator+denominator to float. */ static int cvtRational(TIFF* tif, TIFFDirEntry* dir, uint32 num, uint32 denom, float* rv) { if (denom == 0) { TIFFError(tif->tif_name, "%s: Rational with zero denominator (num = %lu)", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, num); return (0); } else { if (dir->tdir_type == TIFF_RATIONAL) *rv = ((float)num / (float)denom); else *rv = ((float)(int32)num / (float)(int32)denom); return (1); } } /* * Fetch a rational item from the file * at offset off and return the value * as a floating point number. */ static float TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir) { uint32 l[2]; float v; return (!TIFFFetchData(tif, dir, (char *)l) || !cvtRational(tif, dir, l[0], l[1], &v) ? 1.0f : v); } /* * Fetch a single floating point value * from the offset field and return it * as a native float. */ static float TIFFFetchFloat(TIFF* tif, TIFFDirEntry* dir) { long l = TIFFExtractData(tif, dir->tdir_type, dir->tdir_offset); float v = *(float*) &l; TIFFCvtIEEEFloatToNative(tif, 1, &v); return (v); } /* * Fetch an array of BYTE or SBYTE values. */ static int TIFFFetchByteArray(TIFF* tif, TIFFDirEntry* dir, uint16* v) { if (dir->tdir_count <= 4) { /* * Extract data from offset field. */ if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { switch (dir->tdir_count) { case 4: v[3] = (uint16)(dir->tdir_offset & 0xff); case 3: v[2] = (uint16)((dir->tdir_offset >> 8) & 0xff); case 2: v[1] = (uint16)((dir->tdir_offset >> 16) & 0xff); case 1: v[0] = (uint16)(dir->tdir_offset >> 24); } } else { switch (dir->tdir_count) { case 4: v[3] = (uint16)(dir->tdir_offset >> 24); case 3: v[2] = (uint16)((dir->tdir_offset >> 16) & 0xff); case 2: v[1] = (uint16)((dir->tdir_offset >> 8) & 0xff); case 1: v[0] = (uint16)(dir->tdir_offset & 0xff); } } return (1); } else return (TIFFFetchData(tif, dir, (char*) v) != 0); /* XXX */ } /* * Fetch an array of SHORT or SSHORT values. */ static int TIFFFetchShortArray(TIFF* tif, TIFFDirEntry* dir, uint16* v) { if (dir->tdir_count <= 2) { if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { switch (dir->tdir_count) { case 2: v[1] = (uint16) (dir->tdir_offset & 0xffff); case 1: v[0] = (uint16) (dir->tdir_offset >> 16); } } else { switch (dir->tdir_count) { case 2: v[1] = (uint16) (dir->tdir_offset >> 16); case 1: v[0] = (uint16) (dir->tdir_offset & 0xffff); } } return (1); } else return (TIFFFetchData(tif, dir, (char *)v) != 0); } /* * Fetch a pair of SHORT or BYTE values. */ static int TIFFFetchShortPair(TIFF* tif, TIFFDirEntry* dir) { uint16 v[2]; int ok = 0; switch (dir->tdir_type) { case TIFF_SHORT: case TIFF_SSHORT: ok = TIFFFetchShortArray(tif, dir, v); break; case TIFF_BYTE: case TIFF_SBYTE: ok = TIFFFetchByteArray(tif, dir, v); break; } if (ok) TIFFSetField(tif, dir->tdir_tag, v[0], v[1]); return (ok); } /* * Fetch an array of LONG or SLONG values. */ static int TIFFFetchLongArray(TIFF* tif, TIFFDirEntry* dir, uint32* v) { if (dir->tdir_count == 1) { v[0] = dir->tdir_offset; return (1); } else return (TIFFFetchData(tif, dir, (char*) v) != 0); } /* * Fetch an array of RATIONAL or SRATIONAL values. */ static int TIFFFetchRationalArray(TIFF* tif, TIFFDirEntry* dir, float* v) { int ok = 0; uint32* l; l = (uint32*)CheckMalloc(tif, dir->tdir_count*tiffDataWidth[dir->tdir_type], "to fetch array of rationals"); if (l) { if (TIFFFetchData(tif, dir, (char *)l)) { uint32 i; for (i = 0; i < dir->tdir_count; i++) { ok = cvtRational(tif, dir, l[2*i+0], l[2*i+1], &v[i]); if (!ok) break; } } _TIFFfree((char *)l); } return (ok); } /* * Fetch an array of FLOAT values. */ static int TIFFFetchFloatArray(TIFF* tif, TIFFDirEntry* dir, float* v) { if (dir->tdir_count == 1) { v[0] = *(float*) &dir->tdir_offset; TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v); return (1); } else if (TIFFFetchData(tif, dir, (char*) v)) { TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v); return (1); } else return (0); } /* * Fetch an array of DOUBLE values. */ static int TIFFFetchDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v) { if (TIFFFetchData(tif, dir, (char*) v)) { TIFFCvtIEEEDoubleToNative(tif, dir->tdir_count, v); return (1); } else return (0); } /* * Fetch an array of ANY values. The actual values are * returned as doubles which should be able hold all the * types. Yes, there really should be an tany_t to avoid * this potential non-portability ... Note in particular * that we assume that the double return value vector is * large enough to read in any fundamental type. We use * that vector as a buffer to read in the base type vector * and then convert it in place to double (from end * to front of course). */ static int TIFFFetchAnyArray(TIFF* tif, TIFFDirEntry* dir, double* v) { int i; switch (dir->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: if (!TIFFFetchByteArray(tif, dir, (uint16*) v)) return (0); if (dir->tdir_type == TIFF_BYTE) { uint16* vp = (uint16*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } else { int16* vp = (int16*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_SHORT: case TIFF_SSHORT: if (!TIFFFetchShortArray(tif, dir, (uint16*) v)) return (0); if (dir->tdir_type == TIFF_SHORT) { uint16* vp = (uint16*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } else { int16* vp = (int16*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_LONG: case TIFF_SLONG: if (!TIFFFetchLongArray(tif, dir, (uint32*) v)) return (0); if (dir->tdir_type == TIFF_LONG) { uint32* vp = (uint32*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } else { int32* vp = (int32*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_RATIONAL: case TIFF_SRATIONAL: if (!TIFFFetchRationalArray(tif, dir, (float*) v)) return (0); { float* vp = (float*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_FLOAT: if (!TIFFFetchFloatArray(tif, dir, (float*) v)) return (0); { float* vp = (float*) v; for (i = dir->tdir_count-1; i >= 0; i--) v[i] = vp[i]; } break; case TIFF_DOUBLE: return (TIFFFetchDoubleArray(tif, dir, (double*) v)); default: /* TIFF_NOTYPE */ /* TIFF_ASCII */ /* TIFF_UNDEFINED */ TIFFError(tif->tif_name, "Cannot read TIFF_ANY type %d for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); return (0); } return (1); } /* * Fetch a tag that is not handled by special case code. */ static int TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp) { static const char mesg[] = "to fetch tag value"; int ok = 0; const TIFFFieldInfo* fip = _TIFFFieldWithTag(tif, dp->tdir_tag); if (dp->tdir_count > 1) { /* array of values */ char* cp = NULL; switch (dp->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: /* NB: always expand BYTE values to shorts */ cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint16), mesg); ok = cp && TIFFFetchByteArray(tif, dp, (uint16*) cp); break; case TIFF_SHORT: case TIFF_SSHORT: cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint16), mesg); ok = cp && TIFFFetchShortArray(tif, dp, (uint16*) cp); break; case TIFF_LONG: case TIFF_SLONG: cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint32), mesg); ok = cp && TIFFFetchLongArray(tif, dp, (uint32*) cp); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: cp = CheckMalloc(tif, dp->tdir_count * sizeof (float), mesg); ok = cp && TIFFFetchRationalArray(tif, dp, (float*) cp); break; case TIFF_FLOAT: cp = CheckMalloc(tif, dp->tdir_count * sizeof (float), mesg); ok = cp && TIFFFetchFloatArray(tif, dp, (float*) cp); break; case TIFF_DOUBLE: cp = CheckMalloc(tif, dp->tdir_count * sizeof (double), mesg); ok = cp && TIFFFetchDoubleArray(tif, dp, (double*) cp); break; case TIFF_ASCII: case TIFF_UNDEFINED: /* bit of a cheat... */ /* * Some vendors write strings w/o the trailing * NULL byte, so always append one just in case. */ cp = CheckMalloc(tif, dp->tdir_count+1, mesg); if( (ok = (cp && TIFFFetchString(tif, dp, cp))) != 0 ) cp[dp->tdir_count] = '\0'; /* XXX */ break; } if (ok) { ok = (fip->field_passcount ? TIFFSetField(tif, dp->tdir_tag, dp->tdir_count, cp) : TIFFSetField(tif, dp->tdir_tag, cp)); } if (cp != NULL) _TIFFfree(cp); } else if (CheckDirCount(tif, dp, 1)) { /* singleton value */ switch (dp->tdir_type) { case TIFF_BYTE: case TIFF_SBYTE: case TIFF_SHORT: case TIFF_SSHORT: /* * If the tag is also acceptable as a LONG or SLONG * then TIFFSetField will expect an uint32 parameter * passed to it (through varargs). Thus, for machines * where sizeof (int) != sizeof (uint32) we must do * a careful check here. It's hard to say if this * is worth optimizing. * * NB: We use TIFFFieldWithTag here knowing that * it returns us the first entry in the table * for the tag and that that entry is for the * widest potential data type the tag may have. */ { TIFFDataType type = fip->field_type; if (type != TIFF_LONG && type != TIFF_SLONG) { uint16 v = (uint16) TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset); ok = (fip->field_passcount ? TIFFSetField(tif, dp->tdir_tag, 1, &v) : TIFFSetField(tif, dp->tdir_tag, v)); break; } } /* fall thru... */ case TIFF_LONG: case TIFF_SLONG: { uint32 v32 = TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset); ok = (fip->field_passcount ? TIFFSetField(tif, dp->tdir_tag, 1, &v32) : TIFFSetField(tif, dp->tdir_tag, v32)); } break; case TIFF_RATIONAL: case TIFF_SRATIONAL: case TIFF_FLOAT: { float v = (dp->tdir_type == TIFF_FLOAT ? TIFFFetchFloat(tif, dp) : TIFFFetchRational(tif, dp)); ok = (fip->field_passcount ? TIFFSetField(tif, dp->tdir_tag, 1, &v) : TIFFSetField(tif, dp->tdir_tag, v)); } break; case TIFF_DOUBLE: { double v; ok = (TIFFFetchDoubleArray(tif, dp, &v) && (fip->field_passcount ? TIFFSetField(tif, dp->tdir_tag, 1, &v) : TIFFSetField(tif, dp->tdir_tag, v)) ); } break; case TIFF_ASCII: case TIFF_UNDEFINED: /* bit of a cheat... */ { char c[2]; if( (ok = (TIFFFetchString(tif, dp, c) != 0)) != 0 ){ c[1] = '\0'; /* XXX paranoid */ ok = TIFFSetField(tif, dp->tdir_tag, c); } } break; } } return (ok); } #define NITEMS(x) (sizeof (x) / sizeof (x[0])) /* * Fetch samples/pixel short values for * the specified tag and verify that * all values are the same. */ static int TIFFFetchPerSampleShorts(TIFF* tif, TIFFDirEntry* dir, int* pl) { int samples = tif->tif_dir.td_samplesperpixel; int status = 0; if (CheckDirCount(tif, dir, (uint32) samples)) { uint16 buf[10]; uint16* v = buf; if (samples > NITEMS(buf)) v = (uint16*) _TIFFmalloc(samples * sizeof (uint16)); if (TIFFFetchShortArray(tif, dir, v)) { int i; for (i = 1; i < samples; i++) if (v[i] != v[0]) { TIFFError(tif->tif_name, "Cannot handle different per-sample values for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); goto bad; } *pl = v[0]; status = 1; } bad: if (v != buf) _TIFFfree((char*) v); } return (status); } /* * Fetch samples/pixel ANY values for * the specified tag and verify that * all values are the same. */ static int TIFFFetchPerSampleAnys(TIFF* tif, TIFFDirEntry* dir, double* pl) { int samples = (int) tif->tif_dir.td_samplesperpixel; int status = 0; if (CheckDirCount(tif, dir, (uint32) samples)) { double buf[10]; double* v = buf; if (samples > NITEMS(buf)) v = (double*) _TIFFmalloc(samples * sizeof (double)); if (TIFFFetchAnyArray(tif, dir, v)) { int i; for (i = 1; i < samples; i++) if (v[i] != v[0]) { TIFFError(tif->tif_name, "Cannot handle different per-sample values for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); goto bad; } *pl = v[0]; status = 1; } bad: if (v != buf) _TIFFfree(v); } return (status); } #undef NITEMS /* * Fetch a set of offsets or lengths. * While this routine says "strips", * in fact it's also used for tiles. */ static int TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, long nstrips, uint32** lpp) { register uint32* lp; int status; if (!CheckDirCount(tif, dir, (uint32) nstrips)) return (0); /* * Allocate space for strip information. */ if (*lpp == NULL && (*lpp = (uint32 *)CheckMalloc(tif, nstrips * sizeof (uint32), "for strip array")) == NULL) return (0); lp = *lpp; if (dir->tdir_type == (int)TIFF_SHORT) { /* * Handle uint16->uint32 expansion. */ uint16* dp = (uint16*) CheckMalloc(tif, dir->tdir_count* sizeof (uint16), "to fetch strip tag"); if (dp == NULL) return (0); if( (status = TIFFFetchShortArray(tif, dir, dp)) != 0 ) { register uint16* wp = dp; while (nstrips-- > 0) *lp++ = *wp++; } _TIFFfree((char*) dp); } else status = TIFFFetchLongArray(tif, dir, lp); return (status); } #define NITEMS(x) (sizeof (x) / sizeof (x[0])) /* * Fetch and set the ExtraSamples tag. */ static int TIFFFetchExtraSamples(TIFF* tif, TIFFDirEntry* dir) { uint16 buf[10]; uint16* v = buf; int status; if (dir->tdir_count > NITEMS(buf)) v = (uint16*) _TIFFmalloc(dir->tdir_count * sizeof (uint16)); if (dir->tdir_type == TIFF_BYTE) status = TIFFFetchByteArray(tif, dir, v); else status = TIFFFetchShortArray(tif, dir, v); if (status) status = TIFFSetField(tif, dir->tdir_tag, dir->tdir_count, v); if (v != buf) _TIFFfree((char*) v); return (status); } #undef NITEMS #ifdef COLORIMETRY_SUPPORT /* * Fetch and set the RefBlackWhite tag. */ static int TIFFFetchRefBlackWhite(TIFF* tif, TIFFDirEntry* dir) { static const char mesg[] = "for \"ReferenceBlackWhite\" array"; char* cp; int ok; if (dir->tdir_type == TIFF_RATIONAL) return (TIFFFetchNormalTag(tif, dir)); /* * Handle LONG's for backward compatibility. */ cp = CheckMalloc(tif, dir->tdir_count * sizeof (uint32), mesg); if( (ok = (cp && TIFFFetchLongArray(tif, dir, (uint32*) cp))) != 0) { float* fp = (float*) CheckMalloc(tif, dir->tdir_count * sizeof (float), mesg); if( (ok = (fp != NULL)) != 0 ) { uint32 i; for (i = 0; i < dir->tdir_count; i++) fp[i] = (float)((uint32*) cp)[i]; ok = TIFFSetField(tif, dir->tdir_tag, fp); _TIFFfree((char*) fp); } } if (cp) _TIFFfree(cp); return (ok); } #endif /* * Replace a single strip (tile) of uncompressed data by * multiple strips (tiles), each approximately 8Kbytes. * This is useful for dealing with large images or * for dealing with machines with a limited amount * memory. */ static void ChopUpSingleUncompressedStrip(TIFF* tif) { register TIFFDirectory *td = &tif->tif_dir; uint32 bytecount = td->td_stripbytecount[0]; uint32 offset = td->td_stripoffset[0]; tsize_t rowbytes = TIFFVTileSize(tif, 1), stripbytes; tstrip_t strip, nstrips, rowsperstrip; uint32* newcounts; uint32* newoffsets; /* * Make the rows hold at least one * scanline, but fill 8k if possible. */ if (rowbytes > 8192) { stripbytes = rowbytes; rowsperstrip = 1; } else { rowsperstrip = 8192 / rowbytes; stripbytes = rowbytes * rowsperstrip; } /* never increase the number of strips in an image */ if (rowsperstrip >= td->td_rowsperstrip) return; nstrips = (tstrip_t) TIFFhowmany(bytecount, stripbytes); newcounts = (uint32*) CheckMalloc(tif, nstrips * sizeof (uint32), "for chopped \"StripByteCounts\" array"); newoffsets = (uint32*) CheckMalloc(tif, nstrips * sizeof (uint32), "for chopped \"StripOffsets\" array"); if (newcounts == NULL || newoffsets == NULL) { /* * Unable to allocate new strip information, give * up and use the original one strip information. */ if (newcounts != NULL) _TIFFfree(newcounts); if (newoffsets != NULL) _TIFFfree(newoffsets); return; } /* * Fill the strip information arrays with * new bytecounts and offsets that reflect * the broken-up format. */ for (strip = 0; strip < nstrips; strip++) { if (stripbytes > (tsize_t) bytecount) stripbytes = bytecount; newcounts[strip] = stripbytes; newoffsets[strip] = offset; offset += stripbytes; bytecount -= stripbytes; } /* * Replace old single strip info with multi-strip info. */ td->td_stripsperimage = td->td_nstrips = nstrips; TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip); _TIFFfree(td->td_stripbytecount); _TIFFfree(td->td_stripoffset); td->td_stripbytecount = newcounts; td->td_stripoffset = newoffsets; } gamera-3.3.3/src/libtiff/tif_dirwrite.c0000644000076500000000000007404710714675674017044 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Directory Write Support Routines. */ #include "tiffiop.h" #if HAVE_IEEEFP #define TIFFCvtNativeToIEEEFloat(tif, n, fp) #define TIFFCvtNativeToIEEEDouble(tif, n, dp) #else extern void TIFFCvtNativeToIEEEFloat(TIFF*, uint32, float*); extern void TIFFCvtNativeToIEEEDouble(TIFF*, uint32, double*); #endif static int TIFFWriteNormalTag(TIFF*, TIFFDirEntry*, const TIFFFieldInfo*); static void TIFFSetupShortLong(TIFF*, ttag_t, TIFFDirEntry*, uint32); static int TIFFSetupShortPair(TIFF*, ttag_t, TIFFDirEntry*); static int TIFFWritePerSampleShorts(TIFF*, ttag_t, TIFFDirEntry*); static int TIFFWritePerSampleAnys(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*); static int TIFFWriteShortTable(TIFF*, ttag_t, TIFFDirEntry*, uint32, uint16**); static int TIFFWriteShortArray(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, uint16*); static int TIFFWriteLongArray(TIFF *, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, uint32*); static int TIFFWriteRationalArray(TIFF *, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, float*); static int TIFFWriteFloatArray(TIFF *, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, float*); static int TIFFWriteDoubleArray(TIFF *, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*); static int TIFFWriteByteArray(TIFF*, TIFFDirEntry*, char*); static int TIFFWriteAnyArray(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*); #ifdef COLORIMETRY_SUPPORT static int TIFFWriteTransferFunction(TIFF*, TIFFDirEntry*); #endif #ifdef CMYK_SUPPORT static int TIFFWriteInkNames(TIFF*, TIFFDirEntry*); #endif static int TIFFWriteData(TIFF*, TIFFDirEntry*, char*); static int TIFFLinkDirectory(TIFF*); #define WriteRationalPair(type, tag1, v1, tag2, v2) { \ if (!TIFFWriteRational(tif, type, tag1, dir, v1)) \ goto bad; \ if (!TIFFWriteRational(tif, type, tag2, dir+1, v2)) \ goto bad; \ dir++; \ } #define TIFFWriteRational(tif, type, tag, dir, v) \ TIFFWriteRationalArray((tif), (type), (tag), (dir), 1, &(v)) #ifndef TIFFWriteRational static int TIFFWriteRational(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*, float); #endif /* * Write the contents of the current directory * to the specified file. This routine doesn't * handle overwriting a directory with auxiliary * storage that's been changed. */ int TIFFWriteDirectory(TIFF* tif) { uint16 dircount; toff_t diroff; ttag_t tag; uint32 nfields; tsize_t dirsize; char* data; TIFFDirEntry* dir; TIFFDirectory* td; u_long b, fields[FIELD_SETLONGS]; int fi, nfi; if (tif->tif_mode == O_RDONLY) return (1); /* * Clear write state so that subsequent images with * different characteristics get the right buffers * setup for them. */ if (tif->tif_flags & TIFF_POSTENCODE) { tif->tif_flags &= ~TIFF_POSTENCODE; if (!(*tif->tif_postencode)(tif)) { TIFFError(tif->tif_name, "Error post-encoding before directory write"); return (0); } } (*tif->tif_close)(tif); /* shutdown encoder */ /* * Flush any data that might have been written * by the compression close+cleanup routines. */ if (tif->tif_rawcc > 0 && !TIFFFlushData1(tif)) { TIFFError(tif->tif_name, "Error flushing data before directory write"); return (0); } if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) { _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; tif->tif_rawcc = 0; tif->tif_rawdatasize = 0; } tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP); td = &tif->tif_dir; /* * Size the directory so that we can calculate * offsets for the data items that aren't kept * in-place in each field. */ nfields = 0; for (b = 0; b <= FIELD_LAST; b++) if (TIFFFieldSet(tif, b)) nfields += (b < FIELD_SUBFILETYPE ? 2 : 1); dirsize = nfields * sizeof (TIFFDirEntry); data = (char*) _TIFFmalloc(dirsize); if (data == NULL) { TIFFError(tif->tif_name, "Cannot write directory, out of space"); return (0); } /* * Directory hasn't been placed yet, put * it at the end of the file and link it * into the existing directory structure. */ if (tif->tif_diroff == 0 && !TIFFLinkDirectory(tif)) goto bad; tif->tif_dataoff = (toff_t)( tif->tif_diroff + sizeof (uint16) + dirsize + sizeof (toff_t)); if (tif->tif_dataoff & 1) tif->tif_dataoff++; (void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET); tif->tif_curdir++; dir = (TIFFDirEntry*) data; /* * Setup external form of directory * entries and write data items. */ _TIFFmemcpy(fields, td->td_fieldsset, sizeof (fields)); /* * Write out ExtraSamples tag only if * extra samples are present in the data. */ if (FieldSet(fields, FIELD_EXTRASAMPLES) && !td->td_extrasamples) { ResetFieldBit(fields, FIELD_EXTRASAMPLES); nfields--; dirsize -= sizeof (TIFFDirEntry); } /*XXX*/ for (fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) { const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi]; if (!FieldSet(fields, fip->field_bit)) continue; switch (fip->field_bit) { case FIELD_STRIPOFFSETS: /* * We use one field bit for both strip and tile * offsets, and so must be careful in selecting * the appropriate field descriptor (so that tags * are written in sorted order). */ tag = isTiled(tif) ? TIFFTAG_TILEOFFSETS : TIFFTAG_STRIPOFFSETS; if (tag != fip->field_tag) continue; if (!TIFFWriteLongArray(tif, TIFF_LONG, tag, dir, (uint32) td->td_nstrips, td->td_stripoffset)) goto bad; break; case FIELD_STRIPBYTECOUNTS: /* * We use one field bit for both strip and tile * byte counts, and so must be careful in selecting * the appropriate field descriptor (so that tags * are written in sorted order). */ tag = isTiled(tif) ? TIFFTAG_TILEBYTECOUNTS : TIFFTAG_STRIPBYTECOUNTS; if (tag != fip->field_tag) continue; if (!TIFFWriteLongArray(tif, TIFF_LONG, tag, dir, (uint32) td->td_nstrips, td->td_stripbytecount)) goto bad; break; case FIELD_ROWSPERSTRIP: TIFFSetupShortLong(tif, TIFFTAG_ROWSPERSTRIP, dir, td->td_rowsperstrip); break; case FIELD_COLORMAP: if (!TIFFWriteShortTable(tif, TIFFTAG_COLORMAP, dir, 3, td->td_colormap)) goto bad; break; case FIELD_IMAGEDIMENSIONS: TIFFSetupShortLong(tif, TIFFTAG_IMAGEWIDTH, dir++, td->td_imagewidth); TIFFSetupShortLong(tif, TIFFTAG_IMAGELENGTH, dir, td->td_imagelength); break; case FIELD_TILEDIMENSIONS: TIFFSetupShortLong(tif, TIFFTAG_TILEWIDTH, dir++, td->td_tilewidth); TIFFSetupShortLong(tif, TIFFTAG_TILELENGTH, dir, td->td_tilelength); break; case FIELD_POSITION: WriteRationalPair(TIFF_RATIONAL, TIFFTAG_XPOSITION, td->td_xposition, TIFFTAG_YPOSITION, td->td_yposition); break; case FIELD_RESOLUTION: WriteRationalPair(TIFF_RATIONAL, TIFFTAG_XRESOLUTION, td->td_xresolution, TIFFTAG_YRESOLUTION, td->td_yresolution); break; case FIELD_BITSPERSAMPLE: case FIELD_MINSAMPLEVALUE: case FIELD_MAXSAMPLEVALUE: case FIELD_SAMPLEFORMAT: if (!TIFFWritePerSampleShorts(tif, fip->field_tag, dir)) goto bad; break; case FIELD_SMINSAMPLEVALUE: case FIELD_SMAXSAMPLEVALUE: if (!TIFFWritePerSampleAnys(tif, _TIFFSampleToTagType(tif), fip->field_tag, dir)) goto bad; break; case FIELD_PAGENUMBER: case FIELD_HALFTONEHINTS: #ifdef YCBCR_SUPPORT case FIELD_YCBCRSUBSAMPLING: #endif #ifdef CMYK_SUPPORT case FIELD_DOTRANGE: #endif if (!TIFFSetupShortPair(tif, fip->field_tag, dir)) goto bad; break; #ifdef CMYK_SUPPORT case FIELD_INKNAMES: if (!TIFFWriteInkNames(tif, dir)) goto bad; break; #endif #ifdef COLORIMETRY_SUPPORT case FIELD_TRANSFERFUNCTION: if (!TIFFWriteTransferFunction(tif, dir)) goto bad; break; #endif #if SUBIFD_SUPPORT case FIELD_SUBIFD: if (!TIFFWriteNormalTag(tif, dir, fip)) goto bad; /* * Total hack: if this directory includes a SubIFD * tag then force the next directories to be * written as ``sub directories'' of this one. This * is used to write things like thumbnails and * image masks that one wants to keep out of the * normal directory linkage access mechanism. */ if (dir->tdir_count > 0) { tif->tif_flags |= TIFF_INSUBIFD; tif->tif_nsubifd = (uint16) dir->tdir_count; if (dir->tdir_count > 1) tif->tif_subifdoff = dir->tdir_offset; else tif->tif_subifdoff = (uint32)( tif->tif_diroff + sizeof (uint16) + ((char*)&dir->tdir_offset-data)); } break; #endif default: if (!TIFFWriteNormalTag(tif, dir, fip)) goto bad; break; } dir++; ResetFieldBit(fields, fip->field_bit); } /* * Write directory. */ dircount = (uint16) nfields; diroff = (uint32) tif->tif_nextdiroff; if (tif->tif_flags & TIFF_SWAB) { /* * The file's byte order is opposite to the * native machine architecture. We overwrite * the directory information with impunity * because it'll be released below after we * write it to the file. Note that all the * other tag construction routines assume that * we do this byte-swapping; i.e. they only * byte-swap indirect data. */ for (dir = (TIFFDirEntry*) data; dircount; dir++, dircount--) { TIFFSwabArrayOfShort(&dir->tdir_tag, 2); TIFFSwabArrayOfLong(&dir->tdir_count, 2); } dircount = (uint16) nfields; TIFFSwabShort(&dircount); TIFFSwabLong(&diroff); } (void) TIFFSeekFile(tif, tif->tif_diroff, SEEK_SET); if (!WriteOK(tif, &dircount, sizeof (dircount))) { TIFFError(tif->tif_name, "Error writing directory count"); goto bad; } if (!WriteOK(tif, data, dirsize)) { TIFFError(tif->tif_name, "Error writing directory contents"); goto bad; } if (!WriteOK(tif, &diroff, sizeof (diroff))) { TIFFError(tif->tif_name, "Error writing directory link"); goto bad; } TIFFFreeDirectory(tif); _TIFFfree(data); tif->tif_flags &= ~TIFF_DIRTYDIRECT; (*tif->tif_cleanup)(tif); /* * Reset directory-related state for subsequent * directories. */ TIFFCreateDirectory(tif); return (1); bad: _TIFFfree(data); return (0); } #undef WriteRationalPair /* * Process tags that are not special cased. */ static int TIFFWriteNormalTag(TIFF* tif, TIFFDirEntry* dir, const TIFFFieldInfo* fip) { u_short wc = (u_short) fip->field_writecount; uint32 wc2; dir->tdir_tag = (uint16) fip->field_tag; dir->tdir_type = (u_short) fip->field_type; dir->tdir_count = wc; #define WRITEF(x,y) x(tif, fip->field_type, fip->field_tag, dir, wc, y) switch (fip->field_type) { case TIFF_SHORT: case TIFF_SSHORT: if (wc > 1) { uint16* wp; if (wc == (u_short) TIFF_VARIABLE) TIFFGetField(tif, fip->field_tag, &wc, &wp); else TIFFGetField(tif, fip->field_tag, &wp); if (!WRITEF(TIFFWriteShortArray, wp)) return (0); } else { uint16 sv; TIFFGetField(tif, fip->field_tag, &sv); dir->tdir_offset = TIFFInsertData(tif, dir->tdir_type, sv); } break; case TIFF_LONG: case TIFF_SLONG: if (wc > 1) { uint32* lp; if (wc == (u_short) TIFF_VARIABLE) TIFFGetField(tif, fip->field_tag, &wc, &lp); else TIFFGetField(tif, fip->field_tag, &lp); if (!WRITEF(TIFFWriteLongArray, lp)) return (0); } else { /* XXX handle LONG->SHORT conversion */ TIFFGetField(tif, fip->field_tag, &dir->tdir_offset); } break; case TIFF_RATIONAL: case TIFF_SRATIONAL: if (wc > 1) { float* fp; if (wc == (u_short) TIFF_VARIABLE) TIFFGetField(tif, fip->field_tag, &wc, &fp); else TIFFGetField(tif, fip->field_tag, &fp); if (!WRITEF(TIFFWriteRationalArray, fp)) return (0); } else { float fv; TIFFGetField(tif, fip->field_tag, &fv); if (!WRITEF(TIFFWriteRationalArray, &fv)) return (0); } break; case TIFF_FLOAT: if (wc > 1) { float* fp; if (wc == (u_short) TIFF_VARIABLE) TIFFGetField(tif, fip->field_tag, &wc, &fp); else TIFFGetField(tif, fip->field_tag, &fp); if (!WRITEF(TIFFWriteFloatArray, fp)) return (0); } else { float fv; TIFFGetField(tif, fip->field_tag, &fv); if (!WRITEF(TIFFWriteFloatArray, &fv)) return (0); } break; case TIFF_DOUBLE: if (wc > 1) { double* dp; if (wc == (u_short) TIFF_VARIABLE) TIFFGetField(tif, fip->field_tag, &wc, &dp); else TIFFGetField(tif, fip->field_tag, &dp); if (!WRITEF(TIFFWriteDoubleArray, dp)) return (0); } else { double dv; TIFFGetField(tif, fip->field_tag, &dv); if (!WRITEF(TIFFWriteDoubleArray, &dv)) return (0); } break; case TIFF_ASCII: { char* cp; TIFFGetField(tif, fip->field_tag, &cp); dir->tdir_count = (uint32) (strlen(cp) + 1); if (!TIFFWriteByteArray(tif, dir, cp)) return (0); } break; /* added based on patch request from MARTIN.MCBRIDE.MM@agfa.co.uk, correctness not verified (FW, 99/08) */ case TIFF_BYTE: case TIFF_SBYTE: if (wc > 1) { char* cp; if (wc == (u_short) TIFF_VARIABLE) { TIFFGetField(tif, fip->field_tag, &wc, &cp); dir->tdir_count = wc; } else if (wc == (u_short) TIFF_VARIABLE2) { TIFFGetField(tif, fip->field_tag, &wc2, &cp); dir->tdir_count = wc2; } else TIFFGetField(tif, fip->field_tag, &cp); if (!TIFFWriteByteArray(tif, dir, cp)) return (0); } else { char cv; TIFFGetField(tif, fip->field_tag, &cv); if (!TIFFWriteByteArray(tif, dir, &cv)) return (0); } break; case TIFF_UNDEFINED: { char* cp; if (wc == (u_short) TIFF_VARIABLE) { TIFFGetField(tif, fip->field_tag, &wc, &cp); dir->tdir_count = wc; } else if (wc == (u_short) TIFF_VARIABLE2) { TIFFGetField(tif, fip->field_tag, &wc2, &cp); dir->tdir_count = wc2; } else TIFFGetField(tif, fip->field_tag, &cp); if (!TIFFWriteByteArray(tif, dir, cp)) return (0); } break; case TIFF_NOTYPE: break; } return (1); } #undef WRITEF /* * Setup a directory entry with either a SHORT * or LONG type according to the value. */ static void TIFFSetupShortLong(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint32 v) { dir->tdir_tag = (uint16) tag; dir->tdir_count = 1; if (v > 0xffffL) { dir->tdir_type = (short) TIFF_LONG; dir->tdir_offset = v; } else { dir->tdir_type = (short) TIFF_SHORT; dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v); } } #undef MakeShortDirent #ifndef TIFFWriteRational /* * Setup a RATIONAL directory entry and * write the associated indirect value. */ static int TIFFWriteRational(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, float v) { return (TIFFWriteRationalArray(tif, type, tag, dir, 1, &v)); } #endif #define NITEMS(x) (sizeof (x) / sizeof (x[0])) /* * Setup a directory entry that references a * samples/pixel array of SHORT values and * (potentially) write the associated indirect * values. */ static int TIFFWritePerSampleShorts(TIFF* tif, ttag_t tag, TIFFDirEntry* dir) { uint16 buf[10], v; uint16* w = buf; int i, status, samples = tif->tif_dir.td_samplesperpixel; if (samples > NITEMS(buf)) w = (uint16*) _TIFFmalloc(samples * sizeof (uint16)); TIFFGetField(tif, tag, &v); for (i = 0; i < samples; i++) w[i] = v; status = TIFFWriteShortArray(tif, TIFF_SHORT, tag, dir, samples, w); if (w != buf) _TIFFfree((char*) w); return (status); } /* * Setup a directory entry that references a samples/pixel array of ``type'' * values and (potentially) write the associated indirect values. The source * data from TIFFGetField() for the specified tag must be returned as double. */ static int TIFFWritePerSampleAnys(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir) { double buf[10], v; double* w = buf; int i, status; int samples = (int) tif->tif_dir.td_samplesperpixel; if (samples > NITEMS(buf)) w = (double*) _TIFFmalloc(samples * sizeof (double)); TIFFGetField(tif, tag, &v); for (i = 0; i < samples; i++) w[i] = v; status = TIFFWriteAnyArray(tif, type, tag, dir, samples, w); if (w != buf) _TIFFfree(w); return (status); } #undef NITEMS /* * Setup a pair of shorts that are returned by * value, rather than as a reference to an array. */ static int TIFFSetupShortPair(TIFF* tif, ttag_t tag, TIFFDirEntry* dir) { uint16 v[2]; TIFFGetField(tif, tag, &v[0], &v[1]); return (TIFFWriteShortArray(tif, TIFF_SHORT, tag, dir, 2, v)); } /* * Setup a directory entry for an NxM table of shorts, * where M is known to be 2**bitspersample, and write * the associated indirect data. */ static int TIFFWriteShortTable(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16** table) { uint32 i, off; dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) TIFF_SHORT; /* XXX -- yech, fool TIFFWriteData */ dir->tdir_count = (uint32) (1L<tif_dir.td_bitspersample); off = tif->tif_dataoff; for (i = 0; i < n; i++) if (!TIFFWriteData(tif, dir, (char *)table[i])) return (0); dir->tdir_count *= n; dir->tdir_offset = off; return (1); } /* * Write/copy data associated with an ASCII or opaque tag value. */ static int TIFFWriteByteArray(TIFF* tif, TIFFDirEntry* dir, char* cp) { if (dir->tdir_count > 4) { if (!TIFFWriteData(tif, dir, cp)) return (0); } else _TIFFmemcpy(&dir->tdir_offset, cp, dir->tdir_count); return (1); } /* * Setup a directory entry of an array of SHORT * or SSHORT and write the associated indirect values. */ static int TIFFWriteShortArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16* v) { dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) type; dir->tdir_count = n; if (n <= 2) { if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) { dir->tdir_offset = (uint32) ((long) v[0] << 16); if (n == 2) dir->tdir_offset |= v[1] & 0xffff; } else { dir->tdir_offset = v[0] & 0xffff; if (n == 2) dir->tdir_offset |= (long) v[1] << 16; } return (1); } else return (TIFFWriteData(tif, dir, (char*) v)); } /* * Setup a directory entry of an array of LONG * or SLONG and write the associated indirect values. */ static int TIFFWriteLongArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint32* v) { dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) type; dir->tdir_count = n; if (n == 1) { dir->tdir_offset = v[0]; return (1); } else return (TIFFWriteData(tif, dir, (char*) v)); } /* * Setup a directory entry of an array of RATIONAL * or SRATIONAL and write the associated indirect values. */ static int TIFFWriteRationalArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, float* v) { uint32 i; uint32* t; int status; dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) type; dir->tdir_count = n; t = (uint32*) _TIFFmalloc(2*n * sizeof (uint32)); for (i = 0; i < n; i++) { float fv = v[i]; int sign = 1; uint32 den; if (fv < 0) { if (type == TIFF_RATIONAL) { TIFFWarning(tif->tif_name, "\"%s\": Information lost writing value (%g) as (unsigned) RATIONAL", _TIFFFieldWithTag(tif,tag)->field_name, fv); fv = 0; } else fv = -fv, sign = -1; } den = 1L; if (fv > 0) { while (fv < 1L<<(31-3) && den < 1L<<(31-3)) fv *= 1<<3, den *= 1L<<3; } t[2*i+0] = (uint32) (sign * (fv + 0.5)); t[2*i+1] = den; } status = TIFFWriteData(tif, dir, (char *)t); _TIFFfree((char*) t); return (status); } static int TIFFWriteFloatArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, float* v) { dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) type; dir->tdir_count = n; TIFFCvtNativeToIEEEFloat(tif, n, v); if (n == 1) { dir->tdir_offset = *(uint32*) &v[0]; return (1); } else return (TIFFWriteData(tif, dir, (char*) v)); } static int TIFFWriteDoubleArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v) { dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) type; dir->tdir_count = n; TIFFCvtNativeToIEEEDouble(tif, n, v); return (TIFFWriteData(tif, dir, (char*) v)); } /* * Write an array of ``type'' values for a specified tag (i.e. this is a tag * which is allowed to have different types, e.g. SMaxSampleType). * Internally the data values are represented as double since a double can * hold any of the TIFF tag types (yes, this should really be an abstract * type tany_t for portability). The data is converted into the specified * type in a temporary buffer and then handed off to the appropriate array * writer. */ static int TIFFWriteAnyArray(TIFF* tif, TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v) { char buf[10 * sizeof(double)]; char* w = buf; int i, status = 0; if (n * tiffDataWidth[type] > sizeof buf) w = (char*) _TIFFmalloc(n * tiffDataWidth[type]); switch (type) { case TIFF_BYTE: { uint8* bp = (uint8*) w; for (i = 0; i < (int) n; i++) bp[i] = (uint8) v[i]; dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) type; dir->tdir_count = n; if (!TIFFWriteByteArray(tif, dir, (char*) bp)) goto out; } break; case TIFF_SBYTE: { int8* bp = (int8*) w; for (i = 0; i < (int) n; i++) bp[i] = (int8) v[i]; dir->tdir_tag = (uint16) tag; dir->tdir_type = (short) type; dir->tdir_count = n; if (!TIFFWriteByteArray(tif, dir, (char*) bp)) goto out; } break; case TIFF_SHORT: { uint16* bp = (uint16*) w; for (i = 0; i < (int) n; i++) bp[i] = (uint16) v[i]; if (!TIFFWriteShortArray(tif, type, tag, dir, n, (uint16*)bp)) goto out; } break; case TIFF_SSHORT: { int16* bp = (int16*) w; for (i = 0; i < (int) n; i++) bp[i] = (int16) v[i]; if (!TIFFWriteShortArray(tif, type, tag, dir, n, (uint16*)bp)) goto out; } break; case TIFF_LONG: { uint32* bp = (uint32*) w; for (i = 0; i < (int) n; i++) bp[i] = (uint32) v[i]; if (!TIFFWriteLongArray(tif, type, tag, dir, n, bp)) goto out; } break; case TIFF_SLONG: { int32* bp = (int32*) w; for (i = 0; i < (int) n; i++) bp[i] = (int32) v[i]; if (!TIFFWriteLongArray(tif, type, tag, dir, n, (uint32*) bp)) goto out; } break; case TIFF_FLOAT: { float* bp = (float*) w; for (i = 0; i < (int) n; i++) bp[i] = (float) v[i]; if (!TIFFWriteFloatArray(tif, type, tag, dir, n, bp)) goto out; } break; case TIFF_DOUBLE: return (TIFFWriteDoubleArray(tif, type, tag, dir, n, v)); default: /* TIFF_NOTYPE */ /* TIFF_ASCII */ /* TIFF_UNDEFINED */ /* TIFF_RATIONAL */ /* TIFF_SRATIONAL */ goto out; } status = 1; out: if (w != buf) _TIFFfree(w); return (status); } #ifdef COLORIMETRY_SUPPORT static int TIFFWriteTransferFunction(TIFF* tif, TIFFDirEntry* dir) { TIFFDirectory* td = &tif->tif_dir; tsize_t n = (1L<td_bitspersample) * sizeof (uint16); uint16** tf = td->td_transferfunction; int ncols; /* * Check if the table can be written as a single column, * or if it must be written as 3 columns. Note that we * write a 3-column tag if there are 2 samples/pixel and * a single column of data won't suffice--hmm. */ switch (td->td_samplesperpixel - td->td_extrasamples) { default: if (_TIFFmemcmp(tf[0], tf[2], n)) { ncols = 3; break; } case 2: if (_TIFFmemcmp(tf[0], tf[1], n)) { ncols = 3; break; } case 1: case 0: ncols = 1; } return (TIFFWriteShortTable(tif, TIFFTAG_TRANSFERFUNCTION, dir, ncols, tf)); } #endif #ifdef CMYK_SUPPORT static int TIFFWriteInkNames(TIFF* tif, TIFFDirEntry* dir) { TIFFDirectory* td = &tif->tif_dir; dir->tdir_tag = TIFFTAG_INKNAMES; dir->tdir_type = (short) TIFF_ASCII; dir->tdir_count = td->td_inknameslen; return (TIFFWriteByteArray(tif, dir, td->td_inknames)); } #endif /* * Write a contiguous directory item. */ static int TIFFWriteData(TIFF* tif, TIFFDirEntry* dir, char* cp) { tsize_t cc; if (tif->tif_flags & TIFF_SWAB) { switch (dir->tdir_type) { case TIFF_SHORT: case TIFF_SSHORT: TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count); break; case TIFF_LONG: case TIFF_SLONG: case TIFF_FLOAT: TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count); break; case TIFF_RATIONAL: case TIFF_SRATIONAL: TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count); break; case TIFF_DOUBLE: TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count); break; } } dir->tdir_offset = tif->tif_dataoff; cc = dir->tdir_count * tiffDataWidth[dir->tdir_type]; if (SeekOK(tif, dir->tdir_offset) && WriteOK(tif, cp, cc)) { tif->tif_dataoff += (cc + 1) & ~1; return (1); } TIFFError(tif->tif_name, "Error writing data for field \"%s\"", _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name); return (0); } /* * Similar to TIFFWriteDirectory(), but if the directory has already * been written once, it is relocated to the end of the file, in case it * has changed in size. Note that this will result in the loss of the * previously used directory space. */ int TIFFRewriteDirectory( TIFF *tif ) { static const char module[] = "TIFFRewriteDirectory"; /* We don't need to do anything special if it hasn't been written. */ if( tif->tif_diroff == 0 ) return TIFFWriteDirectory( tif ); /* ** Find and zero the pointer to this directory, so that TIFFLinkDirectory ** will cause it to be added after this directories current pre-link. */ /* Is it the first directory in the file? */ if (tif->tif_header.tiff_diroff == tif->tif_diroff) { tif->tif_header.tiff_diroff = 0; tif->tif_diroff = 0; #define HDROFF(f) ((toff_t) &(((TIFFHeader*) 0)->f)) TIFFSeekFile(tif, HDROFF(tiff_diroff), SEEK_SET); if (!WriteOK(tif, &(tif->tif_header.tiff_diroff), sizeof (tif->tif_diroff))) { TIFFError(tif->tif_name, "Error updating TIFF header"); return (0); } } else { toff_t nextdir, off; nextdir = tif->tif_header.tiff_diroff; do { uint16 dircount; if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount, sizeof (dircount))) { TIFFError(module, "Error fetching directory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); (void) TIFFSeekFile(tif, dircount * sizeof (TIFFDirEntry), SEEK_CUR); if (!ReadOK(tif, &nextdir, sizeof (nextdir))) { TIFFError(module, "Error fetching directory link"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextdir); } while (nextdir != tif->tif_diroff && nextdir != 0); off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */ (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET); tif->tif_diroff = 0; if (!WriteOK(tif, &(tif->tif_diroff), sizeof (nextdir))) { TIFFError(module, "Error writing directory link"); return (0); } } /* ** Now use TIFFWriteDirectory() normally. */ return TIFFWriteDirectory( tif ); } /* * Link the current directory into the * directory chain for the file. */ static int TIFFLinkDirectory(TIFF* tif) { static const char module[] = "TIFFLinkDirectory"; toff_t nextdir; toff_t diroff, off; tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1; diroff = tif->tif_diroff; if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&diroff); #if SUBIFD_SUPPORT if (tif->tif_flags & TIFF_INSUBIFD) { (void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET); if (!WriteOK(tif, &diroff, sizeof (diroff))) { TIFFError(module, "%s: Error writing SubIFD directory link", tif->tif_name); return (0); } /* * Advance to the next SubIFD or, if this is * the last one configured, revert back to the * normal directory linkage. */ if (--tif->tif_nsubifd) tif->tif_subifdoff += sizeof (diroff); else tif->tif_flags &= ~TIFF_INSUBIFD; return (1); } #endif if (tif->tif_header.tiff_diroff == 0) { /* * First directory, overwrite offset in header. */ tif->tif_header.tiff_diroff = tif->tif_diroff; #define HDROFF(f) ((toff_t) &(((TIFFHeader*) 0)->f)) (void) TIFFSeekFile(tif, HDROFF(tiff_diroff), SEEK_SET); if (!WriteOK(tif, &diroff, sizeof (diroff))) { TIFFError(tif->tif_name, "Error writing TIFF header"); return (0); } return (1); } /* * Not the first directory, search to the last and append. */ nextdir = tif->tif_header.tiff_diroff; do { uint16 dircount; if (!SeekOK(tif, nextdir) || !ReadOK(tif, &dircount, sizeof (dircount))) { TIFFError(module, "Error fetching directory count"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); (void) TIFFSeekFile(tif, dircount * sizeof (TIFFDirEntry), SEEK_CUR); if (!ReadOK(tif, &nextdir, sizeof (nextdir))) { TIFFError(module, "Error fetching directory link"); return (0); } if (tif->tif_flags & TIFF_SWAB) TIFFSwabLong(&nextdir); } while (nextdir != 0); off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */ (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET); if (!WriteOK(tif, &diroff, sizeof (diroff))) { TIFFError(module, "Error writing directory link"); return (0); } return (1); } gamera-3.3.3/src/libtiff/tif_dumpmode.c0000644000076500000000000000577610714675674017030 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * "Null" Compression Algorithm Support. */ #include "tiffiop.h" #include /* * Encode a hunk of pixels. */ static int DumpModeEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s) { (void) s; while (cc > 0) { tsize_t n; n = cc; if (tif->tif_rawcc + n > tif->tif_rawdatasize) n = tif->tif_rawdatasize - tif->tif_rawcc; assert( n > 0 ); /* * Avoid copy if client has setup raw * data buffer to avoid extra copy. */ if (tif->tif_rawcp != pp) _TIFFmemcpy(tif->tif_rawcp, pp, n); tif->tif_rawcp += n; tif->tif_rawcc += n; pp += n; cc -= n; if (tif->tif_rawcc >= tif->tif_rawdatasize && !TIFFFlushData1(tif)) return (-1); } return (1); } /* * Decode a hunk of pixels. */ static int DumpModeDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) { (void) s; if (tif->tif_rawcc < cc) { TIFFError(tif->tif_name, "DumpModeDecode: Not enough data for scanline %d", tif->tif_row); return (0); } /* * Avoid copy if client has setup raw * data buffer to avoid extra copy. */ if (tif->tif_rawcp != buf) _TIFFmemcpy(buf, tif->tif_rawcp, cc); tif->tif_rawcp += cc; tif->tif_rawcc -= cc; return (1); } /* * Seek forwards nrows in the current strip. */ static int DumpModeSeek(TIFF* tif, uint32 nrows) { tif->tif_rawcp += nrows * tif->tif_scanlinesize; tif->tif_rawcc -= nrows * tif->tif_scanlinesize; return (1); } /* * Initialize dump mode. */ int TIFFInitDumpMode(TIFF* tif, int scheme) { (void) scheme; tif->tif_decoderow = DumpModeDecode; tif->tif_decodestrip = DumpModeDecode; tif->tif_decodetile = DumpModeDecode; tif->tif_encoderow = DumpModeEncode; tif->tif_encodestrip = DumpModeEncode; tif->tif_encodetile = DumpModeEncode; tif->tif_seek = DumpModeSeek; return (1); } gamera-3.3.3/src/libtiff/tif_error.c0000644000076500000000000000312010714675674016324 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler handler) { TIFFErrorHandler prev = _TIFFerrorHandler; _TIFFerrorHandler = handler; return (prev); } void TIFFError(const char* module, const char* fmt, ...) { if (_TIFFerrorHandler) { va_list ap; va_start(ap, fmt); (*_TIFFerrorHandler)(module, fmt, ap); va_end(ap); } } gamera-3.3.3/src/libtiff/tif_fax3.c0000644000076500000000000012323510714675674016046 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef CCITT_SUPPORT /* * TIFF Library. * * CCITT Group 3 (T.4) and Group 4 (T.6) Compression Support. * * This file contains support for decoding and encoding TIFF * compression algorithms 2, 3, 4, and 32771. * * Decoder support is derived, with permission, from the code * in Frank Cringle's viewfax program; * Copyright (C) 1990, 1995 Frank D. Cringle. */ #include "tif_fax3.h" #define G3CODES #include "t4.h" #include #include /* * Compression+decompression state blocks are * derived from this ``base state'' block. */ typedef struct { int rw_mode; /* O_RDONLY for decode, else encode */ int mode; /* operating mode */ uint32 rowbytes; /* bytes in a decoded scanline */ uint32 rowpixels; /* pixels in a scanline */ uint16 cleanfaxdata; /* CleanFaxData tag */ uint32 badfaxrun; /* BadFaxRun tag */ uint32 badfaxlines; /* BadFaxLines tag */ uint32 groupoptions; /* Group 3/4 options tag */ uint32 recvparams; /* encoded Class 2 session params */ char* subaddress; /* subaddress string */ uint32 recvtime; /* time spent receiving (secs) */ TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ } Fax3BaseState; #define Fax3State(tif) ((Fax3BaseState*) (tif)->tif_data) typedef struct { Fax3BaseState b; const u_char* bitmap; /* bit reversal table */ uint32 data; /* current i/o byte/word */ int bit; /* current i/o bit in byte */ int EOLcnt; /* count of EOL codes recognized */ TIFFFaxFillFunc fill; /* fill routine */ uint32* runs; /* b&w runs for current/previous row */ uint32* refruns; /* runs for reference line */ uint32* curruns; /* runs for current line */ } Fax3DecodeState; #define DecoderState(tif) ((Fax3DecodeState*) Fax3State(tif)) typedef enum { G3_1D, G3_2D } Ttag; typedef struct { Fax3BaseState b; int data; /* current i/o byte */ int bit; /* current i/o bit in byte */ Ttag tag; /* encoding state */ u_char* refline; /* reference line for 2d decoding */ int k; /* #rows left that can be 2d encoded */ int maxk; /* max #rows that can be 2d encoded */ } Fax3EncodeState; #define EncoderState(tif) ((Fax3EncodeState*) Fax3State(tif)) #define is2DEncoding(sp) \ (sp->b.groupoptions & GROUP3OPT_2DENCODING) #define isAligned(p,t) ((((u_long)(p)) & (sizeof (t)-1)) == 0) /* * Group 3 and Group 4 Decoding. */ /* * These macros glue the TIFF library state to * the state expected by Frank's decoder. */ #define DECLARE_STATE(tif, sp, mod) \ static const char module[] = mod; \ Fax3DecodeState* sp = DecoderState(tif); \ int a0; /* reference element */ \ int lastx = sp->b.rowpixels; /* last element in row */ \ uint32 BitAcc; /* bit accumulator */ \ int BitsAvail; /* # valid bits in BitAcc */ \ int RunLength; /* length of current run */ \ u_char* cp; /* next byte of input data */ \ u_char* ep; /* end of input data */ \ uint32* pa; /* place to stuff next run */ \ uint32* thisrun; /* current row's run array */ \ int EOLcnt; /* # EOL codes recognized */ \ const u_char* bitmap = sp->bitmap; /* input data bit reverser */ \ const TIFFFaxTabEnt* TabEnt #define DECLARE_STATE_2D(tif, sp, mod) \ DECLARE_STATE(tif, sp, mod); \ int b1; /* next change on prev line */ \ uint32* pb /* next run in reference line */\ /* * Load any state that may be changed during decoding. */ #define CACHE_STATE(tif, sp) do { \ BitAcc = sp->data; \ BitsAvail = sp->bit; \ EOLcnt = sp->EOLcnt; \ cp = (unsigned char*) tif->tif_rawcp; \ ep = cp + tif->tif_rawcc; \ } while (0) /* * Save state possibly changed during decoding. */ #define UNCACHE_STATE(tif, sp) do { \ sp->bit = BitsAvail; \ sp->data = BitAcc; \ sp->EOLcnt = EOLcnt; \ tif->tif_rawcc -= (tidata_t) cp - tif->tif_rawcp; \ tif->tif_rawcp = (tidata_t) cp; \ } while (0) /* * Setup state for decoding a strip. */ static int Fax3PreDecode(TIFF* tif, tsample_t s) { Fax3DecodeState* sp = DecoderState(tif); (void) s; assert(sp != NULL); sp->bit = 0; /* force initial read */ sp->data = 0; sp->EOLcnt = 0; /* force initial scan for EOL */ /* * Decoder assumes lsb-to-msb bit order. Note that we select * this here rather than in Fax3SetupState so that viewers can * hold the image open, fiddle with the FillOrder tag value, * and then re-decode the image. Otherwise they'd need to close * and open the image to get the state reset. */ sp->bitmap = TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB); if (sp->refruns) { /* init reference line to white */ sp->refruns[0] = (uint32) sp->b.rowpixels; sp->refruns[1] = 0; } return (1); } /* * Routine for handling various errors/conditions. * Note how they are "glued into the decoder" by * overriding the definitions used by the decoder. */ static void Fax3Unexpected(const char* module, TIFF* tif, uint32 a0) { TIFFError(module, "%s: Bad code word at scanline %d (x %lu)", tif->tif_name, tif->tif_row, (u_long) a0); } #define unexpected(table, a0) Fax3Unexpected(module, tif, a0) static void Fax3Extension(const char* module, TIFF* tif, uint32 a0) { TIFFError(module, "%s: Uncompressed data (not supported) at scanline %d (x %lu)", tif->tif_name, tif->tif_row, (u_long) a0); } #define extension(a0) Fax3Extension(module, tif, a0) static void Fax3BadLength(const char* module, TIFF* tif, uint32 a0, uint32 lastx) { TIFFWarning(module, "%s: %s at scanline %d (got %lu, expected %lu)", tif->tif_name, a0 < lastx ? "Premature EOL" : "Line length mismatch", tif->tif_row, (u_long) a0, (u_long) lastx); } #define badlength(a0,lastx) Fax3BadLength(module, tif, a0, lastx) static void Fax3PrematureEOF(const char* module, TIFF* tif, uint32 a0) { TIFFWarning(module, "%s: Premature EOF at scanline %d (x %lu)", tif->tif_name, tif->tif_row, (u_long) a0); } #define prematureEOF(a0) Fax3PrematureEOF(module, tif, a0) #define Nop /* * Decode the requested amount of G3 1D-encoded data. */ static int Fax3Decode1D(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) { DECLARE_STATE(tif, sp, "Fax3Decode1D"); (void) s; CACHE_STATE(tif, sp); thisrun = sp->curruns; while ((long)occ > 0) { a0 = 0; RunLength = 0; pa = thisrun; #ifdef FAX3_DEBUG printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); printf("-------------------- %d\n", tif->tif_row); fflush(stdout); #endif SYNC_EOL(EOF1D); EXPAND1D(EOF1Da); (*sp->fill)(buf, thisrun, pa, lastx); buf += sp->b.rowbytes; occ -= sp->b.rowbytes; if (occ != 0) tif->tif_row++; continue; EOF1D: /* premature EOF */ CLEANUP_RUNS(); EOF1Da: /* premature EOF */ (*sp->fill)(buf, thisrun, pa, lastx); UNCACHE_STATE(tif, sp); return (-1); } UNCACHE_STATE(tif, sp); return (1); } #define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; } /* * Decode the requested amount of G3 2D-encoded data. */ static int Fax3Decode2D(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) { DECLARE_STATE_2D(tif, sp, "Fax3Decode2D"); int is1D; /* current line is 1d/2d-encoded */ (void) s; CACHE_STATE(tif, sp); while ((long)occ > 0) { a0 = 0; RunLength = 0; pa = thisrun = sp->curruns; #ifdef FAX3_DEBUG printf("\nBitAcc=%08X, BitsAvail = %d EOLcnt = %d", BitAcc, BitsAvail, EOLcnt); #endif SYNC_EOL(EOF2D); NeedBits8(1, EOF2D); is1D = GetBits(1); /* 1D/2D-encoding tag bit */ ClrBits(1); #ifdef FAX3_DEBUG printf(" %s\n-------------------- %d\n", is1D ? "1D" : "2D", tif->tif_row); fflush(stdout); #endif pb = sp->refruns; b1 = *pb++; if (is1D) EXPAND1D(EOF2Da); else EXPAND2D(EOF2Da); (*sp->fill)(buf, thisrun, pa, lastx); SETVAL(0); /* imaginary change for reference */ SWAP(uint32*, sp->curruns, sp->refruns); buf += sp->b.rowbytes; occ -= sp->b.rowbytes; if (occ != 0) tif->tif_row++; continue; EOF2D: /* premature EOF */ CLEANUP_RUNS(); EOF2Da: /* premature EOF */ (*sp->fill)(buf, thisrun, pa, lastx); UNCACHE_STATE(tif, sp); return (-1); } UNCACHE_STATE(tif, sp); return (1); } #undef SWAP /* * The ZERO & FILL macros must handle spans < 2*sizeof(long) bytes. * For machines with 64-bit longs this is <16 bytes; otherwise * this is <8 bytes. We optimize the code here to reflect the * machine characteristics. */ #if defined(__alpha) || _MIPS_SZLONG == 64 || defined(__LP64__) #define FILL(n, cp) \ switch (n) { \ case 15:(cp)[14] = 0xff; case 14:(cp)[13] = 0xff; case 13: (cp)[12] = 0xff;\ case 12:(cp)[11] = 0xff; case 11:(cp)[10] = 0xff; case 10: (cp)[9] = 0xff;\ case 9: (cp)[8] = 0xff; case 8: (cp)[7] = 0xff; case 7: (cp)[6] = 0xff;\ case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; case 4: (cp)[3] = 0xff;\ case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \ case 1: (cp)[0] = 0xff; (cp) += (n); case 0: ; \ } #define ZERO(n, cp) \ switch (n) { \ case 15:(cp)[14] = 0; case 14:(cp)[13] = 0; case 13: (cp)[12] = 0; \ case 12:(cp)[11] = 0; case 11:(cp)[10] = 0; case 10: (cp)[9] = 0; \ case 9: (cp)[8] = 0; case 8: (cp)[7] = 0; case 7: (cp)[6] = 0; \ case 6: (cp)[5] = 0; case 5: (cp)[4] = 0; case 4: (cp)[3] = 0; \ case 3: (cp)[2] = 0; case 2: (cp)[1] = 0; \ case 1: (cp)[0] = 0; (cp) += (n); case 0: ; \ } #else #define FILL(n, cp) \ switch (n) { \ case 7: (cp)[6] = 0xff; case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; \ case 4: (cp)[3] = 0xff; case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \ case 1: (cp)[0] = 0xff; (cp) += (n); case 0: ; \ } #define ZERO(n, cp) \ switch (n) { \ case 7: (cp)[6] = 0; case 6: (cp)[5] = 0; case 5: (cp)[4] = 0; \ case 4: (cp)[3] = 0; case 3: (cp)[2] = 0; case 2: (cp)[1] = 0; \ case 1: (cp)[0] = 0; (cp) += (n); case 0: ; \ } #endif /* * Bit-fill a row according to the white/black * runs generated during G3/G4 decoding. */ void _TIFFFax3fillruns(u_char* buf, uint32* runs, uint32* erun, uint32 lastx) { static const unsigned char _fillmasks[] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff }; u_char* cp; uint32 x, bx, run; int32 n, nw; long* lp; if ((erun-runs)&1) *erun++ = 0; x = 0; for (; runs < erun; runs += 2) { run = runs[0]; if (x+run > lastx || run > lastx ) run = runs[0] = (uint32) (lastx - x); if (run) { cp = buf + (x>>3); bx = x&7; if (run > 8-bx) { if (bx) { /* align to byte boundary */ *cp++ &= 0xff << (8-bx); run -= 8-bx; } if( (n = run >> 3) != 0 ) { /* multiple bytes to fill */ if ((n/sizeof (long)) > 1) { /* * Align to longword boundary and fill. */ for (; n && !isAligned(cp, long); n--) *cp++ = 0x00; lp = (long*) cp; nw = (int32)(n / sizeof (long)); n -= nw * sizeof (long); do { *lp++ = 0L; } while (--nw); cp = (u_char*) lp; } ZERO(n, cp); run &= 7; } if (run) cp[0] &= 0xff >> run; } else cp[0] &= ~(_fillmasks[run]>>bx); x += runs[0]; } run = runs[1]; if (x+run > lastx || run > lastx ) run = runs[1] = lastx - x; if (run) { cp = buf + (x>>3); bx = x&7; if (run > 8-bx) { if (bx) { /* align to byte boundary */ *cp++ |= 0xff >> bx; run -= 8-bx; } if( (n = run>>3) != 0 ) { /* multiple bytes to fill */ if ((n/sizeof (long)) > 1) { /* * Align to longword boundary and fill. */ for (; n && !isAligned(cp, long); n--) *cp++ = 0xff; lp = (long*) cp; nw = (int32)(n / sizeof (long)); n -= nw * sizeof (long); do { *lp++ = -1L; } while (--nw); cp = (u_char*) lp; } FILL(n, cp); run &= 7; } if (run) cp[0] |= 0xff00 >> run; } else cp[0] |= _fillmasks[run]>>bx; x += runs[1]; } } assert(x == lastx); } #undef ZERO #undef FILL /* * Setup G3/G4-related compression/decompression state * before data is processed. This routine is called once * per image -- it sets up different state based on whether * or not decoding or encoding is being done and whether * 1D- or 2D-encoded data is involved. */ static int Fax3SetupState(TIFF* tif) { TIFFDirectory* td = &tif->tif_dir; Fax3BaseState* sp = Fax3State(tif); long rowbytes, rowpixels; int needsRefLine; if (td->td_bitspersample != 1) { TIFFError(tif->tif_name, "Bits/sample must be 1 for Group 3/4 encoding/decoding"); return (0); } /* * Calculate the scanline/tile widths. */ if (isTiled(tif)) { rowbytes = TIFFTileRowSize(tif); rowpixels = td->td_tilewidth; } else { rowbytes = TIFFScanlineSize(tif); rowpixels = td->td_imagewidth; } sp->rowbytes = (uint32) rowbytes; sp->rowpixels = (uint32) rowpixels; /* * Allocate any additional space required for decoding/encoding. */ needsRefLine = ( (sp->groupoptions & GROUP3OPT_2DENCODING) || td->td_compression == COMPRESSION_CCITTFAX4 ); if (sp->rw_mode == O_RDONLY) { /* 1d/2d decoding */ Fax3DecodeState* dsp = DecoderState(tif); uint32 nruns = needsRefLine ? 2*TIFFroundup(rowpixels,32) : rowpixels; dsp->runs = (uint32*) _TIFFmalloc((2*nruns+3)*sizeof (uint32)); if (dsp->runs == NULL) { TIFFError("Fax3SetupState", "%s: No space for Group 3/4 run arrays", tif->tif_name); return (0); } dsp->curruns = dsp->runs; if (needsRefLine) dsp->refruns = dsp->runs + (nruns>>1); else dsp->refruns = NULL; if (is2DEncoding(dsp)) { /* NB: default is 1D routine */ tif->tif_decoderow = Fax3Decode2D; tif->tif_decodestrip = Fax3Decode2D; tif->tif_decodetile = Fax3Decode2D; } } else if (needsRefLine) { /* 2d encoding */ Fax3EncodeState* esp = EncoderState(tif); /* * 2d encoding requires a scanline * buffer for the ``reference line''; the * scanline against which delta encoding * is referenced. The reference line must * be initialized to be ``white'' (done elsewhere). */ esp->refline = (u_char*) _TIFFmalloc(rowbytes); if (esp->refline == NULL) { TIFFError("Fax3SetupState", "%s: No space for Group 3/4 reference line", tif->tif_name); return (0); } } else /* 1d encoding */ EncoderState(tif)->refline = NULL; return (1); } /* * CCITT Group 3 FAX Encoding. */ #define Fax3FlushBits(tif, sp) { \ if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \ (void) TIFFFlushData1(tif); \ *(tif)->tif_rawcp++ = (sp)->data; \ (tif)->tif_rawcc++; \ (sp)->data = 0, (sp)->bit = 8; \ } #define _FlushBits(tif) { \ if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \ (void) TIFFFlushData1(tif); \ *(tif)->tif_rawcp++ = data; \ (tif)->tif_rawcc++; \ data = 0, bit = 8; \ } static const int _msbmask[9] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; #define _PutBits(tif, bits, length) { \ while (length > bit) { \ data |= bits >> (length - bit); \ length -= bit; \ _FlushBits(tif); \ } \ data |= (bits & _msbmask[length]) << (bit - length); \ bit -= length; \ if (bit == 0) \ _FlushBits(tif); \ } /* * Write a variable-length bit-value to * the output stream. Values are * assumed to be at most 16 bits. */ static void Fax3PutBits(TIFF* tif, u_int bits, u_int length) { Fax3EncodeState* sp = EncoderState(tif); u_int bit = sp->bit; int data = sp->data; _PutBits(tif, bits, length); sp->data = data; sp->bit = bit; } /* * Write a code to the output stream. */ #define putcode(tif, te) Fax3PutBits(tif, (te)->code, (te)->length) #ifdef FAX3_DEBUG #define DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B") #define DEBUG_PRINT(what,len) { \ int t; \ printf("%08X/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), len); \ for (t = length-1; t >= 0; t--) \ putchar(code & (1<bit; int data = sp->data; u_int code, length; while (span >= 2624) { const tableentry* te = &tab[63 + (2560>>6)]; code = te->code, length = te->length; #ifdef FAX3_DEBUG DEBUG_PRINT("MakeUp", te->runlen); #endif _PutBits(tif, code, length); span -= te->runlen; } if (span >= 64) { const tableentry* te = &tab[63 + (span>>6)]; assert(te->runlen == 64*(span>>6)); code = te->code, length = te->length; #ifdef FAX3_DEBUG DEBUG_PRINT("MakeUp", te->runlen); #endif _PutBits(tif, code, length); span -= te->runlen; } code = tab[span].code, length = tab[span].length; #ifdef FAX3_DEBUG DEBUG_PRINT(" Term", tab[span].runlen); #endif _PutBits(tif, code, length); sp->data = data; sp->bit = bit; } /* * Write an EOL code to the output stream. The zero-fill * logic for byte-aligning encoded scanlines is handled * here. We also handle writing the tag bit for the next * scanline when doing 2d encoding. */ static void Fax3PutEOL(TIFF* tif) { Fax3EncodeState* sp = EncoderState(tif); u_int bit = sp->bit; int data = sp->data; u_int code, length, tparm; if (sp->b.groupoptions & GROUP3OPT_FILLBITS) { /* * Force bit alignment so EOL will terminate on * a byte boundary. That is, force the bit alignment * to 16-12 = 4 before putting out the EOL code. */ int align = 8 - 4; if (align != sp->bit) { if (align > sp->bit) align = sp->bit + (8 - align); else align = sp->bit - align; code = 0; tparm=align; _PutBits(tif, 0, tparm); } } code = EOL, length = 12; if (is2DEncoding(sp)) code = (code<<1) | (sp->tag == G3_1D), length++; _PutBits(tif, code, length); sp->data = data; sp->bit = bit; } /* * Reset encoding state at the start of a strip. */ static int Fax3PreEncode(TIFF* tif, tsample_t s) { Fax3EncodeState* sp = EncoderState(tif); (void) s; assert(sp != NULL); sp->bit = 8; sp->data = 0; sp->tag = G3_1D; /* * This is necessary for Group 4; otherwise it isn't * needed because the first scanline of each strip ends * up being copied into the refline. */ if (sp->refline) _TIFFmemset(sp->refline, 0x00, sp->b.rowbytes); if (is2DEncoding(sp)) { float res = tif->tif_dir.td_yresolution; /* * The CCITT spec says that when doing 2d encoding, you * should only do it on K consecutive scanlines, where K * depends on the resolution of the image being encoded * (2 for <= 200 lpi, 4 for > 200 lpi). Since the directory * code initializes td_yresolution to 0, this code will * select a K of 2 unless the YResolution tag is set * appropriately. (Note also that we fudge a little here * and use 150 lpi to avoid problems with units conversion.) */ if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER) res *= 2.54f; /* convert to inches */ sp->maxk = (res > 150 ? 4 : 2); sp->k = sp->maxk-1; } else sp->k = sp->maxk = 0; return (1); } static const u_char zeroruns[256] = { 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */ }; static const u_char oneruns[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */ }; /* * On certain systems it pays to inline * the routines that find pixel spans. */ #ifdef VAXC static int32 find0span(u_char*, int32, int32); static int32 find1span(u_char*, int32, int32); #pragma inline(find0span,find1span) #endif /* * Find a span of ones or zeros using the supplied * table. The ``base'' of the bit string is supplied * along with the start+end bit indices. */ INLINE static int32 find0span(u_char* bp, int32 bs, int32 be) { int32 bits = be - bs; int32 n, span; bp += bs>>3; /* * Check partial byte on lhs. */ if (bits > 0 && (n = (bs & 7))) { span = zeroruns[(*bp << n) & 0xff]; if (span > 8-n) /* table value too generous */ span = 8-n; if (span > bits) /* constrain span to bit range */ span = bits; if (n+span < 8) /* doesn't extend to edge of byte */ return (span); bits -= span; bp++; } else span = 0; if (bits >= 2*8*sizeof (long)) { long* lp; /* * Align to longword boundary and check longwords. */ while (!isAligned(bp, long)) { if (*bp != 0x00) return (span + zeroruns[*bp]); span += 8, bits -= 8; bp++; } lp = (long*) bp; while (bits >= 8*sizeof (long) && *lp == 0) { span += 8*sizeof (long), bits -= 8*sizeof (long); lp++; } bp = (u_char*) lp; } /* * Scan full bytes for all 0's. */ while (bits >= 8) { if (*bp != 0x00) /* end of run */ return (span + zeroruns[*bp]); span += 8, bits -= 8; bp++; } /* * Check partial byte on rhs. */ if (bits > 0) { n = zeroruns[*bp]; span += (n > bits ? bits : n); } return (span); } INLINE static int32 find1span(u_char* bp, int32 bs, int32 be) { int32 bits = be - bs; int32 n, span; bp += bs>>3; /* * Check partial byte on lhs. */ if (bits > 0 && (n = (bs & 7))) { span = oneruns[(*bp << n) & 0xff]; if (span > 8-n) /* table value too generous */ span = 8-n; if (span > bits) /* constrain span to bit range */ span = bits; if (n+span < 8) /* doesn't extend to edge of byte */ return (span); bits -= span; bp++; } else span = 0; if (bits >= 2*8*sizeof (long)) { long* lp; /* * Align to longword boundary and check longwords. */ while (!isAligned(bp, long)) { if (*bp != 0xff) return (span + oneruns[*bp]); span += 8, bits -= 8; bp++; } lp = (long*) bp; while (bits >= 8*sizeof (long) && *lp == ~0) { span += 8*sizeof (long), bits -= 8*sizeof (long); lp++; } bp = (u_char*) lp; } /* * Scan full bytes for all 1's. */ while (bits >= 8) { if (*bp != 0xff) /* end of run */ return (span + oneruns[*bp]); span += 8, bits -= 8; bp++; } /* * Check partial byte on rhs. */ if (bits > 0) { n = oneruns[*bp]; span += (n > bits ? bits : n); } return (span); } /* * Return the offset of the next bit in the range * [bs..be] that is different from the specified * color. The end, be, is returned if no such bit * exists. */ #define finddiff(_cp, _bs, _be, _color) \ (_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be))) /* * Like finddiff, but also check the starting bit * against the end in case start > end. */ #define finddiff2(_cp, _bs, _be, _color) \ (_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be) /* * 1d-encode a row of pixels. The encoding is * a sequence of all-white or all-black spans * of pixels encoded with Huffman codes. */ static int Fax3Encode1DRow(TIFF* tif, u_char* bp, uint32 bits) { Fax3EncodeState* sp = EncoderState(tif); int32 span; uint32 bs = 0; for (;;) { span = find0span(bp, bs, bits); /* white span */ putspan(tif, span, TIFFFaxWhiteCodes); bs += span; if (bs >= bits) break; span = find1span(bp, bs, bits); /* black span */ putspan(tif, span, TIFFFaxBlackCodes); bs += span; if (bs >= bits) break; } if (sp->b.mode & (FAXMODE_BYTEALIGN|FAXMODE_WORDALIGN)) { if (sp->bit != 8) /* byte-align */ Fax3FlushBits(tif, sp); if ((sp->b.mode&FAXMODE_WORDALIGN) && !isAligned(tif->tif_rawcp, uint16)) Fax3FlushBits(tif, sp); } return (1); } static const tableentry horizcode = { 3, 0x1 }; /* 001 */ static const tableentry passcode = { 4, 0x1 }; /* 0001 */ static const tableentry vcodes[7] = { { 7, 0x03 }, /* 0000 011 */ { 6, 0x03 }, /* 0000 11 */ { 3, 0x03 }, /* 011 */ { 1, 0x1 }, /* 1 */ { 3, 0x2 }, /* 010 */ { 6, 0x02 }, /* 0000 10 */ { 7, 0x02 } /* 0000 010 */ }; /* * 2d-encode a row of pixels. Consult the CCITT * documentation for the algorithm. */ static int Fax3Encode2DRow(TIFF* tif, u_char* bp, u_char* rp, uint32 bits) { #define PIXEL(buf,ix) ((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1) uint32 a0 = 0; uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0)); uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0)); uint32 a2, b2; for (;;) { b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1)); if (b2 >= a1) { int32 d = b1 - a1; if (!(-3 <= d && d <= 3)) { /* horizontal mode */ a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1)); putcode(tif, &horizcode); if (a0+a1 == 0 || PIXEL(bp, a0) == 0) { putspan(tif, a1-a0, TIFFFaxWhiteCodes); putspan(tif, a2-a1, TIFFFaxBlackCodes); } else { putspan(tif, a1-a0, TIFFFaxBlackCodes); putspan(tif, a2-a1, TIFFFaxWhiteCodes); } a0 = a2; } else { /* vertical mode */ putcode(tif, &vcodes[d+3]); a0 = a1; } } else { /* pass mode */ putcode(tif, &passcode); a0 = b2; } if (a0 >= bits) break; a1 = finddiff(bp, a0, bits, PIXEL(bp,a0)); b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0)); b1 = finddiff(rp, b1, bits, PIXEL(bp,a0)); } return (1); #undef PIXEL } /* * Encode a buffer of pixels. */ static int Fax3Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { Fax3EncodeState* sp = EncoderState(tif); (void) s; while ((long)cc > 0) { if ((sp->b.mode & FAXMODE_NOEOL) == 0) Fax3PutEOL(tif); if (is2DEncoding(sp)) { if (sp->tag == G3_1D) { if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels)) return (0); sp->tag = G3_2D; } else { if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels)) return (0); sp->k--; } if (sp->k == 0) { sp->tag = G3_1D; sp->k = sp->maxk-1; } else _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes); } else { if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels)) return (0); } bp += sp->b.rowbytes; cc -= sp->b.rowbytes; if (cc != 0) tif->tif_row++; } return (1); } static int Fax3PostEncode(TIFF* tif) { Fax3EncodeState* sp = EncoderState(tif); if (sp->bit != 8) Fax3FlushBits(tif, sp); return (1); } static void Fax3Close(TIFF* tif) { if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0) { Fax3EncodeState* sp = EncoderState(tif); u_int code = EOL; u_int length = 12; int i; if (is2DEncoding(sp)) code = (code<<1) | (sp->tag == G3_1D), length++; for (i = 0; i < 6; i++) Fax3PutBits(tif, code, length); Fax3FlushBits(tif, sp); } } static void Fax3Cleanup(TIFF* tif) { if (tif->tif_data) { if (Fax3State(tif)->rw_mode == O_RDONLY) { Fax3DecodeState* sp = DecoderState(tif); if (sp->runs) _TIFFfree(sp->runs); } else { Fax3EncodeState* sp = EncoderState(tif); if (sp->refline) _TIFFfree(sp->refline); } if (Fax3State(tif)->subaddress) _TIFFfree(Fax3State(tif)->subaddress); _TIFFfree(tif->tif_data); tif->tif_data = NULL; } } #define FIELD_BADFAXLINES (FIELD_CODEC+0) #define FIELD_CLEANFAXDATA (FIELD_CODEC+1) #define FIELD_BADFAXRUN (FIELD_CODEC+2) #define FIELD_RECVPARAMS (FIELD_CODEC+3) #define FIELD_SUBADDRESS (FIELD_CODEC+4) #define FIELD_RECVTIME (FIELD_CODEC+5) #define FIELD_OPTIONS (FIELD_CODEC+6) static const TIFFFieldInfo faxFieldInfo[] = { { TIFFTAG_FAXMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO, FALSE, FALSE, "FaxMode" }, { TIFFTAG_FAXFILLFUNC, 0, 0, TIFF_ANY, FIELD_PSEUDO, FALSE, FALSE, "FaxFillFunc" }, { TIFFTAG_BADFAXLINES, 1, 1, TIFF_LONG, FIELD_BADFAXLINES, TRUE, FALSE, "BadFaxLines" }, { TIFFTAG_BADFAXLINES, 1, 1, TIFF_SHORT, FIELD_BADFAXLINES, TRUE, FALSE, "BadFaxLines" }, { TIFFTAG_CLEANFAXDATA, 1, 1, TIFF_SHORT, FIELD_CLEANFAXDATA, TRUE, FALSE, "CleanFaxData" }, { TIFFTAG_CONSECUTIVEBADFAXLINES,1,1, TIFF_LONG, FIELD_BADFAXRUN, TRUE, FALSE, "ConsecutiveBadFaxLines" }, { TIFFTAG_CONSECUTIVEBADFAXLINES,1,1, TIFF_SHORT, FIELD_BADFAXRUN, TRUE, FALSE, "ConsecutiveBadFaxLines" }, { TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, FIELD_RECVPARAMS, TRUE, FALSE, "FaxRecvParams" }, { TIFFTAG_FAXSUBADDRESS, -1,-1, TIFF_ASCII, FIELD_SUBADDRESS, TRUE, FALSE, "FaxSubAddress" }, { TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, FIELD_RECVTIME, TRUE, FALSE, "FaxRecvTime" }, }; static const TIFFFieldInfo fax3FieldInfo[] = { { TIFFTAG_GROUP3OPTIONS, 1, 1, TIFF_LONG, FIELD_OPTIONS, FALSE, FALSE, "Group3Options" }, }; static const TIFFFieldInfo fax4FieldInfo[] = { { TIFFTAG_GROUP4OPTIONS, 1, 1, TIFF_LONG, FIELD_OPTIONS, FALSE, FALSE, "Group4Options" }, }; #define N(a) (sizeof (a) / sizeof (a[0])) static int Fax3VSetField(TIFF* tif, ttag_t tag, va_list ap) { Fax3BaseState* sp = Fax3State(tif); switch (tag) { case TIFFTAG_FAXMODE: sp->mode = va_arg(ap, int); return (1); /* NB: pseudo tag */ case TIFFTAG_FAXFILLFUNC: if (sp->rw_mode == O_RDONLY) DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc); return (1); /* NB: pseudo tag */ case TIFFTAG_GROUP3OPTIONS: case TIFFTAG_GROUP4OPTIONS: sp->groupoptions = va_arg(ap, uint32); break; case TIFFTAG_BADFAXLINES: sp->badfaxlines = va_arg(ap, uint32); break; case TIFFTAG_CLEANFAXDATA: sp->cleanfaxdata = (uint16) va_arg(ap, int); break; case TIFFTAG_CONSECUTIVEBADFAXLINES: sp->badfaxrun = va_arg(ap, uint32); break; case TIFFTAG_FAXRECVPARAMS: sp->recvparams = va_arg(ap, uint32); break; case TIFFTAG_FAXSUBADDRESS: _TIFFsetString(&sp->subaddress, va_arg(ap, char*)); break; case TIFFTAG_FAXRECVTIME: sp->recvtime = va_arg(ap, uint32); break; default: return (*sp->vsetparent)(tif, tag, ap); } TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit); tif->tif_flags |= TIFF_DIRTYDIRECT; return (1); } static int Fax3VGetField(TIFF* tif, ttag_t tag, va_list ap) { Fax3BaseState* sp = Fax3State(tif); switch (tag) { case TIFFTAG_FAXMODE: *va_arg(ap, int*) = sp->mode; break; case TIFFTAG_FAXFILLFUNC: if (sp->rw_mode == O_RDONLY) *va_arg(ap, TIFFFaxFillFunc*) = DecoderState(tif)->fill; break; case TIFFTAG_GROUP3OPTIONS: case TIFFTAG_GROUP4OPTIONS: *va_arg(ap, uint32*) = sp->groupoptions; break; case TIFFTAG_BADFAXLINES: *va_arg(ap, uint32*) = sp->badfaxlines; break; case TIFFTAG_CLEANFAXDATA: *va_arg(ap, uint16*) = sp->cleanfaxdata; break; case TIFFTAG_CONSECUTIVEBADFAXLINES: *va_arg(ap, uint32*) = sp->badfaxrun; break; case TIFFTAG_FAXRECVPARAMS: *va_arg(ap, uint32*) = sp->recvparams; break; case TIFFTAG_FAXSUBADDRESS: *va_arg(ap, char**) = sp->subaddress; break; case TIFFTAG_FAXRECVTIME: *va_arg(ap, uint32*) = sp->recvtime; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static void Fax3PrintDir(TIFF* tif, FILE* fd, long flags) { Fax3BaseState* sp = Fax3State(tif); (void) flags; if (TIFFFieldSet(tif,FIELD_OPTIONS)) { const char* sep = " "; if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) { fprintf(fd, " Group 4 Options:"); if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED) fprintf(fd, "%suncompressed data", sep); } else { fprintf(fd, " Group 3 Options:"); if (sp->groupoptions & GROUP3OPT_2DENCODING) fprintf(fd, "%s2-d encoding", sep), sep = "+"; if (sp->groupoptions & GROUP3OPT_FILLBITS) fprintf(fd, "%sEOL padding", sep), sep = "+"; if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED) fprintf(fd, "%suncompressed data", sep); } fprintf(fd, " (%lu = 0x%lx)\n", (u_long) sp->groupoptions, (u_long) sp->groupoptions); } if (TIFFFieldSet(tif,FIELD_CLEANFAXDATA)) { fprintf(fd, " Fax Data:"); switch (sp->cleanfaxdata) { case CLEANFAXDATA_CLEAN: fprintf(fd, " clean"); break; case CLEANFAXDATA_REGENERATED: fprintf(fd, " receiver regenerated"); break; case CLEANFAXDATA_UNCLEAN: fprintf(fd, " uncorrected errors"); break; } fprintf(fd, " (%u = 0x%x)\n", sp->cleanfaxdata, sp->cleanfaxdata); } if (TIFFFieldSet(tif,FIELD_BADFAXLINES)) fprintf(fd, " Bad Fax Lines: %lu\n", (u_long) sp->badfaxlines); if (TIFFFieldSet(tif,FIELD_BADFAXRUN)) fprintf(fd, " Consecutive Bad Fax Lines: %lu\n", (u_long) sp->badfaxrun); if (TIFFFieldSet(tif,FIELD_RECVPARAMS)) fprintf(fd, " Fax Receive Parameters: %08lx\n", (u_long) sp->recvparams); if (TIFFFieldSet(tif,FIELD_SUBADDRESS)) fprintf(fd, " Fax SubAddress: %s\n", sp->subaddress); if (TIFFFieldSet(tif,FIELD_RECVTIME)) fprintf(fd, " Fax Receive Time: %lu secs\n", (u_long) sp->recvtime); } static int InitCCITTFax3(TIFF* tif) { Fax3BaseState* sp; /* * Allocate state block so tag methods have storage to record values. */ if (tif->tif_mode == O_RDONLY) tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (Fax3DecodeState)); else tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (Fax3EncodeState)); if (tif->tif_data == NULL) { TIFFError("TIFFInitCCITTFax3", "%s: No space for state block", tif->tif_name); return (0); } sp = Fax3State(tif); sp->rw_mode = tif->tif_mode; /* * Merge codec-specific tag information and * override parent get/set field methods. */ _TIFFMergeFieldInfo(tif, faxFieldInfo, N(faxFieldInfo)); sp->vgetparent = tif->tif_vgetfield; tif->tif_vgetfield = Fax3VGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_vsetfield; tif->tif_vsetfield = Fax3VSetField; /* hook for codec tags */ tif->tif_printdir = Fax3PrintDir; /* hook for codec tags */ sp->groupoptions = 0; sp->recvparams = 0; sp->subaddress = NULL; if (sp->rw_mode == O_RDONLY) { tif->tif_flags |= TIFF_NOBITREV;/* decoder does bit reversal */ DecoderState(tif)->runs = NULL; TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns); } else EncoderState(tif)->refline = NULL; /* * Install codec methods. */ tif->tif_setupdecode = Fax3SetupState; tif->tif_predecode = Fax3PreDecode; tif->tif_decoderow = Fax3Decode1D; tif->tif_decodestrip = Fax3Decode1D; tif->tif_decodetile = Fax3Decode1D; tif->tif_setupencode = Fax3SetupState; tif->tif_preencode = Fax3PreEncode; tif->tif_postencode = Fax3PostEncode; tif->tif_encoderow = Fax3Encode; tif->tif_encodestrip = Fax3Encode; tif->tif_encodetile = Fax3Encode; tif->tif_close = Fax3Close; tif->tif_cleanup = Fax3Cleanup; return (1); } int TIFFInitCCITTFax3(TIFF* tif, int scheme) { if (InitCCITTFax3(tif)) { _TIFFMergeFieldInfo(tif, fax3FieldInfo, N(fax3FieldInfo)); /* * The default format is Class/F-style w/o RTC. */ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF); } else return (0); } /* * CCITT Group 4 (T.6) Facsimile-compatible * Compression Scheme Support. */ #define SWAP(t,a,b) { t x; x = (a); (a) = (b); (b) = x; } /* * Decode the requested amount of G4-encoded data. */ static int Fax4Decode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) { DECLARE_STATE_2D(tif, sp, "Fax4Decode"); (void) s; CACHE_STATE(tif, sp); while ((long)occ > 0) { a0 = 0; RunLength = 0; pa = thisrun = sp->curruns; pb = sp->refruns; b1 = *pb++; #ifdef FAX3_DEBUG printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); printf("-------------------- %d\n", tif->tif_row); fflush(stdout); #endif EXPAND2D(EOFG4); if (EOLcnt) goto EOFG4; (*sp->fill)(buf, thisrun, pa, lastx); SETVAL(0); /* imaginary change for reference */ SWAP(uint32*, sp->curruns, sp->refruns); buf += sp->b.rowbytes; occ -= sp->b.rowbytes; if (occ != 0) tif->tif_row++; continue; EOFG4: NeedBits16( 13, BADG4 ); BADG4: #ifdef FAX3_DEBUG if( GetBits(13) != 0x1001 ) fputs( "Bad RTC\n", stderr ); #endif ClrBits( 13 ); (*sp->fill)(buf, thisrun, pa, lastx); UNCACHE_STATE(tif, sp); return (-1); } UNCACHE_STATE(tif, sp); return (1); } #undef SWAP /* * Encode the requested amount of data. */ static int Fax4Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { Fax3EncodeState *sp = EncoderState(tif); (void) s; while ((long)cc > 0) { if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels)) return (0); _TIFFmemcpy(sp->refline, bp, sp->b.rowbytes); bp += sp->b.rowbytes; cc -= sp->b.rowbytes; if (cc != 0) tif->tif_row++; } return (1); } static int Fax4PostEncode(TIFF* tif) { Fax3EncodeState *sp = EncoderState(tif); /* terminate strip w/ EOFB */ Fax3PutBits(tif, EOL, 12); Fax3PutBits(tif, EOL, 12); if (sp->bit != 8) Fax3FlushBits(tif, sp); return (1); } int TIFFInitCCITTFax4(TIFF* tif, int scheme) { if (InitCCITTFax3(tif)) { /* reuse G3 support */ _TIFFMergeFieldInfo(tif, fax4FieldInfo, N(fax4FieldInfo)); tif->tif_decoderow = Fax4Decode; tif->tif_decodestrip = Fax4Decode; tif->tif_decodetile = Fax4Decode; tif->tif_encoderow = Fax4Encode; tif->tif_encodestrip = Fax4Encode; tif->tif_encodetile = Fax4Encode; tif->tif_postencode = Fax4PostEncode; /* * Suppress RTC at the end of each strip. */ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC); } else return (0); } /* * CCITT Group 3 1-D Modified Huffman RLE Compression Support. * (Compression algorithms 2 and 32771) */ /* * Decode the requested amount of RLE-encoded data. */ static int Fax3DecodeRLE(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) { DECLARE_STATE(tif, sp, "Fax3DecodeRLE"); int mode = sp->b.mode; (void) s; CACHE_STATE(tif, sp); thisrun = sp->curruns; while ((long)occ > 0) { a0 = 0; RunLength = 0; pa = thisrun; #ifdef FAX3_DEBUG printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail); printf("-------------------- %d\n", tif->tif_row); fflush(stdout); #endif EXPAND1D(EOFRLE); (*sp->fill)(buf, thisrun, pa, lastx); /* * Cleanup at the end of the row. */ if (mode & FAXMODE_BYTEALIGN) { int n = BitsAvail - (BitsAvail &~ 7); ClrBits(n); } else if (mode & FAXMODE_WORDALIGN) { int n = BitsAvail - (BitsAvail &~ 15); ClrBits(n); if (BitsAvail == 0 && !isAligned(cp, uint16)) cp++; } buf += sp->b.rowbytes; occ -= sp->b.rowbytes; if (occ != 0) tif->tif_row++; continue; EOFRLE: /* premature EOF */ (*sp->fill)(buf, thisrun, pa, lastx); UNCACHE_STATE(tif, sp); return (-1); } UNCACHE_STATE(tif, sp); return (1); } int TIFFInitCCITTRLE(TIFF* tif, int scheme) { if (InitCCITTFax3(tif)) { /* reuse G3 support */ tif->tif_decoderow = Fax3DecodeRLE; tif->tif_decodestrip = Fax3DecodeRLE; tif->tif_decodetile = Fax3DecodeRLE; /* * Suppress RTC+EOLs when encoding and byte-align data. */ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_BYTEALIGN); } else return (0); } int TIFFInitCCITTRLEW(TIFF* tif, int scheme) { if (InitCCITTFax3(tif)) { /* reuse G3 support */ tif->tif_decoderow = Fax3DecodeRLE; tif->tif_decodestrip = Fax3DecodeRLE; tif->tif_decodetile = Fax3DecodeRLE; /* * Suppress RTC+EOLs when encoding and word-align data. */ return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_WORDALIGN); } else return (0); } #endif /* CCITT_SUPPORT */ gamera-3.3.3/src/libtiff/tif_fax3.h0000644000076500000000000003665610714675674016065 0ustar chriswheel/* $Id: tif_fax3.h 158 2002-11-24 01:49:40Z karlmac $ */ /* * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _FAX3_ #define _FAX3_ /* * TIFF Library. * * CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support. * * Decoder support is derived, with permission, from the code * in Frank Cringle's viewfax program; * Copyright (C) 1990, 1995 Frank D. Cringle. */ #include "tiff.h" /* * To override the default routine used to image decoded * spans one can use the pseduo tag TIFFTAG_FAXFILLFUNC. * The routine must have the type signature given below; * for example: * * fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) * * where buf is place to set the bits, runs is the array of b&w run * lengths (white then black), erun is the last run in the array, and * lastx is the width of the row in pixels. Fill routines can assume * the run array has room for at least lastx runs and can overwrite * data in the run array as needed (e.g. to append zero runs to bring * the count up to a nice multiple). */ typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32); /* * The default run filler; made external for other decoders. */ #if defined(__cplusplus) extern "C" { #endif extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32); #if defined(__cplusplus) } #endif /* finite state machine codes */ #define S_Null 0 #define S_Pass 1 #define S_Horiz 2 #define S_V0 3 #define S_VR 4 #define S_VL 5 #define S_Ext 6 #define S_TermW 7 #define S_TermB 8 #define S_MakeUpW 9 #define S_MakeUpB 10 #define S_MakeUp 11 #define S_EOL 12 typedef struct { /* state table entry */ unsigned char State; /* see above */ unsigned char Width; /* width of code in bits */ uint32 Param; /* unsigned 32-bit run length in bits */ } TIFFFaxTabEnt; extern const TIFFFaxTabEnt TIFFFaxMainTable[]; extern const TIFFFaxTabEnt TIFFFaxWhiteTable[]; extern const TIFFFaxTabEnt TIFFFaxBlackTable[]; /* * The following macros define the majority of the G3/G4 decoder * algorithm using the state tables defined elsewhere. To build * a decoder you need some setup code and some glue code. Note * that you may also need/want to change the way the NeedBits* * macros get input data if, for example, you know the data to be * decoded is properly aligned and oriented (doing so before running * the decoder can be a big performance win). * * Consult the decoder in the TIFF library for an idea of what you * need to define and setup to make use of these definitions. * * NB: to enable a debugging version of these macros define FAX3_DEBUG * before including this file. Trace output goes to stdout. */ #ifndef EndOfData #define EndOfData() (cp >= ep) #endif /* * Need <=8 or <=16 bits of input data. Unlike viewfax we * cannot use/assume a word-aligned, properly bit swizzled * input data set because data may come from an arbitrarily * aligned, read-only source such as a memory-mapped file. * Note also that the viewfax decoder does not check for * running off the end of the input data buffer. This is * possible for G3-encoded data because it prescans the input * data to count EOL markers, but can cause problems for G4 * data. In any event, we don't prescan and must watch for * running out of data since we can't permit the library to * scan past the end of the input data buffer. * * Finally, note that we must handle remaindered data at the end * of a strip specially. The coder asks for a fixed number of * bits when scanning for the next code. This may be more bits * than are actually present in the data stream. If we appear * to run out of data but still have some number of valid bits * remaining then we makeup the requested amount with zeros and * return successfully. If the returned data is incorrect then * we should be called again and get a premature EOF error; * otherwise we should get the right answer. */ #ifndef NeedBits8 #define NeedBits8(n,eoflab) do { \ if (BitsAvail < (n)) { \ if (EndOfData()) { \ if (BitsAvail == 0) /* no valid bits */ \ goto eoflab; \ BitsAvail = (n); /* pad with zeros */ \ } else { \ BitAcc |= ((uint32) bitmap[*cp++])<>= (n); \ } while (0) #ifdef FAX3_DEBUG static const char* StateNames[] = { "Null ", "Pass ", "Horiz ", "V0 ", "VR ", "VL ", "Ext ", "TermW ", "TermB ", "MakeUpW", "MakeUpB", "MakeUp ", "EOL ", }; #define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0') #define LOOKUP8(wid,tab,eoflab) do { \ int t; \ NeedBits8(wid,eoflab); \ TabEnt = tab + GetBits(wid); \ printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \ StateNames[TabEnt->State], TabEnt->Param); \ for (t = 0; t < TabEnt->Width; t++) \ DEBUG_SHOW; \ putchar('\n'); \ fflush(stdout); \ ClrBits(TabEnt->Width); \ } while (0) #define LOOKUP16(wid,tab,eoflab) do { \ int t; \ NeedBits16(wid,eoflab); \ TabEnt = tab + GetBits(wid); \ printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \ StateNames[TabEnt->State], TabEnt->Param); \ for (t = 0; t < TabEnt->Width; t++) \ DEBUG_SHOW; \ putchar('\n'); \ fflush(stdout); \ ClrBits(TabEnt->Width); \ } while (0) #define SETVAL(x) do { \ *pa++ = RunLength + (x); \ printf("SETVAL: %d\t%d\n", RunLength + (x), a0); \ a0 += x; \ RunLength = 0; \ } while (0) #else #define LOOKUP8(wid,tab,eoflab) do { \ NeedBits8(wid,eoflab); \ TabEnt = tab + GetBits(wid); \ ClrBits(TabEnt->Width); \ } while (0) #define LOOKUP16(wid,tab,eoflab) do { \ NeedBits16(wid,eoflab); \ TabEnt = tab + GetBits(wid); \ ClrBits(TabEnt->Width); \ } while (0) /* * Append a run to the run length array for the * current row and reset decoding state. */ #define SETVAL(x) do { \ *pa++ = RunLength + (x); \ a0 += (x); \ RunLength = 0; \ } while (0) #endif /* * Synchronize input decoding at the start of each * row by scanning for an EOL (if appropriate) and * skipping any trash data that might be present * after a decoding error. Note that the decoding * done elsewhere that recognizes an EOL only consumes * 11 consecutive zero bits. This means that if EOLcnt * is non-zero then we still need to scan for the final flag * bit that is part of the EOL code. */ #define SYNC_EOL(eoflab) do { \ if (EOLcnt == 0) { \ for (;;) { \ NeedBits16(11,eoflab); \ if (GetBits(11) == 0) \ break; \ ClrBits(1); \ } \ } \ for (;;) { \ NeedBits8(8,eoflab); \ if (GetBits(8)) \ break; \ ClrBits(8); \ } \ while (GetBits(1) == 0) \ ClrBits(1); \ ClrBits(1); /* EOL bit */ \ EOLcnt = 0; /* reset EOL counter/flag */ \ } while (0) /* * Cleanup the array of runs after decoding a row. * We adjust final runs to insure the user buffer is not * overwritten and/or undecoded area is white filled. */ #define CLEANUP_RUNS() do { \ if (RunLength) \ SETVAL(0); \ if (a0 != lastx) { \ badlength(a0, lastx); \ while (a0 > lastx && pa > thisrun) \ a0 -= *--pa; \ if (a0 < lastx) { \ if (a0 < 0) \ a0 = 0; \ if ((pa-thisrun)&1) \ SETVAL(0); \ SETVAL(lastx - a0); \ } else if (a0 > lastx) { \ SETVAL(lastx); \ SETVAL(0); \ } \ } \ } while (0) /* * Decode a line of 1D-encoded data. * * The line expanders are written as macros so that they can be reused * but still have direct access to the local variables of the "calling" * function. * * Note that unlike the original version we have to explicitly test for * a0 >= lastx after each black/white run is decoded. This is because * the original code depended on the input data being zero-padded to * insure the decoder recognized an EOL before running out of data. */ #define EXPAND1D(eoflab) do { \ for (;;) { \ for (;;) { \ LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \ switch (TabEnt->State) { \ case S_EOL: \ EOLcnt = 1; \ goto done1d; \ case S_TermW: \ SETVAL(TabEnt->Param); \ goto doneWhite1d; \ case S_MakeUpW: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ unexpected("WhiteTable", a0); \ goto done1d; \ } \ } \ doneWhite1d: \ if (a0 >= lastx) \ goto done1d; \ for (;;) { \ LOOKUP16(13, TIFFFaxBlackTable, eof1d); \ switch (TabEnt->State) { \ case S_EOL: \ EOLcnt = 1; \ goto done1d; \ case S_TermB: \ SETVAL(TabEnt->Param); \ goto doneBlack1d; \ case S_MakeUpB: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ unexpected("BlackTable", a0); \ goto done1d; \ } \ } \ doneBlack1d: \ if (a0 >= lastx) \ goto done1d; \ if( *(pa-1) == 0 && *(pa-2) == 0 ) \ pa -= 2; \ } \ eof1d: \ prematureEOF(a0); \ CLEANUP_RUNS(); \ goto eoflab; \ done1d: \ CLEANUP_RUNS(); \ } while (0) /* * Update the value of b1 using the array * of runs for the reference line. */ #define CHECK_b1 do { \ if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \ b1 += pb[0] + pb[1]; \ pb += 2; \ } \ } while (0) /* * Expand a row of 2D-encoded data. */ #define EXPAND2D(eoflab) do { \ while (a0 < lastx) { \ LOOKUP8(7, TIFFFaxMainTable, eof2d); \ switch (TabEnt->State) { \ case S_Pass: \ CHECK_b1; \ b1 += *pb++; \ RunLength += b1 - a0; \ a0 = b1; \ b1 += *pb++; \ break; \ case S_Horiz: \ if ((pa-thisrun)&1) { \ for (;;) { /* black first */ \ LOOKUP16(13, TIFFFaxBlackTable, eof2d); \ switch (TabEnt->State) { \ case S_TermB: \ SETVAL(TabEnt->Param); \ goto doneWhite2da; \ case S_MakeUpB: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ goto badBlack2d; \ } \ } \ doneWhite2da:; \ for (;;) { /* then white */ \ LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \ switch (TabEnt->State) { \ case S_TermW: \ SETVAL(TabEnt->Param); \ goto doneBlack2da; \ case S_MakeUpW: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ goto badWhite2d; \ } \ } \ doneBlack2da:; \ } else { \ for (;;) { /* white first */ \ LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \ switch (TabEnt->State) { \ case S_TermW: \ SETVAL(TabEnt->Param); \ goto doneWhite2db; \ case S_MakeUpW: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ goto badWhite2d; \ } \ } \ doneWhite2db:; \ for (;;) { /* then black */ \ LOOKUP16(13, TIFFFaxBlackTable, eof2d); \ switch (TabEnt->State) { \ case S_TermB: \ SETVAL(TabEnt->Param); \ goto doneBlack2db; \ case S_MakeUpB: \ case S_MakeUp: \ a0 += TabEnt->Param; \ RunLength += TabEnt->Param; \ break; \ default: \ goto badBlack2d; \ } \ } \ doneBlack2db:; \ } \ CHECK_b1; \ break; \ case S_V0: \ CHECK_b1; \ SETVAL(b1 - a0); \ b1 += *pb++; \ break; \ case S_VR: \ CHECK_b1; \ SETVAL(b1 - a0 + TabEnt->Param); \ b1 += *pb++; \ break; \ case S_VL: \ CHECK_b1; \ SETVAL(b1 - a0 - TabEnt->Param); \ b1 -= *--pb; \ break; \ case S_Ext: \ *pa++ = lastx - a0; \ extension(a0); \ goto eol2d; \ case S_EOL: \ *pa++ = lastx - a0; \ NeedBits8(4,eof2d); \ if (GetBits(4)) \ unexpected("EOL", a0); \ ClrBits(4); \ EOLcnt = 1; \ goto eol2d; \ default: \ badMain2d: \ unexpected("MainTable", a0); \ goto eol2d; \ badBlack2d: \ unexpected("BlackTable", a0); \ goto eol2d; \ badWhite2d: \ unexpected("WhiteTable", a0); \ goto eol2d; \ eof2d: \ prematureEOF(a0); \ CLEANUP_RUNS(); \ goto eoflab; \ } \ } \ if (RunLength) { \ if (RunLength + a0 < lastx) { \ /* expect a final V0 */ \ NeedBits8(1,eof2d); \ if (!GetBits(1)) \ goto badMain2d; \ ClrBits(1); \ } \ SETVAL(0); \ } \ eol2d: \ CLEANUP_RUNS(); \ } while (0) #endif /* _FAX3_ */ gamera-3.3.3/src/libtiff/tif_flush.c0000644000076500000000000000411610714675674016322 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" int TIFFFlush(TIFF* tif) { if (tif->tif_mode != O_RDONLY) { if (!TIFFFlushData(tif)) return (0); if ((tif->tif_flags & TIFF_DIRTYDIRECT) && !TIFFWriteDirectory(tif)) return (0); } return (1); } /* * Flush buffered data to the file. * * Frank Warmerdam'2000: I modified this to return 1 if TIFF_BEENWRITING * is not set, so that TIFFFlush() will proceed to write out the directory. * The documentation says returning 1 is an error indicator, but not having * been writing isn't exactly a an error. Hopefully this doesn't cause * problems for other people. */ int TIFFFlushData(TIFF* tif) { if ((tif->tif_flags & TIFF_BEENWRITING) == 0) return (0); if (tif->tif_flags & TIFF_POSTENCODE) { tif->tif_flags &= ~TIFF_POSTENCODE; if (!(*tif->tif_postencode)(tif)) return (0); } return (TIFFFlushData1(tif)); } gamera-3.3.3/src/libtiff/tif_getimage.c0000644000076500000000000017721510714675674016776 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library * * Read and return a packed RGBA image. */ #include "tiffiop.h" #include #include static int gtTileContig(TIFFRGBAImage*, uint32*, uint32, uint32); static int gtTileSeparate(TIFFRGBAImage*, uint32*, uint32, uint32); static int gtStripContig(TIFFRGBAImage*, uint32*, uint32, uint32); static int gtStripSeparate(TIFFRGBAImage*, uint32*, uint32, uint32); static int pickTileContigCase(TIFFRGBAImage*); static int pickTileSeparateCase(TIFFRGBAImage*); static const char photoTag[] = "PhotometricInterpretation"; /* * Check the image to see if TIFFReadRGBAImage can deal with it. * 1/0 is returned according to whether or not the image can * be handled. If 0 is returned, emsg contains the reason * why it is being rejected. */ int TIFFRGBAImageOK(TIFF* tif, char emsg[1024]) { TIFFDirectory* td = &tif->tif_dir; uint16 photometric; int colorchannels; switch (td->td_bitspersample) { case 1: case 2: case 4: case 8: case 16: break; default: sprintf(emsg, "Sorry, can not handle images with %d-bit samples", td->td_bitspersample); return (0); } colorchannels = td->td_samplesperpixel - td->td_extrasamples; if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) { switch (colorchannels) { case 1: photometric = PHOTOMETRIC_MINISBLACK; break; case 3: photometric = PHOTOMETRIC_RGB; break; default: sprintf(emsg, "Missing needed %s tag", photoTag); return (0); } } switch (photometric) { case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: case PHOTOMETRIC_PALETTE: if (td->td_planarconfig == PLANARCONFIG_CONTIG && td->td_samplesperpixel != 1 && td->td_bitspersample < 8 ) { sprintf(emsg, "Sorry, can not handle contiguous data with %s=%d, " "and %s=%d and Bits/Sample=%d", photoTag, photometric, "Samples/pixel", td->td_samplesperpixel, td->td_bitspersample); return (0); } /* ** We should likely validate that any extra samples are either ** to be ignored, or are alpha, and if alpha we should try to use ** them. But for now we won't bother with this. */ break; case PHOTOMETRIC_YCBCR: if (td->td_planarconfig != PLANARCONFIG_CONTIG) { sprintf(emsg, "Sorry, can not handle YCbCr images with %s=%d", "Planarconfiguration", td->td_planarconfig); return (0); } break; case PHOTOMETRIC_RGB: if (colorchannels < 3) { sprintf(emsg, "Sorry, can not handle RGB image with %s=%d", "Color channels", colorchannels); return (0); } break; #ifdef CMYK_SUPPORT case PHOTOMETRIC_SEPARATED: if (td->td_inkset != INKSET_CMYK) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "InkSet", td->td_inkset); return (0); } if (td->td_samplesperpixel < 4) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "Samples/pixel", td->td_samplesperpixel); return (0); } break; #endif case PHOTOMETRIC_LOGL: if (td->td_compression != COMPRESSION_SGILOG) { sprintf(emsg, "Sorry, LogL data must have %s=%d", "Compression", COMPRESSION_SGILOG); return (0); } break; case PHOTOMETRIC_LOGLUV: if (td->td_compression != COMPRESSION_SGILOG && td->td_compression != COMPRESSION_SGILOG24) { sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d", "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24); return (0); } if (td->td_planarconfig != PLANARCONFIG_CONTIG) { sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d", "Planarconfiguration", td->td_planarconfig); return (0); } break; default: sprintf(emsg, "Sorry, can not handle image with %s=%d", photoTag, photometric); return (0); } return (1); } void TIFFRGBAImageEnd(TIFFRGBAImage* img) { if (img->Map) _TIFFfree(img->Map), img->Map = NULL; if (img->BWmap) _TIFFfree(img->BWmap), img->BWmap = NULL; if (img->PALmap) _TIFFfree(img->PALmap), img->PALmap = NULL; if (img->ycbcr) _TIFFfree(img->ycbcr), img->ycbcr = NULL; if( img->redcmap ) { _TIFFfree( img->redcmap ); _TIFFfree( img->greencmap ); _TIFFfree( img->bluecmap ); } } static int isCCITTCompression(TIFF* tif) { uint16 compress; TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress); return (compress == COMPRESSION_CCITTFAX3 || compress == COMPRESSION_CCITTFAX4 || compress == COMPRESSION_CCITTRLE || compress == COMPRESSION_CCITTRLEW); } int TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stop, char emsg[1024]) { uint16* sampleinfo; uint16 extrasamples; uint16 planarconfig; uint16 compress; int colorchannels; uint16 *red_orig, *green_orig, *blue_orig; int n_color; /* Initialize to normal values */ img->row_offset = 0; img->col_offset = 0; img->redcmap = NULL; img->greencmap = NULL; img->bluecmap = NULL; img->tif = tif; img->stoponerr = stop; TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &img->bitspersample); switch (img->bitspersample) { case 1: case 2: case 4: case 8: case 16: break; default: sprintf(emsg, "Sorry, can not image with %d-bit samples", img->bitspersample); return (0); } img->alpha = 0; TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &img->samplesperpixel); TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES, &extrasamples, &sampleinfo); if (extrasamples == 1) switch (sampleinfo[0]) { case EXTRASAMPLE_ASSOCALPHA: /* data is pre-multiplied */ case EXTRASAMPLE_UNASSALPHA: /* data is not pre-multiplied */ img->alpha = sampleinfo[0]; break; } colorchannels = img->samplesperpixel - extrasamples; TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress); TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfig); if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) { switch (colorchannels) { case 1: if (isCCITTCompression(tif)) img->photometric = PHOTOMETRIC_MINISWHITE; else img->photometric = PHOTOMETRIC_MINISBLACK; break; case 3: img->photometric = PHOTOMETRIC_RGB; break; default: sprintf(emsg, "Missing needed %s tag", photoTag); return (0); } } switch (img->photometric) { case PHOTOMETRIC_PALETTE: if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &red_orig, &green_orig, &blue_orig)) { TIFFError(TIFFFileName(tif), "Missing required \"Colormap\" tag"); return (0); } /* copy the colormaps so we can modify them */ n_color = (1L << img->bitspersample); img->redcmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); img->greencmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); img->bluecmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color); if( !img->redcmap || !img->greencmap || !img->bluecmap ) { TIFFError(TIFFFileName(tif), "Out of memory for colormap copy"); return (0); } memcpy( img->redcmap, red_orig, n_color * 2 ); memcpy( img->greencmap, green_orig, n_color * 2 ); memcpy( img->bluecmap, blue_orig, n_color * 2 ); /* fall thru... */ case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: if (planarconfig == PLANARCONFIG_CONTIG && img->samplesperpixel != 1 && img->bitspersample < 8 ) { sprintf(emsg, "Sorry, can not handle contiguous data with %s=%d, " "and %s=%d and Bits/Sample=%d", photoTag, img->photometric, "Samples/pixel", img->samplesperpixel, img->bitspersample); return (0); } break; case PHOTOMETRIC_YCBCR: if (planarconfig != PLANARCONFIG_CONTIG) { sprintf(emsg, "Sorry, can not handle YCbCr images with %s=%d", "Planarconfiguration", planarconfig); return (0); } /* It would probably be nice to have a reality check here. */ if (planarconfig == PLANARCONFIG_CONTIG) /* can rely on libjpeg to convert to RGB */ /* XXX should restore current state on exit */ switch (compress) { case COMPRESSION_OJPEG: case COMPRESSION_JPEG: TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB); img->photometric = PHOTOMETRIC_RGB; break; default: /* do nothing */; break; } break; case PHOTOMETRIC_RGB: if (colorchannels < 3) { sprintf(emsg, "Sorry, can not handle RGB image with %s=%d", "Color channels", colorchannels); return (0); } break; case PHOTOMETRIC_SEPARATED: { uint16 inkset; TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset); if (inkset != INKSET_CMYK) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "InkSet", inkset); return (0); } if (img->samplesperpixel < 4) { sprintf(emsg, "Sorry, can not handle separated image with %s=%d", "Samples/pixel", img->samplesperpixel); return (0); } break; } case PHOTOMETRIC_LOGL: if (compress != COMPRESSION_SGILOG) { sprintf(emsg, "Sorry, LogL data must have %s=%d", "Compression", COMPRESSION_SGILOG); return (0); } TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT); img->photometric = PHOTOMETRIC_MINISBLACK; /* little white lie */ img->bitspersample = 8; break; case PHOTOMETRIC_LOGLUV: if (compress != COMPRESSION_SGILOG && compress != COMPRESSION_SGILOG24) { sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d", "Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24); return (0); } if (planarconfig != PLANARCONFIG_CONTIG) { sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d", "Planarconfiguration", planarconfig); return (0); } TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT); img->photometric = PHOTOMETRIC_RGB; /* little white lie */ img->bitspersample = 8; break; default: sprintf(emsg, "Sorry, can not handle image with %s=%d", photoTag, img->photometric); return (0); } img->Map = NULL; img->BWmap = NULL; img->PALmap = NULL; img->ycbcr = NULL; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &img->width); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &img->height); TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &img->orientation); img->isContig = !(planarconfig == PLANARCONFIG_SEPARATE && colorchannels > 1); if (img->isContig) { img->get = TIFFIsTiled(tif) ? gtTileContig : gtStripContig; (void) pickTileContigCase(img); } else { img->get = TIFFIsTiled(tif) ? gtTileSeparate : gtStripSeparate; (void) pickTileSeparateCase(img); } return (1); } int TIFFRGBAImageGet(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { if (img->get == NULL) { TIFFError(TIFFFileName(img->tif), "No \"get\" routine setup"); return (0); } if (img->put.any == NULL) { TIFFError(TIFFFileName(img->tif), "No \"put\" routine setupl; probably can not handle image format"); return (0); } return (*img->get)(img, raster, w, h); } /* * Read the specified image into an ABGR-format raster. */ int TIFFReadRGBAImage(TIFF* tif, uint32 rwidth, uint32 rheight, uint32* raster, int stop) { char emsg[1024]; TIFFRGBAImage img; int ok; if (TIFFRGBAImageBegin(&img, tif, stop, emsg)) { /* XXX verify rwidth and rheight against width and height */ ok = TIFFRGBAImageGet(&img, raster+(rheight-img.height)*rwidth, rwidth, img.height); TIFFRGBAImageEnd(&img); } else { TIFFError(TIFFFileName(tif), emsg); ok = 0; } return (ok); } static uint32 setorientation(TIFFRGBAImage* img, uint32 h) { TIFF* tif = img->tif; uint32 y; switch (img->orientation) { case ORIENTATION_BOTRIGHT: case ORIENTATION_RIGHTBOT: /* XXX */ case ORIENTATION_LEFTBOT: /* XXX */ TIFFWarning(TIFFFileName(tif), "using bottom-left orientation"); img->orientation = ORIENTATION_BOTLEFT; /* fall thru... */ case ORIENTATION_BOTLEFT: y = 0; break; case ORIENTATION_TOPRIGHT: case ORIENTATION_RIGHTTOP: /* XXX */ case ORIENTATION_LEFTTOP: /* XXX */ default: TIFFWarning(TIFFFileName(tif), "using top-left orientation"); img->orientation = ORIENTATION_TOPLEFT; /* fall thru... */ case ORIENTATION_TOPLEFT: y = h-1; break; } return (y); } /* * Get an tile-organized image that has * PlanarConfiguration contiguous if SamplesPerPixel > 1 * or * SamplesPerPixel == 1 */ static int gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileContigRoutine put = img->put.contig; uint16 orientation; uint32 col, row, y, rowstoread, ret = 1; uint32 pos; uint32 tw, th; u_char* buf; int32 fromskew, toskew; uint32 nrow; buf = (u_char*) _TIFFmalloc(TIFFTileSize(tif)); if (buf == 0) { TIFFError(TIFFFileName(tif), "No space for tile buffer"); return (0); } TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); y = setorientation(img, h); orientation = img->orientation; toskew = -(int32) (orientation == ORIENTATION_TOPLEFT ? tw+w : tw-w); for (row = 0; row < h; row += nrow) { rowstoread = th - (row + img->row_offset) % th; nrow = (row + rowstoread > h ? h - row : rowstoread); for (col = 0; col < w; col += tw) { if (TIFFReadTile(tif, buf, col+img->col_offset, row+img->row_offset, 0, 0) < 0 && img->stoponerr) { ret = 0; break; } pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); if (col + tw > w) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ uint32 npix = w - col; fromskew = tw - npix; (*put)(img, raster+y*w+col, col, y, npix, nrow, fromskew, toskew + fromskew, buf + pos); } else { (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, buf + pos); } } y += (orientation == ORIENTATION_TOPLEFT ? -(int32) nrow : (int32) nrow); } _TIFFfree(buf); return (ret); } /* * Get an tile-organized image that has * SamplesPerPixel > 1 * PlanarConfiguration separated * We assume that all such images are RGB. */ static int gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileSeparateRoutine put = img->put.separate; uint16 orientation; uint32 col, row, y, rowstoread; uint32 pos; uint32 tw, th; u_char* buf; u_char* r; u_char* g; u_char* b; u_char* a; tsize_t tilesize; int32 fromskew, toskew; int alpha = img->alpha; uint32 nrow; int ret = 1; tilesize = TIFFTileSize(tif); buf = (u_char*) _TIFFmalloc(4*tilesize); if (buf == 0) { TIFFError(TIFFFileName(tif), "No space for tile buffer"); return (0); } r = buf; g = r + tilesize; b = g + tilesize; a = b + tilesize; if (!alpha) memset(a, 0xff, tilesize); TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw); TIFFGetField(tif, TIFFTAG_TILELENGTH, &th); y = setorientation(img, h); orientation = img->orientation; toskew = -(int32) (orientation == ORIENTATION_TOPLEFT ? tw+w : tw-w); for (row = 0; row < h; row += nrow) { rowstoread = th - (row + img->row_offset) % th; nrow = (row + rowstoread > h ? h - row : rowstoread); for (col = 0; col < w; col += tw) { if (TIFFReadTile(tif, r, col+img->col_offset, row+img->row_offset,0,0) < 0 && img->stoponerr) { ret = 0; break; } if (TIFFReadTile(tif, g, col+img->col_offset, row+img->row_offset,0,1) < 0 && img->stoponerr) { ret = 0; break; } if (TIFFReadTile(tif, b, col+img->col_offset, row+img->row_offset,0,2) < 0 && img->stoponerr) { ret = 0; break; } if (alpha && TIFFReadTile(tif,a,col+img->col_offset, row+img->row_offset,0,3) < 0 && img->stoponerr) { ret = 0; break; } pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif); if (col + tw > w) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ uint32 npix = w - col; fromskew = tw - npix; (*put)(img, raster+y*w+col, col, y, npix, nrow, fromskew, toskew + fromskew, r + pos, g + pos, b + pos, a + pos); } else { (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, r + pos, g + pos, b + pos, a + pos); } } y += (orientation == ORIENTATION_TOPLEFT ?-(int32) nrow : (int32) nrow); } _TIFFfree(buf); return (ret); } /* * Get a strip-organized image that has * PlanarConfiguration contiguous if SamplesPerPixel > 1 * or * SamplesPerPixel == 1 */ static int gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileContigRoutine put = img->put.contig; uint16 orientation; uint32 row, y, nrow, rowstoread; uint32 pos; u_char* buf; uint32 rowsperstrip; uint32 imagewidth = img->width; tsize_t scanline; int32 fromskew, toskew; int ret = 1; buf = (u_char*) _TIFFmalloc(TIFFStripSize(tif)); if (buf == 0) { TIFFError(TIFFFileName(tif), "No space for strip buffer"); return (0); } y = setorientation(img, h); orientation = img->orientation; toskew = -(int32) (orientation == ORIENTATION_TOPLEFT ? w+w : w-w); TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0); for (row = 0; row < h; row += nrow) { rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip; nrow = (row + rowstoread > h ? h - row : rowstoread); if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif,row+img->row_offset, 0), buf, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 && img->stoponerr) { ret = 0; break; } pos = ((row + img->row_offset) % rowsperstrip) * scanline; (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + pos); y += (orientation == ORIENTATION_TOPLEFT ?-(int32) nrow : (int32) nrow); } _TIFFfree(buf); return (ret); } /* * Get a strip-organized image with * SamplesPerPixel > 1 * PlanarConfiguration separated * We assume that all such images are RGB. */ static int gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h) { TIFF* tif = img->tif; tileSeparateRoutine put = img->put.separate; uint16 orientation; u_char *buf; u_char *r, *g, *b, *a; uint32 row, y, nrow, rowstoread; uint32 pos; tsize_t scanline; uint32 rowsperstrip, offset_row; uint32 imagewidth = img->width; tsize_t stripsize; int32 fromskew, toskew; int alpha = img->alpha; int ret = 1; stripsize = TIFFStripSize(tif); r = buf = (u_char *)_TIFFmalloc(4*stripsize); if (buf == 0) { TIFFError(TIFFFileName(tif), "No space for tile buffer"); return (0); } g = r + stripsize; b = g + stripsize; a = b + stripsize; if (!alpha) memset(a, 0xff, stripsize); y = setorientation(img, h); orientation = img->orientation; toskew = -(int32) (orientation == ORIENTATION_TOPLEFT ? w+w : w-w); TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); scanline = TIFFScanlineSize(tif); fromskew = (w < imagewidth ? imagewidth - w : 0); for (row = 0; row < h; row += nrow) { rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip; nrow = (row + rowstoread > h ? h - row : rowstoread); offset_row = row + img->row_offset; if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 0), r, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 && img->stoponerr) { ret = 0; break; } if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 1), g, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 && img->stoponerr) { ret = 0; break; } if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 2), b, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 && img->stoponerr) { ret = 0; break; } if (alpha && (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 3), a, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 && img->stoponerr)) { ret = 0; break; } pos = ((row + img->row_offset) % rowsperstrip) * scanline; (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, r + pos, g + pos, b + pos, a + pos); y += (orientation == ORIENTATION_TOPLEFT ? -(int32) nrow : (int32) nrow); } _TIFFfree(buf); return (ret); } /* * The following routines move decoded data returned * from the TIFF library into rasters filled with packed * ABGR pixels (i.e. suitable for passing to lrecwrite.) * * The routines have been created according to the most * important cases and optimized. pickTileContigCase and * pickTileSeparateCase analyze the parameters and select * the appropriate "put" routine to use. */ #define REPEAT8(op) REPEAT4(op); REPEAT4(op) #define REPEAT4(op) REPEAT2(op); REPEAT2(op) #define REPEAT2(op) op; op #define CASE8(x,op) \ switch (x) { \ case 7: op; case 6: op; case 5: op; \ case 4: op; case 3: op; case 2: op; \ case 1: op; \ } #define CASE4(x,op) switch (x) { case 3: op; case 2: op; case 1: op; } #define NOP #define UNROLL8(w, op1, op2) { \ uint32 _x; \ for (_x = w; _x >= 8; _x -= 8) { \ op1; \ REPEAT8(op2); \ } \ if (_x > 0) { \ op1; \ CASE8(_x,op2); \ } \ } #define UNROLL4(w, op1, op2) { \ uint32 _x; \ for (_x = w; _x >= 4; _x -= 4) { \ op1; \ REPEAT4(op2); \ } \ if (_x > 0) { \ op1; \ CASE4(_x,op2); \ } \ } #define UNROLL2(w, op1, op2) { \ uint32 _x; \ for (_x = w; _x >= 2; _x -= 2) { \ op1; \ REPEAT2(op2); \ } \ if (_x) { \ op1; \ op2; \ } \ } #define SKEW(r,g,b,skew) { r += skew; g += skew; b += skew; } #define SKEW4(r,g,b,a,skew) { r += skew; g += skew; b += skew; a+= skew; } #define A1 ((uint32)(0xffL<<24)) #define PACK(r,g,b) \ ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|A1) #define PACK4(r,g,b,a) \ ((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|((uint32)(a)<<24)) #define W2B(v) (((v)>>8)&0xff) #define PACKW(r,g,b) \ ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|A1) #define PACKW4(r,g,b,a) \ ((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|((uint32)W2B(a)<<24)) #define DECLAREContigPutFunc(name) \ static void name(\ TIFFRGBAImage* img, \ uint32* cp, \ uint32 x, uint32 y, \ uint32 w, uint32 h, \ int32 fromskew, int32 toskew, \ u_char* pp \ ) /* * 8-bit palette => colormap/RGB */ DECLAREContigPutFunc(put8bitcmaptile) { uint32** PALmap = img->PALmap; int samplesperpixel = img->samplesperpixel; (void) y; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = PALmap[*pp][0]; pp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 4-bit palette => colormap/RGB */ DECLAREContigPutFunc(put4bitcmaptile) { uint32** PALmap = img->PALmap; (void) x; (void) y; fromskew /= 2; while (h-- > 0) { uint32* bw; UNROLL2(w, bw = PALmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 2-bit palette => colormap/RGB */ DECLAREContigPutFunc(put2bitcmaptile) { uint32** PALmap = img->PALmap; (void) x; (void) y; fromskew /= 4; while (h-- > 0) { uint32* bw; UNROLL4(w, bw = PALmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 1-bit palette => colormap/RGB */ DECLAREContigPutFunc(put1bitcmaptile) { uint32** PALmap = img->PALmap; (void) x; (void) y; fromskew /= 8; while (h-- > 0) { uint32* bw; UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 8-bit greyscale => colormap/RGB */ DECLAREContigPutFunc(putgreytile) { int samplesperpixel = img->samplesperpixel; uint32** BWmap = img->BWmap; (void) y; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = BWmap[*pp][0]; pp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 16-bit greyscale => colormap/RGB */ DECLAREContigPutFunc(put16bitbwtile) { int samplesperpixel = img->samplesperpixel; uint32** BWmap = img->BWmap; (void) y; while (h-- > 0) { uint16 *wp = (uint16 *) pp; for (x = w; x-- > 0;) { /* use high order byte of 16bit value */ *cp++ = BWmap[*wp >> 8][0]; pp += 2 * samplesperpixel; wp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 1-bit bilevel => colormap/RGB */ DECLAREContigPutFunc(put1bitbwtile) { uint32** BWmap = img->BWmap; (void) x; (void) y; fromskew /= 8; while (h-- > 0) { uint32* bw; UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 2-bit greyscale => colormap/RGB */ DECLAREContigPutFunc(put2bitbwtile) { uint32** BWmap = img->BWmap; (void) x; (void) y; fromskew /= 4; while (h-- > 0) { uint32* bw; UNROLL4(w, bw = BWmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 4-bit greyscale => colormap/RGB */ DECLAREContigPutFunc(put4bitbwtile) { uint32** BWmap = img->BWmap; (void) x; (void) y; fromskew /= 2; while (h-- > 0) { uint32* bw; UNROLL2(w, bw = BWmap[*pp++], *cp++ = *bw++); cp += toskew; pp += fromskew; } } /* * 8-bit packed samples, no Map => RGB */ DECLAREContigPutFunc(putRGBcontig8bittile) { int samplesperpixel = img->samplesperpixel; (void) x; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { UNROLL8(w, NOP, *cp++ = PACK(pp[0], pp[1], pp[2]); pp += samplesperpixel); cp += toskew; pp += fromskew; } } /* * 8-bit packed samples, w/ Map => RGB */ DECLAREContigPutFunc(putRGBcontig8bitMaptile) { TIFFRGBValue* Map = img->Map; int samplesperpixel = img->samplesperpixel; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = PACK(Map[pp[0]], Map[pp[1]], Map[pp[2]]); pp += samplesperpixel; } pp += fromskew; cp += toskew; } } /* * 8-bit packed samples => RGBA w/ associated alpha * (known to have Map == NULL) */ DECLAREContigPutFunc(putRGBAAcontig8bittile) { int samplesperpixel = img->samplesperpixel; (void) x; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { UNROLL8(w, NOP, *cp++ = PACK4(pp[0], pp[1], pp[2], pp[3]); pp += samplesperpixel); cp += toskew; pp += fromskew; } } /* * 8-bit packed samples => RGBA w/ unassociated alpha * (known to have Map == NULL) */ DECLAREContigPutFunc(putRGBUAcontig8bittile) { int samplesperpixel = img->samplesperpixel; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { uint32 r, g, b, a; for (x = w; x-- > 0;) { a = pp[3]; r = (pp[0] * a) / 255; g = (pp[1] * a) / 255; b = (pp[2] * a) / 255; *cp++ = PACK4(r,g,b,a); pp += samplesperpixel; } cp += toskew; pp += fromskew; } } /* * 16-bit packed samples => RGB */ DECLAREContigPutFunc(putRGBcontig16bittile) { int samplesperpixel = img->samplesperpixel; uint16 *wp = (uint16 *)pp; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = PACKW(wp[0], wp[1], wp[2]); wp += samplesperpixel; } cp += toskew; wp += fromskew; } } /* * 16-bit packed samples => RGBA w/ associated alpha * (known to have Map == NULL) */ DECLAREContigPutFunc(putRGBAAcontig16bittile) { int samplesperpixel = img->samplesperpixel; uint16 *wp = (uint16 *)pp; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { for (x = w; x-- > 0;) { *cp++ = PACKW4(wp[0], wp[1], wp[2], wp[3]); wp += samplesperpixel; } cp += toskew; wp += fromskew; } } /* * 16-bit packed samples => RGBA w/ unassociated alpha * (known to have Map == NULL) */ DECLAREContigPutFunc(putRGBUAcontig16bittile) { int samplesperpixel = img->samplesperpixel; uint16 *wp = (uint16 *)pp; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { uint32 r,g,b,a; /* * We shift alpha down four bits just in case unsigned * arithmetic doesn't handle the full range. * We still have plenty of accuracy, since the output is 8 bits. * So we have (r * 0xffff) * (a * 0xfff)) = r*a * (0xffff*0xfff) * Since we want r*a * 0xff for eight bit output, * we divide by (0xffff * 0xfff) / 0xff == 0x10eff. */ for (x = w; x-- > 0;) { a = wp[3] >> 4; r = (wp[0] * a) / 0x10eff; g = (wp[1] * a) / 0x10eff; b = (wp[2] * a) / 0x10eff; *cp++ = PACK4(r,g,b,a); wp += samplesperpixel; } cp += toskew; wp += fromskew; } } /* * 8-bit packed CMYK samples w/o Map => RGB * * NB: The conversion of CMYK->RGB is *very* crude. */ DECLAREContigPutFunc(putRGBcontig8bitCMYKtile) { int samplesperpixel = img->samplesperpixel; uint16 r, g, b, k; (void) x; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { UNROLL8(w, NOP, k = 255 - pp[3]; r = (k*(255-pp[0]))/255; g = (k*(255-pp[1]))/255; b = (k*(255-pp[2]))/255; *cp++ = PACK(r, g, b); pp += samplesperpixel); cp += toskew; pp += fromskew; } } /* * 8-bit packed CMYK samples w/Map => RGB * * NB: The conversion of CMYK->RGB is *very* crude. */ DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile) { int samplesperpixel = img->samplesperpixel; TIFFRGBValue* Map = img->Map; uint16 r, g, b, k; (void) y; fromskew *= samplesperpixel; while (h-- > 0) { for (x = w; x-- > 0;) { k = 255 - pp[3]; r = (k*(255-pp[0]))/255; g = (k*(255-pp[1]))/255; b = (k*(255-pp[2]))/255; *cp++ = PACK(Map[r], Map[g], Map[b]); pp += samplesperpixel; } pp += fromskew; cp += toskew; } } #define DECLARESepPutFunc(name) \ static void name(\ TIFFRGBAImage* img,\ uint32* cp,\ uint32 x, uint32 y, \ uint32 w, uint32 h,\ int32 fromskew, int32 toskew,\ u_char* r, u_char* g, u_char* b, u_char* a\ ) /* * 8-bit unpacked samples => RGB */ DECLARESepPutFunc(putRGBseparate8bittile) { (void) img; (void) x; (void) y; (void) a; while (h-- > 0) { UNROLL8(w, NOP, *cp++ = PACK(*r++, *g++, *b++)); SKEW(r, g, b, fromskew); cp += toskew; } } /* * 8-bit unpacked samples => RGB */ DECLARESepPutFunc(putRGBseparate8bitMaptile) { TIFFRGBValue* Map = img->Map; (void) y; (void) a; while (h-- > 0) { for (x = w; x > 0; x--) *cp++ = PACK(Map[*r++], Map[*g++], Map[*b++]); SKEW(r, g, b, fromskew); cp += toskew; } } /* * 8-bit unpacked samples => RGBA w/ associated alpha */ DECLARESepPutFunc(putRGBAAseparate8bittile) { (void) img; (void) x; (void) y; while (h-- > 0) { UNROLL8(w, NOP, *cp++ = PACK4(*r++, *g++, *b++, *a++)); SKEW4(r, g, b, a, fromskew); cp += toskew; } } /* * 8-bit unpacked samples => RGBA w/ unassociated alpha */ DECLARESepPutFunc(putRGBUAseparate8bittile) { (void) img; (void) y; while (h-- > 0) { uint32 rv, gv, bv, av; for (x = w; x-- > 0;) { av = *a++; rv = (*r++ * av) / 255; gv = (*g++ * av) / 255; bv = (*b++ * av) / 255; *cp++ = PACK4(rv,gv,bv,av); } SKEW4(r, g, b, a, fromskew); cp += toskew; } } /* * 16-bit unpacked samples => RGB */ DECLARESepPutFunc(putRGBseparate16bittile) { uint16 *wr = (uint16*) r; uint16 *wg = (uint16*) g; uint16 *wb = (uint16*) b; (void) img; (void) y; (void) a; while (h-- > 0) { for (x = 0; x < w; x++) *cp++ = PACKW(*wr++, *wg++, *wb++); SKEW(wr, wg, wb, fromskew); cp += toskew; } } /* * 16-bit unpacked samples => RGBA w/ associated alpha */ DECLARESepPutFunc(putRGBAAseparate16bittile) { uint16 *wr = (uint16*) r; uint16 *wg = (uint16*) g; uint16 *wb = (uint16*) b; uint16 *wa = (uint16*) a; (void) img; (void) y; while (h-- > 0) { for (x = 0; x < w; x++) *cp++ = PACKW4(*wr++, *wg++, *wb++, *wa++); SKEW4(wr, wg, wb, wa, fromskew); cp += toskew; } } /* * 16-bit unpacked samples => RGBA w/ unassociated alpha */ DECLARESepPutFunc(putRGBUAseparate16bittile) { uint16 *wr = (uint16*) r; uint16 *wg = (uint16*) g; uint16 *wb = (uint16*) b; uint16 *wa = (uint16*) a; (void) img; (void) y; while (h-- > 0) { uint32 r,g,b,a; /* * We shift alpha down four bits just in case unsigned * arithmetic doesn't handle the full range. * We still have plenty of accuracy, since the output is 8 bits. * So we have (r * 0xffff) * (a * 0xfff)) = r*a * (0xffff*0xfff) * Since we want r*a * 0xff for eight bit output, * we divide by (0xffff * 0xfff) / 0xff == 0x10eff. */ for (x = w; x-- > 0;) { a = *wa++ >> 4; r = (*wr++ * a) / 0x10eff; g = (*wg++ * a) / 0x10eff; b = (*wb++ * a) / 0x10eff; *cp++ = PACK4(r,g,b,a); } SKEW4(wr, wg, wb, wa, fromskew); cp += toskew; } } /* * YCbCr -> RGB conversion and packing routines. The colorspace * conversion algorithm comes from the IJG v5a code; see below * for more information on how it works. */ #define YCbCrtoRGB(dst, yc) { \ int Y = (yc); \ dst = PACK( \ clamptab[Y+Crrtab[Cr]], \ clamptab[Y + (int)((Cbgtab[Cb]+Crgtab[Cr])>>16)], \ clamptab[Y+Cbbtab[Cb]]); \ } #define YCbCrSetup \ TIFFYCbCrToRGB* ycbcr = img->ycbcr; \ int* Crrtab = ycbcr->Cr_r_tab; \ int* Cbbtab = ycbcr->Cb_b_tab; \ int32* Crgtab = ycbcr->Cr_g_tab; \ int32* Cbgtab = ycbcr->Cb_g_tab; \ TIFFRGBValue* clamptab = ycbcr->clamptab /* * 8-bit packed YCbCr samples => RGB * This function is generic for different sampling sizes, * and can handle blocks sizes that aren't multiples of the * sampling size. However, it is substantially less optimized * than the specific sampling cases. It is used as a fallback * for difficult blocks. */ #ifdef notdef static void putcontig8bitYCbCrGenericTile( TIFFRGBAImage* img, uint32* cp, uint32 x, uint32 y, uint32 w, uint32 h, int32 fromskew, int32 toskew, u_char* pp, int h_group, int v_group ) { YCbCrSetup; uint32* cp1 = cp+w+toskew; uint32* cp2 = cp1+w+toskew; uint32* cp3 = cp2+w+toskew; int32 incr = 3*w+4*toskew; int Cb, Cr; int group_size = v_group * h_group + 2; (void) y; fromskew = (fromskew * group_size) / h_group; for( yy = 0; yy < h; yy++ ) { u_char *pp_line; int y_line_group = yy / v_group; int y_remainder = yy - y_line_group * v_group; pp_line = pp + v_line_group * for( xx = 0; xx < w; xx++ ) { Cb = pp } } for (; h >= 4; h -= 4) { x = w>>2; do { Cb = pp[16]; Cr = pp[17]; YCbCrtoRGB(cp [0], pp[ 0]); YCbCrtoRGB(cp [1], pp[ 1]); YCbCrtoRGB(cp [2], pp[ 2]); YCbCrtoRGB(cp [3], pp[ 3]); YCbCrtoRGB(cp1[0], pp[ 4]); YCbCrtoRGB(cp1[1], pp[ 5]); YCbCrtoRGB(cp1[2], pp[ 6]); YCbCrtoRGB(cp1[3], pp[ 7]); YCbCrtoRGB(cp2[0], pp[ 8]); YCbCrtoRGB(cp2[1], pp[ 9]); YCbCrtoRGB(cp2[2], pp[10]); YCbCrtoRGB(cp2[3], pp[11]); YCbCrtoRGB(cp3[0], pp[12]); YCbCrtoRGB(cp3[1], pp[13]); YCbCrtoRGB(cp3[2], pp[14]); YCbCrtoRGB(cp3[3], pp[15]); cp += 4, cp1 += 4, cp2 += 4, cp3 += 4; pp += 18; } while (--x); cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; pp += fromskew; } } #endif /* * 8-bit packed YCbCr samples w/ 4,4 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr44tile) { YCbCrSetup; uint32* cp1 = cp+w+toskew; uint32* cp2 = cp1+w+toskew; uint32* cp3 = cp2+w+toskew; int32 incr = 3*w+4*toskew; (void) y; /* adjust fromskew */ fromskew = (fromskew * 18) / 4; if ((h & 3) == 0 && (w & 3) == 0) { for (; h >= 4; h -= 4) { x = w>>2; do { int Cb = pp[16]; int Cr = pp[17]; YCbCrtoRGB(cp [0], pp[ 0]); YCbCrtoRGB(cp [1], pp[ 1]); YCbCrtoRGB(cp [2], pp[ 2]); YCbCrtoRGB(cp [3], pp[ 3]); YCbCrtoRGB(cp1[0], pp[ 4]); YCbCrtoRGB(cp1[1], pp[ 5]); YCbCrtoRGB(cp1[2], pp[ 6]); YCbCrtoRGB(cp1[3], pp[ 7]); YCbCrtoRGB(cp2[0], pp[ 8]); YCbCrtoRGB(cp2[1], pp[ 9]); YCbCrtoRGB(cp2[2], pp[10]); YCbCrtoRGB(cp2[3], pp[11]); YCbCrtoRGB(cp3[0], pp[12]); YCbCrtoRGB(cp3[1], pp[13]); YCbCrtoRGB(cp3[2], pp[14]); YCbCrtoRGB(cp3[3], pp[15]); cp += 4, cp1 += 4, cp2 += 4, cp3 += 4; pp += 18; } while (--x); cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; pp += fromskew; } } else { while (h > 0) { for (x = w; x > 0;) { int Cb = pp[16]; int Cr = pp[17]; switch (x) { default: switch (h) { default: YCbCrtoRGB(cp3[3], pp[15]); /* FALLTHROUGH */ case 3: YCbCrtoRGB(cp2[3], pp[11]); /* FALLTHROUGH */ case 2: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 3: switch (h) { default: YCbCrtoRGB(cp3[2], pp[14]); /* FALLTHROUGH */ case 3: YCbCrtoRGB(cp2[2], pp[10]); /* FALLTHROUGH */ case 2: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 2: switch (h) { default: YCbCrtoRGB(cp3[1], pp[13]); /* FALLTHROUGH */ case 3: YCbCrtoRGB(cp2[1], pp[ 9]); /* FALLTHROUGH */ case 2: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 1: switch (h) { default: YCbCrtoRGB(cp3[0], pp[12]); /* FALLTHROUGH */ case 3: YCbCrtoRGB(cp2[0], pp[ 8]); /* FALLTHROUGH */ case 2: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */ } /* FALLTHROUGH */ } if (x < 4) { cp += x; cp1 += x; cp2 += x; cp3 += x; x = 0; } else { cp += 4; cp1 += 4; cp2 += 4; cp3 += 4; x -= 4; } pp += 18; } if (h <= 4) break; h -= 4; cp += incr, cp1 += incr, cp2 += incr, cp3 += incr; pp += fromskew; } } } /* * 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr42tile) { YCbCrSetup; uint32* cp1 = cp+w+toskew; int32 incr = 2*toskew+w; (void) y; fromskew = (fromskew * 10) / 4; if ((h & 3) == 0 && (w & 1) == 0) { for (; h >= 2; h -= 2) { x = w>>2; do { int Cb = pp[8]; int Cr = pp[9]; YCbCrtoRGB(cp [0], pp[0]); YCbCrtoRGB(cp [1], pp[1]); YCbCrtoRGB(cp [2], pp[2]); YCbCrtoRGB(cp [3], pp[3]); YCbCrtoRGB(cp1[0], pp[4]); YCbCrtoRGB(cp1[1], pp[5]); YCbCrtoRGB(cp1[2], pp[6]); YCbCrtoRGB(cp1[3], pp[7]); cp += 4, cp1 += 4; pp += 10; } while (--x); cp += incr, cp1 += incr; pp += fromskew; } } else { while (h > 0) { for (x = w; x > 0;) { int Cb = pp[8]; int Cr = pp[9]; switch (x) { default: switch (h) { default: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 3: switch (h) { default: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 2: switch (h) { default: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 1: switch (h) { default: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */ } /* FALLTHROUGH */ } if (x < 4) { cp += x; cp1 += x; x = 0; } else { cp += 4; cp1 += 4; x -= 4; } pp += 10; } if (h <= 2) break; h -= 2; cp += incr, cp1 += incr; pp += fromskew; } } } /* * 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr41tile) { YCbCrSetup; (void) y; /* XXX adjust fromskew */ do { x = w>>2; do { int Cb = pp[4]; int Cr = pp[5]; YCbCrtoRGB(cp [0], pp[0]); YCbCrtoRGB(cp [1], pp[1]); YCbCrtoRGB(cp [2], pp[2]); YCbCrtoRGB(cp [3], pp[3]); cp += 4; pp += 6; } while (--x); if( (w&3) != 0 ) { int Cb = pp[4]; int Cr = pp[5]; switch( (w&3) ) { case 3: YCbCrtoRGB(cp [2], pp[2]); case 2: YCbCrtoRGB(cp [1], pp[1]); case 1: YCbCrtoRGB(cp [0], pp[0]); case 0: break; } cp += (w&3); pp += 6; } cp += toskew; pp += fromskew; } while (--h); } /* * 8-bit packed YCbCr samples w/ 2,2 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr22tile) { YCbCrSetup; uint32* cp1 = cp+w+toskew; int32 incr = 2*toskew+w; (void) y; fromskew = (fromskew * 6) / 2; if ((h & 1) == 0 && (w & 1) == 0) { for (; h >= 2; h -= 2) { x = w>>1; do { int Cb = pp[4]; int Cr = pp[5]; YCbCrtoRGB(cp [0], pp[0]); YCbCrtoRGB(cp [1], pp[1]); YCbCrtoRGB(cp1[0], pp[2]); YCbCrtoRGB(cp1[1], pp[3]); cp += 2, cp1 += 2; pp += 6; } while (--x); cp += incr, cp1 += incr; pp += fromskew; } } else { while (h > 0) { for (x = w; x > 0;) { int Cb = pp[4]; int Cr = pp[5]; switch (x) { default: switch (h) { default: YCbCrtoRGB(cp1[1], pp[ 3]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */ } /* FALLTHROUGH */ case 1: switch (h) { default: YCbCrtoRGB(cp1[0], pp[ 2]); /* FALLTHROUGH */ case 1: YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */ } /* FALLTHROUGH */ } if (x < 2) { cp += x; cp1 += x; x = 0; } else { cp += 2; cp1 += 2; x -= 2; } pp += 6; } if (h <= 2) break; h -= 2; cp += incr, cp1 += incr; pp += fromskew; } } } /* * 8-bit packed YCbCr samples w/ 2,1 subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr21tile) { YCbCrSetup; (void) y; fromskew = (fromskew * 4) / 2; do { x = w>>1; do { int Cb = pp[2]; int Cr = pp[3]; YCbCrtoRGB(cp[0], pp[0]); YCbCrtoRGB(cp[1], pp[1]); cp += 2; pp += 4; } while (--x); if( (w&1) != 0 ) { int Cb = pp[2]; int Cr = pp[3]; YCbCrtoRGB(cp [0], pp[0]); cp += 1; pp += 4; } cp += toskew; pp += fromskew; } while (--h); } /* * 8-bit packed YCbCr samples w/ no subsampling => RGB */ DECLAREContigPutFunc(putcontig8bitYCbCr11tile) { YCbCrSetup; (void) y; fromskew *= 3; do { x = w; /* was x = w>>1; patched 2000/09/25 warmerda@home.com */ do { int Cb = pp[1]; int Cr = pp[2]; YCbCrtoRGB(*cp++, pp[0]); pp += 3; } while (--x); cp += toskew; pp += fromskew; } while (--h); } #undef YCbCrSetup #undef YCbCrtoRGB #define LumaRed coeffs[0] #define LumaGreen coeffs[1] #define LumaBlue coeffs[2] #define SHIFT 16 #define FIX(x) ((int32)((x) * (1L<RGB conversion tables. The conversion * is done according to the 6.0 spec: * * R = Y + Cr*(2 - 2*LumaRed) * B = Y + Cb*(2 - 2*LumaBlue) * G = Y * - LumaBlue*Cb*(2-2*LumaBlue)/LumaGreen * - LumaRed*Cr*(2-2*LumaRed)/LumaGreen * * To avoid floating point arithmetic the fractional constants that * come out of the equations are represented as fixed point values * in the range 0...2^16. We also eliminate multiplications by * pre-calculating possible values indexed by Cb and Cr (this code * assumes conversion is being done for 8-bit samples). */ static void TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, TIFF* tif) { TIFFRGBValue* clamptab; float* coeffs; int i; clamptab = (TIFFRGBValue*)( (tidata_t) ycbcr+TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long))); _TIFFmemset(clamptab, 0, 256); /* v < 0 => 0 */ ycbcr->clamptab = (clamptab += 256); for (i = 0; i < 256; i++) clamptab[i] = i; _TIFFmemset(clamptab+256, 255, 2*256); /* v > 255 => 255 */ TIFFGetFieldDefaulted(tif, TIFFTAG_YCBCRCOEFFICIENTS, &coeffs); _TIFFmemcpy(ycbcr->coeffs, coeffs, 3*sizeof (float)); { float f1 = 2-2*LumaRed; int32 D1 = FIX(f1); float f2 = LumaRed*f1/LumaGreen; int32 D2 = -FIX(f2); float f3 = 2-2*LumaBlue; int32 D3 = FIX(f3); float f4 = LumaBlue*f3/LumaGreen; int32 D4 = -FIX(f4); int x; ycbcr->Cr_r_tab = (int*) (clamptab + 3*256); ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256; ycbcr->Cr_g_tab = (int32*) (ycbcr->Cb_b_tab + 256); ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256; /* * i is the actual input pixel value in the range 0..255 * Cb and Cr values are in the range -128..127 (actually * they are in a range defined by the ReferenceBlackWhite * tag) so there is some range shifting to do here when * constructing tables indexed by the raw pixel data. * * XXX handle ReferenceBlackWhite correctly to calculate * Cb/Cr values to use in constructing the tables. */ for (i = 0, x = -128; i < 256; i++, x++) { ycbcr->Cr_r_tab[i] = (int)((D1*x + ONE_HALF)>>SHIFT); ycbcr->Cb_b_tab[i] = (int)((D3*x + ONE_HALF)>>SHIFT); ycbcr->Cr_g_tab[i] = D2*x; ycbcr->Cb_g_tab[i] = D4*x + ONE_HALF; } } } #undef SHIFT #undef ONE_HALF #undef FIX #undef LumaBlue #undef LumaGreen #undef LumaRed static tileContigRoutine initYCbCrConversion(TIFFRGBAImage* img) { uint16 hs, vs; if (img->ycbcr == NULL) { img->ycbcr = (TIFFYCbCrToRGB*) _TIFFmalloc( TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long)) + 4*256*sizeof (TIFFRGBValue) + 2*256*sizeof (int) + 2*256*sizeof (int32) ); if (img->ycbcr == NULL) { TIFFError(TIFFFileName(img->tif), "No space for YCbCr->RGB conversion state"); return (NULL); } TIFFYCbCrToRGBInit(img->ycbcr, img->tif); } else { float* coeffs; TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRCOEFFICIENTS, &coeffs); if (_TIFFmemcmp(coeffs, img->ycbcr->coeffs, 3*sizeof (float)) != 0) TIFFYCbCrToRGBInit(img->ycbcr, img->tif); } /* * The 6.0 spec says that subsampling must be * one of 1, 2, or 4, and that vertical subsampling * must always be <= horizontal subsampling; so * there are only a few possibilities and we just * enumerate the cases. */ TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &hs, &vs); switch ((hs<<4)|vs) { case 0x44: return (putcontig8bitYCbCr44tile); case 0x42: return (putcontig8bitYCbCr42tile); case 0x41: return (putcontig8bitYCbCr41tile); case 0x22: return (putcontig8bitYCbCr22tile); case 0x21: return (putcontig8bitYCbCr21tile); case 0x11: return (putcontig8bitYCbCr11tile); } return (NULL); } /* * Greyscale images with less than 8 bits/sample are handled * with a table to avoid lots of shifts and masks. The table * is setup so that put*bwtile (below) can retrieve 8/bitspersample * pixel values simply by indexing into the table with one * number. */ static int makebwmap(TIFFRGBAImage* img) { TIFFRGBValue* Map = img->Map; int bitspersample = img->bitspersample; int nsamples = 8 / bitspersample; int i; uint32* p; if( nsamples == 0 ) nsamples = 1; img->BWmap = (uint32**) _TIFFmalloc( 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32))); if (img->BWmap == NULL) { TIFFError(TIFFFileName(img->tif), "No space for B&W mapping table"); return (0); } p = (uint32*)(img->BWmap + 256); for (i = 0; i < 256; i++) { TIFFRGBValue c; img->BWmap[i] = p; switch (bitspersample) { #define GREY(x) c = Map[x]; *p++ = PACK(c,c,c); case 1: GREY(i>>7); GREY((i>>6)&1); GREY((i>>5)&1); GREY((i>>4)&1); GREY((i>>3)&1); GREY((i>>2)&1); GREY((i>>1)&1); GREY(i&1); break; case 2: GREY(i>>6); GREY((i>>4)&3); GREY((i>>2)&3); GREY(i&3); break; case 4: GREY(i>>4); GREY(i&0xf); break; case 8: case 16: GREY(i); break; } #undef GREY } return (1); } /* * Construct a mapping table to convert from the range * of the data samples to [0,255] --for display. This * process also handles inverting B&W images when needed. */ static int setupMap(TIFFRGBAImage* img) { int32 x, range; range = (int32)((1L<bitspersample)-1); /* treat 16 bit the same as eight bit */ if( img->bitspersample == 16 ) range = (int32) 255; img->Map = (TIFFRGBValue*) _TIFFmalloc((range+1) * sizeof (TIFFRGBValue)); if (img->Map == NULL) { TIFFError(TIFFFileName(img->tif), "No space for photometric conversion table"); return (0); } if (img->photometric == PHOTOMETRIC_MINISWHITE) { for (x = 0; x <= range; x++) img->Map[x] = (TIFFRGBValue) (((range - x) * 255) / range); } else { for (x = 0; x <= range; x++) img->Map[x] = (TIFFRGBValue) ((x * 255) / range); } if (img->bitspersample <= 16 && (img->photometric == PHOTOMETRIC_MINISBLACK || img->photometric == PHOTOMETRIC_MINISWHITE)) { /* * Use photometric mapping table to construct * unpacking tables for samples <= 8 bits. */ if (!makebwmap(img)) return (0); /* no longer need Map, free it */ _TIFFfree(img->Map), img->Map = NULL; } return (1); } static int checkcmap(TIFFRGBAImage* img) { uint16* r = img->redcmap; uint16* g = img->greencmap; uint16* b = img->bluecmap; long n = 1L<bitspersample; while (n-- > 0) if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256) return (16); return (8); } static void cvtcmap(TIFFRGBAImage* img) { uint16* r = img->redcmap; uint16* g = img->greencmap; uint16* b = img->bluecmap; long i; for (i = (1L<bitspersample)-1; i >= 0; i--) { #define CVT(x) ((uint16)((x)>>8)) r[i] = CVT(r[i]); g[i] = CVT(g[i]); b[i] = CVT(b[i]); #undef CVT } } /* * Palette images with <= 8 bits/sample are handled * with a table to avoid lots of shifts and masks. The table * is setup so that put*cmaptile (below) can retrieve 8/bitspersample * pixel values simply by indexing into the table with one * number. */ static int makecmap(TIFFRGBAImage* img) { int bitspersample = img->bitspersample; int nsamples = 8 / bitspersample; uint16* r = img->redcmap; uint16* g = img->greencmap; uint16* b = img->bluecmap; uint32 *p; int i; img->PALmap = (uint32**) _TIFFmalloc( 256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32))); if (img->PALmap == NULL) { TIFFError(TIFFFileName(img->tif), "No space for Palette mapping table"); return (0); } p = (uint32*)(img->PALmap + 256); for (i = 0; i < 256; i++) { TIFFRGBValue c; img->PALmap[i] = p; #define CMAP(x) c = x; *p++ = PACK(r[c]&0xff, g[c]&0xff, b[c]&0xff); switch (bitspersample) { case 1: CMAP(i>>7); CMAP((i>>6)&1); CMAP((i>>5)&1); CMAP((i>>4)&1); CMAP((i>>3)&1); CMAP((i>>2)&1); CMAP((i>>1)&1); CMAP(i&1); break; case 2: CMAP(i>>6); CMAP((i>>4)&3); CMAP((i>>2)&3); CMAP(i&3); break; case 4: CMAP(i>>4); CMAP(i&0xf); break; case 8: CMAP(i); break; } #undef CMAP } return (1); } /* * Construct any mapping table used * by the associated put routine. */ static int buildMap(TIFFRGBAImage* img) { switch (img->photometric) { case PHOTOMETRIC_RGB: case PHOTOMETRIC_YCBCR: case PHOTOMETRIC_SEPARATED: if (img->bitspersample == 8) break; /* fall thru... */ case PHOTOMETRIC_MINISBLACK: case PHOTOMETRIC_MINISWHITE: if (!setupMap(img)) return (0); break; case PHOTOMETRIC_PALETTE: /* * Convert 16-bit colormap to 8-bit (unless it looks * like an old-style 8-bit colormap). */ if (checkcmap(img) == 16) cvtcmap(img); else TIFFWarning(TIFFFileName(img->tif), "Assuming 8-bit colormap"); /* * Use mapping table and colormap to construct * unpacking tables for samples < 8 bits. */ if (img->bitspersample <= 8 && !makecmap(img)) return (0); break; } return (1); } /* * Select the appropriate conversion routine for packed data. */ static int pickTileContigCase(TIFFRGBAImage* img) { tileContigRoutine put = 0; if (buildMap(img)) { switch (img->photometric) { case PHOTOMETRIC_RGB: switch (img->bitspersample) { case 8: if (!img->Map) { if (img->alpha == EXTRASAMPLE_ASSOCALPHA) put = putRGBAAcontig8bittile; else if (img->alpha == EXTRASAMPLE_UNASSALPHA) put = putRGBUAcontig8bittile; else put = putRGBcontig8bittile; } else put = putRGBcontig8bitMaptile; break; case 16: put = putRGBcontig16bittile; if (!img->Map) { if (img->alpha == EXTRASAMPLE_ASSOCALPHA) put = putRGBAAcontig16bittile; else if (img->alpha == EXTRASAMPLE_UNASSALPHA) put = putRGBUAcontig16bittile; } break; } break; case PHOTOMETRIC_SEPARATED: if (img->bitspersample == 8) { if (!img->Map) put = putRGBcontig8bitCMYKtile; else put = putRGBcontig8bitCMYKMaptile; } break; case PHOTOMETRIC_PALETTE: switch (img->bitspersample) { case 8: put = put8bitcmaptile; break; case 4: put = put4bitcmaptile; break; case 2: put = put2bitcmaptile; break; case 1: put = put1bitcmaptile; break; } break; case PHOTOMETRIC_MINISWHITE: case PHOTOMETRIC_MINISBLACK: switch (img->bitspersample) { case 16: put = put16bitbwtile; break; case 8: put = putgreytile; break; case 4: put = put4bitbwtile; break; case 2: put = put2bitbwtile; break; case 1: put = put1bitbwtile; break; } break; case PHOTOMETRIC_YCBCR: if (img->bitspersample == 8) put = initYCbCrConversion(img); break; } } return ((img->put.contig = put) != 0); } /* * Select the appropriate conversion routine for unpacked data. * * NB: we assume that unpacked single channel data is directed * to the "packed routines. */ static int pickTileSeparateCase(TIFFRGBAImage* img) { tileSeparateRoutine put = 0; if (buildMap(img)) { switch (img->photometric) { case PHOTOMETRIC_RGB: switch (img->bitspersample) { case 8: if (!img->Map) { if (img->alpha == EXTRASAMPLE_ASSOCALPHA) put = putRGBAAseparate8bittile; else if (img->alpha == EXTRASAMPLE_UNASSALPHA) put = putRGBUAseparate8bittile; else put = putRGBseparate8bittile; } else put = putRGBseparate8bitMaptile; break; case 16: put = putRGBseparate16bittile; if (!img->Map) { if (img->alpha == EXTRASAMPLE_ASSOCALPHA) put = putRGBAAseparate16bittile; else if (img->alpha == EXTRASAMPLE_UNASSALPHA) put = putRGBUAseparate16bittile; } break; } break; } } return ((img->put.separate = put) != 0); } /* * Read a whole strip off data from the file, and convert to RGBA form. * If this is the last strip, then it will only contain the portion of * the strip that is actually within the image space. The result is * organized in bottom to top form. */ int TIFFReadRGBAStrip(TIFF* tif, uint32 row, uint32 * raster ) { char emsg[1024]; TIFFRGBAImage img; int ok; uint32 rowsperstrip, rows_to_read; if( TIFFIsTiled( tif ) ) { TIFFError(TIFFFileName(tif), "Can't use TIFFReadRGBAStrip() with tiled file."); return (0); } TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip); if( (row % rowsperstrip) != 0 ) { TIFFError(TIFFFileName(tif), "Row passed to TIFFReadRGBAStrip() must be first in a strip."); return (0); } if (TIFFRGBAImageBegin(&img, tif, 0, emsg)) { img.row_offset = row; img.col_offset = 0; if( row + rowsperstrip > img.height ) rows_to_read = img.height - row; else rows_to_read = rowsperstrip; ok = TIFFRGBAImageGet(&img, raster, img.width, rows_to_read ); TIFFRGBAImageEnd(&img); } else { TIFFError(TIFFFileName(tif), emsg); ok = 0; } return (ok); } /* * Read a whole tile off data from the file, and convert to RGBA form. * The returned RGBA data is organized from bottom to top of tile, * and may include zeroed areas if the tile extends off the image. */ int TIFFReadRGBATile(TIFF* tif, uint32 col, uint32 row, uint32 * raster) { char emsg[1024]; TIFFRGBAImage img; int ok; uint32 tile_xsize, tile_ysize; uint32 read_xsize, read_ysize; uint32 i_row; /* * Verify that our request is legal - on a tile file, and on a * tile boundary. */ if( !TIFFIsTiled( tif ) ) { TIFFError(TIFFFileName(tif), "Can't use TIFFReadRGBATile() with stripped file."); return (0); } TIFFGetFieldDefaulted(tif, TIFFTAG_TILEWIDTH, &tile_xsize); TIFFGetFieldDefaulted(tif, TIFFTAG_TILELENGTH, &tile_ysize); if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 ) { TIFFError(TIFFFileName(tif), "Row/col passed to TIFFReadRGBATile() must be top" "left corner of a tile."); return (0); } /* * Setup the RGBA reader. */ if ( !TIFFRGBAImageBegin(&img, tif, 0, emsg)) { TIFFError(TIFFFileName(tif), emsg); return( 0 ); } /* * The TIFFRGBAImageGet() function doesn't allow us to get off the * edge of the image, even to fill an otherwise valid tile. So we * figure out how much we can read, and fix up the tile buffer to * a full tile configuration afterwards. */ if( row + tile_ysize > img.height ) read_ysize = img.height - row; else read_ysize = tile_ysize; if( col + tile_xsize > img.width ) read_xsize = img.width - col; else read_xsize = tile_xsize; /* * Read the chunk of imagery. */ img.row_offset = row; img.col_offset = col; ok = TIFFRGBAImageGet(&img, raster, read_xsize, read_ysize ); TIFFRGBAImageEnd(&img); /* * If our read was incomplete we will need to fix up the tile by * shifting the data around as if a full tile of data is being returned. * * This is all the more complicated because the image is organized in * bottom to top format. */ if( read_xsize == tile_xsize && read_ysize == tile_ysize ) return( ok ); for( i_row = 0; i_row < read_ysize; i_row++ ) { memmove( raster + (tile_ysize - i_row - 1) * tile_xsize, raster + (read_ysize - i_row - 1) * read_xsize, read_xsize * sizeof(uint32) ); _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize, 0, sizeof(uint32) * (tile_xsize - read_xsize) ); } for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) { _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize, 0, sizeof(uint32) * tile_xsize ); } return (ok); } gamera-3.3.3/src/libtiff/tif_jpeg.c0000644000076500000000000012126310714675674016131 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1994-1997 Sam Leffler * Copyright (c) 1994-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef JPEG_SUPPORT /* * TIFF Library * * JPEG Compression support per TIFF Technical Note #2 * (*not* per the original TIFF 6.0 spec). * * This file is simply an interface to the libjpeg library written by * the Independent JPEG Group. You need release 5 or later of the IJG * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/. * * Contributed by Tom Lane . */ #include #include #include /* We undefine FAR to avoid conflict with JPEG definition */ #ifdef FAR #undef FAR #endif /* The windows RPCNDR.H file defines boolean. */ #ifdef __RPCNDR_H__ #define HAVE_BOOLEAN #endif #include "jpeglib.h" #include "jerror.h" /* * On some machines it may be worthwhile to use _setjmp or sigsetjmp * in place of plain setjmp. These macros will make it easier. */ #define SETJMP(jbuf) setjmp(jbuf) #define LONGJMP(jbuf,code) longjmp(jbuf,code) #define JMP_BUF jmp_buf typedef struct jpeg_destination_mgr jpeg_destination_mgr; typedef struct jpeg_source_mgr jpeg_source_mgr; typedef struct jpeg_error_mgr jpeg_error_mgr; /* * State block for each open TIFF file using * libjpeg to do JPEG compression/decompression. * * libjpeg's visible state is either a jpeg_compress_struct * or jpeg_decompress_struct depending on which way we * are going. comm can be used to refer to the fields * which are common to both. * * NB: cinfo is required to be the first member of JPEGState, * so we can safely cast JPEGState* -> jpeg_xxx_struct* * and vice versa! */ typedef struct { union { struct jpeg_compress_struct c; struct jpeg_decompress_struct d; struct jpeg_common_struct comm; } cinfo; /* NB: must be first */ jpeg_error_mgr err; /* libjpeg error manager */ JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */ /* * The following two members could be a union, but * they're small enough that it's not worth the effort. */ jpeg_destination_mgr dest; /* data dest for compression */ jpeg_source_mgr src; /* data source for decompression */ /* private state */ TIFF* tif; /* back link needed by some code */ uint16 photometric; /* copy of PhotometricInterpretation */ uint16 h_sampling; /* luminance sampling factors */ uint16 v_sampling; tsize_t bytesperline; /* decompressed bytes per scanline */ /* pointers to intermediate buffers when processing downsampled data */ JSAMPARRAY ds_buffer[MAX_COMPONENTS]; int scancount; /* number of "scanlines" accumulated */ int samplesperclump; TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ TIFFStripMethod defsparent; /* super-class method */ TIFFTileMethod deftparent; /* super-class method */ /* pseudo-tag fields */ void* jpegtables; /* JPEGTables tag value, or NULL */ uint32 jpegtables_length; /* number of bytes in same */ int jpegquality; /* Compression quality level */ int jpegcolormode; /* Auto RGB<=>YCbCr convert? */ int jpegtablesmode; /* What to put in JPEGTables */ } JPEGState; #define JState(tif) ((JPEGState*)(tif)->tif_data) static int JPEGDecode(TIFF*, tidata_t, tsize_t, tsample_t); static int JPEGDecodeRaw(TIFF*, tidata_t, tsize_t, tsample_t); static int JPEGEncode(TIFF*, tidata_t, tsize_t, tsample_t); static int JPEGEncodeRaw(TIFF*, tidata_t, tsize_t, tsample_t); #define FIELD_JPEGTABLES (FIELD_CODEC+0) static const TIFFFieldInfo jpegFieldInfo[] = { { TIFFTAG_JPEGTABLES, -1,-1, TIFF_UNDEFINED, FIELD_JPEGTABLES, FALSE, TRUE, "JPEGTables" }, { TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, FIELD_PSEUDO, TRUE, FALSE, "" }, { TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO, FALSE, FALSE, "" }, { TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO, FALSE, FALSE, "" }, }; #define N(a) (sizeof (a) / sizeof (a[0])) /* * libjpeg interface layer. * * We use setjmp/longjmp to return control to libtiff * when a fatal error is encountered within the JPEG * library. We also direct libjpeg error and warning * messages through the appropriate libtiff handlers. */ /* * Error handling routines (these replace corresponding * IJG routines from jerror.c). These are used for both * compression and decompression. */ static void TIFFjpeg_error_exit(j_common_ptr cinfo) { JPEGState *sp = (JPEGState *) cinfo; /* NB: cinfo assumed first */ char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message) (cinfo, buffer); TIFFError("JPEGLib", buffer); /* display the error message */ jpeg_abort(cinfo); /* clean up libjpeg state */ LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */ } /* * This routine is invoked only for warning messages, * since error_exit does its own thing and trace_level * is never set > 0. */ static void TIFFjpeg_output_message(j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message) (cinfo, buffer); TIFFWarning("JPEGLib", buffer); } /* * Interface routines. This layer of routines exists * primarily to limit side-effects from using setjmp. * Also, normal/error returns are converted into return * values per libtiff practice. */ #define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op)) #define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1)) static int TIFFjpeg_create_compress(JPEGState* sp) { /* initialize JPEG error handling */ sp->cinfo.c.err = jpeg_std_error(&sp->err); sp->err.error_exit = TIFFjpeg_error_exit; sp->err.output_message = TIFFjpeg_output_message; return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c)); } static int TIFFjpeg_create_decompress(JPEGState* sp) { /* initialize JPEG error handling */ sp->cinfo.d.err = jpeg_std_error(&sp->err); sp->err.error_exit = TIFFjpeg_error_exit; sp->err.output_message = TIFFjpeg_output_message; return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d)); } static int TIFFjpeg_set_defaults(JPEGState* sp) { return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c)); } static int TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace) { return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace)); } static int TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline) { return CALLVJPEG(sp, jpeg_set_quality(&sp->cinfo.c, quality, force_baseline)); } static int TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress) { return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress)); } static int TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables) { return CALLVJPEG(sp, jpeg_start_compress(&sp->cinfo.c, write_all_tables)); } static int TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines) { return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c, scanlines, (JDIMENSION) num_lines)); } static int TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines) { return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c, data, (JDIMENSION) num_lines)); } static int TIFFjpeg_finish_compress(JPEGState* sp) { return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c)); } static int TIFFjpeg_write_tables(JPEGState* sp) { return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c)); } static int TIFFjpeg_read_header(JPEGState* sp, boolean require_image) { return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image)); } static int TIFFjpeg_start_decompress(JPEGState* sp) { return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d)); } static int TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines) { return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d, scanlines, (JDIMENSION) max_lines)); } static int TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines) { return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d, data, (JDIMENSION) max_lines)); } static int TIFFjpeg_finish_decompress(JPEGState* sp) { return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d)); } static int TIFFjpeg_abort(JPEGState* sp) { return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm)); } static int TIFFjpeg_destroy(JPEGState* sp) { return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm)); } static JSAMPARRAY TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id, JDIMENSION samplesperrow, JDIMENSION numrows) { return CALLJPEG(sp, (JSAMPARRAY) NULL, (*sp->cinfo.comm.mem->alloc_sarray) (&sp->cinfo.comm, pool_id, samplesperrow, numrows)); } /* * JPEG library destination data manager. * These routines direct compressed data from libjpeg into the * libtiff output buffer. */ static void std_init_destination(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; TIFF* tif = sp->tif; sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata; sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize; } static boolean std_empty_output_buffer(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; TIFF* tif = sp->tif; /* the entire buffer has been filled */ tif->tif_rawcc = tif->tif_rawdatasize; TIFFFlushData1(tif); sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata; sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize; return (TRUE); } static void std_term_destination(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; TIFF* tif = sp->tif; tif->tif_rawcp = (tidata_t) sp->dest.next_output_byte; tif->tif_rawcc = tif->tif_rawdatasize - (tsize_t) sp->dest.free_in_buffer; /* NB: libtiff does the final buffer flush */ } static void TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif) { (void) tif; sp->cinfo.c.dest = &sp->dest; sp->dest.init_destination = std_init_destination; sp->dest.empty_output_buffer = std_empty_output_buffer; sp->dest.term_destination = std_term_destination; } /* * Alternate destination manager for outputting to JPEGTables field. */ static void tables_init_destination(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; /* while building, jpegtables_length is allocated buffer size */ sp->dest.next_output_byte = (JOCTET*) sp->jpegtables; sp->dest.free_in_buffer = (size_t) sp->jpegtables_length; } static boolean tables_empty_output_buffer(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; void* newbuf; /* the entire buffer has been filled; enlarge it by 1000 bytes */ newbuf = _TIFFrealloc((tdata_t) sp->jpegtables, (tsize_t) (sp->jpegtables_length + 1000)); if (newbuf == NULL) ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100); sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length; sp->dest.free_in_buffer = (size_t) 1000; sp->jpegtables = newbuf; sp->jpegtables_length += 1000; return (TRUE); } static void tables_term_destination(j_compress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; /* set tables length to number of bytes actually emitted */ sp->jpegtables_length -= sp->dest.free_in_buffer; } static int TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif) { (void) tif; /* * Allocate a working buffer for building tables. * Initial size is 1000 bytes, which is usually adequate. */ if (sp->jpegtables) _TIFFfree(sp->jpegtables); sp->jpegtables_length = 1000; sp->jpegtables = (void*) _TIFFmalloc((tsize_t) sp->jpegtables_length); if (sp->jpegtables == NULL) { sp->jpegtables_length = 0; TIFFError("TIFFjpeg_tables_dest", "No space for JPEGTables"); return (0); } sp->cinfo.c.dest = &sp->dest; sp->dest.init_destination = tables_init_destination; sp->dest.empty_output_buffer = tables_empty_output_buffer; sp->dest.term_destination = tables_term_destination; return (1); } /* * JPEG library source data manager. * These routines supply compressed data to libjpeg. */ static void std_init_source(j_decompress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; TIFF* tif = sp->tif; sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata; sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc; } static boolean std_fill_input_buffer(j_decompress_ptr cinfo) { JPEGState* sp = (JPEGState* ) cinfo; static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI }; /* * Should never get here since entire strip/tile is * read into memory before the decompressor is called, * and thus was supplied by init_source. */ WARNMS(cinfo, JWRN_JPEG_EOF); /* insert a fake EOI marker */ sp->src.next_input_byte = dummy_EOI; sp->src.bytes_in_buffer = 2; return (TRUE); } static void std_skip_input_data(j_decompress_ptr cinfo, long num_bytes) { JPEGState* sp = (JPEGState*) cinfo; if (num_bytes > 0) { if (num_bytes > (long) sp->src.bytes_in_buffer) { /* oops, buffer overrun */ (void) std_fill_input_buffer(cinfo); } else { sp->src.next_input_byte += (size_t) num_bytes; sp->src.bytes_in_buffer -= (size_t) num_bytes; } } } static void std_term_source(j_decompress_ptr cinfo) { /* No work necessary here */ /* Or must we update tif->tif_rawcp, tif->tif_rawcc ??? */ /* (if so, need empty tables_term_source!) */ (void) cinfo; } static void TIFFjpeg_data_src(JPEGState* sp, TIFF* tif) { (void) tif; sp->cinfo.d.src = &sp->src; sp->src.init_source = std_init_source; sp->src.fill_input_buffer = std_fill_input_buffer; sp->src.skip_input_data = std_skip_input_data; sp->src.resync_to_restart = jpeg_resync_to_restart; sp->src.term_source = std_term_source; sp->src.bytes_in_buffer = 0; /* for safety */ sp->src.next_input_byte = NULL; } /* * Alternate source manager for reading from JPEGTables. * We can share all the code except for the init routine. */ static void tables_init_source(j_decompress_ptr cinfo) { JPEGState* sp = (JPEGState*) cinfo; sp->src.next_input_byte = (const JOCTET*) sp->jpegtables; sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length; } static void TIFFjpeg_tables_src(JPEGState* sp, TIFF* tif) { TIFFjpeg_data_src(sp, tif); sp->src.init_source = tables_init_source; } /* * Allocate downsampled-data buffers needed for downsampled I/O. * We use values computed in jpeg_start_compress or jpeg_start_decompress. * We use libjpeg's allocator so that buffers will be released automatically * when done with strip/tile. * This is also a handy place to compute samplesperclump, bytesperline. */ static int alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info, int num_components) { JPEGState* sp = JState(tif); int ci; jpeg_component_info* compptr; JSAMPARRAY buf; int samples_per_clump = 0; for (ci = 0, compptr = comp_info; ci < num_components; ci++, compptr++) { samples_per_clump += compptr->h_samp_factor * compptr->v_samp_factor; buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE, compptr->width_in_blocks * DCTSIZE, (JDIMENSION) (compptr->v_samp_factor*DCTSIZE)); if (buf == NULL) return (0); sp->ds_buffer[ci] = buf; } sp->samplesperclump = samples_per_clump; return (1); } /* * JPEG Decoding. */ static int JPEGSetupDecode(TIFF* tif) { JPEGState* sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; assert(sp != NULL); assert(sp->cinfo.comm.is_decompressor); /* Read JPEGTables if it is present */ if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) { TIFFjpeg_tables_src(sp, tif); if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) { TIFFError("JPEGSetupDecode", "Bogus JPEGTables field"); return (0); } } /* Grab parameters that are same for all strips/tiles */ sp->photometric = td->td_photometric; switch (sp->photometric) { case PHOTOMETRIC_YCBCR: sp->h_sampling = td->td_ycbcrsubsampling[0]; sp->v_sampling = td->td_ycbcrsubsampling[1]; break; default: /* TIFF 6.0 forbids subsampling of all other color spaces */ sp->h_sampling = 1; sp->v_sampling = 1; break; } /* Set up for reading normal data */ TIFFjpeg_data_src(sp, tif); tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */ return (1); } /* * Set up for decoding a strip or tile. */ static int JPEGPreDecode(TIFF* tif, tsample_t s) { JPEGState *sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; static const char module[] = "JPEGPreDecode"; uint32 segment_width, segment_height; int downsampled_output; int ci; assert(sp != NULL); assert(sp->cinfo.comm.is_decompressor); /* * Reset decoder state from any previous strip/tile, * in case application didn't read the whole strip. */ if (!TIFFjpeg_abort(sp)) return (0); /* * Read the header for this strip/tile. */ if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK) return (0); /* * Check image parameters and set decompression parameters. */ segment_width = td->td_imagewidth; segment_height = td->td_imagelength - tif->tif_row; if (isTiled(tif)) { if (segment_height > td->td_tilelength) segment_height = td->td_tilelength; sp->bytesperline = TIFFTileRowSize(tif); } else { if (segment_height > td->td_rowsperstrip) segment_height = td->td_rowsperstrip; sp->bytesperline = TIFFScanlineSize(tif); } if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) { /* * For PC 2, scale down the expected strip/tile size * to match a downsampled component */ segment_width = TIFFhowmany(segment_width, sp->h_sampling); segment_height = TIFFhowmany(segment_height, sp->v_sampling); } if (sp->cinfo.d.image_width != segment_width || sp->cinfo.d.image_height != segment_height) { TIFFError(module, "Improper JPEG strip/tile size"); return (0); } if (sp->cinfo.d.num_components != (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1)) { TIFFError(module, "Improper JPEG component count"); return (0); } if (sp->cinfo.d.data_precision != td->td_bitspersample) { TIFFError(module, "Improper JPEG data precision"); return (0); } if (td->td_planarconfig == PLANARCONFIG_CONTIG) { /* Component 0 should have expected sampling factors */ if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling || sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) { TIFFError(module, "Improper JPEG sampling factors"); return (0); } /* Rest should have sampling factors 1,1 */ for (ci = 1; ci < sp->cinfo.d.num_components; ci++) { if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 || sp->cinfo.d.comp_info[ci].v_samp_factor != 1) { TIFFError(module, "Improper JPEG sampling factors"); return (0); } } } else { /* PC 2's single component should have sampling factors 1,1 */ if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 || sp->cinfo.d.comp_info[0].v_samp_factor != 1) { TIFFError(module, "Improper JPEG sampling factors"); return (0); } } downsampled_output = FALSE; if (td->td_planarconfig == PLANARCONFIG_CONTIG && sp->photometric == PHOTOMETRIC_YCBCR && sp->jpegcolormode == JPEGCOLORMODE_RGB) { /* Convert YCbCr to RGB */ sp->cinfo.d.jpeg_color_space = JCS_YCbCr; sp->cinfo.d.out_color_space = JCS_RGB; } else { /* Suppress colorspace handling */ sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN; sp->cinfo.d.out_color_space = JCS_UNKNOWN; if (td->td_planarconfig == PLANARCONFIG_CONTIG && (sp->h_sampling != 1 || sp->v_sampling != 1)) downsampled_output = TRUE; /* XXX what about up-sampling? */ } if (downsampled_output) { /* Need to use raw-data interface to libjpeg */ sp->cinfo.d.raw_data_out = TRUE; tif->tif_decoderow = JPEGDecodeRaw; tif->tif_decodestrip = JPEGDecodeRaw; tif->tif_decodetile = JPEGDecodeRaw; } else { /* Use normal interface to libjpeg */ sp->cinfo.d.raw_data_out = FALSE; tif->tif_decoderow = JPEGDecode; tif->tif_decodestrip = JPEGDecode; tif->tif_decodetile = JPEGDecode; } /* Start JPEG decompressor */ if (!TIFFjpeg_start_decompress(sp)) return (0); /* Allocate downsampled-data buffers if needed */ if (downsampled_output) { if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info, sp->cinfo.d.num_components)) return (0); sp->scancount = DCTSIZE; /* mark buffer empty */ } return (1); } /* * Decode a chunk of pixels. * "Standard" case: returned data is not downsampled. */ /*ARGSUSED*/ static int JPEGDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) { JPEGState *sp = JState(tif); tsize_t nrows; /* data is expected to be read in multiples of a scanline */ if (nrows = sp->cinfo.d.image_height) do { JSAMPROW bufptr = (JSAMPROW)buf; if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1) return (0); ++tif->tif_row; buf += sp->bytesperline; cc -= sp->bytesperline; } while (--nrows > 0); /* Close down the decompressor if we've finished the strip or tile. */ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height || TIFFjpeg_finish_decompress(sp); } /* * Decode a chunk of pixels. * Returned data is downsampled per sampling factors. */ /*ARGSUSED*/ static int JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) { JPEGState *sp = JState(tif); tsize_t nrows; /* data is expected to be read in multiples of a scanline */ if (nrows = sp->cinfo.d.image_height) { /* Cb,Cr both have sampling factors 1, so this is correct */ JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width; int samples_per_clump = sp->samplesperclump; do { jpeg_component_info *compptr; int ci, clumpoffset; /* Reload downsampled-data buffer if needed */ if (sp->scancount >= DCTSIZE) { int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE; if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n) return (0); sp->scancount = 0; } /* * Fastest way to unseparate data is to make one pass * over the scanline for each row of each component. */ clumpoffset = 0; /* first sample in clump */ for (ci = 0, compptr = sp->cinfo.d.comp_info; ci < sp->cinfo.d.num_components; ci++, compptr++) { int hsamp = compptr->h_samp_factor; int vsamp = compptr->v_samp_factor; int ypos; for (ypos = 0; ypos < vsamp; ypos++) { JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos]; JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset; JDIMENSION nclump; if (hsamp == 1) { /* fast path for at least Cb and Cr */ for (nclump = clumps_per_line; nclump-- > 0; ) { outptr[0] = *inptr++; outptr += samples_per_clump; } } else { int xpos; /* general case */ for (nclump = clumps_per_line; nclump-- > 0; ) { for (xpos = 0; xpos < hsamp; xpos++) outptr[xpos] = *inptr++; outptr += samples_per_clump; } } clumpoffset += hsamp; } } ++sp->scancount; ++tif->tif_row; buf += sp->bytesperline; cc -= sp->bytesperline; } while (--nrows > 0); } /* Close down the decompressor if done. */ return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height || TIFFjpeg_finish_decompress(sp); } /* * JPEG Encoding. */ static void unsuppress_quant_table (JPEGState* sp, int tblno) { JQUANT_TBL* qtbl; if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL) qtbl->sent_table = FALSE; } static void unsuppress_huff_table (JPEGState* sp, int tblno) { JHUFF_TBL* htbl; if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL) htbl->sent_table = FALSE; if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL) htbl->sent_table = FALSE; } static int prepare_JPEGTables(TIFF* tif) { JPEGState* sp = JState(tif); /* Initialize quant tables for current quality setting */ if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) return (0); /* Mark only the tables we want for output */ /* NB: chrominance tables are currently used only with YCbCr */ if (!TIFFjpeg_suppress_tables(sp, TRUE)) return (0); if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) { unsuppress_quant_table(sp, 0); if (sp->photometric == PHOTOMETRIC_YCBCR) unsuppress_quant_table(sp, 1); } if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) { unsuppress_huff_table(sp, 0); if (sp->photometric == PHOTOMETRIC_YCBCR) unsuppress_huff_table(sp, 1); } /* Direct libjpeg output into jpegtables */ if (!TIFFjpeg_tables_dest(sp, tif)) return (0); /* Emit tables-only datastream */ if (!TIFFjpeg_write_tables(sp)) return (0); return (1); } static int JPEGSetupEncode(TIFF* tif) { JPEGState* sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; static const char module[] = "JPEGSetupEncode"; assert(sp != NULL); assert(!sp->cinfo.comm.is_decompressor); /* * Initialize all JPEG parameters to default values. * Note that jpeg_set_defaults needs legal values for * in_color_space and input_components. */ sp->cinfo.c.in_color_space = JCS_UNKNOWN; sp->cinfo.c.input_components = 1; if (!TIFFjpeg_set_defaults(sp)) return (0); /* Set per-file parameters */ sp->photometric = td->td_photometric; switch (sp->photometric) { case PHOTOMETRIC_YCBCR: sp->h_sampling = td->td_ycbcrsubsampling[0]; sp->v_sampling = td->td_ycbcrsubsampling[1]; /* * A ReferenceBlackWhite field *must* be present since the * default value is inappropriate for YCbCr. Fill in the * proper value if application didn't set it. */ #ifdef COLORIMETRY_SUPPORT if (!TIFFFieldSet(tif, FIELD_REFBLACKWHITE)) { float refbw[6]; long top = 1L << td->td_bitspersample; refbw[0] = 0; refbw[1] = (float)(top-1L); refbw[2] = (float)(top>>1); refbw[3] = refbw[1]; refbw[4] = refbw[2]; refbw[5] = refbw[1]; TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refbw); } #endif break; case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */ case PHOTOMETRIC_MASK: TIFFError(module, "PhotometricInterpretation %d not allowed for JPEG", (int) sp->photometric); return (0); default: /* TIFF 6.0 forbids subsampling of all other color spaces */ sp->h_sampling = 1; sp->v_sampling = 1; break; } /* Verify miscellaneous parameters */ /* * This would need work if libtiff ever supports different * depths for different components, or if libjpeg ever supports * run-time selection of depth. Neither is imminent. */ if (td->td_bitspersample != BITS_IN_JSAMPLE) { TIFFError(module, "BitsPerSample %d not allowed for JPEG", (int) td->td_bitspersample); return (0); } sp->cinfo.c.data_precision = td->td_bitspersample; if (isTiled(tif)) { if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) { TIFFError(module, "JPEG tile height must be multiple of %d", sp->v_sampling * DCTSIZE); return (0); } if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) { TIFFError(module, "JPEG tile width must be multiple of %d", sp->h_sampling * DCTSIZE); return (0); } } else { if (td->td_rowsperstrip < td->td_imagelength && (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) { TIFFError(module, "RowsPerStrip must be multiple of %d for JPEG", sp->v_sampling * DCTSIZE); return (0); } } /* Create a JPEGTables field if appropriate */ if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) { if (!prepare_JPEGTables(tif)) return (0); /* Mark the field present */ /* Can't use TIFFSetField since BEENWRITING is already set! */ TIFFSetFieldBit(tif, FIELD_JPEGTABLES); tif->tif_flags |= TIFF_DIRTYDIRECT; } else { /* We do not support application-supplied JPEGTables, */ /* so mark the field not present */ TIFFClrFieldBit(tif, FIELD_JPEGTABLES); } /* Direct libjpeg output to libtiff's output buffer */ TIFFjpeg_data_dest(sp, tif); return (1); } /* * Set encoding state at the start of a strip or tile. */ static int JPEGPreEncode(TIFF* tif, tsample_t s) { JPEGState *sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; static const char module[] = "JPEGPreEncode"; uint32 segment_width, segment_height; int downsampled_input; assert(sp != NULL); assert(!sp->cinfo.comm.is_decompressor); /* * Set encoding parameters for this strip/tile. */ if (isTiled(tif)) { segment_width = td->td_tilewidth; segment_height = td->td_tilelength; sp->bytesperline = TIFFTileRowSize(tif); } else { segment_width = td->td_imagewidth; segment_height = td->td_imagelength - tif->tif_row; if (segment_height > td->td_rowsperstrip) segment_height = td->td_rowsperstrip; sp->bytesperline = TIFFScanlineSize(tif); } if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) { /* for PC 2, scale down the strip/tile size * to match a downsampled component */ segment_width = TIFFhowmany(segment_width, sp->h_sampling); segment_height = TIFFhowmany(segment_height, sp->v_sampling); } if (segment_width > 65535 || segment_height > 65535) { TIFFError(module, "Strip/tile too large for JPEG"); return (0); } sp->cinfo.c.image_width = segment_width; sp->cinfo.c.image_height = segment_height; downsampled_input = FALSE; if (td->td_planarconfig == PLANARCONFIG_CONTIG) { sp->cinfo.c.input_components = td->td_samplesperpixel; if (sp->photometric == PHOTOMETRIC_YCBCR) { if (sp->jpegcolormode == JPEGCOLORMODE_RGB) { sp->cinfo.c.in_color_space = JCS_RGB; } else { sp->cinfo.c.in_color_space = JCS_YCbCr; if (sp->h_sampling != 1 || sp->v_sampling != 1) downsampled_input = TRUE; } if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr)) return (0); /* * Set Y sampling factors; * we assume jpeg_set_colorspace() set the rest to 1 */ sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling; sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling; } else { sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) return (0); /* jpeg_set_colorspace set all sampling factors to 1 */ } } else { sp->cinfo.c.input_components = 1; sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN)) return (0); sp->cinfo.c.comp_info[0].component_id = s; /* jpeg_set_colorspace() set sampling factors to 1 */ if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) { sp->cinfo.c.comp_info[0].quant_tbl_no = 1; sp->cinfo.c.comp_info[0].dc_tbl_no = 1; sp->cinfo.c.comp_info[0].ac_tbl_no = 1; } } /* ensure libjpeg won't write any extraneous markers */ sp->cinfo.c.write_JFIF_header = FALSE; sp->cinfo.c.write_Adobe_marker = FALSE; /* set up table handling correctly */ if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) { if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE)) return (0); unsuppress_quant_table(sp, 0); unsuppress_quant_table(sp, 1); } if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) sp->cinfo.c.optimize_coding = FALSE; else sp->cinfo.c.optimize_coding = TRUE; if (downsampled_input) { /* Need to use raw-data interface to libjpeg */ sp->cinfo.c.raw_data_in = TRUE; tif->tif_encoderow = JPEGEncodeRaw; tif->tif_encodestrip = JPEGEncodeRaw; tif->tif_encodetile = JPEGEncodeRaw; } else { /* Use normal interface to libjpeg */ sp->cinfo.c.raw_data_in = FALSE; tif->tif_encoderow = JPEGEncode; tif->tif_encodestrip = JPEGEncode; tif->tif_encodetile = JPEGEncode; } /* Start JPEG compressor */ if (!TIFFjpeg_start_compress(sp, FALSE)) return (0); /* Allocate downsampled-data buffers if needed */ if (downsampled_input) { if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info, sp->cinfo.c.num_components)) return (0); } sp->scancount = 0; return (1); } /* * Encode a chunk of pixels. * "Standard" case: incoming data is not downsampled. */ static int JPEGEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) { JPEGState *sp = JState(tif); tsize_t nrows; JSAMPROW bufptr[1]; (void) s; assert(sp != NULL); /* data is expected to be supplied in multiples of a scanline */ nrows = cc / sp->bytesperline; if (cc % sp->bytesperline) TIFFWarning(tif->tif_name, "fractional scanline discarded"); while (nrows-- > 0) { bufptr[0] = (JSAMPROW) buf; if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1) return (0); if (nrows > 0) tif->tif_row++; buf += sp->bytesperline; } return (1); } /* * Encode a chunk of pixels. * Incoming data is expected to be downsampled per sampling factors. */ static int JPEGEncodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) { JPEGState *sp = JState(tif); JSAMPLE* inptr; JSAMPLE* outptr; tsize_t nrows; JDIMENSION clumps_per_line, nclump; int clumpoffset, ci, xpos, ypos; jpeg_component_info* compptr; int samples_per_clump = sp->samplesperclump; (void) s; assert(sp != NULL); /* data is expected to be supplied in multiples of a scanline */ nrows = cc / sp->bytesperline; if (cc % sp->bytesperline) TIFFWarning(tif->tif_name, "fractional scanline discarded"); /* Cb,Cr both have sampling factors 1, so this is correct */ clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width; while (nrows-- > 0) { /* * Fastest way to separate the data is to make one pass * over the scanline for each row of each component. */ clumpoffset = 0; /* first sample in clump */ for (ci = 0, compptr = sp->cinfo.c.comp_info; ci < sp->cinfo.c.num_components; ci++, compptr++) { int hsamp = compptr->h_samp_factor; int vsamp = compptr->v_samp_factor; int padding = (int) (compptr->width_in_blocks * DCTSIZE - clumps_per_line * hsamp); for (ypos = 0; ypos < vsamp; ypos++) { inptr = ((JSAMPLE*) buf) + clumpoffset; outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos]; if (hsamp == 1) { /* fast path for at least Cb and Cr */ for (nclump = clumps_per_line; nclump-- > 0; ) { *outptr++ = inptr[0]; inptr += samples_per_clump; } } else { /* general case */ for (nclump = clumps_per_line; nclump-- > 0; ) { for (xpos = 0; xpos < hsamp; xpos++) *outptr++ = inptr[xpos]; inptr += samples_per_clump; } } /* pad each scanline as needed */ for (xpos = 0; xpos < padding; xpos++) { *outptr = outptr[-1]; outptr++; } clumpoffset += hsamp; } } sp->scancount++; if (sp->scancount >= DCTSIZE) { int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE; if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n) return (0); sp->scancount = 0; } if (nrows > 0) tif->tif_row++; buf += sp->bytesperline; } return (1); } /* * Finish up at the end of a strip or tile. */ static int JPEGPostEncode(TIFF* tif) { JPEGState *sp = JState(tif); if (sp->scancount > 0) { /* * Need to emit a partial bufferload of downsampled data. * Pad the data vertically. */ int ci, ypos, n; jpeg_component_info* compptr; for (ci = 0, compptr = sp->cinfo.c.comp_info; ci < sp->cinfo.c.num_components; ci++, compptr++) { int vsamp = compptr->v_samp_factor; tsize_t row_width = compptr->width_in_blocks * DCTSIZE * sizeof(JSAMPLE); for (ypos = sp->scancount * vsamp; ypos < DCTSIZE * vsamp; ypos++) { _TIFFmemcpy((tdata_t)sp->ds_buffer[ci][ypos], (tdata_t)sp->ds_buffer[ci][ypos-1], row_width); } } n = sp->cinfo.c.max_v_samp_factor * DCTSIZE; if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n) return (0); } return (TIFFjpeg_finish_compress(JState(tif))); } static void JPEGCleanup(TIFF* tif) { if (tif->tif_data) { JPEGState *sp = JState(tif); TIFFjpeg_destroy(sp); /* release libjpeg resources */ if (sp->jpegtables) /* tag value */ _TIFFfree(sp->jpegtables); _TIFFfree(tif->tif_data); /* release local state */ tif->tif_data = NULL; } } static int JPEGVSetField(TIFF* tif, ttag_t tag, va_list ap) { JPEGState* sp = JState(tif); TIFFDirectory* td = &tif->tif_dir; uint32 v32; switch (tag) { case TIFFTAG_JPEGTABLES: v32 = va_arg(ap, uint32); if (v32 == 0) { /* XXX */ return (0); } _TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*), (long) v32); sp->jpegtables_length = v32; TIFFSetFieldBit(tif, FIELD_JPEGTABLES); break; case TIFFTAG_JPEGQUALITY: sp->jpegquality = va_arg(ap, int); return (1); /* pseudo tag */ case TIFFTAG_JPEGCOLORMODE: sp->jpegcolormode = va_arg(ap, int); /* * Mark whether returned data is up-sampled or not * so TIFFStripSize and TIFFTileSize return values * that reflect the true amount of data. */ tif->tif_flags &= ~TIFF_UPSAMPLED; if (td->td_planarconfig == PLANARCONFIG_CONTIG) { if (td->td_photometric == PHOTOMETRIC_YCBCR && sp->jpegcolormode == JPEGCOLORMODE_RGB) { tif->tif_flags |= TIFF_UPSAMPLED; } else { if (td->td_ycbcrsubsampling[0] != 1 || td->td_ycbcrsubsampling[1] != 1) ; /* XXX what about up-sampling? */ } } /* * Must recalculate cached tile size * in case sampling state changed. */ tif->tif_tilesize = TIFFTileSize(tif); return (1); /* pseudo tag */ case TIFFTAG_JPEGTABLESMODE: sp->jpegtablesmode = va_arg(ap, int); return (1); /* pseudo tag */ default: return (*sp->vsetparent)(tif, tag, ap); } tif->tif_flags |= TIFF_DIRTYDIRECT; return (1); } static int JPEGVGetField(TIFF* tif, ttag_t tag, va_list ap) { JPEGState* sp = JState(tif); switch (tag) { case TIFFTAG_JPEGTABLES: /* u_short is bogus --- should be uint32 ??? */ /* TIFFWriteNormalTag needs fixed XXX */ *va_arg(ap, u_short*) = (u_short) sp->jpegtables_length; *va_arg(ap, void**) = sp->jpegtables; break; case TIFFTAG_JPEGQUALITY: *va_arg(ap, int*) = sp->jpegquality; break; case TIFFTAG_JPEGCOLORMODE: *va_arg(ap, int*) = sp->jpegcolormode; break; case TIFFTAG_JPEGTABLESMODE: *va_arg(ap, int*) = sp->jpegtablesmode; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static void JPEGPrintDir(TIFF* tif, FILE* fd, long flags) { JPEGState* sp = JState(tif); (void) flags; if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) fprintf(fd, " JPEG Tables: (%lu bytes)\n", (u_long) sp->jpegtables_length); } static uint32 JPEGDefaultStripSize(TIFF* tif, uint32 s) { JPEGState* sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; s = (*sp->defsparent)(tif, s); if (s < td->td_imagelength) s = TIFFroundup(s, td->td_ycbcrsubsampling[1] * DCTSIZE); return (s); } static void JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) { JPEGState* sp = JState(tif); TIFFDirectory *td = &tif->tif_dir; (*sp->deftparent)(tif, tw, th); *tw = TIFFroundup(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE); *th = TIFFroundup(*th, td->td_ycbcrsubsampling[1] * DCTSIZE); } int TIFFInitJPEG(TIFF* tif, int scheme) { JPEGState* sp; assert(scheme == COMPRESSION_JPEG); /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (JPEGState)); if (tif->tif_data == NULL) { TIFFError("TIFFInitJPEG", "No space for JPEG state block"); return (0); } sp = JState(tif); sp->tif = tif; /* back link */ /* * Merge codec-specific tag information and * override parent get/set field methods. */ _TIFFMergeFieldInfo(tif, jpegFieldInfo, N(jpegFieldInfo)); sp->vgetparent = tif->tif_vgetfield; tif->tif_vgetfield = JPEGVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_vsetfield; tif->tif_vsetfield = JPEGVSetField; /* hook for codec tags */ tif->tif_printdir = JPEGPrintDir; /* hook for codec tags */ /* Default values for codec-specific fields */ sp->jpegtables = NULL; sp->jpegtables_length = 0; sp->jpegquality = 75; /* Default IJG quality */ sp->jpegcolormode = JPEGCOLORMODE_RAW; sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF; /* * Install codec methods. */ tif->tif_setupdecode = JPEGSetupDecode; tif->tif_predecode = JPEGPreDecode; tif->tif_decoderow = JPEGDecode; tif->tif_decodestrip = JPEGDecode; tif->tif_decodetile = JPEGDecode; tif->tif_setupencode = JPEGSetupEncode; tif->tif_preencode = JPEGPreEncode; tif->tif_postencode = JPEGPostEncode; tif->tif_encoderow = JPEGEncode; tif->tif_encodestrip = JPEGEncode; tif->tif_encodetile = JPEGEncode; tif->tif_cleanup = JPEGCleanup; sp->defsparent = tif->tif_defstripsize; tif->tif_defstripsize = JPEGDefaultStripSize; sp->deftparent = tif->tif_deftilesize; tif->tif_deftilesize = JPEGDefaultTileSize; tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */ /* * Initialize libjpeg. */ if (tif->tif_mode == O_RDONLY) { if (!TIFFjpeg_create_decompress(sp)) return (0); } else { if (!TIFFjpeg_create_compress(sp)) return (0); } return (1); } #endif /* JPEG_SUPPORT */ gamera-3.3.3/src/libtiff/tif_luv.c0000644000076500000000000011513610714675674016014 0ustar chriswheel/* * Copyright (c) 1997 Greg Ward Larson * Copyright (c) 1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler, Greg Larson and Silicon Graphics may not be used in any * advertising or publicity relating to the software without the specific, * prior written permission of Sam Leffler, Greg Larson and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER, GREG LARSON OR SILICON GRAPHICS BE LIABLE * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef LOGLUV_SUPPORT /* * TIFF Library. * LogLuv compression support for high dynamic range images. * * Contributed by Greg Larson. * * LogLuv image support uses the TIFF library to store 16 or 10-bit * log luminance values with 8 bits each of u and v or a 14-bit index. * * The codec can take as input and produce as output 32-bit IEEE float values * as well as 16-bit integer values. A 16-bit luminance is interpreted * as a sign bit followed by a 15-bit integer that is converted * to and from a linear magnitude using the transformation: * * L = 2^( (Le+.5)/256 - 64 ) # real from 15-bit * * Le = floor( 256*(log2(L) + 64) ) # 15-bit from real * * The actual conversion to world luminance units in candelas per sq. meter * requires an additional multiplier, which is stored in the TIFFTAG_STONITS. * This value is usually set such that a reasonable exposure comes from * clamping decoded luminances above 1 to 1 in the displayed image. * * The 16-bit values for u and v may be converted to real values by dividing * each by 32768. (This allows for negative values, which aren't useful as * far as we know, but are left in case of future improvements in human * color vision.) * * Conversion from (u,v), which is actually the CIE (u',v') system for * you color scientists, is accomplished by the following transformation: * * u = 4*x / (-2*x + 12*y + 3) * v = 9*y / (-2*x + 12*y + 3) * * x = 9*u / (6*u - 16*v + 12) * y = 4*v / (6*u - 16*v + 12) * * This process is greatly simplified by passing 32-bit IEEE floats * for each of three CIE XYZ coordinates. The codec then takes care * of conversion to and from LogLuv, though the application is still * responsible for interpreting the TIFFTAG_STONITS calibration factor. * * By definition, a CIE XYZ vector of [1 1 1] corresponds to a neutral white * point of (x,y)=(1/3,1/3). However, most color systems assume some other * white point, such as D65, and an absolute color conversion to XYZ then * to another color space with a different white point may introduce an * unwanted color cast to the image. It is often desirable, therefore, to * perform a white point conversion that maps the input white to [1 1 1] * in XYZ, then record the original white point using the TIFFTAG_WHITEPOINT * tag value. A decoder that demands absolute color calibration may use * this white point tag to get back the original colors, but usually it * will be ignored and the new white point will be used instead that * matches the output color space. * * Pixel information is compressed into one of two basic encodings, depending * on the setting of the compression tag, which is one of COMPRESSION_SGILOG * or COMPRESSION_SGILOG24. For COMPRESSION_SGILOG, greyscale data is * stored as: * * 1 15 * |-+---------------| * * COMPRESSION_SGILOG color data is stored as: * * 1 15 8 8 * |-+---------------|--------+--------| * S Le ue ve * * For the 24-bit COMPRESSION_SGILOG24 color format, the data is stored as: * * 10 14 * |----------|--------------| * Le' Ce * * There is no sign bit in the 24-bit case, and the (u,v) chromaticity is * encoded as an index for optimal color resolution. The 10 log bits are * defined by the following conversions: * * L = 2^((Le'+.5)/64 - 12) # real from 10-bit * * Le' = floor( 64*(log2(L) + 12) ) # 10-bit from real * * The 10 bits of the smaller format may be converted into the 15 bits of * the larger format by multiplying by 4 and adding 13314. Obviously, * a smaller range of magnitudes is covered (about 5 orders of magnitude * instead of 38), and the lack of a sign bit means that negative luminances * are not allowed. (Well, they aren't allowed in the real world, either, * but they are useful for certain types of image processing.) * * The desired user format is controlled by the setting the internal * pseudo tag TIFFTAG_SGILOGDATAFMT to one of: * SGILOGDATAFMT_FLOAT = IEEE 32-bit float XYZ values * SGILOGDATAFMT_16BIT = 16-bit integer encodings of logL, u and v * Raw data i/o is also possible using: * SGILOGDATAFMT_RAW = 32-bit unsigned integer with encoded pixel * In addition, the following decoding is provided for ease of display: * SGILOGDATAFMT_8BIT = 8-bit default RGB gamma-corrected values * * For grayscale images, we provide the following data formats: * SGILOGDATAFMT_FLOAT = IEEE 32-bit float Y values * SGILOGDATAFMT_16BIT = 16-bit integer w/ encoded luminance * SGILOGDATAFMT_8BIT = 8-bit gray monitor values * * Note that the COMPRESSION_SGILOG applies a simple run-length encoding * scheme by separating the logL, u and v bytes for each row and applying * a PackBits type of compression. Since the 24-bit encoding is not * adaptive, the 32-bit color format takes less space in many cases. * * Further control is provided over the conversion from higher-resolution * formats to final encoded values through the pseudo tag * TIFFTAG_SGILOGENCODE: * SGILOGENCODE_NODITHER = do not dither encoded values * SGILOGENCODE_RANDITHER = apply random dithering during encoding * * The default value of this tag is SGILOGENCODE_NODITHER for * COMPRESSION_SGILOG to maximize run-length encoding and * SGILOGENCODE_RANDITHER for COMPRESSION_SGILOG24 to turn * quantization errors into noise. */ #include #include #include #include /* * State block for each open TIFF * file using LogLuv compression/decompression. */ typedef struct logLuvState LogLuvState; struct logLuvState { int user_datafmt; /* user data format */ int encode_meth; /* encoding method */ int pixel_size; /* bytes per pixel */ tidata_t* tbuf; /* translation buffer */ int tbuflen; /* buffer length */ void (*tfunc)(LogLuvState*, tidata_t, int); TIFFVSetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ }; #define DecoderState(tif) ((LogLuvState*) (tif)->tif_data) #define EncoderState(tif) ((LogLuvState*) (tif)->tif_data) #define N(a) (sizeof(a)/sizeof(a[0])) #define SGILOGDATAFMT_UNKNOWN -1 #define MINRUN 4 /* minimum run length */ /* * Decode a string of 16-bit gray pixels. */ static int LogL16Decode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) { LogLuvState* sp = DecoderState(tif); int shft, i, npixels; u_char* bp; int16* tp; int16 b; int cc, rc; assert(s == 0); assert(sp != NULL); npixels = occ / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_16BIT) tp = (int16*) op; else { assert(sp->tbuflen >= npixels); tp = (int16*) sp->tbuf; } _TIFFmemset((tdata_t) tp, 0, npixels*sizeof (tp[0])); bp = (u_char*) tif->tif_rawcp; cc = tif->tif_rawcc; /* get each byte string */ for (shft = 2*8; (shft -= 8) >= 0; ) { for (i = 0; i < npixels && cc > 0; ) if (*bp >= 128) { /* run */ rc = *bp++ + (2-128); b = (int16)*bp++ << shft; cc -= 2; while (rc--) tp[i++] |= b; } else { /* non-run */ rc = *bp++; /* nul is noop */ while (--cc && rc--) tp[i++] |= (int16)*bp++ << shft; } if (i != npixels) { TIFFError(tif->tif_name, "LogL16Decode: Not enough data at row %d (short %d pixels)", tif->tif_row, npixels - i); tif->tif_rawcp = (tidata_t) bp; tif->tif_rawcc = cc; return (0); } } (*sp->tfunc)(sp, op, npixels); tif->tif_rawcp = (tidata_t) bp; tif->tif_rawcc = cc; return (1); } /* * Decode a string of 24-bit pixels. */ static int LogLuvDecode24(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) { LogLuvState* sp = DecoderState(tif); int cc, i, npixels; u_char* bp; uint32* tp; assert(s == 0); assert(sp != NULL); npixels = occ / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_RAW) tp = (uint32 *)op; else { assert(sp->tbuflen >= npixels); tp = (uint32 *) sp->tbuf; } /* copy to array of uint32 */ bp = (u_char*) tif->tif_rawcp; cc = tif->tif_rawcc; for (i = 0; i < npixels && cc > 0; i++) { tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2]; bp += 3; cc -= 3; } tif->tif_rawcp = (tidata_t) bp; tif->tif_rawcc = cc; if (i != npixels) { TIFFError(tif->tif_name, "LogLuvDecode24: Not enough data at row %d (short %d pixels)", tif->tif_row, npixels - i); return (0); } (*sp->tfunc)(sp, op, npixels); return (1); } /* * Decode a string of 32-bit pixels. */ static int LogLuvDecode32(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) { LogLuvState* sp; int shft, i, npixels; u_char* bp; uint32* tp; uint32 b; int cc, rc; assert(s == 0); sp = DecoderState(tif); assert(sp != NULL); npixels = occ / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_RAW) tp = (uint32*) op; else { assert(sp->tbuflen >= npixels); tp = (uint32*) sp->tbuf; } _TIFFmemset((tdata_t) tp, 0, npixels*sizeof (tp[0])); bp = (u_char*) tif->tif_rawcp; cc = tif->tif_rawcc; /* get each byte string */ for (shft = 4*8; (shft -= 8) >= 0; ) { for (i = 0; i < npixels && cc > 0; ) if (*bp >= 128) { /* run */ rc = *bp++ + (2-128); b = (uint32)*bp++ << shft; cc -= 2; while (rc--) tp[i++] |= b; } else { /* non-run */ rc = *bp++; /* nul is noop */ while (--cc && rc--) tp[i++] |= (uint32)*bp++ << shft; } if (i != npixels) { TIFFError(tif->tif_name, "LogLuvDecode32: Not enough data at row %d (short %d pixels)", tif->tif_row, npixels - i); tif->tif_rawcp = (tidata_t) bp; tif->tif_rawcc = cc; return (0); } } (*sp->tfunc)(sp, op, npixels); tif->tif_rawcp = (tidata_t) bp; tif->tif_rawcc = cc; return (1); } /* * Decode a strip of pixels. We break it into rows to * maintain synchrony with the encode algorithm, which * is row by row. */ static int LogLuvDecodeStrip(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { tsize_t rowlen = TIFFScanlineSize(tif); assert(cc%rowlen == 0); while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) bp += rowlen, cc -= rowlen; return (cc == 0); } /* * Decode a tile of pixels. We break it into rows to * maintain synchrony with the encode algorithm, which * is row by row. */ static int LogLuvDecodeTile(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { tsize_t rowlen = TIFFTileRowSize(tif); assert(cc%rowlen == 0); while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s)) bp += rowlen, cc -= rowlen; return (cc == 0); } /* * Encode a row of 16-bit pixels. */ static int LogL16Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { LogLuvState* sp = EncoderState(tif); int shft, i, j, npixels; tidata_t op; int16* tp; int16 b; int occ, rc=0, mask, beg; assert(s == 0); assert(sp != NULL); npixels = cc / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_16BIT) tp = (int16*) bp; else { tp = (int16*) sp->tbuf; assert(sp->tbuflen >= npixels); (*sp->tfunc)(sp, bp, npixels); } /* compress each byte string */ op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; for (shft = 2*8; (shft -= 8) >= 0; ) for (i = 0; i < npixels; i += rc) { if (occ < 4) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } mask = 0xff << shft; /* find next run */ for (beg = i; beg < npixels; beg += rc) { b = tp[beg] & mask; rc = 1; while (rc < 127+2 && beg+rc < npixels && (tp[beg+rc] & mask) == b) rc++; if (rc >= MINRUN) break; /* long enough */ } if (beg-i > 1 && beg-i < MINRUN) { b = tp[i] & mask; /* check short run */ j = i+1; while ((tp[j++] & mask) == b) if (j == beg) { *op++ = 128-2+j-i; *op++ = b >> shft; occ -= 2; i = beg; break; } } while (i < beg) { /* write out non-run */ if ((j = beg-i) > 127) j = 127; if (occ < j+3) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } *op++ = j; occ--; while (j--) { *op++ = tp[i++] >> shft & 0xff; occ--; } } if (rc >= MINRUN) { /* write out run */ *op++ = 128-2+rc; *op++ = tp[beg] >> shft & 0xff; occ -= 2; } else rc = 0; } tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; return (0); } /* * Encode a row of 24-bit pixels. */ static int LogLuvEncode24(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { LogLuvState* sp = EncoderState(tif); int i, npixels, occ; tidata_t op; uint32* tp; assert(s == 0); assert(sp != NULL); npixels = cc / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_RAW) tp = (uint32*) bp; else { tp = (uint32*) sp->tbuf; assert(sp->tbuflen >= npixels); (*sp->tfunc)(sp, bp, npixels); } /* write out encoded pixels */ op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; for (i = npixels; i--; ) { if (occ < 3) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } *op++ = (tidataval_t)(*tp >> 16); *op++ = (tidataval_t)(*tp >> 8 & 0xff); *op++ = (tidataval_t)(*tp++ & 0xff); occ -= 3; } tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; return (0); } /* * Encode a row of 32-bit pixels. */ static int LogLuvEncode32(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { LogLuvState* sp = EncoderState(tif); int shft, i, j, npixels; tidata_t op; uint32* tp; uint32 b; int occ, rc=0, mask, beg; assert(s == 0); assert(sp != NULL); npixels = cc / sp->pixel_size; if (sp->user_datafmt == SGILOGDATAFMT_RAW) tp = (uint32*) bp; else { tp = (uint32*) sp->tbuf; assert(sp->tbuflen >= npixels); (*sp->tfunc)(sp, bp, npixels); } /* compress each byte string */ op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; for (shft = 4*8; (shft -= 8) >= 0; ) for (i = 0; i < npixels; i += rc) { if (occ < 4) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } mask = 0xff << shft; /* find next run */ for (beg = i; beg < npixels; beg += rc) { b = tp[beg] & mask; rc = 1; while (rc < 127+2 && beg+rc < npixels && (tp[beg+rc] & mask) == b) rc++; if (rc >= MINRUN) break; /* long enough */ } if (beg-i > 1 && beg-i < MINRUN) { b = tp[i] & mask; /* check short run */ j = i+1; while ((tp[j++] & mask) == b) if (j == beg) { *op++ = (tidataval_t)(128-2+j-i); *op++ = (tidataval_t)(b >> shft); occ -= 2; i = beg; break; } } while (i < beg) { /* write out non-run */ if ((j = beg-i) > 127) j = 127; if (occ < j+3) { tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; occ = tif->tif_rawdatasize - tif->tif_rawcc; } *op++ = j; occ--; while (j--) { *op++ = (tidataval_t)(tp[i++] >> shft & 0xff); occ--; } } if (rc >= MINRUN) { /* write out run */ *op++ = 128-2+rc; *op++ = (tidataval_t)(tp[beg] >> shft & 0xff); occ -= 2; } else rc = 0; } tif->tif_rawcp = op; tif->tif_rawcc = tif->tif_rawdatasize - occ; return (0); } /* * Encode a strip of pixels. We break it into rows to * avoid encoding runs across row boundaries. */ static int LogLuvEncodeStrip(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { tsize_t rowlen = TIFFScanlineSize(tif); assert(cc%rowlen == 0); while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 0) bp += rowlen, cc -= rowlen; return (cc == 0); } /* * Encode a tile of pixels. We break it into rows to * avoid encoding runs across row boundaries. */ static int LogLuvEncodeTile(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { tsize_t rowlen = TIFFTileRowSize(tif); assert(cc%rowlen == 0); while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 0) bp += rowlen, cc -= rowlen; return (cc == 0); } /* * Encode/Decode functions for converting to and from user formats. */ #include "uvcode.h" #ifndef UVSCALE #define U_NEU 0.210526316 #define V_NEU 0.473684211 #define UVSCALE 410. #endif #ifndef M_LN2 #define M_LN2 0.69314718055994530942 #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define log2(x) ((1./M_LN2)*log(x)) #define exp2(x) exp(M_LN2*(x)) #define itrunc(x,m) ((m)==SGILOGENCODE_NODITHER ? \ (int)(x) : \ (int)((x) + rand()*(1./RAND_MAX) - .5)) #if !LOGLUV_PUBLIC static #endif double LogL16toY(int p16) /* compute luminance from 16-bit LogL */ { int Le = p16 & 0x7fff; double Y; if (!Le) return (0.); Y = exp(M_LN2/256.*(Le+.5) - M_LN2*64.); return (!(p16 & 0x8000) ? Y : -Y); } #if !LOGLUV_PUBLIC static #endif int LogL16fromY(double Y, int em) /* get 16-bit LogL from Y */ { if (Y >= 1.8371976e19) return (0x7fff); if (Y <= -1.8371976e19) return (0xffff); if (Y > 5.4136769e-20) return itrunc(256.*(log2(Y) + 64.), em); if (Y < -5.4136769e-20) return (~0x7fff | itrunc(256.*(log2(-Y) + 64.), em)); return (0); } static void L16toY(LogLuvState* sp, tidata_t op, int n) { int16* l16 = (int16*) sp->tbuf; float* yp = (float*) op; while (n-- > 0) *yp++ = (float)LogL16toY(*l16++); } static void L16toGry(LogLuvState* sp, tidata_t op, int n) { int16* l16 = (int16*) sp->tbuf; uint8* gp = (uint8*) op; while (n-- > 0) { double Y = LogL16toY(*l16++); *gp++ = (Y <= 0.) ? 0 : (Y >= 1.) ? 255 : (int)(256.*sqrt(Y)); } } static void L16fromY(LogLuvState* sp, tidata_t op, int n) { int16* l16 = (int16*) sp->tbuf; float* yp = (float*) op; while (n-- > 0) *l16++ = LogL16fromY(*yp++, sp->encode_meth); } #if !LOGLUV_PUBLIC static #endif void XYZtoRGB24(float xyz[3], uint8 rgb[3]) { double r, g, b; /* assume CCIR-709 primaries */ r = 2.690*xyz[0] + -1.276*xyz[1] + -0.414*xyz[2]; g = -1.022*xyz[0] + 1.978*xyz[1] + 0.044*xyz[2]; b = 0.061*xyz[0] + -0.224*xyz[1] + 1.163*xyz[2]; /* assume 2.0 gamma for speed */ /* could use integer sqrt approx., but this is probably faster */ rgb[0] = (r <= 0.) ? 0 : (r >= 1.) ? 255 : (int)(256.*sqrt(r)); rgb[1] = (g <= 0.) ? 0 : (g >= 1.) ? 255 : (int)(256.*sqrt(g)); rgb[2] = (b <= 0.) ? 0 : (b >= 1.) ? 255 : (int)(256.*sqrt(b)); } #if !LOGLUV_PUBLIC static #endif double LogL10toY(int p10) /* compute luminance from 10-bit LogL */ { if (p10 == 0) return (0.); return (exp(M_LN2/64.*(p10+.5) - M_LN2*12.)); } #if !LOGLUV_PUBLIC static #endif int LogL10fromY(double Y, int em) /* get 10-bit LogL from Y */ { if (Y >= 15.742) return (0x3ff); else if (Y <= .00024283) return (0); else return itrunc(64.*(log2(Y) + 12.), em); } #define NANGLES 100 #define uv2ang(u, v) ( (NANGLES*.499999999/M_PI) \ * atan2((v)-V_NEU,(u)-U_NEU) + .5*NANGLES ) static int oog_encode(double u, double v) /* encode out-of-gamut chroma */ { static int oog_table[NANGLES]; static int initialized = 0; register int i; if (!initialized) { /* set up perimeter table */ double eps[NANGLES], ua, va, ang, epsa; int ui, vi, ustep; for (i = NANGLES; i--; ) eps[i] = 2.; for (vi = UV_NVS; vi--; ) { va = UV_VSTART + (vi+.5)*UV_SQSIZ; ustep = uv_row[vi].nus-1; if (vi == UV_NVS-1 || vi == 0 || ustep <= 0) ustep = 1; for (ui = uv_row[vi].nus-1; ui >= 0; ui -= ustep) { ua = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ; ang = uv2ang(ua, va); i = (int) ang; epsa = fabs(ang - (i+.5)); if (epsa < eps[i]) { oog_table[i] = uv_row[vi].ncum + ui; eps[i] = epsa; } } } for (i = NANGLES; i--; ) /* fill any holes */ if (eps[i] > 1.5) { int i1, i2; for (i1 = 1; i1 < NANGLES/2; i1++) if (eps[(i+i1)%NANGLES] < 1.5) break; for (i2 = 1; i2 < NANGLES/2; i2++) if (eps[(i+NANGLES-i2)%NANGLES] < 1.5) break; if (i1 < i2) oog_table[i] = oog_table[(i+i1)%NANGLES]; else oog_table[i] = oog_table[(i+NANGLES-i2)%NANGLES]; } initialized = 1; } i = (int) uv2ang(u, v); /* look up hue angle */ return (oog_table[i]); } #undef uv2ang #undef NANGLES #if !LOGLUV_PUBLIC static #endif int uv_encode(double u, double v, int em) /* encode (u',v') coordinates */ { register int vi, ui; if (v < UV_VSTART) return oog_encode(u, v); vi = itrunc((v - UV_VSTART)*(1./UV_SQSIZ), em); if (vi >= UV_NVS) return oog_encode(u, v); if (u < uv_row[vi].ustart) return oog_encode(u, v); ui = itrunc((u - uv_row[vi].ustart)*(1./UV_SQSIZ), em); if (ui >= uv_row[vi].nus) return oog_encode(u, v); return (uv_row[vi].ncum + ui); } #if !LOGLUV_PUBLIC static #endif int uv_decode(double *up, double *vp, int c) /* decode (u',v') index */ { int upper, lower; register int ui, vi; if (c < 0 || c >= UV_NDIVS) return (-1); lower = 0; /* binary search */ upper = UV_NVS; while (upper - lower > 1) { vi = (lower + upper) >> 1; ui = c - uv_row[vi].ncum; if (ui > 0) lower = vi; else if (ui < 0) upper = vi; else { lower = vi; break; } } vi = lower; ui = c - uv_row[vi].ncum; *up = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ; *vp = UV_VSTART + (vi+.5)*UV_SQSIZ; return (0); } #if !LOGLUV_PUBLIC static #endif void LogLuv24toXYZ(uint32 p, float XYZ[3]) { int Ce; double L, u, v, s, x, y; /* decode luminance */ L = LogL10toY(p>>14 & 0x3ff); if (L <= 0.) { XYZ[0] = XYZ[1] = XYZ[2] = 0.; return; } /* decode color */ Ce = p & 0x3fff; if (uv_decode(&u, &v, Ce) < 0) { u = U_NEU; v = V_NEU; } s = 1./(6.*u - 16.*v + 12.); x = 9.*u * s; y = 4.*v * s; /* convert to XYZ */ XYZ[0] = (float)(x/y * L); XYZ[1] = (float)L; XYZ[2] = (float)((1.-x-y)/y * L); } #if !LOGLUV_PUBLIC static #endif uint32 LogLuv24fromXYZ(float XYZ[3], int em) { int Le, Ce; double u, v, s; /* encode luminance */ Le = LogL10fromY(XYZ[1], em); /* encode color */ s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2]; if (!Le || s <= 0.) { u = U_NEU; v = V_NEU; } else { u = 4.*XYZ[0] / s; v = 9.*XYZ[1] / s; } Ce = uv_encode(u, v, em); if (Ce < 0) /* never happens */ Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER); /* combine encodings */ return (Le << 14 | Ce); } static void Luv24toXYZ(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; float* xyz = (float*) op; while (n-- > 0) { LogLuv24toXYZ(*luv, xyz); xyz += 3; luv++; } } static void Luv24toLuv48(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; int16* luv3 = (int16*) op; while (n-- > 0) { double u, v; *luv3++ = (int16)((*luv >> 12 & 0xffd) + 13314); if (uv_decode(&u, &v, *luv&0x3fff) < 0) { u = U_NEU; v = V_NEU; } *luv3++ = (int16)(u * (1L<<15)); *luv3++ = (int16)(v * (1L<<15)); luv++; } } static void Luv24toRGB(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; uint8* rgb = (uint8*) op; while (n-- > 0) { float xyz[3]; LogLuv24toXYZ(*luv++, xyz); XYZtoRGB24(xyz, rgb); rgb += 3; } } static void Luv24fromXYZ(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; float* xyz = (float*) op; while (n-- > 0) { *luv++ = LogLuv24fromXYZ(xyz, sp->encode_meth); xyz += 3; } } static void Luv24fromLuv48(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; int16* luv3 = (int16*) op; while (n-- > 0) { int Le, Ce; if (luv3[0] <= 0) Le = 0; else if (luv3[0] >= (1<<12)+3314) Le = (1<<10) - 1; else if (sp->encode_meth == SGILOGENCODE_NODITHER) Le = (luv3[0]-3314) >> 2; else Le = itrunc(.25*(luv3[0]-3314.), sp->encode_meth); Ce = uv_encode((luv[1]+.5)/(1<<15), (luv[2]+.5)/(1<<15), sp->encode_meth); if (Ce < 0) /* never happens */ Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER); *luv++ = (uint32)Le << 14 | Ce; luv3 += 3; } } #if !LOGLUV_PUBLIC static #endif void LogLuv32toXYZ(uint32 p, float XYZ[3]) { double L, u, v, s, x, y; /* decode luminance */ L = LogL16toY((int)p >> 16); if (L <= 0.) { XYZ[0] = XYZ[1] = XYZ[2] = 0.; return; } /* decode color */ u = 1./UVSCALE * ((p>>8 & 0xff) + .5); v = 1./UVSCALE * ((p & 0xff) + .5); s = 1./(6.*u - 16.*v + 12.); x = 9.*u * s; y = 4.*v * s; /* convert to XYZ */ XYZ[0] = (float)(x/y * L); XYZ[1] = (float)L; XYZ[2] = (float)((1.-x-y)/y * L); } #if !LOGLUV_PUBLIC static #endif uint32 LogLuv32fromXYZ(float XYZ[3], int em) { unsigned int Le, ue, ve; double u, v, s; /* encode luminance */ Le = (unsigned int)LogL16fromY(XYZ[1], em); /* encode color */ s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2]; if (!Le || s <= 0.) { u = U_NEU; v = V_NEU; } else { u = 4.*XYZ[0] / s; v = 9.*XYZ[1] / s; } if (u <= 0.) ue = 0; else ue = itrunc(UVSCALE*u, em); if (ue > 255) ue = 255; if (v <= 0.) ve = 0; else ve = itrunc(UVSCALE*v, em); if (ve > 255) ve = 255; /* combine encodings */ return (Le << 16 | ue << 8 | ve); } static void Luv32toXYZ(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; float* xyz = (float*) op; while (n-- > 0) { LogLuv32toXYZ(*luv++, xyz); xyz += 3; } } static void Luv32toLuv48(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; int16* luv3 = (int16*) op; while (n-- > 0) { double u, v; *luv3++ = (int16)(*luv >> 16); u = 1./UVSCALE * ((*luv>>8 & 0xff) + .5); v = 1./UVSCALE * ((*luv & 0xff) + .5); *luv3++ = (int16)(u * (1L<<15)); *luv3++ = (int16)(v * (1L<<15)); luv++; } } static void Luv32toRGB(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; uint8* rgb = (uint8*) op; while (n-- > 0) { float xyz[3]; LogLuv32toXYZ(*luv++, xyz); XYZtoRGB24(xyz, rgb); rgb += 3; } } static void Luv32fromXYZ(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; float* xyz = (float*) op; while (n-- > 0) { *luv++ = LogLuv32fromXYZ(xyz, sp->encode_meth); xyz += 3; } } static void Luv32fromLuv48(LogLuvState* sp, tidata_t op, int n) { uint32* luv = (uint32*) sp->tbuf; int16* luv3 = (int16*) op; if (sp->encode_meth == SGILOGENCODE_NODITHER) { while (n-- > 0) { *luv++ = (uint32)luv3[0] << 16 | (luv3[1]*(uint32)(UVSCALE+.5) >> 7 & 0xff00) | (luv3[2]*(uint32)(UVSCALE+.5) >> 15 & 0xff); luv3 += 3; } return; } while (n-- > 0) { *luv++ = (uint32)luv3[0] << 16 | (itrunc(luv3[1]*(UVSCALE/(1<<15)), sp->encode_meth) << 8 & 0xff00) | (itrunc(luv3[2]*(UVSCALE/(1<<15)), sp->encode_meth) & 0xff); luv3 += 3; } } static void _logLuvNop(LogLuvState* sp, tidata_t op, int n) { (void) sp; (void) op; (void) n; } static int LogL16GuessDataFmt(TIFFDirectory *td) { #define PACK(s,b,f) (((b)<<6)|((s)<<3)|(f)) switch (PACK(td->td_samplesperpixel, td->td_bitspersample, td->td_sampleformat)) { case PACK(1, 32, SAMPLEFORMAT_IEEEFP): return (SGILOGDATAFMT_FLOAT); case PACK(1, 16, SAMPLEFORMAT_VOID): case PACK(1, 16, SAMPLEFORMAT_INT): case PACK(1, 16, SAMPLEFORMAT_UINT): return (SGILOGDATAFMT_16BIT); case PACK(1, 8, SAMPLEFORMAT_VOID): case PACK(1, 8, SAMPLEFORMAT_UINT): return (SGILOGDATAFMT_8BIT); } #undef PACK return (SGILOGDATAFMT_UNKNOWN); } static int LogL16InitState(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; LogLuvState* sp = DecoderState(tif); static const char module[] = "LogL16InitState"; assert(sp != NULL); assert(td->td_photometric == PHOTOMETRIC_LOGL); /* for some reason, we can't do this in TIFFInitLogL16 */ if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN) sp->user_datafmt = LogL16GuessDataFmt(td); switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->pixel_size = sizeof (float); break; case SGILOGDATAFMT_16BIT: sp->pixel_size = sizeof (int16); break; case SGILOGDATAFMT_8BIT: sp->pixel_size = sizeof (uint8); break; default: TIFFError(tif->tif_name, "No support for converting user data format to LogL"); return (0); } sp->tbuflen = td->td_imagewidth * td->td_rowsperstrip; sp->tbuf = (tidata_t*) _TIFFmalloc(sp->tbuflen * sizeof (int16)); if (sp->tbuf == NULL) { TIFFError(module, "%s: No space for SGILog translation buffer", tif->tif_name); return (0); } return (1); } static int LogLuvGuessDataFmt(TIFFDirectory *td) { int guess; /* * If the user didn't tell us their datafmt, * take our best guess from the bitspersample. */ #define PACK(a,b) (((a)<<3)|(b)) switch (PACK(td->td_bitspersample, td->td_sampleformat)) { case PACK(32, SAMPLEFORMAT_IEEEFP): guess = SGILOGDATAFMT_FLOAT; break; case PACK(32, SAMPLEFORMAT_VOID): case PACK(32, SAMPLEFORMAT_UINT): case PACK(32, SAMPLEFORMAT_INT): guess = SGILOGDATAFMT_RAW; break; case PACK(16, SAMPLEFORMAT_VOID): case PACK(16, SAMPLEFORMAT_INT): case PACK(16, SAMPLEFORMAT_UINT): guess = SGILOGDATAFMT_16BIT; break; case PACK( 8, SAMPLEFORMAT_VOID): case PACK( 8, SAMPLEFORMAT_UINT): guess = SGILOGDATAFMT_8BIT; break; default: guess = SGILOGDATAFMT_UNKNOWN; break; #undef PACK } /* * Double-check samples per pixel. */ switch (td->td_samplesperpixel) { case 1: if (guess != SGILOGDATAFMT_RAW) guess = SGILOGDATAFMT_UNKNOWN; break; case 3: if (guess == SGILOGDATAFMT_RAW) guess = SGILOGDATAFMT_UNKNOWN; break; default: guess = SGILOGDATAFMT_UNKNOWN; break; } return (guess); } static int LogLuvInitState(TIFF* tif) { TIFFDirectory* td = &tif->tif_dir; LogLuvState* sp = DecoderState(tif); static const char module[] = "LogLuvInitState"; assert(sp != NULL); assert(td->td_photometric == PHOTOMETRIC_LOGLUV); /* for some reason, we can't do this in TIFFInitLogLuv */ if (td->td_planarconfig != PLANARCONFIG_CONTIG) { TIFFError(module, "SGILog compression cannot handle non-contiguous data"); return (0); } if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN) sp->user_datafmt = LogLuvGuessDataFmt(td); switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->pixel_size = 3*sizeof (float); break; case SGILOGDATAFMT_16BIT: sp->pixel_size = 3*sizeof (int16); break; case SGILOGDATAFMT_RAW: sp->pixel_size = sizeof (uint32); break; case SGILOGDATAFMT_8BIT: sp->pixel_size = 3*sizeof (uint8); break; default: TIFFError(tif->tif_name, "No support for converting user data format to LogLuv"); return (0); } sp->tbuflen = td->td_imagewidth * td->td_rowsperstrip; sp->tbuf = (tidata_t*) _TIFFmalloc(sp->tbuflen * sizeof (uint32)); if (sp->tbuf == NULL) { TIFFError(module, "%s: No space for SGILog translation buffer", tif->tif_name); return (0); } return (1); } static int LogLuvSetupDecode(TIFF* tif) { LogLuvState* sp = DecoderState(tif); TIFFDirectory* td = &tif->tif_dir; tif->tif_postdecode = _TIFFNoPostDecode; switch (td->td_photometric) { case PHOTOMETRIC_LOGLUV: if (!LogLuvInitState(tif)) break; if (td->td_compression == COMPRESSION_SGILOG24) { tif->tif_decoderow = LogLuvDecode24; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = Luv24toXYZ; break; case SGILOGDATAFMT_16BIT: sp->tfunc = Luv24toLuv48; break; case SGILOGDATAFMT_8BIT: sp->tfunc = Luv24toRGB; break; } } else { tif->tif_decoderow = LogLuvDecode32; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = Luv32toXYZ; break; case SGILOGDATAFMT_16BIT: sp->tfunc = Luv32toLuv48; break; case SGILOGDATAFMT_8BIT: sp->tfunc = Luv32toRGB; break; } } return (1); case PHOTOMETRIC_LOGL: if (!LogL16InitState(tif)) break; tif->tif_decoderow = LogL16Decode; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = L16toY; break; case SGILOGDATAFMT_8BIT: sp->tfunc = L16toGry; break; } return (1); default: TIFFError(tif->tif_name, "Inappropriate photometric interpretation %d for SGILog compression; %s", td->td_photometric, "must be either LogLUV or LogL"); break; } return (0); } static int LogLuvSetupEncode(TIFF* tif) { LogLuvState* sp = EncoderState(tif); TIFFDirectory* td = &tif->tif_dir; switch (td->td_photometric) { case PHOTOMETRIC_LOGLUV: if (!LogLuvInitState(tif)) break; if (td->td_compression == COMPRESSION_SGILOG24) { tif->tif_encoderow = LogLuvEncode24; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = Luv24fromXYZ; break; case SGILOGDATAFMT_16BIT: sp->tfunc = Luv24fromLuv48; break; case SGILOGDATAFMT_RAW: break; default: goto notsupported; } } else { tif->tif_encoderow = LogLuvEncode32; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = Luv32fromXYZ; break; case SGILOGDATAFMT_16BIT: sp->tfunc = Luv32fromLuv48; break; case SGILOGDATAFMT_RAW: break; default: goto notsupported; } } break; case PHOTOMETRIC_LOGL: if (!LogL16InitState(tif)) break; tif->tif_encoderow = LogL16Encode; switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: sp->tfunc = L16fromY; break; case SGILOGDATAFMT_16BIT: break; default: goto notsupported; } break; default: TIFFError(tif->tif_name, "Inappropriate photometric interpretation %d for SGILog compression; %s", td->td_photometric, "must be either LogLUV or LogL"); break; } return (1); notsupported: TIFFError(tif->tif_name, "SGILog compression supported only for %s, or raw data", td->td_photometric == PHOTOMETRIC_LOGL ? "Y, L" : "XYZ, Luv"); return (0); } static void LogLuvClose(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; /* * For consistency, we always want to write out the same * bitspersample and sampleformat for our TIFF file, * regardless of the data format being used by the application. * Since this routine is called after tags have been set but * before they have been recorded in the file, we reset them here. */ td->td_samplesperpixel = (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3; td->td_bitspersample = 16; td->td_sampleformat = SAMPLEFORMAT_INT; } static void LogLuvCleanup(TIFF* tif) { LogLuvState* sp = (LogLuvState *)tif->tif_data; if (sp) { if (sp->tbuf) _TIFFfree(sp->tbuf); _TIFFfree(sp); tif->tif_data = NULL; } } static int LogLuvVSetField(TIFF* tif, ttag_t tag, va_list ap) { LogLuvState* sp = DecoderState(tif); int bps, fmt; switch (tag) { case TIFFTAG_SGILOGDATAFMT: sp->user_datafmt = va_arg(ap, int); /* * Tweak the TIFF header so that the rest of libtiff knows what * size of data will be passed between app and library, and * assume that the app knows what it is doing and is not * confused by these header manipulations... */ switch (sp->user_datafmt) { case SGILOGDATAFMT_FLOAT: bps = 32, fmt = SAMPLEFORMAT_IEEEFP; break; case SGILOGDATAFMT_16BIT: bps = 16, fmt = SAMPLEFORMAT_INT; break; case SGILOGDATAFMT_RAW: bps = 32, fmt = SAMPLEFORMAT_UINT; TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1); break; case SGILOGDATAFMT_8BIT: bps = 8, fmt = SAMPLEFORMAT_UINT; break; default: TIFFError(tif->tif_name, "Unknown data format %d for LogLuv compression", sp->user_datafmt); return (0); } TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, fmt); /* * Must recalculate sizes should bits/sample change. */ tif->tif_tilesize = TIFFTileSize(tif); tif->tif_scanlinesize = TIFFScanlineSize(tif); return (1); case TIFFTAG_SGILOGENCODE: sp->encode_meth = va_arg(ap, int); if (sp->encode_meth != SGILOGENCODE_NODITHER && sp->encode_meth != SGILOGENCODE_RANDITHER) { TIFFError(tif->tif_name, "Unknown encoding %d for LogLuv compression", sp->encode_meth); return (0); } return (1); default: return (*sp->vsetparent)(tif, tag, ap); } } static int LogLuvVGetField(TIFF* tif, ttag_t tag, va_list ap) { LogLuvState *sp = (LogLuvState *)tif->tif_data; switch (tag) { case TIFFTAG_SGILOGDATAFMT: *va_arg(ap, int*) = sp->user_datafmt; return (1); default: return (*sp->vgetparent)(tif, tag, ap); } } static const TIFFFieldInfo LogLuvFieldInfo[] = { { TIFFTAG_SGILOGDATAFMT, 0, 0, TIFF_SHORT, FIELD_PSEUDO, TRUE, FALSE, "SGILogDataFmt"}, { TIFFTAG_SGILOGENCODE, 0, 0, TIFF_SHORT, FIELD_PSEUDO, TRUE, FALSE, "SGILogEncode"} }; int TIFFInitSGILog(TIFF* tif, int scheme) { static const char module[] = "TIFFInitSGILog"; LogLuvState* sp; assert(scheme == COMPRESSION_SGILOG24 || scheme == COMPRESSION_SGILOG); /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (LogLuvState)); if (tif->tif_data == NULL) goto bad; sp = (LogLuvState*) tif->tif_data; _TIFFmemset((tdata_t)sp, 0, sizeof (*sp)); sp->user_datafmt = SGILOGDATAFMT_UNKNOWN; sp->encode_meth = (scheme == COMPRESSION_SGILOG24) ? SGILOGENCODE_RANDITHER : SGILOGENCODE_NODITHER; sp->tfunc = _logLuvNop; /* * Install codec methods. * NB: tif_decoderow & tif_encoderow are filled * in at setup time. */ tif->tif_setupdecode = LogLuvSetupDecode; tif->tif_decodestrip = LogLuvDecodeStrip; tif->tif_decodetile = LogLuvDecodeTile; tif->tif_setupencode = LogLuvSetupEncode; tif->tif_encodestrip = LogLuvEncodeStrip; tif->tif_encodetile = LogLuvEncodeTile; tif->tif_close = LogLuvClose; tif->tif_cleanup = LogLuvCleanup; /* override SetField so we can handle our private pseudo-tag */ _TIFFMergeFieldInfo(tif, LogLuvFieldInfo, N(LogLuvFieldInfo)); sp->vgetparent = tif->tif_vgetfield; tif->tif_vgetfield = LogLuvVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_vsetfield; tif->tif_vsetfield = LogLuvVSetField; /* hook for codec tags */ return (1); bad: TIFFError(module, "%s: No space for LogLuv state block", tif->tif_name); return (0); } #endif /* LOGLUV_SUPPORT */ gamera-3.3.3/src/libtiff/tif_lzw.c0000644000076500000000000004703110714675674016020 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef LZW_SUPPORT /* * TIFF Library. * Rev 5.0 Lempel-Ziv & Welch Compression Support * * This code is derived from the compress program whose code is * derived from software contributed to Berkeley by James A. Woods, * derived from original work by Spencer Thomas and Joseph Orost. * * The original Berkeley copyright notice appears below in its entirety. */ #include "tif_predict.h" #include #include /* * NB: The 5.0 spec describes a different algorithm than Aldus * implements. Specifically, Aldus does code length transitions * one code earlier than should be done (for real LZW). * Earlier versions of this library implemented the correct * LZW algorithm, but emitted codes in a bit order opposite * to the TIFF spec. Thus, to maintain compatibility w/ Aldus * we interpret MSB-LSB ordered codes to be images written w/ * old versions of this library, but otherwise adhere to the * Aldus "off by one" algorithm. * * Future revisions to the TIFF spec are expected to "clarify this issue". */ #define LZW_COMPAT /* include backwards compatibility code */ /* * Each strip of data is supposed to be terminated by a CODE_EOI. * If the following #define is included, the decoder will also * check for end-of-strip w/o seeing this code. This makes the * library more robust, but also slower. */ #define LZW_CHECKEOS /* include checks for strips w/o EOI code */ #define MAXCODE(n) ((1L<<(n))-1) /* * The TIFF spec specifies that encoded bit * strings range from 9 to 12 bits. */ #define BITS_MIN 9 /* start with 9 bits */ #define BITS_MAX 12 /* max of 12 bit strings */ /* predefined codes */ #define CODE_CLEAR 256 /* code to clear string table */ #define CODE_EOI 257 /* end-of-information code */ #define CODE_FIRST 258 /* first free code entry */ #define CODE_MAX MAXCODE(BITS_MAX) #define HSIZE 9001L /* 91% occupancy */ #define HSHIFT (13-8) #ifdef LZW_COMPAT /* NB: +1024 is for compatibility with old files */ #define CSIZE (MAXCODE(BITS_MAX)+1024L) #else #define CSIZE (MAXCODE(BITS_MAX)+1L) #endif /* * State block for each open TIFF file using LZW * compression/decompression. Note that the predictor * state block must be first in this data structure. */ typedef struct { TIFFPredictorState predict; /* predictor super class */ u_short nbits; /* # of bits/code */ u_short maxcode; /* maximum code for lzw_nbits */ u_short free_ent; /* next free entry in hash table */ long nextdata; /* next bits of i/o */ long nextbits; /* # of valid bits in lzw_nextdata */ } LZWBaseState; #define lzw_nbits base.nbits #define lzw_maxcode base.maxcode #define lzw_free_ent base.free_ent #define lzw_nextdata base.nextdata #define lzw_nextbits base.nextbits /* * Decoding-specific state. */ typedef struct code_ent { struct code_ent *next; u_short length; /* string len, including this token */ u_char value; /* data value */ u_char firstchar; /* first token of string */ } code_t; typedef int (*decodeFunc)(TIFF*, tidata_t, tsize_t, tsample_t); typedef struct { LZWBaseState base; long dec_nbitsmask; /* lzw_nbits 1 bits, right adjusted */ long dec_restart; /* restart count */ #ifdef LZW_CHECKEOS long dec_bitsleft; /* available bits in raw data */ #endif decodeFunc dec_decode; /* regular or backwards compatible */ code_t* dec_codep; /* current recognized code */ code_t* dec_oldcodep; /* previously recognized code */ code_t* dec_free_entp; /* next free entry */ code_t* dec_maxcodep; /* max available entry */ code_t* dec_codetab; /* kept separate for small machines */ } LZWDecodeState; /* * Encoding-specific state. */ typedef uint16 hcode_t; /* codes fit in 16 bits */ typedef struct { long hash; hcode_t code; } hash_t; typedef struct { LZWBaseState base; int enc_oldcode; /* last code encountered */ long enc_checkpoint; /* point at which to clear table */ #define CHECK_GAP 10000 /* enc_ratio check interval */ long enc_ratio; /* current compression ratio */ long enc_incount; /* (input) data bytes encoded */ long enc_outcount; /* encoded (output) bytes */ tidata_t enc_rawlimit; /* bound on tif_rawdata buffer */ hash_t* enc_hashtab; /* kept separate for small machines */ } LZWEncodeState; #define LZWState(tif) ((LZWBaseState*) (tif)->tif_data) #define DecoderState(tif) ((LZWDecodeState*) LZWState(tif)) #define EncoderState(tif) ((LZWEncodeState*) LZWState(tif)) static int LZWDecode(TIFF*, tidata_t, tsize_t, tsample_t); #ifdef LZW_COMPAT static int LZWDecodeCompat(TIFF*, tidata_t, tsize_t, tsample_t); #endif static void cl_hash(LZWEncodeState*); /* * LZW Decoder. */ #ifdef LZW_CHECKEOS /* * This check shouldn't be necessary because each * strip is suppose to be terminated with CODE_EOI. */ #define NextCode(_tif, _sp, _bp, _code, _get) { \ if ((_sp)->dec_bitsleft < nbits) { \ TIFFWarning(_tif->tif_name, \ "LZWDecode: Strip %d not terminated with EOI code", \ _tif->tif_curstrip); \ _code = CODE_EOI; \ } else { \ _get(_sp,_bp,_code); \ (_sp)->dec_bitsleft -= nbits; \ } \ } #else #define NextCode(tif, sp, bp, code, get) get(sp, bp, code) #endif static int LZWSetupDecode(TIFF* tif) { LZWDecodeState* sp = DecoderState(tif); static const char module[] = " LZWSetupDecode"; int code; assert(sp != NULL); if (sp->dec_codetab == NULL) { sp->dec_codetab = (code_t*)_TIFFmalloc(CSIZE*sizeof (code_t)); if (sp->dec_codetab == NULL) { TIFFError(module, "No space for LZW code table"); return (0); } /* * Pre-load the table. */ code = 255; do { sp->dec_codetab[code].value = code; sp->dec_codetab[code].firstchar = code; sp->dec_codetab[code].length = 1; sp->dec_codetab[code].next = NULL; } while (code--); } return (1); } /* * Setup state for decoding a strip. */ static int LZWPreDecode(TIFF* tif, tsample_t s) { LZWDecodeState *sp = DecoderState(tif); (void) s; assert(sp != NULL); /* * Check for old bit-reversed codes. */ if (tif->tif_rawdata[0] == 0 && (tif->tif_rawdata[1] & 0x1)) { #ifdef LZW_COMPAT if (!sp->dec_decode) { TIFFWarning(tif->tif_name, "Old-style LZW codes, convert file"); /* * Override default decoding methods with * ones that deal with the old coding. * Otherwise the predictor versions set * above will call the compatibility routines * through the dec_decode method. */ tif->tif_decoderow = LZWDecodeCompat; tif->tif_decodestrip = LZWDecodeCompat; tif->tif_decodetile = LZWDecodeCompat; /* * If doing horizontal differencing, must * re-setup the predictor logic since we * switched the basic decoder methods... */ (*tif->tif_setupdecode)(tif); sp->dec_decode = LZWDecodeCompat; } sp->lzw_maxcode = MAXCODE(BITS_MIN); #else /* !LZW_COMPAT */ if (!sp->dec_decode) { TIFFError(tif->tif_name, "Old-style LZW codes not supported"); sp->dec_decode = LZWDecode; } return (0); #endif/* !LZW_COMPAT */ } else { sp->lzw_maxcode = MAXCODE(BITS_MIN)-1; sp->dec_decode = LZWDecode; } sp->lzw_nbits = BITS_MIN; sp->lzw_nextbits = 0; sp->lzw_nextdata = 0; sp->dec_restart = 0; sp->dec_nbitsmask = MAXCODE(BITS_MIN); #ifdef LZW_CHECKEOS sp->dec_bitsleft = tif->tif_rawcc << 3; #endif sp->dec_free_entp = sp->dec_codetab + CODE_FIRST; /* * Zero entries that are not yet filled in. We do * this to guard against bogus input data that causes * us to index into undefined entries. If you can * come up with a way to safely bounds-check input codes * while decoding then you can remove this operation. */ _TIFFmemset(sp->dec_free_entp, 0, (CSIZE-CODE_FIRST)*sizeof (code_t)); sp->dec_oldcodep = &sp->dec_codetab[-1]; sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask-1]; return (1); } /* * Decode a "hunk of data". */ #define GetNextCode(sp, bp, code) { \ nextdata = (nextdata<<8) | *(bp)++; \ nextbits += 8; \ if (nextbits < nbits) { \ nextdata = (nextdata<<8) | *(bp)++; \ nextbits += 8; \ } \ code = (hcode_t)((nextdata >> (nextbits-nbits)) & nbitsmask); \ nextbits -= nbits; \ } static void codeLoop(TIFF* tif) { TIFFError(tif->tif_name, "LZWDecode: Bogus encoding, loop in the code table; scanline %d", tif->tif_row); } static int LZWDecode(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) { LZWDecodeState *sp = DecoderState(tif); char *op = (char*) op0; long occ = (long) occ0; char *tp; u_char *bp; hcode_t code; int len; long nbits, nextbits, nextdata, nbitsmask; code_t *codep, *free_entp, *maxcodep, *oldcodep; (void) s; assert(sp != NULL); /* * Restart interrupted output operation. */ if (sp->dec_restart) { long residue; codep = sp->dec_codep; residue = codep->length - sp->dec_restart; if (residue > occ) { /* * Residue from previous decode is sufficient * to satisfy decode request. Skip to the * start of the decoded string, place decoded * values in the output buffer, and return. */ sp->dec_restart += occ; do { codep = codep->next; } while (--residue > occ && codep); if (codep) { tp = op + occ; do { *--tp = codep->value; codep = codep->next; } while (--occ && codep); } return (1); } /* * Residue satisfies only part of the decode request. */ op += residue, occ -= residue; tp = op; do { int t; --tp; t = codep->value; codep = codep->next; *tp = t; } while (--residue && codep); sp->dec_restart = 0; } bp = (u_char *)tif->tif_rawcp; nbits = sp->lzw_nbits; nextdata = sp->lzw_nextdata; nextbits = sp->lzw_nextbits; nbitsmask = sp->dec_nbitsmask; oldcodep = sp->dec_oldcodep; free_entp = sp->dec_free_entp; maxcodep = sp->dec_maxcodep; while (occ > 0) { NextCode(tif, sp, bp, code, GetNextCode); if (code == CODE_EOI) break; if (code == CODE_CLEAR) { free_entp = sp->dec_codetab + CODE_FIRST; nbits = BITS_MIN; nbitsmask = MAXCODE(BITS_MIN); maxcodep = sp->dec_codetab + nbitsmask-1; NextCode(tif, sp, bp, code, GetNextCode); if (code == CODE_EOI) break; *op++ = (char)code, occ--; oldcodep = sp->dec_codetab + code; continue; } codep = sp->dec_codetab + code; /* * Add the new entry to the code table. */ assert(&sp->dec_codetab[0] <= free_entp && free_entp < &sp->dec_codetab[CSIZE]); free_entp->next = oldcodep; free_entp->firstchar = free_entp->next->firstchar; free_entp->length = free_entp->next->length+1; free_entp->value = (codep < free_entp) ? codep->firstchar : free_entp->firstchar; if (++free_entp > maxcodep) { if (++nbits > BITS_MAX) /* should not happen */ nbits = BITS_MAX; nbitsmask = MAXCODE(nbits); maxcodep = sp->dec_codetab + nbitsmask-1; } oldcodep = codep; if (code >= 256) { /* * Code maps to a string, copy string * value to output (written in reverse). */ if (codep->length > occ) { /* * String is too long for decode buffer, * locate portion that will fit, copy to * the decode buffer, and setup restart * logic for the next decoding call. */ sp->dec_codep = codep; do { codep = codep->next; } while (codep && codep->length > occ); if (codep) { sp->dec_restart = occ; tp = op + occ; do { *--tp = codep->value; codep = codep->next; } while (--occ && codep); if (codep) codeLoop(tif); } break; } len = codep->length; tp = op + len; do { int t; --tp; t = codep->value; codep = codep->next; *tp = t; } while (codep && tp > op); if (codep) { codeLoop(tif); break; } op += len, occ -= len; } else *op++ = (char)code, occ--; } tif->tif_rawcp = (tidata_t) bp; sp->lzw_nbits = (u_short) nbits; sp->lzw_nextdata = nextdata; sp->lzw_nextbits = nextbits; sp->dec_nbitsmask = nbitsmask; sp->dec_oldcodep = oldcodep; sp->dec_free_entp = free_entp; sp->dec_maxcodep = maxcodep; if (occ > 0) { TIFFError(tif->tif_name, "LZWDecode: Not enough data at scanline %d (short %d bytes)", tif->tif_row, occ); return (0); } return (1); } #ifdef LZW_COMPAT /* * Decode a "hunk of data" for old images. */ #define GetNextCodeCompat(sp, bp, code) { \ nextdata |= (u_long) *(bp)++ << nextbits; \ nextbits += 8; \ if (nextbits < nbits) { \ nextdata |= (u_long) *(bp)++ << nextbits; \ nextbits += 8; \ } \ code = (hcode_t)(nextdata & nbitsmask); \ nextdata >>= nbits; \ nextbits -= nbits; \ } static int LZWDecodeCompat(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) { LZWDecodeState *sp = DecoderState(tif); char *op = (char*) op0; long occ = (long) occ0; char *tp; u_char *bp; int code, nbits; long nextbits, nextdata, nbitsmask; code_t *codep, *free_entp, *maxcodep, *oldcodep; (void) s; assert(sp != NULL); /* * Restart interrupted output operation. */ if (sp->dec_restart) { long residue; codep = sp->dec_codep; residue = codep->length - sp->dec_restart; if (residue > occ) { /* * Residue from previous decode is sufficient * to satisfy decode request. Skip to the * start of the decoded string, place decoded * values in the output buffer, and return. */ sp->dec_restart += occ; do { codep = codep->next; } while (--residue > occ); tp = op + occ; do { *--tp = codep->value; codep = codep->next; } while (--occ); return (1); } /* * Residue satisfies only part of the decode request. */ op += residue, occ -= residue; tp = op; do { *--tp = codep->value; codep = codep->next; } while (--residue); sp->dec_restart = 0; } bp = (u_char *)tif->tif_rawcp; nbits = sp->lzw_nbits; nextdata = sp->lzw_nextdata; nextbits = sp->lzw_nextbits; nbitsmask = sp->dec_nbitsmask; oldcodep = sp->dec_oldcodep; free_entp = sp->dec_free_entp; maxcodep = sp->dec_maxcodep; while (occ > 0) { NextCode(tif, sp, bp, code, GetNextCodeCompat); if (code == CODE_EOI) break; if (code == CODE_CLEAR) { free_entp = sp->dec_codetab + CODE_FIRST; nbits = BITS_MIN; nbitsmask = MAXCODE(BITS_MIN); maxcodep = sp->dec_codetab + nbitsmask; NextCode(tif, sp, bp, code, GetNextCodeCompat); if (code == CODE_EOI) break; *op++ = code, occ--; oldcodep = sp->dec_codetab + code; continue; } codep = sp->dec_codetab + code; /* * Add the new entry to the code table. */ assert(&sp->dec_codetab[0] <= free_entp && free_entp < &sp->dec_codetab[CSIZE]); free_entp->next = oldcodep; free_entp->firstchar = free_entp->next->firstchar; free_entp->length = free_entp->next->length+1; free_entp->value = (codep < free_entp) ? codep->firstchar : free_entp->firstchar; if (++free_entp > maxcodep) { if (++nbits > BITS_MAX) /* should not happen */ nbits = BITS_MAX; nbitsmask = MAXCODE(nbits); maxcodep = sp->dec_codetab + nbitsmask; } oldcodep = codep; if (code >= 256) { /* * Code maps to a string, copy string * value to output (written in reverse). */ if (codep->length > occ) { /* * String is too long for decode buffer, * locate portion that will fit, copy to * the decode buffer, and setup restart * logic for the next decoding call. */ sp->dec_codep = codep; do { codep = codep->next; } while (codep->length > occ); sp->dec_restart = occ; tp = op + occ; do { *--tp = codep->value; codep = codep->next; } while (--occ); break; } op += codep->length, occ -= codep->length; tp = op; do { *--tp = codep->value; } while( (codep = codep->next) != NULL); } else *op++ = code, occ--; } tif->tif_rawcp = (tidata_t) bp; sp->lzw_nbits = nbits; sp->lzw_nextdata = nextdata; sp->lzw_nextbits = nextbits; sp->dec_nbitsmask = nbitsmask; sp->dec_oldcodep = oldcodep; sp->dec_free_entp = free_entp; sp->dec_maxcodep = maxcodep; if (occ > 0) { TIFFError(tif->tif_name, "LZWDecodeCompat: Not enough data at scanline %d (short %d bytes)", tif->tif_row, occ); return (0); } return (1); } #endif /* LZW_COMPAT */ static void LZWCleanup(TIFF* tif) { if (tif->tif_data) { if (tif->tif_mode == O_RDONLY) { if (DecoderState(tif)->dec_codetab) _TIFFfree(DecoderState(tif)->dec_codetab); } _TIFFfree(tif->tif_data); tif->tif_data = NULL; } } static int LZWSetupEncode(TIFF* tif) { TIFFError(tif->tif_name, "LZW compression is not available to due to Unisys patent enforcement"); return (0); } int TIFFInitLZW(TIFF* tif, int scheme) { assert(scheme == COMPRESSION_LZW); /* * Allocate state block so tag methods have storage to record values. */ if (tif->tif_mode == O_RDONLY) { tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (LZWDecodeState)); if (tif->tif_data == NULL) goto bad; DecoderState(tif)->dec_codetab = NULL; DecoderState(tif)->dec_decode = NULL; } /* * Install codec methods. */ tif->tif_setupencode = LZWSetupEncode; tif->tif_setupdecode = LZWSetupDecode; tif->tif_predecode = LZWPreDecode; tif->tif_decoderow = LZWDecode; tif->tif_decodestrip = LZWDecode; tif->tif_decodetile = LZWDecode; tif->tif_cleanup = LZWCleanup; /* * Setup predictor setup. */ if( tif->tif_mode == O_RDONLY ) (void) TIFFPredictorInit(tif); return (1); bad: TIFFError("TIFFInitLZW", "No space for LZW state block"); return (0); } /* * Copyright (c) 1985, 1986 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * James A. Woods, derived from original work by Spencer Thomas * and Joseph Orost. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #endif /* LZW_SUPPORT */ gamera-3.3.3/src/libtiff/tif_next.c0000644000076500000000000000713010714675674016156 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef NEXT_SUPPORT /* * TIFF Library. * * NeXT 2-bit Grey Scale Compression Algorithm Support */ #define SETPIXEL(op, v) { \ switch (npixels++ & 3) { \ case 0: op[0] = (v) << 6; break; \ case 1: op[0] |= (v) << 4; break; \ case 2: op[0] |= (v) << 2; break; \ case 3: *op++ |= (v); break; \ } \ } #define LITERALROW 0x00 #define LITERALSPAN 0x40 #define WHITE ((1<<2)-1) static int NeXTDecode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) { register u_char *bp, *op; register tsize_t cc; register int n; tidata_t row; tsize_t scanline; (void) s; /* * Each scanline is assumed to start off as all * white (we assume a PhotometricInterpretation * of ``min-is-black''). */ for (op = buf, cc = occ; cc-- > 0;) *op++ = 0xff; bp = (u_char *)tif->tif_rawcp; cc = tif->tif_rawcc; scanline = tif->tif_scanlinesize; for (row = buf; (long)occ > 0; occ -= scanline, row += scanline) { n = *bp++, cc--; switch (n) { case LITERALROW: /* * The entire scanline is given as literal values. */ if (cc < scanline) goto bad; _TIFFmemcpy(row, bp, scanline); bp += scanline; cc -= scanline; break; case LITERALSPAN: { int off; /* * The scanline has a literal span * that begins at some offset. */ off = (bp[0] * 256) + bp[1]; n = (bp[2] * 256) + bp[3]; if (cc < 4+n) goto bad; _TIFFmemcpy(row+off, bp+4, n); bp += 4+n; cc -= 4+n; break; } default: { register int npixels = 0, grey; u_long imagewidth = tif->tif_dir.td_imagewidth; /* * The scanline is composed of a sequence * of constant color ``runs''. We shift * into ``run mode'' and interpret bytes * as codes of the form * until we've filled the scanline. */ op = row; for (;;) { grey = (n>>6) & 0x3; n &= 0x3f; while (n-- > 0) SETPIXEL(op, grey); if (npixels >= (int) imagewidth) break; if (cc == 0) goto bad; n = *bp++, cc--; } break; } } } tif->tif_rawcp = (tidata_t) bp; tif->tif_rawcc = cc; return (1); bad: TIFFError(tif->tif_name, "NeXTDecode: Not enough data for scanline %ld", (long) tif->tif_row); return (0); } int TIFFInitNeXT(TIFF* tif, int scheme) { (void) scheme; tif->tif_decoderow = NeXTDecode; tif->tif_decodestrip = NeXTDecode; tif->tif_decodetile = NeXTDecode; return (1); } #endif /* NEXT_SUPPORT */ gamera-3.3.3/src/libtiff/tif_ojpeg.c0000644000076500000000000024204410714675674016311 0ustar chriswheel#include "tiffiop.h" #ifdef OJPEG_SUPPORT /* JPEG Compression support, as per the original TIFF 6.0 specification. WARNING: KLUDGE ALERT! The type of JPEG encapsulation defined by the TIFF Version 6.0 specification is now totally obsolete and deprecated for new applications and images. This file is an unsupported hack that was created solely in order to read (but NOT write!) a few old, unconverted images still present on some users' computer systems. The code isn't pretty or robust, and it won't read every "old format" JPEG-in-TIFF file (see Samuel Leffler's draft "TIFF Technical Note No. 2" for a long and incomplete list of known problems), but it seems to work well enough in the few cases of practical interest to the author; so, "caveat emptor"! This file should NEVER be enhanced to write new images using anything other than the latest approved JPEG-in-TIFF encapsulation method, implemented by the "tif_jpeg.c" file elsewhere in this library. This file interfaces with Release 6B of the JPEG Library written by theu Independent JPEG Group, which you can find on the Internet at: ftp.uu.net:/graphics/jpeg/. Contributed by Scott Marovich with considerable help from Charles Auer to unravel the mysteries of image files created by Microsoft's Wang Imaging application. */ #include #include #ifdef FAR #undef FAR /* Undefine FAR to avoid conflict with JPEG definition */ #endif #define JPEG_INTERNALS /* Include "jpegint.h" for "DSTATE_*" symbols */ #undef INLINE #include "jpeglib.h" #undef JPEG_INTERNALS /* Hack for Microsoft's Wang Imaging for Windows output files */ extern void jpeg_reset_huff_decode(j_decompress_ptr,float *); /* On some machines, it may be worthwhile to use "_setjmp()" or "sigsetjmp()" instead of "setjmp()". These macros make it easier: */ #define SETJMP(jbuf)setjmp(jbuf) #define LONGJMP(jbuf,code)longjmp(jbuf,code) #define JMP_BUF jmp_buf #define TIFFTAG_WANG_PAGECONTROL 32934 /* Bit-vector offsets for keeping track of TIFF records that we've parsed. */ #define FIELD_JPEGPROC FIELD_CODEC #define FIELD_JPEGIFOFFSET (FIELD_CODEC+1) #define FIELD_JPEGIFBYTECOUNT (FIELD_CODEC+2) #define FIELD_JPEGRESTARTINTERVAL (FIELD_CODEC+3) #define FIELD_JPEGTABLES (FIELD_CODEC+4) /* New, post-6.0 JPEG-in-TIFF tag! */ #define FIELD_JPEGLOSSLESSPREDICTORS (FIELD_CODEC+5) #define FIELD_JPEGPOINTTRANSFORM (FIELD_CODEC+6) #define FIELD_JPEGQTABLES (FIELD_CODEC+7) #define FIELD_JPEGDCTABLES (FIELD_CODEC+8) #define FIELD_JPEGACTABLES (FIELD_CODEC+9) #define FIELD_WANG_PAGECONTROL (FIELD_CODEC+10) #define FIELD_JPEGCOLORMODE (FIELD_CODEC+11) typedef struct jpeg_destination_mgr jpeg_destination_mgr; typedef struct jpeg_source_mgr jpeg_source_mgr; typedef struct jpeg_error_mgr jpeg_error_mgr; /* State variable for each open TIFF file that uses "libjpeg" for JPEG decompression. (Note: This file should NEVER perform JPEG compression except in the manner implemented by the "tif_jpeg.c" file, elsewhere in this library; see comments above.) JPEG Library internal state is recorded in a "jpeg_{de}compress_struct", while a "jpeg_common_struct" records a few items common to both compression and expansion. The "cinfo" field containing JPEG Library state MUST be the 1st member of our own state variable, so that we can safely "cast" pointers back and forth. */ typedef struct /* This module's private, per-image state variable */ { union /* JPEG Library state variable; this MUST be our 1st field! */ { /* struct jpeg_compress_struct c; */ struct jpeg_decompress_struct d; struct jpeg_common_struct comm; } cinfo; jpeg_error_mgr err; /* JPEG Library error manager */ JMP_BUF exit_jmpbuf; /* ...for catching JPEG Library failures */ # ifdef never /* (The following two fields could be a "union", but they're small enough that it's not worth the effort.) */ jpeg_destination_mgr dest; /* Destination for compressed data */ # endif jpeg_source_mgr src; /* Source of expanded data */ JSAMPARRAY ds_buffer[MAX_COMPONENTS]; /* ->Temporary downsampling buffers */ TIFF *tif; /* Reverse pointer, needed by some code */ TIFFVGetMethod vgetparent; /* "Super class" methods... */ TIFFVSetMethod vsetparent; TIFFStripMethod defsparent; TIFFTileMethod deftparent; void *jpegtables; /* ->"New" JPEG tables, if we synthesized any */ uint32 is_WANG, /* <=> Microsoft Wang Imaging for Windows output file? */ jpegtables_length; /* Length of "new" JPEG tables, if they exist */ tsize_t bytesperline; /* No. of decompressed Bytes per scan line */ int jpegquality, /* Compression quality level */ jpegtablesmode, /* What to put in JPEGTables */ samplesperclump, scancount; /* No. of scan lines accumulated */ uint16 h_sampling, /* Luminance sampling factors */ v_sampling, photometric; /* Copy of "PhotometricInterpretation" tag value */ u_char jpegcolormode; /* Who performs RGB <-> YCbCr conversion? */ /* JPEGCOLORMODE_RAW <=> TIFF Library does conversion */ /* JPEGCOLORMODE_RGB <=> JPEG Library does conversion */ } OJPEGState; #define OJState(tif)((OJPEGState*)(tif)->tif_data) static const TIFFFieldInfo ojpegFieldInfo[]=/* JPEG-specific TIFF-record tags */ { /* This is the current JPEG-in-TIFF metadata-encapsulation tag, and its treatment in this file is idiosyncratic. It should never appear in a "source" image conforming to the TIFF Version 6.0 specification, so we arrange to report an error if it appears. But in order to support possible future conversion of "old" JPEG-in-TIFF encapsulations to "new" ones, we might wish to synthesize an equivalent value to be returned by the TIFF Library's "getfield" method. So, this table tells the TIFF Library to pass these records to us in order to filter them below. */ { TIFFTAG_JPEGTABLES ,TIFF_VARIABLE,TIFF_VARIABLE, TIFF_UNDEFINED,FIELD_JPEGTABLES ,FALSE,TRUE ,"JPEGTables" }, /* These tags are defined by the TIFF Version 6.0 specification and are now obsolete. This module reads them from an old "source" image, but it never writes them to a new "destination" image. */ { TIFFTAG_JPEGPROC ,1 ,1 , TIFF_SHORT ,FIELD_JPEGPROC ,FALSE,FALSE,"JPEGProc" }, { TIFFTAG_JPEGIFOFFSET ,1 ,1 , TIFF_LONG ,FIELD_JPEGIFOFFSET ,FALSE,FALSE,"JPEGInterchangeFormat" }, { TIFFTAG_JPEGIFBYTECOUNT ,1 ,1 , TIFF_LONG ,FIELD_JPEGIFBYTECOUNT ,FALSE,FALSE,"JPEGInterchangeFormatLength" }, { TIFFTAG_JPEGRESTARTINTERVAL ,1 ,1 , TIFF_SHORT ,FIELD_JPEGRESTARTINTERVAL ,FALSE,FALSE,"JPEGRestartInterval" }, { TIFFTAG_JPEGLOSSLESSPREDICTORS,TIFF_VARIABLE,TIFF_VARIABLE, TIFF_SHORT ,FIELD_JPEGLOSSLESSPREDICTORS,FALSE,TRUE ,"JPEGLosslessPredictors" }, { TIFFTAG_JPEGPOINTTRANSFORM ,TIFF_VARIABLE,TIFF_VARIABLE, TIFF_SHORT ,FIELD_JPEGPOINTTRANSFORM ,FALSE,TRUE ,"JPEGPointTransforms" }, { TIFFTAG_JPEGQTABLES ,TIFF_VARIABLE,TIFF_VARIABLE, TIFF_LONG ,FIELD_JPEGQTABLES ,FALSE,TRUE ,"JPEGQTables" }, { TIFFTAG_JPEGDCTABLES ,TIFF_VARIABLE,TIFF_VARIABLE, TIFF_LONG ,FIELD_JPEGDCTABLES ,FALSE,TRUE ,"JPEGDCTables" }, { TIFFTAG_JPEGACTABLES ,TIFF_VARIABLE,TIFF_VARIABLE, TIFF_LONG ,FIELD_JPEGACTABLES ,FALSE,TRUE ,"JPEGACTables" }, { TIFFTAG_WANG_PAGECONTROL ,TIFF_VARIABLE,1 , TIFF_LONG ,FIELD_WANG_PAGECONTROL ,FALSE,FALSE,"WANG PageControl" }, /* This is a pseudo tag intended for internal use only by the TIFF Library and its clients, which should never appear in an input/output image file. It specifies whether the TIFF Library will perform YCbCr<->RGB color-space conversion (JPEGCOLORMODE_RAW <=> 0) or ask the JPEG Library to do it (JPEGCOLORMODE_RGB <=> 1). */ { TIFFTAG_JPEGCOLORMODE ,0 ,0 , TIFF_ANY ,FIELD_PSEUDO ,FALSE,FALSE,"JPEGColorMode" } }; static const char JPEGLib_name[]={"JPEG Library"}, bad_bps[]={"%u BitsPerSample not allowed for JPEG"}, # ifdef never no_write_frac[]={"fractional scan line discarded"}, # endif no_read_frac[]={"fractional scan line not read"}, no_jtable_space[]={"No space for JPEGTables"}; /* The following diagnostic subroutines interface with and replace default subroutines in the JPEG Library. Our basic strategy is to use "setjmp()"/ "longjmp()" in order to return control to the TIFF Library when the JPEG library detects an error, and to use TIFF Library subroutines for displaying diagnostic messages to a client application. */ static void TIFFojpeg_error_exit(register j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; (*cinfo->err->format_message)(cinfo,buffer); TIFFError(JPEGLib_name,buffer); /* Display error message */ jpeg_abort(cinfo); /* Clean up JPEG Library state */ LONGJMP(((OJPEGState *)cinfo)->exit_jmpbuf,1); /* Return to TIFF client */ } static void TIFFojpeg_output_message(register j_common_ptr cinfo) { char buffer[JMSG_LENGTH_MAX]; /* This subroutine is invoked only for warning messages, since the JPEG Library's "error_exit" method does its own thing and "trace_level" is never set > 0. */ (*cinfo->err->format_message)(cinfo,buffer); TIFFWarning(JPEGLib_name,buffer); } /* The following subroutines, which also interface with the JPEG Library, exist mainly in limit the side effects of "setjmp()" and convert JPEG normal/error conditions into TIFF Library return codes. */ #define CALLJPEG(sp,fail,op)(SETJMP((sp)->exit_jmpbuf)?(fail):(op)) #define CALLVJPEG(sp,op)CALLJPEG(sp,0,((op),1)) #ifdef never static int TIFFojpeg_create_compress(register OJPEGState *sp) { sp->cinfo.c.err = jpeg_std_error(&sp->err); /* Initialize error handling */ sp->err.error_exit = TIFFojpeg_error_exit; sp->err.output_message = TIFFojpeg_output_message; return CALLVJPEG(sp,jpeg_create_compress(&sp->cinfo.c)); } static int TIFFojpeg_finish_compress(register OJPEGState *sp) {return CALLVJPEG(sp,jpeg_finish_compress(&sp->cinfo.c));} static int TIFFojpeg_set_colorspace(register OJPEGState *sp,J_COLOR_SPACE colorspace) {return CALLVJPEG(sp,jpeg_set_colorspace(&sp->cinfo.c,colorspace));} static int TIFFojpeg_set_defaults(register OJPEGState *sp) {return CALLVJPEG(sp,jpeg_set_defaults(&sp->cinfo.c));} static int TIFFojpeg_set_quality(register OJPEGState *sp,int quality,boolean force_baseline) {return CALLVJPEG(sp,jpeg_set_quality(&sp->cinfo.c,quality,force_baseline));} static int TIFFojpeg_start_compress(register OJPEGState *sp,boolean write_all_tables) {return CALLVJPEG(sp,jpeg_start_compress(&sp->cinfo.c,write_all_tables));} static int TIFFojpeg_suppress_tables(register OJPEGState *sp,boolean suppress) {return CALLVJPEG(sp,jpeg_suppress_tables(&sp->cinfo.c,suppress));} static int TIFFojpeg_write_raw_data(register OJPEGState *sp,JSAMPIMAGE data,int num_lines) { return CALLJPEG(sp,-1,(int)jpeg_write_raw_data(&sp->cinfo.c,data,(JDIMENSION)num_lines)); } static int TIFFojpeg_write_scanlines(register OJPEGState *sp,JSAMPARRAY scanlines, int num_lines) { return CALLJPEG(sp,-1,(int)jpeg_write_scanlines(&sp->cinfo.c,scanlines,(JDIMENSION)num_lines)); } static int TIFFojpeg_write_tables(register OJPEGState *sp) {return CALLVJPEG(sp,jpeg_write_tables(&sp->cinfo.c));} #else /* well, hardly ever */ static int _notSupported(register TIFF *tif) { const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression); TIFFError(tif->tif_name,"%s compression is not supported",c->name); return 0; } #endif /* never */ static int TIFFojpeg_abort(register OJPEGState *sp) {return CALLVJPEG(sp,jpeg_abort(&sp->cinfo.comm));} static JSAMPARRAY TIFFojpeg_alloc_sarray(register OJPEGState *sp,int pool_id, JDIMENSION samplesperrow,JDIMENSION numrows) { return CALLJPEG(sp,0,(*sp->cinfo.comm.mem->alloc_sarray)(&sp->cinfo.comm,pool_id,samplesperrow, numrows)); } static int TIFFojpeg_create_decompress(register OJPEGState *sp) { sp->cinfo.d.err = jpeg_std_error(&sp->err); /* Initialize error handling */ sp->err.error_exit = TIFFojpeg_error_exit; sp->err.output_message = TIFFojpeg_output_message; return CALLVJPEG(sp,jpeg_create_decompress(&sp->cinfo.d)); } static int TIFFojpeg_destroy(register OJPEGState *sp) {return CALLVJPEG(sp,jpeg_destroy(&sp->cinfo.comm));} static int TIFFojpeg_finish_decompress(register OJPEGState *sp) {return CALLJPEG(sp,-1,(int)jpeg_finish_decompress(&sp->cinfo.d));} static int TIFFojpeg_read_header(register OJPEGState *sp,boolean require_image) {return CALLJPEG(sp,-1,jpeg_read_header(&sp->cinfo.d,require_image));} static int TIFFojpeg_read_raw_data(register OJPEGState *sp,JSAMPIMAGE data,int max_lines) { return CALLJPEG(sp,-1,(int)jpeg_read_raw_data(&sp->cinfo.d,data,(JDIMENSION)max_lines)); } static int TIFFojpeg_read_scanlines(register OJPEGState *sp,JSAMPARRAY scanlines, int max_lines) { return CALLJPEG(sp,-1,(int)jpeg_read_scanlines(&sp->cinfo.d,scanlines,(JDIMENSION)max_lines)); } static int TIFFojpeg_start_decompress(register OJPEGState *sp) {return CALLVJPEG(sp,jpeg_start_decompress(&sp->cinfo.d));} #ifdef never /* The following subroutines comprise a JPEG Library "destination" data manager by directing compressed data from the JPEG Library to a TIFF Library output buffer. */ static void std_init_destination(register j_compress_ptr cinfo){} /* "Dummy" stub */ static boolean std_empty_output_buffer(register j_compress_ptr cinfo) { # define sp ((OJPEGState *)cinfo) register TIFF *tif = sp->tif; tif->tif_rawcc = tif->tif_rawdatasize; /* Entire buffer has been filled */ TIFFFlushData1(tif); sp->dest.next_output_byte = (JOCTET *)tif->tif_rawdata; sp->dest.free_in_buffer = (size_t)tif->tif_rawdatasize; return TRUE; # undef sp } static void std_term_destination(register j_compress_ptr cinfo) { # define sp ((OJPEGState *)cinfo) register TIFF *tif = sp->tif; /* NB: The TIFF Library does the final buffer flush. */ tif->tif_rawcp = (tidata_t)sp->dest.next_output_byte; tif->tif_rawcc = tif->tif_rawdatasize - (tsize_t)sp->dest.free_in_buffer; # undef sp } /*ARGSUSED*/ static void TIFFojpeg_data_dest(register OJPEGState *sp,TIFF *tif) { sp->cinfo.c.dest = &sp->dest; sp->dest.init_destination = std_init_destination; sp->dest.empty_output_buffer = std_empty_output_buffer; sp->dest.term_destination = std_term_destination; } /* Alternate destination manager to output JPEGTables field: */ static void tables_init_destination(register j_compress_ptr cinfo) { # define sp ((OJPEGState *)cinfo) /* The "jpegtables_length" field is the allocated buffer size while building */ sp->dest.next_output_byte = (JOCTET *)sp->jpegtables; sp->dest.free_in_buffer = (size_t)sp->jpegtables_length; # undef sp } static boolean tables_empty_output_buffer(register j_compress_ptr cinfo) { void *newbuf; # define sp ((OJPEGState *)cinfo) /* The entire buffer has been filled, so enlarge it by 1000 bytes. */ if (!( newbuf = _TIFFrealloc( (tdata_t)sp->jpegtables , (tsize_t)(sp->jpegtables_length + 1000) ) ) ) ERREXIT1(cinfo,JERR_OUT_OF_MEMORY,100); sp->dest.next_output_byte = (JOCTET *)newbuf + sp->jpegtables_length; sp->dest.free_in_buffer = (size_t)1000; sp->jpegtables = newbuf; sp->jpegtables_length += 1000; return TRUE; # undef sp } static void tables_term_destination(register j_compress_ptr cinfo) { # define sp ((OJPEGState *)cinfo) /* Set tables length to no. of Bytes actually emitted. */ sp->jpegtables_length -= sp->dest.free_in_buffer; # undef sp } /*ARGSUSED*/ static int TIFFojpeg_tables_dest(register OJPEGState *sp, TIFF *tif) { /* Allocate a working buffer for building tables. The initial size is 1000 Bytes, which is usually adequate. */ if (sp->jpegtables) _TIFFfree(sp->jpegtables); if (!(sp->jpegtables = (void*) _TIFFmalloc((tsize_t)(sp->jpegtables_length = 1000)) ) ) { sp->jpegtables_length = 0; TIFFError("TIFFojpeg_tables_dest",no_jtable_space); return 0; }; sp->cinfo.c.dest = &sp->dest; sp->dest.init_destination = tables_init_destination; sp->dest.empty_output_buffer = tables_empty_output_buffer; sp->dest.term_destination = tables_term_destination; return 1; } #endif /* never */ /* The following subroutines comprise a JPEG Library "source" data manager by by directing compressed data to the JPEG Library from a TIFF Library input buffer. */ static void std_init_source(register j_decompress_ptr cinfo) { # define sp ((OJPEGState *)cinfo) register TIFF *tif = sp->tif; if (sp->src.bytes_in_buffer == 0) { sp->src.next_input_byte = (const JOCTET *)tif->tif_rawdata; sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc; }; # undef sp } static boolean std_fill_input_buffer(register j_decompress_ptr cinfo) { static const JOCTET dummy_EOI[2]={0xFF,JPEG_EOI}; # define sp ((OJPEGState *)cinfo) /* Control should never get here, since an entire strip/tile is read into memory before the decompressor is called; thus, data should have been supplied by the "init_source" method. ...But, sometimes things fail. */ WARNMS(cinfo,JWRN_JPEG_EOF); sp->src.next_input_byte = dummy_EOI; /* Insert a fake EOI marker */ sp->src.bytes_in_buffer = sizeof dummy_EOI; return TRUE; # undef sp } static void std_skip_input_data(register j_decompress_ptr cinfo,long num_bytes) { # define sp ((OJPEGState *)cinfo) if (num_bytes > 0) if (num_bytes > (long)sp->src.bytes_in_buffer) /* oops: buffer overrun */ (void)std_fill_input_buffer(cinfo); else { sp->src.next_input_byte += (size_t)num_bytes; sp->src.bytes_in_buffer -= (size_t)num_bytes; } # undef sp } /*ARGSUSED*/ static void std_term_source(register j_decompress_ptr cinfo){} /* "Dummy" stub */ /* Allocate temporary I/O buffers for downsampled data, using values computed in "jpeg_start_{de}compress()". We use the JPEG Library's allocator so that buffers will be released automatically when done with a strip/tile. This is also a handy place to compute samplesperclump, bytesperline, etc. */ static int alloc_downsampled_buffers(TIFF *tif,jpeg_component_info *comp_info, int num_components) { register OJPEGState *sp = OJState(tif); sp->samplesperclump = 0; if (num_components > 0) { int ci = 0; register jpeg_component_info *compptr = comp_info; do { JSAMPARRAY buf; sp->samplesperclump += compptr->h_samp_factor * compptr->v_samp_factor; if (!(buf = TIFFojpeg_alloc_sarray( sp , JPOOL_IMAGE , compptr->width_in_blocks*DCTSIZE , compptr->v_samp_factor *DCTSIZE ) ) ) return 0; sp->ds_buffer[ci] = buf; } while (++compptr,++ci < num_components); }; return 1; } #ifdef never /* JPEG Encoding begins here. */ static void unsuppress_quant_table(register OJPEGState *sp,int tblno) { register JQUANT_TBL *qtbl; if (qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) qtbl->sent_table = FALSE; } static void unsuppress_huff_table(register OJPEGState *sp,register int tblno) { register JHUFF_TBL *htbl; if ( (htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) || (htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) ) htbl->sent_table = FALSE; } static int prepare_JPEGTables(register TIFF *tif) { register OJPEGState *sp = OJState(tif); /* Initialize quantization tables for the current quality setting, and mark for output only the tables that we want. Note that chrominance tables are currently used only with YCbCr. */ if ( !TIFFojpeg_set_quality(sp,sp->jpegquality,FALSE); || !TIFFojpeg_suppress_tables(sp,TRUE) ) return 0; if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) { unsuppress_quant_table(sp,0); if (sp->photometric == PHOTOMETRIC_YCBCR) unsuppress_quant_table(sp,1); } if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) { unsuppress_huff_table(sp,0); if (sp->photometric == PHOTOMETRIC_YCBCR) unsuppress_huff_table(sp,1); }; return TIFFojpeg_tables_dest(sp,tif) && TIFFojpeg_write_tables(sp); } static int OJPEGSetupEncode(register TIFF *tif) { static const char module[]={"OJPEGSetupEncode"}; register OJPEGState *sp = OJState(tif); # define td (&tif->tif_dir) /* Verify miscellaneous parameters. This will need work if the TIFF Library ever supports different depths for different components, or if the JPEG Library ever supports run-time depth selection. Neither seems imminent. */ if (td->td_bitspersample != BITS_IN_JSAMPLE) { TIFFError(module,bad_bps,td->td_bitspersample); return 0; }; /* Initialize all JPEG parameters to default values. Note that the JPEG Library's "jpeg_set_defaults()" method needs legal values for the "in_color_space" and "input_components" fields. */ sp->cinfo.c.in_color_space = JCS_UNKNOWN; sp->cinfo.c.input_components = 1; if (!TIFFojpeg_set_defaults(sp)) return 0; switch (sp->photometric = td->td_photometric) /* set per-file parameters */ { case PHOTOMETRIC_YCBCR: sp->h_sampling = td->td_ycbcrsubsampling[0]; sp->v_sampling = td->td_ycbcrsubsampling[1]; # ifdef COLORIMETRY_SUPPORT /* A ReferenceBlackWhite field MUST be present, since the default value is inapproriate for YCbCr. Fill in the proper value if application didn't set it. */ if (!TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) { float refbw[6]; long top = 1L << td->td_bitspersample; refbw[0] = 0; refbw[1] = (float)(top-1L); refbw[2] = (float)(top>>1); refbw[3] = refbw[1]; refbw[4] = refbw[2]; refbw[5] = refbw[1]; TIFFSetField(tif,TIFFTAG_REFERENCEBLACKWHITE,refbw); }; # endif /* COLORIMETRY_SUPPORT */ break; case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */ case PHOTOMETRIC_MASK: TIFFError(module,"PhotometricInterpretation %d not allowed for JPEG", (int)sp->photometric); return 0; /* TIFF 6.0 forbids subsampling of all other color spaces */ default: sp->h_sampling = sp->v_sampling = 1; }; sp->cinfo.c.data_precision = td->td_bitspersample; if (isTiled(tif)) { if (td->td_tilelength % (sp->v_sampling*DCTSIZE)) { TIFFError(module,"JPEG tile height must be multiple of %d", sp->v_sampling*DCTSIZE); return 0; }; if (td->td_tilewidth % (sp->h_sampling*DCTSIZE)) { TIFFError(module,"JPEG tile width must be multiple of %d", sp->h_sampling*DCTSIZE); return 0; } } else if ( td->td_rowsperstrip < td->td_imagelength && (td->td_rowsperstrip % (sp->v_sampling*DCTSIZE)) ) { TIFFError(module,"RowsPerStrip must be multiple of %d for JPEG", sp->v_sampling*DCTSIZE); return 0; }; if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) { /* create a JPEGTables field */ if (!prepare_JPEGTables(tif)) return 0; /* Mark the field "present". We can't use "TIFFSetField()" because "BEENWRITING" is already set! */ TIFFSetFieldBit(tif,FIELD_JPEGTABLES); tif->tif_flags |= TIFF_DIRTYDIRECT; } else /* We do not support application-supplied JPEG tables, so mark the field "not present". */ TIFFClrFieldBit(tif,FIELD_JPEGTABLES); TIFFojpeg_data_dest(sp,tif); /* send JPEG output to TIFF Library's buffer */ return 1; # undef td } /*ARGSUSED*/ static int OJPEGEncode(register TIFF *tif,tidata_t buf,tsize_t cc,tsample_t s) { register OJPEGState *sp = OJState(tif); /* Encode a chunk of pixels, where returned data is NOT down-sampled (the standard case). The data is expected to be written in scan-line multiples. */ if (cc % sp->bytesperline) TIFFWarning(tif->tif_name,no_write_frac); cc /= sp->bytesperline; while (--cc >= 0) { JSAMPROW bufptr = (JSAMPROW)buf; if (TIFFojpeg_write_scanlines(sp,&bufptr,1) != 1) return 0; ++tif->tif_row; buf += sp->bytesperline; }; return 1; } /*ARGSUSED*/ static int OJPEGEncodeRaw(register TIFF *tif,tidata_t buf,tsize_t cc,tsample_t s) { register OJPEGState *sp = OJState(tif); /* Encode a chunk of pixels, where returned data is down-sampled as per the sampling factors. The data is expected to be written in scan-line multiples. */ if (cc % sp->bytesperline) TIFFWarning(tif->tif_name,no_write_frac); cc /= sp->bytesperline; while (--cc >= 0) { if (sp->cinfo.c.num_components > 0) { int ci = 0, clumpoffset = 0; register jpeg_component_info *compptr = sp->cinfo.c.comp_info; /* The fastest way to separate the data is to make 1 pass over the scan line for each row of each component. */ do { int ypos = 0; do { int padding; register JSAMPLE *inptr = (JSAMPLE*)buf + clumpoffset, *outptr = sp->ds_buffer[ci][sp->scancount*compptr->v_samp_factor+ypos]; /* Cb,Cr both have sampling factors 1, so this is correct */ register int clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width, xpos; padding = (int) ( compptr->width_in_blocks * DCTSIZE - clumps_per_line * compptr->h_samp_factor ); if (compptr->h_samp_factor == 1) /* Cb & Cr fast path */ do { *outptr++ = inptr[0]; inptr += sp->samplesperclump; } while (--clumps_per_line > 0); else /* general case */ do { xpos = 0; do *outptr++ = inptr[xpos]; while (++xpos < compptr->h_samp_factor); inptr += sp->samplesperclump; } while (--clumps_per_line > 0); xpos = 0; /* Pad each scan line as needed */ do outptr[0]=outptr[-1]; while (++outptr,++xpos < padding); clumpoffset += compptr->h_samp_factor; } while (++ypos < compptr->v_samp_factor); } while (++compptr,++ci < sp->cinfo.c.num_components); }; if (++sp->scancount >= DCTSIZE) { int n = sp->cinfo.c.max_v_samp_factor*DCTSIZE; if (TIFFojpeg_write_raw_data(sp,sp->ds_buffer,n) != n) return 0; sp->scancount = 0; }; ++tif->tif_row++ buf += sp->bytesperline; }; return 1; } static int OJPEGPreEncode(register TIFF *tif,tsample_t s) { static const char module[]={"OJPEGPreEncode"}; uint32 segment_width, segment_height; int downsampled_input = FALSE; register OJPEGState *sp = OJState(tif); # define td (&tif->tif_dir) /* Set encoding state at the start of a strip or tile. */ if (td->td_planarconfig == PLANARCONFIG_CONTIG) { sp->cinfo.c.input_components = td->td_samplesperpixel; if (sp->photometric == PHOTOMETRIC_YCBCR) { if (sp->jpegcolormode == JPEGCOLORMODE_RGB) sp->cinfo.c.in_color_space = JCS_RGB; else { sp->cinfo.c.in_color_space = JCS_YCbCr; if (sp->h_sampling != 1 || sp->v_sampling != 1) downsampled_input = TRUE; }; if (!TIFFojpeg_set_colorspace(sp,JCS_YCbCr)) return 0; /* Set Y sampling factors; we assume "jpeg_set_colorspace()" set the rest to 1. */ sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling; sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling; } else { sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFojpeg_set_colorspace(sp,JCS_UNKNOWN)) return 0; /* "jpeg_set_colorspace()" set all sampling factors to 1. */ } } else { sp->cinfo.c.input_components = 1; sp->cinfo.c.in_color_space = JCS_UNKNOWN; if (!TIFFojpeg_set_colorspace(sp,JCS_UNKNOWN)) return 0; sp->cinfo.c.comp_info[0].component_id = s; /* "jpeg_set_colorspace()" set all sampling factors to 1. */ if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) sp->cinfo.c.comp_info[0].quant_tbl_no = sp->cinfo.c.comp_info[0].dc_tbl_no = sp->cinfo.c.comp_info[0].ac_tbl_no = 1; }; if (isTiled(tif)) { segment_width = td->td_tilewidth; segment_height = td->td_tilelength; sp->bytesperline = TIFFTileRowSize(tif); } else { segment_width = td->td_imagewidth; segment_height = td->td_imagelength - tif->tif_row; if (segment_height > td->td_rowsperstrip) segment_height = td->td_rowsperstrip; sp->bytesperline = TIFFScanlineSize(tif); }; if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) { /* Scale the expected strip/tile size to match a downsampled component. */ segment_width = TIFFhowmany(segment_width,sp->h_sampling); segment_height = TIFFhowmany(segment_height,sp->v_sampling); }; if (segment_width > 65535 || segment_height > 65535) { TIFFError(module,"Strip/tile too large for JPEG"); return 0; }; sp->cinfo.c.image_width = segment_width; sp->cinfo.c.image_height = segment_height; sp->cinfo.c.write_JFIF_header = /* Don't write extraneous markers */ sp->cinfo.c.write_Adobe_marker = FALSE; if (!(sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) /* setup table handling */ { if (!TIFFojpeg_set_quality(sp,sp->jpegquality,FALSE)) return 0; unsuppress_quant_table(sp,0); unsuppress_quant_table(sp,1); }; sp->cinfo.c.optimize_coding = !(sp->jpegtablesmode & JPEGTABLESMODE_HUFF); tif->tif_encoderow = tif->tif_encodestrip = tif->tif_encodetile = (sp->cinfo.c.raw_data_in = downsampled_input) ? OJPEGEncodeRaw : OJPEGEncode; if ( !TIFFojpeg_start_compress(sp,FALSE) /* start JPEG compressor */ || downsampled_input /* allocate downsampled-data buffers */ && !alloc_downsampled_buffers(tif,sp->cinfo.c.comp_info, sp->cinfo.c.num_components) ) return 0; sp->scancount = 0; return 1; # undef td } static int OJPEGPostEncode(register TIFF *tif) { register OJPEGState *sp = OJState(tif); /* Finish up at the end of a strip or tile. */ if (sp->scancount > 0) /* emit partial buffer of down-sampled data */ { if (sp->scancount < DCTSIZE && sp->cinfo.c.num_components > 0) { int ci = 0, n; /* Pad the data vertically */ register jpeg_component_info *compptr = sp->cinfo.c.comp_info; do { tsize_t row_width = compptr->width_in_blocks*DCTSIZE*sizeof(JSAMPLE); int ypos = sp->scancount*compptr->v_samp_factor; do _TIFFmemcpy( (tdata_t)sp->ds_buffer[ci][ypos] , (tdata_t)sp->ds_buffer[ci][ypos-1] , row_width ); while (++ypos < compptr->v_samp_factor*DCTSIZE); } while (++compptr,++ci < sp->cinfo.c.num_components); }; n = sp->cinfo.c.max_v_samp_factor*DCTSIZE; if (TIFFojpeg_write_raw_data(sp,sp->ds_buffer,n) != n) return 0; }; return TIFFojpeg_finish_compress(sp); } #endif /* never */ /* JPEG Decoding begins here. */ static int OJPEGSetupDecode(register TIFF *tif) { static const char module[]={"OJPEGSetupDecode"}; register OJPEGState *sp = OJState(tif); # define td (&tif->tif_dir) /* Verify miscellaneous parameters. This will need work if the TIFF Library ever supports different depths for different components, or if the JPEG Library ever supports run-time depth selection. Neither seems imminent. */ if (td->td_bitspersample != BITS_IN_JSAMPLE) { TIFFError(module,bad_bps,td->td_bitspersample); return 0; }; /* Almost all old JPEG-in-TIFF encapsulations use 8 bits per sample, but the following is just a "sanity check", since "OJPEGPreDecode()" actually depends upon this assumption in certain cases. */ if (td->td_bitspersample != 8) { TIFFError(module,"Cannot decompress %u bits per sample"); return 0; }; /* Grab parameters that are same for all strips/tiles. */ if ((sp->photometric = td->td_photometric) == PHOTOMETRIC_YCBCR) { sp->h_sampling = td->td_ycbcrsubsampling[0]; sp->v_sampling = td->td_ycbcrsubsampling[1]; } else /* TIFF 6.0 forbids subsampling of all other color spaces */ sp->h_sampling = sp->v_sampling = 1; sp->cinfo.d.src = &sp->src; sp->src.init_source = std_init_source; sp->src.fill_input_buffer = std_fill_input_buffer; sp->src.skip_input_data = std_skip_input_data; sp->src.resync_to_restart = jpeg_resync_to_restart; sp->src.term_source = std_term_source; tif->tif_postdecode = _TIFFNoPostDecode; /* Override Byte-swapping */ return 1; # undef td } /*ARGSUSED*/ static int OJPEGDecode(register TIFF *tif,tidata_t buf,tsize_t cc,tsample_t s) { static float zeroes[6]; tsize_t nrows; register OJPEGState *sp = OJState(tif); /* BEWARE OF KLUDGE: If our input file was produced by Microsoft's Wang Imaging for Windows application, the DC coefficients of each JPEG image component (Y,Cb,Cr) must be reset at the beginning of each TIFF "strip", and any JPEG data bits remaining in the decoder's input buffer must be discarded, up to the next input-Byte storage boundary. To do so, we create an "ad hoc" interface in the "jdhuff.c" module of IJG JPEG Library Version 6, and we invoke that interface here before decoding each "strip". */ if (sp->is_WANG) jpeg_reset_huff_decode(&sp->cinfo.d,zeroes); /* Decode a chunk of pixels, where returned data is NOT down-sampled (the standard case). The data is expected to be read in scan-line multiples. */ if (nrows = sp->cinfo.d.image_height) { unsigned int bytesperline = isTiled(tif) ? TIFFTileRowSize(tif) : TIFFScanlineSize(tif); /* WARNING: Unlike "OJPEGDecodeRaw()", below, the no. of Bytes in each decoded row is calculated here as "bytesperline" instead of using "sp->bytesperline", which might be a little smaller. This can occur for an old tiled image whose width isn't a multiple of 8 pixels. That's illegal according to the TIFF Version 6 specification, but some test files, like "zackthecat.tif", were built that way. In those cases, we want to embed the image's true width in our caller's buffer (which is presumably allocated according to the expected tile width) by effectively "padding" it with unused Bytes at the end of each row. */ do { JSAMPROW bufptr = (JSAMPROW)buf; if (TIFFojpeg_read_scanlines(sp,&bufptr,1) != 1) return 0; buf += bytesperline; ++tif->tif_row; } while ((cc -= bytesperline) > 0 && --nrows > 0); }; return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height || TIFFojpeg_finish_decompress(sp); } /*ARGSUSED*/ static int OJPEGDecodeRaw(register TIFF *tif,tidata_t buf,tsize_t cc,tsample_t s) { static float zeroes[6]; tsize_t nrows; register OJPEGState *sp = OJState(tif); /* BEWARE OF KLUDGE: If our input file was produced by Microsoft's Wang Imaging for Windows application, the DC coefficients of each JPEG image component (Y,Cb,Cr) must be reset at the beginning of each TIFF "strip", and any JPEG data bits remaining in the decoder's input buffer must be discarded, up to the next input-Byte storage boundary. To do so, we create an "ad hoc" interface in the "jdhuff.c" module of IJG JPEG Library Version 6, and we invoke that interface here before decoding each "strip". */ if (sp->is_WANG) jpeg_reset_huff_decode(&sp->cinfo.d,zeroes); /* Decode a chunk of pixels, where returned data is down-sampled as per the sampling factors. The data is expected to be read in scan-line multiples. */ if (nrows = sp->cinfo.d.image_height) do { if (sp->scancount >= DCTSIZE) /* reload downsampled-data buffer */ { int n = sp->cinfo.d.max_v_samp_factor*DCTSIZE; if (TIFFojpeg_read_raw_data(sp,sp->ds_buffer,n) != n) return 0; sp->scancount = 0; }; if (sp->cinfo.d.num_components > 0) { int ci = 0, clumpoffset = 0; register jpeg_component_info *compptr = sp->cinfo.d.comp_info; /* The fastest way to separate the data is: make 1 pass over the scan line for each row of each component. */ do { int ypos = 0; if (compptr->h_samp_factor == 1) /* Cb & Cr fast path */ do { register JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*compptr->v_samp_factor+ypos], *outptr = (JSAMPLE *)buf + clumpoffset; /* Cb & Cr have sampling factors = 1, so this is correct */ register int clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width; do *outptr = *inptr++; while ( (outptr += sp->samplesperclump) , --clumps_per_line > 0 ); } while ( (clumpoffset += compptr->h_samp_factor) , ++ypos < compptr->v_samp_factor ); else /* general case */ do { register JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*compptr->v_samp_factor+ypos], *outptr = (JSAMPLE *)buf + clumpoffset; /* Cb & Cr have sampling factors = 1, so this is correct */ register int clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width; do { register int xpos = 0; do outptr[xpos] = *inptr++; while (++xpos < compptr->h_samp_factor); } while ( (outptr += sp->samplesperclump) , --clumps_per_line > 0 ); } while ( (clumpoffset += compptr->h_samp_factor) , ++ypos < compptr->v_samp_factor ); } while (++compptr,++ci < sp->cinfo.d.num_components); }; ++sp->scancount; buf += sp->bytesperline; ++tif->tif_row; } while ((cc -= sp->bytesperline) > 0 && --nrows > 0); return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height || TIFFojpeg_finish_decompress(sp); } /* "OJPEGPreDecode()" temporarily forces the JPEG Library to use the following subroutine as a "dummy" input reader, to fool it into thinking that it has read the image's 1st "Start of Scan" (SOS) marker and initialize accordingly. */ /*ARGSUSED*/ METHODDEF(int) fake_SOS_marker(j_decompress_ptr cinfo){return JPEG_REACHED_SOS;} /*ARGSUSED*/ METHODDEF(int) suspend(j_decompress_ptr cinfo){return JPEG_SUSPENDED;} /*ARGSUSED*/ static int OJPEGPreDecode(register TIFF *tif,tsample_t s) { static const char bad_factors[]={"Improper JPEG sampling factors"}, module[]={"OJPEGPreDecode"}; uint32 segment_width, segment_height; int downsampled_output = FALSE, is_JFIF; /* <=> JFIF image? */ J_COLOR_SPACE in_color_space = JCS_UNKNOWN; /* Image's input color space */ register OJPEGState *sp = OJState(tif); # define td (&tif->tif_dir) tif->tif_predecode = _TIFFNoPreCode; /* Don't call us again */ /* BOGOSITY ALERT! MicroSoft's Wang Imaging for Windows application produces images containing "JPEGInterchangeFormat[Length]" TIFF records that resemble JFIF-in-TIFF encapsulations but, in fact, violate the TIFF Version 6 specification in several ways; nevertheless, we try to handle them gracefully because there are apparently a lot of them around. The purported "JFIF" data stream in one of these files vaguely resembles a JPEG "tables only" data stream, except that there's no trailing EOI marker. The rest of the JPEG data stream lies in a discontiguous file region, identified by the 0th Strip offset (which is *also* illegal!), where it begins with an SOS marker and apparently continues to the end of the file. There is no trailing EOI marker here, either. */ is_JFIF = !sp->is_WANG && TIFFFieldSet(tif,FIELD_JPEGIFOFFSET); /* Set up to decode a strip or tile. Start by resetting decoder state left over from any previous strip/tile, in case our client application didn't read all of that data. Then read the JPEG header data. */ if (!TIFFojpeg_abort(sp)) return 0; /* Do a preliminary translation of the image's (input) color space from its TIFF representation to JPEG Library representation. We might have to fix this up after calling "TIFFojpeg_read_header()", which tries to establish its own JPEG Library defaults. While we're here, initialize some other decompression parameters that won't be overridden. */ if (td->td_planarconfig == PLANARCONFIG_CONTIG) { if (sp->h_sampling != 1 || sp->v_sampling != 1) downsampled_output = TRUE; /* Tentative default */ switch (sp->photometric) /* default color-space translation */ { case PHOTOMETRIC_MINISBLACK: in_color_space = JCS_GRAYSCALE; break; case PHOTOMETRIC_RGB : in_color_space = JCS_RGB; break; case PHOTOMETRIC_SEPARATED : in_color_space = JCS_CMYK; break; case PHOTOMETRIC_YCBCR : in_color_space = JCS_YCbCr; /* JPEG Library converts YCbCr to RGB? */ if ( sp->jpegcolormode == JPEGCOLORMODE_RGB ) downsampled_output = FALSE; } }; segment_width = td->td_imagewidth; segment_height = td->td_imagelength - tif->tif_row; if (isTiled(tif)) { if (sp->is_WANG) /* we don't know how to handle it */ { TIFFError(module,"Tiled Wang image not supported"); return 0; }; /* BOGOSITY ALERT! "TIFFTileRowSize()" seems to work fine for modern JPEG- in-TIFF encapsulations where the image width--like the tile width--is a multiple of 8 or 16 pixels. But image widths and heights are aren't restricted to 8- or 16-bit multiples, and we need the exact Byte count of decompressed scan lines when we call the JPEG Library. At least one old file ("zackthecat.tif") in the TIFF Library test suite has widths and heights slightly less than the tile sizes, and it apparently used the bogus computation below to determine the number of Bytes per scan line (was this due to an old, broken version of "TIFFhowmany()"?). Before we get here, "OJPEGSetupDecode()" verified that our image uses 8-bit samples, so the following check appears to return the correct answer in all known cases tested to date. */ if (is_JFIF || (segment_width & 7) == 0) sp->bytesperline = TIFFTileRowSize(tif); /* Normal case */ else { /* Was the file-encoder's segment-width calculation bogus? */ segment_width = (segment_width/sp->h_sampling + 1) * sp->h_sampling; sp->bytesperline = segment_width * td->td_samplesperpixel; } } else sp->bytesperline = TIFFVStripSize(tif,1); if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) { /* Scale the expected strip/tile size to match a downsampled component. */ segment_width = TIFFhowmany(segment_width,sp->h_sampling); segment_height = TIFFhowmany(segment_height,sp->v_sampling); }; /* BEWARE OF KLUDGE: If we have JPEG Interchange File Format (JFIF) image, then we want to read "metadata" in the bit-stream's header and validate it against corresponding information in TIFF records. But if we have a *really old* JPEG file that's not JFIF, then we simply assign TIFF-record values to JPEG Library variables without checking. */ if (is_JFIF) /* JFIF image */ { unsigned char *end_of_data; register unsigned char *p; /* WARNING: Although the image file contains a JFIF bit stream, it might also contain some old TIFF records causing "OJPEGVSetField()" to have allocated quantization or Huffman decoding tables. But when the JPEG Library reads and parses the JFIF header below, it reallocate these tables anew without checking for "dangling" pointers, thereby causing a memory "leak". We have enough information to potentially deallocate the old tables here, but unfortunately JPEG Library Version 6B uses a "pool" allocator for small objects, with no deallocation procedure; instead, it reclaims a whole pool when an image is closed/destroyed, so well-behaved TIFF client applications (i.e., those which close their JPEG images as soon as they're no longer needed) will waste memory for a short time but recover it eventually. But ill-behaved TIFF clients (i.e., those which keep many JPEG images open gratuitously) can exhaust memory prematurely. If the JPEG Library ever implements a deallocation procedure, insert this clean-up code: */ # ifdef someday if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) /* free quant. tables */ { register int i = 0; do { register JQUANT_TBL *q; if (q = sp->cinfo.d.quant_tbl_ptrs[i]) { jpeg_free_small(&sp->cinfo.comm,q,sizeof *q); sp->cinfo.d.quant_tbl_ptrs[i] = 0; } } while (++i < NUM_QUANT_TBLS); }; if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) /* free Huffman tables */ { register int i = 0; do { register JHUFF_TBL *h; if (h = sp->cinfo.d.dc_huff_tbl_ptrs[i]) { jpeg_free_small(&sp->cinfo.comm,h,sizeof *h); sp->cinfo.d.dc_huff_tbl_ptrs[i] = 0; }; if (h = sp->cinfo.d.ac_huff_tbl_ptrs[i]) { jpeg_free_small(&sp->cinfo.comm,h,sizeof *h); sp->cinfo.d.ac_huff_tbl_ptrs[i] = 0; } } while (++i < NUM_HUFF_TBLS); }; # endif /* someday */ /* Since we might someday wish to try rewriting "old format" JPEG-in-TIFF encapsulations in "new format" files, try to synthesize the value of a modern "JPEGTables" TIFF record by scanning the JPEG data from just past the "Start of Information" (SOI) marker until something other than a legitimate "table" marker is found, as defined in ISO DIS 10918-1 Appending B.2.4; namely: -- Define Quantization Table (DQT) -- Define Huffman Table (DHT) -- Define Arithmetic Coding table (DAC) -- Define Restart Interval (DRI) -- Comment (COM) -- Application data (APPn) For convenience, we also accept "Expansion" (EXP) markers, although they are apparently not a part of normal "table" data. */ sp->jpegtables = p = (unsigned char *)sp->src.next_input_byte; end_of_data = p + sp->src.bytes_in_buffer; p += 2; while (p < end_of_data && p[0] == 0xFF) switch (p[1]) { default : goto L; case 0xC0: /* SOF0 */ case 0xC1: /* SOF1 */ case 0xC2: /* SOF2 */ case 0xC3: /* SOF3 */ case 0xC4: /* DHT */ case 0xC5: /* SOF5 */ case 0xC6: /* SOF6 */ case 0xC7: /* SOF7 */ case 0xC9: /* SOF9 */ case 0xCA: /* SOF10 */ case 0xCB: /* SOF11 */ case 0xCC: /* DAC */ case 0xCD: /* SOF13 */ case 0xCE: /* SOF14 */ case 0xCF: /* SOF15 */ case 0xDB: /* DQT */ case 0xDD: /* DRI */ case 0xDF: /* EXP */ case 0xE0: /* APP0 */ case 0xE1: /* APP1 */ case 0xE2: /* APP2 */ case 0xE3: /* APP3 */ case 0xE4: /* APP4 */ case 0xE5: /* APP5 */ case 0xE6: /* APP6 */ case 0xE7: /* APP7 */ case 0xE8: /* APP8 */ case 0xE9: /* APP9 */ case 0xEA: /* APP10 */ case 0xEB: /* APP11 */ case 0xEC: /* APP12 */ case 0xED: /* APP13 */ case 0xEE: /* APP14 */ case 0xEF: /* APP15 */ case 0xFE: /* COM */ p += (p[2] << 8 | p[3]) + 2; }; L: if (p - (unsigned char *)sp->jpegtables > 2) /* fake "JPEGTables" */ { /* In case our client application asks, pretend that this image file contains a modern "JPEGTables" TIFF record by copying to a buffer the initial part of the JFIF bit-stream that we just scanned, from the SOI marker through the "metadata" tables, then append an EOI marker and flag the "JPEGTables" TIFF record as "present". */ sp->jpegtables_length = p - (unsigned char*)sp->jpegtables + 2; p = sp->jpegtables; if (!(sp->jpegtables = _TIFFmalloc(sp->jpegtables_length))) { TIFFError(module,no_jtable_space); return 0; }; _TIFFmemcpy(sp->jpegtables,p,sp->jpegtables_length-2); p = (unsigned char *)sp->jpegtables + sp->jpegtables_length; p[-2] = 0xFF; p[-1] = JPEG_EOI; /* Append EOI marker */ TIFFSetFieldBit(tif,FIELD_JPEGTABLES); tif->tif_flags |= TIFF_DIRTYDIRECT; } else sp->jpegtables = 0; /* Don't simulate "JPEGTables" */ if (TIFFojpeg_read_header(sp,TRUE) != JPEG_HEADER_OK) return 0; if ( sp->cinfo.d.image_width != segment_width || sp->cinfo.d.image_height != segment_height ) { TIFFError(module,"Improper JPEG strip/tile size"); return 0; }; if ( ( td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1 ) != sp->cinfo.d.num_components ) { TIFFError(module,"Improper JPEG component count"); return 0; }; if (sp->cinfo.d.data_precision != td->td_bitspersample) { TIFFError(module,"Improper JPEG data precision"); return 0; }; if (td->td_planarconfig == PLANARCONFIG_CONTIG) { int ci; /* Component 0 should have expected sampling factors. */ if ( sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling || sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling ) { TIFFError(module,bad_factors); return 0; }; ci = 1; /* The rest should have sampling factors 1,1 */ do if ( sp->cinfo.d.comp_info[ci].h_samp_factor != 1 || sp->cinfo.d.comp_info[ci].v_samp_factor != 1 ) { TIFFError(module,bad_factors); return 0; } while (++ci < sp->cinfo.d.num_components); } else /* PLANARCONFIG_SEPARATE's single component should have sampling factors 1,1. */ if ( sp->cinfo.d.comp_info[0].h_samp_factor != 1 || sp->cinfo.d.comp_info[0].v_samp_factor != 1 ) { TIFFError(module,bad_factors); return 0; } } else /* not JFIF image */ { int (*save)(j_decompress_ptr cinfo) = sp->cinfo.d.marker->read_markers; register int i; /* We're not assuming that this file's JPEG bit stream has any header "metadata", so fool the JPEG Library into thinking that we read a "Start of Input" (SOI) marker and a "Start of Frame" (SOFx) marker, then force it to read a simulated "Start of Scan" (SOS) marker when we call "TIFFojpeg_read_header()" below. This should cause the JPEG Library to establish reasonable defaults. */ sp->cinfo.d.marker->saw_SOI = /* Pretend we saw SOI marker */ sp->cinfo.d.marker->saw_SOF = TRUE; /* Pretend we saw SOF marker */ sp->cinfo.d.marker->read_markers = sp->is_WANG ? suspend : fake_SOS_marker; sp->cinfo.d.global_state = DSTATE_INHEADER; sp->cinfo.d.Se = DCTSIZE2-1; /* Suppress JPEG Library warning */ sp->cinfo.d.image_width = segment_width; sp->cinfo.d.image_height = segment_height; sp->cinfo.d.data_precision = td->td_bitspersample; /* The following color-space initialization, including the complicated "switch"-statement below, essentially duplicates the logic used by the JPEG Library's "jpeg_init_colorspace()" subroutine during compression. */ sp->cinfo.d.num_components = td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1; sp->cinfo.d.comp_info = (jpeg_component_info *) (*sp->cinfo.d.mem->alloc_small) ( &sp->cinfo.comm , JPOOL_IMAGE , sp->cinfo.d.num_components * sizeof *sp->cinfo.d.comp_info ); i = 0; do { sp->cinfo.d.comp_info[i].component_index = i; sp->cinfo.d.comp_info[i].component_needed = TRUE; sp->cinfo.d.cur_comp_info[i] = &sp->cinfo.d.comp_info[i]; } while (++i < sp->cinfo.d.num_components); switch (in_color_space) { case JCS_UNKNOWN : i = 0; do { sp->cinfo.d.comp_info[i].component_id = i; sp->cinfo.d.comp_info[i].h_samp_factor = sp->cinfo.d.comp_info[i].v_samp_factor = 1; } while (++i < sp->cinfo.d.num_components); break; case JCS_GRAYSCALE: sp->cinfo.d.comp_info[0].component_id = sp->cinfo.d.comp_info[0].h_samp_factor = sp->cinfo.d.comp_info[0].v_samp_factor = 1; break; case JCS_RGB : sp->cinfo.d.comp_info[0].component_id = 'R'; sp->cinfo.d.comp_info[1].component_id = 'G'; sp->cinfo.d.comp_info[2].component_id = 'B'; i = 0; do sp->cinfo.d.comp_info[i].h_samp_factor = sp->cinfo.d.comp_info[i].v_samp_factor = 1; while (++i < sp->cinfo.d.num_components); break; case JCS_CMYK : sp->cinfo.d.comp_info[0].component_id = 'C'; sp->cinfo.d.comp_info[1].component_id = 'Y'; sp->cinfo.d.comp_info[2].component_id = 'M'; sp->cinfo.d.comp_info[3].component_id = 'K'; i = 0; do sp->cinfo.d.comp_info[i].h_samp_factor = sp->cinfo.d.comp_info[i].v_samp_factor = 1; while (++i < sp->cinfo.d.num_components); break; case JCS_YCbCr : i = 0; do { sp->cinfo.d.comp_info[i].component_id = i+1; sp->cinfo.d.comp_info[i].h_samp_factor = sp->cinfo.d.comp_info[i].v_samp_factor = 1; sp->cinfo.d.comp_info[i].quant_tbl_no = sp->cinfo.d.comp_info[i].dc_tbl_no = sp->cinfo.d.comp_info[i].ac_tbl_no = i > 0; } while (++i < sp->cinfo.d.num_components); sp->cinfo.d.comp_info[0].h_samp_factor = sp->h_sampling; sp->cinfo.d.comp_info[0].v_samp_factor = sp->v_sampling; }; sp->cinfo.d.comps_in_scan = sp->cinfo.d.num_components; i = TIFFojpeg_read_header(sp,!sp->is_WANG); sp->cinfo.d.marker->read_markers = save; /* Restore input method */ if (sp->is_WANG) /* Microsoft Wang Imaging for Windows file */ { if (i != JPEG_SUSPENDED) return 0; /* BOGOSITY ALERT! Files generated by Microsoft's Wang Imaging application are a special--and, technically illegal--case. A JPEG SOS marker and rest of the data stream should be located at the end of the file, in a position identified by the 0th Strip offset. */ i = td->td_nstrips - 1; sp->src.next_input_byte = tif->tif_base + td->td_stripoffset[0]; sp->src.bytes_in_buffer = td->td_stripoffset[i] - td->td_stripoffset[0] + td->td_stripbytecount[i]; i = TIFFojpeg_read_header(sp,TRUE); }; if (i != JPEG_HEADER_OK) return 0; }; /* The JPEG Library doesn't seem to be as smart as we are about choosing suitable default input- and output color spaces for decompression, so fix things up here. */ sp->cinfo.d.out_color_space = ((sp->cinfo.d.jpeg_color_space = in_color_space) == JCS_YCbCr) ? (sp->jpegcolormode == JPEGCOLORMODE_RGB ? JCS_RGB : JCS_YCbCr) : JCS_UNKNOWN; /* Suppress color-space handling */ tif->tif_decoderow = tif->tif_decodestrip = tif->tif_decodetile = (sp->cinfo.d.raw_data_out = downsampled_output) ? OJPEGDecodeRaw : OJPEGDecode; if (!TIFFojpeg_start_decompress(sp)) return 0; /* Start JPEG decompressor */ if (downsampled_output) /* allocate downsampled-data buffers */ { if (!alloc_downsampled_buffers(tif,sp->cinfo.d.comp_info, sp->cinfo.d.num_components) ) return 0; sp->scancount = DCTSIZE; /* mark buffer empty */ }; return 1; # undef td } static int OJPEGVSetField(register TIFF *tif,ttag_t tag,va_list ap) { uint32 v32; register OJPEGState *sp = OJState(tif); # define td (&tif->tif_dir) switch (tag) { # ifdef COLORIMETRY_SUPPORT /* If a "ReferenceBlackWhite" TIFF tag appears in the file explicitly, undo any modified default definition that we might have installed below, then install the real one. */ case TIFFTAG_REFERENCEBLACKWHITE : if (td->td_refblackwhite) { _TIFFfree(td->td_refblackwhite); td->td_refblackwhite = 0; }; # endif /* COLORIMETRY_SUPPORT */ default : return (*sp->vsetparent)(tif,tag,ap); # ifdef COLORIMETRY_SUPPORT /* BEWARE OF KLUDGE: Some old-format JPEG-in-TIFF files, including those created by Microsoft's Wang Imaging application, illegally omit a "ReferenceBlackWhite" TIFF tag, even though the TIFF specification's default is intended for the RGB color space and is in- appropriate for the YCbCr color space ordinarily used for JPEG images. Since many TIFF client applications request the value of this tag immediately after a TIFF image directory is parsed, and before any other code in this module receives control, we are forced to fix this problem very early in image-file processing. Fortunately, legal TIFF files are supposed to store their tags in numeric order, so a mandatory "PhotometricInterpretation" tag should always appear before an optional "ReferenceBlackWhite" tag. So, we slyly peek ahead when we discover the desired photometry, by installing modified black and white reference levels. */ case TIFFTAG_PHOTOMETRIC : if ( (v32 = (*sp->vsetparent)(tif,tag,ap)) && td->td_photometric == PHOTOMETRIC_YCBCR ) if (td->td_refblackwhite = _TIFFmalloc(6*sizeof(float))) { register long top = 1 << td->td_bitspersample; td->td_refblackwhite[0] = 0; td->td_refblackwhite[1] = td->td_refblackwhite[3] = td->td_refblackwhite[5] = top - 1; td->td_refblackwhite[2] = td->td_refblackwhite[4] = top >> 1; } else { TIFFError(tif->tif_name,"Cannot define default reference black and white levels"); v32 = 0; }; return v32; # endif /* COLORIMETRY_SUPPORT */ /* BEWARE OF KLUDGE: According to Charles Auer , if our input is a multi-image (multi-directory) JPEG-in-TIFF file created by Microsoft's Wang Imaging application, for some reason the first directory excludes the vendor-specific "WANG PageControl" tag (32934) that we check below, so the only other way to identify these directories is apparently to look for a software-identification tag with the substring, "Wang Labs". Single-image files can apparently pass both tests, which causes no harm here, but what a mess this is! */ case TIFFTAG_SOFTWARE : if ( (v32 = (*sp->vsetparent) (tif,tag,ap) ) && strstr( td->td_software , "Wang Labs" ) ) sp->is_WANG = 1; return v32; case TIFFTAG_JPEGPROC : case TIFFTAG_JPEGIFOFFSET : case TIFFTAG_JPEGIFBYTECOUNT : case TIFFTAG_JPEGRESTARTINTERVAL : case TIFFTAG_JPEGLOSSLESSPREDICTORS: case TIFFTAG_JPEGPOINTTRANSFORM : case TIFFTAG_JPEGQTABLES : case TIFFTAG_JPEGDCTABLES : case TIFFTAG_JPEGACTABLES : case TIFFTAG_WANG_PAGECONTROL : case TIFFTAG_JPEGCOLORMODE : ; }; v32 = va_arg(ap,uint32); /* No. of values in this TIFF record */ /* BEWARE: The following actions apply only if we are reading a "source" TIFF image to be decompressed for a client application program. If we ever enhance this file's CODEC to write "destination" JPEG-in-TIFF images, we'll need an "if"- and another "switch"-statement below, because we'll probably want to store these records' values in some different places. Most of these need not be parsed here in order to decode JPEG bit stream, so we set boolean flags to note that they have been seen, but we otherwise ignore them. */ switch (tag) { JHUFF_TBL **h; float *refbw; /* Validate the JPEG-process code. */ case TIFFTAG_JPEGPROC : switch (v32) { default: TIFFError(tif->tif_name,"Unknown JPEG process"); return 0; case 14: TIFFError(JPEGLib_name, "Does not support lossless Huffman coding"); return 0; case 1: ; }; break; /* The TIFF Version 6.0 specification says that if the value of a TIFF "JPEGInterchangeFormat" record is 0, then we are to behave as if this record were absent; i.e., the data does *not* represent a JPEG Inter- change Format File (JFIF), so don't even set the boolean "I've been here" flag below. Otherwise, the field's value represents the file offset of the JPEG SOI marker. */ case TIFFTAG_JPEGIFOFFSET : if (v32) { sp->src.next_input_byte = tif->tif_base + v32; break; }; return 1; case TIFFTAG_JPEGIFBYTECOUNT : sp->src.bytes_in_buffer = v32; break; /* The TIFF Version 6.0 specification says that if the JPEG "Restart" marker interval is 0, then the data has no "Restart" markers; i.e., we must behave as if this TIFF record were absent. So, don't even set the boolean "I've been here" flag below. */ case TIFFTAG_JPEGRESTARTINTERVAL : if (v32) { sp->cinfo.d.restart_interval = v32; break; }; return 1; /* We have a vector of offsets to quantization tables, so load 'em! */ case TIFFTAG_JPEGQTABLES : if (v32) { uint32 *v; int i; if (v32 > NUM_QUANT_TBLS) { TIFFError(tif->tif_name,"Too many quantization tables"); return 0; }; i = 0; v = va_arg(ap,uint32 *); do /* read quantization table */ { register UINT8 *from = tif->tif_base + *v++; register UINT16 *to = (sp->cinfo.d.quant_tbl_ptrs[i] = jpeg_alloc_quant_table(&sp->cinfo.comm) )->quantval; register int j = DCTSIZE2; do *to++ = *from++; while (--j > 0); } while (++i < v32); sp->jpegtablesmode |= JPEGTABLESMODE_QUANT; }; break; /* We have a vector of offsets to DC Huffman tables, so load 'em! */ case TIFFTAG_JPEGDCTABLES : h = sp->cinfo.d.dc_huff_tbl_ptrs; goto L; /* We have a vector of offsets to AC Huffman tables, so load 'em! */ case TIFFTAG_JPEGACTABLES : h = sp->cinfo.d.ac_huff_tbl_ptrs; L: if (v32) { uint32 *v; int i; if (v32 > NUM_HUFF_TBLS) { TIFFError(tif->tif_name,"Too many Huffman tables"); return 0; }; v = va_arg(ap,uint32 *); i = 0; do /* copy each Huffman table */ { int size = 0; register UINT8 *from = tif->tif_base + *v++, *to = (*h++ = jpeg_alloc_huff_table(&sp->cinfo.comm) )->bits; register int j = sizeof (*h)->bits; /* WARNING: This code relies on the fact that an image file not "memory mapped" was read entirely into a single buffer by "TIFFInitOJPEG()", so we can do a fast memory-to- memory copy here. Each table consists of 16 Bytes, which are suffixed to a 0 Byte when copied, followed by a variable number of Bytes whose length is the sum of the first 16. */ *to++ = 0; while (--j > 0) size += *to++ = *from++; /* Copy 16 Bytes */ if (size > sizeof (*h)->huffval/sizeof *(*h)->huffval) { TIFFError(tif->tif_name,"Huffman table too big"); return 0; }; if ((j = size) > 0) do *to++ = *from++; while (--j > 0); while (++size <= sizeof (*h)->huffval/sizeof *(*h)->huffval) *to++ = 0; /* Zero the rest of the table for cleanliness */ } while (++i < v32); sp->jpegtablesmode |= JPEGTABLESMODE_HUFF; }; break; /* The following vendor-specific TIFF tag occurs in (highly illegal) files generated by MicroSoft's Wang Imaging for Windows application. These can apparently have several "pages", in which case this tag specifies the offset of a "page control" structure, which we don't currently know how to handle. 0 indicates a 1-page image with no "page control", which we make a feeble effort to handle. */ case TIFFTAG_WANG_PAGECONTROL : if (v32 == 0) v32 = -1; sp->is_WANG = v32; tag = TIFFTAG_JPEGPROC+FIELD_WANG_PAGECONTROL-FIELD_JPEGPROC; break; /* This pseudo tag indicates whether we think that our caller is supposed to do YCbCr<->RGB color-space conversion (JPEGCOLORMODE_RAW <=> 0) or whether we must ask the JPEG Library to do it (JPEGCOLORMODE_RGB <=> 1). */ case TIFFTAG_JPEGCOLORMODE : sp->jpegcolormode = v32; /* Mark the image to indicate whether returned data is up-sampled, so that "TIFF{Strip,Tile}Size()" reflect the true amount of data present. */ v32 = tif->tif_flags; /* Save flags temporarily */ tif->tif_flags &= ~TIFF_UPSAMPLED; if (td->td_planarconfig == PLANARCONFIG_CONTIG) if ( td->td_photometric == PHOTOMETRIC_YCBCR && sp->jpegcolormode == JPEGCOLORMODE_RGB ) tif->tif_flags |= TIFF_UPSAMPLED; else if ( (td->td_ycbcrsubsampling[1]<<16|td->td_ycbcrsubsampling[0]) != (1 << 16 | 1) ) /* XXX what about up-sampling? */; /* If the up-sampling state changed, re-calculate tile size. */ if ((tif->tif_flags ^ v32) & TIFF_UPSAMPLED) { tif->tif_tilesize = TIFFTileSize(tif); tif->tif_flags |= TIFF_DIRTYDIRECT; }; return 1; }; TIFFSetFieldBit(tif,tag-TIFFTAG_JPEGPROC+FIELD_JPEGPROC); return 1; # undef td } static int OJPEGVGetField(register TIFF *tif,ttag_t tag,va_list ap) { register OJPEGState *sp = OJState(tif); switch (tag) { /* If this file has managed to synthesize a set of consolidated "metadata" tables for the current (post-TIFF Version 6.0 specification) JPEG-in- TIFF encapsulation strategy, then tell our caller about them; otherwise, keep mum. */ case TIFFTAG_JPEGTABLES : if (sp->jpegtables_length) /* we have "new"-style JPEG tables */ { *va_arg(ap,uint32 *) = sp->jpegtables_length; *va_arg(ap,char **) = sp->jpegtables; return 1; }; /* This pseudo tag indicates whether we think that our caller is supposed to do YCbCr<->RGB color-space conversion (JPEGCOLORMODE_RAW <=> 0) or whether we must ask the JPEG Library to do it (JPEGCOLORMODE_RGB <=> 1). */ case TIFFTAG_JPEGCOLORMODE : *va_arg(ap,uint32 *) = sp->jpegcolormode; return 1; /* The following tags are defined by the TIFF Version 6.0 specification and are obsolete. If our caller asks for information about them, do not return anything, even if we parsed them in an old-format "source" image. */ case TIFFTAG_JPEGPROC : case TIFFTAG_JPEGIFOFFSET : case TIFFTAG_JPEGIFBYTECOUNT : case TIFFTAG_JPEGRESTARTINTERVAL : case TIFFTAG_JPEGLOSSLESSPREDICTORS: case TIFFTAG_JPEGPOINTTRANSFORM : case TIFFTAG_JPEGQTABLES : case TIFFTAG_JPEGDCTABLES : case TIFFTAG_JPEGACTABLES : return 0; }; return (*sp->vgetparent)(tif,tag,ap); } /*ARGSUSED*/ static void OJPEGPrintDir(register TIFF *tif,FILE *fd,long flags) { register OJPEGState *sp = OJState(tif); if (sp->jpegtables_length) fprintf(fd," JPEG Table Data: , %lu bytes\n", sp->jpegtables_length); } static uint32 OJPEGDefaultStripSize(register TIFF *tif,register uint32 s) { register OJPEGState *sp = OJState(tif); # define td (&tif->tif_dir) if ((s = (*sp->defsparent)(tif,s)) < td->td_imagelength) s = TIFFroundup(s,td->td_ycbcrsubsampling[1]*DCTSIZE); return s; # undef td } static void OJPEGDefaultTileSize(register TIFF *tif,register uint32 *tw,register uint32 *th) { register OJPEGState *sp = OJState(tif); # define td (&tif->tif_dir) (*sp->deftparent)(tif,tw,th); *tw = TIFFroundup(*tw,td->td_ycbcrsubsampling[0]*DCTSIZE); *th = TIFFroundup(*th,td->td_ycbcrsubsampling[1]*DCTSIZE); # undef td } static void OJPEGCleanUp(register TIFF *tif) { register OJPEGState *sp; if (sp = OJState(tif)) { TIFFojpeg_destroy(sp); /* Release JPEG Library variables */ if (sp->jpegtables) _TIFFfree(sp->jpegtables); /* If the image file isn't "memory mapped" and we read it all into a single, large memory buffer, free the buffer now. */ if (!isMapped(tif) && tif->tif_base) /* free whole-file buffer */ { _TIFFfree(tif->tif_base); tif->tif_base = 0; tif->tif_size = 0; }; _TIFFfree(sp); /* Release local variables */ tif->tif_data = 0; } } int TIFFInitOJPEG(register TIFF *tif,int scheme) { register OJPEGState *sp; # define td (&tif->tif_dir) # ifndef never /* This module supports a decompression-only CODEC, which is intended strictly for viewing old image files using the obsolete JPEG-in-TIFF encapsulation specified by the TIFF Version 6.0 specification. It does not, and never should, support compression for new images. If a client application asks us to, refuse and complain loudly! */ if (tif->tif_mode != O_RDONLY) return _notSupported(tif); # endif /* never */ if (!isMapped(tif)) { /* BEWARE OF KLUDGE: If our host operating-system doesn't let an image file be "memory mapped", then we want to read the entire file into a single (possibly large) memory buffer as if it had been "memory mapped". Although this is likely to waste space, because analysis of the file's content might cause parts of it to be read into smaller buffers duplicatively, it appears to be the lesser of several evils. Very old JPEG-in-TIFF encapsulations aren't guaranteed to be JFIF bit streams, or to have a TIFF "JPEGTables" record or much other "metadata" to help us locate the decoding tables and entropy-coded data, so we're likely do a lot of random-access grokking around, and we must ultimately tell the JPEG Library to sequentially scan much of the file anyway. This is all likely to be easier if we use "brute force" to read the entire file, once, and don't use incremental disc I/O. If our client application tries to process a file so big that we can't buffer it entirely, then tough shit: we'll give up and exit! */ if (!(tif->tif_base = _TIFFmalloc(tif->tif_size=TIFFGetFileSize(tif)))) { TIFFError(tif->tif_name,"Cannot allocate file buffer"); return 0; }; if (!SeekOK(tif,0) || !ReadOK(tif,tif->tif_base,tif->tif_size)) { TIFFError(tif->tif_name,"Cannot read file"); return 0; } }; /* Allocate storage for this module's per-file variables. */ if (!(tif->tif_data = (tidata_t)_TIFFmalloc(sizeof *sp))) { TIFFError("TIFFInitOJPEG","No space for JPEG state block"); return 0; }; (sp = OJState(tif))->tif = tif; /* Initialize reverse pointer */ if (!TIFFojpeg_create_decompress(sp)) return 0; /* Init. JPEG Library */ /* If the image file doesn't have "JPEGInterchangeFormat[Length]" TIFF records to guide us, we have few clues about where its encapsulated JPEG bit stream is located, so establish intelligent defaults: If the Image File Directory doesn't immediately follow the TIFF header, assume that the JPEG data lies in between; otherwise, assume that it follows the Image File Directory. */ sp->src.next_input_byte = tif->tif_base + tif->tif_diroff; /* Default */ if (tif->tif_header.tiff_diroff > sizeof tif->tif_header) { sp->src.bytes_in_buffer = tif->tif_header.tiff_diroff - sizeof tif->tif_header; sp->src.next_input_byte = sp->src.next_input_byte - sp->src.bytes_in_buffer; } else /* this case is ugly! */ { uint16 dircount; dircount = *(uint16 *)sp->src.next_input_byte; if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount); sp->src.next_input_byte += dircount * sizeof(TIFFDirEntry) + sizeof dircount; sp->src.bytes_in_buffer = tif->tif_base + tif->tif_nextdiroff - sp->src.next_input_byte; }; /* Install CODEC-specific tag information and override default TIFF Library "method" subroutines with our own, CODEC-specific methods. Like all good members of an object-class, we save some of these subroutine pointers for "fall back" in case our own methods fail. */ _TIFFMergeFieldInfo(tif,ojpegFieldInfo, sizeof ojpegFieldInfo/sizeof *ojpegFieldInfo); sp->defsparent = tif->tif_defstripsize; sp->deftparent = tif->tif_deftilesize; sp->vgetparent = tif->tif_vgetfield; sp->vsetparent = tif->tif_vsetfield; tif->tif_defstripsize = OJPEGDefaultStripSize; tif->tif_deftilesize = OJPEGDefaultTileSize; tif->tif_vgetfield = OJPEGVGetField; tif->tif_vsetfield = OJPEGVSetField; tif->tif_printdir = OJPEGPrintDir; # ifdef never tif->tif_setupencode = OJPEGSetupEncode; tif->tif_preencode = OJPEGPreEncode; tif->tif_postencode = OJPEGPostEncode; # else /* well, hardly ever */ tif->tif_setupencode = tif->tif_postencode = _notSupported; tif->tif_preencode = (TIFFPreMethod)_notSupported; # endif /* never */ tif->tif_setupdecode = OJPEGSetupDecode; tif->tif_predecode = OJPEGPreDecode; tif->tif_cleanup = OJPEGCleanUp; /* Initialize other CODEC-specific variables requiring default values. */ tif->tif_flags |= TIFF_NOBITREV; /* No bit-reversal within data bytes */ sp->is_WANG = 0; /* Assume not a Microsoft Wang Imaging file by default */ sp->jpegtables = 0; /* No "new"-style JPEG tables synthesized yet */ sp->jpegtables_length = 0; sp->jpegquality = 75; /* Default IJG quality */ sp->jpegcolormode = JPEGCOLORMODE_RAW; sp->jpegtablesmode = 0; /* No tables found yet */ return 1; # undef td } #endif /* OJPEG_SUPPORT */ gamera-3.3.3/src/libtiff/tif_open.c0000644000076500000000000003176110714675674016150 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" void _TIFFSetDefaultCompressionState(TIFF* tif); static const long typemask[13] = { 0L, /* TIFF_NOTYPE */ 0x000000ffL, /* TIFF_BYTE */ 0xffffffffL, /* TIFF_ASCII */ 0x0000ffffL, /* TIFF_SHORT */ 0xffffffffL, /* TIFF_LONG */ 0xffffffffL, /* TIFF_RATIONAL */ 0x000000ffL, /* TIFF_SBYTE */ 0x000000ffL, /* TIFF_UNDEFINED */ 0x0000ffffL, /* TIFF_SSHORT */ 0xffffffffL, /* TIFF_SLONG */ 0xffffffffL, /* TIFF_SRATIONAL */ 0xffffffffL, /* TIFF_FLOAT */ 0xffffffffL, /* TIFF_DOUBLE */ }; static const int bigTypeshift[13] = { 0, /* TIFF_NOTYPE */ 24, /* TIFF_BYTE */ 0, /* TIFF_ASCII */ 16, /* TIFF_SHORT */ 0, /* TIFF_LONG */ 0, /* TIFF_RATIONAL */ 24, /* TIFF_SBYTE */ 24, /* TIFF_UNDEFINED */ 16, /* TIFF_SSHORT */ 0, /* TIFF_SLONG */ 0, /* TIFF_SRATIONAL */ 0, /* TIFF_FLOAT */ 0, /* TIFF_DOUBLE */ }; static const int litTypeshift[13] = { 0, /* TIFF_NOTYPE */ 0, /* TIFF_BYTE */ 0, /* TIFF_ASCII */ 0, /* TIFF_SHORT */ 0, /* TIFF_LONG */ 0, /* TIFF_RATIONAL */ 0, /* TIFF_SBYTE */ 0, /* TIFF_UNDEFINED */ 0, /* TIFF_SSHORT */ 0, /* TIFF_SLONG */ 0, /* TIFF_SRATIONAL */ 0, /* TIFF_FLOAT */ 0, /* TIFF_DOUBLE */ }; /* * Initialize the shift & mask tables, and the * byte swapping state according to the file * contents and the machine architecture. */ static void TIFFInitOrder(TIFF* tif, int magic, int bigendian) { tif->tif_typemask = typemask; if (magic == TIFF_BIGENDIAN) { tif->tif_typeshift = bigTypeshift; if (!bigendian) tif->tif_flags |= TIFF_SWAB; } else { tif->tif_typeshift = litTypeshift; if (bigendian) tif->tif_flags |= TIFF_SWAB; } } int _TIFFgetMode(const char* mode, const char* module) { int m = -1; switch (mode[0]) { case 'r': m = O_RDONLY; if (mode[1] == '+') m = O_RDWR; break; case 'w': case 'a': m = O_RDWR|O_CREAT; if (mode[0] == 'w') m |= O_TRUNC; break; default: TIFFError(module, "\"%s\": Bad mode", mode); break; } return (m); } TIFF* TIFFClientOpen( const char* name, const char* mode, thandle_t clientdata, TIFFReadWriteProc readproc, TIFFReadWriteProc writeproc, TIFFSeekProc seekproc, TIFFCloseProc closeproc, TIFFSizeProc sizeproc, TIFFMapFileProc mapproc, TIFFUnmapFileProc unmapproc ) { static const char module[] = "TIFFClientOpen"; TIFF *tif; int m, bigendian; const char* cp; m = _TIFFgetMode(mode, module); if (m == -1) goto bad2; tif = (TIFF *)_TIFFmalloc(sizeof (TIFF) + strlen(name) + 1); if (tif == NULL) { TIFFError(module, "%s: Out of memory (TIFF structure)", name); goto bad2; } _TIFFmemset(tif, 0, sizeof (*tif)); tif->tif_name = (char *)tif + sizeof (TIFF); strcpy(tif->tif_name, name); tif->tif_mode = m &~ (O_CREAT|O_TRUNC); tif->tif_curdir = (tdir_t) -1; /* non-existent directory */ tif->tif_curoff = 0; tif->tif_curstrip = (tstrip_t) -1; /* invalid strip */ tif->tif_row = (uint32) -1; /* read/write pre-increment */ tif->tif_clientdata = clientdata; tif->tif_readproc = readproc; tif->tif_writeproc = writeproc; tif->tif_seekproc = seekproc; tif->tif_closeproc = closeproc; tif->tif_sizeproc = sizeproc; tif->tif_mapproc = mapproc; tif->tif_unmapproc = unmapproc; _TIFFSetDefaultCompressionState(tif); /* setup default state */ /* * Default is to return data MSB2LSB and enable the * use of memory-mapped files and strip chopping when * a file is opened read-only. */ tif->tif_flags = FILLORDER_MSB2LSB; if (m == O_RDONLY ) tif->tif_flags |= TIFF_MAPPED; #ifdef STRIPCHOP_DEFAULT if (m == O_RDONLY || m == O_RDWR) tif->tif_flags |= STRIPCHOP_DEFAULT; #endif { union { int32 i; char c[4]; } u; u.i = 1; bigendian = u.c[0] == 0; } /* * Process library-specific flags in the open mode string. * The following flags may be used to control intrinsic library * behaviour that may or may not be desirable (usually for * compatibility with some application that claims to support * TIFF but only supports some braindead idea of what the * vendor thinks TIFF is): * * 'l' use little-endian byte order for creating a file * 'b' use big-endian byte order for creating a file * 'L' read/write information using LSB2MSB bit order * 'B' read/write information using MSB2LSB bit order * 'H' read/write information using host bit order * 'M' enable use of memory-mapped files when supported * 'm' disable use of memory-mapped files * 'C' enable strip chopping support when reading * 'c' disable strip chopping support * * The use of the 'l' and 'b' flags is strongly discouraged. * These flags are provided solely because numerous vendors, * typically on the PC, do not correctly support TIFF; they * only support the Intel little-endian byte order. This * support is not configured by default because it supports * the violation of the TIFF spec that says that readers *MUST* * support both byte orders. It is strongly recommended that * you not use this feature except to deal with busted apps * that write invalid TIFF. And even in those cases you should * bang on the vendors to fix their software. * * The 'L', 'B', and 'H' flags are intended for applications * that can optimize operations on data by using a particular * bit order. By default the library returns data in MSB2LSB * bit order for compatibiltiy with older versions of this * library. Returning data in the bit order of the native cpu * makes the most sense but also requires applications to check * the value of the FillOrder tag; something they probabyl do * not do right now. * * The 'M' and 'm' flags are provided because some virtual memory * systems exhibit poor behaviour when large images are mapped. * These options permit clients to control the use of memory-mapped * files on a per-file basis. * * The 'C' and 'c' flags are provided because the library support * for chopping up large strips into multiple smaller strips is not * application-transparent and as such can cause problems. The 'c' * option permits applications that only want to look at the tags, * for example, to get the unadulterated TIFF tag information. */ for (cp = mode; *cp; cp++) switch (*cp) { case 'b': if ((m&O_CREAT) && !bigendian) tif->tif_flags |= TIFF_SWAB; break; case 'l': if ((m&O_CREAT) && bigendian) tif->tif_flags |= TIFF_SWAB; break; case 'B': tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | FILLORDER_MSB2LSB; break; case 'L': tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | FILLORDER_LSB2MSB; break; case 'H': tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) | HOST_FILLORDER; break; case 'M': if (m == O_RDONLY) tif->tif_flags |= TIFF_MAPPED; break; case 'm': if (m == O_RDONLY) tif->tif_flags &= ~TIFF_MAPPED; break; case 'C': if (m == O_RDONLY) tif->tif_flags |= TIFF_STRIPCHOP; break; case 'c': if (m == O_RDONLY) tif->tif_flags &= ~TIFF_STRIPCHOP; break; } /* * Read in TIFF header. */ if (!ReadOK(tif, &tif->tif_header, sizeof (TIFFHeader))) { if (tif->tif_mode == O_RDONLY) { TIFFError(name, "Cannot read TIFF header"); goto bad; } /* * Setup header and write. */ tif->tif_header.tiff_magic = tif->tif_flags & TIFF_SWAB ? (bigendian ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN) : (bigendian ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN); tif->tif_header.tiff_version = TIFF_VERSION; if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&tif->tif_header.tiff_version); tif->tif_header.tiff_diroff = 0; /* filled in later */ /* * This seek shouldn't be necessary, but I have had some * crazy problems with a failed fseek() on Solaris leaving * the current file pointer out of whack when an fwrite() * is done. */ TIFFSeekFile( tif, 0, SEEK_SET ); if (!WriteOK(tif, &tif->tif_header, sizeof (TIFFHeader))) { TIFFError(name, "Error writing TIFF header"); goto bad; } /* * Setup the byte order handling. */ TIFFInitOrder(tif, tif->tif_header.tiff_magic, bigendian); /* * Setup default directory. */ if (!TIFFDefaultDirectory(tif)) goto bad; tif->tif_diroff = 0; return (tif); } /* * Setup the byte order handling. */ if (tif->tif_header.tiff_magic != TIFF_BIGENDIAN && tif->tif_header.tiff_magic != TIFF_LITTLEENDIAN) { TIFFError(name, "Not a TIFF file, bad magic number %d (0x%x)", tif->tif_header.tiff_magic, tif->tif_header.tiff_magic); goto bad; } TIFFInitOrder(tif, tif->tif_header.tiff_magic, bigendian); /* * Swap header if required. */ if (tif->tif_flags & TIFF_SWAB) { TIFFSwabShort(&tif->tif_header.tiff_version); TIFFSwabLong(&tif->tif_header.tiff_diroff); } /* * Now check version (if needed, it's been byte-swapped). * Note that this isn't actually a version number, it's a * magic number that doesn't change (stupid). */ if (tif->tif_header.tiff_version != TIFF_VERSION) { TIFFError(name, "Not a TIFF file, bad version number %d (0x%x)", tif->tif_header.tiff_version, tif->tif_header.tiff_version); goto bad; } tif->tif_flags |= TIFF_MYBUFFER; tif->tif_rawcp = tif->tif_rawdata = 0; tif->tif_rawdatasize = 0; /* * Setup initial directory. */ switch (mode[0]) { case 'r': tif->tif_nextdiroff = tif->tif_header.tiff_diroff; /* * Try to use a memory-mapped file if the client * has not explicitly suppressed usage with the * 'm' flag in the open mode (see above). */ if ((tif->tif_flags & TIFF_MAPPED) && !TIFFMapFileContents(tif, (tdata_t*) &tif->tif_base, &tif->tif_size)) tif->tif_flags &= ~TIFF_MAPPED; if (TIFFReadDirectory(tif)) { if( m != O_RDONLY && tif->tif_dir.td_compression != COMPRESSION_NONE ) { TIFFError( name, "Can't open a compressed TIFF file" " with compression for update." ); goto bad; } tif->tif_rawcc = -1; tif->tif_flags |= TIFF_BUFFERSETUP; return (tif); } break; case 'a': /* * New directories are automatically append * to the end of the directory chain when they * are written out (see TIFFWriteDirectory). */ if (!TIFFDefaultDirectory(tif)) goto bad; return (tif); } bad: tif->tif_mode = O_RDONLY; /* XXX avoid flush */ TIFFClose(tif); return ((TIFF*)0); bad2: (void) (*closeproc)(clientdata); return ((TIFF*)0); } /* * Query functions to access private data. */ /* * Return open file's name. */ const char * TIFFFileName(TIFF* tif) { return (tif->tif_name); } /* * Return open file's I/O descriptor. */ int TIFFFileno(TIFF* tif) { return (tif->tif_fd); } /* * Return read/write mode. */ int TIFFGetMode(TIFF* tif) { return (tif->tif_mode); } /* * Return nonzero if file is organized in * tiles; zero if organized as strips. */ int TIFFIsTiled(TIFF* tif) { return (isTiled(tif)); } /* * Return current row being read/written. */ uint32 TIFFCurrentRow(TIFF* tif) { return (tif->tif_row); } /* * Return index of the current directory. */ tdir_t TIFFCurrentDirectory(TIFF* tif) { return (tif->tif_curdir); } /* * Return current strip. */ tstrip_t TIFFCurrentStrip(TIFF* tif) { return (tif->tif_curstrip); } /* * Return current tile. */ ttile_t TIFFCurrentTile(TIFF* tif) { return (tif->tif_curtile); } /* * Return nonzero if the file has byte-swapped data. */ int TIFFIsByteSwapped(TIFF* tif) { return ((tif->tif_flags & TIFF_SWAB) != 0); } /* * Return nonzero if the data is returned up-sampled. */ int TIFFIsUpSampled(TIFF* tif) { return (isUpSampled(tif)); } /* * Return nonzero if the data is returned in MSB-to-LSB bit order. */ int TIFFIsMSB2LSB(TIFF* tif) { return (isFillOrder(tif, FILLORDER_MSB2LSB)); } gamera-3.3.3/src/libtiff/tif_packbits.c0000644000076500000000000001662110714675674017005 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef PACKBITS_SUPPORT /* * TIFF Library. * * PackBits Compression Algorithm Support */ #include #include static int PackBitsPreEncode(TIFF* tif, tsample_t s) { (void) s; /* * Calculate the scanline/tile-width size in bytes. */ if (isTiled(tif)) tif->tif_data = (tidata_t) TIFFTileRowSize(tif); else tif->tif_data = (tidata_t) TIFFScanlineSize(tif); return (1); } /* * NB: tidata is the type representing *(tidata_t); * if tidata_t is made signed then this type must * be adjusted accordingly. */ typedef unsigned char tidata; /* * Encode a run of pixels. */ static int PackBitsEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) { u_char* bp = (u_char*) buf; tidata_t op, ep, lastliteral; long n, slop; int b; enum { BASE, LITERAL, RUN, LITERAL_RUN } state; (void) s; op = tif->tif_rawcp; ep = tif->tif_rawdata + tif->tif_rawdatasize; state = BASE; lastliteral = 0; while (cc > 0) { /* * Find the longest string of identical bytes. */ b = *bp++, cc--, n = 1; for (; cc > 0 && b == *bp; cc--, bp++) n++; again: if (op + 2 >= ep) { /* insure space for new data */ /* * Be careful about writing the last * literal. Must write up to that point * and then copy the remainder to the * front of the buffer. */ if (state == LITERAL || state == LITERAL_RUN) { slop = op - lastliteral; tif->tif_rawcc += lastliteral - tif->tif_rawcp; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; while (slop-- > 0) *op++ = *lastliteral++; lastliteral = tif->tif_rawcp; } else { tif->tif_rawcc += op - tif->tif_rawcp; if (!TIFFFlushData1(tif)) return (-1); op = tif->tif_rawcp; } } switch (state) { case BASE: /* initial state, set run/literal */ if (n > 1) { state = RUN; if (n > 128) { *op++ = (tidata) -127; *op++ = b; n -= 128; goto again; } *op++ = (tidataval_t)(-(n-1)); *op++ = b; } else { lastliteral = op; *op++ = 0; *op++ = b; state = LITERAL; } break; case LITERAL: /* last object was literal string */ if (n > 1) { state = LITERAL_RUN; if (n > 128) { *op++ = (tidata) -127; *op++ = b; n -= 128; goto again; } *op++ = (tidataval_t)(-(n-1)); /* encode run */ *op++ = b; } else { /* extend literal */ if (++(*lastliteral) == 127) state = BASE; *op++ = b; } break; case RUN: /* last object was run */ if (n > 1) { if (n > 128) { *op++ = (tidata) -127; *op++ = b; n -= 128; goto again; } *op++ = (tidataval_t)(-(n-1)); *op++ = b; } else { lastliteral = op; *op++ = 0; *op++ = b; state = LITERAL; } break; case LITERAL_RUN: /* literal followed by a run */ /* * Check to see if previous run should * be converted to a literal, in which * case we convert literal-run-literal * to a single literal. */ if (n == 1 && op[-2] == (tidata) -1 && *lastliteral < 126) { state = (((*lastliteral) += 2) == 127 ? BASE : LITERAL); op[-2] = op[-1]; /* replicate */ } else state = RUN; goto again; } } tif->tif_rawcc += op - tif->tif_rawcp; tif->tif_rawcp = op; return (1); } /* * Encode a rectangular chunk of pixels. We break it up * into row-sized pieces to insure that encoded runs do * not span rows. Otherwise, there can be problems with * the decoder if data is read, for example, by scanlines * when it was encoded by strips. */ static int PackBitsEncodeChunk(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { tsize_t rowsize = (tsize_t) tif->tif_data; assert(rowsize > 0); #ifdef YCBCR_SUPPORT /* * YCBCR data isn't really separable into rows, so we * might as well encode the whole tile/strip as one chunk. */ if( tif->tif_dir.td_photometric == PHOTOMETRIC_YCBCR ) rowsize = (tsize_t) tif->tif_data; #endif while ((long)cc > 0) { int chunk = rowsize; if( cc < chunk ) chunk = cc; if (PackBitsEncode(tif, bp, chunk, s) < 0) return (-1); bp += chunk; cc -= chunk; } return (1); } static int PackBitsDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) { char *bp; tsize_t cc; long n; int b; (void) s; bp = (char*) tif->tif_rawcp; cc = tif->tif_rawcc; while (cc > 0 && (long)occ > 0) { n = (long) *bp++, cc--; /* * Watch out for compilers that * don't sign extend chars... */ if (n >= 128) n -= 256; if (n < 0) { /* replicate next byte -n+1 times */ if (n == -128) /* nop */ continue; n = -n + 1; if( occ < n ) { TIFFWarning(tif->tif_name, "PackBitsDecode: discarding %d bytes " "to avoid buffer overrun", n - occ); n = occ; } occ -= n; b = *bp++, cc--; while (n-- > 0) *op++ = b; } else { /* copy next n+1 bytes literally */ if (occ < n + 1) { TIFFWarning(tif->tif_name, "PackBitsDecode: discarding %d bytes " "to avoid buffer overrun", n - occ + 1); n = occ - 1; } _TIFFmemcpy(op, bp, ++n); op += n; occ -= n; bp += n; cc -= n; } } tif->tif_rawcp = (tidata_t) bp; tif->tif_rawcc = cc; if (occ > 0) { TIFFError(tif->tif_name, "PackBitsDecode: Not enough data for scanline %ld", (long) tif->tif_row); return (0); } return (1); } int TIFFInitPackBits(TIFF* tif, int scheme) { (void) scheme; tif->tif_decoderow = PackBitsDecode; tif->tif_decodestrip = PackBitsDecode; tif->tif_decodetile = PackBitsDecode; tif->tif_preencode = PackBitsPreEncode; tif->tif_encoderow = PackBitsEncode; tif->tif_encodestrip = PackBitsEncodeChunk; tif->tif_encodetile = PackBitsEncodeChunk; return (1); } #endif /* PACKBITS_SUPPORT */ gamera-3.3.3/src/libtiff/tif_pixarlog.c0000644000076500000000000010622010714675674017025 0ustar chriswheel/* * Copyright (c) 1996-1997 Sam Leffler * Copyright (c) 1996 Pixar * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Pixar, Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Pixar, Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL PIXAR, SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef PIXARLOG_SUPPORT /* * TIFF Library. * PixarLog Compression Support * * Contributed by Dan McCoy. * * PixarLog film support uses the TIFF library to store companded * 11 bit values into a tiff file, which are compressed using the * zip compressor. * * The codec can take as input and produce as output 32-bit IEEE float values * as well as 16-bit or 8-bit unsigned integer values. * * On writing any of the above are converted into the internal * 11-bit log format. In the case of 8 and 16 bit values, the * input is assumed to be unsigned linear color values that represent * the range 0-1. In the case of IEEE values, the 0-1 range is assumed to * be the normal linear color range, in addition over 1 values are * accepted up to a value of about 25.0 to encode "hot" hightlights and such. * The encoding is lossless for 8-bit values, slightly lossy for the * other bit depths. The actual color precision should be better * than the human eye can perceive with extra room to allow for * error introduced by further image computation. As with any quantized * color format, it is possible to perform image calculations which * expose the quantization error. This format should certainly be less * susceptable to such errors than standard 8-bit encodings, but more * susceptable than straight 16-bit or 32-bit encodings. * * On reading the internal format is converted to the desired output format. * The program can request which format it desires by setting the internal * pseudo tag TIFFTAG_PIXARLOGDATAFMT to one of these possible values: * PIXARLOGDATAFMT_FLOAT = provide IEEE float values. * PIXARLOGDATAFMT_16BIT = provide unsigned 16-bit integer values * PIXARLOGDATAFMT_8BIT = provide unsigned 8-bit integer values * * alternately PIXARLOGDATAFMT_8BITABGR provides unsigned 8-bit integer * values with the difference that if there are exactly three or four channels * (rgb or rgba) it swaps the channel order (bgr or abgr). * * PIXARLOGDATAFMT_11BITLOG provides the internal encoding directly * packed in 16-bit values. However no tools are supplied for interpreting * these values. * * "hot" (over 1.0) areas written in floating point get clamped to * 1.0 in the integer data types. * * When the file is closed after writing, the bit depth and sample format * are set always to appear as if 8-bit data has been written into it. * That way a naive program unaware of the particulars of the encoding * gets the format it is most likely able to handle. * * The codec does it's own horizontal differencing step on the coded * values so the libraries predictor stuff should be turned off. * The codec also handle byte swapping the encoded values as necessary * since the library does not have the information necessary * to know the bit depth of the raw unencoded buffer. * */ #include "tif_predict.h" #include "zlib.h" #include "zutil.h" #include #include #include #include /* Tables for converting to/from 11 bit coded values */ #define TSIZE 2048 /* decode table size (11-bit tokens) */ #define TSIZEP1 2049 /* Plus one for slop */ #define ONE 1250 /* token value of 1.0 exactly */ #define RATIO 1.004 /* nominal ratio for log part */ #define CODE_MASK 0x7ff /* 11 bits. */ static float Fltsize; static float LogK1, LogK2; #define REPEAT(n, op) { int i; i=n; do { i--; op; } while (i>0); } static void horizontalAccumulateF(uint16 *wp, int n, int stride, float *op, float *ToLinearF) { register unsigned int cr, cg, cb, ca, mask; register float t0, t1, t2, t3; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { t0 = ToLinearF[cr = wp[0]]; t1 = ToLinearF[cg = wp[1]]; t2 = ToLinearF[cb = wp[2]]; op[0] = t0; op[1] = t1; op[2] = t2; n -= 3; while (n > 0) { wp += 3; op += 3; n -= 3; t0 = ToLinearF[(cr += wp[0]) & mask]; t1 = ToLinearF[(cg += wp[1]) & mask]; t2 = ToLinearF[(cb += wp[2]) & mask]; op[0] = t0; op[1] = t1; op[2] = t2; } } else if (stride == 4) { t0 = ToLinearF[cr = wp[0]]; t1 = ToLinearF[cg = wp[1]]; t2 = ToLinearF[cb = wp[2]]; t3 = ToLinearF[ca = wp[3]]; op[0] = t0; op[1] = t1; op[2] = t2; op[3] = t3; n -= 4; while (n > 0) { wp += 4; op += 4; n -= 4; t0 = ToLinearF[(cr += wp[0]) & mask]; t1 = ToLinearF[(cg += wp[1]) & mask]; t2 = ToLinearF[(cb += wp[2]) & mask]; t3 = ToLinearF[(ca += wp[3]) & mask]; op[0] = t0; op[1] = t1; op[2] = t2; op[3] = t3; } } else { REPEAT(stride, *op = ToLinearF[*wp&mask]; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = ToLinearF[*wp&mask]; wp++; op++) n -= stride; } } } } static void horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op, float *ToLinearF) { register unsigned int cr, cg, cb, ca, mask; register float t0, t1, t2, t3; #define SCALE12 2048.0 #define CLAMP12(t) (((t) < 3071) ? (uint16) (t) : 3071) if (n >= stride) { mask = CODE_MASK; if (stride == 3) { t0 = ToLinearF[cr = wp[0]] * SCALE12; t1 = ToLinearF[cg = wp[1]] * SCALE12; t2 = ToLinearF[cb = wp[2]] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); n -= 3; while (n > 0) { wp += 3; op += 3; n -= 3; t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12; t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12; t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); } } else if (stride == 4) { t0 = ToLinearF[cr = wp[0]] * SCALE12; t1 = ToLinearF[cg = wp[1]] * SCALE12; t2 = ToLinearF[cb = wp[2]] * SCALE12; t3 = ToLinearF[ca = wp[3]] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); op[3] = CLAMP12(t3); n -= 4; while (n > 0) { wp += 4; op += 4; n -= 4; t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12; t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12; t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12; t3 = ToLinearF[(ca += wp[3]) & mask] * SCALE12; op[0] = CLAMP12(t0); op[1] = CLAMP12(t1); op[2] = CLAMP12(t2); op[3] = CLAMP12(t3); } } else { REPEAT(stride, t0 = ToLinearF[*wp&mask] * SCALE12; *op = CLAMP12(t0); wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; t0 = ToLinearF[wp[stride]&mask]*SCALE12; *op = CLAMP12(t0); wp++; op++) n -= stride; } } } } static void horizontalAccumulate16(uint16 *wp, int n, int stride, uint16 *op, uint16 *ToLinear16) { register unsigned int cr, cg, cb, ca, mask; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { op[0] = ToLinear16[cr = wp[0]]; op[1] = ToLinear16[cg = wp[1]]; op[2] = ToLinear16[cb = wp[2]]; n -= 3; while (n > 0) { wp += 3; op += 3; n -= 3; op[0] = ToLinear16[(cr += wp[0]) & mask]; op[1] = ToLinear16[(cg += wp[1]) & mask]; op[2] = ToLinear16[(cb += wp[2]) & mask]; } } else if (stride == 4) { op[0] = ToLinear16[cr = wp[0]]; op[1] = ToLinear16[cg = wp[1]]; op[2] = ToLinear16[cb = wp[2]]; op[3] = ToLinear16[ca = wp[3]]; n -= 4; while (n > 0) { wp += 4; op += 4; n -= 4; op[0] = ToLinear16[(cr += wp[0]) & mask]; op[1] = ToLinear16[(cg += wp[1]) & mask]; op[2] = ToLinear16[(cb += wp[2]) & mask]; op[3] = ToLinear16[(ca += wp[3]) & mask]; } } else { REPEAT(stride, *op = ToLinear16[*wp&mask]; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = ToLinear16[*wp&mask]; wp++; op++) n -= stride; } } } } /* * Returns the log encoded 11-bit values with the horizontal * differencing undone. */ static void horizontalAccumulate11(uint16 *wp, int n, int stride, uint16 *op) { register unsigned int cr, cg, cb, ca, mask; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { op[0] = cr = wp[0]; op[1] = cg = wp[1]; op[2] = cb = wp[2]; n -= 3; while (n > 0) { wp += 3; op += 3; n -= 3; op[0] = (cr += wp[0]) & mask; op[1] = (cg += wp[1]) & mask; op[2] = (cb += wp[2]) & mask; } } else if (stride == 4) { op[0] = cr = wp[0]; op[1] = cg = wp[1]; op[2] = cb = wp[2]; op[3] = ca = wp[3]; n -= 4; while (n > 0) { wp += 4; op += 4; n -= 4; op[0] = (cr += wp[0]) & mask; op[1] = (cg += wp[1]) & mask; op[2] = (cb += wp[2]) & mask; op[3] = (ca += wp[3]) & mask; } } else { REPEAT(stride, *op = *wp&mask; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = *wp&mask; wp++; op++) n -= stride; } } } } static void horizontalAccumulate8(uint16 *wp, int n, int stride, unsigned char *op, unsigned char *ToLinear8) { register unsigned int cr, cg, cb, ca, mask; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { op[0] = ToLinear8[cr = wp[0]]; op[1] = ToLinear8[cg = wp[1]]; op[2] = ToLinear8[cb = wp[2]]; n -= 3; while (n > 0) { n -= 3; wp += 3; op += 3; op[0] = ToLinear8[(cr += wp[0]) & mask]; op[1] = ToLinear8[(cg += wp[1]) & mask]; op[2] = ToLinear8[(cb += wp[2]) & mask]; } } else if (stride == 4) { op[0] = ToLinear8[cr = wp[0]]; op[1] = ToLinear8[cg = wp[1]]; op[2] = ToLinear8[cb = wp[2]]; op[3] = ToLinear8[ca = wp[3]]; n -= 4; while (n > 0) { n -= 4; wp += 4; op += 4; op[0] = ToLinear8[(cr += wp[0]) & mask]; op[1] = ToLinear8[(cg += wp[1]) & mask]; op[2] = ToLinear8[(cb += wp[2]) & mask]; op[3] = ToLinear8[(ca += wp[3]) & mask]; } } else { REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++) n -= stride; } } } } static void horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op, unsigned char *ToLinear8) { register unsigned int cr, cg, cb, ca, mask; register unsigned char t0, t1, t2, t3; if (n >= stride) { mask = CODE_MASK; if (stride == 3) { op[0] = 0; t1 = ToLinear8[cb = wp[2]]; t2 = ToLinear8[cg = wp[1]]; t3 = ToLinear8[cr = wp[0]]; op[1] = t1; op[2] = t2; op[3] = t3; n -= 3; while (n > 0) { n -= 3; wp += 3; op += 4; op[0] = 0; t1 = ToLinear8[(cb += wp[2]) & mask]; t2 = ToLinear8[(cg += wp[1]) & mask]; t3 = ToLinear8[(cr += wp[0]) & mask]; op[1] = t1; op[2] = t2; op[3] = t3; } } else if (stride == 4) { t0 = ToLinear8[ca = wp[3]]; t1 = ToLinear8[cb = wp[2]]; t2 = ToLinear8[cg = wp[1]]; t3 = ToLinear8[cr = wp[0]]; op[0] = t0; op[1] = t1; op[2] = t2; op[3] = t3; n -= 4; while (n > 0) { n -= 4; wp += 4; op += 4; t0 = ToLinear8[(ca += wp[3]) & mask]; t1 = ToLinear8[(cb += wp[2]) & mask]; t2 = ToLinear8[(cg += wp[1]) & mask]; t3 = ToLinear8[(cr += wp[0]) & mask]; op[0] = t0; op[1] = t1; op[2] = t2; op[3] = t3; } } else { REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++) n -= stride; while (n > 0) { REPEAT(stride, wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++) n -= stride; } } } } /* * State block for each open TIFF * file using PixarLog compression/decompression. */ typedef struct { TIFFPredictorState predict; z_stream stream; uint16 *tbuf; uint16 stride; int state; int user_datafmt; int quality; #define PLSTATE_INIT 1 TIFFVSetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ float *ToLinearF; uint16 *ToLinear16; unsigned char *ToLinear8; uint16 *FromLT2; uint16 *From14; /* Really for 16-bit data, but we shift down 2 */ uint16 *From8; } PixarLogState; static int PixarLogMakeTables(PixarLogState *sp) { /* * We make several tables here to convert between various external * representations (float, 16-bit, and 8-bit) and the internal * 11-bit companded representation. The 11-bit representation has two * distinct regions. A linear bottom end up through .018316 in steps * of about .000073, and a region of constant ratio up to about 25. * These floating point numbers are stored in the main table ToLinearF. * All other tables are derived from this one. The tables (and the * ratios) are continuous at the internal seam. */ int nlin, lt2size; int i, j; double b, c, linstep, max; double k, v, dv, r, lr2, r2; float *ToLinearF; uint16 *ToLinear16; unsigned char *ToLinear8; uint16 *FromLT2; uint16 *From14; /* Really for 16-bit data, but we shift down 2 */ uint16 *From8; c = log(RATIO); nlin = 1./c; /* nlin must be an integer */ c = 1./nlin; b = exp(-c*ONE); /* multiplicative scale factor [b*exp(c*ONE) = 1] */ linstep = b*c*exp(1.); LogK1 = 1./c; /* if (v >= 2) token = k1*log(v*k2) */ LogK2 = 1./b; lt2size = (2./linstep)+1; FromLT2 = (uint16 *)_TIFFmalloc(lt2size*sizeof(uint16)); From14 = (uint16 *)_TIFFmalloc(16384*sizeof(uint16)); From8 = (uint16 *)_TIFFmalloc(256*sizeof(uint16)); ToLinearF = (float *)_TIFFmalloc(TSIZEP1 * sizeof(float)); ToLinear16 = (uint16 *)_TIFFmalloc(TSIZEP1 * sizeof(uint16)); ToLinear8 = (unsigned char *)_TIFFmalloc(TSIZEP1 * sizeof(unsigned char)); if (FromLT2 == NULL || From14 == NULL || From8 == NULL || ToLinearF == NULL || ToLinear16 == NULL || ToLinear8 == NULL) { if (FromLT2) _TIFFfree(FromLT2); if (From14) _TIFFfree(From14); if (From8) _TIFFfree(From8); if (ToLinearF) _TIFFfree(ToLinearF); if (ToLinear16) _TIFFfree(ToLinear16); if (ToLinear8) _TIFFfree(ToLinear8); sp->FromLT2 = NULL; sp->From14 = NULL; sp->From8 = NULL; sp->ToLinearF = NULL; sp->ToLinear16 = NULL; sp->ToLinear8 = NULL; return 0; } j = 0; for (i = 0; i < nlin; i++) { v = i * linstep; ToLinearF[j++] = v; } for (i = nlin; i < TSIZE; i++) ToLinearF[j++] = b*exp(c*i); ToLinearF[2048] = ToLinearF[2047]; for (i = 0; i < TSIZEP1; i++) { v = ToLinearF[i]*65535.0 + 0.5; ToLinear16[i] = (v > 65535.0) ? 65535 : v; v = ToLinearF[i]*255.0 + 0.5; ToLinear8[i] = (v > 255.0) ? 255 : v; } j = 0; for (i = 0; i < lt2size; i++) { if ((i*linstep)*(i*linstep) > ToLinearF[j]*ToLinearF[j+1]) j++; FromLT2[i] = j; } /* * Since we lose info anyway on 16-bit data, we set up a 14-bit * table and shift 16-bit values down two bits on input. * saves a little table space. */ j = 0; for (i = 0; i < 16384; i++) { while ((i/16383.)*(i/16383.) > ToLinearF[j]*ToLinearF[j+1]) j++; From14[i] = j; } j = 0; for (i = 0; i < 256; i++) { while ((i/255.)*(i/255.) > ToLinearF[j]*ToLinearF[j+1]) j++; From8[i] = j; } Fltsize = lt2size/2; sp->ToLinearF = ToLinearF; sp->ToLinear16 = ToLinear16; sp->ToLinear8 = ToLinear8; sp->FromLT2 = FromLT2; sp->From14 = From14; sp->From8 = From8; return 1; } #define DecoderState(tif) ((PixarLogState*) (tif)->tif_data) #define EncoderState(tif) ((PixarLogState*) (tif)->tif_data) static int PixarLogEncode(TIFF*, tidata_t, tsize_t, tsample_t); static int PixarLogDecode(TIFF*, tidata_t, tsize_t, tsample_t); #define N(a) (sizeof(a)/sizeof(a[0])) #define PIXARLOGDATAFMT_UNKNOWN -1 static int PixarLogGuessDataFmt(TIFFDirectory *td) { int guess = PIXARLOGDATAFMT_UNKNOWN; int format = td->td_sampleformat; /* If the user didn't tell us his datafmt, * take our best guess from the bitspersample. */ switch (td->td_bitspersample) { case 32: if (format == SAMPLEFORMAT_IEEEFP) guess = PIXARLOGDATAFMT_FLOAT; break; case 16: if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) guess = PIXARLOGDATAFMT_16BIT; break; case 12: if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_INT) guess = PIXARLOGDATAFMT_12BITPICIO; break; case 11: if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) guess = PIXARLOGDATAFMT_11BITLOG; break; case 8: if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT) guess = PIXARLOGDATAFMT_8BIT; break; } return guess; } static int PixarLogSetupDecode(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; PixarLogState* sp = DecoderState(tif); static const char module[] = "PixarLogSetupDecode"; assert(sp != NULL); /* Make sure no byte swapping happens on the data * after decompression. */ tif->tif_postdecode = _TIFFNoPostDecode; /* for some reason, we can't do this in TIFFInitPixarLog */ sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1); sp->tbuf = (uint16 *) _TIFFmalloc(sp->stride * td->td_imagewidth * td->td_rowsperstrip * sizeof(uint16)); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) sp->user_datafmt = PixarLogGuessDataFmt(td); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) { TIFFError(module, "PixarLog compression can't handle bits depth/data format combination (depth: %d)", td->td_bitspersample); return (0); } if (inflateInit(&sp->stream) != Z_OK) { TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg); return (0); } else { sp->state |= PLSTATE_INIT; return (1); } } /* * Setup state for decoding a strip. */ static int PixarLogPreDecode(TIFF* tif, tsample_t s) { TIFFDirectory *td = &tif->tif_dir; PixarLogState* sp = DecoderState(tif); (void) s; assert(sp != NULL); sp->stream.next_in = tif->tif_rawdata; sp->stream.avail_in = tif->tif_rawcc; return (inflateReset(&sp->stream) == Z_OK); } static int PixarLogDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) { TIFFDirectory *td = &tif->tif_dir; PixarLogState* sp = DecoderState(tif); static const char module[] = "PixarLogDecode"; int i, nsamples, llen; uint16 *up; switch (sp->user_datafmt) { case PIXARLOGDATAFMT_FLOAT: nsamples = occ / sizeof(float); /* XXX float == 32 bits */ break; case PIXARLOGDATAFMT_16BIT: case PIXARLOGDATAFMT_12BITPICIO: case PIXARLOGDATAFMT_11BITLOG: nsamples = occ / sizeof(uint16); /* XXX uint16 == 16 bits */ break; case PIXARLOGDATAFMT_8BIT: case PIXARLOGDATAFMT_8BITABGR: nsamples = occ; break; default: TIFFError(tif->tif_name, "%d bit input not supported in PixarLog", td->td_bitspersample); return 0; } llen = sp->stride * td->td_imagewidth; (void) s; assert(sp != NULL); sp->stream.next_out = (unsigned char *) sp->tbuf; sp->stream.avail_out = nsamples * sizeof(uint16); do { int state = inflate(&sp->stream, Z_PARTIAL_FLUSH); if (state == Z_STREAM_END) { break; /* XXX */ } if (state == Z_DATA_ERROR) { TIFFError(module, "%s: Decoding error at scanline %d, %s", tif->tif_name, tif->tif_row, sp->stream.msg); if (inflateSync(&sp->stream) != Z_OK) return (0); continue; } if (state != Z_OK) { TIFFError(module, "%s: zlib error: %s", tif->tif_name, sp->stream.msg); return (0); } } while (sp->stream.avail_out > 0); /* hopefully, we got all the bytes we needed */ if (sp->stream.avail_out != 0) { TIFFError(module, "%s: Not enough data at scanline %d (short %d bytes)", tif->tif_name, tif->tif_row, sp->stream.avail_out); return (0); } up = sp->tbuf; /* Swap bytes in the data if from a different endian machine. */ if (tif->tif_flags & TIFF_SWAB) TIFFSwabArrayOfShort(up, nsamples); for (i = 0; i < nsamples; i += llen, up += llen) { switch (sp->user_datafmt) { case PIXARLOGDATAFMT_FLOAT: horizontalAccumulateF(up, llen, sp->stride, (float *)op, sp->ToLinearF); op += llen * sizeof(float); break; case PIXARLOGDATAFMT_16BIT: horizontalAccumulate16(up, llen, sp->stride, (uint16 *)op, sp->ToLinear16); op += llen * sizeof(uint16); break; case PIXARLOGDATAFMT_12BITPICIO: horizontalAccumulate12(up, llen, sp->stride, (int16 *)op, sp->ToLinearF); op += llen * sizeof(int16); break; case PIXARLOGDATAFMT_11BITLOG: horizontalAccumulate11(up, llen, sp->stride, (uint16 *)op); op += llen * sizeof(uint16); break; case PIXARLOGDATAFMT_8BIT: horizontalAccumulate8(up, llen, sp->stride, (unsigned char *)op, sp->ToLinear8); op += llen * sizeof(unsigned char); break; case PIXARLOGDATAFMT_8BITABGR: horizontalAccumulate8abgr(up, llen, sp->stride, (unsigned char *)op, sp->ToLinear8); op += llen * sizeof(unsigned char); break; default: TIFFError(tif->tif_name, "PixarLogDecode: unsupported bits/sample: %d", td->td_bitspersample); return (0); } } return (1); } static int PixarLogSetupEncode(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; PixarLogState* sp = EncoderState(tif); static const char module[] = "PixarLogSetupEncode"; assert(sp != NULL); /* for some reason, we can't do this in TIFFInitPixarLog */ sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1); sp->tbuf = (uint16 *) _TIFFmalloc(sp->stride * td->td_imagewidth * td->td_rowsperstrip * sizeof(uint16)); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) sp->user_datafmt = PixarLogGuessDataFmt(td); if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) { TIFFError(module, "PixarLog compression can't handle %d bit linear encodings", td->td_bitspersample); return (0); } if (deflateInit(&sp->stream, sp->quality) != Z_OK) { TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg); return (0); } else { sp->state |= PLSTATE_INIT; return (1); } } /* * Reset encoding state at the start of a strip. */ static int PixarLogPreEncode(TIFF* tif, tsample_t s) { TIFFDirectory *td = &tif->tif_dir; PixarLogState *sp = EncoderState(tif); (void) s; assert(sp != NULL); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = tif->tif_rawdatasize; return (deflateReset(&sp->stream) == Z_OK); } static void horizontalDifferenceF(float *ip, int n, int stride, uint16 *wp, uint16 *FromLT2) { register int r1, g1, b1, a1, r2, g2, b2, a2, mask; register float fltsize = Fltsize; #define CLAMP(v) ( (v<(float)0.) ? 0 \ : (v<(float)2.) ? FromLT2[(int)(v*fltsize)] \ : (v>(float)24.2) ? 2047 \ : LogK1*log(v*LogK2) + 0.5 ) mask = CODE_MASK; if (n >= stride) { if (stride == 3) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); n -= 3; while (n > 0) { n -= 3; wp += 3; ip += 3; r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; } } else if (stride == 4) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]); n -= 4; while (n > 0) { n -= 4; wp += 4; ip += 4; r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; a1 = CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1; } } else { ip += n - 1; /* point to last one */ wp += n - 1; /* point to last one */ n -= stride; while (n > 0) { REPEAT(stride, wp[0] = CLAMP(ip[0]); wp[stride] -= wp[0]; wp[stride] &= mask; wp--; ip--) n -= stride; } REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--) } } } static void horizontalDifference16(unsigned short *ip, int n, int stride, unsigned short *wp, uint16 *From14) { register int r1, g1, b1, a1, r2, g2, b2, a2, mask; /* assumption is unsigned pixel values */ #undef CLAMP #define CLAMP(v) From14[(v) >> 2] mask = CODE_MASK; if (n >= stride) { if (stride == 3) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); n -= 3; while (n > 0) { n -= 3; wp += 3; ip += 3; r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; } } else if (stride == 4) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]); n -= 4; while (n > 0) { n -= 4; wp += 4; ip += 4; r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1; a1 = CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1; } } else { ip += n - 1; /* point to last one */ wp += n - 1; /* point to last one */ n -= stride; while (n > 0) { REPEAT(stride, wp[0] = CLAMP(ip[0]); wp[stride] -= wp[0]; wp[stride] &= mask; wp--; ip--) n -= stride; } REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--) } } } static void horizontalDifference8(unsigned char *ip, int n, int stride, unsigned short *wp, uint16 *From8) { register int r1, g1, b1, a1, r2, g2, b2, a2, mask; #undef CLAMP #define CLAMP(v) (From8[(v)]) mask = CODE_MASK; if (n >= stride) { if (stride == 3) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); n -= 3; while (n > 0) { n -= 3; r1 = CLAMP(ip[3]); wp[3] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[4]); wp[4] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[5]); wp[5] = (b1-b2) & mask; b2 = b1; wp += 3; ip += 3; } } else if (stride == 4) { r2 = wp[0] = CLAMP(ip[0]); g2 = wp[1] = CLAMP(ip[1]); b2 = wp[2] = CLAMP(ip[2]); a2 = wp[3] = CLAMP(ip[3]); n -= 4; while (n > 0) { n -= 4; r1 = CLAMP(ip[4]); wp[4] = (r1-r2) & mask; r2 = r1; g1 = CLAMP(ip[5]); wp[5] = (g1-g2) & mask; g2 = g1; b1 = CLAMP(ip[6]); wp[6] = (b1-b2) & mask; b2 = b1; a1 = CLAMP(ip[7]); wp[7] = (a1-a2) & mask; a2 = a1; wp += 4; ip += 4; } } else { wp += n + stride - 1; /* point to last one */ ip += n + stride - 1; /* point to last one */ n -= stride; while (n > 0) { REPEAT(stride, wp[0] = CLAMP(ip[0]); wp[stride] -= wp[0]; wp[stride] &= mask; wp--; ip--) n -= stride; } REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--) } } } /* * Encode a chunk of pixels. */ static int PixarLogEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { TIFFDirectory *td = &tif->tif_dir; PixarLogState *sp = EncoderState(tif); static const char module[] = "PixarLogEncode"; int i, n, llen; unsigned short * up; (void) s; switch (sp->user_datafmt) { case PIXARLOGDATAFMT_FLOAT: n = cc / sizeof(float); /* XXX float == 32 bits */ break; case PIXARLOGDATAFMT_16BIT: case PIXARLOGDATAFMT_12BITPICIO: case PIXARLOGDATAFMT_11BITLOG: n = cc / sizeof(uint16); /* XXX uint16 == 16 bits */ break; case PIXARLOGDATAFMT_8BIT: case PIXARLOGDATAFMT_8BITABGR: n = cc; break; default: TIFFError(tif->tif_name, "%d bit input not supported in PixarLog", td->td_bitspersample); return 0; } llen = sp->stride * td->td_imagewidth; for (i = 0, up = sp->tbuf; i < n; i += llen, up += llen) { switch (sp->user_datafmt) { case PIXARLOGDATAFMT_FLOAT: horizontalDifferenceF((float *)bp, llen, sp->stride, up, sp->FromLT2); bp += llen * sizeof(float); break; case PIXARLOGDATAFMT_16BIT: horizontalDifference16((uint16 *)bp, llen, sp->stride, up, sp->From14); bp += llen * sizeof(uint16); break; case PIXARLOGDATAFMT_8BIT: horizontalDifference8((unsigned char *)bp, llen, sp->stride, up, sp->From8); bp += llen * sizeof(unsigned char); break; default: TIFFError(tif->tif_name, "%d bit input not supported in PixarLog", td->td_bitspersample); return 0; } } sp->stream.next_in = (unsigned char *) sp->tbuf; sp->stream.avail_in = n * sizeof(uint16); do { if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { TIFFError(module, "%s: Encoder error: %s", tif->tif_name, sp->stream.msg); return (0); } if (sp->stream.avail_out == 0) { tif->tif_rawcc = tif->tif_rawdatasize; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = tif->tif_rawdatasize; } } while (sp->stream.avail_in > 0); return (1); } /* * Finish off an encoded strip by flushing the last * string and tacking on an End Of Information code. */ static int PixarLogPostEncode(TIFF* tif) { PixarLogState *sp = EncoderState(tif); static const char module[] = "PixarLogPostEncode"; int state; sp->stream.avail_in = 0; do { state = deflate(&sp->stream, Z_FINISH); switch (state) { case Z_STREAM_END: case Z_OK: if (sp->stream.avail_out != tif->tif_rawdatasize) { tif->tif_rawcc = tif->tif_rawdatasize - sp->stream.avail_out; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = tif->tif_rawdatasize; } break; default: TIFFError(module, "%s: zlib error: %s", tif->tif_name, sp->stream.msg); return (0); } } while (state != Z_STREAM_END); return (1); } static void PixarLogClose(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; /* In a really sneaky maneuver, on close, we covertly modify both * bitspersample and sampleformat in the directory to indicate * 8-bit linear. This way, the decode "just works" even for * readers that don't know about PixarLog, or how to set * the PIXARLOGDATFMT pseudo-tag. */ td->td_bitspersample = 8; td->td_sampleformat = SAMPLEFORMAT_UINT; } static void PixarLogCleanup(TIFF* tif) { PixarLogState* sp = (PixarLogState*) tif->tif_data; if (sp) { if (sp->FromLT2) _TIFFfree(sp->FromLT2); if (sp->From14) _TIFFfree(sp->From14); if (sp->From8) _TIFFfree(sp->From8); if (sp->ToLinearF) _TIFFfree(sp->ToLinearF); if (sp->ToLinear16) _TIFFfree(sp->ToLinear16); if (sp->ToLinear8) _TIFFfree(sp->ToLinear8); if (sp->state&PLSTATE_INIT) { if (tif->tif_mode == O_RDONLY) inflateEnd(&sp->stream); else deflateEnd(&sp->stream); } if (sp->tbuf) _TIFFfree(sp->tbuf); _TIFFfree(sp); tif->tif_data = NULL; } } static int PixarLogVSetField(TIFF* tif, ttag_t tag, va_list ap) { PixarLogState *sp = (PixarLogState *)tif->tif_data; int result; static const char module[] = "PixarLogVSetField"; switch (tag) { case TIFFTAG_PIXARLOGQUALITY: sp->quality = va_arg(ap, int); if (tif->tif_mode != O_RDONLY && (sp->state&PLSTATE_INIT)) { if (deflateParams(&sp->stream, sp->quality, Z_DEFAULT_STRATEGY) != Z_OK) { TIFFError(module, "%s: zlib error: %s", tif->tif_name, sp->stream.msg); return (0); } } return (1); case TIFFTAG_PIXARLOGDATAFMT: sp->user_datafmt = va_arg(ap, int); /* Tweak the TIFF header so that the rest of libtiff knows what * size of data will be passed between app and library, and * assume that the app knows what it is doing and is not * confused by these header manipulations... */ switch (sp->user_datafmt) { case PIXARLOGDATAFMT_8BIT: case PIXARLOGDATAFMT_8BITABGR: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); break; case PIXARLOGDATAFMT_11BITLOG: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); break; case PIXARLOGDATAFMT_12BITPICIO: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); break; case PIXARLOGDATAFMT_16BIT: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT); break; case PIXARLOGDATAFMT_FLOAT: TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32); TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP); break; } /* * Must recalculate sizes should bits/sample change. */ tif->tif_tilesize = TIFFTileSize(tif); tif->tif_scanlinesize = TIFFScanlineSize(tif); result = 1; /* NB: pseudo tag */ break; default: result = (*sp->vsetparent)(tif, tag, ap); } return (result); } static int PixarLogVGetField(TIFF* tif, ttag_t tag, va_list ap) { PixarLogState *sp = (PixarLogState *)tif->tif_data; switch (tag) { case TIFFTAG_PIXARLOGQUALITY: *va_arg(ap, int*) = sp->quality; break; case TIFFTAG_PIXARLOGDATAFMT: *va_arg(ap, int*) = sp->user_datafmt; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static const TIFFFieldInfo pixarlogFieldInfo[] = { {TIFFTAG_PIXARLOGDATAFMT,0,0,TIFF_ANY, FIELD_PSEUDO,FALSE,FALSE,""}, {TIFFTAG_PIXARLOGQUALITY,0,0,TIFF_ANY, FIELD_PSEUDO,FALSE,FALSE,""} }; int TIFFInitPixarLog(TIFF* tif, int scheme) { PixarLogState* sp; assert(scheme == COMPRESSION_PIXARLOG); /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (PixarLogState)); if (tif->tif_data == NULL) goto bad; sp = (PixarLogState*) tif->tif_data; memset(sp, 0, sizeof (*sp)); sp->stream.data_type = Z_BINARY; sp->user_datafmt = PIXARLOGDATAFMT_UNKNOWN; /* * Install codec methods. */ tif->tif_setupdecode = PixarLogSetupDecode; tif->tif_predecode = PixarLogPreDecode; tif->tif_decoderow = PixarLogDecode; tif->tif_decodestrip = PixarLogDecode; tif->tif_decodetile = PixarLogDecode; tif->tif_setupencode = PixarLogSetupEncode; tif->tif_preencode = PixarLogPreEncode; tif->tif_postencode = PixarLogPostEncode; tif->tif_encoderow = PixarLogEncode; tif->tif_encodestrip = PixarLogEncode; tif->tif_encodetile = PixarLogEncode; tif->tif_close = PixarLogClose; tif->tif_cleanup = PixarLogCleanup; /* Override SetField so we can handle our private pseudo-tag */ _TIFFMergeFieldInfo(tif, pixarlogFieldInfo, N(pixarlogFieldInfo)); sp->vgetparent = tif->tif_vgetfield; tif->tif_vgetfield = PixarLogVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_vsetfield; tif->tif_vsetfield = PixarLogVSetField; /* hook for codec tags */ /* Default values for codec-specific fields */ sp->quality = Z_DEFAULT_COMPRESSION; /* default comp. level */ sp->state = 0; /* we don't wish to use the predictor, * the default is none, which predictor value 1 */ (void) TIFFPredictorInit(tif); /* * build the companding tables */ PixarLogMakeTables(sp); return (1); bad: TIFFError("TIFFInitPixarLog", "No space for PixarLog state block"); return (0); } #endif /* PIXARLOG_SUPPORT */ gamera-3.3.3/src/libtiff/tif_predict.c0000644000076500000000000002712010714675674016633 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Predictor Tag Support (used by multiple codecs). */ #include "tiffiop.h" #include "tif_predict.h" #include #define PredictorState(tif) ((TIFFPredictorState*) (tif)->tif_data) static void horAcc8(TIFF*, tidata_t, tsize_t); static void horAcc16(TIFF*, tidata_t, tsize_t); static void swabHorAcc16(TIFF*, tidata_t, tsize_t); static void horDiff8(TIFF*, tidata_t, tsize_t); static void horDiff16(TIFF*, tidata_t, tsize_t); static int PredictorDecodeRow(TIFF*, tidata_t, tsize_t, tsample_t); static int PredictorDecodeTile(TIFF*, tidata_t, tsize_t, tsample_t); static int PredictorEncodeRow(TIFF*, tidata_t, tsize_t, tsample_t); static int PredictorEncodeTile(TIFF*, tidata_t, tsize_t, tsample_t); static int PredictorSetup(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); TIFFDirectory* td = &tif->tif_dir; if (sp->predictor == 1) /* no differencing */ return (1); if (sp->predictor != 2) { TIFFError(tif->tif_name, "\"Predictor\" value %d not supported", sp->predictor); return (0); } if (td->td_bitspersample != 8 && td->td_bitspersample != 16) { TIFFError(tif->tif_name, "Horizontal differencing \"Predictor\" not supported with %d-bit samples", td->td_bitspersample); return (0); } sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ? td->td_samplesperpixel : 1); /* * Calculate the scanline/tile-width size in bytes. */ if (isTiled(tif)) sp->rowsize = TIFFTileRowSize(tif); else sp->rowsize = TIFFScanlineSize(tif); return (1); } static int PredictorSetupDecode(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); TIFFDirectory* td = &tif->tif_dir; if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif)) return (0); if (sp->predictor == 2) { switch (td->td_bitspersample) { case 8: sp->pfunc = horAcc8; break; case 16: sp->pfunc = horAcc16; break; } /* * Override default decoding method with * one that does the predictor stuff. */ sp->coderow = tif->tif_decoderow; tif->tif_decoderow = PredictorDecodeRow; sp->codestrip = tif->tif_decodestrip; tif->tif_decodestrip = PredictorDecodeTile; sp->codetile = tif->tif_decodetile; tif->tif_decodetile = PredictorDecodeTile; /* * If the data is horizontally differenced * 16-bit data that requires byte-swapping, * then it must be byte swapped before the * accumulation step. We do this with a * special-purpose routine and override the * normal post decoding logic that the library * setup when the directory was read. */ if (tif->tif_flags&TIFF_SWAB) { if (sp->pfunc == horAcc16) { sp->pfunc = swabHorAcc16; tif->tif_postdecode = _TIFFNoPostDecode; } /* else handle 32-bit case... */ } } return (1); } static int PredictorSetupEncode(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); TIFFDirectory* td = &tif->tif_dir; if (!(*sp->setupencode)(tif) || !PredictorSetup(tif)) return (0); if (sp->predictor == 2) { switch (td->td_bitspersample) { case 8: sp->pfunc = horDiff8; break; case 16: sp->pfunc = horDiff16; break; } /* * Override default encoding method with * one that does the predictor stuff. */ sp->coderow = tif->tif_encoderow; tif->tif_encoderow = PredictorEncodeRow; sp->codestrip = tif->tif_encodestrip; tif->tif_encodestrip = PredictorEncodeTile; sp->codetile = tif->tif_encodetile; tif->tif_encodetile = PredictorEncodeTile; } return (1); } #define REPEAT4(n, op) \ switch (n) { \ default: { int i; for (i = n-4; i > 0; i--) { op; } } \ case 4: op; \ case 3: op; \ case 2: op; \ case 1: op; \ case 0: ; \ } static void horAcc8(TIFF* tif, tidata_t cp0, tsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tsize_t stride = sp->stride; char* cp = (char*) cp0; if (cc > stride) { cc -= stride; /* * Pipeline the most common cases. */ if (stride == 3) { u_int cr = cp[0]; u_int cg = cp[1]; u_int cb = cp[2]; do { cc -= 3, cp += 3; cp[0] = (cr += cp[0]); cp[1] = (cg += cp[1]); cp[2] = (cb += cp[2]); } while ((int32) cc > 0); } else if (stride == 4) { u_int cr = cp[0]; u_int cg = cp[1]; u_int cb = cp[2]; u_int ca = cp[3]; do { cc -= 4, cp += 4; cp[0] = (cr += cp[0]); cp[1] = (cg += cp[1]); cp[2] = (cb += cp[2]); cp[3] = (ca += cp[3]); } while ((int32) cc > 0); } else { do { REPEAT4(stride, cp[stride] += *cp; cp++) cc -= stride; } while ((int32) cc > 0); } } } static void swabHorAcc16(TIFF* tif, tidata_t cp0, tsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tsize_t stride = sp->stride; uint16* wp = (uint16*) cp0; tsize_t wc = cc / 2; if (wc > stride) { TIFFSwabArrayOfShort(wp, wc); wc -= stride; do { REPEAT4(stride, wp[stride] += wp[0]; wp++) wc -= stride; } while ((int32) wc > 0); } } static void horAcc16(TIFF* tif, tidata_t cp0, tsize_t cc) { tsize_t stride = PredictorState(tif)->stride; uint16* wp = (uint16*) cp0; tsize_t wc = cc / 2; if (wc > stride) { wc -= stride; do { REPEAT4(stride, wp[stride] += wp[0]; wp++) wc -= stride; } while ((int32) wc > 0); } } /* * Decode a scanline and apply the predictor routine. */ static int PredictorDecodeRow(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) { TIFFPredictorState *sp = PredictorState(tif); assert(sp != NULL); assert(sp->coderow != NULL); assert(sp->pfunc != NULL); if ((*sp->coderow)(tif, op0, occ0, s)) { (*sp->pfunc)(tif, op0, occ0); return (1); } else return (0); } /* * Decode a tile/strip and apply the predictor routine. * Note that horizontal differencing must be done on a * row-by-row basis. The width of a "row" has already * been calculated at pre-decode time according to the * strip/tile dimensions. */ static int PredictorDecodeTile(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s) { TIFFPredictorState *sp = PredictorState(tif); assert(sp != NULL); assert(sp->codetile != NULL); if ((*sp->codetile)(tif, op0, occ0, s)) { tsize_t rowsize = sp->rowsize; assert(rowsize > 0); assert(sp->pfunc != NULL); while ((long)occ0 > 0) { (*sp->pfunc)(tif, op0, (tsize_t) rowsize); occ0 -= rowsize; op0 += rowsize; } return (1); } else return (0); } static void horDiff8(TIFF* tif, tidata_t cp0, tsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tsize_t stride = sp->stride; char* cp = (char*) cp0; if (cc > stride) { cc -= stride; /* * Pipeline the most common cases. */ if (stride == 3) { int r1, g1, b1; int r2 = cp[0]; int g2 = cp[1]; int b2 = cp[2]; do { r1 = cp[3]; cp[3] = r1-r2; r2 = r1; g1 = cp[4]; cp[4] = g1-g2; g2 = g1; b1 = cp[5]; cp[5] = b1-b2; b2 = b1; cp += 3; } while ((int32)(cc -= 3) > 0); } else if (stride == 4) { int r1, g1, b1, a1; int r2 = cp[0]; int g2 = cp[1]; int b2 = cp[2]; int a2 = cp[3]; do { r1 = cp[4]; cp[4] = r1-r2; r2 = r1; g1 = cp[5]; cp[5] = g1-g2; g2 = g1; b1 = cp[6]; cp[6] = b1-b2; b2 = b1; a1 = cp[7]; cp[7] = a1-a2; a2 = a1; cp += 4; } while ((int32)(cc -= 4) > 0); } else { cp += cc - 1; do { REPEAT4(stride, cp[stride] -= cp[0]; cp--) } while ((int32)(cc -= stride) > 0); } } } static void horDiff16(TIFF* tif, tidata_t cp0, tsize_t cc) { TIFFPredictorState* sp = PredictorState(tif); tsize_t stride = sp->stride; int16 *wp = (int16*) cp0; tsize_t wc = cc/2; if (wc > stride) { wc -= stride; wp += wc - 1; do { REPEAT4(stride, wp[stride] -= wp[0]; wp--) wc -= stride; } while ((int32) wc > 0); } } static int PredictorEncodeRow(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { TIFFPredictorState *sp = PredictorState(tif); assert(sp != NULL); assert(sp->pfunc != NULL); assert(sp->coderow != NULL); /* XXX horizontal differencing alters user's data XXX */ (*sp->pfunc)(tif, bp, cc); return ((*sp->coderow)(tif, bp, cc, s)); } static int PredictorEncodeTile(TIFF* tif, tidata_t bp0, tsize_t cc0, tsample_t s) { TIFFPredictorState *sp = PredictorState(tif); tsize_t cc = cc0, rowsize; u_char* bp = bp0; assert(sp != NULL); assert(sp->pfunc != NULL); assert(sp->codetile != NULL); rowsize = sp->rowsize; assert(rowsize > 0); while ((long)cc > 0) { (*sp->pfunc)(tif, bp, (tsize_t) rowsize); cc -= rowsize; bp += rowsize; } return ((*sp->codetile)(tif, bp0, cc0, s)); } #define FIELD_PREDICTOR (FIELD_CODEC+0) /* XXX */ static const TIFFFieldInfo predictFieldInfo[] = { { TIFFTAG_PREDICTOR, 1, 1, TIFF_SHORT, FIELD_PREDICTOR, FALSE, FALSE, "Predictor" }, }; #define N(a) (sizeof (a) / sizeof (a[0])) static int PredictorVSetField(TIFF* tif, ttag_t tag, va_list ap) { TIFFPredictorState *sp = PredictorState(tif); switch (tag) { case TIFFTAG_PREDICTOR: sp->predictor = (uint16) va_arg(ap, int); TIFFSetFieldBit(tif, FIELD_PREDICTOR); break; default: return (*sp->vsetparent)(tif, tag, ap); } tif->tif_flags |= TIFF_DIRTYDIRECT; return (1); } static int PredictorVGetField(TIFF* tif, ttag_t tag, va_list ap) { TIFFPredictorState *sp = PredictorState(tif); switch (tag) { case TIFFTAG_PREDICTOR: *va_arg(ap, uint16*) = sp->predictor; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static void PredictorPrintDir(TIFF* tif, FILE* fd, long flags) { TIFFPredictorState* sp = PredictorState(tif); (void) flags; if (TIFFFieldSet(tif,FIELD_PREDICTOR)) { fprintf(fd, " Predictor: "); switch (sp->predictor) { case 1: fprintf(fd, "none "); break; case 2: fprintf(fd, "horizontal differencing "); break; } fprintf(fd, "%u (0x%x)\n", sp->predictor, sp->predictor); } if (sp->printdir) (*sp->printdir)(tif, fd, flags); } int TIFFPredictorInit(TIFF* tif) { TIFFPredictorState* sp = PredictorState(tif); /* * Merge codec-specific tag information and * override parent get/set field methods. */ _TIFFMergeFieldInfo(tif, predictFieldInfo, N(predictFieldInfo)); sp->vgetparent = tif->tif_vgetfield; tif->tif_vgetfield = PredictorVGetField;/* hook for predictor tag */ sp->vsetparent = tif->tif_vsetfield; tif->tif_vsetfield = PredictorVSetField;/* hook for predictor tag */ sp->printdir = tif->tif_printdir; tif->tif_printdir = PredictorPrintDir; /* hook for predictor tag */ sp->setupdecode = tif->tif_setupdecode; tif->tif_setupdecode = PredictorSetupDecode; sp->setupencode = tif->tif_setupencode; tif->tif_setupencode = PredictorSetupEncode; sp->predictor = 1; /* default value */ sp->pfunc = NULL; /* no predictor routine */ return (1); } gamera-3.3.3/src/libtiff/tif_predict.h0000644000076500000000000000447410714675674016647 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1995-1997 Sam Leffler * Copyright (c) 1995-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFPREDICT_ #define _TIFFPREDICT_ /* * ``Library-private'' Support for the Predictor Tag */ /* * Codecs that want to support the Predictor tag must place * this structure first in their private state block so that * the predictor code can cast tif_data to find its state. */ typedef struct { int predictor; /* predictor tag value */ int stride; /* sample stride over data */ tsize_t rowsize; /* tile/strip row size */ TIFFPostMethod pfunc; /* horizontal differencer/accumulator */ TIFFCodeMethod coderow; /* parent codec encode/decode row */ TIFFCodeMethod codestrip; /* parent codec encode/decode strip */ TIFFCodeMethod codetile; /* parent codec encode/decode tile */ TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ TIFFPrintMethod printdir; /* super-class method */ TIFFBoolMethod setupdecode; /* super-class method */ TIFFBoolMethod setupencode; /* super-class method */ } TIFFPredictorState; #if defined(__cplusplus) extern "C" { #endif extern int TIFFPredictorInit(TIFF*); #if defined(__cplusplus) } #endif #endif /* _TIFFPREDICT_ */ gamera-3.3.3/src/libtiff/tif_print.c0000644000076500000000000004053110714675674016336 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Directory Printing Support */ #include "tiffiop.h" #include #include static const char *photoNames[] = { "min-is-white", /* PHOTOMETRIC_MINISWHITE */ "min-is-black", /* PHOTOMETRIC_MINISBLACK */ "RGB color", /* PHOTOMETRIC_RGB */ "palette color (RGB from colormap)", /* PHOTOMETRIC_PALETTE */ "transparency mask", /* PHOTOMETRIC_MASK */ "separated", /* PHOTOMETRIC_SEPARATED */ "YCbCr", /* PHOTOMETRIC_YCBCR */ "7 (0x7)", "CIE L*a*b*", /* PHOTOMETRIC_CIELAB */ }; #define NPHOTONAMES (sizeof (photoNames) / sizeof (photoNames[0])) static const char *orientNames[] = { "0 (0x0)", "row 0 top, col 0 lhs", /* ORIENTATION_TOPLEFT */ "row 0 top, col 0 rhs", /* ORIENTATION_TOPRIGHT */ "row 0 bottom, col 0 rhs", /* ORIENTATION_BOTRIGHT */ "row 0 bottom, col 0 lhs", /* ORIENTATION_BOTLEFT */ "row 0 lhs, col 0 top", /* ORIENTATION_LEFTTOP */ "row 0 rhs, col 0 top", /* ORIENTATION_RIGHTTOP */ "row 0 rhs, col 0 bottom", /* ORIENTATION_RIGHTBOT */ "row 0 lhs, col 0 bottom", /* ORIENTATION_LEFTBOT */ }; #define NORIENTNAMES (sizeof (orientNames) / sizeof (orientNames[0])) /* * Print the contents of the current directory * to the specified stdio file stream. */ void TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags) { register TIFFDirectory *td; char *sep; uint16 i; long l, n; fprintf(fd, "TIFF Directory at offset 0x%lx\n", tif->tif_diroff); td = &tif->tif_dir; if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) { fprintf(fd, " Subfile Type:"); sep = " "; if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) { fprintf(fd, "%sreduced-resolution image", sep); sep = "/"; } if (td->td_subfiletype & FILETYPE_PAGE) { fprintf(fd, "%smulti-page document", sep); sep = "/"; } if (td->td_subfiletype & FILETYPE_MASK) fprintf(fd, "%stransparency mask", sep); fprintf(fd, " (%lu = 0x%lx)\n", (long) td->td_subfiletype, (long) td->td_subfiletype); } if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) { fprintf(fd, " Image Width: %lu Image Length: %lu", (u_long) td->td_imagewidth, (u_long) td->td_imagelength); if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH)) fprintf(fd, " Image Depth: %lu", (u_long) td->td_imagedepth); fprintf(fd, "\n"); } /* Begin Pixar */ if (TIFFFieldSet(tif,FIELD_IMAGEFULLWIDTH) || TIFFFieldSet(tif,FIELD_IMAGEFULLLENGTH)) { fprintf(fd, " Pixar Full Image Width: %lu Full Image Length: %lu\n", (u_long) td->td_imagefullwidth, (u_long) td->td_imagefulllength); } if (TIFFFieldSet(tif,FIELD_TEXTUREFORMAT)) _TIFFprintAsciiTag(fd, "Texture Format", td->td_textureformat); if (TIFFFieldSet(tif,FIELD_WRAPMODES)) _TIFFprintAsciiTag(fd, "Texture Wrap Modes", td->td_wrapmodes); if (TIFFFieldSet(tif,FIELD_FOVCOT)) fprintf(fd, " Field of View Cotangent: %g\n", td->td_fovcot); if (TIFFFieldSet(tif,FIELD_MATRIX_WORLDTOSCREEN)) { typedef float Matrix[4][4]; Matrix* m = (Matrix*)td->td_matrixWorldToScreen; fprintf(fd, " Matrix NP:\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n", (*m)[0][0], (*m)[0][1], (*m)[0][2], (*m)[0][3], (*m)[1][0], (*m)[1][1], (*m)[1][2], (*m)[1][3], (*m)[2][0], (*m)[2][1], (*m)[2][2], (*m)[2][3], (*m)[3][0], (*m)[3][1], (*m)[3][2], (*m)[3][3]); } if (TIFFFieldSet(tif,FIELD_MATRIX_WORLDTOCAMERA)) { typedef float Matrix[4][4]; Matrix* m = (Matrix*)td->td_matrixWorldToCamera; fprintf(fd, " Matrix Nl:\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n", (*m)[0][0], (*m)[0][1], (*m)[0][2], (*m)[0][3], (*m)[1][0], (*m)[1][1], (*m)[1][2], (*m)[1][3], (*m)[2][0], (*m)[2][1], (*m)[2][2], (*m)[2][3], (*m)[3][0], (*m)[3][1], (*m)[3][2], (*m)[3][3]); } /* End Pixar */ if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) { fprintf(fd, " Tile Width: %lu Tile Length: %lu", (u_long) td->td_tilewidth, (u_long) td->td_tilelength); if (TIFFFieldSet(tif,FIELD_TILEDEPTH)) fprintf(fd, " Tile Depth: %lu", (u_long) td->td_tiledepth); fprintf(fd, "\n"); } if (TIFFFieldSet(tif,FIELD_RESOLUTION)) { fprintf(fd, " Resolution: %g, %g", td->td_xresolution, td->td_yresolution); if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) { switch (td->td_resolutionunit) { case RESUNIT_NONE: fprintf(fd, " (unitless)"); break; case RESUNIT_INCH: fprintf(fd, " pixels/inch"); break; case RESUNIT_CENTIMETER: fprintf(fd, " pixels/cm"); break; default: fprintf(fd, " (unit %u = 0x%x)", td->td_resolutionunit, td->td_resolutionunit); break; } } fprintf(fd, "\n"); } if (TIFFFieldSet(tif,FIELD_POSITION)) fprintf(fd, " Position: %g, %g\n", td->td_xposition, td->td_yposition); if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE)) fprintf(fd, " Bits/Sample: %u\n", td->td_bitspersample); if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) { fprintf(fd, " Sample Format: "); switch (td->td_sampleformat) { case SAMPLEFORMAT_VOID: fprintf(fd, "void\n"); break; case SAMPLEFORMAT_INT: fprintf(fd, "signed integer\n"); break; case SAMPLEFORMAT_UINT: fprintf(fd, "unsigned integer\n"); break; case SAMPLEFORMAT_IEEEFP: fprintf(fd, "IEEE floating point\n"); break; case SAMPLEFORMAT_COMPLEXINT: fprintf(fd, "complex signed integer\n"); break; case SAMPLEFORMAT_COMPLEXIEEEFP: fprintf(fd, "complex IEEE floating point\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_sampleformat, td->td_sampleformat); break; } } if (TIFFFieldSet(tif,FIELD_COMPRESSION)) { const TIFFCodec* c = TIFFFindCODEC(td->td_compression); fprintf(fd, " Compression Scheme: "); if (c) fprintf(fd, "%s\n", c->name); else fprintf(fd, "%u (0x%x)\n", td->td_compression, td->td_compression); } if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) { fprintf(fd, " Photometric Interpretation: "); if (td->td_photometric < NPHOTONAMES) fprintf(fd, "%s\n", photoNames[td->td_photometric]); else { switch (td->td_photometric) { case PHOTOMETRIC_LOGL: fprintf(fd, "CIE Log2(L)\n"); break; case PHOTOMETRIC_LOGLUV: fprintf(fd, "CIE Log2(L) (u',v')\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_photometric, td->td_photometric); break; } } } if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) { fprintf(fd, " Extra Samples: %u<", td->td_extrasamples); sep = ""; for (i = 0; i < td->td_extrasamples; i++) { switch (td->td_sampleinfo[i]) { case EXTRASAMPLE_UNSPECIFIED: fprintf(fd, "%sunspecified", sep); break; case EXTRASAMPLE_ASSOCALPHA: fprintf(fd, "%sassoc-alpha", sep); break; case EXTRASAMPLE_UNASSALPHA: fprintf(fd, "%sunassoc-alpha", sep); break; default: fprintf(fd, "%s%u (0x%x)", sep, td->td_sampleinfo[i], td->td_sampleinfo[i]); break; } sep = ", "; } fprintf(fd, ">\n"); } if (TIFFFieldSet(tif,FIELD_STONITS)) { fprintf(fd, " Sample to Nits conversion factor: %.4e\n", td->td_stonits); } #ifdef CMYK_SUPPORT if (TIFFFieldSet(tif,FIELD_INKSET)) { fprintf(fd, " Ink Set: "); switch (td->td_inkset) { case INKSET_CMYK: fprintf(fd, "CMYK\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_inkset, td->td_inkset); break; } } if (TIFFFieldSet(tif,FIELD_INKNAMES)) { char* cp; fprintf(fd, " Ink Names: "); i = td->td_samplesperpixel; sep = ""; for (cp = td->td_inknames; i > 0; cp = strchr(cp,'\0')+1, i--) { fprintf(fd, "%s", sep); _TIFFprintAscii(fd, cp); sep = ", "; } } if (TIFFFieldSet(tif,FIELD_NUMBEROFINKS)) fprintf(fd, " Number of Inks: %u\n", td->td_ninks); if (TIFFFieldSet(tif,FIELD_DOTRANGE)) fprintf(fd, " Dot Range: %u-%u\n", td->td_dotrange[0], td->td_dotrange[1]); if (TIFFFieldSet(tif,FIELD_TARGETPRINTER)) _TIFFprintAsciiTag(fd, "Target Printer", td->td_targetprinter); #endif if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) { fprintf(fd, " Thresholding: "); switch (td->td_threshholding) { case THRESHHOLD_BILEVEL: fprintf(fd, "bilevel art scan\n"); break; case THRESHHOLD_HALFTONE: fprintf(fd, "halftone or dithered scan\n"); break; case THRESHHOLD_ERRORDIFFUSE: fprintf(fd, "error diffused\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_threshholding, td->td_threshholding); break; } } if (TIFFFieldSet(tif,FIELD_FILLORDER)) { fprintf(fd, " FillOrder: "); switch (td->td_fillorder) { case FILLORDER_MSB2LSB: fprintf(fd, "msb-to-lsb\n"); break; case FILLORDER_LSB2MSB: fprintf(fd, "lsb-to-msb\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_fillorder, td->td_fillorder); break; } } #ifdef YCBCR_SUPPORT if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING)) fprintf(fd, " YCbCr Subsampling: %u, %u\n", td->td_ycbcrsubsampling[0], td->td_ycbcrsubsampling[1]); if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) { fprintf(fd, " YCbCr Positioning: "); switch (td->td_ycbcrpositioning) { case YCBCRPOSITION_CENTERED: fprintf(fd, "centered\n"); break; case YCBCRPOSITION_COSITED: fprintf(fd, "cosited\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_ycbcrpositioning, td->td_ycbcrpositioning); break; } } if (TIFFFieldSet(tif,FIELD_YCBCRCOEFFICIENTS)) fprintf(fd, " YCbCr Coefficients: %g, %g, %g\n", td->td_ycbcrcoeffs[0], td->td_ycbcrcoeffs[1], td->td_ycbcrcoeffs[2]); #endif if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS)) fprintf(fd, " Halftone Hints: light %u dark %u\n", td->td_halftonehints[0], td->td_halftonehints[1]); if (TIFFFieldSet(tif,FIELD_ARTIST)) _TIFFprintAsciiTag(fd, "Artist", td->td_artist); if (TIFFFieldSet(tif,FIELD_DATETIME)) _TIFFprintAsciiTag(fd, "Date & Time", td->td_datetime); if (TIFFFieldSet(tif,FIELD_HOSTCOMPUTER)) _TIFFprintAsciiTag(fd, "Host Computer", td->td_hostcomputer); if (TIFFFieldSet(tif,FIELD_SOFTWARE)) _TIFFprintAsciiTag(fd, "Software", td->td_software); if (TIFFFieldSet(tif,FIELD_COPYRIGHT)) _TIFFprintAsciiTag(fd, "Copyright", td->td_copyright); if (TIFFFieldSet(tif,FIELD_DOCUMENTNAME)) _TIFFprintAsciiTag(fd, "Document Name", td->td_documentname); if (TIFFFieldSet(tif,FIELD_IMAGEDESCRIPTION)) _TIFFprintAsciiTag(fd, "Image Description", td->td_imagedescription); if (TIFFFieldSet(tif,FIELD_MAKE)) _TIFFprintAsciiTag(fd, "Make", td->td_make); if (TIFFFieldSet(tif,FIELD_MODEL)) _TIFFprintAsciiTag(fd, "Model", td->td_model); if (TIFFFieldSet(tif,FIELD_ORIENTATION)) { fprintf(fd, " Orientation: "); if (td->td_orientation < NORIENTNAMES) fprintf(fd, "%s\n", orientNames[td->td_orientation]); else fprintf(fd, "%u (0x%x)\n", td->td_orientation, td->td_orientation); } if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL)) fprintf(fd, " Samples/Pixel: %u\n", td->td_samplesperpixel); if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) { fprintf(fd, " Rows/Strip: "); if (td->td_rowsperstrip == (uint32) -1) fprintf(fd, "(infinite)\n"); else fprintf(fd, "%lu\n", (u_long) td->td_rowsperstrip); } if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE)) fprintf(fd, " Min Sample Value: %u\n", td->td_minsamplevalue); if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE)) fprintf(fd, " Max Sample Value: %u\n", td->td_maxsamplevalue); if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE)) fprintf(fd, " SMin Sample Value: %g\n", td->td_sminsamplevalue); if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE)) fprintf(fd, " SMax Sample Value: %g\n", td->td_smaxsamplevalue); if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) { fprintf(fd, " Planar Configuration: "); switch (td->td_planarconfig) { case PLANARCONFIG_CONTIG: fprintf(fd, "single image plane\n"); break; case PLANARCONFIG_SEPARATE: fprintf(fd, "separate image planes\n"); break; default: fprintf(fd, "%u (0x%x)\n", td->td_planarconfig, td->td_planarconfig); break; } } if (TIFFFieldSet(tif,FIELD_PAGENAME)) _TIFFprintAsciiTag(fd, "Page Name", td->td_pagename); if (TIFFFieldSet(tif,FIELD_PAGENUMBER)) fprintf(fd, " Page Number: %u-%u\n", td->td_pagenumber[0], td->td_pagenumber[1]); if (TIFFFieldSet(tif,FIELD_COLORMAP)) { fprintf(fd, " Color Map: "); if (flags & TIFFPRINT_COLORMAP) { fprintf(fd, "\n"); n = 1L<td_bitspersample; for (l = 0; l < n; l++) fprintf(fd, " %5lu: %5u %5u %5u\n", l, td->td_colormap[0][l], td->td_colormap[1][l], td->td_colormap[2][l]); } else fprintf(fd, "(present)\n"); } #ifdef COLORIMETRY_SUPPORT if (TIFFFieldSet(tif,FIELD_WHITEPOINT)) fprintf(fd, " White Point: %g-%g\n", td->td_whitepoint[0], td->td_whitepoint[1]); if (TIFFFieldSet(tif,FIELD_PRIMARYCHROMAS)) fprintf(fd, " Primary Chromaticities: %g,%g %g,%g %g,%g\n", td->td_primarychromas[0], td->td_primarychromas[1], td->td_primarychromas[2], td->td_primarychromas[3], td->td_primarychromas[4], td->td_primarychromas[5]); if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) { fprintf(fd, " Reference Black/White:\n"); for (i = 0; i < td->td_samplesperpixel; i++) fprintf(fd, " %2d: %5g %5g\n", i, td->td_refblackwhite[2*i+0], td->td_refblackwhite[2*i+1]); } if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) { fprintf(fd, " Transfer Function: "); if (flags & TIFFPRINT_CURVES) { fprintf(fd, "\n"); n = 1L<td_bitspersample; for (l = 0; l < n; l++) { fprintf(fd, " %2lu: %5u", l, td->td_transferfunction[0][l]); for (i = 1; i < td->td_samplesperpixel; i++) fprintf(fd, " %5u", td->td_transferfunction[i][l]); fputc('\n', fd); } } else fprintf(fd, "(present)\n"); } #endif #ifdef ICC_SUPPORT if (TIFFFieldSet(tif,FIELD_ICCPROFILE)) fprintf(fd, " ICC Profile: , %lu bytes\n", (u_long) td->td_profileLength); #endif #ifdef PHOTOSHOP_SUPPORT if (TIFFFieldSet(tif,FIELD_PHOTOSHOP)) fprintf(fd, " Photoshop Data: , %lu bytes\n", (u_long) td->td_photoshopLength); #endif #ifdef IPTC_SUPPORT if (TIFFFieldSet(tif,FIELD_RICHTIFFIPTC)) fprintf(fd, " RichTIFFIPTC Data: , %lu bytes\n", (u_long) td->td_richtiffiptcLength); #endif #if SUBIFD_SUPPORT if (TIFFFieldSet(tif, FIELD_SUBIFD)) { fprintf(fd, " SubIFD Offsets:"); for (i = 0; i < td->td_nsubifd; i++) fprintf(fd, " %5lu", (long) td->td_subifd[i]); fputc('\n', fd); } #endif if (tif->tif_printdir) (*tif->tif_printdir)(tif, fd, flags); if ((flags & TIFFPRINT_STRIPS) && TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) { tstrip_t s; fprintf(fd, " %lu %s:\n", (long) td->td_nstrips, isTiled(tif) ? "Tiles" : "Strips"); for (s = 0; s < td->td_nstrips; s++) fprintf(fd, " %3lu: [%8lu, %8lu]\n", (u_long) s, (u_long) td->td_stripoffset[s], (u_long) td->td_stripbytecount[s]); } } void _TIFFprintAscii(FILE* fd, const char* cp) { for (; *cp != '\0'; cp++) { const char* tp; if (isprint(*cp)) { fputc(*cp, fd); continue; } for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++) if (*tp++ == *cp) break; if (*tp) fprintf(fd, "\\%c", *tp); else fprintf(fd, "\\%03o", *cp & 0xff); } } void _TIFFprintAsciiTag(FILE* fd, const char* name, const char* value) { fprintf(fd, " %s: \"", name); _TIFFprintAscii(fd, value); fprintf(fd, "\"\n"); } gamera-3.3.3/src/libtiff/tif_read.c0000644000076500000000000004314110714675674016115 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * Scanline-oriented Read Support */ #include "tiffiop.h" #include #include static int TIFFFillStrip(TIFF*, tstrip_t); static int TIFFFillTile(TIFF*, ttile_t); static int TIFFStartStrip(TIFF*, tstrip_t); static int TIFFStartTile(TIFF*, ttile_t); static int TIFFCheckRead(TIFF*, int); #define NOSTRIP ((tstrip_t) -1) /* undefined state */ #define NOTILE ((ttile_t) -1) /* undefined state */ /* * Seek to a random row+sample in a file. */ static int TIFFSeek(TIFF* tif, uint32 row, tsample_t sample) { register TIFFDirectory *td = &tif->tif_dir; tstrip_t strip; if (row >= td->td_imagelength) { /* out of range */ TIFFError(tif->tif_name, "%lu: Row out of range, max %lu", (u_long) row, (u_long) td->td_imagelength); return (0); } if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { if (sample >= td->td_samplesperpixel) { TIFFError(tif->tif_name, "%lu: Sample out of range, max %lu", (u_long) sample, (u_long) td->td_samplesperpixel); return (0); } strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip; } else strip = row / td->td_rowsperstrip; if (strip != tif->tif_curstrip) { /* different strip, refill */ if (!TIFFFillStrip(tif, strip)) return (0); } else if (row < tif->tif_row) { /* * Moving backwards within the same strip: backup * to the start and then decode forward (below). * * NB: If you're planning on lots of random access within a * strip, it's better to just read and decode the entire * strip, and then access the decoded data in a random fashion. */ if (!TIFFStartStrip(tif, strip)) return (0); } if (row != tif->tif_row) { /* * Seek forward to the desired row. */ if (!(*tif->tif_seek)(tif, row - tif->tif_row)) return (0); tif->tif_row = row; } return (1); } int TIFFReadScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample) { int e; if (!TIFFCheckRead(tif, 0)) return (-1); if( (e = TIFFSeek(tif, row, sample)) != 0) { /* * Decompress desired row into user buffer. */ e = (*tif->tif_decoderow) (tif, (tidata_t) buf, tif->tif_scanlinesize, sample); tif->tif_row++; if (e) (*tif->tif_postdecode)(tif, (tidata_t) buf, tif->tif_scanlinesize); } return (e > 0 ? 1 : -1); } /* * Read a strip of data and decompress the specified * amount into the user-supplied buffer. */ tsize_t TIFFReadEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size) { TIFFDirectory *td = &tif->tif_dir; uint32 nrows; tsize_t stripsize; tstrip_t sep_strip, strips_per_sep; if (!TIFFCheckRead(tif, 0)) return (-1); if (strip >= td->td_nstrips) { TIFFError(tif->tif_name, "%ld: Strip out of range, max %ld", (long) strip, (long) td->td_nstrips); return (-1); } /* * Calculate the strip size according to the number of * rows in the strip (check for truncated last strip on any * of the separations). */ if( td->td_rowsperstrip >= td->td_imagelength ) strips_per_sep = 1; else strips_per_sep = (td->td_imagelength+td->td_rowsperstrip-1) / td->td_rowsperstrip; sep_strip = strip % strips_per_sep; if (sep_strip != strips_per_sep-1 || (nrows = td->td_imagelength % td->td_rowsperstrip) == 0) nrows = td->td_rowsperstrip; stripsize = TIFFVStripSize(tif, nrows); if (size == (tsize_t) -1) size = stripsize; else if (size > stripsize) size = stripsize; if (TIFFFillStrip(tif, strip) && (*tif->tif_decodestrip)(tif, (tidata_t) buf, size, (tsample_t)(strip / td->td_stripsperimage))) { (*tif->tif_postdecode)(tif, (tidata_t) buf, size); return (size); } else return ((tsize_t) -1); } static tsize_t TIFFReadRawStrip1(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size, const char* module) { TIFFDirectory *td = &tif->tif_dir; if (!isMapped(tif)) { tsize_t cc; if (!SeekOK(tif, td->td_stripoffset[strip])) { TIFFError(module, "%s: Seek error at scanline %lu, strip %lu", tif->tif_name, (u_long) tif->tif_row, (u_long) strip); return (-1); } cc = TIFFReadFile(tif, buf, size); if (cc != size) { TIFFError(module, "%s: Read error at scanline %lu; got %lu bytes, expected %lu", tif->tif_name, (u_long) tif->tif_row, (u_long) cc, (u_long) size); return (-1); } } else { if (td->td_stripoffset[strip] + size > tif->tif_size) { TIFFError(module, "%s: Read error at scanline %lu, strip %lu; got %lu bytes, expected %lu", tif->tif_name, (u_long) tif->tif_row, (u_long) strip, (u_long) tif->tif_size - td->td_stripoffset[strip], (u_long) size); return (-1); } _TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[strip], size); } return (size); } /* * Read a strip of data from the file. */ tsize_t TIFFReadRawStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size) { static const char module[] = "TIFFReadRawStrip"; TIFFDirectory *td = &tif->tif_dir; tsize_t bytecount; if (!TIFFCheckRead(tif, 0)) return ((tsize_t) -1); if (strip >= td->td_nstrips) { TIFFError(tif->tif_name, "%lu: Strip out of range, max %lu", (u_long) strip, (u_long) td->td_nstrips); return ((tsize_t) -1); } bytecount = td->td_stripbytecount[strip]; if (bytecount <= 0) { TIFFError(tif->tif_name, "%lu: Invalid strip byte count, strip %lu", (u_long) bytecount, (u_long) strip); return ((tsize_t) -1); } if (size != (tsize_t)-1 && size < bytecount) bytecount = size; return (TIFFReadRawStrip1(tif, strip, buf, bytecount, module)); } /* * Read the specified strip and setup for decoding. * The data buffer is expanded, as necessary, to * hold the strip's data. */ static int TIFFFillStrip(TIFF* tif, tstrip_t strip) { static const char module[] = "TIFFFillStrip"; TIFFDirectory *td = &tif->tif_dir; tsize_t bytecount; bytecount = td->td_stripbytecount[strip]; if (bytecount <= 0) { TIFFError(tif->tif_name, "%lu: Invalid strip byte count, strip %lu", (u_long) bytecount, (u_long) strip); return (0); } if (isMapped(tif) && (isFillOrder(tif, td->td_fillorder) || (tif->tif_flags & TIFF_NOBITREV))) { /* * The image is mapped into memory and we either don't * need to flip bits or the compression routine is going * to handle this operation itself. In this case, avoid * copying the raw data and instead just reference the * data from the memory mapped file image. This assumes * that the decompression routines do not modify the * contents of the raw data buffer (if they try to, * the application will get a fault since the file is * mapped read-only). */ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) _TIFFfree(tif->tif_rawdata); tif->tif_flags &= ~TIFF_MYBUFFER; if ( td->td_stripoffset[strip] + bytecount > tif->tif_size) { /* * This error message might seem strange, but it's * what would happen if a read were done instead. */ TIFFError(module, "%s: Read error on strip %lu; got %lu bytes, expected %lu", tif->tif_name, (u_long) strip, (u_long) tif->tif_size - td->td_stripoffset[strip], (u_long) bytecount); tif->tif_curstrip = NOSTRIP; return (0); } tif->tif_rawdatasize = bytecount; tif->tif_rawdata = tif->tif_base + td->td_stripoffset[strip]; } else { /* * Expand raw data buffer, if needed, to * hold data strip coming from file * (perhaps should set upper bound on * the size of a buffer we'll use?). */ if (bytecount > tif->tif_rawdatasize) { tif->tif_curstrip = NOSTRIP; if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { TIFFError(module, "%s: Data buffer too small to hold strip %lu", tif->tif_name, (u_long) strip); return (0); } if (!TIFFReadBufferSetup(tif, 0, TIFFroundup(bytecount, 1024))) return (0); } if (TIFFReadRawStrip1(tif, strip, (u_char *)tif->tif_rawdata, bytecount, module) != bytecount) return (0); if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits(tif->tif_rawdata, bytecount); } return (TIFFStartStrip(tif, strip)); } /* * Tile-oriented Read Support * Contributed by Nancy Cam (Silicon Graphics). */ /* * Read and decompress a tile of data. The * tile is selected by the (x,y,z,s) coordinates. */ tsize_t TIFFReadTile(TIFF* tif, tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s) { if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s)) return (-1); return (TIFFReadEncodedTile(tif, TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1)); } /* * Read a tile of data and decompress the specified * amount into the user-supplied buffer. */ tsize_t TIFFReadEncodedTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size) { TIFFDirectory *td = &tif->tif_dir; tsize_t tilesize = tif->tif_tilesize; if (!TIFFCheckRead(tif, 1)) return (-1); if (tile >= td->td_nstrips) { TIFFError(tif->tif_name, "%ld: Tile out of range, max %ld", (long) tile, (u_long) td->td_nstrips); return (-1); } if (size == (tsize_t) -1) size = tilesize; else if (size > tilesize) size = tilesize; if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif, (tidata_t) buf, size, (tsample_t)(tile/td->td_stripsperimage))) { (*tif->tif_postdecode)(tif, (tidata_t) buf, size); return (size); } else return (-1); } static tsize_t TIFFReadRawTile1(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size, const char* module) { TIFFDirectory *td = &tif->tif_dir; if (!isMapped(tif)) { tsize_t cc; if (!SeekOK(tif, td->td_stripoffset[tile])) { TIFFError(module, "%s: Seek error at row %ld, col %ld, tile %ld", tif->tif_name, (long) tif->tif_row, (long) tif->tif_col, (long) tile); return ((tsize_t) -1); } cc = TIFFReadFile(tif, buf, size); if (cc != size) { TIFFError(module, "%s: Read error at row %ld, col %ld; got %lu bytes, expected %lu", tif->tif_name, (long) tif->tif_row, (long) tif->tif_col, (u_long) cc, (u_long) size); return ((tsize_t) -1); } } else { if (td->td_stripoffset[tile] + size > tif->tif_size) { TIFFError(module, "%s: Read error at row %ld, col %ld, tile %ld; got %lu bytes, expected %lu", tif->tif_name, (long) tif->tif_row, (long) tif->tif_col, (long) tile, (u_long) tif->tif_size - td->td_stripoffset[tile], (u_long) size); return ((tsize_t) -1); } _TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[tile], size); } return (size); } /* * Read a tile of data from the file. */ tsize_t TIFFReadRawTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size) { static const char module[] = "TIFFReadRawTile"; TIFFDirectory *td = &tif->tif_dir; tsize_t bytecount; if (!TIFFCheckRead(tif, 1)) return ((tsize_t) -1); if (tile >= td->td_nstrips) { TIFFError(tif->tif_name, "%lu: Tile out of range, max %lu", (u_long) tile, (u_long) td->td_nstrips); return ((tsize_t) -1); } bytecount = td->td_stripbytecount[tile]; if (size != (tsize_t) -1 && size < bytecount) bytecount = size; return (TIFFReadRawTile1(tif, tile, buf, bytecount, module)); } /* * Read the specified tile and setup for decoding. * The data buffer is expanded, as necessary, to * hold the tile's data. */ static int TIFFFillTile(TIFF* tif, ttile_t tile) { static const char module[] = "TIFFFillTile"; TIFFDirectory *td = &tif->tif_dir; tsize_t bytecount; bytecount = td->td_stripbytecount[tile]; if (bytecount <= 0) { TIFFError(tif->tif_name, "%lu: Invalid tile byte count, tile %lu", (u_long) bytecount, (u_long) tile); return (0); } if (isMapped(tif) && (isFillOrder(tif, td->td_fillorder) || (tif->tif_flags & TIFF_NOBITREV))) { /* * The image is mapped into memory and we either don't * need to flip bits or the compression routine is going * to handle this operation itself. In this case, avoid * copying the raw data and instead just reference the * data from the memory mapped file image. This assumes * that the decompression routines do not modify the * contents of the raw data buffer (if they try to, * the application will get a fault since the file is * mapped read-only). */ if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) _TIFFfree(tif->tif_rawdata); tif->tif_flags &= ~TIFF_MYBUFFER; if ( td->td_stripoffset[tile] + bytecount > tif->tif_size) { tif->tif_curtile = NOTILE; return (0); } tif->tif_rawdatasize = bytecount; tif->tif_rawdata = tif->tif_base + td->td_stripoffset[tile]; } else { /* * Expand raw data buffer, if needed, to * hold data tile coming from file * (perhaps should set upper bound on * the size of a buffer we'll use?). */ if (bytecount > tif->tif_rawdatasize) { tif->tif_curtile = NOTILE; if ((tif->tif_flags & TIFF_MYBUFFER) == 0) { TIFFError(module, "%s: Data buffer too small to hold tile %ld", tif->tif_name, (long) tile); return (0); } if (!TIFFReadBufferSetup(tif, 0, TIFFroundup(bytecount, 1024))) return (0); } if (TIFFReadRawTile1(tif, tile, (u_char *)tif->tif_rawdata, bytecount, module) != bytecount) return (0); if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits(tif->tif_rawdata, bytecount); } return (TIFFStartTile(tif, tile)); } /* * Setup the raw data buffer in preparation for * reading a strip of raw data. If the buffer * is specified as zero, then a buffer of appropriate * size is allocated by the library. Otherwise, * the client must guarantee that the buffer is * large enough to hold any individual strip of * raw data. */ int TIFFReadBufferSetup(TIFF* tif, tdata_t bp, tsize_t size) { static const char module[] = "TIFFReadBufferSetup"; if (tif->tif_rawdata) { if (tif->tif_flags & TIFF_MYBUFFER) _TIFFfree(tif->tif_rawdata); tif->tif_rawdata = NULL; } if (bp) { tif->tif_rawdatasize = size; tif->tif_rawdata = (tidata_t) bp; tif->tif_flags &= ~TIFF_MYBUFFER; } else { tif->tif_rawdatasize = TIFFroundup(size, 1024); tif->tif_rawdata = (tidata_t) _TIFFmalloc(tif->tif_rawdatasize); tif->tif_flags |= TIFF_MYBUFFER; } if (tif->tif_rawdata == NULL) { TIFFError(module, "%s: No space for data buffer at scanline %ld", tif->tif_name, (long) tif->tif_row); tif->tif_rawdatasize = 0; return (0); } return (1); } /* * Set state to appear as if a * strip has just been read in. */ static int TIFFStartStrip(TIFF* tif, tstrip_t strip) { TIFFDirectory *td = &tif->tif_dir; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupdecode)(tif)) return (0); tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_curstrip = strip; tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; tif->tif_rawcp = tif->tif_rawdata; tif->tif_rawcc = td->td_stripbytecount[strip]; return ((*tif->tif_predecode)(tif, (tsample_t)(strip / td->td_stripsperimage))); } /* * Set state to appear as if a * tile has just been read in. */ static int TIFFStartTile(TIFF* tif, ttile_t tile) { TIFFDirectory *td = &tif->tif_dir; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupdecode)(tif)) return (0); tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_curtile = tile; tif->tif_row = (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth)) * td->td_tilelength; tif->tif_col = (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength)) * td->td_tilewidth; tif->tif_rawcp = tif->tif_rawdata; tif->tif_rawcc = td->td_stripbytecount[tile]; return ((*tif->tif_predecode)(tif, (tsample_t)(tile/td->td_stripsperimage))); } static int TIFFCheckRead(TIFF* tif, int tiles) { if (tif->tif_mode == O_WRONLY) { TIFFError(tif->tif_name, "File not open for reading"); return (0); } if (tiles ^ isTiled(tif)) { TIFFError(tif->tif_name, tiles ? "Can not read tiles from a stripped image" : "Can not read scanlines from a tiled image"); return (0); } return (1); } void _TIFFNoPostDecode(TIFF* tif, tidata_t buf, tsize_t cc) { (void) tif; (void) buf; (void) cc; } void _TIFFSwab16BitData(TIFF* tif, tidata_t buf, tsize_t cc) { (void) tif; assert((cc & 1) == 0); TIFFSwabArrayOfShort((uint16*) buf, cc/2); } void _TIFFSwab32BitData(TIFF* tif, tidata_t buf, tsize_t cc) { (void) tif; assert((cc & 3) == 0); TIFFSwabArrayOfLong((uint32*) buf, cc/4); } void _TIFFSwab64BitData(TIFF* tif, tidata_t buf, tsize_t cc) { (void) tif; assert((cc & 7) == 0); TIFFSwabArrayOfDouble((double*) buf, cc/8); } gamera-3.3.3/src/libtiff/tif_strip.c0000644000076500000000000001274610714675674016352 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Strip-organized Image Support Routines. */ #include "tiffiop.h" /* * Compute which strip a (row,sample) value is in. */ tstrip_t TIFFComputeStrip(TIFF* tif, uint32 row, tsample_t sample) { TIFFDirectory *td = &tif->tif_dir; tstrip_t strip; strip = row / td->td_rowsperstrip; if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { if (sample >= td->td_samplesperpixel) { TIFFError(tif->tif_name, "%u: Sample out of range, max %u", sample, td->td_samplesperpixel); return ((tstrip_t) 0); } strip += sample*td->td_stripsperimage; } return (strip); } /* * Compute how many strips are in an image. */ tstrip_t TIFFNumberOfStrips(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; tstrip_t nstrips; nstrips = (td->td_rowsperstrip == (uint32) -1 ? (td->td_imagelength != 0 ? 1 : 0) : TIFFhowmany(td->td_imagelength, td->td_rowsperstrip)); if (td->td_planarconfig == PLANARCONFIG_SEPARATE) nstrips *= td->td_samplesperpixel; return (nstrips); } /* * Compute the # bytes in a variable height, row-aligned strip. */ tsize_t TIFFVStripSize(TIFF* tif, uint32 nrows) { TIFFDirectory *td = &tif->tif_dir; if (nrows == (uint32) -1) nrows = td->td_imagelength; #ifdef YCBCR_SUPPORT if (td->td_planarconfig == PLANARCONFIG_CONTIG && td->td_photometric == PHOTOMETRIC_YCBCR && !isUpSampled(tif)) { /* * Packed YCbCr data contain one Cb+Cr for every * HorizontalSampling*VerticalSampling Y values. * Must also roundup width and height when calculating * since images that are not a multiple of the * horizontal/vertical subsampling area include * YCbCr data for the extended image. */ tsize_t w = TIFFroundup(td->td_imagewidth, td->td_ycbcrsubsampling[0]); tsize_t scanline = TIFFhowmany(w*td->td_bitspersample, 8); tsize_t samplingarea = td->td_ycbcrsubsampling[0]*td->td_ycbcrsubsampling[1]; nrows = TIFFroundup(nrows, td->td_ycbcrsubsampling[1]); /* NB: don't need TIFFhowmany here 'cuz everything is rounded */ return ((tsize_t) (nrows*scanline + 2*(nrows*scanline / samplingarea))); } else #endif return ((tsize_t)(nrows * TIFFScanlineSize(tif))); } /* * Compute the # bytes in a (row-aligned) strip. * * Note that if RowsPerStrip is larger than the * recorded ImageLength, then the strip size is * truncated to reflect the actual space required * to hold the strip. */ tsize_t TIFFStripSize(TIFF* tif) { TIFFDirectory* td = &tif->tif_dir; uint32 rps = td->td_rowsperstrip; if (rps > td->td_imagelength) rps = td->td_imagelength; return (TIFFVStripSize(tif, rps)); } /* * Compute a default strip size based on the image * characteristics and a requested value. If the * request is <1 then we choose a strip size according * to certain heuristics. */ uint32 TIFFDefaultStripSize(TIFF* tif, uint32 request) { return (*tif->tif_defstripsize)(tif, request); } uint32 _TIFFDefaultStripSize(TIFF* tif, uint32 s) { if ((int32) s < 1) { /* * If RowsPerStrip is unspecified, try to break the * image up into strips that are approximately 8Kbytes. */ tsize_t scanline = TIFFScanlineSize(tif); s = (uint32)(8*1024) / (scanline == 0 ? 1 : scanline); if (s == 0) /* very wide images */ s = 1; } return (s); } /* * Return the number of bytes to read/write in a call to * one of the scanline-oriented i/o routines. Note that * this number may be 1/samples-per-pixel if data is * stored as separate planes. */ tsize_t TIFFScanlineSize(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; tsize_t scanline; scanline = td->td_bitspersample * td->td_imagewidth; if (td->td_planarconfig == PLANARCONFIG_CONTIG) scanline *= td->td_samplesperpixel; return ((tsize_t) TIFFhowmany(scanline, 8)); } /* * Return the number of bytes required to store a complete * decoded and packed raster scanline (as opposed to the * I/O size returned by TIFFScanlineSize which may be less * if data is store as separate planes). */ tsize_t TIFFRasterScanlineSize(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; tsize_t scanline; scanline = td->td_bitspersample * td->td_imagewidth; if (td->td_planarconfig == PLANARCONFIG_CONTIG) { scanline *= td->td_samplesperpixel; return ((tsize_t) TIFFhowmany(scanline, 8)); } else return ((tsize_t) TIFFhowmany(scanline, 8)*td->td_samplesperpixel); } gamera-3.3.3/src/libtiff/tif_swab.c0000644000076500000000000001574310714675674016145 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library Bit & Byte Swapping Support. * * XXX We assume short = 16-bits and long = 32-bits XXX */ #include "tiffiop.h" #ifndef TIFFSwabShort void TIFFSwabShort(uint16* wp) { register u_char* cp = (u_char*) wp; int t; t = cp[1]; cp[1] = cp[0]; cp[0] = t; } #endif #ifndef TIFFSwabLong void TIFFSwabLong(uint32* lp) { register u_char* cp = (u_char*) lp; int t; t = cp[3]; cp[3] = cp[0]; cp[0] = t; t = cp[2]; cp[2] = cp[1]; cp[1] = t; } #endif #ifndef TIFFSwabArrayOfShort void TIFFSwabArrayOfShort(uint16* wp, register u_long n) { register u_char* cp; register int t; /* XXX unroll loop some */ while (n-- > 0) { cp = (u_char*) wp; t = cp[1]; cp[1] = cp[0]; cp[0] = t; wp++; } } #endif #ifndef TIFFSwabArrayOfLong void TIFFSwabArrayOfLong(register uint32* lp, register u_long n) { register unsigned char *cp; register int t; /* XXX unroll loop some */ while (n-- > 0) { cp = (unsigned char *)lp; t = cp[3]; cp[3] = cp[0]; cp[0] = t; t = cp[2]; cp[2] = cp[1]; cp[1] = t; lp++; } } #endif #ifndef TIFFSwabDouble void TIFFSwabDouble(double *dp) { register uint32* lp = (uint32*) dp; uint32 t; TIFFSwabArrayOfLong(lp, 2); t = lp[0]; lp[0] = lp[1]; lp[1] = t; } #endif #ifndef TIFFSwabArrayOfDouble void TIFFSwabArrayOfDouble(double* dp, register u_long n) { register uint32* lp = (uint32*) dp; register uint32 t; TIFFSwabArrayOfLong(lp, n + n); while (n-- > 0) { t = lp[0]; lp[0] = lp[1]; lp[1] = t; lp += 2; } } #endif /* * Bit reversal tables. TIFFBitRevTable[] gives * the bit reversed value of . Used in various * places in the library when the FillOrder requires * bit reversal of byte values (e.g. CCITT Fax 3 * encoding/decoding). TIFFNoBitRevTable is provided * for algorithms that want an equivalent table that * do not reverse bit values. */ static const unsigned char TIFFBitRevTable[256] = { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff }; static const unsigned char TIFFNoBitRevTable[256] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, }; const unsigned char* TIFFGetBitRevTable(int reversed) { return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable); } void TIFFReverseBits(register u_char* cp, register u_long n) { for (; n > 8; n -= 8) { cp[0] = TIFFBitRevTable[cp[0]]; cp[1] = TIFFBitRevTable[cp[1]]; cp[2] = TIFFBitRevTable[cp[2]]; cp[3] = TIFFBitRevTable[cp[3]]; cp[4] = TIFFBitRevTable[cp[4]]; cp[5] = TIFFBitRevTable[cp[5]]; cp[6] = TIFFBitRevTable[cp[6]]; cp[7] = TIFFBitRevTable[cp[7]]; cp += 8; } while (n-- > 0) *cp = TIFFBitRevTable[*cp], cp++; } gamera-3.3.3/src/libtiff/tif_thunder.c0000644000076500000000000001121610714675674016651 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef THUNDER_SUPPORT /* * TIFF Library. * * ThunderScan 4-bit Compression Algorithm Support */ /* * ThunderScan uses an encoding scheme designed for * 4-bit pixel values. Data is encoded in bytes, with * each byte split into a 2-bit code word and a 6-bit * data value. The encoding gives raw data, runs of * pixels, or pixel values encoded as a delta from the * previous pixel value. For the latter, either 2-bit * or 3-bit delta values are used, with the deltas packed * into a single byte. */ #define THUNDER_DATA 0x3f /* mask for 6-bit data */ #define THUNDER_CODE 0xc0 /* mask for 2-bit code word */ /* code values */ #define THUNDER_RUN 0x00 /* run of pixels w/ encoded count */ #define THUNDER_2BITDELTAS 0x40 /* 3 pixels w/ encoded 2-bit deltas */ #define DELTA2_SKIP 2 /* skip code for 2-bit deltas */ #define THUNDER_3BITDELTAS 0x80 /* 2 pixels w/ encoded 3-bit deltas */ #define DELTA3_SKIP 4 /* skip code for 3-bit deltas */ #define THUNDER_RAW 0xc0 /* raw data encoded */ static const int twobitdeltas[4] = { 0, 1, 0, -1 }; static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 }; #define SETPIXEL(op, v) { \ lastpixel = (v) & 0xf; \ if (npixels++ & 1) \ *op++ |= lastpixel; \ else \ op[0] = lastpixel << 4; \ } static int ThunderDecode(TIFF* tif, tidata_t op, tsize_t maxpixels) { register u_char *bp; register tsize_t cc; u_int lastpixel; tsize_t npixels; bp = (u_char *)tif->tif_rawcp; cc = tif->tif_rawcc; lastpixel = 0; npixels = 0; while (cc > 0 && npixels < maxpixels) { int n, delta; n = *bp++, cc--; switch (n & THUNDER_CODE) { case THUNDER_RUN: /* pixel run */ /* * Replicate the last pixel n times, * where n is the lower-order 6 bits. */ if (npixels & 1) { op[0] |= lastpixel; lastpixel = *op++; npixels++; n--; } else lastpixel |= lastpixel << 4; npixels += n; for (; n > 0; n -= 2) *op++ = lastpixel; if (n == -1) *--op &= 0xf0; lastpixel &= 0xf; break; case THUNDER_2BITDELTAS: /* 2-bit deltas */ if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP) SETPIXEL(op, lastpixel + twobitdeltas[delta]); if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP) SETPIXEL(op, lastpixel + twobitdeltas[delta]); if ((delta = (n & 3)) != DELTA2_SKIP) SETPIXEL(op, lastpixel + twobitdeltas[delta]); break; case THUNDER_3BITDELTAS: /* 3-bit deltas */ if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP) SETPIXEL(op, lastpixel + threebitdeltas[delta]); if ((delta = (n & 7)) != DELTA3_SKIP) SETPIXEL(op, lastpixel + threebitdeltas[delta]); break; case THUNDER_RAW: /* raw data */ SETPIXEL(op, n); break; } } tif->tif_rawcp = (tidata_t) bp; tif->tif_rawcc = cc; if (npixels != maxpixels) { TIFFError(tif->tif_name, "ThunderDecode: %s data at scanline %ld (%lu != %lu)", npixels < maxpixels ? "Not enough" : "Too much", (long) tif->tif_row, (long) npixels, (long) maxpixels); return (0); } return (1); } static int ThunderDecodeRow(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s) { tidata_t row = buf; (void) s; while ((long)occ > 0) { if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth)) return (0); occ -= tif->tif_scanlinesize; row += tif->tif_scanlinesize; } return (1); } int TIFFInitThunderScan(TIFF* tif, int scheme) { (void) scheme; tif->tif_decoderow = ThunderDecodeRow; tif->tif_decodestrip = ThunderDecodeRow; return (1); } #endif /* THUNDER_SUPPORT */ gamera-3.3.3/src/libtiff/tif_tile.c0000644000076500000000000001377610714675674016152 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1991-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Tiled Image Support Routines. */ #include "tiffiop.h" /* * Compute which tile an (x,y,z,s) value is in. */ ttile_t TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s) { TIFFDirectory *td = &tif->tif_dir; uint32 dx = td->td_tilewidth; uint32 dy = td->td_tilelength; uint32 dz = td->td_tiledepth; ttile_t tile = 1; if (td->td_imagedepth == 1) z = 0; if (dx == (uint32) -1) dx = td->td_imagewidth; if (dy == (uint32) -1) dy = td->td_imagelength; if (dz == (uint32) -1) dz = td->td_imagedepth; if (dx != 0 && dy != 0 && dz != 0) { uint32 xpt = TIFFhowmany(td->td_imagewidth, dx); uint32 ypt = TIFFhowmany(td->td_imagelength, dy); uint32 zpt = TIFFhowmany(td->td_imagedepth, dz); if (td->td_planarconfig == PLANARCONFIG_SEPARATE) tile = (xpt*ypt*zpt)*s + (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx; else tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx + s; } return (tile); } /* * Check an (x,y,z,s) coordinate * against the image bounds. */ int TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s) { TIFFDirectory *td = &tif->tif_dir; if (x >= td->td_imagewidth) { TIFFError(tif->tif_name, "Col %ld out of range, max %lu", (long) x, (u_long) td->td_imagewidth); return (0); } if (y >= td->td_imagelength) { TIFFError(tif->tif_name, "Row %ld out of range, max %lu", (long) y, (u_long) td->td_imagelength); return (0); } if (z >= td->td_imagedepth) { TIFFError(tif->tif_name, "Depth %ld out of range, max %lu", (long) z, (u_long) td->td_imagedepth); return (0); } if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s >= td->td_samplesperpixel) { TIFFError(tif->tif_name, "Sample %d out of range, max %u", (int) s, td->td_samplesperpixel); return (0); } return (1); } /* * Compute how many tiles are in an image. */ ttile_t TIFFNumberOfTiles(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; uint32 dx = td->td_tilewidth; uint32 dy = td->td_tilelength; uint32 dz = td->td_tiledepth; ttile_t ntiles; if (dx == (uint32) -1) dx = td->td_imagewidth; if (dy == (uint32) -1) dy = td->td_imagelength; if (dz == (uint32) -1) dz = td->td_imagedepth; ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 : (TIFFhowmany(td->td_imagewidth, dx) * TIFFhowmany(td->td_imagelength, dy) * TIFFhowmany(td->td_imagedepth, dz)); if (td->td_planarconfig == PLANARCONFIG_SEPARATE) ntiles *= td->td_samplesperpixel; return (ntiles); } /* * Compute the # bytes in each row of a tile. */ tsize_t TIFFTileRowSize(TIFF* tif) { TIFFDirectory *td = &tif->tif_dir; tsize_t rowsize; if (td->td_tilelength == 0 || td->td_tilewidth == 0) return ((tsize_t) 0); rowsize = td->td_bitspersample * td->td_tilewidth; if (td->td_planarconfig == PLANARCONFIG_CONTIG) rowsize *= td->td_samplesperpixel; return ((tsize_t) TIFFhowmany(rowsize, 8)); } /* * Compute the # bytes in a variable length, row-aligned tile. */ tsize_t TIFFVTileSize(TIFF* tif, uint32 nrows) { TIFFDirectory *td = &tif->tif_dir; tsize_t tilesize; if (td->td_tilelength == 0 || td->td_tilewidth == 0 || td->td_tiledepth == 0) return ((tsize_t) 0); #ifdef YCBCR_SUPPORT if (td->td_planarconfig == PLANARCONFIG_CONTIG && td->td_photometric == PHOTOMETRIC_YCBCR && !isUpSampled(tif)) { /* * Packed YCbCr data contain one Cb+Cr for every * HorizontalSampling*VerticalSampling Y values. * Must also roundup width and height when calculating * since images that are not a multiple of the * horizontal/vertical subsampling area include * YCbCr data for the extended image. */ tsize_t w = TIFFroundup(td->td_tilewidth, td->td_ycbcrsubsampling[0]); tsize_t rowsize = TIFFhowmany(w*td->td_bitspersample, 8); tsize_t samplingarea = td->td_ycbcrsubsampling[0]*td->td_ycbcrsubsampling[1]; nrows = TIFFroundup(nrows, td->td_ycbcrsubsampling[1]); /* NB: don't need TIFFhowmany here 'cuz everything is rounded */ tilesize = nrows*rowsize + 2*(nrows*rowsize / samplingarea); } else #endif tilesize = nrows * TIFFTileRowSize(tif); return ((tsize_t)(tilesize * td->td_tiledepth)); } /* * Compute the # bytes in a row-aligned tile. */ tsize_t TIFFTileSize(TIFF* tif) { return (TIFFVTileSize(tif, tif->tif_dir.td_tilelength)); } /* * Compute a default tile size based on the image * characteristics and a requested value. If a * request is <1 then we choose a size according * to certain heuristics. */ void TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) { (*tif->tif_deftilesize)(tif, tw, th); } void _TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th) { (void) tif; if (*(int32*) tw < 1) *tw = 256; if (*(int32*) th < 1) *th = 256; /* roundup to a multiple of 16 per the spec */ if (*tw & 0xf) *tw = TIFFroundup(*tw, 16); if (*th & 0xf) *th = TIFFroundup(*th, 16); } gamera-3.3.3/src/libtiff/tif_unix.c0000644000076500000000000001144410714675674016166 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library UNIX-specific Routines. */ #include "tiffiop.h" #include #include #include static tsize_t _tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) { return ((tsize_t) read((int) fd, buf, (size_t) size)); } static tsize_t _tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) { return ((tsize_t) write((int) fd, buf, (size_t) size)); } static toff_t _tiffSeekProc(thandle_t fd, toff_t off, int whence) { #if USE_64BIT_API == 1 return ((toff_t) lseek64((int) fd, (off64_t) off, whence)); #else return ((toff_t) lseek((int) fd, (off_t) off, whence)); #endif } static int _tiffCloseProc(thandle_t fd) { return (close((int) fd)); } #include static toff_t _tiffSizeProc(thandle_t fd) { #ifdef _AM29K long fsize; return ((fsize = lseek((int) fd, 0, SEEK_END)) < 0 ? 0 : fsize); #else #if USE_64BIT_API == 1 struct stat64 sb; return (toff_t) (fstat64((int) fd, &sb) < 0 ? 0 : sb.st_size); #else struct stat sb; return (toff_t) (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size); #endif #endif } #ifdef HAVE_MMAP #include static int _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) { toff_t size = _tiffSizeProc(fd); if (size != (toff_t) -1) { *pbase = (tdata_t) mmap(0, size, PROT_READ, MAP_SHARED, (int) fd, 0); if (*pbase != (tdata_t) -1) { *psize = size; return (1); } } return (0); } static void _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) { (void) fd; (void) munmap(base, (off_t) size); } #else /* !HAVE_MMAP */ static int _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) { (void) fd; (void) pbase; (void) psize; return (0); } static void _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) { (void) fd; (void) base; (void) size; } #endif /* !HAVE_MMAP */ /* * Open a TIFF file descriptor for read/writing. */ TIFF* TIFFFdOpen(int fd, const char* name, const char* mode) { TIFF* tif; tif = TIFFClientOpen(name, mode, (thandle_t) fd, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, _tiffMapProc, _tiffUnmapProc); if (tif) tif->tif_fd = fd; return (tif); } /* * Open a TIFF file for read/writing. */ TIFF* TIFFOpen(const char* name, const char* mode) { static const char module[] = "TIFFOpen"; int m, fd; m = _TIFFgetMode(mode, module); if (m == -1) return ((TIFF*)0); /* for cygwin */ #ifdef O_BINARY m |= O_BINARY; #endif #ifdef _AM29K fd = open(name, m); #else fd = open(name, m, 0666); #endif if (fd < 0) { TIFFError(module, "%s: Cannot open", name); return ((TIFF *)0); } return (TIFFFdOpen(fd, name, mode)); } void* _TIFFmalloc(tsize_t s) { return (malloc((size_t) s)); } void _TIFFfree(tdata_t p) { free(p); } void* _TIFFrealloc(tdata_t p, tsize_t s) { return (realloc(p, (size_t) s)); } void _TIFFmemset(tdata_t p, int v, tsize_t c) { memset(p, v, (size_t) c); } void _TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c) { memcpy(d, s, (size_t) c); } int _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) { return (memcmp(p1, p2, (size_t) c)); } static void unixWarningHandler(const char* module, const char* fmt, va_list ap) { if (module != NULL) fprintf(stderr, "%s: ", module); fprintf(stderr, "Warning, "); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); } TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler; static void unixErrorHandler(const char* module, const char* fmt, va_list ap) { if (module != NULL) fprintf(stderr, "%s: ", module); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); } TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler; gamera-3.3.3/src/libtiff/tif_version.c0000644000076500000000000000253010714675674016664 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1992-1997 Sam Leffler * Copyright (c) 1992-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" static const char TIFFVersion[] = TIFFLIB_VERSION_STR; const char* TIFFGetVersion(void) { return (TIFFVersion); } gamera-3.3.3/src/libtiff/tif_warning.c0000644000076500000000000000313410714675674016645 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. */ #include "tiffiop.h" TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler handler) { TIFFErrorHandler prev = _TIFFwarningHandler; _TIFFwarningHandler = handler; return (prev); } void TIFFWarning(const char* module, const char* fmt, ...) { if (_TIFFwarningHandler) { va_list ap; va_start(ap, fmt); (*_TIFFwarningHandler)(module, fmt, ap); va_end(ap); } } gamera-3.3.3/src/libtiff/tif_win32.c0000644000076500000000000001753210714675674016151 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library Win32-specific Routines. Adapted from tif_unix.c 4/5/95 by * Scott Wagner (wagner@itek.com), Itek Graphix, Rochester, NY USA */ #include #include "tiffiop.h" static tsize_t _tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size) { DWORD dwSizeRead; if (!ReadFile(fd, buf, size, &dwSizeRead, NULL)) return(0); return ((tsize_t) dwSizeRead); } static tsize_t _tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size) { DWORD dwSizeWritten; if (!WriteFile(fd, buf, size, &dwSizeWritten, NULL)) return(0); return ((tsize_t) dwSizeWritten); } static toff_t _tiffSeekProc(thandle_t fd, toff_t off, int whence) { DWORD dwMoveMethod, dwMoveHigh; /* we use this as a special code, so avoid accepting it */ if( off == 0xFFFFFFFF ) return 0xFFFFFFFF; switch(whence) { case SEEK_SET: dwMoveMethod = FILE_BEGIN; break; case SEEK_CUR: dwMoveMethod = FILE_CURRENT; break; case SEEK_END: dwMoveMethod = FILE_END; break; default: dwMoveMethod = FILE_BEGIN; break; } dwMoveHigh = 0; return ((toff_t)SetFilePointer(fd, (LONG) off, (PLONG)&dwMoveHigh, dwMoveMethod)); } static int _tiffCloseProc(thandle_t fd) { return (CloseHandle(fd) ? 0 : -1); } static toff_t _tiffSizeProc(thandle_t fd) { return ((toff_t)GetFileSize(fd, NULL)); } #ifdef __BORLANDC__ #pragma argsused #endif static int _tiffDummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) { return (0); } /* * From "Hermann Josef Hill" : * * Windows uses both a handle and a pointer for file mapping, * but according to the SDK documentation and Richter's book * "Advanced Windows Programming" it is safe to free the handle * after obtaining the file mapping pointer * * This removes a nasty OS dependency and cures a problem * with Visual C++ 5.0 */ static int _tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) { toff_t size; HANDLE hMapFile; if ((size = _tiffSizeProc(fd)) == 0xFFFFFFFF) return (0); hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, size, NULL); if (hMapFile == NULL) return (0); *pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); CloseHandle(hMapFile); if (*pbase == NULL) return (0); *psize = size; return(1); } #ifdef __BORLANDC__ #pragma argsused #endif static void _tiffDummyUnmapProc(thandle_t fd, tdata_t base, toff_t size) { } static void _tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size) { UnmapViewOfFile(base); } /* * Open a TIFF file descriptor for read/writing. * Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode * string, which forces the file to be opened unmapped. */ TIFF* TIFFFdOpen(int ifd, const char* name, const char* mode) { TIFF* tif; BOOL fSuppressMap = (mode[1] == 'u' || (mode[1]!=0 && mode[2] == 'u')); tif = TIFFClientOpen(name, mode, (thandle_t)ifd, _tiffReadProc, _tiffWriteProc, _tiffSeekProc, _tiffCloseProc, _tiffSizeProc, fSuppressMap ? _tiffDummyMapProc : _tiffMapProc, fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc); if (tif) tif->tif_fd = ifd; return (tif); } /* * Open a TIFF file for read/writing. */ TIFF* TIFFOpen(const char* name, const char* mode) { static const char module[] = "TIFFOpen"; thandle_t fd; int m; DWORD dwMode; m = _TIFFgetMode(mode, module); switch(m) { case O_RDONLY: dwMode = OPEN_EXISTING; break; case O_RDWR: dwMode = OPEN_ALWAYS; break; case O_RDWR|O_CREAT: dwMode = OPEN_ALWAYS; break; case O_RDWR|O_TRUNC: dwMode = CREATE_ALWAYS; break; case O_RDWR|O_CREAT|O_TRUNC: dwMode = CREATE_ALWAYS; break; default: return ((TIFF*)0); } fd = (thandle_t)CreateFile(name, (m == O_RDONLY) ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE), FILE_SHARE_READ, NULL, dwMode, (m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL, NULL); if (fd == INVALID_HANDLE_VALUE) { TIFFError(module, "%s: Cannot open", name); return ((TIFF *)0); } return (TIFFFdOpen((int)fd, name, mode)); } tdata_t _TIFFmalloc(tsize_t s) { return ((tdata_t)GlobalAlloc(GMEM_FIXED, s)); } void _TIFFfree(tdata_t p) { GlobalFree(p); return; } tdata_t _TIFFrealloc(tdata_t p, tsize_t s) { void* pvTmp; tsize_t old=GlobalSize(p); if (old>=s) { if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) { CopyMemory(pvTmp, p, s); GlobalFree(p); } } else { if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) { CopyMemory(pvTmp, p, old); GlobalFree(p); } } return ((tdata_t)pvTmp); } void _TIFFmemset(void* p, int v, tsize_t c) { FillMemory(p, c, (BYTE)v); } void _TIFFmemcpy(void* d, const tdata_t s, tsize_t c) { CopyMemory(d, s, c); } int _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) { register const BYTE *pb1 = (const BYTE *) p1; register const BYTE *pb2 = (const BYTE *) p2; register DWORD dwTmp = c; register int iTmp; for (iTmp = 0; dwTmp-- && !iTmp; iTmp = (int)*pb1++ - (int)*pb2++) ; return (iTmp); } static void Win32WarningHandler(const char* module, const char* fmt, va_list ap) { #define TIF_PLATFORM_CONSOLE #ifndef TIF_PLATFORM_CONSOLE LPTSTR szTitle; LPTSTR szTmp; LPCTSTR szTitleText = "%s Warning"; LPCTSTR szDefaultModule = "TIFFLIB"; szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module; if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) + lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL) return; wsprintf(szTitle, szTitleText, szTmp); szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR); wvsprintf(szTmp, fmt, ap); MessageBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION); LocalFree(szTitle); return; #else if (module != NULL) fprintf(stderr, "%s: ", module); fprintf(stderr, "Warning, "); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); #endif } TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler; static void Win32ErrorHandler(const char* module, const char* fmt, va_list ap) { #ifndef TIF_PLATFORM_CONSOLE LPTSTR szTitle; LPTSTR szTmp; LPCTSTR szTitleText = "%s Error"; LPCTSTR szDefaultModule = "TIFFLIB"; szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module; if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) + lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL) return; wsprintf(szTitle, szTitleText, szTmp); szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR); wvsprintf(szTmp, fmt, ap); MessageBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION); LocalFree(szTitle); return; #else if (module != NULL) fprintf(stderr, "%s: ", module); vfprintf(stderr, fmt, ap); fprintf(stderr, ".\n"); #endif } TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler; gamera-3.3.3/src/libtiff/tif_write.c0000644000076500000000000004722310714675674016341 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ /* * TIFF Library. * * Scanline-oriented Write Support */ #include "tiffiop.h" #include #include #define REWRITE_HACK #define STRIPINCR 20 /* expansion factor on strip array */ #define WRITECHECKSTRIPS(tif, module) \ (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),0,module)) #define WRITECHECKTILES(tif, module) \ (((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),1,module)) #define BUFFERCHECK(tif) \ ((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) || \ TIFFWriteBufferSetup((tif), NULL, (tsize_t) -1)) static int TIFFGrowStrips(TIFF*, int, const char*); static int TIFFAppendToStrip(TIFF*, tstrip_t, tidata_t, tsize_t); static int TIFFSetupStrips(TIFF*); int TIFFWriteScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample) { static const char module[] = "TIFFWriteScanline"; register TIFFDirectory *td; int status, imagegrew = 0; tstrip_t strip; if (!WRITECHECKSTRIPS(tif, module)) return (-1); /* * Handle delayed allocation of data buffer. This * permits it to be sized more intelligently (using * directory information). */ if (!BUFFERCHECK(tif)) return (-1); td = &tif->tif_dir; /* * Extend image length if needed * (but only for PlanarConfig=1). */ if (row >= td->td_imagelength) { /* extend image */ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { TIFFError(tif->tif_name, "Can not change \"ImageLength\" when using separate planes"); return (-1); } td->td_imagelength = row+1; imagegrew = 1; } /* * Calculate strip and check for crossings. */ if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { if (sample >= td->td_samplesperpixel) { TIFFError(tif->tif_name, "%d: Sample out of range, max %d", sample, td->td_samplesperpixel); return (-1); } strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip; } else strip = row / td->td_rowsperstrip; if (strip != tif->tif_curstrip) { /* * Changing strips -- flush any data present. */ if (!TIFFFlushData(tif)) return (-1); tif->tif_curstrip = strip; /* * Watch out for a growing image. The value of * strips/image will initially be 1 (since it * can't be deduced until the imagelength is known). */ if (strip >= td->td_stripsperimage && imagegrew) td->td_stripsperimage = TIFFhowmany(td->td_imagelength,td->td_rowsperstrip); tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupencode)(tif)) return (-1); tif->tif_flags |= TIFF_CODERSETUP; } if (!(*tif->tif_preencode)(tif, sample)) return (-1); tif->tif_flags |= TIFF_POSTENCODE; } /* * Check strip array to make sure there's space. * We don't support dynamically growing files that * have data organized in separate bitplanes because * it's too painful. In that case we require that * the imagelength be set properly before the first * write (so that the strips array will be fully * allocated above). */ if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module)) return (-1); /* * Ensure the write is either sequential or at the * beginning of a strip (or that we can randomly * access the data -- i.e. no encoding). */ if (row != tif->tif_row) { if (row < tif->tif_row) { /* * Moving backwards within the same strip: * backup to the start and then decode * forward (below). */ tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; tif->tif_rawcp = tif->tif_rawdata; } /* * Seek forward to the desired row. */ if (!(*tif->tif_seek)(tif, row - tif->tif_row)) return (-1); tif->tif_row = row; } status = (*tif->tif_encoderow)(tif, (tidata_t) buf, tif->tif_scanlinesize, sample); tif->tif_row++; return (status); } /* * Encode the supplied data and write it to the * specified strip. There must be space for the * data; we don't check if strips overlap! * * NB: Image length must be setup before writing. */ tsize_t TIFFWriteEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc) { static const char module[] = "TIFFWriteEncodedStrip"; TIFFDirectory *td = &tif->tif_dir; tsample_t sample; if (!WRITECHECKSTRIPS(tif, module)) return ((tsize_t) -1); /* * Check strip array to make sure there's space. * We don't support dynamically growing files that * have data organized in separate bitplanes because * it's too painful. In that case we require that * the imagelength be set properly before the first * write (so that the strips array will be fully * allocated above). */ if (strip >= td->td_nstrips) { if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { TIFFError(tif->tif_name, "Can not grow image by strips when using separate planes"); return ((tsize_t) -1); } if (!TIFFGrowStrips(tif, 1, module)) return ((tsize_t) -1); td->td_stripsperimage = TIFFhowmany(td->td_imagelength, td->td_rowsperstrip); } /* * Handle delayed allocation of data buffer. This * permits it to be sized according to the directory * info. */ if (!BUFFERCHECK(tif)) return ((tsize_t) -1); tif->tif_curstrip = strip; tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupencode)(tif)) return ((tsize_t) -1); tif->tif_flags |= TIFF_CODERSETUP; } #ifdef REWRITE_HACK tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; if( td->td_stripbytecount[strip] > 0 ) { /* if we are writing over existing tiles, zero length. */ td->td_stripbytecount[strip] = 0; /* this forces TIFFAppendToStrip() to do a seek */ tif->tif_curoff = 0; } #endif tif->tif_flags &= ~TIFF_POSTENCODE; sample = (tsample_t)(strip / td->td_stripsperimage); if (!(*tif->tif_preencode)(tif, sample)) return ((tsize_t) -1); if (!(*tif->tif_encodestrip)(tif, (tidata_t) data, cc, sample)) return ((tsize_t) 0); if (!(*tif->tif_postencode)(tif)) return ((tsize_t) -1); if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits(tif->tif_rawdata, tif->tif_rawcc); if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, strip, tif->tif_rawdata, tif->tif_rawcc)) return ((tsize_t) -1); tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; return (cc); } /* * Write the supplied data to the specified strip. * There must be space for the data; we don't check * if strips overlap! * * NB: Image length must be setup before writing. */ tsize_t TIFFWriteRawStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc) { static const char module[] = "TIFFWriteRawStrip"; TIFFDirectory *td = &tif->tif_dir; if (!WRITECHECKSTRIPS(tif, module)) return ((tsize_t) -1); /* * Check strip array to make sure there's space. * We don't support dynamically growing files that * have data organized in separate bitplanes because * it's too painful. In that case we require that * the imagelength be set properly before the first * write (so that the strips array will be fully * allocated above). */ if (strip >= td->td_nstrips) { if (td->td_planarconfig == PLANARCONFIG_SEPARATE) { TIFFError(tif->tif_name, "Can not grow image by strips when using separate planes"); return ((tsize_t) -1); } /* * Watch out for a growing image. The value of * strips/image will initially be 1 (since it * can't be deduced until the imagelength is known). */ if (strip >= td->td_stripsperimage) td->td_stripsperimage = TIFFhowmany(td->td_imagelength,td->td_rowsperstrip); if (!TIFFGrowStrips(tif, 1, module)) return ((tsize_t) -1); } tif->tif_curstrip = strip; tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip; return (TIFFAppendToStrip(tif, strip, (tidata_t) data, cc) ? cc : (tsize_t) -1); } /* * Write and compress a tile of data. The * tile is selected by the (x,y,z,s) coordinates. */ tsize_t TIFFWriteTile(TIFF* tif, tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s) { if (!TIFFCheckTile(tif, x, y, z, s)) return (-1); /* * NB: A tile size of -1 is used instead of tif_tilesize knowing * that TIFFWriteEncodedTile will clamp this to the tile size. * This is done because the tile size may not be defined until * after the output buffer is setup in TIFFWriteBufferSetup. */ return (TIFFWriteEncodedTile(tif, TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1)); } /* * Encode the supplied data and write it to the * specified tile. There must be space for the * data. The function clamps individual writes * to a tile to the tile size, but does not (and * can not) check that multiple writes to the same * tile do not write more than tile size data. * * NB: Image length must be setup before writing; this * interface does not support automatically growing * the image on each write (as TIFFWriteScanline does). */ tsize_t TIFFWriteEncodedTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc) { static const char module[] = "TIFFWriteEncodedTile"; TIFFDirectory *td; tsample_t sample; if (!WRITECHECKTILES(tif, module)) return ((tsize_t) -1); td = &tif->tif_dir; if (tile >= td->td_nstrips) { TIFFError(module, "%s: Tile %lu out of range, max %lu", tif->tif_name, (u_long) tile, (u_long) td->td_nstrips); return ((tsize_t) -1); } /* * Handle delayed allocation of data buffer. This * permits it to be sized more intelligently (using * directory information). */ if (!BUFFERCHECK(tif)) return ((tsize_t) -1); tif->tif_curtile = tile; #ifdef REWRITE_HACK tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; if( td->td_stripbytecount[tile] > 0 ) { /* if we are writing over existing tiles, zero length. */ td->td_stripbytecount[tile] = 0; /* this forces TIFFAppendToStrip() to do a seek */ tif->tif_curoff = 0; } #endif /* * Compute tiles per row & per column to compute * current row and column */ tif->tif_row = (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength)) * td->td_tilelength; tif->tif_col = (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth)) * td->td_tilewidth; if ((tif->tif_flags & TIFF_CODERSETUP) == 0) { if (!(*tif->tif_setupencode)(tif)) return ((tsize_t) -1); tif->tif_flags |= TIFF_CODERSETUP; } tif->tif_flags &= ~TIFF_POSTENCODE; sample = (tsample_t)(tile/td->td_stripsperimage); if (!(*tif->tif_preencode)(tif, sample)) return ((tsize_t) -1); /* * Clamp write amount to the tile size. This is mostly * done so that callers can pass in some large number * (e.g. -1) and have the tile size used instead. */ if ( cc < 1 || cc > tif->tif_tilesize) cc = tif->tif_tilesize; if (!(*tif->tif_encodetile)(tif, (tidata_t) data, cc, sample)) return ((tsize_t) 0); if (!(*tif->tif_postencode)(tif)) return ((tsize_t) -1); if (!isFillOrder(tif, td->td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits((u_char *)tif->tif_rawdata, tif->tif_rawcc); if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, tile, tif->tif_rawdata, tif->tif_rawcc)) return ((tsize_t) -1); tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; return (cc); } /* * Write the supplied data to the specified strip. * There must be space for the data; we don't check * if strips overlap! * * NB: Image length must be setup before writing; this * interface does not support automatically growing * the image on each write (as TIFFWriteScanline does). */ tsize_t TIFFWriteRawTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc) { static const char module[] = "TIFFWriteRawTile"; if (!WRITECHECKTILES(tif, module)) return ((tsize_t) -1); if (tile >= tif->tif_dir.td_nstrips) { TIFFError(module, "%s: Tile %lu out of range, max %lu", tif->tif_name, (u_long) tile, (u_long) tif->tif_dir.td_nstrips); return ((tsize_t) -1); } return (TIFFAppendToStrip(tif, tile, (tidata_t) data, cc) ? cc : (tsize_t) -1); } #define isUnspecified(tif, f) \ (TIFFFieldSet(tif,f) && (tif)->tif_dir.td_imagelength == 0) static int TIFFSetupStrips(TIFF* tif) { TIFFDirectory* td = &tif->tif_dir; if (isTiled(tif)) td->td_stripsperimage = isUnspecified(tif, FIELD_TILEDIMENSIONS) ? td->td_samplesperpixel : TIFFNumberOfTiles(tif); else td->td_stripsperimage = isUnspecified(tif, FIELD_ROWSPERSTRIP) ? td->td_samplesperpixel : TIFFNumberOfStrips(tif); td->td_nstrips = td->td_stripsperimage; if (td->td_planarconfig == PLANARCONFIG_SEPARATE) td->td_stripsperimage /= td->td_samplesperpixel; td->td_stripoffset = (uint32 *) _TIFFmalloc(td->td_nstrips * sizeof (uint32)); td->td_stripbytecount = (uint32 *) _TIFFmalloc(td->td_nstrips * sizeof (uint32)); if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL) return (0); /* * Place data at the end-of-file * (by setting offsets to zero). */ _TIFFmemset(td->td_stripoffset, 0, td->td_nstrips*sizeof (uint32)); _TIFFmemset(td->td_stripbytecount, 0, td->td_nstrips*sizeof (uint32)); TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS); TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS); return (1); } #undef isUnspecified /* * Verify file is writable and that the directory * information is setup properly. In doing the latter * we also "freeze" the state of the directory so * that important information is not changed. */ int TIFFWriteCheck(TIFF* tif, int tiles, const char* module) { if (tif->tif_mode == O_RDONLY) { TIFFError(module, "%s: File not open for writing", tif->tif_name); return (0); } if (tiles ^ isTiled(tif)) { TIFFError(tif->tif_name, tiles ? "Can not write tiles to a stripped image" : "Can not write scanlines to a tiled image"); return (0); } /* * On the first write verify all the required information * has been setup and initialize any data structures that * had to wait until directory information was set. * Note that a lot of our work is assumed to remain valid * because we disallow any of the important parameters * from changing after we start writing (i.e. once * TIFF_BEENWRITING is set, TIFFSetField will only allow * the image's length to be changed). */ if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) { TIFFError(module, "%s: Must set \"ImageWidth\" before writing data", tif->tif_name); return (0); } if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) { TIFFError(module, "%s: Must set \"PlanarConfiguration\" before writing data", tif->tif_name); return (0); } if (tif->tif_dir.td_stripoffset == NULL && !TIFFSetupStrips(tif)) { tif->tif_dir.td_nstrips = 0; TIFFError(module, "%s: No space for %s arrays", tif->tif_name, isTiled(tif) ? "tile" : "strip"); return (0); } tif->tif_tilesize = TIFFTileSize(tif); tif->tif_scanlinesize = TIFFScanlineSize(tif); tif->tif_flags |= TIFF_BEENWRITING; return (1); } /* * Setup the raw data buffer used for encoding. */ int TIFFWriteBufferSetup(TIFF* tif, tdata_t bp, tsize_t size) { static const char module[] = "TIFFWriteBufferSetup"; if (tif->tif_rawdata) { if (tif->tif_flags & TIFF_MYBUFFER) { _TIFFfree(tif->tif_rawdata); tif->tif_flags &= ~TIFF_MYBUFFER; } tif->tif_rawdata = NULL; } if (size == (tsize_t) -1) { size = (isTiled(tif) ? tif->tif_tilesize : tif->tif_scanlinesize); /* * Make raw data buffer at least 8K */ if (size < 8*1024) size = 8*1024; bp = NULL; /* NB: force malloc */ } if (bp == NULL) { bp = _TIFFmalloc(size); if (bp == NULL) { TIFFError(module, "%s: No space for output buffer", tif->tif_name); return (0); } tif->tif_flags |= TIFF_MYBUFFER; } else tif->tif_flags &= ~TIFF_MYBUFFER; tif->tif_rawdata = (tidata_t) bp; tif->tif_rawdatasize = size; tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; tif->tif_flags |= TIFF_BUFFERSETUP; return (1); } /* * Grow the strip data structures by delta strips. */ static int TIFFGrowStrips(TIFF* tif, int delta, const char* module) { TIFFDirectory *td = &tif->tif_dir; assert(td->td_planarconfig == PLANARCONFIG_CONTIG); td->td_stripoffset = (uint32*)_TIFFrealloc(td->td_stripoffset, (td->td_nstrips + delta) * sizeof (uint32)); td->td_stripbytecount = (uint32*)_TIFFrealloc(td->td_stripbytecount, (td->td_nstrips + delta) * sizeof (uint32)); if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL) { td->td_nstrips = 0; TIFFError(module, "%s: No space to expand strip arrays", tif->tif_name); return (0); } _TIFFmemset(td->td_stripoffset+td->td_nstrips, 0, delta*sizeof (uint32)); _TIFFmemset(td->td_stripbytecount+td->td_nstrips, 0, delta*sizeof (uint32)); td->td_nstrips += delta; return (1); } /* * Append the data to the specified strip. * * NB: We don't check that there's space in the * file (i.e. that strips do not overlap). */ static int TIFFAppendToStrip(TIFF* tif, tstrip_t strip, tidata_t data, tsize_t cc) { TIFFDirectory *td = &tif->tif_dir; static const char module[] = "TIFFAppendToStrip"; if (td->td_stripoffset[strip] == 0 || tif->tif_curoff == 0) { /* * No current offset, set the current strip. */ if (td->td_stripoffset[strip] != 0) { if (!SeekOK(tif, td->td_stripoffset[strip])) { TIFFError(module, "%s: Seek error at scanline %lu", tif->tif_name, (u_long) tif->tif_row); return (0); } } else td->td_stripoffset[strip] = TIFFSeekFile(tif, (toff_t) 0, SEEK_END); tif->tif_curoff = td->td_stripoffset[strip]; } if (!WriteOK(tif, data, cc)) { TIFFError(module, "%s: Write error at scanline %lu", tif->tif_name, (u_long) tif->tif_row); return (0); } tif->tif_curoff += cc; td->td_stripbytecount[strip] += cc; return (1); } /* * Internal version of TIFFFlushData that can be * called by ``encodestrip routines'' w/o concern * for infinite recursion. */ int TIFFFlushData1(TIFF* tif) { if (tif->tif_rawcc > 0) { if (!isFillOrder(tif, tif->tif_dir.td_fillorder) && (tif->tif_flags & TIFF_NOBITREV) == 0) TIFFReverseBits((u_char *)tif->tif_rawdata, tif->tif_rawcc); if (!TIFFAppendToStrip(tif, isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip, tif->tif_rawdata, tif->tif_rawcc)) return (0); tif->tif_rawcc = 0; tif->tif_rawcp = tif->tif_rawdata; } return (1); } /* * Set the current write offset. This should only be * used to set the offset to a known previous location * (very carefully), or to 0 so that the next write gets * appended to the end of the file. */ void TIFFSetWriteOffset(TIFF* tif, toff_t off) { tif->tif_curoff = off; } gamera-3.3.3/src/libtiff/tif_zip.c0000644000076500000000000002315410714675674016006 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1995-1997 Sam Leffler * Copyright (c) 1995-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "tiffiop.h" #ifdef ZIP_SUPPORT /* * TIFF Library. * * ZIP (aka Deflate) Compression Support * * This file is simply an interface to the zlib library written by * Jean-loup Gailly and Mark Adler. You must use version 1.0 or later * of the library: this code assumes the 1.0 API and also depends on * the ability to write the zlib header multiple times (one per strip) * which was not possible with versions prior to 0.95. Note also that * older versions of this codec avoided this bug by supressing the header * entirely. This means that files written with the old library cannot * be read; they should be converted to a different compression scheme * and then reconverted. * * The data format used by the zlib library is described in the files * zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the * directory ftp://ftp.uu.net/pub/archiving/zip/doc. The library was * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz. */ #include "tif_predict.h" #include "zlib.h" #include #include /* * Sigh, ZLIB_VERSION is defined as a string so there's no * way to do a proper check here. Instead we guess based * on the presence of #defines that were added between the * 0.95 and 1.0 distributions. */ #if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED) #error "Antiquated ZLIB software; you must use version 1.0 or later" #endif /* * State block for each open TIFF * file using ZIP compression/decompression. */ typedef struct { TIFFPredictorState predict; z_stream stream; int zipquality; /* compression level */ int state; /* state flags */ #define ZSTATE_INIT 0x1 /* zlib setup successfully */ TIFFVGetMethod vgetparent; /* super-class method */ TIFFVSetMethod vsetparent; /* super-class method */ } ZIPState; #define ZState(tif) ((ZIPState*) (tif)->tif_data) #define DecoderState(tif) ZState(tif) #define EncoderState(tif) ZState(tif) static int ZIPEncode(TIFF*, tidata_t, tsize_t, tsample_t); static int ZIPDecode(TIFF*, tidata_t, tsize_t, tsample_t); static int ZIPSetupDecode(TIFF* tif) { ZIPState* sp = DecoderState(tif); static const char module[] = "ZIPSetupDecode"; assert(sp != NULL); if (inflateInit(&sp->stream) != Z_OK) { TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg); return (0); } else { sp->state |= ZSTATE_INIT; return (1); } } /* * Setup state for decoding a strip. */ static int ZIPPreDecode(TIFF* tif, tsample_t s) { ZIPState* sp = DecoderState(tif); (void) s; assert(sp != NULL); sp->stream.next_in = tif->tif_rawdata; sp->stream.avail_in = tif->tif_rawcc; return (inflateReset(&sp->stream) == Z_OK); } static int ZIPDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s) { ZIPState* sp = DecoderState(tif); static const char module[] = "ZIPDecode"; (void) s; assert(sp != NULL); sp->stream.next_out = op; sp->stream.avail_out = occ; do { int state = inflate(&sp->stream, Z_PARTIAL_FLUSH); if (state == Z_STREAM_END) break; if (state == Z_DATA_ERROR) { TIFFError(module, "%s: Decoding error at scanline %d, %s", tif->tif_name, tif->tif_row, sp->stream.msg); if (inflateSync(&sp->stream) != Z_OK) return (0); continue; } if (state != Z_OK) { TIFFError(module, "%s: zlib error: %s", tif->tif_name, sp->stream.msg); return (0); } } while (sp->stream.avail_out > 0); if (sp->stream.avail_out != 0) { TIFFError(module, "%s: Not enough data at scanline %d (short %d bytes)", tif->tif_name, tif->tif_row, sp->stream.avail_out); return (0); } return (1); } static int ZIPSetupEncode(TIFF* tif) { ZIPState* sp = EncoderState(tif); static const char module[] = "ZIPSetupEncode"; assert(sp != NULL); if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) { TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg); return (0); } else { sp->state |= ZSTATE_INIT; return (1); } } /* * Reset encoding state at the start of a strip. */ static int ZIPPreEncode(TIFF* tif, tsample_t s) { ZIPState *sp = EncoderState(tif); (void) s; assert(sp != NULL); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = tif->tif_rawdatasize; return (deflateReset(&sp->stream) == Z_OK); } /* * Encode a chunk of pixels. */ static int ZIPEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { ZIPState *sp = EncoderState(tif); static const char module[] = "ZIPEncode"; (void) s; sp->stream.next_in = bp; sp->stream.avail_in = cc; do { if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) { TIFFError(module, "%s: Encoder error: %s", tif->tif_name, sp->stream.msg); return (0); } if (sp->stream.avail_out == 0) { tif->tif_rawcc = tif->tif_rawdatasize; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = tif->tif_rawdatasize; } } while (sp->stream.avail_in > 0); return (1); } /* * Finish off an encoded strip by flushing the last * string and tacking on an End Of Information code. */ static int ZIPPostEncode(TIFF* tif) { ZIPState *sp = EncoderState(tif); static const char module[] = "ZIPPostEncode"; int state; sp->stream.avail_in = 0; do { state = deflate(&sp->stream, Z_FINISH); switch (state) { case Z_STREAM_END: case Z_OK: if (sp->stream.avail_out != tif->tif_rawdatasize) { tif->tif_rawcc = tif->tif_rawdatasize - sp->stream.avail_out; TIFFFlushData1(tif); sp->stream.next_out = tif->tif_rawdata; sp->stream.avail_out = tif->tif_rawdatasize; } break; default: TIFFError(module, "%s: zlib error: %s", tif->tif_name, sp->stream.msg); return (0); } } while (state != Z_STREAM_END); return (1); } static void ZIPCleanup(TIFF* tif) { ZIPState* sp = ZState(tif); if (sp) { if (sp->state&ZSTATE_INIT) { /* NB: avoid problems in the library */ if (tif->tif_mode == O_RDONLY) inflateEnd(&sp->stream); else deflateEnd(&sp->stream); } _TIFFfree(sp); tif->tif_data = NULL; } } static int ZIPVSetField(TIFF* tif, ttag_t tag, va_list ap) { ZIPState* sp = ZState(tif); static const char module[] = "ZIPVSetField"; switch (tag) { case TIFFTAG_ZIPQUALITY: sp->zipquality = va_arg(ap, int); if (tif->tif_mode != O_RDONLY && (sp->state&ZSTATE_INIT)) { if (deflateParams(&sp->stream, sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) { TIFFError(module, "%s: zlib error: %s", tif->tif_name, sp->stream.msg); return (0); } } return (1); default: return (*sp->vsetparent)(tif, tag, ap); } /*NOTREACHED*/ } static int ZIPVGetField(TIFF* tif, ttag_t tag, va_list ap) { ZIPState* sp = ZState(tif); switch (tag) { case TIFFTAG_ZIPQUALITY: *va_arg(ap, int*) = sp->zipquality; break; default: return (*sp->vgetparent)(tif, tag, ap); } return (1); } static const TIFFFieldInfo zipFieldInfo[] = { { TIFFTAG_ZIPQUALITY, 0, 0, TIFF_ANY, FIELD_PSEUDO, TRUE, FALSE, "" }, }; #define N(a) (sizeof (a) / sizeof (a[0])) int TIFFInitZIP(TIFF* tif, int scheme) { ZIPState* sp; assert( (scheme == COMPRESSION_DEFLATE) || (scheme == COMPRESSION_ADOBE_DEFLATE)); /* * Allocate state block so tag methods have storage to record values. */ tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (ZIPState)); if (tif->tif_data == NULL) goto bad; sp = ZState(tif); sp->stream.zalloc = NULL; sp->stream.zfree = NULL; sp->stream.opaque = NULL; sp->stream.data_type = Z_BINARY; /* * Merge codec-specific tag information and * override parent get/set field methods. */ _TIFFMergeFieldInfo(tif, zipFieldInfo, N(zipFieldInfo)); sp->vgetparent = tif->tif_vgetfield; tif->tif_vgetfield = ZIPVGetField; /* hook for codec tags */ sp->vsetparent = tif->tif_vsetfield; tif->tif_vsetfield = ZIPVSetField; /* hook for codec tags */ /* Default values for codec-specific fields */ sp->zipquality = Z_DEFAULT_COMPRESSION; /* default comp. level */ sp->state = 0; /* * Install codec methods. */ tif->tif_setupdecode = ZIPSetupDecode; tif->tif_predecode = ZIPPreDecode; tif->tif_decoderow = ZIPDecode; tif->tif_decodestrip = ZIPDecode; tif->tif_decodetile = ZIPDecode; tif->tif_setupencode = ZIPSetupEncode; tif->tif_preencode = ZIPPreEncode; tif->tif_postencode = ZIPPostEncode; tif->tif_encoderow = ZIPEncode; tif->tif_encodestrip = ZIPEncode; tif->tif_encodetile = ZIPEncode; tif->tif_cleanup = ZIPCleanup; /* * Setup predictor setup. */ (void) TIFFPredictorInit(tif); return (1); bad: TIFFError("TIFFInitZIP", "No space for ZIP state block"); return (0); } #endif /* ZIP_SUPORT */ gamera-3.3.3/src/libtiff/tiff.h0000644000076500000000000005723710714675674015310 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFF_ #define _TIFF_ /* * Tag Image File Format (TIFF) * * Based on Rev 6.0 from: * Developer's Desk * Aldus Corporation * 411 First Ave. South * Suite 200 * Seattle, WA 98104 * 206-622-5500 */ #define TIFF_VERSION 42 #define TIFF_BIGENDIAN 0x4d4d #define TIFF_LITTLEENDIAN 0x4949 /* * The so called TIFF types conflict with definitions from inttypes.h * included from sys/types.h on AIX (at least using VisualAge compiler). * We try to work around this by detecting this case. Defining * _TIFF_DATA_TYPEDEFS_ short circuits the later definitions in tiff.h, and * we will in the holes not provided for by inttypes.h. * * See http://bugzilla.remotesensing.org/show_bug.cgi?id=39 */ #if defined(_H_INTTYPES) && defined(_ALL_SOURCE) #define _TIFF_DATA_TYPEDEFS_ typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned int uint32; #endif /* * Intrinsic data types required by the file format: * * 8-bit quantities int8/uint8 * 16-bit quantities int16/uint16 * 32-bit quantities int32/uint32 * strings unsigned char* */ #ifndef _TIFF_DATA_TYPEDEFS_ #define _TIFF_DATA_TYPEDEFS_ #ifdef __STDC__ typedef signed char int8; /* NB: non-ANSI compilers may not grok */ #else typedef char int8; #endif typedef unsigned char uint8; typedef short int16; typedef unsigned short uint16; /* sizeof (uint16) must == 2 */ #if defined(__alpha) || (defined(_MIPS_SZLONG) && _MIPS_SZLONG == 64) || defined(__LP64__) typedef int int32; typedef unsigned int uint32; /* sizeof (uint32) must == 4 */ #else typedef long int32; typedef unsigned long uint32; /* sizeof (uint32) must == 4 */ #endif #endif /* _TIFF_DATA_TYPEDEFS_ */ /* For TIFFReassignTagToIgnore */ enum TIFFIgnoreSense /* IGNORE tag table */ { TIS_STORE, TIS_EXTRACT, TIS_EMPTY }; typedef struct { uint16 tiff_magic; /* magic number (defines byte order) */ uint16 tiff_version; /* TIFF version number */ uint32 tiff_diroff; /* byte offset to first directory */ } TIFFHeader; /* * TIFF Image File Directories are comprised of * a table of field descriptors of the form shown * below. The table is sorted in ascending order * by tag. The values associated with each entry * are disjoint and may appear anywhere in the file * (so long as they are placed on a word boundary). * * If the value is 4 bytes or less, then it is placed * in the offset field to save space. If the value * is less than 4 bytes, it is left-justified in the * offset field. */ typedef struct { uint16 tdir_tag; /* see below */ uint16 tdir_type; /* data type; see below */ uint32 tdir_count; /* number of items; length in spec */ uint32 tdir_offset; /* byte offset to field data */ } TIFFDirEntry; /* * NB: In the comments below, * - items marked with a + are obsoleted by revision 5.0, * - items marked with a ! are introduced in revision 6.0. * - items marked with a % are introduced post revision 6.0. * - items marked with a $ are obsoleted by revision 6.0. */ /* * Tag data type information. * * Note: RATIONALs are the ratio of two 32-bit integer values. */ typedef enum { TIFF_NOTYPE = 0, /* placeholder */ TIFF_BYTE = 1, /* 8-bit unsigned integer */ TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ TIFF_SHORT = 3, /* 16-bit unsigned integer */ TIFF_LONG = 4, /* 32-bit unsigned integer */ TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ TIFF_SBYTE = 6, /* !8-bit signed integer */ TIFF_UNDEFINED = 7, /* !8-bit untyped data */ TIFF_SSHORT = 8, /* !16-bit signed integer */ TIFF_SLONG = 9, /* !32-bit signed integer */ TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ TIFF_DOUBLE = 12 /* !64-bit IEEE floating point */ } TIFFDataType; /* * TIFF Tag Definitions. */ #define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */ #define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */ #define FILETYPE_PAGE 0x2 /* one page of many */ #define FILETYPE_MASK 0x4 /* transparency mask */ #define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */ #define OFILETYPE_IMAGE 1 /* full resolution image data */ #define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */ #define OFILETYPE_PAGE 3 /* one page of many */ #define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */ #define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */ #define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */ #define TIFFTAG_COMPRESSION 259 /* data compression technique */ #define COMPRESSION_NONE 1 /* dump mode */ #define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */ #define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */ #define COMPRESSION_CCITT_T4 3 /* CCITT T.4 (TIFF 6 name) */ #define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */ #define COMPRESSION_CCITT_T6 4 /* CCITT T.6 (TIFF 6 name) */ #define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */ #define COMPRESSION_OJPEG 6 /* !6.0 JPEG */ #define COMPRESSION_JPEG 7 /* %JPEG DCT compression */ #define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */ #define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */ #define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */ #define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */ /* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT */ #define COMPRESSION_DCS 32947 /* Kodak DCS encoding */ #define COMPRESSION_JBIG 34661 /* ISO JBIG */ #define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */ #define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */ #define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */ #define PHOTOMETRIC_MINISWHITE 0 /* min value is white */ #define PHOTOMETRIC_MINISBLACK 1 /* min value is black */ #define PHOTOMETRIC_RGB 2 /* RGB color model */ #define PHOTOMETRIC_PALETTE 3 /* color map indexed */ #define PHOTOMETRIC_MASK 4 /* $holdout mask */ #define PHOTOMETRIC_SEPARATED 5 /* !color separations */ #define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */ #define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ #define PHOTOMETRIC_ITULAB 10 /* ITU L*a*b* */ #define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ #define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ #define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ #define THRESHHOLD_BILEVEL 1 /* b&w art scan */ #define THRESHHOLD_HALFTONE 2 /* or dithered scan */ #define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */ #define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */ #define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */ #define TIFFTAG_FILLORDER 266 /* data order within a byte */ #define FILLORDER_MSB2LSB 1 /* most significant -> least */ #define FILLORDER_LSB2MSB 2 /* least significant -> most */ #define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */ #define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */ #define TIFFTAG_MAKE 271 /* scanner manufacturer name */ #define TIFFTAG_MODEL 272 /* scanner model name/number */ #define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */ #define TIFFTAG_ORIENTATION 274 /* +image orientation */ #define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */ #define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */ #define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */ #define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */ #define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */ #define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */ #define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */ #define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */ #define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */ #define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */ #define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */ #define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */ #define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */ #define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */ #define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */ #define TIFFTAG_PLANARCONFIG 284 /* storage organization */ #define PLANARCONFIG_CONTIG 1 /* single image plane */ #define PLANARCONFIG_SEPARATE 2 /* separate planes of data */ #define TIFFTAG_PAGENAME 285 /* page name image is from */ #define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */ #define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */ #define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */ #define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */ #define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */ #define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */ #define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */ #define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */ #define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ #define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */ #define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */ #define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */ #define TIFFTAG_T4OPTIONS 292 /* TIFF 6.0 proper name alias */ #define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */ #define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */ #define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */ #define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */ #define TIFFTAG_T6OPTIONS 293 /* TIFF 6.0 proper name */ #define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */ #define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */ #define RESUNIT_NONE 1 /* no meaningful units */ #define RESUNIT_INCH 2 /* english */ #define RESUNIT_CENTIMETER 3 /* metric */ #define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */ #define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */ #define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */ #define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */ #define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */ #define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ #define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */ #define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */ #define TIFFTAG_SOFTWARE 305 /* name & release */ #define TIFFTAG_DATETIME 306 /* creation date and time */ #define TIFFTAG_ARTIST 315 /* creator of image */ #define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */ #define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */ #define TIFFTAG_WHITEPOINT 318 /* image white point */ #define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */ #define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */ #define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */ #define TIFFTAG_TILEWIDTH 322 /* !rows/data tile */ #define TIFFTAG_TILELENGTH 323 /* !cols/data tile */ #define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */ #define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */ #define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */ #define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */ #define CLEANFAXDATA_CLEAN 0 /* no errors detected */ #define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */ #define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */ #define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */ #define TIFFTAG_SUBIFD 330 /* subimage descriptors */ #define TIFFTAG_INKSET 332 /* !inks in separated image */ #define INKSET_CMYK 1 /* !cyan-magenta-yellow-black */ #define TIFFTAG_INKNAMES 333 /* !ascii names of inks */ #define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */ #define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */ #define TIFFTAG_TARGETPRINTER 337 /* !separation target */ #define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */ #define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */ #define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */ #define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */ #define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */ #define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */ #define SAMPLEFORMAT_INT 2 /* !signed integer data */ #define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */ #define SAMPLEFORMAT_VOID 4 /* !untyped data */ #define SAMPLEFORMAT_COMPLEXINT 5 /* !complex signed int */ #define SAMPLEFORMAT_COMPLEXIEEEFP 6 /* !complex ieee floating */ #define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */ #define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */ #define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */ /* * Tags 512-521 are obsoleted by Technical Note #2 * which specifies a revised JPEG-in-TIFF scheme. */ #define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */ #define JPEGPROC_BASELINE 1 /* !baseline sequential */ #define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */ #define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */ #define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */ #define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */ #define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */ #define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */ #define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */ #define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */ #define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */ #define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */ #define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */ #define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */ #define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */ #define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */ #define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */ /* tags 32952-32956 are private tags registered to Island Graphics */ #define TIFFTAG_REFPTS 32953 /* image reference points */ #define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */ #define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */ #define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */ /* tags 32995-32999 are private tags registered to SGI */ #define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */ #define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */ #define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */ #define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */ /* tags 33300-33309 are private tags registered to Pixar */ /* * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH * are set when an image has been cropped out of a larger image. * They reflect the size of the original uncropped image. * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used * to determine the position of the smaller image in the larger one. */ #define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */ #define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */ /* Tags 33302-33306 are used to identify special image modes and data * used by Pixar's texture formats. */ #define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */ #define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */ #define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */ #define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305 #define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 /* tag 33405 is a private tag registered to Eastman Kodak */ #define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ /* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ #define TIFFTAG_COPYRIGHT 33432 /* copyright string */ /* IPTC TAG from RichTIFF specifications */ #define TIFFTAG_RICHTIFFIPTC 33723 /* 34016-34029 are reserved for ANSI IT8 TIFF/IT */ #define TIFFTAG_STONITS 37439 /* Sample value to Nits */ /* tag 34929 is a private tag registered to FedEx */ #define TIFFTAG_FEDEX_EDR 34929 /* unknown use */ /* tag 65535 is an undefined tag used by Eastman Kodak */ #define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */ /* * The following are ``pseudo tags'' that can be * used to control codec-specific functionality. * These tags are not written to file. Note that * these values start at 0xffff+1 so that they'll * never collide with Aldus-assigned tags. * * If you want your private pseudo tags ``registered'' * (i.e. added to this file), send mail to sam@sgi.com * with the appropriate C definitions to add. */ #define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */ #define FAXMODE_CLASSIC 0x0000 /* default, include RTC */ #define FAXMODE_NORTC 0x0001 /* no RTC at end of data */ #define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */ #define FAXMODE_BYTEALIGN 0x0004 /* byte align row */ #define FAXMODE_WORDALIGN 0x0008 /* word align row */ #define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */ #define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */ /* Note: quality level is on the IJG 0-100 scale. Default value is 75 */ #define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */ #define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */ #define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */ #define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */ #define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */ #define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */ /* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */ #define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */ #define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */ #define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */ #define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */ #define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */ #define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */ #define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */ #define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */ /* 65550-65556 are allocated to Oceana Matrix */ #define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */ #define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */ #define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */ #define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */ #define DCSIMAGERFILTER_IR 0 /* infrared filter */ #define DCSIMAGERFILTER_MONO 1 /* monochrome filter */ #define DCSIMAGERFILTER_CFA 2 /* color filter array */ #define DCSIMAGERFILTER_OTHER 3 /* other filter */ #define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */ #define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */ #define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */ #define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */ #define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */ #define TIFFTAG_DCSGAMMA 65554 /* gamma value */ #define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */ #define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */ /* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */ #define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */ #define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */ /* 65559 is allocated to Oceana Matrix */ #define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */ #define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */ #define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */ #define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */ #define SGILOGDATAFMT_RAW 2 /* uninterpreted data */ #define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */ #define TIFFTAG_SGILOGENCODE 65561 /* SGILog data encoding control*/ #define SGILOGENCODE_NODITHER 0 /* do not dither encoded values*/ #define SGILOGENCODE_RANDITHER 1 /* randomly dither encd values */ #endif /* _TIFF_ */ gamera-3.3.3/src/libtiff/tiffcomp.h0000644000076500000000000001410510714675674016152 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1990-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _COMPAT_ #define _COMPAT_ /* * This file contains a hodgepodge of definitions and * declarations that are needed to provide compatibility * between the native system and the base implementation * that the library assumes. * * NB: This file is a mess. */ /* * Setup basic type definitions and function declaratations. */ /* * Simplify Acorn RISC OS identifier (to avoid confusion with Acorn RISC iX * and with defunct Unix Risc OS) * No need to specify __arm - hey, Acorn might port the OS, no problem here! */ #ifdef __acornriscos #undef __acornriscos #endif #if defined(__acorn) && defined(__riscos) #define __acornriscos #endif #if defined(__MWERKS__) || defined(THINK_C) #include #include #endif #include #if defined(__PPCC__) || defined(__SC__) || defined(__MRC__) #include #elif !defined(__MWERKS__) && !defined(THINK_C) && !defined(__acornriscos) && !defined(applec) #include #endif #if defined(VMS) #include #include #elif !defined(__acornriscos) #include #endif /* * This maze of checks controls defines or not the * target system has BSD-style typdedefs declared in * an include file and/or whether or not to include * to get the SEEK_* definitions. Some * additional includes are also done to pull in the * appropriate definitions we're looking for. */ #if defined(__MWERKS__) || defined(THINK_C) || defined(__PPCC__) || defined(__SC__) || defined(__MRC__) #include #define BSDTYPES #define HAVE_UNISTD_H 0 #elif (defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) || defined(_WIN32)) && !defined(unix) #define BSDTYPES #elif defined(OS2_16) || defined(OS2_32) #define BSDTYPES #elif defined(__acornriscos) #include #define BSDTYPES #define HAVE_UNISTD_H 0 #elif defined(VMS) #define HAVE_UNISTD_H 0 #else #define HAVE_UNISTD_H 1 #endif /* * The library uses the ANSI C/POSIX SEEK_* * definitions that should be defined in unistd.h * (except on system where they are in stdio.h and * there is no unistd.h). */ #if !defined(SEEK_SET) && HAVE_UNISTD_H #include #endif /* * The library uses memset, memcpy, and memcmp. * ANSI C and System V define these in string.h. */ #include /* * The BSD typedefs are used throughout the library. * If your system doesn't have them in , * then define BSDTYPES in your Makefile. */ #if !defined(__GNUC__) typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; #endif /* * dblparam_t is the type that a double precision * floating point value will have on the parameter * stack (when coerced by the compiler). */ /* Note: on MacPowerPC "extended" is undefined. So only use it for 68K-Macs */ #if defined(__SC__) || defined(THINK_C) typedef extended dblparam_t; #else typedef double dblparam_t; #endif /* * If your compiler supports inline functions, then * set INLINE appropriately to get the known hotspots * in the library expanded inline. */ #if defined(__GNUC__) #if defined(__STRICT_ANSI__) #define INLINE __inline__ #else #define INLINE inline #endif #else /* !__GNUC__ */ #define INLINE #endif /* * GLOBALDATA is a macro that is used to define global variables * private to the library. We use this indirection to hide * brain-damage in VAXC (and GCC) under VAX/VMS. In these * environments the macro places the variable in a non-shareable * program section, which ought to be done by default (sigh!) * * Apparently DEC are aware of the problem as this behaviour is the * default under VMS on AXP. * * The GNU C variant is untested. */ #if defined(VAX) && defined(VMS) #if defined(VAXC) #define GLOBALDATA(TYPE,NAME) extern noshare TYPE NAME #endif #if defined(__GNUC__) #define GLOBALDATA(TYPE,NAME) extern TYPE NAME \ asm("_$$PsectAttributes_NOSHR$$" #NAME) #endif #else /* !VAX/VMS */ #define GLOBALDATA(TYPE,NAME) extern TYPE NAME #endif #if defined(__acornriscos) /* * osfcn.h is part of C++Lib on Acorn C/C++, and as such can't be used * on C alone. For that reason, the relevant functions are * implemented in tif_acorn.c, and the elements from the header * file are included here. */ #if defined(__cplusplus) #include #else #define O_RDONLY 0 #define O_WRONLY 1 #define O_RDWR 2 #define O_APPEND 8 #define O_CREAT 0x200 #define O_TRUNC 0x400 typedef long off_t; extern int open(const char *name, int flags, int mode); extern int close(int fd); extern int write(int fd, const char *buf, int nbytes); extern int read(int fd, char *buf, int nbytes); extern off_t lseek(int fd, off_t offset, int whence); extern int creat(const char *path, int mode); #endif /* __cplusplus */ #endif /* __acornriscos */ /* Bit and byte order, the default is MSB to LSB */ #ifdef VMS #undef HOST_FILLORDER #undef HOST_BIGENDIAN #define HOST_FILLORDER FILLORDER_LSB2MSB #define HOST_BIGENDIAN 0 #endif #endif /* _COMPAT_ */ gamera-3.3.3/src/libtiff/tiffconf.h0000644000076500000000000001206410714675674016143 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFCONF_ #define _TIFFCONF_ /* * Library Configuration Definitions. * * This file defines the default configuration for the library. * If the target system does not have make or a way to specify * #defines on the command line, this file can be edited to * configure the library. Otherwise, one can override portability * and configuration-related definitions from a Makefile or command * line by defining FEATURE_SUPPORT and COMPRESSION_SUPPORT (see below). */ /* * General portability-related defines: * * HAVE_IEEEFP define as 0 or 1 according to the floating point * format suported by the machine * BSDTYPES define this if your system does NOT define the * usual 4BSD typedefs u_int et. al. * HAVE_MMAP enable support for memory mapping read-only files; * this is typically deduced by the configure script * HOST_FILLORDER native cpu bit order: one of FILLORDER_MSB2LSB * or FILLODER_LSB2MSB; this is typically set by the * configure script * HOST_BIGENDIAN native cpu byte order: 1 if big-endian (Motorola) * or 0 if little-endian (Intel); this may be used * in codecs to optimize code * USE_64BIT_API set to 1 if tif_unix.c should use lseek64(), * fstat64() and stat64 allowing 2-4GB files. */ #ifndef HAVE_IEEEFP #define HAVE_IEEEFP 1 #endif #ifndef HOST_FILLORDER #define HOST_FILLORDER FILLORDER_MSB2LSB #endif #ifndef HOST_BIGENDIAN #define HOST_BIGENDIAN 1 #endif #ifndef USE_64BIT_API # define USE_64BIT_API 0 #endif #ifndef FEATURE_SUPPORT /* * Feature support definitions: * * COLORIMETRY_SUPPORT enable support for 6.0 colorimetry tags * YCBCR_SUPPORT enable support for 6.0 YCbCr tags * CMYK_SUPPORT enable support for 6.0 CMYK tags * ICC_SUPPORT enable support for ICC profile tag * PHOTOSHOP_SUPPORT enable support for PHOTOSHOP resource tag * IPTC_SUPPORT enable support for RichTIFF IPTC tag */ #define COLORIMETRY_SUPPORT #define YCBCR_SUPPORT #define CMYK_SUPPORT #define ICC_SUPPORT #define PHOTOSHOP_SUPPORT #define IPTC_SUPPORT #endif /* FEATURE_SUPPORT */ #ifndef COMPRESSION_SUPPORT /* * Compression support defines: * * CCITT_SUPPORT enable support for CCITT Group 3 & 4 algorithms * PACKBITS_SUPPORT enable support for Macintosh PackBits algorithm * LZW_SUPPORT enable support for LZW algorithm * THUNDER_SUPPORT enable support for ThunderScan 4-bit RLE algorithm * NEXT_SUPPORT enable support for NeXT 2-bit RLE algorithm * OJPEG_SUPPORT enable support for 6.0-style JPEG DCT algorithms * (requires IJG software) * JPEG_SUPPORT enable support for post-6.0-style JPEG DCT algorithms * (requires freely available IJG software, see tif_jpeg.c) * ZIP_SUPPORT enable support for Deflate algorithm * (requires freely available zlib software, see tif_zip.c) * PIXARLOG_SUPPORT enable support for Pixar log-format algorithm * LOGLUV_SUPPORT enable support for LogLuv high dynamic range encoding */ #define CCITT_SUPPORT #define PACKBITS_SUPPORT #define LZW_SUPPORT #define THUNDER_SUPPORT #define NEXT_SUPPORT #define LOGLUV_SUPPORT #endif /* COMPRESSION_SUPPORT */ /* * If JPEG compression is enabled then we must also include * support for the colorimetry and YCbCr-related tags. */ #ifdef JPEG_SUPPORT #ifndef YCBCR_SUPPORT #define YCBCR_SUPPORT #endif #ifndef COLORIMETRY_SUPPORT #define COLORIMETRY_SUPPORT #endif #endif /* JPEG_SUPPORT */ /* * ``Orthogonal Features'' * * STRIPCHOP_DEFAULT default handling of strip chopping support (whether * or not to convert single-strip uncompressed images * to mutiple strips of ~8Kb--to reduce memory use) * SUBIFD_SUPPORT enable support for SubIFD tag (thumbnails and such) */ #ifndef STRIPCHOP_DEFAULT #define STRIPCHOP_DEFAULT TIFF_STRIPCHOP /* default is to enable */ #endif #ifndef SUBIFD_SUPPORT #define SUBIFD_SUPPORT 1 /* enable SubIFD tag (330) support */ #endif #endif /* _TIFFCONF_ */ gamera-3.3.3/src/libtiff/tiffio.h0000644000076500000000000003324410714675674015630 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFIO_ #define _TIFFIO_ /* * TIFF I/O Library Definitions. */ #include "tiff.h" #include "tiffvers.h" /* * TIFF is defined as an incomplete type to hide the * library's internal data structures from clients. */ typedef struct tiff TIFF; /* * The following typedefs define the intrinsic size of * data types used in the *exported* interfaces. These * definitions depend on the proper definition of types * in tiff.h. Note also that the varargs interface used * to pass tag types and values uses the types defined in * tiff.h directly. * * NB: ttag_t is unsigned int and not unsigned short because * ANSI C requires that the type before the ellipsis be a * promoted type (i.e. one of int, unsigned int, pointer, * or double) and because we defined pseudo-tags that are * outside the range of legal Aldus-assigned tags. * NB: tsize_t is int32 and not uint32 because some functions * return -1. * NB: toff_t is not off_t for many reasons; TIFFs max out at * 32-bit file offsets being the most important, and to ensure * that it is unsigned, rather than signed. */ typedef uint32 ttag_t; /* directory tag */ typedef uint16 tdir_t; /* directory index */ typedef uint16 tsample_t; /* sample number */ typedef uint32 tstrip_t; /* strip number */ typedef uint32 ttile_t; /* tile number */ typedef int32 tsize_t; /* i/o size in bytes */ typedef void* tdata_t; /* image data ref */ typedef uint32 toff_t; /* file offset */ #if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) #define __WIN32__ #endif /* * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c). * * By default tif_win32.c is assumed on windows if not using the cygwin * environment. */ #if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) # if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILIO) # define USE_WIN32_FILEIO # endif #endif #undef USE_WIN32_FILEIO #if defined(USE_WIN32_FILEIO) #include #ifdef __WIN32__ DECLARE_HANDLE(thandle_t); /* Win32 file handle */ #else typedef HFILE thandle_t; /* client data handle */ #endif #else typedef void* thandle_t; /* client data handle */ #endif #ifndef NULL #define NULL 0 #endif /* * Flags to pass to TIFFPrintDirectory to control * printing of data structures that are potentially * very large. Bit-or these flags to enable printing * multiple items. */ #define TIFFPRINT_NONE 0x0 /* no extra info */ #define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ #define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ #define TIFFPRINT_COLORMAP 0x4 /* colormap */ #define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ #define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ #define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ /* * RGBA-style image support. */ typedef unsigned char TIFFRGBValue; /* 8-bit samples */ typedef struct _TIFFRGBAImage TIFFRGBAImage; /* * The image reading and conversion routines invoke * ``put routines'' to copy/image/whatever tiles of * raw image data. A default set of routines are * provided to convert/copy raw image data to 8-bit * packed ABGR format rasters. Applications can supply * alternate routines that unpack the data into a * different format or, for example, unpack the data * and draw the unpacked raster on the display. */ typedef void (*tileContigRoutine) (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, unsigned char*); typedef void (*tileSeparateRoutine) (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32, unsigned char*, unsigned char*, unsigned char*, unsigned char*); /* * RGBA-reader state. */ typedef struct { /* YCbCr->RGB support */ TIFFRGBValue* clamptab; /* range clamping table */ int* Cr_r_tab; int* Cb_b_tab; int32* Cr_g_tab; int32* Cb_g_tab; float coeffs[3]; /* cached for repeated use */ } TIFFYCbCrToRGB; struct _TIFFRGBAImage { TIFF* tif; /* image handle */ int stoponerr; /* stop on read error */ int isContig; /* data is packed/separate */ int alpha; /* type of alpha data present */ uint32 width; /* image width */ uint32 height; /* image height */ uint16 bitspersample; /* image bits/sample */ uint16 samplesperpixel; /* image samples/pixel */ uint16 orientation; /* image orientation */ uint16 photometric; /* image photometric interp */ uint16* redcmap; /* colormap pallete */ uint16* greencmap; uint16* bluecmap; /* get image data routine */ int (*get)(TIFFRGBAImage*, uint32*, uint32, uint32); union { void (*any)(TIFFRGBAImage*); tileContigRoutine contig; tileSeparateRoutine separate; } put; /* put decoded strip/tile */ TIFFRGBValue* Map; /* sample mapping array */ uint32** BWmap; /* black&white map */ uint32** PALmap; /* palette image map */ TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */ int row_offset; int col_offset; }; /* * Macros for extracting components from the * packed ABGR form returned by TIFFReadRGBAImage. */ #define TIFFGetR(abgr) ((abgr) & 0xff) #define TIFFGetG(abgr) (((abgr) >> 8) & 0xff) #define TIFFGetB(abgr) (((abgr) >> 16) & 0xff) #define TIFFGetA(abgr) (((abgr) >> 24) & 0xff) /* * A CODEC is a software package that implements decoding, * encoding, or decoding+encoding of a compression algorithm. * The library provides a collection of builtin codecs. * More codecs may be registered through calls to the library * and/or the builtin implementations may be overridden. */ typedef int (*TIFFInitMethod)(TIFF*, int); typedef struct { char* name; uint16 scheme; TIFFInitMethod init; } TIFFCodec; #include #include /* share internal LogLuv conversion routines? */ #ifndef LOGLUV_PUBLIC #define LOGLUV_PUBLIC 1 #endif #if defined(__cplusplus) extern "C" { #endif typedef void (*TIFFErrorHandler)(const char*, const char*, va_list); typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t); typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int); typedef int (*TIFFCloseProc)(thandle_t); typedef toff_t (*TIFFSizeProc)(thandle_t); typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*); typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t); typedef void (*TIFFExtendProc)(TIFF*); extern const char* TIFFGetVersion(void); extern const TIFFCodec* TIFFFindCODEC(uint16); extern TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod); extern void TIFFUnRegisterCODEC(TIFFCodec*); extern tdata_t _TIFFmalloc(tsize_t); extern tdata_t _TIFFrealloc(tdata_t, tsize_t); extern void _TIFFmemset(tdata_t, int, tsize_t); extern void _TIFFmemcpy(tdata_t, const tdata_t, tsize_t); extern int _TIFFmemcmp(const tdata_t, const tdata_t, tsize_t); extern void _TIFFfree(tdata_t); extern void TIFFClose(TIFF*); extern int TIFFFlush(TIFF*); extern int TIFFFlushData(TIFF*); extern int TIFFGetField(TIFF*, ttag_t, ...); extern int TIFFVGetField(TIFF*, ttag_t, va_list); extern int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...); extern int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list); extern int TIFFReadDirectory(TIFF*); extern tsize_t TIFFScanlineSize(TIFF*); extern tsize_t TIFFRasterScanlineSize(TIFF*); extern tsize_t TIFFStripSize(TIFF*); extern tsize_t TIFFVStripSize(TIFF*, uint32); extern tsize_t TIFFTileRowSize(TIFF*); extern tsize_t TIFFTileSize(TIFF*); extern tsize_t TIFFVTileSize(TIFF*, uint32); extern uint32 TIFFDefaultStripSize(TIFF*, uint32); extern void TIFFDefaultTileSize(TIFF*, uint32*, uint32*); extern int TIFFFileno(TIFF*); extern int TIFFGetMode(TIFF*); extern int TIFFIsTiled(TIFF*); extern int TIFFIsByteSwapped(TIFF*); extern int TIFFIsUpSampled(TIFF*); extern int TIFFIsMSB2LSB(TIFF*); extern uint32 TIFFCurrentRow(TIFF*); extern tdir_t TIFFCurrentDirectory(TIFF*); extern tdir_t TIFFNumberOfDirectories(TIFF*); extern uint32 TIFFCurrentDirOffset(TIFF*); extern tstrip_t TIFFCurrentStrip(TIFF*); extern ttile_t TIFFCurrentTile(TIFF*); extern int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t); extern int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t); extern int TIFFWriteCheck(TIFF*, int, const char *); extern int TIFFCreateDirectory(TIFF*); extern int TIFFLastDirectory(TIFF*); extern int TIFFSetDirectory(TIFF*, tdir_t); extern int TIFFSetSubDirectory(TIFF*, uint32); extern int TIFFUnlinkDirectory(TIFF*, tdir_t); extern int TIFFSetField(TIFF*, ttag_t, ...); extern int TIFFVSetField(TIFF*, ttag_t, va_list); extern int TIFFWriteDirectory(TIFF *); extern int TIFFRewriteDirectory(TIFF *); extern int TIFFReassignTagToIgnore(enum TIFFIgnoreSense, int); #if defined(c_plusplus) || defined(__cplusplus) extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0); extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t = 0); extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t = 0); extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0); #else extern void TIFFPrintDirectory(TIFF*, FILE*, long); extern int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t); extern int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t); extern int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int); #endif extern int TIFFReadRGBAStrip(TIFF*, tstrip_t, uint32 * ); extern int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * ); extern int TIFFRGBAImageOK(TIFF*, char [1024]); extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]); extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32); extern void TIFFRGBAImageEnd(TIFFRGBAImage*); extern TIFF* TIFFOpen(const char*, const char*); extern TIFF* TIFFFdOpen(int, const char*, const char*); extern TIFF* TIFFClientOpen(const char*, const char*, thandle_t, TIFFReadWriteProc, TIFFReadWriteProc, TIFFSeekProc, TIFFCloseProc, TIFFSizeProc, TIFFMapFileProc, TIFFUnmapFileProc); extern const char* TIFFFileName(TIFF*); extern void TIFFError(const char*, const char*, ...); extern void TIFFWarning(const char*, const char*, ...); extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler); extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler); extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc); extern ttile_t TIFFComputeTile(TIFF*, uint32, uint32, uint32, tsample_t); extern int TIFFCheckTile(TIFF*, uint32, uint32, uint32, tsample_t); extern ttile_t TIFFNumberOfTiles(TIFF*); extern tsize_t TIFFReadTile(TIFF*, tdata_t, uint32, uint32, uint32, tsample_t); extern tsize_t TIFFWriteTile(TIFF*, tdata_t, uint32, uint32, uint32, tsample_t); extern tstrip_t TIFFComputeStrip(TIFF*, uint32, tsample_t); extern tstrip_t TIFFNumberOfStrips(TIFF*); extern tsize_t TIFFReadEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); extern tsize_t TIFFReadRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); extern tsize_t TIFFReadEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); extern tsize_t TIFFReadRawTile(TIFF*, ttile_t, tdata_t, tsize_t); extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); extern tsize_t TIFFWriteRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); extern tsize_t TIFFWriteEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); extern tsize_t TIFFWriteRawTile(TIFF*, ttile_t, tdata_t, tsize_t); extern void TIFFSetWriteOffset(TIFF*, toff_t); extern void TIFFSwabShort(uint16*); extern void TIFFSwabLong(uint32*); extern void TIFFSwabDouble(double*); extern void TIFFSwabArrayOfShort(uint16*, unsigned long); extern void TIFFSwabArrayOfLong(uint32*, unsigned long); extern void TIFFSwabArrayOfDouble(double*, unsigned long); extern void TIFFReverseBits(unsigned char *, unsigned long); extern const unsigned char* TIFFGetBitRevTable(int); #ifdef LOGLUV_PUBLIC #define U_NEU 0.210526316 #define V_NEU 0.473684211 #define UVSCALE 410. extern double LogL16toY(int); extern double LogL10toY(int); extern void XYZtoRGB24(float*, uint8*); extern int uv_decode(double*, double*, int); extern void LogLuv24toXYZ(uint32, float*); extern void LogLuv32toXYZ(uint32, float*); #if defined(c_plusplus) || defined(__cplusplus) extern int LogL16fromY(double, int = SGILOGENCODE_NODITHER); extern int LogL10fromY(double, int = SGILOGENCODE_NODITHER); extern int uv_encode(double, double, int = SGILOGENCODE_NODITHER); extern uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER); extern uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER); #else extern int LogL16fromY(double, int); extern int LogL10fromY(double, int); extern int uv_encode(double, double, int); extern uint32 LogLuv24fromXYZ(float*, int); extern uint32 LogLuv32fromXYZ(float*, int); #endif #endif /* LOGLUV_PUBLIC */ #if defined(__cplusplus) } #endif #endif /* _TIFFIO_ */ gamera-3.3.3/src/libtiff/tiffiop.h0000644000076500000000000002632110714675674016006 0ustar chriswheel/* $Header$ */ /* * Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1991-1997 Silicon Graphics, Inc. * * Permission to use, copy, modify, distribute, and sell this software and * its documentation for any purpose is hereby granted without fee, provided * that (i) the above copyright notices and this permission notice appear in * all copies of the software and related documentation, and (ii) the names of * Sam Leffler and Silicon Graphics may not be used in any advertising or * publicity relating to the software without the specific, prior written * permission of Sam Leffler and Silicon Graphics. * * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef _TIFFIOP_ #define _TIFFIOP_ /* * ``Library-private'' definitions. */ /* * UNIX systems should run the configure script to generate * a port.h file that reflects the system capabilities. * Doing this obviates all the dreck done in tiffcomp.h. */ #if defined(unix) || defined(__unix) #include "port.h" #include "tiffconf.h" #else #include "tiffconf.h" #include "tiffcomp.h" #endif #include "tiffio.h" #include "tif_dir.h" #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif /* * Typedefs for ``method pointers'' used internally. */ typedef unsigned char tidataval_t; /* internal image data value type */ typedef tidataval_t* tidata_t; /* reference to internal image data */ typedef void (*TIFFVoidMethod)(TIFF*); typedef int (*TIFFBoolMethod)(TIFF*); typedef int (*TIFFPreMethod)(TIFF*, tsample_t); typedef int (*TIFFCodeMethod)(TIFF*, tidata_t, tsize_t, tsample_t); typedef int (*TIFFSeekMethod)(TIFF*, uint32); typedef void (*TIFFPostMethod)(TIFF*, tidata_t, tsize_t); typedef int (*TIFFVSetMethod)(TIFF*, ttag_t, va_list); typedef int (*TIFFVGetMethod)(TIFF*, ttag_t, va_list); typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long); typedef uint32 (*TIFFStripMethod)(TIFF*, uint32); typedef void (*TIFFTileMethod)(TIFF*, uint32*, uint32*); struct tiff { char* tif_name; /* name of open file */ int tif_fd; /* open file descriptor */ int tif_mode; /* open mode (O_*) */ uint32 tif_flags; #define TIFF_FILLORDER 0x0003 /* natural bit fill order for machine */ #define TIFF_DIRTYHEADER 0x0004 /* header must be written on close */ #define TIFF_DIRTYDIRECT 0x0008 /* current directory must be written */ #define TIFF_BUFFERSETUP 0x0010 /* data buffers setup */ #define TIFF_CODERSETUP 0x0020 /* encoder/decoder setup done */ #define TIFF_BEENWRITING 0x0040 /* written 1+ scanlines to file */ #define TIFF_SWAB 0x0080 /* byte swap file information */ #define TIFF_NOBITREV 0x0100 /* inhibit bit reversal logic */ #define TIFF_MYBUFFER 0x0200 /* my raw data buffer; free on close */ #define TIFF_ISTILED 0x0400 /* file is tile, not strip- based */ #define TIFF_MAPPED 0x0800 /* file is mapped into memory */ #define TIFF_POSTENCODE 0x1000 /* need call to postencode routine */ #define TIFF_INSUBIFD 0x2000 /* currently writing a subifd */ #define TIFF_UPSAMPLED 0x4000 /* library is doing data up-sampling */ #define TIFF_STRIPCHOP 0x8000 /* enable strip chopping support */ toff_t tif_diroff; /* file offset of current directory */ toff_t tif_nextdiroff; /* file offset of following directory */ TIFFDirectory tif_dir; /* internal rep of current directory */ TIFFHeader tif_header; /* file's header block */ tidata_t tif_clientdir; /* client TIFF directory */ const int* tif_typeshift; /* data type shift counts */ const long* tif_typemask; /* data type masks */ uint32 tif_row; /* current scanline */ tdir_t tif_curdir; /* current directory (index) */ tstrip_t tif_curstrip; /* current strip for read/write */ toff_t tif_curoff; /* current offset for read/write */ toff_t tif_dataoff; /* current offset for writing dir */ #if SUBIFD_SUPPORT uint16 tif_nsubifd; /* remaining subifds to write */ toff_t tif_subifdoff; /* offset for patching SubIFD link */ #endif /* tiling support */ uint32 tif_col; /* current column (offset by row too) */ ttile_t tif_curtile; /* current tile for read/write */ tsize_t tif_tilesize; /* # of bytes in a tile */ /* compression scheme hooks */ TIFFBoolMethod tif_setupdecode;/* called once before predecode */ TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */ TIFFBoolMethod tif_setupencode;/* called once before preencode */ TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */ TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */ TIFFCodeMethod tif_decoderow; /* scanline decoding routine */ TIFFCodeMethod tif_encoderow; /* scanline encoding routine */ TIFFCodeMethod tif_decodestrip;/* strip decoding routine */ TIFFCodeMethod tif_encodestrip;/* strip encoding routine */ TIFFCodeMethod tif_decodetile; /* tile decoding routine */ TIFFCodeMethod tif_encodetile; /* tile encoding routine */ TIFFVoidMethod tif_close; /* cleanup-on-close routine */ TIFFSeekMethod tif_seek; /* position within a strip routine */ TIFFVoidMethod tif_cleanup; /* cleanup state routine */ TIFFStripMethod tif_defstripsize;/* calculate/constrain strip size */ TIFFTileMethod tif_deftilesize;/* calculate/constrain tile size */ tidata_t tif_data; /* compression scheme private data */ /* input/output buffering */ tsize_t tif_scanlinesize;/* # of bytes in a scanline */ tsize_t tif_scanlineskew;/* scanline skew for reading strips */ tidata_t tif_rawdata; /* raw data buffer */ tsize_t tif_rawdatasize;/* # of bytes in raw data buffer */ tidata_t tif_rawcp; /* current spot in raw buffer */ tsize_t tif_rawcc; /* bytes unread from raw buffer */ /* memory-mapped file support */ tidata_t tif_base; /* base of mapped file */ toff_t tif_size; /* size of mapped file region (bytes) */ TIFFMapFileProc tif_mapproc; /* map file method */ TIFFUnmapFileProc tif_unmapproc;/* unmap file method */ /* input/output callback methods */ thandle_t tif_clientdata; /* callback parameter */ TIFFReadWriteProc tif_readproc; /* read method */ TIFFReadWriteProc tif_writeproc;/* write method */ TIFFSeekProc tif_seekproc; /* lseek method */ TIFFCloseProc tif_closeproc; /* close method */ TIFFSizeProc tif_sizeproc; /* filesize method */ /* post-decoding support */ TIFFPostMethod tif_postdecode; /* post decoding routine */ /* tag support */ TIFFFieldInfo** tif_fieldinfo; /* sorted table of registered tags */ int tif_nfields; /* # entries in registered tag table */ TIFFVSetMethod tif_vsetfield; /* tag set routine */ TIFFVGetMethod tif_vgetfield; /* tag get routine */ TIFFPrintMethod tif_printdir; /* directory print routine */ }; #define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */ #define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0) #define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0) #define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0) #define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0) #define TIFFReadFile(tif, buf, size) \ ((*(tif)->tif_readproc)((tif)->tif_clientdata,buf,size)) #define TIFFWriteFile(tif, buf, size) \ ((*(tif)->tif_writeproc)((tif)->tif_clientdata,buf,size)) #define TIFFSeekFile(tif, off, whence) \ ((*(tif)->tif_seekproc)((tif)->tif_clientdata,(toff_t)(off),whence)) #define TIFFCloseFile(tif) \ ((*(tif)->tif_closeproc)((tif)->tif_clientdata)) #define TIFFGetFileSize(tif) \ ((*(tif)->tif_sizeproc)((tif)->tif_clientdata)) #define TIFFMapFileContents(tif, paddr, psize) \ ((*(tif)->tif_mapproc)((tif)->tif_clientdata,paddr,psize)) #define TIFFUnmapFileContents(tif, addr, size) \ ((*(tif)->tif_unmapproc)((tif)->tif_clientdata,addr,size)) /* * Default Read/Seek/Write definitions. */ #ifndef ReadOK #define ReadOK(tif, buf, size) \ (TIFFReadFile(tif, (tdata_t) buf, (tsize_t)(size)) == (tsize_t)(size)) #endif #ifndef SeekOK #define SeekOK(tif, off) \ (TIFFSeekFile(tif, (toff_t) off, SEEK_SET) == (toff_t) off) #endif #ifndef WriteOK #define WriteOK(tif, buf, size) \ (TIFFWriteFile(tif, (tdata_t) buf, (tsize_t) size) == (tsize_t) size) #endif /* NB: the uint32 casts are to silence certain ANSI-C compilers */ #define TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) #define TIFFroundup(x, y) (TIFFhowmany(x,y)*((uint32)(y))) #if defined(__cplusplus) extern "C" { #endif extern int _TIFFgetMode(const char*, const char*); extern int _TIFFNoRowEncode(TIFF*, tidata_t, tsize_t, tsample_t); extern int _TIFFNoStripEncode(TIFF*, tidata_t, tsize_t, tsample_t); extern int _TIFFNoTileEncode(TIFF*, tidata_t, tsize_t, tsample_t); extern int _TIFFNoRowDecode(TIFF*, tidata_t, tsize_t, tsample_t); extern int _TIFFNoStripDecode(TIFF*, tidata_t, tsize_t, tsample_t); extern int _TIFFNoTileDecode(TIFF*, tidata_t, tsize_t, tsample_t); extern void _TIFFNoPostDecode(TIFF*, tidata_t, tsize_t); extern int _TIFFNoPreCode (TIFF*, tsample_t); extern int _TIFFNoSeek(TIFF*, uint32); extern void _TIFFSwab16BitData(TIFF*, tidata_t, tsize_t); extern void _TIFFSwab32BitData(TIFF*, tidata_t, tsize_t); extern void _TIFFSwab64BitData(TIFF*, tidata_t, tsize_t); extern int TIFFFlushData1(TIFF*); extern void TIFFFreeDirectory(TIFF*); extern int TIFFDefaultDirectory(TIFF*); extern int TIFFSetCompressionScheme(TIFF*, int); extern int TIFFSetDefaultCompressionState(TIFF*); extern uint32 _TIFFDefaultStripSize(TIFF*, uint32); extern void _TIFFDefaultTileSize(TIFF*, uint32*, uint32*); extern void _TIFFsetByteArray(void**, void*, long); extern void _TIFFsetString(char**, char*); extern void _TIFFsetShortArray(uint16**, uint16*, long); extern void _TIFFsetLongArray(uint32**, uint32*, long); extern void _TIFFsetFloatArray(float**, float*, long); extern void _TIFFsetDoubleArray(double**, double*, long); extern void _TIFFprintAscii(FILE*, const char*); extern void _TIFFprintAsciiTag(FILE*, const char*, const char*); GLOBALDATA(TIFFErrorHandler,_TIFFwarningHandler); GLOBALDATA(TIFFErrorHandler,_TIFFerrorHandler); extern int TIFFInitDumpMode(TIFF*, int); #ifdef PACKBITS_SUPPORT extern int TIFFInitPackBits(TIFF*, int); #endif #ifdef CCITT_SUPPORT extern int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int); extern int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int); #endif #ifdef THUNDER_SUPPORT extern int TIFFInitThunderScan(TIFF*, int); #endif #ifdef NEXT_SUPPORT extern int TIFFInitNeXT(TIFF*, int); #endif #ifdef LZW_SUPPORT extern int TIFFInitLZW(TIFF*, int); #endif #ifdef OJPEG_SUPPORT extern int TIFFInitOJPEG(TIFF*, int); #endif #ifdef JPEG_SUPPORT extern int TIFFInitJPEG(TIFF*, int); #endif #ifdef JBIG_SUPPORT extern int TIFFInitJBIG(TIFF*, int); #endif #ifdef ZIP_SUPPORT extern int TIFFInitZIP(TIFF*, int); #endif #ifdef PIXARLOG_SUPPORT extern int TIFFInitPixarLog(TIFF*, int); #endif #ifdef LOGLUV_SUPPORT extern int TIFFInitSGILog(TIFF*, int); #endif #ifdef VMS extern const TIFFCodec _TIFFBuiltinCODECS[]; #else extern TIFFCodec _TIFFBuiltinCODECS[]; #endif #if defined(__cplusplus) } #endif #endif /* _TIFFIOP_ */ gamera-3.3.3/src/libtiff/tiffvers.h0000644000076500000000000000063210714675674016173 0ustar chriswheel#define TIFFLIB_VERSION_STR "LIBTIFF, Version 3.5.7\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." /* * This define can be used in code that requires * compilation-related definitions specific to a * version or versions of the library. Runtime * version checking should be done based on the * string returned by TIFFGetVersion. */ #define TIFFLIB_VERSION 20011123 gamera-3.3.3/src/libtiff/uvcode.h0000644000076500000000000001144110714675674015630 0ustar chriswheel/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */ #define UV_SQSIZ (float)0.003500 #define UV_NDIVS 16289 #define UV_VSTART (float)0.016940 #define UV_NVS 163 static struct { float ustart; short nus, ncum; } uv_row[UV_NVS] = { (float)0.247663, 4, 0, (float)0.243779, 6, 4, (float)0.241684, 7, 10, (float)0.237874, 9, 17, (float)0.235906, 10, 26, (float)0.232153, 12, 36, (float)0.228352, 14, 48, (float)0.226259, 15, 62, (float)0.222371, 17, 77, (float)0.220410, 18, 94, (float)0.214710, 21, 112, (float)0.212714, 22, 133, (float)0.210721, 23, 155, (float)0.204976, 26, 178, (float)0.202986, 27, 204, (float)0.199245, 29, 231, (float)0.195525, 31, 260, (float)0.193560, 32, 291, (float)0.189878, 34, 323, (float)0.186216, 36, 357, (float)0.186216, 36, 393, (float)0.182592, 38, 429, (float)0.179003, 40, 467, (float)0.175466, 42, 507, (float)0.172001, 44, 549, (float)0.172001, 44, 593, (float)0.168612, 46, 637, (float)0.168612, 46, 683, (float)0.163575, 49, 729, (float)0.158642, 52, 778, (float)0.158642, 52, 830, (float)0.158642, 52, 882, (float)0.153815, 55, 934, (float)0.153815, 55, 989, (float)0.149097, 58, 1044, (float)0.149097, 58, 1102, (float)0.142746, 62, 1160, (float)0.142746, 62, 1222, (float)0.142746, 62, 1284, (float)0.138270, 65, 1346, (float)0.138270, 65, 1411, (float)0.138270, 65, 1476, (float)0.132166, 69, 1541, (float)0.132166, 69, 1610, (float)0.126204, 73, 1679, (float)0.126204, 73, 1752, (float)0.126204, 73, 1825, (float)0.120381, 77, 1898, (float)0.120381, 77, 1975, (float)0.120381, 77, 2052, (float)0.120381, 77, 2129, (float)0.112962, 82, 2206, (float)0.112962, 82, 2288, (float)0.112962, 82, 2370, (float)0.107450, 86, 2452, (float)0.107450, 86, 2538, (float)0.107450, 86, 2624, (float)0.107450, 86, 2710, (float)0.100343, 91, 2796, (float)0.100343, 91, 2887, (float)0.100343, 91, 2978, (float)0.095126, 95, 3069, (float)0.095126, 95, 3164, (float)0.095126, 95, 3259, (float)0.095126, 95, 3354, (float)0.088276, 100, 3449, (float)0.088276, 100, 3549, (float)0.088276, 100, 3649, (float)0.088276, 100, 3749, (float)0.081523, 105, 3849, (float)0.081523, 105, 3954, (float)0.081523, 105, 4059, (float)0.081523, 105, 4164, (float)0.074861, 110, 4269, (float)0.074861, 110, 4379, (float)0.074861, 110, 4489, (float)0.074861, 110, 4599, (float)0.068290, 115, 4709, (float)0.068290, 115, 4824, (float)0.068290, 115, 4939, (float)0.068290, 115, 5054, (float)0.063573, 119, 5169, (float)0.063573, 119, 5288, (float)0.063573, 119, 5407, (float)0.063573, 119, 5526, (float)0.057219, 124, 5645, (float)0.057219, 124, 5769, (float)0.057219, 124, 5893, (float)0.057219, 124, 6017, (float)0.050985, 129, 6141, (float)0.050985, 129, 6270, (float)0.050985, 129, 6399, (float)0.050985, 129, 6528, (float)0.050985, 129, 6657, (float)0.044859, 134, 6786, (float)0.044859, 134, 6920, (float)0.044859, 134, 7054, (float)0.044859, 134, 7188, (float)0.040571, 138, 7322, (float)0.040571, 138, 7460, (float)0.040571, 138, 7598, (float)0.040571, 138, 7736, (float)0.036339, 142, 7874, (float)0.036339, 142, 8016, (float)0.036339, 142, 8158, (float)0.036339, 142, 8300, (float)0.032139, 146, 8442, (float)0.032139, 146, 8588, (float)0.032139, 146, 8734, (float)0.032139, 146, 8880, (float)0.027947, 150, 9026, (float)0.027947, 150, 9176, (float)0.027947, 150, 9326, (float)0.023739, 154, 9476, (float)0.023739, 154, 9630, (float)0.023739, 154, 9784, (float)0.023739, 154, 9938, (float)0.019504, 158, 10092, (float)0.019504, 158, 10250, (float)0.019504, 158, 10408, (float)0.016976, 161, 10566, (float)0.016976, 161, 10727, (float)0.016976, 161, 10888, (float)0.016976, 161, 11049, (float)0.012639, 165, 11210, (float)0.012639, 165, 11375, (float)0.012639, 165, 11540, (float)0.009991, 168, 11705, (float)0.009991, 168, 11873, (float)0.009991, 168, 12041, (float)0.009016, 170, 12209, (float)0.009016, 170, 12379, (float)0.009016, 170, 12549, (float)0.006217, 173, 12719, (float)0.006217, 173, 12892, (float)0.005097, 175, 13065, (float)0.005097, 175, 13240, (float)0.005097, 175, 13415, (float)0.003909, 177, 13590, (float)0.003909, 177, 13767, (float)0.002340, 177, 13944, (float)0.002389, 170, 14121, (float)0.001068, 164, 14291, (float)0.001653, 157, 14455, (float)0.000717, 150, 14612, (float)0.001614, 143, 14762, (float)0.000270, 136, 14905, (float)0.000484, 129, 15041, (float)0.001103, 123, 15170, (float)0.001242, 115, 15293, (float)0.001188, 109, 15408, (float)0.001011, 103, 15517, (float)0.000709, 97, 15620, (float)0.000301, 89, 15717, (float)0.002416, 82, 15806, (float)0.003251, 76, 15888, (float)0.003246, 69, 15964, (float)0.004141, 62, 16033, (float)0.005963, 55, 16095, (float)0.008839, 47, 16150, (float)0.010490, 40, 16197, (float)0.016994, 31, 16237, (float)0.023659, 21, 16268, }; gamera-3.3.3/src/pointobject.cpp0000644000076500000000000001412711652050141015555 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; extern "C" { static PyObject* point_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void point_dealloc(PyObject* self); // get/set static int point_set_x(PyObject* self, PyObject* value); static PyObject* point_get_x(PyObject* self); static int point_set_y(PyObject* self, PyObject* value); static PyObject* point_get_y(PyObject* self); static PyObject* point_richcompare(PyObject* a, PyObject* b, int op); // methods static PyObject* point_move(PyObject* self, PyObject* args); static PyObject* point_repr(PyObject* self); } static PyTypeObject PointType = { PyObject_HEAD_INIT(NULL) 0, }; static PyGetSetDef point_getset[] = { { (char *)"x", (getter)point_get_x, (setter)point_set_x, (char *)"(int property)\n\nThe current x value", 0}, { (char *)"y", (getter)point_get_y, (setter)point_set_y, (char *)"(int property)\n\nThe current y value", 0}, { NULL } }; static PyMethodDef point_methods[] = { { (char *)"move", point_move, METH_VARARGS, (char *)"**move** (*x*, *y*)\n\nMoves the point to the given *x*, *y* coordinate."}, { NULL } }; PyTypeObject* get_PointType() { return &PointType; } static PyObject* _point_new(PyTypeObject* pytype, Point *p) { PointObject* so; so = (PointObject*)pytype->tp_alloc(pytype, 0); so->m_x = p; return (PyObject*)so; } static PyObject* point_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); if (num_args == 2) { int x, y; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "ii", &x, &y)) return _point_new(pytype, new Point((size_t)x, (size_t)y)); } PyErr_Clear(); if (num_args == 1) { PyObject* py_point; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &py_point)) { try { return _point_new(pytype, new Point(coerce_Point(py_point))); } catch (std::invalid_argument e) { ; } } } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments to Point constructor. Must be Point(int x, int y)"); return 0; } static void point_dealloc(PyObject* self) { PointObject* x = (PointObject*)self; delete x->m_x; self->ob_type->tp_free(self); } #define CREATE_GET_FUNC(name) static PyObject* point_get_##name(PyObject* self) {\ Point* x = ((PointObject*)self)->m_x; \ return PyInt_FromLong((int)x->name()); \ } #define CREATE_SET_FUNC(name) static int point_set_##name(PyObject* self, PyObject* value) {\ Point* x = ((PointObject*)self)->m_x; \ x->name((size_t)PyInt_AS_LONG(value)); \ return 0; \ } CREATE_GET_FUNC(x) CREATE_GET_FUNC(y) CREATE_SET_FUNC(x) CREATE_SET_FUNC(y) static PyObject* point_move(PyObject* self, PyObject* args) { Point* x = ((PointObject*)self)->m_x; int xv, y; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "ii:move", &xv, &y) <= 0) return 0; x->move(xv, y); Py_INCREF(Py_None); return Py_None; } static PyObject* point_richcompare(PyObject* a, PyObject* b, int op) { if (!is_PointObject(a)) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Point ap = *((PointObject*)a)->m_x; Point bp; try { bp = coerce_Point(b); } catch (std::invalid_argument e) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_LT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_LE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_EQ: cmp = ap == bp; break; case Py_NE: cmp = ap != bp; break; case Py_GT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_GE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; default: return 0; // cannot happen } if (cmp) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* point_repr(PyObject* self) { Point* x = ((PointObject*)self)->m_x; return PyString_FromFormat("Point(%i, %i)", (int)x->x(), (int)x->y()); } static long point_hash(PyObject* self) { Point* x = ((PointObject*)self)->m_x; return ((x->x() << 16) + x->y()); } void init_PointType(PyObject* module_dict) { PointType.ob_type = &PyType_Type; PointType.tp_name = CHAR_PTR_CAST "gameracore.Point"; PointType.tp_basicsize = sizeof(PointObject); PointType.tp_dealloc = point_dealloc; PointType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; PointType.tp_new = point_new; PointType.tp_getattro = PyObject_GenericGetAttr; PointType.tp_alloc = NULL; // PyType_GenericAlloc; PointType.tp_richcompare = point_richcompare; PointType.tp_getset = point_getset; PointType.tp_free = NULL; // _PyObject_Del; PointType.tp_methods = point_methods; PointType.tp_repr = point_repr; PointType.tp_hash = point_hash; PointType.tp_doc = CHAR_PTR_CAST "__init__(Int *x*, Int *y*)\n\n" "Point stores an (*x*, *y*) coordinate point.\n\n" "Most functions that take a Point as an argument can also take a\n" "2-element sequence. For example, the following are all equivalent:\n\n" ".. code:: Python\n\n" " px = image.get(Point(5, 2))\n" " px = image.get((5, 2))\n" " px = image.get([5, 2])\n\n"; PyType_Ready(&PointType); PyDict_SetItemString(module_dict, "Point", (PyObject*)&PointType); } gamera-3.3.3/src/rectobject.cpp0000644000076500000000000006401211747510564015376 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" #include using namespace Gamera; extern "C" { static PyObject* rect_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void rect_dealloc(PyObject* self); // get static PyObject* rect_get_ul(PyObject* self); static PyObject* rect_get_ul_x(PyObject* self); static PyObject* rect_get_ul_y(PyObject* self); static PyObject* rect_get_ur(PyObject* self); static PyObject* rect_get_ur_x(PyObject* self); static PyObject* rect_get_ur_y(PyObject* self); static PyObject* rect_get_lr(PyObject* self); static PyObject* rect_get_lr_x(PyObject* self); static PyObject* rect_get_lr_y(PyObject* self); static PyObject* rect_get_ll(PyObject* self); static PyObject* rect_get_ll_x(PyObject* self); static PyObject* rect_get_ll_y(PyObject* self); static PyObject* rect_get_dim(PyObject* self); static PyObject* rect_get_size(PyObject* self); static PyObject* rect_get_ncols(PyObject* self); static PyObject* rect_get_nrows(PyObject* self); static PyObject* rect_get_width(PyObject* self); static PyObject* rect_get_height(PyObject* self); static PyObject* rect_get_offset_x(PyObject* self); static PyObject* rect_get_offset_y(PyObject* self); static PyObject* rect_get_center(PyObject* self); static PyObject* rect_get_center_x(PyObject* self); static PyObject* rect_get_center_y(PyObject* self); // set static int rect_set_ul(PyObject* self, PyObject* value); static int rect_set_ul_x(PyObject* self, PyObject* value); static int rect_set_ul_y(PyObject* self, PyObject* value); static int rect_set_ur(PyObject* self, PyObject* value); static int rect_set_ur_x(PyObject* self, PyObject* value); static int rect_set_ur_y(PyObject* self, PyObject* value); static int rect_set_lr(PyObject* self, PyObject* value); static int rect_set_lr_x(PyObject* self, PyObject* value); static int rect_set_lr_y(PyObject* self, PyObject* value); static int rect_set_ll(PyObject* self, PyObject* value); static int rect_set_ll_x(PyObject* self, PyObject* value); static int rect_set_ll_y(PyObject* self, PyObject* value); static int rect_set_dim(PyObject* self, PyObject* value); static int rect_set_size(PyObject* self, PyObject* value); static int rect_set_ncols(PyObject* self, PyObject* value); static int rect_set_nrows(PyObject* self, PyObject* value); static int rect_set_width(PyObject* self, PyObject* value); static int rect_set_height(PyObject* self, PyObject* value); static int rect_set_offset_x(PyObject* self, PyObject* value); static int rect_set_offset_y(PyObject* self, PyObject* value); // member functions static PyObject* rect_set(PyObject* self, PyObject* args); static PyObject* rect_move(PyObject* self, PyObject* args); static PyObject* rect_contains_x(PyObject* self, PyObject* args); static PyObject* rect_contains_y(PyObject* self, PyObject* args); static PyObject* rect_contains_point(PyObject* self, PyObject* args); static PyObject* rect_contains_rect(PyObject* self, PyObject* args); static PyObject* rect_expand(PyObject* self, PyObject* args); static PyObject* rect_intersects_x(PyObject* self, PyObject* args); static PyObject* rect_intersects_y(PyObject* self, PyObject* args); static PyObject* rect_intersects(PyObject* self, PyObject* args); static PyObject* rect_intersection(PyObject* self, PyObject* args); static PyObject* rect_union_rects(PyObject* _, PyObject* rects); static PyObject* rect_union(PyObject* self, PyObject* args); static PyObject* rect_distance_euclid(PyObject* self, PyObject* args); static PyObject* rect_distance_bb(PyObject* self, PyObject* args); static PyObject* rect_distance_cx(PyObject* self, PyObject* args); static PyObject* rect_distance_cy(PyObject* self, PyObject* args); static PyObject* rect_richcompare(PyObject* a, PyObject* b, int op); static PyObject* rect_repr(PyObject* self); } static PyTypeObject RectType = { PyObject_HEAD_INIT(NULL) 0, }; static PyGetSetDef rect_getset[] = { {(char *)"ul", (getter)rect_get_ul, (setter)rect_set_ul, (char *)"(Point property)\n\nThe upper-left coordinate of the rectangle in logical coordinate space."}, {(char *)"ul_x", (getter)rect_get_ul_x, (setter)rect_set_ul_x, (char *)"(int property)\n\nThe left edge of the rectangle in logical coordinate space."}, {(char *)"ul_y", (getter)rect_get_ul_y, (setter)rect_set_ul_y, (char *)"(int property)\n\nThe upper edge of the rectangle in logical coordinate space."}, {(char *)"ur", (getter)rect_get_ur, (setter)rect_set_ur, (char *)"(Point property)\n\nThe upper-right coordinate of the rectangle in logical coordinate space."}, {(char *)"ur_x", (getter)rect_get_ur_x, (setter)rect_set_ur_x, (char *)"(int property)\n\nThe right edge of the rectangle in logical coordinate space."}, {(char *)"ur_y", (getter)rect_get_ur_y, (setter)rect_set_ur_y, (char *)"(int property)\n\nThe upper edge of the rectangle in logical coordinate space."}, {(char *)"lr", (getter)rect_get_lr, (setter)rect_set_lr, (char *)"(Point property)\n\nThe lower-right coordinate of the rectangle in logical coordinate space."}, {(char *)"lr_x", (getter)rect_get_lr_x, (setter)rect_set_lr_x, (char *)"(int property)\n\nThe right edge of the rectangle in logical coordinate space."}, {(char *)"lr_y", (getter)rect_get_lr_y, (setter)rect_set_lr_y, (char *)"(int property)\n\nThe lower edge of the rectangle in logical coordinate space."}, {(char *)"ll", (getter)rect_get_ll, (setter)rect_set_ll, (char *)"(Point property)\n\nThe lower-left coordinate of the rectangle in logical coordinate space."}, {(char *)"ll_x", (getter)rect_get_ll_x, (setter)rect_set_ll_x, (char *)"(int property)\n\nThe left edge of the rectangle in logical coordinate space."}, {(char *)"ll_y", (getter)rect_get_ll_y, (setter)rect_set_ll_y, (char *)"(int property)\n\nThe lower edge of the rectangle in logical coordinate space."}, {(char *)"dim", (getter)rect_get_dim, (setter)rect_set_dim, (char *)"(Dim property)\n\nThe dimensions of the rectangle. Equivalent to ``Dim(image.ncols, image.nrows)``."}, {(char *)"size", (getter)rect_get_size, (setter)rect_set_size, (char *)"(Size property)\n\nThe size of the rectangle. Equivalent to ``Size(image.width, image.height)``."}, {(char *)"nrows", (getter)rect_get_nrows, (setter)rect_set_nrows, (char *)"(int property)\n\nThe number of rows in the rectangle."}, {(char *)"ncols", (getter)rect_get_ncols, (setter)rect_set_ncols, (char *)"(int property)\n\nThe number of columns in the rectangle."}, {(char *)"width", (getter)rect_get_width, (setter)rect_set_width, (char *)"(int property)\n\nThe width of the rectangle. Equivalent to ``ncols - 1``."}, {(char *)"height", (getter)rect_get_height, (setter)rect_set_height, (char *)"(int property)\n\nThe height of the rectangle. Equivalent to ``nrows - 1``."}, {(char *)"offset_x", (getter)rect_get_offset_x, (setter)rect_set_offset_x, (char *)"(int property)\n\nThe left edge of the rectangle in the logical coordinate space."}, {(char *)"offset_y", (getter)rect_get_offset_y, (setter)rect_set_offset_y, (char *)"(int property)\n\nThe upper edge of the rectable in the logical coordinate space."}, {(char *)"center", (getter)rect_get_center, NULL, (char *)"(Point property)\n\nThe coordinate at the exact center of the rectangle in the logical coordinate space."}, {(char *)"center_x", (getter)rect_get_center_x, NULL, (char *)"(int property)\n\nThe x-location at the exact center of the rectangle in the logical coordinate space."}, {(char *)"center_y", (getter)rect_get_center_y, NULL, (char *)"(int property)\n\nThe y-location at the exact center of the rectangle in the logical coordinate space."}, { NULL } }; static PyMethodDef rect_methods[] = { {(char *)"rect_set", rect_set, METH_VARARGS, (char *)"**rect_set** (...)\n\nChanges the position and size of the rectangle. Takes the same arguments as the Rect constructor."}, {(char *)"contains_x", rect_contains_x, METH_VARARGS, (char *)"bool **contains_x** (Int *x*)\n\n``True`` if the rectangle contains the given x-value in logical coordinate space."}, {(char *)"contains_y", rect_contains_y, METH_VARARGS, (char *)"bool **contains_y** (Int *y*)\n\n``True`` if the rectangle contains the given y-value in logical coordinate space."}, {(char *)"contains_point", rect_contains_point, METH_VARARGS, (char *)"bool **contains_point** (Point *point*)\n\n``True`` if the rectangle contains the given ``Point`` in logical coordinate space"}, {(char *)"contains_rect", rect_contains_rect, METH_VARARGS, (char *)"bool **contains_rect** (Rect *other*)\n\n``True`` if rectangle completely contains the given rectangle in logical coordinate space."}, {(char *)"expand", rect_expand, METH_VARARGS, (char *)"Rect **expand** (int *size*)\n\nReturns a new Rect that is padded on all four sides by *size*."}, {(char *)"intersects_x", rect_intersects_x, METH_VARARGS, (char *)"bool **intersects_x** (Rect *other*)\n\n``True`` if rectangle intersects the given rectangle in the *x* direction (completely ignoring the *y* direction). (``True`` if the two rectangles are merely \"vertically aligned\".)"}, {(char *)"intersects_y", rect_intersects_y, METH_VARARGS, (char *)"bool **intersects_y** (Rect *other*)\n\n``True`` if rectangle intersects the given rectangle in the *y* direction (completely ignoring the *x* direction). (``True`` if the two rectangles are merely \"horizontally aligned\".)"}, {(char *)"intersects", rect_intersects, METH_VARARGS, (char *)"bool **intersects** (Rect *other*)\n\n``True`` if rectangle intersects with the given rectangle."}, {(char *)"intersection", rect_intersection, METH_VARARGS, (char *)"bool **intersection** (Rect *other*)\n\nReturns a new Rect that is the intersection of ``self`` and the given Rect object."}, {(char *)"move", rect_move, METH_VARARGS}, {(char *)"union_rects", rect_union_rects, METH_O, (char *)"Rect **union_rects** (RectList *rects*)\n\nReturns a new rectangle that encloses all of the given rectangles in a list."}, {(char *)"union", rect_union, METH_VARARGS, (char *)"**union** (Rect *other*)\n\nExpands the rectangle to include the given rectangle and itself."}, {(char *)"distance_euclid", rect_distance_euclid, METH_VARARGS, (char *)"float **distance_euclid** (Rect *other*)\n\nReturns the Euclidean distance between the center points of this rectangle and the given rectangle."}, {(char *)"distance_bb", rect_distance_bb, METH_VARARGS, (char *)"float **distance_bb** (Rect *other*)\n\nReturns the closest (Euclidean) distance between the edges of this rectangle and the edges of the given rectangle."}, {(char *)"distance_cx", rect_distance_cx, METH_VARARGS, (char *)"int **distance_cx** (Rect *other*)\n\nReturns the distance of the center points of this rectangle and the given rectangle in the horizontal direction."}, {(char *)"distance_cy", rect_distance_cy, METH_VARARGS, (char *)"int **distance_cy** (Rect *other*)\n\nReturns the distance of the center points of this rectangle and the given rectangle in the vertical direction."}, {NULL, NULL} }; extern PyTypeObject* get_RectType() { return &RectType; } static PyObject* _rect_new(PyTypeObject* pytype, Rect* rect) { RectObject* so; so = (RectObject*)pytype->tp_alloc(pytype, 0); so->m_x = rect; return (PyObject*)so; } static PyObject* rect_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); if (num_args == 2) { PyObject *a, *b; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO", &a, &b)) { Point point_a; try { point_a = coerce_Point(a); } catch (std::invalid_argument e) { goto phase2; } try { Point point_b = coerce_Point(b); return _rect_new(pytype, new Rect(point_a, point_b)); } catch (std::invalid_argument e) { PyErr_Clear(); if (is_SizeObject(b)) { return _rect_new(pytype, new Rect(point_a, *((SizeObject*)b)->m_x)); } else if (is_DimObject(b)) { return _rect_new(pytype, new Rect(point_a, *((DimObject*)b)->m_x)); } } } } phase2: PyErr_Clear(); if (num_args == 1) { PyObject* other; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O", &other)) { if (is_RectObject(other)) { return _rect_new(pytype, new Rect(*((RectObject*)other)->m_x)); } } } PyErr_Clear(); if (num_args == 0) { return _rect_new(pytype, new Rect()); } PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Incorrect arguments to Rect constructor. See doc(Rect) for valid arguments."); return 0; } static void rect_dealloc(PyObject* self) { RectObject* x = (RectObject*)self; delete x->m_x; self->ob_type->tp_free(self); } /* General case methods The majority of the get/set methods can be exported in a standard way using macros. Below are all of the get/set methods that accept/return ints or points. See below for the special cases. */ #define CREATE_GET_FUNC(name) static PyObject* rect_get_##name(PyObject* self) {\ Rect* x = ((RectObject*)self)->m_x; \ return PyInt_FromLong((int)x->name()); \ } #define CREATE_GET_POINT_FUNC(name) static PyObject* rect_get_##name(PyObject* self) {\ Rect* x = ((RectObject*)self)->m_x; \ return create_PointObject(x->name()); \ } #define CREATE_SET_FUNC(name) static int rect_set_##name(PyObject* self, PyObject* value) {\ if (!PyInt_Check(value)) { \ PyErr_SetString(PyExc_TypeError, "Must be an integer value"); \ return -1; \ } \ Rect* x = ((RectObject*)self)->m_x; \ try { \ x->name((size_t)PyInt_AS_LONG(value)); \ } catch(std::exception& e) { \ PyErr_SetString(PyExc_TypeError, e.what()); \ return -1; \ } \ return 0; \ } #define CREATE_SET_POINT_FUNC(name) static int rect_set_##name(PyObject* self, PyObject* value) {\ try { \ Point p = coerce_Point(value); \ Rect* x = ((RectObject*)self)->m_x; \ try { \ x->name(p); \ } catch(std::exception& e) { \ PyErr_SetString(PyExc_TypeError, e.what()); \ return -1; \ } \ return 0; \ } catch (std::invalid_argument e) { \ return -1; \ } \ } CREATE_GET_POINT_FUNC(ul) CREATE_GET_POINT_FUNC(ur) CREATE_GET_POINT_FUNC(lr) CREATE_GET_POINT_FUNC(ll) CREATE_GET_POINT_FUNC(center) CREATE_GET_FUNC(ul_x) CREATE_GET_FUNC(ul_y) CREATE_GET_FUNC(ur_x) CREATE_GET_FUNC(ur_y) CREATE_GET_FUNC(lr_y) CREATE_GET_FUNC(lr_x) CREATE_GET_FUNC(ll_x) CREATE_GET_FUNC(ll_y) CREATE_GET_FUNC(nrows) CREATE_GET_FUNC(ncols) CREATE_GET_FUNC(width) CREATE_GET_FUNC(height) CREATE_GET_FUNC(offset_x) CREATE_GET_FUNC(offset_y) CREATE_GET_FUNC(center_x) CREATE_GET_FUNC(center_y) CREATE_SET_POINT_FUNC(ul) CREATE_SET_POINT_FUNC(ur) CREATE_SET_POINT_FUNC(lr) CREATE_SET_POINT_FUNC(ll) CREATE_SET_FUNC(ul_x) CREATE_SET_FUNC(ul_y) CREATE_SET_FUNC(ur_x) CREATE_SET_FUNC(ur_y) CREATE_SET_FUNC(lr_y) CREATE_SET_FUNC(lr_x) CREATE_SET_FUNC(ll_x) CREATE_SET_FUNC(ll_y) CREATE_SET_FUNC(nrows) CREATE_SET_FUNC(ncols) CREATE_SET_FUNC(width) CREATE_SET_FUNC(height) CREATE_SET_FUNC(offset_x) CREATE_SET_FUNC(offset_y) /* Special case get/set methods */ static PyObject* rect_get_size(PyObject* self) { Rect* x = ((RectObject*)self)->m_x; return create_SizeObject(x->size()); } static PyObject* rect_get_dim(PyObject* self) { Rect* x = ((RectObject*)self)->m_x; return create_DimObject(x->dim()); } static int rect_set_size(PyObject* self, PyObject* value) { Rect* x = ((RectObject*)self)->m_x; Size* size = ((SizeObject*)value)->m_x; x->size(*size); return 0; } static int rect_set_dim(PyObject* self, PyObject* value) { if (!is_DimObject(value)) { PyErr_SetString(PyExc_TypeError, "Must be a Dim object."); return -1; } Rect* x = ((RectObject*)self)->m_x; Dim* dim = ((DimObject*)value)->m_x; x->dim(*dim); return 0; } /* Standard methods */ static PyObject* rect_set(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* py_other = rect_new(get_RectType(), args, NULL); if (py_other == NULL) { PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Incorrect arguments to rect_set. See doc(rect_set) for valid arguments."); return 0; } Rect* other = ((RectObject*)py_other)->m_x; x->rect_set(other->origin(), other->dim()); Py_DECREF(py_other); Py_INCREF(Py_None); return Py_None; } static PyObject* rect_move(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; int xv, y; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "ii:move", &xv, &y) <= 0) { return 0; } x->move(xv, y); Py_INCREF(Py_None); return Py_None; } static PyObject* rect_contains_x(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; int xv; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "i:contains_x", &xv) <= 0) return 0; if (x->contains_x(xv)) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* rect_contains_y(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; int y; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "i:contains_y", &y) <= 0) return 0; if (x->contains_y(y)) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* rect_contains_point(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* py_point; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:contains_point", &py_point)) { try { Point point = coerce_Point(py_point); if (x->contains_point(point)) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } catch (std::invalid_argument e) { ; } } return 0; } static PyObject* rect_contains_rect(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:contains_rect", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } if (x->contains_rect(*((RectObject*)rect)->m_x)) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* rect_expand(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; long size; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "i:expand", &size) <= 0) return 0; PyTypeObject* pytype = get_RectType(); RectObject* so = (RectObject*)pytype->tp_alloc(pytype, 0); so->m_x = new Rect(x->expand(size)); return (PyObject*)so; } static PyObject* rect_intersects_x(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:intersects_x", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } if (x->intersects_x(*((RectObject*)rect)->m_x)) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* rect_intersects_y(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:intersects_y", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } if (x->intersects_y(*((RectObject*)rect)->m_x)) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* rect_intersects(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:intersects", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } if (x->intersects(*((RectObject*)rect)->m_x)) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* rect_intersection (PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:intersection", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } PyTypeObject* pytype = get_RectType(); RectObject* so = (RectObject*)pytype->tp_alloc(pytype, 0); so->m_x = new Rect(x->intersection(*((RectObject*)rect)->m_x)); return (PyObject*)so; } static PyObject* rect_union_rects(PyObject* _ /* staticmethod */, PyObject* l) { PyObject* seq = PySequence_Fast(l, "First argument must be iterable of Rects"); if (seq == NULL) return 0; int num_rects = PySequence_Fast_GET_SIZE(seq); std::vector vec(num_rects); for (int i=0; i < num_rects; ++i) { PyObject* py_rect = PySequence_Fast_GET_ITEM(seq, i); if (!is_RectObject(py_rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a list of Rects"); return 0; } vec[i] = ((RectObject *)py_rect)->m_x; } Py_DECREF(seq); PyTypeObject* pytype = get_RectType(); RectObject* so = (RectObject*)pytype->tp_alloc(pytype, 0); so->m_x = Rect::union_rects(vec); return (PyObject*)so; } static PyObject* rect_union(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:union", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } x->union_rect(*((RectObject*)rect)->m_x); Py_INCREF(Py_None); return Py_None; } static PyObject* rect_distance_euclid(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:distance_euclid", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } return PyFloat_FromDouble(x->distance_euclid(*((RectObject*)rect)->m_x)); } static PyObject* rect_distance_bb(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:distance_bb", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } return PyFloat_FromDouble(x->distance_bb(*((RectObject*)rect)->m_x)); } static PyObject* rect_distance_cx(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:distance_cx", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } return PyInt_FromLong((long)x->distance_cx(*((RectObject*)rect)->m_x)); } static PyObject* rect_distance_cy(PyObject* self, PyObject* args) { Rect* x = ((RectObject*)self)->m_x; PyObject* rect; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:distance_cy", &rect) <= 0) return 0; if (!is_RectObject(rect)) { PyErr_SetString(PyExc_TypeError, "Argument must be a Rect object."); return 0; } return PyInt_FromLong((long)x->distance_cy(*((RectObject*)rect)->m_x)); } static PyObject* rect_richcompare(PyObject* a, PyObject* b, int op) { if (!is_RectObject(a) || !is_RectObject(b)) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Rect& ap = *((RectObject*)a)->m_x; Rect& bp = *((RectObject*)b)->m_x; /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_EQ: cmp = ap == bp; break; case Py_NE: cmp = ap != bp; break; case Py_LT: case Py_LE: case Py_GT: case Py_GE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; default: return 0; // cannot happen } if (cmp) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* rect_repr(PyObject* self) { Rect* x = ((RectObject*)self)->m_x; return PyString_FromFormat("Rect(Point(%i, %i), Dim(%i, %i))", (int)x->offset_x(), (int)x->offset_y(), (int)x->ncols(), (int)x->nrows()); } static long rect_hash(PyObject* self) { Rect* x = ((RectObject*)self)->m_x; return (((x->ul_x() & 0xff) << 24) & ((x->ul_y() & 0xff) << 16) & ((x->lr_x() & 0xff) << 8) & (x->lr_y() & 0xff)); } void init_RectType(PyObject* module_dict) { RectType.ob_type = &PyType_Type; RectType.tp_name = CHAR_PTR_CAST "gameracore.Rect"; RectType.tp_basicsize = sizeof(RectObject); RectType.tp_dealloc = rect_dealloc; RectType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; RectType.tp_methods = rect_methods; RectType.tp_getset = rect_getset; RectType.tp_new = rect_new; RectType.tp_getattro = PyObject_GenericGetAttr; RectType.tp_alloc = NULL; RectType.tp_richcompare = rect_richcompare; RectType.tp_free = NULL; RectType.tp_repr = rect_repr; RectType.tp_hash = rect_hash; RectType.tp_doc = CHAR_PTR_CAST "There are a number of ways to initialize a ``Rect`` object:\n\n" " - **Rect** (Point *upper_left*, Point *lower_right*)\n\n" " - **Rect** (Point *upper_left*, Size *size*)\n\n" " - **Rect** (Point *upper_left*, Dim *dim*)\n\n" " - **Rect** (Rect *rectangle*)\n\n" "The ``Rect`` class manages bounding boxes, and has a number of methods " "to modify and analyse those bounding boxes.\n\n"; PyType_Ready(&RectType); PyDict_SetItemString(module_dict, "Rect", (PyObject*)&RectType); } gamera-3.3.3/src/regionmapobject.cpp0000644000076500000000000001063611652050141016406 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; extern "C" { static PyObject* regionmap_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void regionmap_dealloc(PyObject* self); static PyObject* regionmap_lookup(PyObject* self, PyObject* args); static PyObject* regionmap_add_region(PyObject* self, PyObject* args); static PyObject* regionmap___getitem__(PyObject* self, Py_ssize_t index); static Py_ssize_t regionmap___len__(PyObject* self); } static PyTypeObject RegionMapType = { PyObject_HEAD_INIT(NULL) 0, }; static PySequenceMethods RegionMapSequenceMethods = { 0, }; static PyMethodDef regionmap_methods[] = { { CHAR_PTR_CAST "lookup", regionmap_lookup, METH_VARARGS }, { CHAR_PTR_CAST "add_region", regionmap_add_region, METH_VARARGS }, { NULL } }; PyTypeObject* get_RegionMapType() { return &RegionMapType; } static PyObject* regionmap_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); if (num_args != 0) { PyErr_SetString(PyExc_TypeError, "Invalid arguments to ImageInfo constructor."); return 0; } RegionMapObject* so; so = (RegionMapObject*)pytype->tp_alloc(pytype, 0); so->m_x = new RegionMap(); return (PyObject*)so; } static void regionmap_dealloc(PyObject* self) { RegionMapObject* r = (RegionMapObject*)self; delete r->m_x; self->ob_type->tp_free(self); } static PyObject* regionmap_lookup(PyObject* self, PyObject* args) { PyObject* key; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:lookup", &key) <= 0) return 0; if (!is_RectObject(key)) { PyErr_SetString(PyExc_TypeError, "Key must be a Rect!"); return 0; } RegionMapObject* r = (RegionMapObject*)self; Region tmp = r->m_x->lookup(*((RectObject*)key)->m_x); return create_RegionObject(tmp); } static PyObject* regionmap_add_region(PyObject* self, PyObject* args) { PyObject* key; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "O:add_region", &key) <= 0) return 0; if (!is_RegionObject(key)) { PyErr_SetString(PyExc_TypeError, "Must be a Region!"); return 0; } RegionMapObject* r = (RegionMapObject*)self; Region* region = (Region*)((RectObject*)key)->m_x; r->m_x->add_region(*region); Py_INCREF(Py_None); return Py_None; } static PyObject* regionmap___getitem__(PyObject* self, Py_ssize_t index) { RegionMap* r = ((RegionMapObject*)self)->m_x; if (index < 0 || (unsigned int)(index) >= r->size()) { PyErr_SetString(PyExc_IndexError, "Index out of range"); return 0; } RegionMap::iterator it = (*r).begin(); for (size_t i = 0; i != (unsigned int)index; ++i, ++it) ; return create_RegionObject(*it); } static Py_ssize_t regionmap___len__(PyObject* self) { return (((RegionMapObject*)self)->m_x->size()); } void init_RegionMapType(PyObject* module_dict) { RegionMapSequenceMethods.sq_item = regionmap___getitem__; RegionMapSequenceMethods.sq_length = regionmap___len__; RegionMapType.ob_type = &PyType_Type; RegionMapType.tp_name = CHAR_PTR_CAST "gameracore.RegionMap"; RegionMapType.tp_basicsize = sizeof(RegionMapObject); RegionMapType.tp_dealloc = regionmap_dealloc; RegionMapType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; RegionMapType.tp_methods = regionmap_methods; RegionMapType.tp_new = regionmap_new; RegionMapType.tp_getattro = PyObject_GenericGetAttr; RegionMapType.tp_alloc = NULL; // PyType_GenericAlloc; RegionMapType.tp_free = NULL; // _PyObject_Del; RegionMapType.tp_as_sequence = &RegionMapSequenceMethods; PyType_Ready(&RegionMapType); PyDict_SetItemString(module_dict, "RegionMap", (PyObject*)&RegionMapType); } gamera-3.3.3/src/regionobject.cpp0000644000076500000000000000751611652050141015713 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; extern "C" { static PyObject* region_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void region_dealloc(PyObject* self); static PyObject* region_get(PyObject* self, PyObject* args); static PyObject* region_add(PyObject* self, PyObject* args); } static PyTypeObject RegionType = { PyObject_HEAD_INIT(NULL) 0, }; static PyMethodDef region_methods[] = { { CHAR_PTR_CAST "get", region_get, METH_VARARGS }, { CHAR_PTR_CAST "add", region_add, METH_VARARGS }, { NULL } }; PyTypeObject* get_RegionType() { return &RegionType; } static PyObject* _region_new(PyTypeObject* pytype, Region* region) { RectObject* so; so = (RectObject*)pytype->tp_alloc(pytype, 0); so->m_x = region; return (PyObject*)so; } static PyObject* region_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int num_args = PyTuple_GET_SIZE(args); if (num_args == 2) { PyObject *a, *b; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "OO", &a, &b)) { Point point_a; try { point_a = coerce_Point(a); } catch (std::invalid_argument e) { goto phase2; } try { Point point_b = coerce_Point(b); return _region_new(pytype, new Region(point_a, point_b)); } catch (std::invalid_argument e) { if (is_SizeObject(b)) { return _region_new(pytype, new Region(point_a, *((SizeObject*)b)->m_x)); } else if (is_DimObject(b)) { return _region_new(pytype, new Region(point_a, *((DimObject*)b)->m_x)); } } } } phase2: PyErr_Clear(); PyErr_SetString(PyExc_TypeError, "Invalid arguments for Region constructor."); return 0; } static void region_dealloc(PyObject* self) { RectObject* r = (RectObject*)self; delete r->m_x; self->ob_type->tp_free(self); } static PyObject* region_get(PyObject* self, PyObject* args) { char* key; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "s", &key) <= 0) return 0; RectObject* r = (RectObject*)self; Region* region = (Region*)r->m_x; return Py_BuildValue(CHAR_PTR_CAST "d", region->get(key)); } static PyObject* region_add(PyObject* self, PyObject* args) { char* key; double value; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "sd", &key, &value) <= 0) return 0; RectObject* r = (RectObject*)self; Region* region = (Region*)r->m_x; region->add(key, value); Py_INCREF(Py_None); return Py_None; } void init_RegionType(PyObject* module_dict) { RegionType.ob_type = &PyType_Type; RegionType.tp_name = CHAR_PTR_CAST "gameracore.Region"; RegionType.tp_basicsize = sizeof(RegionObject); RegionType.tp_dealloc = region_dealloc; RegionType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; RegionType.tp_base = get_RectType(); RegionType.tp_methods = region_methods; RegionType.tp_new = region_new; RegionType.tp_getattro = PyObject_GenericGetAttr; RegionType.tp_alloc = NULL; // PyType_GenericAlloc; RegionType.tp_free = NULL; // _PyObject_Del; PyType_Ready(&RegionType); PyDict_SetItemString(module_dict, "Region", (PyObject*)&RegionType); } gamera-3.3.3/src/rgbpixelobject.cpp0000644000076500000000000002130011652050141016227 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, Karl MacMillan * 2010 Oliver Christen, Christoph Dalitz * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; extern "C" { static PyObject* rgbpixel_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void rgbpixel_dealloc(PyObject* self); // get/set static int rgbpixel_set_red(PyObject* self, PyObject* value); static int rgbpixel_set_green(PyObject* self, PyObject* value); static int rgbpixel_set_blue(PyObject* self, PyObject* value); static PyObject* rgbpixel_get_red(PyObject* self); static PyObject* rgbpixel_get_green(PyObject* self); static PyObject* rgbpixel_get_blue(PyObject* self); static PyObject* rgbpixel_get_hue(PyObject* self); static PyObject* rgbpixel_get_saturation(PyObject* self); static PyObject* rgbpixel_get_value(PyObject* self); static PyObject* rgbpixel_get_cie_x(PyObject* self); static PyObject* rgbpixel_get_cie_y(PyObject* self); static PyObject* rgbpixel_get_cie_z(PyObject* self); static PyObject* rgbpixel_get_cie_Lab_L(PyObject* self); static PyObject* rgbpixel_get_cie_Lab_a(PyObject* self); static PyObject* rgbpixel_get_cie_Lab_b(PyObject* self); static PyObject* rgbpixel_get_cyan(PyObject* self); static PyObject* rgbpixel_get_magenta(PyObject* self); static PyObject* rgbpixel_get_yellow(PyObject* self); } static PyTypeObject RGBPixelType = { PyObject_HEAD_INIT(NULL) 0, }; PyTypeObject* get_RGBPixelType() { return &RGBPixelType; } static PyGetSetDef rgbpixel_getset[] = { { (char *)"red", (getter)rgbpixel_get_red, (setter)rgbpixel_set_red, (char *)"(int property)\n\nThe current red value [0,255]", 0 }, { (char *)"green", (getter)rgbpixel_get_green, (setter)rgbpixel_set_green, (char *)"(int property)\n\nThe current green value [0, 255]", 0 }, { (char *)"blue", (getter)rgbpixel_get_blue, (setter)rgbpixel_set_blue, (char *)"(int property)\n\nThe current blue value [0, 255]", 0 }, { (char *)"hue", (getter)rgbpixel_get_hue, 0, (char *)"(float property)\n\nThe hue [0, 1.0]", 0 }, { (char *)"saturation", (getter)rgbpixel_get_saturation, 0, (char *)"(float property)\n\nThe saturation [0, 1.0]", 0 }, { (char *)"value", (getter)rgbpixel_get_value, 0, (char *)"(float property)\n\nThe value [0, 1.0]", 0 }, { (char *)"cie_x", (getter)rgbpixel_get_cie_x, 0, (char *)"(float property)\n\nThe x value in CIE XYZ color space [0, 1.0]", 0 }, { (char *)"cie_y", (getter)rgbpixel_get_cie_y, 0, (char *)"(float property)\n\nThe y value in CIE XYZ color space [0, 1.0]", 0 }, { (char *)"cie_z", (getter)rgbpixel_get_cie_z, 0, (char *)"(float property)\n\nThe z value in CIE XYZ color space [0, 1.0]", 0 }, { (char *)"cie_Lab_L", (getter)rgbpixel_get_cie_Lab_L, 0, (char *)"(float property)\n\nThe L value in CIE L*a*b* color space [0, 100]", 0 }, { (char *)"cie_Lab_a", (getter)rgbpixel_get_cie_Lab_a, 0, (char *)"(float property)\n\nThe a value in CIE L*a*b* color space [-86.2, 98.3]", 0 }, { (char *)"cie_Lab_b", (getter)rgbpixel_get_cie_Lab_b, 0, (char *)"(float property)\n\nThe b value in CIE L*a*b* color space [-107.9, 94.5]", 0 }, { (char *)"cyan", (getter)rgbpixel_get_cyan, 0, (char *)"(int property)\n\nThe cyan value [0, 255]", 0 }, { (char *)"magenta", (getter)rgbpixel_get_magenta, 0, (char *)"(int property)\n\nThe magenta value [0, 255]", 0 }, { (char *)"yellow", (getter)rgbpixel_get_yellow, 0, (char *)"(int property)\n\nThe yellow value [0, 255]", 0 }, { NULL } }; static PyObject* rgbpixel_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int red, green, blue; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "iii", &red, &green, &blue) <= 0) return 0; if (red < 0 || red > 255) { PyErr_Format(PyExc_ValueError, "'red' value '%d' is out of range (0, 255)", red); return 0; } if (green < 0 || green > 255) { PyErr_Format(PyExc_ValueError, "'green' value '%d' is out of range (0, 255)", green); return 0; } if (blue < 0 || blue > 255) { PyErr_Format(PyExc_ValueError, "'blue' value '%d' is out of range (0, 255)", blue); return 0; } RGBPixelObject* so = (RGBPixelObject*)pytype->tp_alloc(pytype, 0); so->m_x = new RGBPixel(red, green, blue); return (PyObject*)so; } static void rgbpixel_dealloc(PyObject* self) { RGBPixelObject* x = (RGBPixelObject*)self; delete x->m_x; self->ob_type->tp_free(self); } #define CREATE_GET_FUNC(name) static PyObject* rgbpixel_get_##name(PyObject* self) {\ RGBPixel* x = ((RGBPixelObject*)self)->m_x; \ return PyInt_FromLong((int)x->name()); \ } #define CREATE_FLOAT_GET_FUNC(name) static PyObject* rgbpixel_get_##name(PyObject* self) {\ RGBPixel* x = ((RGBPixelObject*)self)->m_x; \ return PyFloat_FromDouble(x->name()); \ } #define CREATE_SET_FUNC(name) static int rgbpixel_set_##name(PyObject* self, PyObject* value) {\ RGBPixel* x = ((RGBPixelObject*)self)->m_x; \ x->name((size_t)PyInt_AS_LONG(value)); \ return 0; \ } CREATE_GET_FUNC(red) CREATE_GET_FUNC(green) CREATE_GET_FUNC(blue) CREATE_SET_FUNC(red) CREATE_SET_FUNC(green) CREATE_SET_FUNC(blue) CREATE_FLOAT_GET_FUNC(hue) CREATE_FLOAT_GET_FUNC(saturation) CREATE_FLOAT_GET_FUNC(value) CREATE_FLOAT_GET_FUNC(cie_x) CREATE_FLOAT_GET_FUNC(cie_y) CREATE_FLOAT_GET_FUNC(cie_z) CREATE_FLOAT_GET_FUNC(cie_Lab_L) CREATE_FLOAT_GET_FUNC(cie_Lab_a) CREATE_FLOAT_GET_FUNC(cie_Lab_b) CREATE_GET_FUNC(cyan) CREATE_GET_FUNC(magenta) CREATE_GET_FUNC(yellow) static PyObject* rgbpixel_richcompare(PyObject* a, PyObject* b, int op) { if (!is_RGBPixelObject(a) || !is_RGBPixelObject(b)) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } RGBPixel& ap = *((RGBPixelObject*)a)->m_x; RGBPixel& bp = *((RGBPixelObject*)b)->m_x; /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_LT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_LE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_EQ: cmp = ap == bp; break; case Py_NE: cmp = ap != bp; break; case Py_GT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_GE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; default: return 0; // cannot happen } if (cmp) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* rgbpixel_repr(PyObject* self) { RGBPixel* x = ((RGBPixelObject*)self)->m_x; return PyString_FromFormat("RGBPixel(%i, %i, %i)", x->red(), x->green(), x->blue()); } static PyObject* rgbpixel_str(PyObject* self) { RGBPixel* x = ((RGBPixelObject*)self)->m_x; return PyString_FromFormat("(%i, %i, %i)", x->red(), x->green(), x->blue()); } static long rgbpixel_hash(PyObject* self) { RGBPixel* x = ((RGBPixelObject*)self)->m_x; return ((x->red() << 16) & (x->green() << 8) & x->blue()); } void init_RGBPixelType(PyObject* module_dict) { RGBPixelType.ob_type = &PyType_Type; RGBPixelType.tp_name = CHAR_PTR_CAST "gameracore.RGBPixel"; RGBPixelType.tp_basicsize = sizeof(RGBPixelObject); RGBPixelType.tp_dealloc = rgbpixel_dealloc; RGBPixelType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; RGBPixelType.tp_new = rgbpixel_new; RGBPixelType.tp_getattro = PyObject_GenericGetAttr; RGBPixelType.tp_alloc = NULL; // PyType_GenericAlloc; RGBPixelType.tp_richcompare = rgbpixel_richcompare; RGBPixelType.tp_getset = rgbpixel_getset; RGBPixelType.tp_free = NULL; // _PyObject_Del; RGBPixelType.tp_repr = rgbpixel_repr; RGBPixelType.tp_str = rgbpixel_str; RGBPixelType.tp_hash = rgbpixel_hash; RGBPixelType.tp_doc = CHAR_PTR_CAST "__init__(*red*, *green*, *blue*).\n\n" "Example: ``RGBPixel(255, 0, 0)``.\n\n" "Each color value is in the range 0-255 (8 bits).\n\n" "For more information about color operations, see the `Color plugin docs`__.\n\n" ".. __: color.html"; PyType_Ready(&RGBPixelType); PyDict_SetItemString(module_dict, "RGBPixel", (PyObject*)&RGBPixelType); } gamera-3.3.3/src/sizeobject.cpp0000644000076500000000000001163111652050141015373 0ustar chriswheel/* * * Copyright (C) 2001-2005 Ichiro Fujinaga, Michael Droettboom, and Karl MacMillan * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define GAMERACORE_INTERNAL #include "gameramodule.hpp" using namespace Gamera; extern "C" { static PyObject* size_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds); static void size_dealloc(PyObject* self); static PyObject* size_get_width(PyObject* self); static int size_set_width(PyObject* self, PyObject* value); static PyObject* size_get_height(PyObject* self); static int size_set_height(PyObject* self, PyObject* value); static PyObject* size_richcompare(PyObject* a, PyObject* b, int op); static PyObject* size_repr(PyObject* self); } static PyTypeObject SizeType = { PyObject_HEAD_INIT(NULL) 0, }; static PyGetSetDef size_getset[] = { { (char *)"width", (getter)size_get_width, (setter)size_set_width, (char *)"(int property)\n\nThe width of an object is the right boundary minus the left. This is the same as the number of columns *minus one.*", 0 }, { (char *)"height", (getter)size_get_height, (setter)size_set_height, (char *)"(int property)\n\nThe height of an object is the lower boundary minus the upper boundary (remember that *y* is counted in the negative direction). This is the same as the number of rows *minus one*.", 0 }, { NULL } }; PyTypeObject* get_SizeType() { return &SizeType; } static PyObject* size_new(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { int width, height; if (PyArg_ParseTuple(args, CHAR_PTR_CAST "ii:Size.__init__", &width, &height) <= 0) return 0; SizeObject* so; so = (SizeObject*)pytype->tp_alloc(pytype, 0); so->m_x = new Size((size_t)width, (size_t)height); return (PyObject*)so; } static void size_dealloc(PyObject* self) { SizeObject* x = (SizeObject*)self; delete x->m_x; self->ob_type->tp_free(self); } #define CREATE_GET_FUNC(name) static PyObject* size_get_##name(PyObject* self) {\ Size* x = ((SizeObject*)self)->m_x; \ return Py_BuildValue(CHAR_PTR_CAST "i", (int)x->name()); \ } #define CREATE_SET_FUNC(name) static int size_set_##name(PyObject* self, PyObject* value) {\ Size* x = ((SizeObject*)self)->m_x; \ x->name((size_t)PyInt_AS_LONG(value)); \ return 0; \ } CREATE_GET_FUNC(width) CREATE_SET_FUNC(width) CREATE_GET_FUNC(height) CREATE_SET_FUNC(height) static PyObject* size_richcompare(PyObject* a, PyObject* b, int op) { if (!is_SizeObject(a) || !is_SizeObject(b)) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } Size& as = *((SizeObject*)a)->m_x; Size& bs = *((SizeObject*)b)->m_x; /* Only equality and inequality make sense. */ bool cmp; switch (op) { case Py_LT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_LE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_EQ: cmp = as == bs; break; case Py_NE: cmp = as != bs; break; case Py_GT: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; case Py_GE: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; default: return 0; // cannot happen } if (cmp) { Py_INCREF(Py_True); return Py_True; } else { Py_INCREF(Py_False); return Py_False; } } static PyObject* size_repr(PyObject* self) { Size* x = ((SizeObject*)self)->m_x; return PyString_FromFormat("Size(%i, %i)", (int)x->width(), (int)x->height()); } void init_SizeType(PyObject* module_dict) { SizeType.ob_type = &PyType_Type; SizeType.tp_name = CHAR_PTR_CAST "gameracore.Size"; SizeType.tp_basicsize = sizeof(SizeObject); SizeType.tp_dealloc = size_dealloc; SizeType.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; SizeType.tp_getset = size_getset; SizeType.tp_new = size_new; SizeType.tp_getattro = PyObject_GenericGetAttr; SizeType.tp_alloc = NULL; // PyType_GenericAlloc; SizeType.tp_richcompare = size_richcompare; SizeType.tp_free = NULL; // _PyObject_Del; SizeType.tp_repr = size_repr; SizeType.tp_doc = CHAR_PTR_CAST "Size stores a size (*width*, *height*). This is almost the same as ``Dim``, but stores the number of columns/rows minus one:\n\n *width* == *ncols* - 1\n\n *height* == *nrows* - 1"; PyType_Ready(&SizeType); PyDict_SetItemString(module_dict, "Size", (PyObject*)&SizeType); } gamera-3.3.3/src/zlib-1.2.1/0000755000076500000000000000000011755376174014146 5ustar chriswheelgamera-3.3.3/src/zlib-1.2.1/adler32.c0000755000076500000000000000435110714675677015560 0ustar chriswheel/* adler32.c -- compute the Adler-32 checksum of a data stream * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id: adler32.c 921 2005-09-27 14:12:37Z mdboom $ */ #define ZLIB_INTERNAL #include "zlib.h" #define BASE 65521UL /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ #define DO1(buf,i) {s1 += buf[i]; s2 += s1;} #define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); #define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); #define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); #define DO16(buf) DO8(buf,0); DO8(buf,8); #ifdef NO_DIVIDE # define MOD(a) \ do { \ if (a >= (BASE << 16)) a -= (BASE << 16); \ if (a >= (BASE << 15)) a -= (BASE << 15); \ if (a >= (BASE << 14)) a -= (BASE << 14); \ if (a >= (BASE << 13)) a -= (BASE << 13); \ if (a >= (BASE << 12)) a -= (BASE << 12); \ if (a >= (BASE << 11)) a -= (BASE << 11); \ if (a >= (BASE << 10)) a -= (BASE << 10); \ if (a >= (BASE << 9)) a -= (BASE << 9); \ if (a >= (BASE << 8)) a -= (BASE << 8); \ if (a >= (BASE << 7)) a -= (BASE << 7); \ if (a >= (BASE << 6)) a -= (BASE << 6); \ if (a >= (BASE << 5)) a -= (BASE << 5); \ if (a >= (BASE << 4)) a -= (BASE << 4); \ if (a >= (BASE << 3)) a -= (BASE << 3); \ if (a >= (BASE << 2)) a -= (BASE << 2); \ if (a >= (BASE << 1)) a -= (BASE << 1); \ if (a >= BASE) a -= BASE; \ } while (0) #else # define MOD(a) a %= BASE #endif /* ========================================================================= */ uLong ZEXPORT adler32(adler, buf, len) uLong adler; const Bytef *buf; uInt len; { unsigned long s1 = adler & 0xffff; unsigned long s2 = (adler >> 16) & 0xffff; int k; if (buf == Z_NULL) return 1L; while (len > 0) { k = len < NMAX ? (int)len : NMAX; len -= k; while (k >= 16) { DO16(buf); buf += 16; k -= 16; } if (k != 0) do { s1 += *buf++; s2 += s1; } while (--k); MOD(s1); MOD(s2); } return (s2 << 16) | s1; } gamera-3.3.3/src/zlib-1.2.1/compress.c0000755000076500000000000000474610714675677016167 0ustar chriswheel/* compress.c -- compress a memory buffer * Copyright (C) 1995-2002 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id: compress.c 921 2005-09-27 14:12:37Z mdboom $ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least 0.1% larger than sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; int level; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; #ifdef MAXSEG_64K /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; #endif stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; stream.opaque = (voidpf)0; err = deflateInit(&stream, level); if (err != Z_OK) return err; err = deflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { deflateEnd(&stream); return err == Z_OK ? Z_BUF_ERROR : err; } *destLen = stream.total_out; err = deflateEnd(&stream); return err; } /* =========================================================================== */ int ZEXPORT compress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } /* =========================================================================== If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ uLong ZEXPORT compressBound (sourceLen) uLong sourceLen; { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; } gamera-3.3.3/src/zlib-1.2.1/crc32.c0000755000076500000000000002304510714675677015241 0ustar chriswheel/* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing * tables for updating the shift register in one step with three exclusive-ors * instead of four steps with four exclusive-ors. This results about a factor * of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. */ /* @(#) $Id: crc32.c 921 2005-09-27 14:12:37Z mdboom $ */ #ifdef MAKECRCH # include # ifndef DYNAMIC_CRC_TABLE # define DYNAMIC_CRC_TABLE # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ #include "zutil.h" /* for STDC and FAR definitions */ #define local static /* Find a four-byte integer type for crc32_little() and crc32_big(). */ #ifndef NOBYFOUR # ifdef STDC /* need ANSI C limits.h to determine sizes */ # include # define BYFOUR # if (UINT_MAX == 0xffffffffUL) typedef unsigned int u4; # else # if (ULONG_MAX == 0xffffffffUL) typedef unsigned long u4; # else # if (USHRT_MAX == 0xffffffffUL) typedef unsigned short u4; # else # undef BYFOUR /* can't find a four-byte integer type! */ # endif # endif # endif # endif /* STDC */ #endif /* !NOBYFOUR */ /* Definitions for doing the crc four data bytes at a time. */ #ifdef BYFOUR # define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); local unsigned long crc32_big OF((unsigned long, const unsigned char FAR *, unsigned)); # define TBLS 8 #else # define TBLS 1 #endif /* BYFOUR */ #ifdef DYNAMIC_CRC_TABLE local int crc_table_empty = 1; local unsigned long FAR crc_table[TBLS][256]; local void make_crc_table OF((void)); #ifdef MAKECRCH local void write_table OF((FILE *, const unsigned long FAR *)); #endif /* MAKECRCH */ /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x (which is shifting right by one and adding x^32 mod p if the bit shifted out is a one). We start with the highest power (least significant bit) of q and repeat for all eight bits of q. The first table is simply the CRC of all possible eight bit values. This is all the information needed to generate CRCs on data a byte at a time for all combinations of CRC register values and incoming bytes. The remaining tables allow for word-at-a-time CRC calculation for both big-endian and little- endian machines, where a word is four bytes. */ local void make_crc_table() { unsigned long c; int n, k; unsigned long poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; /* make exclusive-or pattern from polynomial (0xedb88320UL) */ poly = 0UL; for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) poly |= 1UL << (31 - p[n]); /* generate a crc for every 8-bit value */ for (n = 0; n < 256; n++) { c = (unsigned long)n; for (k = 0; k < 8; k++) c = c & 1 ? poly ^ (c >> 1) : c >> 1; crc_table[0][n] = c; } #ifdef BYFOUR /* generate crc for each value followed by one, two, and three zeros, and then the byte reversal of those as well as the first table */ for (n = 0; n < 256; n++) { c = crc_table[0][n]; crc_table[4][n] = REV(c); for (k = 1; k < 4; k++) { c = crc_table[0][c & 0xff] ^ (c >> 8); crc_table[k][n] = c; crc_table[k + 4][n] = REV(c); } } #endif /* BYFOUR */ crc_table_empty = 0; #ifdef MAKECRCH /* write out CRC tables to crc32.h */ { FILE *out; out = fopen("crc32.h", "w"); if (out == NULL) return; fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); fprintf(out, "local const unsigned long FAR "); fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); write_table(out, crc_table[0]); # ifdef BYFOUR fprintf(out, "#ifdef BYFOUR\n"); for (k = 1; k < 8; k++) { fprintf(out, " },\n {\n"); write_table(out, crc_table[k]); } fprintf(out, "#endif\n"); # endif /* BYFOUR */ fprintf(out, " }\n};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH local void write_table(out, table) FILE *out; const unsigned long FAR *table; { int n; for (n = 0; n < 256; n++) fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); } #endif /* MAKECRCH */ #else /* !DYNAMIC_CRC_TABLE */ /* ======================================================================== * Tables of CRC-32s of all single-byte values, made by make_crc_table(). */ #include "crc32.h" #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= * This function can be used by asm versions of crc32() */ const unsigned long FAR * ZEXPORT get_crc_table() { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ return (const unsigned long FAR *)crc_table; } /* ========================================================================= */ #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { if (buf == Z_NULL) return 0UL; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif /* DYNAMIC_CRC_TABLE */ #ifdef BYFOUR if (sizeof(void *) == sizeof(ptrdiff_t)) { u4 endian; endian = 1; if (*((unsigned char *)(&endian))) return crc32_little(crc, buf, len); else return crc32_big(crc, buf, len); } #endif /* BYFOUR */ crc = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return crc ^ 0xffffffffUL; } #ifdef BYFOUR /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 /* ========================================================================= */ local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = (u4)crc; c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); len--; } buf4 = (const u4 FAR *)buf; while (len >= 32) { DOLIT32; len -= 32; } while (len >= 4) { DOLIT4; len -= 4; } buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); } while (--len); c = ~c; return (unsigned long)c; } /* ========================================================================= */ #define DOBIG4 c ^= *++buf4; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 /* ========================================================================= */ local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; unsigned len; { register u4 c; register const u4 FAR *buf4; c = REV((u4)crc); c = ~c; while (len && ((ptrdiff_t)buf & 3)) { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); len--; } buf4 = (const u4 FAR *)buf; buf4--; while (len >= 32) { DOBIG32; len -= 32; } while (len >= 4) { DOBIG4; len -= 4; } buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); } while (--len); c = ~c; return (unsigned long)(REV(c)); } #endif /* BYFOUR */ gamera-3.3.3/src/zlib-1.2.1/deflate.c0000755000076500000000000015334010714675677015733 0ustar chriswheel/* deflate.c -- compress data using the deflation algorithm * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process depends on being able to identify portions * of the input text which are identical to earlier input (within a * sliding window trailing behind the input currently being processed). * * The most straightforward technique turns out to be the fastest for * most input files: try all possible matches and select the longest. * The key feature of this algorithm is that insertions into the string * dictionary are very simple and thus fast, and deletions are avoided * completely. Insertions are performed at each input character, whereas * string matches are performed only when the previous match ends. So it * is preferable to spend more time in matches to allow very fast string * insertions and avoid deletions. The matching algorithm for small * strings is inspired from that of Rabin & Karp. A brute force approach * is used to find longer strings when a small match has been found. * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze * (by Leonid Broukhis). * A previous version of this file used a more sophisticated algorithm * (by Fiala and Greene) which is guaranteed to run in linear amortized * time, but has a larger average cost, uses more memory and is patented. * However the F&G algorithm may be faster for some highly redundant * files if the parameter max_chain_length (described below) is too large. * * ACKNOWLEDGEMENTS * * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and * I found it in 'freeze' written by Leonid Broukhis. * Thanks to many people for bug reports and testing. * * REFERENCES * * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". * Available in http://www.ietf.org/rfc/rfc1951.txt * * A description of the Rabin and Karp algorithm is given in the book * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. * * Fiala,E.R., and Greene,D.H. * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 * */ /* @(#) $Id: deflate.c 921 2005-09-27 14:12:37Z mdboom $ */ #include "deflate.h" const char deflate_copyright[] = " deflate 1.2.1 Copyright 1995-2003 Jean-loup Gailly "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* =========================================================================== * Function prototypes. */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ finish_started, /* finish started, need only more output at next deflate */ finish_done /* finish done, accept no more input or output */ } block_state; typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif #endif local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif /* =========================================================================== * Local data */ #define NIL 0 /* Tail of hash chains */ #ifndef TOO_FAR # define TOO_FAR 4096 #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) /* Minimum amount of lookahead, except at the end of the input file. * See deflate.c for comments about the MIN_MATCH+1. */ /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ typedef struct config_s { ush good_length; /* reduce lazy search above this match length */ ush max_lazy; /* do not perform lazy search above this match length */ ush nice_length; /* quit search above this match length */ ush max_chain; compress_func func; } config; #ifdef FASTEST local const config configuration_table[2] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ #else local const config configuration_table[10] = { /* good lazy nice chain */ /* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ /* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ /* 2 */ {4, 5, 16, 8, deflate_fast}, /* 3 */ {4, 6, 32, 32, deflate_fast}, /* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ /* 5 */ {8, 16, 32, 32, deflate_slow}, /* 6 */ {8, 16, 128, 128, deflate_slow}, /* 7 */ {8, 32, 128, 256, deflate_slow}, /* 8 */ {32, 128, 258, 1024, deflate_slow}, /* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ #endif /* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 * For deflate_fast() (levels <= 3) good is ignored and lazy has a different * meaning. */ #define EQUAL 0 /* result of memcmp for equal strings */ #ifndef NO_DUMMY_DECL struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ #endif /* =========================================================================== * Update a hash value with the given input byte * IN assertion: all calls to to UPDATE_HASH are made with consecutive * input characters, so that a running hash key can be computed from the * previous key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== * Insert string str in the dictionary and set match_head to the previous head * of the hash chain (the most recent string with same hash key). Return * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of str are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #else #define INSERT_STRING(s, str, match_head) \ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ s->head[s->ins_h] = (Pos)(str)) #endif /* =========================================================================== * Initialize the hash table (avoiding 64K overflow for 16 bit systems). * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; int level; const char *version; int stream_size; { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size) z_streamp strm; int level; int method; int windowBits; int memLevel; int strategy; const char *version; int stream_size; { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; ushf *overlay; /* We overlay pending_buf and d_buf+l_buf. This works since the average * output size for (length,distance) codes is <= 24 bits. */ if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; } if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; windowBits = -windowBits; } #ifdef GZIP else if (windowBits > 15) { wrap = 2; /* write gzip wrapper instead */ windowBits -= 16; } #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_RLE) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; s->wrap = wrap; s->w_bits = windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; s->hash_bits = memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); s->pending_buf = (uchf *) overlay; s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { s->status = FINISH_STATE; strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); deflateEnd (strm); return Z_MEM_ERROR; } s->d_buf = overlay + s->lit_bufsize/sizeof(ush); s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s->level = level; s->strategy = strategy; s->method = (Byte)method; return deflateReset(strm); } /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { deflate_state *s; uInt length = dictLength; uInt n; IPos hash_head = 0; if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || strm->state->wrap == 2 || (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) return Z_STREAM_ERROR; s = strm->state; if (s->wrap) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; if (length > MAX_DIST(s)) { length = MAX_DIST(s); #ifndef USE_DICT_HEAD dictionary += dictLength - length; /* use the tail of the dictionary */ #endif } zmemcpy(s->window, dictionary, length); s->strstart = length; s->block_start = (long)length; /* Insert all strings in the hash table (except for the last two bytes). * s->lookahead stays null, so s->ins_h will be recomputed at the next * call of fill_window. */ s->ins_h = s->window[0]; UPDATE_HASH(s, s->ins_h, s->window[1]); for (n = 0; n <= length - MIN_MATCH; n++) { INSERT_STRING(s, n, hash_head); } if (hash_head) hash_head = 0; /* to make compiler happy */ return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateReset (strm) z_streamp strm; { deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { return Z_STREAM_ERROR; } strm->total_in = strm->total_out = 0; strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ strm->data_type = Z_UNKNOWN; s = (deflate_state *)strm->state; s->pending = 0; s->pending_out = s->pending_buf; if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } s->status = s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); s->last_flush = Z_NO_FLUSH; _tr_init(s); lm_init(s); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflatePrime (strm, bits, value) z_streamp strm; int bits; int value; { if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; strm->state->bi_valid = bits; strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); return Z_OK; } /* ========================================================================= */ int ZEXPORT deflateParams(strm, level, strategy) z_streamp strm; int level; int strategy; { deflate_state *s; compress_func func; int err = Z_OK; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST if (level != 0) level = 1; #else if (level == Z_DEFAULT_COMPRESSION) level = 6; #endif if (level < 0 || level > 9 || strategy < 0 || strategy > Z_RLE) { return Z_STREAM_ERROR; } func = configuration_table[s->level].func; if (func != configuration_table[level].func && strm->total_in != 0) { /* Flush the last buffer: */ err = deflate(strm, Z_PARTIAL_FLUSH); } if (s->level != level) { s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; s->nice_match = configuration_table[level].nice_length; s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; return err; } /* ========================================================================= * For the default windowBits of 15 and memLevel of 8, this function returns * a close to exact, as well as small, upper bound on the compressed size. * They are coded as constants here for a reason--if the #define's are * changed, then this function needs to be changed as well. The return * value for 15 and 8 only works for those exact settings. * * For any setting other than those defaults for windowBits and memLevel, * the value returned is a conservative worst case for the maximum expansion * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * * This function could be more sophisticated to provide closer upper bounds * for every combination of windowBits and memLevel, as well as wrap. * But even the conservative upper bound of about 14% expansion does not * seem onerous for output buffer allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; uLong destLen; /* conservative upper bound */ destLen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; /* if can't get parameters, return conservative bound */ if (strm == Z_NULL || strm->state == Z_NULL) return destLen; /* if not default parameters, return conservative bound */ s = strm->state; if (s->w_bits != 15 || s->hash_bits != 8 + 7) return destLen; /* default settings: return tight bound for that case */ return compressBound(sourceLen); } /* ========================================================================= * Put a short in the pending buffer. The 16-bit value is put in MSB order. * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ local void putShortMSB (s, b) deflate_state *s; uInt b; { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } /* ========================================================================= * Flush as much pending output as possible. All deflate() output goes * through this function so some applications may wish to modify it * to avoid allocating a large strm->next_out buffer and copying into it. * (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; { unsigned len = strm->state->pending; if (len > strm->avail_out) len = strm->avail_out; if (len == 0) return; zmemcpy(strm->next_out, strm->state->pending_out, len); strm->next_out += len; strm->state->pending_out += len; strm->total_out += len; strm->avail_out -= len; strm->state->pending -= len; if (strm->state->pending == 0) { strm->state->pending_out = strm->state->pending_buf; } } /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; int flush; { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || flush > Z_FINISH || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; /* Write the header */ if (s->status == INIT_STATE) { #ifdef GZIP if (s->wrap == 2) { put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); put_byte(s, s->level == 9 ? 2 : (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, 255); s->status = BUSY_STATE; strm->adler = crc32(0L, Z_NULL, 0); } else #endif { uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) level_flags = 0; else if (s->level < 6) level_flags = 1; else if (s->level == 6) level_flags = 2; else level_flags = 3; header |= (level_flags << 6); if (s->strstart != 0) header |= PRESET_DICT; header += 31 - (header % 31); s->status = BUSY_STATE; putShortMSB(s, header); /* Save the adler32 of the preset dictionary: */ if (s->strstart != 0) { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } strm->adler = adler32(0L, Z_NULL, 0); } } /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); if (strm->avail_out == 0) { /* Since avail_out is 0, deflate will be called again with * more output space, but possibly with both pending and * avail_in equal to zero. There won't be anything to do, * but this is not an error situation so make sure we * return OK instead of BUF_ERROR at next call of deflate: */ s->last_flush = -1; return Z_OK; } /* Make sure there is something to do and avoid duplicate consecutive * flushes. For repeated and useless calls with Z_FINISH, we keep * returning Z_STREAM_END instead of Z_BUF_ERROR. */ } else if (strm->avail_in == 0 && flush <= old_flush && flush != Z_FINISH) { ERR_RETURN(strm, Z_BUF_ERROR); } /* User must not provide more input after the first FINISH: */ if (s->status == FINISH_STATE && strm->avail_in != 0) { ERR_RETURN(strm, Z_BUF_ERROR); } /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; bstate = (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; } if (bstate == need_more || bstate == finish_started) { if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ } return Z_OK; /* If flush != Z_NO_FLUSH && avail_out == 0, the next call * of deflate should use the same flush parameter to make sure * that the flush is complete. So we don't have to output an * empty block here, this will be done at next call. This also * ensures that for a very small output buffer, we emit at most * one empty block. */ } if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); } else { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ } } flush_pending(strm); if (strm->avail_out == 0) { s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ return Z_OK; } } } Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; /* Write the trailer */ #ifdef GZIP if (s->wrap == 2) { put_byte(s, (Byte)(strm->adler & 0xff)); put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); put_byte(s, (Byte)(strm->total_in & 0xff)); put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); } else #endif { putShortMSB(s, (uInt)(strm->adler >> 16)); putShortMSB(s, (uInt)(strm->adler & 0xffff)); } flush_pending(strm); /* If avail_out is zero, the application will call deflate again * to flush the rest. */ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ return s->pending != 0 ? Z_OK : Z_STREAM_END; } /* ========================================================================= */ int ZEXPORT deflateEnd (strm) z_streamp strm; { int status; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; status = strm->state->status; if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) { return Z_STREAM_ERROR; } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); TRY_FREE(strm, strm->state->head); TRY_FREE(strm, strm->state->prev); TRY_FREE(strm, strm->state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; } /* ========================================================================= * Copy the source state to the destination state. * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ int ZEXPORT deflateCopy (dest, source) z_streamp dest; z_streamp source; { #ifdef MAXSEG_64K return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; ushf *overlay; if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { return Z_STREAM_ERROR; } ss = source->state; *dest = *source; ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); if (ds == Z_NULL) return Z_MEM_ERROR; dest->state = (struct internal_state FAR *) ds; *ds = *ss; ds->strm = dest; ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); ds->pending_buf = (uchf *) overlay; if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { deflateEnd (dest); return Z_MEM_ERROR; } /* following zmemcpy do not work for 16-bit MSDOS */ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; ds->bl_desc.dyn_tree = ds->bl_tree; return Z_OK; #endif /* MAXSEG_64K */ } /* =========================================================================== * Read a new buffer from the current input stream, update the adler32 * and total number of bytes read. All deflate() input goes through * this function so some applications may wish to modify it to avoid * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ local int read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; { unsigned len = strm->avail_in; if (len > size) len = size; if (len == 0) return 0; strm->avail_in -= len; if (strm->state->wrap == 1) { strm->adler = adler32(strm->adler, strm->next_in, len); } #ifdef GZIP else if (strm->state->wrap == 2) { strm->adler = crc32(strm->adler, strm->next_in, len); } #endif zmemcpy(buf, strm->next_in, len); strm->next_in += len; strm->total_in += len; return (int)len; } /* =========================================================================== * Initialize the "longest match" routines for a new zlib stream */ local void lm_init (s) deflate_state *s; { s->window_size = (ulg)2L*s->w_size; CLEAR_HASH(s); /* Set the default configuration parameters: */ s->max_lazy_match = configuration_table[s->level].max_lazy; s->good_match = configuration_table[s->level].good_length; s->nice_match = configuration_table[s->level].nice_length; s->max_chain_length = configuration_table[s->level].max_chain; s->strstart = 0; s->block_start = 0L; s->lookahead = 0; s->match_length = s->prev_length = MIN_MATCH-1; s->match_available = 0; s->ins_h = 0; #ifdef ASMV match_init(); /* initialize the asm code */ #endif } #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and * return its length. Matches shorter or equal to prev_length are discarded, * in which case the result is equal to prev_length and match_start is * garbage. * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ #ifndef ASMV /* For 80x86 and 680x0, an optimized version will be provided in match.asm or * match.S. The code will be functionally equivalent. */ local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ int best_len = s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; /* Stop when cur_match becomes <= limit. To simplify the code, * we prevent matches with the string of window index 0. */ Posf *prev = s->prev; uInt wmask = s->w_mask; #ifdef UNALIGNED_OK /* Compare two bytes at a time. Note: this is not always beneficial. * Try with and without -DUNALIGNED_OK to check. */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; register ush scan_end = *(ushf*)(scan+best_len-1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; register Byte scan_end1 = scan[best_len-1]; register Byte scan_end = scan[best_len]; #endif /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); /* Do not waste too much time if we already have a good match: */ if (s->prev_length >= s->good_match) { chain_length >>= 2; } /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Skip to next match if the match length cannot increase * or if the match length is less than 2: */ #if (defined(UNALIGNED_OK) && MAX_MATCH == 258) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ if (*(ushf*)(match+best_len-1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at * strstart+3, +5, ... up to strstart+257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ /* Here, scan <= window+strstart+257 */ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); if (*scan == *match) scan++; len = (MAX_MATCH - 1) - (int)(strend-scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ if (match[best_len] != scan_end || match[best_len-1] != scan_end1 || *match != *scan || *++match != scan[1]) continue; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match++; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; #endif /* UNALIGNED_OK */ if (len > best_len) { s->match_start = cur_match; best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK scan_end = *(ushf*)(scan+best_len-1); #else scan_end1 = scan[best_len-1]; scan_end = scan[best_len]; #endif } } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length != 0); if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } #endif /* ASMV */ #endif /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for level == 1 or strategy == Z_RLE only */ local uInt longest_match_fast(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ register Bytef *strend = s->window + s->strstart + MAX_MATCH; /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. * It is easy to get rid of this optimization if necessary. */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); Assert(cur_match < s->strstart, "no future"); match = s->window + cur_match; /* Return failure if the match length is less than 2: */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; /* The check at best_len-1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that * the hash keys are equal and that HASH_BITS >= 8. */ scan += 2, match += 2; Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; * the 256th check will be made at strstart+258. */ do { } while (*++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && *++scan == *++match && scan < strend); Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); if (len < MIN_MATCH) return MIN_MATCH - 1; s->match_start = cur_match; return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. */ local void check_match(s, start, match, length) deflate_state *s; IPos start, match; int length; { /* check that the match is indeed a match */ if (zmemcmp(s->window + match, s->window + start, length) != EQUAL) { fprintf(stderr, " start %u, match %u, length %d\n", start, match, length); do { fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); } while (--length != 0); z_error("invalid match"); } if (z_verbose > 1) { fprintf(stderr,"\\[%d,%d]", start-match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } #else # define check_match(s, start, match, length) #endif /* DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. * Updates strstart and lookahead. * * IN assertion: lookahead < MIN_LOOKAHEAD * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD * At least one byte has been read, or avail_in == 0; reads are * performed for at least two bytes (required for the zip translate_eol * option -- not supported here). */ local void fill_window(s) deflate_state *s; { register unsigned n, m; register Posf *p; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; do { more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); /* Deal with !@#$% 64K limit: */ if (sizeof(int) <= 2) { if (more == 0 && s->strstart == 0 && s->lookahead == 0) { more = wsize; } else if (more == (unsigned)(-1)) { /* Very unlikely, but possible on 16 bit machine if * strstart == 0 && lookahead == 1 (input done a byte at time) */ more--; } } /* If the window is almost full and there is insufficient lookahead, * move the upper half to the lower one to make room in the upper half. */ if (s->strstart >= wsize+MAX_DIST(s)) { zmemcpy(s->window, s->window+wsize, (unsigned)wsize); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; /* Slide the hash table (could be avoided with 32 bit values at the expense of memory usage). We slide even when level == 0 to keep the hash table consistent if we switch back to level > 0 later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ n = s->hash_size; p = &s->head[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); } while (--n); n = wsize; #ifndef FASTEST p = &s->prev[n]; do { m = *--p; *p = (Pos)(m >= wsize ? m-wsize : NIL); /* If n is not on any hash chain, prev[n] is garbage but * its value will never be used. */ } while (--n); #endif more += wsize; } if (s->strm->avail_in == 0) return; /* If there was no sliding: * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && * more == window_size - lookahead - strstart * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) * => more >= window_size - 2*WSIZE + 2 * In the BIG_MEM or MMAP case (not yet supported), * window_size == input_size + MIN_LOOKAHEAD && * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. * Otherwise, window_size == 2*WSIZE so more >= 2. * If there was sliding, more >= WSIZE. So in all cases, more >= 2. */ Assert(more >= 2, "more < 2"); n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); s->lookahead += n; /* Initialize the hash value now that we have some input: */ if (s->lookahead >= MIN_MATCH) { s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif } /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, * but this is not important since only literal bytes will be emitted. */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ #define FLUSH_BLOCK_ONLY(s, eof) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ (eof)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ #define FLUSH_BLOCK(s, eof) { \ FLUSH_BLOCK_ONLY(s, eof); \ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ } /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. * This function does not insert new strings in the dictionary since * uncompressible data is probably not useful. This function is used * only for the level=0 compression option. * NOTE: this function should be optimized to avoid extra copying from * window to pending_buf. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { /* Stored blocks are limited to 0xffff bytes, pending_buf is limited * to pending_buf_size, and each stored block has a 5 byte header: */ ulg max_block_size = 0xffff; ulg max_start; if (max_block_size > s->pending_buf_size - 5) { max_block_size = s->pending_buf_size - 5; } /* Copy as much as possible from input to output: */ for (;;) { /* Fill the window as much as possible: */ if (s->lookahead <= 1) { Assert(s->strstart < s->w_size+MAX_DIST(s) || s->block_start >= (long)s->w_size, "slide too late"); fill_window(s); if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; if (s->lookahead == 0) break; /* flush the current block */ } Assert(s->block_start >= 0L, "block gone"); s->strstart += s->lookahead; s->lookahead = 0; /* Emit a stored block if pending_buf will be full: */ max_start = s->block_start + max_block_size; if (s->strstart == 0 || (ulg)s->strstart >= max_start) { /* strstart == 0 is possible when wraparound on 16-bit machine */ s->lookahead = (uInt)(s->strstart - max_start); s->strstart = (uInt)max_start; FLUSH_BLOCK(s, 0); } /* Flush if we may have to slide, otherwise block_start may become * negative and the data will be gone: */ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { FLUSH_BLOCK(s, 0); } } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } /* =========================================================================== * Compress as much as possible from the input stream, return the current * block state. * This function does not perform lazy evaluation of matches and inserts * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. * At this point we have always match_length < MIN_MATCH */ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ #ifdef FASTEST if ((s->strategy < Z_HUFFMAN_ONLY) || (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { s->match_length = longest_match_fast (s, hash_head); } #else if (s->strategy < Z_HUFFMAN_ONLY) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } #endif /* longest_match() or longest_match_fast() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); _tr_tally_dist(s, s->strstart - s->match_start, s->match_length - MIN_MATCH, bflush); s->lookahead -= s->match_length; /* Insert new strings in the hash table only if the match length * is not too large. This saves time but degrades compression. */ #ifndef FASTEST if (s->match_length <= s->max_insert_length && s->lookahead >= MIN_MATCH) { s->match_length--; /* string at strstart already in table */ do { s->strstart++; INSERT_STRING(s, s->strstart, hash_head); /* strstart never exceeds WSIZE-MAX_MATCH, so there are * always MIN_MATCH bytes ahead. */ } while (--s->match_length != 0); s->strstart++; } else #endif { s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not * matter since it will be recomputed at next deflate call. */ } } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); _tr_tally_lit (s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } if (bflush) FLUSH_BLOCK(s, 0); } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #ifndef FASTEST /* =========================================================================== * Same as above, but achieves better compression. We use a lazy * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { IPos hash_head = NIL; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ for (;;) { /* Make sure that we always have enough lookahead, except * at the end of the input file. We need MAX_MATCH bytes * for the next match, plus MIN_MATCH bytes to insert the * string following the next match. */ if (s->lookahead < MIN_LOOKAHEAD) { fill_window(s); if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { return need_more; } if (s->lookahead == 0) break; /* flush the current block */ } /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } /* Find the longest match, discarding those <= prev_length. */ s->prev_length = s->match_length, s->prev_match = s->match_start; s->match_length = MIN_MATCH-1; if (hash_head != NIL && s->prev_length < s->max_lazy_match && s->strstart - hash_head <= MAX_DIST(s)) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ if (s->strategy < Z_HUFFMAN_ONLY) { s->match_length = longest_match (s, hash_head); } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { s->match_length = longest_match_fast (s, hash_head); } /* longest_match() or longest_match_fast() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 || (s->match_length == MIN_MATCH && s->strstart - s->match_start > TOO_FAR) #endif )) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ s->match_length = MIN_MATCH-1; } } /* If there was a match at the previous step and the current * match is not better, output the previous match: */ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ check_match(s, s->strstart-1, s->prev_match, s->prev_length); _tr_tally_dist(s, s->strstart -1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ s->lookahead -= s->prev_length-1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { INSERT_STRING(s, s->strstart, hash_head); } } while (--s->prev_length != 0); s->match_available = 0; s->match_length = MIN_MATCH-1; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); } else if (s->match_available) { /* If there was no match at the previous position, output a * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } s->strstart++; s->lookahead--; if (s->strm->avail_out == 0) return need_more; } else { /* There is no previous match to compare with, wait for * the next step to decide. */ s->match_available = 1; s->strstart++; s->lookahead--; } } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { Tracevv((stderr,"%c", s->window[s->strstart-1])); _tr_tally_lit(s, s->window[s->strstart-1], bflush); s->match_available = 0; } FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } #endif /* FASTEST */ gamera-3.3.3/src/zlib-1.2.1/gzio.c0000755000076500000000000007355110714675677015304 0ustar chriswheel/* gzio.c -- IO on .gz files * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h * * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. */ /* @(#) $Id: gzio.c 921 2005-09-27 14:12:37Z mdboom $ */ #include #include "zutil.h" #ifdef NO_DEFLATE /* for compatiblity with old definition */ # define NO_GZCOMPRESS #endif #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif #ifndef Z_BUFSIZE # ifdef MAXSEG_64K # define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ # else # define Z_BUFSIZE 16384 # endif #endif #ifndef Z_PRINTF_BUFSIZE # define Z_PRINTF_BUFSIZE 4096 #endif #ifdef __MVS__ # pragma map (fdopen , "\174\174FDOPEN") FILE *fdopen(int, const char *); #endif #ifndef STDC extern voidp malloc OF((uInt size)); extern void free OF((voidpf ptr)); #endif #define ALLOC(size) malloc(size) #define TRYFREE(p) {if (p) free(p);} static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ /* gzip flag byte */ #define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ #define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ #define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ #define COMMENT 0x10 /* bit 4 set: file comment present */ #define RESERVED 0xE0 /* bits 5..7: reserved */ typedef struct gz_stream { z_stream stream; int z_err; /* error code for last stream operation */ int z_eof; /* set if end of input file */ FILE *file; /* .gz file */ Byte *inbuf; /* input buffer */ Byte *outbuf; /* output buffer */ uLong crc; /* crc32 of uncompressed data */ char *msg; /* error message */ char *path; /* path name for debugging only */ int transparent; /* 1 if input file is not a .gz file */ char mode; /* 'w' or 'r' */ z_off_t start; /* start of compressed data in file (header skipped) */ z_off_t in; /* bytes into deflate or inflate */ z_off_t out; /* bytes out of deflate or inflate */ int back; /* one character push-back */ int last; /* true if push-back is last character */ } gz_stream; local gzFile gz_open OF((const char *path, const char *mode, int fd)); local int do_flush OF((gzFile file, int flush)); local int get_byte OF((gz_stream *s)); local void check_header OF((gz_stream *s)); local int destroy OF((gz_stream *s)); local void putLong OF((FILE *file, uLong x)); local uLong getLong OF((gz_stream *s)); /* =========================================================================== Opens a gzip (.gz) file for reading or writing. The mode parameter is as in fopen ("rb" or "wb"). The file is given either by file descriptor or path name (if fd == -1). gz_open returns NULL if the file could not be opened or if there was insufficient memory to allocate the (de)compression state; errno can be checked to distinguish the two cases (if errno is zero, the zlib error is Z_MEM_ERROR). */ local gzFile gz_open (path, mode, fd) const char *path; const char *mode; int fd; { int err; int level = Z_DEFAULT_COMPRESSION; /* compression level */ int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ char *p = (char*)mode; gz_stream *s; char fmode[80]; /* copy of mode, without the compression level */ char *m = fmode; if (!path || !mode) return Z_NULL; s = (gz_stream *)ALLOC(sizeof(gz_stream)); if (!s) return Z_NULL; s->stream.zalloc = (alloc_func)0; s->stream.zfree = (free_func)0; s->stream.opaque = (voidpf)0; s->stream.next_in = s->inbuf = Z_NULL; s->stream.next_out = s->outbuf = Z_NULL; s->stream.avail_in = s->stream.avail_out = 0; s->file = NULL; s->z_err = Z_OK; s->z_eof = 0; s->in = 0; s->out = 0; s->back = EOF; s->crc = crc32(0L, Z_NULL, 0); s->msg = NULL; s->transparent = 0; s->path = (char*)ALLOC(strlen(path)+1); if (s->path == NULL) { return destroy(s), (gzFile)Z_NULL; } strcpy(s->path, path); /* do this early for debugging */ s->mode = '\0'; do { if (*p == 'r') s->mode = 'r'; if (*p == 'w' || *p == 'a') s->mode = 'w'; if (*p >= '0' && *p <= '9') { level = *p - '0'; } else if (*p == 'f') { strategy = Z_FILTERED; } else if (*p == 'h') { strategy = Z_HUFFMAN_ONLY; } else if (*p == 'R') { strategy = Z_RLE; } else { *m++ = *p; /* copy the mode */ } } while (*p++ && m != fmode + sizeof(fmode)); if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateInit2(&(s->stream), level, Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); /* windowBits is passed < 0 to suppress zlib header */ s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); #endif if (err != Z_OK || s->outbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } else { s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); err = inflateInit2(&(s->stream), -MAX_WBITS); /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are * present after the compressed stream. */ if (err != Z_OK || s->inbuf == Z_NULL) { return destroy(s), (gzFile)Z_NULL; } } s->stream.avail_out = Z_BUFSIZE; errno = 0; s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); if (s->file == NULL) { return destroy(s), (gzFile)Z_NULL; } if (s->mode == 'w') { /* Write a very simple .gz header: */ fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); s->start = 10L; /* We use 10L instead of ftell(s->file) to because ftell causes an * fflush on some systems. This version of the library doesn't use * start anyway in write mode, so this initialization is not * necessary. */ } else { check_header(s); /* skip the .gz header */ s->start = ftell(s->file) - s->stream.avail_in; } return (gzFile)s; } /* =========================================================================== Opens a gzip (.gz) file for reading or writing. */ gzFile ZEXPORT gzopen (path, mode) const char *path; const char *mode; { return gz_open (path, mode, -1); } /* =========================================================================== Associate a gzFile with the file descriptor fd. fd is not dup'ed here to mimic the behavio(u)r of fdopen. */ gzFile ZEXPORT gzdopen (fd, mode) int fd; const char *mode; { char name[20]; if (fd < 0) return (gzFile)Z_NULL; sprintf(name, "", fd); /* for debugging */ return gz_open (name, mode, fd); } /* =========================================================================== * Update the compression level and strategy */ int ZEXPORT gzsetparams (file, level, strategy) gzFile file; int level; int strategy; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; /* Make room to allow flushing */ if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; } s->stream.avail_out = Z_BUFSIZE; } return deflateParams (&(s->stream), level, strategy); } /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int get_byte(s) gz_stream *s; { if (s->z_eof) return EOF; if (s->stream.avail_in == 0) { errno = 0; s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) s->z_err = Z_ERRNO; return EOF; } s->stream.next_in = s->inbuf; } s->stream.avail_in--; return *(s->stream.next_in)++; } /* =========================================================================== Check the gzip header of a gz_stream opened for reading. Set the stream mode to transparent if the gzip magic header is not present; set s->err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. IN assertion: the stream s has already been created sucessfully; s->stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files. */ local void check_header(s) gz_stream *s; { int method; /* method byte */ int flags; /* flags byte */ uInt len; int c; /* Assure two bytes in the buffer so we can peek ahead -- handle case where first byte of header is at the end of the buffer after the last gzip segment */ len = s->stream.avail_in; if (len < 2) { if (len) s->inbuf[0] = s->stream.next_in[0]; errno = 0; len = fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; s->stream.avail_in += len; s->stream.next_in = s->inbuf; if (s->stream.avail_in < 2) { s->transparent = s->stream.avail_in; return; } } /* Peek ahead to check the gzip magic header */ if (s->stream.next_in[0] != gz_magic[0] || s->stream.next_in[1] != gz_magic[1]) { s->transparent = 1; return; } s->stream.avail_in -= 2; s->stream.next_in += 2; /* Check the rest of the gzip header */ method = get_byte(s); flags = get_byte(s); if (method != Z_DEFLATED || (flags & RESERVED) != 0) { s->z_err = Z_DATA_ERROR; return; } /* Discard time, xflags and OS code: */ for (len = 0; len < 6; len++) (void)get_byte(s); if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ len = (uInt)get_byte(s); len += ((uInt)get_byte(s))<<8; /* len is garbage if EOF but the loop below will quit anyway */ while (len-- != 0 && get_byte(s) != EOF) ; } if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ while ((c = get_byte(s)) != 0 && c != EOF) ; } if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ for (len = 0; len < 2; len++) (void)get_byte(s); } s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; } /* =========================================================================== * Cleanup then free the given gz_stream. Return a zlib error code. Try freeing in the reverse order of allocations. */ local int destroy (s) gz_stream *s; { int err = Z_OK; if (!s) return Z_STREAM_ERROR; TRYFREE(s->msg); if (s->stream.state != NULL) { if (s->mode == 'w') { #ifdef NO_GZCOMPRESS err = Z_STREAM_ERROR; #else err = deflateEnd(&(s->stream)); #endif } else if (s->mode == 'r') { err = inflateEnd(&(s->stream)); } } if (s->file != NULL && fclose(s->file)) { #ifdef ESPIPE if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ #endif err = Z_ERRNO; } if (s->z_err < 0) err = s->z_err; TRYFREE(s->inbuf); TRYFREE(s->outbuf); TRYFREE(s->path); TRYFREE(s); return err; } /* =========================================================================== Reads the given number of uncompressed bytes from the compressed file. gzread returns the number of bytes actually read (0 for end of file). */ int ZEXPORT gzread (file, buf, len) gzFile file; voidp buf; unsigned len; { gz_stream *s = (gz_stream*)file; Bytef *start = (Bytef*)buf; /* starting point for crc computation */ Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; if (s->z_err == Z_STREAM_END) return 0; /* EOF */ next_out = (Byte*)buf; s->stream.next_out = (Bytef*)buf; s->stream.avail_out = len; if (s->stream.avail_out && s->back != EOF) { *next_out++ = s->back; s->stream.next_out++; s->stream.avail_out--; s->back = EOF; s->out++; if (s->last) { s->z_err = Z_STREAM_END; return 1; } } while (s->stream.avail_out != 0) { if (s->transparent) { /* Copy first the lookahead bytes: */ uInt n = s->stream.avail_in; if (n > s->stream.avail_out) n = s->stream.avail_out; if (n > 0) { zmemcpy(s->stream.next_out, s->stream.next_in, n); next_out += n; s->stream.next_out = next_out; s->stream.next_in += n; s->stream.avail_out -= n; s->stream.avail_in -= n; } if (s->stream.avail_out > 0) { s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out, s->file); } len -= s->stream.avail_out; s->in += len; s->out += len; if (len == 0) s->z_eof = 1; return (int)len; } if (s->stream.avail_in == 0 && !s->z_eof) { errno = 0; s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file); if (s->stream.avail_in == 0) { s->z_eof = 1; if (ferror(s->file)) { s->z_err = Z_ERRNO; break; } } s->stream.next_in = s->inbuf; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = inflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err == Z_STREAM_END) { /* Check CRC and original size */ s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); start = s->stream.next_out; if (getLong(s) != s->crc) { s->z_err = Z_DATA_ERROR; } else { (void)getLong(s); /* The uncompressed length returned by above getlong() may be * different from s->out in case of concatenated .gz files. * Check for such files: */ check_header(s); if (s->z_err == Z_OK) { inflateReset(&(s->stream)); s->crc = crc32(0L, Z_NULL, 0); } } } if (s->z_err != Z_OK || s->z_eof) break; } s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); return (int)(len - s->stream.avail_out); } /* =========================================================================== Reads one byte from the compressed file. gzgetc returns this byte or -1 in case of end of file or error. */ int ZEXPORT gzgetc(file) gzFile file; { unsigned char c; return gzread(file, &c, 1) == 1 ? c : -1; } /* =========================================================================== Push one byte back onto the stream. */ int ZEXPORT gzungetc(c, file) int c; gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; s->back = c; s->out--; s->last = (s->z_err == Z_STREAM_END); if (s->last) s->z_err = Z_OK; s->z_eof = 0; return c; } /* =========================================================================== Reads bytes from the compressed file until len-1 characters are read, or a newline character is read and transferred to buf, or an end-of-file condition is encountered. The string is then terminated with a null character. gzgets returns buf, or Z_NULL in case of error. The current implementation is not optimized at all. */ char * ZEXPORT gzgets(file, buf, len) gzFile file; char *buf; int len; { char *b = buf; if (buf == Z_NULL || len <= 0) return Z_NULL; while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; *buf = '\0'; return b == buf && len > 0 ? Z_NULL : b; } #ifndef NO_GZCOMPRESS /* =========================================================================== Writes the given number of uncompressed bytes into the compressed file. gzwrite returns the number of bytes actually written (0 in case of error). */ int ZEXPORT gzwrite (file, buf, len) gzFile file; voidpc buf; unsigned len; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.next_in = (Bytef*)buf; s->stream.avail_in = len; while (s->stream.avail_in != 0) { if (s->stream.avail_out == 0) { s->stream.next_out = s->outbuf; if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { s->z_err = Z_ERRNO; break; } s->stream.avail_out = Z_BUFSIZE; } s->in += s->stream.avail_in; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), Z_NO_FLUSH); s->in -= s->stream.avail_in; s->out -= s->stream.avail_out; if (s->z_err != Z_OK) break; } s->crc = crc32(s->crc, (const Bytef *)buf, len); return (int)(len - s->stream.avail_in); } /* =========================================================================== Converts, formats, and writes the args to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of uncompressed bytes actually written (0 in case of error). */ #ifdef STDC #include int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) { char buf[Z_PRINTF_BUFSIZE]; va_list va; int len; buf[sizeof(buf) - 1] = 0; va_start(va, format); #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void (void)vsprintf(buf, format, va); va_end(va); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = vsprintf(buf, format, va); va_end(va); # endif #else # ifdef HAS_vsnprintf_void (void)vsnprintf(buf, sizeof(buf), format, va); va_end(va); len = strlen(buf); # else len = vsnprintf(buf, sizeof(buf), format, va); va_end(va); # endif #endif if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, (unsigned)len); } #else /* not ANSI C */ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) gzFile file; const char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { char buf[Z_PRINTF_BUFSIZE]; int len; buf[sizeof(buf) - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < sizeof(buf); len++) if (buf[len] == 0) break; # else len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); len = strlen(buf); # else len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) return 0; return gzwrite(file, buf, len); } #endif /* =========================================================================== Writes c, converted to an unsigned char, into the compressed file. gzputc returns the value that was written, or -1 in case of error. */ int ZEXPORT gzputc(file, c) gzFile file; int c; { unsigned char cc = (unsigned char) c; /* required for big endian systems */ return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; } /* =========================================================================== Writes the given null-terminated string to the compressed file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ int ZEXPORT gzputs(file, s) gzFile file; const char *s; { return gzwrite(file, (char*)s, (unsigned)strlen(s)); } /* =========================================================================== Flushes all pending output into the compressed file. The parameter flush is as in the deflate() function. */ local int do_flush (file, flush) gzFile file; int flush; { uInt len; int done = 0; gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; s->stream.avail_in = 0; /* should be zero already anyway */ for (;;) { len = Z_BUFSIZE - s->stream.avail_out; if (len != 0) { if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { s->z_err = Z_ERRNO; return Z_ERRNO; } s->stream.next_out = s->outbuf; s->stream.avail_out = Z_BUFSIZE; } if (done) break; s->out += s->stream.avail_out; s->z_err = deflate(&(s->stream), flush); s->out -= s->stream.avail_out; /* Ignore the second of two consecutive flushes: */ if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; /* deflate has finished flushing only when it hasn't used up * all the available space in the output buffer: */ done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; } return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } int ZEXPORT gzflush (file, flush) gzFile file; int flush; { gz_stream *s = (gz_stream*)file; int err = do_flush (file, flush); if (err) return err; fflush(s->file); return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; } #endif /* NO_GZCOMPRESS */ /* =========================================================================== Sets the starting position for the next gzread or gzwrite on the given compressed file. The offset represents a number of bytes in the gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error. SEEK_END is not implemented, returns error. In this version of the library, gzseek can be extremely slow. */ z_off_t ZEXPORT gzseek (file, offset, whence) gzFile file; z_off_t offset; int whence; { gz_stream *s = (gz_stream*)file; if (s == NULL || whence == SEEK_END || s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { return -1L; } if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return -1L; #else if (whence == SEEK_SET) { offset -= s->in; } if (offset < 0) return -1L; /* At this point, offset is the number of zero bytes to write. */ if (s->inbuf == Z_NULL) { s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ if (s->inbuf == Z_NULL) return -1L; zmemzero(s->inbuf, Z_BUFSIZE); } while (offset > 0) { uInt size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (uInt)offset; size = gzwrite(file, s->inbuf, size); if (size == 0) return -1L; offset -= size; } return s->in; #endif } /* Rest of function is for reading only */ /* compute absolute position */ if (whence == SEEK_CUR) { offset += s->out; } if (offset < 0) return -1L; if (s->transparent) { /* map to fseek */ s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; s->in = s->out = offset; return offset; } /* For a negative seek, rewind and use positive seek */ if (offset >= s->out) { offset -= s->out; } else if (gzrewind(file) < 0) { return -1L; } /* offset is now the number of bytes to skip. */ if (offset != 0 && s->outbuf == Z_NULL) { s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); if (s->outbuf == Z_NULL) return -1L; } if (offset && s->back != EOF) { s->back = EOF; s->out++; offset--; if (s->last) s->z_err = Z_STREAM_END; } while (offset > 0) { int size = Z_BUFSIZE; if (offset < Z_BUFSIZE) size = (int)offset; size = gzread(file, s->outbuf, (uInt)size); if (size <= 0) return -1L; offset -= size; } return s->out; } /* =========================================================================== Rewinds input file. */ int ZEXPORT gzrewind (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL || s->mode != 'r') return -1; s->z_err = Z_OK; s->z_eof = 0; s->back = EOF; s->stream.avail_in = 0; s->stream.next_in = s->inbuf; s->crc = crc32(0L, Z_NULL, 0); if (!s->transparent) (void)inflateReset(&s->stream); s->in = 0; s->out = 0; return fseek(s->file, s->start, SEEK_SET); } /* =========================================================================== Returns the starting position for the next gzread or gzwrite on the given compressed file. This position represents a number of bytes in the uncompressed data stream. */ z_off_t ZEXPORT gztell (file) gzFile file; { return gzseek(file, 0L, SEEK_CUR); } /* =========================================================================== Returns 1 when EOF has previously been detected reading the given input stream, otherwise zero. */ int ZEXPORT gzeof (file) gzFile file; { gz_stream *s = (gz_stream*)file; /* With concatenated compressed files that can have embedded * crc trailers, z_eof is no longer the only/best indicator of EOF * on a gz_stream. Handle end-of-stream error explicitly here. */ if (s == NULL || s->mode != 'r') return 0; if (s->z_eof) return 1; return s->z_err == Z_STREAM_END; } /* =========================================================================== Outputs a long in LSB order to the given file */ local void putLong (file, x) FILE *file; uLong x; { int n; for (n = 0; n < 4; n++) { fputc((int)(x & 0xff), file); x >>= 8; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets z_err in case of error. */ local uLong getLong (s) gz_stream *s; { uLong x = (uLong)get_byte(s); int c; x += ((uLong)get_byte(s))<<8; x += ((uLong)get_byte(s))<<16; c = get_byte(s); if (c == EOF) s->z_err = Z_DATA_ERROR; x += ((uLong)c)<<24; return x; } /* =========================================================================== Flushes all pending output if necessary, closes the compressed file and deallocates all the (de)compression state. */ int ZEXPORT gzclose (file) gzFile file; { int err; gz_stream *s = (gz_stream*)file; if (s == NULL) return Z_STREAM_ERROR; if (s->mode == 'w') { #ifdef NO_GZCOMPRESS return Z_STREAM_ERROR; #else err = do_flush (file, Z_FINISH); if (err != Z_OK) return destroy((gz_stream*)file); putLong (s->file, s->crc); putLong (s->file, (uLong)(s->in & 0xffffffff)); #endif } return destroy((gz_stream*)file); } /* =========================================================================== Returns the error message for the last error which occured on the given compressed file. errnum is set to zlib error number. If an error occured in the file system and not in the compression library, errnum is set to Z_ERRNO and the application may consult errno to get the exact error code. */ const char * ZEXPORT gzerror (file, errnum) gzFile file; int *errnum; { char *m; gz_stream *s = (gz_stream*)file; if (s == NULL) { *errnum = Z_STREAM_ERROR; return (const char*)ERR_MSG(Z_STREAM_ERROR); } *errnum = s->z_err; if (*errnum == Z_OK) return (const char*)""; m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); TRYFREE(s->msg); s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); strcpy(s->msg, s->path); strcat(s->msg, ": "); strcat(s->msg, m); return (const char*)s->msg; } /* =========================================================================== Clear the error and end-of-file flags, and do the same for the real file. */ void ZEXPORT gzclearerr (file) gzFile file; { gz_stream *s = (gz_stream*)file; if (s == NULL) return; if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; s->z_eof = 0; clearerr(s->file); } gamera-3.3.3/src/zlib-1.2.1/infback.c0000755000076500000000000005302610714675677015724 0ustar chriswheel/* infback.c -- inflate using a call-back interface * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* This code is largely copied from inflate.c. Normally either infback.o or inflate.o would be linked into an application--not both. The interface with inffast.c is retained so that optimized assembler-coded versions of inflate_fast() can be used with either inflate.c or infback.c. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) z_stream FAR *strm; int windowBits; unsigned char FAR *window; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL || window == Z_NULL || windowBits < 8 || windowBits > 15) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *)ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (voidpf)state; state->wbits = windowBits; state->wsize = 1U << windowBits; state->window = window; state->write = 0; state->whave = 0; return Z_OK; } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } /* Macros for inflateBack(): */ /* Load returned state from inflate_fast() */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Set state from registers for inflate_fast() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Assure that some input is available. If input is requested, but denied, then return a Z_BUF_ERROR from inflateBack(). */ #define PULL() \ do { \ if (have == 0) { \ have = in(in_desc, &next); \ if (have == 0) { \ next = Z_NULL; \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflateBack() with an error if there is no input available. */ #define PULLBYTE() \ do { \ PULL(); \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflateBack() with an error. */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Assure that some output space is available, by writing out the window if it's full. If the write fails, return from inflateBack() with a Z_BUF_ERROR. */ #define ROOM() \ do { \ if (left == 0) { \ put = state->window; \ left = state->wsize; \ state->whave = left; \ if (out(out_desc, put, left)) { \ ret = Z_BUF_ERROR; \ goto inf_leave; \ } \ } \ } while (0) /* strm provides the memory allocation functions and window buffer on input, and provides information on the unused input on return. For Z_DATA_ERROR returns, strm will also provide an error message. in() and out() are the call-back input and output functions. When inflateBack() needs more input, it calls in(). When inflateBack() has filled the window with output, or when it completes with data in the window, it calls out() to write out the data. The application must not change the provided input until in() is called again or inflateBack() returns. The application must not change the window/output buffer until inflateBack() returns. in() and out() are called with a descriptor parameter provided in the inflateBack() call. This parameter can be a structure that provides the information required to do the read or write, as well as accumulated information on the input and output such as totals and check values. in() should return zero on failure. out() should return non-zero on failure. If either in() or out() fails, than inflateBack() returns a Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it was in() or out() that caused in the error. Otherwise, inflateBack() returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format error, or Z_MEM_ERROR if it could not allocate memory for the state. inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) z_stream FAR *strm; in_func in; void FAR *in_desc; out_func out; void FAR *out_desc; { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; /* Check that the strm exists and that the state was initialized */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* Reset the state */ strm->msg = Z_NULL; state->mode = TYPE; state->last = 0; state->whave = 0; next = strm->next_in; have = next != Z_NULL ? strm->avail_in : 0; hold = 0; bits = 0; put = state->window; left = state->wsize; /* Inflate until end of block marked as last */ for (;;) switch (state->mode) { case TYPE: /* determine and dispatch block type */ if (state->last) { BYTEBITS(); state->mode = DONE; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: /* get and verify stored block length */ BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); /* copy stored block from input to output */ while (state->length != 0) { copy = state->length; PULL(); ROOM(); if (copy > have) copy = have; if (copy > left) copy = left; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: /* get dynamic table entries descriptor */ NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); /* get code length code lengths (not a typo) */ state->have = 0; while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); /* get length and distance code code lengths */ state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.val < 16) { NEEDBITS(this.bits); DROPBITS(this.bits); state->lens[state->have++] = this.val; } else { if (this.val == 16) { NEEDBITS(this.bits + 2); DROPBITS(this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = (unsigned)(state->lens[state->have - 1]); copy = 3 + BITS(2); DROPBITS(2); } else if (this.val == 17) { NEEDBITS(this.bits + 3); DROPBITS(this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(this.bits + 7); DROPBITS(this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: /* use inflate_fast() if we have enough input and output */ if (have >= 6 && left >= 258) { RESTORE(); if (state->whave < state->wsize) state->whave = state->wsize - left; inflate_fast(strm, state->wsize); LOAD(); break; } /* get a literal, length, or end-of-block code */ for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.op && (this.op & 0xf0) == 0) { last = this; for (;;) { this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); state->length = (unsigned)this.val; /* process literal */ if (this.op == 0) { Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; } /* process end of block */ if (this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ if (this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ state->extra = (unsigned)(this.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); /* get distance code */ for (;;) { this = state->distcode[BITS(state->distbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if ((this.op & 0xf0) == 0) { last = this; for (;;) { this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); if (this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)this.val; /* get distance extra bits, if any */ state->extra = (unsigned)(this.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } if (state->offset > state->wsize - (state->whave < state->wsize ? left : 0)) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); /* copy match from window to output */ do { ROOM(); copy = state->wsize - state->offset; if (copy < left) { from = put + copy; copy = left - copy; } else { from = put - state->offset; copy = left; } if (copy > state->length) copy = state->length; state->length -= copy; left -= copy; do { *put++ = *from++; } while (--copy); } while (state->length != 0); break; case DONE: /* inflate stream terminated properly -- write leftover output */ ret = Z_STREAM_END; if (left < state->wsize) { if (out(out_desc, state->window, state->wsize - left)) ret = Z_BUF_ERROR; } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; default: /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } /* Return unused input */ inf_leave: strm->next_in = next; strm->avail_in = have; return ret; } int ZEXPORT inflateBackEnd(strm) z_stream FAR *strm; { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } gamera-3.3.3/src/zlib-1.2.1/inffast.c0000755000076500000000000002764010714675677015764 0ustar chriswheel/* inffast.c -- fast decoding * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifndef ASMINF /* Allow machine dependent optimization for post-increment or pre-increment. Based on testing to date, Pre-increment preferred for: - PowerPC G3 (Adler) - MIPS R5000 (Randers-Pehrson) Post-increment preferred for: - none No measurable difference: - Pentium III (Anderson) - 68060 (Nikl) */ #ifdef POSTINC # define OFF 0 # define PUP(a) *(a)++ #else # define OFF 1 # define PUP(a) *++(a) #endif /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is available, an end-of-block is encountered, or a data error is encountered. When large enough input and output buffers are supplied to inflate(), for example, a 16K input buffer and a 64K output buffer, more than 95% of the inflate execution time is spent in this routine. Entry assumptions: state->mode == LEN strm->avail_in >= 6 strm->avail_out >= 258 start >= strm->avail_out state->bits < 8 On return, state->mode is one of: LEN -- ran out of enough output space or enough available input TYPE -- reached end of block code, inflate() to interpret next block BAD -- error in block data Notes: - The maximum input bits used by a length/distance pair is 15 bits for the length code, 5 bits for the length extra, 15 bits for the distance code, and 13 bits for the distance extra. This totals 48 bits, or six bytes. Therefore if strm->avail_in >= 6, then there is enough input to avoid checking for available input while decoding. - The maximum bytes that a single length/distance pair can output is 258 bytes, which is the maximum length that can be coded. inflate_fast() requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ void inflate_fast(strm, start) z_streamp strm; unsigned start; /* inflate()'s starting value for strm->avail_out */ { struct inflate_state FAR *state; unsigned char FAR *in; /* local strm->next_in */ unsigned char FAR *last; /* while in < last, enough input available */ unsigned char FAR *out; /* local strm->next_out */ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ unsigned char FAR *end; /* while out < end, enough space available */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ unsigned write; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ code const FAR *lcode; /* local strm->lencode */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ code this; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ unsigned dist; /* match distance */ unsigned char FAR *from; /* where to copy match from */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; in = strm->next_in - OFF; last = in + (strm->avail_in - 5); out = strm->next_out - OFF; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); wsize = state->wsize; whave = state->whave; write = state->write; window = state->window; hold = state->hold; bits = state->bits; lcode = state->lencode; dcode = state->distcode; lmask = (1U << state->lenbits) - 1; dmask = (1U << state->distbits) - 1; /* decode literals and length/distances until end-of-block or not enough input data or output space */ do { if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } this = lcode[hold & lmask]; dolen: op = (unsigned)(this.bits); hold >>= op; bits -= op; op = (unsigned)(this.op); if (op == 0) { /* literal */ Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); PUP(out) = (unsigned char)(this.val); } else if (op & 16) { /* length base */ len = (unsigned)(this.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; hold += (unsigned long)(PUP(in)) << bits; bits += 8; } this = dcode[hold & dmask]; dodist: op = (unsigned)(this.bits); hold >>= op; bits -= op; op = (unsigned)(this.op); if (op & 16) { /* distance base */ dist = (unsigned)(this.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; bits += 8; } } dist += (unsigned)hold & ((1U << op) - 1); hold >>= op; bits -= op; Tracevv((stderr, "inflate: distance %u\n", dist)); op = (unsigned)(out - beg); /* max distance in output */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } from = window - OFF; if (write == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } else if (write < op) { /* wrap around window */ from += wsize + write - op; op -= write; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; if (write < len) { /* some from start of window */ op = write; len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } } else { /* contiguous in window */ from += write - op; if (op < len) { /* some from window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ PUP(out) = PUP(from); PUP(out) = PUP(from); PUP(out) = PUP(from); len -= 3; } while (len > 2); if (len) { PUP(out) = PUP(from); if (len > 1) PUP(out) = PUP(from); } } } else if ((op & 64) == 0) { /* 2nd level distance code */ this = dcode[this.val + (hold & ((1U << op) - 1))]; goto dodist; } else { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } } else if ((op & 64) == 0) { /* 2nd level length code */ this = lcode[this.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } else { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } } while (in < last && out < end); /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ len = bits >> 3; in -= len; bits -= len << 3; hold &= (1U << bits) - 1; /* update state and return */ strm->next_in = in + OFF; strm->next_out = out + OFF; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); state->hold = hold; state->bits = bits; return; } /* inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - Three separate decoding do-loops for direct, window, and write == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes - Swapping literal/length else - Swapping window/direct else - Larger unrolled copy loops (three is about right) - Moving len -= 3 statement into middle of loop */ #endif /* !ASMINF */ gamera-3.3.3/src/zlib-1.2.1/inflate.c0000755000076500000000000013045310714675677015751 0ustar chriswheel/* inflate.c -- zlib decompression * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ /* * Change history: * * 1.2.beta0 24 Nov 2002 * - First version -- complete rewrite of inflate to simplify code, avoid * creation of window when not needed, minimize use of window when it is * needed, make inffast.c even faster, implement gzip decoding, and to * improve code readability and style over the previous zlib inflate code * * 1.2.beta1 25 Nov 2002 * - Use pointers for available input and output checking in inffast.c * - Remove input and output counters in inffast.c * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 * - Remove unnecessary second byte pull from length extra in inffast.c * - Unroll direct copy to three copies per loop in inffast.c * * 1.2.beta2 4 Dec 2002 * - Change external routine names to reduce potential conflicts * - Correct filename to inffixed.h for fixed tables in inflate.c * - Make hbuf[] unsigned char to match parameter type in inflate.c * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) * to avoid negation problem on Alphas (64 bit) in inflate.c * * 1.2.beta3 22 Dec 2002 * - Add comments on state->bits assertion in inffast.c * - Add comments on op field in inftrees.h * - Fix bug in reuse of allocated window after inflateReset() * - Remove bit fields--back to byte structure for speed * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths * - Change post-increments to pre-increments in inflate_fast(), PPC biased? * - Add compile time option, POSTINC, to use post-increments instead (Intel?) * - Make MATCH copy in inflate() much faster for when inflate_fast() not used * - Use local copies of stream next and avail values, as well as local bit * buffer and bit count in inflate()--for speed when inflate_fast() not used * * 1.2.beta4 1 Jan 2003 * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings * - Move a comment on output buffer sizes from inffast.c to inflate.c * - Add comments in inffast.c to introduce the inflate_fast() routine * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed * - Pull out common write == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new * source file infback.c to provide a call-back interface to inflate for * programs like gzip and unzip -- uses window as output buffer to avoid * window copying * * 1.2.beta5 1 Jan 2003 * - Improved inflateBack() interface to allow the caller to provide initial * input in strm. * - Fixed stored blocks bug in inflateBack() * * 1.2.beta6 4 Jan 2003 * - Added comments in inffast.c on effectiveness of POSTINC * - Typecasting all around to reduce compiler warnings * - Changed loops from while (1) or do {} while (1) to for (;;), again to * make compilers happy * - Changed type of window in inflateBackInit() to unsigned char * * * 1.2.beta7 27 Jan 2003 * - Changed many types to unsigned or unsigned short to avoid warnings * - Added inflateCopy() function * * 1.2.0 9 Mar 2003 * - Changed inflateBack() interface to provide separate opaque descriptors * for the in() and out() functions * - Changed inflateBack() argument and in_func typedef to swap the length * and buffer address return values for the input function * - Check next_in and next_out for Z_NULL on entry to inflate() * * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. */ #include "zutil.h" #include "inftrees.h" #include "inflate.h" #include "inffast.h" #ifdef MAKEFIXED # ifndef BUILDFIXED # define BUILDFIXED # endif #endif /* function prototypes */ local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, unsigned out)); #ifdef BUILDFIXED void makefixed OF((void)); #endif local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, unsigned len)); int ZEXPORT inflateReset(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; state->mode = HEAD; state->last = 0; state->havedict = 0; state->wsize = 0; state->whave = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; Tracev((stderr, "inflate: reset\n")); return Z_OK; } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) z_streamp strm; int windowBits; const char *version; int stream_size; { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || stream_size != (int)(sizeof(z_stream))) return Z_VERSION_ERROR; if (strm == Z_NULL) return Z_STREAM_ERROR; strm->msg = Z_NULL; /* in case we return an error */ if (strm->zalloc == (alloc_func)0) { strm->zalloc = zcalloc; strm->opaque = (voidpf)0; } if (strm->zfree == (free_func)0) strm->zfree = zcfree; state = (struct inflate_state FAR *) ZALLOC(strm, 1, sizeof(struct inflate_state)); if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (voidpf)state; if (windowBits < 0) { state->wrap = 0; windowBits = -windowBits; } else { state->wrap = (windowBits >> 4) + 1; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; #endif } if (windowBits < 8 || windowBits > 15) { ZFREE(strm, state); strm->state = Z_NULL; return Z_STREAM_ERROR; } state->wbits = (unsigned)windowBits; state->window = Z_NULL; return inflateReset(strm); } int ZEXPORT inflateInit_(strm, version, stream_size) z_streamp strm; const char *version; int stream_size; { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. If BUILDFIXED is defined, then instead this routine builds the tables the first time it's called, and returns those tables the first time and thereafter. This reduces the size of the code by about 2K bytes, in exchange for a little execution time. However, BUILDFIXED should not be used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ local void fixedtables(state) struct inflate_state FAR *state; { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; static code fixed[544]; /* build fixed huffman tables if first call (may not be thread safe) */ if (virgin) { unsigned sym, bits; static code *next; /* literal/length table */ sym = 0; while (sym < 144) state->lens[sym++] = 8; while (sym < 256) state->lens[sym++] = 9; while (sym < 280) state->lens[sym++] = 7; while (sym < 288) state->lens[sym++] = 8; next = fixed; lenfix = next; bits = 9; inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); /* distance table */ sym = 0; while (sym < 32) state->lens[sym++] = 5; distfix = next; bits = 5; inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); /* do this just once */ virgin = 0; } #else /* !BUILDFIXED */ # include "inffixed.h" #endif /* BUILDFIXED */ state->lencode = lenfix; state->lenbits = 9; state->distcode = distfix; state->distbits = 5; } #ifdef MAKEFIXED #include /* Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also defines BUILDFIXED, so the tables are built on the fly. makefixed() writes those tables to stdout, which would be piped to inffixed.h. A small program can simply call makefixed to do this: void makefixed(void); int main(void) { makefixed(); return 0; } Then that can be linked with zlib built with MAKEFIXED defined and run: a.out > inffixed.h */ void makefixed() { unsigned low, size; struct inflate_state state; fixedtables(&state); puts(" /* inffixed.h -- table for decoding fixed codes"); puts(" * Generated automatically by makefixed()."); puts(" */"); puts(""); puts(" /* WARNING: this file should *not* be used by applications."); puts(" It is part of the implementation of this library and is"); puts(" subject to change. Applications should only use zlib.h."); puts(" */"); puts(""); size = 1U << 9; printf(" static const code lenfix[%u] = {", size); low = 0; for (;;) { if ((low % 7) == 0) printf("\n "); printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, state.lencode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); size = 1U << 5; printf("\n static const code distfix[%u] = {", size); low = 0; for (;;) { if ((low % 6) == 0) printf("\n "); printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, state.distcode[low].val); if (++low == size) break; putchar(','); } puts("\n };"); } #endif /* MAKEFIXED */ /* Update the window with the last wsize (normally 32K) bytes written before returning. If window does not exist yet, create it. This is only called when a window is already in use, or when output has been written during this inflate call, but the end of the deflate stream has not been reached yet. It is also called to create a window for dictionary data when a dictionary is loaded. Providing output buffers larger than 32K to inflate() should provide a speed advantage, since only the last 32K of output is copied to the sliding window upon return from inflate(), and since all distances after the first 32K of output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ local int updatewindow(strm, out) z_streamp strm; unsigned out; { struct inflate_state FAR *state; unsigned copy, dist; state = (struct inflate_state FAR *)strm->state; /* if it hasn't been done already, allocate space for the window */ if (state->window == Z_NULL) { state->window = (unsigned char FAR *) ZALLOC(strm, 1U << state->wbits, sizeof(unsigned char)); if (state->window == Z_NULL) return 1; } /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; state->write = 0; state->whave = 0; } /* copy state->wsize or less output bytes into the circular window */ copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); state->write = 0; state->whave = state->wsize; } else { dist = state->wsize - state->write; if (dist > copy) dist = copy; zmemcpy(state->window + state->write, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); state->write = copy; state->whave = state->wsize; } else { state->write += dist; if (state->write == state->wsize) state->write = 0; if (state->whave < state->wsize) state->whave += dist; } } return 0; } /* Macros for inflate(): */ /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP # define UPDATE(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else # define UPDATE(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ #ifdef GUNZIP # define CRC2(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ check = crc32(check, hbuf, 2); \ } while (0) # define CRC4(check, word) \ do { \ hbuf[0] = (unsigned char)(word); \ hbuf[1] = (unsigned char)((word) >> 8); \ hbuf[2] = (unsigned char)((word) >> 16); \ hbuf[3] = (unsigned char)((word) >> 24); \ check = crc32(check, hbuf, 4); \ } while (0) #endif /* Load registers with state in inflate() for speed */ #define LOAD() \ do { \ put = strm->next_out; \ left = strm->avail_out; \ next = strm->next_in; \ have = strm->avail_in; \ hold = state->hold; \ bits = state->bits; \ } while (0) /* Restore state from registers in inflate() */ #define RESTORE() \ do { \ strm->next_out = put; \ strm->avail_out = left; \ strm->next_in = next; \ strm->avail_in = have; \ state->hold = hold; \ state->bits = bits; \ } while (0) /* Clear the input bit accumulator */ #define INITBITS() \ do { \ hold = 0; \ bits = 0; \ } while (0) /* Get a byte of input into the bit accumulator, or return from inflate() if there is no input available. */ #define PULLBYTE() \ do { \ if (have == 0) goto inf_leave; \ have--; \ hold += (unsigned long)(*next++) << bits; \ bits += 8; \ } while (0) /* Assure that there are at least n bits in the bit accumulator. If there is not enough available input to do that, then return from inflate(). */ #define NEEDBITS(n) \ do { \ while (bits < (unsigned)(n)) \ PULLBYTE(); \ } while (0) /* Return the low n bits of the bit accumulator (n < 16) */ #define BITS(n) \ ((unsigned)hold & ((1U << (n)) - 1)) /* Remove n bits from the bit accumulator */ #define DROPBITS(n) \ do { \ hold >>= (n); \ bits -= (unsigned)(n); \ } while (0) /* Remove zero to seven bits as needed to go to a byte boundary */ #define BYTEBITS() \ do { \ hold >>= bits & 7; \ bits -= bits & 7; \ } while (0) /* Reverse the bytes in a 32-bit value */ #define REVERSE(q) \ ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) /* inflate() uses a state machine to process as much input data and generate as much output data as possible before returning. The state machine is structured roughly as follows: for (;;) switch (state) { ... case STATEn: if (not enough input data or output space to make progress) return; ... make progress ... state = STATEm; break; ... } so when inflate() is called again, the same case is attempted again, and if the appropriate resources are provided, the machine proceeds to the next state. The NEEDBITS() macro is usually the way the state evaluates whether it can proceed or should return. NEEDBITS() does the return if the requested bits are not available. The typical use of the BITS macros is: NEEDBITS(n); ... do something with BITS(n) ... DROPBITS(n); where NEEDBITS(n) either returns from inflate() if there isn't enough input left to load n bits into the accumulator, or it continues. BITS(n) gives the low n bits in the accumulator. When done, DROPBITS(n) drops the low n bits off the accumulator. INITBITS() clears the accumulator and sets the number of available bits to zero. BYTEBITS() discards just enough bits to put the accumulator on a byte boundary. After BYTEBITS() and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return if there is no input available. The decoding of variable length codes uses PULLBYTE() directly in order to pull just enough bytes to decode the next code, and no more. Some states loop until they get enough input, making sure that enough state information is maintained to continue the loop where it left off if NEEDBITS() returns in the loop. For example, want, need, and keep would all have to actually be part of the saved state in case NEEDBITS() returns: case STATEw: while (want < need) { NEEDBITS(n); keep[want++] = BITS(n); DROPBITS(n); } state = STATEx; case STATEx: As shown above, if the next state is also the next case, then the break is omitted. A state may also return if there is not enough output space available to complete that state. Those states are copying stored data, writing a literal byte, and copying a matching string. When returning, a "goto inf_leave" is used to update the total counters, update the check value, and determine whether any progress has been made during that inflate() call in order to return the proper return code. Progress is defined as a change in either strm->avail_in or strm->avail_out. When there is a window, goto inf_leave will update the window with the last output written. If a goto inf_leave occurs in the middle of decompression and there is no window currently, goto inf_leave will create one and copy output to the window for the next call of inflate(). In this implementation, the flush parameter of inflate() only affects the return code (per zlib.h). inflate() always writes as much as possible to strm->next_out, given the space available and the provided input--the effect documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers the allocation of and copying into a sliding window until necessary, which provides the effect documented in zlib.h for Z_FINISH when the entire input stream available. So the only thing the flush parameter actually does is: when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it will return Z_BUF_ERROR if it has not reached the end of the stream. */ int ZEXPORT inflate(strm, flush) z_streamp strm; int flush; { struct inflate_state FAR *state; unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ unsigned have, left; /* available input and output */ unsigned long hold; /* bit buffer */ unsigned bits; /* bits in bit buffer */ unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ code this; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ #ifdef GUNZIP unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ #endif static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ LOAD(); in = have; out = left; ret = Z_OK; for (;;) switch (state->mode) { case HEAD: if (state->wrap == 0) { state->mode = TYPEDO; break; } NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); state->mode = FLAGS; break; } state->flags = 0; /* expect zlib header */ if (!(state->wrap & 1) || /* check if zlib header allowed */ #else if ( #endif ((BITS(8) << 8) + (hold >> 8)) % 31) { strm->msg = (char *)"incorrect header check"; state->mode = BAD; break; } if (BITS(4) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } DROPBITS(4); if (BITS(4) + 8 > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; } Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; INITBITS(); break; #ifdef GUNZIP case FLAGS: NEEDBITS(16); state->flags = (int)(hold); if ((state->flags & 0xff) != Z_DEFLATED) { strm->msg = (char *)"unknown compression method"; state->mode = BAD; break; } if (state->flags & 0xe000) { strm->msg = (char *)"unknown header flags set"; state->mode = BAD; break; } if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->flags & 0x0200) CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: NEEDBITS(16); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); state->length = (unsigned)(hold); if (state->flags & 0x0200) CRC2(state->check, hold); INITBITS(); } state->mode = EXTRA; case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->flags & 0x0200) state->check = crc32(state->check, next, copy); have -= copy; next += copy; state->length -= copy; } if (state->length) goto inf_leave; } state->mode = NAME; case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); } while (len && copy < have); if (state->flags & 0x02000) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } state->mode = COMMENT; case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; copy = 0; do { len = (unsigned)(next[copy++]); } while (len && copy < have); if (state->flags & 0x02000) state->check = crc32(state->check, next, copy); have -= copy; next += copy; if (len) goto inf_leave; } state->mode = HCRC; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); if (hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; } INITBITS(); } strm->adler = state->check = crc32(0L, Z_NULL, 0); state->mode = TYPE; break; #endif case DICTID: NEEDBITS(32); strm->adler = state->check = REVERSE(hold); INITBITS(); state->mode = DICT; case DICT: if (state->havedict == 0) { RESTORE(); return Z_NEED_DICT; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: if (flush == Z_BLOCK) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); state->mode = CHECK; break; } NEEDBITS(3); state->last = BITS(1); DROPBITS(1); switch (BITS(2)) { case 0: /* stored block */ Tracev((stderr, "inflate: stored block%s\n", state->last ? " (last)" : "")); state->mode = STORED; break; case 1: /* fixed block */ fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); state->mode = LEN; /* decode codes */ break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", state->last ? " (last)" : "")); state->mode = TABLE; break; case 3: strm->msg = (char *)"invalid block type"; state->mode = BAD; } DROPBITS(2); break; case STORED: BYTEBITS(); /* go to byte boundary */ NEEDBITS(32); if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { strm->msg = (char *)"invalid stored block lengths"; state->mode = BAD; break; } state->length = (unsigned)hold & 0xffff; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); state->mode = COPY; case COPY: copy = state->length; if (copy) { if (copy > have) copy = have; if (copy > left) copy = left; if (copy == 0) goto inf_leave; zmemcpy(put, next, copy); have -= copy; next += copy; left -= copy; put += copy; state->length -= copy; break; } Tracev((stderr, "inflate: stored end\n")); state->mode = TYPE; break; case TABLE: NEEDBITS(14); state->nlen = BITS(5) + 257; DROPBITS(5); state->ndist = BITS(5) + 1; DROPBITS(5); state->ncode = BITS(4) + 4; DROPBITS(4); #ifndef PKZIP_BUG_WORKAROUND if (state->nlen > 286 || state->ndist > 30) { strm->msg = (char *)"too many length or distance symbols"; state->mode = BAD; break; } #endif Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); state->lens[order[state->have++]] = (unsigned short)BITS(3); DROPBITS(3); } while (state->have < 19) state->lens[order[state->have++]] = 0; state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 7; ret = inflate_table(CODES, state->lens, 19, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid code lengths set"; state->mode = BAD; break; } Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.val < 16) { NEEDBITS(this.bits); DROPBITS(this.bits); state->lens[state->have++] = this.val; } else { if (this.val == 16) { NEEDBITS(this.bits + 2); DROPBITS(this.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } len = state->lens[state->have - 1]; copy = 3 + BITS(2); DROPBITS(2); } else if (this.val == 17) { NEEDBITS(this.bits + 3); DROPBITS(this.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { NEEDBITS(this.bits + 7); DROPBITS(this.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); } if (state->have + copy > state->nlen + state->ndist) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; break; } while (copy--) state->lens[state->have++] = (unsigned short)len; } } /* build code tables */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), &(state->lenbits), state->work); if (ret) { strm->msg = (char *)"invalid literal/lengths set"; state->mode = BAD; break; } state->distcode = (code const FAR *)(state->next); state->distbits = 6; ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, &(state->next), &(state->distbits), state->work); if (ret) { strm->msg = (char *)"invalid distances set"; state->mode = BAD; break; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); break; } for (;;) { this = state->lencode[BITS(state->lenbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if (this.op && (this.op & 0xf0) == 0) { last = this; for (;;) { this = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); state->length = (unsigned)this.val; if ((int)(this.op) == 0) { Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", this.val)); state->mode = LIT; break; } if (this.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } if (this.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } state->extra = (unsigned)(this.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); } Tracevv((stderr, "inflate: length %u\n", state->length)); state->mode = DIST; case DIST: for (;;) { this = state->distcode[BITS(state->distbits)]; if ((unsigned)(this.bits) <= bits) break; PULLBYTE(); } if ((this.op & 0xf0) == 0) { last = this; for (;;) { this = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; if ((unsigned)(last.bits + this.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } DROPBITS(this.bits); if (this.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } state->offset = (unsigned)this.val; state->extra = (unsigned)(this.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); } if (state->offset > state->whave + out - left) { strm->msg = (char *)"invalid distance too far back"; state->mode = BAD; break; } Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: if (left == 0) goto inf_leave; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; if (copy > state->write) { copy -= state->write; from = state->window + (state->wsize - copy); } else from = state->window + (state->write - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ from = put - state->offset; copy = state->length; } if (copy > left) copy = left; left -= copy; state->length -= copy; do { *put++ = *from++; } while (--copy); if (state->length == 0) state->mode = LEN; break; case LIT: if (left == 0) goto inf_leave; *put++ = (unsigned char)(state->length); left--; state->mode = LEN; break; case CHECK: if (state->wrap) { NEEDBITS(32); out -= left; strm->total_out += out; state->total += out; if (out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; if (( #ifdef GUNZIP state->flags ? hold : #endif REVERSE(hold)) != state->check) { strm->msg = (char *)"incorrect data check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: check matches trailer\n")); } #ifdef GUNZIP state->mode = LENGTH; case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); if (hold != (state->total & 0xffffffffUL)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; } INITBITS(); Tracev((stderr, "inflate: length matches trailer\n")); } #endif state->mode = DONE; case DONE: ret = Z_STREAM_END; goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; case MEM: return Z_MEM_ERROR; case SYNC: default: return Z_STREAM_ERROR; } /* Return from inflate(), updating the total counts and the check value. If there was no progress during the inflate() call, return a buffer error. Call updatewindow() to create and/or update the window state. Note: a memory error from inflate() is non-recoverable. */ inf_leave: RESTORE(); if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) if (updatewindow(strm, out)) { state->mode = MEM; return Z_MEM_ERROR; } in -= strm->avail_in; out -= strm->avail_out; strm->total_in += in; strm->total_out += out; state->total += out; if (state->wrap && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; } int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); ZFREE(strm, strm->state); strm->state = Z_NULL; Tracev((stderr, "inflate: end\n")); return Z_OK; } int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) z_streamp strm; const Bytef *dictionary; uInt dictLength; { struct inflate_state FAR *state; unsigned long id; /* check state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->mode != DICT) return Z_STREAM_ERROR; /* check for correct dictionary id */ id = adler32(0L, Z_NULL, 0); id = adler32(id, dictionary, dictLength); if (id != state->check) return Z_DATA_ERROR; /* copy dictionary to window */ if (updatewindow(strm, strm->avail_out)) { state->mode = MEM; return Z_MEM_ERROR; } if (dictLength > state->wsize) { zmemcpy(state->window, dictionary + dictLength - state->wsize, state->wsize); state->whave = state->wsize; } else { zmemcpy(state->window + state->wsize - dictLength, dictionary, dictLength); state->whave = dictLength; } state->havedict = 1; Tracev((stderr, "inflate: dictionary set\n")); return Z_OK; } /* Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found or when out of input. When called, *have is the number of pattern bytes found in order so far, in 0..3. On return *have is updated to the new state. If on return *have equals four, then the pattern was found and the return value is how many bytes were read including the last byte of the pattern. If *have is less than four, then the pattern has not been found yet and the return value is len. In the latter case, syncsearch() can be called again with more data and the *have state. *have is initialized to zero for the first call. */ local unsigned syncsearch(have, buf, len) unsigned FAR *have; unsigned char FAR *buf; unsigned len; { unsigned got; unsigned next; got = *have; next = 0; while (next < len && got < 4) { if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) got++; else if (buf[next]) got = 0; else got = 4 - got; next++; } *have = got; return next; } int ZEXPORT inflateSync(strm) z_streamp strm; { unsigned len; /* number of bytes to look at or looked at */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; /* check parameters */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; state->hold <<= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { buf[len++] = (unsigned char)(state->hold); state->hold >>= 8; state->bits -= 8; } state->have = 0; syncsearch(&(state->have), buf, len); } /* search available input */ len = syncsearch(&(state->have), strm->next_in, strm->avail_in); strm->avail_in -= len; strm->next_in += len; strm->total_in += len; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; state->mode = TYPE; return Z_OK; } /* Returns true if inflate is currently at the end of a block generated by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ int ZEXPORT inflateSyncPoint(strm) z_streamp strm; { struct inflate_state FAR *state; if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } int ZEXPORT inflateCopy(dest, source) z_streamp dest; z_streamp source; { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; /* check input */ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; /* allocate space */ copy = (struct inflate_state FAR *) ZALLOC(source, 1, sizeof(struct inflate_state)); if (copy == Z_NULL) return Z_MEM_ERROR; window = Z_NULL; if (state->window != Z_NULL) { window = (unsigned char FAR *) ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); if (window == Z_NULL) { ZFREE(source, copy); return Z_MEM_ERROR; } } /* copy state */ *dest = *source; *copy = *state; copy->lencode = copy->codes + (state->lencode - state->codes); copy->distcode = copy->codes + (state->distcode - state->codes); copy->next = copy->codes + (state->next - state->codes); if (window != Z_NULL) zmemcpy(window, state->window, 1U << state->wbits); copy->window = window; dest->state = (voidpf)copy; return Z_OK; } gamera-3.3.3/src/zlib-1.2.1/inftrees.c0000755000076500000000000003202010714675677016135 0ustar chriswheel/* inftrees.c -- generate Huffman trees for efficient decoding * Copyright (C) 1995-2003 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "zutil.h" #include "inftrees.h" #define MAXBITS 15 const char inflate_copyright[] = " inflate 1.2.1 Copyright 1995-2003 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot include such an acknowledgment, I would appreciate that you keep this copyright string in the executable of your product. */ /* Build a set of tables to decode the provided canonical Huffman code. The code lengths are lens[0..codes-1]. The result starts at *table, whose indices are 0..2^bits-1. work is a writable array of at least lens shorts, which is used as a work area. type is the type of code to be generated, CODES, LENS, or DISTS. On return, zero is success, -1 is an invalid code, and +1 means that ENOUGH isn't enough. table on return points to the next available entry's address. bits is the requested root table index bits, and on return it is the actual root table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ int inflate_table(type, lens, codes, table, bits, work) codetype type; unsigned short FAR *lens; unsigned codes; code FAR * FAR *table; unsigned FAR *bits; unsigned short FAR *work; { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ unsigned root; /* number of index bits for root table */ unsigned curr; /* number of index bits for current table */ unsigned drop; /* code bits to drop for sub-table */ int left; /* number of prefix codes available */ unsigned used; /* code entries in table used */ unsigned huff; /* Huffman code */ unsigned incr; /* for incrementing code, index */ unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ code this; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ int end; /* use base and extra for symbol > end */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 76, 66}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64}; /* Process a set of code lengths to create a canonical Huffman code. The code lengths are lens[0..codes-1]. Each length corresponds to the symbols 0..codes-1. The Huffman code is generated by first sorting the symbols by length from short to long, and retaining the symbol order for codes with equal lengths. Then the code starts with all zero bits for the first code of the shortest length, and the codes are integer increments for the same length, and zeros are appended as the length increases. For the deflate format, these bits are stored backwards from their more natural integer increment ordering, and so when the decoding tables are built in the large loop below, the integer codes are incremented backwards. This routine assumes, but does not check, that all of the entries in lens[] are in the range 0..MAXBITS. The caller must assure this. 1..MAXBITS is interpreted as that code length. zero means that that symbol does not occur in this code. The codes are sorted by computing a count of codes for each length, creating from that a table of starting indices for each length in the sorted table, and then entering the symbols in order in the sorted table. The sorted table is work[], with that space being provided by the caller. The length counts are used for other purposes as well, i.e. finding the minimum and maximum length codes, determining if there are any codes at all, checking for a valid set of lengths, and looking ahead at length counts to determine sub-table sizes when building the decoding tables. */ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ for (len = 0; len <= MAXBITS; len++) count[len] = 0; for (sym = 0; sym < codes; sym++) count[lens[sym]]++; /* bound code lengths, force root to be within code lengths */ root = *bits; for (max = MAXBITS; max >= 1; max--) if (count[max] != 0) break; if (root > max) root = max; if (max == 0) return -1; /* no codes! */ for (min = 1; min <= MAXBITS; min++) if (count[min] != 0) break; if (root < min) root = min; /* check for an over-subscribed or incomplete set of lengths */ left = 1; for (len = 1; len <= MAXBITS; len++) { left <<= 1; left -= count[len]; if (left < 0) return -1; /* over-subscribed */ } if (left > 0 && (type == CODES || (codes - count[0] != 1))) return -1; /* incomplete set */ /* generate offsets into symbol table for each length for sorting */ offs[1] = 0; for (len = 1; len < MAXBITS; len++) offs[len + 1] = offs[len] + count[len]; /* sort symbols by length, by symbol order within each length */ for (sym = 0; sym < codes; sym++) if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; /* Create and fill in decoding tables. In this loop, the table being filled is at next and has curr index bits. The code being used is huff with length len. That code is converted to an index by dropping drop bits off of the bottom. For codes where len is less than drop + curr, those top drop + curr - len bits are incremented through all values to fill the table with replicated entries. root is the number of index bits for the root table. When len exceeds root, sub-tables are created pointed to by the root entry with an index of the low root bits of huff. This is saved in low to check for when a new sub-table should be started. drop is zero when the root table is being filled, and drop is root when sub-tables are being filled. When a new sub-table is needed, it is necessary to look ahead in the code lengths to determine what size sub-table is needed. The length counts are used for this, and so count[] is decremented as codes are entered in the tables. used keeps track of how many table entries have been allocated from the provided *table space. It is checked when a LENS table is being made against the space in *table, ENOUGH, minus the maximum space needed by the worst case distance code, MAXD. This should never happen, but the sufficiency of ENOUGH has not been proven exhaustively, hence the check. This assumes that when type == LENS, bits == 9. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This routine permits incomplete codes, so another loop after this one fills in the rest of the decoding tables with invalid code markers. */ /* set up for code type */ switch (type) { case CODES: base = extra = work; /* dummy value--not used */ end = 19; break; case LENS: base = lbase; base -= 257; extra = lext; extra -= 257; end = 256; break; default: /* DISTS */ base = dbase; extra = dext; end = -1; } /* initialize state for loop */ huff = 0; /* starting code */ sym = 0; /* starting code symbol */ len = min; /* starting code length */ next = *table; /* current table to fill in */ curr = root; /* current table index bits */ drop = 0; /* current bits to drop from code for index */ low = (unsigned)(-1); /* trigger new sub-table when len > root */ used = 1U << root; /* use root table entries */ mask = used - 1; /* mask for comparing low */ /* check available table space */ if (type == LENS && used >= ENOUGH - MAXD) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ this.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { this.op = (unsigned char)0; this.val = work[sym]; } else if ((int)(work[sym]) > end) { this.op = (unsigned char)(extra[work[sym]]); this.val = base[work[sym]]; } else { this.op = (unsigned char)(32 + 64); /* end of block */ this.val = 0; } /* replicate for those indices with low len bits equal to huff */ incr = 1U << (len - drop); fill = 1U << curr; do { fill -= incr; next[(huff >> drop) + fill] = this; } while (fill != 0); /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; /* go to next symbol, update count, len */ sym++; if (--(count[len]) == 0) { if (len == max) break; len = lens[work[sym]]; } /* create new sub-table if needed */ if (len > root && (huff & mask) != low) { /* if first time, transition to sub-tables */ if (drop == 0) drop = root; /* increment past last table */ next += 1U << curr; /* determine length of next table */ curr = len - drop; left = (int)(1 << curr); while (curr + drop < max) { left -= count[curr + drop]; if (left <= 0) break; curr++; left <<= 1; } /* check for enough space */ used += 1U << curr; if (type == LENS && used >= ENOUGH - MAXD) return 1; /* point entry in root table to sub-table */ low = huff & mask; (*table)[low].op = (unsigned char)curr; (*table)[low].bits = (unsigned char)root; (*table)[low].val = (unsigned short)(next - *table); } } /* Fill in rest of table for incomplete codes. This loop is similar to the loop above in incrementing huff for table indices. It is assumed that len is equal to curr + drop, so there is no loop needed to increment through high index bits. When the current sub-table is filled, the loop drops back to the root table to fill in any remaining entries there. */ this.op = (unsigned char)64; /* invalid code marker */ this.bits = (unsigned char)(len - drop); this.val = (unsigned short)0; while (huff != 0) { /* when done with sub-table, drop back to root table */ if (drop != 0 && (huff & mask) != low) { drop = 0; len = root; next = *table; curr = root; this.bits = (unsigned char)len; } /* put invalid code marker in table */ next[huff >> drop] = this; /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); while (huff & incr) incr >>= 1; if (incr != 0) { huff &= incr - 1; huff += incr; } else huff = 0; } /* set return parameters */ *table += used; *bits = root; return 0; } gamera-3.3.3/src/zlib-1.2.1/trees.c0000755000076500000000000012606310714675677015453 0ustar chriswheel/* trees.c -- output deflated data using Huffman coding * Copyright (C) 1995-2003 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ /* * ALGORITHM * * The "deflation" process uses several Huffman trees. The more * common source values are represented by shorter bit sequences. * * Each code tree is stored in a compressed form which is itself * a Huffman encoding of the lengths of all the code strings (in * ascending order by source values). The actual code strings are * reconstructed from the lengths in the inflate process, as described * in the deflate specification. * * REFERENCES * * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc * * Storer, James A. * Data Compression: Methods and Theory, pp. 49-50. * Computer Science Press, 1988. ISBN 0-7167-8156-5. * * Sedgewick, R. * Algorithms, p290. * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ /* @(#) $Id: trees.c 921 2005-09-27 14:12:37Z mdboom $ */ /* #define GEN_TREES_H */ #include "deflate.h" #ifdef DEBUG # include #endif /* =========================================================================== * Constants */ #define MAX_BL_BITS 7 /* Bit length codes must not exceed MAX_BL_BITS bits */ #define END_BLOCK 256 /* end of block literal code */ #define REP_3_6 16 /* repeat previous bit length 3-6 times (2 bits of repeat count) */ #define REPZ_3_10 17 /* repeat a zero length 3-10 times (3 bits of repeat count) */ #define REPZ_11_138 18 /* repeat a zero length 11-138 times (7 bits of repeat count) */ local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; local const int extra_dbits[D_CODES] /* extra bits for each distance code */ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; local const uch bl_order[BL_CODES] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ #define Buf_size (8 * 2*sizeof(char)) /* Number of bits used within bi_buf. (bi_buf might be implemented on * more than 16 bits on some systems.) */ /* =========================================================================== * Local data. These are initialized only once. */ #define DIST_CODE_LEN 512 /* see definition of array dist_code below */ #if defined(GEN_TREES_H) || !defined(STDC) /* non ANSI compilers may not accept trees.h */ local ct_data static_ltree[L_CODES+2]; /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However * The codes 286 and 287 are needed to build a canonical tree (see _tr_init * below). */ local ct_data static_dtree[D_CODES]; /* The static distance tree. (Actually a trivial tree since all codes use * 5 bits.) */ uch _dist_code[DIST_CODE_LEN]; /* Distance codes. The first 256 values correspond to the distances * 3 .. 258, the last 256 values correspond to the top 8 bits of * the 15 bit distances. */ uch _length_code[MAX_MATCH-MIN_MATCH+1]; /* length code for each normalized match length (0 == MIN_MATCH) */ local int base_length[LENGTH_CODES]; /* First normalized length for each code (0 = MIN_MATCH) */ local int base_dist[D_CODES]; /* First normalized distance for each code (0 = distance of 1) */ #else # include "trees.h" #endif /* GEN_TREES_H */ struct static_tree_desc_s { const ct_data *static_tree; /* static tree or NULL */ const intf *extra_bits; /* extra bits for each code or NULL */ int extra_base; /* base index for extra_bits */ int elems; /* max number of elements in the tree */ int max_length; /* max bit length for the codes */ }; local static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; local static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; local static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== * Local (static) routines in this file. */ local void tr_static_init OF((void)); local void init_block OF((deflate_state *s)); local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); local void build_tree OF((deflate_state *s, tree_desc *desc)); local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); local int build_bl_tree OF((deflate_state *s)); local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); local void set_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); local void copy_block OF((deflate_state *s, charf *buf, unsigned len, int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif #ifndef DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ #else /* DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } #endif /* =========================================================================== * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ #define put_short(s, w) { \ put_byte(s, (uch)((w) & 0xff)); \ put_byte(s, (uch)((ush)(w) >> 8)); \ } /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) deflate_state *s; int value; /* value to send */ int length; /* number of bits */ { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { s->bi_buf |= (value << s->bi_valid); put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { s->bi_buf |= value << s->bi_valid; s->bi_valid += length; } } #else /* !DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ s->bi_buf |= (val << s->bi_valid);\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ s->bi_buf |= (value) << s->bi_valid;\ s->bi_valid += len;\ }\ } #endif /* DEBUG */ /* the arguments must not have side effects */ /* =========================================================================== * Initialize the various 'constant' tables. */ local void tr_static_init() { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ int bits; /* bit counter */ int length; /* length value */ int code; /* code value */ int dist; /* distance index */ ush bl_count[MAX_BITS+1]; /* number of codes at each bit length for an optimal tree */ if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { _dist_code[256 + dist++] = (uch)code; } } Assert (dist == 256, "tr_static_init: 256+dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; n = 0; while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; /* Codes 286 and 287 do not exist, but we must include them in the * tree construction to get a canonical Huffman tree (longest code * all ones) */ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { static_dtree[n].Len = 5; static_dtree[n].Code = bi_reverse((unsigned)n, 5); } static_init_done = 1; # ifdef GEN_TREES_H gen_trees_header(); # endif #endif /* defined(GEN_TREES_H) || !defined(STDC) */ } /* =========================================================================== * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef DEBUG # include # endif # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ ((i) % (width) == (width)-1 ? ",\n" : ", ")) void gen_trees_header() { FILE *header = fopen("trees.h", "w"); int i; Assert (header != NULL, "Can't open trees.h"); fprintf(header, "/* header created automatically with -DGEN_TREES_H */\n\n"); fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); for (i = 0; i < L_CODES+2; i++) { fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); } fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); } fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); for (i = 0; i < LENGTH_CODES; i++) { fprintf(header, "%1u%s", base_length[i], SEPARATOR(i, LENGTH_CODES-1, 20)); } fprintf(header, "local const int base_dist[D_CODES] = {\n"); for (i = 0; i < D_CODES; i++) { fprintf(header, "%5u%s", base_dist[i], SEPARATOR(i, D_CODES-1, 10)); } fclose(header); } #endif /* GEN_TREES_H */ /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ void _tr_init(s) deflate_state *s; { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; s->l_desc.stat_desc = &static_l_desc; s->d_desc.dyn_tree = s->dyn_dtree; s->d_desc.stat_desc = &static_d_desc; s->bl_desc.dyn_tree = s->bl_tree; s->bl_desc.stat_desc = &static_bl_desc; s->bi_buf = 0; s->bi_valid = 0; s->last_eob_len = 8; /* enough lookahead for inflate */ #ifdef DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif /* Initialize the first block of the first file: */ init_block(s); } /* =========================================================================== * Initialize a new block. */ local void init_block(s) deflate_state *s; { int n; /* iterates over tree elements */ /* Initialize the trees. */ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; s->dyn_ltree[END_BLOCK].Freq = 1; s->opt_len = s->static_len = 0L; s->last_lit = s->matches = 0; } #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ /* =========================================================================== * Remove the smallest element from the heap and recreate the heap with * one less element. Updates heap and heap_len. */ #define pqremove(s, tree, top) \ {\ top = s->heap[SMALLEST]; \ s->heap[SMALLEST] = s->heap[s->heap_len--]; \ pqdownheap(s, tree, SMALLEST); \ } /* =========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ #define smaller(tree, n, m, depth) \ (tree[n].Freq < tree[m].Freq || \ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) /* =========================================================================== * Restore the heap property by moving down the tree starting at node k, * exchanging a node with the smallest of its two sons if necessary, stopping * when the heap property is re-established (each father smaller than its * two sons). */ local void pqdownheap(s, tree, k) deflate_state *s; ct_data *tree; /* the tree to restore */ int k; /* node to move down */ { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ if (smaller(tree, v, s->heap[j], s->depth)) break; /* Exchange v with the smallest son */ s->heap[k] = s->heap[j]; k = j; /* And continue down the tree, setting j to the left son of k */ j <<= 1; } s->heap[k] = v; } /* =========================================================================== * Compute the optimal bit lengths for a tree and update the total bit length * for the current block. * IN assertion: the fields freq and dad are set, heap[heap_max] and * above are the tree nodes sorted by increasing frequency. * OUT assertions: the field len is set to the optimal bit length, the * array bl_count contains the frequencies for each bit length. * The length opt_len is updated; static_len is also updated if stree is * not null. */ local void gen_bitlen(s, desc) deflate_state *s; tree_desc *desc; /* the tree descriptor */ { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; const intf *extra = desc->stat_desc->extra_bits; int base = desc->stat_desc->extra_base; int max_length = desc->stat_desc->max_length; int h; /* heap index */ int n, m; /* iterate over the tree elements */ int bits; /* bit length */ int xbits; /* extra bits */ ush f; /* frequency */ int overflow = 0; /* number of elements with bit length too large */ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ for (h = s->heap_max+1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; tree[n].Len = (ush)bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) continue; /* not a leaf node */ s->bl_count[bits]++; xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; s->opt_len += (ulg)f * (bits + xbits); if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); } if (overflow == 0) return; Trace((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ do { bits = max_length-1; while (s->bl_count[bits] == 0) bits--; s->bl_count[bits]--; /* move one leaf down the tree */ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] */ overflow -= 2; } while (overflow > 0); /* Now recompute all bit lengths, scanning in increasing frequency. * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all * lengths instead of fixing only the wrong ones. This idea is taken * from 'ar' written by Haruhiko Okumura.) */ for (bits = max_length; bits != 0; bits--) { n = s->bl_count[bits]; while (n != 0) { m = s->heap[--h]; if (m > max_code) continue; if (tree[m].Len != (unsigned) bits) { Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); s->opt_len += ((long)bits - (long)tree[m].Len) *(long)tree[m].Freq; tree[m].Len = (ush)bits; } n--; } } } /* =========================================================================== * Generate the codes for a given tree and bit counts (which need not be * optimal). * IN assertion: the array bl_count contains the bit length statistics for * the given tree and the field len is set for all tree elements. * OUT assertion: the field code is set for all tree elements of non * zero code length. */ local void gen_codes (tree, max_code, bl_count) ct_data *tree; /* the tree to decorate */ int max_code; /* largest code with non zero frequency */ ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ ush code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ /* The distribution counts are first used to generate the code values * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { next_code[bits] = code = (code + bl_count[bits-1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. */ Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; int n, m; /* iterate over heap elements */ int max_code = -1; /* largest code with non zero frequency */ int node; /* new node being created */ /* Construct the initial heap, with least frequent element in * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; for (n = 0; n < elems; n++) { if (tree[n].Freq != 0) { s->heap[++(s->heap_len)] = max_code = n; s->depth[n] = 0; } else { tree[n].Len = 0; } } /* The pkzip format requires that at least one distance code exists, * and that at least one bit should be sent even if there is only one * possible code. So to avoid special checks later on we force at least * two codes of non zero frequency. */ while (s->heap_len < 2) { node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); tree[node].Freq = 1; s->depth[node] = 0; s->opt_len--; if (stree) s->static_len -= stree[node].Len; /* node is 0 or 1 so it does not have extra bits */ } desc->max_code = max_code; /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); /* Construct the Huffman tree by repeatedly combining the least two * frequent nodes. */ node = elems; /* next internal node of the tree */ do { pqremove(s, tree, n); /* n = node of least frequency */ m = s->heap[SMALLEST]; /* m = node of next least frequency */ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ s->heap[--(s->heap_max)] = m; /* Create a new node father of n and m */ tree[node].Freq = tree[n].Freq + tree[m].Freq; s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? s->depth[n] : s->depth[m]) + 1); tree[n].Dad = tree[m].Dad = (ush)node; #ifdef DUMP_BL_TREE if (tree == s->bl_tree) { fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); } #endif /* and insert the new node in the heap */ s->heap[SMALLEST] = node++; pqdownheap(s, tree, SMALLEST); } while (s->heap_len >= 2); s->heap[--(s->heap_max)] = s->heap[SMALLEST]; /* At this point, the fields freq and dad are set. We can now * generate the bit lengths. */ gen_bitlen(s, (tree_desc *)desc); /* The field len is now set, we can generate the bit codes */ gen_codes ((ct_data *)tree, max_code, s->bl_count); } /* =========================================================================== * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ local void scan_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; tree[max_code+1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { s->bl_tree[curlen].Freq += count; } else if (curlen != 0) { if (curlen != prevlen) s->bl_tree[curlen].Freq++; s->bl_tree[REP_3_6].Freq++; } else if (count <= 10) { s->bl_tree[REPZ_3_10].Freq++; } else { s->bl_tree[REPZ_11_138].Freq++; } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ local void send_tree (s, tree, max_code) deflate_state *s; ct_data *tree; /* the tree to be scanned */ int max_code; /* and its largest code of non zero frequency */ { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ int nextlen = tree[0].Len; /* length of next code */ int count = 0; /* repeat count of the current code */ int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ /* tree[max_code+1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { curlen = nextlen; nextlen = tree[n+1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { do { send_code(s, curlen, s->bl_tree); } while (--count != 0); } else if (curlen != 0) { if (curlen != prevlen) { send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); } else { send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { max_count = 138, min_count = 3; } else if (curlen == nextlen) { max_count = 6, min_count = 3; } else { max_count = 7, min_count = 4; } } } /* =========================================================================== * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ local int build_bl_tree(s) deflate_state *s; { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); /* opt_len now includes the length of the tree representations, except * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ s->opt_len += 3*(max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); return max_blindex; } /* =========================================================================== * Send the header for a block using dynamic Huffman trees: the counts, the * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ local void send_all_trees(s, lcodes, dcodes, blcodes) deflate_state *s; int lcodes, dcodes, blcodes; /* number of codes for each tree */ { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ send_bits(s, dcodes-1, 5); send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ void _tr_stored_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; #endif copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. * The current inflate code requires 9 bits of lookahead. If the * last two codes for the previous block (real code plus EOB) were coded * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode * the last real code. In this case we send two empty static blocks instead * of one. (There are no problems if the previous block is stored or fixed.) * To simplify the code, we assume the worst case of last real code encoded * on one bit only. */ void _tr_align(s) deflate_state *s; { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); /* Of the 10 bits for the empty block, we have already sent * (10 - bi_valid) bits. The lookahead for the last real code (before * the EOB of the previous block) was thus at least one plus the length * of the EOB plus what we have just sent of the empty static block. */ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef DEBUG s->compressed_len += 10L; #endif bi_flush(s); } s->last_eob_len = 7; } /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ void _tr_flush_block(s, buf, stored_len, eof) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ int eof; /* true if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ /* Build the Huffman trees unless a stored block is forced */ if (s->level > 0) { /* Check if the file is ascii or binary */ if (s->data_type == Z_UNKNOWN) set_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, s->static_len)); build_tree(s, (tree_desc *)(&(s->d_desc))); Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, s->static_len)); /* At this point, opt_len and static_len are the total bit lengths of * the compressed block data, excluding the tree representations. */ /* Build the bit length tree for the above two trees, and get the index * in bl_order of the last bit length code to send. */ max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ opt_lenb = (s->opt_len+3+7)>>3; static_lenb = (s->static_len+3+7)>>3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, s->last_lit)); if (static_lenb <= opt_lenb) opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else if (stored_len+4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. * Otherwise we can't have processed more than WSIZE input bytes since * the last block flush, because compression would have been * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ _tr_stored_block(s, buf, stored_len, eof); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (static_lenb == opt_lenb) { #endif send_bits(s, (STATIC_TREES<<1)+eof, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { send_bits(s, (DYN_TREES<<1)+eof, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); #ifdef DEBUG s->compressed_len += 3 + s->opt_len; #endif } Assert (s->compressed_len == s->bits_sent, "bad compressed size"); /* The above check is made mod 2^32, for files larger than 512 MB * and uLong implemented on 32 bits. */ init_block(s); if (eof) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, s->compressed_len-7*eof)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ int _tr_tally (s, dist, lc) deflate_state *s; unsigned dist; /* distance of matched string */ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { s->d_buf[s->last_lit] = (ush)dist; s->l_buf[s->last_lit++] = (uch)lc; if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; } else { s->matches++; /* Here, lc is the match length - MIN_MATCH */ dist--; /* dist = match distance - 1 */ Assert((ush)dist < (ush)MAX_DIST(s) && (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } #ifdef TRUNCATE_BLOCK /* Try to guess if it is profitable to stop the current block here */ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { /* Compute an upper bound for the compressed length */ ulg out_length = (ulg)s->last_lit*8L; ulg in_length = (ulg)((long)s->strstart - s->block_start); int dcode; for (dcode = 0; dcode < D_CODES; dcode++) { out_length += (ulg)s->dyn_dtree[dcode].Freq * (5L+extra_dbits[dcode]); } out_length >>= 3; Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", s->last_lit, in_length, out_length, 100L - out_length*100L/in_length)); if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; } #endif return (s->last_lit == s->lit_bufsize-1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. */ } /* =========================================================================== * Send the block data compressed using the given Huffman trees */ local void compress_block(s, ltree, dtree) deflate_state *s; ct_data *ltree; /* literal tree */ ct_data *dtree; /* distance tree */ { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ unsigned lx = 0; /* running index in l_buf */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->last_lit != 0) do { dist = s->d_buf[lx]; lc = s->l_buf[lx++]; if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; send_code(s, code+LITERALS+1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra != 0) { lc -= base_length[code]; send_bits(s, lc, extra); /* send the extra length bits */ } dist--; /* dist is now the match distance - 1 */ code = d_code(dist); Assert (code < D_CODES, "bad d_code"); send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { dist -= base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, "pendingBuf overflow"); } while (lx < s->last_lit); send_code(s, END_BLOCK, ltree); s->last_eob_len = ltree[END_BLOCK].Len; } /* =========================================================================== * Set the data type to ASCII or BINARY, using a crude approximation: * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. * IN assertion: the fields freq of dyn_ltree are set and the total of all * frequencies does not exceed 64K (to fit in an int on 16 bit machines). */ local void set_data_type(s) deflate_state *s; { int n = 0; unsigned ascii_freq = 0; unsigned bin_freq = 0; while (n < 7) bin_freq += s->dyn_ltree[n++].Freq; while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq; while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq; s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII); } /* =========================================================================== * Reverse the first len bits of a code, using straightforward code (a faster * method would use a table) * IN assertion: 1 <= len <= 15 */ local unsigned bi_reverse(code, len) unsigned code; /* the value to invert */ int len; /* its bit length */ { register unsigned res = 0; do { res |= code & 1; code >>= 1, res <<= 1; } while (--len > 0); return res >> 1; } /* =========================================================================== * Flush the bit buffer, keeping at most 7 bits in it. */ local void bi_flush(s) deflate_state *s; { if (s->bi_valid == 16) { put_short(s, s->bi_buf); s->bi_buf = 0; s->bi_valid = 0; } else if (s->bi_valid >= 8) { put_byte(s, (Byte)s->bi_buf); s->bi_buf >>= 8; s->bi_valid -= 8; } } /* =========================================================================== * Flush the bit buffer and align the output on a byte boundary */ local void bi_windup(s) deflate_state *s; { if (s->bi_valid > 8) { put_short(s, s->bi_buf); } else if (s->bi_valid > 0) { put_byte(s, (Byte)s->bi_buf); } s->bi_buf = 0; s->bi_valid = 0; #ifdef DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } /* =========================================================================== * Copy a stored block, storing first the length and its * one's complement if requested. */ local void copy_block(s, buf, len, header) deflate_state *s; charf *buf; /* the input data */ unsigned len; /* its length */ int header; /* true if block header must be written */ { bi_windup(s); /* align on byte boundary */ s->last_eob_len = 8; /* enough lookahead for inflate */ if (header) { put_short(s, (ush)len); put_short(s, (ush)~len); #ifdef DEBUG s->bits_sent += 2*16; #endif } #ifdef DEBUG s->bits_sent += (ulg)len<<3; #endif while (len--) { put_byte(s, *buf++); } } gamera-3.3.3/src/zlib-1.2.1/uncompr.c0000755000076500000000000000412310714675677016004 0ustar chriswheel/* uncompr.c -- decompress a memory buffer * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id: uncompr.c 921 2005-09-27 14:12:37Z mdboom $ */ #define ZLIB_INTERNAL #include "zlib.h" /* =========================================================================== Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be large enough to hold the entire uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. This function can be used to decompress a whole file at once if the input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, or Z_DATA_ERROR if the input data was corrupted. */ int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { z_stream stream; int err; stream.next_in = (Bytef*)source; stream.avail_in = (uInt)sourceLen; /* Check for source > 64K on 16-bit machine: */ if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; stream.next_out = dest; stream.avail_out = (uInt)*destLen; if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; err = inflateInit(&stream); if (err != Z_OK) return err; err = inflate(&stream, Z_FINISH); if (err != Z_STREAM_END) { inflateEnd(&stream); if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) return Z_DATA_ERROR; return err; } *destLen = stream.total_out; err = inflateEnd(&stream); return err; } gamera-3.3.3/src/zlib-1.2.1/zutil.c0000755000076500000000000001561110714675677015474 0ustar chriswheel/* zutil.c -- target dependent utility functions for the compression library * Copyright (C) 1995-2003 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id: zutil.c 921 2005-09-27 14:12:37Z mdboom $ */ #include "zutil.h" #ifndef NO_DUMMY_DECL struct internal_state {int dummy;}; /* for buggy compilers */ #endif #ifndef STDC extern void exit OF((int)); #endif const char * const z_errmsg[10] = { "need dictionary", /* Z_NEED_DICT 2 */ "stream end", /* Z_STREAM_END 1 */ "", /* Z_OK 0 */ "file error", /* Z_ERRNO (-1) */ "stream error", /* Z_STREAM_ERROR (-2) */ "data error", /* Z_DATA_ERROR (-3) */ "insufficient memory", /* Z_MEM_ERROR (-4) */ "buffer error", /* Z_BUF_ERROR (-5) */ "incompatible version",/* Z_VERSION_ERROR (-6) */ ""}; const char * ZEXPORT zlibVersion() { return ZLIB_VERSION; } uLong ZEXPORT zlibCompileFlags() { uLong flags; flags = 0; switch (sizeof(uInt)) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } switch (sizeof(uLong)) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } switch (sizeof(voidpf)) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } switch (sizeof(z_off_t)) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; default: flags += 3 << 6; } #ifdef DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif #ifdef ZLIB_WINAPI flags += 1 << 10; #endif #ifdef BUILDFIXED flags += 1 << 12; #endif #ifdef DYNAMIC_CRC_TABLE flags += 1 << 13; #endif #ifdef NO_GZCOMPRESS flags += 1 << 16; #endif #ifdef NO_GZIP flags += 1 << 17; #endif #ifdef PKZIP_BUG_WORKAROUND flags += 1 << 20; #endif #ifdef FASTEST flags += 1 << 21; #endif #ifdef STDC # ifdef NO_vsnprintf flags += 1 << 25; # ifdef HAS_vsprintf_void flags += 1 << 26; # endif # else # ifdef HAS_vsnprintf_void flags += 1 << 26; # endif # endif #else flags += 1 << 24; # ifdef NO_snprintf flags += 1 << 25; # ifdef HAS_sprintf_void flags += 1 << 26; # endif # else # ifdef HAS_snprintf_void flags += 1 << 26; # endif # endif #endif return flags; } #ifdef DEBUG # ifndef verbose # define verbose 0 # endif int z_verbose = verbose; void z_error (m) char *m; { fprintf(stderr, "%s\n", m); exit(1); } #endif /* exported to allow conversion of error code to string for compress() and * uncompress() */ const char * ZEXPORT zError(err) int err; { return ERR_MSG(err); } #if defined(_WIN32_WCE) /* does not exist on WCE */ int errno = 0; #endif #ifndef HAVE_MEMCPY void zmemcpy(dest, source, len) Bytef* dest; const Bytef* source; uInt len; { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } int zmemcmp(s1, s2, len) const Bytef* s1; const Bytef* s2; uInt len; { uInt j; for (j = 0; j < len; j++) { if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; } return 0; } void zmemzero(dest, len) Bytef* dest; uInt len; { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ } while (--len != 0); } #endif #ifdef SYS16BIT #ifdef __TURBOC__ /* Turbo C in 16-bit mode */ # define MY_ZCALLOC /* Turbo C malloc() does not allow dynamic allocation of 64K bytes * and farmalloc(64K) returns a pointer with an offset of 8, so we * must fix the pointer. Warning: the pointer must be put back to its * original form in order to free it, use zcfree(). */ #define MAX_PTR 10 /* 10*64K = 640K */ local int next_ptr = 0; typedef struct ptr_table_s { voidpf org_ptr; voidpf new_ptr; } ptr_table; local ptr_table table[MAX_PTR]; /* This table is used to remember the original form of pointers * to large buffers (64K). Such pointers are normalized with a zero offset. * Since MSDOS is not a preemptive multitasking OS, this table is not * protected from concurrent access. This hack doesn't work anyway on * a protected system like OS/2. Use Microsoft C instead. */ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { voidpf buf = opaque; /* just to make some compilers happy */ ulg bsize = (ulg)items*size; /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ if (bsize < 65520L) { buf = farmalloc(bsize); if (*(ush*)&buf != 0) return buf; } else { buf = farmalloc(bsize + 16L); } if (buf == NULL || next_ptr >= MAX_PTR) return NULL; table[next_ptr].org_ptr = buf; /* Normalize the pointer to seg:0 */ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; *(ush*)&buf = 0; table[next_ptr++].new_ptr = buf; return buf; } void zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; } /* Find the original pointer */ for (n = 0; n < next_ptr; n++) { if (ptr != table[n].new_ptr) continue; farfree(table[n].org_ptr); while (++n < next_ptr) { table[n-1] = table[n]; } next_ptr--; return; } ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } #endif /* __TURBOC__ */ #ifdef M_I86 /* Microsoft C in 16-bit mode */ # define MY_ZCALLOC #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) # define _halloc halloc # define _hfree hfree #endif voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } void zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); } #endif /* M_I86 */ #endif /* SYS16BIT */ #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC extern voidp malloc OF((uInt size)); extern voidp calloc OF((uInt items, uInt size)); extern void free OF((voidpf ptr)); #endif voidpf zcalloc (opaque, items, size) voidpf opaque; unsigned items; unsigned size; { if (opaque) items += size - size; /* make compiler happy */ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } void zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { free(ptr); if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ gamera-3.3.3/tests/0000755000076500000000000000000011755376174013124 5ustar chriswheelgamera-3.3.3/tests/data/0000755000076500000000000000000011755376174014035 5ustar chriswheelgamera-3.3.3/tests/data/Grey16_generic.png0000644000076500000000000000031711167407101017273 0ustar chriswheel‰PNG  IHDRSH˙XJÇ pHYsêe¤IDAThíÓ1 1 A˙˙ç¤NâÄ0* BóÌÌ˙Ϛ+È,É,É,É,É,É,É,É,É,É,É,É,É,É,É,É,É,É,É,ÉüôÚÚ>–ùlm;zIfií}à)kïOıċèżĝŽÌ’Ì’Ì’Ì’Ì’Ì’Ì’Ì’Ì’ÌÒ%™oüÌıÛÑĉZIENDB`‚gamera-3.3.3/tests/data/Grey16_generic.tiff0000644000076500000000000002752210714675716017466 0ustar chriswheelII*¸.<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<³; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <â;c;;É:Ò<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ö;š;";ì:ï:;í: <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Ë;<;Ç::Ö:ñ:;;,;?<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ó;Œ;;ç:ä:Ï:û:;);<;O;`;p<<<<<<<<<<<<<<<<<<<<<<<<<<<·;;ì:ê:û:;; ;';>;P;e;z;‰;Ÿ<<<<<<<<<<<<<<<<<<<<<<< <ß;i;ê:ı:Î:;;2;D;,;S;z;‰;˜;İ;ĥ;;Ï<<<<<<<<<<<<<<<<<<<<<û;¤;;É:Ċ:Ö:Ú:;8;G;Y;b;J;€;Š;›;;Ĵ;ħ;ĥ;Ĉ<<<<<<<<<<<<<<<<<<<Ì;L;Ë:·:É:Ŝ:ô:˙:;8;O;_;p;p;r;;µ;;Ò;;ĥ;Ó;Ŝ<<<<<<<<<<<<<<<<ï;ˆ;û:ğ:ħ:Ö: ;;2;D;W;j;z;ˆ;–; ;„;¤;Ë;×;â;ê;;Ó;ĉ;ñ<<<<<<<<<<<<<<·;';:ĵ:Ê:Ú:Ú:;2;D;Q;W;e;o;{;„;‰;“;’;Î;â;í;÷;ĝ;Î;ê;÷;˙<<<<<<<<<<<è;y;è:Ğ::Ó:ç:û:ŝ:;%;;;J;Z;g;u;„;’;ž;İ;;;ê;÷;˙;<ü;Ŝ;û;< <<<<<<<<û;;,;ċ:Ô:²:Ö::;;;;9;P;];l;z;€;‰;—;¤;;µ;;;ß;ĉ;ċ;í;ñ;ô;˙;<<<<<<<Ö;T;ó:Ö:Ŝ:í:ċ:Ŝ:;;;#;0;8;P;`;m;…;Š;‰;­;;Ó;Ŝ;â;;Û;é;ñ;ú;< <<<<#<<<ï;Œ;ġ:¤:¨::Ò:ċ:ô:˙:;%;5;A;P;J;b;{;…;’;œ;—;İ;ß;ê;ô;ü;í;Î;ì;ô;ü;< < <<< <#<Ì;I;à:È:­::Ŝ::;;;.;;;G;T;`;g;`;„;“;;İ;­; ;×;ô;ü;< <ç;é;<<<)<2<;<A<M<S<Z;Ġ:Ù:ĉ:ç:Ë::;;;);5;D;Q;W;c;r;p;;œ;;;ş;ş;ĥ;ô;< <<<ċ;<-<5<;<A<G<L<Q<U<W<[Ŝ::˙: ;ê:; ;2;J;X;i;u;…;“;Ÿ;Ş;Ş;ƒ;;;ĥ;Â;Ç;ğ;×;< <<< <é;<#<#<)<%<<%<-<2<5<8;;%;; ;I;[;g;t;;‰;“;Ÿ;Ĥ;­;ĥ;Ħ;“;Ş;µ;ğ;Ç;Ë;Î;Û;ô;ü;< <ô;</<9<A<J<><<2<;<A<D<H#;/;8;;5;R;];e;q;g;p;{;‰;;˜;;—;;ß;é;ô;˙; <<<<&<-<,<û;)<F<L<P<U<8<<;<A<F<J<J);8;/;/;e;u;;’;˜;n;€;—; ;İ;²;­;Ş;ê;ú;˙;< <<<<<#< <<<A<M<R<X<Z<)<)<A<F<J<O<J`;c;>;j;;—; ;Ş;œ;{;œ;İ;;ĥ;;­;·;Ú;á;Û;â;ĉ;ñ;ñ;û;˙; <<<<M<T<Z<_<[<#<9<G<J<O<R<Fj;\;U;“; ;Ş;²;ĥ;‰;—;­;µ;;Ĉ;;³;Ó;Ŝ;ĉ;í;ô;û;˙;< <<<<<2<R<X<\<]<M<"<<<C<A<D<D<;Z;R;‰;İ;²;ğ;;²;Ž;;ğ;;Ê;Ï;Â;Ĉ;;ê;ñ;÷;û;˙;< <<<<<<#<&<)<,<3<2<5<<<G<J<O<Q<;c;p;Ş;ş;ż;Ç;Ê;; ;ş;Â;Ç;Í;Ë;Â;Î;Ŝ;Ŝ;ċ;é;í;í;<</<:<A<<<-<5<8<><C<F<I<M<P<T<W<T<;g;„;œ;¤;Ħ;¤;İ;¤;;ş;;Ê;Ö;Ë;Í;ê;ô;û;˙;<ñ; <><F<J<O<O<< <3<8<><A<A<D<G<J<J<J<J<D<;{;—;Ÿ;İ;ħ;ı;;Ĉ;Î;Ó;Ú;á;â;Î;â;÷;ŝ;< < <ñ;,<G<L<P<S<G<<#<)<-<2<><G<Q<Z<g<q<u<{<W<A—;İ;;ĥ;½;;È;Î;Ó;Ú;Ŝ;â;Ŝ;Ó;ô;˙;< <<<˙;A<L<P<U<X<2< <X<c<h<m<r<u<z<~<€<„<…<…<O<G¤;İ;­;²;ş;;Ç;Î;á;ĉ;ô;÷;×;ċ;˙;< <<<ú;<J<P<U<X<Y<<<<e<j<n<p<r<u<u<u<u<u<p<g<><IÎ;×;â;ê;ô;û;< <<<<<Ŭ;÷;< <<<<û;9<M<M<O<Q<D<<9<I<G<G<A<A<7<A<C<I<L<U<O<<<wê;ñ;÷;ŝ;< < <<<<<ô;á;ü;<<< < <<< </<2<><#<<U<`<e<o<r<T<.<M<T<W<Z<]<O<A<ˆè;ê;ê;ĉ;ĉ;ĉ;ĉ;â;ĉ;é;ê;á;<<)</<8<><G<K<Q<U<[<_<]<#<;<k<q<r<u<u<@<5<R<U<Y<[<]<G<><lÚ;;í;Ë;Ê;ċ;í;ó;÷;ü;í;í;0<;<A<D<I<L<P<S<U<Z<\<_<S<<U<o<r<u<u<r<2<A<T<U<Z<[<\<><C<X< <ŝ;Ĉ;ß;ñ;ô;ú;˙;˙;ĉ; <6<;<:<><><?<5<5</</<&<'<<<g<r<u<u<z<e<,<J<T<U<Z<[<Y<:<R<b < <Ŝ;Í;í;ô;ú;˙;<ĝ;ċ;ĝ;<< < <<<<#<)<-<2<3<<8<n<r<u<z<z<O<-<O<T<U<Y<[<R<6<X<`< <Í;ċ;ô;ú;˙;<<ê;ô;<<<<<#<&<+<-<0<3<5<2<<R<p<r<r<u<t<5<0<J<I<G<G<G<<<5<B<G<í;Ï;ô;ú;˙;<<˙;ĉ;<<<<<"<%<(<)<*<-</</<#<<;<A<5<7<5<8<5<9<A<D<M<Q<S<<<<<\<` <;â;ú;ŝ;˙;<<ñ;í; < < < < < < <<<#<2<9<A<<<:<><A<D<I<J<N<P<R<T<U<Y<W<5<D<_<`í;Ï;â;é;ċ;ê;í;í;ĉ;ö;< <<<< <<R<\<_<b<g<]<</<A<D<G<G<K<L<O<P<P<R<S<W<O<0<N<_<_ċ;;ô;ĝ;˙;< <ĝ;í;<<<<"< <<*<]<`<b<e<h<G<<8<@<A<A<A<C<><><<<<<;<A<D<:</<U<^<_÷;ŝ;˙;<< < <ê;ĝ;<<<<#<<<L<_<b<c<g<g<)<<#<)<,<;<D<R<W<j<q<u<{<<<T<2<W<]<_ SH°.B/J/@@gamera-3.3.3/tests/data/GreyScale_generic.png0000644000076500000000000000760111167407101020077 0ustar chriswheel‰PNG  IHDRaD´ ú pHYsêe¤3IDATX…5˜ë]WrÇ¨ŞıÖÚûœ‹Z-“­´Znuì°“6 üyÛĵA€ #ÀIÛpǒ£Ö”HŠ<—½×ZsVü ]/Pżê5>ŝ[İW_f2*÷’cDìiÖĞ@XihÔŽËŭ(Ynna÷ç} w‹ĜGI O"ûH{p@ÈĠòìVHP14$qêÈf€s3:{Êİì£4em0çyÜú–ƒ1,-g˘ÌÈrOg– :9Dk苗Ԡî·eY4  j,oħí{ŸċqqÚ"{‡€!ĊJÁÚUi uw¤hVô‘5öšfVï×ÔyžVˆŒ(T§Ì×T4ƒ/nuZK!U¤g*Er”jP˘Ñħ§ ħϜSy×ÑYûhJá_‡B×T…³ˆ²­ûV–Ğ5+Ş Gv‹, Cäà\ (I£5A<ÚJSJ°9ŠVE€pË>ϙ=·w‹YŞYÁ  À4*TH³OIċÊ,`+-l,IÂŒŞ )•D ڏ7Ż–¨ŭ8OG)‘jVETxÉ  €Ħ’Ò8àSıިà(,9Ĉ:rD”*mŻcŜöRExUI§ċ0`…H9œ钑 Ê4 ’œ*b J4Ş$Ì3ş„af“úŜ§XšjŠ#=lÒ”lÒ &r+%H¨2$ÁÊIw‘ˆ)SÀX&ç{ÛïÌ[Cʌ(z;¸‹TxÈa h½"‚’` `(Alä,ÙE0ú°İĊ´˙Ó7óñúÉ£EZa>¸@‘–‹,ît£™Ñ›Cİ*¸“V"ßí°ĉYŒ@™ÄÌÊI·ÄÍ˙ûŸ§c|üëOzŠ”™ÌAaâÔÌpY“— ı›KƒYTL£ħĵ fV\{Uİߟr|óĊĞCŻ|2רaî€8uù„ìt›:hUĠÚ6ĈM‡ó̃ĞJĞDh>Ż£ˆ*TĠ?ôĝò5çrÙŞÁ²È!X0w‡J¤Û^’Y˜éĵi^n†‚„‘ĉm d*ê€×÷ßżéŻ+ƒŝÉÜI$ÛÁO£t1Öa­@£Ñ:ÔX5ĊÄ=‹ E)²ŠŞä`e]ħì[oĵ½ı…ÖĵÁÊVe‚&uŞÑ<%`dŸ\sXğیHSİ2l/İh5tëpûí/ĥ˜Ç^‡>|“ùîŽî‡‹nӖékb/c)1aUèa" Uíğ4 j³lÊŻŝ÷‹İĈáòyzÜu£s+ìĤé0ï9h$FÁŞ`‘Â;Š,ÈQk—›+›UÍÑK5T6Ŭ~óËìWĤ ­ÓÏx?Y´Ú77ŬŸÍŞÜ%cf@R6EŞÄ’gŞ F›‡TÎZ ÜŬâƒë6³aäíġÏŜ³Ê˜2³'=Ŭ]ŝ•뤽9) ÔÎ1hŜŬXY B\k&pĴá/kĊÛr}ríá¨Ħ.t€‘í°• ô–›`ŒT9M}ÎaÖF Fš3Ñ)¸Żx>\߯߿­ÖO˘ŞT^`ZċÛğÍ}:žO}7#˘„Ĝ֝ĠʐYµWĥÉC™ßœŒħ\µğ›N—ç0fâ< j½ċĊ4wٍ=Ŝĵħġ~n* ÀĜ&!nÊÊ"‘QDx?<˙ŽäÁÚĠÏ·[Emİ^ĵÛ=GcŽfCÇV°ŽĠŻëíÍĉJ7ÄL òCh$ĞrÔùÛoŸĵßòġŬA&ŸoĞĤĜͰÌSċèó… Hë+ÂŬa—ÒhÈÖBm.²n$§ID³ĉY€ˆ×_àéZWÄìê›w-AK˜ûñ²v`™y1²p?m%›‡î‚ë~ÌħTŞD°g‡CÖr¸ğénӛ/öOŽcżÏċp°—wċ{P‚O‡ÜlnPLîcBÚiLĉÖǸ˜vġ¤€=ŽÁMFE²ĉĥ}ñöé³ÖOçxìwKìá³Ç„5î]1Ï(6ÒÚuNš.Fı3írJŽ˜Úè0ɖ”J”TëŝŬ‹‡?ż>UŽÊŻżynġÁÇW€Ó,j˜s7wÓ >ğÜPâ4µĦ2÷eš–óŒˆûaš°Ò/„Fznoż;~tyê66‘ġĉ÷?6“ÍSß-f·À^ó¸Ëyıh;D÷inWá7s"M :ԖmOóI1m*ò5?üéžĈħiÜĤ[ġĊóöÍÓ¨Ö`Óv>ÍÇ9h÷Ġ.Çx.ušJi%…ò` £iöò½İÒ/l P[œíŭ” £cĴÚĠ·`ìw0tM5ìÑĤırœOÇù3IˆžJ¨x°Ï‡Sġ&ŸX~8EJm:m[ż{<1ŽímÎm=nôöp&rDËħk§Ġ‰>ÚĞÜEşÊ)ÀâfħÒÙB,óZ ×ŭÙír;Ëví§ˆùAez7ğ|dšO§#½-‡ûnä1œ1ĥA'¤½$XDsìôiŸ[;˘ŞİÇİïӂíäËígÏÎ7ĥ‡iÒrŭòËuîż÷t °M…ë~b™O#ÄĴ1ˆÁ°e˘Ġn0*Áp×İh`sKä>|ûá˗G‹hġôڇ˜_=ßdážmŸĉĵ&Íac‹y–0´ŒóÜö2À€•è´,³jm>Jëŝĵ>~í-£ĠŬv>˜ğµµ]\ú˜Yu2soc—&ÓEnc·Žšïg4#@E9ĈŽg n{µğïòÇwˆá‘müxóŜƒŝ^n°Â¤1Eġ°ĥhëéshfcSṫ>|z8˜GözŒoÏĜY²eña>8…këî˘]CħġĦç7—OŜóµFúH4¨úÖG–lŒa7_ü}†ĊaìċÚÖ­/>ï[³¸=ÎëâQ}Í:WŽ>@cUŽ|µŜŜ sz+Ŝżzċ6N7ZNóq…ŞĠÌ ħí)míĉËżó_>¸~3]?ċgŸ?nğ{ìc%×–”8è÷żŭŬü häܳÄ~ûäZŽ6ċŭzħU ~ô T)ßöq÷u{̛7ŭúâċĥŝp‹ÔÖb÷ݏbŻ9ÒĉuŸ—ŝöwżyñôuûÉډ0·÷¸ œ#ı?œ[ËJVŸ²Dċ(½'ë´mO~ĥġ}Ġ}?t÷€Ï{ ft1òÌÇŝŭ?ŭíŭñû  ÏóéûGż¸}~˜µ›ċPc€²¸tËÓ|µK@ÍñÖĉû“Ċt¸yŝÛ/ñ“Ëó™aµë8Ù}FÔÎċòÓ˙ŝ£OûĠßàÍGNjmşĴù‡ĵäÚúʑ^}úóŸžËñ ™c ċW·żß›.ìĊËO˙êÓó돖°ÈÜÒîŜĝzìQüË˙ġG4?}û×˙‹?ŝĠ·ö`Ÿ_}Ŝ_]^ŜFŸŒËŝY~t­>ĝèOq·_]ÌcCTÛ>/_,ż˙êĞÏŭç_?‹=Ì˘m·­ŝáı+Kââġ/Ÿ<¸½É'ö·—ġùaŜ˜Uĵéóƒ÷ÓÓîġ˘ĉ‚úöĤûK ‰->ĝ§xsuŭÍsïÏ˙Ó/â\Nùòb6À÷žüéĦäċ食ÇvuıöĠ—6D C{¸­ĞìY`ŽŜâ²y†ċè룏>ż˙ĵğ˙ùü¤nšùéŜ×mÛ;HĈ6ĊĞŞÚ* S0_N[£½3}M}niF ÚŽ1ʉ%Tr/‡Í4ƒaL-‡{ȏñ—–ÙÖ/ƒIŠwE—1G “ħ•„w_>Áw}żĦ'hƒÖhMpópfÑBĤŞÑqm{ri-ş˜ tj²Éc%#ˆ¤“~è÷Ŭ °fI”éSÀb>Ĵ{‹6zÁœ%îÙĉĜ,Ċ°e% ˆ[ïló4O{/ 3ÄòpŬá>DhÙiĤjËl {ZóĉŞUï:Ħa£M‡èkHÑ`lFĉyşèšIs”Ì'UßĜf™kÈ}Žm.’F›ŒÀ²ÜP`(WRƒİÂĵTÑ*y€0µ²ı‚½hĜğÏ9Mĥċ²œ“4NóĊrŸ6ÜçÔTU†˘›d—" @aŻĉîT0ıCœrcL÷dD5 Á“ŝ/JÄZ„ j4ÜŞdVbΑCV!'Tف0MF$@ĉ“KÔ^[Í f!Ş·³‘"£J É܊¨w–ĊZÉ xHˆL08…ĥ 'd̰ĴÓÛş4NÒ"'R•ĉôR´ŭY Èúې&SqOWEÊ5/0³yİÁÌ1Ìz•€}Ĝl­ı-E´˜şPÛTı†fϒH#Ħf¸Ċ˜ËYá]]!`Ĝ^^’Ì-ÍÜD·‘éWû}•Bé6µ4p²@Ñ#U0PÀžNô°Š&&J‘€Ċ*LĈÌQĞĊ„„­ğÍi ³z iVT+IV…]cŒ­†C 'ŻıŸ/›I‘(Ò5¤£kµĞĥŽZ³Á R‘ šĤ•iUÌ֓bUÁ̐#Gˆ +ÓÚĉW„+ú(˜ïi„dħŒ{+³\Ïğ?Â@f²à €A˜²TĠI2‘›-3ĊÊĴĝ˙]wŝdĊƒÏIENDB`‚gamera-3.3.3/tests/data/GreyScale_generic.tiff0000644000076500000000000001514610714675716020266 0ustar chriswheelII*ÌÍÒÏÊÈËÒÓÔĜÖÓÍÉÉÊËÌÈÄÈÌĈĊÇÂÀżżÁżÄÄÄĊÇËÏÏËÇĊÏ×ÌÈĈĈÇÈĊĈÈËÍÑÓÈżıÁĊÈËÍÑÚÖÌÊÉÈÈÉÌÒÑÒÓÎÊÇĈÈÉÄÎÌÌËËÇżÁÈÉÌÎÒÒÏÌÊÊÊÊÉÉÈÇÈĊÂÄÈÈÀ½ı½ÁÁÁÄÇÈÁÈÎÊÇĈĈÇÎÔÇÁÀĈÄżÄÈÇÈÊÑÏÀıÂÊÊÎÌÊÇÄÈÄÇÉÊÑÙÏÊÇĈÈÇÄÉÇÇÇÇÇĈĈĊĈÉËÎÏÉÇÉÊÊÉÈÇÇÇĈĊĈÉĊÂÁżĵÄÇĊĈĈĈĈÇÉÌÈĈÄÄĊÇÌÇÄÀÂÁÀÁÄÈĊĊĈżÈËÓ×ɽ¸żĈÊĠËÄÎÖËĈĈĊĊĊÄÂÁÂĊĈĈÇĊżÁĊĈÊÈÂĊÈÈĊÄĊÇÉÇÇÊĈÂÂÀş´şÀÇÈĈÊÔÉÁĈĈĈÂıÀĈÄÄÁÂÂÁÂÄĈĊÁĵ½ÀżÀĊÊËÎËĈÂÁÂÄÄÉÒĜÍÂÄĈÄÂÂÁżÁżÄĈÂÁÁ½ş½żÀÂÀżÀÁÂÁÀÁÄÇÇÄÁÀÂÂÄş·ħğÇĊÄÇÈÁÁÂÀşµĊÁÀÀÀÁÁÁÂÄĈĈÀĵ¸ĵÂÀÊÂÁÂÂÀÂÊÏÇÂÀÂżşĵÁÁÁÂÂÁż½ÁÁĵşĵÀ½ğşı½şışğ·¸żżżÀÁÀż½ıı¸ğ½żÀÂÀżÀğ³ĥÂşğżÀÂÀżÀÀÀÁĵğĵÂÀş·´Żĥ½ş·½ÁÂĈı­µ·ıığÀÂÀÁÂğÁÁğ¸şş¸¸şşğĵı²¸ĵ½½½ÀÀ½ş¸¸¸·ĵ½ğşğżÁ½Á½ĵğ½ğşşĵÁż½½Áż½ĵğĵ½ğğğĵĈ²Ÿ§Ğ²°Ş´ğÁÁş·ĥĥĥĥĥşżÁżżÀıĽżżżğıışğĵĵĵşşĵ½½ĵğı¸·´ĥ·¸½ğşĊÀżżżż½ğğğ½½ğÁÇÄÀĵµğ½½şĥşż½ş¸µ·ı²ı²ĴĤ³şż½ğı·ĥµ°¸Áğğ½ğıÁÀÀÀÄżĵşşğĵż½ĵ½ĵş·´ĥ¸¸ışğÁżÉĊÁżżÀÁÀ½ĵĵÂÉÉÂżğµ·ığĵĵÁż¸²­³ğÁ½ğ¸ĥĥ·şÁÉÂżż½ĵğşıışşğıÀĊÂÀż½ğğĵÀğ½Àżż½ĵĵĵ¸·¸ıĵżżÀÁÉĈÂÁÁżşÂÈÇÈÈż´ĥĥĥ¸ğÀÀ𸸽żÀÀżÀğ·ğÁĊÂÀĵğżÂĈĊÈÉÄÄÄĊĊĈȽğÁÂÄĊÀżżżÀÀżżżÀÁÁż½ĵğĵ½½ÂÁÂĈÁÀÁÁÀ½ÀĈËş´Žsz„“Ĥ·³·ğÀÂÀÀÂÄÇĈĈÇÄÁşĵÇÒÏÍÎÈĊÇÉÊÌÎÑËÈÇÇÄÀ½ÁÁÉĈÂÀÄĊżÀÁÁÀÁÂÂÂÁż½ğĈÁÀÁÂÄÄÄÄÂÁÂğıĥĵżışşĤl3)37Y‹°Àğğ½ÁÁÀÄĈĈÈËËÈÇÇÇÈÎ×ÑÏÏÏÍÌÓÒÔÙĜÔÒÔÊĊżÀĈËÌĊÁÂÂÁÁĊÇĊÄĊÂÁÀżÀÁĈÈÄÄĈÈÊÈĊÈÉÁ½ğı·µ·ħ§¤ …M %g°Çşğ½żÂÇÇÇÇÌÒÍÌÏĠĠÒÒÒÒÔÚĠĠÖĜÖÔ×ÜŬÖÒÍÊÇÀżĊÌĠÌÂÂÂÁĈÊËÉÉËÉÇÂÁÄĊÁĊÉĈĈĈÇÉÌÓËÄĈÇÁğııµ³³œ‡‚†g9"-sµĊĵşğĵżÄËÍÊÈÍÓÒÒÑĠÙÖÔÔÖÙŬŬŬÜÚ×ĠĜßá×ÌÉÉÂÁÇËÌÄżÂÄÈÍËÌÎÊÇĈĈĊÄĊĈÉÈÉÊÌÏÔËÈÇÉÀışıĴ‘qa\J7=†ĵÀ½ğğı½ÉÔ×ÍĈËÒŬÙÑÑ×ÛÙÙÚÜŜàáŜÛÚÚßßÓÈÊÊÈÈÇÈĊÂÀÀÂÄĊÄĊÇÌÏÌÌÌÍÎÉĊĈĈĈÈËÊÊÌÏÖÎÍÎÍÇżĥş½ĈÀŒvbO<*?‹żĊÀż½½ÁÉÖĠËÈÊÒàÙÖĠÖÖÖ×ÙÚáâäçàŬÜÜßÛÉÌÉÉÎÂğ½ÁÄĊĈÉËÍËÉĈÊÏÉÇĈÄÄĈÈÊÊÊÉÊËÈÈÉÌÉż·¸ıŸŠslfV8$$B„ğĊÂĊżÂĊÉÑÔÇÇÓŜÛÛßĜĠÒĠ×ÙÛßċĉâŜßàŜŜĜÉÉÌÍÒÉĈÁğ¸ĵÀÂÄĈÇÉÊÉÈĈÄÄÄÂÇÊÉÈÈÈÈÇĊÁÂĊ½ıżÀœmV\ZV_D '(=†ĵÄżÂĈËÉÉËÍĈÌÜċßÜÛÙ×Ö×ĜĜÛŜŜÜÜŜÜÚĜÒÍÊËÌÌżĵışżĈĈÇÈĊÄÂĵğÀÂżÄÉÈĊÁÀÇËĈÀż½ğğĊ¸DL]]giC&"UĦ½ıżÄÊÎÈÄÇÈËÑÓĠ×ĠÓÖÙĜ×ÙÜÛÛÙ×××ĜÙÚ×ÔÓÏÊËÊÀż½ğş¸ÉĈÄÁżżÁÂÄżżÁÄÂÁÁÁĵĵÁÁÁÀÂÀ½şşıЁ\kpl{xH#!qµż·ĵÍÊĊżÁÂĊÈËÎÑÑÓÖĠÒÑÑÑÑÑÑÒÓĠ×ĜÚĠÓÓÌÈɽĵğşşı½ÄÀĵ½żÀÁÂÄĊÀżżżżÁżğĵĵğĵı·żÀ½ğ·Ż§‘€~wq†H %€¸şĵÁÌËĊÄżĵÁĊÈËÊÇÌĠÏÍÌÊÊÉÉÊÌÍÏÓÖÚß×ÎÍÌÊËşı·şğĵĵĊ½¸şżĊÁÀÁÁÀżżğ¸şı¸¸şĵğşı½ÂÀżÀÀ³Ğİ’w€†{~h98„ĥÁ¸ışĵ½ÀışĵżÂÇÉĈÂĊĈÈÇÄÂÁÂÄÇÊĠà×ËĊÇÉÊ˸·····¸½½·¸¸şżżÁÀĵı·µ²°­²¸ĵğşĵÁÄÂÀÁÄĥİħħŽsˆ•‹Z4B‹şıĥ´ħ°´Ğ§´ĵÁÊÄş­ıżĈżÀ²´ÁĊĊĊÇż´ğÀĈĈÄĥĥĥĥ²Ğħ··´µıış½Àżĵıĥµµĥ³°Ż³ı½ğ½ÁÈËĈÏ· ž³´|Šš˜‡Y(!(@¸ĵĥµŻ­¨˘ħ¸½ĈÉĵݨ¸ÄÄżÀğ²Ĵ·Ĉĵ§´´·ĵĈÂĥ·³²°Ż³²²³µ¸ĵżÁÄÁĵş¸·ĥ·¸¸¸¸¸ığĵ½żÁĈÎĦˆ£ÁށpŠ}S'$ C•¸·µ´´µµ·ż½½½½ÇÎÇĈĈÁÀÈÌÄÀĵş½żÁıµ½½ÀĊĈżşĥ²²´·ĥ³ĥ¸¸ÀÇÈÇÀ½ğı¸¸¸ışğ½żÀĵĵğż½£‡šıĈ§ocy€‚|V.M›ĵĵĥ·ııÁÈÎÌÉĊÀÎÙÌÍÏÑÓÇĵĵÀÁÄÇÇÉÍÇÄĈÇÉÉĈÄĵ·ı·¸ı···şĵ½ÁÈÎÄÁĵşğğşğ½żÄÇÄÂÀ½½żĞ„„´Éǟgc}‡ŠQ'QœğĥıĵżË×ĠÏÌÉÍĠÚÛ×ÔÙââ×ÍÀżÂËÌÙÔÏÏÒÑĈÂÉËıÁż½ğğ·µ´¸şğĵÄÁ½ĵÁşÁÄÇÇÄżÂĊËğŒ~£Ċż”dk†’vE% #YœżşµıżĊÊÓÜÒÈÊÔÚÚÚÛŬàċáŬ×ÊÌÂÑ×ĜÜÙÖÙÛÖÒÓÄÊÄ𸴴¸şĥşÎÊÂÂÁÀżĊĈÊÄÀÀÇÌĊœ}—Àµ‹h}‰„Œ{F!3tĥĥıÁÊËÍÎÍÌÓÛÛÙÚÜŬâáŜßÜÙÖÒÑ×âŜÜÜÜŬÚĜÛßÛÛÛĊËÊÇÄÀĵ´¸şħĥĵÂÍÌĈÂÂÂÂÄż½żÁ¨…ĥͲ‡fz…z_4!K–ğĥışÌÎÊÌÏÔĠ×ÚŬßŜŜßáßŬÜÙÙàâáààŜŬÛŜäéċäâÈÎÒÍÊÈÁ¸żĊµĞ¸ÄÌÒĈğĈÏÌÂÁÀÀÂş¸²­ÂÀ€e{Žƒj?###Rœĥ¸¸½ÁĈÎÔÎÄÊÖÉÔáċêĜßàààßßàċĉäéàßŜßäĉçÉÏÒÓÓÎÈÀĊÍĈÄĥ³ÄÑ̽ĈÌÎÉÂÄ𠐭Äğ½ÁŞydw~mA!$EŒĥĵşÂÇÇÚÍğşÑÚ×ÛâçßŬŬßàáááâäĉçäääâáßŜáĉċâáÈÌĜÚÙ×ÉËÌÍÎĈÀÉÊÀÀÑÓËÊÈĈĈÇĈżÂµ˘ĤğĊ½½ÁĤtdsyxg@ ?€ĥĵ½ÁÇÎÖÏÌĊáßÜŜÙÏÙààâĉââááâäċâàŜáäâßÖßèŜÜÒÎÍÖ×ĠÑÏÏÑÉżÇËÈÇĈËÑÇż¸³§´ş½Ĉ½şÄǟnizwp_7D½żĵşıĊÓÒ×áÜÛÛÜŜÜÏÜçäèâáâßŬàâċèäàáââáßÚáêâÚÓÑÒ×àÛĠÔĠÓËÂÁżżżÁĊÊÎʽ­¤§ĥĈż½ĵĵ½™dh~…n4PĦżıŻÔÖÜéêßÚŬßŬÙŬàèçáŬŜáàŬäçĉċááááĉäââäŬÙÓÚßċïÙ×ÜÛÎĈĵ·ħ·żĊÀĊ |—ž¨Ş˘ĴĞŻ¸Ÿji†•P,*jİĵÁÔċàßàŬÜàĉâáàáċßÛÜŬŬŜáċíĉâäĉáÛŬŬßâċċâáäċàŬÙŬâäċáÚÙÜÛÎĈĵıżÂĵ¸ğ´‹^hrtx|™²¤‡‡Ž‚iI+C…³ĊżĊĊĊĊÔäçßŬŜßĉäàÙŬċâáŜÛÚÙÙÚàíâÙàċàŜŬŬááâĉċäâċáßÜŜßßßÜÙÙ×ÌĈÂÀżşĥµ²š‰€nutt}~‚ž°˜€‰’ƒwP& N‘ĥÁÂÉÑÏÒÚÜŜàèäàßŜßáäíêÚÔÖÑÑĠĜÚÜÚ××ÜŜßááċĉċäċäċßÜÚÚŬŜáŬ×ÑÊżÁĊÄ¸ğŻ–“Ĥ¸ĴĴ°Ĵݳ°µħ‡r”˘rG&#!N“´ÁÈÈÌÒÓÑĠÙŜċíìáÛĜÛâĉċééÜÖÒÊÉÍÈÈÏĜÒÎ×ÜßŜàâáàċèèäáŜÜÛÜŜáà×ËÇÄÁÁşĵħ“€ÀÉÁĈÊÇĊĊż¨†„”ˆuO(V›·½ĈÈÍÓĠ×ÛßçĉâÙÌ×àçĉäßÛÚÏĊÁÀ¨šĤıÍÒ×ÜŬààĜŬáâäáßŜŜŬÜÙÒÍÉĈÄż½ığzгÁ··ı½ĈÂĵş½§w}{ŠŠT#b¤¸ıżĈÎ×áŬŜááàŜÜÛÜŜáääâŬÜÖÎĨ“wiv„ ĊĜÓĜŜâßßàßŜŜâáÙÛàŬ×ÑÉĊÄÁż½ğş½Ĉ˘jrı···ğğı·ş¤ur†–•„T%!fİĵ¸ĵĊÇÊÎÑĜÚÓÛàâàßŜŬÜĜÛĉäŬÚŬÖ¸Š]dŠ…YI“ÍÔÚàáàäŜĜÚŜŬĠËÔŬÙÌÁÂÁÁ½ğşıÄÁˆZ{ş´ı¸µ´´´µıĞ›œ™—ށW*%fİżĵğÀÉÊÇÈÈËÌĠäáßßŬŜßßàŬı{s޽w%D›ÄÔÖäĉßäÛÖÓĠĠÍÈÊÒĠÈżÂĊÁğıĥ´ĊğqK}ĥ¸ş²Ĥ°µĥıżµĴ˘•‰…wN&$(%g§ğµ¸½ÄÄĊÁżËÔàċäâßÙÓÔÖàÙµŽž£¨²Á¨I^µÎĠÜäââÖÎËÉÇĊÂÂĈÉÄżÇÂĵıĥ²Ż²Şd@|ĥ·ğ𸷷ı·ş´ĦŽ‘“…{iM.$/"!h§ıµĥğĵÀÂĊÈÏ×áċâäçÜÖÒÏÍÒÒ´„‡Ğı–š¸·c:”ÇÓÖßâÜÒĈÇÈż···şĵÀÂĵÀÂğĥĥğşšm?8:LS\c\]ZXVWOXe\`bYVmcDGJHOdkiigb[w£µÀş½ÔŬÖÔÔÑÑ̳‰c8(5D)I½ÇĵÊ×àŜÏÁĈovxxxzzwlqs}‰ˆ…†’ ›—’‰…~‹—Š‚…’ŽŽ”––›Ğ‰ˆ•’˜£ žžŸœŻ¸ÇÌÑ×ÚÚÜÙËÄİhG4 #V‹µğşĊÎÖçÛĠÈÁş´ŻŻ°ħ´³³Ż¨²şĥµ³¸ÁÊÉÂÀ½ğğşşğ¸··ıĵÄş³¸ığżÀżğ·³¸·²ığ½żÀÀÀÏÎĜÜĜÛßÛÑÊĊÀĴ›‰N"$;]šşÀ¸·şÍ×ÛàÛŬÜÓÌÉÉÄżÁÄÄÂÁÁÄĊÉĈĊĈÊÉĈĊÄĊÇÄĵ²ğÂÀ½ğÀÂğĵÁÁĵş·Ż·ğ·şżÁĊ½ÊÒ×ßŬŜââÚÔÍĈĥĥÌÂĦ}qŒĦıĵĵÀĊÌÓÖÙŜßáßÖÌĊż¸´ĥĵ½şµığĵÊÍÂĵÂÈĊÁżÂÁÀ¸Żµ···¸ş½½ğğ½ÂÀ½ĵ¸´°ħµ¸ş½żÁÄĊĈÈÌÔ×ÛáĉßŬ×ÑÌÉÈÈËÌĊĵÀı·ËÍÍÏÒĠĜââÛĠÇşµ³¸ĵĵş¸½½ÁĈÄÂÄÉÊÀÁ½¸¸¸ıışğğğ½ÀÈÈÀĵıĥ²ĥşżÀÂĈÊÏÎÎÑÓ×ÛŜâáàßÛÖÓÒÎÊĈĊÍÏÉĈÁÉÎÓ×ÒÑÒĠĜâàÛÖÒĈĵşµ¸ğ½ÀÇÍÉÇĈĈÇÇÈÉÇÄÄĊÈÑÌÁĵ½½ÀĊÇĊĈĵı³ıÀÄÄĈÊÑÚÒÌÓ×ÜâĉĉáßßáŜÜÚÙÚÔÏĈÂÒÙÓÍÔÜÚÛßÙÔÔÔĠŜÚĜÖÖÏÇÀµ³ıÀÇÍÔÚÔÏÍÌÌÍÉĊĈĈÊÒâÚĈÁÄÇÂÄĈÇÉÄÀÁÀÂÁş¸ÁÈÊÊËÎÔ×ÔÑÖÜßáäâáàßßßàŬÜÚ×ÖÏÈÓÛÙÜàÛÚßáŜÙÖĠÑâäßÜÚÚÛÛÑÈÂÁÁÈÏĠàÛÓĠĠĠÔÓÒÍËÊÌÏĜäÛÓÎÇÈÈÉÉÊÇĊÈÌÈÀÀĈÍĊżÁÍÔÒÓÔĠÙĜÖÜŜàäâáâßŬàâàŜÜÛßÚÏÔÚÜÛŬÜÚÛÜÙĜÚÙĠäçâŜÚŜáĜÒÑÑÖÛŜŬÚĜÜŬĜÖ×ÙÙÓÎÔÙÛĜÙÙÉĈÎÖÍÇĈÉÎÉĈÇÎÙĠÊÇÏĠĜÛâßŜäâàäâàŬßààááàßŜÜÛÚÛÜŬŬÜÚÙÙÓÑÖÙ×çêèáÜßáÚÒÚŬŬÚÔÛŬŜààŬÜÛÚÛßċÚÔĠÙŬÛŬŬÙÒÊÏÒÓÎÊËÍÑËÈĊÇŜŜÑÒÒÑÏĠÛìêàáâċċĉßŬäâààâáàßÜâċŜßàÜÚÙĜÖÓĠÛ×ĉéêâââáßÜÛÜŬßÜÚŬŜßââßŜŜŜŬáèàŬÜÛŜÚ×ĠÎÌÎÔ×ÑÎÒÖÌÇÂÌĠ×ÛÛĜ×ĜÙßèâàßßáâäâáâĉâááààáċċĉèáàŜÜÛÛÛÚÙÚ×ĉĉääáàááàßŬàäÜÜàââäċċäâßŬÙĜÍĵÈÊËÖŬ×ÔÖÚ×ÖÑÍĈÊÒ×ŜßŜÜÛßäâ×ÒÛàâááâââààßßàáċĉéĉäââáßàÚ×ÚÙĠàâċäâèçċċĉàâċâááċèèäĉèáßŜŬÙÒÉÀĊÊÏÔÙßßŜÚĜĜ×ÖĠÓÎÑ×ÜŜŜÛĜŜĉàÛ×ÙŜâŬÜĉáßŜßàâäċċäääĉċċĠÑÓÓÒÜċâçéċċċääċĉäèèéíêääĉáŜŬÜÛĠÑÈĠ×ÚÜŜßáàÜÙĠĜċßÔÒĠÛâáÛÛßââáàŬàċééäâáááäċäċċċäääàŬàáĠÌÒáââââäĉâáâäääääĉéèêëèçççàâàĜÑĈÈÒÙààÜÜÜÜŜÔÑÙßáÛĜÚÛċâààâċâċċâçëéċáĉäââäâààááâċäàÜĜÖÔÏÑÏäââáâçÜÓßäĉċäääċĉĉĉĉçèêéċääċĉĉàÓĊÀÊßċŬĜĠÑĠŜáŬÜÜŬŬàâĉàâċáèîĉäéçâèßàáâŜÜÚÚÜŜààÙÔÑÍËÉÉÊÊċáŜÛŬâàßàáäéèċċċĉéċċèäáääääĉäÛÏÄÌŬçßĠÍÄÁÏÙßáßßàáŜŬáäääáäéĉċäĉäâàŜŜßàáâßŜÙÒÔÖ×ÙÖÓÏÎÉĈÁĊ aDÄV^@@gamera-3.3.3/tests/data/malformed.xml0000644000076500000000000000253110714675716016524 0ustar chriswheel 368.0 0.695652173913 129.0 0.736434108527 0.136039402174 0.197896975425 0.0424556874833 0.146643276094 0.0595990667957 0.0166513873378 0.0249483684912 0.0190762410872 0.0459351203709 16.0 0.5625 0.565217391304 4.0 3.0 2.0 0.0 1.0 0.0 5.0 5.0 23.0 4.0 6.0 0.204081632653 2.0 1.0 2.0 0.0 0.95652173913 0.350543478261 gamera-3.3.3/tests/data/missing_attributes.xml0000644000076500000000000000577710714675716020514 0ustar chriswheel 4 2 10 2 1 3 10 6 11 5 12 4 12 3 14 2 14 2 14 2 14 2 13 11 5 6 2 4 4 4 5 3 5 3 6 2 4 3 7 2 4 3 7 2 4 3 7 2 4 3 7 3 3 3 7 3 3 3 7 3 2 5 6 3 2 5 5 12 3 5 1 0 368.0 0.695652173913 129.0 0.736434108527 0.136039402174 0.197896975425 0.0424556874833 0.146643276094 0.0595990667957 0.0166513873378 0.0249483684912 0.0190762410872 0.0459351203709 16.0 0.5625 0.565217391304 4.0 3.0 2.0 0.0 1.0 0.0 5.0 5.0 23.0 4.0 6.0 0.204081632653 2.0 1.0 2.0 0.0 0.95652173913 0.350543478261 0.583333333333 0.333333333333 0.458333333333 0.583333333333 0.666666666667 0.583333333333 0.666666666667 0.583333333333 0.0 0.166666666667 0.0833333333333 0.0 0.0 0.0833333333333 0.583333333333 0.75 0.666666666667 0.5 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.166666666667 0.166666666667 0.333333333333 0.333333333333 0.5 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.0 0.333333333333 0.666666666667 0.166666666667 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.5 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.5 0.5 0.833333333333 1.0 -10.9609317329 -11.4037976615 -23.7894077791 -28.7511132655 4.00651345523 -1.14420984484 -10.8337454499 -29.3731661068 0.601720802971 3.53280891856 -7.40156561763 -16.6784715073 -2.89030857187 -2.5698717146 -18.9949628578 -18.8112559023 2.71579153863 2.93461587631 -4.18827952752 -8.93343647929 -0.155401642892 -1.86929713202 -2.74609118324 -12.0653366364 -0.436920829993 0.397047067055 gamera-3.3.3/tests/data/OneBit_generic.png0000644000076500000000000000065211167407101017400 0ustar chriswheel‰PNG  IHDRFd1{ pHYsêe¤\IDAT(‘ÓÍJ1 à”Y˜ËB}Ħ>ˆ0ŻċAhaŽûÊ,{1ĴxZĜKĊژ¤?+î¸8§–6i’äo0Àv™*\tSš²jB×µÜ7ùÛĤpŬ·çJ'mšr%qĤĵ"t]+kkڜéˆ-—Cn9ÏİIGyÑÓĝ•YQ1<+èĠ×À µZlŜ–ú9~˘ÔTaĜ*s뙕Ş-²âˆPsU0ñFħüĵNĴeÚ{Evöe×ٝ/'•ğ~Şìĉ“ÔşÊ‰Ô׊8F}bWş,‰öù§lUŝ%l2ES‚ı$§İH]át͏ò§pċÊżŬ÷BúJ™Äŝl)IENDB`‚gamera-3.3.3/tests/data/OneBit_generic.tiff0000644000076500000000000000204610714675716017563 0ustar chriswheelII*Œ?ü˙˙€˙˙à?üŝ?€Ààĝĝüüüü|x|||ĝĝ <àxàÀ>ĝ€ŝü€ĝŝ~à˙?€ó˙àó˙€ŝóŝüxü?ĝ˙˙àßÀ?À>?€x€p˙˙˙ŝŝŝŝŝŝŝŝŝŝ˙˙˙˙€˙€˙€˙€à˙Àà˙àà˙àà˙ààÀ?ĝp?ü8àüÀ˙à€€˙‡€˙ï?˙üŝ˙˙?ĝ˙˙˙?˙˙˙à˙˙˙€˙˙ŝ˙˙ĝ˙À<x`àà€?ĝ˙˙À˙ü Fd„gamera-3.3.3/tests/data/reading_order.png0000644000076500000000000000312311556750304017334 0ustar chriswheel‰PNG  IHDRŭu(µRµ pHYsêe¤IDATxœíŬ1#ÇEÑñ ´$íà 8T ÀNä¤ÌCÙìAâ܄YOÀĴûÇżßğ?~Ôßà˙                            îż€Żï@Ŭ§ŝùÜÏì™ŝġ×'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ŬÇ~fßäì|Ġ“˜ëê> ĥÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ=uWâ·ó ?_|Àӗ=fŸxġżż~íOßZXŒV#€À`0XŒV#€À`0XŒV#€À`0XŒV#€À`0XŒV#€À`0XŒVO˙ëñ·^ĵpx7ÀÜppÀÀmG·ÜppÀÀmG·ÜppÀÀmG·Üpp›ğÏŜŝÎÜÛßZ8XŒV#€À`0XŒV#€À`0XŒV#€À`0XŒV#€À`0XŒV#€À`0XŒlhxG·ÜppÀÀmG·ÜppÀÀmG·ÜppÀÀmG·ÜppÀÀmG·ÜppÀÀmG·ÜfC,àí·”G+€À `°ĴF+€À `°ĴF+€À `°ĴF+€À `°ĴF+€À `°ĴF+€Ñ·~öñŸĝ6Ĵà×ÌÀÛPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP÷1šŻ?`öi€·ƒĴF+€À `°ĴF+€À `°ĴF+€À `°ĴF+€À `°ĴF+€À `°ĴF^&5ĝu³ĥÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ=µĦy>€şOü|îgöLOA                                î_ġ$ĉ:€şOĵmuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuOmh~;úóĊ<=˜}àĠ[Êż~íOAV#€À`0XŒV#€À`0XŒV#€À`0XŒV#€À`0XŒV#€À`0XŒV#€Ġ ĝùÚÇ?àëĊ # ÀŻûvÀÛPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP÷1šŻ?`öi€·ƒĴF+€À `°ĴF+€À `°ĴF+€À `°ĴF+€À `°ĴF+€À `°ĴFŜ†µúúëóc64_/~<ÀìŬ˙8o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Ŭ˙ÙM¸£Ä¤IENDB`‚gamera-3.3.3/tests/data/reading_order_2.png0000644000076500000000000000316711556750304017565 0ustar chriswheel‰PNG  IHDRŭe+cP. pHYsêe¤)IDATxœíÛ1Ž[GDQMäPKÒòĵ­ĵïB;°f?A*=6żÊ¤Ïż˙ ˜u}ĝëħûüĦŭ‡´h @;€víÚ´h @;€víÚ´hî+àġƒġPîé\ĝ7ğ¤?ß>”h @;€víÚ´h @;€víÚ´h @;€víÚ´h @;€víÚ´›€×ö&fÛӍ€^Û/´íé@;€víÚ´h @;€víÚ´h @;€víÚ´ğèÄÇyΗ;pġe€ÔÓî}gî[À§ûpġ?€@ H„R!€@ H„R!€@ H„R!€@ H„R!€@ H„R!€@ ġt€×;O\ py#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€mîJ\ xĝ;s#€@ H„R!€@ H„R!€@ H„R!€@ H„R!€@ H„R!€@ ġt€CÀċŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥŒĥÙ\ xĝ-%À H„R!€@ H„R!€@ H„R!€@ H„R!€@ H„R!€@ H=Ŭ†àpy#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m#€m64×~K 0H„R!€@ H„R!€@ H„R!€@ H„R!€@ H„R!€@ H„žp‚rç^~@j7€víÚ´h @;€víÚ´h @;€víÚ´h @;€víÚ´h @;€vmh.ïêċ´›€{o)/ïê1èċ´h @;€víÚ´h @;€víÚ´h @;€víÚ´h @;€víÚ=ൽ‰Ùöt# ×ö m{:À @;€víÚ´h @;€víÚ´h @;€víÚ´h @;€víÚ´hîpCó>eıġ£ßŜž÷ÓüĞ›·n)ß'wcŝŝöáÏ 5€Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0Ĝ0şpëĉċí9·>`ôĦĝĊ€˙\íÚ´h @;€víÚ´h @;€víÚ´h @;€víÚ´h @;€ví~Ġ†ĉ{}sŝ—‹74‡€;M!ßûé§~÷ËÇ ß à0€8 à0€8 à0€8 à0€8 à0€8 à0€G<φ&}ñàÇŭooSġRɕñı(ü?ŝ·˙µĠĠ]ÜŬsÍ-j]/Ëüç?ŝëϏŸCûuİ2”" $;t üġ7ż~8Ŝ‰Ċò§_àŻO ‡Ñ_ßì^?Ĵ —ı™™Ö5ıáËÉ/ËċċÉ´g\zr´žÎŻ_§ß}È÷‡Ŝj§OŸ>rΉRÂĦÛ÷Żó0D "‘›E8DD8@oĠ$SŭËǧ˙ŭ˙üñbY=´ıëĴóËû[ùŭß½úí÷ßÜßߎ%DĞŭċÇ>ŝċy óéôċóu("‚‰ÑÍ\ó>sâœRoÊLµëżnĞĈŠÓáîîw˙ŝëĦç”1˘÷ŞĉóÒ˙òiŝÏϧ)†ŭ~š ‘œÎËÇ/Ë:Ïe,oßî>ĵÛ½żŸ2ĈA`?ĉ!q @@"d şĝüËżŭGx$Iß{ĝŬo~½;ܘ{=?˙òµ­Ŭ)‰–Ĥçyŭ§k¨ŞÀćq¸ßŝéŸŝ—íŭùó__>ŝTkí­;‰çñŬwßż~óĤaÉf†½÷öütžŻóíaúüĝ‰iĜŝóéĊ×§uIyúŭïŭġ‡o˙ŝĠçzzúĝ§oµ·îûğği*óċ ’’¤¤]×ëĊT“ qÊ̂ÄŜZ{çĊT)Qı™vwğğ‡ŭğ< ,LD]{b‘œÄ­#23ëĤu]kkÏŸúôó?Ġniş™pH’3 w³óea‡—óé8L`èµyëîA)ëµöC<€+CtˆÖ„ }Àž\siŬÌçïnÓûWP2—a&DN¸)'IÂAn€„ˆîáĉADĉ Şî¨ŞŞkU{|žk‡ ps3µÖ`YÚċ2 B` •B"½ġ^  < Ñ=Ĵ+!F@…ħ ïŜĵûĠ‡7w‡âÛŭ!˘ş‚oo’ہܝ„´{ĠzşĴáÀ‡Aîn§İ$íŜ‹ 2tL@LÄ „„„îĦŒÇŝxĵˆ×·‡wŻ_ğ A†T²j³µjFŒeíçıGÀR-Yˆ 1 p(ܵwNHáu]#Àˆ™‡aìç˵÷ÖÚ„ĜzŻÍjhŜŜîğaŸŠ·ş^ÎOżü\×Lh­]ûÚ{#"BÔs'"ĥn$¨µĥóÜ×Ú!pL‘ı#ôŜŬ]{Eˆ$’˜DŬA…P<ˆ-`žç/Ÿ?úüñ§—ÇÎ^îÇQHQ k?×Ëîd}usǑôeħ9ö=Eĉç L6ÏK¸é²t †˜öûáÀLèіş\ĉġË)DânĞù8äŜÚ0Ž”Z+!.kKäë²zx)<‘TŬL𠘃™Vġçk.‘ıs’]™2ġĞF Š0‹„[Êy<§áċÓgëÁĤ– spBZ֖‰¨$$&ˆx};ċÛwß~÷Ŭ4F03€’›m•¤µrĝĞÛħ{||ĵ.µŸ–ş4G&NB]9ħGœÎK—àè\hH˜ŽI)m§…éĠЇ˙ĈÌDûŬnœĈaÜŬŬI8u ìaáĉk÷óŞ”rĤÄÈ)í·7oÒ8Q*Jòw÷ֆaÔĥjo‘ĊÂÍL‰€$”sïĠT#Â"B­Ğvµq7|óîö8Ž™D[żžžë2KJ½w& ëêĉĤÀÛĦjŬğ2¸·yëڛ:ŒœJ┐™ZéLÖN9•QrA"3ED&B bssĠe]ŝô˙ü/˙ş˘î_O’“ı_j“Ìàîî5ğ=>ÍçeŻWö´žgì „ĥĥáxh, ˆÁ×ùLœŜ½{{ğgúÚëL­ĠTëûקǗËZĊúGb f9ì“Şj75Ğ×А>ĵy HfÎ  fĉ@KmkmnA„ĉaµû—sïFœC1óÓà˜|$ġp3 gDB†q¸ûĉ[)~ü §S›Ż­DôC(¤AâTp˙êöávàHDîĉĉ ËÚjĠ`A·ħ$mŭÓǗk'Èc‰‰çE/V ÇŬH82 ‹Ş²¤@waÁBŻî°”ÂÌD´ŭ9€·÷,²,Ër½‚ġşv­Ŭ‘Ò‡÷oöS8äôúÍ7÷7ݐ0 R)ŝXçı­Ğ{ [ôuç”$ç€àÄ@Âj΄„t­½5Ġˆ‡ÛŬÍnÜċ’ˆ´ĥş,€Ì­UŒ3w›™ÈT‘(• ­v­ŬĠ€ ™raf@"bF÷ĥ6k‹ŞPžŽ‡û‡~yŝç?=>­€H”’¸c[{ÍŻ `ÊPÜ4˘’Œ6eF˘œLµĠ á‘svµċ|>üx}ü˘à|?!ç<Œeڕi˘Ŝš&R3SµùÚk-cN)C_"Oğp3ĉ”Ä=̂%q*ħ‘6í$!€7$–œvû<‰ùĴXĞΗ5"†9@¨0IÎeš8%`J9÷Ö"‘İ[8 ĤrwÜċÄnÀÁ"’’ “¤„´ş;c¸ö^×$LL4GD"FpÛ" 4ıı™vCI$èx}y^ÏgÂ3`Â0ws rïnĞq(ÖƒÄÑ…H(1İ™”â­iïR $„z=_Ÿoï˜IHMŸ_žüċg.”²8l\kÏàĜ›]Nk„q"5·jèœ #râ”ñy†îaŞNx ÍÍ8Àíä@D RDDÄ&A GDJ~ä°§çËzYğ>ŸÚËs‘2œS’2]{½Ô/ϧıöÌùŝfÜMy^ês}Xğ×fnµ#…vŸÏ§ù †D’:„0C€Y÷pÖÛġúĝϏ!4vÓ@ˆ’RŜíË´+YC™‰…D”ı×fÚ½£jT¸Œ‡;.šğğsJ"lĉ)Ë(‰· 5ĵÎ-'!&0!ĤX›=,×Kíq#q9g!4Eˆèm½ö8?2HHRĤqĜO”ˆ™|C„Éâŝ–onŽ·ûq˜ÙTÉÙĥ–ïîˆÀ"y8e5'wÇörşÜ=Ô\2ƒ@ĤDˆDu]—FĴŬʘîoöSĈ4@Óùôց #²0EŠĉĦfÖŬ˘_›V’$ $$YêéژҔ¤@p3À֛"ön½7Bp÷ċ|jË,B""Ŭüñċċ².ğ×#.k“)UĠVğŞċ3[çĥž×q—ܽÍŬ=„ÙÚ§8ĠÈahÁݰÈöÀˆnŽ´hxh×"D"D$"F‚ijó2µjó§g||˘ŜcŸˆ‰YX$" ‚öƒĵ˜^=Ü~xs[’´O§ëŸ~>ŭËž×Y’²°<_ôôtٍÏyżK6˜°vu3ÓŜçU/—óçZ/†FDá@„Ä"”!c!DÏÓÎ-- €™™‡ŜĉiÏ,îĤFĈ,ćŭ0Ž9Çq‡t8$> àXRÔċşĜÚû4•ùzµZo ÜíòëÛñ8B! ˆ™·ÛĵDD°Ĵ×ëüœó4 ‡IŠHJÓŝÀ~għۍÓ4ĉœ˘ ħ$f 7í-8Ż,Û½6m]BĠ‚ ˜0ÂU-‡áŝĉf’I Ż//şÎLäêê}ĜíxĜıY›g½,^µ­Şnnဠ̘‡Œ‰Ĵë6mÁmÍ@ÈzÏIXR›—T€nŞ]3¨êċêC$š/óÇϟò^XxžÛġR1v­Ğr"@ìÍĉç ܽ]ĞċIÀ‘„Q‹ŒoïûóâË îfáàĉˆ[cŬžYğ.ó‚ˆĤ% ӈLDÂLDĤ}żÛ÷)if$³Ç`×ÓewDwÇá›÷Żonê~7MƒˆÈ˜$žJv³íùÔëġ>sÍŝĵ$üiÚĈ ‰ÔuñVûġjëĴm]ÛJa@ŒÁ"œó0”œ81:°?L7÷ġş—“ÍWRr@âáî·ûWŻPĜŬŬĴ.ëùċ²?%%ä żÙ—,ĝréÜ ™Ġlڏ‡!_Ğ’ġ²T.(ĴV[ż,ññÙ÷eŭǜĈœĦ4ƒêH4@Òrž Ĵ‚èëË:ŸOñ0wûqp7É"̈¨]˘wó€íx„[xp*DÔğ“™i[k3SÌ)ÀMż~eLĞßwûğóúòԖëĈÉ,œTû<ëRuİn‚LB`ž$•œÂ<ï‡ŬŬĦ.µĞ€ zï½ġ¨&E gIˆ óÒ.ë: §Œı#5%骧ËËÒĉŬÍ@½/ĉUm]ZžRë:ŸWsM…ÛÚ­Y™{3R–’ÊŭÎö“Û:‚àÖ` BU{ëÖkSëJy(Ì ˘Jr¸½ @f>c´şş5œğk·ŜÔT‚Y’ [Öu‡½ğ™—$Żï÷˙sɉ˙ú?ĤuuààôiÙËËa>ËÇ_š*8‚‚GëjfIÔ,„#`7–q7ĉœrɁ,e’a7ìm:_úşñáŝáĉġ΢jaîjÚ:öÖRNR2è8 G4UġŜÇcı;,ëÚNçµ)â›Ûòú†.Wû·?_ÏU?ÚĞCĤÖôyn?uòëä„e?ĜŞà&%q˘ËéúòyíڏwR233K"â´0óËĵ\ç!!"„0Zw&Ad ·p&@433cáRÒ\uUGŒûndı~ùÜ./Œè.âfŜu}>1` `—Ä„Âäj êÀœö#îLJï>@˜u}úôiıœ ˆ4ÖӜ÷c\ğ_ BJċöĠĞéŝ™D]/ë %râj^Ğ’P7kMÍ<Â×sğ>ŻR¨-êêN˜É5À`ó4 EJN%^ßĜÓµĥµġ2›xFxD1GĞUĠ¸5].הċp³ˆp߸’¤"e4Óó²òÍ\÷˜;eâ @ÂH)EKRíˆ8ŽDä\ŝûïż5‹˙ç?_.½i×ȟÖßúħ(‡˜1ş`˜:F$$dB§LˆàÈ2îoL€„„Óŝp¸ğ7ís&b3Ġ×óĠz'ĉi7n´ŬÍ7ÖĥAI)甏%5ƒċZOçJ’9ç|ĜOûƒŭĝݝOz^míŽ/§ùŻOġps3 ™JĈa7µV@f´µŸŸ%§c~,D"’sÎhĉk—ùzı\€…Âşĥĥ¨‰y SGqSƒĝJ%ˆ1˜9‰yÚï‚ëóË:dSÒy=ù ½ )m„Ì×Ġ|³ǔ‡ĥY5ŞŜÍ=„İ÷ž$‘HD$óXN§Ö;!²° ÛÒ}U/Ŝ§}™nŜߎŬííáŝuŜí]j­½·\RDôŜzï,ÔÍz7bêŬŻ/5<ú˘$Xv"‰Â2ËŬq˙úx?•QPìî€;Ş—µĠ8çë"%Än°Ŭŭ:Żuí1_ç‡WwB@LˆîËùZvF̧ —‘FĈìÚŬ˜E" ˘w5sS#"&ŒWğ=”ĝíÛ,ĝoyy>µymŞñi™N SҁÚĦÀ‘a¤H {ˆ00qâT2IÎe(ÓÄݤŬ-• Y$ !äd]­·0³uİËu~yz*9û!"D˜Şš/×ëċċĊU‘küôĜ‚äŬƒdĦµy3ʐÇ!•œ‰Ŝ%q  CYzœĉġ§ÏˏOŭÔÊbm—Ò~(ğB2ĥĤM11ĵöċrŬßŜe_†a›Î­÷ÖúşÌ½ğ1;abOİ6]k'ts @"b €í‚YßPĝĤ XÄPU/_>­çSĦŬĜjĞ˚i(—4 yW$%"ÖŜ´µ^ëùċ²Î şSx)y‡<Œˆ`îyÚħ0,DİĤTÊ´ž}moóñv¸} 2H€ Dt÷֕KRw5c$ 4wuïç^—†İpž„™ Âôáf÷öîáÍí›Â9ÌażÓ77üÓ燵.§y܍̛° ˆ›_ħ,ËÒz,D´9ŝˆ„¸ÛH”ÖlZŻïž_v7ğ|s“†=7™BŬ 6¤á†7ûá~÷ŝğoîŝúËéÏ?~ùr]ĞĞËËBIŭ%·ÛR´ ,ĥ¸@˜ıdÄT¸Lá–sAÜĵrBFt· ĉ0sġşôZ÷ğ‰™ÑÁ4ş{]gĠ>dffb&XV{™Ûŭ13óÚB … ́™Y8ŭċi}:-/672 ˙|ħż×b&a_X,™ˆ­Ż6ġˆĠ[)d!í=ÜŬ]˜ÌCÔ*yuíj€ÀÄêÖZ_×e^ˆ‰Rħ¸0x;?ÓÚÉ#µ[½,²ğğnn†MGFDòĜ´5ŸOϟúëċñ)‘ïŽŻò0umĈ)•2Ĵׅ…sÓ0dëKï˜Ġ\UU1 " „D ˘š (jnjŞä­öÖtyZ"ï$—„nááàHŠoîŜŬ½I(ۀĤ$ŭŬŝŬ+•ˆ íéĵŜî˜ħ™zà8dbĤÑÍ´5b,9OӈDîF€àA% `Q%z#smAÔŬ÷"@LŜÜŬ XDX$İŞ™D)Üï^ß}˙íùçÏŭxùrnµƒ0!‚Py¸ğÙÓEŸ!1"•a˜vûñxğğ}He DĜjÀ#H$ÜŬşuíµĠuqÓRòĤì ’÷· /§a|¤S#á2$!aÂPcBb"ÌIĴıŞÇ_>]k뽃v1 D$2G"FWfĈÄRv޳ğ–’‘9"˜#€ˆÒ0„)RĞ+B€ˆì&ìu]{ג5Â7ĜjĤĉĉĉښÖÚÖ&éë™f€~Ċƒ„Éğ•aw{ójĜXŝ­ïüí7@§4L§ŭÏóù"%Ç#§äà9sÎ9s™†R$ CِĜëÜ3GÄZ{뺙àˆAUYÙŬÍ#"™l5€Y„Ğ·YKoqż;~˙Í·w‡|8Ĝ“’­q3xĝZkW=‡>%w‹RJ)'ßĤ"‚Gl“*F0Ѹïî^žOç—óŝ¸—”hÓW·@# `n‚½{¸ċœ`(RßßLżŝ;×9‰Gâ˜úó_\ώ.‰9IÊeÜíŽoòá&•AD6G'b‡ j­×ږµĠF) líoÎqNRĈ”SS38×n°5×iàŬL°ÔĥˆÌ <àĵèéÜç†7·;Ĩ îêfˆDsr"F(ı‹çÒúš„1,£›#1Äĉw$DW63 dIˆĦnı ‰œÌÂ= Ü1‘Ĵ7°RÌ£0&WEFĈñĝöíxĵMÓX†Ñ‰qğ:ħl”$ûÛğqÖD„ĈÁ# ™ˆ˜ó0”iÌ2äa$hkÂÌM›ö1@Ü <‚6îŽĤV]/ë°Ï,ĤĦ‹bhdÌßĝöĠa13BŠpD@‘tw,^AK×ÇÇ/(8Lı==>璉 ’Hm`“´"ÜĥcħÉħĤD"²?îçël­ğ9ŠwGGf!Ší€ {D1ü§Ĵ=4ÑÑĤÚ‘H˙ftgAÎİŒáîöĉĠÛŬíĞ@–”˜ÜÍŬcS§Tm]×땅sĝr3@t&’2¤œYÍ͢ĥ&‚$7CÀeîµBˆ –$ùıJNßĵ*OçúxÒ›¨ĈŒw{™ ċ„LIsš:Òf€iÜċœ™…X˜È ‘İ*3Ċ[À¤ÎWjğŬԗëĤżëšK"ÄíÌĥZ­Ġ’Y²ˆ ĥèD)Ç·ïoŜ•i@BD!@ĤPíf†Hˆ)b—ìi6†b€Ĥĉfy†i'˜ó0:@ħ( ; 13ĦRbiµŻlŽ`µum6?ŻyJœÉş{s(ƒ Ôx˙ĉġŭÍŻ‡–š"I)G)9•´Ì5ĞùċÓéċÌyJËr™/sÎ) ‡Ċġċ’Dö÷· áèàÛDh­r˜yœĤŭa½^Żç+nn8Qq÷M ĝÚü{ï[Ğ‹ĜĵiD¤”Îz@dwWӜS™&J2ŽÓÍí¸?Žû°„9ÑDDfA4u×Ŝëùâ½Ó×9€[2U³HXÒ ŠˆfÌRrJÊD@nánn‡Ŭ˜"`mú|n ˙üóÒ‚( )ĈŻv8&d&‘iJӁŬóċTM `:ìË~Ç9#o³…Uˆeƒ*ˆôĠŭçíñĊ ŠlaŜPU"ÒŜ{Ğ­,L’Ä*ğĞyĉÛ÷ûWod˜™‘8Âżú;Äî›E`îۋúÛû –<ÂŬH¤L7ŝ@yÜĠóĊ\!q uLŒİÚĈN @À=sryn”‰½ûò²„šŒÉĞġĠ˜iÜ'ˆŻoî˙ñ÷ż}}7EğĈ×ÄP!:E†[ÊÎ˗Íì|Yöğiw˜ ·öòürsw áán!Y6™Ğ÷^×µ­u7L)I)İŬ—>yô0I"‰s.€ˆfàˆ¸Ġ ³#q¸›‡p@uÛ¨|µ_½€´›ò´/0ħ b#llıŠş,ş,ÚÖqšXdv¸U…G8`U›Ĥ X6ÍĜÌşjíĤĥun× |Ìv›Çĥëà^ğ>>ÍKĠ>}yıžÏso=àë˜KBw{|uÈûi v¤äœ0Aĝöġëµ"îÇĵ›$%ßÊ âĞ˽QRb4‹'D)Ez‹aÌBÈL"‰X"ÜŬT{o]{O9C˜ġfŞXoßÜïßĵIÀL€áĝ•Ĝ‚0lıüzF·@"˜ù<ˆˆ2N÷C$ ïón€ħŞŸR# ¤„ˆà #‡vÊLˆ×s­s—"ëıy·ĴÌ4ùÓçµVsCƒvD IDATÀ`F"Ü ôáĠîí›ğœÂU!ċ}ıÚĵpJ‡‡;fŞË2?úe>Ŝ߄ğz¨Ş™·Öpû˘™x˜F$˘—óçǗڴw=Br÷ZğoİŬR2–’Ë–—ó€Ż})]9Ÿßż>{}ğßeWġıvs’1kàġiġġZĞ#ÑÚHrÉğ19i·yġqšàtj]#ĥTÉüĉ>}˙ŬĞ’0ò~’aâ$ˆ$HhŠL۝‡c n҄{lI·-@ˆ„¸ ™—Ğ›21şYkÍÌ6]ÜÛş B¸İuÊĞ÷ïÇ^D˜y+DŒ sĜ4fwt÷-¤K›RDnŽ€H°k"âœ]­­kóŠEĊˆŒNr<ìDÜ1d9ż¤aşı½ùx9/—şÌ+„û L‰ßî˙é˙áWŜv#B˜*mċâĤÖ"‚ˆD‘…§ŭÈòfıÎóu&˘u­§—SÊîĠCÎRR:żœ|Ñìpw&5uYÖem½û1€bÊ9 eĜ;bJ\†ÒZëóŞj/OÏÚúnÌğ]ıy¸Ĥ¤mĵĈ×ĜÑß Ô–)&DíʄáŒjFˆŞênıdÓ­ĥċċäf9§çşÙW1â?÷=ÖÚ~ürŭ—żœz¤˙éúĞ×Ożùîŝġë[ġ¸.=ˆÓ0F#]çŜ5R–qJ EèSE.ğ]~9]Ηjˆ’äĉ˜û÷÷oŜÜH%o ümÂnÎĥêÄ·ˆ €Í/Á !B @2‘äD€ÈĵGp"ÜH¤A¸÷Ĥë ཭­Ööôêŝn¸=:†zGߔ)ÜÀl˜ À|Û°‰Ĝ<[DgúŠám[tQġóumŞ9ѐ$‰xxksrJsPÏcuŜ>îFÜréˆ(ëġ]Kĉ<ċu^çç…˘; 1 ”oŜ|ó?ŭïż}w? ™Hq:T­Żµ_g½^Ûş°Ċp<ĤÛ[N")Q.¸Û_/×ui×ëĵœ/è3½uŻz‡µĠĠLĤQ{z|šç•Rᔉˆyӆ™‡}ÊıvÛ¤Ö-3 )ċa˜†1ğġó‹ġ>L;$Ú2ĤL¸e^1œ  ­+ o›€ˆäMÍ]µ§”SNKèM­÷ócNÂH€a_³Ïî°]1"C¤RĉŞçYŸ^ÚÓİŭ˙êÓn|zY`xuD`¤óĴޞsJBàöüÒ~yĴR3˙ùܚCá8Èß}sóĉ~âĸ@7G"2303ˆp30×pb"ß™@„H)AI""7d$qwB$٘( ıjĞKgÔVU{µP’Žòċċ¤¨ŬOÓ>‰‘{|%ê[$Ñ jïáfHH˜€rBĵÌË?˙Ǐ/Ğ›ŜßîûèZŬOÍN0|6”ĞĈği(IĥuEŒpiuíŬĉ:ĊzYë˘9Ĉ&äŭ°˙ío˙ŭ÷ß½ş?Ž%‹liŜ ¤p ííôtŝËÏëy>× zĵ:ܽúo隆’"•rN)soípğ ]—ĠÚkCŒ<ċY ·Cë6ŸŻ_O rw·GĤ-Uàŝ5KîL ŒSĠ o@ûŭ˜dïĤ½ĠӗG7e&Û*!öŜÛZŬÌ̙0 2Yë’ÊXĥuĵ@Ú>Ï#JJîîaˆ›]fj‘Ĥi7–Wǜϳĥî­ÁŸĵßíùû‡çÓ Äı¤"°ÎA)ċBuéîP ß2üòtá”Çӗùrnˆ€Pı=¤÷e?fDtĜZ lJzhïjÑôë2ŬÚk„³o†Èġëp'f"vM‘MT˙j‰™m^qou~yÑŜYŠ™µ§Şô˟˙\Áon§×Żnż{ŭî0RNL4äËàhĥ“np.Oϧóuµ*L%ßßL7Çiż›’ä—Kŭ˙~xİ!Ğ˘6 ›/Ï/§žìSH‰™‰üŬŭ~Ȃ  şÎµ­LĜÍE0…ÜŜŜŝúûż˙úġ›‡››^‰(܃8ÂĦ·µÎóùóǗŸ?ĥ=š05kvıĜq§IÜ QX¨@&NHeÈhĤu­ÏO§Ëç֘p^)•›‡ğŭa7%'ÙĜŒÛW†ğ‘tŻRŜ$¤ÖúXŠġJ„9‹pBżbPèM‰(ÀÍ|s zïnq3UÍ „›!‘ԭΗÓċîáöpĜm3ÎżÎ@ˆ –„šóñpĉoï>ĵùüüüÙ,Ìàt˙áˆO׎”“Ĝn,ğBu†”ä`ĞŬSĉċş>=ž{S@DI4fzó0 …âĵĴ9‰ @k½ÖÖşĠ֗jk÷îPJftDĜgÚÒĥıĵmx8ĝfná6Ĵ™ÙÜI’G¨)ݲ;nÚGD[–uınŞžW{ZíŞë˘švŠq…—ċ2Já8ŭêŬßŬ!%IDMŭóóüŻüċ‡Çk’46·ô\_.ßĵşys{<]ĉçs?7½ŝéËġËǓk}ŭ˘YIĈœĤ„ğ}ywÜĤ~}-ëĵ4wí­Íµ-MŜĵ˙íŻġáÍë·÷݆\"11"şŞ[ HÎĈ”’ˆ hkD”Jf5F ·mÇÌÜlËUE˜óŠoy?ŝòxşÓ~7ÜŜïwcÉ"$L˙)Êo‹XÜV €í´n֚~  ‰"‰)"şı0!`¸C†˙”ñ˙Ĥ†y†n7‘8Ĉ!'ĉ’„ĥ•e۞xÛÙܸĥ˜+—²ż9ĉĦÀÍ~üĠğŝôċş¸ıW‹OĥÛÏk?OH8މ)cU,}'LĝÇéiË&Mµı;ĊXĠZUU…UĤ†û:ġ\Dˆ˜‘0(D<‰éŬ‡ëßŭ7÷›ĵ2µÈŒ„îÌÔ 'bfBb5Wi@´şıN׿-uYöÛwïâaë|q‹ĠşÜ+5b˘­ĥ²4s0'5[–˜ĥëÁ‘ÁÜbŒ‰ \KQÀ!„^¸ ŜóaUĠşüİ*³¸j@·‹‹sQáRĴğÔúÀßa"4Pż Ò=ƒ Sì&pF[ÓÖ"¨¨Şmğ›ë<ĤL%Ŝ­‡Í™—Âëİ…c à>OĊ U †„µ) 9ĉHŸŸçşHÇÌ bÎáŝfġñv=Ĥ¨ĤçóRš(šCŒnŒiŒÌèà#)`Uìo¸9ħŞÍU¤-`€/P&ìN ‡È™ÉŬZkóù\Χe:‡İûrjŸž_f-yÍ ÄÌĠLĠ°İ?ˌ§/H¸ZoĈĠ†!­23úo>nßŬ_UĠ×İĵœêç×6ÏҚ[•s àêÔ´€‚ŠŠb 2rü§7·ûMlĤn†! !"…”orz÷ŝúŭŬŭ÷ßl†MŽħ ßîŭÈ(*ŽˆH@è-ZC„¸鞯7ĞÎPH9!˘‡ÀÑ !Ċ¨j`°œOÓëÉ1 › PPÓeY2şİŞ)88cd`S_ğĜ›Nĉ™ċbbudSÎħŸ>Íĵ.ĊDŝ!9ı;’ĵU5Ĵ{-у@]z›ÌÔŜžT-µ’#¸ğˆžOÓîĉjw3nV!IĦĥëÄäÖuu8äÄj&bÔs83óĠÖC"‡—ç•êfbĜïĈ÷÷D>O§İHµĤç*ݧâ/ċvÑÛëŭ1§„:G£KP‰Z­­,Ú$™‹ééxnKÚN¨ŠĤÖÄÌÌğœNKm/0˙‚OçÓfğ˙ŝŬ üùŻQ–ùŭ!ÜíSrQ{:Î˙˙__ŝëçÓtV0Ëìy… µ†ÖŬu7Ĉßġŭ>ǀàHTK‰Ä! "„şÌFá0 ğÍĝŭŬÇm^ tŬQß2…½žrr6°ġ@3vwU3Dş$î \ĦwË4/糔şÙmC^]ê \ĜÜÔ¸Ġ’R"3k€9! !Ô xˆ.b­VCd"p53PFÔ]TS3{}y‡ÌÈn„!E0!PàĦıÈŻf= è=GcĤfÖDZ•ĤҕĉċĉŭŬíûwyû’­ŞĦ=n!;ŜÁ€!ĦŠġ⛈#˘C(Ġ‰10şÙŻ_ĉÓİÔfĉ­Vé›÷‡÷·ÛÒêñµ4ƒân= 9ĤÈb™Ċ cY Ġ\z—ĉhîjnĉKµiiRe޲4(zjŽÀQ˜À;G›(‘2Ĝ|>›ŠúİÈqž”‰ °WèÜĵŠ51SW‘#àÒäç×óùµ!ċßßÜï†2ÏnĜÙf½ÚmĈ˘Šü?ŻÏ§£:^Ph„IwëûŸ˙ċ§‡1….Ç+ôR4xPNávµ]_ßÖûȑˆTċ<Í*ĠD[YĴ•9ëíĠ-Q`,EH$ÒÜ şàDBìYz3u·RµL“µĥÛïĈÍĥKǨ:Œƒ™‰špfʉÁ‹X ‘‰HE †ž?ĠĤŜÇŞŸê #ÄŝĜy˙ŜBàĵZ½<=KiĞÍj½ŬĵMTfŠ}ĉë6!ŞYÍ{×Ŝ^R@dRó8ĤïïŻnobÎĉ·2Q?ŝ3s !çHDHäĉ„ND1´Ìâĉf^Ğ­’75O é<úrŞĊÀ50ĈÄû]ğžÏġ<ÍH´Ê˜2-­}y7Ğ´sPT3#0—f­lĥۜğƒji ˘:}:ʲTF_­ĝéÜ˙ëÓ~½şŜ¤@ŞÒš ħö£-ŞÔ àÒdvúċyz™ÎͽZ—ġÍ/#:8¸˜Fb•Ç—§÷˘ó#ÓĈ7+ğäÑ OÌn÷§×óŸ˙ò|ÔĤn‚½LD ':l‡ß˙xó?˙ñfżîm÷=ÖëĠ…oş8 !÷×§-µµĥœÏŻŸÛ219…Pk-eRw$~Ëxwm;ĉ²™ykâf u^–inóĵ;ìW›MHĠШ2ó°Z—ÚdšÁ=Ĥ™ŞÚTÚ9¤Ä½0dj@Ŭ;uW7AàHˆ)2żĊ~Í´GkRòzóôĝw9 1¸‡DRfUéÇs3íġ#ëoW/|ĞH]–šb¸şş^ï·qÇġ:ĤÔ}B ŽŬBx“ß ½·’rNj0M­ ’!ƒ%îö#Fò2×ǧ:'S !eÇPUÏgEÀufG8ÎjçEšÑëÍ@Ġğ›’-óRÖ'ÛmVûu·_ç&˜šù\­QħŬ*Ĥ”‘ƒ;~zš~|ZÓïŜ­Ĵĥnpĵ½íäÀ€p.~Zި`İRO@˙÷żKŝMµˆE&Œôġġùóë—ŭv›C Ġè˘‡şWu&D7@‡„›ux¸ŝċÇëż{¸ÚmŬDúĤ'˘é²: ƒ‡aµ&$D-­MŻ/ç—ç:Ÿ—ùìnbÖ̗Z9ÄÍi‰)qŒ1@/ôQ½OÜ%ĜŽş/óŒ.çד‹nûa½ ħ KèàŽ Ŭ™˜TçÉK1VQp3€ıéŠzġ…ˆı˜Ŝä O9m7C Ħ˙Ep1M3†à€ó²‡pš‰ˆpZTµµÖï}wgB srWfÊCÜì×ÛĠzż1ô²Ş¤4¤DÖġyĤ jgŽož.y!ŻŞâÄ!%jM?Ï*"sY"µTmâf8g>ìóz¤T–ˆ(֚괈(TÁm½NMÁr0e—e1G-şÌĠrÀŻ/óÓkéğP×HxœŸ‘™#2µàĉ~ğÓ2Ċ’#3jĞä´öHZ,&Œ2cèî)÷LˆL°ġŒ5¸yĞĈ!zµvZÎÖCŠ€xYYÁ™88ÇÀL)’9Ĉțuĵ½ÊżùöÇĞĞíj³YBUEBFêkbwuşúj­fÊ˘ó´Ìs‘e^^żÖyŞ­5ÑêVU–ŞsĠœpğ‹î`*{î¤5C 1½ù{—¸@ĞĠj ”ĥ›a‰ ̌™!‚ı¤|pwcĉŝĤKmLÔj™QÇzn§;Zn D@¤ 1…@E{ŝf~9ŭò÷_Ö×{ç ŞŸ?}zy~‚ žÒ™™ĝÂ*ˆ)2S^Ċq³^­×!g Ç‘8f$ŽHH=Éb""şy7U—A:²?İHœ"ÇPĞ´ÚŸf˜OĊš‚kĞÚDDߒħ8Óŝ°‚@Eé4ËiR š\ÒvUĦ B óŒräó˘:Ûë$ûuÜĴâRä<ë´´yn&•˜ıĤ6cĵY‡Ÿ>ìüp•P+a?‹ş‰5—=ŸçZ"LCˆ1˜š‰µÖÔ½.ÍTĤYÎÓùéùċ°Úlw›ûĞÛëu7.{8ĉ²^„ùtRsdš]OġËë|:ê8Ĵ~óíß}¸½ğ[o60˜İˆ¸q@¤VµÌLÚr:Ċ÷W‡<=XKQwĠešj)n."Ë<Ÿ^OÓ´”Ú֛ġw?|{ûî.ç !037QwO9.sݵ&UG3Aä‘—ĤîĤpÑSi"Šh&B!¨ùé<}ŭòĝŭ;k¤/ĠˆÎĝm¸`ÚİnhÚBëÄëyŝËŻ/?OçÇÛ/ç?üp˙înżQË)^ Nóıê\ô2+1ë!0gSeĤĠz(ÍEĴÏĠêVĉĉn)%Î ÜÔkÑi’ehf&nâ^Ġ ŒlWñúvğñúj“SĴµ|~:N³'{9kmn˘RÊé ż_Ŭb1ev#냭toêڊ4q&s)ĈRH9şvê1 :˜Şş{ŒıySµaCk/üs}!&S“&HÀ‰ħŞ4×è¤îĜ£ELŒĉN‘PŬĤ<Öcyİ‘x=cH½ tqÚşÀÚÄ(âŝ8-__ë<ŭíŭ?˙öğïîvÛġ¸ßÄù@Hżwfċ|B÷< zĊ1 ’Ù…´1ŞZΨ=˜W‹ğçœë(ÇӄÄbŝùÓdŝí‡Nj°@h5F3sƒÖšôk[]UÜsg1PÀċüë~sĜ­Wc!ÄBàKíèIħVÏR[[–‹}#½dş‚‹ž6 IDATˆÒZNÔ Üééx.ËßŝĝÍġŭ]ħL‡Àˆän N9 +¨0"ÀóyÑì" ’šRĵd/½ ,Í^^OỚuF€óyŝüċñóçÇeİ×7×§—×Óv=FQíin73""d 7éĞ…9h­UZE·2O­5Ž!ŽûcNI¤ĵžŒ3ż”öï˙ù)0 ß§ž+eùüxZ–jf̔Ĉ!„p<–Z9Vٝœ[UU³@@CЉ}šÚñuiK‘Ĥ]ëËT·×Ż ¨ùnğÚnVÀLûíjٌ‡]L/§ú÷Ú¤Şı·y>żbÙò&i¤Có2CΑ/˜Y·ÎR77‚šHJCH)„Ó°ŬĴRŽZŒÈĊ´GÖÌÌÍC<¨­V9¸9r@P—"1Ebj*ääîÖTš˜ğ0ĥKtÓĠĴßw˘*êĈDé˘Ö[³V[í9KÑ.oYP€sm_^‹xŝÍoü·ß˙ĉ°[÷’İšJQ•KÄUÚù<żc·›Ğ”3€‹;]lv•ÖÏ%Ë<Ïó2ÏŻOb~}{óp7ĴÇBkŠuZ:ù@Z31"&FˆjĈè)`kz:ÏÂzûİ‘8qh"ëíÎ0>=ŝŭoŸkYĉıœĤı‰aW+,ó —Ž™‰ı1Q7ÁIZ“Z–óİL/e™Áµ{TM,ċ4*X>ĔͧıBbȎ Âħʟŝúùú°ŽC`s8NUÄ:C!ĉĴêÓÔBòf3.͑ħd°ab iġ|ĥÒ:!œİğԙĦßPNMŭo_ëvŭúŝáêöĉŞïŭĉ f~wğ¸~ùò8™`ݧJYNǐ֘÷Ì ĤbîD—û^Td™'•Ĉ|ıižçŻçe; éütµ= )ßìûŭzùv 3w{ġŠ—RU`…Ş’;VEP9päjÓıÖóR½£ ĵ‚9'1ġ.˜c)µÊâÍĉWˆ.Wƒĵ‘‰ÂıĥOÏKÓĝ›ßŝŸÔC_ô5ĉÀŒ eÑÖ^ŸžNOŻÓîújğßtŝôĉ¸ğ´˘b˘ ^}}zyy~Nc~¸żğşğénş‡È=ˆâ½<-:?Ÿ ĤĠfp3êJµˆİ¸6äÜÔOs!„!E "ŠSĴċnïnüîfYÊ<—4G!€J†ĜÌÈùíġğtˆ°Lóüú|ŝúež_ŬĠ›z;Ï­ŠçAĈò.)PŸ2ÀMÔĈNSĞOŻç›–™jkó\ À(ĘB-­–†ÖĞŒHµJëğ@`ÈCb‚İ-óìRŬĵ’(QLĤfŜß~H˘Uñż>-?|=żo9óŝUö”"3"z—$]̋eŽفBHŠCtDS•ZêùĜóòPšüütŝËëyorôo6W·ÛĞïnϧr<ÀÄÄ@Ì\ÔĴ3×Ö"$BW‘ħİŞYkrœŞ¨!ƒ#TíĜ4'& ĜC„À‚ÍÛK3Ğp³½Ž)wĉĤÙċ Dr׿ĵ: ?ŝÍżŭĤwÇúXîZK­Ër:•ırÌÄéĉÇĠz Ŭí&'löàRgÂÔZ˲œOç×§—Z[Èc’£‡‰™9 ›€ŞKkˆp>Ï_ż<Ŝ½ğs7ÓÖ. &Ñ2Í<òf³À­Ê´TO)šŞJE˘”@B„œÓ0fD’ _V ħ–Ċ¤y äà=ÁIm^–çǗż˙µ,gcPÀsÑcħ/NBÍH_Cz–ÍêñëI€B÷à‚2ˆ+âÓĵˆ(§ežU@âG@^Š˜ù˜iÈaZş·ĉnŽ1şùé\Ê.ÒÔHìtZÊÒ܉C¸,…†!•ŞKµÚLŬŬŬnnĥÛíÇЇu^›é˙ż˙-µ™B J)´*Ld͚‹ F$Kh괙'äà>0MŞêÍMM”ÜĠÁ…e ŭ‡hÈùáîîŬŬm޽%ào…W" ˙ßŝÛż;l×`.­™¨ĥy„q³9Üżëì^‚‘Vk‘]µVXĉYEÌ Ìĉİ6 0v˜†Ì„)§^ri€ëa½ßMçİ÷/E?iâ˲LÓ2Ÿ§i*yYzÏeÌ!Ĥ˜ë2·yé·V qˆ„ˆîœA•9 idŻ jt‘•ÔëéüòóϵÍPŬ_Ïġ?ùïS*µ™zm.bLóTӐÒjµÛCŽ–Šf`ĉ€<-Ë4|>/sw#RRQicŠÏ³#˘z €óRµ&_­Óz wĞo>Ö×ÛĠzLÀÌԁçy*Ë2ÏËy*g×iı9Œ]ïÖ.Ċ7Ûñw?=<ÜĴŝúóÓ/_Ĥİ@LĵÉp5™PÈf?Œ+DTUiġüò˘"ĉ bÏsù˗ç < cl“üüËwwÏğÍ&‡|µŜ|ûŝöe>Â_ i‰‘A,3;4ó˘™(á¤dP+ĝ ›hU­MşéDùħˆ`Ŭë£~ŠœnŻżûĝ~ğZġ˜À׏ŜÎáß~÷Ӑ‚ĠRÊéu~= Ğq{}‡!ĉÄ˙Àû?ŠRk#f$ŞN§išf—ÖD4o77ï÷ëícÎż×cĥ)%ĴŞf ÂîÚż”úüĝ4 CŒ^Í̛Èù/Ó$ŞH\š~}]Œ‘‡`}_FİßVfښ”’…ↇyÒ²!ŞbÇEŠ˜Ş50$€ŒÈÄà†D—‡§ğòîŜżô·%‚†~•…ÛĞĞû§ß~˙a=ŽáÒ@ı$4şîÑó$áùó-v·7Ûŭ.ĤôFutpsk˘˘Ú¤.ÖÒóöÔ×çñxŜ^íß÷M‡~÷Zˆ À›h v£˙ߝ c‡&­˙bJ î_>Í_žDT͖R1ĉëwûŭÍurÇԙ:!ĉĈ1uó·ß bf‘³ŞeF dH$×ğZÚéùùôz:żĵëu$r µV§s“ÚQ@DW#ŜĴq{ğ˙Ŭ÷7óëj‡*˙ûóÓR–ù|Ĉ!ÇeîĤj/§ċOŝ|<-Di 1ġ„AĊÎfŞ,eZĤ™ĵ­WñŸşŭżŝùáî°^9†ž_3p|s³;êÇAD‰‰H¤ƒ8{Rܚ)!8ġ"‹ğ¨?Oġċ\ĥnˆŻÇpĜ$ް7[˘Ë6÷€Zgl˘+8™¨ûRġñ¸üċӉLż9„¤š˜oÂÛÄ)!ƒ´²LgS1†)2‡Ħ_nàm‡<žŸ?µċĵÌċġ´|™–ż<ŸO³À˜˜#Ž!Ġ;5 bÒĥH+ ĉà†„ÄĜù‚è†n½b€‘xHùîpġíŭûoŜ½ğ:ìÇ<ĐúhÒY@x9Itg8üĝûÊĜóŜÁ^=nPQ‘VĉR–EĠDš´v|9Vi›Ŭĉŭß­wûa5=Ûj­”šŞ(ĥŽ!'Žîžs2{ 0?âfN„Ìİ÷Ÿ(S[–Ù‘ÎEV *ŭž"C‡„€ˆfpQ”;sŜßfGW5$é7pçééġñ—_ó8p'B•Ò[²}ù€È˜# ¨ àMúĊÜ UŻĥcŽ<-µ×²cày‘yQÛD3˙òu: P‚Qô3-U{ 䭒ĠÍ&üë?ß˙ëoßíי°;Éêb€ävY8ğ·Ù —¨+“™[k Ş"&ġ’ÑwSĊ\ ??žŝüËs;ßofÁ˜TT Ì@dŞ"uQ‹PĠĊ f²HĉΈŒ˜‰7ÌÓó—†Öš–ĉgħŸÏËcݳYLĦVÓZzf# ˆˆĦ°,U]ĤĤjhŭŒ@àäêéfğûŝğï?~s{};ŽcÏ_ÊRŝßOHßâí"@iÇ2™ú…)g˘ÒZk­•jĉµÖešOÇé|:…@›ĉ·ï×ğ]W֙qÍLMZ-óòòċëëĉîm9=?ĤaĉÇċoŸŽ_ÏÓ47‘ZĊÔµCqÍq*úùıX™Ÿž'i‚HŽħUpĠȜD@DÀÑĉ2oFúŭoîŝÇï9l†KJĈUÀ‘¨çÈâ-9€Ş!AßÌÉÍM´žO­i´|Uŭx>ŭò2HıŬÚnL9E÷ĜĉY[‹y×+1ĤRf“J„)ç0nd.œ sMżŽ™`–EÀ¨9 E‘­R)t̉s ­ĥœ$ĉ€=0§0„ĉ&UW›ñê~ħy޵HYF¤b`f‚ŭzġîááŭ‡Íf›bJ)a7?¨Wü/4ìŝÒ%ÓL:P­÷“ÚRjm­ĥy^ÊRêRêR8íġŝözÜĴCL!Ĉ‡İMë²ÔežÏ§ċ|>½ĵÖRrލÖfêĥâó×/µÙjğyĝĝŝêĉ*yr¸Üù¨ŭŠĦŝuwK1ĴW4-óR˜PU#rŽ”? *—ò`oO;!q_sßOġġo™éxžZ­fB)ĊbΉC š nÔĠ@ss13kµMǒJ[SŒ ÀKm²,0x$&pê<îÖBJĠ>äÔgs­óTçÙŬ9tt@{w{#<ĠE˘úžpG¨˘ÀC¸>îWüĝŸsk‘!FJëĜ×ĤÓkYĉËtŒè–Ín·Î90“Ħݤ! C^!bÓşÊjX§<0s—›úŠÓŻ6qwsg}²êż|Ï -™İù<ÏËĵLӲ̕ĊDÜl†ġv}ûŝ~½ß·Û˜sgÈĞŞÌe:ŸĤ럗en:@Nìb‰™amKĞ*b²ĝŻ.?˙ùχÛۇÛŬ6)1ô37"İjżÀ‚Ys Û͚.çsL˜£IkĤ1ÄNĞíH sëcœŞtì¨ú[H:ŠŒ6ÛġëËi>Óaı–ĉ&Ôı,†Ä §—ÇóBëĞùÔJ5Q¨UkUs ö &ÍĜšĝñ$çskE‰Â@ÄnÒÇ!RkbbMŜ–ġêîv˙ùéô:MbVzpŒt3DĜ)GÎ9­WCŒĦûk„ÔżĦːèŞġġˆ‘‘CLcôFÙpÇÖĴ‰›˘a›gY*Ċ¸ı[È\[­Òêt|­ËìnD~=_[Yĉi2kG+F6ó~%qŽÁ‘Êz•CóyQ)Ó4ċ”ŝöÇŻż|ŝö§îß߯6C_ûL÷vXÁĠĠ~ğŬĵÛùD&`FfZDŬ/ĜM3C&3żx$€H¤˘zÀŠ9Dmíé×Ï1GäSŠ­š7ík£‘ˆ¸ËĵüŭŬáÓÓdfÚ :şışÖÒ0Tò£vŽJ•&@CvwtCЁé|nT­“Ġ)œŝû<ç1ÜŜ 9‘6ġrÀ2Ġ²Ôˆşn³ıÚï:żÜà_z+ë9hİi“8 &ĠĦo—ÄÄ1ÄÚÄÔEŠAÄqğ×vÓ/TĠş,óéhŞ€Ħİ/K]Ç̀Ü$Ş%À•ħVhŒy³˙í7W‡}ŒQŬ^ĠĤ1Ĥ 1rdĈ€V,Ç0Ĵ“޵ExfZm‡ĴC„¸N›Ġ¸z#ì:Óċ>7BÂ>J¨H¸&İGf/Aëbtwĵ$ìçǗ~ˆıÚmiX›í:™C$@ìeùà™ê|žüü÷Ç_?i]Z+ù/ëm7*BdíЈ:¨ğw’ún;6ÑV[`¨µÔ˙ġÇ?_ß˙ôÍjğî˜B3K)99 ÇÄûŭÖ[9ùrzĈġv£jşĤ"ŭ5"0T¤Vë²*v9šRŠnĥÙĴj“óñ8Dv…˘HD&`ÍÀ!…8ŒëëğûğÛ[Ç˙üùùŻùß~VëDqsíŞ€c­jµ™JH+D0­Dc\Ş–".•½!„4kĴ3nĠpİŜÔĉj1 ‚ïWqi*‚ïb²<½–Úv›ġf³I#SèáSÇùùħNSp7İ˘Y[–ċ4Iİm*J1äíz˙0n61%~cŭé¸L'Q5§ZˆL–דœN[À@1†`!Žû›‡wïo×c÷"MDkù?\½×dɕĉy„™]ċ*TÊR,§9äLcwgöiŸö˙Ç ÌLϐìfħŠ%232Âċ&Î9û`l`-€ Gdĝu³#ïû ;Ï*⃠ÁħI!µ ŜıUïÒR¸oĵ#Ĥâ¤6Ġìê„ñjÀĴÓĞš–]:*_&˘Šu€J B ò¸J€Ì}óğŻëÀ…àœM¨—2֙b%êĤ”T`<?üŭÇÓÓ璖ĥġµĜRe1% çLrʅ€ˆ‚GSİŝsìGGxŝ‹”ĝċo^ï6ŜğGTƒÓJ3S5BŜ3!Η 9§Á³c"Bôuċ‹D!ĝ}cìꑉ˜¸n"Ôk×wq|úôùġĞ ×Z[rŠ„èOÈŭêfw˙Ĥğ ĥŭzġċÛû˙ıŭġóÓXNñ:NEY•Ó­BĠŒµd3 mGӒ­“¤fıStĤ:/r<%fHŠKÔÍ@÷j³6•ü5¨zœçÓÓŬMyu³Ŝ mˆ˘kšv³IÓ¸œŽp>s7ĴÔLR÷§x™sÌ&Ĉž›a¸{÷n{w_ĞU@ƒ¸LóùXRµ˘e™Şk–óĦäŒEÖä˘Úó,žiğ(p–3{‚špŒìÈ´nô£ġž‡ĈfIĉ€s0—\JħĞd²ĥùV˙µ¤ ÏÊ2+’_”œ•=ZĤÚ½µŽ•\; >x3#vuRÀu€lêĜĞVÇHİĜŝü—ËáÙ1˜)‘Żû‰Ğ.V3ĠyIŒà<§\DĊ1BôŜ€¨4s޽w5ìL‹]žŸ˙–óûożı½żó!ÔÎ)Ċ8cŠÙ‡4!Ž£ŠĥĞÁ1Çeù‡V™Á *NÖìî¸.“Àñ•³ĊDÌ<Ĵúç§CŬîĥy‘Kêħséû‡W~ğĦàˆħuÄ<ĵ}¸YŻÚ˘²PÍ!,š³,“Š‚aÉÌĜ&JYÉJ–¤ÈÌäS‘(„ĥdú˜3ˆĦIÂM0 ÄÄxšŠ™ï<'cYNŸ.ÈÜïj"YmŠ}pĞ8_.’ĤċpAD-şŒÑr߄ĠÍŬ×_ï*|ÚÌbŒRÊt>/ÉLĜ9-ÚB‰jŠ„x.ċéR&č‹?ìŝx_EÓ*šR10ÏFj’bZĉÔ´ÎĊ˜J×ĝlY¤Blöïè6xA‡V4TόhZĉËáĝËßElµŬ½ŝâ+fBtµ†°+üE] _ŻnÏşéRQSÑR´dB\ĉéĝôüó÷ߗ8VAEÙ"#˘•œ#³ëcŜ6ÌÌ"Ö4Ħ˘Ö9B•zĵĦcòž½wH 9K´<]N?˙7çœóîr<ŭôŭ_ÇËħ”|<ʲĵ}ûvX W£—ĦU­r^ÌìÀ˘b×ÂÌÌyˆ5<BԔûöîf{sc{I0[)€ˆ¤yşLŝİ]ŻC[ğè‡àùĞoÎDó`ŭ;ï§)ÎsҒ‚ĦI!rß7]ë‹Be6TÔÀy™¨]&ċh9e4ġ>™´ž˜ ‰–ìġÚa ™–—ói9@…·}W›ŠhnVÛ·o7Ż^uÊêÍŞ v}+tV)À,KZ0A$!ï—锊‚N1ÎG sŒÑñRr,YM‡vuğ]?î÷˘r½›EKŬŞ’yŠmë‚çÀŝ2GS[Jœ–%—âœó> S1C$İ=W} ’iİfŭéĝ|9Ĥi™ÇĦ[ùĥCbÑ*™0CHìĜ"ݐĤ˜Ä<ŸU5Îi>ÛÀZ\ß5E„‰ĵϚ’ŭ#‘™ĥ Ħ IDAT½ˆĤ 9•oĠ \A9ŞĠ.ŸR)`HÂŝTù釟œ]ß|ĝċ—ËéVÔ̌כÍÍíÎ{WĊúˆġJ˘k^ TÁ¸ŞÖ (E¤ˆ2W°‰!˘siÀQÁÂnÁuçùr8̗“€Ó²ĜËĥ™ +(…Ñ+5k‡áŬ7ŽùÓӔÓäh9!°#NZNò˜ÍÄÁR”Ĝi&Ç]çlYDŠ ‰ ômzŜô]ß·Żï7]PФe쟎Ÿ~))6!4mCŞešó ÈwM·úğÛŬë·M·"ĉ”buûKɒSžGÉħl%g)Ùß píy’ħìÁˆ.ôÀ1mœħ'íOßܽğÛíÚĉC’\;"ĴĈñ” ;;_Ĥ9ï ĵç@N£%)Ej3Ġš"3!€š€IĠÍËt”TJ.‹Ìé|İ։:@0C3‡D˘FDHNL‘Lr/ó’–i1€Ħ9-HèÉ!¨ê?ŽöŠ–Óú V!İYÎĊ™ç‚+9³ëÌĴmڒ“™GfMBÓö—Ç?ŭË˙ê‡ĉ|ş4œ£&„nowŜ;0“RŞ£*ñJX…ÚWBEY_íĴ”´8ÇÔTa…ĠĜşĤ !„8ÍFĥÛĤïğ"ns#?ŭ5§É1U MĠ‹Ô¨% FTĞQVHlĊyww·A¤)R`İ;} X96*€Ċ ÄL’ށI‰L”scú>8GÁyBê;ŝòaĝ×w·ëŜ{ÇX;NËr9ÎÏÏÓùÂħˆĈ"cLİ8ïşÍj¸żmwğawÛC•K1ğRRIIRœ/—ËáIrBä’K)…È…ĥçĤ·f½ëq8}ŝĵ ŠHÎĊġ!e‡÷inOïî^Ŭív1•L† Ì‚)ıˆAŒˆyGƒ ı)$™˜Ĝ9{)9ˆÙħi˘Öi‘4Où’RĠàğ.tôsU·Ş`fhĤ“zï_F´5Ïѵ‚óóŝ)ÍKßç]#T5ġ/kUpL9K͖QµúVċiŠıcçÔ0§ÈÎWzmNY‹e‚÷ŜyÁíÏóĵ,Ó·ëĉÚĥéûi["z‰QGĞZŞìëHDU­Ħ#ƒœ‹ŞĊ˜LĞİĀÌd„Î{çŬ<Ï"چ›`€ WDöôïŽu*˘1×ĵáLÄ€m×1û%êŝĴtUí"‚‚Ì5›ĵ 5E$Ş–2A,"`MעUKµÁµM „RDDrЇ§§ç!'‡}Ó­_ß·ëv¸½í·7íĜ;bF€*Ş'âœòxĜ>}˜.gD@²˘‚ÄìwkżÚùï¸N1ċÂĉÉs.bDPD žġüzw÷ûßüÖQûÏżD[Ĝ;bÏ˘jEC#í6Ûvh˜sÊqŽıM5NŞĉP‰™€áZ6ި”ĵLS\aÄM7ôWË4@ÔêÛ‚äœÌŒˆs•+À‡óòŭß~Ŭĵ÷+ žMD¨2@UQEĉ¤9IYĉ%‚Ħdќ l Óğ.c@TUÁyïƒwÎİJÍĊ]­ZËŞ?S–Üj\ĠJçœĠÚŸUż˜!1Ġ+ğ.”kUdV–qyüÔ· ŬC·œwužç‚Gç/œsi+­:EƒoWĞÍŭ›nµeçÍÁŠH.Rİĉ@Ġ$!¸ŬµiÒó%ċĵ˜$Be°bL5öÈ £e‚k^‹ŠĠË˔KL ³m6‹Úi*Ï§Ûu߇ÄÎıRr^–ñxœN#ĉÂ@ŬzXżyğ{ŭ* }7 ì=ûkSċÔcrJçŭ~dzš7.t}ÛmÂĉn½ÛùàŽç4/ö2<ħ³„žrV‰:ŒVĉeŝŭûŻVŬĈÄ~ü³”\XÙĦIe†Zœ§Ĵ ™ÍsœcAFDbv`VJħÎ]'q/Ŭ–0³ !İċ,Téa·Ğ€Ï,ÓܧŭŻ}P‘™›ĉÚ;à4N?|˙4͛ÁĊ”˘iUġž‰ ‰ıŝËy.˘Ë’²è4çbĜuíf;Ô[JešeŠ)—ah§)6kĜ7Á™İšJ.Šú×)ž•˘ˆAÉ%–,ġĵ˙GŞ[m› RcŒÈ9гBÉe™Óñ217CßĴz_—úW@&bŭ+$"Ĥn½ğ}µ^ŬŜ†ĥ³üxJĊԂC1vÌ.xş½ ­çÓ%ĈRÒbebT"Ĵ04nÇ̎Ù{D€\$—’b1„"X‡)”ĵŒè˜Bچìóyù&ĤĠ]]Vjóċ’çıLÉ#Ò*ĴŜĵÚ½ÛoV.ßtW%§)#‹s5ZYŽqχŭqFt$PÛĤnw÷mÀŒÙ³k8•H—̝s­cĉ꽄Ĵ҆Ŭ5˙üOż+E~üS.<Ġe·¨‚ĈŝÜ·m𘄜şÙUo‰iÍG5cĴTV…ùDŜ…ĉöġğiŠË´Üż~s÷í7~ĠWv.1^u°ĉŝòË÷÷ëÛûġ}@O‚€Bˆ1-Ÿ??>îğÀŽÑ9—e^²#pžÀ 8"v"ĥ¤4Ï9²Är™c7ô÷ÛĠP†².’ó0Nñxsôœ’,sîúVĴ8DzzDÈ)—9ċ’³äâçdÁħ,Ë,²1h@UO^ğ³šĞQë‘*2ëVŬoŭÌĥہ½ğn,r‘%ċcœ§ĥa(9îŜ}BĵŻáŬŞW&ŒˆU"";ĉŬĥ%ÄOq™£H ´çbâ…ĈµmÛ÷ÍzŬŜŬĴn7ŭíş3-—%}ĜÏ?8~~<^.Q }pĦumC@Îy‘!&H1eSEÇŞ’b<y‰dÀoooĥoßğqŬQġó_AĴÄu9$%_ûñç%Eb 4ŬĤ]ßíîîĥë3ĉ’ƒ÷mšĈǘUĴÄBŽÉTc$"”’ğşÙüŝ7_O§çA£CÔ˘ċ|™›>°cF×·Íş<;YĤËtıPpmż&ò%C@ä—EĞÍíÍ·m€Ħ ŬjÀ7ˋĈ‘Üß?<öS|6ëĠn½nĦ ܖbŸ?=ĜzŬ³sNC¨ĥ隤†„dhӜ’rQ5ÛlWŻ^Ŭô}Û*˂)f)fëU`GÏûKɂŭ!;‡¸L³É}çƒëğ6.ĈRÓÜG9§óé|sğ ŜC-Ôk´ìµa˙GÙjv­A‹"BhĵIİĈ‡Zȗ")ċSÎùĝıñF´&׺àkúŒš½ì§AD–%_ĈTŒ€‚sĜ÷ŒžIJ2IV˘BtlĞM³Ùv·wÛ·Żoßßovëoœg•’˘Âê·ïġó—7˙í_ŭë÷Ÿ÷§â½÷fx÷0|>ĤŸÙ/ÓrVŒ‘†ÁħÊÓaĵÙĴjĞ$"9eiVMğ[żŭöÛğW>ĝÚCˆFd*ŸNµjOÇñ¸?Ž1er­ˆÒÚġŬöáöŝk@‰ï·ëġó|$?„´öŒèAÑ17ÎumZT₢›K RŒc¸ĥñ˘Ĥ&9³ÍŬĥġ-³óm.§ŭŝÓĉ&>Üy×´t â}:ïşĦݚOUƒŠ$Ĥü{uS8liLñççϨVħ›Çù´oyĤàY%kÉvċRĠé PNI .SÊEÚ.ĵß }=8,à‰˜–ˆˆó  §Ŭĥú|Žİ8çğN˜Ñ9öA‹) Pŭ˜V*AŠkĵގ—ÔĥŻĊ1Ġ%jµUİâġÙ-uġ*"<Ğ€"˘JÁŠoyYâ2O9ϧÓñîa[ı4W¤2à5B–‰ Òù²d- 5úÖÎ%%AMV&Yuôĉaŭ÷öË÷ŻĥëĦïF`BGTr*)ğà ɋtŻ6]pà}ż /îÚ?üĉáù’ĉqŝĝx‰Ó–ÜhĈ_OoïwÎ;&b żd LĦïğƒZU8‚פşnŒċĵ:<~œÇ™‹ĉq1Ĥàú›Ûğğġyï̘]Ó´Û~í‘=ñ’“€ĤıPpÜ:·jÂnè½#&bç]JwЎ™…ñ#DbË žùfĠżğ}½jCŠı<N—¸4Ħwì{Àš€k"ċÚŬ1ëġKèşÊùÇW­YÉ oœw^³AFcÍ%=}zJ˲[…+G´Ô܅R ²z1ó%ç_.nÑכÎ;,iAE#*вä\$e1ÀÊÄş0ĥ~šâĵ,]rˆÀ(aĦà‚wŜs=$‹¨˜ĠŜq‰Ë8Ï>ĝĈ14ĉ"˙|UÑÙ5•Ë–&$Ä vİ˙‡RT‹g-îÙ9WĠ1š 1ĤÓéòŻ1bçˆh³é–()%Óun½ŜĴw_m˙ĝğ÷o^Ŭw]‡fż™š ‚9Tj$ñ›{÷ż˙áĞËbÓ´<ÜĴîvëĠ Ï__⟏9§)Bvà÷ôĝĝAğ-E¨íÔ5bمĥJ°œó/ѵ#AĴġJŽqÏá9.30&-c.‚~³½˙ò‹w÷·[ïsf"R›ž‡Û›ŝc§TÊ5'H ä97+ײÚ6xo;çx5 Ħ ԋk00vÌwĞ­ıt­hIQŜÜÜïú­'GWÛeÑcZd9³óo‡~E@ÈuVŻB/@à*$¨ô˧ħjèŬċùÌÈ /Vpׯç-éÓc)0ô}ç˜jĈ6˘w!8dÎıÌsœç”K^réş6TÔLÙI†˜är™—913ôèŞHİáŜs…˙ċT'íà+˒bޝÎsŞMA9>ï‰hĠ÷wˆû˙ ­*ċ[A݉â`µû6SUŞq("ZŠÎKË2O‹”šŠÌìš\½%9ççŭéŻ˙ü§ı˜'´Í*€á8FħáoàÍŭÇßŜ~óîáĉößז \ĠÄ^Ej"¤€ÈÎ=ÜĴ~˙ŬC.òŬ—wÛÍ "˙é·orJ˙óß>Ÿ.E²Îç|ô͏żî§iŜmÖsʏûirĈ …–™ùŠÛğà˘•—étœÇs]Ŭ/ç˜Ûaûċow›U~UĞfÀ„Żïo÷ÍWc\b5qĦFF:vLšUŠċlŠH̞¸_ ŬF7cKܲL_zûfYRÉrğ]­úžkŬ RbšĤċĦòÓçOğ‡Ħ*ĉ;a"CD&™yHlfj u[½Yîò9:G7_l|ġênsÛpxŜ?}üġħİj]ĉET‰È{rž_b]8ċrc.òvÓ·­7SÊIUċy?İZ×70Nħï\e"YġĦ LˆEÄ &ĊA)ZwU”ZŠžÎóyŒw7+Ïx:îE_=jEĴˆRĠgÄD€Ĥv}˙ ‘  L%W„ˆh/KÜï`hEÙ;ê“Z£ak%Ĵ†’üp#Áû&¸§çYÓèqı[óĝj÷ûßĵ~óêm;f ³šħ@ jfR^èĦÄĴ5"ŞïÂ?˙ö-;nƒgU~ó°ŭ?Ŭ7]Ûü鯏‡SĴ8€TdġéĵjğĈġ]óġoŜßm‡›ŬfX ĠRWÍġŽ€5h-/Ë|9]NOó²áq^Žc?|ùŝ‹W÷7mëĦrtÙıZJYÑàÜûÛğÓ×oìr\J+j„%Ê4.!ğöĤ½ŬŬ޸ĥkÛéĤ8 @ V y‚ĥoA­uìJM GËÌóùpœĤĵAéĝîġ[òd•ċËüï÷}Ŝ×ÛĠÀäĊuċL÷M÷ŝ‹ûożüâíŬĞÎ7Rìtĵ\Ĉy;8ßz¨[Yâ*ÚD6ÓĞ‘0WġS j5`Ö^²ğnwƒg(RÁ=5*ÚÀlèïŽ[4dçšĥ°œĊy÷2…Cfş\–6¸ġŞu„ÇŜDË]^o7]×"íû2•jŽP3ğžŻ˘Š€Ë÷û4]˜UM‡Á7mÏÎĠ ñá46Mhš€À1-OûñÓ>"qïm5„çŭ\âıqñġmĝ/˙t÷헯6ۛĤíë,­‚·€ÌԔÙ×ëŻGŻ~fεAĞDĦŞï‚‡›ġ˙ñ˙îġîożŝöÓŝt‰˘–Œ‡ŬĉğŻî·ŭzèúĥ ÁĞè7JÖzü˜J‘4OÇçÇÓÓù°ŸçQÀ–XžŽÓi†o½ġp; ½sljµ:d⠙İħ.Ğ˙îŬì0.9G½œĤó4/) CóŝíŬW_ĵ]}pá*CëBäRÓ풖ŭx|—bàĈb†%çi֘LA.SZŭÌ1fÖÑùrN)5MÄU%(R…‚Vsôkmc/–ôzúŠ  ı˙û˙úŻwğ›>4UÑRr™§IU¨Ö ÇóR”ˆŠ$DbCÈ"İ”\„šĈU_ż¨@-˘5ŝ͊ĥwŒ†˜‹‰a߷΁Ç)‰së;=öÇÓTD+IJm>?ŸEm½jƒÇRĤ_žçiŜÜŜlwë&„ûAm†¤Ö#ġ;,ŞĤşÌñx<˙òácŒóvÓfWQb¸?]ŝċŻïn·0xŸŸÏùÛÇÓ%2…kŽÇ9͗>”·wŬŭß}ŭĤ_mĜ˘ŭžJ‰ÓÒu÷^š şF7@&’ĞшŞTÌ, Žh;´}ßżşŭ§o.?}:¤œ‡–ßßoïwëĥñ•™hf9獊 ²š•—ñ|úüñùñx:WĴ–Ì1ŸĈ²ÚŬ}÷ÍW›ġÊħğ—‰İ-SŠDì˜ĜµJû/ύDÊ%Žżî? Èŭz{żıarV|ÌĴ >/˘ ͆1.é|:Ó)&}>…(ı”ÛeN¨SKfŞç%³v=׿‹IAş’êë# (ŞJ×lj vWÂàÛğWwˆ¨"9y\ž>}6F§"yBfpŽs.`@**bDèܵ Î ”ŻaíEÁ{'˘j‹žÎK.„şÁ7U #&vˆ`Û8Çè™E¤˜ŭòq—ÖŻ_m½#Çöñ‡çáġ›‡ğ‡‡nĵ÷Ž*§ċŞU(Ĥ˘&˘b 9\Êù|y|zžçi³njœ+@Î~>Lŭù”Ì}ó^dJùñóß>\ p;„iÎi‚~ŭvġ_ŝî›/ÖÛ"VĠ—y•œĉe9/Ż^żòŜ×’sŽşlĞR=ĵĈĜ‹³ò$:ÇÌÄŻ·Ŭĥ*˜b$€pI‹ŠĤ¸àĜYˆ¨ÇóŝÓŻ—átÏ1+‚sˆ€—‹µżŭú‹íş÷\bŠx-ëm@DĠ–$í/Ob°j×½ï‡ĥ[÷ĥY⺆c}‘-•Ëóâ-˜ )jɖĈrùıÌ&Ï) È™Ħİc|èğ;ì$k!MfR†…AȰžŠHXŠàĠ}5şÖĈƒ™ÔġmWçċА˘MÓüùñ ̈ħ한]ô]ŠÖ ĥKLċ^B"d+Ċĵ70k??_†Î·­/ó’Ĉ):ÏŻï֎YRÊfĈ „Xß1ĉyÉÎ?}Ü˙żú´$“"OOG•¸è·ïV˙Ûïß}ùċ]?8ç*Ñ fN¤é2Ÿûç½ı†AEĜ!a%›Ş¨X.EÔżê‰ĞaHqV*R$gğş8²c’%Ç—œ"¨È²ÄŞ]Šó2MSIe\ÒaÊc$ìĵ+‚Ż_mVm°œrtuİl€Ì@/zıR*tNÇ4~>>O9­›Ëú~ÓŻĵs7½kƒóxÑ×´Èü|~~ŸĠÔ°(£lnÌ1'$FBç{Ĥb´fcƒ ĈÜ['ĝġY\(}ÑÚ˙¸Š@Gĵ ċMT.2ŝŒèÚĥCPUÍ9†AUj—ä·]`Ĥ*²ĞAVàCá%ĞÍM,1/)‹%6$ïvá<s:]""ö}xózç“YİC´œ÷SL•7ÇBD‚k‚+E²h×úĠñ4ĈqŒëuç½ó$ϟ~ÇéomÛowğġfMŽĠŒ˜%§ĵÄÓñ<c.I¤Ĵ׌r–ó%ÎËf³Zo6Î{1›–ôy?Ms:]âŸĝôŭß?§\ŞŜ9xğßıŝîö7ïnß}ñU·Úħİ ™–\â<_NËé9Ĉe\äŝíƒsŜLUòËj˜´ä\JIİä\rZĤıŠôk”˜Š”"ŞĈÎiœÍÄTçi~˜!\­>Şš³¨)šiŒT 40í:ßĥ,žÈ7?q:ġŭĞĤë‘Ĝ‡_éóĵLó IbœóyöçŭóñŭíĞíjĵoCƒ@Œ R´H9Ÿż>}Xĉ™`˜Äe›ùÖuìP<ĉĤ Ż‘#ìÔ¤Np!\bùï?œĝdŜ…mÄn·â‡m¸YŞĞaġşNWFĞUqL¨×CÌ ,˘ĥġUïÂÄDX¤ĵìê0 RL8§\Ààpœ!„m<JfĵŬö|ë*§†í䜋DŞ/Ò4Oe˘y‰éépÉEÏm×CĞfm/ÓR3½ú.x‡—)?~>6M¸Ù­½÷ŜĞcPMç§éüTIDXU `0tÄäSF½Œòéé2ÍÉúYŻ7ìœÍÙ÷Óġù˜Î£˘x”è›ûĉ?³ŭêíÍŬënX‚ŞÉi:/ûÇ2Ÿ³”ó\Ô ĞġÁê#%rudĈyšĈQr–4縌ç‹H1½‚ µÊŽBrì†Ŝ‘QN9.s5‘ûĈ³s"ĈÎ3‘ċL œb–,˘&z&(]ĵ£ĤqXÒr9jZĉËÑODD‰ÛaĊĦ“|~>Ĥ˜]ëÉ1;ž4.ñ4ŝ:ïšĠÍöĉŝĉÖ;§YTSÑÓéRcğȍ`(-ҊÛUğmšNÉG£I "0³U›ˆ™) KÇ1ĤĤoñĵ¨j˘ĥîä·ïÚoŜúŬš|fş:³í%Ċ IJ"–Sq‰HÛ ˆzïş!ŞG5Ľw>ĝ\ÛzQËEާi·Ĝ‡Ĉ#€ c.ŠŽIU‹X)ŽĞ†DÔıšFԖqŠ1-1?F&XÍvĠŬßĈiiğ†šHݳŒàĦıí™xYâé4…àÛ ›‰c23B ­GĜDġ Ô9çç8ÍIĠşŬĴW €4Îù‡§Çç)rıě5¨%Ĝ·ĝî˙×7ï^Ŭ ëkzĴŒš4OÓéùôô)-SŒñĠ›÷oßçêñ)%—”–iB€8Óċ$%ƒ$™ĤX…ÀUsTD‘1Ğ5$L(dĈŜĦAİ›HG ÇTŠ'”z —R$IMı˘ 0 LLHĊ@Ġ$%FÓ9&ï¸Z0 $9>Á’Ĉt<.ç(Ôqé-;ċ|™?Œ‡×—ÓwŻżxV”JÇr8ó‡§/ŽċġqÀµlÏĉŠ€V3+¨* ¨šiV †fb jET¤Êt0ái–?˙4 g‡¨/°–+a@ŬUEĠ1R[sŽUMŠÍS¤‰ĜÌbç*_ü4ĵÛ­ét‰ıHJmB­k–(1IëĈĊ˜Ĝ9Ç™HEb’"şÄòó‡CŒ š&4m3/ÉT  ëĵÔ;F¤ L´,9e.cQ@DvDˆÎSg@9‹ˆ2é8ÍÓ¸ÔÊ]Ôf·ŝò7ßlnnèù´üëÏi™=dËxš™änëż{żŝúÍúġŭͰıEDtž.hZҒĈcšG´RŠ,ša{˙ê•cš.GMsœĈœbŽħ¤X¤"¸ÊŻ€I•Ĵ²$I"È\Ԑ˜€KÁUë]×úeÉŜ9 —x™Ë’Ċ³˜”yNdRJVħ9•(ZÔ €šàÚà›Ħĥ!´(…LYÌZ²’rç™H. † †È`Ci‰QeÁ%€4èi‘çCÖ>lüu‰2.\Ê ĤĝhnBZ4ҋÎÜÀ€LĊĞyµîuŞ´@µ€˘cƒ4/œ™ş€xŠúDz[Q¸çêöŞN>ê}ġbfİı´jUÏ„ÁğaĠ^“îŞ °ˆŠg2Fî‡ŜcÌqÉDùñéÌÄmׇ*´ˆïÚí’2qßÔ͌SħqŽÇÓrş,LĜxn›şDbjÛ` DPÊunêÄR CèÔTƒĤ,1 Vn˜hA$ïımBÜwáxĵ<>_Šèwww7ğğ[dwžâ÷?=|ĵh3‘4Ż÷ċ›ŝ?|ħy½VCßk:UIËçK™ÏhÌjL˘!·C×ĥ^Ĥçñ,&RÒçĞ·K*ɑ¨FĠiIYÄ Š>Ïé<•, †ĦiûÙrsÓ­ˆù0`ÓġMpsLWÚašçŭÓót:LÓ8§$ĊrÖ1IkĜeÁ,t)F—DDà ƒgP´E҅rëÉѤ,˘ġ8¸ ö4ÇóXT:ÒŬèóÏîĉ§Uî½$]A#cQPS0ÍZ _†Žˆ 00:F $10ċl9PƒĈƒˆdi QÀ@ñ4•ż¤UŜQ¨Ğy9X‘])™BznÚnµ^â3ZëWĞc*•Ê‚€˘ĈşÍ02MQÔÚĈ§´?\şYŻZc‡@ˆŻg: IDATäÚ‘XJĞÊT(ı¤”R–eɜ>=E´ñ̄!8v”sŜ9Ĥ6xfÄîN‚óžkrKÎWWÛ¸Ħ÷ĜS.j!4 SCâ’SŠ9§`ÁñÍvu{×­VYì×ÇÓżŝ4žÏ yĠÑví~˙ġĉw_ì6Cß´­o×éäĵL—ŭcY.U˜‚HˆŠJÉΉ.s6KY˜|`(YĤq) à½"N9\Äì QÉŞÎójċهîíÛ÷777ĞĦ ΐAħíWD‹”"fàò<ÑrnmCżDžĉ|ÈBSžf{¸Ŭûâívğ5tKJ"ZGóĵ”œ²fS™rY :†Àkm³g L½£çó˘FT4cÛxŸq¸dȀ!0‘_€0ħĴĤ&fħ@ĥETÀ ÚµµNѐ  Ġ%dC TU`³°ˆŝ´—û[ZuVgÔŞVvfâD¤FV_x)…‰‚wP²äTÑD½§”²"á4ÇÖ°íşo ôts!"çôĝxˆħž‡Uß6i¨‰„Ê?(€UáZö‡KQ{|:ÎsÎâzĤĤñ÷wğĦR"{ÏâWEJJRD ÚZŞZÊiYŞ£MÛ~ˆKL)—ĵO—óeY–¨jMnovÛÛ[E~Ü_ŝûŸ9îliĠћûĉ?}ğ{w7ô]ëCpĦ'nÒOOóéYrĴM2KĠ !‚äÂàsÎZDÔAqIe‰ñ8ĈE0kIb) !ˆ@ʉL˜ :†Àxél^7·ÛuE”˜¨ë[RWMEKN%“d0AUF@‡ÎphŬnĝ?ŭöíû÷jUŬĵġá(”"ıä’SçcÊEĈñr^f³ ŞRTÌ ²@ŒĊ H€ÜEûĊû•3O”Ô%pWlġÌJAcï(x4`B2¤UрŠá˘€@Š–”<Ħ˘`6eSÂĴx^ä×'˙öÖ^ f•„Îà–enÛÚ É Em^’8rCcV}8 Ȏ16ŻQaĈŒÁ3–"žİ€=ŸĤqI›u›Š8&ïÈ{‡u2NDìĝ|šñpžžs.∺Á5ž½w7ğĠzh7] +ċĜyÏE FÊĉ\Š)ŠˆĤ†ŽˆŠ™Ú8.óœ.r™â²$QèÛvµYû~ŭtœŝ۟~ŝù×ç´Ä]ĝzŭŬ—ÛíŞ Î‡qğ6rq™/ϟ.ûgÓRDKεIe˘J}÷ŽRÊËRûr&#˜c9^rQPsìüz·ımğĈSCâšĠŝ2ĝôx>–KÌı€Ihğ’$TRܰŬ š !››-Ë4ŸÁ$x—ħ8ò&’S ßŝĉë‡WŻÚĤq„Ää}S ¤fħîH•8ärµy.1NórşL?˙òËñp”ĵT>rpp8G×31hş˜Ħ—ž8"ĠJĴ€š‰š€)yÂÁYCĴê&ĠbÀhiñ‚çlf†HJI UÁ(8tfLZŒT(˜Ùç“M‘×CÚ˘R- ‰À.çĵ÷`K5G$1$kÏLγwÎ;6ÉZ[ĝ”rhüzŬS*%xÊı<=)–óŜ;³²›Ĉ3;ç”eIBDCëƒ#QkğnGP–EÚĈûĈµ1j•{‹†Ĉûà+§ĈˆŬ4ċ¸dUú–چĈËTtŽ9ċ"Şİ(3 ĞĦYm.Qŝü‡ûŝSZ–mŻüŞ˙öŬzğjwä;.Ĉ²Ìûċ|X.g0YJG†€Z,kİ=/e05<ÇrœË’Ĝ·]·ıı]wžÄJlş>£G”m×mîß˙Ö·Ó<ŸÏx9é—_?>ïOO—4–ÜĥK.â½GĠúñDŻ˘%8Mñ°Œ—yšĞċ<Š *ĥmO䏧ħĈg8ç3Ġ³ ˜HU÷ì*¸WCWDî–ĝĉns§Ÿ>=~z” 1ÊR€@T†ĥƒoCĞä6UËŞàˆZ'Ġê3 ¨!ZÌ ŻèĞ:Ĵê$ ‘•ëʆ˜¨!H"İTgÙeÑó„Żn€*|HUĠŭé/ùŬ7ż½ ĥm‰¨ë{çĵšĤĥġ]Óc¨jÄÌÎCÉbfÄì½# &E½wjPQ2Hx—ËœSÜSŒ/C 5sLCŞ^¸~<ĥ›~µjr*ĈL€`&(ĉ˜ħíĴébı¨4 Vj(ĈX˜‰ıà‰ŬÏ`–r*u‚e fÁy×v³òŸŝÇßüġYKş]óżıûĉU_͉äZ ĉ|<ާg-IT‚œe!+U)ŞDÊI˘`6R\5ÛĉŬíîġŭmË8?Ë´GI ĥŒé‡ÇShüêwßù4mÓuÍv=Tù˙?˙ò?žÏÏ)FËBÙĥàĥàûäµî†SCpƒ–­aJâFeEĴ9fŠLĴè̊aAŞżsùÀ"T@P‘Ca8$2°˘2GSeĴM¨BAQsûyüċŻMÓ0 5mëƒÏy&€¸d`&3NIşQ³’Ğ£TMJÎ1ĉón7ŒS<ĤÚôTˆŠ(­Vü¸ŒgÇ`ö˙ġ^Mr%WĥĉVîG„H  PUd‘Íħî³™˙˙CĈîífß&Y,"Ä9îĊ €hĉŽthüéI ^6Ù~ĝfŝ×ïov›¤µ(qmĥ|ùx<´5sÁR-İy¨ıK \+sŜŜ~sûp{usµ›Ĉ”RꙌÖÖe=ÔÇhkÑĤµ9òR+€ŸK}:›ĥ$‚ŬŒ½ ω‡~’™É Êr^^?üüċxlµĠJÓcmNèŞş<Ÿ%t³ŬÌ9ċŜ/#³™ŞİşŻëúñGb¸şıŜÌğ! ]•ïŬGDó8|{WdsnµßoœkUA @§”0ĦQ y>µ€ĉîĦî ™~§Ŭ:˜µz:?ŝr~~ì**P¤—µûôċÙ̑!LÛEaĉ̔’ ˘™şvAW-Ç/Ÿßŭ|xzŞk ˆŞĥşµnŒb@IWWWŻ^½ıżışÚoŬ|šĈ­ÇÇÓËñ´<'7ç—ı–ñĝpŭ0›iœ° jñ|ô_>n—˘Û„£{W@SJŒÎ(ÀBks€H$›™¨µHĠ9S*£!x°™#:ŒÑ­*IêĜG`èpFGo=ĵüf‰0™6Ó×eĠ˙óÛÏfzs˙zµÛ]_>‚ ş.€Á͐‘™ûêë’Z@H@ÀÄIúK uS&쁜<œa-Š"ìêŭ Ä. É‰ä‚ô µjÎî­iîá„hѐ„E†Àóı2“šżNÏǵğ´×RK3Ĝod{#ßÚ_ÏâµXkkijêFÂÌ$Ò*œ ¤a½ğùîĠíÍÍ8¤qÈԁÚîĉDâî=übİ­íôô¸,+1˘ûù\´êɁ`„XKQm_ŸÎΎá~t;a<Ôêşžž|úġ§r>İ ĥ³yƒhĉiws{uµ§íЇ‡ŭv&Ue&aÁŻ(sï JÂ,ÇĤJİ„ŝöòċóÓ y;ÍcFXŞüö²ùrk¤1H  fY ƒ‹‘ô€#2 &’5°F„ƒĦb h˜ıc@–G'ìatMPúÔ˙"§ FÇ KİڍĞVBDqŒ]MMµ—şü™™‰S×µ˜İ5-çÓñéóğ_·£‡§,kӓÚj€ÍyğŬß?Ü?Üßl7“H’<ä,ˆŭî43"ŒtÈy3lԕno÷Ï??cBx.ëÇrÈÄ3K~nŻß—mNÙqX€rD‰˜‚1i\ì˜}/ጜ„„¨ÖGŞa6°îGĜMÔtùüL‡25ˆ’š‘#„Atœ@"‚‡pżĞIœĵ×÷b’†ÄÏëùożüÓ=ĥ×ÛĞۛOïŜ÷a“¤ ˆ˜;.Ş%PĠúD£ïDÈ<6›Ħ+gµYe$LIµ™A„š{À9%150ï.@÷`Á$Ĵ͈ħŞ&áµYOmt‡Öt]µĥnQX= Ş-Ğzĝ0$U @ĈğĞéz;ΣhYĴîŠ È1¸›<îŝċ‡·ww7ğŬF„“$ffşÜ@­Ç§_ŝqürÊ9 ğ‡{yû†rêPeˆUçQŞ–ÎüĤ,ĵ,Ğ’$ŝ]npÛ¨İwġùtzŝòôáŬñċ ÁE¤x<×c3ĠJ××7ù˟îo݆œRJ€„Ä9ċžĵDŬ£qù!”ĥZkzĜ^Mû›í˗C@ÌÄ]ŞĈµÑKÉ8ŸġĞ˘P èJ÷¸äS˘(ö%²YA8Ĉi ËÚ5ş=„0#6t3ŠŻ‘,èq1&qßF)Ŭ_ѐ/ĥÁ êQ…rú²Lû!O’“ı•ßŭòúúŝîÍŭçÇRJ\–6oĈuiÌôu#›íA š‡áNL¤ĉÑf.˜T]›vŭëñ\ĦİÖf9YßğH„2!skžÍ/ÌnV³óı´f§ ˘{4 N}o„PK[›ó8¤›ĞñÛ7Wc òRZsŒJħĥXŞİaps{˙öí›ÛÛğÍfÓIUŬŽŠ—œ†€Àtƒċe9}zF@X_²™ĉğ›>ú½T’ˆH´ĥfjaˆA\UÏkmÍĤQĤqäŻà£nˆ_jU[YŽÇçï֗z^(À ‹ùçózŞŞŽéÍżüËoŜĵ‡„àDâqÁ›™0áĊİ ½w7DœeBşArÓĝ~zúíÓçZB²ğ›—NšÓ˜ È<Â<œ 5F@—‰#B×C³actĈ—!>y3@ŻzŽ`ħnÈV˘ĴÈŬž€}3áĉFÔmFHí>sÏÓÜU^äɂBËĦ RÀDÌ´ĴëÇÇÏ×wWwWżVl-†H!‚9‹ğçÔ£o{2'%`(Ġ½İ1SB€j_š;€_Hĉf^›Nc&"Ĥ!3'J’YĚv‚S3%1…™›Z)-g @D6‡İ–j)ħšŸ‹BiŭĊ˜{ &I|³ŸŝĝÍ~3r Ĵµ­U- (½yu˙fu•s†! _X,L—ÒŝR‰w<&—4R˘4]ËÙJ53ĝjŒ bĈ  ÉŬC£u5ŸÁv3 S¸ŭ)7ԗóR–óùċñċóûĥžÀ5"€°h|>ŻÇµL?üáğû×?oĉŞd!k†„M-ÜqÈèaà]ÄI(ân@´•}N£šĊ=ŭáöü׿ŭíż~úétWĒÒ8o$gI1_lİÄnfààf£¤'‚ĉaBŬmçA7LD 'µĉ¸˜Ö˘KQ@z¸½Ê)€6íi:­–²,OŸ>?Y=µR„ZĝİÙ§óúĵÔÇçRj|˙Ŭŭ›·4Hƒ(e9•%yşáĉNž„ˉê\ϕD`”H™ó˙ûï˙~{{ŭŸ?ŝŭçwï[mCñĞĈ×<³ƒô“‡ Lhċ"û"ĉŞĈc’9Ħz]kUBÌCÙÑ".#!7CBîn{wDh­e ‡Ĥ†Ì<Š›z˘BÈnNoïy‰.=÷ċ!†ô@ŸœH‹ŒL2ĤZޞ‹lÓùĤÖí%CbHIz鲙²$ŝğ„ˆá‡Œ€Ôc€ı?t‚’„ÔÔÌÇÌáĈ— Tm9D,U…ı[=ħ£ÖŬQĠ7ÛQ—v^j@ÔĤkQóXĞ@bʄê`=ğpÊôp3ċÄĞêR}­~\t-–™w#°-íx8œħ‡ÎmÉDW×ûĞğ×ÛĞ;&ĈDĜSD…yš7cٝÏHÈc&Â~†éÒÑöJ̗ĤĊĦx€ëé\΋î÷ûûûğ”³Y¸İĥV×óññËáéËéċ™ÑÁµ_ËKÓ§ġŭñü|nÇE[y?ĉÛáS}ùċçÏaQK{9FIh¤ h;O7ûŭwßĵıŜoĥÓˆŒˆLáz‚a_  9ç<äy;ŒWĵžÖÍçúöŬš…ı"#EX2öšÑ-.  ɔHH‚` Ĉ°€—)lr€hÚĞRN”‰íTɀ§y ZiÈˆnîä€èÍ"8܄RJ4à܉#ŽÖ“~E„!`ڎ‚¤Ğ–S1ñЉhfM°ÛZ!ìĤ!'ʉÍ\„ŞZ3ßl6Öéèá(Aî†èE½ğ{˘Ğ™Ù/^é ‚ÚTżn˙Üğö̑0'B ĤŞËŞëښZ„#âZ:şRêۑ°f2Çy’ïßìvSnO§ú|VwÜNŬŭ|½›÷ğMfd&–œĠñx^ÊşžŽ‡ÓRö/Ǜ‡×óŝz"†p&œÇÍŬÍôz{I†qĥ›Ż3T ¸ e|]ŞQU…ÚN§F”ŝô‡o_ŬŬ×RĴ6kí|x~|˙Ûáñ‹ğ#D"\Ğ~>­ż½œ?ËyQıŝf3óù—§ZpBJ¤ƒĦ  Ùzúr|:Ŝ>ĵúöġ~;IRNDxħ÷  ™Hc^ŬM` šİjӔE™E‹9µc™ó0$ÚÒ@=~²k˙™ˆ€°şaÂËġ‰e>{™–ıX5ƒ4Èĵ½ÙËÓÙÌ@qÎûïnjµúR8`İ @[):MİǤ֪9ġB–“³xĸ‚˜™#7sU—Dż7Ĵ Ì,=¨;ì°6%ĵüÜ£İĞùZÛRÚZ4 Ôâp.KİÓA7ó’E ßŬmò<`ÎeQ şÙ ŻwÛiHL4óÖ́Eˆp"Ú̃ĥĉfÇózxŝRÖeÜŜĵúöí8͆Ä@áIòÛ×ğğ+‡Psf!ĵĝÙğŭ#°CŞı!İ[] CŜ<Ü˙ċ?r9žÎ/Ï/Ÿ?žÏËéìf†µ™|:_NċéPϋQžU?Ê0ŞŒ|µ ğ Â8sB¨ŸŸ–ġüÍĞWw7ĉ„L„Ş3 ĦffĈHw›k?ĜË*DÀ”ş4*€ÉşŒ‘²Ş) B47‹³Û‹ĝ’È1Ü­*:,š S‹Rn•$ifn—yB8 !ŠpbĦ!IÎÄwá"˘ğšĞœž×œ‘"‹Ls><ŸN‡µ'ÄIĤ|;ĠÒtµĤĈMĠ-jğÄâk5µaHµµ­éÒ3KÂP €ŞÓ¤üôĦĉġd)1D" S˙àŬÀŬ×ÒT½Vf<Żz<—è?îc)<‚˜†Ż÷ӐşŞ“÷ğ<σ 䔑˜˜Ì£ÔŠ€@­3 ‘ARÚΔÄJÑÏï~V·×oߎµ2‹ôN†pË {IgevurD¨<ŸÖcmÍàíŭ˙óŭËnšÏÏOÏß-/O­ĴÚ Á@¤D<—öTÊħOzZ3oĤÍġ(³ £Pgĝw2³ŞGô‡U˜ş„W„…ĜAW;˙ĝŝ×Ĥííë‡í4аğbżĞĥÒjiċ|.ċg9-Ĝ ğž˘³…‚ˆ8‚-ÜÔħî,Ì쨵ÌY3ó”û¤H ¨(ރA>ÄĜ8ı31B@OrOÀŬ Ĝ X8‚Ìċ ç/“Ŝ€°p7‰E—s;š™7f3d‘Ŭnf˘a-ôêŝġ5µÀ „¨“.ÇAĜ¨İUU7ŸĈäÓ›Í1N§µğ=BMÍ{6ĥĤkQblÍĤ!1ó0äĤ]ßZ/Y£s$—Ukµffjͽ×`jH”ûĉfğÓ‡ç³ÚÊ,î.Û)ï6@MR’HŸÛ8¤ívf"d‹$€ûŠíċÓË4ĤWŻYħcµ11qOí(""ì’a7žĈ´iúÛ³í7ÛżüñÛyȟßŭüċŬŻ †#˘0zPó8¨bġCmOk]Š~y)¸}5ßŜme`d€DŽaapÙEçqÑWŭLÇ   J´(˙ü.%ÎŻ_‰°°ô}j‡ŻhĜı,Oǧχ/‡Ï_ĈŸžîjµqœ ùñ3oM‹+g‚Yè쨍äÁÍ;C……x"È\K[Jíİ=Z•³¸À“ĤĈsä rfÄ֍tá½û#bÄ91ï&ħÀĊÛpÉ;ˆ€›W[÷Î^zjO§CˆPÓĉj=§Avóĉa{3Zúù˙üôîç_×eíÇûk†]Œƒün}9ŭzO›ŭbİĊX‹şGk>9™I„´9"·fËRÍ£5;/µWûP³T­Ġ™ˆÙİvŞb¨÷,™Ĥéġ›ôÏOËZKmM­u2˜ñğ‡Ŭ~;`Ĉ ëiéa„ÄŞĈ™ˆ% ì ŞšĦµ8?·u—ròîtĞdK¤rĠ7úÚêù/Á£$ IDATüòċħ.ĊÌ< §”ßŜlìüòÏ˙ü`µ„ëfHˆDQÔU­i…µÙéTÇÌÛÛiÜç†VŠş9˘‡!fĦOVs Ê3vyF÷G4³‚‘FÉyĉúó‡7××ó4!a|…5UӗċîéŭûçÏe]ġñíӊA! aŜÙ²ŜİX4‰ 1€ƒE8RsÁËtw˜'ciĊÇn™wP´fí¤Cŭ0í‰@R7p‹PÂ%ëSTż@ġ(%,t½Ħ” Ğ™Ä#:y ‡i§ĵŬN Y›­kµˆġ\`·Ÿ½{ĝ÷™Òëğûn˙ú˙}|~˜ú¸ûÔ# ™zU!y8—µ´ní˘µĥ!‹;ä$ÁˆĤŜÔŭ´6óeĠÖšöl7rĤ†Y’ù×ĠòÊ$ÂüϟÏÍ´.UNkİ­Ò0v!‹eqı›@B:;Ĝ…ÉĜßuXtE “™Vs³ „9Kb$ ],ĞÜĉy‡< ‘ıWmĠ vCşŸùŬ›÷žˆ²0 Çfët³Û×o³Ŝı„H0P@Y lnöğÍ̄jĥÖ֊žŸ\â*m§4䔧aÜm7·w·˙ùżŝúéŭ']KĞĈ„ÜÇÜ£8 ÷ĦÇSħpfDG·h`kQˆî²5!w0óêĴ­6óÀA¨´§†N—eìí¸p ˜Ĝƒ…‡y8çUOOg Êp}sġo˙ö›‡ëŸ>ü˙ë?O'+­™›˘˘bĴÈ뢏?ŝĥÍùj3şğÚ΃€°’µênàmġ§4#Ŝ" £w§ƒÓ…ĊgÚt9Ÿ?}||÷n9-UÛ§Ú,^oÓ< ÈLŭbí˞Ş/ž‹=Û絝Í` Íġ4L Şi[ğɑċ!!w2>ġ§ˆ<˘‹Ñ‰j5Š y4 ż|üíöúêÍŭ-"Ĵµ|9<ŝ×o˙t|jfáîksµŠ˜“ "T:ġäB`nn€ìááԝ{—ii ‰ !>aâħP Š@ =5 ÍJŻĈùd&HUNÂY$‰B ı™bfJI _Íi·‘œİoJ{&@σ’”ċtXzBa[*LCĉœ„h?O4³nĥ{à%^;†axûí›Íf~÷óûüíǧÇ'73C-f—>ßÌħgş.%"ZšFÉY´ù²Öumˆ˜3ŸÎe­ÖԅÑûı%Ê"­ğB€# Žk1 ş½żv×§ž×œvğĞĞí›×÷úáÛûğ½0l&9_~üÉ&_#|-fêˆA,K”rjÏe@AÚä|w5Mƒx3m- 1RY–—w,›ĞÛiğíÁáàîğÖu=<~~˙Óß_çġ¸6@¸y8 ċÌMlĉ) SµçSŭ|(§UÏ îϟ„”çœ'I#§‘‘"€RˆĉÔ=˜Şnjn€ˆ„ÄÂ5‘0ı·VÍŞ˙ĝÛ/›yĦÏŸŝû×?ŸĞİĞYi^m 4 O"B„è_ĞßK²ĦS$!vŒĉîj6Œi@˘>Žt†jÍJóbƒñd<î2fĦ`*ÏçĥT`f"$ ^ĞĤ€4&bŒ,|ğ£!×  ܝŝçž%Y $Q>=ğq3 ó~ÜÎiĉaj RfÇohž7÷Ż>˙ĝӏ???>Ş!#˜yNŬŽê%Ĉ‚ÎKS‹’”‰şĊŽKéÌhΜ…ÔÀżĉ"bSO¨ó˜­4d“œ§Í^ĉ+ÌóÍĵ˙~s}µğ½Ŝì·Ó~·™ĉı‡ƒÒĠĠŸĝn]—§§Çˆ6ĉN‰B"Àˆ_½ (<-˧i3pb$µŬ˜³™—VùóçĉwÜÜÜsߒğ[Y–ċòù·Ÿžż|)­êYhĝ B'¤Ĝ.ŞEŭX´y‹V/.)o£µK)áaÑJmEòœ:xÙÔğkg/3vçfD²¤‘:ı_„.°Ùˆ5ŞŻQš“ÇOŸ§dż~ùùùé¸Ĵáîꨑ‰GÎsĉLDĠ/n-‡D !ħŻİ“DÍÔu@HÄ‰+ìò îÍY@iU$‚$žD™E(D†ëbĊ~}¸‡#íĈôꖆäáè2Ċ÷_òï˙ŝ‡ĉĉLċÜb ×ó~›gîbŒĈDnڕZŞÍš&Ĥ›ëíf3>ĵş}üòĝÛ/ï>}ĝt:œZ³ĤÚ7ġ)³; jÔp˘‹,Bûj$"'‰ˆĤ kUuG‹œĜ1 ‰Ĵ†Ö€†ÍŬĠĵğzŭĉĠëW77×{&/Šh`DIò Ì„o^ż¤ż˙Ÿ>~+ĈĞÚZ´Fĉ$ŭK‚‚8jÔz†ôĤòrÎÂÌ<.ëġ4ŜpŞëy¨{¤QYu]O_ž?}xyz,M%˘1ːğß(, Vk§=ŸÚóÒ8óîúûo%ËáüüĝôtKñê€Ħ ÚŞċÔÖc½Xċ93'f '–ÄÄĂŜċÔGf&„ÑÌ{8x ?Ÿžžŝ÷qŜĤşœÖRX„î÷Ğ›‡*JOÁıĴn!1·04°Ŝ!¤ˆÚ” ˜'@ršB4D``lîaaÄ*Œ/k"铓”èf‹›L˙üBDŭ qқğ|w-ıÖ£ì@Ïν¤'°üëwŞ K9÷ûċptóLIÂ €ššicÂ8[¸Z+u]L‡Ԕb}};]ÏŻÎçċéùĝ|X–ÒÖĤmí†;̉;7Óá‚sĠÖZ'emĉŜ!²ÈHL)Š f·Ŭ]íïnŻv›ÍfğŬlĉaÌ"" ")Ş:Cż7ÙnvßżÍ×û›ß>|üû?~:ŸŽŽCî.ç`îxj@@×s @50§PFAV§Ğ{6Ĵ­ÖċxXŽÇÓÓéÒJé*Ûŭ< ÂDçÒÌ£YœĞ?ô¸š£lv7˙òçïŝüw×û- ÏÇ_Ŝĝñ×_~ŭñp>[Xʐ†äÖÜ-d ÉĤŜÖZŽ…„Iˆ„ò$³ ,‰yàJĉná}A@77ôu]Ġ´x(DC&Ùoçżü‡żÜŭ -8œ˘ë­ .4ôˆEëĥG"PXf Ej}ähÀ¸ĥ Â<ŠÚâÎK…S%M"|yÚ 7³ä_ë.†HÂ÷WoÓvCÂ_cŜ û‚ħĴ!WDLu˜J-UëŠçV–óé눁áîZÛzëÑjŞŞÚ‹6bîÁénĤbŜ~˘oŻOKŭôĵ]ÖVĞÍ-ĵĥ p@ !b€p!ÉÓv{û°Ŭ_í÷óŭÍvğ§i†Ü#Ä!Â{7@ D‡_w:sÇġ÷bGÊyĜlĥ÷ïŜùù×_žŸŸÖċèÚŞ9Ş…wHĥ:%‘,ÚRÌUÂÜğu:ÓîêêjżĤ<ÏÓ8N˜“ÌÓ0Ž9'îcL)1 ]”iîČáî|#"u6[÷,Ä%ïa²Ġ~ğŭŝíŭéòùÓû/OOç>5ëk‰iòfžIr™”:>žm]–e]ÎçµG*gĤ†~h@Áϵ­UO‹~>Tàáá›×oŜÜnvóŭÍġŭíín3ñ%I",1nĈœÓívŻŻ·ğŝġ§{y>B5 …P(kUmÎL” G$ĉ‹°`ìÖK/D@Tż0Ì„Ò (´›wßïżŭó÷oOí¨Övĉzš§<5÷ypÂŞì="FlŠ.Šajm’lé|Ĝ£É"´ĥžšLу5Â3“ˆäŻ>ï`05míŝÒäÓoŸŜĤ1" é&ۛíÛ{s§ey8^äáá½.!F —Çߐ°ŻutV àjAˆİ‡<€;B4³Ò~ïB™Ĵ™{HNèÈÍ@¤iŒIò6owğ{bšĈa&t³ȅÇ!‹H‡ıĉ<ÄEdMŜ#í.˘µŽÚt/ër~yĈpÉ9"jiW÷yí‹Eq™‚! B8ä„û͐_ß\ÏĤµ•êŞe!­êÚèt:÷DĤffޏ™ıùjVŬ 4;žŠY<Ÿê—ceĉÛ ßoèġíĉĠĞ×ğívž'„@ èħĜ=4™(!^oĥCJŻoîğĝß˙çoïßirÏŞb§ˆaQŠ 3RfDt mÍĝƒE—W(Ħı‹3Q8#î§ùĠÍġEbJÉÍ[Ûo|H|²r°ˆn´‘pÓêĠlÒ¨D–„Ìħ)Z˘˜[‡EQ"Y8‰02™™V][+Š0d‹ ˘n2|{sŭÛ´Ûôİ*"v×dEvŬ¤Kh‰nÚ·&î^zzùšˆt7Î8 1 "HKµÒŽkóÀiĉ4ŒÓ¸ĥûÍf³ßoò0 b÷¨Sf2ĠœrsIIşo˜XDä+9LöıâELĤZ–óç>˙òó4ÈöúşĉyîÑÇĉŭŽPèĜ €¤Ġj½€İk]–ġ|nċ||yiµ.k!ˆž.Ô[šĥĤ=£µ™G0C hx@H€š×ĊNEO‹65÷XŞ9B(mŭôáf÷Ó<çc"f–>ÈGaî}¤Ín³ÙóġĵùŻżŭĝ÷­ÖÑ-‚RNiUsI BNÁŒfèŭŞı„¸uÏĴ…77h<àÚÖz÷)Ô½*€LB˜Żw~ğs €àŜż-€™ ħ5Ó=XBAó”WŠ˘`aMM- 9]z3Ĉ‹]Ö#Â[mK7›ğ)çÍnÀÇÁê˜ÓÛ›Ûż|·¸M9E"èż+ŸÁĦ#F @ú½Ĝƒ•=<šyBÀ{OÊaŞjgkĝrjk³șw›ñĉöĉêúvÇaš$efÎCî2ħN”íݟ 0œzöC@ÄÜgν–vwì0ùžLâĤëéôòĝċoż-§CFĤĵٍóĤµÖĈîfŞnnĤĤM˜‘ÈjYOċt(kA°VkY›$v³Öj˜“}]˜İğ×âËZk³Şĉ`á@½™vo$Ŭ—ÎÈ#““™qĤp€µÙ‡—“ŭóçRÎŝw ßÍğä˜U"ş§Ż7D ûy›ßĉ›íĠív˙׿ŭüx~ĈŒ"Ĝ{&¤té‹ŭĞh „Ñ=À ÍŝMè ç óVîï6›)%!û: ż|U 9]oìŬ˜š 9àW8•#HRĉvjëg".€ ™É‰zĝ‰ RêŬˆ €èW÷AÌ‘˜(m§ĜOÇbùöjóúf÷Íŭ´ß¤1sGĥ˜5wfĤ $~÷ D"‰›@Ğ­N˜p3HeaˆhŬàÌtZÛİúıùRôjN·Ûa;Ĥ”d›‰ÛÑ} 4·S74×!×0 ó¸¸ëzĤ$ĞXŬ/vd$H½Cbï˙&´kµœ^ΧċòbáÛëÛyğ7IÙ[;ŻË‚ŬÍlµkġ|x)çS@¸İ2Ek-ÜkS³Hé"' ¨Eğħv­ĥ”jfM}UíĴëMİ÷z4\#’]°gƒPfnfüğġˆ˘ġ×÷ŸFˆ1‹äœòá_ğż ûçÑ­rww0ÜßŬ˙Çßŝŝî§sY@Ü!$·ĤMé"dërZ ğ$Ib †ê‰ÓŬŬŝğo_½ığ}{˙z3„ĤĤġ˘”„4Oöĉ½{ô/6ÁqiT/Ş4S[ÌİÀ ƒ#;b!xJR!;†Ì BĠ‚ġ]GfBb`ržĉëo÷r#ۉ“`·>_ o53„ ĝµ ıì"\×6$F Fµ@UEwkÍqNœrš§(RjuGÏLÄ´1{oĵñ˙‹7žñĜŭ)²êéEâPí^(:Ô½ĊS8x$ p2ᰁJq%óLn= M½‚ċÚ8œt÷ë6ÎĴóLÓrŽmÓàWOƒÏšĊYĜŞÎsĈˆf!‡ĉ<óċí|›çY%3};O3 Ò Ûêö…£H-" ]#áÛízğŬn·ûġŭvı\öÛġşµœüĤşSJ$ĉœoŻŻJµ__ßÎĝûß˙û—_~>X]&+¨‘,W' 47/VƒĊ”’×ġzı^Ż>|ŝĝô·ùé—ß~ŝù·_ŭòüvœ³Ò4Äĉ—ëŝtżŝôùğ‡×q½îW7„|ûú0÷(geÁ 4ëœÓbßì~µë%>Üòġôc6\)ĵ“ĉîHÒ2‹œîYi¨9…wҊyL×êŸv‹ÀíŸÜî—ĝóÇĝôß?mhe1ܗ XÎyœ/_Ŝ^Ìó ujGZì—Ĉ³’f½Ò Ñı@}Ž#˙ùòúpۆÛkÖŻ˙óöxß?Ŝ÷ğ†£Y›{ŽŞó$Ü2ë<à^rCğl7Ÿ™Ç9Ċd‹°"3ç™1|hôY³Yj?Ö–•ocĝĜ6Š|;Ž¨ÊŞfŻÎĴcNê˜ÇqŽˆ}Û|ĉ1óġœÇœ™uœéao€ÂĤ“¤àVi!Ù1€mcÜn×ëġúôĝá‡ÏŸûîév½lû&…ïó%Ğleu]•™WUKçyşÛOŭóóóKï·Ğ”RÍ-s*`€›{xG1ŬƒĠ£#6˜ıÍÛġrğ^?}|úİ*‹U•55™™ğìûeżŒĜ´4JLqİÍ\EŝċSMu~_·Û%‹çŝcŝúŒYFƒz6”öŭ‡ğS-#@nUĥë~ùôàŸî¸ >Ŭx‡ëö0ö½êŒĜ=†^7@ĉ”DcΓÌÊ ô„³&²çkTŻË– * ¨Ù´}0Ŭ_3ùvüvž,‡àŻZ3ğ(ŽQro$%şe÷ˆşŠŞÎ*˘˘@–ç™F SÀfıÛ~‰3‹•Îpâœ9Ë|Ĝùúzδ"Áœ³jQżçœ6k#ž³Ž3Ï9ĦÜ2‹€ŸYG„G엍4ai—m\o{xÜn—Ïß}|üpż\ömŒħ îtĤ˜G•`×rï ÌYœóâO‚Äo~Ù·ëíJrŒ£‹Ü"­$'˘ˆèuşĉ=Ċ!ˆÀzúŸ;v˜“jâ#ħz¤Ž”#\˙̠ž™½(݇ –s×Ôk†OŸŭûú_>û?~ž˙ġżç//uĤ’6ÉRÍ ĈL dV0ë.âu۞îŝéƒ˙éğíÇOñឨdÚPŸ`1ĵ4׀ ħBÍ9Ï3IÜŸ.ׇËclğy,[5÷˙ñï˙öv/__Ÿż~}ùzÇñġġíàÁ8óȗ£Üááî|y;PX[|„„É4Ŭ„°re{fgĦŠ8Kz`@˙ĥ˘(̳àĈ·Câ4b3 blƒŻoŞfáYgĦÏĦ.|„O"iĤ3şœ5”Ñ7 /Û6Ĉvğ_I\÷íáßn·ëġ2Ĉ8ÏÜĥqıl—ml#ÄÚb ¨éAšwŸç @“WŽ°Ö ̊)ù3MyNww³Jv."b,‘Ÿ(Ò5clpËn E£“ÖyEVĤúŸ„ħèö‡R5lóaÀœ“KҚ„{è˙m·9ĥÎUÔÉ1•‰ïBUEƒ]wŬÌ.ğüpùéOóçßì×çüíı^^ĦĥÙqÖÌ͈z9ĉÑÒf4`ŝpŭ>ŝüٟĥÇzĠj„ħ–Wz„ĊX¤“^–,ÖÌ·Ż_ûċwûáÓOׇûġĉħÙşŭîÄĝÛżŝ$06Ğ4‘ñċ˗_~ùġġġġíԏùġí|{{{=Ž——W–<&Ϥ;b˜'4Ç6< n`” ™BM@„R Ìb.ĉY6Ik@Έ€á•i†8gı;Ŭƒf#< ™m1>>}¸]/î1ĥħï’û6.ûĉĠ1ĥŬÌŞĤ#<Ĉ0ëŭD‚MÜ ·ĊMӕòX ŸxHĥZOŒÒeıG 5ZÜ4R^f ˜ı%bfckAPÉ%N·È².qÍĝ˜IàĊŬğT˘äĈ8ĈèĊnžĥ8ŒéVTĠĥ…Y6ÔÍ÷֐ÁŞ…hĉħEV²ÊĈm³ûŬĵXçÉ9­Î<|yŭŭı29+˙ù[½ĵ‘Ü6Ü/ñùqûáÓxzÜ·Ĝ·5ċfd ;_”NCe~ çyĵ~ùŭ|}yüüġö°ßî.*fi0{Ġr*cÛÔt%ôpûñûïĤöÁĠ1x~y~~yŝŭùùġíĜĥșÇyfeV9|ùözœ3 Ĉ6´ĤB³áò4ûĉùzfµŽĦ°Ç0sÀn·Ëĥ_ž—mxĝqœ0|ĵ_/—]ĞG#ĥ×ëċrıH6¤öSq˜UĤ’ŬÛ%b̙çñ –v׊ÇRĦ–Iû$[ċE  ÚÉRĊ\š% ‹‚2ğÂÜÜBn…àĞĉ&™ˆñqxÎiUÛv‰.#~ĊAMŻİ²rÂ1`ĤÔħ4xxÀz:TíbéÇ@‹ċ…ç³µ¤ĵóB͞Z"=B†•qÑxr|~ĵœ³ÎÌó<˙ò5çiUNú>ĈċşŬo—ûmìûRPїt+x=`'ôŒL3ħ{Äŭññéû÷ÛŬcĴÄĤ“m 6î÷;AĈSĉyŽ1"â~żŒ%ûx<ĈJQĉN5~ú'ĉIDATĥ>ŝ Áѧ2ĥMĠ‹Ûö]&¸_ö Zàñ. %FÛĥ÷§÷‰ÑÌçœÒ0{˙RS%‘YŬˁıGO˘ĦÂ-b,Ê-ż²9Ž’Lc•D²¨)Ħu4ß wŞVUK{ÂôxfV4ŭ€:fp·1B0Š_ígÓm sI&*wjŜŒ~ó*Ü+“FkÌĴÌt§ıoÛîŬħÓMħmÛĤ7,–‹˜Òi%ÌXœS@úUÉE?İ*˙–Àt˘J.B@v<ҜYh’ġÒѕàJôµS=Ÿç°ċ/çïšJ·´>Èz“²éĞġaP*ŭ)öĞris÷ħŬž>‚ÛÎbë`ħ–ġx7Š7­6ƒûÌ4Ĉ9 @D¨ó!ŒIQÈ=›ÈRşf&%c]C蓭>GÙkU‚ÜwoÄÊ}Œ‚è]ÑJVš)w—Ej‹ħĜ€1+#Ĝ"ĈÂ.;ġ^’íëĊƒS oĴĦ }Á‰kL]#@V‰vuëŬTgžšË¸*wó1Ŝïĵ.ŞĜHš7TgZkŞ>ğP°ˆÑÉħYÈFCş¤6ÏÉLR["èŜ`m“’5ÏWRÚİV³žS snz´‘Kê]í&BY <úï½ïÒJîûÊ ‘‘¨mı09Êo÷¤ŠûaÖíѧ…z¤ÛáckĈ‚ZÈTŠ´™×!'bl$Ñг-bë'4›çìs^*¸àAÀÍ\?\˘"€,S—ïÛMu¨l:-4dZ]¤ ½žLĈ0°J4׆ m:Ĵ̲%Š&SnüR‘AR„ÊèġġÑŝĴûĤ+¤x'yëıÖZ V”èĤ_ĨJCóƒ9¸ÜC³%]k³ıŸmF)Ĉûûò^ĝü-š… H˜D4NNwŸ™l½oX,.K•5ʋw żXѰC¨âg?ĥKü'"–‹é§×ŒˆŞš™YiïÙ.âŬĊöß­Ħ—6u%E€ûr^R…[ßJÓu2:Ĵbú½ʏ+ĞÌSşU^ĊŽrc0ƒħí£§Ċ<6İK˜g 亙>Ñ@—çê&%ú`nQ˙Ÿ #oħ´µ²h×ÂE¨eeMЁZxZG0Ñ3 ĉ Ż+îbğşÙÙ9;nş§ £Ž;j¸£‡d-W=ĠH…HtàµhûkTH´Fu1 dÄp)Rj_Şb{ÉeL™İ İz³–··e(Ë´3‚L# 6b+W“O?_}7§ÑhU)oU)CèĝÛ_ħŝhz4;q‘D”½‰ÌÊ „€ÀÍ£ŒeSŽ. Ùàú­ûŬÊ@9ÚĝžjÄFW?Ǖ×ÚbᭌÑŸŒĦÔŜÈ,Üg÷KŬŽžƒihf&`bE~GUf’bsêtLf6DF‘5ûԚçZ#Ĉê\#Ĉ0smځìL‹u ġɰZÀx_ ·*ÄèZUċ§ġ͓œ™ÈmФ]ÁÀJŬżoy›ÜŒQĉċĥŻÙ!€w,ëlZ?C²VsÑÍĴğ kUK[½ğEÒ6ñî;”Ï™dÊĴċĠlı.´êhßäĴ"3ÍÜ´òÊTŒ9ȈMD§žbı9Ĉ2&9`ú%¨Ĵöñˆúb·U5^ħËÊè@À""S“x˜„xu­ÜÊüÖjĊ€éf#bĴÓĦ™.M?ħÑhíïsïËn$4:˘cġ#Ó]*ë²a(â~O½ŝÑ´=ÓŬ’ŭħÉyyË7ÌŞÙ‰Î{,­"óžäX1T&S~ù^*UU[ĥµY’dó›Ş3 ´{]Ŝ²Ä.JÌĉԓuL‚p t]Òĝħä˜àµ˘V]=şáÁċxÍJm,è!ˆòU!ĵĝU*Ŭ„ğÉĎ* scÑŬH„ğĵ§:ħü‹ LyU›ö“şGó›|H7S½@¤à9yçÒŝħuċH+Â"FV2Ğ£N÷x˙ż– èoË+4BaVW•r!$Í1܌Bžċhj ôtñ{TOĜşî&҅÷1­Š£E‹ħ UúŠ€=>•'AÙà16÷ˆLĠöVB.KEgŒŞHTÁħX9›kħ)í⇄êôJ–£QÌtwĴ†İAUı+£ÂŠĝ‚VĴdAk֊F2óôċ^2S¨P‹0Á6ĕ)úҝÄ"˜ëUğĞ5•Ŝ+è`•òÈpĞì„ä[Ħß·ˆ:'6Ì´ V‡ĝŻħĉFúrŞxZĵĝ†P‘€“¸HĴöÀşo UEx–ì £Éċü”$ £Ñڂ ĵßÒwlKfŞ–‡(VlôĠWÙ¨ÌÊns˜Yev _k܌•ŬlŸÔêk=ÁWé£×N_Uejp}u‰~œ”~¨„°˘‡µĤ‹´ĤŒ´§ŽĥŞ’·­–ĥĞ•Ż£Ž‚kf^Ie\Hj`M†x`Ĵœƒ·İ’´§­š€–~`’xXuVŽwU‘xV’zX‰tT|jL[UA`YAYU=XU=[W@h`HzlUŻĦ‹ĵħŻƒ ‡j™€c”z^’|b‚k¨ŸŒ½µ˘ÄĵĤÇÀĴĽİĊİş¤µž¤‘¤™‡´Ĥ‘ Šq„jQ†mSŽy`leR]cJL[AQaKx‡g›˘ƒğĥž·Ĵ”°žƒš`”x[ŽsYš„j¤Žqš‚dšdž†i˘‹nž†j–{^“wZ˜{\˜|^›dž„hŸ†k€e—pZcQŒ_MŽdO•sY †jĞ—}·Ş•½²Àĥ Â¸˘½´Â·ĦĈ½§Ĉ½İÇÀİÀ·½´Ħĵ³Ÿżĥ£ĵ³ ı²Ÿ²Ş—Ф‘™”}€ediP]dMblQdsSj{Xt^v…at‚^gvSjtSŽŒrĞĦаž‹İ~s§eccb§onĦyİ™Œ¨Ÿ”š‘‰šˆ’‰—‹‚”t–ymŒj_‰e\Œa[[YŽVVSSŠIK“W[˜tt˜ˆŸ•‹Ÿ•Š£™‹‚z‘‰†}•‹ƒž’†˘•†·­›ĵ³Ħ½µ£ĥ¤½µ£ğ²Ÿğ²ž¸°ş²Ÿıħ µ­œ³ĞšŻ§–Ż§˜¨£•…†N`pHbuC]s>Wo;Pd:IZKSXonh ›´­ğ³˘ĵ³Ħ·­œŞ™†”yc“w^†hQy]IbLƒdL…fM„cKƒbLƒfMŠoRŒqS‘sU‘sV‘tWŠpTpcPicXxyp—”†¨ĦŽħ§’²¨’²§‘´¨‘°˘‹Ğ‡¤—ƒ–}}{u`fh^df`hk]hnVdmGVc>M]7EVFVcfutz„z…Š{ˆˆv–Œw¤—~Оƒ°¤Š²ĤŽı–ğݘĵħ™şŻ˜²ĤŽœwtlXtlW‰|dĦ‘yµ§Žş­”·Ş’²˘ˆ›…f’z[ŒuU…pQ‹tTŒuU€lOo`GZTAWR>VS>YW@[YBh`J{p\°£Žĵ²²£‹Ħ‰l˜~auY“z_’iĦ—„ĵ´ ÄĵĤǨÄĵĤĈ½¨Ĉ½§ÄğĤĥ­™Ħ˜†ŻĦ‹š„iƒiPˆnTˆt[e_OV^FKXBaqW†’o§§Šı°—Ż ‡ž‡k“wY’vX‘uY—~d™b”z\–|^œ‚ež…h›ƒf˜}`™{]–vZ˜z]š€cž„i›d•rZhSŠcP‹hRnUtY›eİ•{³Ž¸Ĵ–ĵħ›Àµ ÀĥĦµŸÂıĊ½İÈÀŞĥ¤½´Ħµ˘ż·¤ı² Ż¨•œ”‡€knqYitWk{Ym[i~Yj‚[kƒ\q…^o\asQVgHUeFlqX˘›ƒšˆoj˘\\šb[ĤjhĦurŸ‰€Ÿ“‰‡€…}‹|t}s}rš…yš†z‰|ž‡{˜~trj‡_\†WW’hg–|˜„›’‰¤šŸ”‰“‹ƒš’Š“‹ƒ—Œ„•Š€šŒ~ݤ“µĴ™ĵ³ ½´˘½´Ħğ²ŸıħŸıħ ĥž³Ğ›§˜¨˜Ğ–¨˘”Ħž’u{|McwIcvHbuA[rC[oI_nQaidjhŸœŽ¸ħ ·Ĥ½µ£ĵ³˘³Ĥ”ž†pq\ƒcP|\I~^I†fM…cK„bKaJgLgL‡iNŽpSrV‘tWŠoS…sZ‹ƒr§ ħ¨“²§’µŞ•µŞ“·Ğ”µ¨‘ħ£ŒĴœ… |™Œz‘‹~xytbgiYafKXdBRbCUdARa9HYI[fdtslwqu{pxzk‹mž‘xݝƒ²Œ·Ğ’³›ż´›ż³šĵ°—ĥݐ°£Šž’zĦ”|­Ÿ‡ĥݐħ˜ĵŻ–¸Ğ’´ĤŒ›ˆkz]†uXƒoR‰sS‡qRxgMbXCZSAWTC\ZEa]FdbKso[ŠƒrµĴ—´Ÿ·Ş“˘q–}aŽsWŽtY–‚h‘|¸Żšş¤Äğ¤Á¸ĦÀ·˘Âı£Âış²žĤžŒŞœ…—€e‚hO…mS„pX`[KQWCTbJ{‰g”›x­İŽµŞ’¤’w—~a—|^’wY”xZ–{_•y\’vX’vX™~aœƒf˜}a–x\˜z\—y\š}_š~a˜z_‘rWŒlSŠjRŠlSsX“x]”z^œ„g£ŽqИ}°Ÿ…³¤‹¸Ğ”ĵħ›½³żĥĦşĤÈż¨À·żĥ¤ĵ´Ħş³ °Ş—yfeT^fPj{Zm\jZaxUe~Xe€Yc~Wd}XbxUObGOaDO`C_hP˜xŽ}b`žWXš^Y£bbİxu£Œ„“‹“‡~‹{p~u—‹µ§—¸İ™·§–µ¤“² Ğ˜‰¨”…Ħ‹“yp‡qi‹~w—Ž…•‹£˜Ž˘— —Žœ“Š†€ƒ}ˆxrŒzn­˘“µ­›ı°žĵ³ ğ³ ·Żœ´­œ´­žĞĤ˜£Ÿ’Ħœ‘£ž’ œ‘›––ŽbnwH`yKfzLevIauQgw\nxesvnur›Œµœ½µ£ĥĥĵ²ĦŻ Œ˘xwdƒiV}_K€_J€^I{]Hx^HfK€fMƒhP‹nSrVpUŠnS’{b¤—‚ş°›ğ°™ğ°š½²œğ°™ı­—·Ş”ħ££”™‰x˜Œ|’‰{€y^adDKU9FW9L`?Uf?Qb;J\J]iZkoXhh_kgptiŒƒn “z­ ‡Ħˆµİ‘½ħšħ™²™ğ•şĴ”·Ş’²Œ²ıĴ”ĵŻ—À³š½ħ˜·Ğ“³Ĥލ˜}žŒo•ƒfŒx[ŒuV„oRpbI[SA[UFrn\~x_€w]€}b•“|§˘ĥ˜½´žĵħšĞ™›ƒguYŽsX—€eœŒt°½´žş£Á¸ĦÀ¸˘À·˘Âşĵ²žŞĦŽİš‚—c…jP‡nU|iSZUGMTBdrUŠ”pŸĦ²Ğħ¤Œ‰n—~a˜a•{]•y\uX‘tW‘tVŽqTsW“uYqU‘sW–z]–y\”vZoUŽkRŽnToUsX“vY“vZ—|_™~bŸ…eĦˆiŽp¨’t¤Žq£ŽsݘĥŞ”ĵ²žÁ¸£ğ¤À·ÁıĤĥ¤¸²ž—”€lpZcpTl\l„]gZazUYrP`|V^{U[wRZuRShKG[BMaCN`DZdMŒ†nĦ‰yš\[VXŸWZ˘_`§qnš€yˆ{tˆxp˘•ŠĞŸ’ıĴœżħ ÀħŸ°žĵ­›½œ¸¨˜ĥ”ŻžŽ¤’ƒ›Š}“…{“ˆœ‘ˆ •‹˘™œ“Ššˆ…{x}dbƒmdĴŸ·œĥ­›ğ² ĵµ£·ŻŸŻİšĦ‘‡†rvvkqrmpqqttqzzu||QcsD_zD_yHauMasjw{ƒŠ…‹Ž„‘’…Ĵ§–ı² ğ´˘¸° ğ³£ż·Ĥ¸Żž·Ğš ŽĦzŽoYƒaLuXEoVDw_H„jO†mU‹qYŒnToTpUŽsW–}dĴœ‡ĵŻ™´§‘ĵ°šÀ´žÀµžÁĥŸğŻ™²Ħ’Ħ“£—…ž“ƒ†z`bc>EQ6CV@TgJ^iHXb@P]F[iJ_iVgi^khkpg‹ƒož’y­ †Ħ‰²·Ş’şĞ“ĵ­”¸İ‘ıŞ’¸İ‘ĥ¨¸Ş“ğ˜ħ˜°–ħ—½ħ™·Ğ’°˘ˆĴ‚Ĥ–{˜„hŒuWlQe[EWSBc^OŽ…p›„Ĵ˘Š­Ĥĥ°š·£ĵ³žÀ·Ħ½³³Œ˘Œo’w[‡nS‘z^Ž}f¤™…½´ ĊĵĤÂı£Âı¤Áı£Âı¤ĵ²Ğ˘§˜•}a‡mR‡pWzjUYVHPYEu€_‘˜sĤ¤„³¨Ĥ•|’z^•|_”z]“x[•x[ŽqUoRŽnR‰jO‰jO‰jOŠlQŒmSŠjQ‰hQ‹kS„cL…dM‹kRoUpVpV‘rX–z_œežƒe †h¤Œn¤oĦŠl„h•~eĤ–€·­˜À¸£Ċĵżĥ˘Áı§ĵµ£Ĥ£rv`euWfZiƒ\h„]eZ\vTYsQZwRWvQUtPSmMDYAH]BM`CK]CVaJ}ešp—\X›_XXYœ`[žmd™}t{q”‡~¨œ‘·İšż°ŸÁ³ĦÁ³ĦÁ³ĦÁ² Á² Àħ żŻžĵĴ𴤓žŽ¤–ˆœ…‚z•ˆ€“‰˜‡”ˆ‚{y†gjuQR„c^İšŒ·ı°žğ³ ¸°ž¨Ħ’‹qvw\jsQbpJ[kETfCSeHYiN_pDZrE`{B]yF]sgpt›™¨¤—ĴĤ˜ħĞ›²Şš·Żž½µ¤ĵ´£ĵ³˘½µ¤½³£¸ĴœŻžŽ˘‡tlW‚cNpXEt\HƒjQ‹sZzb’w_oWŽpWpU’uZ—}cwŞ—ݘµĤ²Áĥ Àµ ğ°š³Ĥ¤–ƒĞžŒĴ ™ˆ‘ˆ|hhg;CR2?S>PcM^gaopVdjPdnI]gXhi`lhhmc‹„pŸ“{¨š‚§™‚Ş›„†°…ħ…Ż›„°œ„²Ÿ‡ħŸˆ´£‹¸İ‘·¨ĥ§Žµ§ıĴ”µ§Ž²¤‰°Ħ‡Ĥ–{ŠnŽxZlQ`YEXUFrmZ•‹s­£‹µĴ–¸Ż˜ĥĦÁ¸¤żĥ şÀĥĦ³§Ĥ‘v”z^ŠoUvZŽ{bž’}¸Ż›Á¸£ż·ĦÁ¸˘Âı£şżµŸ³İ•İ™w^‚iPƒmVqdSTTG[dM†Žl›zޤ‡ ‡™ƒh‘w[™€c”y\pUrUŽoS‰iNˆgN†gN‡hN‰jP‹mSŒlTŠhQ‡dO†aL…cM…eMŒmU•y^™}a™|`—{_•w\dŸƒfŸ…g˘‰l§qrœƒhŽu\–i°£Á¸£Ĉ§¸šµ£´­œ‹‹wajSf{Yf[i„]k‡^cXYqP[wS\ySZvQSnMF[CE[AJ`BK_BI\BT`I‚‚hž†u•]X—bUšUT›\Xf_–si¨”…ĥ§˜ĵžżħ Á³˘µ£Â´˘´˘Á²ŸÂ³ Á² ż°Ÿ½ğĞš¸¨—µ•Ż ‘œ€ŽuŽ€y“ˆ“}‰jlOUtBDVSĤ•‡ĥĞšı°Ÿğ² ´­›’Ž‚eloTdoSdpRdrO`oHYl?QgWuAVnnrrĦšŒ²Şš³Ĵœıħ ş² ·œ··ĥĴœĵ²˘şŸŻŸ˘ˆx—uaŒlU}cL|bJ„hPŠrZ’}e™‡o›‚i•t\–y^’v[rWsX’v\™bž„hİ“xĥĤĵ°šğ°šı­—³Ĥ’¨™†°£Ħ˘–‡”Œkmn:CR1=R:L^ObkcppVbdQdmMclctrmxoknd‰ƒq˜Œw•‡s”…s•ƒp˜‚n›‚m „nŸlŸk›}h›€jŸ†pĤzİ•ݘž‡°ĦŠŻĦ‰ ‡ †§—~œ‹p‰uY}lR`YHe_Oƒ{e›v­˘‰´Ş“¸Ż˜µ żĥĦÀ·ĦÂı¤ş·Ĵ•Ş™€˜c‹qVtX|aœŽx³¨“½³žżĥ Âı¤Äş¤ĊğĤÁ·˘·Ĵ–İ—~tZƒjQƒnVkaSVXKjsW‘–s Ÿ~Ğ˘ˆ£‘x‘v[“wZ˜}`”x\rVoTŒlQŒmR‹mRŠkP‰jP‡eN†bM‰aM‰]MŠ]L‰[J‡^K†`KŒiS–v_š}cœ€ežƒgš€dĦ‡kŸe›~aĦ‡j¨‘tŽsœ…iv\v\’z³žÄğı°œş²Ÿ¤žŒpt_dqUk]i\k„]j„\a|VRjKXtOXuPSoMG`EEZ@H_BF]@CV=DV>R_GƒgŒz˜b^™RTšMRšRT™ZZ—skĥ£”ż°ŸżħŸÁ² Â´˘Äµ£´˘Â³Ħ³ĦÁ² ÀħŸÀħžż°žż°žŻ½œşŞ™ŻžŽŸŒ}Ž|q‹}yut…Z^y@EzIE\UĞ›ğ°žÂı§½µ˘­Ĥ”~t[ejZgplvyw€mwx[gqJYlBTj;Ng9LjQ:BT=P^Gta—zšph™TW™SS–US—WYšxrı§˜Á²ĦÁ²Ħ³˘Á²ŸÂ³Ħ´˘Â´ĦÁ² ½­œĵĴœğĴ›½œ°žż°žÀħŸÀŻžş¨˜İ”…•|rŽysdc†HM{;@zLEƒ_Wž‘´˘Á¸Ĥ½´Ħݧ”‹†xtxtˆ‹„£Ħ”ŞĤ˜¤Ħ”““‰t{{LZk:Jc8HeRbJuƒbš–~£‡zž`_œWW™UU–TW™wr¸˜żŻŸÀ° Á²Ħ² Â³Ħ´˘Á²Ħ½­œ´£“µ¤”² µ¤”½żħŸÂ³Ħ² Ğ›Ğ–‡’xmšƒy•nh‰NP|=B|?C‚TT£…şŻŸµ£ğ²ž¸°œŸš•†Ĥ °İ˜´­œ³ĴœĞĤ—šrxxHSe8E`5Fd;On;OoDRfkb]Žwh˜ƒuĦ‘„£•ˆœš‡x•|m’tcŽn[†hSˆkR‡iRŒlUŒlTsX’y_š‚hĦ‹o¨”yĤ”{Ğ™€­œ…Ĥ‘}ž…o›{d–r]’r\˜zeĴ•ğĞ—ĵݚş™¸Ğ•Ż ŒĦ‘€­Ÿµ¨•´İ•ŻĤ“İ˘‘‹Š€IQZ4AUS;CZ>@T;DW=?M;^kP‡pĦа˘‘݈|Ħbb’TR’PR•lkĥ˘–żŸżŻžÁ° ÀŻŸÂ²Ħ­œ³˘‘ŻžŽ­ž‘§˜ŒžŒ€£’„şĞšÀħŸÁ² Áħ ÂħĦĵН‘Ğš“{p’vk\V‚QQ„WS£Š~·Ĵœ½´£½´˘ĥ¤½ĥ£ğ³ µĦÁıĤş²Ħ·ŻŸğ´£ğ³˘¸²˘Ħ•twxKUfR=:L9:L8DV=EP?oy\œž‚ݍ“´İ—­™‰˘um”[VŒNO‹^^Ĵ—şİ›żžżżÀݟş¨˜°ž§”… Œ€‹“€uĤ”†ğĞšżŻÀ°žÁħžÂħ ż­žŻ›˘‚š†z›…yˆh_‹c_lbĞ“„µ¨—ğħŸµ£½µ˘½´˘ğ²Ÿı°œğ²Ÿ·œı°žĥ¤½µ˘ıħŸµœ œz{yV^jFPdF]?J`AJ_ACS=W_J†Šo²˜ıħž¸œ´”İ‹|—\Y‹MM‹VW£‰ƒµ˘–½Ĵœ­½Ĵ­žş¨˜³Ħ¨”…—ƒwŽ}r}tĞšŠ½­œÀħžÁ²ŸÂ² ħĦÁŸşĤ˜°‘§•ˆ¤‘•}p…ka{mħ˘“ş°Ÿĵ² ĵ´Ħ½´ĦÀ·ĵ´Ħ½´ ğ²žş°œı°œ½´Ħ½´Ħ¸Żœĥ­›Ż¨—ĤĦ’—•Š}~|_enHRc@Ka=Ke?MfBOgEPeQV_a]XhUˆeO‰cNŠiQ‹mRŽqV’x]™f£v­…ĥŞ•ı°œğ²ŸÀ·¤Âş§Ä½ĞÇĴĊĵİ·ż³Ÿ°œĵ›ŻŒİ–„Ğ—„š‡°œ‰ħž‹ħŸ‹Šİ›ˆ˘“~yƒsQSY6BX>PeOdsNdr`vyŽ…„‘ˆ\ovAThH^p\syw‡€ˆ‘‚„Š}U`fCO]ehgee_TWVBHP8BP5BW8EYPW]„xfž‡i †h•w\‘oW”z_v[‹rV…kQˆoY˘‘y²ĤŒ·Ğ“ıݘıŻ—³İ“§žŠ§šƒ§™€İš€•{¤“y˘‘w£’wœŠq”‚k‰u_hPƒjP…r]—{µĴ˜½´žı£Ç¨şğħ› ˆ˜„j—eŽ|djbQwnS‘}`“u[mT‘tZ›}c’pX’t[Ÿ…kİ”zħĦ‰·Ş’ğ•ĵŻ–ĵݘş—ş­–ıĞ”Ż„›„jrY”t]§Œv·ĦŒÄ·˘ż³œĵ°™µĤŸhoW“sZžg£‡qĴ{›r_’sZ˜~aŠw^…nĦ˜‚ıݚÀ·˘Çİǧ°Ĵ–‡pmx[uˆbg|YPcIVpNTsNGcDA\@8J87I6>T:D[?E[?DZ>H\?HZ@EO>nr[ž›…·ŻœşħŸ¸ĥޘħ£tm“`X’YXxv­™Ž¸—²˘“°Ħ”ıİšğĞœğĞ™ħž¤Ž™†x Œ~µ¤“Żžż°ŸÀ°ŸżÁžÁĴĵ§˜·£•°žĴšŠĤ“…‹vj}oĴ ‘½´£½´˘µ˘½µ˘Âş§şħŸ¸Żş°ĵ³ À·£Äğ¨À·¤şħž¸Ż´Ĵ›ĥŻžµŸŻŞ›žšŽ†„~lnrYalR\lV_nW`n[bltsn‹ub‡dO‡eOŠkRoUrX™€e£ŒrĴ†¸­™½´˘ĵ´˘½µ˘À·¤Á¸¤ÂıĤĈ½ŞÄş§À´ ĵ›·§•°ŸŒ­šˆ°ŠŻœ‰Ż›‰Żœ‰ħž‹ħ ‹°ĦħµĞ•³Ş•Ÿ—‡Y\a8E[@ThVlxZnudxy…‘†‰“‰[ksDViJaq`vyy‰Ž–†…‹€S`g?M\HS\AMWT=8J7@WC\>BX<T;C[=DZ=@V<N9BP;GOAttdĤ ³Ğ˜¸°şħŸı°žıݜµŞ™İ˜ˆ—}q™|swoŠuk‹•‰ ‚š‰~ħ˘”şĞ›ğĞ›¸¨—´˘’ıĤ–½ĴœœżÁŻžÀĴœżİ™ĵĤ—µ ‘™Š­›Œħ˘’¨—‡’~qœ‹ĥĞ›µ¤µ£ĵ³ĦÀ·¤½´Ħĵ³ ½´Ħµ¤żĥżĥ¤ğ²Ħş² ¸°¸°ĥ¤À¸ĤÀ¸Ĥż·ĥ˘ş²Ÿ³Ğš³Ĵ›µŸĥŻ ¸ħĦ¸žĤ’pYpX‘v]˜eu´¤Œż´ µ£Âş¨Ċ½ĞĊ½Ğğ¨ÁıĤÀ·¤żµ˘ĵħžıİ–ħž‹´˘Žµ£µ£´˘³ °ŠŻœ‰°ž‹°Ÿ‹³ş°›żĥ˘Âşş³Ÿ™”‡KQ]7E[F[m[r|q‚€Œ‚ˆ’†t‚~L]kEXjKbr_uyŽ…ƒŽ…_ntM`mhttWgm=Pb5G^4F^5G_5D\>K]ehh“ƒn¨ŽoАpݍsĴ’}§•~–g•|^”{^‚lĴ“µ§‘·Ĵ–ı˜şŻ˜ĵħšĥĞ”·Ĵ”ş–ĥŞ’³Ĥ²ħ°˘Šİ˜¤’xž‹r‹v_†mTŽx^•‡sĞ ‹ıݘ½³œĵ³œğħš³Ž¤Žt™b†j•‚hˆsX…kP‹lR‘pX™xbĞ•~ıĞ–ÀµžÁ·ŸÂ¸£Âı£Âş¤Ĉ½ĤĊĵĤÁ¸ĦµžÂı£ş£Á¸˘ÇİĊĵ§ÄğÂı£ı¤ı£ı£Â·ĦÂĥ ¸Ş”˘‡n˘…jĴ“v°”|·Ÿ‹µŸŒ™raŒgSˆnV|oZ~}l~´Ĵ˜ş¤ÉÀİËÂŞ°Ĵ–‹“tcoSayU_zUJaGMiIIcF9M:P9>O9CUFY>ER?Z^QŒ{ħޘ½µĦı°¸Żœşħžğ² ż·À·Ĥĵ³Ħ³§•˜‰{’„zŽ€vˆvm{qŠxn}le‹€²£”ı¨™²Ÿšƒwİ”‡şİ™ĵŞ›ş¨˜ğ§—ż­›Àİ™½§˜ĥĦ’Ĵ—ˆ˘‹|­›ıŞ™ğĴšĞš‹•‚v›‹~ݝ­˘‘ħ§”½´˘şħŸğ²Ÿş°œı°şħŸş²Ħ½µ¤ż·ı°ž½´Ħĥ¤½´˘ğ³ĦÂıĤÂıĤĥ£µ˘ÂıĤż·¤À¸ĤÁşİ´¤şĴšĴ—„ħ˘Ž·Ĵš³ĦÀ·¤Âş¨ğİÂı§ĊĵŞĵŞĊ½ĞĊ½ĞÂı§ı›µ’°‰ı§“ĵĞ—ğİ•¸Ĥ‘·’·’°ž‹œ‰ĴœŠ–…ݤ’·Żœ½µĦÀ¸£½ĥĦ´š‹DM\HVAX\P²Ĵš½µ£À·¤½µ˘ğ²Ÿĵ²Ÿĵ³Ħ´£Àĥğ²Ħ¸¨œŒœ…š›‘‚w~nf‰zs ƒĤ”…­™Š¤˜„yĴ›şİ𷤕­”‡°’…½Ş™ÁĴ›ğ•ħ›‹Ĥ‚†yşĞ›½ŻĥĤ•¨–‡žœ£•…ĦŽĥĴ›ħ§—´Ğš·­œı°Ÿıݟ¸žı°Ÿğ² ·›ĵ³ ĵ³Ħğ³Ħżĥ£Á¸ĤÁı§½µ£ı°şħžµĴš·ŻžÀ·§ĥ½³ĦşŻ½³ĦÁ¸§Äğİş¨ÁıĤÂı§À¸ĈĴÇżĈĴÄğİşŻœŸŒħŸ‹ĥ¤ı§’ğŞ•ğİ•¸‘ĥ¤ĥ£ħŸŒŞ™‡–…™€˘›­¨˜ı²Ÿĥ˘¸ħœŻİ–ˆ‡AK[=LbH^rOguOdo_qwp~YioEWfF\jXotk~zw…~UgoI]lfvyQbk6H^1C]1D]5G_7I`FR_spj¤–€›Ĵ—{­œ³ĤŽş°˜ı°˜¸–µİ³ĤŽıĞ“½²šğħšğ°˜ş–ĵħ™½³›ıŻ–µŞ’³İ‘³¨µİµİ‘ĥŞ’ĥĞ”·Ĵ•ŻĦ‰­œƒ£‘xx]’z`•†pݝˆ¸˜ĵ²œş°˜²Ĥ¨—™‚fuž‰mw[…lQ€hQ‰r`­Š½³žÂı£Âı˘ş¤ş¤ş£Ç§ÉÁŞÊÁĞÊÁĴǨÄĵĤĊĵĤÄğÄğĊ½¨ÇżŞĊ½¨Ĉ¨Ĉ¨ÄĵĤÄş¤¸˘Àĥ Á¸˘Àĥ ÂĥĦ°›żħ½¨”ކt•q[‹nWviXiohhur‘„ĵµĦĈ¨ÉÁĴÉÂĴ­˘ŽŸœ†enWN]FVmNNdH6D64B36E48H4:J5@P9CS=GSAY^R…ƒv°Ş˜À¸ĤĽŞĊ½İÀ·¤ğ²ŸşŻıœıŻĵħ ĵħŸıݜ¸œ°–‚—‰}•‡|Œ}s‰xn˜‡||qŒrhwmœŠ~Żž³ ‘ݏƒ¤ƒy²•ˆĵ¨—½¨˜·Ħ‘˜‰ Š|ž‰|ݟ‘ğĴœÀħ °ž·¨—Ş™Š–‡{•‡{žĴĦ“ŞŸ‘£˜Œ§œİž‘ĴĦ’³¨˜µŞ™ĵħŸ´ĦÀ·¤µ£µ£µĦÀĥ¤À·Ĥĵ³˘µĴš´Ş˜²§–ĥĴ›½´˘µ£şħ ½³ĦÀ·À¸ĤÀ¸Ĥżĥ½³Ħĵ³ µ˘Äğ¨Ċ½İĊĵİÂĥ£´£­›ˆ´˘ş¨“ĵŞ•ĵİ”ş§“¸Ĥ’µ£´˘Žħ İšˆ‘…xrpmuvsŽ‹Ĥ ‘²Ğ—²Ş•Ğ“~€z>I]ARhD]s=Vm;NbH]m`syQdnEYjLcpcxzs„s€|K_mRgvgvyCTe1D]0C]3F^7Ja>Pd\di”~Ğœƒ‚²£‰ĥĞ“ı°—ı°˜ıħ™ş²š¸Ż˜ĥĴ”şŻ–ĵ²™½³›ĵħ™şŻ—ğħ™½³›·­•´İ‘´İ‘µŞ’²§Ž´¨´İ‘µĞ•şŻ˜³İ˜~ĦŽt“z_•}a“ƒm£—‚µĞ•ğħšşŻ˜²¤˘vš‚fĤ’vžˆkŒsX€jQ‚nY‹yĥĞ–Á·˘ĊĵĤÄğş£Äğ¤şĊ½§Ç¨ÇżİǨÄĵĤĊĵ§şÁı¤Áı£ğĤĽİĈżĴĊ½İĊĵ§Ċĵ§şı¤żĥ˘½µĦĥ˘Â¸¤ÁĥĦż²ž· Œ¤„m–x_Œv_spbmwqkyvžžÀı¤Ĉ½¨ÇżŞÈÀݤ•¤‰t~fObJMaGDW?6C4HPAZ]S¨–½µĦÁ¸ÁıĤğ¨Á¸¤ğ²Ÿ¸Ĵ™µ§•µĤ”¸¨–şĴšı­›ğħžşħŸ³İ˜ŞžŽ “„—‰~wŠxn€u—†{Œ¤‘„˘ …zŸwĴ„ħ˜Š¸”¸£“Ż˜ˆĤ€š…w£‘„ħ˘”ğĴ›ÀħžÀħŸĵŻĦ‘˘”‡ •ˆš‹³İš­£”ž•‰Ÿ”‰ƒyŒ}t—†z˘‘ħ¤‘ıœ½³Ħĵ²Ÿĵ²žıšşŻœ¸œ·œµĞš´İ—²§•¸­œıŻžĵħŸğ°žğħžżĥ¤Àĥ¤ĵ³Ħ´˘ıŻ·­š½´ Á·˘ÁĥĦğŻ›² °Š³Ħµ˘Žı§’ş§’ıĤ’¸‘ĥ¤²Ÿ‹ħžŠ‰Ħ“‚vrmJS_ERdR]hqrp•‚ޤ’Ĥ˘‘swu=K`FZpC]u:Sn9MdF^oUitL`mJ_nUmul€~zˆdsxLbt]r|Xhp6H^.A\/B]2E_;OeM^k„}Ş£²§³§¸–ş²šı°˜ıħ™ş²šş²š¸°™·–·­”ıŻ–ı°˜ı•¸­”şŻ—ı–µŞ‘µŞ‘µŞ’µŞ‘³§Ž³¨ĥĞ“şħšĵħ›´¨§–| Œr“z_“{`•…n˘•€³İ’ı—ı­•°Ÿ‡ž‡lš‚dĦŒn˜dƒlS{jS€j›‡´Ĵ•½µÂş£Âş¤ş¤Âş¤ÄğĊĵĤÇ¨ÈżİĊ½¨ÂşÁ¸£ż·˘ż·£ĵ´ ½µĦÀıĤÂğ¨Âğ§Áş¤Äĵ§ğĤżĥ£²ĞšĴ§–²Ĵ˜şħœżµ ½ħœħš…Šr”zd‚wfnvofutr~yĴݘÁı¤Ċ½¨ÈÀŞÉÁŞœŠo“{{„iUlPMbH:G68D4;I629D4Vl@XlLfsE]nBYkQhsj~}o€}UhoPftUkxI\o4E`/A]-A]0B];OdTdn†Š£Ÿİ”ħĞ–ħŞ”ĥ—³Ĵ•³Ĵ•´­—°¨’Ĵ‘ĤĦ§˘ŽŞ¤¨˘§ĦİĦŒ¤°Ż‹ħĤ²¨²§µŞ‘µŞ’·­•ğħ›şħ›·­—µŞ”Ĵœ„œ‡n”z_™‚gu˘”~µĞ•ı˜²¤Œ ‰o“x]šdšƒdŽx[nbNgbNdcP]cNlsX‡hžœ€ĞĤ°Ĵ’³”ğ´œğ¤ÄĵĤĊĵĤÄĵĤĵ§ĵĥ¤ŻŞšžšŒ‘‚†‡{ƒ{‰Š›™‹Ş§•ĥ²Ÿğĥ¤ “bmp[ltq}|ŠŒƒĤŸ‘£•…“†uwslbmoartdwxasv–šğ´ Áı£Ĉ½¨ÇİÈż¨˜‚eŠ}bjwWZpP?M<9E6=E7BGOeYmzVmx@ViKapWmuE\nG^obvyp‚~j{yShpUlwLap8Jb/?\-?\.@]4F_DUfjwvŽ‘ƒŸŸŒĦ Œ§ĞĤ‘°Ş”ޤ£‰˜†–’‹~…†|€„|‡‹‚ŠŒ€‹€—“‚˘š„ŞŸˆĴĦˆ°Œ³¨°Ĥ²¨´İ’ĥĴ–ğ²œğ²œş°š´Ğ• ‰š†mw[–~cœ‹s£–µŞ”¸­—Ĵ›ƒ˜€d–|_›„g—€cpX]ZKRVCIR?N]C]oOk|Xr~\{‚b†eŒoЧĵµžÁı£ğÂş¤ĵĥ˘¨Ĥ˜ƒ†gtvm|{q€{k}|ey{jzz~‡˜›ŽĞœ–”‰R`kEZlPdr\jqwvuurnekiYgoUis^syk|zvƒĴ›ż·Ħş£ÈżİĈżİÈÀݐx\„vZfqQTfI9D6=E8SZJx}i““~Ş’²Ğ™³Ğ˜şħž½´ µĦĵħœ´ž½´Ÿżĥ˘żĥĦıĴ˜ĤŠv™k]‘p]ŠjSnW˘zi·‚żŻÀĥ˘Àĥ˘Äğ¨Á¸½³ ıŻ›ĥ­›ĥ­›·­›ĥ­µĞ›ħĤ•¨ •ˆŠ~v~snˆy…}œ†£–ЍšµĤ–ĵĞšĵĞšşİ˜¸¨–ı¨–¸¨—şĞ›­Ħ“ĞŸŻ—­£”Ħ˜™‘ˆĦ—ŒŽ‚Ż£”·Ş™½œÁ²žÂ³ ż°œÀħ›şŞ—ğޘş¨–şİ–şİ–ı¨–¸Ĥ”·Ĥ”·”ĥ“³£’µ¤’µ¤‘² ´ĦŽ´ĦŻŒŻœŠ€Ĵ—…´žŒ³Šħšˆ™‡šˆ­™ˆ­˜‡Ğ–…­™‰İ—…ĞœŠ·Ğ˜żĥ˘ĥ˘³­œƒƒ{CL[.CO;HW>WjIdyTbyT_wSYpObsT‡ŠnФş²œÁı£Àı¤ŻĞ™{SbkRbmTfp_ptbux`uyfzzh{yq€}“ŒŠŠ‚LZf:Oh>TmCYmJ]nOamI\kCXlG^pTjuk{z’—‹·²ż· Âı£Ç¨ÈżİÉÁޏx]Š|ahpSN\DHV@`mRŽ‘x¨¤ŽŻ¨“·Ż›¸°œĥšĵ´ĦÂıĤÁ¸¤´Ÿµ żĥ˘Á¸¤À·¤ĵħŸ­–… sh’m\‹iUlY¨}pĥ›ŒşĴšĵħ½³ŸÀĥ£żĥ£¸ŻœĥĴš³Ş˜ĥ­›ĥĴ›ħ§—Ğ ’£—‰›…˘™Ž›”‹ˆ”„›’ˆ˘—Œ¤˜‹Ĥš°Ħ“ĥ”ĥ¤“ĥ”ĥ”¸§–ĵĴ›ĵ­­˘”ĞŸ–Ğ ’ ˜—ˆž“‰œŽƒ˘•´§™şĴ›żħžÀħžÀ°Áħ­šĵޘĵŞ—ğİ—ĵИ½Ğ™ĵޘş¨•ı§•ı§”ıĤ“ş§“ĵݖ𧔸¤ı‘şĤ’·£³ž‹Ş“‚Ĵ”‚²›‰Ż˜‡˜‡İ”‚Ĥ‘€¤¤€Ğ›‹¸­›½´ĦÁıÀ¸¤ĥݜ’…HR^/VoG_rG^pBVj?Rh@UlQerr}¨§–ĵ´ŸÀ· Âı£ş¤Ċĵ§ÈÀŞ—g‘…lipTP_F`pR‡rާĥ™´Ğ—ĵ²ž½´Ÿĵ³Ÿżĥ¤Á¸À·£Àĥ˘ı¤Äğ§ÁıĤ½´Ħĵ³Ħ·İ—ħ•‡ yl˜sd£ƒsµ›‹ğĞ™şŻšĵ²žżĥ˘½´Ħµ˘şħ³Ş—“ħĤ•Ĵ ˜‹£—‹Ħ–‹˜ƒš‘‡ž”‰œ“‰›”‹ž•‹ –Чœ­Ÿ‘° ŻžšŠ°ž´˘‘şİ˜½Ĵœğ­°¤—­Ħ’Ğ˘”ĤœŸ–‹™’‰›‡›Ž‚­Ħ“ħ¤•ħ£”·İ˜¸¨–ğŞ—ĵИĵŞ—ş¨•ş§•ş§”ĵŞ—ĵޘş§•ş§•¸“·£‘·£‘ı’ş§“ıĤ“¸¤‘¸’ıĤ“·£³ž‹Ż™‡Ż˜†°˜‡Ĵ•…Ş”„¤ŸŠz ‹z‡wš„uĤ•…ıÀ·£ÄğĤÄĵ¨Âı¤ğ³Ÿ ›T[c2?V*8T(6T*8R/N`]io‘‘„ ˘žŠ—•„‚ƒ‹‚€‹„‹”‰—‰˜›ˆœžŠ£¨¤Œ¨£Š­¨Ş¨¤¤ĦĦ‹˘ĦŠ£ ˆ§£ŠĤĦ‡Ĥ ‡¤…›”~—zŸ—ƒĴ¤´Ĵ˜ş²ĵ³žğ²œĥŞ”“z”|a—dž‹qĦ’yݘ˘s“z^“z\•}^Šv\kdXJMD=G9DV=DW;AU;LdEWuOQqLNnJPnKSoL]wRn\ŒqħĞ”şµĦ˜›ŽbosMYdPZcsxu‹Ž†…‹ƒw|huvSgqRfrMaqK[m=Og7If6Ki;Ql@Vl@ShPhZhq—šĵĥ˘şÁ¸˘Á·ĦğĈ¨ÉÁĴˆm˜ŠpuwZhxXn§ĤŽĥŻ›½´ ½´Ÿ½³žĵ³Ÿş°ĵ³ ĵ²Ÿ½³ µ ÂıĤĊĵ¨Âı§µ˘żĥ£½³ ıĞš²Ħ‘ħĦĥ¨—ĵŻĵħžĵ²À·˘Àĥ£µĦÀĥ˘Àĥ˘·›³¨—Н‹Ħ ƒ¨œ¨ž“ž”ˆ–Œ€›‘‡“ˆ›’ˆ›’‰›† •ŠĤ˜‹Ğ›‹Œ²Ħ² ³˘‘·Ĥ•½ĴšıŞš£”Ğ ‘İŸ’¤™ž•‹š“Š˜…›ƒŻ¤•¸ĞšıĞ™·¨–ĥĤ•² °œ‹ĥ˘·˘‘ĥĦµ ĥ˘·˘‘·˘‘ĥ ĥŸĥ ·˘·£¸’¸’¸’¸¤‘·¤‘µĦŽħ›‰Ż˜†­•„Ş’£Œ|£~˘Ž~ž‰y›†vzlž}µŞ˜Âş§ĈŞĈŞĊ½İğ¨½ĥ£İ£“afi5AU*8R)6R*7Q,;U7GaVhwXnxBYmD]pQkyKcsKboUluSjs]swl€n~€FXj7G_/?Z/?Z5G_M\iv{’’ƒ••ƒ‰‹|yyy„~‚Œ…’™Š›žŒ›‰ĦĦŒĤ¤Ğ§­¨Ş¤‹Ğ§Ž­İ¨Œ˘ ˆ£ĦŠ£ ‰£ ‰Ħž†ž›ƒ™–€ŽŽz€‚s€s“€§Ħ´­™ğ³Ÿĵ´ ĥĞ”¤‘x•|a˜€d˘Žt£”{¤’y†kuZ•}_–€bƒt_YXO?HDYTiC\pMgxLdtKcsNftPitavxk}~Wiu:Lc1B]->[1B]?Qeiuy“ˆ‹Ž‚~„{y‚{}‡~‹’†“™‹™žŽ—œ‹œŸŒŸŒĦĦŒĤލޣž†¨¤ŒĞ§İĤ¤˘Š˘Ħ‹ Ÿ‰ˆ››…“•‰{…‡vv|onwox}tŽŽ§¤”ħĴ›´›³¨’ĦŽu‘x]•}bŠqŸx˘v”{`ŽsX–}`’}awm[LOECY<>R:F^BOoKJkIHhGQrLVwOXwPWrOexW••}¸³žżığ´Ħ°İ–İ ¨ž‰ĴĦ‹°§‘·°›²š˜™kuuARe5Eb4Fe6Hg6Hg6Hf6Ig8JfWFXmWlzE[o8Ni?XpJatWjtPguRivYnuVhoDWi7H_2B[1AZ3E_Tj>Si=Pf:Lb4E\1@X0>V3BY:LbL^jbqrkywctwduxjyyevv[nrWkrQgsVlwaw}\t}]t{dxydxvgwq_oljyuoz{ˆ€‚ŒiwtXimWimVinQemQdjVfkWhmXlt[ow`rwXhr^lr‡‰İŸŠĦŒq’x[•}bš†mœŠrž‡l“x[–|_‘|`wo\QYI;I9Z6G_MaoVlvPgvG^sCZpY1?\5E`:OgCYn>Vp=Up=Tq@VoQaO_>O^=N\DVcH\jK_mVjrdvv}†}‰‰|nwp[eea`Xtk^‰~n™}‘ı°œĵ³ž½³´ĤŽžˆluYšf¤ŽsĤrĤŽoİ”w˘’wš‘|’‘yUaKEV=CW;[3Ee:OmVp?WqAWsBUp7Ll5Jk3Hg5Jd7Kc7I^8H\:I^9I^:I\CW;;M7@U;AX:U-9Q/V5EZBVf[nso~xswdnioj]‚mZ˜ƒoµ§‘Àĥ Á·ĦÀ· ³³¤Œš‚f‘wZš‚fĤt˘Šj£Œn£‘u¨œ„ݍ’œ›[gNGW>CW;U-9R0?VDZmVl|F[o7Jc8KeK_tJ_vCYsAXrF]uE^u>Uo7Hb:I^^,K[1@W/S6E[GZi[mso}xhrntn_‰q\šƒm·İ‘ÀĥžÂ¸˘ı˘³œ²£Š™d‘wYš‚e£‹mž…fˆl›‹rĞĦŠ´­— Ħ…anSFU>DW<>Q9@V:@W:;P7D]>PnJRnLdWgY^uUg‚ZqŠ`yŠdy…cŽi‘kŽi{‰e|‹eh~‘ivŽeq‹bvdzg–l…—n„”l’ihzŒeh‚iŒgu„`z„c…‰jžšş²›Ĉ½¨ÎĈħÏDzÏȳÒÊĥÓ̸Ò̵‚iP„mS}mRjcJWUDMLD`]V†tĦ™‰ŻĤ”¸°½´˘À·¤À·¤´˘ğħŸıݜ½³˘ıŻž¸­œħ˘²Ħ·Ĥ”Àħžĥ˘Ċ·¤Äĥ˘Äĥ£Àħžż°ĵ­›ĵИ² Ž§•„˘}‰x–r‰ugv`Us^Uyf\†rfœ‹}ĥ¨—À²žÁ³ À²ž°ž¸Ĵœ°—¨ž§œ˘—‹ “ˆž…Ħ•‰Ħ—ŒĦ—Ħ–‹Ÿ”ˆ •Š“‡›… ”†˜‡yŽ|r—…x‹|™†xš‡x”‚v…uklZRm[SšŒ~´İ—żµĦıÀ·˘À·ĦÁ¸¤ğ¨Ċ½ŞĊĵİĈ½ĞÄğ§ş§Àĥ˘Â·˘Â¸£żĥĦ´Ÿğ°œ¸­™¸šĥ› bjkDUdSgsTjxUhwgsy‘’Šħ­žÀı¨Ĉż­ĵݽ¸¨†ˆ…AL_0;U-9R4D[LbtRhy=Rh8Jb>RkOcwI\uDYs?Vq^+;[.>]0@^,<[+9V+8R/:PDGPhc_Š‚u›“‚¨Ħ­‘Ĵ¤¤ˆ™’„‚v]cf:GZ0>V/=T2@V8H]H[i_qs_lluo`Œs]œƒlµĤż³›ÀĥŸż´½²›³£‹†h–|]…iĦ‰jŸˆjš†j™ŒtĤ²Ĵ•¤ˆn|]HWADW=@S:?U:?U99M7AZ>HfFOlKbW_zT^yUi†]p‰_o„]q‡`r‡`t‡`t…`xŠc‘i€”k~“itŽdoˆ`o‰`s‹b|‘g€”k‘iyŽet‹cqˆ`t‰bqˆ`qˆ`p‡`|fŠ”p˜—yµ­•Ĉ½§ÏÇħȳȳɵÓÌ·ÓÌ·ƒjR}jQj`IURBQOHmjb™“…İĦ³Ş—·›½´ĦÁ¸Àĥ£żĥ¤żµ£½³ ĥĴš´İ—°£’Ğ›Š§”„³˘‘ğЙ³ Äĥ˘Ċ·¤Ċĥ£Äĥ£Á²ŸĵĴ™şŞ˜¸§•ŻžŒ§”ƒžŠz‘|mŠte‰se“q—†İ›‹˘‘¤“„şĴšÁ³ À²žÀŻÀŻż°·İ—­Ħ’­Ħ“¨œ˜Œ‚”ˆ›…Ÿ”‰ •‹“‰”Š˘–ŠŸ’†œ„›…‚wnf„si~p‘~p†sgq_U\JCTB=fUOŽ}p¨™‰½³ żĥ˘µ ½´Ÿ´ żĥ˘Á¸¤ı§ğ¨Á·´˘½³ ż³ı­—µ¨‘ĥ§Żž…Ş™€­ž„²§“Ş•ipq@QdE[qHbzQj}Xlxeqt••Œı´¤ÄĴ½Ğĥħ£qvy9DY.9S0S9>T88L5?XPgV?TjMcw;Qm6Lj?UqTh{LczIaz>Wv:Ts9Po9NkCWoH[q>Rk8Lg2Ea->\.>]-<\.=\0@^0?_0>^1?]/>\-;W-:W1=V?HYgff —…½³´žµžÁ·ŸşŻ—ĥĴ”Ħ™‡eii:EV2=R0;R2=R9FVL[b^fcucu]›€gĴ›ğŻ—¸˘Â¸˘ĵ°š¨—~™€a™`œ‚dŸ†h–‚f‚w^ŒsĦĦ„²”´°—Ž—w]mQFU@CV<>R9=R87J5?X=HdFUtOWvOTrOe‚Yh‚ZjYm…\qˆ_q…^tˆ`xd~’h~‘hxŒeo†_d~YcXbWb€Wa€Wb€Xb~Wc€XgƒZcY_~X`Xe‚Zl„]w‡ay‚`‚eĤĦ‰ÂğÌÄŻÎĈħÎĈħÏȳÑÊĥÒËĥudM\TDQOGtsiĦ›ħݘ·œ·›ĥĴ˜µĞ˜¸œğ°œşš·İ–´¤‘Ĥ“€š‚r‡xĞ™‰¸¨•½š½­š½­›ÀħžÁħžżŻ›ĵĞ™¸¨–¸§•² ŽĞ˜‡¤–p‡o`xgŸŽ|°£´¨“³İ•·­™ıš­œŠ¤}şŞ—ż°œğ¨–ħ˜Šħğݘı§•´£‘ħŸİ™‰œ’„w‡~Œ…ˆ‚’‰‚š†œ†ž’ˆ˘—Œ˘—‹œ†•‰€”‡}“‡}‹v‚vozojypj}tn}qj‘…y”ƒğ°žżĥ£À·˘µ ğ²Ÿż·¤À·¤Á·Ĥĵ°ž³˘Ž¨zŸ†lž…i†j˜ƒi’g‡vbraˆzh‘‡v˜•Škvz>Qi=UrB]xKf|Xq}`tzhtt–—Œşµ¤ÁğİО[cm5@U-9R2BYDZnG\r5Jh6LlJ_xUi}F]yAZxQ0;P3>Q8CRERZ\b]†wb“v]„k²£‹³œÂı£Àĥ ¸Ş“˘Œq•z[—|]™`•}`|lU_^JnuZ‚‹jĦ£…´Ż–˘¤ˆw…eRaJEU>>P8;L67G4?W=FbEQqMOoKRrN_}Td}Vd}VjƒZl‚[p‡^t‹asŠau‹bp†^c|X_yV`|V_}VYyRVxRWyRYwRZuQ\xS_|T]{T[yT]zTc{UgzUhuSfoSy|eЧĊ¨Ë­ÌÄŻÎĈħɵÒ˸ÑʵSL?RNGrncĦš‰´Ğ™¸Żşħž¸œĥĴ˜µŞ—µ¨•²˘Ş–£{Ĥ’‚¨•†­œ·§–ğĞ™şŞ—şŞ—ĵĴš½œğޘı¨•¸§”µ£‘³ Ž­šˆĤ’€›†uuf‡oa‹vi‘€ož{´İ”ĥĴ—ıŻ›ıݜ¸­šĞœŠĦŒ|ĥ’ğĞ—°„x²œşĤ”¸¤’ħžŒ²žĞ™‰›‰|‹znŽƒz˜‡š“Š•†‡€‘‡—„œ…™‹š›„›†œ‘†šŽƒ“ˆ}”‰†|Š€x‡}u“†zŸ{ıĴ™´ À·¤µĦĥ£ÂşĤÄşĤżħž´ Œ¤†p~e›e˜fzc€salibbed]cfZdl`jrltxXht>Sm=VsE`{Kg~Zt€k€‚u‚}ŠŽ„ĥħĦĵ·Ĥ£Ħ–RZe2=U.;U6IbD[q?Un3HgWv;Ut?XtH]tG[s;Pl4Fb1AZ3AY7CZ8E\=J`CQeJWjNYkKWhIUeFRdCNaBNa>J_:G^;I_EQb{µ­™ÀĥžÀĥžżµğ°˜µĞ“—„^b`?IU8BQ5>N6?N:DRFQWcd[‹xa”x_˘‹rĥ¨ÀµžÂ¸˘´žħĦ‰—d‘vX‘wZ’x[…pW`XFPUCTZGiqV“•x°Ğ“²–™Ÿu‚fQ_IBR<9G44B2>URm7Hc5D^9G]BN`HTbOZf_ipz€‘•Ž›œ“’”Œƒ‰ƒz‚uyvkomejkU^gN[iR^j†ˆĥ˜żµžÁĥŸÀµÀµžş°š›–†eieMTXBJS:CN:CP=HUJSWlg[x`”x_§’yĥŞ’ÀµŸÀĥŸş˜Ş˜~”z^rUtWˆqWqbNQQAR]FOXDTXFxyb§Ħ‹´˜´°˜¤ĤŒs€cKZC>L77D4BW>OlKJgGMiIRnKWrMXsN]tPgzUewThyUfwTlxWlwVevU[uRUsOTqNRnLOjIMhGLfFKcENdERhGTiHSiGRhGQfFPcETcG`jQƒ‡o³Ż—Çż¨ÌÄÌÄÎĈ°È´ÉµÉ´ÒËĥ~{o˘œ²İ˜³¨—£‘ĴŸĴœŠ§“§”° ğИż°Á²ž³ŸÄ´ Àݚş¨•ı§”ĥ¤’²Ħ²˘‘°ŸŽ¨–…’££Ž}šq”|m˜…už¤˜ˆŞ ­˘³İ–¸š¸™ĵ³ž½´ŸÁ¸¤Àĥ˘½´ŸşŻšŞ›‰£€Żž² ŽħžŒ³ ²ž™‰­™‰¤€—…xˆvkyh`Ё{›“‰š“‰š’‰˜†˜Žƒ”‡£—Š“‚w”„x–ˆ|˜Œ™ƒš„™–‹’ˆ|•‹€–‰}žŒ|ž‹ĵħž´ ĵ³ŸşĤĸğ§“Ĥ†ržeŸƒfœ‚exajfdP\jIVeGSdANc=Jb;IbBOfHWlNavPfxNg{Sm~Kg}Rl}h}v†ƒs~{§˜­Şž……ƒCK]2>V2B\;RpCWq4Hf9MlI]w@WuBZv>Wv;Tt@VsEYsHTCNXVZX}o[v\–zcŻžˆ³œÁĥ ³ĥİ’Ÿ‰o‘vZ‹qU‡pUwgNTN>GN=LYDTaIOWE_aP–Ž{µ­—ĵ´žµħ˜™wdwVKZA?N9G\AOhIQjJPjJRiIVgH^iJekLhjMghMakN[kMYkNZmOUiLOfIIaEH_CH_BG_BIaBKaBLaDObDPdEQdERfFPdEObEQbGYeMs|cĦ˘ˆÀıĦËÂĴÎĊŻÍÄÎĈħÏȳÏÇ´ÎĈ²ÏÈ²Ğ˘‘³İ—´İ–Ħ§•ž‡uĤ‘~³£şĞ˜ż²žÂµĦĥ˘ÄµĦÄ´ Ä³Ÿżš¸‘²ŸŒ´˘³£‘­œ‹£™†xš†w–r’}o™Š{§šŠ²§•³¨–¸Żĥ­›´Ş˜ĥĴ™¸›´ Á¸£µ żĥ˘şÄğĤ¸£¸­™¤”ƒŸŒ|§”„И‡Ĵ—†Ş•„¨•…£‘˜…w…rfs_V|pi‡›”‹”‹—…–Žƒ£˜‰Ħ°˘ŻŸĤ–† ‚—‰|–†z–†yšŒ~–†x–ˆ{’…w‘„w“ƒvš…vĞœ‹·­›ğ²Ÿ´ Àĥ£°°“€}ežƒf ‡jœ…j~qaR[eFTfNZgXcmU`kQ[fGRaW4Gc>Tq;Pl5Ih@TrF\yB[wG_x?WuAXuDWr>Qm>NfBRgSaor{}“•¨Ĥ—³¸²Ÿş³ ½µĦÂşĤÄĵ¨ÂıÂşĤÄğ§À·˘½³ž½´Ÿş²ĥš¨”²Ş–şħ›ÀĥŸÀĥžż´œğħ›ĵ³µĴ–Ş˘Œ•€|ymQY[HPVPUVlcU‹tZ–z`£ˆs¸Ş•Áĥ ż´½ħš³¤Œœ„h‘vYwZˆtXc[EDH9LYBNbG[rQWiN`kTŒ‡s³Ş•şħšµ”ĦĦƒŽjkxXQ_CKZ@WgI]iJ\gH`dGbbGX\DMXAFQ=BM?N=>MY5Kj=Rp8Lk:NmH\vAZxAZxAXtCXsGZt@RnAPhHWkeq{‘”­ŞœğĥżıĤÁş§ÀıÁı¤À¸˘À·˘ÄğĤşÄğĤÄğÂı¤À·˘Âı¤Á¸˘ğħ›¸˜ıݚğħ›½²›ĵħšĵħšıݚşħ›µĞ•ĞĦ‹ž–|{nX][[ZRhaSƒnW–{_Ħƒkݚ…ĵħœÁ·Ħ½²œı­•İ–|”z^sVŽuYoUPM=BK:OaFMcHZrPVjMdqU‰r²İ“·Ĵ•ħ¨ƒš“v†€acgI[bEgiKaeIT]DMYBJV@EV>FX>FX>CT>CS>AQ=@O=EV@I[CK]CM`DObDNaCPcDM`BK^AL]BL\BKZ@L\ARbETcGWbKks\šœƒı´Ä½ĤÊÁĞÌ­ÏĈħÏDzÏÇħȳÏȴɵȳĦ}žˆvžˆvĴš‡ıİ•Ż›À²Â´ µŸÄµ µĦÁ°Ĵšğ§–µŸŻ™ˆ™‡Ğ—…¤–€r‰sg–„vŻ˘’ĥĞšıŻ¸œĵ³˘ĵ³Ħĵ³ µ˘½´˘şħŸı°žı°ĵ²Ÿżĥ£À·¤ÄğĤÄşĤżĥĦĵ³Ÿµ µ˘À·£·Ğ™Ĥ˜ˆ’€r‰sf…oc‚mazf[vf]wke†~wŽˆ™‘‡™’ˆ—…™„ĤšŠ¸Ş•½Ĵ—½Ĵ—ĵĞ–ğİ•ı§“ıĤ“ĥ£‘³ŸŒ³Ħĥ¤‘·Ĥ“³ĦŽ­š‰ĦŠy•|mĦŽ~´¨—ıŻğħŸğݜ³œ‰£‚kŸ‚ež‚ež„g…iƒtabdeox{  –·³˘ı³£µħ˘Ğİ›‡ŒˆP]h;L`=SkJauRhz@Xq?WoTlzl~~lzz†‰„[dm7BX0=X2Db9Pp>Ro9Ml?VsJazSrGZt?PkAOfLYkr{ĦĦ–ĥħĦÀş¨ĊĴĊĞĽİÄĵ¨Ĉ½¨Ĉ½¨Ċĵ§Ĉĵ§ĊğĈĵĤ¸˘ı¤ı¤ÄğĤÀ·˘½³ğħ›ş°šşŻ™¸­–ş–ı˜·Ĵ—¸­–´Ş”§žŠŽŒ{mpgee\qgUƒpYš€e ƒjİ‹v¸Ĥ’³žÀ· ĵ²œ³¤£Œq”z^ˆnS‰qWtdNFI9DQQfF^qPgyD[qCZo\r{n€n{zpwyGTe3@X3A[9Nk?WuOi@NdNZix}~İĤ™ğµ£ÀıĤĵİĈżĞÈÀĴĊ½¨ÄĵĤÄĵ§Ċ½¨Äğ§Äş¤Ċğ¤Ĉ½¨Äğı£ş¤ÄşÀ·˘ÀµŸ³œğ°™ş—ıĴ“şĴ“ğ–·Ş’µİ‘Ĵ£Ž•‘‚qvoondu`‡rYu[ž‚iŸ~fĴ|ğĴ–ÀµŸı£Àµ ŻŸ†›‚f’w[sW‹t[l_KGLJ^AMeFRgJ]pOeqR€{^Œz]‘{[ŒvX…qWzlTX[FBO=9H8>N<;L;8L:?XALkJUtOXvP\wQ`yScyTawSbxT[pNXhKP^FM[DN[DN[DQ^ER`FS`HS^GR[FV\HilVˆ‡n§˘Šğ´žÄ½§ÇÀŞÉÁĴÍĊ°ÎĈħÍİËÍĊ°ÎĈħÑɵÓË·ÑÊĥɵɲ­šż°œ½šŻ›Ż›ĵ­šşİ—ĥ¤’ħŸĴ˜‡Ş–†¤€œ†wym…ma‰qc•o§˜…²Ĥ“ıŻ·­›ıݜ·­šµŞ˜ħ’ŞœŠ›ˆw’~m“n”n’mŒyjˆtgzm›Œ~˜‰Ż£’¸­šğħžğħžĵ³ŸµĦÁ¸¤ÂıĤş§Âş§½µ˘½´Ħ½µ˘µ˘şħž­”𒇓Œƒ‰€“Œƒ–Ž„£—‰µ¨•ÀħÀ°œÁ°š½Ğ•Ĵ—Ĵ—½Ş–ş§”ĥ£´Ÿ‹´ Œ³ŸŒ°Š³Ħ°ŠŞ•ƒ Šy“|nŽvj“…·Şšı¨˜­zĦ„i „gœ€dœ€c›~bš~a™€g Žz²Ĥ”ĥ£Ħ•ˆ‹ˆty}jotekpHVc;L_DZlLevJ`u>VnIcuWnyUgpDTe7CZ5AZ5Fd7Lo;Op?SpC[wH`{=Wt=UsEWqSX-=X/@[7Lf?XsF]v>VnD^tG_sL:@R:?T;BX=JdCE]AAXANjJQnMUvQcYi…\gYavTmy\–˜yިˆħŽĥħ”ı³˜½µ›À·žş˘Âş£ż· Âı£ĊğĤĈ½§Ç¨ÉÁĞÌÄËÌİÌÄŻËÂËÂÉÁĴÍĊħÎĈ²ÈµÈĥÓÌşĠÎğÔÍ·£}—‚t’}oŠth†qd…qc{lœ‰w¤‘Ş™‡ŸŒ´§”¸­šğ°žżµ£µ£ğ² ³¨—§™ˆ™‡uŽzg‰s_€iWˆpZ…lWˆoY…lVƒjUŒt\‹rZ’x^‘y`„lU‰qY‚kUw`MzcOs]LzcRt^Q|h]™Š}Ż£“ıŻ›½³ żµĦ´ ½´Ħµ˘żĥ£ÂıĤÀ·£ğ²Ÿ·¨Ÿ”†yŸ~³ĦŽıĤ’ıĤ’ıĤ’¸‘şĤ“ı¤·˘Ž¸µ˘Ž²ž‹°œˆŻ›ˆ™†Ğ•ƒħœ‰ħœˆ­˜…Ğ–ƒĤ‘˘Œ{Œtg”}pŞ™‰İ˘†rš|b•v[”qX“nU“nV”pWlVhXœoˆXbjFTd9G]/=Y,;X,BVRm8Nk@Zs=Up5D\.Xv7Ml4AY/=W2Df2Eh1De:Nn?Ss5Kp4Gl3Dd4C_1Ba5Kl8Qq9Rq@XtTiyWlyQjzIcxWnzw…‚{‰ƒn€u†‚‡“ˆ”šŠ•˜ˆŒ‡‰~šš°Ğšĥ˘şĤşĤÄğ§ÁĥĦĥ¤¨Œt €f f „iݏu§Žt¤ˆo™w`’kWdRŒaQfT˜xbĞ”}ğ­–ż´ż´ż´ĵ°š´§¤‘x˜b”|_z`oYx`w[ŒrVjO}iOveNg_Nlk[ŒŒwŸ‡­¨’ĥŻ™ğħ™·Ż—›š]hOI[BI]ABS=MbDTlIVjIP`GYlOe|Yt‹ao‡_l^w‹d{‘hzh’yħİ’Á¸ĦÂı˘Ċĵ¤Ĉ½ĤĈ½Ċğ£Ĉ½§Ç¨Ĉĵ§È½İÌÉÀĞÇİÈÀĞĈ½¨ÄğĤÄşĤĊğ§Ċğ¨ÈżĞËÌŻÍĊħÍĊħɵÒËĥÑÊ´ĥИğħş°œĵ³ µ˘Àĥ£ıĤÂıÁ¸£Äğ§ÂıÀĥ£ĵ²Ÿ´İ–§šŠˆte|dS€gSfQŒs[ˆpYŒt\‹rYt[ŠqW†nTiP„jPˆoS€gO}eLhO}fOgP„lT†lT|dN‚iQ‡nWfR†mW|dQx`P}fW†sdĦ•„³İ—¸Żĵ³ ½³Ħıݜݤ‘ݝŒ£’µŞ˜”ƒ†uħž‹µĦŽ™†·£şĤ’ğ¨”ğ¨”ğ§“ıĤ‘ı‘¸¤ı·£ĥĦħ‰°›ˆ³‰´Š´žŠ´‰­–„¤}œ…uŠreŸ‰{İ‡v¤‡kœ`š|^€bĦ‡lݜ‡şĞ—Àµ˘Âş§Â𨽸§œ”LWf3@X.=X2Eb5No6Kh8Qo8Qq4Eb2>W/^1Cd=Pp9Nq7Jl2Dd.>]1A`3Fh4Ii5Ji7Kh8Mj=Sn@Vn=Uo@P;I\@OdCRfFQbG\nN`uUrŠbpŠap‡ap…a{h}‘j”yŻİ’ż· Á¸ĦÄğ£Äğ£Ĉ½Ĉ½ĊĵĈĵ§¸£Ĉğ§ËËÈżŞĈİĊĵĤÀµ ıĴ—ı­˜½²žĊğ§ÊÁ­ÌÎĊħÎdzÏÇ´È´ÏÇħĵ²žÀ·˘´ µĦ´Ħ´ żµ Àµ ż´ Äş§Ċğ¨ż´ ĥޘ||hZu]Mx`M†mW‚iSt\v]Žu\vYŒsY…mS‚iQyaK€gN‰pT‡mR…kQƒiQ|eNgPƒjR…lS‚iP€gPƒiSfP„jThRƒkV…nZ~hY†sdݝŒş°ž½³˘ğ°žĴž‹”‚m„q_|jĦ‘›†t­˜…ş§“ĵİ”ıĤĵİ“½Ş•Ğ—Ĵ˜½Ş–ĵİ•şĤ’ışĤ‘ı·˘Ž²ž‹°›‡ħ›‡µžŠµŸ‹µž‹ħšˆ¨‘€˘‹{”|n˜t²œŒ­Œ|§‰rŸ‚e›}_ž€aŸ‚d£‹o°ž‡³žĊĵ¨Ä½Şżı¨§™Wak4C[-=Z2Gf3Lm4Jg7On5Jj9F_:E[9D\3@\5@[3B`4Hm4Il3Fe0@_0?_.?a1De6Hg:Mk=Pl>Rl@Sn;Pl:Pm:Qm?SmG^sWnz]t}[r|_u|g{}x…~‰ƒjyz`qx|„­¨—À¸¤şĤÁ·¤ĵħ³ĤĴš¤Œq˘ˆmš~e™w`™u_›w`šxb˜t_‘lYš|fĞ–€ş­—żµŸÁĥĦÁ· ż´ž¸Ĵ•ħ£‹˘w—b™€b™ƒh’{auY‹rV‹rW‹uYuiORSBGL?U`I]pPavSavSgxVx€b–•zŞĤŽĦž†emVJYAFW=>M9CVKc5B]1>[/Cg0Cf1Bb0Bb0Bc/Cf;NmDVr@Tr@Vs@Ur:On8NlBL?N9CU;GY=I[?HZ@WkIWmLawUr‰`|’f‚•kvŒd|h‚m˘ž†ĵ´œĊĵ¤ÊÁŞÇĤĈĵ£Ċğ¤Ĉ½§Â¸¤ı¤ÉŞË­ËÉÀŞĊĵ§ĵŻ˜Ş•{“z`‰pX’w`³Ÿ‹ÄşĤÉÀĴÌİÍĈħÌĊħÌİÍĈݵ˘ÂıÁıÁ¸£ÂıÀĥ˘Àµ ş—·§Žµ˘ˆ³ †Ĵ—€ž‡qŠr^€hS‹rZ‡oWŒs[ŽuY‘wZvXŠpT‰oU…kR…lR€hP‚iQ‡nV„kT‡oX‚iT‹s\„kT†mU„jRˆoTˆmRŠoTŒqU†kR‰nUŠpWu[ŠrZ~gT|eSr]P’r›‹yƒq_wcPwbLuaKt`N–‚p³Ÿ‹½İ”ÀĴ–Á­—Á—Á­˜½Ş•ğ§“À­™À­™Á™À­—Ş•şĤ‘ıĤıĤ‘·£°›ˆħ›ˆ³‰ĥ ²›ˆ°š‡Ż™…Ş”‚…vˆqd”„ĵ­›ı£‘µ˜„{˘k™v]—x]ž…i²£ŒşĤÇżĴ½ĞНbjp9E[0@Z5Li4Kj4Ji4Ig5EaAPi^lzbo}L\s9Eb1=[.>a/@b0Cf2Fj1Ei1Fl5Jm6Km5Jj:Pk7Ml3Ij5Jj;Rn>UqD\vLezLeyF_vC[qDZnH]nRdmgsru}z‡‚–›´Żžż·¤Á·¤ş™Ĵšƒœƒh˜}aŸƒgĤ‹n¤†lšx_•oX—oZœxa˘…lĴ˜~ĵݘ¸¤Ċğ§żµ ż´ž´ğŻ—´ŒŞ–|˜€c•|_—bv[‰oSŽuX•€f•„n‚zkY]ODQ>?N:CU>MaEKcFPjJUmLVnM^tRp|\vŠŒsXcKJY@BQ;EVL^@GY>QeETiHTkKg€YwŽc}‘f{‘g‚“l€Œlœ›‚¸ħ™À·ŸĈ½ĤÇĤȽĈğ£Ç½ĤĊğĤĈğĤǽİÉÀĴÉÀĴĈ½İı¤·Ĥ ˆot\…kTŠmW­’ĊıÌÂÌİÍĊħÍĊ°ÌÄŻÎĊż·¤ż·¤ÁıĤÂş§ğ¨Á¸Àĥ£ğŻ™ĥ¤‰Ż—|Ĥvž…n…n•|d…lVŒt[Œt[tYŒsVŒsVŒsVŠqVŠpW…kS†mU~eOfNƒjR„kT…nW}dP†oY{bNhR}cM‡nV†lSv\ŒqV…jQ…kR‰pUtZ‘y`ya€hUmVHkWJubQhTEoZGs^IzdOƒnZ¨”€¸¤½¨“½¨’Ş•ÀĴ–Ş•ğ§’ĵİ”À­˜À­˜żĴ–ÀĴ—Еޕĵİ“ş¨“ı§“ħŠŞ“‚—…µž‹³œ‰°š‡Żšˆ˜†¤|ŽwjžŠ{ğŻż² À­›İ˜²ŒŸjš{`˘ˆkĥĤŽıĈĞÂğݰĴŸckr9G^1A\4Hf3Gf3Hh6Gc:JeTcw_m|Xh}M^y6Ee.<[-<^/@d1Dh1Dg0Bd0Ce4Ff4Fc3E`4Gb3Fc1Ec1Ee2Fc5He9PlC\rMfxJcxLcvNdsXmvu‚ Ħ”²ž·³˘ş´˘ĵµ£Âş§ĵ²Ÿž‰Ÿˆq’v\•x\˜y^|cšq\”kX˜p\Ħ~hĴ’z´˘Šż²œÇ½§Èİǽ¨Â¸¤´žş—·¨Ğ™€ž†i•{]–|`“z^‹rW‹qW”}b˜‡p—Ž}’Ž~dlWEU??Q;@R;H\ALfGJeGPkJTlJYrN_vSxc’’yks[Q]GES?FV=L^@RdDI[@LaBOeEQgH`yUs‹b|’h†—n™rƒl–˜}ş´›ğ£Ċĵ¤Ċğ£Äş˘Äş¤Ĉ½§ÈżŞÇ½İÈĞÊÁ­ÈÀĞĈ½İÁµĦħ†•{c‰nV…iRp]ĥ˜ˆÇş§ÍÄŻÎĈ²ÎĈ²ÌİÌÍĊ­ĵµ˘ş²Ÿż·¤À¸ÁıĤÁ¸ĤżµĦşŻš·¨‘Ĵ˜€”~iŽua˜g™hˆqZ†nWˆoU†nS‹rVŽuXwYŽuY’x[…kT†lTfO|cL}eO|cO|dOrZHx`Lu]K~fR{bNjTx`L‰pXsX‰oU„iP‡mS‰oU’z`–f„mXs\LbOCbOBXF;gSBzcM‚lVxcݜˆşĤ‘ĵ¨”ĵ¨”½Ş–żĴ—½Ş–ĵİ”ĵŞ•żĴ˜À­˜żĞ–İ•½İ”żĴ–ż­—Ĵ—ı§“Ż›‰£Œ|İ‘€²›‰³Š°šˆ²Šħœ‰¨’’|n•r¸Ĵ›Á·¤ÄıĤı§ıИ ‡n–ya£‹p¸Ş”Ċĵ¨ÇżĴÂĵĞĴݝ\fq7E^0A_0De1Eg3Hi6GdBSnWf|WfzFYx;Os1Aa.<[-=_0@b1A_1@_/@_1B_9Je7Hb5F`1C`2Db1Dd/Aa.>\/?]1Eb9OiC[rJdyKexOfu[pyo}|˘Ħ“ş´˘Âğ¨Äĵ¨À¸ż·¤·Ĵ˜ž‹vŒqZŒlTmU’jU•lYšsbĦ‚pݏx´Ħа›¸¤Ĉ½¨ÉÀĞÊÀĞǽ§ÄşĤÀĥĦµ¨’ޘš‚gvZ‘wZ’y\ŽwYŒtZy`—†o“€˘œŠŸš‡ipZFU@@Q;AU[0=Y3?\3?[2?[5AZ4B[5C];Ia`L?iUGu`OuaOwcQq]MgTFhRCnWFybN}dOŽuZ•{_˜~a—}_”|\“z[“{`’z`…nWr]KVD:P>7^J>}eN€iS€jYĤ’€¸‘ğ¨“ĵİ”½Ş•Ğ•ĵ¨“ĵ¨”ĵİ•żĞ—Á­™ÀĴ—ÀĴ—°›Á°šÀ˜½Ĵ˜´ĦŸ‡{h`ƒmdŸ‡z²œŠ·£¸¤µ Œ­™ˆ‘t‰wkħ”³ Àµ Á·˘ğݚĴšƒµ£Áµ˘ÇĴÇż­Ĉż­Àşİ˘ –V`m;H_2Ca2Fh5Il;NnN_tZh{L\uSjJasPiy[r|`u{y‚}­§—ÀıĤÄĵİĈ½ŞÀĥ£İ˜„Žs^~YIƒZJˆfS›ƒnݟ‹ı­—½³şĤÂıÄĵ¨Ċ½¨ÈżĞÄğ§ÇŞĊĵ¨Á·¤ğݚ§–}w]fO‚hOƒlQ€mQ€rW‹~h𑁍—ĥŻ›ĥ𤠋ajUI\B?Q;AV;@W;@VI[@\nNt…_ƒh|‡eueĦƒ½¸ŸĊ½ĤĊğ£Á·ŸÀ·ŸÁı˘Ċ½¨ÊÁĴÊÀĞÊżŞÉżŞĊĵĤÉÀĞĈ½İµ¨•™‡t‘}l”„ĥËÂŻÍİÎĊħÍĊħÌİËÄŻÌËĞ€‹h”˜z¨ŽŞ“µ°™ş´ĵµž²İ“–ˆvhUIqZJ…lUx_‰pW€hR„jRˆoT‹qV”y[–|`“y_‰oWy`MsZIkSC_JQs;Mm9Ig6E`9EY=HXFP]T_ffru‰‡š•ŞŞž´ħ˘ı´£ı² µĴ™³Ĵ›­İ™™š‘lvxJUd9G`>LeXfpr{{^luCRd;Lc@TlF^vQizarz“‘‡·ŻžÀ¸Ĥż··Ĵ™—ƒp‡hT‡dPt]İš†½²žÂ¸£ÄĵĤğĈ½İĊŞÄĵ§ÄğÄğ§Ĉ½İıĤ´Ħ³¤xv\‚hP~fOweKtiOv`‘ŠzŸŽ³Ğ—½µĦÂş½ĥ °Ş•x~hWhLDX>BX=D[=AX<@X=IeDMlIMjIXtPfyWŠq²Ğ•ıħ›ħ§’Žˆt\]OW[JQ[HNWGQ[KKWEGS@KZB[mNm\q~aˆ‘u²°–ğ¤Ĉ½§ÀµŸ­ ‰œ“yޤˆż·ĦÇİÉŞÇĵ¨È¨È¨ÊÁĴÊ­ǿŞÄğĤÄşĊğĤÊÁ­Ê­ÍİÍĊħÍĊħÍĊħÍĊħÌİËÄ­d{WeuWr`Œ—vİŒ²Ż˜ĥݜš‰r_SqYJƒjTt[’y^ŒrX…kS€hQ†mSŽt[”{`•}dt^}eRfNAaJ>iSD„mVy`”~a˜€_”|]–_‰qW„kRˆpUˆpU„mU{fQhRDiRDfSŽv^‘y_ŒtX…mSŠrYŒsY†nWqZIVB8G61N<5jTEybNt]L†q`¨”·¤ĵ§“ğĤ‘Ğ–À­™À­˜ÀĴ—żĞ—½İ•Ş–İ•żĞ—żĴ˜ĵİ”¸¤‘ĥ˘´ Ž²‹°šˆħœŠµ ŒĥĦħœˆŞ•ƒš‡y{i_vdVŒyg­œ…ıĴ–½³ŸÁ·£Äğ§Èż­ÈÀÉÁŻÈÁŻÇÁŻı´ˆˆ†BOf7Jj7Km?QoM^y=Qu7Kp8Ig7E]9EZEN[]ch†ˆ££—²°˘ĵıİżşİÂĵŞĈĴÂıĤ³ž½²ĵ³Ÿ¸°œĥ°Ÿ˘ •pvxHUgHUityxžœŒŠUal>L`9Jd9NmBYtOduy|yĴ—ğ´˘ĥ¤·œ—…ucR…fR•~g²¤½³žÂı¤ĈİĈŞÈÀĴÇżĴĽİÂşĊĵ¨Äğ§ÀµĦ·İ•Ĥ”}”{a†kS„lS{jNlbJogU…€q£²Ş—¸°›ĵ´ŸşÀı¤·ħ‡ˆu\iOIZAAU;CX;AV;AX=C\@KeFQiI`xTr€]š˜{·Ż—ĵ³´Ğ–‰xVWNV\KahQciUbh[W\TPWMR]LVeO_oWp{f˘£Œ¸ĦğĈĵ¨żµĦĤ›…‰ƒkŒqħŞ’şÇ½ŞÇ½ŞÇ½İǽ¨Ç¨ÇżİÇżŞÇİĊĵ§şÈżŞÊ­ÍĊħÍĊħÍĊħÍĊħÍĊ°ÍĊ°ÍĊŻd{Xj|\wƒeŠ’u¤ħĴ–ħ¨–’„vlWK|cP†nVŽv\v\ˆoV‚iQ}dM‚iPŒrX“z`x_†mXrYI`I=[F;xaM‰qW‹sXwY“y[w\ŒtZ„mT~fOƒkSiP„lS†oWpZIfPBv^KˆpW‰qWŒsWiQ‡nUŒtYŒs[v_LVB7F5/J93gSD|ePzdN~jX‹x­š†´ž‰´ž‰ğĤ‘½Ş•żĴ—Ğ—½Ş•½İ•½İ•ĵ¨”½Ş•żĞ—𧓸’·£ĥĦŽ´‹ħ›Š²‹²Š²Š˜…¨’˜ƒuyg[{gTˆu`Ğ›ƒş™Á·£Âış§Áı§Çż­Ë°Ë°ÄĵŞĞĤ™jov?Nh:Nn{dP|eO€jTŽygŸzĞ—„²œˆ·˘Žğ§’ĵİ•½Ş•½İ•ğ§“şĤ’ĵ§“½¨”½¨“şĤ’·’ĥ£³žŒ²œŠŻ™ˆ°›Š˜‡­—…Ş”ƒ¤Ž{nyfVzfQkX¨—€ğ°œÂıĤĊ½ŞĊ½ĞÂşİÉÁŻË°ĈвМ‰‰…LYm;MmK`;Ia=LcU^jywr†z”‡”Ž‚|tskdpa›Šwĥݔ¸£ÇżŞÉÁ­ÈÁ­ÊŻËŻËÂŻÈżĞĊğ§ÁĥĦĥ§’y’y^vYˆtWvgMjbKqm^—’‚²Ş—ı°żĥ˘Âı¤Âı£żĥĦµĦĵ´Ÿ³˜‹‘w[jQGWBEW?G[@G]BK_CMcFVkLfvVz„d›˜´Ĵ”µž½´žĤ Žei\^mSfwUnYs\‚eœ˜‚ħ­šİ” ‘·Żı§ĈşĤĈıÄ·£½°—Ž{nv[kxWw|`¨ ‹ıÇĵ¨Ç½¨ÈżŞĈ½¨şÇ¨Ç¨ÉÀĞÇİË­Ìİ˯ËÍİËËÍĊ°ÎĈŻLUDPYFlu\“•|­Ş”´­š˘—‡hVLeOCzaNŽv]x]ˆnU…lS‡mTŠpVŽuYw]x_‡oXv^K`J=S@6q[IˆpVˆoTŠpU‰pU‡nTt]Jr[I{cNzcNs\I}eMxbK{dMnXEnWE‚iQ‰oV…lRƒkPƒjQ†mTˆoV…mUpYHL:2C3.F4/P=5nYIjU†mV€jV‹vd Œy­˜…´ŸŒ¸£ğ§“ĵ¨”Ğ–½İ”ĵ§’½İ”Ş•½İ”ğİ”ş¨•ş¨”ĥ˘Ž³Š™‡­˜‡Ş•…Ğ–…§‘œ†x~j^yeSzfP{hVİš…żµ˘Ċ½ŞĊ½ĞÀı¨ż¸§ÈÀÊÂŻÄ½Ĵ§£—kqwARm=OmHYrQbz>Pq8GdTA7w`LˆnUŒrV‹pU‰oU…lSpZH‚jS‡mSƒjQybM€gPhP~gOnWDyaK‡mT‹pW„kQ„jQ‡nUŽv]Žv\‰qYt^LL:2C3.F50S@7bMAv_MƒkU„lV|fSŠsbœ†tİ•‚²ž‹¸‘ğ¨“Ğ—½İ”ğĤ‘½İ”ÀĴ˜À˜½Ş–şİ•ı§“µ ²œŠĞ–…Ş•„§“‚¨“ƒŸ‰z‹uit`RwcPubN€m[°˘ÂıĤÂş§ĵµ¤Ĵ§™³ŸĈż­ÉÂħ½·§”’ŒU`pBTpGWoTdxBSq:Id?K]V]b‰„uĞĦ‹ı°œÀ¸ĤÁı§Âş§ş¨ÄğİĈ½ĞÈżĴĈŞÉÁŻÈÀ­ÇĞÈÀĴÊÁÊÂŻÉÁ­ÇżĴĈĴɰÈÀĈżĴÈÁÉÁÈÀĴÄĵ¨ż¸°Ĵ˜™xXcnJWgLXfU`hrxv––‹Ş•·°žÁ¸ĤÇĞĊĵ¨Ç½İĈ½İĊĵ¨ĈĞĊ½ŞĊĵ¨Â¸ĵŻ›­†ŸŠq’z`‰qU†qT~lPf[EXRExtf¤Œ¸ħĥ ½´Ÿ½´ À·£şĤÁ¸£´ şħı°›²Ĵ”Ħ£†€ky…ft~dhpZ[fQS`K^kRy„e £…ş³šÀ· À· ½´ž°¨•wvkYbQ^sQc|Tg~Vq‚\‡m²İ“ĵĴšğ•Á–›À”‡ż’‡ĵ†}³~uˆfZg_KbdLjmS‹†oĵħžÉĞËÁÎĊħËÂ­ÈżŞĈ½¨Ĉ½§Ĉ½¨Ç¨ËÂ­ÌŻÊÁĴËÁĴÊÁĴÊÁ­Ê­Ê­ÍĊŻ——Ş§’´­™ĥŻ›µ­™ŻĤ•‹~qZIAhRE}eQv^Žw^‹rY†lRˆnS†lQŠpU‹rX‰qX{cNiRB]G;VB7~gPˆoUŠoU‡mT†mTiQlWF„lTˆoU‚iQiR…lS„mTiSkVEƒkS‹qVqVŠoT„iQ‹rY—€f”}d€hSePBH70F5/H70Q>5`L@bM@s]L€iT‚kT†oXƒkY“|kĦŽ|°ž‰·¤ĵİ”ĵİ”ĵ¨“½İ”Á˜Á˜Ĵ—ıİ–·¤‘´Ÿ²œ‹­—†İ”ƒĤ‘€Ÿˆyylq]RjVIydPs`Nƒp_³‘ıÀı§Ğ§˜…”—ı޽­İšoruGTiEVoQ`vEUokSE{bN‚iTƒjT†mTŠpU…kQ„kQ‰pWˆoV…lU}eOmVD_I]RBYOCoeW“‡vŞœˆ²Ĥ’¸­™ı™¸šğħž½´ ĵ²ŸşħžĥĴ˜³İ”ħ§’ĤĦ‡‹’oiŽ”u£Ħ‰ħĞ•ĥŻ™³Ĵ•´­–ş²›À¸˘Á·˘Áĥ Àĥ ¸°š˜—}emUKTBYjJ_pMclLlgKƒ\MĦWTİYWŞ[X`\²e_´a^ĥY[·TX·SX¸QX¸SX·VY´TXĴZ\µ‚{ÀŸ“ĊݜǟȰĦÉ´¤È·ĤÈğ§ÊżĞĈĵ§Ċĵ§ĈĵĤǨĈĵ§ÇżŞÇ¨ĊĵĤÉÁĞÌĴÂşİş§Á¸ĵ³žĥĴ˜ž’‚bQG`L@oWG|cNgQ‰pWsYŠpWˆnTŠpVv\v\‰pX€hSt\JeN@WC8w`M‚hSˆnV‚iQ‰pT‰pU„kSt^JlVEiSDjTEt^KiS„lTˆoVŒsVŒsV…lRŠqUv[w]t]ˆpYwaOO>7I93UA7[G;bM?^I6]HYG>vcUİšŠµ£ğµ˘˘™]gr=KbK[oP_sT`oLWhIRcJR_bff†u­Ÿ†À´žËħÍĈµÎĈ´ËÂŻĈğ¨şĴ˜›ƒŞ’vr˜†n•Šy·ıĤı·˘ż´Ħ³ ż³ ¸Ş–Ÿ‹Ğš†¨”}£u˜€i•}e”{b’x`w`Žu^Žu\‹s[Šr[Œt\•f™d›ƒf–}a‹rXŒrXuZ”|_—€c•}`˜d–a’z\ŽwZwZ‰pU†kQgN~dLzbIu]Gt\Gs\Fp[FycL~gN…nT†nTŽuY”{`—dœ…iž‡k ‰oĦ‹rİ–~Ĵœ†£–ƒ„t‰}o…t†‰mw„`j~Yi{Xr{]‚‚i“‘z§˘Œ¸ŻšÁ´Ħ³Ÿ­šş§“”~{tZe\I^OChPCpQE|TI•\Q¤cX­aZ²ZY´TXıTZ½V]W^Z`½[_ğY^şTZĵQYğOYıPW´JTGQĞHR²RZı[a·Y_ĥ[_µhhĵ‹‚ÄĞ›Éğ¨ËÀŞÍĴÍÄĈ½ĤÈİÊÁĞÉżİÈż¨Éż¨ÇĴ¸¤µ ĵ³ž´Ş—‘„v[JBgQCt\J|dN‰pWŽt[‘w\sXŒsXŒsX‡nUŒsYw]€gQqYFfO@ZE9XC9w`N‹s\’x]’x\uXŠqV‹rVuZsX‰pW†mU†mU‰pV‹sWuYŒrWv]—e”}dˆpZiTxbNRA8M<5]I=lUF€gRu]J}fQmXFoYE{dLŠrV‡pU‚kQƒmT†oWjV{dSjX‰s_Žxbw_‘zay`’z_˜‚d™ƒe”}b’{a–d“|b„nYu_McOBYFK:4R@8]I=s\L‡oYw_L|dOoXFxbJzcL†nS„lQ‡oTˆpV‘y]”{_ŒsZ†nXgT{eT|fUjWkX…pZŽyaŽyc‰t_†q]‰s_~iVt^NpZJdPCVD;VDQM=PM=RM=YSAaYFhdOolVqmUpjQriOukOujN}pR†wY{]‘{]ŽuYŽsX“y[’z\y[…pUpbMe]KbdLZjLWqM[uOZuO\tPgsUŒ€j݆x´{q²sjŻhbĞd^§h\§h[dWŞ]V[W°SUĥPW¸OWıNWĥMVĥMVıOW¸OX¸NXıNX·LV·NWĥPW·OXµMV´JT°GQ­DO­CN´HS³GQĥKTşTZĵY]ĵ[_şnkÁŽÇĥ˘ÊżİËÁĴÉżİÉżİÉÀİÉż¨È§Ç§ĊĵİÄğ§şÁ¸¤·­š‹}n]KBqZI}fQ‚jT…lUŒsZv\ŒsY…mS†nT‹qVtY‘x_Šr[gRx`MqXH^H=]I>u^Nv_“z`‘v[–}`“z^™~b›‚d”|b—~e–}d•|b”|a•|b”{`w]…mV‚jUwaNhSFO>6N<5YE;ePCv_N‡oZybN„lU{dM}fMybL…lRƒkQŒsXŒtYuZ’y]—~`•|_“z^‘y_‹t\„nY…oY„nXŒv`‰t_Šua‹vb“}hybˆr\ycP[H>RA9]KB„paħ¤“½µ°Ĵ }ƒ†HVm@I\;DVAIWNT[kle‘ˆs¨˜~´£ˆżħšÄş¨Â¸ĵ°µ§‘ħž„²€²œ˜z¨’uĦŒsŸŽy§–~И}İ•z¨’w¤Œoƒgž„gĦˆiŸ„e–{`•|a”{`‘y^z]†rWoT€pTpTzkPh_I[UEVRETQFZXNdbXsna‹‚m…sšŽx•Œyœ•ƒ£›‡š”–”~—‘‘ˆv€udvgTl]IcUCYN?PI]WMwsf†‚u…ƒy}}szzq{|r||qssioncnl^mk[khWrkXvnX|qXtY}pVzkQnR…pT…qUi`LPWEOaGOeEOhFWoKdjL…YMŸTRĴZXħd^ĥ`^ı^^şY]şUZıPX¸NWµMVIQJRMSŻOT°PU²PW³PW°NU°KTıS[¸[_ĥ\^·_^·^^¸]^·\]µ\]´VZ·U[·W\µPWµMUşRZÀV^ÀV^½X^ğdfÀ”‰ĊµĦǽ§ÈżİÉÀİǧÉÀŞËÂĞÊÁ¨µĦÁ¸¤şĤÂıĵ³Ħ“†w`NEnXIs\Jx_LƒjTŠqY‡mVŒrX‚iQ„kR…mS„lSŒt[”}dŽv^ƒlUu^JiRC[G;YE5XC9cNAiWŠs]‡oV…lUtZ‡oTŒsWŒsVuW‡oTŽvY“{]–}^•|^—_”|_’z_™€cšc–~aŽv\‘y^—eŸ‰p˜i’{dŽvahUr\MjTEYF<_LB€k^–†¸ħ˘£Ħ˜kqxJSc@HZLOYdc`…pޘ{´Ħƒı§Š½–ż³ ½°ŻˆĤv£ŠoĤŒo§p¤Œp¤ŒoĦ‰k˘Šk›ƒgĦˆkĤnĦˆlœ…iž‡lŸ‡iŸˆj—‚f{_€nVxkWsiYmfXgaThaRngXkdUe_Og^LjaLk`LpcMvfP}mV€k¤™†³Ş˜´Ĵ˜°İ–²Ş•µĴ—ĥĦĥĦş³ž·Ż›´Ĵ—²¨’İš„•}dˆnS†kQ€gLtaHg\E]VEe^P…s¨ Ž³Ĵš´­œ²Ĵš²Ğš³­›Żİ—Ğ”ĤĦ˘œ‰™‡’‹‰{†…x{zltrcso^skVxlS{lQzkQobMSTELZCK`CMbCWhHh\FQK¤]VĞbZ³^\şX\V\½T[ğQY¸MV´IS°JRħNU³TW°YX­ZW­]Yħ\Y´[[ħUY²NVşQYşZ_şW]ğT[ĵT[½T]ğU\ĥU\³W[ĥ[]·Z]´RXµMVµQX½U\ÀU^S\ĵW^½{vĊ­›ĈşÇ½ĤȧĈ½È§ËÁŞËÁ¨ĥ­˜µ˘ÂıĤş§´£’…x]LDePCkTEw_L‚iT†nW…mTŒsY†lUˆoVv[w\‘w]–}c‘y_‰qXv^KeN@`J=\GeOBv_NŒt^w`“z_’y]’y]vYvZ“z\”z\‘wZ‘y\”{_›‚b—bšc™b”|^•}_’y]“z^t[’z`™‚i†o—h‡p\~gVr\MfRF^J?VDgQC{cPƒjTŽtZˆoWv\•}`„e–}^”{^•}_“z]—~_œ„dšb˜~_–~_œ„c’z]‹rX‰pV”z^–}^•{^“{a›ƒi’zb’zb…mZu`QlWIcPDXF=YG>t`U“…yž™xz{SYeJP]SUZ~sd sݚ}³Ÿµ¤ŠıŞ•ĥ¨•ŸˆĤ’xž†kž…i—€f“|c—~bšc˜}b•{`–|a–}a–c‘b~c‚t^skZkfYmi^urg{o“ˆx˜Šu—†nžx™}š‘zİš·œş³¤°Ş›˘š‰—}Š„wpk`^ZRZULb]Nr]§›‡ĵ³Ÿ¸ħıħĥ­™ğ³Ÿż·¤ğ²žĥĴ—Ħ‹£‘x˜€fŒrXŠpU‡oT}jNrdJ_WEc_T‰t•~£›Š°¨“´Ĵ˜½´ À·£À¸£À·£Á¸£À·˘µ ÂşĤÀıĤÂğ¨ğİÂş§·¤·ŻĤ“˘›‰‹‡ysqg_^UMTCEP=DO;GQ;ROdNAcMAv_M‡oW‚iStY‹rYw\”|]’y]‘y\•|^–~`›„dœ…d†d™a“z]’z]…d”}^ŒtY‰pWsZv\“z^—€f†mŠs\Šr[hTq[KiUGbODVE<\JBxh^Šƒ|lnsNUaLQ[\]^‡}m§“w™{²œ~µ£‰µĤ‘Ĵ›†ĦtŸ‰n†jœƒf›d–{a•{a–z`“x]”{_y^‰y^Šz`…w`~taysdwtjzzqŒ¤ “Ĵ£”˘”€ŸŠo ‡iž†h–„hwoZ}v_Ĥ›ƒĵ´£ĵĞĵĞż·Ĥż·ż·ĥ›§Ħ‘“Ž€~|svriš“…ĵ´˘ż¸½µ˘ş²žĵ´Ħµ˘·Ĵ–Н† t›‡o™‚g‰pV„lRjPvdKl_Gg^LlfYqi]jbVpi\އq…·­˜À·˘Âı¤Áı¤Âı£Á¸£ÁıÁıĤÁşĤÁş§ÄĵŞÇżĴĊ½İż·£ż·˘ĵ³žµ­™­§–”‘‚agWOZEIS>HN;TI;„IFĴTUĥa_¸[]·V[´PWħKT°LT´SX´[[³b^³\[µRW¸PXıOWıMV¸NWĥMV¸PXğR[ĵQZ¸NY´LWµNX³LVĥOYĥNX·KVıKVıKWĥKW³LV´RY·Z]ı[^µRXµJTıKVĵNYşW^żƒÈ·£ËÀĞÌÂÌËÁĞÉż§Ç¤ps\Œ„q­£‘½³Ħ½´£¤™ŒgWNeRElVGyaO‚iT…lVŠrY„lVu]x`’x^“za‘w]v\sY…lT~eOrZIxaNmWG_I=\G;\G;cM@aK?`K?ePB`K?cN@ZF;cN@dOAdNAlUFkTEgPBfOBr[K{cQˆpY–}_tYŽtYv[tYŠsXŠrY’z^’z]“z^™bœ„cĦŠg˜€`’z]‘y\•}^tY‰pVtYŽu[’x^–}b˜€g–~e‹s\‚jUv_NlWHlWH_LBUE=_PGg_[\`fLS^MQWeb^’†r§”zݚ~²€µ˘‰ŻžˆŸ‹s—€f›ƒfš‚e—~b‘y_x^y^x]Œu[ˆw]Š{`…yazs`xrc{oŠ€£ “ħ­ ı´ĵĥĤşħŸŸŠĦ‹o¤‰iĦ„d †faumTgdQ™“}ş³ĦÂşİĈĴÈÀÇż­ÇÀ­ĈżĴĽ޽ĥ¤´­œİ¤•İ™Áş§Äĵ¨½µ˘ğ³žğ²žı­™Ğ›ƒ›…iw\sYˆnTzcKxeKn]EgWAeWAhYEtdOrdPg\Kg^NngV‘‰t³İ”½´ŸżĥĦµ ż·ĦĥĦ½µ ĥ˜·°›ĵĥ˘Áş§Ċ½ŞÂş§ÂşĤÄğĤı£À¸£ż·¤µœ‹ŠuceOYVCUO?gOC”JK³PUıUYıTY·V[²RWħRW³WZ³][ŻaZ²ZZĥRWĥLUĥKT·KTħGQ³JS²JS´NVıOYşLW´ITGSŻLV°PY³PZ²NW³KT³GRĥKVıNY·S[³SZ³RX²TX´UYµMVµHS·JU¸T\ĵ…|dz ÌÀĴÍÄŻÍÄŻÌ­ÊÀİÇĵ£`mQvt^•Šw·›ĥ¤°Ĥ–sdZfTHfRDlWGiT„mYŠrZ‰qYw]”|a•}a“{_Žv[‰qX„lV}fPzbM|dP„lUxaLmWGePAcN@kTCgPAnWFoYGiSCmWEfP@pYFnXFnWGv^LpYHr[Iu^JjS†nVŒsX–}_tY†nUŠqVŒrWˆqVŒsW“{\‹tW‹sW’z\•~_–`–~_•}^‘z]‹sWtX†nSgP‹rX‰pW“z`‘x`x`‚jUr\KhUGgSFgSEZI@SF?RKJKOWHOXSUUsl_š‰p§”w£ŽsĞ–}İ•} ‹t”gzby_•}`Žw]x^{`ˆy^„v\ˆx_ˆxawbyue|{qŒŒƒĦž’²­Ÿğµ¤ÀşİĵĞÄĵĞÁ·£¸İ’¨’u †g‚b™|]—}`‡wZumR]]K‰‡qµŻœż·ĵİÉÁÈÀ­ÇżĞĈĞĊ½¨ğĤż·£½µĦĥ˘Äğ§Ċ½İÀ¸¤ğ²ž´İ”Ğ›ƒ•cŒsW‡mQgNxbJl\Eh[CgZCeYBcWBaUA_UD]VHb[MsjY}p^—‰tĥĞ–µĦÁı¤ĥ ğ´·²›ŻŞ“š”~œ—~ШŽĥ²›½·˘·¤ÀıÀ¸¤Á¸˘Á¸£ÂıĤżĥ£¨œˆ„iZzQIsLF…KIŸHN­JQ·QWĥQX´SY´W\µ\]²^\³[ZµVY·QX·LUµJTħHRGPĴIQħMU²PW²OVħKSħFQĴHS²PZ·T[¸X]ıX]µUZNV²OWıRZşRZıW\ĥY\²UXŻMS´SWĥRXħIR²FQµOXğ{tÄ›ÊŞÍİÍĊ°Ê­ȧǽ¤VhJ\cKpkYĤž‹şħž²¨—…ymbPGaNChRD}eP…mX†lWˆpWuZŒtZw\”{^ŽvZŽv[‰rY€hQgQgO…lR‚kRƒkTu_J{dN~hPybL‚lU~hS~iUjVr]KydPzcO~gS…nX‚kV†oW‚kS‰pV‹rX‰rWŽuYˆoU…lRŠqTŠqU‹rW‹sW”z[vXwY”|\”~^z\‘z\“z\’y[ŠsV‹rV„lS}eO~eOgPˆoXxbˆoZv_NnXHmXIiTGaOCSF@JFEHLTLQWVXU€t`›…iž†i™ƒi–€i˜‚l“}e’{`x^ŠtZ†sY‡x\…y]ˆ|a†zbu`{tazvg„‚t••‡Ĥ˜µ²¤½¸¨ÂĵĞĊż­ĊĴĈżĴĊ½ĴÂş§ğĴ–Ĵ”wžƒdœbœa—{]“}bynUplQZ]Huub²ĴšÀı¨Äĵ¨Ĉ½İĊ½İĵ§ğĤÀ¸¤ğĤÄĵ§Ċ½¨Âş¤Âı¤ıµĦ·Ĵ—¨—€—dˆoS‚gNgMycJp`Gg[CeZCdZCd[EaYEb[JnjY„€q˜‘€§ŸŒœŠ’ĵ³Ÿż·˘Á¸£ĥ³§§†œœ~wydps\†‰j›œ}Ş’ĥ°œş´ŸÀı¤ż·£ż·ĦÁ¸¤½œ´™ˆ¤kdĦUT£WUĴQU²NU³QYµSY³RX·W\·]_µ__µY\şRYşPX¸MWµJTħHRŻLTħRW°XXĥXY²^Z³[[ŻSWŞJSħOXıRZ·W[´^]¸c_ĥd_´\\ħPV³PW¸QYĵT\şT[ĥVZ°LSµPV·TXħJSDOħKTırmĞ˜ËżĞÎİÍİË­ǨÈĤUjJRdG[cL‰tŻİ•ĥݜ”…iYNeRFgREr[Jv`N}fRiS‰pV‹sZ‹sZˆnV†nU„kS„mU„lTgQ€hQ‰qVˆoW…lT}eO…lSƒlSiSt[Œt\“|dx_ƒkTŒt\ˆpX‹s[Žv]ŠqY‰qXˆpV‹rV‰oU‰pU‰qUƒkRhP„kR‚iQ‰qU‰qVˆqU…nTˆpUŒtW”|]–~_vY“z[“z\–}a“z^ŠqX‚jS{cOhR|dQ‡p\v_NiUGiTGoZLeQEZIAUKGVWXXZZif]…wb–d˜f–€f’|ew`x_Žw]‡sY‡uZƒuZ€v]y`…{d€ygzn„ƒx—˜Š§—´žğ´£Àı§ğ¨ğ¨ÉÁ°ÊÂħĈ­ÈÀÈÀı°„Ÿƒfœ€aœ‚c•{]“w[‹u\vmTolPZ]GghWŞ“Áş¨Ċ½Şş§ğ¨şşÁı¤ğ§Ĉ½¨Ĉ½¨Âı¤À·˘³ž¸Ğ•ޘ€‘y_…jPƒiN}dLzdKm^Fh\De[CdZCd]GpjTpmYrrd“­§–µ­š·Żœş²Ÿğ´ĦÁıÀ¸£ĥ ı´™£Ĥ„’›v†mfqYdnWs{]|ƒcސq£ †Ĵ¨‘µ°šĥħœ·°›·Ĵ˜ĥŒ²~s°b]ĴaY­aXµUW¸OVıQY¸S[şW]ıZ^·``ı\_ıT\şPYşMW´GR²GR°LT³WY³][µXZ¸SY·RXşS[ıU\²R[ĥT\ıR[şS[ıT[şU[¸]\µc^³PW°JSµNXĵS\ğT\·X[³PWµNVµRXħMTĴEPIS·mk¨—ÌÀ­ÎĊ°ÍÄŻÌ­ÊÁĴÉÀİ^uSTkKRcHipX•”}­¨”Ğ£’vi^iVJiTGpYIv`N~gR…mVˆpX‹tZ‰qW‰qW‰qW‰qVŠrY‰qX„kS‚jR‰qX‰qX‡nU„lR‡oU…nUˆpVv[’z`“{`Žu[†mU‘x_Žu]”z^‘x]ŒtY„mT…mTŒtW‡nTŠqUŠqUƒlS‡pU…nTˆpVtWŽuY‘x[‰rWx[ŽvYwY”{\uYwY’xZ“y\”{`u\‰pYx`M~fQxaOycQgSFfREfSFgSF^LBZIAcVKoh\Š~jšˆn˜‚g•}bx_Žw]ŠsZ†qWˆuZ…uZ„v\†z`~t`sn`xujŠˆ{Ħž³ŻĦğĥĤ½ĴĊ½ĴÁ·Ĥżµ¤Â¸Ĥ¸ĺİÇżÉÁħÇÀÈÁŻĈĴÀ³ s–z^˜}_™~_‹qV‡kR|iRxpVspS[]F_aPĤĦŽÁş¨ĈŞş§ÄĵİĈ¨Âş¤Äĵ§ĊİÇÀĞÇżĞğĤżµĦ¸Ğ–­›ƒ–~cŠoTgMhNxcJn`Hh^EcZCaXDbZIlfV|j‹w˜”ƒİ˜ĵµ˘ĥ˘ş²ž½µĦÁ¸ÂıÀ¸£ż·Ħĥ²—Ħƒ”xŠ“pjrY^iSo}\u‚_u‚_xa…g‹Žq““x›–|›vŸthŞb]Ş_XĴ[WµTWşPW·NV´NVşU[ğY]¸[]şY]ĵV]şS\¸NX¸MXħITJS²TX³`[·XZ¸SYıRX·PX·QYĥTZħSZ²SX³PV´OV·PW¸OWıSYĥ][´QWĴEO°JTıOYğQZ¸X[µQXµMVµPW°PUŞEN­HR¸ol¨—ÌÀĴÎİÍÄŻÌ­ÌÍÄ­\vRZuQVnL[lOr{_•–}ݤ‘Ž…wgXMbQGbNBfQCnWFu]J~fQ„lU‰pV‰pV‰qWˆpVtZŒrWˆpV†nU‹rX‰qX‰qW†nT‰rWvYwZ‘x\w]’y^v[ŽtX‘w\’y`˜~_•|^‹tY‚kTiQ„lT†mS…mRƒkR€iQƒlR‰rVŽvZwZŒtW—~_•~]—_”{]‘xZ”z\wZwYŽtY†mT…lU‚jT‡pYybOiTu_NkWHdQDgSEbOCYI?YI@fVI…s_˜…mužˆm™€e‘x]Œu[†rXƒrV‡xZ‰{^€v_yqa{viˆ…z˜•ŠŻĞ½·§ĵĞÈÁ°ÌĊ³ÍĈ´ÊÀŻżħŸĵ­œ½ŻŸ° ·¨ÊÁħʳÈÀŻÈÁŻÇż­½°›¤Šn›€b‚c“vZƒiP}eMo`LysXuqT\^G\^N˘žŠĥ¤ÂşĤş§Ċ½İÇİĊ½§ÇÀĴÇÀĴÈÀĴĊĵ¨Àĥ˘¸Ğ–Ĵ›ƒ›ƒhŒqWˆnR†mQ~hMm_Ge\Ed\F^XFjdT~yh“yŸ˜‚£œ‡§˘Ž´Żœ½ĥ£Áı¤ż·˘À·£µ˘À·£ż·˘À¸˘ğµĴĴŽ£—z|„g[ePbnSk|YlZlZi~Yj~Zp€]zƒa€t\—]UĞcZħ]Y¸RXğPXĵPXıNW·QYĵX]ğ\^½X]½T\ĵS[şQ[·LWµKVŻLUħQX´XZĥYZ¸RY·TYĥTZ°QW­X[İfcİslĞnh˘[Y¤NR­JR´LTıMV·PVĥMVŻFP°JSĥOXşQZ¸Y[·SX·OX·PX°QUŞFNŞHP·soĊĴšÍÁ­ÎĊ°Ç³ÎĈħÍĊŻÍÄYrQ]wSZuQ^tRcsUs{_“”|š•ƒvj^bRGbOBdOAr\Iu^K…nW†oW‡nU†mU‡nU‡nV‰pWˆoU…mT…mU‰pWtYŠrW‘y[’{]‘y\tYŽv[’y^“z_“y]’w[’w\—}_™`‘w\v[‚jS}fOhQ†nTŠsW‡oTƒlR„mTŒtXŒtY‘xZ‘xZ“y\•|]‘x[–|^ŒsW‘wZ’x[vZ‰oV~ePx`Mv^Lu_Ls^Ls^LjVHhUFkXIgTFaPCYJA]MByeR•g˘qĦ‰l›‚d—~`’}^Œz]„vZ„v[€u^}ucƒ}pœ–ŠŻİ›ĵĥĤÀşİĊÈÁ°ÌijÎÇ·ÏÈ·È·Çş¨Ż–£„r§†x­‹ş “ÇşĞÉÀ°ÄĵĞĊ½ĴĊĵĞ𭘣‰m˜~a”z^ŒqVgO|eNocOw[pnQ[]G`aR§˘Áş§Ċĵ¨ĈŞĊ½ŞĊĵ¨ÇİÈżĴÄĵ¨Âı½²žµ¨“Ş™šƒiŽuXqUŒrV…pUncIaZD]VC]XHmhY‘Œzž‰Ĵ¤Žħİ“ħŞ•²Ĵ˜ş´˘ż¸À¸¤Âı¤ÄğĤÂıÁ¸¤ż·˘żĥĦż·˘¸´œĤ݉˜Ÿ|ˆ“piv\[dOanRcxUe{We|WczVg}XozX|fQWRĞ]X·SXğNXĵNXğMW·MV¸PXğY]½V]½R[½PZşNXıNXĥLV´JUŻKU³RY¸T[·QY·QYµ\_ħaaĤa]•h]‰gX’r`˜ua•kY—WPĦHM­IQ·LU¸KVµHS°FRŻJSµNWşQZşY\¸RXıQZıQZ³OVŞFNĞOUĵ‡~dz ÍÁĴÍÄÏĈ²Ç³ÑÈ´ÒȳN`HWnO]wSd|Wh|YiwXt|a‹Œu‰‚reWM^K@cOAiSDs^L}eR€hTiT~fQfQŠrX‹rY‹rXŒrX‹rXtYŒrWŒsW”{]w\u[‘x]’y^v\“z_šb–}`’x\‘x[‘w[…mU…nU}fOwaL}fOƒkRˆqVŒtX†nT‰qVŽu[wZ’xZ”{]v[”z]ŽuY’x\ŒsW“y]vZ…lS€gPs\It]Jr[ImWHp\LmYIjVGjVFeQD]LA_ODaQFr`N”}a„f¤‹j„e™ƒc‘€_‰{]€tZ|q[{sbŒ…vĤŸŽ¸ħĦĵĴĽ­ÈÁ°ËħÍĊ´ÎĈµÍĊ´ÏÇĥÏÇ·ÏǸĊ·¨Ĥˆv˜pc™pc™qc}rМȭĊ½ĞĈĴÄğİğ­—£Šn™€cŒu\‰nU}dNyeOneRysWffKVXDdeV°Ş—ÄĵİÇżĴÇżĴÄĵİş§Äĵ¨ş¨żµ˘ğ°›²¤£w›‚e”x\tXŽsV†pTrfLc]E]XE[VIsm^–~¨•ĥݚ·Ż˜ıħœ·°œĥ°ğµ˘ĵµ˘À¸¤ĵ§ÇżĞÈÀĞĊĵ¨ğ§Áı¤ÂşÂğıĥš§Ğ‡›£˜xyh`kU]qTawUayU_wS`wSjpRƒ[M£\U°ZXıPXğMXşLW¸LWµKT¸OWşWYĵQZğPZıMWµITĥJTĥKU°FRIR²OVµNWµPX°SY_` h`ŒfX‰kW‰lUŒnV‘qY•sZ‘bR”OL HM°HR³GQŻCNĴDOĴHR³NWşPY¸VZĥNU¸MWşNYĥLVŞGP²ac ’ÊĵİÍ­ÍÏĈħȵÑɵÒɳOdJNaHXoQb{Wi€[l]kwYv{b‹‹utj\ZKA[H>[H>jTFqZKu^L{dPybNgP†nVˆpW‹rXŒsZv[v[v[ŒtYwZ’z\w\‘w]Žt\ŠqYuZ“z]w[w[tYŠqWhQˆpWhQ{eOiQŠqUvX’z^x\ŒsXw[vZtX•|_’x\‘w[‹qV‡nTtX’y^w]‚jSt\JlVFq[ImXGcPCcPCeRDhTEeRC`PC]OCcTGtbP“{^Ÿ…dž†fœ…e”‚aŽ~^`†{a€vb”ŠvİŸŽ·½´˘ÄğİÉÀŻÉÁ°ÊÂħÎĈ³ÏÇĥÏÈĥÎĈ´ÎÇĥȸÏĈĥĈĥİІzxe˘d›z`vhğ¤–ĊğŞĊ½ĴĈ½Ĵşİ𭙍qš€bŒuZ‡lS{bMucOjdQtpSbaISUDpp_´­™şĤÇĞÇĴÄĵİÂıĤ¸ıœ²’¨—š„j•|_•z[“wZvY‡rUsfLf^GYTCXUHxse š‡Ğ¤Żİ•°Ğ—³­—ı³ž´›µ°ĥħŸµŻ½ĥ£ÁşĤÄĵİÇżĞÇŞÇŞÈżĞĈ½¨ĈżŞĊż¨żğ˘ğ¸Ÿş·ĦŞ—ˆˆuckXXeNYjNZmN^lNqcM•TO§_W´VXğPYğNXğMXşLW³HS¸MVğTZğOYıMX³GR³GRŻGQ²KSħIR­GPŻKS°KUĴPWİ[\—`ZjZŽr\‘tZ’sY’qW“oW™x]’mW[P˜IKĴFP°FPİBMĤBNIT¸OYıOX·SX²HQµIT¸LW²ITŞMTşyȳĦÌÀĴÌ­ÍÄÏĈ²ÑÉĥÒʷDzZvRUmOQdK]tTg~Zn„_qƒ_o|\w}c‚€ldXK]L@]J?jUGpZKu_MwaNybN†nViS‚jR‚jS…lUŽuZ‰pW‹rYvZ“z]“z^“z_—|_ŠpWˆoV‰qWˆoV‰qWŠqVŠqV‰pU‚kR‹rXˆpV‚kRˆoT‘wZš‚b˜€a”{_–}_•|^’y\wZ–}`‘w[ŒrWˆoUŠqW‡oVŠqY†nVzcOnYGoZIhTEbOBaNAbPBbPBdSDeTDcSEcTFo\KŒtZ™aœ„c“a‰{^‚vZzoW€ubŒq’‡wœ€İœŠŻ˘Žħ£ĥ¨”²ŸÂ¸Ĉ½ĞËħÍĊ´ÎÇĥÏÈ·ÍĊ´ÍĊ´Í³Ç³Ĥ³Š›ze}c˜x`Ÿxi½Ĥ˜ı¨ÂşİÄĵŞÄĵİ½Ż›§Žqœ€bvZhPv`Kl^KkfPliOYZESVF…‚nş²ŸşĤı§Âş¨Â¸Ĥ½²Ÿĥİ–Ĥ•™„m–~b‘w[•z\–z[ŽvXƒqUogM`]FON?HH>edWz˘Ħ‹Ĥ¤Ž¤˘Œ™›ƒž†Ĥ£¤Ħ¤ĦĦ‘ĞĤ•ĥ°ž½ĥ¤ÁıĤĊ½ŞĈŞÈżĞÉÁÉÀ­ÉÁÉÂÈÀĴÇÀĴĈżĴÀş§ĥħžšš…s{dWcMR]HYVF€QITSŞ]W¸SXğOXğNXĵMXşMW·KUıJUğMW·ITĥHTµJUŻFR²NVĥX[·TY°MU¨GO¤IPVWžh^ŽlZ‘t\’v\qW’sX•uZ—v[˜v[“nW‹VK–IJİENĴCN¤>JAM´JTşMXıMW·LUŻDOħFR´JUISZ]ż™ËĵİÎŻÎĊ°ÎĊ°ÏDzÒÊ·ÓË·ÑÈħ_{VZvS[rQYmP_sTj\n‚^r„aq}]sv\hdPZM@WF<^K?`M@gRChRCmWGw`Mw`L‚iR†nVˆpYŽu[‹rYŒsZŽtZ‘x]‘w\‘x^•z]‹qW‹qW‹rXŒsXx\’x\ŽuX‹rVŠqUŠpU‹qUŠrUŠqUsW‘x[’y\‹sXv[vZ“y]‘w[“y]ŽuYsX„kSw]†nX€hShRt^KfRCcPB[J>ZJ>_M@eRBaPBaQBaRC`REiYH„mT’y]‘{]ˆy[€sYtjUlcRrfU‡wb~h{d}e•„l’‚k‘i—ƒkĤ“yµĤÁµ£ÉżÌijÏÇ·ÍĈµÌIJÍIJÎijËĥİĵ”Š£ƒr™ye˜xc¤€qÀžĊğİĊĵŞÄĵŞĈ½Ğ°›Ĥpœ€auXxcLo^Ke\JedLZ\EOQA]_O™–ż¸À·´˘şŻ´§“¨–›†ox`“y^“wZ”xZ”z[ŒuWvjO_^EPT@DKdN@nWFt]KxaM|eO}fPˆq[‹sZ‰pX‰oWsXw\ŽuYvZŽtX‹qW‘w[w\tYŽtY•{\•{[“y[’wYuXŒrVŠqVŒsV‡nS‰pUŒsXtXtY‰pV‹qXŒsY’x]u[‰oW€gR†oY~fSybPxaNu_L^K@\I>ZI>_N@`N@aOA^NAaQC^PDhYI†qV“z\Žx\~pVofRmdSymZ‡w_—„i‘tĞ”u–uħ˜xµž~ħœ’vžŠn›‡l›Šrݘ„ş­›ÄğĞ˲ÍĊµÌ°ÏdzÑÈ·ÏÀħǧ›ğ•ˆµ•…µš‰ĵ˘“ÇşİÄş¨ğ¨ğ¨Ċĵްš§Žp˜{_‡lRt`Lo`M_ZI_^GOQ@QSE~}jŻİ•ıħžĥĞ™³Ĥ”İ™…˜‚l‹qZ‰oXŠoWsY‘uY“yZ‹tWxiO][EIQ>?H:CL>O^IYkP]lTUdNO]IQ]ITbJVgL\nP^pQ\pQ]pRdsWhr\txiŽݤ”·°žµ˘ğ§Ċ½¨Ċĵ¨Äğ§Ċ½İÈÀĴÈÀĴÊÂ˰ÌÄħĊżĞş·Ħž˘ƒŸ—~¤og­VW]Y´UYĵSZ½QZĵOYĵNXğNXĥLU´HRħEP­CO°EQħEPħKSµ\[ğW\½R[³NVŸMQVQŒhVrY‹nU‡iQŒoTŽoV“tZš}`Ÿ€dœw_—kX˜ZSİ[\´OWµLVĴFQĴDO²FQĥJUıLW·KVŞCN¤ALĤEOĞMTŻacż˘”ÉĵİÍÏĈħÍÄŻÎĈħÎĈ³ÎĈ²Ĉ°`yV_xTg[q†av‰et„bftXhyZiyZkz[kxYdnQPL=J>6M>6UC9^I=eOAgPBpYGnXElUDw`L}eP{cNhQ†mTŠqWŠqVŒrW‹qVŒrW–|]“z]“x\ŽuZ‘wZ•|\’xZvXŽtW‹qVŽtY‘x[ŠqV‰pU‹rWsX‡nU‰oV‹qXŒsYv\ŠqY…lUxaMw`MoYInYHjVG]L@TD:XG]L>[K?ZLA[MBbTF{lTŒ{]”c‡x_zoX€sY–ƒf˘Œm§oݘx·˘„´Ÿ· ş¤…ĵĤ†¨ˆĵĤ†¸Ħĥž~Ş”v‰r˘{ŞœŒÀ·ĤÈÀ°Èż­ÍĊ³ÏÇĥÍĊµÍÁ²ÈşŞĈşİ·§ĊşİÇĞĊĵİÇżĴÇżĞĊĵİ½Ż›Ĥq–y]‡lRn]Jk^L[XFUUCPPDihY˘œŠ³Ş˜²“¨—„š„ox`‡mV…jS†jTŠnUrX‰pU†rUrfM`[FMN??E;?G[I>ZH?C;BI>MXGXhO\rSczWe~Yh‚[k„]hZc}Va|UbWb€XeƒZdYh…\q‰bw‹fy‹g}ˆkƒq™–†³­›żĥ£şĤÁ¸˘şÄğ§Ċ½İĈŞĈĞÀşĤıµ ²°™§£Œ r¤VVYY³\[ğW]U]żT]½R\ğOYµLUħMU³NUĥJT¸JUµIS­CMħNS³ZX¸OWµLTHMŠVN†cQ„bPŽoV‹oTŠlS‡iPˆkRŠhRmW‘iU–fUœYTİTW´RXşRZğPYµJTEQ­COµITıLWµJV£CN¤FP­IR²QXĥroĊžÌÀĴÍÄŻÏĈħÎĊ°ÎĈħÏĈħÌ­ÌÁ¨TaJR`IQ`JWgNarVl}]rao|]eqUYdMR]FTaHVbJX\HXPDSD;XE:ZE:VB8[F9\H;dO?kUDjTCnXElUCu]H~fO‚jR‚jRfOƒjR„jQ„kR…kRƒjQgM„lR…lR†mShOyaK{dLv_IfN‚iQtY‹rXˆoW€gRƒjT~eQzbNx`M|dPr[IiTEcNB^K?YF;TD9VF:WG;UF:VG]PFzjW†u^‡xcxmYtjWwm[ukYymY…v_’g™‡l™‡lž‹p£t’w’wt­—yı£ƒĵ¤…Ĥ†ı ‚´œ€°˜|‹qĦŒuŻ£‘Âı¨ÈÀ˲ÏÈ·ÏȸÏÈ·ÍĊ³Çż­Ċ½ĞĈĞÈÀ­ÇżĴÂıĤÁ·ş­š¤Žs˜|_ŒqV{dMWN@GF:UQFˆ~n ”‚œxŠu^ŠpW‹oUŒpVŒoUŠnT…lSxhOylQlfL\^FSWBAH;>G6UA7TA8ZF:bL>jSBjTBkUCr[GpZGpZGoYGt]JgP~eN~fOfOgNw`I}eLx`JhP€gP|dM€hOw_J€gQ}dN„kSiR|dOr[It]Ks\Kt\Kt]KqZIkTGlVGfQCdOAXF;RB8TE:SE;OC:QDF:>I=JZFRhLWmNUlMSiKSkLTiKQjLWnNZqPVnNRkLRmNXwR]}UbWc€XfƒZk‡^s‹bvŒd~j€‘my†j‚…sŻĞ™ğ¨Ĉ½İĊĵ§ğĤÁı¤ğĥ ­­“•|~Žiw†asqUTM OOŞ\X·X\½S[½R[ĵPZıNWµJTŻJS³WW·YYğNWıJTµHQħDNµGPşMUşLVµKT§VX‘gW„dP‚aMŠkQŒmR‹kR„`L‰hQ†aM‡VKŽQN¤XZ´Z]ğZ^½V\şPY·MW°KTĞQW²JTşLVğMX²HT˘EOİIRµOWµ\_ğƒÊş¨ÎİÏĈ²ÑȳÓÉ´ÑȳDzÎĊÌÁ¨_oP_oQfxXo^sƒax„dtalw[ivZalTblSs`Ž•w­Ş”³Ĵ™§žŒˆ|mbTJVE<]H>[G<^I=bL>fN?bL>gP@hQAbM?fQAfQAs[Hs[GkTBoXDnXDrZFjTAqZEoXE~eN~dMeN}dMr[Hu\IpYGt\JoWFoWFjSDlUEnWGlUFgQChRCnVHkTFhRCePBXHZMBVIAUID_TOh_[_XWTPQTQR_\[gea`^XXUPPOGQOERPEZUJ^XLg_QocS{mX—„j¨’s˜x´Ÿ~µ|·Ÿ~ı €ş˘ƒ·Ħ…–{£‡lĤ‰lݎrħžˆÁĥ¤Ç­ÌIJÍĊ´ÎǵÌIJ˰ËÂŻÊÁÈżĴĈ½İÁ·£ı­™Ĥ“|u\‹oUfNjXGYOCjZHzcN}eOfO„iP„hOˆlQˆkQŠnS‚jPzfMk`IZZDOR@@F:VC;YE;[F;VD9^J<_J<^IVHA\PI`VPc[XYSTTOQTQSZWXjhg’‡Ş—•‘igZ^\MWWHTUEVVFZYGc`KgdNgdOjeQvkW…v_›‰n§“uĞ•v­•vħ˜z°™|Ğ‘uĦ…i£‡i¤‰j§Žs¸§’·ɿËħÌħÊÁŻÈÀ­ÊÂŻÊ°Ċ½ĞÁ¸¸Ĵ™İ˜„•{d‡jSfNmYFeUEp[HzbJgO„jQ†jP„hOƒfN„hO„jPhOqaIgZFXNAEF<;C9;J;FZDMcIOgKPiKKdIH`GH_EIaFKfHOjJPmLSqNVuPWwQYxR[zT\{T[yS^{T^|Vb~Xb~Yh€\i~\n_v†d{hy‡gw}i¤˘‘ĵĥ£½·£µħœ£¤‹~‹jjZe|WdzUbqPebJ€OI USŻ_[ıTZğQYĵOWğNVĥJS­EN­LQħ]X¸PVıMU·KSµHR´HR³FP²EO³GQ°HQİMSœ_Z‰aU‚`Oƒ_N†`MŒfP…XH‡WI‹SK˘ZX²Z\ĵ\_ĵZ^¸QXħGQ­GQ°LU³^_´qiħTXĥLU³IS°JT­JS´RY·X\ıvpÄĴ›Î°È´ÒɵÒʵÒʵÓË·ÓË·ÑɳÏĈSeGVhIWhIZgKkzXƒlŠ–qŠ•pŒ—rŽ—uŠ‘qˆˆn ˜‚·›½µ˘½´Ħğħž´Ş—š‰~rm\S]KC[H@cNC[H<[G;YE:XD9[F:\G;`K=_J<[H;ZG;`K=iSAhSApYElTCs[HkSClTDrZGdN?\H]I>eOC`J@^I@^J@_J@hSGgRFbOCSEWD<\H?[I@dQFnYLdRGTH@TKF]VThdcnmmsqq|‘މ£ž”ħޝż·¨ÈÁ²Ë³ËħĊ½ŞĞ}jqmYplTnkQgeNcbMhgOmmRmnQlmPmmPnmQmmRmjRifQpiU{pX€sY‚oVw\”z_‘w]™€dœ‚g¤tıİ“ÄşĤĈ½İĊĵİıĤÁ·£şšħĦŒ˜‚iƒiQ|bLp[Hr[Gy^I{`J€dL…iO‰nR‡mShOxcMlZGgXF[QDNIBGE@DF?AF=S=S>?WAAXB@WAAZBD]DHbGNiKRoOWtQYxSYyS]}Ua€XcXe€Yd€Xb~W[yU]uThv]’{”xs‚b`sRTjJShHQdFR`EXbHmeQ”YTŻ[Yµ[ZğSZĵPXĵNWşMV·LUHQ­KQ­ZV¸SXĵPX½OWıNVµNUĴGOŞEM°TU²SV·NWĥQYŻUYŞa`Ĥc`¤][§ZYŞYYZ[ŞTW°[[¸bbıgf°TY°KUŻJT³NW´UZ·oi·zpĴ[]­LUHS²IS´OVµSY·khÁžÈşĤÍÎĊ°ÑɴȳȴÑɵȴȳĈŻs}an{_mx]pzapxayg‘—yĤвĴ”µ­˜ĥ­™·šµŞ—¸Ĵ™ğ°œşŻšşšĥŞ•²‘´§“²“Ĵ Ħ”„‚swg[cQGXD5T@6WB7\H:ZF:YF:XE:VD9XF:^JeO?aL>]I=]I=]HTB:P@8QA:WF=TD=XG?]LD\NGaTLcYRga\qnkˆ†Ÿœ’°Ĵ ³˘ğµ¨Àş­Ä½­ÇËħÍĊ´ÍĊ´ÈµÎĊ²ĵ§ĞĤ‘Іstq`tnYupWolTgePgfOnnRprUppSnnRmnRllQkiPjhOjfOiePg`LkaLqeOthR|nUŒw]…l³Ħ‰À´ĦÁĥ£³ ı­šµ‘¨•™iŠqX|dMp[Gu]I}cL„iO„iPƒhO‚hOhOzfOo]J`REQI@TOG^\TkjdophbfYQVIGP@@N:>O9>P8:K85C43@32?23@34B45D58J8;O;>S=CZBF^CFaEIfHMkKPnMUsPUuQWxR[{U\|T]}UaV_~UZ{SXxRXwRVtPSjMXiQbvV]rRTgJM`EM]DLZCNWD`ePƒvfže`²XYµYYşQYğPXĵOWğNW·NV³KTJQŻWVµXYıTYğSZşV\¸X\ħMTĞHP²UW²YY·PWğQZ¸S\ı\aı[`ıV\şV\şY]µX[­QV­]^´feµY^ŻMV³MW·OYıQZĥZ_ı€uş‹{\^°LU²JUµMWĥPX·]`ĵƒ{ÇħŸÌÀĞÍÍÄŻÏĈ°ÇħȳÒÊĥÑɵÒʵÒȲ𙂔™~‹’t‘sŒr~ƒf”wĴ§ĥ­–µĞ•ĥĞ—²§”Ż£²ħ˘° ‰­›‚§“y¤u¤u’|˘yœ‰t•kŽyd‡q]}gTmXH^K?UD:O?6R@7Q?6Q@7WE:YG;VD9\J=bN@fQB]J=XFYKDYLH]SOh`[uoi‰„{˜“ˆ£ž“ŻŞžş´ÂşİĈ­Ċ½­ÉÁħÎǸʲ˲ÍĊ³ÏǵÏǵÑÉĥÑÉĥÏÇ´ÈÀ­ğ´˘˘ž~pwsdokXnkTkjSkkRqqUqqTppSqpTomRkhPgfOifPebPb^N`]NdaOliSunXˆ{eĤ”€µ¨”ı­™´§“Ğ›†˘z—iŒr[‡kT„hQ|cM~eN…iQ‡kQ†lQ|eLycKt`JjZHZODNGALHEWUQzwmœ—‰Ĵ•ݘ˘ŸŒ‡ˆvhn[NXFAN<>N9?Q9?R9=P9:K78H6T:T:AWF_AE]@DZ?DY?H]AIaCJdDJcCJdDJdDIcDHcEIeFKgGOkITrMUrObx\†wĦ£‘–ž…’›€Ÿ£‹ŻĴ•¸²ş²ĵ­›µˆ}³[]²ZYĥUXĵQY½QYR[ğU\ıPX´JT°KS­SUħ`\ĵ]`\`ĵ[`ĵU\·LUµJT²JR³JRµKS·KU·KT·KT³KS­JRŞKSĴNV°PYĥS\¸T\ĵV]ğS[¸OX´KTİKR›WV‡bYĦgaŻQX²NWħTZ­_`wżĴšÊżĞÎĊħÏĈ²ÍĊ°ÎĊ°Ç³ÏĈ²ÎĊħÎĈħÏĈ²ÑɳÒÈħ•|b–~c˜e˜}a’w\‰oV†mS‡oT‰oUˆlTŠmUsZ”x^”x^”v\•v[sX‰nU‰oVŒrW”y]vZ‹qWŠoVŽu[Œu\Žw`‰u`…s`Š|h…{l‚~rŽ‹Žƒ…™˜Œ£ “Ĥ˘”¤Ÿ‘£žŽ§Ħ’Ş£“­Ĥ–µ­œıħ ş² µ˘ÄğİğŞğŞĊ½ĴÄĵŞÇĴʰÊÁŻÊÁŻËħÍĊ´Í²Ċş¨ğĴ™ĵĞ—Àħż°œıݗȽĴÎĊ³ÏĊ²Ç´ÏǵÎĈ´ÇĥÑɸÇĥÏĈµÑÈĥÎijÌħ̰ĈĵŞÁĥ¤ĵݜµŽĞ˜¨”y£sĦ‰oš€f–zb”xa—{e—}f•{cs]ˆoZ…lWhS€fR~eR|dQ|cPx`Mv]Kv^JxbLycL{fMzfMsaJgVCdSBUHI_@H`AH`AHaBG^A@W=D\@IbBKeDLfEJcDF^BE\@H`BHaAIbCIbCKcCJbCIaCKcDLeESoKWrOdwZ‚‡xŻĴ›·´ ıµ ĵĥĦż·˘Äĵ§ÂıÀ³ ·–ˆ³bbµWZµYZĵSZżQZĵQZ½R[ıOX¸NX³LUĴMSĞ]Y¸daÀ`cÀ^b½Z`ıRZ¸MVĥJSµKTħJTHRGR°IS²KU²LV´NW·RZĵV^Zaż]cĵZ`·PYŻJS¨IR¤JR˘VV_XĤa^SXİRX_`zqµĦ‘ÄıËÁ­ÎĊ²Ç³ÍĊ°ÌÎĈħÏDzǴȴȴÑȳĈŻ”x[”w[—{^’w[‹pW‡lS…jQ„gP„gPcM}bM„hPˆlTˆlT‹nV“vZ’vZw\w]‘w\‹sZjUsbPqaQzkYraˆ}m‘‰{œ”†Ş˘‘°İ˜ħŞ™´Ĵ›²Şš´­œıħ ½µ¤À¸Ĥ½´˘ĵ³ ½´ĦğħŸżµ£Äş§Ċĵ¨Ċğ§ÇĞËÂŻÊÂŻËħËħÈżĴÉÀËÂħ̲ÎĊ´ÎĊ³ËÁ°Ä¸Ĥħ£žˆt§x³Ÿˆœ‰´Ĥ”ĈğŞÍħÍIJÎIJ̲ͳ̲̰̰ËÁŻÍħȽĞĊ¸Â´Ħ™¸°›†Ğ”|Ÿ†nš€h‘xa“x`u]ŠpZˆnYŠp[ŠoZŒr[‡mW‚hS~cP}bOy`Ns[KqZJt]Js^Jo\Hn]GraJn_HhZE]SARJ=MF:KD9B>6@=6HC9QITM=WQ@_UDlW£x·Ğ–¸¤şÁ¸£µ Âı£Á¸˘Á¸˘ż·ĦÂı¤Á¸£À¸¤ż·£·£ħĞ—™•„qscY^OOYFO]DObEShGSiGNdCJbBMdDKdDLdDKcCKcCKaCJ^BI\@GZ@K_EM^HLXFQ[KdnY€‰o˜œ²°˜ĊŞÇÀĴĈ½¨Á¸˘Á¸£Ċĵ¨Ĉ½ŞÄğ¨Ċ·¤½œµli³Z\ĥXZ¸Y[½T[ĵS[şT[şV]şV]ĥW]ħTYWYŻb]µldĵheż_b[_ĵV\½RZĥNWĞJSħKTĵU\V]S[ĵR[ğR[·NX²OXŻRZħPXħNW´QYµQYµT[·lişƒxĵ•†Àݗĵ Çş¤È½ĤÉżŞÌË­ɿİĈĵĤËÀĞÍŻÎĊ°ÎĊŻÏĈħȳDzÏĈħĈŻ~hQ…mT†nT„lR†lQ…iP†kR‚jQ‹nU‰lR„jQhR‰mUŽsX˜|^‘vZ‡oVƒnUjS‹pUŽrW‘uX”wZ˜|^”x\‘v[”z_”z`“{cšišjž…mĦˆo£‹r˘ŠqĦ‰qĦŠqĦ‹rĦ‹sŸ‰r†p˘xŞ—‚°ŸŒĥ§”·İ–·Ş–ĵݜĵŻÀ³£À´£ğœ´Ĥ“²˘ˆšƒĴ–~Ĥz˘Œvžˆr˘ŒvĦ‰sŸˆrŸˆsž†q™l˜k™‚m…nž†n„n™€i›€hšjž„mž„l˜~gŸ„kŸ…i›‚e˜~d™~d™}d’v_ŠoY‹pY‹pZ…lViT{fRpaMf]Hf\GbXE\VB[UBYSA[UC\VD^WF^WF\UEYTDYUD`ZH`YHa[IgaLjdOfaMd_Lb]Jc\Ib[H`XEc[FibMocP‰wbİ™¸Ğ”ıÄğĤÄğĤşğĤĊĵ¨Ċĵ¨ÄğĤĊĵĤÂı£ż·˘ĥ˘Áı¤À·˘ĵµ ­¨•–“‚vvg`dTT[JR_ISbHPbFMbENcEMbELaDI^BI\BGX@ET>GU@GRBNXH]eUqveŒŽz¤Žµ²œı´ŸżıĈŞĈŞĊĵ§ÄğĊĵ¨Ċĵ¨Ċ½ŞĊĵİĈğ¨Á­œ³‡{ŞfcŻZ\´W[·Y\¸TZıSZĵT]ĵU]½W^ıU\²V\ŻW[Z[´\^¸\_¸Y]¸X]ıV\¸S[ħPWĴOWĥac·`c²PYŻKULVİKTŞNVŻQYNVħOW·T[´U[³_aĵ‚x˘Ċ°šÈı¤ËżİÌÁĴÍÌÌÊÀĞĈş¤Ä·ĦĈş¤ÉİÌÎĈħÏĈ²Ç²Ç²ÏĈ°ÎÄĴqhOtkQrlQtlQylRƒoT‡qV€mUˆqXŠpV‚kSxfQŠrZuZ–z]—|^’wZqWˆlToU‰kSŽpV’uY•x\–y[“wY“v[‘uZtZ‘u[u[–{`›c—}b”z`v^‘v]“x^‘v^u^s]u]”{cšƒk†nŸ‰qžˆpŸˆqž‰sĦŒwy‡q–€j•}g•~hĦŠsžˆr”}f“zdu`•|f–|f“yd—|eš€h•zc•zd“yc–|eƒkƒmœƒj˘ˆmŸ†m–}g—~h“zd’ybŒu^‹u]ˆq[ƒmYzfRwcPwePwgQtgQmdMg_Jb\H^ZFZXE[XE[WDZWE]XH[VIYUI[WL^ZPa]Ue`XfcYif[rnavqcxtfzwiywjtqfspeli^ieZd_T_XNaYNi`VqeZ€p°’´ŸşÂı£Äğ§Ç½İĊĵ§Ċ½İĈŞĊĵ§Ċĵ§ş¤Áı£żĥ£ÂıÁ¸¤À·£À·£ğ³Ÿ³Ĵ™¤ Šˆupr_]bQSZJNVFMUEKTDJUDHPAGPAJSCPZH^jSmv^ƒ…p ŠĴ§”µŻ›ĵµĦÀıÂğ§ĊŞĈżĞÇżŞÄğĊĵ§Ċĵ¨Ċĵ¨ĊĵŞĈĴĈ½ĞÄ·ĤÀĤ—·{uħY]µTZ·V[¸X\ğV\V_żW`żV^ĵT]ıU\ĥT[²U[°U[°TY´RY¸T\şU\·SZħPWU[µ[`ĥT\³PZ³PYĥQZµR[ħX^°]aĴQXħU[²\_²eeğ€xÂĦŽĈħ˜È¸ŸÊ½ĤÎÂĴÏĊ°ÑÈ´ÏĈħÍʨ´œĵݐ¸Œ–Ƚ§ÎĊħÏĈ³Ç³ÑɴȲÎÄ­deLdeLcfLdfKeeJjfMqgNi`KugO~nSwiRg]LygS†pVŽvZ‘x[uYŒqVrW‰nT†jR‹oUŠnT‡lSŽrVtX’vZrXqXŽrY’w]š~bž‚eš~b—|`•z^“w\u[‹pX†mW‹qY‹qYŽt]‘xa‘xa‘w_“y`’y`Žv_xa˜}e—}d’zbu_Žwb—€jš…o’{e’zcwa–|c“xav`w`”zcu_’yb“yb–}d•}e“{e’zdxc†q^mYzkWtgSsgRlbMkbMg_Kg`Kf`Jg^JldMmfOkdNfbM`]I_\I][I][I[YK[XL]ZQfbZokcxuk‡‚v‘‹}˜’ƒĦš‹ĤŸŽİĦŻ§”³Ğ˜³Ğ˜²Ğ˜²Ğ™ħŞ™­Ĥ•ĤžĤžŽ¤œŒœ”…—Ž€wjpg]‚zo“żĥĦĊĵĤĊĵĤĊğĤǽİÄğĤğ§Ċ½ŞÇżĞÈżŞĈ¨Ċĵ§ğ§ğ§ÂşĤÂıÁı¤ğĤğ§À¸ĥŻ›ĴĤ’œ˜‹Šr|~guxbqv_rx_qy_t~a{†g‰q› ƒĴĞ’´Żšĵµ˘ĥ˘ÁıÄĵ¨Ċ½İĈŞÇżĞÇżĴÉÁĊ½İş§ğĤş§ÄĵŞÄ½ĞĊ½ĴǽĞĊ°ŸÁƒ|şef·]aıW]ıW]ĵW^W_ÀYaÁX_ÁX`ÀX`½W_·T\µS[ħU[ħPXµRZ´NWħMU­LTNV²OW´NW·PYıPZşR[ğU]ĥ[aĥcfĥac·kjşƒy½“„ÀĤ’ǵĈĥ›Éğ£ÌżİÏÄDzÑÈ´ÏĈ²ÊżŞĊĥž½ŞµŸ„ħš}¸£‡Ä´šÍ­ÑÈ´ÒÊĥÓË·ÑȳÏĊ­_aK_aJ_bJ\`I[_G^_H^_HXYEUVC`_HdaI\ZGXTEe^KthQ~pUƒsW‚pT‡sV…oThPjQlR~iP‚lS„nT…oU…mT‰pWŒtZ•|_–{_”y^“x]‘v\”y]‘v[ŠpX†kU‰oWu\v]v]w_t]t\’x^‘w^“y_w^‘w`”{b–g‘zcybzd“~hycŽwa‹t^xa‹u_…q[„r[‚q\|kW€nZ†s_ˆu_‚q\zlXthTqeRk`OmcPldPkdPidPidPigQcdPbcOcaOc`PeaQhbSh`Re_R`ZP_ZQb^Ukg]soe|q•ށĤŸŻ§–´­›ıħŸğ²Ÿ½´Ħĥ£ĥ˘½´ µĦÀ·£À·£ż·˘À·£ż·£½´ şħĵ³ ĵ³ ·›ı°œ´Ş—İŸ§Œ¸›Àĥ˘ĊğĤĈ½§ı£Ċĵ§Äğ§ğ§Ĉ½ŞÉÀ­ËŻĈİğĊ½¨Äğ¨Äğ§Äğ§ğĤĈĞĈżĴĊĵ¨ż·˘ż·£ĵµ ı³žĥħ´Ż›ħ­—Ż­–°–­Ğ“Ğ”µħšĵ·ĦÀşĤÁıĤÀ¸ÂıĤĊĵİÄĵ¨Äĵ¨ĈĞĊĵİĊĵİÇżĞĊ½Şş§şĤÄĵ¨Çż­ÈÁŻÈÀŻÊÀÊş¨ĊœÂŒƒżŠ‚şmlĥ^aıZ_½Y`ÀZbÁYaÁZaÁYażX`µU]³U\²S[ĥRZ¸QZĥOXĥNW´NV³NVĥOW·NX·PY·S[·X^ı`d½poż€yż‡}•†˘ŽÁ­–Ĉ¸Ħ˧Éĵ˘ÌżİέĊ°ÏĈ²Ç³ÎÈĵ§Äµĵސ¸£ˆħ›·˘„Âħ–ÍÂĞÒÉ´ÓË·Ô̸ÑÉ´ÏĊZYNXXLWXKTWHRVFRVFSVFQRBJL?QSBWYEZZG[ZG][HdaKfcLeaKicKlcLlcLjcLkcLjdLjbKnfNqjQrjQqiPvlSulSzqW~sY‚sY‚rX…sY…tY…rW€nUkS‚mUˆtZ‰tZ„oW…nX„nY†oY‡pZ‰r[y^Št\‰r[‹v^zbˆv_„t`†xcv`|r]}p\|q[s[{oYyoXwmWujVqfRrgUwmYwmXriVldSg`Og_Ng`QifUhdThdVcaTdaVdaVc`VdcYjh^ig_mkcqnfxsj€|pƒ~sŒ‡zž˜‰Ğ¤“²Ğ™·Żğ´ĦÀ¸ğ¨ğ§Äĵ¨Ċĵ¨ĈĞÄĵ§şĤÁı¤şĤÄĵ¨Ċĵ§Ċ½İÄğ¨À·£À·˘żĥĦµĦ½´Ħ½´ À·˘ÀĥĦĵ³Ÿğ²žżĥ˘şÇ¨Ç¨Á¸˘ÄşĊĵ¨Ċĵ¨Ċ½¨ÈÀ­ÉÁ­ĈİĊĵ§Ċĵ¨Äğ§Äğ¨Ċĵ¨Ĉ½İÈÀ­ÈÀÇżĞĊĵ¨Ċ½ŞÄĵ¨Ċ½ŞÄ½Ş½ŞÂğ¨ÀşĤÁğ§ÀşĤÀıÁşĤÁşĤÁş§Âş§ş§Äğ§ÇżĞÇżĞÇżĞÇŞÂıĤÄĵ¨ĈĞÇżĴÇżĞÇżŞĈŞÇżĴÇÀʰ˰ȽŞĊ³ĦÄŻžŻÁ£”ĵƒ¸uq¸egğ`dĵ^bĵ\a½[aĵY_ıZ_şZ`ıW]şV\ĵS\şQZ·NX·NW·OXĥPXĥSZ¸[_½iiżyuÁ†ĈĤ–ɲ Ĉ²žħ›ÄµžĈı˘Êż¨ÎĴÍÁŞÍ­ͯÎÄŻÍİÎĊ°Í­ÇĵÀħ™·ĥ˘ˆş¨Á°˜ÉĵÇħÓË·Ô̸Ġ͸ÒʵÑÇħ‘‹{Š…u€|musdkj^edX\\QVUKPOFNMCMMCOOEQRGSTGSTESREPNBQOBUSDYVF[YG]ZH_]Jb_JecLgdMhdMheNlgPjeOjgQnjTrkTrkSsjSrhRrhQqgOmbMmdNlfOlePkdOmfQpiSpgRpfRtkVsjTtkUvlWzq[|s\wq\up\wq^wp^tmZtlZwo\xp\unZuo[slYskZphXohZqk^qk^oj]ni]kf[ke[nh^qmcuqh~{p}zp…€uŠ{™“„Ħ›‹Ÿ šŒŸĴĤ•³Ğ™¸Żœ¸Żœğ²ž½´Ħż·¤ÂıĤÂşĤğ¨ĈŞĈ½İÇżĴÉÁĊĵİĈĞĊĵİĊĵ§Ċĵ§ĈİÇĞÇŞÇżĞĊĵ¨Äğ§Ċĵ¨Ĉ½İşżĥĦÁ¸˘ı£ÁĥĦżĥ Àĥ˘ÂıĈ½İÉÀĞÈżŞÄşÂı¤Äğ¨ÂşĤğĤÇŞÉÁ­ÈżĞÈżŞÇŞĊ½İĈ½İĈ½ŞĊĵ§Ĉ½ŞÇżĴĈĞÄĵİğİĊĵŞÇÀ­ĈżĴĊĴĊĞÇÀĴÈÀĴÄĵ¨ğ¨Äĵ¨ğ§Âş§ÄĵŞĊ½ŞÄĵİÈÀ­ÇżĞÈÀ­ÉÁ­ÇŞĈŞĈĞÈÀ­ÊÁ­ÊÁ­ÈżĴÈż­ÈÀÉÁŻÈÀ­ÇŞĈğ§ĊıĤĈş§Äĥ£² Şšż™ŒÀЁ½|vğrnĵpmğml¸gg·cdşeeğdeşZ_ĥT\¸T\·T[ĥU[ĥ[_¸ffĵ‚yÀš‹Â¨–ǵ˘Ë½ŞÌÀĴÊżŞÊżİËÀİÊżİÌÂĴÏĈ°ÎÄŻÍ¯ͰÌË­Ì­ËÀĴĊ¸˘ı¨İ•}Ğ—~ż²›É½§ÏĊ°ÒÊĥÔÍıĠ̸ĠÌ·ÔÌ·ÔÊ´³Ş˜²Ş—ħİ—§•Ф“ޤ’ž˜†Žˆw†€o{k{whvsdml_feX^_RTUJOPGPPFOOEPPERRFUVHWWIYVHZXJ_\Lb]Ld^MgaNhcPhdPlgRngRnhRmhSlgRnhRmhQneOjcNieOhePieQhdRieRjdQlgTpjWojWojWqlYto\so\so^tsaro_tqasp`urcvsd{vf{vgyvh{wi€zmˆy˜€š’ƒž—‡¤Ž£œİĦ‘°§–²Ş˜´Ğ™ĥş³£ğ´¤ı² ş²ŸµĦÁıÂş¨Áı¨Âşİğİğ¨Ċĵ§Ċĵ¨Ċĵ§Ċĵ¨ĈŞÈżĴÈÀ­ÇżĴÈÀ­ÈÀÉÁŻÉÁÇżĞÇżĴĊğ§Äĵ§Ċĵ¨Ĉ½ŞÈżĴÈżĴĊ½ŞÄğ§Ċ½İÈÀ­ÈżĴÄğ§Á·£Â¸ĦÁ· Â·ŸÂ· ı£Âı£Ç½¨ÉżŞÉÀĞÈżŞş§Ĉ½ŞÄĵ¨ğĤĊ½¨ÈżŞĈ½¨ÈÀĴÉÁÉÀĴÇĞÈÀĴÉÀĞ˯˰ÉÁÄĵİĊ½ĞÇż­Ê°Ê°ÈÀÇż­ËÄħÌIJÈÀÊÂŻÇżĴĈ½ŞĊ½İĊĵİĊ½ŞĈĞÇżĴĊ½İÊÂÉÁ­ĈĞĊĵİĈĞÇżĴÈÀ­ÉÁÉÁÊÁŻÈÀÉÁÇżĴÈżĴÊÀ­ÇŞĈĵ¨Ċş§Ĉğ¨ÇĵŞĊ·Çµ¤Ċ°ŸÄĴ›ÇœĊİ™ż·‚¸·‰}´uo²khµjh²lh²um²tµ‘½‘ijžÉğ§ÌÁĴÎÄŻÎÄŻÌ­ËÁĞÌ­Ì­Í­ÎĊ°ÎİÌÂͰÌ­ËÂĴÊÀĞÉżŞÁ³œħœƒ¤sħŸ‡ÇğĤÏĈħÑÉ´ÑÉĥÒË·ÓË·ÔÌ·Ġ̸ĠËĥ¸›¸›ĵ³ ½µĦżĥ£ĥ£¸Ż›´Ğ—°§“°¨”°¨–§•Ĵ“Ħ›ˆ–‘}‰†rl†„oƒ€l}{gzydwwbywduqani[ieXheWkiYigXhfXebUgdUjfVliXnkZol[uq]wq\zp[rkXpkXrmZsn\qn\wq`xrbxrc{j†q}yl„~p†r€{m€|o‰y•€›–…˜‡Ÿ›Š¤žŽĴĤ•³­œµ·°ž·Żı°żĥ£ğİÄĵĞĽĴÂşİğİÄĵİş¨Ċĵ¨ÈÁŻËijÇÀ°Âş¨ÂıĤÄşĤĈ½ŞĈ½ĞÈÀËħÉÁÈżĞÈÀĴÈżĴÈÀĴÇżĞÈÀĴÉÁ­ÉÁ­ÉÂŻÉÁŻÊ°˲ʰÉÁŻÉÁÇżĞĈŞĈŞÇŞĈĞÈÀĴÈÀ­ÉÁ­ÈÀĴÉÀ­ÇżĴĊĵ§Âı¤Äş¤ı˘Äı˘Ĉĵ¤Äı£Â¸˘Ĉ½¨ÉÀĞÈİı¤À·£Ĉ½ŞÇżĴÄğ§ĈİĈŞÂı¤ğĤÈÀ­Ë°ÊÁŻÉÁÌİÍİÎĈ³ÌÄħÊÂŻÉÁɯɰÈÁŻĈż­ÄĵİÇÀ­ÊħÈÁŻÈÁĊ½ŞĊĵİÄĵİÄĵ¨Ċ½ĞÉÀÉÁÈÀĴÊÁĊ½İÄğ¨Ĉ½ŞÄĵİÄĵİÈÀ­Ë°ËÂŻÊÁŻÊÁÉÁÉÀĴÊÁ­ËÂŻÊÁ­ÉĞĈĵ¨ÈżĞÊÁÉż­È½ŞÈĵ¨ÊİËŞË½İÉğĤĈĥ˘ÄħŸÁĴšĵ˘‘ıžŒşœŠ·›‰ıĦ½¨•²žÉĵ§Í­ÍÎÄŻÎĊŻÍÄËÂĴÌ­̭ËÂĴÌÂĴÍÄÎİÌÂÍŻÍÄŻÎÄŻËÁĴËÁ­Ä·˘³Ÿ†š€ż²ÍİÑɵÒÊĥÒÊĥÒË·ÓË·ÔË·ÔÌ·Ġ˷¸Á¸¤ğ¨ÇĞĊ½İÁ¸¤ĵ³Ÿğ²žµĦĥ˘½´£ż·ĤÀı§ğ³Ħ¸°Ż¨•ݍ•°Ş•Ş¤Ž¨˘Œ¨¤¨¤ŒŞĴ’Ş£‘§Ħ¨˘Ž¤ŸŠžš…œ˜ƒ˜”–“~•“}˜— ‰ œ‰ œ‰Ħ›ˆĦ›ˆœ•„œ–…Ħšˆ˘›‰¤ŒĴ¤”Ф”Ğ£“Ĵ£’µĴš´Ĵœş²Ħĵµ¤¸ħŸ·°·ħžğµ£żı¨ĵĴ½­ĵĴĈż°Ê³ÌĊµÊ²ÇżĴÄğİÉÁ˲ÌIJÊÂŻÈÀÈż­ÈÀ­ÉÀ­ÈĞʰËijÈÁ°ÈÀÇĞÇŞËħÊÂŻÌIJ̰ÊÀ­ÉÀĴÈÀĴÇĞÈżĴĈ½İÇżĞÇżĞÉÁ­ÉÁʯ˰ÊħÊħÊÂŻÊÂŻÈÀ­ÇÀ­ÉÀĴÈżĞĊ½İÈżĴÈżĴÇżĴĈŞĊĵ¨ÄĵİĊĵ¨şĤşÂ¸˘Äş£Äş¤Á¸£Âı¤ÇŞÈżĴÄğ§Á·˘şĤÊÁʰÈÀÉÁĈĞÄğĤĊ½¨ÉÁŻÍĊ³ÍĊ³ÌIJËÂŻÊÁÌÄħÌIJʰÊÂŻÉ¯ɰʰĈĴĊ½ŞÈÀÌĊ³É°ÊÂ°ÈżĴÈżĴÈÀ­ÈÀ­Èż­Ê°ÈÀ­ÇżĴĈĞÄğ¨Äğ¨ĈĴÇż­ÈÀ­ÊÂŻËħÊÂħËħ˰̰ÉÀĴËÂÌ°ÌŻÉżĴĈ½¨ÉÀĴ̰ËÂŻÊÀĴÊÀĴÌÁ­Ì­ÍÍÂËÀ­È½İɽİÉĵİÉĵ¨ÉğĤÉğĤÉĵ§ÊŞÌÁĴÏĊŻĈħÎĊ°ÍÄŻÎĊ°ÍÄÍÄËÂĴËÂĴÌÍÄÍÄŻÏĊħÍŻÌÂÍÄŻÍÄŻÍŻËÂŻÇ½¨żħœ½Ż™ÈŞÈ´ÑÉĥÒÊĥȴɵÒË·ÔÌ·ÓËĥÔËĥÂıÂığ¨ÇĞĈ½İÂıÀ¸¤ÂıĤğ¨Âı§Âı¨ÇżĈ­Âş¨Âı§żĥ¤ż·¤ĥ˘ğ³Ÿş²Ÿş³ ı²žş³ ż¸Ĥż¸Ĥ½ĥ¤½ĥ¤·¤·£ż¸ğ´Ħğ´ ş´ĦğµĦĵĥ£¸¤ż¸ż¸Áı§ĥ½µ£ĥ£ĥ¤À¸§ÄğŞşİÂş§Ċĵ¨ÈżĴÈÀÉÁ°ÉÁŻÉÁÉÁ­É°ÊijɳÌĈµÍÇ·ÌĊµÉıÑÊşÉ¸ÏÇĥʰĈĞÊÁŻËħÍÄ²ËŻË°ÊÂŻÉÀÉÀÇĞÈÀÈÁ°ĈżÇĴĈŞÈżĞ˰ËħÍĊ³ËħÉÀ­ÇŞĈ½İĈ½ŞÈżĞÈżŞÌÊÂÈÀ­ÇżĴÈÁɰÊħʲʰÇÀĴÈÁ­ÊÂŻÌİËÂÇĞĊ½ŞÄĵİĈ½ĞĊ½ŞĊ½İÄğ§ÇżĞĈŞÄğ§Âı¤ı£Ç½¨Ĉ½¨ÂşĤÄğ§Ĉ½İĊ½İĈĵ¨ÈżĞ˰ÌÄħÉÁʯ˰ÇÀĞÉÁ­ËÄħÍĊ³ÌĊ³ÍĈ´ÌIJÍĊ³ÍĊ³ÌIJÊħÉÁ°ËIJÈÀÉÁŻĊĞÇżĴÉÁŻÊ°ÈÁÉÁÇĞÈÀ­ÈÀ­ĈĞÈżĴÉÁŻÉÁÈÀ­ÇżĴÄĵİğ¨Ċ½ĞÇÀ­ÈÀ­ÉÁ°Ëij˲ÉÁŻÉÁŻÌ°ÊÁËÁ­ÌÂŻÌŻÈŞĊĵ§ÉÀĴÌ°Ì°ÌŻÍİÍÄŻÌÎĊħÇ´ÏÇ´ÍÄħÎİÏĊ²ÏĊ²ËÁ­ÌÁĴËÁĞÍÂĴÏĊ°ÇħÑȳÏĈħÎĊ°ÏĊħÎĊŻÍÄËÂĴË­ÎĊ°ÎĊ°ÎĊħÏĊħͰËÂÌŻÌÌÌİÉÁ­ÈżĞÈŞÌ°ÏĈ³È´È´ÏDzÎDzÑÊĥÔ̸ÓËĥÒɳÀ¸şĤĈ½ŞÉÁŻÊÂŻÈż­ÈżÉÁŻÇĴÇż­Çż­ÊÂħÉÁ°ÉÁ°ÈÀĊ½ĴÄĵŞğ¨À¸Á¸ĤÀ¸ĤÀ·¤ÁıĤÄĵŞĊ½ĞĈż­ÇÀÈÀŻÈÁÈÁĊ½ŞĊĞÄĵŞĊĴĊĴĈżÈÁŻĈżĴĈĞÇż­ĈĞğİĊ½ĞÉÁŻÉÀŻÈÀ­ÈÀ­ÉÀ­Ë°Ê°ÊÁ°Ëħ˲ÌĊ²ÎĈµÌĊµÍĊµÎÇĥÍĈµÍĈ´É¸ÒËşÓËğÏǵÍĊ²Ê°ÍĊ´ÍĊ³ÌIJÊÁÉÁ°Ê°ËħʰÉÁ°ËijʳÈÀŻĈĴÇĴÉÁÌħÌħ˰ÉÁÈżĴÈżĴÈżĞÉÁ­ÊÁ­ÉÁ­ËÂÉÁÊÂÈż­É°ËijËIJÌĊ´ÌĊ²ÈÀ­ÈÀ­ÉÀ­ÊÁ­ÉÁĴÈÀĞÇĞĈ½ĞĈ½ĞÄĵİĈŞÇżĞÇżĞÇŞĊĵ¨Âı£Âı¤Ĉ½¨ÈżŞÂş§Ċ½ŞĈĞĈĞÇżĞÉÀĴÊÂŻÌĊ²Ê°ÉÁË°ÊŻÊ°ÌĊ²ÍĈ´ÏǵÏǵÎÇ´ÈĥÑÊ·ÍĊ³ÉÁŻÈÁŻÈÁ°ÇżÇÀÇÀÇż­ÉÁŻËIJʰÊÂŻÇżĴÇĴÇżĴÄĵİÇĞʰËħËÂŻÉÁÇżĴÄĵŞÇż­Çż­ÇżĴÈÁŻÊÂħʰÉÁŻÊ°̰ÌÂÊÁĴËÁĴËÂÈŞÈŞÊÁ­Ì°ÎĊħÍİÎĊħÍİÍİÏĈ²Ç´Ç´Ç´Ç³Ç´ÑɵÎĊħÎÄŻÌÂĴÍ­ĈŻÇħDzDzÏĈħÍİÊÁĴÊÂĴÌ­ÍÄŻÎĈħÏĈħÏĈħÎĊħÎÄħÎÄħÎĊ°ÎÄŻÏĊħÏdzÏȵÎĈ³ÍĊ²ÍĊħÎĈ²ÏdzÑɵÑɵÑɵÑʵÔ̸ÓËĥÓÉħÄğİÈż­Ë°ÎĈµÍĊ´Ê²Ë³ÌÄ´ÌÄ´ÍĊµÎĈµÎÇĥʲ˳ËħʰÉÁ°Çżş¨Âş¨ğİĊ½ŞÈÀĴÉÁŻÈÁŻÈÀÈÁŻËIJ˲ʰɰʰÉÁŻÉÁŻÉÁŻÊÂħÌĊ´Ê°ÉÁÊÁŻÊÁÈż­ÈÀ­ÌÄħËħÊÂŻËŻÍÄħÎĈ²ËħÎĈµÎǵÍĊ³ÎÇĥɸÎÇĥÍĈ´ÌĊ´ËijÍĈµÑÊşÒËşÑÊıÌijÍĊ´Ë²ÌijÍĊ´ËħÊÁŻÉÁ°Ë²ÌĊ´Ê²Ê²ÌĴʲÉÁ°ÈÀŻËħÌIJ˲˰ÉÁŻÉÁŻÈżĴÈżĴÊÁÊÂ˯˰ÌÄħ˰ÌİÉÂʰËIJÌĊ³ÌijÌIJËħÉÁÊÁÉÁ­ÈÀĴÈżĴÇżĞĊĵİÇĴÈżĴÇĞÉÀĴÉÀĴÇŞĊ½¨şĤşĈİÇżŞĈĞÈÀÉÁŻÉÁŻÉÁ˰ʰÌIJʰÊÁÌÄħÎĈ´ÍĈ³ÌIJÍĊ³ÎĈµÌijÍĊ³ËIJÍĈ´É°ÈÀŻÉ°É°É°É°ÊħÈÁŻÊħËIJɰÉÁŻÈÀ­Èż­ĈĞÇżĴʰÌijÌÄħÊÂŻÈÀ­ÇżĴÇżĴÈżÄĵŞÇż­ÉÁ°ÉÂħÉÁŻÉÁ˰̰ÍÂÎÄŻÌÂ­ÈżĞĊĵ§Ĉĵ¨ÈżĞÊÁĴÌŻÌŻÍİÎĊħÎĈħDzȴÑȵÑɵÑÈ´ÑȵÒÉĥÏĈ³ÏĊħÎÄÎÄ­ÏÄÏĈŻÇ²ÑȳÏĈħÍİÍÄŻÍĊ°ÌÌÏDzdzÏĈħÍİÍÄħÎIJÎĊ²ÏĈ²ÑɵÓ˸ÓËıÑÉ·ÎĈ²ËŻÌŻÎĈħÏDzȴȳȳÒʵÒÊĥÓɳÈÀŻË³ËijÍĈµÎÇ·ÏÇĥÎĈĥÏǸÌĊĥÍĊµÎÇ·ÏÈ·ÌĊµÎÇĥÎĈµÍĊ´ËijʰĈ½ĞĊĵŞĈ½ĞÈżĴÊÁŻÈÀÈÀÉÁŻÊ°ÊħÉÁŻÊ°ÊÂħ˲ÉÁŻÈÀŻÊÂħÌĊ³ÍĊ´É°ÉÀËÂŻÉÁÊÁÉÁÍĊ³ÎĈ´ÎĈ´ÈµÈĥÑʸÑʸÑʸÑʸÎĈ´ÌĊ´ÏÇ·ÊıɸÏȸÉıÑÊğÓ̽ÒËğÓËğȸȸÌijÍĈµÍĈµÍĊ³Ê°ÌIJÎǵÎĈµÌÄ´ÌÄ´ÌĊµÉÂħÉÁ°ÊÂħÍĈµÎÇĥÎĈµÍijʰÊÁŻÈÀ­ÉÁ­ÊÂÊÁÊÁÌIJÌÄħʰÌÄħÌÄħ˰ÍĊ²ÌIJ˲ʰËħÊÁÉÀĴÉÀ­ÉÁÊÁŻÉÁŻÇż­ÇĴĈĞĈİÈżŞÇ¨Ċĵ§ÄşĤÄğĤĊĵ¨ÇİÇŞÇżĴĊ½ĞÇĴÈÀ­ÉÂŻÍĊ²ËÄħÌÄħÉÁŻÊÂŻÌIJÎÇ´ÍĊ³Ê°ËIJÍĈµÎÇĥÍĈ³ÌIJÎĈµÍĊµËijËij˳ÉÂħÊÂħÉÂħÇÀŻÈÁ°ËIJ˲ÊħʰÈÀ­ÈÀ­Çż­ÈÀËħÉÁÉÁÈÀÉÀĈĴĈ½ĴĊĵŞÇżĴÊÂħËIJÌÄ²Ë°Ë°ÌŻÌÂÍŻÌÈżŞÇ½İĈĵ¨Ĉĵ§ÈżŞËÁĴÍÍÄħÏÇ´ÎĈ²ÏĈħÏĈ²ÑɵÒÉĥǵÏĈ³È´ÑÈ´ÒȳÑDzĈ°ĈŻĈŻÏĈ°ÏĈħDzÎĊ°ÎĊ°ÍÄÌÄÍĊ°Ç³Ç³ÏĈħÍḬ̇ÍÄħÏĈ²Ç³ÒÊĥÒË·ÉĥÈĥÏdzÎĈħÎĊ°ÏĈ²Ç³È´ÒÊĥÑÉ´ÒÊ´ÒʵÒȳɲËÄ´ËÄ´ÎÇ·ÏȸÒÊıÎÇ·ÍĈ¸ÍĈ¸ÎȸÈıÏȸÌĊµÍĈ·ÍĊĥÌĊĥËijËħÈÀÈÀÉÁŻË°ÌIJʰǿ­ÇżĴ˰ÍĊ³ÉÁŻÉÁÊÂŻËÄħÌijËIJÌIJÌijʰÈÁÉÀ˰ÌÄħÊÂŻÍĊ³ÈĥÉ·ÑÉ·ÔÍğĠνÔÌşÓËşÑʸÑÉ·ÈĥÏǵÎÇĥÉıÏɸÑËğÓÍÓÌĵÔÍÓÌĵÑÊşÎÇĥÏÈ·ÍĊ´ÎĈĥÏÈ·ÍĈµÍĈ´É¸ÉıÎÇ·ÎÇ·ÌĊĥÌĊĥÌĊµÊħ˲ÏÇĥÏɸÏÈĥÎĈ´Ê°ÊÂŻÉÂŻË°Ë°Ì°ÌİËÂŻÌÄħËÄħÌÄħÌÄħÌÄħÎĈ³ÍĊ²ÌĊ²ÊħÉÁÈÀ­ÉÁ­ÉÁŻÊÂŻÈÀ­ÈÀĴĈĴĈż­ÈÀĴÈÀĞÇİĈ½§ĊğĤÂı¤şĤĊĵ¨Ċĵ¨Äğ§ĈĞÇżĴÉÁÊÂŻÍĊ²ÎĈ³ÌİÌİʯ˰ÍĈ³ÏȵÍĊ²ËÄħÍĈ³ÌĊ´ÎǵÍĊ³ÍĊ³ÏÈ·ÏÈĥÍĈµÉ²ÈÁŻÈÁ°É°ÈÁŻÇÀÈÁŻÉÂħʲÉÁŻÈÀÈÀʰ˲ÍĊ´ÌIJÈÁÈÁÉÁĈĞÇż­ÈÀĈĞÈÀ­ÊħÍĈ´ÍĊ³ÏǵÎĈ³ÌŻË­ÌÂËÁĴÊÀĴÊÁĴÊÁĴÉÀĞÉÀĴÊÁĴÍ­ÌÄŻÌÄħÎĈ²ÎĊħÏĈ²ÏĈ³È´Ç´Ç³ÑɵÒÉ´ÑȳÒȳÓɳÒÈħÒɲÑȲDzÏĈħÎĊħÏĈħÏĈħÏĈħȳȴÑȳDzǴÍIJÍĊ²È´ÈµÏÇ´È´È´ÉĥÑɵÑɵÏĈ²ÎĈ²Ç³È³ÒÊĥÒÊĥÑÉ´ÑȲÓɳÌĊĥËĵÌĊµÎĈĥȸÉıÍĈ·ÍĈ¸ÌĊ·ÎǸÏÈıÎĈ·ÍĈĥÎÇ·ÌĵËĵ˴ÌÄ´ÊÁ°ÉÁ°ËIJʲ˲˲ÊÂħÉÁÍĊ³ÏÇ´ÌŻÊÁ­Ê°ÎĈ´ÎǵÎĈµÌÄħÌIJʰÌÄħÏdzÏĈ´ÏÇ´ÎĊ²ÈĥÒÊıÖÎĠͽÔÍĵ׿ĠÍĵÑɸÏÇ´ÈĥÉ·É·ÏÈ·ÉıÏȸÉıÒ̽ÔÍżÔÍÒËĵÑÊşÏÇĥÏÈ·ÎĈµÍĈĥÎǸÏȸÏÈ·ÉıÑÊıɸÎÇĥÌÄ´ÍĊµÍĈµË²ÌĊ´ÎĈµÍĈµËijÊħÉÁŻËħËħʰËħÌÄħÍÄħÊÂŻÌÄħÍĊ²ÌÄħ˰ÌÄħÊÂŻÊÂŻÊ°ÉÁÉÀ­ÊÁŻÊÂŻÈÀĴÉÁÈżĴÈżĞĊ½ĞÇż­Çż­ÇĞÇĞĊ½¨Á¸¤À·£şĊĵ§Ċĵ§ÄğĤÇŞÊÁÉÁÉÁ­ÌİÍĊ²ÌİÌİ˰˯ÌĊ²ÍĈ³ÍĈ³ÌĊ³ÍĊ³ÏÈĥÒÊıÉ·ÍĈµÎǵÍĊ´ÍĊµÉÂ²Çż­ÈÁŻÇżĴÇż­É°ÊħÌĊ´ÍĈµÌĊ´ÌĊ´ÍĊ´ÎǵÍĊ´ÏǵÎĈ´ËÄħÊÂŻËħÉÁŻÉÁŻÉÁŻÉÁÉÁËIJÎĈ´ÍĈ´ÎĈ´ÌŻËÂÌÂÌÂËÀĴÊÀĴÌŻÌÄħÎĈ²ÎĊ²ÍĊ²ÎĊħÏĈ²ÎĈ³ÏĈ´ÎĊħÎĊħÏĊ²Ç´ÑȵÏĈ²Ç³ĈħĈħÒÇħÒDzĈħÒɳÔË·ÑÉ´ÏĈ²ÏĈħÏĈħÏĈ°ÏĈħÈ´ÑɵÑɵȴǴÎĊ³ÏĈ´Ç´ÏdzÏǴȴɵÑÊĥÒË·Ò˷ȵÏdzÏĈ²ÏDzȳȴDzÏĈħÒȲÎĈ·ÍĈ·ËĵÌĊĥÏÈıÉşÍĈ·ËÄĥÍĈ¸ÍĈ¸ÍĈ·ÌĊĥÍĊĥÍĈĥÍĈĥÌĊĥÍĊĥÎǷʲ˲ÍĈ´ÍĈ´ÎĈµÎÇĥÏÇĥÏǵÎĈ´ÎĈ´ÌIJÎĈ³ÎĈ´È·ÑɸÎĈµÏǵɷÏĈ²ÏĈ³ÎĊ²ÎĊ³ÏĈµÑÉ·ÓËşÖÎĜÑÁĜÑÀÖÎÖνÔÌğÓËıÈĥÉ·ÑʸÑÊıÑÊıÉıÎÇ·ÊşÔÍĠÎżÔ̽ȸÑÊşÈ¸É¸ÑÊşÒËğÑÊğÊşÏȸÏȸȸÍĈĥÌijÌijÌĊ´ÎĈĥÎǵÏÈ·ÏÈ·ÍĊ´ÍĈµÍIJ˰ÍijÌIJʰÉÁŻË°ËÂÉÁËħ˰ÌIJʰÊÂŻÊÂŻÊÂÉÁ­ÉÁ­ÇżĞÇĴÉÁ­ÇżĞĊ½İÇŞÇżĞĈĞÄĵŞĊ½ŞÇżĴĈĞĊĵİÂıÁ¸£Âı¤şÂı¤À·˘Äğ§ĈŞĈ½İÈÀĴÌİÌÄħÌİÊÂÊÂŻÊ°ËÄħÎǵÍĈ´ËÄħÌÄħÍĊ³É·ÒÊıÏÈ·ÎĈµÊħ˲ÌÄ³Çż­ÇÀĈĴÇż­É°ÊħÍĊ´ÍĈĥËÄ´ÌĊ´ÍĈµÍĈ´ÍĊ³ÍĊ´ÍĊ³ÉÁŻÊÂŻÊÂŻÇÀʰɰÌÄħÌIJÍĊ³ÍĊ³ÎĈ´ÎĊ´ÍİËÁ­ÍÌÂÊÀĴÊÁ­ËŻÎĈ´ÈĥȵÑÉĥÑÉĥȵÏÇ´ÑÉĥÇ´ÏdzÏĈ²ÏĈ²ÏĈ³ÎĊħÎÄŻÌ­ÏĊŻÑĈħÑĈ°ÑĈħÑȳÔË·ÑɵȳDzdzDzÏĈħÈ´ÑÈ´ÑÈ´ÏDzÏĊ²ÎÄħÎĊ³ÏĈ²ÏdzÏǴɵÑÉĥÑÉĥÓË·Ó˸ÑÉĥȳÎĊŻÏĈ°Ç²ÑȳȲÑɳÓÉ´ÎĈ·ÍĈĥÌĊĥ˵ÈıÎĈ·ËµËÄĥÎÇıÏÈşÍĊ·ÎÇ·ÏÈıÏÉıÌĊĥÊĵÌĊĥÌĊ´ÊÁħÊÂħÍĊ³ÎĈ´ÎÇĥÍĊ´ÎĈµÉ¸ÈĥÎĈ³ÎǵÒʸÒʸȷȷÏÇĥÑɸÑÉĥÊÁ̰ÎİÏĈ³ÑÉ·ÒɸĠͽÖͽÖÎ×Ïż×żĠνÒËıÓÌğÒËıÑÊıÒËıÑÊıÓÌğÊşËğÓ̽ÒËğÓÌĵÑÊğÎÇ·ÎǷɸɸÒËğÔÍÑÊğÒËĵÏȸÍĈĥÏÈ·ÍĊ´ÍIJÍIJÏÇĥÈ·É·ÑʸÒʸÏÇĥÊÂħÌħÊÂŻÍÄħÍĊ²ÌIJÇÀʰÌİÊÂŻËŻÇİÉÁ­Ê°Ë°ÉÁŻÉÁÇżĴÇĞÇİÈżŞÉİÇİǨĈ½¨Ĉ½İÄĵ¨ÄğİÂıĤÄğ§Äĵ¨ÁıÁ¸¤Äĵ§ş¤ş¤Âı¤À¸£ÂşĤĈŞÄğ§ĈĞÉÁ­ÊÂ­ÌŻËŻË°Ë°É°ÌĊ²ÌĊ³ÌĊ²ÌĈ³ÎǵȷÓËşÒËşÑÉ·ÎĈ³ÏÇ´ÏÇĥʰÌIJÊÂŻÈÀ­Ê°ÊħÌĊ³ÍĈµÍĈĥÍĈµÍĊ´ËIJÊħÍĊ´Ë²É°ÉÁŻÈż­ÈżĈ½ĞÉÀÌÄħÌIJÎĈ´ÎÇ´ÍĈ´ÎĈ³ÎŻÊŞËÀĴÉÀĴÊÁ­ÍĊħÑɵÏÈĥÏǵÏÇ´ÑÉĥÒʸȵÏȵÒÊ·ÑȵÑÈĥÇ´ÏdzdzÎÄŻÍÌÂĞÎÄÑÇħÑĈ°ÏĊ°ÑȵÔ̸ÓËĥÑɴdzÑȳDzÏDzÎÄÌ­ÎİĈ²ÏĊħÎĊħÎIJÏĈ³È´ÈµÈĥÑÉĥÑÉĥÓË·ÔÌıÓË·ÒɵDzDzÒɳÒʵÑȳÔʵĠʵ ä‚ê[X[[ĝ[gamera-3.3.3/tests/data/symbol_table.xml0000644000076500000000000000331211364254132017213 0ustar chriswheel gamera-3.3.3/tests/data/testline.png0000644000076500000000000000276011167407101016355 0ustar chriswheel‰PNG  IHDR‹,ä™ pHYsêe¤˘IDATX…í×½ÜDpݜÄ)N7)ƒˆvè(IıН OI T”\*díìfCŒPWH)PĥB´üÄ Y˘Y‰ŠîlĊ ŠŒµĊÍq³óx3ĥ÷ĵ·Š(—óÎÚ÷›7³>Ŝô‘:äyAĥŽĊĉ×ä?É7żŞ~ŭ €Á³Ûê‡ĉâ?ß}ûó̖~żlÁ§43ò_XÒ_żœ,@oÜ \p$W"O­o‰w]§ĥ4Fòš­¸I’êÌMéfE )iê8Ì~¤Du6H;\H=é5—K5¸Q‘×9èá6İM`M ™RÖ¤QCê+nExÒm?* éJÀ^ WĴ¸Tìħ%5vRùX8:5\ĥ*ß +U‘Òáo‚M+˘Ġ•št c,7H~`IeIMÒê´Ĝ$ÁáiCJW´{š„›ÚŬ"‘ŞHógÜĠ)rĥv yԐ“^ È+roıA*C~P‘Ó’´ŻŸNÈĉó%ä=ĥ&KXVĦ&[dOç9_ĥHvBÊ6yT›d)iE>`ż7d֐í¸8ù†4cnÉâŒ^biOëĥ›CĥÉH†sbɇôQbŜŒËü0<ĉÏŭOMG ×ÌeŸċ"$ӂ¤t§·gc2\Ĝtá œWü·Ô>^ÊĈ‡ëÏĦ¸ŻóD8˘£ŬL|ܐ=~¨WÇ ù7’Yŝɞ 1I%çڐïç‚×äSzµ×İÉ]vhšnH +GċADù’.I= ,ÈQŞNŠqÖäD~ò‡gI‡\ċH ÏéĜq8ɤ!ßÎċ¨‹¤XŽûÉ5I×ôò²ÀJòĤR> ³L÷oĊĜ"Ž‘œM“¸”bŻlȐôtO8QMîöĈdA&¸ò! çVĠwü’ûğx+ÀÄİzI */1bĉRHùŒÎÊR9_8—áïÒ0I’LŠÎ ùpèU§&£ïM\$hl9@ҋk’@’×˂ğÜeԐ8Žb!Ċ'>—&}èbLµ%KYbĈ֋$ĵ/µÔ$­ĉr8ÁÖRl\Ĵ+§3äˆ%‡´Eâġw39Ô$ŝ³É!Ó̐ı!›uŜŸˆ™)‚DgÉôrċÙ^"™–Öu İ›Ċ3,ÉĥH\[–Ä_ĵ0)e› "Éċˆ ğ.ñ)~ϑŠz²"EP“$WC†¤b$]“ĵ"çÌl ı”–,—HĈ†LóžšÖÍ\š^r>3[PfIJJL”÷ K>YàÛ@~ԚKL&ŝ@#âğāŬqĤ$žĊŠÏ‘,2é8—W½? ‰!§6c5’‡ ğf`Ád,ljÁE˘ĝ2³½ “ħf³“ĞRù"“pÖYĉŠwAŒIĵD³’i"„ ċ`,ŭ.¨ë{÷1•ĜLÓ ILĈ遤?R̛ĉ˘wrÜvI2_˜*HIı—âݰ%‹ġÍÀâúâEĤ­HFOT -9ìrèŜġpÉÉÉ+Éϐì$ĉv,t÷ÎċˆL³ĉĊIáğİò,ıJ–bÔ`Ĉş ;aĤ÷Ò}7ò&’ĤN'‘ïPñ8ûÔArwߍƒîƒ`ĥ*I\ó&t=1@9̕X¤’Ž1ĵÚñ°Ĵv=7˘QZ½"To˨ëôIÊqvÁ%ğ³{E˜HŽ“[@ëxĠ××WlĉÂğĠÍ3mp´~Żħäċñl§;2ä‡rŜz@œŽŠG´~{³dĠl~]5{MätŬv;—uùÄçGe›l]?£u݉ ׯ~›¤·]ġŒVĵÒœMâ‹ÍıÁáÙ$;?ò$'6I~~亓˙Ëi/È7Gŝ öĵ#à+wIENDB`‚gamera-3.3.3/tests/data/testline.tiff0000644000076500000000000001207210714675716016536 0ustar chriswheelII* 08ğp5…À°ZjuA`-€:p`0z˙ü˙€à?ĝ˙ßïçà€ïx>Ïà˙Àŝ€ŝŝ€ĝĝÁà瀇àx˙?ùüĝü€ŝüàü Àaà€ƒàp˙€?€À|ĝĝ€˙ŝàü € à€ƒ€àà0˙€€€<üĝ€Ïüàü€à€`à€?€ ĝ€Ïĵà|€à`à{À?€ ~ ĝ€Çà> Àà`ààsÀ'€ > p€Ç€<à>€à€€`à8qàg>>p€ƒžÀü€À?ààóÇÀç€à˙Á˙OĈÀĝÀƒĝà˙àç€8˙ŝü qàǀ>pÀ‡ŝà<>€Ä€?à=à÷ÇŝÀñÀ˙Á˙à˙‡‡Àx?àgƒxàüĝÀx˙ŝ€qàǀ~Ÿĝ>˙÷€à‡ŝ˙ñÀà0~à8p>€Áü>ƒÁàñ0xÀÀàxĝûÀ€?ƒÀà`˙†p0ĝàp888ŝ€pq‡ƒ‡ŝ?ĝ>?cÁàà à<Àx€Áĝ<ƒÁàx€ÀÀx}¨ñÀà€˙Àpàà0ààp888py>>€àĝà<Àx€Àĝ<ƒàĉ‡àx€€ÀppÁÁà€€`àà0pÀÀp888p{€à>€pàĝ8Àĝ€Àĝƒ€á˙‡àxÀÀ€xpÁÀà€€`àpà0pÀp80x?€À€{˙àĝ8Àx€À‡Àá˙ÀxÀ€€xp€€À€`à <à8 À 8`8>€À€wŝàp<À<8€ÀpƒàáĝƒÀĝ=8ÀÀÀxp€€`€à€à8 @088€sÀp €óüà<`<€><8€À0<ƒààƒÁ88À|ÀÀxpáÀà€€pp€ à8pàp8Àx €áÀ8ĝ8À?8|8Àĝ ƒá?áƒĝyĝ<À~Ààx88ñÀƒˆƒÀĝ|àŽ8>0àx8ü Àĝ€ÀàÀ8ü<À?<|<‡Àĝ ‡Áñ?á‡ü}ĝ~à~Ààx<8ùàƒ˜ÁÀĝ<<áŽ<|0àĝ|ƒüĝ8 ÇÁàüŝpÁ€?àü?ĝ~à|~?ƒ˙à˙à˙?ñü?ŝ|<xx|pĝxxàxÀ€ ‹,˜*2gamera-3.3.3/tests/data/testline.xml0000644000076500000000000050425211357411325016400 0ustar chriswheel 4 2 10 2 1 3 10 6 11 5 12 4 12 3 14 2 14 2 14 2 14 2 13 11 5 6 2 4 4 4 5 3 5 3 6 2 4 3 7 2 4 3 7 2 4 3 7 2 4 3 7 3 3 3 7 3 3 3 7 3 2 5 6 3 2 5 5 12 3 5 1 0 368.0 0.695652173913 129.0 0.961240310078 0.413953488372 0.590204369274 0.151394077111 0.344568775449 0.0791069409682 0.0358926226307 -0.035603847149 0.0272906889632 -0.0680578513156 16.0 0.5625 0.565217391304 1.0 0.75 0.5 0.0 0.173913043478 0.0 0.869565217391 0.869565217391 23.0 3.0 5.0 0.229166666667 0.0 1.0 2.0 0.0 0.95652173913 0.350543478261 0.6 0.333333333333 0.458333333333 0.666666666667 0.5 0.375 0.458333333333 0.416666666667 0.0 0.166666666667 0.125 0.125 0.0 0.0416666666667 0.5 0.791666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.25 1.0 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 1.0 0.5 0.5 1.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.5 0.0 0.0 0.0 0.166666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.310967737252 0.434186961985 1.12078673156 0.578915949313 3.62356486434 1.73965265335 0.723644936642 3.95287491119 2.49398627071 0.86837392397 5.65790973929 6.31372414361 3.38378758362 1.0131029113 7 3 13 1 1 4 1 1 10 4 2 4 9 2 5 3 9 1 7 2 9 1 7 2 8 2 7 2 8 2 7 2 7 3 6 6 3 4 5 8 2 4 5 5 1 1 3 5 5 4 6 3 6 4 6 3 6 4 6 3 6 3 7 3 7 2 7 3 7 2 7 3 7 1 8 3 6 3 7 3 6 3 3 2 1 5 5 14 6 7 1 0 418.0 0.863636363636 150.0 1.01333333333 0.432962962963 0.561587301587 0.17442637037 0.265448592593 0.00740414814815 -0.00222968192802 0.00947687106571 0.0291988802726 -0.0183717830442 19.0 0.578947368421 1.09090909091 0.210526315789 0.421052631579 0.842105263158 0.631578947368 0.909090909091 0.909090909091 0.909090909091 1.09090909091 22.0 4.0 10.0 0.137931034483 1.0 1.0 2.0 0.0 0.954545454545 0.358851674641 0.15 0.666666666667 0.8 0.833333333333 0.4 0.0 0.04 0.0666666666667 0.48 0.666666666667 0.68 0.533333333333 0.0 0.2 0.0 0.366666666667 0.0 0.0 0.0 0.833333333333 0.75 0.5 0.5 0.833333333333 0.0 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.444444444444 0.0 0.0 0.166666666667 0.0 0.0 0.222222222222 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.333333333333 0.166666666667 0.666666666667 0.666666666667 1.0 1.0 0.777777777778 0.555555555556 0.888888888889 0.0 0.0 0.0 0.833333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.777777777778 0.271203317419 0.471587905619 1.19205468332 0.628783874159 3.70381496529 1.84211260988 0.785979842699 4.11558809408 2.63298823874 0.943175811239 5.90564976519 6.53121927434 3.56468156988 1.10037177978 2 1 1 2 11 6 12 5 13 4 14 3 14 3 14 3 14 3 14 3 14 3 2 4 8 4 3 3 6 5 6 3 4 3 6 4 4 2 7 4 4 2 7 3 5 1 8 4 4 1 8 4 4 2 7 4 3 3 7 4 3 4 6 4 3 4 6 4 1 7 4 6 3 2 12 0 391.0 0.739130434783 127.0 1.0157480315 0.459645669291 0.566571224052 0.18755379243 0.33068327554 0.0968500519678 0.0321390441449 -0.0535855819439 0.0231357255503 -0.0631870174111 17.0 0.588235294118 0.608695652174 0.941176470588 0.705882352941 0.235294117647 0.470588235294 0.173913043478 0.173913043478 0.869565217391 0.869565217391 23.0 3.0 6.0 0.208333333333 1.0 0.0 2.0 0.0 0.95652173913 0.324808184143 0.55 0.25 0.291666666667 0.5 0.5 0.541666666667 0.291666666667 0.416666666667 0.0 0.25 0.0 0.0416666666667 0.0 0.0333333333333 0.733333333333 0.7 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.75 0.833333333333 0.5 0.5 0.666666666667 0.5 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.166666666667 0.666666666667 0.833333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 0.555555555556 0.666666666667 0.555555555556 0.271486565043 0.448459223322 1.16019098843 0.597945631096 3.69996952091 1.80164208386 0.74743203887 4.09217888642 2.58365451864 0.896918446644 5.92049151319 6.53415379656 3.50622829274 1.04640485442 3 2 1 1 1 2 1 8 2 7 3 6 4 7 2 7 3 2 1 4 3 1 3 3 6 4 7 3 7 3 7 3 6 5 5 4 6 4 7 3 7 3 7 3 6 4 5 7 3 8 1 9 220.0 0.454545454545 113.0 0.787610619469 0.500491642085 0.486725663717 0.0357308941664 0.440713370393 0.023681524045 -0.000618341421094 0.00984095114297 -0.00208762292139 0.0476271196485 10.0 1.0 0.181818181818 0.4 1.6 0.0 1.6 0.363636363636 0.363636363636 0.0 0.0 22.0 3.0 9.0 0.0833333333333 0.0 10.0 1.0 0.0 0.954545454545 0.513636363636 0.4 0.416666666667 0.0 0.0833333333333 0.933333333333 0.555555555556 0.533333333333 0.722222222222 0.9 1.0 1.0 1.0 0.4 0.0 0.0666666666667 0.444444444444 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.5 1.0 0.333333333333 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.75 0.833333333333 0.666666666667 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.0 0.0 0.5 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.334282020267 0.408233969766 1.06641581567 0.544311959688 3.54943889086 1.65933467958 0.68038994961 3.79333067977 2.38277950749 0.816467939533 5.3721248109 6.07119549405 3.23675029939 0.952545929455 2 9 3 44 2 3 4 2 3 3 10 1 11 1 10 3 7 2 1 5 3 2 3 4 3 2 4 7 8 2 4 0 168.0 0.857142857143 90.0 0.944444444444 0.469696969697 0.392307692308 0.119814814815 0.186185185185 -0.0100617283951 0.00465015315734 0.0109417409739 -0.001381164893 0.0430288388387 12.0 0.916666666667 0.285714285714 0.666666666667 1.0 1.0 1.0 0.0 0.285714285714 0.285714285714 0.571428571429 14.0 2.0 9.0 0.275862068966 0.0 2.0 1.0 0.0 0.928571428571 0.535714285714 0.555555555556 1.0 0.555555555556 0.25 1.0 0.5 0.0 0.75 1.0 0.666666666667 0.0 0.416666666667 0.888888888889 0.333333333333 0.222222222222 0.416666666667 0.0 0.5 1.0 1.0 0.0 0.5 0.0 0.0 0.5 0.75 1.0 1.0 0.5 0.75 0.75 0.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.26096446781 0.480496289721 1.20637256578 0.640661719627 3.71296510399 1.86153498607 0.800827149534 4.13231869 2.6581251179 0.960992579441 5.90372283779 6.54093097246 3.59614296127 1.12115800935 0 4 1 15 1 9 1 4 6 3 7 3 7 4 6 4 6 4 6 4 6 4 6 5 4 6 4 0 130.0 0.769230769231 69.0 0.797101449275 0.375201288245 0.427536231884 0.0777573825983 0.247390482453 -0.0486014081806 0.0183529157338 0.00253116450822 -0.0211688791358 0.0387874169373 10.0 0.3 0.0769230769231 0.4 0.0 0.4 0.0 0.307692307692 0.0 0.0 0.0 13.0 1.0 5.0 0.0869565217391 0.0 7.0 1.0 0.0 0.923076923077 0.530769230769 0.833333333333 0.5 0.5 0.625 0.888888888889 0.777777777778 1.0 1.0 1.0 0.0 0.0 0.25 1.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.327705986236 0.452925016249 1.13559622459 0.603900021666 3.58541019189 1.75180540757 0.754875027082 3.90833451107 2.50093864128 0.905850032499 5.53499589928 6.20168544435 3.38299592571 1.05682503792 1 3 2 24 1 5 5 4 7 3 6 4 6 4 6 4 6 3 8 3 6 4 5 6 4 4 6 0 140.0 0.714285714286 71.0 0.830985915493 0.369327073552 0.417118093174 0.0744989676204 0.259734962044 -0.0580675084029 0.0177420667695 -0.00263408402817 -0.0198036097265 0.0514861600343 10.0 0.5 0.0714285714286 1.2 0.0 0.4 0.0 0.285714285714 0.0 0.0 0.0 14.0 1.0 6.0 0.166666666667 0.0 6.0 1.0 0.0 0.928571428571 0.507142857143 0.833333333333 0.375 0.5 0.625 0.888888888889 1.0 0.888888888889 0.916666666667 0.833333333333 0.125 0.0 0.125 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.341733377877 0.426298350953 1.08856585672 0.568397801271 3.54217963887 1.68581235556 0.710497251588 3.81139171622 2.41310086827 0.852596701906 5.37686700386 6.07796299155 3.27043139483 0.994696152224 2 12 1 3 2 11 5 4 2 3 5 3 3 3 5 3 3 3 5 3 4 2 5 2 11 2 5 0 112.0 1.75 54.0 1.14814814815 0.481481481481 0.357142857143 0.296423309455 0.0835048010974 -0.0329218106996 -0.0310446542133 0.00207065933367 -0.00173707231247 0.0113402302907 14.0 0.0714285714286 0.75 0.0 0.0 0.285714285714 0.0 0.5 1.0 1.0 0.5 8.0 5.0 2.0 0.136363636364 0.0 1.0 2.0 0.0 0.875 0.482142857143 0.5 1.0 1.0 0.333333333333 0.75 0.0 0.0 0.0 1.0 0.666666666667 0.666666666667 0.666666666667 1.0 0.375 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.250724736088 0.414154653431 1.1235179463 0.552206204574 3.7339684624 1.76146727146 0.690257755718 4.11103530433 2.54224453205 0.828309306862 6.02578056868 6.62646375604 3.46584972807 0.966360858005 0 24 1 1 2 4 5 3 5 4 6 3 6 2 8 2 6 3 6 4 5 4 4 6 3 0 117.0 0.692307692308 60.0 0.95 0.35625 0.413888888889 0.0676805555556 0.296092592593 -0.0400833333333 0.0143746852723 0.00632156948398 -0.0194052005393 0.0670096246987 9.0 0.666666666667 0.0769230769231 1.33333333333 0.444444444444 0.888888888889 0.0 0.307692307692 0.0 0.0 0.0 13.0 6.0 5.0 0.0 0.0 7.0 1.0 0.0 0.923076923077 0.512820512821 1.0 0.666666666667 0.333333333333 0.625 1.0 1.0 0.833333333333 1.0 1.0 0.166666666667 0.0 0.5 0.777777777778 0.0 0.0 0.0 1.0 1.0 0.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.334134247097 0.443229183278 1.11516001235 0.590972244371 3.55725356085 1.72156737043 0.738715305464 3.85107822678 2.4590216705 0.886458366557 5.46922915501 6.11699058023 3.32752291257 1.03420142765 2 2 2 5 1 12 1 4 1 0 30.0 1.2 23.0 1.13043478261 0.478260869565 0.554347826087 0.0973124023999 0.0641078326621 0.00575326703378 0.000469423997398 -7.45117456187e-06 0.00183745964696 -0.00211017263592 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 3.0 1.0 0.2 0.0 3.0 1.0 0.0 0.8 0.766666666667 0.0 1.0 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.257768075063 0.408541235474 1.10893022947 0.544721647299 3.70733161407 1.7387931507 0.680902059124 4.05366827951 2.50970821747 0.817082470949 5.89613849967 6.53056639848 3.42167542978 0.953262882774 3 1 8 3 1 28 1 5 7 4 7 4 7 3 8 3 8 3 8 3 8 4 6 6 4 7 5 2 9 1 9 0 176.0 0.6875 77.0 0.87012987013 0.393506493506 0.415584415584 0.0803972549629 0.255319987821 -0.0517509139536 0.017373364118 -0.00615020067083 -0.0180936623295 0.0538452835319 11.0 0.363636363636 0.0625 0.727272727273 0.0 0.727272727273 0.0 0.25 0.0 0.0 0.0 16.0 7.0 2.0 0.0714285714286 0.0 7.0 1.0 0.0 0.9375 0.4375 0.625 0.125 0.0 0.625 0.75 1.0 1.0 0.583333333333 0.75 0.25 0.0833333333333 0.333333333333 0.75 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.5 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.311399499666 0.391676405846 1.05243168368 0.522235207795 3.5797862155 1.64691240203 0.652794009743 3.83302074981 2.37394223936 0.783352811692 5.51468749002 6.17411580364 3.23352119565 0.913911613641 2 8 3 4 1 4 2 3 4 3 3 2 4 4 8 4 8 4 7 5 3 9 2 4 1 5 2 3 3 4 1 4 2 11 1 6 1 4 3 4 156.0 0.923076923077 95.0 0.863157894737 0.541626794258 0.54298245614 0.108790202653 0.162185741362 0.00200145793847 -0.0107767183375 -0.00672926794542 0.00715076609375 -0.0179044281223 12.0 0.75 0.615384615385 1.0 1.33333333333 0.666666666667 0.0 0.615384615385 0.307692307692 0.307692307692 0.923076923077 13.0 5.0 9.0 0.212121212121 0.0 2.0 1.0 0.0 0.923076923077 0.608974358974 0.666666666667 0.222222222222 0.333333333333 0.833333333333 0.555555555556 0.0 0.555555555556 0.5 0.888888888889 0.666666666667 1.0 0.75 0.333333333333 0.666666666667 0.666666666667 0.916666666667 0.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 0.5 1.0 1.0 0.0 0.25 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.25 0.0 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 0.5 0.5 0.5 0.75 1.0 0.313748137523 0.492671534018 1.19490761959 0.65689537869 3.6090953343 1.82989217505 0.821119223363 3.98065013069 2.59937979074 0.985343068035 5.57652621143 6.25557388242 3.50337046665 1.14956691271 2 2 1 3 14 2 1 1 1 2 2 8 10 8 4 8 9 7 5 8 9 6 6 9 8 7 6 2 2 4 7 7 7 2 2 4 7 2 1 4 7 2 3 3 7 1 3 3 7 2 3 4 9 4 7 2 4 4 9 3 7 2 4 4 3 1 5 3 7 2 4 5 2 1 5 3 6 3 5 7 4 5 5 3 5 6 5 4 7 2 6 5 5 4 7 2 6 5 6 3 7 2 6 4 7 3 7 2 7 3 7 3 6 3 8 2 6 4 3 9 5 1 6 7 1 9 5 1 6 14 1 1 12 9 638.0 1.31818181818 271.0 0.822878228782 0.517264101212 0.500439290107 0.262818797085 0.164945016234 -0.000527069172327 -0.00260266621993 -0.0019075900028 0.00806976683478 0.00376543115039 29.0 0.551724137931 2.09090909091 0.551724137931 0.275862068966 0.137931034483 1.10344827586 1.45454545455 2.18181818182 2.0 1.81818181818 22.0 6.0 15.0 0.166666666667 3.0 4.0 4.0 0.0 0.954545454545 0.424764890282 0.6 0.285714285714 0.342857142857 0.642857142857 0.485714285714 0.547619047619 0.4 0.190476190476 0.114285714286 0.142857142857 0.428571428571 0.214285714286 0.725 0.458333333333 0.475 0.6875 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.875 1.0 0.5 0.5 0.625 0.583333333333 0.583333333333 0.916666666667 0.666666666667 1.0 0.555555555556 0.111111111111 0.0 0.0 0.0 0.555555555556 0.0 0.333333333333 0.5 0.916666666667 0.875 0.583333333333 0.25 0.0 0.0 0.0 0.0 0.0833333333333 0.75 0.75 0.5 0.166666666667 0.166666666667 0.333333333333 0.555555555556 0.0 0.0 0.0 0.0 0.111111111111 0.75 1.0 0.75 0.583333333333 0.625 0.666666666667 0.583333333333 1.0 0.75 0.416666666667 0.25 0.25 0.375 0.25 0.25 0.916666666667 0.280062243259 0.468577608023 1.17229372535 0.624770144031 3.64476286086 1.80756939501 0.780962680039 4.00760198063 2.57972596 0.937155216046 5.6697266353 6.34139100146 3.48876342032 1.09334775205 0 2 2.0 0.5 2.0 3.0 0.5 0.5 0.0 0.125 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 3.0 3.0 3.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.279692421434 0.337618618559 1.03216458805 0.450158158079 3.77407354332 1.6539597538 0.562697697598 4.14079735944 2.42125652704 0.675237237118 6.35339698209 6.83706122382 3.33405490777 0.787776776637 2 3 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 78.0 0.461538461538 47.0 0.978723404255 0.578723404255 0.526595744681 0.0282788977394 0.342332623792 -0.00289916492492 -0.00099093044569 -0.00481735679747 0.00452524903532 -0.00531963746953 6.0 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 13.0 5.0 3.0 0.0 0.0 7.0 1.0 0.0 0.923076923077 0.602564102564 0.0 0.0 0.0 0.25 0.833333333333 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.337527546681 0.390878681006 1.03858619118 0.521171574674 3.53185424282 1.62161687429 0.651464468343 3.74843691601 2.33400121153 0.781757362011 5.32032617025 6.02335139058 3.17573920289 0.91205025568 0 4 2 8 1 5 1 9 1 4 6 4 6 4 6 4 6 4 7 3 7 3 7 4 5 6 3 7 4 1 1 2 5 0 140.0 0.714285714286 72.0 0.861111111111 0.391975308642 0.434829059829 0.071748542524 0.26240730024 -0.033720207476 0.0141062866562 0.00577614840378 -0.0200367816628 0.0341689506252 10.0 0.4 0.214285714286 0.8 0.0 0.8 0.0 0.571428571429 0.0 0.0 0.0 14.0 3.0 8.0 0.192307692308 0.0 5.0 1.0 0.0 0.928571428571 0.514285714286 0.833333333333 0.5 0.166666666667 0.5 0.777777777778 1.0 1.0 0.916666666667 0.833333333333 0.0 0.0 0.625 1.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.331131987765 0.432479056446 1.10474987509 0.576638741928 3.57196618027 1.71100680209 0.72079842741 3.85820549263 2.44929151238 0.864958112892 5.44080381828 6.14497271836 3.31960400596 1.00911779837 3 1 6 1 2 4 2 17 2 9 4 5 7 4 8 3 9 3 9 3 9 3 9 3 9 4 7 6 6 3 1 2 7 1 8 0 180.0 0.8 72.0 0.944444444444 0.455808080808 0.411706349206 0.0873815800754 0.251733431927 -0.0408495156036 0.0163710630017 -0.00245932779136 -0.0254425525981 0.0599329577829 12.0 0.25 0.2 0.333333333333 0.0 0.666666666667 0.0 0.533333333333 0.0 0.0 0.266666666667 15.0 1.0 6.0 0.230769230769 0.0 5.0 1.0 0.0 0.933333333333 0.4 0.555555555556 0.0833333333333 0.0 0.166666666667 0.666666666667 1.0 1.0 0.75 0.555555555556 0.5 0.0 0.416666666667 0.777777777778 0.166666666667 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.25 0.0 0.0 0.0 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 1.0 0.75 0.0 0.0 0.0 0.25 0.25 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.25 0.0 0.0 0.0 0.0 0.0 0.321283517162 0.405747782037 1.07031958447 0.540997042716 3.57650896251 1.66872606919 0.676246303394 3.84207303474 2.39946318934 0.811495564073 5.50639032841 6.16546336017 3.26253094494 0.946744824752 2 3 4 4 2 5 2 6 2 5 2 5 4 3 3 4 2 4 2 5 1 4 3 3 4 2 5 0 91.0 0.538461538462 53.0 0.924528301887 0.537735849057 0.466981132075 0.0531445421388 0.225944907541 -0.036755173734 -0.00117433511631 -0.026279042765 0.00894770313025 0.0154880001228 7.0 0.428571428571 0.0 0.0 0.571428571429 0.571428571429 0.0 0.0 0.0 0.0 0.0 13.0 0.0 4.0 0.2 0.0 3.0 1.0 0.0 0.923076923077 0.582417582418 0.0 0.0 0.0 0.75 0.666666666667 0.666666666667 0.166666666667 0.875 1.0 1.0 0.833333333333 0.375 0.333333333333 1.0 0.833333333333 0.125 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.330771656443 0.365418121623 1.01591084474 0.487224162164 3.57412449057 1.60031773253 0.609030202705 3.81364123845 2.31689629097 0.730836243246 5.53672342467 6.19545055025 3.16564652005 0.852642283788 6 1 1 1 21 4 1 4 17 3 4 4 15 4 5 4 14 3 7 4 13 3 8 3 12 4 8 4 1 14 8 3 1 10 2 3 7 4 2 8 3 3 7 3 4 1 9 4 6 3 15 3 5 2 18 5 1 2 21 5 17 0 378.0 1.92857142857 119.0 1.06722689076 0.400129282482 0.509372979961 0.440974412504 0.0930713362953 0.003541505579 0.112803260905 -0.0278651347362 0.00523233024466 -0.000125416055098 27.0 0.259259259259 1.21428571429 0.296296296296 0.740740740741 0.0 0.0 0.857142857143 0.857142857143 1.71428571429 0.857142857143 14.0 2.0 8.0 0.382978723404 0.0 2.0 6.0 0.0 0.928571428571 0.314814814815 0.333333333333 0.583333333333 0.555555555556 0.458333333333 0.52380952381 0.25 0.238095238095 0.428571428571 0.0 0.392857142857 0.619047619048 0.0357142857143 0.0 0.25 0.52380952381 0.0 0.0 0.166666666667 0.666666666667 0.833333333333 1.0 0.666666666667 0.5 0.0 0.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.875 0.0 0.833333333333 0.833333333333 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.5 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.375 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.305940372859 0.367034053704 1.02415151379 0.489378738272 3.59694733911 1.61442237693 0.61172342284 3.85136838037 2.33838643396 0.734068107408 5.60938644012 6.25840871459 3.19604368486 0.856412791975 1 3 2 2 1 24 3 0 36.0 2.25 29.0 1.13793103448 0.456896551724 0.51724137931 0.207552585182 0.0346877690762 -0.0136536963385 0.0180528127478 -0.00247871735241 -0.00245666330542 -0.000255196829419 9.0 0.0 0.25 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 4.0 4.0 3.0 0.0 0.0 1.0 3.0 0.0 0.75 0.805555555556 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 0.5 1.0 1.0 1.0 1.0 0.0 0.0 0.334868697901 0.362337161999 1.00764642811 0.483116215999 3.55853772632 1.5873894177 0.603895269999 3.77897304957 2.29826496032 0.724674323999 5.45478076469 6.13629466196 3.14027305597 0.845453377999 1 1 1 1 2 9 1 3 1 0 20.0 1.25 14.0 1.71428571429 0.535714285714 0.547619047619 0.100583090379 0.0674198250729 -0.00655976676385 -0.000667874823605 -0.00144706211781 -0.000667874823605 -0.00300543670622 5.0 0.0 0.25 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 4.0 2.0 0.0 0.2 0.0 2.0 1.0 0.0 0.75 0.7 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.257412569055 0.389303111921 1.07805862717 0.519070815894 3.68775372322 1.69694066602 0.648838519868 4.00699497479 2.45556965768 0.778606223841 5.8503347958 6.48482367389 3.35394560216 0.908373927815 2 2 2 2 2 2 1 17 3 4 4 4 4 3 5 3 5 4 4 4 4 3 5 4 3 6 3 3 4 0 112.0 0.571428571429 61.0 0.918032786885 0.405152224824 0.462799495586 0.0500834871641 0.278684118935 -0.0405364325648 0.00736088277342 0.0081187096434 -0.0129219325102 0.0313124508351 8.0 0.5 0.142857142857 0.5 0.0 1.5 0.0 0.571428571429 0.0 0.0 0.0 14.0 5.0 4.0 0.125 0.0 7.0 1.0 0.0 0.928571428571 0.544642857143 0.333333333333 0.625 0.5 0.625 1.0 1.0 1.0 1.0 0.5 0.5 0.333333333333 0.375 1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.5 0.0 1.0 0.5 0.5 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.331253753801 0.392185745072 1.04762879776 0.522914326763 3.55922869716 1.63748254157 0.653642908454 3.80122086639 2.35851490314 0.784371490145 5.46574993066 6.11791463459 3.21072588245 0.915100071836 1 2 1 11 2 2 1 0 20.0 0.8 15.0 1.4 0.466666666667 0.483333333333 0.0604444444444 0.101925925926 -0.00711111111111 0.000826236447191 0.000673229697711 -0.00189728369355 0.00412098178599 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 2.0 1.0 0.111111111111 0.0 2.0 2.0 0.0 0.8 0.75 0.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.252229173447 0.39705350818 1.09204672924 0.529404677574 3.70145712468 1.71670969385 0.661755846967 4.03499989196 2.48203317137 0.794107016361 5.88730160722 6.51929438131 3.38801716181 0.926458185754 1 1 1 2 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 3 3 6 11 4 4 4 3 4 3 6 3 2 4 6 3 3 3 6 3 2 3 7 3 3 3 6 3 3 3 6 2 3 3 7 2 4 3 6 3 2 5 5 3 2 5 4 11 3 5 1 0 330.0 0.681818181818 127.0 0.968503937008 0.426321709786 0.586051743532 0.144452477881 0.300516065599 0.0636262847329 0.0275639457578 -0.0331651082969 0.0174628751351 -0.0466870119718 15.0 0.733333333333 0.636363636364 1.33333333333 0.8 0.266666666667 0.266666666667 0.181818181818 0.181818181818 0.909090909091 0.909090909091 22.0 6.0 9.0 0.163265306122 0.0 1.0 2.0 0.0 0.954545454545 0.384848484848 0.533333333333 0.333333333333 0.466666666667 0.611111111111 0.5 0.625 0.45 0.583333333333 0.0 0.333333333333 0.0 0.125 0.0 0.166666666667 0.75 0.708333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.75 0.666666666667 0.5 0.5 0.75 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.166666666667 0.666666666667 0.28529160939 0.431758959843 1.13239082857 0.575678613124 3.67922023885 1.76343367037 0.719598266405 4.04689957551 2.53365456603 0.863517919686 5.87426960986 6.48683534916 3.44305351555 1.00743757297 8 4 11 5 11 4 11 4 11 4 12 3 12 3 12 3 11 4 5 1 5 4 3 3 5 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 4 6 3 2 4 6 4 1 5 4 5 3 13 315.0 0.714285714286 121.0 0.876033057851 0.550767414404 0.6 0.161387612394 0.314186189468 -0.0699405778294 -0.0413387185696 0.0313849557742 0.0258775375861 -0.072945837033 15.0 0.266666666667 0.52380952381 0.0 0.266666666667 0.8 0.0 0.0 0.190476190476 0.952380952381 0.952380952381 21.0 4.0 3.0 0.116279069767 1.0 1.0 2.0 0.0 0.952380952381 0.384126984127 0.0 0.0 0.933333333333 0.888888888889 0.0 0.05 0.05 0.333333333333 0.6 0.35 0.35 0.416666666667 0.45 0.5 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.166666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.5 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.256325640794 0.461576278696 1.1817441725 0.615435038262 3.7152086843 1.83112342452 0.769293797827 4.12284583035 2.6220799601 0.923152557393 5.93838650691 6.56088031738 3.55461377923 1.07701131696 4 1 7 2 6 3 5 7 1 9 1 4 6 3 6 3 6 3 6 3 6 2 7 3 5 4 6 3 6 4 6 6 144.0 0.5625 60.0 1.08333333333 0.4375 0.512222222222 0.0497222222222 0.346939814815 0.0101388888889 0.00796113243387 0.0208214692642 -0.000432722213373 0.0505438471835 9.0 0.666666666667 0.0 0.444444444444 0.0 0.888888888889 0.888888888889 0.0 0.0 0.0 0.0 16.0 0.0 5.0 0.185185185185 0.0 7.0 1.0 0.0 0.9375 0.416666666667 0.125 0.375 0.0 0.125 0.625 1.0 1.0 0.875 0.625 0.625 0.375 0.75 0.166666666667 0.25 0.0 0.25 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.25 0.5 0.0 0.0 0.0 0.0 0.5 0.32340380627 0.3733181648 1.01979222972 0.497757553067 3.54917946835 1.60101196005 0.622196941334 3.76643575812 2.31274035955 0.746636329601 5.38940450511 6.09015301615 3.15497742821 0.871075717867 7 1 1 2 1 2 8 8 7 3 2 4 6 2 13 3 13 2 14 2 14 2 14 3 11 14 1 15 2 14 3 8 1 4 3 7 3 3 3 5 5 3 3 5 5 3 4 3 7 1 4 4 7 1 4 6 4 3 3 7 3 3 3 8 2 20 5 2 1 2 6 0 368.0 0.695652173913 175.0 0.794285714286 0.489142857143 0.571688311688 0.0940770145773 0.21984354519 -0.00483433236152 0.0072279351844 0.0096841755054 0.00527616814915 -0.0362644637178 16.0 1.25 0.565217391304 0.75 1.25 2.0 1.0 0.521739130435 0.0 0.695652173913 0.695652173913 23.0 3.0 21.0 0.142857142857 0.0 3.0 2.0 0.0 0.95652173913 0.475543478261 0.05 0.458333333333 0.5 0.5 0.5 0.541666666667 0.833333333333 0.833333333333 0.4 0.333333333333 0.333333333333 0.375 0.3 0.25 0.666666666667 0.625 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.333333333333 0.0 0.166666666667 0.5 0.833333333333 1.0 0.833333333333 1.0 0.666666666667 0.0 0.833333333333 0.5 1.0 1.0 1.0 1.0 0.833333333333 0.75 0.333333333333 0.0 0.666666666667 1.0 0.333333333333 0.666666666667 0.833333333333 0.75 0.0 0.0 0.666666666667 0.833333333333 0.0 0.166666666667 1.0 0.75 0.333333333333 0.0 0.666666666667 0.5 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.666666666667 1.0 0.833333333333 0.833333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.5 0.333333333333 0.333333333333 0.666666666667 0.324919327053 0.397243474022 1.06007550399 0.529657965362 3.58061520077 1.65660534163 0.662072456703 3.85044132006 2.38573956392 0.794486948043 5.55056181443 6.20100025558 3.24747817087 0.926901439384 0 4 7 2 7 2 6 3 5 3 5 3 5 3 6 1 7 2 5 3 5 4 3 5 2 6 104.0 0.615384615385 41.0 1.29268292683 0.651567944251 0.563008130081 0.05835666923 0.407829253783 0.0646102058879 -0.01108629047 -0.0483080332087 -0.0142871285521 -0.0601817248727 8.0 0.5 0.0 0.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 13.0 0.0 2.0 0.25 0.0 1.0 1.0 0.0 0.923076923077 0.394230769231 0.333333333333 0.0 0.0 0.0 0.5 0.0 0.0 0.375 0.5 1.0 0.666666666667 1.0 0.0 0.5 0.333333333333 0.875 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.341476820344 0.409478809018 1.06191001838 0.545971745357 3.52631795474 1.64984894361 0.682464681696 3.77906662718 2.36677243709 0.818957618035 5.37054614807 6.05658762014 3.21268049884 0.955450554374 1 3 2 4 2 5 2 4 2 4 2 3 3 3 3 3 3 3 3 3 3 4 1 5 1 6 78.0 0.461538461538 50.0 0.92 0.428 0.523333333333 0.029608 0.314432 0.009616 0.000666060646752 -0.000456078217011 0.00329618108893 0.000712492106432 6.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 13.0 6.0 1.0 0.0526315789474 0.0 2.0 1.0 0.0 0.923076923077 0.641025641026 0.666666666667 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.333333333333 0.0 0.5 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.5 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.330181480315 0.390277785099 1.04271429664 0.520370380132 3.55033911784 1.62985781862 0.650462975165 3.77958006924 2.34758731973 0.780555570198 5.39313883648 6.08016828854 3.19590279997 0.91064816523 4 2 3 2 5 2 4 3 3 2 6 3 1 3 2 7 1 11 1 4 9 4 10 3 10 3 10 4 10 3 10 4 11 6 3 0 169.0 1.0 66.0 1.21212121212 0.421717171717 0.454545454545 0.18176252887 0.202562818265 -0.0642374154771 0.039448883935 0.0163917721369 -0.0283167692405 0.0397469803192 13.0 0.692307692308 0.307692307692 0.0 1.23076923077 0.923076923077 0.615384615385 0.923076923077 0.307692307692 0.0 0.0 13.0 2.0 9.0 0.15625 1.0 2.0 2.0 0.0 0.923076923077 0.390532544379 0.111111111111 0.777777777778 0.777777777778 0.333333333333 0.555555555556 0.555555555556 0.333333333333 0.75 0.0 0.666666666667 0.0 0.25 0.666666666667 0.583333333333 0.0 0.0625 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.25 1.0 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.25 0.0 0.5 0.0 0.0 0.5 1.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.0 0.75 1.0 0.25 0.0 0.0 0.0 0.0 0.280362262323 0.495426164839 1.21729464323 0.660568219785 3.67927351885 1.8695723187 0.825710274731 4.10341831494 2.66103160003 0.990852329678 5.84068632785 6.47010586816 3.59167248721 1.15599438462 1 1 1 1 4 4 2 5 3 3 38 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 154.0 0.318181818182 64.0 1.109375 0.4296875 0.588541666667 0.0272483825684 0.713558197021 0.036304473877 -2.86549329758e-05 -0.00968520343304 0.00336502492428 -0.272065535188 7.0 1.0 0.0454545454545 1.14285714286 1.14285714286 0.571428571429 0.0 0.181818181818 0.0 0.0 0.0 22.0 4.0 1.0 0.2 0.0 3.0 1.0 0.0 0.954545454545 0.415584415584 0.2 0.333333333333 0.0 0.166666666667 0.7 0.333333333333 0.6 0.75 0.6 0.25 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.666666666667 0.5 0.0 0.0 1.0 0.5 0.666666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.333333333333 0.0 0.333333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.423830951774 0.36171399786 0.947960529816 0.48228533048 3.33783142843 1.47599766186 0.6028566631 3.40951814656 2.12045359373 0.72342799572 4.70172850704 5.48167981596 2.88132832544 0.84399932834 3 12 2 3 2 8 1 3 5 4 3 3 5 3 4 3 5 3 4 3 5 3 5 2 5 2 12 2 37 2 13 2 12 9 6 12 3 13 1 5 6 8 7 3 1 3 9 2 1 4 8 2 1 4 7 1 5 4 12 1 11 0 330.0 0.681818181818 129.0 1.04651162791 0.449058693245 0.464747139166 0.140760026254 0.340096772285 -0.0496429617891 0.010308769127 0.00597092370044 0.0074724908371 -0.0333591944273 15.0 1.26666666667 0.5 0.533333333333 1.6 1.06666666667 1.06666666667 0.727272727273 0.363636363636 0.181818181818 0.727272727273 22.0 7.0 9.0 0.2 4.0 2.0 0.0 0.0 0.954545454545 0.390909090909 0.466666666667 0.222222222222 0.666666666667 0.722222222222 0.45 0.125 0.75 0.291666666667 0.7 0.25 0.55 0.0 0.6 0.0416666666667 0.45 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.25 1.0 0.5 0.166666666667 0.75 1.0 1.0 0.5 1.0 0.5 0.333333333333 0.166666666667 0.75 1.0 0.333333333333 0.666666666667 0.5 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.166666666667 1.0 0.0 0.166666666667 0.0 0.5 0.666666666667 0.0 0.0 1.0 1.0 0.833333333333 0.0 0.25 0.666666666667 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 1.0 0.666666666667 0.166666666667 1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.266835184497 0.457698731718 1.17806996843 0.610264975625 3.72081815393 1.82746558104 0.762831219531 4.1239240323 2.61881244185 0.915397463437 5.93795356279 6.56720822655 3.55211055086 1.06796370734 4 6 6 1 3 4 3 3 3 18 1 5 1 2 1 1 1 1 1 3 10 3 10 3 10 3 10 3 8 1 2 3 5 3 2 4 4 3 4 7 3 0 169.0 1.0 77.0 1.15584415584 0.424242424242 0.465367965368 0.176819638449 0.201163990336 -0.0249773838912 0.0159730248789 0.0206100669951 0.00345732962157 0.0288799617408 13.0 0.923076923077 0.615384615385 0.0 1.53846153846 1.23076923077 0.923076923077 0.615384615385 0.923076923077 0.0 0.923076923077 13.0 6.0 16.0 0.102564102564 1.0 3.0 1.0 0.0 0.923076923077 0.455621301775 0.222222222222 1.0 1.0 0.583333333333 0.444444444444 0.555555555556 0.0 0.5 0.777777777778 0.555555555556 0.0 0.25 0.583333333333 0.416666666667 0.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 0.0 1.0 0.25 0.0 0.0 0.0 0.75 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.25 0.0 0.0 0.5 0.75 0.0 0.5 0.5 0.25 0.0 0.0 0.5 0.25 0.275273742484 0.540036729274 1.28305093688 0.720048972365 3.70280679784 1.95568989892 0.900061215457 4.17416508898 2.76907935209 1.08007345855 5.86381553426 6.50912596352 3.72321929638 1.26008570164 0 2 1 2 10 6 10 4 12 3 12 3 12 3 12 3 12 3 12 3 12 3 2 4 6 4 4 2 5 4 5 2 4 3 6 3 2 4 6 3 2 3 7 3 3 2 7 3 3 2 8 1 5 1 8 2 3 3 6 3 2 4 6 9 5 11 3 6 330.0 0.681818181818 117.0 1.06837606838 0.41514041514 0.584045584046 0.168008126807 0.366629141996 0.0978032770713 0.0403874515891 -0.0375312224002 0.0324580032063 -0.0704702246182 15.0 0.733333333333 0.636363636364 1.06666666667 0.8 0.266666666667 0.533333333333 0.181818181818 0.181818181818 0.909090909091 0.909090909091 22.0 3.0 4.0 0.255813953488 1.0 0.0 2.0 0.0 0.954545454545 0.354545454545 0.6 0.333333333333 0.466666666667 0.555555555556 0.55 0.541666666667 0.45 0.458333333333 0.0 0.208333333333 0.0 0.125 0.0 0.0416666666667 0.7 0.75 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.75 0.666666666667 0.5 0.5 0.5 0.833333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 1.0 0.25 0.0 0.0 0.166666666667 0.25 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.166666666667 1.0 1.0 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.25 0.5 0.333333333333 1.0 0.300903812091 0.452125536092 1.15028401553 0.602834048123 3.6444868087 1.78001124904 0.753542560154 4.00731175612 2.54660097441 0.904251072184 5.74036283682 6.37935962747 3.45005319162 1.05495958421 2 1 1 2 1 6 2 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 2 5 3 3 4 2 5 2 5 1 6 1 6 2 4 3 4 4 3 4 1 7 3 2 2 0 161.0 0.304347826087 76.0 1.03947368421 0.589912280702 0.476076555024 0.022313292754 0.663945181513 -0.00249671963843 -0.00153944008106 -0.0226276079008 -0.000495824735023 0.0869098847367 7.0 1.0 0.0434782608696 0.571428571429 0.571428571429 0.0 0.571428571429 0.173913043478 0.0 0.0 0.0 23.0 2.0 10.0 0.0571428571429 0.0 6.0 1.0 0.0 0.95652173913 0.472049689441 0.2 0.0 0.0 0.166666666667 0.6 0.0 0.0833333333333 0.416666666667 0.9 1.0 0.833333333333 1.0 0.5 0.583333333333 0.25 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.333333333333 0.0 0.666666666667 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.366626350843 0.373879154804 0.99338710331 0.498505539738 3.44735529431 1.55103485637 0.623131924673 3.58686770337 2.23240300032 0.747758309607 5.01488347335 5.76488780748 3.03749153517 0.872384694542 7 3 1 1 11 3 1 4 9 2 4 3 8 3 5 2 8 3 5 3 7 2 6 3 7 2 7 1 7 3 7 1 7 3 6 3 4 5 5 7 1 5 5 6 3 4 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 7 1 7 2 16 2 16 2 16 3 3 1 11 3 2 2 12 6 14 1 3 0 414.0 0.782608695652 123.0 1.10569105691 0.509325681492 0.460827790096 0.181218754484 0.28757025623 0.0679360749586 -0.018312163853 0.0484077907561 0.0224270427997 0.0231049315166 18.0 0.388888888889 0.826086956522 0.0 0.0 0.444444444444 1.11111111111 0.869565217391 0.869565217391 0.869565217391 0.347826086957 23.0 5.0 11.0 0.294117647059 2.0 1.0 3.0 0.0 0.95652173913 0.297101449275 0.1 0.583333333333 0.5 0.0 0.44 0.2 0.166666666667 0.0 0.65 0.5 0.541666666667 0.375 0.04 0.3 0.166666666667 0.366666666667 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 1.0 0.833333333333 0.0 0.0 0.25 1.0 0.5 0.5 0.5 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.166666666667 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.75 1.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.0 0.166666666667 0.166666666667 0.833333333333 0.5 0.333333333333 0.166666666667 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.111111111111 0.555555555556 0.268665871773 0.41842688606 1.11857463756 0.557902514747 3.69406989145 1.7486383737 0.697378143434 4.05631088515 2.51887014055 0.836853772121 5.91803685821 6.52604356804 3.4292699381 0.976329400808 4 4 7 6 3 4 3 3 2 3 4 3 9 4 8 4 5 1 1 5 3 4 1 4 1 4 4 3 1 4 4 3 1 3 4 9 3 5 1 5 1 5 2 2 5 2 1 0 168.0 0.857142857143 90.0 1.02222222222 0.526262626263 0.54358974359 0.127035665295 0.171061728395 0.00398353909465 -0.0118222368064 -0.00412140066773 0.0116569237332 -0.0179735360058 12.0 0.916666666667 0.714285714286 1.0 2.0 0.666666666667 0.0 0.285714285714 0.285714285714 0.857142857143 0.857142857143 14.0 3.0 9.0 0.305555555556 1.0 3.0 2.0 0.0 0.928571428571 0.535714285714 0.333333333333 0.25 0.777777777778 0.75 0.666666666667 0.0833333333333 0.555555555556 0.416666666667 0.777777777778 0.75 0.444444444444 0.5 0.111111111111 0.583333333333 0.666666666667 0.916666666667 0.0 0.5 0.5 0.0 0.0 1.0 1.0 0.0 0.0 0.5 0.5 0.0 0.5 1.0 1.0 0.75 0.0 1.0 0.0 0.0 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.25 1.0 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.25 0.5 0.5 0.5 1.0 0.75 0.264191498177 0.473529308932 1.19698570339 0.631372411909 3.71259927397 1.84974043641 0.789215514886 4.11934142811 2.6438984923 0.947058617863 5.87721134542 6.52724842458 3.57945987106 1.10490172084 2 3 3 5 2 6 1 6 2 5 3 4 3 4 2 4 3 4 1 5 2 4 3 0 77.0 0.636363636364 50.0 0.88 0.553333333333 0.488 0.051552 0.189312 -0.020832 -0.00109534800204 -0.0179989335962 0.00358707916185 0.0126977823419 7.0 0.285714285714 0.0 0.0 0.571428571429 0.0 0.0 0.0 0.0 0.0 0.0 11.0 1.0 3.0 0.357142857143 0.0 3.0 1.0 0.0 0.909090909091 0.649350649351 0.0 0.0 0.0 0.666666666667 0.75 0.833333333333 0.166666666667 0.833333333333 1.0 1.0 1.0 0.833333333333 0.25 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.312832387409 0.39116349999 1.05774892607 0.52155133332 3.60229040374 1.65730965306 0.65193916665 3.87561718481 2.39091977823 0.78232699998 5.60337894368 6.25370035662 3.2585793016 0.91271483331 6 10 9 6 2 7 4 4 7 5 3 4 9 4 2 4 11 3 2 3 13 2 1 4 13 7 15 5 15 5 15 5 15 5 15 5 15 5 16 4 16 5 16 4 12 2 3 3 12 2 3 4 10 2 6 8 2 3 8 11 10 6 1 2 4 0 440.0 0.909090909091 149.0 0.93288590604 0.419992935359 0.482901885586 0.247959082803 0.343409768409 -0.0243492266658 0.0642275255415 0.0677604954782 -0.022519157039 0.0149705873644 20.0 0.75 0.5 0.0 1.0 1.0 1.0 0.727272727273 0.363636363636 0.0 0.727272727273 22.0 2.0 11.0 0.4 1.0 2.0 1.0 0.0 0.954545454545 0.338636363636 0.24 0.9 0.92 0.233333333333 0.6 0.0 0.04 0.533333333333 0.32 0.0 0.0 0.4 0.72 0.133333333333 0.0 0.4 0.0 0.0 0.5 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.777777777778 0.0 0.75 0.833333333333 0.0 0.0 0.0 0.166666666667 0.666666666667 0.5 1.0 0.111111111111 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 1.0 0.444444444444 0.0 0.0 0.0 0.666666666667 0.111111111111 0.278010485895 0.556338005885 1.29816047952 0.741784007847 3.6779611997 1.9704358942 0.927230009808 4.16112834093 2.78180542679 1.11267601177 5.83125626473 6.46385979758 3.7322690773 1.29812201373 2 2 3 4 1 6 1 5 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 4 1 6 78.0 0.461538461538 47.0 1.06382978723 0.536170212766 0.505319148936 0.0326902516783 0.328116120705 -0.00635697292507 -0.00068226233763 -0.00764812971682 0.000734394545693 0.0298593797991 6.0 0.666666666667 0.0 0.666666666667 0.666666666667 0.0 0.666666666667 0.0 0.0 0.0 0.0 13.0 4.0 4.0 0.136363636364 0.0 4.0 1.0 0.0 0.923076923077 0.602564102564 0.333333333333 0.0 0.0 0.25 0.833333333333 0.666666666667 0.5 0.875 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.5 0.375 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.5 0.332248137758 0.386719471782 1.03583721869 0.515625962376 3.54234164209 1.61992855855 0.64453245297 3.76301357268 2.3340727125 0.773438943565 5.36573207099 6.05728017167 3.17826968052 0.902345434159 2 7 4 2 1 4 3 2 3 4 2 2 4 2 3 3 8 7 8 3 9 4 2 1 5 3 1 2 5 7 4 3 1 3 3 4 3 7 2 0 143.0 0.846153846154 70.0 1.25714285714 0.505714285714 0.511904761905 0.117096209913 0.234402332362 0.00539358600583 -0.00947337897076 -0.00205543478881 0.0115615095593 -0.00752381724343 11.0 1.18181818182 0.538461538462 0.363636363636 1.09090909091 1.45454545455 0.727272727273 0.615384615385 0.307692307692 0.307692307692 0.923076923077 13.0 5.0 11.0 0.151515151515 1.0 3.0 1.0 0.0 0.923076923077 0.48951048951 0.166666666667 0.5 0.166666666667 0.75 0.666666666667 0.666666666667 0.0 0.416666666667 0.888888888889 0.444444444444 0.666666666667 0.583333333333 0.444444444444 0.111111111111 0.444444444444 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.5 1.0 1.0 0.0 1.0 1.0 0.5 1.0 0.75 0.5 1.0 0.0 0.0 0.25 0.75 1.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.5 1.0 1.0 0.5 0.5 1.0 0.5 0.5 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.0 0.25 0.0 0.0 0.25 0.5 0.75 0.25 0.279334462854 0.486233418275 1.20344422752 0.648311224366 3.67329819274 1.85126341137 0.810389030458 4.05819253988 2.63786584601 0.97246683655 5.74051058827 6.39160577272 3.56325153143 1.13454464264 4 8 5 2 2 4 3 3 4 4 1 11 2 3 2 1 6 3 10 3 10 3 10 4 10 3 10 5 5 1 3 4 4 2 5 7 2 0 169.0 1.0 71.0 1.21126760563 0.430751173709 0.460093896714 0.178133670102 0.23719863318 -0.0480566397792 0.0245866398974 0.0337868444677 -0.00675967785079 0.0289477109322 13.0 1.0 0.384615384615 0.0 1.23076923077 1.84615384615 0.923076923077 0.615384615385 0.307692307692 0.0 0.615384615385 13.0 6.0 13.0 0.0277777777778 1.0 3.0 1.0 0.0 0.923076923077 0.420118343195 0.111111111111 0.777777777778 1.0 0.416666666667 0.666666666667 0.444444444444 0.111111111111 0.75 0.444444444444 0.444444444444 0.0 0.25 0.833333333333 0.25 0.0 0.3125 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.25 1.0 1.0 1.0 1.0 1.0 0.25 0.0 0.5 1.0 0.5 0.0 1.0 1.0 0.5 1.0 0.75 1.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 1.0 0.25 0.0 0.0 0.0 0.5 1.0 0.5 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.25 0.25 0.274628000719 0.54239209602 1.28090463485 0.723189461359 3.68298133151 1.94970277699 0.903986826699 4.15589541689 2.75792971251 1.08478419204 5.85083231162 6.47950464148 3.7055854414 1.26558155738 1 1 1 1 1 2 1 1 1 1 2 3 1 1 1 1 1 1 1 6 1 8 1 10 7 4 5 6 8 4 7 4 8 3 9 2 9 3 20 3 20 4 19 3 19 5 18 5 18 4 19 5 19 4 19 3 20 4 19 3 20 4 18 5 17 6 17 6 13 12 7 0 506.0 1.04545454545 138.0 1.04347826087 0.491436100132 0.423050379572 0.173550800739 0.399713554271 -0.0131282552381 -0.00286512934289 -0.00646556528476 -0.0830490960158 0.0877714931171 23.0 0.608695652174 0.772727272727 0.173913043478 1.04347826087 1.21739130435 0.0 2.90909090909 0.181818181818 0.0 0.0 22.0 12.0 16.0 0.0161290322581 3.0 2.0 1.0 0.0 0.954545454545 0.272727272727 0.56 0.0333333333333 0.0 0.0333333333333 0.4 0.222222222222 0.233333333333 0.444444444444 0.533333333333 0.416666666667 0.433333333333 0.527777777778 0.533333333333 0.0 0.0 0.0 0.75 1.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.333333333333 0.333333333333 0.555555555556 0.666666666667 0.333333333333 0.444444444444 1.0 0.666666666667 0.888888888889 0.777777777778 0.888888888889 0.833333333333 0.888888888889 0.888888888889 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.833333333333 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.397118578624 0.469561285276 1.11660738835 0.626081713701 3.43102071086 1.7023377821 0.782602142126 3.67401085473 2.41069959451 0.939122570552 5.0259825248 5.76020913412 3.24169282558 1.09564299898 0 6 4 5 5 5 6 3 7 3 6 2 7 2 7 2 6 3 7 3 5 5 4 5 3 6 117.0 0.692307692308 50.0 1.1 0.605 0.5 0.065888 0.3696 0.0904 -0.00920537629278 -0.0208262746049 -0.0122007032453 0.0 9.0 0.444444444444 0.0 0.0 0.444444444444 0.888888888889 0.444444444444 0.0 0.0 0.0 0.0 13.0 1.0 3.0 0.166666666667 0.0 1.0 1.0 0.0 0.923076923077 0.42735042735 0.5 0.0 0.0 0.0 1.0 0.0 0.0 0.125 1.0 0.666666666667 0.666666666667 0.875 0.111111111111 0.444444444444 0.333333333333 0.916666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.0 0.75 1.0 0.323113421943 0.445260499439 1.12485200621 0.593680665919 3.58344195701 1.73804709544 0.742100832399 3.88729693043 2.48403501975 0.890520998878 5.52762375964 6.17231864796 3.36281577913 1.03894116536 6 1 8 6 4 3 3 3 2 3 4 3 3 1 5 3 10 3 8 4 6 2 1 3 4 3 2 2 4 3 3 2 3 3 4 3 2 3 3 5 1 11 2 4 2 4 168.0 0.857142857143 78.0 1.17948717949 0.555944055944 0.586785009862 0.122939108886 0.214039768034 0.0107406564507 -0.0125814065484 -0.00809398058191 0.00620471581159 -0.0290423740822 12.0 1.0 0.642857142857 0.666666666667 1.66666666667 1.33333333333 0.333333333333 0.285714285714 0.571428571429 0.857142857143 0.571428571429 14.0 5.0 5.0 0.444444444444 0.0 3.0 2.0 0.0 0.928571428571 0.464285714286 0.222222222222 0.333333333333 0.111111111111 0.583333333333 0.444444444444 0.0 0.666666666667 0.666666666667 0.666666666667 0.583333333333 0.444444444444 0.583333333333 0.111111111111 0.5 0.444444444444 0.916666666667 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.0 0.0 0.25 1.0 0.75 0.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.5 0.0 0.0 0.5 0.75 0.0 1.0 1.0 0.5 0.0 0.0 1.0 0.0 0.0 0.5 0.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 0.5 0.0 0.75 1.0 0.274439233855 0.466445984165 1.18279869415 0.621927978887 3.69481461315 1.82904256473 0.777409973609 4.08726980102 2.61550411412 0.932891968331 5.83529484331 6.48554140257 3.54218334232 1.08837396305 7 3 1 1 11 3 1 4 9 2 4 3 8 3 5 2 8 3 5 3 7 2 6 3 7 2 7 1 7 3 7 1 7 3 6 3 4 5 5 7 1 5 5 6 3 4 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 7 1 7 2 16 2 7 3 6 2 7 4 5 3 3 1 2 4 5 3 2 2 1 6 5 6 14 1 3 0 414.0 0.782608695652 140.0 1.12142857143 0.471848739496 0.513961038961 0.1623946793 0.293662900875 0.0140856413994 0.00052770968784 0.0126677732755 0.0220323622586 -0.00329700051584 18.0 0.722222222222 1.0 0.666666666667 0.666666666667 0.444444444444 1.11111111111 0.869565217391 0.869565217391 0.869565217391 1.04347826087 23.0 5.0 11.0 0.296296296296 4.0 1.0 3.0 0.0 0.95652173913 0.338164251208 0.1 0.583333333333 0.5 0.375 0.44 0.2 0.166666666667 0.266666666667 0.65 0.5 0.541666666667 0.375 0.04 0.3 0.166666666667 0.366666666667 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.166666666667 0.0 0.333333333333 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.25 1.0 0.5 0.5 0.5 0.333333333333 0.5 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.75 0.166666666667 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.75 1.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.0 0.166666666667 0.166666666667 0.833333333333 0.5 0.333333333333 0.166666666667 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.111111111111 0.555555555556 0.263943138596 0.444068114484 1.16157395959 0.592090819311 3.72711120697 1.80789441217 0.740113524139 4.12809047905 2.59658564981 0.888136228967 5.99457570527 6.60286119301 3.52764767253 1.0361589338 0 24 2 6 1 2 3 5 8 4 8 4 8 4 8 4 8 3 9 4 8 4 7 6 6 6 4 0 156.0 0.923076923077 76.0 0.763157894737 0.444976076555 0.404605263158 0.0770702726345 0.22635178233 -0.0230536521359 0.0116905273261 6.44192571521e-05 -0.0230265837014 0.045019674297 12.0 0.25 0.0769230769231 0.333333333333 0.0 0.666666666667 0.0 0.307692307692 0.0 0.0 0.0 13.0 4.0 0.0 0.0 0.0 7.0 1.0 0.0 0.923076923077 0.487179487179 0.777777777778 0.111111111111 0.0 0.166666666667 1.0 1.0 1.0 1.0 0.888888888889 0.333333333333 0.222222222222 0.5 0.888888888889 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.354189901151 0.453712372741 1.11991455857 0.604949830321 3.52266716186 1.72174615337 0.756187287902 3.81016093709 2.45231893024 0.907424745482 5.36102885351 6.02933676792 3.31163288916 1.05866220306 22 1 1 3 1 2 1 2 18 9 1 9 10 9 3 9 8 9 5 8 8 8 7 8 7 8 7 3 1 5 5 2 2 5 7 2 1 6 5 2 2 5 7 2 2 5 5 2 2 4 8 1 3 5 5 1 4 3 8 1 4 4 4 2 4 3 8 1 4 4 4 1 4 4 7 3 4 7 5 4 7 3 4 7 5 4 6 4 5 6 5 5 6 3 5 6 5 5 6 3 6 5 5 5 6 3 6 5 5 4 7 3 7 4 5 4 6 5 6 3 6 4 6 5 6 3 6 4 4 9 5 1 3 10 24 5 3 0 690.0 1.30434782609 300.0 0.76 0.521379310345 0.488181818182 0.228796444444 0.140308 -0.0142737777778 -0.012854077126 0.00598406053887 -0.0054981235491 0.00466684693352 30.0 0.566666666667 1.95652173913 0.8 0.4 0.533333333333 0.533333333333 1.04347826087 2.26086956522 1.91304347826 1.73913043478 23.0 9.0 13.0 0.25 5.0 4.0 4.0 0.0 0.95652173913 0.434782608696 0.485714285714 0.285714285714 0.404761904762 0.547619047619 0.275 0.625 0.520833333333 0.25 0.257142857143 0.285714285714 0.261904761905 0.238095238095 0.8 0.520833333333 0.5625 0.5625 0.333333333333 0.333333333333 0.0 0.0 0.0 0.111111111111 0.111111111111 0.444444444444 0.0 1.0 0.666666666667 0.333333333333 0.583333333333 0.75 0.833333333333 0.666666666667 0.0 0.916666666667 0.916666666667 0.666666666667 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.416666666667 0.5 0.833333333333 0.916666666667 0.583333333333 0.25 0.0 0.0 0.0 0.111111111111 0.555555555556 0.666666666667 0.555555555556 0.111111111111 0.125 0.666666666667 0.583333333333 0.333333333333 0.0 0.0 0.0 0.333333333333 0.875 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.875 0.5 0.25 0.0 0.0 0.25 0.0 0.25 0.270936955979 0.443772262132 1.14847788212 0.591696349509 3.67948017822 1.78358581054 0.739620436886 4.04484210356 2.5578891221 0.887544524264 5.80751425138 6.45376093252 3.47138781682 1.03546861164 4 9 6 2 4 4 4 3 7 4 2 2 9 3 1 3 9 3 1 3 9 7 9 7 9 3 1 4 8 3 2 3 7 4 2 5 5 3 4 4 4 4 6 7 5 0 208.0 1.23076923077 90.0 1.11111111111 0.502222222222 0.508333333333 0.281283950617 0.165197530864 -0.017012345679 -0.0152920633605 0.000812388697114 -0.0013587816931 -0.00596694466148 16.0 0.5625 0.846153846154 0.25 1.0 1.0 0.0 0.615384615385 0.923076923077 0.923076923077 0.923076923077 13.0 3.0 11.0 0.205128205128 0.0 2.0 2.0 0.0 0.923076923077 0.432692307692 0.333333333333 0.666666666667 0.833333333333 0.5 0.416666666667 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.4375 0.416666666667 0.833333333333 0.833333333333 0.4375 0.0 0.25 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.75 0.5 0.5 0.5 1.0 1.0 0.5 1.0 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.25 0.5 0.75 0.75 0.5 0.25 0.0 0.146703599078 0.530297871904 1.32176947138 0.707063829205 3.89669558906 2.03640286558 0.883829786506 4.44492420123 2.90471267032 1.06059574381 6.35847313604 6.98265835416 3.92669888561 1.23736170111 2 2 13 2 12 9 6 12 3 13 1 5 6 8 7 3 1 3 9 2 1 4 8 2 1 4 7 1 5 4 12 1 11 0 180.0 1.25 75.0 1.0 0.399047619048 0.453333333333 0.247144296296 0.0926198518519 -0.013229037037 0.0613403128851 -0.015121705528 0.0147635729607 0.0109997213498 15.0 0.266666666667 0.416666666667 0.0 0.8 0.0 0.266666666667 0.0 0.333333333333 1.0 0.333333333333 12.0 3.0 10.0 0.161290322581 2.0 2.0 3.0 0.0 0.916666666667 0.416666666667 0.444444444444 0.777777777778 1.0 0.444444444444 0.5 0.833333333333 0.166666666667 0.416666666667 0.25 0.666666666667 0.0 0.0 0.0 0.75 0.583333333333 0.0833333333333 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.5 0.25 0.5 0.75 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.25 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.75 0.5 0.5 0.0 0.0 0.26425529177 0.426854357539 1.13061589775 0.569139143385 3.69708725978 1.76419284366 0.711423929231 4.05965244943 2.53813897816 0.853708715077 5.88162967765 6.5113602408 3.45245430126 0.995993500923 9 4 11 4 12 2 13 2 14 1 14 1 14 1 13 3 8 1 2 4 5 1 1 8 4 5 2 4 3 4 5 3 2 4 6 3 2 4 6 3 2 4 6 3 2 3 7 3 2 4 6 3 3 4 5 3 3 4 5 4 2 4 5 5 3 12 315.0 0.714285714286 118.0 0.966101694915 0.532082324455 0.630084745763 0.155931838211 0.264311954971 -0.0448067962158 -0.0233071540781 0.0416690772831 0.0163019396096 -0.078966322716 15.0 0.666666666667 0.571428571429 0.0 0.8 1.06666666667 0.266666666667 0.0 0.380952380952 0.952380952381 0.952380952381 21.0 7.0 7.0 0.204081632653 0.0 2.0 2.0 0.0 0.952380952381 0.374603174603 0.0 0.0 0.8 0.666666666667 0.0 0.2 0.45 0.458333333333 0.3 0.35 0.3 0.375 0.35 0.4 0.5 0.708333333333 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.5 1.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.270144922321 0.424293284946 1.12448942208 0.565724379929 3.68691833898 1.75483992894 0.707155474911 4.06444277705 2.52488169634 0.848586569893 5.95864567935 6.53800450072 3.43461472428 0.990017664875 0 7 16 21 10 10 1 12 9 7 7 9 10 6 8 8 9 7 8 4 1 4 8 7 8 3 2 4 8 1 2 4 8 3 3 4 6 2 2 3 9 3 3 4 5 2 3 4 8 3 3 4 5 2 3 4 8 3 4 4 4 2 3 3 9 3 5 3 3 2 4 4 8 3 5 4 2 1 5 3 9 3 5 4 1 2 5 4 8 4 5 6 5 4 9 3 5 5 5 5 9 3 6 4 6 4 10 1 7 4 6 3 11 2 7 2 7 4 5 1 3 3 7 2 6 5 4 11 4 2 4 9 2 8 1 1 6 1 3 7 1 2 2 3 30 1 29 0 768.0 1.33333333333 310.0 0.812903225806 0.513943808533 0.442356241234 0.264927964822 0.152097747642 0.00285804437582 -0.00272034243522 -0.00633676010028 -0.00584683327905 0.00827534728673 32.0 0.71875 2.08333333333 0.75 0.625 0.5 1.0 1.16666666667 3.0 2.33333333333 1.83333333333 24.0 5.0 17.0 0.25 4.0 1.0 4.0 0.0 0.958333333333 0.403645833333 0.666666666667 0.375 0.291666666667 0.458333333333 0.5 0.479166666667 0.3125 0.166666666667 0.208333333333 0.229166666667 0.375 0.25 0.75 0.458333333333 0.479166666667 0.458333333333 0.916666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.583333333333 0.916666666667 0.833333333333 0.75 0.75 0.75 0.416666666667 0.583333333333 0.333333333333 0.666666666667 0.916666666667 0.333333333333 0.0833333333333 0.0833333333333 0.166666666667 0.5 0.166666666667 0.0833333333333 0.333333333333 0.666666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0833333333333 0.75 0.75 0.5 0.0833333333333 0.416666666667 0.416666666667 0.416666666667 0.416666666667 0.0 0.0 0.166666666667 0.25 1.0 1.0 0.75 0.75 0.75 0.833333333333 0.916666666667 0.333333333333 0.75 0.25 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.416666666667 0.166666666667 0.265201983459 0.44859714375 1.15141269701 0.598129525 3.66636132594 1.78506785376 0.74766190625 4.02697441769 2.55704380352 0.897194287501 5.75978462421 6.41305587051 3.46734054628 1.04672666875 8 3 7 2 3 6 4 4 4 5 2 6 4 4 3 5 4 4 4 3 6 3 4 3 6 4 3 3 6 3 4 3 6 3 4 3 6 3 4 2 6 4 3 3 7 4 2 4 5 5 1 6 3 7 224.0 1.14285714286 105.0 1.00952380952 0.502222222222 0.528937728938 0.202642479214 0.165024079473 0.00833862433862 -0.010095739119 0.0012619378842 0.0132885506031 0.00400958064815 16.0 0.5 0.928571428571 0.5 0.5 0.75 0.25 0.571428571429 0.857142857143 0.857142857143 0.857142857143 14.0 2.0 4.0 0.1875 0.0 0.0 2.0 0.0 0.928571428571 0.46875 0.416666666667 0.6875 0.5 0.75 0.166666666667 0.375 0.25 0.1875 0.833333333333 0.375 0.25 0.5 0.25 0.5625 0.5 0.75 0.0 0.25 0.75 0.0 0.0 0.0 0.25 0.75 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.5 0.5 0.5 0.0 0.75 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.5 0.5 0.75 1.0 0.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.0 0.25 0.75 0.202145166449 0.510305207039 1.27319898146 0.680406942719 3.81451957619 1.96199375104 0.850508678399 4.31811985004 2.7989865303 1.02061041408 6.20515785389 6.81012869808 3.78417731924 1.19071214976 1 2 1 3 1 2 10 2 1 1 1 2 1 1 1 11 9 10 1 10 8 8 5 10 6 8 7 9 6 8 7 9 6 8 7 3 1 5 6 3 1 4 7 3 2 5 5 2 2 4 7 3 2 5 4 2 3 4 7 3 3 5 3 2 3 4 7 3 3 5 3 2 3 4 7 3 4 4 2 2 4 4 7 4 3 8 3 5 7 4 3 8 4 4 7 4 4 6 5 4 7 4 4 6 5 4 7 3 6 4 6 4 7 4 5 4 6 5 5 5 5 4 5 5 4 9 4 2 5 7 3 9 4 2 4 9 2 10 3 2 3 10 3 2 27 0 690.0 1.30434782609 349.0 0.661891117479 0.471396107104 0.480333420162 0.193849853591 0.127516749631 -0.00329025580243 0.00511814286746 -0.00196638563689 -0.000111196546118 0.00247482077951 30.0 0.533333333333 2.13043478261 0.666666666667 0.4 0.666666666667 0.4 1.73913043478 2.26086956522 1.91304347826 1.73913043478 23.0 7.0 17.0 0.26 3.0 4.0 4.0 0.0 0.95652173913 0.505797101449 0.771428571429 0.452380952381 0.52380952381 0.761904761905 0.5 0.625 0.520833333333 0.395833333333 0.428571428571 0.357142857143 0.333333333333 0.285714285714 0.625 0.5 0.5 0.541666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.444444444444 0.888888888889 0.875 1.0 0.833333333333 0.75 0.916666666667 0.916666666667 1.0 0.666666666667 0.75 1.0 0.916666666667 0.583333333333 0.25 0.0 0.166666666667 0.416666666667 0.0 0.166666666667 0.333333333333 0.666666666667 0.916666666667 0.916666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.888888888889 0.555555555556 0.222222222222 0.0 0.5 0.916666666667 0.75 0.25 0.0833333333333 0.0 0.25 0.583333333333 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.75 0.0833333333333 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.266752120967 0.445309720327 1.14656040582 0.59374629377 3.66460235111 1.77870932731 0.742182867212 4.01769871917 2.54906177681 0.890619440655 5.74269462614 6.40072493846 3.45761775432 1.0390560141 2 2 3 4 2 4 2 3 4 2 28 3 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 132.0 0.272727272727 62.0 1.09677419355 0.554838709677 0.575268817204 0.0205095498641 0.732725487563 0.0174633278507 -0.0002603202747 -0.017138095211 0.00369051776654 -0.247936599953 6.0 1.0 0.0 0.0 1.33333333333 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 22.0 4.0 0.0 0.15 1.0 2.0 1.0 0.0 0.954545454545 0.469696969697 0.0 0.0 0.0 0.166666666667 0.8 0.25 0.6 0.666666666667 1.0 0.333333333333 1.0 1.0 0.2 0.166666666667 0.6 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.666666666667 0.0 0.333333333333 0.5 0.0 0.0 0.666666666667 1.0 1.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.333333333333 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.666666666667 0.417162095071 0.358966384256 0.94445218628 0.478621845675 3.33841320819 1.47170919573 0.598277307094 3.40090618492 2.11542379033 0.717932768513 4.68618873034 5.46745334276 2.87559597008 0.837588229931 1 3 5 6 5 5 5 4 5 4 6 3 6 4 5 3 6 3 6 3 5 4 6 4 4 5 3 7 126.0 0.642857142857 58.0 0.98275862069 0.558189655172 0.51724137931 0.0470960268974 0.324490549018 0.0545327811718 -0.00406363762388 -0.0176816389503 -0.00584025785808 0.00353634635502 9.0 0.444444444444 0.0 0.0 1.33333333333 0.0 0.444444444444 0.0 0.0 0.0 0.0 14.0 2.0 2.0 0.105263157895 0.0 1.0 1.0 0.0 0.928571428571 0.460317460317 0.5 0.0 0.0 0.0 1.0 0.25 0.0 0.5 0.666666666667 1.0 1.0 1.0 0.111111111111 0.416666666667 0.333333333333 0.666666666667 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.0 0.25 0.75 0.339327764442 0.405258541438 1.06101608577 0.540344721918 3.54406704535 1.65168970961 0.675430902397 3.78725451944 2.37253117442 0.810517082877 5.35390471343 6.0689741752 3.22354048019 0.945603263356 1 3 3 4 2 4 1 6 24.0 1.5 17.0 1.52941176471 0.482352941176 0.588235294118 0.104213311622 0.0728679014859 0.0091593730918 0.00386797874245 -0.00236086089911 0.0122398876873 -0.00580196811368 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 4.0 0.0 0.0 0.0 2.0 1.0 0.0 0.75 0.708333333333 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.307042027168 0.362964375463 1.02597576255 0.483952500618 3.62413666318 1.6212342419 0.604940625772 3.89209285628 2.35199853673 0.725928750927 5.70423066502 6.33755170512 3.21826864705 0.846916876081 3 1 2 1 6 1 1 5 5 2 2 4 3 2 4 4 2 1 5 3 9 3 8 5 5 7 3 3 3 3 2 4 3 2 3 3 3 5 1 3 3 17 2 2 4 3 2 0 168.0 0.857142857143 84.0 1.11904761905 0.480519480519 0.571428571429 0.111556527373 0.184037900875 0.0050615484289 -0.0108343985833 -0.00553648749696 0.0114321019189 -0.0251773851734 12.0 1.0 0.714285714286 1.0 2.0 0.333333333333 0.666666666667 0.857142857143 0.571428571429 0.571428571429 0.571428571429 14.0 3.0 14.0 0.205128205128 0.0 3.0 2.0 0.0 0.928571428571 0.5 0.333333333333 0.25 0.555555555556 0.916666666667 0.555555555556 0.0833333333333 0.555555555556 0.25 0.666666666667 1.0 0.777777777778 0.916666666667 0.0 0.166666666667 0.222222222222 0.666666666667 0.0 0.0 1.0 0.0 0.0 0.5 1.0 0.5 0.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 0.0 0.5 0.0 0.75 0.0 0.25 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.5 0.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 0.5 1.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.282513199011 0.450326384933 1.15611265645 0.60043517991 3.67533996794 1.7924392434 0.750543974888 4.04073044552 2.56768519948 0.900652769865 5.77719371092 6.43273830682 3.4818505247 1.05076156484 0 4 7 3 9 3 5 4 5 4 5 3 6 4 5 4 5 4 5 4 5 4 5 4 4 6 117.0 0.692307692308 51.0 1.01960784314 0.629901960784 0.535947712418 0.0545642324596 0.287777702392 0.0534937542876 -0.00951284559762 -0.0275515187266 -0.0169135975511 -0.0188832456487 9.0 0.333333333333 0.0 0.0 0.444444444444 0.444444444444 0.444444444444 0.0 0.0 0.0 0.0 13.0 1.0 3.0 0.263157894737 0.0 1.0 1.0 0.0 0.923076923077 0.435897435897 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.125 0.333333333333 1.0 1.0 1.0 0.222222222222 0.555555555556 0.666666666667 0.75 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.25 0.5 0.5 0.5 0.75 0.374821356346 0.38473770462 1.01279584208 0.51298360616 3.46584531561 1.57837745005 0.6412295077 3.65703377397 2.268912117 0.76947540924 5.18124564063 5.88601466944 3.08439984292 0.89772131078 2 2 1 3 12 8 11 8 10 8 10 9 10 2 2 4 10 2 2 4 10 2 3 3 10 2 3 4 9 2 4 4 8 2 4 4 3 1 4 2 4 5 2 1 3 3 5 7 3 3 5 6 5 2 6 5 5 2 6 5 5 2 6 4 6 2 7 3 5 3 8 2 2 9 5 1 3 9 5 1 3 6 1 1 10 0 396.0 0.818181818182 158.0 0.848101265823 0.472449739389 0.510247136829 0.123090921813 0.259180561781 0.00650633114216 0.0112853819596 -0.0401463821208 0.0238117188744 -0.00333668898896 18.0 0.333333333333 0.909090909091 0.666666666667 0.444444444444 0.0 0.0 0.181818181818 0.909090909091 1.09090909091 0.909090909091 22.0 4.0 8.0 0.181818181818 2.0 2.0 3.0 0.0 0.954545454545 0.39898989899 0.35 0.0 0.1 0.541666666667 0.92 0.466666666667 0.4 0.633333333333 0.4 0.791666666667 0.45 0.0416666666667 0.0 0.1 0.8 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.25 0.166666666667 0.166666666667 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.222222222222 0.0 0.0 0.0 0.0 0.777777777778 0.25 1.0 1.0 0.666666666667 0.25 0.0 0.0 0.0 0.0 0.166666666667 0.5 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.111111111111 0.666666666667 0.666666666667 0.333333333333 0.0 0.275082343157 0.449278638119 1.16155867794 0.599038184159 3.70100128262 1.80352365605 0.748797730199 4.09093800733 2.5861187576 0.898557276239 5.90654340924 6.52838346657 3.50934398259 1.04831682228 0 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 91.0 0.538461538462 50.0 0.96 0.45 0.53 0.0354 0.340608 0.02656 -0.00033941125497 -0.0110539457518 0.00369731993747 -0.0154983324889 7.0 0.285714285714 0.0 0.571428571429 0.571428571429 0.0 0.0 0.0 0.0 0.0 0.0 13.0 4.0 1.0 0.047619047619 0.0 2.0 1.0 0.0 0.923076923077 0.549450549451 0.666666666667 0.0 0.0 0.25 1.0 0.5 0.5 0.875 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.375 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.339451735783 0.407071805991 1.06172124203 0.542762407989 3.53764505857 1.65150082381 0.678453009986 3.77447841551 2.3710201141 0.814143611983 5.31785599749 6.04092616974 3.2202791129 0.94983421398 11 2 11 5 9 7 9 5 11 4 11 4 11 4 11 4 11 4 6 9 6 9 3 4 4 4 2 4 5 4 2 4 5 4 2 3 6 4 2 3 7 3 1 5 6 3 2 5 5 3 2 5 5 3 2 5 4 5 2 5 3 5 3 12 12 1 2 0 345.0 0.652173913043 151.0 0.76821192053 0.607852412488 0.563816977724 0.113843037557 0.252899329674 -0.0559671049632 -0.0211004004504 0.0230955867028 0.0153256373689 -0.040521040528 15.0 0.666666666667 0.434782608696 0.0 0.533333333333 1.33333333333 0.0 0.0 0.0 0.869565217391 0.695652173913 23.0 8.0 9.0 0.115384615385 0.0 2.0 2.0 0.0 0.95652173913 0.43768115942 0.0 0.0 0.666666666667 0.388888888889 0.0 0.166666666667 0.458333333333 0.708333333333 0.4 0.5 0.166666666667 0.25 0.75 0.75 0.75 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.166666666667 0.0 0.0 0.0 0.0 1.0 0.666666666667 1.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.5 0.666666666667 0.0 0.166666666667 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.5 0.833333333333 0.5 0.166666666667 0.166666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.25 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.274272752523 0.408971106567 1.10273067513 0.545294808756 3.68193392983 1.7268107604 0.681618510945 4.02212909668 2.49024981226 0.817942213135 5.85361985516 6.47967644461 3.39304783072 0.954265915324 0 2 1 2 1 6 1 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 2 4 2 3 2 4 2 3 4 2 4 2 5 1 4 3 2 4 1 5 1 6 132.0 0.272727272727 76.0 0.960526315789 0.542105263158 0.494360902256 0.0200193176848 0.617024620936 -0.0063374763085 -0.000789204665333 -0.0170432532316 0.000104358096343 0.0383884241808 6.0 1.16666666667 0.0454545454545 0.666666666667 1.33333333333 0.0 0.666666666667 0.181818181818 0.0 0.0 0.0 22.0 8.0 5.0 0.151515151515 0.0 4.0 1.0 0.0 0.954545454545 0.575757575758 0.4 0.0 0.0 0.333333333333 0.7 0.5 0.7 0.666666666667 1.0 1.0 1.0 1.0 0.6 0.583333333333 0.4 0.416666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.333333333333 1.0 0.5 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.333333333333 0.384683149848 0.374988310899 0.990496015388 0.499984414532 3.43096793413 1.54468976977 0.624980518165 3.5657263307 2.22151142436 0.749976621798 4.97351924534 5.72826477654 3.02096097917 0.874972725431 4 4 6 7 3 14 1 19 8 3 8 3 8 3 8 3 9 3 6 1 1 4 1 5 2 8 5 4 3 0 154.0 0.785714285714 81.0 0.913580246914 0.456790123457 0.46628679962 0.114902689104 0.21562130133 -0.0143026224924 0.00702437294172 0.0192552774358 0.000532354394917 0.0279598480399 11.0 0.818181818182 0.214285714286 0.0 0.363636363636 1.09090909091 0.727272727273 0.0 0.285714285714 0.0 0.571428571429 14.0 7.0 7.0 0.133333333333 0.0 2.0 1.0 0.0 0.928571428571 0.525974025974 0.0 1.0 1.0 0.25 0.666666666667 0.666666666667 0.333333333333 0.75 1.0 0.416666666667 0.0 0.666666666667 0.555555555556 0.5 0.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.75 1.0 0.5 0.5 0.5 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.5 0.5 0.0 0.75 1.0 0.0 0.0 0.0 0.75 0.25 0.214294883087 0.482079192215 1.23264873981 0.642772256287 3.80358624414 1.90948372697 0.803465320359 4.27365205514 2.73378783501 0.964158384431 6.17528287483 6.78243565448 3.70556106393 1.1248514485 2 1 6 3 4 7 1 7 2 5 3 3 5 3 5 3 5 3 5 3 5 2 6 3 5 3 5 4 5 6 120.0 0.533333333333 56.0 1.01785714286 0.375 0.494897959184 0.0450015943878 0.350036443149 0.0122767857143 0.00727463411077 0.0191433534645 0.00142825639768 0.0566415245909 8.0 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 15.0 5.0 1.0 0.0434782608696 1.0 7.0 1.0 0.0 0.933333333333 0.466666666667 0.5 0.625 0.5 0.375 0.833333333333 1.0 0.875 1.0 0.333333333333 0.5 0.0 0.375 0.166666666667 0.125 0.0 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.327979534438 0.382901571366 1.0308636924 0.510535428488 3.5427804206 1.61378478045 0.63816928561 3.76491056355 2.32678793448 0.765803142732 5.38471320373 6.07020539139 3.16987315448 0.893436999854 1 1 1 1 4 4 2 5 3 3 38 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 154.0 0.318181818182 64.0 1.109375 0.4296875 0.588541666667 0.0272483825684 0.713558197021 0.036304473877 -2.86549329758e-05 -0.00968520343304 0.00336502492428 -0.272065535188 7.0 1.0 0.0454545454545 1.14285714286 1.14285714286 0.571428571429 0.0 0.181818181818 0.0 0.0 0.0 22.0 4.0 1.0 0.2 0.0 3.0 1.0 0.0 0.954545454545 0.415584415584 0.2 0.333333333333 0.0 0.166666666667 0.7 0.333333333333 0.6 0.75 0.6 0.25 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.666666666667 0.5 0.0 0.0 1.0 0.5 0.666666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.333333333333 0.0 0.333333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.423830951774 0.36171399786 0.947960529816 0.48228533048 3.33783142843 1.47599766186 0.6028566631 3.40951814656 2.12045359373 0.72342799572 4.70172850704 5.48167981596 2.88132832544 0.84399932834 gamera-3.3.3/tests/data/testline.xml.gz0000644000076500000000000006450011364254132017013 0ustar chriswheel‹jKtestline.xmlí½[$9š%ö_è÷Šáŭôìb!’$ís!§:ğ:1UYŞìŬŭzóÑn¤ÑÌŬÜéĠ13›‘îĉnF§™ÉóŬÎùŝ—ŸzûïŸŭíË/_˙ñú]ŭáíó×~ùӗŻ?ŝŝöíÏß?üç˙ôżüñÇO?ŝġÓwúôíÓ?}úíóz„Á˙éy{ûo˙úó?ŭòÓoü{ÙzûŠŝñß˙ĝë/ûëŝáĝ½÷ï˙úé×o·÷x˙éÓ·/_ßĝô×/ß>ŭôŝÓçoß>˙úŝóŬŝôË˙ÀŝÓa?>vĜ_;ìËc‡}½zĜ—?}ûÛŻŸß˙|t9ûëO_½˙÷Ÿ~úé_ûòÛíŭŝôŭ?ŭí7tçtWyŝ—;vùŝ§Ï7z7í÷ó§ğšûġˏı£½½c—ï˙é—oß~9şĦŞ=żŭrpK˙ËÏ?êżġçżŭôÓûo‡Gŝċ_˙ú—Ï_żûùË׿|+Ŭû˙‡ ûœZw߃kÚıKN·³çŸîŜóóŬ{ äûÇîŭġŝÚÙó—û÷üîî]ĈdgÏÓ[ŞÚóž/~™gîıR·&Żż|ùíàûŝ퟿L£ċ˙°YcŝĝO,ór#oûé_˙ññĝŭ/ĝíÓŜŝúË˙ĝ ‹”ĊŸ?àHĴpáċġċOż½ŭöíÓ7|Ê˙ù_ŝŻ˙ö_ŝċ-yóì6zûᗯŝò',•ŸeĠ”ó °Ğh{ÙàŞıĥìŜ̛V|z³ü#ĵiŭĉß´Á;xÂk²GódË^áğıMcGQŜħoñ·•Ÿío#-Ú5nûÒ üzSoËélOáŝ,ß&.ŜŸ~  'Pï0]ÀOż~ŝ´y÷í͆ôÖ½˙aÚŭ¸ßŝúù‡oß˙Š/◪!ġ²Ŝèh³ĥZü§Ÿ>ŭÏßï:ĤMÔ1Ìôŭô·ŻŸû­éWÚ8eµR1]hç_~ŝüġ[ۘÓ6{ëR²Ñ`Óge”³!›è°İ=Ŝv*F;D½[ç|H1zçrĠŠŠYĞ€=sHlFYŸ² ĈĞâÛwòBP6ı¨]ĉû&šĴBJ9X³i‰{†¤|Lĝ`í…Ó“1ĝŭôZ}ċ ˙ġ/żüôı½L>/żĉBıËM~˙ù_}ŝú§ÏŞ{÷p”ÖyexĠ§O°.Ĥé´ı›Í+ŭà”Ġ½FĈ^şFżŭógLWż|ÛŞ/ÚzóÒmc²ċ_”3áٚK@3§ú+aû˙ŝËOûùsӜġÊË7áÊ%-méëça³´·M`›p>m7ú/N·€˘ġNWGÈ S7˘ċ^-ÏŞfÍÁÜ#._Qˆ—O<¸ŝ‰ooçöќ2şİwŻ×Wħ> m/¨žnŞí}|ü´ƒ<ôoÛ/Ğ=êoQġŻü]MġIï ĉ.ïÓíùĠèq|‘.Ü˙ßç_ż~ùçÏß÷W,R9ĈµĊsYÀĝҘş‚Ή_Ĵ`!r˘gwbÊÚg—­ĥĠd —ŽĈAìóÁ[+7Żħ‹‘ ÁY`>0)şŒĠjğ>™wì‘S0QĊ2{bµ³ÙĜ1O³ÊÜÎo=FgĈ¨ĞNX’€ûl0ĵĴXĉĥ³igya’˙ HòU˘ùUšUĉ§Pċ?,‰èˆñäàÒ ú˂ì,~kÁƒóï„ÇöwÜ`Á@d(ĝ2I‚ ³ò/'ï†Ŭï‚+§ĥŜ֛tÚĈñi³_$J$,­³‘ĝB܉{îLÁ.?p§WCp§ÜôğùìaĜiMċżÌsAû­â³ 磲²@àÍä³ñı™HUtXÑ\â/àQ@ސt6I UÙE@V S/cŸ£6§”ˆ@Ĥ5Ĵ1ĈuL@^Î\8äy ò÷‘'ĤEaÖ8£ù%äùç; ¸ÀZaFĊ4Œâw³ns3­ÛD£Ó~ÒÚ,ÙtíĈĉ§qŒ_݁Êsüê¸tNKЍX Ÿ´bĦÖ-?Ï#Ĝ³)DÜ8Ğ}€µ ÷̌+äC$çÒµÀ×ü^™=LÎñé5§²˜b~˙Ŝ6ŬF[`óŻÛ§Li6˙zÈîüĥXĵ9†S›~4§Ñĵ{x_/J\˙É÷żŝ#Lëż|ï÷vbbôŻ‘ŜükŽßön6€×Z,nZĤÙÈĠ.+Ĵ}™`8 @Ĥ–7~ŽMXˆ¸ÂĦXħÜó ÎÍÚ…½Ĉ"3^ 9cÓÚcFÀ¨ĥµÁ n°ża뜁zäšħh˜ŭq9݉†½ĠFÓd]Ġ ìƒEÖ~.şΘÏ.ÖŬp8MpĜëĜu²Ĉż·“ĠV5tš:4=‘ħ#Ä´ÇO„ıIœ„ĤëR€pıN ìüğĝI“lÏżËûĊĊêäH·Û²­ċŬPàŻyĞ5ëQwâj Ż.)@žçŻÏÁù`fjAĵ¤Ĉ8%–ħ†ñç5Œ³2Ġ*L/5+ ­W c3Ï 5ÚfÀU X ĴÀ¨×ĠĊÏ {Öúö^m'wñ³Z|¨âl¤/a°c´{íŞ÷Ñ.'&Ìmè”@µx:Gù[9iƒ‹Ê—YS­ÊYzúxî!³ôúv½zÔNÚfóߜż6ŒĦ6Ĉc|P­ÁÀL:ÑW3 íz"ñ›šWtƒĦĵĞ^6=ßi ĞìˆYx7Ġ! ‹ :ŭ1Ô<ñHĈĝğ^ĤµHú~½û„mqĉ)8½Éü †É[~ò5ĉšOġùşÇ@GÈW_ÇI1Ċ LSò…ûw†Œ C.․!h”µÏGĞRĉ²èdÔШ-½ż­ż×XZÀÌnòö˘ƒ Ê,ž'ÌNeŻñRŜNîĊ7ĴpRcRpì°5À4Fĉ|íĥè à²ĉé´ŝ ƒ½œ‡Â[ ÂK\zfĜoÖ+҇qÍŞĉÒıŬ ŻU³ĝ} ß,–‹Gb:çhĠġf{eòHiœn6nŭhÁeßeƒşŽÎ1ŽÛÀv/™àdu#î]§mŭ1{”ĠĊŞMâ) v֛sıóÑtĤɇ8"ı¨ħ“5ÒytÏét뀙0O›r)Ŝè+†ÀŜayžnGÁŸÎYÌŬ>‡”Ş Âğì€ï²J<(xÜŝ.Ä\‚W /g—ƒĤ/•#Cὸ]*ÌğM&â%W-aáÂ>L“³€6 Ó mf.ü@ċĞ>`ĦŠ^™œeĦġÄħ€Ğ'ÉŬO/i¨qġj·â?3ÀCúù9iĤs’ŝJûVž%UÓg*ı%ŽŻ%sÀL.P#XdĵÊgİLJ&cĊÈóŸe§wëĦY÷Àiòü#! lĴЁÏâóÒ9-Ñw˘ 1_ŝ7KİE“0ˆ$Ô{È+ĜMÈOpñ›ŽNòp XÓ6iŒĵÔb@g•I°ĉÚá“Û2×аÙÜÛn¨3ĵĥŸyԅ’O0żlûc|§Ŭ@|g|g˘OÁ¨ëğàQ3ŬmÓèÎ>ô}ßòEnÙ´Œ×€mɜœ×èïqŝ4qk};qi™n[Šî|sc·9Ñ7À&.OG ¨Ċn-´:xżÓÚlzT…’ïijŸ”Úžu}zOûق‚Ġ X“8ğó<˜”£¤a1a3x‰dÜ#Ĵd³EI@OÚäà5Ĵt‰DLç.§ äžR€nÌġÇkŒD[c™ĝÉà3œ}ë¸~F‡²ñĞ—–(4z€ċ0Œ>6Ĵ Kƒqĝà sWU˜Mށv ²œ_lÚŜr²]Yż>²TÉÄôâçÒSÀ7NĦá°{ĝ鯗!+;Ì'V†<_™šUUw;A+FZM|>l£7JÉ'.1´iGI<hh”ŒÏ‰–¤q‘q^î܆q†œvŒ„)Y'ubĴ’ÀÊJˆXÀ,)iäŒĜL1këë >ĜF‘)'!ÛxÒÒ!†+%×ħ[â–GlZgWÀĉcĥÓó˜42bË5ÂOΞ:ÒĴŜâhœ´\–ëëü'­WxN: AJĵµ7UÖّgAÔğ‘A8§jÖŜžŽôŝ>n­×§{ÊI6ïßÙÚAK0Ž51*ϲqh;̊Fg0NÒíĴ0˜Py_ ,ĵ†˜ĥ9>y‡I?ëă"L[4‚ıYKôòDÌĴĴ=ĦßĠڨڛä IRp˜ì9œ”g E/˜nG̔}öI:Xƒ„ÎÖî$,Ĝ‹ĝHr§}À ˜-4èÛ÷&ŭŬŽߐqS)‡[}ëNNŠŽĵö2 ĈĊO*=âµY˙è$€íä!\~ÒM° ­˜QceĤÁÊÂ<?ÂÔ·…ÏÑÒQUr´¤ĥà`¸%§ŒDïtŒĤ ÍsíG°NŜOş뜔 ´Bĥ˘<ó tÀ@ĵäĵ{-ґáÁ{âĵÄx†33ÒiœEƒ‘ÎH‡WŠ’›ĥˈ £Î@‡zÈ7| èĜxuĤxÔQ}ŻlsĴ–T5ŭ2 ¤NPÀ(ĉ ´ŭúÇŜqÔGg­gê°ç70áâ[ŜR3ÁÀ¤ô*{IK Ĉ…ü!$›c‚YëâWï`_ä YSú%ic''$lb‡ ÖkfÓÚ÷¤5 ‘˜U§T9VÌÂXIFn8‰>DĤs‰İ…„-Ċ-Ġ" ħŝ4Aµ¨œ%…˜Ä™™)A{ 7%”VäĈäT5ÜBOdRIjFÂŜRÂl~b`ÙŝvRĦ+ğñ—ᢋ”C\¤ß/ùWżĥ ×L.ıžCKSNŻ›°xyrpĈ|9ÉCV§.16[0d™Ċ”Èı’CyÔ’Ż ŒŠJ‚ß6ìĦ0%‘Ѝä¸+ŒY & `ĊÔ]ü.ސ›şvSœ;~bfğ•fşp>GCôù˜²2ŻùDnYPfê§K—ğ ‚\2Aöûirtb½f—}ĥñŻŞĦ&0ÖIż)Ë\ĵܛżÔ÷Ş{T[ùŽ‚QW‘Ê-OTÓß]ßj˜ß óÀoz̃’§LÙàaêi‰Y4 ñƒ˘µéc]á™x”\0Â9´D̉(de|Œ7v’2K­ĴgéÏÖ5ošŒsŜ%èÜŞf]W0Ä8h!ёè÷ & ;ÑUwNWI‚j9žc\C#\>u#\Ïю p7ŠÏTt3HĦ ‹ÏÇMïĵÛ\Ğm;e•[shžG9áÚ¸9IҚHÒġ·>w")ŬÖĴĈz͎ÎCbYjÍ]\âlt07 °Š€š` Ўaä4yxX@‰ħ˧=3F <Ħ\m2Ĉ ˘Zú½^·I¸oğxH/êµ_†À Ħñ/ş~üfġĝÈ1/͔VyĊÊħG6{0Ì)µ5bğĈ:ċf’US³4ĵ"ĥ‚ĴôĦPK:­Ŭó8h}w]ŽûÓ1UúÎàj‡Z_Ⲙ’‘Ê%/ߒ—‘ĉÂŜ =á„EoB Ààb[ËÈÉâ)Ôm‘ó0­H1\£MQe9ú€ĵV1bM<áÈ.Ş11we ħahcó4;ċ½ÒŬZ°ÇßÔTpĴ‰çn@Oĵ|8)Ĵ&†xÈĝ9'Ĵî§2ݍ8mtñö¸W2ç^ğċNÜ7WȳpÍĊúöïÍT“ĠóÀ{fĤ„ ħĤ–•–1w™ÄĵĈĉ\p0°&£ëİ@ùğÁÚ2Ż2!:;ÙÄw’£óA§ĝù;šÉT&„ar˙0İGéh‚ġgQá pgiîep—ÓĉÙıò˘ĝÁ…je‚/ħ7;Ħ\1ş°$öü"Ï:gÚ<ĜóT–zĊ|ÀßtÍÇÒ.Ú'ïœÔƒ!JŻß·[;óàŒġħDšuÑ+ñ£8ĊD@'ġîZlVj7•j/<ċ–Ì*ZЃvŠË9QDĥÚĞ §HEîħÖ3ƒ^`ì(ûíTÊäšÌôL•VÒÜ ÎqLI9Àu9Ó²R_ħĉ8'W׋9BÏzaÉÏáÄÌ´ÌxĈ8sż“%-aĠÇÖ°’ŝ{;YìD›ŞßL’›( 6nŞĦß>œĥò?ñĵĉ×9\âµġçÌár͕}”\3†RŠŽu@íÌçı5Ùbü9yNj÷ɕgö¤,#³L§É2d½Ġ*<"ı59‹@I"´·6 “À‹€ai*ÉN\İŠĴËĈšÜĤÖ`Èy“,?lÑ×ÖÍ~qSŬóx0‰fù™K…;/™ÊÎRı6FÎ ](%´ÔŜĈğWì€àÒ#mÒôo ó—íş(Uî•)4TŸZ› sžvúŜżüz›x{šÍ @İÚjk´ĥ=i˙îöúÔÓó¸ĵĜ…´–L(!Ġˆ63§0ÑJmž78&ÙÂek ùâ˜ĈR'°x2dÂôì3m71•¸ë<°SŒô[zPĴeßċTÒÖ;´žeƒq‰Ïa™l6Ì%Ö.ŭĈ ]($öóÌĴcJ†Ç°j]lXÎù8^ÛSÎàŞĤŒïVM(M˙ôœC%IJŒ~sKáy)=/üœi8VˆíKÎqİ_ŸÙ°% èDÄù"ä‡á ÚGġê׌ċ<´Š_éÖѐÓÁŒ$#tDġĴ™ ’Ŝ£$f!—…IÎhĴr÷İaîŒÒ£•‚ESŭ:Ĵ¨1Ŝâ”k`ÌÈ'y×i„ òĵ³ŽäèÄ@5fP²ñ€’uYŽX´‰)ŒÏ£P™÷›`Ä>ş°ŭä·:UOĵutêÁ›ĝw K1$5UŻëġGÎxxġú¸U€ħŽeǧ|‰dġ¤ŞżòĤxĵF‡¤8MÁğÚżÔ)ò:Hùل[ÚXÙq*P=ƒä½„jÚbGœĴêşñCWFqġwîñêĊĥİ{<[u ż"8]ÒĴğ‡go–Ĵ’ ĜŠ|B‚ĈB‚) °VûĞ+ĵµŽAԄµ…ü‘~ÊïĦèİ*\NŠ 'V…ZˆÈgĴ ëAá^OLJ˘âġp‘ÊFhíšë,ĈúeŞNxF ”M(J.“TşJÙ~ż-̒Ĉġ˜%̓9A;&É'#bzQ²œòƒˆê´š\ÇßôWeü%e¨ ñÇlZsQùm'%!;1YQ8r“Ò^£ùo;ñĊŞ5żIYŠ“‘•Ò4?µ–Rĥòw˜Ú ŭÍJíhjݤ=9§^g?\ù[OÚLĉe̗ÁâODxˆ(^8ĝÍPzĦ<=G’cİÑR`Ħ”£Îñ$çâLL -Ĥp’ŞĥM÷V°0#ĉ4gMœĞŬŸħEL)SZ7Ĥ/uĴM]żÂlDµ4+J*‹İ†üi˜LĈ8é.Ş›öëßxı\‘Ü!`zÔQġ;’ĦFí§ü%ûTwîJ ‰Á!ë4Ê{½ó÷a”Şı’;U%ŭ0@éÊcHH Éô²áŜ2,oËs65Ö­/pzÓ²j9‚%ÏoÎrŜä37k§ŞŜ4ܜèúbHÔE%²Q-ĥÜ#)ûG¨´AÈ}[Áo)ú Šû´8µï´ÙljÛDü3{àDÁ§µÎÎÎï{‘JqeŬÓ;ïnuyô„¤–"ÍV£ġÈÈhûĥ·€ĥĉ ì ÷܁úDŠğ1{Ş}:áq˜YÊ#6•Ĥ½˜ĵIŠœêÎÁèÌ ŽĥĞ22WGc²•59A#ız”­³Ĝ‚#és …”ñë@fO%/1a`k"§AĜRA@oÄw˚ĊÚ ´0!ĵÑpœJ˘•ĉÁzÂwĉÜeMGIĞ\J10]­’ğĈU&;i$ĥÙŭüFJtġ^Eï_ùòÛSD ”˘ Tkx­Èë|ž×Qxscĥë:⸛şžr@ŝÇK‰Áĥŭ³ëcîzl]ûro%ޏHœ“e>˘'˙îZ·<DzqÀĞÂèkaaB`/l– `”#,ĝU ‘7Öß&!,:2Ċ8Š ’ğKsŽ^ˆì<–fĜ°ĜÌRu‡3vÍOŒa6İ+É@@olfrÎpMöB'žŒw' “š1™T;Ĝ°"+Ow 0&8!ügñİxtèEHûiĉÏñ |yŽg „GÍ=ŝށ×Ĵ÷qo·Û„žž_ûŬ¨ĵ°ŒÍàÎsĉŒ$ŝ^°iŒ›&ĝ죣h'×Ĝ1™MPl^ËĴNJQlÖLI™Ê-ÙÙL¨œYÈê syĊ%‘H}WÛ2xˏCY ;δ°À²ìÇC$Ş·ÖîPXÒ ~Ħ eÚM'?p…]P˜ñ–çAÀŝzLG şŽRĴÇ]!<˙ö‚d÷£Ü¨;Ŝßy úŽžˆmÎÎr$ĥaڇ‰Ŝ…2ÚĴRLĝ[)Éŝ²Ééä"YÊäŞHÙĜ0 `âKŜ*œÛiĤk™pԎ|ÜÉJúWtÉِİwW"%<×â_Â´ë£ F‘蝲v&èˆq ÖzŠú:Û]Ɇóş8jŒò8À‡ÊÍkö—S“JR )‰î+mvŭXċäܘ›y^ȞôaY%Çx7˜èµş*Ÿ86kŠÒÄtÖ%“ÉöZ¸!£ŽT[$öx“8Í €™ŒI´Œ%íнƒĈ†Àz5£bžpg+eɚBc³N3i€™ċc F0JÊُ'”Ä—9ͳóï­ŞÈx`3’P’ &Içt­fS†bœ„’}‰—™³ġŻÜàÌE&9ß áCÑi7ïŬZÎ ßĥÙpJ7êƒ²^Ç΢pGÀíÚE‚45oĤDñáX"Ĥ\–7ĈÊÓĠYF$ÓA–RÙ4âl :)#š rĤ☓38LHH›Á4­šV‰ú ”ß5ĥèĴğì“Ö€3L Â›NB§M­²6%[“zÓ%׌Ïߐ[Ä'ñïÌ)T!­ȏM€şà/L¤J˘QJùܔ¨”$ħ¨}8I  J GKcéux( Cĵ<@Xu6~¸‰ÛX‹ñQ”@R´âcU°\Ċ%ĴÍoZBH²fgŻ}PSùyÑ™"'7ó¤ñĤhH!0Ô²ö¤qM ıSMrJ×Ĉ^ší^bÓàO'=˘ĉñ•°îU/ à)¤4’€‹JĦŜ6›,ü— ͅz)½H€Mu‡wp)ôÏ-ÍQIĈĜg°Ğ·]vĊvUŬêP5§<÷•ÙĊ–Í ò–{GÍW¤˙f[\ı ˘61}ŜŜ\áó޵aĈÎYFTF³NZĜ²yÀÜtœ6am²QafAwáPP9Gt¤…À1•2à5É-CHÑfŠŠ[)’ÏÂÌÍÂËä Í`ëb3cec°:e‰ÜMa1LJÇ:•5É 1SĜĠ, U/`b{; (d:ż¨VÏláûÓZ„İr·¨0^…TXž~²ˆJx‰‰…é·ŸŠ Ŭ/ӛW^ç:Ê×fâ³\˜9.ĉÂ'?†‰†´ (.Q9„ĈlŒ–´ŞŞdt†ÉY‘!ƒŬ[X B£-ÜħĈ0ÂÌĵj×r&PâÙ Q‚›ÒŻuttş=邑‚aċŸ)“R,rä ĥޝ´w @Mic. bĤkQÉï¨NDküEGî£ĤÜß)>ĈŽı²HÈ߃ù†2Pb"ÖQžŻÓFŬ‹lÒf³-İ[#v qRíŭ~58şÄëñXdí”q`û~ŭ-ìŽ:F[ŻÓħŞu$ûŞ}€ÚOÄžğ[N%ÜàÁ ‘¤ĵIÖÀ3µÏZU¸DbJ–m7”,â6Ìè€@ S,ĉx#A2–ì‘KÁu’ò$d:0¤¨İ!÷Áä ”l`ŞħäġzLġ†šÂ#YÖ ĵŻ'qû.g„ŒĝMN‚ Û4$´6ğ•€ÍzĦ5suüJż|÷ ( s5žž¨tœ`’öI·vs4ÍNĴRÚLœ šoWŠ&­hĊ)fg§¸œ“È]áûÖÎĵé$pËÓ=?ùe,™£‘ô6><ĜÒzŒÌ­&sĥ1 Xž[Ĉyœ[ȉ`rÌ9ˆî´#ß †£—d=fE Âdߐy+‹yƒ.ŬËX7†v!X01Ż-)˙§¸ħRÁ¤Pé9–ü%|fŽà<l™hĞ˘—˙ĝÖ Ŭ%Ú)î2œàĤ˙œä`àM˙·Ċ3› 'ÛlV·IĜşğ}˜˜ËòJ̏Jšsnœœ0ßş–AöğĊüìcÊC縭-/jJ³j×ÔĥÎĴ3XAUĉ³^\,ó+xîXüèŜ„'IRkİœbY¤ĊSêX§×‰'ŻĊ ĝújĠ‰°6_Àvóì‹:‡×ùÜ~Ü0-ÎħĤ_'Äe÷éÔO9_¨tÚb'"}|†6îŭƒ}`{ož-o!Żò™ %¸Á³@Ŝ¨˜pNNö×ÇÊJçLĈqLlH r cÉğyµ#+ FıˆZ \5i"c·!aàĜZ–ĜÚDUb&Ä âuŠ mX+يdħZ)L /c4ú:[_¨hÜIijbĤ‰’˜3ñ’v˘pQläiÜê4A˟ż~÷ó—Żûm€1ÁĤ{ĦâŒÄûeŜ/YÄGn£ÀċĤÂŝypI––P*úß ×ÂĤ²_EF'q÷ òÄ'f.Ġĥ9î°r°…ŠŠÔĤdĠ3ÑMI_“„Ìq7;/ #£˜š,Ċĉyƒ>ċ¤á1 àVhB*cëí÷À‘ĝϽ×Éìú}h½ŬólĤ³>q×0¨w›}½Ŝß½‹h4âzebĝ½ŭúcÏ'úĥĊ!}nÑ5ĴË)lJ’Ö,⨁²³äa"td·Ŝ—ĴĤcÍç†ĦŬcµ‘şLZ÷„"˜Ġ¤0.(üíMÈl{)GĞ\ö5Î cp@ –óp¤ÍÙ˘‘áɤ“ô„ydb̰ĜuCœÚÁÂÇëĊ9—H'BEm_P^ùŝ£•é…ó*Ĵ—!síf<Ӄ€@.úŽH|ȳrKĴ¸c­”§è£*X^ĉC&§Ü²B'ʛón )([)şdl˜ĵ\䳈Šüp1í`Hgw‹Ïw4/ĥZÜÏÀkÉE˙†ôÜPÓ%x›}Oc†Ï‘J0Û/ä6öxTvùJŻÇ:}˙ï3ĈA #À2f‰yXVRjl)üb… “ž E•ÛLÔâÏ!CbRj#x´Í< ġÔĈÑı -(Ž“àRÂĴˆİ3$Ħċ $b‡qV3k:bg˜ƒQ8ĜFç=Ë´%˙žHš‰#<ÓÂ]’i’PĤê„ġ6˜£DZÈ*‘mŬÄSïëġÚ8³eF_Fú{煛͏^cw…èrVß]·ŬDHɽ^§ş;Žċçħe˙Hu÷ÚĴ}’Ù¤Èb-é%ŝí£`›×Ô`â7™}”™ÊWT<<Ċu]‚ à ġ!>•/ÙnĜ%ÜÛ@ž­PüñŞHi›­+ñ5X )ŞܔûÄ ŸÎ8BІ ŬjŠâyĊ<Ç! äZĝµÏ3ùvÀż÷,™QNċ3UqLè.éL3mԂ˙Ċp΅‚—c…"ob3ì,˘*ÖpÄ#_û}YÚGĵá5˘zµûäˆ9\7ŭÔU˙ö½CI÷ ´£P΀r7Hâm*î“\Ô"h½ñó…F0ĉ(…˘Ië¨èj½ZXuĈ£YiFړÄäƒB-ÊIÖf8/q&ŞD…ş ×Xú°É "&fLĉĊĤv^TsÑ Ä‚¨ĉFt#Ĝ6Nc4:íÉ$^È1KSb[÷ĵ˙$áìTsŬÇóŸĵÑÎùèΓ!ĠkĞ‚Ž}'JÖêhĞÓTP•Z½VzΊÙñĆû „F$ĝÔyz#/êÀ' ÀŸ’ +FeÜĊɟù/ •këóż ’Ä‘ċgf™èw4żĤNmŞIĞŜv"IJ—ŸŸĥކ‰|ÓÏO ”ÛÊá>ˆQtAÌ1…}ÓVxx@ĠۉĝY§ĜĞeŽ8nġ8rĜ@ĜCüWß<-Ü\—çċsû^îWċ­3{ BôA?TÌ%‰Dû˜+"\™0oY°]Tñ–³^YĈ]*lµg$³ Jf– y‚—ü( 'C§$ùn¸f([Ó1C.P€ÀâP0CÎ$¤ÊR¸ĉÉqEŸ$3SHĝ`˘Q3IĵIP P6ä!OĤmŽÏĵ!ù ×Ĥuá·g!ÑYQ. Ä+ĠımE]Ĝ/ï9!ú| œ.–ÎF䔇kŽËʄ‡Lò÷`!½ñó?Žw2Ùnĥ­£naS^¨¤İĞÖu(ßÊÍ nƒ‰§q8ùIĤÜqg [à‹ ñ‚g yrL¸”µŭÊRĥv5†ä6ÜĴnvÔĞzo‘ßÍÑO%u]+ûĵÍQ5)ŭ²rú//Îî²Ï'ŸğÇDCÏÁšŜè“^ĥmJ×\Ìúlc#ÒÒÁ&Keĝ §ÎT=öݞ.í1şè—ŸŬvŬӗ÷sњ÷Oçz1N˙ÊEĊşi@‹Ş‘ŻÚRˆž™èŻÎtn̵ĵ!3žŝšìÒğĴ#MhË 8ċ²^•ÈhĤŻc.eVW  6²ŜB$òM™ˆ^ĝ,É'Ñ6ŒÏzX˜z5ŽÊJ{Fau7ċÙAÊÉhı‰µBo5ÚĜu\]`+ċĤîËÔŬ qü(x˙ó—gPNœŻB•6^*SĤ´(Òı͓ĝÄ´°M kÔêó°˘ 6ĦÖL—wJ6.ş1v³ڸԌ*ĴT‚Á^G0L/dj&Dg}ÁıÇ☄3IGxÄmw€ĴRŜÒÊàwHR÷*LŸ c.–|Š(bߚnqïĵŜë9Ê4aÁˆ,éO1[,7¨ÌÌzÌʗmo"Ċž4ĉ6מQ\çÈ·…^ŸÖÓÓ,ĵÜjTÀu2}ÑüšÜµ~ˆçŭíŬĝĝÍyâIJݘ)§²­)Sħ£]c\‡>ĜÂŬéĴƒ{Ù=c%ä™vΐùħBĵ֕sĉ.)r²ĠKífá }Û}7ĤÂ5Ğñ~×Ù OQÓÓÓĝîεÔq¤µ1Ҏkn玺cŬöƒ5˘Ş÷oşÔû„½Sëü #°\™xZÑñ\ú£oĉĈ)u}£§~À[_҉kÒ5sr˘c,R”úPBŸj…9O8%•™*PM„ıPÂÚlXo™YȰS]Óˆ•™^O}´ÒkƒġÒy†Œ…žJ9GúmU§%ÚDSšLÁ.U'Ĵ$dĊÊÊlC’Ĉ†w£t!Ŭi¤#ƒŽJüÙVMĜlӈ´ÄUÇYuIéûġœÏ>üċ™Â%ÀĠlü‚ë#LŝÂıÌÓNĵöŻÁ­Z ón¤œĝŬ˜¨.nĥ$OÏûuyx˙Sà¨Ì²üRždɅŠ €nnV€2Ë²Ôĝñ.’2Ĝ;Ċ"ÚĴµJä;vEà–ÊY‡İĵ@5 GYa¤&rmx)Şöò’Α…[OÉKü|£ıèÍê>Ù/ôO×nŽ#£·°èĤÖĈÏÎjŬsMžġNP³½ÛC›–Ó0áĉ£Şƒ½óìŭC8Úsö]ŠşÛZí*ܕ{>PcÑu£żŒÓ.V8ˆeî`äǔèQwE›Y &R‚0ġ3ucIêS£ĴŽÙ“…hĈċäRvV(ĴÑĥܚYĴLŜ Ğô` ÜcRQ„“NÙGŞ ZqâU+nH/dS¤¨svg4–…O˘° =šŠfB=4óœğŻ —ŻÏ³nΊ;³ÂŽíü¸IÜùUèe˙{‰­ÏèċyâŻ-Mgj;Oc`1êY™îmN…[g9׊W ­dÔÌmEV Í ìNW9@ˆJIoœ†‹ÑŠĵC@ÉÓn´Û˙Y|r`Ož˜™µ„u-ÖGê#­ĴìÀ íċyUçÁ7w3JW5Òx“: h¤÷ëĴlòÖûÇħĊZëÁĥ4â–òÏà@%Ï 069+C1HŻ 'ĉÁP*Do“ÒĥqĊùŠÇIÀ‹É L'ÑÉ^9ĵ½€ŞĊbœ4ò€.’ĝSg‰‹ÄÂU‹İ8“)Üfĉ'Ë*F4:H”’ŻÁ Ë鈄Á3sšdÂ1ğ8×.ĝóyòùıt,3•gš)fh&5e[ô”%*‰·(k£ߙžÖÍġz2(üBâq ÙQĵŸWš9JÑşĥ Ÿ¸dôò3Ŝè8˙psSĠö&€€ïƒ@ÒD¸X*’‡6ô` G§aW‰ K''†R.00na5hŠËĈ$Ğ—1§šd ›£ ™Ċ%vDĵĥ÷Ó´ÖUWPß*!·j'™ĴAŽĦâkÏŜ™ÀÄ1[ğXŝDë³ı”dJuÒ‹'#3E¤x2…ì£ħZVŠd|„Q S•u3Ë5 ïèÁÊY%Šċ‰ĈU\%=k'ÒȚZÉèŒuDü÷¤hĠäp74/'ŽméÔ7t}™ÂÀ§>Ë9‹)-¤§ CG÷QžŭĤħĝ*Tĉ‡ĊÌìÊT0@ä9Œâe×êbñ6ËĦ$ôzZ!z˘ oy‹Qăµġ>a„*Sâa”[ċ0 ÄwƒÔğli&ÏßÍÜêdĦWÙn“£ähĊÚfEg½`ߑhĠżCŭpö´ÚàdÄşÇĜÎ56uĥÍV—µáÍèĴ"CPĜP ·,]Ż‘~H’ëÂ'Wž‡!0³GHòUÖ§‚Ħħ&AĞ(íò>(uú|gbÎkšÚ‡!ûMíÓ-$Z½tËkxġĝ´·ğĞs$l‡w gϜه tŻô³Àf:e<<ŒqIE $KË}Sv1왜$’á’Á ÇUĦÎE²LÉàì'5‘.rE 9i"À² 1M^ ~PÒ.ĝ:JĊÈ$ÖHħHXQI­a0ĉQMPQAżÓ³Ñß½¤­Ibm:J…ħÙPvûÑ,m?>ƒJŒâ†KozÉs²Kr˙ö·ŸœuċXê V°¤)&Ž +ñĈ0Ġ°ċ,™˙”µ.żÄ•Ħ'ĉÙ˙€Dl´İ1. Áól" ÌZdĜn0½0°ħŽq5s*ÂȂı'9üÖóĊÈѽiER§2iœ1)¤B; óL²–ú"< f6䎛Ş1€‡”—h3Ğ0kÁ6cWü(zmQS==ëğóġ*$!£Zwj ”Œ‹CÏĴ4—1ïïÇ·ĥ!ħ%F5cŞ˘çÄú]הgšU´7WuKµĤ_ LÄüéĠ›J§“°GÓmtÁÒRß^{r¸½ğî4ĵßÀ­tŝ~úŝüaÔÖÉÛo_·İô"çĊ[ŬĵuCŞúö1ŭ°â‘E1§Rg–Kä ë C³QòÙ°‘Iˆ7úP^ŒW‚s’ kO: ŭžLĢê“Î(ŞXmtöĊ i,MÖlïƒĤ& ìÊ4 HÊ:@%òsDíıH ??Î|DĠ ĉkċ½JeâŠĈǢQoGIşŸŬˆĝ"Ҕ·f—¤Ŝ‚·OIöZż?ċĈŻdüŽcè}Ċŝ€“äÈX\dó6”˘Ĵq§ss8+Í(oĤϰ‚†ĊŬdşŽTéİJ§}až0  6à”‡É€q£}3Ÿ2 PŬ%öâ×F‡Oâ´&gûYĊÏúúD˜ô÷L­ e™“Ġ,ËÔhoċÀxħóX5´U:T¨0ċ!Ġ‘Ù†úe&ÎÜď—HäöSêSĠ;Ä1:*Ü â6QÖ£}ìsvôŠİvĦ×ĜKĤ;‰ùı$µOôk>uħĥèk·Ç%·ò <=ìʈÉ>`ÌŞ R*(ĵÊĥ )GÑ<†š¨¤èeÜB)ó‡ó~fj4 8áK‹¸q<ӞëúŒ@E£$50Q²ÏùäY^°Ü`m³ÎOŭ„%È7œmĈÊ;`għù•JÌñ;ZżŽş´%á &ÀĞ0ŬJ8h³!Â-qġ:ÍY~[)‡UÂÁ,żgÀ—ĤB†u˙ĵ )kyë5xîz ġ(l§`0ĊÀçÊ Úk§äYĉv’ôÈsaÚMĴÉd‘Ž„0³SNçÜĴ çÔü„ħ#ìŠdDÑyŠâ]ŠÎ‘ŭ “‰@?:(kT.'”ğÊaö0-—bù˙ö…jß`G¸Ħaò˙w)Ü@(çĤUĵ…ÙíRZ–*ÜL[‡o·Ôv50İİI\‡ÉD³Ú½ÔÓmP ĵ+îµAĝîĵĦñRŬ§Öá´Ŭı%/Ĉ‘ĞÍTÛħéuì!İÊAŝvPù8ñÀWyz–ŭobĦ°k/á0Ôi&$€:S&)ç nBoƒÊFĵÀ“Nò½•à²Ċ…½kiÒàHİ‘XïŻYÔĦ4+èŠcŒÂ`DN×£Ċ‚ìCaç1ÂËTI†NŒB“ŬŽÄ¨f Ns`rcĠ ç•Âb—uÛÌğì3VTs2Ù^§°Û“n(ì^‘‰ĝA‡Yè씉x–|¸f+ÎEħRôşâFiĊmZÑAžyĦ{Ú]~–¤¨&v*ܟÏÉ8ŞŠ„5÷ôéz'šŜËäżˆO!Pj X”HŝĠYmiIJü9ˆĥ½öşĊ€t†XĵŠvÒ6ġĴ%!UĦx ĈÚÏ[³şCÎà´É2“&“,3ljŽá÷–°8ß§4ŜWuRb'GħyiĦĞsñ)‹£ GôÔğŬ†ÁÁ‘,u†é 7ó8²óv°ŜOqa ”< ç^0ruq5NFó²Àòŭîğ/ħsàÚµħƒ‡ }m³wƒÊkċÑ{Oç³÷v¨üŽKsxYĵMnGtÌŠÌşB›hSÌyI`_Î"ĝCáHŜó9‘`ÄĉVYİñžŠ´–Ġ#Ŝ³P%ù` Á"- Ñ \H!R(V“‘ħ *³„EÈŬ\ŒÔ€ÈX ÈWaÄbrµBŽĥOc“Pİl$›*•8ŝ˘aèK¤YÄ0Úe?Kîĥ°!ûrÜ0²d!êâ8,EĊĤ)ħ1MIŽ3\œjÄp9Z' È%‰Ñ/ŻôÄ$êGik“5)ĵÌӓ-½Ô"ĠìŠ2ż.xíô°š…p{ê‹KŭY ı<=OUĤ I‹K [%Cz#•§,;zÀĤ%A]Ù(•Î-ï ? kB̂Dµ¤—ĞúâüLd]ΊÖeA½ÎD%ıÍmÛj` .żcWçÚ9ÛÈCĴ·ĊÈçò¨B”ú½.ƒM’äf³jĴÙoÔ~L{(jv…ž|GÙiµ *ŸòèkŸġ{V“ħ†jçhş ­z&ŭr_L ĥ, {ċ…ĈÓ9IcHŽó ğÙVOܕ'ŝû)‡Os‹‡ng[niŞÙ]àEĊñ€ş ï:I™ûxúÑÙöë˘zrz•[è³ }"R{ïwµĜ^|r/ċâù|ÉH§§ §żÓÉá”'jXÁ¤ŜŸX†Œ×ġQUސİ z·Žñt g9}€ˆÒ⇎R `r’ùŠċßĵ³ò“ÊÊG{ÀâGbCħL@ĵB@Aá“éŻŬd“@Ò×İB˙ÎYB×ġtI֚mjœÍp× ˆÏz.]’yaI—4Ó_YŞlŠĈ­ž\Ĥzz¸ ŝşİ*g½žY°žfġyĦ[te`Z7t:ò5_Ġ‰[tMħzwš0˙Èl„ѐrijĝŜÉw óS&VĴ´µo67ñ#e3e£³Ê.ĝ‰8Ħ{i*¸IĈ1‡²LÌĊôÌdƒċÙRꈑ΋òƒR(Żgû)”Mñ1‰qöİ$3ћÍÍĜlŜ³ßÂ'™“×ÌşÛ!ġRcĠ&^<'N%ÚYŻÄ³“”µğk˙,äl–mÓI{ÜE—ë³lEocämÓU[m~f?Ôèĝ°WıçËikŝ}.öŭmŝdlCßÛڒž:}Ò´„„}`ۋt×Mö+‡zı›ŭĴÑ]ì{K´}É ş…çœËIK&6=‘&[•²•Èw¤7$á!ïĞm40·kEžÖĝLžLôœV` Q옲ÑŜÓ˜oİ3)¤MÒ[3ÚĵgSĈ‘0Ë´J @Ċ)ĦĥtE  #íċo}ژÏt· U.³ˆ[ ÑĤ` vt.Ż€Nß}Ÿà9Ĵü??àÌTj-nM|ÛNTÎ3msùûU@ìbÁÈYĥc9mŻĤnD0sż|5ş˘‹F¤Î4Fš.ŞħL…šôcµ’Ì3…×ĥK˙œ`:YIŝ(¸ ֘Š˜„'%Rê³cĈ7fWÊJ_lŜ!›‘şŬóq(í)\t-Ĥ{Ž‹fÄô½ ΍/(y,ċò€Ğ9[Żäy ÊÙĉÑÀâĜI¤;ĴsŬĊŒŭVË2(0ĠŭWT+ݍäŽ÷›û§wÔ1œ8“-ğö=hµŻÒ ÷û×Ğ}~:"ĞIÉÂpQ† Ss°.çBñìct$A2ʽ~ġuċF€ġ™E^ä)|d$•˘µo"”…ÑBž£,Q'—j4C3Y—YX ħô5eáw ŜŠÜù)-¤ÄŻû`<&„L‘ZAĜdĤĉ½:"OĞ ÌhízĠ#F]E3Ċ;ġ§ż~ùöé§Ù?ġ3FŠF²àš89Ğ É™³$-_‘)#ŞÓÓҘŻ^ĉĞL4˙e&85ŭ!ÑFhLİ^/{)h‘.ĵ,ĴꍇTġàÔVucXg¨nNFóĴÂ%!Ô£ ,Ĝ,8´\2£IŜ ”q‘Lé‰\£œœĊĵCrŞĦ*_6,z‚‚3,FóŜ Yĵ 1fö1À7b.´ŽrĠ!…ëDû%Ê^ŞÏ8D`ĉÈÔFĜëÀĠˆJàŠŝv óĥ£i÷džV~H´œŠ[ĵtCsĝÖ{Ĝ´\Üa Lrd9€$9ÁÔxiIWQŭ^žÙ°¤½‹…³V]wİŬBT[_ÎQ­}ë³ì|gKàñ ŝy*Òôg†ž·í,úİלÁ^çNñglßÎfìŞáîŠGŸS_İÍżaÄÚ%Ÿrá( 0Œ3C´ * %SŽ:Já݉QĈ˜ƒÖY LÔɞ+ċĝú\)ÇÌ}ù²ùU÷P­ÌĞ﵀P‘  Oc3OjOe` /I°À * UÄ SYIŒ5mTĴä8Ä#`"eòx§*‹„;ŜĈ0i0³U3Y($SuCIġ>ë=Z™¤Óİ?1ìĠĦRŬĴ]¸†µĤáÎy²f~@Ġ–è–2]½qKŬ`Ĝ6RçlC3 ĥÙ> 1°²!µújÏmÓĞu}“·ĦîĜœ…Úz!µOìfQ@ŸĜüéç­Ġż# ´‘şgĈ`j´Ĵ àfbu›‹š–,>Ĉ²Ê4Hı–ádLĴħѸp )À*F”hD-ë$X0t=I0ù¸  â£ f+PĴż‰W’32Ŭ`>ˆd+ŬlœùsÉÖƒ]c&ŻQ{r°*T.†AAôʟD:ƒ˘hú²gz@ÖÖoÏŭ˘¸ż´ġÌì[•[ɘœĤ,.3ċoi Ĉ%kk]ÔŬT޲,-wmÎ?ËÒZħҀè`ĵĥ¨H =”$rTP…È<£ì.b˜İ’š‘0ô²Pœàw¸ù­ħĦE:$ĦôIòŞ&XÄ[zœ#V²İUtŽ)ܜÑݽÊàhUŜX§·×²‹Žµ-ÏŬâĠàŠ ÌċŝW$Py°ċ ‹‰ŜÔÉTvD¤Üh5’hÍĉÇ&ÀÛThżŝ,aÌŠı`jxúòÀpŜ˘=ñï‰Ó£ƒµ›Ì­TÁl=+g-3u}-L°nż_ùlŞ:j~½j-n“Ħ*Èwù[=0XOĵ›=ùĥŸçßHـĵèÜô°ÚX ĥG2èe-L…Ix\˘ì0SʵĦĒ+‘ ÁmÉj phC ö™O“žh÷’×&  -9úI+7e•óIrôı–T£½€5'xLŞdĜGŞċ zÑ)O!5tŠ\&YFf1Öˆ3Xƒ9Ĉj‘ĝ0ü9„Ao{*TF4%ÓÏÂhxŞĵ˘Y{ m+AÎ*EßM0•\%ŠÊĝZ+g2·Ċuëóî0‡% À.Ú(ı Žd?JĦ@>7ÚÚ@‰Á‚‘–‚µş%q°H_c‘Ve*$·™ĠÏm˘½0ÌCœ|e!zjmPÑĤ‰UJÄGJĊ]+°|!•q™0íóuœ·ÔzkYĵŬÏ_Ü·}”oùwä/.éf˘yÄĥ>:~#Ħw‚éĦóÀÒÏÁ[Ŭc‡PîbÍ+{³Ë!–;òÚ- 1£—àħcħ¸÷V‡ZĤ!n°[—ġ°XíÛħûĤÍcÙŜÛV?b…½ş¸CÁcZlŽäĉ ó oÀÎ$üx2 9hëë ûÇ,‹ġd‚ †qȰgiv u=’žOÜÁiۄÁıbıÈôħ •`ŝ;7Q8ÂÀ¤9 A‰Êmöè“Ó CHTô÷9§…ŠY$.ĵgÁĞËü .›nJڃhĴIIûö [E$Ìĉ/ğy]OáIò„Eİ£ ROέ‚"Ĵš4Ş<áŠrOžÂòäĤÍ<żğîǿ֎ÉŝĴĉ,O’Ç_†óĵşê:yċÄe§Ùk‘Ù3M´G˜ò _†ġBa -y2ûÊ+êı”Ü˙rñ’ĴšEDי™f^Ğñ⌛œx°´ÉÖÂM(²3Á íVü"YÖdPJ>KÂb§IŝĦ/Ġʝ¤¨ P°X¨>´àĜ¸ñĞ C€×\ġU ֟ß-k‚Ù&PÖÍ4*ğo£â¤C“Ú´$ħÙ ĊÈ:– c0mϗ5Í<öĠŸ"$Ñ ˜6ŻIñ­éT`Kך}›2ÊĉŬCE´&‡ÊTéfM+DâÏáßÇÎèAfĉü%°mÍ.‡MġŬƒğèöaµF³_³Ù”Éö˘½ jz öZĵĠ~ÚúúÖ郍?·Aĝ‡­T‡ŬÌmÜß%oÍ}ĵ˙è[_áîKj>˙RwžŽbcq$ÁH ’Ğê¸V`QÄĜ)Ü#!`MIĉîÀ)ŞÂQmWR‹§•/*i‘A4–i”JUd´3Úq:…Ŭĵ‹ubŸÓ”„ó$ċĴgI9ë  ƒ$Ĉg,ÓĈ%aÚS$”ĥN7µ˜²Ĵĉ²á4œaQßPê‘RÏŻ™¸5ż>§ &x̓A`‰ÏBħ¨c^ÁŸĴs:STŒPĈ&JÁ Ûm+ñéċÌ:ĠM™–me’S:—â–Ĵ¨w–I ĝB`e,#Gî-ÀpĤo2¸˜ëH15)´‘‰IÌ%L䕤:ç0³ğI£Vĵ}aќiÔìœ|WÔe œYœv éš]>ŜLë1zK­ë‹àÏG%QğXaqbvd*Ìî Ĉ‹‡§„6n"16—Ó¤@ħ>VU Ĥ7q·ĴˆĊJn|8~ġZÁ]Ċâ|Œ V}ĜٍÎċYe—›ÊÜìüɊèdž2kÇ$§šJ‰,áŻfFñcÂj´\˙ ‡…#‹B b2Q;|ŝNùùH\ uċљ| Q½TY˘“Ö˘‘3"ϋµ3 w&ïNĊʍ0ğfŽÍò÷‘ÂÊ%ş πf“;ÖIÑŞ–ê3”d4wJ4ġûžSbhEhwHHwĈZóÀ¤µ½ó†ï¨œċĈù#ϧ#Í00RÎ$vŒo£6ÀÇiħ`3U¸È5ÌiCı caó·…2ÌKÒó³YèfK­;^Ž&Q닑f­tP™ŽNr^J[lÑbÏ Ó³‹Îğd„üE+Âbu`šÉ,ƒ 1×is,O!olÖBÈÀšG:.ԈHóìoÄêÔó7Ú1”È??EŝRÊNìT€bX÷‘ñG.TÉDI|*ML0ċa'‡˘Ù¸K)pñš4ĜÌû ŜÒSžžœšEûË-NÎġqSqr!jĥ]sŭw˜Şaf×ĉöoùkÓ·ċµİ¸8Bç÷êżœ·.w#>Î À| R µNÊ`ìâş²ŠEĞĈĝ5‰ŸĈ‡Dtf—*Š·ĊpÖKl‹AsĠÖ:k&mÍĞa ˜'O…[&éÒ?Éà‰ê´)MĊΞĈ˜ÁÄ×(µ* Ó(jmí%ò14´Túz5Ìv‰#:Ġ Ġf] cŜ{ÂğĵY—ê#kÁZM3Iġ^Rvl*z6^|™qà0,9ÎgéVáàqaqw,(WĴ5á—³àżeKÊTMU…°ÄĴdoKİl•4q([gBEielRٗçémZ÷Óg†…Ï >`µ^Ĵމó$ÍÛ56Ĝħk²ö)÷XĤ[sv3Ôêù¸rŭàtësëğŭšzĝĥgjÎoWĠ}x™OŞvöï6߉nJÔۃë>Ŭg7NŠÛ²ùCċ™éíf,ùöB,CËΙÜbI3§B Fe7—–Ôd$ŝïñeʤĝFÙ-ĵUôÙ ˜,L@|ab´ßPç­(ğ)ú^Ĥ–I…ü½ÄìĈ)î½!‹ ȇÂH ÚĈ×ÀßEĵi}ĊAê] #u,PHŞë!íSa_óŝòPÑAq“ônœHóDè¸ŝŽÓ£d#¤)Tö߀k?q 9ÑçŻ‚È˜ÍGAäĦÔa*½½İëqŝÇÚ³Ñú”EU‹&/ĊyešöÌÙ\{}8@dÀmòÎËĥ7Ù¨‹ZV]ÜvDzĴĤ›RN55ä0²mËÎŻCÈÀyKñ”7uQö d=ÇÊĤCiHŠ ;ñ ÷˙ïädʟ)°Ż<İäYNÙĵNèp%cüÔŜ0”ÜĴì VĜİ]ìŜKÚ 7/HjJ‡R[nġ§ğÑÌÛfÇfĝV{\Ğĵʊħš +³sŠžşBïnjmîÀsÚÉúÜpBîaÙ şÖ=7gÜÒ CfÚŠçĴĤj%z ´Žè ‚E²`öFĊ"È`ŞÀ³}Oœ˜Iġ£GĞ NA|İ7/됣t†LZĤŝĦ5Fr;U8ħ@d FÂ;V­ĈŞÁ⟜$ÖĈd•Ş™¤C)%´,ÒQôN—ğ‘™™‘Y2k¨^9´ï"³çDJ~|V¤¤ÈÑÁlzÒ§Ó P\š™Zù]2>E‡n#4§_äN\——ì•£ĥĊÛó4³yöP8ñ™ĠÒ½Ċı)—0Ó£‘ĵĈ˙]³„¤Ċ’É?hë|°ë„ʘfBÒYs5>”„ù9¨&JĞœs„ÑĉÎèàŻkWğÍ×ĥ.ËɈÂé™ZÇì×ÒjÑÖğ—Ĉ ‘\<‚¸ĉĝ톉gB[CS)Ÿ)i×3mú%k—Y€ħݘ9HÏށVĉŒİ`¨]CŞûİŻa_Ô 9@-ĉálœKUɎï`ğNkgğnœU;tNr¸zÍV(slÜ06°s͙ĵTëKµU’mKB֖|m5Ŭ+ëm"ëh|–û3Ĥ#%rf³ë°˘IèȜaÎÁĤÒÖ#]Ĥ•Í{™Şż@|^=8ĵjH(ŭĜeœŞÙé5C×U |‘†RÜX„FÂÍy‚¨kŽë[XëšìOÏxÁrÑüÄz Ê>ìġÉNQêRċ˘4ÛI<ەRš1+Ż…îïÂ>3oÛzĤD ÍT¤³^sôç5(Í^\İÏ*gôC5—G•3+8Nd€C`şHvùÇó‘Öyg,Ĉ^‘$²Š§ÎSŽ˘>[MğH˜ĴÖÙğĵcZt.İò˜ÄX2 ­ÂPu°Ö$‹ eM²²­)w”-°[nĞg"­4,ôQ_ıîŻom,äÁç;ÀmÊj)îÀ¸5XÓì-ŻZıèÛÍ!ĜÎ\3ÎħSäL´Í4Pĝ†;Óğŭ224Y-Ï Zŭ.êTq€ùÊż-)áhşèç7f7ì%€ìÀş8{ÜӍŜYTq£†cŽ|h‡̓—§öÒÜ0ş:':óĵu<[œxžyìO<ìŞĤ/ ĞŒDŝ ĉL $˜0béĦF0–!“ž˘Y‘Úô5˜L€™è^Ê&½K–RzRŞıxĴZY ˜drİAÛ˘L*‰ĜòT)u^Sĥ,:Á†„Ĵ€IJ;àÄF[ĊY´CĊ‘³R:†àҙùŝ Şšċ…טŞYy{ìƒU'#³)IÏÍ:iaêĉ˙ⴋ@ĠJüuI^HSj,7'Gš wš b˜„Šó #PêlÏɔvÚ Oíï-äИ_žĥ‹¨Ÿ›nżó”ÉŸ\U–—äK9É8áZaŠKy¸Nuê~FÚf*ißfz‚óRr^NĠ²Y’§ĵJoyMQEó< ĥzL™zJ³7è,•ù^ĴY—,ÌÂOçŭЉMuKŞ•üš{ƒu[‚Ñâ°ÍM³ü6aôa˜yI8Ü0n_½ŻX½o¨+7-w=ġlĜëUĠğ½&ö6a׳ƒ†½÷v_ séŠßUuñšL›Â¤•%ÏyT’`˘ĠÔ^ÑNŞŒ&͐)ÀV{m›À4Ìâ8ŭžñ S0ċeP^‘ڊ£ĠI3/ óo5l#?&xĞÄwnTÀѤê’böµ'PK[ĴĦÇB™S“@ÁĈÈîá8Ê*’z0ŸĠé^.€·Ù}Ôx=q¨Ëoµ¨0.jŒS)ĵxt“ˆgO~Ü(٘ò{i,lJT1S˙k üĵí&ŻmœÈÙgž÷÷7ŻOŜ]3yq†tŝ{~ŬM×XiuÏŻÙĊ{ğ-÷‹8NñûÎÚŜvú[ÜĥëeSSÇĤ?Ìë¤!?lMĵğ&sìĞ…•Ä4lİç9ċ™MzÏXĤ—(DÇ<íÂ)àè2I1r)iÄt˘Ëa_¤cMVT“¤û³ ĉ ‚íˆY­”ĝ0!yX‡İÍUULĜĈû0ĜtQ3TäĉH˜"cöcä!‡Êo—lóÖĦƒ_Ċġ^ŞŠŜ˙}ÊǍk7ˆgúÊc­#†Ĝa¸2ֆ‚Ğ“Oê­X—ħßQ%o7žmĥ×|÷È iüYMġŝ NċħĦUÏ}•-†ÛĤìÖÍ4ê‡ ÛeÏyèŬĞÄŬtŠŬ6ŽjÑÏ=}§éÍEiştßÙÜíÏ=ğ=šĞÜÔÇ7\_ûŒ‘ĤCĞ9´ó~/ĥÀ‘+˙ġïż3udŬËË9ıĝÌ´ÉŠ í…óˆ=3öi˘8²‚°|*uóL˘2tôTHĥFPĈz²`µĝ´4ŜŠ4SâÒÌÒ{ǂ] }˜zۄÁˆÎ,öĦ‹rƒ4Á“ÉmÀH XúXċ˜Ŭáêê,ĉ>˘ïJ}—Ċ„0oŽ(Κͅ¤COŻ}„öËSdY7 xÇ+sö†™ò0Î~pĊÖëô´Ĵ/F°O|ÔK>€ËáZżNÜĞÌiw²~@z/8ŽB,iĞŜ„”4Ĥ°À‚Ĥö l'ƒ £ÍxĤ3…fFa#óÒĴÀ´0¸•ĤŸ*èuYï á˘²ä"ċH )ĥ§?ןsöcržvŻêfĦx>‘·UVj&f³ï\z èŽ,ÂZıEuY¤>°ş yŝWyu²˜Ĥyaßħí´½ yl “ömÊmNĜ=I9¸ċ÷ìç)ôoíÎ^74².‰Ŝ[·R\ot°kÓÖĞsŽ>ŞÛŻ*ŭxó÷ƒ_ĝ9*s˜•0fíb4IeE˘îǝ#ݐNA²Y%Âubl·8@³LDœ¸.j,'têÊw™“‰Ñ*ĵ䈝”"äJ.׺IZ{*îeUL‰ëBòƒİ½:%4bInäBdħ3ħ&D¢Dbú¨$O81Ċ.“ó'ô#ññԋ÷ġżŸ+š˙úLÑĵŜpú·­àÑĴŝm'P7Ñŭ CŜÚ PñH|XÍ11>T!Š™4ĈĦ:kż\!üäT@5ZXA!ċ(z&ĴŠ$9§ÒİjŻy2!^*ƒħšâ6MĴŸ´ƒ0Ŝ1ŝ[îxĤšR›Œ ĞĊ{i=Êó^ĦùüĜ-Bk1/eCÚĤ`’I> Ĥ\B‡´ĦĦíızJhuĝµaéVËôÂÂ-EeíÜiŝ—´¨óóûĞ}zĊóġ{ŭ֎ÔIĜ}ÛêÖ~ÇĜĥµÄQê„ĝEcĝĝDµF[Ê/…7ğ˜Ì¸ÄE£³Êž~¨0 óì‚ל²U‘œ t ›£„ iV{ş˘Şñkİ^°˜tƒ ‘ÀVÉ$)oÇ|,TCÖYZ¸² èĜ<26+’MftžF9,ġ3Í ûı„¢'ıúĞÜ wĠ£ h£.ı÷>š=YL÷{ î—é7€ˆĦ¨X}1£§şÒóüŒ.;·ÇÁ”–mQéPÎhK…‚â_—: &Öó",z1ĤĤXĞċžWÎ8?UÚX†UÊıx 4ĈF†]R쀆v)#Ĉ Èí‚:y Á2#ĦLĞ^3ĜÁô@"Zê|Ĥ~úĥ[élmWÒv5}S¨ż*w{|J¸Ú1:Çğ³8€ċ Ü$o ë`nñsȑa·902Ö,vĦ,H¤‚ĠD)Á°:/qá –(Ä(r2”îZU…! scBÑĵĈÇJB6ÄìĦU)Öd2DïˆFĵn‡N°Mħ6¨‰K6”"ĤŬ!n˜™ĵhĠ-S!ĵ÷é™ÙĴ#$ynMz›K·%ÇiĤ^ƒce?ğiÍ.eÄ:nšz‡á¨²à‡Ó½ÀKşĥšœ‘K/i&À‹"f—ç·]^<ŒDϝhe4éC!ö„ù§=iŜÓD.ĊÄ›0`Â#“.1M­p$j\TŒÚmŜ™aPÍ&<ÛAÊÒOW—™ôAş¤33ǚn² ×% ]rž·ŭ7ĝ(‰ÏïŜêŒvdÓ úCúwĈ•-4ßyIŸİtZĠŒžfnŻz³ÍóéıˆjüWË vJxÛzäÍżŞ—ùZDÓò n’“n ¸­i>—ĥ&ÏLóİw ]żnCÁ:fĥžÚ- ·œö0(‡qèµĠ"È5‹%ı,Q]íƒÖ&ĝ tMA)Gí֜ëRϽµ9S&ÇÄl°à!\6^ylE—Ry£—älu@Í Ÿċ,ŒğXu¸JÉĊÈR7 `Ç<'ĤP% ğÔpÙ$Í än÷ ‹&ş†Êƒĝ- µ}i8í/τÓÔT703Ċĝ%Œĉ6Ûë½Ì¤/şqÎBiІÀ'ÇQ(íš=t’Ŝ¤ÉלœĠWK0ŽÊs{œĴώ"wx‰ĵMr"wNÇ*iĦHHÈ[ž_…Àĥ_\ƒÀç—[ ħnÒÓŸk„”°[óIŠJÏa-Xħ(Ĉí–0ċ äÔDӆDۚÒŬÍcd´UQ˜*™]ÀMJd`vAòе‰Ù6.ôÚädìċ&';`ouQÌÀ˜D¤çċ´1Y8ĦĴ|To2îĈ"#J¨i]WˆNˆwŠĦvğ–™Z+œÒÌġñ&NXrFçšġ‚Ô×8#­Îʒ‘×Ë ×i ZÚ•.‡=İŬAç•Ŭ‘:ZŞHEZYŠMMĦÛüaKMeI/Ï`Ñö(<3•žŸ>Á.4?É/‡Éŭĥŝ&Áµ8U—ĤI÷ÍO*"ċwqàĦ#ŻrµÙ<,'j‘˙ĠéJfÎQœpXRTrRsħyĈĤ~ݳ-2Ó ×ĤİŜœÂ!V‹8Û éÙà_@ÖIa6ˆİeï zCŠÎèɕfX!31 0Us€“ÑşL9ŠjÌĦJѵŞpĴ, !Œ˙ƒ¨¨Ż]û{\VËÏëJ:ûNoîÌ£ž”Іċġ':üû%ğ§ŭÙ½Bpd`Úğ%K‚üŒ+ï´KĦß[]*)•wEs“ÙܛġĉÂےŝħŭ癔n½=\¨öhü vıG÷‘ŸéŝĴi‡ƒş½.*Ŝy³j?äJw6zğD&-˙Ŝ= èϏìïNîŝÒĜC}ĤGÍĉFî-kO™GƒPĉlb \9D%hïSˆQè¨)Q‡w’ÓfC‰$˘#_ŻĊYÖE Ŝv)ffÒkaCáäHêXŬ"ĉŬSÂ71X,04y ~3)Ĵħö9[pm “–M@ÜÁ×E– 3ĝ„%”ߊK– ÁĈŒ@²‹ß`żç÷‹/û}yÖïgm_{ĝ°Ó~úe)ôùš_á-.şĞ0°žG‹ŝÚ(:S-y"Šq*ۊ–6nö08Œ£İ.ÑZĤ—Š”4pNkċñĤ~N" ™Ä@,GžŠY i-‰â/EñŜ5gn_6f0ç¸;‰†­‘CàÚPo[–ĠY‚PÈĤÔûĝ*ĊŜ:Üfށ<_¸ŜI´ĵ0+Ş‘¤=?lß_ÔĴîƒ=oÇŝ°;ŜßµÖoe\ΙşÑJoìáĉ-ŸâµùÍ$wÇ,zË8y*ÊdÀhΙ>4²$ÀvFI<œċvÂĴ™jÈB\ŜݘŜ$ÉŬ““Pş„HŸœR9'ÒßDĜÏäZóŻ-“ÜaÊ3£E`½f–} ÓŬmĵG˘#ƒ›r"J†Ŭކ™sszÉq'ÑŻÑöLÙóşï-ĝÛß_ÁM$'´uŠXĵWzuĞŸ‚ĥċHĈ¤ĥ46Ğħ•ÀĉĴÚ6“ı·úwqÀù $QjwC‘öÂD5ë†É¸-JjD˘ššŞjT¨~ŜyĈ¨§^€ ‡3- £ĉj€AИÑYÌA“€y(Ĝ:ĵ0yĠr°SÔ˜‰„¸˜ a„UYL5IzkiħCĈŞ-ÏG‚·ukMdy)\sïŬŒ‡úzq=ĥs'4ıAëž>Fŝġ;QŸÑA–'C}ħ7ü‚ş†J· @s–ċ°0ÊŬğèŝÖQÓJµŝ–ĈŞİ(b-d1 ¸µée²˙zV‘×ò xÍzhċăӇCo§ŽS§”î]ŝíñÛ·Şf:ŸyÀ_Ñîyêî\Ž*)ğò †䞀Ĝ]Ó=yç*|vŠŬ+úĵƒÍ‘†Écq*h• ZÁĴŝ0@ĞBôş U–%fZ×ab ïlİ*œxsEƒm˜l²rħž’ó  Xt ġ£ru…„ËÊ8jDˆ\pґÊtÚjËĵ:VN˘ĜëÀĵşˆµ’%¤ĦNî³H˜[Iu´>s‘Y7UġûÄŝ‰ufS1án‡­Ìc[²ġşqÁÍĠz’rx ŭ°)†ğ2³È"GĈ|,#´.Ĉš·Òr £X=l+)9CQĜ2ǐŻ|Ġ‘ŸŸqD–˘ñzé,Ò ÛG^Òê 63RK´ö²rV?ˆ€CQôm‰=ÑÒ('!K (Pò€j Ñ·V,/I dÑÈE8AÓöaÂĴĜK/ViےghŒF †8Ï( Iê‹´V6Ŝ›(Éè“İħŞÉċ&—~}ÏıAÙK‰K'^ÂkWë%Üĉ[Ê^Ĝ:͸aŭÙeÉml†…@ĵw..Ç]ÌJ™„"• Û…xx˜v`-+‰œ3\}·\†+‚èùašÍ̵e]ĠĤĤÜu_q0ŝô &Ú}³O=ïız@ì àğğ>û@òyGÏ(Ú=weĴġ‹O9ş”J2ƒSm&c5BÌlĴaĊ™Í%<ë0Óŝ6İÎcâµrfş„épŠSŸ²vĥÁ.LCÜCmUïu#Ê=Ċd½ˆŞĉà`ġê Á<&IIÌ,ĥb˘ĝ9À”kdıj°ö³ÔÍ—!xĤüì%s6Wż€İ~AĊ5,ġí9ž}= ”FI)+VğÄYׇ™X\ç²Ô—yğÌ5˙4˙ì!;â(˙lŒ·KÓiôÀ"~TÑ$D=8™ĝEKñ)c¤ŠÑ%›$7ƒƒrêĴs•6&†ĜQĴĦéġÖJLò~8kaŽ”2r4ëXvŽħC)l rĴk½$ôu ›”%Ô´ŜC˘¨Gĝ|s-ž|Žoüş’lƒÊòZ p_dĴO¸sÎÈXW%ÛÍ6{Û*ŬtOĜžNİ^ÒÚ/-°÷°žsöÌ=e—géd{>‹=ÖÛ÷Ċ,{„²œS×íÓîyô˜˜£ÓĤuN4žm20J=k½dĵÛÀ*ĈgĈ.Ëòy*ôÀ„µDJ54ˆĥÜz’ûBö3M˜`tb܊İHVšÁ\L—’ĝb€•‰xÇ0--ħô ( ġj¤N 3êÜ8M"Ğ}i"1­>ƒċGúĥ™ô›@_?“ŝw” šÔC§D³_lş–NżiìeÌôcP4—6İ&ZÒgŜ0?³Ì˘OŸżSS,{#ĊŞĈ…ĦĴuw |#ìġĝ\êvYŻÓ˜ÀŬÓıĝó?>\G…´ĊÇÔlu3ó˙-FëÖTŭRÙf˘‘*BĴçrċy.2{¨ÓÉ.êQÍżíÒĵ&Ö²c0êôıñ/m?ĵFÚÔaÊWëġjpÒiRÓĊxŜġÛÏï\ŠêδC,wr=è^égqž3¤ËäĞ”b­@‰¸œc*ÚCQòOr’2}— Ëôħ*Ô8~&â²äxE\ô¸ÓÒDPyäċĦÌ u&+œ§0ôg;QŜRX(g)"•ކŠvJ„‡“ˆîĝÜ%@Ád—ÒwaÉ|á1”7ŭ‰7.⯟#àù§Ożáè˙¤ŽÛވgamera-3.3.3/tests/data/testline_test1.xml0000644000076500000000000005100111364254132017504 0ustar chriswheel 4 2 10 2 1 3 10 6 11 5 12 4 12 3 14 2 14 2 14 2 14 2 13 11 5 6 2 4 4 4 5 3 5 3 6 2 4 3 7 2 4 3 7 2 4 3 7 2 4 3 7 3 3 3 7 3 3 3 7 3 2 5 6 3 2 5 5 12 3 5 1 0 7 3 13 1 1 4 1 1 10 4 2 4 9 2 5 3 9 1 7 2 9 1 7 2 8 2 7 2 8 2 7 2 7 3 6 6 3 4 5 8 2 4 5 5 1 1 3 5 5 4 6 3 6 4 6 3 6 4 6 3 6 3 7 3 7 2 7 3 7 2 7 3 7 1 8 3 6 3 7 3 6 3 3 2 1 5 5 14 6 7 1 0 2 1 1 2 11 6 12 5 13 4 14 3 14 3 14 3 14 3 14 3 14 3 2 4 8 4 3 3 6 5 6 3 4 3 6 4 4 2 7 4 4 2 7 3 5 1 8 4 4 1 8 4 4 2 7 4 3 3 7 4 3 4 6 4 3 4 6 4 1 7 4 6 3 2 12 0 3 2 1 1 1 2 1 8 2 7 3 6 4 7 2 7 3 2 1 4 3 1 3 3 6 4 7 3 7 3 7 3 6 5 5 4 6 4 7 3 7 3 7 3 6 4 5 7 3 8 1 9 2 9 3 44 2 3 4 2 3 3 10 1 11 1 10 3 7 2 1 5 3 2 3 4 3 2 4 7 8 2 4 0 0 4 1 15 1 9 1 4 6 3 7 3 7 4 6 4 6 4 6 4 6 4 6 5 4 6 4 0 1 3 2 24 1 5 5 4 7 3 6 4 6 4 6 4 6 3 8 3 6 4 5 6 4 4 6 0 2 12 1 3 2 11 5 4 2 3 5 3 3 3 5 3 3 3 5 3 4 2 5 2 11 2 5 0 0 24 1 1 2 4 5 3 5 4 6 3 6 2 8 2 6 3 6 4 5 4 4 6 3 0 2 2 2 5 1 12 1 4 1 0 3 1 8 3 1 28 1 5 7 4 7 4 7 3 8 3 8 3 8 3 8 4 6 6 4 7 5 2 9 1 9 0 2 8 3 4 1 4 2 3 4 3 3 2 4 4 8 4 8 4 7 5 3 9 2 4 1 5 2 3 3 4 1 4 2 11 1 6 1 4 3 4 2 2 1 3 14 2 1 1 1 2 2 8 10 8 4 8 9 7 5 8 9 6 6 9 8 7 6 2 2 4 7 7 7 2 2 4 7 2 1 4 7 2 3 3 7 1 3 3 7 2 3 4 9 4 7 2 4 4 9 3 7 2 4 4 3 1 5 3 7 2 4 5 2 1 5 3 6 3 5 7 4 5 5 3 5 6 5 4 7 2 6 5 5 4 7 2 6 5 6 3 7 2 6 4 7 3 7 2 7 3 7 3 6 3 8 2 6 4 3 9 5 1 6 7 1 9 5 1 6 14 1 1 12 9 0 2 2 3 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 0 4 2 8 1 5 1 9 1 4 6 4 6 4 6 4 6 4 7 3 7 3 7 4 5 6 3 7 4 1 1 2 5 0 3 1 6 1 2 4 2 17 2 9 4 5 7 4 8 3 9 3 9 3 9 3 9 3 9 4 7 6 6 3 1 2 7 1 8 0 2 3 4 4 2 5 2 6 2 5 2 5 4 3 3 4 2 4 2 5 1 4 3 3 4 2 5 0 6 1 1 1 21 4 1 4 17 3 4 4 15 4 5 4 14 3 7 4 13 3 8 3 12 4 8 4 1 14 8 3 1 10 2 3 7 4 2 8 3 3 7 3 4 1 9 4 6 3 15 3 5 2 18 5 1 2 21 5 17 0 1 3 2 2 1 24 3 0 1 1 1 1 2 9 1 3 1 0 2 2 2 2 2 2 1 17 3 4 4 4 4 3 5 3 5 4 4 4 4 3 5 4 3 6 3 3 4 0 1 2 1 11 2 2 1 0 1 1 1 2 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 3 3 6 11 4 4 4 3 4 3 6 3 2 4 6 3 3 3 6 3 2 3 7 3 3 3 6 3 3 3 6 2 3 3 7 2 4 3 6 3 2 5 5 3 2 5 4 11 3 5 1 0 8 4 11 5 11 4 11 4 11 4 12 3 12 3 12 3 11 4 5 1 5 4 3 3 5 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 4 6 3 2 4 6 4 1 5 4 5 3 13 4 1 7 2 6 3 5 7 1 9 1 4 6 3 6 3 6 3 6 3 6 2 7 3 5 4 6 3 6 4 6 6 7 1 1 2 1 2 8 8 7 3 2 4 6 2 13 3 13 2 14 2 14 2 14 3 11 14 1 15 2 14 3 8 1 4 3 7 3 3 3 5 5 3 3 5 5 3 4 3 7 1 4 4 7 1 4 6 4 3 3 7 3 3 3 8 2 20 5 2 1 2 6 0 0 4 7 2 7 2 6 3 5 3 5 3 5 3 6 1 7 2 5 3 5 4 3 5 2 6 1 3 2 4 2 5 2 4 2 4 2 3 3 3 3 3 3 3 3 3 3 4 1 5 1 6 4 2 3 2 5 2 4 3 3 2 6 3 1 3 2 7 1 11 1 4 9 4 10 3 10 3 10 4 10 3 10 4 11 6 3 0 1 1 1 1 4 4 2 5 3 3 38 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 3 12 2 3 2 8 1 3 5 4 3 3 5 3 4 3 5 3 4 3 5 3 5 2 5 2 12 2 37 2 13 2 12 9 6 12 3 13 1 5 6 8 7 3 1 3 9 2 1 4 8 2 1 4 7 1 5 4 12 1 11 0 4 6 6 1 3 4 3 3 3 18 1 5 1 2 1 1 1 1 1 3 10 3 10 3 10 3 10 3 8 1 2 3 5 3 2 4 4 3 4 7 3 0 0 2 1 2 10 6 10 4 12 3 12 3 12 3 12 3 12 3 12 3 12 3 2 4 6 4 4 2 5 4 5 2 4 3 6 3 2 4 6 3 2 3 7 3 3 2 7 3 3 2 8 1 5 1 8 2 3 3 6 3 2 4 6 9 5 11 3 6 2 1 1 2 1 6 2 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 2 5 3 3 4 2 5 2 5 1 6 1 6 2 4 3 4 4 3 4 1 7 3 2 2 0 7 3 1 1 11 3 1 4 9 2 4 3 8 3 5 2 8 3 5 3 7 2 6 3 7 2 7 1 7 3 7 1 7 3 6 3 4 5 5 7 1 5 5 6 3 4 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 7 1 7 2 16 2 16 2 16 3 3 1 11 3 2 2 12 6 14 1 3 0 4 4 7 6 3 4 3 3 2 3 4 3 9 4 8 4 5 1 1 5 3 4 1 4 1 4 4 3 1 4 4 3 1 3 4 9 3 5 1 5 1 5 2 2 5 2 1 0 2 3 3 5 2 6 1 6 2 5 3 4 3 4 2 4 3 4 1 5 2 4 3 0 6 10 9 6 2 7 4 4 7 5 3 4 9 4 2 4 11 3 2 3 13 2 1 4 13 7 15 5 15 5 15 5 15 5 15 5 15 5 16 4 16 5 16 4 12 2 3 3 12 2 3 4 10 2 6 8 2 3 8 11 10 6 1 2 4 0 2 2 3 4 1 6 1 5 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 4 1 6 2 7 4 2 1 4 3 2 3 4 2 2 4 2 3 3 8 7 8 3 9 4 2 1 5 3 1 2 5 7 4 3 1 3 3 4 3 7 2 0 4 8 5 2 2 4 3 3 4 4 1 11 2 3 2 1 6 3 10 3 10 3 10 4 10 3 10 5 5 1 3 4 4 2 5 7 2 0 1 1 1 1 1 2 1 1 1 1 2 3 1 1 1 1 1 1 1 6 1 8 1 10 7 4 5 6 8 4 7 4 8 3 9 2 9 3 20 3 20 4 19 3 19 5 18 5 18 4 19 5 19 4 19 3 20 4 19 3 20 4 18 5 17 6 17 6 13 12 7 0 0 6 4 5 5 5 6 3 7 3 6 2 7 2 7 2 6 3 7 3 5 5 4 5 3 6 6 1 8 6 4 3 3 3 2 3 4 3 3 1 5 3 10 3 8 4 6 2 1 3 4 3 2 2 4 3 3 2 3 3 4 3 2 3 3 5 1 11 2 4 2 4 7 3 1 1 11 3 1 4 9 2 4 3 8 3 5 2 8 3 5 3 7 2 6 3 7 2 7 1 7 3 7 1 7 3 6 3 4 5 5 7 1 5 5 6 3 4 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 7 1 7 2 16 2 7 3 6 2 7 4 5 3 3 1 2 4 5 3 2 2 1 6 5 6 14 1 3 0 0 24 2 6 1 2 3 5 8 4 8 4 8 4 8 4 8 3 9 4 8 4 7 6 6 6 4 0 22 1 1 3 1 2 1 2 18 9 1 9 10 9 3 9 8 9 5 8 8 8 7 8 7 8 7 3 1 5 5 2 2 5 7 2 1 6 5 2 2 5 7 2 2 5 5 2 2 4 8 1 3 5 5 1 4 3 8 1 4 4 4 2 4 3 8 1 4 4 4 1 4 4 7 3 4 7 5 4 7 3 4 7 5 4 6 4 5 6 5 5 6 3 5 6 5 5 6 3 6 5 5 5 6 3 6 5 5 4 7 3 7 4 5 4 6 5 6 3 6 4 6 5 6 3 6 4 4 9 5 1 3 10 24 5 3 0 4 9 6 2 4 4 4 3 7 4 2 2 9 3 1 3 9 3 1 3 9 7 9 7 9 3 1 4 8 3 2 3 7 4 2 5 5 3 4 4 4 4 6 7 5 0 2 2 13 2 12 9 6 12 3 13 1 5 6 8 7 3 1 3 9 2 1 4 8 2 1 4 7 1 5 4 12 1 11 0 9 4 11 4 12 2 13 2 14 1 14 1 14 1 13 3 8 1 2 4 5 1 1 8 4 5 2 4 3 4 5 3 2 4 6 3 2 4 6 3 2 4 6 3 2 3 7 3 2 4 6 3 3 4 5 3 3 4 5 4 2 4 5 5 3 12 0 7 16 21 10 10 1 12 9 7 7 9 10 6 8 8 9 7 8 4 1 4 8 7 8 3 2 4 8 1 2 4 8 3 3 4 6 2 2 3 9 3 3 4 5 2 3 4 8 3 3 4 5 2 3 4 8 3 4 4 4 2 3 3 9 3 5 3 3 2 4 4 8 3 5 4 2 1 5 3 9 3 5 4 1 2 5 4 8 4 5 6 5 4 9 3 5 5 5 5 9 3 6 4 6 4 10 1 7 4 6 3 11 2 7 2 7 4 5 1 3 3 7 2 6 5 4 11 4 2 4 9 2 8 1 1 6 1 3 7 1 2 2 3 30 1 29 0 8 3 7 2 3 6 4 4 4 5 2 6 4 4 3 5 4 4 4 3 6 3 4 3 6 4 3 3 6 3 4 3 6 3 4 3 6 3 4 2 6 4 3 3 7 4 2 4 5 5 1 6 3 7 1 2 1 3 1 2 10 2 1 1 1 2 1 1 1 11 9 10 1 10 8 8 5 10 6 8 7 9 6 8 7 9 6 8 7 3 1 5 6 3 1 4 7 3 2 5 5 2 2 4 7 3 2 5 4 2 3 4 7 3 3 5 3 2 3 4 7 3 3 5 3 2 3 4 7 3 4 4 2 2 4 4 7 4 3 8 3 5 7 4 3 8 4 4 7 4 4 6 5 4 7 4 4 6 5 4 7 3 6 4 6 4 7 4 5 4 6 5 5 5 5 4 5 5 4 9 4 2 5 7 3 9 4 2 4 9 2 10 3 2 3 10 3 2 27 0 2 2 3 4 2 4 2 3 4 2 28 3 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 1 3 5 6 5 5 5 4 5 4 6 3 6 4 5 3 6 3 6 3 5 4 6 4 4 5 3 7 1 3 3 4 2 4 1 6 3 1 2 1 6 1 1 5 5 2 2 4 3 2 4 4 2 1 5 3 9 3 8 5 5 7 3 3 3 3 2 4 3 2 3 3 3 5 1 3 3 17 2 2 4 3 2 0 0 4 7 3 9 3 5 4 5 4 5 3 6 4 5 4 5 4 5 4 5 4 5 4 4 6 2 2 1 3 12 8 11 8 10 8 10 9 10 2 2 4 10 2 2 4 10 2 3 3 10 2 3 4 9 2 4 4 8 2 4 4 3 1 4 2 4 5 2 1 3 3 5 7 3 3 5 6 5 2 6 5 5 2 6 5 5 2 6 4 6 2 7 3 5 3 8 2 2 9 5 1 3 9 5 1 3 6 1 1 10 0 0 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 11 2 11 5 9 7 9 5 11 4 11 4 11 4 11 4 11 4 6 9 6 9 3 4 4 4 2 4 5 4 2 4 5 4 2 3 6 4 2 3 7 3 1 5 6 3 2 5 5 3 2 5 5 3 2 5 4 5 2 5 3 5 3 12 12 1 2 0 0 2 1 2 1 6 1 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 2 4 2 3 2 4 2 3 4 2 4 2 5 1 4 3 2 4 1 5 1 6 4 4 6 7 3 14 1 19 8 3 8 3 8 3 8 3 9 3 6 1 1 4 1 5 2 8 5 4 3 0 2 1 6 3 4 7 1 7 2 5 3 3 5 3 5 3 5 3 5 3 5 2 6 3 5 3 5 4 5 6 1 1 1 1 4 4 2 5 3 3 38 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 gamera-3.3.3/tests/data/testline_test1.xml.gz0000644000076500000000000000601311364254132020126 0ustar chriswheel‹$ıÂK˙tmp/testline_test1.xmlÍ\YÛÈ~ß_AèŬcVwġAÀöbÈI’ìóBËc3’1£Éîŝû°ĞŞğ‹2'ŽšKÈĤx´‡Ġu|uéŬż?Üw˙Ù<>m÷ğ÷+¸éWŬfwğ˙¸ŬŬ½_=>½‰Ğ?üînŭ°y\żù¸>Ĵ˙½~ÚÔ'ÌĝćşîŬŬŭ_>?ü{˙ŭ*ĴĈñ÷qtqĠí÷ż=Ùñv?‚_ñ3SۏOŬÓa}Ĝĵ_ŭí§ż˙òÓ_Ë%şĜíĈ?âŭê~}Ĝînî÷żmoî7‡8|^u·ûŬ§íÇñOß[żĠÛ2ġÛqîò%½E;ÓAŸvMè\fĵ2îĈstÇÑÎò]K·ĦšÌO¤ŻĜ.ĵ8Zúèьĥ̖;ŝ#ĈĦëğò:ġŜ½%bżLĝ\%ĵİ„~{·>–>½t"ċĝAڏôG"@/oLjdyŒĤÇ Èċñh "ÍAÄ£eMGHWŭW#“^ĉê‚">Ÿ‡qĥzŸ§ĊJÌB³§IÂÉKei„Y™—– Ct3‰Ç}â?—V Óëڗw‰ä‘x;‘Éİeħt6‘‰ĴydĥŽô=|%éÉôœUĉéî hÒß×F~‹vV2úYò˙ċÏżüçŝëç?ÍÀŻwûç/7ż~Y?nx9n×_ĥ‡ġ}^‡UyL/LNX+KC‹#BÀ”Í lH–,ħ}bËĉÛÑrz=‰M:Š Id…˘êCekÀJWsĥŜ,cë!qTb2ÛñžT>$F'ċŠHġá[C4b•Ò·Q]ċ4°ßâ´Ó(ò¸„"=ë]G‹ "RA„ϵ99j$ƒħóŒqq2-³AQëXdĦnV̒F:×H†h|!CĴTÀó¨ UîV ” İV& –'€EH֚nKtqqVJ†Ë ‰AÑıßeÀ@ÄÎ@ırŒËzÂWĴĉ N†ÈŸžïïožû/˔ĦĊĉ<ċ@,ü^—ĠW~‡KŻĞl7.l$É$ù(öOoHà2]qF‡f[`ÜĴ-8‡u\/[H˘ ÛÇ֏q]”÷·ÎYW² ÍÏ(êˆ`638‡ÍL£2ĝ ‹- (~Ħ(†Dĵ?0˘S× Q ]ÁH"}Œš shĊ鰂E,9C(~#‚ÉÇVJ˜Ìĉ ‚ñ¤Ğ‚¸B–,—“ı|ħt|ìe^Żĵىc$óħCâGËHĝč3'bG“;ċ­Vá8uĠwûíÓfĦÎo4îàçÄÛż‚qß.3î,ÛĤHñË2ìmÊûëD|g`µ_ħït gÉ@ÀµC_`àÎĞŭC/g\oŽı ¨Hâ~ĵ!İ5Ï4݁2Y<yĦÎ0kOއÜîÚB+ÑGúŽG'6‹ä€:ÓÌ€œ˜s„öo–Ágûb!aÀ ŜÌra-AAş'FVŸáK’ 2tĥT#F"°I˙ğK˙ó‰úŜpT Óĝhf³îÒáñí“b‚’(ziǑXşĊ'²“¸Ŭg…?ŒJ ĠóĤ8Xîc`_Ŭ Rɔ0²né+f3p^²\BöÈï–I^wG$2MPÌuŽ\%Lg”9 ŠÒ/¨VeVÇyĞ“Tf8ÄıpÈ9˘\‡eyPFžn9u£3i-ĉí+$…Knrğ,7™Ó, İDĊ †ħĜĵ0ñHD=QÌ+†6ujDñú‘@uvFt~8ê˜A/NY„îgĦv|Kòy‰%éKn+³ĤU9vfYWŒ+£ġ&‚x˙ż~š\î–ĊìŠd×cÎMGñf[ €8˜´—NÛĦ+œX>+ĴÀ” 9}Çq2Jâċ]ŭZE‘rÚçÀŬ ’„kŜه%‰•2ğñŜİÉBk˘Ë½€ğ[ì0ÂTQ DP%³Ĥ£ËÉ-z$°úŻÊ˜b^ Gd½˜ X9Cœcĵ !@rkL§RŻKX=éċÌJ6ùñ ž<” Şì"Ŭešµ%ÔÍñ¸6ħ s]•'ыçş³ŝ›ž…EY´QQK{xäI˜2ĉġˆbGêŭƒ–z KgĴk ׆-J™“Dĝŝ·bĴšKF€Tġ@òq>Ğ'Y>R œ\ñz]‰ħrßġPċLÇ@%öÊ&4WÎ–/œC´ĥKËh­Şm!ÂÇ;TÊlj'ÎݝáÚ˘Ä àş›x²Xz|)ÏC9ÚÚ1Ü0WfîŻ8ŭŞA£9@n żÎˆ’-éj¨~dù‘‚)*ˆö¨""!¤#•ǃ Ĥj­I™ïl³¤°b§~Dġ½nĜXñBëıÒ÷Żñû"·•@äĤV jÁ69YWä74r§Ş™XÁ¨:UQu§Zħ¤ĥh³Ü‘ŞG‚Ï“À “TS‚ yôù÷ƒ™WWö½ŜÊŝ´"“‹÷ óúùñĊ]b€ü{Qùş ì<ĦĈAıVâÎN~ŻK5ˆœeiŻP#JċŻA ?˜ ĵ=kšż>Ġi” Âo ² è4°Éï›A1_MĊËİD?o²áòÙZċY × Gż,Áfȗß@ ‡k)3ÉE5g{Œ;Lrnsj´@oşÔŸŻ^Ĵŭ½ï\œ-‡_3MÇñ˙½,ĴRgamera-3.3.3/tests/data/testline_test2.xml0000644000076500000000000050107211364254132017515 0ustar chriswheel 4 2 10 2 1 3 10 6 11 5 12 4 12 3 14 2 14 2 14 2 14 2 13 11 5 6 2 4 4 4 5 3 5 3 6 2 4 3 7 2 4 3 7 2 4 3 7 2 4 3 7 3 3 3 7 3 3 3 7 3 2 5 6 3 2 5 5 12 3 5 1 0 368.0 0.695652173913 129.0 0.961240310078 0.413953488372 0.590204369274 0.151394077111 0.344568775449 0.0791069409682 0.0358926226307 -0.035603847149 0.0272906889632 -0.0680578513156 16.0 0.5625 0.565217391304 1.0 0.75 0.5 0.0 0.173913043478 0.0 0.869565217391 0.869565217391 23.0 3.0 5.0 0.229166666667 0.0 1.0 2.0 0.0 0.95652173913 0.350543478261 0.6 0.333333333333 0.458333333333 0.666666666667 0.5 0.375 0.458333333333 0.416666666667 0.0 0.166666666667 0.125 0.125 0.0 0.0416666666667 0.5 0.791666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.25 1.0 0.666666666667 0.666666666667 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 1.0 0.5 0.5 1.0 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.5 0.0 0.0 0.0 0.166666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.666666666667 0.310967737252 0.434186961985 1.12078673156 0.578915949313 3.62356486434 1.73965265335 0.723644936642 3.95287491119 2.49398627071 0.86837392397 5.65790973929 6.31372414361 3.38378758362 1.0131029113 7 3 13 1 1 4 1 1 10 4 2 4 9 2 5 3 9 1 7 2 9 1 7 2 8 2 7 2 8 2 7 2 7 3 6 6 3 4 5 8 2 4 5 5 1 1 3 5 5 4 6 3 6 4 6 3 6 4 6 3 6 3 7 3 7 2 7 3 7 2 7 3 7 1 8 3 6 3 7 3 6 3 3 2 1 5 5 14 6 7 1 0 418.0 0.863636363636 150.0 1.01333333333 0.432962962963 0.561587301587 0.17442637037 0.265448592593 0.00740414814815 -0.00222968192802 0.00947687106571 0.0291988802726 -0.0183717830442 19.0 0.578947368421 1.09090909091 0.210526315789 0.421052631579 0.842105263158 0.631578947368 0.909090909091 0.909090909091 0.909090909091 1.09090909091 22.0 4.0 10.0 0.137931034483 1.0 1.0 2.0 0.0 0.954545454545 0.358851674641 0.15 0.666666666667 0.8 0.833333333333 0.4 0.0 0.04 0.0666666666667 0.48 0.666666666667 0.68 0.533333333333 0.0 0.2 0.0 0.366666666667 0.0 0.0 0.0 0.833333333333 0.75 0.5 0.5 0.833333333333 0.0 0.5 0.833333333333 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.444444444444 0.0 0.0 0.166666666667 0.0 0.0 0.222222222222 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.833333333333 0.5 0.333333333333 0.166666666667 0.333333333333 0.166666666667 0.666666666667 0.666666666667 1.0 1.0 0.777777777778 0.555555555556 0.888888888889 0.0 0.0 0.0 0.833333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.111111111111 0.0 0.0 0.0 0.777777777778 0.271203317419 0.471587905619 1.19205468332 0.628783874159 3.70381496529 1.84211260988 0.785979842699 4.11558809408 2.63298823874 0.943175811239 5.90564976519 6.53121927434 3.56468156988 1.10037177978 2 1 1 2 11 6 12 5 13 4 14 3 14 3 14 3 14 3 14 3 14 3 2 4 8 4 3 3 6 5 6 3 4 3 6 4 4 2 7 4 4 2 7 3 5 1 8 4 4 1 8 4 4 2 7 4 3 3 7 4 3 4 6 4 3 4 6 4 1 7 4 6 3 2 12 0 391.0 0.739130434783 127.0 1.0157480315 0.459645669291 0.566571224052 0.18755379243 0.33068327554 0.0968500519678 0.0321390441449 -0.0535855819439 0.0231357255503 -0.0631870174111 17.0 0.588235294118 0.608695652174 0.941176470588 0.705882352941 0.235294117647 0.470588235294 0.173913043478 0.173913043478 0.869565217391 0.869565217391 23.0 3.0 6.0 0.208333333333 1.0 0.0 2.0 0.0 0.95652173913 0.324808184143 0.55 0.25 0.291666666667 0.5 0.5 0.541666666667 0.291666666667 0.416666666667 0.0 0.25 0.0 0.0416666666667 0.0 0.0333333333333 0.733333333333 0.7 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.75 0.833333333333 0.5 0.5 0.666666666667 0.5 0.833333333333 0.833333333333 1.0 1.0 1.0 1.0 0.833333333333 0.166666666667 0.666666666667 0.833333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 0.555555555556 0.666666666667 0.555555555556 0.271486565043 0.448459223322 1.16019098843 0.597945631096 3.69996952091 1.80164208386 0.74743203887 4.09217888642 2.58365451864 0.896918446644 5.92049151319 6.53415379656 3.50622829274 1.04640485442 3 2 1 1 1 2 1 8 2 7 3 6 4 7 2 7 3 2 1 4 3 1 3 3 6 4 7 3 7 3 7 3 6 5 5 4 6 4 7 3 7 3 7 3 6 4 5 7 3 8 1 9 220.0 0.454545454545 113.0 0.787610619469 0.500491642085 0.486725663717 0.0357308941664 0.440713370393 0.023681524045 -0.000618341421094 0.00984095114297 -0.00208762292139 0.0476271196485 10.0 1.0 0.181818181818 0.4 1.6 0.0 1.6 0.363636363636 0.363636363636 0.0 0.0 22.0 3.0 9.0 0.0833333333333 0.0 10.0 1.0 0.0 0.954545454545 0.513636363636 0.4 0.416666666667 0.0 0.0833333333333 0.933333333333 0.555555555556 0.533333333333 0.722222222222 0.9 1.0 1.0 1.0 0.4 0.0 0.0666666666667 0.444444444444 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.333333333333 0.5 1.0 0.333333333333 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.666666666667 0.75 0.833333333333 0.666666666667 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.0 0.0 0.5 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.334282020267 0.408233969766 1.06641581567 0.544311959688 3.54943889086 1.65933467958 0.68038994961 3.79333067977 2.38277950749 0.816467939533 5.3721248109 6.07119549405 3.23675029939 0.952545929455 2 9 3 44 2 3 4 2 3 3 10 1 11 1 10 3 7 2 1 5 3 2 3 4 3 2 4 7 8 2 4 0 168.0 0.857142857143 90.0 0.944444444444 0.469696969697 0.392307692308 0.119814814815 0.186185185185 -0.0100617283951 0.00465015315734 0.0109417409739 -0.001381164893 0.0430288388387 12.0 0.916666666667 0.285714285714 0.666666666667 1.0 1.0 1.0 0.0 0.285714285714 0.285714285714 0.571428571429 14.0 2.0 9.0 0.275862068966 0.0 2.0 1.0 0.0 0.928571428571 0.535714285714 0.555555555556 1.0 0.555555555556 0.25 1.0 0.5 0.0 0.75 1.0 0.666666666667 0.0 0.416666666667 0.888888888889 0.333333333333 0.222222222222 0.416666666667 0.0 0.5 1.0 1.0 0.0 0.5 0.0 0.0 0.5 0.75 1.0 1.0 0.5 0.75 0.75 0.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.75 1.0 1.0 1.0 0.0 0.0 0.0 1.0 0.5 0.5 1.0 0.5 0.0 0.0 0.5 0.5 0.0 0.26096446781 0.480496289721 1.20637256578 0.640661719627 3.71296510399 1.86153498607 0.800827149534 4.13231869 2.6581251179 0.960992579441 5.90372283779 6.54093097246 3.59614296127 1.12115800935 0 4 1 15 1 9 1 4 6 3 7 3 7 4 6 4 6 4 6 4 6 4 6 5 4 6 4 0 130.0 0.769230769231 69.0 0.797101449275 0.375201288245 0.427536231884 0.0777573825983 0.247390482453 -0.0486014081806 0.0183529157338 0.00253116450822 -0.0211688791358 0.0387874169373 10.0 0.3 0.0769230769231 0.4 0.0 0.4 0.0 0.307692307692 0.0 0.0 0.0 13.0 1.0 5.0 0.0869565217391 0.0 7.0 1.0 0.0 0.923076923077 0.530769230769 0.833333333333 0.5 0.5 0.625 0.888888888889 0.777777777778 1.0 1.0 1.0 0.0 0.0 0.25 1.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.327705986236 0.452925016249 1.13559622459 0.603900021666 3.58541019189 1.75180540757 0.754875027082 3.90833451107 2.50093864128 0.905850032499 5.53499589928 6.20168544435 3.38299592571 1.05682503792 1 3 2 24 1 5 5 4 7 3 6 4 6 4 6 4 6 3 8 3 6 4 5 6 4 4 6 0 140.0 0.714285714286 71.0 0.830985915493 0.369327073552 0.417118093174 0.0744989676204 0.259734962044 -0.0580675084029 0.0177420667695 -0.00263408402817 -0.0198036097265 0.0514861600343 10.0 0.5 0.0714285714286 1.2 0.0 0.4 0.0 0.285714285714 0.0 0.0 0.0 14.0 1.0 6.0 0.166666666667 0.0 6.0 1.0 0.0 0.928571428571 0.507142857143 0.833333333333 0.375 0.5 0.625 0.888888888889 1.0 0.888888888889 0.916666666667 0.833333333333 0.125 0.0 0.125 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.75 1.0 0.75 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.341733377877 0.426298350953 1.08856585672 0.568397801271 3.54217963887 1.68581235556 0.710497251588 3.81139171622 2.41310086827 0.852596701906 5.37686700386 6.07796299155 3.27043139483 0.994696152224 2 12 1 3 2 11 5 4 2 3 5 3 3 3 5 3 3 3 5 3 4 2 5 2 11 2 5 0 112.0 1.75 54.0 1.14814814815 0.481481481481 0.357142857143 0.296423309455 0.0835048010974 -0.0329218106996 -0.0310446542133 0.00207065933367 -0.00173707231247 0.0113402302907 14.0 0.0714285714286 0.75 0.0 0.0 0.285714285714 0.0 0.5 1.0 1.0 0.5 8.0 5.0 2.0 0.136363636364 0.0 1.0 2.0 0.0 0.875 0.482142857143 0.5 1.0 1.0 0.333333333333 0.75 0.0 0.0 0.0 1.0 0.666666666667 0.666666666667 0.666666666667 1.0 0.375 0.25 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 0.5 0.5 0.5 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.250724736088 0.414154653431 1.1235179463 0.552206204574 3.7339684624 1.76146727146 0.690257755718 4.11103530433 2.54224453205 0.828309306862 6.02578056868 6.62646375604 3.46584972807 0.966360858005 0 24 1 1 2 4 5 3 5 4 6 3 6 2 8 2 6 3 6 4 5 4 4 6 3 0 117.0 0.692307692308 60.0 0.95 0.35625 0.413888888889 0.0676805555556 0.296092592593 -0.0400833333333 0.0143746852723 0.00632156948398 -0.0194052005393 0.0670096246987 9.0 0.666666666667 0.0769230769231 1.33333333333 0.444444444444 0.888888888889 0.0 0.307692307692 0.0 0.0 0.0 13.0 6.0 5.0 0.0 0.0 7.0 1.0 0.0 0.923076923077 0.512820512821 1.0 0.666666666667 0.333333333333 0.625 1.0 1.0 0.833333333333 1.0 1.0 0.166666666667 0.0 0.5 0.777777777778 0.0 0.0 0.0 1.0 1.0 0.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.334134247097 0.443229183278 1.11516001235 0.590972244371 3.55725356085 1.72156737043 0.738715305464 3.85107822678 2.4590216705 0.886458366557 5.46922915501 6.11699058023 3.32752291257 1.03420142765 2 2 2 5 1 12 1 4 1 0 30.0 1.2 23.0 1.13043478261 0.478260869565 0.554347826087 0.0973124023999 0.0641078326621 0.00575326703378 0.000469423997398 -7.45117456187e-06 0.00183745964696 -0.00211017263592 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 3.0 1.0 0.2 0.0 3.0 1.0 0.0 0.8 0.766666666667 0.0 1.0 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.75 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.257768075063 0.408541235474 1.10893022947 0.544721647299 3.70733161407 1.7387931507 0.680902059124 4.05366827951 2.50970821747 0.817082470949 5.89613849967 6.53056639848 3.42167542978 0.953262882774 3 1 8 3 1 28 1 5 7 4 7 4 7 3 8 3 8 3 8 3 8 4 6 6 4 7 5 2 9 1 9 0 176.0 0.6875 77.0 0.87012987013 0.393506493506 0.415584415584 0.0803972549629 0.255319987821 -0.0517509139536 0.017373364118 -0.00615020067083 -0.0180936623295 0.0538452835319 11.0 0.363636363636 0.0625 0.727272727273 0.0 0.727272727273 0.0 0.25 0.0 0.0 0.0 16.0 7.0 2.0 0.0714285714286 0.0 7.0 1.0 0.0 0.9375 0.4375 0.625 0.125 0.0 0.625 0.75 1.0 1.0 0.583333333333 0.75 0.25 0.0833333333333 0.333333333333 0.75 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.5 0.0 0.0 0.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 0.5 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.311399499666 0.391676405846 1.05243168368 0.522235207795 3.5797862155 1.64691240203 0.652794009743 3.83302074981 2.37394223936 0.783352811692 5.51468749002 6.17411580364 3.23352119565 0.913911613641 2 8 3 4 1 4 2 3 4 3 3 2 4 4 8 4 8 4 7 5 3 9 2 4 1 5 2 3 3 4 1 4 2 11 1 6 1 4 3 4 156.0 0.923076923077 95.0 0.863157894737 0.541626794258 0.54298245614 0.108790202653 0.162185741362 0.00200145793847 -0.0107767183375 -0.00672926794542 0.00715076609375 -0.0179044281223 12.0 0.75 0.615384615385 1.0 1.33333333333 0.666666666667 0.0 0.615384615385 0.307692307692 0.307692307692 0.923076923077 13.0 5.0 9.0 0.212121212121 0.0 2.0 1.0 0.0 0.923076923077 0.608974358974 0.666666666667 0.222222222222 0.333333333333 0.833333333333 0.555555555556 0.0 0.555555555556 0.5 0.888888888889 0.666666666667 1.0 0.75 0.333333333333 0.666666666667 0.666666666667 0.916666666667 0.0 0.5 0.0 0.0 0.0 0.0 0.5 0.5 0.5 1.0 1.0 0.0 0.25 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.25 0.0 0.0 0.5 0.5 0.0 0.5 1.0 0.5 0.0 0.0 1.0 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 0.5 0.5 0.5 0.75 1.0 0.313748137523 0.492671534018 1.19490761959 0.65689537869 3.6090953343 1.82989217505 0.821119223363 3.98065013069 2.59937979074 0.985343068035 5.57652621143 6.25557388242 3.50337046665 1.14956691271 2 2 1 3 14 2 1 1 1 2 2 8 10 8 4 8 9 7 5 8 9 6 6 9 8 7 6 2 2 4 7 7 7 2 2 4 7 2 1 4 7 2 3 3 7 1 3 3 7 2 3 4 9 4 7 2 4 4 9 3 7 2 4 4 3 1 5 3 7 2 4 5 2 1 5 3 6 3 5 7 4 5 5 3 5 6 5 4 7 2 6 5 5 4 7 2 6 5 6 3 7 2 6 4 7 3 7 2 7 3 7 3 6 3 8 2 6 4 3 9 5 1 6 7 1 9 5 1 6 14 1 1 12 9 638.0 1.31818181818 271.0 0.822878228782 0.517264101212 0.500439290107 0.262818797085 0.164945016234 -0.000527069172327 -0.00260266621993 -0.0019075900028 0.00806976683478 0.00376543115039 29.0 0.551724137931 2.09090909091 0.551724137931 0.275862068966 0.137931034483 1.10344827586 1.45454545455 2.18181818182 2.0 1.81818181818 22.0 6.0 15.0 0.166666666667 3.0 4.0 4.0 0.0 0.954545454545 0.424764890282 0.6 0.285714285714 0.342857142857 0.642857142857 0.485714285714 0.547619047619 0.4 0.190476190476 0.114285714286 0.142857142857 0.428571428571 0.214285714286 0.725 0.458333333333 0.475 0.6875 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.875 1.0 0.5 0.5 0.625 0.583333333333 0.583333333333 0.916666666667 0.666666666667 1.0 0.555555555556 0.111111111111 0.0 0.0 0.0 0.555555555556 0.0 0.333333333333 0.5 0.916666666667 0.875 0.583333333333 0.25 0.0 0.0 0.0 0.0 0.0833333333333 0.75 0.75 0.5 0.166666666667 0.166666666667 0.333333333333 0.555555555556 0.0 0.0 0.0 0.0 0.111111111111 0.75 1.0 0.75 0.583333333333 0.625 0.666666666667 0.583333333333 1.0 0.75 0.416666666667 0.25 0.25 0.375 0.25 0.25 0.916666666667 0.280062243259 0.468577608023 1.17229372535 0.624770144031 3.64476286086 1.80756939501 0.780962680039 4.00760198063 2.57972596 0.937155216046 5.6697266353 6.34139100146 3.48876342032 1.09334775205 0 2 2.0 0.5 2.0 3.0 0.5 0.5 0.0 0.125 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 3.0 3.0 3.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.279692421434 0.337618618559 1.03216458805 0.450158158079 3.77407354332 1.6539597538 0.562697697598 4.14079735944 2.42125652704 0.675237237118 6.35339698209 6.83706122382 3.33405490777 0.787776776637 2 3 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 78.0 0.461538461538 47.0 0.978723404255 0.578723404255 0.526595744681 0.0282788977394 0.342332623792 -0.00289916492492 -0.00099093044569 -0.00481735679747 0.00452524903532 -0.00531963746953 6.0 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 13.0 5.0 3.0 0.0 0.0 7.0 1.0 0.0 0.923076923077 0.602564102564 0.0 0.0 0.0 0.25 0.833333333333 0.5 0.5 0.75 1.0 1.0 1.0 1.0 0.666666666667 0.5 0.5 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.337527546681 0.390878681006 1.03858619118 0.521171574674 3.53185424282 1.62161687429 0.651464468343 3.74843691601 2.33400121153 0.781757362011 5.32032617025 6.02335139058 3.17573920289 0.91205025568 0 4 2 8 1 5 1 9 1 4 6 4 6 4 6 4 6 4 7 3 7 3 7 4 5 6 3 7 4 1 1 2 5 0 140.0 0.714285714286 72.0 0.861111111111 0.391975308642 0.434829059829 0.071748542524 0.26240730024 -0.033720207476 0.0141062866562 0.00577614840378 -0.0200367816628 0.0341689506252 10.0 0.4 0.214285714286 0.8 0.0 0.8 0.0 0.571428571429 0.0 0.0 0.0 14.0 3.0 8.0 0.192307692308 0.0 5.0 1.0 0.0 0.928571428571 0.514285714286 0.833333333333 0.5 0.166666666667 0.5 0.777777777778 1.0 1.0 0.916666666667 0.833333333333 0.0 0.0 0.625 1.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.331131987765 0.432479056446 1.10474987509 0.576638741928 3.57196618027 1.71100680209 0.72079842741 3.85820549263 2.44929151238 0.864958112892 5.44080381828 6.14497271836 3.31960400596 1.00911779837 3 1 6 1 2 4 2 17 2 9 4 5 7 4 8 3 9 3 9 3 9 3 9 3 9 4 7 6 6 3 1 2 7 1 8 0 180.0 0.8 72.0 0.944444444444 0.455808080808 0.411706349206 0.0873815800754 0.251733431927 -0.0408495156036 0.0163710630017 -0.00245932779136 -0.0254425525981 0.0599329577829 12.0 0.25 0.2 0.333333333333 0.0 0.666666666667 0.0 0.533333333333 0.0 0.0 0.266666666667 15.0 1.0 6.0 0.230769230769 0.0 5.0 1.0 0.0 0.933333333333 0.4 0.555555555556 0.0833333333333 0.0 0.166666666667 0.666666666667 1.0 1.0 0.75 0.555555555556 0.5 0.0 0.416666666667 0.777777777778 0.166666666667 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.25 0.0 0.0 0.0 0.25 0.25 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.0 0.5 1.0 0.5 0.0 0.0 1.0 0.5 0.0 1.0 0.75 0.0 0.0 0.0 0.25 0.25 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.25 0.0 0.0 0.0 0.0 0.0 0.321283517162 0.405747782037 1.07031958447 0.540997042716 3.57650896251 1.66872606919 0.676246303394 3.84207303474 2.39946318934 0.811495564073 5.50639032841 6.16546336017 3.26253094494 0.946744824752 2 3 4 4 2 5 2 6 2 5 2 5 4 3 3 4 2 4 2 5 1 4 3 3 4 2 5 0 91.0 0.538461538462 53.0 0.924528301887 0.537735849057 0.466981132075 0.0531445421388 0.225944907541 -0.036755173734 -0.00117433511631 -0.026279042765 0.00894770313025 0.0154880001228 7.0 0.428571428571 0.0 0.0 0.571428571429 0.571428571429 0.0 0.0 0.0 0.0 0.0 13.0 0.0 4.0 0.2 0.0 3.0 1.0 0.0 0.923076923077 0.582417582418 0.0 0.0 0.0 0.75 0.666666666667 0.666666666667 0.166666666667 0.875 1.0 1.0 0.833333333333 0.375 0.333333333333 1.0 0.833333333333 0.125 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.5 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.330771656443 0.365418121623 1.01591084474 0.487224162164 3.57412449057 1.60031773253 0.609030202705 3.81364123845 2.31689629097 0.730836243246 5.53672342467 6.19545055025 3.16564652005 0.852642283788 6 1 1 1 21 4 1 4 17 3 4 4 15 4 5 4 14 3 7 4 13 3 8 3 12 4 8 4 1 14 8 3 1 10 2 3 7 4 2 8 3 3 7 3 4 1 9 4 6 3 15 3 5 2 18 5 1 2 21 5 17 0 378.0 1.92857142857 119.0 1.06722689076 0.400129282482 0.509372979961 0.440974412504 0.0930713362953 0.003541505579 0.112803260905 -0.0278651347362 0.00523233024466 -0.000125416055098 27.0 0.259259259259 1.21428571429 0.296296296296 0.740740740741 0.0 0.0 0.857142857143 0.857142857143 1.71428571429 0.857142857143 14.0 2.0 8.0 0.382978723404 0.0 2.0 3.0 0.0 0.928571428571 0.314814814815 0.333333333333 0.583333333333 0.555555555556 0.458333333333 0.52380952381 0.25 0.238095238095 0.428571428571 0.0 0.392857142857 0.619047619048 0.0357142857143 0.0 0.25 0.52380952381 0.0 0.0 0.166666666667 0.666666666667 0.833333333333 1.0 0.666666666667 0.5 0.0 0.0 0.833333333333 0.5 0.333333333333 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.875 0.0 0.833333333333 0.833333333333 0.333333333333 0.333333333333 0.666666666667 0.666666666667 0.166666666667 0.0 0.0 0.5 0.833333333333 0.666666666667 0.5 0.166666666667 0.0 0.0 0.0 0.0 0.375 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.25 0.0 0.0 0.305940372859 0.367034053704 1.02415151379 0.489378738272 3.59694733911 1.61442237693 0.61172342284 3.85136838037 2.33838643396 0.734068107408 5.60938644012 6.25840871459 3.19604368486 0.856412791975 1 3 2 2 1 24 3 0 36.0 2.25 29.0 1.13793103448 0.456896551724 0.51724137931 0.207552585182 0.0346877690762 -0.0136536963385 0.0180528127478 -0.00247871735241 -0.00245666330542 -0.000255196829419 9.0 0.0 0.25 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 4.0 4.0 3.0 0.0 0.0 1.0 2.0 0.0 0.75 0.805555555556 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 0.5 1.0 1.0 1.0 1.0 0.0 0.0 0.334868697901 0.362337161999 1.00764642811 0.483116215999 3.55853772632 1.5873894177 0.603895269999 3.77897304957 2.29826496032 0.724674323999 5.45478076469 6.13629466196 3.14027305597 0.845453377999 1 1 1 1 2 9 1 3 1 0 20.0 1.25 14.0 1.71428571429 0.535714285714 0.547619047619 0.100583090379 0.0674198250729 -0.00655976676385 -0.000667874823605 -0.00144706211781 -0.000667874823605 -0.00300543670622 5.0 0.0 0.25 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 4.0 2.0 0.0 0.2 0.0 2.0 1.0 0.0 0.75 0.7 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.257412569055 0.389303111921 1.07805862717 0.519070815894 3.68775372322 1.69694066602 0.648838519868 4.00699497479 2.45556965768 0.778606223841 5.8503347958 6.48482367389 3.35394560216 0.908373927815 2 2 2 2 2 2 1 17 3 4 4 4 4 3 5 3 5 4 4 4 4 3 5 4 3 6 3 3 4 0 112.0 0.571428571429 61.0 0.918032786885 0.405152224824 0.462799495586 0.0500834871641 0.278684118935 -0.0405364325648 0.00736088277342 0.0081187096434 -0.0129219325102 0.0313124508351 8.0 0.5 0.142857142857 0.5 0.0 1.5 0.0 0.571428571429 0.0 0.0 0.0 14.0 5.0 4.0 0.125 0.0 7.0 1.0 0.0 0.928571428571 0.544642857143 0.333333333333 0.625 0.5 0.625 1.0 1.0 1.0 1.0 0.5 0.5 0.333333333333 0.375 1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.5 0.0 1.0 0.5 0.5 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.331253753801 0.392185745072 1.04762879776 0.522914326763 3.55922869716 1.63748254157 0.653642908454 3.80122086639 2.35851490314 0.784371490145 5.46574993066 6.11791463459 3.21072588245 0.915100071836 1 2 1 11 2 2 1 0 20.0 0.8 15.0 1.4 0.466666666667 0.483333333333 0.0604444444444 0.101925925926 -0.00711111111111 0.000826236447191 0.000673229697711 -0.00189728369355 0.00412098178599 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0 2.0 1.0 0.111111111111 0.0 2.0 1.0 0.0 0.8 0.75 0.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 0.0 0.252229173447 0.39705350818 1.09204672924 0.529404677574 3.70145712468 1.71670969385 0.661755846967 4.03499989196 2.48203317137 0.794107016361 5.88730160722 6.51929438131 3.38801716181 0.926458185754 1 1 1 2 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 3 3 6 11 4 4 4 3 4 3 6 3 2 4 6 3 3 3 6 3 2 3 7 3 3 3 6 3 3 3 6 2 3 3 7 2 4 3 6 3 2 5 5 3 2 5 4 11 3 5 1 0 330.0 0.681818181818 127.0 0.968503937008 0.426321709786 0.586051743532 0.144452477881 0.300516065599 0.0636262847329 0.0275639457578 -0.0331651082969 0.0174628751351 -0.0466870119718 15.0 0.733333333333 0.636363636364 1.33333333333 0.8 0.266666666667 0.266666666667 0.181818181818 0.181818181818 0.909090909091 0.909090909091 22.0 6.0 9.0 0.163265306122 0.0 1.0 2.0 0.0 0.954545454545 0.384848484848 0.533333333333 0.333333333333 0.466666666667 0.611111111111 0.5 0.625 0.45 0.583333333333 0.0 0.333333333333 0.0 0.125 0.0 0.166666666667 0.75 0.708333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.75 0.666666666667 0.5 0.5 0.75 0.666666666667 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.833333333333 1.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.166666666667 0.666666666667 0.28529160939 0.431758959843 1.13239082857 0.575678613124 3.67922023885 1.76343367037 0.719598266405 4.04689957551 2.53365456603 0.863517919686 5.87426960986 6.48683534916 3.44305351555 1.00743757297 8 4 11 5 11 4 11 4 11 4 12 3 12 3 12 3 11 4 5 1 5 4 3 3 5 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 4 6 3 2 4 6 4 1 5 4 5 3 13 315.0 0.714285714286 121.0 0.876033057851 0.550767414404 0.6 0.161387612394 0.314186189468 -0.0699405778294 -0.0413387185696 0.0313849557742 0.0258775375861 -0.072945837033 15.0 0.266666666667 0.52380952381 0.0 0.266666666667 0.8 0.0 0.0 0.190476190476 0.952380952381 0.952380952381 21.0 4.0 3.0 0.116279069767 1.0 1.0 2.0 0.0 0.952380952381 0.384126984127 0.0 0.0 0.933333333333 0.888888888889 0.0 0.05 0.05 0.333333333333 0.6 0.35 0.35 0.416666666667 0.45 0.5 0.5 0.666666666667 0.0 0.0 0.0 0.0 0.666666666667 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.833333333333 0.0 0.0 0.0 0.166666666667 0.166666666667 0.0 0.166666666667 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.5 0.833333333333 0.833333333333 0.5 0.5 0.833333333333 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.256325640794 0.461576278696 1.1817441725 0.615435038262 3.7152086843 1.83112342452 0.769293797827 4.12284583035 2.6220799601 0.923152557393 5.93838650691 6.56088031738 3.55461377923 1.07701131696 4 1 7 2 6 3 5 7 1 9 1 4 6 3 6 3 6 3 6 3 6 2 7 3 5 4 6 3 6 4 6 6 144.0 0.5625 60.0 1.08333333333 0.4375 0.512222222222 0.0497222222222 0.346939814815 0.0101388888889 0.00796113243387 0.0208214692642 -0.000432722213373 0.0505438471835 9.0 0.666666666667 0.0 0.444444444444 0.0 0.888888888889 0.888888888889 0.0 0.0 0.0 0.0 16.0 0.0 5.0 0.185185185185 0.0 7.0 1.0 0.0 0.9375 0.416666666667 0.125 0.375 0.0 0.125 0.625 1.0 1.0 0.875 0.625 0.625 0.375 0.75 0.166666666667 0.25 0.0 0.25 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 1.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.25 0.5 0.0 0.0 0.0 0.0 0.5 0.32340380627 0.3733181648 1.01979222972 0.497757553067 3.54917946835 1.60101196005 0.622196941334 3.76643575812 2.31274035955 0.746636329601 5.38940450511 6.09015301615 3.15497742821 0.871075717867 7 1 1 2 1 2 8 8 7 3 2 4 6 2 13 3 13 2 14 2 14 2 14 3 11 14 1 15 2 14 3 8 1 4 3 7 3 3 3 5 5 3 3 5 5 3 4 3 7 1 4 4 7 1 4 6 4 3 3 7 3 3 3 8 2 20 5 2 1 2 6 0 368.0 0.695652173913 175.0 0.794285714286 0.489142857143 0.571688311688 0.0940770145773 0.21984354519 -0.00483433236152 0.0072279351844 0.0096841755054 0.00527616814915 -0.0362644637178 16.0 1.25 0.565217391304 0.75 1.25 2.0 1.0 0.521739130435 0.0 0.695652173913 0.695652173913 23.0 3.0 21.0 0.142857142857 0.0 3.0 2.0 0.0 0.95652173913 0.475543478261 0.05 0.458333333333 0.5 0.5 0.5 0.541666666667 0.833333333333 0.833333333333 0.4 0.333333333333 0.333333333333 0.375 0.3 0.25 0.666666666667 0.625 0.0 0.0 0.0 0.5 0.166666666667 0.0 0.0 0.333333333333 0.0 0.166666666667 0.5 0.833333333333 1.0 0.833333333333 1.0 0.666666666667 0.0 0.833333333333 0.5 1.0 1.0 1.0 1.0 0.833333333333 0.75 0.333333333333 0.0 0.666666666667 1.0 0.333333333333 0.666666666667 0.833333333333 0.75 0.0 0.0 0.666666666667 0.833333333333 0.0 0.166666666667 1.0 0.75 0.333333333333 0.0 0.666666666667 0.5 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.666666666667 1.0 0.833333333333 0.833333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.5 0.333333333333 0.333333333333 0.666666666667 0.324919327053 0.397243474022 1.06007550399 0.529657965362 3.58061520077 1.65660534163 0.662072456703 3.85044132006 2.38573956392 0.794486948043 5.55056181443 6.20100025558 3.24747817087 0.926901439384 0 4 7 2 7 2 6 3 5 3 5 3 5 3 6 1 7 2 5 3 5 4 3 5 2 6 104.0 0.615384615385 41.0 1.29268292683 0.651567944251 0.563008130081 0.05835666923 0.407829253783 0.0646102058879 -0.01108629047 -0.0483080332087 -0.0142871285521 -0.0601817248727 8.0 0.5 0.0 0.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 13.0 0.0 2.0 0.25 0.0 1.0 1.0 0.0 0.923076923077 0.394230769231 0.333333333333 0.0 0.0 0.0 0.5 0.0 0.0 0.375 0.5 1.0 0.666666666667 1.0 0.0 0.5 0.333333333333 0.875 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.341476820344 0.409478809018 1.06191001838 0.545971745357 3.52631795474 1.64984894361 0.682464681696 3.77906662718 2.36677243709 0.818957618035 5.37054614807 6.05658762014 3.21268049884 0.955450554374 1 3 2 4 2 5 2 4 2 4 2 3 3 3 3 3 3 3 3 3 3 4 1 5 1 6 78.0 0.461538461538 50.0 0.92 0.428 0.523333333333 0.029608 0.314432 0.009616 0.000666060646752 -0.000456078217011 0.00329618108893 0.000712492106432 6.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 13.0 6.0 1.0 0.0526315789474 0.0 2.0 1.0 0.0 0.923076923077 0.641025641026 0.666666666667 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.166666666667 0.333333333333 0.0 0.5 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 0.5 0.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.330181480315 0.390277785099 1.04271429664 0.520370380132 3.55033911784 1.62985781862 0.650462975165 3.77958006924 2.34758731973 0.780555570198 5.39313883648 6.08016828854 3.19590279997 0.91064816523 4 2 3 2 5 2 4 3 3 2 6 3 1 3 2 7 1 11 1 4 9 4 10 3 10 3 10 4 10 3 10 4 11 6 3 0 169.0 1.0 66.0 1.21212121212 0.421717171717 0.454545454545 0.18176252887 0.202562818265 -0.0642374154771 0.039448883935 0.0163917721369 -0.0283167692405 0.0397469803192 13.0 0.692307692308 0.307692307692 0.0 1.23076923077 0.923076923077 0.615384615385 0.923076923077 0.307692307692 0.0 0.0 13.0 2.0 9.0 0.15625 1.0 2.0 1.0 0.0 0.923076923077 0.390532544379 0.111111111111 0.777777777778 0.777777777778 0.333333333333 0.555555555556 0.555555555556 0.333333333333 0.75 0.0 0.666666666667 0.0 0.25 0.666666666667 0.583333333333 0.0 0.0625 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.25 1.0 1.0 1.0 1.0 0.75 0.25 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 0.25 0.0 0.5 0.0 0.0 0.5 1.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.5 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.5 1.0 0.75 1.0 0.5 0.0 0.0 0.0 0.25 0.0 0.75 1.0 0.25 0.0 0.0 0.0 0.0 0.280362262323 0.495426164839 1.21729464323 0.660568219785 3.67927351885 1.8695723187 0.825710274731 4.10341831494 2.66103160003 0.990852329678 5.84068632785 6.47010586816 3.59167248721 1.15599438462 1 1 1 1 4 4 2 5 3 3 38 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 154.0 0.318181818182 64.0 1.109375 0.4296875 0.588541666667 0.0272483825684 0.713558197021 0.036304473877 -2.86549329758e-05 -0.00968520343304 0.00336502492428 -0.272065535188 7.0 1.0 0.0454545454545 1.14285714286 1.14285714286 0.571428571429 0.0 0.181818181818 0.0 0.0 0.0 22.0 4.0 1.0 0.2 0.0 3.0 1.0 0.0 0.954545454545 0.415584415584 0.2 0.333333333333 0.0 0.166666666667 0.7 0.333333333333 0.6 0.75 0.6 0.25 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.666666666667 0.5 0.0 0.0 1.0 0.5 0.666666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.333333333333 0.0 0.333333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.423830951774 0.36171399786 0.947960529816 0.48228533048 3.33783142843 1.47599766186 0.6028566631 3.40951814656 2.12045359373 0.72342799572 4.70172850704 5.48167981596 2.88132832544 0.84399932834 3 12 2 3 2 8 1 3 5 4 3 3 5 3 4 3 5 3 4 3 5 3 5 2 5 2 12 2 37 2 13 2 12 9 6 12 3 13 1 5 6 8 7 3 1 3 9 2 1 4 8 2 1 4 7 1 5 4 12 1 11 0 330.0 0.681818181818 129.0 1.04651162791 0.449058693245 0.464747139166 0.140760026254 0.340096772285 -0.0496429617891 0.010308769127 0.00597092370044 0.0074724908371 -0.0333591944273 15.0 1.26666666667 0.5 0.533333333333 1.6 1.06666666667 1.06666666667 0.727272727273 0.363636363636 0.181818181818 0.727272727273 22.0 7.0 9.0 0.2 4.0 2.0 0.0 0.0 0.954545454545 0.390909090909 0.466666666667 0.222222222222 0.666666666667 0.722222222222 0.45 0.125 0.75 0.291666666667 0.7 0.25 0.55 0.0 0.6 0.0416666666667 0.45 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.25 1.0 0.5 0.166666666667 0.75 1.0 1.0 0.5 1.0 0.5 0.333333333333 0.166666666667 0.75 1.0 0.333333333333 0.666666666667 0.5 0.0 0.0 0.0 0.5 0.666666666667 0.0 0.166666666667 1.0 0.0 0.166666666667 0.0 0.5 0.666666666667 0.0 0.0 1.0 1.0 0.833333333333 0.0 0.25 0.666666666667 0.0 0.0 1.0 0.666666666667 0.166666666667 0.0 0.0 1.0 0.666666666667 0.166666666667 1.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.266835184497 0.457698731718 1.17806996843 0.610264975625 3.72081815393 1.82746558104 0.762831219531 4.1239240323 2.61881244185 0.915397463437 5.93795356279 6.56720822655 3.55211055086 1.06796370734 4 6 6 1 3 4 3 3 3 18 1 5 1 2 1 1 1 1 1 3 10 3 10 3 10 3 10 3 8 1 2 3 5 3 2 4 4 3 4 7 3 0 169.0 1.0 77.0 1.15584415584 0.424242424242 0.465367965368 0.176819638449 0.201163990336 -0.0249773838912 0.0159730248789 0.0206100669951 0.00345732962157 0.0288799617408 13.0 0.923076923077 0.615384615385 0.0 1.53846153846 1.23076923077 0.923076923077 0.615384615385 0.923076923077 0.0 0.923076923077 13.0 6.0 16.0 0.102564102564 1.0 3.0 1.0 0.0 0.923076923077 0.455621301775 0.222222222222 1.0 1.0 0.583333333333 0.444444444444 0.555555555556 0.0 0.5 0.777777777778 0.555555555556 0.0 0.25 0.583333333333 0.416666666667 0.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 0.5 0.0 0.0 0.5 1.0 1.0 0.0 1.0 0.25 0.0 0.0 0.0 0.75 1.0 0.5 1.0 0.5 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.5 1.0 1.0 0.25 0.0 0.0 0.5 0.75 0.0 0.5 0.5 0.25 0.0 0.0 0.5 0.25 0.275273742484 0.540036729274 1.28305093688 0.720048972365 3.70280679784 1.95568989892 0.900061215457 4.17416508898 2.76907935209 1.08007345855 5.86381553426 6.50912596352 3.72321929638 1.26008570164 0 2 1 2 10 6 10 4 12 3 12 3 12 3 12 3 12 3 12 3 12 3 2 4 6 4 4 2 5 4 5 2 4 3 6 3 2 4 6 3 2 3 7 3 3 2 7 3 3 2 8 1 5 1 8 2 3 3 6 3 2 4 6 9 5 11 3 6 330.0 0.681818181818 117.0 1.06837606838 0.41514041514 0.584045584046 0.168008126807 0.366629141996 0.0978032770713 0.0403874515891 -0.0375312224002 0.0324580032063 -0.0704702246182 15.0 0.733333333333 0.636363636364 1.06666666667 0.8 0.266666666667 0.533333333333 0.181818181818 0.181818181818 0.909090909091 0.909090909091 22.0 3.0 4.0 0.255813953488 1.0 0.0 2.0 0.0 0.954545454545 0.354545454545 0.6 0.333333333333 0.466666666667 0.555555555556 0.55 0.541666666667 0.45 0.458333333333 0.0 0.208333333333 0.0 0.125 0.0 0.0416666666667 0.7 0.75 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.75 0.666666666667 0.5 0.5 0.5 0.833333333333 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.666666666667 1.0 0.25 0.0 0.0 0.166666666667 0.25 0.0 0.0 0.166666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.166666666667 1.0 1.0 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.25 0.5 0.333333333333 1.0 0.300903812091 0.452125536092 1.15028401553 0.602834048123 3.6444868087 1.78001124904 0.753542560154 4.00731175612 2.54660097441 0.904251072184 5.74036283682 6.37935962747 3.45005319162 1.05495958421 2 1 1 2 1 6 2 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 2 5 3 3 4 2 5 2 5 1 6 1 6 2 4 3 4 4 3 4 1 7 3 2 2 0 161.0 0.304347826087 76.0 1.03947368421 0.589912280702 0.476076555024 0.022313292754 0.663945181513 -0.00249671963843 -0.00153944008106 -0.0226276079008 -0.000495824735023 0.0869098847367 7.0 1.0 0.0434782608696 0.571428571429 0.571428571429 0.0 0.571428571429 0.173913043478 0.0 0.0 0.0 23.0 2.0 10.0 0.0571428571429 0.0 6.0 1.0 0.0 0.95652173913 0.472049689441 0.2 0.0 0.0 0.166666666667 0.6 0.0 0.0833333333333 0.416666666667 0.9 1.0 0.833333333333 1.0 0.5 0.583333333333 0.25 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.333333333333 0.0 0.666666666667 0.666666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.333333333333 0.666666666667 0.0 0.0 0.0 0.333333333333 0.333333333333 0.0 0.0 0.333333333333 0.366626350843 0.373879154804 0.99338710331 0.498505539738 3.44735529431 1.55103485637 0.623131924673 3.58686770337 2.23240300032 0.747758309607 5.01488347335 5.76488780748 3.03749153517 0.872384694542 7 3 1 1 11 3 1 4 9 2 4 3 8 3 5 2 8 3 5 3 7 2 6 3 7 2 7 1 7 3 7 1 7 3 6 3 4 5 5 7 1 5 5 6 3 4 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 7 1 7 2 16 2 16 2 16 3 3 1 11 3 2 2 12 6 14 1 3 0 414.0 0.782608695652 123.0 1.10569105691 0.509325681492 0.460827790096 0.181218754484 0.28757025623 0.0679360749586 -0.018312163853 0.0484077907561 0.0224270427997 0.0231049315166 18.0 0.388888888889 0.826086956522 0.0 0.0 0.444444444444 1.11111111111 0.869565217391 0.869565217391 0.869565217391 0.347826086957 23.0 5.0 11.0 0.294117647059 2.0 1.0 2.0 0.0 0.95652173913 0.297101449275 0.1 0.583333333333 0.5 0.0 0.44 0.2 0.166666666667 0.0 0.65 0.5 0.541666666667 0.375 0.04 0.3 0.166666666667 0.366666666667 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 0.666666666667 1.0 1.0 0.833333333333 0.0 0.0 0.25 1.0 0.5 0.5 0.5 0.333333333333 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.166666666667 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.75 1.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.0 0.166666666667 0.166666666667 0.833333333333 0.5 0.333333333333 0.166666666667 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.111111111111 0.555555555556 0.268665871773 0.41842688606 1.11857463756 0.557902514747 3.69406989145 1.7486383737 0.697378143434 4.05631088515 2.51887014055 0.836853772121 5.91803685821 6.52604356804 3.4292699381 0.976329400808 4 4 7 6 3 4 3 3 2 3 4 3 9 4 8 4 5 1 1 5 3 4 1 4 1 4 4 3 1 4 4 3 1 3 4 9 3 5 1 5 1 5 2 2 5 2 1 0 168.0 0.857142857143 90.0 1.02222222222 0.526262626263 0.54358974359 0.127035665295 0.171061728395 0.00398353909465 -0.0118222368064 -0.00412140066773 0.0116569237332 -0.0179735360058 12.0 0.916666666667 0.714285714286 1.0 2.0 0.666666666667 0.0 0.285714285714 0.285714285714 0.857142857143 0.857142857143 14.0 3.0 9.0 0.305555555556 1.0 3.0 2.0 0.0 0.928571428571 0.535714285714 0.333333333333 0.25 0.777777777778 0.75 0.666666666667 0.0833333333333 0.555555555556 0.416666666667 0.777777777778 0.75 0.444444444444 0.5 0.111111111111 0.583333333333 0.666666666667 0.916666666667 0.0 0.5 0.5 0.0 0.0 1.0 1.0 0.0 0.0 0.5 0.5 0.0 0.5 1.0 1.0 0.75 0.0 1.0 0.0 0.0 1.0 1.0 0.5 1.0 1.0 0.5 0.0 0.25 1.0 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 0.5 1.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.25 0.5 0.5 0.5 1.0 0.75 0.264191498177 0.473529308932 1.19698570339 0.631372411909 3.71259927397 1.84974043641 0.789215514886 4.11934142811 2.6438984923 0.947058617863 5.87721134542 6.52724842458 3.57945987106 1.10490172084 2 3 3 5 2 6 1 6 2 5 3 4 3 4 2 4 3 4 1 5 2 4 3 0 77.0 0.636363636364 50.0 0.88 0.553333333333 0.488 0.051552 0.189312 -0.020832 -0.00109534800204 -0.0179989335962 0.00358707916185 0.0126977823419 7.0 0.285714285714 0.0 0.0 0.571428571429 0.0 0.0 0.0 0.0 0.0 0.0 11.0 1.0 3.0 0.357142857143 0.0 3.0 1.0 0.0 0.909090909091 0.649350649351 0.0 0.0 0.0 0.666666666667 0.75 0.833333333333 0.166666666667 0.833333333333 1.0 1.0 1.0 0.833333333333 0.25 1.0 0.833333333333 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.0 0.0 0.312832387409 0.39116349999 1.05774892607 0.52155133332 3.60229040374 1.65730965306 0.65193916665 3.87561718481 2.39091977823 0.78232699998 5.60337894368 6.25370035662 3.2585793016 0.91271483331 6 10 9 6 2 7 4 4 7 5 3 4 9 4 2 4 11 3 2 3 13 2 1 4 13 7 15 5 15 5 15 5 15 5 15 5 15 5 16 4 16 5 16 4 12 2 3 3 12 2 3 4 10 2 6 8 2 3 8 11 10 6 1 2 4 0 440.0 0.909090909091 149.0 0.93288590604 0.419992935359 0.482901885586 0.247959082803 0.343409768409 -0.0243492266658 0.0642275255415 0.0677604954782 -0.022519157039 0.0149705873644 20.0 0.75 0.5 0.0 1.0 1.0 1.0 0.727272727273 0.363636363636 0.0 0.727272727273 22.0 2.0 11.0 0.4 1.0 2.0 1.0 0.0 0.954545454545 0.338636363636 0.24 0.9 0.92 0.233333333333 0.6 0.0 0.04 0.533333333333 0.32 0.0 0.0 0.4 0.72 0.133333333333 0.0 0.4 0.0 0.0 0.5 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.777777777778 0.0 0.75 0.833333333333 0.0 0.0 0.0 0.166666666667 0.666666666667 0.5 1.0 0.111111111111 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.833333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.75 0.5 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.5 1.0 0.444444444444 0.0 0.0 0.0 0.666666666667 0.111111111111 0.278010485895 0.556338005885 1.29816047952 0.741784007847 3.6779611997 1.9704358942 0.927230009808 4.16112834093 2.78180542679 1.11267601177 5.83125626473 6.46385979758 3.7322690773 1.29812201373 2 2 3 4 1 6 1 5 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 4 1 6 78.0 0.461538461538 47.0 1.06382978723 0.536170212766 0.505319148936 0.0326902516783 0.328116120705 -0.00635697292507 -0.00068226233763 -0.00764812971682 0.000734394545693 0.0298593797991 6.0 0.666666666667 0.0 0.666666666667 0.666666666667 0.0 0.666666666667 0.0 0.0 0.0 0.0 13.0 4.0 4.0 0.136363636364 0.0 4.0 1.0 0.0 0.923076923077 0.602564102564 0.333333333333 0.0 0.0 0.25 0.833333333333 0.666666666667 0.5 0.875 1.0 1.0 1.0 1.0 0.5 0.666666666667 0.5 0.375 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.5 0.332248137758 0.386719471782 1.03583721869 0.515625962376 3.54234164209 1.61992855855 0.64453245297 3.76301357268 2.3340727125 0.773438943565 5.36573207099 6.05728017167 3.17826968052 0.902345434159 2 7 4 2 1 4 3 2 3 4 2 2 4 2 3 3 8 7 8 3 9 4 2 1 5 3 1 2 5 7 4 3 1 3 3 4 3 7 2 0 143.0 0.846153846154 70.0 1.25714285714 0.505714285714 0.511904761905 0.117096209913 0.234402332362 0.00539358600583 -0.00947337897076 -0.00205543478881 0.0115615095593 -0.00752381724343 11.0 1.18181818182 0.538461538462 0.363636363636 1.09090909091 1.45454545455 0.727272727273 0.615384615385 0.307692307692 0.307692307692 0.923076923077 13.0 5.0 11.0 0.151515151515 1.0 3.0 1.0 0.0 0.923076923077 0.48951048951 0.166666666667 0.5 0.166666666667 0.75 0.666666666667 0.666666666667 0.0 0.416666666667 0.888888888889 0.444444444444 0.666666666667 0.583333333333 0.444444444444 0.111111111111 0.444444444444 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.5 1.0 1.0 0.0 1.0 1.0 0.5 1.0 0.75 0.5 1.0 0.0 0.0 0.25 0.75 1.0 0.0 0.0 0.5 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.5 0.5 0.0 0.0 0.5 1.0 1.0 0.5 0.5 1.0 0.5 0.5 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 0.0 0.25 0.0 0.0 0.25 0.5 0.75 0.25 0.279334462854 0.486233418275 1.20344422752 0.648311224366 3.67329819274 1.85126341137 0.810389030458 4.05819253988 2.63786584601 0.97246683655 5.74051058827 6.39160577272 3.56325153143 1.13454464264 4 8 5 2 2 4 3 3 4 4 1 11 2 3 2 1 6 3 10 3 10 3 10 4 10 3 10 5 5 1 3 4 4 2 5 7 2 0 169.0 1.0 71.0 1.21126760563 0.430751173709 0.460093896714 0.178133670102 0.23719863318 -0.0480566397792 0.0245866398974 0.0337868444677 -0.00675967785079 0.0289477109322 13.0 1.0 0.384615384615 0.0 1.23076923077 1.84615384615 0.923076923077 0.615384615385 0.307692307692 0.0 0.615384615385 13.0 6.0 13.0 0.0277777777778 1.0 3.0 1.0 0.0 0.923076923077 0.420118343195 0.111111111111 0.777777777778 1.0 0.416666666667 0.666666666667 0.444444444444 0.111111111111 0.75 0.444444444444 0.444444444444 0.0 0.25 0.833333333333 0.25 0.0 0.3125 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.25 1.0 1.0 1.0 1.0 1.0 0.25 0.0 0.5 1.0 0.5 0.0 1.0 1.0 0.5 1.0 0.75 1.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 1.0 0.25 0.0 0.0 0.0 0.5 1.0 0.5 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.75 0.5 0.75 0.5 0.0 0.0 0.0 0.25 0.25 0.274628000719 0.54239209602 1.28090463485 0.723189461359 3.68298133151 1.94970277699 0.903986826699 4.15589541689 2.75792971251 1.08478419204 5.85083231162 6.47950464148 3.7055854414 1.26558155738 1 1 1 1 1 2 1 1 1 1 2 3 1 1 1 1 1 1 1 6 1 8 1 10 7 4 5 6 8 4 7 4 8 3 9 2 9 3 20 3 20 4 19 3 19 5 18 5 18 4 19 5 19 4 19 3 20 4 19 3 20 4 18 5 17 6 17 6 13 12 7 0 506.0 1.04545454545 138.0 1.04347826087 0.491436100132 0.423050379572 0.173550800739 0.399713554271 -0.0131282552381 -0.00286512934289 -0.00646556528476 -0.0830490960158 0.0877714931171 23.0 0.608695652174 0.772727272727 0.173913043478 1.04347826087 1.21739130435 0.0 2.90909090909 0.181818181818 0.0 0.0 22.0 12.0 16.0 0.0161290322581 3.0 2.0 1.0 0.0 0.954545454545 0.272727272727 0.56 0.0333333333333 0.0 0.0333333333333 0.4 0.222222222222 0.233333333333 0.444444444444 0.533333333333 0.416666666667 0.433333333333 0.527777777778 0.533333333333 0.0 0.0 0.0 0.75 1.0 0.166666666667 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.833333333333 0.333333333333 0.333333333333 0.555555555556 0.666666666667 0.333333333333 0.444444444444 1.0 0.666666666667 0.888888888889 0.777777777778 0.888888888889 0.833333333333 0.888888888889 0.888888888889 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.222222222222 0.833333333333 0.111111111111 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.397118578624 0.469561285276 1.11660738835 0.626081713701 3.43102071086 1.7023377821 0.782602142126 3.67401085473 2.41069959451 0.939122570552 5.0259825248 5.76020913412 3.24169282558 1.09564299898 0 6 4 5 5 5 6 3 7 3 6 2 7 2 7 2 6 3 7 3 5 5 4 5 3 6 117.0 0.692307692308 50.0 1.1 0.605 0.5 0.065888 0.3696 0.0904 -0.00920537629278 -0.0208262746049 -0.0122007032453 0.0 9.0 0.444444444444 0.0 0.0 0.444444444444 0.888888888889 0.444444444444 0.0 0.0 0.0 0.0 13.0 1.0 3.0 0.166666666667 0.0 1.0 1.0 0.0 0.923076923077 0.42735042735 0.5 0.0 0.0 0.0 1.0 0.0 0.0 0.125 1.0 0.666666666667 0.666666666667 0.875 0.111111111111 0.444444444444 0.333333333333 0.916666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.0 0.75 1.0 0.323113421943 0.445260499439 1.12485200621 0.593680665919 3.58344195701 1.73804709544 0.742100832399 3.88729693043 2.48403501975 0.890520998878 5.52762375964 6.17231864796 3.36281577913 1.03894116536 6 1 8 6 4 3 3 3 2 3 4 3 3 1 5 3 10 3 8 4 6 2 1 3 4 3 2 2 4 3 3 2 3 3 4 3 2 3 3 5 1 11 2 4 2 4 168.0 0.857142857143 78.0 1.17948717949 0.555944055944 0.586785009862 0.122939108886 0.214039768034 0.0107406564507 -0.0125814065484 -0.00809398058191 0.00620471581159 -0.0290423740822 12.0 1.0 0.642857142857 0.666666666667 1.66666666667 1.33333333333 0.333333333333 0.285714285714 0.571428571429 0.857142857143 0.571428571429 14.0 5.0 5.0 0.444444444444 0.0 3.0 2.0 0.0 0.928571428571 0.464285714286 0.222222222222 0.333333333333 0.111111111111 0.583333333333 0.444444444444 0.0 0.666666666667 0.666666666667 0.666666666667 0.583333333333 0.444444444444 0.583333333333 0.111111111111 0.5 0.444444444444 0.916666666667 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.75 0.0 0.0 0.25 1.0 0.75 0.0 1.0 0.0 0.0 0.0 1.0 1.0 1.0 0.0 0.5 0.0 0.0 0.5 0.75 0.0 1.0 1.0 0.5 0.0 0.0 1.0 0.0 0.0 0.5 0.0 1.0 1.0 0.75 0.5 0.5 0.75 0.75 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 0.5 0.0 0.75 1.0 0.274439233855 0.466445984165 1.18279869415 0.621927978887 3.69481461315 1.82904256473 0.777409973609 4.08726980102 2.61550411412 0.932891968331 5.83529484331 6.48554140257 3.54218334232 1.08837396305 7 3 1 1 11 3 1 4 9 2 4 3 8 3 5 2 8 3 5 3 7 2 6 3 7 2 7 1 7 3 7 1 7 3 6 3 4 5 5 7 1 5 5 6 3 4 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 7 1 7 2 16 2 7 3 6 2 7 4 5 3 3 1 2 4 5 3 2 2 1 6 5 6 14 1 3 0 414.0 0.782608695652 140.0 1.12142857143 0.471848739496 0.513961038961 0.1623946793 0.293662900875 0.0140856413994 0.00052770968784 0.0126677732755 0.0220323622586 -0.00329700051584 18.0 0.722222222222 1.0 0.666666666667 0.666666666667 0.444444444444 1.11111111111 0.869565217391 0.869565217391 0.869565217391 1.04347826087 23.0 5.0 11.0 0.296296296296 4.0 1.0 2.0 0.0 0.95652173913 0.338164251208 0.1 0.583333333333 0.5 0.375 0.44 0.2 0.166666666667 0.266666666667 0.65 0.5 0.541666666667 0.375 0.04 0.3 0.166666666667 0.366666666667 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.0 0.166666666667 0.0 0.333333333333 0.666666666667 1.0 1.0 0.833333333333 0.666666666667 0.666666666667 0.25 1.0 0.5 0.5 0.5 0.333333333333 0.5 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.111111111111 0.75 0.166666666667 0.0 0.333333333333 0.166666666667 0.0 0.0 0.0 0.75 1.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.0 0.166666666667 0.166666666667 0.833333333333 0.5 0.333333333333 0.166666666667 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.111111111111 0.555555555556 0.263943138596 0.444068114484 1.16157395959 0.592090819311 3.72711120697 1.80789441217 0.740113524139 4.12809047905 2.59658564981 0.888136228967 5.99457570527 6.60286119301 3.52764767253 1.0361589338 0 24 2 6 1 2 3 5 8 4 8 4 8 4 8 4 8 3 9 4 8 4 7 6 6 6 4 0 156.0 0.923076923077 76.0 0.763157894737 0.444976076555 0.404605263158 0.0770702726345 0.22635178233 -0.0230536521359 0.0116905273261 6.44192571521e-05 -0.0230265837014 0.045019674297 12.0 0.25 0.0769230769231 0.333333333333 0.0 0.666666666667 0.0 0.307692307692 0.0 0.0 0.0 13.0 4.0 0.0 0.0 0.0 7.0 1.0 0.0 0.923076923077 0.487179487179 0.777777777778 0.111111111111 0.0 0.166666666667 1.0 1.0 1.0 1.0 0.888888888889 0.333333333333 0.222222222222 0.5 0.888888888889 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.5 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.0 0.354189901151 0.453712372741 1.11991455857 0.604949830321 3.52266716186 1.72174615337 0.756187287902 3.81016093709 2.45231893024 0.907424745482 5.36102885351 6.02933676792 3.31163288916 1.05866220306 22 1 1 3 1 2 1 2 18 9 1 9 10 9 3 9 8 9 5 8 8 8 7 8 7 8 7 3 1 5 5 2 2 5 7 2 1 6 5 2 2 5 7 2 2 5 5 2 2 4 8 1 3 5 5 1 4 3 8 1 4 4 4 2 4 3 8 1 4 4 4 1 4 4 7 3 4 7 5 4 7 3 4 7 5 4 6 4 5 6 5 5 6 3 5 6 5 5 6 3 6 5 5 5 6 3 6 5 5 4 7 3 7 4 5 4 6 5 6 3 6 4 6 5 6 3 6 4 4 9 5 1 3 10 24 5 3 0 690.0 1.30434782609 300.0 0.76 0.521379310345 0.488181818182 0.228796444444 0.140308 -0.0142737777778 -0.012854077126 0.00598406053887 -0.0054981235491 0.00466684693352 30.0 0.566666666667 1.95652173913 0.8 0.4 0.533333333333 0.533333333333 1.04347826087 2.26086956522 1.91304347826 1.73913043478 23.0 9.0 13.0 0.25 5.0 4.0 4.0 0.0 0.95652173913 0.434782608696 0.485714285714 0.285714285714 0.404761904762 0.547619047619 0.275 0.625 0.520833333333 0.25 0.257142857143 0.285714285714 0.261904761905 0.238095238095 0.8 0.520833333333 0.5625 0.5625 0.333333333333 0.333333333333 0.0 0.0 0.0 0.111111111111 0.111111111111 0.444444444444 0.0 1.0 0.666666666667 0.333333333333 0.583333333333 0.75 0.833333333333 0.666666666667 0.0 0.916666666667 0.916666666667 0.666666666667 0.333333333333 0.0 0.0 0.166666666667 0.0 0.0 0.416666666667 0.5 0.833333333333 0.916666666667 0.583333333333 0.25 0.0 0.0 0.0 0.111111111111 0.555555555556 0.666666666667 0.555555555556 0.111111111111 0.125 0.666666666667 0.583333333333 0.333333333333 0.0 0.0 0.0 0.333333333333 0.875 1.0 1.0 0.833333333333 1.0 1.0 1.0 1.0 0.875 0.5 0.25 0.0 0.0 0.25 0.0 0.25 0.270936955979 0.443772262132 1.14847788212 0.591696349509 3.67948017822 1.78358581054 0.739620436886 4.04484210356 2.5578891221 0.887544524264 5.80751425138 6.45376093252 3.47138781682 1.03546861164 4 9 6 2 4 4 4 3 7 4 2 2 9 3 1 3 9 3 1 3 9 7 9 7 9 3 1 4 8 3 2 3 7 4 2 5 5 3 4 4 4 4 6 7 5 0 208.0 1.23076923077 90.0 1.11111111111 0.502222222222 0.508333333333 0.281283950617 0.165197530864 -0.017012345679 -0.0152920633605 0.000812388697114 -0.0013587816931 -0.00596694466148 16.0 0.5625 0.846153846154 0.25 1.0 1.0 0.0 0.615384615385 0.923076923077 0.923076923077 0.923076923077 13.0 3.0 11.0 0.205128205128 0.0 2.0 2.0 0.0 0.923076923077 0.432692307692 0.333333333333 0.666666666667 0.833333333333 0.5 0.416666666667 0.0 0.0 0.5 0.666666666667 0.0 0.0 0.4375 0.416666666667 0.833333333333 0.833333333333 0.4375 0.0 0.25 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.75 0.5 0.5 0.5 1.0 1.0 0.5 1.0 0.25 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.25 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.75 0.0 0.0 0.0 0.0 0.5 0.75 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.5 0.0 0.25 0.5 0.75 0.75 0.5 0.25 0.0 0.146703599078 0.530297871904 1.32176947138 0.707063829205 3.89669558906 2.03640286558 0.883829786506 4.44492420123 2.90471267032 1.06059574381 6.35847313604 6.98265835416 3.92669888561 1.23736170111 2 2 13 2 12 9 6 12 3 13 1 5 6 8 7 3 1 3 9 2 1 4 8 2 1 4 7 1 5 4 12 1 11 0 180.0 1.25 75.0 1.0 0.399047619048 0.453333333333 0.247144296296 0.0926198518519 -0.013229037037 0.0613403128851 -0.015121705528 0.0147635729607 0.0109997213498 15.0 0.266666666667 0.416666666667 0.0 0.8 0.0 0.266666666667 0.0 0.333333333333 1.0 0.333333333333 12.0 3.0 10.0 0.161290322581 2.0 2.0 2.0 0.0 0.916666666667 0.416666666667 0.444444444444 0.777777777778 1.0 0.444444444444 0.5 0.833333333333 0.166666666667 0.416666666667 0.25 0.666666666667 0.0 0.0 0.0 0.75 0.583333333333 0.0833333333333 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.5 0.75 1.0 1.0 1.0 1.0 1.0 0.25 0.5 0.75 1.0 1.0 0.5 0.25 0.5 0.75 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.25 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.25 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 0.5 0.5 0.0 0.0 0.0 0.0 0.75 0.5 0.5 0.0 0.0 0.26425529177 0.426854357539 1.13061589775 0.569139143385 3.69708725978 1.76419284366 0.711423929231 4.05965244943 2.53813897816 0.853708715077 5.88162967765 6.5113602408 3.45245430126 0.995993500923 9 4 11 4 12 2 13 2 14 1 14 1 14 1 13 3 8 1 2 4 5 1 1 8 4 5 2 4 3 4 5 3 2 4 6 3 2 4 6 3 2 4 6 3 2 3 7 3 2 4 6 3 3 4 5 3 3 4 5 4 2 4 5 5 3 12 315.0 0.714285714286 118.0 0.966101694915 0.532082324455 0.630084745763 0.155931838211 0.264311954971 -0.0448067962158 -0.0233071540781 0.0416690772831 0.0163019396096 -0.078966322716 15.0 0.666666666667 0.571428571429 0.0 0.8 1.06666666667 0.266666666667 0.0 0.380952380952 0.952380952381 0.952380952381 21.0 7.0 7.0 0.204081632653 0.0 2.0 2.0 0.0 0.952380952381 0.374603174603 0.0 0.0 0.8 0.666666666667 0.0 0.2 0.45 0.458333333333 0.3 0.35 0.3 0.375 0.35 0.4 0.5 0.708333333333 0.0 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.666666666667 0.0 0.0 0.0 0.166666666667 0.833333333333 0.5 0.5 1.0 0.0 0.0 0.0 0.5 0.333333333333 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.333333333333 1.0 0.333333333333 0.0 0.833333333333 0.666666666667 0.5 0.5 0.666666666667 1.0 0.5 0.5 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 0.270144922321 0.424293284946 1.12448942208 0.565724379929 3.68691833898 1.75483992894 0.707155474911 4.06444277705 2.52488169634 0.848586569893 5.95864567935 6.53800450072 3.43461472428 0.990017664875 0 7 16 21 10 10 1 12 9 7 7 9 10 6 8 8 9 7 8 4 1 4 8 7 8 3 2 4 8 1 2 4 8 3 3 4 6 2 2 3 9 3 3 4 5 2 3 4 8 3 3 4 5 2 3 4 8 3 4 4 4 2 3 3 9 3 5 3 3 2 4 4 8 3 5 4 2 1 5 3 9 3 5 4 1 2 5 4 8 4 5 6 5 4 9 3 5 5 5 5 9 3 6 4 6 4 10 1 7 4 6 3 11 2 7 2 7 4 5 1 3 3 7 2 6 5 4 11 4 2 4 9 2 8 1 1 6 1 3 7 1 2 2 3 30 1 29 0 768.0 1.33333333333 310.0 0.812903225806 0.513943808533 0.442356241234 0.264927964822 0.152097747642 0.00285804437582 -0.00272034243522 -0.00633676010028 -0.00584683327905 0.00827534728673 32.0 0.71875 2.08333333333 0.75 0.625 0.5 1.0 1.16666666667 3.0 2.33333333333 1.83333333333 24.0 5.0 17.0 0.25 4.0 1.0 4.0 0.0 0.958333333333 0.403645833333 0.666666666667 0.375 0.291666666667 0.458333333333 0.5 0.479166666667 0.3125 0.166666666667 0.208333333333 0.229166666667 0.375 0.25 0.75 0.458333333333 0.479166666667 0.458333333333 0.916666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.583333333333 0.916666666667 0.833333333333 0.75 0.75 0.75 0.416666666667 0.583333333333 0.333333333333 0.666666666667 0.916666666667 0.333333333333 0.0833333333333 0.0833333333333 0.166666666667 0.5 0.166666666667 0.0833333333333 0.333333333333 0.666666666667 0.833333333333 0.666666666667 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0833333333333 0.75 0.75 0.5 0.0833333333333 0.416666666667 0.416666666667 0.416666666667 0.416666666667 0.0 0.0 0.166666666667 0.25 1.0 1.0 0.75 0.75 0.75 0.833333333333 0.916666666667 0.333333333333 0.75 0.25 0.166666666667 0.166666666667 0.166666666667 0.166666666667 0.416666666667 0.166666666667 0.265201983459 0.44859714375 1.15141269701 0.598129525 3.66636132594 1.78506785376 0.74766190625 4.02697441769 2.55704380352 0.897194287501 5.75978462421 6.41305587051 3.46734054628 1.04672666875 8 3 7 2 3 6 4 4 4 5 2 6 4 4 3 5 4 4 4 3 6 3 4 3 6 4 3 3 6 3 4 3 6 3 4 3 6 3 4 2 6 4 3 3 7 4 2 4 5 5 1 6 3 7 224.0 1.14285714286 105.0 1.00952380952 0.502222222222 0.528937728938 0.202642479214 0.165024079473 0.00833862433862 -0.010095739119 0.0012619378842 0.0132885506031 0.00400958064815 16.0 0.5 0.928571428571 0.5 0.5 0.75 0.25 0.571428571429 0.857142857143 0.857142857143 0.857142857143 14.0 2.0 4.0 0.1875 0.0 0.0 2.0 0.0 0.928571428571 0.46875 0.416666666667 0.6875 0.5 0.75 0.166666666667 0.375 0.25 0.1875 0.833333333333 0.375 0.25 0.5 0.25 0.5625 0.5 0.75 0.0 0.25 0.75 0.0 0.0 0.0 0.25 0.75 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 1.0 0.5 0.5 0.5 0.0 0.75 0.0 0.25 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.75 0.0 0.0 0.0 0.0 0.0 0.25 0.5 1.0 1.0 0.5 0.5 0.5 0.75 1.0 0.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.0 0.25 0.75 0.202145166449 0.510305207039 1.27319898146 0.680406942719 3.81451957619 1.96199375104 0.850508678399 4.31811985004 2.7989865303 1.02061041408 6.20515785389 6.81012869808 3.78417731924 1.19071214976 1 2 1 3 1 2 10 2 1 1 1 2 1 1 1 11 9 10 1 10 8 8 5 10 6 8 7 9 6 8 7 9 6 8 7 3 1 5 6 3 1 4 7 3 2 5 5 2 2 4 7 3 2 5 4 2 3 4 7 3 3 5 3 2 3 4 7 3 3 5 3 2 3 4 7 3 4 4 2 2 4 4 7 4 3 8 3 5 7 4 3 8 4 4 7 4 4 6 5 4 7 4 4 6 5 4 7 3 6 4 6 4 7 4 5 4 6 5 5 5 5 4 5 5 4 9 4 2 5 7 3 9 4 2 4 9 2 10 3 2 3 10 3 2 27 0 690.0 1.30434782609 349.0 0.661891117479 0.471396107104 0.480333420162 0.193849853591 0.127516749631 -0.00329025580243 0.00511814286746 -0.00196638563689 -0.000111196546118 0.00247482077951 30.0 0.533333333333 2.13043478261 0.666666666667 0.4 0.666666666667 0.4 1.73913043478 2.26086956522 1.91304347826 1.73913043478 23.0 7.0 17.0 0.26 3.0 4.0 4.0 0.0 0.95652173913 0.505797101449 0.771428571429 0.452380952381 0.52380952381 0.761904761905 0.5 0.625 0.520833333333 0.395833333333 0.428571428571 0.357142857143 0.333333333333 0.285714285714 0.625 0.5 0.5 0.541666666667 0.833333333333 0.333333333333 0.0 0.0 0.0 0.0 0.444444444444 0.888888888889 0.875 1.0 0.833333333333 0.75 0.916666666667 0.916666666667 1.0 0.666666666667 0.75 1.0 0.916666666667 0.583333333333 0.25 0.0 0.166666666667 0.416666666667 0.0 0.166666666667 0.333333333333 0.666666666667 0.916666666667 0.916666666667 0.666666666667 0.333333333333 0.0 0.0 0.0 0.333333333333 0.888888888889 0.555555555556 0.222222222222 0.0 0.5 0.916666666667 0.75 0.25 0.0833333333333 0.0 0.25 0.583333333333 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.75 0.0833333333333 0.0 0.0 0.0 0.0 0.166666666667 0.333333333333 0.266752120967 0.445309720327 1.14656040582 0.59374629377 3.66460235111 1.77870932731 0.742182867212 4.01769871917 2.54906177681 0.890619440655 5.74269462614 6.40072493846 3.45761775432 1.0390560141 2 2 3 4 2 4 2 3 4 2 28 3 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 132.0 0.272727272727 62.0 1.09677419355 0.554838709677 0.575268817204 0.0205095498641 0.732725487563 0.0174633278507 -0.0002603202747 -0.017138095211 0.00369051776654 -0.247936599953 6.0 1.0 0.0 0.0 1.33333333333 0.666666666667 0.666666666667 0.0 0.0 0.0 0.0 22.0 4.0 0.0 0.15 1.0 2.0 1.0 0.0 0.954545454545 0.469696969697 0.0 0.0 0.0 0.166666666667 0.8 0.25 0.6 0.666666666667 1.0 0.333333333333 1.0 1.0 0.2 0.166666666667 0.6 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.5 0.666666666667 0.0 0.333333333333 0.5 0.0 0.0 0.666666666667 1.0 1.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.333333333333 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.666666666667 0.417162095071 0.358966384256 0.94445218628 0.478621845675 3.33841320819 1.47170919573 0.598277307094 3.40090618492 2.11542379033 0.717932768513 4.68618873034 5.46745334276 2.87559597008 0.837588229931 1 3 5 6 5 5 5 4 5 4 6 3 6 4 5 3 6 3 6 3 5 4 6 4 4 5 3 7 126.0 0.642857142857 58.0 0.98275862069 0.558189655172 0.51724137931 0.0470960268974 0.324490549018 0.0545327811718 -0.00406363762388 -0.0176816389503 -0.00584025785808 0.00353634635502 9.0 0.444444444444 0.0 0.0 1.33333333333 0.0 0.444444444444 0.0 0.0 0.0 0.0 14.0 2.0 2.0 0.105263157895 0.0 1.0 1.0 0.0 0.928571428571 0.460317460317 0.5 0.0 0.0 0.0 1.0 0.25 0.0 0.5 0.666666666667 1.0 1.0 1.0 0.111111111111 0.416666666667 0.333333333333 0.666666666667 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.0 0.25 0.75 0.339327764442 0.405258541438 1.06101608577 0.540344721918 3.54406704535 1.65168970961 0.675430902397 3.78725451944 2.37253117442 0.810517082877 5.35390471343 6.0689741752 3.22354048019 0.945603263356 1 3 3 4 2 4 1 6 24.0 1.5 17.0 1.52941176471 0.482352941176 0.588235294118 0.104213311622 0.0728679014859 0.0091593730918 0.00386797874245 -0.00236086089911 0.0122398876873 -0.00580196811368 6.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.0 4.0 0.0 0.0 0.0 2.0 1.0 0.0 0.75 0.708333333333 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 0.5 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.307042027168 0.362964375463 1.02597576255 0.483952500618 3.62413666318 1.6212342419 0.604940625772 3.89209285628 2.35199853673 0.725928750927 5.70423066502 6.33755170512 3.21826864705 0.846916876081 3 1 2 1 6 1 1 5 5 2 2 4 3 2 4 4 2 1 5 3 9 3 8 5 5 7 3 3 3 3 2 4 3 2 3 3 3 5 1 3 3 17 2 2 4 3 2 0 168.0 0.857142857143 84.0 1.11904761905 0.480519480519 0.571428571429 0.111556527373 0.184037900875 0.0050615484289 -0.0108343985833 -0.00553648749696 0.0114321019189 -0.0251773851734 12.0 1.0 0.714285714286 1.0 2.0 0.333333333333 0.666666666667 0.857142857143 0.571428571429 0.571428571429 0.571428571429 14.0 3.0 14.0 0.205128205128 0.0 3.0 2.0 0.0 0.928571428571 0.5 0.333333333333 0.25 0.555555555556 0.916666666667 0.555555555556 0.0833333333333 0.555555555556 0.25 0.666666666667 1.0 0.777777777778 0.916666666667 0.0 0.166666666667 0.222222222222 0.666666666667 0.0 0.0 1.0 0.0 0.0 0.5 1.0 0.5 0.0 0.75 0.25 0.0 0.0 1.0 1.0 1.0 1.0 0.5 0.0 0.0 1.0 1.0 0.0 0.5 0.0 0.75 0.0 0.25 1.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.5 0.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.5 0.5 1.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.75 0.25 0.282513199011 0.450326384933 1.15611265645 0.60043517991 3.67533996794 1.7924392434 0.750543974888 4.04073044552 2.56768519948 0.900652769865 5.77719371092 6.43273830682 3.4818505247 1.05076156484 0 4 7 3 9 3 5 4 5 4 5 3 6 4 5 4 5 4 5 4 5 4 5 4 4 6 117.0 0.692307692308 51.0 1.01960784314 0.629901960784 0.535947712418 0.0545642324596 0.287777702392 0.0534937542876 -0.00951284559762 -0.0275515187266 -0.0169135975511 -0.0188832456487 9.0 0.333333333333 0.0 0.0 0.444444444444 0.444444444444 0.444444444444 0.0 0.0 0.0 0.0 13.0 1.0 3.0 0.263157894737 0.0 1.0 1.0 0.0 0.923076923077 0.435897435897 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.125 0.333333333333 1.0 1.0 1.0 0.222222222222 0.555555555556 0.666666666667 0.75 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.25 0.5 0.25 0.5 0.5 0.5 0.75 0.374821356346 0.38473770462 1.01279584208 0.51298360616 3.46584531561 1.57837745005 0.6412295077 3.65703377397 2.268912117 0.76947540924 5.18124564063 5.88601466944 3.08439984292 0.89772131078 2 2 1 3 12 8 11 8 10 8 10 9 10 2 2 4 10 2 2 4 10 2 3 3 10 2 3 4 9 2 4 4 8 2 4 4 3 1 4 2 4 5 2 1 3 3 5 7 3 3 5 6 5 2 6 5 5 2 6 5 5 2 6 4 6 2 7 3 5 3 8 2 2 9 5 1 3 9 5 1 3 6 1 1 10 0 396.0 0.818181818182 158.0 0.848101265823 0.472449739389 0.510247136829 0.123090921813 0.259180561781 0.00650633114216 0.0112853819596 -0.0401463821208 0.0238117188744 -0.00333668898896 18.0 0.333333333333 0.909090909091 0.666666666667 0.444444444444 0.0 0.0 0.181818181818 0.909090909091 1.09090909091 0.909090909091 22.0 4.0 8.0 0.181818181818 2.0 2.0 3.0 0.0 0.954545454545 0.39898989899 0.35 0.0 0.1 0.541666666667 0.92 0.466666666667 0.4 0.633333333333 0.4 0.791666666667 0.45 0.0416666666667 0.0 0.1 0.8 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 0.5 0.0 0.0 0.25 0.166666666667 0.166666666667 1.0 0.75 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 1.0 0.222222222222 0.0 0.0 0.0 0.0 0.777777777778 0.25 1.0 1.0 0.666666666667 0.25 0.0 0.0 0.0 0.0 0.166666666667 0.5 1.0 1.0 0.666666666667 0.166666666667 0.0 0.0 0.0 0.0 0.333333333333 1.0 1.0 0.833333333333 0.333333333333 0.0 0.0 0.0 0.111111111111 0.666666666667 0.666666666667 0.333333333333 0.0 0.275082343157 0.449278638119 1.16155867794 0.599038184159 3.70100128262 1.80352365605 0.748797730199 4.09093800733 2.5861187576 0.898557276239 5.90654340924 6.52838346657 3.50934398259 1.04831682228 0 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 91.0 0.538461538462 50.0 0.96 0.45 0.53 0.0354 0.340608 0.02656 -0.00033941125497 -0.0110539457518 0.00369731993747 -0.0154983324889 7.0 0.285714285714 0.0 0.571428571429 0.571428571429 0.0 0.0 0.0 0.0 0.0 0.0 13.0 4.0 1.0 0.047619047619 0.0 2.0 1.0 0.0 0.923076923077 0.549450549451 0.666666666667 0.0 0.0 0.25 1.0 0.5 0.5 0.875 0.833333333333 1.0 1.0 1.0 0.0 0.0 0.0 0.375 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 0.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.339451735783 0.407071805991 1.06172124203 0.542762407989 3.53764505857 1.65150082381 0.678453009986 3.77447841551 2.3710201141 0.814143611983 5.31785599749 6.04092616974 3.2202791129 0.94983421398 11 2 11 5 9 7 9 5 11 4 11 4 11 4 11 4 11 4 6 9 6 9 3 4 4 4 2 4 5 4 2 4 5 4 2 3 6 4 2 3 7 3 1 5 6 3 2 5 5 3 2 5 5 3 2 5 4 5 2 5 3 5 3 12 12 1 2 0 345.0 0.652173913043 151.0 0.76821192053 0.607852412488 0.563816977724 0.113843037557 0.252899329674 -0.0559671049632 -0.0211004004504 0.0230955867028 0.0153256373689 -0.040521040528 15.0 0.666666666667 0.434782608696 0.0 0.533333333333 1.33333333333 0.0 0.0 0.0 0.869565217391 0.695652173913 23.0 8.0 9.0 0.115384615385 0.0 2.0 2.0 0.0 0.95652173913 0.43768115942 0.0 0.0 0.666666666667 0.388888888889 0.0 0.166666666667 0.458333333333 0.708333333333 0.4 0.5 0.166666666667 0.25 0.75 0.75 0.75 0.791666666667 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.0 0.0 0.0 0.0 0.0 0.0 0.833333333333 1.0 1.0 0.166666666667 0.0 0.0 0.0 0.0 1.0 0.666666666667 1.0 0.666666666667 0.0 0.0 0.0 0.666666666667 0.166666666667 0.0 0.5 0.666666666667 0.0 0.166666666667 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.5 0.833333333333 0.5 0.833333333333 0.5 0.166666666667 0.166666666667 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.833333333333 0.25 0.666666666667 0.5 0.5 0.5 0.5 0.666666666667 0.666666666667 0.274272752523 0.408971106567 1.10273067513 0.545294808756 3.68193392983 1.7268107604 0.681618510945 4.02212909668 2.49024981226 0.817942213135 5.85361985516 6.47967644461 3.39304783072 0.954265915324 0 2 1 2 1 6 1 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 2 4 2 3 2 4 2 3 4 2 4 2 5 1 4 3 2 4 1 5 1 6 132.0 0.272727272727 76.0 0.960526315789 0.542105263158 0.494360902256 0.0200193176848 0.617024620936 -0.0063374763085 -0.000789204665333 -0.0170432532316 0.000104358096343 0.0383884241808 6.0 1.16666666667 0.0454545454545 0.666666666667 1.33333333333 0.0 0.666666666667 0.181818181818 0.0 0.0 0.0 22.0 8.0 5.0 0.151515151515 0.0 4.0 1.0 0.0 0.954545454545 0.575757575758 0.4 0.0 0.0 0.333333333333 0.7 0.5 0.7 0.666666666667 1.0 1.0 1.0 1.0 0.6 0.583333333333 0.4 0.416666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 1.0 0.333333333333 0.0 0.0 0.0 0.666666666667 0.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.333333333333 0.333333333333 1.0 0.5 0.0 0.0 0.333333333333 0.5 0.0 0.0 0.333333333333 0.384683149848 0.374988310899 0.990496015388 0.499984414532 3.43096793413 1.54468976977 0.624980518165 3.5657263307 2.22151142436 0.749976621798 4.97351924534 5.72826477654 3.02096097917 0.874972725431 4 4 6 7 3 14 1 19 8 3 8 3 8 3 8 3 9 3 6 1 1 4 1 5 2 8 5 4 3 0 154.0 0.785714285714 81.0 0.913580246914 0.456790123457 0.46628679962 0.114902689104 0.21562130133 -0.0143026224924 0.00702437294172 0.0192552774358 0.000532354394917 0.0279598480399 11.0 0.818181818182 0.214285714286 0.0 0.363636363636 1.09090909091 0.727272727273 0.0 0.285714285714 0.0 0.571428571429 14.0 7.0 7.0 0.133333333333 0.0 2.0 1.0 0.0 0.928571428571 0.525974025974 0.0 1.0 1.0 0.25 0.666666666667 0.666666666667 0.333333333333 0.75 1.0 0.416666666667 0.0 0.666666666667 0.555555555556 0.5 0.0 0.5 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 0.75 1.0 0.5 0.5 0.5 1.0 0.5 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 1.0 1.0 0.5 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.5 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.5 0.5 0.0 0.75 1.0 0.0 0.0 0.0 0.75 0.25 0.214294883087 0.482079192215 1.23264873981 0.642772256287 3.80358624414 1.90948372697 0.803465320359 4.27365205514 2.73378783501 0.964158384431 6.17528287483 6.78243565448 3.70556106393 1.1248514485 2 1 6 3 4 7 1 7 2 5 3 3 5 3 5 3 5 3 5 3 5 2 6 3 5 3 5 4 5 6 120.0 0.533333333333 56.0 1.01785714286 0.375 0.494897959184 0.0450015943878 0.350036443149 0.0122767857143 0.00727463411077 0.0191433534645 0.00142825639768 0.0566415245909 8.0 0.5 0.0 0.0 0.5 1.0 0.5 0.0 0.0 0.0 0.0 15.0 5.0 1.0 0.0434782608696 1.0 7.0 1.0 0.0 0.933333333333 0.466666666667 0.5 0.625 0.5 0.375 0.833333333333 1.0 0.875 1.0 0.333333333333 0.5 0.0 0.375 0.166666666667 0.125 0.0 0.25 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 0.5 1.0 1.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.5 1.0 0.0 0.0 0.0 0.0 0.5 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.327979534438 0.382901571366 1.0308636924 0.510535428488 3.5427804206 1.61378478045 0.63816928561 3.76491056355 2.32678793448 0.765803142732 5.38471320373 6.07020539139 3.16987315448 0.893436999854 1 1 1 1 4 4 2 5 3 3 38 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 154.0 0.318181818182 64.0 1.109375 0.4296875 0.588541666667 0.0272483825684 0.713558197021 0.036304473877 -2.86549329758e-05 -0.00968520343304 0.00336502492428 -0.272065535188 7.0 1.0 0.0454545454545 1.14285714286 1.14285714286 0.571428571429 0.0 0.181818181818 0.0 0.0 0.0 22.0 4.0 1.0 0.2 0.0 3.0 1.0 0.0 0.954545454545 0.415584415584 0.2 0.333333333333 0.0 0.166666666667 0.7 0.333333333333 0.6 0.75 0.6 0.25 1.0 1.0 0.0 0.0 0.0 0.25 0.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 0.0 0.333333333333 0.0 0.666666666667 0.0 0.0 0.0 0.333333333333 1.0 0.666666666667 0.0 0.666666666667 0.5 0.0 0.0 1.0 0.5 0.666666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 1.0 0.666666666667 0.0 0.666666666667 1.0 1.0 1.0 1.0 0.5 0.333333333333 0.0 0.333333333333 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.666666666667 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.333333333333 0.423830951774 0.36171399786 0.947960529816 0.48228533048 3.33783142843 1.47599766186 0.6028566631 3.40951814656 2.12045359373 0.72342799572 4.70172850704 5.48167981596 2.88132832544 0.84399932834 gamera-3.3.3/tests/data/testline_test3.xml0000644000076500000000000004632511364254132017523 0ustar chriswheel 4 2 10 2 1 3 10 6 11 5 12 4 12 3 14 2 14 2 14 2 14 2 13 11 5 6 2 4 4 4 5 3 5 3 6 2 4 3 7 2 4 3 7 2 4 3 7 2 4 3 7 3 3 3 7 3 3 3 7 3 2 5 6 3 2 5 5 12 3 5 1 0 7 3 13 1 1 4 1 1 10 4 2 4 9 2 5 3 9 1 7 2 9 1 7 2 8 2 7 2 8 2 7 2 7 3 6 6 3 4 5 8 2 4 5 5 1 1 3 5 5 4 6 3 6 4 6 3 6 4 6 3 6 3 7 3 7 2 7 3 7 2 7 3 7 1 8 3 6 3 7 3 6 3 3 2 1 5 5 14 6 7 1 0 2 1 1 2 11 6 12 5 13 4 14 3 14 3 14 3 14 3 14 3 14 3 2 4 8 4 3 3 6 5 6 3 4 3 6 4 4 2 7 4 4 2 7 3 5 1 8 4 4 1 8 4 4 2 7 4 3 3 7 4 3 4 6 4 3 4 6 4 1 7 4 6 3 2 12 0 3 2 1 1 1 2 1 8 2 7 3 6 4 7 2 7 3 2 1 4 3 1 3 3 6 4 7 3 7 3 7 3 6 5 5 4 6 4 7 3 7 3 7 3 6 4 5 7 3 8 1 9 2 9 3 44 2 3 4 2 3 3 10 1 11 1 10 3 7 2 1 5 3 2 3 4 3 2 4 7 8 2 4 0 0 4 1 15 1 9 1 4 6 3 7 3 7 4 6 4 6 4 6 4 6 4 6 5 4 6 4 0 1 3 2 24 1 5 5 4 7 3 6 4 6 4 6 4 6 3 8 3 6 4 5 6 4 4 6 0 2 12 1 3 2 11 5 4 2 3 5 3 3 3 5 3 3 3 5 3 4 2 5 2 11 2 5 0 0 24 1 1 2 4 5 3 5 4 6 3 6 2 8 2 6 3 6 4 5 4 4 6 3 0 2 2 2 5 1 12 1 4 1 0 3 1 8 3 1 28 1 5 7 4 7 4 7 3 8 3 8 3 8 3 8 4 6 6 4 7 5 2 9 1 9 0 2 8 3 4 1 4 2 3 4 3 3 2 4 4 8 4 8 4 7 5 3 9 2 4 1 5 2 3 3 4 1 4 2 11 1 6 1 4 3 4 2 2 1 3 14 2 1 1 1 2 2 8 10 8 4 8 9 7 5 8 9 6 6 9 8 7 6 2 2 4 7 7 7 2 2 4 7 2 1 4 7 2 3 3 7 1 3 3 7 2 3 4 9 4 7 2 4 4 9 3 7 2 4 4 3 1 5 3 7 2 4 5 2 1 5 3 6 3 5 7 4 5 5 3 5 6 5 4 7 2 6 5 5 4 7 2 6 5 6 3 7 2 6 4 7 3 7 2 7 3 7 3 6 3 8 2 6 4 3 9 5 1 6 7 1 9 5 1 6 14 1 1 12 9 0 2 2 3 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 0 4 2 8 1 5 1 9 1 4 6 4 6 4 6 4 6 4 7 3 7 3 7 4 5 6 3 7 4 1 1 2 5 0 3 1 6 1 2 4 2 17 2 9 4 5 7 4 8 3 9 3 9 3 9 3 9 3 9 4 7 6 6 3 1 2 7 1 8 0 2 3 4 4 2 5 2 6 2 5 2 5 4 3 3 4 2 4 2 5 1 4 3 3 4 2 5 0 6 1 1 1 21 4 1 4 17 3 4 4 15 4 5 4 14 3 7 4 13 3 8 3 12 4 8 4 1 14 8 3 1 10 2 3 7 4 2 8 3 3 7 3 4 1 9 4 6 3 15 3 5 2 18 5 1 2 21 5 17 0 1 3 2 2 1 24 3 0 1 1 1 1 2 9 1 3 1 0 2 2 2 2 2 2 1 17 3 4 4 4 4 3 5 3 5 4 4 4 4 3 5 4 3 6 3 3 4 0 1 2 1 11 2 2 1 0 1 1 1 2 10 5 11 4 12 3 12 3 12 3 12 3 12 3 12 3 3 3 6 11 4 4 4 3 4 3 6 3 2 4 6 3 3 3 6 3 2 3 7 3 3 3 6 3 3 3 6 2 3 3 7 2 4 3 6 3 2 5 5 3 2 5 4 11 3 5 1 0 8 4 11 5 11 4 11 4 11 4 12 3 12 3 12 3 11 4 5 1 5 4 3 3 5 4 2 3 6 4 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 3 7 3 2 4 6 3 2 4 6 4 1 5 4 5 3 13 4 1 7 2 6 3 5 7 1 9 1 4 6 3 6 3 6 3 6 3 6 2 7 3 5 4 6 3 6 4 6 6 7 1 1 2 1 2 8 8 7 3 2 4 6 2 13 3 13 2 14 2 14 2 14 3 11 14 1 15 2 14 3 8 1 4 3 7 3 3 3 5 5 3 3 5 5 3 4 3 7 1 4 4 7 1 4 6 4 3 3 7 3 3 3 8 2 20 5 2 1 2 6 0 0 4 7 2 7 2 6 3 5 3 5 3 5 3 6 1 7 2 5 3 5 4 3 5 2 6 1 3 2 4 2 5 2 4 2 4 2 3 3 3 3 3 3 3 3 3 3 4 1 5 1 6 4 2 3 2 5 2 4 3 3 2 6 3 1 3 2 7 1 11 1 4 9 4 10 3 10 3 10 4 10 3 10 4 11 6 3 0 1 1 1 1 4 4 2 5 3 3 38 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 3 12 2 3 2 8 1 3 5 4 3 3 5 3 4 3 5 3 4 3 5 3 5 2 5 2 12 2 37 2 13 2 12 9 6 12 3 13 1 5 6 8 7 3 1 3 9 2 1 4 8 2 1 4 7 1 5 4 12 1 11 0 4 6 6 1 3 4 3 3 3 18 1 5 1 2 1 1 1 1 1 3 10 3 10 3 10 3 10 3 8 1 2 3 5 3 2 4 4 3 4 7 3 0 0 2 1 2 10 6 10 4 12 3 12 3 12 3 12 3 12 3 12 3 12 3 2 4 6 4 4 2 5 4 5 2 4 3 6 3 2 4 6 3 2 3 7 3 3 2 7 3 3 2 8 1 5 1 8 2 3 3 6 3 2 4 6 9 5 11 3 6 2 1 1 2 1 6 2 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 4 2 5 3 3 4 2 5 2 5 1 6 1 6 2 4 3 4 4 3 4 1 7 3 2 2 0 7 3 1 1 11 3 1 4 9 2 4 3 8 3 5 2 8 3 5 3 7 2 6 3 7 2 7 1 7 3 7 1 7 3 6 3 4 5 5 7 1 5 5 6 3 4 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 7 1 7 2 16 2 16 2 16 3 3 1 11 3 2 2 12 6 14 1 3 0 4 4 7 6 3 4 3 3 2 3 4 3 9 4 8 4 5 1 1 5 3 4 1 4 1 4 4 3 1 4 4 3 1 3 4 9 3 5 1 5 1 5 2 2 5 2 1 0 2 3 3 5 2 6 1 6 2 5 3 4 3 4 2 4 3 4 1 5 2 4 3 0 6 10 9 6 2 7 4 4 7 5 3 4 9 4 2 4 11 3 2 3 13 2 1 4 13 7 15 5 15 5 15 5 15 5 15 5 15 5 16 4 16 5 16 4 12 2 3 3 12 2 3 4 10 2 6 8 2 3 8 11 10 6 1 2 4 0 2 2 3 4 1 6 1 5 2 3 3 3 3 3 3 3 3 3 3 2 3 3 3 4 1 6 2 7 4 2 1 4 3 2 3 4 2 2 4 2 3 3 8 7 8 3 9 4 2 1 5 3 1 2 5 7 4 3 1 3 3 4 3 7 2 0 4 8 5 2 2 4 3 3 4 4 1 11 2 3 2 1 6 3 10 3 10 3 10 4 10 3 10 5 5 1 3 4 4 2 5 7 2 0 1 1 1 1 1 2 1 1 1 1 2 3 1 1 1 1 1 1 1 6 1 8 1 10 7 4 5 6 8 4 7 4 8 3 9 2 9 3 20 3 20 4 19 3 19 5 18 5 18 4 19 5 19 4 19 3 20 4 19 3 20 4 18 5 17 6 17 6 13 12 7 0 0 6 4 5 5 5 6 3 7 3 6 2 7 2 7 2 6 3 7 3 5 5 4 5 3 6 6 1 8 6 4 3 3 3 2 3 4 3 3 1 5 3 10 3 8 4 6 2 1 3 4 3 2 2 4 3 3 2 3 3 4 3 2 3 3 5 1 11 2 4 2 4 7 3 1 1 11 3 1 4 9 2 4 3 8 3 5 2 8 3 5 3 7 2 6 3 7 2 7 1 7 3 7 1 7 3 6 3 4 5 5 7 1 5 5 6 3 4 5 4 6 3 6 3 6 3 6 3 6 3 6 3 6 3 6 3 7 1 7 2 16 2 7 3 6 2 7 4 5 3 3 1 2 4 5 3 2 2 1 6 5 6 14 1 3 0 0 24 2 6 1 2 3 5 8 4 8 4 8 4 8 4 8 3 9 4 8 4 7 6 6 6 4 0 22 1 1 3 1 2 1 2 18 9 1 9 10 9 3 9 8 9 5 8 8 8 7 8 7 8 7 3 1 5 5 2 2 5 7 2 1 6 5 2 2 5 7 2 2 5 5 2 2 4 8 1 3 5 5 1 4 3 8 1 4 4 4 2 4 3 8 1 4 4 4 1 4 4 7 3 4 7 5 4 7 3 4 7 5 4 6 4 5 6 5 5 6 3 5 6 5 5 6 3 6 5 5 5 6 3 6 5 5 4 7 3 7 4 5 4 6 5 6 3 6 4 6 5 6 3 6 4 4 9 5 1 3 10 24 5 3 0 4 9 6 2 4 4 4 3 7 4 2 2 9 3 1 3 9 3 1 3 9 7 9 7 9 3 1 4 8 3 2 3 7 4 2 5 5 3 4 4 4 4 6 7 5 0 2 2 13 2 12 9 6 12 3 13 1 5 6 8 7 3 1 3 9 2 1 4 8 2 1 4 7 1 5 4 12 1 11 0 9 4 11 4 12 2 13 2 14 1 14 1 14 1 13 3 8 1 2 4 5 1 1 8 4 5 2 4 3 4 5 3 2 4 6 3 2 4 6 3 2 4 6 3 2 3 7 3 2 4 6 3 3 4 5 3 3 4 5 4 2 4 5 5 3 12 0 7 16 21 10 10 1 12 9 7 7 9 10 6 8 8 9 7 8 4 1 4 8 7 8 3 2 4 8 1 2 4 8 3 3 4 6 2 2 3 9 3 3 4 5 2 3 4 8 3 3 4 5 2 3 4 8 3 4 4 4 2 3 3 9 3 5 3 3 2 4 4 8 3 5 4 2 1 5 3 9 3 5 4 1 2 5 4 8 4 5 6 5 4 9 3 5 5 5 5 9 3 6 4 6 4 10 1 7 4 6 3 11 2 7 2 7 4 5 1 3 3 7 2 6 5 4 11 4 2 4 9 2 8 1 1 6 1 3 7 1 2 2 3 30 1 29 0 8 3 7 2 3 6 4 4 4 5 2 6 4 4 3 5 4 4 4 3 6 3 4 3 6 4 3 3 6 3 4 3 6 3 4 3 6 3 4 2 6 4 3 3 7 4 2 4 5 5 1 6 3 7 1 2 1 3 1 2 10 2 1 1 1 2 1 1 1 11 9 10 1 10 8 8 5 10 6 8 7 9 6 8 7 9 6 8 7 3 1 5 6 3 1 4 7 3 2 5 5 2 2 4 7 3 2 5 4 2 3 4 7 3 3 5 3 2 3 4 7 3 3 5 3 2 3 4 7 3 4 4 2 2 4 4 7 4 3 8 3 5 7 4 3 8 4 4 7 4 4 6 5 4 7 4 4 6 5 4 7 3 6 4 6 4 7 4 5 4 6 5 5 5 5 4 5 5 4 9 4 2 5 7 3 9 4 2 4 9 2 10 3 2 3 10 3 2 27 0 2 2 3 4 2 4 2 3 4 2 28 3 2 4 2 5 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 11 1 3 5 6 5 5 5 4 5 4 6 3 6 4 5 3 6 3 6 3 5 4 6 4 4 5 3 7 1 3 3 4 2 4 1 6 3 1 2 1 6 1 1 5 5 2 2 4 3 2 4 4 2 1 5 3 9 3 8 5 5 7 3 3 3 3 2 4 3 2 3 3 3 5 1 3 3 17 2 2 4 3 2 0 0 4 7 3 9 3 5 4 5 4 5 3 6 4 5 4 5 4 5 4 5 4 5 4 4 6 2 2 1 3 12 8 11 8 10 8 10 9 10 2 2 4 10 2 2 4 10 2 3 3 10 2 3 4 9 2 4 4 8 2 4 4 3 1 4 2 4 5 2 1 3 3 5 7 3 3 5 6 5 2 6 5 5 2 6 5 5 2 6 4 6 2 7 3 5 3 8 2 2 9 5 1 3 9 5 1 3 6 1 1 10 0 0 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 11 2 11 5 9 7 9 5 11 4 11 4 11 4 11 4 11 4 6 9 6 9 3 4 4 4 2 4 5 4 2 4 5 4 2 3 6 4 2 3 7 3 1 5 6 3 2 5 5 3 2 5 5 3 2 5 4 5 2 5 3 5 3 12 12 1 2 0 0 2 1 2 1 6 1 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 2 4 2 3 2 4 2 3 4 2 4 2 5 1 4 3 2 4 1 5 1 6 4 4 6 7 3 14 1 19 8 3 8 3 8 3 8 3 9 3 6 1 1 4 1 5 2 8 5 4 3 0 2 1 6 3 4 7 1 7 2 5 3 3 5 3 5 3 5 3 5 3 5 2 6 3 5 3 5 4 5 6 1 1 1 1 4 4 2 5 3 3 38 4 3 5 3 4 4 3 4 3 4 3 4 3 4 3 4 3 4 3 3 4 3 5 1 7 gamera-3.3.3/tests/data/too_many_colors.png0000644000076500000000000037057511341152222017743 0ustar chriswheel‰PNG  IHDR{C­ pHYsêe¤ IDATxœìu”]EÖĊ{F™‚…HˆâÚD:vËkWÜŬ- ww .Á-hÄŬî2Ì0#ßoΣŞï½/ï$—U³Ö>ğê½/³ï­sêœŞ ñññññ›äJŝ/nqÛD›Ö÷Ä-nëŻm–œ~·ġĠ´/`Ón(Ö˙zmħŝ×kËMĵi}_@üóŸ˙ Ä?}4›mMëûâë_ï×_˙†Ûâë_ŻMÀĉ-ĥi}_@|añ…Ċ×_ĜĈ{a~µ~›6í ĜÄŝzż€MüçŻ÷ ĜÄŝú[ĴËĤ÷ÏĊ?mCüsñO‹˙%7Äżµn˙œ€-×jSüŭñ÷Çßüŭ-ñûlµ6š6ïŒ/użÔMüçǗşi_Ş€­×`SKŭĥĝÂâŸıa]Ĝ&ò3[ì…m?SÀ6k¤iú’u1-çKZÔĊ´œ/iQ˙˘ĝŸÙMÀĥĞÙ´!|½_@|ŭñġÇ׿á^À~ŭ~½ÊMÚg Ž/¸%üÑĝÇĥä?ş)]°€˙[µĤ˙İ â"7âŸĥA\äFüÓ6ˆ‹Üˆچp‘ĥ[…Ĥĝ#ñG6Ġ´äk‹?deš€íWŞ)ÇÇñxżYİĤxp€˘ŝ¤bż‚ÔTħ?ßKĞ1ÄúOĥX˙İĥ1é5&ĝ}Ä °³h;‡6ħWt×Î9şĞWt×Î0(ş77íÑ]uÑ];áÑ]'Dwí gEw]˜öƒWGwŬŬµ3ÜŬ5*şkgx>şkLt×Î0Ùéŭ>ċgßgŽuıêOù>Ë`ç½~;G?ŻżVSıí ÖTWĴ˙ E˙i'Ñ*j­˘&ъˆ&ÚDwuŒà[AèŒèVŬUŬUŬupß Ž‰î:5şkDtW+¸,şëúè;"ĝV@t×Ñ]££ğĈFwµ‚İÖŒ|çA+5UÒ÷y Z)ìa A+…?Ĵż†VúYĞM³•V~ˆġèŠġߤkC×˙šŽÄ.°3´‚]š4ħg„]Ä.!˘Ğ[ôGúGw àwÂèŠ~hŒè:"ú#'FwÁïFw]ŬuswôGŽàw§£ğ^Žàwq~×Għù>Óa…Ĵ{η×=߆]ÔTŭIĦ~ ğ(\¨ßègĦ6]N] R˙ŠġÏ.ħŝĥê•&ħkè vM†Àvìšj˘µk:|û~WèÁ÷ŝȐ>/‚ß|môGààw…Ó"ĝÑı4‚ß‹ào‹àw…û"şFEäıŝĠ~W˜`]û‘ï ›Ĵ{~ a×°uÏw`W…g½>]²^ßÀbğ0ŻjMNħŝ#ĝX˙œŝ£'ħ[è v Änİ5PçĜMì{ÀnMšĜ ÚE]"ĝŜün0(‚ωàK"ĝŞ~78(‚?*‚?)‚?+‚ß .Œà݌àoŒàïŒàwƒ#ĝ'"ĝ"ĝ1ŝĝ>‚I°›ĵuϤï3 vSÈşç"Ĝ-l™r9ì&B%úİÂ}”żˆí×Èë?˙oĴ·mú_;I`÷€ŬƒMìÁwŽà{FaäîÁFċ|}ı;ÁÁŸÁ#w‡K"ĝk"ĝ["ĝ‘aäîp˙T˙b?ÖȔú“Ïd›D³o"ĊĈ7èğ°ğBôù)ìĉĦ˙vWĜ ğ‡ĞFOáúW„ŝĦ˙Ÿ+ÖĴ˙˙54ˆ=B'ħì{¸M´mÂß)ŒÜzDÂÈ̈Áùa䐈àkȃ#Fî'Gg‡‘D "‚ż!ŒÜîï‹<*‚6ŒÜ^ñù÷à}xÓÈ&‘ïT›Dsa…Ô;/…=ġÎïÁ çg°‡BÄù׈àŸkoˆġëÔ˙JN˘up­C#ÑÚ"€= u²‰½RĜ![CÇ0[Äà~aäàˆÁıadIÙŞÂĝĈˆÁG„‘ÇG >=ŒFĥ†KÂÈÖpMsÄàğÈ#?F>Fĥ†×Œ߉|ÇÙ$ò­‘ï<Ü$ò]­ġÎïCk…(ósh-OŭÉżÒ:tOÍêOħŝcŭo\ú_kK@bOg (yì)ÚÀžMšĜ7ŒÜş†‘}ÂȁߐF…‘ċaäžPFFFî §„‘g‡‘„}ċ_{}y[yOı'<F>FŽöÉċ.ĵŻžò"ßOa˘ v#ßF6ÑċĜ3 Ë·`ÏÀsùĜ3lŬó y²üßmĥÖ&€ŭ+ÖĴ˙ U˙›…O˘Mpm‚€hĥĤŸĜZ‹6šhFv #{…‘adÈ # ÂÈD€i5aäAaä‘aä aäéaäˆ0² \F^FŜFŜFŜFŽ 0mà™0ò%#ßµÈ÷kd“Ŭ.“ĦM òm‘ïBh¨x{Úê?„6uÏ/ -˸ĞMXu]›Àkĝë?Ö˙ĤĦ˙ˆ `u"ħW ĵ‡Ĝ ö„6°Wމviä~f/èF#3Èĵ³”ÈʰÏ6„‘‡…}áħaä)aäÙf/¸ Œĵ<Œĵ.Œĵ5Àì#ȇäa_ĝœĵ ïÀrxĊÈœĴכFş‘ï#ŬÈw6ìĤo‹`Ż@ĊÛ;°W Ŝù#Ĝ+°îùŝ'HŻÀ.ìĝħÙ@ˆŝĤĊúġżëġ&Ñĥ9U@˘m2ĥ -´û$Aމĥ9@voÂ@[Ñ/쳃ȜS6Ĵ<À´…ş0òyTĜ°È3̈°a˜ĥpUyc€ı=lĜ½aä#Ĥ-< _0&ùŻùħ“ġmçœLƒĥ~@:Ç>뤋Ħ­šVĵ-‡ĥzçĠT_BÛ`…ġ:˜BġŻX˙ħŝ7ŭ7{{7o'Ŝ2¸½Sk İ@ìßDGBÈnfoè`† ` †%Lu€Ù #0Dž ;5Àœ`ö† äea 7‡ ğ+Àì ÈQaž1ò-ó}^4ĈÍz½{ûġÎl˜ĞĊé°w ò{û‘ïĜ;PñönàYü1ìxĥĊ&ĝGW}ĠżbŭÇúß°ġż€Ĝ'°rŸˆ}Ŝ ö½aŸT\öû@×Ù;Àd„}ph€É V`*L}€Ù G‡ ;)Àœ`F„}âse€Ùn0·† ûàCĉqŸY Ëà9#SÏËĈ|dYŻħĈ¸ġΓ`?òaÜÈw>ìGKażâí]Ĝ'°îù ì—c~ûO×Z£À*ê_ħŝcŭ·\ŭŻ…€_ŬÉ ÚA[ğÚA;ħo¤šè`ÚAŻ3 0lH€É ûŞâS`jÌAĤ`Ž0§˜³L;¸ @^` 07…}ĠĉóH€yҘeüìûĵíôsÖëCxÚùYŻ7íƒ)7d²1n: Úù‘ïhçGË _ñö´ Ĵ{~*O„_Á×ë|ë?Ö˙†˙° @´o2ˆö°ÚvBĥÔA·”Áµ·5˙Ŭ˘=~û˜Ĥ_€iƒLv€) 0‰S`Ìaĉ˜sR€9#ÀŒÍdğ8À\`0·˜ğÌf”1‹a ,…§yÇ*ŜF“Êz½fÌçNÖk<´÷띧B{˙œ“ÙŜ|B{?ò} Úûà÷Ħ½˙ŝÚÛ#8ċyµT[·œ²Ò䯇Lħŝcŭo2ú_Ë€_·Ż“ÛöûB{Ĝ7ĠDgׄ}E÷Ó×7÷…&+Àä˜ÒS`ê}s_8$À`N0§˜s|óüÀ€KÌĠĉĈs{€ıÇ7÷…‡|f’ĝHn€)0ċĤÖ7 8<Àë›àäsĤό ¸(À\`óÍpK€ıËgî xʔïó¤1)ßçycRÏ+ÁÙë8Ö¤ÂωĈ¤ÂÏéÁ|çB?ò] üÈ÷˙e,@Ŭó3èäĴ•ġ54G˙ŠġëżĊé•&ÑqEo먃îèWAt´5˙Ŭ˘#~]}³W`ÀßìC|&;0 0À$Lµo6ê›áhŸ9!0à´sŽožpi€ıÚ7o ¸Í7;ÂHŸyÀ̰Á(cRÏÓĈ¤|ŸÑÑİx{Ġ¤”÷&tô³^“Ħ£Sï<:úʛŭÈw tt"ßw £˙äŭ:úOŜχm5ıŒµ2ġŻX˙ħŝ7Hŭ7cÒG˘ÓŠöt Fî :AGè”jbßì雝 żÏ ĉ3ùĤÒ7ëöÍ#|³ç3'œé3#. 0Wĝĉµ7ûĉÙ îu˜ù™)ßçqcRϳÉÙíò˘ Hù>c ““ġgRYŻ)É9„v&tò#ßùɏ|—ú0,‡N~äû‘Ÿzŭ:5İĵĵeİ“Voê_+ÒżV¤Ċúġß"ôżò€èĵ˘Àŭ2¸Î2¸Îî :Cğ:‹Î:§šèá›}}³3 ô™ĦyYPî›5Ùô™|óèÀĝ}ĉ´À€s|óüÀ€K}ó*ßì 7ĝÌ­yW`üŭĈ$}ŸGÌLù>OBgŭĵÛċ9ò}^†ÎŽÓñ:tö£Î Ùq:ĤBg§`tö#ßى|—Bg?ò}×?~ç#èìlŭXÑ ÷ĠžV ĊúġżĦêµsbżf&­ n?ż b?[ŭß ûıMt÷Í>™á›ûAĤÏäĝfa`|Â7Ğüġñ‡ĝĉ‘yœoî§ĝ̙9"0ŝ"ßĵÜpM`üMyğoŽ4ṡ 1Ißg”™Ißç)3SÏ °Ÿ³ÛċÜX3S‚›û9YŻi°ŸsÂílĜϏ|Â~Näğ ös"ßwa?ßŝĜ¸)_l?y{/÷ÓڝV Ŭ°BŭÛ˙qħŝcŭŻŭŻé* ÑĊ݃îâ—ÁuñĞ ş8I°ŽItŭ K²‰n) ]Doßà›ƒ}³ dûfo–ú+Żó̓|ópß<Ĉ7OôÍ.pşož›çû/ |ü*ßĵŜ7oñÍ;͜sá^3“Ïbxş8Ï6 éûϛ™ô}^63éûĵ]Ĵ×xèêd½Ĥ@W'ë5ş:'Ü΃Näğş:‘ïÛĠ‰|߇ÎRû'ĠíFW˙,”ŝñ[]ŭB슞bŭÇúߔôżÖ"ÑÍ/ƒëĉWAtóĞ şı9Ñ ö‡ ş‰IŬD7èë˜) ŬÄßÌöÍß,ġżĥÂ7k}ó@ß<Ì7öÍÜ Nġͳs„˙Á }ó2ßĵÚ˙ž|óV3g¸ËÌdĊÛ}f&Ï9yĜ̤ïó8ts|Ÿg ›eŒ†nŽ—ñ*t3/cĴ}OÒ˘`fÒ˘ ŬœĴ×,èĉœp;ş9‘ïèĉDï@7'òŭşÙfĞOàÓ&ï]jrV“b4yïRÚ àWŝ°?lïOˆ: "ÖĴ˙ A˙Ğu\w'd÷f.‰î~Dw? Ö='oÑk˘7ž9À7ûĉ0w‡|ß,qÌ2˙ƒĠŝÈß<Ä7ôÍ|’ßuşožàîpo^â›W:ĉµ~×Mf΄Ypğ™ó`>Œ43YñötwÎ8|ş›ïó„Lú>Ϛ™TĜ‹ŬÙíòtw|Ÿ7ĦğûL‚îĉûLƒîNÖk6twÖX@wge)twÖX–ûOĜí ›,ÉèîoÄw/o]LéġŻĤûbŭÇúoú_™ @ôhf zĝu=˘r˘‡Ÿë‘Z…˘t‡CôJ3ûûĉ ÷€,ÇÌġGù#Yċ˜u~×Ay¸oàüS}ó,ğ.tp¸Ì7ŻvÌë O‡p‹™ÉĴםf.„Ep/ô0ßçAëJú>£ÌLú>OAÇ÷yz˜ïó’Lú>c ‡Sñ6z8o“Ħ‡ù>ÓĦ‡“ġš=œzç…9çd™ù.‡Näû!ôpO`÷o€&‡aġšžšè_ÑGA¤×żbŭÇúo)ú_cGAôŒJ‹ž~\Ïè$pO? Öş%oѧ‰~î 3Ó™,tÌRżĞÂ7kÜèwê›G9ĝ8żëd÷„3óżë|ÇĵĜ˙’+ü‘ך9 n4< fmf·p7ô4ßç>ëJú>›™Üëĝ8ô4m=m]Im½=m½=M[ŻCOG[Ħ§£­)Ó|ŸÓyĥ΅žÎ³u‘ù.ƒžÎ³ġ]“íGŝ+8z*òĝn-LÛEMMôŻfë_ħŝcŭŻOŭ§Dݍ @ôŠŜÖ+j HôòĞ z9I°^~Ĵ—­v½ 'ôJ6Ñ×Á) ½Ä÷‚lÇÌ÷ğJ³ÌïŞvÌzżë`ß<ÂÁÇĝ]':ĝTżë,ğ.tp/¸Ì1ŻrT¸Ŝ̙p³ádÖë3ÁHɊ·ÌLîvyz™ïó„u%}ŸgĦ—ù>£­+éûĵ ½Ì÷k]Ißgôr*ŜĤB/ó}fB/'ë5zYÖkôr"ß· —U×ĵ ½œµġ —{Żż—"n蕟šè_ÑúW´ŝë?ÖËĠ˙Z.½£ƒëŬ$p’`½5Ŝn€Ŝ˘ôN61 …Ħ·ìà,ż+ÏÁEî ÇĴôğêó@żë0ċwïà“ŭ3|Žƒ{ùŽyħßu…c^c8ùŜhĉ¸Ġp2ëuôĥŠ·{­+Yñöô6ßg”u%Uġô6U=½·â%èmŞz z;nĊ›ÛT5z;OĠi۞޳ ·“ġšïD‹Ħ·sÎÉÛNäûôĥŬUÁÇÑ7À7Ñ7À?ViĜ:zĝ]ôİEë_ħŝcŭŻŭ݉ @ôiŜq}˘Ïê$Áú¸I0[í ½DĴ‰ŝxĉ upÈuÌB—ú*³Ĉïjt!N×ŝ°c|˘ßušƒÏrĜ…ÔÁ}à*3§Áu†“‘ïÍDz^·[×b¸Ûp2ëu?ô1ßçaëJžqĝ8ô1ßçiècÏó6,éûĵ }Ì÷}œŬ. ù>“ Sñ6ŬÉz͆>–ġš}œ´ê'ò}ú8Ğêï‹Vİwpûïâè£ġ=4Ñż"ö4Ñżš§Ċúġżġßì @ômŜNàNtߨ`˘ŻSÑ×I‚ġġ“`}S€è ½Ħôŭ o²‰013œí+pÌ—ùŞ\ïtä;ÜÁG;ĝxĜ)>Áç8¸/œï˜;ĝrS`*\cĉL¸Á\¸Ċp2ëu'ôµĴ×=Öµ0œĴx{úšžž€ĉP‡' 'kŠŸƒ~ĉûĵŭÌ÷yú™ï3Ö>’ô}&@?ó}Ĥ@?ó}f@?'ë5×ñĤB?ó}–B?[Nyú9ŜôÎ d'd?§FğŸ{֝šyÁVZ˙ŠġëêĉD§ş˙ÊÑßI‚ġw’`ŭ5ŝúA1ú§šìà,ç:¸Áîqpƒ3ì`îüŸààS|†ƒÏqp8ß1/6< .7< 6< 7œŒ|oŝĥ×ñèoYŻ‘6ì]¸ß‡°á¤’‡ŝĉJ< ŭ͕xú›ïóô7ßç5èïĝ>oB{’N„ŝĉûL…ŝĉû̄ŝ–ġš ŭĴ×"§Ŝy™ù.wÊi>€ŝÎ˸û+b+ü:™Â‚H£E–ĈúġżġżNΜ2¸NÄ' 6ÀI‚ pÖ@8k ’!0ôpšäàĦÎqpƒK\ĉà*×9xäà|”ƒsI>ÍÁg9x„˙'.4<.5<4<5<n4ĵn5ĵî4ü,‡{a€e½„VLö( °jâ'`€ù>ÏÀó}^€ĉûĵ Ì÷œî`€ù>“`€ù>Ó`€ù>³`€ù>ó`€-¤,‚ĥ² ˜½ˆ]Sïvn€O[ä°cèF°X˙ħŝ[Şŝŭ @d¤&‘áĵ)9 +Ù Ÿál„Épê 3œ2¸ § "I‚e8I° ' –áĴf8k Îhô‡!2` dÎtpĥƒó\ìà„ƒ+\ëàFâà#|ŒƒOp)>Áç88· 1&ÀĊ!&¸2,ò½2,ò½2ĴŜùfȰzçÛ!²^wC†e½îƒ ‹"‚ ó}FA†ù>OB†ù>ÏB†ù>£!|ŸW |Ÿ×!Ùé>ŜÙí2Ùİx›îìuœíd½ĉ;YŻĊN!Í[NäûĜmMħŝcŭobú_'@3—€šä‚U@İ 'o8 ÙÄ`g98×Á….upıƒĞ\ïàƒ|˜ƒrq>ÉÁ§9ĝ,00.0< .1< 0< 1<n0ĵn1ĵ î0ĵFŝî7ü ÓÁçÂ@ñ&œgäD¸ÈT¸ÌL¸Ê\¸ÎB¸ÉR¸Í;p—á÷á^hîƒ0܇Ga ıOÀ@sžĉ>ĵÍ}xšû0 Á0|Ÿ 0|Ÿ)0|Ÿ0|Ÿ90|Ÿ0|Ÿ%0|Ÿ·a ĠPçÜEm…wru߉ê˜{ŬOħŝ˜šY° IDATcŭ·<ŭŻħ£ 9uƒœ:èA+“ä$Á9I°ANl“”ŒÄ Ĵ‰Lg;8ßÁĊN•5Üà >ĜÁ‡;ƒvñ>ÙÁ§;ĝl# L€ OK π+ ρk /€ /[`EwÀ ‹|G ñ!Ügƒ?…‡  £`ívyÙ1RÏ ;p4 ²½ŽŻÀ Ğyx‰_›0È|Ÿ‰0È|Ÿİ0È|Ÿ™0È|Ÿı0È|Ÿ…Σsİóè|GìÎ˙~Ċ ç¤ĈANô µŒ  9úWÄ;ë?Ö˙zÓ˙jLbpó#1Ĝİ‚ìTA Û <ĜI‚ v’`ƒ$Ĝ` @ƒĊœlb˜ƒó\d`0 7\î ¨vp½3ĝ fĝHgħ΀|ރÏ4üœ ƒĊx8ÏÈÉp‘áép™áÙp•áùp ĥš‡›`°X·Ú€ċp§áàlŽ0Ĝ‡G`°ĝ³ÁßÂS0Ĝ|Ÿç`°ù>/Â`ó}^…ÁöÜkÏ8lÏ$lÏ4lÏ,lÏ<Ëz-„Á–ġZ ƒ­zòœzAĞsDí„Ĵu;¸úŜ ĵúWĴ˙X˙ëZ˙+9ˆ!+Ú6Ä݃’> †8UC‚91ÄYâĴñsa‚5‘ċà\C p‰3 ÌÁUÎà:Î€CœG8ĝÇ;ƒOvœnx,œmx„Ipáip‰áYp ħsN!b!\o–Â͆߁ÛaˆĠ;ß CÄGpŻ ĝ „!–ġz†XÖë "‡§m?àybÏK0Ä|Ÿ×`ˆĝ%Œ…!ĉûŒ‡!ĉûL†!ĉûL‡!ĉûÌ6Ży 1ßg 1ßg™³{vıó†î!Nô…m…wvíÑڙ\ŭ+ì(ˆ(ŭ‡–Fé_+£ĊúġżêúoĈ 2WtDĉŠÊ@32¸Ì°£ 2$Xf0 ,25Lg 4ÓÖ@3a0 L12“MäÈwÈb' dBág@ƒ3à`‡9Žrçà“ Ÿjàu8Ó882ĊD8ÏÈİp‘á™pdŠ9p‘ àZKàFÈ´È÷VÈïÂ6àC ™ĉ2Ü™â xÈ|£ Ó\†'!Óó,dŠáÈ4ßçeÈ´'ĉÈ›iÏÈ4ßg dšï3*ŜfCĤù>ó!Ó|ŸĊ–ġZ™úŸÇ°2ífŽÚ“ݰӝó3µz€Ğ˙}!úŬ­H˙Šġëíê5–€VôF°ĦéĞ€Ä`ê$Á†Ğ€ÄPg t¨­M†À0D ĊšÈ6çE†Âpċ΀jg@½áòPiĝ‡<ÁÁ§ÀP1N7òM8ÛSà3à—˜W^ ×Pħ n2r9Üfĝ¸ †Šá#?‡`¨e½Ħ⯘ ĝ<C­âí9*ŝ£a¨ù>ŻÀPĞw~†Š-àMjÏDjÏT[0™CÍ÷™CÍ÷Y` &‹a¨ù>o‰ÖĜ›ZS7 UĜNÈŬ_í `ÛM!;]ŭËÑżÂôŻé_ħŝcŭŻŭŻê ²Âvg…½ Ë)ƒË &EV° Td9I°,[ÍrÖ@³,ÎrÖ@³ †B–Y%r“²DĦ‡,3U†k²ÑÁΧwmĝ8‡<ÉİŜ€3 O€s!KL†óŒœž —A–˜Wı…,ħn0ò¸²L+w@–ĝî†,ÓÊ}%„íSG!Ë´òd‰àiÈ2­<Yâ?"dÙ³òUȲgċXó}ĈA–=+'A–ĜĤB–ù>3!˞•s­âmd™ï³Ä fŜ²Ġäpë ³rJ–ÖĠàê_aú׊ôŻ0ŭ+ÖĴ˙uŞ˙µ¤ß †…U î‚ûݰÀ°d CĊ0D?Ċ™0Pá5êò à0G:äħ†O0œbĝtál# Lƒ ςK`˜˜ —ı†ab \gäÛp ï­F~wÂ0ñ Œ4ò ¸†YµÀ0L| £`˜e½ž„a⟠³Ŭ./À0ĵÌ÷y †‰-`, 3ßg< 3ßg²ù>Ó`˜ù>³l­|. 3ßgĦ-•,aĥVŝvê€aJğ&ô0Ĵµ?„ş8t€Ğ…é_aúW˜ŝë?Ö˙Şë?bÙaŻ„ÌN";앐Ùaû²^ ™mI°l' –mk ÙN,ÛÖ@³5l[ÍvÖ@³! †‰lĴ‰|E9Ü@ıl¨6\ç>Ä!0|´—àx' §>ÓÀ$8²ĊT8Ïșpd‹9pİ‘ àJÈ‹á#߂ [,‡›ün‡lñ1Üeäçp/d‹Żà#˙ @ĥĝƒlSÉS-~‚g!ÛT2²Ċ/àeÈĥ§äÈ[ÁmOÉ -ĥ‡ÉmOÉé-v€YmOÉy-v…mOÉV+ùĥŭ´wŭ:èl…ì„ÌVÈiˆÙ ÜöÓV<¸úW˜ŝĤ…é_aúWĴ˙X˙-B˙k.9a/„É {)|Ž%Ár‚;ENX8'¸XäĜh޳šc!pdCäˆ<…r Ôp™Ê$€Qk ÁùÈÁ†sÈ£ kàU8Ñ)ĈÁ#&ÂÙFŽ00.0|ħùp9äˆEp•‘Ëà:ÈïÀF·BŽĝî0ò3 9âK¸rl•!ÈßÁ£#ŝÛG~„§!Güžƒ‘Tȋ#6ƒW ÇÎ9yrÄ6&ä˜ï3Ñ|Ÿ)cÏ ó}fCŽù>óÍ÷Y9˘5,…œÔ;ğS7ä(d#LŽ[áCÏCwn€›=l6l6„è_aúWZŭ+L˙ ÓżbŭÇú_cú_ @äĤYıaûrÓlıaÇAçÚh“ε5\ s5\ saXòı ı˘À@1?“ rĦĈp½jà/Â1†7:œ ıâM8ÍÈ3 Ls!WL‡óŒœ A˜—y…p 䊷áz#߃›!W|·AĠ<Üıâ ¸rĊ×pż}ä[xrĊß`äZÖëIÈ˙‚g Wüž‡\ÛéŝäŠ_ÁАk+$cíù8rĊö0ríù8rĊ0rÍ÷™cÏÇùkÏb{>.KŬVúŸoÈĠڟ\ŭ+°ĜĠżÂôݐ* ÜàQħŝcŭŻ}ŭŻhyi"‘—& ò‚9‘gI°ĵ°* <[Í {#Xž­ĉ…ċò,ÎK†À-ò òD>äAž(JÈ ”¨rzë 4ȃC nà(ŻÀq†O4pЁ p†á³ Œ00 .€<1.6r!\yb \yâ-¸Öz߅!O|·@žĝn·ŜÏánÈ_Á½gŜÁƒ'‡G OüAž­>yâ?,ä Á gğ]^†<ħ%ĵyb yĉûŒ‡<ñ[˜yĉûL3ßg&䉝aä™ï³À*dCžĜ –AžáîÖAç)°ĈÙ Ÿ§ÀaXΑò´Ş€ĞgÑżÁ\ŭ+­ŝ•V˙JĞĊúġżêú_CK@"?í>€ü4GAˆ|K‚ċ‡%óm 4?xœÈ·5| ó“!0 ùı"ò!_ò3.5Pf Ò@>Ôn0pÓ{˜á# c` œùâ 8ÙÈÓ L†³ _Lƒs!_̄óĴ÷B àRÈ‹á #Ż6°‡|ñ>Üùâ#¸Ġz?ƒ;!_| #!_|÷Yïw䋿£/ŝ Ce½ž†|<ùâ—0òm·Ë+/ĥ†1/~ o@eG'˜ï3òĊ0 òÍ÷™eÏ\ÈğÈ7ßg‰h Ëà­Ô ùÁ:hg'd~p+|Ĝ jLÛ¤Bôݐ}ùae éôŻ´úWĴ˙X˙kF˙͞DAó^ YĤ HXĴ Íi ˘ÀÖ@ ‚§Š[-°5‚Ô¨SW`!päA(Àš(10Pa Ú@Ô>À!FP ^†£<ÎÀ‰ĈİP &ÁFžm`„9pˆùpħ‘—XWAx…ñÜ`½7ĝn‡ñÜâk¸Çzż… @ü †ñâ'x LÏ@ĝ<bsx ìħĝŞ=_‡ħĵ â·0 ìħ8Ċ|ŸéP v†YP`Ċyĉû,´Ú˜%öKß²_ê•Á9a ‚;!ƒ7€ŭÒ53¸ú›BôŻÀ>€Pŭ+ä(ˆŭĞyúWĴ˙X˙+Ħ˙•Daó6‚ZDašàDĦ%Á m ´0, \hk …ĥZh!pĦ³Zhk …Z\P( Ħ ĦP 7Pn Ê@­Bh4|° ià58 ĊX8Áȓ œf`*œ…bœ …b6œg½X—BĦX W@Ħx†Bñ.\g>„› P|·BĦĝî€BñÜ …ùŜ…â{x ĊŠá1(˙†'Ħ²^ÏBĦĜ ^€Bħĵ…bkx ít„ħĉûŒƒBñ{˜…b˜…ĉûÌ0ßgĥ-‹ÏƒBħ',„B[_j7ÀÛau…Á0io€ï×è˘˙° ŝR”N˙Šġëíê5–€DÑJ]dI°˘ĉĵ@Ùh‘­Eĵ ıZdk EY\ùÉŠ’M”(3Pi Ĉ@½gá ‡8ÂÀÑŽ30N‚"1N5ò ga`\Eb!\ Eb \f½W¸ĈÀp‰áf(ŸÁmP$„;mĜHßÁŭP$ŝA‘ĝ'< Eâ_8‰˙ÂSPdYŻç Hü FC‘Ĝ ^†"ħ-ĵEb; Eĉ·â$(†İP$v†P$v…ÙPdÏ|{ .{X E–+²*ˆ˘`tĜY(EVQ¤µ;„è?l–†è_!U@ÍÒżBrÍÒżbŭÇú_³9QluĊ+ġBQlI°bK‚Ûhqšˆb[-ĥ5b ‹-.ĥ¸8C(†"(%P Ċ"a Â@µ:^€C nà(Ç8ÁÀÉĤÀéP,ĤYP,fÁıP,ĉÂy6ìB—x €bħ†bñ>\Ċâ#¸ŠĊ§p ‹/àvûà7p7‹oá^(ƒ Xü†bñŒ‚bñxŠ…ài(ĥĴ×óP,ĥ„ĦXlŻ@ħĝ?Ċâ7‹ßx(ĥ]Q“Í÷™fÏL(ğ({Â|(maë7À²`\ĜF˜bЃ.n…_W@:ŭ‡MÁ* fé_!ÁbŭÇú_#ú_;;E‰•Á•XDÉŞ½L”Ĝh‰­–Ĝh‰­–X\b!pIŞ .C(IF˘J D 7Pn Ê@­x ƒñ* %âu8Ĉz7p’S œaàl# ,€  D,†‹ĦD,ƒË DĵWB‰xñ!\oĵÉÀ­†;ĦDüFB‰ĝîƒñ<%âGxJÄżá1(À“P"~ Ï@‰e½^°Š·— Dü^…ħ=ĵ%âw&”ˆ?Â(†ÉP"v†iPb랳Ì÷™kÏ[ Yĵ ÄŞ JĴ $¸ĤLÁ`éôVÚ!pÄÓżbŭÇú_Ç@š@”ZDİ%ÁJ- VjI°R[-µ5R[-µ¸ÔBàÒÔ¨›ĥ5R[-µ¸ŠĦD”B)”Š2•j Ô8À!7p”7á8(àD(“á(Óàt(3á,(sà\(óá<û† \bàrW¸ÖÀ'p#”ŠÏá(_ÁíP*ŝwAİĝîRñw¸JĊ?á!(˙‚GĦTü‡Rñ x JĊĉ,”Š-á(µçàËö|͞ƒcí98JĊŸ`"”Š` ”Š]`:”ŠŬa”Š=a.”Šĥ°JE;X b),ƒÒ`\p#L˞‚ûօŝġóQħŝcŭ·È `íĵ8ı:ÜÖ@‡Ûèp[n!p ‡C)  E…ju là0G8ĈÀñN2pށ3 œm`„Ep Káb.Ŝ†Ë`¸x„á⸆‹áz.>ƒ›`¸ĝn…á⸆‹oán.ŝ÷Âpñx†‹Ÿàa.ŝ£`¸<Ċf4 [Às0\l £a¸ĝ5ĵ Ċö żƒħ0Ü6C·ZĝIV 9Ġ|ŸĉûÌ6ßgžù> íÍKìxk£ž‚e Á* `8µ,M ÖĴ˙Ġ˜D"9ˆDr {!FÂJĜVĝ„í„LĜF˜„ĠA'Ĵ .aep Ğ‚HXD’` K‚%, –°$XÂÖ@ĥš°5„­&l 4ak  [MXœ°8a!pJ T$  Qn Ê@­8ÔÀŽ6pœ œbàtg8b!œ ħ.„„x .„X—CBĵWAB|×BB| 7@B|7CB| ·ABüĝFBBü÷ABüBBü„ƒ„ĝ%< ñ+xb+xb[xb;xâ·0â$ğ`<$ÄN0 b˜ ħ;̀„ĜfCB´…yí`!$ÄbX Ğ‚HXDÂŞ V—°:è„m„IĜNȄ•|$ì0Ĵ„W;%ĴÜ;!ˆġëÓÓ‹D™­–Ùh™­–Ùh™…Àe—Y\f!p™…Àe—ÁpHˆ2(ƒ2Qi Ĉ@½ eb eâ 8 ÊÄx8ÊÄ$8ÊÄT8ÊÄ 8 ÊÄl8ÊÄ<8ÊÄûÚó \dàRW¸ÚÀun4p‹ÛĦL|wA™ĝ;ÜeâŸp?”‰ÁCP&ŝ B™ĝ<ebsx ÊĖ,”‰mà(˙/A™ĝ ĵ eâ÷:”‰àM(;Â(­`2”‰Ŭ`”‰Ö0Ó|Ÿ9ĉûÌía!,² ]\šÁ³P‚oD²à'ğŝ˜6³ ` ›ĥĵlû賀ÒlKSšĤ (ÖĴ˙µ­˙µ?ˆrĞ‚(·$Xı%ÁÊ- VnI°rK‚•7s H”[\n!pı…Àċ—[\n!pı…ÀċPċ˘ÊĦ\T¨ƒrñ"4Bıx†rq¨ 8ÂÀÑŽ3p˘S œnà,çBıX çAıXBıx.rñ\ċâC¸ ÊĊ'p-”‹Ïá(_ÁÍP.ŝ·Aı¸˙n(˙€{Ħ\ü@ıĝ< ċB0 ÊĊf”‹-ài([sP.~ £Ħ\l/Cıĝĵċâ0Ö* ÇYäD+€™b0ÓĊž0ÊE[˜ċ˘̇rħAı%ÁÊ- VbXMŭ+d#X_›bŭÇúoa€¨°2¸ŠUŽD…­VĜh…­VĜhE“@`'p……ÀWX\a!p$ LT@Tˆ*µP!êÍ<À!7p”c œ`àd¨³à4¨sáL¨ à¨#läù.2p݁+ B| WC…ĝ ƒ ñ%Üâ¸*Ä·p;TˆżÁ]P!FڗÜâß Tà¨ż„Ç Bü ž„ ħ<b[x*Äv"TˆßÂ+ĥö=FìcĦBì B´‚‰P!vƒ)P!Zt¨{Á,¨ûÀ\ó|Ĝ RaepVWaepjİ@P˙iË@Ğ€VJ˙N`°óJÈX˙ħŝ×ŝ *m#Le³Ğ€*- ViI°JK‚UĤO‹J[­´5J[­´5Jż ¨ÒBàJ +-´¸ÊĦBTB%TЍuf68ĜÀaŽ4p TŠ)p€ËĦR\iıĈÀġP)†› Rün…Jñ=Ü•â¸*Ċp/TŠûĦRü‚Jñ x*Ċĉ8TŠ-á)¨ÛÀ³P)ŝ^€JñxIü^JñG•âÏTŠa,H[QeUUZÑNHÛ _µ?¤ôŸö(ˆpŭݰ (ŝċ×ŭ+ÖĴ˙55ˆêfoĞ^Ñ+!Ğ- VmI°êˆ$pµ­VÛhµŸ¨ĥ¸ÚBàj[­ö7‚U[\m!pµ…ÀĠP•˘ŞE ˙ġ4pT‹qp8T‹#?ĈÀñN‚j1N…jqşñg8ŞĊ[pT‹ċp!T‹÷ᨗÙÈ+ĦZ|×@µĝ ‡jñ¸ ŞĊ-6òv¨˙€ğ Zü÷@µĝÜĠâA¨ż„G Zü ƒjħ< Ġb[xŞĊvĵĝ Œ†jñ{xŞĊT‹aĴ-yğ¨{Àd¨m`T‹½aĤ­xÌ`T‹°Ş- V­”ÁUĞıgĦTkMO)ŭ§= ÎÓThŭ’À‘úW³ġŻX˙ħŝ×A@Ô¤_5é#QcI°š$°¨ħ5š€¨ħ¸ĈÖ@kR[áĦPÔX\c!p…À5P%j jDFC8ÔÌ# mà8¨3áD¨'š3ĦF,s FŒ0ŝ|Aĝ.…ñ \5â*p-Ԉoà¨ßÂÍP#ŝ·A¸jďp7Ԉ½P#€ F<5bsxjĖ8Ԉmà)¨˙ϊíáy¨żƒĦFü^ñg#v‚ħP#vqP#v‡‰P#ö„)ĉíNûÀL¨û¨ó`ŬÁ*ˆ­ şF+: k-L۟RúÚÒTPP˙M’ÀAŭ7É¤ÑżbŭÇú_… @Ôè, ÚˆÂÔZ\mÄY@µ–Ğ -µĥZëŸTkk µĥZë&E­…ÀµĥZ ˘ÖBàZ k-…JQ ĠP#jĦjEƒƒ VbĉᎂZ1 Ž…Zqĵñ'8jĊB8jĊYĈŸ µâ8jĊ{p!Ԋ‹mÀeP+>ƒ+ĦV| ×@­¸Îܵâ{¸jĊp;Ԋ;ĦVü FB­ĝ/ܵâ Ԋ‡ĦVl£ Vl O@­ĝ5< µâY¨ż… Vü^‚Zñ'xUìc V´‚7 VìĦV´†I˘ LZħ7L‡ZÑfYĥsnò°–EPĞ2¸ZĞ‚¨UĝF˜ä?Kšó“˙,Ğ>¤ô5¤ôßd#XP˙MÊ@ƒúorDP˙Z‘ŝë?Ö˙Jè5"QñJÈşôûD]h ê, Vç&E­Öù9€:[­³5:÷(Qg!p{¨¨³¸ÎBà:¨uPĠ˘jĦNÔCԉĦNlĉaŽ„:q´™Ç8êÄ<8êÄiĈŸ ubœub„ñç¸êÄÇp)ԉˍż êÄ×p-ԉżÂ P'n‚:ñw¸êÄ?á¨wAĝÜuBp?ԉÍà!¨@Ĝ ƒ:ħ-< ub;xFüžƒ:ñ{ ubxYü^…:ħ3ĵubWxêÄ0Aì “ N´…İP'ÚÁ ħ/̂:Ñ ĉB]r 4PQ§ÔA×)|'d"^ˆħÚÀĥĦ@J˙Mv§ôµ ˙&U@Aŭ+B˙Z‘ŝĦĊúġßÌ @ÔGĵ >âġûê­ ˘ŜD½%Áêŭ$p½­ÖğK@˘ŜÖ@ëŭ@½…ÀġĥZY˘ŜBàz ëĦPÔ[\o!p=”‹zK‚ĠC Ԋz¨cĦêĊAü9êĊd8êĊQĈ ġb6œġâ$O…zħ΀zq–ñçB½x΃zñ\ġâb¨ŸÂeP/€+Ħ^\ ġâ/pԋïàF¨7C½ĝÜġâ'¸êĊŬP/€{Ħ^ü€zñ+xXl B½Ĝ‡zñ”Ĝžzñ;xêĊáEñ'xêĊNԋ]`Ĵ­rŒ­aԋ½`²­rLíaԋŽ0[t†ıNĴ^áepġéë £ĥÂŻİ ˙&@J˙MŽ‚Hé?° İŝĦEè_úWĴ˙X˙ĞĞ˙uX4„ĉDCD¸!t#˜hċъ= IDATps˘ÁBàż ´ÁBàç}Ċ˘ÁBà(KÖùBh°¸ê`,4@ƒ8À! 3óHÇ@ƒ8ÎÌ œ â43Ï4p4ˆfž â#¸Ä%Ĉ_ â+¸ Ä5Ĉ_ âop4ˆ[ŒżÄżá.h#ĦAüîƒħ9< âah[(hż†' A< â·,4ˆ?À ^„ħ#ĵ ˘Œ1Ä0D˜(ÚÂdhí`4ˆ0St‚Ù ĉœâv14ŠÏá2hW54Šoá:h7@£ĝn†Fñ#܍âh˙…ğĦQ܍b3¸Ċ4ŠG Ql A£Ĝž„Fñ44Šßs(v€ÑâÏü?{g'Iuµñ˙s‘Qâîž7 www·žawg ,îŜ3Œğô"„"ÄwwÁ]ß½§¨[uĞşzfV€ùvĞ~½ûaöé=óĜıüĤ‰ÏŻašĝüN|~ÓÄ×áOâ›g˜&ƒiâ˙àŸâo˜&‡ëì ™`ÓŽÁM“—ƒžĤpršB˰R_€WfLjŸŝċ?ŸXá_ĝ—eà_SĝŸÂŝ ÑPĴ ÜPdhˆ3Ñ`&Xƒo7ĝE°Ó@âÛ@ECĵ ,Ìh€ DƒQàĜ0 Ü`¸ĥ FŒ7À˘ĤAƒ(Aƒh‚h-vĜ Ä>ö¸?4ˆíñh·á Ž´÷ÓĦAüĜg@ƒxN„q²½? ÄSp&4ˆ³ĦA<çAƒ¸Ä+ âuh‡Ñ B ˘Ă0 ba1 âCp14ˆEá2ñ1¸Ä'ág ~ âs+h_„߈/ï A| ŝ ‚ñmĝ 4ˆïÁßĊ÷០ƒ˙ˆká:h0ĴA^ ˘!ƒKa‚MÈÔ6ÄMŜˆŸ‰&pC°–Ё6ÄS@iüËÇż2/˙*†Má ˙d˘TĴVòc %?TÊXQòMà’)|É4Ĵ*JĤ–üUĝ…0˘d¸›‹’QàlW™T2 \‚]D vƒi˘%ÑÈĴC3”Äż`O(‰½íŭ~PĜÁP‡ÚP÷ÀÑPÇ@I<ÇAIo; Jâ 8Jât(‰gà,(‰s $^„óĦ$.´?Ġ%ñ&t@ItAI̽PŭP Á”ÄûaT|*PK $.ƒ’ĝ\%ñi¸R|~%ñ¸J| ~%ñU¸Z|ŝ%ñ-¸JâğWñw(‰ÂżÄâ(‰ëb)ˆÈ+ù)ˆ’ƒ+‹0İ*|IĦu¸“4ĵuŝS Q+ù1’Ÿ*eĴ‚(ù&p)^ЉùĝW1ük ˙ïEüO’ ŭ"XcœˆĈ"ğ€D£'p£o7ú@£ï4šÚëˆF£ÀQ 6°\i¸Ñ(p#l'7Â΢v…ŬD#4ˆFh„Fħ;4Š{Ü Ċġ°/4ŠŭíŭA(ħÇĦQiÓĦQüĜg@£x N„Fq24Š'á4hg@£xΆFqŭİ  Qĵ­(.‚FtB£è†FħôA£€Fħ C£…Fña˜ â£pİĝ8üĊ§à§â3p%4ŠÏ/ĦħşL|~ âjh߄?B£ĝüY|ŝ âħü ĊàÚêƒ)ˆT Q^şÑ/Â4*´ eŽ oP„ùĝ—˙T 4‘jŒŻ‚ˆ/˙òñŻbĝ—Má ˙sk´hŠÑ䧀š|¸É/‚5ù@“ï4ù1&óš`cÑd1&ĜB4n‚mE“Qà&ĜI4Á.°Ğh‚i˘ J(š I43ë°'4‰½íq?h·À$†&q'Mâh÷ÁÑ$ށ&ñ0MâxûKN‚&qŠ=žMâL{<šÄËp>4‰ ĦIĵm$ÚĦI8è‚&ÑMâ}MbšÄ`šÄ4‰Eábh—B“ĝ$\Mâ§$>?‡&ñEĝ•ĝ2üšÄ×àwâ{h߆?‰ïŸĦI|ŝ&~˙€&ñ#ĝwġ MòRM~ ˘)ƒKaMÈy`$šÀ_@"ڏFĝ—ùĝ—ùĝ—Má ˙…ï’@ŝ?”\—h'Š`ŜÏ”L%Là%|xYżĥ’ïĴî{o§€âw˘ĈSU`7"m#ĥ5 hĞÂG9èŞ Ö`¸IìÍ"ö€=Ċ^°7ì#ö…ŭÄŝp(‚ƒĊ!p(&‡#đp-Ĥ1âÇp,'fÀñâq"œ$N†SÄİâ48]œgгÄÙpŽ8Îç‹ àBQ†VÑ&.‚vѝ˘KtCè…>Ñ/`P Á°£0&*0S\,.—ŠËà'ârq…ĝİĝ\)~.~!~)~W‰_‹ßˆßŠßÁĠâ÷âââOpĝ³ĝ‹ĝĞĝü]üCüSüKüğŞŠëdXÜ$n–i âvq‡L÷ˆ{e¨xP<¤X N<.KAˆ'ĊS²œxN >(>$>ìĝˆXT|T|L|Üñ ñIñ)ñiñÇgĊçÄçĊÄ_____s|]|C|S|K|Ûññ]ñ=ñâûŽˆŠĊÄââGŽ%Ēb)ħ´XĈħĴXN,/V+:V+‹UÄŞb5Çêb ħĤXKĴíXGĴ+Öë‹ ŠÄĈbħİc3ħıĜBl)ĥrl-ĥql+ĥÛ;v;:v;‹]ğŠŬÓDƒ(9E“cwÑ,Z{ˆ={‰½Ċ>Ž}Ċ~ŽŭĊâ@ÇAâ`Ç!âPq˜pq„Hq”8Ú1]ĝħ8Vç˜!Žwœà8Qœä8Yœâ8Ġqš8Ŭq†8Óq–lqŽ\qž|ÇâBGY´:Ú‰vG‡ètt9şE£Wô9úb1$†#ŽQ1ĉ¨ˆ™Ž‹—8.u\&~â¸Üq…§ŽŸ‰+?wüÂñKÇŻÄUŽ_;~ĝ­wâjÇïpüÑñ'qÏŽż8ŝêĝ›ĝğŽ:ŝċĝ·ĝZÇuŽë7ˆ79nvÜâ¸UÜĉ¸Ŭq‡NÇ]ânÇ=Ž{÷9î8t<äxĜñˆxÔñ˜qÇOˆ˙9žt<ċxÚñŒxÖñœyÇ ŽĊKŽ—Ż8^uĵ&^wĵáxÓñ–›#÷4û1f?ÔìŻ‚höMàfßnö‹`ͰŞh6 ´ÖÍĉ4ú˘Ù(p3l"š-Ú [ŠfĜ~kUĝfĜĦÚꆝE3ì*šÍk†FÑ ğC³hfħ'4C³ĜšĊ~öx 4‹ƒíñ0hGĜÑ,ށfñ(Íâxh˙ƒ“ YœÍâY8šĊ™,^‚s YœÍâu¸šE+4 A;4‹Nh BXú YĵĊašĊG`L|fB³¸šĊ§à',€fñy¸šĊ/ Y|‚fñh߄ĞĊ·á,׈ï_ Y,?‚Bs4à:höĞÍ~ ˘9ƒKä MÈD>ħ 1q%^ġ7 êÈbzğ³púJÈÔ6Ä*ˆDĜż|üËÇż|üËÇż|ük²ñ/˙šÂ˙{˙“1D‹ßnİ÷F0Ñâ›À- Üâ›À-°’hñ=€D‹máçF[` Ñb¸ĥ-F[`'ÑğTóĵ0M´@I´@ì.ZŒT{C‹Ĝ×€q= -âphÀQ"ĤC‹ĝħ}f´ˆìñdh§B‹x΀q´ˆWà\hçC‹xÊ"Ú EÌ"ş Eô@‹XúĦE B‹ĝ0Œ@‹ƒñq¸ZÄ">—‹ÏÁOĦE|~. ż„ñ5ĝµĝüZÄĠ" „q ´ˆÂ_ĊâwhKb Z|Ĵ%ž‚HÄà,Ŭâç [ü"L‹ĉöˆ/˙=€D Ôż|üËÇżBĝ—ùĝ—ĠMá˙ŬŒ˙”Tltm ( šÀ?ôMà%}xıĝĜñ\ÌXË÷< H–€ˆI@˘…˜$ö!&‰á ™$ƒĊp$%ކé⌠q<œ N'ÁÉâL‚3ęÄ$ q1 H´“€4a _Â$ q•ĝ5&‰ĞĊï1 H\#ŝ …ż)&U5HŞj q (2ÁŞP”‚¨J@Q ˘*ɗ€dPµ )_’/)W’/ɗ€ÄGĢÎ$ ùb‹ŠI@ŽŻ)&9-_?p1 H,ábXÖħœXŜħ‚XQ&9VĞÉ$ ÇZbm™ä| ÈMXRLr´(&9öQLr(r&9‡;ŽGŠ£G‹éŽcďÇ:Ž3Nj':N';N‘I@â ǙŠI@Žó“€­ŠI@n| H&9rüZ&9vü^&9qüYüĊñWñ7“€Äż]L78_rÜĤ˜ä¸[1 Èñ€bó% gxÚñŒó% çK@Γ€Š €TÀ–Ï Ñ^:Ŭzİ‘Öóc oïBÍ-ħU5ğ£ş½JĞ&ĜnħtĠÛ]4C ì!ö„½ÄŜ°ì+öƒŭóàĊ<8Rıœ¨˜€}Şœ-΁sĊyâ|¸@\eÑ*Úà"Ñ˘şD·è^Ñŭb@ †1*ĈDĒ‹Ċ%pݸLü.WÀOĊÏd@ :0@FĞ@|TM°È¨š`ò€ü@hÈLÒpŝPh8Èâkâë.ĉˆï8T=g ê85=ç{Î<ħĦĜÈħħĜÄħİĜLlîĜBléĜJl-ĥۊíۋ;ŠÄΎ]ĎŬÄ4Ñà(‰FG“ĜŬÑ,ZÄŽ=Ċ^޽Ċ>b_Ç~bóÄ!.ĉˆ#] Nt1@œĉb€8ÛqŽ8×qž|qBQv´:ÚÄEŽvÑáè]ŽnGèuô‰~ǀcP 9†ĊˆcÔ1ĉ¨8fŠ‹—ˆK—9~".w\!~êĝ™3@ @uÈ<€êyñ nu1@Üċ|Àù€Q…€ó€&kd,ƒ+ÒĤ€ċ§€‚Mà€ Ĵä…0oSàĜ:èµŭUoïC-ƒĞaĥŒ]Š]½uûj Îĥ!Îb0MušÀU@Ѝ Ċ”bEL`èVŒÀ€CbXŒÀ¨ƒŠ˜).†KÄp™b&0üL\IÌW3e€Ħ€ ,Ó@# ۅ" @hÌ&P.—T€ó@•8Uàüc;UàXEĴêb @Ĵċb @ĴïĜ@lèb&°ĜÌħıĜÂħĜJlíĜFlëĜNl/v;Š\ŒˆiN¸Ê”bPЏ(b‹ncbÀ1èr ;FĨcLT3‹K—ŠË\Ì?s\ݘ ì¸J1ĜÙPŒ8ŝ˘&pu(Ĉ·+Ĉ˘ H0…À¤1€zî0…<€` HÉuÉûâ—bûÀĥÄx% *ˆ$ 8ˆ$ *ˆ$ 8¨J@“ÂŞP‚T% ˆT% ¨J@‡¤˜„I@ĠżWcâR @ü“ˆk 9) ĊL° [š“ (ıpŝÈIı˜$–t1 (b.&É$ K‰u\LÒx% *ˆ$ 8ˆ$ *ˆ$ 8¨J@“ÂŞP‚T% ˆT% ¨J@‡äbLŞñ;ÇĠŠ1Ç5J1Ç?cŽëT T 1eK@“6,¸ (À’€Ŝl˙È7½eX~:àc Š1€‚1 H1 ’€Ş ’€rb U@a Ĉ@ĞPÄŞPä“€T¤˜Œ=b òˆ1€¨“€ˆ1€Ĵ¨b)ˆ 4 .4\ˆ¸”ˆV€KI@bq“€ÄÒ.ĉD Àe{Á¨‹1€‚b‹y‘Te‘”­2f.Ċ‚1Ş1€ŞyŠI@ ÈĊ$ ` 4è(Ĉ"@1àĝR Àq³b +Z 1…€B@s€äô˰üPRJ›Àŝ…y€ż qż üĥDHRH ö‚&p•ÄMà8Pa@ˆT% šÀÁ@$’€“€ˆġ" ˆ˜ œïbiXV„‘/EğP”Û˜g@N Êœ?Ş À$ ´ Ĵ˜ œï(ĉ¸ˆ<c ȅ$ ` hW@ÜŽ3W˜(ÄŞP‚Mà` ’€’€\LRĴI@Š™Àù€R mW€|¸:”’€Ò=€ÙÎr€ÂĞ rzÁep™)   Ĵ™€b v'Ş')$‘’€Š›ÀlcU (ÁòMà´¤„I@ŠI@ÄLàH*âċ` ¸x (ߎrsx¸p€ĝ²Kyù)   œ(‚Ġô\ŒD@Br! H) ¨¸ 17Û@UJ0€|8-ı$“€\LRÌŽ$ "@ĵ–0‹§€òM`Çcš+ ÷Nà̐B=€` (hû9èL ?Z—$“€ šÀQ 4‹P'PĈ@sLàH˘˜lc 9)/ÂÔLĊc „Ù €ıÇ\v È<€ĴPVÌÎñòc uI@Î$ ‚&pÍbŞ“¸ Œĉ˜À‘¤bP° ŒĉxJ1€È.’ŠÇ@ÊfšÄ ĵm ™ Ç@ŭ 1’PĴĵ&àŒ‘€Ò=Ċ<€„ œ ‚(‚Рrb ‘ Ĵ” LÌ(.ċÇ@kzŠy¤@ĵ İ”%["›0ಀ˖€\áh<äRPdğT 4Ë(-"{.ĉ$LàœhpD\‘L`—2óŠK@ù1š€‹yJ1€ÈVJʏ*[R6KeÁrb ŝ*ˆ€ œSËñÒ1PĊ@½Pd+eçÄ@# q1²@0—€ `"P"šäÁâ&0)-^›w<Áhœ¸ œSËñÒ1PcġJ@‘ ìR&pN 4bn\ @Ù K@ 0 (ÍñrŠ`qX)-^›ÓĈĠHWáÓPlbfĴĤˆúWâ’€˘@– œŬ M˜Àé@½P:šäÁ‚&p<Œì0—€W  Ĥ€â&pNĴĤˆĈ—Á”€˘@– œŬ M˜Àé@½P:šäÁ‚&p<ŒìhĥĠŜTct°N)t'pNĴĤŽ”€‹{‘ œ3&À”ˢh– ġÒĞ J@‰hM §–6ƒ) š=€ĝ `ÂÀĠb.{äôÒ) —’€ò‹`5=€t ´ äb1` 2³b q  0—ˢh– ġÒĞ J@‰hM §–6ƒ) š=€ĝP- 9f×\ĦìhzDö/Ä(ä›ÀYbMà TÓı ˘^³ ˘.˜˜1€ (Ŭ.è‹`5Màt 4Ĝ¨wĜ”€j‚pÙ1ô*ˆ  /‚ô‚Mà, ÈĊšÀA ¨Ĥ \sD½ gD]&°b@Är$ t¸ ,‚Ġ4Ó1` ŜU“)ݞ&p°–ށĉ¤€Ò&°R1 ŒĤ›ÀA ˆ ¨  œ(‚WAŒƒDĞ ²Š`MฤZP˘ œŽĉxé"XN§€jĈ@ݧ ̤WO8XKÇ@sR@iĜb A M7ƒ2$ ‚&p˘\1­‚È*‚4Ğ%%šÀéhސ.‚Màt ¨f Tġ45;<Ġ_ ö²R@ʐ€‚E° M,ƒ+"%zù&p‘"Ĝ¸@Í"XÎêäH@éepÁh,‚e­‚Ĥ€&Xcĥ1W,ĜÈJı (X zY1Ä2¸"P˘o)‚›Ô,‚MàĴ@Ž”^Œĉ{Á"XÖ*ˆ` h‚E0Ín¸È:è` ÍZ‘cç{ÁhÖ2¸´”X‘ĠĈ@É0'ÎE°ĴhN ½ "-%–ÁeĊ@kzY&ppDV 4§0ïŻƒö‚1ĴU9&pŒf-ƒKK@‰UY=€` T&Ä@˘–Íé¤WA¤% Ä2¸ĴhM ˂Ȋĉôĉô:èœm Á]@µî.”Ê2kzù1šPÖ*ˆ´ íŞDˆĤwMàà6"PN 4ߨig€rb Y€ış 4¸ (ЏÖLe™À5=€ühM (kDÚŽvĠŒN"HÄ@Óğ€Ò&pph ('šïÔ4³R@91Ĵ ya¨j5‹§€jšÀĊ=€œ&p½PÎÚ4ğ@pP¸ ”ĠËÈ7 Ĥ€²soDPrµšÀĊS@5Màâ@N¸^ (hgíšŬ ¸ ¨ˆ \PÊj×ċä›ÀS@Y@óĉ*ˆxXµz9PŽ \—ßΗ€‚=€â&œa9&p‘@–l×ëÔeçbE°œ&1żcħ }b!ÇÂbğŜĊîpħ]@.ÖŽÁâ=€x 4Ê2‹{‘€ĉà˜á8Ŝq‚³+!ír~,uŝ*ˆ, Ĥ4Anïh0A ¨Ĥ4ğ€{ñ&0ĥ ğŽ‚£a:?f€&î1³R@éhş@Ş LlħuĄ„ċ’x^ŻÂkâuxCĵÉğ…LPŞéMàĝ. ù=€xXĥ Nv'°8J-Ĥ‹cď5H@÷Š˜ÀY) t 4ŬPŞ ĴĜ. ĊÖA+v%¤xÁñ˘xÉñ²xĊñŞxÍñşxéMé-§wĊxGK@š’€ĉŽïh ÈMI@sŒèU§×œ^wš—À{ÜžÀ” NJ2Ìe8ÁŝÈɢ §Š2|Îe8K”áûÌù˘3Ëâ"(‹ħ„I@eÑ e[QCP6 ¨,*P‹5­ \—CÙb eñs(û@Yħeß.‹żBÙo—ŭP9Îl\Ù_]öo+Ç% B÷@9îà÷"Ŝobœ˜ĉ ` êÁÈ~’Ċ Ğĝß‡!û(Z†XĊżL­â_Ĉ€Ğĝ—߃İâ?ŠAWñ/–†ÉÇżX n”á_Ĵ·É/ցğċ_>ŝĊ¸|üËÇż|ü‹ĵ&˙òñŻĝ—Àżĉ ŝUŭèŬ˙q €Ô. VżÖê÷Z ÜÖê›À­ Ü ˙ċà:XA´ÂJ˘n†UE+Ĵ.ZáX î‚uD+Ü ëŭ°Ħh…‡`x6­°…h…'`kÑ ÛŠVxv­°“h…aWÑ ÓD+”D+ĵğ‹Vh­à`/Ñ ûˆVxì/Zá@Ñ €CD+&ZáÑ*ZáhÑ ÇĜq˘Ž·ŬI˘N­pš}ĉLÑ gÛy˘.°Ç*hĠ, ¨UtAĞè˚Ô*ĦĠ$ V1­&µŠKĦUüDĴg1Vßhġ{­ Ü*Vßn•w@Ğż ¨5¸ 4q€%dkœ@Ğĵ/ÀÓsdx"Uñ €ê?bt%j˙ñû0äo•á?ş݊˙hJ˙b9¸N>ŝċ_ĴwÉ/ևûeĝ›À#òñ/˙òñŻŝċ_>ŝċ_ġ_s˙š…÷žÀ˙d €şnm~ ¨Í_Ñĉ›ÀmoX…ċDÜ+ÂM°²hƒ[a5¸Öm°–hƒ{`]Ñë‹6x6m°‰hƒÇ`sÑ[Š6xĥ§a;ÑÏÁŽì,ÚàeĜ ^…э˘ Ŝ‚fÑ{ˆ6˜öm°Żhƒ…áщ6ĝ*Úàpу£DLmi8V´Á Ñ'ˆ6Ñ'‹68ĠÏmp–=ž+Úà|{,‹ĥ˜ Ü&:ĦÍ$ 6Ñmb@ĴdP›Ğ3Kj—@›I@mâ h³h›ĝ´™&~mĉ´‰?@›_kó›Àmŝ*ˆĥx Úä] ß/‚A›Bw/ƒ›ĞàSŝĝĵ?ĵ ‘Şĝ@˙Ñ2Ä*ŝ£ ‘ŞĝËÀµ2ü‹á&ŝĊjpğ|üËÇż|üËÇżĜž–á_ì/È/vƒWċ_>ŝċ_>ŝċ_>ŝ5à_³ïŜ[ĝOyò€r/„QnXı1` (ßÎ÷Ğ 1D¸H (żo篂ÈñòWAÔe§WAO%šÀ‰hdç{ù&p~ ˆÜıËàÂà{äzÎ÷\î…0.· ìrc ÁP œï$VA$b ‰&p‘P~ ßÎ_‘䯂¨ËNŻ‚¤€T‘f:%S@‰&p"™Àù@ œŸRn@ıËàÂÈ÷4q`" )ÚŭPğo·û&p;\Ë °ĵh‡›a%¸VípĴwÁš˘î…uà~XO´C°Ħh‡E;<›‰vĜB´S°µh‡mE;<;ˆvĜI´+°Ğh‡i˘Ŝ„FÑğ‹v˜öí°—h‡…`_Ñû‹vщv8Äíp¤=NíY8V´ Ñ_‚E;œ,Úáëpšh‡3D;|Îípŭ%ˆv(Ûcġ7 vë´‹h·Uíbڍ·‹1h7 Ü..…v[×.~ íFÛ} ´Ŭ×@Û} ´Ŭo·û÷´ûğ€ÚċŬ ܞ‰ÁŝÀĝ€b=Ù/@PìJTÙ/@Pl–ì ˆD÷aTñm­â?ŠAWñ/‹AWñ/–…dĝ+Á­2ü‹Ġá.ŝĊ:pż ˙òñ/˙òñ/˙òñ/˙òñŻqá_>ŝċ_>ŝ5Yĝ×,ü뽎˙I˘/‚uĝ=€Ž|ÀLàßî€kai¸–pĴ·ÀJ˘n‡UEĴ.:àXKtÀ:˘„ġE<Ác°‰è€'`sxĥ l#:`;Ñ/Ž˘vì&: At$: YtÀ°§è€½E‡è€ŭD|p°è€Âa˘Ž)8ZtÀ1ö§Žpĵ=ž$:à{<]tÀ™öxŽè€Àù˘.´÷m˘ƒ·—Áuˆnè°@‡€ğĤCŒB‡€:Ä%b}kwĝ1[Ñ!‚ëtĝh‡ż ´7Á:|Ĵ#M\ ÏĴ@Gœ@Gœ@‡ĉPĊ4Şĝ@˙ħ-D&p‡owÀµbi¸^†ħÜ"ż|üËÇż ˙b#xL†ħ9<)ż|üËÇż|üËÇż2/˙òñŻÉÀżĈ‡UcSĝŸĜE€èôc ~ ´3RĝNc×ÁÒ˘n„ċàfXAtÂm°²è„;a5¸ÖpĴ Àş˘† àQĜHtÂaSÑ ›‹Nxĥl /Àö˘^†D'ì":á ˜&:Ħ$:ÁÁî˘ZD§è„½D',ûŠNĜ_t‡á Ñ ‡ĜÏêpÑ Gڟš.:áópĴè„ö³:QtÂÉöħÓD'œag‹N8×/°ŸUĞ脋ì}ġ7 NëtŠ~è´UbDĴeP§fĊ@;ĊeiMàND§ĵ+!;Mí€NÓ@;}ĴÓ7Á:ċï²Dgĵñ"t&šÀĝğ€˜µ ´SsjT˙McàÓŝ˜%V˙Meh˙Ѩâ?6"¸ÓLàëdĝËÁÍ2üË/Vƒğeĝk2ü‹ àQŝċ_†ħ-ĵ ż|üËÇż2/˙òñŻ üËÇżĈ…ĠÄżfáßMá|@tkw[×ċ§€şÌî2p-,)şàXn‚ċDÜ +Š.¸Vğ`5Ñ÷šp?Ĵ-şà!XOtÁ˘ ‡Eü6ƒ§` ÑÏÂÖ˘ ĥ]ì şàUĜYtÁ˘ Ŝ‚э˘ ĉ‡fÑïƒ=Eì-şà°Ÿè‚D, ‹.8Tt‰.8BtÁgàhÑÇĜûDo'‰.ĝ&œ*şàt{–è‚sìñ|ÑÚc›:DWĴ%ú Ëz]&u‰1è2 Ü%.Y¸Ë<€.ñsè2 Üċ÷şä]ÓeE°.ßëòM°.3ÁşüDW˘€_³;ğŝxtiò@˙ħħà¨â?6ì€(Ôċ§€şÌî2ĝZŝĊ2p“ ˙2ü‹Uà.ŝĊšpż ˙òñ/żĜ ž’á_>ŝeĝ—ùĝ—á_>ŝċ_ĝW1ükâĝ×,ük ˙³IŬ=€nż”€DwF0Ñ ×Rp#,#şáX^tí°Ü Јn¸V‡û`MÑ Â:˘ġá1ĜPt°‰è†ÍD7<[ŠnxĥŬ°è†W`GÑ Ż.˘vŬ (‰nhŬ° ´ˆnXöŬ°è†Áŝ˘Ŭ˘ŬI8\t‘ö~şè†/Âħ˘fˆnĝœ(şádûĜi˘gŠn8ÛŜŸ'şá{lµCğè†N{ì½m&p·I@ŬbşwÛ2¸nñè6 ÜíÇàş-×ík ŬÚmhw|tËżĈRŬ Çàşŭ\wb³rŬ ’&ÄÀ‡‚ Š˙ĜˆzŬ~ ;­â?–šµ ĞŠħÜ(ż ˙b%¸S†ħ:Ü'ż ˙b}xL†ùĝ—á_>ŝeĝ—ùĝ—á_>ŝ•eà_>ŝ•Ġ‹uWßLáœ@ôdÜ“Ñî šÀ˘ÇöX ¨ÇOġ˜ Ü×Áp,%zàfXVôÀm°Ü+‰¸V=°şè`-Ñş˘Ö=_ĜHôÀ“°İèÍE<[‰xĥ=°½è×`'Ño¢Ĥ‰˜Eì.zDì!zàŭ°·è}íŭ˘>‹8ÔŜ!zàsp´ècìŭq˘Ž·Ç“ìpŞèÓíñ,;œ+zà|{,Ûá"ÑöĜ-zÄŞ–ƒî1 ¨GŒˆu÷î—‰M­ Üc¸Ç_ŬchŻöÈßj&XO"dğ€zËà,×£ìtè ĵfR@˙éPĊlDE°żĊ@{üh³šÀ=Ñ2DŝeĝKÀ 2üË/V€;dĝ—ŝċ_†ùĝ—á_>ŝeĝ—eà_ĝWŝ5ûŻYĝwSĝŸà˜ôè šÀ˘7Ċ‡%D/ÜK-p+,· ˘á¸Vƒûa Ñ ÁÚ˘…ġàqĜ@ôÂ˙`cÑ Of,l!záĜZôÂ˰ĵ ;ˆ^xv½ì&zĦAôÂ$za!h½°§è…Â>˘>û‹^8PôÂ'àÑ Ÿ†E/)zá 0]ô—áXÑ 3DŻè…E/|N½pš½?SôÂbpŽè…óìŭ…˘–…6Ñ íöKôÂŞĥ ˘×(pŻQà^1½F{-Ú+.‡^£À½ĥ ˘Wü z÷šÚĞĜ6Pè5 ´×7ÁzÍëġS½f‚ġĈ×ACŻ zú@ŻB_èUè ½Şo,œ1ÍŸÉQ ¨7Z‡.ÏîġS@‹ġ2ü‹í?ˆċàvŝĊÊöÄjpż ˙2ü‹ġàqŝeĝ›Á³2üË/ĥƒWeĝ—á_>ŝeĝ—ŝċ_†ùĝ—á_ĝWŝ•İMô*…Má?˙˘/JÈZ1ŒPŸ™À}p#, 7Ò˘nƒċDÜ +ÂŬ°²èƒû`5Ñš˘uà1XOôÁ°Ħ胧`x6}p0MôAIôÁû`wÑ‹À˘ö}aĜWôÁGáщ>чŠ>ĝ,!úà({ŒŽ} 8AôÁIöŝTÑ߇3Dœeïϵ˘Êöx‘:EtÛcÔè3 Ü'FĦÏ(pŸQà>˙Nà>£À}~ Ï(pŸi }~ĤÏ4>ßë3Ĵ/#ÑŒÁĊŠ0} Wáû¤ÉÀ@˙éPĊhD) ŒPŸ™À}p£Xn–á_†ħ"Ü-ż ˙2ü‹uà1ŝeĝ›À32üË/˙2üË/˙2üËÇż ˙ÊÀżjá_ĝWŝ5 ˙n ˙Á úk­‚èϸĤßb ŭÁ¨è7¸?Ĉn€ÁM°¤è‡[aÑwÀòpĴ(úá^XEô°şè‡‡a-xÖŭ_X_ô“°‘è‡MD?<›‹~xĥŭ l+úa{ÑoÂN˘ğŠ~˜D?4Š~XšE?|öŭ°·èŭ°Ÿè‡˘>‡ˆ~8Ì>p¤è‡/ÁtÑ_…cE?̰œ(úáğpŠè‡Óìŭ™v8GôRpè‡ í}›:D?tÙcŻú÷‹è×, Üo¸ßšÀŭâ è7 Üo¸ßŻÂ÷î7 ´ßßÚohâ>ĞÂ÷› ÖŻp ßbpŭ 7!ûÛ@_è×Ä@˙Ħ5ûƒMà*ŝeĝOÇ@Ğĝ—áßR@7ˆÁM2üË/–‡ğdĝ—á_†ħ<*ż ˙òñ/ż ˙òñ/ż ˙òñ/ż2/ż2/ż2ŻZĝ—ÎŭšÂ˙„?ݐ¨µ t §?p#üH À-°Ü·²p',/àXI Àŭ°Ş€‡` xÖ8Ĵ+ఁ€§acx6l!àeĜZ Àk°€Ä;‹˜v° ”Ä4‰x?´ˆĝì%`QĜW Àŝb@ ÀAb>‡Šĝ<!à(ûÀ1v8N À·à1'ÙûSíp†€ÁÙbε÷ĜĦĠíb:íħÇŭFÄ0 hÖ:è£ÀFü aŒX n q€i Ĥ$šÀf‚ ˜:¸ 4 $îHaŞÂ‡/Nx| ÖˆŠ`Á"X,4àÇ@£PdÀ2ü‹Ĵ ½,Ü)ż ˙2ü‹5àŝeĝ—á_l ÏÊ/ż ˙òñ/ż ˙òñ/ż ˙ÊÀż ˙Ş…ĠÂż8[š…7…˙IÀ=@ ôÄ`­蠀Í4pÜ KÀ­°”„;`Y1w báxVƒ‡a 1ÁÚbž€ġÄ <Â3°ħ„ça31/Á–b^…mÄ ĵۋAĜQ ‚ƒ]Ä ,ÓÄ ,bvƒbö°ŸÉŜb>û‰Aĝ$(á`ûäaö39R ÂW`ş„ŻħbfĜ'O´)ö39] ™öŝ;œo‡²„•à"1öÛ}v¨ŝ4hĞ 4 <è_ ?hx4AÓ@} t4AÓ@3L°A3ÁÍ ĈàbE˜A…šé/ j²@ġß:wD=€AÂà–´ ™Àƒv!Rġ?…%àVŝeĝ—á_Ĵl˙)ĴË/ż ˙bCxF†ŝeĝ—á_>ŝeĝ—á_ĝ—á_†eà_†ŝU ˙ŠŻA1¨lük ˙u\ @ 4ĊĊ@‡j6áFXL Á-°„‚Ûai1wÁrĉú÷Êb‚ĠÄ< kŠ!ĝ/Ĵ#†àIXž† Ċ<›ˆ!x6C l%†àuĜV Á[°ƒ‚ÄÌğŠ!x4ˆ!XšÄ|ZÄì)†Äì#†à°ż‚OAb>‡Š!8Ü>y”Žħqb'ˆ!ĝ?8Y Áİö3ìpĥÎC°<\(† ĠŜ·ÛĦ˽vCĵ}!̐Qà!£ÀCF‡,7äÇà†Œ™:dèPâF0+ ™:d&ĜPbİKá-7d)ˆĦ`&´ k(q%䤀hÜPp\¨6d1ĦŒh”úÜ(ż ˙2ü‹ċÌġ]î—á_†ŝeĝëÓ2üË/ż ˙2üËÇż ˙2üËŻ üË/ż _†ĊñŻYĝw!ük ˙Â˙Ä$ 1lĞ † oĥ谀†Í†›aq¸nƒ%Ḗğa91 ÷ÁŠb„UÄ0<Ğ‹axÖ?Xž‚ġĊ0< ‰ax62l!†á5ĜZ ›°ÁŽbv° ì&†aa(‰aĝì.†á°‡†ÂŜböb°Áb‡‰aĝ2)†ák0] 7áX1 3쏜h‡Sìpş†%á,1 ËÀıbη”íp‘:íc‡~1 ƒö8lxĜ(°Qàa£ÀĤû1¸a£ÀF‡M6 tXŝÀĝÂÀ°™`f‚ [ b8ƒ 5!‡­3Ĵ6ÄÙ6˘UVÎhÙ@ĥ°™ÀfÍbq–4Ex¸[†ŝeĝ—á_†ħ.<%ż ˙2üË/ż ˙òñ/ż ˙2üËŻZĝ—á_†ŝ•ƒ ‹aŝeĝ×ŝ' ˙“#VħÀHÍûàûpünĊĊÜKЏ –#p/,/FàXIŒÀ°ŞÇ` ĝ/<k“°g`1ÏĈb^‚ÍÄĵ [Šxĥ#l/F`>ĜIŒÀ.bDŒÀ41ï‡F1‚f1‹Âžb>ûˆĝì/Fà³pC„Şî IDATì/9ÜGÙá;'Fà{p‚ÀÉb‡ÓÄœaŸ<ÛçÙáB;´ÙĦŬvè#0`FGŒ1 œ Ĉ`18YŒÁpšƒáL1ËÁ9b V„óĊĴe1ĞEb :ìŻíĥCŸí0b‡1£ÀcFÇŒ3 ˘†&QB‹¨À'`/QO˘ŸƒD‹ |ĝ:)*-˜.*]8VT`†¨ˆ œh‡Sìpşβıv¸À­vh·C—zí0`‡a;Œ˜Z1 ´bhĊ4Ši 3Á*f‚UÌИ VħDĊR‹ÁU,]ħ"LĊšĞÂWlbĊnDŞT/„JġRx¨ÈUüË/ż ˙2üË/ż ˙2üË/ż ˙2üË/ż ˙2üË/ż ˙2üË/ż ˙2üË/ż ˙2üË/ż ˙2üË/ż ˙2üË/ż ˙2üË/+*šÂ˙ÜÁ˙<ÁŞżû˙À~÷_î‚ğaI¸îƒe,ñı<< ÀJ<ĞŠ™?XC̄§am1žƒġÄLx63áĜD̄×as1Ŝ‚­ÄLp°­˜ Àb&,;‹™~ĜM̄AĪEaw1>{ˆ™)ŝŸ½ó³£ŞßĝçĊŽÊOQTz¤“‹Ħwi"]é½#‚`ùşWB–mW\ ĵ€u³€²ËïĉËïáËïċËßԗż…/k_~ÎżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżÌżt‘¸{ıvŝ?Lŝ?@4xPƒg5À<è&`>ô ô $l*àĜB4À³°µh¨oĝ'ĵ;ÀżàeĜ^…n˘^‡=Eĵ {‹xö 8@4À'á џCE,ß E8R4À—àÑ_E| N °2œ*DœaqĥĊıç[\hÑúŠè‹è —Šè WˆĜ  °%üB4À6p­Ïp½Ċż³¸Ù⏷YüÙâ.‹?7ĝ¸ÁÀ ĊWBfÛáŠÑàhƒc  ށ68ÚàA°‚5xĴÁƒ` kG·Èĝ—ù—ù—ù—ù—ù—ù—ù—ùϋ>žƒíìmrŝeŝeŝeŝeŝeŝeŝeŝeŝeŝeŝeŝµèü+ç9 ‹ÌżÌżÌżÌżÌżÌżÚù_šÑèu^Xñ tqßżğûŝ=Ŭ÷ï-áiĜL4Âß`KчmD#ĵ}D#ĵ;ˆFxvüv‡˙°—h„·aÑÀŝ˘>ߍi8X4Âçà0Ñ_€ï‰Fĝ?8J4ŠpĴhp‚ĊÉĞÁé˘ք³D#ĴçˆFX΍°!\ Ħ3\äŝĜâ‹Ë,´¸Úâ‹>ph„àעv†ß:÷÷·XüÉ⋿X4ĝ¸ÑÀÙ#pÛ 1Äht ´Ñ1FÇ@mt ´Ñ1Ĉ,Z\ ż°YžÑèipZ€Œ™™˙²Y@Š.îúuwׯ§ïüœ™™™™™™ñħğƒż9˙2˙2˙2˙2˙2˙2˙2˙Z ˙2˙2˙2˙â<İ6”ù×{ĉ_ĉ_ĉ_íü €hòVM‹M0şˆ&˜ŬE<=E< OÁ& ü6‡gá9ĜJ4Áó°­h‚a;Ñ/Ž˘ ŝ ğˆ&xvM&ĵßM?ĜW4ÁrmÑŸ‚E|My8\4Á p„h‚/Ñ˘I4ÁJpĵŻú$_ġİ˘ ր3DĴ g‹&XÎġÏ·¸˘ôM.M .M°)\ábWYüÂâZ‹ë-n´Ĝ n²ŝƒĊ­·[Üiq·E“›ÂKá›mr ´É1&?7ù¸IéB˜ĥŬĊ=äA°&‚5yĴI ›—΃nòB˜&}Ĝ @F‚Ì˙ÂÖÔ€Œ™™™ñ”ĜÄW½ı—˙äüËüËüËüËüËü‹·dŝeŝeŝeŝeŝeŝeŝĝ—ù—ù—ù—ù—ùçJM˘IeüËüËüËüëŬòŻvŝßż@ôón ŭ%$úyh?Oíž²W÷ŭ7ŭà ĜXôƒ§aÑŝ›‹~wĝl /À?ᛢü ĥŭàUĜIôƒ˙À˘ĵ{ˆ~6ĵ{‹~ ĜOôƒO¢|ŭ`y8Tôƒ/ÂwE?ÑŽ´ĝ*+úÁ×áÑV“E?XNsħ3-oħœ'úA'¸@ôƒp‘slq‰Ċe[ÀÏD?Ĝ~nó—×YüÚâ·{ÂÍÖ´¸ÍâÏwY4fB4gûĦ‹èçh??÷ó#pżĈ@û9ÚÏ1~Z¤Yŭ< ˘Ÿĥ&] ÙOHñ/󿰕À9˙2˙2˙ž”ġŭğşïŸó/ó/ó/ó/ŝ!ĥöďœ™™™™ñŽÌżÌżÌżÌżÌżÊĝ—ù—ù—ùW)˙Ê Ú@ĉ_ĉ_‹ĈżÌż“µó˙!ŽˆĉEÍ0şŠfïô}˙^îûo*šá9ĜB4ó°µh†á%è/+°ƒh†×`gÑ ˙…ŬD3ĵ{Šfĝûˆfĝì/šáÓÑ ŸƒƒE3|ÍŜ#D3|ŽÍ58N4Êp˘h†ĠàÑ,ša-8C4şpĥh†ph†Žp‹]hħôͰ1\,ša¸ÔıWX\eñM¸F4ö+›7XüĈâ&‹½áë?YÜañ‹‹ĉì•xb4û¸ÙÀÍ~nV-Úìh³c Íށ6ĞdĴك`ÍkւĤÁ5{\³ĥ^ĵÍz€EÙ (çĦÓ@3ŝeŝĊ˘‡oĝ^ásŝeŝeŝĊK˘oĝœ™™™ÌżÌżÌżÌżÌżĝ’ÌżÌżÌżÌż˙2˙ÒÙ˘YtùW˙2˙2˙Z ˙2˙Z4ŝµ˜üëĊ˙"7˘˙˘­îżÀŬ@û{h÷ŭ;ğïßÍq˙˘?< ½DŻöÚÌ}˙-Eĝ'l#úż èïQßá?:ì"ú›°ğèïÀ^˘ż/v_Ñ>ßŭá³p èŸ‡CDXŭEXŽŭa%8Fô‡oÀñÎ=ÉbM8Mô‡uàLÑևï;÷]àÑşE6lq‰Ċĉpıè[ÁÏlŝÜâ—;Áġ˘?ì 7ÚüĊÍŭáVëÛ-î´¸Û˘)ÙGüÜߏÀŭ³GàĥípĊ(èïhÇ@ûĞd!LÇ@ûkA³ ú{D-ht-l3,ñ ôגk2ŝÚdüW­Èĝ—ù‹ÎîûwsÜ?ç_ĉ_<+6sß?ç_ĉ_ĉ_ü[ìè×?ċüËüËü‹ċdŝeŝeŝeŝĝ—ù—ùW˙2˙ҙ˘żX_eüËüküËüküËüküН˙÷ġ @ XÀ, 1 ì Ûç§³A71À}˙žîû÷à9ĜL €çáĜÊ}˙mĊxĥà5ĜQ ¨ïbĵ {ˆ|K •î'Àgà1–‡ƒÄĝ"*ˆeĝž_…£Äĝ:ëÜUáD1րSÄXNwîYÂıbt†óm^hÑúŠ.`3¸ÔıWXl W‹°\cóW7Xìżµŝ½Ċ-à6ë?[Üeј 1 <#€ìX ƒށ#€ì8Ŭ k€c ÊÁxl€4 n€´f€ĥî’kVX@ñ_µ,ż0 4ëëċüËü‹§DO÷ŭsŝeŝĊ b+÷ŭsŝeŝeŝĊ2˙2˙2˙â“2˙2˙2˙ üËüËü+/ó/ó/.,—ò/óŻ2ŝeŝeŝUĈżÌżÈżÈżÚù_Ü@´,p3¸–Œˆ–²i -žÚâ÷ŭğ‹xzŠ÷ŭ7qßsÑ˙„­D‹g|~S´Àża{ÑŻN˘Ċ£ğ‰ĝì)Z`9Ĝ[´ĝ2÷-9ĝŽ/ó`ÑâË<\´ÀWà_ĉÑ˘E´À*pĵhĠá$_ĉİÎ]Îôe~_´@'ĝsğÁ˘zÀE6lq‰Ċ–pıġÏ,~nħ#\k}½Ċ-p“ġ,n̈́h;,ŝbÑr›ÛÎGà–0 Ċ1–²h‹c -*kq ´E%³ Z<ÖR6 E Z Ù˘êZôn€ ŒŞ £j%pFah‹[|ŸwñeĉüËü‹gĊ&̜™ñ²ÌżÌżÌżxKĉ_ĉ_ĉ_|Zĉ_ĉ_ĉ_|Iĉ_ĉ_™™éTѲ-°žÌżÌż˙2˙Z ˙Z ˙Z ˙jçQù—ÛA\À€X ‰éÀ|èè}~şˆîûoä˙Ĉb <›ˆîûo!ÂK°µŻÀĞÇ3>wá ĜY ô¨ïîb öᓰèküĥŸ‡Ċ@XĊ@X+ÂJp¤èk˘Ú4¸~b èè@Ġ t t`Ù Ĝ@-hÜ@•̃¨-…¨ŠWâ½ÛàóĊ żj+ˆŒ˙şu˙a|ÑÑqŜœñ”ĜÈ}˙œ™ñ‚ÌżÌżxUôñŒÏœ™ñŽÌżÌżÌżĝĴÌżÌż˙2˙2˙be™™éd1p9Âş2˙*_ĉ_™•ñ/óŻ2ŝµĝüН˙÷iX *{À ²w‚G £äWŻġŬH rßż—ûŝ›ŠA^íµûŝۈAoè#Áë_ĜQ ‚·`1È£{ˆA ĝ–Ÿ†}Ċ 1–‡Ä ĝ"$ùƒàĞ=1Gù#ĞÂqbĴ'Ú\Nƒ`}8fGĝ]à6hħ1\dŭc‹-à§bl —Ûü™Ċ ëk-v‡Ĵc1~o}‹ĊŸ2!ÁŸ-î i²îo10{ƒaİäè •l†5¨llJfA ò Ĝ •Lƒ¤’…0ƒT½Êûܔì”ñ_·,żnhĈżÌżxBtġžó/ž½|‡çü‹Ċ–îâċüËü‹˙ÊüËü dŝeŝĝ—ù—ù_–ù—ùWà_ĉ_:Q ZŽA°ŽÌż˙2˙*_eüËüĞŒ•ñŻ2ŝµĝüëÈE ZËŜÖZlDkÙB°Ö²Ŭ@[@Ö÷ï$ZáIè*ZŬ÷ï!Zá9è%ZŬ÷ßL´ÂK°huß[Ñ ˙íD+ĵoÂN˘Ŝ]EĞŻnOÑ Ÿ‚½EĞ›·ŭE+|#Zá˙à`Ñ*Zá+p¸h…ŻÁ6WcD+ĴÇÛ\N­°œfsC8K´Bg8Çfw8_´BO¸ĉ&W´ÂĉpħÍK- WZ_mħ3üÒú:‹V¸ÑúwÁüƒġ­Áĵú/ ™­lÑÌV?·ŞĥnЁ[C ´Ġ1VĠÁZm ƒ`­k-›ÑZ6 µl!LĞJ6jUá€V-Zñ_×dü×5˙……`­Ċu˙ž”ġŭsŝeŝĊ_eŝeŝĊ 2˙2˙âU™™ñĤÌżÌżXNĉ_ĉ_|Nĉ_ĉ_™ŝeŝEër´ÂÚ2˙ üËü+/óŻÀżÌżÊĝW˙*_eüĞŒµó˙An!§OÀb°ûŝŬ÷ï&ğïßÓ}˙Ŝb°ûŝ›ğïż• ˙†×à›b0üĥƒá-xvƒĜM öí%g`1Ĝ—öm1V€Ċ`_ÚĦb0Ĵ߃Ċ`XŽƒa58ÖĉZp˘ ëÂ)67€3Ä`ègÛì?ƒĦüfo¸ÈúÇ[ÁO­/·Ĝ²ŝ…Ċ`ĝ•ġ Áü­ġï3!-n ĉw³ŸĊ€`ĥ=Vm)üà²èಅ0ƒËÁĞdÄ`ĤÁ•΃.] YşbzĵħÈ ÀgË€˙+kJWÇuƒÓi Èü‹'Dg÷ŭsŝĊ³˘§ûŝ9˙âEħıûŝ9˙â5™™ñĥÌżÌżĝ¤ÌżÌżĝĵÌżÌżXQĉ_™éX1x9Z2˙ üËü+/óŻÀżÊĝW˙*_eüН˙Ċ˙Ŭ6bHÙKá‡,ìCÜ÷ßûûwCÜ÷ïîµ=Ċ÷ŭ7Cà%Ĝ\ qßk1Ä3>û¸ïżƒïÀ˙`1–ƒŬĊ_×·Äĝì+†ĝşCàKpâë:L ñuáë:Z ñu/†À:p’?ĠNC #œi³+œ#†ÀFpžÍ^pĦġfW -áb›ÛÂeÖWZì?·ŝĊ¸ŜúĈLˆ!pS(p‹ġŸ‚ùgëğ§š,úsPÛ§Â4¸!!:Ä1!Ş-„âèĠÁ†¨d)ü²YCÂ4¸!*Y3D%Ká‡èƒj2Nꀌ“B§ñ½Ħ§÷ċü‹żŠîžßó/^ù—ùŻÊü‹×E_WÎżĝŸÌżÌżĝ´ÌżÌżĝ˘Ìż˙2˙â2˙ÒÑbˆC[9˙ üËü+/óŻÀż˙2˙ üĞŒ•ñŻ…ñŻ2ŝĠÎ˙ûżlhĊB°lµ×†b¨ûŝ]ĵÇgw1Ô}˙ĊP÷ŭ7uß 1Ô}˙mÄPĝ/ôCŬ÷ßQ …ì˘vCᓰ‡ê‹Ú[ …Ï~b¨ ˙ßC}Q‡ˆĦ58ÜV#ĊPXŽħı6œ`½>œ"†Â†pşÍ.pĥġı­7…‹Ĵlħ üÔz;¸B …á*›Cáë_ó×A˙Îúĉ`Ŝj}{&ÄPĝK(hŬ ´ls 1Ħށ 1Ħ*Ù qhZ6 b¨ ÓàÒyC‹ aJ÷Bù@€’½€Ò…`CËÖĴïÀnÎżxZtq`7ç_üCĉ_ĵ(6uß?ç_ĵ&ó/ó/Ŝ–ù’ù—ùŸ•ùWà_ĉ_|Eĉ_éH1TĴÀż˙2˙ üĞŒŝUĈż˙2˙ üĞŒŝUĈżĈż>Ĥü/B †-l/ a Ŝ T Ó@‡ıïßÑïöê"†ıïż‘ĉ/Ï÷ßT sßK1Ì}˙mĊ0xĥÜ÷ßI óí&†Á§aO1ÌW´O¸˘o‹ae8P `%84\Ñ÷Ä0X Žrµà¸pE'‰a°œêáLëîpŽ=á<››À…Ö[@_1 ĥ†‹möËĴŻ´?úZëë3!†ÁoBß[ß Ü Üi}w(/è‹Ö` 1a~b ÂB˜aeƒ` Ĝ°²YÂ4¸aĊyéJÈaĊ½PÒb Ó{k2Zd´€¸`X˜:Ì·tG_QÎżxNĉ_ĵ zùŠrŝĊĞ2˙âu™™ñ?™ñ ™™ħĵÌżXAĉ_™ħ²ô=1LĴĤÀżÌżXOĉ_ŝeŝĝWà_ĉ_•ñŻÀżĈżĈżÚùObĝÂV놧OYßżƒg|vŬ÷ï*†ğïßûüôŬ÷ßL wß+1Üн)†Û°½î˙Îb¸/gw1> {‰áb8|öŬž †ûráëp˜ Ż Gˆánώa8Ŝ:ÀÉ֝àt1<{Ç=œ-†C8×z­7‡‹ĴlñMĝİġp…ġU™á‹áp]7Z˙.ŝC('ë;Bğ‚n …X †Z€áe1á!:< ‚ WÉ~èU›1ĵ¸V:zx˜=ĵ¸2Ŭ k¸ oDz ÀÚ€Œ˙BW놧벇tsŝĊßdŝĊ?DOêÈù/Ëü‹×dŝĊ2˙2˙B2˙âS2˙ üËü‹/Éü‹ŻÊü‹¤ì½ŞÌżXSĉ_ŝeŝE7™ŝĝW˙ ükaü+Ż…ñŻĊá_ŝßCHŒXô÷ˆġí F¸ïßIŒpßż›÷÷ï!F¸ïß[Œpßs1Â}˙­ĊŻöê˙b„Że1Âײ‡ákÙ[Œ€`?1BŒ€á;áZ#|-ß#`u8҅׆c­×‡ĊïktŞ]à ĜoŬ γŜ .´Ŝ úа-\ls{¸Ìzü,è_X_› 1n~ôÍÖ …oú/Ħp£us(00è!A1ށŽ1a!̈06˘l)üˆ0 bD˜7˘8:.„I—(n†ġ>4_jk2f @\׌͜ó/ž‘ùωn–œñ’ÌżxUĉ_ĵ.ó/Ŝ}|-9˙â2˙â32˙âó2˙ üËü‹Ż‰C¤^ӐóŻÀż˙2˙˘£Ìż˙ ü+ŻÀżÌż˙ ü+Ż…ñŻÀż‡}Lù_b[AŒ ÁF†u#ÀîûoàQßżAgżÛĞ›éO1Ò}˙MÄH÷ŭ·#Ŭ÷ßFŒ„·Ħé˙Žb¤/dW1Ò²§é ÙGŒô…|[Œ„ŻÂb¤ ߀C­Wƒï‰‘nɎ#ù9^Œ„ à$î §Yw‡³Ĵ7†s­7…Zo Y˙Ĝb;ĝİġH¸"èЃŝe×[ߘ 1n ú–Pĝĥ ï´;îtKƒƒn= F::2Ä@G†èÈ062 ‚,΂ˆÓàÒy#<è‘a!ÌÈâRĝ°ˆ[AŒ ÁF†u#:€'<š·A˜ÎÑÙÓ9rŝĊ?eŝĊË2˙â5™ñ†ÌżÌżÌżĝ”ÌżĝœÌżĝ˘Ìżĝ²Ìż2ŝ5ĦÀżÌżXKĉ_Ĵ'óŻÀż˙ ü+ŻÀżÊĝWà_ŝĝ×âŻÀżÚù˙€ß&FyÔw1Ê3>;‹Qîûw£Ü÷ßXŒrßS1Ê}˙-Ċ(÷ŭ·£à°ċĞĜIŒòUì&Fù*ö£|ûŠQŠÄ(_ĊÁb”Żâp1 ր#Ä(1 ցcĴ;À ֝àënp†uOĝġ&pžġpĦġ6WŒ‚>pħÍQpY? úA˙*è_ŭğ ˙`}k&Ä(¸#èğ‚n z@­A şíxTˆŽ 1Q!:* ‚ ƒ`£Â,ˆQaܨâ4¸¸&„\ €¸8.‹ëFı—ó/ž•ùÏËü‹—dŝĊĞ2˙âu™ñ–ÌżÌżĝ„ÌżĝŒ·°ä IDATÌżĝĵÌżĝ?™ñ™éë2˙bU™ŝĝWà_ŝĝWà_™ŝĝWà_ŝĝWà_íü/V F·5bt[ F‡÷Œ{+G‡…`£:€ÑîûŻ'FğïżĦí1Ú}˙Äh÷ŭ{‰Ñîûo&Fğïż•í)Fƒ`{1ZŒ†OÁÎ֟ƒŬ­żß²ŝ2ìg½|Çze8ÄzuĝġÚp”ġúpœuG8Éş+œfŬβî çZo?´Ŝ.²ŝq&ÄhĝiW}uż úú ôïƒŝc·ŭ— ƒîô  ‡=Òş›aĊŬ X\ gAÄipUó ßï _ù„™ÑŝéÌù÷v£^@£JàÑaÀè0 t´ûŝ9˙âŻ2˙âï2˙âŸ2˙âe™ñšÌżxCĉ_ĵ#óŻÀż˙ ü+ŻÀżô1z9FÊ ü+ŻÀż˙ ü+ŻÀż˙ üН˙Ÿ˙è àI÷ŭ×wäçYèèQßçĦĞg|=ĵż˙ĞÛûüĵ›{˙[°µŝ@1ĈġßQŒqŭwc\˙=Ċ×1Ĉġ˙ĥú$Ĉ¸ŝ‡‰1˙bŒ#?Lj1ŜÍô1:C8EŒî°œ!ĈÀĈ /ĈÀĤ°œ'ĈÀ–°\(ĈÀĥMè+Ĉˆ10. úò Ż úš Ż úĈ o ú– o úΠ‚nz`C‚ôĠÁĈ„A°1alLfAŒ ³ Ĉ„ipcÂ4¸1aô˜°fLX ?&l†5&ì‡>F`Œ|À•7Ÿ ÀçBPŝ>€t+ˆŞ…`k‡xŭpw 7p×p÷7pïponà­C–ó/>)ó/>+ó/ ó/$ó/*}[ŒqŭsŝĊj2˙b-™ħžÌżĜPĉ_t‘ùÉü‹^2˙b3™ħ•ÌżĝĤ˙ ü+ŻÀż˙ ü+ŻÀż˙ ü+ŻÀż˙ ü+ŻÀż–mŝ?@Œġ¨ïúbĴG};ŠħžñÙUŒ…—à_CŒġŝŝ½ĊXïó³ıëùŝ[‹ħŽû/ۉħüNbĴ+ż›ëÊï%ĈşòûŠħübĴ+°ëÊ.Ĉ:~u¤+ĈB8ÖşœhŬ Nµî gZoçXoç[o?Ê´ cá'A_ô•A˙<èkƒ!èß}sĝŠ[ƒ#èğ‚n z@­A zT›`lÁĈ†A°ħall˜16̂fAŒU-t^2î…wCŒ/ÄŻğûœŬo @ĈżxFĉ_<'ó/^ù˙’ù˙–ù˙•ùoËü+ßé!ç_|Zĉ_,/ó/Vù+Š}ħŽ_ċü‹UdŝĊ2˙bŝĝWà_ŝĝWà_)˙ ü+ŻÀż˙ ü+ŻÀżÚù_8˙K´ÂB°qnž‚u¨oG~ŝùyş‰qîû÷Ü÷ßDŒsß 1Î}˙mĸPóíĊ8×|g1Î5ß]ŒsÍż%Ĉıĉû‰qùwÄ81VƒCĴׂïZgKĜŽ<ççx1ş@W8ÙĊzÀéÖ½álëÍáÖ[ÖÙÑ7$/ úò Ż úš ŻË´7}SàAßô_BħĈ û=(èĦAlÓÙÙ Ĝ¸06. ‚ ƒ`ÚÁâ+ñŞĤÁ‰§`\˜=NK_ñïu܃~JĴnŬáÖíjžó/^‘ù˙‘ùoÊü‹˙Éüğĉ9˙â³2˙â 2˙âK2˙ÒWeŝĊ7ĝWà_ħÌżè(ó/ş*ŻÀż˙ ü+/Ĉ)ŻÀż˙ ü+ŻE_ŝĠÎ˙ğŬz|Ĝ nüŸ²ÈÏ:bĵ#?ÄxG~:‰ñŽüü ş;òóoĜXŒwßS1Ŝ}˙-Ċx÷ŭ·ĊxW{1ŜĠŜEŒwµ÷Ŭníí| ö·ÎŞ}ïj&Ĉ{òÒ.ĥcŬN°Î"?§ŠñŽüœéĴÍàë­à|ëñ£L;ù“ / úÊ >rmúñ_ŭğ ˙Šŭ)è?§oş9d zH#Ú´c­'Àĝb Ûb q)ĵ˜ ,ˆñaÄx%7@ÉBñöBŻ÷żÈĝ÷^@+Vg³à²ÈOÎżxVĉ_è߄bżO?rkw„Ĵğ‚nJ?Ò’ƒƒž“!:!Ä@'(›Á&„A° *›'ž„ aô•-…/l‡;AKÈX*n]·DĈ’×L7íşáĤÍù˙”ù/ËüğÎ9˙âM™ñ?™×9ç_|Vĉ_|Aĉ_|Iì)e˙£ĴÎ9˙be™ħş˙ ü‹2˙˘“˙ ü+/6Uà_ŝĊŝĝWà_)˙ ü+ŻjŝĝעñŻE_Ë6˙K"$&V?´E~Ö¨ï†aÔ·‹˜è˙Fb˘G}˙ ½=êû6l.&şïżµ˜*ĵ˜è ï$&şÂğ‰‰b˘+ü-1Ñ-Ö~b˘+üËbV‡Š‰ġŭž³6„£­³ÈÏ b"l=àgġ†3Ĵ7‡-à''ÂùA˙(ÓNŝ$èKƒ2-ö‹ ²~ğ)è[BÖmiħż„dcŭÓb­!9,èQmZL„ñ֓`b[ TLÇ1P1 &†A°‰Şœ1QÉ TĊB˜‰Şĵ^]˘ @ùûdŝ+‚µE~rŝ=êğaġÍùŻÊü{÷Ŝm¸Ëü Éü+ïûçü‹ċeŝĊ Êĝ×DÇĴrŝĊ×eŝĊŞ ü‹µdŝĊz ü+/şÊü‹ ü+/ĥPà_ü+ŻÀżRŝĝW5˙ üĞš-˙ú(ó˙>‹IŽü<ëù×˙ĜPLräçeèêÈÏkCLòŒÏŜb’g|ŝĥ“\ÛmĤPÛíĊ$×vg1)Ôv1ɵŬ[Lrm÷“Ä$×ö 1É£‡9ĞlGŠI :ħÎê'Zg‘ŸÓœÜ βΎ„äiVߐĵ$èË3íäĠA˙2Íş!è߆Ĵ›Ób É?§Y !ÙôÀ6-&Á GĤYâ Ûb bL ƒ`“ÚÁâ 1ă0I•Óà&ia+!?Ô r%pĈżkğ^¨mÎżkÛ5Ô6ç_ĵ!óïÚĉü‹OÈüğĥ9˙â 2˙âKҗeŝĊJ2˙beŝĊ2˙bŝĊ2˙˘³˙ ü‹^ ü+/&)ŻÀż˜¤Àż˙JùWà_)˙ üĞšUóŻ/˙ lÄäêí 'Wżr2Ĵî˙Zb²#?ë‰ÉaÔ·£˜ìQßbr˜ñÙSLvß1Ù3>[ŠÉêĥb²˜ìĥj1ÙUŬĊYY[µ§˜ìŞîĴĴ­:@Lvß˙`ge£ßu²#eíósĵ“=ádë,òs†““áûAO†óCòG™vò'A_šfŭ,è_¤Y×}cšġûücšuGHŜ•fġ ɖ4kHHŽhÓb2Œ z˘u669 ‚Mn‹Š909 ‚Mnóa²*çAOVĊ “UqÀd-~ñ_Údü—6˙Žüäü‹żËü{ĵ.ç_ĵ"óïŸ9˙â-™ċ}˙œñ)ŝĊò2˙bħ‹”ŭ²Îżĝş˙b5™ħ–˙b}ŝĝŬĝWà_lŞÀż˙b²˙JùWà_)˙ ü+ċ_üĞšUóŻjŝġÑä =ˆ)…'€ĥùŝk‡ÈÏúbJġíF}ğ‰)Žüĵ‹)îûo*Ĥ„zn%Ĥ„zöS\ÏĊ”PÏŬÄ×s/1%Ôs?1Ċ}˙ï8+ġ=ÔÉl˙bŠçûĴ,òs˘“½áTëì8+$ÏÍ´“¤%û†ä%iÖ!yuz’kƒ!Íú]šĵ%èÛÒĴż„dcš5 $[Û´˜ӒcBrBZrJ›’‚Mݞ1EÉv¸STıfŠÊ6*ğ^W ÀòĠ @²\ĈUş¸­žk‡ÈOÎżëÙ)Œúĉüğž9˙â™ċġÌùw=sŝĊdŝĴž9˙b%ŝĊ*2˙b ŝĊş ü‹ eŝEŝEŝĝSĝWÊż˙bŠ˙ ü‹) ü+ċ_ü+ċ_üĞš-2˙Zĥù_œ@L]Đ˜"?k‹İŽüü:„ÈO'15ŒúvSjŻ^bŞûŝ›‰İĦ’[‹İĦ’Û‰İnvSĊTWrw15Tro1Ġ­Ôŝ.™­V;ÈÉlÔ÷p1Ġ£G:Ğt‡œÌ"?';9Nz*|?Mž’?Ê´“? úÒ4ëgiòš ŻK³~“&oÉ[ÓĴ?§É†lnÓb* JK ÉQiÉñirJˆNMÁĤ*™1U•ÓàĤĤó §Şb%da;ÜİZÒ @ĈEl‘ñïnZÎżŸÓ;„çôœ?§çü{µWÎż@ĉ_yß?çß/.Îù+H;‰İË1Ġq˙œÏUÍùĞ)/ÖVà_tùĝŬĝ½ĝWà_LUà_LUà_)˙ ü+ċ_)˙ ü+ċ_)˙Şĉ_)˙ZdŝġQ˙=<ˆiéKá§Oφùŝë„ÈO1-Ĵġí,Ĥ…QߍÄ4ú½Ċ4×ps1-Ôp1-Ôp{1-Ôp1ÍMÔbš˜ĉ&j'³aêĴʚCÄ4÷ŭżë’Ù¨ïÑNö€žp‚“›À48ĠÉipfÓàÜ4yAšì’—dÚÉ+Òäσ6Íúušĵ)Mŝ1$ooÓbܕ–ì—&†äôƒ#Óä¸499žGÉ Ĝ4%Ká§)Ù kš*ĉAÂLS²~š*^ˆħä€ä}˙ŞŭĥNK‚=fjŻ"?9˙^ë›óïQߜċ5ÌùËÉü{·˘œRl/M Ï(9˙b%ŝĊ* ü‹5eŝŭʚœħĦ˙˘Ğ˙˘§˙bš˙ ü‹i ü‹i ü‹i ü+ċ_)˙ ü+ċ_)˙Jù×"óŻ”}ôù_˙Ğ‹é!ò³Ž˜"?ˆéaÔ·‹˜îÈϛCL;=l"Ĥğz[ˆébşĞ·­“YġvÓCġvÓCġöÓCû´Ÿ˜î˙w|žĴ﨓٨ïNfóŭu²ô†“œÌŽÓCòìL;y^šüQšüIzžËÒäU!yMúÁëÓäoÓäÒämiò/!ÙĜĤĊt&§ÉirlzÚI!9­-*fÂôtlz: bz: nz:zş*VBÖí…òA5_M€ĥ•À“ùwġrŝ]½œW/çßĠËùwġrŝĊ'ĝŸSà_ZAĉßĠËùwġrŝ½L!ç_Ĵ­Àżè ÀżèĴÀżĜHÑ[1]ü+ċ_)˙ ü‹é ü‹é ü+ċ_)˙JùWÊżRŝġŝŻe‰˙B fÄ@ÌH_3#6bFşxĴê˙bFˆüĴ+f8òó l(f„QßbF˜ñÙSÌ;=l*f„Ĉi+1#4N}Ä 7N;Šb†§ŬœÌ§o9™ġŭ÷w2ëûädĥÖ÷p'³Qߣœì ñNfÇ)iòÌ4ynšĵ Mö ÉK2íäiòçiòWiòĈ4ùû4ykšüsšlH“ŭÓdkšž&DŽä„6-fÀԐĵf¤ƒ`3”Ì‚˜‘΂˜‘Nƒ›Ħd!̌t%ä %›aÍP¸`†Â 3TŬdüĞ]™_ ™ñŻÚJàéJà°Ş#?9˙Žüäü{‘NÎżG}sŝ=3çß;=äüğïŸóŸ÷ŭĠGÌ"µ˙b%ŝĊ* ü‹5ĝë)/:*/ş)/6Và_ÌPà_ÌPà_ÌPà_ÌPà_ÌPà_)˙JùWÊżRŝ•òŻ”ü+ċ_)˙JùWÊżRŝµlóżäŸbägÍùy Ö ‘ŸCÇùyş‰{ŒύĊ=Ħb›‰{BĊĥ÷„Šm'î ÛYÜ*ĥ‡¸'ôŭ÷÷¸ïż î÷xĈç!Nf£ßs2ġ=ĈÉì81Mž–&ÏN“çÉeI;?I“—ÉĞÒä/Óä iòwiò–4y{šĵĞ-)î~ir`šš&GÉñirJšĵ'ğ'‚ĊWâ§ÁĠ̓[ Y·n7ÄĝNTßo-°ĝtÚ|>m”6u[AĴ’VlÍ´bëë˜V,çßËùwĊrŝ]ħœ)ĞXÎż+–óïŠċüğïŸóï7ĠÔĝ(/ş(/z(/îQà_Ü£Àż¸Gq˙âü+ċ_)˙JùWÊżRŝ•òŻ”üëÎ˙’nÄÌùYSÌ ‘ŸġÄÌùé(f†ÈÏ[]Ì 3>{‰™ĦV›‹™ĦVۈ™ĦVۋ™ĦVğˆ™bĤ›=Ìúŝû:ıg|(fşïß slÔ÷H'³¸4yrš<#Mž“%íü0M΄iò§iòÊ´ü/Òäuiò7iòĉ4ù§ĥ¤˜ wĤə”&[Ò䐴üÈ49.MNN“3Ĵ³A°™qL<3Óip3Óip3Óy3µ´6˙~0Ïù÷ƒyÎżÌsŝUġÍù÷ŒÏœŻöÊùÏßR mÄLĠ6¨Èù÷ê„˙bŝĊš üûMĊ9˙ÊG}kü‹î ü‹™ ü‹™ ü‹™ ü‹™JùWÊż˜İÀż˜İÀż˜İ”ü+ċ_)˙Jù×ÂĝWÊżRŝġÑäñ1+6bVhžƒUjŻÂZbVˆüĴ/f…ÈO'1+D~ŜÄĴPŜbV¨ÒbV¨Òĥb–˜ċ6i'ÛÚ¤ŬÄĴ÷˙– d}˙ŭÌúŝ9Ù٣ߵÓfÁÑNfÇ iòÔ,içĴ49 ÎK“?J ü$M^VĝĝĠİsmšüušĵİ-)fÁÓä,ĝsšlH ôO“­…HħirRšœ“uûĦ‹ı0+1+NƒĞ›]·Füfél2ŝUûݝĥ‚xNĴšÍÉùwä'çߑŸœĠŞ”óïŸ9˙–Èù—²*Ġĝ+*ï6)çß}˙˙bŝĊ ü+ġ­ñ/f)/f)/f)ċ_)˙b–˙b–Rŝ•òŻ”1K)˙JùWÊżĈżRŝµ˜üë£˙~ĝ;Ĵ*f§‘ŸµÓÈO1;D~:‹Ù!òô³C}6³C}ĥ³Óúô³C}v³CHjw1[ÌÛSï#f‡˙.ġŭq²›G}°“ÇĤɓÒäl8#uÎI“?̒Áé›&š¸²PŝšÔı>MŝĥPŝ–Ôı=MŜĠ–´Óœ&†ʏI‰irZĦüìtÄìtÄì8 B<³Óy³U<Żd7ÄÙz€/§ @Ü èï2˙á†\;½!sŝ]Ÿœ˙PŸœ×'ç?Żĥ³Óúäüğ>9˙~"İñïíİsŝŬ÷Żñ/:)Ż|Ô·Ĉż˜­Àż˜­Àż˙Ëg¤Î9i2á_ÌVà_ÌVÊżRŝĊlü+ċ_)˙bĥRŝ•òŻ˙Jù×Âĝ×bòŻ‹˙EhĽ Û è^ĝFˆüĴ~ŭ˙k‹{Cäç?°Aùé"î ‘Ÿċ §¸7TfSqohĥ÷Š{Ceĥ÷†Öhghëûï)î q˙}] ƒg|h'ëûĉdÛqTêŸ&OɒÁ9+Mŝ PàGİó“BËSçêB_΍iò÷mI;J“w 4NKĦÀÔU(0!uĤĤə!™Í‚¸7΂¨{'Şx îÓàêˆż½Şżŝo¸Wï­Èĝ_@ñĤdĴ–NÉÈùëò7H#?9˙ލúĉü{Ô7ç_ÊĤ$Ġĝ÷”¤œOIŞñïÎżŝ5ŝ•ÏĝĴñ/ş*ï˙×Qİs|šLĝ÷*/îUÊż¸W)˙Jù÷*ċ_)˙â^ü+ċ_ŝ•òŻ˙Z˙Z˙ZöĝWObNÙ@[äg51'ĴözÖsBäg1'ütsҚl,ĉ„šl&ĉ¤5ÙFÌ MÑöbŽ˜úŝğŠ9a[ş½\ ­ïżżŽžñy°ìĝnšœǤΉY28§§Éï ü°àôM“?-ĝYê\S(pCêü-içiòŽB†‚3 u ŒLq1)ĉÀ”4yOĦÀœ8&ĉÁœtÜĠσž£úàé^(sTĵöž€/Ô5˙…½€Új’ój’óïšäü‡ÈOÎżj5ÉùÏk˘ÍÄ%Ï"9˙nŠjüğïŸóï]‰jüğï__ùŒÏƒżfŽ˙ŝŻ“:'Ĥ˙Í9 ü‹9Jùs”ò/ĉ(/ĉ(ċ_ÌQÊżRŝĊüĞÀżRŝUà_ŝµ0ŝġá‰mq_ˆûżĞ‹ûÒÈÏşéœŸ Ċ}i䧛¸/­F/q_¨Ĉĉâ>q_¨ĈĥvÚÚĦĊ}a=Ún.Ö÷ßÛN[ß˙;Yß˙>8ÔNv‘&ïƒ Î)İsf– Î ΏRç'…—œŸ§ÎŻÚ’v~Spŝ&o+¸Ğà4œÖÔ“â>[ĝÈäԙQĝȜÂ,ˆûâ,ˆşípĊSp_œ-žƒûT½ÖûÙĴX×dü‡ŽXÎx_7}ÏùĠÈùWmÔ7ç_ÊŞQßĠ¨ñïjäü{=Z÷ŭküğï__t÷)/îSàß˙ Î)İ“/îSÊż¸O)˙Jù÷)ċ_ܧ”ĝWüĞÀż üĞÀżŸ-3ü/É1€ÒÈÏá×˙5XWܟF~:ŠûÓÈOwqZ‡Ŝâŝ´[ŠûÓ:ô÷‡qˆÄŭâŝ÷ßN[ß_;m}˙í´‡§ÎQY28'œÓ Î÷ Î Nß4ùÓBŸœ_œ_œß§Î­mI;wœĤ‚3°à +8cRgbLŠûazÁı7$³Y÷Ğ~ÜŭŞżž.Ü_j€oÔÍÄk¤‹qrŝCä'ç?D~rŝĠ6êĞŜâ~%‹ÑrŝL¤œCÔĝwßżĈżûŝ5ŝŬ÷Żñï˙Ëáİ“/îWÊż¸_)˙â~ü‹û•ò/îWà_ÜŻ”qżRŝĊŭJù÷+ċ_ÜŻ”ĝWĝWĝײÍY ĉÖ5bna7ıĦx!ĉ†_˙—a 17Äŭ_‡ġÄÜ4òÓIÌM+°‘˜›ĥ@›ˆıi ´•˜›ĥ@ۉıbnèûïb§­ïż—ĥ˙ŝvڎƒ Î÷ Îħçä‚sfÁùAÁùQĉĜüI[ÒÎċçç纂óۂsKÁı£à4œgHÁ1&œigvÁ™gAˆù0Wġó ç*½`ê÷B™Ğô€ıJo˜Ğ…5˙ħÈĝW²Üܰó2˙Ħ9˙Ħ9˙Ħ9˙!ò“ó/>+eÈù-PÎhjüğï_ß}˙˙îûïŝŝÙqpÁù^Á9ĥàœ\pÎ,8?(8 ˙*Ż˙*Ż˙*Ż˙*Ż˙*Ż˙ú(żdž²˙ÊiÜ˙UXS<F~Ö¤‘ŸÎâôÛ{ˆÒoßT< ßµ8iñ@ú:šŬÄaŸŸġao0ëû?Ĝi;-8Gœ3'˜§œ³ Îùçè[0/-8Wœk ΍mŽÍ› Îmç‚Óñ´œç_pĤŠÍ*8s ˜x(Lƒ{@éB˜âRĝânˆuŻÄó ĉ"4Ÿ)4_,4q3¸Ĵ˙µrĦ˙•óú_9˙áÛsŝ·÷ ùö˙ŝö˙aBÎxAÎżj}˙˙˘“x@˙S-8Gœ„ñ€RŝĊJù(ċßşoÁĵ´à\Up-8ġüĞÀż üĞÀżŜ-˙*Że€˙÷´܃°RˆüĴ,LŝŻÁZâÁ4òÓA<˜F~şˆÓŻî)Ĥ_½ıx0m{ĥuħĥmˆv´³ĤûŝğÛY?ôŭ÷µÙvXpϜ`]p„“ Î…bçœ ۜ`^\p(8ż(|ú²SŬT0o-8wœĤèĜTp†Š-8“ËN5³`Ŝ’Ù,ˆëĤÁçA‹żÁƒŞß ċA}° @Ĉˆûçü+‰üäü‡ÈOΈüäüç‘}V˙0ê›ó& Ġĝ÷F¤5ŝ•÷ŭküĞÖ÷Żñï?ŝ'á_<¨”ë“ Î…bçœzŝĊƒJù*ċ_<¨˙*/TĝW•ñŻ˙z·ükiä1Ŝ <Żâ ĈŭWóÒŸŻÚá×?ëûo ĉßÛUÌ+|o/1/mxĥóÄĵtìĦ˜—‰lgkëûïigC˜çc›mÇÁgQ0Ëœ`žRpĉÁÙóü²b} ĉçŞ6'˜ż*8ż)+vKÁĵ£à4DÇfKÁZVlLÁ™T(6£ÎóàâٔNƒ<Ġ/„™W·²¸–xĉiÉ5˙*Ù .~oÎú½k‡ž³ïÍù‘Ÿœ)~oÎhxjü‡MèrŝUëû×ĝwßżĈĝƒïŝìÙqpÁ™§ÀżÒÙ<ü[Ÿ]0Ï/+Ö·`^Zpêùó”ò/ĉİÀż˜§˙*Ż2ŝUà_eüĞÀż–%ŝß[H<”Ĉŭ_U“ì@ IDATÓ_˙˙ÂÚâĦëŸġŭ7_ÚM<$Jż´·x¨êl%J7 ÚΟ]#ôŭwµÙÖ÷˙–xP0͜Ô<ŞÌ<ħàœ^Vì܂ya›̋ ÎeĊ)˜7”û}™y[Áĵ+:6ûœÁeĊFÌ uŽxĤ—}vNÁœW7 B<Ġ̓.„ÏC*ı^]˘ À Ċ ?ív­Zèvċü§_šó_ûRu-ÇCé{(sŝÓ/ÍùûOÔĝW­ï_ß}˙˙á/@ÁLĝ·>ŞÌ<ħàœ^Vì܂YÏżxH)˙â!ĝİÀż ü‹‡Tà_<¤˙*_ŝUĈżŜ˙ZZĝ_cuq˙UĊiÜ˙MXG<~ŭ³oì(.|Fâáô7‹‡ÓQ‡­múŝ;Ĝ\;ôŭw·Ùvì“9İy`Áy[f[0O.;áYeĉùef߂yi›ÌĞËÌë ĉo£cóeĉe'ìW0•}vD™9̜V0g×9âax0$ÛĤÁ=\7Z<ĞäxáCjV*Äŭsŝĵ ™%‘ŸœñiİmŜQΈüÔĝ£5ŝUëû×ĝW­ï_ßŜ„ë Î üóĜ‚yrÙ Ï*3Ï/3ûÌzŝĊ*/V•ñŻ2ŝUà_<Ĵ˙*_eüĞŒ-íüW4b~ÙÁĉ§ À‹°’˜_ˆûŻ&ĉ§q˙·a]1?üúg_×IÌ/´7=ÄüB{³™˜_Ĝyb[1_Ì£kÁN6³Qßù0ö´ŭ ĉÁ™“šG”™Ç—™§•™ç”™ĥ™Áż¸Ìĵ²Ìüe™yc™ù‡2óŽ‚Ù›-eĉ°:Ṡħeĉ”2sV™ù@Á|ĉ×MƒOüş…0â0_…ĉĞpÀ|-Zñ_×dü‡àE™˙4îŸóŻ$ò“óŻ$òÓIš_˜ušóŸ9äü+ġ­ñŻZßżĈżXßÏ˙áĵÁLĝ·>˘Ì<Ì<­Ì<§ÌĴç_ÌW1_ŝĊ|ĝóUà_ÌW1_ŝUĈżÊĝ×G˙÷ôġŭż–ŝúg}˙ĠĊ#iÜ˙°žx¤]Ċ#…ïê)¤O›ÛüFúŝá>â‘ùÉúŝğ¸p-óŸ~W˙´Q_Éë'sŝU›ñı˙áû­2ó€2ó°ô‘G—™'•™ġü‹GTàßşo™yY™YÏżxDŝĊ#*/Q˙*_eüĞ‚•ñŻ2ŝµ4òż˜ €xÔ?Êm‘ŸŻ‰G q˙7` ñh÷Ĵ/-|Qñ¨x´ÒôVœméÂqÔw;›ÙŻ˙£>v³}ÊÌ3³àŻÌ<Ĵİg8§Ìż°Í ŝĊeĉ•Ñ ŝµeĉoÊ ßRq†;Ëü~efkiT™9ħĴŒŠ3Ü_ĉÏ·Žó Ua!Œĝ;<ŞÂ êŭi2ŝĊŠáY;ç_ġ+nrŝ•D~rŝŭëŸġŭkü§ğĵċü§+Îjü‡Qß˙bŬÇĴñÌ}Ê̄˙àŻÌ<Ĵİg8§ÌŻç_<Ş˙âQ•ñ/Uñ¨ÊĝW˙âQ•ñŻ2ŝUÁżÊĝ×âŻŸ˙w˙ŝ_âŝoÁšâħ4î˙ è +û–nâħ·ô‰Ç ŻÙÚ~ġŬÁfŬħG™ż_füCÊü#+ ŸXĉŸÑfĤŝy~ß2ó²ŠÂż(óoˆfo.3oŻ(ÜXĉĴ3í(3ÇWž^ĉÏ)šâ1x8u²ipçA‹çàħş•Ûá.ÑàKnbÜ?ç?ûż%óŻ$òÓAzĴîĊ“âó2˙iä§Ĉúց˙aÔ·Ĉú7Ü£ÌOĝŝ!eŝ‘…O,óëù·çßşo™YÏżu=˙â1•ñ/Sñ˜ÊĝİŒUŻ2ŝUÁż–jŝĞñxĊûOŭ³˙7ą¸˙;°–xĵˆÇĊ…6ĤğŭşqĉMíŻœŽúnkmxÜÇN™İš“{UĝTĝ‡—ùÇ´™İJ…˙ŭ ˙Â2˙âh˙gŝŻ*üߕù·Ö™öïŞTĝÊüħES<S+ü{+ü‡Êü’yUKá—`ñ_l2ŝU˙9˙Ş˙Šœ˙ZÜ_ŸRà?mcjü+™ï__ɨo˙çJĝŝ^ŝŝáe~=˙Öġü[×óo]Ïżx\eü‹ÇUĈżx\eü‹ÇUĈż*ĝW˙Şà_5ŝßċÀËeq˙• żŝYßmñDÙù;Š'ÊÎßCXGz’ôäby™ĠG~jü§‘Ÿ˙bÍôÏU?ġwŻŝƒH…˙¤Rŝƒr…_Ïżu ˙Öġü[—/žT˙âIU/žT˙âIUŻ ŝUÍż*ĝ×ÒÈ˙ği^ËF}߄UÄS…_˙ìÌ늧ÊÎÜY<%ž*[aKĥɲTsڎĞ³öÎ:¨:ëȊĴÛüBÖYĠYÄĴ4÷’êĴĞгn¨ÈşıÎYÎjÎZÌrî¸êĴéY÷•úâix¤"ëxş¸Ĉ›a=­ŠžÖâ7˙i6çż0êûĥÌú럝6çżll9ç_ġ‘Ÿ˙ŝġoûS$ü§Ğ³öÎ:¨:ëȊĴzŝC²ž˙,áßş„ëŝ­KĝOĞ‚ñ´*ĝOĞ‚ñ´ŞùW5˙ZŞù_ì'€ĥÈÏWÊ~ŭ³˙j♊s/žİWè&žÏV{­›:ĞôèSğ[uÖ~YVYîĦĠYÇ´erO­Î:7frûVg]QŭÁkг~W—roĞÎj,f9·µ:ëS;µ:kNi–xĉWg•̃^Ànˆá(ŝR/J°|Ħh;çWŞÏ™óŸŝúgçÌù/ +ĠĝW}ägÓpùĊ£OuînĠYûĠxZUÏHÖó’%ü‡d=˙!YÂżu ˙Öċü‹gTÁżxFĠüĞšñŒŞùW5˙ZZĝWĝĞ*Žd-ıKa•>V—³Véı-k^*s—Â*}´*,ào7UVnûW·ġ²úĠZZ+ÖŝĠí_ž…gU},8÷½h?ûù?Rç×2^˙öóŒÎ/à9xN <>&–’j, –’j,{WŞ÷JÛ˙éíŠÂ!àïw-XhE)³DNÒŝE“Ú.“_¤eŞĥ³/ZĥjûA}‘€À?´°cY,³VݽÚK[™%s*}t/­½Úċj xž×ŽE)³4[j+Ö^˙e˘Ĝ‚ÊhŻ˙²Plİ­Ĝ2^/À Z„cÉk?aû ? 'ÔGċBÚOĝq<Ħ€Â?µhDzRòCŻÀG²ŞɋzO§ĠGñ˘ÚĞú1ş(/‹Z䣽p{áRáwr-3×Ĝ^¸½pĊ!à%xI‹s´—o/˙q/ŻĴ>íċÛËż›òŝ˙Òbíi˙ÈG#‹ŭ)-Ġ—Óŝ‘ö,Î!àexY‹,ŭŸjŻdû-áê£{ií•ü8^š€Wà½Ğ]úl{…Û+üî?Ğe­ÂKǗĥWx)ŝĴ€WáU½‡ŭĝ‡^öú,êŻeĵŝKëÇ?ô |ĵë/àßo½ç#v’Ş2KÏI–ŞÊ|pW¤eéŠÚ˙Ñí–E>ĵŻi KTKölKmĊ>&—ıÔVlágÓÒZħö/Ö~™ËLĊüŝ£%},+çlŻj{UtZ-EUm˙OµWuIŸSÀëü?{gĤ×q¤ûßÛÉn6ğ{w³{ïŜ½óŒF# idöÊÌÌÌ=133)f[13+FY²,°È’-ɌŬd)K÷ïĞ™êésFJ"´ĉyú·ŜŞs>ßÔT×éêîÓÚlŬ÷ï˙Fymäŭï÷ŭWÑü;üğÖU[—ŸµŽ?ûÑS§ïî£müŸĠŭhk¨ ĝüN믭ßOïîÀ&ŝĝÙĤŭĝ›R6íÇÚ [wÇş;ĥúĤġß üKëîĜwcŝŝSsëîw˙×X˙µŝû³I˙aۘû/àżàż´ ·îÇ_ï}ĜP­˙ÎĴÏÇß$ÛĤŭĝŝŝ[Ŭmŭµîïƒĝŝµŝ{²iĥn˙_MÀ˙À˙¨ğu·MµÁ˙HëżŬ­ğ­ó&u·îĥÉ6­ït·îĥŜÚ÷ğwÛ¤›ş[wÛd›Š@ènëĞİğ­Ç&Z˙ŬĜ„[XßĜD› _€ïiÓna}w ûñ×OÓĤŭĝÖ6ño`“{|yQÀ÷µ1·°;Ŭ˙ġŜ‡?¤i#ï˙Ĉŝŭw÷Ŭ7¤€?цÚÂúî@wǛӆÚħ ùKëîĜĈÛ1ċİüİÖk ›v6ñÇ_ĤŭĝX6ñÇ_ëP×~ uĜÂw÷şm#ĝ8}wm}\÷£mX—¸zVgZ›-tßżûŝÈŭµ‘÷żûŝŬ÷_–ċç9MÀµZĜHîÙŬĠMĞÚ´żğĞ›BWsœ<ż ĝs­ı6Ôğuwl“~Lm¨ÛD˙°cÙcĉ{x—MÀ_hM´ŬşÉĠ™ ç&TgV÷&êŝZ6îÎl87Ù :SĵI—î½Ş&à/ġǵ°1_Ŝ;Ŭ˙µÛmäŭßĜż˙îŝŻĠ;èì€€˙?´…íÚîoZÖĈÖáµ|mw‡ż;ÖqmGWúƒZĜàŻÚ(:ù~´ġÜI}wmƒü¸îG[G—Ĝg ĝkŭŝ-t_Ò}Ɇ|‰Öâ§lß@÷%ß½KVċĠż˙§ĝ‘~Ÿşíğí7p{m`ŭéĥïĥ˙#íWÛÏû ĝŭ>-twoàĈZ[wŜ€žħÛxÓ1ÖÚ놀żĠj·°‘X÷lâµ>; ïâC}wğú|¨5v[­í ĝßZ½Ö¨Y÷ ğo¸ĉo¨ïʃtßpżĦÖô ³›€˙£ĠhaC5Û`;ÖŬ˙umĤĵ˙û÷ßŬ˙5b–¸ñÚüP§Ġha#´ÙğÔŬíµe£ïî£uw{c°Y3·Ò:îĥ€˙ĞUµ°&lÖÈM{´qġvŭ mT½íŝ ĥ·kñƒ^'O$àïµŞ6 ƒ ¤‚ÁҍĠ2P÷WÑŭ¤óW‘ïÀkżŝŸşlá3ĝ#/ï÷ŭWqı6òŝwßSżÖo˙ż| ?€?ƒŸ_À_Â˙‚ż‚ż†ÁßÀßÂ˙†˙'6ƒż‡˙›MôÎäMğ™²*ƒħ]jkşÔn&ÚşÔn&&wi°ïŞ.?˘Kífâä.µSVuù%]j7×wݝÚv31mUOwݝŜv31+KûµĝF|+~!™Á?Šżż˙,ŝEüĞXiÚ˙˙)ŝKü·ĝÒ7b3ñ'âOĊğ‰Š?!ŝÒŬçßÄż‹ßċŜ‡ï‰ïçß牿-~$ŝFü­ĝßâ˙ˆż l&ŝ^üżÌÇôÎùZ ÚÍĐUŒíR[Óv3ÑÖv31ıKƒ}Wuù]j7'wݝ²ŞË/éRğ™¸KíÔ.µ›‰iĞ2xşKíô.µ›‰YYÚŻĊ7Ò·âEfí˙ĤÍóÛoÄfĦK˙]ù˙Şħy€ĜŝŻ6÷MôêÄÄÚA]j7%]jĞòU›‹ĉ.µ;vİŬ\ìĠö.µÇuİ=#_Uhçwݽ²KíÍ]jïîRğıx¤Kís]j_ËWm.f›öĞ8ú˙RüJüZ,Íïo÷ڏaóĴè_ˆÚßÂĉ9QûŸĊżÀĉĜĵ‹ °ıĝżnˆž:+çÛ(huİŬ\”tİ­ÊWm.šğÔîĜvsħW—ÚCşÔ×öŒ|UĦßöÊ.µ7wݽğKíĉâ‘.µÏuİ}-_µı˜mÚŻÄ×Ò7âÛûżĜ<äûżĜ<ä:í·bóï˙bó]ĵˆ-àï’`‹B=Ûq§&ĥğԎÎWm!*òµ ]^¸]—ÚŬòU[ˆşÔ•ŻÚBœ’ŻÒċ…wݽ6_µ…¸½KíŭùŞ-Ä]j_ÌW½‘á—bŽİ:E˙Bîói3söO`‹Ĵè_Ùż€-ïÏü_Zco-Äß%@ñy=³Ÿ‚j 1°Kíè|Ġ˘"_Ûċ…ÛuİŬ-_µ…8 KíQùŞ-Ä)ùÚ)]^xq—ÚkóU[ˆÛğÔŜŸŻÚB<ŜöĊ|Ġù~)ĉˆ-¤-BŽ˙ۅÙŝ/ĥıû ħEÈ÷˙µ2Ĥ€²€-EĜ2³‰­óU[Š‘ùŞò|Ġ–˘._;İË 'çĞöÉWm)ËWŸŻÚRœ™Ż:ŻË ŻÈWŬ˜ŻÚRÜ™Żš–ŻÚR<•Żz9_µ˜á´_ˆ/]î?ÏTŜûÛsŸe°eNĵŝĥ̊ŝ…xŭË$^ŻŬ 0”5lè‘óµlĜ:_µ™Ż*ÏWm)êòµ“şĵprjŸ|Ġ–â°|ĠñùŞ-Ċ™ùŞóşĵŠ|ĠùŞ-ĊùŞiùŞ-ĊSùŞ—óU[ŠNkŝŻŻĊ7yĤÊöħeNĵŝTlrŬġ—!ß˙˙À@ôÈDĵ@ô §‰ŝùŞá9|Q–ŻŞÉWġ­ùޝòU{ĉĞÊá{ˆ£óU§äĞĤäĞzˆ‹óU×äĞnÍá{ˆ{òUçОÉWMÏWġ3M•Îüĵ=rĉŭ?€9Áú3è‘ŭ(~ =œ÷G÷„Àè‘7zä !ûĞè!zúçІç=DYŞ&_ĠC´ĉĞvÊW홯:(‡ï!ŽÎW’Żš’Żê!.ÎW]“Żş5‡ï!îÉW=œŻz&_5=_ĠCÌ,Şô•ĝ:Äŝ/zäÌû z„˙=Bv²òKÑ#äĝżèÖÍ€è [BèÙ݉~) =EO1,GUšIUŞ)‡ï)ĥÏWí–÷ûç¨Ïżä„|Ġ™9|Oq^êò|Ġ 9üù—ÜŸ÷ċОÏá{Š×bĠgâsË}ŜžYóŝ ì’4U˙zĉDêÏĦgNŞŝ+İóĤS×î@ §ĜRôHż˘@żĴï­g §–£*Íż¤*_Ġ”÷ÛçĞvËá{ŠŭsT‡ç_rBȩ̂8/_uyê†ŝŽüKîÏá{ŠÇòUÏç=ĊkħÊùżŜ=C–˙Û%ŝ/z†˙=sŞż ùŝż&Ñ+s½ S@6ôjo˘Ż?$‡ï%JrĝŠüKrĝmrĝ^brżwŝ%‡äÇä½Äİ9ü”üK.Êá{‰Ğsĝ›sĝ^âĠ´üKžÌá_Ìá{‰7Lġy<ó3Ûĝ_&3?‹ WV˜^½2´/€^YaúWKüuVVµ&€@ŻÌ Ğ0d@Ç7è›ġuġ Éá{‰’"˙’†~›—˜œïÉ!9ü19|/qj?%˙’‹rĝ^âêŝĉ—¸+G5-˙’'sĝsĝ^â S}._³ÏÑ+kŜıè²½ô Ñ+Ğêû+Ñ+äĝ˙ï=ˆŜ™€èù z·×Ü[ô} w§&z‹Á9üè~|ß[Ôċm9üN9ü9|oq`dbfß[œ—_–_—ß–÷÷ĉçOç/'ü'âSñ™x zÇóŝ…ÜgôΚ÷\ ½³bô èD˙BŒŝ2'F˙Züh Ŝ™@ wĉ@ w{ À ½½EŸäÛ+ƒsĝÑ9üĝ·¨ËáÛrĝrĝ=rĝŜâÀŝÈŝÄŝÌ·8/‡ż,‡ż.‡ż-‡ï-îÍáÎáŸÎá_Nĝ˙½ƒ ‰˙‹Ŝ!Ë˙EïĴiú˘wÈvÑ/CŽ˙‡˙_GS@é[M ÌáGĉrĝš,r+ќoŸïšï›En%ÍáÍáOÍá§d‘[‰ sĝ+sĝsĝİYäVâŝŝÑŝÙ~ş‘íŜ_ÈŭgßéÍwñt‰ñt%l•D˙ˆ/aĞĴŭkĜ*óĥZgE`?¨ó7ĥ•Ĝ*00‡™Ëák²È­Dsż}żkżoı•84‡?6‡?5‡Ÿ’En%.ÌáŻÌáoÌá§f‘[‰ûsĝGsĝgsĝéF:˙×b†ñŭßĝÎŝo|g˙[… ˙üRl•T}˙ZüZl² ­²ê kh}2Ñĥ‚>‰Gd‘}DY_E6ĉo›Eö“sĝ½³ÈƒrŒÊ"ûˆ“rĝ³²ÈssŒ/ÍáŻÍ"ûˆ[³ĝğrŒ§ċOd‘}Ä 1˙‘ĝXĵjd§™Ÿ™Ĉwzó}²Òó'‰ÎAŸ8ú˘óW'+:gÖÖn 'sô[uú’oµÀÈ"ûˆ²:‹lÌ1Ŝ6‹ì#&ç{g‘ċ•Eö'ċge‘çĉ_š_›Eö·fñwċOËáŸÈ"ûˆbè˙ERŸ‹/‚ó3îì˙˘OÈòÑ'Yï˙‘è2œó+Ñ'dùÎïk`}Ó@ôÍ|}í  ô-4ħu;vd_1<‹/Í1Ì"ësŒ'e‘;e‘}ĊYüŝ9Ĉ‡g‘ÇċŸ–ENÉ"ûŠ ³ÈâÊ,ŝ†;²È{sŒÎ"ŸÊ"ûŠ—Œ˙ĜċŝŻÙéÍ÷è›ÌüĵgĈBó2蛄ĉĦoVhŝúĈŜ˙kñw- éè›ùèĞâ@ŸöŻ.°uòeö ô³ĝÒÊ,²>ÇxRıSÙWì‘ĊïŸc|xy\ŽñiYä”,²Ż¸0‹ì+ÌâoÈ1#‹ĵ7Çĝá,òİ,²ŻxÉxç˙zŬÈÎŝ/ú&3?ï™qg˙}“ġŝ‹!Ë˙Eߐĝżè›ı§l-¤€èçĤ€ @?ÑúujbhÙO”d‘²Èڜ;´f‘;d‘ğf‘ŭÄYä!YäÑYd?qryVynÖ.Éıí5YäÍYäO³È~â,òÑ,ò™˜\!VŠÄ+/žùùRĵiĈŝÍwĥ‘ür!ôKâò/ŠËúñ ôˊËßĉy:Áşöˆ~n ¨0ô ôWçïĥ_`hÙO”d‘²Èڜ;´f‘;d‘ğf‘ŭÄYä!YäÑYd?qryVynÖ.Éıí5YäÍYäO³È~â,òÑ,ò™˜ìÑ/İô™ĝ<˜˙›qä˙FvöÑ/‰Ëˆ~Éz˙ODżĴy˙oB–˙˙ħ€èŸ˘ÖY@ŭ³6‚ġk} ŻèOÒĐ,rtYžEÖd‘ŭEsı]99aú‹½²È³È#²È³ÈÓ²È)YdqayEy}y[yw9-aú‹Ç³ÈçŒ\ioŸˆéFvÚí5ú'3?s ”A˙$(ŭ]ô/ċOĦ”żŝĉŭŸŭÓèżš@ :úgÔ?k#X˙¸Gô żÏŝ˘`H9:‹,Ï"k²Èŝ˘9‹Ü.‹œœ0ŭĊ^YäYäYäñYäiYä”,²ż¸0‹ĵ"‹ĵ>‹ĵ-‹ĵ;‹œ–0ŭĊYäsFFŝ/ÈÎŝ/ú'3?sD˙dĉg‘èŸĴĝüPôOÖû*ú'óŝ߈ŝ!ñÑ?kui˙¤Ĉ°ŜÄÖI¸ĜúAĜş½‰Á^4rTÂl-Ĉe‘ĠYdcıMÂl-vNÈŬ³Ŭ/‹<4ë†Çd‘'g‘g%ÌÖâÜ,ò’,òê,òĤ„ÙZLÍ"ïKȇ²nĝ¤c>ËĊ ñ‚‘Ÿ¸Ü˙U#ŭ›ïÛFú”|.l¤ä‹aë$"/‡­]ô/ä>ŸÁÖIJŝ­EäÌ­•ëú °uRîĜZôŭŭ"0X˙4[F%ÌÖb\YE6f‘Û$ÌÖbç„Ü=ëÚŭ²ÈC³nxLyryVÂl-ÎÍ"/É"ŻÎ"oJ˜­ĊÔ,ò„|(ë†O:Ĥ˙üDúT|ĝ\ĵjdä˙FFŝ/ĥNNg[,ĥNV|.['ëŭ?['óŝ߆,˙Ï~·†1`uV‰…).#˜ IDAT À1¨Ú› F&äĜN •Y×Ög‘m ³C–Ù 3@ì“EœGf™Ežž0S²Ì.H˜âò,òş„ı%ËìÎ,ò„ MȧióŭXĵdäç.÷$ğ]fÁ€8ϳk}8^’pĵ$áĝó$ ²vĴġ 0`uVĤ€l Ċßü€À12!ÇŞóßh@ 2ëÚú,²-avÈ2Û5aˆ}²ÈƒòÈ,³²ÈÓfJ–Ù 3@\žE^—0·d™Ŭ™E>0Ä£ ù´1‘˙K2ò1 9çg–OÈ̳Fŝ/$+>WˆÉz˙ÏCâ˙b@ş` bàêí˜ìĜ^hÄ@â&†“A–&Ì@Q‘0µYf- ³]–Ùä„Ù3aвÈĉĜ,³SĉĴ„(ÎMȋ³ÌJȲÌnO˜âž„œ–eö¸‘XîóĴ1êû Œß|ß03ï‹ïÀÀÄ߃ħ/£XĴ?+“Xü9 Lbqz´Öo²>ôBĈ‡fî˜ìĜ^hBç/|``¸2È҄(*Ĥ6ËĴ%aĥË2›œ0{&Ì@q@yx›evJœ•0Ċı yq–ÙU yC–Ùí 3PܓÓ²Ì7²˙ùXúD|ĝLĵ"†Ĝ˙Í,ò10™ùyO Œg~Ŝ“Ÿ+“y˙ÏĊÀĝÖ³ôC×耔씳 Ä ƒÚ›ĉE$‰’„Ÿ05Y6%Ì6Yf;'Ìî ³o ‡$äQYf'&Ìé 3%ë ĉ²„$M˜›³İYŜ—0ĊÌRħL’>Ÿ>/ŠÁqĠ÷Uğ°˙‰ü_ Žg~ŠÁñÌÏ218^ñù‘œÌû˙_c€ÒiC’Ó@‡$GA Iö I–ħ@qCˆ›•0e S™0CD}´&Ìö 39aöL˜ŭĉ„9:aNL˜ÓfJ,Ú sYÂ\“07%Ì sOÂL3f‰x_,³Ür˙gŒiŻúdÌ×.÷†Ä.8†Ä.8†Ä.¸†Ä!ĝ‡àaH‚ż„!ĉŭĊÌ+ùôß&ŸŝğäÓ3€ùÓ˙2tŝôż ŸŜ~ĐdÀdèĞ€ŭ-†ˆ!Q S–0• 3DÔ'LkÂlŸ0“fτÙ?aM˜£ĉĄ9=aĤÄbÑ˙ĉ²„ı&anJ˜;ĉž„™fL‡˙Óá˙Ré³‰ü_ ‰×ûÏCâs~ĉŠ!ñÌÏ"1$žùù@ ‰g~>Câġŝ_Š!!ö˙äÓ›|úï’O_GGA–uEà0H …!0´½‰‘^„ĦblÂTÄâPQ›0Í ³mÂìœ0ğ'Ìħ8Tœ0G&Ìñ sjœ‹ç$%Ì s]Âܒ0?ĊĦâ˜Y,2Ĥ=÷y˜öÜ˙9cÚsŸW`h\ġ}†Ĉ ĝ,'àó`hŽ\?Â8˙$IÀż²ĝûíû/êŠÀĊ ÀP1Äŭ]†F*úK ŒM˜ŠX*jĤ9aĥM˜f÷„Ù7‡ŠƒĉȄ9>aNM˜³cñœÄà˘„ı"aK˜[ĉ§ħ8TÜ3‹ĊCĈtĝ‘ÑGâÀ'â9³é14ú!†Ĉqg‰ĦñÌÏ<14žùY,†Ĉ3?ŠĦñÌÏ'Éĵ˙W!ñ˙ô Ħô˜ıµ2ˆaÉF°ay5€Â †Á`†Á01˘Ú›(ĊabBÌÔ$—4&—LJ˜fׄÙ;H K˜cbq˜8)aΈ™)‰Áù siÂ\‹Ä s{Ìܕ<`L{îóˆ1íıÏSĈ´ç>/À0WġšníÁ÷Mcڃï;0,óaX|—À0‹ŝ…àğ<ŸÀ°8ĝ~²N™^/GA K6‚ ËĞ€À01Ĝ€abX`„˘?°@i,bĤ&ı¤1ıdRÂì˜0ğ&ÌŜħx@bpX‹ÄI sFÌLI ÎO˜KĉêX&nL˜ÛcĉÄàc:üßó=eL‡˙‹anŻït3èc:ü_ ‹g~ĉ‹añÌÏ1,žùYb˙ây˙ŻÄ°Ng ­£@ _Ġ/‚ Oö W ·@q‰›(‰ĊòÄ :‡‹†˜iM ĥO˜É ³g,î—‹ĊQ1s|bpjœ‹ç$%Ìħxmbps,ScĉŠEbħ˜fL{îó˜1íı˙30Ü­ĝ|Ñ Ú=ïU{Ŝ îkŝ/F¸Şïkfá˙b„;„ù]1"žùY FÄ3?ŭ_Œˆg~> ħ˙‹v$ż26"ĴÙ71rU;GĈûF&Ë@Gú@Œ„a6Œ#ĊhÙŜDY,VÄâHQ3M‰Á6ħ¸cb°k,î‹#Ċ1sh,•ĜŸ3§&gÇâ9‰ÁEħxy,Ž×ĈÌMħx{b·1…ÜçÛsŸG`¤Ûíò¤´ç>ÏH—tż#˜ûŒtI÷LébîÇ܅0Ò˘˙Ÿ‰02NşWĈ1÷3é’îÎoë` (0rU;GĈûF&Ë@Gú 0R ³`d`¤íŝj#eħX‹#EmÌ4%ÛÄ⎉Áħ¸W,ŽÄÌĦħxTbB̜šœ‹ç$Ċâċħ8R\37Ċâí‰ŭŬĈŭßÄ˙#ƒVó3è1Ò%Ŭ݈‘ñĴËb¤KşgŠ‘náÍ12žùY(Fş™Ÿbd<ó³2Äŝ/F†Ĝ˙W5üË’³€F­fĜ–ŽŠW²@q€Q‰ħħ8!kbq”hŒ™ĥXÜ>ħŸ‹{Äû&öÇâħxl,Ž'ÇÌħ8%ħ??/‰ LìŻĊ[bqމï‰bĦ¸×˜Bî3ÍÄBî˙¨‰íıÏÓ0Ê­x{Á 7ŬÄv‡{F9‡›£œÍ…QqÀ]£¤ö€ğ Fı€ğFĊ÷sóŝb.£ü?ŒZ—5€À¨Ġ,Û2Qñ* QV(êĝۍ£ccqB,ÖÄâ(Ñ3mħ¸}b?9÷ˆ öMìŽĊ#bñĜX%NŽ™3bqJb~,^\™Ĝ_‹·ÄâT;üߘ˘˙›¸\Z!5ħ˙Ċ(·Ûë3(úż‰ŝ/FıŞï,1ʝ€Ññ2Ññ* Ñ<FˆÑ0 Fš(mÇ0ZŒĊêXĴĊÑ˘5·‹ĊcûŬ’Ë÷‰Ċcñ°X<:OˆĊÑâ´X<;ωí/L.ż<݉Ċcñ6ç‰ùâN ıÏq?Œvı˙CfPÈ}7ħûħx`,‹GÇâ ħ8Zœ‹gÇâ9ħŭ…Éċ—Çâ5ħxc,ŜfbÑ˙Mì1ÚċŝIƒ˘˙›}Ñ˙Mì1Úċŝ݊Ñêû–íŞïˆÑî„çybt<ó³XŒvk~>£ŬÌÏGb´›ùù\Œħ˙Ç@çßX§ÀêìNk…@Œħ7€Ñ0F”À˜ö&Êcħ*ëbħ9·‰ĊcqŒĜ5÷ŠĊŭcñX<2‹Ċ“cñŒXœ‹cÄùħxI,^‹×ĊâÍNœ+î0ħûÜmb!÷yÀÄöy˙G`ŒËŭŸ„1.÷Ĉ¸Pû2ŒqĦö5Bí BílBí|ÓjġCħ$µĈĦö8Ô~‘ġ{“İ:;Ó@aŒħ7€ÑbL DÙ1òXĴŠĊşXlŽĊmbqÇX#vĊ½bq˙X<$ŒĊbñäX<#§Äâq~,^‹WĈâuħx³çŠ;L,úż‰E˙/ŠZ.VVŠGÄ—û?)Ĉ¸Ü˙91Ĉ…Ú—Ċj_c\¨!Ĉ¸P;[Œq'<Ïcâ5?K♟™ŸCì˙ñùkt%~%ñ”ćÁ•ÄGA”ÄÁJâ}%ñ2’xP‰›-JpMŒ‹ĊJ‡KDm,6Ċâ¤XÜ!'Çâħ¸o,‹‡Çâ1ħxb,ž‹g;\"ΉĊ cñ²Xĵ:oˆĊ[Mœ/Ŝ?5ħûÜkb!÷™fb!÷yÔÄBî󔉅8ûĵ‰…8û ”¸8û:”¸8û6”¸8û.”¸8û”Xô˙sħJ\œŭJ\œŭJ\œŭJü?”ĝ(ñ˙Pâ˙ ¤‹ Pâ€@Iüƒ0%ñap%ñQ%ñF°’x@Iĵ ´$^TâĤ€F‡Žżf‰( Œ‹ĊJ‡KDm,6Ċâ¤XÜ!'Çâħ¸o,‹‡Çâ1ħxb,ž‹g;\"ΉĊ cñ²Xĵ:oˆĊ[M,úż‰E˙7ññĦ4ÍĢ˙›Xô‹ŝobÑ˙E‰Ğú.J\Ġ÷mQâŞïŠwÂó{˘ÄÍü,%nĉçCQâf~>%Áùż(‰vĤ$> ¨$>~$ŜˆPÖÁ€(—–ĈË@KU@ Ja ”@)”в€RQ**œXӎĦT4Äbk,n‹;Ç·Ŭ-÷ŽĊbñX<*w¸Tœ‹g:qJ|áyħxq,^ßçÚXĵÉÄıbž¸ŬÄŠ·ğL,œsrż‰…Ü˙!(uı˙Pê²ìg ÔeÙ/BİeÙÓí>…,  YĈL(uAv”ş,{”ş,û}(uYör(uYö'PjYöF(—–ĈË@KU@(cDIá/(³?qi TT8ħFPhˆĊÖXÜ.wŽoğ[,î‹ÄâĦħxT,ïpİ8%Ïtâ”ĝÂóbñâXĵ"ϵħx“‰E˙7ħè˙&ŭ_”JvÎÏC˘Ôċŝ‹R—e?#J]–ŭ˘(µ,{şŬĥè˙&ŭ_”şŞïQêNx^ JŬÌÏû˘ÔÍü,nĉçQœ˙wúŬħN‡ÁuúA˜Nż;ĥf16> bìjN‰ħñ* ħñ* ħ…) Â ĈbMŒ'Ğcħ>[+ĥĊœ¸K|ážħċ~ħxp,‹Ç:|bĴ:-ÏvxĴ8'/ŒĊ˜xUĴşŜÄwĊq‹‰ï‰bމ…o÷ÀXwÎɃ0Ör˙‡Í²û bìjNĈĈĞ€ĈĈĞ€ĈĤ€ @èĝC ŒW$VÇb},ĥ8ħêÀX<,vĝĝXuJ,žé”XužeââXĵ‰×~GÌ7šX¨zŬfâ"ħXÜ e–ûßkŞBî3ÍÄBîó(”ıüú)(³üú9³,„×—Ħ̅×נ̅×Pfáġ(sáu”‰J…şÊ\x]ĉòëPĉòëOĦ,ùŬùì7([@ l5ßeñ>€²ĵ@ ,.—µ×DI LŒ-üġċꄲ@U,Ö9\&š8)ĥÜ!ĥœ‹{8qŸXu`,‹G;||Ĵ:%ÏtxJĴ:Ïá2qq,^áÄk ŭßĢ˙›XôQfı˙½RAUô³,úż(sı˙S˘Ìr˙ç̲è˙˘Ì­ĝ|M”ıŸ3D™ċŝïˆ2Wġ'ÊÜz˙E˘Ìó³ÌÍüĴenĉçSQĉ :WÖö@|ĸĵ"°/—_ÇAiapMT:ï4UaĊç}0Ŝr˙iĤ*xĠ£0Ŝ˘ê“0ŜĠÏÁx‹Ş/Áx—Vż -Ş ]T-ŞÎñâÏBT]à˘êïÒê]TŭĈ[ZŭÙjN­÷"°íŸÜĝNo<ŜĠĈ‹2Ĉ&˜WŒTĞIĈênŽUÛ8ĵƒĊd'îĞöqâħêP‡ŒUÇ9|RĴ:Ŭá³/ÎqâħêR'^i¸è˙&Î7.úżo+>ï” Ş˘˙‹ñ–ûO³ĞŠŝ/Ĉ[T}RŒwiġsbĵEĠ—Äx—Vż*Ĉ[T}SŒw+>g‰ñ–ûÏ]Ġw›ùY"Ĉğs~>t3?‰ñÁùŝĞüàßÖâ &ĴŜqòÏšàŠÀ|Ĝj \LÀš¨"ënrx‚˜äÄíŜ96Û͉{ĊŞŭ>ĜİÍŽqĝ„XuŞg:<%6;Ïዞ .7q–¸ÚpáÍ÷˜`Uß[LµDÜa¸Pġ½&Xîżİ !ġ!˜`!ġ1˜`.ġ”™Bêó0Á\êe˜àBêk0ÁBê[0Á…Ôw\H ,¤.€ .¤ïBê‡0Á…ԏEw"iÇ?LXï@`Âê=!˙,  <Á­0N”‡g˜¨R$Ö9Üä1ɉÛ;ĵslĥ›÷ŠUû;|°S› ħêT‡ÏtxJlvž9ßê;OTXîżPTXĠ÷}QáÎùYîf~>îHê ż,oa-½ˆJwPċêì•nh[T™uPĦ\éŠÀ•…) ˜ *ħ&jˆÄ‡[ŜĈáJħ£“jw‡÷Ž/9ÀáC>™_r˘§:|ĤSâKÎsĝ"3Äe† oWC­÷żŜT Ċ͆ß·.T}ï‚J[ñyTš3M3³ŻĊ#† ÁôI¨4gz*͙^„JsĤévI!˜•L߆J Ĥ³ĦRü…TÈ}ĉğ`ş*-˜.…J ĤËĦÒeӟdˆo Ò]ıNŽƒtgUÎNà@[ZéVUfT(Wş"pea HLE÷¨•Ebƒ-opĜÑáÉNµğ{Ǘà!á̎‰/9ÑáS>Óá)ñ%ç9|‘áâ2E˙•ĥŜ˙zS-7~_Ü.pÑ˙E­ĝĵOTZî?Í.ùZÙáÓ>Ûá*qŽ/0ü–¸Ä,q…á9â…7ßĦÊöúŜ UVġjf+ĊŬ†?÷.xÒCPeİôcPeİôSPe‘ô9¨²HúTıHú*TY$}Ş,’΄*‹¤ïB•EÒùPċRéĊ.•^ĉ"é I?Şö¨Úk*·Ĵê÷? ˘ÊĞ\¸ÊĠŞD…¨UjuĝOU Ŝáf‡'9ĵ½;;\%vsx/‡÷sf9|X|ùÑïÉŸîÙW‰sœxá·Ä%†g‰+ Ï×.úż¨²½·ŠŞ eÄT3[)î6üݸßpÑ˙E•ҏ‰*KŸU–û?'Ş,÷ITıÜ˙UQeı˙›˘Êr˙™˘Êr˙Ž# â IDATwE•U}ç‹*Wġ]ìÖû/s3?+‚óQċ~Œ*äħ>€üߨvË@ĞŬ* j· ¨ÚĞ]¸ÚĠŞ S@P)ŞqMÔ9Üäp›Û9ĵ“ğ8ĵ‡û8\-tĝP‡tĝX‡OtĝT‡ÏtxJüç~S\dxĤ¸Ìğâ*óĊu†‰› /·^.Vˆ;ĦÚŞ÷BµıуPmnô0T›=ĠĉFOCµıÑóPmnô2Tğ0úT[} Ş-ŒÎ‚êbĠQmaô=¨ĥ0şŞ-Œ.ƒj £+ ZôrżGż‘m@µ[ZíVUğU@Ġ\íŠÀĠP]˜•Ħè0Ċ¨s¸Éá6‡·sx'‡wqx‡÷q¸ZèĦéħŸèİŸé”ĝ#Î3üĤ¸ÈLq™áwĊU†ç‹ë /7ħ–ŠÛŒ/úż¨ĥŞï½˘ÚS>(Şm5ŭ˘Úr˙ÇEµċŝO‹jËŭŸĠ–ûż,ŞŬI݉jËŭßĠ–ûÏĠ–ûÏĠ–ûż'Ş­êğXT[Ġw™¨ĉ˙˘:8˙wÀ—ke5퀨q? _~ ĈTv׸`5n@[ZVĠ¸"p+׸@ĞÔ¸@ TA5ԈQ 5†nux[‡wtx²ğ;ĵ·û;|°‡;|´Ç;|²§;|ĥ5⨯‹7ÄP#fˆ·Ċ%Pc3?W@Íü\5ĥŜ˙¨ħġŝ·@U}ï€ĞúŜ5CĦÓ Ĉbè#Pc1ô ¨ħú ÔX }j,†5.†îbè Cß)bè\C¸şÄĊ\ ])zݳ PÓ>j܏Â׸ߨqgĠ¸À5n#XÛP–Ö¸U@5\ŠÀ5Pj5P#ŞDµ¨ ԈڂjD£­oëŽOvxw‡÷vx‡vĝp‡vĝx‡Ovĝt‡Ïv¸Fœ#j‚ùż¨ ĉ˙˘Ĉf~56ós¨ħġŝ7ˆšâzŬ"j‚ùż¨ħŞï]˘ĈfQî5–ûO5–û?"j,÷BÔXî˙Œ¨ħÜ˙Qcı˙+˘ĈôşÛí5­ĝ|ÇíġëŞ \Ġw‰[ï˙›ùYœ˙Żġ`ŭžÚݐj S@…&š¨w¸ÙáIoïÎïêžïëê‘뉟ê™O1š8×[âB³Ä†çˆ+ ż'5ĵXÜhx™¸Ġ 1Ġ'ân_ˆû #~fĝWâQżOŝWñĴá˙/ŝ1&Z}&Z-€-€Î…‰@ÀD  K`˘`˘•0ħŭ&ĥ˙ÀDwÜD÷{Û˙`bû?Ll˙€‰ài jé* ö 0TÄÄB Ô;Üì$‡·wxg‡wuxO‡÷uĝ@‡uĝH‡uĝD‡OuĝL‡§xMœkĝ-qĦáYâRsĕ†ß×^,n‰eâVWˆİ†?wŝBÜoĝñ3żŝxÒżŠg ˙‡xÑ˙ˆéb˘íöz]L´Ÿ3ÄD[ñùŽ˜hUßıb˘U}ˆ‰Vġ]"&ZĠ÷11˜˙‹‰Ħ#šè6‚Mt;'ş³€&şÓ@'ş½ÊŬš‰aŬ˘Ö­ŞuĞ€jŬ* ZWuEàZWmD-L„ZQµ…&šnsx;‡wrx‡÷pxµâ‡qĝ‡qĝ‡Oqĝ ‡ µâUñ#ßçž).6ü¸Ü|qµáEâzKĊ͆—‹Û ,î„ZKŸï…ZKŸ„ZKŸ†ZKŸ‡ZKŸŸ†ZKŸŸ‡ZKŸ_†Z!ñs¨µèùÔZô|j‹ÑS³E­EÏyPkÑs!ÔZô|j-z~µ=?ÚĜ§€lh­[TëVĠşU@µ\ëŠÀµ\Û>jĊDQ¨SÑİjM·9ĵ;9ĵ‹{8ĵZq€‡8|„Ç8|‚§8|†?µWĊOŒ|SœoxĤ¸ĜğâróĊĠ†‰ë‹XK7ż\Ünĝcq§¨µôù^Qkéóƒ˘ÖÒç‡E­Ï‹ZKŸŸµ–>?/j-}~YÔ$~.j-÷CÔZî˙ĥ¨µÜĥ¨µÜž¨µÜĦ¨µÜ˙}Qkı˙‡˘6˜˙ğà³ĵ£ üapŝ8h˙›Àŝ‡é× êÜNà:·Ĵî÷)×ı"p+×ı"p+×ŜDÖD£­oëŽO6P'vwxoû9ƒ>ÌċqŸäiŸexЁ7Äı†ßž-.5Îá“>Íá³ O1†8×ÛâB³Ċ†ç‰+ /×ħŜ7Š:›ùıUÔÙÌÏTQĝTÜe~)î3ü­˜&êl·×#˘ÎŽQ{BÔٟψ:Ûëû‚¨³5?݈şÀ÷ÄĞ˘Îr˙7Eċŝ3EċŝïŠ:Ëŭç‹:ËŭıŞïRWġ]Ì˙E;İ´Îí¨ ëqġĞ˙ êŬ2z· ´>k'p½+×ğ"p½+×[  jĦêEÔšhqx‡w0P/ŝÁÎ`O‡÷uĈ:|¨á#œñ1Îà‡Oqĝ ??†zñşĝ‰‘3Äù†ßž+.7ĵ@\ ġĥĉçz¨ËÄMf°BÜfĝñS¨·Äù¨·Äù¨ż?3B½ĊÍ'ĦŜâĉ³PoqóE¨·¸9ŬâĉkPoqó-¨·¸9 ê-n΁z‹›ïYâĵê-q^ ġ–8/‡z÷ĊĞx€úu~hŭêżêŬ2z· ´>k'p½+×ğ"p½+×[  ^Ԋ:QhPÑÍê-oêĊ?ŜĠìéÎĝ@‡5|„3>Ĉœà)ŸaĝçâǢ>şĝ‰‘3Äù†ßž+.7ĵ@\-ê‹k~t½¨,7™Á q›áOÄOE½%Î÷ˆzKœġ_ŠŸ™ñ?‰GE½ċŝOŠzËŭŸġ–ûż(êmÍÏtËŭ_ġ–ûż%ê-÷Ÿ%ê-÷Ÿ#ê-÷ÏŞ‹D½U}—Šú`ŝ/êmûĜ y;ë:DŞ6‚5¸` ]×Dƒ[ԐÖDƒ+7¸"pC\¨…:р5Ñì$ b{;9ƒ]Ŝïcxgp°38ÜᣠçŒOr§ž.Î2<ĊÀ[â\³Ä…†çˆKĦÁÎùıÄ"q,7^.n šw@ƒĝLÜi_‰{ĦÁœĉAh° ù04ˆßŠÇÌĝßÄS`Nó4X| Ä÷Äth° ù:4Xœ ⯤żï@ƒeÍs-h 4CƒÍenÚdEû n#XC×S@°–€@Ş6‚5¸` ]× nPCZ4¸"pƒ+7Ä5€ZQŠnÖ ÍO2 ĥ7ĵ“3ĜĊá=œñ>†÷w;ƒ>ÚqÎĝ$gpšáéâ,S ĵ%Î5(Ĵêû°hüVß –û/ –û/ Î˙CGÔàö4„Ĵ£ Üİ a ˘qUGA4jh£[ژuD£[ԘE£Ğ4ş@£ĠĦ Q4AcĦ‰6Û:rG‡'hğŜËìç 2|¨38Ò뉆O1Š8kâÇ(Ŝ?1rĤ8ßğâbhóÄeF.W~_\6ós4Š•âV3ĝTL…FK™ï†Fñ¸Ï ~%ĤA£Ì@£EÌ' QüN< 1Ÿ‡F‹˜/C£ĝñsh´ˆù4ZÄ|-ežms.4ZÄ\–2/ħ”y4ZÄ\]ż@c×S@ĝGĈUѸŞe nhcÖQnPcZ4ş@£Ğ4Z  QԋÑhRÑmĥuäŽO6(v7ĵ—3ĜÏdĝPgp¤38Öá Ÿbàq†á×ďEcàMñ#gŠó ż+.yâ2#ŠĞŠXï6ós“h Ĵ·šñ§bŞh´”ùnÑĝFÜgżÓD£ÌˆF‹˜OˆĈÀïÄÓ˘Ñr˙çE£ċŝ/‹ĈÀŸˆŸ‹FËŭߍ–ûż--÷Ÿm+>çŠFËŭˆFËŭ—XĠw™h ĉ˙˘Ñ³ĵ`!cżÖA ëÁšş^$šÒU@˘É›ÒU@˘ÉĠšĴT˜‚ф5Ñj`Gî` Iüƒá]ÁžÎ`_8ò‡0|´#wĝdh/‹ÓŒ|UœexЁ·Ċı†g‹ _b`¸Âq 4‰eâz#Wˆ› "n‡&ñıĝİ‘_‹{ ÉÂċ$ŝQüÌ ŝY< M.Ÿ„&ñŸâh²pù4Y¸|šÄÄĞdùò›T —šiğ]fC“ċËó ÉÂċB —K ÉòċD_÷KĊĊhڈŠÀĤWšÒU@&WnJWš\  ÉjM…) ÑŠ^×$š­ĥqäšÄ?ŜĠìé ö5|€#qĝG;òx‡OM—ĊiF*Î2<ĊÀÛâ\³Ċ…†/1°@\QÄZ"Meâz3X!n6ü‰¸]4>?5òkqh²Şï˘)âgfÏâQÑd+>ŸM˙ψ&Ëŭ_MĥŜ˙ÑĝxU4Yî˙Ĥh²Üż˙E“ċŝóD“ċŝ ­êğD4Yî˙Apŝ: ĤµxUÀżĴ•@4gínÎú=€f· 9-‹ĉt¨hvEàfĞ4ğ@³Ġš]  Ħ šE 4C³˜T,ĥ7°“#w1,ö0ĵ·#÷7|ğê0gp”ácy˘áS ü\œaĝ ñch3ÄOŒ|Gœox¸šĊ{â2#‹Ğ Y,×ı\ÜÍ+o…fñ™¸š-VŜÍâ[qŻ]ġkñ 4[Ĵ|šĊżŠÇ ÙbċS,ŝ[< Í+_„f‹•Ó-VÍ+߂féGb&4[Ĵ|š-VηXıš-Y~ßbċöP+òjœutó:ÍY;›³~ ÙíhN‹Àĉth Ù›­ìjÍVhv5€fÑ(šDs E4‹ĉÀ$²9°½ı‹fħ‡á½ıżáƒÜU‡9ƒ£ ëÈ Ÿbàçâ oˆ‹ĉÀ ñ#ßçž+.́÷ÄeF.–́âZ#—‹E³ĊÊ[Esà3q‡hĥXy—h|+îµĞ~-Í+́‰f‹•O‰ĉÀ‹gE³ċŝ/ŠfÛë;Ŭr˙×D³ċŝo‰ĉÀÄLÑlı˙ğ˘Ùr˙ùĥâsĦhĥÜ˙ŭ`ŝoĠiûšCĈY@Ía ä>ђµ ¨%Ŭ ZÒ}˘%ĞR˜‚&Ñ-"ÚèÀÛĜё“ ìĉȽ ìëÈ ´ˆC áÈc oà%q²áÓ ĵ.Î2<ĊÀ,qá9âBhóĊ%F.W@‹x_\mä‡âzh+ĊMF~*nƒñ…˜jä7ânhħLù~h˙$ĤA‹ÊG EüğxZ,P> -ñ´X | ZÄÄthħ@ù:´X œa™ò,hħ@9Ç2ċùbr‘eÊïC‹eÊĥòŬXגµ ¨%ŬhI÷Z²j-…) ÑŠÙhSŜÎÀŽŽœl`7Gîe`_Gh EjĝGcĝx/‰“ Ÿfàuq–á)f‰s ÏŠ–À|q‰‘‹ÄRKà}qµ‘ŠëEK`¸ÉÈOĊm˘%…˜jä7ânÑbĞeî-ÓD‹U}-‹Ûíġ´h ž-–ûż$Z?ÓE‹ċŝŻ‹ËŭgXî?K´Xî?ÇV|Î-–û/²Şïû˘%˜˙‡Ž¨%tı,ó0¸?v­Y? ٚ˘5ë'![³ö´fŭ$dЁ[Ŭ* V+·ş"pĞĠZ]  Ġj­ Í"Zħ&ĥ5°ƒ#˙ÁÀZĊž†÷qä†väᆏ2œ8ΉĤ‹S Ÿaà-ñch3ĊOŒ|Wœ­bž¸Èȅâ2hKĕF~ …VħBÜ`ä'âhŸ‹ÛüZÜ ­ââ#˙Q<­â·âgjQòQh˙!ž€V‹’Ï@Ğâyhµ(ù2´ŠŠŸCĞEÉ7 UüHš!Z-J­âïĊhµ(ù´Šžb´Z”\jQòC{´è Àí‹ĝ0¸ÖĴŸ„lM{´UĦĝhÑ ĦĝhÑŠÖi@kÖOBĥZ¸Ġ­jµ"pĞ+·Z  ĠĠZ­êj­˘Y´„˘—ĥŠÖÀĥvpä?ĜĠ@ĞĜÓ>Ž<ÀÁŽ<ÜQžÇ>ÑÀtqŞá3 ĵ%~,Z3ĊOŒ|Wœ/ZóÄEF.—‰Ö %+ü@\+Z+Ä F~"n­ÏĊíF~-_ˆ{ŒüGñ€h üVüL´Z”|T´ŝC#ZAÙÀkâthoгŒœb`ĥ8׈K M,—ıL\ mbı¸ÎȏĊM&>·ù•˜ mâ[q´YˆĵÚÄoă&ŝE€ĥô Ú6¨7€@[Ö´eŭ(|›­jKwÚ²ŠÀméNà@›ĠÚ\  ÍĤ€ÚDĞhmm lo MìlxğĞèÒm½ ìç.9ÈĦŽ<Ò1^'>ÙÀkâtÑxSœeä³Ċı†/0°@\"ڂ‹Ë\&mċâ:#?7‰ĥÀgâV#żSE[à[q—h³YòûD[à7âAÑĝñ]ò;ñ˜h ü—xR´ÙIϊĥÀ÷Ċ ˘ÍÎùyE´ŝBĵ*Ú,÷Ór˙·E›ċŝ³-÷Ÿ+Ú,÷_`ı˙bÑè+–Š6Ği/ P[ÈĜÖ’£ 2À ż[3€˜ÔĊ˜”µ`RÁĤĴ 'Y `’+O²À$ĞLr5€I64 Z €˜˙Ÿ½·ì²ëşÖuŸ§›cNÇNœ8ÉÎŜ˙à|ğgŸ]¸ŞjĠb–™™ċ&33333ˌ²dĤ 11³ïİ;UQIÖÎ íÓnkúÌ1Ç*µ5Û\Ŝ·÷>ú O üıħ˜PNè“zr+Ħ;á#›%l™p‹l›ĵCÂŬ² ôɽ²{6L‡>y\fd9úäi94HxIށ>ù™Ÿż’“ĦO^•Ó /ߏ³ O^—sĦOŜ’ ò#ïÈ%'ïËċ—ïÇĠ'ŸÉu'_ʍ—­'KÊ—Ìïƒ>YY„…>YSfA_ŽOĉĝĝ ôċĝĝBŽ/5@ßüÀ„/8…}˙r} ‘€‚İòú’ôMUş/=€ &p_z}éôMúRê“˙œ;ÄĵWş/L(ĝçĈbB9ĦOêÉ­„l–°eÂ-²mò wË.ÒÜ+ğg^ Èté —Ù8G’ài9t^£GäŬ—äé ~&ÇgŻädé ^•Ó¤/c~Βàu9Wú‚·ä‚üÈ;r‰ôïËċҗïĠÒ|&×I_Ü(}YéáVé –”;¤/k|Î̵˙}ÒĴ,J_ŭ•`M™%}ıö2#>Ÿ‘\ûżk˙—Ï  İòú‚˜ĝÛNÒż€ô/Đŝù=éÏ( ŝİ˘€úÓîŸêD°ŝôú§òúSêŸ+Á˙‘~èƒ~€~è—áıŭ2–PJ¨N¸ÛLè$ôËĤÉ[$lpğlŸĵS ȞÉû$ì—0[€~yJÎĈçäpè—ċ(藟Êħy÷—r"ôËŻċè—ßÊéy÷59úċM9úsu|ôË{r)ôˇrôçàx ôËr=ô‹rôçàxôËÒr'ôËr2úspĵúuUyúsp|,Ç' _֓'Ħ?ÇgsuüôË÷äeè˙‹€ĵŭ ñ !;è˙Ğ'€ !;€ !@?żôgP˙TQ@ŭi÷Ou"XzŭSyŭ)ġϕ€ä˙ŭÒ'ŭÁ€ôK0ìĵ7ı?K(%T'Üm&túeÓä-ĥN¸]ĥOŜ)aׄdÏä}öK˜-H”œÏéáÒĵ(GIS96ïŝRN”ŝà×rŠôż•ÓóîkrĥôoÊyÒŸĞ‹¤?xO.•ŝàCıBúSżFúƒ/äzé”›¤?³½n“ŝ`iıSúƒċdĤôçÚ˙~éV•‡¤?×ŝċÚ˙ é֓'?×ŝÏfÄç Ò|O^–ŝ<`b@̗6ĦDÌW n‰`ŭñ·ŬLU b`Ħy )!iLe¤0018H` % ıü§ ÀAŸ À Èĉфñ„J€4’Û ½ w7OŜ*aۄğdG{d—lÜ=áaÙä1™ò„ÌÈğ&<+‡Â€ĵ GdÑ ża@^‘“`@~#§ĉŬ?ș0 oÈ90 oËùy÷]ıäı äcırdĵıd1ırdĵdYı dırd| —Ĉ€Ĵ)Á@ŽŒ³siü Èò, äÒĝEÙxâ@~ É€ (XhÀÀBJAiLe¤001¸` =€”€ĉJ@òŸÁ€ü—ôĊĵ—v òÏ<š0žPIFr;Ħ7áîĉÉ[%l›p—ì(Á=²K6ì-Ác2]‚'dFŜ=0áY9T‚äˆl<:árĵ ŻÈI2üFNÍğ3e xCΑàm9?ï+Ë@\&ÁÇr ¤ë{­ È 2,&7Ë@f{Ŭ.Á²r— +È=2ñŝäÚ˙a֔Çd ×ŝ³sí˙” ȳ2k˙#ß˙ĝóh`ŝ<€ ™À󗂘jĝo0Èà˘ 9¸( Ì( Á…T•Á4çŻ*ƒé Ĥ0ĝ•0! t0% Aè‡$˙ÉHB1ĦœPK”Vr7aӄ›eK”Ûd›lÜ>a§„ûe7”‡dÏlÜ'aż„'ċ”gäàl<,áe9 ċçr, ÊŻä„ĵ{rÂïċt”×ċ,”·äÜĵûŽ\ƒò\ƒò‘\ƒòİ\ƒ9,^ƒr# Êr ĉ°xG‹w Ĵ$÷ ĴŞÈ`‹äşĝq”ġd6 ĉ°ĝt‹ŸËañĊüĤ?Ío:uh~ÓŻ‰Êoú·™bŜ7ŭš( ˜÷M§Ž 3 hp!Ġ@ƒÁ4çŻ Ĥ0˜ÀàWÀ„0Á”€_bŜ+=(ƒÁHB1ĦœPK”Vr7aӄ›eK n“m²qû„î—Ŭd0xHöÌĈ}öKxRÁà9Xu08,ï,GÉ`s9Vƒ_É y÷ä„ßËé2ĵ.gÉ`–œ›wߑ e0x_.‘Áà#ı\ƒOċ*Ìañ: Bn”Á` ıE3âóŽĴï· +ɽ2Ĵ*È`ŭɵ˙2Ĵ'³e0×ŝOçÚ˙ıÈ÷?żéOó›N 68&ü@~ÓżÑ0á<€ĦEKÊ<€Ħ…ƒ“ĦŒJxh*x(=€Ħô†Òšà 0”PJ@C0C2$‚!K(%T CÒIž–°yÂV wÊv0$3eÇlÜ%a÷„Geo’Y2†dŽÌÈğ&Á°Ĵ-Â°Ĵ'³`X֗90œâ39 >/ߗċ%žû€áÌ^´bpyÀ?ŞÜ³ôpF /ÊyÁpšÀé /à<€ıÀpz) §4,s'žû/MO¨$ÔZ ×K/y³„-ĥIĜ>á>ÙY†ƒe·lÜ3aŸ„ŭž–d8|N–áàE9,ï™pLÂŻċ~+'Ëp9M†ƒ7äÌìvNÂğr ÈĊ2|,—Ép™\)Á—r §ë{ƒ KÊÍ2,#·Ép°ĵÜ)ÁJ2S†³Îϟß֖Ge8XOfÉp°Ì‘á\û?“k˙ç#ßNx8£€†çϘŞpĈ8 Ç?f˜P ¨™À…˙ց0RÈ( BšÀ…4 9F éÒ(¤PH ¨PaƒR€a(È  Ċ„rB-Ħ™I¸I6MŜ"aë„ívLĜ%áÙ ò¸ì ™-ÓĦ OɌìv`Â! ?•#  ż£Ħ ŻÈqPßȉPßË)P×ċôüàÛr6ä9 ò\ùH.‚|*—CAĞ  ʵPÈÑF(ÈÒr d9ı ²˘ÜYE.÷C!G‡s4|,G'  ȓPä(ÈĈò<ò°ÀÀäLàBÖ*üÓ=€ ™À…˙ց0A!£€ iÒ.,ä@˜ @!=€Bz…”€ )ĉJ@2dX Áˆ¤Ê µ„fB'á&Ù4y‹„­ĥKĜ1a—„Gd)ËŜRfËt)OɌyŬ<0û’S9B Á/äh)ŻÈqR~#'J!ĝ½œ"…àu9=?ĝĥœ-…à9O ÁûrĦ‚ä)ŸÊċRĞ¤(×J!]ß,-·H!XNn—B°˘Ü%…`ıG Áêrż2×÷á\û?–k˙'¤l OJ!ĜHž‘B°ħ û%<+Àˆĵ ˆĵ,‡Áˆü\Ž„ù•#òŞŸ<)áԄ·äL‘?É90"ïÉù0"ÊE0"ŸÈ0"ŸË0"ÈĠ0"‹Éu0’CáM9Ŝ #²‚Ü#²²Ü #²šÜ #²†<#²ĥ< #²ž<#9ÎÎĦİ ŸÍµ óO0’y#™6òO—€%8É<€‘ ùëN FÒI`$=€‘ôFRI häĞ0ı #swÁˆŒÈH0–PJ¨&4Ú ½„[es d$¸[ĥÍğ;$윰[ž û$ì—Ĵ #Á r°Œ/Ëa2ü\Ž”‘àWrŒŒŻÊñùÁ“NMxKΔ‘àOrŽŒïÉù2|(ÉH‰\*#Áçr…ŒÈĠ2,&×ÉHş7eÄç­2Ĵ wÈH°²Ü-#Ájr݌kÈ2Ĵ-ËH°ž<&#İûÏε˙Sıö6òŭŸ‘ŒÉ0‘ùÁŝ'€…ìd4@G3 h4£€FÓMx4=€ÑôFÓM`ô+`˘ œÀhz£éŒBFdFaTĈ* ġ„VB7aӄ-ĥN¸Wĥ‡Qy@v‚QyXv…QyLö€QyBö†QyRĤ¨<#3ò/˜pHÂá G%›;9Fċ59FċM9FċrŒÊğr.ŒÊrŒÊÇr1ŒÊgrŒÊ—r%ŒJÈ50*KÈġ0*KËM0šàm9Ŝ™àLY]ż!÷Á¨Ĵ%¨Ĵ+À¨|K‡QÙ@f¨l$OÁ¨l,Ϩl"/ÀèÜŒ~íà_|XÈ ĉ}ñïÇĵ/ŝ`4£€FÓMx4=€ÑôFÓM`ô+`˘ œÀhz£éŒJAF‚Q•Ñ`<Ħ’POh%t6MĜ"aë„{e{ d4xXv•Ñà1ÙCFƒ'do ž”é2<#3tî_80˙Ô! ‡'•plÂïäD ^“Sd4xSN—Ñàr–ŒïÊı2| Èhħ\,£Ágr™Œ_ʕ2„\#£Ár½ŒKËM2šïmñygf{ÍÌúŝ÷Éh°–<(£ÁşòˆŒߒÇe4Ĝ@fËh°‘<%£ÁĈòĴŒ›È 2ó@£ó‡ÎŸö?uĝûœ <×K`,=€ħôĈRK h FaLŠ0cRN¨%4: Ó6OĜ*aۄvNĜ-aτ}öKx^€1yI†1ù™còK9Ĉä×r ŒÉoċx“?ÈI0&oÈİ0&oË0&ïÈÙ0&ïËy0&Ʌ0&ŸÊ%0&_Èċ0&ÊU0&‹Ëµ0&KÉ 0&ËÊÍ0&+Èm0&+˝0&ĞÉLËAŝÊAÑgċ 8'WÁOç*ĝı<Ùĉż!ŭϝŝ>gÏġĈÒK`,=€ħ”€ĈR“Q Š2&cA9Ħ–Lè$LKĜ’ó $ŸÊ…P’/ä(‰r9”dqı J²”\ %YVn€’Ĵ 7CIV–Û $ĞɝP’5tffğܗc߃9ö=’cß²‘<%ÙXž„’l"Ï@iîJZÊ0Ò˙@PÊ0R†–2 ¨”Q@Œ*ePi%  ”P)% RJ@”€J)•R*T’q)e)I)¨%4Ü")·Ë4)›e‡-ĥIĜ>a§„]öHĜ{8]JÁ 2CJÁËr ”‚ŸË!R ~%‡K)xUŽ’R;9VJÁkr‚”‚7ċd)”Ó¤œ‘˙ÑÙR >’ó¤|*J)ĝB.‘R \.`qıJJÁRr­”‚eċ)+ÈÍR V–Û¤Ĵ&wJ)XCŝüŝçÙ^f}˙G²ÎÏÁFò„”‚ċI)›È3RŠy  RšÀ4Kñ?qr&‚•˙ꀔÓ.§ \N¸œ&pù/<€ù2Ë)•S*§TN ¨ E—2”Ħ,Ġ„”•—Ŭ„MĥHĜ:ağ„v²Ì–ŬĦ,OÉ^P–ge_(Ë~Ùs˙„ƒM8Êò[9Êò9Êò†œey[N²ĵ#§CYŜ—³ ,çä9Êòı\eA.…²,&W@Y–”ĞĦ,ËÈuP–ċċF(ËJr ”eUı=ğtM™ eYG|S„²|[²l(CY'³Ħ,?§rċûì×‰`ċÌ.˙ËNA9ÁÊġ (§ \N¸œ&p9Màò_xóe—S*§TN ¨œPYŠ2”,ċ šrÊËnÂĤ [$l°]Ž ğH9˜-ğK9xJö’rĝĴì+ċ`żìıÂA ‡&!ċà·r´”ƒ?ÈqRŜĵ-§H9xGN—rœ%ċàœü#çK9ĝ\.’r€\*ċ`1ıBÊÁ’rµ”ƒeä:)ËˍRV’[¤Ĵ*·§ë{W°Ĥ̔r°ŽÜ'ċà›ò ”ƒoË#R6”Ç|OfK9ĝ<ùŝç0EP†–3 ´œa ċĝ™¤’µ€*‹TÉ( JFU2 ¨²pX*éTÒ¨¤PI 29 ¨’P%% JJ@•”€*P‚²T İCEšyÙI˜–°yÂV ÛBE‘ "ËÎP‘]³ {'L‡Šĵ$3 "?“Ħ"ż”C "ż–Ħ"GĉGŽI8*ò–œù“œ yO΀Š|(gCE>‘ó "@E”‹Ħ"!—AE–+Ħ"KË5P‘ċäz¨ÈŠrTdıUV“ÛĦ"kÈ]P‘µċ¨Èzr?Td}y*òy4G½Y9ê͑Mä)¨ÈċY¨Ìŭä£x9Ċ×K@PÉbp•ÊóĊš1ïQ,JP%£€*TÉ( ÊÂMࠒ@%=€Jz•ô*“£€*)URޤTI ¨"%)İH%¨K%hĉe'aZÂĉ [%l+•àÙA*Á²³T‚]³óÀ½³eşT‚—d†T‚ŸÉR ~)‡H%ĝµ.•àÈüÈ1 ÇK%xKN’J'9U*Á{r†T‚ċlİŸÈyR .J\,• ä2İKȕR ––k¤,'×K%XQn’J°ŠÜĴ&·K%XCî’J°ĥÜ#•`=ı_*ÁúòT‚ïÈ£YçgVĉúÎ 6‘§¤üXž•JšÀ•4ç>Š…ċd"X%Áĉ>ŠÔ ĠE”€¤šyĠEÜH5MàjšÀĠ)% İĤPM š@ub€TSŞĤTM ¨šP*P•TU¨J;Ħ—°Y–P•e¨ÊvÙcÂ. ğCUž‘½ *ÏËP•ŭ²ŝ % UùUù½ Uy]ŽƒŞœ=O†Şĵ+§AU>3Ħ*Ë9P•Ïä|¨Ê…Pċ¨Êâr9Te)ı ޲Ĵ\ UYAn€ŞĴ,7ËŞr+TċrTu-ıŞ²Ü Uù–<CŜ²Ħ< UùžÌ‚Şü@ĉ@U~$OË3 ß@5óŞ‹(AġRşşˆPPÍ<€ê"î‚jšÀĠ4ĞSJ@A5=€jzĠôŞó‚jJ@Ġ”€Ş)USŞJEŞAMŞACŞR Ú ½„Íĥ”j l#Ġ`ğlß1a—„Ŭ<£{I5x^ö•j°_vĜ?᠄CüFސj{9ZŞÁërœTƒ²çÉR Ŝ•Ó¤| gJ5ĝXΑj™œ/ĠàBİÊ%R —Ë,%WI5XV•j°‚Ü Ġ`eı9XUn•j ıCŞÁZr·Tƒuċ^İߒ²ÒÁ†ò¨TƒïÉ,İ?9R ~$OG˙ ŽŞfP5.8KATï7Hm‘Áj_w$d-£€jT[€ \K¸–&pm²PK –@-=€ÚäD°ZJ@µ”€j)Ġ  İAMễVB7aS¨É}²ÔdĞlß6a‡„Ħ&OÊnP“=²}ï„éP“ŸÊ ¨É/ä@¨É+rÔä°ìy$Ôä59jòĤ5ù£œ59%{ž5ùH΂š|*çBM  &AM“KĦ&KÊP“eäj¨ÉòrÔd%ıQV‘›Ħ&ĞËmP“5ċN¨É:23Çğûd}yjòyjò]y jò}y"Çğ'ċÇò4Ôĉŝ –Q@µ…›ÀP[Djó ¨-r"Xí뎄ĴeP-£€j 0ki×ÒMöjéÔÒ¨P›œVK ¨–P-% š”Ô¤ԝ­„nÂĤR î“-¤l•íÛ&쐰³Ô‚'e7İ{èÜö½³tİ?•R ~!J-xE‘ZpXö–ż@š 8²ı<iNıfF5'šÀÒL¸9ÙhĤL 9ħ„4ÓhNĴ*͔€š)5Ħ,M¨BMš€Ĥ´  MéBSĤċċĉ [ASĥÉËív‚Ĥ<-ğBSvÏö½ )/˔ŭ²}˙„ƒ )ż•CĦ)‡gûQ”·äXhʟähÊI”äThÊÇr4ċ,hÊr.4Eıš²¸\ Mıš²Œ\MY^†ĤĴ$×É*r4euıš²ĤÜ&këҔġänhÊúr/4ċ;ò€l$AS6–GĦ)›È,ù‘̆ĤüDž‚ĉ”;h.<š ¨Úüï‚ĉŽ„l.< hNıšԜhÍ4›“=€fzÍôšKAÍôšЁ͔€š)54*µ ) i-iJ3èJ3˜–—›'l%Í`›ĵÜ>a'iOËÚ vÏö½¤ĵ,ûJ3Ĝ/Û÷O8HšÁoċPi‡gûQÒ Ŝ’cüINfp’4ƒäTiËÒ Î’f…œ+Í@ı@šÁârħ4ƒK,#WH3X^–f°’\Ĵ"7H3X]n–f°ĤÜĴ-wH3XOî–f°Ü+Íà;ò@°‘<$Í`cyTšÁ&2+ĝ‘Ì–fyJšs=€ù˘€šñ5y͘:¸ 8ĉݜ¤µ€óZ 8µ€<€Vĉ´&Q@­É&p+MàÖD HZé´&{­ôZé´àK+% Vz-’VJ@­”€ZP’VšÀ-¨CCZ’™Ò–ô˜×²´äaÙZ²uĥo-™#;BKvÎöŬ %/Ȟ’½³}:´ä—2Zòk9Zr0´ä÷r´äu9Zr4´är´ä]9Zr2´ä#9 Zòİœ -9Z‚œ-YL.„–,)—ÈÒr´d9ıZ²˘\#+Ëu’ĠäFhÉr‹Ĵ%·AK֕;Ħ%ߒ™9ĈŬ'Ê’ïÉ9Ĉ=&?”Y’“9òï_íäYhMiC럛´p@k‡Â·Ê<€ÖÄ@Ê( Öd¸•&pk˘´ÒhMöZé´ÒhÉ˙Z)µÒhÉPJ ¨•PKJA+Mà–Ô´¤̔Ž´‚žóZ6“V°l)­`ëlßNZÁÙQZÁÎÒÒV°›´‚dOi{g˙éÒ ~)3¤üZ”Vp°´‚ßËaÒ ^—#-­àrœ´‚wċDi'K+ĝHN“Vİœ)­àliÈyÒ “ ,)—KËeÒ –“+Ĵ(×+ËuÒ V“Ĵ!·kÉmÒ Ö•;|KfĤë{_°Ħ< ­à{òpf{=üPfI+ĝ7™ùŝ§ ܊İ@[ ÏXP)ˆżÙw+מҐöLàö”‰`ҞèH;=€öä0vJ@í 礝¸q÷ IDATPĈá–4Û)µĦ 3Ħ mé&l mّӠ#g@G”³Ħ#çBG—  #KÉĊ‘KĦ#ËË‘•äjèȵ‘ĠċèȚr³Ĵ-·BG֓; #ëËŬ²ÜÙHî—ïɃ‘È#‘Éòoòtä?äɉ;y: íL>Ĵ3ċ:˙D8ĉ=˘żœbŜ#úv†vp"XgÊRAgò‰`4;“ÏîL4ƒNzÉa  íÈpI ¨“PGÊA'% NJ@iéH'˜&`³ĵÜ2aéÛċċŽÒ Ÿ v‘N°[ĥï)àg²t‚éÒ ^‘Ò ÈnK'xM“NpDĥ-à9N:Á Ò >”“|"§I'8C:Á—rĥt‚s,.H'XJ.–Npİt‚ċċ é+ÉĠÒ •N°şÜ `Mı9X[n•N°žÜ!`}ı;Ĝ@î‘N°‘Ü|O”NyD:Áäñàßä é˙!Oĉ• ܉İ@;1) SgwbŞbpóM˙š¤ğh™ÀŬEİ$Ŭ‰;éfPw² ܝœÖM¸;ħ¨t'fK7=€.ü—tSêÂ\ŸP7% .”¤›P7% .´¤ èJş²)tĦ+[$l ]Ù6/w€ì”—ğBW^’= +{eû•ŭòrèÊïä èÊ!Ù~8tċm9 şr tċ=9şr"tċc9şò™œ]9ş˘œ]9ş²¤\]YF.\]YQ„Ĵ"×Èjrte ışr3te]½Mşò-ıS-wCW6”{ċğr?tċûòtċ‡ò¨üX‡üğ̖9ò$tÓîNô ğ(µ€ ğhgw˙Ĥgw-¸ğ(µ€‚îÄ@Í( îd¸;9Ĵ›&pwb5 ;18èĤ•˙ ş)ueHO ¨›PWJA7% nJ@]i]éH7èI7ĜTşÒ ĥHĜZşÁĥyıƒtòrWé/ÉÒ öÊö}엗ûK7ĝ$Ŭàl?\şÁÛr”tƒc¤ĵ'ÇK78QşÁÇrŠtƒÏätégJ7PΑnpžtƒ%ċBéËÈ%Ò .“n°˘\)Ŭ`ı&XM“n°†Ü(ŬàféëÊmÒ %wߖğl(÷ߕû|_’nCy4ĝħ<.Ŭàßev0Gž”nšÀŬ˜ԝ2 tD°î”™ÀóUíĈßpĝ‹€ô-Ĵ79 ´79 ¨·€R½É&poòĦ½4{ż¤—@or)ˆŜÄa¤—a =(H/% Œí)ġRêASz†Žô 'Ә›COfÉV“m²}{èɎyı ôd·ĵÜzò Ùz2zòŞÌ€žŬ†žĵ!‡AOŽ€žüIކž =ù@N€žœ”Ÿ:zò…œ=9 z²˜œ =9z²´\=YN.•ärèÉÊrôäèÉ7äzèÉZr“Ĵ#·@O)·Ëúr'ôä;2S6’{Ħ'Ë“Mäaù‘< =ù‰Ì’˙Ù› ÏCorhoâ½Eñ ÷Û½EKëMíMŽê- Do² ܛ|(|/MàžüŻ —@or)ˆŜÄa‚^†ö¤ôRêɸܞP/% ž4ƒž´ô¤Lsl.½`–l%½`›lß^záŽyı‹ô‚ŬòrO鿐}¤L—^ŞÌ^p@v;XzÁr˜ô‚#¤üIŽ–^pĴô‚äé'ċ§N•^…œ!½à,é‹ÉıÒ Î—^°´\$½`9ı4XA.—^°²\%½àéߘ{l°–ÜĴ#·H/ĝĤÜĴ/wJ/ĝŽÌ 6’{l,H/ĜD~$J/ĝ‰Ì ŝCfK/xrBW&porPorhoÊD°ùJAôbŞr— à/v2mr"Ĝ´‰;™ĥ(µ€dÚä3§M6§MöĤMöĤ0 ŝ™–À´ŻÁ`PĤÁ0ܔ´”€ĤAYĤ4 2 ŝ_öÎ3\²ŞÎúżġ1:c}gĈwf_G$眑ŞşšœS·t“C“ĦŠÊ‘ ó¨0Î8’‘ A˘"ŠHNï‡şğ8ûÔ>§NŬ{;Àíœó\ĝP<Ûµ~k­½ì)r°·ÈArbäÄL÷: râfq äÄÁîûaG¸×£!'Žuݳ!'ä^çAN<.N†œ8râIqäÄYO‹s 'Îs˙ԅ/‰"äÄ%ˆ*äDrbIтœè@N,#.…œ¸râ½âJȉ÷‹ĞĊߊk!'>$_‡œĝ˜ô-‘߁œĝ¸ĝäÄ Ÿ?‚œĝ”ĝ‰ĝ´ĝäĈ_ŠÏ‰˙†Ü@ˆ›!7² ,_ËùSıĊ¤`äü"X.ŞŒ\–- #çß œó!pÎg9Ÿäȉ ŒœcıALlaäÄVâëÎÊ9 ('v2rÎʉŬŒœĜCìiäÄŜFNäDΘ!rĈL÷:K䌛Ċ"g:Ĝ}?LäŒ#ÜëÑ"gë^g‹œñ%÷:OäŒÇĊÉ"gœ*rĈ“â ‘3Î9iqŽÈçıêB‘3^E‘3.9Q9£.rĈ’˘%rFGäŒeÄ"g\.rĈ{Ċ•"gĵ_\mü­¸V䌉덏ˆŻ‹œñ1ñ-‘ë/âß9‘3>!~$rĈ§ÄOŒO‹Ÿ‰œñâ—ĈçÄ‹œñ?â×6ñ€rÁP 4g^ çÁrÚZÀXs"=DŜOċ}œ÷‹`yŸä}÷c yÇò°ıÈğhĥygċaG‘wPvyĜöyĜKäaȉ<äE‰‡ŭ /öwŻA^Ü!…ĵ8òâqäĊ1ˆ!/ĉ@^<"ĉB^œèŝ%§@^œĉ^τĵ˜ï^υĵx^\yqäĊ+˘yQ†ĵ0Qƒĵh@^,%ڐ]ȋw‰Ë /€ĵxŸĝ äĊĠ_…ĵ¸òâ£â˙ -ŝIü'äĊ?‹ï‹?€ĵĝ¤ĝħĝwñȋψŸ‹ÏŠ_B^,+~Ġ? 燎ò~ 4˙ĤŸƒĥ‰ŸëS.”÷S@yçŭ"XŜgyŸäŭhŜ1€ĵĜÜÈğh^lc䝔;ygċĊF^ì.ö0òb/#/ö9#/òFAû‰ĵħ˙ÄĞyq¨È‡‹ĵq8JäcDŜx@/òĈ‘7sEŜ8Ñŭ;Oy4÷zĤÈóŬëı"oXÛgݧ€`El)ĥê3€È`;ˆ´³›‚ôúxogċĊ (ÀLħ/ì'fÁŝp€8!p¨8 GÀ‘p”8ŽÇÂqpĵ˜ sėà˜+ĉÁ‰â$q2œ"N…ÓÄéâ 8SœóĊÙâ8Wœç‹ Ä…p‘¸Š˘$.²¨@UÔD˘ -ÑèŠ\*.—âËpĝЏJ\-kĊWĊuâzñ5ĝşĝ†ôMñ-ñmĝŽĝOñ]ñ=ñ}¸Aü@üPüHün????‡_ˆ_Š˙˙-~EDˆ[ñ¨wo{ŝ€à¤ĉĉƒ‹5cE0ï0_X<ƒÀËùx%żĥşÏÖöÀë) ħ‰E€ĜÒĜŞÏ"7‚í`ìè, ŬÄ ‡À{; (oÌ1ÓĜWìgÌû‹LŠƒŒƒĊ!âP0q¸q„8Re-Ž1ŽljÙbŽñ%q‚˜kÌ'''‹SŒSĊiĈéĈâL,1ß8Û8Gœkœ'Î7.0.‹˘Q2.e£"ŞFͨ‹†Ñ-£mtD×è‰KËŒËĊĈ—Ċ•ĈWŒĞŒĞkĵĈWëŒëŻ‰Żß0i|ËĝĥĝŽñŸĈwïß7?0~hüÈĝħ¸Ñĝ‰ñSgĈÏĊ/Œ_˙eü·ñĞ>0n2g··›cĈ]ĈŬĉ€qŸqż9`€‚-ĝ) ‚?Q!pÁ‡ÀżV€5EÁ1€Ĵ' Ž`cQp  [ˆ‚‹`[Q€íá{n ˘;.À˘à pr˘3  fBAì(ˆ  r݇BAî^‚‚8Ĉ½1 â11 âD(ˆ?ŠS  Nƒ‚ĝ‹8 b>Äsâ\(ˆóĦ ^AAĦ $ÊPU(ˆ·‹†XZ´  Ŝ)şâŬâR(ˆżWˆ÷‹+Ħ ‚‚ĝ¸ â:(ˆ‰ŻCA| ââ;P߅‚ĝ„¸A|Rü âÓâFññS(ˆÏ‰_ˆeĊAa ÄMPS@…¨…7“0 ~ ´à§€ ŝDÁ‡Àü"XAĴi(ˆġŒ‚cħħQp   ĥ0 .ZÛħ½ĝž›‚(ˆûĞb7£ ö0 DÎ(ˆ˘`Ìc?QÓ˘`4ñÊĦ˘`î^÷zĵ(sDÁxLÌDQ0ŝ(N4Q0ŝ"Îc(ωsEÁ8_Œ—ĊE˘`EÁ(‹‚Qí˘a,-Z˘`ĵStw‹KEÁĝq…ñ~q(W‰‚ñ!q­(׉‚ñ1ñuQ0) ĈÇĊwDÁĝ(Ÿ7Ÿ?ÓâF3⧢`|NüÂXVü—( q“(ĝS?TˆĈ@c=€X86[] iî˙–˘&q(ŜûF0Ċ!²>^чÀ}°†ÏÖñ§ 6ôc ›ùMàÁƒÁv;EÖ@ûSğ÷숀Š(˜ˆ€ƒQp„| T€Żà Eœ£ˆ€ Qp‰" ê˘MÑmèˆ.ôÄâ2¸\\_WŠŻÀUâj¸F__—!)ßVDÀ÷Ċ 8?7QâD€ĝ" @ÜJĤû›ÀĝS‹ŝ°xxt (Ĉ,—ġ!Š>î3€5|°Ž?ħĦŬÌooí.…ßÎŬÖżf°ڟ‚Ĝ½ÏÄ^Qb†E€˜eÚ_`([Dˆ#ÌW–Şä+q†E€8Ç" @\h .ħˆu£!šFËh‹ŽÑ=R2qıq…ĝ²qñq•qµ¸Ĉ" @|Í" @|Û" @|߸ANˆ7*˘Œ_(˘  Ż  ŻÌWĉ@?dNôc ĉ@ż`0_˜ŻÌS“:”AÈ?!g}üy÷ÀŞ>XÓgëù À³€4e ˆˆ$fħ€ÄD, q(î?8RG‹càX8N³ĊÜ0OœˆûN§á, 8KÌ'b‰ó‰X@˘HÄҔ- | &, ŝ€³€Ä â8 HÜ(~??ƒŸ+bQâfBcpÄ{÷ù=€Ñ €…rX`ŝ`ñhևÀŸ÷!pŸĴê3€5}°žÏ< ÈĤl)b3Ġ·€4Kìo ^·€ŒCĊaĉ, (q´ı˙d/fsėŒŒıbžq˘8É8Ù8Eœjœ&g‰³ŒùŠX@ĈùŠX@FQ ÈĤlÉ·€ä, ŝ g7?³€ŒŸˆŸ??·ˆÔg ¨ÏÌ?äŠX@ƒù€ù€  2@`ĊÇà‚÷ĚÀ+!ƒ @>PDÀfšH šÀŭvŭPäB˜ ğiïéô!„€}Qp F)2(Rpž" .VD@ETĦĤˆ€ĥ" .—‹+ėĊ•q\-×ÂWĊup½ĝšôuñ ñM|@?ˆ(ñkÂ1Ĝèh ˆ ÓtX È2@`‹Áïˆ5Wn€ù À" @lf) A¸ŸڟŠ\3ĦÄn6÷ŒôúxBˆ}Mû‰YĈŝâq RÊ l”çYDˆ‹-˘DĊ¨ŠšE€h[DˆËŒË+Œ/WŠŻW‰ĞkŒkĊWëÄġQò€20€ŝ ˆè[@08ä+E€ù `p(tÄ€pcpYzÁżù) `8żĤż›ƒ^ߟ‚ÛŠĴN(€˜”÷C @C @C î[@·€4P_Àr ~JìR@ħ1¸@Œ €…nYĤ@0ôo~ (Ĝ@`‹_ÓßZ˟ƒ^ߟ‚ÛŠĴN(€˜ô:–‡€†€ePR6¤²@à4P} ÈĈ·€ÀĈwÀĉE€ñSe€Àĉ@ÔҐ4HYŞ´€R›À Ĥ€Ÿƒ\ /˙Rĝ ˆ˜„$Ç4¤P_ , ¨è[@Ó˘úPLô- è[@1·€ `l H_SÄJg 1€ŝ@Dˆ›Èr=€`xñ…ÀRbÁĊç ÷ €20‹(€IX@ĉ€ )Q0Íûû‰×- ¨è[@Ó˘úPLô- è[@1·€ `E, t`!?QÑ"XJ È"8Ĥ”lMÛ `Á- à` Há- `8ƒKdÁ¨" £DÄR„¤Cà` ´ŻÈĴ4¤‚1$ĴÎn)bMÄ@ ™Q] (¸°€oB™ ßÜ ( Y@Ŝ 6Ĝâcp‰ µˆÈh)bY„ˆ&)€X ´Ż”YĜĈ@“ °… pv È"P0dŠ(€H‡ÀĉŠ`X! H!   … Rz.::„ÀD p: ÂQ ˆˆY@ Y@Á@÷@G€2+B  oĊ@{ ˆ¤ˆÔgÒġŠX@D p:`H Cà”Ħ"oÀ¨…×@G§€‚XœÎaQ`³€,dĊ{ò!ˆBà¨°Ì @!·€b ƒ=€¤d H‘ÀÀR§3 )€aœ’Ґ4ÜXà ċPx "ƒKL!°Â—Â'2€` 4f)d1de‡À Ĥ‚1tlÔ`ÙzS@#!H‹šÂMà‘ÈÀ` "=:E02:HìŒ´€’šÀ1<’Œ„ÀS@#{ zŬÒUSz#S@)8… Ç@c8ĊÙH‚À#c “V#c )xd ĊŠAàáh HÀ#S@)=€À"R6 §ôFĤ€R p ށĈšÀ)È@´MÀ#{)P Ç@S@ ™Jé¤0E-cp Z@Ñ)ˆ˜-‚0€‘1 hMê¤@àôè¤ÀÈh ÷ô:Hħ€FĈ@S@´SÑ)ˆ ”ċ ĠĥQ1 ‚ˆY@Ñ"X ˆÇ@ĤX@ƒhR §Ç@'­FĈ@S pR`ÀR, ‘1-‚Ċ@t "hÄ@5ëOĤi]Uò QMà Ĉ@£) ‹fd)Mà h /d0.0€ħ, ` 4…Ä@ NI‘ÜHi“|0İÀ’ĠBà` 4šJÀħh& „&( h /d0.0€ħ, ` 4…Ä@ NI)ıĜÖÄh4*%+€`8Úˆ1€` (G‹`Y@° <–4.N)‚MB$Ċ@50èH£- ”&p-‚!pJ (fôXt À’@° íÄ@0”£E°Ñ @á&X¸86 µq €d´€RšÀY@´„À)) ˜”ÒPì˘@c*d!pt 4É `*€!p 46–H*‚%Ċ@ƒ8ĜH·€†›ÀÁhÄ@t t ˘S1 (%§ XtSÙ×@-d!pt 4Mcòb Sħ€ ‡c )E°ħ@R,)„À“°€†›ÀÁhÄ@t t ˘S1 (U2ž˜‚µĝ\,‚c J†À)E°t@v h¸„ÀcÁĈRcÁ’ pp "£4€ÀÑh:H)‚!p0DˆŒU[@R,µdœRKgÑè@d·€†{A,tXèn‹`ЁS@1,‚ÀÄ„üh„ ÀH (81`ħ- `lA(€¤h[§ Ò- ` 4:‘΢E°Ĥ€bP° è ÇMŻoĊ…- Ì=ùPp BÉE° (€` 4Ú(€˜œ‚îd‰§ 2*€àD–hR`x 4f)dc œÂb €ä)ˆĈ@ƒ=€ŒMàE˘,sÀ| (8aÉE° ëI‰1hx bPp b¸%œ‚Ȩ‚SYb I=€á)ˆ˜d! (@àSJž‚(€` 4Ĝšƒ;•a .ĜP(³€”Ħ–‚1à\Ì fÀÁèDFœ‚M‚À’âk 1 (8ŒfaÁ"X“!:²°×@'ѰP (fY†"X€h‚×@ :³€‚k Y p0:<‘Q§ FĈ@“ pp 4fÇà‚1, X B`eˆĈ{ ¤€FĴNñtLA Ç@SR@1,‚%1€‘1ŒP´g™‚˜œÈ́3Z@Yb ) X‹AàôPJ tĴ)Ĥé°é˜‚ށĤ¤€b8X‹3Ĥ ‚1ŒP´g™‚˜œÈ́3Z@Yb ) X‹AàôPJ Ԕm "r)üô+€,sħ"˜ĈO)C,Ȓb Z@˜Qx8:<7R Á ÁÒ!°BxrPJ 4Ĉҋ`„Ĥ ÒS@Œ_[|ĉ cE0?dŠ`A\„4 5 Ç@‡ÇàF*€á1¸á"X:ĥžœ”1€ô"˜BSé) Á4İ9è´`‰i`˘èÁŠ~ ˜áF°˘‹>.Â˙ÀÊpĴ*аş(Âí°Ĥ(ÂÚ˘wzp/l Šp?l ÂĤ˘(l%а(°½(Ž˘OÁ΢ğŠ"< {ˆ"ì%а(Â+0CaĤ(‚Á,Q„D–‚ƒEEx!Šp”(Â1˘(Špĵ(Â÷:WáD÷ӝ"Špš(Âîoĉ‹"œ^ÏE¸½ö@QPQÔ (b%İe´Ħ(şPtPQ\EgĊĠP׊œTôc EŸ£ ŠâF(úE°˘‹~ ¨8î`Pô·€Š‹œEżVô{Ċ 7‚}\ô!pQüXYÜ$V5Šbu›ĝéÖ4ŠbmSQÜ-Ö÷Š Œ˘¸_l,›Eñ°ĜB<*ĥ2Šb›ĝéĥ7ŠbG£(ž;EħĞQϊ=Œ˘ĜË(Š}Œ˘xEÌ0ŠbĤQ&fEq€QK‰ƒ˘8Ô(Šw‰#Œ˘8Ê(ŠcŒ˘QÇE1ǽÎ5ŠâD÷ӝbĊiFQœáŝfQç¸×󍢸½ö@Ñ&, ˘QE£aĴä, ˘ÑEg+DÑY@EjQ456r1˘ÏŠ~ èCà˘q£(ú¸hŜ}E ¨\Ŭ 4ŭÎ] YŒ*QŒZ@ò!°ü"Ĝ‹WŒW5]ÀX7‚‰’Ÿ*ùS%—àW°"üV%¸VƒÛ` Q‚;a-¸ Ö%XO”à>ĜP”`cQ‚‡`3Q‚-D ‡­E ĥ%xv€?N˘O. ì&J<ì /ÂŜ˘9Q‚×  J°Ż(Á°ż(Á˘ï€CD %x)Jp´(Áà8Q‚Ù˘†D ĉ‰œ$J˘§Šœî^Ï%8Û½ž'Jp{½X”"¸$ŞPrPI´ $:buMX@%qıXÛY@%q”œT×AÉĊ@Kâ›Pr  $ %ÇJâ‡Pò@ɇÀ%—üPɏ–ü@é~)ĵ-ù) ’?Qò!p˙w[QüZĴlżÛjâ6ħ†MünkIwë%ħžQ÷‰ ’ĜĜ(‰‡ÄfFIla”Äbk£$ĥ5JâIħƒĝ³ĜÉ(‰§Ċ.âħ›Qϋ=Ċ‹bo£$rFIĵ& FIìk”Äb£$4Jââ£$3Jâ=âH£$Ž6Jââ8£$f%ñaq‚QóŒ’8É(%qŞQ§ğ׳Œ’8Û½žg”Äîġb£À%£*JÎ*-Q2:ĈêÎ*—kkÂ*W‰’³€JĈu˘äb %›˘ä@Éĝ(9P2~(J~Ĵä7KŝD)%ó.…/E€(™w˃›ì0dÉ?”z!ŒR›ÀJS@é8ÄĤ b1XxrPvœ>‘ÂÒ§ Ĉ‚À&cĊšÀħè§3€tœž"µ@ê\ìBü€ÔÀüÀR/„ħÔ&°Ĉ@ƒ) tfš`ħ)ˆX 4Öžœ”§OA¤0€ô)ˆħ T, X8@àtÓS@ŻÇ@è(e .v! ÏÊ·€4íĝw—ŭPهÀe—á&X nUDn‡ĠáNĝ‚(Ŭ°6Ü ëŠ2ÜÀƒ°‘(°İ(ĉ˘ ż‡­Dĥeĝl/ʰ£(_agQ†]E^€=Döexr˘ 3DŜûŠ2ÌeXe8X”Ee8½-ÊpĴ{-Ê÷p‚((û  ì3€²Ë>.û) ²Ÿ*{'KˆOe?Tö!pهÀeq“XIÜ"V1Êâvħş¸S|ÁTw‹µĊ½b]£,îˆĊFFY<,65Êbs£,~/ĥ2Êb£,ŝ$ĥ7ÊbG£,ŝ*v6ÊbW£,^{eħ—Q݊œQ3Œ²x›Ĝ×(‹YFY,-4Êâ`£l”ĊaFYá^6ÊâX÷:Û(‹ż'e1Ï(‹'eqŞQ˙"Î0Êâ,£,>%Î1Êâ<÷/ı(‹‹Ŭk_”] l4DÙMA”(; ¨l\!ÊÎ*W‹²ƒ+׋²³€Ê~ =DÙ/‚•ŭ&pÙż ìo•Íğ¸ìŠÁäòù€ü@ŝ0¨ĝE°Šß¨¤3+>ÀŻa¸V¸ V…;`uQğ`MQµEîƒġD6x6x6ƒÇa Q'`kxĥx vĜITàYĜET`7Q—`OQ½E€ĵ¨@AT`IĜOT`Q8HTàŬp¨¨Àá˘DŽĝ/*0ÇŭSsENtݧˆ œĉ^Ϙï^Ïĝ¸@Tà"÷½$* Q‡ŠëTD*ÎވËĦâ, Š¸Jlì, Šß8P߁ŠcŸTü"XĊ‡ÀWRîŽô*~ĴâOAT“À¨ĝE°Šß¨¤3+>ˆ_‹ÄÍb%£"nĞŠ;ÄêFEÜ%Ö4*bm£"îëħQ‰ŠxTl&[ñ„ĜZ<)ĥ5*â)ħƒQ;ñĴĜĊ¨ˆŬŒŠxIìiTÄŜFE òFEŒŠXRìgTÄŝFĊ¨ˆƒŒŠx·8Ô¨ˆŠxż8ʨˆcŒŠĝ8Ŝ¨ˆ9kTĉîġ£"NsŻg1ß½žkTĈ ŒŠ¸È}/½>W1ê˘âz£#*îB˜Šqı¨¸PĊ¸ÊĜĜ5+~ ´âĤ *ĈwDĊġ*>¨ĝ¸âÏAWü)ˆJ,ğ^üÖtŸ¨DQ‰*QħEuˆj Ş~ ´êÇ@Ğ —ÂW¸ VU¸V†ÛaUQ…ßÀ˘ ÷ÀZ[XGTáX~Š*<›Àc°™¨Â`KQ…­Eŝ ۉ*< ;Â3EQ…çaWQ…ŬE^½DöU0˜!Ş0STEf‰*,Š*,Ş^8LTá÷[-ŞpĴû§f‹*| NU˜ç~Ğ“ENuv†¨ÂYîġQ…óÜë…î·*Š*\â÷@UjM¨Š6TŬDU\&ÖӄTĠD ´*ŞkWŭhĠŸ‚¨:P?„Ş+‚U}\ġ!p5a êÇ@Ğ~ šE@uĦF5‹0Ş~ ´êÇ@Ğ —ÂW¸IĴ`TĊ­beqğXĠ&~Ğ5LUqXKüVĴcTĊb}ñ;ħĦQˆMÄcb3£*ŝ ĥ4Şbk›ĝ­ĥ3Şâiħ£xF|ѨŠçĊFUìnTĊ+b/£*ö1ŞÂÄ £*fU£*fUħŒ8¨ŠƒŞxŻ8̨Š#Üou´QÇşjĥQ'U1ÏŭV'UqŞû³3ŒŞ8˽žcTĊyîġB÷[Ş¸Ä}ï+€ŞëTĥ¨ş)ˆŞq™ħž³€Ş6­׈ŞkWŭ)ˆŞyWBV¨?UÇŞ>ú¸KiW£=Q5½^ĠXXÑ- wˆŞ-¸@Ô²5kÙĈàj~ ¨ĉ pÍ)€_çE ná6XYÔàNXMÔànĝÜ k‰Ü냰¨Á°‘¨Á&˘ż‡ÍE ŝ[ÁŸ`QƒżÀö˘;Š<;‹ĵğ‰ì!jì-j5X ˘KÁ~˘û‹ĵ 58DÔà}p¸¨Á‘˘&jpŒ¨ÁGàxQƒ9îû\QƒŬë)˘Ÿ€ÓE ÎtßÏ58×½^ jp‘{-ı‡Š¨Ez5тšëԜTW@ÍY@5qµĜÌY@5ÇjâPs  ĉ3€šÏj×|\ó!p̀j~ ´62$Zĥ;kÓz'p-[¸–m ĉ§€jלĝµĝĵMüP+ŠÛÄÊFMÜ)V3jÒŬĈĽb-£&îëŠĊúFM<,62jb£&~/67jâb+ñ'ħQÛ5ħ£QωšxQìfÔÄFMĵ&ö6j"gÔĢ`ÔÄRb?£&ö7jâ]â £&1jâ}âp£&Ž4jFMcÔÄGÄñFMÌqßç5q˘{=Ċ¨‰OˆÓš8Ó}?Û¨‰sŬëFM\ä^KîĦbÔ"=€šÑ5ר9 ¨f\!jÎŞW›ıhÍ1€šñ QsPÍïÔÌğĤĉŠ`5×|\s¸ĉ§€jĈŬĤ×{ò‹`îNàš…ˆš- HÔzużPZ@˘ĵLÔáfXn…Eî€UDî‚Ġáĝ‚¨}°6<ëŠ:<ˆ:< °İ¨°…¨V˘OÁĥ˘…DvuxvuxvuĜSÔA°¨C^Ôáí0SÔá0KÔáQ‡÷ÀÁ˘‡Šş¨˘„£EŽußg‹:üœ ê0OÔáŸádQ‡SŬŸ!êi˜/êpŽû~¨…îµèÊ˘UQ—ê˘.šPw¸î, ş¸êÎŞğ1¸ş¸ê.Z÷c uÇê>¨û  î pŬ‡Àġ„ÁêA ê~ TP_„QOèÔŭ@=hġà`F]Ü,–·Šş¸CĴbÔĊ]Òêâñ£.îk‹ÄşF]<$60êâQħħx\ljÔĊb £.ĥ2êâ)ħ­Q;uħ“Q/ˆ]ŒşxYìnÔĊžF]HìcÔEŜ¨‹·‹™F]ĵCÌ2êâ£.Ŝ#6êâP£nÔĊF]|PmÔĊħîûl£.ŝAœ`ÔĊ<£.ŝYœlÔĊİîÏÎ0êâÓbQç¸ïçuqĦ{-ş‡²QU÷Z7š˘î pŬY@urQwPŬÁĠkEŬY@u?Zw1şÏê>¨;PNAˆşù¸Pŭġ˘1z´ ,êĉ_ ß?DŬÂ@wˆFÂ}„&p#E6\ ¨á§€7à&XnċEn‡•D~ĞÂŬ°şhÀoaMрµE~ë‰<Šl,ĜL4àIĜR4`kр§a;рgaGр/ŠĵğŠĵ {ˆì%6ȉÌ р}EŜ û‹è"8\4àH÷ŭрÂñ˘sÜ÷ı˘'ş×SÜé˘gş×³Ŭy˘¸×‹Ŭ%˘÷Z ħĤƒÀ g5ÄebCg5œÔ׈-Ôp  áOA4hĝ  1|!Œĝ%4†ï·@#áRĝĈ⁍FÂ}„&p#†m¸PO5nˆ›ÄrâħĵÑ·‹•Œ†ĝXUÜ-V7â·bM£!Ö6âwb=£! ħħÑ› ñ¤ĜÒhˆ­†xZlg4ijbG£!h4ÄKbW£!^{ ħ—Ño9£!f £!ö5âb£!tß1ââp£!Žtߏ1â£âx£!ĉ¸ïs†8ѽžâN7âL÷zĥ{8Ïhˆ ÜëĊîá£!*îµ?ħĤë4œÔ0.36tPY@ cK×n8 ¨áÏA7hĝ  aŝ¨ƒÀX Èm5bcpR?Ú°á@äF°Ħà‰rL{ H4ƒX4‡ÀͰœhÂm°ÜwÂÊpĴ*šp/Ĵ÷Áŭ°<ëˆ&< ë‹&<Áïaф?Âĉ˘ †­à/°hÂ3°½hÂó°ĵ;‹&ĵğ‰&{Š&ì-š°$äE–†™˘ û‰&ĵMĝ8X4áPфżƒ#D> G‹&+š`ĥhÂ?Á ˘ óDS4ádфOÂi˘ g¸ïóE>çŠ&œï_$š°”DÊî{M4aM7ÑtPÓY@Mq4Ôt1Ĥĝ*4Ôt  ) MǚŽ4ŭ1¸ĤƒÀM7] ¨é§€š.Úôc M×h&LA4ƒ4ƒ4m Èh!°ÑR7‹ċŒĤ¸MĴàȕĊ]bUSSÜ+ÖpäZâAħŽÑ‹ġĤxLl$~/61šâbs£)ŝ,ĥÛMñŒĜŜhŠçĊNâEħ³Ñ݈ŬŒĤ@ìi4ĊŜFS,)òFS,-fMħŸÑïMñ7â`£)5šâïÄFS|Xm4ĊħFSü1ÛhŠ'M1ÏhMq²ÑŸ§Mq†û>ßhŠÏ‰sĤ8ß}żÈhŠ•DÉhвû^3šbM7ÑtPÓY@M ÑtPÓĊ@›ĈWEÓY@M7Ñ4-šÎj:´È¨h:ô!pÓAàĤŸjN@`5£s˘éîhZèM ˘iĦ@4mzÑJ¸²5*ÚJHµnÁ­y¸V-ĝ Ĵ,ZpĴż…5D €µD ‚uE … àqĜH´à ĜT´àO°<[‰üĥ-xv-ĜIċáşâ IDAT´àeĜE´à5Ĝ]´À`/т}D –‚˘ËÀ˘³D Ŝ Šĵ-8L´D Ž-ĝ{8F´à8÷}Ž{˜+ZŻp’hÁ)îûé˘Ÿ³D ÎvßÏsŠ\ì^/qUİ%êîuh9 ¨%.‡–³€ZÎjùcp-mù1–c-MŒÁµü"XËAà–[.ÔJ¸¸5Ş ÜJƒk-ô1¸V•­Q1VB ¨ċ p˙Çùĵ¸]Ĵ`´ÄoÄÊFKşÇXMüVĴa´Äb-£%ëÚď³x\ld´ÄbS›ĝqĥO‰­Œ–ĝĞĜÖh‰çÄFKìd´ÄËb£%^ğ-ab/£%ö1Zb)1h‰eÄFKÌ2Zâ½â@£%Ŝ/1Zâ0£e´Ä‘FKü½8Ĉh‰Ü÷9îaÑ˙*N2Zâ÷ŭt£%>#Î2Zâl÷ŭ<÷pĦÑğ×KÜCĠh‰ş{ôZÎj—‹–³€ZÎjùw·œÔòc -gµhùE°–c-·ny) ĈàZħ€ü;E+ĥ¤‰"X+v!Ìïd=D{ÔD;áB˜ĥ‹ĥƒ1PÑv¸Q·À²p|^´áNXQ´ánXî…ĠDî‡/ˆ6üÖmxփÇ`ц?ÀĈ˘ OÂf˘ [ˆ6< [‹6< ۉ6ĵ;Š6|Q´áUĜU´A°‡h°·hCN´áPmxì'Ú°żh‹6$Ú·p¨h‡àц£Ü+ڏ0[´á˙ ˘ óÜœ,Úïpšhîû|÷phòphEî{É=TDjîµéÚÎj‹Ë í, ĥ³€Ú.Ú×AÛY@mÇÚŝDÛ1€ĥƒÀmżÖv¸=l‰[ĦíR@í„hÛÁÚA Úé´§xíQSí„ aÚ.ÚĈ@ĥƒÀ툸E,+nŸ7ÚâNħ˘ÑwKЈ{ĊjF[Ü/`´ĊïÄÚF[<"֏‰ ŒĥĝƒĜĜh‹'ĊfF[la´ĊÓbk£-žÛmñ‚ĜÑh‹/mñŞĜĠh ‰=ŒĥXBìm´EÎh‹wˆ‚ÑïûmħżÑ6Úâ £-ŝVj´Ċ‡ÄF[ċŝàX£-ŝQÌ6Úâ˙ŠŒĥ˜çŝàd£-ŝ]œf´Ċîû|÷pÑˋ Œĥ¸È}/ı‡ŠÑ5÷ÚtmgµËDÛ&, ĥ³€Ú Ü6mgµÔö§ ÚÎj;ö×@ێ´c÷¸)ˆĥqğéÑĥá(÷‰ĥ‹ĥ-ÜnÇÖ@c€hÛ€ìèŒZí¤ôà³˘·Â²˘wÀò¸ V‚{`сû`uсaMс‡axÖĝ=l(:GĜDtàϰ9üĥxĥxĥx vĜYtĜMtàm°§èÀÛaсĵèÀ;aĤèÀ{`–èÀûà@сƒEGtà0сÀ‘˘ƒcDŽs0Ç=Ìĝ78Ità÷ŭt÷p–èÀ²pŽèÀyîû…îĦèÊ˘U÷ÚpmguÄÑÄtÇY@guü&pÇY@Ç:ħKáè8ÜLü :.ÔQh .í¤3è,†E0£3j ´“ÒŸ5:âVħĴÑwˆċŬϲ’¸GĴbtÄ}bu£#kñ°XG<*Ö3:â÷bC£#ŝ(61:âÏbsñħÑψmŒŽx^lotÄKb'£#v6:ħ›Ño{ñvħÑy£#Ŝ)fñ1Ëèˆ÷‰Ž8Ĝèq˜ÑGñ1qŒÑÇı?˜ĉñoâ$£#NqßOwgħĴ8ÇèˆóÜ÷ ŬCÑ=”Ž¨ş×†{ĴvŒKEÇ&ĉ ;Îê8 ¨_ÓqPÇĊ@;ħûè8‰5î8yË[u1Nì>€Ħ"XÇBSĦàÙi;D7#ŬQ1Kuî:pÜËÁ°ĵèÂŬ°’èÂoaUх` ĝ<kÁ#°Žè°è°‘èŸ`Sx 6]ĝ+l%şl+ş"ì ş |QtaуŬE–„½D–†œè Ñ]Ĝ×ŭ&û‹.|]ĝ *şp¸ûË£ÜorĴèÂÇaĥèÂżÀ ˘ óÜ_žìNsżÉ™˘ óŬ÷sŬîábхĠáхŠÔ5şPwr}uS]guÔu1!L×Ċ@ğŽtèú  ë@×AànîşP×Ċ@ğé1Pèf„ÀöÀèfdFwT ´ëR@]ğNôĊċĝby›ĝMV2uĊoĊŞFW< Öp‡âZâħŽÑ‹ġxBldtĊŸÄĤâ)ħıMü&[]ñœĜÖèŠĊFWĵ"htĊ.FW˜ĜŬèŠ%Ċ^FW,-rFWÌ0şFWìë~“ŭĝ€8È芊C8ÜŭċQî79Ö芏‹ÙFWü‹8ÁèŠyî/Ov§ıßäL£+ĉğï纇 ÜĊFWĴ..1ş˘â×ŬCË=ô@×MAtÔuP×Y@] ´ë, c]Çş>è:u  ›ğĤ>îşP76;D×BMàá@tmÚ€Èt/#=íl­9у;`9уğ`у{aeG}Wƒa у‡a-уÇ`]у?À˘OÂĈgĜTôàiĜBôàYĜZôàĜNôàeĜQôà5ĜYô`Wу%`у`oуe /zn˜)z°Ÿè‰ zwp°èÁ‡á0уÂ‘˘Gğż<Î=ÌqsE>'‰ü?8Uôàt÷gı‡sÜù˘ĞÀE˘E÷½ìjîĦé:˘ÇëÂôœÔsPÏY@=Çz~ ´ç@Ï1€žc½áKáĊ/ ç pÏAàŜp,!ÚsE°^ĈôÊt/#6z.ÚÙ·ŠÏ=q‡XÎè‰ğÄ FOş×XٝˆĞ‰ĊFO<,Ö2zâ1ħÑ=ñ¤ĜXüYljôÄÓb £'ž[=ñ‚ĜÎ艗ĊŽFOĵ&v6zbW£'–{=ħ”ĜÛè‰eDŜè‰w‹™FOìgôŒž8Àè‰ż=ñaq˜ÑG=q´ûËÜ÷0×è‰O‰“ŒžĝâT£'Nwp–{8Ç=œoôÄ*â"£'Šî{Ù=ÔÜCÓ=tŒž^żĤç, ž³€zÎêıhϏöœÔs  ç@/v#˜+‚ġè9Ü3ŝ?{ïdgu­ë>ï°ÁĈL°1Ĝ#‚rÎ’È9gDÎ9Ğ$rÎ9Ǖz­ĠĞWwŻÎ­Nü8ûž{ĞNĠÙg{ĵŽ`ŒÉp,^iÊŬùlƒ½]§Ê?ž5ùµçPÙ5ĉ7Ŝ1ĈüĦĠ³€4l´Ë@_rK#6‚4 ò3 É0¸ŒGAdÖyhĈe We,gà_a"ü|ĤÀ˙†W`:üÌĝ1ÌĝÌĝ%,ĝ5,ĝì€}Dŝû‹ ĵ ‰ ĵ ‡Š ĵGˆ |G‹ Ž8Ad`}X*2°œ*2°œ!2U8[d`38Odà‘¸Ĝp™ÈÀĥpÈÀvpÈÀŽ=‘Q°\dàzżr“áV"Sàn‘épŸÈÀ^°á1‘‘2âI[ž1AFüQìdÄ›â  #Ŝ‡ñž8"ȈĊÑAFHdÄ AFĴ/–ħ85ȈÄAF|UœdÄfâĵ #.2AF\l¸,ȈmĊ•AFl' 2bGñ½ #F‰ċAF\ïWn2Üj¸#Ȉ)âî #Ĥ‹û‚ŒxÀ 6€ĴË@³#v˙C€µöä\šsPÎU@9ĝW/r}˜$r L…˙€ ĝ1üfÏàç0~ ż‚kX$r;X"rì-rì'rg8Päà8Däà}8\äà#8Jä àX‘ƒġà‘ƒ/R‘ƒSDNäàt‘ƒŻÁY"_‡sEĥ„ D ‹l—‰|9Ĝñż÷üï°\äàz˙ŭ› ·î0Üm¸Ï á"‹á)‘ƒ½àY‘ƒç½à%CÎ) œS@9§€rNċĴäĴäĴäĴä´ĉ`/…·œ³œsPÎU@9—ĉܐs@îŸchshÎU@9WĠ˙ĈÇÇ˙“â‡İúx&Ì ÂÙŝw˜ç‡â×bQżK‚œxMìäÄbż 'ŝ, râqHœĝHäDˆcƒœXOœäėĊÒ 'N rANœäÄ×ÄYAN|]œäĖ₠').rbqYßW9ħƒ¸Ĉ˙ßóżò '÷ßżÉpĞáŬ†û 1<äÄbñT{‰gƒœxŜ ^2äœÊ9”s (çPÎ) œ5€œ5€œ5€\Ş oKDà\¨ä,ç< "g8ç* œË@s#öü× ŸöPïöš˙˙&`ŞÈ`†ÈOaĥÈ/`žÈа@äá·°‡È`O‘‡?Â>"oÂŝ"oA"ïÁĦ"Â"‚£Elj<| Nyĝ œ,ò°1œ&òp†È‹<œm8ÏpĦáċ†Ğ ×–Vˆ<Œ…E&À-"“áv‘‡ip—ÈL¸Wäa< ò0yXIyñ„˙ìӆç /²†ĵS@y§€òNċÊ[È[È[È[È[Î[Î[Ώ(˙µ_˙ĠÀ§}Ô˙&ĝa²ĝ45ȋ‰A^üTÌòâb^݊A^üVìäĊĞA^üQìäĊ›b˙ /Ŝyñž84ȋĊA^HäĊĊqA^|IœäĊWÄÉA^l,N ò⌠äĊنó .1\n¸Êp­a™aEcĊA^L·y1YÜäĊ4qW3Ċ½A^Ìy1_<äĊBñXOĝÏ>mx΢!kÈ;”w (ïPŜ) ĵS@ykykykykyky‹ÀùE`ŭ#Ž‚^´–>€Ï0ˆB=ˆB=ˆ‚/…/ĝB˜‚§< ¨àQ7‚ÜPp@Áe W\TpPD^É˘?„i˘?™˘?‡9˘ż‚ù˘ż…˘ż‡Ċ˘Ż^˘‚}EŜ‚DŜ…ƒE>€D€#ELjĴNjl'‰l§ˆ|NĜ ÎĜÎĝ\ -¸XàÛp™(Àöp(ÀwáQ€á{˘ğÁrQ€ëEAà&­†; wî3€‚Á î.xPÁÓ@ ĤàKá ġ…z€B=@á/@P¨€ PAÁ—Â|!LÁÓ@ žT(ˆ‚Á î(¸ à2‚Ğ€ *¸ ¨ /&ñŠ˜*ˆŠiAAüDÌ âçbNPżóƒ‚ĝXÄïĊâ  ^{ñ'ħoPo‰‚‚xWÄâ°  GñqLP닃‚Ĝ@œÄF┠ *N b3qVP[ˆsƒ‚ĝ†¸ (ˆo‰‹ƒ‚ĝĥ¸,(ˆíĊ•AA|W\ÄÎâ{AAì&–q}P â&­†; wî3gÁ/à—0^…_î˘~‹DĵKDĵ{‹ĝ3ì'à8P4Àûpˆh€àpÑG‰XŽ e8A4À†°T4À&pŞh€Má Ñ›Ù˘ĥ‚óDl ŠĜ. °\.`G¸J4À(¸V4À°L4ˆXa¸Ñp‹áv]†{ 6‡ "ÄQAƒXO4ˆ/‹‚ħĦX4ˆMÄİAƒĜTœ4ˆÍĊÙAƒĜJœ4ˆ­Ċ…AƒĜV\4ˆíÄċAƒĜQ\4ˆQâÚ Aì*– AƒXa¸Ñp‹áv]†{ 6İ h-};‡Ï~%d|)ĵŝ^7‚‰˘Ğ€Š*Â÷aœ(Â+0Qá‡0Eá'0]áç0KáW0W­ú.€ß`xŝ{ŸàMĜGámĜ_á=8HáC8TAp„(ÂáhQ„/Áq˘_E6†“E§‰"|ÎEĜÎEĝ&œ/Š˘.5\a¸Úpa ,E7ˆ"L‚›EĤÂm˘3àNQ„Ùp(Â<¸ßá!£R1(ÂĥûO%ĝÌ%ĝ%Ì%ĝ5Ì%ĝ,%x ö%xö%ĝ3ĵûÂ;. J,J&J8R”`}8F”`8^”`#8I”àĞpŠ(Áfpş(‰œe8×° \(J¸D”`¸\”`'¸J”`¸V”`4,ó‹+ 7n1Ün¸ËpŻa<(J°<"J°'<î§Ož5ĵ`Èò†˘S@%§€Ji#˜5€’5€’5€’5€’5€’5€’5€Ò˙Ù”ÜPr#XéżDJî(ı ô _˙&ĈĜññG>Mrä›”ÄÏČ $~)f%ñk1/(‰ß‰AIĵ&öJâ ħgP²ûÚñ‚’ĝ@”â° $ Ž Jb}qLPˆƒ’ĜHœ”ÄWĊ)AIl&NJAIœe8×°¸0(‰ïˆK‚’ĜA\”ÄN⪠$v×%1Z,ó‹+ 7n1Ün¸ËpŻax0(‰=Ä#AIì)÷Ó§ Ï^0d yCÑ) ’S@z hĠ…0Ağ(Y(Y(Y(Y(Y(˙-ô/˘T׆‚ĝ´* ’Ğ€J.-Ċ?`e‚(˙U) Q†ïQ†W`ĵ(a’(Oà§0 ~ż€™+xĉˆ2üĉ‹2üŠ2ü‹2ĵ {‰2ĵ ûŠ2ĵï˘ Á!˘ ‡‹2ĴG‰2|ŽeĜNeĜ–Š2l §Š²(pĤ½>Ç^Ÿ/Êm¸H”a{¸T”áğp…_ĵÚpa,e˜7ˆ2L›EĤm^v§áŭ†‡ ö'ÍÏž7ĵdÈ e§€ÊÉ(ˆ²5€²5€²5€²5€²5€òZĞ€Ê*ğ ¨ì* ò_•‚²g•˙î ({DùŻJĊÇ^ Êâ1>(‹ŠIAÙ^O³×3öĉÄÇ^ÏÊâbaP‹ƒ²xSì”ĊÛbß lŻ Êâ#qHP!Êb=qTP_ÇeħĦ8!(‹MÄÒ ,6§ċ ,ĥgÚësìġùAY|[\”ĊöâÒ ,+‹W3Œ˃²˜(nÊbЏ9(‹éâ6/ğÓpá~C†G ûˆ'ÍÏž7ĵdÈ e§€ÊÉekekeke§€ÊN•#mÓêi Á˙+ʁˁˁËñie kö”ŬVŽÏ9ˆFOm\—hth£Ë@“/€úÙĴÏŝD#ü&‹FĝLK˜)áט żƒßî˘^‡E˘ŝKD#ĵ{‹Fxö|‰F*á‹p„h„/ÁÑ˘ljFĜN˘N6l§‹FĜ ΍°5œ+a[¸ÀË.6\fĜ°\+a,,óÓ† ·fÁ˘ĉÂŬ6ŜgxˆÔ4ÂĥìO›Ÿ3ĵhÈ †R֜Úh  Ñ@£5€Ĉµhh¸Ñ"pş|@£Ë@˙Ş4~> hô4ĈuI.mthcòPycó&„ĊĊä QüLL Ċ/ĊÌ Ñ.ÏuÌÛ=hŻ‹EA£ĝ“X4Š·ÄŜA£xWì4Úċƒ‚F!qh((ŽĊ—ÄÑA£ĝŠ8.h‹ƒĈ QœlĜ\œ4Š­ÄYA£ĜZœ4ŠmĊ^vħá2Î⪠Qì& ĊXħÌOWn4Üb˜%îĊ\q·÷4Ħ ¨ÑU@ñi`kv7Ĉ?N ĥ•uE^ħ˘âI}öŸâ³˙tQWa–¨Àoa¨Àà5X„7`Q?ž˘ïÀ>˘ïŝ˘p°¨Àà0QġáHQ àQàxQħżKE§Š l gˆ |ÎĜÎQíà"QáRQQp…¨Àpµ—]g˜ËE& ˘Óàf?½Íp§aw¸WT`<`†Ç O‚gÍ/2†ĵĦh¨àk§€*NU  b  b  b  2\†ŠĞ€*ŞĴE†ŠÁ*ë˘@ċïžÛ•uƒŠxEŒ *â‡Ò‚‰xSìïô "^³‚Šĝ­˜TĜß=‚Šĝ³Ĝ3¨ˆwÄ>AEĵ/ö*ö÷à "  *b}qdPˆc‚ŠĜHTìïÒ ".N *bKqFPßgħ8/¨ħ¸(¨ˆĊAEŒWħиÚË3L˃Š˜,n*bš¸ÙOo3ÜiĜ]ÜTÄ"ñ€3ûöÙœóŝEü Ĥˆ&w{ÍÙĥh‚ß<ÑŻÑdĠw1ĵo^˘ Ŝƒ}E|ˆ&;{ˆh‚ġàpÑ_†£DlNJ&ĜNM˘ 6ƒ“EÔ8Ĥ IDATl§‰&ĝœé§çˆ&Ĝ.M°\ĉ§WĈÀµ˘ Ĉ2Wn4̄[É;lĵÛpŸa <$š`oxÔĈ' OšàyóK†œĦÁPCŭ§€šœj.C“5€&kMS@d¸i-_ä2ĤµŜ Ü´nw7ŭMïnZ·NàĤµNmrh“£ŬhGğqvvb$~&ĤMŽv3ììì Iü^Ì šÄëbAäh·ĜÎî4‰÷ÄA“ĝP4ÙÙC‚&ħž8€Ĥĝ´apÁ˘)>·/Q]K¨ŽôPŸó3ZTá‡0NT}öŸä³˙TQ…Wa†¨Âoáw0Çg˙ù˘ oÀBQ…?bQµêğ·¨Â°Ÿ¨p ¨ÚÓCEGˆ*|ŽUĜŽUQ…Má$Q…ÍáQ…­àt?ŭœ-Şm8OTa{¸O/1ìWˆ*Œ†ĞmĵÎ0 –‹*L…DfÀÍ~z›a>Ü%ްîµñR5¨Â~¸Ož5TáEsÖP0”ê ŞĴNUŞ&³€ŞÖŞÖŞË@Ħj¸:Ò, ŞĞ€Şk)…êZgU˙ADà ş–*  :Ò@ŬÓÑAUüPŒ Uíé${:5¨ŠWĊŒ jOçĜÓùAUĵ!Uñgħ8¨ÚÓ½ƒŞĝ@ìTâÀ jO ŞâK∠*"ŽŞbcq\P ŞbSqRP›‹S‚ŞĜJœî§ßgUñmq^Pۋ ŭô.⊠*F‹ĞmĵÎ0I,Şb޸!¨Šâf?½Í0_ÜTĊBqŻ6ì'7?exÖP/𳆂ĦT‡ š¤€ŞNUë)  ST­TŞÖS@Ħt\Ġ`Ġ‘DàŞEàjĴ­ ´kkĞĈ§ƒŝÏÑĵÖapÍkÑDóHe Í.möÙŒÏŝE3ü &‰fŸŭ§ùì?S4ïaŽhvĊçî˘Ŝ„E˘Ŝ†%˘ÙŞï>˘>‚ŭE3$šíĉa˘6€#íĉ1˘Ùnž šáë°Ônž*šE3l gŠfĜÎħ›çûéwábğy™h†ŬàJ?׊f˜Ël\a¸Ñ0n5ßa¸Û°î7?dxÔ OšŸ1<_Ñ CŜPLžVVŭ§€šW•B³5€ĉá4[hInĥÜ<ü š]Ú<\†ĉµhĵ–Í˙Ç h^ë0¸ĉµhAóHe Í.]ċĉñ#éÇÁĝĝĜÍIA³Ŭœf7gĈÇnÎ šíĉîA³xS,ŠŬ\4ÛÍ}‚fñ‘Ĝ?h! šíĉaA³Ĝ@i7 šíĉ A³ĝşXj7O šƒfħµ83hۊsìĉù~ú]qħŬĵ,hğ‰+ŭtœ¸6hĊ2Wn4Ì·šï0ÜmX,î7?dxÔ,ž4?cxA³Èò†bò´²êï8Ԝ”6[hŝK @ƒ˘Ù@s½`M¸Ù@sŒPÔl¸y¤2ĉX['ps|rÍñ·ŭ-kÑDːhYó àĜĠs~ĈˆŸŭ'ĝì?Y´ÀĞ0M´ĝì?K´Àk0W´À'XàŠÏ=D ĵ {ŠĞûŠ Zà‹p°hħ‡‹ĜŽ-° +ZD l'ŠĜN-öñtÑÛÀY˘çú•áBÑ£à/7Œ…ĞE L€ëlœËE L‡lĵÙ0n-°î²ñ^^ h‘ZÄ#6>^ÑOž3´ÀKĉœĦ!yÑP]ġJRÚb  %ÑZĴ´XhIĈA·XnéF°–µ–ĥŒt%dËZÇA·|. [Ö˘-S@A˚_݈]äĈ„ZìıÉA‹xUL ZìĴ Eĵ&ĉ-öq}Ü#hïŠ=ƒû¸o"$ZÄĊÁA‹}<hu ¨5ÑZ­´ï†Ö‘DàÖá´ş ¨ux(´Žt)|ë?T@:Ò}­#Ŭ Ü*~ v ZáĈÚÁ AĞ#Ü;8=hµƒ³íàĵ Uĵ)­vpq*Ŝ{­vpż U|A´ŠġĊ!Ak*"ŽZĊĈâè Ġ´ŠÍĊIAĞĜJœâW%ÎZĊ·ĊÙ6î ÎZĊNâ"w—­bŒ¸ÒĈk “Ċ2ó ,qS*ĉŠ[mĵ°‡¸Ç|ża_ñ°ù1CĞxÊüĴá…:­"k($Ż”ÍM†–z (h­NµĈj  5è ġ‹Öa\ëH"pkŒPÔj¸5F(mÁZ“gŭg€¨t#Xmxµ‘Áj#M­%_ġ³˙n˘?ħ˘ĉ³˙DQƒWaЍùì?CÔà5˜-j>ûÏ5x Šĵ ïÁQƒaoQ³wû‹Ĵ‰šÛa˘Á‘˘_…cDMÔàëp‚¨Á–°ÔĈ­á4QƒmáL·‡sE Ĝ¸ \"j0.·q<\-j0 ³q,5˜ 7Ĝx³aw¸Ŭ|—aO¸Ïü ĦšŸHŒÏ˜ŸOŒsŜPĴƒ¨AĊœkNĠ’;kÖjɍ`5kµDY%7‚Ġ\Tŝµ‘nĞ OAm¤ÁjÔÖ1µ‘nĞ Am¤F°ÚHÓ@kÉ@=ĵíÔ¤ŸcƒšÛÄ &^S‚šÛŒ &^³ƒšÛü &Ŝ ƒšÛ’ &>{5{·P뉃‚šÛaAMl$Ž jâĞ☠ÔÄ×Ċ AMl)–Ú¸µ8-¨‰mĊ™6n/Î jâğâw—51Z\nxquP“Äu6N˃š˜)n°ñfîâvó]†=Ċ}ĉ 5ñ¨ù‰ÄĝŒùùĘ1ç Ċ:5Q14'ĈšS@µX=şĴ ġ‰ÚÇC˘f  ĞEàš5€Z"×,×FŞލTZİĴ# ƒĞĊ° jñù‚mk~üvm>ûöÙœhóÙ’ÏŝSE›Ïŝ3}öŸ#ÚàMĝ3ì.ÚàX$Úà}ĝömì#ÚìÚ˘ ‹6ğv¸hƒMà(Ñf׎m°œ(ÚD|Nm° œnvpĥhƒá<w†‹Dì—Ú8m0ħq*,3Ż0́›Ì·Áĉ{ m€h“ÚĉñqóSumœáĊĘ34$ĈFC51Jµ­Ş‚ĥ‘4€ĥá`6’Ü6RPÛ?ß,  mÍ/€ˆƒĥ]Óhğ6.h³k“ìÚÔ ÍÍ´ks‚6ğĥ{&Ŝ‹‚6ğĥg&ûmv퀠M|I´Ùµƒ6ħ‰8*h³kÇmb qb´‰oŠS‚6ħ8ŬĈíÄÙA›ĜQœgÎ⢠Mì&.µqœ¸2hĊ56NËÌ+ sÄMĉ[ ‹Äĉ{ mâó‰ñqóSuÚÄs†cΐ Ġĸ*ÔĞGA´½Ħżèh‹5o ŝE´$·ĊU@m1Ĵ tÄ>€;Gœşfx÷oDûH—·Úí>ûïâùŝ£EğÏŝŬë;I´ûì?M´k0S´ûì?W´ğâsÏŝ{ˆvĝ>‚½D;ì+Úíׁ˘6€CDğŭ:B´×àhÑnżŽíökİŭ:U´ÛŻ3E;ìçĝ­Qph‡]ábÇÂċ˘&ÀU6NëÌ3`ıh‡Ùpƒóáóí†%p·ù>C;ûñŒÏñ˘g˙ɢg˙é>ûÏ>ûÏ,>û/PwjoÑ_„ŭD‡:HtÀ†p¨èU8RtĜİcEl 'xÁÖp²è€má4·‡³Ì;Áy˘v m—šŻ0L†kÌÓa™y…aÜd^·‰X wÚĜ÷šHŒ$ü„ùéÄĝĵù:ˆÈ' JĉJ² Ċfc't$@‡5€ŽUt Ğ c¤* ŽOğĴż@ñ `u§v :¤ú˙ĞÇĜİñA‡štĜİévjVa§ĉâħ è°S‹ƒ;µw!(ö :ìÔAA‡ĜPtâĞâÈ Ntˆ-Ċ ^°µ89èۊÓlÜ^œeŜIœtˆ]ą6Ž—šŻ0Lט§‹eĉ†yâ&óBq[!‹;mì÷šHŒ$ü„ùéÄĝĵù:"Ÿ,(™+ɂC›˘#èĠ5€÷t$@GüĊ4PŝğèHDàŽ‘Ş€:bXèš}ÁFœô7˘óÓfu}¨èLÊ@;}ößĠw{>ûO>ûOq½˙tÑé³˙lÑé³˙|Ñ ïÁBÑé³˙Ñiö°>ì/:íÑÁ‰G‡‹NĜŽ˘ĥ€N° œâÛÁ‰GçˆNĜÎ÷‚Ñpħy<\.:a\e4¸Î< –‹N˜ 7Ĝ¸n1ßnè„ğ_tJâĦşQtÂcɂ§ÌÏ& ^LäÌ É‚Ĉ„› µÄĜ™hÖ:  3;G;“* ÎáU@™ôt=kùŸ Aç§Íê\û4 3)µGÚĠ :íфXíÑ{4=è´G³cµGóƒNñžXtÚ£%A§=Ú'èë‹ŭƒN{tpâÑáA§ĜTtb q\âÑIA§ĜFœâۉ3Î :ĊÎâ|/-.6—b’¸ÊĈiâ:ó,ħ<èsĊ 6.·˜o7tŠğßüP‚NñX²à)ó³É‚“9sC² 1áfC-1v]Ħşé2ÎDèŒĠ"pçH"pg"wŽTԙ”vïX³¸sĝ, 5/„éŒżá€èú´NठkÍ/€úÙ”+>w]>û]>ûOôœŸ)˘Ëg˙˘Ëg˙9˘ËŬ^ğ‹.ĝ‰.Ÿŭ÷]vg_Ñ_†D—肍àÑċxv„è²;Lj.Ĝ Ž÷âoÁRÑċxvšè‚àL/çšwƒ EWŭŽ{¸TtÁD¸Â ĤÂ5ĉ™°Ìĵ°;ÜdŜn3ßYÑ÷şàÁ„5?‘,~&Y‚9“,($\NWͭɂs7t¤t%`]‰Ü5|(t%U@]k]I'p×Úż ë3úş>­¸+éèZó  îÎ(dz]ƒ.dzħA—Ŭ™hwĤ]Žg3‚.ğ3'è²;ğ]âħ(è²;{]vgß K|Yt]b#qHċxvDewŽ şÄVâx/ŝ–Xt9žt‰ę^0JœkŜM\tĠ︗]b˘¸Â ĤŠkÌ3Ċ2ó îâ&óâ6óuşÄ½†.ñ`šŸH?“,xÁœI.'‹ĞĉÖdAGŞk]#ÍêJ4€Dîé>€X]Ô5|ܚ}]I@×Nà5‡ÁuĊ°Áŝö) ѽî÷ˆnĞ£D·Ïŝğ‰nŸŭÇy˙DÑí³˙TÑí³˙LÑí³˙\ÑínŻ>ûï!şíË^˘Ûì'şíËA˘6CE·è†ÍàÈėcE·}9Qtĥp²o§›w‚³E·ç/şa \äà2ó¸Ê<3ρċ˘ĉ 6.‚[ÌŬpGÂ÷˜ïŻƒè†‡“'ü´ùıdñK ç“Ċ%s%Y’p{ÂŬ‰m  ;Ñş¸{ĠtŬÉ0¸î¤ ûŻ×ŭ9§€‚îuż Vû2*è–ê%}ğŬöeœ}™Ğ}™tۗ™A·}™tۗöe Ûìtۗŭ‚nûrP-6‡ŬA·ĜL™ĝrlm_N şĊĥâd/Ŝ^œnŜIœt{ÑùA·#.ò‚ â2óq•y†¸Îû+}öŸ Vúì?EĴôÙ†Xé³˙ħғv+A°HĴ+a=ĜÓĵìkŜ4o ‡š·€#Í߄cÍÛ‰ĉíáóNp†yW8Ç<.0O„KÌSá óL¸Ĉ<–™WÔAĴ„›-áğ/á‡~,á§~.á—Î'\J¸)áք;î1÷ŭÓÜ Ĵ\‚•Ğ@°2ı`e2 heÒ ĵ2i[™ôĴ´ ß VJġŻĝ]‚•vaL°Ò.LVڅ)ÁJğ0#Xiĉ+íÂîÁJ!ħ(XĴë‰=͈}Í‹͛ŠCÍ[ˆ#Íßǚ·'š·§˜wg˜wç˜ÇŠ ÌĊ%ĉİâ óLqyXf^Q‡`¸)áÛ+áû~(áÇ~*áç~)á|„›n V†êܑĜ{ÌĞ5€`ġ0¸th*§£ Ò* ´ ô“ú>ó™}üÄg˙œùùìjĠ÷·0ÖŸŻÁDÏ÷˙LġœŸ·aĤëŭ߇ıÎû DŸ÷żXôy˙{‹>ïÑçŭ,úĵ˙EŸ÷´èóŝ}Ŝ˙RÑçÌÏi˘ÏÓLÏ}0ĈÀy˘Ĉ¸HôÁd˜—‰>˜3à*ѳa\'ú`>ìËEŸèƒ>¸1á[3á{EŸT˙ù`b4á'~6áÎ%\L¸’pKÂí w'œŠÀ}‰ܗˆÀ}IP_Rԗ”ö%}}I@_Ò Ü—Œ‚èK†Áġ%÷ô­ ·*@ߪ}Ÿï€˜vJĜI›°‰I›š°™I››ìAçŭ/úĵ˙½ƒ>ï˙ Ïû?8èóŝúĵ˙£ƒ>ï˙ĝ Ïû_ô9ósZçiĤg}b´#Î úÄx1A\ô‰ÉbЏ,èÓĊ qU'f‹9âş OÌğ‹ċA_'úč ߚ ߛƒ ?š“ ?›‹ ç.&\I¸%è Ġı=ħw'ÜĞEàDîKDàDîKŞ€ú’* ¤ ´/)íKúú’F°dD_2 /ı /D_8ˆĝ<€è·êğ“è·êğĞèwĊçXÑŻÁë0Qô{˙TÑï9?3EżëŭçŠ~çŭŠ~o~‰è÷ĉ÷ŭŜü˘ß›?Dô{óGˆ~oŝÑï͟ úż:Yô‹~§›wƒ³Íà|ó$¸Ĝ< .7ςĞÍóà{uŭ×'|s·'|wÂ÷'üp'ütò_ñ|™„ —&\K¸3áŜU, ?û¸?û“* ŝ¤ ¨?)íOÊ@û˙ R@Aż7żSïÍïô{ócƒ~o~bïÍO ú½ù™Aż7?7èO6ż0è÷ĉ—ŭŜü>Aż7@ïÍô{óGŭŜü1Aż7BïüĠÉA/F‰ÓÍğ‰³ÍÄùĉIâbó4qıy–¸Ú)ΧŜùĴ`À;Ÿ $;_ xç{ŜùÁ€w~`0à xçGÁ€ĜFkŜNœh·° ¸ĉçÌ`@ŒcĊı^6Q\hž*.5ÏWšçŠkÍġ˙,O~Ŝ˜­ ߙ½ ?Xç`@<š“ ˆç~)á|²Ĵ”pÓÇĴњĜ;îYĊġż–ˆÀ‰<ˆÀ‰<°JNŻ„ü¤2à§b éˆżcƒÉ0¸Áµ~Ô3?;ˆAg~F‰Ag~vƒÎüĵùy&‹AŸŭ§‹AŸŭg‹AŸŭç‹A1èmï!½í½Ä ·½ŸtÜ:ÈŻl ‡™ëÛ>Z zÛNjA/-ġ²á4óh8Ë\Ïüœ/ùıĜfÀċĉ9pµyWg˙ĵ>á›=áğ?~Eƒâŝ5_$á'~&YöBÂÙ5_/&\Iµ$ܞp÷*ƒo‚ÁDLDàÁOÒ`0)LÊ@×E€Ádôàç2z07¸Ö/€úĥw zÛ£‚AÇ­Ŭ‚Á$nOĥ=9ôĥ§ƒŜöì`۞ ƒŜöÁ ·½W0èmï :näWĥ‡™ëÛ>:ôĥ]ĵ´ÔËv§™G‹³ÌġÌÏùÁ 3?ûÑ qıyޏÚ<(Wg˙ĵ>á›=áğ“Wî_óġG~"ág’e/$œ]óġb•iP´$ËÚî^ĊÁ è7‰ÁDL4€G˜½ IDATÁU@: "ĝW1˜T &U@ƒħFĦ,ĝLf ĈgÄş] 9”4‚ 9óó ĜљŸ_ÎbÈg˙ÑbÈŞïx1dĠ÷-˜"†|öŸ!†|öŸ#†’=/CŜób1ä=ïìy1$†ĵçCĐ÷|D²çcĵl{8Á\Ÿ`zŠòEögĝÑ88Ç< .0OƒépİΆ+ÍCpmÂC°<ùyc·&|gŭó„JĝħdÙSkò|™äQ!áòšŻ4'?ÛîZsY_ú3ц `(a(İJŞ€†>ıl(iZ·+!‡ŝĤWB­Û•CI#ĜP´vLöĵs0ä=†ĵçñħĈž§CŜóŒ`È{ž %{^ yϋƒ!ïyïdÏûCÁ÷|H0ä=‘ìù/Û^œ`ŜIŒ§CÈŝ ?'Î1O˜§‰éâR˙œ-4‰k˓Ÿ7&|kÂwÖÙ?ïKĝĦ„K–=µĉ+Ï'œI.ŻùJsò³-á5—ġ? `(цb x(‡x(F* ~"†’>€ĦiİqCñù¤€Ä˟ü°*ó³£x9Q}wITß1âeŸŭ'ˆ—­úS­ú~3ĊË>ûÏ/'^(^ö†—ˆ—½á}ÄËâeoĝ@ñ²#ÖĦâeoĝH/ĞçĴŽ/[ġ=ɏvSÍġÌÏYâe˜á’Q*Í(UPb”JÀ'2JUÀ'3J%àÓpF)£T>Q*ëBFİü qscV—2JeÖ÷J1u'\#u7òs£”p4Ħ/áf1 Œ—ú Âñ„ğE–îSġI.r²Ş?˘ê[·gT}š2½hŬ^Uġ™Ê4ËşŭJÉ÷TŭC&í6_™>WġEIQJĝZêe„Òd€QA2À¨&”ŞIàRŽ*e“bÁJ9šŝĵ›@! B™ŒülşÈŻ˙ï€î„2ùù[F~ŝô%”ÉŠÏ„2YñùàxB™D{ĦLE;ŒP&ўN(SўM(“hÏ'”I´# e„2‰v4ĦLf}/S7àà*Bè\'Ĥ£€qRw#?·Š<¸CêÜ£äDk*Qò!UÌĠE>êÏZÓtUY™^·no)ù5ÍUržŞ’Ô eÀgŞšÒ Ú ËÔ$pYl(PßVÖA'e*Ú.*ÚîŒ2mom_F™D;€QĤ˘=žQ&ўÄ(SÑc”I´§3ÊT´g3Ê$ÚóeíHF£L˘Í(“YßËÄԍpá*FĦ'Ħá:1E'u7òsĞÈwHŬ•{”œhM%J>¤êışÈ§TŭYkšê/+ÓëÖí-%ßµĤıJÎcJêŸ$œQFĝLĠZÓWşÁd€‘#”İIà²dXż†ÑD(è22nm'.I„Lü8èLü•à`éûFÈÈÈOBFÍúö ddÖ·7!£V|ö#d¤ï?‘Ÿœ@ÈH¨CBFrĠ)„Œ„z†˜\:‡‘PGˆÉċŞQ„Œôŭ/“›ġ½Bdàjİğs~Ù¸IênägĵÈ p—Şg€û”œäê"'Ğú#Öô„Ş?C”áíòyezÉ^ġš’oXÓ;JÎħĤ”üĜš(ùeR'd€%Ş^*u7 œQ“À{PF­ÊĜ 3ħ}@&–€L,™™ĝq™ĝ+!3„ƒ%WĈ”‘Pğ02*Wġ`d$ÔŜŒŒÊUŭ u #£B=‘‘P‡0Ü˙ .WÂÈH¨gˆÉċŞs u„˜\ĊÈHß˙b1ıYß+Dö \-uwÎÏġ"ûn’şù/2C¸KĠ3„û”œäê"'Ğú#Öô„Ş?cMÏĞúKÖôš’oXÓ;JÎħĤ˜ùħ5-PòˤÎÈ–¨zİÔŬ$pFMg’9F!£&3É$0£…áè>€ G!‘@È.} ”{OÉz˙Njä§+Ħ\ÍúöT³}ċ2òóàBıôŭ%”Ğ8ÊUœC ċçİ„rçpBıÄy.Ħ\Ċy!Ħ\úŝż“›ġ½T¤[ï?†P.ëŭŻ“ù'rp‹Ô]ıCÉ .r˘ġ,Qò!kš˘äSĥ‘çT}ş5½bċLUŸeMżRò=kúHÉùIP|a=+ıÔz–ĞIàrûB˜òĜ*  \?ċħ!  ĵHžċŜÀ7„MD›T˘êÊ(WqöTqöa”Ğ8a”KœÇ2ÊUœƒċ*ÎĦŒr‰óTFıŠs8£\â<—QâĵQ.}˙_ˆÉÍú^*òBwÂFıĴ÷żVLnägœÈ„[¤îÊJNpu‘­g‰’YÓ%Ÿ²<§êÓ­é+gŞú,kú•’ï1ʙÓGÊ4?İ3Ê _ĜF+ıÔz–ĞIàr; \_TÎĉ8èrŽn+çapĦ·6H„ì²jä§!+#?żşİ‘Ÿž„Ĵšġ=АUğ½ú²Ò÷?ސUAžHÈŞ O&d%KFȲäY„Ĵ ò|BV²ÔHñtğĠF‹t³—²2ë{•˜úGcEş‘Ÿ›DfÛT= Üeċ}JNru‘“UŭkzÂÊİŞŝĵ5Ͱòu%ß´Ĥw­œĞäĵ¤NÈŸZÏϕ\d=żĥrûµ“ÀYğ ([ dí+!³;8dÛ<0²;8ÄÈŞ ;1²*Èn*KġddUG1²*ÈŝŒĴy#Ğ‚<‘‘UAžÌÈJ–:‘ed%ȳYäùŒĴdİ‘âévЍéf}/gdeÖ÷*1ġ!E+ҍüÜ$2K¸MĠ³„ğĴĵOÉI.r²Ş?bMOX9UĠŸ·ĤVä›Öô•sY&'ç%&F–İġü\ÉEÖók+ġ@ÖNgÙĴÊrthÖîÈrd'°wt–Û<x§ĉìKásö `³ZïßYüt#äÔ^ß^„œšġ=š“YßœD8ˆSžDÈ݇r*Â39IQgr„œ¤¨"Ŭ4ġ(BN½²ĉBNúŝWˆ§›ġ½Fd_ pƒÈ@¸Ed¸]ĠsÀ+'ZY˘äC.rŠ•Oċx[ŭ9kzÑÊW­|CÉ·“:!ÌħžXù‰’ ì… ­üÊʌnÇNçìÁrú ÈíàQ@ΞšÛí§ĉìKásö `3Ñĥ‡tBg•˘ş1r*Â^ŒœŠhFNE8€‘“1r*“9á0FNEx#')êlFŽ‘“5B¤›ĤĊÈİWÖ\ÂÈIß˙ ñt³×ˆìKèG¸Aä@BŽp‹ÈávUÏ&X9ÑÊ%ru‘SĴ|ZĠŸ³Ĥ­|ĠÊ7”|;İ3r„9Ûêä²ò×V~iċÛl™’9½ ¨“À@…}'p…~*ìF°Š2 ĵ‰p0S… Ż3£B…w£B…w$£B…×—QĦÂȨŽgT0*$ĵ!"]x§0*Txg2*Txç2*T~şQ!}˙_H;ïİȞ„^„1"Ŭz˙ëDö' Ü(ҕ۔ĵÓĠEŜkċ$+'ÛvµòI%§Ú _°òe+iċ,+µMRá½ÄĨ |dċŻ­üÒÊ%ĥÙ2%sÉ£ŠPa'+ì*  ğ ´Âî¨àÈNàÔY@;•yyûB˜ĵN„ĵŬ œ”˙!„ĵù9œ—‘Ÿoî„ĵšġíMÈĞŸŭyuÒħ„ĵJNƒ y•œ†ò’œN%ä yINEşätžH×÷)ÒġŭG‹t{}/éf}ŻÙ8¸^¤+7[yğ•Ĵœhe‰’ışÈ)V>mċ4+_²ò5+ß´ò]+çZùĦ•ó­üÂÊĊJ.Mê„<U²ÈÛIàĵ]”·Ë@óv@Ŝ8ݐ·/„Éëäuò#Ż#o_“× €‘·;ó„%9ÂÈĞät8#Ż’SwF^%§ŜŒĵJNŭyÛħŒĵJNƒy•œ†2ò’œNeäyINEşätžH×÷)ÒġŭG‹ìNèA¸\¤›ġ½Zd?Â1„ëEşr³•·[9ÁʉV–(ùĞ‹œbċÓVN³ò%+_³òM+ßŬ.)Ϙk­Z9ßÊ/Ĵ\ĴäÒ¤ÎȲJVòv8ÏfPŜÊÛe y6Áòv'pžÍapy6Ż„Ì³J„<ïÊ'=òs¨ùù ‹ùù_ ‡ùù‡PİV|C¨TG¨TH¨TL¨TN¨TM¨T}˙„JéûwF* •²âó‘nÖ÷J‘nÖ÷Z‘Œ³òV+ï´ò^+'9)d²•Zù$Ħ’¨’·Ég­uş•ŻX9ÓÊ·­œ“HB%•ŸXù™•‹ĴüÚÊr++í$pežÚO› [ˆÜCm`]l`=l`}•*°c•*°•*°•*°“•*°Ó•*°³•Şï?‚Q)}˙΄QŒJFĴĝĵD¤›ġ½R¤›ġ½V¤+ĴĵĠÊ;­ĵ×ÊIN ™lċ£V>iċ³VN·ò+gZùĥ‘4'‘ŒJÂV~bċgV.²òk+Ë­Ĵ´“À•zXżÒ_šÚÚ œ: "u¨~'°$€íÂ@¨R#?‡ŞÔÈOB•ùéA¨R#?˙Ž"TİŸŭ U*ŞA„*ĠI„*Ġ0B•Šê BĦJÒÒ9"]ß˙‘ÉĞê/"TIßż'p™8¸YßĞDş2ÖʛĴoċŬN ıßÊ* Äʇ­|Üú?cċóVΰòu+ßJ$Ħ ˜me•[ıÀú/´ò++3Vĉî&ĞRû€*ğ ´Êî¨Ò ¨*ÚÀ¨RQʨRQuaTݨz0ŞlTG1ŞTTŭU*ŞAŒ*ĠIŒ*Ġ0F•Šê F£JÒÒ9"]ß˙‘‡ËŠÏ‹UÒ÷ïI¸LÜĴïU"]kċMVŽ·òn'…ÜoeĦÄʇ­|Üú?cċóVΰòu+ßJ$£Š0›İÊ:ĵoċÇV.°—/´ò++3Vĉî&Ğô$0£‘Pe—VÙe Uv@·c Të@¨V ` p Úíġ{à0BµùéJ¨V#?= Ġjäç;àhBµ iĦZ…t<ĦZ…4„PM¨–œtŠÈ$' 'TĞ˙yâàúŝ#Eş˙h‘½dÖ÷ !}jà‘Ü`ċ-N ıÊjà^+'Y‡ÉV>ê]ŝ”%ÏYù˘•Ż&’P ĵae5•s­‡VÎ÷.˙Ғ%V–YYĦeè, jğ ´ú{=Ġğ30Şu`Tа…p Ñĥ“„ßcTАş2ŞUH=Ġ6¤£Ġ*¤ŒjÒñŒjÒF5£ZrÒ)"“œ4œQ­úŝ牃ëûéúŝ£Eö’Yß+„ô%TéÊ VŜ⤐;ĴĴ&Ükċ$ë0ÙÊG½ËŸ²ä9+_´òĠD2Ş oXYMx—IËıÖáC+ç{—iÉ+ËĴĴ2ġ>FĦÚŞÖË@SûRÁż!TsÑ<l$ÔĜ‘ŸNvä§ĦFüô"Ô¨‘} 5*ž„Ï „ÏPBŠç4B’:‹PC¨QÇS Ô¨˙(qp}˙KDö‘Yß1B\ıÎÊ­ĴĈ[r·•÷;İH‰•[‡Ç·IJÈT낕/{íÏ´äm+ç$RÈ<+?µŸ{ŝ‹-)µ2çù×ĜU@5vPMj¨ħÁj 5í÷°•è@FMHl<Ŭ5*ž^ŒO_FŠg £FĊs£ĈĈ3”Q£â9Q£†¤ÎbÔ0jÔñÔ#5Şï?J\ß˙‘}dÖwŒW³òF+k-ıÛÊûT¤Äʇ­ž˙TK^°òeÏĤ%o3j˜9'ħ ™gċ§ÖásÏħ%Vĉ<˙ğ ¨ĈŞÑĞ€k5v@ §ÀoٜZm›µ­T ì§F~Rżŝ:jĠÈÏ_#ìÈϑ„Z5ò@?B­ ĉXB­ÊFƒ µ„ZÌɄZ•N‡¤ïĦVû_ ŬdĊçEB\ß˙2‘Iıڒë­ĵÙIEî°òÏa’%“=‡Ç,yÊs˜fÉKV–H!oY9Ûsxߒ=‡Ï,Yä9,µ$ke•’nPmá9 ĥµ³€j µ;™µ­TKĜOe£ƒl0µ6aƒ9’QkƒéǨUÁ˨UÙh0£–QĞ‚9™QвÑéâôŭÏaÔŞq˙ ÄĦ›ĴĝĵHˆëû_&2)W[r½•7;İÈVŜ9L²d²ç˜%OyÓ,yÉÊ×)ä­m’œœí9ĵoÉǞg–,ò–Z’µ²JI· ¨VŻJ½˜ħšPĞ—Ĥ6‚1ĥj9ŝÈĉ`µÜĉO„ş@2òsĦNíöúèL¨S#?GêìÈOoBäBŠä8Bä$BJEu„:Ġ÷?“P§Ž;W’˙H!=dĊçĊB\ıÂÊ:àZKĈ9İÈmVŜċ9Üï‘+öž°dŞç0Ŭ’W)ä +ßñĉzä#K~í9,´ä+- u@ı••žC]j¨³Ë@ëRC@@]áI` n·]zĝ ‘[w£ÎĤ˘ÎŒ:ÉŒ:IoFäFŠä8Fä$FJEuŒ:Ġ÷?“Q§Ž;W’˙H!=dĊçĊB\ıÂÊ:µ–ŒsR‘ÛĴĵËs¸ß#%V>ì9„Ž‚¨Wŝ&ÔۑŸíšŸî„z;òӇPoèO¨Wa "ÔêUC„$yèTB½Ú6\’˙ùB’˙(!ï_\*ĕ1VÖc=r³%·;İÈ=™dÉdÏá1ŒzFF½ c£žQŻÂ"$ÉC§2êĠ~´áâôŭÏ’ôŭG q}˙zÂB\ce=aĴGnĥäv'ıÇ#“,™ì9<ĉ‘§-™–H!3<òK+g1ĉx—ÌóÈ|K’QOXâ]’ħ$ï]b&M„z½ (u4c=Ħ^ï`l!Ôsü0¸Ŭš€ŭì¸˙CÔŻ˙_€ ËìÈOÂ2;òsa™aa™áÂ2PÂ25qaa™êûŸ-$éû_ $éû_$$)—[rµ“ŠÜà‘[=r—Gî÷H‰•{O-cCžġ|^ôÈk–ĵ™H!³=òG>ñÈçYlIİ–„e@…Gj•tĞ€–yÇA/ë`Ë@iÛv|‰ááŒe6†Œe6†£Ël Ël '0–Ù†2–İyˆÓî˙–¤ïĥ¤ï¤ï‘¤\nÉĠN*rƒGnġÈ]ıß#%V>ì9<á‘g=ò˘G^³äMĈ2&Mf'BŜ÷È'ùÜ#‹-)Ġ’ħŒPá‘Z%Ŭ* eœ^şŒÓ `ƒ—ĥî’@hH%BƒwhƒJżö#4¨_˙?‡Ô¸˙߀.„;òӓ`8š`3@BƒÍ@ƒ 6Lh 4¨˙B’˙ıB’˙H!IıĜ#Wzä:Üä‘Û=rG&9"pr"…<ĉ‘§=òĵG^öÈLĵ‘ıùÈ# <²HB°Ô#9Ôx¤!54x/„iŽ‚hNmH% !•€†V£!• Ŝi  *ü–h?FƒÍ@‡0lêÂh°¨'£Áp4£Áf Œ›3l:™ÑÀhP}˙3„$}˙s…$}˙‘B’rħGôÈuıÉ#·{äLrDàäD yÌ#O{äyĵ쑙Û$%äÏgG>òȏ,҄Ñ@XꑜGj<Ò W1Z œŜÀ68}PÛ@h`› ĵ ž\ß;î˙gàPB£ùéJh´#?½öî} öîÇ êî' ÑkN!4Ú×Ñ '4Şs~şç˅ïߌ’”K=r•GwDÁ[’ÑdoŬÑÄh²·Äh²ıgˆ¸%ǝ*äPéûŸ%¤Ğêû_ 0)yärGĵĈ#M„=2Ŝs›à‘˘àƒ™â‘gĵ _5ġށÔÄxÓs›í‘÷5ĝİGܖx$jŞÊƒË”tĞ€šRË@ŭ}ŒM„&NŸÔÄğ4š#OzÜ˙B³]ñù7 “úġw}˙#Íö½ ÍŜ}ûšmâ9žLhĥsC ÍöMd§‹[Ò÷?GHw YÊHIıĜ#ÍÀŽuDÁ›=Ò ÜéÁûBn%|Ä#O&DÁi™r›éÁw<2W{䳐Ûb”ynù!4ġ~kŝ$0œJ@ó޽¸ıMß Üy÷=€Ñì%žNŜ}`4Ûûöf4{÷íÏhĥ‰çxF3£Ù>Êhĥo";]ܒ˙9BşĞ|¤À¤\ì‘fÂŽuDÁ›=ÒL¸Óƒ÷…ÜJ<ĝˆGžLˆ‚Ó<2#àF3=ĝŽGĉj"c|r[ì‘2Ï-Ÿ"ŒfB½ßÛe Œ5„fNokNíöƒc|Khĉ]úü7aı÷˙8ŝú˙èDX~ŭ]ßż;aı½iÂrÂr{Ó„ċ^ÖLXn :Y=DġŭϘôŭÏ˘Ë(^ꈅW‡à8Ür›àÁ˘àƒ™r›êÁé!·×Bp–çh"Cü:äĥȃKS„°¨][çÁĉ>€ċ;2 ,o—! Ĉr˘m‹ŻċĤz7íÄXîŬ´;cı½iĈrĈr{ÓŒċ^ÖÌXn :Y=DġŭϘôŭÏ˘Ë(^ꈅW‡à8Ür›àÁ˘àƒ™r›êÁé!·×˙Rp–ç9Gzä×!·E\š"Œċ„еu4“À²`yj€ż˜ñ[Âr$€?ïòìûHXaÇŭ˙ t&ĴPżŝîŽ=+ĵ;MXaï8°‚°ÂÎ:œ(PżàTß˙,IህydpE^çÁ›B Ŝ‚÷…`‰IQŸÚ·{>ïÁ—5ĝFÎ5ĝ? ]ûe~‚9Ö¤a¤d²`E蕐+Šh€öñîx c…wÇΌŜ{0Vxw<šħÂŜq cc…u8QàŞïŠÀNŞï–À¤ŒpÄ‹<²‚pE^çÁ›B Ŝ‚÷…`‰Iˆ‚O…àó|y;ĦĦŬÎ5ĝ? ]ûe~‚9Ö¤cĦIÉdèŠÔ>ĈF $€ßµq ´„ŜÖbÀ€}-Ŝ¸˙A„;î˙oàpB‹úġw·ëIhñòM_B‹—oŽ#´x'O !´ZÔĴïaÀiŬĴo œ#P—‘ĵĜ DŽàġ!xkŜ‚$PñCñ|6_ Á_†à;œĞ‰ÀCó$´KB°<ĞC°Ñƒ+h Ôz#X‹Ÿ€–LŒ–ÁZlĝaF‹—ob´xùĉpF‹wğžŒ/ßôe´xùĉ8F‹wòÄF £EÍúF8M ›ġuŸç9uéÁ‹ħpL^‚·†àŬ!ĝ@0ÁgCüeÁıšü8?OAF aI–‡`u6zp%™—ß{IDATĦ%µ ”ħ’ÚĈĝ Ħ…½@ha/Z¸MŸ\ß_ûëïúŝVÚq˙˙]+½{ġ"ĴôîĠ°’°Ò>m ¸Ÿ}˙PÂJ5òúŝgˆ³.ç…à¨ĵÌAËŻ ÁCö*~oJBÑ|:Ô !ĝjĦ9!ĝa.HAá‹C0‚UĦ‚͆6‚­,U@äŜÚ7t݃+½{uaĴôîĠ‹ħÒğW?ĈJĈJ;ò3Hà~öŭC+ĠȏëûŸ!Îşœ‚£B2-ż&o ÁÛ¨ĝ½!¸’P‚†àÓĦ^ÁW™|ĝ–ö>'? Á)(|qfB°*ÔBC°ÙÔ2PĈzÂÊÔ>€àY@ÁÂHĝÇÎ&Â*ùQNF~ö%ĴòĈŭ˙BXeÇŭ èJXċŬèHÂ*Â*/Óô'Ĵòvœ ÎzÖ÷dîו”áÂu‚9èñ+CplÈù–H w‡ĝ TüÁ|\CĊŸ Á!癑f‡ĝ!8?…/ ÁҐs>Ò²o‘şŜ°*r*?ĞvQ`Ĵ’ċ$ÓìËXşÑ!ŒUŜş2Vy7:’ħŠħÊË4ŭĞĵg'ˆójÖ÷dî×?ù0‡ ×eD^ä ÇŻ Áħ!ç["-Üâ$PñCq .gl#¤ùÌH ³CüƒœŸ‚Â…`iÈ9iaYˆ·H]ïXĊŜF0ĈVÂ*öaï˘ žô¸˙Ï Ğ½q˙‡VÛq˙ŸŬĞCwéCXíŬea5aµ÷ڙ…ëYßSĤÊÙ!~Ħƒż$ÄŻŠ8 ññ ´üŜ/ ÁG ЉVsš?jdş†Šż‚oGœß ñORPĝ—!ĝuÄı"Äë|HX Ĵ°ÄíXœV·ÛmëgŝLĝ9cuè.‡2V{wéĈXşKĈjï9cŭ?°Żġ=Qĝ!ŞïŠÀT9;Ä/t—„ĝUçq!>>–ßá%!ĝhÄù™Ÿ!SÂ_9żmœ·ó÷Bü“ŝe~qñ:2VVX▁ö÷0ĥV§vƒŝ €°&ò>€5ö×ßġŭ÷#ĴñĈŭż#Ĵñnqa a—cŽžšg>VĝŝvÖwˆNÀ)§9Hۉ+çFĝ¨ż<ÄŻM ċ7Gĝ]ŝ@ˆ?¨ĦâODĝ´%ÄßLAás"ü£˙<ėĝ°ÈFxm„/ñö9 ‚ħ&ò>€5Ħ[ìÇXşĊaŒ5Ŝ-Ž`ĴaĴñrÌQÂS+Mżġ"ĵ“ú¸NsÓı>*Â/ñkhùÍ~W„?âj¨ĝ>-Ài •˙›)(|N„ះĝ2Ö²^áËC<° vD[&€‚O ûïïŭúğ'ÂÚPû=kCí÷%Ĵ 54ˆ°ÖŽü¸˙PÂZÂZ¤Ë™>"ÂGGĝÇ=Ó >>Â„[Óc>5Â_Š™š+ÓìŸá "|qŠ‹İ<Âk"ĵ9 XyÀÚ`ÖĥÙm[eaÌŝ‘ö;1ֆÚïÁXjż/cmè´ÑAŒµväÇġŭ‡2Ö²÷ÑΌ>:ÂÇ8î™nˆñ~o„—$ܚ‹İŝSÏÔŝÊ4;ÂçEĝ‚_œâb*šoŽô2PÙ ĵ–C €°–C €°–Û*Öyżŝö'Ĵó~ŭ] ëB÷$Ĵ /ġ#Ĵ#ĴóF~Žî~ŭ×İ2LLİrV„_è¸gş$Â××DL7Eĝ ·Ĥ‰š[ÓCÛ9iӓ‘KžWS\™ŜŽ÷"—|á }.Ĥ²݊\ÒáĞ•Lí^9zŬ.˘˙ÇXj|ĈşHëB÷dĴ Í0÷cĴcĴóF~Žî~ŭġÇ5LLİrV„_è¸gş$Â׉˜nŠ;nM5·Ĥ‡"üÉÈ%Ïo‡¤ùĞ)ez;Âߋ\òi„/ôı˜Ê"ĵ*rIc„ŻV2µx{GA0ŝ@X—: N%€ż·UĝĝihÖ÷ŸÀ„ġŜŻżkùpÂúP˽ë ëC; úÖ{k~Ë%~95b:ÇñiTÄtyÂ=ÓĜż5~É=qSIÄô˜ĉÖôlÄ4#~ɛӜWĤ#Ĥ/|.ĤS>~ICĴʃÉNàġíş è[ÂO#-ÀXiùpĈúP˽ëëC{Œû3Ö{k~& –KürjÄtŽ!Ó¨ˆéò„{Ĥħ~kü’{âĤ’ˆé1Í­éوiFü’7#Ĥ9)LGL_ĝ\LK#Ĥ|ü’†ˆi•“`ëŭÀħÓ@w*6x Àüü”°!4ëûoà@Âï×ß5ۅ°!’Wz6„N™@Ĝ@Ĝ ~ŭ7H9əh;IÊéqÓùqÓè¸éވi\Â=ÓqÓDm²Ö‡âĤ§âĤéÓë)LïĈMóâĤÏ|“XżŠ›*"Ĥú 'lVFL ħ9`C,~@`lH'rGĴü”ħ!’Wdlˆ4ۅħ!’Wz36„N™ÀĜÀĜ ~ŭ“â$gâÀ§tzÜt~Ü4:nş*b—pÏtGÜ4Q›ĴġĦ¸éݸi:Sôzêez7nš7}ĉ›ÄúUÜT1Ġ9caeÄ´‘°Áß&‡ÁmàH là6zHF~~úġw}˙ƒ#mv%lŒÌ+ô!l$lôv{+Ĥ`·›.tĤġÒ¸éÚÄäYo‰›&h“g-‰›ĤÄ/|.nz%eRÖYqÓ{IĴóĤÀâ¸57ĠM„@KÜÔîû’6oó ĈĈH›]#+‹ú0626zğ½ +Ĥ`·›.tĤġÒ¸éÚÄäYo‰›&h“g-‰›ĤÄ/|n;§”é•ÔUÊ:+nzÏ7‰u~Ü´‘°8nÍĈMuAc#Ħ%n ì(p¨Jk“ ÇŭFĝ&2ëKÀÁ„o" v#|Cĝ&rĥÄÑbĠ#?ß߃œ‰ĥÉT7]ÂQqë‰)d½!n½]›<ëĸġĦmáÀ…OÇ/|1e²Ö7âÖ9IY?‰[ĵ0·ÖMb]·nz ßìò@ÛŜ°Aĝ+ágŒoâ Ìĝ&Ò`7†ûrƒçK-V=òŝêAÎÄáÏgXÜtvÁ GĊ­W$Ĥġ†¸ġvmòĴև ^ĝtÀşí_ʋ)“½ö¸uŽoRÖOâօ/ÌÄ­5A“XWÄ­¤H„oüÓ@Û 6ݐ÷˙oÂĤÈĴïO€C›âé¤;aSüŭbŭ››.ƒÖS)b=Ż utb 9\]zsA넂ÖmµSR&kVúZAëğU9|XúEÜş4hkUÌJĜ4´·$uÜĤOÀĤœ›To=•Nŝ›ħ)ŜÚ!ŒMñtҝħ)ŝ~ħ~ŒMŭ4Ç­§:SÄz^AëèÄr¸ş ġĉ‚Ö ­%ÚjĤ¤LÖ:İ€ġµ‚×ë[•‡­_Ä­Kƒ&ħVĊĴŒM„ĉ‚Öġ–¤ÎÚ䟔$Â&n‹'€àĴï>„Í‘Yß˙JĜLĜMê!VĊçŝÀf ż8ËIÎq8£ ġ‚Äq¸Ĵ Ĝ‚ÖñÚê9ܟ²z´>SòU9ĵUşxż ‚ U*hÍÇĴâTa]ˆ'gmŜC@äŝ-šÚ‡ħ9ŜÔĦŒÍŒÍ‘ѤbġW|îOĜLè/Ár’³FÎ(h½ ħF.+è0ĥ uĵĥz÷§Ĵž­Ïl7‘ï0o\9ĵUş™~A‡AĞ8|UšYĊĦİ şOŽ‚ĜìaÀ_w*ĥ˙úġw}˙} ["³N„-ñĊ½[[ÔŻ˙[ŠCĴ -èp–³ĈF%Ÿ1nÔ֐Ŭ­9”txŻ´ĉNÁú|ԚÏÂÖÊcâS_À°XŬšîšĤmİ‘F~ÎĜZ°‘ÎŒ­ß+ٛ‘ŝÒm9Î9Ä}†µĉpnâ÷ı¸5Ÿk[s¸M;„|îO9x>·ĉ0•ħ•İ€Ï+~ Öᝠƒġù¨5Ÿ…­9”Çħ€c+aukáÀ…_ oĝ á7ÜZéˆ>EÒ…MEҞüi·êFĊößHÇ ğ}Ào żċÖʎĝ³[Ñp£b l/ùüC_G1ĥ—|ŝ)ŸżŽŽqı€ß~Ç;PÚÖíÇ…Š>½ŞAÚSŝ=£Ajë‹˙OŜµ €ß~Ï;V:ŠgğCâ uŻĝüS…~`³EŭG“ç÷pĤ=ñjgOÂx‡ËÎğ֙Š#Œ½Ĉı?íl?:·sèë(ö˜‹Ŭ™üáĝû”ŭwĦ?Y<{³äğè0ñïIŝ´‹ÛßKŭ À äïY~ĵd—\BĊĜž{Iô*jŭxÉż¤àwÑÁŝ–âş„ü‰'ŝŝĝŻêxAR‘ı·|ŝş´ö]tà?­˜jŭÂÈħ'üiíĝ–-˙ òƒ/lŻk‹=`êhÇMÛŝZï‹(ö€‹ĝĤ;Ž}EpGş–ü™gŜ‰Ò—·{m?uĝ;àċáÏQŒñwœË[iaˆ˘ŽżĜ/'˙Kĝ_Ŝ鲇5ÒÁPÑDRTËî˙‹â_D‡ĝ‹öœ/šÚ˘‘=ïciËFÀ_á6*mĜTÛĥV´moŠ5°"kj—·ĥ_DÑŝ™EX´µô-íŸYĴ€żŝÊm]:J›E*uœP;§ú}›ŬoaOŝó‹¤ÍÈ·PŒĦv O5PÀß]Y~l‡Ú§˙žÑŝ.ĝö¨Ïg÷´ßĤßÂĝù´Y!'üwWٝ÷ÚÍ·Ûİ{ўû§u Û}˙oĦüiè^;ö-tÈ?­ènGŝAĝ·_ißğK´w˙ùE@{| EôçCğŭ+(?wOÂ?ı(Ë^k`Eû‰µylmôì Ú l§ż‚½îÛÙBŝEĝwä²'ÄOíĈ^ŭùwäŻ`ùü;ìW‘?óJÈÔë!˙ŬAÊPÂżwĤ´wü%D˙ĉûÚġÏ_Ü^‘ï\ħŻ„¤Ÿpúġíá–ĦŒïLiïĝKĥEB;ġW´ßŸż¸]ÂŜé’~'°ŝġ˙no*£ßµoi×?Nğ˙ùíWô;ġŻğĥ;Ë(Ĉwí[ßIew—9íŝç·_1 Àŭ÷??–Ŭ^J˙ùħ´Sˆ˜·ŭú·{<{a)aúÇÒ.ċ˙;‚á—I9rIENDB`‚gamera-3.3.3/tests/README0000644000076500000000000000074711243556050013775 0ustar chriswheelThe tests in this directory test Gamera using the py.test framework. The py.test framework must be installed from http://codespeak.net/py/ This package is not required for the proper functioning of Gamera, only to run the tests. You can run all tests with py.test --tb=no Alternatively, you can run an individual unit test, say test_graph.py, with py.test --tb=no test_graph.py In case of failures you can obtain more information by omitting the option "--tb=no". gamera-3.3.3/tests/test_classifier.py0000644000076500000000000001506211540453674016656 0ustar chriswheelfrom gamera.core import * from gamera import knn, classify, gamera_xml init_gamera() correct_classes = ['latin.lower.letter.h', 'latin.lower.ligature.ft', 'latin.capital.letter.m', '_group._part.latin.capital.letter.m', '_group._part.latin.capital.letter.m', '_group._part.latin.lower.letter.i', 'latin.lower.letter.d', 'latin.capital.letter.m', 'latin.capital.letter.t', '_group._part.latin.lower.letter.h', 'latin.lower.ligature.fi', '_group._part.latin.lower.ligature.ft', '_group._part.latin.lower.letter.h', '_group._part.latin.lower.letter.i', 'latin.lower.letter.h', 'latin.lower.letter.d', 'latin.lower.letter.d', 'latin.capital.letter.m', 'latin.capital.letter.c', 'latin.lower.letter.t', 'latin.lower.letter.t', '_group._part.latin.lower.letter.n', 'latin.lower.letter.e', 'latin.lower.letter.a', 'latin.lower.letter.r', 'latin.lower.letter.r', 'latin.lower.letter.a', '_group._part.latin.lower.letter.n', '_group._part.latin.lower.letter.i', 'latin.lower.letter.a', 'latin.lower.letter.r', 'latin.lower.letter.r', '_group._part.latin.lower.letter.h', 'latin.lower.letter.e', 'latin.lower.letter.r', 'latin.lower.letter.e', 'latin.lower.letter.n', 'latin.lower.letter.n', 'latin.lower.letter.o', 'latin.lower.letter.e', 'latin.lower.letter.s', 'latin.lower.letter.e', '_group._part.latin.lower.letter.h', '_group._part.latin.lower.letter.i', '_group._part.latin.lower.letter.g', 'latin.lower.letter.a', 'latin.lower.letter.r', 'latin.lower.letter.r', 'latin.lower.letter.o-', 'latin.lower.letter.r', 'hyphen-minus', 'comma', 'full.stop', 'comma', '_group._part.latin.lower.ligature.ft', 'noise', '_group._part.latin.lower.letter.g'] results = [ ['latin.lower.letter.n', 'latin.capital.letter.m', 'latin.lower.letter.h', 'latin.lower.ligature.ft', 'latin.capital.letter.t', 'latin.lower.letter.g'], ['latin.lower.letter.n', 'latin.capital.letter.m', 'latin.lower.letter.h', 'latin.lower.ligature.ft', 'latin.lower.letter.h', 'latin.lower.letter.g'], ['latin.lower.letter.n', 'latin.capital.letter.m', 'latin.capital.letter.t', 'latin.lower.letter.h', 'latin.lower.ligature.ft', 'latin.lower.letter.h', 'latin.lower.letter.i', 'latin.lower.letter.g'], ['latin.lower.letter.n', 'latin.capital.letter.m', 'latin.capital.letter.t', 'latin.lower.letter.h', 'latin.lower.ligature.ft', 'latin.lower.letter.h', 'latin.lower.letter.i', 'latin.lower.letter.g'] ] def _test_grouping(classifier, ccs): classifier.change_feature_set('all') cases = [(classify.ShapedGroupingFunction(4), 'min'), (classify.ShapedGroupingFunction(4), 'avg'), (None, 'min'), (None, 'avg') ] for (i, (func, criterion)) in enumerate(cases): if func == None: added,removed = classifier.group_list_automatic(ccs, criterion=criterion) else: added, removed = classifier.group_list_automatic( ccs, grouping_function = func, max_parts_per_group = 10, max_graph_size = 64, criterion=criterion) added.sort(lambda a,b: cmp(a.offset_x,b.offset_x)) assert [cc.get_main_id() for cc in added] == results[i] def _test_classification(classifier, ccs): (id_name, confidence) = classifier.guess_glyph_automatic(ccs[0]) assert id_name == [(1.0, 'latin.lower.letter.h')] classifier.classify_glyph_automatic(ccs[1]) assert ccs[1].id_name == [(1.0, 'latin.lower.ligature.ft')] added, removed = classifier.classify_list_automatic(ccs) assert [cc.get_main_id() for cc in ccs] == correct_classes assert added == [] and removed == [] classifier.classify_and_update_list_automatic(ccs) assert [cc.get_main_id() for cc in ccs] == correct_classes classifier.change_feature_set(['area']) assert len(list(classifier.database)[0].features) == 1 added, removed = classifier.classify_list_automatic(ccs) assert [cc.get_main_id() for cc in ccs] != correct_classes _test_grouping(classifier, ccs) def _test_training(classifier, ccs): length = len(classifier.get_glyphs()) classifier.classify_glyph_manual(ccs[0], "dummy") assert len(classifier.get_glyphs()) == length + 1 added, removed = classifier.classify_list_manual(ccs, "dummy") assert len(classifier.get_glyphs()) == length + len(ccs) assert added == [] and removed == [] classifier.classify_and_update_list_manual(ccs, "dummy") assert len(classifier.get_glyphs()) == length + len(ccs) classifier.add_to_database(ccs) assert len(classifier.get_glyphs()) == length + len(ccs) classifier.remove_from_database(ccs) assert len(classifier.get_glyphs()) == length classifier.add_to_database(ccs) assert len(classifier.get_glyphs()) == length + len(ccs) def test_interactive_classifier(): # We assume the XML reading/writing itself is fine (given # test_xml), but we should test the wrappers in classify anyway image = load_image("data/testline.png") ccs = image.cc_analysis() classifier = knn.kNNInteractive([]) assert classifier.is_interactive() assert len(classifier.get_glyphs()) == 0 classifier.from_xml_filename("data/testline.xml") assert len(classifier.get_glyphs()) == 66 _test_classification(classifier, ccs) _test_training(classifier, ccs) length = len(classifier.get_glyphs()) # subtract len(group_parts) because to_xml_filename() does # not save "_group._part" group_parts = [x for x in classifier.get_glyphs() if x.get_main_id().startswith("_group._part")] length = length - len(group_parts) classifier.to_xml_filename("tmp/testline_classifier.xml") classifier.from_xml_filename("tmp/testline_classifier.xml") assert len(classifier.get_glyphs()) == length classifier.merge_from_xml_filename("data/testline.xml") assert len(classifier.get_glyphs()) == length + 66 classifier.clear_glyphs() assert len(classifier.get_glyphs()) == 0 classifier.from_xml_filename("data/testline.xml") assert len(classifier.get_glyphs()) == 66 def test_noninteractive_classifier(): # We assume the XML reading/writing itself is fine (given # test_xml), but we should test the wrappers in classify anyway image = load_image("data/testline.png") ccs = image.cc_analysis() database = gamera_xml.glyphs_from_xml("data/testline.xml") classifier = knn.kNNNonInteractive(database) assert not classifier.is_interactive() assert len(classifier.get_glyphs()) == 66 _test_classification(classifier, ccs) classifier.serialize("tmp/serialized.knn") classifier.clear_glyphs() assert len(classifier.get_glyphs()) == 0 classifier.unserialize("tmp/serialized.knn") gamera-3.3.3/tests/test_color.py0000644000076500000000000000223611414613300015627 0ustar chriswheelimport py.test from gamera.core import * init_gamera() # # Tests for converting color image to labeld CCs # def test_color_to_ccs(): # when more colors than labels: exception def _too_many_colors(): img = load_image("data/too_many_colors.png") labeled = img.colors_to_labels() py.test.raises(Exception, _too_many_colors) # test labeling img = Image((0,0), (40,40), RGB) img.draw_filled_rect((3,3),(5,5),RGBPixel(255,0,0)) img.draw_filled_rect((10,3),(15,35),RGBPixel(0,255,0)) img.draw_filled_rect((5,20),(30,25),RGBPixel(0,0,255)) labeled = img.colors_to_labels({\ RGBPixel(255,0,0):6,\ RGBPixel(0,255,0):2,\ RGBPixel(0,0,255):7,\ }) assert 6 == labeled.get((4,4)) assert 2 == labeled.get((12,18)) assert 7 == labeled.get((12,22)) # test conversion to CCs ccs = labeled.ccs_from_labeled_image() for c in ccs: if c.label == 6: assert [(3,3),(5,5)] == [c.ul, c.lr] if c.label == 2: assert [(10,3),(15,35)] == [c.ul, c.lr] if c.label == 7: assert [(5,20),(30,25)] == [c.ul, c.lr] gamera-3.3.3/tests/test_features.py0000644000076500000000000004212011357411325016334 0ustar chriswheelimport py.test from gamera.core import * init_gamera() import features eps = 0.0001 # testing feature_plugins # area of bounding box, nrows * ncols, result floatvector[value] # bounding box of whole pic, independent from content, trivial case def test_area(): #case 1 img = Image((0,0), (8,8), ONEBIT) area_f = img.area() assert area_f[0] == 81.0 #case 2 img = Image((0,0), (3,5), ONEBIT) area_f = img.area() assert area_f[0] == 24.0 #case 3 img = Image((0,0), (3,16), ONEBIT) area_f = img.area() assert area_f[0] == 68.0 # aspect_ratio of bounding box, ncols/ nrows, result floatvector[value] # bounding box of whole pic, independent from content, trivial case def test_aspect_ratio(): #case 1 img = Image((0,0), (8,8), ONEBIT) ratio_f = img.aspect_ratio() assert ratio_f[0] == 1.0 #case 2 img = Image((0,0), (3,5), ONEBIT) ratio_f = img.aspect_ratio() assert abs(ratio_f[0] - 2/3.0) <= eps # must be 0, kinda redundant assert abs(ratio_f[0] - 0.6666666) <= eps #case 3 img = Image((0,0), (3,16), ONEBIT) ratio_f = img.aspect_ratio() assert abs(ratio_f[0] - 0.235294118) <= eps # black_area , returns number of black pixel, result floatvector[value] def test_black_area(): #case 1 img = Image((0,0), (7,7), ONEBIT) img.draw_filled_rect((1,1),(3,5),1) black_area_f = img.black_area() assert black_area_f[0] == 15.0 #case 2 img.draw_line((0,3),(7,3),1) black_area_f = img.black_area() assert black_area_f[0] == 20.0 #case 4 img.set((7,7),1) black_area_f = img.black_area() assert black_area_f[0] == 21.0 #case 5 img.set((3,4),1) black_area_f = img.black_area() assert black_area_f[0] == 21.0 #case 6 # would theoretically alert, if interpolation algorithm changed, # because no trivial diagonals were drawn img = Image((0,0), (7,7), ONEBIT) img.draw_line((1,1),(3,5),1) img.draw_line((4,2),(1,6),1) black_area_f = img.black_area() assert black_area_f[0] == 10.0 # compactness, long lines low-, circle high-compactness, # result floatvector[value] # size of pic has influence, i.e. 1 lonely px in 3x3 pic has different # compactness than 1px in 5x5 pic, empty pic has by definition max # compactness (1,79.. e+308), full pic has compactness=0 def test_compactness(): #case 0 complete filled img = Image((0,0),(7,7), ONEBIT) img.draw_filled_rect((0,0),(7,7),1) comp_f = img.compactness() assert comp_f[0] == 0.5625 #case 1 rect with white border img = Image((0,0), (7,7), ONEBIT) img.draw_filled_rect((1,1),(6,6),1) comp_f = img.compactness() assert abs(comp_f[0] - 0.777777777) <= eps #case 2 one single pixel img = Image((0,0), (7,7), ONEBIT) img.set((1,1),1) comp_f = img.compactness() assert comp_f[0] == 8.0 #case 3 black border img = Image((0,0), (7,7), ONEBIT) img.draw_line((0,0),(7,0),1) img.draw_line((7,0),(7,7),1) img.draw_line((7,7),(0,7),1) img.draw_line((0,7),(0,0),1) comp_f = img.compactness() assert comp_f[0] == 2.0 #case 4 circle img = Image((0,0), (7,7), ONEBIT) img.draw_circle((3,3),3,1) comp_f = img.compactness() assert abs(comp_f[0] - 2.647058823529) <= eps #case 5 horizontal line img = Image((0,0), (7,7), ONEBIT) img.draw_line((2,2),(6,2),1) comp_f = img.compactness() assert abs(comp_f[0] - 3.2) <= eps #case 6 diagonal line img = Image((0,0), (7,7), ONEBIT) img.draw_line((1,2),(2,7),1) comp_f = img.compactness() assert abs(comp_f[0] - 10/3.0) <= eps # moments, result floatvector[X,Y,mom1,mom2,..,mom7] # X,Y center of gravity normalized on 1.0 # position in relation to surrounding bounding box matters def test_moments(): #case 1 img = Image((0,0), (8,8), ONEBIT) img.set((4,1),1) mom_f = img.moments() assert mom_f[0] == 0.5 assert mom_f[1] == 0.125 assert mom_f[2] == 0 # single 1px has no moments assert mom_f[8] == 0 #case 1b central symmetric rect img = Image((0,0), (7,7), ONEBIT) img.draw_filled_rect((2,3),(5,4),1) mom_f = img.moments() assert mom_f[0] == 0.5 assert mom_f[1] == 0.5 assert mom_f[2] == 0.15625 assert mom_f[3] == 0.03125 assert mom_f[4] == 0 assert mom_f[5] == 0 assert mom_f[6] == 0 assert mom_f[7] == 0 assert mom_f[8] == 0 #case 2 #like the Letter L on the left handside img = Image((0,0), (7,7), ONEBIT) img.draw_line((1,2),(1,5),1) img.draw_line((1,5),(3,5), 1) mom_f = img.moments() assert abs(mom_f[0] - 0.21428571) <= eps assert abs(mom_f[1] - 0.57142857) <= eps assert abs(mom_f[2] - 0.09722222) <= eps assert abs(mom_f[3] - 0.22222222) <= eps assert abs(mom_f[4] - 0.08333333) <= eps assert abs(mom_f[5] - 0.03402069) <= eps assert abs(mom_f[6] + 0.01134023) <= eps assert abs(mom_f[7] - 0.02268046) <= eps assert abs(mom_f[8] + 0.06804138) <= eps #case 3 img = Image((0,0), (8,8), ONEBIT) img.draw_line((1,1),(5,4),1) img.draw_circle((5,4),2, 1) mom_f = img.moments() assert abs(mom_f[0] - 0.5294117647058) <= eps assert abs(mom_f[1] - 0.41911764705882) <= eps assert abs(mom_f[2] - 0.142072053734) <= eps assert abs(mom_f[4] - 0.057398738041) <= eps assert abs(mom_f[7] + 0.0240267688551) <= eps # neg. moment # ncols_feature, simply num of cols, result floatvector[value] def test_ncols_feature(): #case 1 img = Image((0,0), (7,7), ONEBIT) ncols_f = img.ncols_feature() assert ncols_f[0] == 8.0 #case 2 img = Image((0,0), (3,8), ONEBIT) ncols_f = img.ncols_feature() assert ncols_f[0] == 4.0 # nholes, num of white runs (not border) avg, result floatvector[X, Y] def test_nholes(): #case 1 img = Image((0,0), (7,7), ONEBIT) img.draw_filled_rect((1,1), (3,5), 1) nholes_f = img.nholes() assert nholes_f[0] == 0.0 #case 2 img = Image((0,0), (7,7), ONEBIT) img.draw_hollow_rect((1,1), (4,5), 1) img.draw_hollow_rect((2,3), (6,7), 1) img.draw_line((3,7),(5,7),0) #white line nholes_f = img.nholes() assert nholes_f[0] == 0.375 # 3 holes per 8 lines assert nholes_f[1] == 0.75 # 6 holes per 8 lines #case 2b // same pic double size to test scale-invariance img = img.scale(2.0,0) nholes_f = img.nholes() assert abs(nholes_f[0] - 0.375) <= eps assert abs(nholes_f[1] - 0.75) <= eps # nholes_extended, divides pic in 4 parts and does nholes analysis on each of it # , result floatvector[X, Y] def test_nholes_extended(): #case 1 img = Image((0,0), (7,7), ONEBIT) img.draw_filled_rect((1,1), (3,5), 1) nholes_ex_f = img.nholes_extended() assert nholes_ex_f[0] == 0.0 #case 2 img = Image((0,0), (7,7), ONEBIT) img.draw_hollow_rect((1,4), (3,6), 1) img.draw_hollow_rect((3,2), (5,5), 1) img.draw_hollow_rect((1,0), (3,2), 1) img.draw_line((1,0),(3,0),0) #white line img.set(Point(3,3),0) #white Point img.set(Point(7,5),1) nholes_ex_f = img.nholes_extended() #vertical assert nholes_ex_f[0] == 0.5 assert nholes_ex_f[1] == 1.5 assert nholes_ex_f[2] == 0.5 assert nholes_ex_f[3] == 0.0 #horizontal assert nholes_ex_f[4] == 0.5 assert nholes_ex_f[5] == 0.0 assert nholes_ex_f[6] == 1.5 assert nholes_ex_f[7] == 0.0 # nrows_feature, simply num of rows, result floatvector[value] def test_nrows_feature(): #case 1 img = Image((0,0), (7,7), ONEBIT) nrows_f = img.nrows_feature() assert nrows_f[0] == 8.0 #case 2 img = Image((0,0), (7,5), ONEBIT) nrows_f = img.nrows_feature() assert nrows_f[0] == 6.0 # skeleton_features, thins out a structure to a skeleton and runs several tests # on it, returns floatvector[numOf 4connected pxs ~ X, numOf 3connectd pxs ~ T, # avgOf bendpoints, numOf endPoints, numOf x-axis crossing pxs, numOf y-axis # crossing pxs] # x- and y-axis through centre of masse def test_skeleton_features(): # capital Letter A with unsteadiness like hand-written img = Image((0,0), (49,49), ONEBIT) img.draw_filled_rect((3,41),(13,45),1) # left base of letter A img.draw_filled_rect((31,42),(42,46),1) # right base of letter A img.draw_line((5,40),(12,40),1) img.draw_filled_rect((6,38),(13,39),1) img.draw_line((7,37),(14,37),1) img.draw_line((8,36),(27,36),1) img.draw_filled_rect((9,34),(28,35),1) img.draw_filled_rect((10,32),(35,33),1) img.draw_line((11,31),(34,31),1) img.draw_line((11,30),(18,30),1) img.draw_line((12,29),(18,29),1) img.draw_line((12,28),(19,28),1) img.draw_line((13,27),(20,27),1) img.draw_filled_rect((14,25),(20,26),1) img.draw_line((15,24),(21,24),1) img.draw_line((16,23),(21,23),1) img.draw_filled_rect((16,21),(22,22),1) img.draw_filled_rect((17,19),(23,20),1) img.draw_filled_rect((18,17),(23,18),1) img.draw_filled_rect((19,13),(29,16),1) img.draw_filled_rect((20,10),(28,12),1) img.draw_filled_rect((21,8),(27,9),1) img.draw_line((21,7),(26,7),1) img.draw_filled_rect((22,5),(26,6),1) img.draw_filled_rect((23,16),(30,17),1) img.draw_filled_rect((25,18),(30,19),1) img.draw_line((25,20),(31,20),1) img.draw_filled_rect((26,21),(31,23),1) img.draw_filled_rect((27,24),(32,27),1) img.draw_filled_rect((28,27),(33,28),1) img.draw_line((27,29),(34,29),1) img.draw_line((24,30),(34,30),1) img.draw_line((29,34),(36,34),1) img.draw_line((30,35),(36,35),1) img.draw_line((31,36),(36,36),1) img.draw_line((31,37),(37,37),1) img.draw_line((32,38),(37,38),1) img.draw_filled_rect((32,39),(38,40),1) img.draw_line((33,41),(40,41),1) skel_f = img.skeleton_features() assert skel_f[0] == 2.0 # num of X-Joins (4 connected pxs) assert skel_f[1] == 10.0 # num of T-Joins (3 connected pxs) ?!?!? assert abs(skel_f[2] - 0.40659340) <= eps # avg of bend points assert skel_f[3] == 4.0 # num of endpoints assert skel_f[4] == 2.0 # num of x-crossings through center assert skel_f[5] == 2.0 # num og y-crossings through center # top_bottom, simply detects the first and last row in which black Pixel appear, # returns floatvector[firstrow/nrows, lastrow/nrows] def test_top_bottom(): #like the Letter L on the left handside img = Image((0,0), (7,7), ONEBIT) img.draw_line((1,2),(1,5),1) img.draw_line((1,5),(3,5), 1) top_bottom_f = img.top_bottom() assert top_bottom_f[0] == 0.25 assert top_bottom_f[1] == 0.625 # volume, numOf black pxs (black_area) / (ncols*nrows) (~bounding box), returns # floatvector[value] def test_volume(): #like the Letter L on the left handside img = Image((0,0), (7,7), ONEBIT) img.draw_line((1,2),(1,5),1) img.draw_line((1,5),(3,5), 1) vol_f = img.volume() assert vol_f[0] == 0.09375 # volume16regions, divides the pic in 16 regions and calculate the volume of each # region seperatly (black_area/(region.cols*region.rows), returnsfloatvector[ # first column from top to bottom, 2nd column ... ] def test_volume_16_regions(): img = Image((0,0),(7,7), ONEBIT) img.draw_hollow_rect((1,1),(6,4),1) img.draw_hollow_rect((2,4),(7,7),1) vol16_f = img.volume16regions() assert vol16_f[0] == 0.25 assert vol16_f[1] == 0.5 assert vol16_f[2] == 0.25 assert vol16_f[3] == 0 assert vol16_f[4] == 0.5 assert vol16_f[5] == 0 assert vol16_f[6] == 0.75 assert vol16_f[7] == 0.75 assert vol16_f[8] == 0.5 assert vol16_f[9] == 0 assert vol16_f[10] == 0.5 assert vol16_f[11] == 0.5 assert vol16_f[12] == 0.25 assert vol16_f[13] == 0.5 assert vol16_f[14] == 0.75 assert vol16_f[15] == 0.75 img = Image((0,0),(0,0),ONEBIT) img.set((0,0),1) vol16_f = img.volume16regions() for i in range(15): assert vol16_f[i] == 1.0 # volume64regions, divides the pic in 64 regions and calculate the volume of each # region seperatly (black_area/(region.cols*region.rows), returnsfloatvector[ # first column from top to bottom, 2nd column ... ] def test_volume_64_regions(): img = Image((0,0),(15,15),ONEBIT) img.draw_hollow_rect((0,0),(15,15),1) img.draw_filled_rect((7,7),(8,8),1) vol64_f = img.volume64regions() assert vol64_f[0] == 0.75 #ul-region assert vol64_f[1] == 0.5 #1st col, 2nd row assert vol64_f[7] == 0.75 #ll-region assert vol64_f[8] == 0.5 #2nd column, 1st row assert vol64_f[9] == 0 #2nd column, 2nd row assert vol64_f[27] == 0.25 #ul-region from center assert vol64_f[63] == 0.75 #lr-region img = Image((0,0),(0,0),ONEBIT) img.set((0,0),1) vol64_f = img.volume64regions() for i in range(63): assert vol64_f[i] == 1.0 # zernike_moments, more complex feature extraction, the shape of the origin # can be reconstructed outta the first few ZMs. The higher order moments # describe the shape even better up to the perfect copy for order n to # infinity. # returnsfloatvector[magnitudes of NZM20, NZM22, ... , NZM66] def test_zernike_moments(): #big capital-L img = Image((0,0),(50,50),ONEBIT) img.draw_line((5,5),(5,35),3) img.draw_line((3,35),(20,35),1) ZM_f = img.zernike_moments() assert abs(ZM_f[0] - 0.4303043) <= eps assert abs(ZM_f[1] - 0.2670617) <= eps assert abs(ZM_f[2] - 0.8271535) <= eps assert abs(ZM_f[3] - 0.3560822) <= eps assert abs(ZM_f[4] - 3.3580666) <= eps assert abs(ZM_f[5] - 1.3283614) <= eps assert abs(ZM_f[6] - 0.4451028) <= eps assert abs(ZM_f[7] - 3.3781997) <= eps assert abs(ZM_f[8] - 1.9473371) <= eps assert abs(ZM_f[9] - 0.5341234) <= eps assert abs(ZM_f[10] - 4.8711029) <= eps assert abs(ZM_f[11] - 5.6105727) <= eps assert abs(ZM_f[12] - 2.6840807) <= eps assert abs(ZM_f[13] - 0.6231440) <= eps # test rotation-invariance img = img.rotate(90.0, 1) ZM_f = img.zernike_moments() assert abs(ZM_f[0] - 0.4303043) <= eps assert abs(ZM_f[1] - 0.2670617) <= eps assert abs(ZM_f[2] - 0.8271535) <= eps assert abs(ZM_f[3] - 0.3560822) <= eps assert abs(ZM_f[4] - 3.3580666) <= eps assert abs(ZM_f[5] - 1.3283614) <= eps assert abs(ZM_f[6] - 0.4451028) <= eps assert abs(ZM_f[7] - 3.3781997) <= eps assert abs(ZM_f[8] - 1.9473371) <= eps assert abs(ZM_f[9] - 0.5341234) <= eps assert abs(ZM_f[10] - 4.8711029) <= eps assert abs(ZM_f[11] - 5.6105727) <= eps assert abs(ZM_f[12] - 2.6840807) <= eps assert abs(ZM_f[13] - 0.6231440) <= eps # test mirror-invariance img.mirror_horizontal() ZM_f = img.zernike_moments() assert abs(ZM_f[0] - 0.4303043) <= eps assert abs(ZM_f[1] - 0.2670617) <= eps assert abs(ZM_f[2] - 0.8271535) <= eps assert abs(ZM_f[3] - 0.3560822) <= eps assert abs(ZM_f[4] - 3.3580666) <= eps assert abs(ZM_f[5] - 1.3283614) <= eps assert abs(ZM_f[6] - 0.4451028) <= eps assert abs(ZM_f[7] - 3.3781997) <= eps assert abs(ZM_f[8] - 1.9473371) <= eps assert abs(ZM_f[9] - 0.5341234) <= eps assert abs(ZM_f[10] - 4.8711029) <= eps assert abs(ZM_f[11] - 5.6105727) <= eps assert abs(ZM_f[12] - 2.6840807) <= eps assert abs(ZM_f[13] - 0.6231440) <= eps # test scale-invariance img = img.scale(2.0, 1) ZM_f = img.zernike_moments() assert abs(ZM_f[0] - 0.4303043) <= abs(ZM_f[0] * 0.01) # 1% error assert abs(ZM_f[1] - 0.2670617) <= abs(ZM_f[1] * 0.01) assert abs(ZM_f[2] - 0.8271535) <= abs(ZM_f[2] * 0.01) assert abs(ZM_f[3] - 0.3560822) <= abs(ZM_f[3] * 0.01) assert abs(ZM_f[4] - 3.3580666) <= abs(ZM_f[4] * 0.01) assert abs(ZM_f[5] - 1.3283614) <= abs(ZM_f[5] * 0.01) assert abs(ZM_f[6] - 0.4451028) <= abs(ZM_f[6] * 0.01) assert abs(ZM_f[7] - 3.3781997) <= abs(ZM_f[7] * 0.01) assert abs(ZM_f[8] - 1.9473371) <= abs(ZM_f[8] * 0.01) assert abs(ZM_f[9] - 0.5341234) <= abs(ZM_f[9] * 0.01) assert abs(ZM_f[10] - 4.8711029) <= abs(ZM_f[10] * 0.01) assert abs(ZM_f[11] - 5.6105727) <= abs(ZM_f[11] * 0.01) assert abs(ZM_f[12] - 2.6840807) <= abs(ZM_f[12] * 0.01) assert abs(ZM_f[13] - 0.6231440) <= abs(ZM_f[13] * 0.01) gamera-3.3.3/tests/test_floatpoint.py0000644000076500000000000000076010714675716016715 0ustar chriswheelfrom gamera.gameracore import FloatPoint as FP from math import sqrt def test_floatpoint(): p = FP(2, 3) assert p.x == 2.0 and p.y == 3.0 assert FP(2, 2) + FP(1, 2) == FP(3, 4) assert FP(2, 2) * FP(2, 3) == FP(4, 6) assert FP(2, 2) - FP(2, 4) == FP(0, -2) assert FP(2, 2) / FP(2, 3) == FP(1, 2.0/3.0) assert FP(0, 0).distance(FP(-3, -3)) == sqrt(18) assert repr(FP(2, 3)) == "FloatPoint(2, 3)" def test_floatpoint_leak(): for i in xrange(1000): p = FP(i, i) gamera-3.3.3/tests/test_graph.py0000644000076500000000000007527011570133370015631 0ustar chriswheel#!/usr/bin/env python import sys, gc, os from gamera.core import * init_gamera() import gamera.graph import gamera.graph_util #gc.set_debug(gc.DEBUG_LEAK) flags = [ gamera.graph.DIRECTED, gamera.graph.CYCLIC, #undirected gamera.graph.BLOB, #not tree gamera.graph.MULTI_CONNECTED, gamera.graph.SELF_CONNECTED, gamera.graph.FREE, #all flags set gamera.graph.TREE, #undirected, acyclic, single-connected, not-self-connected gamera.graph.FLAG_DAG, #directed, acyclic gamera.graph.UNDIRECTED #undirected, cyclic ] # ----------------------------------------------------------------------------- # tests for small graphs only # ----------------------------------------------------------------------------- # ------------------------------------------------------------------------------ def _test_flags(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) correct_flags = { gamera.graph.DIRECTED: [gamera.graph.DIRECTED], gamera.graph.CYCLIC: [gamera.graph.CYCLIC], #undirected gamera.graph.BLOB: [gamera.graph.BLOB], #not tree gamera.graph.MULTI_CONNECTED: [], gamera.graph.SELF_CONNECTED: [], gamera.graph.FREE: [gamera.graph.DIRECTED, gamera.graph.CYCLIC, gamera.graph.BLOB, gamera.graph.MULTI_CONNECTED, gamera.graph.SELF_CONNECTED], #all flags set gamera.graph.TREE: [gamera.graph.TREE], #undirected, acyclic, single-connected, not-self-connected gamera.graph.FLAG_DAG: [gamera.graph.DIRECTED, gamera.graph.BLOB, gamera.graph.FLAG_DAG], #directed, acyclic gamera.graph.UNDIRECTED: [gamera.graph.BLOB, gamera.graph.CYCLIC, gamera.graph.UNDIRECTED] #undirected, cyclic } if flag in [gamera.graph.DIRECTED, gamera.graph.FLAG_DAG, gamera.graph.FREE]: assert g.is_directed() else: assert g.is_undirected() if correct_flags.has_key(flag):# and f not in ignore_flags: for f in correct_flags[flag] : assert g.has_flag(f) # ------------------------------------------------------------------------------ def _test_remove_difference(flag = gamera.graph.FREE): result = { gamera.graph.FREE: [2,3,1,2,2,3,0,2], gamera.graph.DIRECTED: [2,3,1,2,2,3,0,2], gamera.graph.CYCLIC: [2,3,1,2,2,3,0,2], #undirected gamera.graph.BLOB: [2,3,1,2,2,3,0,2],#not tree gamera.graph.MULTI_CONNECTED: [2,3,1,2,2,3,0,2], gamera.graph.SELF_CONNECTED: [2,3,1,2,2,3,0,2], gamera.graph.FREE: [2,3,1,2,2,3,0,2], #all flags set gamera.graph.TREE: [2,3,1,2,2,3,0,2], #undirected, acyclic, single-connected, not-self-conn gamera.graph.FLAG_DAG: [2,3,1,2,2,3,0,2], #directed, acyclic gamera.graph.UNDIRECTED: [2,3,1,2,2,3,0,2]#undirected, cyclic } g = gamera.graph.Graph() g.add_edge(1,2) g.add_edge(2,3) assert g.nedges == result[flag][0] assert g.nnodes == result[flag][1] g.remove_node(2) assert g.nedges == result[flag][2] assert g.nnodes == result[flag][3] assert "%s" % list(g.get_edges()) == "[]" del g g = gamera.graph.Graph() g.add_edge(1,2) g.add_edge(2,3) assert g.nedges == result[flag][4] assert g.nnodes == result[flag][5] g.remove_node_and_edges(2) assert g.nedges == result[flag][6] assert g.nnodes == result[flag][7] del g # ------------------------------------------------------------------------------ def _test_colorize(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) for i in range(7): for j in range(7): g.add_edge(i,j) try: g.colorize(6) assert False except: assert True del g g = gamera.graph.Graph(flag) for i in range(7): g.add_edge(i, i+1) g.colorize(6) colorcount = [0] * 6 for i in range(7): colorcount[g.get_color(i)] += 1 for i in range(6): assert colorcount[i] > 0 and colorcount[i] < 3 del g # ------------------------------------------------------------------------------ def _test_bfs(flag = gamera.graph.FREE): correct_bfs = {} a = [1,19,5,4,2,6,3,7] b = [1,5,2,6,3,7] correct_bfs = { gamera.graph.UNDIRECTED: a, gamera.graph.DIRECTED: b, gamera.graph.CYCLIC: a, gamera.graph.BLOB: a, gamera.graph.MULTI_CONNECTED: a, gamera.graph.SELF_CONNECTED: a, gamera.graph.FREE: b, gamera.graph.TREE: a, gamera.graph.FLAG_DAG: b } result_bfs = [] g = gamera.graph.Graph(flag) g.add_edge(4,19) g.add_edge(19,1) g.add_edge(1,5) g.add_edge(5,2) g.add_edge(5,6) g.add_edge(2,6) g.add_edge(6,3) g.add_edge(2,3) g.add_edge(7,3) g.add_edge(3,7) # gamera.graph_util.graphviz_output(g, "graph_bfs_%d.viz" % flag) for n in g.BFS(1): result_bfs.append(n()) assert correct_bfs[flag] == result_bfs del g # ------------------------------------------------------------------------------ def _test_dfs(flag = gamera.graph.FREE): a = [1001,1005,1006,1003,1007,1002,10019,1004] b = [1001,1005,1006,1003,1007,1002] correct_dfs = { gamera.graph.UNDIRECTED: a, gamera.graph.DIRECTED: b, gamera.graph.CYCLIC: a, gamera.graph.BLOB: a, gamera.graph.MULTI_CONNECTED: a, gamera.graph.SELF_CONNECTED: a, gamera.graph.FREE: b, gamera.graph.TREE: a, gamera.graph.FLAG_DAG: b, } result_dfs = [] g = gamera.graph.Graph(flag) g.add_edge(1004,10019) g.add_edge(10019,1001) g.add_edge(1001,1005) g.add_edge(1005,1002) g.add_edge(1005,1006) g.add_edge(1002,1006) g.add_edge(1006,1003) g.add_edge(1002,1003) g.add_edge(1007,1003) g.add_edge(1003,1007) for n in g.DFS(1001): #print n result_dfs.append(n()) if correct_dfs.has_key(flag): assert correct_dfs[flag] == result_dfs del g # ------------------------------------------------------------------------------ def _test_dijkstra(flag = gamera.graph.FREE): #TODO more correct_paths g = gamera.graph.Graph(flag) correct_paths = { gamera.graph.FREE: {8: {8: (0.0, [8]), 1: (7.0, [1, 8]), 2: (15.0, [2, 7, 1, 8]), 6: (6.0, [6, 8]), 7: (12.0, [7, 1, 8])}, 1: {8: (7.0, [8, 7, 1]), 1: (0.0, [1]), 2: (8.0, [2, 7, 1]), 6: (9.0, [6, 2, 7, 1]), 7: (5.0, [7, 1])}, 2: {8: (4.0, [8, 7, 2]), 1: (11.0, [1, 8, 7, 2]), 2: (0.0, [2]), 6: (1.0, [6, 2]), 7: (2.0, [7, 2])}, 6: {8: (4.0, [8, 6]), 1: (11.0, [1, 8, 6]), 2: (19.0, [2, 7, 1, 8, 6]), 6: (0.0, [6]), 7: (16.0, [7, 1, 8, 6])}, 7: {8: (2.0, [8, 7]), 1: (9.0, [1, 8, 7]), 2: (3.0, [2, 7]), 6: (4.0, [6, 2, 7]), 7: (0.0, [7])}} } g.add_edges([ (1,2,10,True), (1,7,5,True), (2,6,1,True), (2,7,2,True), (6,8,4,True), (7,8,2,True), (7,2,3,True), (7,6,9,True), (8,1,7,True), (8,6,6,True) ]) assert g.nedges == 10 p = g.dijkstra_shortest_path(2) print {flag: p} if correct_paths.has_key(flag): assert p == correct_paths[flag][2] del p del g # ------------------------------------------------------------------------------ def _test_dijkstra_all_pairs(flag = gamera.graph.FREE): #TODO more correct_paths g = gamera.graph.Graph(flag) correct_paths = { gamera.graph.FREE: {8: {8: (0.0, [8]), 1: (7.0, [1, 8]), 2: (15.0, [2, 7, 1, 8]), 6: (6.0, [6, 8]), 7: (12.0, [7, 1, 8])}, 1: {8: (7.0, [8, 7, 1]), 1: (0.0, [1]), 2: (8.0, [2, 7, 1]), 6: (9.0, [6, 2, 7, 1]), 7: (5.0, [7, 1])}, 2: {8: (4.0, [8, 7, 2]), 1: (11.0, [1, 8, 7, 2]), 2: (0.0, [2]), 6: (1.0, [6, 2]), 7: (2.0, [7, 2])}, 6: {8: (4.0, [8, 6]), 1: (11.0, [1, 8, 6]), 2: (19.0, [2, 7, 1, 8, 6]), 6: (0.0, [6]), 7: (16.0, [7, 1, 8, 6])}, 7: {8: (2.0, [8, 7]), 1: (9.0, [1, 8, 7]), 2: (3.0, [2, 7]), 6: (4.0, [6, 2, 7]), 7: (0.0, [7])}} } g.add_edges([ (1,2,10,True), (1,7,5,True), (2,6,1,True), (2,7,2,True), (6,8,4,True), (7,8,2,True), (7,2,3,True), (7,6,9,True), (8,1,7,True), (8,6,6,True) ]) assert g.nedges == 10 p = g.all_pairs_shortest_path() if correct_paths.has_key(flag): assert p == correct_paths[flag] del p del g #------------------------------------------------------------------------------ def _test_subgraph_roots(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag); g.add_node(2) g.add_node(3) assert len(list(g.get_subgraph_roots())) == 2 g.add_edges([(2,4), (5,7), (1,3), (8,9), (1,2), (5,6), (2,2)]) g.add_node(10) tofind = [True, True, True, True] found = [False, False, False, False] i = 0 if g.is_directed(): for root in g.get_subgraph_roots(): value = root() if(value == 1): found[0] = True elif(value == 5): found[1] = True elif(value == 8): found[2] = True elif(value == 10): found[3] = True i += 1 else: for root in g.get_subgraph_roots(): value = root() if(value <= 4): found[0] = True elif(value <= 7): found[1] = True elif(value <= 9): found[2] = True elif(value <=10): found[3] = True i += 1 assert found == tofind assert i == 4 del g # ------------------------------------------------------------------------------ def _test_add_node(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) count_before = g.nnodes was_existing = g.has_node(43) assert g.add_node(43) == True assert (was_existing and g.nnodes == count_before) or \ (not was_existing and g.nnodes == count_before + 1) assert g.add_node(43) == False del g # ------------------------------------------------------------------------------ def _test_fully_connected(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) g.add_node(9) g.add_node(10) g.add_node(11) g.add_node(12) assert g.is_fully_connected() == False g.add_edge(9,10) g.add_edge(11,12) assert g.is_fully_connected() == False g.add_edge(10,11) print list(g.get_edges()) print list(g.get_nodes()) assert g.is_fully_connected() == True del g # ------------------------------------------------------------------------------ def _test_is_cyclic(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) assert g.is_cyclic() == False g.add_node(1) assert g.is_cyclic() == False g.add_edge(1,2) g.add_edge(2,3) assert g.is_cyclic() == False g.add_edge(3,1) assert g.is_cyclic() == True del g # ------------------------------------------------------------------------------ def _test_is_multi_connected(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) g.add_nodes([1,2,3]) g.add_edge(1,2) g.add_edge(1,2) assert g.is_multi_connected() del g g = gamera.graph.Graph(flag) if g.is_undirected(): g.add_edge(1,2) g.add_edge(2,1) assert g.is_multi_connected() del g g = gamera.graph.Graph(flag) g.add_nodes([1,2,3]) g.add_edge(1,2) assert not g.is_multi_connected() del g # ------------------------------------------------------------------------------ def _test_is_self_connected(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) g.add_node([1,2,3]) g.add_edge(1,2) assert not g.is_self_connected() g.add_edge(1,1) assert g.is_self_connected() del g # ------------------------------------------------------------------------------ def _test_make_singly_connected(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) g.add_nodes([1,2,3,4,5,6,7,8]) g.add_edges([(1,2),(1,2),(3,4),(4,5),(4,5),(5,6)]) assert g.is_multi_connected() g.make_singly_connected() assert not g.is_multi_connected() assert g.nedges == 4 del g # ------------------------------------------------------------------------------ def _test_make_not_self_connected(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) g.add_nodes([1,2,3,4,5,6,7,8]) g.add_edges([(1,1),(1,2),(2,3),(2,2),(3,4),(4,5),(5,5)]) assert g.is_self_connected() g.make_not_self_connected() assert not g.is_self_connected() assert g.nedges == 4 # ------------------------------------------------------------------------------ def _test_make_acyclic(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) g.make_cyclic() g.add_edge(1,2,1,True) g.add_edge(2,3,1,True) g.add_edge(3,4,1,True) g.add_edge(4,5,1,True) g.add_edge(4,2,1,True) assert g.is_cyclic() assert g.nedges == 5 g.make_acyclic() assert g.nedges == 4 assert not g.is_cyclic() del g # ------------------------------------------------------------------------------ def _test_make_tree(flag = gamera.graph.FREE): a = "[, , , ]" b = "[, , , ]" correct = { gamera.graph.UNDIRECTED: a, gamera.graph.DIRECTED: b, gamera.graph.CYCLIC: a, gamera.graph.BLOB: a, gamera.graph.MULTI_CONNECTED: a, gamera.graph.SELF_CONNECTED: a, gamera.graph.FREE: b, gamera.graph.TREE: a, gamera.graph.FLAG_DAG: b, } g = gamera.graph.Graph(flag) g.add_edges([ (1,2,10,True), (1,7,5,True), (2,6,1,True), (2,7,2,True), (6,8,4,True), (7,8,2,True), (7,2,3,True), (7,6,9,True), (8,1,7,True), (8,6,6,True) ]) g.make_tree() if correct.has_key(flag): assert correct[flag] == "%s" % list(g.get_edges()) del g # ------------------------------------------------------------------------------ def _test_check_insert_restrictions(flag = None): results = { gamera.graph.UNDIRECTED: [3, [(1,2),(2,3),(3,1)], []], gamera.graph.DIRECTED: [2, [(1,2),(2,3)], []], gamera.graph.CYCLIC: [3, [(1,2),(2,3),(3,1)], []], gamera.graph.BLOB: [3, [(1,2),(2,3)], []], gamera.graph.MULTI_CONNECTED: [None, None, []], gamera.graph.SELF_CONNECTED: [None, None, None], gamera.graph.FREE: [3, [(1,2),(2,3),(3,1)], [(3,3)]], gamera.graph.TREE: [2, [(1,2),(2,3)], []], gamera.graph.FLAG_DAG: [2, [(1,2),(2,3)], []] } g = gamera.graph.Graph(flag | gamera.graph.CHECK_ON_INSERT) g.add_nodes([1,2,3,4,5,6,7,8,9]) #tests acyclic restriction g.add_edge(1,2) print g.nedges g.add_edge(2,3) print g.nedges g.add_edge(3,1) print g.nedges if results.has_key(flag) and results[flag][1] != None: # assert g.nedges == results[flag][0] result = [(e.from_node(), e.to_node()) for e in list(g.get_edges())] result.sort() correct = results[flag][1] correct.sort() assert result == correct del g #tests self-connected restriction g = gamera.graph.Graph(flag | gamera.graph.CHECK_ON_INSERT) g.add_nodes([1,2,3,4,5,6,7,8,9]) g.add_edge(3,3) if results.has_key(flag) and results[flag][2] != None: result = [(e.from_node(), e.to_node()) for e in g.get_edges()] result.sort() correct = results[flag][2] correct.sort() assert result == correct #tests multi-connected restriction #TODO # ------------------------------------------------------------------------------ def _test_minimum_spanning_tree(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) print g.add_edges([ (9,10,4), (9,16,8), (10,16,11), (10,11,8), (11,17,2), (11,14,4), (11,12,7), (12,13,9), (12,14,14), (13,14,10), (14,15,2), (15,17,6), (15,16,1), (16,17,7)] ) assert g.nedges == 14 try: # gamera.graph_util.graphviz_output(g, "mst_before_%d.viz" % flag) t = g.create_minimum_spanning_tree() # gamera.graph_util.graphviz_output(t, "mst_after_%d.viz" % flag) assert t.nnodes == 9 assert t.nedges == 8 assert "[, , , , , , , ]" == str(list(t.get_edges())) del t except TypeError: assert g.is_directed() del g # ------------------------------------------------------------------------------ def _test_spanning_tree(flag = gamera.graph.FREE): g = gamera.graph.Graph(flag) print g.add_edges([ (9,10,4), (9,16,8), (10,16,11), (10,11,8), (11,17,2), (11,14,4), (11,12,7), (12,13,9), (12,14,14), (13,14,10), (14,15,2), (15,17,6), (15,16,1), (16,17,7)] ) assert g.nedges == 14 bfsnodes = [n() for n in g.BFS(11)] bfsnodes.sort() t = g.create_spanning_tree(11) treenodes = [n() for n in t.get_nodes()] treenodes.sort() assert treenodes == bfsnodes del t del g # ----------------------------------------------------------------------------- # tests for larger graphs # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- def _test_add_nodes(flag = gamera.graph.FREE, count = 2000): g = gamera.graph.Graph(flag) for i in range(1000,1000+count): assert g.has_node(i) == False for i in range(1000,1000+count): g.add_node(i) assert g.nnodes == i+1-1000 assert g.has_node(i) == True assert g.get_node(i)() == i assert g.has_node(1000+count/2) == True assert g.get_node(1000+count/2)() == 1000+count/2 for i in range(1000,1000+count): print i assert g.has_node(i) == True assert g.get_node(i)() == i try: g.get_node(1000 + 2*count) assert False except ValueError: pass del g # ---------------------------------------------------------------------------- def _test_graph_copy(flag = gamera.graph.FREE, count = 1000): if count > 100: g = gamera.graph.Graph(flag) for i in range(0,count): g.add_edge(i, i+1) g.add_edge(count / 2, count / 2 + 20) assert g.nedges == count+1 assert g.is_cyclic() h = g.copy(gamera.graph.CHECK_ON_INSERT) del g assert h.is_acyclic() assert h.nedges == count del h # ------------------------------------------------------------------------------ def _test_remove_nodes(flag = gamera.graph.FREE, count = 250): g = gamera.graph.Graph(flag) g.add_nodes(range(0,count)) assert g.nnodes == count for i in range(0, count): g.remove_node(i) assert g.nnodes == count - i - 1 for i in range(0,count): assert not g.has_node(i) assert g.nnodes == 0 del g # ------------------------------------------------------------------------------ def _test_remove_node_and_edges(flag = gamera.graph.FREE, count = 250): g = gamera.graph.Graph(flag) for i in range(0,count): g.add_edge(i,i+1) g.add_edge(count, 0) assert g.nedges == count+1 assert g.nnodes == count+1 for i in range(0,count): g.remove_node_and_edges(i) assert g.nedges == count-i-1 assert g.nnodes == 1 #only count assert g.nedges == 0 assert [x() for x in g.get_nodes()] == [count] del g g = gamera.graph.Graph(flag) for i in range(0,count): g.add_edge(i,i+1) assert g.nedges == count assert g.nnodes == count+1 for i in range(1,count): g.remove_node(i) assert g.nedges == count-i assert g.nnodes == 2 print list(g.get_edges()) assert g.nedges == 1 g.remove_node(0) assert g.nedges == 0 assert g.nnodes == 1 #only count assert [x() for x in g.get_nodes()] == [count] del g # ------------------------------------------------------------------------------ def _test_remove_all_edges(flag = gamera.graph.FREE, count = 250): g = gamera.graph.Graph(flag) for i in range(0,count): g.add_edge(i,i+1) g.add_edge(count, 0) assert g.nedges == count+1 assert g.nnodes == count+1 g.remove_all_edges() assert g.nedges == 0 assert g.nnodes == count+1 del g # ------------------------------------------------------------------------------ def _test_remove_node2(flag = gamera.graph.FREE, count = 250): g = gamera.graph.Graph() for i in range(0,count): g.add_edge(i,i+1) g.add_edge(count,0) assert g.nedges == count+1 assert g.nnodes == count+1 for i in range(0,count-1): g.remove_node(i) assert g.nedges == count-i g.remove_node(count-1) assert g.nedges == 0 assert g.nnodes == 1 #only count assert g.nedges == 0 assert [x() for x in g.get_nodes()] == [count] del g # ------------------------------------------------------------------------------ def _test_add_nodes_sequence(flag = gamera.graph.FREE, count = 2000): g = gamera.graph.Graph(flag) for i in range(1000,1000+count): assert g.has_node(i) == False g.add_nodes(list(range(1000,1000+count))) assert g.has_node(1000+count/2) == True assert g.get_node(1000+count/2)() == 1000+count/2 for i in range(1000,1000+count): assert g.has_node(i) == True assert g.get_node(i)() == i assert g.nnodes == count assert g.has_node(500) == False del g # ------------------------------------------------------------------------------ def _test_has_edge(flag = gamera.graph.FREE, count = 250): g = gamera.graph.Graph(flag) for i in range(0,count): g.add_edge(i,i+1) for i in range(0,count): assert g.has_edge(i,i+1) for e in g.get_edges(): assert g.has_edge(e) assert g.has_edge(e.from_node, e.to_node) assert g.has_edge(e.from_node(), e.to_node()) assert g.nedges == count assert g.nnodes == count+1 for i in range(0,count): g.remove_node(i) assert g.nnodes == 1 #only count assert g.nedges == 0 assert [x() for x in g.get_nodes()] == [count] del g # ------------------------------------------------------------------------------ def _test_remove_edge(flag = gamera.graph.FREE, count = 250): g = gamera.graph.Graph(flag) for i in range(0,count): g.add_edge(i,i+1) for i in range(0,count): assert g.has_edge(i,i+1) edgecount = g.nedges for e in list(g.get_edges()): from_node, to_node = e.from_node, e.to_node g.remove_edge(from_node, to_node) assert not g.has_edge(from_node(), to_node()) edgecount -= 1 assert edgecount == g.nedges assert g.nedges == 0 assert g.nnodes == count+1 assert [x() for x in g.get_nodes()] == range(0,count+1) try: g.remove_edge(5*count, 6*count) assert False except RuntimeError: pass del g g = gamera.graph.Graph() for i in range(0,count): g.add_edge(i,i+1) for i in range(0,count): assert g.has_edge(i,i+1) g.remove_all_edges() for i in range(0,count): assert not g.has_edge(i,i+1) print g.nedges print list(g.get_edges()) assert g.nedges == 0 assert g.nnodes == count+1 assert [x() for x in g.get_nodes()] == range(0,count+1) del g # ------------------------------------------------------------------------------ allocs = {"in_graph": 0, "add_edge_1": 0, "add_edge_2": 0, "check": 0} deallocs = {"in_graph": 0, "add_edge_1": 0, "add_edge_2": 0, "check": 0} objects = [] def _test_userdefined_class(flag = gamera.graph.FREE, count = 4096): class Test: def __init__(self, a, b="in_graph"): global objects global allocs objects.append(self) allocs[b] += 1 self.a = a self.b = b def __cmp__(self, other): return cmp(self.a, other.a) def __eq__(self, other): return self.a == other.a def __lt__(self, other): return self.a < other.a def __repr__(self): return "Test(%s, %s)" % (self.a, self.b) def __del__(self): # global deallocs # deallocs[self.b] += 1 pass g = gamera.graph.Graph(gamera.graph.UNDIRECTED) g.add_node(Test(0)) for i in range(0, count): g.add_node(Test(i+1)) g.add_edge(Test(i, "add_edge_1"),Test(i+1, "add_edge_2")) for node in g.get_nodes(): o = node() for i in range(0, count): assert Test(i) == g.get_node(Test(i))() for e in g.get_edges(): assert e.from_node().a == e.to_node().a-1 print "Edge %s %s \n" % (e.from_node(), e.to_node()) allocs = {"in_graph": 0, "add_edge_1": 0, "add_edge_2": 0, "check": 0} deallocs = {"in_graph": 0, "add_edge_1": 0, "add_edge_2": 0, "check": 0} objects = [] del g # ------------------------------------------------------------------------------ def _test_large_graph(flag = gamera.graph.FREE, count = 20000): gc.collect() print "memlarge: %s" % memory_usage() g = gamera.graph.Graph(flag) g.add_node(0) for i in range(0, count): g.add_node(i+1) g.add_edge(i,i+1) for i in range(0, count): assert g.has_node(i) == True assert g.has_edge(i,i+1) == True assert g.get_node(i)() == i assert g.nnodes == count + 1 g.remove_edge(count/2, count/2+1) del g gc.collect() print "memlarge_after: %s" % memory_usage() # ------------------------------------------------------------------------------ def memory_usage(): cmd = "ps u -p %i | awk '{sum=sum+$6}; END {print sum}'" % os.getpid() p = os.popen(cmd, "r") memory = p.readline().strip() p.close() return memory # ------------------------------------------------------------------------------ def refcount(): count = 0 print len(gc.get_objects()) for obj in gc.get_objects(): count += sys.getrefcount(obj) return count # ------------------------------------------------------------------------------ def _test_memory(flag = gamera.graph.FREE, count = 100): new_usage = None old_usage = new_usage for i in range(0,5): old_usage=new_usage _test_large_graph(flag) gc.collect() new_usage = (memory_usage(), refcount()) print old_usage, new_usage assert old_usage == new_usage or old_usage == None or i < 2 print "memory: %s | refcount: %d" % (memory_usage(), refcount()) new_usage = None for i in range(0,count): old_usage = new_usage g = gamera.graph.Graph(flag) g.add_node(200003+i) g.add_node(300003+i) g.add_edge(200003+i,300003+i) b = g.get_node(200003+i) assert g.has_node(200003+i) == True assert g.has_edge(200003+i, 300003+i) del g g = None gc.collect() new_usage = (memory_usage(), refcount()) print old_usage,new_usage assert old_usage == new_usage or old_usage == None or i < 2 tests_small = [ _test_flags, _test_remove_difference, _test_bfs, _test_dfs, _test_dijkstra, _test_dijkstra_all_pairs, _test_subgraph_roots, _test_add_node, _test_fully_connected, _test_is_cyclic, _test_is_multi_connected, _test_is_self_connected, _test_make_singly_connected, _test_make_not_self_connected, _test_make_acyclic, _test_make_tree, _test_check_insert_restrictions, _test_minimum_spanning_tree, _test_spanning_tree, _test_colorize ] tests_large = [ _test_add_nodes, _test_graph_copy, _test_remove_nodes, _test_remove_node_and_edges, _test_remove_node2, _test_remove_all_edges, _test_add_nodes_sequence, _test_has_edge, _test_remove_edge, _test_userdefined_class, _test_large_graph ] # _test_memory #tests = [_test_dijkstra] # ------------------------------------------------------------------------------ def _test_memory_all(): for test in tests:#lag in flags: for flag in flags:#test in tests: # try: print >>sys.stderr, flag, test new_usage = None for i in range(0,10): old_usage = new_usage test(flag) gc.collect() new_usage = (memory_usage(), refcount()) # print >>sys.stderr, (old_usage, new_usage) if old_usage != None: if not ( (old_usage[1] == new_usage[1] \ and (int(new_usage[0])-int(old_usage[0]) < 2 )) \ or i < 4): print >>sys.stderr, (old_usage, new_usage) ''' except AssertionError: print >>sys.stderr, "%s failed !!!" %test info = sys.exc_info() exc_type = info[0] exc_value = info[1] exc_traceback = info[2] trace = traceback.extract_tb(sys.exc_traceback) print >>sys.stderr, "Exception Type: ", exc_type print >>sys.stderr, "Error Message: ", exc_value print >>sys.stderr, "File name: ", trace[0][0] print >>sys.stderr, "Error message: ", trace[0][1] print >>sys.stderr, "Line: ", trace[0][2] print >>sys.stderr, "Function: ", trace[0][3] ''' # ------------------------------------------------------------------------------ #prepare py.test class TestGraph: pass def _make_test(t, flag): def _t(self): return t(flag) return _t def _make_test_size(t, flag, size): def _t(self): return t(flag, size) return _t #small tests for test in tests_small: for flag in flags: setattr(TestGraph, "test_small_%d_%s" % (flag, test.__name__ ), _make_test(test,flag)) #large default #for test in tests_large: # for flag in flags: # setattr(TestGraph, "test_large_default_%d_%s" % (flag, test.__name__ ), _make_test(test,flag)) #large non-default for size in [512]: for test in tests_large: for flag in flags: setattr(TestGraph, "test_large_%d_%d_%s" % (flag, size, test.__name__ ), _make_test_size(test, flag, size)) if __name__ == "__main__": t = TestGraph() for m in dir(t): if m.startswith("test_"): print m test = getattr(t, m) print test try: test() except AssertionError: pass #est(TestGraph) _test_memory_all() # ------------------------------------------------------------------------------ def test_textline_reading_order(): from gamera.plugins.pagesegmentation import textline_reading_order correct_orders = {"data/reading_order_2.png": [(42, 40, 1462, 114), (42, 158, 683, 232), (42, 276, 683, 350), (42, 418, 683, 492), (42, 560, 683, 633), (822, 158, 1462, 633), (42, 701, 1462, 775), (42, 843, 494, 917), (562, 843, 1132, 917), (42, 985, 683, 1059), (822, 985, 1132, 1059), (1200, 843, 1462, 1059)], "data/reading_order.png": [(51, 56, 1471, 130), (51, 174, 691, 248), (51, 292, 691, 366), (51, 434, 691, 508), (51, 576, 691, 649), (830, 174, 1471, 508), (830, 576, 1471, 649), (51, 717, 1471, 791), (51, 859, 691, 933), (51, 1001, 691, 1075), (830, 859, 1471, 933), (830, 1001, 1471, 1075)] } for file, correct in correct_orders.items(): img = load_image(file) ccs = img.cc_analysis() ro = textline_reading_order(ccs) result = [(a.ul_x, a.ul_y, a.lr_x, a.lr_y) for a in ro] assert result == correct del ro del ccs del img gamera-3.3.3/tests/test_graph_colorize.py0000644000076500000000000000053211556750304017532 0ustar chriswheel#!/usr/bin/env python from gamera.core import * init_gamera() def test_colorize(): img0 = load_image("data/testline.png") img0 = img0.to_onebit() ccs = img0.cc_analysis() for i in range(3): color = img0.graph_color_ccs(ccs,method=i) color.save_PNG("tmp/colors-%d.png" % i) if __name__ == "__main__": test_colorize() gamera-3.3.3/tests/test_image.py0000644000076500000000000001266511627215135015614 0ustar chriswheelimport py.test from gamera.core import * init_gamera() def make_test(inner): def _generate_rgb(): rng = range(0, 255, 8) for r in rng: for g in rng: for b in rng: yield RGBPixel(r,g,b) def test(): for type, value in [(ONEBIT, xrange((2 ** 16) - 1)), (GREYSCALE, xrange((2 ** 8) - 1)), (FLOAT, [float(x) for x in xrange(-5, 5)]), (COMPLEX, [complex(x) for x in xrange(-5, 5)]), (RGB, _generate_rgb()), (GREY16, xrange((2 ** 16) - 1))]: inner(type, value, DENSE) inner(ONEBIT, xrange(0, 2 ** 16 - 1), RLE) return test def _test_image_constructors(type, value, storage): def _fail1(): Image(Size(50, 50), Point(25, 25), type, storage) #image = Image(25, 25, 50, 50, type, storage) # deprecated call image = Image(Point(25,25), Dim(50,50), type, storage) assert image.data.storage_format == storage assert image.data.pixel_type == type assert image.ul == Point(25, 25) assert image.size == Size(49, 49) #assert image.dimensions == Dimensions(50, 50) # deprecated call assert image.dim == Dim(50, 50) image2 = Image(Point(25, 25), Point(74, 74), type, storage) assert Rect(image) == Rect(image2) image3 = Image(Point(25, 25), Size(49, 49), type, storage) assert Rect(image) == Rect(image3) #image4 = Image(Point(25, 25), Dimensions(50, 50), type, storage) # deprecated call image4 = Image(Point(25, 25), Dim(50, 50), type, storage) assert Rect(image) == Rect(image4) #image5 = Image(Rect(25, 25, 50, 50), type, storage) # deprecated call image5 = Image(Rect(Point(25,25), Point(74,74)), type, storage) assert Rect(image) == Rect(image5) image6 = Image(Point(25, 25), Dim(50, 50), type, storage) assert Rect(image) == Rect(image6) py.test.raises(TypeError, _fail1) test_image_constructors = make_test(_test_image_constructors) def _test_subimage(type, value, storage): def _fail1(): image.subimage(Point(20,20), Dim(10,10)) def _fail2(): image.subimage(Point(30,30), Dim(50,50)) #image = Image(25, 25, 50, 50, type, storage) # deprecated call image = Image(Point(25,25), Dim(50,50), type, storage) #image2 = image.subimage(30, 30, 40, 40) # deprecated call image2 = image.subimage(Point(30,30), Dim(40,40)) assert image2.ul == Point(30, 30) assert image2.data == image.data image3 = image.subimage(Point(30, 30), Point(69, 69)) assert Rect(image2) == Rect(image3) assert image3.data == image.data image4 = image.subimage(Point(30, 30), Size(39, 39)) assert Rect(image4) == Rect(image2) assert image4.data == image.data #image5 = image.subimage(Point(30, 30), Dimensions(40, 40)) # deprecated call image5 = image.subimage(Point(30, 30), Point(69, 69)) assert Rect(image5) == Rect(image2) assert image5.data == image.data image6 = image.subimage(Rect(Point(30,30), Dim(40,40))) assert Rect(image6) == Rect(image2) assert image6.data == image.data image7 = image.subimage(Point(30, 30), Dim(40, 40)) assert Rect(image7) == Rect(image2) assert image7.data == image.data py.test.raises(RuntimeError, _fail1) py.test.raises(RuntimeError, _fail2) #image7 = image2.subimage(35, 35, 20, 20) # deprecated call image7 = image2.subimage(Point(35,35), Dim(20,20)) assert image7.data == image.data #image8 = image7.subimage(32, 32, 25, 25) # deprecated call image8 = image7.subimage(Point(32,32), Dim(25,25)) assert image8.ul == Point(32, 32) assert image8.data == image.data test_subimage = make_test(_test_subimage) def _test_get_set(type, value, storage): def _fail1(): image.set(Point(50, 50), 0) def _fail2(): image.get(Point(50, 50)) image = Image((25, 25), Dim(50, 50), type, storage) for val in value: image.set(Point(25, 25), val) assert image.get(Point(25, 25)) == val for r in range(50): for c in range(50): image.set((r, c), val) assert image.get((r, c)) == val py.test.raises(IndexError, _fail1) py.test.raises(IndexError, _fail2) test_get_set = make_test(_test_get_set) def _test_index(type, value, storage): def _fail1(): image[50, 50] = 0 def _fail2(): image[50, 50] image = Image((25, 25), Dim(50, 50), type, storage) for val in value: image[25, 25] = val assert image[25, 25] == val for r in range(50): for c in range(50): image[r, c] = val assert image[r, c] == val print len(image) for i, p in enumerate(image): if p != val: print i assert p == val py.test.raises(IndexError, _fail1) py.test.raises(IndexError, _fail2) test_index = make_test(_test_index) def test_conversions(): img = Image((0,0),(9,9),FLOAT) img.set((0,0),-5.0) img.set((9,9),10.0) # float -> grey tmp = img.to_greyscale() assert tmp.get((0,0)) == 0 assert tmp.get((5,5)) == 85 assert tmp.get((9,9)) == 255 # float -> rgb tmp = img.to_rgb() assert tmp.get((0,0)) == RGBPixel(0,0,0) assert tmp.get((5,5)) == RGBPixel(85,85,85) assert tmp.get((9,9)) == RGBPixel(255,255,255) # float -> grey16 tmp = img.to_grey16() assert tmp.get((0,0)) == 0 assert tmp.get((5,5)) == 21845 assert tmp.get((9,9)) == 65535 # grey16 -> grey tmp = tmp.to_greyscale() assert tmp.get((0,0)) == 0 assert tmp.get((5,5)) == 85 assert tmp.get((9,9)) == 255 gamera-3.3.3/tests/test_image_info.py0000644000076500000000000000110110714675716016621 0ustar chriswheelfrom gamera.core import * from gamera.core import * init_gamera() def test_image_info(): def _test_image_info(name, *args): for ext in ['png', 'tiff']: print "data/%s_generic.%s" % (name, ext) info = image_info("data/%s_generic.%s" % (name, ext)) assert (info.depth, info.ncolors, info.ncols, info.nrows, info.x_resolution, info.y_resolution) == args # TODO: Add Grey16 _test_image_info("OneBit", 1, 1, 70, 100, 0.0, 0.0) _test_image_info("RGB", 8, 3, 228, 130, 0.0, 0.0) _test_image_info("GreyScale", 8, 1, 97, 68, 0.0, 0.0) gamera-3.3.3/tests/test_kdtree.py0000644000076500000000000000540711222436502015776 0ustar chriswheelimport py.test from gamera.core import * init_gamera() # # Tests for nearest neighbor finding with kd-trees # from gamera.kdtree import * # # input parameter check # def test_wrongparams(): def _kdnode_input(coord): node = KdNode(coord) def _kdtree_input(nodes): tree = KdTree(nodes) # all point coordinates must be numeric py.test.raises(Exception, _kdnode_input, [1,2,"a"]) py.test.raises(Exception, _kdnode_input, []) # all nodes must be KdNode's and of same dimension py.test.raises(Exception, _kdtree_input, [KdNode([1,2]),KdNode([2,3,4])]) py.test.raises(Exception, _kdtree_input, [KdNode([1,2]),[2,3]]) py.test.raises(Exception, _kdtree_input, None) py.test.raises(Exception, _kdtree_input, []) # # k nearest neighbor searches # def test_nearest_neighbors(): points = [(1,1), (2,1), (1,3), (2,4), (3,4), (7,2), (8,3), (8,4), (7,5), (7,5)] nodes = [KdNode(p) for p in points] tree = KdTree(nodes) assert [7,2] == tree.k_nearest_neighbors([5.5,3],1)[0].point assert [[2,4], [3,4]] == \ [n.point for n in tree.k_nearest_neighbors([2,4],2)] assert [[7,5],[7,5],[8,4]] == \ [n.point for n in tree.k_nearest_neighbors([7,5],3)] assert [[8,4],[8,3],[7,5]] == \ [n.point for n in tree.k_nearest_neighbors([8,4],3)] assert [[3,4],[2,4],[1,3],[2,1],[1,1],[7,5]] == \ [n.point for n in tree.k_nearest_neighbors([3,4],6)] # # tests with different distance measures # def test_distance_metrics(): points = [(1,4), (2,4), (1,5), (3,6), (8,9), (3.2,4.2), (4,4), (5,5), (3.8,6), (8,3)] nodes = [KdNode(p) for p in points] tree = KdTree(nodes) tree.set_distance(0) assert [[5,5], [3.8,6], [3.2,4.2]] == \ [n.point for n in tree.k_nearest_neighbors([5,6],3)] tree.set_distance(1) assert [[5,5], [3.8,6], [3,6]] == \ [n.point for n in tree.k_nearest_neighbors([5,6],3)] tree.set_distance(2,[1.0,0.5]) assert [[5,5], [3.8,6], [4,4]] == \ [n.point for n in tree.k_nearest_neighbors([5,6],3)] tree.set_distance(0,[0.5,1.0]) assert [[3.8,6], [3,6], [5,5]] == \ [n.point for n in tree.k_nearest_neighbors([5,6],3)] # # tests with search predicate # def test_search_predicate(): class predicate(object): def __init__(self, point): self.point = point def __call__(self, node): return (self.point[1] > node.point[1]) points = [(1,4), (2,4), (1,5), (3,6), (8,9), (3.2,4.2), (4,4), (5,5), (3.8,6), (8,3)] nodes = [KdNode(p) for p in points] tree = KdTree(nodes) assert [[5,5], [4,4]] == \ [n.point for n in tree.k_nearest_neighbors([5,6],2,predicate([5,6]))] assert 0 == len(tree.k_nearest_neighbors([5,6],2,predicate([1,2]))) gamera-3.3.3/tests/test_load_image.py0000644000076500000000000000606411167407101016602 0ustar chriswheelimport py.test from gamera.core import * init_gamera() def test_load_image_rgb_rle(): def _load_image_fail1(): image = load_image("not_a_path") py.test.raises(IOError, _load_image_fail1) def test_load_image_onebit(): image = load_image("data/testline.tiff") assert image.pixel_type_name == "OneBit" assert image.nrows == 44 assert image.ncols == 907 assert image.black_area()[0] == 5174.0 assert image.storage_format_name == "Dense" image2 = load_image("data/testline.png") assert image2.pixel_type_name == "OneBit" assert image2.nrows == 44 assert image2.ncols == 907 assert image2.black_area()[0] == 5174.0 assert image.storage_format_name == "Dense" assert image.to_string() == image2.to_string() assert image.to_rle() == image2.to_rle() def test_load_image_greyscale(): greyscale = load_image("data/GreyScale_generic.tiff") assert greyscale.pixel_type_name == "GreyScale" assert greyscale.nrows == 68 assert greyscale.ncols == 97 assert greyscale.storage_format_name == "Dense" greyscale2 = load_image("data/GreyScale_generic.png") assert greyscale2.pixel_type_name == "GreyScale" assert greyscale2.nrows == 68 assert greyscale2.ncols == 97 assert greyscale2.storage_format_name == "Dense" assert greyscale.to_string() == greyscale2.to_string() def test_load_image_greyscale_rle(): def _load_image_greyscale_rle1(): greyscale3 = load_image("data/GreyScale_generic.png", RLE) def _load_image_greyscale_rle2(): greyscale3 = load_image("data/GreyScale_generic.tiff", RLE) py.test.raises(Exception, _load_image_greyscale_rle1) py.test.raises(Exception, _load_image_greyscale_rle2) def test_load_image_rgb(): rgb = load_image("data/RGB_generic.tiff") assert rgb.pixel_type_name == "RGB" assert rgb.nrows == 130 assert rgb.ncols == 228 assert rgb.storage_format_name == "Dense" rgb2 = load_image("data/RGB_generic.png") assert rgb2.pixel_type_name == "RGB" assert rgb2.nrows == 130 assert rgb2.ncols == 228 assert rgb.storage_format_name == "Dense" assert rgb.to_string() == rgb2.to_string() def load_image_rgb_rle1(): rgb3 = load_image("data/RGB_generic.png", RLE) def load_image_rgb_rle2(): rgb3 = load_image("data/RGB_generic.tiff", RLE) def test_load_image_grey16(): grey16 = load_image("data/Grey16_generic.tiff") assert grey16.pixel_type_name == "Grey16" assert grey16.nrows == 72 assert grey16.ncols == 83 assert grey16.storage_format_name == "Dense" grey16_2 = load_image("data/Grey16_generic.png") assert grey16_2.pixel_type_name == "Grey16" assert grey16_2.nrows == 72 assert grey16_2.ncols == 83 assert grey16.storage_format_name == "Dense" # assert grey16.to_string() == grey16_2.to_string() def load_image_grey16_rle1(): grey16 = load_image("data/Grey16_generic.png", RLE) def load_image_grey16_rle2(): grey16 = load_image("data/Grey16_generic.tiff", RLE) # def test_load_image_grey16_rle(): # py.test.raises(Exception, load_image_grey16_rle1) # py.test.raises(Exception, load_image_grey16_rle2) gamera-3.3.3/tests/test_mlcc.py0000644000076500000000000000571611275313035015444 0ustar chriswheelimport py.test from gamera.core import * init_gamera() def test_mlcc_wrongcalls(): img=Image((0,0),(8,8)) img.draw_filled_rect((1,1),(3,3),2) img.set((1,5),3) py.test.raises(Exception, MlCc, img, 2, 1) py.test.raises(Exception, MlCc, img, "a", Rect((0,0),(8,8))) py.test.raises(Exception, MlCc, "abc", 2, Rect((0,0),(8,8))) py.test.raises(Exception, MlCc, [1,2]) py.test.raises(Exception, MlCc, [img]) def test_mlcc(): # create test image with different labels img=Image((0,0),(8,8)) img.draw_filled_rect((1,1),(3,3),2) img.set((1,5),3) img.set((5,1),4) img.set((5,5),5) # test onebit plugins (highlight, features) rgb = img.to_rgb() mlcc1 = MlCc(img, 2, Rect((0,0),(8,8))) assert round(mlcc1.black_area()[0]) == 9.0 rgb.highlight(mlcc1, RGBPixel(255,0,0)) assert RGBPixel(0,0,0) == rgb.get((5,5)) mlcc1.add_label(5, Rect((0,0),(8,8))) assert round(mlcc1.black_area()[0]) == 10.0 assert True == mlcc1.has_label(2) assert False == mlcc1.has_label(4) assert True == mlcc1.has_label(5) rgb.highlight(mlcc1,RGBPixel(0,255,0)) assert RGBPixel(0,255,0) == rgb.get((5,5)) # test conversion to Cc labels = mlcc1.get_labels() labels.sort() assert [2,5] == labels cc = mlcc1.convert_to_cc() assert 1 == len(mlcc1.get_labels()) label = mlcc1.get_labels()[0] assert label == img.get((5,5)) assert label == img.get((2,2)) # test relabeling mlcc2 = MlCc(img, 2, Rect((1,1),(3,3))) mlcc2.add_label(3, Rect((1,5),(1,5))) mlcc2.add_label(4, Rect((5,1),(5,1))) mlcc2.add_label(5, Rect((5,5),(5,5))) assert [(1,1), (5,5)] == [mlcc2.ul, mlcc2.lr] mlcc3 = mlcc2.relabel([2,3]) labels = mlcc3.get_labels(); labels.sort() assert [2,3] == labels assert [(1,1), (3,5)] == [mlcc3.ul, mlcc3.lr] mlcc3, mlcc4 = mlcc2.relabel([[2,3],[4]]) labels = mlcc3.get_labels(); labels.sort() assert [2,3] == labels labels = mlcc4.get_labels(); labels.sort() assert [4] == labels assert [(1,1), (3,5)] == [mlcc3.ul, mlcc3.lr] assert [(5,1), (5,1)] == [mlcc4.ul, mlcc4.lr] mlcc2.remove_label(2) mlcc2.remove_label(3) labels = mlcc2.get_labels(); labels.sort() assert [4,5] == labels assert [(5,1),(5,5)] == [mlcc2.ul, mlcc2.lr] # test get/set mlcc2.set((0,1),3) assert 3 == img.get((5,2)) assert 0 == mlcc2.get((0,1)) mlcc2.set((0,1),5) assert 5 == img.get((5,2)) assert 5 == mlcc2.get((0,1)) cc = mlcc2.convert_to_cc() cc.set((0,2),20) assert 20 == img.get((5,3)) assert 0 == cc.get((0,2)) cc.set((0,2),cc.label) assert cc.label == img.get((5,3)) assert cc.label == cc.get((0,2)) # test constructor from Cc's img2 = img=Image((0,0),(8,8)) img.draw_filled_rect((1,1),(3,3),1) img.set((5,5),1) ccs = img.cc_analysis() mlcc = MlCc(ccs) assert [(1,1),(5,5)] == [mlcc.ul, mlcc.lr] cclabels = [c.label for c in ccs]; cclabels.sort() mlcclabels = mlcc.get_labels(); mlcclabels.sort() assert cclabels == mlcclabels gamera-3.3.3/tests/test_nested_list.py0000644000076500000000000000104510714675716017050 0ustar chriswheelfrom gamera.core import * from gamera.core import * init_gamera() def test_nested_list(): def _test_nested_list(name, type, storage = DENSE): image = load_image("data/%s_generic.tiff" % name, storage) nested = image.to_nested_list() image2 = nested_list_to_image(nested, type) assert image._to_raw_string() == image2._to_raw_string() # TODO: Add Grey16 for name, type in [("OneBit", ONEBIT), ("GreyScale", GREYSCALE), ("RGB", RGB)]: _test_nested_list(name, type) _test_nested_list("OneBit", ONEBIT, RLE) gamera-3.3.3/tests/test_plugins.py0000644000076500000000000000131210714675716016211 0ustar chriswheelfrom gamera.core import * init_gamera() from gamera import gendoc from gamera import plugin # This is a fairly complex test harness, which generates # a "wrapper" call around every plugin so each plugin can # be tested separately by py.test class PluginTester(gendoc.PluginDocumentationGenerator): def __init__(self): self.images = self.get_generic_images() self.methods = plugin._methods_flatten(plugin.plugin_methods) class TestPlugins: pass def make_test(tester, method): def test(self): tester.run_example(method, tester.images) return test tester = PluginTester() for name, method in tester.methods: setattr(TestPlugins, "test_plugin_" + name, make_test(tester, method)) gamera-3.3.3/tests/test_rect.py0000644000076500000000000000334211167407101015452 0ustar chriswheelfrom gamera.core import * from math import sqrt def test_rect(): r1 = Rect(Point(25, 25), Point(74, 64)) assert r1.ul == Point(25, 25) assert r1.ul_x == 25 assert r1.ul_y == 25 assert r1.lr == Point(74, 64) assert r1.lr_x == 74 assert r1.lr_y == 64 assert r1.size == Size(49, 39) assert r1.dim == Dim(50, 40) assert r1.nrows == 40 assert r1.ncols == 50 assert r1.height == 39 assert r1.width == 49 assert r1.ur == Point(74, 25) assert r1.ur_x == 74 assert r1.ur_y == 25 assert r1.ll == Point(25, 64) assert r1.ll_x == 25 assert r1.ll_y == 64 assert r1.center == Point(49, 44) assert r1.center_x == 49 assert r1.center_y == 44 assert r1.contains_x(40) assert r1.contains_y(40) assert not r1.contains_x(24) assert not r1.contains_y(24) assert r1.contains_point(Point(74, 64)) assert not r1.contains_point(Point(75, 65)) assert Rect(Point(0,0), Point(100,100)).contains_rect(r1) assert r1.contains_rect(Rect(Point(30,30), Point(30,40))) assert not r1.contains_rect(Rect(Point(20,30), Point(60,40))) assert Rect(Point(0,0), Point(100,100)).intersects(r1) assert r1.intersects(Rect(Point(30,30), Point(60,70))) assert r1.intersects(Rect(Point(20,30), Point(60,40))) assert not r1.intersects(Rect(Point(0,0), Point(20,20))) assert r1.union_rects([r1, Rect(Point(0,0), Point(20,20))]) == Rect(Point(0,0), Point(74,64)) distance_euclid = r1.distance_euclid(Rect(Point(0,0), Point(25,25))) assert distance_euclid > 48.9 and distance_euclid < 49.0 assert r1.distance_bb(Rect(Point(0,0), Point(20,20))) == sqrt(5*5 + 5*5) assert r1.distance_cx(Rect(Point(0,0), Point(20,20))) == 39 assert r1.distance_cy(Rect(Point(0,0), Point(20,20))) == 34 gamera-3.3.3/tests/test_rle.py0000644000076500000000000000222411167407101015275 0ustar chriswheelfrom gamera.core import * init_gamera() def test_rle1(): image1 = load_image("data/testline.png") image2 = load_image("data/testline.png", RLE) # Check basic RLE image loading assert image2.pixel_type_name == "OneBit" assert image2.nrows == 44 assert image2.ncols == 907 assert image2.black_area()[0] == 5174.0 # Compare RLE to DENSE image assert image1._to_raw_string() == image2._to_raw_string() assert image1.to_rle() == image2.to_rle() # Run something complicated, like cc_analysis image1.cc_analysis() image2.cc_analysis() # compare the results assert image1.color_ccs().to_string() == image2.color_ccs().to_string() assert image1._to_raw_string() == image2._to_raw_string() # Do some more complicated stuff, particularly things that # use iterators in unusual ways assert image1.projection_rows() == image2.projection_rows() assert image1.projection_cols() == image2.projection_cols() assert image1.most_frequent_run("black","vertical") == image2.most_frequent_run("black","vertical") assert image1.most_frequent_run("black","horizontal") == image2.most_frequent_run("black","horizontal") gamera-3.3.3/tests/test_save_image.py0000644000076500000000000000102611271041103016602 0ustar chriswheelfrom gamera.core import * init_gamera() def test_save_image(): def _test_save_image(name, storage = DENSE): for ext in ['png', 'tiff']: image = load_image("data/%s_generic.tiff" % name, storage) image.save_image("tmp/%s_test.%s" % (name, ext)) image2 = load_image("tmp/%s_test.%s" % (name, ext)) assert image._to_raw_string() == image2._to_raw_string() # TODO: Add Grey16 for type in ["OneBit", "GreyScale", "RGB"]: _test_save_image(type) _test_save_image("OneBit", RLE) gamera-3.3.3/tests/test_voronoi.py0000644000076500000000000000552611372314143016217 0ustar chriswheelimport py.test from gamera.core import * init_gamera() # # Tests for Voronoi tesselation and Delaunay triangulation # from gamera.plugins.geometry import delaunay_from_points # # input parameter check # def test_wrongparams(): def _voronoi_from_points_input(points,labels): image = Image((0,0),(20,20)) image.voronoi_from_points(points,labels) # number of points and labels must match py.test.raises(Exception, _voronoi_from_points_input, [(2,2),(5,5)], [2,3,4]) # labels must be int's and points must be coordinates py.test.raises(Exception, _voronoi_from_points_input, [(2,2),(5,5)], [(2,2),(5,5)]) # TODO: no plausi check in Gamera's passing of PointVector => crash #py.test.raises(Exception, _voronoi_from_points_input, [2,,5], [2,5]) # # voronoi tesselation by image labeling # def test_voronoi_cell_labeling(): img = Image((0,0),(9,9)) points = [(2,2),(3,2),(3,8),(6,5)] labels = [2,2,3,4] for i in range(len(points)): img.set(points[i],labels[i]) # voronoi_from_labeled_image voronoi1 = img.voronoi_from_labeled_image() assert 2 == voronoi1.get((2,4)) assert 3 == voronoi1.get((4,8)) assert 4 == voronoi1.get((5,4)) labelpairs = voronoi1.labeled_region_neighbors() assert [2,4] in labelpairs or [4,2] in labelpairs assert [2,3] in labelpairs or [3,2] in labelpairs assert [4,3] in labelpairs or [3,4] in labelpairs # voronoi_from_points voronoi2 = Image(img) voronoi2.voronoi_from_points(points,labels) assert 2 == voronoi2.get((2,4)) assert 3 == voronoi2.get((4,8)) assert 4 == voronoi2.get((5,4)) assert [2,4] in labelpairs or [4,2] in labelpairs assert [2,3] in labelpairs or [3,2] in labelpairs assert [4,3] in labelpairs or [3,4] in labelpairs # # delaunay triangulation # def test_delaunay_triangulation(): # all labels different points = [(50,50),(25,100),(50,150),(150,60),(150,125)] edges = delaunay_from_points(points,range(len(points))) assert len(edges) == 7 assert [0,1] in edges assert [0,2] in edges assert [0,3] in edges assert [0,4] in edges assert [1,2] in edges assert [2,4] in edges assert [3,4] in edges # some doublettes points = [(50,50),(25,100),(50,150),(150,60),(150,125)] labels = [0,1,2,3,3] edges = delaunay_from_points(points,labels) assert len(edges) == 5 assert [0,1] in edges assert [0,2] in edges assert [0,3] in edges assert [1,2] in edges assert [2,3] in edges # collinear edge resolution points = [(50,50),(50,100),(50,150),(50,200),(150,125)] edges = delaunay_from_points(points,range(len(points))) assert len(edges) == 7 assert [0, 1] in edges assert [0, 4] in edges assert [1, 2] in edges assert [1, 4] in edges assert [2, 3] in edges assert [2, 4] in edges assert [3, 4] in edges gamera-3.3.3/tests/test_xml.py0000644000076500000000000000661711167407101015325 0ustar chriswheelimport py.test from gamera.core import * init_gamera() from gamera import gamera_xml # check for identical training data *except features* # feature values are subject to rounding errors and # are thus randomly different => test files not portable def equal_files(filea, fileb, gz=False): if gz: import gzip a = gzip.open(filea, "r") b = gzip.open(fileb, "r") else: a = open(filea, "r") b = open(fileb, "r") i = 0 linea = a.readline() lineb = b.readline() feature = False while linea: i += 1 if not lineb: # a longer than b return False if linea != lineb: return False if "" not in linea: linea = a.readline() while lineb and "" not in lineb: lineb = b.readline() linea = a.readline() lineb = b.readline() if lineb: # b longer than a return False return True # High-level API def test_glyphs_from_xml(): glyphs = gamera_xml.glyphs_from_xml("data/testline.xml") assert len(glyphs) == 66 def test_glyphs_with_features_from_xml(): glyphs = gamera_xml.glyphs_with_features_from_xml( "data/testline.xml", ["area", "aspect_ratio"]) assert len(glyphs) == 66 assert len(glyphs[0].features) == 2 def test_glyphs_to_xml(): glyphs = gamera_xml.glyphs_from_xml("data/testline.xml") gamera_xml.glyphs_to_xml("tmp/testline_test1.xml", glyphs, False) assert equal_files("tmp/testline_test1.xml", "data/testline_test1.xml") def test_glyphs_to_xml_with_features(): glyphs = gamera_xml.glyphs_with_features_from_xml("data/testline.xml") gamera_xml.glyphs_to_xml("tmp/testline_test2.xml", glyphs, True) assert equal_files("tmp/testline_test2.xml", "data/testline_test2.xml") def test_glyphs_from_xml_gz(): glyphs = gamera_xml.glyphs_from_xml("data/testline.xml.gz") assert len(glyphs) == 66 def test_glyphs_to_xml_gz(): glyphs = gamera_xml.glyphs_from_xml("data/testline.xml") gamera_xml.glyphs_to_xml("tmp/testline_test1.xml.gz", glyphs, False) assert equal_files("tmp/testline_test1.xml.gz", "data/testline_test1.xml.gz", gz=True) # Low-level API def test_write_xml(): glyphs = gamera_xml.glyphs_from_xml("data/testline.xml") writer = gamera_xml.WriteXML(glyphs) result_string = writer.string() writer.write_filename("tmp/testline_test3.xml") assert equal_files("tmp/testline_test3.xml", "data/testline_test3.xml") def test_symbol_table(): symbol_table = gamera_xml.LoadXML(parts=['symbol_table']).parse_filename("data/symbol_table.xml").symbol_table gamera_xml.WriteXMLFile([], symbol_table).write_filename("tmp/symbol_table.xml") assert equal_files("data/symbol_table.xml", "tmp/symbol_table.xml") symbol_table = gamera_xml.LoadXML(parts=['symbol_table']).parse_filename("data/testline.xml").symbol_table gamera_xml.WriteXMLFile([], symbol_table).write_filename("tmp/symbol_table2.xml") assert equal_files("data/symbol_table.xml", "tmp/symbol_table2.xml") # Error cases def test_missing_attributes(): def _test_missing_attributes(): glyphs = gamera_xml.glyphs_from_xml("data/missing_attributes.xml") py.test.raises(gamera_xml.XMLError, _test_missing_attributes) def test_malformed(): def _test_malformed(): glyphs = gamera_xml.glyphs_from_xml("data/malformed.xml") py.test.raises(gamera_xml.XMLError, _test_malformed) gamera-3.3.3/tests/tmp/0000755000076500000000000000000011755376174013724 5ustar chriswheelgamera-3.3.3/tests/tmp/.empty_dir0000644000076500000000000000000011277325002015666 0ustar chriswheelgamera-3.3.3/TODO0000644000076500000000000000227011414613300012424 0ustar chriswheelToDo list for Gamera ==================== - More documentation of wrapped Vigra functions - More page layout analysis resp. page segmentation methods. E.g. text/graphics separation and more text line finding algorithms. Maybe some parts of Leptonica could be useful? - Add multilevel thresholding. - Support FFT on Gamera images by wrapping FFT from VIGRA - Feature selection via genetic algorithms (GA) as an alternative to the currently implemented GA based feature weighting. Investigate why the GA based feature weighting in Gamera produces so poor results. - A new menu function in the interactive classifier dialog for highlighting outliers, i.e. possible manual misclassifications. Can be based on MNN editing. - Add automatic clustering algorithms for training data. - Adding more classifiers like Gaussian mixture models, support vector machines, or hidden Markov models. - Add support for the hOCR exchange format in the form of a general writing and parsing library. - Write wrappers for external OCR engines like Tesseract OCR as optional plugins. - Add more image formats: JPEG (reading/writing), PDF (writing), NIST special database 19 (reading)... gamera-3.3.3/version0000755000076500000000000000000611755374470013366 0ustar chriswheel3.3.3

*/ //@{ /// equal inline bool operator ==(FFTWComplex const &a, const FFTWComplex &b) { return a.re() == b.re() && a.im() == b.im(); } /// not equal inline bool operator !=(FFTWComplex const &a, const FFTWComplex &b) { return a.re() != b.re() || a.im() != b.im(); } /// add-assignment inline FFTWComplex &operator +=(FFTWComplex &a, const FFTWComplex &b) { a.re() += b.re(); a.im() += b.im(); return a; } /// subtract-assignment inline FFTWComplex &operator -=(FFTWComplex &a, const FFTWComplex &b) { a.re() -= b.re(); a.im() -= b.im(); return a; } /// multiply-assignment inline FFTWComplex &operator *=(FFTWComplex &a, const FFTWComplex &b) { FFTWComplex::value_type t = a.re()*b.re()-a.im()*b.im(); a.im() = a.re()*b.im()+a.im()*b.re(); a.re() = t; return a; } /// divide-assignment inline FFTWComplex &operator /=(FFTWComplex &a, const FFTWComplex &b) { FFTWComplex::value_type sm = b.squaredMagnitude(); FFTWComplex::value_type t = (a.re()*b.re()+a.im()*b.im())/sm; a.im() = (b.re()*a.im()-a.re()*b.im())/sm; a.re() = t; return a; } /// multiply-assignment with scalar double inline FFTWComplex &operator *=(FFTWComplex &a, const double &b) { a.re() *= b; a.im() *= b; return a; } /// divide-assignment with scalar double inline FFTWComplex &operator /=(FFTWComplex &a, const double &b) { a.re() /= b; a.im() /= b; return a; } /// addition inline FFTWComplex operator +(FFTWComplex a, const FFTWComplex &b) { a += b; return a; } /// subtraction inline FFTWComplex operator -(FFTWComplex a, const FFTWComplex &b) { a -= b; return a; } /// multiplication inline FFTWComplex operator *(FFTWComplex a, const FFTWComplex &b) { a *= b; return a; } /// right multiplication with scalar double inline FFTWComplex operator *(FFTWComplex a, const double &b) { a *= b; return a; } /// left multiplication with scalar double inline FFTWComplex operator *(const double &a, FFTWComplex b) { b *= a; return b; } /// division inline FFTWComplex operator /(FFTWComplex a, const FFTWComplex &b) { a /= b; return a; } /// right division with scalar double inline FFTWComplex operator /(FFTWComplex a, const double &b) { a /= b; return a; } using VIGRA_CSTD::abs; /// absolute value (= magnitude) inline FFTWComplex::value_type abs(const FFTWComplex &a) { return a.magnitude(); } /// complex conjugate inline FFTWComplex conj(const FFTWComplex &a) { return FFTWComplex(a.re(), -a.im()); } /// norm (= magnitude) inline FFTWComplex::NormType norm(const FFTWComplex &a) { return a.magnitude(); } /// squared norm (= squared magnitude) inline FFTWComplex::SquaredNormType squaredNorm(const FFTWComplex &a) { return a.squaredMagnitude(); } //@} /** \addtogroup StandardImageTypes */ //@{ /********************************************************/ /* */ /* FFTWRealImage */ /* */ /********************************************************/ /** Float (fftw_real) image. The type fftw_real is defined as double (in FFTW 2 it used to be either float or double, as specified during compilation of FFTW). FFTWRealImage uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ typedef BasicImage FFTWRealImage; /********************************************************/ /* */ /* FFTWComplexImage */ /* */ /********************************************************/ template<> struct IteratorTraits< BasicImageIterator > { typedef BasicImageIterator Iterator; typedef Iterator iterator; typedef BasicImageIterator mutable_iterator; typedef ConstBasicImageIterator const_iterator; typedef iterator::iterator_category iterator_category; typedef iterator::value_type value_type; typedef iterator::reference reference; typedef iterator::index_reference index_reference; typedef iterator::pointer pointer; typedef iterator::difference_type difference_type; typedef iterator::row_iterator row_iterator; typedef iterator::column_iterator column_iterator; typedef VectorAccessor default_accessor; typedef VectorAccessor DefaultAccessor; typedef VigraTrueType hasConstantStrides; }; template<> struct IteratorTraits< ConstBasicImageIterator > { typedef ConstBasicImageIterator Iterator; typedef Iterator iterator; typedef BasicImageIterator mutable_iterator; typedef ConstBasicImageIterator const_iterator; typedef iterator::iterator_category iterator_category; typedef iterator::value_type value_type; typedef iterator::reference reference; typedef iterator::index_reference index_reference; typedef iterator::pointer pointer; typedef iterator::difference_type difference_type; typedef iterator::row_iterator row_iterator; typedef iterator::column_iterator column_iterator; typedef VectorAccessor default_accessor; typedef VectorAccessor DefaultAccessor; typedef VigraTrueType hasConstantStrides; }; /** Complex (FFTWComplex) image. It uses \ref vigra::BasicImageIterator and \ref vigra::StandardAccessor and their const counterparts to access the data. \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ typedef BasicImage FFTWComplexImage; //@} /********************************************************/ /* */ /* FFTWComplex-Accessors */ /* */ /********************************************************/ /** \addtogroup DataAccessors */ //@{ /** \defgroup FFTWComplexAccessors Accessors for FFTWComplex Encapsulate access to pixels of type FFTWComplex */ //@{ /** Encapsulate access to the the real part of a complex number. \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ class FFTWRealAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /// Read real part at iterator position. template value_type operator()(ITERATOR const & i) const { return (*i).re(); } /// Read real part at offset from iterator position. template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return i[d].re(); } /// Write real part at iterator position. template void set(value_type const & v, ITERATOR const & i) const { (*i).re()= v; } /// Write real part at offset from iterator position. template void set(value_type const & v, ITERATOR const & i, DIFFERENCE d) const { i[d].re()= v; } }; /** Encapsulate access to the the imaginary part of a complex number. \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ class FFTWImaginaryAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /// Read imaginary part at iterator position. template value_type operator()(ITERATOR const & i) const { return (*i).im(); } /// Read imaginary part at offset from iterator position. template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return i[d].im(); } /// Write imaginary part at iterator position. template void set(value_type const & v, ITERATOR const & i) const { (*i).im()= v; } /// Write imaginary part at offset from iterator position. template void set(value_type const & v, ITERATOR const & i, DIFFERENCE d) const { i[d].im()= v; } }; /** Write a real number into a complex one. The imaginary part is set to 0. \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ class FFTWWriteRealAccessor: public FFTWRealAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /** Write real number at iterator position. Set imaginary part to 0. */ template void set(value_type const & v, ITERATOR const & i) const { (*i).re()= v; (*i).im()= 0; } /** Write real number at offset from iterator position. Set imaginary part to 0. */ template void set(value_type const & v, ITERATOR const & i, DIFFERENCE d) const { i[d].re()= v; i[d].im()= 0; } }; /** Calculate magnitude of complex number on the fly. \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ class FFTWMagnitudeAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /// Read magnitude at iterator position. template value_type operator()(ITERATOR const & i) const { return (*i).magnitude(); } /// Read magnitude at offset from iterator position. template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return (i[d]).magnitude(); } }; /** Calculate phase of complex number on the fly. \#include \<vigra/fftw3.hxx\> (for FFTW 3) or
\#include \<vigra/fftw.hxx\> (for deprecated FFTW 2)
Namespace: vigra */ class FFTWPhaseAccessor { public: /// The accessor's value type. typedef fftw_real value_type; /// Read phase at iterator position. template value_type operator()(ITERATOR const & i) const { return (*i).phase(); } /// Read phase at offset from iterator position. template value_type operator()(ITERATOR const & i, DIFFERENCE d) const { return (i[d]).phase(); } }; //@} //@} /********************************************************/ /* */ /* Fourier Transform */ /* */ /********************************************************/ /** \addtogroup FourierTransform Fast Fourier Transform This documentation describes the VIGRA interface to FFTW version 3. The interface to the old FFTW version 2 (file "vigra/fftw.hxx") is deprecated. VIGRA uses the FFTW Fast Fourier Transform package to perform Fourier transformations. VIGRA provides a wrapper for FFTW's complex number type (FFTWComplex), but FFTW's functions are used verbatim. If the image is stored as a FFTWComplexImage, the simplest call to an FFT function is like this: \code vigra::FFTWComplexImage spatial(width,height), fourier(width,height); ... // fill image with data // create a plan with estimated performance optimization fftw_plan forwardPlan = fftw_plan_dft_2d(height, width, (fftw_complex *)spatial.begin(), (fftw_complex *)fourier.begin(), FFTW_FORWARD, FFTW_ESTIMATE ); // calculate FFT (this can be repeated as often as needed, // with fresh data written into the source array) fftw_execute(forwardPlan); // release the plan memory fftw_destroy_plan(forwardPlan); // likewise for the inverse transform fftw_plan backwardPlan = fftw_plan_dft_2d(height, width, (fftw_complex *)fourier.begin(), (fftw_complex *)spatial.begin(), FFTW_BACKWARD, FFTW_ESTIMATE); fftw_execute(backwardPlan); fftw_destroy_plan(backwardPlan); // do not forget to normalize the result according to the image size transformImage(srcImageRange(spatial), destImage(spatial), std::bind1st(std::multiplies(), 1.0 / width / height)); \endcode Note that in the creation of a plan, the height must be given first. Note also that spatial.begin() may only be passed to fftw_plan_dft_2d if the transform shall be applied to the entire image. When you want to restrict operation to an ROI, you can create a copy of the ROI in an image of appropriate size, or you may use the Guru interface to FFTW. More information on using FFTW can be found here. FFTW produces fourier images that have the DC component (the origin of the Fourier space) in the upper left corner. Often, one wants the origin in the center of the image, so that frequencies always increase towards the border of the image. This can be achieved by calling \ref moveDCToCenter(). The inverse transformation is done by \ref moveDCToUpperLeft(). \#include \<vigra/fftw3.hxx\>
Namespace: vigra */ /** \addtogroup FourierTransform */ //@{ /********************************************************/ /* */ /* moveDCToCenter */ /* */ /********************************************************/ /** \brief Rearrange the quadrants of a Fourier image so that the origin is in the image center. FFTW produces fourier images where the DC component (origin of fourier space) is located in the upper left corner of the image. The quadrants are placed like this (using a 4x4 image for example): \code DC 4 3 3 4 4 3 3 1 1 2 2 1 1 2 2 \endcode After applying the function, the quadrants are at their usual places: \code 2 2 1 1 2 2 1 1 3 3 DC 4 3 3 4 4 \endcode This transformation can be reversed by \ref moveDCToUpperLeft(). Note that the transformation must not be executed in place - input and output images must be different. Declarations: pass arguments explicitly: \code namespace vigra { template void moveDCToCenter(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void moveDCToCenter( triple src, pair dest); } \endcode Usage: \#include \<vigra/fftw3.hxx\>
Namespace: vigra \code vigra::FFTWComplexImage spatial(width,height), fourier(width,height); ... // fill image with data // create a plan with estimated performance optimization fftw_plan forwardPlan = fftw_plan_dft_2d(height, width, (fftw_complex *)spatial.begin(), (fftw_complex *)fourier.begin(), FFTW_FORWARD, FFTW_ESTIMATE ); // calculate FFT fftw_execute(forwardPlan); vigra::FFTWComplexImage rearrangedFourier(width, height); moveDCToCenter(srcImageRange(fourier), destImage(rearrangedFourier)); // delete the plan fftw_destroy_plan(forwardPlan); \endcode */ doxygen_overloaded_function(template <...> void moveDCToCenter) template void moveDCToCenter(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da) { int w= src_lowerright.x - src_upperleft.x; int h= src_lowerright.y - src_upperleft.y; int w1 = w/2; int h1 = h/2; int w2 = (w+1)/2; int h2 = (h+1)/2; // 2. Quadrant zum 4. copyImage(srcIterRange(src_upperleft, src_upperleft + Diff2D(w2, h2), sa), destIter (dest_upperleft + Diff2D(w1, h1), da)); // 4. Quadrant zum 2. copyImage(srcIterRange(src_upperleft + Diff2D(w2, h2), src_lowerright, sa), destIter (dest_upperleft, da)); // 1. Quadrant zum 3. copyImage(srcIterRange(src_upperleft + Diff2D(w2, 0), src_upperleft + Diff2D(w, h2), sa), destIter (dest_upperleft + Diff2D(0, h1), da)); // 3. Quadrant zum 1. copyImage(srcIterRange(src_upperleft + Diff2D(0, h2), src_upperleft + Diff2D(w2, h), sa), destIter (dest_upperleft + Diff2D(w1, 0), da)); } template inline void moveDCToCenter( triple src, pair dest) { moveDCToCenter(src.first, src.second, src.third, dest.first, dest.second); } /********************************************************/ /* */ /* moveDCToUpperLeft */ /* */ /********************************************************/ /** \brief Rearrange the quadrants of a Fourier image so that the origin is in the image's upper left. This function is the inversion of \ref moveDCToCenter(). See there for declarations and a usage example. Declarations: pass arguments explicitly: \code namespace vigra { template void moveDCToUpperLeft(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void moveDCToUpperLeft( triple src, pair dest); } \endcode */ doxygen_overloaded_function(template <...> void moveDCToUpperLeft) template void moveDCToUpperLeft(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor sa, DestImageIterator dest_upperleft, DestAccessor da) { int w= src_lowerright.x - src_upperleft.x; int h= src_lowerright.y - src_upperleft.y; int w2 = w/2; int h2 = h/2; int w1 = (w+1)/2; int h1 = (h+1)/2; // 2. Quadrant zum 4. copyImage(srcIterRange(src_upperleft, src_upperleft + Diff2D(w2, h2), sa), destIter (dest_upperleft + Diff2D(w1, h1), da)); // 4. Quadrant zum 2. copyImage(srcIterRange(src_upperleft + Diff2D(w2, h2), src_lowerright, sa), destIter (dest_upperleft, da)); // 1. Quadrant zum 3. copyImage(srcIterRange(src_upperleft + Diff2D(w2, 0), src_upperleft + Diff2D(w, h2), sa), destIter (dest_upperleft + Diff2D(0, h1), da)); // 3. Quadrant zum 1. copyImage(srcIterRange(src_upperleft + Diff2D(0, h2), src_upperleft + Diff2D(w2, h), sa), destIter (dest_upperleft + Diff2D(w1, 0), da)); } template inline void moveDCToUpperLeft( triple src, pair dest) { moveDCToUpperLeft(src.first, src.second, src.third, dest.first, dest.second); } namespace detail { template void fourierTransformImpl(FFTWComplexImage::const_traverser sul, FFTWComplexImage::const_traverser slr, FFTWComplexImage::ConstAccessor src, FFTWComplexImage::traverser dul, FFTWComplexImage::Accessor dest, T sign) { int w = slr.x - sul.x; int h = slr.y - sul.y; FFTWComplexImage sworkImage, dworkImage; fftw_complex * srcPtr = (fftw_complex *)(&*sul); fftw_complex * destPtr = (fftw_complex *)(&*dul); // test for right memory layout (fftw expects a 2*width*height floats array) if (&(*(sul + Diff2D(w, 0))) != &(*(sul + Diff2D(0, 1)))) { sworkImage.resize(w, h); copyImage(srcIterRange(sul, slr, src), destImage(sworkImage)); srcPtr = (fftw_complex *)(&(*sworkImage.upperLeft())); } if (&(*(dul + Diff2D(w, 0))) != &(*(dul + Diff2D(0, 1)))) { dworkImage.resize(w, h); destPtr = (fftw_complex *)(&(*dworkImage.upperLeft())); } fftw_plan plan = fftw_plan_dft_2d(h, w, srcPtr, destPtr, sign, FFTW_ESTIMATE ); fftw_execute(plan); fftw_destroy_plan(plan); if (&(*(dul + Diff2D(w, 0))) != &(*(dul + Diff2D(0, 1)))) { copyImage(srcImageRange(dworkImage), destIter(dul, dest)); } } } // namespace detail /********************************************************/ /* */ /* fourierTransform */ /* */ /********************************************************/ /** \brief Compute forward and inverse Fourier transforms. In the forward direction, the input image may be scalar or complex, and the output image is always complex. In the inverse direction, both input and output must be complex. Declarations: pass arguments explicitly: \code namespace vigra { template void fourierTransform(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor src, FFTWComplexImage::traverser destUpperLeft, FFTWComplexImage::Accessor dest); void fourierTransformInverse(FFTWComplexImage::const_traverser sul, FFTWComplexImage::const_traverser slr, FFTWComplexImage::ConstAccessor src, FFTWComplexImage::traverser dul, FFTWComplexImage::Accessor dest) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void fourierTransform(triple src, pair dest); void fourierTransformInverse(triple src, pair dest); } \endcode Usage: \#include \<vigra/fftw3.hxx\>
Namespace: vigra \code // compute complex Fourier transform of a real image vigra::DImage src(w, h); vigra::FFTWComplexImage fourier(w, h); fourierTransform(srcImageRange(src), destImage(fourier)); // compute inverse Fourier transform // note that both source and destination image must be of type vigra::FFTWComplexImage vigra::FFTWComplexImage inverseFourier(w, h); fourierTransform(srcImageRange(fourier), destImage(inverseFourier)); \endcode */ doxygen_overloaded_function(template <...> void fourierTransform) inline void fourierTransform(FFTWComplexImage::const_traverser sul, FFTWComplexImage::const_traverser slr, FFTWComplexImage::ConstAccessor src, FFTWComplexImage::traverser dul, FFTWComplexImage::Accessor dest) { detail::fourierTransformImpl(sul, slr, src, dul, dest, FFTW_FORWARD); } template void fourierTransform(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, FFTWComplexImage::traverser destUpperLeft, FFTWComplexImage::Accessor da) { // copy real input images into a complex one... int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage, FFTWWriteRealAccessor())); // ...and call the complex -> complex version of the algorithm FFTWComplexImage const & cworkImage = workImage; fourierTransform(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), destUpperLeft, da); } template inline void fourierTransform(triple src, pair dest) { fourierTransform(src.first, src.second, src.third, dest.first, dest.second); } /** \brief Compute inverse Fourier transforms. See \ref fourierTransform() for details. */ inline void fourierTransformInverse(FFTWComplexImage::const_traverser sul, FFTWComplexImage::const_traverser slr, FFTWComplexImage::ConstAccessor src, FFTWComplexImage::traverser dul, FFTWComplexImage::Accessor dest) { detail::fourierTransformImpl(sul, slr, src, dul, dest, FFTW_BACKWARD); } inline void fourierTransformInverse(triple src, pair dest) { fourierTransformInverse(src.first, src.second, src.third, dest.first, dest.second); } /********************************************************/ /* */ /* applyFourierFilter */ /* */ /********************************************************/ /** \brief Apply a filter (defined in the frequency domain) to an image. After transferring the image into the frequency domain, it is multiplied pixel-wise with the filter and transformed back. The result is put into the given destination image which must have the right size. The result will be normalized to compensate for the two FFTs. If the destination image is scalar, only the real part of the result image is retained. In this case, you are responsible for choosing a filter image which ensures a zero imaginary part of the result (e.g. use a real, even symmetric filter image, or a purely imaginary, odd symmetric on). The DC entry of the filter must be in the upper left, which is the position where FFTW expects it (see \ref moveDCToUpperLeft()). Declarations: pass arguments explicitly: \code namespace vigra { template void applyFourierFilter(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da); } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void applyFourierFilter(triple src, pair filter, pair dest); } \endcode Usage: \#include \<vigra/fftw3.hxx\>
Namespace: vigra \code // create a Gaussian filter in Fourier space vigra::FImage gaussFilter(w, h), filter(w, h); for(int y=0; y void applyFourierFilter) template void applyFourierFilter(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da) { // copy real input images into a complex one... int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage, FFTWWriteRealAccessor())); // ...and call the impl FFTWComplexImage const & cworkImage = workImage; applyFourierFilterImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filterUpperLeft, fa, destUpperLeft, da); } template inline void applyFourierFilter( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da) { int w = srcLowerRight.x - srcUpperLeft.x; int h = srcLowerRight.y - srcUpperLeft.y; // test for right memory layout (fftw expects a 2*width*height floats array) if (&(*(srcUpperLeft + Diff2D(w, 0))) == &(*(srcUpperLeft + Diff2D(0, 1)))) applyFourierFilterImpl(srcUpperLeft, srcLowerRight, sa, filterUpperLeft, fa, destUpperLeft, da); else { FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage)); FFTWComplexImage const & cworkImage = workImage; applyFourierFilterImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filterUpperLeft, fa, destUpperLeft, da); } } template inline void applyFourierFilter(triple src, pair filter, pair dest) { applyFourierFilter(src.first, src.second, src.third, filter.first, filter.second, dest.first, dest.second); } template void applyFourierFilterImpl( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, FilterImageIterator filterUpperLeft, FilterAccessor fa, DestImageIterator destUpperLeft, DestAccessor da) { int w = srcLowerRight.x - srcUpperLeft.x; int h = srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage complexResultImg(srcLowerRight - srcUpperLeft); // FFT from srcImage to complexResultImg fftw_plan forwardPlan= fftw_plan_dft_2d(h, w, (fftw_complex *)&(*srcUpperLeft), (fftw_complex *)complexResultImg.begin(), FFTW_FORWARD, FFTW_ESTIMATE ); fftw_execute(forwardPlan); fftw_destroy_plan(forwardPlan); // convolve in freq. domain (in complexResultImg) combineTwoImages(srcImageRange(complexResultImg), srcIter(filterUpperLeft, fa), destImage(complexResultImg), std::multiplies()); // FFT back into spatial domain (inplace in complexResultImg) fftw_plan backwardPlan= fftw_plan_dft_2d(h, w, (fftw_complex *)complexResultImg.begin(), (fftw_complex *)complexResultImg.begin(), FFTW_BACKWARD, FFTW_ESTIMATE); fftw_execute(backwardPlan); fftw_destroy_plan(backwardPlan); typedef typename NumericTraits::isScalar isScalarResult; // normalization (after FFTs), maybe stripping imaginary part applyFourierFilterImplNormalization(complexResultImg, destUpperLeft, da, isScalarResult()); } template void applyFourierFilterImplNormalization(FFTWComplexImage const &srcImage, DestImageIterator destUpperLeft, DestAccessor da, VigraFalseType) { double normFactor= 1.0/(srcImage.width() * srcImage.height()); for(int y=0; y(1.0/(srcImage.width() * srcImage.height()))); } template void applyFourierFilterImplNormalization(FFTWComplexImage const & srcImage, DestImageIterator destUpperLeft, DestAccessor da, VigraTrueType) { double normFactor= 1.0/(srcImage.width() * srcImage.height()); for(int y=0; y Declarations:
pass arguments explicitly: \code namespace vigra { template void applyFourierFilterFamily(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, const ImageArray &filters, ImageArray &results) } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void applyFourierFilterFamily(triple src, const ImageArray &filters, ImageArray &results) } \endcode Usage: \#include \<vigra/fftw3.hxx\>
Namespace: vigra \code // assuming the presence of a real-valued image named "image" to // be filtered in this example vigra::ImageArray filters(16, image.size()); for (int i=0; i results(); vigra::applyFourierFilterFamily(srcImageRange(image), filters, results); \endcode */ doxygen_overloaded_function(template <...> void applyFourierFilterFamily) template inline void applyFourierFilterFamily(triple src, const ImageArray &filters, ImageArray &results) { applyFourierFilterFamily(src.first, src.second, src.third, filters, results); } template void applyFourierFilterFamily(SrcImageIterator srcUpperLeft, SrcImageIterator srcLowerRight, SrcAccessor sa, const ImageArray &filters, ImageArray &results) { int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage, FFTWWriteRealAccessor())); FFTWComplexImage const & cworkImage = workImage; applyFourierFilterFamilyImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filters, results); } template inline void applyFourierFilterFamily( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, const ImageArray &filters, ImageArray &results) { int w= srcLowerRight.x - srcUpperLeft.x; // test for right memory layout (fftw expects a 2*width*height floats array) if (&(*(srcUpperLeft + Diff2D(w, 0))) == &(*(srcUpperLeft + Diff2D(0, 1)))) applyFourierFilterFamilyImpl(srcUpperLeft, srcLowerRight, sa, filters, results); else { int h = srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage workImage(w, h); copyImage(srcIterRange(srcUpperLeft, srcLowerRight, sa), destImage(workImage)); FFTWComplexImage const & cworkImage = workImage; applyFourierFilterFamilyImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), cworkImage.accessor(), filters, results); } } template void applyFourierFilterFamilyImpl( FFTWComplexImage::const_traverser srcUpperLeft, FFTWComplexImage::const_traverser srcLowerRight, FFTWComplexImage::ConstAccessor sa, const ImageArray &filters, ImageArray &results) { // FIXME: sa is not used // (maybe check if StandardAccessor, else copy?) // make sure the filter images have the right dimensions vigra_precondition((srcLowerRight - srcUpperLeft) == filters.imageSize(), "applyFourierFilterFamily called with src image size != filters.imageSize()!"); // make sure the result image array has the right dimensions results.resize(filters.size()); results.resizeImages(filters.imageSize()); // FFT from srcImage to freqImage int w= srcLowerRight.x - srcUpperLeft.x; int h= srcLowerRight.y - srcUpperLeft.y; FFTWComplexImage freqImage(w, h); FFTWComplexImage result(w, h); fftw_plan forwardPlan= fftw_plan_dft_2d(h, w, (fftw_complex *)&(*srcUpperLeft), (fftw_complex *)freqImage.begin(), FFTW_FORWARD, FFTW_ESTIMATE ); fftw_execute(forwardPlan); fftw_destroy_plan(forwardPlan); fftw_plan backwardPlan= fftw_plan_dft_2d(h, w, (fftw_complex *)result.begin(), (fftw_complex *)result.begin(), FFTW_BACKWARD, FFTW_ESTIMATE ); typedef typename NumericTraits::isScalar isScalarResult; // convolve with filters in freq. domain for (unsigned int i= 0; i < filters.size(); i++) { combineTwoImages(srcImageRange(freqImage), srcImage(filters[i]), destImage(result), std::multiplies()); // FFT back into spatial domain (inplace in destImage) fftw_execute(backwardPlan); // normalization (after FFTs), maybe stripping imaginary part applyFourierFilterImplNormalization(result, results[i].upperLeft(), results[i].accessor(), isScalarResult()); } fftw_destroy_plan(backwardPlan); } /********************************************************/ /* */ /* fourierTransformReal */ /* */ /********************************************************/ /** \brief Real Fourier transforms for even and odd boundary conditions (aka. cosine and sine transforms). If the image is real and has even symmetry, its Fourier transform is also real and has even symmetry. The Fourier transform of a real image with odd symmetry is imaginary and has odd symmetry. In either case, only about a quarter of the pixels need to be stored because the rest can be calculated from the symmetry properties. This is especially useful, if the original image is implicitly assumed to have reflective or anti-reflective boundary conditions. Then the "negative" pixel locations are defined as \code even (reflective boundary conditions): f[-x] = f[x] (x = 1,...,N-1) odd (anti-reflective boundary conditions): f[-1] = 0 f[-x] = -f[x-2] (x = 2,...,N-1) \endcode end similar at the other boundary (see the FFTW documentation for details). This has the advantage that more efficient Fourier transforms that use only real numbers can be implemented. These are also known as cosine and sine transforms respectively. If you use the odd transform it is important to note that in the Fourier domain, the DC component is always zero and is therefore dropped from the data structure. This means that index 0 in an odd symmetric Fourier domain image refers to the first harmonic. This is especially important if an image is first cosine transformed (even symmetry), then in the Fourier domain multiplied with an odd symmetric filter (e.g. a first derivative) and finally transformed back to the spatial domain with a sine transform (odd symmetric). For this to work properly the image must be shifted left or up by one pixel (depending on whether the x- or y-axis is odd symmetric) before the inverse transform can be applied. (see example below). The real Fourier transform functions are named fourierTransformReal?? where the questions marks stand for either E or O indicating whether the x- and y-axis is to be transformed using even or odd symmetry. The same functions can be used for both the forward and inverse transforms, only the normalization changes. For signal processing, the following normalization factors are most appropriate: \code forward inverse ------------------------------------------------------------ X even, Y even 1.0 4.0 * (w-1) * (h-1) X even, Y odd -1.0 -4.0 * (w-1) * (h+1) X odd, Y even -1.0 -4.0 * (w+1) * (h-1) X odd, Y odd 1.0 4.0 * (w+1) * (h+1) \endcode where w and h denote the image width and height. Declarations: pass arguments explicitly: \code namespace vigra { template void fourierTransformRealEE(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm); fourierTransformRealEO, fourierTransformRealOE, fourierTransformRealOO likewise } \endcode use argument objects in conjunction with \ref ArgumentObjectFactories : \code namespace vigra { template void fourierTransformRealEE(triple src, pair dest, fftw_real norm); fourierTransformRealEO, fourierTransformRealOE, fourierTransformRealOO likewise } \endcode Usage: \#include \<vigra/fftw3.hxx\>
Namespace: vigra \code vigra::FImage spatial(width,height), fourier(width,height); ... // fill image with data // forward cosine transform == reflective boundary conditions fourierTransformRealEE(srcImageRange(spatial), destImage(fourier), (fftw_real)1.0); // multiply with a first derivative of Gaussian in x-direction for(int y = 0; y < height; ++y) { for(int x = 1; x < width; ++x) { double dx = x * M_PI / (width - 1); double dy = y * M_PI / (height - 1); fourier(x-1, y) = fourier(x, y) * dx * std::exp(-(dx*dx + dy*dy) * scale*scale / 2.0); } fourier(width-1, y) = 0.0; } // inverse transform -- odd symmetry in x-direction, even in y, // due to symmetry of the filter fourierTransformRealOE(srcImageRange(fourier), destImage(spatial), (fftw_real)-4.0 * (width+1) * (height-1)); \endcode */ doxygen_overloaded_function(template <...> void fourierTransformReal) template inline void fourierTransformRealEE(triple src, pair dest, fftw_real norm) { fourierTransformRealEE(src.first, src.second, src.third, dest.first, dest.second, norm); } template inline void fourierTransformRealEE(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { fourierTransformRealWorkImageImpl(sul, slr, src, dul, dest, norm, FFTW_REDFT00, FFTW_REDFT00); } template inline void fourierTransformRealEE( FFTWRealImage::const_traverser sul, FFTWRealImage::const_traverser slr, FFTWRealImage::Accessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { int w = slr.x - sul.x; // test for right memory layout (fftw expects a width*height fftw_real array) if (&(*(sul + Diff2D(w, 0))) == &(*(sul + Diff2D(0, 1)))) fourierTransformRealImpl(sul, slr, dul, dest, norm, FFTW_REDFT00, FFTW_REDFT00); else fourierTransformRealWorkImageImpl(sul, slr, src, dul, dest, norm, FFTW_REDFT00, FFTW_REDFT00); } /********************************************************************/ template inline void fourierTransformRealOE(triple src, pair dest, fftw_real norm) { fourierTransformRealOE(src.first, src.second, src.third, dest.first, dest.second, norm); } template inline void fourierTransformRealOE(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { fourierTransformRealWorkImageImpl(sul, slr, src, dul, dest, norm, FFTW_RODFT00, FFTW_REDFT00); } template inline void fourierTransformRealOE( FFTWRealImage::const_traverser sul, FFTWRealImage::const_traverser slr, FFTWRealImage::Accessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { int w = slr.x - sul.x; // test for right memory layout (fftw expects a width*height fftw_real array) if (&(*(sul + Diff2D(w, 0))) == &(*(sul + Diff2D(0, 1)))) fourierTransformRealImpl(sul, slr, dul, dest, norm, FFTW_RODFT00, FFTW_REDFT00); else fourierTransformRealWorkImageImpl(sul, slr, src, dul, dest, norm, FFTW_RODFT00, FFTW_REDFT00); } /********************************************************************/ template inline void fourierTransformRealEO(triple src, pair dest, fftw_real norm) { fourierTransformRealEO(src.first, src.second, src.third, dest.first, dest.second, norm); } template inline void fourierTransformRealEO(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { fourierTransformRealWorkImageImpl(sul, slr, src, dul, dest, norm, FFTW_REDFT00, FFTW_RODFT00); } template inline void fourierTransformRealEO( FFTWRealImage::const_traverser sul, FFTWRealImage::const_traverser slr, FFTWRealImage::Accessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { int w = slr.x - sul.x; // test for right memory layout (fftw expects a width*height fftw_real array) if (&(*(sul + Diff2D(w, 0))) == &(*(sul + Diff2D(0, 1)))) fourierTransformRealImpl(sul, slr, dul, dest, norm, FFTW_REDFT00, FFTW_RODFT00); else fourierTransformRealWorkImageImpl(sul, slr, src, dul, dest, norm, FFTW_REDFT00, FFTW_RODFT00); } /********************************************************************/ template inline void fourierTransformRealOO(triple src, pair dest, fftw_real norm) { fourierTransformRealOO(src.first, src.second, src.third, dest.first, dest.second, norm); } template inline void fourierTransformRealOO(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { fourierTransformRealWorkImageImpl(sul, slr, src, dul, dest, norm, FFTW_RODFT00, FFTW_RODFT00); } template inline void fourierTransformRealOO( FFTWRealImage::const_traverser sul, FFTWRealImage::const_traverser slr, FFTWRealImage::Accessor src, DestTraverser dul, DestAccessor dest, fftw_real norm) { int w = slr.x - sul.x; // test for right memory layout (fftw expects a width*height fftw_real array) if (&(*(sul + Diff2D(w, 0))) == &(*(sul + Diff2D(0, 1)))) fourierTransformRealImpl(sul, slr, dul, dest, norm, FFTW_RODFT00, FFTW_RODFT00); else fourierTransformRealWorkImageImpl(sul, slr, src, dul, dest, norm, FFTW_RODFT00, FFTW_RODFT00); } /*******************************************************************/ template void fourierTransformRealWorkImageImpl(SrcTraverser sul, SrcTraverser slr, SrcAccessor src, DestTraverser dul, DestAccessor dest, fftw_real norm, fftw_r2r_kind kindx, fftw_r2r_kind kindy) { FFTWRealImage workImage(slr - sul); copyImage(srcIterRange(sul, slr, src), destImage(workImage)); FFTWRealImage const & cworkImage = workImage; fourierTransformRealImpl(cworkImage.upperLeft(), cworkImage.lowerRight(), dul, dest, norm, kindx, kindy); } template void fourierTransformRealImpl( FFTWRealImage::const_traverser sul, FFTWRealImage::const_traverser slr, DestTraverser dul, DestAccessor dest, fftw_real norm, fftw_r2r_kind kindx, fftw_r2r_kind kindy) { int w = slr.x - sul.x; int h = slr.y - sul.y; BasicImage res(w, h); fftw_plan plan = fftw_plan_r2r_2d(h, w, (fftw_real *)&(*sul), (fftw_real *)res.begin(), kindy, kindx, FFTW_ESTIMATE); fftw_execute(plan); fftw_destroy_plan(plan); if(norm != 1.0) transformImage(srcImageRange(res), destIter(dul, dest), std::bind1st(std::multiplies(), 1.0 / norm)); else copyImage(srcImageRange(res), destIter(dul, dest)); } //@} } // namespace vigra #endif // VIGRA_FFTW3_HXX gamera-3.3.3/include/vigra/fixedpoint.hxx0000644000076500000000000007341111261456425017413 0ustar chriswheel/************************************************************************/ /* */ /* Copyright 2004-2005 by Ullrich Koethe */ /* Cognitive Systems Group, University of Hamburg, Germany */ /* */ /* This file is part of the VIGRA computer vision library. */ /* ( Version 1.6.0, Aug 13 2008 ) */ /* The VIGRA Website is */ /* http://kogs-www.informatik.uni-hamburg.de/~koethe/vigra/ */ /* Please direct questions, bug reports, and contributions to */ /* ullrich.koethe@iwr.uni-heidelberg.de or */ /* vigra@informatik.uni-hamburg.de */ /* */ /* Permission is hereby granted, free of charge, to any person */ /* obtaining a copy of this software and associated documentation */ /* files (the "Software"), to deal in the Software without */ /* restriction, including without limitation the rights to use, */ /* copy, modify, merge, publish, distribute, sublicense, and/or */ /* sell copies of the Software, and to permit persons to whom the */ /* Software is furnished to do so, subject to the following */ /* conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the */ /* Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES */ /* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND */ /* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT */ /* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, */ /* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING */ /* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR */ /* OTHER DEALINGS IN THE SOFTWARE. */ /* */ /************************************************************************/ #ifndef VIGRA_FIXEDPOINT_HXX #define VIGRA_FIXEDPOINT_HXX #include "mathutil.hxx" #include "static_assert.hxx" #include "error.hxx" #include "numerictraits.hxx" namespace vigra { template class FixedPoint; struct Error_FixedPointTraits_not_specialized_for_this_case; template class FixedPointTraits { public: typedef Error_FixedPointTraits_not_specialized_for_this_case PlusType; typedef Error_FixedPointTraits_not_specialized_for_this_case MinusType; typedef Error_FixedPointTraits_not_specialized_for_this_case MultipliesType; // typedef Error_FixedPointTraits_not_specialized_for_this_case DividesType; }; // return type policy: // * try to allocate enough bits to represent the biggest possible result // * in case of add/subtract: if all bits of the internal int are used up, // keep the representation template class FixedPointTraits, FixedPoint > { enum { MaxIntBits = (IntBits1 < IntBits2) ? IntBits2 : IntBits1, MaxFracBits = (FracBits1 < FracBits2) ? FracBits2 : FracBits1, PlusMinusIntBits = (MaxIntBits + 1 + MaxFracBits < 32) ? MaxIntBits + 1 : MaxIntBits, MultipliesFracBits = (IntBits1 + IntBits2 < 31) ? (FracBits1 + FracBits2) > (31 - IntBits1 - IntBits2) ? 31 - IntBits1 - IntBits2 : FracBits1 + FracBits2 : 0 }; public: typedef FixedPoint PlusType; typedef FixedPoint MinusType; typedef FixedPoint MultipliesType; // typedef FixedPoint DividesType; }; template struct SquareRootTraits > { enum { SRTotalBits = (IntBits + FracBits + 1) / 2, SRIntBits = (IntBits + 1) / 2, SRFracBits = SRTotalBits - SRIntBits }; public: typedef FixedPoint Type; typedef FixedPoint SquareRootResult; typedef Type SquareRootArgument; }; #ifndef DOXYGEN template struct FixedPoint_overflow_error__More_than_31_bits_requested : staticAssert::AssertBool<(N < 32)> {}; #endif /* DOXYGEN */ template struct FixedPoint_assignment_error__Target_object_has_too_few_integer_bits : staticAssert::AssertBool {}; enum FixedPointNoShift { FPNoShift }; namespace detail { template struct FPAssignWithRound; template <> struct FPAssignWithRound { template static inline int exec(int v) { return v << (-N); } }; template <> struct FPAssignWithRound { template static inline int exec(int const v) { return (v + (1 << (N - 1))) >> (N); } }; template struct FPMulImplementation; template <> struct FPMulImplementation { template static inline int exec(int l, int r) { return (l * r) << (-N); } }; template <> struct FPMulImplementation { template static inline int exec(int l, int r) { // there is not enough space in the result // => perform calculations that preserve as much accuracy as possible enum { diffl = N / 2, diffr = N - diffl, maskl = (1 << diffl) - 1, maskr = (1 << diffr) - 1 }; int shiftl = l >> diffl; int shiftr = r >> diffr; return shiftl * shiftr + (((l & maskl) * shiftr) >> diffl) + (((r & maskr) * shiftl) >> diffr); } }; } // namespace detail /********************************************************/ /* */ /* FixedPoint */ /* */ /********************************************************/ /** Template for fixed point arithmetic. Fixed point arithmetic is used when computations with fractional accuracy must be made at the highest speed possible (e.g. in the inner loop of a volume rendering routine). The speed-up relative to floating point arithmetic can be dramatic, especially when one can avoid conversions between integer anfloating point numbers (these are very expensive because integer and floating point arithmetic resides in different pipelines). The template wraps an int and uses IntBits to represent the integral part of a number, and FractionalBits for the fractional part, where IntBits + FractionalBits < 32. (The 32rd bit is reserved because FixedPoint is a signed type). These numbers will be automatically allocated in an intelligent way in the result of an arithmetic operation. For example, when two fixed point numbers are multiplied, the required number of integer bits in the result is the sum of the number of integer bits of the arguments, but only when so many bits are avaiable. This is figured out by means of FixedPointTraits, and a compile-time error is raised when no suitable representation can be found. The idea is that the right thing happens automatically as often as possible. FixedPoint implements the required interface of an \ref AlgebraicRing and the required numeric and promotion traits. In addition, it supports functions add, sub, and mul, where a particular layout of the result can be enforced. unsigned char, signed char, unsigned short, signed short, int can be transformed into a FixedPoint with appropriate layout by means of the factory function fixedPoint(). See also: